diff --git a/internal/functions/constants.go b/internal/functions/constants.go index 7e897d8..22c6731 100644 --- a/internal/functions/constants.go +++ b/internal/functions/constants.go @@ -998,7 +998,7 @@ func FunctionRegistry() map[string][]FunctionInfo { {FnDBImportVuln, "db_import_vuln(workspace, json_data)", "Import single vulnerability from JSON (nuclei format)", "bool", "db_import_vuln('{{TargetSpace}}', '{\"template-id\":\"...\",\"info\":{\"name\":\"...\",\"severity\":\"high\"}}')"}, {FnDBImportVulnFromFile, "db_import_vuln_from_file(workspace, file_path)", "Import vulnerabilities from JSONL file (nuclei format)", "int", "db_import_vuln_from_file('{{TargetSpace}}', '{{Output}}/nuclei.jsonl')"}, {FnDBImportDNSAsset, "db_import_dns_asset(workspace, file_path)", "Import DNS records from zone-style file (domain TYPE value per line), groups by domain", "int", "db_import_dns_asset('{{TargetSpace}}', '{{Output}}/dns-records.txt')"}, - {FnDBImportCustomAsset, "db_import_custom_asset(workspace, file_path, [asset_type], [source])", "Import assets from JSONL file with direct field mapping; optional asset_type/source defaults apply when line has no value", "map", "db_import_custom_asset('{{TargetSpace}}', '{{Output}}/custom-assets.jsonl', 'subdomain', 'recon')"}, + {FnDBImportCustomAsset, "db_import_custom_asset(workspace, file_path, [asset_type], [source])", "Import assets from JSONL (httpx, vigolium, custom); auto-unwraps envelope formats", "map", "db_import_custom_asset('{{TargetSpace}}', '{{Output}}/custom-assets.jsonl', 'subdomain', 'recon')"}, {FnDBImportSARIF, "db_import_sarif(workspace, file_path)", "Import vulnerabilities from SARIF file (Semgrep, Trivy, etc.)", "map", "db_import_sarif('{{TargetSpace}}', '{{Output}}/semgrep.sarif')"}, {FnDBImportPortAssets, "db_import_port_assets(workspace, file_path, [source])", "Import port scan data from JSONL (nmap_to_jsonl output) with asset_type=ip and source=portscan", "map", "db_import_port_assets('{{TargetSpace}}', '{{Output}}/nmap-scan.jsonl')"}, {FnDBAssetDiff, "db_asset_diff(workspace)", "Get asset diff as JSONL string", "string", "db_asset_diff('{{TargetSpace}}')"}, diff --git a/internal/functions/db_functions.go b/internal/functions/db_functions.go index a353143..c22a24e 100644 --- a/internal/functions/db_functions.go +++ b/internal/functions/db_functions.go @@ -171,6 +171,61 @@ func (vf *vmFunc) updateRunField(ctx context.Context, id, field string, value go // unmarshalAssetJSON unmarshals JSON into an Asset with backward compatibility. // Handles old format where "remarks" is a string instead of []string, // and merges legacy "tags" array into Remarks. +// unwrapEnvelopeJSON detects the {"type":"...","data":{...}} envelope format +// used by tools like vigolium. Returns (extracted JSON bytes, should-skip). +// If the line is an envelope with a non-importable type (e.g. "scan", "module"), +// skip=true is returned. If it's an importable envelope (e.g. "http_record"), +// the inner data is extracted and field names are remapped to match Asset json tags. +// If the line is not an envelope, returns (nil, false) so the caller uses the original. +func unwrapEnvelopeJSON(raw []byte) (extracted []byte, skip bool) { + var envelope struct { + Type string `json:"type"` + Data json.RawMessage `json:"data"` + } + if err := json.Unmarshal(raw, &envelope); err != nil || envelope.Type == "" || len(envelope.Data) == 0 { + return nil, false // not an envelope + } + + // Only import http_record types; skip metadata like scan, module + if envelope.Type != "http_record" { + return nil, true + } + + // Remap vigolium field names to Asset json tags + var data map[string]interface{} + if err := json.Unmarshal(envelope.Data, &data); err != nil { + return nil, false + } + + fieldRemap := map[string]string{ + "response_content_type": "content_type", + "response_content_length": "content_length", + "response_words": "words", + "response_title": "title", + "ip": "host_ip", + "hostname": "input", + } + for oldKey, newKey := range fieldRemap { + if val, ok := data[oldKey]; ok { + if _, exists := data[newKey]; !exists { + data[newKey] = val + } + delete(data, oldKey) + } + } + + // Default asset_type to "web" for http_record + if _, ok := data["asset_type"]; !ok { + data["asset_type"] = "web" + } + + result, err := json.Marshal(data) + if err != nil { + return nil, false + } + return result, false +} + func unmarshalAssetJSON(rawJSON []byte, asset *database.Asset) error { // First try direct unmarshal if err := json.Unmarshal(rawJSON, asset); err != nil { @@ -2510,13 +2565,27 @@ func (vf *vmFunc) dbImportCustomAsset(call goja.FunctionCall) goja.Value { continue } + // Detect envelope format: {"type":"...","data":{...}} + // Used by tools like vigolium that wrap records in a typed envelope. + assetJSON := []byte(line) + if extracted, skip := unwrapEnvelopeJSON(assetJSON); skip { + continue // non-asset record type (e.g. "scan", "module") + } else if extracted != nil { + assetJSON = extracted + } + var asset database.Asset - if err := unmarshalAssetJSON([]byte(line), &asset); err != nil { + if err := unmarshalAssetJSON(assetJSON, &asset); err != nil { logger.Get().Debug("skipping invalid JSON line", zap.Error(err)) stats.Errors++ continue } + // Store original line as raw_json_data when not already set + if asset.RawJsonData == "" { + asset.RawJsonData = string(assetJSON) + } + // Force workspace from function argument asset.Workspace = workspace asset.LastSeenAt = now diff --git a/internal/functions/db_functions_test.go b/internal/functions/db_functions_test.go index c2182de..843b3fb 100644 --- a/internal/functions/db_functions_test.go +++ b/internal/functions/db_functions_test.go @@ -1356,3 +1356,195 @@ func TestDbImportCustomAsset_ContentDiscovery(t *testing.T) { assert.Contains(t, asset6.Remarks, "Modern-App") assert.Contains(t, asset6.Remarks, "SGW") } + +// --- Vigolium Envelope Import Tests --- + +func TestDbImportCustomAsset_VigoliumEnvelope(t *testing.T) { + cleanup := setupTestDB(t) + defer cleanup() + + // Create a small envelope JSONL with mixed record types + content := `{"type":"scan","data":{"uuid":"abc","status":"completed","target":"http://example.com"}} +{"type":"module","data":{"id":"xss-light","name":"XSS Light","enabled":true}} +{"type":"http_record","data":{"url":"http://example.com/","method":"GET","status_code":200,"scheme":"http","hostname":"example.com","port":80,"ip":"93.184.216.34","response_content_type":"text/html","response_content_length":1256,"response_words":45,"response_title":"Example Domain","source":"scanner"}} +{"type":"http_record","data":{"url":"http://example.com/login","method":"POST","status_code":302,"scheme":"http","hostname":"example.com","port":80,"ip":"93.184.216.34","response_content_type":"text/html","response_content_length":0,"response_words":0,"source":"spidering"}} +{"type":"module","data":{"id":"sqli-basic","name":"SQLi Basic","enabled":true}}` + + testFile := filepath.Join(t.TempDir(), "vigolium-envelope.jsonl") + err := os.WriteFile(testFile, []byte(content), 0644) + require.NoError(t, err) + + registry := NewRegistry() + result, err := registry.Execute( + `db_import_custom_asset("test-workspace", "`+testFile+`")`, + map[string]interface{}{}, + ) + require.NoError(t, err) + + stats, ok := result.(map[string]interface{}) + require.True(t, ok, "result should be a map") + // Only 2 http_record lines should be imported; scan and module lines skipped + assert.Equal(t, 2, stats["new"]) + assert.Equal(t, 2, stats["total"]) + assert.Equal(t, 0, stats["errors"]) + + ctx := context.Background() + db := database.GetDB() + require.NotNil(t, db) + + // Verify field remapping for first http_record + var asset1 database.Asset + err = db.NewSelect().Model(&asset1). + Where("workspace = ?", "test-workspace"). + Where("url = ?", "http://example.com/"). + Scan(ctx) + require.NoError(t, err) + assert.Equal(t, "http://example.com/", asset1.AssetValue) // url -> asset_value fallback + assert.Equal(t, "GET", asset1.Method) + assert.Equal(t, 200, asset1.StatusCode) + assert.Equal(t, "http", asset1.Scheme) + assert.Equal(t, "93.184.216.34", asset1.HostIP) // ip -> host_ip + assert.Equal(t, "text/html", asset1.ContentType) // response_content_type -> content_type + assert.Equal(t, int64(1256), asset1.ContentLength) // response_content_length -> content_length + assert.Equal(t, 45, asset1.Words) // response_words -> words + assert.Equal(t, "Example Domain", asset1.Title) // response_title -> title + assert.Equal(t, "example.com", asset1.Input) // hostname -> input + assert.Equal(t, "scanner", asset1.Source) // source preserved + assert.Equal(t, "web", asset1.AssetType) // default for http_record + + // Verify second http_record + var asset2 database.Asset + err = db.NewSelect().Model(&asset2). + Where("workspace = ?", "test-workspace"). + Where("url = ?", "http://example.com/login"). + Scan(ctx) + require.NoError(t, err) + assert.Equal(t, "POST", asset2.Method) + assert.Equal(t, 302, asset2.StatusCode) + assert.Equal(t, "spidering", asset2.Source) + assert.Equal(t, "web", asset2.AssetType) + + // raw_json_data should be populated + assert.NotEmpty(t, asset1.RawJsonData) +} + +func TestDbImportCustomAsset_VigoliumDiscover(t *testing.T) { + cleanup := setupTestDB(t) + defer cleanup() + + registry := NewRegistry() + + testFile := "../../test/testdata/sample-jsonl-output/vigolium-discover.jsonl" + _, err := os.Stat(testFile) + require.NoError(t, err, "sample vigolium-discover.jsonl file must exist") + + result, err := registry.Execute( + `db_import_custom_asset("test-workspace", "`+testFile+`")`, + map[string]interface{}{}, + ) + require.NoError(t, err) + + stats, ok := result.(map[string]interface{}) + require.True(t, ok, "result should be a map") + // 28 http_record lines; scan and module lines should be skipped + assert.Equal(t, 28, stats["new"]) + assert.Equal(t, 28, stats["total"]) + assert.Equal(t, 0, stats["errors"]) + + ctx := context.Background() + db := database.GetDB() + require.NotNil(t, db) + + // Verify a known record: the root URL request + var asset database.Asset + err = db.NewSelect().Model(&asset). + Where("workspace = ?", "test-workspace"). + Where("url = ?", "http://localhost:3000/"). + Scan(ctx) + require.NoError(t, err) + assert.Equal(t, "GET", asset.Method) + assert.Equal(t, 200, asset.StatusCode) + assert.Equal(t, "http", asset.Scheme) + assert.Equal(t, "web", asset.AssetType) + assert.Equal(t, "text/html; charset=UTF-8", asset.ContentType) + assert.Equal(t, "::1", asset.HostIP) + assert.Equal(t, "localhost", asset.Input) +} + +func TestDbImportCustomAsset_VigoliumSpider(t *testing.T) { + cleanup := setupTestDB(t) + defer cleanup() + + registry := NewRegistry() + + testFile := "../../test/testdata/sample-jsonl-output/vigolium-spider.jsonl" + _, err := os.Stat(testFile) + require.NoError(t, err, "sample vigolium-spider.jsonl file must exist") + + result, err := registry.Execute( + `db_import_custom_asset("test-workspace", "`+testFile+`")`, + map[string]interface{}{}, + ) + require.NoError(t, err) + + stats, ok := result.(map[string]interface{}) + require.True(t, ok, "result should be a map") + // 30 http_record lines; scan and module lines should be skipped + assert.Equal(t, 30, stats["new"]) + assert.Equal(t, 30, stats["total"]) + assert.Equal(t, 0, stats["errors"]) + + ctx := context.Background() + db := database.GetDB() + require.NotNil(t, db) + + // Verify a known record from spider output + var asset database.Asset + err = db.NewSelect().Model(&asset). + Where("workspace = ?", "test-workspace"). + Where("url = ?", "https://ginandjuice.shop/catalog/product/stock"). + Scan(ctx) + require.NoError(t, err) + assert.Equal(t, "POST", asset.Method) + assert.Equal(t, 400, asset.StatusCode) + assert.Equal(t, "https", asset.Scheme) + assert.Equal(t, "web", asset.AssetType) + assert.Equal(t, "34.246.169.176", asset.HostIP) + assert.Equal(t, "ginandjuice.shop", asset.Input) + assert.Equal(t, "spidering", asset.Source) +} + +func TestDbImportCustomAsset_VigoliumWithSourceOverride(t *testing.T) { + cleanup := setupTestDB(t) + defer cleanup() + + // Envelope with no source field — should use the default from function arg + content := `{"type":"http_record","data":{"url":"http://test.com/api","method":"GET","status_code":200,"scheme":"http","hostname":"test.com","ip":"1.2.3.4"}}` + + testFile := filepath.Join(t.TempDir(), "vigolium-no-source.jsonl") + err := os.WriteFile(testFile, []byte(content), 0644) + require.NoError(t, err) + + registry := NewRegistry() + result, err := registry.Execute( + `db_import_custom_asset("test-workspace", "`+testFile+`", "web", "vigolium")`, + map[string]interface{}{}, + ) + require.NoError(t, err) + + stats := result.(map[string]interface{}) + assert.Equal(t, 1, stats["new"]) + + ctx := context.Background() + db := database.GetDB() + var asset database.Asset + err = db.NewSelect().Model(&asset). + Where("workspace = ?", "test-workspace"). + Where("url = ?", "http://test.com/api"). + Scan(ctx) + require.NoError(t, err) + assert.Equal(t, "vigolium", asset.Source) // default source from arg + assert.Equal(t, "web", asset.AssetType) // from envelope default, matches arg too + assert.Equal(t, "1.2.3.4", asset.HostIP) // ip -> host_ip remapped + assert.Equal(t, "test.com", asset.Input) // hostname -> input remapped +} diff --git a/test/testdata/sample-jsonl-output/vigolium-discover.jsonl b/test/testdata/sample-jsonl-output/vigolium-discover.jsonl new file mode 100644 index 0000000..6035988 --- /dev/null +++ b/test/testdata/sample-jsonl-output/vigolium-discover.jsonl @@ -0,0 +1,260 @@ +{"type":"scan","data":{"uuid":"6d46cacd-7596-47aa-a157-4e6fc1a951d6","project_uuid":"00000000-0000-0000-0000-000000000001","name":"cli-scan","status":"completed","target":"http://localhost:3000","threads":30,"scan_source":"cli","scan_mode":"full","start_cursor_at":"0001-01-01T00:00:00Z","cursor_at":"0001-01-01T00:00:00Z","processed_count":28,"started_at":"2026-04-05T05:32:29.875675Z","finished_at":"2026-04-05T05:33:09Z","duration_ms":0,"total_requests":0,"total_findings":0,"critical_count":0,"high_count":0,"medium_count":0,"low_count":0,"info_count":0,"suspect_count":0,"created_at":"2026-04-05T05:32:29Z","updated_at":"2026-04-05T05:33:09Z"}} +{"type":"http_record","data":{"uuid":"7b022ff9-dc97-4cf0-b92d-590863ab23c4","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"HTTP/1.1","url":"http://localhost:3000/","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUICBIVFRQLzEuMQ0KSG9zdDogbG9jYWxob3N0OjMwMDANCg0K","request_hash":"381724603a5f123f055bc10a16a16714917a0d4b1ca4ee2a7b9803a921386f8e","status_code":200,"response_http_version":"HTTP/0.0","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Encoding":["br"],"Content-Length":["0"],"Content-Type":["text/html; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:33:09 GMT"],"Etag":["W/\"124fa-19d5c21723e\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sun, 05 Apr 2026 05:33:09 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=UTF-8","response_content_length":0,"raw_response":"SFRUUC8wLjAgMjAwIE9LDQpBY2NlcHQtUmFuZ2VzOiBieXRlcw0KQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqDQpDYWNoZS1Db250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MA0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ29udGVudC1FbmNvZGluZzogYnINCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVURi04DQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMzOjA5IEdNVA0KRXRhZzogVy8iMTI0ZmEtMTlkNWMyMTcyM2UiDQpGZWF0dXJlLVBvbGljeTogcGF5bWVudCAnc2VsZicNCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KTGFzdC1Nb2RpZmllZDogU3VuLCAwNSBBcHIgMjAyNiAwNTozMzowOSBHTVQNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KWC1Db250ZW50LVR5cGUtT3B0aW9uczogbm9zbmlmZg0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpYLVJlY3J1aXRpbmc6IC8jL2pvYnMNCkNvbnRlbnQtTGVuZ3RoOiAwDQoNCg==","response_hash":"836871dda52acafcdd21ae6d5c2ba22006786dd7a25fc3fce195c346549ae5b3","response_time_ms":0,"response_words":45,"has_response":true,"sent_at":"2026-04-05T05:33:09.568012Z","received_at":"2026-04-05T05:33:09.56801Z","created_at":"2026-04-05T05:33:09Z","source":"scanner","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"d49d1537-7d78-4ecb-938a-fab83ac15c8f","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/chunk-24EZLZ4I.js","url":"http://localhost:3000/chunk-24EZLZ4I.js","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9jaHVuay0yNEVaTFo0SS5qcyBIVFRQLzEuMQ0KSG9zdDogbG9jYWxob3N0OjMwMDANCg0K","request_hash":"a49aa06894e6dd6d82046d3c6c1ca92aada9fa4801cebe0762084bef3be21c93","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["application/javascript; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Etag":["W/\"55f-19cc8900a68\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sat, 07 Mar 2026 13:50:09 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"application/javascript; charset=UTF-8","response_content_length":1375,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoNCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vamF2YXNjcmlwdDsgY2hhcnNldD1VVEYtOA0KRXRhZzogVy8iNTVmLTE5Y2M4OTAwYTY4Ig0KTGFzdC1Nb2RpZmllZDogU2F0LCAwNyBNYXIgMjAyNiAxMzo1MDowOSBHTVQNClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNClgtUmVjcnVpdGluZzogLyMvam9icw0KQWNjZXB0LVJhbmdlczogYnl0ZXMNCkNhY2hlLUNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0wDQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjMyIEdNVA0KRmVhdHVyZS1Qb2xpY3k6IHBheW1lbnQgJ3NlbGYnDQpLZWVwLUFsaXZlOiB0aW1lb3V0PTUNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQoNCmltcG9ydHtmIGFzIGl9ZnJvbSIuL2NodW5rLVRXWlc1QjQ1LmpzIjt2YXIgcD1pKChrLGwpPT57dmFyIHY9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IjtmdW5jdGlvbiBjKHIpe3RoaXMubWVzc2FnZT1yfWMucHJvdG90eXBlPW5ldyBFcnJvcjtjLnByb3RvdHlwZS5uYW1lPSJJbnZhbGlkQ2hhcmFjdGVyRXJyb3IiO2Z1bmN0aW9uIGYocil7dmFyIGU9U3RyaW5nKHIpLnJlcGxhY2UoLz0rJC8sIiIpO2lmKGUubGVuZ3RoJTQ9PTEpdGhyb3cgbmV3IGMoIidhdG9iJyBmYWlsZWQ6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIik7Zm9yKHZhciBvPTAsdCxuLHU9MCxzPSIiO249ZS5jaGFyQXQodSsrKTt+biYmKHQ9byU0P3QqNjQrbjpuLG8rKyU0KT9zKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDI1NSZ0Pj4oLTIqbyY2KSk6MCluPXYuaW5kZXhPZihuKTtyZXR1cm4gc31sLmV4cG9ydHM9dHlwZW9mIHdpbmRvdzwidSImJndpbmRvdy5hdG9iJiZ3aW5kb3cuYXRvYi5iaW5kKHdpbmRvdyl8fGZ9KTt2YXIgZz1pKChDLHcpPT57dmFyIGg9cCgpO2Z1bmN0aW9uIHkocil7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChoKHIpLnJlcGxhY2UoLyguKS9nLGZ1bmN0aW9uKGUsbyl7dmFyIHQ9by5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO3JldHVybiB0Lmxlbmd0aDwyJiYodD0iMCIrdCksIiUiK3R9KSl9dy5leHBvcnRzPWZ1bmN0aW9uKHIpe3ZhciBlPXIucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIik7c3dpdGNoKGUubGVuZ3RoJTQpe2Nhc2UgMDpicmVhaztjYXNlIDI6ZSs9Ij09IjticmVhaztjYXNlIDM6ZSs9Ij0iO2JyZWFrO2RlZmF1bHQ6dGhyb3ciSWxsZWdhbCBiYXNlNjR1cmwgc3RyaW5nISJ9dHJ5e3JldHVybiB5KGUpfWNhdGNoe3JldHVybiBoKGUpfX19KTt2YXIgbT1pKChFLGQpPT57InVzZSBzdHJpY3QiO3ZhciBJPWcoKTtmdW5jdGlvbiBhKHIpe3RoaXMubWVzc2FnZT1yfWEucHJvdG90eXBlPW5ldyBFcnJvcjthLnByb3RvdHlwZS5uYW1lPSJJbnZhbGlkVG9rZW5FcnJvciI7ZC5leHBvcnRzPWZ1bmN0aW9uKHIsZSl7aWYodHlwZW9mIHIhPSJzdHJpbmciKXRocm93IG5ldyBhKCJJbnZhbGlkIHRva2VuIHNwZWNpZmllZCIpO2U9ZXx8e307dmFyIG89ZS5oZWFkZXI9PT0hMD8wOjE7dHJ5e3JldHVybiBKU09OLnBhcnNlKEkoci5zcGxpdCgiLiIpW29dKSl9Y2F0Y2godCl7dGhyb3cgbmV3IGEoIkludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiAiK3QubWVzc2FnZSl9fTtkLmV4cG9ydHMuSW52YWxpZFRva2VuRXJyb3I9YX0pO2V4cG9ydHttIGFzIGF9Owo=","response_hash":"ced02cc845137b5489341a8e71d969884eb1316de0043a33548d14ccbf075461","response_time_ms":0,"response_words":98,"has_response":true,"parameters":[{"name":"1","value":"chunk-24EZLZ4I.js","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":22}],"sent_at":"2026-04-05T05:33:08.386804Z","received_at":"2026-04-05T05:33:08.386799Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"90aa8c10-bfff-4fa7-9f63-a6ef4a33c378","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/chunk-TWZW5B45.js","url":"http://localhost:3000/chunk-TWZW5B45.js","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9jaHVuay1UV1pXNUI0NS5qcyBIVFRQLzEuMQ0KSG9zdDogbG9jYWxob3N0OjMwMDANCg0K","request_hash":"5b17d350931ff34516213ef40c6c10cab42741d31f24339b8c39d4e26d964560","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["application/javascript; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Etag":["W/\"695-19cc8900a68\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sat, 07 Mar 2026 13:50:09 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"application/javascript; charset=UTF-8","response_content_length":1685,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpDYWNoZS1Db250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MA0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KRGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMjozMiBHTVQNCkV0YWc6IFcvIjY5NS0xOWNjODkwMGE2OCINClgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTg0KWC1SZWNydWl0aW5nOiAvIy9qb2JzDQpBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoNCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vamF2YXNjcmlwdDsgY2hhcnNldD1VVEYtOA0KRmVhdHVyZS1Qb2xpY3k6IHBheW1lbnQgJ3NlbGYnDQpLZWVwLUFsaXZlOiB0aW1lb3V0PTUNCkxhc3QtTW9kaWZpZWQ6IFNhdCwgMDcgTWFyIDIwMjYgMTM6NTA6MDkgR01UDQpWYXJ5OiBBY2NlcHQtRW5jb2RpbmcNClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNCkFjY2VwdC1SYW5nZXM6IGJ5dGVzDQoNCnZhciBxPU9iamVjdC5jcmVhdGU7dmFyIGc9T2JqZWN0LmRlZmluZVByb3BlcnR5LHI9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMscz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsdT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyxoPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsdj1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysaz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LG09T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgbD0oYSxiLGMpPT5iIGluIGE/ZyhhLGIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmN9KTphW2JdPWMsdz0oYSxiKT0+e2Zvcih2YXIgYyBpbiBifHw9e30pay5jYWxsKGIsYykmJmwoYSxjLGJbY10pO2lmKGgpZm9yKHZhciBjIG9mIGgoYikpbS5jYWxsKGIsYykmJmwoYSxjLGJbY10pO3JldHVybiBhfSx4PShhLGIpPT5yKGEsdChiKSk7dmFyIHk9KGE9PnR5cGVvZiByZXF1aXJlPCJ1Ij9yZXF1aXJlOnR5cGVvZiBQcm94eTwidSI/bmV3IFByb3h5KGEse2dldDooYixjKT0+KHR5cGVvZiByZXF1aXJlPCJ1Ij9yZXF1aXJlOmIpW2NdfSk6YSkoZnVuY3Rpb24oYSl7aWYodHlwZW9mIHJlcXVpcmU8InUiKXJldHVybiByZXF1aXJlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aHJvdyBFcnJvcignRHluYW1pYyByZXF1aXJlIG9mICInK2ErJyIgaXMgbm90IHN1cHBvcnRlZCcpfSk7dmFyIHo9KGEsYik9Pnt2YXIgYz17fTtmb3IodmFyIGQgaW4gYSlrLmNhbGwoYSxkKSYmYi5pbmRleE9mKGQpPDAmJihjW2RdPWFbZF0pO2lmKGEhPW51bGwmJmgpZm9yKHZhciBkIG9mIGgoYSkpYi5pbmRleE9mKGQpPDAmJm0uY2FsbChhLGQpJiYoY1tkXT1hW2RdKTtyZXR1cm4gY307dmFyIEE9KGEsYik9PigpPT4oYSYmKGI9YShhPTApKSxiKTt2YXIgQj0oYSxiKT0+KCk9PihifHxhKChiPXtleHBvcnRzOnt9fSkuZXhwb3J0cyxiKSxiLmV4cG9ydHMpLEM9KGEsYik9Pntmb3IodmFyIGMgaW4gYilnKGEsYyx7Z2V0OmJbY10sZW51bWVyYWJsZTohMH0pfSxuPShhLGIsYyxkKT0+e2lmKGImJnR5cGVvZiBiPT0ib2JqZWN0Inx8dHlwZW9mIGI9PSJmdW5jdGlvbiIpZm9yKGxldCBlIG9mIHUoYikpIWsuY2FsbChhLGUpJiZlIT09YyYmZyhhLGUse2dldDooKT0+YltlXSxlbnVtZXJhYmxlOiEoZD1zKGIsZSkpfHxkLmVudW1lcmFibGV9KTtyZXR1cm4gYX07dmFyIEQ9KGEsYixjKT0+KGM9YSE9bnVsbD9xKHYoYSkpOnt9LG4oYnx8IWF8fCFhLl9fZXNNb2R1bGU/ZyhjLCJkZWZhdWx0Iix7dmFsdWU6YSxlbnVtZXJhYmxlOiEwfSk6YyxhKSksRT1hPT5uKGcoe30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGEpO3ZhciBGPShhLGIsYyk9Pm5ldyBQcm9taXNlKChkLGUpPT57dmFyIG89Zj0+e3RyeXtpKGMubmV4dChmKSl9Y2F0Y2goail7ZShqKX19LHA9Zj0+e3RyeXtpKGMudGhyb3coZikpfWNhdGNoKGope2Uoail9fSxpPWY9PmYuZG9uZT9kKGYudmFsdWUpOlByb21pc2UucmVzb2x2ZShmLnZhbHVlKS50aGVuKG8scCk7aSgoYz1jLmFwcGx5KGEsYikpLm5leHQoKSl9KTtleHBvcnR7dyBhcyBhLHggYXMgYix5IGFzIGMseiBhcyBkLEEgYXMgZSxCIGFzIGYsQyBhcyBnLEQgYXMgaCxFIGFzIGksRiBhcyBqfTsK","response_hash":"14c5e077e07ace64f5c0ca84936212932df894596ddbf4ed329a74d6dbeb8298","response_time_ms":0,"response_words":112,"has_response":true,"parameters":[{"name":"1","value":"chunk-TWZW5B45.js","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":22}],"sent_at":"2026-04-05T05:33:08.386818Z","received_at":"2026-04-05T05:33:08.386818Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"8025fb4e-eeaa-474c-839c-b5aa99dc549f","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/polyfills.js","url":"http://localhost:3000/polyfills.js","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9wb2x5ZmlsbHMuanMgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"184bb7e79698040b0de40101df474b20098ad707248c1bd19d779fa96d836c9a","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["application/javascript; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Etag":["W/\"8719-19cc8900a68\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sat, 07 Mar 2026 13:50:09 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"application/javascript; charset=UTF-8","response_content_length":34585,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpLZWVwLUFsaXZlOiB0aW1lb3V0PTUNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KWC1Db250ZW50LVR5cGUtT3B0aW9uczogbm9zbmlmZg0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoNCkNhY2hlLUNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0wDQpFdGFnOiBXLyI4NzE5LTE5Y2M4OTAwYTY4Ig0KRmVhdHVyZS1Qb2xpY3k6IHBheW1lbnQgJ3NlbGYnDQpMYXN0LU1vZGlmaWVkOiBTYXQsIDA3IE1hciAyMDI2IDEzOjUwOjA5IEdNVA0KWC1SZWNydWl0aW5nOiAvIy9qb2JzDQpBY2NlcHQtUmFuZ2VzOiBieXRlcw0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PVVURi04DQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjMyIEdNVA0KDQp2YXIgY2U9Z2xvYmFsVGhpcztmdW5jdGlvbiB0ZSh0KXtyZXR1cm4oY2UuX19ab25lX3N5bWJvbF9wcmVmaXh8fCJfX3pvbmVfc3ltYm9sX18iKSt0fWZ1bmN0aW9uIGh0KCl7bGV0IHQ9Y2UucGVyZm9ybWFuY2U7ZnVuY3Rpb24gbihJKXt0JiZ0Lm1hcmsmJnQubWFyayhJKX1mdW5jdGlvbiBhKEkscyl7dCYmdC5tZWFzdXJlJiZ0Lm1lYXN1cmUoSSxzKX1uKCJab25lIik7Y2xhc3MgZXtzdGF0aWMgX19zeW1ib2xfXz10ZTtzdGF0aWMgYXNzZXJ0Wm9uZVBhdGNoZWQoKXtpZihjZS5Qcm9taXNlIT09Uy5ab25lQXdhcmVQcm9taXNlKXRocm93IG5ldyBFcnJvcigiWm9uZS5qcyBoYXMgZGV0ZWN0ZWQgdGhhdCBab25lQXdhcmVQcm9taXNlIGAod2luZG93fGdsb2JhbCkuUHJvbWlzZWAgaGFzIGJlZW4gb3ZlcndyaXR0ZW4uXG5Nb3N0IGxpa2VseSBjYXVzZSBpcyB0aGF0IGEgUHJvbWlzZSBwb2x5ZmlsbCBoYXMgYmVlbiBsb2FkZWQgYWZ0ZXIgWm9uZS5qcyAoUG9seWZpbGxpbmcgUHJvbWlzZSBhcGkgaXMgbm90IG5lY2Vzc2FyeSB3aGVuIHpvbmUuanMgaXMgbG9hZGVkLiBJZiB5b3UgbXVzdCBsb2FkIG9uZSwgZG8gc28gYmVmb3JlIGxvYWRpbmcgem9uZS5qcy4pIil9c3RhdGljIGdldCByb290KCl7bGV0IHM9ZS5jdXJyZW50O2Zvcig7cy5wYXJlbnQ7KXM9cy5wYXJlbnQ7cmV0dXJuIHN9c3RhdGljIGdldCBjdXJyZW50KCl7cmV0dXJuIGIuem9uZX1zdGF0aWMgZ2V0IGN1cnJlbnRUYXNrKCl7cmV0dXJuIER9c3RhdGljIF9fbG9hZF9wYXRjaChzLGkscj0hMSl7aWYoUy5oYXNPd25Qcm9wZXJ0eShzKSl7bGV0IEU9Y2VbdGUoImZvcmNlRHVwbGljYXRlWm9uZUNoZWNrIildPT09ITA7aWYoIXImJkUpdGhyb3cgRXJyb3IoIkFscmVhZHkgbG9hZGVkIHBhdGNoOiAiK3MpfWVsc2UgaWYoIWNlWyJfX1pvbmVfZGlzYWJsZV8iK3NdKXtsZXQgRT0iWm9uZToiK3M7bihFKSxTW3NdPWkoY2UsZSxSKSxhKEUsRSl9fWdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9X3BhcmVudDtfbmFtZTtfcHJvcGVydGllcztfem9uZURlbGVnYXRlO2NvbnN0cnVjdG9yKHMsaSl7dGhpcy5fcGFyZW50PXMsdGhpcy5fbmFtZT1pP2kubmFtZXx8InVubmFtZWQiOiI8cm9vdD4iLHRoaXMuX3Byb3BlcnRpZXM9aSYmaS5wcm9wZXJ0aWVzfHx7fSx0aGlzLl96b25lRGVsZWdhdGU9bmV3IGYodGhpcyx0aGlzLl9wYXJlbnQmJnRoaXMuX3BhcmVudC5fem9uZURlbGVnYXRlLGkpfWdldChzKXtsZXQgaT10aGlzLmdldFpvbmVXaXRoKHMpO2lmKGkpcmV0dXJuIGkuX3Byb3BlcnRpZXNbc119Z2V0Wm9uZVdpdGgocyl7bGV0IGk9dGhpcztmb3IoO2k7KXtpZihpLl9wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHMpKXJldHVybiBpO2k9aS5fcGFyZW50fXJldHVybiBudWxsfWZvcmsocyl7aWYoIXMpdGhyb3cgbmV3IEVycm9yKCJab25lU3BlYyByZXF1aXJlZCEiKTtyZXR1cm4gdGhpcy5fem9uZURlbGVnYXRlLmZvcmsodGhpcyxzKX13cmFwKHMsaSl7aWYodHlwZW9mIHMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RpbmcgZnVuY3Rpb24gZ290OiAiK3MpO2xldCByPXRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnRlcmNlcHQodGhpcyxzLGkpLEU9dGhpcztyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRS5ydW5HdWFyZGVkKHIsdGhpcyxhcmd1bWVudHMsaSl9fXJ1bihzLGkscixFKXtiPXtwYXJlbnQ6Yix6b25lOnRoaXN9O3RyeXtyZXR1cm4gdGhpcy5fem9uZURlbGVnYXRlLmludm9rZSh0aGlzLHMsaSxyLEUpfWZpbmFsbHl7Yj1iLnBhcmVudH19cnVuR3VhcmRlZChzLGk9bnVsbCxyLEUpe2I9e3BhcmVudDpiLHpvbmU6dGhpc307dHJ5e3RyeXtyZXR1cm4gdGhpcy5fem9uZURlbGVnYXRlLmludm9rZSh0aGlzLHMsaSxyLEUpfWNhdGNoKHgpe2lmKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLHgpKXRocm93IHh9fWZpbmFsbHl7Yj1iLnBhcmVudH19cnVuVGFzayhzLGkscil7aWYocy56b25lIT10aGlzKXRocm93IG5ldyBFcnJvcigiQSB0YXNrIGNhbiBvbmx5IGJlIHJ1biBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAiKyhzLnpvbmV8fEopLm5hbWUrIjsgRXhlY3V0aW9uOiAiK3RoaXMubmFtZSsiKSIpO2xldCBFPXMse3R5cGU6eCxkYXRhOntpc1BlcmlvZGljOmVlPSExLGlzUmVmcmVzaGFibGU6TT0hMX09e319PXM7aWYocy5zdGF0ZT09PXEmJih4PT09VXx8eD09PWspKXJldHVybjtsZXQgaGU9cy5zdGF0ZSE9QTtoZSYmRS5fdHJhbnNpdGlvblRvKEEsZCk7bGV0IF9lPUQ7RD1FLGI9e3BhcmVudDpiLHpvbmU6dGhpc307dHJ5e3g9PWsmJnMuZGF0YSYmIWVlJiYhTSYmKHMuY2FuY2VsRm49dm9pZCAwKTt0cnl7cmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2VUYXNrKHRoaXMsRSxpLHIpfWNhdGNoKFEpe2lmKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLFEpKXRocm93IFF9fWZpbmFsbHl7bGV0IFE9cy5zdGF0ZTtpZihRIT09cSYmUSE9PVgpaWYoeD09VXx8ZWV8fE0mJlE9PT1wKWhlJiZFLl90cmFuc2l0aW9uVG8oZCxBLHApO2Vsc2V7bGV0IFRlPUUuX3pvbmVEZWxlZ2F0ZXM7dGhpcy5fdXBkYXRlVGFza0NvdW50KEUsLTEpLGhlJiZFLl90cmFuc2l0aW9uVG8ocSxBLHEpLE0mJihFLl96b25lRGVsZWdhdGVzPVRlKX1iPWIucGFyZW50LEQ9X2V9fXNjaGVkdWxlVGFzayhzKXtpZihzLnpvbmUmJnMuem9uZSE9PXRoaXMpe2xldCByPXRoaXM7Zm9yKDtyOyl7aWYocj09PXMuem9uZSl0aHJvdyBFcnJvcihgY2FuIG5vdCByZXNjaGVkdWxlIHRhc2sgdG8gJHt0aGlzLm5hbWV9IHdoaWNoIGlzIGRlc2NlbmRhbnRzIG9mIHRoZSBvcmlnaW5hbCB6b25lICR7cy56b25lLm5hbWV9YCk7cj1yLnBhcmVudH19cy5fdHJhbnNpdGlvblRvKHAscSk7bGV0IGk9W107cy5fem9uZURlbGVnYXRlcz1pLHMuX3pvbmU9dGhpczt0cnl7cz10aGlzLl96b25lRGVsZWdhdGUuc2NoZWR1bGVUYXNrKHRoaXMscyl9Y2F0Y2gocil7dGhyb3cgcy5fdHJhbnNpdGlvblRvKFgscCxxKSx0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcyxyKSxyfXJldHVybiBzLl96b25lRGVsZWdhdGVzPT09aSYmdGhpcy5fdXBkYXRlVGFza0NvdW50KHMsMSkscy5zdGF0ZT09cCYmcy5fdHJhbnNpdGlvblRvKGQscCksc31zY2hlZHVsZU1pY3JvVGFzayhzLGkscixFKXtyZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IGcoRixzLGkscixFLHZvaWQgMCkpfXNjaGVkdWxlTWFjcm9UYXNrKHMsaSxyLEUseCl7cmV0dXJuIHRoaXMuc2NoZWR1bGVUYXNrKG5ldyBnKGsscyxpLHIsRSx4KSl9c2NoZWR1bGVFdmVudFRhc2socyxpLHIsRSx4KXtyZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IGcoVSxzLGkscixFLHgpKX1jYW5jZWxUYXNrKHMpe2lmKHMuem9uZSE9dGhpcyl0aHJvdyBuZXcgRXJyb3IoIkEgdGFzayBjYW4gb25seSBiZSBjYW5jZWxsZWQgaW4gdGhlIHpvbmUgb2YgY3JlYXRpb24hIChDcmVhdGlvbjogIisocy56b25lfHxKKS5uYW1lKyI7IEV4ZWN1dGlvbjogIit0aGlzLm5hbWUrIikiKTtpZighKHMuc3RhdGUhPT1kJiZzLnN0YXRlIT09QSkpe3MuX3RyYW5zaXRpb25UbyhWLGQsQSk7dHJ5e3RoaXMuX3pvbmVEZWxlZ2F0ZS5jYW5jZWxUYXNrKHRoaXMscyl9Y2F0Y2goaSl7dGhyb3cgcy5fdHJhbnNpdGlvblRvKFgsViksdGhpcy5fem9uZURlbGVnYXRlLmhhbmRsZUVycm9yKHRoaXMsaSksaX1yZXR1cm4gdGhpcy5fdXBkYXRlVGFza0NvdW50KHMsLTEpLHMuX3RyYW5zaXRpb25UbyhxLFYpLHMucnVuQ291bnQ9LTEsc319X3VwZGF0ZVRhc2tDb3VudChzLGkpe2xldCByPXMuX3pvbmVEZWxlZ2F0ZXM7aT09LTEmJihzLl96b25lRGVsZWdhdGVzPW51bGwpO2ZvcihsZXQgRT0wO0U8ci5sZW5ndGg7RSsrKXJbRV0uX3VwZGF0ZVRhc2tDb3VudChzLnR5cGUsaSl9fWxldCBjPXtuYW1lOiIiLG9uSGFzVGFzazooSSxzLGkscik9PkkuaGFzVGFzayhpLHIpLG9uU2NoZWR1bGVUYXNrOihJLHMsaSxyKT0+SS5zY2hlZHVsZVRhc2soaSxyKSxvbkludm9rZVRhc2s6KEkscyxpLHIsRSx4KT0+SS5pbnZva2VUYXNrKGkscixFLHgpLG9uQ2FuY2VsVGFzazooSSxzLGkscik9PkkuY2FuY2VsVGFzayhpLHIpfTtjbGFzcyBme2dldCB6b25lKCl7cmV0dXJuIHRoaXMuX3pvbmV9X3pvbmU7X3Rhc2tDb3VudHM9e21pY3JvVGFzazowLG1hY3JvVGFzazowLGV2ZW50VGFzazowfTtfcGFyZW50RGVsZWdhdGU7X2ZvcmtEbGd0O19mb3JrWlM7X2ZvcmtDdXJyWm9uZTtfaW50ZXJjZXB0RGxndDtfaW50ZXJjZXB0WlM7X2ludGVyY2VwdEN1cnJab25lO19pbnZva2VEbGd0O19pbnZva2VaUztfaW52b2tlQ3VyclpvbmU7X2hhbmRsZUVycm9yRGxndDtfaGFuZGxlRXJyb3JaUztfaGFuZGxlRXJyb3JDdXJyWm9uZTtfc2NoZWR1bGVUYXNrRGxndDtfc2NoZWR1bGVUYXNrWlM7X3NjaGVkdWxlVGFza0N1cnJab25lO19pbnZva2VUYXNrRGxndDtfaW52b2tlVGFza1pTO19pbnZva2VUYXNrQ3VyclpvbmU7X2NhbmNlbFRhc2tEbGd0O19jYW5jZWxUYXNrWlM7X2NhbmNlbFRhc2tDdXJyWm9uZTtfaGFzVGFza0RsZ3Q7X2hhc1Rhc2tEbGd0T3duZXI7X2hhc1Rhc2taUztfaGFzVGFza0N1cnJab25lO2NvbnN0cnVjdG9yKHMsaSxyKXt0aGlzLl96b25lPXMsdGhpcy5fcGFyZW50RGVsZWdhdGU9aSx0aGlzLl9mb3JrWlM9ciYmKHImJnIub25Gb3JrP3I6aS5fZm9ya1pTKSx0aGlzLl9mb3JrRGxndD1yJiYoci5vbkZvcms/aTppLl9mb3JrRGxndCksdGhpcy5fZm9ya0N1cnJab25lPXImJihyLm9uRm9yaz90aGlzLl96b25lOmkuX2ZvcmtDdXJyWm9uZSksdGhpcy5faW50ZXJjZXB0WlM9ciYmKHIub25JbnRlcmNlcHQ/cjppLl9pbnRlcmNlcHRaUyksdGhpcy5faW50ZXJjZXB0RGxndD1yJiYoci5vbkludGVyY2VwdD9pOmkuX2ludGVyY2VwdERsZ3QpLHRoaXMuX2ludGVyY2VwdEN1cnJab25lPXImJihyLm9uSW50ZXJjZXB0P3RoaXMuX3pvbmU6aS5faW50ZXJjZXB0Q3VyclpvbmUpLHRoaXMuX2ludm9rZVpTPXImJihyLm9uSW52b2tlP3I6aS5faW52b2tlWlMpLHRoaXMuX2ludm9rZURsZ3Q9ciYmKHIub25JbnZva2U/aTppLl9pbnZva2VEbGd0KSx0aGlzLl9pbnZva2VDdXJyWm9uZT1yJiYoci5vbkludm9rZT90aGlzLl96b25lOmkuX2ludm9rZUN1cnJab25lKSx0aGlzLl9oYW5kbGVFcnJvclpTPXImJihyLm9uSGFuZGxlRXJyb3I/cjppLl9oYW5kbGVFcnJvclpTKSx0aGlzLl9oYW5kbGVFcnJvckRsZ3Q9ciYmKHIub25IYW5kbGVFcnJvcj9pOmkuX2hhbmRsZUVycm9yRGxndCksdGhpcy5faGFuZGxlRXJyb3JDdXJyWm9uZT1yJiYoci5vbkhhbmRsZUVycm9yP3RoaXMuX3pvbmU6aS5faGFuZGxlRXJyb3JDdXJyWm9uZSksdGhpcy5fc2NoZWR1bGVUYXNrWlM9ciYmKHIub25TY2hlZHVsZVRhc2s/cjppLl9zY2hlZHVsZVRhc2taUyksdGhpcy5fc2NoZWR1bGVUYXNrRGxndD1yJiYoci5vblNjaGVkdWxlVGFzaz9pOmkuX3NjaGVkdWxlVGFza0RsZ3QpLHRoaXMuX3NjaGVkdWxlVGFza0N1cnJab25lPXImJihyLm9uU2NoZWR1bGVUYXNrP3RoaXMuX3pvbmU6aS5fc2NoZWR1bGVUYXNrQ3VyclpvbmUpLHRoaXMuX2ludm9rZVRhc2taUz1yJiYoci5vbkludm9rZVRhc2s/cjppLl9pbnZva2VUYXNrWlMpLHRoaXMuX2ludm9rZVRhc2tEbGd0PXImJihyLm9uSW52b2tlVGFzaz9pOmkuX2ludm9rZVRhc2tEbGd0KSx0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmU9ciYmKHIub25JbnZva2VUYXNrP3RoaXMuX3pvbmU6aS5faW52b2tlVGFza0N1cnJab25lKSx0aGlzLl9jYW5jZWxUYXNrWlM9ciYmKHIub25DYW5jZWxUYXNrP3I6aS5fY2FuY2VsVGFza1pTKSx0aGlzLl9jYW5jZWxUYXNrRGxndD1yJiYoci5vbkNhbmNlbFRhc2s/aTppLl9jYW5jZWxUYXNrRGxndCksdGhpcy5fY2FuY2VsVGFza0N1cnJab25lPXImJihyLm9uQ2FuY2VsVGFzaz90aGlzLl96b25lOmkuX2NhbmNlbFRhc2tDdXJyWm9uZSksdGhpcy5faGFzVGFza1pTPW51bGwsdGhpcy5faGFzVGFza0RsZ3Q9bnVsbCx0aGlzLl9oYXNUYXNrRGxndE93bmVyPW51bGwsdGhpcy5faGFzVGFza0N1cnJab25lPW51bGw7bGV0IEU9ciYmci5vbkhhc1Rhc2sseD1pJiZpLl9oYXNUYXNrWlM7KEV8fHgpJiYodGhpcy5faGFzVGFza1pTPUU/cjpjLHRoaXMuX2hhc1Rhc2tEbGd0PWksdGhpcy5faGFzVGFza0RsZ3RPd25lcj10aGlzLHRoaXMuX2hhc1Rhc2tDdXJyWm9uZT10aGlzLl96b25lLHIub25TY2hlZHVsZVRhc2t8fCh0aGlzLl9zY2hlZHVsZVRhc2taUz1jLHRoaXMuX3NjaGVkdWxlVGFza0RsZ3Q9aSx0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZT10aGlzLl96b25lKSxyLm9uSW52b2tlVGFza3x8KHRoaXMuX2ludm9rZVRhc2taUz1jLHRoaXMuX2ludm9rZVRhc2tEbGd0PWksdGhpcy5faW52b2tlVGFza0N1cnJab25lPXRoaXMuX3pvbmUpLHIub25DYW5jZWxUYXNrfHwodGhpcy5fY2FuY2VsVGFza1pTPWMsdGhpcy5fY2FuY2VsVGFza0RsZ3Q9aSx0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmU9dGhpcy5fem9uZSkpfWZvcmsocyxpKXtyZXR1cm4gdGhpcy5fZm9ya1pTP3RoaXMuX2ZvcmtaUy5vbkZvcmsodGhpcy5fZm9ya0RsZ3QsdGhpcy56b25lLHMsaSk6bmV3IGUocyxpKX1pbnRlcmNlcHQocyxpLHIpe3JldHVybiB0aGlzLl9pbnRlcmNlcHRaUz90aGlzLl9pbnRlcmNlcHRaUy5vbkludGVyY2VwdCh0aGlzLl9pbnRlcmNlcHREbGd0LHRoaXMuX2ludGVyY2VwdEN1cnJab25lLHMsaSxyKTppfWludm9rZShzLGkscixFLHgpe3JldHVybiB0aGlzLl9pbnZva2VaUz90aGlzLl9pbnZva2VaUy5vbkludm9rZSh0aGlzLl9pbnZva2VEbGd0LHRoaXMuX2ludm9rZUN1cnJab25lLHMsaSxyLEUseCk6aS5hcHBseShyLEUpfWhhbmRsZUVycm9yKHMsaSl7cmV0dXJuIHRoaXMuX2hhbmRsZUVycm9yWlM/dGhpcy5faGFuZGxlRXJyb3JaUy5vbkhhbmRsZUVycm9yKHRoaXMuX2hhbmRsZUVycm9yRGxndCx0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lLHMsaSk6ITB9c2NoZWR1bGVUYXNrKHMsaSl7bGV0IHI9aTtpZih0aGlzLl9zY2hlZHVsZVRhc2taUyl0aGlzLl9oYXNUYXNrWlMmJnIuX3pvbmVEZWxlZ2F0ZXMucHVzaCh0aGlzLl9oYXNUYXNrRGxndE93bmVyKSxyPXRoaXMuX3NjaGVkdWxlVGFza1pTLm9uU2NoZWR1bGVUYXNrKHRoaXMuX3NjaGVkdWxlVGFza0RsZ3QsdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUscyxpKSxyfHwocj1pKTtlbHNlIGlmKGkuc2NoZWR1bGVGbilpLnNjaGVkdWxlRm4oaSk7ZWxzZSBpZihpLnR5cGU9PUYpeihpKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGFzayBpcyBtaXNzaW5nIHNjaGVkdWxlRm4uIik7cmV0dXJuIHJ9aW52b2tlVGFzayhzLGkscixFKXtyZXR1cm4gdGhpcy5faW52b2tlVGFza1pTP3RoaXMuX2ludm9rZVRhc2taUy5vbkludm9rZVRhc2sodGhpcy5faW52b2tlVGFza0RsZ3QsdGhpcy5faW52b2tlVGFza0N1cnJab25lLHMsaSxyLEUpOmkuY2FsbGJhY2suYXBwbHkocixFKX1jYW5jZWxUYXNrKHMsaSl7bGV0IHI7aWYodGhpcy5fY2FuY2VsVGFza1pTKXI9dGhpcy5fY2FuY2VsVGFza1pTLm9uQ2FuY2VsVGFzayh0aGlzLl9jYW5jZWxUYXNrRGxndCx0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUscyxpKTtlbHNle2lmKCFpLmNhbmNlbEZuKXRocm93IEVycm9yKCJUYXNrIGlzIG5vdCBjYW5jZWxhYmxlIik7cj1pLmNhbmNlbEZuKGkpfXJldHVybiByfWhhc1Rhc2socyxpKXt0cnl7dGhpcy5faGFzVGFza1pTJiZ0aGlzLl9oYXNUYXNrWlMub25IYXNUYXNrKHRoaXMuX2hhc1Rhc2tEbGd0LHRoaXMuX2hhc1Rhc2tDdXJyWm9uZSxzLGkpfWNhdGNoKHIpe3RoaXMuaGFuZGxlRXJyb3IocyxyKX19X3VwZGF0ZVRhc2tDb3VudChzLGkpe2xldCByPXRoaXMuX3Rhc2tDb3VudHMsRT1yW3NdLHg9cltzXT1FK2k7aWYoeDwwKXRocm93IG5ldyBFcnJvcigiTW9yZSB0YXNrcyBleGVjdXRlZCB0aGVuIHdlcmUgc2NoZWR1bGVkLiIpO2lmKEU9PTB8fHg9PTApe2xldCBlZT17bWljcm9UYXNrOnIubWljcm9UYXNrPjAsbWFjcm9UYXNrOnIubWFjcm9UYXNrPjAsZXZlbnRUYXNrOnIuZXZlbnRUYXNrPjAsY2hhbmdlOnN9O3RoaXMuaGFzVGFzayh0aGlzLl96b25lLGVlKX19fWNsYXNzIGd7dHlwZTtzb3VyY2U7aW52b2tlO2NhbGxiYWNrO2RhdGE7c2NoZWR1bGVGbjtjYW5jZWxGbjtfem9uZT1udWxsO3J1bkNvdW50PTA7X3pvbmVEZWxlZ2F0ZXM9bnVsbDtfc3RhdGU9Im5vdFNjaGVkdWxlZCI7Y29uc3RydWN0b3IocyxpLHIsRSx4LGVlKXtpZih0aGlzLnR5cGU9cyx0aGlzLnNvdXJjZT1pLHRoaXMuZGF0YT1FLHRoaXMuc2NoZWR1bGVGbj14LHRoaXMuY2FuY2VsRm49ZWUsIXIpdGhyb3cgbmV3IEVycm9yKCJjYWxsYmFjayBpcyBub3QgZGVmaW5lZCIpO3RoaXMuY2FsbGJhY2s9cjtsZXQgTT10aGlzO3M9PT1VJiZFJiZFLnVzZUc/dGhpcy5pbnZva2U9Zy5pbnZva2VUYXNrOnRoaXMuaW52b2tlPWZ1bmN0aW9uKCl7cmV0dXJuIGcuaW52b2tlVGFzay5jYWxsKGNlLE0sdGhpcyxhcmd1bWVudHMpfX1zdGF0aWMgaW52b2tlVGFzayhzLGkscil7c3x8KHM9dGhpcyksSysrO3RyeXtyZXR1cm4gcy5ydW5Db3VudCsrLHMuem9uZS5ydW5UYXNrKHMsaSxyKX1maW5hbGx5e0s9PTEmJiQoKSxLLS19fWdldCB6b25lKCl7cmV0dXJuIHRoaXMuX3pvbmV9Z2V0IHN0YXRlKCl7cmV0dXJuIHRoaXMuX3N0YXRlfWNhbmNlbFNjaGVkdWxlUmVxdWVzdCgpe3RoaXMuX3RyYW5zaXRpb25UbyhxLHApfV90cmFuc2l0aW9uVG8ocyxpLHIpe2lmKHRoaXMuX3N0YXRlPT09aXx8dGhpcy5fc3RhdGU9PT1yKXRoaXMuX3N0YXRlPXMscz09cSYmKHRoaXMuX3pvbmVEZWxlZ2F0ZXM9bnVsbCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy50eXBlfSAnJHt0aGlzLnNvdXJjZX0nOiBjYW4gbm90IHRyYW5zaXRpb24gdG8gJyR7c30nLCBleHBlY3Rpbmcgc3RhdGUgJyR7aX0nJHtyPyIgb3IgJyIrcisiJyI6IiJ9LCB3YXMgJyR7dGhpcy5fc3RhdGV9Jy5gKX10b1N0cmluZygpe3JldHVybiB0aGlzLmRhdGEmJnR5cGVvZiB0aGlzLmRhdGEuaGFuZGxlSWQ8InUiP3RoaXMuZGF0YS5oYW5kbGVJZC50b1N0cmluZygpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKX10b0pTT04oKXtyZXR1cm57dHlwZTp0aGlzLnR5cGUsc3RhdGU6dGhpcy5zdGF0ZSxzb3VyY2U6dGhpcy5zb3VyY2Usem9uZTp0aGlzLnpvbmUubmFtZSxydW5Db3VudDp0aGlzLnJ1bkNvdW50fX19bGV0IFQ9dGUoInNldFRpbWVvdXQiKSx5PXRlKCJQcm9taXNlIiksdz10ZSgidGhlbiIpLF89W10sUD0hMSxMO2Z1bmN0aW9uIEgoSSl7aWYoTHx8Y2VbeV0mJihMPWNlW3ldLnJlc29sdmUoMCkpLEwpe2xldCBzPUxbd107c3x8KHM9TC50aGVuKSxzLmNhbGwoTCxJKX1lbHNlIGNlW1RdKEksMCl9ZnVuY3Rpb24geihJKXtLPT09MCYmXy5sZW5ndGg9PT0wJiZIKCQpLEkmJl8ucHVzaChJKX1mdW5jdGlvbiAkKCl7aWYoIVApe2ZvcihQPSEwO18ubGVuZ3RoOyl7bGV0IEk9XztfPVtdO2ZvcihsZXQgcz0wO3M8SS5sZW5ndGg7cysrKXtsZXQgaT1JW3NdO3RyeXtpLnpvbmUucnVuVGFzayhpLG51bGwsbnVsbCl9Y2F0Y2gocil7Ui5vblVuaGFuZGxlZEVycm9yKHIpfX19Ui5taWNyb3Rhc2tEcmFpbkRvbmUoKSxQPSExfX1sZXQgSj17bmFtZToiTk8gWk9ORSJ9LHE9Im5vdFNjaGVkdWxlZCIscD0ic2NoZWR1bGluZyIsZD0ic2NoZWR1bGVkIixBPSJydW5uaW5nIixWPSJjYW5jZWxpbmciLFg9InVua25vd24iLEY9Im1pY3JvVGFzayIsaz0ibWFjcm9UYXNrIixVPSJldmVudFRhc2siLFM9e30sUj17c3ltYm9sOnRlLGN1cnJlbnRab25lRnJhbWU6KCk9PmIsb25VbmhhbmRsZWRFcnJvcjpXLG1pY3JvdGFza0RyYWluRG9uZTpXLHNjaGVkdWxlTWljcm9UYXNrOnosc2hvd1VuY2F1Z2h0RXJyb3I6KCk9PiFlW3RlKCJpZ25vcmVDb25zb2xlRXJyb3JVbmNhdWdodEVycm9yIildLHBhdGNoRXZlbnRUYXJnZXQ6KCk9PltdLHBhdGNoT25Qcm9wZXJ0aWVzOlcscGF0Y2hNZXRob2Q6KCk9PlcsYmluZEFyZ3VtZW50czooKT0+W10scGF0Y2hUaGVuOigpPT5XLHBhdGNoTWFjcm9UYXNrOigpPT5XLHBhdGNoRXZlbnRQcm90b3R5cGU6KCk9PlcsaXNJRU9yRWRnZTooKT0+ITEsZ2V0R2xvYmFsT2JqZWN0czooKT0+e30sT2JqZWN0RGVmaW5lUHJvcGVydHk6KCk9PlcsT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOigpPT57fSxPYmplY3RDcmVhdGU6KCk9Pnt9LEFycmF5U2xpY2U6KCk9PltdLHBhdGNoQ2xhc3M6KCk9Plcsd3JhcFdpdGhDdXJyZW50Wm9uZTooKT0+VyxmaWx0ZXJQcm9wZXJ0aWVzOigpPT5bXSxhdHRhY2hPcmlnaW5Ub1BhdGNoZWQ6KCk9PlcsX3JlZGVmaW5lUHJvcGVydHk6KCk9PlcscGF0Y2hDYWxsYmFja3M6KCk9PlcsbmF0aXZlU2NoZWR1bGVNaWNyb1Rhc2s6SH0sYj17cGFyZW50Om51bGwsem9uZTpuZXcgZShudWxsLG51bGwpfSxEPW51bGwsSz0wO2Z1bmN0aW9uIFcoKXt9cmV0dXJuIGEoIlpvbmUiLCJab25lIiksZX1mdW5jdGlvbiBkdCgpe2xldCB0PWdsb2JhbFRoaXMsbj10W3RlKCJmb3JjZUR1cGxpY2F0ZVpvbmVDaGVjayIpXT09PSEwO2lmKHQuWm9uZSYmKG58fHR5cGVvZiB0LlpvbmUuX19zeW1ib2xfXyE9ImZ1bmN0aW9uIikpdGhyb3cgbmV3IEVycm9yKCJab25lIGFscmVhZHkgbG9hZGVkLiIpO3JldHVybiB0LlpvbmU/Pz1odCgpLHQuWm9uZX12YXIgcGU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixNZT1PYmplY3QuZGVmaW5lUHJvcGVydHksQWU9T2JqZWN0LmdldFByb3RvdHlwZU9mLF90PU9iamVjdC5jcmVhdGUsVHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLGplPSJhZGRFdmVudExpc3RlbmVyIixIZT0icmVtb3ZlRXZlbnRMaXN0ZW5lciIsTmU9dGUoamUpLFplPXRlKEhlKSxhZT0idHJ1ZSIsbGU9ImZhbHNlIix2ZT10ZSgiIik7ZnVuY3Rpb24gVmUodCxuKXtyZXR1cm4gWm9uZS5jdXJyZW50LndyYXAodCxuKX1mdW5jdGlvbiB4ZSh0LG4sYSxlLGMpe3JldHVybiBab25lLmN1cnJlbnQuc2NoZWR1bGVNYWNyb1Rhc2sodCxuLGEsZSxjKX12YXIgaj10ZSx3ZT10eXBlb2Ygd2luZG93PCJ1IixiZT13ZT93aW5kb3c6dm9pZCAwLFk9d2UmJmJlfHxnbG9iYWxUaGlzLEV0PSJyZW1vdmVBdHRyaWJ1dGUiO2Z1bmN0aW9uIEZlKHQsbil7Zm9yKGxldCBhPXQubGVuZ3RoLTE7YT49MDthLS0pdHlwZW9mIHRbYV09PSJmdW5jdGlvbiImJih0W2FdPVZlKHRbYV0sbisiXyIrYSkpO3JldHVybiB0fWZ1bmN0aW9uIGd0KHQsbil7bGV0IGE9dC5jb25zdHJ1Y3Rvci5uYW1lO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKXtsZXQgYz1uW2VdLGY9dFtjXTtpZihmKXtsZXQgZz1wZSh0LGMpO2lmKCFldChnKSljb250aW51ZTt0W2NdPShUPT57bGV0IHk9ZnVuY3Rpb24oKXtyZXR1cm4gVC5hcHBseSh0aGlzLEZlKGFyZ3VtZW50cyxhKyIuIitjKSl9O3JldHVybiBmZSh5LFQpLHl9KShmKX19fWZ1bmN0aW9uIGV0KHQpe3JldHVybiB0P3Qud3JpdGFibGU9PT0hMT8hMTohKHR5cGVvZiB0LmdldD09ImZ1bmN0aW9uIiYmdHlwZW9mIHQuc2V0PiJ1Iik6ITB9dmFyIHR0PXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZTwidSImJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSxEZT0hKCJudyJpbiBZKSYmdHlwZW9mIFkucHJvY2VzczwidSImJlkucHJvY2Vzcy50b1N0cmluZygpPT09IltvYmplY3QgcHJvY2Vzc10iLEdlPSFEZSYmIXR0JiYhISh3ZSYmYmUuSFRNTEVsZW1lbnQpLG50PXR5cGVvZiBZLnByb2Nlc3M8InUiJiZZLnByb2Nlc3MudG9TdHJpbmcoKT09PSJbb2JqZWN0IHByb2Nlc3NdIiYmIXR0JiYhISh3ZSYmYmUuSFRNTEVsZW1lbnQpLENlPXt9LGt0PWooImVuYWJsZV9iZWZvcmV1bmxvYWQiKSxYZT1mdW5jdGlvbih0KXtpZih0PXR8fFkuZXZlbnQsIXQpcmV0dXJuO2xldCBuPUNlW3QudHlwZV07bnx8KG49Q2VbdC50eXBlXT1qKCJPTl9QUk9QRVJUWSIrdC50eXBlKSk7bGV0IGE9dGhpc3x8dC50YXJnZXR8fFksZT1hW25dLGM7aWYoR2UmJmE9PT1iZSYmdC50eXBlPT09ImVycm9yIil7bGV0IGY9dDtjPWUmJmUuY2FsbCh0aGlzLGYubWVzc2FnZSxmLmZpbGVuYW1lLGYubGluZW5vLGYuY29sbm8sZi5lcnJvciksYz09PSEwJiZ0LnByZXZlbnREZWZhdWx0KCl9ZWxzZSBjPWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQudHlwZT09PSJiZWZvcmV1bmxvYWQiJiZZW2t0XSYmdHlwZW9mIGM9PSJzdHJpbmciP3QucmV0dXJuVmFsdWU9YzpjIT1udWxsJiYhYyYmdC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBjfTtmdW5jdGlvbiBZZSh0LG4sYSl7bGV0IGU9cGUodCxuKTtpZighZSYmYSYmcGUoYSxuKSYmKGU9e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksIWV8fCFlLmNvbmZpZ3VyYWJsZSlyZXR1cm47bGV0IGM9aigib24iK24rInBhdGNoZWQiKTtpZih0Lmhhc093blByb3BlcnR5KGMpJiZ0W2NdKXJldHVybjtkZWxldGUgZS53cml0YWJsZSxkZWxldGUgZS52YWx1ZTtsZXQgZj1lLmdldCxnPWUuc2V0LFQ9bi5zbGljZSgyKSx5PUNlW1RdO3l8fCh5PUNlW1RdPWooIk9OX1BST1BFUlRZIitUKSksZS5zZXQ9ZnVuY3Rpb24odyl7bGV0IF89dGhpcztpZighXyYmdD09PVkmJihfPVkpLCFfKXJldHVybjt0eXBlb2YgX1t5XT09ImZ1bmN0aW9uIiYmXy5yZW1vdmVFdmVudExpc3RlbmVyKFQsWGUpLGc/LmNhbGwoXyxudWxsKSxfW3ldPXcsdHlwZW9mIHc9PSJmdW5jdGlvbiImJl8uYWRkRXZlbnRMaXN0ZW5lcihULFhlLCExKX0sZS5nZXQ9ZnVuY3Rpb24oKXtsZXQgdz10aGlzO2lmKCF3JiZ0PT09WSYmKHc9WSksIXcpcmV0dXJuIG51bGw7bGV0IF89d1t5XTtpZihfKXJldHVybiBfO2lmKGYpe2xldCBQPWYuY2FsbCh0aGlzKTtpZihQKXJldHVybiBlLnNldC5jYWxsKHRoaXMsUCksdHlwZW9mIHdbRXRdPT0iZnVuY3Rpb24iJiZ3LnJlbW92ZUF0dHJpYnV0ZShuKSxQfXJldHVybiBudWxsfSxNZSh0LG4sZSksdFtjXT0hMH1mdW5jdGlvbiBydCh0LG4sYSl7aWYobilmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKylZZSh0LCJvbiIrbltlXSxhKTtlbHNle2xldCBlPVtdO2ZvcihsZXQgYyBpbiB0KWMuc2xpY2UoMCwyKT09Im9uIiYmZS5wdXNoKGMpO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7YysrKVllKHQsZVtjXSxhKX19dmFyIG9lPWooIm9yaWdpbmFsSW5zdGFuY2UiKTtmdW5jdGlvbiB5ZSh0KXtsZXQgbj1ZW3RdO2lmKCFuKXJldHVybjtZW2oodCldPW4sWVt0XT1mdW5jdGlvbigpe2xldCBjPUZlKGFyZ3VtZW50cyx0KTtzd2l0Y2goYy5sZW5ndGgpe2Nhc2UgMDp0aGlzW29lXT1uZXcgbjticmVhaztjYXNlIDE6dGhpc1tvZV09bmV3IG4oY1swXSk7YnJlYWs7Y2FzZSAyOnRoaXNbb2VdPW5ldyBuKGNbMF0sY1sxXSk7YnJlYWs7Y2FzZSAzOnRoaXNbb2VdPW5ldyBuKGNbMF0sY1sxXSxjWzJdKTticmVhaztjYXNlIDQ6dGhpc1tvZV09bmV3IG4oY1swXSxjWzFdLGNbMl0sY1szXSk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkFyZyBsaXN0IHRvbyBsb25nLiIpfX0sZmUoWVt0XSxuKTtsZXQgYT1uZXcgbihmdW5jdGlvbigpe30pLGU7Zm9yKGUgaW4gYSl0PT09IlhNTEh0dHBSZXF1ZXN0IiYmZT09PSJyZXNwb25zZUJsb2IifHwoZnVuY3Rpb24oYyl7dHlwZW9mIGFbY109PSJmdW5jdGlvbiI/WVt0XS5wcm90b3R5cGVbY109ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tvZV1bY10uYXBwbHkodGhpc1tvZV0sYXJndW1lbnRzKX06TWUoWVt0XS5wcm90b3R5cGUsYyx7c2V0OmZ1bmN0aW9uKGYpe3R5cGVvZiBmPT0iZnVuY3Rpb24iPyh0aGlzW29lXVtjXT1WZShmLHQrIi4iK2MpLGZlKHRoaXNbb2VdW2NdLGYpKTp0aGlzW29lXVtjXT1mfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tvZV1bY119fSl9KShlKTtmb3IoZSBpbiBuKWUhPT0icHJvdG90eXBlIiYmbi5oYXNPd25Qcm9wZXJ0eShlKSYmKFlbdF1bZV09bltlXSl9ZnVuY3Rpb24gdWUodCxuLGEpe2xldCBlPXQ7Zm9yKDtlJiYhZS5oYXNPd25Qcm9wZXJ0eShuKTspZT1BZShlKTshZSYmdFtuXSYmKGU9dCk7bGV0IGM9aihuKSxmPW51bGw7aWYoZSYmKCEoZj1lW2NdKXx8IWUuaGFzT3duUHJvcGVydHkoYykpKXtmPWVbY109ZVtuXTtsZXQgZz1lJiZwZShlLG4pO2lmKGV0KGcpKXtsZXQgVD1hKGYsYyxuKTtlW25dPWZ1bmN0aW9uKCl7cmV0dXJuIFQodGhpcyxhcmd1bWVudHMpfSxmZShlW25dLGYpfX1yZXR1cm4gZn1mdW5jdGlvbiBtdCh0LG4sYSl7bGV0IGU9bnVsbDtmdW5jdGlvbiBjKGYpe2xldCBnPWYuZGF0YTtyZXR1cm4gZy5hcmdzW2cuY2JJZHhdPWZ1bmN0aW9uKCl7Zi5pbnZva2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmFwcGx5KGcudGFyZ2V0LGcuYXJncyksZn1lPXVlKHQsbixmPT5mdW5jdGlvbihnLFQpe2xldCB5PWEoZyxUKTtyZXR1cm4geS5jYklkeD49MCYmdHlwZW9mIFRbeS5jYklkeF09PSJmdW5jdGlvbiI/eGUoeS5uYW1lLFRbeS5jYklkeF0seSxjKTpmLmFwcGx5KGcsVCl9KX1mdW5jdGlvbiBmZSh0LG4pe3RbaigiT3JpZ2luYWxEZWxlZ2F0ZSIpXT1ufXZhciAkZT0hMSxMZT0hMTtmdW5jdGlvbiB5dCgpe2lmKCRlKXJldHVybiBMZTskZT0hMDt0cnl7bGV0IHQ9YmUubmF2aWdhdG9yLnVzZXJBZ2VudDsodC5pbmRleE9mKCJNU0lFICIpIT09LTF8fHQuaW5kZXhPZigiVHJpZGVudC8iKSE9PS0xfHx0LmluZGV4T2YoIkVkZ2UvIikhPT0tMSkmJihMZT0hMCl9Y2F0Y2h7fXJldHVybiBMZX1mdW5jdGlvbiBKZSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gS2UodCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIn12YXIgcHQ9e3VzZUc6ITB9LG5lPXt9LG90PXt9LHN0PW5ldyBSZWdFeHAoIl4iK3ZlKyIoXFx3KykodHJ1ZXxmYWxzZSkkIiksaXQ9aigicHJvcGFnYXRpb25TdG9wcGVkIik7ZnVuY3Rpb24gY3QodCxuKXtsZXQgYT0obj9uKHQpOnQpK2xlLGU9KG4/bih0KTp0KSthZSxjPXZlK2EsZj12ZStlO25lW3RdPXt9LG5lW3RdW2xlXT1jLG5lW3RdW2FlXT1mfWZ1bmN0aW9uIHZ0KHQsbixhLGUpe2xldCBjPWUmJmUuYWRkfHxqZSxmPWUmJmUucm18fEhlLGc9ZSYmZS5saXN0ZW5lcnN8fCJldmVudExpc3RlbmVycyIsVD1lJiZlLnJtQWxsfHwicmVtb3ZlQWxsTGlzdGVuZXJzIix5PWooYyksdz0iLiIrYysiOiIsXz0icHJlcGVuZExpc3RlbmVyIixQPSIuIitfKyI6IixMPWZ1bmN0aW9uKHAsZCxBKXtpZihwLmlzUmVtb3ZlZClyZXR1cm47bGV0IFY9cC5jYWxsYmFjazt0eXBlb2YgVj09Im9iamVjdCImJlYuaGFuZGxlRXZlbnQmJihwLmNhbGxiYWNrPWs9PlYuaGFuZGxlRXZlbnQoaykscC5vcmlnaW5hbERlbGVnYXRlPVYpO2xldCBYO3RyeXtwLmludm9rZShwLGQsW0FdKX1jYXRjaChrKXtYPWt9bGV0IEY9cC5vcHRpb25zO2lmKEYmJnR5cGVvZiBGPT0ib2JqZWN0IiYmRi5vbmNlKXtsZXQgaz1wLm9yaWdpbmFsRGVsZWdhdGU/cC5vcmlnaW5hbERlbGVnYXRlOnAuY2FsbGJhY2s7ZFtmXS5jYWxsKGQsQS50eXBlLGssRil9cmV0dXJuIFh9O2Z1bmN0aW9uIEgocCxkLEEpe2lmKGQ9ZHx8dC5ldmVudCwhZClyZXR1cm47bGV0IFY9cHx8ZC50YXJnZXR8fHQsWD1WW25lW2QudHlwZV1bQT9hZTpsZV1dO2lmKFgpe2xldCBGPVtdO2lmKFgubGVuZ3RoPT09MSl7bGV0IGs9TChYWzBdLFYsZCk7ayYmRi5wdXNoKGspfWVsc2V7bGV0IGs9WC5zbGljZSgpO2ZvcihsZXQgVT0wO1U8ay5sZW5ndGgmJiEoZCYmZFtpdF09PT0hMCk7VSsrKXtsZXQgUz1MKGtbVV0sVixkKTtTJiZGLnB1c2goUyl9fWlmKEYubGVuZ3RoPT09MSl0aHJvdyBGWzBdO2ZvcihsZXQgaz0wO2s8Ri5sZW5ndGg7aysrKXtsZXQgVT1GW2tdO24ubmF0aXZlU2NoZWR1bGVNaWNyb1Rhc2soKCk9Pnt0aHJvdyBVfSl9fX1sZXQgej1mdW5jdGlvbihwKXtyZXR1cm4gSCh0aGlzLHAsITEpfSwkPWZ1bmN0aW9uKHApe3JldHVybiBIKHRoaXMscCwhMCl9O2Z1bmN0aW9uIEoocCxkKXtpZighcClyZXR1cm4hMTtsZXQgQT0hMDtkJiZkLnVzZUchPT12b2lkIDAmJihBPWQudXNlRyk7bGV0IFY9ZCYmZC52aCxYPSEwO2QmJmQuY2hrRHVwIT09dm9pZCAwJiYoWD1kLmNoa0R1cCk7bGV0IEY9ITE7ZCYmZC5ydCE9PXZvaWQgMCYmKEY9ZC5ydCk7bGV0IGs9cDtmb3IoO2smJiFrLmhhc093blByb3BlcnR5KGMpOylrPUFlKGspO2lmKCFrJiZwW2NdJiYoaz1wKSwha3x8a1t5XSlyZXR1cm4hMTtsZXQgVT1kJiZkLmV2ZW50TmFtZVRvU3RyaW5nLFM9e30sUj1rW3ldPWtbY10sYj1rW2ooZildPWtbZl0sRD1rW2ooZyldPWtbZ10sSz1rW2ooVCldPWtbVF0sVztkJiZkLnByZXBlbmQmJihXPWtbaihkLnByZXBlbmQpXT1rW2QucHJlcGVuZF0pO2Z1bmN0aW9uIEkobyx1KXtyZXR1cm4gdT90eXBlb2Ygbz09ImJvb2xlYW4iP3tjYXB0dXJlOm8scGFzc2l2ZTohMH06bz90eXBlb2Ygbz09Im9iamVjdCImJm8ucGFzc2l2ZSE9PSExP3suLi5vLHBhc3NpdmU6ITB9Om86e3Bhc3NpdmU6ITB9Om99bGV0IHM9ZnVuY3Rpb24obyl7aWYoIVMuaXNFeGlzdGluZylyZXR1cm4gUi5jYWxsKFMudGFyZ2V0LFMuZXZlbnROYW1lLFMuY2FwdHVyZT8kOnosUy5vcHRpb25zKX0saT1mdW5jdGlvbihvKXtpZighby5pc1JlbW92ZWQpe2xldCB1PW5lW28uZXZlbnROYW1lXSx2O3UmJih2PXVbby5jYXB0dXJlP2FlOmxlXSk7bGV0IEM9diYmby50YXJnZXRbdl07aWYoQyl7Zm9yKGxldCBtPTA7bTxDLmxlbmd0aDttKyspaWYoQ1ttXT09PW8pe0Muc3BsaWNlKG0sMSksby5pc1JlbW92ZWQ9ITAsby5yZW1vdmVBYm9ydExpc3RlbmVyJiYoby5yZW1vdmVBYm9ydExpc3RlbmVyKCksby5yZW1vdmVBYm9ydExpc3RlbmVyPW51bGwpLEMubGVuZ3RoPT09MCYmKG8uYWxsUmVtb3ZlZD0hMCxvLnRhcmdldFt2XT1udWxsKTticmVha319fWlmKG8uYWxsUmVtb3ZlZClyZXR1cm4gYi5jYWxsKG8udGFyZ2V0LG8uZXZlbnROYW1lLG8uY2FwdHVyZT8kOnosby5vcHRpb25zKX0scj1mdW5jdGlvbihvKXtyZXR1cm4gUi5jYWxsKFMudGFyZ2V0LFMuZXZlbnROYW1lLG8uaW52b2tlLFMub3B0aW9ucyl9LEU9ZnVuY3Rpb24obyl7cmV0dXJuIFcuY2FsbChTLnRhcmdldCxTLmV2ZW50TmFtZSxvLmludm9rZSxTLm9wdGlvbnMpfSx4PWZ1bmN0aW9uKG8pe3JldHVybiBiLmNhbGwoby50YXJnZXQsby5ldmVudE5hbWUsby5pbnZva2Usby5vcHRpb25zKX0sZWU9QT9zOnIsTT1BP2k6eCxoZT1mdW5jdGlvbihvLHUpe2xldCB2PXR5cGVvZiB1O3JldHVybiB2PT09ImZ1bmN0aW9uIiYmby5jYWxsYmFjaz09PXV8fHY9PT0ib2JqZWN0IiYmby5vcmlnaW5hbERlbGVnYXRlPT09dX0sX2U9ZD8uZGlmZnx8aGUsUT1ab25lW2ooIlVOUEFUQ0hFRF9FVkVOVFMiKV0sVGU9dFtqKCJQQVNTSVZFX0VWRU5UUyIpXTtmdW5jdGlvbiBoKG8pe2lmKHR5cGVvZiBvPT0ib2JqZWN0IiYmbyE9PW51bGwpe2xldCB1PXsuLi5vfTtyZXR1cm4gby5zaWduYWwmJih1LnNpZ25hbD1vLnNpZ25hbCksdX1yZXR1cm4gb31sZXQgbD1mdW5jdGlvbihvLHUsdixDLG09ITEsTz0hMSl7cmV0dXJuIGZ1bmN0aW9uKCl7bGV0IE49dGhpc3x8dCxaPWFyZ3VtZW50c1swXTtkJiZkLnRyYW5zZmVyRXZlbnROYW1lJiYoWj1kLnRyYW5zZmVyRXZlbnROYW1lKFopKTtsZXQgRz1hcmd1bWVudHNbMV07aWYoIUcpcmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKERlJiZaPT09InVuY2F1Z2h0RXhjZXB0aW9uIilyZXR1cm4gby5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bGV0IEI9ITE7aWYodHlwZW9mIEchPSJmdW5jdGlvbiIpe2lmKCFHLmhhbmRsZUV2ZW50KXJldHVybiBvLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtCPSEwfWlmKFYmJiFWKG8sRyxOLGFyZ3VtZW50cykpcmV0dXJuO2xldCBkZT0hIVRlJiZUZS5pbmRleE9mKFopIT09LTEsc2U9aChJKGFyZ3VtZW50c1syXSxkZSkpLEVlPXNlPy5zaWduYWw7aWYoRWU/LmFib3J0ZWQpcmV0dXJuO2lmKFEpe2ZvcihsZXQgaWU9MDtpZTxRLmxlbmd0aDtpZSsrKWlmKFo9PT1RW2llXSlyZXR1cm4gZGU/by5jYWxsKE4sWixHLHNlKTpvLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1sZXQgU2U9c2U/dHlwZW9mIHNlPT0iYm9vbGVhbiI/ITA6c2UuY2FwdHVyZTohMSxCZT1zZSYmdHlwZW9mIHNlPT0ib2JqZWN0Ij9zZS5vbmNlOiExLGZ0PVpvbmUuY3VycmVudCxPZT1uZVtaXTtPZXx8KGN0KFosVSksT2U9bmVbWl0pO2xldCB6ZT1PZVtTZT9hZTpsZV0sZ2U9Tlt6ZV0sVWU9ITE7aWYoZ2Upe2lmKFVlPSEwLFgpe2ZvcihsZXQgaWU9MDtpZTxnZS5sZW5ndGg7aWUrKylpZihfZShnZVtpZV0sRykpcmV0dXJufX1lbHNlIGdlPU5bemVdPVtdO2xldCBQZSxXZT1OLmNvbnN0cnVjdG9yLm5hbWUscWU9b3RbV2VdO3FlJiYoUGU9cWVbWl0pLFBlfHwoUGU9V2UrdSsoVT9VKFopOlopKSxTLm9wdGlvbnM9c2UsQmUmJihTLm9wdGlvbnMub25jZT0hMSksUy50YXJnZXQ9TixTLmNhcHR1cmU9U2UsUy5ldmVudE5hbWU9WixTLmlzRXhpc3Rpbmc9VWU7bGV0IG1lPUE/cHQ6dm9pZCAwO21lJiYobWUudGFza0RhdGE9UyksRWUmJihTLm9wdGlvbnMuc2lnbmFsPXZvaWQgMCk7bGV0IHJlPWZ0LnNjaGVkdWxlRXZlbnRUYXNrKFBlLEcsbWUsdixDKTtpZihFZSl7Uy5vcHRpb25zLnNpZ25hbD1FZTtsZXQgaWU9KCk9PnJlLnpvbmUuY2FuY2VsVGFzayhyZSk7by5jYWxsKEVlLCJhYm9ydCIsaWUse29uY2U6ITB9KSxyZS5yZW1vdmVBYm9ydExpc3RlbmVyPSgpPT5FZS5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsaWUpfWlmKFMudGFyZ2V0PW51bGwsbWUmJihtZS50YXNrRGF0YT1udWxsKSxCZSYmKFMub3B0aW9ucy5vbmNlPSEwKSx0eXBlb2YgcmUub3B0aW9ucyE9ImJvb2xlYW4iJiYocmUub3B0aW9ucz1zZSkscmUudGFyZ2V0PU4scmUuY2FwdHVyZT1TZSxyZS5ldmVudE5hbWU9WixCJiYocmUub3JpZ2luYWxEZWxlZ2F0ZT1HKSxPP2dlLnVuc2hpZnQocmUpOmdlLnB1c2gocmUpLG0pcmV0dXJuIE59fTtyZXR1cm4ga1tjXT1sKFIsdyxlZSxNLEYpLFcmJihrW19dPWwoVyxQLEUsTSxGLCEwKSksa1tmXT1mdW5jdGlvbigpe2xldCBvPXRoaXN8fHQsdT1hcmd1bWVudHNbMF07ZCYmZC50cmFuc2ZlckV2ZW50TmFtZSYmKHU9ZC50cmFuc2ZlckV2ZW50TmFtZSh1KSk7bGV0IHY9YXJndW1lbnRzWzJdLEM9dj90eXBlb2Ygdj09ImJvb2xlYW4iPyEwOnYuY2FwdHVyZTohMSxtPWFyZ3VtZW50c1sxXTtpZighbSlyZXR1cm4gYi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoViYmIVYoYixtLG8sYXJndW1lbnRzKSlyZXR1cm47bGV0IE89bmVbdV0sTjtPJiYoTj1PW0M/YWU6bGVdKTtsZXQgWj1OJiZvW05dO2lmKFopZm9yKGxldCBHPTA7RzxaLmxlbmd0aDtHKyspe2xldCBCPVpbR107aWYoX2UoQixtKSl7aWYoWi5zcGxpY2UoRywxKSxCLmlzUmVtb3ZlZD0hMCxaLmxlbmd0aD09PTAmJihCLmFsbFJlbW92ZWQ9ITAsb1tOXT1udWxsLCFDJiZ0eXBlb2YgdT09InN0cmluZyIpKXtsZXQgZGU9dmUrIk9OX1BST1BFUlRZIit1O29bZGVdPW51bGx9cmV0dXJuIEIuem9uZS5jYW5jZWxUYXNrKEIpLEY/bzp2b2lkIDB9fXJldHVybiBiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sa1tnXT1mdW5jdGlvbigpe2xldCBvPXRoaXN8fHQsdT1hcmd1bWVudHNbMF07ZCYmZC50cmFuc2ZlckV2ZW50TmFtZSYmKHU9ZC50cmFuc2ZlckV2ZW50TmFtZSh1KSk7bGV0IHY9W10sQz1hdChvLFU/VSh1KTp1KTtmb3IobGV0IG09MDttPEMubGVuZ3RoO20rKyl7bGV0IE89Q1ttXSxOPU8ub3JpZ2luYWxEZWxlZ2F0ZT9PLm9yaWdpbmFsRGVsZWdhdGU6Ty5jYWxsYmFjazt2LnB1c2goTil9cmV0dXJuIHZ9LGtbVF09ZnVuY3Rpb24oKXtsZXQgbz10aGlzfHx0LHU9YXJndW1lbnRzWzBdO2lmKHUpe2QmJmQudHJhbnNmZXJFdmVudE5hbWUmJih1PWQudHJhbnNmZXJFdmVudE5hbWUodSkpO2xldCB2PW5lW3VdO2lmKHYpe2xldCBDPXZbbGVdLG09dlthZV0sTz1vW0NdLE49b1ttXTtpZihPKXtsZXQgWj1PLnNsaWNlKCk7Zm9yKGxldCBHPTA7RzxaLmxlbmd0aDtHKyspe2xldCBCPVpbR10sZGU9Qi5vcmlnaW5hbERlbGVnYXRlP0Iub3JpZ2luYWxEZWxlZ2F0ZTpCLmNhbGxiYWNrO3RoaXNbZl0uY2FsbCh0aGlzLHUsZGUsQi5vcHRpb25zKX19aWYoTil7bGV0IFo9Ti5zbGljZSgpO2ZvcihsZXQgRz0wO0c8Wi5sZW5ndGg7RysrKXtsZXQgQj1aW0ddLGRlPUIub3JpZ2luYWxEZWxlZ2F0ZT9CLm9yaWdpbmFsRGVsZWdhdGU6Qi5jYWxsYmFjazt0aGlzW2ZdLmNhbGwodGhpcyx1LGRlLEIub3B0aW9ucyl9fX19ZWxzZXtsZXQgdj1PYmplY3Qua2V5cyhvKTtmb3IobGV0IEM9MDtDPHYubGVuZ3RoO0MrKyl7bGV0IG09dltDXSxPPXN0LmV4ZWMobSksTj1PJiZPWzFdO04mJk4hPT0icmVtb3ZlTGlzdGVuZXIiJiZ0aGlzW1RdLmNhbGwodGhpcyxOKX10aGlzW1RdLmNhbGwodGhpcywicmVtb3ZlTGlzdGVuZXIiKX1pZihGKXJldHVybiB0aGlzfSxmZShrW2NdLFIpLGZlKGtbZl0sYiksSyYmZmUoa1tUXSxLKSxEJiZmZShrW2ddLEQpLCEwfWxldCBxPVtdO2ZvcihsZXQgcD0wO3A8YS5sZW5ndGg7cCsrKXFbcF09SihhW3BdLGUpO3JldHVybiBxfWZ1bmN0aW9uIGF0KHQsbil7aWYoIW4pe2xldCBmPVtdO2ZvcihsZXQgZyBpbiB0KXtsZXQgVD1zdC5leGVjKGcpLHk9VCYmVFsxXTtpZih5JiYoIW58fHk9PT1uKSl7bGV0IHc9dFtnXTtpZih3KWZvcihsZXQgXz0wO188dy5sZW5ndGg7XysrKWYucHVzaCh3W19dKX19cmV0dXJuIGZ9bGV0IGE9bmVbbl07YXx8KGN0KG4pLGE9bmVbbl0pO2xldCBlPXRbYVtsZV1dLGM9dFthW2FlXV07cmV0dXJuIGU/Yz9lLmNvbmNhdChjKTplLnNsaWNlKCk6Yz9jLnNsaWNlKCk6W119ZnVuY3Rpb24gYnQodCxuKXtsZXQgYT10LkV2ZW50O2EmJmEucHJvdG90eXBlJiZuLnBhdGNoTWV0aG9kKGEucHJvdG90eXBlLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLGU9PmZ1bmN0aW9uKGMsZil7Y1tpdF09ITAsZSYmZS5hcHBseShjLGYpfSl9ZnVuY3Rpb24gUHQodCxuKXtuLnBhdGNoTWV0aG9kKHQsInF1ZXVlTWljcm90YXNrIixhPT5mdW5jdGlvbihlLGMpe1pvbmUuY3VycmVudC5zY2hlZHVsZU1pY3JvVGFzaygicXVldWVNaWNyb3Rhc2siLGNbMF0pfSl9dmFyIFJlPWooInpvbmVUYXNrIik7ZnVuY3Rpb24ga2UodCxuLGEsZSl7bGV0IGM9bnVsbCxmPW51bGw7bis9ZSxhKz1lO2xldCBnPXt9O2Z1bmN0aW9uIFQodyl7bGV0IF89dy5kYXRhO18uYXJnc1swXT1mdW5jdGlvbigpe3JldHVybiB3Lmludm9rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2xldCBQPWMuYXBwbHkodCxfLmFyZ3MpO3JldHVybiBLZShQKT9fLmhhbmRsZUlkPVA6KF8uaGFuZGxlPVAsXy5pc1JlZnJlc2hhYmxlPUplKFAucmVmcmVzaCkpLHd9ZnVuY3Rpb24geSh3KXtsZXR7aGFuZGxlOl8saGFuZGxlSWQ6UH09dy5kYXRhO3JldHVybiBmLmNhbGwodCxfPz9QKX1jPXVlKHQsbix3PT5mdW5jdGlvbihfLFApe2lmKEplKFBbMF0pKXtsZXQgTD17aXNSZWZyZXNoYWJsZTohMSxpc1BlcmlvZGljOmU9PT0iSW50ZXJ2YWwiLGRlbGF5OmU9PT0iVGltZW91dCJ8fGU9PT0iSW50ZXJ2YWwiP1BbMV18fDA6dm9pZCAwLGFyZ3M6UH0sSD1QWzBdO1BbMF09ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIEguYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7bGV0e2hhbmRsZTpBLGhhbmRsZUlkOlYsaXNQZXJpb2RpYzpYLGlzUmVmcmVzaGFibGU6Rn09TDshWCYmIUYmJihWP2RlbGV0ZSBnW1ZdOkEmJihBW1JlXT1udWxsKSl9fTtsZXQgej14ZShuLFBbMF0sTCxULHkpO2lmKCF6KXJldHVybiB6O2xldHtoYW5kbGVJZDokLGhhbmRsZTpKLGlzUmVmcmVzaGFibGU6cSxpc1BlcmlvZGljOnB9PXouZGF0YTtpZigkKWdbJF09ejtlbHNlIGlmKEomJihKW1JlXT16LHEmJiFwKSl7bGV0IGQ9Si5yZWZyZXNoO0oucmVmcmVzaD1mdW5jdGlvbigpe2xldHt6b25lOkEsc3RhdGU6Vn09ejtyZXR1cm4gVj09PSJub3RTY2hlZHVsZWQiPyh6Ll9zdGF0ZT0ic2NoZWR1bGVkIixBLl91cGRhdGVUYXNrQ291bnQoeiwxKSk6Vj09PSJydW5uaW5nIiYmKHouX3N0YXRlPSJzY2hlZHVsaW5nIiksZC5jYWxsKHRoaXMpfX1yZXR1cm4gSj8/JD8/en1lbHNlIHJldHVybiB3LmFwcGx5KHQsUCl9KSxmPXVlKHQsYSx3PT5mdW5jdGlvbihfLFApe2xldCBMPVBbMF0sSDtLZShMKT8oSD1nW0xdLGRlbGV0ZSBnW0xdKTooSD1MPy5bUmVdLEg/TFtSZV09bnVsbDpIPUwpLEg/LnR5cGU/SC5jYW5jZWxGbiYmSC56b25lLmNhbmNlbFRhc2soSCk6dy5hcHBseSh0LFApfSl9ZnVuY3Rpb24gUnQodCxuKXtsZXR7aXNCcm93c2VyOmEsaXNNaXg6ZX09bi5nZXRHbG9iYWxPYmplY3RzKCk7aWYoIWEmJiFlfHwhdC5jdXN0b21FbGVtZW50c3x8ISgiY3VzdG9tRWxlbWVudHMiaW4gdCkpcmV0dXJuO2xldCBjPVsiY29ubmVjdGVkQ2FsbGJhY2siLCJkaXNjb25uZWN0ZWRDYWxsYmFjayIsImFkb3B0ZWRDYWxsYmFjayIsImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayIsImZvcm1Bc3NvY2lhdGVkQ2FsbGJhY2siLCJmb3JtRGlzYWJsZWRDYWxsYmFjayIsImZvcm1SZXNldENhbGxiYWNrIiwiZm9ybVN0YXRlUmVzdG9yZUNhbGxiYWNrIl07bi5wYXRjaENhbGxiYWNrcyhuLHQuY3VzdG9tRWxlbWVudHMsImN1c3RvbUVsZW1lbnRzIiwiZGVmaW5lIixjKX1mdW5jdGlvbiBDdCh0LG4pe2lmKFpvbmVbbi5zeW1ib2woInBhdGNoRXZlbnRUYXJnZXQiKV0pcmV0dXJuO2xldHtldmVudE5hbWVzOmEsem9uZVN5bWJvbEV2ZW50TmFtZXM6ZSxUUlVFX1NUUjpjLEZBTFNFX1NUUjpmLFpPTkVfU1lNQk9MX1BSRUZJWDpnfT1uLmdldEdsb2JhbE9iamVjdHMoKTtmb3IobGV0IHk9MDt5PGEubGVuZ3RoO3krKyl7bGV0IHc9YVt5XSxfPXcrZixQPXcrYyxMPWcrXyxIPWcrUDtlW3ddPXt9LGVbd11bZl09TCxlW3ddW2NdPUh9bGV0IFQ9dC5FdmVudFRhcmdldDtpZighKCFUfHwhVC5wcm90b3R5cGUpKXJldHVybiBuLnBhdGNoRXZlbnRUYXJnZXQodCxuLFtUJiZULnByb3RvdHlwZV0pLCEwfWZ1bmN0aW9uIHd0KHQsbil7bi5wYXRjaEV2ZW50UHJvdG90eXBlKHQsbil9ZnVuY3Rpb24gbHQodCxuLGEpe2lmKCFhfHxhLmxlbmd0aD09PTApcmV0dXJuIG47bGV0IGU9YS5maWx0ZXIoZj0+Zi50YXJnZXQ9PT10KTtpZihlLmxlbmd0aD09PTApcmV0dXJuIG47bGV0IGM9ZVswXS5pZ25vcmVQcm9wZXJ0aWVzO3JldHVybiBuLmZpbHRlcihmPT5jLmluZGV4T2YoZik9PT0tMSl9ZnVuY3Rpb24gUWUodCxuLGEsZSl7aWYoIXQpcmV0dXJuO2xldCBjPWx0KHQsbixhKTtydCh0LGMsZSl9ZnVuY3Rpb24gSWUodCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLmZpbHRlcihuPT5uLnN0YXJ0c1dpdGgoIm9uIikmJm4ubGVuZ3RoPjIpLm1hcChuPT5uLnN1YnN0cmluZygyKSl9ZnVuY3Rpb24gRHQodCxuKXtpZihEZSYmIW50fHxab25lW3Quc3ltYm9sKCJwYXRjaEV2ZW50cyIpXSlyZXR1cm47bGV0IGE9bi5fX1pvbmVfaWdub3JlX29uX3Byb3BlcnRpZXMsZT1bXTtpZihHZSl7bGV0IGM9d2luZG93O2U9ZS5jb25jYXQoWyJEb2N1bWVudCIsIlNWR0VsZW1lbnQiLCJFbGVtZW50IiwiSFRNTEVsZW1lbnQiLCJIVE1MQm9keUVsZW1lbnQiLCJIVE1MTWVkaWFFbGVtZW50IiwiSFRNTEZyYW1lU2V0RWxlbWVudCIsIkhUTUxGcmFtZUVsZW1lbnQiLCJIVE1MSUZyYW1lRWxlbWVudCIsIkhUTUxNYXJxdWVlRWxlbWVudCIsIldvcmtlciJdKTtsZXQgZj1bXTtRZShjLEllKGMpLGEmJmEuY29uY2F0KGYpLEFlKGMpKX1lPWUuY29uY2F0KFsiWE1MSHR0cFJlcXVlc3QiLCJYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IiwiSURCSW5kZXgiLCJJREJSZXF1ZXN0IiwiSURCT3BlbkRCUmVxdWVzdCIsIklEQkRhdGFiYXNlIiwiSURCVHJhbnNhY3Rpb24iLCJJREJDdXJzb3IiLCJXZWJTb2NrZXQiXSk7Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKyspe2xldCBmPW5bZVtjXV07Zj8ucHJvdG90eXBlJiZRZShmLnByb3RvdHlwZSxJZShmLnByb3RvdHlwZSksYSl9fWZ1bmN0aW9uIFN0KHQpe3QuX19sb2FkX3BhdGNoKCJsZWdhY3kiLG49PntsZXQgYT1uW3QuX19zeW1ib2xfXygibGVnYWN5UGF0Y2giKV07YSYmYSgpfSksdC5fX2xvYWRfcGF0Y2goInRpbWVycyIsbj0+e2xldCBlPSJjbGVhciI7a2Uobiwic2V0IixlLCJUaW1lb3V0Iiksa2Uobiwic2V0IixlLCJJbnRlcnZhbCIpLGtlKG4sInNldCIsZSwiSW1tZWRpYXRlIil9KSx0Ll9fbG9hZF9wYXRjaCgicmVxdWVzdEFuaW1hdGlvbkZyYW1lIixuPT57a2UobiwicmVxdWVzdCIsImNhbmNlbCIsIkFuaW1hdGlvbkZyYW1lIiksa2UobiwibW96UmVxdWVzdCIsIm1vekNhbmNlbCIsIkFuaW1hdGlvbkZyYW1lIiksa2Uobiwid2Via2l0UmVxdWVzdCIsIndlYmtpdENhbmNlbCIsIkFuaW1hdGlvbkZyYW1lIil9KSx0Ll9fbG9hZF9wYXRjaCgiYmxvY2tpbmciLChuLGEpPT57bGV0IGU9WyJhbGVydCIsInByb21wdCIsImNvbmZpcm0iXTtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKyl7bGV0IGY9ZVtjXTt1ZShuLGYsKGcsVCx5KT0+ZnVuY3Rpb24odyxfKXtyZXR1cm4gYS5jdXJyZW50LnJ1bihnLG4sXyx5KX0pfX0pLHQuX19sb2FkX3BhdGNoKCJFdmVudFRhcmdldCIsKG4sYSxlKT0+e3d0KG4sZSksQ3QobixlKTtsZXQgYz1uLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ7YyYmYy5wcm90b3R5cGUmJmUucGF0Y2hFdmVudFRhcmdldChuLGUsW2MucHJvdG90eXBlXSl9KSx0Ll9fbG9hZF9wYXRjaCgiTXV0YXRpb25PYnNlcnZlciIsKG4sYSxlKT0+e3llKCJNdXRhdGlvbk9ic2VydmVyIikseWUoIldlYktpdE11dGF0aW9uT2JzZXJ2ZXIiKX0pLHQuX19sb2FkX3BhdGNoKCJJbnRlcnNlY3Rpb25PYnNlcnZlciIsKG4sYSxlKT0+e3llKCJJbnRlcnNlY3Rpb25PYnNlcnZlciIpfSksdC5fX2xvYWRfcGF0Y2goIkZpbGVSZWFkZXIiLChuLGEsZSk9Pnt5ZSgiRmlsZVJlYWRlciIpfSksdC5fX2xvYWRfcGF0Y2goIm9uX3Byb3BlcnR5IiwobixhLGUpPT57RHQoZSxuKX0pLHQuX19sb2FkX3BhdGNoKCJjdXN0b21FbGVtZW50cyIsKG4sYSxlKT0+e1J0KG4sZSl9KSx0Ll9fbG9hZF9wYXRjaCgiWEhSIiwobixhKT0+e3cobik7bGV0IGU9aigieGhyVGFzayIpLGM9aigieGhyU3luYyIpLGY9aigieGhyTGlzdGVuZXIiKSxnPWooInhoclNjaGVkdWxlZCIpLFQ9aigieGhyVVJMIikseT1qKCJ4aHJFcnJvckJlZm9yZVNjaGVkdWxlZCIpO2Z1bmN0aW9uIHcoXyl7bGV0IFA9Xy5YTUxIdHRwUmVxdWVzdDtpZighUClyZXR1cm47bGV0IEw9UC5wcm90b3R5cGU7ZnVuY3Rpb24gSChSKXtyZXR1cm4gUltlXX1sZXQgej1MW05lXSwkPUxbWmVdO2lmKCF6KXtsZXQgUj1fLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ7aWYoUil7bGV0IGI9Ui5wcm90b3R5cGU7ej1iW05lXSwkPWJbWmVdfX1sZXQgSj0icmVhZHlzdGF0ZWNoYW5nZSIscT0ic2NoZWR1bGVkIjtmdW5jdGlvbiBwKFIpe2xldCBiPVIuZGF0YSxEPWIudGFyZ2V0O0RbZ109ITEsRFt5XT0hMTtsZXQgSz1EW2ZdO3p8fCh6PURbTmVdLCQ9RFtaZV0pLEsmJiQuY2FsbChELEosSyk7bGV0IFc9RFtmXT0oKT0+e2lmKEQucmVhZHlTdGF0ZT09PUQuRE9ORSlpZighYi5hYm9ydGVkJiZEW2ddJiZSLnN0YXRlPT09cSl7bGV0IHM9RFthLl9fc3ltYm9sX18oImxvYWRmYWxzZSIpXTtpZihELnN0YXR1cyE9PTAmJnMmJnMubGVuZ3RoPjApe2xldCBpPVIuaW52b2tlO1IuaW52b2tlPWZ1bmN0aW9uKCl7bGV0IHI9RFthLl9fc3ltYm9sX18oImxvYWRmYWxzZSIpXTtmb3IobGV0IEU9MDtFPHIubGVuZ3RoO0UrKylyW0VdPT09UiYmci5zcGxpY2UoRSwxKTshYi5hYm9ydGVkJiZSLnN0YXRlPT09cSYmaS5jYWxsKFIpfSxzLnB1c2goUil9ZWxzZSBSLmludm9rZSgpfWVsc2UhYi5hYm9ydGVkJiZEW2ddPT09ITEmJihEW3ldPSEwKX07cmV0dXJuIHouY2FsbChELEosVyksRFtlXXx8KERbZV09UiksVS5hcHBseShELGIuYXJncyksRFtnXT0hMCxSfWZ1bmN0aW9uIGQoKXt9ZnVuY3Rpb24gQShSKXtsZXQgYj1SLmRhdGE7cmV0dXJuIGIuYWJvcnRlZD0hMCxTLmFwcGx5KGIudGFyZ2V0LGIuYXJncyl9bGV0IFY9dWUoTCwib3BlbiIsKCk9PmZ1bmN0aW9uKFIsYil7cmV0dXJuIFJbY109YlsyXT09ITEsUltUXT1iWzFdLFYuYXBwbHkoUixiKX0pLFg9IlhNTEh0dHBSZXF1ZXN0LnNlbmQiLEY9aigiZmV0Y2hUYXNrQWJvcnRpbmciKSxrPWooImZldGNoVGFza1NjaGVkdWxpbmciKSxVPXVlKEwsInNlbmQiLCgpPT5mdW5jdGlvbihSLGIpe2lmKGEuY3VycmVudFtrXT09PSEwfHxSW2NdKXJldHVybiBVLmFwcGx5KFIsYik7e2xldCBEPXt0YXJnZXQ6Uix1cmw6UltUXSxpc1BlcmlvZGljOiExLGFyZ3M6YixhYm9ydGVkOiExfSxLPXhlKFgsZCxELHAsQSk7UiYmUlt5XT09PSEwJiYhRC5hYm9ydGVkJiZLLnN0YXRlPT09cSYmSy5pbnZva2UoKX19KSxTPXVlKEwsImFib3J0IiwoKT0+ZnVuY3Rpb24oUixiKXtsZXQgRD1IKFIpO2lmKEQmJnR5cGVvZiBELnR5cGU9PSJzdHJpbmciKXtpZihELmNhbmNlbEZuPT1udWxsfHxELmRhdGEmJkQuZGF0YS5hYm9ydGVkKXJldHVybjtELnpvbmUuY2FuY2VsVGFzayhEKX1lbHNlIGlmKGEuY3VycmVudFtGXT09PSEwKXJldHVybiBTLmFwcGx5KFIsYil9KX19KSx0Ll9fbG9hZF9wYXRjaCgiZ2VvbG9jYXRpb24iLG49PntuLm5hdmlnYXRvciYmbi5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24mJmd0KG4ubmF2aWdhdG9yLmdlb2xvY2F0aW9uLFsiZ2V0Q3VycmVudFBvc2l0aW9uIiwid2F0Y2hQb3NpdGlvbiJdKX0pLHQuX19sb2FkX3BhdGNoKCJQcm9taXNlUmVqZWN0aW9uRXZlbnQiLChuLGEpPT57ZnVuY3Rpb24gZShjKXtyZXR1cm4gZnVuY3Rpb24oZil7YXQobixjKS5mb3JFYWNoKFQ9PntsZXQgeT1uLlByb21pc2VSZWplY3Rpb25FdmVudDtpZih5KXtsZXQgdz1uZXcgeShjLHtwcm9taXNlOmYucHJvbWlzZSxyZWFzb246Zi5yZWplY3Rpb259KTtULmludm9rZSh3KX19KX19bi5Qcm9taXNlUmVqZWN0aW9uRXZlbnQmJihhW2ooInVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25IYW5kbGVyIildPWUoInVuaGFuZGxlZHJlamVjdGlvbiIpLGFbaigicmVqZWN0aW9uSGFuZGxlZEhhbmRsZXIiKV09ZSgicmVqZWN0aW9uaGFuZGxlZCIpKX0pLHQuX19sb2FkX3BhdGNoKCJxdWV1ZU1pY3JvdGFzayIsKG4sYSxlKT0+e1B0KG4sZSl9KX1mdW5jdGlvbiBPdCh0KXt0Ll9fbG9hZF9wYXRjaCgiWm9uZUF3YXJlUHJvbWlzZSIsKG4sYSxlKT0+e2xldCBjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsZj1PYmplY3QuZGVmaW5lUHJvcGVydHk7ZnVuY3Rpb24gZyhoKXtpZihoJiZoLnRvU3RyaW5nPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyl7bGV0IGw9aC5jb25zdHJ1Y3RvciYmaC5jb25zdHJ1Y3Rvci5uYW1lO3JldHVybihsfHwiIikrIjogIitKU09OLnN0cmluZ2lmeShoKX1yZXR1cm4gaD9oLnRvU3RyaW5nKCk6T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGgpfWxldCBUPWUuc3ltYm9sLHk9W10sdz1uW1QoIkRJU0FCTEVfV1JBUFBJTkdfVU5DQVVHSFRfUFJPTUlTRV9SRUpFQ1RJT04iKV0hPT0hMSxfPVQoIlByb21pc2UiKSxQPVQoInRoZW4iKSxMPSJfX2NyZWF0aW9uVHJhY2VfXyI7ZS5vblVuaGFuZGxlZEVycm9yPWg9PntpZihlLnNob3dVbmNhdWdodEVycm9yKCkpe2xldCBsPWgmJmgucmVqZWN0aW9uO2w/Y29uc29sZS5lcnJvcigiVW5oYW5kbGVkIFByb21pc2UgcmVqZWN0aW9uOiIsbCBpbnN0YW5jZW9mIEVycm9yP2wubWVzc2FnZTpsLCI7IFpvbmU6IixoLnpvbmUubmFtZSwiOyBUYXNrOiIsaC50YXNrJiZoLnRhc2suc291cmNlLCI7IFZhbHVlOiIsbCxsIGluc3RhbmNlb2YgRXJyb3I/bC5zdGFjazp2b2lkIDApOmNvbnNvbGUuZXJyb3IoaCl9fSxlLm1pY3JvdGFza0RyYWluRG9uZT0oKT0+e2Zvcig7eS5sZW5ndGg7KXtsZXQgaD15LnNoaWZ0KCk7dHJ5e2guem9uZS5ydW5HdWFyZGVkKCgpPT57dGhyb3cgaC50aHJvd09yaWdpbmFsP2gucmVqZWN0aW9uOmh9KX1jYXRjaChsKXt6KGwpfX19O2xldCBIPVQoInVuaGFuZGxlZFByb21pc2VSZWplY3Rpb25IYW5kbGVyIik7ZnVuY3Rpb24geihoKXtlLm9uVW5oYW5kbGVkRXJyb3IoaCk7dHJ5e2xldCBsPWFbSF07dHlwZW9mIGw9PSJmdW5jdGlvbiImJmwuY2FsbCh0aGlzLGgpfWNhdGNoe319ZnVuY3Rpb24gJChoKXtyZXR1cm4gaCYmdHlwZW9mIGgudGhlbj09ImZ1bmN0aW9uIn1mdW5jdGlvbiBKKGgpe3JldHVybiBofWZ1bmN0aW9uIHEoaCl7cmV0dXJuIE0ucmVqZWN0KGgpfWxldCBwPVQoInN0YXRlIiksZD1UKCJ2YWx1ZSIpLEE9VCgiZmluYWxseSIpLFY9VCgicGFyZW50UHJvbWlzZVZhbHVlIiksWD1UKCJwYXJlbnRQcm9taXNlU3RhdGUiKSxGPSJQcm9taXNlLnRoZW4iLGs9bnVsbCxVPSEwLFM9ITEsUj0wO2Z1bmN0aW9uIGIoaCxsKXtyZXR1cm4gbz0+e3RyeXtJKGgsbCxvKX1jYXRjaCh1KXtJKGgsITEsdSl9fX1sZXQgRD1mdW5jdGlvbigpe2xldCBoPSExO3JldHVybiBmdW5jdGlvbihvKXtyZXR1cm4gZnVuY3Rpb24oKXtofHwoaD0hMCxvLmFwcGx5KG51bGwsYXJndW1lbnRzKSl9fX0sSz0iUHJvbWlzZSByZXNvbHZlZCB3aXRoIGl0c2VsZiIsVz1UKCJjdXJyZW50VGFza1RyYWNlIik7ZnVuY3Rpb24gSShoLGwsbyl7bGV0IHU9RCgpO2lmKGg9PT1vKXRocm93IG5ldyBUeXBlRXJyb3IoSyk7aWYoaFtwXT09PWspe2xldCB2PW51bGw7dHJ5eyh0eXBlb2Ygbz09Im9iamVjdCJ8fHR5cGVvZiBvPT0iZnVuY3Rpb24iKSYmKHY9byYmby50aGVuKX1jYXRjaChDKXtyZXR1cm4gdSgoKT0+e0koaCwhMSxDKX0pKCksaH1pZihsIT09UyYmbyBpbnN0YW5jZW9mIE0mJm8uaGFzT3duUHJvcGVydHkocCkmJm8uaGFzT3duUHJvcGVydHkoZCkmJm9bcF0hPT1rKWkobyksSShoLG9bcF0sb1tkXSk7ZWxzZSBpZihsIT09UyYmdHlwZW9mIHY9PSJmdW5jdGlvbiIpdHJ5e3YuY2FsbChvLHUoYihoLGwpKSx1KGIoaCwhMSkpKX1jYXRjaChDKXt1KCgpPT57SShoLCExLEMpfSkoKX1lbHNle2hbcF09bDtsZXQgQz1oW2RdO2lmKGhbZF09byxoW0FdPT09QSYmbD09PVUmJihoW3BdPWhbWF0saFtkXT1oW1ZdKSxsPT09UyYmbyBpbnN0YW5jZW9mIEVycm9yKXtsZXQgbT1hLmN1cnJlbnRUYXNrJiZhLmN1cnJlbnRUYXNrLmRhdGEmJmEuY3VycmVudFRhc2suZGF0YVtMXTttJiZmKG8sVyx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsdmFsdWU6bX0pfWZvcihsZXQgbT0wO208Qy5sZW5ndGg7KXIoaCxDW20rK10sQ1ttKytdLENbbSsrXSxDW20rK10pO2lmKEMubGVuZ3RoPT0wJiZsPT1TKXtoW3BdPVI7bGV0IG09bzt0cnl7dGhyb3cgbmV3IEVycm9yKCJVbmNhdWdodCAoaW4gcHJvbWlzZSk6ICIrZyhvKSsobyYmby5zdGFjaz9gCmArby5zdGFjazoiIikpfWNhdGNoKE8pe209T313JiYobS50aHJvd09yaWdpbmFsPSEwKSxtLnJlamVjdGlvbj1vLG0ucHJvbWlzZT1oLG0uem9uZT1hLmN1cnJlbnQsbS50YXNrPWEuY3VycmVudFRhc2sseS5wdXNoKG0pLGUuc2NoZWR1bGVNaWNyb1Rhc2soKX19fXJldHVybiBofWxldCBzPVQoInJlamVjdGlvbkhhbmRsZWRIYW5kbGVyIik7ZnVuY3Rpb24gaShoKXtpZihoW3BdPT09Uil7dHJ5e2xldCBsPWFbc107bCYmdHlwZW9mIGw9PSJmdW5jdGlvbiImJmwuY2FsbCh0aGlzLHtyZWplY3Rpb246aFtkXSxwcm9taXNlOmh9KX1jYXRjaHt9aFtwXT1TO2ZvcihsZXQgbD0wO2w8eS5sZW5ndGg7bCsrKWg9PT15W2xdLnByb21pc2UmJnkuc3BsaWNlKGwsMSl9fWZ1bmN0aW9uIHIoaCxsLG8sdSx2KXtpKGgpO2xldCBDPWhbcF0sbT1DP3R5cGVvZiB1PT0iZnVuY3Rpb24iP3U6Sjp0eXBlb2Ygdj09ImZ1bmN0aW9uIj92OnE7bC5zY2hlZHVsZU1pY3JvVGFzayhGLCgpPT57dHJ5e2xldCBPPWhbZF0sTj0hIW8mJkE9PT1vW0FdO04mJihvW1ZdPU8sb1tYXT1DKTtsZXQgWj1sLnJ1bihtLHZvaWQgMCxOJiZtIT09cSYmbSE9PUo/W106W09dKTtJKG8sITAsWil9Y2F0Y2goTyl7SShvLCExLE8pfX0sbyl9bGV0IEU9ImZ1bmN0aW9uIFpvbmVBd2FyZVByb21pc2UoKSB7IFtuYXRpdmUgY29kZV0gfSIseD1mdW5jdGlvbigpe30sZWU9bi5BZ2dyZWdhdGVFcnJvcjtjbGFzcyBNe3N0YXRpYyB0b1N0cmluZygpe3JldHVybiBFfXN0YXRpYyByZXNvbHZlKGwpe3JldHVybiBsIGluc3RhbmNlb2YgTT9sOkkobmV3IHRoaXMobnVsbCksVSxsKX1zdGF0aWMgcmVqZWN0KGwpe3JldHVybiBJKG5ldyB0aGlzKG51bGwpLFMsbCl9c3RhdGljIHdpdGhSZXNvbHZlcnMoKXtsZXQgbD17fTtyZXR1cm4gbC5wcm9taXNlPW5ldyBNKChvLHUpPT57bC5yZXNvbHZlPW8sbC5yZWplY3Q9dX0pLGx9c3RhdGljIGFueShsKXtpZighbHx8dHlwZW9mIGxbU3ltYm9sLml0ZXJhdG9yXSE9ImZ1bmN0aW9uIilyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGVlKFtdLCJBbGwgcHJvbWlzZXMgd2VyZSByZWplY3RlZCIpKTtsZXQgbz1bXSx1PTA7dHJ5e2ZvcihsZXQgbSBvZiBsKXUrKyxvLnB1c2goTS5yZXNvbHZlKG0pKX1jYXRjaHtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGVlKFtdLCJBbGwgcHJvbWlzZXMgd2VyZSByZWplY3RlZCIpKX1pZih1PT09MClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGVlKFtdLCJBbGwgcHJvbWlzZXMgd2VyZSByZWplY3RlZCIpKTtsZXQgdj0hMSxDPVtdO3JldHVybiBuZXcgTSgobSxPKT0+e2ZvcihsZXQgTj0wO048by5sZW5ndGg7TisrKW9bTl0udGhlbihaPT57dnx8KHY9ITAsbShaKSl9LFo9PntDLnB1c2goWiksdS0tLHU9PT0wJiYodj0hMCxPKG5ldyBlZShDLCJBbGwgcHJvbWlzZXMgd2VyZSByZWplY3RlZCIpKSl9KX0pfXN0YXRpYyByYWNlKGwpe2xldCBvLHUsdj1uZXcgdGhpcygoTyxOKT0+e289Tyx1PU59KTtmdW5jdGlvbiBDKE8pe28oTyl9ZnVuY3Rpb24gbShPKXt1KE8pfWZvcihsZXQgTyBvZiBsKSQoTyl8fChPPXRoaXMucmVzb2x2ZShPKSksTy50aGVuKEMsbSk7cmV0dXJuIHZ9c3RhdGljIGFsbChsKXtyZXR1cm4gTS5hbGxXaXRoQ2FsbGJhY2sobCl9c3RhdGljIGFsbFNldHRsZWQobCl7cmV0dXJuKHRoaXMmJnRoaXMucHJvdG90eXBlIGluc3RhbmNlb2YgTT90aGlzOk0pLmFsbFdpdGhDYWxsYmFjayhsLHt0aGVuQ2FsbGJhY2s6dT0+KHtzdGF0dXM6ImZ1bGZpbGxlZCIsdmFsdWU6dX0pLGVycm9yQ2FsbGJhY2s6dT0+KHtzdGF0dXM6InJlamVjdGVkIixyZWFzb246dX0pfSl9c3RhdGljIGFsbFdpdGhDYWxsYmFjayhsLG8pe2xldCB1LHYsQz1uZXcgdGhpcygoWixHKT0+e3U9Wix2PUd9KSxtPTIsTz0wLE49W107Zm9yKGxldCBaIG9mIGwpeyQoWil8fChaPXRoaXMucmVzb2x2ZShaKSk7bGV0IEc9Tzt0cnl7Wi50aGVuKEI9PntOW0ddPW8/by50aGVuQ2FsbGJhY2soQik6QixtLS0sbT09PTAmJnUoTil9LEI9PntvPyhOW0ddPW8uZXJyb3JDYWxsYmFjayhCKSxtLS0sbT09PTAmJnUoTikpOnYoQil9KX1jYXRjaChCKXt2KEIpfW0rKyxPKyt9cmV0dXJuIG0tPTIsbT09PTAmJnUoTiksQ31jb25zdHJ1Y3RvcihsKXtsZXQgbz10aGlzO2lmKCEobyBpbnN0YW5jZW9mIE0pKXRocm93IG5ldyBFcnJvcigiTXVzdCBiZSBhbiBpbnN0YW5jZW9mIFByb21pc2UuIik7b1twXT1rLG9bZF09W107dHJ5e2xldCB1PUQoKTtsJiZsKHUoYihvLFUpKSx1KGIobyxTKSkpfWNhdGNoKHUpe0kobywhMSx1KX19Z2V0W1N5bWJvbC50b1N0cmluZ1RhZ10oKXtyZXR1cm4iUHJvbWlzZSJ9Z2V0W1N5bWJvbC5zcGVjaWVzXSgpe3JldHVybiBNfXRoZW4obCxvKXtsZXQgdT10aGlzLmNvbnN0cnVjdG9yPy5bU3ltYm9sLnNwZWNpZXNdOyghdXx8dHlwZW9mIHUhPSJmdW5jdGlvbiIpJiYodT10aGlzLmNvbnN0cnVjdG9yfHxNKTtsZXQgdj1uZXcgdSh4KSxDPWEuY3VycmVudDtyZXR1cm4gdGhpc1twXT09az90aGlzW2RdLnB1c2goQyx2LGwsbyk6cih0aGlzLEMsdixsLG8pLHZ9Y2F0Y2gobCl7cmV0dXJuIHRoaXMudGhlbihudWxsLGwpfWZpbmFsbHkobCl7bGV0IG89dGhpcy5jb25zdHJ1Y3Rvcj8uW1N5bWJvbC5zcGVjaWVzXTsoIW98fHR5cGVvZiBvIT0iZnVuY3Rpb24iKSYmKG89TSk7bGV0IHU9bmV3IG8oeCk7dVtBXT1BO2xldCB2PWEuY3VycmVudDtyZXR1cm4gdGhpc1twXT09az90aGlzW2RdLnB1c2godix1LGwsbCk6cih0aGlzLHYsdSxsLGwpLHV9fU0ucmVzb2x2ZT1NLnJlc29sdmUsTS5yZWplY3Q9TS5yZWplY3QsTS5yYWNlPU0ucmFjZSxNLmFsbD1NLmFsbDtsZXQgaGU9bltfXT1uLlByb21pc2U7bi5Qcm9taXNlPU07bGV0IF9lPVQoInRoZW5QYXRjaGVkIik7ZnVuY3Rpb24gUShoKXtsZXQgbD1oLnByb3RvdHlwZSxvPWMobCwidGhlbiIpO2lmKG8mJihvLndyaXRhYmxlPT09ITF8fCFvLmNvbmZpZ3VyYWJsZSkpcmV0dXJuO2xldCB1PWwudGhlbjtsW1BdPXUsaC5wcm90b3R5cGUudGhlbj1mdW5jdGlvbih2LEMpe3JldHVybiBuZXcgTSgoTyxOKT0+e3UuY2FsbCh0aGlzLE8sTil9KS50aGVuKHYsQyl9LGhbX2VdPSEwfWUucGF0Y2hUaGVuPVE7ZnVuY3Rpb24gVGUoaCl7cmV0dXJuIGZ1bmN0aW9uKGwsbyl7bGV0IHU9aC5hcHBseShsLG8pO2lmKHUgaW5zdGFuY2VvZiBNKXJldHVybiB1O2xldCB2PXUuY29uc3RydWN0b3I7cmV0dXJuIHZbX2VdfHxRKHYpLHV9fXJldHVybiBoZSYmKFEoaGUpLHVlKG4sImZldGNoIixoPT5UZShoKSkpLFByb21pc2VbYS5fX3N5bWJvbF9fKCJ1bmNhdWdodFByb21pc2VFcnJvcnMiKV09eSxNfSl9ZnVuY3Rpb24gTnQodCl7dC5fX2xvYWRfcGF0Y2goInRvU3RyaW5nIixuPT57bGV0IGE9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLGU9aigiT3JpZ2luYWxEZWxlZ2F0ZSIpLGM9aigiUHJvbWlzZSIpLGY9aigiRXJyb3IiKSxnPWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXM9PSJmdW5jdGlvbiIpe2xldCBfPXRoaXNbZV07aWYoXylyZXR1cm4gdHlwZW9mIF89PSJmdW5jdGlvbiI/YS5jYWxsKF8pOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChfKTtpZih0aGlzPT09UHJvbWlzZSl7bGV0IFA9bltjXTtpZihQKXJldHVybiBhLmNhbGwoUCl9aWYodGhpcz09PUVycm9yKXtsZXQgUD1uW2ZdO2lmKFApcmV0dXJuIGEuY2FsbChQKX19cmV0dXJuIGEuY2FsbCh0aGlzKX07Z1tlXT1hLEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZz1nO2xldCBUPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcseT0iW29iamVjdCBQcm9taXNlXSI7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIiYmdGhpcyBpbnN0YW5jZW9mIFByb21pc2U/eTpULmNhbGwodGhpcyl9fSl9ZnVuY3Rpb24gWnQodCxuLGEsZSxjKXtsZXQgZj1ab25lLl9fc3ltYm9sX18oZSk7aWYobltmXSlyZXR1cm47bGV0IGc9bltmXT1uW2VdO25bZV09ZnVuY3Rpb24oVCx5LHcpe3JldHVybiB5JiZ5LnByb3RvdHlwZSYmYy5mb3JFYWNoKGZ1bmN0aW9uKF8pe2xldCBQPWAke2F9LiR7ZX06OmArXyxMPXkucHJvdG90eXBlO3RyeXtpZihMLmhhc093blByb3BlcnR5KF8pKXtsZXQgSD10Lk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihMLF8pO0gmJkgudmFsdWU/KEgudmFsdWU9dC53cmFwV2l0aEN1cnJlbnRab25lKEgudmFsdWUsUCksdC5fcmVkZWZpbmVQcm9wZXJ0eSh5LnByb3RvdHlwZSxfLEgpKTpMW19dJiYoTFtfXT10LndyYXBXaXRoQ3VycmVudFpvbmUoTFtfXSxQKSl9ZWxzZSBMW19dJiYoTFtfXT10LndyYXBXaXRoQ3VycmVudFpvbmUoTFtfXSxQKSl9Y2F0Y2h7fX0pLGcuY2FsbChuLFQseSx3KX0sdC5hdHRhY2hPcmlnaW5Ub1BhdGNoZWQobltlXSxnKX1mdW5jdGlvbiBMdCh0KXt0Ll9fbG9hZF9wYXRjaCgidXRpbCIsKG4sYSxlKT0+e2xldCBjPUllKG4pO2UucGF0Y2hPblByb3BlcnRpZXM9cnQsZS5wYXRjaE1ldGhvZD11ZSxlLmJpbmRBcmd1bWVudHM9RmUsZS5wYXRjaE1hY3JvVGFzaz1tdDtsZXQgZj1hLl9fc3ltYm9sX18oIkJMQUNLX0xJU1RFRF9FVkVOVFMiKSxnPWEuX19zeW1ib2xfXygiVU5QQVRDSEVEX0VWRU5UUyIpO25bZ10mJihuW2ZdPW5bZ10pLG5bZl0mJihhW2ZdPWFbZ109bltmXSksZS5wYXRjaEV2ZW50UHJvdG90eXBlPWJ0LGUucGF0Y2hFdmVudFRhcmdldD12dCxlLmlzSUVPckVkZ2U9eXQsZS5PYmplY3REZWZpbmVQcm9wZXJ0eT1NZSxlLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcj1wZSxlLk9iamVjdENyZWF0ZT1fdCxlLkFycmF5U2xpY2U9VHQsZS5wYXRjaENsYXNzPXllLGUud3JhcFdpdGhDdXJyZW50Wm9uZT1WZSxlLmZpbHRlclByb3BlcnRpZXM9bHQsZS5hdHRhY2hPcmlnaW5Ub1BhdGNoZWQ9ZmUsZS5fcmVkZWZpbmVQcm9wZXJ0eT1PYmplY3QuZGVmaW5lUHJvcGVydHksZS5wYXRjaENhbGxiYWNrcz1adCxlLmdldEdsb2JhbE9iamVjdHM9KCk9Pih7Z2xvYmFsU291cmNlczpvdCx6b25lU3ltYm9sRXZlbnROYW1lczpuZSxldmVudE5hbWVzOmMsaXNCcm93c2VyOkdlLGlzTWl4Om50LGlzTm9kZTpEZSxUUlVFX1NUUjphZSxGQUxTRV9TVFI6bGUsWk9ORV9TWU1CT0xfUFJFRklYOnZlLEFERF9FVkVOVF9MSVNURU5FUl9TVFI6amUsUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUjpIZX0pfSl9ZnVuY3Rpb24gSXQodCl7T3QodCksTnQodCksTHQodCl9dmFyIHV0PWR0KCk7SXQodXQpO1N0KHV0KTsK","response_hash":"f5ae625cce9757855fda061bd8a201edf8044bf376418e295820cf64753ccdba","response_time_ms":0,"response_words":862,"has_response":true,"parameters":[{"name":"1","value":"polyfills.js","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":17}],"sent_at":"2026-04-05T05:33:08.386871Z","received_at":"2026-04-05T05:33:08.386871Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"0e17e596-1d78-4715-b666-c404a9ab1a04","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/chunk-I2PSG472.js","url":"http://localhost:3000/chunk-I2PSG472.js","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9jaHVuay1JMlBTRzQ3Mi5qcyBIVFRQLzEuMQ0KSG9zdDogbG9jYWxob3N0OjMwMDANCg0K","request_hash":"4a6a5c97ec075792ecb8ba9cb9896b9194b74ac3147553767a57c1aebabc0b8b","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["application/javascript; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Etag":["W/\"2bdc-19cc8900a68\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sat, 07 Mar 2026 13:50:09 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"application/javascript; charset=UTF-8","response_content_length":11228,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpDYWNoZS1Db250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MA0KRGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMjozMiBHTVQNCkV0YWc6IFcvIjJiZGMtMTljYzg5MDBhNjgiDQpGZWF0dXJlLVBvbGljeTogcGF5bWVudCAnc2VsZicNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KWC1SZWNydWl0aW5nOiAvIy9qb2JzDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9VVRGLTgNCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KTGFzdC1Nb2RpZmllZDogU2F0LCAwNyBNYXIgMjAyNiAxMzo1MDowOSBHTVQNClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNClgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTg0KQWNjZXB0LVJhbmdlczogYnl0ZXMNCkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKg0KDQppbXBvcnR7QWMgYXMgTCxCIGFzIFIsQmEgYXMgaWUsRCBhcyBaLERhIGFzIEUsR2EgYXMgbmUsSGMgYXMgUCxJYyBhcyBjZSxKYyBhcyBULEthIGFzIHNlLE1jIGFzIGosVyBhcyBELFogYXMgUyxaYiBhcyBsZSxfIGFzIERlLGNhIGFzIEIsZGEgYXMgJCxkYiBhcyByZSxlYiBhcyBfLGVkIGFzIGRlLGZhIGFzIGVlLGcgYXMgWSxnYiBhcyBvZSxnZCBhcyBTZSxoYSBhcyBoLGogYXMgQSxrIGFzIEYsa2MgYXMgYWUsbSBhcyBwLHAgYXMgWCxxIGFzIEgscWEgYXMgdGUscmQgYXMgZ2Usc2QgYXMgQmUsdmEgYXMgeCx3IGFzIFEsd2MgYXMgaGUsemMgYXMgdWV9ZnJvbSIuL2NodW5rLUJCUUpaTjdILmpzIjtpbXBvcnR7ZSBhcyBLLGogYXMgYX1mcm9tIi4vY2h1bmstVFdaVzVCNDUuanMiO2Z1bmN0aW9uIENlKCl7aWYoIWspdHJ5e2s9d2luZG93Py50cnVzdGVkVHlwZXM/LmNyZWF0ZVBvbGljeSgibmd4LWhpZ2hsaWdodGpzIix7Y3JlYXRlSFRNTDpuPT5ufSl9Y2F0Y2h7fXJldHVybiBrfWZ1bmN0aW9uIGtlKG4pe3JldHVybiBDZSgpPy5jcmVhdGVIVE1MKG4pfHxufXZhciBPLHksUGUsQyxHLGssdixYZSxRZSxmZT1LKCgpPT57aigpO2ooKTtCZSgpO1NlKCk7RGUoKTtPPW5ldyBlZSgiSElHSExJR0hUX09QVElPTlMiKSx5PShmdW5jdGlvbihuKXtyZXR1cm4gbi5GVUxMX1dJVEhfQ09SRV9MSUJSQVJZX0lNUE9SVFM9IlRoZSBmdWxsIGxpYnJhcnkgYW5kIHRoZSBjb3JlIGxpYnJhcnkgd2VyZSBpbXBvcnRlZCwgb25seSBvbmUgb2YgdGhlbSBzaG91bGQgYmUgaW1wb3J0ZWQhIixuLkZVTExfV0lUSF9MQU5HVUFHRV9JTVBPUlRTPSJUaGUgaGlnaGxpZ2h0aW5nIGxhbmd1YWdlcyB3ZXJlIGltcG9ydGVkIHRoZXkgYXJlIG5vdCBuZWVkZWQhIixuLkNPUkVfV0lUSE9VVF9MQU5HVUFHRV9JTVBPUlRTPSJUaGUgaGlnaGxpZ2h0aW5nIGxhbmd1YWdlcyB3ZXJlIG5vdCBpbXBvcnRlZCEiLG4uTEFOR1VBR0VfV0lUSE9VVF9DT1JFX0lNUE9SVFM9IlRoZSBjb3JlIGxpYnJhcnkgd2FzIG5vdCBpbXBvcnRlZCEiLG4uTk9fRlVMTF9BTkRfTk9fQ09SRV9JTVBPUlRTPSJIaWdobGlnaHQuanMgbGlicmFyeSB3YXMgbm90IGltcG9ydGVkISIsbn0pKHl8fHt9KSxQZT0oKCk9PntjbGFzcyBue2NvbnN0cnVjdG9yKCl7dGhpcy5kb2N1bWVudD1oKHRlKSx0aGlzLmlzUGxhdGZvcm1Ccm93c2VyPWRlKGgobmUpKSx0aGlzLm9wdGlvbnM9aChPLHtvcHRpb25hbDohMH0pLHRoaXMuX3JlYWR5PW5ldyBZKG51bGwpLHRoaXMucmVhZHk9WCh0aGlzLl9yZWFkeS5hc09ic2VydmFibGUoKS5waXBlKFIoZT0+ISFlKSkpLHRoaXMuaXNQbGF0Zm9ybUJyb3dzZXImJih0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmhsanM/dGhpcy5fcmVhZHkubmV4dCh0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmhsanMpOnRoaXMuX2xvYWRMaWJyYXJ5KCkucGlwZShEKGU9PnRoaXMub3B0aW9ucz8ubGluZU51bWJlcnNMb2FkZXI/KHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuaGxqcz1lLHRoaXMubG9hZExpbmVOdW1iZXJzKCkucGlwZShTKHI9PntyLmFjdGl2YXRlTGluZU51bWJlcnMoKSx0aGlzLl9yZWFkeS5uZXh0KGUpfSkpKToodGhpcy5fcmVhZHkubmV4dChlKSxBKSksWihlPT4oY29uc29sZS5lcnJvcigiW0hMSlNdICIsZSksdGhpcy5fcmVhZHkuZXJyb3IoZSksQSkpKS5zdWJzY3JpYmUoKSx0aGlzLm9wdGlvbnM/LnRoZW1lUGF0aCYmdGhpcy5sb2FkVGhlbWUodGhpcy5vcHRpb25zLnRoZW1lUGF0aCkpfV9sb2FkTGlicmFyeSgpe2lmKHRoaXMub3B0aW9ucyl7aWYodGhpcy5vcHRpb25zLmZ1bGxMaWJyYXJ5TG9hZGVyJiZ0aGlzLm9wdGlvbnMuY29yZUxpYnJhcnlMb2FkZXIpcmV0dXJuIHAoKCk9PnkuRlVMTF9XSVRIX0NPUkVfTElCUkFSWV9JTVBPUlRTKTtpZih0aGlzLm9wdGlvbnMuZnVsbExpYnJhcnlMb2FkZXImJnRoaXMub3B0aW9ucy5sYW5ndWFnZXMpcmV0dXJuIHAoKCk9PnkuRlVMTF9XSVRIX0xBTkdVQUdFX0lNUE9SVFMpO2lmKHRoaXMub3B0aW9ucy5jb3JlTGlicmFyeUxvYWRlciYmIXRoaXMub3B0aW9ucy5sYW5ndWFnZXMpcmV0dXJuIHAoKCk9PnkuQ09SRV9XSVRIT1VUX0xBTkdVQUdFX0lNUE9SVFMpO2lmKCF0aGlzLm9wdGlvbnMuY29yZUxpYnJhcnlMb2FkZXImJnRoaXMub3B0aW9ucy5sYW5ndWFnZXMpcmV0dXJuIHAoKCk9PnkuTEFOR1VBR0VfV0lUSE9VVF9DT1JFX0lNUE9SVFMpO2lmKHRoaXMub3B0aW9ucy5mdWxsTGlicmFyeUxvYWRlcilyZXR1cm4gdGhpcy5sb2FkRnVsbExpYnJhcnkoKTtpZih0aGlzLm9wdGlvbnMuY29yZUxpYnJhcnlMb2FkZXImJnRoaXMub3B0aW9ucy5sYW5ndWFnZXMmJk9iamVjdC5rZXlzKHRoaXMub3B0aW9ucy5sYW5ndWFnZXMpLmxlbmd0aClyZXR1cm4gdGhpcy5sb2FkQ29yZUxpYnJhcnkoKS5waXBlKEQoZT0+dGhpcy5fbG9hZExhbmd1YWdlcyhlKSkpfXJldHVybiBwKCgpPT55Lk5PX0ZVTExfQU5EX05PX0NPUkVfSU1QT1JUUyl9X2xvYWRMYW5ndWFnZXMoZSl7bGV0IHI9T2JqZWN0LmVudHJpZXModGhpcy5vcHRpb25zLmxhbmd1YWdlcykubWFwKChbdSxNXSk9PkMoTSgpKS5waXBlKFMoYj0+ZS5yZWdpc3Rlckxhbmd1YWdlKHUsYikpKSk7cmV0dXJuIFEocikucGlwZShIKCgpPT5lKSl9bG9hZENvcmVMaWJyYXJ5KCl7cmV0dXJuIEModGhpcy5vcHRpb25zLmNvcmVMaWJyYXJ5TG9hZGVyKCkpfWxvYWRGdWxsTGlicmFyeSgpe3JldHVybiBDKHRoaXMub3B0aW9ucy5mdWxsTGlicmFyeUxvYWRlcigpKX1sb2FkTGluZU51bWJlcnMoKXtyZXR1cm4gRih0aGlzLm9wdGlvbnMubGluZU51bWJlcnNMb2FkZXIoKSl9c2V0VGhlbWUoZSl7dGhpcy5pc1BsYXRmb3JtQnJvd3NlciYmKHRoaXMuX3RoZW1lTGlua0VsZW1lbnQ/dGhpcy5fdGhlbWVMaW5rRWxlbWVudC5ocmVmPWU6dGhpcy5sb2FkVGhlbWUoZSkpfWxvYWRUaGVtZShlKXt0aGlzLl90aGVtZUxpbmtFbGVtZW50PXRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpLHRoaXMuX3RoZW1lTGlua0VsZW1lbnQuaHJlZj1lLHRoaXMuX3RoZW1lTGlua0VsZW1lbnQudHlwZT0idGV4dC9jc3MiLHRoaXMuX3RoZW1lTGlua0VsZW1lbnQucmVsPSJzdHlsZXNoZWV0Iix0aGlzLl90aGVtZUxpbmtFbGVtZW50Lm1lZGlhPSJzY3JlZW4scHJpbnQiLHRoaXMuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzLl90aGVtZUxpbmtFbGVtZW50KX1zdGF0aWN7dGhpcy5cdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxuKX19c3RhdGlje3RoaXMuXHUwMjc1cHJvdj1CKHt0b2tlbjpuLGZhY3Rvcnk6bi5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX19cmV0dXJuIG59KSgpLEM9bj0+RihuKS5waXBlKFIoYz0+ISFjPy5kZWZhdWx0KSxIKGM9PmMuZGVmYXVsdCkpLEc9KCgpPT57Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMubG9hZGVyPWgoUGUpLHRoaXMub3B0aW9ucz1oKE8se29wdGlvbmFsOiEwfSksdGhpcy5obGpzU2lnbmFsPXgobnVsbCksdGhpcy5obGpzPWhlKCgpPT50aGlzLmhsanNTaWduYWwoKSksdGhpcy5sb2FkZXIucmVhZHkudGhlbihlPT57dGhpcy5obGpzU2lnbmFsLnNldChlKSx0aGlzLm9wdGlvbnM/LmhpZ2hsaWdodE9wdGlvbnMmJmUuY29uZmlndXJlKHRoaXMub3B0aW9ucy5oaWdobGlnaHRPcHRpb25zKX0pfWhpZ2hsaWdodChlLHIpe3JldHVybiBhKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5sb2FkZXIucmVhZHkpLmhpZ2hsaWdodChlLHIpfSl9aGlnaGxpZ2h0QXV0byhlLHIpe3JldHVybiBhKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5sb2FkZXIucmVhZHkpLmhpZ2hsaWdodEF1dG8oZSxyKX0pfWhpZ2hsaWdodEVsZW1lbnQoZSl7cmV0dXJuIGEodGhpcyxudWxsLGZ1bmN0aW9uKigpeyh5aWVsZCB0aGlzLmxvYWRlci5yZWFkeSkuaGlnaGxpZ2h0RWxlbWVudChlKX0pfWhpZ2hsaWdodEFsbCgpe3JldHVybiBhKHRoaXMsbnVsbCxmdW5jdGlvbiooKXsoeWllbGQgdGhpcy5sb2FkZXIucmVhZHkpLmhpZ2hsaWdodEFsbCgpfSl9Y29uZmlndXJlKGUpe3JldHVybiBhKHRoaXMsbnVsbCxmdW5jdGlvbiooKXsoeWllbGQgdGhpcy5sb2FkZXIucmVhZHkpLmNvbmZpZ3VyZShlKX0pfXJlZ2lzdGVyTGFuZ3VhZ2UoZSxyKXtyZXR1cm4gYSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7KHlpZWxkIHRoaXMubG9hZGVyLnJlYWR5KS5yZWdpc3Rlckxhbmd1YWdlKGUscil9KX11bnJlZ2lzdGVyTGFuZ3VhZ2UoZSl7cmV0dXJuIGEodGhpcyxudWxsLGZ1bmN0aW9uKigpeyh5aWVsZCB0aGlzLmxvYWRlci5yZWFkeSkudW5yZWdpc3Rlckxhbmd1YWdlKGUpfSl9cmVnaXN0ZXJBbGlhc2VzKHUsTSl7cmV0dXJuIGEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKGUse2xhbmd1YWdlTmFtZTpyfSl7KHlpZWxkIHRoaXMubG9hZGVyLnJlYWR5KS5yZWdpc3RlckFsaWFzZXMoZSx7bGFuZ3VhZ2VOYW1lOnJ9KX0pfWxpc3RMYW5ndWFnZXMoKXtyZXR1cm4gYSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMubG9hZGVyLnJlYWR5KS5saXN0TGFuZ3VhZ2VzKCl9KX1nZXRMYW5ndWFnZShlKXtyZXR1cm4gYSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMubG9hZGVyLnJlYWR5KS5nZXRMYW5ndWFnZShlKX0pfXNhZmVNb2RlKCl7cmV0dXJuIGEodGhpcyxudWxsLGZ1bmN0aW9uKigpeyh5aWVsZCB0aGlzLmxvYWRlci5yZWFkeSkuc2FmZU1vZGUoKX0pfWRlYnVnTW9kZSgpe3JldHVybiBhKHRoaXMsbnVsbCxmdW5jdGlvbiooKXsoeWllbGQgdGhpcy5sb2FkZXIucmVhZHkpLmRlYnVnTW9kZSgpfSl9bGluZU51bWJlcnNCbG9jayhlLHIpe3JldHVybiBhKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtsZXQgdT15aWVsZCB0aGlzLmxvYWRlci5yZWFkeTt1LmxpbmVOdW1iZXJzQmxvY2smJnUubGluZU51bWJlcnNCbG9jayhlLHIpfSl9c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8bil9fXN0YXRpY3t0aGlzLlx1MDI3NXByb3Y9Qih7dG9rZW46bixmYWN0b3J5Om4uXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9fXJldHVybiBufSkoKTt2PSgoKT0+e2NsYXNzIG57Y29uc3RydWN0b3IoKXt0aGlzLl9obGpzPWgoRyksdGhpcy5fbmF0aXZlRWxlbWVudD1oKEUpLm5hdGl2ZUVsZW1lbnQsdGhpcy5fc2FuaXRpemVyPWgoZ2UpLFQoe3dyaXRlOigpPT57bGV0IGU9dGhpcy5jb2RlKCk7dGhpcy5zZXRUZXh0Q29udGVudChlfHwiIiksZSYmdGhpcy5oaWdobGlnaHRFbGVtZW50KGUpfX0pLFQoe3dyaXRlOigpPT57bGV0IGU9dGhpcy5oaWdobGlnaHRSZXN1bHQoKTt0aGlzLnNldElubmVySFRNTChlPy52YWx1ZSksdGhpcy5oaWdobGlnaHRlZC5lbWl0KGUpfX0pfXNldFRleHRDb250ZW50KGUpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy5fbmF0aXZlRWxlbWVudC50ZXh0Q29udGVudD1lKX1zZXRJbm5lckhUTUwoZSl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9uYXRpdmVFbGVtZW50LmlubmVySFRNTD1rZSh0aGlzLl9zYW5pdGl6ZXIuc2FuaXRpemUoc2UuSFRNTCxlKXx8IiIpKX1zdGF0aWN7dGhpcy5cdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxuKX19c3RhdGlje3RoaXMuXHUwMjc1ZGlyPV8oe3R5cGU6bn0pfX1yZXR1cm4gbn0pKCksWGU9KCgpPT57Y2xhc3MgbiBleHRlbmRzIHZ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT1MKG51bGwse2FsaWFzOiJoaWdobGlnaHRBdXRvIn0pLHRoaXMuaGlnaGxpZ2h0UmVzdWx0PXgobnVsbCksdGhpcy5sYW5ndWFnZXM9TCgpLHRoaXMuaGlnaGxpZ2h0ZWQ9dWUoKX1oaWdobGlnaHRFbGVtZW50KGUpe3JldHVybiBhKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtsZXQgcj15aWVsZCB0aGlzLl9obGpzLmhpZ2hsaWdodEF1dG8oZSx0aGlzLmxhbmd1YWdlcygpKTt0aGlzLmhpZ2hsaWdodFJlc3VsdC5zZXQocil9KX1zdGF0aWN7dGhpcy5cdTAyNzVmYWM9KCgpPT57bGV0IGU7cmV0dXJuIGZ1bmN0aW9uKHUpe3JldHVybihlfHwoZT1pZShuKSkpKHV8fG4pfX0pKCl9c3RhdGlje3RoaXMuXHUwMjc1ZGlyPV8oe3R5cGU6bixzZWxlY3RvcnM6W1siIiwiaGlnaGxpZ2h0QXV0byIsIiJdXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbihyLHUpe3ImMiYmbGUoImhsanMiLCEwKX0saW5wdXRzOntjb2RlOlsxLCJoaWdobGlnaHRBdXRvIiwiY29kZSJdLGxhbmd1YWdlczpbMSwibGFuZ3VhZ2VzIl19LG91dHB1dHM6e2hpZ2hsaWdodGVkOiJoaWdobGlnaHRlZCJ9LGZlYXR1cmVzOlthZShbe3Byb3ZpZGU6dix1c2VFeGlzdGluZzpufV0pLG9lXX0pfX1yZXR1cm4gbn0pKCksUWU9KCgpPT57Y2xhc3MgbntzdGF0aWN7dGhpcy5cdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxuKX19c3RhdGlje3RoaXMuXHUwMjc1bW9kPXJlKHt0eXBlOm59KX1zdGF0aWN7dGhpcy5cdTAyNzVpbmo9JCh7fSl9fXJldHVybiBufSkoKX0pO2Z1bmN0aW9uIG50KCl7bGV0IG49d2luZG93LGM9ZG9jdW1lbnQsZT0iaGxqcy1sbiIscj0iaGxqcy1sbi1saW5lIix1PSJobGpzLWxuLWNvZGUiLE09ImhsanMtbG4tbnVtYmVycyIsYj0iaGxqcy1sbi1uIix3PSJkYXRhLWxpbmUtbnVtYmVyIixVPS9cclxufFxyfFxuL2c7bi5obGpzPyhuLmhsanMuaW5pdExpbmVOdW1iZXJzT25Mb2FkPWJlLG4uaGxqcy5saW5lTnVtYmVyc0Jsb2NrPVcsbi5obGpzLmxpbmVOdW1iZXJzVmFsdWU9X2UseWUoKSk6bi5jb25zb2xlLmVycm9yKCJoaWdobGlnaHQuanMgbm90IGRldGVjdGVkISIpO2Z1bmN0aW9uIG1lKHQpe2xldCBpPXQ7Zm9yKDtpOyl7aWYoaS5jbGFzc05hbWUmJmkuY2xhc3NOYW1lLmluZGV4T2YoImhsanMtbG4tY29kZSIpIT09LTEpcmV0dXJuITA7aT1pLnBhcmVudE5vZGV9cmV0dXJuITF9ZnVuY3Rpb24gcGUodCl7bGV0IGk9dDtmb3IoO2kubm9kZU5hbWUhPT0iVEFCTEUiOylpPWkucGFyZW50Tm9kZTtyZXR1cm4gaX1mdW5jdGlvbiBMZSh0KXtsZXQgaT10LnRvU3RyaW5nKCkscz10LmFuY2hvck5vZGU7Zm9yKDtzLm5vZGVOYW1lIT09IlREIjspcz1zLnBhcmVudE5vZGU7bGV0IG89dC5mb2N1c05vZGU7Zm9yKDtvLm5vZGVOYW1lIT09IlREIjspbz1vLnBhcmVudE5vZGU7bGV0IGw9cGFyc2VJbnQocy5kYXRhc2V0LmxpbmVOdW1iZXIpLGQ9cGFyc2VJbnQoby5kYXRhc2V0LmxpbmVOdW1iZXIpO2lmKGwhPWQpe2xldCBmPXMudGV4dENvbnRlbnQsbT1vLnRleHRDb250ZW50O2lmKGw+ZCl7bGV0IGc9bDtsPWQsZD1nLGc9ZixmPW0sbT1nfWZvcig7aS5pbmRleE9mKGYpIT09MDspZj1mLnNsaWNlKDEpO2Zvcig7aS5sYXN0SW5kZXhPZihtKT09PS0xOyltPW0uc2xpY2UoMCwtMSk7bGV0IEk9ZixGZT1wZShzKTtmb3IobGV0IGc9bCsxO2c8ZDsrK2cpe2xldCBIZT1OKCcuezB9W3sxfT0iezJ9Il0nLFt1LHcsZ10pLFJlPUZlLnF1ZXJ5U2VsZWN0b3IoSGUpO0krPWAKYCtSZS50ZXh0Q29udGVudH1yZXR1cm4gSSs9YApgK20sSX1lbHNlIHJldHVybiBpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvcHkiLGZ1bmN0aW9uKHQpe2xldCBpPXdpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZihtZShpLmFuY2hvck5vZGUpKXtsZXQgczt3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIikhPT0tMT9zPUxlKGkpOnM9aS50b1N0cmluZygpLHQuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCJ0ZXh0L3BsYWluIixzKSx0LnByZXZlbnREZWZhdWx0KCl9fSk7ZnVuY3Rpb24geWUoKXtsZXQgdD1jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC50eXBlPSJ0ZXh0L2NzcyIsdC5pbm5lckhUTUw9TigiLnswfXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2V9LnswfSB0ZHtwYWRkaW5nOjB9LnsxfTpiZWZvcmV7Y29udGVudDphdHRyKHsyfSl9IixbZSxiLHddKSxjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQodCl9ZnVuY3Rpb24gYmUodCl7Yy5yZWFkeVN0YXRlPT09ImludGVyYWN0aXZlInx8Yy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIj9WKHQpOm4uYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXtWKHQpfSl9ZnVuY3Rpb24gVih0KXt0cnl7bGV0IGk9Yy5xdWVyeVNlbGVjdG9yQWxsKCJjb2RlLmhsanMsY29kZS5ub2hpZ2hsaWdodCIpO2ZvcihsZXQgcyBpbiBpKWkuaGFzT3duUHJvcGVydHkocykmJihOZShpW3NdKXx8VyhpW3NdLHQpKX1jYXRjaChpKXtuLmNvbnNvbGUuZXJyb3IoIkxpbmVOdW1iZXJzIGVycm9yOiAiLGkpfX1mdW5jdGlvbiBOZSh0KXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoIm5vaGxqc2xuIil9ZnVuY3Rpb24gVyh0LGkpe3R5cGVvZiB0PT0ib2JqZWN0IiYmd2UoZnVuY3Rpb24oKXt0LmlubmVySFRNTD1xKHQsaSl9KX1mdW5jdGlvbiBfZSh0LGkpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm47bGV0IHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY29kZSIpO3JldHVybiBzLmlubmVySFRNTD10LHEocyxpKX1mdW5jdGlvbiBxKHQsaSl7bGV0IHM9RWUodCxpKTtyZXR1cm4geih0KSxUZSh0LmlubmVySFRNTCxzKX1mdW5jdGlvbiBUZSh0LGkpe2xldCBzPUoodCk7aWYoc1tzLmxlbmd0aC0xXS50cmltKCk9PT0iIiYmcy5wb3AoKSxzLmxlbmd0aD4xfHxpLnNpbmdsZUxpbmUpe2xldCBvPSIiO2ZvcihsZXQgbD0wLGQ9cy5sZW5ndGg7bDxkO2wrKylvKz1OKCc8dHI+PHRkIGNsYXNzPSJ7MH0gezF9IiB7M309Ins1fSI+PGRpdiBjbGFzcz0iezJ9IiB7M309Ins1fSI+PC9kaXY+PC90ZD48dGQgY2xhc3M9InswfSB7NH0iIHszfT0iezV9Ij57Nn08L3RkPjwvdHI+JyxbcixNLGIsdyx1LGwraS5zdGFydEZyb20sc1tsXS5sZW5ndGg+MD9zW2xdOiIgIl0pO3JldHVybiBOKCc8dGFibGUgY2xhc3M9InswfSI+ezF9PC90YWJsZT4nLFtlLG9dKX1yZXR1cm4gdH1mdW5jdGlvbiBFZSh0LGkpe3JldHVybiBpPWl8fHt9LHtzaW5nbGVMaW5lOmplKGkpLHN0YXJ0RnJvbTp2ZSh0LGkpfX1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdC5zaW5nbGVMaW5lP3Quc2luZ2xlTGluZTohMX1mdW5jdGlvbiB2ZSh0LGkpe2xldCBvPTE7aXNGaW5pdGUoaS5zdGFydEZyb20pJiYobz1pLnN0YXJ0RnJvbSk7bGV0IGw9SWUodCwiZGF0YS1sbi1zdGFydC1mcm9tIik7cmV0dXJuIGwhPT1udWxsJiYobz1BZShsLDEpKSxvfWZ1bmN0aW9uIHoodCl7bGV0IGk9dC5jaGlsZE5vZGVzO2ZvcihsZXQgcyBpbiBpKWlmKGkuaGFzT3duUHJvcGVydHkocykpe2xldCBvPWlbc107TWUoby50ZXh0Q29udGVudCk+MCYmKG8uY2hpbGROb2Rlcy5sZW5ndGg+MD96KG8pOk9lKG8ucGFyZW50Tm9kZSkpfX1mdW5jdGlvbiBPZSh0KXtsZXQgaT10LmNsYXNzTmFtZTtpZighL2hsanMtLy50ZXN0KGkpKXJldHVybjtsZXQgcz1KKHQuaW5uZXJIVE1MKSxvPSIiO2ZvcihsZXQgbD0wO2w8cy5sZW5ndGg7bCsrKXtsZXQgZD1zW2xdLmxlbmd0aD4wP3NbbF06IiAiO28rPU4oYDxzcGFuIGNsYXNzPSJ7MH0iPnsxfTwvc3Bhbj4KYCxbaSxkXSl9dC5pbm5lckhUTUw9by50cmltKCl9ZnVuY3Rpb24gSih0KXtyZXR1cm4gdC5sZW5ndGg9PT0wP1tdOnQuc3BsaXQoVSl9ZnVuY3Rpb24gTWUodCl7cmV0dXJuKHQudHJpbSgpLm1hdGNoKFUpfHxbXSkubGVuZ3RofWZ1bmN0aW9uIHdlKHQpe24uc2V0VGltZW91dCh0LDApfWZ1bmN0aW9uIE4odCxpKXtyZXR1cm4gdC5yZXBsYWNlKC9ceyhcZCspXH0vZyxmdW5jdGlvbihzLG8pe3JldHVybiBpW29dIT09dm9pZCAwP2lbb106c30pfWZ1bmN0aW9uIEllKHQsaSl7cmV0dXJuIHQuaGFzQXR0cmlidXRlKGkpP3QuZ2V0QXR0cmlidXRlKGkpOm51bGx9ZnVuY3Rpb24gQWUodCxpKXtpZighdClyZXR1cm4gaTtsZXQgcz1OdW1iZXIodCk7cmV0dXJuIGlzRmluaXRlKHMpP3M6aX19dmFyIHN0LEdlPUsoKCk9PntqKCk7aigpO2ZlKCk7c3Q9KCgpPT57Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMub3B0aW9ucz1oKE8pPy5saW5lTnVtYmVyc09wdGlvbnMsdGhpcy5faGxqcz1oKEcpLHRoaXMuX2hpZ2hsaWdodD1oKHYpLHRoaXMuX25hdGl2ZUVsZW1lbnQ9aChFKS5uYXRpdmVFbGVtZW50LHRoaXMuc3RhcnRGcm9tPUwodGhpcy5vcHRpb25zPy5zdGFydEZyb20se3RyYW5zZm9ybTpjZX0pLHRoaXMuc2luZ2xlTGluZT1MKHRoaXMub3B0aW9ucz8uc2luZ2xlTGluZSx7dHJhbnNmb3JtOlB9KSxUKHt3cml0ZTooKT0+e3RoaXMuX2hpZ2hsaWdodC5oaWdobGlnaHRSZXN1bHQoKSYmdGhpcy5hZGRMaW5lTnVtYmVycygpfX0pfWFkZExpbmVOdW1iZXJzKCl7dGhpcy5kZXN0cm95TGluZU51bWJlcnNPYnNlcnZlcigpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+YSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5faGxqcy5saW5lTnVtYmVyc0Jsb2NrKHRoaXMuX25hdGl2ZUVsZW1lbnQse3N0YXJ0RnJvbTp0aGlzLnN0YXJ0RnJvbSgpLHNpbmdsZUxpbmU6dGhpcy5zaW5nbGVMaW5lKCl9KSx0aGlzLl9saW5lTnVtYmVyc09icz1uZXcgTXV0YXRpb25PYnNlcnZlcigoKT0+e3RoaXMuX25hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ/LnRhZ05hbWUudG9VcHBlckNhc2UoKT09PSJUQUJMRSImJnRoaXMuX25hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgiaGxqcy1saW5lLW51bWJlcnMiKSx0aGlzLmRlc3Ryb3lMaW5lTnVtYmVyc09ic2VydmVyKCl9KSx0aGlzLl9saW5lTnVtYmVyc09icy5vYnNlcnZlKHRoaXMuX25hdGl2ZUVsZW1lbnQse2NoaWxkTGlzdDohMH0pfSkpfWRlc3Ryb3lMaW5lTnVtYmVyc09ic2VydmVyKCl7dGhpcy5fbGluZU51bWJlcnNPYnMmJih0aGlzLl9saW5lTnVtYmVyc09icy5kaXNjb25uZWN0KCksdGhpcy5fbGluZU51bWJlcnNPYnM9bnVsbCl9c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8bil9fXN0YXRpY3t0aGlzLlx1MDI3NWRpcj1fKHt0eXBlOm4sc2VsZWN0b3JzOltbIiIsImhpZ2hsaWdodCIsIiIsImxpbmVOdW1iZXJzIiwiIl0sWyIiLCJoaWdobGlnaHRBdXRvIiwiIiwibGluZU51bWJlcnMiLCIiXV0saW5wdXRzOntzdGFydEZyb206WzEsInN0YXJ0RnJvbSJdLHNpbmdsZUxpbmU6WzEsInNpbmdsZUxpbmUiXX19KX19cmV0dXJuIG59KSgpfSk7ZXhwb3J0e08gYXMgYSxYZSBhcyBiLFFlIGFzIGMsZmUgYXMgZCxudCBhcyBlLHN0IGFzIGYsR2UgYXMgZ307Cg==","response_hash":"837d81a7dd737b65cee1a326afd85a4a912900eefb971f039db888e68ed859fa","response_time_ms":0,"response_words":349,"has_response":true,"parameters":[{"name":"1","value":"chunk-I2PSG472.js","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":22}],"sent_at":"2026-04-05T05:33:08.386892Z","received_at":"2026-04-05T05:33:08.386892Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"5a7b68e2-1fe8-4909-ac73-817edc712cc8","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/scripts.js","url":"http://localhost:3000/scripts.js","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9zY3JpcHRzLmpzIEhUVFAvMS4xDQpIb3N0OiBsb2NhbGhvc3Q6MzAwMA0KDQo=","request_hash":"cd898eb6eb028a32a5324ce96a3d61451851cd3a0a9513e977df89da092c3aed","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["application/javascript; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Etag":["W/\"50dc-19cc8900e50\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sat, 07 Mar 2026 13:50:10 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"application/javascript; charset=UTF-8","response_content_length":20700,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpDYWNoZS1Db250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MA0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KRGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMjozMiBHTVQNCkV0YWc6IFcvIjUwZGMtMTljYzg5MDBlNTAiDQpWYXJ5OiBBY2NlcHQtRW5jb2RpbmcNClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNClgtUmVjcnVpdGluZzogLyMvam9icw0KQWNjZXB0LVJhbmdlczogYnl0ZXMNCkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKg0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PVVURi04DQpGZWF0dXJlLVBvbGljeTogcGF5bWVudCAnc2VsZicNCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KTGFzdC1Nb2RpZmllZDogU2F0LCAwNyBNYXIgMjAyNiAxMzo1MDoxMCBHTVQNClgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTg0KDQooZnVuY3Rpb24oYyl7aWYoIWMuaGFzSW5pdGlhbGlzZWQpe3ZhciBhPXtlc2NhcGVSZWdFeHA6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCJcXCQmIil9LGhhc0NsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG89IiAiO3JldHVybiBlLm5vZGVUeXBlPT09MSYmKG8rZS5jbGFzc05hbWUrbykucmVwbGFjZSgvW1xuXHRdL2csbykuaW5kZXhPZihvK3Qrbyk+PTB9LGFkZENsYXNzOmZ1bmN0aW9uKGUsdCl7ZS5jbGFzc05hbWUrPSIgIit0fSxyZW1vdmVDbGFzczpmdW5jdGlvbihlLHQpe3ZhciBvPW5ldyBSZWdFeHAoIlxcYiIrdGhpcy5lc2NhcGVSZWdFeHAodCkrIlxcYiIpO2UuY2xhc3NOYW1lPWUuY2xhc3NOYW1lLnJlcGxhY2UobywiIil9LGludGVycG9sYXRlU3RyaW5nOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucmVwbGFjZSgve3soW2Etel1bYS16MC05XC1fXSopfX0vZ2ksZnVuY3Rpb24obyl7cmV0dXJuIHQoYXJndW1lbnRzWzFdKXx8IiJ9KX0sZ2V0Q29va2llOmZ1bmN0aW9uKGUpe3ZhciB0PSgiOyAiK2RvY3VtZW50LmNvb2tpZSkuc3BsaXQoIjsgIitlKyI9Iik7cmV0dXJuIHQubGVuZ3RoPDI/dm9pZCAwOnQucG9wKCkuc3BsaXQoIjsiKS5zaGlmdCgpfSxzZXRDb29raWU6ZnVuY3Rpb24oZSx0LG8sZCxmLG4pe3ZhciByPW5ldyBEYXRlO3Iuc2V0SG91cnMoci5nZXRIb3VycygpKzI0KihvfHwzNjUpKTt2YXIgdT1bZSsiPSIrdCwiZXhwaXJlcz0iK3IudG9VVENTdHJpbmcoKSwicGF0aD0iKyhmfHwiLyIpXTtkJiZ1LnB1c2goImRvbWFpbj0iK2QpLG4mJnUucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPXUuam9pbigiOyIpfSxkZWVwRXh0ZW5kOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBvIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShvKSYmKG8gaW4gZSYmdGhpcy5pc1BsYWluT2JqZWN0KGVbb10pJiZ0aGlzLmlzUGxhaW5PYmplY3QodFtvXSk/dGhpcy5kZWVwRXh0ZW5kKGVbb10sdFtvXSk6ZVtvXT10W29dKTtyZXR1cm4gZX0sdGhyb3R0bGU6ZnVuY3Rpb24oZSx0KXt2YXIgbz0hMTtyZXR1cm4gZnVuY3Rpb24oKXtvfHwoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbz0hMCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bz0hMX0sdCkpfX0saGFzaDpmdW5jdGlvbihlKXt2YXIgdCxvLGQ9MDtpZihlLmxlbmd0aD09PTApcmV0dXJuIGQ7Zm9yKHQ9MCxvPWUubGVuZ3RoO3Q8bzsrK3QpZD0oZDw8NSktZCtlLmNoYXJDb2RlQXQodCksZHw9MDtyZXR1cm4gZH0sbm9ybWFsaXNlSGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdPT0iIyImJihlPWUuc3Vic3RyKDEpKSxlLmxlbmd0aD09MyYmKGU9ZVswXStlWzBdK2VbMV0rZVsxXStlWzJdK2VbMl0pLGV9LGdldENvbnRyYXN0OmZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMubm9ybWFsaXNlSGV4KGUpLCgyOTkqcGFyc2VJbnQoZS5zdWJzdHIoMCwyKSwxNikrNTg3KnBhcnNlSW50KGUuc3Vic3RyKDIsMiksMTYpKzExNCpwYXJzZUludChlLnN1YnN0cig0LDIpLDE2KSkvMWUzPj0xMjg/IiMwMDAiOiIjZmZmIn0sZ2V0THVtaW5hbmNlOmZ1bmN0aW9uKGUpe3ZhciB0PXBhcnNlSW50KHRoaXMubm9ybWFsaXNlSGV4KGUpLDE2KSxvPTM4Kyh0Pj4xNiksZD0zOCsodD4+OCYyNTUpLGY9MzgrKDI1NSZ0KTtyZXR1cm4iIyIrKDE2Nzc3MjE2KzY1NTM2KihvPDI1NT9vPDE/MDpvOjI1NSkrMjU2KihkPDI1NT9kPDE/MDpkOjI1NSkrKGY8MjU1P2Y8MT8wOmY6MjU1KSkudG9TdHJpbmcoMTYpLnNsaWNlKDEpfSxpc01vYmlsZTpmdW5jdGlvbigpe3JldHVybi9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS5jb25zdHJ1Y3Rvcj09T2JqZWN0fSx0cmF2ZXJzZURPTVBhdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZS5wYXJlbnROb2RlP2EuaGFzQ2xhc3MoZSx0KT9lOnRoaXMudHJhdmVyc2VET01QYXRoKGUucGFyZW50Tm9kZSx0KTpudWxsfX07Yy5zdGF0dXM9e2Rlbnk6ImRlbnkiLGFsbG93OiJhbGxvdyIsZGlzbWlzczoiZGlzbWlzcyJ9LGMudHJhbnNpdGlvbkVuZD0oZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0PXt0OiJ0cmFuc2l0aW9uZW5kIixPVDoib1RyYW5zaXRpb25FbmQiLG1zVDoiTVNUcmFuc2l0aW9uRW5kIixNb3pUOiJ0cmFuc2l0aW9uZW5kIixXZWJraXRUOiJ3ZWJraXRUcmFuc2l0aW9uRW5kIn07Zm9yKHZhciBvIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShvKSYmZS5zdHlsZVtvKyJyYW5zaXRpb24iXSE9PXZvaWQgMClyZXR1cm4gdFtvXTtyZXR1cm4iIn0pKCksYy5oYXNUcmFuc2l0aW9uPSEhYy50cmFuc2l0aW9uRW5kO3ZhciBOPU9iamVjdC5rZXlzKGMuc3RhdHVzKS5tYXAoYS5lc2NhcGVSZWdFeHApO2MuY3VzdG9tU3R5bGVzPXt9LGMuUG9wdXA9KGZ1bmN0aW9uKCl7dmFyIGU9e2VuYWJsZWQ6ITAsY29udGFpbmVyOm51bGwsY29va2llOntuYW1lOiJjb29raWVjb25zZW50X3N0YXR1cyIscGF0aDoiLyIsZG9tYWluOiIiLGV4cGlyeURheXM6MzY1LHNlY3VyZTohMX0sb25Qb3B1cE9wZW46ZnVuY3Rpb24oKXt9LG9uUG9wdXBDbG9zZTpmdW5jdGlvbigpe30sb25Jbml0aWFsaXNlOmZ1bmN0aW9uKGkpe30sb25TdGF0dXNDaGFuZ2U6ZnVuY3Rpb24oaSxzKXt9LG9uUmV2b2tlQ2hvaWNlOmZ1bmN0aW9uKCl7fSxvbk5vQ29va2llTGF3OmZ1bmN0aW9uKGkscyl7fSxjb250ZW50OntoZWFkZXI6IkNvb2tpZXMgdXNlZCBvbiB0aGUgd2Vic2l0ZSEiLG1lc3NhZ2U6IlRoaXMgd2Vic2l0ZSB1c2VzIGNvb2tpZXMgdG8gZW5zdXJlIHlvdSBnZXQgdGhlIGJlc3QgZXhwZXJpZW5jZSBvbiBvdXIgd2Vic2l0ZS4iLGRpc21pc3M6IkdvdCBpdCEiLGFsbG93OiJBbGxvdyBjb29raWVzIixkZW55OiJEZWNsaW5lIixsaW5rOiJMZWFybiBtb3JlIixocmVmOiJodHRwczovL3d3dy5jb29raWVzYW5keW91LmNvbSIsY2xvc2U6IiYjeDI3NGM7Iix0YXJnZXQ6Il9ibGFuayIscG9saWN5OiJDb29raWUgUG9saWN5In0sZWxlbWVudHM6e2hlYWRlcjonPHNwYW4gY2xhc3M9ImNjLWhlYWRlciI+e3toZWFkZXJ9fTwvc3Bhbj4mbmJzcDsnLG1lc3NhZ2U6JzxzcGFuIGlkPSJjb29raWVjb25zZW50OmRlc2MiIGNsYXNzPSJjYy1tZXNzYWdlIj57e21lc3NhZ2V9fTwvc3Bhbj4nLG1lc3NhZ2VsaW5rOic8c3BhbiBpZD0iY29va2llY29uc2VudDpkZXNjIiBjbGFzcz0iY2MtbWVzc2FnZSI+e3ttZXNzYWdlfX0gPGEgYXJpYS1sYWJlbD0ibGVhcm4gbW9yZSBhYm91dCBjb29raWVzIiByb2xlPWJ1dHRvbiB0YWJpbmRleD0iMCIgY2xhc3M9ImNjLWxpbmsiIGhyZWY9Int7aHJlZn19IiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIgbm9mb2xsb3ciIHRhcmdldD0ie3t0YXJnZXR9fSI+e3tsaW5rfX08L2E+PC9zcGFuPicsZGlzbWlzczonPGEgYXJpYS1sYWJlbD0iZGlzbWlzcyBjb29raWUgbWVzc2FnZSIgcm9sZT1idXR0b24gdGFiaW5kZXg9IjAiIGNsYXNzPSJjYy1idG4gY2MtZGlzbWlzcyI+e3tkaXNtaXNzfX08L2E+JyxhbGxvdzonPGEgYXJpYS1sYWJlbD0iYWxsb3cgY29va2llcyIgcm9sZT1idXR0b24gdGFiaW5kZXg9IjAiICBjbGFzcz0iY2MtYnRuIGNjLWFsbG93Ij57e2FsbG93fX08L2E+JyxkZW55Oic8YSBhcmlhLWxhYmVsPSJkZW55IGNvb2tpZXMiIHJvbGU9YnV0dG9uIHRhYmluZGV4PSIwIiBjbGFzcz0iY2MtYnRuIGNjLWRlbnkiPnt7ZGVueX19PC9hPicsbGluazonPGEgYXJpYS1sYWJlbD0ibGVhcm4gbW9yZSBhYm91dCBjb29raWVzIiByb2xlPWJ1dHRvbiB0YWJpbmRleD0iMCIgY2xhc3M9ImNjLWxpbmsiIGhyZWY9Int7aHJlZn19IiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIgbm9mb2xsb3ciIHRhcmdldD0ie3t0YXJnZXR9fSI+e3tsaW5rfX08L2E+JyxjbG9zZTonPHNwYW4gYXJpYS1sYWJlbD0iZGlzbWlzcyBjb29raWUgbWVzc2FnZSIgcm9sZT1idXR0b24gdGFiaW5kZXg9IjAiIGNsYXNzPSJjYy1jbG9zZSI+e3tjbG9zZX19PC9zcGFuPid9LHdpbmRvdzonPGRpdiByb2xlPSJkaWFsb2ciIGFyaWEtbGl2ZT0icG9saXRlIiBhcmlhLWxhYmVsPSJjb29raWVjb25zZW50IiBhcmlhLWRlc2NyaWJlZGJ5PSJjb29raWVjb25zZW50OmRlc2MiIGNsYXNzPSJjYy13aW5kb3cge3tjbGFzc2VzfX0iPjwhLS1nb29nbGVvZmY6IGFsbC0tPnt7Y2hpbGRyZW59fTwhLS1nb29nbGVvbjogYWxsLS0+PC9kaXY+JyxyZXZva2VCdG46JzxkaXYgY2xhc3M9ImNjLXJldm9rZSB7e2NsYXNzZXN9fSI+e3twb2xpY3l9fTwvZGl2PicsY29tcGxpYW5jZTp7aW5mbzonPGRpdiBjbGFzcz0iY2MtY29tcGxpYW5jZSI+e3tkaXNtaXNzfX08L2Rpdj4nLCJvcHQtaW4iOic8ZGl2IGNsYXNzPSJjYy1jb21wbGlhbmNlIGNjLWhpZ2hsaWdodCI+e3tkZW55fX17e2FsbG93fX08L2Rpdj4nLCJvcHQtb3V0IjonPGRpdiBjbGFzcz0iY2MtY29tcGxpYW5jZSBjYy1oaWdobGlnaHQiPnt7ZGVueX19e3thbGxvd319PC9kaXY+J30sdHlwZToiaW5mbyIsbGF5b3V0czp7YmFzaWM6Int7bWVzc2FnZWxpbmt9fXt7Y29tcGxpYW5jZX19IiwiYmFzaWMtY2xvc2UiOiJ7e21lc3NhZ2VsaW5rfX17e2NvbXBsaWFuY2V9fXt7Y2xvc2V9fSIsImJhc2ljLWhlYWRlciI6Int7aGVhZGVyfX17e21lc3NhZ2V9fXt7bGlua319e3tjb21wbGlhbmNlfX0ifSxsYXlvdXQ6ImJhc2ljIixwb3NpdGlvbjoiYm90dG9tIix0aGVtZToiYmxvY2siLHN0YXRpYzohMSxwYWxldHRlOm51bGwscmV2b2thYmxlOiExLGFuaW1hdGVSZXZva2FibGU6ITAsc2hvd0xpbms6ITAsZGlzbWlzc09uU2Nyb2xsOiExLGRpc21pc3NPblRpbWVvdXQ6ITEsZGlzbWlzc09uV2luZG93Q2xpY2s6ITEsaWdub3JlQ2xpY2tzRnJvbTpbImNjLXJldm9rZSIsImNjLWJ0biJdLGF1dG9PcGVuOiEwLGF1dG9BdHRhY2g6ITAsd2hpdGVsaXN0UGFnZTpbXSxibGFja2xpc3RQYWdlOltdLG92ZXJyaWRlSFRNTDpudWxsfTtmdW5jdGlvbiB0KCl7dGhpcy5pbml0aWFsaXNlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBvKGkpe3RoaXMub3BlbmluZ1RpbWVvdXQ9bnVsbCxhLnJlbW92ZUNsYXNzKGksImNjLWludmlzaWJsZSIpfWZ1bmN0aW9uIGQoaSl7aS5zdHlsZS5kaXNwbGF5PSJub25lIixpLnJlbW92ZUV2ZW50TGlzdGVuZXIoYy50cmFuc2l0aW9uRW5kLHRoaXMuYWZ0ZXJUcmFuc2l0aW9uKSx0aGlzLmFmdGVyVHJhbnNpdGlvbj1udWxsfWZ1bmN0aW9uIGYoKXt2YXIgaT10aGlzLm9wdGlvbnMucG9zaXRpb24uc3BsaXQoIi0iKSxzPVtdO3JldHVybiBpLmZvckVhY2goZnVuY3Rpb24oaCl7cy5wdXNoKCJjYy0iK2gpfSksc31mdW5jdGlvbiBuKGkpe3ZhciBzPXRoaXMub3B0aW9ucyxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLG09cy5jb250YWluZXImJnMuY29udGFpbmVyLm5vZGVUeXBlPT09MT9zLmNvbnRhaW5lcjpkb2N1bWVudC5ib2R5O2guaW5uZXJIVE1MPWk7dmFyIGw9aC5jaGlsZHJlblswXTtyZXR1cm4gbC5zdHlsZS5kaXNwbGF5PSJub25lIixhLmhhc0NsYXNzKGwsImNjLXdpbmRvdyIpJiZjLmhhc1RyYW5zaXRpb24mJmEuYWRkQ2xhc3MobCwiY2MtaW52aXNpYmxlIiksdGhpcy5vbkJ1dHRvbkNsaWNrPWZ1bmN0aW9uKHApe3ZhciB2PWEudHJhdmVyc2VET01QYXRoKHAudGFyZ2V0LCJjYy1idG4iKXx8cC50YXJnZXQ7aWYoYS5oYXNDbGFzcyh2LCJjYy1idG4iKSl7dmFyIGI9di5jbGFzc05hbWUubWF0Y2gobmV3IFJlZ0V4cCgiXFxiY2MtKCIrTi5qb2luKCJ8IikrIilcXGIiKSksaz1iJiZiWzFdfHwhMTtrJiYodGhpcy5zZXRTdGF0dXMoayksdGhpcy5jbG9zZSghMCkpfWEuaGFzQ2xhc3ModiwiY2MtY2xvc2UiKSYmKHRoaXMuc2V0U3RhdHVzKGMuc3RhdHVzLmRpc21pc3MpLHRoaXMuY2xvc2UoITApKSxhLmhhc0NsYXNzKHYsImNjLXJldm9rZSIpJiZ0aGlzLnJldm9rZUNob2ljZSgpfS5iaW5kKHRoaXMpLGwuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub25CdXR0b25DbGljaykscy5hdXRvQXR0YWNoJiYobS5maXJzdENoaWxkP20uaW5zZXJ0QmVmb3JlKGwsbS5maXJzdENoaWxkKTptLmFwcGVuZENoaWxkKGwpKSxsfWZ1bmN0aW9uIHIoaSl7cmV0dXJuKGk9YS5ub3JtYWxpc2VIZXgoaSkpPT0iMDAwMDAwIj8iIzIyMiI6YS5nZXRMdW1pbmFuY2UoaSl9ZnVuY3Rpb24gdShpLHMpe2Zvcih2YXIgaD0wLG09aS5sZW5ndGg7aDxtOysraCl7dmFyIGw9aVtoXTtpZihsIGluc3RhbmNlb2YgUmVnRXhwJiZsLnRlc3Qocyl8fHR5cGVvZiBsPT0ic3RyaW5nIiYmbC5sZW5ndGgmJmw9PT1zKXJldHVybiEwfXJldHVybiExfXJldHVybiB0LnByb3RvdHlwZS5pbml0aWFsaXNlPWZ1bmN0aW9uKGkpe3RoaXMub3B0aW9ucyYmdGhpcy5kZXN0cm95KCksYS5kZWVwRXh0ZW5kKHRoaXMub3B0aW9ucz17fSxlKSxhLmlzUGxhaW5PYmplY3QoaSkmJmEuZGVlcEV4dGVuZCh0aGlzLm9wdGlvbnMsaSksZnVuY3Rpb24oKXt2YXIgbD10aGlzLm9wdGlvbnMub25Jbml0aWFsaXNlLmJpbmQodGhpcyk7aWYoIXdpbmRvdy5uYXZpZ2F0b3IuY29va2llRW5hYmxlZClyZXR1cm4gbChjLnN0YXR1cy5kZW55KSwhMDtpZih3aW5kb3cuQ29va2llc09LfHx3aW5kb3cubmF2aWdhdG9yLkNvb2tpZXNPSylyZXR1cm4gbChjLnN0YXR1cy5hbGxvdyksITA7dmFyIHA9T2JqZWN0LmtleXMoYy5zdGF0dXMpLHY9dGhpcy5nZXRTdGF0dXMoKSxiPXAuaW5kZXhPZih2KT49MDtyZXR1cm4gYiYmbCh2KSxifS5jYWxsKHRoaXMpJiYodGhpcy5vcHRpb25zLmVuYWJsZWQ9ITEpLHUodGhpcy5vcHRpb25zLmJsYWNrbGlzdFBhZ2UsbG9jYXRpb24ucGF0aG5hbWUpJiYodGhpcy5vcHRpb25zLmVuYWJsZWQ9ITEpLHUodGhpcy5vcHRpb25zLndoaXRlbGlzdFBhZ2UsbG9jYXRpb24ucGF0aG5hbWUpJiYodGhpcy5vcHRpb25zLmVuYWJsZWQ9ITApO3ZhciBzPXRoaXMub3B0aW9ucy53aW5kb3cucmVwbGFjZSgie3tjbGFzc2VzfX0iLGZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5vcHRpb25zLHA9bC5wb3NpdGlvbj09InRvcCJ8fGwucG9zaXRpb249PSJib3R0b20iPyJiYW5uZXIiOiJmbG9hdGluZyI7YS5pc01vYmlsZSgpJiYocD0iZmxvYXRpbmciKTt2YXIgdj1bImNjLSIrcCwiY2MtdHlwZS0iK2wudHlwZSwiY2MtdGhlbWUtIitsLnRoZW1lXTtyZXR1cm4gbC5zdGF0aWMmJnYucHVzaCgiY2Mtc3RhdGljIiksdi5wdXNoLmFwcGx5KHYsZi5jYWxsKHRoaXMpKSwoZnVuY3Rpb24oYil7dmFyIGs9YS5oYXNoKEpTT04uc3RyaW5naWZ5KGIpKSxPPSJjYy1jb2xvci1vdmVycmlkZS0iK2sseD1hLmlzUGxhaW5PYmplY3QoYik7cmV0dXJuIHRoaXMuY3VzdG9tU3R5bGVTZWxlY3Rvcj14P086bnVsbCx4JiYoZnVuY3Rpb24oRSxULHcpe2lmKGMuY3VzdG9tU3R5bGVzW0VdKXJldHVybiB2b2lkKytjLmN1c3RvbVN0eWxlc1tFXS5yZWZlcmVuY2VzO3ZhciBDPXt9LHk9VC5wb3B1cCxnPVQuYnV0dG9uLFM9VC5oaWdobGlnaHQ7eSYmKHkudGV4dD15LnRleHQ/eS50ZXh0OmEuZ2V0Q29udHJhc3QoeS5iYWNrZ3JvdW5kKSx5Lmxpbms9eS5saW5rP3kubGluazp5LnRleHQsQ1t3KyIuY2Mtd2luZG93Il09WyJjb2xvcjogIit5LnRleHQsImJhY2tncm91bmQtY29sb3I6ICIreS5iYWNrZ3JvdW5kXSxDW3crIi5jYy1yZXZva2UiXT1bImNvbG9yOiAiK3kudGV4dCwiYmFja2dyb3VuZC1jb2xvcjogIit5LmJhY2tncm91bmRdLENbdysiIC5jYy1saW5rLCIrdysiIC5jYy1saW5rOmFjdGl2ZSwiK3crIiAuY2MtbGluazp2aXNpdGVkIl09WyJjb2xvcjogIit5LmxpbmtdLGcmJihnLnRleHQ9Zy50ZXh0P2cudGV4dDphLmdldENvbnRyYXN0KGcuYmFja2dyb3VuZCksZy5ib3JkZXI9Zy5ib3JkZXI/Zy5ib3JkZXI6InRyYW5zcGFyZW50IixDW3crIiAuY2MtYnRuIl09WyJjb2xvcjogIitnLnRleHQsImJvcmRlci1jb2xvcjogIitnLmJvcmRlciwiYmFja2dyb3VuZC1jb2xvcjogIitnLmJhY2tncm91bmRdLGcucGFkZGluZyYmQ1t3KyIgLmNjLWJ0biJdLnB1c2goInBhZGRpbmc6ICIrZy5wYWRkaW5nKSxnLmJhY2tncm91bmQhPSJ0cmFuc3BhcmVudCImJihDW3crIiAuY2MtYnRuOmhvdmVyLCAiK3crIiAuY2MtYnRuOmZvY3VzIl09WyJiYWNrZ3JvdW5kLWNvbG9yOiAiKyhnLmhvdmVyfHxyKGcuYmFja2dyb3VuZCkpXSksUz8oUy50ZXh0PVMudGV4dD9TLnRleHQ6YS5nZXRDb250cmFzdChTLmJhY2tncm91bmQpLFMuYm9yZGVyPVMuYm9yZGVyP1MuYm9yZGVyOiJ0cmFuc3BhcmVudCIsQ1t3KyIgLmNjLWhpZ2hsaWdodCAuY2MtYnRuOmZpcnN0LWNoaWxkIl09WyJjb2xvcjogIitTLnRleHQsImJvcmRlci1jb2xvcjogIitTLmJvcmRlciwiYmFja2dyb3VuZC1jb2xvcjogIitTLmJhY2tncm91bmRdKTpDW3crIiAuY2MtaGlnaGxpZ2h0IC5jYy1idG46Zmlyc3QtY2hpbGQiXT1bImNvbG9yOiAiK3kudGV4dF0pKTt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoTCksYy5jdXN0b21TdHlsZXNbRV09e3JlZmVyZW5jZXM6MSxlbGVtZW50Okwuc2hlZXR9O3ZhciBSPS0xO2Zvcih2YXIgUCBpbiBDKUMuaGFzT3duUHJvcGVydHkoUCkmJkwuc2hlZXQuaW5zZXJ0UnVsZShQKyJ7IitDW1BdLmpvaW4oIjsiKSsifSIsKytSKX0pKGssYiwiLiIrTykseH0pLmNhbGwodGhpcyx0aGlzLm9wdGlvbnMucGFsZXR0ZSksdGhpcy5jdXN0b21TdHlsZVNlbGVjdG9yJiZ2LnB1c2godGhpcy5jdXN0b21TdHlsZVNlbGVjdG9yKSx2fS5jYWxsKHRoaXMpLmpvaW4oIiAiKSkucmVwbGFjZSgie3tjaGlsZHJlbn19IixmdW5jdGlvbigpe3ZhciBsPXt9LHA9dGhpcy5vcHRpb25zO3Auc2hvd0xpbmt8fChwLmVsZW1lbnRzLmxpbms9IiIscC5lbGVtZW50cy5tZXNzYWdlbGluaz1wLmVsZW1lbnRzLm1lc3NhZ2UpLE9iamVjdC5rZXlzKHAuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24oayl7bFtrXT1hLmludGVycG9sYXRlU3RyaW5nKHAuZWxlbWVudHNba10sZnVuY3Rpb24oTyl7dmFyIHg9cC5jb250ZW50W09dO3JldHVybiBPJiZ0eXBlb2YgeD09InN0cmluZyImJngubGVuZ3RoP3g6IiJ9KX0pO3ZhciB2PXAuY29tcGxpYW5jZVtwLnR5cGVdO3Z8fCh2PXAuY29tcGxpYW5jZS5pbmZvKSxsLmNvbXBsaWFuY2U9YS5pbnRlcnBvbGF0ZVN0cmluZyh2LGZ1bmN0aW9uKGspe3JldHVybiBsW2tdfSk7dmFyIGI9cC5sYXlvdXRzW3AubGF5b3V0XTtyZXR1cm4gYnx8KGI9cC5sYXlvdXRzLmJhc2ljKSxhLmludGVycG9sYXRlU3RyaW5nKGIsZnVuY3Rpb24oayl7cmV0dXJuIGxba119KX0uY2FsbCh0aGlzKSksaD10aGlzLm9wdGlvbnMub3ZlcnJpZGVIVE1MO2lmKHR5cGVvZiBoPT0ic3RyaW5nIiYmaC5sZW5ndGgmJihzPWgpLHRoaXMub3B0aW9ucy5zdGF0aWMpe3ZhciBtPW4uY2FsbCh0aGlzLCc8ZGl2IGNsYXNzPSJjYy1ncm93ZXIiPicrcysiPC9kaXY+Iik7bS5zdHlsZS5kaXNwbGF5PSIiLHRoaXMuZWxlbWVudD1tLmZpcnN0Q2hpbGQsdGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLGEuYWRkQ2xhc3ModGhpcy5lbGVtZW50LCJjYy1pbnZpc2libGUiKX1lbHNlIHRoaXMuZWxlbWVudD1uLmNhbGwodGhpcyxzKTsoZnVuY3Rpb24oKXt2YXIgbD10aGlzLnNldFN0YXR1cy5iaW5kKHRoaXMpLHA9dGhpcy5jbG9zZS5iaW5kKHRoaXMpLHY9dGhpcy5vcHRpb25zLmRpc21pc3NPblRpbWVvdXQ7dHlwZW9mIHY9PSJudW1iZXIiJiZ2Pj0wJiYodGhpcy5kaXNtaXNzVGltZW91dD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2woYy5zdGF0dXMuZGlzbWlzcykscCghMCl9LE1hdGguZmxvb3IodikpKTt2YXIgYj10aGlzLm9wdGlvbnMuZGlzbWlzc09uU2Nyb2xsO2lmKHR5cGVvZiBiPT0ibnVtYmVyIiYmYj49MCl7dmFyIGs9ZnVuY3Rpb24oVCl7d2luZG93LnBhZ2VZT2Zmc2V0Pk1hdGguZmxvb3IoYikmJihsKGMuc3RhdHVzLmRpc21pc3MpLHAoITApLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLGspLHRoaXMub25XaW5kb3dTY3JvbGw9bnVsbCl9O3RoaXMub3B0aW9ucy5lbmFibGVkJiYodGhpcy5vbldpbmRvd1Njcm9sbD1rLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGspKX12YXIgTz10aGlzLm9wdGlvbnMuZGlzbWlzc09uV2luZG93Q2xpY2sseD10aGlzLm9wdGlvbnMuaWdub3JlQ2xpY2tzRnJvbTtpZihPKXt2YXIgRT1mdW5jdGlvbihUKXtmb3IodmFyIHc9ITEsQz1ULnBhdGgubGVuZ3RoLHk9eC5sZW5ndGgsZz0wO2c8QztnKyspaWYoIXcpZm9yKHZhciBTPTA7Uzx5O1MrKyl3fHwodz1hLmhhc0NsYXNzKFQucGF0aFtnXSx4W1NdKSk7d3x8KGwoYy5zdGF0dXMuZGlzbWlzcykscCghMCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixFKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEUpLHRoaXMub25XaW5kb3dDbGljaz1udWxsKX0uYmluZCh0aGlzKTt0aGlzLm9wdGlvbnMuZW5hYmxlZCYmKHRoaXMub25XaW5kb3dDbGljaz1FLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsRSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixFKSl9fSkuY2FsbCh0aGlzKSxmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy50eXBlIT0iaW5mbyImJih0aGlzLm9wdGlvbnMucmV2b2thYmxlPSEwKSxhLmlzTW9iaWxlKCkmJih0aGlzLm9wdGlvbnMuYW5pbWF0ZVJldm9rYWJsZT0hMSksdGhpcy5vcHRpb25zLnJldm9rYWJsZSl7dmFyIGw9Zi5jYWxsKHRoaXMpO3RoaXMub3B0aW9ucy5hbmltYXRlUmV2b2thYmxlJiZsLnB1c2goImNjLWFuaW1hdGUiKSx0aGlzLmN1c3RvbVN0eWxlU2VsZWN0b3ImJmwucHVzaCh0aGlzLmN1c3RvbVN0eWxlU2VsZWN0b3IpO3ZhciBwPXRoaXMub3B0aW9ucy5yZXZva2VCdG4ucmVwbGFjZSgie3tjbGFzc2VzfX0iLGwuam9pbigiICIpKS5yZXBsYWNlKCJ7e3BvbGljeX19Iix0aGlzLm9wdGlvbnMuY29udGVudC5wb2xpY3kpO3RoaXMucmV2b2tlQnRuPW4uY2FsbCh0aGlzLHApO3ZhciB2PXRoaXMucmV2b2tlQnRuO2lmKHRoaXMub3B0aW9ucy5hbmltYXRlUmV2b2thYmxlKXt2YXIgYj1hLnRocm90dGxlKGZ1bmN0aW9uKGspe3ZhciBPPSExLHg9d2luZG93LmlubmVySGVpZ2h0LTIwO2EuaGFzQ2xhc3ModiwiY2MtdG9wIikmJmsuY2xpZW50WTwyMCYmKE89ITApLGEuaGFzQ2xhc3ModiwiY2MtYm90dG9tIikmJmsuY2xpZW50WT54JiYoTz0hMCksTz9hLmhhc0NsYXNzKHYsImNjLWFjdGl2ZSIpfHxhLmFkZENsYXNzKHYsImNjLWFjdGl2ZSIpOmEuaGFzQ2xhc3ModiwiY2MtYWN0aXZlIikmJmEucmVtb3ZlQ2xhc3ModiwiY2MtYWN0aXZlIil9LDIwMCk7dGhpcy5vbk1vdXNlTW92ZT1iLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLGIpfX19LmNhbGwodGhpcyksdGhpcy5vcHRpb25zLmF1dG9PcGVuJiZ0aGlzLmF1dG9PcGVuKCl9LHQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLm9uQnV0dG9uQ2xpY2smJnRoaXMuZWxlbWVudCYmKHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vbkJ1dHRvbkNsaWNrKSx0aGlzLm9uQnV0dG9uQ2xpY2s9bnVsbCksdGhpcy5kaXNtaXNzVGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLmRpc21pc3NUaW1lb3V0KSx0aGlzLmRpc21pc3NUaW1lb3V0PW51bGwpLHRoaXMub25XaW5kb3dTY3JvbGwmJih3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLm9uV2luZG93U2Nyb2xsKSx0aGlzLm9uV2luZG93U2Nyb2xsPW51bGwpLHRoaXMub25XaW5kb3dDbGljayYmKHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5vbldpbmRvd0NsaWNrKSx0aGlzLm9uV2luZG93Q2xpY2s9bnVsbCksdGhpcy5vbk1vdXNlTW92ZSYmKHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMub25Nb3VzZU1vdmUpLHRoaXMub25Nb3VzZU1vdmU9bnVsbCksdGhpcy5lbGVtZW50JiZ0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSYmdGhpcy5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLmVsZW1lbnQ9bnVsbCx0aGlzLnJldm9rZUJ0biYmdGhpcy5yZXZva2VCdG4ucGFyZW50Tm9kZSYmdGhpcy5yZXZva2VCdG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJldm9rZUJ0biksdGhpcy5yZXZva2VCdG49bnVsbCwoZnVuY3Rpb24oaSl7aWYoYS5pc1BsYWluT2JqZWN0KGkpKXt2YXIgcz1hLmhhc2goSlNPTi5zdHJpbmdpZnkoaSkpLGg9Yy5jdXN0b21TdHlsZXNbc107aWYoaCYmIS0taC5yZWZlcmVuY2VzKXt2YXIgbT1oLmVsZW1lbnQub3duZXJOb2RlO20mJm0ucGFyZW50Tm9kZSYmbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG0pLGMuY3VzdG9tU3R5bGVzW3NdPW51bGx9fX0pKHRoaXMub3B0aW9ucy5wYWxldHRlKSx0aGlzLm9wdGlvbnM9bnVsbH0sdC5wcm90b3R5cGUub3Blbj1mdW5jdGlvbihpKXtpZih0aGlzLmVsZW1lbnQpcmV0dXJuIHRoaXMuaXNPcGVuKCl8fChjLmhhc1RyYW5zaXRpb24/dGhpcy5mYWRlSW4oKTp0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheT0iIix0aGlzLm9wdGlvbnMucmV2b2thYmxlJiZ0aGlzLnRvZ2dsZVJldm9rZUJ1dHRvbigpLHRoaXMub3B0aW9ucy5vblBvcHVwT3Blbi5jYWxsKHRoaXMpKSx0aGlzfSx0LnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbihpKXtpZih0aGlzLmVsZW1lbnQpcmV0dXJuIHRoaXMuaXNPcGVuKCkmJihjLmhhc1RyYW5zaXRpb24/dGhpcy5mYWRlT3V0KCk6dGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLGkmJnRoaXMub3B0aW9ucy5yZXZva2FibGUmJnRoaXMudG9nZ2xlUmV2b2tlQnV0dG9uKCEwKSx0aGlzLm9wdGlvbnMub25Qb3B1cENsb3NlLmNhbGwodGhpcykpLHRoaXN9LHQucHJvdG90eXBlLmZhZGVJbj1mdW5jdGlvbigpe3ZhciBpPXRoaXMuZWxlbWVudDtpZihjLmhhc1RyYW5zaXRpb24mJmkmJih0aGlzLmFmdGVyVHJhbnNpdGlvbiYmZC5jYWxsKHRoaXMsaSksYS5oYXNDbGFzcyhpLCJjYy1pbnZpc2libGUiKSkpe2lmKGkuc3R5bGUuZGlzcGxheT0iIix0aGlzLm9wdGlvbnMuc3RhdGljKXt2YXIgcz10aGlzLmVsZW1lbnQuY2xpZW50SGVpZ2h0O3RoaXMuZWxlbWVudC5wYXJlbnROb2RlLnN0eWxlLm1heEhlaWdodD1zKyJweCJ9dGhpcy5vcGVuaW5nVGltZW91dD1zZXRUaW1lb3V0KG8uYmluZCh0aGlzLGkpLDIwKX19LHQucHJvdG90eXBlLmZhZGVPdXQ9ZnVuY3Rpb24oKXt2YXIgaT10aGlzLmVsZW1lbnQ7Yy5oYXNUcmFuc2l0aW9uJiZpJiYodGhpcy5vcGVuaW5nVGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLm9wZW5pbmdUaW1lb3V0KSxvLmJpbmQodGhpcyxpKSksYS5oYXNDbGFzcyhpLCJjYy1pbnZpc2libGUiKXx8KHRoaXMub3B0aW9ucy5zdGF0aWMmJih0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5zdHlsZS5tYXhIZWlnaHQ9IiIpLHRoaXMuYWZ0ZXJUcmFuc2l0aW9uPWQuYmluZCh0aGlzLGkpLGkuYWRkRXZlbnRMaXN0ZW5lcihjLnRyYW5zaXRpb25FbmQsdGhpcy5hZnRlclRyYW5zaXRpb24pLGEuYWRkQ2xhc3MoaSwiY2MtaW52aXNpYmxlIikpKX0sdC5wcm90b3R5cGUuaXNPcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudCYmdGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXk9PSIiJiYoIWMuaGFzVHJhbnNpdGlvbnx8IWEuaGFzQ2xhc3ModGhpcy5lbGVtZW50LCJjYy1pbnZpc2libGUiKSl9LHQucHJvdG90eXBlLnRvZ2dsZVJldm9rZUJ1dHRvbj1mdW5jdGlvbihpKXt0aGlzLnJldm9rZUJ0biYmKHRoaXMucmV2b2tlQnRuLnN0eWxlLmRpc3BsYXk9aT8iIjoibm9uZSIpfSx0LnByb3RvdHlwZS5yZXZva2VDaG9pY2U9ZnVuY3Rpb24oaSl7dGhpcy5vcHRpb25zLmVuYWJsZWQ9ITAsdGhpcy5jbGVhclN0YXR1cygpLHRoaXMub3B0aW9ucy5vblJldm9rZUNob2ljZS5jYWxsKHRoaXMpLGl8fHRoaXMuYXV0b09wZW4oKX0sdC5wcm90b3R5cGUuaGFzQW5zd2VyZWQ9ZnVuY3Rpb24oaSl7cmV0dXJuIE9iamVjdC5rZXlzKGMuc3RhdHVzKS5pbmRleE9mKHRoaXMuZ2V0U3RhdHVzKCkpPj0wfSx0LnByb3RvdHlwZS5oYXNDb25zZW50ZWQ9ZnVuY3Rpb24oaSl7dmFyIHM9dGhpcy5nZXRTdGF0dXMoKTtyZXR1cm4gcz09Yy5zdGF0dXMuYWxsb3d8fHM9PWMuc3RhdHVzLmRpc21pc3N9LHQucHJvdG90eXBlLmF1dG9PcGVuPWZ1bmN0aW9uKGkpeyF0aGlzLmhhc0Fuc3dlcmVkKCkmJnRoaXMub3B0aW9ucy5lbmFibGVkP3RoaXMub3BlbigpOnRoaXMuaGFzQW5zd2VyZWQoKSYmdGhpcy5vcHRpb25zLnJldm9rYWJsZSYmdGhpcy50b2dnbGVSZXZva2VCdXR0b24oITApfSx0LnByb3RvdHlwZS5zZXRTdGF0dXM9ZnVuY3Rpb24oaSl7dmFyIHM9dGhpcy5vcHRpb25zLmNvb2tpZSxoPWEuZ2V0Q29va2llKHMubmFtZSksbT1PYmplY3Qua2V5cyhjLnN0YXR1cykuaW5kZXhPZihoKT49MDtPYmplY3Qua2V5cyhjLnN0YXR1cykuaW5kZXhPZihpKT49MD8oYS5zZXRDb29raWUocy5uYW1lLGkscy5leHBpcnlEYXlzLHMuZG9tYWluLHMucGF0aCxzLnNlY3VyZSksdGhpcy5vcHRpb25zLm9uU3RhdHVzQ2hhbmdlLmNhbGwodGhpcyxpLG0pKTp0aGlzLmNsZWFyU3RhdHVzKCl9LHQucHJvdG90eXBlLmdldFN0YXR1cz1mdW5jdGlvbigpe3JldHVybiBhLmdldENvb2tpZSh0aGlzLm9wdGlvbnMuY29va2llLm5hbWUpfSx0LnByb3RvdHlwZS5jbGVhclN0YXR1cz1mdW5jdGlvbigpe3ZhciBpPXRoaXMub3B0aW9ucy5jb29raWU7YS5zZXRDb29raWUoaS5uYW1lLCIiLC0xLGkuZG9tYWluLGkucGF0aCl9LHR9KSgpLGMuTG9jYXRpb249KGZ1bmN0aW9uKCl7dmFyIGU9e3RpbWVvdXQ6NWUzLHNlcnZpY2VzOlsiaXBpbmZvIl0sc2VydmljZURlZmluaXRpb25zOntpcGluZm86ZnVuY3Rpb24oKXtyZXR1cm57dXJsOiIvL2lwaW5mby5pbyIsaGVhZGVyczpbIkFjY2VwdDogYXBwbGljYXRpb24vanNvbiJdLGNhbGxiYWNrOmZ1bmN0aW9uKG4scil7dHJ5e3ZhciB1PUpTT04ucGFyc2Uocik7cmV0dXJuIHUuZXJyb3I/Zih1KTp7Y29kZTp1LmNvdW50cnl9fWNhdGNoKGkpe3JldHVybiBmKHtlcnJvcjoiSW52YWxpZCByZXNwb25zZSAoIitpKyIpIn0pfX19fSxpcGluZm9kYjpmdW5jdGlvbihuKXtyZXR1cm57dXJsOiIvL2FwaS5pcGluZm9kYi5jb20vdjMvaXAtY291bnRyeS8/a2V5PXthcGlfa2V5fSZmb3JtYXQ9anNvbiZjYWxsYmFjaz17Y2FsbGJhY2t9Iixpc1NjcmlwdDohMCxjYWxsYmFjazpmdW5jdGlvbihyLHUpe3RyeXt2YXIgaT1KU09OLnBhcnNlKHUpO3JldHVybiBpLnN0YXR1c0NvZGU9PSJFUlJPUiI/Zih7ZXJyb3I6aS5zdGF0dXNNZXNzYWdlfSk6e2NvZGU6aS5jb3VudHJ5Q29kZX19Y2F0Y2gocyl7cmV0dXJuIGYoe2Vycm9yOiJJbnZhbGlkIHJlc3BvbnNlICgiK3MrIikifSl9fX19LG1heG1pbmQ6ZnVuY3Rpb24oKXtyZXR1cm57dXJsOiIvL2pzLm1heG1pbmQuY29tL2pzL2FwaXMvZ2VvaXAyL3YyLjEvZ2VvaXAyLmpzIixpc1NjcmlwdDohMCxjYWxsYmFjazpmdW5jdGlvbihuKXt3aW5kb3cuZ2VvaXAyP2dlb2lwMi5jb3VudHJ5KGZ1bmN0aW9uKHIpe3RyeXtuKHtjb2RlOnIuY291bnRyeS5pc29fY29kZX0pfWNhdGNoKHUpe24oZih1KSl9fSxmdW5jdGlvbihyKXtuKGYocikpfSk6bihuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZm9ybWF0LiBUaGUgZG93bmxvYWRlZCBzY3JpcHQgc2hvdWxkIGhhdmUgZXhwb3J0ZWQgYGdlb2lwMmAgdG8gdGhlIGdsb2JhbCBzY29wZSIpKX19fX19O2Z1bmN0aW9uIHQobil7YS5kZWVwRXh0ZW5kKHRoaXMub3B0aW9ucz17fSxlKSxhLmlzUGxhaW5PYmplY3QobikmJmEuZGVlcEV4dGVuZCh0aGlzLm9wdGlvbnMsbiksdGhpcy5jdXJyZW50U2VydmljZUluZGV4PS0xfWZ1bmN0aW9uIG8obixyLHUpe3ZhciBpLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7cy50eXBlPSJ0ZXh0LyIrKG4udHlwZXx8ImphdmFzY3JpcHQiKSxzLnNyYz1uLnNyY3x8bixzLmFzeW5jPSExLHMub25yZWFkeXN0YXRlY2hhbmdlPXMub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGg9cy5yZWFkeVN0YXRlO2NsZWFyVGltZW91dChpKSxyLmRvbmV8fGgmJiEvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGgpfHwoci5kb25lPSEwLHIoKSxzLm9ucmVhZHlzdGF0ZWNoYW5nZT1zLm9ubG9hZD1udWxsKX0sZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmRvbmU9ITAscigpLHMub25yZWFkeXN0YXRlY2hhbmdlPXMub25sb2FkPW51bGx9LHUpfWZ1bmN0aW9uIGQobixyLHUsaSxzKXt2YXIgaD1uZXcod2luZG93LlhNTEh0dHBSZXF1ZXN0fHx3aW5kb3cuQWN0aXZlWE9iamVjdCkoIk1TWE1MMi5YTUxIVFRQLjMuMCIpO2lmKGgub3BlbihpPyJQT1NUIjoiR0VUIixuLDEpLGguc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksQXJyYXkuaXNBcnJheShzKSlmb3IodmFyIG09MCxsPXMubGVuZ3RoO208bDsrK20pe3ZhciBwPXNbbV0uc3BsaXQoIjoiLDIpO2guc2V0UmVxdWVzdEhlYWRlcihwWzBdLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKSxwWzFdLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKSl9dHlwZW9mIHI9PSJmdW5jdGlvbiImJihoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2gucmVhZHlTdGF0ZT4zJiZyKGgpfSksaC5zZW5kKGkpfWZ1bmN0aW9uIGYobil7cmV0dXJuIG5ldyBFcnJvcigiRXJyb3IgWyIrKG4uY29kZXx8IlVOS05PV04iKSsiXTogIituLmVycm9yKX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0TmV4dFNlcnZpY2U9ZnVuY3Rpb24oKXt2YXIgbjtkbyBuPXRoaXMuZ2V0U2VydmljZUJ5SWR4KCsrdGhpcy5jdXJyZW50U2VydmljZUluZGV4KTt3aGlsZSh0aGlzLmN1cnJlbnRTZXJ2aWNlSW5kZXg8dGhpcy5vcHRpb25zLnNlcnZpY2VzLmxlbmd0aCYmIW4pO3JldHVybiBufSx0LnByb3RvdHlwZS5nZXRTZXJ2aWNlQnlJZHg9ZnVuY3Rpb24obil7dmFyIHI9dGhpcy5vcHRpb25zLnNlcnZpY2VzW25dO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgdT1yKCk7cmV0dXJuIHUubmFtZSYmYS5kZWVwRXh0ZW5kKHUsdGhpcy5vcHRpb25zLnNlcnZpY2VEZWZpbml0aW9uc1t1Lm5hbWVdKHUpKSx1fXJldHVybiB0eXBlb2Ygcj09InN0cmluZyI/dGhpcy5vcHRpb25zLnNlcnZpY2VEZWZpbml0aW9uc1tyXSgpOmEuaXNQbGFpbk9iamVjdChyKT90aGlzLm9wdGlvbnMuc2VydmljZURlZmluaXRpb25zW3IubmFtZV0ocik6bnVsbH0sdC5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKG4scil7dmFyIHU9dGhpcy5nZXROZXh0U2VydmljZSgpO3U/KHRoaXMuY2FsbGJhY2tDb21wbGV0ZT1uLHRoaXMuY2FsbGJhY2tFcnJvcj1yLHRoaXMucnVuU2VydmljZSh1LHRoaXMucnVuTmV4dFNlcnZpY2VPbkVycm9yLmJpbmQodGhpcykpKTpyKG5ldyBFcnJvcigiTm8gc2VydmljZXMgdG8gcnVuIikpfSx0LnByb3RvdHlwZS5zZXR1cFVybD1mdW5jdGlvbihuKXt2YXIgcj10aGlzLmdldEN1cnJlbnRTZXJ2aWNlT3B0cygpO3JldHVybiBuLnVybC5yZXBsYWNlKC9ceyguKj8pXH0vZyxmdW5jdGlvbih1LGkpe2lmKGk9PT0iY2FsbGJhY2siKXt2YXIgcz0iY2FsbGJhY2siK0RhdGUubm93KCk7cmV0dXJuIHdpbmRvd1tzXT1mdW5jdGlvbihoKXtuLl9fSlNPTlBfREFUQT1KU09OLnN0cmluZ2lmeShoKX0sc31pZihpIGluIHIuaW50ZXJwb2xhdGVVcmwpcmV0dXJuIHIuaW50ZXJwb2xhdGVVcmxbaV19KX0sdC5wcm90b3R5cGUucnVuU2VydmljZT1mdW5jdGlvbihuLHIpe3ZhciB1PXRoaXM7biYmbi51cmwmJm4uY2FsbGJhY2smJihuLmlzU2NyaXB0P286ZCkodGhpcy5zZXR1cFVybChuKSxmdW5jdGlvbihpKXt2YXIgcz1pP2kucmVzcG9uc2VUZXh0OiIiO24uX19KU09OUF9EQVRBJiYocz1uLl9fSlNPTlBfREFUQSxkZWxldGUgbi5fX0pTT05QX0RBVEEpLHUucnVuU2VydmljZUNhbGxiYWNrLmNhbGwodSxyLG4scyl9LHRoaXMub3B0aW9ucy50aW1lb3V0LG4uZGF0YSxuLmhlYWRlcnMpfSx0LnByb3RvdHlwZS5ydW5TZXJ2aWNlQ2FsbGJhY2s9ZnVuY3Rpb24obixyLHUpe3ZhciBpPXRoaXMscz1yLmNhbGxiYWNrKGZ1bmN0aW9uKGgpe3N8fGkub25TZXJ2aWNlUmVzdWx0LmNhbGwoaSxuLGgpfSx1KTtzJiZ0aGlzLm9uU2VydmljZVJlc3VsdC5jYWxsKHRoaXMsbixzKX0sdC5wcm90b3R5cGUub25TZXJ2aWNlUmVzdWx0PWZ1bmN0aW9uKG4scil7ciBpbnN0YW5jZW9mIEVycm9yfHxyJiZyLmVycm9yP24uY2FsbCh0aGlzLHIsbnVsbCk6bi5jYWxsKHRoaXMsbnVsbCxyKX0sdC5wcm90b3R5cGUucnVuTmV4dFNlcnZpY2VPbkVycm9yPWZ1bmN0aW9uKG4scil7aWYobil7dGhpcy5sb2dFcnJvcihuKTt2YXIgdT10aGlzLmdldE5leHRTZXJ2aWNlKCk7dT90aGlzLnJ1blNlcnZpY2UodSx0aGlzLnJ1bk5leHRTZXJ2aWNlT25FcnJvci5iaW5kKHRoaXMpKTp0aGlzLmNvbXBsZXRlU2VydmljZS5jYWxsKHRoaXMsdGhpcy5jYWxsYmFja0Vycm9yLG5ldyBFcnJvcigiQWxsIHNlcnZpY2VzIGZhaWxlZCIpKX1lbHNlIHRoaXMuY29tcGxldGVTZXJ2aWNlLmNhbGwodGhpcyx0aGlzLmNhbGxiYWNrQ29tcGxldGUscil9LHQucHJvdG90eXBlLmdldEN1cnJlbnRTZXJ2aWNlT3B0cz1mdW5jdGlvbigpe3ZhciBuPXRoaXMub3B0aW9ucy5zZXJ2aWNlc1t0aGlzLmN1cnJlbnRTZXJ2aWNlSW5kZXhdO3JldHVybiB0eXBlb2Ygbj09InN0cmluZyI/e25hbWU6bn06dHlwZW9mIG49PSJmdW5jdGlvbiI/bigpOmEuaXNQbGFpbk9iamVjdChuKT9uOnt9fSx0LnByb3RvdHlwZS5jb21wbGV0ZVNlcnZpY2U9ZnVuY3Rpb24obixyKXt0aGlzLmN1cnJlbnRTZXJ2aWNlSW5kZXg9LTEsbiYmbihyKX0sdC5wcm90b3R5cGUubG9nRXJyb3I9ZnVuY3Rpb24obil7dmFyIHI9dGhpcy5jdXJyZW50U2VydmljZUluZGV4LHU9dGhpcy5nZXRTZXJ2aWNlQnlJZHgocik7Y29uc29sZS53YXJuKCJUaGUgc2VydmljZVsiK3IrIl0gKCIrdS51cmwrIikgcmVzcG9uZGVkIHdpdGggdGhlIGZvbGxvd2luZyBlcnJvciIsbil9LHR9KSgpLGMuTGF3PShmdW5jdGlvbigpe3ZhciBlPXtyZWdpb25hbExhdzohMCxoYXNMYXc6WyJBVCIsIkJFIiwiQkciLCJIUiIsIkNaIiwiQ1kiLCJESyIsIkVFIiwiRkkiLCJGUiIsIkRFIiwiRUwiLCJIVSIsIklFIiwiSVQiLCJMViIsIkxUIiwiTFUiLCJNVCIsIk5MIiwiUEwiLCJQVCIsIlNLIiwiRVMiLCJTRSIsIkdCIiwiVUsiLCJHUiIsIkVVIl0scmV2b2thYmxlOlsiSFIiLCJDWSIsIkRLIiwiRUUiLCJGUiIsIkRFIiwiTFYiLCJMVCIsIk5MIiwiUFQiLCJFUyJdLGV4cGxpY2l0QWN0aW9uOlsiSFIiLCJJVCIsIkVTIl19O2Z1bmN0aW9uIHQobyl7dGhpcy5pbml0aWFsaXNlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdC5wcm90b3R5cGUuaW5pdGlhbGlzZT1mdW5jdGlvbihvKXthLmRlZXBFeHRlbmQodGhpcy5vcHRpb25zPXt9LGUpLGEuaXNQbGFpbk9iamVjdChvKSYmYS5kZWVwRXh0ZW5kKHRoaXMub3B0aW9ucyxvKX0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKG8pe3ZhciBkPXRoaXMub3B0aW9ucztyZXR1cm57aGFzTGF3OmQuaGFzTGF3LmluZGV4T2Yobyk+PTAscmV2b2thYmxlOmQucmV2b2thYmxlLmluZGV4T2Yobyk+PTAsZXhwbGljaXRBY3Rpb246ZC5leHBsaWNpdEFjdGlvbi5pbmRleE9mKG8pPj0wfX0sdC5wcm90b3R5cGUuYXBwbHlMYXc9ZnVuY3Rpb24obyxkKXt2YXIgZj10aGlzLmdldChkKTtyZXR1cm4gZi5oYXNMYXd8fChvLmVuYWJsZWQ9ITEsdHlwZW9mIG8ub25Ob0Nvb2tpZUxhdz09ImZ1bmN0aW9uIiYmby5vbk5vQ29va2llTGF3KGQsZikpLHRoaXMub3B0aW9ucy5yZWdpb25hbExhdyYmKGYucmV2b2thYmxlJiYoby5yZXZva2FibGU9ITApLGYuZXhwbGljaXRBY3Rpb24mJihvLmRpc21pc3NPblNjcm9sbD0hMSxvLmRpc21pc3NPblRpbWVvdXQ9ITEpKSxvfSx0fSkoKSxjLmluaXRpYWxpc2U9ZnVuY3Rpb24oZSx0LG8pe3ZhciBkPW5ldyBjLkxhdyhlLmxhdyk7dHx8KHQ9ZnVuY3Rpb24oKXt9KSxvfHwobz1mdW5jdGlvbigpe30pO3ZhciBmPU9iamVjdC5rZXlzKGMuc3RhdHVzKSxuPWEuZ2V0Q29va2llKCJjb29raWVjb25zZW50X3N0YXR1cyIpO2YuaW5kZXhPZihuKT49MD90KG5ldyBjLlBvcHVwKGUpKTpjLmdldENvdW50cnlDb2RlKGUsZnVuY3Rpb24ocil7ZGVsZXRlIGUubGF3LGRlbGV0ZSBlLmxvY2F0aW9uLHIuY29kZSYmKGU9ZC5hcHBseUxhdyhlLHIuY29kZSkpLHQobmV3IGMuUG9wdXAoZSkpfSxmdW5jdGlvbihyKXtkZWxldGUgZS5sYXcsZGVsZXRlIGUubG9jYXRpb24sbyhyLG5ldyBjLlBvcHVwKGUpKX0pfSxjLmdldENvdW50cnlDb2RlPWZ1bmN0aW9uKGUsdCxvKXtlLmxhdyYmZS5sYXcuY291bnRyeUNvZGU/dCh7Y29kZTplLmxhdy5jb3VudHJ5Q29kZX0pOmUubG9jYXRpb24/bmV3IGMuTG9jYXRpb24oZS5sb2NhdGlvbikubG9jYXRlKGZ1bmN0aW9uKGQpe3QoZHx8e30pfSxvKTp0KHt9KX0sYy51dGlscz1hLGMuaGFzSW5pdGlhbGlzZWQ9ITAsd2luZG93LmNvb2tpZWNvbnNlbnQ9Y319KSh3aW5kb3cuY29va2llY29uc2VudHx8e30pOwo=","response_hash":"caab2d4248f87ef07a45587635308614b4d37c582f390a714cd7c2f556ad8794","response_time_ms":0,"response_words":388,"has_response":true,"parameters":[{"name":"1","value":"scripts.js","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":15}],"sent_at":"2026-04-05T05:33:08.386926Z","received_at":"2026-04-05T05:33:08.386925Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"482ee7e0-c787-4c36-8916-08f8efccf726","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/assets/public","url":"http://localhost:3000/assets/public","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9hc3NldHMvcHVibGljIEhUVFAvMS4xDQpIb3N0OiBsb2NhbGhvc3Q6MzAwMA0KDQo=","request_hash":"b5a61f881bf05e0f53ebd83f37839a05664ca5bd8ecaf264d0f4cf4237def22f","status_code":301,"response_http_version":"HTTP/1.1","response_headers":{"Access-Control-Allow-Origin":["*"],"Connection":["keep-alive"],"Content-Length":["163"],"Content-Security-Policy":["default-src 'none'"],"Content-Type":["text/html; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Location":["/assets/public/"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=UTF-8","response_content_length":163,"raw_response":"SFRUUC8xLjEgMzAxIE1vdmVkIFBlcm1hbmVudGx5DQpLZWVwLUFsaXZlOiB0aW1lb3V0PTUNCkxvY2F0aW9uOiAvYXNzZXRzL3B1YmxpYy8NClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNClgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTg0KQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqDQpDb250ZW50LUxlbmd0aDogMTYzDQpDb250ZW50LVNlY3VyaXR5LVBvbGljeTogZGVmYXVsdC1zcmMgJ25vbmUnDQpWYXJ5OiBBY2NlcHQtRW5jb2RpbmcNClgtUmVjcnVpdGluZzogLyMvam9icw0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgNCkRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzI6MzIgR01UDQpGZWF0dXJlLVBvbGljeTogcGF5bWVudCAnc2VsZicNCg0KPCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KPHRpdGxlPlJlZGlyZWN0aW5nPC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KPHByZT5SZWRpcmVjdGluZyB0byAvYXNzZXRzL3B1YmxpYy88L3ByZT4KPC9ib2R5Pgo8L2h0bWw+Cg==","response_hash":"478302187322e8fca40355a5830e3ed3120032acb1814b622bda7f5e65527244","response_time_ms":0,"response_words":49,"has_response":true,"response_title":"Redirecting","parameters":[{"name":"1","value":"assets","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":11},{"name":"2","value":"public","type":"path","name_start":-1,"name_end":-1,"value_start":12,"value_end":18}],"sent_at":"2026-04-05T05:33:08.386946Z","received_at":"2026-04-05T05:33:08.386945Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"c46b8ce4-0338-4ebe-9e18-75f25fc9476e","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/assets","url":"http://localhost:3000/assets","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9hc3NldHMgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"ef1a6a8d8532240617f02e035ff5ac70ff6a7a48d8d150bb40936a718495eebf","status_code":301,"response_http_version":"HTTP/1.1","response_headers":{"Access-Control-Allow-Origin":["*"],"Connection":["keep-alive"],"Content-Length":["156"],"Content-Security-Policy":["default-src 'none'"],"Content-Type":["text/html; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Location":["/assets/"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=UTF-8","response_content_length":156,"raw_response":"SFRUUC8xLjEgMzAxIE1vdmVkIFBlcm1hbmVudGx5DQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1VVEYtOA0KRmVhdHVyZS1Qb2xpY3k6IHBheW1lbnQgJ3NlbGYnDQpMb2NhdGlvbjogL2Fzc2V0cy8NClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KRGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMjozMiBHTVQNCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KWC1Db250ZW50LVR5cGUtT3B0aW9uczogbm9zbmlmZg0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpYLVJlY3J1aXRpbmc6IC8jL2pvYnMNCkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKg0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ29udGVudC1MZW5ndGg6IDE1Ng0KQ29udGVudC1TZWN1cml0eS1Qb2xpY3k6IGRlZmF1bHQtc3JjICdub25lJw0KDQo8IURPQ1RZUEUgaHRtbD4KPGh0bWwgbGFuZz0iZW4iPgo8aGVhZD4KPG1ldGEgY2hhcnNldD0idXRmLTgiPgo8dGl0bGU+UmVkaXJlY3Rpbmc8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8cHJlPlJlZGlyZWN0aW5nIHRvIC9hc3NldHMvPC9wcmU+CjwvYm9keT4KPC9odG1sPgo=","response_hash":"d4717e3f802468784f5642bc90d1c9891e61d15456da2ea959bc7d09bf89a47d","response_time_ms":0,"response_words":49,"has_response":true,"response_title":"Redirecting","parameters":[{"name":"1","value":"assets","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":11}],"sent_at":"2026-04-05T05:33:08.386956Z","received_at":"2026-04-05T05:33:08.386955Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"9b4940b9-f2e8-47a7-87aa-56c843219141","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/ftp","url":"http://localhost:3000/ftp","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9mdHAgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"a6c9b25db4d3befc16aafe5b77f43d71e5341444e584cecc18ee17cdb156b6f1","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Access-Control-Allow-Origin":["*"],"Connection":["keep-alive"],"Content-Type":["text/html; charset=utf-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=utf-8","response_content_length":11296,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOA0KRmVhdHVyZS1Qb2xpY3k6IHBheW1lbnQgJ3NlbGYnDQpYLUZyYW1lLU9wdGlvbnM6IFNBTUVPUklHSU4NClgtUmVjcnVpdGluZzogLyMvam9icw0KQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqDQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjMyIEdNVA0KS2VlcC1BbGl2ZTogdGltZW91dD01DQpWYXJ5OiBBY2NlcHQtRW5jb2RpbmcNClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNCg0KPCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0ndXRmLTgnPiAKICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDx0aXRsZT5saXN0aW5nIGRpcmVjdG9yeSAvZnRwPC90aXRsZT4KICAgIDxzdHlsZT4qIHsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogMDsKICBvdXRsaW5lOiAwOwp9Cgpib2R5IHsKICBwYWRkaW5nOiA4MHB4IDEwMHB4OwogIGZvbnQ6IDEzcHggIkhlbHZldGljYSBOZXVlIiwgIkx1Y2lkYSBHcmFuZGUiLCAiQXJpYWwiOwogIGJhY2tncm91bmQ6ICNFQ0U5RTkgLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAlIDAlLCAwJSAxMDAlLCBmcm9tKCNmZmYpLCB0bygjRUNFOUU5KSk7CiAgYmFja2dyb3VuZDogI0VDRTlFOSAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNmZmYsICNFQ0U5RTkpOwogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgY29sb3I6ICM1NTU7CiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7Cn0KaDEsIGgyLCBoMyB7CiAgZm9udC1zaXplOiAyMnB4OwogIGNvbG9yOiAjMzQzNDM0Owp9CmgxIGVtLCBoMiBlbSB7CiAgcGFkZGluZzogMCA1cHg7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKfQpoMSB7CiAgZm9udC1zaXplOiA2MHB4Owp9CmgyIHsKICBtYXJnaW4tdG9wOiAxMHB4Owp9CmgzIHsKICBtYXJnaW46IDVweCAwIDEwcHggMDsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOwogIGZvbnQtc2l6ZTogMThweDsKfQp1bCBsaSB7CiAgbGlzdC1zdHlsZTogbm9uZTsKfQp1bCBsaTpob3ZlciB7CiAgY3Vyc29yOiBwb2ludGVyOwogIGNvbG9yOiAjMmUyZTJlOwp9CnVsIGxpIC5wYXRoIHsKICBwYWRkaW5nLWxlZnQ6IDVweDsKICBmb250LXdlaWdodDogYm9sZDsKfQp1bCBsaSAubGluZSB7CiAgcGFkZGluZy1yaWdodDogNXB4OwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQp1bCBsaTpmaXJzdC1jaGlsZCAucGF0aCB7CiAgcGFkZGluZy1sZWZ0OiAwOwp9CnAgewogIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KYSB7CiAgY29sb3I6ICM1NTU7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CmE6aG92ZXIgewogIGNvbG9yOiAjMzAzMDMwOwp9CiNzdGFja3RyYWNlIHsKICBtYXJnaW4tdG9wOiAxNXB4Owp9Ci5kaXJlY3RvcnkgaDEgewogIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgZm9udC1zaXplOiAxOHB4Owp9CnVsI2ZpbGVzIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQp1bCNmaWxlcyBsaSB7CiAgZmxvYXQ6IGxlZnQ7CiAgd2lkdGg6IDMwJTsKICBsaW5lLWhlaWdodDogMjVweDsKICBtYXJnaW46IDFweDsKfQp1bCNmaWxlcyBsaSBhIHsKICBkaXNwbGF5OiBibG9jazsKICBoZWlnaHQ6IDI1cHg7CiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiA1cHg7CiAgYm9yZGVyLXJhZGl1czogNXB4OwogIG92ZXJmbG93OiBoaWRkZW47CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQp1bCNmaWxlcyBsaSBhOmZvY3VzLAp1bCNmaWxlcyBsaSBhOmhvdmVyIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuNjUpOwogIGJvcmRlcjogMXB4IHNvbGlkICNlY2VjZWM7Cn0KdWwjZmlsZXMgbGkgYS5oaWdobGlnaHQgewogIC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZCAuNHMgZWFzZS1pbi1vdXQ7CiAgYmFja2dyb3VuZDogI2ZmZmY0ZjsKICBib3JkZXItY29sb3I6ICNFOURDNTE7Cn0KI3NlYXJjaCB7CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogMjBweDsKICByaWdodDogMjBweDsKICB3aWR0aDogOTBweDsKICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIGVhc2UgMC4ycywgb3BhY2l0eSBlYXNlIDAuNHM7CiAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCBlYXNlIDAuMnMsIG9wYWNpdHkgZWFzZSAwLjRzOwogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMzJweDsKICAtbW96LWJvcmRlci1yYWRpdXM6IDMycHg7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMjUpLCBpbnNldCAwcHggMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuNyksIDBweCAxcHggMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7CiAgLW1vei1ib3gtc2hhZG93OiBpbnNldCAwcHggMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMjUpLCBpbnNldCAwcHggMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuNyksIDBweCAxcHggMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7CiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgdGV4dC1hbGlnbjogbGVmdDsKICBmb250OiAxM3B4ICJIZWx2ZXRpY2EgTmV1ZSIsIEFyaWFsLCBzYW5zLXNlcmlmOwogIHBhZGRpbmc6IDRweCAxMHB4OwogIGJvcmRlcjogbm9uZTsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICBtYXJnaW4tYm90dG9tOiAwOwogIG91dGxpbmU6IG5vbmU7CiAgb3BhY2l0eTogMC43OwogIGNvbG9yOiAjODg4Owp9CiNzZWFyY2g6Zm9jdXMgewogIHdpZHRoOiAxMjBweDsKICBvcGFjaXR5OiAxLjA7IAp9CgovKnZpZXdzKi8KI2ZpbGVzIHNwYW4gewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBvdmVyZmxvdzogaGlkZGVuOwogIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogIHRleHQtaW5kZW50OiAxMHB4Owp9CiNmaWxlcyAubmFtZSB7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKfQojZmlsZXMgLmljb24gLm5hbWUgewogIHRleHQtaW5kZW50OiAyOHB4Owp9CgovKnRpbGVzKi8KLnZpZXctdGlsZXMgLm5hbWUgewogIHdpZHRoOiAxMDAlOwogIGJhY2tncm91bmQtcG9zaXRpb246IDhweCA1cHg7Cn0KLnZpZXctdGlsZXMgLnNpemUsCi52aWV3LXRpbGVzIC5kYXRlIHsKICBkaXNwbGF5OiBub25lOwp9CgovKmRldGFpbHMqLwp1bCNmaWxlcy52aWV3LWRldGFpbHMgbGkgewogIGZsb2F0OiBub25lOwogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiA5MCU7Cn0KdWwjZmlsZXMudmlldy1kZXRhaWxzIGxpLmhlYWRlciB7CiAgaGVpZ2h0OiAyNXB4OwogIGJhY2tncm91bmQ6ICMwMDA7CiAgY29sb3I6ICNmZmY7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLnZpZXctZGV0YWlscyAuaGVhZGVyIHsKICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KLnZpZXctZGV0YWlscyAubmFtZSB7CiAgd2lkdGg6IDYwJTsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA4cHggNXB4Owp9Ci52aWV3LWRldGFpbHMgLnNpemUgewogIHdpZHRoOiAxMCU7Cn0KLnZpZXctZGV0YWlscyAuZGF0ZSB7CiAgd2lkdGg6IDMwJTsKfQoudmlldy1kZXRhaWxzIC5zaXplLAoudmlldy1kZXRhaWxzIC5kYXRlIHsKICB0ZXh0LWFsaWduOiByaWdodDsKICBkaXJlY3Rpb246IHJ0bDsKfQoKLyptb2JpbGUqLwpAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICBib2R5IHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxNnB4OwogICAgcGFkZGluZzogMDsKICB9CiAgI3NlYXJjaCB7CiAgICBwb3NpdGlvbjogc3RhdGljOwogICAgd2lkdGg6IDEwMCU7CiAgICBmb250LXNpemU6IDJlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjhlbTsKICAgIHRleHQtaW5kZW50OiAxMHB4OwogICAgYm9yZGVyOiAwOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIHBhZGRpbmc6IDEwcHggMDsKICAgIG1hcmdpbjogMDsKICB9CiAgI3NlYXJjaDpmb2N1cyB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlcjogMDsKICAgIG9wYWNpdHk6IDE7CiAgfQogIC5kaXJlY3RvcnkgaDEgewogICAgZm9udC1zaXplOiAyZW07CiAgICBsaW5lLWhlaWdodDogMS41ZW07CiAgICBjb2xvcjogI2ZmZjsKICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICBwYWRkaW5nOiAxNXB4IDEwcHg7CiAgICBtYXJnaW46IDA7CiAgfQogIHVsI2ZpbGVzIHsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2FjYWNhOwogIH0KICB1bCNmaWxlcyBsaSB7CiAgICBmbG9hdDogbm9uZTsKICAgIHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2FjYWNhOwogICAgZm9udC1zaXplOiAyZW07CiAgICBsaW5lLWhlaWdodDogMS4yZW07CiAgICB0ZXh0LWluZGVudDogMDsKICAgIG1hcmdpbjogMDsKICB9CiAgdWwjZmlsZXMgbGk6bnRoLWNoaWxkKG9kZCkgewogICAgYmFja2dyb3VuZDogI2UwZTBlMDsKICB9CiAgdWwjZmlsZXMgbGkgYSB7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBib3JkZXI6IDA7CiAgICBib3JkZXItcmFkaXVzOiAwOwogICAgcGFkZGluZzogMTVweCAxMHB4OwogIH0KICB1bCNmaWxlcyBsaSBhOmZvY3VzLAogIHVsI2ZpbGVzIGxpIGE6aG92ZXIgewogICAgYm9yZGVyOiAwOwogIH0KICAjZmlsZXMgLmhlYWRlciwKICAjZmlsZXMgLnNpemUsCiAgI2ZpbGVzIC5kYXRlIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICB9CiAgI2ZpbGVzIC5uYW1lIHsKICAgIGZsb2F0OiBub25lOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgICB0ZXh0LWluZGVudDogMDsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IDAgNTAlOwogIH0KICAjZmlsZXMgLmljb24gLm5hbWUgewogICAgdGV4dC1pbmRlbnQ6IDQxcHg7CiAgfQp9CiNmaWxlcyAuaWNvbi1kaXJlY3RvcnkgLm5hbWUgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQU1BQUFBb0xROVRBQUFBQkdkQlRVRUFBTEdQQy94aEJRQUFBV3RRVEZSRkFBQUEvUFBROU5oYzJxNDAycVExMnFzMi9QVFgycGcxMnA4MSsvTE04OU5FOWR0bzJxODIrL2ZwMnJNMjJxWTM5ZDZVKy9ibzJxbzIvZnJ4L3Z6MzJxODEycXMxMnFFMjc5U1U4YzR3OU5aUCsvTEsvLzM2N3M5eTdzOTI1Y3AwL3Z6dzl0OTIvLzM0MnBvMi92ejI1czE1NzlCNitPU08yYlEwL3Y3OTlOeVQ4dEU3OWRsZDhNc20rT3JDL3Z6eDc5S0EySVlzN3M2STlkNlI0Y0plOStPRi9QTEkvZnJ5NzlPRi92MzAvLzMyOHRXQjg5Uko4YzlwOGMwdTllQ2YvLzcrOXR4czZzdHM1TWRyKysrNSt1MnovdnJ2Ky9mcTZjRno4ZEJzOHRBNTdjcHErT2FVOXVHczI3WTgvLzc5OU5kWC9QYlk5dUI4OXVuSi8vejE0c05mK2VtaCtlbWsrdkRjK3V5czkrT0w4ZEp5ODlOSCtlaWM4dE41K09hVitPV1I5TjJuOWR0bDl0NTI5K0tGOStHQjlOdWU5TmRVOHRSLzl0NXk4OXFXOWRwajg5aU84OWVHL3Z2dTJwUTEyWTR6L3Z6eTJJY3QvdnZ2NDhkci92eno0c05nLy8vKzJJZ3R5M1Bxd1FBQUFBRjBVazVUQUVEbTJHWUFBQUN0U1VSQlZCalRZMkFnQTJpWWxKV1ZoZm9oQlBnMHl4Mzh5OTJkUzBwS1ZPVkJBcUlpNnNiMnZzV1dwZnJGZVRJOFFBRWhZUUV0YTI4bkN3TTFPVmxlWnFDQW1LQ0VrVWR3WVdtaFFuRmVPU3RRZ0w5Y3lTcWtOTkRIVkpHYmlZMEZLQ0N1WXVZU0dSc1Y1S2dqeGNYSUFSUlFObmNOajA5SlRncXcwWmJrWkFjSzVMdUZKYVJtWnFmSGVObnBTdWNEQlFvaUV0T3ljbkl6NHFJOWJmVUtRQTZwS0txQWdxSUtReUs4QmdBWjV5Zk9EbW5IclFBQUFBQkpSVTVFcmtKZ2dnPT0pOwp9CiNmaWxlcyAuaWNvbi10ZXh0IC5uYW1lIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FRQUFBQzEramZxQUFBQUJHZEJUVUVBQUsvSU53V0s2UUFBQUJsMFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1NXMWhaMlZTWldGa2VYSEpaVHdBQUFEb1NVUkJWQmdaQmNFeGJsTkJHQWJBMmNlZWdUUkJ1SUtPZ2lpaFNaTlRjQzVMVUhBaWhOSlIwa0dLQ0RjWUpZNkQzLzc3TWRPaW5UdnpBZ0N3OHlzVGhJdm4vVm9qSXlNakl5UFArYlMxc1VRSVYyczk1cEJERHZtYlAvbWRrZnQ4M3RwWWd1WnE1SmgvT2VhWWgreXp5OGhUSHZObGF4Tk5jem0rbGE5T1RsYXIxVWRBLytDMkE0dHJSQ25EM2pTOEJCMW9icTJHazZHVTZRYlFBUzRCVWFZU1FBZjRiaGhLS1RGZEF6ckFPd0F4RVVBSCtLRU0wMVNZM2dNNndCc0VBUUIwZ0orbWFab0MzZ0k2aVBZYUFJQkpzaVJtSFUwQUFMT2VGQzNhSzJjV0FBQ1VYZTcrQXdPMGxjOWVUSFlUQUFBQUFFbEZUa1N1UW1DQyk7Cn0KI2ZpbGVzIC5pY29uLWRlZmF1bHQgLm5hbWUgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVFBQUFDMStqZnFBQUFBQkdkQlRVRUFBSy9JTndXSzZRQUFBQmwwUlZoMFUyOW1kSGRoY21VQVFXUnZZbVVnU1cxaFoyVlNaV0ZrZVhISlpUd0FBQUM0U1VSQlZDalBkWkZiRHNJZ0VFV25yc01tN29HR2Zacm9oeHZVK0lxMVR5alU2MEJmMXBhYzRZYzVZUzRaQXRHV0JNay9kclFCT1Z3SmxacldZa0xoc0I4VVY5SzBCVXJQR3k5Y1dibmcyQ3RFRVVtTEdwcFBqUndwYml4VUtIQmlaUlMwcCtaR2h2czRpck5FdldEOGhlSHBic3lEWHpuUGhZRk95VGpKYzEzb2xJcXpaQ0hCb3VFMEZSTVVqQStzMWdUamFSZ1ZGcHFSd0M4bWZvWFBQRVZQUzdMYlJhSkwyeTdiT2lmUkNURWxpM1U3Qk1XZ0x6S2xXL0N1ZWJaUEFBQUFBRWxGVGtTdVFtQ0MpOwp9Cjwvc3R5bGU+CiAgICA8c2NyaXB0PgogICAgICBmdW5jdGlvbiAkKGlkKXsKICAgICAgICB2YXIgZWwgPSAnc3RyaW5nJyA9PSB0eXBlb2YgaWQKICAgICAgICAgID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpCiAgICAgICAgICA6IGlkOwoKICAgICAgICBlbC5vbiA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7CiAgICAgICAgICBpZiAoJ2NvbnRlbnQgbG9hZGVkJyA9PSBldmVudCkgewogICAgICAgICAgICBldmVudCA9IHdpbmRvdy5hdHRhY2hFdmVudCA/ICJsb2FkIiA6ICJET01Db250ZW50TG9hZGVkIjsKICAgICAgICAgIH0KICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgPyBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgZmFsc2UpCiAgICAgICAgICAgIDogZWwuYXR0YWNoRXZlbnQoIm9uIiArIGV2ZW50LCBmbik7CiAgICAgICAgfTsKCiAgICAgICAgZWwuYWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpewogICAgICAgICAgcmV0dXJuICQoZWwucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpOwogICAgICAgIH07CgogICAgICAgIGVsLmVhY2ggPSBmdW5jdGlvbihmbil7CiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWwubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICAgICAgZm4oJChlbFtpXSksIGkpOwogICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGVsLmdldENsYXNzZXMgPSBmdW5jdGlvbigpewogICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdjbGFzcycpLnNwbGl0KC9ccysvKTsKICAgICAgICB9OwoKICAgICAgICBlbC5hZGRDbGFzcyA9IGZ1bmN0aW9uKG5hbWUpewogICAgICAgICAgdmFyIGNsYXNzZXMgPSB0aGlzLmdldEF0dHJpYnV0ZSgnY2xhc3MnKTsKICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbGFzc2VzCiAgICAgICAgICAgID8gY2xhc3NlcyArICcgJyArIG5hbWUKICAgICAgICAgICAgOiBuYW1lKTsKICAgICAgICB9OwoKICAgICAgICBlbC5yZW1vdmVDbGFzcyA9IGZ1bmN0aW9uKG5hbWUpewogICAgICAgICAgdmFyIGNsYXNzZXMgPSB0aGlzLmdldENsYXNzZXMoKS5maWx0ZXIoZnVuY3Rpb24oY3Vycil7CiAgICAgICAgICAgIHJldHVybiBjdXJyICE9IG5hbWU7CiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjbGFzcycsIGNsYXNzZXMuam9pbignICcpKTsKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gZWw7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNlYXJjaCgpIHsKICAgICAgICB2YXIgc3RyID0gJCgnc2VhcmNoJykudmFsdWUudG9Mb3dlckNhc2UoKTsKICAgICAgICB2YXIgbGlua3MgPSAkKCdmaWxlcycpLmFsbCgnYScpOwoKICAgICAgICBsaW5rcy5lYWNoKGZ1bmN0aW9uKGxpbmspewogICAgICAgICAgdmFyIHRleHQgPSBsaW5rLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCk7CgogICAgICAgICAgaWYgKCcuLicgPT0gdGV4dCkgcmV0dXJuOwogICAgICAgICAgaWYgKHN0ci5sZW5ndGggJiYgfnRleHQuaW5kZXhPZihzdHIpKSB7CiAgICAgICAgICAgIGxpbmsuYWRkQ2xhc3MoJ2hpZ2hsaWdodCcpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGluay5yZW1vdmVDbGFzcygnaGlnaGxpZ2h0Jyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgICQod2luZG93KS5vbignY29udGVudCBsb2FkZWQnLCBmdW5jdGlvbigpewogICAgICAgICQoJ3NlYXJjaCcpLm9uKCdrZXl1cCcsIHNlYXJjaCk7CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgPC9oZWFkPgogIDxib2R5IGNsYXNzPSJkaXJlY3RvcnkiPgogICAgPGlucHV0IGlkPSJzZWFyY2giIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgPGRpdiBpZD0id3JhcHBlciI+CiAgICAgIDxoMT48YSBocmVmPSIuIj5+PC9hPiAvIDxhIGhyZWY9ImZ0cCI+ZnRwPC9hPjwvaDE+CiAgICAgIDx1bCBpZD0iZmlsZXMiIGNsYXNzPSJ2aWV3LXRpbGVzIj48bGk+PGEgaHJlZj0iZnRwL3F1YXJhbnRpbmUiIGNsYXNzPSJpY29uIGljb24tZGlyZWN0b3J5IiB0aXRsZT0icXVhcmFudGluZSI+PHNwYW4gY2xhc3M9Im5hbWUiPnF1YXJhbnRpbmU8L3NwYW4+PHNwYW4gY2xhc3M9InNpemUiPjwvc3Bhbj48c3BhbiBjbGFzcz0iZGF0ZSI+My83LzIwMjYgMToyOTozMCBQTTwvc3Bhbj48L2E+PC9saT4KPGxpPjxhIGhyZWY9ImZ0cC9hY3F1aXNpdGlvbnMubWQiIGNsYXNzPSJpY29uIGljb24gaWNvbi1tZCBpY29uLXRleHQiIHRpdGxlPSJhY3F1aXNpdGlvbnMubWQiPjxzcGFuIGNsYXNzPSJuYW1lIj5hY3F1aXNpdGlvbnMubWQ8L3NwYW4+PHNwYW4gY2xhc3M9InNpemUiPjkwOTwvc3Bhbj48c3BhbiBjbGFzcz0iZGF0ZSI+My83LzIwMjYgMToyOTozMCBQTTwvc3Bhbj48L2E+PC9saT4KPGxpPjxhIGhyZWY9ImZ0cC9hbm5vdW5jZW1lbnRfZW5jcnlwdGVkLm1kIiBjbGFzcz0iaWNvbiBpY29uIGljb24tbWQgaWNvbi10ZXh0IiB0aXRsZT0iYW5ub3VuY2VtZW50X2VuY3J5cHRlZC5tZCI+PHNwYW4gY2xhc3M9Im5hbWUiPmFubm91bmNlbWVudF9lbmNyeXB0ZWQubWQ8L3NwYW4+PHNwYW4gY2xhc3M9InNpemUiPjM2OTIzNzwvc3Bhbj48c3BhbiBjbGFzcz0iZGF0ZSI+My83LzIwMjYgMToyOTozMCBQTTwvc3Bhbj48L2E+PC9saT4KPGxpPjxhIGhyZWY9ImZ0cC9jb3Vwb25zXzIwMTMubWQuYmFrIiBjbGFzcz0iaWNvbiBpY29uIGljb24tYmFrIGljb24tZGVmYXVsdCIgdGl0bGU9ImNvdXBvbnNfMjAxMy5tZC5iYWsiPjxzcGFuIGNsYXNzPSJuYW1lIj5jb3Vwb25zXzIwMTMubWQuYmFrPC9zcGFuPjxzcGFuIGNsYXNzPSJzaXplIj4xMzE8L3NwYW4+PHNwYW4gY2xhc3M9ImRhdGUiPjMvNy8yMDI2IDE6Mjk6MzAgUE08L3NwYW4+PC9hPjwvbGk+CjxsaT48YSBocmVmPSJmdHAvZWFzdGVyZS5nZyIgY2xhc3M9Imljb24gaWNvbiBpY29uLWdnIGljb24tZGVmYXVsdCIgdGl0bGU9ImVhc3RlcmUuZ2ciPjxzcGFuIGNsYXNzPSJuYW1lIj5lYXN0ZXJlLmdnPC9zcGFuPjxzcGFuIGNsYXNzPSJzaXplIj4zMjQ8L3NwYW4+PHNwYW4gY2xhc3M9ImRhdGUiPjMvNy8yMDI2IDE6Mjk6MzAgUE08L3NwYW4+PC9hPjwvbGk+CjxsaT48YSBocmVmPSJmdHAvZW5jcnlwdC5weWMiIGNsYXNzPSJpY29uIGljb24gaWNvbi1weWMgaWNvbi1kZWZhdWx0IiB0aXRsZT0iZW5jcnlwdC5weWMiPjxzcGFuIGNsYXNzPSJuYW1lIj5lbmNyeXB0LnB5Yzwvc3Bhbj48c3BhbiBjbGFzcz0ic2l6ZSI+NTczPC9zcGFuPjxzcGFuIGNsYXNzPSJkYXRlIj4zLzcvMjAyNiAxOjI5OjMwIFBNPC9zcGFuPjwvYT48L2xpPgo8bGk+PGEgaHJlZj0iZnRwL2luY2lkZW50LXN1cHBvcnQua2RieCIgY2xhc3M9Imljb24gaWNvbiBpY29uLWtkYnggaWNvbi1kZWZhdWx0IiB0aXRsZT0iaW5jaWRlbnQtc3VwcG9ydC5rZGJ4Ij48c3BhbiBjbGFzcz0ibmFtZSI+aW5jaWRlbnQtc3VwcG9ydC5rZGJ4PC9zcGFuPjxzcGFuIGNsYXNzPSJzaXplIj4zMjQ2PC9zcGFuPjxzcGFuIGNsYXNzPSJkYXRlIj4zLzcvMjAyNiAxOjI5OjMwIFBNPC9zcGFuPjwvYT48L2xpPgo8bGk+PGEgaHJlZj0iZnRwL2xlZ2FsLm1kIiBjbGFzcz0iaWNvbiBpY29uIGljb24tbWQgaWNvbi10ZXh0IiB0aXRsZT0ibGVnYWwubWQiPjxzcGFuIGNsYXNzPSJuYW1lIj5sZWdhbC5tZDwvc3Bhbj48c3BhbiBjbGFzcz0ic2l6ZSI+MzA0Nzwvc3Bhbj48c3BhbiBjbGFzcz0iZGF0ZSI+NC81LzIwMjYgNTozMTozNyBBTTwvc3Bhbj48L2E+PC9saT4KPGxpPjxhIGhyZWY9ImZ0cC9wYWNrYWdlLWxvY2suanNvbi5iYWsiIGNsYXNzPSJpY29uIGljb24gaWNvbi1iYWsgaWNvbi1kZWZhdWx0IiB0aXRsZT0icGFja2FnZS1sb2NrLmpzb24uYmFrIj48c3BhbiBjbGFzcz0ibmFtZSI+cGFja2FnZS1sb2NrLmpzb24uYmFrPC9zcGFuPjxzcGFuIGNsYXNzPSJzaXplIj43NTAzNTM8L3NwYW4+PHNwYW4gY2xhc3M9ImRhdGUiPjMvNy8yMDI2IDE6Mjk6MzAgUE08L3NwYW4+PC9hPjwvbGk+CjxsaT48YSBocmVmPSJmdHAvcGFja2FnZS5qc29uLmJhayIgY2xhc3M9Imljb24gaWNvbiBpY29uLWJhayBpY29uLWRlZmF1bHQiIHRpdGxlPSJwYWNrYWdlLmpzb24uYmFrIj48c3BhbiBjbGFzcz0ibmFtZSI+cGFja2FnZS5qc29uLmJhazwvc3Bhbj48c3BhbiBjbGFzcz0ic2l6ZSI+NDI5MTwvc3Bhbj48c3BhbiBjbGFzcz0iZGF0ZSI+My83LzIwMjYgMToyOTozMCBQTTwvc3Bhbj48L2E+PC9saT4KPGxpPjxhIGhyZWY9ImZ0cC9zdXNwaWNpb3VzX2Vycm9ycy55bWwiIGNsYXNzPSJpY29uIGljb24gaWNvbi15bWwgaWNvbi10ZXh0IiB0aXRsZT0ic3VzcGljaW91c19lcnJvcnMueW1sIj48c3BhbiBjbGFzcz0ibmFtZSI+c3VzcGljaW91c19lcnJvcnMueW1sPC9zcGFuPjxzcGFuIGNsYXNzPSJzaXplIj43MjM8L3NwYW4+PHNwYW4gY2xhc3M9ImRhdGUiPjMvNy8yMDI2IDE6Mjk6MzAgUE08L3NwYW4+PC9hPjwvbGk+PC91bD4KICAgIDwvZGl2PgogIDwvYm9keT4KPC9odG1sPg==","response_hash":"50097d0e66b04a145a59d1fdee6efa8e10ee2b5e2841bf21fb33b5add58579a4","response_time_ms":0,"response_words":969,"has_response":true,"response_title":"listing directory /ftp","parameters":[{"name":"1","value":"ftp","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":8}],"sent_at":"2026-04-05T05:33:08.387038Z","received_at":"2026-04-05T05:33:08.387038Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"3ab1a0b7-9578-4564-8248-4dd5db39d287","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/ftp/","url":"http://localhost:3000/ftp/","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9mdHAvIEhUVFAvMS4xDQpIb3N0OiBsb2NhbGhvc3Q6MzAwMA0KDQo=","request_hash":"b37d2a1551cfd2740ca751a7fbe8a8a7013cfa21699259a89fc731955fe6fa7e","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Access-Control-Allow-Origin":["*"],"Connection":["keep-alive"],"Content-Type":["text/html; charset=utf-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=utf-8","response_content_length":11253,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoNCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04DQpGZWF0dXJlLVBvbGljeTogcGF5bWVudCAnc2VsZicNCkRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzI6MzIgR01UDQpLZWVwLUFsaXZlOiB0aW1lb3V0PTUNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KWC1Db250ZW50LVR5cGUtT3B0aW9uczogbm9zbmlmZg0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpYLVJlY3J1aXRpbmc6IC8jL2pvYnMNCg0KPCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0ndXRmLTgnPiAKICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDx0aXRsZT5saXN0aW5nIGRpcmVjdG9yeSAvZnRwLzwvdGl0bGU+CiAgICA8c3R5bGU+KiB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDA7CiAgb3V0bGluZTogMDsKfQoKYm9keSB7CiAgcGFkZGluZzogODBweCAxMDBweDsKICBmb250OiAxM3B4ICJIZWx2ZXRpY2EgTmV1ZSIsICJMdWNpZGEgR3JhbmRlIiwgIkFyaWFsIjsKICBiYWNrZ3JvdW5kOiAjRUNFOUU5IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCAwJSAwJSwgMCUgMTAwJSwgZnJvbSgjZmZmKSwgdG8oI0VDRTlFOSkpOwogIGJhY2tncm91bmQ6ICNFQ0U5RTkgLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCAjZmZmLCAjRUNFOUU5KTsKICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogIGNvbG9yOiAjNTU1OwogIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwp9CmgxLCBoMiwgaDMgewogIGZvbnQtc2l6ZTogMjJweDsKICBjb2xvcjogIzM0MzQzNDsKfQpoMSBlbSwgaDIgZW0gewogIHBhZGRpbmc6IDAgNXB4OwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7Cn0KaDEgewogIGZvbnQtc2l6ZTogNjBweDsKfQpoMiB7CiAgbWFyZ2luLXRvcDogMTBweDsKfQpoMyB7CiAgbWFyZ2luOiA1cHggMCAxMHB4IDA7CiAgcGFkZGluZy1ib3R0b206IDVweDsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTsKICBmb250LXNpemU6IDE4cHg7Cn0KdWwgbGkgewogIGxpc3Qtc3R5bGU6IG5vbmU7Cn0KdWwgbGk6aG92ZXIgewogIGN1cnNvcjogcG9pbnRlcjsKICBjb2xvcjogIzJlMmUyZTsKfQp1bCBsaSAucGF0aCB7CiAgcGFkZGluZy1sZWZ0OiA1cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KdWwgbGkgLmxpbmUgewogIHBhZGRpbmctcmlnaHQ6IDVweDsKICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KdWwgbGk6Zmlyc3QtY2hpbGQgLnBhdGggewogIHBhZGRpbmctbGVmdDogMDsKfQpwIHsKICBsaW5lLWhlaWdodDogMS41Owp9CmEgewogIGNvbG9yOiAjNTU1OwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQphOmhvdmVyIHsKICBjb2xvcjogIzMwMzAzMDsKfQojc3RhY2t0cmFjZSB7CiAgbWFyZ2luLXRvcDogMTVweDsKfQouZGlyZWN0b3J5IGgxIHsKICBtYXJnaW4tYm90dG9tOiAxNXB4OwogIGZvbnQtc2l6ZTogMThweDsKfQp1bCNmaWxlcyB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KdWwjZmlsZXMgbGkgewogIGZsb2F0OiBsZWZ0OwogIHdpZHRoOiAzMCU7CiAgbGluZS1oZWlnaHQ6IDI1cHg7CiAgbWFyZ2luOiAxcHg7Cn0KdWwjZmlsZXMgbGkgYSB7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAyNXB4OwogIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4OwogIC1tb3otYm9yZGVyLXJhZGl1czogNXB4OwogIGJvcmRlci1yYWRpdXM6IDVweDsKICBvdmVyZmxvdzogaGlkZGVuOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KdWwjZmlsZXMgbGkgYTpmb2N1cywKdWwjZmlsZXMgbGkgYTpob3ZlciB7CiAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjY1KTsKICBib3JkZXI6IDFweCBzb2xpZCAjZWNlY2VjOwp9CnVsI2ZpbGVzIGxpIGEuaGlnaGxpZ2h0IHsKICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQgLjRzIGVhc2UtaW4tb3V0OwogIGJhY2tncm91bmQ6ICNmZmZmNGY7CiAgYm9yZGVyLWNvbG9yOiAjRTlEQzUxOwp9CiNzZWFyY2ggewogIGRpc3BsYXk6IGJsb2NrOwogIHBvc2l0aW9uOiBmaXhlZDsKICB0b3A6IDIwcHg7CiAgcmlnaHQ6IDIwcHg7CiAgd2lkdGg6IDkwcHg7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCBlYXNlIDAuMnMsIG9wYWNpdHkgZWFzZSAwLjRzOwogIC1tb3otdHJhbnNpdGlvbjogd2lkdGggZWFzZSAwLjJzLCBvcGFjaXR5IGVhc2UgMC40czsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDMycHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiAzMnB4OwogIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMHB4IDBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjI1KSwgaW5zZXQgMHB4IDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjcpLCAwcHggMXB4IDBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwogIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMHB4IDBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjI1KSwgaW5zZXQgMHB4IDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjcpLCAwcHggMXB4IDBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpOwogIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIHRleHQtYWxpZ246IGxlZnQ7CiAgZm9udDogMTNweCAiSGVsdmV0aWNhIE5ldWUiLCBBcmlhbCwgc2Fucy1zZXJpZjsKICBwYWRkaW5nOiA0cHggMTBweDsKICBib3JkZXI6IG5vbmU7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgbWFyZ2luLWJvdHRvbTogMDsKICBvdXRsaW5lOiBub25lOwogIG9wYWNpdHk6IDAuNzsKICBjb2xvcjogIzg4ODsKfQojc2VhcmNoOmZvY3VzIHsKICB3aWR0aDogMTIwcHg7CiAgb3BhY2l0eTogMS4wOyAKfQoKLyp2aWV3cyovCiNmaWxlcyBzcGFuIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICB0ZXh0LWluZGVudDogMTBweDsKfQojZmlsZXMgLm5hbWUgewogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KI2ZpbGVzIC5pY29uIC5uYW1lIHsKICB0ZXh0LWluZGVudDogMjhweDsKfQoKLyp0aWxlcyovCi52aWV3LXRpbGVzIC5uYW1lIHsKICB3aWR0aDogMTAwJTsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA4cHggNXB4Owp9Ci52aWV3LXRpbGVzIC5zaXplLAoudmlldy10aWxlcyAuZGF0ZSB7CiAgZGlzcGxheTogbm9uZTsKfQoKLypkZXRhaWxzKi8KdWwjZmlsZXMudmlldy1kZXRhaWxzIGxpIHsKICBmbG9hdDogbm9uZTsKICBkaXNwbGF5OiBibG9jazsKICB3aWR0aDogOTAlOwp9CnVsI2ZpbGVzLnZpZXctZGV0YWlscyBsaS5oZWFkZXIgewogIGhlaWdodDogMjVweDsKICBiYWNrZ3JvdW5kOiAjMDAwOwogIGNvbG9yOiAjZmZmOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci52aWV3LWRldGFpbHMgLmhlYWRlciB7CiAgYm9yZGVyLXJhZGl1czogNXB4Owp9Ci52aWV3LWRldGFpbHMgLm5hbWUgewogIHdpZHRoOiA2MCU7CiAgYmFja2dyb3VuZC1wb3NpdGlvbjogOHB4IDVweDsKfQoudmlldy1kZXRhaWxzIC5zaXplIHsKICB3aWR0aDogMTAlOwp9Ci52aWV3LWRldGFpbHMgLmRhdGUgewogIHdpZHRoOiAzMCU7Cn0KLnZpZXctZGV0YWlscyAuc2l6ZSwKLnZpZXctZGV0YWlscyAuZGF0ZSB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgZGlyZWN0aW9uOiBydGw7Cn0KCi8qbW9iaWxlKi8KQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgYm9keSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBsaW5lLWhlaWdodDogMTZweDsKICAgIHBhZGRpbmc6IDA7CiAgfQogICNzZWFyY2ggewogICAgcG9zaXRpb246IHN0YXRpYzsKICAgIHdpZHRoOiAxMDAlOwogICAgZm9udC1zaXplOiAyZW07CiAgICBsaW5lLWhlaWdodDogMS44ZW07CiAgICB0ZXh0LWluZGVudDogMTBweDsKICAgIGJvcmRlcjogMDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICBwYWRkaW5nOiAxMHB4IDA7CiAgICBtYXJnaW46IDA7CiAgfQogICNzZWFyY2g6Zm9jdXMgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXI6IDA7CiAgICBvcGFjaXR5OiAxOwogIH0KICAuZGlyZWN0b3J5IGgxIHsKICAgIGZvbnQtc2l6ZTogMmVtOwogICAgbGluZS1oZWlnaHQ6IDEuNWVtOwogICAgY29sb3I6ICNmZmY7CiAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgcGFkZGluZzogMTVweCAxMHB4OwogICAgbWFyZ2luOiAwOwogIH0KICB1bCNmaWxlcyB7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2NhY2FjYTsKICB9CiAgdWwjZmlsZXMgbGkgewogICAgZmxvYXQ6IG5vbmU7CiAgICB3aWR0aDogYXV0byAhaW1wb3J0YW50OwogICAgZGlzcGxheTogYmxvY2s7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NhY2FjYTsKICAgIGZvbnQtc2l6ZTogMmVtOwogICAgbGluZS1oZWlnaHQ6IDEuMmVtOwogICAgdGV4dC1pbmRlbnQ6IDA7CiAgICBtYXJnaW46IDA7CiAgfQogIHVsI2ZpbGVzIGxpOm50aC1jaGlsZChvZGQpIHsKICAgIGJhY2tncm91bmQ6ICNlMGUwZTA7CiAgfQogIHVsI2ZpbGVzIGxpIGEgewogICAgaGVpZ2h0OiBhdXRvOwogICAgYm9yZGVyOiAwOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIHBhZGRpbmc6IDE1cHggMTBweDsKICB9CiAgdWwjZmlsZXMgbGkgYTpmb2N1cywKICB1bCNmaWxlcyBsaSBhOmhvdmVyIHsKICAgIGJvcmRlcjogMDsKICB9CiAgI2ZpbGVzIC5oZWFkZXIsCiAgI2ZpbGVzIC5zaXplLAogICNmaWxlcyAuZGF0ZSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgfQogICNmaWxlcyAubmFtZSB7CiAgICBmbG9hdDogbm9uZTsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgdGV4dC1pbmRlbnQ6IDA7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDUwJTsKICB9CiAgI2ZpbGVzIC5pY29uIC5uYW1lIHsKICAgIHRleHQtaW5kZW50OiA0MXB4OwogIH0KfQojZmlsZXMgLmljb24tZGlyZWN0b3J5IC5uYW1lIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQVd0UVRGUkZBQUFBL1BQUTlOaGMycTQwMnFRMTJxczIvUFRYMnBnMTJwODErL0xNODlORTlkdG8ycTgyKy9mcDJyTTIycVkzOWQ2VSsvYm8ycW8yL2ZyeC92ejMycTgxMnFzMTJxRTI3OVNVOGM0dzlOWlArL0xLLy8zNjdzOXk3czkyNWNwMC92enc5dDkyLy8zNDJwbzIvdnoyNXMxNTc5QjYrT1NPMmJRMC92Nzk5TnlUOHRFNzlkbGQ4TXNtK09yQy92eng3OUtBMklZczdzNkk5ZDZSNGNKZTkrT0YvUExJL2ZyeTc5T0YvdjMwLy8zMjh0V0I4OVJKOGM5cDhjMHU5ZUNmLy83Kzl0eHM2c3RzNU1kcisrKzUrdTJ6L3ZydisvZnE2Y0Z6OGRCczh0QTU3Y3BxK09hVTl1R3MyN1k4Ly83OTlOZFgvUGJZOXVCODl1bkovL3oxNHNOZitlbWgrZW1rK3ZEYyt1eXM5K09MOGRKeTg5TkgrZWljOHRONStPYVYrT1dSOU4ybjlkdGw5dDUyOStLRjkrR0I5TnVlOU5kVTh0Ui85dDV5ODlxVzlkcGo4OWlPODllRy92dnUycFExMlk0ei92enkySWN0L3Z2djQ4ZHIvdnp6NHNOZy8vLysySWd0eTNQcXdRQUFBQUYwVWs1VEFFRG0yR1lBQUFDdFNVUkJWQmpUWTJBZ0EyaVlsSldWaGZvaEJQZzB5eDM4eTkyZFMwcEtWT1ZCQXFJaTZzYjJ2c1dXcGZyRmVUSThRQUVoWVFFdGEyOG5Dd00xT1ZsZVpxQ0FtS0NFa1Vkd1lXbWhRbkZlT1N0UWdMOWN5U3FrTk5ESFZKR2JpWTBGS0NDdVl1WVNHUnNWNUtnanhjWElBUlJRTm5jTmowOUpUZ3F3MFpia1pBY0s1THVGSmFSbVpxZkhlTm5wU3VjREJRb2lFdE95Y25JejRxSTliZlVLUUE2cEtLcUFncUlLUXlLOEJnQVo1eWZPRG1uSHJRQUFBQUJKUlU1RXJrSmdnZz09KTsKfQojZmlsZXMgLmljb24tdGV4dCAubmFtZSB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBUUFBQUMxK2pmcUFBQUFCR2RCVFVFQUFLL0lOd1dLNlFBQUFCbDBSVmgwVTI5bWRIZGhjbVVBUVdSdlltVWdTVzFoWjJWU1pXRmtlWEhKWlR3QUFBRG9TVVJCVkJnWkJjRXhibE5CR0FiQTJjZWVnVFJCdUlLT2dpaWhTWk5UY0M1TFVIQWloTkpSMGtHS0NEY1lKWTZEMy83N01kT2luVHZ6QWdDdzh5c1RoSXZuL1Zvakl5TWpJeVBQK2JTMXNVUUlWMnM5NXBCRER2bWJQL21ka2Z0ODN0cFlndVpxNUpoL09lYVloK3l6eThoVEh2TmxheE5OY3ptK2xhOU9UbGFyMVVkQS8rQzJBNHRyUkNuRDNqUzhCQjFvYnEyR2s2R1U2UWJRQVM0QlVhWVNRQWY0YmhoS0tURmRBenJBT3dBeEVVQUgrS0VNMDFTWTNnTTZ3QnNFQVFCMGdKK21hWm9DM2dJNmlQWWFBSUJKc2lSbUhVMEFBTE9lRkMzYUsyY1dBQUNVWGU3K0F3TzBsYzllVEhZVEFBQUFBRWxGVGtTdVFtQ0MpOwp9CiNmaWxlcyAuaWNvbi1kZWZhdWx0IC5uYW1lIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FRQUFBQzEramZxQUFBQUJHZEJUVUVBQUsvSU53V0s2UUFBQUJsMFJWaDBVMjltZEhkaGNtVUFRV1J2WW1VZ1NXMWhaMlZTWldGa2VYSEpaVHdBQUFDNFNVUkJWQ2pQZFpGYkRzSWdFRVducnNNbTdvR0dmWnJvaHh2VStJcTFUeWpVNjBCZjFwYWM0WWM1WVM0WkF0R1dCTWsvZHJRQk9Wd0psWnJXWWtMaHNCOFVWOUswQlVyUEd5OWNXYm5nMkN0RUVVbUxHcHBQalJ3cGJpeFVLSEJpWlJTMHArWkdodnM0aXJORXZXRDhoZUhwYnN5RFh6blBoWUZPeVRqSmMxM29sSXF6WkNIQm91RTBGUk1VakErczFnVGphUmdWRnBxUndDOG1mb1hQUEVWUFM3TGJSYUpMMnk3Yk9pZlJDVEVsaTNVN0JNV2dMektsVy9DdWViWlBBQUFBQUVsRlRrU3VRbUNDKTsKfQo8L3N0eWxlPgogICAgPHNjcmlwdD4KICAgICAgZnVuY3Rpb24gJChpZCl7CiAgICAgICAgdmFyIGVsID0gJ3N0cmluZycgPT0gdHlwZW9mIGlkCiAgICAgICAgICA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKQogICAgICAgICAgOiBpZDsKCiAgICAgICAgZWwub24gPSBmdW5jdGlvbihldmVudCwgZm4pewogICAgICAgICAgaWYgKCdjb250ZW50IGxvYWRlZCcgPT0gZXZlbnQpIHsKICAgICAgICAgICAgZXZlbnQgPSB3aW5kb3cuYXR0YWNoRXZlbnQgPyAibG9hZCIgOiAiRE9NQ29udGVudExvYWRlZCI7CiAgICAgICAgICB9CiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyCiAgICAgICAgICAgID8gZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZm4sIGZhbHNlKQogICAgICAgICAgICA6IGVsLmF0dGFjaEV2ZW50KCJvbiIgKyBldmVudCwgZm4pOwogICAgICAgIH07CgogICAgICAgIGVsLmFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKXsKICAgICAgICAgIHJldHVybiAkKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTsKICAgICAgICB9OwoKICAgICAgICBlbC5lYWNoID0gZnVuY3Rpb24oZm4pewogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgICAgIGZuKCQoZWxbaV0pLCBpKTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBlbC5nZXRDbGFzc2VzID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnY2xhc3MnKS5zcGxpdCgvXHMrLyk7CiAgICAgICAgfTsKCiAgICAgICAgZWwuYWRkQ2xhc3MgPSBmdW5jdGlvbihuYW1lKXsKICAgICAgICAgIHZhciBjbGFzc2VzID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2NsYXNzJyk7CiAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgY2xhc3NlcwogICAgICAgICAgICA/IGNsYXNzZXMgKyAnICcgKyBuYW1lCiAgICAgICAgICAgIDogbmFtZSk7CiAgICAgICAgfTsKCiAgICAgICAgZWwucmVtb3ZlQ2xhc3MgPSBmdW5jdGlvbihuYW1lKXsKICAgICAgICAgIHZhciBjbGFzc2VzID0gdGhpcy5nZXRDbGFzc2VzKCkuZmlsdGVyKGZ1bmN0aW9uKGN1cnIpewogICAgICAgICAgICByZXR1cm4gY3VyciAhPSBuYW1lOwogICAgICAgICAgfSk7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBjbGFzc2VzLmpvaW4oJyAnKSk7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIGVsOwogICAgICB9CgogICAgICBmdW5jdGlvbiBzZWFyY2goKSB7CiAgICAgICAgdmFyIHN0ciA9ICQoJ3NlYXJjaCcpLnZhbHVlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgdmFyIGxpbmtzID0gJCgnZmlsZXMnKS5hbGwoJ2EnKTsKCiAgICAgICAgbGlua3MuZWFjaChmdW5jdGlvbihsaW5rKXsKICAgICAgICAgIHZhciB0ZXh0ID0gbGluay50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgIGlmICgnLi4nID09IHRleHQpIHJldHVybjsKICAgICAgICAgIGlmIChzdHIubGVuZ3RoICYmIH50ZXh0LmluZGV4T2Yoc3RyKSkgewogICAgICAgICAgICBsaW5rLmFkZENsYXNzKCdoaWdobGlnaHQnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxpbmsucmVtb3ZlQ2xhc3MoJ2hpZ2hsaWdodCcpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICAkKHdpbmRvdykub24oJ2NvbnRlbnQgbG9hZGVkJywgZnVuY3Rpb24oKXsKICAgICAgICAkKCdzZWFyY2gnKS5vbigna2V5dXAnLCBzZWFyY2gpOwogICAgICB9KTsKICAgIDwvc2NyaXB0PgogIDwvaGVhZD4KICA8Ym9keSBjbGFzcz0iZGlyZWN0b3J5Ij4KICAgIDxpbnB1dCBpZD0ic2VhcmNoIiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iU2VhcmNoIiBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgIDxkaXYgaWQ9IndyYXBwZXIiPgogICAgICA8aDE+PGEgaHJlZj0iLiI+fjwvYT4gLyA8YSBocmVmPSIiPmZ0cDwvYT4gLyA8L2gxPgogICAgICA8dWwgaWQ9ImZpbGVzIiBjbGFzcz0idmlldy10aWxlcyI+PGxpPjxhIGhyZWY9InF1YXJhbnRpbmUiIGNsYXNzPSJpY29uIGljb24tZGlyZWN0b3J5IiB0aXRsZT0icXVhcmFudGluZSI+PHNwYW4gY2xhc3M9Im5hbWUiPnF1YXJhbnRpbmU8L3NwYW4+PHNwYW4gY2xhc3M9InNpemUiPjwvc3Bhbj48c3BhbiBjbGFzcz0iZGF0ZSI+My83LzIwMjYgMToyOTozMCBQTTwvc3Bhbj48L2E+PC9saT4KPGxpPjxhIGhyZWY9ImFjcXVpc2l0aW9ucy5tZCIgY2xhc3M9Imljb24gaWNvbiBpY29uLW1kIGljb24tdGV4dCIgdGl0bGU9ImFjcXVpc2l0aW9ucy5tZCI+PHNwYW4gY2xhc3M9Im5hbWUiPmFjcXVpc2l0aW9ucy5tZDwvc3Bhbj48c3BhbiBjbGFzcz0ic2l6ZSI+OTA5PC9zcGFuPjxzcGFuIGNsYXNzPSJkYXRlIj4zLzcvMjAyNiAxOjI5OjMwIFBNPC9zcGFuPjwvYT48L2xpPgo8bGk+PGEgaHJlZj0iYW5ub3VuY2VtZW50X2VuY3J5cHRlZC5tZCIgY2xhc3M9Imljb24gaWNvbiBpY29uLW1kIGljb24tdGV4dCIgdGl0bGU9ImFubm91bmNlbWVudF9lbmNyeXB0ZWQubWQiPjxzcGFuIGNsYXNzPSJuYW1lIj5hbm5vdW5jZW1lbnRfZW5jcnlwdGVkLm1kPC9zcGFuPjxzcGFuIGNsYXNzPSJzaXplIj4zNjkyMzc8L3NwYW4+PHNwYW4gY2xhc3M9ImRhdGUiPjMvNy8yMDI2IDE6Mjk6MzAgUE08L3NwYW4+PC9hPjwvbGk+CjxsaT48YSBocmVmPSJjb3Vwb25zXzIwMTMubWQuYmFrIiBjbGFzcz0iaWNvbiBpY29uIGljb24tYmFrIGljb24tZGVmYXVsdCIgdGl0bGU9ImNvdXBvbnNfMjAxMy5tZC5iYWsiPjxzcGFuIGNsYXNzPSJuYW1lIj5jb3Vwb25zXzIwMTMubWQuYmFrPC9zcGFuPjxzcGFuIGNsYXNzPSJzaXplIj4xMzE8L3NwYW4+PHNwYW4gY2xhc3M9ImRhdGUiPjMvNy8yMDI2IDE6Mjk6MzAgUE08L3NwYW4+PC9hPjwvbGk+CjxsaT48YSBocmVmPSJlYXN0ZXJlLmdnIiBjbGFzcz0iaWNvbiBpY29uIGljb24tZ2cgaWNvbi1kZWZhdWx0IiB0aXRsZT0iZWFzdGVyZS5nZyI+PHNwYW4gY2xhc3M9Im5hbWUiPmVhc3RlcmUuZ2c8L3NwYW4+PHNwYW4gY2xhc3M9InNpemUiPjMyNDwvc3Bhbj48c3BhbiBjbGFzcz0iZGF0ZSI+My83LzIwMjYgMToyOTozMCBQTTwvc3Bhbj48L2E+PC9saT4KPGxpPjxhIGhyZWY9ImVuY3J5cHQucHljIiBjbGFzcz0iaWNvbiBpY29uIGljb24tcHljIGljb24tZGVmYXVsdCIgdGl0bGU9ImVuY3J5cHQucHljIj48c3BhbiBjbGFzcz0ibmFtZSI+ZW5jcnlwdC5weWM8L3NwYW4+PHNwYW4gY2xhc3M9InNpemUiPjU3Mzwvc3Bhbj48c3BhbiBjbGFzcz0iZGF0ZSI+My83LzIwMjYgMToyOTozMCBQTTwvc3Bhbj48L2E+PC9saT4KPGxpPjxhIGhyZWY9ImluY2lkZW50LXN1cHBvcnQua2RieCIgY2xhc3M9Imljb24gaWNvbiBpY29uLWtkYnggaWNvbi1kZWZhdWx0IiB0aXRsZT0iaW5jaWRlbnQtc3VwcG9ydC5rZGJ4Ij48c3BhbiBjbGFzcz0ibmFtZSI+aW5jaWRlbnQtc3VwcG9ydC5rZGJ4PC9zcGFuPjxzcGFuIGNsYXNzPSJzaXplIj4zMjQ2PC9zcGFuPjxzcGFuIGNsYXNzPSJkYXRlIj4zLzcvMjAyNiAxOjI5OjMwIFBNPC9zcGFuPjwvYT48L2xpPgo8bGk+PGEgaHJlZj0ibGVnYWwubWQiIGNsYXNzPSJpY29uIGljb24gaWNvbi1tZCBpY29uLXRleHQiIHRpdGxlPSJsZWdhbC5tZCI+PHNwYW4gY2xhc3M9Im5hbWUiPmxlZ2FsLm1kPC9zcGFuPjxzcGFuIGNsYXNzPSJzaXplIj4zMDQ3PC9zcGFuPjxzcGFuIGNsYXNzPSJkYXRlIj40LzUvMjAyNiA1OjMxOjM3IEFNPC9zcGFuPjwvYT48L2xpPgo8bGk+PGEgaHJlZj0icGFja2FnZS1sb2NrLmpzb24uYmFrIiBjbGFzcz0iaWNvbiBpY29uIGljb24tYmFrIGljb24tZGVmYXVsdCIgdGl0bGU9InBhY2thZ2UtbG9jay5qc29uLmJhayI+PHNwYW4gY2xhc3M9Im5hbWUiPnBhY2thZ2UtbG9jay5qc29uLmJhazwvc3Bhbj48c3BhbiBjbGFzcz0ic2l6ZSI+NzUwMzUzPC9zcGFuPjxzcGFuIGNsYXNzPSJkYXRlIj4zLzcvMjAyNiAxOjI5OjMwIFBNPC9zcGFuPjwvYT48L2xpPgo8bGk+PGEgaHJlZj0icGFja2FnZS5qc29uLmJhayIgY2xhc3M9Imljb24gaWNvbiBpY29uLWJhayBpY29uLWRlZmF1bHQiIHRpdGxlPSJwYWNrYWdlLmpzb24uYmFrIj48c3BhbiBjbGFzcz0ibmFtZSI+cGFja2FnZS5qc29uLmJhazwvc3Bhbj48c3BhbiBjbGFzcz0ic2l6ZSI+NDI5MTwvc3Bhbj48c3BhbiBjbGFzcz0iZGF0ZSI+My83LzIwMjYgMToyOTozMCBQTTwvc3Bhbj48L2E+PC9saT4KPGxpPjxhIGhyZWY9InN1c3BpY2lvdXNfZXJyb3JzLnltbCIgY2xhc3M9Imljb24gaWNvbiBpY29uLXltbCBpY29uLXRleHQiIHRpdGxlPSJzdXNwaWNpb3VzX2Vycm9ycy55bWwiPjxzcGFuIGNsYXNzPSJuYW1lIj5zdXNwaWNpb3VzX2Vycm9ycy55bWw8L3NwYW4+PHNwYW4gY2xhc3M9InNpemUiPjcyMzwvc3Bhbj48c3BhbiBjbGFzcz0iZGF0ZSI+My83LzIwMjYgMToyOTozMCBQTTwvc3Bhbj48L2E+PC9saT48L3VsPgogICAgPC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+","response_hash":"12b09578b8324b9763349dded59b923f347a63fde8ddf248c20cc7cdddb8343b","response_time_ms":0,"response_words":971,"has_response":true,"response_title":"listing directory /ftp/","parameters":[{"name":"1","value":"ftp","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":8}],"sent_at":"2026-04-05T05:33:08.38711Z","received_at":"2026-04-05T05:33:08.38711Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"92f26e37-0c49-495b-a66c-b6afbdf2794d","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/chunk-BBQJZN7H.js","url":"http://localhost:3000/chunk-BBQJZN7H.js","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9jaHVuay1CQlFKWk43SC5qcyBIVFRQLzEuMQ0KSG9zdDogbG9jYWxob3N0OjMwMDANCg0K","request_hash":"665287863b1d17d85bdca7a1bd6d0c7e2a0698648545361f6270afa5341937c3","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["application/javascript; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Etag":["W/\"39a15-19cc8900a68\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sat, 07 Mar 2026 13:50:09 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"application/javascript; charset=UTF-8","response_content_length":236053,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoNCkNhY2hlLUNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0wDQpFdGFnOiBXLyIzOWExNS0xOWNjODkwMGE2OCINCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KTGFzdC1Nb2RpZmllZDogU2F0LCAwNyBNYXIgMjAyNiAxMzo1MDowOSBHTVQNClgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTg0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PVVURi04DQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjMyIEdNVA0KRmVhdHVyZS1Qb2xpY3k6IHBheW1lbnQgJ3NlbGYnDQpWYXJ5OiBBY2NlcHQtRW5jb2RpbmcNClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNClgtUmVjcnVpdGluZzogLyMvam9icw0KQWNjZXB0LVJhbmdlczogYnl0ZXMNCg0KaW1wb3J0e2EgYXMgVixiIGFzIEcsZSBhcyBofWZyb20iLi9jaHVuay1UV1pXNUI0NS5qcyI7ZnVuY3Rpb24gVW8oKXtyZXR1cm4gd2F9ZnVuY3Rpb24gR2UoZSl7bGV0IHQ9d2E7cmV0dXJuIHdhPWUsdH1mdW5jdGlvbiBObihlKXtyZXR1cm4gZT09PUVmfHxlPy5uYW1lPT09Ilx1MDI3NU5vdEZvdW5kIn12YXIgd2EsRWYsQ2E9aCgoKT0+e0VmPVN5bWJvbCgiTm90Rm91bmQiKX0pO2Z1bmN0aW9uIE0oZSl7bGV0IHQ9b2U7cmV0dXJuIG9lPWUsdH1mdW5jdGlvbiBxbygpe3JldHVybiBvZX1mdW5jdGlvbiAkdChlKXtpZigkbyl0aHJvdyBuZXcgRXJyb3IoIiIpO2lmKG9lPT09bnVsbClyZXR1cm47b2UuY29uc3VtZXJPblNpZ25hbFJlYWQoZSk7bGV0IHQ9b2UucHJvZHVjZXJzVGFpbDtpZih0IT09dm9pZCAwJiZ0LnByb2R1Y2VyPT09ZSlyZXR1cm47bGV0IG4scj1vZS5yZWNvbXB1dGluZztpZihyJiYobj10IT09dm9pZCAwP3QubmV4dFByb2R1Y2VyOm9lLnByb2R1Y2VycyxuIT09dm9pZCAwJiZuLnByb2R1Y2VyPT09ZSkpe29lLnByb2R1Y2Vyc1RhaWw9bixuLmxhc3RSZWFkVmVyc2lvbj1lLnZlcnNpb247cmV0dXJufWxldCBvPWUuY29uc3VtZXJzVGFpbDtpZihvIT09dm9pZCAwJiZvLmNvbnN1bWVyPT09b2UmJighcnx8bUQobyxvZSkpKXJldHVybjtsZXQgaT1BbihvZSkscz17cHJvZHVjZXI6ZSxjb25zdW1lcjpvZSxuZXh0UHJvZHVjZXI6bixwcmV2Q29uc3VtZXI6byxsYXN0UmVhZFZlcnNpb246ZS52ZXJzaW9uLG5leHRDb25zdW1lcjp2b2lkIDB9O29lLnByb2R1Y2Vyc1RhaWw9cyx0IT09dm9pZCAwP3QubmV4dFByb2R1Y2VyPXM6b2UucHJvZHVjZXJzPXMsaSYmYmYoZSxzKX1mdW5jdGlvbiBJZigpe2JhKyt9ZnVuY3Rpb24gWm8oZSl7aWYoIShBbihlKSYmIWUuZGlydHkpJiYhKCFlLmRpcnR5JiZlLmxhc3RDbGVhbkVwb2NoPT09YmEpKXtpZighZS5wcm9kdWNlck11c3RSZWNvbXB1dGUoZSkmJiFHdChlKSl7V28oZSk7cmV0dXJufWUucHJvZHVjZXJSZWNvbXB1dGVWYWx1ZShlKSxXbyhlKX19ZnVuY3Rpb24gVGEoZSl7aWYoZS5jb25zdW1lcnM9PT12b2lkIDApcmV0dXJuO2xldCB0PSRvOyRvPSEwO3RyeXtmb3IobGV0IG49ZS5jb25zdW1lcnM7biE9PXZvaWQgMDtuPW4ubmV4dENvbnN1bWVyKXtsZXQgcj1uLmNvbnN1bWVyO3IuZGlydHl8fGdEKHIpfX1maW5hbGx5eyRvPXR9fWZ1bmN0aW9uIF9hKCl7cmV0dXJuIG9lPy5jb25zdW1lckFsbG93U2lnbmFsV3JpdGVzIT09ITF9ZnVuY3Rpb24gZ0QoZSl7ZS5kaXJ0eT0hMCxUYShlKSxlLmNvbnN1bWVyTWFya2VkRGlydHk/LihlKX1mdW5jdGlvbiBXbyhlKXtlLmRpcnR5PSExLGUubGFzdENsZWFuRXBvY2g9YmF9ZnVuY3Rpb24gQ3QoZSl7cmV0dXJuIGUmJndmKGUpLE0oZSl9ZnVuY3Rpb24gd2YoZSl7ZS5wcm9kdWNlcnNUYWlsPXZvaWQgMCxlLnJlY29tcHV0aW5nPSEwfWZ1bmN0aW9uIHp0KGUsdCl7TSh0KSxlJiZDZihlKX1mdW5jdGlvbiBDZihlKXtlLnJlY29tcHV0aW5nPSExO2xldCB0PWUucHJvZHVjZXJzVGFpbCxuPXQhPT12b2lkIDA/dC5uZXh0UHJvZHVjZXI6ZS5wcm9kdWNlcnM7aWYobiE9PXZvaWQgMCl7aWYoQW4oZSkpZG8gbj1NYShuKTt3aGlsZShuIT09dm9pZCAwKTt0IT09dm9pZCAwP3QubmV4dFByb2R1Y2VyPXZvaWQgMDplLnByb2R1Y2Vycz12b2lkIDB9fWZ1bmN0aW9uIEd0KGUpe2ZvcihsZXQgdD1lLnByb2R1Y2Vyczt0IT09dm9pZCAwO3Q9dC5uZXh0UHJvZHVjZXIpe2xldCBuPXQucHJvZHVjZXIscj10Lmxhc3RSZWFkVmVyc2lvbjtpZihyIT09bi52ZXJzaW9ufHwoWm8obiksciE9PW4udmVyc2lvbikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gYnQoZSl7aWYoQW4oZSkpe2xldCB0PWUucHJvZHVjZXJzO2Zvcig7dCE9PXZvaWQgMDspdD1NYSh0KX1lLnByb2R1Y2Vycz12b2lkIDAsZS5wcm9kdWNlcnNUYWlsPXZvaWQgMCxlLmNvbnN1bWVycz12b2lkIDAsZS5jb25zdW1lcnNUYWlsPXZvaWQgMH1mdW5jdGlvbiBiZihlLHQpe2xldCBuPWUuY29uc3VtZXJzVGFpbCxyPUFuKGUpO2lmKG4hPT12b2lkIDA/KHQubmV4dENvbnN1bWVyPW4ubmV4dENvbnN1bWVyLG4ubmV4dENvbnN1bWVyPXQpOih0Lm5leHRDb25zdW1lcj12b2lkIDAsZS5jb25zdW1lcnM9dCksdC5wcmV2Q29uc3VtZXI9bixlLmNvbnN1bWVyc1RhaWw9dCwhcilmb3IobGV0IG89ZS5wcm9kdWNlcnM7byE9PXZvaWQgMDtvPW8ubmV4dFByb2R1Y2VyKWJmKG8ucHJvZHVjZXIsbyl9ZnVuY3Rpb24gTWEoZSl7bGV0IHQ9ZS5wcm9kdWNlcixuPWUubmV4dFByb2R1Y2VyLHI9ZS5uZXh0Q29uc3VtZXIsbz1lLnByZXZDb25zdW1lcjtpZihlLm5leHRDb25zdW1lcj12b2lkIDAsZS5wcmV2Q29uc3VtZXI9dm9pZCAwLHIhPT12b2lkIDA/ci5wcmV2Q29uc3VtZXI9bzp0LmNvbnN1bWVyc1RhaWw9byxvIT09dm9pZCAwKW8ubmV4dENvbnN1bWVyPXI7ZWxzZSBpZih0LmNvbnN1bWVycz1yLCFBbih0KSl7bGV0IGk9dC5wcm9kdWNlcnM7Zm9yKDtpIT09dm9pZCAwOylpPU1hKGkpfXJldHVybiBufWZ1bmN0aW9uIEFuKGUpe3JldHVybiBlLmNvbnN1bWVySXNBbHdheXNMaXZlfHxlLmNvbnN1bWVycyE9PXZvaWQgMH1mdW5jdGlvbiBZbyhlKXtoRD8uKGUpfWZ1bmN0aW9uIG1EKGUsdCl7bGV0IG49dC5wcm9kdWNlcnNUYWlsO2lmKG4hPT12b2lkIDApe2xldCByPXQucHJvZHVjZXJzO2Rve2lmKHI9PT1lKXJldHVybiEwO2lmKHI9PT1uKWJyZWFrO3I9ci5uZXh0UHJvZHVjZXJ9d2hpbGUociE9PXZvaWQgMCl9cmV0dXJuITF9ZnVuY3Rpb24gUW8oZSx0KXtyZXR1cm4gT2JqZWN0LmlzKGUsdCl9ZnVuY3Rpb24gTXIoZSx0KXtsZXQgbj1PYmplY3QuY3JlYXRlKHlEKTtuLmNvbXB1dGF0aW9uPWUsdCE9PXZvaWQgMCYmKG4uZXF1YWw9dCk7bGV0IHI9KCk9PntpZihabyhuKSwkdChuKSxuLnZhbHVlPT09X3IpdGhyb3cgbi5lcnJvcjtyZXR1cm4gbi52YWx1ZX07cmV0dXJuIHJbWF09bixZbyhuKSxyfWZ1bmN0aW9uIHZEKCl7dGhyb3cgbmV3IEVycm9yfWZ1bmN0aW9uIF9mKGUpe1RmKGUpfWZ1bmN0aW9uIFNhKGUpe1RmPWV9ZnVuY3Rpb24gTmEoZSx0KXtsZXQgbj1PYmplY3QuY3JlYXRlKFNyKTtuLnZhbHVlPWUsdCE9PXZvaWQgMCYmKG4uZXF1YWw9dCk7bGV0IHI9KCk9Pk1mKG4pO3JldHVybiByW1hdPW4sWW8obiksW3Iscz0+eG4obixzKSxzPT5BYShuLHMpXX1mdW5jdGlvbiBNZihlKXtyZXR1cm4gJHQoZSksZS52YWx1ZX1mdW5jdGlvbiB4bihlLHQpe19hKCl8fF9mKGUpLGUuZXF1YWwoZS52YWx1ZSx0KXx8KGUudmFsdWU9dCxFRChlKSl9ZnVuY3Rpb24gQWEoZSx0KXtfYSgpfHxfZihlKSx4bihlLHQoZS52YWx1ZSkpfWZ1bmN0aW9uIEVEKGUpe2UudmVyc2lvbisrLElmKCksVGEoZSksREQ/LihlKX12YXIgb2UsJG8sYmEsaEQsWCxVdCx6byxHbyxfcix5RCxUZixERCxTcixXdD1oKCgpPT57b2U9bnVsbCwkbz0hMSxiYT0xLGhEPW51bGwsWD1TeW1ib2woIlNJR05BTCIpO1V0PXt2ZXJzaW9uOjAsbGFzdENsZWFuRXBvY2g6MCxkaXJ0eTohMSxwcm9kdWNlcnM6dm9pZCAwLHByb2R1Y2Vyc1RhaWw6dm9pZCAwLGNvbnN1bWVyczp2b2lkIDAsY29uc3VtZXJzVGFpbDp2b2lkIDAscmVjb21wdXRpbmc6ITEsY29uc3VtZXJBbGxvd1NpZ25hbFdyaXRlczohMSxjb25zdW1lcklzQWx3YXlzTGl2ZTohMSxraW5kOiJ1bmtub3duIixwcm9kdWNlck11c3RSZWNvbXB1dGU6KCk9PiExLHByb2R1Y2VyUmVjb21wdXRlVmFsdWU6KCk9Pnt9LGNvbnN1bWVyTWFya2VkRGlydHk6KCk9Pnt9LGNvbnN1bWVyT25TaWduYWxSZWFkOigpPT57fX07em89U3ltYm9sKCJVTlNFVCIpLEdvPVN5bWJvbCgiQ09NUFVUSU5HIiksX3I9U3ltYm9sKCJFUlJPUkVEIikseUQ9RyhWKHt9LFV0KSx7dmFsdWU6em8sZGlydHk6ITAsZXJyb3I6bnVsbCxlcXVhbDpRbyxraW5kOiJjb21wdXRlZCIscHJvZHVjZXJNdXN0UmVjb21wdXRlKGUpe3JldHVybiBlLnZhbHVlPT09em98fGUudmFsdWU9PT1Hb30scHJvZHVjZXJSZWNvbXB1dGVWYWx1ZShlKXtpZihlLnZhbHVlPT09R28pdGhyb3cgbmV3IEVycm9yKCIiKTtsZXQgdD1lLnZhbHVlO2UudmFsdWU9R287bGV0IG49Q3QoZSkscixvPSExO3RyeXtyPWUuY29tcHV0YXRpb24oKSxNKG51bGwpLG89dCE9PXpvJiZ0IT09X3ImJnIhPT1fciYmZS5lcXVhbCh0LHIpfWNhdGNoKGkpe3I9X3IsZS5lcnJvcj1pfWZpbmFsbHl7enQoZSxuKX1pZihvKXtlLnZhbHVlPXQ7cmV0dXJufWUudmFsdWU9cixlLnZlcnNpb24rK319KTtUZj12RDtERD1udWxsO1NyPUcoVih7fSxVdCkse2VxdWFsOlFvLHZhbHVlOnZvaWQgMCxraW5kOiJzaWduYWwifSl9KTtmdW5jdGlvbiBiKGUpe3JldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uIn12YXIgSz1oKCgpPT57fSk7ZnVuY3Rpb24gUm4oZSl7bGV0IG49ZShyPT57RXJyb3IuY2FsbChyKSxyLnN0YWNrPW5ldyBFcnJvcigpLnN0YWNrfSk7cmV0dXJuIG4ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxuLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1uLG59dmFyIEtvPWgoKCk9Pnt9KTt2YXIgSm8sU2Y9aCgoKT0+e0tvKCk7Sm89Um4oZT0+ZnVuY3Rpb24obil7ZSh0aGlzKSx0aGlzLm1lc3NhZ2U9bj9gJHtuLmxlbmd0aH0gZXJyb3JzIG9jY3VycmVkIGR1cmluZyB1bnN1YnNjcmlwdGlvbjoKJHtuLm1hcCgocixvKT0+YCR7bysxfSkgJHtyLnRvU3RyaW5nKCl9YCkuam9pbihgCiAgYCl9YDoiIix0aGlzLm5hbWU9IlVuc3Vic2NyaXB0aW9uRXJyb3IiLHRoaXMuZXJyb3JzPW59KX0pO2Z1bmN0aW9uIHF0KGUsdCl7aWYoZSl7bGV0IG49ZS5pbmRleE9mKHQpOzA8PW4mJmUuc3BsaWNlKG4sMSl9fXZhciBYbz1oKCgpPT57fSk7ZnVuY3Rpb24gZWkoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBXfHxlJiYiY2xvc2VkImluIGUmJmIoZS5yZW1vdmUpJiZiKGUuYWRkKSYmYihlLnVuc3Vic2NyaWJlKX1mdW5jdGlvbiBOZihlKXtiKGUpP2UoKTplLnVuc3Vic2NyaWJlKCl9dmFyIFcseGEsVHQ9aCgoKT0+e0soKTtTZigpO1hvKCk7Vz1jbGFzcyBle2NvbnN0cnVjdG9yKHQpe3RoaXMuaW5pdGlhbFRlYXJkb3duPXQsdGhpcy5jbG9zZWQ9ITEsdGhpcy5fcGFyZW50YWdlPW51bGwsdGhpcy5fZmluYWxpemVycz1udWxsfXVuc3Vic2NyaWJlKCl7bGV0IHQ7aWYoIXRoaXMuY2xvc2VkKXt0aGlzLmNsb3NlZD0hMDtsZXR7X3BhcmVudGFnZTpufT10aGlzO2lmKG4paWYodGhpcy5fcGFyZW50YWdlPW51bGwsQXJyYXkuaXNBcnJheShuKSlmb3IobGV0IGkgb2YgbilpLnJlbW92ZSh0aGlzKTtlbHNlIG4ucmVtb3ZlKHRoaXMpO2xldHtpbml0aWFsVGVhcmRvd246cn09dGhpcztpZihiKHIpKXRyeXtyKCl9Y2F0Y2goaSl7dD1pIGluc3RhbmNlb2YgSm8/aS5lcnJvcnM6W2ldfWxldHtfZmluYWxpemVyczpvfT10aGlzO2lmKG8pe3RoaXMuX2ZpbmFsaXplcnM9bnVsbDtmb3IobGV0IGkgb2Ygbyl0cnl7TmYoaSl9Y2F0Y2gocyl7dD10Pz9bXSxzIGluc3RhbmNlb2YgSm8/dD1bLi4udCwuLi5zLmVycm9yc106dC5wdXNoKHMpfX1pZih0KXRocm93IG5ldyBKbyh0KX19YWRkKHQpe3ZhciBuO2lmKHQmJnQhPT10aGlzKWlmKHRoaXMuY2xvc2VkKU5mKHQpO2Vsc2V7aWYodCBpbnN0YW5jZW9mIGUpe2lmKHQuY2xvc2VkfHx0Ll9oYXNQYXJlbnQodGhpcykpcmV0dXJuO3QuX2FkZFBhcmVudCh0aGlzKX0odGhpcy5fZmluYWxpemVycz0obj10aGlzLl9maW5hbGl6ZXJzKSE9PW51bGwmJm4hPT12b2lkIDA/bjpbXSkucHVzaCh0KX19X2hhc1BhcmVudCh0KXtsZXR7X3BhcmVudGFnZTpufT10aGlzO3JldHVybiBuPT09dHx8QXJyYXkuaXNBcnJheShuKSYmbi5pbmNsdWRlcyh0KX1fYWRkUGFyZW50KHQpe2xldHtfcGFyZW50YWdlOm59PXRoaXM7dGhpcy5fcGFyZW50YWdlPUFycmF5LmlzQXJyYXkobik/KG4ucHVzaCh0KSxuKTpuP1tuLHRdOnR9X3JlbW92ZVBhcmVudCh0KXtsZXR7X3BhcmVudGFnZTpufT10aGlzO249PT10P3RoaXMuX3BhcmVudGFnZT1udWxsOkFycmF5LmlzQXJyYXkobikmJnF0KG4sdCl9cmVtb3ZlKHQpe2xldHtfZmluYWxpemVyczpufT10aGlzO24mJnF0KG4sdCksdCBpbnN0YW5jZW9mIGUmJnQuX3JlbW92ZVBhcmVudCh0aGlzKX19O1cuRU1QVFk9KCgpPT57bGV0IGU9bmV3IFc7cmV0dXJuIGUuY2xvc2VkPSEwLGV9KSgpO3hhPVcuRU1QVFl9KTt2YXIgUmUsTnI9aCgoKT0+e1JlPXtvblVuaGFuZGxlZEVycm9yOm51bGwsb25TdG9wcGVkTm90aWZpY2F0aW9uOm51bGwsUHJvbWlzZTp2b2lkIDAsdXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZzohMSx1c2VEZXByZWNhdGVkTmV4dENvbnRleHQ6ITF9fSk7dmFyIE9uLFJhPWgoKCk9PntPbj17c2V0VGltZW91dChlLHQsLi4ubil7bGV0e2RlbGVnYXRlOnJ9PU9uO3JldHVybiByPy5zZXRUaW1lb3V0P3Iuc2V0VGltZW91dChlLHQsLi4ubik6c2V0VGltZW91dChlLHQsLi4ubil9LGNsZWFyVGltZW91dChlKXtsZXR7ZGVsZWdhdGU6dH09T247cmV0dXJuKHQ/LmNsZWFyVGltZW91dHx8Y2xlYXJUaW1lb3V0KShlKX0sZGVsZWdhdGU6dm9pZCAwfX0pO2Z1bmN0aW9uIHRpKGUpe09uLnNldFRpbWVvdXQoKCk9PntsZXR7b25VbmhhbmRsZWRFcnJvcjp0fT1SZTtpZih0KXQoZSk7ZWxzZSB0aHJvdyBlfSl9dmFyIE9hPWgoKCk9PntOcigpO1JhKCl9KTtmdW5jdGlvbiBadCgpe312YXIgbmk9aCgoKT0+e30pO2Z1bmN0aW9uIHhmKGUpe3JldHVybiBGYSgiRSIsdm9pZCAwLGUpfWZ1bmN0aW9uIFJmKGUpe3JldHVybiBGYSgiTiIsZSx2b2lkIDApfWZ1bmN0aW9uIEZhKGUsdCxuKXtyZXR1cm57a2luZDplLHZhbHVlOnQsZXJyb3I6bn19dmFyIEFmLE9mPWgoKCk9PntBZj1GYSgiQyIsdm9pZCAwLHZvaWQgMCl9KTtmdW5jdGlvbiBGbihlKXtpZihSZS51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKXtsZXQgdD0hWXQ7aWYodCYmKFl0PXtlcnJvclRocm93bjohMSxlcnJvcjpudWxsfSksZSgpLHQpe2xldHtlcnJvclRocm93bjpuLGVycm9yOnJ9PVl0O2lmKFl0PW51bGwsbil0aHJvdyByfX1lbHNlIGUoKX1mdW5jdGlvbiBGZihlKXtSZS51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nJiZZdCYmKFl0LmVycm9yVGhyb3duPSEwLFl0LmVycm9yPWUpfXZhciBZdCxyaT1oKCgpPT57TnIoKTtZdD1udWxsfSk7ZnVuY3Rpb24ga2EoZSx0KXtyZXR1cm4gSUQuY2FsbChlLHQpfWZ1bmN0aW9uIG9pKGUpe1JlLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmc/RmYoZSk6dGkoZSl9ZnVuY3Rpb24gd0QoZSl7dGhyb3cgZX1mdW5jdGlvbiBQYShlLHQpe2xldHtvblN0b3BwZWROb3RpZmljYXRpb246bn09UmU7biYmT24uc2V0VGltZW91dCgoKT0+bihlLHQpKX12YXIgUXQsSUQsTGEsT2UsQ0QsQXI9aCgoKT0+e0soKTtUdCgpO05yKCk7T2EoKTtuaSgpO09mKCk7UmEoKTtyaSgpO1F0PWNsYXNzIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNTdG9wcGVkPSExLHQ/KHRoaXMuZGVzdGluYXRpb249dCxlaSh0KSYmdC5hZGQodGhpcykpOnRoaXMuZGVzdGluYXRpb249Q0R9c3RhdGljIGNyZWF0ZSh0LG4scil7cmV0dXJuIG5ldyBPZSh0LG4scil9bmV4dCh0KXt0aGlzLmlzU3RvcHBlZD9QYShSZih0KSx0aGlzKTp0aGlzLl9uZXh0KHQpfWVycm9yKHQpe3RoaXMuaXNTdG9wcGVkP1BhKHhmKHQpLHRoaXMpOih0aGlzLmlzU3RvcHBlZD0hMCx0aGlzLl9lcnJvcih0KSl9Y29tcGxldGUoKXt0aGlzLmlzU3RvcHBlZD9QYShBZix0aGlzKToodGhpcy5pc1N0b3BwZWQ9ITAsdGhpcy5fY29tcGxldGUoKSl9dW5zdWJzY3JpYmUoKXt0aGlzLmNsb3NlZHx8KHRoaXMuaXNTdG9wcGVkPSEwLHN1cGVyLnVuc3Vic2NyaWJlKCksdGhpcy5kZXN0aW5hdGlvbj1udWxsKX1fbmV4dCh0KXt0aGlzLmRlc3RpbmF0aW9uLm5leHQodCl9X2Vycm9yKHQpe3RyeXt0aGlzLmRlc3RpbmF0aW9uLmVycm9yKHQpfWZpbmFsbHl7dGhpcy51bnN1YnNjcmliZSgpfX1fY29tcGxldGUoKXt0cnl7dGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpfWZpbmFsbHl7dGhpcy51bnN1YnNjcmliZSgpfX19LElEPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kO0xhPWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMucGFydGlhbE9ic2VydmVyPXR9bmV4dCh0KXtsZXR7cGFydGlhbE9ic2VydmVyOm59PXRoaXM7aWYobi5uZXh0KXRyeXtuLm5leHQodCl9Y2F0Y2gocil7b2kocil9fWVycm9yKHQpe2xldHtwYXJ0aWFsT2JzZXJ2ZXI6bn09dGhpcztpZihuLmVycm9yKXRyeXtuLmVycm9yKHQpfWNhdGNoKHIpe29pKHIpfWVsc2Ugb2kodCl9Y29tcGxldGUoKXtsZXR7cGFydGlhbE9ic2VydmVyOnR9PXRoaXM7aWYodC5jb21wbGV0ZSl0cnl7dC5jb21wbGV0ZSgpfWNhdGNoKG4pe29pKG4pfX19LE9lPWNsYXNzIGV4dGVuZHMgUXR7Y29uc3RydWN0b3IodCxuLHIpe3N1cGVyKCk7bGV0IG87aWYoYih0KXx8IXQpbz17bmV4dDp0Pz92b2lkIDAsZXJyb3I6bj8/dm9pZCAwLGNvbXBsZXRlOnI/P3ZvaWQgMH07ZWxzZXtsZXQgaTt0aGlzJiZSZS51c2VEZXByZWNhdGVkTmV4dENvbnRleHQ/KGk9T2JqZWN0LmNyZWF0ZSh0KSxpLnVuc3Vic2NyaWJlPSgpPT50aGlzLnVuc3Vic2NyaWJlKCksbz17bmV4dDp0Lm5leHQmJmthKHQubmV4dCxpKSxlcnJvcjp0LmVycm9yJiZrYSh0LmVycm9yLGkpLGNvbXBsZXRlOnQuY29tcGxldGUmJmthKHQuY29tcGxldGUsaSl9KTpvPXR9dGhpcy5kZXN0aW5hdGlvbj1uZXcgTGEobyl9fTtDRD17Y2xvc2VkOiEwLG5leHQ6WnQsZXJyb3I6d0QsY29tcGxldGU6WnR9fSk7dmFyIGtuLGlpPWgoKCk9Pntrbj10eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZTeW1ib2wub2JzZXJ2YWJsZXx8IkBAb2JzZXJ2YWJsZSJ9KTtmdW5jdGlvbiB1ZShlKXtyZXR1cm4gZX12YXIgX3Q9aCgoKT0+e30pO2Z1bmN0aW9uIGJEKC4uLmUpe3JldHVybiBqYShlKX1mdW5jdGlvbiBqYShlKXtyZXR1cm4gZS5sZW5ndGg9PT0wP3VlOmUubGVuZ3RoPT09MT9lWzBdOmZ1bmN0aW9uKG4pe3JldHVybiBlLnJlZHVjZSgocixvKT0+byhyKSxuKX19dmFyIEJhPWgoKCk9PntfdCgpfSk7ZnVuY3Rpb24ga2YoZSl7dmFyIHQ7cmV0dXJuKHQ9ZT8/UmUuUHJvbWlzZSkhPT1udWxsJiZ0IT09dm9pZCAwP3Q6UHJvbWlzZX1mdW5jdGlvbiBURChlKXtyZXR1cm4gZSYmYihlLm5leHQpJiZiKGUuZXJyb3IpJiZiKGUuY29tcGxldGUpfWZ1bmN0aW9uIF9EKGUpe3JldHVybiBlJiZlIGluc3RhbmNlb2YgUXR8fFREKGUpJiZlaShlKX12YXIgUixpZT1oKCgpPT57QXIoKTtUdCgpO2lpKCk7QmEoKTtOcigpO0soKTtyaSgpO1I9KCgpPT57Y2xhc3MgZXtjb25zdHJ1Y3RvcihuKXtuJiYodGhpcy5fc3Vic2NyaWJlPW4pfWxpZnQobil7bGV0IHI9bmV3IGU7cmV0dXJuIHIuc291cmNlPXRoaXMsci5vcGVyYXRvcj1uLHJ9c3Vic2NyaWJlKG4scixvKXtsZXQgaT1fRChuKT9uOm5ldyBPZShuLHIsbyk7cmV0dXJuIEZuKCgpPT57bGV0e29wZXJhdG9yOnMsc291cmNlOmF9PXRoaXM7aS5hZGQocz9zLmNhbGwoaSxhKTphP3RoaXMuX3N1YnNjcmliZShpKTp0aGlzLl90cnlTdWJzY3JpYmUoaSkpfSksaX1fdHJ5U3Vic2NyaWJlKG4pe3RyeXtyZXR1cm4gdGhpcy5fc3Vic2NyaWJlKG4pfWNhdGNoKHIpe24uZXJyb3Iocil9fWZvckVhY2gobixyKXtyZXR1cm4gcj1rZihyKSxuZXcgcigobyxpKT0+e2xldCBzPW5ldyBPZSh7bmV4dDphPT57dHJ5e24oYSl9Y2F0Y2goYyl7aShjKSxzLnVuc3Vic2NyaWJlKCl9fSxlcnJvcjppLGNvbXBsZXRlOm99KTt0aGlzLnN1YnNjcmliZShzKX0pfV9zdWJzY3JpYmUobil7dmFyIHI7cmV0dXJuKHI9dGhpcy5zb3VyY2UpPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5zdWJzY3JpYmUobil9W2tuXSgpe3JldHVybiB0aGlzfXBpcGUoLi4ubil7cmV0dXJuIGphKG4pKHRoaXMpfXRvUHJvbWlzZShuKXtyZXR1cm4gbj1rZihuKSxuZXcgbigocixvKT0+e2xldCBpO3RoaXMuc3Vic2NyaWJlKHM9Pmk9cyxzPT5vKHMpLCgpPT5yKGkpKX0pfX1yZXR1cm4gZS5jcmVhdGU9dD0+bmV3IGUodCksZX0pKCl9KTtmdW5jdGlvbiBWYShlKXtyZXR1cm4gYihlPy5saWZ0KX1mdW5jdGlvbiBfKGUpe3JldHVybiB0PT57aWYoVmEodCkpcmV0dXJuIHQubGlmdChmdW5jdGlvbihuKXt0cnl7cmV0dXJuIGUobix0aGlzKX1jYXRjaChyKXt0aGlzLmVycm9yKHIpfX0pO3Rocm93IG5ldyBUeXBlRXJyb3IoIlVuYWJsZSB0byBsaWZ0IHVua25vd24gT2JzZXJ2YWJsZSB0eXBlIil9fXZhciBqPWgoKCk9PntLKCl9KTtmdW5jdGlvbiBTKGUsdCxuLHIsbyl7cmV0dXJuIG5ldyBIYShlLHQsbixyLG8pfXZhciBIYSwkPWgoKCk9PntBcigpO0hhPWNsYXNzIGV4dGVuZHMgUXR7Y29uc3RydWN0b3IodCxuLHIsbyxpLHMpe3N1cGVyKHQpLHRoaXMub25GaW5hbGl6ZT1pLHRoaXMuc2hvdWxkVW5zdWJzY3JpYmU9cyx0aGlzLl9uZXh0PW4/ZnVuY3Rpb24oYSl7dHJ5e24oYSl9Y2F0Y2goYyl7dC5lcnJvcihjKX19OnN1cGVyLl9uZXh0LHRoaXMuX2Vycm9yPW8/ZnVuY3Rpb24oYSl7dHJ5e28oYSl9Y2F0Y2goYyl7dC5lcnJvcihjKX1maW5hbGx5e3RoaXMudW5zdWJzY3JpYmUoKX19OnN1cGVyLl9lcnJvcix0aGlzLl9jb21wbGV0ZT1yP2Z1bmN0aW9uKCl7dHJ5e3IoKX1jYXRjaChhKXt0LmVycm9yKGEpfWZpbmFsbHl7dGhpcy51bnN1YnNjcmliZSgpfX06c3VwZXIuX2NvbXBsZXRlfXVuc3Vic2NyaWJlKCl7dmFyIHQ7aWYoIXRoaXMuc2hvdWxkVW5zdWJzY3JpYmV8fHRoaXMuc2hvdWxkVW5zdWJzY3JpYmUoKSl7bGV0e2Nsb3NlZDpufT10aGlzO3N1cGVyLnVuc3Vic2NyaWJlKCksIW4mJigodD10aGlzLm9uRmluYWxpemUpPT09bnVsbHx8dD09PXZvaWQgMHx8dC5jYWxsKHRoaXMpKX19fX0pO2Z1bmN0aW9uIFVhKCl7cmV0dXJuIF8oKGUsdCk9PntsZXQgbj1udWxsO2UuX3JlZkNvdW50Kys7bGV0IHI9Uyh0LHZvaWQgMCx2b2lkIDAsdm9pZCAwLCgpPT57aWYoIWV8fGUuX3JlZkNvdW50PD0wfHwwPC0tZS5fcmVmQ291bnQpe249bnVsbDtyZXR1cm59bGV0IG89ZS5fY29ubmVjdGlvbixpPW47bj1udWxsLG8mJighaXx8bz09PWkpJiZvLnVuc3Vic2NyaWJlKCksdC51bnN1YnNjcmliZSgpfSk7ZS5zdWJzY3JpYmUociksci5jbG9zZWR8fChuPWUuY29ubmVjdCgpKX0pfXZhciAkYT1oKCgpPT57aigpOyQoKX0pO3ZhciB6YSxQZj1oKCgpPT57aWUoKTtUdCgpOyRhKCk7JCgpO2ooKTt6YT1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IodCxuKXtzdXBlcigpLHRoaXMuc291cmNlPXQsdGhpcy5zdWJqZWN0RmFjdG9yeT1uLHRoaXMuX3N1YmplY3Q9bnVsbCx0aGlzLl9yZWZDb3VudD0wLHRoaXMuX2Nvbm5lY3Rpb249bnVsbCxWYSh0KSYmKHRoaXMubGlmdD10LmxpZnQpfV9zdWJzY3JpYmUodCl7cmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLnN1YnNjcmliZSh0KX1nZXRTdWJqZWN0KCl7bGV0IHQ9dGhpcy5fc3ViamVjdDtyZXR1cm4oIXR8fHQuaXNTdG9wcGVkKSYmKHRoaXMuX3N1YmplY3Q9dGhpcy5zdWJqZWN0RmFjdG9yeSgpKSx0aGlzLl9zdWJqZWN0fV90ZWFyZG93bigpe3RoaXMuX3JlZkNvdW50PTA7bGV0e19jb25uZWN0aW9uOnR9PXRoaXM7dGhpcy5fc3ViamVjdD10aGlzLl9jb25uZWN0aW9uPW51bGwsdD8udW5zdWJzY3JpYmUoKX1jb25uZWN0KCl7bGV0IHQ9dGhpcy5fY29ubmVjdGlvbjtpZighdCl7dD10aGlzLl9jb25uZWN0aW9uPW5ldyBXO2xldCBuPXRoaXMuZ2V0U3ViamVjdCgpO3QuYWRkKHRoaXMuc291cmNlLnN1YnNjcmliZShTKG4sdm9pZCAwLCgpPT57dGhpcy5fdGVhcmRvd24oKSxuLmNvbXBsZXRlKCl9LHI9Pnt0aGlzLl90ZWFyZG93bigpLG4uZXJyb3Iocil9LCgpPT50aGlzLl90ZWFyZG93bigpKSkpLHQuY2xvc2VkJiYodGhpcy5fY29ubmVjdGlvbj1udWxsLHQ9Vy5FTVBUWSl9cmV0dXJuIHR9cmVmQ291bnQoKXtyZXR1cm4gVWEoKSh0aGlzKX19fSk7dmFyIFBuLExmPWgoKCk9PntUdCgpO1BuPXtzY2hlZHVsZShlKXtsZXQgdD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUsbj1jYW5jZWxBbmltYXRpb25GcmFtZSx7ZGVsZWdhdGU6cn09UG47ciYmKHQ9ci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUsbj1yLmNhbmNlbEFuaW1hdGlvbkZyYW1lKTtsZXQgbz10KGk9PntuPXZvaWQgMCxlKGkpfSk7cmV0dXJuIG5ldyBXKCgpPT5uPy4obykpfSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoLi4uZSl7bGV0e2RlbGVnYXRlOnR9PVBuO3JldHVybih0Py5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHJlcXVlc3RBbmltYXRpb25GcmFtZSkoLi4uZSl9LGNhbmNlbEFuaW1hdGlvbkZyYW1lKC4uLmUpe2xldHtkZWxlZ2F0ZTp0fT1QbjtyZXR1cm4odD8uY2FuY2VsQW5pbWF0aW9uRnJhbWV8fGNhbmNlbEFuaW1hdGlvbkZyYW1lKSguLi5lKX0sZGVsZWdhdGU6dm9pZCAwfX0pO3ZhciBqZixCZj1oKCgpPT57S28oKTtqZj1SbihlPT5mdW5jdGlvbigpe2UodGhpcyksdGhpcy5uYW1lPSJPYmplY3RVbnN1YnNjcmliZWRFcnJvciIsdGhpcy5tZXNzYWdlPSJvYmplY3QgdW5zdWJzY3JpYmVkIn0pfSk7dmFyIGdlLHNpLHhyPWgoKCk9PntpZSgpO1R0KCk7QmYoKTtYbygpO3JpKCk7Z2U9KCgpPT57Y2xhc3MgZSBleHRlbmRzIFJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuY2xvc2VkPSExLHRoaXMuY3VycmVudE9ic2VydmVycz1udWxsLHRoaXMub2JzZXJ2ZXJzPVtdLHRoaXMuaXNTdG9wcGVkPSExLHRoaXMuaGFzRXJyb3I9ITEsdGhpcy50aHJvd25FcnJvcj1udWxsfWxpZnQobil7bGV0IHI9bmV3IHNpKHRoaXMsdGhpcyk7cmV0dXJuIHIub3BlcmF0b3I9bixyfV90aHJvd0lmQ2xvc2VkKCl7aWYodGhpcy5jbG9zZWQpdGhyb3cgbmV3IGpmfW5leHQobil7Rm4oKCk9PntpZih0aGlzLl90aHJvd0lmQ2xvc2VkKCksIXRoaXMuaXNTdG9wcGVkKXt0aGlzLmN1cnJlbnRPYnNlcnZlcnN8fCh0aGlzLmN1cnJlbnRPYnNlcnZlcnM9QXJyYXkuZnJvbSh0aGlzLm9ic2VydmVycykpO2ZvcihsZXQgciBvZiB0aGlzLmN1cnJlbnRPYnNlcnZlcnMpci5uZXh0KG4pfX0pfWVycm9yKG4pe0ZuKCgpPT57aWYodGhpcy5fdGhyb3dJZkNsb3NlZCgpLCF0aGlzLmlzU3RvcHBlZCl7dGhpcy5oYXNFcnJvcj10aGlzLmlzU3RvcHBlZD0hMCx0aGlzLnRocm93bkVycm9yPW47bGV0e29ic2VydmVyczpyfT10aGlzO2Zvcig7ci5sZW5ndGg7KXIuc2hpZnQoKS5lcnJvcihuKX19KX1jb21wbGV0ZSgpe0ZuKCgpPT57aWYodGhpcy5fdGhyb3dJZkNsb3NlZCgpLCF0aGlzLmlzU3RvcHBlZCl7dGhpcy5pc1N0b3BwZWQ9ITA7bGV0e29ic2VydmVyczpufT10aGlzO2Zvcig7bi5sZW5ndGg7KW4uc2hpZnQoKS5jb21wbGV0ZSgpfX0pfXVuc3Vic2NyaWJlKCl7dGhpcy5pc1N0b3BwZWQ9dGhpcy5jbG9zZWQ9ITAsdGhpcy5vYnNlcnZlcnM9dGhpcy5jdXJyZW50T2JzZXJ2ZXJzPW51bGx9Z2V0IG9ic2VydmVkKCl7dmFyIG47cmV0dXJuKChuPXRoaXMub2JzZXJ2ZXJzKT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4ubGVuZ3RoKT4wfV90cnlTdWJzY3JpYmUobil7cmV0dXJuIHRoaXMuX3Rocm93SWZDbG9zZWQoKSxzdXBlci5fdHJ5U3Vic2NyaWJlKG4pfV9zdWJzY3JpYmUobil7cmV0dXJuIHRoaXMuX3Rocm93SWZDbG9zZWQoKSx0aGlzLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzKG4pLHRoaXMuX2lubmVyU3Vic2NyaWJlKG4pfV9pbm5lclN1YnNjcmliZShuKXtsZXR7aGFzRXJyb3I6cixpc1N0b3BwZWQ6byxvYnNlcnZlcnM6aX09dGhpcztyZXR1cm4gcnx8bz94YToodGhpcy5jdXJyZW50T2JzZXJ2ZXJzPW51bGwsaS5wdXNoKG4pLG5ldyBXKCgpPT57dGhpcy5jdXJyZW50T2JzZXJ2ZXJzPW51bGwscXQoaSxuKX0pKX1fY2hlY2tGaW5hbGl6ZWRTdGF0dXNlcyhuKXtsZXR7aGFzRXJyb3I6cix0aHJvd25FcnJvcjpvLGlzU3RvcHBlZDppfT10aGlzO3I/bi5lcnJvcihvKTppJiZuLmNvbXBsZXRlKCl9YXNPYnNlcnZhYmxlKCl7bGV0IG49bmV3IFI7cmV0dXJuIG4uc291cmNlPXRoaXMsbn19cmV0dXJuIGUuY3JlYXRlPSh0LG4pPT5uZXcgc2kodCxuKSxlfSkoKSxzaT1jbGFzcyBleHRlbmRzIGdle2NvbnN0cnVjdG9yKHQsbil7c3VwZXIoKSx0aGlzLmRlc3RpbmF0aW9uPXQsdGhpcy5zb3VyY2U9bn1uZXh0KHQpe3ZhciBuLHI7KHI9KG49dGhpcy5kZXN0aW5hdGlvbik9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLm5leHQpPT09bnVsbHx8cj09PXZvaWQgMHx8ci5jYWxsKG4sdCl9ZXJyb3IodCl7dmFyIG4scjsocj0obj10aGlzLmRlc3RpbmF0aW9uKT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4uZXJyb3IpPT09bnVsbHx8cj09PXZvaWQgMHx8ci5jYWxsKG4sdCl9Y29tcGxldGUoKXt2YXIgdCxuOyhuPSh0PXRoaXMuZGVzdGluYXRpb24pPT09bnVsbHx8dD09PXZvaWQgMD92b2lkIDA6dC5jb21wbGV0ZSk9PT1udWxsfHxuPT09dm9pZCAwfHxuLmNhbGwodCl9X3N1YnNjcmliZSh0KXt2YXIgbixyO3JldHVybihyPShuPXRoaXMuc291cmNlKT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4uc3Vic2NyaWJlKHQpKSE9PW51bGwmJnIhPT12b2lkIDA/cjp4YX19fSk7dmFyIFJyLFZmPWgoKCk9Pnt4cigpO1JyPWNsYXNzIGV4dGVuZHMgZ2V7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl92YWx1ZT10fWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLmdldFZhbHVlKCl9X3N1YnNjcmliZSh0KXtsZXQgbj1zdXBlci5fc3Vic2NyaWJlKHQpO3JldHVybiFuLmNsb3NlZCYmdC5uZXh0KHRoaXMuX3ZhbHVlKSxufWdldFZhbHVlKCl7bGV0e2hhc0Vycm9yOnQsdGhyb3duRXJyb3I6bixfdmFsdWU6cn09dGhpcztpZih0KXRocm93IG47cmV0dXJuIHRoaXMuX3Rocm93SWZDbG9zZWQoKSxyfW5leHQodCl7c3VwZXIubmV4dCh0aGlzLl92YWx1ZT10KX19fSk7dmFyIE9yLEdhPWgoKCk9PntPcj17bm93KCl7cmV0dXJuKE9yLmRlbGVnYXRlfHxEYXRlKS5ub3coKX0sZGVsZWdhdGU6dm9pZCAwfX0pO3ZhciBGcixXYT1oKCgpPT57eHIoKTtHYSgpO0ZyPWNsYXNzIGV4dGVuZHMgZ2V7Y29uc3RydWN0b3IodD0xLzAsbj0xLzAscj1Pcil7c3VwZXIoKSx0aGlzLl9idWZmZXJTaXplPXQsdGhpcy5fd2luZG93VGltZT1uLHRoaXMuX3RpbWVzdGFtcFByb3ZpZGVyPXIsdGhpcy5fYnVmZmVyPVtdLHRoaXMuX2luZmluaXRlVGltZVdpbmRvdz0hMCx0aGlzLl9pbmZpbml0ZVRpbWVXaW5kb3c9bj09PTEvMCx0aGlzLl9idWZmZXJTaXplPU1hdGgubWF4KDEsdCksdGhpcy5fd2luZG93VGltZT1NYXRoLm1heCgxLG4pfW5leHQodCl7bGV0e2lzU3RvcHBlZDpuLF9idWZmZXI6cixfaW5maW5pdGVUaW1lV2luZG93Om8sX3RpbWVzdGFtcFByb3ZpZGVyOmksX3dpbmRvd1RpbWU6c309dGhpcztufHwoci5wdXNoKHQpLCFvJiZyLnB1c2goaS5ub3coKStzKSksdGhpcy5fdHJpbUJ1ZmZlcigpLHN1cGVyLm5leHQodCl9X3N1YnNjcmliZSh0KXt0aGlzLl90aHJvd0lmQ2xvc2VkKCksdGhpcy5fdHJpbUJ1ZmZlcigpO2xldCBuPXRoaXMuX2lubmVyU3Vic2NyaWJlKHQpLHtfaW5maW5pdGVUaW1lV2luZG93OnIsX2J1ZmZlcjpvfT10aGlzLGk9by5zbGljZSgpO2ZvcihsZXQgcz0wO3M8aS5sZW5ndGgmJiF0LmNsb3NlZDtzKz1yPzE6Mil0Lm5leHQoaVtzXSk7cmV0dXJuIHRoaXMuX2NoZWNrRmluYWxpemVkU3RhdHVzZXModCksbn1fdHJpbUJ1ZmZlcigpe2xldHtfYnVmZmVyU2l6ZTp0LF90aW1lc3RhbXBQcm92aWRlcjpuLF9idWZmZXI6cixfaW5maW5pdGVUaW1lV2luZG93Om99PXRoaXMsaT0obz8xOjIpKnQ7aWYodDwxLzAmJmk8ci5sZW5ndGgmJnIuc3BsaWNlKDAsci5sZW5ndGgtaSksIW8pe2xldCBzPW4ubm93KCksYT0wO2ZvcihsZXQgYz0xO2M8ci5sZW5ndGgmJnJbY108PXM7Yys9MilhPWM7YSYmci5zcGxpY2UoMCxhKzEpfX19fSk7dmFyIGFpLEhmPWgoKCk9PntUdCgpO2FpPWNsYXNzIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKCl9c2NoZWR1bGUodCxuPTApe3JldHVybiB0aGlzfX19KTt2YXIga3IsVWY9aCgoKT0+e2tyPXtzZXRJbnRlcnZhbChlLHQsLi4ubil7bGV0e2RlbGVnYXRlOnJ9PWtyO3JldHVybiByPy5zZXRJbnRlcnZhbD9yLnNldEludGVydmFsKGUsdCwuLi5uKTpzZXRJbnRlcnZhbChlLHQsLi4ubil9LGNsZWFySW50ZXJ2YWwoZSl7bGV0e2RlbGVnYXRlOnR9PWtyO3JldHVybih0Py5jbGVhckludGVydmFsfHxjbGVhckludGVydmFsKShlKX0sZGVsZWdhdGU6dm9pZCAwfX0pO3ZhciBMbixxYT1oKCgpPT57SGYoKTtVZigpO1hvKCk7TG49Y2xhc3MgZXh0ZW5kcyBhaXtjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKHQsbiksdGhpcy5zY2hlZHVsZXI9dCx0aGlzLndvcms9bix0aGlzLnBlbmRpbmc9ITF9c2NoZWR1bGUodCxuPTApe3ZhciByO2lmKHRoaXMuY2xvc2VkKXJldHVybiB0aGlzO3RoaXMuc3RhdGU9dDtsZXQgbz10aGlzLmlkLGk9dGhpcy5zY2hlZHVsZXI7cmV0dXJuIG8hPW51bGwmJih0aGlzLmlkPXRoaXMucmVjeWNsZUFzeW5jSWQoaSxvLG4pKSx0aGlzLnBlbmRpbmc9ITAsdGhpcy5kZWxheT1uLHRoaXMuaWQ9KHI9dGhpcy5pZCkhPT1udWxsJiZyIT09dm9pZCAwP3I6dGhpcy5yZXF1ZXN0QXN5bmNJZChpLHRoaXMuaWQsbiksdGhpc31yZXF1ZXN0QXN5bmNJZCh0LG4scj0wKXtyZXR1cm4ga3Iuc2V0SW50ZXJ2YWwodC5mbHVzaC5iaW5kKHQsdGhpcykscil9cmVjeWNsZUFzeW5jSWQodCxuLHI9MCl7aWYociE9bnVsbCYmdGhpcy5kZWxheT09PXImJnRoaXMucGVuZGluZz09PSExKXJldHVybiBuO24hPW51bGwmJmtyLmNsZWFySW50ZXJ2YWwobil9ZXhlY3V0ZSh0LG4pe2lmKHRoaXMuY2xvc2VkKXJldHVybiBuZXcgRXJyb3IoImV4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb24iKTt0aGlzLnBlbmRpbmc9ITE7bGV0IHI9dGhpcy5fZXhlY3V0ZSh0LG4pO2lmKHIpcmV0dXJuIHI7dGhpcy5wZW5kaW5nPT09ITEmJnRoaXMuaWQhPW51bGwmJih0aGlzLmlkPXRoaXMucmVjeWNsZUFzeW5jSWQodGhpcy5zY2hlZHVsZXIsdGhpcy5pZCxudWxsKSl9X2V4ZWN1dGUodCxuKXtsZXQgcj0hMSxvO3RyeXt0aGlzLndvcmsodCl9Y2F0Y2goaSl7cj0hMCxvPWl8fG5ldyBFcnJvcigiU2NoZWR1bGVkIGFjdGlvbiB0aHJldyBmYWxzeSBlcnJvciIpfWlmKHIpcmV0dXJuIHRoaXMudW5zdWJzY3JpYmUoKSxvfXVuc3Vic2NyaWJlKCl7aWYoIXRoaXMuY2xvc2VkKXtsZXR7aWQ6dCxzY2hlZHVsZXI6bn09dGhpcyx7YWN0aW9uczpyfT1uO3RoaXMud29yaz10aGlzLnN0YXRlPXRoaXMuc2NoZWR1bGVyPW51bGwsdGhpcy5wZW5kaW5nPSExLHF0KHIsdGhpcyksdCE9bnVsbCYmKHRoaXMuaWQ9dGhpcy5yZWN5Y2xlQXN5bmNJZChuLHQsbnVsbCkpLHRoaXMuZGVsYXk9bnVsbCxzdXBlci51bnN1YnNjcmliZSgpfX19fSk7dmFyIGpuLCRmPWgoKCk9PntHYSgpO2puPWNsYXNzIGV7Y29uc3RydWN0b3IodCxuPWUubm93KXt0aGlzLnNjaGVkdWxlckFjdGlvbkN0b3I9dCx0aGlzLm5vdz1ufXNjaGVkdWxlKHQsbj0wLHIpe3JldHVybiBuZXcgdGhpcy5zY2hlZHVsZXJBY3Rpb25DdG9yKHRoaXMsdCkuc2NoZWR1bGUocixuKX19O2puLm5vdz1Pci5ub3d9KTt2YXIgQm4sWmE9aCgoKT0+eyRmKCk7Qm49Y2xhc3MgZXh0ZW5kcyBqbntjb25zdHJ1Y3Rvcih0LG49am4ubm93KXtzdXBlcih0LG4pLHRoaXMuYWN0aW9ucz1bXSx0aGlzLl9hY3RpdmU9ITF9Zmx1c2godCl7bGV0e2FjdGlvbnM6bn09dGhpcztpZih0aGlzLl9hY3RpdmUpe24ucHVzaCh0KTtyZXR1cm59bGV0IHI7dGhpcy5fYWN0aXZlPSEwO2RvIGlmKHI9dC5leGVjdXRlKHQuc3RhdGUsdC5kZWxheSkpYnJlYWs7d2hpbGUodD1uLnNoaWZ0KCkpO2lmKHRoaXMuX2FjdGl2ZT0hMSxyKXtmb3IoO3Q9bi5zaGlmdCgpOyl0LnVuc3Vic2NyaWJlKCk7dGhyb3cgcn19fX0pO3ZhciB1dCx6ZixWbj1oKCgpPT57cWEoKTtaYSgpO3V0PW5ldyBCbihMbiksemY9dXR9KTt2YXIgY2ksR2Y9aCgoKT0+e3FhKCk7TGYoKTtjaT1jbGFzcyBleHRlbmRzIExue2NvbnN0cnVjdG9yKHQsbil7c3VwZXIodCxuKSx0aGlzLnNjaGVkdWxlcj10LHRoaXMud29yaz1ufXJlcXVlc3RBc3luY0lkKHQsbixyPTApe3JldHVybiByIT09bnVsbCYmcj4wP3N1cGVyLnJlcXVlc3RBc3luY0lkKHQsbixyKToodC5hY3Rpb25zLnB1c2godGhpcyksdC5fc2NoZWR1bGVkfHwodC5fc2NoZWR1bGVkPVBuLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dC5mbHVzaCh2b2lkIDApKSkpfXJlY3ljbGVBc3luY0lkKHQsbixyPTApe3ZhciBvO2lmKHIhPW51bGw/cj4wOnRoaXMuZGVsYXk+MClyZXR1cm4gc3VwZXIucmVjeWNsZUFzeW5jSWQodCxuLHIpO2xldHthY3Rpb25zOml9PXQ7biE9bnVsbCYmbj09PXQuX3NjaGVkdWxlZCYmKChvPWlbaS5sZW5ndGgtMV0pPT09bnVsbHx8bz09PXZvaWQgMD92b2lkIDA6by5pZCkhPT1uJiYoUG4uY2FuY2VsQW5pbWF0aW9uRnJhbWUobiksdC5fc2NoZWR1bGVkPXZvaWQgMCl9fX0pO3ZhciB1aSxXZj1oKCgpPT57WmEoKTt1aT1jbGFzcyBleHRlbmRzIEJue2ZsdXNoKHQpe3RoaXMuX2FjdGl2ZT0hMDtsZXQgbjt0P249dC5pZDoobj10aGlzLl9zY2hlZHVsZWQsdGhpcy5fc2NoZWR1bGVkPXZvaWQgMCk7bGV0e2FjdGlvbnM6cn09dGhpcyxvO3Q9dHx8ci5zaGlmdCgpO2RvIGlmKG89dC5leGVjdXRlKHQuc3RhdGUsdC5kZWxheSkpYnJlYWs7d2hpbGUoKHQ9clswXSkmJnQuaWQ9PT1uJiZyLnNoaWZ0KCkpO2lmKHRoaXMuX2FjdGl2ZT0hMSxvKXtmb3IoOyh0PXJbMF0pJiZ0LmlkPT09biYmci5zaGlmdCgpOyl0LnVuc3Vic2NyaWJlKCk7dGhyb3cgb319fX0pO3ZhciBNRCxxZj1oKCgpPT57R2YoKTtXZigpO01EPW5ldyB1aShjaSl9KTt2YXIgS3QsUHI9aCgoKT0+e2llKCk7S3Q9bmV3IFIoZT0+ZS5jb21wbGV0ZSgpKX0pO2Z1bmN0aW9uIGxpKGUpe3JldHVybiBlJiZiKGUuc2NoZWR1bGUpfXZhciBZYT1oKCgpPT57SygpfSk7ZnVuY3Rpb24gUWEoZSl7cmV0dXJuIGVbZS5sZW5ndGgtMV19ZnVuY3Rpb24gZGkoZSl7cmV0dXJuIGIoUWEoZSkpP2UucG9wKCk6dm9pZCAwfWZ1bmN0aW9uIFdlKGUpe3JldHVybiBsaShRYShlKSk/ZS5wb3AoKTp2b2lkIDB9ZnVuY3Rpb24gWmYoZSx0KXtyZXR1cm4gdHlwZW9mIFFhKGUpPT0ibnVtYmVyIj9lLnBvcCgpOnR9dmFyIEp0PWgoKCk9PntLKCk7WWEoKX0pO2Z1bmN0aW9uIFFmKGUsdCxuLHIpe2Z1bmN0aW9uIG8oaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiBuP2k6bmV3IG4oZnVuY3Rpb24ocyl7cyhpKX0pfXJldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKGZ1bmN0aW9uKGkscyl7ZnVuY3Rpb24gYShsKXt0cnl7dShyLm5leHQobCkpfWNhdGNoKGQpe3MoZCl9fWZ1bmN0aW9uIGMobCl7dHJ5e3Uoci50aHJvdyhsKSl9Y2F0Y2goZCl7cyhkKX19ZnVuY3Rpb24gdShsKXtsLmRvbmU/aShsLnZhbHVlKTpvKGwudmFsdWUpLnRoZW4oYSxjKX11KChyPXIuYXBwbHkoZSx0fHxbXSkpLm5leHQoKSl9KX1mdW5jdGlvbiBZZihlKXt2YXIgdD10eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZTeW1ib2wuaXRlcmF0b3Isbj10JiZlW3RdLHI9MDtpZihuKXJldHVybiBuLmNhbGwoZSk7aWYoZSYmdHlwZW9mIGUubGVuZ3RoPT0ibnVtYmVyIilyZXR1cm57bmV4dDpmdW5jdGlvbigpe3JldHVybiBlJiZyPj1lLmxlbmd0aCYmKGU9dm9pZCAwKSx7dmFsdWU6ZSYmZVtyKytdLGRvbmU6IWV9fX07dGhyb3cgbmV3IFR5cGVFcnJvcih0PyJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLiI6IlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKX1mdW5jdGlvbiBYdChlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIFh0Pyh0aGlzLnY9ZSx0aGlzKTpuZXcgWHQoZSl9ZnVuY3Rpb24gS2YoZSx0LG4pe2lmKCFTeW1ib2wuYXN5bmNJdGVyYXRvcil0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTt2YXIgcj1uLmFwcGx5KGUsdHx8W10pLG8saT1bXTtyZXR1cm4gbz1PYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvcj09ImZ1bmN0aW9uIj9Bc3luY0l0ZXJhdG9yOk9iamVjdCkucHJvdG90eXBlKSxhKCJuZXh0IiksYSgidGhyb3ciKSxhKCJyZXR1cm4iLHMpLG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LG87ZnVuY3Rpb24gcyhmKXtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShnKS50aGVuKGYsZCl9fWZ1bmN0aW9uIGEoZixnKXtyW2ZdJiYob1tmXT1mdW5jdGlvbihJKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oRCxtKXtpLnB1c2goW2YsSSxELG1dKT4xfHxjKGYsSSl9KX0sZyYmKG9bZl09ZyhvW2ZdKSkpfWZ1bmN0aW9uIGMoZixnKXt0cnl7dShyW2ZdKGcpKX1jYXRjaChJKXtwKGlbMF1bM10sSSl9fWZ1bmN0aW9uIHUoZil7Zi52YWx1ZSBpbnN0YW5jZW9mIFh0P1Byb21pc2UucmVzb2x2ZShmLnZhbHVlLnYpLnRoZW4obCxkKTpwKGlbMF1bMl0sZil9ZnVuY3Rpb24gbChmKXtjKCJuZXh0IixmKX1mdW5jdGlvbiBkKGYpe2MoInRocm93IixmKX1mdW5jdGlvbiBwKGYsZyl7ZihnKSxpLnNoaWZ0KCksaS5sZW5ndGgmJmMoaVswXVswXSxpWzBdWzFdKX19ZnVuY3Rpb24gSmYoZSl7aWYoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpO3ZhciB0PWVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdLG47cmV0dXJuIHQ/dC5jYWxsKGUpOihlPXR5cGVvZiBZZj09ImZ1bmN0aW9uIj9ZZihlKTplW1N5bWJvbC5pdGVyYXRvcl0oKSxuPXt9LHIoIm5leHQiKSxyKCJ0aHJvdyIpLHIoInJldHVybiIpLG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LG4pO2Z1bmN0aW9uIHIoaSl7bltpXT1lW2ldJiZmdW5jdGlvbihzKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYSxjKXtzPWVbaV0ocyksbyhhLGMscy5kb25lLHMudmFsdWUpfSl9fWZ1bmN0aW9uIG8oaSxzLGEsYyl7UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4oZnVuY3Rpb24odSl7aSh7dmFsdWU6dSxkb25lOmF9KX0scyl9fXZhciBLYT1oKCgpPT57fSk7dmFyIEhuLGZpPWgoKCk9PntIbj1lPT5lJiZ0eXBlb2YgZS5sZW5ndGg9PSJudW1iZXIiJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIn0pO2Z1bmN0aW9uIHBpKGUpe3JldHVybiBiKGU/LnRoZW4pfXZhciBKYT1oKCgpPT57SygpfSk7ZnVuY3Rpb24gaGkoZSl7cmV0dXJuIGIoZVtrbl0pfXZhciBYYT1oKCgpPT57aWkoKTtLKCl9KTtmdW5jdGlvbiBnaShlKXtyZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3ImJmIoZT8uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSl9dmFyIGVjPWgoKCk9PntLKCl9KTtmdW5jdGlvbiBtaShlKXtyZXR1cm4gbmV3IFR5cGVFcnJvcihgWW91IHByb3ZpZGVkICR7ZSE9PW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0Ij8iYW4gaW52YWxpZCBvYmplY3QiOmAnJHtlfSdgfSB3aGVyZSBhIHN0cmVhbSB3YXMgZXhwZWN0ZWQuIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBSZWFkYWJsZVN0cmVhbSwgQXJyYXksIEFzeW5jSXRlcmFibGUsIG9yIEl0ZXJhYmxlLmApfXZhciB0Yz1oKCgpPT57fSk7ZnVuY3Rpb24gU0QoKXtyZXR1cm4gdHlwZW9mIFN5bWJvbCE9ImZ1bmN0aW9uInx8IVN5bWJvbC5pdGVyYXRvcj8iQEBpdGVyYXRvciI6U3ltYm9sLml0ZXJhdG9yfXZhciB5aSxuYz1oKCgpPT57eWk9U0QoKX0pO2Z1bmN0aW9uIHZpKGUpe3JldHVybiBiKGU/Llt5aV0pfXZhciByYz1oKCgpPT57bmMoKTtLKCl9KTtmdW5jdGlvbiBEaShlKXtyZXR1cm4gS2YodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24qKCl7bGV0IG49ZS5nZXRSZWFkZXIoKTt0cnl7Zm9yKDs7KXtsZXR7dmFsdWU6cixkb25lOm99PXlpZWxkIFh0KG4ucmVhZCgpKTtpZihvKXJldHVybiB5aWVsZCBYdCh2b2lkIDApO3lpZWxkIHlpZWxkIFh0KHIpfX1maW5hbGx5e24ucmVsZWFzZUxvY2soKX19KX1mdW5jdGlvbiBFaShlKXtyZXR1cm4gYihlPy5nZXRSZWFkZXIpfXZhciBJaT1oKCgpPT57S2EoKTtLKCl9KTtmdW5jdGlvbiBPKGUpe2lmKGUgaW5zdGFuY2VvZiBSKXJldHVybiBlO2lmKGUhPW51bGwpe2lmKGhpKGUpKXJldHVybiBORChlKTtpZihIbihlKSlyZXR1cm4gQUQoZSk7aWYocGkoZSkpcmV0dXJuIHhEKGUpO2lmKGdpKGUpKXJldHVybiBYZihlKTtpZih2aShlKSlyZXR1cm4gUkQoZSk7aWYoRWkoZSkpcmV0dXJuIE9EKGUpfXRocm93IG1pKGUpfWZ1bmN0aW9uIE5EKGUpe3JldHVybiBuZXcgUih0PT57bGV0IG49ZVtrbl0oKTtpZihiKG4uc3Vic2NyaWJlKSlyZXR1cm4gbi5zdWJzY3JpYmUodCk7dGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvdmlkZWQgb2JqZWN0IGRvZXMgbm90IGNvcnJlY3RseSBpbXBsZW1lbnQgU3ltYm9sLm9ic2VydmFibGUiKX0pfWZ1bmN0aW9uIEFEKGUpe3JldHVybiBuZXcgUih0PT57Zm9yKGxldCBuPTA7bjxlLmxlbmd0aCYmIXQuY2xvc2VkO24rKyl0Lm5leHQoZVtuXSk7dC5jb21wbGV0ZSgpfSl9ZnVuY3Rpb24geEQoZSl7cmV0dXJuIG5ldyBSKHQ9PntlLnRoZW4obj0+e3QuY2xvc2VkfHwodC5uZXh0KG4pLHQuY29tcGxldGUoKSl9LG49PnQuZXJyb3IobikpLnRoZW4obnVsbCx0aSl9KX1mdW5jdGlvbiBSRChlKXtyZXR1cm4gbmV3IFIodD0+e2ZvcihsZXQgbiBvZiBlKWlmKHQubmV4dChuKSx0LmNsb3NlZClyZXR1cm47dC5jb21wbGV0ZSgpfSl9ZnVuY3Rpb24gWGYoZSl7cmV0dXJuIG5ldyBSKHQ9PntGRChlLHQpLmNhdGNoKG49PnQuZXJyb3IobikpfSl9ZnVuY3Rpb24gT0QoZSl7cmV0dXJuIFhmKERpKGUpKX1mdW5jdGlvbiBGRChlLHQpe3ZhciBuLHIsbyxpO3JldHVybiBRZih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dHJ5e2ZvcihuPUpmKGUpO3I9eWllbGQgbi5uZXh0KCksIXIuZG9uZTspe2xldCBzPXIudmFsdWU7aWYodC5uZXh0KHMpLHQuY2xvc2VkKXJldHVybn19Y2F0Y2gocyl7bz17ZXJyb3I6c319ZmluYWxseXt0cnl7ciYmIXIuZG9uZSYmKGk9bi5yZXR1cm4pJiYoeWllbGQgaS5jYWxsKG4pKX1maW5hbGx5e2lmKG8pdGhyb3cgby5lcnJvcn19dC5jb21wbGV0ZSgpfSl9dmFyIHNlPWgoKCk9PntLYSgpO2ZpKCk7SmEoKTtpZSgpO1hhKCk7ZWMoKTt0YygpO3JjKCk7SWkoKTtLKCk7T2EoKTtpaSgpfSk7ZnVuY3Rpb24gbWUoZSx0LG4scj0wLG89ITEpe2xldCBpPXQuc2NoZWR1bGUoZnVuY3Rpb24oKXtuKCksbz9lLmFkZCh0aGlzLnNjaGVkdWxlKG51bGwscikpOnRoaXMudW5zdWJzY3JpYmUoKX0scik7aWYoZS5hZGQoaSksIW8pcmV0dXJuIGl9dmFyIFVuPWgoKCk9Pnt9KTtmdW5jdGlvbiB3aShlLHQ9MCl7cmV0dXJuIF8oKG4scik9PntuLnN1YnNjcmliZShTKHIsbz0+bWUocixlLCgpPT5yLm5leHQobyksdCksKCk9Pm1lKHIsZSwoKT0+ci5jb21wbGV0ZSgpLHQpLG89Pm1lKHIsZSwoKT0+ci5lcnJvcihvKSx0KSkpfSl9dmFyIG9jPWgoKCk9PntVbigpO2ooKTskKCl9KTtmdW5jdGlvbiBDaShlLHQ9MCl7cmV0dXJuIF8oKG4scik9PntyLmFkZChlLnNjaGVkdWxlKCgpPT5uLnN1YnNjcmliZShyKSx0KSl9KX12YXIgaWM9aCgoKT0+e2ooKX0pO2Z1bmN0aW9uIGVwKGUsdCl7cmV0dXJuIE8oZSkucGlwZShDaSh0KSx3aSh0KSl9dmFyIHRwPWgoKCk9PntzZSgpO29jKCk7aWMoKX0pO2Z1bmN0aW9uIG5wKGUsdCl7cmV0dXJuIE8oZSkucGlwZShDaSh0KSx3aSh0KSl9dmFyIHJwPWgoKCk9PntzZSgpO29jKCk7aWMoKX0pO2Z1bmN0aW9uIG9wKGUsdCl7cmV0dXJuIG5ldyBSKG49PntsZXQgcj0wO3JldHVybiB0LnNjaGVkdWxlKGZ1bmN0aW9uKCl7cj09PWUubGVuZ3RoP24uY29tcGxldGUoKToobi5uZXh0KGVbcisrXSksbi5jbG9zZWR8fHRoaXMuc2NoZWR1bGUoKSl9KX0pfXZhciBpcD1oKCgpPT57aWUoKX0pO2Z1bmN0aW9uIHNwKGUsdCl7cmV0dXJuIG5ldyBSKG49PntsZXQgcjtyZXR1cm4gbWUobix0LCgpPT57cj1lW3lpXSgpLG1lKG4sdCwoKT0+e2xldCBvLGk7dHJ5eyh7dmFsdWU6byxkb25lOml9PXIubmV4dCgpKX1jYXRjaChzKXtuLmVycm9yKHMpO3JldHVybn1pP24uY29tcGxldGUoKTpuLm5leHQobyl9LDAsITApfSksKCk9PmIocj8ucmV0dXJuKSYmci5yZXR1cm4oKX0pfXZhciBhcD1oKCgpPT57aWUoKTtuYygpO0soKTtVbigpfSk7ZnVuY3Rpb24gYmkoZSx0KXtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkl0ZXJhYmxlIGNhbm5vdCBiZSBudWxsIik7cmV0dXJuIG5ldyBSKG49PnttZShuLHQsKCk9PntsZXQgcj1lW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO21lKG4sdCwoKT0+e3IubmV4dCgpLnRoZW4obz0+e28uZG9uZT9uLmNvbXBsZXRlKCk6bi5uZXh0KG8udmFsdWUpfSl9LDAsITApfSl9KX12YXIgc2M9aCgoKT0+e2llKCk7VW4oKX0pO2Z1bmN0aW9uIGNwKGUsdCl7cmV0dXJuIGJpKERpKGUpLHQpfXZhciB1cD1oKCgpPT57c2MoKTtJaSgpfSk7ZnVuY3Rpb24gbHAoZSx0KXtpZihlIT1udWxsKXtpZihoaShlKSlyZXR1cm4gZXAoZSx0KTtpZihIbihlKSlyZXR1cm4gb3AoZSx0KTtpZihwaShlKSlyZXR1cm4gbnAoZSx0KTtpZihnaShlKSlyZXR1cm4gYmkoZSx0KTtpZih2aShlKSlyZXR1cm4gc3AoZSx0KTtpZihFaShlKSlyZXR1cm4gY3AoZSx0KX10aHJvdyBtaShlKX12YXIgZHA9aCgoKT0+e3RwKCk7cnAoKTtpcCgpO2FwKCk7c2MoKTtYYSgpO0phKCk7ZmkoKTtyYygpO2VjKCk7dGMoKTtJaSgpO3VwKCl9KTtmdW5jdGlvbiBxZShlLHQpe3JldHVybiB0P2xwKGUsdCk6TyhlKX12YXIgJG49aCgoKT0+e2RwKCk7c2UoKX0pO2Z1bmN0aW9uIFRpKC4uLmUpe2xldCB0PVdlKGUpO3JldHVybiBxZShlLHQpfXZhciBmcD1oKCgpPT57SnQoKTskbigpfSk7ZnVuY3Rpb24ga0QoZSx0KXtsZXQgbj1iKGUpP2U6KCk9PmUscj1vPT5vLmVycm9yKG4oKSk7cmV0dXJuIG5ldyBSKHQ/bz0+dC5zY2hlZHVsZShyLDAsbyk6cil9dmFyIHBwPWgoKCk9PntpZSgpO0soKX0pO2Z1bmN0aW9uIFBEKGUpe3JldHVybiEhZSYmKGUgaW5zdGFuY2VvZiBSfHxiKGUubGlmdCkmJmIoZS5zdWJzY3JpYmUpKX12YXIgaHA9aCgoKT0+e2llKCk7SygpfSk7dmFyIGx0LHpuPWgoKCk9PntLbygpO2x0PVJuKGU9PmZ1bmN0aW9uKCl7ZSh0aGlzKSx0aGlzLm5hbWU9IkVtcHR5RXJyb3IiLHRoaXMubWVzc2FnZT0ibm8gZWxlbWVudHMgaW4gc2VxdWVuY2UifSl9KTtmdW5jdGlvbiBMRChlLHQpe2xldCBuPXR5cGVvZiB0PT0ib2JqZWN0IjtyZXR1cm4gbmV3IFByb21pc2UoKHIsbyk9PntsZXQgaT1uZXcgT2Uoe25leHQ6cz0+e3IocyksaS51bnN1YnNjcmliZSgpfSxlcnJvcjpvLGNvbXBsZXRlOigpPT57bj9yKHQuZGVmYXVsdFZhbHVlKTpvKG5ldyBsdCl9fSk7ZS5zdWJzY3JpYmUoaSl9KX12YXIgZ3A9aCgoKT0+e3puKCk7QXIoKX0pO2Z1bmN0aW9uIG1wKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZSYmIWlzTmFOKGUpfXZhciB5cD1oKCgpPT57fSk7ZnVuY3Rpb24gbGUoZSx0KXtyZXR1cm4gXygobixyKT0+e2xldCBvPTA7bi5zdWJzY3JpYmUoUyhyLGk9PntyLm5leHQoZS5jYWxsKHQsaSxvKyspKX0pKX0pfXZhciBHbj1oKCgpPT57aigpOyQoKX0pO2Z1bmN0aW9uIEJEKGUsdCl7cmV0dXJuIGpEKHQpP2UoLi4udCk6ZSh0KX1mdW5jdGlvbiBXbihlKXtyZXR1cm4gbGUodD0+QkQoZSx0KSl9dmFyIGpELF9pPWgoKCk9PntHbigpOyh7aXNBcnJheTpqRH09QXJyYXkpfSk7ZnVuY3Rpb24gTWkoZSl7aWYoZS5sZW5ndGg9PT0xKXtsZXQgdD1lWzBdO2lmKFZEKHQpKXJldHVybnthcmdzOnQsa2V5czpudWxsfTtpZih6RCh0KSl7bGV0IG49JEQodCk7cmV0dXJue2FyZ3M6bi5tYXAocj0+dFtyXSksa2V5czpufX19cmV0dXJue2FyZ3M6ZSxrZXlzOm51bGx9fWZ1bmN0aW9uIHpEKGUpe3JldHVybiBlJiZ0eXBlb2YgZT09Im9iamVjdCImJkhEKGUpPT09VUR9dmFyIFZELEhELFVELCRELGFjPWgoKCk9Pnsoe2lzQXJyYXk6VkR9PUFycmF5KSx7Z2V0UHJvdG90eXBlT2Y6SEQscHJvdG90eXBlOlVELGtleXM6JER9PU9iamVjdH0pO2Z1bmN0aW9uIFNpKGUsdCl7cmV0dXJuIGUucmVkdWNlKChuLHIsbyk9PihuW3JdPXRbb10sbikse30pfXZhciBjYz1oKCgpPT57fSk7ZnVuY3Rpb24gR0QoLi4uZSl7bGV0IHQ9V2UoZSksbj1kaShlKSx7YXJnczpyLGtleXM6b309TWkoZSk7aWYoci5sZW5ndGg9PT0wKXJldHVybiBxZShbXSx0KTtsZXQgaT1uZXcgUihXRChyLHQsbz9zPT5TaShvLHMpOnVlKSk7cmV0dXJuIG4/aS5waXBlKFduKG4pKTppfWZ1bmN0aW9uIFdEKGUsdCxuPXVlKXtyZXR1cm4gcj0+e3ZwKHQsKCk9PntsZXR7bGVuZ3RoOm99PWUsaT1uZXcgQXJyYXkobykscz1vLGE9bztmb3IobGV0IGM9MDtjPG87YysrKXZwKHQsKCk9PntsZXQgdT1xZShlW2NdLHQpLGw9ITE7dS5zdWJzY3JpYmUoUyhyLGQ9PntpW2NdPWQsbHx8KGw9ITAsYS0tKSxhfHxyLm5leHQobihpLnNsaWNlKCkpKX0sKCk9PnstLXN8fHIuY29tcGxldGUoKX0pKX0scil9LHIpfX1mdW5jdGlvbiB2cChlLHQsbil7ZT9tZShuLGUsdCk6dCgpfXZhciBEcD1oKCgpPT57aWUoKTthYygpOyRuKCk7X3QoKTtfaSgpO0p0KCk7Y2MoKTskKCk7VW4oKX0pO2Z1bmN0aW9uIE5pKGUsdCxuLHIsbyxpLHMsYSl7bGV0IGM9W10sdT0wLGw9MCxkPSExLHA9KCk9PntkJiYhYy5sZW5ndGgmJiF1JiZ0LmNvbXBsZXRlKCl9LGY9ST0+dTxyP2coSSk6Yy5wdXNoKEkpLGc9ST0+e2kmJnQubmV4dChJKSx1Kys7bGV0IEQ9ITE7TyhuKEksbCsrKSkuc3Vic2NyaWJlKFModCxtPT57bz8uKG0pLGk/ZihtKTp0Lm5leHQobSl9LCgpPT57RD0hMH0sdm9pZCAwLCgpPT57aWYoRCl0cnl7Zm9yKHUtLTtjLmxlbmd0aCYmdTxyOyl7bGV0IG09Yy5zaGlmdCgpO3M/bWUodCxzLCgpPT5nKG0pKTpnKG0pfXAoKX1jYXRjaChtKXt0LmVycm9yKG0pfX0pKX07cmV0dXJuIGUuc3Vic2NyaWJlKFModCxmLCgpPT57ZD0hMCxwKCl9KSksKCk9PnthPy4oKX19dmFyIHVjPWgoKCk9PntzZSgpO1VuKCk7JCgpfSk7ZnVuY3Rpb24gYmUoZSx0LG49MS8wKXtyZXR1cm4gYih0KT9iZSgocixvKT0+bGUoKGkscyk9PnQocixpLG8scykpKE8oZShyLG8pKSksbik6KHR5cGVvZiB0PT0ibnVtYmVyIiYmKG49dCksXygocixvKT0+TmkocixvLGUsbikpKX12YXIgZW49aCgoKT0+e0duKCk7c2UoKTtqKCk7dWMoKTtLKCl9KTtmdW5jdGlvbiBMcihlPTEvMCl7cmV0dXJuIGJlKHVlLGUpfXZhciBBaT1oKCgpPT57ZW4oKTtfdCgpfSk7ZnVuY3Rpb24gRXAoKXtyZXR1cm4gTHIoMSl9dmFyIElwPWgoKCk9PntBaSgpfSk7ZnVuY3Rpb24gcW4oLi4uZSl7cmV0dXJuIEVwKCkocWUoZSxXZShlKSkpfXZhciB4aT1oKCgpPT57SXAoKTtKdCgpOyRuKCl9KTtmdW5jdGlvbiBxRChlKXtyZXR1cm4gbmV3IFIodD0+e08oZSgpKS5zdWJzY3JpYmUodCl9KX12YXIgd3A9aCgoKT0+e2llKCk7c2UoKX0pO2Z1bmN0aW9uIFpEKC4uLmUpe2xldCB0PWRpKGUpLHthcmdzOm4sa2V5czpyfT1NaShlKSxvPW5ldyBSKGk9PntsZXR7bGVuZ3RoOnN9PW47aWYoIXMpe2kuY29tcGxldGUoKTtyZXR1cm59bGV0IGE9bmV3IEFycmF5KHMpLGM9cyx1PXM7Zm9yKGxldCBsPTA7bDxzO2wrKyl7bGV0IGQ9ITE7TyhuW2xdKS5zdWJzY3JpYmUoUyhpLHA9PntkfHwoZD0hMCx1LS0pLGFbbF09cH0sKCk9PmMtLSx2b2lkIDAsKCk9PnsoIWN8fCFkKSYmKHV8fGkubmV4dChyP1NpKHIsYSk6YSksaS5jb21wbGV0ZSgpKX0pKX19KTtyZXR1cm4gdD9vLnBpcGUoV24odCkpOm99dmFyIENwPWgoKCk9PntpZSgpO2FjKCk7c2UoKTtKdCgpOyQoKTtfaSgpO2NjKCl9KTtmdW5jdGlvbiBsYyhlLHQsbixyKXtpZihiKG4pJiYocj1uLG49dm9pZCAwKSxyKXJldHVybiBsYyhlLHQsbikucGlwZShXbihyKSk7bGV0W28saV09ZUUoZSk/UUQubWFwKHM9PmE9PmVbc10odCxhLG4pKTpKRChlKT9ZRC5tYXAoYnAoZSx0KSk6WEQoZSk/S0QubWFwKGJwKGUsdCkpOltdO2lmKCFvJiZIbihlKSlyZXR1cm4gYmUocz0+bGMocyx0LG4pKShPKGUpKTtpZighbyl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGV2ZW50IHRhcmdldCIpO3JldHVybiBuZXcgUihzPT57bGV0IGE9KC4uLmMpPT5zLm5leHQoMTxjLmxlbmd0aD9jOmNbMF0pO3JldHVybiBvKGEpLCgpPT5pKGEpfSl9ZnVuY3Rpb24gYnAoZSx0KXtyZXR1cm4gbj0+cj0+ZVtuXSh0LHIpfWZ1bmN0aW9uIEpEKGUpe3JldHVybiBiKGUuYWRkTGlzdGVuZXIpJiZiKGUucmVtb3ZlTGlzdGVuZXIpfWZ1bmN0aW9uIFhEKGUpe3JldHVybiBiKGUub24pJiZiKGUub2ZmKX1mdW5jdGlvbiBlRShlKXtyZXR1cm4gYihlLmFkZEV2ZW50TGlzdGVuZXIpJiZiKGUucmVtb3ZlRXZlbnRMaXN0ZW5lcil9dmFyIFlELFFELEtELFRwPWgoKCk9PntzZSgpO2llKCk7ZW4oKTtmaSgpO0soKTtfaSgpO1lEPVsiYWRkTGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciJdLFFEPVsiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiXSxLRD1bIm9uIiwib2ZmIl19KTtmdW5jdGlvbiB0bihlPTAsdCxuPXpmKXtsZXQgcj0tMTtyZXR1cm4gdCE9bnVsbCYmKGxpKHQpP249dDpyPXQpLG5ldyBSKG89PntsZXQgaT1tcChlKT8rZS1uLm5vdygpOmU7aTwwJiYoaT0wKTtsZXQgcz0wO3JldHVybiBuLnNjaGVkdWxlKGZ1bmN0aW9uKCl7by5jbG9zZWR8fChvLm5leHQocysrKSwwPD1yP3RoaXMuc2NoZWR1bGUodm9pZCAwLHIpOm8uY29tcGxldGUoKSl9LGkpfSl9dmFyIGpyPWgoKCk9PntpZSgpO1ZuKCk7WWEoKTt5cCgpfSk7ZnVuY3Rpb24gdEUoZT0wLHQ9dXQpe3JldHVybiBlPDAmJihlPTApLHRuKGUsZSx0KX12YXIgX3A9aCgoKT0+e1ZuKCk7anIoKX0pO2Z1bmN0aW9uIG5FKC4uLmUpe2xldCB0PVdlKGUpLG49WmYoZSwxLzApLHI9ZTtyZXR1cm4gci5sZW5ndGg/ci5sZW5ndGg9PT0xP08oclswXSk6THIobikocWUocix0KSk6S3R9dmFyIE1wPWgoKCk9PntBaSgpO3NlKCk7UHIoKTtKdCgpOyRuKCl9KTtmdW5jdGlvbiBaZShlLHQpe3JldHVybiBfKChuLHIpPT57bGV0IG89MDtuLnN1YnNjcmliZShTKHIsaT0+ZS5jYWxsKHQsaSxvKyspJiZyLm5leHQoaSkpKX0pfXZhciBabj1oKCgpPT57aigpOyQoKX0pO3ZhciBTcD1oKCgpPT57fSk7ZnVuY3Rpb24gTnAoZSl7cmV0dXJuIF8oKHQsbik9PntsZXQgcj0hMSxvPW51bGwsaT1udWxsLHM9ITEsYT0oKT0+e2lmKGk/LnVuc3Vic2NyaWJlKCksaT1udWxsLHIpe3I9ITE7bGV0IHU9bztvPW51bGwsbi5uZXh0KHUpfXMmJm4uY29tcGxldGUoKX0sYz0oKT0+e2k9bnVsbCxzJiZuLmNvbXBsZXRlKCl9O3Quc3Vic2NyaWJlKFMobix1PT57cj0hMCxvPXUsaXx8TyhlKHUpKS5zdWJzY3JpYmUoaT1TKG4sYSxjKSl9LCgpPT57cz0hMCwoIXJ8fCFpfHxpLmNsb3NlZCkmJm4uY29tcGxldGUoKX0pKX0pfXZhciBBcD1oKCgpPT57aigpO3NlKCk7JCgpfSk7ZnVuY3Rpb24gckUoZSx0PXV0KXtyZXR1cm4gTnAoKCk9PnRuKGUsdCkpfXZhciB4cD1oKCgpPT57Vm4oKTtBcCgpO2pyKCl9KTtmdW5jdGlvbiBkYyhlKXtyZXR1cm4gXygodCxuKT0+e2xldCByPW51bGwsbz0hMSxpO3I9dC5zdWJzY3JpYmUoUyhuLHZvaWQgMCx2b2lkIDAscz0+e2k9TyhlKHMsZGMoZSkodCkpKSxyPyhyLnVuc3Vic2NyaWJlKCkscj1udWxsLGkuc3Vic2NyaWJlKG4pKTpvPSEwfSkpLG8mJihyLnVuc3Vic2NyaWJlKCkscj1udWxsLGkuc3Vic2NyaWJlKG4pKX0pfXZhciBmYz1oKCgpPT57c2UoKTskKCk7aigpfSk7ZnVuY3Rpb24gUnAoZSx0LG4scixvKXtyZXR1cm4oaSxzKT0+e2xldCBhPW4sYz10LHU9MDtpLnN1YnNjcmliZShTKHMsbD0+e2xldCBkPXUrKztjPWE/ZShjLGwsZCk6KGE9ITAsbCksciYmcy5uZXh0KGMpfSxvJiYoKCk9PnthJiZzLm5leHQoYykscy5jb21wbGV0ZSgpfSkpKX19dmFyIE9wPWgoKCk9PnskKCl9KTtmdW5jdGlvbiBwYyhlLHQpe3JldHVybiBiKHQpP2JlKGUsdCwxKTpiZShlLDEpfXZhciBGcD1oKCgpPT57ZW4oKTtLKCl9KTtmdW5jdGlvbiBrcChlLHQ9dXQpe3JldHVybiBfKChuLHIpPT57bGV0IG89bnVsbCxpPW51bGwscz1udWxsLGE9KCk9PntpZihvKXtvLnVuc3Vic2NyaWJlKCksbz1udWxsO2xldCB1PWk7aT1udWxsLHIubmV4dCh1KX19O2Z1bmN0aW9uIGMoKXtsZXQgdT1zK2UsbD10Lm5vdygpO2lmKGw8dSl7bz10aGlzLnNjaGVkdWxlKHZvaWQgMCx1LWwpLHIuYWRkKG8pO3JldHVybn1hKCl9bi5zdWJzY3JpYmUoUyhyLHU9PntpPXUscz10Lm5vdygpLG98fChvPXQuc2NoZWR1bGUoYyxlKSxyLmFkZChvKSl9LCgpPT57YSgpLHIuY29tcGxldGUoKX0sdm9pZCAwLCgpPT57aT1vPW51bGx9KSl9KX12YXIgaGM9aCgoKT0+e1ZuKCk7aigpOyQoKX0pO2Z1bmN0aW9uIEJyKGUpe3JldHVybiBfKCh0LG4pPT57bGV0IHI9ITE7dC5zdWJzY3JpYmUoUyhuLG89PntyPSEwLG4ubmV4dChvKX0sKCk9PntyfHxuLm5leHQoZSksbi5jb21wbGV0ZSgpfSkpfSl9dmFyIFJpPWgoKCk9PntqKCk7JCgpfSk7ZnVuY3Rpb24gbm4oZSl7cmV0dXJuIGU8PTA/KCk9Pkt0Ol8oKHQsbik9PntsZXQgcj0wO3Quc3Vic2NyaWJlKFMobixvPT57KytyPD1lJiYobi5uZXh0KG8pLGU8PXImJm4uY29tcGxldGUoKSl9KSl9KX12YXIgVnI9aCgoKT0+e1ByKCk7aigpOyQoKX0pO2Z1bmN0aW9uIFBwKCl7cmV0dXJuIF8oKGUsdCk9PntlLnN1YnNjcmliZShTKHQsWnQpKX0pfXZhciBMcD1oKCgpPT57aigpOyQoKTtuaSgpfSk7ZnVuY3Rpb24gZ2MoZSl7cmV0dXJuIGxlKCgpPT5lKX12YXIgbWM9aCgoKT0+e0duKCl9KTtmdW5jdGlvbiB5YyhlLHQpe3JldHVybiB0P249PnFuKHQucGlwZShubigxKSxQcCgpKSxuLnBpcGUoeWMoZSkpKTpiZSgobixyKT0+TyhlKG4scikpLnBpcGUobm4oMSksZ2MobikpKX12YXIganA9aCgoKT0+e3hpKCk7VnIoKTtMcCgpO21jKCk7ZW4oKTtzZSgpfSk7ZnVuY3Rpb24gb0UoZSx0PXV0KXtsZXQgbj10bihlLHQpO3JldHVybiB5YygoKT0+bil9dmFyIEJwPWgoKCk9PntWbigpO2pwKCk7anIoKX0pO2Z1bmN0aW9uIFZwKGUsdD11ZSl7cmV0dXJuIGU9ZT8/aUUsXygobixyKT0+e2xldCBvLGk9ITA7bi5zdWJzY3JpYmUoUyhyLHM9PntsZXQgYT10KHMpOyhpfHwhZShvLGEpKSYmKGk9ITEsbz1hLHIubmV4dChzKSl9KSl9KX1mdW5jdGlvbiBpRShlLHQpe3JldHVybiBlPT09dH12YXIgdmM9aCgoKT0+e190KCk7aigpOyQoKX0pO2Z1bmN0aW9uIE9pKGU9c0Upe3JldHVybiBfKCh0LG4pPT57bGV0IHI9ITE7dC5zdWJzY3JpYmUoUyhuLG89PntyPSEwLG4ubmV4dChvKX0sKCk9PnI/bi5jb21wbGV0ZSgpOm4uZXJyb3IoZSgpKSkpfSl9ZnVuY3Rpb24gc0UoKXtyZXR1cm4gbmV3IGx0fXZhciBEYz1oKCgpPT57em4oKTtqKCk7JCgpfSk7ZnVuY3Rpb24gYUUoZSx0PTEvMCxuKXtyZXR1cm4gdD0odHx8MCk8MT8xLzA6dCxfKChyLG8pPT5OaShyLG8sZSx0LHZvaWQgMCwhMCxuKSl9dmFyIEhwPWgoKCk9PntqKCk7dWMoKX0pO2Z1bmN0aW9uIEhyKGUpe3JldHVybiBfKCh0LG4pPT57dHJ5e3Quc3Vic2NyaWJlKG4pfWZpbmFsbHl7bi5hZGQoZSl9fSl9dmFyIEVjPWgoKCk9PntqKCl9KTtmdW5jdGlvbiBjRShlLHQpe2xldCBuPWFyZ3VtZW50cy5sZW5ndGg+PTI7cmV0dXJuIHI9PnIucGlwZShlP1plKChvLGkpPT5lKG8saSxyKSk6dWUsbm4oMSksbj9Ccih0KTpPaSgoKT0+bmV3IGx0KSl9dmFyIFVwPWgoKCk9Pnt6bigpO1puKCk7VnIoKTtSaSgpO0RjKCk7X3QoKX0pO2Z1bmN0aW9uIEljKGUpe3JldHVybiBlPD0wPygpPT5LdDpfKCh0LG4pPT57bGV0IHI9W107dC5zdWJzY3JpYmUoUyhuLG89PntyLnB1c2gobyksZTxyLmxlbmd0aCYmci5zaGlmdCgpfSwoKT0+e2ZvcihsZXQgbyBvZiByKW4ubmV4dChvKTtuLmNvbXBsZXRlKCl9LHZvaWQgMCwoKT0+e3I9bnVsbH0pKX0pfXZhciB3Yz1oKCgpPT57UHIoKTtqKCk7JCgpfSk7ZnVuY3Rpb24gdUUoZSx0KXtsZXQgbj1hcmd1bWVudHMubGVuZ3RoPj0yO3JldHVybiByPT5yLnBpcGUoZT9aZSgobyxpKT0+ZShvLGkscikpOnVlLEljKDEpLG4/QnIodCk6T2koKCk9Pm5ldyBsdCkpfXZhciAkcD1oKCgpPT57em4oKTtabigpO3djKCk7RGMoKTtSaSgpO190KCl9KTtmdW5jdGlvbiBsRSgpe3JldHVybiBfKChlLHQpPT57bGV0IG4scj0hMTtlLnN1YnNjcmliZShTKHQsbz0+e2xldCBpPW47bj1vLHImJnQubmV4dChbaSxvXSkscj0hMH0pKX0pfXZhciB6cD1oKCgpPT57aigpOyQoKX0pO2Z1bmN0aW9uIGRFKGUsdCl7cmV0dXJuIF8oUnAoZSx0LGFyZ3VtZW50cy5sZW5ndGg+PTIsITApKX12YXIgR3A9aCgoKT0+e2ooKTtPcCgpfSk7ZnVuY3Rpb24gYmMoZT17fSl7bGV0e2Nvbm5lY3Rvcjp0PSgpPT5uZXcgZ2UscmVzZXRPbkVycm9yOm49ITAscmVzZXRPbkNvbXBsZXRlOnI9ITAscmVzZXRPblJlZkNvdW50WmVybzpvPSEwfT1lO3JldHVybiBpPT57bGV0IHMsYSxjLHU9MCxsPSExLGQ9ITEscD0oKT0+e2E/LnVuc3Vic2NyaWJlKCksYT12b2lkIDB9LGY9KCk9PntwKCkscz1jPXZvaWQgMCxsPWQ9ITF9LGc9KCk9PntsZXQgST1zO2YoKSxJPy51bnN1YnNjcmliZSgpfTtyZXR1cm4gXygoSSxEKT0+e3UrKywhZCYmIWwmJnAoKTtsZXQgbT1jPWM/P3QoKTtELmFkZCgoKT0+e3UtLSx1PT09MCYmIWQmJiFsJiYoYT1DYyhnLG8pKX0pLG0uc3Vic2NyaWJlKEQpLCFzJiZ1PjAmJihzPW5ldyBPZSh7bmV4dDpGPT5tLm5leHQoRiksZXJyb3I6Rj0+e2Q9ITAscCgpLGE9Q2MoZixuLEYpLG0uZXJyb3IoRil9LGNvbXBsZXRlOigpPT57bD0hMCxwKCksYT1DYyhmLHIpLG0uY29tcGxldGUoKX19KSxPKEkpLnN1YnNjcmliZShzKSl9KShpKX19ZnVuY3Rpb24gQ2MoZSx0LC4uLm4pe2lmKHQ9PT0hMCl7ZSgpO3JldHVybn1pZih0PT09ITEpcmV0dXJuO2xldCByPW5ldyBPZSh7bmV4dDooKT0+e3IudW5zdWJzY3JpYmUoKSxlKCl9fSk7cmV0dXJuIE8odCguLi5uKSkuc3Vic2NyaWJlKHIpfXZhciBUYz1oKCgpPT57c2UoKTt4cigpO0FyKCk7aigpfSk7ZnVuY3Rpb24gZkUoZSx0LG4pe2xldCByLG89ITE7cmV0dXJuIGUmJnR5cGVvZiBlPT0ib2JqZWN0Ij97YnVmZmVyU2l6ZTpyPTEvMCx3aW5kb3dUaW1lOnQ9MS8wLHJlZkNvdW50Om89ITEsc2NoZWR1bGVyOm59PWU6cj1lPz8xLzAsYmMoe2Nvbm5lY3RvcjooKT0+bmV3IEZyKHIsdCxuKSxyZXNldE9uRXJyb3I6ITAscmVzZXRPbkNvbXBsZXRlOiExLHJlc2V0T25SZWZDb3VudFplcm86b30pfXZhciBXcD1oKCgpPT57V2EoKTtUYygpfSk7ZnVuY3Rpb24gcEUoZSl7cmV0dXJuIFplKCh0LG4pPT5lPD1uKX12YXIgcXA9aCgoKT0+e1puKCl9KTtmdW5jdGlvbiBacCguLi5lKXtsZXQgdD1XZShlKTtyZXR1cm4gXygobixyKT0+eyh0P3FuKGUsbix0KTpxbihlLG4pKS5zdWJzY3JpYmUocil9KX12YXIgX2M9aCgoKT0+e3hpKCk7SnQoKTtqKCl9KTtmdW5jdGlvbiBGaShlLHQpe3JldHVybiBfKChuLHIpPT57bGV0IG89bnVsbCxpPTAscz0hMSxhPSgpPT5zJiYhbyYmci5jb21wbGV0ZSgpO24uc3Vic2NyaWJlKFMocixjPT57bz8udW5zdWJzY3JpYmUoKTtsZXQgdT0wLGw9aSsrO08oZShjLGwpKS5zdWJzY3JpYmUobz1TKHIsZD0+ci5uZXh0KHQ/dChjLGQsbCx1KyspOmQpLCgpPT57bz1udWxsLGEoKX0pKX0sKCk9PntzPSEwLGEoKX0pKX0pfXZhciBNYz1oKCgpPT57c2UoKTtqKCk7JCgpfSk7ZnVuY3Rpb24gWXAoZSl7cmV0dXJuIF8oKHQsbik9PntPKGUpLnN1YnNjcmliZShTKG4sKCk9Pm4uY29tcGxldGUoKSxadCkpLCFuLmNsb3NlZCYmdC5zdWJzY3JpYmUobil9KX12YXIgU2M9aCgoKT0+e2ooKTskKCk7c2UoKTtuaSgpfSk7ZnVuY3Rpb24gUXAoZSx0PSExKXtyZXR1cm4gXygobixyKT0+e2xldCBvPTA7bi5zdWJzY3JpYmUoUyhyLGk9PntsZXQgcz1lKGksbysrKTsoc3x8dCkmJnIubmV4dChpKSwhcyYmci5jb21wbGV0ZSgpfSkpfSl9dmFyIE5jPWgoKCk9PntqKCk7JCgpfSk7ZnVuY3Rpb24gS3AoZSx0LG4pe2xldCByPWIoZSl8fHR8fG4/e25leHQ6ZSxlcnJvcjp0LGNvbXBsZXRlOm59OmU7cmV0dXJuIHI/XygobyxpKT0+e3ZhciBzOyhzPXIuc3Vic2NyaWJlKT09PW51bGx8fHM9PT12b2lkIDB8fHMuY2FsbChyKTtsZXQgYT0hMDtvLnN1YnNjcmliZShTKGksYz0+e3ZhciB1Oyh1PXIubmV4dCk9PT1udWxsfHx1PT09dm9pZCAwfHx1LmNhbGwocixjKSxpLm5leHQoYyl9LCgpPT57dmFyIGM7YT0hMSwoYz1yLmNvbXBsZXRlKT09PW51bGx8fGM9PT12b2lkIDB8fGMuY2FsbChyKSxpLmNvbXBsZXRlKCl9LGM9Pnt2YXIgdTthPSExLCh1PXIuZXJyb3IpPT09bnVsbHx8dT09PXZvaWQgMHx8dS5jYWxsKHIsYyksaS5lcnJvcihjKX0sKCk9Pnt2YXIgYyx1O2EmJigoYz1yLnVuc3Vic2NyaWJlKT09PW51bGx8fGM9PT12b2lkIDB8fGMuY2FsbChyKSksKHU9ci5maW5hbGl6ZSk9PT1udWxsfHx1PT09dm9pZCAwfHx1LmNhbGwocil9KSl9KTp1ZX12YXIgQWM9aCgoKT0+e0soKTtqKCk7JCgpO190KCl9KTt2YXIgVXI9aCgoKT0+e2llKCk7UGYoKTt4cigpO1ZmKCk7V2EoKTtxZigpO1R0KCk7QmEoKTtocCgpO2dwKCk7em4oKTtEcCgpO3hpKCk7d3AoKTtDcCgpOyRuKCk7VHAoKTtfcCgpO01wKCk7ZnAoKTtwcCgpO2pyKCk7UHIoKTtTcCgpO2ZjKCk7aGMoKTtCcCgpO3ZjKCk7SHAoKTtabigpO0VjKCk7R24oKTtlbigpO19jKCk7TWMoKTtWcigpO1NjKCk7TmMoKTtBYygpfSk7ZnVuY3Rpb24gSnAoZSl7bGV0IHQ9TShudWxsKTt0cnl7cmV0dXJuIGUoKX1maW5hbGx5e00odCl9fWZ1bmN0aW9uIGVoKGUpe2lmKGUuZGlydHk9ITEsZS52ZXJzaW9uPjAmJiFHdChlKSlyZXR1cm47ZS52ZXJzaW9uKys7bGV0IHQ9Q3QoZSk7dHJ5e2UuY2xlYW51cCgpLGUuZm4oKX1maW5hbGx5e3p0KGUsdCl9fXZhciBYcCx0aD1oKCgpPT57V3QoKTtYcD1HKFYoe30sVXQpLHtjb25zdW1lcklzQWx3YXlzTGl2ZTohMCxjb25zdW1lckFsbG93U2lnbmFsV3JpdGVzOiEwLGRpcnR5OiEwLGtpbmQ6ImVmZmVjdCJ9KX0pO3ZhciB4Yz1oKCgpPT57V3QoKTt9KTt2YXIgbmg9aCgoKT0+e0NhKCk7fSk7ZnVuY3Rpb24gaEUoZSl7cmV0dXJuYE5HMCR7TWF0aC5hYnMoZSl9YH1mdW5jdGlvbiBZZShlLHQpe3JldHVybmAke2hFKGUpfSR7dD8iOiAiK3Q6IiJ9YH1mdW5jdGlvbiBrKGUpe2ZvcihsZXQgdCBpbiBlKWlmKGVbdF09PT1rKXJldHVybiB0O3Rocm93IEVycm9yKCIiKX1mdW5jdGlvbiBpaChlLHQpe2ZvcihsZXQgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJiFlLmhhc093blByb3BlcnR5KG4pJiYoZVtuXT10W25dKX1mdW5jdGlvbiBmdChlKXtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIGU7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm5gWyR7ZS5tYXAoZnQpLmpvaW4oIiwgIil9XWA7aWYoZT09bnVsbClyZXR1cm4iIitlO2xldCB0PWUub3ZlcnJpZGRlbk5hbWV8fGUubmFtZTtpZih0KXJldHVybmAke3R9YDtsZXQgbj1lLnRvU3RyaW5nKCk7aWYobj09bnVsbClyZXR1cm4iIituO2xldCByPW4uaW5kZXhPZihgCmApO3JldHVybiByPj0wP24uc2xpY2UoMCxyKTpufWZ1bmN0aW9uIEJpKGUsdCl7cmV0dXJuIGU/dD9gJHtlfSAke3R9YDplOnR8fCIifWZ1bmN0aW9uIFZpKGUpe3JldHVybiBlLl9fZm9yd2FyZF9yZWZfXz1WaSxlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGZ0KHRoaXMoKSl9LGV9ZnVuY3Rpb24gZWUoZSl7cmV0dXJuICRjKGUpP2UoKTplfWZ1bmN0aW9uICRjKGUpe3JldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uIiYmZS5oYXNPd25Qcm9wZXJ0eShnRSkmJmUuX19mb3J3YXJkX3JlZl9fPT09Vml9ZnVuY3Rpb24gTihlKXtyZXR1cm57dG9rZW46ZS50b2tlbixwcm92aWRlZEluOmUucHJvdmlkZWRJbnx8bnVsbCxmYWN0b3J5OmUuZmFjdG9yeSx2YWx1ZTp2b2lkIDB9fWZ1bmN0aW9uIHB0KGUpe3JldHVybntwcm92aWRlcnM6ZS5wcm92aWRlcnN8fFtdLGltcG9ydHM6ZS5pbXBvcnRzfHxbXX19ZnVuY3Rpb24gcXIoZSl7cmV0dXJuIHlFKGUsSGkpfWZ1bmN0aW9uIG1FKGUpe3JldHVybiBxcihlKSE9PW51bGx9ZnVuY3Rpb24geUUoZSx0KXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSh0KSYmZVt0XXx8bnVsbH1mdW5jdGlvbiB2RShlKXtsZXQgdD1lPy5bSGldPz9udWxsO3JldHVybiB0fHxudWxsfWZ1bmN0aW9uIE9jKGUpe3JldHVybiBlJiZlLmhhc093blByb3BlcnR5KFBpKT9lW1BpXTpudWxsfWZ1bmN0aW9uIHpjKGUpe3JldHVybiBlJiYhIWUuXHUwMjc1cHJvdmlkZXJzfWZ1bmN0aW9uIEVlKGUpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/ZTplPT1udWxsPyIiOlN0cmluZyhlKX1mdW5jdGlvbiBzaChlKXtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZS5uYW1lfHxlLnRvU3RyaW5nKCk6dHlwZW9mIGU9PSJvYmplY3QiJiZlIT1udWxsJiZ0eXBlb2YgZS50eXBlPT0iZnVuY3Rpb24iP2UudHlwZS5uYW1lfHxlLnR5cGUudG9TdHJpbmcoKTpFZShlKX1mdW5jdGlvbiBZYyhlLHQpe3JldHVybiBjaCgiIiwtMjAwLHQpfWZ1bmN0aW9uIFVpKGUsdCl7dGhyb3cgbmV3IHYoLTIwMSwhMSl9ZnVuY3Rpb24gY2goZSx0LG4pe2xldCByPW5ldyB2KHQsZSk7cmV0dXJuIHJbYWhdPXQscltERV09ZSxuJiYocltFRV09bikscn1mdW5jdGlvbiBJRShlKXtyZXR1cm4gZVthaF19ZnVuY3Rpb24gdWgoKXtyZXR1cm4gRmN9ZnVuY3Rpb24gZGUoZSl7bGV0IHQ9RmM7cmV0dXJuIEZjPWUsdH1mdW5jdGlvbiBRYyhlLHQsbil7bGV0IHI9cXIoZSk7aWYociYmci5wcm92aWRlZEluPT0icm9vdCIpcmV0dXJuIHIudmFsdWU9PT12b2lkIDA/ci52YWx1ZT1yLmZhY3RvcnkoKTpyLnZhbHVlO2lmKG4mOClyZXR1cm4gbnVsbDtpZih0IT09dm9pZCAwKXJldHVybiB0O1VpKGUsIkluamVjdG9yIil9ZnVuY3Rpb24gQ0UoZSx0PTApe2xldCBuPVVvKCk7aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgdigtMjAzLCExKTtpZihuPT09bnVsbClyZXR1cm4gUWMoZSx2b2lkIDAsdCk7e2xldCByPWJFKHQpLG89bi5yZXRyaWV2ZShlLHIpO2lmKE5uKG8pKXtpZihyLm9wdGlvbmFsKXJldHVybiBudWxsO3Rocm93IG99cmV0dXJuIG99fWZ1bmN0aW9uIEMoZSx0PTApe3JldHVybih1aCgpfHxDRSkoZWUoZSksdCl9ZnVuY3Rpb24geShlLHQpe3JldHVybiBDKGUsb24odCkpfWZ1bmN0aW9uIG9uKGUpe3JldHVybiB0eXBlb2YgZT4idSJ8fHR5cGVvZiBlPT0ibnVtYmVyIj9lOjB8KGUub3B0aW9uYWwmJjgpfChlLmhvc3QmJjEpfChlLnNlbGYmJjIpfChlLnNraXBTZWxmJiY0KX1mdW5jdGlvbiBiRShlKXtyZXR1cm57b3B0aW9uYWw6ISEoZSY4KSxob3N0OiEhKGUmMSksc2VsZjohIShlJjIpLHNraXBTZWxmOiEhKGUmNCl9fWZ1bmN0aW9uIExjKGUpe2xldCB0PVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lZShlW25dKTtpZihBcnJheS5pc0FycmF5KHIpKXtpZihyLmxlbmd0aD09PTApdGhyb3cgbmV3IHYoOTAwLCExKTtsZXQgbyxpPTA7Zm9yKGxldCBzPTA7czxyLmxlbmd0aDtzKyspe2xldCBhPXJbc10sYz1URShhKTt0eXBlb2YgYz09Im51bWJlciI/Yz09PS0xP289YS50b2tlbjppfD1jOm89YX10LnB1c2goQyhvLGkpKX1lbHNlIHQucHVzaChDKHIpKX1yZXR1cm4gdH1mdW5jdGlvbiBLYyhlLHQpe3JldHVybiBlW2tjXT10LGUucHJvdG90eXBlW2tjXT10LGV9ZnVuY3Rpb24gVEUoZSl7cmV0dXJuIGVba2NdfWZ1bmN0aW9uIE10KGUsdCl7bGV0IG49ZS5oYXNPd25Qcm9wZXJ0eSh6cik7cmV0dXJuIG4/ZVt6cl06bnVsbH1mdW5jdGlvbiBsaChlLHQsbil7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7bGV0IG89ZVtyXSxpPXRbcl07aWYobiYmKG89bihvKSxpPW4oaSkpLGkhPT1vKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGRoKGUpe3JldHVybiBlLmZsYXQoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKX1mdW5jdGlvbiAkaShlLHQpe2UuZm9yRWFjaChuPT5BcnJheS5pc0FycmF5KG4pPyRpKG4sdCk6dChuKSl9ZnVuY3Rpb24gSmMoZSx0LG4pe3Q+PWUubGVuZ3RoP2UucHVzaChuKTplLnNwbGljZSh0LDAsbil9ZnVuY3Rpb24gWnIoZSx0KXtyZXR1cm4gdD49ZS5sZW5ndGgtMT9lLnBvcCgpOmUuc3BsaWNlKHQsMSlbMF19ZnVuY3Rpb24gZmgoZSx0KXtsZXQgbj1bXTtmb3IobGV0IHI9MDtyPGU7cisrKW4ucHVzaCh0KTtyZXR1cm4gbn1mdW5jdGlvbiBwaChlLHQsbixyKXtsZXQgbz1lLmxlbmd0aDtpZihvPT10KWUucHVzaChuLHIpO2Vsc2UgaWYobz09PTEpZS5wdXNoKHIsZVswXSksZVswXT1uO2Vsc2V7Zm9yKG8tLSxlLnB1c2goZVtvLTFdLGVbb10pO28+dDspe2xldCBpPW8tMjtlW29dPWVbaV0sby0tfWVbdF09bixlW3QrMV09cn19ZnVuY3Rpb24gemkoZSx0LG4pe2xldCByPVFuKGUsdCk7cmV0dXJuIHI+PTA/ZVtyfDFdPW46KHI9fnIscGgoZSxyLHQsbikpLHJ9ZnVuY3Rpb24gR2koZSx0KXtsZXQgbj1RbihlLHQpO2lmKG4+PTApcmV0dXJuIGVbbnwxXX1mdW5jdGlvbiBRbihlLHQpe3JldHVybiBfRShlLHQsMSl9ZnVuY3Rpb24gX0UoZSx0LG4pe2xldCByPTAsbz1lLmxlbmd0aD4+bjtmb3IoO28hPT1yOyl7bGV0IGk9cisoby1yPj4xKSxzPWVbaTw8bl07aWYodD09PXMpcmV0dXJuIGk8PG47cz50P289aTpyPWkrMX1yZXR1cm5+KG88PG4pfWZ1bmN0aW9uIHR1KGUpe3JldHVybiBlW1pjXXx8bnVsbH1mdW5jdGlvbiBRZShlKXtyZXR1cm4gZVtHY118fG51bGx9ZnVuY3Rpb24gV2koZSl7cmV0dXJuIGVbV2NdfHxudWxsfWZ1bmN0aW9uIGhoKGUpe3JldHVybiBlW3FjXXx8bnVsbH1mdW5jdGlvbiBLbihlKXtyZXR1cm57XHUwMjc1cHJvdmlkZXJzOmV9fWZ1bmN0aW9uIGdoKC4uLmUpe3JldHVybntcdTAyNzVwcm92aWRlcnM6bnUoITAsZSksXHUwMjc1ZnJvbU5nTW9kdWxlOiEwfX1mdW5jdGlvbiBudShlLC4uLnQpe2xldCBuPVtdLHI9bmV3IFNldCxvLGk9cz0+e24ucHVzaChzKX07cmV0dXJuICRpKHQscz0+e2xldCBhPXM7TGkoYSxpLFtdLHIpJiYob3x8PVtdLG8ucHVzaChhKSl9KSxvIT09dm9pZCAwJiZtaChvLGkpLG59ZnVuY3Rpb24gbWgoZSx0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0e25nTW9kdWxlOnIscHJvdmlkZXJzOm99PWVbbl07cnUobyxpPT57dChpLHIpfSl9fWZ1bmN0aW9uIExpKGUsdCxuLHIpe2lmKGU9ZWUoZSksIWUpcmV0dXJuITE7bGV0IG89bnVsbCxpPU9jKGUpLHM9IWkmJlFlKGUpO2lmKCFpJiYhcyl7bGV0IGM9ZS5uZ01vZHVsZTtpZihpPU9jKGMpLGkpbz1jO2Vsc2UgcmV0dXJuITF9ZWxzZXtpZihzJiYhcy5zdGFuZGFsb25lKXJldHVybiExO289ZX1sZXQgYT1yLmhhcyhvKTtpZihzKXtpZihhKXJldHVybiExO2lmKHIuYWRkKG8pLHMuZGVwZW5kZW5jaWVzKXtsZXQgYz10eXBlb2Ygcy5kZXBlbmRlbmNpZXM9PSJmdW5jdGlvbiI/cy5kZXBlbmRlbmNpZXMoKTpzLmRlcGVuZGVuY2llcztmb3IobGV0IHUgb2YgYylMaSh1LHQsbixyKX19ZWxzZSBpZihpKXtpZihpLmltcG9ydHMhPW51bGwmJiFhKXtyLmFkZChvKTtsZXQgdTt0cnl7JGkoaS5pbXBvcnRzLGw9PntMaShsLHQsbixyKSYmKHV8fD1bXSx1LnB1c2gobCkpfSl9ZmluYWxseXt9dSE9PXZvaWQgMCYmbWgodSx0KX1pZighYSl7bGV0IHU9TXQobyl8fCgoKT0+bmV3IG8pO3Qoe3Byb3ZpZGU6byx1c2VGYWN0b3J5OnUsZGVwczphZX0sbyksdCh7cHJvdmlkZTpldSx1c2VWYWx1ZTpvLG11bHRpOiEwfSxvKSx0KHtwcm92aWRlOk50LHVzZVZhbHVlOigpPT5DKG8pLG11bHRpOiEwfSxvKX1sZXQgYz1pLnByb3ZpZGVycztpZihjIT1udWxsJiYhYSl7bGV0IHU9ZTtydShjLGw9Pnt0KGwsdSl9KX19ZWxzZSByZXR1cm4hMTtyZXR1cm4gbyE9PWUmJmUucHJvdmlkZXJzIT09dm9pZCAwfWZ1bmN0aW9uIHJ1KGUsdCl7Zm9yKGxldCBuIG9mIGUpemMobikmJihuPW4uXHUwMjc1cHJvdmlkZXJzKSxBcnJheS5pc0FycmF5KG4pP3J1KG4sdCk6dChuKX1mdW5jdGlvbiB5aChlKXtyZXR1cm4gZSE9PW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0IiYmTUUgaW4gZX1mdW5jdGlvbiBTRShlKXtyZXR1cm4hIShlJiZlLnVzZUV4aXN0aW5nKX1mdW5jdGlvbiBORShlKXtyZXR1cm4hIShlJiZlLnVzZUZhY3RvcnkpfWZ1bmN0aW9uIHNuKGUpe3JldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uIn1mdW5jdGlvbiB2aChlKXtyZXR1cm4hIWUudXNlQ2xhc3N9ZnVuY3Rpb24gSm4oKXtyZXR1cm4gUmM9PT12b2lkIDAmJihSYz1uZXcgR3IpLFJjfWZ1bmN0aW9uIGpjKGUpe2xldCB0PXFyKGUpLG49dCE9PW51bGw/dC5mYWN0b3J5Ok10KGUpO2lmKG4hPT1udWxsKXJldHVybiBuO2lmKGUgaW5zdGFuY2VvZiBUKXRocm93IG5ldyB2KDIwNCwhMSk7aWYoZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKXJldHVybiBBRShlKTt0aHJvdyBuZXcgdigyMDQsITEpfWZ1bmN0aW9uIEFFKGUpe2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IHYoMjA0LCExKTtsZXQgbj12RShlKTtyZXR1cm4gbiE9PW51bGw/KCk9Pm4uZmFjdG9yeShlKTooKT0+bmV3IGV9ZnVuY3Rpb24geEUoZSl7aWYoeWgoZSkpcmV0dXJuIFluKHZvaWQgMCxlLnVzZVZhbHVlKTt7bGV0IHQ9b3UoZSk7cmV0dXJuIFluKHQsa2kpfX1mdW5jdGlvbiBvdShlLHQsbil7bGV0IHI7aWYoc24oZSkpe2xldCBvPWVlKGUpO3JldHVybiBNdChvKXx8amMobyl9ZWxzZSBpZih5aChlKSlyPSgpPT5lZShlLnVzZVZhbHVlKTtlbHNlIGlmKE5FKGUpKXI9KCk9PmUudXNlRmFjdG9yeSguLi5MYyhlLmRlcHN8fFtdKSk7ZWxzZSBpZihTRShlKSlyPShvLGkpPT5DKGVlKGUudXNlRXhpc3RpbmcpLGkhPT12b2lkIDAmJmkmOD84OnZvaWQgMCk7ZWxzZXtsZXQgbz1lZShlJiYoZS51c2VDbGFzc3x8ZS5wcm92aWRlKSk7aWYoUkUoZSkpcj0oKT0+bmV3IG8oLi4uTGMoZS5kZXBzKSk7ZWxzZSByZXR1cm4gTXQobyl8fGpjKG8pfXJldHVybiByfWZ1bmN0aW9uICRyKGUpe2lmKGUuZGVzdHJveWVkKXRocm93IG5ldyB2KDIwNSwhMSl9ZnVuY3Rpb24gWW4oZSx0LG49ITEpe3JldHVybntmYWN0b3J5OmUsdmFsdWU6dCxtdWx0aTpuP1tdOnZvaWQgMH19ZnVuY3Rpb24gUkUoZSl7cmV0dXJuISFlLmRlcHN9ZnVuY3Rpb24gT0UoZSl7cmV0dXJuIGUhPT1udWxsJiZ0eXBlb2YgZT09Im9iamVjdCImJnR5cGVvZiBlLm5nT25EZXN0cm95PT0iZnVuY3Rpb24ifWZ1bmN0aW9uIEZFKGUpe3JldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uInx8dHlwZW9mIGU9PSJvYmplY3QiJiZlLm5nTWV0YWRhdGFOYW1lPT09IkluamVjdGlvblRva2VuIn1mdW5jdGlvbiBCYyhlLHQpe2ZvcihsZXQgbiBvZiBlKUFycmF5LmlzQXJyYXkobik/QmMobix0KTpuJiZ6YyhuKT9CYyhuLlx1MDI3NXByb3ZpZGVycyx0KTp0KG4pfWZ1bmN0aW9uIFhuKGUsdCl7bGV0IG47ZSBpbnN0YW5jZW9mIGFuPygkcihlKSxuPWUpOm49bmV3IFBjKGUpO2xldCByLG89R2UobiksaT1kZSh2b2lkIDApO3RyeXtyZXR1cm4gdCgpfWZpbmFsbHl7R2UobyksZGUoaSl9fWZ1bmN0aW9uIGl1KCl7cmV0dXJuIHVoKCkhPT12b2lkIDB8fFVvKCkhPW51bGx9ZnVuY3Rpb24gWGUoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJnR5cGVvZiBlW0RoXT09Im9iamVjdCJ9ZnVuY3Rpb24gUGUoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJmVbRGhdPT09ITB9ZnVuY3Rpb24gdXUoZSl7cmV0dXJuKGUuZmxhZ3MmNCkhPT0wfWZ1bmN0aW9uIG10KGUpe3JldHVybiBlLmNvbXBvbmVudE9mZnNldD4tMX1mdW5jdGlvbiBucihlKXtyZXR1cm4oZS5mbGFncyYxKT09PTF9ZnVuY3Rpb24gTGUoZSl7cmV0dXJuISFlLnRlbXBsYXRlfWZ1bmN0aW9uIHJyKGUpe3JldHVybihlW0FdJjUxMikhPT0wfWZ1bmN0aW9uIGduKGUpe3JldHVybihlW0FdJjI1Nik9PT0yNTZ9ZnVuY3Rpb24gTWUoZSl7Zm9yKDtBcnJheS5pc0FycmF5KGUpOyllPWVba2VdO3JldHVybiBlfWZ1bmN0aW9uIGR1KGUsdCl7cmV0dXJuIE1lKHRbZV0pfWZ1bmN0aW9uIFNlKGUsdCl7cmV0dXJuIE1lKHRbZS5pbmRleF0pfWZ1bmN0aW9uIEpyKGUsdCl7cmV0dXJuIGUuZGF0YVt0XX1mdW5jdGlvbiBaaShlLHQpe3JldHVybiBlW3RdfWZ1bmN0aW9uIGZ1KGUsdCxuLHIpe24+PWUuZGF0YS5sZW5ndGgmJihlLmRhdGFbbl09bnVsbCxlLmJsdWVwcmludFtuXT1udWxsKSx0W25dPXJ9ZnVuY3Rpb24gTmUoZSx0KXtsZXQgbj10W2VdO3JldHVybiBYZShuKT9uOm5ba2VdfWZ1bmN0aW9uIEloKGUpe3JldHVybihlW0FdJjQpPT09NH1mdW5jdGlvbiBZaShlKXtyZXR1cm4oZVtBXSYxMjgpPT09MTI4fWZ1bmN0aW9uIHdoKGUpe3JldHVybiBQZShlW3RlXSl9ZnVuY3Rpb24gd2UoZSx0KXtyZXR1cm4gdD09bnVsbD9udWxsOmVbdF19ZnVuY3Rpb24gcHUoZSl7ZVtkbl09MH1mdW5jdGlvbiBodShlKXtlW0FdJjEwMjR8fChlW0FdfD0xMDI0LFlpKGUpJiZSdChlKSl9ZnVuY3Rpb24gQ2goZSx0KXtmb3IoO2U+MDspdD10W2xuXSxlLS07cmV0dXJuIHR9ZnVuY3Rpb24gWHIoZSl7cmV0dXJuISEoZVtBXSY5MjE2fHxlW0llXT8uZGlydHkpfWZ1bmN0aW9uIFFpKGUpe2VbS2VdLmNoYW5nZURldGVjdGlvblNjaGVkdWxlcj8ubm90aWZ5KDgpLGVbQV0mNjQmJihlW0FdfD0xMDI0KSxYcihlKSYmUnQoZSl9ZnVuY3Rpb24gUnQoZSl7ZVtLZV0uY2hhbmdlRGV0ZWN0aW9uU2NoZWR1bGVyPy5ub3RpZnkoMCk7bGV0IHQ9U3QoZSk7Zm9yKDt0IT09bnVsbCYmISh0W0FdJjgxOTJ8fCh0W0FdfD04MTkyLCFZaSh0KSkpOyl0PVN0KHQpfWZ1bmN0aW9uIGd1KGUsdCl7aWYoZ24oZSkpdGhyb3cgbmV3IHYoOTExLCExKTtlW2R0XT09PW51bGwmJihlW2R0XT1bXSksZVtkdF0ucHVzaCh0KX1mdW5jdGlvbiBiaChlLHQpe2lmKGVbZHRdPT09bnVsbClyZXR1cm47bGV0IG49ZVtkdF0uaW5kZXhPZih0KTtuIT09LTEmJmVbZHRdLnNwbGljZShuLDEpfWZ1bmN0aW9uIFN0KGUpe2xldCB0PWVbdGVdO3JldHVybiBQZSh0KT90W3RlXTp0fWZ1bmN0aW9uIG11KGUpe3JldHVybiBlW2VyXT8/PVtdfWZ1bmN0aW9uIHl1KGUpe3JldHVybiBlLmNsZWFudXA/Pz1bXX1mdW5jdGlvbiBUaChlLHQsbixyKXtsZXQgbz1tdSh0KTtvLnB1c2gobiksZS5maXJzdENyZWF0ZVBhc3MmJnl1KGUpLnB1c2gocixvLmxlbmd0aC0xKX1mdW5jdGlvbiBfaCgpe3JldHVybiB4LmxGcmFtZS5lbGVtZW50RGVwdGhDb3VudH1mdW5jdGlvbiBNaCgpe3gubEZyYW1lLmVsZW1lbnREZXB0aENvdW50Kyt9ZnVuY3Rpb24gdnUoKXt4LmxGcmFtZS5lbGVtZW50RGVwdGhDb3VudC0tfWZ1bmN0aW9uIEtpKCl7cmV0dXJuIHguYmluZGluZ3NFbmFibGVkfWZ1bmN0aW9uIER1KCl7cmV0dXJuIHguc2tpcEh5ZHJhdGlvblJvb3RUTm9kZSE9PW51bGx9ZnVuY3Rpb24gRXUoZSl7cmV0dXJuIHguc2tpcEh5ZHJhdGlvblJvb3RUTm9kZT09PWV9ZnVuY3Rpb24gSXUoKXt4LnNraXBIeWRyYXRpb25Sb290VE5vZGU9bnVsbH1mdW5jdGlvbiBFKCl7cmV0dXJuIHgubEZyYW1lLmxWaWV3fWZ1bmN0aW9uIEIoKXtyZXR1cm4geC5sRnJhbWUudFZpZXd9ZnVuY3Rpb24gU2goZSl7cmV0dXJuIHgubEZyYW1lLmNvbnRleHRMVmlldz1lLGVbcV19ZnVuY3Rpb24gTmgoZSl7cmV0dXJuIHgubEZyYW1lLmNvbnRleHRMVmlldz1udWxsLGV9ZnVuY3Rpb24gSigpe2xldCBlPXd1KCk7Zm9yKDtlIT09bnVsbCYmZS50eXBlPT09NjQ7KWU9ZS5wYXJlbnQ7cmV0dXJuIGV9ZnVuY3Rpb24gd3UoKXtyZXR1cm4geC5sRnJhbWUuY3VycmVudFROb2RlfWZ1bmN0aW9uIEFoKCl7bGV0IGU9eC5sRnJhbWUsdD1lLmN1cnJlbnRUTm9kZTtyZXR1cm4gZS5pc1BhcmVudD90OnQucGFyZW50fWZ1bmN0aW9uIG9yKGUsdCl7bGV0IG49eC5sRnJhbWU7bi5jdXJyZW50VE5vZGU9ZSxuLmlzUGFyZW50PXR9ZnVuY3Rpb24gQ3UoKXtyZXR1cm4geC5sRnJhbWUuaXNQYXJlbnR9ZnVuY3Rpb24gYnUoKXt4LmxGcmFtZS5pc1BhcmVudD0hMX1mdW5jdGlvbiB4aCgpe3JldHVybiB4LmxGcmFtZS5jb250ZXh0TFZpZXd9ZnVuY3Rpb24gVHUoKXtyZXR1cm4gVmN9ZnVuY3Rpb24gaXIoZSl7bGV0IHQ9VmM7cmV0dXJuIFZjPWUsdH1mdW5jdGlvbiBtbigpe2xldCBlPXgubEZyYW1lLHQ9ZS5iaW5kaW5nUm9vdEluZGV4O3JldHVybiB0PT09LTEmJih0PWUuYmluZGluZ1Jvb3RJbmRleD1lLnRWaWV3LmJpbmRpbmdTdGFydEluZGV4KSx0fWZ1bmN0aW9uIF91KCl7cmV0dXJuIHgubEZyYW1lLmJpbmRpbmdJbmRleH1mdW5jdGlvbiBSaChlKXtyZXR1cm4geC5sRnJhbWUuYmluZGluZ0luZGV4PWV9ZnVuY3Rpb24gZXQoKXtyZXR1cm4geC5sRnJhbWUuYmluZGluZ0luZGV4Kyt9ZnVuY3Rpb24gZW8oZSl7bGV0IHQ9eC5sRnJhbWUsbj10LmJpbmRpbmdJbmRleDtyZXR1cm4gdC5iaW5kaW5nSW5kZXg9dC5iaW5kaW5nSW5kZXgrZSxufWZ1bmN0aW9uIE9oKCl7cmV0dXJuIHgubEZyYW1lLmluSTE4bn1mdW5jdGlvbiBGaChlLHQpe2xldCBuPXgubEZyYW1lO24uYmluZGluZ0luZGV4PW4uYmluZGluZ1Jvb3RJbmRleD1lLEppKHQpfWZ1bmN0aW9uIGtoKCl7cmV0dXJuIHgubEZyYW1lLmN1cnJlbnREaXJlY3RpdmVJbmRleH1mdW5jdGlvbiBKaShlKXt4LmxGcmFtZS5jdXJyZW50RGlyZWN0aXZlSW5kZXg9ZX1mdW5jdGlvbiBQaChlKXtsZXQgdD14LmxGcmFtZS5jdXJyZW50RGlyZWN0aXZlSW5kZXg7cmV0dXJuIHQ9PT0tMT9udWxsOmVbdF19ZnVuY3Rpb24gWGkoKXtyZXR1cm4geC5sRnJhbWUuY3VycmVudFF1ZXJ5SW5kZXh9ZnVuY3Rpb24gdG8oZSl7eC5sRnJhbWUuY3VycmVudFF1ZXJ5SW5kZXg9ZX1mdW5jdGlvbiBrRShlKXtsZXQgdD1lW3ddO3JldHVybiB0LnR5cGU9PT0yP3QuZGVjbFROb2RlOnQudHlwZT09PTE/ZVtmZV06bnVsbH1mdW5jdGlvbiBNdShlLHQsbil7aWYobiY0KXtsZXQgbz10LGk9ZTtmb3IoO289by5wYXJlbnQsbz09PW51bGwmJiEobiYxKTspaWYobz1rRShpKSxvPT09bnVsbHx8KGk9aVtsbl0sby50eXBlJjEwKSlicmVhaztpZihvPT09bnVsbClyZXR1cm4hMTt0PW8sZT1pfWxldCByPXgubEZyYW1lPUxoKCk7cmV0dXJuIHIuY3VycmVudFROb2RlPXQsci5sVmlldz1lLCEwfWZ1bmN0aW9uIGVzKGUpe2xldCB0PUxoKCksbj1lW3ddO3gubEZyYW1lPXQsdC5jdXJyZW50VE5vZGU9bi5maXJzdENoaWxkLHQubFZpZXc9ZSx0LnRWaWV3PW4sdC5jb250ZXh0TFZpZXc9ZSx0LmJpbmRpbmdJbmRleD1uLmJpbmRpbmdTdGFydEluZGV4LHQuaW5JMThuPSExfWZ1bmN0aW9uIExoKCl7bGV0IGU9eC5sRnJhbWUsdD1lPT09bnVsbD9udWxsOmUuY2hpbGQ7cmV0dXJuIHQ9PT1udWxsP2poKGUpOnR9ZnVuY3Rpb24gamgoZSl7bGV0IHQ9e2N1cnJlbnRUTm9kZTpudWxsLGlzUGFyZW50OiEwLGxWaWV3Om51bGwsdFZpZXc6bnVsbCxzZWxlY3RlZEluZGV4Oi0xLGNvbnRleHRMVmlldzpudWxsLGVsZW1lbnREZXB0aENvdW50OjAsY3VycmVudE5hbWVzcGFjZTpudWxsLGN1cnJlbnREaXJlY3RpdmVJbmRleDotMSxiaW5kaW5nUm9vdEluZGV4Oi0xLGJpbmRpbmdJbmRleDotMSxjdXJyZW50UXVlcnlJbmRleDowLHBhcmVudDplLGNoaWxkOm51bGwsaW5JMThuOiExfTtyZXR1cm4gZSE9PW51bGwmJihlLmNoaWxkPXQpLHR9ZnVuY3Rpb24gQmgoKXtsZXQgZT14LmxGcmFtZTtyZXR1cm4geC5sRnJhbWU9ZS5wYXJlbnQsZS5jdXJyZW50VE5vZGU9bnVsbCxlLmxWaWV3PW51bGwsZX1mdW5jdGlvbiB0cygpe2xldCBlPUJoKCk7ZS5pc1BhcmVudD0hMCxlLnRWaWV3PW51bGwsZS5zZWxlY3RlZEluZGV4PS0xLGUuY29udGV4dExWaWV3PW51bGwsZS5lbGVtZW50RGVwdGhDb3VudD0wLGUuY3VycmVudERpcmVjdGl2ZUluZGV4PS0xLGUuY3VycmVudE5hbWVzcGFjZT1udWxsLGUuYmluZGluZ1Jvb3RJbmRleD0tMSxlLmJpbmRpbmdJbmRleD0tMSxlLmN1cnJlbnRRdWVyeUluZGV4PTB9ZnVuY3Rpb24gVmgoZSl7cmV0dXJuKHgubEZyYW1lLmNvbnRleHRMVmlldz1DaChlLHgubEZyYW1lLmNvbnRleHRMVmlldykpW3FdfWZ1bmN0aW9uIGplKCl7cmV0dXJuIHgubEZyYW1lLnNlbGVjdGVkSW5kZXh9ZnVuY3Rpb24gT3QoZSl7eC5sRnJhbWUuc2VsZWN0ZWRJbmRleD1lfWZ1bmN0aW9uIHNyKCl7bGV0IGU9eC5sRnJhbWU7cmV0dXJuIEpyKGUudFZpZXcsZS5zZWxlY3RlZEluZGV4KX1mdW5jdGlvbiBIaCgpe3gubEZyYW1lLmN1cnJlbnROYW1lc3BhY2U9bHV9ZnVuY3Rpb24gVWgoKXtQRSgpfWZ1bmN0aW9uIFBFKCl7eC5sRnJhbWUuY3VycmVudE5hbWVzcGFjZT1udWxsfWZ1bmN0aW9uICRoKCl7cmV0dXJuIHgubEZyYW1lLmN1cnJlbnROYW1lc3BhY2V9ZnVuY3Rpb24gbnMoKXtyZXR1cm4gemh9ZnVuY3Rpb24gbm8oZSl7emg9ZX1mdW5jdGlvbiBIYyhlLHQ9bnVsbCxuPW51bGwscil7bGV0IG89TnUoZSx0LG4scik7cmV0dXJuIG8ucmVzb2x2ZUluamVjdG9ySW5pdGlhbGl6ZXJzKCksb31mdW5jdGlvbiBOdShlLHQ9bnVsbCxuPW51bGwscixvPW5ldyBTZXQpe2xldCBpPVtufHxhZSxnaChlKV07cmV0dXJuIHI9cnx8KHR5cGVvZiBlPT0ib2JqZWN0Ij92b2lkIDA6ZnQoZSkpLG5ldyBhbihpLHR8fEpuKCkscnx8bnVsbCxvKX1mdW5jdGlvbiBMRSgpe3JldHVybiBuZXcgV3IoRSgpKX1mdW5jdGlvbiBBdShlKXtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiImJmVbWF0hPT12b2lkIDB9ZnVuY3Rpb24gcnMoZSx0KXtsZXRbbixyLG9dPU5hKGUsdD8uZXF1YWwpLGk9bixzPWlbWF07cmV0dXJuIGkuc2V0PXIsaS51cGRhdGU9byxpLmFzUmVhZG9ubHk9eHUuYmluZChpKSxpfWZ1bmN0aW9uIHh1KCl7bGV0IGU9dGhpc1tYXTtpZihlLnJlYWRvbmx5Rm49PT12b2lkIDApe2xldCB0PSgpPT50aGlzKCk7dFtYXT1lLGUucmVhZG9ubHlGbj10fXJldHVybiBlLnJlYWRvbmx5Rm59ZnVuY3Rpb24gUnUoZSl7cmV0dXJuIEF1KGUpJiZ0eXBlb2YgZS5zZXQ9PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gakUoKXtyZXR1cm4gbmV3IHluKEUoKSxKKCkpfWZ1bmN0aW9uIHZuKC4uLmUpe312YXIgamksdixuZSxnRSxIaSxQaSxULEdjLFdjLHFjLFpjLHpyLGNuLHJoLGFoLERFLEVFLEZjLHdFLHJuLGtjLFBjLEZlLGFlLE50LFhjLGV1LEdyLE1FLFlyLGtpLG9oLFJjLHllLGFuLGtlLHcsQSx0ZSxfZSxmZSx1bixlcixxLGh0LEtlLFAsdHIsc3UsbG4sY2UsQXQsZG4sSmUsUXIsYXUsZHQscWksZ3QsSWUsZm4scG4sSCxEaCxjdSx4dCxLcixobixaLGx1LEVoLHgsVmMsU3UsemgsdmUsWSxBZSxXcixEZSxCZSxHaCx5bixUZSxybyxPdSxGdSxGdCxhcixvbyxVYyxpbz1oKCgpPT57Q2EoKTtXdCgpO1VyKCk7eGMoKTtuaCgpO2ppPSJodHRwczovL2FuZ3VsYXIuZGV2L2Jlc3QtcHJhY3RpY2VzL3NlY3VyaXR5I3ByZXZlbnRpbmctY3Jvc3Mtc2l0ZS1zY3JpcHRpbmcteHNzIix2PWNsYXNzIGV4dGVuZHMgRXJyb3J7Y29kZTtjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKFllKHQsbikpLHRoaXMuY29kZT10fX07bmU9Z2xvYmFsVGhpcztnRT1rKHtfX2ZvcndhcmRfcmVmX186a30pO0hpPWsoe1x1MDI3NXByb3Y6a30pLFBpPWsoe1x1MDI3NWluajprfSksVD1jbGFzc3tfZGVzYztuZ01ldGFkYXRhTmFtZT0iSW5qZWN0aW9uVG9rZW4iO1x1MDI3NXByb3Y7Y29uc3RydWN0b3IodCxuKXt0aGlzLl9kZXNjPXQsdGhpcy5cdTAyNzVwcm92PXZvaWQgMCx0eXBlb2Ygbj09Im51bWJlciI/dGhpcy5fX05HX0VMRU1FTlRfSURfXz1uOm4hPT12b2lkIDAmJih0aGlzLlx1MDI3NXByb3Y9Tih7dG9rZW46dGhpcyxwcm92aWRlZEluOm4ucHJvdmlkZWRJbnx8InJvb3QiLGZhY3Rvcnk6bi5mYWN0b3J5fSkpfWdldCBtdWx0aSgpe3JldHVybiB0aGlzfXRvU3RyaW5nKCl7cmV0dXJuYEluamVjdGlvblRva2VuICR7dGhpcy5fZGVzY31gfX07R2M9ayh7XHUwMjc1Y21wOmt9KSxXYz1rKHtcdTAyNzVkaXI6a30pLHFjPWsoe1x1MDI3NXBpcGU6a30pLFpjPWsoe1x1MDI3NW1vZDprfSksenI9ayh7XHUwMjc1ZmFjOmt9KSxjbj1rKHtfX05HX0VMRU1FTlRfSURfXzprfSkscmg9ayh7X19OR19FTlZfSURfXzprfSk7YWg9ayh7bmdFcnJvckNvZGU6a30pLERFPWsoe25nRXJyb3JNZXNzYWdlOmt9KSxFRT1rKHtuZ1Rva2VuUGF0aDprfSk7d0U9e30scm49d0Usa2M9Il9fTkdfRElfRkxBR19fIixQYz1jbGFzc3tpbmplY3Rvcjtjb25zdHJ1Y3Rvcih0KXt0aGlzLmluamVjdG9yPXR9cmV0cmlldmUodCxuKXtsZXQgcj1vbihuKXx8MDt0cnl7cmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KHQsciY4P251bGw6cm4scil9Y2F0Y2gobyl7aWYoTm4obykpcmV0dXJuIG87dGhyb3cgb319fTtGZT17fSxhZT1bXSxOdD1uZXcgVCgiIiksWGM9bmV3IFQoIiIsLTEpLGV1PW5ldyBUKCIiKSxHcj1jbGFzc3tnZXQodCxuPXJuKXtpZihuPT09cm4pe2xldCBvPWNoKCIiLC0yMDEpO3Rocm93IG8ubmFtZT0iXHUwMjc1Tm90Rm91bmQiLG99cmV0dXJuIG59fTtNRT1rKHtwcm92aWRlOlN0cmluZyx1c2VWYWx1ZTprfSk7WXI9bmV3IFQoIiIpLGtpPXt9LG9oPXt9O3llPWNsYXNze30sYW49Y2xhc3MgZXh0ZW5kcyB5ZXtwYXJlbnQ7c291cmNlO3Njb3BlcztyZWNvcmRzPW5ldyBNYXA7X25nT25EZXN0cm95SG9va3M9bmV3IFNldDtfb25EZXN0cm95SG9va3M9W107Z2V0IGRlc3Ryb3llZCgpe3JldHVybiB0aGlzLl9kZXN0cm95ZWR9X2Rlc3Ryb3llZD0hMTtpbmplY3RvckRlZlR5cGVzO2NvbnN0cnVjdG9yKHQsbixyLG8pe3N1cGVyKCksdGhpcy5wYXJlbnQ9bix0aGlzLnNvdXJjZT1yLHRoaXMuc2NvcGVzPW8sQmModCxzPT50aGlzLnByb2Nlc3NQcm92aWRlcihzKSksdGhpcy5yZWNvcmRzLnNldChYYyxZbih2b2lkIDAsdGhpcykpLG8uaGFzKCJlbnZpcm9ubWVudCIpJiZ0aGlzLnJlY29yZHMuc2V0KHllLFluKHZvaWQgMCx0aGlzKSk7bGV0IGk9dGhpcy5yZWNvcmRzLmdldChZcik7aSE9bnVsbCYmdHlwZW9mIGkudmFsdWU9PSJzdHJpbmciJiZ0aGlzLnNjb3Blcy5hZGQoaS52YWx1ZSksdGhpcy5pbmplY3RvckRlZlR5cGVzPW5ldyBTZXQodGhpcy5nZXQoZXUsYWUse3NlbGY6ITB9KSl9cmV0cmlldmUodCxuKXtsZXQgcj1vbihuKXx8MDt0cnl7cmV0dXJuIHRoaXMuZ2V0KHQscm4scil9Y2F0Y2gobyl7aWYoTm4obykpcmV0dXJuIG87dGhyb3cgb319ZGVzdHJveSgpeyRyKHRoaXMpLHRoaXMuX2Rlc3Ryb3llZD0hMDtsZXQgdD1NKG51bGwpO3RyeXtmb3IobGV0IHIgb2YgdGhpcy5fbmdPbkRlc3Ryb3lIb29rcylyLm5nT25EZXN0cm95KCk7bGV0IG49dGhpcy5fb25EZXN0cm95SG9va3M7dGhpcy5fb25EZXN0cm95SG9va3M9W107Zm9yKGxldCByIG9mIG4pcigpfWZpbmFsbHl7dGhpcy5yZWNvcmRzLmNsZWFyKCksdGhpcy5fbmdPbkRlc3Ryb3lIb29rcy5jbGVhcigpLHRoaXMuaW5qZWN0b3JEZWZUeXBlcy5jbGVhcigpLE0odCl9fW9uRGVzdHJveSh0KXtyZXR1cm4gJHIodGhpcyksdGhpcy5fb25EZXN0cm95SG9va3MucHVzaCh0KSwoKT0+dGhpcy5yZW1vdmVPbkRlc3Ryb3kodCl9cnVuSW5Db250ZXh0KHQpeyRyKHRoaXMpO2xldCBuPUdlKHRoaXMpLHI9ZGUodm9pZCAwKSxvO3RyeXtyZXR1cm4gdCgpfWZpbmFsbHl7R2UobiksZGUocil9fWdldCh0LG49cm4scil7aWYoJHIodGhpcyksdC5oYXNPd25Qcm9wZXJ0eShyaCkpcmV0dXJuIHRbcmhdKHRoaXMpO2xldCBvPW9uKHIpLGkscz1HZSh0aGlzKSxhPWRlKHZvaWQgMCk7dHJ5e2lmKCEobyY0KSl7bGV0IHU9dGhpcy5yZWNvcmRzLmdldCh0KTtpZih1PT09dm9pZCAwKXtsZXQgbD1GRSh0KSYmcXIodCk7bCYmdGhpcy5pbmplY3RhYmxlRGVmSW5TY29wZShsKT91PVluKGpjKHQpLGtpKTp1PW51bGwsdGhpcy5yZWNvcmRzLnNldCh0LHUpfWlmKHUhPW51bGwpcmV0dXJuIHRoaXMuaHlkcmF0ZSh0LHUsbyl9bGV0IGM9byYyP0puKCk6dGhpcy5wYXJlbnQ7cmV0dXJuIG49byY4JiZuPT09cm4/bnVsbDpuLGMuZ2V0KHQsbil9Y2F0Y2goYyl7bGV0IHU9SUUoYyk7dGhyb3cgdT09PS0yMDB8fHU9PT0tMjAxP25ldyB2KHUsbnVsbCk6Y31maW5hbGx5e2RlKGEpLEdlKHMpfX1yZXNvbHZlSW5qZWN0b3JJbml0aWFsaXplcnMoKXtsZXQgdD1NKG51bGwpLG49R2UodGhpcykscj1kZSh2b2lkIDApLG87dHJ5e2xldCBpPXRoaXMuZ2V0KE50LGFlLHtzZWxmOiEwfSk7Zm9yKGxldCBzIG9mIGkpcygpfWZpbmFsbHl7R2UobiksZGUociksTSh0KX19dG9TdHJpbmcoKXtsZXQgdD1bXSxuPXRoaXMucmVjb3Jkcztmb3IobGV0IHIgb2Ygbi5rZXlzKCkpdC5wdXNoKGZ0KHIpKTtyZXR1cm5gUjNJbmplY3Rvclske3Quam9pbigiLCAiKX1dYH1wcm9jZXNzUHJvdmlkZXIodCl7dD1lZSh0KTtsZXQgbj1zbih0KT90OmVlKHQmJnQucHJvdmlkZSkscj14RSh0KTtpZighc24odCkmJnQubXVsdGk9PT0hMCl7bGV0IG89dGhpcy5yZWNvcmRzLmdldChuKTtvfHwobz1Zbih2b2lkIDAsa2ksITApLG8uZmFjdG9yeT0oKT0+TGMoby5tdWx0aSksdGhpcy5yZWNvcmRzLnNldChuLG8pKSxuPXQsby5tdWx0aS5wdXNoKHQpfXRoaXMucmVjb3Jkcy5zZXQobixyKX1oeWRyYXRlKHQsbixyKXtsZXQgbz1NKG51bGwpO3RyeXtpZihuLnZhbHVlPT09b2gpdGhyb3cgWWMoZnQodCkpO3JldHVybiBuLnZhbHVlPT09a2kmJihuLnZhbHVlPW9oLG4udmFsdWU9bi5mYWN0b3J5KHZvaWQgMCxyKSksdHlwZW9mIG4udmFsdWU9PSJvYmplY3QiJiZuLnZhbHVlJiZPRShuLnZhbHVlKSYmdGhpcy5fbmdPbkRlc3Ryb3lIb29rcy5hZGQobi52YWx1ZSksbi52YWx1ZX1maW5hbGx5e00obyl9fWluamVjdGFibGVEZWZJblNjb3BlKHQpe2lmKCF0LnByb3ZpZGVkSW4pcmV0dXJuITE7bGV0IG49ZWUodC5wcm92aWRlZEluKTtyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmciP249PT0iYW55Inx8dGhpcy5zY29wZXMuaGFzKG4pOnRoaXMuaW5qZWN0b3JEZWZUeXBlcy5oYXMobil9cmVtb3ZlT25EZXN0cm95KHQpe2xldCBuPXRoaXMuX29uRGVzdHJveUhvb2tzLmluZGV4T2YodCk7biE9PS0xJiZ0aGlzLl9vbkRlc3Ryb3lIb29rcy5zcGxpY2UobiwxKX19O2tlPTAsdz0xLEE9Mix0ZT0zLF9lPTQsZmU9NSx1bj02LGVyPTcscT04LGh0PTksS2U9MTAsUD0xMSx0cj0xMixzdT0xMyxsbj0xNCxjZT0xNSxBdD0xNixkbj0xNyxKZT0xOCxRcj0xOSxhdT0yMCxkdD0yMSxxaT0yMixndD0yMyxJZT0yNCxmbj0yNSxwbj0yNixIPTI3LERoPTEsY3U9Nix4dD03LEtyPTgsaG49OSxaPTEwO2x1PSJzdmciLEVoPSJtYXRoIjt4PXtsRnJhbWU6amgobnVsbCksYmluZGluZ3NFbmFibGVkOiEwLHNraXBIeWRyYXRpb25Sb290VE5vZGU6bnVsbH0sVmM9ITE7U3U9Qmg7emg9ITA7dmU9Y2xhc3MgZXtzdGF0aWMgVEhST1dfSUZfTk9UX0ZPVU5EPXJuO3N0YXRpYyBOVUxMPW5ldyBHcjtzdGF0aWMgY3JlYXRlKHQsbil7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gSGMoe25hbWU6IiJ9LG4sdCwiIik7e2xldCByPXQubmFtZT8/IiI7cmV0dXJuIEhjKHtuYW1lOnJ9LHQucGFyZW50LHQucHJvdmlkZXJzLHIpfX1zdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLHByb3ZpZGVkSW46ImFueSIsZmFjdG9yeTooKT0+QyhYYyl9KTtzdGF0aWMgX19OR19FTEVNRU5UX0lEX189LTF9LFk9bmV3IFQoIiIpLEFlPSgoKT0+e2NsYXNzIGV7c3RhdGljIF9fTkdfRUxFTUVOVF9JRF9fPUxFO3N0YXRpYyBfX05HX0VOVl9JRF9fPW49Pm59cmV0dXJuIGV9KSgpLFdyPWNsYXNzIGV4dGVuZHMgQWV7X2xWaWV3O2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fbFZpZXc9dH1nZXQgZGVzdHJveWVkKCl7cmV0dXJuIGduKHRoaXMuX2xWaWV3KX1vbkRlc3Ryb3kodCl7bGV0IG49dGhpcy5fbFZpZXc7cmV0dXJuIGd1KG4sdCksKCk9PmJoKG4sdCl9fTtEZT1jbGFzc3tfY29uc29sZT1jb25zb2xlO2hhbmRsZUVycm9yKHQpe3RoaXMuX2NvbnNvbGUuZXJyb3IoIkVSUk9SIix0KX19LEJlPW5ldyBUKCIiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT57bGV0IGU9eSh5ZSksdDtyZXR1cm4gbj0+e2UuZGVzdHJveWVkJiYhdD9zZXRUaW1lb3V0KCgpPT57dGhyb3cgbn0pOih0Pz89ZS5nZXQoRGUpLHQuaGFuZGxlRXJyb3IobikpfX19KSxHaD17cHJvdmlkZTpOdCx1c2VWYWx1ZTooKT0+dm9pZCB5KERlKSxtdWx0aTohMH07eW49KCgpPT57Y2xhc3MgZXt2aWV3O25vZGU7Y29uc3RydWN0b3IobixyKXt0aGlzLnZpZXc9bix0aGlzLm5vZGU9cn1zdGF0aWMgX19OR19FTEVNRU5UX0lEX189akV9cmV0dXJuIGV9KSgpO1RlPWNsYXNze30scm89bmV3IFQoIiIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9PiExfSksT3U9bmV3IFQoIiIpLEZ1PW5ldyBUKCIiKSxGdD0oKCk9PntjbGFzcyBle3Rhc2tJZD0wO3BlbmRpbmdUYXNrcz1uZXcgU2V0O2Rlc3Ryb3llZD0hMTtwZW5kaW5nVGFzaz1uZXcgUnIoITEpO2dldCBoYXNQZW5kaW5nVGFza3MoKXtyZXR1cm4gdGhpcy5kZXN0cm95ZWQ/ITE6dGhpcy5wZW5kaW5nVGFzay52YWx1ZX1nZXQgaGFzUGVuZGluZ1Rhc2tzT2JzZXJ2YWJsZSgpe3JldHVybiB0aGlzLmRlc3Ryb3llZD9uZXcgUihuPT57bi5uZXh0KCExKSxuLmNvbXBsZXRlKCl9KTp0aGlzLnBlbmRpbmdUYXNrfWFkZCgpeyF0aGlzLmhhc1BlbmRpbmdUYXNrcyYmIXRoaXMuZGVzdHJveWVkJiZ0aGlzLnBlbmRpbmdUYXNrLm5leHQoITApO2xldCBuPXRoaXMudGFza0lkKys7cmV0dXJuIHRoaXMucGVuZGluZ1Rhc2tzLmFkZChuKSxufWhhcyhuKXtyZXR1cm4gdGhpcy5wZW5kaW5nVGFza3MuaGFzKG4pfXJlbW92ZShuKXt0aGlzLnBlbmRpbmdUYXNrcy5kZWxldGUobiksdGhpcy5wZW5kaW5nVGFza3Muc2l6ZT09PTAmJnRoaXMuaGFzUGVuZGluZ1Rhc2tzJiZ0aGlzLnBlbmRpbmdUYXNrLm5leHQoITEpfW5nT25EZXN0cm95KCl7dGhpcy5wZW5kaW5nVGFza3MuY2xlYXIoKSx0aGlzLmhhc1BlbmRpbmdUYXNrcyYmdGhpcy5wZW5kaW5nVGFzay5uZXh0KCExKSx0aGlzLmRlc3Ryb3llZD0hMCx0aGlzLnBlbmRpbmdUYXNrLnVuc3Vic2NyaWJlKCl9c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT5uZXcgZX0pfXJldHVybiBlfSkoKSxhcj0oKCk9PntjbGFzcyBle2ludGVybmFsUGVuZGluZ1Rhc2tzPXkoRnQpO3NjaGVkdWxlcj15KFRlKTtlcnJvckhhbmRsZXI9eShCZSk7YWRkKCl7bGV0IG49dGhpcy5pbnRlcm5hbFBlbmRpbmdUYXNrcy5hZGQoKTtyZXR1cm4oKT0+e3RoaXMuaW50ZXJuYWxQZW5kaW5nVGFza3MuaGFzKG4pJiYodGhpcy5zY2hlZHVsZXIubm90aWZ5KDExKSx0aGlzLmludGVybmFsUGVuZGluZ1Rhc2tzLnJlbW92ZShuKSl9fXJ1bihuKXtsZXQgcj10aGlzLmFkZCgpO24oKS5jYXRjaCh0aGlzLmVycm9ySGFuZGxlcikuZmluYWxseShyKX1zdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLHByb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9Pm5ldyBlfSl9cmV0dXJuIGV9KSgpO29vPSgoKT0+e2NsYXNzIGV7c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT5uZXcgVWN9KX1yZXR1cm4gZX0pKCksVWM9Y2xhc3N7ZGlydHlFZmZlY3RDb3VudD0wO3F1ZXVlcz1uZXcgTWFwO2FkZCh0KXt0aGlzLmVucXVldWUodCksdGhpcy5zY2hlZHVsZSh0KX1zY2hlZHVsZSh0KXt0LmRpcnR5JiZ0aGlzLmRpcnR5RWZmZWN0Q291bnQrK31yZW1vdmUodCl7bGV0IG49dC56b25lLHI9dGhpcy5xdWV1ZXMuZ2V0KG4pO3IuaGFzKHQpJiYoci5kZWxldGUodCksdC5kaXJ0eSYmdGhpcy5kaXJ0eUVmZmVjdENvdW50LS0pfWVucXVldWUodCl7bGV0IG49dC56b25lO3RoaXMucXVldWVzLmhhcyhuKXx8dGhpcy5xdWV1ZXMuc2V0KG4sbmV3IFNldCk7bGV0IHI9dGhpcy5xdWV1ZXMuZ2V0KG4pO3IuaGFzKHQpfHxyLmFkZCh0KX1mbHVzaCgpe2Zvcig7dGhpcy5kaXJ0eUVmZmVjdENvdW50PjA7KXtsZXQgdD0hMTtmb3IobGV0W24scl1vZiB0aGlzLnF1ZXVlcyluPT09bnVsbD90fHw9dGhpcy5mbHVzaFF1ZXVlKHIpOnR8fD1uLnJ1bigoKT0+dGhpcy5mbHVzaFF1ZXVlKHIpKTt0fHwodGhpcy5kaXJ0eUVmZmVjdENvdW50PTApfX1mbHVzaFF1ZXVlKHQpe2xldCBuPSExO2ZvcihsZXQgciBvZiB0KXIuZGlydHkmJih0aGlzLmRpcnR5RWZmZWN0Q291bnQtLSxuPSEwLHIucnVuKCkpO3JldHVybiBufX19KTt2YXIga3U9aCgoKT0+e3hwKCk7ZmMoKTtGcCgpO2hjKCk7UmkoKTt2YygpO1puKCk7RWMoKTtVcCgpOyRwKCk7R24oKTttYygpO0FpKCk7ZW4oKTt6cCgpOyRhKCk7R3AoKTtUYygpO1dwKCk7cXAoKTtfYygpO01jKCk7VnIoKTt3YygpO1NjKCk7TmMoKTtBYygpfSk7ZnVuY3Rpb24gZ3IoZSl7cmV0dXJue3RvU3RyaW5nOmV9LnRvU3RyaW5nKCl9ZnVuY3Rpb24gR0UoZSl7cmV0dXJuIGZ1bmN0aW9uKC4uLm4pe2lmKGUpe2xldCByPWUoLi4ubik7Zm9yKGxldCBvIGluIHIpdGhpc1tvXT1yW29dfX19ZnVuY3Rpb24gU2coZSx0LG4pe3JldHVybiBncigoKT0+e2xldCByPUdFKHQpO2Z1bmN0aW9uIG8oLi4uaSl7aWYodGhpcyBpbnN0YW5jZW9mIG8pcmV0dXJuIHIuYXBwbHkodGhpcyxpKSx0aGlzO2xldCBzPW5ldyBvKC4uLmkpO3JldHVybiBhLmFubm90YXRpb249cyxhO2Z1bmN0aW9uIGEoYyx1LGwpe2xldCBkPWMuaGFzT3duUHJvcGVydHkob3MpP2Nbb3NdOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLG9zLHt2YWx1ZTpbXX0pW29zXTtmb3IoO2QubGVuZ3RoPD1sOylkLnB1c2gobnVsbCk7cmV0dXJuKGRbbF09ZFtsXXx8W10pLnB1c2gocyksY319cmV0dXJuIG8ucHJvdG90eXBlLm5nTWV0YWRhdGFOYW1lPWUsby5hbm5vdGF0aW9uQ2xzPW8sb30pfWZ1bmN0aW9uIHFFKGUpe3JldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uIn1mdW5jdGlvbiBBZyhlLHQsbixyKXt0IT09bnVsbD90LmFwcGx5VmFsdWVUb0lucHV0U2lnbmFsKHQscik6ZVtuXT1yfWZ1bmN0aW9uIHhnKGUpe3JldHVybiBlLnR5cGUucHJvdG90eXBlLm5nT25DaGFuZ2VzJiYoZS5zZXRJbnB1dD1ZRSksWkV9ZnVuY3Rpb24gWkUoKXtsZXQgZT1PZyh0aGlzKSx0PWU/LmN1cnJlbnQ7aWYodCl7bGV0IG49ZS5wcmV2aW91cztpZihuPT09RmUpZS5wcmV2aW91cz10O2Vsc2UgZm9yKGxldCByIGluIHQpbltyXT10W3JdO2UuY3VycmVudD1udWxsLHRoaXMubmdPbkNoYW5nZXModCl9fWZ1bmN0aW9uIFlFKGUsdCxuLHIsbyl7bGV0IGk9dGhpcy5kZWNsYXJlZElucHV0c1tyXSxzPU9nKGUpfHxRRShlLHtwcmV2aW91czpGZSxjdXJyZW50Om51bGx9KSxhPXMuY3VycmVudHx8KHMuY3VycmVudD17fSksYz1zLnByZXZpb3VzLHU9Y1tpXTthW2ldPW5ldyBncyh1JiZ1LmN1cnJlbnRWYWx1ZSxuLGM9PT1GZSksQWcoZSx0LG8sbil9ZnVuY3Rpb24gT2coZSl7cmV0dXJuIGVbUmddfHxudWxsfWZ1bmN0aW9uIFFFKGUsdCl7cmV0dXJuIGVbUmddPXR9ZnVuY3Rpb24gS0UoZSx0LG4pe2xldHtuZ09uQ2hhbmdlczpyLG5nT25Jbml0Om8sbmdEb0NoZWNrOml9PXQudHlwZS5wcm90b3R5cGU7aWYocil7bGV0IHM9eGcodCk7KG4ucHJlT3JkZXJIb29rcz8/PVtdKS5wdXNoKGUscyksKG4ucHJlT3JkZXJDaGVja0hvb2tzPz89W10pLnB1c2goZSxzKX1vJiYobi5wcmVPcmRlckhvb2tzPz89W10pLnB1c2goMC1lLG8pLGkmJigobi5wcmVPcmRlckhvb2tzPz89W10pLnB1c2goZSxpKSwobi5wcmVPcmRlckNoZWNrSG9va3M/Pz1bXSkucHVzaChlLGkpKX1mdW5jdGlvbiBGZyhlLHQpe2ZvcihsZXQgbj10LmRpcmVjdGl2ZVN0YXJ0LHI9dC5kaXJlY3RpdmVFbmQ7bjxyO24rKyl7bGV0IGk9ZS5kYXRhW25dLnR5cGUucHJvdG90eXBlLHtuZ0FmdGVyQ29udGVudEluaXQ6cyxuZ0FmdGVyQ29udGVudENoZWNrZWQ6YSxuZ0FmdGVyVmlld0luaXQ6YyxuZ0FmdGVyVmlld0NoZWNrZWQ6dSxuZ09uRGVzdHJveTpsfT1pO3MmJihlLmNvbnRlbnRIb29rcz8/PVtdKS5wdXNoKC1uLHMpLGEmJigoZS5jb250ZW50SG9va3M/Pz1bXSkucHVzaChuLGEpLChlLmNvbnRlbnRDaGVja0hvb2tzPz89W10pLnB1c2gobixhKSksYyYmKGUudmlld0hvb2tzPz89W10pLnB1c2goLW4sYyksdSYmKChlLnZpZXdIb29rcz8/PVtdKS5wdXNoKG4sdSksKGUudmlld0NoZWNrSG9va3M/Pz1bXSkucHVzaChuLHUpKSxsIT1udWxsJiYoZS5kZXN0cm95SG9va3M/Pz1bXSkucHVzaChuLGwpfX1mdW5jdGlvbiBscyhlLHQsbil7a2coZSx0LDMsbil9ZnVuY3Rpb24gZHMoZSx0LG4scil7KGVbQV0mMyk9PT1uJiZrZyhlLHQsbixyKX1mdW5jdGlvbiBQdShlLHQpe2xldCBuPWVbQV07KG4mMyk9PT10JiYobiY9MTYzODMsbis9MSxlW0FdPW4pfWZ1bmN0aW9uIGtnKGUsdCxuLHIpe2xldCBvPXIhPT12b2lkIDA/ZVtkbl0mNjU1MzU6MCxpPXI/Py0xLHM9dC5sZW5ndGgtMSxhPTA7Zm9yKGxldCBjPW87YzxzO2MrKylpZih0eXBlb2YgdFtjKzFdPT0ibnVtYmVyIil7aWYoYT10W2NdLHIhPW51bGwmJmE+PXIpYnJlYWt9ZWxzZSB0W2NdPDAmJihlW2RuXSs9NjU1MzYpLChhPGl8fGk9PS0xKSYmKEpFKGUsbix0LGMpLGVbZG5dPShlW2RuXSY0Mjk0OTAxNzYwKStjKzIpLGMrK31mdW5jdGlvbiBxaChlLHQpe0woNCxlLHQpO2xldCBuPU0obnVsbCk7dHJ5e3QuY2FsbChlKX1maW5hbGx5e00obiksTCg1LGUsdCl9fWZ1bmN0aW9uIEpFKGUsdCxuLHIpe2xldCBvPW5bcl08MCxpPW5bcisxXSxzPW8/LW5bcl06bltyXSxhPWVbc107bz9lW0FdPj4xNDxlW2RuXT4+MTYmJihlW0FdJjMpPT09dCYmKGVbQV0rPTE2Mzg0LHFoKGEsaSkpOnFoKGEsaSl9ZnVuY3Rpb24gWEUoZSl7cmV0dXJuKGUuZmxhZ3MmOCkhPT0wfWZ1bmN0aW9uIGVJKGUpe3JldHVybihlLmZsYWdzJjE2KSE9PTB9ZnVuY3Rpb24gdEkoZSx0LG4pe2xldCByPTA7Zm9yKDtyPG4ubGVuZ3RoOyl7bGV0IG89bltyXTtpZih0eXBlb2Ygbz09Im51bWJlciIpe2lmKG8hPT0wKWJyZWFrO3IrKztsZXQgaT1uW3IrK10scz1uW3IrK10sYT1uW3IrK107ZS5zZXRBdHRyaWJ1dGUodCxzLGEsaSl9ZWxzZXtsZXQgaT1vLHM9blsrK3JdO25JKGkpP2Uuc2V0UHJvcGVydHkodCxpLHMpOmUuc2V0QXR0cmlidXRlKHQsaSxzKSxyKyt9fXJldHVybiByfWZ1bmN0aW9uIFBnKGUpe3JldHVybiBlPT09M3x8ZT09PTR8fGU9PT02fWZ1bmN0aW9uIG5JKGUpe3JldHVybiBlLmNoYXJDb2RlQXQoMCk9PT02NH1mdW5jdGlvbiBscihlLHQpe2lmKCEodD09PW51bGx8fHQubGVuZ3RoPT09MCkpaWYoZT09PW51bGx8fGUubGVuZ3RoPT09MCllPXQuc2xpY2UoKTtlbHNle2xldCBuPS0xO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXtsZXQgbz10W3JdO3R5cGVvZiBvPT0ibnVtYmVyIj9uPW86bj09PTB8fChuPT09LTF8fG49PT0yP1poKGUsbixvLG51bGwsdFsrK3JdKTpaaChlLG4sbyxudWxsLG51bGwpKX19cmV0dXJuIGV9ZnVuY3Rpb24gWmgoZSx0LG4scixvKXtsZXQgaT0wLHM9ZS5sZW5ndGg7aWYodD09PS0xKXM9LTE7ZWxzZSBmb3IoO2k8ZS5sZW5ndGg7KXtsZXQgYT1lW2krK107aWYodHlwZW9mIGE9PSJudW1iZXIiKXtpZihhPT09dCl7cz0tMTticmVha31lbHNlIGlmKGE+dCl7cz1pLTE7YnJlYWt9fX1mb3IoO2k8ZS5sZW5ndGg7KXtsZXQgYT1lW2ldO2lmKHR5cGVvZiBhPT0ibnVtYmVyIilicmVhaztpZihhPT09bil7byE9PW51bGwmJihlW2krMV09byk7cmV0dXJufWkrKyxvIT09bnVsbCYmaSsrfXMhPT0tMSYmKGUuc3BsaWNlKHMsMCx0KSxpPXMrMSksZS5zcGxpY2UoaSsrLDAsbiksbyE9PW51bGwmJmUuc3BsaWNlKGkrKywwLG8pfWZ1bmN0aW9uIExnKGUpe3JldHVybiBlIT09dXJ9ZnVuY3Rpb24gbXMoZSl7cmV0dXJuIGUmMzI3Njd9ZnVuY3Rpb24gckkoZSl7cmV0dXJuIGU+PjE2fWZ1bmN0aW9uIHlzKGUsdCl7bGV0IG49ckkoZSkscj10O2Zvcig7bj4wOylyPXJbbG5dLG4tLTtyZXR1cm4gcn1mdW5jdGlvbiB2cyhlKXtsZXQgdD1xdTtyZXR1cm4gcXU9ZSx0fWZ1bmN0aW9uIHNJKGUsdCxuKXtsZXQgcjt0eXBlb2Ygbj09InN0cmluZyI/cj1uLmNoYXJDb2RlQXQoMCl8fDA6bi5oYXNPd25Qcm9wZXJ0eShjbikmJihyPW5bY25dKSxyPT1udWxsJiYocj1uW2NuXT1pSSsrKTtsZXQgbz1yJmpnLGk9MTw8bzt0LmRhdGFbZSsobz4+QmcpXXw9aX1mdW5jdGlvbiBEcyhlLHQpe2xldCBuPVZnKGUsdCk7aWYobiE9PS0xKXJldHVybiBuO2xldCByPXRbd107ci5maXJzdENyZWF0ZVBhc3MmJihlLmluamVjdG9ySW5kZXg9dC5sZW5ndGgsTHUoci5kYXRhLGUpLEx1KHQsbnVsbCksTHUoci5ibHVlcHJpbnQsbnVsbCkpO2xldCBvPUZsKGUsdCksaT1lLmluamVjdG9ySW5kZXg7aWYoTGcobykpe2xldCBzPW1zKG8pLGE9eXMobyx0KSxjPWFbd10uZGF0YTtmb3IobGV0IHU9MDt1PDg7dSsrKXRbaSt1XT1hW3MrdV18Y1tzK3VdfXJldHVybiB0W2krOF09byxpfWZ1bmN0aW9uIEx1KGUsdCl7ZS5wdXNoKDAsMCwwLDAsMCwwLDAsMCx0KX1mdW5jdGlvbiBWZyhlLHQpe3JldHVybiBlLmluamVjdG9ySW5kZXg9PT0tMXx8ZS5wYXJlbnQmJmUucGFyZW50LmluamVjdG9ySW5kZXg9PT1lLmluamVjdG9ySW5kZXh8fHRbZS5pbmplY3RvckluZGV4KzhdPT09bnVsbD8tMTplLmluamVjdG9ySW5kZXh9ZnVuY3Rpb24gRmwoZSx0KXtpZihlLnBhcmVudCYmZS5wYXJlbnQuaW5qZWN0b3JJbmRleCE9PS0xKXJldHVybiBlLnBhcmVudC5pbmplY3RvckluZGV4O2xldCBuPTAscj1udWxsLG89dDtmb3IoO28hPT1udWxsOyl7aWYocj1HZyhvKSxyPT09bnVsbClyZXR1cm4gdXI7aWYobisrLG89b1tsbl0sci5pbmplY3RvckluZGV4IT09LTEpcmV0dXJuIHIuaW5qZWN0b3JJbmRleHxuPDwxNn1yZXR1cm4gdXJ9ZnVuY3Rpb24gWnUoZSx0LG4pe3NJKGUsdCxuKX1mdW5jdGlvbiBhSShlLHQpe2lmKHQ9PT0iY2xhc3MiKXJldHVybiBlLmNsYXNzZXM7aWYodD09PSJzdHlsZSIpcmV0dXJuIGUuc3R5bGVzO2xldCBuPWUuYXR0cnM7aWYobil7bGV0IHI9bi5sZW5ndGgsbz0wO2Zvcig7bzxyOyl7bGV0IGk9bltvXTtpZihQZyhpKSlicmVhaztpZihpPT09MClvPW8rMjtlbHNlIGlmKHR5cGVvZiBpPT0ibnVtYmVyIilmb3IobysrO288ciYmdHlwZW9mIG5bb109PSJzdHJpbmciOylvKys7ZWxzZXtpZihpPT09dClyZXR1cm4gbltvKzFdO289bysyfX19cmV0dXJuIG51bGx9ZnVuY3Rpb24gSGcoZSx0LG4pe2lmKG4mOHx8ZSE9PXZvaWQgMClyZXR1cm4gZTtVaSh0LCJOb2RlSW5qZWN0b3IiKX1mdW5jdGlvbiBVZyhlLHQsbixyKXtpZihuJjgmJnI9PT12b2lkIDAmJihyPW51bGwpLChuJjMpPT09MCl7bGV0IG89ZVtodF0saT1kZSh2b2lkIDApO3RyeXtyZXR1cm4gbz9vLmdldCh0LHIsbiY4KTpRYyh0LHIsbiY4KX1maW5hbGx5e2RlKGkpfX1yZXR1cm4gSGcocix0LG4pfWZ1bmN0aW9uICRnKGUsdCxuLHI9MCxvKXtpZihlIT09bnVsbCl7aWYodFtBXSYyMDQ4JiYhKHImMikpe2xldCBzPWZJKGUsdCxuLHIsdHQpO2lmKHMhPT10dClyZXR1cm4gc31sZXQgaT16ZyhlLHQsbixyLHR0KTtpZihpIT09dHQpcmV0dXJuIGl9cmV0dXJuIFVnKHQsbixyLG8pfWZ1bmN0aW9uIHpnKGUsdCxuLHIsbyl7bGV0IGk9dUkobik7aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpe2lmKCFNdSh0LGUscikpcmV0dXJuIHImMT9IZyhvLG4scik6VWcodCxuLHIsbyk7dHJ5e2xldCBzO2lmKHM9aShyKSxzPT1udWxsJiYhKHImOCkpVWkobik7ZWxzZSByZXR1cm4gc31maW5hbGx5e1N1KCl9fWVsc2UgaWYodHlwZW9mIGk9PSJudW1iZXIiKXtsZXQgcz1udWxsLGE9VmcoZSx0KSxjPXVyLHU9ciYxP3RbY2VdW2ZlXTpudWxsO2ZvcigoYT09PS0xfHxyJjQpJiYoYz1hPT09LTE/RmwoZSx0KTp0W2ErOF0sYz09PXVyfHwhUWgociwhMSk/YT0tMToocz10W3ddLGE9bXMoYyksdD15cyhjLHQpKSk7YSE9PS0xOyl7bGV0IGw9dFt3XTtpZihZaChpLGEsbC5kYXRhKSl7bGV0IGQ9Y0koYSx0LG4scyxyLHUpO2lmKGQhPT10dClyZXR1cm4gZH1jPXRbYSs4XSxjIT09dXImJlFoKHIsdFt3XS5kYXRhW2ErOF09PT11KSYmWWgoaSxhLHQpPyhzPWwsYT1tcyhjKSx0PXlzKGMsdCkpOmE9LTF9fXJldHVybiBvfWZ1bmN0aW9uIGNJKGUsdCxuLHIsbyxpKXtsZXQgcz10W3ddLGE9cy5kYXRhW2UrOF0sYz1yPT1udWxsP210KGEpJiZxdTpyIT1zJiYoYS50eXBlJjMpIT09MCx1PW8mMSYmaT09PWEsbD1mcyhhLHMsbixjLHUpO3JldHVybiBsIT09bnVsbD9jbyh0LHMsbCxhLG8pOnR0fWZ1bmN0aW9uIGZzKGUsdCxuLHIsbyl7bGV0IGk9ZS5wcm92aWRlckluZGV4ZXMscz10LmRhdGEsYT1pJjEwNDg1NzUsYz1lLmRpcmVjdGl2ZVN0YXJ0LHU9ZS5kaXJlY3RpdmVFbmQsbD1pPj4yMCxkPXI/YTphK2wscD1vP2ErbDp1O2ZvcihsZXQgZj1kO2Y8cDtmKyspe2xldCBnPXNbZl07aWYoZjxjJiZuPT09Z3x8Zj49YyYmZy50eXBlPT09bilyZXR1cm4gZn1pZihvKXtsZXQgZj1zW2NdO2lmKGYmJkxlKGYpJiZmLnR5cGU9PT1uKXJldHVybiBjfXJldHVybiBudWxsfWZ1bmN0aW9uIGNvKGUsdCxuLHIsbyl7bGV0IGk9ZVtuXSxzPXQuZGF0YTtpZihpIGluc3RhbmNlb2YgRW4pe2xldCBhPWk7aWYoYS5yZXNvbHZpbmcpe2xldCBmPXNoKHNbbl0pO3Rocm93IFljKGYpfWxldCBjPXZzKGEuY2FuU2VlVmlld1Byb3ZpZGVycyk7YS5yZXNvbHZpbmc9ITA7bGV0IHU9c1tuXS50eXBlfHxzW25dLGwsZD1hLmluamVjdEltcGw/ZGUoYS5pbmplY3RJbXBsKTpudWxsLHA9TXUoZSxyLDApO3RyeXtpPWVbbl09YS5mYWN0b3J5KHZvaWQgMCxvLHMsZSxyKSx0LmZpcnN0Q3JlYXRlUGFzcyYmbj49ci5kaXJlY3RpdmVTdGFydCYmS0UobixzW25dLHQpfWZpbmFsbHl7ZCE9PW51bGwmJmRlKGQpLHZzKGMpLGEucmVzb2x2aW5nPSExLFN1KCl9fXJldHVybiBpfWZ1bmN0aW9uIHVJKGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gZS5jaGFyQ29kZUF0KDApfHwwO2xldCB0PWUuaGFzT3duUHJvcGVydHkoY24pP2VbY25dOnZvaWQgMDtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiP3Q+PTA/dCZqZzpsSTp0fWZ1bmN0aW9uIFloKGUsdCxuKXtsZXQgcj0xPDxlO3JldHVybiEhKG5bdCsoZT4+QmcpXSZyKX1mdW5jdGlvbiBRaChlLHQpe3JldHVybiEoZSYyKSYmIShlJjEmJnQpfWZ1bmN0aW9uIGxJKCl7cmV0dXJuIG5ldyBEbihKKCksRSgpKX1mdW5jdGlvbiBkSShlKXtyZXR1cm4gZ3IoKCk9PntsZXQgdD1lLnByb3RvdHlwZS5jb25zdHJ1Y3RvcixuPXRbenJdfHxZdSh0KSxyPU9iamVjdC5wcm90b3R5cGUsbz1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZS5wcm90b3R5cGUpLmNvbnN0cnVjdG9yO2Zvcig7byYmbyE9PXI7KXtsZXQgaT1vW3pyXXx8WXUobyk7aWYoaSYmaSE9PW4pcmV0dXJuIGk7bz1PYmplY3QuZ2V0UHJvdG90eXBlT2Yobyl9cmV0dXJuIGk9Pm5ldyBpfSl9ZnVuY3Rpb24gWXUoZSl7cmV0dXJuICRjKGUpPygpPT57bGV0IHQ9WXUoZWUoZSkpO3JldHVybiB0JiZ0KCl9Ok10KGUpfWZ1bmN0aW9uIGZJKGUsdCxuLHIsbyl7bGV0IGk9ZSxzPXQ7Zm9yKDtpIT09bnVsbCYmcyE9PW51bGwmJnNbQV0mMjA0OCYmIXJyKHMpOyl7bGV0IGE9emcoaSxzLG4scnwyLHR0KTtpZihhIT09dHQpcmV0dXJuIGE7bGV0IGM9aS5wYXJlbnQ7aWYoIWMpe2xldCB1PXNbYXVdO2lmKHUpe2xldCBsPXUuZ2V0KG4sdHQscik7aWYobCE9PXR0KXJldHVybiBsfWM9R2cocykscz1zW2xuXX1pPWN9cmV0dXJuIG99ZnVuY3Rpb24gR2coZSl7bGV0IHQ9ZVt3XSxuPXQudHlwZTtyZXR1cm4gbj09PTI/dC5kZWNsVE5vZGU6bj09PTE/ZVtmZV06bnVsbH1mdW5jdGlvbiBrbChlKXtyZXR1cm4gYUkoSigpLGUpfWZ1bmN0aW9uIHBJKCl7cmV0dXJuIG1yKEooKSxFKCkpfWZ1bmN0aW9uIG1yKGUsdCl7cmV0dXJuIG5ldyBFdChTZShlLHQpKX1mdW5jdGlvbiBXZyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEV0P2UubmF0aXZlRWxlbWVudDplfWZ1bmN0aW9uIGhJKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdHNbU3ltYm9sLml0ZXJhdG9yXSgpfWZ1bmN0aW9uIHFnKGUpe3JldHVybihlLmZsYWdzJjEyOCk9PT0xMjh9ZnVuY3Rpb24gbUkoKXtyZXR1cm4gZ0krK31mdW5jdGlvbiB5SShlKXtaZy5zZXQoZVtRcl0sZSl9ZnVuY3Rpb24gUXUoZSl7WmcuZGVsZXRlKGVbUXJdKX1mdW5jdGlvbiBkcihlLHQpe1hlKHQpPyhlW0toXT10W1FyXSx5SSh0KSk6ZVtLaF09dH1mdW5jdGlvbiBZZyhlKXtyZXR1cm4gS2coZVt0cl0pfWZ1bmN0aW9uIFFnKGUpe3JldHVybiBLZyhlW19lXSl9ZnVuY3Rpb24gS2coZSl7Zm9yKDtlIT09bnVsbCYmIVBlKGUpOyllPWVbX2VdO3JldHVybiBlfWZ1bmN0aW9uIExsKGUpe0t1PWV9ZnVuY3Rpb24gamwoKXtpZihLdSE9PXZvaWQgMClyZXR1cm4gS3U7aWYodHlwZW9mIGRvY3VtZW50PCJ1IilyZXR1cm4gZG9jdW1lbnQ7dGhyb3cgbmV3IHYoMjEwLCExKX1mdW5jdGlvbiBDSShlLHQsbixyKXt3SShlLHQsbixyKX1mdW5jdGlvbiBqcyhlKXtyZXR1cm4oZS5mbGFncyYzMik9PT0zMn1mdW5jdGlvbiBybShlLHQsbj0hMSl7cmV0dXJuIGJJKGUsdCxuKX1mdW5jdGlvbiBvbShlLHQpe2xldCBuPWUuY29udGVudFF1ZXJpZXM7aWYobiE9PW51bGwpe2xldCByPU0obnVsbCk7dHJ5e2ZvcihsZXQgbz0wO288bi5sZW5ndGg7bys9Mil7bGV0IGk9bltvXSxzPW5bbysxXTtpZihzIT09LTEpe2xldCBhPWUuZGF0YVtzXTt0byhpKSxhLmNvbnRlbnRRdWVyaWVzKDIsdFtzXSxzKX19fWZpbmFsbHl7TShyKX19fWZ1bmN0aW9uIEp1KGUsdCxuKXt0bygwKTtsZXQgcj1NKG51bGwpO3RyeXt0KGUsbil9ZmluYWxseXtNKHIpfX1mdW5jdGlvbiBCbChlLHQsbil7aWYodXUodCkpe2xldCByPU0obnVsbCk7dHJ5e2xldCBvPXQuZGlyZWN0aXZlU3RhcnQsaT10LmRpcmVjdGl2ZUVuZDtmb3IobGV0IHM9bztzPGk7cysrKXtsZXQgYT1lLmRhdGFbc107aWYoYS5jb250ZW50UXVlcmllcyl7bGV0IGM9bltzXTthLmNvbnRlbnRRdWVyaWVzKDEsYyxzKX19fWZpbmFsbHl7TShyKX19fWZ1bmN0aW9uIFRJKCl7aWYoaXM9PT12b2lkIDAmJihpcz1udWxsLG5lLnRydXN0ZWRUeXBlcykpdHJ5e2lzPW5lLnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImFuZ3VsYXIiLHtjcmVhdGVIVE1MOmU9PmUsY3JlYXRlU2NyaXB0OmU9PmUsY3JlYXRlU2NyaXB0VVJMOmU9PmV9KX1jYXRjaHt9cmV0dXJuIGlzfWZ1bmN0aW9uIEJzKGUpe3JldHVybiBUSSgpPy5jcmVhdGVIVE1MKGUpfHxlfWZ1bmN0aW9uIGltKCl7aWYoc3M9PT12b2lkIDAmJihzcz1udWxsLG5lLnRydXN0ZWRUeXBlcykpdHJ5e3NzPW5lLnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImFuZ3VsYXIjdW5zYWZlLWJ5cGFzcyIse2NyZWF0ZUhUTUw6ZT0+ZSxjcmVhdGVTY3JpcHQ6ZT0+ZSxjcmVhdGVTY3JpcHRVUkw6ZT0+ZX0pfWNhdGNoe31yZXR1cm4gc3N9ZnVuY3Rpb24gSmgoZSl7cmV0dXJuIGltKCk/LmNyZWF0ZUhUTUwoZSl8fGV9ZnVuY3Rpb24gWGgoZSl7cmV0dXJuIGltKCk/LmNyZWF0ZVNjcmlwdFVSTChlKXx8ZX1mdW5jdGlvbiBDZShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIER0P2UuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eTplfWZ1bmN0aW9uIHJ0KGUsdCl7bGV0IG49c20oZSk7aWYobiE9bnVsbCYmbiE9PXQpe2lmKG49PT0iUmVzb3VyY2VVUkwiJiZ0PT09IlVSTCIpcmV0dXJuITA7dGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBhIHNhZmUgJHt0fSwgZ290IGEgJHtufSAoc2VlICR7aml9KWApfXJldHVybiBuPT09dH1mdW5jdGlvbiBzbShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIER0JiZlLmdldFR5cGVOYW1lKCl8fG51bGx9ZnVuY3Rpb24gVmwoZSl7cmV0dXJuIG5ldyBYdShlKX1mdW5jdGlvbiBIbChlKXtyZXR1cm4gbmV3IGVsKGUpfWZ1bmN0aW9uIFVsKGUpe3JldHVybiBuZXcgdGwoZSl9ZnVuY3Rpb24gJGwoZSl7cmV0dXJuIG5ldyBubChlKX1mdW5jdGlvbiB6bChlKXtyZXR1cm4gbmV3IHJsKGUpfWZ1bmN0aW9uIF9JKGUpe2xldCB0PW5ldyBpbChlKTtyZXR1cm4gTUkoKT9uZXcgb2wodCk6dH1mdW5jdGlvbiBNSSgpe3RyeXtyZXR1cm4hIW5ldyB3aW5kb3cuRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKEJzKCIiKSwidGV4dC9odG1sIil9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIHlvKGUpe3JldHVybiBlPVN0cmluZyhlKSxlLm1hdGNoKFNJKT9lOiJ1bnNhZmU6IitlfWZ1bmN0aW9uIEl0KGUpe2xldCB0PXt9O2ZvcihsZXQgbiBvZiBlLnNwbGl0KCIsIikpdFtuXT0hMDtyZXR1cm4gdH1mdW5jdGlvbiB2byguLi5lKXtsZXQgdD17fTtmb3IobGV0IG4gb2YgZSlmb3IobGV0IHIgaW4gbiluLmhhc093blByb3BlcnR5KHIpJiYodFtyXT0hMCk7cmV0dXJuIHR9ZnVuY3Rpb24gUEkoZSx0KXtyZXR1cm4oZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSZOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSkhPT1Ob2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWX1mdW5jdGlvbiBMSShlKXtsZXQgdD1lLm5leHRTaWJsaW5nO2lmKHQmJmUhPT10LnByZXZpb3VzU2libGluZyl0aHJvdyBkbSh0KTtyZXR1cm4gdH1mdW5jdGlvbiBqSShlKXtsZXQgdD1lLmZpcnN0Q2hpbGQ7aWYodCYmUEkoZSx0KSl0aHJvdyBkbSh0KTtyZXR1cm4gdH1mdW5jdGlvbiB0ZyhlKXtsZXQgdD1lLm5vZGVOYW1lO3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/dDoiRk9STSJ9ZnVuY3Rpb24gZG0oZSl7cmV0dXJuIG5ldyBFcnJvcihgRmFpbGVkIHRvIHNhbml0aXplIGh0bWwgYmVjYXVzZSB0aGUgZWxlbWVudCBpcyBjbG9iYmVyZWQ6ICR7ZS5vdXRlckhUTUx9YCl9ZnVuY3Rpb24gbmcoZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoQkksZnVuY3Rpb24odCl7bGV0IG49dC5jaGFyQ29kZUF0KDApLHI9dC5jaGFyQ29kZUF0KDEpO3JldHVybiImIyIrKChuLTU1Mjk2KSoxMDI0KyhyLTU2MzIwKSs2NTUzNikrIjsifSkucmVwbGFjZShWSSxmdW5jdGlvbih0KXtyZXR1cm4iJiMiK3QuY2hhckNvZGVBdCgwKSsiOyJ9KS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX1mdW5jdGlvbiBWcyhlLHQpe2xldCBuPW51bGw7dHJ5e2FzPWFzfHxfSShlKTtsZXQgcj10P1N0cmluZyh0KToiIjtuPWFzLmdldEluZXJ0Qm9keUVsZW1lbnQocik7bGV0IG89NSxpPXI7ZG97aWYobz09PTApdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gc2FuaXRpemUgaHRtbCBiZWNhdXNlIHRoZSBpbnB1dCBpcyB1bnN0YWJsZSIpO28tLSxyPWksaT1uLmlubmVySFRNTCxuPWFzLmdldEluZXJ0Qm9keUVsZW1lbnQocil9d2hpbGUociE9PWkpO2xldCBhPW5ldyBzbCgpLnNhbml0aXplQ2hpbGRyZW4ocmcobil8fG4pO3JldHVybiBCcyhhKX1maW5hbGx5e2lmKG4pe2xldCByPXJnKG4pfHxuO2Zvcig7ci5maXJzdENoaWxkOylyLmZpcnN0Q2hpbGQucmVtb3ZlKCl9fX1mdW5jdGlvbiByZyhlKXtyZXR1cm4iY29udGVudCJpbiBlJiZISShlKT9lLmNvbnRlbnQ6bnVsbH1mdW5jdGlvbiBISShlKXtyZXR1cm4gZS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZlLm5vZGVOYW1lPT09IlRFTVBMQVRFIn1mdW5jdGlvbiBHSShlKXtyZXR1cm4gZS5yZXBsYWNlKFVJLHQ9PnQucmVwbGFjZSgkSSx6SSkpfWZ1bmN0aW9uIFdJKGUsdCl7cmV0dXJuIGUuY3JlYXRlVGV4dCh0KX1mdW5jdGlvbiBxSShlLHQsbil7ZS5zZXRWYWx1ZSh0LG4pfWZ1bmN0aW9uIFpJKGUsdCl7cmV0dXJuIGUuY3JlYXRlQ29tbWVudChHSSh0KSl9ZnVuY3Rpb24gZm0oZSx0LG4pe3JldHVybiBlLmNyZWF0ZUVsZW1lbnQodCxuKX1mdW5jdGlvbiBJcyhlLHQsbixyLG8pe2UuaW5zZXJ0QmVmb3JlKHQsbixyLG8pfWZ1bmN0aW9uIHBtKGUsdCxuKXtlLmFwcGVuZENoaWxkKHQsbil9ZnVuY3Rpb24gb2coZSx0LG4scixvKXtyIT09bnVsbD9JcyhlLHQsbixyLG8pOnBtKGUsdCxuKX1mdW5jdGlvbiBobShlLHQsbixyKXtlLnJlbW92ZUNoaWxkKG51bGwsdCxuLHIpfWZ1bmN0aW9uIFlJKGUsdCxuKXtlLnNldEF0dHJpYnV0ZSh0LCJzdHlsZSIsbil9ZnVuY3Rpb24gUUkoZSx0LG4pe249PT0iIj9lLnJlbW92ZUF0dHJpYnV0ZSh0LCJjbGFzcyIpOmUuc2V0QXR0cmlidXRlKHQsImNsYXNzIixuKX1mdW5jdGlvbiBnbShlLHQsbil7bGV0e21lcmdlZEF0dHJzOnIsY2xhc3NlczpvLHN0eWxlczppfT1uO3IhPT1udWxsJiZ0SShlLHQsciksbyE9PW51bGwmJlFJKGUsdCxvKSxpIT09bnVsbCYmWUkoZSx0LGkpfWZ1bmN0aW9uIEtJKGUpe2xldCB0PUdsKCk7cmV0dXJuIHQ/SmgodC5zYW5pdGl6ZSh4ZS5IVE1MLGUpfHwiIik6cnQoZSwiSFRNTCIpP0poKENlKGUpKTpWcyhqbCgpLEVlKGUpKX1mdW5jdGlvbiBtbShlKXtsZXQgdD1HbCgpO3JldHVybiB0P3Quc2FuaXRpemUoeGUuVVJMLGUpfHwiIjpydChlLCJVUkwiKT9DZShlKTp5byhFZShlKSl9ZnVuY3Rpb24geW0oZSl7bGV0IHQ9R2woKTtpZih0KXJldHVybiBYaCh0LnNhbml0aXplKHhlLlJFU09VUkNFX1VSTCxlKXx8IiIpO2lmKHJ0KGUsIlJlc291cmNlVVJMIikpcmV0dXJuIFhoKENlKGUpKTt0aHJvdyBuZXcgdig5MDQsITEpfWZ1bmN0aW9uIGV3KGUsdCl7cmV0dXJuIHQ9PT0ic3JjIiYmSkkuaGFzKGUpfHx0PT09ImhyZWYiJiZYSS5oYXMoZSl8fHQ9PT0ieGxpbms6aHJlZiImJmU9PT0ic2NyaXB0Ij95bTptbX1mdW5jdGlvbiB0dyhlLHQsbil7cmV0dXJuIGV3KHQsbikoZSl9ZnVuY3Rpb24gR2woKXtsZXQgZT1FKCk7cmV0dXJuIGUmJmVbS2VdLnNhbml0aXplcn1mdW5jdGlvbiBudyhlKXtyZXR1cm4gZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fWZ1bmN0aW9uIHZtKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRnVuY3Rpb24/ZSgpOmV9ZnVuY3Rpb24gcncoZSx0LG4pe2xldCByPWUubGVuZ3RoO2Zvcig7Oyl7bGV0IG89ZS5pbmRleE9mKHQsbik7aWYobz09PS0xKXJldHVybiBvO2lmKG89PT0wfHxlLmNoYXJDb2RlQXQoby0xKTw9MzIpe2xldCBpPXQubGVuZ3RoO2lmKG8raT09PXJ8fGUuY2hhckNvZGVBdChvK2kpPD0zMilyZXR1cm4gb31uPW8rMX19ZnVuY3Rpb24gb3coZSx0LG4scil7bGV0IG89MDtpZihyKXtmb3IoO288dC5sZW5ndGgmJnR5cGVvZiB0W29dPT0ic3RyaW5nIjtvKz0yKWlmKHRbb109PT0iY2xhc3MiJiZydyh0W28rMV0udG9Mb3dlckNhc2UoKSxuLDApIT09LTEpcmV0dXJuITB9ZWxzZSBpZihXbChlKSlyZXR1cm4hMTtpZihvPXQuaW5kZXhPZigxLG8pLG8+LTEpe2xldCBpO2Zvcig7KytvPHQubGVuZ3RoJiZ0eXBlb2YoaT10W29dKT09InN0cmluZyI7KWlmKGkudG9Mb3dlckNhc2UoKT09PW4pcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gV2woZSl7cmV0dXJuIGUudHlwZT09PTQmJmUudmFsdWUhPT1EbX1mdW5jdGlvbiBpdyhlLHQsbil7bGV0IHI9ZS50eXBlPT09NCYmIW4/RG06ZS52YWx1ZTtyZXR1cm4gdD09PXJ9ZnVuY3Rpb24gc3coZSx0LG4pe2xldCByPTQsbz1lLmF0dHJzLGk9byE9PW51bGw/dXcobyk6MCxzPSExO2ZvcihsZXQgYT0wO2E8dC5sZW5ndGg7YSsrKXtsZXQgYz10W2FdO2lmKHR5cGVvZiBjPT0ibnVtYmVyIil7aWYoIXMmJiFWZShyKSYmIVZlKGMpKXJldHVybiExO2lmKHMmJlZlKGMpKWNvbnRpbnVlO3M9ITEscj1jfHImMTtjb250aW51ZX1pZighcylpZihyJjQpe2lmKHI9MnxyJjEsYyE9PSIiJiYhaXcoZSxjLG4pfHxjPT09IiImJnQubGVuZ3RoPT09MSl7aWYoVmUocikpcmV0dXJuITE7cz0hMH19ZWxzZSBpZihyJjgpe2lmKG89PT1udWxsfHwhb3coZSxvLGMsbikpe2lmKFZlKHIpKXJldHVybiExO3M9ITB9fWVsc2V7bGV0IHU9dFsrK2FdLGw9YXcoYyxvLFdsKGUpLG4pO2lmKGw9PT0tMSl7aWYoVmUocikpcmV0dXJuITE7cz0hMDtjb250aW51ZX1pZih1IT09IiIpe2xldCBkO2lmKGw+aT9kPSIiOmQ9b1tsKzFdLnRvTG93ZXJDYXNlKCksciYyJiZ1IT09ZCl7aWYoVmUocikpcmV0dXJuITE7cz0hMH19fX1yZXR1cm4gVmUocil8fHN9ZnVuY3Rpb24gVmUoZSl7cmV0dXJuKGUmMSk9PT0wfWZ1bmN0aW9uIGF3KGUsdCxuLHIpe2lmKHQ9PT1udWxsKXJldHVybi0xO2xldCBvPTA7aWYocnx8IW4pe2xldCBpPSExO2Zvcig7bzx0Lmxlbmd0aDspe2xldCBzPXRbb107aWYocz09PWUpcmV0dXJuIG87aWYocz09PTN8fHM9PT02KWk9ITA7ZWxzZSBpZihzPT09MXx8cz09PTIpe2xldCBhPXRbKytvXTtmb3IoO3R5cGVvZiBhPT0ic3RyaW5nIjspYT10Wysrb107Y29udGludWV9ZWxzZXtpZihzPT09NClicmVhaztpZihzPT09MCl7bys9NDtjb250aW51ZX19bys9aT8xOjJ9cmV0dXJuLTF9ZWxzZSByZXR1cm4gbHcodCxlKX1mdW5jdGlvbiBFbShlLHQsbj0hMSl7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspaWYoc3coZSx0W3JdLG4pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGN3KGUpe2xldCB0PWUuYXR0cnM7aWYodCE9bnVsbCl7bGV0IG49dC5pbmRleE9mKDUpO2lmKChuJjEpPT09MClyZXR1cm4gdFtuKzFdfXJldHVybiBudWxsfWZ1bmN0aW9uIHV3KGUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgbj1lW3RdO2lmKFBnKG4pKXJldHVybiB0fXJldHVybiBlLmxlbmd0aH1mdW5jdGlvbiBsdyhlLHQpe2xldCBuPWUuaW5kZXhPZig0KTtpZihuPi0xKWZvcihuKys7bjxlLmxlbmd0aDspe2xldCByPWVbbl07aWYodHlwZW9mIHI9PSJudW1iZXIiKXJldHVybi0xO2lmKHI9PT10KXJldHVybiBuO24rK31yZXR1cm4tMX1mdW5jdGlvbiBkdyhlLHQpe2U6Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCByPXRbbl07aWYoZS5sZW5ndGg9PT1yLmxlbmd0aCl7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspaWYoZVtvXSE9PXJbb10pY29udGludWUgZTtyZXR1cm4hMH19cmV0dXJuITF9ZnVuY3Rpb24gaWcoZSx0KXtyZXR1cm4gZT8iOm5vdCgiK3QudHJpbSgpKyIpIjp0fWZ1bmN0aW9uIGZ3KGUpe2xldCB0PWVbMF0sbj0xLHI9MixvPSIiLGk9ITE7Zm9yKDtuPGUubGVuZ3RoOyl7bGV0IHM9ZVtuXTtpZih0eXBlb2Ygcz09InN0cmluZyIpaWYociYyKXtsZXQgYT1lWysrbl07bys9IlsiK3MrKGEubGVuZ3RoPjA/Jz0iJythKyciJzoiIikrIl0ifWVsc2UgciY4P28rPSIuIitzOnImNCYmKG8rPSIgIitzKTtlbHNlIG8hPT0iIiYmIVZlKHMpJiYodCs9aWcoaSxvKSxvPSIiKSxyPXMsaT1pfHwhVmUocik7bisrfXJldHVybiBvIT09IiImJih0Kz1pZyhpLG8pKSx0fWZ1bmN0aW9uIHB3KGUpe3JldHVybiBlLm1hcChmdykuam9pbigiLCIpfWZ1bmN0aW9uIGh3KGUpe2xldCB0PVtdLG49W10scj0xLG89Mjtmb3IoO3I8ZS5sZW5ndGg7KXtsZXQgaT1lW3JdO2lmKHR5cGVvZiBpPT0ic3RyaW5nIilvPT09Mj9pIT09IiImJnQucHVzaChpLGVbKytyXSk6bz09PTgmJm4ucHVzaChpKTtlbHNle2lmKCFWZShvKSlicmVhaztvPWl9cisrfXJldHVybiBuLmxlbmd0aCYmdC5wdXNoKDEsLi4ubiksdH1mdW5jdGlvbiBxbChlLHQsbixyLG8saSxzLGEsYyx1LGwpe2xldCBkPUgrcixwPWQrbyxmPWd3KGQscCksZz10eXBlb2YgdT09ImZ1bmN0aW9uIj91KCk6dTtyZXR1cm4gZlt3XT17dHlwZTplLGJsdWVwcmludDpmLHRlbXBsYXRlOm4scXVlcmllczpudWxsLHZpZXdRdWVyeTphLGRlY2xUTm9kZTp0LGRhdGE6Zi5zbGljZSgpLmZpbGwobnVsbCxkKSxiaW5kaW5nU3RhcnRJbmRleDpkLGV4cGFuZG9TdGFydEluZGV4OnAsaG9zdEJpbmRpbmdPcENvZGVzOm51bGwsZmlyc3RDcmVhdGVQYXNzOiEwLGZpcnN0VXBkYXRlUGFzczohMCxzdGF0aWNWaWV3UXVlcmllczohMSxzdGF0aWNDb250ZW50UXVlcmllczohMSxwcmVPcmRlckhvb2tzOm51bGwscHJlT3JkZXJDaGVja0hvb2tzOm51bGwsY29udGVudEhvb2tzOm51bGwsY29udGVudENoZWNrSG9va3M6bnVsbCx2aWV3SG9va3M6bnVsbCx2aWV3Q2hlY2tIb29rczpudWxsLGRlc3Ryb3lIb29rczpudWxsLGNsZWFudXA6bnVsbCxjb250ZW50UXVlcmllczpudWxsLGNvbXBvbmVudHM6bnVsbCxkaXJlY3RpdmVSZWdpc3RyeTp0eXBlb2YgaT09ImZ1bmN0aW9uIj9pKCk6aSxwaXBlUmVnaXN0cnk6dHlwZW9mIHM9PSJmdW5jdGlvbiI/cygpOnMsZmlyc3RDaGlsZDpudWxsLHNjaGVtYXM6Yyxjb25zdHM6ZyxpbmNvbXBsZXRlRmlyc3RQYXNzOiExLHNzcklkOmx9fWZ1bmN0aW9uIGd3KGUsdCl7bGV0IG49W107Zm9yKGxldCByPTA7cjx0O3IrKyluLnB1c2gocjxlP251bGw6cmUpO3JldHVybiBufWZ1bmN0aW9uIG13KGUpe2xldCB0PWUudFZpZXc7cmV0dXJuIHQ9PT1udWxsfHx0LmluY29tcGxldGVGaXJzdFBhc3M/ZS50Vmlldz1xbCgxLG51bGwsZS50ZW1wbGF0ZSxlLmRlY2xzLGUudmFycyxlLmRpcmVjdGl2ZURlZnMsZS5waXBlRGVmcyxlLnZpZXdRdWVyeSxlLnNjaGVtYXMsZS5jb25zdHMsZS5pZCk6dH1mdW5jdGlvbiBabChlLHQsbixyLG8saSxzLGEsYyx1LGwpe2xldCBkPXQuYmx1ZXByaW50LnNsaWNlKCk7cmV0dXJuIGRba2VdPW8sZFtBXT1yfDR8MTI4fDh8NjR8MTAyNCwodSE9PW51bGx8fGUmJmVbQV0mMjA0OCkmJihkW0FdfD0yMDQ4KSxwdShkKSxkW3RlXT1kW2xuXT1lLGRbcV09bixkW0tlXT1zfHxlJiZlW0tlXSxkW1BdPWF8fGUmJmVbUF0sZFtodF09Y3x8ZSYmZVtodF18fG51bGwsZFtmZV09aSxkW1FyXT1tSSgpLGRbdW5dPWwsZFthdV09dSxkW2NlXT10LnR5cGU9PTI/ZVtjZV06ZCxkfWZ1bmN0aW9uIHl3KGUsdCxuKXtsZXQgcj1TZSh0LGUpLG89bXcobiksaT1lW0tlXS5yZW5kZXJlckZhY3Rvcnkscz1ZbChlLFpsKGUsbyxudWxsLEltKG4pLHIsdCxudWxsLGkuY3JlYXRlUmVuZGVyZXIocixuKSxudWxsLG51bGwsbnVsbCkpO3JldHVybiBlW3QuaW5kZXhdPXN9ZnVuY3Rpb24gSW0oZSl7bGV0IHQ9MTY7cmV0dXJuIGUuc2lnbmFscz90PTQwOTY6ZS5vblB1c2gmJih0PTY0KSx0fWZ1bmN0aW9uIHdtKGUsdCxuLHIpe2lmKG49PT0wKXJldHVybi0xO2xldCBvPXQubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bjtpKyspdC5wdXNoKHIpLGUuYmx1ZXByaW50LnB1c2gociksZS5kYXRhLnB1c2gobnVsbCk7cmV0dXJuIG99ZnVuY3Rpb24gWWwoZSx0KXtyZXR1cm4gZVt0cl0/ZVtzdV1bX2VdPXQ6ZVt0cl09dCxlW3N1XT10LHR9ZnVuY3Rpb24gdncoZT0xKXtDbShCKCksRSgpLGplKCkrZSwhMSl9ZnVuY3Rpb24gQ20oZSx0LG4scil7aWYoIXIpaWYoKHRbQV0mMyk9PT0zKXtsZXQgaT1lLnByZU9yZGVyQ2hlY2tIb29rcztpIT09bnVsbCYmbHModCxpLG4pfWVsc2V7bGV0IGk9ZS5wcmVPcmRlckhvb2tzO2khPT1udWxsJiZkcyh0LGksMCxuKX1PdChuKX1mdW5jdGlvbiBhbChlLHQsbixyKXtsZXQgbz1NKG51bGwpO3RyeXtsZXRbaSxzLGFdPWUuaW5wdXRzW25dLGM9bnVsbDsocyZIcy5TaWduYWxCYXNlZCkhPT0wJiYoYz10W2ldW1hdKSxjIT09bnVsbCYmYy50cmFuc2Zvcm1GbiE9PXZvaWQgMD9yPWMudHJhbnNmb3JtRm4ocik6YSE9PW51bGwmJihyPWEuY2FsbCh0LHIpKSxlLnNldElucHV0IT09bnVsbD9lLnNldElucHV0KHQsYyxyLG4saSk6QWcodCxjLGkscil9ZmluYWxseXtNKG8pfX1mdW5jdGlvbiBRbChlLHQpe3JldHVybiBEdyhlLHQpfWZ1bmN0aW9uIGp0KGUpe3NnLmhhcyhlKXx8KHNnLmFkZChlKSxwZXJmb3JtYW5jZT8ubWFyaz8uKCJtYXJrX2ZlYXR1cmVfdXNhZ2UiLHtkZXRhaWw6e2ZlYXR1cmU6ZX19KSl9ZnVuY3Rpb24gVG0oZSl7bGV0IHQsbjtmdW5jdGlvbiByKCl7ZT12bjt0cnl7biE9PXZvaWQgMCYmdHlwZW9mIGNhbmNlbEFuaW1hdGlvbkZyYW1lPT0iZnVuY3Rpb24iJiZjYW5jZWxBbmltYXRpb25GcmFtZShuKSx0IT09dm9pZCAwJiZjbGVhclRpbWVvdXQodCl9Y2F0Y2h7fX1yZXR1cm4gdD1zZXRUaW1lb3V0KCgpPT57ZSgpLHIoKX0pLHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiImJihuPXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2UoKSxyKCl9KSksKCk9PnIoKX1mdW5jdGlvbiBhZyhlKXtyZXR1cm4gcXVldWVNaWNyb3Rhc2soKCk9PmUoKSksKCk9PntlPXZufX1mdW5jdGlvbiBKbChlKXtpZihlLl9uZXN0aW5nPT0wJiYhZS5oYXNQZW5kaW5nTWljcm90YXNrcyYmIWUuaXNTdGFibGUpdHJ5e2UuX25lc3RpbmcrKyxlLm9uTWljcm90YXNrRW1wdHkuZW1pdChudWxsKX1maW5hbGx5e2lmKGUuX25lc3RpbmctLSwhZS5oYXNQZW5kaW5nTWljcm90YXNrcyl0cnl7ZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+ZS5vblN0YWJsZS5lbWl0KG51bGwpKX1maW5hbGx5e2UuaXNTdGFibGU9ITB9fX1mdW5jdGlvbiB3dyhlKXtpZihlLmlzQ2hlY2tTdGFibGVSdW5uaW5nfHxlLmNhbGxiYWNrU2NoZWR1bGVkKXJldHVybjtlLmNhbGxiYWNrU2NoZWR1bGVkPSEwO2Z1bmN0aW9uIHQoKXtUbSgoKT0+e2UuY2FsbGJhY2tTY2hlZHVsZWQ9ITEsdWwoZSksZS5pc0NoZWNrU3RhYmxlUnVubmluZz0hMCxKbChlKSxlLmlzQ2hlY2tTdGFibGVSdW5uaW5nPSExfSl9ZS5zY2hlZHVsZUluUm9vdFpvbmU/Wm9uZS5yb290LnJ1bigoKT0+e3QoKX0pOmUuX291dGVyLnJ1bigoKT0+e3QoKX0pLHVsKGUpfWZ1bmN0aW9uIEN3KGUpe2xldCB0PSgpPT57d3coZSl9LG49RXcrKztlLl9pbm5lcj1lLl9pbm5lci5mb3JrKHtuYW1lOiJhbmd1bGFyIixwcm9wZXJ0aWVzOntbS2xdOiEwLFt3c106bixbd3Mrbl06ITB9LG9uSW52b2tlVGFzazoocixvLGkscyxhLGMpPT57aWYoYncoYykpcmV0dXJuIHIuaW52b2tlVGFzayhpLHMsYSxjKTt0cnl7cmV0dXJuIGNnKGUpLHIuaW52b2tlVGFzayhpLHMsYSxjKX1maW5hbGx5eyhlLnNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb24mJnMudHlwZT09PSJldmVudFRhc2sifHxlLnNob3VsZENvYWxlc2NlUnVuQ2hhbmdlRGV0ZWN0aW9uKSYmdCgpLHVnKGUpfX0sb25JbnZva2U6KHIsbyxpLHMsYSxjLHUpPT57dHJ5e3JldHVybiBjZyhlKSxyLmludm9rZShpLHMsYSxjLHUpfWZpbmFsbHl7ZS5zaG91bGRDb2FsZXNjZVJ1bkNoYW5nZURldGVjdGlvbiYmIWUuY2FsbGJhY2tTY2hlZHVsZWQmJiFUdyhjKSYmdCgpLHVnKGUpfX0sb25IYXNUYXNrOihyLG8saSxzKT0+e3IuaGFzVGFzayhpLHMpLG89PT1pJiYocy5jaGFuZ2U9PSJtaWNyb1Rhc2siPyhlLl9oYXNQZW5kaW5nTWljcm90YXNrcz1zLm1pY3JvVGFzayx1bChlKSxKbChlKSk6cy5jaGFuZ2U9PSJtYWNyb1Rhc2siJiYoZS5oYXNQZW5kaW5nTWFjcm90YXNrcz1zLm1hY3JvVGFzaykpfSxvbkhhbmRsZUVycm9yOihyLG8saSxzKT0+KHIuaGFuZGxlRXJyb3IoaSxzKSxlLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT5lLm9uRXJyb3IuZW1pdChzKSksITEpfSl9ZnVuY3Rpb24gdWwoZSl7ZS5faGFzUGVuZGluZ01pY3JvdGFza3N8fChlLnNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb258fGUuc2hvdWxkQ29hbGVzY2VSdW5DaGFuZ2VEZXRlY3Rpb24pJiZlLmNhbGxiYWNrU2NoZWR1bGVkPT09ITA/ZS5oYXNQZW5kaW5nTWljcm90YXNrcz0hMDplLmhhc1BlbmRpbmdNaWNyb3Rhc2tzPSExfWZ1bmN0aW9uIGNnKGUpe2UuX25lc3RpbmcrKyxlLmlzU3RhYmxlJiYoZS5pc1N0YWJsZT0hMSxlLm9uVW5zdGFibGUuZW1pdChudWxsKSl9ZnVuY3Rpb24gdWcoZSl7ZS5fbmVzdGluZy0tLEpsKGUpfWZ1bmN0aW9uIGJ3KGUpe3JldHVybiBfbShlLCJfX2lnbm9yZV9uZ196b25lX18iKX1mdW5jdGlvbiBUdyhlKXtyZXR1cm4gX20oZSwiX19zY2hlZHVsZXJfdGlja19fIil9ZnVuY3Rpb24gX20oZSx0KXtyZXR1cm4hQXJyYXkuaXNBcnJheShlKXx8ZS5sZW5ndGghPT0xPyExOmVbMF0/LmRhdGE/Llt0XT09PSEwfWZ1bmN0aW9uIF93KGUsdCl7bGV0IG49dD8uaW5qZWN0b3I/P3kodmUpO3JldHVybiBqdCgiTmdBZnRlck5leHRSZW5kZXIiKSxTdyhlLG4sdCwhMCl9ZnVuY3Rpb24gTXcoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBGdW5jdGlvbj9bdm9pZCAwLHZvaWQgMCxlLHZvaWQgMF06W2UuZWFybHlSZWFkLGUud3JpdGUsZS5taXhlZFJlYWRXcml0ZSxlLnJlYWRdfWZ1bmN0aW9uIFN3KGUsdCxuLHIpe2xldCBvPXQuZ2V0KCRzKTtvLmltcGw/Pz10LmdldChlZCk7bGV0IGk9dC5nZXQoTHQsbnVsbCx7b3B0aW9uYWw6ITB9KSxzPW4/Lm1hbnVhbENsZWFudXAhPT0hMD90LmdldChBZSk6bnVsbCxhPXQuZ2V0KHluLG51bGwse29wdGlvbmFsOiEwfSksYz1uZXcgdW8oby5pbXBsLE13KGUpLGE/LnZpZXcscixzLGk/LnNuYXBzaG90KG51bGwpKTtyZXR1cm4gby5pbXBsLnJlZ2lzdGVyKGMpLGN9ZnVuY3Rpb24gU20oZSx0LG4pe2xldCByPWUuZ2V0KE1tKTtpZihBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgbyBvZiB0KXIucXVldWUuYWRkKG8pLG4/LmRldGFjaGVkTGVhdmVBbmltYXRpb25GbnM/LnB1c2gobyk7ZWxzZSByLnF1ZXVlLmFkZCh0KSxuPy5kZXRhY2hlZExlYXZlQW5pbWF0aW9uRm5zPy5wdXNoKHQpO3Iuc2NoZWR1bGVyJiZyLnNjaGVkdWxlcihlKX1mdW5jdGlvbiBOdyhlLHQpe2xldCBuPWUuZ2V0KE1tKTtpZih0LmRldGFjaGVkTGVhdmVBbmltYXRpb25GbnMpe2ZvcihsZXQgciBvZiB0LmRldGFjaGVkTGVhdmVBbmltYXRpb25GbnMpbi5xdWV1ZS5kZWxldGUocik7dC5kZXRhY2hlZExlYXZlQW5pbWF0aW9uRm5zPXZvaWQgMH19ZnVuY3Rpb24gQXcoZSx0KXtmb3IobGV0W24scl1vZiB0KVNtKGUsci5hbmltYXRlRm5zKX1mdW5jdGlvbiBsZyhlLHQsbixyKXtsZXQgbz1lPy5bcG5dPy5lbnRlcjt0IT09bnVsbCYmbyYmby5oYXMobi5pbmRleCkmJkF3KHIsbyl9ZnVuY3Rpb24gY3IoZSx0LG4scixvLGkscyxhKXtpZihvIT1udWxsKXtsZXQgYyx1PSExO1BlKG8pP2M9bzpYZShvKSYmKHU9ITAsbz1vW2tlXSk7bGV0IGw9TWUobyk7ZT09PTAmJnIhPT1udWxsPyhsZyhhLHIsaSxuKSxzPT1udWxsP3BtKHQscixsKTpJcyh0LHIsbCxzfHxudWxsLCEwKSk6ZT09PTEmJnIhPT1udWxsPyhsZyhhLHIsaSxuKSxJcyh0LHIsbCxzfHxudWxsLCEwKSk6ZT09PTI/ZGcoYSxpLG4sZD0+e2htKHQsbCx1LGQpfSk6ZT09PTMmJmRnKGEsaSxuLCgpPT57dC5kZXN0cm95Tm9kZShsKX0pLGMhPW51bGwmJkh3KHQsZSxuLGMsaSxyLHMpfX1mdW5jdGlvbiB4dyhlLHQpe05tKGUsdCksdFtrZV09bnVsbCx0W2ZlXT1udWxsfWZ1bmN0aW9uIFJ3KGUsdCxuLHIsbyxpKXtyW2tlXT1vLHJbZmVdPXQsR3MoZSxyLG4sMSxvLGkpfWZ1bmN0aW9uIE5tKGUsdCl7dFtLZV0uY2hhbmdlRGV0ZWN0aW9uU2NoZWR1bGVyPy5ub3RpZnkoOSksR3MoZSx0LHRbUF0sMixudWxsLG51bGwpfWZ1bmN0aW9uIE93KGUpe2xldCB0PWVbdHJdO2lmKCF0KXJldHVybiBqdShlW3ddLGUpO2Zvcig7dDspe2xldCBuPW51bGw7aWYoWGUodCkpbj10W3RyXTtlbHNle2xldCByPXRbWl07ciYmKG49cil9aWYoIW4pe2Zvcig7dCYmIXRbX2VdJiZ0IT09ZTspWGUodCkmJmp1KHRbd10sdCksdD10W3RlXTt0PT09bnVsbCYmKHQ9ZSksWGUodCkmJmp1KHRbd10sdCksbj10JiZ0W19lXX10PW59fWZ1bmN0aW9uIHRkKGUsdCl7bGV0IG49ZVtobl0scj1uLmluZGV4T2YodCk7bi5zcGxpY2UociwxKX1mdW5jdGlvbiB6cyhlLHQpe2lmKGduKHQpKXJldHVybjtsZXQgbj10W1BdO24uZGVzdHJveU5vZGUmJkdzKGUsdCxuLDMsbnVsbCxudWxsKSxPdyh0KX1mdW5jdGlvbiBqdShlLHQpe2lmKGduKHQpKXJldHVybjtsZXQgbj1NKG51bGwpO3RyeXt0W0FdJj0tMTI5LHRbQV18PTI1Nix0W0llXSYmYnQodFtJZV0pLFB3KGUsdCksa3coZSx0KSx0W3ddLnR5cGU9PT0xJiZ0W1BdLmRlc3Ryb3koKTtsZXQgcj10W0F0XTtpZihyIT09bnVsbCYmUGUodFt0ZV0pKXtyIT09dFt0ZV0mJnRkKHIsdCk7bGV0IG89dFtKZV07byE9PW51bGwmJm8uZGV0YWNoVmlldyhlKX1RdSh0KX1maW5hbGx5e00obil9fWZ1bmN0aW9uIGRnKGUsdCxuLHIpe2xldCBvPWU/Lltwbl07aWYobz09bnVsbHx8by5sZWF2ZT09bnVsbHx8IW8ubGVhdmUuaGFzKHQuaW5kZXgpKXJldHVybiByKCExKTtlJiZJbi5hZGQoZSksU20obiwoKT0+e2lmKG8ubGVhdmUmJm8ubGVhdmUuaGFzKHQuaW5kZXgpKXtsZXQgcz1vLmxlYXZlLmdldCh0LmluZGV4KSxhPVtdO2lmKHMpe2ZvcihsZXQgYz0wO2M8cy5hbmltYXRlRm5zLmxlbmd0aDtjKyspe2xldCB1PXMuYW5pbWF0ZUZuc1tjXSx7cHJvbWlzZTpsfT11KCk7YS5wdXNoKGwpfW8uZGV0YWNoZWRMZWF2ZUFuaW1hdGlvbkZucz12b2lkIDB9by5ydW5uaW5nPVByb21pc2UuYWxsU2V0dGxlZChhKSxGdyhlLHIpfWVsc2UgZSYmSW4uZGVsZXRlKGUpLHIoITEpfSxvKX1mdW5jdGlvbiBGdyhlLHQpe2xldCBuPWVbcG5dPy5ydW5uaW5nO2lmKG4pe24udGhlbigoKT0+e2VbcG5dLnJ1bm5pbmc9dm9pZCAwLEluLmRlbGV0ZShlKSx0KCEwKX0pO3JldHVybn10KCExKX1mdW5jdGlvbiBrdyhlLHQpe2xldCBuPWUuY2xlYW51cCxyPXRbZXJdO2lmKG4hPT1udWxsKWZvcihsZXQgcz0wO3M8bi5sZW5ndGgtMTtzKz0yKWlmKHR5cGVvZiBuW3NdPT0ic3RyaW5nIil7bGV0IGE9bltzKzNdO2E+PTA/clthXSgpOnJbLWFdLnVuc3Vic2NyaWJlKCkscys9Mn1lbHNle2xldCBhPXJbbltzKzFdXTtuW3NdLmNhbGwoYSl9ciE9PW51bGwmJih0W2VyXT1udWxsKTtsZXQgbz10W2R0XTtpZihvIT09bnVsbCl7dFtkdF09bnVsbDtmb3IobGV0IHM9MDtzPG8ubGVuZ3RoO3MrKyl7bGV0IGE9b1tzXTthKCl9fWxldCBpPXRbZ3RdO2lmKGkhPT1udWxsKXt0W2d0XT1udWxsO2ZvcihsZXQgcyBvZiBpKXMuZGVzdHJveSgpfX1mdW5jdGlvbiBQdyhlLHQpe2xldCBuO2lmKGUhPW51bGwmJihuPWUuZGVzdHJveUhvb2tzKSE9bnVsbClmb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrPTIpe2xldCBvPXRbbltyXV07aWYoIShvIGluc3RhbmNlb2YgRW4pKXtsZXQgaT1uW3IrMV07aWYoQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IHM9MDtzPGkubGVuZ3RoO3MrPTIpe2xldCBhPW9baVtzXV0sYz1pW3MrMV07TCg0LGEsYyk7dHJ5e2MuY2FsbChhKX1maW5hbGx5e0woNSxhLGMpfX1lbHNle0woNCxvLGkpO3RyeXtpLmNhbGwobyl9ZmluYWxseXtMKDUsbyxpKX19fX19ZnVuY3Rpb24gQW0oZSx0LG4pe3JldHVybiBMdyhlLHQucGFyZW50LG4pfWZ1bmN0aW9uIEx3KGUsdCxuKXtsZXQgcj10O2Zvcig7ciE9PW51bGwmJnIudHlwZSYxNjg7KXQ9cixyPXQucGFyZW50O2lmKHI9PT1udWxsKXJldHVybiBuW2tlXTtpZihtdChyKSl7bGV0e2VuY2Fwc3VsYXRpb246b309ZS5kYXRhW3IuZGlyZWN0aXZlU3RhcnQrci5jb21wb25lbnRPZmZzZXRdO2lmKG89PT12dC5Ob25lfHxvPT09dnQuRW11bGF0ZWQpcmV0dXJuIG51bGx9cmV0dXJuIFNlKHIsbil9ZnVuY3Rpb24geG0oZSx0LG4pe3JldHVybiBCdyhlLHQsbil9ZnVuY3Rpb24gancoZSx0LG4pe3JldHVybiBlLnR5cGUmNDA/U2UoZSxuKTpudWxsfWZ1bmN0aW9uIG5kKGUsdCxuLHIpe2xldCBvPUFtKGUscix0KSxpPXRbUF0scz1yLnBhcmVudHx8dFtmZV0sYT14bShzLHIsdCk7aWYobyE9bnVsbClpZihBcnJheS5pc0FycmF5KG4pKWZvcihsZXQgYz0wO2M8bi5sZW5ndGg7YysrKW9nKGksbyxuW2NdLGEsITEpO2Vsc2Ugb2coaSxvLG4sYSwhMSk7ZmchPT12b2lkIDAmJmZnKGkscix0LG4sbyl9ZnVuY3Rpb24gc28oZSx0KXtpZih0IT09bnVsbCl7bGV0IG49dC50eXBlO2lmKG4mMylyZXR1cm4gU2UodCxlKTtpZihuJjQpcmV0dXJuIGxsKC0xLGVbdC5pbmRleF0pO2lmKG4mOCl7bGV0IHI9dC5jaGlsZDtpZihyIT09bnVsbClyZXR1cm4gc28oZSxyKTt7bGV0IG89ZVt0LmluZGV4XTtyZXR1cm4gUGUobyk/bGwoLTEsbyk6TWUobyl9fWVsc2V7aWYobiYxMjgpcmV0dXJuIHNvKGUsdC5uZXh0KTtpZihuJjMyKXJldHVybiBRbCh0LGUpKCl8fE1lKGVbdC5pbmRleF0pO3tsZXQgcj1SbShlLHQpO2lmKHIhPT1udWxsKXtpZihBcnJheS5pc0FycmF5KHIpKXJldHVybiByWzBdO2xldCBvPVN0KGVbY2VdKTtyZXR1cm4gc28obyxyKX1lbHNlIHJldHVybiBzbyhlLHQubmV4dCl9fX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBSbShlLHQpe2lmKHQhPT1udWxsKXtsZXQgcj1lW2NlXVtmZV0sbz10LnByb2plY3Rpb247cmV0dXJuIHIucHJvamVjdGlvbltvXX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBsbChlLHQpe2xldCBuPVorZSsxO2lmKG48dC5sZW5ndGgpe2xldCByPXRbbl0sbz1yW3ddLmZpcnN0Q2hpbGQ7aWYobyE9PW51bGwpcmV0dXJuIHNvKHIsbyl9cmV0dXJuIHRbeHRdfWZ1bmN0aW9uIHJkKGUsdCxuLHIsbyxpLHMpe2Zvcig7biE9bnVsbDspe2xldCBhPXJbaHRdO2lmKG4udHlwZT09PTEyOCl7bj1uLm5leHQ7Y29udGludWV9bGV0IGM9cltuLmluZGV4XSx1PW4udHlwZTtpZihzJiZ0PT09MCYmKGMmJmRyKE1lKGMpLHIpLG4uZmxhZ3N8PTIpLCFqcyhuKSlpZih1JjgpcmQoZSx0LG4uY2hpbGQscixvLGksITEpLGNyKHQsZSxhLG8sYyxuLGkscik7ZWxzZSBpZih1JjMyKXtsZXQgbD1RbChuLHIpLGQ7Zm9yKDtkPWwoKTspY3IodCxlLGEsbyxkLG4saSxyKTtjcih0LGUsYSxvLGMsbixpLHIpfWVsc2UgdSYxNj9PbShlLHQscixuLG8saSk6Y3IodCxlLGEsbyxjLG4saSxyKTtuPXM/bi5wcm9qZWN0aW9uTmV4dDpuLm5leHR9fWZ1bmN0aW9uIEdzKGUsdCxuLHIsbyxpKXtyZChuLHIsZS5maXJzdENoaWxkLHQsbyxpLCExKX1mdW5jdGlvbiBWdyhlLHQsbil7bGV0IHI9dFtQXSxvPUFtKGUsbix0KSxpPW4ucGFyZW50fHx0W2ZlXSxzPXhtKGksbix0KTtPbShyLDAsdCxuLG8scyl9ZnVuY3Rpb24gT20oZSx0LG4scixvLGkpe2xldCBzPW5bY2VdLGM9c1tmZV0ucHJvamVjdGlvbltyLnByb2plY3Rpb25dO2lmKEFycmF5LmlzQXJyYXkoYykpZm9yKGxldCB1PTA7dTxjLmxlbmd0aDt1Kyspe2xldCBsPWNbdV07Y3IodCxlLG5baHRdLG8sbCxyLGksbil9ZWxzZXtsZXQgdT1jLGw9c1t0ZV07cWcocikmJih1LmZsYWdzfD0xMjgpLHJkKGUsdCx1LGwsbyxpLCEwKX19ZnVuY3Rpb24gSHcoZSx0LG4scixvLGkscyl7bGV0IGE9clt4dF0sYz1NZShyKTthIT09YyYmY3IodCxlLG4saSxhLG8scyk7Zm9yKGxldCB1PVo7dTxyLmxlbmd0aDt1Kyspe2xldCBsPXJbdV07R3MobFt3XSxsLGUsdCxpLGEpfX1mdW5jdGlvbiBVdyhlLHQsbixyLG8pe2lmKHQpbz9lLmFkZENsYXNzKG4scik6ZS5yZW1vdmVDbGFzcyhuLHIpO2Vsc2V7bGV0IGk9ci5pbmRleE9mKCItIik9PT0tMT92b2lkIDA6VWUuRGFzaENhc2U7bz09bnVsbD9lLnJlbW92ZVN0eWxlKG4scixpKToodHlwZW9mIG89PSJzdHJpbmciJiZvLmVuZHNXaXRoKCIhaW1wb3J0YW50IikmJihvPW8uc2xpY2UoMCwtMTApLGl8PVVlLkltcG9ydGFudCksZS5zZXRTdHlsZShuLHIsbyxpKSl9fWZ1bmN0aW9uIEZtKGUsdCxuLHIsbyl7bGV0IGk9amUoKSxzPXImMjt0cnl7T3QoLTEpLHMmJnQubGVuZ3RoPkgmJkNtKGUsdCxILCExKSxMKHM/MjowLG8sbiksbihyLG8pfWZpbmFsbHl7T3QoaSksTChzPzM6MSxvLG4pfX1mdW5jdGlvbiBXcyhlLHQsbil7cXcoZSx0LG4pLChuLmZsYWdzJjY0KT09PTY0JiZadyhlLHQsbil9ZnVuY3Rpb24gRG8oZSx0LG49U2Upe2xldCByPXQubG9jYWxOYW1lcztpZihyIT09bnVsbCl7bGV0IG89dC5pbmRleCsxO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGg7aSs9Mil7bGV0IHM9cltpKzFdLGE9cz09PS0xP24odCxlKTplW3NdO2VbbysrXT1hfX19ZnVuY3Rpb24gJHcoZSx0LG4scil7bGV0IGk9ci5nZXQodG0sZW0pfHxuPT09dnQuU2hhZG93RG9tLHM9ZS5zZWxlY3RSb290RWxlbWVudCh0LGkpO3JldHVybiB6dyhzKSxzfWZ1bmN0aW9uIHp3KGUpe0d3KGUpfWZ1bmN0aW9uIFd3KGUpe3JldHVybiBlPT09ImNsYXNzIj8iY2xhc3NOYW1lIjplPT09ImZvciI/Imh0bWxGb3IiOmU9PT0iZm9ybWFjdGlvbiI/ImZvcm1BY3Rpb24iOmU9PT0iaW5uZXJIdG1sIj8iaW5uZXJIVE1MIjplPT09InJlYWRvbmx5Ij8icmVhZE9ubHkiOmU9PT0idGFiaW5kZXgiPyJ0YWJJbmRleCI6ZX1mdW5jdGlvbiBrbShlLHQsbixyLG8saSl7bGV0IHM9dFt3XTtpZihxcyhlLHMsdCxuLHIpKXttdChlKSYmTG0odCxlLmluZGV4KTtyZXR1cm59ZS50eXBlJjMmJihuPVd3KG4pKSxQbShlLHQsbixyLG8saSl9ZnVuY3Rpb24gUG0oZSx0LG4scixvLGkpe2lmKGUudHlwZSYzKXtsZXQgcz1TZShlLHQpO3I9aSE9bnVsbD9pKHIsZS52YWx1ZXx8IiIsbik6cixvLnNldFByb3BlcnR5KHMsbixyKX1lbHNlIGUudHlwZSYxMn1mdW5jdGlvbiBMbShlLHQpe2xldCBuPU5lKHQsZSk7bltBXSYxNnx8KG5bQV18PTY0KX1mdW5jdGlvbiBxdyhlLHQsbil7bGV0IHI9bi5kaXJlY3RpdmVTdGFydCxvPW4uZGlyZWN0aXZlRW5kO210KG4pJiZ5dyh0LG4sZS5kYXRhW3Irbi5jb21wb25lbnRPZmZzZXRdKSxlLmZpcnN0Q3JlYXRlUGFzc3x8RHMobix0KTtsZXQgaT1uLmluaXRpYWxJbnB1dHM7Zm9yKGxldCBzPXI7czxvO3MrKyl7bGV0IGE9ZS5kYXRhW3NdLGM9Y28odCxlLHMsbik7aWYoZHIoYyx0KSxpIT09bnVsbCYmS3codCxzLXIsYyxhLG4saSksTGUoYSkpe2xldCB1PU5lKG4uaW5kZXgsdCk7dVtxXT1jbyh0LGUscyxuKX19fWZ1bmN0aW9uIFp3KGUsdCxuKXtsZXQgcj1uLmRpcmVjdGl2ZVN0YXJ0LG89bi5kaXJlY3RpdmVFbmQsaT1uLmluZGV4LHM9a2goKTt0cnl7T3QoaSk7Zm9yKGxldCBhPXI7YTxvO2ErKyl7bGV0IGM9ZS5kYXRhW2FdLHU9dFthXTtKaShhKSwoYy5ob3N0QmluZGluZ3MhPT1udWxsfHxjLmhvc3RWYXJzIT09MHx8Yy5ob3N0QXR0cnMhPT1udWxsKSYmWXcoYyx1KX19ZmluYWxseXtPdCgtMSksSmkocyl9fWZ1bmN0aW9uIFl3KGUsdCl7ZS5ob3N0QmluZGluZ3MhPT1udWxsJiZlLmhvc3RCaW5kaW5ncygxLHQpfWZ1bmN0aW9uIG9kKGUsdCl7bGV0IG49ZS5kaXJlY3RpdmVSZWdpc3RyeSxyPW51bGw7aWYobilmb3IobGV0IG89MDtvPG4ubGVuZ3RoO28rKyl7bGV0IGk9bltvXTtFbSh0LGkuc2VsZWN0b3JzLCExKSYmKHI/Pz1bXSxMZShpKT9yLnVuc2hpZnQoaSk6ci5wdXNoKGkpKX1yZXR1cm4gcn1mdW5jdGlvbiBRdyhlLHQsbixyLG8saSl7bGV0IHM9U2UoZSx0KTtqbSh0W1BdLHMsaSxlLnZhbHVlLG4scixvKX1mdW5jdGlvbiBqbShlLHQsbixyLG8saSxzKXtpZihpPT1udWxsKWUucmVtb3ZlQXR0cmlidXRlKHQsbyxuKTtlbHNle2xldCBhPXM9PW51bGw/RWUoaSk6cyhpLHJ8fCIiLG8pO2Uuc2V0QXR0cmlidXRlKHQsbyxhLG4pfX1mdW5jdGlvbiBLdyhlLHQsbixyLG8saSl7bGV0IHM9aVt0XTtpZihzIT09bnVsbClmb3IobGV0IGE9MDthPHMubGVuZ3RoO2ErPTIpe2xldCBjPXNbYV0sdT1zW2ErMV07YWwocixuLGMsdSl9fWZ1bmN0aW9uIGlkKGUsdCxuLHIsbyl7bGV0IGk9SCtuLHM9dFt3XSxhPW8ocyx0LGUscixuKTt0W2ldPWEsb3IoZSwhMCk7bGV0IGM9ZS50eXBlPT09MjtyZXR1cm4gYz8oZ20odFtQXSxhLGUpLChfaCgpPT09MHx8bnIoZSkpJiZkcihhLHQpLE1oKCkpOmRyKGEsdCksbnMoKSYmKCFjfHwhanMoZSkpJiZuZChzLHQsYSxlKSxlfWZ1bmN0aW9uIHNkKGUpe2xldCB0PWU7cmV0dXJuIEN1KCk/YnUoKToodD10LnBhcmVudCxvcih0LCExKSksdH1mdW5jdGlvbiBKdyhlLHQpe2xldCBuPWVbaHRdO2lmKCFuKXJldHVybjtsZXQgcjt0cnl7cj1uLmdldChCZSxudWxsKX1jYXRjaHtyPW51bGx9cj8uKHQpfWZ1bmN0aW9uIHFzKGUsdCxuLHIsbyl7bGV0IGk9ZS5pbnB1dHM/LltyXSxzPWUuaG9zdERpcmVjdGl2ZUlucHV0cz8uW3JdLGE9ITE7aWYocylmb3IobGV0IGM9MDtjPHMubGVuZ3RoO2MrPTIpe2xldCB1PXNbY10sbD1zW2MrMV0sZD10LmRhdGFbdV07YWwoZCxuW3VdLGwsbyksYT0hMH1pZihpKWZvcihsZXQgYyBvZiBpKXtsZXQgdT1uW2NdLGw9dC5kYXRhW2NdO2FsKGwsdSxyLG8pLGE9ITB9cmV0dXJuIGF9ZnVuY3Rpb24gWHcoZSx0KXtsZXQgbj1OZSh0LGUpLHI9blt3XTtlQyhyLG4pO2xldCBvPW5ba2VdO28hPT1udWxsJiZuW3VuXT09PW51bGwmJihuW3VuXT1ybShvLG5baHRdKSksTCgxOCksYWQocixuLG5bcV0pLEwoMTksbltxXSl9ZnVuY3Rpb24gZUMoZSx0KXtmb3IobGV0IG49dC5sZW5ndGg7bjxlLmJsdWVwcmludC5sZW5ndGg7bisrKXQucHVzaChlLmJsdWVwcmludFtuXSl9ZnVuY3Rpb24gYWQoZSx0LG4pe2VzKHQpO3RyeXtsZXQgcj1lLnZpZXdRdWVyeTtyIT09bnVsbCYmSnUoMSxyLG4pO2xldCBvPWUudGVtcGxhdGU7byE9PW51bGwmJkZtKGUsdCxvLDEsbiksZS5maXJzdENyZWF0ZVBhc3MmJihlLmZpcnN0Q3JlYXRlUGFzcz0hMSksdFtKZV0/LmZpbmlzaFZpZXdDcmVhdGlvbihlKSxlLnN0YXRpY0NvbnRlbnRRdWVyaWVzJiZvbShlLHQpLGUuc3RhdGljVmlld1F1ZXJpZXMmJkp1KDIsZS52aWV3UXVlcnksbik7bGV0IGk9ZS5jb21wb25lbnRzO2khPT1udWxsJiZ0Qyh0LGkpfWNhdGNoKHIpe3Rocm93IGUuZmlyc3RDcmVhdGVQYXNzJiYoZS5pbmNvbXBsZXRlRmlyc3RQYXNzPSEwLGUuZmlyc3RDcmVhdGVQYXNzPSExKSxyfWZpbmFsbHl7dFtBXSY9LTUsdHMoKX19ZnVuY3Rpb24gdEMoZSx0KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylYdyhlLHRbbl0pfWZ1bmN0aW9uIEVvKGUsdCxuLHIpe2xldCBvPU0obnVsbCk7dHJ5e2xldCBpPXQudFZpZXcsYT1lW0FdJjQwOTY/NDA5NjoxNixjPVpsKGUsaSxuLGEsbnVsbCx0LG51bGwsbnVsbCxyPy5pbmplY3Rvcj8/bnVsbCxyPy5lbWJlZGRlZFZpZXdJbmplY3Rvcj8/bnVsbCxyPy5kZWh5ZHJhdGVkVmlldz8/bnVsbCksdT1lW3QuaW5kZXhdO2NbQXRdPXU7bGV0IGw9ZVtKZV07cmV0dXJuIGwhPT1udWxsJiYoY1tKZV09bC5jcmVhdGVFbWJlZGRlZFZpZXcoaSkpLGFkKGksYyxuKSxjfWZpbmFsbHl7TShvKX19ZnVuY3Rpb24gZnIoZSx0KXtyZXR1cm4hdHx8dC5maXJzdENoaWxkPT09bnVsbHx8cWcoZSl9ZnVuY3Rpb24gbG8oZSx0LG4scixvPSExKXtmb3IoO24hPT1udWxsOyl7aWYobi50eXBlPT09MTI4KXtuPW8/bi5wcm9qZWN0aW9uTmV4dDpuLm5leHQ7Y29udGludWV9bGV0IGk9dFtuLmluZGV4XTtpIT09bnVsbCYmci5wdXNoKE1lKGkpKSxQZShpKSYmQm0oaSxyKTtsZXQgcz1uLnR5cGU7aWYocyY4KWxvKGUsdCxuLmNoaWxkLHIpO2Vsc2UgaWYocyYzMil7bGV0IGE9UWwobix0KSxjO2Zvcig7Yz1hKCk7KXIucHVzaChjKX1lbHNlIGlmKHMmMTYpe2xldCBhPVJtKHQsbik7aWYoQXJyYXkuaXNBcnJheShhKSlyLnB1c2goLi4uYSk7ZWxzZXtsZXQgYz1TdCh0W2NlXSk7bG8oY1t3XSxjLGEsciwhMCl9fW49bz9uLnByb2plY3Rpb25OZXh0Om4ubmV4dH1yZXR1cm4gcn1mdW5jdGlvbiBCbShlLHQpe2ZvcihsZXQgbj1aO248ZS5sZW5ndGg7bisrKXtsZXQgcj1lW25dLG89clt3XS5maXJzdENoaWxkO28hPT1udWxsJiZsbyhyW3ddLHIsbyx0KX1lW3h0XSE9PWVba2VdJiZ0LnB1c2goZVt4dF0pfWZ1bmN0aW9uIFZtKGUpe2lmKGVbZm5dIT09bnVsbCl7Zm9yKGxldCB0IG9mIGVbZm5dKXQuaW1wbC5hZGRTZXF1ZW5jZSh0KTtlW2ZuXS5sZW5ndGg9MH19ZnVuY3Rpb24gbkMoZSl7cmV0dXJuIGVbSWVdPz9yQyhlKX1mdW5jdGlvbiByQyhlKXtsZXQgdD1IbS5wb3AoKT8/T2JqZWN0LmNyZWF0ZShpQyk7cmV0dXJuIHQubFZpZXc9ZSx0fWZ1bmN0aW9uIG9DKGUpe2UubFZpZXdbSWVdIT09ZSYmKGUubFZpZXc9bnVsbCxIbS5wdXNoKGUpKX1mdW5jdGlvbiBzQyhlKXtsZXQgdD1lW0llXT8/T2JqZWN0LmNyZWF0ZShhQyk7cmV0dXJuIHQubFZpZXc9ZSx0fWZ1bmN0aW9uIFVtKGUpe3JldHVybiBlLnR5cGUhPT0yfWZ1bmN0aW9uICRtKGUpe2lmKGVbZ3RdPT09bnVsbClyZXR1cm47bGV0IHQ9ITA7Zm9yKDt0Oyl7bGV0IG49ITE7Zm9yKGxldCByIG9mIGVbZ3RdKXIuZGlydHkmJihuPSEwLHIuem9uZT09PW51bGx8fFpvbmUuY3VycmVudD09PXIuem9uZT9yLnJ1bigpOnIuem9uZS5ydW4oKCk9PnIucnVuKCkpKTt0PW4mJiEhKGVbQV0mODE5Mil9fWZ1bmN0aW9uIHptKGUsdD0wKXtsZXQgcj1lW0tlXS5yZW5kZXJlckZhY3Rvcnksbz0hMTtvfHxyLmJlZ2luPy4oKTt0cnl7dUMoZSx0KX1maW5hbGx5e298fHIuZW5kPy4oKX19ZnVuY3Rpb24gdUMoZSx0KXtsZXQgbj1UdSgpO3RyeXtpcighMCksZGwoZSx0KTtsZXQgcj0wO2Zvcig7WHIoZSk7KXtpZihyPT09Y0MpdGhyb3cgbmV3IHYoMTAzLCExKTtyKyssZGwoZSwxKX19ZmluYWxseXtpcihuKX19ZnVuY3Rpb24gbEMoZSx0LG4scil7aWYoZ24odCkpcmV0dXJuO2xldCBvPXRbQV0saT0hMSxzPSExO2VzKHQpO2xldCBhPSEwLGM9bnVsbCx1PW51bGw7aXx8KFVtKGUpPyh1PW5DKHQpLGM9Q3QodSkpOnFvKCk9PT1udWxsPyhhPSExLHU9c0ModCksYz1DdCh1KSk6dFtJZV0mJihidCh0W0llXSksdFtJZV09bnVsbCkpO3RyeXtwdSh0KSxSaChlLmJpbmRpbmdTdGFydEluZGV4KSxuIT09bnVsbCYmRm0oZSx0LG4sMixyKTtsZXQgbD0obyYzKT09PTM7aWYoIWkpaWYobCl7bGV0IGY9ZS5wcmVPcmRlckNoZWNrSG9va3M7ZiE9PW51bGwmJmxzKHQsZixudWxsKX1lbHNle2xldCBmPWUucHJlT3JkZXJIb29rcztmIT09bnVsbCYmZHModCxmLDAsbnVsbCksUHUodCwwKX1pZihzfHxkQyh0KSwkbSh0KSxHbSh0LDApLGUuY29udGVudFF1ZXJpZXMhPT1udWxsJiZvbShlLHQpLCFpKWlmKGwpe2xldCBmPWUuY29udGVudENoZWNrSG9va3M7ZiE9PW51bGwmJmxzKHQsZil9ZWxzZXtsZXQgZj1lLmNvbnRlbnRIb29rcztmIT09bnVsbCYmZHModCxmLDEpLFB1KHQsMSl9cEMoZSx0KTtsZXQgZD1lLmNvbXBvbmVudHM7ZCE9PW51bGwmJnFtKHQsZCwwKTtsZXQgcD1lLnZpZXdRdWVyeTtpZihwIT09bnVsbCYmSnUoMixwLHIpLCFpKWlmKGwpe2xldCBmPWUudmlld0NoZWNrSG9va3M7ZiE9PW51bGwmJmxzKHQsZil9ZWxzZXtsZXQgZj1lLnZpZXdIb29rcztmIT09bnVsbCYmZHModCxmLDIpLFB1KHQsMil9aWYoZS5maXJzdFVwZGF0ZVBhc3M9PT0hMCYmKGUuZmlyc3RVcGRhdGVQYXNzPSExKSx0W3FpXSl7Zm9yKGxldCBmIG9mIHRbcWldKWYoKTt0W3FpXT1udWxsfWl8fChWbSh0KSx0W0FdJj0tNzMpfWNhdGNoKGwpe3Rocm93IGl8fFJ0KHQpLGx9ZmluYWxseXt1IT09bnVsbCYmKHp0KHUsYyksYSYmb0ModSkpLHRzKCl9fWZ1bmN0aW9uIEdtKGUsdCl7Zm9yKGxldCBuPVlnKGUpO24hPT1udWxsO249UWcobikpZm9yKGxldCByPVo7cjxuLmxlbmd0aDtyKyspe2xldCBvPW5bcl07V20obyx0KX19ZnVuY3Rpb24gZEMoZSl7Zm9yKGxldCB0PVlnKGUpO3QhPT1udWxsO3Q9UWcodCkpe2lmKCEodFtBXSYyKSljb250aW51ZTtsZXQgbj10W2huXTtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrKyl7bGV0IG89bltyXTtodShvKX19fWZ1bmN0aW9uIGZDKGUsdCxuKXtMKDE4KTtsZXQgcj1OZSh0LGUpO1dtKHIsbiksTCgxOSxyW3FdKX1mdW5jdGlvbiBXbShlLHQpe1lpKGUpJiZkbChlLHQpfWZ1bmN0aW9uIGRsKGUsdCl7bGV0IHI9ZVt3XSxvPWVbQV0saT1lW0llXSxzPSEhKHQ9PT0wJiZvJjE2KTtpZihzfHw9ISEobyY2NCYmdD09PTApLHN8fD0hIShvJjEwMjQpLHN8fD0hIShpPy5kaXJ0eSYmR3QoaSkpLHN8fD0hMSxpJiYoaS5kaXJ0eT0hMSksZVtBXSY9LTkyMTcscylsQyhyLGUsci50ZW1wbGF0ZSxlW3FdKTtlbHNlIGlmKG8mODE5Mil7bGV0IGE9TShudWxsKTt0cnl7JG0oZSksR20oZSwxKTtsZXQgYz1yLmNvbXBvbmVudHM7YyE9PW51bGwmJnFtKGUsYywxKSxWbShlKX1maW5hbGx5e00oYSl9fX1mdW5jdGlvbiBxbShlLHQsbil7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspZkMoZSx0W3JdLG4pfWZ1bmN0aW9uIHBDKGUsdCl7bGV0IG49ZS5ob3N0QmluZGluZ09wQ29kZXM7aWYobiE9PW51bGwpdHJ5e2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtsZXQgbz1uW3JdO2lmKG88MClPdCh+byk7ZWxzZXtsZXQgaT1vLHM9blsrK3JdLGE9blsrK3JdO0ZoKHMsaSk7bGV0IGM9dFtpXTtMKDI0LGMpLGEoMixjKSxMKDI1LGMpfX19ZmluYWxseXtPdCgtMSl9fWZ1bmN0aW9uIGNkKGUsdCl7bGV0IG49VHUoKT82NDoxMDg4O2ZvcihlW0tlXS5jaGFuZ2VEZXRlY3Rpb25TY2hlZHVsZXI/Lm5vdGlmeSh0KTtlOyl7ZVtBXXw9bjtsZXQgcj1TdChlKTtpZihycihlKSYmIXIpcmV0dXJuIGU7ZT1yfXJldHVybiBudWxsfWZ1bmN0aW9uIFptKGUsdCxuLHIpe3JldHVybltlLCEwLDAsdCxudWxsLHIsbnVsbCxuLG51bGwsbnVsbF19ZnVuY3Rpb24gWW0oZSx0KXtsZXQgbj1aK3Q7aWYobjxlLmxlbmd0aClyZXR1cm4gZVtuXX1mdW5jdGlvbiBJbyhlLHQsbixyPSEwKXtsZXQgbz10W3ddO2lmKGhDKG8sdCxlLG4pLHIpe2xldCBzPWxsKG4sZSksYT10W1BdLGM9YS5wYXJlbnROb2RlKGVbeHRdKTtjIT09bnVsbCYmUncobyxlW2ZlXSxhLHQsYyxzKX1sZXQgaT10W3VuXTtpIT09bnVsbCYmaS5maXJzdENoaWxkIT09bnVsbCYmKGkuZmlyc3RDaGlsZD1udWxsKX1mdW5jdGlvbiBRbShlLHQpe2xldCBuPWZvKGUsdCk7cmV0dXJuIG4hPT12b2lkIDAmJnpzKG5bd10sbiksbn1mdW5jdGlvbiBmbyhlLHQpe2lmKGUubGVuZ3RoPD1aKXJldHVybjtsZXQgbj1aK3Qscj1lW25dO2lmKHIpe2xldCBvPXJbQXRdO28hPT1udWxsJiZvIT09ZSYmdGQobyxyKSx0PjAmJihlW24tMV1bX2VdPXJbX2VdKTtsZXQgaT1acihlLFordCk7eHcoclt3XSxyKTtsZXQgcz1pW0plXTtzIT09bnVsbCYmcy5kZXRhY2hWaWV3KGlbd10pLHJbdGVdPW51bGwscltfZV09bnVsbCxyW0FdJj0tMTI5fXJldHVybiByfWZ1bmN0aW9uIGhDKGUsdCxuLHIpe2xldCBvPVorcixpPW4ubGVuZ3RoO3I+MCYmKG5bby0xXVtfZV09dCkscjxpLVo/KHRbX2VdPW5bb10sSmMobixaK3IsdCkpOihuLnB1c2godCksdFtfZV09bnVsbCksdFt0ZV09bjtsZXQgcz10W0F0XTtzIT09bnVsbCYmbiE9PXMmJkttKHMsdCk7bGV0IGE9dFtKZV07YSE9PW51bGwmJmEuaW5zZXJ0VmlldyhlKSxRaSh0KSx0W0FdfD0xMjh9ZnVuY3Rpb24gS20oZSx0KXtsZXQgbj1lW2huXSxyPXRbdGVdO2lmKFhlKHIpKWVbQV18PTI7ZWxzZXtsZXQgbz1yW3RlXVtjZV07dFtjZV0hPT1vJiYoZVtBXXw9Mil9bj09PW51bGw/ZVtobl09W3RdOm4ucHVzaCh0KX1mdW5jdGlvbiBnQygpe3JldHVybiBacyhKKCksRSgpKX1mdW5jdGlvbiBacyhlLHQpe3JldHVybiBlLnR5cGUmND9uZXcgbnQodCxlLG1yKGUsdCkpOm51bGx9ZnVuY3Rpb24geXIoZSx0LG4scixvKXtsZXQgaT1lLmRhdGFbdF07aWYoaT09PW51bGwpaT1tQyhlLHQsbixyLG8pLE9oKCkmJihpLmZsYWdzfD0zMik7ZWxzZSBpZihpLnR5cGUmNjQpe2kudHlwZT1uLGkudmFsdWU9cixpLmF0dHJzPW87bGV0IHM9QWgoKTtpLmluamVjdG9ySW5kZXg9cz09PW51bGw/LTE6cy5pbmplY3RvckluZGV4fXJldHVybiBvcihpLCEwKSxpfWZ1bmN0aW9uIG1DKGUsdCxuLHIsbyl7bGV0IGk9d3UoKSxzPUN1KCksYT1zP2k6aSYmaS5wYXJlbnQsYz1lLmRhdGFbdF09dkMoZSxhLG4sdCxyLG8pO3JldHVybiB5QyhlLGMsaSxzKSxjfWZ1bmN0aW9uIHlDKGUsdCxuLHIpe2UuZmlyc3RDaGlsZD09PW51bGwmJihlLmZpcnN0Q2hpbGQ9dCksbiE9PW51bGwmJihyP24uY2hpbGQ9PW51bGwmJnQucGFyZW50IT09bnVsbCYmKG4uY2hpbGQ9dCk6bi5uZXh0PT09bnVsbCYmKG4ubmV4dD10LHQucHJldj1uKSl9ZnVuY3Rpb24gdkMoZSx0LG4scixvLGkpe2xldCBzPXQ/dC5pbmplY3RvckluZGV4Oi0xLGE9MDtyZXR1cm4gRHUoKSYmKGF8PTEyOCkse3R5cGU6bixpbmRleDpyLGluc2VydEJlZm9yZUluZGV4Om51bGwsaW5qZWN0b3JJbmRleDpzLGRpcmVjdGl2ZVN0YXJ0Oi0xLGRpcmVjdGl2ZUVuZDotMSxkaXJlY3RpdmVTdHlsaW5nTGFzdDotMSxjb21wb25lbnRPZmZzZXQ6LTEscHJvcGVydHlCaW5kaW5nczpudWxsLGZsYWdzOmEscHJvdmlkZXJJbmRleGVzOjAsdmFsdWU6byxhdHRyczppLG1lcmdlZEF0dHJzOm51bGwsbG9jYWxOYW1lczpudWxsLGluaXRpYWxJbnB1dHM6bnVsbCxpbnB1dHM6bnVsbCxob3N0RGlyZWN0aXZlSW5wdXRzOm51bGwsb3V0cHV0czpudWxsLGhvc3REaXJlY3RpdmVPdXRwdXRzOm51bGwsZGlyZWN0aXZlVG9JbmRleDpudWxsLHRWaWV3Om51bGwsbmV4dDpudWxsLHByZXY6bnVsbCxwcm9qZWN0aW9uTmV4dDpudWxsLGNoaWxkOm51bGwscGFyZW50OnQscHJvamVjdGlvbjpudWxsLHN0eWxlczpudWxsLHN0eWxlc1dpdGhvdXRIb3N0Om51bGwscmVzaWR1YWxTdHlsZXM6dm9pZCAwLGNsYXNzZXM6bnVsbCxjbGFzc2VzV2l0aG91dEhvc3Q6bnVsbCxyZXNpZHVhbENsYXNzZXM6dm9pZCAwLGNsYXNzQmluZGluZ3M6MCxzdHlsZUJpbmRpbmdzOjB9fWZ1bmN0aW9uIERDKGUpe2xldCB0PWVbY3VdPz9bXSxyPWVbdGVdW1BdLG89W107Zm9yKGxldCBpIG9mIHQpaS5kYXRhW1hnXSE9PXZvaWQgMD9vLnB1c2goaSk6RUMoaSxyKTtlW2N1XT1vfWZ1bmN0aW9uIEVDKGUsdCl7bGV0IG49MCxyPWUuZmlyc3RDaGlsZDtpZihyKXtsZXQgbz1lLmRhdGFbSmddO2Zvcig7bjxvOyl7bGV0IGk9ci5uZXh0U2libGluZztobSh0LHIsITEpLHI9aSxuKyt9fX1mdW5jdGlvbiBicyhlLHQpe3JldHVybiBJQyhlLHQpfWZ1bmN0aW9uIEptKGUsdCxuKXtyZXR1cm4gd0MoZSx0LG4pfWZ1bmN0aW9uIENDKCl7bGV0IGU9RSgpLHQ9SigpLG49TmUodC5pbmRleCxlKTtyZXR1cm4oWGUobik/bjplKVtQXX1mdW5jdGlvbiBUcyhlLHQsbil7bGV0IHI9bj9lLnN0eWxlczpudWxsLG89bj9lLmNsYXNzZXM6bnVsbCxpPTA7aWYodCE9PW51bGwpZm9yKGxldCBzPTA7czx0Lmxlbmd0aDtzKyspe2xldCBhPXRbc107aWYodHlwZW9mIGE9PSJudW1iZXIiKWk9YTtlbHNlIGlmKGk9PTEpbz1CaShvLGEpO2Vsc2UgaWYoaT09Mil7bGV0IGM9YSx1PXRbKytzXTtyPUJpKHIsYysiOiAiK3UrIjsiKX19bj9lLnN0eWxlcz1yOmUuc3R5bGVzV2l0aG91dEhvc3Q9cixuP2UuY2xhc3Nlcz1vOmUuY2xhc3Nlc1dpdGhvdXRIb3N0PW99ZnVuY3Rpb24gVShlLHQ9MCl7bGV0IG49RSgpO2lmKG49PT1udWxsKXJldHVybiBDKGUsdCk7bGV0IHI9SigpO3JldHVybiAkZyhyLG4sZWUoZSksdCl9ZnVuY3Rpb24gYkMoKXtsZXQgZT0iaW52YWxpZCI7dGhyb3cgbmV3IEVycm9yKGUpfWZ1bmN0aW9uIHR5KGUsdCxuLHIsbyl7bGV0IGk9cj09PW51bGw/bnVsbDp7IiI6LTF9LHM9byhlLG4pO2lmKHMhPT1udWxsKXtsZXQgYT1zLGM9bnVsbCx1PW51bGw7Zm9yKGxldCBsIG9mIHMpaWYobC5yZXNvbHZlSG9zdERpcmVjdGl2ZXMhPT1udWxsKXtbYSxjLHVdPWwucmVzb2x2ZUhvc3REaXJlY3RpdmVzKHMpO2JyZWFrfU1DKGUsdCxuLGEsaSxjLHUpfWkhPT1udWxsJiZyIT09bnVsbCYmVEMobixyLGkpfWZ1bmN0aW9uIFRDKGUsdCxuKXtsZXQgcj1lLmxvY2FsTmFtZXM9W107Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKz0yKXtsZXQgaT1uW3RbbysxXV07aWYoaT09bnVsbCl0aHJvdyBuZXcgdigtMzAxLCExKTtyLnB1c2godFtvXSxpKX19ZnVuY3Rpb24gX0MoZSx0LG4pe3QuY29tcG9uZW50T2Zmc2V0PW4sKGUuY29tcG9uZW50cz8/PVtdKS5wdXNoKHQuaW5kZXgpfWZ1bmN0aW9uIE1DKGUsdCxuLHIsbyxpLHMpe2xldCBhPXIubGVuZ3RoLGM9ITE7Zm9yKGxldCBwPTA7cDxhO3ArKyl7bGV0IGY9cltwXTshYyYmTGUoZikmJihjPSEwLF9DKGUsbixwKSksWnUoRHMobix0KSxlLGYudHlwZSl9T0MobixlLmRhdGEubGVuZ3RoLGEpO2ZvcihsZXQgcD0wO3A8YTtwKyspe2xldCBmPXJbcF07Zi5wcm92aWRlcnNSZXNvbHZlciYmZi5wcm92aWRlcnNSZXNvbHZlcihmKX1sZXQgdT0hMSxsPSExLGQ9d20oZSx0LGEsbnVsbCk7YT4wJiYobi5kaXJlY3RpdmVUb0luZGV4PW5ldyBNYXApO2ZvcihsZXQgcD0wO3A8YTtwKyspe2xldCBmPXJbcF07aWYobi5tZXJnZWRBdHRycz1scihuLm1lcmdlZEF0dHJzLGYuaG9zdEF0dHJzKSxOQyhlLG4sdCxkLGYpLFJDKGQsZixvKSxzIT09bnVsbCYmcy5oYXMoZikpe2xldFtJLERdPXMuZ2V0KGYpO24uZGlyZWN0aXZlVG9JbmRleC5zZXQoZi50eXBlLFtkLEkrbi5kaXJlY3RpdmVTdGFydCxEK24uZGlyZWN0aXZlU3RhcnRdKX1lbHNlKGk9PT1udWxsfHwhaS5oYXMoZikpJiZuLmRpcmVjdGl2ZVRvSW5kZXguc2V0KGYudHlwZSxkKTtmLmNvbnRlbnRRdWVyaWVzIT09bnVsbCYmKG4uZmxhZ3N8PTQpLChmLmhvc3RCaW5kaW5ncyE9PW51bGx8fGYuaG9zdEF0dHJzIT09bnVsbHx8Zi5ob3N0VmFycyE9PTApJiYobi5mbGFnc3w9NjQpO2xldCBnPWYudHlwZS5wcm90b3R5cGU7IXUmJihnLm5nT25DaGFuZ2VzfHxnLm5nT25Jbml0fHxnLm5nRG9DaGVjaykmJigoZS5wcmVPcmRlckhvb2tzPz89W10pLnB1c2gobi5pbmRleCksdT0hMCksIWwmJihnLm5nT25DaGFuZ2VzfHxnLm5nRG9DaGVjaykmJigoZS5wcmVPcmRlckNoZWNrSG9va3M/Pz1bXSkucHVzaChuLmluZGV4KSxsPSEwKSxkKyt9U0MoZSxuLGkpfWZ1bmN0aW9uIFNDKGUsdCxuKXtmb3IobGV0IHI9dC5kaXJlY3RpdmVTdGFydDtyPHQuZGlyZWN0aXZlRW5kO3IrKyl7bGV0IG89ZS5kYXRhW3JdO2lmKG49PT1udWxsfHwhbi5oYXMobykpcGcoMCx0LG8scikscGcoMSx0LG8sciksZ2codCxyLCExKTtlbHNle2xldCBpPW4uZ2V0KG8pO2hnKDAsdCxpLHIpLGhnKDEsdCxpLHIpLGdnKHQsciwhMCl9fX1mdW5jdGlvbiBwZyhlLHQsbixyKXtsZXQgbz1lPT09MD9uLmlucHV0czpuLm91dHB1dHM7Zm9yKGxldCBpIGluIG8paWYoby5oYXNPd25Qcm9wZXJ0eShpKSl7bGV0IHM7ZT09PTA/cz10LmlucHV0cz8/PXt9OnM9dC5vdXRwdXRzPz89e30sc1tpXT8/PVtdLHNbaV0ucHVzaChyKSxueSh0LGkpfX1mdW5jdGlvbiBoZyhlLHQsbixyKXtsZXQgbz1lPT09MD9uLmlucHV0czpuLm91dHB1dHM7Zm9yKGxldCBpIGluIG8paWYoby5oYXNPd25Qcm9wZXJ0eShpKSl7bGV0IHM9b1tpXSxhO2U9PT0wP2E9dC5ob3N0RGlyZWN0aXZlSW5wdXRzPz89e306YT10Lmhvc3REaXJlY3RpdmVPdXRwdXRzPz89e30sYVtzXT8/PVtdLGFbc10ucHVzaChyLGkpLG55KHQscyl9fWZ1bmN0aW9uIG55KGUsdCl7dD09PSJjbGFzcyI/ZS5mbGFnc3w9ODp0PT09InN0eWxlIiYmKGUuZmxhZ3N8PTE2KX1mdW5jdGlvbiBnZyhlLHQsbil7bGV0e2F0dHJzOnIsaW5wdXRzOm8saG9zdERpcmVjdGl2ZUlucHV0czppfT1lO2lmKHI9PT1udWxsfHwhbiYmbz09PW51bGx8fG4mJmk9PT1udWxsfHxXbChlKSl7ZS5pbml0aWFsSW5wdXRzPz89W10sZS5pbml0aWFsSW5wdXRzLnB1c2gobnVsbCk7cmV0dXJufWxldCBzPW51bGwsYT0wO2Zvcig7YTxyLmxlbmd0aDspe2xldCBjPXJbYV07aWYoYz09PTApe2ErPTQ7Y29udGludWV9ZWxzZSBpZihjPT09NSl7YSs9Mjtjb250aW51ZX1lbHNlIGlmKHR5cGVvZiBjPT0ibnVtYmVyIilicmVhaztpZighbiYmby5oYXNPd25Qcm9wZXJ0eShjKSl7bGV0IHU9b1tjXTtmb3IobGV0IGwgb2YgdSlpZihsPT09dCl7cz8/PVtdLHMucHVzaChjLHJbYSsxXSk7YnJlYWt9fWVsc2UgaWYobiYmaS5oYXNPd25Qcm9wZXJ0eShjKSl7bGV0IHU9aVtjXTtmb3IobGV0IGw9MDtsPHUubGVuZ3RoO2wrPTIpaWYodVtsXT09PXQpe3M/Pz1bXSxzLnB1c2godVtsKzFdLHJbYSsxXSk7YnJlYWt9fWErPTJ9ZS5pbml0aWFsSW5wdXRzPz89W10sZS5pbml0aWFsSW5wdXRzLnB1c2gocyl9ZnVuY3Rpb24gTkMoZSx0LG4scixvKXtlLmRhdGFbcl09bztsZXQgaT1vLmZhY3Rvcnl8fChvLmZhY3Rvcnk9TXQoby50eXBlLCEwKSkscz1uZXcgRW4oaSxMZShvKSxVLG51bGwpO2UuYmx1ZXByaW50W3JdPXMsbltyXT1zLEFDKGUsdCxyLHdtKGUsbixvLmhvc3RWYXJzLHJlKSxvKX1mdW5jdGlvbiBBQyhlLHQsbixyLG8pe2xldCBpPW8uaG9zdEJpbmRpbmdzO2lmKGkpe2xldCBzPWUuaG9zdEJpbmRpbmdPcENvZGVzO3M9PT1udWxsJiYocz1lLmhvc3RCaW5kaW5nT3BDb2Rlcz1bXSk7bGV0IGE9fnQuaW5kZXg7eEMocykhPWEmJnMucHVzaChhKSxzLnB1c2gobixyLGkpfX1mdW5jdGlvbiB4QyhlKXtsZXQgdD1lLmxlbmd0aDtmb3IoO3Q+MDspe2xldCBuPWVbLS10XTtpZih0eXBlb2Ygbj09Im51bWJlciImJm48MClyZXR1cm4gbn1yZXR1cm4gMH1mdW5jdGlvbiBSQyhlLHQsbil7aWYobil7aWYodC5leHBvcnRBcylmb3IobGV0IHI9MDtyPHQuZXhwb3J0QXMubGVuZ3RoO3IrKyluW3QuZXhwb3J0QXNbcl1dPWU7TGUodCkmJihuWyIiXT1lKX19ZnVuY3Rpb24gT0MoZSx0LG4pe2UuZmxhZ3N8PTEsZS5kaXJlY3RpdmVTdGFydD10LGUuZGlyZWN0aXZlRW5kPXQrbixlLnByb3ZpZGVySW5kZXhlcz10fWZ1bmN0aW9uIHVkKGUsdCxuLHIsbyxpLHMsYSl7bGV0IGM9dFt3XSx1PWMuY29uc3RzLGw9d2UodSxzKSxkPXlyKGMsZSxuLHIsbCk7cmV0dXJuIGkmJnR5KGMsdCxkLHdlKHUsYSksbyksZC5tZXJnZWRBdHRycz1scihkLm1lcmdlZEF0dHJzLGQuYXR0cnMpLGQuYXR0cnMhPT1udWxsJiZUcyhkLGQuYXR0cnMsITEpLGQubWVyZ2VkQXR0cnMhPT1udWxsJiZUcyhkLGQubWVyZ2VkQXR0cnMsITApLGMucXVlcmllcyE9PW51bGwmJmMucXVlcmllcy5lbGVtZW50U3RhcnQoYyxkKSxkfWZ1bmN0aW9uIGxkKGUsdCl7RmcoZSx0KSx1dSh0KSYmZS5xdWVyaWVzLmVsZW1lbnRFbmQodCl9ZnVuY3Rpb24gRkMoZSx0LG4scixvLGkpe2xldCBzPXQuY29uc3RzLGE9d2UocyxvKSxjPXlyKHQsZSxuLHIsYSk7aWYoYy5tZXJnZWRBdHRycz1scihjLm1lcmdlZEF0dHJzLGMuYXR0cnMpLGkhPW51bGwpe2xldCB1PXdlKHMsaSk7Yy5sb2NhbE5hbWVzPVtdO2ZvcihsZXQgbD0wO2w8dS5sZW5ndGg7bCs9MiljLmxvY2FsTmFtZXMucHVzaCh1W2xdLC0xKX1yZXR1cm4gYy5hdHRycyE9PW51bGwmJlRzKGMsYy5hdHRycywhMSksYy5tZXJnZWRBdHRycyE9PW51bGwmJlRzKGMsYy5tZXJnZWRBdHRycywhMCksdC5xdWVyaWVzIT09bnVsbCYmdC5xdWVyaWVzLmVsZW1lbnRTdGFydCh0LGMpLGN9ZnVuY3Rpb24gZGQoZSl7cmV0dXJuIFFzKGUpP0FycmF5LmlzQXJyYXkoZSl8fCEoZSBpbnN0YW5jZW9mIE1hcCkmJlN5bWJvbC5pdGVyYXRvciBpbiBlOiExfWZ1bmN0aW9uIHJ5KGUsdCl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0KGVbbl0pO2Vsc2V7bGV0IG49ZVtTeW1ib2wuaXRlcmF0b3JdKCkscjtmb3IoOyEocj1uLm5leHQoKSkuZG9uZTspdChyLnZhbHVlKX19ZnVuY3Rpb24gUXMoZSl7cmV0dXJuIGUhPT1udWxsJiYodHlwZW9mIGU9PSJmdW5jdGlvbiJ8fHR5cGVvZiBlPT0ib2JqZWN0Iil9ZnVuY3Rpb24gS3MoZSx0LG4pe3JldHVybiBlW3RdPW59ZnVuY3Rpb24ga0MoZSx0KXtyZXR1cm4gZVt0XX1mdW5jdGlvbiBwZShlLHQsbil7aWYobj09PXJlKXJldHVybiExO2xldCByPWVbdF07cmV0dXJuIE9iamVjdC5pcyhyLG4pPyExOihlW3RdPW4sITApfWZ1bmN0aW9uIHBvKGUsdCxuLHIpe2xldCBvPXBlKGUsdCxuKTtyZXR1cm4gcGUoZSx0KzEscil8fG99ZnVuY3Rpb24gUEMoZSx0LG4scixvKXtsZXQgaT1wbyhlLHQsbixyKTtyZXR1cm4gcGUoZSx0KzIsbyl8fGl9ZnVuY3Rpb24gTEMoZSx0LG4scixvLGkpe2xldCBzPXBvKGUsdCxuLHIpO3JldHVybiBwbyhlLHQrMixvLGkpfHxzfWZ1bmN0aW9uIGhzKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24gcihvKXtsZXQgaT1tdChlKT9OZShlLmluZGV4LHQpOnQ7Y2QoaSw1KTtsZXQgcz10W3FdLGE9bWcodCxzLG4sbyksYz1yLl9fbmdOZXh0TGlzdGVuZXJGbl9fO2Zvcig7YzspYT1tZyh0LHMsYyxvKSYmYSxjPWMuX19uZ05leHRMaXN0ZW5lckZuX187cmV0dXJuIGF9fWZ1bmN0aW9uIG1nKGUsdCxuLHIpe2xldCBvPU0obnVsbCk7dHJ5e3JldHVybiBMKDYsdCxuKSxuKHIpIT09ITF9Y2F0Y2goaSl7cmV0dXJuIEp3KGUsaSksITF9ZmluYWxseXtMKDcsdCxuKSxNKG8pfX1mdW5jdGlvbiBveShlLHQsbixyLG8saSxzLGEpe2xldCBjPW5yKGUpLHU9ITEsbD1udWxsO2lmKCFyJiZjJiYobD1CQyh0LG4saSxlLmluZGV4KSksbCE9PW51bGwpe2xldCBkPWwuX19uZ0xhc3RMaXN0ZW5lckZuX198fGw7ZC5fX25nTmV4dExpc3RlbmVyRm5fXz1zLGwuX19uZ0xhc3RMaXN0ZW5lckZuX189cyx1PSEwfWVsc2V7bGV0IGQ9U2UoZSxuKSxwPXI/cihkKTpkO0NJKG4scCxpLGEpO2xldCBmPW8ubGlzdGVuKHAsaSxhKTtpZighakMoaSkpe2xldCBnPXI/ST0+cihNZShJW2UuaW5kZXhdKSk6ZS5pbmRleDtpeShnLHQsbixpLGEsZiwhMSl9fXJldHVybiB1fWZ1bmN0aW9uIGpDKGUpe3JldHVybiBlLnN0YXJ0c1dpdGgoImFuaW1hdGlvbiIpfHxlLnN0YXJ0c1dpdGgoInRyYW5zaXRpb24iKX1mdW5jdGlvbiBCQyhlLHQsbixyKXtsZXQgbz1lLmNsZWFudXA7aWYobyE9bnVsbClmb3IobGV0IGk9MDtpPG8ubGVuZ3RoLTE7aSs9Mil7bGV0IHM9b1tpXTtpZihzPT09biYmb1tpKzFdPT09cil7bGV0IGE9dFtlcl0sYz1vW2krMl07cmV0dXJuIGEmJmEubGVuZ3RoPmM/YVtjXTpudWxsfXR5cGVvZiBzPT0ic3RyaW5nIiYmKGkrPTIpfXJldHVybiBudWxsfWZ1bmN0aW9uIGl5KGUsdCxuLHIsbyxpLHMpe2xldCBhPXQuZmlyc3RDcmVhdGVQYXNzP3l1KHQpOm51bGwsYz1tdShuKSx1PWMubGVuZ3RoO2MucHVzaChvLGkpLGEmJmEucHVzaChyLGUsdSwodSsxKSoocz8tMToxKSl9ZnVuY3Rpb24geWcoZSx0LG4scixvLGkpe2xldCBzPXRbbl0sYT10W3ddLHU9YS5kYXRhW25dLm91dHB1dHNbcl0sZD1zW3VdLnN1YnNjcmliZShpKTtpeShlLmluZGV4LGEsdCxvLGksZCwhMCl9ZnVuY3Rpb24gVkMoZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUpLm1hcCh0PT57bGV0W24scixvXT1lW3RdLGk9e3Byb3BOYW1lOm4sdGVtcGxhdGVOYW1lOnQsaXNTaWduYWw6KHImSHMuU2lnbmFsQmFzZWQpIT09MH07cmV0dXJuIG8mJihpLnRyYW5zZm9ybT1vKSxpfSl9ZnVuY3Rpb24gSEMoZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUpLm1hcCh0PT4oe3Byb3BOYW1lOmVbdF0sdGVtcGxhdGVOYW1lOnR9KSl9ZnVuY3Rpb24gVUMoZSx0LG4pe2xldCByPXQgaW5zdGFuY2VvZiB5ZT90OnQ/LmluamVjdG9yO3JldHVybiByJiZlLmdldFN0YW5kYWxvbmVJbmplY3RvciE9PW51bGwmJihyPWUuZ2V0U3RhbmRhbG9uZUluamVjdG9yKHIpfHxyKSxyP25ldyBwbChuLHIpOm59ZnVuY3Rpb24gJEMoZSl7bGV0IHQ9ZS5nZXQod24sbnVsbCk7aWYodD09PW51bGwpdGhyb3cgbmV3IHYoNDA3LCExKTtsZXQgbj1lLmdldChleSxudWxsKSxyPWUuZ2V0KFRlLG51bGwpO3JldHVybntyZW5kZXJlckZhY3Rvcnk6dCxzYW5pdGl6ZXI6bixjaGFuZ2VEZXRlY3Rpb25TY2hlZHVsZXI6cixuZ1JlZmxlY3Q6ITF9fWZ1bmN0aW9uIHpDKGUsdCl7bGV0IG49c3koZSk7cmV0dXJuIGZtKHQsbixuPT09InN2ZyI/bHU6bj09PSJtYXRoIj9FaDpudWxsKX1mdW5jdGlvbiBzeShlKXtyZXR1cm4oZS5zZWxlY3RvcnNbMF1bMF18fCJkaXYiKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIEdDKGUsdCxuLHIpe2xldCBvPWU/WyJuZy12ZXJzaW9uIiwiMjAuMy4xNyJdOmh3KHQuc2VsZWN0b3JzWzBdKSxpPW51bGwscz1udWxsLGE9MDtpZihuKWZvcihsZXQgbCBvZiBuKWErPWxbaGxdLnJlcXVpcmVkVmFycyxsLmNyZWF0ZSYmKGwudGFyZ2V0SWR4PTAsKGk/Pz1bXSkucHVzaChsKSksbC51cGRhdGUmJihsLnRhcmdldElkeD0wLChzPz89W10pLnB1c2gobCkpO2lmKHIpZm9yKGxldCBsPTA7bDxyLmxlbmd0aDtsKyspe2xldCBkPXJbbF07aWYodHlwZW9mIGQhPSJmdW5jdGlvbiIpZm9yKGxldCBwIG9mIGQuYmluZGluZ3Mpe2ErPXBbaGxdLnJlcXVpcmVkVmFycztsZXQgZj1sKzE7cC5jcmVhdGUmJihwLnRhcmdldElkeD1mLChpPz89W10pLnB1c2gocCkpLHAudXBkYXRlJiYocC50YXJnZXRJZHg9Ziwocz8/PVtdKS5wdXNoKHApKX19bGV0IGM9W3RdO2lmKHIpZm9yKGxldCBsIG9mIHIpe2xldCBkPXR5cGVvZiBsPT0iZnVuY3Rpb24iP2w6bC50eXBlLHA9V2koZCk7Yy5wdXNoKHApfXJldHVybiBxbCgwLG51bGwsV0MoaSxzKSwxLGEsYyxudWxsLG51bGwsbnVsbCxbb10sbnVsbCl9ZnVuY3Rpb24gV0MoZSx0KXtyZXR1cm4hZSYmIXQ/bnVsbDpuPT57aWYobiYxJiZlKWZvcihsZXQgciBvZiBlKXIuY3JlYXRlKCk7aWYobiYyJiZ0KWZvcihsZXQgciBvZiB0KXIudXBkYXRlKCl9fWZ1bmN0aW9uIHZnKGUpe2xldCB0PWVbaGxdLmtpbmQ7cmV0dXJuIHQ9PT0iaW5wdXQifHx0PT09InR3b1dheSJ9ZnVuY3Rpb24gcUMoZSx0LG4pe2xldCByPWUucHJvamVjdGlvbj1bXTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7bGV0IGk9bltvXTtyLnB1c2goaSE9bnVsbCYmaS5sZW5ndGg/QXJyYXkuZnJvbShpKTpudWxsKX19ZnVuY3Rpb24gWkMoKXtsZXQgZT1KKCk7cmV0dXJuIGN5KGUsRSgpKX1mdW5jdGlvbiBEZyhlKXtyZXR1cm4gZVtLcl19ZnVuY3Rpb24gQnUoZSl7cmV0dXJuIGVbS3JdfHwoZVtLcl09W10pfWZ1bmN0aW9uIGN5KGUsdCl7bGV0IG4scj10W2UuaW5kZXhdO3JldHVybiBQZShyKT9uPXI6KG49Wm0ocix0LG51bGwsZSksdFtlLmluZGV4XT1uLFlsKHQsbikpLEtDKG4sdCxlLHIpLG5ldyBheShuLGUsdCl9ZnVuY3Rpb24gUUMoZSx0KXtsZXQgbj1lW1BdLHI9bi5jcmVhdGVDb21tZW50KCIiKSxvPVNlKHQsZSksaT1uLnBhcmVudE5vZGUobyk7cmV0dXJuIElzKG4saSxyLG4ubmV4dFNpYmxpbmcobyksITEpLHJ9ZnVuY3Rpb24gWEMoZSx0LG4pe3JldHVybiBKQyhlLHQsbil9ZnVuY3Rpb24gZWIoZSx0LG4scil7aWYoZVt4dF0pcmV0dXJuO2xldCBvO24udHlwZSY4P289TWUocik6bz1RQyh0LG4pLGVbeHRdPW99ZnVuY3Rpb24gdGIoZSx0KXtsZXQgbj1lLmxvY2FsTmFtZXM7aWYobiE9PW51bGwpe2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cis9MilpZihuW3JdPT09dClyZXR1cm4gbltyKzFdfXJldHVybiBudWxsfWZ1bmN0aW9uIG5iKGUsdCl7cmV0dXJuIGUudHlwZSYxMT9tcihlLHQpOmUudHlwZSY0P1pzKGUsdCk6bnVsbH1mdW5jdGlvbiByYihlLHQsbixyKXtyZXR1cm4gbj09PS0xP25iKHQsZSk6bj09PS0yP29iKGUsdCxyKTpjbyhlLGVbd10sbix0KX1mdW5jdGlvbiBvYihlLHQsbil7aWYobj09PUV0KXJldHVybiBtcih0LGUpO2lmKG49PT1udClyZXR1cm4gWnModCxlKTtpZihuPT09b3QpcmV0dXJuIGN5KHQsZSl9ZnVuY3Rpb24gdXkoZSx0LG4scil7bGV0IG89dFtKZV0ucXVlcmllc1tyXTtpZihvLm1hdGNoZXM9PT1udWxsKXtsZXQgaT1lLmRhdGEscz1uLm1hdGNoZXMsYT1bXTtmb3IobGV0IGM9MDtzIT09bnVsbCYmYzxzLmxlbmd0aDtjKz0yKXtsZXQgdT1zW2NdO2lmKHU8MClhLnB1c2gobnVsbCk7ZWxzZXtsZXQgbD1pW3VdO2EucHVzaChyYih0LGwsc1tjKzFdLG4ubWV0YWRhdGEucmVhZCkpfX1vLm1hdGNoZXM9YX1yZXR1cm4gby5tYXRjaGVzfWZ1bmN0aW9uIERsKGUsdCxuLHIpe2xldCBvPWUucXVlcmllcy5nZXRCeUluZGV4KG4pLGk9by5tYXRjaGVzO2lmKGkhPT1udWxsKXtsZXQgcz11eShlLHQsbyxuKTtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErPTIpe2xldCBjPWlbYV07aWYoYz4wKXIucHVzaChzW2EvMl0pO2Vsc2V7bGV0IHU9aVthKzFdLGw9dFstY107Zm9yKGxldCBkPVo7ZDxsLmxlbmd0aDtkKyspe2xldCBwPWxbZF07cFtBdF09PT1wW3RlXSYmRGwocFt3XSxwLHUscil9aWYobFtobl0hPT1udWxsKXtsZXQgZD1sW2huXTtmb3IobGV0IHA9MDtwPGQubGVuZ3RoO3ArKyl7bGV0IGY9ZFtwXTtEbChmW3ddLGYsdSxyKX19fX19cmV0dXJuIHJ9ZnVuY3Rpb24gZmQoZSx0KXtyZXR1cm4gZVtKZV0ucXVlcmllc1t0XS5xdWVyeUxpc3R9ZnVuY3Rpb24gbHkoZSx0LG4pe2xldCByPW5ldyBFcygobiY0KT09PTQpO3JldHVybiBUaChlLHQscixyLmRlc3Ryb3kpLCh0W0plXT8/PW5ldyBtbCkucXVlcmllcy5wdXNoKG5ldyBnbChyKSktMX1mdW5jdGlvbiBkeShlLHQsbil7bGV0IHI9QigpO3JldHVybiByLmZpcnN0Q3JlYXRlUGFzcyYmKHB5KHIsbmV3IFNzKGUsdCxuKSwtMSksKHQmMik9PT0yJiYoci5zdGF0aWNWaWV3UXVlcmllcz0hMCkpLGx5KHIsRSgpLHQpfWZ1bmN0aW9uIGZ5KGUsdCxuLHIpe2xldCBvPUIoKTtpZihvLmZpcnN0Q3JlYXRlUGFzcyl7bGV0IGk9SigpO3B5KG8sbmV3IFNzKHQsbixyKSxpLmluZGV4KSxzYihvLGUpLChuJjIpPT09MiYmKG8uc3RhdGljQ29udGVudFF1ZXJpZXM9ITApfXJldHVybiBseShvLEUoKSxuKX1mdW5jdGlvbiBpYihlKXtyZXR1cm4gZS5zcGxpdCgiLCIpLm1hcCh0PT50LnRyaW0oKSl9ZnVuY3Rpb24gcHkoZSx0LG4pe2UucXVlcmllcz09PW51bGwmJihlLnF1ZXJpZXM9bmV3IHlsKSxlLnF1ZXJpZXMudHJhY2sobmV3IHZsKHQsbikpfWZ1bmN0aW9uIHNiKGUsdCl7bGV0IG49ZS5jb250ZW50UXVlcmllc3x8KGUuY29udGVudFF1ZXJpZXM9W10pLHI9bi5sZW5ndGg/bltuLmxlbmd0aC0xXTotMTt0IT09ciYmbi5wdXNoKGUucXVlcmllcy5sZW5ndGgtMSx0KX1mdW5jdGlvbiBwZChlLHQpe3JldHVybiBlLnF1ZXJpZXMuZ2V0QnlJbmRleCh0KX1mdW5jdGlvbiBoeShlLHQpe2xldCBuPWVbd10scj1wZChuLHQpO3JldHVybiByLmNyb3NzZXNOZ1RlbXBsYXRlP0RsKG4sZSx0LFtdKTp1eShuLGUscix0KX1mdW5jdGlvbiBneShlLHQsbil7bGV0IHIsbz1NcigoKT0+e3IuX2RpcnR5Q291bnRlcigpO2xldCBpPWFiKHIsZSk7aWYodCYmaT09PXZvaWQgMCl0aHJvdyBuZXcgdigtOTUxLCExKTtyZXR1cm4gaX0pO3JldHVybiByPW9bWF0sci5fZGlydHlDb3VudGVyPXJzKDApLHIuX2ZsYXRWYWx1ZT12b2lkIDAsb31mdW5jdGlvbiBoZChlKXtyZXR1cm4gZ3koITAsITEsZSl9ZnVuY3Rpb24gZ2QoZSl7cmV0dXJuIGd5KCEwLCEwLGUpfWZ1bmN0aW9uIG15KGUsdCl7bGV0IG49ZVtYXTtuLl9sVmlldz1FKCksbi5fcXVlcnlJbmRleD10LG4uX3F1ZXJ5TGlzdD1mZChuLl9sVmlldyx0KSxuLl9xdWVyeUxpc3Qub25EaXJ0eSgoKT0+bi5fZGlydHlDb3VudGVyLnVwZGF0ZShyPT5yKzEpKX1mdW5jdGlvbiBhYihlLHQpe2xldCBuPWUuX2xWaWV3LHI9ZS5fcXVlcnlJbmRleDtpZihuPT09dm9pZCAwfHxyPT09dm9pZCAwfHxuW0FdJjQpcmV0dXJuIHQ/dm9pZCAwOmFlO2xldCBvPWZkKG4sciksaT1oeShuLHIpO3JldHVybiBvLnJlc2V0KGksV2cpLHQ/by5maXJzdDpvLl9jaGFuZ2VzRGV0ZWN0ZWR8fGUuX2ZsYXRWYWx1ZT09PXZvaWQgMD9lLl9mbGF0VmFsdWU9by50b0FycmF5KCk6ZS5fZmxhdFZhbHVlfWZ1bmN0aW9uIHZ5KGUsdCxuPW51bGwpe3JldHVybiBuZXcgaG8oe3Byb3ZpZGVyczplLHBhcmVudDp0LGRlYnVnTmFtZTpuLHJ1bkVudmlyb25tZW50SW5pdGlhbGl6ZXJzOiEwfSkuaW5qZWN0b3J9ZnVuY3Rpb24gdWIoZSl7cmV0dXJuIGdyKCgpPT57bGV0IHQ9RHkoZSksbj1HKFYoe30sdCkse2RlY2xzOmUuZGVjbHMsdmFyczplLnZhcnMsdGVtcGxhdGU6ZS50ZW1wbGF0ZSxjb25zdHM6ZS5jb25zdHN8fG51bGwsbmdDb250ZW50U2VsZWN0b3JzOmUubmdDb250ZW50U2VsZWN0b3JzLG9uUHVzaDplLmNoYW5nZURldGVjdGlvbj09PVBsLk9uUHVzaCxkaXJlY3RpdmVEZWZzOm51bGwscGlwZURlZnM6bnVsbCxkZXBlbmRlbmNpZXM6dC5zdGFuZGFsb25lJiZlLmRlcGVuZGVuY2llc3x8bnVsbCxnZXRTdGFuZGFsb25lSW5qZWN0b3I6dC5zdGFuZGFsb25lP289Pm8uZ2V0KGNiKS5nZXRPckNyZWF0ZVN0YW5kYWxvbmVJbmplY3RvcihuKTpudWxsLGdldEV4dGVybmFsU3R5bGVzOm51bGwsc2lnbmFsczplLnNpZ25hbHM/PyExLGRhdGE6ZS5kYXRhfHx7fSxlbmNhcHN1bGF0aW9uOmUuZW5jYXBzdWxhdGlvbnx8dnQuRW11bGF0ZWQsc3R5bGVzOmUuc3R5bGVzfHxhZSxfOm51bGwsc2NoZW1hczplLnNjaGVtYXN8fG51bGwsdFZpZXc6bnVsbCxpZDoiIn0pO3Quc3RhbmRhbG9uZSYmanQoIk5nU3RhbmRhbG9uZSIpLEV5KG4pO2xldCByPWUuZGVwZW5kZW5jaWVzO3JldHVybiBuLmRpcmVjdGl2ZURlZnM9RWcocixsYiksbi5waXBlRGVmcz1FZyhyLGhoKSxuLmlkPXBiKG4pLG59KX1mdW5jdGlvbiBsYihlKXtyZXR1cm4gUWUoZSl8fFdpKGUpfWZ1bmN0aW9uIEJ0KGUpe3JldHVybiBncigoKT0+KHt0eXBlOmUudHlwZSxib290c3RyYXA6ZS5ib290c3RyYXB8fGFlLGRlY2xhcmF0aW9uczplLmRlY2xhcmF0aW9uc3x8YWUsaW1wb3J0czplLmltcG9ydHN8fGFlLGV4cG9ydHM6ZS5leHBvcnRzfHxhZSx0cmFuc2l0aXZlQ29tcGlsZVNjb3BlczpudWxsLHNjaGVtYXM6ZS5zY2hlbWFzfHxudWxsLGlkOmUuaWR8fG51bGx9KSl9ZnVuY3Rpb24gZGIoZSx0KXtpZihlPT1udWxsKXJldHVybiBGZTtsZXQgbj17fTtmb3IobGV0IHIgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHIpKXtsZXQgbz1lW3JdLGkscyxhLGM7QXJyYXkuaXNBcnJheShvKT8oYT1vWzBdLGk9b1sxXSxzPW9bMl0/P2ksYz1vWzNdfHxudWxsKTooaT1vLHM9byxhPUhzLk5vbmUsYz1udWxsKSxuW2ldPVtyLGEsY10sdFtpXT1zfXJldHVybiBufWZ1bmN0aW9uIGZiKGUpe2lmKGU9PW51bGwpcmV0dXJuIEZlO2xldCB0PXt9O2ZvcihsZXQgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W2Vbbl1dPW4pO3JldHVybiB0fWZ1bmN0aW9uIGl0KGUpe3JldHVybiBncigoKT0+e2xldCB0PUR5KGUpO3JldHVybiBFeSh0KSx0fSl9ZnVuY3Rpb24gYm8oZSl7cmV0dXJue3R5cGU6ZS50eXBlLG5hbWU6ZS5uYW1lLGZhY3Rvcnk6bnVsbCxwdXJlOmUucHVyZSE9PSExLHN0YW5kYWxvbmU6ZS5zdGFuZGFsb25lPz8hMCxvbkRlc3Ryb3k6ZS50eXBlLnByb3RvdHlwZS5uZ09uRGVzdHJveXx8bnVsbH19ZnVuY3Rpb24gRHkoZSl7bGV0IHQ9e307cmV0dXJue3R5cGU6ZS50eXBlLHByb3ZpZGVyc1Jlc29sdmVyOm51bGwsZmFjdG9yeTpudWxsLGhvc3RCaW5kaW5nczplLmhvc3RCaW5kaW5nc3x8bnVsbCxob3N0VmFyczplLmhvc3RWYXJzfHwwLGhvc3RBdHRyczplLmhvc3RBdHRyc3x8bnVsbCxjb250ZW50UXVlcmllczplLmNvbnRlbnRRdWVyaWVzfHxudWxsLGRlY2xhcmVkSW5wdXRzOnQsaW5wdXRDb25maWc6ZS5pbnB1dHN8fEZlLGV4cG9ydEFzOmUuZXhwb3J0QXN8fG51bGwsc3RhbmRhbG9uZTplLnN0YW5kYWxvbmU/PyEwLHNpZ25hbHM6ZS5zaWduYWxzPT09ITAsc2VsZWN0b3JzOmUuc2VsZWN0b3JzfHxhZSx2aWV3UXVlcnk6ZS52aWV3UXVlcnl8fG51bGwsZmVhdHVyZXM6ZS5mZWF0dXJlc3x8bnVsbCxzZXRJbnB1dDpudWxsLHJlc29sdmVIb3N0RGlyZWN0aXZlczpudWxsLGhvc3REaXJlY3RpdmVzOm51bGwsaW5wdXRzOmRiKGUuaW5wdXRzLHQpLG91dHB1dHM6ZmIoZS5vdXRwdXRzKSxkZWJ1Z0luZm86bnVsbH19ZnVuY3Rpb24gRXkoZSl7ZS5mZWF0dXJlcz8uZm9yRWFjaCh0PT50KGUpKX1mdW5jdGlvbiBFZyhlLHQpe3JldHVybiBlPygpPT57bGV0IG49dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSgpOmUscj1bXTtmb3IobGV0IG8gb2Ygbil7bGV0IGk9dChvKTtpIT09bnVsbCYmci5wdXNoKGkpfXJldHVybiByfTpudWxsfWZ1bmN0aW9uIHBiKGUpe2xldCB0PTAsbj10eXBlb2YgZS5jb25zdHM9PSJmdW5jdGlvbiI/IiI6ZS5jb25zdHMscj1bZS5zZWxlY3RvcnMsZS5uZ0NvbnRlbnRTZWxlY3RvcnMsZS5ob3N0VmFycyxlLmhvc3RBdHRycyxuLGUudmFycyxlLmRlY2xzLGUuZW5jYXBzdWxhdGlvbixlLnN0YW5kYWxvbmUsZS5zaWduYWxzLGUuZXhwb3J0QXMsSlNPTi5zdHJpbmdpZnkoZS5pbnB1dHMpLEpTT04uc3RyaW5naWZ5KGUub3V0cHV0cyksT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZS50eXBlLnByb3RvdHlwZSksISFlLmNvbnRlbnRRdWVyaWVzLCEhZS52aWV3UXVlcnldO2ZvcihsZXQgaSBvZiByLmpvaW4oInwiKSl0PU1hdGguaW11bCgzMSx0KStpLmNoYXJDb2RlQXQoMCk8PDA7cmV0dXJuIHQrPTIxNDc0ODM2NDgsImMiK3R9ZnVuY3Rpb24gaGIoZSl7cmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihlLnByb3RvdHlwZSkuY29uc3RydWN0b3J9ZnVuY3Rpb24gSXkoZSl7bGV0IHQ9aGIoZS50eXBlKSxuPSEwLHI9W2VdO2Zvcig7dDspe2xldCBvO2lmKExlKGUpKW89dC5cdTAyNzVjbXB8fHQuXHUwMjc1ZGlyO2Vsc2V7aWYodC5cdTAyNzVjbXApdGhyb3cgbmV3IHYoOTAzLCExKTtvPXQuXHUwMjc1ZGlyfWlmKG8pe2lmKG4pe3IucHVzaChvKTtsZXQgcz1lO3MuaW5wdXRzPVZ1KGUuaW5wdXRzKSxzLmRlY2xhcmVkSW5wdXRzPVZ1KGUuZGVjbGFyZWRJbnB1dHMpLHMub3V0cHV0cz1WdShlLm91dHB1dHMpO2xldCBhPW8uaG9zdEJpbmRpbmdzO2EmJkRiKGUsYSk7bGV0IGM9by52aWV3UXVlcnksdT1vLmNvbnRlbnRRdWVyaWVzO2lmKGMmJnliKGUsYyksdSYmdmIoZSx1KSxnYihlLG8pLGloKGUub3V0cHV0cyxvLm91dHB1dHMpLExlKG8pJiZvLmRhdGEuYW5pbWF0aW9uKXtsZXQgbD1lLmRhdGE7bC5hbmltYXRpb249KGwuYW5pbWF0aW9ufHxbXSkuY29uY2F0KG8uZGF0YS5hbmltYXRpb24pfX1sZXQgaT1vLmZlYXR1cmVzO2lmKGkpZm9yKGxldCBzPTA7czxpLmxlbmd0aDtzKyspe2xldCBhPWlbc107YSYmYS5uZ0luaGVyaXQmJmEoZSksYT09PUl5JiYobj0hMSl9fXQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfW1iKHIpfWZ1bmN0aW9uIGdiKGUsdCl7Zm9yKGxldCBuIGluIHQuaW5wdXRzKXtpZighdC5pbnB1dHMuaGFzT3duUHJvcGVydHkobil8fGUuaW5wdXRzLmhhc093blByb3BlcnR5KG4pKWNvbnRpbnVlO2xldCByPXQuaW5wdXRzW25dO3IhPT12b2lkIDAmJihlLmlucHV0c1tuXT1yLGUuZGVjbGFyZWRJbnB1dHNbbl09dC5kZWNsYXJlZElucHV0c1tuXSl9fWZ1bmN0aW9uIG1iKGUpe2xldCB0PTAsbj1udWxsO2ZvcihsZXQgcj1lLmxlbmd0aC0xO3I+PTA7ci0tKXtsZXQgbz1lW3JdO28uaG9zdFZhcnM9dCs9by5ob3N0VmFycyxvLmhvc3RBdHRycz1scihvLmhvc3RBdHRycyxuPWxyKG4sby5ob3N0QXR0cnMpKX19ZnVuY3Rpb24gVnUoZSl7cmV0dXJuIGU9PT1GZT97fTplPT09YWU/W106ZX1mdW5jdGlvbiB5YihlLHQpe2xldCBuPWUudmlld1F1ZXJ5O24/ZS52aWV3UXVlcnk9KHIsbyk9Pnt0KHIsbyksbihyLG8pfTplLnZpZXdRdWVyeT10fWZ1bmN0aW9uIHZiKGUsdCl7bGV0IG49ZS5jb250ZW50UXVlcmllcztuP2UuY29udGVudFF1ZXJpZXM9KHIsbyxpKT0+e3QocixvLGkpLG4ocixvLGkpfTplLmNvbnRlbnRRdWVyaWVzPXR9ZnVuY3Rpb24gRGIoZSx0KXtsZXQgbj1lLmhvc3RCaW5kaW5ncztuP2UuaG9zdEJpbmRpbmdzPShyLG8pPT57dChyLG8pLG4ocixvKX06ZS5ob3N0QmluZGluZ3M9dH1mdW5jdGlvbiBFYihlKXtsZXQgdD1uPT57bGV0IHI9QXJyYXkuaXNBcnJheShlKTtuLmhvc3REaXJlY3RpdmVzPT09bnVsbD8obi5yZXNvbHZlSG9zdERpcmVjdGl2ZXM9SWIsbi5ob3N0RGlyZWN0aXZlcz1yP2UubWFwKEVsKTpbZV0pOnI/bi5ob3N0RGlyZWN0aXZlcy51bnNoaWZ0KC4uLmUubWFwKEVsKSk6bi5ob3N0RGlyZWN0aXZlcy51bnNoaWZ0KGUpfTtyZXR1cm4gdC5uZ0luaGVyaXQ9ITAsdH1mdW5jdGlvbiBJYihlKXtsZXQgdD1bXSxuPSExLHI9bnVsbCxvPW51bGw7Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspe2xldCBzPWVbaV07aWYocy5ob3N0RGlyZWN0aXZlcyE9PW51bGwpe2xldCBhPXQubGVuZ3RoO3I/Pz1uZXcgTWFwLG8/Pz1uZXcgTWFwLHd5KHMsdCxyKSxvLnNldChzLFthLHQubGVuZ3RoLTFdKX1pPT09MCYmTGUocykmJihuPSEwLHQucHVzaChzKSl9Zm9yKGxldCBpPW4/MTowO2k8ZS5sZW5ndGg7aSsrKXQucHVzaChlW2ldKTtyZXR1cm5bdCxyLG9dfWZ1bmN0aW9uIHd5KGUsdCxuKXtpZihlLmhvc3REaXJlY3RpdmVzIT09bnVsbClmb3IobGV0IHIgb2YgZS5ob3N0RGlyZWN0aXZlcylpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7bGV0IG89cigpO2ZvcihsZXQgaSBvZiBvKUlnKEVsKGkpLHQsbil9ZWxzZSBJZyhyLHQsbil9ZnVuY3Rpb24gSWcoZSx0LG4pe2xldCByPVdpKGUuZGlyZWN0aXZlKTt3YihyLmRlY2xhcmVkSW5wdXRzLGUuaW5wdXRzKSx3eShyLHQsbiksbi5zZXQocixlKSx0LnB1c2gocil9ZnVuY3Rpb24gRWwoZSl7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iP3tkaXJlY3RpdmU6ZWUoZSksaW5wdXRzOkZlLG91dHB1dHM6RmV9OntkaXJlY3RpdmU6ZWUoZS5kaXJlY3RpdmUpLGlucHV0czp3ZyhlLmlucHV0cyksb3V0cHV0czp3ZyhlLm91dHB1dHMpfX1mdW5jdGlvbiB3ZyhlKXtpZihlPT09dm9pZCAwfHxlLmxlbmd0aD09PTApcmV0dXJuIEZlO2xldCB0PXt9O2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bis9Mil0W2Vbbl1dPWVbbisxXTtyZXR1cm4gdH1mdW5jdGlvbiB3YihlLHQpe2ZvcihsZXQgbiBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobikpe2xldCByPXRbbl0sbz1lW25dO2Vbcl09b319ZnVuY3Rpb24gQ3koZSx0LG4scixvLGkscyxhKXtpZihuLmZpcnN0Q3JlYXRlUGFzcyl7ZS5tZXJnZWRBdHRycz1scihlLm1lcmdlZEF0dHJzLGUuYXR0cnMpO2xldCBsPWUudFZpZXc9cWwoMixlLG8saSxzLG4uZGlyZWN0aXZlUmVnaXN0cnksbi5waXBlUmVnaXN0cnksbnVsbCxuLnNjaGVtYXMsbi5jb25zdHMsbnVsbCk7bi5xdWVyaWVzIT09bnVsbCYmKG4ucXVlcmllcy50ZW1wbGF0ZShuLGUpLGwucXVlcmllcz1uLnF1ZXJpZXMuZW1iZWRkZWRUVmlldyhlKSl9YSYmKGUuZmxhZ3N8PWEpLG9yKGUsITEpO2xldCBjPWJiKG4sdCxlLHIpO25zKCkmJm5kKG4sdCxjLGUpLGRyKGMsdCk7bGV0IHU9Wm0oYyx0LGMsZSk7dFtyK0hdPXUsWWwodCx1KSxYQyh1LGUsdCl9ZnVuY3Rpb24gQ2IoZSx0LG4scixvLGkscyxhLGMsdSxsKXtsZXQgZD1uK0gscDtyZXR1cm4gdC5maXJzdENyZWF0ZVBhc3M/KHA9eXIodCxkLDQsc3x8bnVsbCxhfHxudWxsKSxLaSgpJiZ0eSh0LGUscCx3ZSh0LmNvbnN0cyx1KSxvZCksRmcodCxwKSk6cD10LmRhdGFbZF0sQ3kocCxlLHQsbixyLG8saSxjKSxucihwKSYmV3ModCxlLHApLHUhPW51bGwmJkRvKGUscCxsKSxwfWZ1bmN0aW9uIHByKGUsdCxuLHIsbyxpLHMsYSxjLHUsbCl7bGV0IGQ9bitILHA7aWYodC5maXJzdENyZWF0ZVBhc3Mpe2lmKHA9eXIodCxkLDQsc3x8bnVsbCxhfHxudWxsKSx1IT1udWxsKXtsZXQgZj13ZSh0LmNvbnN0cyx1KTtwLmxvY2FsTmFtZXM9W107Zm9yKGxldCBnPTA7ZzxmLmxlbmd0aDtnKz0yKXAubG9jYWxOYW1lcy5wdXNoKGZbZ10sLTEpfX1lbHNlIHA9dC5kYXRhW2RdO3JldHVybiBDeShwLGUsdCxuLHIsbyxpLGMpLHUhPW51bGwmJkRvKGUscCxsKSxwfWZ1bmN0aW9uIGJ5KGUsdCxuLHIsbyxpLHMsYSl7bGV0IGM9RSgpLHU9QigpLGw9d2UodS5jb25zdHMsaSk7cmV0dXJuIENiKGMsdSxlLHQsbixyLG8sbCx2b2lkIDAscyxhKSxieX1mdW5jdGlvbiBUeShlLHQsbixyLG8saSxzLGEpe2xldCBjPUUoKSx1PUIoKSxsPXdlKHUuY29uc3RzLGkpO3JldHVybiBwcihjLHUsZSx0LG4scixvLGwsdm9pZCAwLHMsYSksVHl9ZnVuY3Rpb24gVGIoZSx0LG4scil7cmV0dXJuIG5vKCEwKSx0W1BdLmNyZWF0ZUNvbW1lbnQoIiIpfWZ1bmN0aW9uIE15KGUpe21kPWV9ZnVuY3Rpb24gTW8oZSl7cmV0dXJuISFlJiZ0eXBlb2YgZS50aGVuPT0iZnVuY3Rpb24ifWZ1bmN0aW9uIFhzKGUpe3JldHVybiEhZSYmdHlwZW9mIGUuc3Vic2NyaWJlPT0iZnVuY3Rpb24ifWZ1bmN0aW9uIF9iKGUpe3JldHVybiBLbihbe3Byb3ZpZGU6eWQsbXVsdGk6ITAsdXNlVmFsdWU6ZX1dKX1mdW5jdGlvbiBOeSgpe1NhKCgpPT57bGV0IGU9IiI7dGhyb3cgbmV3IHYoNjAwLGUpfSl9ZnVuY3Rpb24gQXkoZSl7cmV0dXJuIGUuaXNCb3VuZFRvTW9kdWxlfWZ1bmN0aW9uIGFvKGUsdCl7bGV0IG49ZS5pbmRleE9mKHQpO24+LTEmJmUuc3BsaWNlKG4sMSl9ZnVuY3Rpb24geHkoZSx0KXtsZXQgbj1FKCkscj1ldCgpO2lmKHBlKG4scix0KSl7bGV0IG89QigpLGk9c3IoKTtpZihxcyhpLG8sbixlLHQpKW10KGkpJiZMbShuLGkuaW5kZXgpO2Vsc2V7bGV0IGE9U2UoaSxuKTtqbShuW1BdLGEsbnVsbCxpLnZhbHVlLGUsdCxudWxsKX19cmV0dXJuIHh5fWZ1bmN0aW9uIFJ5KGUsdCxuLHIpe2xldCBvPUUoKSxpPWV0KCk7aWYocGUobyxpLHQpKXtsZXQgcz1CKCksYT1zcigpO1F3KGEsbyxlLHQsbixyKX1yZXR1cm4gUnl9ZnVuY3Rpb24gU2IoKXtyZXR1cm4gRSgpW2NlXVtxXX1mdW5jdGlvbiBIdShlLHQsbixyLG8pe3JldHVybiBlPT09biYmT2JqZWN0LmlzKHQscik/MTpPYmplY3QuaXMobyhlLHQpLG8obixyKSk/LTE6MH1mdW5jdGlvbiBOYihlLHQsbil7bGV0IHIsbyxpPTAscz1lLmxlbmd0aC0xLGE9dm9pZCAwO2lmKEFycmF5LmlzQXJyYXkodCkpe2xldCBjPXQubGVuZ3RoLTE7Zm9yKDtpPD1zJiZpPD1jOyl7bGV0IHU9ZS5hdChpKSxsPXRbaV0sZD1IdShpLHUsaSxsLG4pO2lmKGQhPT0wKXtkPDAmJmUudXBkYXRlVmFsdWUoaSxsKSxpKys7Y29udGludWV9bGV0IHA9ZS5hdChzKSxmPXRbY10sZz1IdShzLHAsYyxmLG4pO2lmKGchPT0wKXtnPDAmJmUudXBkYXRlVmFsdWUocyxmKSxzLS0sYy0tO2NvbnRpbnVlfWxldCBJPW4oaSx1KSxEPW4ocyxwKSxtPW4oaSxsKTtpZihPYmplY3QuaXMobSxEKSl7bGV0IEY9bihjLGYpO09iamVjdC5pcyhGLEkpPyhlLnN3YXAoaSxzKSxlLnVwZGF0ZVZhbHVlKHMsZiksYy0tLHMtLSk6ZS5tb3ZlKHMsaSksZS51cGRhdGVWYWx1ZShpLGwpLGkrKztjb250aW51ZX1pZihyPz89bmV3IHhzLG8/Pz1iZyhlLGkscyxuKSx3bChlLHIsaSxtKSllLnVwZGF0ZVZhbHVlKGksbCksaSsrLHMrKztlbHNlIGlmKG8uaGFzKG0pKXIuc2V0KEksZS5kZXRhY2goaSkpLHMtLTtlbHNle2xldCBGPWUuY3JlYXRlKGksdFtpXSk7ZS5hdHRhY2goaSxGKSxpKysscysrfX1mb3IoO2k8PWM7KUNnKGUscixuLGksdFtpXSksaSsrfWVsc2UgaWYodCE9bnVsbCl7bGV0IGM9dFtTeW1ib2wuaXRlcmF0b3JdKCksdT1jLm5leHQoKTtmb3IoOyF1LmRvbmUmJmk8PXM7KXtsZXQgbD1lLmF0KGkpLGQ9dS52YWx1ZSxwPUh1KGksbCxpLGQsbik7aWYocCE9PTApcDwwJiZlLnVwZGF0ZVZhbHVlKGksZCksaSsrLHU9Yy5uZXh0KCk7ZWxzZXtyPz89bmV3IHhzLG8/Pz1iZyhlLGkscyxuKTtsZXQgZj1uKGksZCk7aWYod2woZSxyLGksZikpZS51cGRhdGVWYWx1ZShpLGQpLGkrKyxzKyssdT1jLm5leHQoKTtlbHNlIGlmKCFvLmhhcyhmKSllLmF0dGFjaChpLGUuY3JlYXRlKGksZCkpLGkrKyxzKyssdT1jLm5leHQoKTtlbHNle2xldCBnPW4oaSxsKTtyLnNldChnLGUuZGV0YWNoKGkpKSxzLS19fX1mb3IoOyF1LmRvbmU7KUNnKGUscixuLGUubGVuZ3RoLHUudmFsdWUpLHU9Yy5uZXh0KCl9Zm9yKDtpPD1zOyllLmRlc3Ryb3koZS5kZXRhY2gocy0tKSk7cj8uZm9yRWFjaChjPT57ZS5kZXN0cm95KGMpfSl9ZnVuY3Rpb24gd2woZSx0LG4scil7cmV0dXJuIHQhPT12b2lkIDAmJnQuaGFzKHIpPyhlLmF0dGFjaChuLHQuZ2V0KHIpKSx0LmRlbGV0ZShyKSwhMCk6ITF9ZnVuY3Rpb24gQ2coZSx0LG4scixvKXtpZih3bChlLHQscixuKHIsbykpKWUudXBkYXRlVmFsdWUocixvKTtlbHNle2xldCBpPWUuY3JlYXRlKHIsbyk7ZS5hdHRhY2gocixpKX19ZnVuY3Rpb24gYmcoZSx0LG4scil7bGV0IG89bmV3IFNldDtmb3IobGV0IGk9dDtpPD1uO2krKylvLmFkZChyKGksZS5hdChpKSkpO3JldHVybiBvfWZ1bmN0aW9uIEFiKGUsdCxuLHIsbyxpLHMsYSl7anQoIk5nQ29udHJvbEZsb3ciKTtsZXQgYz1FKCksdT1CKCksbD13ZSh1LmNvbnN0cyxpKTtyZXR1cm4gcHIoYyx1LGUsdCxuLHIsbyxsLDI1NixzLGEpLERkfWZ1bmN0aW9uIERkKGUsdCxuLHIsbyxpLHMsYSl7anQoIk5nQ29udHJvbEZsb3ciKTtsZXQgYz1FKCksdT1CKCksbD13ZSh1LmNvbnN0cyxpKTtyZXR1cm4gcHIoYyx1LGUsdCxuLHIsbyxsLDUxMixzLGEpLERkfWZ1bmN0aW9uIHhiKGUsdCl7anQoIk5nQ29udHJvbEZsb3ciKTtsZXQgbj1FKCkscj1ldCgpLG89bltyXSE9PXJlP25bcl06LTEsaT1vIT09LTE/UnMobixIK28pOnZvaWQgMCxzPTA7aWYocGUobixyLGUpKXtsZXQgYT1NKG51bGwpO3RyeXtpZihpIT09dm9pZCAwJiZRbShpLHMpLGUhPT0tMSl7bGV0IGM9SCtlLHU9UnMobixjKSxsPV9sKG5bd10sYyksZD1KbSh1LGwsbikscD1FbyhuLGwsdCx7ZGVoeWRyYXRlZFZpZXc6ZH0pO0lvKHUscCxzLGZyKGwsZCkpfX1maW5hbGx5e00oYSl9fWVsc2UgaWYoaSE9PXZvaWQgMCl7bGV0IGE9WW0oaSxzKTthIT09dm9pZCAwJiYoYVtxXT10KX19ZnVuY3Rpb24gUmIoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gT2IoZSx0KXtyZXR1cm4gdH1mdW5jdGlvbiBGYihlLHQsbixyLG8saSxzLGEsYyx1LGwsZCxwKXtqdCgiTmdDb250cm9sRmxvdyIpO2xldCBmPUUoKSxnPUIoKSxJPWMhPT12b2lkIDAsRD1FKCksbT1hP3MuYmluZChEW2NlXVtxXSk6cyxGPW5ldyBibChJLG0pO0RbSCtlXT1GLHByKGYsZyxlKzEsdCxuLHIsbyx3ZShnLmNvbnN0cyxpKSwyNTYpLEkmJnByKGYsZyxlKzIsYyx1LGwsZCx3ZShnLmNvbnN0cyxwKSw1MTIpfWZ1bmN0aW9uIGtiKGUpe2xldCB0PU0obnVsbCksbj1qZSgpO3RyeXtsZXQgcj1FKCksbz1yW3ddLGk9cltuXSxzPW4rMSxhPVJzKHIscyk7aWYoaS5saXZlQ29sbGVjdGlvbj09PXZvaWQgMCl7bGV0IHU9X2wobyxzKTtpLmxpdmVDb2xsZWN0aW9uPW5ldyBUbChhLHIsdSl9ZWxzZSBpLmxpdmVDb2xsZWN0aW9uLnJlc2V0KCk7bGV0IGM9aS5saXZlQ29sbGVjdGlvbjtpZihOYihjLGUsaS50cmFja0J5Rm4pLGMudXBkYXRlSW5kZXhlcygpLGkuaGFzRW1wdHlCbG9jayl7bGV0IHU9ZXQoKSxsPWMubGVuZ3RoPT09MDtpZihwZShyLHUsbCkpe2xldCBkPW4rMixwPVJzKHIsZCk7aWYobCl7bGV0IGY9X2wobyxkKSxnPUptKHAsZixyKSxJPUVvKHIsZix2b2lkIDAse2RlaHlkcmF0ZWRWaWV3Omd9KTtJbyhwLEksMCxmcihmLGcpKX1lbHNlIG8uZmlyc3RVcGRhdGVQYXNzJiZEQyhwKSxRbShwLDApfX19ZmluYWxseXtNKHQpfX1mdW5jdGlvbiBScyhlLHQpe3JldHVybiBlW3RdfWZ1bmN0aW9uIFBiKGUsdCl7aWYoZS5sZW5ndGg8PVopcmV0dXJuO2xldCBuPVordCxyPWVbbl0sbz1yP3JbcG5dOnZvaWQgMDtpZihyJiZvJiZvLmRldGFjaGVkTGVhdmVBbmltYXRpb25GbnMmJm8uZGV0YWNoZWRMZWF2ZUFuaW1hdGlvbkZucy5sZW5ndGg+MCl7bGV0IGk9cltodF07TncoaSxvKSxJbi5kZWxldGUociksby5kZXRhY2hlZExlYXZlQW5pbWF0aW9uRm5zPXZvaWQgMH19ZnVuY3Rpb24gTGIoZSx0KXtpZihlLmxlbmd0aDw9WilyZXR1cm47bGV0IG49Wit0LHI9ZVtuXSxvPXI/cltwbl06dm9pZCAwO28mJm8ubGVhdmUmJm8ubGVhdmUuc2l6ZT4wJiYoby5kZXRhY2hlZExlYXZlQW5pbWF0aW9uRm5zPVtdKX1mdW5jdGlvbiBqYihlLHQpe3JldHVybiBmbyhlLHQpfWZ1bmN0aW9uIEJiKGUsdCl7cmV0dXJuIFltKGUsdCl9ZnVuY3Rpb24gX2woZSx0KXtyZXR1cm4gSnIoZSx0KX1mdW5jdGlvbiBPeShlLHQsbil7bGV0IHI9RSgpLG89ZXQoKTtpZihwZShyLG8sdCkpe2xldCBpPUIoKSxzPXNyKCk7a20ocyxyLGUsdCxyW1BdLG4pfXJldHVybiBPeX1mdW5jdGlvbiBNbChlLHQsbixyLG8pe3FzKHQsZSxuLG8/ImNsYXNzIjoic3R5bGUiLHIpfWZ1bmN0aW9uIEVkKGUsdCxuLHIpe2xldCBvPUUoKSxpPW9bd10scz1lK0gsYT1pLmZpcnN0Q3JlYXRlUGFzcz91ZChzLG8sMix0LG9kLEtpKCksbixyKTppLmRhdGFbc107aWYoaWQoYSxvLGUsdCxQeSksbnIoYSkpe2xldCBjPW9bd107V3MoYyxvLGEpLEJsKGMsYSxvKX1yZXR1cm4gciE9bnVsbCYmRG8obyxhKSxFZH1mdW5jdGlvbiBJZCgpe2xldCBlPUIoKSx0PUooKSxuPXNkKHQpO3JldHVybiBlLmZpcnN0Q3JlYXRlUGFzcyYmbGQoZSxuKSxFdShuKSYmSXUoKSx2dSgpLG4uY2xhc3Nlc1dpdGhvdXRIb3N0IT1udWxsJiZYRShuKSYmTWwoZSxuLEUoKSxuLmNsYXNzZXNXaXRob3V0SG9zdCwhMCksbi5zdHlsZXNXaXRob3V0SG9zdCE9bnVsbCYmZUkobikmJk1sKGUsbixFKCksbi5zdHlsZXNXaXRob3V0SG9zdCwhMSksSWR9ZnVuY3Rpb24gRnkoZSx0LG4scil7cmV0dXJuIEVkKGUsdCxuLHIpLElkKCksRnl9ZnVuY3Rpb24gd2QoZSx0LG4scil7bGV0IG89RSgpLGk9b1t3XSxzPWUrSCxhPWkuZmlyc3RDcmVhdGVQYXNzP0ZDKHMsaSwyLHQsbixyKTppLmRhdGFbc107cmV0dXJuIGlkKGEsbyxlLHQsUHkpLHIhPW51bGwmJkRvKG8sYSksd2R9ZnVuY3Rpb24gQ2QoKXtsZXQgZT1KKCksdD1zZChlKTtyZXR1cm4gRXUodCkmJkl1KCksdnUoKSxDZH1mdW5jdGlvbiBreShlLHQsbixyKXtyZXR1cm4gd2QoZSx0LG4sciksQ2QoKSxreX1mdW5jdGlvbiBiZChlLHQsbil7bGV0IHI9RSgpLG89clt3XSxpPWUrSCxzPW8uZmlyc3RDcmVhdGVQYXNzP3VkKGksciw4LCJuZy1jb250YWluZXIiLG9kLEtpKCksdCxuKTpvLmRhdGFbaV07aWYoaWQocyxyLGUsIm5nLWNvbnRhaW5lciIsVmIpLG5yKHMpKXtsZXQgYT1yW3ddO1dzKGEscixzKSxCbChhLHMscil9cmV0dXJuIG4hPW51bGwmJkRvKHIscyksYmR9ZnVuY3Rpb24gVGQoKXtsZXQgZT1CKCksdD1KKCksbj1zZCh0KTtyZXR1cm4gZS5maXJzdENyZWF0ZVBhc3MmJmxkKGUsbiksVGR9ZnVuY3Rpb24gTHkoZSx0LG4pe3JldHVybiBiZChlLHQsbiksVGQoKSxMeX1mdW5jdGlvbiBIYigpe3JldHVybiBFKCl9ZnVuY3Rpb24gankoZSx0LG4pe2xldCByPUUoKSxvPWV0KCk7aWYocGUocixvLHQpKXtsZXQgaT1CKCkscz1zcigpO1BtKHMscixlLHQscltQXSxuKX1yZXR1cm4ganl9ZnVuY3Rpb24gVWIoZSl7bGV0IHQ9TWF0aC5mbG9vcihNYXRoLmFicyhlKSksbj1lLnRvU3RyaW5nKCkucmVwbGFjZSgvXlteLl0qXC4/LywiIikubGVuZ3RoO3JldHVybiB0PT09MSYmbj09PTA/MTo1fWZ1bmN0aW9uIGVhKGUpe2xldCB0PXpiKGUpLG49VGcodCk7aWYobilyZXR1cm4gbjtsZXQgcj10LnNwbGl0KCItIilbMF07aWYobj1UZyhyKSxuKXJldHVybiBuO2lmKHI9PT0iZW4iKXJldHVybiAkYjt0aHJvdyBuZXcgdig3MDEsITEpfWZ1bmN0aW9uIFRnKGUpe3JldHVybiBlIGluIFV1fHwoVXVbZV09bmUubmcmJm5lLm5nLmNvbW1vbiYmbmUubmcuY29tbW9uLmxvY2FsZXMmJm5lLm5nLmNvbW1vbi5sb2NhbGVzW2VdKSxVdVtlXX1mdW5jdGlvbiB6YihlKXtyZXR1cm4gZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywiLSIpfWZ1bmN0aW9uIEJ5KGUpe3R5cGVvZiBlPT0ic3RyaW5nIiYmKEdiPWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIi0iKSl9ZnVuY3Rpb24gVnkoZSx0LG4pe2xldCByPUUoKSxvPUIoKSxpPUooKTtyZXR1cm4gVXkobyxyLHJbUF0saSxlLHQsbiksVnl9ZnVuY3Rpb24gSHkoZSx0LG4pe2xldCByPUUoKSxvPUIoKSxpPUooKTtyZXR1cm4oaS50eXBlJjN8fG4pJiZveShpLG8scixuLHJbUF0sZSx0LGhzKGkscix0KSksSHl9ZnVuY3Rpb24gVXkoZSx0LG4scixvLGkscyl7bGV0IGE9ITAsYz1udWxsO2lmKChyLnR5cGUmM3x8cykmJihjPz89aHMocix0LGkpLG95KHIsZSx0LHMsbixvLGksYykmJihhPSExKSksYSl7bGV0IHU9ci5vdXRwdXRzPy5bb10sbD1yLmhvc3REaXJlY3RpdmVPdXRwdXRzPy5bb107aWYobCYmbC5sZW5ndGgpZm9yKGxldCBkPTA7ZDxsLmxlbmd0aDtkKz0yKXtsZXQgcD1sW2RdLGY9bFtkKzFdO2M/Pz1ocyhyLHQsaSkseWcocix0LHAsZixvLGMpfWlmKHUmJnUubGVuZ3RoKWZvcihsZXQgZCBvZiB1KWM/Pz1ocyhyLHQsaSkseWcocix0LGQsbyxvLGMpfX1mdW5jdGlvbiBXYihlPTEpe3JldHVybiBWaChlKX1mdW5jdGlvbiBxYihlLHQpe2xldCBuPW51bGwscj1jdyhlKTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7bGV0IGk9dFtvXTtpZihpPT09IioiKXtuPW87Y29udGludWV9aWYocj09PW51bGw/RW0oZSxpLCEwKTpkdyhyLGkpKXJldHVybiBvfXJldHVybiBufWZ1bmN0aW9uIFpiKGUpe2xldCB0PUUoKVtjZV1bZmVdO2lmKCF0LnByb2plY3Rpb24pe2xldCBuPWU/ZS5sZW5ndGg6MSxyPXQucHJvamVjdGlvbj1maChuLG51bGwpLG89ci5zbGljZSgpLGk9dC5jaGlsZDtmb3IoO2khPT1udWxsOyl7aWYoaS50eXBlIT09MTI4KXtsZXQgcz1lP3FiKGksZSk6MDtzIT09bnVsbCYmKG9bc10/b1tzXS5wcm9qZWN0aW9uTmV4dD1pOnJbc109aSxvW3NdPWkpfWk9aS5uZXh0fX19ZnVuY3Rpb24gWWIoZSx0PTAsbixyLG8saSl7bGV0IHM9RSgpLGE9QigpLGM9cj9lKzE6bnVsbDtjIT09bnVsbCYmcHIocyxhLGMscixvLGksbnVsbCxuKTtsZXQgdT15cihhLEgrZSwxNixudWxsLG58fG51bGwpO3UucHJvamVjdGlvbj09PW51bGwmJih1LnByb2plY3Rpb249dCksYnUoKTtsZXQgZD0hc1t1bl18fER1KCk7c1tjZV1bZmVdLnByb2plY3Rpb25bdS5wcm9qZWN0aW9uXT09PW51bGwmJmMhPT1udWxsP1FiKHMsYSxjKTpkJiYhanModSkmJlZ3KGEscyx1KX1mdW5jdGlvbiBRYihlLHQsbil7bGV0IHI9SCtuLG89dC5kYXRhW3JdLGk9ZVtyXSxzPWJzKGksby50Vmlldy5zc3JJZCksYT1FbyhlLG8sdm9pZCAwLHtkZWh5ZHJhdGVkVmlldzpzfSk7SW8oaSxhLDAsZnIobyxzKSl9ZnVuY3Rpb24gS2IoZSx0LG4scil7ZnkoZSx0LG4scil9ZnVuY3Rpb24gSmIoZSx0LG4pe2R5KGUsdCxuKX1mdW5jdGlvbiBYYihlKXtsZXQgdD1FKCksbj1CKCkscj1YaSgpO3RvKHIrMSk7bGV0IG89cGQobixyKTtpZihlLmRpcnR5JiZJaCh0KT09PSgoby5tZXRhZGF0YS5mbGFncyYyKT09PTIpKXtpZihvLm1hdGNoZXM9PT1udWxsKWUucmVzZXQoW10pO2Vsc2V7bGV0IGk9aHkodCxyKTtlLnJlc2V0KGksV2cpLGUubm90aWZ5T25DaGFuZ2VzKCl9cmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gZVQoKXtyZXR1cm4gZmQoRSgpLFhpKCkpfWZ1bmN0aW9uIHRUKGUsdCxuLHIsbyl7bXkodCxmeShlLG4scixvKSl9ZnVuY3Rpb24gblQoZSx0LG4scil7bXkoZSxkeSh0LG4scikpfWZ1bmN0aW9uIHJUKGU9MSl7dG8oWGkoKStlKX1mdW5jdGlvbiBvVChlKXtsZXQgdD14aCgpO3JldHVybiBaaSh0LEgrZSl9ZnVuY3Rpb24gdXMoZSx0KXtyZXR1cm4gZTw8MTd8dDw8Mn1mdW5jdGlvbiBibihlKXtyZXR1cm4gZT4+MTcmMzI3Njd9ZnVuY3Rpb24gaVQoZSl7cmV0dXJuKGUmMik9PTJ9ZnVuY3Rpb24gc1QoZSx0KXtyZXR1cm4gZSYxMzEwNzF8dDw8MTd9ZnVuY3Rpb24gU2woZSl7cmV0dXJuIGV8Mn1mdW5jdGlvbiBocihlKXtyZXR1cm4oZSYxMzEwNjgpPj4yfWZ1bmN0aW9uICR1KGUsdCl7cmV0dXJuIGUmLTEzMTA2OXx0PDwyfWZ1bmN0aW9uIGFUKGUpe3JldHVybihlJjEpPT09MX1mdW5jdGlvbiBObChlKXtyZXR1cm4gZXwxfWZ1bmN0aW9uIGNUKGUsdCxuLHIsbyxpKXtsZXQgcz1pP3QuY2xhc3NCaW5kaW5nczp0LnN0eWxlQmluZGluZ3MsYT1ibihzKSxjPWhyKHMpO2Vbcl09bjtsZXQgdT0hMSxsO2lmKEFycmF5LmlzQXJyYXkobikpe2xldCBkPW47bD1kWzFdLChsPT09bnVsbHx8UW4oZCxsKT4wKSYmKHU9ITApfWVsc2UgbD1uO2lmKG8paWYoYyE9PTApe2xldCBwPWJuKGVbYSsxXSk7ZVtyKzFdPXVzKHAsYSkscCE9PTAmJihlW3ArMV09JHUoZVtwKzFdLHIpKSxlW2ErMV09c1QoZVthKzFdLHIpfWVsc2UgZVtyKzFdPXVzKGEsMCksYSE9PTAmJihlW2ErMV09JHUoZVthKzFdLHIpKSxhPXI7ZWxzZSBlW3IrMV09dXMoYywwKSxhPT09MD9hPXI6ZVtjKzFdPSR1KGVbYysxXSxyKSxjPXI7dSYmKGVbcisxXT1TbChlW3IrMV0pKSxfZyhlLGwsciwhMCksX2coZSxsLHIsITEpLHVUKHQsbCxlLHIsaSkscz11cyhhLGMpLGk/dC5jbGFzc0JpbmRpbmdzPXM6dC5zdHlsZUJpbmRpbmdzPXN9ZnVuY3Rpb24gdVQoZSx0LG4scixvKXtsZXQgaT1vP2UucmVzaWR1YWxDbGFzc2VzOmUucmVzaWR1YWxTdHlsZXM7aSE9bnVsbCYmdHlwZW9mIHQ9PSJzdHJpbmciJiZRbihpLHQpPj0wJiYobltyKzFdPU5sKG5bcisxXSkpfWZ1bmN0aW9uIF9nKGUsdCxuLHIpe2xldCBvPWVbbisxXSxpPXQ9PT1udWxsLHM9cj9ibihvKTpocihvKSxhPSExO2Zvcig7cyE9PTAmJihhPT09ITF8fGkpOyl7bGV0IGM9ZVtzXSx1PWVbcysxXTtsVChjLHQpJiYoYT0hMCxlW3MrMV09cj9ObCh1KTpTbCh1KSkscz1yP2JuKHUpOmhyKHUpfWEmJihlW24rMV09cj9TbChvKTpObChvKSl9ZnVuY3Rpb24gbFQoZSx0KXtyZXR1cm4gZT09PW51bGx8fHQ9PW51bGx8fChBcnJheS5pc0FycmF5KGUpP2VbMV06ZSk9PT10PyEwOkFycmF5LmlzQXJyYXkoZSkmJnR5cGVvZiB0PT0ic3RyaW5nIj9RbihlLHQpPj0wOiExfWZ1bmN0aW9uIGRUKGUpe3JldHVybiBlLnN1YnN0cmluZyhIZS5rZXksSGUua2V5RW5kKX1mdW5jdGlvbiBmVChlKXtyZXR1cm4gcFQoZSksJHkoZSx6eShlLDAsSGUudGV4dEVuZCkpfWZ1bmN0aW9uICR5KGUsdCl7bGV0IG49SGUudGV4dEVuZDtyZXR1cm4gbj09PXQ/LTE6KHQ9SGUua2V5RW5kPWhUKGUsSGUua2V5PXQsbiksenkoZSx0LG4pKX1mdW5jdGlvbiBwVChlKXtIZS5rZXk9MCxIZS5rZXlFbmQ9MCxIZS52YWx1ZT0wLEhlLnZhbHVlRW5kPTAsSGUudGV4dEVuZD1lLmxlbmd0aH1mdW5jdGlvbiB6eShlLHQsbil7Zm9yKDt0PG4mJmUuY2hhckNvZGVBdCh0KTw9MzI7KXQrKztyZXR1cm4gdH1mdW5jdGlvbiBoVChlLHQsbil7Zm9yKDt0PG4mJmUuY2hhckNvZGVBdCh0KT4zMjspdCsrO3JldHVybiB0fWZ1bmN0aW9uIEd5KGUsdCxuKXtyZXR1cm4gcXkoZSx0LG4sITEpLEd5fWZ1bmN0aW9uIFd5KGUsdCl7cmV0dXJuIHF5KGUsdCxudWxsLCEwKSxXeX1mdW5jdGlvbiBnVChlKXt5VChDVCxtVCxlLCEwKX1mdW5jdGlvbiBtVChlLHQpe2ZvcihsZXQgbj1mVCh0KTtuPj0wO249JHkodCxuKSl6aShlLGRUKHQpLCEwKX1mdW5jdGlvbiBxeShlLHQsbixyKXtsZXQgbz1FKCksaT1CKCkscz1lbygyKTtpZihpLmZpcnN0VXBkYXRlUGFzcyYmWXkoaSxlLHMsciksdCE9PXJlJiZwZShvLHMsdCkpe2xldCBhPWkuZGF0YVtqZSgpXTtReShpLGEsbyxvW1BdLGUsb1tzKzFdPVRUKHQsbikscixzKX19ZnVuY3Rpb24geVQoZSx0LG4scil7bGV0IG89QigpLGk9ZW8oMik7by5maXJzdFVwZGF0ZVBhc3MmJll5KG8sbnVsbCxpLHIpO2xldCBzPUUoKTtpZihuIT09cmUmJnBlKHMsaSxuKSl7bGV0IGE9by5kYXRhW2plKCldO2lmKEt5KGEscikmJiFaeShvLGkpKXtsZXQgYz1yP2EuY2xhc3Nlc1dpdGhvdXRIb3N0OmEuc3R5bGVzV2l0aG91dEhvc3Q7YyE9PW51bGwmJihuPUJpKGMsbnx8IiIpKSxNbChvLGEscyxuLHIpfWVsc2UgYlQobyxhLHMsc1tQXSxzW2krMV0sc1tpKzFdPXdUKGUsdCxuKSxyLGkpfX1mdW5jdGlvbiBaeShlLHQpe3JldHVybiB0Pj1lLmV4cGFuZG9TdGFydEluZGV4fWZ1bmN0aW9uIFl5KGUsdCxuLHIpe2xldCBvPWUuZGF0YTtpZihvW24rMV09PT1udWxsKXtsZXQgaT1vW2plKCldLHM9WnkoZSxuKTtLeShpLHIpJiZ0PT09bnVsbCYmIXMmJih0PSExKSx0PXZUKG8saSx0LHIpLGNUKG8saSx0LG4scyxyKX19ZnVuY3Rpb24gdlQoZSx0LG4scil7bGV0IG89UGgoZSksaT1yP3QucmVzaWR1YWxDbGFzc2VzOnQucmVzaWR1YWxTdHlsZXM7aWYobz09PW51bGwpKHI/dC5jbGFzc0JpbmRpbmdzOnQuc3R5bGVCaW5kaW5ncyk9PT0wJiYobj16dShudWxsLGUsdCxuLHIpLG49Z28obix0LmF0dHJzLHIpLGk9bnVsbCk7ZWxzZXtsZXQgcz10LmRpcmVjdGl2ZVN0eWxpbmdMYXN0O2lmKHM9PT0tMXx8ZVtzXSE9PW8paWYobj16dShvLGUsdCxuLHIpLGk9PT1udWxsKXtsZXQgYz1EVChlLHQscik7YyE9PXZvaWQgMCYmQXJyYXkuaXNBcnJheShjKSYmKGM9enUobnVsbCxlLHQsY1sxXSxyKSxjPWdvKGMsdC5hdHRycyxyKSxFVChlLHQscixjKSl9ZWxzZSBpPUlUKGUsdCxyKX1yZXR1cm4gaSE9PXZvaWQgMCYmKHI/dC5yZXNpZHVhbENsYXNzZXM9aTp0LnJlc2lkdWFsU3R5bGVzPWkpLG59ZnVuY3Rpb24gRFQoZSx0LG4pe2xldCByPW4/dC5jbGFzc0JpbmRpbmdzOnQuc3R5bGVCaW5kaW5ncztpZihocihyKSE9PTApcmV0dXJuIGVbYm4ocildfWZ1bmN0aW9uIEVUKGUsdCxuLHIpe2xldCBvPW4/dC5jbGFzc0JpbmRpbmdzOnQuc3R5bGVCaW5kaW5ncztlW2JuKG8pXT1yfWZ1bmN0aW9uIElUKGUsdCxuKXtsZXQgcixvPXQuZGlyZWN0aXZlRW5kO2ZvcihsZXQgaT0xK3QuZGlyZWN0aXZlU3R5bGluZ0xhc3Q7aTxvO2krKyl7bGV0IHM9ZVtpXS5ob3N0QXR0cnM7cj1nbyhyLHMsbil9cmV0dXJuIGdvKHIsdC5hdHRycyxuKX1mdW5jdGlvbiB6dShlLHQsbixyLG8pe2xldCBpPW51bGwscz1uLmRpcmVjdGl2ZUVuZCxhPW4uZGlyZWN0aXZlU3R5bGluZ0xhc3Q7Zm9yKGE9PT0tMT9hPW4uZGlyZWN0aXZlU3RhcnQ6YSsrO2E8cyYmKGk9dFthXSxyPWdvKHIsaS5ob3N0QXR0cnMsbyksaSE9PWUpOylhKys7cmV0dXJuIGUhPT1udWxsJiYobi5kaXJlY3RpdmVTdHlsaW5nTGFzdD1hKSxyfWZ1bmN0aW9uIGdvKGUsdCxuKXtsZXQgcj1uPzE6MixvPS0xO2lmKHQhPT1udWxsKWZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtsZXQgcz10W2ldO3R5cGVvZiBzPT0ibnVtYmVyIj9vPXM6bz09PXImJihBcnJheS5pc0FycmF5KGUpfHwoZT1lPT09dm9pZCAwP1tdOlsiIixlXSksemkoZSxzLG4/ITA6dFsrK2ldKSl9cmV0dXJuIGU9PT12b2lkIDA/bnVsbDplfWZ1bmN0aW9uIHdUKGUsdCxuKXtpZihuPT1udWxsfHxuPT09IiIpcmV0dXJuIGFlO2xldCByPVtdLG89Q2Uobik7aWYoQXJyYXkuaXNBcnJheShvKSlmb3IobGV0IGk9MDtpPG8ubGVuZ3RoO2krKyllKHIsb1tpXSwhMCk7ZWxzZSBpZih0eXBlb2Ygbz09Im9iamVjdCIpZm9yKGxldCBpIGluIG8pby5oYXNPd25Qcm9wZXJ0eShpKSYmZShyLGksb1tpXSk7ZWxzZSB0eXBlb2Ygbz09InN0cmluZyImJnQocixvKTtyZXR1cm4gcn1mdW5jdGlvbiBDVChlLHQsbil7bGV0IHI9U3RyaW5nKHQpO3IhPT0iIiYmIXIuaW5jbHVkZXMoIiAiKSYmemkoZSxyLG4pfWZ1bmN0aW9uIGJUKGUsdCxuLHIsbyxpLHMsYSl7bz09PXJlJiYobz1hZSk7bGV0IGM9MCx1PTAsbD0wPG8ubGVuZ3RoP29bMF06bnVsbCxkPTA8aS5sZW5ndGg/aVswXTpudWxsO2Zvcig7bCE9PW51bGx8fGQhPT1udWxsOyl7bGV0IHA9YzxvLmxlbmd0aD9vW2MrMV06dm9pZCAwLGY9dTxpLmxlbmd0aD9pW3UrMV06dm9pZCAwLGc9bnVsbCxJO2w9PT1kPyhjKz0yLHUrPTIscCE9PWYmJihnPWQsST1mKSk6ZD09PW51bGx8fGwhPT1udWxsJiZsPGQ/KGMrPTIsZz1sKToodSs9MixnPWQsST1mKSxnIT09bnVsbCYmUXkoZSx0LG4scixnLEkscyxhKSxsPWM8by5sZW5ndGg/b1tjXTpudWxsLGQ9dTxpLmxlbmd0aD9pW3VdOm51bGx9fWZ1bmN0aW9uIFF5KGUsdCxuLHIsbyxpLHMsYSl7aWYoISh0LnR5cGUmMykpcmV0dXJuO2xldCBjPWUuZGF0YSx1PWNbYSsxXSxsPWFUKHUpP01nKGMsdCxuLG8saHIodSkscyk6dm9pZCAwO2lmKCFPcyhsKSl7T3MoaSl8fGlUKHUpJiYoaT1NZyhjLG51bGwsbixvLGEscykpO2xldCBkPWR1KGplKCksbik7VXcocixzLGQsbyxpKX19ZnVuY3Rpb24gTWcoZSx0LG4scixvLGkpe2xldCBzPXQ9PT1udWxsLGE7Zm9yKDtvPjA7KXtsZXQgYz1lW29dLHU9QXJyYXkuaXNBcnJheShjKSxsPXU/Y1sxXTpjLGQ9bD09PW51bGwscD1uW28rMV07cD09PXJlJiYocD1kP2FlOnZvaWQgMCk7bGV0IGY9ZD9HaShwLHIpOmw9PT1yP3A6dm9pZCAwO2lmKHUmJiFPcyhmKSYmKGY9R2koYyxyKSksT3MoZikmJihhPWYscykpcmV0dXJuIGE7bGV0IGc9ZVtvKzFdO289cz9ibihnKTpocihnKX1pZih0IT09bnVsbCl7bGV0IGM9aT90LnJlc2lkdWFsQ2xhc3Nlczp0LnJlc2lkdWFsU3R5bGVzO2MhPW51bGwmJihhPUdpKGMscikpfXJldHVybiBhfWZ1bmN0aW9uIE9zKGUpe3JldHVybiBlIT09dm9pZCAwfWZ1bmN0aW9uIFRUKGUsdCl7cmV0dXJuIGU9PW51bGx8fGU9PT0iInx8KHR5cGVvZiB0PT0ic3RyaW5nIj9lPWUrdDp0eXBlb2YgZT09Im9iamVjdCImJihlPWZ0KENlKGUpKSkpLGV9ZnVuY3Rpb24gS3koZSx0KXtyZXR1cm4oZS5mbGFncyYodD84OjE2KSkhPT0wfWZ1bmN0aW9uIF9UKGUsdD0iIil7bGV0IG49RSgpLHI9QigpLG89ZStILGk9ci5maXJzdENyZWF0ZVBhc3M/eXIocixvLDEsdCxudWxsKTpyLmRhdGFbb10scz1NVChyLG4saSx0LGUpO25bb109cyxucygpJiZuZChyLG4scyxpKSxvcihpLCExKX1mdW5jdGlvbiBKeShlLHQsbixyPSIiKXtyZXR1cm4gcGUoZSxldCgpLG4pP3QrRWUobikrcjpyZX1mdW5jdGlvbiBYeShlLHQsbixyLG8saT0iIil7bGV0IHM9X3UoKSxhPXBvKGUscyxuLG8pO3JldHVybiBlbygyKSxhP3QrRWUobikrcitFZShvKStpOnJlfWZ1bmN0aW9uIFNUKGUsdCxuLHIsbyxpLHMsYSxjLHU9IiIpe2xldCBsPV91KCksZD1MQyhlLGwsbixvLHMsYyk7cmV0dXJuIGVvKDQpLGQ/dCtFZShuKStyK0VlKG8pK2krRWUocykrYStFZShjKSt1OnJlfWZ1bmN0aW9uIGV2KGUpe3JldHVybiBfZCgiIixlKSxldn1mdW5jdGlvbiBfZChlLHQsbil7bGV0IHI9RSgpLG89SnkocixlLHQsbik7cmV0dXJuIG8hPT1yZSYmTWQocixqZSgpLG8pLF9kfWZ1bmN0aW9uIHR2KGUsdCxuLHIsbyl7bGV0IGk9RSgpLHM9WHkoaSxlLHQsbixyLG8pO3JldHVybiBzIT09cmUmJk1kKGksamUoKSxzKSx0dn1mdW5jdGlvbiBudihlLHQsbixyLG8saSxzLGEsYyl7bGV0IHU9RSgpLGw9U1QodSxlLHQsbixyLG8saSxzLGEsYyk7cmV0dXJuIGwhPT1yZSYmTWQodSxqZSgpLGwpLG52fWZ1bmN0aW9uIE1kKGUsdCxuKXtsZXQgcj1kdSh0LGUpO3FJKGVbUF0scixuKX1mdW5jdGlvbiBydihlLHQsbil7UnUodCkmJih0PXQoKSk7bGV0IHI9RSgpLG89ZXQoKTtpZihwZShyLG8sdCkpe2xldCBpPUIoKSxzPXNyKCk7a20ocyxyLGUsdCxyW1BdLG4pfXJldHVybiBydn1mdW5jdGlvbiBOVChlLHQpe2xldCBuPVJ1KGUpO3JldHVybiBuJiZlLnNldCh0KSxufWZ1bmN0aW9uIG92KGUsdCl7bGV0IG49RSgpLHI9QigpLG89SigpO3JldHVybiBVeShyLG4sbltQXSxvLGUsdCksb3Z9ZnVuY3Rpb24gQVQoZSl7cmV0dXJuIHBlKEUoKSxldCgpLGUpP0VlKGUpOnJlfWZ1bmN0aW9uIHhUKGUsdCxuPSIiKXtyZXR1cm4gSnkoRSgpLGUsdCxuKX1mdW5jdGlvbiBSVChlLHQsbixyLG89IiIpe3JldHVybiBYeShFKCksZSx0LG4scixvKX1mdW5jdGlvbiBPVChlLHQsbil7bGV0IHI9QigpO2lmKHIuZmlyc3RDcmVhdGVQYXNzKXtsZXQgbz1MZShlKTtBbChuLHIuZGF0YSxyLmJsdWVwcmludCxvLCEwKSxBbCh0LHIuZGF0YSxyLmJsdWVwcmludCxvLCExKX19ZnVuY3Rpb24gQWwoZSx0LG4scixvKXtpZihlPWVlKGUpLEFycmF5LmlzQXJyYXkoZSkpZm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspQWwoZVtpXSx0LG4scixvKTtlbHNle2xldCBpPUIoKSxzPUUoKSxhPUooKSxjPXNuKGUpP2U6ZWUoZS5wcm92aWRlKSx1PW91KGUpLGw9YS5wcm92aWRlckluZGV4ZXMmMTA0ODU3NSxkPWEuZGlyZWN0aXZlU3RhcnQscD1hLnByb3ZpZGVySW5kZXhlcz4+MjA7aWYoc24oZSl8fCFlLm11bHRpKXtsZXQgZj1uZXcgRW4odSxvLFUsbnVsbCksZz1XdShjLHQsbz9sOmwrcCxkKTtnPT09LTE/KFp1KERzKGEscyksaSxjKSxHdShpLGUsdC5sZW5ndGgpLHQucHVzaChjKSxhLmRpcmVjdGl2ZVN0YXJ0KyssYS5kaXJlY3RpdmVFbmQrKyxvJiYoYS5wcm92aWRlckluZGV4ZXMrPTEwNDg1NzYpLG4ucHVzaChmKSxzLnB1c2goZikpOihuW2ddPWYsc1tnXT1mKX1lbHNle2xldCBmPVd1KGMsdCxsK3AsZCksZz1XdShjLHQsbCxsK3ApLEk9Zj49MCYmbltmXSxEPWc+PTAmJm5bZ107aWYobyYmIUR8fCFvJiYhSSl7WnUoRHMoYSxzKSxpLGMpO2xldCBtPVBUKG8/a1Q6RlQsbi5sZW5ndGgsbyxyLHUsZSk7IW8mJkQmJihuW2ddLnByb3ZpZGVyRmFjdG9yeT1tKSxHdShpLGUsdC5sZW5ndGgsMCksdC5wdXNoKGMpLGEuZGlyZWN0aXZlU3RhcnQrKyxhLmRpcmVjdGl2ZUVuZCsrLG8mJihhLnByb3ZpZGVySW5kZXhlcys9MTA0ODU3Niksbi5wdXNoKG0pLHMucHVzaChtKX1lbHNle2xldCBtPWl2KG5bbz9nOmZdLHUsIW8mJnIpO0d1KGksZSxmPi0xP2Y6ZyxtKX0hbyYmciYmRCYmbltnXS5jb21wb25lbnRQcm92aWRlcnMrK319fWZ1bmN0aW9uIEd1KGUsdCxuLHIpe2xldCBvPXNuKHQpLGk9dmgodCk7aWYob3x8aSl7bGV0IGM9KGk/ZWUodC51c2VDbGFzcyk6dCkucHJvdG90eXBlLm5nT25EZXN0cm95O2lmKGMpe2xldCB1PWUuZGVzdHJveUhvb2tzfHwoZS5kZXN0cm95SG9va3M9W10pO2lmKCFvJiZ0Lm11bHRpKXtsZXQgbD11LmluZGV4T2Yobik7bD09PS0xP3UucHVzaChuLFtyLGNdKTp1W2wrMV0ucHVzaChyLGMpfWVsc2UgdS5wdXNoKG4sYyl9fX1mdW5jdGlvbiBpdihlLHQsbil7cmV0dXJuIG4mJmUuY29tcG9uZW50UHJvdmlkZXJzKyssZS5tdWx0aS5wdXNoKHQpLTF9ZnVuY3Rpb24gV3UoZSx0LG4scil7Zm9yKGxldCBvPW47bzxyO28rKylpZih0W29dPT09ZSlyZXR1cm4gbztyZXR1cm4tMX1mdW5jdGlvbiBGVChlLHQsbixyLG8pe3JldHVybiB4bCh0aGlzLm11bHRpLFtdKX1mdW5jdGlvbiBrVChlLHQsbixyLG8pe2xldCBpPXRoaXMubXVsdGkscztpZih0aGlzLnByb3ZpZGVyRmFjdG9yeSl7bGV0IGE9dGhpcy5wcm92aWRlckZhY3RvcnkuY29tcG9uZW50UHJvdmlkZXJzLGM9Y28ocixyW3ddLHRoaXMucHJvdmlkZXJGYWN0b3J5LmluZGV4LG8pO3M9Yy5zbGljZSgwLGEpLHhsKGkscyk7Zm9yKGxldCB1PWE7dTxjLmxlbmd0aDt1Kyspcy5wdXNoKGNbdV0pfWVsc2Ugcz1bXSx4bChpLHMpO3JldHVybiBzfWZ1bmN0aW9uIHhsKGUsdCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl07dC5wdXNoKHIoKSl9cmV0dXJuIHR9ZnVuY3Rpb24gUFQoZSx0LG4scixvLGkpe2xldCBzPW5ldyBFbihlLG4sVSxudWxsKTtyZXR1cm4gcy5tdWx0aT1bXSxzLmluZGV4PXQscy5jb21wb25lbnRQcm92aWRlcnM9MCxpdihzLG8sciYmIW4pLHN9ZnVuY3Rpb24gTFQoZSx0PVtdKXtyZXR1cm4gbj0+e24ucHJvdmlkZXJzUmVzb2x2ZXI9KHIsbyk9Pk9UKHIsbz9vKGUpOmUsdCl9fWZ1bmN0aW9uIGpUKGUsdCxuKXtsZXQgcj1tbigpK2Usbz1FKCk7cmV0dXJuIG9bcl09PT1yZT9LcyhvLHIsbj90LmNhbGwobik6dCgpKTprQyhvLHIpfWZ1bmN0aW9uIEJUKGUsdCxuLHIpe3JldHVybiBzdihFKCksbW4oKSxlLHQsbixyKX1mdW5jdGlvbiBWVChlLHQsbixyLG8pe3JldHVybiBhdihFKCksbW4oKSxlLHQsbixyLG8pfWZ1bmN0aW9uIEhUKGUsdCxuLHIsbyxpKXtyZXR1cm4gVVQoRSgpLG1uKCksZSx0LG4scixvLGkpfWZ1bmN0aW9uIFNkKGUsdCl7bGV0IG49ZVt0XTtyZXR1cm4gbj09PXJlP3ZvaWQgMDpufWZ1bmN0aW9uIHN2KGUsdCxuLHIsbyxpKXtsZXQgcz10K247cmV0dXJuIHBlKGUscyxvKT9LcyhlLHMrMSxpP3IuY2FsbChpLG8pOnIobykpOlNkKGUscysxKX1mdW5jdGlvbiBhdihlLHQsbixyLG8saSxzKXtsZXQgYT10K247cmV0dXJuIHBvKGUsYSxvLGkpP0tzKGUsYSsyLHM/ci5jYWxsKHMsbyxpKTpyKG8saSkpOlNkKGUsYSsyKX1mdW5jdGlvbiBVVChlLHQsbixyLG8saSxzLGEpe2xldCBjPXQrbjtyZXR1cm4gUEMoZSxjLG8saSxzKT9LcyhlLGMrMyxhP3IuY2FsbChhLG8saSxzKTpyKG8saSxzKSk6U2QoZSxjKzMpfWZ1bmN0aW9uICRUKGUsdCl7bGV0IG49QigpLHIsbz1lK0g7bi5maXJzdENyZWF0ZVBhc3M/KHI9elQodCxuLnBpcGVSZWdpc3RyeSksbi5kYXRhW29dPXIsci5vbkRlc3Ryb3kmJihuLmRlc3Ryb3lIb29rcz8/PVtdKS5wdXNoKG8sci5vbkRlc3Ryb3kpKTpyPW4uZGF0YVtvXTtsZXQgaT1yLmZhY3Rvcnl8fChyLmZhY3Rvcnk9TXQoci50eXBlLCEwKSkscyxhPWRlKFUpO3RyeXtsZXQgYz12cyghMSksdT1pKCk7cmV0dXJuIHZzKGMpLGZ1KG4sRSgpLG8sdSksdX1maW5hbGx5e2RlKGEpfX1mdW5jdGlvbiB6VChlLHQpe2lmKHQpZm9yKGxldCBuPXQubGVuZ3RoLTE7bj49MDtuLS0pe2xldCByPXRbbl07aWYoZT09PXIubmFtZSlyZXR1cm4gcn19ZnVuY3Rpb24gR1QoZSx0LG4pe2xldCByPWUrSCxvPUUoKSxpPVppKG8scik7cmV0dXJuIGN2KG8scik/c3YobyxtbigpLHQsaS50cmFuc2Zvcm0sbixpKTppLnRyYW5zZm9ybShuKX1mdW5jdGlvbiBXVChlLHQsbixyKXtsZXQgbz1lK0gsaT1FKCkscz1aaShpLG8pO3JldHVybiBjdihpLG8pP2F2KGksbW4oKSx0LHMudHJhbnNmb3JtLG4scixzKTpzLnRyYW5zZm9ybShuLHIpfWZ1bmN0aW9uIGN2KGUsdCl7cmV0dXJuIGVbd10uZGF0YVt0XS5wdXJlfWZ1bmN0aW9uIHFUKGUsdCl7cmV0dXJuIFpzKGUsdCl9ZnVuY3Rpb24gdXYoe25nWm9uZUZhY3Rvcnk6ZSxpZ25vcmVDaGFuZ2VzT3V0c2lkZVpvbmU6dCxzY2hlZHVsZUluUm9vdFpvbmU6bn0pe3JldHVybiBlPz89KCk9Pm5ldyB6KEcoVih7fSxsdigpKSx7c2NoZWR1bGVJblJvb3Rab25lOm59KSksW3twcm92aWRlOnosdXNlRmFjdG9yeTplfSx7cHJvdmlkZTpOdCxtdWx0aTohMCx1c2VGYWN0b3J5OigpPT57bGV0IHI9eShZVCx7b3B0aW9uYWw6ITB9KTtyZXR1cm4oKT0+ci5pbml0aWFsaXplKCl9fSx7cHJvdmlkZTpOdCxtdWx0aTohMCx1c2VGYWN0b3J5OigpPT57bGV0IHI9eShRVCk7cmV0dXJuKCk9PntyLmluaXRpYWxpemUoKX19fSx0PT09ITA/e3Byb3ZpZGU6T3UsdXNlVmFsdWU6ITB9OltdLHtwcm92aWRlOkZ1LHVzZVZhbHVlOm4/P2JtfSx7cHJvdmlkZTpCZSx1c2VGYWN0b3J5OigpPT57bGV0IHI9eSh6KSxvPXkoeWUpLGk7cmV0dXJuIHM9PntyLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57by5kZXN0cm95ZWQmJiFpP3NldFRpbWVvdXQoKCk9Pnt0aHJvdyBzfSk6KGk/Pz1vLmdldChEZSksaS5oYW5kbGVFcnJvcihzKSl9KX19fV19ZnVuY3Rpb24gbHYoZSl7cmV0dXJue2VuYWJsZUxvbmdTdGFja1RyYWNlOiExLHNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb246ZT8uZXZlbnRDb2FsZXNjaW5nPz8hMSxzaG91bGRDb2FsZXNjZVJ1bkNoYW5nZURldGVjdGlvbjplPy5ydW5Db2FsZXNjaW5nPz8hMX19ZnVuY3Rpb24gS1QoKXtyZXR1cm4gdHlwZW9mICRsb2NhbGl6ZTwidSImJiRsb2NhbGl6ZS5sb2NhbGV8fFNvfXZhciBvcyxOZyxXRSxncyxPbCxSZyxXaCxMLHVyLEVuLHF1LG9JLGpnLEJnLGlJLHR0LERuLEV0LEVzLFBsLFpnLGdJLEtoLEt1LGtzLHZJLFBzLG1vLERJLExzLEVJLElJLEpnLFhnLGVtLHRtLG5tLHdJLGJJLHZ0LGlzLHNzLER0LFh1LGVsLHRsLG5sLHJsLG9sLGlsLFNJLGFtLGNtLHVtLE5JLEFJLHhJLGVnLGxtLFJJLE9JLEZJLGtJLHNsLEJJLFZJLGFzLFVJLCRJLHpJLHhlLEpJLFhJLERtLHJlLEhzLFVlLER3LEluLFVzLEx0LHNnLGJtLGNsLHl0LEtsLHdzLEV3LHosSXcsQ3MsJHMsWGwsZWQsdW8sTW0sQncsZmcsR3csSG0saUMsYUMsY0Msa3QsbnQsQlAsSUMsd0MsWG0sWXMsZmwsd28sd24sQ28sZXkscHMscGwsaGwsX3MsUHQsTXMsb3QsWUMsYXksS0MsSkMsZ2wsbWwsU3MseWwsdmwsQ24seXksTnMsQXMsaG8sY2IsYmIsX3ksSnMsdnIsVG8sX28sbWQseWQsdmQsU3ksTWIsVG4sV1AsSWwseHMsQ2wsYmwsVGwsUHksVmIsY3MsJGIsVXUsX24sU28sR2IsSGUsTVQsRnMsWlQsWVQsUVQsZHYsTm8sTmQ9aCgoKT0+e2lvKCk7V3QoKTtVcigpO3hjKCk7a3UoKTtvcz0iX19wYXJhbWV0ZXJzX18iO05nPUtjKFNnKCJPcHRpb25hbCIpLDgpLFdFPUtjKFNnKCJTa2lwU2VsZiIpLDQpO2dzPWNsYXNze3ByZXZpb3VzVmFsdWU7Y3VycmVudFZhbHVlO2ZpcnN0Q2hhbmdlO2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLnByZXZpb3VzVmFsdWU9dCx0aGlzLmN1cnJlbnRWYWx1ZT1uLHRoaXMuZmlyc3RDaGFuZ2U9cn1pc0ZpcnN0Q2hhbmdlKCl7cmV0dXJuIHRoaXMuZmlyc3RDaGFuZ2V9fTtPbD0oKCk9PntsZXQgZT0oKT0+eGc7cmV0dXJuIGUubmdJbmhlcml0PSEwLGV9KSgpO1JnPSJfX25nU2ltcGxlQ2hhbmdlc19fIjtXaD1bXSxMPWZ1bmN0aW9uKGUsdD1udWxsLG4pe2ZvcihsZXQgcj0wO3I8V2gubGVuZ3RoO3IrKyl7bGV0IG89V2hbcl07byhlLHQsbil9fTt1cj0tMSxFbj1jbGFzc3tmYWN0b3J5O25hbWU7aW5qZWN0SW1wbDtyZXNvbHZpbmc9ITE7Y2FuU2VlVmlld1Byb3ZpZGVyczttdWx0aTtjb21wb25lbnRQcm92aWRlcnM7aW5kZXg7cHJvdmlkZXJGYWN0b3J5O2NvbnN0cnVjdG9yKHQsbixyLG8pe3RoaXMuZmFjdG9yeT10LHRoaXMubmFtZT1vLHRoaXMuY2FuU2VlVmlld1Byb3ZpZGVycz1uLHRoaXMuaW5qZWN0SW1wbD1yfX07cXU9ITA7b0k9MjU2LGpnPW9JLTEsQmc9NSxpST0wLHR0PXt9O0RuPWNsYXNze190Tm9kZTtfbFZpZXc7Y29uc3RydWN0b3IodCxuKXt0aGlzLl90Tm9kZT10LHRoaXMuX2xWaWV3PW59Z2V0KHQsbixyKXtyZXR1cm4gJGcodGhpcy5fdE5vZGUsdGhpcy5fbFZpZXcsdCxvbihyKSxuKX19O0V0PSgoKT0+e2NsYXNzIGV7bmF0aXZlRWxlbWVudDtjb25zdHJ1Y3RvcihuKXt0aGlzLm5hdGl2ZUVsZW1lbnQ9bn1zdGF0aWMgX19OR19FTEVNRU5UX0lEX189cEl9cmV0dXJuIGV9KSgpO0VzPWNsYXNze19lbWl0RGlzdGluY3RDaGFuZ2VzT25seTtkaXJ0eT0hMDtfb25EaXJ0eT12b2lkIDA7X3Jlc3VsdHM9W107X2NoYW5nZXNEZXRlY3RlZD0hMTtfY2hhbmdlcz12b2lkIDA7bGVuZ3RoPTA7Zmlyc3Q9dm9pZCAwO2xhc3Q9dm9pZCAwO2dldCBjaGFuZ2VzKCl7cmV0dXJuIHRoaXMuX2NoYW5nZXM/Pz1uZXcgZ2V9Y29uc3RydWN0b3IodD0hMSl7dGhpcy5fZW1pdERpc3RpbmN0Q2hhbmdlc09ubHk9dH1nZXQodCl7cmV0dXJuIHRoaXMuX3Jlc3VsdHNbdF19bWFwKHQpe3JldHVybiB0aGlzLl9yZXN1bHRzLm1hcCh0KX1maWx0ZXIodCl7cmV0dXJuIHRoaXMuX3Jlc3VsdHMuZmlsdGVyKHQpfWZpbmQodCl7cmV0dXJuIHRoaXMuX3Jlc3VsdHMuZmluZCh0KX1yZWR1Y2UodCxuKXtyZXR1cm4gdGhpcy5fcmVzdWx0cy5yZWR1Y2UodCxuKX1mb3JFYWNoKHQpe3RoaXMuX3Jlc3VsdHMuZm9yRWFjaCh0KX1zb21lKHQpe3JldHVybiB0aGlzLl9yZXN1bHRzLnNvbWUodCl9dG9BcnJheSgpe3JldHVybiB0aGlzLl9yZXN1bHRzLnNsaWNlKCl9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5fcmVzdWx0cy50b1N0cmluZygpfXJlc2V0KHQsbil7dGhpcy5kaXJ0eT0hMTtsZXQgcj1kaCh0KTsodGhpcy5fY2hhbmdlc0RldGVjdGVkPSFsaCh0aGlzLl9yZXN1bHRzLHIsbikpJiYodGhpcy5fcmVzdWx0cz1yLHRoaXMubGVuZ3RoPXIubGVuZ3RoLHRoaXMubGFzdD1yW3RoaXMubGVuZ3RoLTFdLHRoaXMuZmlyc3Q9clswXSl9bm90aWZ5T25DaGFuZ2VzKCl7dGhpcy5fY2hhbmdlcyE9PXZvaWQgMCYmKHRoaXMuX2NoYW5nZXNEZXRlY3RlZHx8IXRoaXMuX2VtaXREaXN0aW5jdENoYW5nZXNPbmx5KSYmdGhpcy5fY2hhbmdlcy5uZXh0KHRoaXMpfW9uRGlydHkodCl7dGhpcy5fb25EaXJ0eT10fXNldERpcnR5KCl7dGhpcy5kaXJ0eT0hMCx0aGlzLl9vbkRpcnR5Py4oKX1kZXN0cm95KCl7dGhpcy5fY2hhbmdlcyE9PXZvaWQgMCYmKHRoaXMuX2NoYW5nZXMuY29tcGxldGUoKSx0aGlzLl9jaGFuZ2VzLnVuc3Vic2NyaWJlKCkpfVtTeW1ib2wuaXRlcmF0b3JdPWhJfTtQbD0oZnVuY3Rpb24oZSl7cmV0dXJuIGVbZS5PblB1c2g9MF09Ik9uUHVzaCIsZVtlLkRlZmF1bHQ9MV09IkRlZmF1bHQiLGV9KShQbHx8e30pLFpnPW5ldyBNYXAsZ0k9MDtLaD0iX19uZ0NvbnRleHRfXyI7a3M9bmV3IFQoIiIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9PnZJfSksdkk9Im5nIixQcz1uZXcgVCgiIiksbW89bmV3IFQoIiIse3Byb3ZpZGVkSW46InBsYXRmb3JtIixmYWN0b3J5OigpPT4idW5rbm93biJ9KSxEST1uZXcgVCgiIiksTHM9bmV3IFQoIiIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9PmpsKCkuYm9keT8ucXVlcnlTZWxlY3RvcigiW25nQ3NwTm9uY2VdIik/LmdldEF0dHJpYnV0ZSgibmdDc3BOb25jZSIpfHxudWxsfSksRUk9ImgiLElJPSJiIixKZz0iciIsWGc9ImRpIixlbT0hMSx0bT1uZXcgVCgiIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTooKT0+ZW19KSxubT1uZXcgVCgiIik7d0k9KGUsdCxuLHIpPT57fTtiST0oKT0+bnVsbDt2dD0oZnVuY3Rpb24oZSl7cmV0dXJuIGVbZS5FbXVsYXRlZD0wXT0iRW11bGF0ZWQiLGVbZS5Ob25lPTJdPSJOb25lIixlW2UuU2hhZG93RG9tPTNdPSJTaGFkb3dEb20iLGV9KSh2dHx8e30pO0R0PWNsYXNze2NoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk7Y29uc3RydWN0b3IodCl7dGhpcy5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5PXR9dG9TdHJpbmcoKXtyZXR1cm5gU2FmZVZhbHVlIG11c3QgdXNlIFtwcm9wZXJ0eV09YmluZGluZzogJHt0aGlzLmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHl9IChzZWUgJHtqaX0pYH19LFh1PWNsYXNzIGV4dGVuZHMgRHR7Z2V0VHlwZU5hbWUoKXtyZXR1cm4iSFRNTCJ9fSxlbD1jbGFzcyBleHRlbmRzIER0e2dldFR5cGVOYW1lKCl7cmV0dXJuIlN0eWxlIn19LHRsPWNsYXNzIGV4dGVuZHMgRHR7Z2V0VHlwZU5hbWUoKXtyZXR1cm4iU2NyaXB0In19LG5sPWNsYXNzIGV4dGVuZHMgRHR7Z2V0VHlwZU5hbWUoKXtyZXR1cm4iVVJMIn19LHJsPWNsYXNzIGV4dGVuZHMgRHR7Z2V0VHlwZU5hbWUoKXtyZXR1cm4iUmVzb3VyY2VVUkwifX07b2w9Y2xhc3N7aW5lcnREb2N1bWVudEhlbHBlcjtjb25zdHJ1Y3Rvcih0KXt0aGlzLmluZXJ0RG9jdW1lbnRIZWxwZXI9dH1nZXRJbmVydEJvZHlFbGVtZW50KHQpe3Q9Ijxib2R5PjxyZW1vdmU+PC9yZW1vdmU+Iit0O3RyeXtsZXQgbj1uZXcgd2luZG93LkRPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhCcyh0KSwidGV4dC9odG1sIikuYm9keTtyZXR1cm4gbj09PW51bGw/dGhpcy5pbmVydERvY3VtZW50SGVscGVyLmdldEluZXJ0Qm9keUVsZW1lbnQodCk6KG4uZmlyc3RDaGlsZD8ucmVtb3ZlKCksbil9Y2F0Y2h7cmV0dXJuIG51bGx9fX0saWw9Y2xhc3N7ZGVmYXVsdERvYztpbmVydERvY3VtZW50O2NvbnN0cnVjdG9yKHQpe3RoaXMuZGVmYXVsdERvYz10LHRoaXMuaW5lcnREb2N1bWVudD10aGlzLmRlZmF1bHREb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJzYW5pdGl6YXRpb24taW5lcnQiKX1nZXRJbmVydEJvZHlFbGVtZW50KHQpe2xldCBuPXRoaXMuaW5lcnREb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO3JldHVybiBuLmlubmVySFRNTD1Ccyh0KSxufX07U0k9L14oPyFqYXZhc2NyaXB0OikoPzpbYS16MC05Ky4tXSs6fFteJjpcLz8jXSooPzpbXC8/I118JCkpL2k7YW09SXQoImFyZWEsYnIsY29sLGhyLGltZyx3YnIiKSxjbT1JdCgiY29sZ3JvdXAsZGQsZHQsbGkscCx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0ciIpLHVtPUl0KCJycCxydCIpLE5JPXZvKHVtLGNtKSxBST12byhjbSxJdCgiYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJsb2NrcXVvdGUsY2FwdGlvbixjZW50ZXIsZGVsLGRldGFpbHMsZGlhbG9nLGRpcixkaXYsZGwsZmlndXJlLGZpZ2NhcHRpb24sZm9vdGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhlYWRlcixoZ3JvdXAsaHIsaW5zLG1haW4sbWFwLG1lbnUsbmF2LG9sLHByZSxzZWN0aW9uLHN1bW1hcnksdGFibGUsdWwiKSkseEk9dm8odW0sSXQoImEsYWJicixhY3JvbnltLGF1ZGlvLGIsYmRpLGJkbyxiaWcsYnIsY2l0ZSxjb2RlLGRlbCxkZm4sZW0sZm9udCxpLGltZyxpbnMsa2JkLGxhYmVsLG1hcCxtYXJrLHBpY3R1cmUscSxydWJ5LHJwLHJ0LHMsc2FtcCxzbWFsbCxzb3VyY2Usc3BhbixzdHJpa2Usc3Ryb25nLHN1YixzdXAsdGltZSx0cmFjayx0dCx1LHZhcix2aWRlbyIpKSxlZz12byhhbSxBSSx4SSxOSSksbG09SXQoImJhY2tncm91bmQsY2l0ZSxocmVmLGl0ZW10eXBlLGxvbmdkZXNjLHBvc3RlcixzcmMseGxpbms6aHJlZiIpLFJJPUl0KCJhYmJyLGFjY2Vzc2tleSxhbGlnbixhbHQsYXV0b3BsYXksYXhpcyxiZ2NvbG9yLGJvcmRlcixjZWxscGFkZGluZyxjZWxsc3BhY2luZyxjbGFzcyxjbGVhcixjb2xvcixjb2xzLGNvbHNwYW4sY29tcGFjdCxjb250cm9scyxjb29yZHMsZGF0ZXRpbWUsZGVmYXVsdCxkaXIsZG93bmxvYWQsZmFjZSxoZWFkZXJzLGhlaWdodCxoaWRkZW4saHJlZmxhbmcsaHNwYWNlLGlzbWFwLGl0ZW1zY29wZSxpdGVtcHJvcCxraW5kLGxhYmVsLGxhbmcsbGFuZ3VhZ2UsbG9vcCxtZWRpYSxtdXRlZCxub2hyZWYsbm93cmFwLG9wZW4scHJlbG9hZCxyZWwscmV2LHJvbGUscm93cyxyb3dzcGFuLHJ1bGVzLHNjb3BlLHNjcm9sbGluZyxzaGFwZSxzaXplLHNpemVzLHNwYW4sc3JjbGFuZyxzcmNzZXQsc3RhcnQsc3VtbWFyeSx0YWJpbmRleCx0YXJnZXQsdGl0bGUsdHJhbnNsYXRlLHR5cGUsdXNlbWFwLHZhbGlnbix2YWx1ZSx2c3BhY2Usd2lkdGgiKSxPST1JdCgiYXJpYS1hY3RpdmVkZXNjZW5kYW50LGFyaWEtYXRvbWljLGFyaWEtYXV0b2NvbXBsZXRlLGFyaWEtYnVzeSxhcmlhLWNoZWNrZWQsYXJpYS1jb2xjb3VudCxhcmlhLWNvbGluZGV4LGFyaWEtY29sc3BhbixhcmlhLWNvbnRyb2xzLGFyaWEtY3VycmVudCxhcmlhLWRlc2NyaWJlZGJ5LGFyaWEtZGV0YWlscyxhcmlhLWRpc2FibGVkLGFyaWEtZHJvcGVmZmVjdCxhcmlhLWVycm9ybWVzc2FnZSxhcmlhLWV4cGFuZGVkLGFyaWEtZmxvd3RvLGFyaWEtZ3JhYmJlZCxhcmlhLWhhc3BvcHVwLGFyaWEtaGlkZGVuLGFyaWEtaW52YWxpZCxhcmlhLWtleXNob3J0Y3V0cyxhcmlhLWxhYmVsLGFyaWEtbGFiZWxsZWRieSxhcmlhLWxldmVsLGFyaWEtbGl2ZSxhcmlhLW1vZGFsLGFyaWEtbXVsdGlsaW5lLGFyaWEtbXVsdGlzZWxlY3RhYmxlLGFyaWEtb3JpZW50YXRpb24sYXJpYS1vd25zLGFyaWEtcGxhY2Vob2xkZXIsYXJpYS1wb3NpbnNldCxhcmlhLXByZXNzZWQsYXJpYS1yZWFkb25seSxhcmlhLXJlbGV2YW50LGFyaWEtcmVxdWlyZWQsYXJpYS1yb2xlZGVzY3JpcHRpb24sYXJpYS1yb3djb3VudCxhcmlhLXJvd2luZGV4LGFyaWEtcm93c3BhbixhcmlhLXNlbGVjdGVkLGFyaWEtc2V0c2l6ZSxhcmlhLXNvcnQsYXJpYS12YWx1ZW1heCxhcmlhLXZhbHVlbWluLGFyaWEtdmFsdWVub3csYXJpYS12YWx1ZXRleHQiKSxGST12byhsbSxSSSxPSSksa0k9SXQoInNjcmlwdCxzdHlsZSx0ZW1wbGF0ZSIpLHNsPWNsYXNze3Nhbml0aXplZFNvbWV0aGluZz0hMTtidWY9W107c2FuaXRpemVDaGlsZHJlbih0KXtsZXQgbj10LmZpcnN0Q2hpbGQscj0hMCxvPVtdO2Zvcig7bjspe2lmKG4ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERT9yPXRoaXMuc3RhcnRFbGVtZW50KG4pOm4ubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERT90aGlzLmNoYXJzKG4ubm9kZVZhbHVlKTp0aGlzLnNhbml0aXplZFNvbWV0aGluZz0hMCxyJiZuLmZpcnN0Q2hpbGQpe28ucHVzaChuKSxuPWpJKG4pO2NvbnRpbnVlfWZvcig7bjspe24ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmdGhpcy5lbmRFbGVtZW50KG4pO2xldCBpPUxJKG4pO2lmKGkpe249aTticmVha31uPW8ucG9wKCl9fXJldHVybiB0aGlzLmJ1Zi5qb2luKCIiKX1zdGFydEVsZW1lbnQodCl7bGV0IG49dGcodCkudG9Mb3dlckNhc2UoKTtpZighZWcuaGFzT3duUHJvcGVydHkobikpcmV0dXJuIHRoaXMuc2FuaXRpemVkU29tZXRoaW5nPSEwLCFrSS5oYXNPd25Qcm9wZXJ0eShuKTt0aGlzLmJ1Zi5wdXNoKCI8IiksdGhpcy5idWYucHVzaChuKTtsZXQgcj10LmF0dHJpYnV0ZXM7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKyspe2xldCBpPXIuaXRlbShvKSxzPWkubmFtZSxhPXMudG9Mb3dlckNhc2UoKTtpZighRkkuaGFzT3duUHJvcGVydHkoYSkpe3RoaXMuc2FuaXRpemVkU29tZXRoaW5nPSEwO2NvbnRpbnVlfWxldCBjPWkudmFsdWU7bG1bYV0mJihjPXlvKGMpKSx0aGlzLmJ1Zi5wdXNoKCIgIixzLCc9IicsbmcoYyksJyInKX1yZXR1cm4gdGhpcy5idWYucHVzaCgiPiIpLCEwfWVuZEVsZW1lbnQodCl7bGV0IG49dGcodCkudG9Mb3dlckNhc2UoKTtlZy5oYXNPd25Qcm9wZXJ0eShuKSYmIWFtLmhhc093blByb3BlcnR5KG4pJiYodGhpcy5idWYucHVzaCgiPC8iKSx0aGlzLmJ1Zi5wdXNoKG4pLHRoaXMuYnVmLnB1c2goIj4iKSl9Y2hhcnModCl7dGhpcy5idWYucHVzaChuZyh0KSl9fTtCST0vW1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdL2csVkk9LyhbXlwjLX4gfCFdKS9nO1VJPS9ePnxeLT58PCEtLXwtLT58LS0hPnw8IS0kL2csJEk9Lyg8fD4pL2csekk9Ilx1MjAwQiQxXHUyMDBCIjt4ZT0oZnVuY3Rpb24oZSl7cmV0dXJuIGVbZS5OT05FPTBdPSJOT05FIixlW2UuSFRNTD0xXT0iSFRNTCIsZVtlLlNUWUxFPTJdPSJTVFlMRSIsZVtlLlNDUklQVD0zXT0iU0NSSVBUIixlW2UuVVJMPTRdPSJVUkwiLGVbZS5SRVNPVVJDRV9VUkw9NV09IlJFU09VUkNFX1VSTCIsZX0pKHhlfHx7fSk7Skk9bmV3IFNldChbImVtYmVkIiwiZnJhbWUiLCJpZnJhbWUiLCJtZWRpYSIsInNjcmlwdCJdKSxYST1uZXcgU2V0KFsiYmFzZSIsImxpbmsiLCJzY3JpcHQiXSk7RG09Im5nLXRlbXBsYXRlIjtyZT17fTtIcz0oZnVuY3Rpb24oZSl7cmV0dXJuIGVbZS5Ob25lPTBdPSJOb25lIixlW2UuU2lnbmFsQmFzZWQ9MV09IlNpZ25hbEJhc2VkIixlW2UuSGFzRGVjb3JhdG9ySW5wdXRUcmFuc2Zvcm09Ml09Ikhhc0RlY29yYXRvcklucHV0VHJhbnNmb3JtIixlfSkoSHN8fHt9KTtVZT0oZnVuY3Rpb24oZSl7cmV0dXJuIGVbZS5JbXBvcnRhbnQ9MV09IkltcG9ydGFudCIsZVtlLkRhc2hDYXNlPTJdPSJEYXNoQ2FzZSIsZX0pKFVlfHx7fSk7SW49bmV3IFNldCxVcz0oZnVuY3Rpb24oZSl7cmV0dXJuIGVbZS5DSEFOR0VfREVURUNUSU9OPTBdPSJDSEFOR0VfREVURUNUSU9OIixlW2UuQUZURVJfTkVYVF9SRU5ERVI9MV09IkFGVEVSX05FWFRfUkVOREVSIixlfSkoVXN8fHt9KSxMdD1uZXcgVCgiIiksc2c9bmV3IFNldDtibT0hMSxjbD1jbGFzcyBleHRlbmRzIGdle19faXNBc3luYztkZXN0cm95UmVmPXZvaWQgMDtwZW5kaW5nVGFza3M9dm9pZCAwO2NvbnN0cnVjdG9yKHQ9ITEpe3N1cGVyKCksdGhpcy5fX2lzQXN5bmM9dCxpdSgpJiYodGhpcy5kZXN0cm95UmVmPXkoQWUse29wdGlvbmFsOiEwfSk/P3ZvaWQgMCx0aGlzLnBlbmRpbmdUYXNrcz15KEZ0LHtvcHRpb25hbDohMH0pPz92b2lkIDApfWVtaXQodCl7bGV0IG49TShudWxsKTt0cnl7c3VwZXIubmV4dCh0KX1maW5hbGx5e00obil9fXN1YnNjcmliZSh0LG4scil7bGV0IG89dCxpPW58fCgoKT0+bnVsbCkscz1yO2lmKHQmJnR5cGVvZiB0PT0ib2JqZWN0Iil7bGV0IGM9dDtvPWMubmV4dD8uYmluZChjKSxpPWMuZXJyb3I/LmJpbmQoYykscz1jLmNvbXBsZXRlPy5iaW5kKGMpfXRoaXMuX19pc0FzeW5jJiYoaT10aGlzLndyYXBJblRpbWVvdXQoaSksbyYmKG89dGhpcy53cmFwSW5UaW1lb3V0KG8pKSxzJiYocz10aGlzLndyYXBJblRpbWVvdXQocykpKTtsZXQgYT1zdXBlci5zdWJzY3JpYmUoe25leHQ6byxlcnJvcjppLGNvbXBsZXRlOnN9KTtyZXR1cm4gdCBpbnN0YW5jZW9mIFcmJnQuYWRkKGEpLGF9d3JhcEluVGltZW91dCh0KXtyZXR1cm4gbj0+e2xldCByPXRoaXMucGVuZGluZ1Rhc2tzPy5hZGQoKTtzZXRUaW1lb3V0KCgpPT57dHJ5e3Qobil9ZmluYWxseXtyIT09dm9pZCAwJiZ0aGlzLnBlbmRpbmdUYXNrcz8ucmVtb3ZlKHIpfX0pfX19LHl0PWNsO0tsPSJpc0FuZ3VsYXJab25lIix3cz1LbCsiX0lEIixFdz0wLHo9Y2xhc3MgZXtoYXNQZW5kaW5nTWFjcm90YXNrcz0hMTtoYXNQZW5kaW5nTWljcm90YXNrcz0hMTtpc1N0YWJsZT0hMDtvblVuc3RhYmxlPW5ldyB5dCghMSk7b25NaWNyb3Rhc2tFbXB0eT1uZXcgeXQoITEpO29uU3RhYmxlPW5ldyB5dCghMSk7b25FcnJvcj1uZXcgeXQoITEpO2NvbnN0cnVjdG9yKHQpe2xldHtlbmFibGVMb25nU3RhY2tUcmFjZTpuPSExLHNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb246cj0hMSxzaG91bGRDb2FsZXNjZVJ1bkNoYW5nZURldGVjdGlvbjpvPSExLHNjaGVkdWxlSW5Sb290Wm9uZTppPWJtfT10O2lmKHR5cGVvZiBab25lPiJ1Iil0aHJvdyBuZXcgdig5MDgsITEpO1pvbmUuYXNzZXJ0Wm9uZVBhdGNoZWQoKTtsZXQgcz10aGlzO3MuX25lc3Rpbmc9MCxzLl9vdXRlcj1zLl9pbm5lcj1ab25lLmN1cnJlbnQsWm9uZS5UYXNrVHJhY2tpbmdab25lU3BlYyYmKHMuX2lubmVyPXMuX2lubmVyLmZvcmsobmV3IFpvbmUuVGFza1RyYWNraW5nWm9uZVNwZWMpKSxuJiZab25lLmxvbmdTdGFja1RyYWNlWm9uZVNwZWMmJihzLl9pbm5lcj1zLl9pbm5lci5mb3JrKFpvbmUubG9uZ1N0YWNrVHJhY2Vab25lU3BlYykpLHMuc2hvdWxkQ29hbGVzY2VFdmVudENoYW5nZURldGVjdGlvbj0hbyYmcixzLnNob3VsZENvYWxlc2NlUnVuQ2hhbmdlRGV0ZWN0aW9uPW8scy5jYWxsYmFja1NjaGVkdWxlZD0hMSxzLnNjaGVkdWxlSW5Sb290Wm9uZT1pLEN3KHMpfXN0YXRpYyBpc0luQW5ndWxhclpvbmUoKXtyZXR1cm4gdHlwZW9mIFpvbmU8InUiJiZab25lLmN1cnJlbnQuZ2V0KEtsKT09PSEwfXN0YXRpYyBhc3NlcnRJbkFuZ3VsYXJab25lKCl7aWYoIWUuaXNJbkFuZ3VsYXJab25lKCkpdGhyb3cgbmV3IHYoOTA5LCExKX1zdGF0aWMgYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpe2lmKGUuaXNJbkFuZ3VsYXJab25lKCkpdGhyb3cgbmV3IHYoOTA5LCExKX1ydW4odCxuLHIpe3JldHVybiB0aGlzLl9pbm5lci5ydW4odCxuLHIpfXJ1blRhc2sodCxuLHIsbyl7bGV0IGk9dGhpcy5faW5uZXIscz1pLnNjaGVkdWxlRXZlbnRUYXNrKCJOZ1pvbmVFdmVudDogIitvLHQsSXcsdm4sdm4pO3RyeXtyZXR1cm4gaS5ydW5UYXNrKHMsbixyKX1maW5hbGx5e2kuY2FuY2VsVGFzayhzKX19cnVuR3VhcmRlZCh0LG4scil7cmV0dXJuIHRoaXMuX2lubmVyLnJ1bkd1YXJkZWQodCxuLHIpfXJ1bk91dHNpZGVBbmd1bGFyKHQpe3JldHVybiB0aGlzLl9vdXRlci5ydW4odCl9fSxJdz17fTtDcz1jbGFzc3toYXNQZW5kaW5nTWljcm90YXNrcz0hMTtoYXNQZW5kaW5nTWFjcm90YXNrcz0hMTtpc1N0YWJsZT0hMDtvblVuc3RhYmxlPW5ldyB5dDtvbk1pY3JvdGFza0VtcHR5PW5ldyB5dDtvblN0YWJsZT1uZXcgeXQ7b25FcnJvcj1uZXcgeXQ7cnVuKHQsbixyKXtyZXR1cm4gdC5hcHBseShuLHIpfXJ1bkd1YXJkZWQodCxuLHIpe3JldHVybiB0LmFwcGx5KG4scil9cnVuT3V0c2lkZUFuZ3VsYXIodCl7cmV0dXJuIHQoKX1ydW5UYXNrKHQsbixyLG8pe3JldHVybiB0LmFwcGx5KG4scil9fTskcz0oKCk9PntjbGFzcyBle2ltcGw9bnVsbDtleGVjdXRlKCl7dGhpcy5pbXBsPy5leGVjdXRlKCl9c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT5uZXcgZX0pfXJldHVybiBlfSkoKSxYbD1bMCwxLDIsM10sZWQ9KCgpPT57Y2xhc3MgZXtuZ1pvbmU9eSh6KTtzY2hlZHVsZXI9eShUZSk7ZXJyb3JIYW5kbGVyPXkoRGUse29wdGlvbmFsOiEwfSk7c2VxdWVuY2VzPW5ldyBTZXQ7ZGVmZXJyZWRSZWdpc3RyYXRpb25zPW5ldyBTZXQ7ZXhlY3V0aW5nPSExO2NvbnN0cnVjdG9yKCl7eShMdCx7b3B0aW9uYWw6ITB9KX1leGVjdXRlKCl7bGV0IG49dGhpcy5zZXF1ZW5jZXMuc2l6ZT4wO24mJkwoMTYpLHRoaXMuZXhlY3V0aW5nPSEwO2ZvcihsZXQgciBvZiBYbClmb3IobGV0IG8gb2YgdGhpcy5zZXF1ZW5jZXMpaWYoIShvLmVycm9yZWRPckRlc3Ryb3llZHx8IW8uaG9va3Nbcl0pKXRyeXtvLnBpcGVsaW5lZFZhbHVlPXRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT50aGlzLm1heWJlVHJhY2UoKCk9PntsZXQgaT1vLmhvb2tzW3JdO3JldHVybiBpKG8ucGlwZWxpbmVkVmFsdWUpfSxvLnNuYXBzaG90KSl9Y2F0Y2goaSl7by5lcnJvcmVkT3JEZXN0cm95ZWQ9ITAsdGhpcy5lcnJvckhhbmRsZXI/LmhhbmRsZUVycm9yKGkpfXRoaXMuZXhlY3V0aW5nPSExO2ZvcihsZXQgciBvZiB0aGlzLnNlcXVlbmNlcylyLmFmdGVyUnVuKCksci5vbmNlJiYodGhpcy5zZXF1ZW5jZXMuZGVsZXRlKHIpLHIuZGVzdHJveSgpKTtmb3IobGV0IHIgb2YgdGhpcy5kZWZlcnJlZFJlZ2lzdHJhdGlvbnMpdGhpcy5zZXF1ZW5jZXMuYWRkKHIpO3RoaXMuZGVmZXJyZWRSZWdpc3RyYXRpb25zLnNpemU+MCYmdGhpcy5zY2hlZHVsZXIubm90aWZ5KDcpLHRoaXMuZGVmZXJyZWRSZWdpc3RyYXRpb25zLmNsZWFyKCksbiYmTCgxNyl9cmVnaXN0ZXIobil7bGV0e3ZpZXc6cn09bjtyIT09dm9pZCAwPygocltmbl0/Pz1bXSkucHVzaChuKSxSdChyKSxyW0FdfD04MTkyKTp0aGlzLmV4ZWN1dGluZz90aGlzLmRlZmVycmVkUmVnaXN0cmF0aW9ucy5hZGQobik6dGhpcy5hZGRTZXF1ZW5jZShuKX1hZGRTZXF1ZW5jZShuKXt0aGlzLnNlcXVlbmNlcy5hZGQobiksdGhpcy5zY2hlZHVsZXIubm90aWZ5KDcpfXVucmVnaXN0ZXIobil7dGhpcy5leGVjdXRpbmcmJnRoaXMuc2VxdWVuY2VzLmhhcyhuKT8obi5lcnJvcmVkT3JEZXN0cm95ZWQ9ITAsbi5waXBlbGluZWRWYWx1ZT12b2lkIDAsbi5vbmNlPSEwKToodGhpcy5zZXF1ZW5jZXMuZGVsZXRlKG4pLHRoaXMuZGVmZXJyZWRSZWdpc3RyYXRpb25zLmRlbGV0ZShuKSl9bWF5YmVUcmFjZShuLHIpe3JldHVybiByP3IucnVuKFVzLkFGVEVSX05FWFRfUkVOREVSLG4pOm4oKX1zdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLHByb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9Pm5ldyBlfSl9cmV0dXJuIGV9KSgpLHVvPWNsYXNze2ltcGw7aG9va3M7dmlldztvbmNlO3NuYXBzaG90O2Vycm9yZWRPckRlc3Ryb3llZD0hMTtwaXBlbGluZWRWYWx1ZT12b2lkIDA7dW5yZWdpc3Rlck9uRGVzdHJveTtjb25zdHJ1Y3Rvcih0LG4scixvLGkscz1udWxsKXt0aGlzLmltcGw9dCx0aGlzLmhvb2tzPW4sdGhpcy52aWV3PXIsdGhpcy5vbmNlPW8sdGhpcy5zbmFwc2hvdD1zLHRoaXMudW5yZWdpc3Rlck9uRGVzdHJveT1pPy5vbkRlc3Ryb3koKCk9PnRoaXMuZGVzdHJveSgpKX1hZnRlclJ1bigpe3RoaXMuZXJyb3JlZE9yRGVzdHJveWVkPSExLHRoaXMucGlwZWxpbmVkVmFsdWU9dm9pZCAwLHRoaXMuc25hcHNob3Q/LmRpc3Bvc2UoKSx0aGlzLnNuYXBzaG90PW51bGx9ZGVzdHJveSgpe3RoaXMuaW1wbC51bnJlZ2lzdGVyKHRoaXMpLHRoaXMudW5yZWdpc3Rlck9uRGVzdHJveT8uKCk7bGV0IHQ9dGhpcy52aWV3Py5bZm5dO3QmJih0aGlzLnZpZXdbZm5dPXQuZmlsdGVyKG49Pm4hPT10aGlzKSl9fTtNbT1uZXcgVCgiIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTooKT0+KHtxdWV1ZTpuZXcgU2V0LGlzU2NoZWR1bGVkOiExLHNjaGVkdWxlcjpudWxsfSl9KTtCdz1qdztHdz0oKT0+bnVsbDtIbT1bXTtpQz1HKFYoe30sVXQpLHtjb25zdW1lcklzQWx3YXlzTGl2ZTohMCxraW5kOiJ0ZW1wbGF0ZSIsY29uc3VtZXJNYXJrZWREaXJ0eTplPT57UnQoZS5sVmlldyl9LGNvbnN1bWVyT25TaWduYWxSZWFkKCl7dGhpcy5sVmlld1tJZV09dGhpc319KTthQz1HKFYoe30sVXQpLHtjb25zdW1lcklzQWx3YXlzTGl2ZTohMCxraW5kOiJ0ZW1wbGF0ZSIsY29uc3VtZXJNYXJrZWREaXJ0eTplPT57bGV0IHQ9U3QoZS5sVmlldyk7Zm9yKDt0JiYhVW0odFt3XSk7KXQ9U3QodCk7dCYmaHUodCl9LGNvbnN1bWVyT25TaWduYWxSZWFkKCl7dGhpcy5sVmlld1tJZV09dGhpc319KTtjQz0xMDA7a3Q9Y2xhc3N7X2xWaWV3O19jZFJlZkluamVjdGluZ1ZpZXc7X2FwcFJlZj1udWxsO19hdHRhY2hlZFRvVmlld0NvbnRhaW5lcj0hMTtleGhhdXN0aXZlO2dldCByb290Tm9kZXMoKXtsZXQgdD10aGlzLl9sVmlldyxuPXRbd107cmV0dXJuIGxvKG4sdCxuLmZpcnN0Q2hpbGQsW10pfWNvbnN0cnVjdG9yKHQsbil7dGhpcy5fbFZpZXc9dCx0aGlzLl9jZFJlZkluamVjdGluZ1ZpZXc9bn1nZXQgY29udGV4dCgpe3JldHVybiB0aGlzLl9sVmlld1txXX1zZXQgY29udGV4dCh0KXt0aGlzLl9sVmlld1txXT10fWdldCBkZXN0cm95ZWQoKXtyZXR1cm4gZ24odGhpcy5fbFZpZXcpfWRlc3Ryb3koKXtpZih0aGlzLl9hcHBSZWYpdGhpcy5fYXBwUmVmLmRldGFjaFZpZXcodGhpcyk7ZWxzZSBpZih0aGlzLl9hdHRhY2hlZFRvVmlld0NvbnRhaW5lcil7bGV0IHQ9dGhpcy5fbFZpZXdbdGVdO2lmKFBlKHQpKXtsZXQgbj10W0tyXSxyPW4/bi5pbmRleE9mKHRoaXMpOi0xO3I+LTEmJihmbyh0LHIpLFpyKG4scikpfXRoaXMuX2F0dGFjaGVkVG9WaWV3Q29udGFpbmVyPSExfXpzKHRoaXMuX2xWaWV3W3ddLHRoaXMuX2xWaWV3KX1vbkRlc3Ryb3kodCl7Z3UodGhpcy5fbFZpZXcsdCl9bWFya0ZvckNoZWNrKCl7Y2QodGhpcy5fY2RSZWZJbmplY3RpbmdWaWV3fHx0aGlzLl9sVmlldyw0KX1kZXRhY2goKXt0aGlzLl9sVmlld1tBXSY9LTEyOX1yZWF0dGFjaCgpe1FpKHRoaXMuX2xWaWV3KSx0aGlzLl9sVmlld1tBXXw9MTI4fWRldGVjdENoYW5nZXMoKXt0aGlzLl9sVmlld1tBXXw9MTAyNCx6bSh0aGlzLl9sVmlldyl9Y2hlY2tOb0NoYW5nZXMoKXt9YXR0YWNoVG9WaWV3Q29udGFpbmVyUmVmKCl7aWYodGhpcy5fYXBwUmVmKXRocm93IG5ldyB2KDkwMiwhMSk7dGhpcy5fYXR0YWNoZWRUb1ZpZXdDb250YWluZXI9ITB9ZGV0YWNoRnJvbUFwcFJlZigpe3RoaXMuX2FwcFJlZj1udWxsO2xldCB0PXJyKHRoaXMuX2xWaWV3KSxuPXRoaXMuX2xWaWV3W0F0XTtuIT09bnVsbCYmIXQmJnRkKG4sdGhpcy5fbFZpZXcpLE5tKHRoaXMuX2xWaWV3W3ddLHRoaXMuX2xWaWV3KX1hdHRhY2hUb0FwcFJlZih0KXtpZih0aGlzLl9hdHRhY2hlZFRvVmlld0NvbnRhaW5lcil0aHJvdyBuZXcgdig5MDIsITEpO3RoaXMuX2FwcFJlZj10O2xldCBuPXJyKHRoaXMuX2xWaWV3KSxyPXRoaXMuX2xWaWV3W0F0XTtyIT09bnVsbCYmIW4mJkttKHIsdGhpcy5fbFZpZXcpLFFpKHRoaXMuX2xWaWV3KX19LG50PSgoKT0+e2NsYXNzIGV7X2RlY2xhcmF0aW9uTFZpZXc7X2RlY2xhcmF0aW9uVENvbnRhaW5lcjtlbGVtZW50UmVmO3N0YXRpYyBfX05HX0VMRU1FTlRfSURfXz1nQztjb25zdHJ1Y3RvcihuLHIsbyl7dGhpcy5fZGVjbGFyYXRpb25MVmlldz1uLHRoaXMuX2RlY2xhcmF0aW9uVENvbnRhaW5lcj1yLHRoaXMuZWxlbWVudFJlZj1vfWdldCBzc3JJZCgpe3JldHVybiB0aGlzLl9kZWNsYXJhdGlvblRDb250YWluZXIudFZpZXc/LnNzcklkfHxudWxsfWNyZWF0ZUVtYmVkZGVkVmlldyhuLHIpe3JldHVybiB0aGlzLmNyZWF0ZUVtYmVkZGVkVmlld0ltcGwobixyKX1jcmVhdGVFbWJlZGRlZFZpZXdJbXBsKG4scixvKXtsZXQgaT1Fbyh0aGlzLl9kZWNsYXJhdGlvbkxWaWV3LHRoaXMuX2RlY2xhcmF0aW9uVENvbnRhaW5lcixuLHtlbWJlZGRlZFZpZXdJbmplY3RvcjpyLGRlaHlkcmF0ZWRWaWV3Om99KTtyZXR1cm4gbmV3IGt0KGkpfX1yZXR1cm4gZX0pKCk7QlA9bmV3IFJlZ0V4cChgXihcXGQrKSooJHtJSX18JHtFSX0pKiguKilgKTtJQz0oKT0+bnVsbCx3Qz0oKT0+bnVsbDtYbT1jbGFzc3t9LFlzPWNsYXNze30sZmw9Y2xhc3N7cmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodCl7dGhyb3cgbmV3IHYoOTE3LCExKX19LHdvPWNsYXNze3N0YXRpYyBOVUxMPW5ldyBmbH0sd249Y2xhc3N7fSxDbz0oKCk9PntjbGFzcyBle2Rlc3Ryb3lOb2RlPW51bGw7c3RhdGljIF9fTkdfRUxFTUVOVF9JRF9fPSgpPT5DQygpfXJldHVybiBlfSkoKTtleT0oKCk9PntjbGFzcyBle3N0YXRpYyBcdTAyNzVwcm92PU4oe3Rva2VuOmUscHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTooKT0+bnVsbH0pfXJldHVybiBlfSkoKSxwcz17fSxwbD1jbGFzc3tpbmplY3RvcjtwYXJlbnRJbmplY3Rvcjtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaW5qZWN0b3I9dCx0aGlzLnBhcmVudEluamVjdG9yPW59Z2V0KHQsbixyKXtsZXQgbz10aGlzLmluamVjdG9yLmdldCh0LHBzLHIpO3JldHVybiBvIT09cHN8fG49PT1wcz9vOnRoaXMucGFyZW50SW5qZWN0b3IuZ2V0KHQsbixyKX19O2hsPVN5bWJvbCgiQklORElORyIpLF9zPWNsYXNzIGV4dGVuZHMgd297bmdNb2R1bGU7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLm5nTW9kdWxlPXR9cmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodCl7bGV0IG49UWUodCk7cmV0dXJuIG5ldyBQdChuLHRoaXMubmdNb2R1bGUpfX07UHQ9Y2xhc3MgZXh0ZW5kcyBZc3tjb21wb25lbnREZWY7bmdNb2R1bGU7c2VsZWN0b3I7Y29tcG9uZW50VHlwZTtuZ0NvbnRlbnRTZWxlY3RvcnM7aXNCb3VuZFRvTW9kdWxlO2NhY2hlZElucHV0cz1udWxsO2NhY2hlZE91dHB1dHM9bnVsbDtnZXQgaW5wdXRzKCl7cmV0dXJuIHRoaXMuY2FjaGVkSW5wdXRzPz89VkModGhpcy5jb21wb25lbnREZWYuaW5wdXRzKSx0aGlzLmNhY2hlZElucHV0c31nZXQgb3V0cHV0cygpe3JldHVybiB0aGlzLmNhY2hlZE91dHB1dHM/Pz1IQyh0aGlzLmNvbXBvbmVudERlZi5vdXRwdXRzKSx0aGlzLmNhY2hlZE91dHB1dHN9Y29uc3RydWN0b3IodCxuKXtzdXBlcigpLHRoaXMuY29tcG9uZW50RGVmPXQsdGhpcy5uZ01vZHVsZT1uLHRoaXMuY29tcG9uZW50VHlwZT10LnR5cGUsdGhpcy5zZWxlY3Rvcj1wdyh0LnNlbGVjdG9ycyksdGhpcy5uZ0NvbnRlbnRTZWxlY3RvcnM9dC5uZ0NvbnRlbnRTZWxlY3RvcnM/P1tdLHRoaXMuaXNCb3VuZFRvTW9kdWxlPSEhbn1jcmVhdGUodCxuLHIsbyxpLHMpe0woMjIpO2xldCBhPU0obnVsbCk7dHJ5e2xldCBjPXRoaXMuY29tcG9uZW50RGVmLHU9R0MocixjLHMsaSksbD1VQyhjLG98fHRoaXMubmdNb2R1bGUsdCksZD0kQyhsKSxwPWQucmVuZGVyZXJGYWN0b3J5LmNyZWF0ZVJlbmRlcmVyKG51bGwsYyksZj1yPyR3KHAscixjLmVuY2Fwc3VsYXRpb24sbCk6ekMoYyxwKSxnPXM/LnNvbWUodmcpfHxpPy5zb21lKG09PnR5cGVvZiBtIT0iZnVuY3Rpb24iJiZtLmJpbmRpbmdzLnNvbWUodmcpKSxJPVpsKG51bGwsdSxudWxsLDUxMnxJbShjKSxudWxsLG51bGwsZCxwLGwsbnVsbCxybShmLGwsITApKTtJW0hdPWYsZXMoSSk7bGV0IEQ9bnVsbDt0cnl7bGV0IG09dWQoSCxJLDIsIiNob3N0IiwoKT0+dS5kaXJlY3RpdmVSZWdpc3RyeSwhMCwwKTtnbShwLGYsbSksZHIoZixJKSxXcyh1LEksbSksQmwodSxtLEkpLGxkKHUsbSksbiE9PXZvaWQgMCYmcUMobSx0aGlzLm5nQ29udGVudFNlbGVjdG9ycyxuKSxEPU5lKG0uaW5kZXgsSSksSVtxXT1EW3FdLGFkKHUsSSxudWxsKX1jYXRjaChtKXt0aHJvdyBEIT09bnVsbCYmUXUoRCksUXUoSSksbX1maW5hbGx5e0woMjMpLHRzKCl9cmV0dXJuIG5ldyBNcyh0aGlzLmNvbXBvbmVudFR5cGUsSSwhIWcpfWZpbmFsbHl7TShhKX19fTtNcz1jbGFzcyBleHRlbmRzIFhte19yb290TFZpZXc7X2hhc0lucHV0QmluZGluZ3M7aW5zdGFuY2U7aG9zdFZpZXc7Y2hhbmdlRGV0ZWN0b3JSZWY7Y29tcG9uZW50VHlwZTtsb2NhdGlvbjtwcmV2aW91c0lucHV0VmFsdWVzPW51bGw7X3ROb2RlO2NvbnN0cnVjdG9yKHQsbixyKXtzdXBlcigpLHRoaXMuX3Jvb3RMVmlldz1uLHRoaXMuX2hhc0lucHV0QmluZGluZ3M9cix0aGlzLl90Tm9kZT1KcihuW3ddLEgpLHRoaXMubG9jYXRpb249bXIodGhpcy5fdE5vZGUsbiksdGhpcy5pbnN0YW5jZT1OZSh0aGlzLl90Tm9kZS5pbmRleCxuKVtxXSx0aGlzLmhvc3RWaWV3PXRoaXMuY2hhbmdlRGV0ZWN0b3JSZWY9bmV3IGt0KG4sdm9pZCAwKSx0aGlzLmNvbXBvbmVudFR5cGU9dH1zZXRJbnB1dCh0LG4pe3RoaXMuX2hhc0lucHV0QmluZGluZ3M7bGV0IHI9dGhpcy5fdE5vZGU7aWYodGhpcy5wcmV2aW91c0lucHV0VmFsdWVzPz89bmV3IE1hcCx0aGlzLnByZXZpb3VzSW5wdXRWYWx1ZXMuaGFzKHQpJiZPYmplY3QuaXModGhpcy5wcmV2aW91c0lucHV0VmFsdWVzLmdldCh0KSxuKSlyZXR1cm47bGV0IG89dGhpcy5fcm9vdExWaWV3LGk9cXMocixvW3ddLG8sdCxuKTt0aGlzLnByZXZpb3VzSW5wdXRWYWx1ZXMuc2V0KHQsbik7bGV0IHM9TmUoci5pbmRleCxvKTtjZChzLDEpfWdldCBpbmplY3Rvcigpe3JldHVybiBuZXcgRG4odGhpcy5fdE5vZGUsdGhpcy5fcm9vdExWaWV3KX1kZXN0cm95KCl7dGhpcy5ob3N0Vmlldy5kZXN0cm95KCl9b25EZXN0cm95KHQpe3RoaXMuaG9zdFZpZXcub25EZXN0cm95KHQpfX07b3Q9KCgpPT57Y2xhc3MgZXtzdGF0aWMgX19OR19FTEVNRU5UX0lEX189WkN9cmV0dXJuIGV9KSgpO1lDPW90LGF5PWNsYXNzIGV4dGVuZHMgWUN7X2xDb250YWluZXI7X2hvc3RUTm9kZTtfaG9zdExWaWV3O2NvbnN0cnVjdG9yKHQsbixyKXtzdXBlcigpLHRoaXMuX2xDb250YWluZXI9dCx0aGlzLl9ob3N0VE5vZGU9bix0aGlzLl9ob3N0TFZpZXc9cn1nZXQgZWxlbWVudCgpe3JldHVybiBtcih0aGlzLl9ob3N0VE5vZGUsdGhpcy5faG9zdExWaWV3KX1nZXQgaW5qZWN0b3IoKXtyZXR1cm4gbmV3IERuKHRoaXMuX2hvc3RUTm9kZSx0aGlzLl9ob3N0TFZpZXcpfWdldCBwYXJlbnRJbmplY3Rvcigpe2xldCB0PUZsKHRoaXMuX2hvc3RUTm9kZSx0aGlzLl9ob3N0TFZpZXcpO2lmKExnKHQpKXtsZXQgbj15cyh0LHRoaXMuX2hvc3RMVmlldykscj1tcyh0KSxvPW5bd10uZGF0YVtyKzhdO3JldHVybiBuZXcgRG4obyxuKX1lbHNlIHJldHVybiBuZXcgRG4obnVsbCx0aGlzLl9ob3N0TFZpZXcpfWNsZWFyKCl7Zm9yKDt0aGlzLmxlbmd0aD4wOyl0aGlzLnJlbW92ZSh0aGlzLmxlbmd0aC0xKX1nZXQodCl7bGV0IG49RGcodGhpcy5fbENvbnRhaW5lcik7cmV0dXJuIG4hPT1udWxsJiZuW3RdfHxudWxsfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5fbENvbnRhaW5lci5sZW5ndGgtWn1jcmVhdGVFbWJlZGRlZFZpZXcodCxuLHIpe2xldCBvLGk7dHlwZW9mIHI9PSJudW1iZXIiP289cjpyIT1udWxsJiYobz1yLmluZGV4LGk9ci5pbmplY3Rvcik7bGV0IHM9YnModGhpcy5fbENvbnRhaW5lcix0LnNzcklkKSxhPXQuY3JlYXRlRW1iZWRkZWRWaWV3SW1wbChufHx7fSxpLHMpO3JldHVybiB0aGlzLmluc2VydEltcGwoYSxvLGZyKHRoaXMuX2hvc3RUTm9kZSxzKSksYX1jcmVhdGVDb21wb25lbnQodCxuLHIsbyxpLHMsYSl7bGV0IGM9dCYmIXFFKHQpLHU7aWYoYyl1PW47ZWxzZXtsZXQgRD1ufHx7fTt1PUQuaW5kZXgscj1ELmluamVjdG9yLG89RC5wcm9qZWN0YWJsZU5vZGVzLGk9RC5lbnZpcm9ubWVudEluamVjdG9yfHxELm5nTW9kdWxlUmVmLHM9RC5kaXJlY3RpdmVzLGE9RC5iaW5kaW5nc31sZXQgbD1jP3Q6bmV3IFB0KFFlKHQpKSxkPXJ8fHRoaXMucGFyZW50SW5qZWN0b3I7aWYoIWkmJmwubmdNb2R1bGU9PW51bGwpe2xldCBtPShjP2Q6dGhpcy5wYXJlbnRJbmplY3RvcikuZ2V0KHllLG51bGwpO20mJihpPW0pfWxldCBwPVFlKGwuY29tcG9uZW50VHlwZT8/e30pLGY9YnModGhpcy5fbENvbnRhaW5lcixwPy5pZD8/bnVsbCksZz1mPy5maXJzdENoaWxkPz9udWxsLEk9bC5jcmVhdGUoZCxvLGcsaSxzLGEpO3JldHVybiB0aGlzLmluc2VydEltcGwoSS5ob3N0Vmlldyx1LGZyKHRoaXMuX2hvc3RUTm9kZSxmKSksSX1pbnNlcnQodCxuKXtyZXR1cm4gdGhpcy5pbnNlcnRJbXBsKHQsbiwhMCl9aW5zZXJ0SW1wbCh0LG4scil7bGV0IG89dC5fbFZpZXc7aWYod2gobykpe2xldCBhPXRoaXMuaW5kZXhPZih0KTtpZihhIT09LTEpdGhpcy5kZXRhY2goYSk7ZWxzZXtsZXQgYz1vW3RlXSx1PW5ldyBheShjLGNbZmVdLGNbdGVdKTt1LmRldGFjaCh1LmluZGV4T2YodCkpfX1sZXQgaT10aGlzLl9hZGp1c3RJbmRleChuKSxzPXRoaXMuX2xDb250YWluZXI7cmV0dXJuIElvKHMsbyxpLHIpLHQuYXR0YWNoVG9WaWV3Q29udGFpbmVyUmVmKCksSmMoQnUocyksaSx0KSx0fW1vdmUodCxuKXtyZXR1cm4gdGhpcy5pbnNlcnQodCxuKX1pbmRleE9mKHQpe2xldCBuPURnKHRoaXMuX2xDb250YWluZXIpO3JldHVybiBuIT09bnVsbD9uLmluZGV4T2YodCk6LTF9cmVtb3ZlKHQpe2xldCBuPXRoaXMuX2FkanVzdEluZGV4KHQsLTEpLHI9Zm8odGhpcy5fbENvbnRhaW5lcixuKTtyJiYoWnIoQnUodGhpcy5fbENvbnRhaW5lciksbiksenMoclt3XSxyKSl9ZGV0YWNoKHQpe2xldCBuPXRoaXMuX2FkanVzdEluZGV4KHQsLTEpLHI9Zm8odGhpcy5fbENvbnRhaW5lcixuKTtyZXR1cm4gciYmWnIoQnUodGhpcy5fbENvbnRhaW5lciksbikhPW51bGw/bmV3IGt0KHIpOm51bGx9X2FkanVzdEluZGV4KHQsbj0wKXtyZXR1cm4gdD8/dGhpcy5sZW5ndGgrbn19O0tDPWViLEpDPSgpPT4hMTtnbD1jbGFzcyBle3F1ZXJ5TGlzdDttYXRjaGVzPW51bGw7Y29uc3RydWN0b3IodCl7dGhpcy5xdWVyeUxpc3Q9dH1jbG9uZSgpe3JldHVybiBuZXcgZSh0aGlzLnF1ZXJ5TGlzdCl9c2V0RGlydHkoKXt0aGlzLnF1ZXJ5TGlzdC5zZXREaXJ0eSgpfX0sbWw9Y2xhc3MgZXtxdWVyaWVzO2NvbnN0cnVjdG9yKHQ9W10pe3RoaXMucXVlcmllcz10fWNyZWF0ZUVtYmVkZGVkVmlldyh0KXtsZXQgbj10LnF1ZXJpZXM7aWYobiE9PW51bGwpe2xldCByPXQuY29udGVudFF1ZXJpZXMhPT1udWxsP3QuY29udGVudFF1ZXJpZXNbMF06bi5sZW5ndGgsbz1bXTtmb3IobGV0IGk9MDtpPHI7aSsrKXtsZXQgcz1uLmdldEJ5SW5kZXgoaSksYT10aGlzLnF1ZXJpZXNbcy5pbmRleEluRGVjbGFyYXRpb25WaWV3XTtvLnB1c2goYS5jbG9uZSgpKX1yZXR1cm4gbmV3IGUobyl9cmV0dXJuIG51bGx9aW5zZXJ0Vmlldyh0KXt0aGlzLmRpcnR5UXVlcmllc1dpdGhNYXRjaGVzKHQpfWRldGFjaFZpZXcodCl7dGhpcy5kaXJ0eVF1ZXJpZXNXaXRoTWF0Y2hlcyh0KX1maW5pc2hWaWV3Q3JlYXRpb24odCl7dGhpcy5kaXJ0eVF1ZXJpZXNXaXRoTWF0Y2hlcyh0KX1kaXJ0eVF1ZXJpZXNXaXRoTWF0Y2hlcyh0KXtmb3IobGV0IG49MDtuPHRoaXMucXVlcmllcy5sZW5ndGg7bisrKXBkKHQsbikubWF0Y2hlcyE9PW51bGwmJnRoaXMucXVlcmllc1tuXS5zZXREaXJ0eSgpfX0sU3M9Y2xhc3N7ZmxhZ3M7cmVhZDtwcmVkaWNhdGU7Y29uc3RydWN0b3IodCxuLHI9bnVsbCl7dGhpcy5mbGFncz1uLHRoaXMucmVhZD1yLHR5cGVvZiB0PT0ic3RyaW5nIj90aGlzLnByZWRpY2F0ZT1pYih0KTp0aGlzLnByZWRpY2F0ZT10fX0seWw9Y2xhc3MgZXtxdWVyaWVzO2NvbnN0cnVjdG9yKHQ9W10pe3RoaXMucXVlcmllcz10fWVsZW1lbnRTdGFydCh0LG4pe2ZvcihsZXQgcj0wO3I8dGhpcy5xdWVyaWVzLmxlbmd0aDtyKyspdGhpcy5xdWVyaWVzW3JdLmVsZW1lbnRTdGFydCh0LG4pfWVsZW1lbnRFbmQodCl7Zm9yKGxldCBuPTA7bjx0aGlzLnF1ZXJpZXMubGVuZ3RoO24rKyl0aGlzLnF1ZXJpZXNbbl0uZWxlbWVudEVuZCh0KX1lbWJlZGRlZFRWaWV3KHQpe2xldCBuPW51bGw7Zm9yKGxldCByPTA7cjx0aGlzLmxlbmd0aDtyKyspe2xldCBvPW4hPT1udWxsP24ubGVuZ3RoOjAsaT10aGlzLmdldEJ5SW5kZXgocikuZW1iZWRkZWRUVmlldyh0LG8pO2kmJihpLmluZGV4SW5EZWNsYXJhdGlvblZpZXc9cixuIT09bnVsbD9uLnB1c2goaSk6bj1baV0pfXJldHVybiBuIT09bnVsbD9uZXcgZShuKTpudWxsfXRlbXBsYXRlKHQsbil7Zm9yKGxldCByPTA7cjx0aGlzLnF1ZXJpZXMubGVuZ3RoO3IrKyl0aGlzLnF1ZXJpZXNbcl0udGVtcGxhdGUodCxuKX1nZXRCeUluZGV4KHQpe3JldHVybiB0aGlzLnF1ZXJpZXNbdF19Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLnF1ZXJpZXMubGVuZ3RofXRyYWNrKHQpe3RoaXMucXVlcmllcy5wdXNoKHQpfX0sdmw9Y2xhc3MgZXttZXRhZGF0YTttYXRjaGVzPW51bGw7aW5kZXhJbkRlY2xhcmF0aW9uVmlldz0tMTtjcm9zc2VzTmdUZW1wbGF0ZT0hMTtfZGVjbGFyYXRpb25Ob2RlSW5kZXg7X2FwcGxpZXNUb05leHROb2RlPSEwO2NvbnN0cnVjdG9yKHQsbj0tMSl7dGhpcy5tZXRhZGF0YT10LHRoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4PW59ZWxlbWVudFN0YXJ0KHQsbil7dGhpcy5pc0FwcGx5aW5nVG9Ob2RlKG4pJiZ0aGlzLm1hdGNoVE5vZGUodCxuKX1lbGVtZW50RW5kKHQpe3RoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4PT09dC5pbmRleCYmKHRoaXMuX2FwcGxpZXNUb05leHROb2RlPSExKX10ZW1wbGF0ZSh0LG4pe3RoaXMuZWxlbWVudFN0YXJ0KHQsbil9ZW1iZWRkZWRUVmlldyh0LG4pe3JldHVybiB0aGlzLmlzQXBwbHlpbmdUb05vZGUodCk/KHRoaXMuY3Jvc3Nlc05nVGVtcGxhdGU9ITAsdGhpcy5hZGRNYXRjaCgtdC5pbmRleCxuKSxuZXcgZSh0aGlzLm1ldGFkYXRhKSk6bnVsbH1pc0FwcGx5aW5nVG9Ob2RlKHQpe2lmKHRoaXMuX2FwcGxpZXNUb05leHROb2RlJiYodGhpcy5tZXRhZGF0YS5mbGFncyYxKSE9PTEpe2xldCBuPXRoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4LHI9dC5wYXJlbnQ7Zm9yKDtyIT09bnVsbCYmci50eXBlJjgmJnIuaW5kZXghPT1uOylyPXIucGFyZW50O3JldHVybiBuPT09KHIhPT1udWxsP3IuaW5kZXg6LTEpfXJldHVybiB0aGlzLl9hcHBsaWVzVG9OZXh0Tm9kZX1tYXRjaFROb2RlKHQsbil7bGV0IHI9dGhpcy5tZXRhZGF0YS5wcmVkaWNhdGU7aWYoQXJyYXkuaXNBcnJheShyKSlmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKyl7bGV0IGk9cltvXTt0aGlzLm1hdGNoVE5vZGVXaXRoUmVhZE9wdGlvbih0LG4sdGIobixpKSksdGhpcy5tYXRjaFROb2RlV2l0aFJlYWRPcHRpb24odCxuLGZzKG4sdCxpLCExLCExKSl9ZWxzZSByPT09bnQ/bi50eXBlJjQmJnRoaXMubWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHQsbiwtMSk6dGhpcy5tYXRjaFROb2RlV2l0aFJlYWRPcHRpb24odCxuLGZzKG4sdCxyLCExLCExKSl9bWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHQsbixyKXtpZihyIT09bnVsbCl7bGV0IG89dGhpcy5tZXRhZGF0YS5yZWFkO2lmKG8hPT1udWxsKWlmKG89PT1FdHx8bz09PW90fHxvPT09bnQmJm4udHlwZSY0KXRoaXMuYWRkTWF0Y2gobi5pbmRleCwtMik7ZWxzZXtsZXQgaT1mcyhuLHQsbywhMSwhMSk7aSE9PW51bGwmJnRoaXMuYWRkTWF0Y2gobi5pbmRleCxpKX1lbHNlIHRoaXMuYWRkTWF0Y2gobi5pbmRleCxyKX19YWRkTWF0Y2godCxuKXt0aGlzLm1hdGNoZXM9PT1udWxsP3RoaXMubWF0Y2hlcz1bdCxuXTp0aGlzLm1hdGNoZXMucHVzaCh0LG4pfX07Q249Y2xhc3N7fSx5eT1jbGFzc3t9LE5zPWNsYXNzIGV4dGVuZHMgQ257bmdNb2R1bGVUeXBlO19wYXJlbnQ7X2Jvb3RzdHJhcENvbXBvbmVudHM9W107X3IzSW5qZWN0b3I7aW5zdGFuY2U7ZGVzdHJveUNicz1bXTtjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI9bmV3IF9zKHRoaXMpO2NvbnN0cnVjdG9yKHQsbixyLG89ITApe3N1cGVyKCksdGhpcy5uZ01vZHVsZVR5cGU9dCx0aGlzLl9wYXJlbnQ9bjtsZXQgaT10dSh0KTt0aGlzLl9ib290c3RyYXBDb21wb25lbnRzPXZtKGkuYm9vdHN0cmFwKSx0aGlzLl9yM0luamVjdG9yPU51KHQsbixbe3Byb3ZpZGU6Q24sdXNlVmFsdWU6dGhpc30se3Byb3ZpZGU6d28sdXNlVmFsdWU6dGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJ9LC4uLnJdLGZ0KHQpLG5ldyBTZXQoWyJlbnZpcm9ubWVudCJdKSksbyYmdGhpcy5yZXNvbHZlSW5qZWN0b3JJbml0aWFsaXplcnMoKX1yZXNvbHZlSW5qZWN0b3JJbml0aWFsaXplcnMoKXt0aGlzLl9yM0luamVjdG9yLnJlc29sdmVJbmplY3RvckluaXRpYWxpemVycygpLHRoaXMuaW5zdGFuY2U9dGhpcy5fcjNJbmplY3Rvci5nZXQodGhpcy5uZ01vZHVsZVR5cGUpfWdldCBpbmplY3Rvcigpe3JldHVybiB0aGlzLl9yM0luamVjdG9yfWRlc3Ryb3koKXtsZXQgdD10aGlzLl9yM0luamVjdG9yOyF0LmRlc3Ryb3llZCYmdC5kZXN0cm95KCksdGhpcy5kZXN0cm95Q2JzLmZvckVhY2gobj0+bigpKSx0aGlzLmRlc3Ryb3lDYnM9bnVsbH1vbkRlc3Ryb3kodCl7dGhpcy5kZXN0cm95Q2JzLnB1c2godCl9fSxBcz1jbGFzcyBleHRlbmRzIHl5e21vZHVsZVR5cGU7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLm1vZHVsZVR5cGU9dH1jcmVhdGUodCl7cmV0dXJuIG5ldyBOcyh0aGlzLm1vZHVsZVR5cGUsdCxbXSl9fSxobz1jbGFzcyBleHRlbmRzIENue2luamVjdG9yO2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcj1uZXcgX3ModGhpcyk7aW5zdGFuY2U9bnVsbDtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO2xldCBuPW5ldyBhbihbLi4udC5wcm92aWRlcnMse3Byb3ZpZGU6Q24sdXNlVmFsdWU6dGhpc30se3Byb3ZpZGU6d28sdXNlVmFsdWU6dGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJ9XSx0LnBhcmVudHx8Sm4oKSx0LmRlYnVnTmFtZSxuZXcgU2V0KFsiZW52aXJvbm1lbnQiXSkpO3RoaXMuaW5qZWN0b3I9bix0LnJ1bkVudmlyb25tZW50SW5pdGlhbGl6ZXJzJiZuLnJlc29sdmVJbmplY3RvckluaXRpYWxpemVycygpfWRlc3Ryb3koKXt0aGlzLmluamVjdG9yLmRlc3Ryb3koKX1vbkRlc3Ryb3kodCl7dGhpcy5pbmplY3Rvci5vbkRlc3Ryb3kodCl9fTtjYj0oKCk9PntjbGFzcyBle19pbmplY3RvcjtjYWNoZWRJbmplY3RvcnM9bmV3IE1hcDtjb25zdHJ1Y3RvcihuKXt0aGlzLl9pbmplY3Rvcj1ufWdldE9yQ3JlYXRlU3RhbmRhbG9uZUluamVjdG9yKG4pe2lmKCFuLnN0YW5kYWxvbmUpcmV0dXJuIG51bGw7aWYoIXRoaXMuY2FjaGVkSW5qZWN0b3JzLmhhcyhuKSl7bGV0IHI9bnUoITEsbi50eXBlKSxvPXIubGVuZ3RoPjA/dnkoW3JdLHRoaXMuX2luamVjdG9yLGBTdGFuZGFsb25lWyR7bi50eXBlLm5hbWV9XWApOm51bGw7dGhpcy5jYWNoZWRJbmplY3RvcnMuc2V0KG4sbyl9cmV0dXJuIHRoaXMuY2FjaGVkSW5qZWN0b3JzLmdldChuKX1uZ09uRGVzdHJveSgpe3RyeXtmb3IobGV0IG4gb2YgdGhpcy5jYWNoZWRJbmplY3RvcnMudmFsdWVzKCkpbiE9PW51bGwmJm4uZGVzdHJveSgpfWZpbmFsbHl7dGhpcy5jYWNoZWRJbmplY3RvcnMuY2xlYXIoKX19c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxwcm92aWRlZEluOiJlbnZpcm9ubWVudCIsZmFjdG9yeTooKT0+bmV3IGUoQyh5ZSkpfSl9cmV0dXJuIGV9KSgpO2JiPVRiO195PSgoKT0+e2NsYXNzIGV7bG9nKG4pe2NvbnNvbGUubG9nKG4pfXdhcm4obil7Y29uc29sZS53YXJuKG4pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKX07c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxmYWN0b3J5OmUuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InBsYXRmb3JtIn0pfXJldHVybiBlfSkoKTtKcz1uZXcgVCgiIiksdnI9bmV3IFQoIiIpLFRvPSgoKT0+e2NsYXNzIGV7X25nWm9uZTtyZWdpc3RyeTtfaXNab25lU3RhYmxlPSEwO19jYWxsYmFja3M9W107X3Rhc2tUcmFja2luZ1pvbmU9bnVsbDtfZGVzdHJveVJlZjtjb25zdHJ1Y3RvcihuLHIsbyl7dGhpcy5fbmdab25lPW4sdGhpcy5yZWdpc3RyeT1yLGl1KCkmJih0aGlzLl9kZXN0cm95UmVmPXkoQWUse29wdGlvbmFsOiEwfSk/P3ZvaWQgMCksbWR8fChNeShvKSxvLmFkZFRvV2luZG93KHIpKSx0aGlzLl93YXRjaEFuZ3VsYXJFdmVudHMoKSxuLnJ1bigoKT0+e3RoaXMuX3Rhc2tUcmFja2luZ1pvbmU9dHlwZW9mIFpvbmU+InUiP251bGw6Wm9uZS5jdXJyZW50LmdldCgiVGFza1RyYWNraW5nWm9uZSIpfSl9X3dhdGNoQW5ndWxhckV2ZW50cygpe2xldCBuPXRoaXMuX25nWm9uZS5vblVuc3RhYmxlLnN1YnNjcmliZSh7bmV4dDooKT0+e3RoaXMuX2lzWm9uZVN0YWJsZT0hMX19KSxyPXRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+dGhpcy5fbmdab25lLm9uU3RhYmxlLnN1YnNjcmliZSh7bmV4dDooKT0+e3ouYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpLHF1ZXVlTWljcm90YXNrKCgpPT57dGhpcy5faXNab25lU3RhYmxlPSEwLHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKX0pfX0pKTt0aGlzLl9kZXN0cm95UmVmPy5vbkRlc3Ryb3koKCk9PntuLnVuc3Vic2NyaWJlKCksci51bnN1YnNjcmliZSgpfSl9aXNTdGFibGUoKXtyZXR1cm4gdGhpcy5faXNab25lU3RhYmxlJiYhdGhpcy5fbmdab25lLmhhc1BlbmRpbmdNYWNyb3Rhc2tzfV9ydW5DYWxsYmFja3NJZlJlYWR5KCl7aWYodGhpcy5pc1N0YWJsZSgpKXF1ZXVlTWljcm90YXNrKCgpPT57Zm9yKDt0aGlzLl9jYWxsYmFja3MubGVuZ3RoIT09MDspe2xldCBuPXRoaXMuX2NhbGxiYWNrcy5wb3AoKTtjbGVhclRpbWVvdXQobi50aW1lb3V0SWQpLG4uZG9uZUNiKCl9fSk7ZWxzZXtsZXQgbj10aGlzLmdldFBlbmRpbmdUYXNrcygpO3RoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3MuZmlsdGVyKHI9PnIudXBkYXRlQ2ImJnIudXBkYXRlQ2Iobik/KGNsZWFyVGltZW91dChyLnRpbWVvdXRJZCksITEpOiEwKX19Z2V0UGVuZGluZ1Rhc2tzKCl7cmV0dXJuIHRoaXMuX3Rhc2tUcmFja2luZ1pvbmU/dGhpcy5fdGFza1RyYWNraW5nWm9uZS5tYWNyb1Rhc2tzLm1hcChuPT4oe3NvdXJjZTpuLnNvdXJjZSxjcmVhdGlvbkxvY2F0aW9uOm4uY3JlYXRpb25Mb2NhdGlvbixkYXRhOm4uZGF0YX0pKTpbXX1hZGRDYWxsYmFjayhuLHIsbyl7bGV0IGk9LTE7ciYmcj4wJiYoaT1zZXRUaW1lb3V0KCgpPT57dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrcy5maWx0ZXIocz0+cy50aW1lb3V0SWQhPT1pKSxuKCl9LHIpKSx0aGlzLl9jYWxsYmFja3MucHVzaCh7ZG9uZUNiOm4sdGltZW91dElkOmksdXBkYXRlQ2I6b30pfXdoZW5TdGFibGUobixyLG8pe2lmKG8mJiF0aGlzLl90YXNrVHJhY2tpbmdab25lKXRocm93IG5ldyBFcnJvcignVGFzayB0cmFja2luZyB6b25lIGlzIHJlcXVpcmVkIHdoZW4gcGFzc2luZyBhbiB1cGRhdGUgY2FsbGJhY2sgdG8gd2hlblN0YWJsZSgpLiBJcyAiem9uZS5qcy9wbHVnaW5zL3Rhc2stdHJhY2tpbmciIGxvYWRlZD8nKTt0aGlzLmFkZENhbGxiYWNrKG4scixvKSx0aGlzLl9ydW5DYWxsYmFja3NJZlJlYWR5KCl9cmVnaXN0ZXJBcHBsaWNhdGlvbihuKXt0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyQXBwbGljYXRpb24obix0aGlzKX11bnJlZ2lzdGVyQXBwbGljYXRpb24obil7dGhpcy5yZWdpc3RyeS51bnJlZ2lzdGVyQXBwbGljYXRpb24obil9ZmluZFByb3ZpZGVycyhuLHIsbyl7cmV0dXJuW119c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpKEMoeiksQyhfbyksQyh2cikpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6ZS5cdTAyNzVmYWN9KX1yZXR1cm4gZX0pKCksX289KCgpPT57Y2xhc3MgZXtfYXBwbGljYXRpb25zPW5ldyBNYXA7cmVnaXN0ZXJBcHBsaWNhdGlvbihuLHIpe3RoaXMuX2FwcGxpY2F0aW9ucy5zZXQobixyKX11bnJlZ2lzdGVyQXBwbGljYXRpb24obil7dGhpcy5fYXBwbGljYXRpb25zLmRlbGV0ZShuKX11bnJlZ2lzdGVyQWxsQXBwbGljYXRpb25zKCl7dGhpcy5fYXBwbGljYXRpb25zLmNsZWFyKCl9Z2V0VGVzdGFiaWxpdHkobil7cmV0dXJuIHRoaXMuX2FwcGxpY2F0aW9ucy5nZXQobil8fG51bGx9Z2V0QWxsVGVzdGFiaWxpdGllcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuX2FwcGxpY2F0aW9ucy52YWx1ZXMoKSl9Z2V0QWxsUm9vdEVsZW1lbnRzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fYXBwbGljYXRpb25zLmtleXMoKSl9ZmluZFRlc3RhYmlsaXR5SW5UcmVlKG4scj0hMCl7cmV0dXJuIG1kPy5maW5kVGVzdGFiaWxpdHlJblRyZWUodGhpcyxuLHIpPz9udWxsfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKX07c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxmYWN0b3J5OmUuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InBsYXRmb3JtIn0pfXJldHVybiBlfSkoKTt5ZD1uZXcgVCgiIik7dmQ9KCgpPT57Y2xhc3MgZXtyZXNvbHZlO3JlamVjdDtpbml0aWFsaXplZD0hMTtkb25lPSExO2RvbmVQcm9taXNlPW5ldyBQcm9taXNlKChuLHIpPT57dGhpcy5yZXNvbHZlPW4sdGhpcy5yZWplY3Q9cn0pO2FwcEluaXRzPXkoeWQse29wdGlvbmFsOiEwfSk/P1tdO2luamVjdG9yPXkodmUpO2NvbnN0cnVjdG9yKCl7fXJ1bkluaXRpYWxpemVycygpe2lmKHRoaXMuaW5pdGlhbGl6ZWQpcmV0dXJuO2xldCBuPVtdO2ZvcihsZXQgbyBvZiB0aGlzLmFwcEluaXRzKXtsZXQgaT1Ybih0aGlzLmluamVjdG9yLG8pO2lmKE1vKGkpKW4ucHVzaChpKTtlbHNlIGlmKFhzKGkpKXtsZXQgcz1uZXcgUHJvbWlzZSgoYSxjKT0+e2kuc3Vic2NyaWJlKHtjb21wbGV0ZTphLGVycm9yOmN9KX0pO24ucHVzaChzKX19bGV0IHI9KCk9Pnt0aGlzLmRvbmU9ITAsdGhpcy5yZXNvbHZlKCl9O1Byb21pc2UuYWxsKG4pLnRoZW4oKCk9PntyKCl9KS5jYXRjaChvPT57dGhpcy5yZWplY3Qobyl9KSxuLmxlbmd0aD09PTAmJnIoKSx0aGlzLmluaXRpYWxpemVkPSEwfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKX07c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxmYWN0b3J5OmUuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGV9KSgpLFN5PW5ldyBUKCIiKTtNYj0xMCxUbj0oKCk9PntjbGFzcyBle19ydW5uaW5nVGljaz0hMTtfZGVzdHJveWVkPSExO19kZXN0cm95TGlzdGVuZXJzPVtdO192aWV3cz1bXTtpbnRlcm5hbEVycm9ySGFuZGxlcj15KEJlKTthZnRlclJlbmRlck1hbmFnZXI9eSgkcyk7em9uZWxlc3NFbmFibGVkPXkocm8pO3Jvb3RFZmZlY3RTY2hlZHVsZXI9eShvbyk7ZGlydHlGbGFncz0wO3RyYWNpbmdTbmFwc2hvdD1udWxsO2FsbFRlc3RWaWV3cz1uZXcgU2V0O2F1dG9EZXRlY3RUZXN0Vmlld3M9bmV3IFNldDtpbmNsdWRlQWxsVGVzdFZpZXdzPSExO2FmdGVyVGljaz1uZXcgZ2U7Z2V0IGFsbFZpZXdzKCl7cmV0dXJuWy4uLih0aGlzLmluY2x1ZGVBbGxUZXN0Vmlld3M/dGhpcy5hbGxUZXN0Vmlld3M6dGhpcy5hdXRvRGV0ZWN0VGVzdFZpZXdzKS5rZXlzKCksLi4udGhpcy5fdmlld3NdfWdldCBkZXN0cm95ZWQoKXtyZXR1cm4gdGhpcy5fZGVzdHJveWVkfWNvbXBvbmVudFR5cGVzPVtdO2NvbXBvbmVudHM9W107aW50ZXJuYWxQZW5kaW5nVGFzaz15KEZ0KTtnZXQgaXNTdGFibGUoKXtyZXR1cm4gdGhpcy5pbnRlcm5hbFBlbmRpbmdUYXNrLmhhc1BlbmRpbmdUYXNrc09ic2VydmFibGUucGlwZShsZShuPT4hbikpfWNvbnN0cnVjdG9yKCl7eShMdCx7b3B0aW9uYWw6ITB9KX13aGVuU3RhYmxlKCl7bGV0IG47cmV0dXJuIG5ldyBQcm9taXNlKHI9PntuPXRoaXMuaXNTdGFibGUuc3Vic2NyaWJlKHtuZXh0Om89PntvJiZyKCl9fSl9KS5maW5hbGx5KCgpPT57bi51bnN1YnNjcmliZSgpfSl9X2luamVjdG9yPXkoeWUpO19yZW5kZXJlckZhY3Rvcnk9bnVsbDtnZXQgaW5qZWN0b3IoKXtyZXR1cm4gdGhpcy5faW5qZWN0b3J9Ym9vdHN0cmFwKG4scil7cmV0dXJuIHRoaXMuYm9vdHN0cmFwSW1wbChuLHIpfWJvb3RzdHJhcEltcGwobixyLG89dmUuTlVMTCl7cmV0dXJuIHRoaXMuX2luamVjdG9yLmdldCh6KS5ydW4oKCk9PntMKDEwKTtsZXQgcz1uIGluc3RhbmNlb2YgWXM7aWYoIXRoaXMuX2luamVjdG9yLmdldCh2ZCkuZG9uZSl7bGV0IGc9IiI7dGhyb3cgbmV3IHYoNDA1LGcpfWxldCBjO3M/Yz1uOmM9dGhpcy5faW5qZWN0b3IuZ2V0KHdvKS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShuKSx0aGlzLmNvbXBvbmVudFR5cGVzLnB1c2goYy5jb21wb25lbnRUeXBlKTtsZXQgdT1BeShjKT92b2lkIDA6dGhpcy5faW5qZWN0b3IuZ2V0KENuKSxsPXJ8fGMuc2VsZWN0b3IsZD1jLmNyZWF0ZShvLFtdLGwsdSkscD1kLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQsZj1kLmluamVjdG9yLmdldChKcyxudWxsKTtyZXR1cm4gZj8ucmVnaXN0ZXJBcHBsaWNhdGlvbihwKSxkLm9uRGVzdHJveSgoKT0+e3RoaXMuZGV0YWNoVmlldyhkLmhvc3RWaWV3KSxhbyh0aGlzLmNvbXBvbmVudHMsZCksZj8udW5yZWdpc3RlckFwcGxpY2F0aW9uKHApfSksdGhpcy5fbG9hZENvbXBvbmVudChkKSxMKDExLGQpLGR9KX10aWNrKCl7dGhpcy56b25lbGVzc0VuYWJsZWR8fCh0aGlzLmRpcnR5RmxhZ3N8PTEpLHRoaXMuX3RpY2soKX1fdGljaygpe0woMTIpLHRoaXMudHJhY2luZ1NuYXBzaG90IT09bnVsbD90aGlzLnRyYWNpbmdTbmFwc2hvdC5ydW4oVXMuQ0hBTkdFX0RFVEVDVElPTix0aGlzLnRpY2tJbXBsKTp0aGlzLnRpY2tJbXBsKCl9dGlja0ltcGw9KCk9PntpZih0aGlzLl9ydW5uaW5nVGljayl0aHJvdyBuZXcgdigxMDEsITEpO2xldCBuPU0obnVsbCk7dHJ5e3RoaXMuX3J1bm5pbmdUaWNrPSEwLHRoaXMuc3luY2hyb25pemUoKX1maW5hbGx5e3RoaXMuX3J1bm5pbmdUaWNrPSExLHRoaXMudHJhY2luZ1NuYXBzaG90Py5kaXNwb3NlKCksdGhpcy50cmFjaW5nU25hcHNob3Q9bnVsbCxNKG4pLHRoaXMuYWZ0ZXJUaWNrLm5leHQoKSxMKDEzKX19O3N5bmNocm9uaXplKCl7dGhpcy5fcmVuZGVyZXJGYWN0b3J5PT09bnVsbCYmIXRoaXMuX2luamVjdG9yLmRlc3Ryb3llZCYmKHRoaXMuX3JlbmRlcmVyRmFjdG9yeT10aGlzLl9pbmplY3Rvci5nZXQod24sbnVsbCx7b3B0aW9uYWw6ITB9KSk7bGV0IG49MDtmb3IoO3RoaXMuZGlydHlGbGFncyE9PTAmJm4rKzxNYjspTCgxNCksdGhpcy5zeW5jaHJvbml6ZU9uY2UoKSxMKDE1KX1zeW5jaHJvbml6ZU9uY2UoKXt0aGlzLmRpcnR5RmxhZ3MmMTYmJih0aGlzLmRpcnR5RmxhZ3MmPS0xNyx0aGlzLnJvb3RFZmZlY3RTY2hlZHVsZXIuZmx1c2goKSk7bGV0IG49ITE7aWYodGhpcy5kaXJ0eUZsYWdzJjcpe2xldCByPSEhKHRoaXMuZGlydHlGbGFncyYxKTt0aGlzLmRpcnR5RmxhZ3MmPS04LHRoaXMuZGlydHlGbGFnc3w9ODtmb3IobGV0e19sVmlldzpvfW9mIHRoaXMuYWxsVmlld3Mpe2lmKCFyJiYhWHIobykpY29udGludWU7bGV0IGk9ciYmIXRoaXMuem9uZWxlc3NFbmFibGVkPzA6MTt6bShvLGkpLG49ITB9aWYodGhpcy5kaXJ0eUZsYWdzJj0tNSx0aGlzLnN5bmNEaXJ0eUZsYWdzV2l0aFZpZXdzKCksdGhpcy5kaXJ0eUZsYWdzJjIzKXJldHVybn1ufHwodGhpcy5fcmVuZGVyZXJGYWN0b3J5Py5iZWdpbj8uKCksdGhpcy5fcmVuZGVyZXJGYWN0b3J5Py5lbmQ/LigpKSx0aGlzLmRpcnR5RmxhZ3MmOCYmKHRoaXMuZGlydHlGbGFncyY9LTksdGhpcy5hZnRlclJlbmRlck1hbmFnZXIuZXhlY3V0ZSgpKSx0aGlzLnN5bmNEaXJ0eUZsYWdzV2l0aFZpZXdzKCl9c3luY0RpcnR5RmxhZ3NXaXRoVmlld3MoKXtpZih0aGlzLmFsbFZpZXdzLnNvbWUoKHtfbFZpZXc6bn0pPT5YcihuKSkpe3RoaXMuZGlydHlGbGFnc3w9MjtyZXR1cm59ZWxzZSB0aGlzLmRpcnR5RmxhZ3MmPS04fWF0dGFjaFZpZXcobil7bGV0IHI9bjt0aGlzLl92aWV3cy5wdXNoKHIpLHIuYXR0YWNoVG9BcHBSZWYodGhpcyl9ZGV0YWNoVmlldyhuKXtsZXQgcj1uO2FvKHRoaXMuX3ZpZXdzLHIpLHIuZGV0YWNoRnJvbUFwcFJlZigpfV9sb2FkQ29tcG9uZW50KG4pe3RoaXMuYXR0YWNoVmlldyhuLmhvc3RWaWV3KTt0cnl7dGhpcy50aWNrKCl9Y2F0Y2gobyl7dGhpcy5pbnRlcm5hbEVycm9ySGFuZGxlcihvKX10aGlzLmNvbXBvbmVudHMucHVzaChuKSx0aGlzLl9pbmplY3Rvci5nZXQoU3ksW10pLmZvckVhY2gobz0+byhuKSl9bmdPbkRlc3Ryb3koKXtpZighdGhpcy5fZGVzdHJveWVkKXRyeXt0aGlzLl9kZXN0cm95TGlzdGVuZXJzLmZvckVhY2gobj0+bigpKSx0aGlzLl92aWV3cy5zbGljZSgpLmZvckVhY2gobj0+bi5kZXN0cm95KCkpfWZpbmFsbHl7dGhpcy5fZGVzdHJveWVkPSEwLHRoaXMuX3ZpZXdzPVtdLHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnM9W119fW9uRGVzdHJveShuKXtyZXR1cm4gdGhpcy5fZGVzdHJveUxpc3RlbmVycy5wdXNoKG4pLCgpPT5hbyh0aGlzLl9kZXN0cm95TGlzdGVuZXJzLG4pfWRlc3Ryb3koKXtpZih0aGlzLl9kZXN0cm95ZWQpdGhyb3cgbmV3IHYoNDA2LCExKTtsZXQgbj10aGlzLl9pbmplY3RvcjtuLmRlc3Ryb3kmJiFuLmRlc3Ryb3llZCYmbi5kZXN0cm95KCl9Z2V0IHZpZXdDb3VudCgpe3JldHVybiB0aGlzLl92aWV3cy5sZW5ndGh9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6ZS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gZX0pKCk7V1A9dHlwZW9mIGRvY3VtZW50PCJ1IiYmdHlwZW9mIGRvY3VtZW50Py5kb2N1bWVudEVsZW1lbnQ/LmdldEFuaW1hdGlvbnM9PSJmdW5jdGlvbiI7SWw9Y2xhc3N7ZGVzdHJveSh0KXt9dXBkYXRlVmFsdWUodCxuKXt9c3dhcCh0LG4pe2xldCByPU1hdGgubWluKHQsbiksbz1NYXRoLm1heCh0LG4pLGk9dGhpcy5kZXRhY2gobyk7aWYoby1yPjEpe2xldCBzPXRoaXMuZGV0YWNoKHIpO3RoaXMuYXR0YWNoKHIsaSksdGhpcy5hdHRhY2gobyxzKX1lbHNlIHRoaXMuYXR0YWNoKHIsaSl9bW92ZSh0LG4pe3RoaXMuYXR0YWNoKG4sdGhpcy5kZXRhY2godCkpfX07eHM9Y2xhc3N7a3ZNYXA9bmV3IE1hcDtfdk1hcD12b2lkIDA7aGFzKHQpe3JldHVybiB0aGlzLmt2TWFwLmhhcyh0KX1kZWxldGUodCl7aWYoIXRoaXMuaGFzKHQpKXJldHVybiExO2xldCBuPXRoaXMua3ZNYXAuZ2V0KHQpO3JldHVybiB0aGlzLl92TWFwIT09dm9pZCAwJiZ0aGlzLl92TWFwLmhhcyhuKT8odGhpcy5rdk1hcC5zZXQodCx0aGlzLl92TWFwLmdldChuKSksdGhpcy5fdk1hcC5kZWxldGUobikpOnRoaXMua3ZNYXAuZGVsZXRlKHQpLCEwfWdldCh0KXtyZXR1cm4gdGhpcy5rdk1hcC5nZXQodCl9c2V0KHQsbil7aWYodGhpcy5rdk1hcC5oYXModCkpe2xldCByPXRoaXMua3ZNYXAuZ2V0KHQpO3RoaXMuX3ZNYXA9PT12b2lkIDAmJih0aGlzLl92TWFwPW5ldyBNYXApO2xldCBvPXRoaXMuX3ZNYXA7Zm9yKDtvLmhhcyhyKTspcj1vLmdldChyKTtvLnNldChyLG4pfWVsc2UgdGhpcy5rdk1hcC5zZXQodCxuKX1mb3JFYWNoKHQpe2ZvcihsZXRbbixyXW9mIHRoaXMua3ZNYXApaWYodChyLG4pLHRoaXMuX3ZNYXAhPT12b2lkIDApe2xldCBvPXRoaXMuX3ZNYXA7Zm9yKDtvLmhhcyhyKTspcj1vLmdldChyKSx0KHIsbil9fX07Q2w9Y2xhc3N7bENvbnRhaW5lcjskaW1wbGljaXQ7JGluZGV4O2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLmxDb250YWluZXI9dCx0aGlzLiRpbXBsaWNpdD1uLHRoaXMuJGluZGV4PXJ9Z2V0ICRjb3VudCgpe3JldHVybiB0aGlzLmxDb250YWluZXIubGVuZ3RoLVp9fTtibD1jbGFzc3toYXNFbXB0eUJsb2NrO3RyYWNrQnlGbjtsaXZlQ29sbGVjdGlvbjtjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5oYXNFbXB0eUJsb2NrPXQsdGhpcy50cmFja0J5Rm49bix0aGlzLmxpdmVDb2xsZWN0aW9uPXJ9fTtUbD1jbGFzcyBleHRlbmRzIElse2xDb250YWluZXI7aG9zdExWaWV3O3RlbXBsYXRlVE5vZGU7b3BlcmF0aW9uc0NvdW50ZXI9dm9pZCAwO25lZWRzSW5kZXhVcGRhdGU9ITE7Y29uc3RydWN0b3IodCxuLHIpe3N1cGVyKCksdGhpcy5sQ29udGFpbmVyPXQsdGhpcy5ob3N0TFZpZXc9bix0aGlzLnRlbXBsYXRlVE5vZGU9cn1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMubENvbnRhaW5lci5sZW5ndGgtWn1hdCh0KXtyZXR1cm4gdGhpcy5nZXRMVmlldyh0KVtxXS4kaW1wbGljaXR9YXR0YWNoKHQsbil7bGV0IHI9blt1bl07dGhpcy5uZWVkc0luZGV4VXBkYXRlfHw9dCE9PXRoaXMubGVuZ3RoLElvKHRoaXMubENvbnRhaW5lcixuLHQsZnIodGhpcy50ZW1wbGF0ZVROb2RlLHIpKSxQYih0aGlzLmxDb250YWluZXIsdCl9ZGV0YWNoKHQpe3JldHVybiB0aGlzLm5lZWRzSW5kZXhVcGRhdGV8fD10IT09dGhpcy5sZW5ndGgtMSxMYih0aGlzLmxDb250YWluZXIsdCksamIodGhpcy5sQ29udGFpbmVyLHQpfWNyZWF0ZSh0LG4pe2xldCByPWJzKHRoaXMubENvbnRhaW5lcix0aGlzLnRlbXBsYXRlVE5vZGUudFZpZXcuc3NySWQpLG89RW8odGhpcy5ob3N0TFZpZXcsdGhpcy50ZW1wbGF0ZVROb2RlLG5ldyBDbCh0aGlzLmxDb250YWluZXIsbix0KSx7ZGVoeWRyYXRlZFZpZXc6cn0pO3JldHVybiB0aGlzLm9wZXJhdGlvbnNDb3VudGVyPy5yZWNvcmRDcmVhdGUoKSxvfWRlc3Ryb3kodCl7enModFt3XSx0KSx0aGlzLm9wZXJhdGlvbnNDb3VudGVyPy5yZWNvcmREZXN0cm95KCl9dXBkYXRlVmFsdWUodCxuKXt0aGlzLmdldExWaWV3KHQpW3FdLiRpbXBsaWNpdD1ufXJlc2V0KCl7dGhpcy5uZWVkc0luZGV4VXBkYXRlPSExLHRoaXMub3BlcmF0aW9uc0NvdW50ZXI/LnJlc2V0KCl9dXBkYXRlSW5kZXhlcygpe2lmKHRoaXMubmVlZHNJbmRleFVwZGF0ZSlmb3IobGV0IHQ9MDt0PHRoaXMubGVuZ3RoO3QrKyl0aGlzLmdldExWaWV3KHQpW3FdLiRpbmRleD10fWdldExWaWV3KHQpe3JldHVybiBCYih0aGlzLmxDb250YWluZXIsdCl9fTtQeT0oZSx0LG4scixvKT0+KG5vKCEwKSxmbSh0W1BdLHIsJGgoKSkpO1ZiPShlLHQsbixyLG8pPT4obm8oITApLFpJKHRbUF0sIiIpKTtjcz12b2lkIDA7JGI9WyJlbiIsW1siYSIsInAiXSxbIkFNIiwiUE0iXV0sW1siQU0iLCJQTSJdXSxbWyJTIiwiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIl0sWyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sWyJTdSIsIk1vIiwiVHUiLCJXZSIsIlRoIiwiRnIiLCJTYSJdXSxjcyxbWyJKIiwiRiIsIk0iLCJBIiwiTSIsIkoiLCJKIiwiQSIsIlMiLCJPIiwiTiIsIkQiXSxbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLFsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXV0sY3MsW1siQiIsIkEiXSxbIkJDIiwiQUQiXSxbIkJlZm9yZSBDaHJpc3QiLCJBbm5vIERvbWluaSJdXSwwLFs2LDBdLFsiTS9kL3l5IiwiTU1NIGQsIHkiLCJNTU1NIGQsIHkiLCJFRUVFLCBNTU1NIGQsIHkiXSxbImg6bW0gYSIsImg6bW06c3MgYSIsImg6bW06c3MgYSB6IiwiaDptbTpzcyBhIHp6enoiXSxbInsxfSwgezB9IixjcywiezF9ICdhdCcgezB9Iixjc10sWyIuIiwiLCIsIjsiLCIlIiwiKyIsIi0iLCJFIiwiXHhENyIsIlx1MjAzMCIsIlx1MjIxRSIsIk5hTiIsIjoiXSxbIiMsIyMwLiMjIyIsIiMsIyMwJSIsIlx4QTQjLCMjMC4wMCIsIiNFMCJdLCJVU0QiLCIkIiwiVVMgRG9sbGFyIix7fSwibHRyIixVYl0sVXU9e307X249KGZ1bmN0aW9uKGUpe3JldHVybiBlW2UuTG9jYWxlSWQ9MF09IkxvY2FsZUlkIixlW2UuRGF5UGVyaW9kc0Zvcm1hdD0xXT0iRGF5UGVyaW9kc0Zvcm1hdCIsZVtlLkRheVBlcmlvZHNTdGFuZGFsb25lPTJdPSJEYXlQZXJpb2RzU3RhbmRhbG9uZSIsZVtlLkRheXNGb3JtYXQ9M109IkRheXNGb3JtYXQiLGVbZS5EYXlzU3RhbmRhbG9uZT00XT0iRGF5c1N0YW5kYWxvbmUiLGVbZS5Nb250aHNGb3JtYXQ9NV09Ik1vbnRoc0Zvcm1hdCIsZVtlLk1vbnRoc1N0YW5kYWxvbmU9Nl09Ik1vbnRoc1N0YW5kYWxvbmUiLGVbZS5FcmFzPTddPSJFcmFzIixlW2UuRmlyc3REYXlPZldlZWs9OF09IkZpcnN0RGF5T2ZXZWVrIixlW2UuV2Vla2VuZFJhbmdlPTldPSJXZWVrZW5kUmFuZ2UiLGVbZS5EYXRlRm9ybWF0PTEwXT0iRGF0ZUZvcm1hdCIsZVtlLlRpbWVGb3JtYXQ9MTFdPSJUaW1lRm9ybWF0IixlW2UuRGF0ZVRpbWVGb3JtYXQ9MTJdPSJEYXRlVGltZUZvcm1hdCIsZVtlLk51bWJlclN5bWJvbHM9MTNdPSJOdW1iZXJTeW1ib2xzIixlW2UuTnVtYmVyRm9ybWF0cz0xNF09Ik51bWJlckZvcm1hdHMiLGVbZS5DdXJyZW5jeUNvZGU9MTVdPSJDdXJyZW5jeUNvZGUiLGVbZS5DdXJyZW5jeVN5bWJvbD0xNl09IkN1cnJlbmN5U3ltYm9sIixlW2UuQ3VycmVuY3lOYW1lPTE3XT0iQ3VycmVuY3lOYW1lIixlW2UuQ3VycmVuY2llcz0xOF09IkN1cnJlbmNpZXMiLGVbZS5EaXJlY3Rpb25hbGl0eT0xOV09IkRpcmVjdGlvbmFsaXR5IixlW2UuUGx1cmFsQ2FzZT0yMF09IlBsdXJhbENhc2UiLGVbZS5FeHRyYURhdGE9MjFdPSJFeHRyYURhdGEiLGV9KShfbnx8e30pO1NvPSJlbi1VUyIsR2I9U287SGU9e3RleHRFbmQ6MCxrZXk6MCxrZXlFbmQ6MCx2YWx1ZTowLHZhbHVlRW5kOjB9O01UPShlLHQsbixyLG8pPT4obm8oITApLFdJKHRbUF0scikpO0ZzPWNsYXNze25nTW9kdWxlRmFjdG9yeTtjb21wb25lbnRGYWN0b3JpZXM7Y29uc3RydWN0b3IodCxuKXt0aGlzLm5nTW9kdWxlRmFjdG9yeT10LHRoaXMuY29tcG9uZW50RmFjdG9yaWVzPW59fSxaVD0oKCk9PntjbGFzcyBle2NvbXBpbGVNb2R1bGVTeW5jKG4pe3JldHVybiBuZXcgQXMobil9Y29tcGlsZU1vZHVsZUFzeW5jKG4pe3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5jb21waWxlTW9kdWxlU3luYyhuKSl9Y29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jKG4pe2xldCByPXRoaXMuY29tcGlsZU1vZHVsZVN5bmMobiksbz10dShuKSxpPXZtKG8uZGVjbGFyYXRpb25zKS5yZWR1Y2UoKHMsYSk9PntsZXQgYz1RZShhKTtyZXR1cm4gYyYmcy5wdXNoKG5ldyBQdChjKSksc30sW10pO3JldHVybiBuZXcgRnMocixpKX1jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jKG4pe3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmMobikpfWNsZWFyQ2FjaGUoKXt9Y2xlYXJDYWNoZUZvcihuKXt9Z2V0TW9kdWxlSWQobil7fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKX07c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxmYWN0b3J5OmUuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGV9KSgpLFlUPSgoKT0+e2NsYXNzIGV7em9uZT15KHopO2NoYW5nZURldGVjdGlvblNjaGVkdWxlcj15KFRlKTthcHBsaWNhdGlvblJlZj15KFRuKTthcHBsaWNhdGlvbkVycm9ySGFuZGxlcj15KEJlKTtfb25NaWNyb3Rhc2tFbXB0eVN1YnNjcmlwdGlvbjtpbml0aWFsaXplKCl7dGhpcy5fb25NaWNyb3Rhc2tFbXB0eVN1YnNjcmlwdGlvbnx8KHRoaXMuX29uTWljcm90YXNrRW1wdHlTdWJzY3JpcHRpb249dGhpcy56b25lLm9uTWljcm90YXNrRW1wdHkuc3Vic2NyaWJlKHtuZXh0OigpPT57dGhpcy5jaGFuZ2VEZXRlY3Rpb25TY2hlZHVsZXIucnVubmluZ1RpY2t8fHRoaXMuem9uZS5ydW4oKCk9Pnt0cnl7dGhpcy5hcHBsaWNhdGlvblJlZi5kaXJ0eUZsYWdzfD0xLHRoaXMuYXBwbGljYXRpb25SZWYuX3RpY2soKX1jYXRjaChuKXt0aGlzLmFwcGxpY2F0aW9uRXJyb3JIYW5kbGVyKG4pfX0pfX0pKX1uZ09uRGVzdHJveSgpe3RoaXMuX29uTWljcm90YXNrRW1wdHlTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6ZS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gZX0pKCk7UVQ9KCgpPT57Y2xhc3MgZXtzdWJzY3JpcHRpb249bmV3IFc7aW5pdGlhbGl6ZWQ9ITE7em9uZT15KHopO3BlbmRpbmdUYXNrcz15KEZ0KTtpbml0aWFsaXplKCl7aWYodGhpcy5pbml0aWFsaXplZClyZXR1cm47dGhpcy5pbml0aWFsaXplZD0hMDtsZXQgbj1udWxsOyF0aGlzLnpvbmUuaXNTdGFibGUmJiF0aGlzLnpvbmUuaGFzUGVuZGluZ01hY3JvdGFza3MmJiF0aGlzLnpvbmUuaGFzUGVuZGluZ01pY3JvdGFza3MmJihuPXRoaXMucGVuZGluZ1Rhc2tzLmFkZCgpKSx0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLnN1YnNjcmlwdGlvbi5hZGQodGhpcy56b25lLm9uU3RhYmxlLnN1YnNjcmliZSgoKT0+e3ouYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpLHF1ZXVlTWljcm90YXNrKCgpPT57biE9PW51bGwmJiF0aGlzLnpvbmUuaGFzUGVuZGluZ01hY3JvdGFza3MmJiF0aGlzLnpvbmUuaGFzUGVuZGluZ01pY3JvdGFza3MmJih0aGlzLnBlbmRpbmdUYXNrcy5yZW1vdmUobiksbj1udWxsKX0pfSkpfSksdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMuem9uZS5vblVuc3RhYmxlLnN1YnNjcmliZSgoKT0+e3ouYXNzZXJ0SW5Bbmd1bGFyWm9uZSgpLG4/Pz10aGlzLnBlbmRpbmdUYXNrcy5hZGQoKX0pKX1uZ09uRGVzdHJveSgpe3RoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6ZS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gZX0pKCksZHY9KCgpPT57Y2xhc3MgZXthcHBsaWNhdGlvbkVycm9ySGFuZGxlcj15KEJlKTthcHBSZWY9eShUbik7dGFza1NlcnZpY2U9eShGdCk7bmdab25lPXkoeik7em9uZWxlc3NFbmFibGVkPXkocm8pO3RyYWNpbmc9eShMdCx7b3B0aW9uYWw6ITB9KTtkaXNhYmxlU2NoZWR1bGluZz15KE91LHtvcHRpb25hbDohMH0pPz8hMTt6b25lSXNEZWZpbmVkPXR5cGVvZiBab25lPCJ1IiYmISFab25lLnJvb3QucnVuO3NjaGVkdWxlclRpY2tBcHBseUFyZ3M9W3tkYXRhOntfX3NjaGVkdWxlcl90aWNrX186ITB9fV07c3Vic2NyaXB0aW9ucz1uZXcgVzthbmd1bGFyWm9uZUlkPXRoaXMuem9uZUlzRGVmaW5lZD90aGlzLm5nWm9uZS5faW5uZXI/LmdldCh3cyk6bnVsbDtzY2hlZHVsZUluUm9vdFpvbmU9IXRoaXMuem9uZWxlc3NFbmFibGVkJiZ0aGlzLnpvbmVJc0RlZmluZWQmJih5KEZ1LHtvcHRpb25hbDohMH0pPz8hMSk7Y2FuY2VsU2NoZWR1bGVkQ2FsbGJhY2s9bnVsbDt1c2VNaWNyb3Rhc2tTY2hlZHVsZXI9ITE7cnVubmluZ1RpY2s9ITE7cGVuZGluZ1JlbmRlclRhc2tJZD1udWxsO2NvbnN0cnVjdG9yKCl7dGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmFwcFJlZi5hZnRlclRpY2suc3Vic2NyaWJlKCgpPT57dGhpcy5ydW5uaW5nVGlja3x8dGhpcy5jbGVhbnVwKCl9KSksdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLm5nWm9uZS5vblVuc3RhYmxlLnN1YnNjcmliZSgoKT0+e3RoaXMucnVubmluZ1RpY2t8fHRoaXMuY2xlYW51cCgpfSkpLHRoaXMuZGlzYWJsZVNjaGVkdWxpbmd8fD0hdGhpcy56b25lbGVzc0VuYWJsZWQmJih0aGlzLm5nWm9uZSBpbnN0YW5jZW9mIENzfHwhdGhpcy56b25lSXNEZWZpbmVkKX1ub3RpZnkobil7aWYoIXRoaXMuem9uZWxlc3NFbmFibGVkJiZuPT09NSlyZXR1cm47bGV0IHI9ITE7c3dpdGNoKG4pe2Nhc2UgMDp7dGhpcy5hcHBSZWYuZGlydHlGbGFnc3w9MjticmVha31jYXNlIDM6Y2FzZSAyOmNhc2UgNDpjYXNlIDU6Y2FzZSAxOnt0aGlzLmFwcFJlZi5kaXJ0eUZsYWdzfD00O2JyZWFrfWNhc2UgNjp7dGhpcy5hcHBSZWYuZGlydHlGbGFnc3w9MixyPSEwO2JyZWFrfWNhc2UgMTI6e3RoaXMuYXBwUmVmLmRpcnR5RmxhZ3N8PTE2LHI9ITA7YnJlYWt9Y2FzZSAxMzp7dGhpcy5hcHBSZWYuZGlydHlGbGFnc3w9MixyPSEwO2JyZWFrfWNhc2UgMTE6e3I9ITA7YnJlYWt9Y2FzZSA5OmNhc2UgODpjYXNlIDc6Y2FzZSAxMDpkZWZhdWx0OnRoaXMuYXBwUmVmLmRpcnR5RmxhZ3N8PTh9aWYodGhpcy5hcHBSZWYudHJhY2luZ1NuYXBzaG90PXRoaXMudHJhY2luZz8uc25hcHNob3QodGhpcy5hcHBSZWYudHJhY2luZ1NuYXBzaG90KT8/bnVsbCwhdGhpcy5zaG91bGRTY2hlZHVsZVRpY2socikpcmV0dXJuO2xldCBvPXRoaXMudXNlTWljcm90YXNrU2NoZWR1bGVyP2FnOlRtO3RoaXMucGVuZGluZ1JlbmRlclRhc2tJZD10aGlzLnRhc2tTZXJ2aWNlLmFkZCgpLHRoaXMuc2NoZWR1bGVJblJvb3Rab25lP3RoaXMuY2FuY2VsU2NoZWR1bGVkQ2FsbGJhY2s9Wm9uZS5yb290LnJ1bigoKT0+bygoKT0+dGhpcy50aWNrKCkpKTp0aGlzLmNhbmNlbFNjaGVkdWxlZENhbGxiYWNrPXRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT5vKCgpPT50aGlzLnRpY2soKSkpfXNob3VsZFNjaGVkdWxlVGljayhuKXtyZXR1cm4hKHRoaXMuZGlzYWJsZVNjaGVkdWxpbmcmJiFufHx0aGlzLmFwcFJlZi5kZXN0cm95ZWR8fHRoaXMucGVuZGluZ1JlbmRlclRhc2tJZCE9PW51bGx8fHRoaXMucnVubmluZ1RpY2t8fHRoaXMuYXBwUmVmLl9ydW5uaW5nVGlja3x8IXRoaXMuem9uZWxlc3NFbmFibGVkJiZ0aGlzLnpvbmVJc0RlZmluZWQmJlpvbmUuY3VycmVudC5nZXQod3MrdGhpcy5hbmd1bGFyWm9uZUlkKSl9dGljaygpe2lmKHRoaXMucnVubmluZ1RpY2t8fHRoaXMuYXBwUmVmLmRlc3Ryb3llZClyZXR1cm47aWYodGhpcy5hcHBSZWYuZGlydHlGbGFncz09PTApe3RoaXMuY2xlYW51cCgpO3JldHVybn0hdGhpcy56b25lbGVzc0VuYWJsZWQmJnRoaXMuYXBwUmVmLmRpcnR5RmxhZ3MmNyYmKHRoaXMuYXBwUmVmLmRpcnR5RmxhZ3N8PTEpO2xldCBuPXRoaXMudGFza1NlcnZpY2UuYWRkKCk7dHJ5e3RoaXMubmdab25lLnJ1bigoKT0+e3RoaXMucnVubmluZ1RpY2s9ITAsdGhpcy5hcHBSZWYuX3RpY2soKX0sdm9pZCAwLHRoaXMuc2NoZWR1bGVyVGlja0FwcGx5QXJncyl9Y2F0Y2gocil7dGhpcy50YXNrU2VydmljZS5yZW1vdmUobiksdGhpcy5hcHBsaWNhdGlvbkVycm9ySGFuZGxlcihyKX1maW5hbGx5e3RoaXMuY2xlYW51cCgpfXRoaXMudXNlTWljcm90YXNrU2NoZWR1bGVyPSEwLGFnKCgpPT57dGhpcy51c2VNaWNyb3Rhc2tTY2hlZHVsZXI9ITEsdGhpcy50YXNrU2VydmljZS5yZW1vdmUobil9KX1uZ09uRGVzdHJveSgpe3RoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpLHRoaXMuY2xlYW51cCgpfWNsZWFudXAoKXtpZih0aGlzLnJ1bm5pbmdUaWNrPSExLHRoaXMuY2FuY2VsU2NoZWR1bGVkQ2FsbGJhY2s/LigpLHRoaXMuY2FuY2VsU2NoZWR1bGVkQ2FsbGJhY2s9bnVsbCx0aGlzLnBlbmRpbmdSZW5kZXJUYXNrSWQhPT1udWxsKXtsZXQgbj10aGlzLnBlbmRpbmdSZW5kZXJUYXNrSWQ7dGhpcy5wZW5kaW5nUmVuZGVyVGFza0lkPW51bGwsdGhpcy50YXNrU2VydmljZS5yZW1vdmUobil9fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKX07c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxmYWN0b3J5OmUuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGV9KSgpO05vPW5ldyBUKCIiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT55KE5vLHtvcHRpb25hbDohMCxza2lwU2VsZjohMH0pfHxLVCgpfSl9KTtmdW5jdGlvbiBuYShlKXtyZXR1cm4gSnAoZSl9ZnVuY3Rpb24gSlQoZSx0KXtyZXR1cm4gTXIoZSx0Py5lcXVhbCl9ZnVuY3Rpb24gWFQoZSx0KXtsZXQgbj10Py5pbmplY3Rvcj8/eSh2ZSkscj10Py5tYW51YWxDbGVhbnVwIT09ITA/bi5nZXQoQWUpOm51bGwsbyxpPW4uZ2V0KHluLG51bGwse29wdGlvbmFsOiEwfSkscz1uLmdldChUZSk7cmV0dXJuIGkhPT1udWxsPyhvPW5fKGkudmlldyxzLGUpLHIgaW5zdGFuY2VvZiBXciYmci5fbFZpZXc9PT1pLnZpZXcmJihyPW51bGwpKTpvPXJfKGUsbi5nZXQob28pLHMpLG8uaW5qZWN0b3I9bixyIT09bnVsbCYmKG8ub25EZXN0cm95Rm49ci5vbkRlc3Ryb3koKCk9Pm8uZGVzdHJveSgpKSksbmV3IEFkKG8pfWZ1bmN0aW9uIG5fKGUsdCxuKXtsZXQgcj1PYmplY3QuY3JlYXRlKHRfKTtyZXR1cm4gci52aWV3PWUsci56b25lPXR5cGVvZiBab25lPCJ1Ij9ab25lLmN1cnJlbnQ6bnVsbCxyLm5vdGlmaWVyPXQsci5mbj1wdihyLG4pLGVbZ3RdPz89bmV3IFNldCxlW2d0XS5hZGQociksci5jb25zdW1lck1hcmtlZERpcnR5KHIpLHJ9ZnVuY3Rpb24gcl8oZSx0LG4pe2xldCByPU9iamVjdC5jcmVhdGUoZV8pO3JldHVybiByLmZuPXB2KHIsZSksci5zY2hlZHVsZXI9dCxyLm5vdGlmaWVyPW4sci56b25lPXR5cGVvZiBab25lPCJ1Ij9ab25lLmN1cnJlbnQ6bnVsbCxyLnNjaGVkdWxlci5hZGQociksci5ub3RpZmllci5ub3RpZnkoMTIpLHJ9ZnVuY3Rpb24gcHYoZSx0KXtyZXR1cm4oKT0+e3Qobj0+KGUuY2xlYW51cEZucz8/PVtdKS5wdXNoKG4pKX19dmFyIHRhLEFkLGZ2LGVfLHRfLHhkPWgoKCk9PntpbygpO1d0KCk7dGgoKTt0YT1jbGFzc3tkZXN0cm95ZWQ9ITE7bGlzdGVuZXJzPW51bGw7ZXJyb3JIYW5kbGVyPXkoRGUse29wdGlvbmFsOiEwfSk7ZGVzdHJveVJlZj15KEFlKTtjb25zdHJ1Y3Rvcigpe3RoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCk9Pnt0aGlzLmRlc3Ryb3llZD0hMCx0aGlzLmxpc3RlbmVycz1udWxsfSl9c3Vic2NyaWJlKHQpe2lmKHRoaXMuZGVzdHJveWVkKXRocm93IG5ldyB2KDk1MywhMSk7cmV0dXJuKHRoaXMubGlzdGVuZXJzPz89W10pLnB1c2godCkse3Vuc3Vic2NyaWJlOigpPT57bGV0IG49dGhpcy5saXN0ZW5lcnM/LmluZGV4T2YodCk7biE9PXZvaWQgMCYmbiE9PS0xJiZ0aGlzLmxpc3RlbmVycz8uc3BsaWNlKG4sMSl9fX1lbWl0KHQpe2lmKHRoaXMuZGVzdHJveWVkKXtjb25zb2xlLndhcm4oWWUoOTUzLCExKSk7cmV0dXJufWlmKHRoaXMubGlzdGVuZXJzPT09bnVsbClyZXR1cm47bGV0IG49TShudWxsKTt0cnl7Zm9yKGxldCByIG9mIHRoaXMubGlzdGVuZXJzKXRyeXtyKHQpfWNhdGNoKG8pe3RoaXMuZXJyb3JIYW5kbGVyPy5oYW5kbGVFcnJvcihvKX19ZmluYWxseXtNKG4pfX19O0FkPWNsYXNze1tYXTtjb25zdHJ1Y3Rvcih0KXt0aGlzW1hdPXR9ZGVzdHJveSgpe3RoaXNbWF0uZGVzdHJveSgpfX07ZnY9RyhWKHt9LFhwKSx7Y2xlYW51cEZuczp2b2lkIDAsem9uZTpudWxsLG9uRGVzdHJveUZuOnZuLHJ1bigpe2xldCBlPWlyKCExKTt0cnl7ZWgodGhpcyl9ZmluYWxseXtpcihlKX19LGNsZWFudXAoKXtpZighdGhpcy5jbGVhbnVwRm5zPy5sZW5ndGgpcmV0dXJuO2xldCBlPU0obnVsbCk7dHJ5e2Zvcig7dGhpcy5jbGVhbnVwRm5zLmxlbmd0aDspdGhpcy5jbGVhbnVwRm5zLnBvcCgpKCl9ZmluYWxseXt0aGlzLmNsZWFudXBGbnM9W10sTShlKX19fSksZV89RyhWKHt9LGZ2KSx7Y29uc3VtZXJNYXJrZWREaXJ0eSgpe3RoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKHRoaXMpLHRoaXMubm90aWZpZXIubm90aWZ5KDEyKX0sZGVzdHJveSgpe2J0KHRoaXMpLHRoaXMub25EZXN0cm95Rm4oKSx0aGlzLmNsZWFudXAoKSx0aGlzLnNjaGVkdWxlci5yZW1vdmUodGhpcyl9fSksdF89RyhWKHt9LGZ2KSx7Y29uc3VtZXJNYXJrZWREaXJ0eSgpe3RoaXMudmlld1tBXXw9ODE5MixSdCh0aGlzLnZpZXcpLHRoaXMubm90aWZpZXIubm90aWZ5KDEzKX0sZGVzdHJveSgpe2J0KHRoaXMpLHRoaXMub25EZXN0cm95Rm4oKSx0aGlzLmNsZWFudXAoKSx0aGlzLnZpZXdbZ3RdPy5kZWxldGUodGhpcyl9fSl9KTtmdW5jdGlvbiBidihlLHQpe2xldCBuPU9iamVjdC5jcmVhdGUoZF8pO24udmFsdWU9ZSxuLnRyYW5zZm9ybUZuPXQ/LnRyYW5zZm9ybTtmdW5jdGlvbiByKCl7aWYoJHQobiksbi52YWx1ZT09PUN2KXtsZXQgbz1udWxsO3Rocm93IG5ldyB2KC05NTAsbyl9cmV0dXJuIG4udmFsdWV9cmV0dXJuIHJbWF09bixyfWZ1bmN0aW9uIE0yKGUpe3JldHVybiBuZXcgdGF9ZnVuY3Rpb24gZ3YoZSx0KXtyZXR1cm4gYnYoZSx0KX1mdW5jdGlvbiBwXyhlKXtyZXR1cm4gYnYoQ3YsZSl9ZnVuY3Rpb24gbXYoZSx0KXtyZXR1cm4gaGQodCl9ZnVuY3Rpb24gaF8oZSx0KXtyZXR1cm4gZ2QodCl9ZnVuY3Rpb24geXYoZSx0KXtyZXR1cm4gaGQodCl9ZnVuY3Rpb24gZ18oZSx0KXtyZXR1cm4gZ2QodCl9ZnVuY3Rpb24gQW8oZSl7cmV0dXJuIWUubW9kdWxlUmVmfWZ1bmN0aW9uIHlfKGUpe2xldCB0PUFvKGUpP2UucjNJbmplY3RvcjplLm1vZHVsZVJlZi5pbmplY3RvcixuPXQuZ2V0KHopO3JldHVybiBuLnJ1bigoKT0+e0FvKGUpP2UucjNJbmplY3Rvci5yZXNvbHZlSW5qZWN0b3JJbml0aWFsaXplcnMoKTplLm1vZHVsZVJlZi5yZXNvbHZlSW5qZWN0b3JJbml0aWFsaXplcnMoKTtsZXQgcj10LmdldChCZSksbztpZihuLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57bz1uLm9uRXJyb3Iuc3Vic2NyaWJlKHtuZXh0OnJ9KX0pLEFvKGUpKXtsZXQgaT0oKT0+dC5kZXN0cm95KCkscz1lLnBsYXRmb3JtSW5qZWN0b3IuZ2V0KE9kKTtzLmFkZChpKSx0Lm9uRGVzdHJveSgoKT0+e28udW5zdWJzY3JpYmUoKSxzLmRlbGV0ZShpKX0pfWVsc2V7bGV0IGk9KCk9PmUubW9kdWxlUmVmLmRlc3Ryb3koKSxzPWUucGxhdGZvcm1JbmplY3Rvci5nZXQoT2QpO3MuYWRkKGkpLGUubW9kdWxlUmVmLm9uRGVzdHJveSgoKT0+e2FvKGUuYWxsUGxhdGZvcm1Nb2R1bGVzLGUubW9kdWxlUmVmKSxvLnVuc3Vic2NyaWJlKCkscy5kZWxldGUoaSl9KX1yZXR1cm4gRF8ocixuLCgpPT57bGV0IGk9dC5nZXQoRnQpLHM9aS5hZGQoKSxhPXQuZ2V0KHZkKTtyZXR1cm4gYS5ydW5Jbml0aWFsaXplcnMoKSxhLmRvbmVQcm9taXNlLnRoZW4oKCk9PntsZXQgYz10LmdldChObyxTbyk7aWYoQnkoY3x8U28pLCF0LmdldChtXywhMCkpcmV0dXJuIEFvKGUpP3QuZ2V0KFRuKTooZS5hbGxQbGF0Zm9ybU1vZHVsZXMucHVzaChlLm1vZHVsZVJlZiksZS5tb2R1bGVSZWYpO2lmKEFvKGUpKXtsZXQgbD10LmdldChUbik7cmV0dXJuIGUucm9vdENvbXBvbmVudCE9PXZvaWQgMCYmbC5ib290c3RyYXAoZS5yb290Q29tcG9uZW50KSxsfWVsc2UgcmV0dXJuIHZfPy4oZS5tb2R1bGVSZWYsZS5hbGxQbGF0Zm9ybU1vZHVsZXMpLGUubW9kdWxlUmVmfSkuZmluYWxseSgoKT0+dm9pZCBpLnJlbW92ZShzKSl9KX0pfWZ1bmN0aW9uIERfKGUsdCxuKXt0cnl7bGV0IHI9bigpO3JldHVybiBNbyhyKT9yLmNhdGNoKG89Pnt0aHJvdyB0LnJ1bk91dHNpZGVBbmd1bGFyKCgpPT5lKG8pKSxvfSk6cn1jYXRjaChyKXt0aHJvdyB0LnJ1bk91dHNpZGVBbmd1bGFyKCgpPT5lKHIpKSxyfX1mdW5jdGlvbiBFXyhlPVtdLHQpe3JldHVybiB2ZS5jcmVhdGUoe25hbWU6dCxwcm92aWRlcnM6W3twcm92aWRlOllyLHVzZVZhbHVlOiJwbGF0Zm9ybSJ9LHtwcm92aWRlOk9kLHVzZVZhbHVlOm5ldyBTZXQoWygpPT5yYT1udWxsXSl9LC4uLmVdfSl9ZnVuY3Rpb24gSV8oZT1bXSl7aWYocmEpcmV0dXJuIHJhO2xldCB0PUVfKGUpO3JldHVybiByYT10LE55KCksd18odCksdH1mdW5jdGlvbiB3XyhlKXtsZXQgdD1lLmdldChQcyxudWxsKTtYbihlLCgpPT57dD8uZm9yRWFjaChuPT5uKCkpfSl9ZnVuY3Rpb24geDIoKXtyZXR1cm4hMX1mdW5jdGlvbiBDXyhlKXtyZXR1cm4gYl8oSigpLEUoKSwoZSYxNik9PT0xNil9ZnVuY3Rpb24gYl8oZSx0LG4pe2lmKG10KGUpJiYhbil7bGV0IHI9TmUoZS5pbmRleCx0KTtyZXR1cm4gbmV3IGt0KHIscil9ZWxzZSBpZihlLnR5cGUmMTc1KXtsZXQgcj10W2NlXTtyZXR1cm4gbmV3IGt0KHIsdCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdnYoZSx0LG4pe2xldCByPWUucHJldmlvdXNJbmRleDtpZihyPT09bnVsbClyZXR1cm4gcjtsZXQgbz0wO3JldHVybiBuJiZyPG4ubGVuZ3RoJiYobz1uW3JdKSxyK3Qrb31mdW5jdGlvbiBEdigpe3JldHVybiBuZXcgJGQoW25ldyBGZF0pfWZ1bmN0aW9uIEV2KCl7cmV0dXJuIG5ldyB6ZChbbmV3IGpkXSl9ZnVuY3Rpb24gX3YoZSl7bGV0e3Jvb3RDb21wb25lbnQ6dCxhcHBQcm92aWRlcnM6bixwbGF0Zm9ybVByb3ZpZGVyczpyLHBsYXRmb3JtUmVmOm99PWU7TCg4KTt0cnl7bGV0IGk9bz8uaW5qZWN0b3I/P0lfKHIpLHM9W3V2KHt9KSx7cHJvdmlkZTpUZSx1c2VFeGlzdGluZzpkdn0sR2gsLi4ubnx8W11dLGE9bmV3IGhvKHtwcm92aWRlcnM6cyxwYXJlbnQ6aSxkZWJ1Z05hbWU6IiIscnVuRW52aXJvbm1lbnRJbml0aWFsaXplcnM6ITF9KTtyZXR1cm4geV8oe3IzSW5qZWN0b3I6YS5pbmplY3RvcixwbGF0Zm9ybUluamVjdG9yOmkscm9vdENvbXBvbmVudDp0fSl9Y2F0Y2goaSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGkpfWZpbmFsbHl7TCg5KX19ZnVuY3Rpb24gX18oZSl7cmV0dXJuIHR5cGVvZiBlPT0iYm9vbGVhbiI/ZTplIT1udWxsJiZlIT09ImZhbHNlIn1mdW5jdGlvbiBNXyhlLHQ9TmFOKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChlKSkmJiFpc05hTihOdW1iZXIoZSkpP051bWJlcihlKTp0fWZ1bmN0aW9uIFIyKGUsdCl7bGV0IG49dD8uaW5qZWN0b3I/P3kodmUpLHI9bi5nZXQoVGUpLG89bi5nZXQoJHMpLGk9bi5nZXQoTHQsbnVsbCx7b3B0aW9uYWw6ITB9KTtvLmltcGw/Pz1uLmdldChlZCk7bGV0IHM9ZTt0eXBlb2Ygcz09ImZ1bmN0aW9uIiYmKHM9e21peGVkUmVhZFdyaXRlOmV9KTtsZXQgYT1uLmdldCh5bixudWxsLHtvcHRpb25hbDohMH0pLGM9bmV3IEhkKG8uaW1wbCxbcy5lYXJseVJlYWQscy53cml0ZSxzLm1peGVkUmVhZFdyaXRlLHMucmVhZF0sYT8udmlldyxyLG4saT8uc25hcHNob3QobnVsbCkpO3JldHVybiBvLmltcGwucmVnaXN0ZXIoYyksY31mdW5jdGlvbiBPMihlLHQpe2xldCBuPVFlKGUpLHI9dC5lbGVtZW50SW5qZWN0b3J8fEpuKCk7cmV0dXJuIG5ldyBQdChuKS5jcmVhdGUocix0LnByb2plY3RhYmxlTm9kZXMsdC5ob3N0RWxlbWVudCx0LmVudmlyb25tZW50SW5qZWN0b3IsdC5kaXJlY3RpdmVzLHQuYmluZGluZ3MpfWZ1bmN0aW9uIEYyKGUpe2xldCB0PVFlKGUpO2lmKCF0KXJldHVybiBudWxsO2xldCBuPW5ldyBQdCh0KTtyZXR1cm57Z2V0IHNlbGVjdG9yKCl7cmV0dXJuIG4uc2VsZWN0b3J9LGdldCB0eXBlKCl7cmV0dXJuIG4uY29tcG9uZW50VHlwZX0sZ2V0IGlucHV0cygpe3JldHVybiBuLmlucHV0c30sZ2V0IG91dHB1dHMoKXtyZXR1cm4gbi5vdXRwdXRzfSxnZXQgbmdDb250ZW50U2VsZWN0b3JzKCl7cmV0dXJuIG4ubmdDb250ZW50U2VsZWN0b3JzfSxnZXQgaXNTdGFuZGFsb25lKCl7cmV0dXJuIHQuc3RhbmRhbG9uZX0sZ2V0IGlzU2lnbmFsKCl7cmV0dXJuIHQuc2lnbmFsc319fXZhciBDdixkXyxodixmXyxTMixOMixBMixPZCxtXyx2XyxyYSxVZCxGZCxUXyxrZCxQZCxMZCxvYSxqZCxCZCxWZCwkZCx6ZCxUdixSZCxNdixTXyxIZCxoZT1oKCgpPT57aW8oKTtpbygpO1d0KCk7TmQoKTtOZCgpO3hkKCk7eGQoKTtDdj1TeW1ib2woIklucHV0U2lnbmFsTm9kZSNVTlNFVCIpLGRfPUcoVih7fSxTcikse3RyYW5zZm9ybUZuOnZvaWQgMCxhcHBseVZhbHVlVG9JbnB1dFNpZ25hbChlLHQpe3huKGUsdCl9fSk7aHY9Y2xhc3N7YXR0cmlidXRlTmFtZTtjb25zdHJ1Y3Rvcih0KXt0aGlzLmF0dHJpYnV0ZU5hbWU9dH1fX05HX0VMRU1FTlRfSURfXz0oKT0+a2wodGhpcy5hdHRyaWJ1dGVOYW1lKTt0b1N0cmluZygpe3JldHVybmBIb3N0QXR0cmlidXRlVG9rZW4gJHt0aGlzLmF0dHJpYnV0ZU5hbWV9YH19LGZfPW5ldyBUKCIiKTtmXy5fX05HX0VMRU1FTlRfSURfXz1lPT57bGV0IHQ9SigpO2lmKHQ9PT1udWxsKXRocm93IG5ldyB2KDIwNCwhMSk7aWYodC50eXBlJjIpcmV0dXJuIHQudmFsdWU7aWYoZSY4KXJldHVybiBudWxsO3Rocm93IG5ldyB2KDIwNCwhMSl9O1MyPShndi5yZXF1aXJlZD1wXyxndik7TjI9KG12LnJlcXVpcmVkPWhfLG12KTtBMj0oeXYucmVxdWlyZWQ9Z18seXYpLE9kPW5ldyBUKCIiKSxtXz1uZXcgVCgiIik7cmE9bnVsbDtVZD0oKCk9PntjbGFzcyBle3N0YXRpYyBfX05HX0VMRU1FTlRfSURfXz1DX31yZXR1cm4gZX0pKCk7RmQ9Y2xhc3N7Y29uc3RydWN0b3IoKXt9c3VwcG9ydHModCl7cmV0dXJuIGRkKHQpfWNyZWF0ZSh0KXtyZXR1cm4gbmV3IGtkKHQpfX0sVF89KGUsdCk9PnQsa2Q9Y2xhc3N7bGVuZ3RoPTA7Y29sbGVjdGlvbjtfbGlua2VkUmVjb3Jkcz1udWxsO191bmxpbmtlZFJlY29yZHM9bnVsbDtfcHJldmlvdXNJdEhlYWQ9bnVsbDtfaXRIZWFkPW51bGw7X2l0VGFpbD1udWxsO19hZGRpdGlvbnNIZWFkPW51bGw7X2FkZGl0aW9uc1RhaWw9bnVsbDtfbW92ZXNIZWFkPW51bGw7X21vdmVzVGFpbD1udWxsO19yZW1vdmFsc0hlYWQ9bnVsbDtfcmVtb3ZhbHNUYWlsPW51bGw7X2lkZW50aXR5Q2hhbmdlc0hlYWQ9bnVsbDtfaWRlbnRpdHlDaGFuZ2VzVGFpbD1udWxsO190cmFja0J5Rm47Y29uc3RydWN0b3IodCl7dGhpcy5fdHJhY2tCeUZuPXR8fFRffWZvckVhY2hJdGVtKHQpe2xldCBuO2ZvcihuPXRoaXMuX2l0SGVhZDtuIT09bnVsbDtuPW4uX25leHQpdChuKX1mb3JFYWNoT3BlcmF0aW9uKHQpe2xldCBuPXRoaXMuX2l0SGVhZCxyPXRoaXMuX3JlbW92YWxzSGVhZCxvPTAsaT1udWxsO2Zvcig7bnx8cjspe2xldCBzPSFyfHxuJiZuLmN1cnJlbnRJbmRleDx2dihyLG8saSk/bjpyLGE9dnYocyxvLGkpLGM9cy5jdXJyZW50SW5kZXg7aWYocz09PXIpby0tLHI9ci5fbmV4dFJlbW92ZWQ7ZWxzZSBpZihuPW4uX25leHQscy5wcmV2aW91c0luZGV4PT1udWxsKW8rKztlbHNle2l8fChpPVtdKTtsZXQgdT1hLW8sbD1jLW87aWYodSE9bCl7Zm9yKGxldCBwPTA7cDx1O3ArKyl7bGV0IGY9cDxpLmxlbmd0aD9pW3BdOmlbcF09MCxnPWYrcDtsPD1nJiZnPHUmJihpW3BdPWYrMSl9bGV0IGQ9cy5wcmV2aW91c0luZGV4O2lbZF09bC11fX1hIT09YyYmdChzLGEsYyl9fWZvckVhY2hQcmV2aW91c0l0ZW0odCl7bGV0IG47Zm9yKG49dGhpcy5fcHJldmlvdXNJdEhlYWQ7biE9PW51bGw7bj1uLl9uZXh0UHJldmlvdXMpdChuKX1mb3JFYWNoQWRkZWRJdGVtKHQpe2xldCBuO2ZvcihuPXRoaXMuX2FkZGl0aW9uc0hlYWQ7biE9PW51bGw7bj1uLl9uZXh0QWRkZWQpdChuKX1mb3JFYWNoTW92ZWRJdGVtKHQpe2xldCBuO2ZvcihuPXRoaXMuX21vdmVzSGVhZDtuIT09bnVsbDtuPW4uX25leHRNb3ZlZCl0KG4pfWZvckVhY2hSZW1vdmVkSXRlbSh0KXtsZXQgbjtmb3Iobj10aGlzLl9yZW1vdmFsc0hlYWQ7biE9PW51bGw7bj1uLl9uZXh0UmVtb3ZlZCl0KG4pfWZvckVhY2hJZGVudGl0eUNoYW5nZSh0KXtsZXQgbjtmb3Iobj10aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkO24hPT1udWxsO249bi5fbmV4dElkZW50aXR5Q2hhbmdlKXQobil9ZGlmZih0KXtpZih0PT1udWxsJiYodD1bXSksIWRkKHQpKXRocm93IG5ldyB2KDkwMCwhMSk7cmV0dXJuIHRoaXMuY2hlY2sodCk/dGhpczpudWxsfW9uRGVzdHJveSgpe31jaGVjayh0KXt0aGlzLl9yZXNldCgpO2xldCBuPXRoaXMuX2l0SGVhZCxyPSExLG8saSxzO2lmKEFycmF5LmlzQXJyYXkodCkpe3RoaXMubGVuZ3RoPXQubGVuZ3RoO2ZvcihsZXQgYT0wO2E8dGhpcy5sZW5ndGg7YSsrKWk9dFthXSxzPXRoaXMuX3RyYWNrQnlGbihhLGkpLG49PT1udWxsfHwhT2JqZWN0LmlzKG4udHJhY2tCeUlkLHMpPyhuPXRoaXMuX21pc21hdGNoKG4saSxzLGEpLHI9ITApOihyJiYobj10aGlzLl92ZXJpZnlSZWluc2VydGlvbihuLGkscyxhKSksT2JqZWN0LmlzKG4uaXRlbSxpKXx8dGhpcy5fYWRkSWRlbnRpdHlDaGFuZ2UobixpKSksbj1uLl9uZXh0fWVsc2Ugbz0wLHJ5KHQsYT0+e3M9dGhpcy5fdHJhY2tCeUZuKG8sYSksbj09PW51bGx8fCFPYmplY3QuaXMobi50cmFja0J5SWQscyk/KG49dGhpcy5fbWlzbWF0Y2gobixhLHMsbykscj0hMCk6KHImJihuPXRoaXMuX3ZlcmlmeVJlaW5zZXJ0aW9uKG4sYSxzLG8pKSxPYmplY3QuaXMobi5pdGVtLGEpfHx0aGlzLl9hZGRJZGVudGl0eUNoYW5nZShuLGEpKSxuPW4uX25leHQsbysrfSksdGhpcy5sZW5ndGg9bztyZXR1cm4gdGhpcy5fdHJ1bmNhdGUobiksdGhpcy5jb2xsZWN0aW9uPXQsdGhpcy5pc0RpcnR5fWdldCBpc0RpcnR5KCl7cmV0dXJuIHRoaXMuX2FkZGl0aW9uc0hlYWQhPT1udWxsfHx0aGlzLl9tb3Zlc0hlYWQhPT1udWxsfHx0aGlzLl9yZW1vdmFsc0hlYWQhPT1udWxsfHx0aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkIT09bnVsbH1fcmVzZXQoKXtpZih0aGlzLmlzRGlydHkpe2xldCB0O2Zvcih0PXRoaXMuX3ByZXZpb3VzSXRIZWFkPXRoaXMuX2l0SGVhZDt0IT09bnVsbDt0PXQuX25leHQpdC5fbmV4dFByZXZpb3VzPXQuX25leHQ7Zm9yKHQ9dGhpcy5fYWRkaXRpb25zSGVhZDt0IT09bnVsbDt0PXQuX25leHRBZGRlZCl0LnByZXZpb3VzSW5kZXg9dC5jdXJyZW50SW5kZXg7Zm9yKHRoaXMuX2FkZGl0aW9uc0hlYWQ9dGhpcy5fYWRkaXRpb25zVGFpbD1udWxsLHQ9dGhpcy5fbW92ZXNIZWFkO3QhPT1udWxsO3Q9dC5fbmV4dE1vdmVkKXQucHJldmlvdXNJbmRleD10LmN1cnJlbnRJbmRleDt0aGlzLl9tb3Zlc0hlYWQ9dGhpcy5fbW92ZXNUYWlsPW51bGwsdGhpcy5fcmVtb3ZhbHNIZWFkPXRoaXMuX3JlbW92YWxzVGFpbD1udWxsLHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQ9dGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbD1udWxsfX1fbWlzbWF0Y2godCxuLHIsbyl7bGV0IGk7cmV0dXJuIHQ9PT1udWxsP2k9dGhpcy5faXRUYWlsOihpPXQuX3ByZXYsdGhpcy5fcmVtb3ZlKHQpKSx0PXRoaXMuX3VubGlua2VkUmVjb3Jkcz09PW51bGw/bnVsbDp0aGlzLl91bmxpbmtlZFJlY29yZHMuZ2V0KHIsbnVsbCksdCE9PW51bGw/KE9iamVjdC5pcyh0Lml0ZW0sbil8fHRoaXMuX2FkZElkZW50aXR5Q2hhbmdlKHQsbiksdGhpcy5fcmVpbnNlcnRBZnRlcih0LGksbykpOih0PXRoaXMuX2xpbmtlZFJlY29yZHM9PT1udWxsP251bGw6dGhpcy5fbGlua2VkUmVjb3Jkcy5nZXQocixvKSx0IT09bnVsbD8oT2JqZWN0LmlzKHQuaXRlbSxuKXx8dGhpcy5fYWRkSWRlbnRpdHlDaGFuZ2UodCxuKSx0aGlzLl9tb3ZlQWZ0ZXIodCxpLG8pKTp0PXRoaXMuX2FkZEFmdGVyKG5ldyBQZChuLHIpLGksbykpLHR9X3ZlcmlmeVJlaW5zZXJ0aW9uKHQsbixyLG8pe2xldCBpPXRoaXMuX3VubGlua2VkUmVjb3Jkcz09PW51bGw/bnVsbDp0aGlzLl91bmxpbmtlZFJlY29yZHMuZ2V0KHIsbnVsbCk7cmV0dXJuIGkhPT1udWxsP3Q9dGhpcy5fcmVpbnNlcnRBZnRlcihpLHQuX3ByZXYsbyk6dC5jdXJyZW50SW5kZXghPW8mJih0LmN1cnJlbnRJbmRleD1vLHRoaXMuX2FkZFRvTW92ZXModCxvKSksdH1fdHJ1bmNhdGUodCl7Zm9yKDt0IT09bnVsbDspe2xldCBuPXQuX25leHQ7dGhpcy5fYWRkVG9SZW1vdmFscyh0aGlzLl91bmxpbmsodCkpLHQ9bn10aGlzLl91bmxpbmtlZFJlY29yZHMhPT1udWxsJiZ0aGlzLl91bmxpbmtlZFJlY29yZHMuY2xlYXIoKSx0aGlzLl9hZGRpdGlvbnNUYWlsIT09bnVsbCYmKHRoaXMuX2FkZGl0aW9uc1RhaWwuX25leHRBZGRlZD1udWxsKSx0aGlzLl9tb3Zlc1RhaWwhPT1udWxsJiYodGhpcy5fbW92ZXNUYWlsLl9uZXh0TW92ZWQ9bnVsbCksdGhpcy5faXRUYWlsIT09bnVsbCYmKHRoaXMuX2l0VGFpbC5fbmV4dD1udWxsKSx0aGlzLl9yZW1vdmFsc1RhaWwhPT1udWxsJiYodGhpcy5fcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZD1udWxsKSx0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsIT09bnVsbCYmKHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwuX25leHRJZGVudGl0eUNoYW5nZT1udWxsKX1fcmVpbnNlcnRBZnRlcih0LG4scil7dGhpcy5fdW5saW5rZWRSZWNvcmRzIT09bnVsbCYmdGhpcy5fdW5saW5rZWRSZWNvcmRzLnJlbW92ZSh0KTtsZXQgbz10Ll9wcmV2UmVtb3ZlZCxpPXQuX25leHRSZW1vdmVkO3JldHVybiBvPT09bnVsbD90aGlzLl9yZW1vdmFsc0hlYWQ9aTpvLl9uZXh0UmVtb3ZlZD1pLGk9PT1udWxsP3RoaXMuX3JlbW92YWxzVGFpbD1vOmkuX3ByZXZSZW1vdmVkPW8sdGhpcy5faW5zZXJ0QWZ0ZXIodCxuLHIpLHRoaXMuX2FkZFRvTW92ZXModCxyKSx0fV9tb3ZlQWZ0ZXIodCxuLHIpe3JldHVybiB0aGlzLl91bmxpbmsodCksdGhpcy5faW5zZXJ0QWZ0ZXIodCxuLHIpLHRoaXMuX2FkZFRvTW92ZXModCxyKSx0fV9hZGRBZnRlcih0LG4scil7cmV0dXJuIHRoaXMuX2luc2VydEFmdGVyKHQsbixyKSx0aGlzLl9hZGRpdGlvbnNUYWlsPT09bnVsbD90aGlzLl9hZGRpdGlvbnNUYWlsPXRoaXMuX2FkZGl0aW9uc0hlYWQ9dDp0aGlzLl9hZGRpdGlvbnNUYWlsPXRoaXMuX2FkZGl0aW9uc1RhaWwuX25leHRBZGRlZD10LHR9X2luc2VydEFmdGVyKHQsbixyKXtsZXQgbz1uPT09bnVsbD90aGlzLl9pdEhlYWQ6bi5fbmV4dDtyZXR1cm4gdC5fbmV4dD1vLHQuX3ByZXY9bixvPT09bnVsbD90aGlzLl9pdFRhaWw9dDpvLl9wcmV2PXQsbj09PW51bGw/dGhpcy5faXRIZWFkPXQ6bi5fbmV4dD10LHRoaXMuX2xpbmtlZFJlY29yZHM9PT1udWxsJiYodGhpcy5fbGlua2VkUmVjb3Jkcz1uZXcgb2EpLHRoaXMuX2xpbmtlZFJlY29yZHMucHV0KHQpLHQuY3VycmVudEluZGV4PXIsdH1fcmVtb3ZlKHQpe3JldHVybiB0aGlzLl9hZGRUb1JlbW92YWxzKHRoaXMuX3VubGluayh0KSl9X3VubGluayh0KXt0aGlzLl9saW5rZWRSZWNvcmRzIT09bnVsbCYmdGhpcy5fbGlua2VkUmVjb3Jkcy5yZW1vdmUodCk7bGV0IG49dC5fcHJldixyPXQuX25leHQ7cmV0dXJuIG49PT1udWxsP3RoaXMuX2l0SGVhZD1yOm4uX25leHQ9cixyPT09bnVsbD90aGlzLl9pdFRhaWw9bjpyLl9wcmV2PW4sdH1fYWRkVG9Nb3Zlcyh0LG4pe3JldHVybiB0LnByZXZpb3VzSW5kZXg9PT1ufHwodGhpcy5fbW92ZXNUYWlsPT09bnVsbD90aGlzLl9tb3Zlc1RhaWw9dGhpcy5fbW92ZXNIZWFkPXQ6dGhpcy5fbW92ZXNUYWlsPXRoaXMuX21vdmVzVGFpbC5fbmV4dE1vdmVkPXQpLHR9X2FkZFRvUmVtb3ZhbHModCl7cmV0dXJuIHRoaXMuX3VubGlua2VkUmVjb3Jkcz09PW51bGwmJih0aGlzLl91bmxpbmtlZFJlY29yZHM9bmV3IG9hKSx0aGlzLl91bmxpbmtlZFJlY29yZHMucHV0KHQpLHQuY3VycmVudEluZGV4PW51bGwsdC5fbmV4dFJlbW92ZWQ9bnVsbCx0aGlzLl9yZW1vdmFsc1RhaWw9PT1udWxsPyh0aGlzLl9yZW1vdmFsc1RhaWw9dGhpcy5fcmVtb3ZhbHNIZWFkPXQsdC5fcHJldlJlbW92ZWQ9bnVsbCk6KHQuX3ByZXZSZW1vdmVkPXRoaXMuX3JlbW92YWxzVGFpbCx0aGlzLl9yZW1vdmFsc1RhaWw9dGhpcy5fcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZD10KSx0fV9hZGRJZGVudGl0eUNoYW5nZSh0LG4pe3JldHVybiB0Lml0ZW09bix0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsPT09bnVsbD90aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsPXRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQ9dDp0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsPXRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwuX25leHRJZGVudGl0eUNoYW5nZT10LHR9fSxQZD1jbGFzc3tpdGVtO3RyYWNrQnlJZDtjdXJyZW50SW5kZXg9bnVsbDtwcmV2aW91c0luZGV4PW51bGw7X25leHRQcmV2aW91cz1udWxsO19wcmV2PW51bGw7X25leHQ9bnVsbDtfcHJldkR1cD1udWxsO19uZXh0RHVwPW51bGw7X3ByZXZSZW1vdmVkPW51bGw7X25leHRSZW1vdmVkPW51bGw7X25leHRBZGRlZD1udWxsO19uZXh0TW92ZWQ9bnVsbDtfbmV4dElkZW50aXR5Q2hhbmdlPW51bGw7Y29uc3RydWN0b3IodCxuKXt0aGlzLml0ZW09dCx0aGlzLnRyYWNrQnlJZD1ufX0sTGQ9Y2xhc3N7X2hlYWQ9bnVsbDtfdGFpbD1udWxsO2FkZCh0KXt0aGlzLl9oZWFkPT09bnVsbD8odGhpcy5faGVhZD10aGlzLl90YWlsPXQsdC5fbmV4dER1cD1udWxsLHQuX3ByZXZEdXA9bnVsbCk6KHRoaXMuX3RhaWwuX25leHREdXA9dCx0Ll9wcmV2RHVwPXRoaXMuX3RhaWwsdC5fbmV4dER1cD1udWxsLHRoaXMuX3RhaWw9dCl9Z2V0KHQsbil7bGV0IHI7Zm9yKHI9dGhpcy5faGVhZDtyIT09bnVsbDtyPXIuX25leHREdXApaWYoKG49PT1udWxsfHxuPD1yLmN1cnJlbnRJbmRleCkmJk9iamVjdC5pcyhyLnRyYWNrQnlJZCx0KSlyZXR1cm4gcjtyZXR1cm4gbnVsbH1yZW1vdmUodCl7bGV0IG49dC5fcHJldkR1cCxyPXQuX25leHREdXA7cmV0dXJuIG49PT1udWxsP3RoaXMuX2hlYWQ9cjpuLl9uZXh0RHVwPXIscj09PW51bGw/dGhpcy5fdGFpbD1uOnIuX3ByZXZEdXA9bix0aGlzLl9oZWFkPT09bnVsbH19LG9hPWNsYXNze21hcD1uZXcgTWFwO3B1dCh0KXtsZXQgbj10LnRyYWNrQnlJZCxyPXRoaXMubWFwLmdldChuKTtyfHwocj1uZXcgTGQsdGhpcy5tYXAuc2V0KG4scikpLHIuYWRkKHQpfWdldCh0LG4pe2xldCByPXQsbz10aGlzLm1hcC5nZXQocik7cmV0dXJuIG8/by5nZXQodCxuKTpudWxsfXJlbW92ZSh0KXtsZXQgbj10LnRyYWNrQnlJZDtyZXR1cm4gdGhpcy5tYXAuZ2V0KG4pLnJlbW92ZSh0KSYmdGhpcy5tYXAuZGVsZXRlKG4pLHR9Z2V0IGlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXAuc2l6ZT09PTB9Y2xlYXIoKXt0aGlzLm1hcC5jbGVhcigpfX07amQ9Y2xhc3N7Y29uc3RydWN0b3IoKXt9c3VwcG9ydHModCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBNYXB8fFFzKHQpfWNyZWF0ZSgpe3JldHVybiBuZXcgQmR9fSxCZD1jbGFzc3tfcmVjb3Jkcz1uZXcgTWFwO19tYXBIZWFkPW51bGw7X2FwcGVuZEFmdGVyPW51bGw7X3ByZXZpb3VzTWFwSGVhZD1udWxsO19jaGFuZ2VzSGVhZD1udWxsO19jaGFuZ2VzVGFpbD1udWxsO19hZGRpdGlvbnNIZWFkPW51bGw7X2FkZGl0aW9uc1RhaWw9bnVsbDtfcmVtb3ZhbHNIZWFkPW51bGw7X3JlbW92YWxzVGFpbD1udWxsO2dldCBpc0RpcnR5KCl7cmV0dXJuIHRoaXMuX2FkZGl0aW9uc0hlYWQhPT1udWxsfHx0aGlzLl9jaGFuZ2VzSGVhZCE9PW51bGx8fHRoaXMuX3JlbW92YWxzSGVhZCE9PW51bGx9Zm9yRWFjaEl0ZW0odCl7bGV0IG47Zm9yKG49dGhpcy5fbWFwSGVhZDtuIT09bnVsbDtuPW4uX25leHQpdChuKX1mb3JFYWNoUHJldmlvdXNJdGVtKHQpe2xldCBuO2ZvcihuPXRoaXMuX3ByZXZpb3VzTWFwSGVhZDtuIT09bnVsbDtuPW4uX25leHRQcmV2aW91cyl0KG4pfWZvckVhY2hDaGFuZ2VkSXRlbSh0KXtsZXQgbjtmb3Iobj10aGlzLl9jaGFuZ2VzSGVhZDtuIT09bnVsbDtuPW4uX25leHRDaGFuZ2VkKXQobil9Zm9yRWFjaEFkZGVkSXRlbSh0KXtsZXQgbjtmb3Iobj10aGlzLl9hZGRpdGlvbnNIZWFkO24hPT1udWxsO249bi5fbmV4dEFkZGVkKXQobil9Zm9yRWFjaFJlbW92ZWRJdGVtKHQpe2xldCBuO2ZvcihuPXRoaXMuX3JlbW92YWxzSGVhZDtuIT09bnVsbDtuPW4uX25leHRSZW1vdmVkKXQobil9ZGlmZih0KXtpZighdCl0PW5ldyBNYXA7ZWxzZSBpZighKHQgaW5zdGFuY2VvZiBNYXB8fFFzKHQpKSl0aHJvdyBuZXcgdig5MDAsITEpO3JldHVybiB0aGlzLmNoZWNrKHQpP3RoaXM6bnVsbH1vbkRlc3Ryb3koKXt9Y2hlY2sodCl7dGhpcy5fcmVzZXQoKTtsZXQgbj10aGlzLl9tYXBIZWFkO2lmKHRoaXMuX2FwcGVuZEFmdGVyPW51bGwsdGhpcy5fZm9yRWFjaCh0LChyLG8pPT57aWYobiYmbi5rZXk9PT1vKXRoaXMuX21heWJlQWRkVG9DaGFuZ2VzKG4sciksdGhpcy5fYXBwZW5kQWZ0ZXI9bixuPW4uX25leHQ7ZWxzZXtsZXQgaT10aGlzLl9nZXRPckNyZWF0ZVJlY29yZEZvcktleShvLHIpO249dGhpcy5faW5zZXJ0QmVmb3JlT3JBcHBlbmQobixpKX19KSxuKXtuLl9wcmV2JiYobi5fcHJldi5fbmV4dD1udWxsKSx0aGlzLl9yZW1vdmFsc0hlYWQ9bjtmb3IobGV0IHI9bjtyIT09bnVsbDtyPXIuX25leHRSZW1vdmVkKXI9PT10aGlzLl9tYXBIZWFkJiYodGhpcy5fbWFwSGVhZD1udWxsKSx0aGlzLl9yZWNvcmRzLmRlbGV0ZShyLmtleSksci5fbmV4dFJlbW92ZWQ9ci5fbmV4dCxyLnByZXZpb3VzVmFsdWU9ci5jdXJyZW50VmFsdWUsci5jdXJyZW50VmFsdWU9bnVsbCxyLl9wcmV2PW51bGwsci5fbmV4dD1udWxsfXJldHVybiB0aGlzLl9jaGFuZ2VzVGFpbCYmKHRoaXMuX2NoYW5nZXNUYWlsLl9uZXh0Q2hhbmdlZD1udWxsKSx0aGlzLl9hZGRpdGlvbnNUYWlsJiYodGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkPW51bGwpLHRoaXMuaXNEaXJ0eX1faW5zZXJ0QmVmb3JlT3JBcHBlbmQodCxuKXtpZih0KXtsZXQgcj10Ll9wcmV2O3JldHVybiBuLl9uZXh0PXQsbi5fcHJldj1yLHQuX3ByZXY9bixyJiYoci5fbmV4dD1uKSx0PT09dGhpcy5fbWFwSGVhZCYmKHRoaXMuX21hcEhlYWQ9biksdGhpcy5fYXBwZW5kQWZ0ZXI9dCx0fXJldHVybiB0aGlzLl9hcHBlbmRBZnRlcj8odGhpcy5fYXBwZW5kQWZ0ZXIuX25leHQ9bixuLl9wcmV2PXRoaXMuX2FwcGVuZEFmdGVyKTp0aGlzLl9tYXBIZWFkPW4sdGhpcy5fYXBwZW5kQWZ0ZXI9bixudWxsfV9nZXRPckNyZWF0ZVJlY29yZEZvcktleSh0LG4pe2lmKHRoaXMuX3JlY29yZHMuaGFzKHQpKXtsZXQgbz10aGlzLl9yZWNvcmRzLmdldCh0KTt0aGlzLl9tYXliZUFkZFRvQ2hhbmdlcyhvLG4pO2xldCBpPW8uX3ByZXYscz1vLl9uZXh0O3JldHVybiBpJiYoaS5fbmV4dD1zKSxzJiYocy5fcHJldj1pKSxvLl9uZXh0PW51bGwsby5fcHJldj1udWxsLG99bGV0IHI9bmV3IFZkKHQpO3JldHVybiB0aGlzLl9yZWNvcmRzLnNldCh0LHIpLHIuY3VycmVudFZhbHVlPW4sdGhpcy5fYWRkVG9BZGRpdGlvbnMocikscn1fcmVzZXQoKXtpZih0aGlzLmlzRGlydHkpe2xldCB0O2Zvcih0aGlzLl9wcmV2aW91c01hcEhlYWQ9dGhpcy5fbWFwSGVhZCx0PXRoaXMuX3ByZXZpb3VzTWFwSGVhZDt0IT09bnVsbDt0PXQuX25leHQpdC5fbmV4dFByZXZpb3VzPXQuX25leHQ7Zm9yKHQ9dGhpcy5fY2hhbmdlc0hlYWQ7dCE9PW51bGw7dD10Ll9uZXh0Q2hhbmdlZCl0LnByZXZpb3VzVmFsdWU9dC5jdXJyZW50VmFsdWU7Zm9yKHQ9dGhpcy5fYWRkaXRpb25zSGVhZDt0IT1udWxsO3Q9dC5fbmV4dEFkZGVkKXQucHJldmlvdXNWYWx1ZT10LmN1cnJlbnRWYWx1ZTt0aGlzLl9jaGFuZ2VzSGVhZD10aGlzLl9jaGFuZ2VzVGFpbD1udWxsLHRoaXMuX2FkZGl0aW9uc0hlYWQ9dGhpcy5fYWRkaXRpb25zVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD1udWxsfX1fbWF5YmVBZGRUb0NoYW5nZXModCxuKXtPYmplY3QuaXMobix0LmN1cnJlbnRWYWx1ZSl8fCh0LnByZXZpb3VzVmFsdWU9dC5jdXJyZW50VmFsdWUsdC5jdXJyZW50VmFsdWU9bix0aGlzLl9hZGRUb0NoYW5nZXModCkpfV9hZGRUb0FkZGl0aW9ucyh0KXt0aGlzLl9hZGRpdGlvbnNIZWFkPT09bnVsbD90aGlzLl9hZGRpdGlvbnNIZWFkPXRoaXMuX2FkZGl0aW9uc1RhaWw9dDoodGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkPXQsdGhpcy5fYWRkaXRpb25zVGFpbD10KX1fYWRkVG9DaGFuZ2VzKHQpe3RoaXMuX2NoYW5nZXNIZWFkPT09bnVsbD90aGlzLl9jaGFuZ2VzSGVhZD10aGlzLl9jaGFuZ2VzVGFpbD10Oih0aGlzLl9jaGFuZ2VzVGFpbC5fbmV4dENoYW5nZWQ9dCx0aGlzLl9jaGFuZ2VzVGFpbD10KX1fZm9yRWFjaCh0LG4pe3QgaW5zdGFuY2VvZiBNYXA/dC5mb3JFYWNoKG4pOk9iamVjdC5rZXlzKHQpLmZvckVhY2gocj0+bih0W3JdLHIpKX19LFZkPWNsYXNze2tleTtwcmV2aW91c1ZhbHVlPW51bGw7Y3VycmVudFZhbHVlPW51bGw7X25leHRQcmV2aW91cz1udWxsO19uZXh0PW51bGw7X3ByZXY9bnVsbDtfbmV4dEFkZGVkPW51bGw7X25leHRSZW1vdmVkPW51bGw7X25leHRDaGFuZ2VkPW51bGw7Y29uc3RydWN0b3IodCl7dGhpcy5rZXk9dH19OyRkPSgoKT0+e2NsYXNzIGV7ZmFjdG9yaWVzO3N0YXRpYyBcdTAyNzVwcm92PU4oe3Rva2VuOmUscHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpEdn0pO2NvbnN0cnVjdG9yKG4pe3RoaXMuZmFjdG9yaWVzPW59c3RhdGljIGNyZWF0ZShuLHIpe2lmKHIhPW51bGwpe2xldCBvPXIuZmFjdG9yaWVzLnNsaWNlKCk7bj1uLmNvbmNhdChvKX1yZXR1cm4gbmV3IGUobil9c3RhdGljIGV4dGVuZChuKXtyZXR1cm57cHJvdmlkZTplLHVzZUZhY3Rvcnk6KCk9PntsZXQgcj15KGUse29wdGlvbmFsOiEwLHNraXBTZWxmOiEwfSk7cmV0dXJuIGUuY3JlYXRlKG4scnx8RHYoKSl9fX1maW5kKG4pe2xldCByPXRoaXMuZmFjdG9yaWVzLmZpbmQobz0+by5zdXBwb3J0cyhuKSk7aWYociE9bnVsbClyZXR1cm4gcjt0aHJvdyBuZXcgdig5MDEsITEpfX1yZXR1cm4gZX0pKCk7emQ9KCgpPT57Y2xhc3MgZXtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLHByb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6RXZ9KTtmYWN0b3JpZXM7Y29uc3RydWN0b3Iobil7dGhpcy5mYWN0b3JpZXM9bn1zdGF0aWMgY3JlYXRlKG4scil7aWYocil7bGV0IG89ci5mYWN0b3JpZXMuc2xpY2UoKTtuPW4uY29uY2F0KG8pfXJldHVybiBuZXcgZShuKX1zdGF0aWMgZXh0ZW5kKG4pe3JldHVybntwcm92aWRlOmUsdXNlRmFjdG9yeTooKT0+e2xldCByPXkoZSx7b3B0aW9uYWw6ITAsc2tpcFNlbGY6ITB9KTtyZXR1cm4gZS5jcmVhdGUobixyfHxFdigpKX19fWZpbmQobil7bGV0IHI9dGhpcy5mYWN0b3JpZXMuZmluZChvPT5vLnN1cHBvcnRzKG4pKTtpZihyKXJldHVybiByO3Rocm93IG5ldyB2KDkwMSwhMSl9fXJldHVybiBlfSkoKSxUdj0oKCk9PntjbGFzcyBle2NvbnN0cnVjdG9yKG4pe31zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSkoQyhUbikpfTtzdGF0aWMgXHUwMjc1bW9kPUJ0KHt0eXBlOmV9KTtzdGF0aWMgXHUwMjc1aW5qPXB0KHt9KX1yZXR1cm4gZX0pKCk7UmQ9U3ltYm9sKCJOT1RfU0VUIiksTXY9bmV3IFNldCxTXz1HKFYoe30sU3IpLHtjb25zdW1lcklzQWx3YXlzTGl2ZTohMCxjb25zdW1lckFsbG93U2lnbmFsV3JpdGVzOiEwLHZhbHVlOlJkLGNsZWFudXA6bnVsbCxjb25zdW1lck1hcmtlZERpcnR5KCl7aWYodGhpcy5zZXF1ZW5jZS5pbXBsLmV4ZWN1dGluZyl7aWYodGhpcy5zZXF1ZW5jZS5sYXN0UGhhc2U9PT1udWxsfHx0aGlzLnNlcXVlbmNlLmxhc3RQaGFzZTx0aGlzLnBoYXNlKXJldHVybjt0aGlzLnNlcXVlbmNlLmVycm9yZWRPckRlc3Ryb3llZD0hMH10aGlzLnNlcXVlbmNlLnNjaGVkdWxlci5ub3RpZnkoNyl9LHBoYXNlRm4oZSl7aWYodGhpcy5zZXF1ZW5jZS5sYXN0UGhhc2U9dGhpcy5waGFzZSwhdGhpcy5kaXJ0eSlyZXR1cm4gdGhpcy5zaWduYWw7aWYodGhpcy5kaXJ0eT0hMSx0aGlzLnZhbHVlIT09UmQmJiFHdCh0aGlzKSlyZXR1cm4gdGhpcy5zaWduYWw7dHJ5e2ZvcihsZXQgbyBvZiB0aGlzLmNsZWFudXA/P012KW8oKX1maW5hbGx5e3RoaXMuY2xlYW51cD8uY2xlYXIoKX1sZXQgdD1bXTtlIT09dm9pZCAwJiZ0LnB1c2goZSksdC5wdXNoKHRoaXMucmVnaXN0ZXJDbGVhbnVwRm4pO2xldCBuPUN0KHRoaXMpLHI7dHJ5e3I9dGhpcy51c2VyRm4uYXBwbHkobnVsbCx0KX1maW5hbGx5e3p0KHRoaXMsbil9cmV0dXJuKHRoaXMudmFsdWU9PT1SZHx8IXRoaXMuZXF1YWwodGhpcy52YWx1ZSxyKSkmJih0aGlzLnZhbHVlPXIsdGhpcy52ZXJzaW9uKyspLHRoaXMuc2lnbmFsfX0pLEhkPWNsYXNzIGV4dGVuZHMgdW97c2NoZWR1bGVyO2xhc3RQaGFzZT1udWxsO25vZGVzPVt2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDBdO2NvbnN0cnVjdG9yKHQsbixyLG8saSxzPW51bGwpe3N1cGVyKHQsW3ZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMF0sciwhMSxpLmdldChBZSkscyksdGhpcy5zY2hlZHVsZXI9bztmb3IobGV0IGEgb2YgWGwpe2xldCBjPW5bYV07aWYoYz09PXZvaWQgMCljb250aW51ZTtsZXQgdT1PYmplY3QuY3JlYXRlKFNfKTt1LnNlcXVlbmNlPXRoaXMsdS5waGFzZT1hLHUudXNlckZuPWMsdS5kaXJ0eT0hMCx1LnNpZ25hbD0oKT0+KCR0KHUpLHUudmFsdWUpLHUuc2lnbmFsW1hdPXUsdS5yZWdpc3RlckNsZWFudXBGbj1sPT4odS5jbGVhbnVwPz89bmV3IFNldCkuYWRkKGwpLHRoaXMubm9kZXNbYV09dSx0aGlzLmhvb2tzW2FdPWw9PnUucGhhc2VGbihsKX19YWZ0ZXJSdW4oKXtzdXBlci5hZnRlclJ1bigpLHRoaXMubGFzdFBoYXNlPW51bGx9ZGVzdHJveSgpe3N1cGVyLmRlc3Ryb3koKTtmb3IobGV0IHQgb2YgdGhpcy5ub2RlcylpZih0KXRyeXtmb3IobGV0IG4gb2YgdC5jbGVhbnVwPz9NdiluKCl9ZmluYWxseXtidCh0KX19fX0pO2Z1bmN0aW9uIHN0KCl7cmV0dXJuIEF2fWZ1bmN0aW9uIEdkKGUpe0F2Pz89ZX1mdW5jdGlvbiBpYShlLHQpe3JldHVybiBlP3Q/ZS5lbmRzV2l0aCgiLyIpP3Quc3RhcnRzV2l0aCgiLyIpP2UrdC5zbGljZSgxKTplK3Q6dC5zdGFydHNXaXRoKCIvIik/ZSt0OmAke2V9LyR7dH1gOmU6dH1mdW5jdGlvbiBTdihlKXtsZXQgdD1lLnNlYXJjaCgvI3xcP3wkLyk7cmV0dXJuIGVbdC0xXT09PSIvIj9lLnNsaWNlKDAsdC0xKStlLnNsaWNlKHQpOmV9ZnVuY3Rpb24gJGUoZSl7cmV0dXJuIGUmJmVbMF0hPT0iPyI/YD8ke2V9YDplfWZ1bmN0aW9uIEFfKCl7cmV0dXJuIG5ldyBPdihDKEVyKSl9ZnVuY3Rpb24geF8oZSx0KXtpZighZXx8IXQuc3RhcnRzV2l0aChlKSlyZXR1cm4gdDtsZXQgbj10LnN1YnN0cmluZyhlLmxlbmd0aCk7cmV0dXJuIG49PT0iInx8WyIvIiwiOyIsIj8iLCIjIl0uaW5jbHVkZXMoblswXSk/bjp0fWZ1bmN0aW9uIE52KGUpe3JldHVybiBlLnJlcGxhY2UoL1wvaW5kZXguaHRtbCQvLCIiKX1mdW5jdGlvbiBSXyhlKXtpZihuZXcgUmVnRXhwKCJeKGh0dHBzPzopPy8vIikudGVzdChlKSl7bGV0WyxuXT1lLnNwbGl0KC9cL1wvW15cL10rLyk7cmV0dXJuIG59cmV0dXJuIGV9dmFyIEF2LHhvLFJvLE5fLHh2LEVyLHNhLFJ2LE92LFdkPWgoKCk9PntoZSgpO2hlKCk7VXIoKTtBdj1udWxsO3hvPWNsYXNze30sUm89KCgpPT57Y2xhc3MgZXtoaXN0b3J5R28obil7dGhyb3cgbmV3IEVycm9yKCIiKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSl9O3N0YXRpYyBcdTAyNzVwcm92PU4oe3Rva2VuOmUsZmFjdG9yeTooKT0+eSh4dikscHJvdmlkZWRJbjoicGxhdGZvcm0ifSl9cmV0dXJuIGV9KSgpLE5fPW5ldyBUKCIiKSx4dj0oKCk9PntjbGFzcyBlIGV4dGVuZHMgUm97X2xvY2F0aW9uO19oaXN0b3J5O19kb2M9eShZKTtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5fbG9jYXRpb249d2luZG93LmxvY2F0aW9uLHRoaXMuX2hpc3Rvcnk9d2luZG93Lmhpc3Rvcnl9Z2V0QmFzZUhyZWZGcm9tRE9NKCl7cmV0dXJuIHN0KCkuZ2V0QmFzZUhyZWYodGhpcy5fZG9jKX1vblBvcFN0YXRlKG4pe2xldCByPXN0KCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5fZG9jLCJ3aW5kb3ciKTtyZXR1cm4gci5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsbiwhMSksKCk9PnIucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLG4pfW9uSGFzaENoYW5nZShuKXtsZXQgcj1zdCgpLmdldEdsb2JhbEV2ZW50VGFyZ2V0KHRoaXMuX2RvYywid2luZG93Iik7cmV0dXJuIHIuYWRkRXZlbnRMaXN0ZW5lcigiaGFzaGNoYW5nZSIsbiwhMSksKCk9PnIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaGFzaGNoYW5nZSIsbil9Z2V0IGhyZWYoKXtyZXR1cm4gdGhpcy5fbG9jYXRpb24uaHJlZn1nZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpcy5fbG9jYXRpb24ucHJvdG9jb2x9Z2V0IGhvc3RuYW1lKCl7cmV0dXJuIHRoaXMuX2xvY2F0aW9uLmhvc3RuYW1lfWdldCBwb3J0KCl7cmV0dXJuIHRoaXMuX2xvY2F0aW9uLnBvcnR9Z2V0IHBhdGhuYW1lKCl7cmV0dXJuIHRoaXMuX2xvY2F0aW9uLnBhdGhuYW1lfWdldCBzZWFyY2goKXtyZXR1cm4gdGhpcy5fbG9jYXRpb24uc2VhcmNofWdldCBoYXNoKCl7cmV0dXJuIHRoaXMuX2xvY2F0aW9uLmhhc2h9c2V0IHBhdGhuYW1lKG4pe3RoaXMuX2xvY2F0aW9uLnBhdGhuYW1lPW59cHVzaFN0YXRlKG4scixvKXt0aGlzLl9oaXN0b3J5LnB1c2hTdGF0ZShuLHIsbyl9cmVwbGFjZVN0YXRlKG4scixvKXt0aGlzLl9oaXN0b3J5LnJlcGxhY2VTdGF0ZShuLHIsbyl9Zm9yd2FyZCgpe3RoaXMuX2hpc3RvcnkuZm9yd2FyZCgpfWJhY2soKXt0aGlzLl9oaXN0b3J5LmJhY2soKX1oaXN0b3J5R28obj0wKXt0aGlzLl9oaXN0b3J5LmdvKG4pfWdldFN0YXRlKCl7cmV0dXJuIHRoaXMuX2hpc3Rvcnkuc3RhdGV9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6KCk9Pm5ldyBlLHByb3ZpZGVkSW46InBsYXRmb3JtIn0pfXJldHVybiBlfSkoKTtFcj0oKCk9PntjbGFzcyBle2hpc3RvcnlHbyhuKXt0aHJvdyBuZXcgRXJyb3IoIiIpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKX07c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxmYWN0b3J5OigpPT55KFJ2KSxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBlfSkoKSxzYT1uZXcgVCgiIiksUnY9KCgpPT57Y2xhc3MgZSBleHRlbmRzIEVye19wbGF0Zm9ybUxvY2F0aW9uO19iYXNlSHJlZjtfcmVtb3ZlTGlzdGVuZXJGbnM9W107Y29uc3RydWN0b3IobixyKXtzdXBlcigpLHRoaXMuX3BsYXRmb3JtTG9jYXRpb249bix0aGlzLl9iYXNlSHJlZj1yPz90aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSgpPz95KFkpLmxvY2F0aW9uPy5vcmlnaW4/PyIifW5nT25EZXN0cm95KCl7Zm9yKDt0aGlzLl9yZW1vdmVMaXN0ZW5lckZucy5sZW5ndGg7KXRoaXMuX3JlbW92ZUxpc3RlbmVyRm5zLnBvcCgpKCl9b25Qb3BTdGF0ZShuKXt0aGlzLl9yZW1vdmVMaXN0ZW5lckZucy5wdXNoKHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZShuKSx0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uSGFzaENoYW5nZShuKSl9Z2V0QmFzZUhyZWYoKXtyZXR1cm4gdGhpcy5fYmFzZUhyZWZ9cHJlcGFyZUV4dGVybmFsVXJsKG4pe3JldHVybiBpYSh0aGlzLl9iYXNlSHJlZixuKX1wYXRoKG49ITEpe2xldCByPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUrJGUodGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5zZWFyY2gpLG89dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5oYXNoO3JldHVybiBvJiZuP2Ake3J9JHtvfWA6cn1wdXNoU3RhdGUobixyLG8saSl7bGV0IHM9dGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwobyskZShpKSk7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wdXNoU3RhdGUobixyLHMpfXJlcGxhY2VTdGF0ZShuLHIsbyxpKXtsZXQgcz10aGlzLnByZXBhcmVFeHRlcm5hbFVybChvKyRlKGkpKTt0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnJlcGxhY2VTdGF0ZShuLHIscyl9Zm9yd2FyZCgpe3RoaXMuX3BsYXRmb3JtTG9jYXRpb24uZm9yd2FyZCgpfWJhY2soKXt0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmJhY2soKX1nZXRTdGF0ZSgpe3JldHVybiB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmdldFN0YXRlKCl9aGlzdG9yeUdvKG49MCl7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5oaXN0b3J5R28/LihuKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSkoQyhSbyksQyhzYSw4KSl9O3N0YXRpYyBcdTAyNzVwcm92PU4oe3Rva2VuOmUsZmFjdG9yeTplLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBlfSkoKSxPdj0oKCk9PntjbGFzcyBle19zdWJqZWN0PW5ldyBnZTtfYmFzZVBhdGg7X2xvY2F0aW9uU3RyYXRlZ3k7X3VybENoYW5nZUxpc3RlbmVycz1bXTtfdXJsQ2hhbmdlU3Vic2NyaXB0aW9uPW51bGw7Y29uc3RydWN0b3Iobil7dGhpcy5fbG9jYXRpb25TdHJhdGVneT1uO2xldCByPXRoaXMuX2xvY2F0aW9uU3RyYXRlZ3kuZ2V0QmFzZUhyZWYoKTt0aGlzLl9iYXNlUGF0aD1SXyhTdihOdihyKSkpLHRoaXMuX2xvY2F0aW9uU3RyYXRlZ3kub25Qb3BTdGF0ZShvPT57dGhpcy5fc3ViamVjdC5uZXh0KHt1cmw6dGhpcy5wYXRoKCEwKSxwb3A6ITAsc3RhdGU6by5zdGF0ZSx0eXBlOm8udHlwZX0pfSl9bmdPbkRlc3Ryb3koKXt0aGlzLl91cmxDaGFuZ2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCksdGhpcy5fdXJsQ2hhbmdlTGlzdGVuZXJzPVtdfXBhdGgobj0hMSl7cmV0dXJuIHRoaXMubm9ybWFsaXplKHRoaXMuX2xvY2F0aW9uU3RyYXRlZ3kucGF0aChuKSl9Z2V0U3RhdGUoKXtyZXR1cm4gdGhpcy5fbG9jYXRpb25TdHJhdGVneS5nZXRTdGF0ZSgpfWlzQ3VycmVudFBhdGhFcXVhbFRvKG4scj0iIil7cmV0dXJuIHRoaXMucGF0aCgpPT10aGlzLm5vcm1hbGl6ZShuKyRlKHIpKX1ub3JtYWxpemUobil7cmV0dXJuIGUuc3RyaXBUcmFpbGluZ1NsYXNoKHhfKHRoaXMuX2Jhc2VQYXRoLE52KG4pKSl9cHJlcGFyZUV4dGVybmFsVXJsKG4pe3JldHVybiBuJiZuWzBdIT09Ii8iJiYobj0iLyIrbiksdGhpcy5fbG9jYXRpb25TdHJhdGVneS5wcmVwYXJlRXh0ZXJuYWxVcmwobil9Z28obixyPSIiLG89bnVsbCl7dGhpcy5fbG9jYXRpb25TdHJhdGVneS5wdXNoU3RhdGUobywiIixuLHIpLHRoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0aGlzLnByZXBhcmVFeHRlcm5hbFVybChuKyRlKHIpKSxvKX1yZXBsYWNlU3RhdGUobixyPSIiLG89bnVsbCl7dGhpcy5fbG9jYXRpb25TdHJhdGVneS5yZXBsYWNlU3RhdGUobywiIixuLHIpLHRoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0aGlzLnByZXBhcmVFeHRlcm5hbFVybChuKyRlKHIpKSxvKX1mb3J3YXJkKCl7dGhpcy5fbG9jYXRpb25TdHJhdGVneS5mb3J3YXJkKCl9YmFjaygpe3RoaXMuX2xvY2F0aW9uU3RyYXRlZ3kuYmFjaygpfWhpc3RvcnlHbyhuPTApe3RoaXMuX2xvY2F0aW9uU3RyYXRlZ3kuaGlzdG9yeUdvPy4obil9b25VcmxDaGFuZ2Uobil7cmV0dXJuIHRoaXMuX3VybENoYW5nZUxpc3RlbmVycy5wdXNoKG4pLHRoaXMuX3VybENoYW5nZVN1YnNjcmlwdGlvbj8/PXRoaXMuc3Vic2NyaWJlKHI9Pnt0aGlzLl9ub3RpZnlVcmxDaGFuZ2VMaXN0ZW5lcnMoci51cmwsci5zdGF0ZSl9KSwoKT0+e2xldCByPXRoaXMuX3VybENoYW5nZUxpc3RlbmVycy5pbmRleE9mKG4pO3RoaXMuX3VybENoYW5nZUxpc3RlbmVycy5zcGxpY2UociwxKSx0aGlzLl91cmxDaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoPT09MCYmKHRoaXMuX3VybENoYW5nZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKSx0aGlzLl91cmxDaGFuZ2VTdWJzY3JpcHRpb249bnVsbCl9fV9ub3RpZnlVcmxDaGFuZ2VMaXN0ZW5lcnMobj0iIixyKXt0aGlzLl91cmxDaGFuZ2VMaXN0ZW5lcnMuZm9yRWFjaChvPT5vKG4scikpfXN1YnNjcmliZShuLHIsbyl7cmV0dXJuIHRoaXMuX3N1YmplY3Quc3Vic2NyaWJlKHtuZXh0Om4sZXJyb3I6cj8/dm9pZCAwLGNvbXBsZXRlOm8/P3ZvaWQgMH0pfXN0YXRpYyBub3JtYWxpemVRdWVyeVBhcmFtcz0kZTtzdGF0aWMgam9pbldpdGhTbGFzaD1pYTtzdGF0aWMgc3RyaXBUcmFpbGluZ1NsYXNoPVN2O3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKShDKEVyKSl9O3N0YXRpYyBcdTAyNzVwcm92PU4oe3Rva2VuOmUsZmFjdG9yeTooKT0+QV8oKSxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBlfSkoKX0pO2Z1bmN0aW9uIElyKGUsdCl7bGV0IG49ZWEoZSkscj1uW19uLk51bWJlclN5bWJvbHNdW3RdO2lmKHR5cGVvZiByPiJ1Iil7aWYodD09PWF0LkN1cnJlbmN5RGVjaW1hbClyZXR1cm4gbltfbi5OdW1iZXJTeW1ib2xzXVthdC5EZWNpbWFsXTtpZih0PT09YXQuQ3VycmVuY3lHcm91cClyZXR1cm4gbltfbi5OdW1iZXJTeW1ib2xzXVthdC5Hcm91cF19cmV0dXJuIHJ9ZnVuY3Rpb24ganYoZSx0KXtyZXR1cm4gZWEoZSlbX24uTnVtYmVyRm9ybWF0c11bdF19ZnVuY3Rpb24gTF8oZSx0LG4scixvLGkscz0hMSl7bGV0IGE9IiIsYz0hMTtpZighaXNGaW5pdGUoZSkpYT1JcihuLGF0LkluZmluaXR5KTtlbHNle2xldCB1PVZfKGUpO3MmJih1PUJfKHUpKTtsZXQgbD10Lm1pbkludCxkPXQubWluRnJhYyxwPXQubWF4RnJhYztpZihpKXtsZXQgRj1pLm1hdGNoKEZfKTtpZihGPT09bnVsbCl0aHJvdyBuZXcgdigyMzA2LCExKTtsZXQgY3Q9RlsxXSxRPUZbM10semU9Rls1XTtjdCE9bnVsbCYmKGw9WmQoY3QpKSxRIT1udWxsJiYoZD1aZChRKSksemUhPW51bGw/cD1aZCh6ZSk6USE9bnVsbCYmZD5wJiYocD1kKX1IXyh1LGQscCk7bGV0IGY9dS5kaWdpdHMsZz11LmludGVnZXJMZW4sST11LmV4cG9uZW50LEQ9W107Zm9yKGM9Zi5ldmVyeShGPT4hRik7ZzxsO2crKylmLnVuc2hpZnQoMCk7Zm9yKDtnPDA7ZysrKWYudW5zaGlmdCgwKTtnPjA/RD1mLnNwbGljZShnLGYubGVuZ3RoKTooRD1mLGY9WzBdKTtsZXQgbT1bXTtmb3IoZi5sZW5ndGg+PXQubGdTaXplJiZtLnVuc2hpZnQoZi5zcGxpY2UoLXQubGdTaXplLGYubGVuZ3RoKS5qb2luKCIiKSk7Zi5sZW5ndGg+dC5nU2l6ZTspbS51bnNoaWZ0KGYuc3BsaWNlKC10LmdTaXplLGYubGVuZ3RoKS5qb2luKCIiKSk7Zi5sZW5ndGgmJm0udW5zaGlmdChmLmpvaW4oIiIpKSxhPW0uam9pbihJcihuLHIpKSxELmxlbmd0aCYmKGErPUlyKG4sbykrRC5qb2luKCIiKSksSSYmKGErPUlyKG4sYXQuRXhwb25lbnRpYWwpKyIrIitJKX1yZXR1cm4gZTwwJiYhYz9hPXQubmVnUHJlK2ErdC5uZWdTdWY6YT10LnBvc1ByZSthK3QucG9zU3VmLGF9ZnVuY3Rpb24gQnYoZSx0LG4pe2xldCByPWp2KHQsSmQuRGVjaW1hbCksbz1qXyhyLElyKHQsYXQuTWludXNTaWduKSk7cmV0dXJuIExfKGUsbyx0LGF0Lkdyb3VwLGF0LkRlY2ltYWwsbil9ZnVuY3Rpb24gal8oZSx0PSItIil7bGV0IG49e21pbkludDoxLG1pbkZyYWM6MCxtYXhGcmFjOjAscG9zUHJlOiIiLHBvc1N1ZjoiIixuZWdQcmU6IiIsbmVnU3VmOiIiLGdTaXplOjAsbGdTaXplOjB9LHI9ZS5zcGxpdChrXyksbz1yWzBdLGk9clsxXSxzPW8uaW5kZXhPZihhYSkhPT0tMT9vLnNwbGl0KGFhKTpbby5zdWJzdHJpbmcoMCxvLmxhc3RJbmRleE9mKE9vKSsxKSxvLnN1YnN0cmluZyhvLmxhc3RJbmRleE9mKE9vKSsxKV0sYT1zWzBdLGM9c1sxXXx8IiI7bi5wb3NQcmU9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YocWQpKTtmb3IobGV0IGw9MDtsPGMubGVuZ3RoO2wrKyl7bGV0IGQ9Yy5jaGFyQXQobCk7ZD09PU9vP24ubWluRnJhYz1uLm1heEZyYWM9bCsxOmQ9PT1xZD9uLm1heEZyYWM9bCsxOm4ucG9zU3VmKz1kfWxldCB1PWEuc3BsaXQoUF8pO2lmKG4uZ1NpemU9dVsxXT91WzFdLmxlbmd0aDowLG4ubGdTaXplPXVbMl18fHVbMV0/KHVbMl18fHVbMV0pLmxlbmd0aDowLGkpe2xldCBsPW8ubGVuZ3RoLW4ucG9zUHJlLmxlbmd0aC1uLnBvc1N1Zi5sZW5ndGgsZD1pLmluZGV4T2YocWQpO24ubmVnUHJlPWkuc3Vic3RyaW5nKDAsZCkucmVwbGFjZSgvJy9nLCIiKSxuLm5lZ1N1Zj1pLnNsaWNlKGQrbCkucmVwbGFjZSgvJy9nLCIiKX1lbHNlIG4ubmVnUHJlPXQrbi5wb3NQcmUsbi5uZWdTdWY9bi5wb3NTdWY7cmV0dXJuIG59ZnVuY3Rpb24gQl8oZSl7aWYoZS5kaWdpdHNbMF09PT0wKXJldHVybiBlO2xldCB0PWUuZGlnaXRzLmxlbmd0aC1lLmludGVnZXJMZW47cmV0dXJuIGUuZXhwb25lbnQ/ZS5leHBvbmVudCs9MjoodD09PTA/ZS5kaWdpdHMucHVzaCgwLDApOnQ9PT0xJiZlLmRpZ2l0cy5wdXNoKDApLGUuaW50ZWdlckxlbis9MiksZX1mdW5jdGlvbiBWXyhlKXtsZXQgdD1NYXRoLmFicyhlKSsiIixuPTAscixvLGkscyxhO2Zvcigobz10LmluZGV4T2YoYWEpKT4tMSYmKHQ9dC5yZXBsYWNlKGFhLCIiKSksKGk9dC5zZWFyY2goL2UvaSkpPjA/KG88MCYmKG89aSksbys9K3Quc2xpY2UoaSsxKSx0PXQuc3Vic3RyaW5nKDAsaSkpOm88MCYmKG89dC5sZW5ndGgpLGk9MDt0LmNoYXJBdChpKT09PU9vO2krKyk7aWYoaT09PShhPXQubGVuZ3RoKSlyPVswXSxvPTE7ZWxzZXtmb3IoYS0tO3QuY2hhckF0KGEpPT09T287KWEtLTtmb3Ioby09aSxyPVtdLHM9MDtpPD1hO2krKyxzKyspcltzXT1OdW1iZXIodC5jaGFyQXQoaSkpfXJldHVybiBvPkZ2JiYocj1yLnNwbGljZSgwLEZ2LTEpLG49by0xLG89MSkse2RpZ2l0czpyLGV4cG9uZW50Om4saW50ZWdlckxlbjpvfX1mdW5jdGlvbiBIXyhlLHQsbil7aWYodD5uKXRocm93IG5ldyB2KDIzMDcsITEpO2xldCByPWUuZGlnaXRzLG89ci5sZW5ndGgtZS5pbnRlZ2VyTGVuLGk9TWF0aC5taW4oTWF0aC5tYXgodCxvKSxuKSxzPWkrZS5pbnRlZ2VyTGVuLGE9cltzXTtpZihzPjApe3Iuc3BsaWNlKE1hdGgubWF4KGUuaW50ZWdlckxlbixzKSk7Zm9yKGxldCBkPXM7ZDxyLmxlbmd0aDtkKyspcltkXT0wfWVsc2V7bz1NYXRoLm1heCgwLG8pLGUuaW50ZWdlckxlbj0xLHIubGVuZ3RoPU1hdGgubWF4KDEscz1pKzEpLHJbMF09MDtmb3IobGV0IGQ9MTtkPHM7ZCsrKXJbZF09MH1pZihhPj01KWlmKHMtMTwwKXtmb3IobGV0IGQ9MDtkPnM7ZC0tKXIudW5zaGlmdCgwKSxlLmludGVnZXJMZW4rKztyLnVuc2hpZnQoMSksZS5pbnRlZ2VyTGVuKyt9ZWxzZSByW3MtMV0rKztmb3IoO288TWF0aC5tYXgoMCxpKTtvKyspci5wdXNoKDApO2xldCBjPWkhPT0wLHU9dCtlLmludGVnZXJMZW4sbD1yLnJlZHVjZVJpZ2h0KGZ1bmN0aW9uKGQscCxmLGcpe3JldHVybiBwPXArZCxnW2ZdPXA8MTA/cDpwLTEwLGMmJihnW2ZdPT09MCYmZj49dT9nLnBvcCgpOmM9ITEpLHA+PTEwPzE6MH0sMCk7bCYmKHIudW5zaGlmdChsKSxlLmludGVnZXJMZW4rKyl9ZnVuY3Rpb24gWmQoZSl7bGV0IHQ9cGFyc2VJbnQoZSk7aWYoaXNOYU4odCkpdGhyb3cgbmV3IHYoMjMwNSwhMSk7cmV0dXJuIHR9ZnVuY3Rpb24gUHYoZSx0KXtlLmNvbnRleHQuJGltcGxpY2l0PXQuaXRlbX1mdW5jdGlvbiBMdihlLHQpe2lmKGUmJiFlLmNyZWF0ZUVtYmVkZGVkVmlldyl0aHJvdyBuZXcgdigyMDIwLCExKX1mdW5jdGlvbiBlZihlLHQpe3JldHVybiBuZXcgdigyMTAwLCExKX1mdW5jdGlvbiBYXyhlKXtyZXR1cm4hKGU9PW51bGx8fGU9PT0iInx8ZSE9PWUpfWZ1bmN0aW9uIGVNKGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIiYmIWlzTmFOKE51bWJlcihlKS1wYXJzZUZsb2F0KGUpKSlyZXR1cm4gTnVtYmVyKGUpO2lmKHR5cGVvZiBlIT0ibnVtYmVyIil0aHJvdyBuZXcgdigyMzA5LCExKTtyZXR1cm4gZX12YXIgT18sSmQsYXQsRl8sRnYsYWEsT28sa18sUF8scWQsWWQsa3YsVV8sY2EsVnYsJF8sdWEsbGEsWGQsel8sR18sV18scV8sUWQsS2QsWl8sWV8sUV8sS18sSl8sdGYsSHY9aCgoKT0+e2hlKCk7aGUoKTtXZCgpO09fPSgoKT0+e2NsYXNzIGUgZXh0ZW5kcyBFcntfcGxhdGZvcm1Mb2NhdGlvbjtfYmFzZUhyZWY9IiI7X3JlbW92ZUxpc3RlbmVyRm5zPVtdO2NvbnN0cnVjdG9yKG4scil7c3VwZXIoKSx0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uPW4sciE9bnVsbCYmKHRoaXMuX2Jhc2VIcmVmPXIpfW5nT25EZXN0cm95KCl7Zm9yKDt0aGlzLl9yZW1vdmVMaXN0ZW5lckZucy5sZW5ndGg7KXRoaXMuX3JlbW92ZUxpc3RlbmVyRm5zLnBvcCgpKCl9b25Qb3BTdGF0ZShuKXt0aGlzLl9yZW1vdmVMaXN0ZW5lckZucy5wdXNoKHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZShuKSx0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uSGFzaENoYW5nZShuKSl9Z2V0QmFzZUhyZWYoKXtyZXR1cm4gdGhpcy5fYmFzZUhyZWZ9cGF0aChuPSExKXtsZXQgcj10aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmhhc2g/PyIjIjtyZXR1cm4gci5sZW5ndGg+MD9yLnN1YnN0cmluZygxKTpyfXByZXBhcmVFeHRlcm5hbFVybChuKXtsZXQgcj1pYSh0aGlzLl9iYXNlSHJlZixuKTtyZXR1cm4gci5sZW5ndGg+MD8iIyIrcjpyfXB1c2hTdGF0ZShuLHIsbyxpKXtsZXQgcz10aGlzLnByZXBhcmVFeHRlcm5hbFVybChvKyRlKGkpKXx8dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZTt0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnB1c2hTdGF0ZShuLHIscyl9cmVwbGFjZVN0YXRlKG4scixvLGkpe2xldCBzPXRoaXMucHJlcGFyZUV4dGVybmFsVXJsKG8rJGUoaSkpfHx0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnBhdGhuYW1lO3RoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKG4scixzKX1mb3J3YXJkKCl7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5mb3J3YXJkKCl9YmFjaygpe3RoaXMuX3BsYXRmb3JtTG9jYXRpb24uYmFjaygpfWdldFN0YXRlKCl7cmV0dXJuIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uZ2V0U3RhdGUoKX1oaXN0b3J5R28obj0wKXt0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmhpc3RvcnlHbz8uKG4pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKShDKFJvKSxDKHNhLDgpKX07c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxmYWN0b3J5OmUuXHUwMjc1ZmFjfSl9cmV0dXJuIGV9KSgpLEpkPShmdW5jdGlvbihlKXtyZXR1cm4gZVtlLkRlY2ltYWw9MF09IkRlY2ltYWwiLGVbZS5QZXJjZW50PTFdPSJQZXJjZW50IixlW2UuQ3VycmVuY3k9Ml09IkN1cnJlbmN5IixlW2UuU2NpZW50aWZpYz0zXT0iU2NpZW50aWZpYyIsZX0pKEpkfHx7fSksYXQ9e0RlY2ltYWw6MCxHcm91cDoxLExpc3Q6MixQZXJjZW50U2lnbjozLFBsdXNTaWduOjQsTWludXNTaWduOjUsRXhwb25lbnRpYWw6NixTdXBlcnNjcmlwdGluZ0V4cG9uZW50OjcsUGVyTWlsbGU6OCxJbmZpbml0eTo5LE5hTjoxMCxUaW1lU2VwYXJhdG9yOjExLEN1cnJlbmN5RGVjaW1hbDoxMixDdXJyZW5jeUdyb3VwOjEzfTtGXz0vXihcZCspP1wuKChcZCspKC0oXGQrKSk/KT8kLyxGdj0yMixhYT0iLiIsT289IjAiLGtfPSI7IixQXz0iLCIscWQ9IiMiO1lkPS9ccysvLGt2PVtdLFVfPSgoKT0+e2NsYXNzIGV7X25nRWw7X3JlbmRlcmVyO2luaXRpYWxDbGFzc2VzPWt2O3Jhd0NsYXNzO3N0YXRlTWFwPW5ldyBNYXA7Y29uc3RydWN0b3IobixyKXt0aGlzLl9uZ0VsPW4sdGhpcy5fcmVuZGVyZXI9cn1zZXQga2xhc3Mobil7dGhpcy5pbml0aWFsQ2xhc3Nlcz1uIT1udWxsP24udHJpbSgpLnNwbGl0KFlkKTprdn1zZXQgbmdDbGFzcyhuKXt0aGlzLnJhd0NsYXNzPXR5cGVvZiBuPT0ic3RyaW5nIj9uLnRyaW0oKS5zcGxpdChZZCk6bn1uZ0RvQ2hlY2soKXtmb3IobGV0IHIgb2YgdGhpcy5pbml0aWFsQ2xhc3Nlcyl0aGlzLl91cGRhdGVTdGF0ZShyLCEwKTtsZXQgbj10aGlzLnJhd0NsYXNzO2lmKEFycmF5LmlzQXJyYXkobil8fG4gaW5zdGFuY2VvZiBTZXQpZm9yKGxldCByIG9mIG4pdGhpcy5fdXBkYXRlU3RhdGUociwhMCk7ZWxzZSBpZihuIT1udWxsKWZvcihsZXQgciBvZiBPYmplY3Qua2V5cyhuKSl0aGlzLl91cGRhdGVTdGF0ZShyLCEhbltyXSk7dGhpcy5fYXBwbHlTdGF0ZURpZmYoKX1fdXBkYXRlU3RhdGUobixyKXtsZXQgbz10aGlzLnN0YXRlTWFwLmdldChuKTtvIT09dm9pZCAwPyhvLmVuYWJsZWQhPT1yJiYoby5jaGFuZ2VkPSEwLG8uZW5hYmxlZD1yKSxvLnRvdWNoZWQ9ITApOnRoaXMuc3RhdGVNYXAuc2V0KG4se2VuYWJsZWQ6cixjaGFuZ2VkOiEwLHRvdWNoZWQ6ITB9KX1fYXBwbHlTdGF0ZURpZmYoKXtmb3IobGV0IG4gb2YgdGhpcy5zdGF0ZU1hcCl7bGV0IHI9blswXSxvPW5bMV07by5jaGFuZ2VkPyh0aGlzLl90b2dnbGVDbGFzcyhyLG8uZW5hYmxlZCksby5jaGFuZ2VkPSExKTpvLnRvdWNoZWR8fChvLmVuYWJsZWQmJnRoaXMuX3RvZ2dsZUNsYXNzKHIsITEpLHRoaXMuc3RhdGVNYXAuZGVsZXRlKHIpKSxvLnRvdWNoZWQ9ITF9fV90b2dnbGVDbGFzcyhuLHIpe249bi50cmltKCksbi5sZW5ndGg+MCYmbi5zcGxpdChZZCkuZm9yRWFjaChvPT57cj90aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9uZ0VsLm5hdGl2ZUVsZW1lbnQsbyk6dGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LG8pfSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpKFUoRXQpLFUoQ28pKX07c3RhdGljIFx1MDI3NWRpcj1pdCh7dHlwZTplLHNlbGVjdG9yczpbWyIiLCJuZ0NsYXNzIiwiIl1dLGlucHV0czp7a2xhc3M6WzAsImNsYXNzIiwia2xhc3MiXSxuZ0NsYXNzOiJuZ0NsYXNzIn19KX1yZXR1cm4gZX0pKCksY2E9Y2xhc3N7JGltcGxpY2l0O25nRm9yT2Y7aW5kZXg7Y291bnQ7Y29uc3RydWN0b3IodCxuLHIsbyl7dGhpcy4kaW1wbGljaXQ9dCx0aGlzLm5nRm9yT2Y9bix0aGlzLmluZGV4PXIsdGhpcy5jb3VudD1vfWdldCBmaXJzdCgpe3JldHVybiB0aGlzLmluZGV4PT09MH1nZXQgbGFzdCgpe3JldHVybiB0aGlzLmluZGV4PT09dGhpcy5jb3VudC0xfWdldCBldmVuKCl7cmV0dXJuIHRoaXMuaW5kZXglMj09PTB9Z2V0IG9kZCgpe3JldHVybiF0aGlzLmV2ZW59fSxWdj0oKCk9PntjbGFzcyBle192aWV3Q29udGFpbmVyO190ZW1wbGF0ZTtfZGlmZmVycztzZXQgbmdGb3JPZihuKXt0aGlzLl9uZ0Zvck9mPW4sdGhpcy5fbmdGb3JPZkRpcnR5PSEwfXNldCBuZ0ZvclRyYWNrQnkobil7dGhpcy5fdHJhY2tCeUZuPW59Z2V0IG5nRm9yVHJhY2tCeSgpe3JldHVybiB0aGlzLl90cmFja0J5Rm59X25nRm9yT2Y9bnVsbDtfbmdGb3JPZkRpcnR5PSEwO19kaWZmZXI9bnVsbDtfdHJhY2tCeUZuO2NvbnN0cnVjdG9yKG4scixvKXt0aGlzLl92aWV3Q29udGFpbmVyPW4sdGhpcy5fdGVtcGxhdGU9cix0aGlzLl9kaWZmZXJzPW99c2V0IG5nRm9yVGVtcGxhdGUobil7biYmKHRoaXMuX3RlbXBsYXRlPW4pfW5nRG9DaGVjaygpe2lmKHRoaXMuX25nRm9yT2ZEaXJ0eSl7dGhpcy5fbmdGb3JPZkRpcnR5PSExO2xldCBuPXRoaXMuX25nRm9yT2Y7IXRoaXMuX2RpZmZlciYmbiYmKHRoaXMuX2RpZmZlcj10aGlzLl9kaWZmZXJzLmZpbmQobikuY3JlYXRlKHRoaXMubmdGb3JUcmFja0J5KSl9aWYodGhpcy5fZGlmZmVyKXtsZXQgbj10aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9uZ0Zvck9mKTtuJiZ0aGlzLl9hcHBseUNoYW5nZXMobil9fV9hcHBseUNoYW5nZXMobil7bGV0IHI9dGhpcy5fdmlld0NvbnRhaW5lcjtuLmZvckVhY2hPcGVyYXRpb24oKG8saSxzKT0+e2lmKG8ucHJldmlvdXNJbmRleD09bnVsbClyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90ZW1wbGF0ZSxuZXcgY2Eoby5pdGVtLHRoaXMuX25nRm9yT2YsLTEsLTEpLHM9PT1udWxsP3ZvaWQgMDpzKTtlbHNlIGlmKHM9PW51bGwpci5yZW1vdmUoaT09PW51bGw/dm9pZCAwOmkpO2Vsc2UgaWYoaSE9PW51bGwpe2xldCBhPXIuZ2V0KGkpO3IubW92ZShhLHMpLFB2KGEsbyl9fSk7Zm9yKGxldCBvPTAsaT1yLmxlbmd0aDtvPGk7bysrKXtsZXQgYT1yLmdldChvKS5jb250ZXh0O2EuaW5kZXg9byxhLmNvdW50PWksYS5uZ0Zvck9mPXRoaXMuX25nRm9yT2Z9bi5mb3JFYWNoSWRlbnRpdHlDaGFuZ2Uobz0+e2xldCBpPXIuZ2V0KG8uY3VycmVudEluZGV4KTtQdihpLG8pfSl9c3RhdGljIG5nVGVtcGxhdGVDb250ZXh0R3VhcmQobixyKXtyZXR1cm4hMH1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSkoVShvdCksVShudCksVSgkZCkpfTtzdGF0aWMgXHUwMjc1ZGlyPWl0KHt0eXBlOmUsc2VsZWN0b3JzOltbIiIsIm5nRm9yIiwiIiwibmdGb3JPZiIsIiJdXSxpbnB1dHM6e25nRm9yT2Y6Im5nRm9yT2YiLG5nRm9yVHJhY2tCeToibmdGb3JUcmFja0J5IixuZ0ZvclRlbXBsYXRlOiJuZ0ZvclRlbXBsYXRlIn19KX1yZXR1cm4gZX0pKCk7JF89KCgpPT57Y2xhc3MgZXtfdmlld0NvbnRhaW5lcjtfY29udGV4dD1uZXcgdWE7X3RoZW5UZW1wbGF0ZVJlZj1udWxsO19lbHNlVGVtcGxhdGVSZWY9bnVsbDtfdGhlblZpZXdSZWY9bnVsbDtfZWxzZVZpZXdSZWY9bnVsbDtjb25zdHJ1Y3RvcihuLHIpe3RoaXMuX3ZpZXdDb250YWluZXI9bix0aGlzLl90aGVuVGVtcGxhdGVSZWY9cn1zZXQgbmdJZihuKXt0aGlzLl9jb250ZXh0LiRpbXBsaWNpdD10aGlzLl9jb250ZXh0Lm5nSWY9bix0aGlzLl91cGRhdGVWaWV3KCl9c2V0IG5nSWZUaGVuKG4pe0x2KG4sITEpLHRoaXMuX3RoZW5UZW1wbGF0ZVJlZj1uLHRoaXMuX3RoZW5WaWV3UmVmPW51bGwsdGhpcy5fdXBkYXRlVmlldygpfXNldCBuZ0lmRWxzZShuKXtMdihuLCExKSx0aGlzLl9lbHNlVGVtcGxhdGVSZWY9bix0aGlzLl9lbHNlVmlld1JlZj1udWxsLHRoaXMuX3VwZGF0ZVZpZXcoKX1fdXBkYXRlVmlldygpe3RoaXMuX2NvbnRleHQuJGltcGxpY2l0P3RoaXMuX3RoZW5WaWV3UmVmfHwodGhpcy5fdmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMuX2Vsc2VWaWV3UmVmPW51bGwsdGhpcy5fdGhlblRlbXBsYXRlUmVmJiYodGhpcy5fdGhlblZpZXdSZWY9dGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGhlblRlbXBsYXRlUmVmLHRoaXMuX2NvbnRleHQpKSk6dGhpcy5fZWxzZVZpZXdSZWZ8fCh0aGlzLl92aWV3Q29udGFpbmVyLmNsZWFyKCksdGhpcy5fdGhlblZpZXdSZWY9bnVsbCx0aGlzLl9lbHNlVGVtcGxhdGVSZWYmJih0aGlzLl9lbHNlVmlld1JlZj10aGlzLl92aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl9lbHNlVGVtcGxhdGVSZWYsdGhpcy5fY29udGV4dCkpKX1zdGF0aWMgbmdJZlVzZUlmVHlwZUd1YXJkO3N0YXRpYyBuZ1RlbXBsYXRlR3VhcmRfbmdJZjtzdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZChuLHIpe3JldHVybiEwfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKShVKG90KSxVKG50KSl9O3N0YXRpYyBcdTAyNzVkaXI9aXQoe3R5cGU6ZSxzZWxlY3RvcnM6W1siIiwibmdJZiIsIiJdXSxpbnB1dHM6e25nSWY6Im5nSWYiLG5nSWZUaGVuOiJuZ0lmVGhlbiIsbmdJZkVsc2U6Im5nSWZFbHNlIn19KX1yZXR1cm4gZX0pKCksdWE9Y2xhc3N7JGltcGxpY2l0PW51bGw7bmdJZj1udWxsfTtsYT1jbGFzc3tfdmlld0NvbnRhaW5lclJlZjtfdGVtcGxhdGVSZWY7X2NyZWF0ZWQ9ITE7Y29uc3RydWN0b3IodCxuKXt0aGlzLl92aWV3Q29udGFpbmVyUmVmPXQsdGhpcy5fdGVtcGxhdGVSZWY9bn1jcmVhdGUoKXt0aGlzLl9jcmVhdGVkPSEwLHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlUmVmKX1kZXN0cm95KCl7dGhpcy5fY3JlYXRlZD0hMSx0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNsZWFyKCl9ZW5mb3JjZVN0YXRlKHQpe3QmJiF0aGlzLl9jcmVhdGVkP3RoaXMuY3JlYXRlKCk6IXQmJnRoaXMuX2NyZWF0ZWQmJnRoaXMuZGVzdHJveSgpfX0sWGQ9KCgpPT57Y2xhc3MgZXtfZGVmYXVsdFZpZXdzPVtdO19kZWZhdWx0VXNlZD0hMTtfY2FzZUNvdW50PTA7X2xhc3RDYXNlQ2hlY2tJbmRleD0wO19sYXN0Q2FzZXNNYXRjaGVkPSExO19uZ1N3aXRjaDtzZXQgbmdTd2l0Y2gobil7dGhpcy5fbmdTd2l0Y2g9bix0aGlzLl9jYXNlQ291bnQ9PT0wJiZ0aGlzLl91cGRhdGVEZWZhdWx0Q2FzZXMoITApfV9hZGRDYXNlKCl7cmV0dXJuIHRoaXMuX2Nhc2VDb3VudCsrfV9hZGREZWZhdWx0KG4pe3RoaXMuX2RlZmF1bHRWaWV3cy5wdXNoKG4pfV9tYXRjaENhc2Uobil7bGV0IHI9bj09PXRoaXMuX25nU3dpdGNoO3JldHVybiB0aGlzLl9sYXN0Q2FzZXNNYXRjaGVkfHw9cix0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXgrKyx0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXg9PT10aGlzLl9jYXNlQ291bnQmJih0aGlzLl91cGRhdGVEZWZhdWx0Q2FzZXMoIXRoaXMuX2xhc3RDYXNlc01hdGNoZWQpLHRoaXMuX2xhc3RDYXNlQ2hlY2tJbmRleD0wLHRoaXMuX2xhc3RDYXNlc01hdGNoZWQ9ITEpLHJ9X3VwZGF0ZURlZmF1bHRDYXNlcyhuKXtpZih0aGlzLl9kZWZhdWx0Vmlld3MubGVuZ3RoPjAmJm4hPT10aGlzLl9kZWZhdWx0VXNlZCl7dGhpcy5fZGVmYXVsdFVzZWQ9bjtmb3IobGV0IHIgb2YgdGhpcy5fZGVmYXVsdFZpZXdzKXIuZW5mb3JjZVN0YXRlKG4pfX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSl9O3N0YXRpYyBcdTAyNzVkaXI9aXQoe3R5cGU6ZSxzZWxlY3RvcnM6W1siIiwibmdTd2l0Y2giLCIiXV0saW5wdXRzOntuZ1N3aXRjaDoibmdTd2l0Y2gifX0pfXJldHVybiBlfSkoKSx6Xz0oKCk9PntjbGFzcyBle25nU3dpdGNoO192aWV3O25nU3dpdGNoQ2FzZTtjb25zdHJ1Y3RvcihuLHIsbyl7dGhpcy5uZ1N3aXRjaD1vLG8uX2FkZENhc2UoKSx0aGlzLl92aWV3PW5ldyBsYShuLHIpfW5nRG9DaGVjaygpe3RoaXMuX3ZpZXcuZW5mb3JjZVN0YXRlKHRoaXMubmdTd2l0Y2guX21hdGNoQ2FzZSh0aGlzLm5nU3dpdGNoQ2FzZSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKShVKG90KSxVKG50KSxVKFhkLDkpKX07c3RhdGljIFx1MDI3NWRpcj1pdCh7dHlwZTplLHNlbGVjdG9yczpbWyIiLCJuZ1N3aXRjaENhc2UiLCIiXV0saW5wdXRzOntuZ1N3aXRjaENhc2U6Im5nU3dpdGNoQ2FzZSJ9fSl9cmV0dXJuIGV9KSgpLEdfPSgoKT0+e2NsYXNzIGV7Y29uc3RydWN0b3IobixyLG8pe28uX2FkZERlZmF1bHQobmV3IGxhKG4scikpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKShVKG90KSxVKG50KSxVKFhkLDkpKX07c3RhdGljIFx1MDI3NWRpcj1pdCh7dHlwZTplLHNlbGVjdG9yczpbWyIiLCJuZ1N3aXRjaERlZmF1bHQiLCIiXV19KX1yZXR1cm4gZX0pKCksV189KCgpPT57Y2xhc3MgZXtfbmdFbDtfZGlmZmVycztfcmVuZGVyZXI7X25nU3R5bGU9bnVsbDtfZGlmZmVyPW51bGw7Y29uc3RydWN0b3IobixyLG8pe3RoaXMuX25nRWw9bix0aGlzLl9kaWZmZXJzPXIsdGhpcy5fcmVuZGVyZXI9b31zZXQgbmdTdHlsZShuKXt0aGlzLl9uZ1N0eWxlPW4sIXRoaXMuX2RpZmZlciYmbiYmKHRoaXMuX2RpZmZlcj10aGlzLl9kaWZmZXJzLmZpbmQobikuY3JlYXRlKCkpfW5nRG9DaGVjaygpe2lmKHRoaXMuX2RpZmZlcil7bGV0IG49dGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fbmdTdHlsZSk7biYmdGhpcy5fYXBwbHlDaGFuZ2VzKG4pfX1fc2V0U3R5bGUobixyKXtsZXRbbyxpXT1uLnNwbGl0KCIuIikscz1vLmluZGV4T2YoIi0iKT09PS0xP3ZvaWQgMDpVZS5EYXNoQ2FzZTtyIT1udWxsP3RoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHRoaXMuX25nRWwubmF0aXZlRWxlbWVudCxvLGk/YCR7cn0ke2l9YDpyLHMpOnRoaXMuX3JlbmRlcmVyLnJlbW92ZVN0eWxlKHRoaXMuX25nRWwubmF0aXZlRWxlbWVudCxvLHMpfV9hcHBseUNoYW5nZXMobil7bi5mb3JFYWNoUmVtb3ZlZEl0ZW0ocj0+dGhpcy5fc2V0U3R5bGUoci5rZXksbnVsbCkpLG4uZm9yRWFjaEFkZGVkSXRlbShyPT50aGlzLl9zZXRTdHlsZShyLmtleSxyLmN1cnJlbnRWYWx1ZSkpLG4uZm9yRWFjaENoYW5nZWRJdGVtKHI9PnRoaXMuX3NldFN0eWxlKHIua2V5LHIuY3VycmVudFZhbHVlKSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpKFUoRXQpLFUoemQpLFUoQ28pKX07c3RhdGljIFx1MDI3NWRpcj1pdCh7dHlwZTplLHNlbGVjdG9yczpbWyIiLCJuZ1N0eWxlIiwiIl1dLGlucHV0czp7bmdTdHlsZToibmdTdHlsZSJ9fSl9cmV0dXJuIGV9KSgpLHFfPSgoKT0+e2NsYXNzIGV7X3ZpZXdDb250YWluZXJSZWY7X3ZpZXdSZWY9bnVsbDtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dD1udWxsO25nVGVtcGxhdGVPdXRsZXQ9bnVsbDtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3I9bnVsbDtjb25zdHJ1Y3RvcihuKXt0aGlzLl92aWV3Q29udGFpbmVyUmVmPW59bmdPbkNoYW5nZXMobil7aWYodGhpcy5fc2hvdWxkUmVjcmVhdGVWaWV3KG4pKXtsZXQgcj10aGlzLl92aWV3Q29udGFpbmVyUmVmO2lmKHRoaXMuX3ZpZXdSZWYmJnIucmVtb3ZlKHIuaW5kZXhPZih0aGlzLl92aWV3UmVmKSksIXRoaXMubmdUZW1wbGF0ZU91dGxldCl7dGhpcy5fdmlld1JlZj1udWxsO3JldHVybn1sZXQgbz10aGlzLl9jcmVhdGVDb250ZXh0Rm9yd2FyZFByb3h5KCk7dGhpcy5fdmlld1JlZj1yLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLm5nVGVtcGxhdGVPdXRsZXQsbyx7aW5qZWN0b3I6dGhpcy5uZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3I/P3ZvaWQgMH0pfX1fc2hvdWxkUmVjcmVhdGVWaWV3KG4pe3JldHVybiEhbi5uZ1RlbXBsYXRlT3V0bGV0fHwhIW4ubmdUZW1wbGF0ZU91dGxldEluamVjdG9yfV9jcmVhdGVDb250ZXh0Rm9yd2FyZFByb3h5KCl7cmV0dXJuIG5ldyBQcm94eSh7fSx7c2V0OihuLHIsbyk9PnRoaXMubmdUZW1wbGF0ZU91dGxldENvbnRleHQ/UmVmbGVjdC5zZXQodGhpcy5uZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCxyLG8pOiExLGdldDoobixyLG8pPT57aWYodGhpcy5uZ1RlbXBsYXRlT3V0bGV0Q29udGV4dClyZXR1cm4gUmVmbGVjdC5nZXQodGhpcy5uZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCxyLG8pfX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKShVKG90KSl9O3N0YXRpYyBcdTAyNzVkaXI9aXQoe3R5cGU6ZSxzZWxlY3RvcnM6W1siIiwibmdUZW1wbGF0ZU91dGxldCIsIiJdXSxpbnB1dHM6e25nVGVtcGxhdGVPdXRsZXRDb250ZXh0OiJuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCIsbmdUZW1wbGF0ZU91dGxldDoibmdUZW1wbGF0ZU91dGxldCIsbmdUZW1wbGF0ZU91dGxldEluamVjdG9yOiJuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3IifSxmZWF0dXJlczpbT2xdfSl9cmV0dXJuIGV9KSgpO1FkPWNsYXNze2NyZWF0ZVN1YnNjcmlwdGlvbih0LG4scil7cmV0dXJuIG5hKCgpPT50LnN1YnNjcmliZSh7bmV4dDpuLGVycm9yOnJ9KSl9ZGlzcG9zZSh0KXtuYSgoKT0+dC51bnN1YnNjcmliZSgpKX19LEtkPWNsYXNze2NyZWF0ZVN1YnNjcmlwdGlvbih0LG4scil7cmV0dXJuIHQudGhlbihvPT5uPy4obyksbz0+cj8uKG8pKSx7dW5zdWJzY3JpYmU6KCk9PntuPW51bGwscj1udWxsfX19ZGlzcG9zZSh0KXt0LnVuc3Vic2NyaWJlKCl9fSxaXz1uZXcgS2QsWV89bmV3IFFkLFFfPSgoKT0+e2NsYXNzIGV7X3JlZjtfbGF0ZXN0VmFsdWU9bnVsbDttYXJrRm9yQ2hlY2tPblZhbHVlVXBkYXRlPSEwO19zdWJzY3JpcHRpb249bnVsbDtfb2JqPW51bGw7X3N0cmF0ZWd5PW51bGw7YXBwbGljYXRpb25FcnJvckhhbmRsZXI9eShCZSk7Y29uc3RydWN0b3Iobil7dGhpcy5fcmVmPW59bmdPbkRlc3Ryb3koKXt0aGlzLl9zdWJzY3JpcHRpb24mJnRoaXMuX2Rpc3Bvc2UoKSx0aGlzLl9yZWY9bnVsbH10cmFuc2Zvcm0obil7aWYoIXRoaXMuX29iail7aWYobil0cnl7dGhpcy5tYXJrRm9yQ2hlY2tPblZhbHVlVXBkYXRlPSExLHRoaXMuX3N1YnNjcmliZShuKX1maW5hbGx5e3RoaXMubWFya0ZvckNoZWNrT25WYWx1ZVVwZGF0ZT0hMH1yZXR1cm4gdGhpcy5fbGF0ZXN0VmFsdWV9cmV0dXJuIG4hPT10aGlzLl9vYmo/KHRoaXMuX2Rpc3Bvc2UoKSx0aGlzLnRyYW5zZm9ybShuKSk6dGhpcy5fbGF0ZXN0VmFsdWV9X3N1YnNjcmliZShuKXt0aGlzLl9vYmo9bix0aGlzLl9zdHJhdGVneT10aGlzLl9zZWxlY3RTdHJhdGVneShuKSx0aGlzLl9zdWJzY3JpcHRpb249dGhpcy5fc3RyYXRlZ3kuY3JlYXRlU3Vic2NyaXB0aW9uKG4scj0+dGhpcy5fdXBkYXRlTGF0ZXN0VmFsdWUobixyKSxyPT50aGlzLmFwcGxpY2F0aW9uRXJyb3JIYW5kbGVyKHIpKX1fc2VsZWN0U3RyYXRlZ3kobil7aWYoTW8obikpcmV0dXJuIFpfO2lmKFhzKG4pKXJldHVybiBZXzt0aHJvdyBlZihlLG4pfV9kaXNwb3NlKCl7dGhpcy5fc3RyYXRlZ3kuZGlzcG9zZSh0aGlzLl9zdWJzY3JpcHRpb24pLHRoaXMuX2xhdGVzdFZhbHVlPW51bGwsdGhpcy5fc3Vic2NyaXB0aW9uPW51bGwsdGhpcy5fb2JqPW51bGx9X3VwZGF0ZUxhdGVzdFZhbHVlKG4scil7bj09PXRoaXMuX29iaiYmKHRoaXMuX2xhdGVzdFZhbHVlPXIsdGhpcy5tYXJrRm9yQ2hlY2tPblZhbHVlVXBkYXRlJiZ0aGlzLl9yZWY/Lm1hcmtGb3JDaGVjaygpKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSkoVShVZCwxNikpfTtzdGF0aWMgXHUwMjc1cGlwZT1ibyh7bmFtZToiYXN5bmMiLHR5cGU6ZSxwdXJlOiExfSl9cmV0dXJuIGV9KSgpLEtfPSgoKT0+e2NsYXNzIGV7dHJhbnNmb3JtKG4pe2lmKG49PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIG4hPSJzdHJpbmciKXRocm93IGVmKGUsbik7cmV0dXJuIG4udG9Mb3dlckNhc2UoKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSl9O3N0YXRpYyBcdTAyNzVwaXBlPWJvKHtuYW1lOiJsb3dlcmNhc2UiLHR5cGU6ZSxwdXJlOiEwfSl9cmV0dXJuIGV9KSgpLEpfPSgoKT0+e2NsYXNzIGV7X2xvY2FsZTtjb25zdHJ1Y3RvcihuKXt0aGlzLl9sb2NhbGU9bn10cmFuc2Zvcm0obixyLG8pe2lmKCFYXyhuKSlyZXR1cm4gbnVsbDtvfHw9dGhpcy5fbG9jYWxlO3RyeXtsZXQgaT1lTShuKTtyZXR1cm4gQnYoaSxvLHIpfWNhdGNoKGkpe3Rocm93IGVmKGUsaS5tZXNzYWdlKX19c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpKFUoTm8sMTYpKX07c3RhdGljIFx1MDI3NXBpcGU9Ym8oe25hbWU6Im51bWJlciIsdHlwZTplLHB1cmU6ITB9KX1yZXR1cm4gZX0pKCk7dGY9KCgpPT57Y2xhc3MgZXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSl9O3N0YXRpYyBcdTAyNzVtb2Q9QnQoe3R5cGU6ZX0pO3N0YXRpYyBcdTAyNzVpbmo9cHQoe30pfXJldHVybiBlfSkoKX0pO2Z1bmN0aW9uIEZvKGUsdCl7dD1lbmNvZGVVUklDb21wb25lbnQodCk7Zm9yKGxldCBuIG9mIGUuc3BsaXQoIjsiKSl7bGV0IHI9bi5pbmRleE9mKCI9IiksW28saV09cj09LTE/W24sIiJdOltuLnNsaWNlKDAsciksbi5zbGljZShyKzEpXTtpZihvLnRyaW0oKT09PXQpcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpKX1yZXR1cm4gbnVsbH12YXIgTW4sbmY9aCgoKT0+e01uPWNsYXNze319KTtmdW5jdGlvbiB0VShlKXtyZXR1cm4gZT09PW9mfWZ1bmN0aW9uIHRNKGUsdCl7bGV0IG49ZS5nZXRFbGVtZW50QnlJZCh0KXx8ZS5nZXRFbGVtZW50c0J5TmFtZSh0KVswXTtpZihuKXJldHVybiBuO2lmKHR5cGVvZiBlLmNyZWF0ZVRyZWVXYWxrZXI9PSJmdW5jdGlvbiImJmUuYm9keSYmdHlwZW9mIGUuYm9keS5hdHRhY2hTaGFkb3c9PSJmdW5jdGlvbiIpe2xldCByPWUuY3JlYXRlVHJlZVdhbGtlcihlLmJvZHksTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpLG89ci5jdXJyZW50Tm9kZTtmb3IoO287KXtsZXQgaT1vLnNoYWRvd1Jvb3Q7aWYoaSl7bGV0IHM9aS5nZXRFbGVtZW50QnlJZCh0KXx8aS5xdWVyeVNlbGVjdG9yKGBbbmFtZT0iJHt0fSJdYCk7aWYocylyZXR1cm4gc31vPXIubmV4dE5vZGUoKX19cmV0dXJuIG51bGx9dmFyIG9mLG5VLHJmLGRhPWgoKCk9PntIdigpO2hlKCk7aGUoKTtuZigpO1dkKCk7b2Y9ImJyb3dzZXIiO25VPSgoKT0+e2NsYXNzIGV7c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT5uZXcgcmYoeShZKSx3aW5kb3cpfSl9cmV0dXJuIGV9KSgpLHJmPWNsYXNze2RvY3VtZW50O3dpbmRvdztvZmZzZXQ9KCk9PlswLDBdO2NvbnN0cnVjdG9yKHQsbil7dGhpcy5kb2N1bWVudD10LHRoaXMud2luZG93PW59c2V0T2Zmc2V0KHQpe0FycmF5LmlzQXJyYXkodCk/dGhpcy5vZmZzZXQ9KCk9PnQ6dGhpcy5vZmZzZXQ9dH1nZXRTY3JvbGxQb3NpdGlvbigpe3JldHVyblt0aGlzLndpbmRvdy5zY3JvbGxYLHRoaXMud2luZG93LnNjcm9sbFldfXNjcm9sbFRvUG9zaXRpb24odCxuKXt0aGlzLndpbmRvdy5zY3JvbGxUbyhHKFYoe30sbikse2xlZnQ6dFswXSx0b3A6dFsxXX0pKX1zY3JvbGxUb0FuY2hvcih0LG4pe2xldCByPXRNKHRoaXMuZG9jdW1lbnQsdCk7ciYmKHRoaXMuc2Nyb2xsVG9FbGVtZW50KHIsbiksci5mb2N1cygpKX1zZXRIaXN0b3J5U2Nyb2xsUmVzdG9yYXRpb24odCl7dHJ5e3RoaXMud2luZG93Lmhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb249dH1jYXRjaHtjb25zb2xlLndhcm4oWWUoMjQwMCwhMSkpfX1zY3JvbGxUb0VsZW1lbnQodCxuKXtsZXQgcj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89ci5sZWZ0K3RoaXMud2luZG93LnBhZ2VYT2Zmc2V0LGk9ci50b3ArdGhpcy53aW5kb3cucGFnZVlPZmZzZXQscz10aGlzLm9mZnNldCgpO3RoaXMud2luZG93LnNjcm9sbFRvKEcoVih7fSxuKSx7bGVmdDpvLXNbMF0sdG9wOmktc1sxXX0pKX19fSk7ZnVuY3Rpb24gVXYoZSl7Zm9yKGxldCB0IG9mIGUpdC5yZW1vdmUoKX1mdW5jdGlvbiAkdihlLHQpe2xldCBuPXQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtyZXR1cm4gbi50ZXh0Q29udGVudD1lLG59ZnVuY3Rpb24gbk0oZSx0LG4scil7bGV0IG89ZS5oZWFkPy5xdWVyeVNlbGVjdG9yQWxsKGBzdHlsZVske3NmfT0iJHt0fSJdLGxpbmtbJHtzZn09IiR7dH0iXWApO2lmKG8pZm9yKGxldCBpIG9mIG8paS5yZW1vdmVBdHRyaWJ1dGUoc2YpLGkgaW5zdGFuY2VvZiBIVE1MTGlua0VsZW1lbnQ/ci5zZXQoaS5ocmVmLnNsaWNlKGkuaHJlZi5sYXN0SW5kZXhPZigiLyIpKzEpLHt1c2FnZTowLGVsZW1lbnRzOltpXX0pOmkudGV4dENvbnRlbnQmJm4uc2V0KGkudGV4dENvbnRlbnQse3VzYWdlOjAsZWxlbWVudHM6W2ldfSl9ZnVuY3Rpb24gY2YoZSx0KXtsZXQgbj10LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTtyZXR1cm4gbi5zZXRBdHRyaWJ1dGUoInJlbCIsInN0eWxlc2hlZXQiKSxuLnNldEF0dHJpYnV0ZSgiaHJlZiIsZSksbn1mdW5jdGlvbiBhTShlKXtyZXR1cm4gb00ucmVwbGFjZShmZixlKX1mdW5jdGlvbiBjTShlKXtyZXR1cm4gck0ucmVwbGFjZShmZixlKX1mdW5jdGlvbiBXdihlLHQpe3JldHVybiB0Lm1hcChuPT5uLnJlcGxhY2UoZmYsZSkpfWZ1bmN0aW9uIHp2KGUpe3JldHVybiBlLnRhZ05hbWU9PT0iVEVNUExBVEUiJiZlLmNvbnRlbnQhPT12b2lkIDB9dmFyIGtvLGZhLGhhLGxmLHNmLGRmLGFmLGZmLEd2LHJNLG9NLGlNLHNNLHBmLFBvLHVmLExvLHBhLHF2PWgoKCk9PntkYSgpO2hlKCk7aGUoKTtrbz1jbGFzc3tfZG9jO2NvbnN0cnVjdG9yKHQpe3RoaXMuX2RvYz10fW1hbmFnZXJ9LGZhPSgoKT0+e2NsYXNzIGUgZXh0ZW5kcyBrb3tjb25zdHJ1Y3RvcihuKXtzdXBlcihuKX1zdXBwb3J0cyhuKXtyZXR1cm4hMH1hZGRFdmVudExpc3RlbmVyKG4scixvLGkpe3JldHVybiBuLmFkZEV2ZW50TGlzdGVuZXIocixvLGkpLCgpPT50aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobixyLG8saSl9cmVtb3ZlRXZlbnRMaXN0ZW5lcihuLHIsbyxpKXtyZXR1cm4gbi5yZW1vdmVFdmVudExpc3RlbmVyKHIsbyxpKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSkoQyhZKSl9O3N0YXRpYyBcdTAyNzVwcm92PU4oe3Rva2VuOmUsZmFjdG9yeTplLlx1MDI3NWZhY30pfXJldHVybiBlfSkoKSxoYT1uZXcgVCgiIiksbGY9KCgpPT57Y2xhc3MgZXtfem9uZTtfcGx1Z2lucztfZXZlbnROYW1lVG9QbHVnaW49bmV3IE1hcDtjb25zdHJ1Y3RvcihuLHIpe3RoaXMuX3pvbmU9cixuLmZvckVhY2gocz0+e3MubWFuYWdlcj10aGlzfSk7bGV0IG89bi5maWx0ZXIocz0+IShzIGluc3RhbmNlb2YgZmEpKTt0aGlzLl9wbHVnaW5zPW8uc2xpY2UoKS5yZXZlcnNlKCk7bGV0IGk9bi5maW5kKHM9PnMgaW5zdGFuY2VvZiBmYSk7aSYmdGhpcy5fcGx1Z2lucy5wdXNoKGkpfWFkZEV2ZW50TGlzdGVuZXIobixyLG8saSl7cmV0dXJuIHRoaXMuX2ZpbmRQbHVnaW5Gb3IocikuYWRkRXZlbnRMaXN0ZW5lcihuLHIsbyxpKX1nZXRab25lKCl7cmV0dXJuIHRoaXMuX3pvbmV9X2ZpbmRQbHVnaW5Gb3Iobil7bGV0IHI9dGhpcy5fZXZlbnROYW1lVG9QbHVnaW4uZ2V0KG4pO2lmKHIpcmV0dXJuIHI7aWYocj10aGlzLl9wbHVnaW5zLmZpbmQoaT0+aS5zdXBwb3J0cyhuKSksIXIpdGhyb3cgbmV3IHYoNTEwMSwhMSk7cmV0dXJuIHRoaXMuX2V2ZW50TmFtZVRvUGx1Z2luLnNldChuLHIpLHJ9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpKEMoaGEpLEMoeikpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6ZS5cdTAyNzVmYWN9KX1yZXR1cm4gZX0pKCksc2Y9Im5nLWFwcC1pZCI7ZGY9KCgpPT57Y2xhc3MgZXtkb2M7YXBwSWQ7bm9uY2U7aW5saW5lPW5ldyBNYXA7ZXh0ZXJuYWw9bmV3IE1hcDtob3N0cz1uZXcgU2V0O2NvbnN0cnVjdG9yKG4scixvLGk9e30pe3RoaXMuZG9jPW4sdGhpcy5hcHBJZD1yLHRoaXMubm9uY2U9byxuTShuLHIsdGhpcy5pbmxpbmUsdGhpcy5leHRlcm5hbCksdGhpcy5ob3N0cy5hZGQobi5oZWFkKX1hZGRTdHlsZXMobixyKXtmb3IobGV0IG8gb2Ygbil0aGlzLmFkZFVzYWdlKG8sdGhpcy5pbmxpbmUsJHYpO3I/LmZvckVhY2gobz0+dGhpcy5hZGRVc2FnZShvLHRoaXMuZXh0ZXJuYWwsY2YpKX1yZW1vdmVTdHlsZXMobixyKXtmb3IobGV0IG8gb2Ygbil0aGlzLnJlbW92ZVVzYWdlKG8sdGhpcy5pbmxpbmUpO3I/LmZvckVhY2gobz0+dGhpcy5yZW1vdmVVc2FnZShvLHRoaXMuZXh0ZXJuYWwpKX1hZGRVc2FnZShuLHIsbyl7bGV0IGk9ci5nZXQobik7aT9pLnVzYWdlKys6ci5zZXQobix7dXNhZ2U6MSxlbGVtZW50czpbLi4udGhpcy5ob3N0c10ubWFwKHM9PnRoaXMuYWRkRWxlbWVudChzLG8obix0aGlzLmRvYykpKX0pfXJlbW92ZVVzYWdlKG4scil7bGV0IG89ci5nZXQobik7byYmKG8udXNhZ2UtLSxvLnVzYWdlPD0wJiYoVXYoby5lbGVtZW50cyksci5kZWxldGUobikpKX1uZ09uRGVzdHJveSgpe2ZvcihsZXRbLHtlbGVtZW50czpufV1vZlsuLi50aGlzLmlubGluZSwuLi50aGlzLmV4dGVybmFsXSlVdihuKTt0aGlzLmhvc3RzLmNsZWFyKCl9YWRkSG9zdChuKXt0aGlzLmhvc3RzLmFkZChuKTtmb3IobGV0W3Ise2VsZW1lbnRzOm99XW9mIHRoaXMuaW5saW5lKW8ucHVzaCh0aGlzLmFkZEVsZW1lbnQobiwkdihyLHRoaXMuZG9jKSkpO2ZvcihsZXRbcix7ZWxlbWVudHM6b31db2YgdGhpcy5leHRlcm5hbClvLnB1c2godGhpcy5hZGRFbGVtZW50KG4sY2Yocix0aGlzLmRvYykpKX1yZW1vdmVIb3N0KG4pe3RoaXMuaG9zdHMuZGVsZXRlKG4pfWFkZEVsZW1lbnQobixyKXtyZXR1cm4gdGhpcy5ub25jZSYmci5zZXRBdHRyaWJ1dGUoIm5vbmNlIix0aGlzLm5vbmNlKSxuLmFwcGVuZENoaWxkKHIpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKShDKFkpLEMoa3MpLEMoTHMsOCksQyhtbykpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6ZS5cdTAyNzVmYWN9KX1yZXR1cm4gZX0pKCksYWY9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIix4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsbWF0aDoiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCJ9LGZmPS8lQ09NUCUvZyxHdj0iJUNPTVAlIixyTT1gX25naG9zdC0ke0d2fWAsb009YF9uZ2NvbnRlbnQtJHtHdn1gLGlNPSEwLHNNPW5ldyBUKCIiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT5pTX0pO3BmPSgoKT0+e2NsYXNzIGV7ZXZlbnRNYW5hZ2VyO3NoYXJlZFN0eWxlc0hvc3Q7YXBwSWQ7cmVtb3ZlU3R5bGVzT25Db21wRGVzdHJveTtkb2M7bmdab25lO25vbmNlO3RyYWNpbmdTZXJ2aWNlO3JlbmRlcmVyQnlDb21wSWQ9bmV3IE1hcDtkZWZhdWx0UmVuZGVyZXI7cGxhdGZvcm1Jc1NlcnZlcjtjb25zdHJ1Y3RvcihuLHIsbyxpLHMsYSxjPW51bGwsdT1udWxsKXt0aGlzLmV2ZW50TWFuYWdlcj1uLHRoaXMuc2hhcmVkU3R5bGVzSG9zdD1yLHRoaXMuYXBwSWQ9byx0aGlzLnJlbW92ZVN0eWxlc09uQ29tcERlc3Ryb3k9aSx0aGlzLmRvYz1zLHRoaXMubmdab25lPWEsdGhpcy5ub25jZT1jLHRoaXMudHJhY2luZ1NlcnZpY2U9dSx0aGlzLnBsYXRmb3JtSXNTZXJ2ZXI9ITEsdGhpcy5kZWZhdWx0UmVuZGVyZXI9bmV3IFBvKG4scyxhLHRoaXMucGxhdGZvcm1Jc1NlcnZlcix0aGlzLnRyYWNpbmdTZXJ2aWNlKX1jcmVhdGVSZW5kZXJlcihuLHIpe2lmKCFufHwhcilyZXR1cm4gdGhpcy5kZWZhdWx0UmVuZGVyZXI7bGV0IG89dGhpcy5nZXRPckNyZWF0ZVJlbmRlcmVyKG4scik7cmV0dXJuIG8gaW5zdGFuY2VvZiBwYT9vLmFwcGx5VG9Ib3N0KG4pOm8gaW5zdGFuY2VvZiBMbyYmby5hcHBseVN0eWxlcygpLG99Z2V0T3JDcmVhdGVSZW5kZXJlcihuLHIpe2xldCBvPXRoaXMucmVuZGVyZXJCeUNvbXBJZCxpPW8uZ2V0KHIuaWQpO2lmKCFpKXtsZXQgcz10aGlzLmRvYyxhPXRoaXMubmdab25lLGM9dGhpcy5ldmVudE1hbmFnZXIsdT10aGlzLnNoYXJlZFN0eWxlc0hvc3QsbD10aGlzLnJlbW92ZVN0eWxlc09uQ29tcERlc3Ryb3ksZD10aGlzLnBsYXRmb3JtSXNTZXJ2ZXIscD10aGlzLnRyYWNpbmdTZXJ2aWNlO3N3aXRjaChyLmVuY2Fwc3VsYXRpb24pe2Nhc2UgdnQuRW11bGF0ZWQ6aT1uZXcgcGEoYyx1LHIsdGhpcy5hcHBJZCxsLHMsYSxkLHApO2JyZWFrO2Nhc2UgdnQuU2hhZG93RG9tOnJldHVybiBuZXcgdWYoYyx1LG4scixzLGEsdGhpcy5ub25jZSxkLHApO2RlZmF1bHQ6aT1uZXcgTG8oYyx1LHIsbCxzLGEsZCxwKTticmVha31vLnNldChyLmlkLGkpfXJldHVybiBpfW5nT25EZXN0cm95KCl7dGhpcy5yZW5kZXJlckJ5Q29tcElkLmNsZWFyKCl9Y29tcG9uZW50UmVwbGFjZWQobil7dGhpcy5yZW5kZXJlckJ5Q29tcElkLmRlbGV0ZShuKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSkoQyhsZiksQyhkZiksQyhrcyksQyhzTSksQyhZKSxDKHopLEMoTHMpLEMoTHQsOCkpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6ZS5cdTAyNzVmYWN9KX1yZXR1cm4gZX0pKCksUG89Y2xhc3N7ZXZlbnRNYW5hZ2VyO2RvYztuZ1pvbmU7cGxhdGZvcm1Jc1NlcnZlcjt0cmFjaW5nU2VydmljZTtkYXRhPU9iamVjdC5jcmVhdGUobnVsbCk7dGhyb3dPblN5bnRoZXRpY1Byb3BzPSEwO2NvbnN0cnVjdG9yKHQsbixyLG8saSl7dGhpcy5ldmVudE1hbmFnZXI9dCx0aGlzLmRvYz1uLHRoaXMubmdab25lPXIsdGhpcy5wbGF0Zm9ybUlzU2VydmVyPW8sdGhpcy50cmFjaW5nU2VydmljZT1pfWRlc3Ryb3koKXt9ZGVzdHJveU5vZGU9bnVsbDtjcmVhdGVFbGVtZW50KHQsbil7cmV0dXJuIG4/dGhpcy5kb2MuY3JlYXRlRWxlbWVudE5TKGFmW25dfHxuLHQpOnRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQodCl9Y3JlYXRlQ29tbWVudCh0KXtyZXR1cm4gdGhpcy5kb2MuY3JlYXRlQ29tbWVudCh0KX1jcmVhdGVUZXh0KHQpe3JldHVybiB0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZSh0KX1hcHBlbmRDaGlsZCh0LG4peyh6dih0KT90LmNvbnRlbnQ6dCkuYXBwZW5kQ2hpbGQobil9aW5zZXJ0QmVmb3JlKHQsbixyKXt0JiYoenYodCk/dC5jb250ZW50OnQpLmluc2VydEJlZm9yZShuLHIpfXJlbW92ZUNoaWxkKHQsbil7bi5yZW1vdmUoKX1zZWxlY3RSb290RWxlbWVudCh0LG4pe2xldCByPXR5cGVvZiB0PT0ic3RyaW5nIj90aGlzLmRvYy5xdWVyeVNlbGVjdG9yKHQpOnQ7aWYoIXIpdGhyb3cgbmV3IHYoLTUxMDQsITEpO3JldHVybiBufHwoci50ZXh0Q29udGVudD0iIikscn1wYXJlbnROb2RlKHQpe3JldHVybiB0LnBhcmVudE5vZGV9bmV4dFNpYmxpbmcodCl7cmV0dXJuIHQubmV4dFNpYmxpbmd9c2V0QXR0cmlidXRlKHQsbixyLG8pe2lmKG8pe249bysiOiIrbjtsZXQgaT1hZltvXTtpP3Quc2V0QXR0cmlidXRlTlMoaSxuLHIpOnQuc2V0QXR0cmlidXRlKG4scil9ZWxzZSB0LnNldEF0dHJpYnV0ZShuLHIpfXJlbW92ZUF0dHJpYnV0ZSh0LG4scil7aWYocil7bGV0IG89YWZbcl07bz90LnJlbW92ZUF0dHJpYnV0ZU5TKG8sbik6dC5yZW1vdmVBdHRyaWJ1dGUoYCR7cn06JHtufWApfWVsc2UgdC5yZW1vdmVBdHRyaWJ1dGUobil9YWRkQ2xhc3ModCxuKXt0LmNsYXNzTGlzdC5hZGQobil9cmVtb3ZlQ2xhc3ModCxuKXt0LmNsYXNzTGlzdC5yZW1vdmUobil9c2V0U3R5bGUodCxuLHIsbyl7byYoVWUuRGFzaENhc2V8VWUuSW1wb3J0YW50KT90LnN0eWxlLnNldFByb3BlcnR5KG4scixvJlVlLkltcG9ydGFudD8iaW1wb3J0YW50IjoiIik6dC5zdHlsZVtuXT1yfXJlbW92ZVN0eWxlKHQsbixyKXtyJlVlLkRhc2hDYXNlP3Quc3R5bGUucmVtb3ZlUHJvcGVydHkobik6dC5zdHlsZVtuXT0iIn1zZXRQcm9wZXJ0eSh0LG4scil7dCE9bnVsbCYmKHRbbl09cil9c2V0VmFsdWUodCxuKXt0Lm5vZGVWYWx1ZT1ufWxpc3Rlbih0LG4scixvKXtpZih0eXBlb2YgdD09InN0cmluZyImJih0PXN0KCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5kb2MsdCksIXQpKXRocm93IG5ldyB2KDUxMDIsITEpO2xldCBpPXRoaXMuZGVjb3JhdGVQcmV2ZW50RGVmYXVsdChyKTtyZXR1cm4gdGhpcy50cmFjaW5nU2VydmljZT8ud3JhcEV2ZW50TGlzdGVuZXImJihpPXRoaXMudHJhY2luZ1NlcnZpY2Uud3JhcEV2ZW50TGlzdGVuZXIodCxuLGkpKSx0aGlzLmV2ZW50TWFuYWdlci5hZGRFdmVudExpc3RlbmVyKHQsbixpLG8pfWRlY29yYXRlUHJldmVudERlZmF1bHQodCl7cmV0dXJuIG49PntpZihuPT09Il9fbmdVbndyYXBfXyIpcmV0dXJuIHQ7dChuKT09PSExJiZuLnByZXZlbnREZWZhdWx0KCl9fX07dWY9Y2xhc3MgZXh0ZW5kcyBQb3tzaGFyZWRTdHlsZXNIb3N0O2hvc3RFbDtzaGFkb3dSb290O2NvbnN0cnVjdG9yKHQsbixyLG8saSxzLGEsYyx1KXtzdXBlcih0LGkscyxjLHUpLHRoaXMuc2hhcmVkU3R5bGVzSG9zdD1uLHRoaXMuaG9zdEVsPXIsdGhpcy5zaGFkb3dSb290PXIuYXR0YWNoU2hhZG93KHttb2RlOiJvcGVuIn0pLHRoaXMuc2hhcmVkU3R5bGVzSG9zdC5hZGRIb3N0KHRoaXMuc2hhZG93Um9vdCk7bGV0IGw9by5zdHlsZXM7bD1XdihvLmlkLGwpO2ZvcihsZXQgcCBvZiBsKXtsZXQgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2EmJmYuc2V0QXR0cmlidXRlKCJub25jZSIsYSksZi50ZXh0Q29udGVudD1wLHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChmKX1sZXQgZD1vLmdldEV4dGVybmFsU3R5bGVzPy4oKTtpZihkKWZvcihsZXQgcCBvZiBkKXtsZXQgZj1jZihwLGkpO2EmJmYuc2V0QXR0cmlidXRlKCJub25jZSIsYSksdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGYpfX1ub2RlT3JTaGFkb3dSb290KHQpe3JldHVybiB0PT09dGhpcy5ob3N0RWw/dGhpcy5zaGFkb3dSb290OnR9YXBwZW5kQ2hpbGQodCxuKXtyZXR1cm4gc3VwZXIuYXBwZW5kQ2hpbGQodGhpcy5ub2RlT3JTaGFkb3dSb290KHQpLG4pfWluc2VydEJlZm9yZSh0LG4scil7cmV0dXJuIHN1cGVyLmluc2VydEJlZm9yZSh0aGlzLm5vZGVPclNoYWRvd1Jvb3QodCksbixyKX1yZW1vdmVDaGlsZCh0LG4pe3JldHVybiBzdXBlci5yZW1vdmVDaGlsZChudWxsLG4pfXBhcmVudE5vZGUodCl7cmV0dXJuIHRoaXMubm9kZU9yU2hhZG93Um9vdChzdXBlci5wYXJlbnROb2RlKHRoaXMubm9kZU9yU2hhZG93Um9vdCh0KSkpfWRlc3Ryb3koKXt0aGlzLnNoYXJlZFN0eWxlc0hvc3QucmVtb3ZlSG9zdCh0aGlzLnNoYWRvd1Jvb3QpfX0sTG89Y2xhc3MgZXh0ZW5kcyBQb3tzaGFyZWRTdHlsZXNIb3N0O3JlbW92ZVN0eWxlc09uQ29tcERlc3Ryb3k7c3R5bGVzO3N0eWxlVXJscztjb25zdHJ1Y3Rvcih0LG4scixvLGkscyxhLGMsdSl7c3VwZXIodCxpLHMsYSxjKSx0aGlzLnNoYXJlZFN0eWxlc0hvc3Q9bix0aGlzLnJlbW92ZVN0eWxlc09uQ29tcERlc3Ryb3k9bztsZXQgbD1yLnN0eWxlczt0aGlzLnN0eWxlcz11P1d2KHUsbCk6bCx0aGlzLnN0eWxlVXJscz1yLmdldEV4dGVybmFsU3R5bGVzPy4odSl9YXBwbHlTdHlsZXMoKXt0aGlzLnNoYXJlZFN0eWxlc0hvc3QuYWRkU3R5bGVzKHRoaXMuc3R5bGVzLHRoaXMuc3R5bGVVcmxzKX1kZXN0cm95KCl7dGhpcy5yZW1vdmVTdHlsZXNPbkNvbXBEZXN0cm95JiZJbi5zaXplPT09MCYmdGhpcy5zaGFyZWRTdHlsZXNIb3N0LnJlbW92ZVN0eWxlcyh0aGlzLnN0eWxlcyx0aGlzLnN0eWxlVXJscyl9fSxwYT1jbGFzcyBleHRlbmRzIExve2NvbnRlbnRBdHRyO2hvc3RBdHRyO2NvbnN0cnVjdG9yKHQsbixyLG8saSxzLGEsYyx1KXtsZXQgbD1vKyItIityLmlkO3N1cGVyKHQsbixyLGkscyxhLGMsdSxsKSx0aGlzLmNvbnRlbnRBdHRyPWFNKGwpLHRoaXMuaG9zdEF0dHI9Y00obCl9YXBwbHlUb0hvc3QodCl7dGhpcy5hcHBseVN0eWxlcygpLHRoaXMuc2V0QXR0cmlidXRlKHQsdGhpcy5ob3N0QXR0ciwiIil9Y3JlYXRlRWxlbWVudCh0LG4pe2xldCByPXN1cGVyLmNyZWF0ZUVsZW1lbnQodCxuKTtyZXR1cm4gc3VwZXIuc2V0QXR0cmlidXRlKHIsdGhpcy5jb250ZW50QXR0ciwiIikscn19fSk7ZnVuY3Rpb24gdU0oKXtyZXR1cm4gam89am98fGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcigiYmFzZSIpLGpvP2pvLmdldEF0dHJpYnV0ZSgiaHJlZiIpOm51bGx9ZnVuY3Rpb24gbE0oZSl7cmV0dXJuIG5ldyBVUkwoZSxkb2N1bWVudC5iYXNlVVJJKS5wYXRobmFtZX1mdW5jdGlvbiBoTShlLHQsbil7bGV0IHI9Vih7cm9vdENvbXBvbmVudDplLHBsYXRmb3JtUmVmOm4/LnBsYXRmb3JtUmVmfSxnTSh0KSk7cmV0dXJuIF92KHIpfWZ1bmN0aW9uIGdNKGUpe3JldHVybnthcHBQcm92aWRlcnM6Wy4uLlF2LC4uLmU/LnByb3ZpZGVycz8/W11dLHBsYXRmb3JtUHJvdmlkZXJzOkRNfX1mdW5jdGlvbiBtTSgpe2dhLm1ha2VDdXJyZW50KCl9ZnVuY3Rpb24geU0oKXtyZXR1cm4gbmV3IERlfWZ1bmN0aW9uIHZNKCl7cmV0dXJuIExsKGRvY3VtZW50KSxkb2N1bWVudH12YXIgZ2Esam8sbWEsZE0sWnYsZk0scE0sWXYsRE0sRU0sUXYsSU0sS3Y9aCgoKT0+e2RhKCk7aGUoKTtoZSgpO3F2KCk7Z2E9Y2xhc3MgZSBleHRlbmRzIHhve3N1cHBvcnRzRE9NRXZlbnRzPSEwO3N0YXRpYyBtYWtlQ3VycmVudCgpe0dkKG5ldyBlKX1vbkFuZENhbmNlbCh0LG4scixvKXtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKG4scixvKSwoKT0+e3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLHIsbyl9fWRpc3BhdGNoRXZlbnQodCxuKXt0LmRpc3BhdGNoRXZlbnQobil9cmVtb3ZlKHQpe3QucmVtb3ZlKCl9Y3JlYXRlRWxlbWVudCh0LG4pe3JldHVybiBuPW58fHRoaXMuZ2V0RGVmYXVsdERvY3VtZW50KCksbi5jcmVhdGVFbGVtZW50KHQpfWNyZWF0ZUh0bWxEb2N1bWVudCgpe3JldHVybiBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImZha2VUaXRsZSIpfWdldERlZmF1bHREb2N1bWVudCgpe3JldHVybiBkb2N1bWVudH1pc0VsZW1lbnROb2RlKHQpe3JldHVybiB0Lm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREV9aXNTaGFkb3dSb290KHQpe3JldHVybiB0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudH1nZXRHbG9iYWxFdmVudFRhcmdldCh0LG4pe3JldHVybiBuPT09IndpbmRvdyI/d2luZG93Om49PT0iZG9jdW1lbnQiP3Q6bj09PSJib2R5Ij90LmJvZHk6bnVsbH1nZXRCYXNlSHJlZih0KXtsZXQgbj11TSgpO3JldHVybiBuPT1udWxsP251bGw6bE0obil9cmVzZXRCYXNlRWxlbWVudCgpe2pvPW51bGx9Z2V0VXNlckFnZW50KCl7cmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50fWdldENvb2tpZSh0KXtyZXR1cm4gRm8oZG9jdW1lbnQuY29va2llLHQpfX0sam89bnVsbDttYT1jbGFzc3thZGRUb1dpbmRvdyh0KXtuZS5nZXRBbmd1bGFyVGVzdGFiaWxpdHk9KHIsbz0hMCk9PntsZXQgaT10LmZpbmRUZXN0YWJpbGl0eUluVHJlZShyLG8pO2lmKGk9PW51bGwpdGhyb3cgbmV3IHYoNTEwMywhMSk7cmV0dXJuIGl9LG5lLmdldEFsbEFuZ3VsYXJUZXN0YWJpbGl0aWVzPSgpPT50LmdldEFsbFRlc3RhYmlsaXRpZXMoKSxuZS5nZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzPSgpPT50LmdldEFsbFJvb3RFbGVtZW50cygpO2xldCBuPXI9PntsZXQgbz1uZS5nZXRBbGxBbmd1bGFyVGVzdGFiaWxpdGllcygpLGk9by5sZW5ndGgscz1mdW5jdGlvbigpe2ktLSxpPT0wJiZyKCl9O28uZm9yRWFjaChhPT57YS53aGVuU3RhYmxlKHMpfSl9O25lLmZyYW1ld29ya1N0YWJpbGl6ZXJzfHwobmUuZnJhbWV3b3JrU3RhYmlsaXplcnM9W10pLG5lLmZyYW1ld29ya1N0YWJpbGl6ZXJzLnB1c2gobil9ZmluZFRlc3RhYmlsaXR5SW5UcmVlKHQsbixyKXtpZihuPT1udWxsKXJldHVybiBudWxsO2xldCBvPXQuZ2V0VGVzdGFiaWxpdHkobik7cmV0dXJuIG8/PyhyP3N0KCkuaXNTaGFkb3dSb290KG4pP3RoaXMuZmluZFRlc3RhYmlsaXR5SW5UcmVlKHQsbi5ob3N0LCEwKTp0aGlzLmZpbmRUZXN0YWJpbGl0eUluVHJlZSh0LG4ucGFyZW50RWxlbWVudCwhMCk6bnVsbCl9fSxkTT0oKCk9PntjbGFzcyBle2J1aWxkKCl7cmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdH1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSl9O3N0YXRpYyBcdTAyNzVwcm92PU4oe3Rva2VuOmUsZmFjdG9yeTplLlx1MDI3NWZhY30pfXJldHVybiBlfSkoKSxadj1bImFsdCIsImNvbnRyb2wiLCJtZXRhIiwic2hpZnQiXSxmTT17IlxiIjoiQmFja3NwYWNlIiwiCSI6IlRhYiIsIlx4N0YiOiJEZWxldGUiLCJceDFCIjoiRXNjYXBlIixEZWw6IkRlbGV0ZSIsRXNjOiJFc2NhcGUiLExlZnQ6IkFycm93TGVmdCIsUmlnaHQ6IkFycm93UmlnaHQiLFVwOiJBcnJvd1VwIixEb3duOiJBcnJvd0Rvd24iLE1lbnU6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLFdpbjoiT1MifSxwTT17YWx0OmU9PmUuYWx0S2V5LGNvbnRyb2w6ZT0+ZS5jdHJsS2V5LG1ldGE6ZT0+ZS5tZXRhS2V5LHNoaWZ0OmU9PmUuc2hpZnRLZXl9LFl2PSgoKT0+e2NsYXNzIGUgZXh0ZW5kcyBrb3tjb25zdHJ1Y3RvcihuKXtzdXBlcihuKX1zdXBwb3J0cyhuKXtyZXR1cm4gZS5wYXJzZUV2ZW50TmFtZShuKSE9bnVsbH1hZGRFdmVudExpc3RlbmVyKG4scixvLGkpe2xldCBzPWUucGFyc2VFdmVudE5hbWUociksYT1lLmV2ZW50Q2FsbGJhY2socy5mdWxsS2V5LG8sdGhpcy5tYW5hZ2VyLmdldFpvbmUoKSk7cmV0dXJuIHRoaXMubWFuYWdlci5nZXRab25lKCkucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PnN0KCkub25BbmRDYW5jZWwobixzLmRvbUV2ZW50TmFtZSxhLGkpKX1zdGF0aWMgcGFyc2VFdmVudE5hbWUobil7bGV0IHI9bi50b0xvd2VyQ2FzZSgpLnNwbGl0KCIuIiksbz1yLnNoaWZ0KCk7aWYoci5sZW5ndGg9PT0wfHwhKG89PT0ia2V5ZG93biJ8fG89PT0ia2V5dXAiKSlyZXR1cm4gbnVsbDtsZXQgaT1lLl9ub3JtYWxpemVLZXkoci5wb3AoKSkscz0iIixhPXIuaW5kZXhPZigiY29kZSIpO2lmKGE+LTEmJihyLnNwbGljZShhLDEpLHM9ImNvZGUuIiksWnYuZm9yRWFjaCh1PT57bGV0IGw9ci5pbmRleE9mKHUpO2w+LTEmJihyLnNwbGljZShsLDEpLHMrPXUrIi4iKX0pLHMrPWksci5sZW5ndGghPTB8fGkubGVuZ3RoPT09MClyZXR1cm4gbnVsbDtsZXQgYz17fTtyZXR1cm4gYy5kb21FdmVudE5hbWU9byxjLmZ1bGxLZXk9cyxjfXN0YXRpYyBtYXRjaEV2ZW50RnVsbEtleUNvZGUobixyKXtsZXQgbz1mTVtuLmtleV18fG4ua2V5LGk9IiI7cmV0dXJuIHIuaW5kZXhPZigiY29kZS4iKT4tMSYmKG89bi5jb2RlLGk9ImNvZGUuIiksbz09bnVsbHx8IW8/ITE6KG89by50b0xvd2VyQ2FzZSgpLG89PT0iICI/bz0ic3BhY2UiOm89PT0iLiImJihvPSJkb3QiKSxadi5mb3JFYWNoKHM9PntpZihzIT09byl7bGV0IGE9cE1bc107YShuKSYmKGkrPXMrIi4iKX19KSxpKz1vLGk9PT1yKX1zdGF0aWMgZXZlbnRDYWxsYmFjayhuLHIsbyl7cmV0dXJuIGk9PntlLm1hdGNoRXZlbnRGdWxsS2V5Q29kZShpLG4pJiZvLnJ1bkd1YXJkZWQoKCk9PnIoaSkpfX1zdGF0aWMgX25vcm1hbGl6ZUtleShuKXtyZXR1cm4gbj09PSJlc2MiPyJlc2NhcGUiOm59c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpKEMoWSkpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6ZS5cdTAyNzVmYWN9KX1yZXR1cm4gZX0pKCk7RE09W3twcm92aWRlOm1vLHVzZVZhbHVlOm9mfSx7cHJvdmlkZTpQcyx1c2VWYWx1ZTptTSxtdWx0aTohMH0se3Byb3ZpZGU6WSx1c2VGYWN0b3J5OnZNfV0sRU09W3twcm92aWRlOnZyLHVzZUNsYXNzOm1hfSx7cHJvdmlkZTpKcyx1c2VDbGFzczpUbyxkZXBzOlt6LF9vLHZyXX0se3Byb3ZpZGU6VG8sdXNlQ2xhc3M6VG8sZGVwczpbeixfbyx2cl19XSxRdj1be3Byb3ZpZGU6WXIsdXNlVmFsdWU6InJvb3QifSx7cHJvdmlkZTpEZSx1c2VGYWN0b3J5OnlNfSx7cHJvdmlkZTpoYSx1c2VDbGFzczpmYSxtdWx0aTohMCxkZXBzOltZXX0se3Byb3ZpZGU6aGEsdXNlQ2xhc3M6WXYsbXVsdGk6ITAsZGVwczpbWV19LHBmLGRmLGxmLHtwcm92aWRlOnduLHVzZUV4aXN0aW5nOnBmfSx7cHJvdmlkZTpNbix1c2VDbGFzczpkTX0sW11dLElNPSgoKT0+e2NsYXNzIGV7Y29uc3RydWN0b3IoKXt9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpfTtzdGF0aWMgXHUwMjc1bW9kPUJ0KHt0eXBlOmV9KTtzdGF0aWMgXHUwMjc1aW5qPXB0KHtwcm92aWRlcnM6Wy4uLlF2LC4uLkVNXSxpbXBvcnRzOlt0ZixUdl19KX1yZXR1cm4gZX0pKCl9KTtmdW5jdGlvbiB3TShlLHQpe2xldCBuPW5ldyBNYXA7cmV0dXJuIGUubGVuZ3RoPjAmJmUucmVwbGFjZSgvXlw/LywiIikuc3BsaXQoIiYiKS5mb3JFYWNoKG89PntsZXQgaT1vLmluZGV4T2YoIj0iKSxbcyxhXT1pPT0tMT9bdC5kZWNvZGVLZXkobyksIiJdOlt0LmRlY29kZUtleShvLnNsaWNlKDAsaSkpLHQuZGVjb2RlVmFsdWUoby5zbGljZShpKzEpKV0sYz1uLmdldChzKXx8W107Yy5wdXNoKGEpLG4uc2V0KHMsYyl9KSxufWZ1bmN0aW9uIEp2KGUpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZShDTSwodCxuKT0+Yk1bbl0/P3QpfWZ1bmN0aW9uIHlhKGUpe3JldHVybmAke2V9YH1mdW5jdGlvbiBUTShlKXtzd2l0Y2goZSl7Y2FzZSJERUxFVEUiOmNhc2UiR0VUIjpjYXNlIkhFQUQiOmNhc2UiT1BUSU9OUyI6Y2FzZSJKU09OUCI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hMH19ZnVuY3Rpb24gWHYoZSl7cmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlcjwidSImJmUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcn1mdW5jdGlvbiBlRChlKXtyZXR1cm4gdHlwZW9mIEJsb2I8InUiJiZlIGluc3RhbmNlb2YgQmxvYn1mdW5jdGlvbiB0RChlKXtyZXR1cm4gdHlwZW9mIEZvcm1EYXRhPCJ1IiYmZSBpbnN0YW5jZW9mIEZvcm1EYXRhfWZ1bmN0aW9uIF9NKGUpe3JldHVybiB0eXBlb2YgVVJMU2VhcmNoUGFyYW1zPCJ1IiYmZSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtc31mdW5jdGlvbiBoZihlLHQpe3JldHVybntib2R5OnQsaGVhZGVyczplLmhlYWRlcnMsY29udGV4dDplLmNvbnRleHQsb2JzZXJ2ZTplLm9ic2VydmUscGFyYW1zOmUucGFyYW1zLHJlcG9ydFByb2dyZXNzOmUucmVwb3J0UHJvZ3Jlc3MscmVzcG9uc2VUeXBlOmUucmVzcG9uc2VUeXBlLHdpdGhDcmVkZW50aWFsczplLndpdGhDcmVkZW50aWFscyxjcmVkZW50aWFsczplLmNyZWRlbnRpYWxzLHRyYW5zZmVyQ2FjaGU6ZS50cmFuc2ZlckNhY2hlLHRpbWVvdXQ6ZS50aW1lb3V0LGtlZXBhbGl2ZTplLmtlZXBhbGl2ZSxwcmlvcml0eTplLnByaW9yaXR5LGNhY2hlOmUuY2FjaGUsbW9kZTplLm1vZGUscmVkaXJlY3Q6ZS5yZWRpcmVjdCxpbnRlZ3JpdHk6ZS5pbnRlZ3JpdHkscmVmZXJyZXI6ZS5yZWZlcnJlcn19ZnVuY3Rpb24gdUQoZSx0KXtyZXR1cm4gdChlKX1mdW5jdGlvbiB4TShlLHQpe3JldHVybihuLHIpPT50LmludGVyY2VwdChuLHtoYW5kbGU6bz0+ZShvLHIpfSl9ZnVuY3Rpb24gUk0oZSx0LG4pe3JldHVybihyLG8pPT5YbihuLCgpPT50KHIsaT0+ZShpLG8pKSl9ZnVuY3Rpb24gT00oKXtsZXQgZT1udWxsO3JldHVybih0LG4pPT57ZT09PW51bGwmJihlPSh5KGxELHtvcHRpb25hbDohMH0pPz9bXSkucmVkdWNlUmlnaHQoeE0sdUQpKTtsZXQgcj15KGFyKTtpZih5KHlmKSl7bGV0IGk9ci5hZGQoKTtyZXR1cm4gZSh0LG4pLnBpcGUoSHIoaSkpfWVsc2UgcmV0dXJuIGUodCxuKX19ZnVuY3Rpb24gUE0oZSl7cmV0dXJuInJlc3BvbnNlVVJMImluIGUmJmUucmVzcG9uc2VVUkw/ZS5yZXNwb25zZVVSTDprTS50ZXN0KGUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpP2UuZ2V0UmVzcG9uc2VIZWFkZXIoaUQpOm51bGx9ZnVuY3Rpb24gJE0oZSx0KXtpZigheShmRCl8fGUubWV0aG9kPT09IkdFVCJ8fGUubWV0aG9kPT09IkhFQUQifHxVTS50ZXN0KGUudXJsKSlyZXR1cm4gdChlKTtsZXQgbj15KEhvKS5nZXRUb2tlbigpLHI9eShWTSk7cmV0dXJuIG4hPW51bGwmJiFlLmhlYWRlcnMuaGFzKHIpJiYoZT1lLmNsb25lKHtoZWFkZXJzOmUuaGVhZGVycy5zZXQocixuKX0pKSx0KGUpfWZ1bmN0aW9uIHpNKGUsdCl7cmV0dXJue1x1MDI3NWtpbmQ6ZSxcdTAyNzVwcm92aWRlcnM6dH19ZnVuY3Rpb24gR00oLi4uZSl7bGV0IHQ9W2NELGdmLElhLHtwcm92aWRlOmJyLHVzZUV4aXN0aW5nOklhfSx7cHJvdmlkZTpCbyx1c2VGYWN0b3J5OigpPT55KEFNLHtvcHRpb25hbDohMH0pPz95KGdmKX0se3Byb3ZpZGU6bWYsdXNlVmFsdWU6JE0sbXVsdGk6ITB9LHtwcm92aWRlOmZELHVzZVZhbHVlOiEwfSx7cHJvdmlkZTpIbyx1c2VDbGFzczpITX1dO2ZvcihsZXQgbiBvZiBlKXQucHVzaCguLi5uLlx1MDI3NXByb3ZpZGVycyk7cmV0dXJuIEtuKHQpfWZ1bmN0aW9uIFdNKCl7cmV0dXJuIHpNKHZmLkxlZ2FjeUludGVyY2VwdG9ycyxbe3Byb3ZpZGU6b0QsdXNlRmFjdG9yeTpPTX0se3Byb3ZpZGU6bWYsdXNlRXhpc3Rpbmc6b0QsbXVsdGk6ITB9XSl9dmFyIGJyLEJvLFZ0LHZhLENNLGJNLHd0LERhLG5ELHJELGlELHNELGFELE1NLHdyLFNuLFRyLEVhLFZvLENyLFNNLE5NLGNELEFNLGxELG1mLGRELHlmLElhLEZNLGtNLGdmLGZELExNLGpNLEJNLFZNLEhvLEhNLFVNLHZmLG9ELERmPWgoKCk9PntoZSgpO2hlKCk7a3UoKTtVcigpO25mKCk7YnI9Y2xhc3N7fSxCbz1jbGFzc3t9LFZ0PWNsYXNzIGV7aGVhZGVycztub3JtYWxpemVkTmFtZXM9bmV3IE1hcDtsYXp5SW5pdDtsYXp5VXBkYXRlPW51bGw7Y29uc3RydWN0b3IodCl7dD90eXBlb2YgdD09InN0cmluZyI/dGhpcy5sYXp5SW5pdD0oKT0+e3RoaXMuaGVhZGVycz1uZXcgTWFwLHQuc3BsaXQoYApgKS5mb3JFYWNoKG49PntsZXQgcj1uLmluZGV4T2YoIjoiKTtpZihyPjApe2xldCBvPW4uc2xpY2UoMCxyKSxpPW4uc2xpY2UocisxKS50cmltKCk7dGhpcy5hZGRIZWFkZXJFbnRyeShvLGkpfX0pfTp0eXBlb2YgSGVhZGVyczwidSImJnQgaW5zdGFuY2VvZiBIZWFkZXJzPyh0aGlzLmhlYWRlcnM9bmV3IE1hcCx0LmZvckVhY2goKG4scik9Pnt0aGlzLmFkZEhlYWRlckVudHJ5KHIsbil9KSk6dGhpcy5sYXp5SW5pdD0oKT0+e3RoaXMuaGVhZGVycz1uZXcgTWFwLE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKFtuLHJdKT0+e3RoaXMuc2V0SGVhZGVyRW50cmllcyhuLHIpfSl9OnRoaXMuaGVhZGVycz1uZXcgTWFwfWhhcyh0KXtyZXR1cm4gdGhpcy5pbml0KCksdGhpcy5oZWFkZXJzLmhhcyh0LnRvTG93ZXJDYXNlKCkpfWdldCh0KXt0aGlzLmluaXQoKTtsZXQgbj10aGlzLmhlYWRlcnMuZ2V0KHQudG9Mb3dlckNhc2UoKSk7cmV0dXJuIG4mJm4ubGVuZ3RoPjA/blswXTpudWxsfWtleXMoKXtyZXR1cm4gdGhpcy5pbml0KCksQXJyYXkuZnJvbSh0aGlzLm5vcm1hbGl6ZWROYW1lcy52YWx1ZXMoKSl9Z2V0QWxsKHQpe3JldHVybiB0aGlzLmluaXQoKSx0aGlzLmhlYWRlcnMuZ2V0KHQudG9Mb3dlckNhc2UoKSl8fG51bGx9YXBwZW5kKHQsbil7cmV0dXJuIHRoaXMuY2xvbmUoe25hbWU6dCx2YWx1ZTpuLG9wOiJhIn0pfXNldCh0LG4pe3JldHVybiB0aGlzLmNsb25lKHtuYW1lOnQsdmFsdWU6bixvcDoicyJ9KX1kZWxldGUodCxuKXtyZXR1cm4gdGhpcy5jbG9uZSh7bmFtZTp0LHZhbHVlOm4sb3A6ImQifSl9bWF5YmVTZXROb3JtYWxpemVkTmFtZSh0LG4pe3RoaXMubm9ybWFsaXplZE5hbWVzLmhhcyhuKXx8dGhpcy5ub3JtYWxpemVkTmFtZXMuc2V0KG4sdCl9aW5pdCgpe3RoaXMubGF6eUluaXQmJih0aGlzLmxhenlJbml0IGluc3RhbmNlb2YgZT90aGlzLmNvcHlGcm9tKHRoaXMubGF6eUluaXQpOnRoaXMubGF6eUluaXQoKSx0aGlzLmxhenlJbml0PW51bGwsdGhpcy5sYXp5VXBkYXRlJiYodGhpcy5sYXp5VXBkYXRlLmZvckVhY2godD0+dGhpcy5hcHBseVVwZGF0ZSh0KSksdGhpcy5sYXp5VXBkYXRlPW51bGwpKX1jb3B5RnJvbSh0KXt0LmluaXQoKSxBcnJheS5mcm9tKHQuaGVhZGVycy5rZXlzKCkpLmZvckVhY2gobj0+e3RoaXMuaGVhZGVycy5zZXQobix0LmhlYWRlcnMuZ2V0KG4pKSx0aGlzLm5vcm1hbGl6ZWROYW1lcy5zZXQobix0Lm5vcm1hbGl6ZWROYW1lcy5nZXQobikpfSl9Y2xvbmUodCl7bGV0IG49bmV3IGU7cmV0dXJuIG4ubGF6eUluaXQ9dGhpcy5sYXp5SW5pdCYmdGhpcy5sYXp5SW5pdCBpbnN0YW5jZW9mIGU/dGhpcy5sYXp5SW5pdDp0aGlzLG4ubGF6eVVwZGF0ZT0odGhpcy5sYXp5VXBkYXRlfHxbXSkuY29uY2F0KFt0XSksbn1hcHBseVVwZGF0ZSh0KXtsZXQgbj10Lm5hbWUudG9Mb3dlckNhc2UoKTtzd2l0Y2godC5vcCl7Y2FzZSJhIjpjYXNlInMiOmxldCByPXQudmFsdWU7aWYodHlwZW9mIHI9PSJzdHJpbmciJiYocj1bcl0pLHIubGVuZ3RoPT09MClyZXR1cm47dGhpcy5tYXliZVNldE5vcm1hbGl6ZWROYW1lKHQubmFtZSxuKTtsZXQgbz0odC5vcD09PSJhIj90aGlzLmhlYWRlcnMuZ2V0KG4pOnZvaWQgMCl8fFtdO28ucHVzaCguLi5yKSx0aGlzLmhlYWRlcnMuc2V0KG4sbyk7YnJlYWs7Y2FzZSJkIjpsZXQgaT10LnZhbHVlO2lmKCFpKXRoaXMuaGVhZGVycy5kZWxldGUobiksdGhpcy5ub3JtYWxpemVkTmFtZXMuZGVsZXRlKG4pO2Vsc2V7bGV0IHM9dGhpcy5oZWFkZXJzLmdldChuKTtpZighcylyZXR1cm47cz1zLmZpbHRlcihhPT5pLmluZGV4T2YoYSk9PT0tMSkscy5sZW5ndGg9PT0wPyh0aGlzLmhlYWRlcnMuZGVsZXRlKG4pLHRoaXMubm9ybWFsaXplZE5hbWVzLmRlbGV0ZShuKSk6dGhpcy5oZWFkZXJzLnNldChuLHMpfWJyZWFrfX1hZGRIZWFkZXJFbnRyeSh0LG4pe2xldCByPXQudG9Mb3dlckNhc2UoKTt0aGlzLm1heWJlU2V0Tm9ybWFsaXplZE5hbWUodCxyKSx0aGlzLmhlYWRlcnMuaGFzKHIpP3RoaXMuaGVhZGVycy5nZXQocikucHVzaChuKTp0aGlzLmhlYWRlcnMuc2V0KHIsW25dKX1zZXRIZWFkZXJFbnRyaWVzKHQsbil7bGV0IHI9KEFycmF5LmlzQXJyYXkobik/bjpbbl0pLm1hcChpPT5pLnRvU3RyaW5nKCkpLG89dC50b0xvd2VyQ2FzZSgpO3RoaXMuaGVhZGVycy5zZXQobyxyKSx0aGlzLm1heWJlU2V0Tm9ybWFsaXplZE5hbWUodCxvKX1mb3JFYWNoKHQpe3RoaXMuaW5pdCgpLEFycmF5LmZyb20odGhpcy5ub3JtYWxpemVkTmFtZXMua2V5cygpKS5mb3JFYWNoKG49PnQodGhpcy5ub3JtYWxpemVkTmFtZXMuZ2V0KG4pLHRoaXMuaGVhZGVycy5nZXQobikpKX19LHZhPWNsYXNze2VuY29kZUtleSh0KXtyZXR1cm4gSnYodCl9ZW5jb2RlVmFsdWUodCl7cmV0dXJuIEp2KHQpfWRlY29kZUtleSh0KXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQpfWRlY29kZVZhbHVlKHQpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQodCl9fTtDTT0vJShcZFthLWYwLTldKS9naSxiTT17NDA6IkAiLCIzQSI6IjoiLDI0OiIkIiwiMkMiOiIsIiwiM0IiOiI7IiwiM0QiOiI9IiwiM0YiOiI/IiwiMkYiOiIvIn07d3Q9Y2xhc3MgZXttYXA7ZW5jb2Rlcjt1cGRhdGVzPW51bGw7Y2xvbmVGcm9tPW51bGw7Y29uc3RydWN0b3IodD17fSl7aWYodGhpcy5lbmNvZGVyPXQuZW5jb2Rlcnx8bmV3IHZhLHQuZnJvbVN0cmluZyl7aWYodC5mcm9tT2JqZWN0KXRocm93IG5ldyB2KDI4MDUsITEpO3RoaXMubWFwPXdNKHQuZnJvbVN0cmluZyx0aGlzLmVuY29kZXIpfWVsc2UgdC5mcm9tT2JqZWN0Pyh0aGlzLm1hcD1uZXcgTWFwLE9iamVjdC5rZXlzKHQuZnJvbU9iamVjdCkuZm9yRWFjaChuPT57bGV0IHI9dC5mcm9tT2JqZWN0W25dLG89QXJyYXkuaXNBcnJheShyKT9yLm1hcCh5YSk6W3lhKHIpXTt0aGlzLm1hcC5zZXQobixvKX0pKTp0aGlzLm1hcD1udWxsfWhhcyh0KXtyZXR1cm4gdGhpcy5pbml0KCksdGhpcy5tYXAuaGFzKHQpfWdldCh0KXt0aGlzLmluaXQoKTtsZXQgbj10aGlzLm1hcC5nZXQodCk7cmV0dXJuIG4/blswXTpudWxsfWdldEFsbCh0KXtyZXR1cm4gdGhpcy5pbml0KCksdGhpcy5tYXAuZ2V0KHQpfHxudWxsfWtleXMoKXtyZXR1cm4gdGhpcy5pbml0KCksQXJyYXkuZnJvbSh0aGlzLm1hcC5rZXlzKCkpfWFwcGVuZCh0LG4pe3JldHVybiB0aGlzLmNsb25lKHtwYXJhbTp0LHZhbHVlOm4sb3A6ImEifSl9YXBwZW5kQWxsKHQpe2xldCBuPVtdO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKHI9PntsZXQgbz10W3JdO0FycmF5LmlzQXJyYXkobyk/by5mb3JFYWNoKGk9PntuLnB1c2goe3BhcmFtOnIsdmFsdWU6aSxvcDoiYSJ9KX0pOm4ucHVzaCh7cGFyYW06cix2YWx1ZTpvLG9wOiJhIn0pfSksdGhpcy5jbG9uZShuKX1zZXQodCxuKXtyZXR1cm4gdGhpcy5jbG9uZSh7cGFyYW06dCx2YWx1ZTpuLG9wOiJzIn0pfWRlbGV0ZSh0LG4pe3JldHVybiB0aGlzLmNsb25lKHtwYXJhbTp0LHZhbHVlOm4sb3A6ImQifSl9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5pbml0KCksdGhpcy5rZXlzKCkubWFwKHQ9PntsZXQgbj10aGlzLmVuY29kZXIuZW5jb2RlS2V5KHQpO3JldHVybiB0aGlzLm1hcC5nZXQodCkubWFwKHI9Pm4rIj0iK3RoaXMuZW5jb2Rlci5lbmNvZGVWYWx1ZShyKSkuam9pbigiJiIpfSkuZmlsdGVyKHQ9PnQhPT0iIikuam9pbigiJiIpfWNsb25lKHQpe2xldCBuPW5ldyBlKHtlbmNvZGVyOnRoaXMuZW5jb2Rlcn0pO3JldHVybiBuLmNsb25lRnJvbT10aGlzLmNsb25lRnJvbXx8dGhpcyxuLnVwZGF0ZXM9KHRoaXMudXBkYXRlc3x8W10pLmNvbmNhdCh0KSxufWluaXQoKXt0aGlzLm1hcD09PW51bGwmJih0aGlzLm1hcD1uZXcgTWFwKSx0aGlzLmNsb25lRnJvbSE9PW51bGwmJih0aGlzLmNsb25lRnJvbS5pbml0KCksdGhpcy5jbG9uZUZyb20ua2V5cygpLmZvckVhY2godD0+dGhpcy5tYXAuc2V0KHQsdGhpcy5jbG9uZUZyb20ubWFwLmdldCh0KSkpLHRoaXMudXBkYXRlcy5mb3JFYWNoKHQ9Pntzd2l0Y2godC5vcCl7Y2FzZSJhIjpjYXNlInMiOmxldCBuPSh0Lm9wPT09ImEiP3RoaXMubWFwLmdldCh0LnBhcmFtKTp2b2lkIDApfHxbXTtuLnB1c2goeWEodC52YWx1ZSkpLHRoaXMubWFwLnNldCh0LnBhcmFtLG4pO2JyZWFrO2Nhc2UiZCI6aWYodC52YWx1ZSE9PXZvaWQgMCl7bGV0IHI9dGhpcy5tYXAuZ2V0KHQucGFyYW0pfHxbXSxvPXIuaW5kZXhPZih5YSh0LnZhbHVlKSk7byE9PS0xJiZyLnNwbGljZShvLDEpLHIubGVuZ3RoPjA/dGhpcy5tYXAuc2V0KHQucGFyYW0scik6dGhpcy5tYXAuZGVsZXRlKHQucGFyYW0pfWVsc2V7dGhpcy5tYXAuZGVsZXRlKHQucGFyYW0pO2JyZWFrfX19KSx0aGlzLmNsb25lRnJvbT10aGlzLnVwZGF0ZXM9bnVsbCl9fSxEYT1jbGFzc3ttYXA9bmV3IE1hcDtzZXQodCxuKXtyZXR1cm4gdGhpcy5tYXAuc2V0KHQsbiksdGhpc31nZXQodCl7cmV0dXJuIHRoaXMubWFwLmhhcyh0KXx8dGhpcy5tYXAuc2V0KHQsdC5kZWZhdWx0VmFsdWUoKSksdGhpcy5tYXAuZ2V0KHQpfWRlbGV0ZSh0KXtyZXR1cm4gdGhpcy5tYXAuZGVsZXRlKHQpLHRoaXN9aGFzKHQpe3JldHVybiB0aGlzLm1hcC5oYXModCl9a2V5cygpe3JldHVybiB0aGlzLm1hcC5rZXlzKCl9fTtuRD0iQ29udGVudC1UeXBlIixyRD0iQWNjZXB0IixpRD0iWC1SZXF1ZXN0LVVSTCIsc0Q9InRleHQvcGxhaW4iLGFEPSJhcHBsaWNhdGlvbi9qc29uIixNTT1gJHthRH0sICR7c0R9LCAqLypgLHdyPWNsYXNzIGV7dXJsO2JvZHk9bnVsbDtoZWFkZXJzO2NvbnRleHQ7cmVwb3J0UHJvZ3Jlc3M9ITE7d2l0aENyZWRlbnRpYWxzPSExO2NyZWRlbnRpYWxzO2tlZXBhbGl2ZT0hMTtjYWNoZTtwcmlvcml0eTttb2RlO3JlZGlyZWN0O3JlZmVycmVyO2ludGVncml0eTtyZXNwb25zZVR5cGU9Impzb24iO21ldGhvZDtwYXJhbXM7dXJsV2l0aFBhcmFtczt0cmFuc2ZlckNhY2hlO3RpbWVvdXQ7Y29uc3RydWN0b3IodCxuLHIsbyl7dGhpcy51cmw9bix0aGlzLm1ldGhvZD10LnRvVXBwZXJDYXNlKCk7bGV0IGk7aWYoVE0odGhpcy5tZXRob2QpfHxvPyh0aGlzLmJvZHk9ciE9PXZvaWQgMD9yOm51bGwsaT1vKTppPXIsaSl7aWYodGhpcy5yZXBvcnRQcm9ncmVzcz0hIWkucmVwb3J0UHJvZ3Jlc3MsdGhpcy53aXRoQ3JlZGVudGlhbHM9ISFpLndpdGhDcmVkZW50aWFscyx0aGlzLmtlZXBhbGl2ZT0hIWkua2VlcGFsaXZlLGkucmVzcG9uc2VUeXBlJiYodGhpcy5yZXNwb25zZVR5cGU9aS5yZXNwb25zZVR5cGUpLGkuaGVhZGVycyYmKHRoaXMuaGVhZGVycz1pLmhlYWRlcnMpLGkuY29udGV4dCYmKHRoaXMuY29udGV4dD1pLmNvbnRleHQpLGkucGFyYW1zJiYodGhpcy5wYXJhbXM9aS5wYXJhbXMpLGkucHJpb3JpdHkmJih0aGlzLnByaW9yaXR5PWkucHJpb3JpdHkpLGkuY2FjaGUmJih0aGlzLmNhY2hlPWkuY2FjaGUpLGkuY3JlZGVudGlhbHMmJih0aGlzLmNyZWRlbnRpYWxzPWkuY3JlZGVudGlhbHMpLHR5cGVvZiBpLnRpbWVvdXQ9PSJudW1iZXIiKXtpZihpLnRpbWVvdXQ8MXx8IU51bWJlci5pc0ludGVnZXIoaS50aW1lb3V0KSl0aHJvdyBuZXcgdigyODIyLCIiKTt0aGlzLnRpbWVvdXQ9aS50aW1lb3V0fWkubW9kZSYmKHRoaXMubW9kZT1pLm1vZGUpLGkucmVkaXJlY3QmJih0aGlzLnJlZGlyZWN0PWkucmVkaXJlY3QpLGkuaW50ZWdyaXR5JiYodGhpcy5pbnRlZ3JpdHk9aS5pbnRlZ3JpdHkpLGkucmVmZXJyZXImJih0aGlzLnJlZmVycmVyPWkucmVmZXJyZXIpLHRoaXMudHJhbnNmZXJDYWNoZT1pLnRyYW5zZmVyQ2FjaGV9aWYodGhpcy5oZWFkZXJzPz89bmV3IFZ0LHRoaXMuY29udGV4dD8/PW5ldyBEYSwhdGhpcy5wYXJhbXMpdGhpcy5wYXJhbXM9bmV3IHd0LHRoaXMudXJsV2l0aFBhcmFtcz1uO2Vsc2V7bGV0IHM9dGhpcy5wYXJhbXMudG9TdHJpbmcoKTtpZihzLmxlbmd0aD09PTApdGhpcy51cmxXaXRoUGFyYW1zPW47ZWxzZXtsZXQgYT1uLmluZGV4T2YoIj8iKSxjPWE9PT0tMT8iPyI6YTxuLmxlbmd0aC0xPyImIjoiIjt0aGlzLnVybFdpdGhQYXJhbXM9bitjK3N9fX1zZXJpYWxpemVCb2R5KCl7cmV0dXJuIHRoaXMuYm9keT09PW51bGw/bnVsbDp0eXBlb2YgdGhpcy5ib2R5PT0ic3RyaW5nInx8WHYodGhpcy5ib2R5KXx8ZUQodGhpcy5ib2R5KXx8dEQodGhpcy5ib2R5KXx8X00odGhpcy5ib2R5KT90aGlzLmJvZHk6dGhpcy5ib2R5IGluc3RhbmNlb2Ygd3Q/dGhpcy5ib2R5LnRvU3RyaW5nKCk6dHlwZW9mIHRoaXMuYm9keT09Im9iamVjdCJ8fHR5cGVvZiB0aGlzLmJvZHk9PSJib29sZWFuInx8QXJyYXkuaXNBcnJheSh0aGlzLmJvZHkpP0pTT04uc3RyaW5naWZ5KHRoaXMuYm9keSk6dGhpcy5ib2R5LnRvU3RyaW5nKCl9ZGV0ZWN0Q29udGVudFR5cGVIZWFkZXIoKXtyZXR1cm4gdGhpcy5ib2R5PT09bnVsbHx8dEQodGhpcy5ib2R5KT9udWxsOmVEKHRoaXMuYm9keSk/dGhpcy5ib2R5LnR5cGV8fG51bGw6WHYodGhpcy5ib2R5KT9udWxsOnR5cGVvZiB0aGlzLmJvZHk9PSJzdHJpbmciP3NEOnRoaXMuYm9keSBpbnN0YW5jZW9mIHd0PyJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCI6dHlwZW9mIHRoaXMuYm9keT09Im9iamVjdCJ8fHR5cGVvZiB0aGlzLmJvZHk9PSJudW1iZXIifHx0eXBlb2YgdGhpcy5ib2R5PT0iYm9vbGVhbiI/YUQ6bnVsbH1jbG9uZSh0PXt9KXtsZXQgbj10Lm1ldGhvZHx8dGhpcy5tZXRob2Qscj10LnVybHx8dGhpcy51cmwsbz10LnJlc3BvbnNlVHlwZXx8dGhpcy5yZXNwb25zZVR5cGUsaT10LmtlZXBhbGl2ZT8/dGhpcy5rZWVwYWxpdmUscz10LnByaW9yaXR5fHx0aGlzLnByaW9yaXR5LGE9dC5jYWNoZXx8dGhpcy5jYWNoZSxjPXQubW9kZXx8dGhpcy5tb2RlLHU9dC5yZWRpcmVjdHx8dGhpcy5yZWRpcmVjdCxsPXQuY3JlZGVudGlhbHN8fHRoaXMuY3JlZGVudGlhbHMsZD10LnJlZmVycmVyfHx0aGlzLnJlZmVycmVyLHA9dC5pbnRlZ3JpdHl8fHRoaXMuaW50ZWdyaXR5LGY9dC50cmFuc2ZlckNhY2hlPz90aGlzLnRyYW5zZmVyQ2FjaGUsZz10LnRpbWVvdXQ/P3RoaXMudGltZW91dCxJPXQuYm9keSE9PXZvaWQgMD90LmJvZHk6dGhpcy5ib2R5LEQ9dC53aXRoQ3JlZGVudGlhbHM/P3RoaXMud2l0aENyZWRlbnRpYWxzLG09dC5yZXBvcnRQcm9ncmVzcz8/dGhpcy5yZXBvcnRQcm9ncmVzcyxGPXQuaGVhZGVyc3x8dGhpcy5oZWFkZXJzLGN0PXQucGFyYW1zfHx0aGlzLnBhcmFtcyxRPXQuY29udGV4dD8/dGhpcy5jb250ZXh0O3JldHVybiB0LnNldEhlYWRlcnMhPT12b2lkIDAmJihGPU9iamVjdC5rZXlzKHQuc2V0SGVhZGVycykucmVkdWNlKCh6ZSxIdCk9PnplLnNldChIdCx0LnNldEhlYWRlcnNbSHRdKSxGKSksdC5zZXRQYXJhbXMmJihjdD1PYmplY3Qua2V5cyh0LnNldFBhcmFtcykucmVkdWNlKCh6ZSxIdCk9PnplLnNldChIdCx0LnNldFBhcmFtc1tIdF0pLGN0KSksbmV3IGUobixyLEkse3BhcmFtczpjdCxoZWFkZXJzOkYsY29udGV4dDpRLHJlcG9ydFByb2dyZXNzOm0scmVzcG9uc2VUeXBlOm8sd2l0aENyZWRlbnRpYWxzOkQsdHJhbnNmZXJDYWNoZTpmLGtlZXBhbGl2ZTppLGNhY2hlOmEscHJpb3JpdHk6cyx0aW1lb3V0OmcsbW9kZTpjLHJlZGlyZWN0OnUsY3JlZGVudGlhbHM6bCxyZWZlcnJlcjpkLGludGVncml0eTpwfSl9fSxTbj0oZnVuY3Rpb24oZSl7cmV0dXJuIGVbZS5TZW50PTBdPSJTZW50IixlW2UuVXBsb2FkUHJvZ3Jlc3M9MV09IlVwbG9hZFByb2dyZXNzIixlW2UuUmVzcG9uc2VIZWFkZXI9Ml09IlJlc3BvbnNlSGVhZGVyIixlW2UuRG93bmxvYWRQcm9ncmVzcz0zXT0iRG93bmxvYWRQcm9ncmVzcyIsZVtlLlJlc3BvbnNlPTRdPSJSZXNwb25zZSIsZVtlLlVzZXI9NV09IlVzZXIiLGV9KShTbnx8e30pLFRyPWNsYXNze2hlYWRlcnM7c3RhdHVzO3N0YXR1c1RleHQ7dXJsO29rO3R5cGU7cmVkaXJlY3RlZDtjb25zdHJ1Y3Rvcih0LG49MjAwLHI9Ik9LIil7dGhpcy5oZWFkZXJzPXQuaGVhZGVyc3x8bmV3IFZ0LHRoaXMuc3RhdHVzPXQuc3RhdHVzIT09dm9pZCAwP3Quc3RhdHVzOm4sdGhpcy5zdGF0dXNUZXh0PXQuc3RhdHVzVGV4dHx8cix0aGlzLnVybD10LnVybHx8bnVsbCx0aGlzLnJlZGlyZWN0ZWQ9dC5yZWRpcmVjdGVkLHRoaXMub2s9dGhpcy5zdGF0dXM+PTIwMCYmdGhpcy5zdGF0dXM8MzAwfX0sRWE9Y2xhc3MgZSBleHRlbmRzIFRye2NvbnN0cnVjdG9yKHQ9e30pe3N1cGVyKHQpfXR5cGU9U24uUmVzcG9uc2VIZWFkZXI7Y2xvbmUodD17fSl7cmV0dXJuIG5ldyBlKHtoZWFkZXJzOnQuaGVhZGVyc3x8dGhpcy5oZWFkZXJzLHN0YXR1czp0LnN0YXR1cyE9PXZvaWQgMD90LnN0YXR1czp0aGlzLnN0YXR1cyxzdGF0dXNUZXh0OnQuc3RhdHVzVGV4dHx8dGhpcy5zdGF0dXNUZXh0LHVybDp0LnVybHx8dGhpcy51cmx8fHZvaWQgMH0pfX0sVm89Y2xhc3MgZSBleHRlbmRzIFRye2JvZHk7Y29uc3RydWN0b3IodD17fSl7c3VwZXIodCksdGhpcy5ib2R5PXQuYm9keSE9PXZvaWQgMD90LmJvZHk6bnVsbH10eXBlPVNuLlJlc3BvbnNlO2Nsb25lKHQ9e30pe3JldHVybiBuZXcgZSh7Ym9keTp0LmJvZHkhPT12b2lkIDA/dC5ib2R5OnRoaXMuYm9keSxoZWFkZXJzOnQuaGVhZGVyc3x8dGhpcy5oZWFkZXJzLHN0YXR1czp0LnN0YXR1cyE9PXZvaWQgMD90LnN0YXR1czp0aGlzLnN0YXR1cyxzdGF0dXNUZXh0OnQuc3RhdHVzVGV4dHx8dGhpcy5zdGF0dXNUZXh0LHVybDp0LnVybHx8dGhpcy51cmx8fHZvaWQgMCxyZWRpcmVjdGVkOnQucmVkaXJlY3RlZD8/dGhpcy5yZWRpcmVjdGVkfSl9fSxDcj1jbGFzcyBleHRlbmRzIFRye25hbWU9Ikh0dHBFcnJvclJlc3BvbnNlIjttZXNzYWdlO2Vycm9yO29rPSExO2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQsMCwiVW5rbm93biBFcnJvciIpLHRoaXMuc3RhdHVzPj0yMDAmJnRoaXMuc3RhdHVzPDMwMD90aGlzLm1lc3NhZ2U9YEh0dHAgZmFpbHVyZSBkdXJpbmcgcGFyc2luZyBmb3IgJHt0LnVybHx8Iih1bmtub3duIHVybCkifWA6dGhpcy5tZXNzYWdlPWBIdHRwIGZhaWx1cmUgcmVzcG9uc2UgZm9yICR7dC51cmx8fCIodW5rbm93biB1cmwpIn06ICR7dC5zdGF0dXN9ICR7dC5zdGF0dXNUZXh0fWAsdGhpcy5lcnJvcj10LmVycm9yfHxudWxsfX0sU009MjAwLE5NPTIwNDtjRD0oKCk9PntjbGFzcyBle2hhbmRsZXI7Y29uc3RydWN0b3Iobil7dGhpcy5oYW5kbGVyPW59cmVxdWVzdChuLHIsbz17fSl7bGV0IGk7aWYobiBpbnN0YW5jZW9mIHdyKWk9bjtlbHNle2xldCBjO28uaGVhZGVycyBpbnN0YW5jZW9mIFZ0P2M9by5oZWFkZXJzOmM9bmV3IFZ0KG8uaGVhZGVycyk7bGV0IHU7by5wYXJhbXMmJihvLnBhcmFtcyBpbnN0YW5jZW9mIHd0P3U9by5wYXJhbXM6dT1uZXcgd3Qoe2Zyb21PYmplY3Q6by5wYXJhbXN9KSksaT1uZXcgd3IobixyLG8uYm9keSE9PXZvaWQgMD9vLmJvZHk6bnVsbCx7aGVhZGVyczpjLGNvbnRleHQ6by5jb250ZXh0LHBhcmFtczp1LHJlcG9ydFByb2dyZXNzOm8ucmVwb3J0UHJvZ3Jlc3MscmVzcG9uc2VUeXBlOm8ucmVzcG9uc2VUeXBlfHwianNvbiIsd2l0aENyZWRlbnRpYWxzOm8ud2l0aENyZWRlbnRpYWxzLHRyYW5zZmVyQ2FjaGU6by50cmFuc2ZlckNhY2hlLGtlZXBhbGl2ZTpvLmtlZXBhbGl2ZSxwcmlvcml0eTpvLnByaW9yaXR5LGNhY2hlOm8uY2FjaGUsbW9kZTpvLm1vZGUscmVkaXJlY3Q6by5yZWRpcmVjdCxjcmVkZW50aWFsczpvLmNyZWRlbnRpYWxzLHJlZmVycmVyOm8ucmVmZXJyZXIsaW50ZWdyaXR5Om8uaW50ZWdyaXR5LHRpbWVvdXQ6by50aW1lb3V0fSl9bGV0IHM9VGkoaSkucGlwZShwYyhjPT50aGlzLmhhbmRsZXIuaGFuZGxlKGMpKSk7aWYobiBpbnN0YW5jZW9mIHdyfHxvLm9ic2VydmU9PT0iZXZlbnRzIilyZXR1cm4gcztsZXQgYT1zLnBpcGUoWmUoYz0+YyBpbnN0YW5jZW9mIFZvKSk7c3dpdGNoKG8ub2JzZXJ2ZXx8ImJvZHkiKXtjYXNlImJvZHkiOnN3aXRjaChpLnJlc3BvbnNlVHlwZSl7Y2FzZSJhcnJheWJ1ZmZlciI6cmV0dXJuIGEucGlwZShsZShjPT57aWYoYy5ib2R5IT09bnVsbCYmIShjLmJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpdGhyb3cgbmV3IHYoMjgwNiwhMSk7cmV0dXJuIGMuYm9keX0pKTtjYXNlImJsb2IiOnJldHVybiBhLnBpcGUobGUoYz0+e2lmKGMuYm9keSE9PW51bGwmJiEoYy5ib2R5IGluc3RhbmNlb2YgQmxvYikpdGhyb3cgbmV3IHYoMjgwNywhMSk7cmV0dXJuIGMuYm9keX0pKTtjYXNlInRleHQiOnJldHVybiBhLnBpcGUobGUoYz0+e2lmKGMuYm9keSE9PW51bGwmJnR5cGVvZiBjLmJvZHkhPSJzdHJpbmciKXRocm93IG5ldyB2KDI4MDgsITEpO3JldHVybiBjLmJvZHl9KSk7Y2FzZSJqc29uIjpkZWZhdWx0OnJldHVybiBhLnBpcGUobGUoYz0+Yy5ib2R5KSl9Y2FzZSJyZXNwb25zZSI6cmV0dXJuIGE7ZGVmYXVsdDp0aHJvdyBuZXcgdigyODA5LCExKX19ZGVsZXRlKG4scj17fSl7cmV0dXJuIHRoaXMucmVxdWVzdCgiREVMRVRFIixuLHIpfWdldChuLHI9e30pe3JldHVybiB0aGlzLnJlcXVlc3QoIkdFVCIsbixyKX1oZWFkKG4scj17fSl7cmV0dXJuIHRoaXMucmVxdWVzdCgiSEVBRCIsbixyKX1qc29ucChuLHIpe3JldHVybiB0aGlzLnJlcXVlc3QoIkpTT05QIixuLHtwYXJhbXM6bmV3IHd0KCkuYXBwZW5kKHIsIkpTT05QX0NBTExCQUNLIiksb2JzZXJ2ZToiYm9keSIscmVzcG9uc2VUeXBlOiJqc29uIn0pfW9wdGlvbnMobixyPXt9KXtyZXR1cm4gdGhpcy5yZXF1ZXN0KCJPUFRJT05TIixuLHIpfXBhdGNoKG4scixvPXt9KXtyZXR1cm4gdGhpcy5yZXF1ZXN0KCJQQVRDSCIsbixoZihvLHIpKX1wb3N0KG4scixvPXt9KXtyZXR1cm4gdGhpcy5yZXF1ZXN0KCJQT1NUIixuLGhmKG8scikpfXB1dChuLHIsbz17fSl7cmV0dXJuIHRoaXMucmVxdWVzdCgiUFVUIixuLGhmKG8scikpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKShDKGJyKSl9O3N0YXRpYyBcdTAyNzVwcm92PU4oe3Rva2VuOmUsZmFjdG9yeTplLlx1MDI3NWZhY30pfXJldHVybiBlfSkoKSxBTT1uZXcgVCgiIik7bEQ9bmV3IFQoIiIpLG1mPW5ldyBUKCIiKSxkRD1uZXcgVCgiIikseWY9bmV3IFQoIiIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9PiEwfSk7SWE9KCgpPT57Y2xhc3MgZSBleHRlbmRzIGJye2JhY2tlbmQ7aW5qZWN0b3I7Y2hhaW49bnVsbDtwZW5kaW5nVGFza3M9eShhcik7Y29udHJpYnV0ZVRvU3RhYmlsaXR5PXkoeWYpO2NvbnN0cnVjdG9yKG4scil7c3VwZXIoKSx0aGlzLmJhY2tlbmQ9bix0aGlzLmluamVjdG9yPXJ9aGFuZGxlKG4pe2lmKHRoaXMuY2hhaW49PT1udWxsKXtsZXQgcj1BcnJheS5mcm9tKG5ldyBTZXQoWy4uLnRoaXMuaW5qZWN0b3IuZ2V0KG1mKSwuLi50aGlzLmluamVjdG9yLmdldChkRCxbXSldKSk7dGhpcy5jaGFpbj1yLnJlZHVjZVJpZ2h0KChvLGkpPT5STShvLGksdGhpcy5pbmplY3RvciksdUQpfWlmKHRoaXMuY29udHJpYnV0ZVRvU3RhYmlsaXR5KXtsZXQgcj10aGlzLnBlbmRpbmdUYXNrcy5hZGQoKTtyZXR1cm4gdGhpcy5jaGFpbihuLG89PnRoaXMuYmFja2VuZC5oYW5kbGUobykpLnBpcGUoSHIocikpfWVsc2UgcmV0dXJuIHRoaXMuY2hhaW4obixyPT50aGlzLmJhY2tlbmQuaGFuZGxlKHIpKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKHIpe3JldHVybiBuZXcocnx8ZSkoQyhCbyksQyh5ZSkpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6ZS5cdTAyNzVmYWN9KX1yZXR1cm4gZX0pKCksRk09L15cKVxdXH0nLD9cbi8sa009UmVnRXhwKGBeJHtpRH06YCwibSIpO2dmPSgoKT0+e2NsYXNzIGV7eGhyRmFjdG9yeTtjb25zdHJ1Y3RvcihuKXt0aGlzLnhockZhY3Rvcnk9bn1oYW5kbGUobil7aWYobi5tZXRob2Q9PT0iSlNPTlAiKXRocm93IG5ldyB2KC0yODAwLCExKTtsZXQgcj10aGlzLnhockZhY3Rvcnk7cmV0dXJuIFRpKG51bGwpLnBpcGUoRmkoKCk9Pm5ldyBSKGk9PntsZXQgcz1yLmJ1aWxkKCk7aWYocy5vcGVuKG4ubWV0aG9kLG4udXJsV2l0aFBhcmFtcyksbi53aXRoQ3JlZGVudGlhbHMmJihzLndpdGhDcmVkZW50aWFscz0hMCksbi5oZWFkZXJzLmZvckVhY2goKEQsbSk9PnMuc2V0UmVxdWVzdEhlYWRlcihELG0uam9pbigiLCIpKSksbi5oZWFkZXJzLmhhcyhyRCl8fHMuc2V0UmVxdWVzdEhlYWRlcihyRCxNTSksIW4uaGVhZGVycy5oYXMobkQpKXtsZXQgRD1uLmRldGVjdENvbnRlbnRUeXBlSGVhZGVyKCk7RCE9PW51bGwmJnMuc2V0UmVxdWVzdEhlYWRlcihuRCxEKX1pZihuLnRpbWVvdXQmJihzLnRpbWVvdXQ9bi50aW1lb3V0KSxuLnJlc3BvbnNlVHlwZSl7bGV0IEQ9bi5yZXNwb25zZVR5cGUudG9Mb3dlckNhc2UoKTtzLnJlc3BvbnNlVHlwZT1EIT09Impzb24iP0Q6InRleHQifWxldCBhPW4uc2VyaWFsaXplQm9keSgpLGM9bnVsbCx1PSgpPT57aWYoYyE9PW51bGwpcmV0dXJuIGM7bGV0IEQ9cy5zdGF0dXNUZXh0fHwiT0siLG09bmV3IFZ0KHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpLEY9UE0ocyl8fG4udXJsO3JldHVybiBjPW5ldyBFYSh7aGVhZGVyczptLHN0YXR1czpzLnN0YXR1cyxzdGF0dXNUZXh0OkQsdXJsOkZ9KSxjfSxsPSgpPT57bGV0e2hlYWRlcnM6RCxzdGF0dXM6bSxzdGF0dXNUZXh0OkYsdXJsOmN0fT11KCksUT1udWxsO20hPT1OTSYmKFE9dHlwZW9mIHMucmVzcG9uc2U+InUiP3MucmVzcG9uc2VUZXh0OnMucmVzcG9uc2UpLG09PT0wJiYobT1RP1NNOjApO2xldCB6ZT1tPj0yMDAmJm08MzAwO2lmKG4ucmVzcG9uc2VUeXBlPT09Impzb24iJiZ0eXBlb2YgUT09InN0cmluZyIpe2xldCBIdD1RO1E9US5yZXBsYWNlKEZNLCIiKTt0cnl7UT1RIT09IiI/SlNPTi5wYXJzZShRKTpudWxsfWNhdGNoKHBEKXtRPUh0LHplJiYoemU9ITEsUT17ZXJyb3I6cEQsdGV4dDpRfSl9fXplPyhpLm5leHQobmV3IFZvKHtib2R5OlEsaGVhZGVyczpELHN0YXR1czptLHN0YXR1c1RleHQ6Rix1cmw6Y3R8fHZvaWQgMH0pKSxpLmNvbXBsZXRlKCkpOmkuZXJyb3IobmV3IENyKHtlcnJvcjpRLGhlYWRlcnM6RCxzdGF0dXM6bSxzdGF0dXNUZXh0OkYsdXJsOmN0fHx2b2lkIDB9KSl9LGQ9RD0+e2xldHt1cmw6bX09dSgpLEY9bmV3IENyKHtlcnJvcjpELHN0YXR1czpzLnN0YXR1c3x8MCxzdGF0dXNUZXh0OnMuc3RhdHVzVGV4dHx8IlVua25vd24gRXJyb3IiLHVybDptfHx2b2lkIDB9KTtpLmVycm9yKEYpfSxwPWQ7bi50aW1lb3V0JiYocD1EPT57bGV0e3VybDptfT11KCksRj1uZXcgQ3Ioe2Vycm9yOm5ldyBET01FeGNlcHRpb24oIlJlcXVlc3QgdGltZWQgb3V0IiwiVGltZW91dEVycm9yIiksc3RhdHVzOnMuc3RhdHVzfHwwLHN0YXR1c1RleHQ6cy5zdGF0dXNUZXh0fHwiUmVxdWVzdCB0aW1lb3V0Iix1cmw6bXx8dm9pZCAwfSk7aS5lcnJvcihGKX0pO2xldCBmPSExLGc9RD0+e2Z8fChpLm5leHQodSgpKSxmPSEwKTtsZXQgbT17dHlwZTpTbi5Eb3dubG9hZFByb2dyZXNzLGxvYWRlZDpELmxvYWRlZH07RC5sZW5ndGhDb21wdXRhYmxlJiYobS50b3RhbD1ELnRvdGFsKSxuLnJlc3BvbnNlVHlwZT09PSJ0ZXh0IiYmcy5yZXNwb25zZVRleHQmJihtLnBhcnRpYWxUZXh0PXMucmVzcG9uc2VUZXh0KSxpLm5leHQobSl9LEk9RD0+e2xldCBtPXt0eXBlOlNuLlVwbG9hZFByb2dyZXNzLGxvYWRlZDpELmxvYWRlZH07RC5sZW5ndGhDb21wdXRhYmxlJiYobS50b3RhbD1ELnRvdGFsKSxpLm5leHQobSl9O3JldHVybiBzLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGwpLHMuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGQpLHMuYWRkRXZlbnRMaXN0ZW5lcigidGltZW91dCIscCkscy5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsZCksbi5yZXBvcnRQcm9ncmVzcyYmKHMuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGcpLGEhPT1udWxsJiZzLnVwbG9hZCYmcy51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLEkpKSxzLnNlbmQoYSksaS5uZXh0KHt0eXBlOlNuLlNlbnR9KSwoKT0+e3MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGQpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGQpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsbCkscy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1lb3V0IixwKSxuLnJlcG9ydFByb2dyZXNzJiYocy5yZW1vdmVFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZyksYSE9PW51bGwmJnMudXBsb2FkJiZzLnVwbG9hZC5yZW1vdmVFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsSSkpLHMucmVhZHlTdGF0ZSE9PXMuRE9ORSYmcy5hYm9ydCgpfX0pKSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpKEMoTW4pKX07c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxmYWN0b3J5OmUuXHUwMjc1ZmFjfSl9cmV0dXJuIGV9KSgpLGZEPW5ldyBUKCIiKSxMTT0iWFNSRi1UT0tFTiIsak09bmV3IFQoIiIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9PkxNfSksQk09IlgtWFNSRi1UT0tFTiIsVk09bmV3IFQoIiIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9PkJNfSksSG89Y2xhc3N7fSxITT0oKCk9PntjbGFzcyBle2RvYztjb29raWVOYW1lO2xhc3RDb29raWVTdHJpbmc9IiI7bGFzdFRva2VuPW51bGw7cGFyc2VDb3VudD0wO2NvbnN0cnVjdG9yKG4scil7dGhpcy5kb2M9bix0aGlzLmNvb2tpZU5hbWU9cn1nZXRUb2tlbigpe2xldCBuPXRoaXMuZG9jLmNvb2tpZXx8IiI7cmV0dXJuIG4hPT10aGlzLmxhc3RDb29raWVTdHJpbmcmJih0aGlzLnBhcnNlQ291bnQrKyx0aGlzLmxhc3RUb2tlbj1GbyhuLHRoaXMuY29va2llTmFtZSksdGhpcy5sYXN0Q29va2llU3RyaW5nPW4pLHRoaXMubGFzdFRva2VufXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKShDKFkpLEMoak0pKX07c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxmYWN0b3J5OmUuXHUwMjc1ZmFjfSl9cmV0dXJuIGV9KSgpLFVNPS9eKD86aHR0cHM/Oik/XC9cLy9pO3ZmPShmdW5jdGlvbihlKXtyZXR1cm4gZVtlLkludGVyY2VwdG9ycz0wXT0iSW50ZXJjZXB0b3JzIixlW2UuTGVnYWN5SW50ZXJjZXB0b3JzPTFdPSJMZWdhY3lJbnRlcmNlcHRvcnMiLGVbZS5DdXN0b21Yc3JmQ29uZmlndXJhdGlvbj0yXT0iQ3VzdG9tWHNyZkNvbmZpZ3VyYXRpb24iLGVbZS5Ob1hzcmZQcm90ZWN0aW9uPTNdPSJOb1hzcmZQcm90ZWN0aW9uIixlW2UuSnNvbnBTdXBwb3J0PTRdPSJKc29ucFN1cHBvcnQiLGVbZS5SZXF1ZXN0c01hZGVWaWFQYXJlbnQ9NV09IlJlcXVlc3RzTWFkZVZpYVBhcmVudCIsZVtlLkZldGNoPTZdPSJGZXRjaCIsZX0pKHZmfHx7fSk7b0Q9bmV3IFQoIiIpfSk7dmFyIHFNPWgoKCk9PntEZigpO0RmKCk7fSk7dmFyIHYkLFpNLFlNLFFNPWgoKCk9PntLdigpO2RhKCk7aGUoKTtoZSgpO3YkPSgoKT0+e2NsYXNzIGV7X2RvYztjb25zdHJ1Y3RvcihuKXt0aGlzLl9kb2M9bn1nZXRUaXRsZSgpe3JldHVybiB0aGlzLl9kb2MudGl0bGV9c2V0VGl0bGUobil7dGhpcy5fZG9jLnRpdGxlPW58fCIifXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24ocil7cmV0dXJuIG5ldyhyfHxlKShDKFkpKX07c3RhdGljIFx1MDI3NXByb3Y9Tih7dG9rZW46ZSxmYWN0b3J5OmUuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGV9KSgpLFpNPSgoKT0+e2NsYXNzIGV7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6ZnVuY3Rpb24ocil7bGV0IG89bnVsbDtyZXR1cm4gcj9vPW5ldyhyfHxlKTpvPUMoWU0pLG99LHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGV9KSgpLFlNPSgoKT0+e2NsYXNzIGUgZXh0ZW5kcyBaTXtfZG9jO2NvbnN0cnVjdG9yKG4pe3N1cGVyKCksdGhpcy5fZG9jPW59c2FuaXRpemUobixyKXtpZihyPT1udWxsKXJldHVybiBudWxsO3N3aXRjaChuKXtjYXNlIHhlLk5PTkU6cmV0dXJuIHI7Y2FzZSB4ZS5IVE1MOnJldHVybiBydChyLCJIVE1MIik/Q2Uocik6VnModGhpcy5fZG9jLFN0cmluZyhyKSkudG9TdHJpbmcoKTtjYXNlIHhlLlNUWUxFOnJldHVybiBydChyLCJTdHlsZSIpP0NlKHIpOnI7Y2FzZSB4ZS5TQ1JJUFQ6aWYocnQociwiU2NyaXB0IikpcmV0dXJuIENlKHIpO3Rocm93IG5ldyB2KDUyMDAsITEpO2Nhc2UgeGUuVVJMOnJldHVybiBydChyLCJVUkwiKT9DZShyKTp5byhTdHJpbmcocikpO2Nhc2UgeGUuUkVTT1VSQ0VfVVJMOmlmKHJ0KHIsIlJlc291cmNlVVJMIikpcmV0dXJuIENlKHIpO3Rocm93IG5ldyB2KDUyMDEsITEpO2RlZmF1bHQ6dGhyb3cgbmV3IHYoNTIwMiwhMSl9fWJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKG4pe3JldHVybiBWbChuKX1ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUobil7cmV0dXJuIEhsKG4pfWJ5cGFzc1NlY3VyaXR5VHJ1c3RTY3JpcHQobil7cmV0dXJuIFVsKG4pfWJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwobil7cmV0dXJuICRsKG4pfWJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChuKXtyZXR1cm4gemwobil9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihyKXtyZXR1cm4gbmV3KHJ8fGUpKEMoWSkpfTtzdGF0aWMgXHUwMjc1cHJvdj1OKHt0b2tlbjplLGZhY3Rvcnk6ZS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gZX0pKCl9KTtleHBvcnR7VyBhcyBhLGJEIGFzIGIsUiBhcyBjLFVhIGFzIGQsemEgYXMgZSxnZSBhcyBmLFJyIGFzIGcsRnIgYXMgaCxNRCBhcyBpLEt0IGFzIGoscWUgYXMgayxUaSBhcyBsLGtEIGFzIG0sUEQgYXMgbixsdCBhcyBvLExEIGFzIHAsbGUgYXMgcSxHRCBhcyByLGJlIGFzIHMsTHIgYXMgdCxxbiBhcyB1LHFEIGFzIHYsWkQgYXMgdyxsYyBhcyB4LHRuIGFzIHksdEUgYXMgeixuRSBhcyBBLFplIGFzIEIsckUgYXMgQyxkYyBhcyBELHBjIGFzIEUsa3AgYXMgRixCciBhcyBHLG5uIGFzIEgsZ2MgYXMgSSxvRSBhcyBKLFZwIGFzIEssYUUgYXMgTCxIciBhcyBNLGNFIGFzIE4sSWMgYXMgTyx1RSBhcyBQLGxFIGFzIFEsZEUgYXMgUixiYyBhcyBTLGZFIGFzIFQscEUgYXMgVSxacCBhcyBWLEZpIGFzIFcsWXAgYXMgWCxRcCBhcyBZLEtwIGFzIFosVXIgYXMgXyx2IGFzICQsWWUgYXMgYWEsVmkgYXMgYmEsTiBhcyBjYSxwdCBhcyBkYSxtRSBhcyBlYSxUIGFzIGZhLEMgYXMgZ2EseSBhcyBoYSxnaCBhcyBpYSx5ZSBhcyBqYSxYbiBhcyBrYSxTaCBhcyBsYSxOaCBhcyBtYSxIaCBhcyBuYSxVaCBhcyBvYSx2ZSBhcyBwYSxZIGFzIHFhLEFlIGFzIHJhLERlIGFzIHNhLEJlIGFzIHRhLEF1IGFzIHVhLHJzIGFzIHZhLEZ0IGFzIHdhLGt1IGFzIHhhLE5nIGFzIHlhLFdFIGFzIHphLE9sIGFzIEFhLGRJIGFzIEJhLGtsIGFzIENhLEV0IGFzIERhLEVzIGFzIEVhLGtzIGFzIEZhLG1vIGFzIEdhLERJIGFzIEhhLExzIGFzIElhLG5tIGFzIEphLHhlIGFzIEthLEtJIGFzIExhLG1tIGFzIE1hLHltIGFzIE5hLHR3IGFzIE9hLG53IGFzIFBhLHZ3IGFzIFFhLGp0IGFzIFJhLHl0IGFzIFNhLHogYXMgVGEsX3cgYXMgVWEsbnQgYXMgVmEsd24gYXMgV2EsQ28gYXMgWGEsVSBhcyBZYSxiQyBhcyBaYSxvdCBhcyBfYSxDbiBhcyAkYSx5eSBhcyBhYix2eSBhcyBiYix1YiBhcyBjYixCdCBhcyBkYixpdCBhcyBlYixibyBhcyBmYixJeSBhcyBnYixFYiBhcyBoYixieSBhcyBpYixUeSBhcyBqYixfeSBhcyBrYixNbyBhcyBsYixfYiBhcyBtYixTeSBhcyBuYixUbiBhcyBvYix4eSBhcyBwYixSeSBhcyBxYixTYiBhcyByYixBYiBhcyBzYixEZCBhcyB0Yix4YiBhcyB1YixSYiBhcyB2YixPYiBhcyB3YixGYiBhcyB4YixrYiBhcyB5YixPeSBhcyB6YixFZCBhcyBBYixJZCBhcyBCYixGeSBhcyBDYix3ZCBhcyBEYixDZCBhcyBFYixreSBhcyBGYixiZCBhcyBHYixUZCBhcyBIYixMeSBhcyBJYixIYiBhcyBKYixqeSBhcyBLYixWeSBhcyBMYixIeSBhcyBNYixXYiBhcyBOYixaYiBhcyBPYixZYiBhcyBQYixLYiBhcyBRYixKYiBhcyBSYixYYiBhcyBTYixlVCBhcyBUYix0VCBhcyBVYixuVCBhcyBWYixyVCBhcyBXYixvVCBhcyBYYixHeSBhcyBZYixXeSBhcyBaYixnVCBhcyBfYixfVCBhcyAkYixldiBhcyBhYyxfZCBhcyBiYyx0diBhcyBjYyxudiBhcyBkYyxydiBhcyBlYyxOVCBhcyBmYyxvdiBhcyBnYyxBVCBhcyBoYyx4VCBhcyBpYyxSVCBhcyBqYyxMVCBhcyBrYyxqVCBhcyBsYyxCVCBhcyBtYyxWVCBhcyBuYyxIVCBhcyBvYywkVCBhcyBwYyxHVCBhcyBxYyxXVCBhcyByYyxxVCBhcyBzYyxaVCBhcyB0YyxObyBhcyB1YyxuYSBhcyB2YyxKVCBhcyB3YyxYVCBhcyB4YyxodiBhcyB5YyxNMiBhcyB6YyxTMiBhcyBBYyxOMiBhcyBCYyxBMiBhcyBDYyx4MiBhcyBEYyxVZCBhcyBFYywkZCBhcyBGYyx6ZCBhcyBHYyxfXyBhcyBIYyxNXyBhcyBJYyxSMiBhcyBKYyxPMiBhcyBLYyxGMiBhcyBMYyxoZSBhcyBNYyxzdCBhcyBOYyxOXyBhcyBPYyxFciBhcyBQYyxzYSBhcyBRYyxSdiBhcyBSYyxPdiBhcyBTYyxPXyBhcyBUYyxVXyBhcyBVYyxWdiBhcyBWYywkXyBhcyBXYyxYZCBhcyBYYyx6XyBhcyBZYyxHXyBhcyBaYyxXXyBhcyBfYyxxXyBhcyAkYyxRXyBhcyBhZCxLXyBhcyBiZCxKXyBhcyBjZCx0ZiBhcyBkZCx0VSBhcyBlZCxuVSBhcyBmZCxkYSBhcyBnZCxwZiBhcyBoZCxxdiBhcyBpZCxoTSBhcyBqZCxJTSBhcyBrZCxjRCBhcyBsZCxsRCBhcyBtZCxHTSBhcyBuZCxXTSBhcyBvZCxxTSBhcyBwZCx2JCBhcyBxZCxaTSBhcyByZCxRTSBhcyBzZH07Cg==","response_hash":"515ffab16a85fdbfa789ec8a82e9c021b9aa2568cfa3797b1ca10acf7e7b6a91","response_time_ms":0,"response_words":5862,"has_response":true,"parameters":[{"name":"1","value":"chunk-BBQJZN7H.js","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":22}],"sent_at":"2026-04-05T05:33:08.387433Z","received_at":"2026-04-05T05:33:08.387432Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"47afa761-3f52-4556-afad-6dd63dbaa428","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/chunk-TJME2352.js","url":"http://localhost:3000/chunk-TJME2352.js","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9jaHVuay1USk1FMjM1Mi5qcyBIVFRQLzEuMQ0KSG9zdDogbG9jYWxob3N0OjMwMDANCg0K","request_hash":"41826a7990f32d1a88a58f7034ef6ca9b59e3dea5acc3df8ab1feb83b090b4c7","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["application/javascript; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Etag":["W/\"5cef5-19cc8900a68\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sat, 07 Mar 2026 13:50:09 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"application/javascript; charset=UTF-8","response_content_length":380661,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpWYXJ5OiBBY2NlcHQtRW5jb2RpbmcNClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNCkFjY2VwdC1SYW5nZXM6IGJ5dGVzDQpDYWNoZS1Db250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MA0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PVVURi04DQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjMyIEdNVA0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpYLVJlY3J1aXRpbmc6IC8jL2pvYnMNCkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKg0KRXRhZzogVy8iNWNlZjUtMTljYzg5MDBhNjgiDQpGZWF0dXJlLVBvbGljeTogcGF5bWVudCAnc2VsZicNCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KTGFzdC1Nb2RpZmllZDogU2F0LCAwNyBNYXIgMjAyNiAxMzo1MDowOSBHTVQNCg0KaW1wb3J0eyQgYXMgUSwkYSBhcyBQbywkYiBhcyBXaSwkYyBhcyBibCxBIGFzIFVzLEFhIGFzIG10LEFiIGFzIGN0LEFjIGFzIHVsLEIgYXMgSyxCYSBhcyBaLEJiIGFzIHJ0LEJjIGFzIEdpLEMgYXMgSW8sQ2EgYXMgWnMsQ2IgYXMgbmUsQ2MgYXMgaGwsRCBhcyBhdCxEYSBhcyBELERiIGFzIGtlLEUgYXMgZWUsRWEgYXMgTm8sRWIgYXMgVGUsRWMgYXMgQXQsRiBhcyBYZSxGYSBhcyBXbixGYiBhcyBLdCxHIGFzIE9vLEdhIGFzIFhzLEggYXMgeXQsSGEgYXMgR24sSGMgYXMgRixJYSBhcyBRcyxJYyBhcyBtbCxKYSBhcyBKcyxKYiBhcyBLbixKYyBhcyBmbCxLIGFzIGtvLEthIGFzIHRpLEtiIGFzIEhpLEtjIGFzIFFuLExiIGFzIGR0LExjIGFzIHBsLE0gYXMgUWUsTWMgYXMgZixOIGFzIGhlLE5iIGFzIEh0LE5jIGFzIHpvLE8gYXMgVG8sT2EgYXMgdGwsT2IgYXMgVHQsT2MgYXMgZ2wsUCBhcyBIcyxQYiBhcyBVLFBjIGFzIHFpLFEgYXMgRm8sUWEgYXMgcSxRYiBhcyBGZSxSIGFzICRzLFJhIGFzIGVsLFJiIGFzIFJ0LFJjIGFzIHZsLFMgYXMgV3MsU2EgYXMgQSxTYiBhcyBldCxTYyBhcyBmZSxUIGFzIEplLFRhIGFzIEUsVGIgYXMgaXQsVGMgYXMgX2wsVSBhcyB6bixVYSBhcyBPdCxVYiBhcyBzbCxWIGFzIEllLFZhIGFzIE9lLFZiIGFzICRpLFcgYXMgc3QsV2EgYXMga3QsV2IgYXMgVm8sWCBhcyBEdCxYYSBhcyBsdCxYYiBhcyBqbyxZIGFzIEdzLFlhIGFzIEMsWiBhcyBXLFphIGFzIGlsLFpiIGFzIEgsXyBhcyBudCxfYSBhcyBtZSxfYiBhcyBabixhIGFzIGZ0LGFhIGFzIHFzLGFiIGFzIG5sLGFjIGFzIGxsLGIgYXMgQnMsYmEgYXMgZ3QsYmIgYXMgcW4sYmMgYXMgQm8sYyBhcyBZdCxjYSBhcyBtLGNiIGFzIFAsZCBhcyBBbyxkYSBhcyBTLGRiIGFzIFIsZSBhcyBqaSxlYSBhcyBZcyxlYiBhcyBwLGVkIGFzIHlsLGYgYXMgeSxmYSBhcyB2LGZiIGFzIHJsLGZkIGFzIENsLGcgYXMgRXQsZ2EgYXMgRyxnYiBhcyBMLGdkIGFzIFBlLGhhIGFzIGwsaWIgYXMgZWksaiBhcyBVdCxqYSBhcyBJdCxrIGFzIHB0LGthIGFzIFZ0LGtiIGFzIG9sLGtjIGFzIHosbCBhcyBnLGxhIGFzIFVuLGxiIGFzIFluLGxkIGFzIG5pLG0gYXMgUmUsbWEgYXMgSG4sbWIgYXMgTG8sbiBhcyBMdCxuYiBhcyBhbCxvIGFzIHpzLG9iIGFzIGllLHBhIGFzIE4scGQgYXMgVW8scSBhcyBiLHFhIGFzIE8scWIgYXMgdHQscWQgYXMgeGwsciBhcyBLZSxyYSBhcyBCaSxyZCBhcyB3bCxzIGFzIFN0LHNhIGFzIHppLHNiIGFzIHZ0LHNjIGFzIGNsLHNkIGFzIEVsLHQgYXMgTW8sdGEgYXMgJG4sdGMgYXMgZGwsdSBhcyBBZSx1YSBhcyBVaSx1YiBhcyBfdCx2IGFzIE1lLHZhIGFzIEosdmMgYXMgdXQsdyBhcyBaZSx3YSBhcyBLcyx3YyBhcyBadCx4YSBhcyBodCx4YyBhcyBOZSx5YyBhcyBYbix6YiBhcyBpaX1mcm9tIi4vY2h1bmstQkJRSlpON0guanMiO2ltcG9ydHthIGFzIGgsYiBhcyAkLGUgYXMgXyxqIGFzIGpzfWZyb20iLi9jaHVuay1UV1pXNUI0NS5qcyI7dmFyIEpuLEhvPV8oKCk9PntKbj17cHJvZHVjdGlvbjohMCxob3N0U2VydmVyOiIuIn19KTtmdW5jdGlvbiBLaShpLG4pe2lmKGk9PT1uKXJldHVybiEwO2lmKGk9PT1udWxsfHxuPT09bnVsbClyZXR1cm4hMTtpZihpIT09aSYmbiE9PW4pcmV0dXJuITA7bGV0IHQ9dHlwZW9mIGksZT10eXBlb2YgbixyLG8sYTtpZih0PT1lJiZ0PT0ib2JqZWN0IilpZihBcnJheS5pc0FycmF5KGkpKXtpZighQXJyYXkuaXNBcnJheShuKSlyZXR1cm4hMTtpZigocj1pLmxlbmd0aCk9PW4ubGVuZ3RoKXtmb3Iobz0wO288cjtvKyspaWYoIUtpKGlbb10sbltvXSkpcmV0dXJuITE7cmV0dXJuITB9fWVsc2V7aWYoQXJyYXkuaXNBcnJheShuKSlyZXR1cm4hMTthPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKG8gaW4gaSl7aWYoIUtpKGlbb10sbltvXSkpcmV0dXJuITE7YVtvXT0hMH1mb3IobyBpbiBuKWlmKCEobyBpbiBhKSYmdHlwZW9mIG5bb108InUiKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIEZ0KGkpe3JldHVybiB0eXBlb2YgaTwidSImJmkhPT1udWxsfWZ1bmN0aW9uICRvKGkpe3JldHVybiBpJiZ0eXBlb2YgaT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGkpfWZ1bmN0aW9uIE1sKGksbil7bGV0IHQ9T2JqZWN0LmFzc2lnbih7fSxpKTtyZXR1cm4gJG8oaSkmJiRvKG4pJiZPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGU9PnskbyhuW2VdKT9lIGluIGk/dFtlXT1NbChpW2VdLG5bZV0pOk9iamVjdC5hc3NpZ24odCx7W2VdOm5bZV19KTpPYmplY3QuYXNzaWduKHQse1tlXTpuW2VdfSl9KSx0fXZhciByaSxTbCxZaSxEbCxvaSxSbCxhaSxBbCx0cixXbyxHbyxxbyxZbyxzaSxRZyxKZyx0dixJbD1fKCgpPT57ZigpO2YoKTtudCgpO2h0KCk7cmk9Y2xhc3N7fSxTbD0oKCk9PntjbGFzcyBpIGV4dGVuZHMgcml7Z2V0VHJhbnNsYXRpb24odCl7cmV0dXJuIGcoe30pfXN0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybih0fHwodD1aKGkpKSkocnx8aSl9fSkoKTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWN9KX1yZXR1cm4gaX0pKCksWWk9Y2xhc3N7fSxEbD0oKCk9PntjbGFzcyBpe2hhbmRsZSh0KXtyZXR1cm4gdC5rZXl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWN9KX1yZXR1cm4gaX0pKCk7b2k9Y2xhc3N7fSxSbD0oKCk9PntjbGFzcyBpIGV4dGVuZHMgb2l7dGVtcGxhdGVNYXRjaGVyPS97e1xzPyhbXnt9XHNdKilccz99fS9nO2ludGVycG9sYXRlKHQsZSl7bGV0IHI7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIj9yPXRoaXMuaW50ZXJwb2xhdGVTdHJpbmcodCxlKTp0eXBlb2YgdD09ImZ1bmN0aW9uIj9yPXRoaXMuaW50ZXJwb2xhdGVGdW5jdGlvbih0LGUpOnI9dCxyfWdldFZhbHVlKHQsZSl7bGV0IHI9dHlwZW9mIGU9PSJzdHJpbmciP2Uuc3BsaXQoIi4iKTpbZV07ZT0iIjtkbyBlKz1yLnNoaWZ0KCksRnQodCkmJkZ0KHRbZV0pJiYodHlwZW9mIHRbZV09PSJvYmplY3QifHwhci5sZW5ndGgpPyh0PXRbZV0sZT0iIik6ci5sZW5ndGg/ZSs9Ii4iOnQ9dm9pZCAwO3doaWxlKHIubGVuZ3RoKTtyZXR1cm4gdH1pbnRlcnBvbGF0ZUZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQoZSl9aW50ZXJwb2xhdGVTdHJpbmcodCxlKXtyZXR1cm4gZT90LnJlcGxhY2UodGhpcy50ZW1wbGF0ZU1hdGNoZXIsKHIsbyk9PntsZXQgYT10aGlzLmdldFZhbHVlKGUsbyk7cmV0dXJuIEZ0KGEpP2E6cn0pOnR9c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgdDtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuKHR8fCh0PVooaSkpKShyfHxpKX19KSgpO3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhY30pfXJldHVybiBpfSkoKSxhaT1jbGFzc3t9LEFsPSgoKT0+e2NsYXNzIGkgZXh0ZW5kcyBhaXtjb21waWxlKHQsZSl7cmV0dXJuIHR9Y29tcGlsZVRyYW5zbGF0aW9ucyh0LGUpe3JldHVybiB0fXN0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybih0fHwodD1aKGkpKSkocnx8aSl9fSkoKTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWN9KX1yZXR1cm4gaX0pKCksdHI9Y2xhc3N7ZGVmYXVsdExhbmc7Y3VycmVudExhbmc9dGhpcy5kZWZhdWx0TGFuZzt0cmFuc2xhdGlvbnM9e307bGFuZ3M9W107b25UcmFuc2xhdGlvbkNoYW5nZT1uZXcgQTtvbkxhbmdDaGFuZ2U9bmV3IEE7b25EZWZhdWx0TGFuZ0NoYW5nZT1uZXcgQX0sV289bmV3IHYoIlVTRV9TVE9SRSIpLEdvPW5ldyB2KCJVU0VfREVGQVVMVF9MQU5HIikscW89bmV3IHYoIkRFRkFVTFRfTEFOR1VBR0UiKSxZbz1uZXcgdigiVVNFX0VYVEVORCIpLHNpPSgoKT0+e2NsYXNzIGl7c3RvcmU7Y3VycmVudExvYWRlcjtjb21waWxlcjtwYXJzZXI7bWlzc2luZ1RyYW5zbGF0aW9uSGFuZGxlcjt1c2VEZWZhdWx0TGFuZztpc29sYXRlO2V4dGVuZDtsb2FkaW5nVHJhbnNsYXRpb25zO3BlbmRpbmc9ITE7X29uVHJhbnNsYXRpb25DaGFuZ2U9bmV3IEE7X29uTGFuZ0NoYW5nZT1uZXcgQTtfb25EZWZhdWx0TGFuZ0NoYW5nZT1uZXcgQTtfZGVmYXVsdExhbmc7X2N1cnJlbnRMYW5nO19sYW5ncz1bXTtfdHJhbnNsYXRpb25zPXt9O190cmFuc2xhdGlvblJlcXVlc3RzPXt9O2dldCBvblRyYW5zbGF0aW9uQ2hhbmdlKCl7cmV0dXJuIHRoaXMuaXNvbGF0ZT90aGlzLl9vblRyYW5zbGF0aW9uQ2hhbmdlOnRoaXMuc3RvcmUub25UcmFuc2xhdGlvbkNoYW5nZX1nZXQgb25MYW5nQ2hhbmdlKCl7cmV0dXJuIHRoaXMuaXNvbGF0ZT90aGlzLl9vbkxhbmdDaGFuZ2U6dGhpcy5zdG9yZS5vbkxhbmdDaGFuZ2V9Z2V0IG9uRGVmYXVsdExhbmdDaGFuZ2UoKXtyZXR1cm4gdGhpcy5pc29sYXRlP3RoaXMuX29uRGVmYXVsdExhbmdDaGFuZ2U6dGhpcy5zdG9yZS5vbkRlZmF1bHRMYW5nQ2hhbmdlfWdldCBkZWZhdWx0TGFuZygpe3JldHVybiB0aGlzLmlzb2xhdGU/dGhpcy5fZGVmYXVsdExhbmc6dGhpcy5zdG9yZS5kZWZhdWx0TGFuZ31zZXQgZGVmYXVsdExhbmcodCl7dGhpcy5pc29sYXRlP3RoaXMuX2RlZmF1bHRMYW5nPXQ6dGhpcy5zdG9yZS5kZWZhdWx0TGFuZz10fWdldCBjdXJyZW50TGFuZygpe3JldHVybiB0aGlzLmlzb2xhdGU/dGhpcy5fY3VycmVudExhbmc6dGhpcy5zdG9yZS5jdXJyZW50TGFuZ31zZXQgY3VycmVudExhbmcodCl7dGhpcy5pc29sYXRlP3RoaXMuX2N1cnJlbnRMYW5nPXQ6dGhpcy5zdG9yZS5jdXJyZW50TGFuZz10fWdldCBsYW5ncygpe3JldHVybiB0aGlzLmlzb2xhdGU/dGhpcy5fbGFuZ3M6dGhpcy5zdG9yZS5sYW5nc31zZXQgbGFuZ3ModCl7dGhpcy5pc29sYXRlP3RoaXMuX2xhbmdzPXQ6dGhpcy5zdG9yZS5sYW5ncz10fWdldCB0cmFuc2xhdGlvbnMoKXtyZXR1cm4gdGhpcy5pc29sYXRlP3RoaXMuX3RyYW5zbGF0aW9uczp0aGlzLnN0b3JlLnRyYW5zbGF0aW9uc31zZXQgdHJhbnNsYXRpb25zKHQpe3RoaXMuaXNvbGF0ZT90aGlzLl90cmFuc2xhdGlvbnM9dDp0aGlzLnN0b3JlLnRyYW5zbGF0aW9ucz10fWNvbnN0cnVjdG9yKHQsZSxyLG8sYSxzPSEwLGM9ITEsZD0hMSx1KXt0aGlzLnN0b3JlPXQsdGhpcy5jdXJyZW50TG9hZGVyPWUsdGhpcy5jb21waWxlcj1yLHRoaXMucGFyc2VyPW8sdGhpcy5taXNzaW5nVHJhbnNsYXRpb25IYW5kbGVyPWEsdGhpcy51c2VEZWZhdWx0TGFuZz1zLHRoaXMuaXNvbGF0ZT1jLHRoaXMuZXh0ZW5kPWQsdSYmdGhpcy5zZXREZWZhdWx0TGFuZyh1KX1zZXREZWZhdWx0TGFuZyh0KXtpZih0PT09dGhpcy5kZWZhdWx0TGFuZylyZXR1cm47bGV0IGU9dGhpcy5yZXRyaWV2ZVRyYW5zbGF0aW9ucyh0KTt0eXBlb2YgZTwidSI/KHRoaXMuZGVmYXVsdExhbmc9PW51bGwmJih0aGlzLmRlZmF1bHRMYW5nPXQpLGUucGlwZSh5dCgxKSkuc3Vic2NyaWJlKHI9Pnt0aGlzLmNoYW5nZURlZmF1bHRMYW5nKHQpfSkpOnRoaXMuY2hhbmdlRGVmYXVsdExhbmcodCl9Z2V0RGVmYXVsdExhbmcoKXtyZXR1cm4gdGhpcy5kZWZhdWx0TGFuZ311c2UodCl7aWYodD09PXRoaXMuY3VycmVudExhbmcpcmV0dXJuIGcodGhpcy50cmFuc2xhdGlvbnNbdF0pO2xldCBlPXRoaXMucmV0cmlldmVUcmFuc2xhdGlvbnModCk7cmV0dXJuIHR5cGVvZiBlPCJ1Ij8odGhpcy5jdXJyZW50TGFuZ3x8KHRoaXMuY3VycmVudExhbmc9dCksZS5waXBlKHl0KDEpKS5zdWJzY3JpYmUocj0+e3RoaXMuY2hhbmdlTGFuZyh0KX0pLGUpOih0aGlzLmNoYW5nZUxhbmcodCksZyh0aGlzLnRyYW5zbGF0aW9uc1t0XSkpfXJldHJpZXZlVHJhbnNsYXRpb25zKHQpe2xldCBlO3JldHVybih0eXBlb2YgdGhpcy50cmFuc2xhdGlvbnNbdF0+InUifHx0aGlzLmV4dGVuZCkmJih0aGlzLl90cmFuc2xhdGlvblJlcXVlc3RzW3RdPXRoaXMuX3RyYW5zbGF0aW9uUmVxdWVzdHNbdF18fHRoaXMuZ2V0VHJhbnNsYXRpb24odCksZT10aGlzLl90cmFuc2xhdGlvblJlcXVlc3RzW3RdKSxlfWdldFRyYW5zbGF0aW9uKHQpe3RoaXMucGVuZGluZz0hMDtsZXQgZT10aGlzLmN1cnJlbnRMb2FkZXIuZ2V0VHJhbnNsYXRpb24odCkucGlwZShKZSgxKSx5dCgxKSk7cmV0dXJuIHRoaXMubG9hZGluZ1RyYW5zbGF0aW9ucz1lLnBpcGUoYihyPT50aGlzLmNvbXBpbGVyLmNvbXBpbGVUcmFuc2xhdGlvbnMocix0KSksSmUoMSkseXQoMSkpLHRoaXMubG9hZGluZ1RyYW5zbGF0aW9ucy5zdWJzY3JpYmUoe25leHQ6cj0+e3RoaXMudHJhbnNsYXRpb25zW3RdPXRoaXMuZXh0ZW5kJiZ0aGlzLnRyYW5zbGF0aW9uc1t0XT9oKGgoe30sciksdGhpcy50cmFuc2xhdGlvbnNbdF0pOnIsdGhpcy51cGRhdGVMYW5ncygpLHRoaXMucGVuZGluZz0hMX0sZXJyb3I6cj0+e3RoaXMucGVuZGluZz0hMX19KSxlfXNldFRyYW5zbGF0aW9uKHQsZSxyPSExKXtlPXRoaXMuY29tcGlsZXIuY29tcGlsZVRyYW5zbGF0aW9ucyhlLHQpLChyfHx0aGlzLmV4dGVuZCkmJnRoaXMudHJhbnNsYXRpb25zW3RdP3RoaXMudHJhbnNsYXRpb25zW3RdPU1sKHRoaXMudHJhbnNsYXRpb25zW3RdLGUpOnRoaXMudHJhbnNsYXRpb25zW3RdPWUsdGhpcy51cGRhdGVMYW5ncygpLHRoaXMub25UcmFuc2xhdGlvbkNoYW5nZS5lbWl0KHtsYW5nOnQsdHJhbnNsYXRpb25zOnRoaXMudHJhbnNsYXRpb25zW3RdfSl9Z2V0TGFuZ3MoKXtyZXR1cm4gdGhpcy5sYW5nc31hZGRMYW5ncyh0KXt0LmZvckVhY2goZT0+e3RoaXMubGFuZ3MuaW5kZXhPZihlKT09PS0xJiZ0aGlzLmxhbmdzLnB1c2goZSl9KX11cGRhdGVMYW5ncygpe3RoaXMuYWRkTGFuZ3MoT2JqZWN0LmtleXModGhpcy50cmFuc2xhdGlvbnMpKX1nZXRQYXJzZWRSZXN1bHQodCxlLHIpe2xldCBvO2lmKGUgaW5zdGFuY2VvZiBBcnJheSl7bGV0IGE9e30scz0hMTtmb3IobGV0IGMgb2YgZSlhW2NdPXRoaXMuZ2V0UGFyc2VkUmVzdWx0KHQsYyxyKSxMdChhW2NdKSYmKHM9ITApO2lmKHMpe2xldCBjPWUubWFwKGQ9Pkx0KGFbZF0pP2FbZF06ZyhhW2RdKSk7cmV0dXJuIFplKGMpLnBpcGUoYihkPT57bGV0IHU9e307cmV0dXJuIGQuZm9yRWFjaCgoeCxqKT0+e3VbZVtqXV09eH0pLHV9KSl9cmV0dXJuIGF9aWYodCYmKG89dGhpcy5wYXJzZXIuaW50ZXJwb2xhdGUodGhpcy5wYXJzZXIuZ2V0VmFsdWUodCxlKSxyKSksdHlwZW9mIG8+InUiJiZ0aGlzLmRlZmF1bHRMYW5nIT1udWxsJiZ0aGlzLmRlZmF1bHRMYW5nIT09dGhpcy5jdXJyZW50TGFuZyYmdGhpcy51c2VEZWZhdWx0TGFuZyYmKG89dGhpcy5wYXJzZXIuaW50ZXJwb2xhdGUodGhpcy5wYXJzZXIuZ2V0VmFsdWUodGhpcy50cmFuc2xhdGlvbnNbdGhpcy5kZWZhdWx0TGFuZ10sZSkscikpLHR5cGVvZiBvPiJ1Iil7bGV0IGE9e2tleTplLHRyYW5zbGF0ZVNlcnZpY2U6dGhpc307dHlwZW9mIHI8InUiJiYoYS5pbnRlcnBvbGF0ZVBhcmFtcz1yKSxvPXRoaXMubWlzc2luZ1RyYW5zbGF0aW9uSGFuZGxlci5oYW5kbGUoYSl9cmV0dXJuIHR5cGVvZiBvPCJ1Ij9vOmV9Z2V0KHQsZSl7aWYoIUZ0KHQpfHwhdC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCdQYXJhbWV0ZXIgImtleSIgcmVxdWlyZWQnKTtpZih0aGlzLnBlbmRpbmcpcmV0dXJuIHRoaXMubG9hZGluZ1RyYW5zbGF0aW9ucy5waXBlKGVlKHI9PihyPXRoaXMuZ2V0UGFyc2VkUmVzdWx0KHIsdCxlKSxMdChyKT9yOmcocikpKSk7e2xldCByPXRoaXMuZ2V0UGFyc2VkUmVzdWx0KHRoaXMudHJhbnNsYXRpb25zW3RoaXMuY3VycmVudExhbmddLHQsZSk7cmV0dXJuIEx0KHIpP3I6ZyhyKX19Z2V0U3RyZWFtT25UcmFuc2xhdGlvbkNoYW5nZSh0LGUpe2lmKCFGdCh0KXx8IXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcignUGFyYW1ldGVyICJrZXkiIHJlcXVpcmVkJyk7cmV0dXJuIEFlKE1lKCgpPT50aGlzLmdldCh0LGUpKSx0aGlzLm9uVHJhbnNsYXRpb25DaGFuZ2UucGlwZShzdChyPT57bGV0IG89dGhpcy5nZXRQYXJzZWRSZXN1bHQoci50cmFuc2xhdGlvbnMsdCxlKTtyZXR1cm4gdHlwZW9mIG8uc3Vic2NyaWJlPT0iZnVuY3Rpb24iP286ZyhvKX0pKSl9c3RyZWFtKHQsZSl7aWYoIUZ0KHQpfHwhdC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCdQYXJhbWV0ZXIgImtleSIgcmVxdWlyZWQnKTtyZXR1cm4gQWUoTWUoKCk9PnRoaXMuZ2V0KHQsZSkpLHRoaXMub25MYW5nQ2hhbmdlLnBpcGUoc3Qocj0+e2xldCBvPXRoaXMuZ2V0UGFyc2VkUmVzdWx0KHIudHJhbnNsYXRpb25zLHQsZSk7cmV0dXJuIEx0KG8pP286ZyhvKX0pKSl9aW5zdGFudCh0LGUpe2lmKCFGdCh0KXx8IXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcignUGFyYW1ldGVyICJrZXkiIHJlcXVpcmVkJyk7bGV0IHI9dGhpcy5nZXRQYXJzZWRSZXN1bHQodGhpcy50cmFuc2xhdGlvbnNbdGhpcy5jdXJyZW50TGFuZ10sdCxlKTtpZihMdChyKSl7aWYodCBpbnN0YW5jZW9mIEFycmF5KXtsZXQgbz17fTtyZXR1cm4gdC5mb3JFYWNoKChhLHMpPT57b1t0W3NdXT10W3NdfSksb31yZXR1cm4gdH1lbHNlIHJldHVybiByfXNldCh0LGUscj10aGlzLmN1cnJlbnRMYW5nKXt0aGlzLnRyYW5zbGF0aW9uc1tyXVt0XT10aGlzLmNvbXBpbGVyLmNvbXBpbGUoZSxyKSx0aGlzLnVwZGF0ZUxhbmdzKCksdGhpcy5vblRyYW5zbGF0aW9uQ2hhbmdlLmVtaXQoe2xhbmc6cix0cmFuc2xhdGlvbnM6dGhpcy50cmFuc2xhdGlvbnNbcl19KX1jaGFuZ2VMYW5nKHQpe3RoaXMuY3VycmVudExhbmc9dCx0aGlzLm9uTGFuZ0NoYW5nZS5lbWl0KHtsYW5nOnQsdHJhbnNsYXRpb25zOnRoaXMudHJhbnNsYXRpb25zW3RdfSksdGhpcy5kZWZhdWx0TGFuZz09bnVsbCYmdGhpcy5jaGFuZ2VEZWZhdWx0TGFuZyh0KX1jaGFuZ2VEZWZhdWx0TGFuZyh0KXt0aGlzLmRlZmF1bHRMYW5nPXQsdGhpcy5vbkRlZmF1bHRMYW5nQ2hhbmdlLmVtaXQoe2xhbmc6dCx0cmFuc2xhdGlvbnM6dGhpcy50cmFuc2xhdGlvbnNbdF19KX1yZWxvYWRMYW5nKHQpe3JldHVybiB0aGlzLnJlc2V0TGFuZyh0KSx0aGlzLmdldFRyYW5zbGF0aW9uKHQpfXJlc2V0TGFuZyh0KXt0aGlzLl90cmFuc2xhdGlvblJlcXVlc3RzW3RdPXZvaWQgMCx0aGlzLnRyYW5zbGF0aW9uc1t0XT12b2lkIDB9Z2V0QnJvd3NlckxhbmcoKXtpZih0eXBlb2Ygd2luZG93PiJ1Inx8dHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3I+InUiKXJldHVybjtsZXQgdD13aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcz93aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlc1swXTpudWxsO2lmKHQ9dHx8d2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXx8d2luZG93Lm5hdmlnYXRvci5icm93c2VyTGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlLCEodHlwZW9mIHQ+InUiKSlyZXR1cm4gdC5pbmRleE9mKCItIikhPT0tMSYmKHQ9dC5zcGxpdCgiLSIpWzBdKSx0LmluZGV4T2YoIl8iKSE9PS0xJiYodD10LnNwbGl0KCJfIilbMF0pLHR9Z2V0QnJvd3NlckN1bHR1cmVMYW5nKCl7aWYodHlwZW9mIHdpbmRvdz4idSJ8fHR5cGVvZiB3aW5kb3cubmF2aWdhdG9yPiJ1IilyZXR1cm47bGV0IHQ9d2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXM/d2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF06bnVsbDtyZXR1cm4gdD10fHx3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZXx8d2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2UsdH1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSkoRyh0ciksRyhyaSksRyhhaSksRyhvaSksRyhZaSksRyhHbyksRyhXbyksRyhZbyksRyhxbykpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWN9KX1yZXR1cm4gaX0pKCksUWc9KCgpPT57Y2xhc3MgaXt0cmFuc2xhdGVTZXJ2aWNlO2VsZW1lbnQ7X3JlZjtrZXk7bGFzdFBhcmFtcztjdXJyZW50UGFyYW1zO29uTGFuZ0NoYW5nZVN1YjtvbkRlZmF1bHRMYW5nQ2hhbmdlU3ViO29uVHJhbnNsYXRpb25DaGFuZ2VTdWI7c2V0IHRyYW5zbGF0ZSh0KXt0JiYodGhpcy5rZXk9dCx0aGlzLmNoZWNrTm9kZXMoKSl9c2V0IHRyYW5zbGF0ZVBhcmFtcyh0KXtLaSh0aGlzLmN1cnJlbnRQYXJhbXMsdCl8fCh0aGlzLmN1cnJlbnRQYXJhbXM9dCx0aGlzLmNoZWNrTm9kZXMoITApKX1jb25zdHJ1Y3Rvcih0LGUscil7dGhpcy50cmFuc2xhdGVTZXJ2aWNlPXQsdGhpcy5lbGVtZW50PWUsdGhpcy5fcmVmPXIsdGhpcy5vblRyYW5zbGF0aW9uQ2hhbmdlU3VifHwodGhpcy5vblRyYW5zbGF0aW9uQ2hhbmdlU3ViPXRoaXMudHJhbnNsYXRlU2VydmljZS5vblRyYW5zbGF0aW9uQ2hhbmdlLnN1YnNjcmliZShvPT57by5sYW5nPT09dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nJiZ0aGlzLmNoZWNrTm9kZXMoITAsby50cmFuc2xhdGlvbnMpfSkpLHRoaXMub25MYW5nQ2hhbmdlU3VifHwodGhpcy5vbkxhbmdDaGFuZ2VTdWI9dGhpcy50cmFuc2xhdGVTZXJ2aWNlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUobz0+e3RoaXMuY2hlY2tOb2RlcyghMCxvLnRyYW5zbGF0aW9ucyl9KSksdGhpcy5vbkRlZmF1bHRMYW5nQ2hhbmdlU3VifHwodGhpcy5vbkRlZmF1bHRMYW5nQ2hhbmdlU3ViPXRoaXMudHJhbnNsYXRlU2VydmljZS5vbkRlZmF1bHRMYW5nQ2hhbmdlLnN1YnNjcmliZShvPT57dGhpcy5jaGVja05vZGVzKCEwKX0pKX1uZ0FmdGVyVmlld0NoZWNrZWQoKXt0aGlzLmNoZWNrTm9kZXMoKX1jaGVja05vZGVzKHQ9ITEsZSl7bGV0IHI9dGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hpbGROb2RlcztyLmxlbmd0aHx8KHRoaXMuc2V0Q29udGVudCh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCx0aGlzLmtleSkscj10aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGlsZE5vZGVzKTtmb3IobGV0IG89MDtvPHIubGVuZ3RoOysrbyl7bGV0IGE9cltvXTtpZihhLm5vZGVUeXBlPT09Myl7bGV0IHM7aWYodCYmKGEubGFzdEtleT1udWxsKSxGdChhLmxvb2t1cEtleSkpcz1hLmxvb2t1cEtleTtlbHNlIGlmKHRoaXMua2V5KXM9dGhpcy5rZXk7ZWxzZXtsZXQgYz10aGlzLmdldENvbnRlbnQoYSksZD1jLnRyaW0oKTtkLmxlbmd0aCYmKGEubG9va3VwS2V5PWQsYyE9PWEuY3VycmVudFZhbHVlPyhzPWQsYS5vcmlnaW5hbENvbnRlbnQ9Y3x8YS5vcmlnaW5hbENvbnRlbnQpOmEub3JpZ2luYWxDb250ZW50P3M9YS5vcmlnaW5hbENvbnRlbnQudHJpbSgpOmMhPT1hLmN1cnJlbnRWYWx1ZSYmKHM9ZCxhLm9yaWdpbmFsQ29udGVudD1jfHxhLm9yaWdpbmFsQ29udGVudCkpfXRoaXMudXBkYXRlVmFsdWUocyxhLGUpfX19dXBkYXRlVmFsdWUodCxlLHIpe2lmKHQpe2lmKGUubGFzdEtleT09PXQmJnRoaXMubGFzdFBhcmFtcz09PXRoaXMuY3VycmVudFBhcmFtcylyZXR1cm47dGhpcy5sYXN0UGFyYW1zPXRoaXMuY3VycmVudFBhcmFtcztsZXQgbz1hPT57YSE9PXQmJihlLmxhc3RLZXk9dCksZS5vcmlnaW5hbENvbnRlbnR8fChlLm9yaWdpbmFsQ29udGVudD10aGlzLmdldENvbnRlbnQoZSkpLGUuY3VycmVudFZhbHVlPUZ0KGEpP2E6ZS5vcmlnaW5hbENvbnRlbnR8fHQsdGhpcy5zZXRDb250ZW50KGUsdGhpcy5rZXk/ZS5jdXJyZW50VmFsdWU6ZS5vcmlnaW5hbENvbnRlbnQucmVwbGFjZSh0LGUuY3VycmVudFZhbHVlKSksdGhpcy5fcmVmLm1hcmtGb3JDaGVjaygpfTtpZihGdChyKSl7bGV0IGE9dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldFBhcnNlZFJlc3VsdChyLHQsdGhpcy5jdXJyZW50UGFyYW1zKTtMdChhKT9hLnN1YnNjcmliZSh7bmV4dDpvfSk6byhhKX1lbHNlIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQodCx0aGlzLmN1cnJlbnRQYXJhbXMpLnN1YnNjcmliZShvKX19Z2V0Q29udGVudCh0KXtyZXR1cm4gRnQodC50ZXh0Q29udGVudCk/dC50ZXh0Q29udGVudDp0LmRhdGF9c2V0Q29udGVudCh0LGUpe0Z0KHQudGV4dENvbnRlbnQpP3QudGV4dENvbnRlbnQ9ZTp0LmRhdGE9ZX1uZ09uRGVzdHJveSgpe3RoaXMub25MYW5nQ2hhbmdlU3ViJiZ0aGlzLm9uTGFuZ0NoYW5nZVN1Yi51bnN1YnNjcmliZSgpLHRoaXMub25EZWZhdWx0TGFuZ0NoYW5nZVN1YiYmdGhpcy5vbkRlZmF1bHRMYW5nQ2hhbmdlU3ViLnVuc3Vic2NyaWJlKCksdGhpcy5vblRyYW5zbGF0aW9uQ2hhbmdlU3ViJiZ0aGlzLm9uVHJhbnNsYXRpb25DaGFuZ2VTdWIudW5zdWJzY3JpYmUoKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSkoQyhzaSksQyhEKSxDKEF0KSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyIiLCJ0cmFuc2xhdGUiLCIiXSxbIiIsIm5neC10cmFuc2xhdGUiLCIiXV0saW5wdXRzOnt0cmFuc2xhdGU6InRyYW5zbGF0ZSIsdHJhbnNsYXRlUGFyYW1zOiJ0cmFuc2xhdGVQYXJhbXMifSxzdGFuZGFsb25lOiExfSl9cmV0dXJuIGl9KSgpLEpnPSgoKT0+e2NsYXNzIGl7dHJhbnNsYXRlO19yZWY7dmFsdWU9IiI7bGFzdEtleT1udWxsO2xhc3RQYXJhbXM9W107b25UcmFuc2xhdGlvbkNoYW5nZTtvbkxhbmdDaGFuZ2U7b25EZWZhdWx0TGFuZ0NoYW5nZTtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudHJhbnNsYXRlPXQsdGhpcy5fcmVmPWV9dXBkYXRlVmFsdWUodCxlLHIpe2xldCBvPWE9Pnt0aGlzLnZhbHVlPWEhPT12b2lkIDA/YTp0LHRoaXMubGFzdEtleT10LHRoaXMuX3JlZi5tYXJrRm9yQ2hlY2soKX07aWYocil7bGV0IGE9dGhpcy50cmFuc2xhdGUuZ2V0UGFyc2VkUmVzdWx0KHIsdCxlKTtMdChhLnN1YnNjcmliZSk/YS5zdWJzY3JpYmUobyk6byhhKX10aGlzLnRyYW5zbGF0ZS5nZXQodCxlKS5zdWJzY3JpYmUobyl9dHJhbnNmb3JtKHQsLi4uZSl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4gdDtpZihLaSh0LHRoaXMubGFzdEtleSkmJktpKGUsdGhpcy5sYXN0UGFyYW1zKSlyZXR1cm4gdGhpcy52YWx1ZTtsZXQgcjtpZihGdChlWzBdKSYmZS5sZW5ndGgpaWYodHlwZW9mIGVbMF09PSJzdHJpbmciJiZlWzBdLmxlbmd0aCl7bGV0IG89ZVswXS5yZXBsYWNlKC8oXCcpPyhbYS16QS1aMC05X10rKShcJyk/KFxzKT86L2csJyIkMiI6JykucmVwbGFjZSgvOihccyk/KFwnKSguKj8pKFwnKS9nLCc6IiQzIicpO3RyeXtyPUpTT04ucGFyc2Uobyl9Y2F0Y2h7dGhyb3cgbmV3IFN5bnRheEVycm9yKGBXcm9uZyBwYXJhbWV0ZXIgaW4gVHJhbnNsYXRlUGlwZS4gRXhwZWN0ZWQgYSB2YWxpZCBPYmplY3QsIHJlY2VpdmVkOiAke2VbMF19YCl9fWVsc2UgdHlwZW9mIGVbMF09PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShlWzBdKSYmKHI9ZVswXSk7cmV0dXJuIHRoaXMubGFzdEtleT10LHRoaXMubGFzdFBhcmFtcz1lLHRoaXMudXBkYXRlVmFsdWUodCxyKSx0aGlzLl9kaXNwb3NlKCksdGhpcy5vblRyYW5zbGF0aW9uQ2hhbmdlfHwodGhpcy5vblRyYW5zbGF0aW9uQ2hhbmdlPXRoaXMudHJhbnNsYXRlLm9uVHJhbnNsYXRpb25DaGFuZ2Uuc3Vic2NyaWJlKG89Pnt0aGlzLmxhc3RLZXkmJm8ubGFuZz09PXRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nJiYodGhpcy5sYXN0S2V5PW51bGwsdGhpcy51cGRhdGVWYWx1ZSh0LHIsby50cmFuc2xhdGlvbnMpKX0pKSx0aGlzLm9uTGFuZ0NoYW5nZXx8KHRoaXMub25MYW5nQ2hhbmdlPXRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUobz0+e3RoaXMubGFzdEtleSYmKHRoaXMubGFzdEtleT1udWxsLHRoaXMudXBkYXRlVmFsdWUodCxyLG8udHJhbnNsYXRpb25zKSl9KSksdGhpcy5vbkRlZmF1bHRMYW5nQ2hhbmdlfHwodGhpcy5vbkRlZmF1bHRMYW5nQ2hhbmdlPXRoaXMudHJhbnNsYXRlLm9uRGVmYXVsdExhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpPT57dGhpcy5sYXN0S2V5JiYodGhpcy5sYXN0S2V5PW51bGwsdGhpcy51cGRhdGVWYWx1ZSh0LHIpKX0pKSx0aGlzLnZhbHVlfV9kaXNwb3NlKCl7dHlwZW9mIHRoaXMub25UcmFuc2xhdGlvbkNoYW5nZTwidSImJih0aGlzLm9uVHJhbnNsYXRpb25DaGFuZ2UudW5zdWJzY3JpYmUoKSx0aGlzLm9uVHJhbnNsYXRpb25DaGFuZ2U9dm9pZCAwKSx0eXBlb2YgdGhpcy5vbkxhbmdDaGFuZ2U8InUiJiYodGhpcy5vbkxhbmdDaGFuZ2UudW5zdWJzY3JpYmUoKSx0aGlzLm9uTGFuZ0NoYW5nZT12b2lkIDApLHR5cGVvZiB0aGlzLm9uRGVmYXVsdExhbmdDaGFuZ2U8InUiJiYodGhpcy5vbkRlZmF1bHRMYW5nQ2hhbmdlLnVuc3Vic2NyaWJlKCksdGhpcy5vbkRlZmF1bHRMYW5nQ2hhbmdlPXZvaWQgMCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9kaXNwb3NlKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpKEMoc2ksMTYpLEMoQXQsMTYpKX07c3RhdGljIFx1MDI3NXBpcGU9cmwoe25hbWU6InRyYW5zbGF0ZSIsdHlwZTppLHB1cmU6ITEsc3RhbmRhbG9uZTohMX0pO3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhY30pfXJldHVybiBpfSkoKSx0dj0oKCk9PntjbGFzcyBpe3N0YXRpYyBmb3JSb290KHQ9e30pe3JldHVybntuZ01vZHVsZTppLHByb3ZpZGVyczpbdC5sb2FkZXJ8fHtwcm92aWRlOnJpLHVzZUNsYXNzOlNsfSx0LmNvbXBpbGVyfHx7cHJvdmlkZTphaSx1c2VDbGFzczpBbH0sdC5wYXJzZXJ8fHtwcm92aWRlOm9pLHVzZUNsYXNzOlJsfSx0Lm1pc3NpbmdUcmFuc2xhdGlvbkhhbmRsZXJ8fHtwcm92aWRlOllpLHVzZUNsYXNzOkRsfSx0cix7cHJvdmlkZTpXbyx1c2VWYWx1ZTp0Lmlzb2xhdGV9LHtwcm92aWRlOkdvLHVzZVZhbHVlOnQudXNlRGVmYXVsdExhbmd9LHtwcm92aWRlOllvLHVzZVZhbHVlOnQuZXh0ZW5kfSx7cHJvdmlkZTpxbyx1c2VWYWx1ZTp0LmRlZmF1bHRMYW5ndWFnZX0sc2ldfX1zdGF0aWMgZm9yQ2hpbGQodD17fSl7cmV0dXJue25nTW9kdWxlOmkscHJvdmlkZXJzOlt0LmxvYWRlcnx8e3Byb3ZpZGU6cmksdXNlQ2xhc3M6U2x9LHQuY29tcGlsZXJ8fHtwcm92aWRlOmFpLHVzZUNsYXNzOkFsfSx0LnBhcnNlcnx8e3Byb3ZpZGU6b2ksdXNlQ2xhc3M6Umx9LHQubWlzc2luZ1RyYW5zbGF0aW9uSGFuZGxlcnx8e3Byb3ZpZGU6WWksdXNlQ2xhc3M6RGx9LHtwcm92aWRlOldvLHVzZVZhbHVlOnQuaXNvbGF0ZX0se3Byb3ZpZGU6R28sdXNlVmFsdWU6dC51c2VEZWZhdWx0TGFuZ30se3Byb3ZpZGU6WW8sdXNlVmFsdWU6dC5leHRlbmR9LHtwcm92aWRlOnFvLHVzZVZhbHVlOnQuZGVmYXVsdExhbmd1YWdlfSxzaV19fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NW1vZD1SKHt0eXBlOml9KTtzdGF0aWMgXHUwMjc1aW5qPVMoe30pfXJldHVybiBpfSkoKX0pO2Z1bmN0aW9uIGplKGkpe3JldHVybiBuZXcgSm8oaSl9ZnVuY3Rpb24gVmwoaSxuLHQpe2xldCBlPXQucGF0aC5zcGxpdCgiLyIpO2lmKGUubGVuZ3RoPmkubGVuZ3RofHx0LnBhdGhNYXRjaD09PSJmdWxsIiYmKG4uaGFzQ2hpbGRyZW4oKXx8ZS5sZW5ndGg8aS5sZW5ndGgpKXJldHVybiBudWxsO2xldCByPXt9O2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKXtsZXQgYT1lW29dLHM9aVtvXTtpZihhWzBdPT09IjoiKXJbYS5zdWJzdHJpbmcoMSldPXM7ZWxzZSBpZihhIT09cy5wYXRoKXJldHVybiBudWxsfXJldHVybntjb25zdW1lZDppLnNsaWNlKDAsZS5sZW5ndGgpLHBvc1BhcmFtczpyfX1mdW5jdGlvbiBvaChpLG4pe2lmKGkubGVuZ3RoIT09bi5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDsrK3QpaWYoIVh0KGlbdF0sblt0XSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gWHQoaSxuKXtsZXQgdD1pP3RhKGkpOnZvaWQgMCxlPW4/dGEobik6dm9pZCAwO2lmKCF0fHwhZXx8dC5sZW5ndGghPWUubGVuZ3RoKXJldHVybiExO2xldCByO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKWlmKHI9dFtvXSwhamwoaVtyXSxuW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB0YShpKXtyZXR1cm5bLi4uT2JqZWN0LmtleXMoaSksLi4uT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhpKV19ZnVuY3Rpb24gamwoaSxuKXtpZihBcnJheS5pc0FycmF5KGkpJiZBcnJheS5pc0FycmF5KG4pKXtpZihpLmxlbmd0aCE9PW4ubGVuZ3RoKXJldHVybiExO2xldCB0PVsuLi5pXS5zb3J0KCksZT1bLi4ubl0uc29ydCgpO3JldHVybiB0LmV2ZXJ5KChyLG8pPT5lW29dPT09cil9ZWxzZSByZXR1cm4gaT09PW59ZnVuY3Rpb24gQmwoaSl7cmV0dXJuIGkubGVuZ3RoPjA/aVtpLmxlbmd0aC0xXTpudWxsfWZ1bmN0aW9uIG9lKGkpe3JldHVybiBMdChpKT9pOlluKGkpP3B0KFByb21pc2UucmVzb2x2ZShpKSk6ZyhpKX1mdW5jdGlvbiBPbChpLG4sdCl7cmV0dXJuIGFoW3QucGF0aHNdKGkucm9vdCxuLnJvb3QsdC5tYXRyaXhQYXJhbXMpJiZ6bFt0LnF1ZXJ5UGFyYW1zXShpLnF1ZXJ5UGFyYW1zLG4ucXVlcnlQYXJhbXMpJiYhKHQuZnJhZ21lbnQ9PT0iZXhhY3QiJiZpLmZyYWdtZW50IT09bi5mcmFnbWVudCl9ZnVuY3Rpb24gc2goaSxuKXtyZXR1cm4gWHQoaSxuKX1mdW5jdGlvbiBVbChpLG4sdCl7aWYoIUxlKGkuc2VnbWVudHMsbi5zZWdtZW50cyl8fCFucihpLnNlZ21lbnRzLG4uc2VnbWVudHMsdCl8fGkubnVtYmVyT2ZDaGlsZHJlbiE9PW4ubnVtYmVyT2ZDaGlsZHJlbilyZXR1cm4hMTtmb3IobGV0IGUgaW4gbi5jaGlsZHJlbilpZighaS5jaGlsZHJlbltlXXx8IVVsKGkuY2hpbGRyZW5bZV0sbi5jaGlsZHJlbltlXSx0KSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBsaChpLG4pe3JldHVybiBPYmplY3Qua2V5cyhuKS5sZW5ndGg8PU9iamVjdC5rZXlzKGkpLmxlbmd0aCYmT2JqZWN0LmtleXMobikuZXZlcnkodD0+amwoaVt0XSxuW3RdKSl9ZnVuY3Rpb24gSGwoaSxuLHQpe3JldHVybiAkbChpLG4sbi5zZWdtZW50cyx0KX1mdW5jdGlvbiAkbChpLG4sdCxlKXtpZihpLnNlZ21lbnRzLmxlbmd0aD50Lmxlbmd0aCl7bGV0IHI9aS5zZWdtZW50cy5zbGljZSgwLHQubGVuZ3RoKTtyZXR1cm4hKCFMZShyLHQpfHxuLmhhc0NoaWxkcmVuKCl8fCFucihyLHQsZSkpfWVsc2UgaWYoaS5zZWdtZW50cy5sZW5ndGg9PT10Lmxlbmd0aCl7aWYoIUxlKGkuc2VnbWVudHMsdCl8fCFucihpLnNlZ21lbnRzLHQsZSkpcmV0dXJuITE7Zm9yKGxldCByIGluIG4uY2hpbGRyZW4paWYoIWkuY2hpbGRyZW5bcl18fCFIbChpLmNoaWxkcmVuW3JdLG4uY2hpbGRyZW5bcl0sZSkpcmV0dXJuITE7cmV0dXJuITB9ZWxzZXtsZXQgcj10LnNsaWNlKDAsaS5zZWdtZW50cy5sZW5ndGgpLG89dC5zbGljZShpLnNlZ21lbnRzLmxlbmd0aCk7cmV0dXJuIUxlKGkuc2VnbWVudHMscil8fCFucihpLnNlZ21lbnRzLHIsZSl8fCFpLmNoaWxkcmVuW3ddPyExOiRsKGkuY2hpbGRyZW5bd10sbixvLGUpfX1mdW5jdGlvbiBucihpLG4sdCl7cmV0dXJuIG4uZXZlcnkoKGUscik9PnpsW3RdKGlbcl0ucGFyYW1ldGVycyxlLnBhcmFtZXRlcnMpKX1mdW5jdGlvbiBjaChpLG4pe3JldHVybiBMZShpLG4pJiZpLmV2ZXJ5KCh0LGUpPT5YdCh0LnBhcmFtZXRlcnMsbltlXS5wYXJhbWV0ZXJzKSl9ZnVuY3Rpb24gTGUoaSxuKXtyZXR1cm4gaS5sZW5ndGghPT1uLmxlbmd0aD8hMTppLmV2ZXJ5KCh0LGUpPT50LnBhdGg9PT1uW2VdLnBhdGgpfWZ1bmN0aW9uIGRoKGksbil7bGV0IHQ9W107cmV0dXJuIE9iamVjdC5lbnRyaWVzKGkuY2hpbGRyZW4pLmZvckVhY2goKFtlLHJdKT0+e2U9PT13JiYodD10LmNvbmNhdChuKHIsZSkpKX0pLE9iamVjdC5lbnRyaWVzKGkuY2hpbGRyZW4pLmZvckVhY2goKFtlLHJdKT0+e2UhPT13JiYodD10LmNvbmNhdChuKHIsZSkpKX0pLHR9ZnVuY3Rpb24gcnIoaSl7cmV0dXJuIGkuc2VnbWVudHMubWFwKG49PkdsKG4pKS5qb2luKCIvIil9ZnVuY3Rpb24gWmkoaSxuKXtpZighaS5oYXNDaGlsZHJlbigpKXJldHVybiBycihpKTtpZihuKXtsZXQgdD1pLmNoaWxkcmVuW3ddP1ppKGkuY2hpbGRyZW5bd10sITEpOiIiLGU9W107cmV0dXJuIE9iamVjdC5lbnRyaWVzKGkuY2hpbGRyZW4pLmZvckVhY2goKFtyLG9dKT0+e3IhPT13JiZlLnB1c2goYCR7cn06JHtaaShvLCExKX1gKX0pLGUubGVuZ3RoPjA/YCR7dH0oJHtlLmpvaW4oIi8vIil9KWA6dH1lbHNle2xldCB0PWRoKGksKGUscik9PnI9PT13P1taaShpLmNoaWxkcmVuW3ddLCExKV06W2Ake3J9OiR7WmkoZSwhMSl9YF0pO3JldHVybiBPYmplY3Qua2V5cyhpLmNoaWxkcmVuKS5sZW5ndGg9PT0xJiZpLmNoaWxkcmVuW3ddIT1udWxsP2Ake3JyKGkpfS8ke3RbMF19YDpgJHtycihpKX0vKCR7dC5qb2luKCIvLyIpfSlgfX1mdW5jdGlvbiBXbChpKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGkpLnJlcGxhY2UoLyU0MC9nLCJAIikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKX1mdW5jdGlvbiBlcihpKXtyZXR1cm4gV2woaSkucmVwbGFjZSgvJTNCL2dpLCI7Iil9ZnVuY3Rpb24gaGgoaSl7cmV0dXJuIGVuY29kZVVSSShpKX1mdW5jdGlvbiBlYShpKXtyZXR1cm4gV2woaSkucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5IikucmVwbGFjZSgvJTI2L2dpLCImIil9ZnVuY3Rpb24gb3IoaSl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpKX1mdW5jdGlvbiBrbChpKXtyZXR1cm4gb3IoaS5yZXBsYWNlKC9cKy9nLCIlMjAiKSl9ZnVuY3Rpb24gR2woaSl7cmV0dXJuYCR7ZWEoaS5wYXRoKX0ke21oKGkucGFyYW1ldGVycyl9YH1mdW5jdGlvbiBtaChpKXtyZXR1cm4gT2JqZWN0LmVudHJpZXMoaSkubWFwKChbbix0XSk9PmA7JHtlYShuKX09JHtlYSh0KX1gKS5qb2luKCIiKX1mdW5jdGlvbiBmaChpKXtsZXQgbj1PYmplY3QuZW50cmllcyhpKS5tYXAoKFt0LGVdKT0+QXJyYXkuaXNBcnJheShlKT9lLm1hcChyPT5gJHtlcih0KX09JHtlcihyKX1gKS5qb2luKCImIik6YCR7ZXIodCl9PSR7ZXIoZSl9YCkuZmlsdGVyKHQ9PnQpO3JldHVybiBuLmxlbmd0aD9gPyR7bi5qb2luKCImIil9YDoiIn1mdW5jdGlvbiBLbyhpKXtsZXQgbj1pLm1hdGNoKHBoKTtyZXR1cm4gbj9uWzBdOiIifWZ1bmN0aW9uIHZoKGkpe2xldCBuPWkubWF0Y2goZ2gpO3JldHVybiBuP25bMF06IiJ9ZnVuY3Rpb24gYmgoaSl7bGV0IG49aS5tYXRjaChfaCk7cmV0dXJuIG4/blswXToiIn1mdW5jdGlvbiBDaChpKXtsZXQgbj1pLm1hdGNoKHloKTtyZXR1cm4gbj9uWzBdOiIifWZ1bmN0aW9uIHFsKGkpe3JldHVybiBpLnNlZ21lbnRzLmxlbmd0aD4wP25ldyBrKFtdLHtbd106aX0pOml9ZnVuY3Rpb24gWWwoaSl7bGV0IG49e307Zm9yKGxldFtlLHJdb2YgT2JqZWN0LmVudHJpZXMoaS5jaGlsZHJlbikpe2xldCBvPVlsKHIpO2lmKGU9PT13JiZvLnNlZ21lbnRzLmxlbmd0aD09PTAmJm8uaGFzQ2hpbGRyZW4oKSlmb3IobGV0W2Esc11vZiBPYmplY3QuZW50cmllcyhvLmNoaWxkcmVuKSluW2FdPXM7ZWxzZShvLnNlZ21lbnRzLmxlbmd0aD4wfHxvLmhhc0NoaWxkcmVuKCkpJiYobltlXT1vKX1sZXQgdD1uZXcgayhpLnNlZ21lbnRzLG4pO3JldHVybiB4aCh0KX1mdW5jdGlvbiB4aChpKXtpZihpLm51bWJlck9mQ2hpbGRyZW49PT0xJiZpLmNoaWxkcmVuW3ddKXtsZXQgbj1pLmNoaWxkcmVuW3ddO3JldHVybiBuZXcgayhpLnNlZ21lbnRzLmNvbmNhdChuLnNlZ21lbnRzKSxuLmNoaWxkcmVuKX1yZXR1cm4gaX1mdW5jdGlvbiB2ZShpKXtyZXR1cm4gaSBpbnN0YW5jZW9mIEp0fWZ1bmN0aW9uIEtsKGksbix0PW51bGwsZT1udWxsKXtsZXQgcj1abChpKTtyZXR1cm4gWGwocixuLHQsZSl9ZnVuY3Rpb24gWmwoaSl7bGV0IG47ZnVuY3Rpb24gdChvKXtsZXQgYT17fTtmb3IobGV0IGMgb2Ygby5jaGlsZHJlbil7bGV0IGQ9dChjKTthW2Mub3V0bGV0XT1kfWxldCBzPW5ldyBrKG8udXJsLGEpO3JldHVybiBvPT09aSYmKG49cyksc31sZXQgZT10KGkucm9vdCkscj1xbChlKTtyZXR1cm4gbj8/cn1mdW5jdGlvbiBYbChpLG4sdCxlKXtsZXQgcj1pO2Zvcig7ci5wYXJlbnQ7KXI9ci5wYXJlbnQ7aWYobi5sZW5ndGg9PT0wKXJldHVybiBabyhyLHIscix0LGUpO2xldCBvPXdoKG4pO2lmKG8udG9Sb290KCkpcmV0dXJuIFpvKHIscixuZXcgayhbXSx7fSksdCxlKTtsZXQgYT1FaChvLHIsaSkscz1hLnByb2Nlc3NDaGlsZHJlbj9RaShhLnNlZ21lbnRHcm91cCxhLmluZGV4LG8uY29tbWFuZHMpOkpsKGEuc2VnbWVudEdyb3VwLGEuaW5kZXgsby5jb21tYW5kcyk7cmV0dXJuIFpvKHIsYS5zZWdtZW50R3JvdXAscyx0LGUpfWZ1bmN0aW9uIGFyKGkpe3JldHVybiB0eXBlb2YgaT09Im9iamVjdCImJmkhPW51bGwmJiFpLm91dGxldHMmJiFpLnNlZ21lbnRQYXRofWZ1bmN0aW9uIHRuKGkpe3JldHVybiB0eXBlb2YgaT09Im9iamVjdCImJmkhPW51bGwmJmkub3V0bGV0c31mdW5jdGlvbiBabyhpLG4sdCxlLHIpe2xldCBvPXt9O2UmJk9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKFtjLGRdKT0+e29bY109QXJyYXkuaXNBcnJheShkKT9kLm1hcCh1PT5gJHt1fWApOmAke2R9YH0pO2xldCBhO2k9PT1uP2E9dDphPVFsKGksbix0KTtsZXQgcz1xbChZbChhKSk7cmV0dXJuIG5ldyBKdChzLG8scil9ZnVuY3Rpb24gUWwoaSxuLHQpe2xldCBlPXt9O3JldHVybiBPYmplY3QuZW50cmllcyhpLmNoaWxkcmVuKS5mb3JFYWNoKChbcixvXSk9PntvPT09bj9lW3JdPXQ6ZVtyXT1RbChvLG4sdCl9KSxuZXcgayhpLnNlZ21lbnRzLGUpfWZ1bmN0aW9uIHdoKGkpe2lmKHR5cGVvZiBpWzBdPT0ic3RyaW5nIiYmaS5sZW5ndGg9PT0xJiZpWzBdPT09Ii8iKXJldHVybiBuZXcgc3IoITAsMCxpKTtsZXQgbj0wLHQ9ITEsZT1pLnJlZHVjZSgocixvLGEpPT57aWYodHlwZW9mIG89PSJvYmplY3QiJiZvIT1udWxsKXtpZihvLm91dGxldHMpe2xldCBzPXt9O3JldHVybiBPYmplY3QuZW50cmllcyhvLm91dGxldHMpLmZvckVhY2goKFtjLGRdKT0+e3NbY109dHlwZW9mIGQ9PSJzdHJpbmciP2Quc3BsaXQoIi8iKTpkfSksWy4uLnIse291dGxldHM6c31dfWlmKG8uc2VnbWVudFBhdGgpcmV0dXJuWy4uLnIsby5zZWdtZW50UGF0aF19cmV0dXJuIHR5cGVvZiBvIT0ic3RyaW5nIj9bLi4ucixvXTphPT09MD8oby5zcGxpdCgiLyIpLmZvckVhY2goKHMsYyk9PntjPT0wJiZzPT09Ii4ifHwoYz09MCYmcz09PSIiP3Q9ITA6cz09PSIuLiI/bisrOnMhPSIiJiZyLnB1c2gocykpfSkscik6Wy4uLnIsb119LFtdKTtyZXR1cm4gbmV3IHNyKHQsbixlKX1mdW5jdGlvbiBFaChpLG4sdCl7aWYoaS5pc0Fic29sdXRlKXJldHVybiBuZXcgZGkobiwhMCwwKTtpZighdClyZXR1cm4gbmV3IGRpKG4sITEsTmFOKTtpZih0LnBhcmVudD09PW51bGwpcmV0dXJuIG5ldyBkaSh0LCEwLDApO2xldCBlPWFyKGkuY29tbWFuZHNbMF0pPzA6MSxyPXQuc2VnbWVudHMubGVuZ3RoLTErZTtyZXR1cm4gU2godCxyLGkubnVtYmVyT2ZEb3VibGVEb3RzKX1mdW5jdGlvbiBTaChpLG4sdCl7bGV0IGU9aSxyPW4sbz10O2Zvcig7bz5yOyl7aWYoby09cixlPWUucGFyZW50LCFlKXRocm93IG5ldyBRKDQwMDUsITEpO3I9ZS5zZWdtZW50cy5sZW5ndGh9cmV0dXJuIG5ldyBkaShlLCExLHItbyl9ZnVuY3Rpb24gRGgoaSl7cmV0dXJuIHRuKGlbMF0pP2lbMF0ub3V0bGV0czp7W3ddOml9fWZ1bmN0aW9uIEpsKGksbix0KXtpZihpPz89bmV3IGsoW10se30pLGkuc2VnbWVudHMubGVuZ3RoPT09MCYmaS5oYXNDaGlsZHJlbigpKXJldHVybiBRaShpLG4sdCk7bGV0IGU9UmgoaSxuLHQpLHI9dC5zbGljZShlLmNvbW1hbmRJbmRleCk7aWYoZS5tYXRjaCYmZS5wYXRoSW5kZXg8aS5zZWdtZW50cy5sZW5ndGgpe2xldCBvPW5ldyBrKGkuc2VnbWVudHMuc2xpY2UoMCxlLnBhdGhJbmRleCkse30pO3JldHVybiBvLmNoaWxkcmVuW3ddPW5ldyBrKGkuc2VnbWVudHMuc2xpY2UoZS5wYXRoSW5kZXgpLGkuY2hpbGRyZW4pLFFpKG8sMCxyKX1lbHNlIHJldHVybiBlLm1hdGNoJiZyLmxlbmd0aD09PTA/bmV3IGsoaS5zZWdtZW50cyx7fSk6ZS5tYXRjaCYmIWkuaGFzQ2hpbGRyZW4oKT9uYShpLG4sdCk6ZS5tYXRjaD9RaShpLDAscik6bmEoaSxuLHQpfWZ1bmN0aW9uIFFpKGksbix0KXtpZih0Lmxlbmd0aD09PTApcmV0dXJuIG5ldyBrKGkuc2VnbWVudHMse30pO3tsZXQgZT1EaCh0KSxyPXt9O2lmKE9iamVjdC5rZXlzKGUpLnNvbWUobz0+byE9PXcpJiZpLmNoaWxkcmVuW3ddJiZpLm51bWJlck9mQ2hpbGRyZW49PT0xJiZpLmNoaWxkcmVuW3ddLnNlZ21lbnRzLmxlbmd0aD09PTApe2xldCBvPVFpKGkuY2hpbGRyZW5bd10sbix0KTtyZXR1cm4gbmV3IGsoaS5zZWdtZW50cyxvLmNoaWxkcmVuKX1yZXR1cm4gT2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoW28sYV0pPT57dHlwZW9mIGE9PSJzdHJpbmciJiYoYT1bYV0pLGEhPT1udWxsJiYocltvXT1KbChpLmNoaWxkcmVuW29dLG4sYSkpfSksT2JqZWN0LmVudHJpZXMoaS5jaGlsZHJlbikuZm9yRWFjaCgoW28sYV0pPT57ZVtvXT09PXZvaWQgMCYmKHJbb109YSl9KSxuZXcgayhpLnNlZ21lbnRzLHIpfX1mdW5jdGlvbiBSaChpLG4sdCl7bGV0IGU9MCxyPW4sbz17bWF0Y2g6ITEscGF0aEluZGV4OjAsY29tbWFuZEluZGV4OjB9O2Zvcig7cjxpLnNlZ21lbnRzLmxlbmd0aDspe2lmKGU+PXQubGVuZ3RoKXJldHVybiBvO2xldCBhPWkuc2VnbWVudHNbcl0scz10W2VdO2lmKHRuKHMpKWJyZWFrO2xldCBjPWAke3N9YCxkPWU8dC5sZW5ndGgtMT90W2UrMV06bnVsbDtpZihyPjAmJmM9PT12b2lkIDApYnJlYWs7aWYoYyYmZCYmdHlwZW9mIGQ9PSJvYmplY3QiJiZkLm91dGxldHM9PT12b2lkIDApe2lmKCFGbChjLGQsYSkpcmV0dXJuIG87ZSs9Mn1lbHNle2lmKCFGbChjLHt9LGEpKXJldHVybiBvO2UrK31yKyt9cmV0dXJue21hdGNoOiEwLHBhdGhJbmRleDpyLGNvbW1hbmRJbmRleDplfX1mdW5jdGlvbiBuYShpLG4sdCl7bGV0IGU9aS5zZWdtZW50cy5zbGljZSgwLG4pLHI9MDtmb3IoO3I8dC5sZW5ndGg7KXtsZXQgbz10W3JdO2lmKHRuKG8pKXtsZXQgYz1BaChvLm91dGxldHMpO3JldHVybiBuZXcgayhlLGMpfWlmKHI9PT0wJiZhcih0WzBdKSl7bGV0IGM9aS5zZWdtZW50c1tuXTtlLnB1c2gobmV3IHBlKGMucGF0aCxUbCh0WzBdKSkpLHIrKztjb250aW51ZX1sZXQgYT10bihvKT9vLm91dGxldHNbd106YCR7b31gLHM9cjx0Lmxlbmd0aC0xP3RbcisxXTpudWxsO2EmJnMmJmFyKHMpPyhlLnB1c2gobmV3IHBlKGEsVGwocykpKSxyKz0yKTooZS5wdXNoKG5ldyBwZShhLHt9KSkscisrKX1yZXR1cm4gbmV3IGsoZSx7fSl9ZnVuY3Rpb24gQWgoaSl7bGV0IG49e307cmV0dXJuIE9iamVjdC5lbnRyaWVzKGkpLmZvckVhY2goKFt0LGVdKT0+e3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9W2VdKSxlIT09bnVsbCYmKG5bdF09bmEobmV3IGsoW10se30pLDAsZSkpfSksbn1mdW5jdGlvbiBUbChpKXtsZXQgbj17fTtyZXR1cm4gT2JqZWN0LmVudHJpZXMoaSkuZm9yRWFjaCgoW3QsZV0pPT5uW3RdPWAke2V9YCksbn1mdW5jdGlvbiBGbChpLG4sdCl7cmV0dXJuIGk9PXQucGF0aCYmWHQobix0LnBhcmFtZXRlcnMpfWZ1bmN0aW9uIE1oKGkpe3JldHVybiEoaSBpbnN0YW5jZW9mIG5uKSYmIShpIGluc3RhbmNlb2YgZ2kpfWZ1bmN0aW9uIEloKGksbil7cmV0dXJuIGkucHJvdmlkZXJzJiYhaS5faW5qZWN0b3ImJihpLl9pbmplY3Rvcj1xbihpLnByb3ZpZGVycyxuLGBSb3V0ZTogJHtpLnBhdGh9YCkpLGkuX2luamVjdG9yPz9ufWZ1bmN0aW9uICR0KGkpe3JldHVybiBpLm91dGxldHx8d31mdW5jdGlvbiBPaChpLG4pe2xldCB0PWkuZmlsdGVyKGU9PiR0KGUpPT09bik7cmV0dXJuIHQucHVzaCguLi5pLmZpbHRlcihlPT4kdChlKSE9PW4pKSx0fWZ1bmN0aW9uIGJpKGkpe2lmKCFpKXJldHVybiBudWxsO2lmKGkucm91dGVDb25maWc/Ll9pbmplY3RvcilyZXR1cm4gaS5yb3V0ZUNvbmZpZy5faW5qZWN0b3I7Zm9yKGxldCBuPWkucGFyZW50O247bj1uLnBhcmVudCl7bGV0IHQ9bi5yb3V0ZUNvbmZpZztpZih0Py5fbG9hZGVkSW5qZWN0b3IpcmV0dXJuIHQuX2xvYWRlZEluamVjdG9yO2lmKHQ/Ll9pbmplY3RvcilyZXR1cm4gdC5faW5qZWN0b3J9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcmEoaSxuKXtpZihpPT09bi52YWx1ZSlyZXR1cm4gbjtmb3IobGV0IHQgb2Ygbi5jaGlsZHJlbil7bGV0IGU9cmEoaSx0KTtpZihlKXJldHVybiBlfXJldHVybiBudWxsfWZ1bmN0aW9uIG9hKGksbil7aWYoaT09PW4udmFsdWUpcmV0dXJuW25dO2ZvcihsZXQgdCBvZiBuLmNoaWxkcmVuKXtsZXQgZT1vYShpLHQpO2lmKGUubGVuZ3RoKXJldHVybiBlLnVuc2hpZnQobiksZX1yZXR1cm5bXX1mdW5jdGlvbiBjaShpKXtsZXQgbj17fTtyZXR1cm4gaSYmaS5jaGlsZHJlbi5mb3JFYWNoKHQ9Pm5bdC52YWx1ZS5vdXRsZXRdPXQpLG59ZnVuY3Rpb24gdGMoaSl7bGV0IG49a2goaSksdD1uZXcgRXQoW25ldyBwZSgiIix7fSldKSxlPW5ldyBFdCh7fSkscj1uZXcgRXQoe30pLG89bmV3IEV0KHt9KSxhPW5ldyBFdCgiIikscz1uZXcgcmUodCxlLG8sYSxyLHcsaSxuLnJvb3QpO3JldHVybiBzLnNuYXBzaG90PW4ucm9vdCxuZXcgcm4obmV3IE50KHMsW10pLG4pfWZ1bmN0aW9uIGtoKGkpe2xldCBuPXt9LHQ9e30sZT17fSxvPW5ldyBWZShbXSxuLGUsIiIsdCx3LGksbnVsbCx7fSk7cmV0dXJuIG5ldyBvbigiIixuZXcgTnQobyxbXSkpfWZ1bmN0aW9uIHlyKGksbix0PSJlbXB0eU9ubHkiKXtsZXQgZSx7cm91dGVDb25maWc6cn09aTtyZXR1cm4gbiE9PW51bGwmJih0PT09ImFsd2F5cyJ8fHI/LnBhdGg9PT0iInx8IW4uY29tcG9uZW50JiYhbi5yb3V0ZUNvbmZpZz8ubG9hZENvbXBvbmVudCk/ZT17cGFyYW1zOmgoaCh7fSxuLnBhcmFtcyksaS5wYXJhbXMpLGRhdGE6aChoKHt9LG4uZGF0YSksaS5kYXRhKSxyZXNvbHZlOmgoaChoKGgoe30saS5kYXRhKSxuLmRhdGEpLHI/LmRhdGEpLGkuX3Jlc29sdmVkRGF0YSl9OmU9e3BhcmFtczpoKHt9LGkucGFyYW1zKSxkYXRhOmgoe30saS5kYXRhKSxyZXNvbHZlOmgoaCh7fSxpLmRhdGEpLGkuX3Jlc29sdmVkRGF0YT8/e30pfSxyJiZpYyhyKSYmKGUucmVzb2x2ZVtjbl09ci50aXRsZSksZX1mdW5jdGlvbiBtYShpLG4pe24udmFsdWUuX3JvdXRlclN0YXRlPWksbi5jaGlsZHJlbi5mb3JFYWNoKHQ9Pm1hKGksdCkpfWZ1bmN0aW9uIGVjKGkpe2xldCBuPWkuY2hpbGRyZW4ubGVuZ3RoPjA/YCB7ICR7aS5jaGlsZHJlbi5tYXAoZWMpLmpvaW4oIiwgIil9IH0gYDoiIjtyZXR1cm5gJHtpLnZhbHVlfSR7bn1gfWZ1bmN0aW9uIFhvKGkpe2lmKGkuc25hcHNob3Qpe2xldCBuPWkuc25hcHNob3QsdD1pLl9mdXR1cmVTbmFwc2hvdDtpLnNuYXBzaG90PXQsWHQobi5xdWVyeVBhcmFtcyx0LnF1ZXJ5UGFyYW1zKXx8aS5xdWVyeVBhcmFtc1N1YmplY3QubmV4dCh0LnF1ZXJ5UGFyYW1zKSxuLmZyYWdtZW50IT09dC5mcmFnbWVudCYmaS5mcmFnbWVudFN1YmplY3QubmV4dCh0LmZyYWdtZW50KSxYdChuLnBhcmFtcyx0LnBhcmFtcyl8fGkucGFyYW1zU3ViamVjdC5uZXh0KHQucGFyYW1zKSxvaChuLnVybCx0LnVybCl8fGkudXJsU3ViamVjdC5uZXh0KHQudXJsKSxYdChuLmRhdGEsdC5kYXRhKXx8aS5kYXRhU3ViamVjdC5uZXh0KHQuZGF0YSl9ZWxzZSBpLnNuYXBzaG90PWkuX2Z1dHVyZVNuYXBzaG90LGkuZGF0YVN1YmplY3QubmV4dChpLl9mdXR1cmVTbmFwc2hvdC5kYXRhKX1mdW5jdGlvbiBhYShpLG4pe2xldCB0PVh0KGkucGFyYW1zLG4ucGFyYW1zKSYmY2goaS51cmwsbi51cmwpLGU9IWkucGFyZW50IT0hbi5wYXJlbnQ7cmV0dXJuIHQmJiFlJiYoIWkucGFyZW50fHxhYShpLnBhcmVudCxuLnBhcmVudCkpfWZ1bmN0aW9uIGljKGkpe3JldHVybiB0eXBlb2YgaS50aXRsZT09InN0cmluZyJ8fGkudGl0bGU9PT1udWxsfWZ1bmN0aW9uIHZhKGkpe2xldCBuPWkuY2hpbGRyZW4mJmkuY2hpbGRyZW4ubWFwKHZhKSx0PW4/JChoKHt9LGkpLHtjaGlsZHJlbjpufSk6aCh7fSxpKTtyZXR1cm4hdC5jb21wb25lbnQmJiF0LmxvYWRDb21wb25lbnQmJihufHx0LmxvYWRDaGlsZHJlbikmJnQub3V0bGV0JiZ0Lm91dGxldCE9PXcmJih0LmNvbXBvbmVudD1nYSksdH1mdW5jdGlvbiBUaChpLG4sdCl7bGV0IGU9YW4oaSxuLl9yb290LHQ/dC5fcm9vdDp2b2lkIDApO3JldHVybiBuZXcgcm4oZSxuKX1mdW5jdGlvbiBhbihpLG4sdCl7aWYodCYmaS5zaG91bGRSZXVzZVJvdXRlKG4udmFsdWUsdC52YWx1ZS5zbmFwc2hvdCkpe2xldCBlPXQudmFsdWU7ZS5fZnV0dXJlU25hcHNob3Q9bi52YWx1ZTtsZXQgcj1GaChpLG4sdCk7cmV0dXJuIG5ldyBOdChlLHIpfWVsc2V7aWYoaS5zaG91bGRBdHRhY2gobi52YWx1ZSkpe2xldCBvPWkucmV0cmlldmUobi52YWx1ZSk7aWYobyE9PW51bGwpe2xldCBhPW8ucm91dGU7cmV0dXJuIGEudmFsdWUuX2Z1dHVyZVNuYXBzaG90PW4udmFsdWUsYS5jaGlsZHJlbj1uLmNoaWxkcmVuLm1hcChzPT5hbihpLHMpKSxhfX1sZXQgZT1OaChuLnZhbHVlKSxyPW4uY2hpbGRyZW4ubWFwKG89PmFuKGksbykpO3JldHVybiBuZXcgTnQoZSxyKX19ZnVuY3Rpb24gRmgoaSxuLHQpe3JldHVybiBuLmNoaWxkcmVuLm1hcChlPT57Zm9yKGxldCByIG9mIHQuY2hpbGRyZW4paWYoaS5zaG91bGRSZXVzZVJvdXRlKGUudmFsdWUsci52YWx1ZS5zbmFwc2hvdCkpcmV0dXJuIGFuKGksZSxyKTtyZXR1cm4gYW4oaSxlKX0pfWZ1bmN0aW9uIE5oKGkpe3JldHVybiBuZXcgcmUobmV3IEV0KGkudXJsKSxuZXcgRXQoaS5wYXJhbXMpLG5ldyBFdChpLnF1ZXJ5UGFyYW1zKSxuZXcgRXQoaS5mcmFnbWVudCksbmV3IEV0KGkuZGF0YSksaS5vdXRsZXQsaS5jb21wb25lbnQsaSl9ZnVuY3Rpb24gQ3IoaSxuKXtsZXR7cmVkaXJlY3RUbzp0LG5hdmlnYXRpb25CZWhhdmlvck9wdGlvbnM6ZX09dmUobik/e3JlZGlyZWN0VG86bixuYXZpZ2F0aW9uQmVoYXZpb3JPcHRpb25zOnZvaWQgMH06bixyPW9jKCExLEN0LlJlZGlyZWN0KTtyZXR1cm4gci51cmw9dCxyLm5hdmlnYXRpb25CZWhhdmlvck9wdGlvbnM9ZSxyfWZ1bmN0aW9uIG9jKGksbil7bGV0IHQ9bmV3IEVycm9yKGBOYXZpZ2F0aW9uQ2FuY2VsaW5nRXJyb3I6ICR7aXx8IiJ9YCk7cmV0dXJuIHRbcmNdPSEwLHQuY2FuY2VsbGF0aW9uQ29kZT1uLHR9ZnVuY3Rpb24gUGgoaSl7cmV0dXJuIGFjKGkpJiZ2ZShpLnVybCl9ZnVuY3Rpb24gYWMoaSl7cmV0dXJuISFpJiZpW3JjXX1mdW5jdGlvbiBWaChpLG4sdCl7bGV0IGU9aS5fcm9vdCxyPW4/bi5fcm9vdDpudWxsO3JldHVybiBYaShlLHIsdCxbZS52YWx1ZV0pfWZ1bmN0aW9uIGpoKGkpe2xldCBuPWkucm91dGVDb25maWc/aS5yb3V0ZUNvbmZpZy5jYW5BY3RpdmF0ZUNoaWxkOm51bGw7cmV0dXJuIW58fG4ubGVuZ3RoPT09MD9udWxsOntub2RlOmksZ3VhcmRzOm59fWZ1bmN0aW9uIHlpKGksbil7bGV0IHQ9U3ltYm9sKCksZT1uLmdldChpLHQpO3JldHVybiBlPT09dD90eXBlb2YgaT09ImZ1bmN0aW9uIiYmIVlzKGkpP2k6bi5nZXQoaSk6ZX1mdW5jdGlvbiBYaShpLG4sdCxlLHI9e2NhbkRlYWN0aXZhdGVDaGVja3M6W10sY2FuQWN0aXZhdGVDaGVja3M6W119KXtsZXQgbz1jaShuKTtyZXR1cm4gaS5jaGlsZHJlbi5mb3JFYWNoKGE9PntCaChhLG9bYS52YWx1ZS5vdXRsZXRdLHQsZS5jb25jYXQoW2EudmFsdWVdKSxyKSxkZWxldGUgb1thLnZhbHVlLm91dGxldF19KSxPYmplY3QuZW50cmllcyhvKS5mb3JFYWNoKChbYSxzXSk9PkppKHMsdC5nZXRDb250ZXh0KGEpLHIpKSxyfWZ1bmN0aW9uIEJoKGksbix0LGUscj17Y2FuRGVhY3RpdmF0ZUNoZWNrczpbXSxjYW5BY3RpdmF0ZUNoZWNrczpbXX0pe2xldCBvPWkudmFsdWUsYT1uP24udmFsdWU6bnVsbCxzPXQ/dC5nZXRDb250ZXh0KGkudmFsdWUub3V0bGV0KTpudWxsO2lmKGEmJm8ucm91dGVDb25maWc9PT1hLnJvdXRlQ29uZmlnKXtsZXQgYz16aChhLG8sby5yb3V0ZUNvbmZpZy5ydW5HdWFyZHNBbmRSZXNvbHZlcnMpO2M/ci5jYW5BY3RpdmF0ZUNoZWNrcy5wdXNoKG5ldyB4cihlKSk6KG8uZGF0YT1hLmRhdGEsby5fcmVzb2x2ZWREYXRhPWEuX3Jlc29sdmVkRGF0YSksby5jb21wb25lbnQ/WGkoaSxuLHM/cy5jaGlsZHJlbjpudWxsLGUscik6WGkoaSxuLHQsZSxyKSxjJiZzJiZzLm91dGxldCYmcy5vdXRsZXQuaXNBY3RpdmF0ZWQmJnIuY2FuRGVhY3RpdmF0ZUNoZWNrcy5wdXNoKG5ldyBoaShzLm91dGxldC5jb21wb25lbnQsYSkpfWVsc2UgYSYmSmkobixzLHIpLHIuY2FuQWN0aXZhdGVDaGVja3MucHVzaChuZXcgeHIoZSkpLG8uY29tcG9uZW50P1hpKGksbnVsbCxzP3MuY2hpbGRyZW46bnVsbCxlLHIpOlhpKGksbnVsbCx0LGUscik7cmV0dXJuIHJ9ZnVuY3Rpb24gemgoaSxuLHQpe2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiB0KGksbik7c3dpdGNoKHQpe2Nhc2UicGF0aFBhcmFtc0NoYW5nZSI6cmV0dXJuIUxlKGkudXJsLG4udXJsKTtjYXNlInBhdGhQYXJhbXNPclF1ZXJ5UGFyYW1zQ2hhbmdlIjpyZXR1cm4hTGUoaS51cmwsbi51cmwpfHwhWHQoaS5xdWVyeVBhcmFtcyxuLnF1ZXJ5UGFyYW1zKTtjYXNlImFsd2F5cyI6cmV0dXJuITA7Y2FzZSJwYXJhbXNPclF1ZXJ5UGFyYW1zQ2hhbmdlIjpyZXR1cm4hYWEoaSxuKXx8IVh0KGkucXVlcnlQYXJhbXMsbi5xdWVyeVBhcmFtcyk7Y2FzZSJwYXJhbXNDaGFuZ2UiOmRlZmF1bHQ6cmV0dXJuIWFhKGksbil9fWZ1bmN0aW9uIEppKGksbix0KXtsZXQgZT1jaShpKSxyPWkudmFsdWU7T2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoW28sYV0pPT57ci5jb21wb25lbnQ/bj9KaShhLG4uY2hpbGRyZW4uZ2V0Q29udGV4dChvKSx0KTpKaShhLG51bGwsdCk6SmkoYSxuLHQpfSksci5jb21wb25lbnQ/biYmbi5vdXRsZXQmJm4ub3V0bGV0LmlzQWN0aXZhdGVkP3QuY2FuRGVhY3RpdmF0ZUNoZWNrcy5wdXNoKG5ldyBoaShuLm91dGxldC5jb21wb25lbnQscikpOnQuY2FuRGVhY3RpdmF0ZUNoZWNrcy5wdXNoKG5ldyBoaShudWxsLHIpKTp0LmNhbkRlYWN0aXZhdGVDaGVja3MucHVzaChuZXcgaGkobnVsbCxyKSl9ZnVuY3Rpb24gdW4oaSl7cmV0dXJuIHR5cGVvZiBpPT0iZnVuY3Rpb24ifWZ1bmN0aW9uIFVoKGkpe3JldHVybiB0eXBlb2YgaT09ImJvb2xlYW4ifWZ1bmN0aW9uIEhoKGkpe3JldHVybiBpJiZ1bihpLmNhbkxvYWQpfWZ1bmN0aW9uICRoKGkpe3JldHVybiBpJiZ1bihpLmNhbkFjdGl2YXRlKX1mdW5jdGlvbiBXaChpKXtyZXR1cm4gaSYmdW4oaS5jYW5BY3RpdmF0ZUNoaWxkKX1mdW5jdGlvbiBHaChpKXtyZXR1cm4gaSYmdW4oaS5jYW5EZWFjdGl2YXRlKX1mdW5jdGlvbiBxaChpKXtyZXR1cm4gaSYmdW4oaS5jYW5NYXRjaCl9ZnVuY3Rpb24gc2MoaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiB6c3x8aT8ubmFtZT09PSJFbXB0eUVycm9yIn1mdW5jdGlvbiBfaSgpe3JldHVybiBzdChpPT5LZShpLm1hcChuPT5uLnBpcGUoeXQoMSksSWUoaXIpKSkpLnBpcGUoYihuPT57Zm9yKGxldCB0IG9mIG4paWYodCE9PSEwKXtpZih0PT09aXIpcmV0dXJuIGlyO2lmKHQ9PT0hMXx8WWgodCkpcmV0dXJuIHR9cmV0dXJuITB9KSxLKG49Pm4hPT1pcikseXQoMSkpKX1mdW5jdGlvbiBZaChpKXtyZXR1cm4gdmUoaSl8fGkgaW5zdGFuY2VvZiB2aX1mdW5jdGlvbiBLaChpLG4pe3JldHVybiBTdCh0PT57bGV0e3RhcmdldFNuYXBzaG90OmUsY3VycmVudFNuYXBzaG90OnIsZ3VhcmRzOntjYW5BY3RpdmF0ZUNoZWNrczpvLGNhbkRlYWN0aXZhdGVDaGVja3M6YX19PXQ7cmV0dXJuIGEubGVuZ3RoPT09MCYmby5sZW5ndGg9PT0wP2coJChoKHt9LHQpLHtndWFyZHNSZXN1bHQ6ITB9KSk6WmgoYSxlLHIsaSkucGlwZShTdChzPT5zJiZVaChzKT9YaChlLG8saSxuKTpnKHMpKSxiKHM9PiQoaCh7fSx0KSx7Z3VhcmRzUmVzdWx0OnN9KSkpfSl9ZnVuY3Rpb24gWmgoaSxuLHQsZSl7cmV0dXJuIHB0KGkpLnBpcGUoU3Qocj0+aW0oci5jb21wb25lbnQsci5yb3V0ZSx0LG4sZSkpLGhlKHI9PnIhPT0hMCwhMCkpfWZ1bmN0aW9uIFhoKGksbix0LGUpe3JldHVybiBwdChuKS5waXBlKGVlKHI9PkFlKEpoKHIucm91dGUucGFyZW50LGUpLFFoKHIucm91dGUsZSksZW0oaSxyLnBhdGgsdCksdG0oaSxyLnJvdXRlLHQpKSksaGUocj0+ciE9PSEwLCEwKSl9ZnVuY3Rpb24gUWgoaSxuKXtyZXR1cm4gaSE9PW51bGwmJm4mJm4obmV3IGdyKGkpKSxnKCEwKX1mdW5jdGlvbiBKaChpLG4pe3JldHVybiBpIT09bnVsbCYmbiYmbihuZXcgZnIoaSkpLGcoITApfWZ1bmN0aW9uIHRtKGksbix0KXtsZXQgZT1uLnJvdXRlQ29uZmlnP24ucm91dGVDb25maWcuY2FuQWN0aXZhdGU6bnVsbDtpZighZXx8ZS5sZW5ndGg9PT0wKXJldHVybiBnKCEwKTtsZXQgcj1lLm1hcChvPT5NZSgoKT0+e2xldCBhPWJpKG4pPz90LHM9eWkobyxhKSxjPSRoKHMpP3MuY2FuQWN0aXZhdGUobixpKTpWdChhLCgpPT5zKG4saSkpO3JldHVybiBvZShjKS5waXBlKGhlKCkpfSkpO3JldHVybiBnKHIpLnBpcGUoX2koKSl9ZnVuY3Rpb24gZW0oaSxuLHQpe2xldCBlPW5bbi5sZW5ndGgtMV0sbz1uLnNsaWNlKDAsbi5sZW5ndGgtMSkucmV2ZXJzZSgpLm1hcChhPT5qaChhKSkuZmlsdGVyKGE9PmEhPT1udWxsKS5tYXAoYT0+TWUoKCk9PntsZXQgcz1hLmd1YXJkcy5tYXAoYz0+e2xldCBkPWJpKGEubm9kZSk/P3QsdT15aShjLGQpLHg9V2godSk/dS5jYW5BY3RpdmF0ZUNoaWxkKGUsaSk6VnQoZCwoKT0+dShlLGkpKTtyZXR1cm4gb2UoeCkucGlwZShoZSgpKX0pO3JldHVybiBnKHMpLnBpcGUoX2koKSl9KSk7cmV0dXJuIGcobykucGlwZShfaSgpKX1mdW5jdGlvbiBpbShpLG4sdCxlLHIpe2xldCBvPW4mJm4ucm91dGVDb25maWc/bi5yb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlOm51bGw7aWYoIW98fG8ubGVuZ3RoPT09MClyZXR1cm4gZyghMCk7bGV0IGE9by5tYXAocz0+e2xldCBjPWJpKG4pPz9yLGQ9eWkocyxjKSx1PUdoKGQpP2QuY2FuRGVhY3RpdmF0ZShpLG4sdCxlKTpWdChjLCgpPT5kKGksbix0LGUpKTtyZXR1cm4gb2UodSkucGlwZShoZSgpKX0pO3JldHVybiBnKGEpLnBpcGUoX2koKSl9ZnVuY3Rpb24gbm0oaSxuLHQsZSl7bGV0IHI9bi5jYW5Mb2FkO2lmKHI9PT12b2lkIDB8fHIubGVuZ3RoPT09MClyZXR1cm4gZyghMCk7bGV0IG89ci5tYXAoYT0+e2xldCBzPXlpKGEsaSksYz1IaChzKT9zLmNhbkxvYWQobix0KTpWdChpLCgpPT5zKG4sdCkpO3JldHVybiBvZShjKX0pO3JldHVybiBnKG8pLnBpcGUoX2koKSxsYyhlKSl9ZnVuY3Rpb24gbGMoaSl7cmV0dXJuIEJzKFcobj0+e2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpdGhyb3cgQ3IoaSxuKX0pLGIobj0+bj09PSEwKSl9ZnVuY3Rpb24gcm0oaSxuLHQsZSl7bGV0IHI9bi5jYW5NYXRjaDtpZighcnx8ci5sZW5ndGg9PT0wKXJldHVybiBnKCEwKTtsZXQgbz1yLm1hcChhPT57bGV0IHM9eWkoYSxpKSxjPXFoKHMpP3MuY2FuTWF0Y2gobix0KTpWdChpLCgpPT5zKG4sdCkpO3JldHVybiBvZShjKX0pO3JldHVybiBnKG8pLnBpcGUoX2koKSxsYyhlKSl9ZnVuY3Rpb24gbGkoaSl7cmV0dXJuIFJlKG5ldyBzbihpKSl9ZnVuY3Rpb24gb20oaSl7cmV0dXJuIFJlKG5ldyBRKDRlMywhMSkpfWZ1bmN0aW9uIGFtKGkpe3JldHVybiBSZShvYyghMSxDdC5HdWFyZFJlamVjdGVkKSl9ZnVuY3Rpb24gc20oaSxuLHQpe2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyZXR1cm4gZyhpKTtsZXQgZT1pLHtxdWVyeVBhcmFtczpyLGZyYWdtZW50Om8scm91dGVDb25maWc6YSx1cmw6cyxvdXRsZXQ6YyxwYXJhbXM6ZCxkYXRhOnUsdGl0bGU6eH09bjtyZXR1cm4gb2UoVnQodCwoKT0+ZSh7cGFyYW1zOmQsZGF0YTp1LHF1ZXJ5UGFyYW1zOnIsZnJhZ21lbnQ6byxyb3V0ZUNvbmZpZzphLHVybDpzLG91dGxldDpjLHRpdGxlOnh9KSkpfWZ1bmN0aW9uIGxtKGksbix0LGUscil7bGV0IG89Y2MoaSxuLHQpO3JldHVybiBvLm1hdGNoZWQ/KGU9SWgobixlKSxybShlLG4sdCxyKS5waXBlKGIoYT0+YT09PSEwP286aCh7fSxkYSkpKSk6ZyhvKX1mdW5jdGlvbiBjYyhpLG4sdCl7aWYobi5wYXRoPT09IioqIilyZXR1cm4gY20odCk7aWYobi5wYXRoPT09IiIpcmV0dXJuIG4ucGF0aE1hdGNoPT09ImZ1bGwiJiYoaS5oYXNDaGlsZHJlbigpfHx0Lmxlbmd0aD4wKT9oKHt9LGRhKTp7bWF0Y2hlZDohMCxjb25zdW1lZFNlZ21lbnRzOltdLHJlbWFpbmluZ1NlZ21lbnRzOnQscGFyYW1ldGVyczp7fSxwb3NpdGlvbmFsUGFyYW1TZWdtZW50czp7fX07bGV0IHI9KG4ubWF0Y2hlcnx8VmwpKHQsaSxuKTtpZighcilyZXR1cm4gaCh7fSxkYSk7bGV0IG89e307T2JqZWN0LmVudHJpZXMoci5wb3NQYXJhbXM/P3t9KS5mb3JFYWNoKChbcyxjXSk9PntvW3NdPWMucGF0aH0pO2xldCBhPXIuY29uc3VtZWQubGVuZ3RoPjA/aChoKHt9LG8pLHIuY29uc3VtZWRbci5jb25zdW1lZC5sZW5ndGgtMV0ucGFyYW1ldGVycyk6bztyZXR1cm57bWF0Y2hlZDohMCxjb25zdW1lZFNlZ21lbnRzOnIuY29uc3VtZWQscmVtYWluaW5nU2VnbWVudHM6dC5zbGljZShyLmNvbnN1bWVkLmxlbmd0aCkscGFyYW1ldGVyczphLHBvc2l0aW9uYWxQYXJhbVNlZ21lbnRzOnIucG9zUGFyYW1zPz97fX19ZnVuY3Rpb24gY20oaSl7cmV0dXJue21hdGNoZWQ6ITAscGFyYW1ldGVyczppLmxlbmd0aD4wP0JsKGkpLnBhcmFtZXRlcnM6e30sY29uc3VtZWRTZWdtZW50czppLHJlbWFpbmluZ1NlZ21lbnRzOltdLHBvc2l0aW9uYWxQYXJhbVNlZ21lbnRzOnt9fX1mdW5jdGlvbiBObChpLG4sdCxlKXtyZXR1cm4gdC5sZW5ndGg+MCYmaG0oaSx0LGUpP3tzZWdtZW50R3JvdXA6bmV3IGsobix1bShlLG5ldyBrKHQsaS5jaGlsZHJlbikpKSxzbGljZWRTZWdtZW50czpbXX06dC5sZW5ndGg9PT0wJiZtbShpLHQsZSk/e3NlZ21lbnRHcm91cDpuZXcgayhpLnNlZ21lbnRzLGRtKGksdCxlLGkuY2hpbGRyZW4pKSxzbGljZWRTZWdtZW50czp0fTp7c2VnbWVudEdyb3VwOm5ldyBrKGkuc2VnbWVudHMsaS5jaGlsZHJlbiksc2xpY2VkU2VnbWVudHM6dH19ZnVuY3Rpb24gZG0oaSxuLHQsZSl7bGV0IHI9e307Zm9yKGxldCBvIG9mIHQpaWYoRXIoaSxuLG8pJiYhZVskdChvKV0pe2xldCBhPW5ldyBrKFtdLHt9KTtyWyR0KG8pXT1hfXJldHVybiBoKGgoe30sZSkscil9ZnVuY3Rpb24gdW0oaSxuKXtsZXQgdD17fTt0W3ddPW47Zm9yKGxldCBlIG9mIGkpaWYoZS5wYXRoPT09IiImJiR0KGUpIT09dyl7bGV0IHI9bmV3IGsoW10se30pO3RbJHQoZSldPXJ9cmV0dXJuIHR9ZnVuY3Rpb24gaG0oaSxuLHQpe3JldHVybiB0LnNvbWUoZT0+RXIoaSxuLGUpJiYkdChlKSE9PXcpfWZ1bmN0aW9uIG1tKGksbix0KXtyZXR1cm4gdC5zb21lKGU9PkVyKGksbixlKSl9ZnVuY3Rpb24gRXIoaSxuLHQpe3JldHVybihpLmhhc0NoaWxkcmVuKCl8fG4ubGVuZ3RoPjApJiZ0LnBhdGhNYXRjaD09PSJmdWxsIj8hMTp0LnBhdGg9PT0iIn1mdW5jdGlvbiBmbShpLG4sdCl7cmV0dXJuIG4ubGVuZ3RoPT09MCYmIWkuY2hpbGRyZW5bdF19ZnVuY3Rpb24gcG0oaSxuLHQsZSxyLG8sYT0iZW1wdHlPbmx5Iil7cmV0dXJuIG5ldyBoYShpLG4sdCxlLHIsYSxvKS5yZWNvZ25pemUoKX1mdW5jdGlvbiB2bShpKXtpLnNvcnQoKG4sdCk9Pm4udmFsdWUub3V0bGV0PT09dz8tMTp0LnZhbHVlLm91dGxldD09PXc/MTpuLnZhbHVlLm91dGxldC5sb2NhbGVDb21wYXJlKHQudmFsdWUub3V0bGV0KSl9ZnVuY3Rpb24gX20oaSl7bGV0IG49aS52YWx1ZS5yb3V0ZUNvbmZpZztyZXR1cm4gbiYmbi5wYXRoPT09IiJ9ZnVuY3Rpb24gZGMoaSl7bGV0IG49W10sdD1uZXcgU2V0O2ZvcihsZXQgZSBvZiBpKXtpZighX20oZSkpe24ucHVzaChlKTtjb250aW51ZX1sZXQgcj1uLmZpbmQobz0+ZS52YWx1ZS5yb3V0ZUNvbmZpZz09PW8udmFsdWUucm91dGVDb25maWcpO3IhPT12b2lkIDA/KHIuY2hpbGRyZW4ucHVzaCguLi5lLmNoaWxkcmVuKSx0LmFkZChyKSk6bi5wdXNoKGUpfWZvcihsZXQgZSBvZiB0KXtsZXQgcj1kYyhlLmNoaWxkcmVuKTtuLnB1c2gobmV3IE50KGUudmFsdWUscikpfXJldHVybiBuLmZpbHRlcihlPT4hdC5oYXMoZSkpfWZ1bmN0aW9uIFBsKGkpe3JldHVybiBpLmRhdGF8fHt9fWZ1bmN0aW9uIExsKGkpe3JldHVybiBpLnJlc29sdmV8fHt9fWZ1bmN0aW9uIGJtKGksbix0LGUscixvKXtyZXR1cm4gU3QoYT0+cG0oaSxuLHQsZSxhLmV4dHJhY3RlZFVybCxyLG8pLnBpcGUoYigoe3N0YXRlOnMsdHJlZTpjfSk9PiQoaCh7fSxhKSx7dGFyZ2V0U25hcHNob3Q6cyx1cmxBZnRlclJlZGlyZWN0czpjfSkpKSl9ZnVuY3Rpb24geW0oaSxuKXtyZXR1cm4gU3QodD0+e2xldHt0YXJnZXRTbmFwc2hvdDplLGd1YXJkczp7Y2FuQWN0aXZhdGVDaGVja3M6cn19PXQ7aWYoIXIubGVuZ3RoKXJldHVybiBnKHQpO2xldCBvPW5ldyBTZXQoci5tYXAoYz0+Yy5yb3V0ZSkpLGE9bmV3IFNldDtmb3IobGV0IGMgb2YgbylpZighYS5oYXMoYykpZm9yKGxldCBkIG9mIHVjKGMpKWEuYWRkKGQpO2xldCBzPTA7cmV0dXJuIHB0KGEpLnBpcGUoZWUoYz0+by5oYXMoYyk/Q20oYyxlLGksbik6KGMuZGF0YT15cihjLGMucGFyZW50LGkpLnJlc29sdmUsZyh2b2lkIDApKSksVygoKT0+cysrKSxUbygxKSxTdChjPT5zPT09YS5zaXplP2codCk6VXQpKX0pfWZ1bmN0aW9uIHVjKGkpe2xldCBuPWkuY2hpbGRyZW4ubWFwKHQ9PnVjKHQpKS5mbGF0KCk7cmV0dXJuW2ksLi4ubl19ZnVuY3Rpb24gQ20oaSxuLHQsZSl7bGV0IHI9aS5yb3V0ZUNvbmZpZyxvPWkuX3Jlc29sdmU7cmV0dXJuIHI/LnRpdGxlIT09dm9pZCAwJiYhaWMocikmJihvW2NuXT1yLnRpdGxlKSxNZSgoKT0+KGkuZGF0YT15cihpLGkucGFyZW50LHQpLnJlc29sdmUseG0obyxpLG4sZSkucGlwZShiKGE9PihpLl9yZXNvbHZlZERhdGE9YSxpLmRhdGE9aChoKHt9LGkuZGF0YSksYSksbnVsbCkpKSkpfWZ1bmN0aW9uIHhtKGksbix0LGUpe2xldCByPXRhKGkpO2lmKHIubGVuZ3RoPT09MClyZXR1cm4gZyh7fSk7bGV0IG89e307cmV0dXJuIHB0KHIpLnBpcGUoU3QoYT0+d20oaVthXSxuLHQsZSkucGlwZShoZSgpLFcocz0+e2lmKHMgaW5zdGFuY2VvZiB2aSl0aHJvdyBDcihuZXcgZ2Uscyk7b1thXT1zfSkpKSxUbygxKSxiKCgpPT5vKSxhdChhPT5zYyhhKT9VdDpSZShhKSkpfWZ1bmN0aW9uIHdtKGksbix0LGUpe2xldCByPWJpKG4pPz9lLG89eWkoaSxyKSxhPW8ucmVzb2x2ZT9vLnJlc29sdmUobix0KTpWdChyLCgpPT5vKG4sdCkpO3JldHVybiBvZShhKX1mdW5jdGlvbiBRbyhpKXtyZXR1cm4gc3Qobj0+e2xldCB0PWkobik7cmV0dXJuIHQ/cHQodCkucGlwZShiKCgpPT5uKSk6ZyhuKX0pfWZ1bmN0aW9uIG1jKGksbix0LGUpe3JldHVybiBvZShWdCh0LCgpPT5pLmxvYWRDaGlsZHJlbigpKSkucGlwZShiKGZjKSxzdChwYyksU3Qocj0+ciBpbnN0YW5jZW9mIG5sfHxBcnJheS5pc0FycmF5KHIpP2cocik6cHQobi5jb21waWxlTW9kdWxlQXN5bmMocikpKSxiKHI9PntlJiZlKGkpO2xldCBvLGEscz0hMTtyZXR1cm4gQXJyYXkuaXNBcnJheShyKT8oYT1yLHM9ITApOihvPXIuY3JlYXRlKHQpLmluamVjdG9yLGE9by5nZXQoQ2ksW10se29wdGlvbmFsOiEwLHNlbGY6ITB9KS5mbGF0KCkpLHtyb3V0ZXM6YS5tYXAodmEpLGluamVjdG9yOm99fSkpfWZ1bmN0aW9uIEVtKGkpe3JldHVybiBpJiZ0eXBlb2YgaT09Im9iamVjdCImJiJkZWZhdWx0ImluIGl9ZnVuY3Rpb24gZmMoaSl7cmV0dXJuIEVtKGkpP2kuZGVmYXVsdDppfWZ1bmN0aW9uIHBjKGkpe3JldHVybiBnKGkpfWZ1bmN0aW9uIGdjKGksbix0KXtsZXQgZT1pLmdldCh5YSkscj1pLmdldChPKTtpZighci5zdGFydFZpZXdUcmFuc2l0aW9ufHxlLnNraXBOZXh0VHJhbnNpdGlvbilyZXR1cm4gZS5za2lwTmV4dFRyYW5zaXRpb249ITEsbmV3IFByb21pc2UoZD0+c2V0VGltZW91dChkKSk7bGV0IG8sYT1uZXcgUHJvbWlzZShkPT57bz1kfSkscz1yLnN0YXJ0Vmlld1RyYW5zaXRpb24oKCk9PihvKCksRG0oaSkpKTtzLnJlYWR5LmNhdGNoKGQ9Pnt9KTtsZXR7b25WaWV3VHJhbnNpdGlvbkNyZWF0ZWQ6Y309ZTtyZXR1cm4gYyYmVnQoaSwoKT0+Yyh7dHJhbnNpdGlvbjpzLGZyb206bix0bzp0fSkpLGF9ZnVuY3Rpb24gRG0oaSl7cmV0dXJuIG5ldyBQcm9taXNlKG49PntPdCh7cmVhZDooKT0+c2V0VGltZW91dChuKX0se2luamVjdG9yOml9KX0pfWZ1bmN0aW9uIFJtKGkpe3JldHVybiBpIT09dWl9ZnVuY3Rpb24gQXIoaSxuKXtpLmV2ZW50cy5waXBlKEsodD0+dCBpbnN0YW5jZW9mIGp0fHx0IGluc3RhbmNlb2YgUXR8fHQgaW5zdGFuY2VvZiBmaXx8dCBpbnN0YW5jZW9mIHRlKSxiKHQ9PnQgaW5zdGFuY2VvZiBqdHx8dCBpbnN0YW5jZW9mIHRlPzA6KHQgaW5zdGFuY2VvZiBRdD90LmNvZGU9PT1DdC5SZWRpcmVjdHx8dC5jb2RlPT09Q3QuU3VwZXJzZWRlZEJ5TmV3TmF2aWdhdGlvbjohMSk/MjoxKSxLKHQ9PnQhPT0yKSx5dCgxKSkuc3Vic2NyaWJlKCgpPT57bigpfSl9ZnVuY3Rpb24ga20oaSl7Zm9yKGxldCBuPTA7bjxpLmxlbmd0aDtuKyspaWYoaVtuXT09bnVsbCl0aHJvdyBuZXcgUSg0MDA4LCExKX12YXIgdyxjbixKbyxhaCx6bCxKdCxrLHBlLEJlLGdlLHVoLHBoLGdoLF9oLHloLGlhLHNyLGRpLHVpLG90LFB0LF9lLGp0LEN0LG1pLFF0LHRlLGZpLGVuLGxyLGNyLGRyLHVyLGhyLG1yLGZyLHByLGdyLHZyLHBpLG5uLGdpLF9yLHplLGJyLE50LHJuLHJlLFZlLG9uLG5jLGZhLHNhLGRuLHBhLGdhLHZpLHJjLExoLGxhLHhyLGhpLGlyLHNuLGxuLGNhLGRhLHVhLGdtLGhhLF9hLGhjLGJlLENpLFNyLERyLFNtLGJhLHlhLENhLFJyLHZjLHdyLEFtLF9jLE1tLEltLE9tLGFlLHhhPV8oKCk9PntQZSgpO2YoKTtmKCk7bnQoKTtodCgpO0VsKCk7dz0icHJpbWFyeSIsY249U3ltYm9sKCJSb3V0ZVRpdGxlIiksSm89Y2xhc3N7cGFyYW1zO2NvbnN0cnVjdG9yKG4pe3RoaXMucGFyYW1zPW58fHt9fWhhcyhuKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMucGFyYW1zLG4pfWdldChuKXtpZih0aGlzLmhhcyhuKSl7bGV0IHQ9dGhpcy5wYXJhbXNbbl07cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dFswXTp0fXJldHVybiBudWxsfWdldEFsbChuKXtpZih0aGlzLmhhcyhuKSl7bGV0IHQ9dGhpcy5wYXJhbXNbbl07cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19cmV0dXJuW119Z2V0IGtleXMoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpfX07YWg9e2V4YWN0OlVsLHN1YnNldDpIbH0semw9e2V4YWN0OnNoLHN1YnNldDpsaCxpZ25vcmVkOigpPT4hMH07SnQ9Y2xhc3N7cm9vdDtxdWVyeVBhcmFtcztmcmFnbWVudDtfcXVlcnlQYXJhbU1hcDtjb25zdHJ1Y3RvcihuPW5ldyBrKFtdLHt9KSx0PXt9LGU9bnVsbCl7dGhpcy5yb290PW4sdGhpcy5xdWVyeVBhcmFtcz10LHRoaXMuZnJhZ21lbnQ9ZX1nZXQgcXVlcnlQYXJhbU1hcCgpe3JldHVybiB0aGlzLl9xdWVyeVBhcmFtTWFwPz89amUodGhpcy5xdWVyeVBhcmFtcyksdGhpcy5fcXVlcnlQYXJhbU1hcH10b1N0cmluZygpe3JldHVybiB1aC5zZXJpYWxpemUodGhpcyl9fSxrPWNsYXNze3NlZ21lbnRzO2NoaWxkcmVuO3BhcmVudD1udWxsO2NvbnN0cnVjdG9yKG4sdCl7dGhpcy5zZWdtZW50cz1uLHRoaXMuY2hpbGRyZW49dCxPYmplY3QudmFsdWVzKHQpLmZvckVhY2goZT0+ZS5wYXJlbnQ9dGhpcyl9aGFzQ2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5udW1iZXJPZkNoaWxkcmVuPjB9Z2V0IG51bWJlck9mQ2hpbGRyZW4oKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5jaGlsZHJlbikubGVuZ3RofXRvU3RyaW5nKCl7cmV0dXJuIHJyKHRoaXMpfX0scGU9Y2xhc3N7cGF0aDtwYXJhbWV0ZXJzO19wYXJhbWV0ZXJNYXA7Y29uc3RydWN0b3Iobix0KXt0aGlzLnBhdGg9bix0aGlzLnBhcmFtZXRlcnM9dH1nZXQgcGFyYW1ldGVyTWFwKCl7cmV0dXJuIHRoaXMuX3BhcmFtZXRlck1hcD8/PWplKHRoaXMucGFyYW1ldGVycyksdGhpcy5fcGFyYW1ldGVyTWFwfXRvU3RyaW5nKCl7cmV0dXJuIEdsKHRoaXMpfX07QmU9KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTooKT0+bmV3IGdlLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpLGdlPWNsYXNze3BhcnNlKG4pe2xldCB0PW5ldyBpYShuKTtyZXR1cm4gbmV3IEp0KHQucGFyc2VSb290U2VnbWVudCgpLHQucGFyc2VRdWVyeVBhcmFtcygpLHQucGFyc2VGcmFnbWVudCgpKX1zZXJpYWxpemUobil7bGV0IHQ9YC8ke1ppKG4ucm9vdCwhMCl9YCxlPWZoKG4ucXVlcnlQYXJhbXMpLHI9dHlwZW9mIG4uZnJhZ21lbnQ9PSJzdHJpbmciP2AjJHtoaChuLmZyYWdtZW50KX1gOiIiO3JldHVybmAke3R9JHtlfSR7cn1gfX0sdWg9bmV3IGdlO3BoPS9eW15cLygpPzsjXSsvO2doPS9eW15cLygpPzs9I10rLztfaD0vXltePT8mI10rLzt5aD0vXlteJiNdKy87aWE9Y2xhc3N7dXJsO3JlbWFpbmluZztjb25zdHJ1Y3RvcihuKXt0aGlzLnVybD1uLHRoaXMucmVtYWluaW5nPW59cGFyc2VSb290U2VnbWVudCgpe3JldHVybiB0aGlzLmNvbnN1bWVPcHRpb25hbCgiLyIpLHRoaXMucmVtYWluaW5nPT09IiJ8fHRoaXMucGVla1N0YXJ0c1dpdGgoIj8iKXx8dGhpcy5wZWVrU3RhcnRzV2l0aCgiIyIpP25ldyBrKFtdLHt9KTpuZXcgayhbXSx0aGlzLnBhcnNlQ2hpbGRyZW4oKSl9cGFyc2VRdWVyeVBhcmFtcygpe2xldCBuPXt9O2lmKHRoaXMuY29uc3VtZU9wdGlvbmFsKCI/IikpZG8gdGhpcy5wYXJzZVF1ZXJ5UGFyYW0obik7d2hpbGUodGhpcy5jb25zdW1lT3B0aW9uYWwoIiYiKSk7cmV0dXJuIG59cGFyc2VGcmFnbWVudCgpe3JldHVybiB0aGlzLmNvbnN1bWVPcHRpb25hbCgiIyIpP2RlY29kZVVSSUNvbXBvbmVudCh0aGlzLnJlbWFpbmluZyk6bnVsbH1wYXJzZUNoaWxkcmVuKCl7aWYodGhpcy5yZW1haW5pbmc9PT0iIilyZXR1cm57fTt0aGlzLmNvbnN1bWVPcHRpb25hbCgiLyIpO2xldCBuPVtdO2Zvcih0aGlzLnBlZWtTdGFydHNXaXRoKCIoIil8fG4ucHVzaCh0aGlzLnBhcnNlU2VnbWVudCgpKTt0aGlzLnBlZWtTdGFydHNXaXRoKCIvIikmJiF0aGlzLnBlZWtTdGFydHNXaXRoKCIvLyIpJiYhdGhpcy5wZWVrU3RhcnRzV2l0aCgiLygiKTspdGhpcy5jYXB0dXJlKCIvIiksbi5wdXNoKHRoaXMucGFyc2VTZWdtZW50KCkpO2xldCB0PXt9O3RoaXMucGVla1N0YXJ0c1dpdGgoIi8oIikmJih0aGlzLmNhcHR1cmUoIi8iKSx0PXRoaXMucGFyc2VQYXJlbnMoITApKTtsZXQgZT17fTtyZXR1cm4gdGhpcy5wZWVrU3RhcnRzV2l0aCgiKCIpJiYoZT10aGlzLnBhcnNlUGFyZW5zKCExKSksKG4ubGVuZ3RoPjB8fE9iamVjdC5rZXlzKHQpLmxlbmd0aD4wKSYmKGVbd109bmV3IGsobix0KSksZX1wYXJzZVNlZ21lbnQoKXtsZXQgbj1Lbyh0aGlzLnJlbWFpbmluZyk7aWYobj09PSIiJiZ0aGlzLnBlZWtTdGFydHNXaXRoKCI7IikpdGhyb3cgbmV3IFEoNDAwOSwhMSk7cmV0dXJuIHRoaXMuY2FwdHVyZShuKSxuZXcgcGUob3IobiksdGhpcy5wYXJzZU1hdHJpeFBhcmFtcygpKX1wYXJzZU1hdHJpeFBhcmFtcygpe2xldCBuPXt9O2Zvcig7dGhpcy5jb25zdW1lT3B0aW9uYWwoIjsiKTspdGhpcy5wYXJzZVBhcmFtKG4pO3JldHVybiBufXBhcnNlUGFyYW0obil7bGV0IHQ9dmgodGhpcy5yZW1haW5pbmcpO2lmKCF0KXJldHVybjt0aGlzLmNhcHR1cmUodCk7bGV0IGU9IiI7aWYodGhpcy5jb25zdW1lT3B0aW9uYWwoIj0iKSl7bGV0IHI9S28odGhpcy5yZW1haW5pbmcpO3ImJihlPXIsdGhpcy5jYXB0dXJlKGUpKX1uW29yKHQpXT1vcihlKX1wYXJzZVF1ZXJ5UGFyYW0obil7bGV0IHQ9YmgodGhpcy5yZW1haW5pbmcpO2lmKCF0KXJldHVybjt0aGlzLmNhcHR1cmUodCk7bGV0IGU9IiI7aWYodGhpcy5jb25zdW1lT3B0aW9uYWwoIj0iKSl7bGV0IGE9Q2godGhpcy5yZW1haW5pbmcpO2EmJihlPWEsdGhpcy5jYXB0dXJlKGUpKX1sZXQgcj1rbCh0KSxvPWtsKGUpO2lmKG4uaGFzT3duUHJvcGVydHkocikpe2xldCBhPW5bcl07QXJyYXkuaXNBcnJheShhKXx8KGE9W2FdLG5bcl09YSksYS5wdXNoKG8pfWVsc2UgbltyXT1vfXBhcnNlUGFyZW5zKG4pe2xldCB0PXt9O2Zvcih0aGlzLmNhcHR1cmUoIigiKTshdGhpcy5jb25zdW1lT3B0aW9uYWwoIikiKSYmdGhpcy5yZW1haW5pbmcubGVuZ3RoPjA7KXtsZXQgZT1Lbyh0aGlzLnJlbWFpbmluZykscj10aGlzLnJlbWFpbmluZ1tlLmxlbmd0aF07aWYociE9PSIvIiYmciE9PSIpIiYmciE9PSI7Iil0aHJvdyBuZXcgUSg0MDEwLCExKTtsZXQgbztlLmluZGV4T2YoIjoiKT4tMT8obz1lLnNsaWNlKDAsZS5pbmRleE9mKCI6IikpLHRoaXMuY2FwdHVyZShvKSx0aGlzLmNhcHR1cmUoIjoiKSk6biYmKG89dyk7bGV0IGE9dGhpcy5wYXJzZUNoaWxkcmVuKCk7dFtvPz93XT1PYmplY3Qua2V5cyhhKS5sZW5ndGg9PT0xJiZhW3ddP2Fbd106bmV3IGsoW10sYSksdGhpcy5jb25zdW1lT3B0aW9uYWwoIi8vIil9cmV0dXJuIHR9cGVla1N0YXJ0c1dpdGgobil7cmV0dXJuIHRoaXMucmVtYWluaW5nLnN0YXJ0c1dpdGgobil9Y29uc3VtZU9wdGlvbmFsKG4pe3JldHVybiB0aGlzLnBlZWtTdGFydHNXaXRoKG4pPyh0aGlzLnJlbWFpbmluZz10aGlzLnJlbWFpbmluZy5zdWJzdHJpbmcobi5sZW5ndGgpLCEwKTohMX1jYXB0dXJlKG4pe2lmKCF0aGlzLmNvbnN1bWVPcHRpb25hbChuKSl0aHJvdyBuZXcgUSg0MDExLCExKX19O3NyPWNsYXNze2lzQWJzb2x1dGU7bnVtYmVyT2ZEb3VibGVEb3RzO2NvbW1hbmRzO2NvbnN0cnVjdG9yKG4sdCxlKXtpZih0aGlzLmlzQWJzb2x1dGU9bix0aGlzLm51bWJlck9mRG91YmxlRG90cz10LHRoaXMuY29tbWFuZHM9ZSxuJiZlLmxlbmd0aD4wJiZhcihlWzBdKSl0aHJvdyBuZXcgUSg0MDAzLCExKTtsZXQgcj1lLmZpbmQodG4pO2lmKHImJnIhPT1CbChlKSl0aHJvdyBuZXcgUSg0MDA0LCExKX10b1Jvb3QoKXtyZXR1cm4gdGhpcy5pc0Fic29sdXRlJiZ0aGlzLmNvbW1hbmRzLmxlbmd0aD09PTEmJnRoaXMuY29tbWFuZHNbMF09PSIvIn19O2RpPWNsYXNze3NlZ21lbnRHcm91cDtwcm9jZXNzQ2hpbGRyZW47aW5kZXg7Y29uc3RydWN0b3Iobix0LGUpe3RoaXMuc2VnbWVudEdyb3VwPW4sdGhpcy5wcm9jZXNzQ2hpbGRyZW49dCx0aGlzLmluZGV4PWV9fTt1aT0iaW1wZXJhdGl2ZSIsb3Q9KGZ1bmN0aW9uKGkpe3JldHVybiBpW2kuTmF2aWdhdGlvblN0YXJ0PTBdPSJOYXZpZ2F0aW9uU3RhcnQiLGlbaS5OYXZpZ2F0aW9uRW5kPTFdPSJOYXZpZ2F0aW9uRW5kIixpW2kuTmF2aWdhdGlvbkNhbmNlbD0yXT0iTmF2aWdhdGlvbkNhbmNlbCIsaVtpLk5hdmlnYXRpb25FcnJvcj0zXT0iTmF2aWdhdGlvbkVycm9yIixpW2kuUm91dGVzUmVjb2duaXplZD00XT0iUm91dGVzUmVjb2duaXplZCIsaVtpLlJlc29sdmVTdGFydD01XT0iUmVzb2x2ZVN0YXJ0IixpW2kuUmVzb2x2ZUVuZD02XT0iUmVzb2x2ZUVuZCIsaVtpLkd1YXJkc0NoZWNrU3RhcnQ9N109Ikd1YXJkc0NoZWNrU3RhcnQiLGlbaS5HdWFyZHNDaGVja0VuZD04XT0iR3VhcmRzQ2hlY2tFbmQiLGlbaS5Sb3V0ZUNvbmZpZ0xvYWRTdGFydD05XT0iUm91dGVDb25maWdMb2FkU3RhcnQiLGlbaS5Sb3V0ZUNvbmZpZ0xvYWRFbmQ9MTBdPSJSb3V0ZUNvbmZpZ0xvYWRFbmQiLGlbaS5DaGlsZEFjdGl2YXRpb25TdGFydD0xMV09IkNoaWxkQWN0aXZhdGlvblN0YXJ0IixpW2kuQ2hpbGRBY3RpdmF0aW9uRW5kPTEyXT0iQ2hpbGRBY3RpdmF0aW9uRW5kIixpW2kuQWN0aXZhdGlvblN0YXJ0PTEzXT0iQWN0aXZhdGlvblN0YXJ0IixpW2kuQWN0aXZhdGlvbkVuZD0xNF09IkFjdGl2YXRpb25FbmQiLGlbaS5TY3JvbGw9MTVdPSJTY3JvbGwiLGlbaS5OYXZpZ2F0aW9uU2tpcHBlZD0xNl09Ik5hdmlnYXRpb25Ta2lwcGVkIixpfSkob3R8fHt9KSxQdD1jbGFzc3tpZDt1cmw7Y29uc3RydWN0b3Iobix0KXt0aGlzLmlkPW4sdGhpcy51cmw9dH19LF9lPWNsYXNzIGV4dGVuZHMgUHR7dHlwZT1vdC5OYXZpZ2F0aW9uU3RhcnQ7bmF2aWdhdGlvblRyaWdnZXI7cmVzdG9yZWRTdGF0ZTtjb25zdHJ1Y3RvcihuLHQsZT0iaW1wZXJhdGl2ZSIscj1udWxsKXtzdXBlcihuLHQpLHRoaXMubmF2aWdhdGlvblRyaWdnZXI9ZSx0aGlzLnJlc3RvcmVkU3RhdGU9cn10b1N0cmluZygpe3JldHVybmBOYXZpZ2F0aW9uU3RhcnQoaWQ6ICR7dGhpcy5pZH0sIHVybDogJyR7dGhpcy51cmx9JylgfX0sanQ9Y2xhc3MgZXh0ZW5kcyBQdHt1cmxBZnRlclJlZGlyZWN0czt0eXBlPW90Lk5hdmlnYXRpb25FbmQ7Y29uc3RydWN0b3Iobix0LGUpe3N1cGVyKG4sdCksdGhpcy51cmxBZnRlclJlZGlyZWN0cz1lfXRvU3RyaW5nKCl7cmV0dXJuYE5hdmlnYXRpb25FbmQoaWQ6ICR7dGhpcy5pZH0sIHVybDogJyR7dGhpcy51cmx9JywgdXJsQWZ0ZXJSZWRpcmVjdHM6ICcke3RoaXMudXJsQWZ0ZXJSZWRpcmVjdHN9JylgfX0sQ3Q9KGZ1bmN0aW9uKGkpe3JldHVybiBpW2kuUmVkaXJlY3Q9MF09IlJlZGlyZWN0IixpW2kuU3VwZXJzZWRlZEJ5TmV3TmF2aWdhdGlvbj0xXT0iU3VwZXJzZWRlZEJ5TmV3TmF2aWdhdGlvbiIsaVtpLk5vRGF0YUZyb21SZXNvbHZlcj0yXT0iTm9EYXRhRnJvbVJlc29sdmVyIixpW2kuR3VhcmRSZWplY3RlZD0zXT0iR3VhcmRSZWplY3RlZCIsaVtpLkFib3J0ZWQ9NF09IkFib3J0ZWQiLGl9KShDdHx8e30pLG1pPShmdW5jdGlvbihpKXtyZXR1cm4gaVtpLklnbm9yZWRTYW1lVXJsTmF2aWdhdGlvbj0wXT0iSWdub3JlZFNhbWVVcmxOYXZpZ2F0aW9uIixpW2kuSWdub3JlZEJ5VXJsSGFuZGxpbmdTdHJhdGVneT0xXT0iSWdub3JlZEJ5VXJsSGFuZGxpbmdTdHJhdGVneSIsaX0pKG1pfHx7fSksUXQ9Y2xhc3MgZXh0ZW5kcyBQdHtyZWFzb247Y29kZTt0eXBlPW90Lk5hdmlnYXRpb25DYW5jZWw7Y29uc3RydWN0b3Iobix0LGUscil7c3VwZXIobix0KSx0aGlzLnJlYXNvbj1lLHRoaXMuY29kZT1yfXRvU3RyaW5nKCl7cmV0dXJuYE5hdmlnYXRpb25DYW5jZWwoaWQ6ICR7dGhpcy5pZH0sIHVybDogJyR7dGhpcy51cmx9JylgfX0sdGU9Y2xhc3MgZXh0ZW5kcyBQdHtyZWFzb247Y29kZTt0eXBlPW90Lk5hdmlnYXRpb25Ta2lwcGVkO2NvbnN0cnVjdG9yKG4sdCxlLHIpe3N1cGVyKG4sdCksdGhpcy5yZWFzb249ZSx0aGlzLmNvZGU9cn19LGZpPWNsYXNzIGV4dGVuZHMgUHR7ZXJyb3I7dGFyZ2V0O3R5cGU9b3QuTmF2aWdhdGlvbkVycm9yO2NvbnN0cnVjdG9yKG4sdCxlLHIpe3N1cGVyKG4sdCksdGhpcy5lcnJvcj1lLHRoaXMudGFyZ2V0PXJ9dG9TdHJpbmcoKXtyZXR1cm5gTmF2aWdhdGlvbkVycm9yKGlkOiAke3RoaXMuaWR9LCB1cmw6ICcke3RoaXMudXJsfScsIGVycm9yOiAke3RoaXMuZXJyb3J9KWB9fSxlbj1jbGFzcyBleHRlbmRzIFB0e3VybEFmdGVyUmVkaXJlY3RzO3N0YXRlO3R5cGU9b3QuUm91dGVzUmVjb2duaXplZDtjb25zdHJ1Y3RvcihuLHQsZSxyKXtzdXBlcihuLHQpLHRoaXMudXJsQWZ0ZXJSZWRpcmVjdHM9ZSx0aGlzLnN0YXRlPXJ9dG9TdHJpbmcoKXtyZXR1cm5gUm91dGVzUmVjb2duaXplZChpZDogJHt0aGlzLmlkfSwgdXJsOiAnJHt0aGlzLnVybH0nLCB1cmxBZnRlclJlZGlyZWN0czogJyR7dGhpcy51cmxBZnRlclJlZGlyZWN0c30nLCBzdGF0ZTogJHt0aGlzLnN0YXRlfSlgfX0sbHI9Y2xhc3MgZXh0ZW5kcyBQdHt1cmxBZnRlclJlZGlyZWN0cztzdGF0ZTt0eXBlPW90Lkd1YXJkc0NoZWNrU3RhcnQ7Y29uc3RydWN0b3Iobix0LGUscil7c3VwZXIobix0KSx0aGlzLnVybEFmdGVyUmVkaXJlY3RzPWUsdGhpcy5zdGF0ZT1yfXRvU3RyaW5nKCl7cmV0dXJuYEd1YXJkc0NoZWNrU3RhcnQoaWQ6ICR7dGhpcy5pZH0sIHVybDogJyR7dGhpcy51cmx9JywgdXJsQWZ0ZXJSZWRpcmVjdHM6ICcke3RoaXMudXJsQWZ0ZXJSZWRpcmVjdHN9Jywgc3RhdGU6ICR7dGhpcy5zdGF0ZX0pYH19LGNyPWNsYXNzIGV4dGVuZHMgUHR7dXJsQWZ0ZXJSZWRpcmVjdHM7c3RhdGU7c2hvdWxkQWN0aXZhdGU7dHlwZT1vdC5HdWFyZHNDaGVja0VuZDtjb25zdHJ1Y3RvcihuLHQsZSxyLG8pe3N1cGVyKG4sdCksdGhpcy51cmxBZnRlclJlZGlyZWN0cz1lLHRoaXMuc3RhdGU9cix0aGlzLnNob3VsZEFjdGl2YXRlPW99dG9TdHJpbmcoKXtyZXR1cm5gR3VhcmRzQ2hlY2tFbmQoaWQ6ICR7dGhpcy5pZH0sIHVybDogJyR7dGhpcy51cmx9JywgdXJsQWZ0ZXJSZWRpcmVjdHM6ICcke3RoaXMudXJsQWZ0ZXJSZWRpcmVjdHN9Jywgc3RhdGU6ICR7dGhpcy5zdGF0ZX0sIHNob3VsZEFjdGl2YXRlOiAke3RoaXMuc2hvdWxkQWN0aXZhdGV9KWB9fSxkcj1jbGFzcyBleHRlbmRzIFB0e3VybEFmdGVyUmVkaXJlY3RzO3N0YXRlO3R5cGU9b3QuUmVzb2x2ZVN0YXJ0O2NvbnN0cnVjdG9yKG4sdCxlLHIpe3N1cGVyKG4sdCksdGhpcy51cmxBZnRlclJlZGlyZWN0cz1lLHRoaXMuc3RhdGU9cn10b1N0cmluZygpe3JldHVybmBSZXNvbHZlU3RhcnQoaWQ6ICR7dGhpcy5pZH0sIHVybDogJyR7dGhpcy51cmx9JywgdXJsQWZ0ZXJSZWRpcmVjdHM6ICcke3RoaXMudXJsQWZ0ZXJSZWRpcmVjdHN9Jywgc3RhdGU6ICR7dGhpcy5zdGF0ZX0pYH19LHVyPWNsYXNzIGV4dGVuZHMgUHR7dXJsQWZ0ZXJSZWRpcmVjdHM7c3RhdGU7dHlwZT1vdC5SZXNvbHZlRW5kO2NvbnN0cnVjdG9yKG4sdCxlLHIpe3N1cGVyKG4sdCksdGhpcy51cmxBZnRlclJlZGlyZWN0cz1lLHRoaXMuc3RhdGU9cn10b1N0cmluZygpe3JldHVybmBSZXNvbHZlRW5kKGlkOiAke3RoaXMuaWR9LCB1cmw6ICcke3RoaXMudXJsfScsIHVybEFmdGVyUmVkaXJlY3RzOiAnJHt0aGlzLnVybEFmdGVyUmVkaXJlY3RzfScsIHN0YXRlOiAke3RoaXMuc3RhdGV9KWB9fSxocj1jbGFzc3tyb3V0ZTt0eXBlPW90LlJvdXRlQ29uZmlnTG9hZFN0YXJ0O2NvbnN0cnVjdG9yKG4pe3RoaXMucm91dGU9bn10b1N0cmluZygpe3JldHVybmBSb3V0ZUNvbmZpZ0xvYWRTdGFydChwYXRoOiAke3RoaXMucm91dGUucGF0aH0pYH19LG1yPWNsYXNze3JvdXRlO3R5cGU9b3QuUm91dGVDb25maWdMb2FkRW5kO2NvbnN0cnVjdG9yKG4pe3RoaXMucm91dGU9bn10b1N0cmluZygpe3JldHVybmBSb3V0ZUNvbmZpZ0xvYWRFbmQocGF0aDogJHt0aGlzLnJvdXRlLnBhdGh9KWB9fSxmcj1jbGFzc3tzbmFwc2hvdDt0eXBlPW90LkNoaWxkQWN0aXZhdGlvblN0YXJ0O2NvbnN0cnVjdG9yKG4pe3RoaXMuc25hcHNob3Q9bn10b1N0cmluZygpe3JldHVybmBDaGlsZEFjdGl2YXRpb25TdGFydChwYXRoOiAnJHt0aGlzLnNuYXBzaG90LnJvdXRlQ29uZmlnJiZ0aGlzLnNuYXBzaG90LnJvdXRlQ29uZmlnLnBhdGh8fCIifScpYH19LHByPWNsYXNze3NuYXBzaG90O3R5cGU9b3QuQ2hpbGRBY3RpdmF0aW9uRW5kO2NvbnN0cnVjdG9yKG4pe3RoaXMuc25hcHNob3Q9bn10b1N0cmluZygpe3JldHVybmBDaGlsZEFjdGl2YXRpb25FbmQocGF0aDogJyR7dGhpcy5zbmFwc2hvdC5yb3V0ZUNvbmZpZyYmdGhpcy5zbmFwc2hvdC5yb3V0ZUNvbmZpZy5wYXRofHwiIn0nKWB9fSxncj1jbGFzc3tzbmFwc2hvdDt0eXBlPW90LkFjdGl2YXRpb25TdGFydDtjb25zdHJ1Y3RvcihuKXt0aGlzLnNuYXBzaG90PW59dG9TdHJpbmcoKXtyZXR1cm5gQWN0aXZhdGlvblN0YXJ0KHBhdGg6ICcke3RoaXMuc25hcHNob3Qucm91dGVDb25maWcmJnRoaXMuc25hcHNob3Qucm91dGVDb25maWcucGF0aHx8IiJ9JylgfX0sdnI9Y2xhc3N7c25hcHNob3Q7dHlwZT1vdC5BY3RpdmF0aW9uRW5kO2NvbnN0cnVjdG9yKG4pe3RoaXMuc25hcHNob3Q9bn10b1N0cmluZygpe3JldHVybmBBY3RpdmF0aW9uRW5kKHBhdGg6ICcke3RoaXMuc25hcHNob3Qucm91dGVDb25maWcmJnRoaXMuc25hcHNob3Qucm91dGVDb25maWcucGF0aHx8IiJ9JylgfX0scGk9Y2xhc3N7cm91dGVyRXZlbnQ7cG9zaXRpb247YW5jaG9yO3R5cGU9b3QuU2Nyb2xsO2NvbnN0cnVjdG9yKG4sdCxlKXt0aGlzLnJvdXRlckV2ZW50PW4sdGhpcy5wb3NpdGlvbj10LHRoaXMuYW5jaG9yPWV9dG9TdHJpbmcoKXtsZXQgbj10aGlzLnBvc2l0aW9uP2Ake3RoaXMucG9zaXRpb25bMF19LCAke3RoaXMucG9zaXRpb25bMV19YDpudWxsO3JldHVybmBTY3JvbGwoYW5jaG9yOiAnJHt0aGlzLmFuY2hvcn0nLCBwb3NpdGlvbjogJyR7bn0nKWB9fSxubj1jbGFzc3t9LGdpPWNsYXNze3VybDtuYXZpZ2F0aW9uQmVoYXZpb3JPcHRpb25zO2NvbnN0cnVjdG9yKG4sdCl7dGhpcy51cmw9bix0aGlzLm5hdmlnYXRpb25CZWhhdmlvck9wdGlvbnM9dH19O19yPWNsYXNze3Jvb3RJbmplY3RvcjtvdXRsZXQ9bnVsbDtyb3V0ZT1udWxsO2NoaWxkcmVuO2F0dGFjaFJlZj1udWxsO2dldCBpbmplY3Rvcigpe3JldHVybiBiaSh0aGlzLnJvdXRlPy5zbmFwc2hvdCk/P3RoaXMucm9vdEluamVjdG9yfWNvbnN0cnVjdG9yKG4pe3RoaXMucm9vdEluamVjdG9yPW4sdGhpcy5jaGlsZHJlbj1uZXcgemUodGhpcy5yb290SW5qZWN0b3IpfX0semU9KCgpPT57Y2xhc3MgaXtyb290SW5qZWN0b3I7Y29udGV4dHM9bmV3IE1hcDtjb25zdHJ1Y3Rvcih0KXt0aGlzLnJvb3RJbmplY3Rvcj10fW9uQ2hpbGRPdXRsZXRDcmVhdGVkKHQsZSl7bGV0IHI9dGhpcy5nZXRPckNyZWF0ZUNvbnRleHQodCk7ci5vdXRsZXQ9ZSx0aGlzLmNvbnRleHRzLnNldCh0LHIpfW9uQ2hpbGRPdXRsZXREZXN0cm95ZWQodCl7bGV0IGU9dGhpcy5nZXRDb250ZXh0KHQpO2UmJihlLm91dGxldD1udWxsLGUuYXR0YWNoUmVmPW51bGwpfW9uT3V0bGV0RGVhY3RpdmF0ZWQoKXtsZXQgdD10aGlzLmNvbnRleHRzO3JldHVybiB0aGlzLmNvbnRleHRzPW5ldyBNYXAsdH1vbk91dGxldFJlQXR0YWNoZWQodCl7dGhpcy5jb250ZXh0cz10fWdldE9yQ3JlYXRlQ29udGV4dCh0KXtsZXQgZT10aGlzLmdldENvbnRleHQodCk7cmV0dXJuIGV8fChlPW5ldyBfcih0aGlzLnJvb3RJbmplY3RvciksdGhpcy5jb250ZXh0cy5zZXQodCxlKSksZX1nZXRDb250ZXh0KHQpe3JldHVybiB0aGlzLmNvbnRleHRzLmdldCh0KXx8bnVsbH1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSkoRyhJdCkpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCksYnI9Y2xhc3N7X3Jvb3Q7Y29uc3RydWN0b3Iobil7dGhpcy5fcm9vdD1ufWdldCByb290KCl7cmV0dXJuIHRoaXMuX3Jvb3QudmFsdWV9cGFyZW50KG4pe2xldCB0PXRoaXMucGF0aEZyb21Sb290KG4pO3JldHVybiB0Lmxlbmd0aD4xP3RbdC5sZW5ndGgtMl06bnVsbH1jaGlsZHJlbihuKXtsZXQgdD1yYShuLHRoaXMuX3Jvb3QpO3JldHVybiB0P3QuY2hpbGRyZW4ubWFwKGU9PmUudmFsdWUpOltdfWZpcnN0Q2hpbGQobil7bGV0IHQ9cmEobix0aGlzLl9yb290KTtyZXR1cm4gdCYmdC5jaGlsZHJlbi5sZW5ndGg+MD90LmNoaWxkcmVuWzBdLnZhbHVlOm51bGx9c2libGluZ3Mobil7bGV0IHQ9b2Eobix0aGlzLl9yb290KTtyZXR1cm4gdC5sZW5ndGg8Mj9bXTp0W3QubGVuZ3RoLTJdLmNoaWxkcmVuLm1hcChyPT5yLnZhbHVlKS5maWx0ZXIocj0+ciE9PW4pfXBhdGhGcm9tUm9vdChuKXtyZXR1cm4gb2Eobix0aGlzLl9yb290KS5tYXAodD0+dC52YWx1ZSl9fTtOdD1jbGFzc3t2YWx1ZTtjaGlsZHJlbjtjb25zdHJ1Y3RvcihuLHQpe3RoaXMudmFsdWU9bix0aGlzLmNoaWxkcmVuPXR9dG9TdHJpbmcoKXtyZXR1cm5gVHJlZU5vZGUoJHt0aGlzLnZhbHVlfSlgfX07cm49Y2xhc3MgZXh0ZW5kcyBicntzbmFwc2hvdDtjb25zdHJ1Y3RvcihuLHQpe3N1cGVyKG4pLHRoaXMuc25hcHNob3Q9dCxtYSh0aGlzLG4pfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuc25hcHNob3QudG9TdHJpbmcoKX19O3JlPWNsYXNze3VybFN1YmplY3Q7cGFyYW1zU3ViamVjdDtxdWVyeVBhcmFtc1N1YmplY3Q7ZnJhZ21lbnRTdWJqZWN0O2RhdGFTdWJqZWN0O291dGxldDtjb21wb25lbnQ7c25hcHNob3Q7X2Z1dHVyZVNuYXBzaG90O19yb3V0ZXJTdGF0ZTtfcGFyYW1NYXA7X3F1ZXJ5UGFyYW1NYXA7dGl0bGU7dXJsO3BhcmFtcztxdWVyeVBhcmFtcztmcmFnbWVudDtkYXRhO2NvbnN0cnVjdG9yKG4sdCxlLHIsbyxhLHMsYyl7dGhpcy51cmxTdWJqZWN0PW4sdGhpcy5wYXJhbXNTdWJqZWN0PXQsdGhpcy5xdWVyeVBhcmFtc1N1YmplY3Q9ZSx0aGlzLmZyYWdtZW50U3ViamVjdD1yLHRoaXMuZGF0YVN1YmplY3Q9byx0aGlzLm91dGxldD1hLHRoaXMuY29tcG9uZW50PXMsdGhpcy5fZnV0dXJlU25hcHNob3Q9Yyx0aGlzLnRpdGxlPXRoaXMuZGF0YVN1YmplY3Q/LnBpcGUoYihkPT5kW2NuXSkpPz9nKHZvaWQgMCksdGhpcy51cmw9bix0aGlzLnBhcmFtcz10LHRoaXMucXVlcnlQYXJhbXM9ZSx0aGlzLmZyYWdtZW50PXIsdGhpcy5kYXRhPW99Z2V0IHJvdXRlQ29uZmlnKCl7cmV0dXJuIHRoaXMuX2Z1dHVyZVNuYXBzaG90LnJvdXRlQ29uZmlnfWdldCByb290KCl7cmV0dXJuIHRoaXMuX3JvdXRlclN0YXRlLnJvb3R9Z2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9yb3V0ZXJTdGF0ZS5wYXJlbnQodGhpcyl9Z2V0IGZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5fcm91dGVyU3RhdGUuZmlyc3RDaGlsZCh0aGlzKX1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5fcm91dGVyU3RhdGUuY2hpbGRyZW4odGhpcyl9Z2V0IHBhdGhGcm9tUm9vdCgpe3JldHVybiB0aGlzLl9yb3V0ZXJTdGF0ZS5wYXRoRnJvbVJvb3QodGhpcyl9Z2V0IHBhcmFtTWFwKCl7cmV0dXJuIHRoaXMuX3BhcmFtTWFwPz89dGhpcy5wYXJhbXMucGlwZShiKG49PmplKG4pKSksdGhpcy5fcGFyYW1NYXB9Z2V0IHF1ZXJ5UGFyYW1NYXAoKXtyZXR1cm4gdGhpcy5fcXVlcnlQYXJhbU1hcD8/PXRoaXMucXVlcnlQYXJhbXMucGlwZShiKG49PmplKG4pKSksdGhpcy5fcXVlcnlQYXJhbU1hcH10b1N0cmluZygpe3JldHVybiB0aGlzLnNuYXBzaG90P3RoaXMuc25hcHNob3QudG9TdHJpbmcoKTpgRnV0dXJlKCR7dGhpcy5fZnV0dXJlU25hcHNob3R9KWB9fTtWZT1jbGFzc3t1cmw7cGFyYW1zO3F1ZXJ5UGFyYW1zO2ZyYWdtZW50O2RhdGE7b3V0bGV0O2NvbXBvbmVudDtyb3V0ZUNvbmZpZztfcmVzb2x2ZTtfcmVzb2x2ZWREYXRhO19yb3V0ZXJTdGF0ZTtfcGFyYW1NYXA7X3F1ZXJ5UGFyYW1NYXA7Z2V0IHRpdGxlKCl7cmV0dXJuIHRoaXMuZGF0YT8uW2NuXX1jb25zdHJ1Y3RvcihuLHQsZSxyLG8sYSxzLGMsZCl7dGhpcy51cmw9bix0aGlzLnBhcmFtcz10LHRoaXMucXVlcnlQYXJhbXM9ZSx0aGlzLmZyYWdtZW50PXIsdGhpcy5kYXRhPW8sdGhpcy5vdXRsZXQ9YSx0aGlzLmNvbXBvbmVudD1zLHRoaXMucm91dGVDb25maWc9Yyx0aGlzLl9yZXNvbHZlPWR9Z2V0IHJvb3QoKXtyZXR1cm4gdGhpcy5fcm91dGVyU3RhdGUucm9vdH1nZXQgcGFyZW50KCl7cmV0dXJuIHRoaXMuX3JvdXRlclN0YXRlLnBhcmVudCh0aGlzKX1nZXQgZmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLl9yb3V0ZXJTdGF0ZS5maXJzdENoaWxkKHRoaXMpfWdldCBjaGlsZHJlbigpe3JldHVybiB0aGlzLl9yb3V0ZXJTdGF0ZS5jaGlsZHJlbih0aGlzKX1nZXQgcGF0aEZyb21Sb290KCl7cmV0dXJuIHRoaXMuX3JvdXRlclN0YXRlLnBhdGhGcm9tUm9vdCh0aGlzKX1nZXQgcGFyYW1NYXAoKXtyZXR1cm4gdGhpcy5fcGFyYW1NYXA/Pz1qZSh0aGlzLnBhcmFtcyksdGhpcy5fcGFyYW1NYXB9Z2V0IHF1ZXJ5UGFyYW1NYXAoKXtyZXR1cm4gdGhpcy5fcXVlcnlQYXJhbU1hcD8/PWplKHRoaXMucXVlcnlQYXJhbXMpLHRoaXMuX3F1ZXJ5UGFyYW1NYXB9dG9TdHJpbmcoKXtsZXQgbj10aGlzLnVybC5tYXAoZT0+ZS50b1N0cmluZygpKS5qb2luKCIvIiksdD10aGlzLnJvdXRlQ29uZmlnP3RoaXMucm91dGVDb25maWcucGF0aDoiIjtyZXR1cm5gUm91dGUodXJsOicke259JywgcGF0aDonJHt0fScpYH19LG9uPWNsYXNzIGV4dGVuZHMgYnJ7dXJsO2NvbnN0cnVjdG9yKG4sdCl7c3VwZXIodCksdGhpcy51cmw9bixtYSh0aGlzLHQpfXRvU3RyaW5nKCl7cmV0dXJuIGVjKHRoaXMuX3Jvb3QpfX07bmM9bmV3IHYoIiIpLGZhPSgoKT0+e2NsYXNzIGl7YWN0aXZhdGVkPW51bGw7Z2V0IGFjdGl2YXRlZENvbXBvbmVudFJlZigpe3JldHVybiB0aGlzLmFjdGl2YXRlZH1fYWN0aXZhdGVkUm91dGU9bnVsbDtuYW1lPXc7YWN0aXZhdGVFdmVudHM9bmV3IEE7ZGVhY3RpdmF0ZUV2ZW50cz1uZXcgQTthdHRhY2hFdmVudHM9bmV3IEE7ZGV0YWNoRXZlbnRzPW5ldyBBO3JvdXRlck91dGxldERhdGE9dWwoKTtwYXJlbnRDb250ZXh0cz1sKHplKTtsb2NhdGlvbj1sKG1lKTtjaGFuZ2VEZXRlY3Rvcj1sKEF0KTtpbnB1dEJpbmRlcj1sKGRuLHtvcHRpb25hbDohMH0pO3N1cHBvcnRzQmluZGluZ1RvQ29tcG9uZW50SW5wdXRzPSEwO25nT25DaGFuZ2VzKHQpe2lmKHQubmFtZSl7bGV0e2ZpcnN0Q2hhbmdlOmUscHJldmlvdXNWYWx1ZTpyfT10Lm5hbWU7aWYoZSlyZXR1cm47dGhpcy5pc1RyYWNrZWRJblBhcmVudENvbnRleHRzKHIpJiYodGhpcy5kZWFjdGl2YXRlKCksdGhpcy5wYXJlbnRDb250ZXh0cy5vbkNoaWxkT3V0bGV0RGVzdHJveWVkKHIpKSx0aGlzLmluaXRpYWxpemVPdXRsZXRXaXRoTmFtZSgpfX1uZ09uRGVzdHJveSgpe3RoaXMuaXNUcmFja2VkSW5QYXJlbnRDb250ZXh0cyh0aGlzLm5hbWUpJiZ0aGlzLnBhcmVudENvbnRleHRzLm9uQ2hpbGRPdXRsZXREZXN0cm95ZWQodGhpcy5uYW1lKSx0aGlzLmlucHV0QmluZGVyPy51bnN1YnNjcmliZUZyb21Sb3V0ZURhdGEodGhpcyl9aXNUcmFja2VkSW5QYXJlbnRDb250ZXh0cyh0KXtyZXR1cm4gdGhpcy5wYXJlbnRDb250ZXh0cy5nZXRDb250ZXh0KHQpPy5vdXRsZXQ9PT10aGlzfW5nT25Jbml0KCl7dGhpcy5pbml0aWFsaXplT3V0bGV0V2l0aE5hbWUoKX1pbml0aWFsaXplT3V0bGV0V2l0aE5hbWUoKXtpZih0aGlzLnBhcmVudENvbnRleHRzLm9uQ2hpbGRPdXRsZXRDcmVhdGVkKHRoaXMubmFtZSx0aGlzKSx0aGlzLmFjdGl2YXRlZClyZXR1cm47bGV0IHQ9dGhpcy5wYXJlbnRDb250ZXh0cy5nZXRDb250ZXh0KHRoaXMubmFtZSk7dD8ucm91dGUmJih0LmF0dGFjaFJlZj90aGlzLmF0dGFjaCh0LmF0dGFjaFJlZix0LnJvdXRlKTp0aGlzLmFjdGl2YXRlV2l0aCh0LnJvdXRlLHQuaW5qZWN0b3IpKX1nZXQgaXNBY3RpdmF0ZWQoKXtyZXR1cm4hIXRoaXMuYWN0aXZhdGVkfWdldCBjb21wb25lbnQoKXtpZighdGhpcy5hY3RpdmF0ZWQpdGhyb3cgbmV3IFEoNDAxMiwhMSk7cmV0dXJuIHRoaXMuYWN0aXZhdGVkLmluc3RhbmNlfWdldCBhY3RpdmF0ZWRSb3V0ZSgpe2lmKCF0aGlzLmFjdGl2YXRlZCl0aHJvdyBuZXcgUSg0MDEyLCExKTtyZXR1cm4gdGhpcy5fYWN0aXZhdGVkUm91dGV9Z2V0IGFjdGl2YXRlZFJvdXRlRGF0YSgpe3JldHVybiB0aGlzLl9hY3RpdmF0ZWRSb3V0ZT90aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5kYXRhOnt9fWRldGFjaCgpe2lmKCF0aGlzLmFjdGl2YXRlZCl0aHJvdyBuZXcgUSg0MDEyLCExKTt0aGlzLmxvY2F0aW9uLmRldGFjaCgpO2xldCB0PXRoaXMuYWN0aXZhdGVkO3JldHVybiB0aGlzLmFjdGl2YXRlZD1udWxsLHRoaXMuX2FjdGl2YXRlZFJvdXRlPW51bGwsdGhpcy5kZXRhY2hFdmVudHMuZW1pdCh0Lmluc3RhbmNlKSx0fWF0dGFjaCh0LGUpe3RoaXMuYWN0aXZhdGVkPXQsdGhpcy5fYWN0aXZhdGVkUm91dGU9ZSx0aGlzLmxvY2F0aW9uLmluc2VydCh0Lmhvc3RWaWV3KSx0aGlzLmlucHV0QmluZGVyPy5iaW5kQWN0aXZhdGVkUm91dGVUb091dGxldENvbXBvbmVudCh0aGlzKSx0aGlzLmF0dGFjaEV2ZW50cy5lbWl0KHQuaW5zdGFuY2UpfWRlYWN0aXZhdGUoKXtpZih0aGlzLmFjdGl2YXRlZCl7bGV0IHQ9dGhpcy5jb21wb25lbnQ7dGhpcy5hY3RpdmF0ZWQuZGVzdHJveSgpLHRoaXMuYWN0aXZhdGVkPW51bGwsdGhpcy5fYWN0aXZhdGVkUm91dGU9bnVsbCx0aGlzLmRlYWN0aXZhdGVFdmVudHMuZW1pdCh0KX19YWN0aXZhdGVXaXRoKHQsZSl7aWYodGhpcy5pc0FjdGl2YXRlZCl0aHJvdyBuZXcgUSg0MDEzLCExKTt0aGlzLl9hY3RpdmF0ZWRSb3V0ZT10O2xldCByPXRoaXMubG9jYXRpb24sYT10LnNuYXBzaG90LmNvbXBvbmVudCxzPXRoaXMucGFyZW50Q29udGV4dHMuZ2V0T3JDcmVhdGVDb250ZXh0KHRoaXMubmFtZSkuY2hpbGRyZW4sYz1uZXcgc2EodCxzLHIuaW5qZWN0b3IsdGhpcy5yb3V0ZXJPdXRsZXREYXRhKTt0aGlzLmFjdGl2YXRlZD1yLmNyZWF0ZUNvbXBvbmVudChhLHtpbmRleDpyLmxlbmd0aCxpbmplY3RvcjpjLGVudmlyb25tZW50SW5qZWN0b3I6ZX0pLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCksdGhpcy5pbnB1dEJpbmRlcj8uYmluZEFjdGl2YXRlZFJvdXRlVG9PdXRsZXRDb21wb25lbnQodGhpcyksdGhpcy5hY3RpdmF0ZUV2ZW50cy5lbWl0KHRoaXMuYWN0aXZhdGVkLmluc3RhbmNlKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyJyb3V0ZXItb3V0bGV0Il1dLGlucHV0czp7bmFtZToibmFtZSIscm91dGVyT3V0bGV0RGF0YTpbMSwicm91dGVyT3V0bGV0RGF0YSJdfSxvdXRwdXRzOnthY3RpdmF0ZUV2ZW50czoiYWN0aXZhdGUiLGRlYWN0aXZhdGVFdmVudHM6ImRlYWN0aXZhdGUiLGF0dGFjaEV2ZW50czoiYXR0YWNoIixkZXRhY2hFdmVudHM6ImRldGFjaCJ9LGV4cG9ydEFzOlsib3V0bGV0Il0sZmVhdHVyZXM6W210XX0pfXJldHVybiBpfSkoKSxzYT1jbGFzc3tyb3V0ZTtjaGlsZENvbnRleHRzO3BhcmVudDtvdXRsZXREYXRhO2NvbnN0cnVjdG9yKG4sdCxlLHIpe3RoaXMucm91dGU9bix0aGlzLmNoaWxkQ29udGV4dHM9dCx0aGlzLnBhcmVudD1lLHRoaXMub3V0bGV0RGF0YT1yfWdldChuLHQpe3JldHVybiBuPT09cmU/dGhpcy5yb3V0ZTpuPT09emU/dGhpcy5jaGlsZENvbnRleHRzOm49PT1uYz90aGlzLm91dGxldERhdGE6dGhpcy5wYXJlbnQuZ2V0KG4sdCl9fSxkbj1uZXcgdigiIikscGE9KCgpPT57Y2xhc3MgaXtvdXRsZXREYXRhU3Vic2NyaXB0aW9ucz1uZXcgTWFwO2JpbmRBY3RpdmF0ZWRSb3V0ZVRvT3V0bGV0Q29tcG9uZW50KHQpe3RoaXMudW5zdWJzY3JpYmVGcm9tUm91dGVEYXRhKHQpLHRoaXMuc3Vic2NyaWJlVG9Sb3V0ZURhdGEodCl9dW5zdWJzY3JpYmVGcm9tUm91dGVEYXRhKHQpe3RoaXMub3V0bGV0RGF0YVN1YnNjcmlwdGlvbnMuZ2V0KHQpPy51bnN1YnNjcmliZSgpLHRoaXMub3V0bGV0RGF0YVN1YnNjcmlwdGlvbnMuZGVsZXRlKHQpfXN1YnNjcmliZVRvUm91dGVEYXRhKHQpe2xldHthY3RpdmF0ZWRSb3V0ZTplfT10LHI9S2UoW2UucXVlcnlQYXJhbXMsZS5wYXJhbXMsZS5kYXRhXSkucGlwZShzdCgoW28sYSxzXSxjKT0+KHM9aChoKGgoe30sbyksYSkscyksYz09PTA/ZyhzKTpQcm9taXNlLnJlc29sdmUocykpKSkuc3Vic2NyaWJlKG89PntpZighdC5pc0FjdGl2YXRlZHx8IXQuYWN0aXZhdGVkQ29tcG9uZW50UmVmfHx0LmFjdGl2YXRlZFJvdXRlIT09ZXx8ZS5jb21wb25lbnQ9PT1udWxsKXt0aGlzLnVuc3Vic2NyaWJlRnJvbVJvdXRlRGF0YSh0KTtyZXR1cm59bGV0IGE9cGwoZS5jb21wb25lbnQpO2lmKCFhKXt0aGlzLnVuc3Vic2NyaWJlRnJvbVJvdXRlRGF0YSh0KTtyZXR1cm59Zm9yKGxldHt0ZW1wbGF0ZU5hbWU6c31vZiBhLmlucHV0cyl0LmFjdGl2YXRlZENvbXBvbmVudFJlZi5zZXRJbnB1dChzLG9bc10pfSk7dGhpcy5vdXRsZXREYXRhU3Vic2NyaXB0aW9ucy5zZXQodCxyKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhY30pfXJldHVybiBpfSkoKSxnYT0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWNtcD1QKHt0eXBlOmksc2VsZWN0b3JzOltbIm5nLWNvbXBvbmVudCJdXSxleHBvcnRBczpbImVtcHR5Um91dGVyT3V0bGV0Il0sZGVjbHM6MSx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24oZSxyKXtlJjEmJm5lKDAsInJvdXRlci1vdXRsZXQiKX0sZGVwZW5kZW5jaWVzOltmYV0sZW5jYXBzdWxhdGlvbjoyfSl9cmV0dXJuIGl9KSgpO3ZpPWNsYXNze3JlZGlyZWN0VG87bmF2aWdhdGlvbkJlaGF2aW9yT3B0aW9ucztjb25zdHJ1Y3RvcihuLHQpe3RoaXMucmVkaXJlY3RUbz1uLHRoaXMubmF2aWdhdGlvbkJlaGF2aW9yT3B0aW9ucz10fX0scmM9Im5nTmF2aWdhdGlvbkNhbmNlbGluZ0Vycm9yIjtMaD0oaSxuLHQsZSk9PmIocj0+KG5ldyBsYShuLHIudGFyZ2V0Um91dGVyU3RhdGUsci5jdXJyZW50Um91dGVyU3RhdGUsdCxlKS5hY3RpdmF0ZShpKSxyKSksbGE9Y2xhc3N7cm91dGVSZXVzZVN0cmF0ZWd5O2Z1dHVyZVN0YXRlO2N1cnJTdGF0ZTtmb3J3YXJkRXZlbnQ7aW5wdXRCaW5kaW5nRW5hYmxlZDtjb25zdHJ1Y3RvcihuLHQsZSxyLG8pe3RoaXMucm91dGVSZXVzZVN0cmF0ZWd5PW4sdGhpcy5mdXR1cmVTdGF0ZT10LHRoaXMuY3VyclN0YXRlPWUsdGhpcy5mb3J3YXJkRXZlbnQ9cix0aGlzLmlucHV0QmluZGluZ0VuYWJsZWQ9b31hY3RpdmF0ZShuKXtsZXQgdD10aGlzLmZ1dHVyZVN0YXRlLl9yb290LGU9dGhpcy5jdXJyU3RhdGU/dGhpcy5jdXJyU3RhdGUuX3Jvb3Q6bnVsbDt0aGlzLmRlYWN0aXZhdGVDaGlsZFJvdXRlcyh0LGUsbiksWG8odGhpcy5mdXR1cmVTdGF0ZS5yb290KSx0aGlzLmFjdGl2YXRlQ2hpbGRSb3V0ZXModCxlLG4pfWRlYWN0aXZhdGVDaGlsZFJvdXRlcyhuLHQsZSl7bGV0IHI9Y2kodCk7bi5jaGlsZHJlbi5mb3JFYWNoKG89PntsZXQgYT1vLnZhbHVlLm91dGxldDt0aGlzLmRlYWN0aXZhdGVSb3V0ZXMobyxyW2FdLGUpLGRlbGV0ZSByW2FdfSksT2JqZWN0LnZhbHVlcyhyKS5mb3JFYWNoKG89Pnt0aGlzLmRlYWN0aXZhdGVSb3V0ZUFuZEl0c0NoaWxkcmVuKG8sZSl9KX1kZWFjdGl2YXRlUm91dGVzKG4sdCxlKXtsZXQgcj1uLnZhbHVlLG89dD90LnZhbHVlOm51bGw7aWYocj09PW8paWYoci5jb21wb25lbnQpe2xldCBhPWUuZ2V0Q29udGV4dChyLm91dGxldCk7YSYmdGhpcy5kZWFjdGl2YXRlQ2hpbGRSb3V0ZXMobix0LGEuY2hpbGRyZW4pfWVsc2UgdGhpcy5kZWFjdGl2YXRlQ2hpbGRSb3V0ZXMobix0LGUpO2Vsc2UgbyYmdGhpcy5kZWFjdGl2YXRlUm91dGVBbmRJdHNDaGlsZHJlbih0LGUpfWRlYWN0aXZhdGVSb3V0ZUFuZEl0c0NoaWxkcmVuKG4sdCl7bi52YWx1ZS5jb21wb25lbnQmJnRoaXMucm91dGVSZXVzZVN0cmF0ZWd5LnNob3VsZERldGFjaChuLnZhbHVlLnNuYXBzaG90KT90aGlzLmRldGFjaEFuZFN0b3JlUm91dGVTdWJ0cmVlKG4sdCk6dGhpcy5kZWFjdGl2YXRlUm91dGVBbmRPdXRsZXQobix0KX1kZXRhY2hBbmRTdG9yZVJvdXRlU3VidHJlZShuLHQpe2xldCBlPXQuZ2V0Q29udGV4dChuLnZhbHVlLm91dGxldCkscj1lJiZuLnZhbHVlLmNvbXBvbmVudD9lLmNoaWxkcmVuOnQsbz1jaShuKTtmb3IobGV0IGEgb2YgT2JqZWN0LnZhbHVlcyhvKSl0aGlzLmRlYWN0aXZhdGVSb3V0ZUFuZEl0c0NoaWxkcmVuKGEscik7aWYoZSYmZS5vdXRsZXQpe2xldCBhPWUub3V0bGV0LmRldGFjaCgpLHM9ZS5jaGlsZHJlbi5vbk91dGxldERlYWN0aXZhdGVkKCk7dGhpcy5yb3V0ZVJldXNlU3RyYXRlZ3kuc3RvcmUobi52YWx1ZS5zbmFwc2hvdCx7Y29tcG9uZW50UmVmOmEscm91dGU6bixjb250ZXh0czpzfSl9fWRlYWN0aXZhdGVSb3V0ZUFuZE91dGxldChuLHQpe2xldCBlPXQuZ2V0Q29udGV4dChuLnZhbHVlLm91dGxldCkscj1lJiZuLnZhbHVlLmNvbXBvbmVudD9lLmNoaWxkcmVuOnQsbz1jaShuKTtmb3IobGV0IGEgb2YgT2JqZWN0LnZhbHVlcyhvKSl0aGlzLmRlYWN0aXZhdGVSb3V0ZUFuZEl0c0NoaWxkcmVuKGEscik7ZSYmKGUub3V0bGV0JiYoZS5vdXRsZXQuZGVhY3RpdmF0ZSgpLGUuY2hpbGRyZW4ub25PdXRsZXREZWFjdGl2YXRlZCgpKSxlLmF0dGFjaFJlZj1udWxsLGUucm91dGU9bnVsbCl9YWN0aXZhdGVDaGlsZFJvdXRlcyhuLHQsZSl7bGV0IHI9Y2kodCk7bi5jaGlsZHJlbi5mb3JFYWNoKG89Pnt0aGlzLmFjdGl2YXRlUm91dGVzKG8scltvLnZhbHVlLm91dGxldF0sZSksdGhpcy5mb3J3YXJkRXZlbnQobmV3IHZyKG8udmFsdWUuc25hcHNob3QpKX0pLG4uY2hpbGRyZW4ubGVuZ3RoJiZ0aGlzLmZvcndhcmRFdmVudChuZXcgcHIobi52YWx1ZS5zbmFwc2hvdCkpfWFjdGl2YXRlUm91dGVzKG4sdCxlKXtsZXQgcj1uLnZhbHVlLG89dD90LnZhbHVlOm51bGw7aWYoWG8ocikscj09PW8paWYoci5jb21wb25lbnQpe2xldCBhPWUuZ2V0T3JDcmVhdGVDb250ZXh0KHIub3V0bGV0KTt0aGlzLmFjdGl2YXRlQ2hpbGRSb3V0ZXMobix0LGEuY2hpbGRyZW4pfWVsc2UgdGhpcy5hY3RpdmF0ZUNoaWxkUm91dGVzKG4sdCxlKTtlbHNlIGlmKHIuY29tcG9uZW50KXtsZXQgYT1lLmdldE9yQ3JlYXRlQ29udGV4dChyLm91dGxldCk7aWYodGhpcy5yb3V0ZVJldXNlU3RyYXRlZ3kuc2hvdWxkQXR0YWNoKHIuc25hcHNob3QpKXtsZXQgcz10aGlzLnJvdXRlUmV1c2VTdHJhdGVneS5yZXRyaWV2ZShyLnNuYXBzaG90KTt0aGlzLnJvdXRlUmV1c2VTdHJhdGVneS5zdG9yZShyLnNuYXBzaG90LG51bGwpLGEuY2hpbGRyZW4ub25PdXRsZXRSZUF0dGFjaGVkKHMuY29udGV4dHMpLGEuYXR0YWNoUmVmPXMuY29tcG9uZW50UmVmLGEucm91dGU9cy5yb3V0ZS52YWx1ZSxhLm91dGxldCYmYS5vdXRsZXQuYXR0YWNoKHMuY29tcG9uZW50UmVmLHMucm91dGUudmFsdWUpLFhvKHMucm91dGUudmFsdWUpLHRoaXMuYWN0aXZhdGVDaGlsZFJvdXRlcyhuLG51bGwsYS5jaGlsZHJlbil9ZWxzZSBhLmF0dGFjaFJlZj1udWxsLGEucm91dGU9cixhLm91dGxldCYmYS5vdXRsZXQuYWN0aXZhdGVXaXRoKHIsYS5pbmplY3RvciksdGhpcy5hY3RpdmF0ZUNoaWxkUm91dGVzKG4sbnVsbCxhLmNoaWxkcmVuKX1lbHNlIHRoaXMuYWN0aXZhdGVDaGlsZFJvdXRlcyhuLG51bGwsZSl9fSx4cj1jbGFzc3twYXRoO3JvdXRlO2NvbnN0cnVjdG9yKG4pe3RoaXMucGF0aD1uLHRoaXMucm91dGU9dGhpcy5wYXRoW3RoaXMucGF0aC5sZW5ndGgtMV19fSxoaT1jbGFzc3tjb21wb25lbnQ7cm91dGU7Y29uc3RydWN0b3Iobix0KXt0aGlzLmNvbXBvbmVudD1uLHRoaXMucm91dGU9dH19O2lyPVN5bWJvbCgiSU5JVElBTF9WQUxVRSIpO3NuPWNsYXNze3NlZ21lbnRHcm91cDtjb25zdHJ1Y3RvcihuKXt0aGlzLnNlZ21lbnRHcm91cD1ufHxudWxsfX0sbG49Y2xhc3MgZXh0ZW5kcyBFcnJvcnt1cmxUcmVlO2NvbnN0cnVjdG9yKG4pe3N1cGVyKCksdGhpcy51cmxUcmVlPW59fTtjYT1jbGFzc3t1cmxTZXJpYWxpemVyO3VybFRyZWU7Y29uc3RydWN0b3Iobix0KXt0aGlzLnVybFNlcmlhbGl6ZXI9bix0aGlzLnVybFRyZWU9dH1saW5lcmFsaXplU2VnbWVudHMobix0KXtsZXQgZT1bXSxyPXQucm9vdDtmb3IoOzspe2lmKGU9ZS5jb25jYXQoci5zZWdtZW50cyksci5udW1iZXJPZkNoaWxkcmVuPT09MClyZXR1cm4gZyhlKTtpZihyLm51bWJlck9mQ2hpbGRyZW4+MXx8IXIuY2hpbGRyZW5bd10pcmV0dXJuIG9tKGAke24ucmVkaXJlY3RUb31gKTtyPXIuY2hpbGRyZW5bd119fWFwcGx5UmVkaXJlY3RDb21tYW5kcyhuLHQsZSxyLG8pe3JldHVybiBzbSh0LHIsbykucGlwZShiKGE9PntpZihhIGluc3RhbmNlb2YgSnQpdGhyb3cgbmV3IGxuKGEpO2xldCBzPXRoaXMuYXBwbHlSZWRpcmVjdENyZWF0ZVVybFRyZWUoYSx0aGlzLnVybFNlcmlhbGl6ZXIucGFyc2UoYSksbixlKTtpZihhWzBdPT09Ii8iKXRocm93IG5ldyBsbihzKTtyZXR1cm4gc30pKX1hcHBseVJlZGlyZWN0Q3JlYXRlVXJsVHJlZShuLHQsZSxyKXtsZXQgbz10aGlzLmNyZWF0ZVNlZ21lbnRHcm91cChuLHQucm9vdCxlLHIpO3JldHVybiBuZXcgSnQobyx0aGlzLmNyZWF0ZVF1ZXJ5UGFyYW1zKHQucXVlcnlQYXJhbXMsdGhpcy51cmxUcmVlLnF1ZXJ5UGFyYW1zKSx0LmZyYWdtZW50KX1jcmVhdGVRdWVyeVBhcmFtcyhuLHQpe2xldCBlPXt9O3JldHVybiBPYmplY3QuZW50cmllcyhuKS5mb3JFYWNoKChbcixvXSk9PntpZih0eXBlb2Ygbz09InN0cmluZyImJm9bMF09PT0iOiIpe2xldCBzPW8uc3Vic3RyaW5nKDEpO2Vbcl09dFtzXX1lbHNlIGVbcl09b30pLGV9Y3JlYXRlU2VnbWVudEdyb3VwKG4sdCxlLHIpe2xldCBvPXRoaXMuY3JlYXRlU2VnbWVudHMobix0LnNlZ21lbnRzLGUsciksYT17fTtyZXR1cm4gT2JqZWN0LmVudHJpZXModC5jaGlsZHJlbikuZm9yRWFjaCgoW3MsY10pPT57YVtzXT10aGlzLmNyZWF0ZVNlZ21lbnRHcm91cChuLGMsZSxyKX0pLG5ldyBrKG8sYSl9Y3JlYXRlU2VnbWVudHMobix0LGUscil7cmV0dXJuIHQubWFwKG89Pm8ucGF0aFswXT09PSI6Ij90aGlzLmZpbmRQb3NQYXJhbShuLG8scik6dGhpcy5maW5kT3JSZXR1cm4obyxlKSl9ZmluZFBvc1BhcmFtKG4sdCxlKXtsZXQgcj1lW3QucGF0aC5zdWJzdHJpbmcoMSldO2lmKCFyKXRocm93IG5ldyBRKDQwMDEsITEpO3JldHVybiByfWZpbmRPclJldHVybihuLHQpe2xldCBlPTA7Zm9yKGxldCByIG9mIHQpe2lmKHIucGF0aD09PW4ucGF0aClyZXR1cm4gdC5zcGxpY2UoZSkscjtlKyt9cmV0dXJuIG59fTtkYT17bWF0Y2hlZDohMSxjb25zdW1lZFNlZ21lbnRzOltdLHJlbWFpbmluZ1NlZ21lbnRzOltdLHBhcmFtZXRlcnM6e30scG9zaXRpb25hbFBhcmFtU2VnbWVudHM6e319O3VhPWNsYXNze307Z209MzEsaGE9Y2xhc3N7aW5qZWN0b3I7Y29uZmlnTG9hZGVyO3Jvb3RDb21wb25lbnRUeXBlO2NvbmZpZzt1cmxUcmVlO3BhcmFtc0luaGVyaXRhbmNlU3RyYXRlZ3k7dXJsU2VyaWFsaXplcjthcHBseVJlZGlyZWN0czthYnNvbHV0ZVJlZGlyZWN0Q291bnQ9MDthbGxvd1JlZGlyZWN0cz0hMDtjb25zdHJ1Y3RvcihuLHQsZSxyLG8sYSxzKXt0aGlzLmluamVjdG9yPW4sdGhpcy5jb25maWdMb2FkZXI9dCx0aGlzLnJvb3RDb21wb25lbnRUeXBlPWUsdGhpcy5jb25maWc9cix0aGlzLnVybFRyZWU9byx0aGlzLnBhcmFtc0luaGVyaXRhbmNlU3RyYXRlZ3k9YSx0aGlzLnVybFNlcmlhbGl6ZXI9cyx0aGlzLmFwcGx5UmVkaXJlY3RzPW5ldyBjYSh0aGlzLnVybFNlcmlhbGl6ZXIsdGhpcy51cmxUcmVlKX1ub01hdGNoRXJyb3Iobil7cmV0dXJuIG5ldyBRKDQwMDIsYCcke24uc2VnbWVudEdyb3VwfSdgKX1yZWNvZ25pemUoKXtsZXQgbj1ObCh0aGlzLnVybFRyZWUucm9vdCxbXSxbXSx0aGlzLmNvbmZpZykuc2VnbWVudEdyb3VwO3JldHVybiB0aGlzLm1hdGNoKG4pLnBpcGUoYigoe2NoaWxkcmVuOnQscm9vdFNuYXBzaG90OmV9KT0+e2xldCByPW5ldyBOdChlLHQpLG89bmV3IG9uKCIiLHIpLGE9S2woZSxbXSx0aGlzLnVybFRyZWUucXVlcnlQYXJhbXMsdGhpcy51cmxUcmVlLmZyYWdtZW50KTtyZXR1cm4gYS5xdWVyeVBhcmFtcz10aGlzLnVybFRyZWUucXVlcnlQYXJhbXMsby51cmw9dGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShhKSx7c3RhdGU6byx0cmVlOmF9fSkpfW1hdGNoKG4pe2xldCB0PW5ldyBWZShbXSxPYmplY3QuZnJlZXplKHt9KSxPYmplY3QuZnJlZXplKGgoe30sdGhpcy51cmxUcmVlLnF1ZXJ5UGFyYW1zKSksdGhpcy51cmxUcmVlLmZyYWdtZW50LE9iamVjdC5mcmVlemUoe30pLHcsdGhpcy5yb290Q29tcG9uZW50VHlwZSxudWxsLHt9KTtyZXR1cm4gdGhpcy5wcm9jZXNzU2VnbWVudEdyb3VwKHRoaXMuaW5qZWN0b3IsdGhpcy5jb25maWcsbix3LHQpLnBpcGUoYihlPT4oe2NoaWxkcmVuOmUscm9vdFNuYXBzaG90OnR9KSksYXQoZT0+e2lmKGUgaW5zdGFuY2VvZiBsbilyZXR1cm4gdGhpcy51cmxUcmVlPWUudXJsVHJlZSx0aGlzLm1hdGNoKGUudXJsVHJlZS5yb290KTt0aHJvdyBlIGluc3RhbmNlb2Ygc24/dGhpcy5ub01hdGNoRXJyb3IoZSk6ZX0pKX1wcm9jZXNzU2VnbWVudEdyb3VwKG4sdCxlLHIsbyl7cmV0dXJuIGUuc2VnbWVudHMubGVuZ3RoPT09MCYmZS5oYXNDaGlsZHJlbigpP3RoaXMucHJvY2Vzc0NoaWxkcmVuKG4sdCxlLG8pOnRoaXMucHJvY2Vzc1NlZ21lbnQobix0LGUsZS5zZWdtZW50cyxyLCEwLG8pLnBpcGUoYihhPT5hIGluc3RhbmNlb2YgTnQ/W2FdOltdKSl9cHJvY2Vzc0NoaWxkcmVuKG4sdCxlLHIpe2xldCBvPVtdO2ZvcihsZXQgYSBvZiBPYmplY3Qua2V5cyhlLmNoaWxkcmVuKSlhPT09InByaW1hcnkiP28udW5zaGlmdChhKTpvLnB1c2goYSk7cmV0dXJuIHB0KG8pLnBpcGUoZWUoYT0+e2xldCBzPWUuY2hpbGRyZW5bYV0sYz1PaCh0LGEpO3JldHVybiB0aGlzLnByb2Nlc3NTZWdtZW50R3JvdXAobixjLHMsYSxyKX0pLCRzKChhLHMpPT4oYS5wdXNoKC4uLnMpLGEpKSxPbyhudWxsKSxIcygpLFN0KGE9PntpZihhPT09bnVsbClyZXR1cm4gbGkoZSk7bGV0IHM9ZGMoYSk7cmV0dXJuIHZtKHMpLGcocyl9KSl9cHJvY2Vzc1NlZ21lbnQobix0LGUscixvLGEscyl7cmV0dXJuIHB0KHQpLnBpcGUoZWUoYz0+dGhpcy5wcm9jZXNzU2VnbWVudEFnYWluc3RSb3V0ZShjLl9pbmplY3Rvcj8/bix0LGMsZSxyLG8sYSxzKS5waXBlKGF0KGQ9PntpZihkIGluc3RhbmNlb2Ygc24pcmV0dXJuIGcobnVsbCk7dGhyb3cgZH0pKSksaGUoYz0+ISFjKSxhdChjPT57aWYoc2MoYykpcmV0dXJuIGZtKGUscixvKT9nKG5ldyB1YSk6bGkoZSk7dGhyb3cgY30pKX1wcm9jZXNzU2VnbWVudEFnYWluc3RSb3V0ZShuLHQsZSxyLG8sYSxzLGMpe3JldHVybiAkdChlKSE9PWEmJihhPT09d3x8IUVyKHIsbyxlKSk/bGkocik6ZS5yZWRpcmVjdFRvPT09dm9pZCAwP3RoaXMubWF0Y2hTZWdtZW50QWdhaW5zdFJvdXRlKG4scixlLG8sYSxjKTp0aGlzLmFsbG93UmVkaXJlY3RzJiZzP3RoaXMuZXhwYW5kU2VnbWVudEFnYWluc3RSb3V0ZVVzaW5nUmVkaXJlY3QobixyLHQsZSxvLGEsYyk6bGkocil9ZXhwYW5kU2VnbWVudEFnYWluc3RSb3V0ZVVzaW5nUmVkaXJlY3Qobix0LGUscixvLGEscyl7bGV0e21hdGNoZWQ6YyxwYXJhbWV0ZXJzOmQsY29uc3VtZWRTZWdtZW50czp1LHBvc2l0aW9uYWxQYXJhbVNlZ21lbnRzOngscmVtYWluaW5nU2VnbWVudHM6an09Y2ModCxyLG8pO2lmKCFjKXJldHVybiBsaSh0KTt0eXBlb2Ygci5yZWRpcmVjdFRvPT0ic3RyaW5nIiYmci5yZWRpcmVjdFRvWzBdPT09Ii8iJiYodGhpcy5hYnNvbHV0ZVJlZGlyZWN0Q291bnQrKyx0aGlzLmFic29sdXRlUmVkaXJlY3RDb3VudD5nbSYmKHRoaXMuYWxsb3dSZWRpcmVjdHM9ITEpKTtsZXQgQj1uZXcgVmUobyxkLE9iamVjdC5mcmVlemUoaCh7fSx0aGlzLnVybFRyZWUucXVlcnlQYXJhbXMpKSx0aGlzLnVybFRyZWUuZnJhZ21lbnQsUGwociksJHQociksci5jb21wb25lbnQ/P3IuX2xvYWRlZENvbXBvbmVudD8/bnVsbCxyLExsKHIpKSxJPXlyKEIscyx0aGlzLnBhcmFtc0luaGVyaXRhbmNlU3RyYXRlZ3kpO3JldHVybiBCLnBhcmFtcz1PYmplY3QuZnJlZXplKEkucGFyYW1zKSxCLmRhdGE9T2JqZWN0LmZyZWV6ZShJLmRhdGEpLHRoaXMuYXBwbHlSZWRpcmVjdHMuYXBwbHlSZWRpcmVjdENvbW1hbmRzKHUsci5yZWRpcmVjdFRvLHgsQixuKS5waXBlKHN0KGJ0PT50aGlzLmFwcGx5UmVkaXJlY3RzLmxpbmVyYWxpemVTZWdtZW50cyhyLGJ0KSksU3QoYnQ9PnRoaXMucHJvY2Vzc1NlZ21lbnQobixlLHQsYnQuY29uY2F0KGopLGEsITEscykpKX1tYXRjaFNlZ21lbnRBZ2FpbnN0Um91dGUobix0LGUscixvLGEpe2xldCBzPWxtKHQsZSxyLG4sdGhpcy51cmxTZXJpYWxpemVyKTtyZXR1cm4gZS5wYXRoPT09IioqIiYmKHQuY2hpbGRyZW49e30pLHMucGlwZShzdChjPT5jLm1hdGNoZWQ/KG49ZS5faW5qZWN0b3I/P24sdGhpcy5nZXRDaGlsZENvbmZpZyhuLGUscikucGlwZShzdCgoe3JvdXRlczpkfSk9PntsZXQgdT1lLl9sb2FkZWRJbmplY3Rvcj8/bix7cGFyYW1ldGVyczp4LGNvbnN1bWVkU2VnbWVudHM6aixyZW1haW5pbmdTZWdtZW50czpCfT1jLEk9bmV3IFZlKGoseCxPYmplY3QuZnJlZXplKGgoe30sdGhpcy51cmxUcmVlLnF1ZXJ5UGFyYW1zKSksdGhpcy51cmxUcmVlLmZyYWdtZW50LFBsKGUpLCR0KGUpLGUuY29tcG9uZW50Pz9lLl9sb2FkZWRDb21wb25lbnQ/P251bGwsZSxMbChlKSksVj15cihJLGEsdGhpcy5wYXJhbXNJbmhlcml0YW5jZVN0cmF0ZWd5KTtJLnBhcmFtcz1PYmplY3QuZnJlZXplKFYucGFyYW1zKSxJLmRhdGE9T2JqZWN0LmZyZWV6ZShWLmRhdGEpO2xldHtzZWdtZW50R3JvdXA6YnQsc2xpY2VkU2VnbWVudHM6WWV9PU5sKHQsaixCLGQpO2lmKFllLmxlbmd0aD09PTAmJmJ0Lmhhc0NoaWxkcmVuKCkpcmV0dXJuIHRoaXMucHJvY2Vzc0NoaWxkcmVuKHUsZCxidCxJKS5waXBlKGIoRGU9Pm5ldyBOdChJLERlKSkpO2lmKGQubGVuZ3RoPT09MCYmWWUubGVuZ3RoPT09MClyZXR1cm4gZyhuZXcgTnQoSSxbXSkpO2xldCBWaT0kdChlKT09PW87cmV0dXJuIHRoaXMucHJvY2Vzc1NlZ21lbnQodSxkLGJ0LFllLFZpP3c6bywhMCxJKS5waXBlKGIoRGU9Pm5ldyBOdChJLERlIGluc3RhbmNlb2YgTnQ/W0RlXTpbXSkpKX0pKSk6bGkodCkpKX1nZXRDaGlsZENvbmZpZyhuLHQsZSl7cmV0dXJuIHQuY2hpbGRyZW4/Zyh7cm91dGVzOnQuY2hpbGRyZW4saW5qZWN0b3I6bn0pOnQubG9hZENoaWxkcmVuP3QuX2xvYWRlZFJvdXRlcyE9PXZvaWQgMD9nKHtyb3V0ZXM6dC5fbG9hZGVkUm91dGVzLGluamVjdG9yOnQuX2xvYWRlZEluamVjdG9yfSk6bm0obix0LGUsdGhpcy51cmxTZXJpYWxpemVyKS5waXBlKFN0KHI9PnI/dGhpcy5jb25maWdMb2FkZXIubG9hZENoaWxkcmVuKG4sdCkucGlwZShXKG89Pnt0Ll9sb2FkZWRSb3V0ZXM9by5yb3V0ZXMsdC5fbG9hZGVkSW5qZWN0b3I9by5pbmplY3Rvcn0pKTphbSh0KSkpOmcoe3JvdXRlczpbXSxpbmplY3RvcjpufSl9fTtfYT0oKCk9PntjbGFzcyBpe2J1aWxkVGl0bGUodCl7bGV0IGUscj10LnJvb3Q7Zm9yKDtyIT09dm9pZCAwOyllPXRoaXMuZ2V0UmVzb2x2ZWRUaXRsZUZvclJvdXRlKHIpPz9lLHI9ci5jaGlsZHJlbi5maW5kKG89Pm8ub3V0bGV0PT09dyk7cmV0dXJuIGV9Z2V0UmVzb2x2ZWRUaXRsZUZvclJvdXRlKHQpe3JldHVybiB0LmRhdGFbY25dfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OigpPT5sKGhjKSxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKSxoYz0oKCk9PntjbGFzcyBpIGV4dGVuZHMgX2F7dGl0bGU7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnRpdGxlPXR9dXBkYXRlVGl0bGUodCl7bGV0IGU9dGhpcy5idWlsZFRpdGxlKHQpO2UhPT12b2lkIDAmJnRoaXMudGl0bGUuc2V0VGl0bGUoZSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpKEcoeGwpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpLGJlPW5ldyB2KCIiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT4oe30pfSksQ2k9bmV3IHYoIiIpLFNyPSgoKT0+e2NsYXNzIGl7Y29tcG9uZW50TG9hZGVycz1uZXcgV2Vha01hcDtjaGlsZHJlbkxvYWRlcnM9bmV3IFdlYWtNYXA7b25Mb2FkU3RhcnRMaXN0ZW5lcjtvbkxvYWRFbmRMaXN0ZW5lcjtjb21waWxlcj1sKGRsKTtsb2FkQ29tcG9uZW50KHQsZSl7aWYodGhpcy5jb21wb25lbnRMb2FkZXJzLmdldChlKSlyZXR1cm4gdGhpcy5jb21wb25lbnRMb2FkZXJzLmdldChlKTtpZihlLl9sb2FkZWRDb21wb25lbnQpcmV0dXJuIGcoZS5fbG9hZGVkQ29tcG9uZW50KTt0aGlzLm9uTG9hZFN0YXJ0TGlzdGVuZXImJnRoaXMub25Mb2FkU3RhcnRMaXN0ZW5lcihlKTtsZXQgcj1vZShWdCh0LCgpPT5lLmxvYWRDb21wb25lbnQoKSkpLnBpcGUoYihmYyksc3QocGMpLFcoYT0+e3RoaXMub25Mb2FkRW5kTGlzdGVuZXImJnRoaXMub25Mb2FkRW5kTGlzdGVuZXIoZSksZS5fbG9hZGVkQ29tcG9uZW50PWF9KSxRZSgoKT0+e3RoaXMuY29tcG9uZW50TG9hZGVycy5kZWxldGUoZSl9KSksbz1uZXcgamkociwoKT0+bmV3IHkpLnBpcGUoQW8oKSk7cmV0dXJuIHRoaXMuY29tcG9uZW50TG9hZGVycy5zZXQoZSxvKSxvfWxvYWRDaGlsZHJlbih0LGUpe2lmKHRoaXMuY2hpbGRyZW5Mb2FkZXJzLmdldChlKSlyZXR1cm4gdGhpcy5jaGlsZHJlbkxvYWRlcnMuZ2V0KGUpO2lmKGUuX2xvYWRlZFJvdXRlcylyZXR1cm4gZyh7cm91dGVzOmUuX2xvYWRlZFJvdXRlcyxpbmplY3RvcjplLl9sb2FkZWRJbmplY3Rvcn0pO3RoaXMub25Mb2FkU3RhcnRMaXN0ZW5lciYmdGhpcy5vbkxvYWRTdGFydExpc3RlbmVyKGUpO2xldCBvPW1jKGUsdGhpcy5jb21waWxlcix0LHRoaXMub25Mb2FkRW5kTGlzdGVuZXIpLnBpcGUoUWUoKCk9Pnt0aGlzLmNoaWxkcmVuTG9hZGVycy5kZWxldGUoZSl9KSksYT1uZXcgamkobywoKT0+bmV3IHkpLnBpcGUoQW8oKSk7cmV0dXJuIHRoaXMuY2hpbGRyZW5Mb2FkZXJzLnNldChlLGEpLGF9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCk7RHI9KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTooKT0+bChTbSkscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCksU209KCgpPT57Y2xhc3MgaXtzaG91bGRQcm9jZXNzVXJsKHQpe3JldHVybiEwfWV4dHJhY3QodCl7cmV0dXJuIHR9bWVyZ2UodCxlKXtyZXR1cm4gdH1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKSxiYT1uZXcgdigiIikseWE9bmV3IHYoIiIpO0NhPW5ldyB2KCIiKSxScj0oKCk9PntjbGFzcyBpe2N1cnJlbnROYXZpZ2F0aW9uPUoobnVsbCx7ZXF1YWw6KCk9PiExfSk7Y3VycmVudFRyYW5zaXRpb249bnVsbDtsYXN0U3VjY2Vzc2Z1bE5hdmlnYXRpb249bnVsbDtldmVudHM9bmV3IHk7dHJhbnNpdGlvbkFib3J0V2l0aEVycm9yU3ViamVjdD1uZXcgeTtjb25maWdMb2FkZXI9bChTcik7ZW52aXJvbm1lbnRJbmplY3Rvcj1sKEl0KTtkZXN0cm95UmVmPWwoQmkpO3VybFNlcmlhbGl6ZXI9bChCZSk7cm9vdENvbnRleHRzPWwoemUpO2xvY2F0aW9uPWwoZmUpO2lucHV0QmluZGluZ0VuYWJsZWQ9bChkbix7b3B0aW9uYWw6ITB9KSE9PW51bGw7dGl0bGVTdHJhdGVneT1sKF9hKTtvcHRpb25zPWwoYmUse29wdGlvbmFsOiEwfSl8fHt9O3BhcmFtc0luaGVyaXRhbmNlU3RyYXRlZ3k9dGhpcy5vcHRpb25zLnBhcmFtc0luaGVyaXRhbmNlU3RyYXRlZ3l8fCJlbXB0eU9ubHkiO3VybEhhbmRsaW5nU3RyYXRlZ3k9bChEcik7Y3JlYXRlVmlld1RyYW5zaXRpb249bChiYSx7b3B0aW9uYWw6ITB9KTtuYXZpZ2F0aW9uRXJyb3JIYW5kbGVyPWwoQ2Ese29wdGlvbmFsOiEwfSk7bmF2aWdhdGlvbklkPTA7Z2V0IGhhc1JlcXVlc3RlZE5hdmlnYXRpb24oKXtyZXR1cm4gdGhpcy5uYXZpZ2F0aW9uSWQhPT0wfXRyYW5zaXRpb25zO2FmdGVyUHJlYWN0aXZhdGlvbj0oKT0+Zyh2b2lkIDApO3Jvb3RDb21wb25lbnRUeXBlPW51bGw7ZGVzdHJveWVkPSExO2NvbnN0cnVjdG9yKCl7bGV0IHQ9cj0+dGhpcy5ldmVudHMubmV4dChuZXcgaHIocikpLGU9cj0+dGhpcy5ldmVudHMubmV4dChuZXcgbXIocikpO3RoaXMuY29uZmlnTG9hZGVyLm9uTG9hZEVuZExpc3RlbmVyPWUsdGhpcy5jb25maWdMb2FkZXIub25Mb2FkU3RhcnRMaXN0ZW5lcj10LHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCk9Pnt0aGlzLmRlc3Ryb3llZD0hMH0pfWNvbXBsZXRlKCl7dGhpcy50cmFuc2l0aW9ucz8uY29tcGxldGUoKX1oYW5kbGVOYXZpZ2F0aW9uUmVxdWVzdCh0KXtsZXQgZT0rK3RoaXMubmF2aWdhdGlvbklkO3V0KCgpPT57dGhpcy50cmFuc2l0aW9ucz8ubmV4dCgkKGgoe30sdCkse2V4dHJhY3RlZFVybDp0aGlzLnVybEhhbmRsaW5nU3RyYXRlZ3kuZXh0cmFjdCh0LnJhd1VybCksdGFyZ2V0U25hcHNob3Q6bnVsbCx0YXJnZXRSb3V0ZXJTdGF0ZTpudWxsLGd1YXJkczp7Y2FuQWN0aXZhdGVDaGVja3M6W10sY2FuRGVhY3RpdmF0ZUNoZWNrczpbXX0sZ3VhcmRzUmVzdWx0Om51bGwsYWJvcnRDb250cm9sbGVyOm5ldyBBYm9ydENvbnRyb2xsZXIsaWQ6ZX0pKX0pfXNldHVwTmF2aWdhdGlvbnModCl7cmV0dXJuIHRoaXMudHJhbnNpdGlvbnM9bmV3IEV0KG51bGwpLHRoaXMudHJhbnNpdGlvbnMucGlwZShLKGU9PmUhPT1udWxsKSxzdChlPT57bGV0IHI9ITE7cmV0dXJuIGcoZSkucGlwZShzdChvPT57aWYodGhpcy5uYXZpZ2F0aW9uSWQ+ZS5pZClyZXR1cm4gdGhpcy5jYW5jZWxOYXZpZ2F0aW9uVHJhbnNpdGlvbihlLCIiLEN0LlN1cGVyc2VkZWRCeU5ld05hdmlnYXRpb24pLFV0O3RoaXMuY3VycmVudFRyYW5zaXRpb249ZSx0aGlzLmN1cnJlbnROYXZpZ2F0aW9uLnNldCh7aWQ6by5pZCxpbml0aWFsVXJsOm8ucmF3VXJsLGV4dHJhY3RlZFVybDpvLmV4dHJhY3RlZFVybCx0YXJnZXRCcm93c2VyVXJsOnR5cGVvZiBvLmV4dHJhcy5icm93c2VyVXJsPT0ic3RyaW5nIj90aGlzLnVybFNlcmlhbGl6ZXIucGFyc2Uoby5leHRyYXMuYnJvd3NlclVybCk6by5leHRyYXMuYnJvd3NlclVybCx0cmlnZ2VyOm8uc291cmNlLGV4dHJhczpvLmV4dHJhcyxwcmV2aW91c05hdmlnYXRpb246dGhpcy5sYXN0U3VjY2Vzc2Z1bE5hdmlnYXRpb24/JChoKHt9LHRoaXMubGFzdFN1Y2Nlc3NmdWxOYXZpZ2F0aW9uKSx7cHJldmlvdXNOYXZpZ2F0aW9uOm51bGx9KTpudWxsLGFib3J0OigpPT5vLmFib3J0Q29udHJvbGxlci5hYm9ydCgpfSk7bGV0IGE9IXQubmF2aWdhdGVkfHx0aGlzLmlzVXBkYXRpbmdJbnRlcm5hbFN0YXRlKCl8fHRoaXMuaXNVcGRhdGVkQnJvd3NlclVybCgpLHM9by5leHRyYXMub25TYW1lVXJsTmF2aWdhdGlvbj8/dC5vblNhbWVVcmxOYXZpZ2F0aW9uO2lmKCFhJiZzIT09InJlbG9hZCIpcmV0dXJuIHRoaXMuZXZlbnRzLm5leHQobmV3IHRlKG8uaWQsdGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShvLnJhd1VybCksIiIsbWkuSWdub3JlZFNhbWVVcmxOYXZpZ2F0aW9uKSksby5yZXNvbHZlKCExKSxVdDtpZih0aGlzLnVybEhhbmRsaW5nU3RyYXRlZ3kuc2hvdWxkUHJvY2Vzc1VybChvLnJhd1VybCkpcmV0dXJuIGcobykucGlwZShzdChjPT4odGhpcy5ldmVudHMubmV4dChuZXcgX2UoYy5pZCx0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKGMuZXh0cmFjdGVkVXJsKSxjLnNvdXJjZSxjLnJlc3RvcmVkU3RhdGUpKSxjLmlkIT09dGhpcy5uYXZpZ2F0aW9uSWQ/VXQ6UHJvbWlzZS5yZXNvbHZlKGMpKSksYm0odGhpcy5lbnZpcm9ubWVudEluamVjdG9yLHRoaXMuY29uZmlnTG9hZGVyLHRoaXMucm9vdENvbXBvbmVudFR5cGUsdC5jb25maWcsdGhpcy51cmxTZXJpYWxpemVyLHRoaXMucGFyYW1zSW5oZXJpdGFuY2VTdHJhdGVneSksVyhjPT57ZS50YXJnZXRTbmFwc2hvdD1jLnRhcmdldFNuYXBzaG90LGUudXJsQWZ0ZXJSZWRpcmVjdHM9Yy51cmxBZnRlclJlZGlyZWN0cyx0aGlzLmN1cnJlbnROYXZpZ2F0aW9uLnVwZGF0ZSh1PT4odS5maW5hbFVybD1jLnVybEFmdGVyUmVkaXJlY3RzLHUpKTtsZXQgZD1uZXcgZW4oYy5pZCx0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKGMuZXh0cmFjdGVkVXJsKSx0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKGMudXJsQWZ0ZXJSZWRpcmVjdHMpLGMudGFyZ2V0U25hcHNob3QpO3RoaXMuZXZlbnRzLm5leHQoZCl9KSk7aWYoYSYmdGhpcy51cmxIYW5kbGluZ1N0cmF0ZWd5LnNob3VsZFByb2Nlc3NVcmwoby5jdXJyZW50UmF3VXJsKSl7bGV0e2lkOmMsZXh0cmFjdGVkVXJsOmQsc291cmNlOnUscmVzdG9yZWRTdGF0ZTp4LGV4dHJhczpqfT1vLEI9bmV3IF9lKGMsdGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShkKSx1LHgpO3RoaXMuZXZlbnRzLm5leHQoQik7bGV0IEk9dGModGhpcy5yb290Q29tcG9uZW50VHlwZSkuc25hcHNob3Q7cmV0dXJuIHRoaXMuY3VycmVudFRyYW5zaXRpb249ZT0kKGgoe30sbykse3RhcmdldFNuYXBzaG90OkksdXJsQWZ0ZXJSZWRpcmVjdHM6ZCxleHRyYXM6JChoKHt9LGopLHtza2lwTG9jYXRpb25DaGFuZ2U6ITEscmVwbGFjZVVybDohMX0pfSksdGhpcy5jdXJyZW50TmF2aWdhdGlvbi51cGRhdGUoVj0+KFYuZmluYWxVcmw9ZCxWKSksZyhlKX1lbHNlIHJldHVybiB0aGlzLmV2ZW50cy5uZXh0KG5ldyB0ZShvLmlkLHRoaXMudXJsU2VyaWFsaXplci5zZXJpYWxpemUoby5leHRyYWN0ZWRVcmwpLCIiLG1pLklnbm9yZWRCeVVybEhhbmRsaW5nU3RyYXRlZ3kpKSxvLnJlc29sdmUoITEpLFV0fSksVyhvPT57bGV0IGE9bmV3IGxyKG8uaWQsdGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShvLmV4dHJhY3RlZFVybCksdGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShvLnVybEFmdGVyUmVkaXJlY3RzKSxvLnRhcmdldFNuYXBzaG90KTt0aGlzLmV2ZW50cy5uZXh0KGEpfSksYihvPT4odGhpcy5jdXJyZW50VHJhbnNpdGlvbj1lPSQoaCh7fSxvKSx7Z3VhcmRzOlZoKG8udGFyZ2V0U25hcHNob3Qsby5jdXJyZW50U25hcHNob3QsdGhpcy5yb290Q29udGV4dHMpfSksZSkpLEtoKHRoaXMuZW52aXJvbm1lbnRJbmplY3RvcixvPT50aGlzLmV2ZW50cy5uZXh0KG8pKSxXKG89PntpZihlLmd1YXJkc1Jlc3VsdD1vLmd1YXJkc1Jlc3VsdCxvLmd1YXJkc1Jlc3VsdCYmdHlwZW9mIG8uZ3VhcmRzUmVzdWx0IT0iYm9vbGVhbiIpdGhyb3cgQ3IodGhpcy51cmxTZXJpYWxpemVyLG8uZ3VhcmRzUmVzdWx0KTtsZXQgYT1uZXcgY3Ioby5pZCx0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKG8uZXh0cmFjdGVkVXJsKSx0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKG8udXJsQWZ0ZXJSZWRpcmVjdHMpLG8udGFyZ2V0U25hcHNob3QsISFvLmd1YXJkc1Jlc3VsdCk7dGhpcy5ldmVudHMubmV4dChhKX0pLEsobz0+by5ndWFyZHNSZXN1bHQ/ITA6KHRoaXMuY2FuY2VsTmF2aWdhdGlvblRyYW5zaXRpb24obywiIixDdC5HdWFyZFJlamVjdGVkKSwhMSkpLFFvKG89PntpZihvLmd1YXJkcy5jYW5BY3RpdmF0ZUNoZWNrcy5sZW5ndGghPT0wKXJldHVybiBnKG8pLnBpcGUoVyhhPT57bGV0IHM9bmV3IGRyKGEuaWQsdGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShhLmV4dHJhY3RlZFVybCksdGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShhLnVybEFmdGVyUmVkaXJlY3RzKSxhLnRhcmdldFNuYXBzaG90KTt0aGlzLmV2ZW50cy5uZXh0KHMpfSksc3QoYT0+e2xldCBzPSExO3JldHVybiBnKGEpLnBpcGUoeW0odGhpcy5wYXJhbXNJbmhlcml0YW5jZVN0cmF0ZWd5LHRoaXMuZW52aXJvbm1lbnRJbmplY3RvciksVyh7bmV4dDooKT0+cz0hMCxjb21wbGV0ZTooKT0+e3N8fHRoaXMuY2FuY2VsTmF2aWdhdGlvblRyYW5zaXRpb24oYSwiIixDdC5Ob0RhdGFGcm9tUmVzb2x2ZXIpfX0pKX0pLFcoYT0+e2xldCBzPW5ldyB1cihhLmlkLHRoaXMudXJsU2VyaWFsaXplci5zZXJpYWxpemUoYS5leHRyYWN0ZWRVcmwpLHRoaXMudXJsU2VyaWFsaXplci5zZXJpYWxpemUoYS51cmxBZnRlclJlZGlyZWN0cyksYS50YXJnZXRTbmFwc2hvdCk7dGhpcy5ldmVudHMubmV4dChzKX0pKX0pLFFvKG89PntsZXQgYT1zPT57bGV0IGM9W107aWYocy5yb3V0ZUNvbmZpZz8ubG9hZENvbXBvbmVudCl7bGV0IGQ9Ymkocyk/P3RoaXMuZW52aXJvbm1lbnRJbmplY3RvcjtjLnB1c2godGhpcy5jb25maWdMb2FkZXIubG9hZENvbXBvbmVudChkLHMucm91dGVDb25maWcpLnBpcGUoVyh1PT57cy5jb21wb25lbnQ9dX0pLGIoKCk9Pnt9KSkpfWZvcihsZXQgZCBvZiBzLmNoaWxkcmVuKWMucHVzaCguLi5hKGQpKTtyZXR1cm4gY307cmV0dXJuIEtlKGEoby50YXJnZXRTbmFwc2hvdC5yb290KSkucGlwZShPbyhudWxsKSx5dCgxKSl9KSxRbygoKT0+dGhpcy5hZnRlclByZWFjdGl2YXRpb24oKSksc3QoKCk9PntsZXR7Y3VycmVudFNuYXBzaG90Om8sdGFyZ2V0U25hcHNob3Q6YX09ZSxzPXRoaXMuY3JlYXRlVmlld1RyYW5zaXRpb24/Lih0aGlzLmVudmlyb25tZW50SW5qZWN0b3Isby5yb290LGEucm9vdCk7cmV0dXJuIHM/cHQocykucGlwZShiKCgpPT5lKSk6ZyhlKX0pLGIobz0+e2xldCBhPVRoKHQucm91dGVSZXVzZVN0cmF0ZWd5LG8udGFyZ2V0U25hcHNob3Qsby5jdXJyZW50Um91dGVyU3RhdGUpO3JldHVybiB0aGlzLmN1cnJlbnRUcmFuc2l0aW9uPWU9JChoKHt9LG8pLHt0YXJnZXRSb3V0ZXJTdGF0ZTphfSksdGhpcy5jdXJyZW50TmF2aWdhdGlvbi51cGRhdGUocz0+KHMudGFyZ2V0Um91dGVyU3RhdGU9YSxzKSksZX0pLFcoKCk9Pnt0aGlzLmV2ZW50cy5uZXh0KG5ldyBubil9KSxMaCh0aGlzLnJvb3RDb250ZXh0cyx0LnJvdXRlUmV1c2VTdHJhdGVneSxvPT50aGlzLmV2ZW50cy5uZXh0KG8pLHRoaXMuaW5wdXRCaW5kaW5nRW5hYmxlZCkseXQoMSksRHQobmV3IFl0KG89PntsZXQgYT1lLmFib3J0Q29udHJvbGxlci5zaWduYWwscz0oKT0+by5uZXh0KCk7cmV0dXJuIGEuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHMpLCgpPT5hLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixzKX0pLnBpcGUoSygoKT0+IXImJiFlLnRhcmdldFJvdXRlclN0YXRlKSxXKCgpPT57dGhpcy5jYW5jZWxOYXZpZ2F0aW9uVHJhbnNpdGlvbihlLGUuYWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZWFzb24rIiIsQ3QuQWJvcnRlZCl9KSkpLFcoe25leHQ6bz0+e3I9ITAsdGhpcy5sYXN0U3VjY2Vzc2Z1bE5hdmlnYXRpb249dXQodGhpcy5jdXJyZW50TmF2aWdhdGlvbiksdGhpcy5ldmVudHMubmV4dChuZXcganQoby5pZCx0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKG8uZXh0cmFjdGVkVXJsKSx0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKG8udXJsQWZ0ZXJSZWRpcmVjdHMpKSksdGhpcy50aXRsZVN0cmF0ZWd5Py51cGRhdGVUaXRsZShvLnRhcmdldFJvdXRlclN0YXRlLnNuYXBzaG90KSxvLnJlc29sdmUoITApfSxjb21wbGV0ZTooKT0+e3I9ITB9fSksRHQodGhpcy50cmFuc2l0aW9uQWJvcnRXaXRoRXJyb3JTdWJqZWN0LnBpcGUoVyhvPT57dGhyb3cgb30pKSksUWUoKCk9PntyfHx0aGlzLmNhbmNlbE5hdmlnYXRpb25UcmFuc2l0aW9uKGUsIiIsQ3QuU3VwZXJzZWRlZEJ5TmV3TmF2aWdhdGlvbiksdGhpcy5jdXJyZW50VHJhbnNpdGlvbj8uaWQ9PT1lLmlkJiYodGhpcy5jdXJyZW50TmF2aWdhdGlvbi5zZXQobnVsbCksdGhpcy5jdXJyZW50VHJhbnNpdGlvbj1udWxsKX0pLGF0KG89PntpZih0aGlzLmRlc3Ryb3llZClyZXR1cm4gZS5yZXNvbHZlKCExKSxVdDtpZihyPSEwLGFjKG8pKXRoaXMuZXZlbnRzLm5leHQobmV3IFF0KGUuaWQsdGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShlLmV4dHJhY3RlZFVybCksby5tZXNzYWdlLG8uY2FuY2VsbGF0aW9uQ29kZSkpLFBoKG8pP3RoaXMuZXZlbnRzLm5leHQobmV3IGdpKG8udXJsLG8ubmF2aWdhdGlvbkJlaGF2aW9yT3B0aW9ucykpOmUucmVzb2x2ZSghMSk7ZWxzZXtsZXQgYT1uZXcgZmkoZS5pZCx0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKGUuZXh0cmFjdGVkVXJsKSxvLGUudGFyZ2V0U25hcHNob3Q/P3ZvaWQgMCk7dHJ5e2xldCBzPVZ0KHRoaXMuZW52aXJvbm1lbnRJbmplY3RvciwoKT0+dGhpcy5uYXZpZ2F0aW9uRXJyb3JIYW5kbGVyPy4oYSkpO2lmKHMgaW5zdGFuY2VvZiB2aSl7bGV0e21lc3NhZ2U6YyxjYW5jZWxsYXRpb25Db2RlOmR9PUNyKHRoaXMudXJsU2VyaWFsaXplcixzKTt0aGlzLmV2ZW50cy5uZXh0KG5ldyBRdChlLmlkLHRoaXMudXJsU2VyaWFsaXplci5zZXJpYWxpemUoZS5leHRyYWN0ZWRVcmwpLGMsZCkpLHRoaXMuZXZlbnRzLm5leHQobmV3IGdpKHMucmVkaXJlY3RUbyxzLm5hdmlnYXRpb25CZWhhdmlvck9wdGlvbnMpKX1lbHNlIHRocm93IHRoaXMuZXZlbnRzLm5leHQoYSksb31jYXRjaChzKXt0aGlzLm9wdGlvbnMucmVzb2x2ZU5hdmlnYXRpb25Qcm9taXNlT25FcnJvcj9lLnJlc29sdmUoITEpOmUucmVqZWN0KHMpfX1yZXR1cm4gVXR9KSl9KSl9Y2FuY2VsTmF2aWdhdGlvblRyYW5zaXRpb24odCxlLHIpe2xldCBvPW5ldyBRdCh0LmlkLHRoaXMudXJsU2VyaWFsaXplci5zZXJpYWxpemUodC5leHRyYWN0ZWRVcmwpLGUscik7dGhpcy5ldmVudHMubmV4dChvKSx0LnJlc29sdmUoITEpfWlzVXBkYXRpbmdJbnRlcm5hbFN0YXRlKCl7cmV0dXJuIHRoaXMuY3VycmVudFRyYW5zaXRpb24/LmV4dHJhY3RlZFVybC50b1N0cmluZygpIT09dGhpcy5jdXJyZW50VHJhbnNpdGlvbj8uY3VycmVudFVybFRyZWUudG9TdHJpbmcoKX1pc1VwZGF0ZWRCcm93c2VyVXJsKCl7bGV0IHQ9dGhpcy51cmxIYW5kbGluZ1N0cmF0ZWd5LmV4dHJhY3QodGhpcy51cmxTZXJpYWxpemVyLnBhcnNlKHRoaXMubG9jYXRpb24ucGF0aCghMCkpKSxlPXV0KHRoaXMuY3VycmVudE5hdmlnYXRpb24pLHI9ZT8udGFyZ2V0QnJvd3NlclVybD8/ZT8uZXh0cmFjdGVkVXJsO3JldHVybiB0LnRvU3RyaW5nKCkhPT1yPy50b1N0cmluZygpJiYhZT8uZXh0cmFzLnNraXBMb2NhdGlvbkNoYW5nZX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKTt2Yz0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OigpPT5sKEFtKSxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKSx3cj1jbGFzc3tzaG91bGREZXRhY2gobil7cmV0dXJuITF9c3RvcmUobix0KXt9c2hvdWxkQXR0YWNoKG4pe3JldHVybiExfXJldHJpZXZlKG4pe3JldHVybiBudWxsfXNob3VsZFJldXNlUm91dGUobix0KXtyZXR1cm4gbi5yb3V0ZUNvbmZpZz09PXQucm91dGVDb25maWd9fSxBbT0oKCk9PntjbGFzcyBpIGV4dGVuZHMgd3J7c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgdDtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuKHR8fCh0PVooaSkpKShyfHxpKX19KSgpO3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKSxfYz0oKCk9PntjbGFzcyBpe3VybFNlcmlhbGl6ZXI9bChCZSk7b3B0aW9ucz1sKGJlLHtvcHRpb25hbDohMH0pfHx7fTtjYW5jZWxlZE5hdmlnYXRpb25SZXNvbHV0aW9uPXRoaXMub3B0aW9ucy5jYW5jZWxlZE5hdmlnYXRpb25SZXNvbHV0aW9ufHwicmVwbGFjZSI7bG9jYXRpb249bChmZSk7dXJsSGFuZGxpbmdTdHJhdGVneT1sKERyKTt1cmxVcGRhdGVTdHJhdGVneT10aGlzLm9wdGlvbnMudXJsVXBkYXRlU3RyYXRlZ3l8fCJkZWZlcnJlZCI7Y3VycmVudFVybFRyZWU9bmV3IEp0O2dldEN1cnJlbnRVcmxUcmVlKCl7cmV0dXJuIHRoaXMuY3VycmVudFVybFRyZWV9cmF3VXJsVHJlZT10aGlzLmN1cnJlbnRVcmxUcmVlO2dldFJhd1VybFRyZWUoKXtyZXR1cm4gdGhpcy5yYXdVcmxUcmVlfWNyZWF0ZUJyb3dzZXJQYXRoKHtmaW5hbFVybDp0LGluaXRpYWxVcmw6ZSx0YXJnZXRCcm93c2VyVXJsOnJ9KXtsZXQgbz10IT09dm9pZCAwP3RoaXMudXJsSGFuZGxpbmdTdHJhdGVneS5tZXJnZSh0LGUpOmUsYT1yPz9vO3JldHVybiBhIGluc3RhbmNlb2YgSnQ/dGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZShhKTphfWNvbW1pdFRyYW5zaXRpb24oe3RhcmdldFJvdXRlclN0YXRlOnQsZmluYWxVcmw6ZSxpbml0aWFsVXJsOnJ9KXtlJiZ0Pyh0aGlzLmN1cnJlbnRVcmxUcmVlPWUsdGhpcy5yYXdVcmxUcmVlPXRoaXMudXJsSGFuZGxpbmdTdHJhdGVneS5tZXJnZShlLHIpLHRoaXMucm91dGVyU3RhdGU9dCk6dGhpcy5yYXdVcmxUcmVlPXJ9cm91dGVyU3RhdGU9dGMobnVsbCk7Z2V0Um91dGVyU3RhdGUoKXtyZXR1cm4gdGhpcy5yb3V0ZXJTdGF0ZX1zdGF0ZU1lbWVudG89dGhpcy5jcmVhdGVTdGF0ZU1lbWVudG8oKTt1cGRhdGVTdGF0ZU1lbWVudG8oKXt0aGlzLnN0YXRlTWVtZW50bz10aGlzLmNyZWF0ZVN0YXRlTWVtZW50bygpfWNyZWF0ZVN0YXRlTWVtZW50bygpe3JldHVybntyYXdVcmxUcmVlOnRoaXMucmF3VXJsVHJlZSxjdXJyZW50VXJsVHJlZTp0aGlzLmN1cnJlbnRVcmxUcmVlLHJvdXRlclN0YXRlOnRoaXMucm91dGVyU3RhdGV9fXJlc2V0SW50ZXJuYWxTdGF0ZSh7ZmluYWxVcmw6dH0pe3RoaXMucm91dGVyU3RhdGU9dGhpcy5zdGF0ZU1lbWVudG8ucm91dGVyU3RhdGUsdGhpcy5jdXJyZW50VXJsVHJlZT10aGlzLnN0YXRlTWVtZW50by5jdXJyZW50VXJsVHJlZSx0aGlzLnJhd1VybFRyZWU9dGhpcy51cmxIYW5kbGluZ1N0cmF0ZWd5Lm1lcmdlKHRoaXMuY3VycmVudFVybFRyZWUsdD8/dGhpcy5yYXdVcmxUcmVlKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTooKT0+bChNbSkscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCksTW09KCgpPT57Y2xhc3MgaSBleHRlbmRzIF9je2N1cnJlbnRQYWdlSWQ9MDtsYXN0U3VjY2Vzc2Z1bElkPS0xO3Jlc3RvcmVkU3RhdGUoKXtyZXR1cm4gdGhpcy5sb2NhdGlvbi5nZXRTdGF0ZSgpfWdldCBicm93c2VyUGFnZUlkKCl7cmV0dXJuIHRoaXMuY2FuY2VsZWROYXZpZ2F0aW9uUmVzb2x1dGlvbiE9PSJjb21wdXRlZCI/dGhpcy5jdXJyZW50UGFnZUlkOnRoaXMucmVzdG9yZWRTdGF0ZSgpPy5cdTAyNzVyb3V0ZXJQYWdlSWQ/P3RoaXMuY3VycmVudFBhZ2VJZH1yZWdpc3Rlck5vblJvdXRlckN1cnJlbnRFbnRyeUNoYW5nZUxpc3RlbmVyKHQpe3JldHVybiB0aGlzLmxvY2F0aW9uLnN1YnNjcmliZShlPT57ZS50eXBlPT09InBvcHN0YXRlIiYmc2V0VGltZW91dCgoKT0+e3QoZS51cmwsZS5zdGF0ZSwicG9wc3RhdGUiKX0pfSl9aGFuZGxlUm91dGVyRXZlbnQodCxlKXt0IGluc3RhbmNlb2YgX2U/dGhpcy51cGRhdGVTdGF0ZU1lbWVudG8oKTp0IGluc3RhbmNlb2YgdGU/dGhpcy5jb21taXRUcmFuc2l0aW9uKGUpOnQgaW5zdGFuY2VvZiBlbj90aGlzLnVybFVwZGF0ZVN0cmF0ZWd5PT09ImVhZ2VyIiYmKGUuZXh0cmFzLnNraXBMb2NhdGlvbkNoYW5nZXx8dGhpcy5zZXRCcm93c2VyVXJsKHRoaXMuY3JlYXRlQnJvd3NlclBhdGgoZSksZSkpOnQgaW5zdGFuY2VvZiBubj8odGhpcy5jb21taXRUcmFuc2l0aW9uKGUpLHRoaXMudXJsVXBkYXRlU3RyYXRlZ3k9PT0iZGVmZXJyZWQiJiYhZS5leHRyYXMuc2tpcExvY2F0aW9uQ2hhbmdlJiZ0aGlzLnNldEJyb3dzZXJVcmwodGhpcy5jcmVhdGVCcm93c2VyUGF0aChlKSxlKSk6dCBpbnN0YW5jZW9mIFF0JiZ0LmNvZGUhPT1DdC5TdXBlcnNlZGVkQnlOZXdOYXZpZ2F0aW9uJiZ0LmNvZGUhPT1DdC5SZWRpcmVjdD90aGlzLnJlc3RvcmVIaXN0b3J5KGUpOnQgaW5zdGFuY2VvZiBmaT90aGlzLnJlc3RvcmVIaXN0b3J5KGUsITApOnQgaW5zdGFuY2VvZiBqdCYmKHRoaXMubGFzdFN1Y2Nlc3NmdWxJZD10LmlkLHRoaXMuY3VycmVudFBhZ2VJZD10aGlzLmJyb3dzZXJQYWdlSWQpfXNldEJyb3dzZXJVcmwodCx7ZXh0cmFzOmUsaWQ6cn0pe2xldHtyZXBsYWNlVXJsOm8sc3RhdGU6YX09ZTtpZih0aGlzLmxvY2F0aW9uLmlzQ3VycmVudFBhdGhFcXVhbFRvKHQpfHxvKXtsZXQgcz10aGlzLmJyb3dzZXJQYWdlSWQsYz1oKGgoe30sYSksdGhpcy5nZW5lcmF0ZU5nUm91dGVyU3RhdGUocixzKSk7dGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUodCwiIixjKX1lbHNle2xldCBzPWgoaCh7fSxhKSx0aGlzLmdlbmVyYXRlTmdSb3V0ZXJTdGF0ZShyLHRoaXMuYnJvd3NlclBhZ2VJZCsxKSk7dGhpcy5sb2NhdGlvbi5nbyh0LCIiLHMpfX1yZXN0b3JlSGlzdG9yeSh0LGU9ITEpe2lmKHRoaXMuY2FuY2VsZWROYXZpZ2F0aW9uUmVzb2x1dGlvbj09PSJjb21wdXRlZCIpe2xldCByPXRoaXMuYnJvd3NlclBhZ2VJZCxvPXRoaXMuY3VycmVudFBhZ2VJZC1yO28hPT0wP3RoaXMubG9jYXRpb24uaGlzdG9yeUdvKG8pOnRoaXMuZ2V0Q3VycmVudFVybFRyZWUoKT09PXQuZmluYWxVcmwmJm89PT0wJiYodGhpcy5yZXNldEludGVybmFsU3RhdGUodCksdGhpcy5yZXNldFVybFRvQ3VycmVudFVybFRyZWUoKSl9ZWxzZSB0aGlzLmNhbmNlbGVkTmF2aWdhdGlvblJlc29sdXRpb249PT0icmVwbGFjZSImJihlJiZ0aGlzLnJlc2V0SW50ZXJuYWxTdGF0ZSh0KSx0aGlzLnJlc2V0VXJsVG9DdXJyZW50VXJsVHJlZSgpKX1yZXNldFVybFRvQ3VycmVudFVybFRyZWUoKXt0aGlzLmxvY2F0aW9uLnJlcGxhY2VTdGF0ZSh0aGlzLnVybFNlcmlhbGl6ZXIuc2VyaWFsaXplKHRoaXMuZ2V0UmF3VXJsVHJlZSgpKSwiIix0aGlzLmdlbmVyYXRlTmdSb3V0ZXJTdGF0ZSh0aGlzLmxhc3RTdWNjZXNzZnVsSWQsdGhpcy5jdXJyZW50UGFnZUlkKSl9Z2VuZXJhdGVOZ1JvdXRlclN0YXRlKHQsZSl7cmV0dXJuIHRoaXMuY2FuY2VsZWROYXZpZ2F0aW9uUmVzb2x1dGlvbj09PSJjb21wdXRlZCI/e25hdmlnYXRpb25JZDp0LFx1MDI3NXJvdXRlclBhZ2VJZDplfTp7bmF2aWdhdGlvbklkOnR9fXN0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybih0fHwodD1aKGkpKSkocnx8aSl9fSkoKTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCk7SW09e3BhdGhzOiJleGFjdCIsZnJhZ21lbnQ6Imlnbm9yZWQiLG1hdHJpeFBhcmFtczoiaWdub3JlZCIscXVlcnlQYXJhbXM6ImV4YWN0In0sT209e3BhdGhzOiJzdWJzZXQiLGZyYWdtZW50OiJpZ25vcmVkIixtYXRyaXhQYXJhbXM6Imlnbm9yZWQiLHF1ZXJ5UGFyYW1zOiJzdWJzZXQifSxhZT0oKCk9PntjbGFzcyBpe2dldCBjdXJyZW50VXJsVHJlZSgpe3JldHVybiB0aGlzLnN0YXRlTWFuYWdlci5nZXRDdXJyZW50VXJsVHJlZSgpfWdldCByYXdVcmxUcmVlKCl7cmV0dXJuIHRoaXMuc3RhdGVNYW5hZ2VyLmdldFJhd1VybFRyZWUoKX1kaXNwb3NlZD0hMTtub25Sb3V0ZXJDdXJyZW50RW50cnlDaGFuZ2VTdWJzY3JpcHRpb247Y29uc29sZT1sKG9sKTtzdGF0ZU1hbmFnZXI9bChfYyk7b3B0aW9ucz1sKGJlLHtvcHRpb25hbDohMH0pfHx7fTtwZW5kaW5nVGFza3M9bChLcyk7dXJsVXBkYXRlU3RyYXRlZ3k9dGhpcy5vcHRpb25zLnVybFVwZGF0ZVN0cmF0ZWd5fHwiZGVmZXJyZWQiO25hdmlnYXRpb25UcmFuc2l0aW9ucz1sKFJyKTt1cmxTZXJpYWxpemVyPWwoQmUpO2xvY2F0aW9uPWwoZmUpO3VybEhhbmRsaW5nU3RyYXRlZ3k9bChEcik7aW5qZWN0b3I9bChJdCk7X2V2ZW50cz1uZXcgeTtnZXQgZXZlbnRzKCl7cmV0dXJuIHRoaXMuX2V2ZW50c31nZXQgcm91dGVyU3RhdGUoKXtyZXR1cm4gdGhpcy5zdGF0ZU1hbmFnZXIuZ2V0Um91dGVyU3RhdGUoKX1uYXZpZ2F0ZWQ9ITE7cm91dGVSZXVzZVN0cmF0ZWd5PWwodmMpO29uU2FtZVVybE5hdmlnYXRpb249dGhpcy5vcHRpb25zLm9uU2FtZVVybE5hdmlnYXRpb258fCJpZ25vcmUiO2NvbmZpZz1sKENpLHtvcHRpb25hbDohMH0pPy5mbGF0KCk/P1tdO2NvbXBvbmVudElucHV0QmluZGluZ0VuYWJsZWQ9ISFsKGRuLHtvcHRpb25hbDohMH0pO2N1cnJlbnROYXZpZ2F0aW9uPXRoaXMubmF2aWdhdGlvblRyYW5zaXRpb25zLmN1cnJlbnROYXZpZ2F0aW9uLmFzUmVhZG9ubHkoKTtjb25zdHJ1Y3Rvcigpe3RoaXMucmVzZXRDb25maWcodGhpcy5jb25maWcpLHRoaXMubmF2aWdhdGlvblRyYW5zaXRpb25zLnNldHVwTmF2aWdhdGlvbnModGhpcykuc3Vic2NyaWJlKHtlcnJvcjp0PT57dGhpcy5jb25zb2xlLndhcm4odCl9fSksdGhpcy5zdWJzY3JpYmVUb05hdmlnYXRpb25FdmVudHMoKX1ldmVudHNTdWJzY3JpcHRpb249bmV3IGZ0O3N1YnNjcmliZVRvTmF2aWdhdGlvbkV2ZW50cygpe2xldCB0PXRoaXMubmF2aWdhdGlvblRyYW5zaXRpb25zLmV2ZW50cy5zdWJzY3JpYmUoZT0+e3RyeXtsZXQgcj10aGlzLm5hdmlnYXRpb25UcmFuc2l0aW9ucy5jdXJyZW50VHJhbnNpdGlvbixvPXV0KHRoaXMubmF2aWdhdGlvblRyYW5zaXRpb25zLmN1cnJlbnROYXZpZ2F0aW9uKTtpZihyIT09bnVsbCYmbyE9PW51bGwpe2lmKHRoaXMuc3RhdGVNYW5hZ2VyLmhhbmRsZVJvdXRlckV2ZW50KGUsbyksZSBpbnN0YW5jZW9mIFF0JiZlLmNvZGUhPT1DdC5SZWRpcmVjdCYmZS5jb2RlIT09Q3QuU3VwZXJzZWRlZEJ5TmV3TmF2aWdhdGlvbil0aGlzLm5hdmlnYXRlZD0hMDtlbHNlIGlmKGUgaW5zdGFuY2VvZiBqdCl0aGlzLm5hdmlnYXRlZD0hMDtlbHNlIGlmKGUgaW5zdGFuY2VvZiBnaSl7bGV0IGE9ZS5uYXZpZ2F0aW9uQmVoYXZpb3JPcHRpb25zLHM9dGhpcy51cmxIYW5kbGluZ1N0cmF0ZWd5Lm1lcmdlKGUudXJsLHIuY3VycmVudFJhd1VybCksYz1oKHticm93c2VyVXJsOnIuZXh0cmFzLmJyb3dzZXJVcmwsaW5mbzpyLmV4dHJhcy5pbmZvLHNraXBMb2NhdGlvbkNoYW5nZTpyLmV4dHJhcy5za2lwTG9jYXRpb25DaGFuZ2UscmVwbGFjZVVybDpyLmV4dHJhcy5yZXBsYWNlVXJsfHx0aGlzLnVybFVwZGF0ZVN0cmF0ZWd5PT09ImVhZ2VyInx8Um0oci5zb3VyY2UpfSxhKTt0aGlzLnNjaGVkdWxlTmF2aWdhdGlvbihzLHVpLG51bGwsYyx7cmVzb2x2ZTpyLnJlc29sdmUscmVqZWN0OnIucmVqZWN0LHByb21pc2U6ci5wcm9taXNlfSl9fU1oKGUpJiZ0aGlzLl9ldmVudHMubmV4dChlKX1jYXRjaChyKXt0aGlzLm5hdmlnYXRpb25UcmFuc2l0aW9ucy50cmFuc2l0aW9uQWJvcnRXaXRoRXJyb3JTdWJqZWN0Lm5leHQocil9fSk7dGhpcy5ldmVudHNTdWJzY3JpcHRpb24uYWRkKHQpfXJlc2V0Um9vdENvbXBvbmVudFR5cGUodCl7dGhpcy5yb3V0ZXJTdGF0ZS5yb290LmNvbXBvbmVudD10LHRoaXMubmF2aWdhdGlvblRyYW5zaXRpb25zLnJvb3RDb21wb25lbnRUeXBlPXR9aW5pdGlhbE5hdmlnYXRpb24oKXt0aGlzLnNldFVwTG9jYXRpb25DaGFuZ2VMaXN0ZW5lcigpLHRoaXMubmF2aWdhdGlvblRyYW5zaXRpb25zLmhhc1JlcXVlc3RlZE5hdmlnYXRpb258fHRoaXMubmF2aWdhdGVUb1N5bmNXaXRoQnJvd3Nlcih0aGlzLmxvY2F0aW9uLnBhdGgoITApLHVpLHRoaXMuc3RhdGVNYW5hZ2VyLnJlc3RvcmVkU3RhdGUoKSl9c2V0VXBMb2NhdGlvbkNoYW5nZUxpc3RlbmVyKCl7dGhpcy5ub25Sb3V0ZXJDdXJyZW50RW50cnlDaGFuZ2VTdWJzY3JpcHRpb24/Pz10aGlzLnN0YXRlTWFuYWdlci5yZWdpc3Rlck5vblJvdXRlckN1cnJlbnRFbnRyeUNoYW5nZUxpc3RlbmVyKCh0LGUscik9Pnt0aGlzLm5hdmlnYXRlVG9TeW5jV2l0aEJyb3dzZXIodCxyLGUpfSl9bmF2aWdhdGVUb1N5bmNXaXRoQnJvd3Nlcih0LGUscil7bGV0IG89e3JlcGxhY2VVcmw6ITB9LGE9cj8ubmF2aWdhdGlvbklkP3I6bnVsbDtpZihyKXtsZXQgYz1oKHt9LHIpO2RlbGV0ZSBjLm5hdmlnYXRpb25JZCxkZWxldGUgYy5cdTAyNzVyb3V0ZXJQYWdlSWQsT2JqZWN0LmtleXMoYykubGVuZ3RoIT09MCYmKG8uc3RhdGU9Yyl9bGV0IHM9dGhpcy5wYXJzZVVybCh0KTt0aGlzLnNjaGVkdWxlTmF2aWdhdGlvbihzLGUsYSxvKS5jYXRjaChjPT57dGhpcy5kaXNwb3NlZHx8dGhpcy5pbmplY3Rvci5nZXQoJG4pKGMpfSl9Z2V0IHVybCgpe3JldHVybiB0aGlzLnNlcmlhbGl6ZVVybCh0aGlzLmN1cnJlbnRVcmxUcmVlKX1nZXRDdXJyZW50TmF2aWdhdGlvbigpe3JldHVybiB1dCh0aGlzLm5hdmlnYXRpb25UcmFuc2l0aW9ucy5jdXJyZW50TmF2aWdhdGlvbil9Z2V0IGxhc3RTdWNjZXNzZnVsTmF2aWdhdGlvbigpe3JldHVybiB0aGlzLm5hdmlnYXRpb25UcmFuc2l0aW9ucy5sYXN0U3VjY2Vzc2Z1bE5hdmlnYXRpb259cmVzZXRDb25maWcodCl7dGhpcy5jb25maWc9dC5tYXAodmEpLHRoaXMubmF2aWdhdGVkPSExfW5nT25EZXN0cm95KCl7dGhpcy5kaXNwb3NlKCl9ZGlzcG9zZSgpe3RoaXMuX2V2ZW50cy51bnN1YnNjcmliZSgpLHRoaXMubmF2aWdhdGlvblRyYW5zaXRpb25zLmNvbXBsZXRlKCksdGhpcy5ub25Sb3V0ZXJDdXJyZW50RW50cnlDaGFuZ2VTdWJzY3JpcHRpb24mJih0aGlzLm5vblJvdXRlckN1cnJlbnRFbnRyeUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMubm9uUm91dGVyQ3VycmVudEVudHJ5Q2hhbmdlU3Vic2NyaXB0aW9uPXZvaWQgMCksdGhpcy5kaXNwb3NlZD0hMCx0aGlzLmV2ZW50c1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfWNyZWF0ZVVybFRyZWUodCxlPXt9KXtsZXR7cmVsYXRpdmVUbzpyLHF1ZXJ5UGFyYW1zOm8sZnJhZ21lbnQ6YSxxdWVyeVBhcmFtc0hhbmRsaW5nOnMscHJlc2VydmVGcmFnbWVudDpjfT1lLGQ9Yz90aGlzLmN1cnJlbnRVcmxUcmVlLmZyYWdtZW50OmEsdT1udWxsO3N3aXRjaChzPz90aGlzLm9wdGlvbnMuZGVmYXVsdFF1ZXJ5UGFyYW1zSGFuZGxpbmcpe2Nhc2UibWVyZ2UiOnU9aChoKHt9LHRoaXMuY3VycmVudFVybFRyZWUucXVlcnlQYXJhbXMpLG8pO2JyZWFrO2Nhc2UicHJlc2VydmUiOnU9dGhpcy5jdXJyZW50VXJsVHJlZS5xdWVyeVBhcmFtczticmVhaztkZWZhdWx0OnU9b3x8bnVsbH11IT09bnVsbCYmKHU9dGhpcy5yZW1vdmVFbXB0eVByb3BzKHUpKTtsZXQgeDt0cnl7bGV0IGo9cj9yLnNuYXBzaG90OnRoaXMucm91dGVyU3RhdGUuc25hcHNob3Qucm9vdDt4PVpsKGopfWNhdGNoeyh0eXBlb2YgdFswXSE9InN0cmluZyJ8fHRbMF1bMF0hPT0iLyIpJiYodD1bXSkseD10aGlzLmN1cnJlbnRVcmxUcmVlLnJvb3R9cmV0dXJuIFhsKHgsdCx1LGQ/P251bGwpfW5hdmlnYXRlQnlVcmwodCxlPXtza2lwTG9jYXRpb25DaGFuZ2U6ITF9KXtsZXQgcj12ZSh0KT90OnRoaXMucGFyc2VVcmwodCksbz10aGlzLnVybEhhbmRsaW5nU3RyYXRlZ3kubWVyZ2Uocix0aGlzLnJhd1VybFRyZWUpO3JldHVybiB0aGlzLnNjaGVkdWxlTmF2aWdhdGlvbihvLHVpLG51bGwsZSl9bmF2aWdhdGUodCxlPXtza2lwTG9jYXRpb25DaGFuZ2U6ITF9KXtyZXR1cm4ga20odCksdGhpcy5uYXZpZ2F0ZUJ5VXJsKHRoaXMuY3JlYXRlVXJsVHJlZSh0LGUpLGUpfXNlcmlhbGl6ZVVybCh0KXtyZXR1cm4gdGhpcy51cmxTZXJpYWxpemVyLnNlcmlhbGl6ZSh0KX1wYXJzZVVybCh0KXt0cnl7cmV0dXJuIHRoaXMudXJsU2VyaWFsaXplci5wYXJzZSh0KX1jYXRjaHtyZXR1cm4gdGhpcy5jb25zb2xlLndhcm4ocXMoNDAxOCwhMSkpLHRoaXMudXJsU2VyaWFsaXplci5wYXJzZSgiLyIpfX1pc0FjdGl2ZSh0LGUpe2xldCByO2lmKGU9PT0hMD9yPWgoe30sSW0pOmU9PT0hMT9yPWgoe30sT20pOnI9ZSx2ZSh0KSlyZXR1cm4gT2wodGhpcy5jdXJyZW50VXJsVHJlZSx0LHIpO2xldCBvPXRoaXMucGFyc2VVcmwodCk7cmV0dXJuIE9sKHRoaXMuY3VycmVudFVybFRyZWUsbyxyKX1yZW1vdmVFbXB0eVByb3BzKHQpe3JldHVybiBPYmplY3QuZW50cmllcyh0KS5yZWR1Y2UoKGUsW3Isb10pPT4obyE9bnVsbCYmKGVbcl09byksZSkse30pfXNjaGVkdWxlTmF2aWdhdGlvbih0LGUscixvLGEpe2lmKHRoaXMuZGlzcG9zZWQpcmV0dXJuIFByb21pc2UucmVzb2x2ZSghMSk7bGV0IHMsYyxkO2E/KHM9YS5yZXNvbHZlLGM9YS5yZWplY3QsZD1hLnByb21pc2UpOmQ9bmV3IFByb21pc2UoKHgsaik9PntzPXgsYz1qfSk7bGV0IHU9dGhpcy5wZW5kaW5nVGFza3MuYWRkKCk7cmV0dXJuIEFyKHRoaXMsKCk9PntxdWV1ZU1pY3JvdGFzaygoKT0+dGhpcy5wZW5kaW5nVGFza3MucmVtb3ZlKHUpKX0pLHRoaXMubmF2aWdhdGlvblRyYW5zaXRpb25zLmhhbmRsZU5hdmlnYXRpb25SZXF1ZXN0KHtzb3VyY2U6ZSxyZXN0b3JlZFN0YXRlOnIsY3VycmVudFVybFRyZWU6dGhpcy5jdXJyZW50VXJsVHJlZSxjdXJyZW50UmF3VXJsOnRoaXMuY3VycmVudFVybFRyZWUscmF3VXJsOnQsZXh0cmFzOm8scmVzb2x2ZTpzLHJlamVjdDpjLHByb21pc2U6ZCxjdXJyZW50U25hcHNob3Q6dGhpcy5yb3V0ZXJTdGF0ZS5zbmFwc2hvdCxjdXJyZW50Um91dGVyU3RhdGU6dGhpcy5yb3V0ZXJTdGF0ZX0pLGQuY2F0Y2goeD0+UHJvbWlzZS5yZWplY3QoeCkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7ZnVuY3Rpb24gRm0oaSl7cmV0dXJuIGkucm91dGVyU3RhdGUucm9vdH1mdW5jdGlvbiBtbihpLG4pe3JldHVybntcdTAyNzVraW5kOmksXHUwMjc1cHJvdmlkZXJzOm59fWZ1bmN0aW9uIE5tKCl7bGV0IGk9bChOKTtyZXR1cm4gbj0+e2xldCB0PWkuZ2V0KGllKTtpZihuIT09dC5jb21wb25lbnRzWzBdKXJldHVybjtsZXQgZT1pLmdldChhZSkscj1pLmdldCh4Yyk7aS5nZXQoRWEpPT09MSYmZS5pbml0aWFsTmF2aWdhdGlvbigpLGkuZ2V0KFNjLG51bGwse29wdGlvbmFsOiEwfSk/LnNldFVwUHJlbG9hZGluZygpLGkuZ2V0KENjLG51bGwse29wdGlvbmFsOiEwfSk/LmluaXQoKSxlLnJlc2V0Um9vdENvbXBvbmVudFR5cGUodC5jb21wb25lbnRUeXBlc1swXSksci5jbG9zZWR8fChyLm5leHQoKSxyLmNvbXBsZXRlKCksci51bnN1YnNjcmliZSgpKX19ZnVuY3Rpb24gd2MoKXtsZXQgaT1be3Byb3ZpZGU6SnMsdXNlVmFsdWU6ITB9LHtwcm92aWRlOkVhLHVzZVZhbHVlOjB9LExvKCgpPT57bGV0IG49bChOKTtyZXR1cm4gbi5nZXQoZ2wsUHJvbWlzZS5yZXNvbHZlKCkpLnRoZW4oKCk9Pm5ldyBQcm9taXNlKGU9PntsZXQgcj1uLmdldChhZSksbz1uLmdldCh4Yyk7QXIociwoKT0+e2UoITApfSksbi5nZXQoUnIpLmFmdGVyUHJlYWN0aXZhdGlvbj0oKT0+KGUoITApLG8uY2xvc2VkP2codm9pZCAwKTpvKSxyLmluaXRpYWxOYXZpZ2F0aW9uKCl9KSl9KV07cmV0dXJuIG1uKDIsaSl9ZnVuY3Rpb24gRWMoKXtsZXQgaT1bTG8oKCk9PntsKGFlKS5zZXRVcExvY2F0aW9uQ2hhbmdlTGlzdGVuZXIoKX0pLHtwcm92aWRlOkVhLHVzZVZhbHVlOjJ9XTtyZXR1cm4gbW4oMyxpKX1mdW5jdGlvbiBEYyhpKXtyZXR1cm4gbW4oMCxbe3Byb3ZpZGU6U2MsdXNlRXhpc3Rpbmc6eWN9LHtwcm92aWRlOmhuLHVzZUV4aXN0aW5nOml9XSl9ZnVuY3Rpb24gUmMoKXtyZXR1cm4gbW4oOCxbcGEse3Byb3ZpZGU6ZG4sdXNlRXhpc3Rpbmc6cGF9XSl9ZnVuY3Rpb24gQWMoaSl7ZWwoIk5nUm91dGVyVmlld1RyYW5zaXRpb25zIik7bGV0IG49W3twcm92aWRlOmJhLHVzZVZhbHVlOmdjfSx7cHJvdmlkZTp5YSx1c2VWYWx1ZTpoKHtza2lwTmV4dFRyYW5zaXRpb246ISFpPy5za2lwSW5pdGlhbFRyYW5zaXRpb259LGkpfV07cmV0dXJuIG1uKDksbil9ZnVuY3Rpb24gTG0oKXtyZXR1cm57cHJvdmlkZTpDYyx1c2VGYWN0b3J5OigpPT57bGV0IGk9bChDbCksbj1sKEUpLHQ9bChiZSksZT1sKFJyKSxyPWwoQmUpO3JldHVybiB0LnNjcm9sbE9mZnNldCYmaS5zZXRPZmZzZXQodC5zY3JvbGxPZmZzZXQpLG5ldyBUbShyLGUsaSxuLHQpfX19ZnVuY3Rpb24gVm0oKXtyZXR1cm57cHJvdmlkZTpxaSx1c2VDbGFzczpfbH19ZnVuY3Rpb24gam0oKXtyZXR1cm57cHJvdmlkZTpxaSx1c2VDbGFzczp2bH19ZnVuY3Rpb24gQm0oaSl7cmV0dXJuW2kuaW5pdGlhbE5hdmlnYXRpb249PT0iZGlzYWJsZWQiP0VjKCkuXHUwMjc1cHJvdmlkZXJzOltdLGkuaW5pdGlhbE5hdmlnYXRpb249PT0iZW5hYmxlZEJsb2NraW5nIj93YygpLlx1MDI3NXByb3ZpZGVyczpbXV19ZnVuY3Rpb24gem0oKXtyZXR1cm5be3Byb3ZpZGU6d2EsdXNlRmFjdG9yeTpObX0se3Byb3ZpZGU6YWwsbXVsdGk6ITAsdXNlRXhpc3Rpbmc6d2F9XX12YXIgYmMsaG4seWMsQ2MsVG0seGMsRWEsU2MsTWMsUG0sd2EsSWM9XygoKT0+e1BlKCk7UGUoKTtmKCk7ZigpO3hhKCk7bnQoKTtodCgpO2JjPSgoKT0+e2NsYXNzIGl7cm91dGVyO3JvdXRlO3RhYkluZGV4QXR0cmlidXRlO3JlbmRlcmVyO2VsO2xvY2F0aW9uU3RyYXRlZ3k7cmVhY3RpdmVIcmVmPUoobnVsbCk7Z2V0IGhyZWYoKXtyZXR1cm4gdXQodGhpcy5yZWFjdGl2ZUhyZWYpfXNldCBocmVmKHQpe3RoaXMucmVhY3RpdmVIcmVmLnNldCh0KX10YXJnZXQ7cXVlcnlQYXJhbXM7ZnJhZ21lbnQ7cXVlcnlQYXJhbXNIYW5kbGluZztzdGF0ZTtpbmZvO3JlbGF0aXZlVG87aXNBbmNob3JFbGVtZW50O3N1YnNjcmlwdGlvbjtvbkNoYW5nZXM9bmV3IHk7YXBwbGljYXRpb25FcnJvckhhbmRsZXI9bCgkbik7b3B0aW9ucz1sKGJlLHtvcHRpb25hbDohMH0pO2NvbnN0cnVjdG9yKHQsZSxyLG8sYSxzKXt0aGlzLnJvdXRlcj10LHRoaXMucm91dGU9ZSx0aGlzLnRhYkluZGV4QXR0cmlidXRlPXIsdGhpcy5yZW5kZXJlcj1vLHRoaXMuZWw9YSx0aGlzLmxvY2F0aW9uU3RyYXRlZ3k9cyx0aGlzLnJlYWN0aXZlSHJlZi5zZXQobChuZXcgWG4oImhyZWYiKSx7b3B0aW9uYWw6ITB9KSk7bGV0IGM9YS5uYXRpdmVFbGVtZW50LnRhZ05hbWU/LnRvTG93ZXJDYXNlKCk7dGhpcy5pc0FuY2hvckVsZW1lbnQ9Yz09PSJhInx8Yz09PSJhcmVhInx8ISEodHlwZW9mIGN1c3RvbUVsZW1lbnRzPT0ib2JqZWN0IiYmY3VzdG9tRWxlbWVudHMuZ2V0KGMpPy5vYnNlcnZlZEF0dHJpYnV0ZXM/LmluY2x1ZGVzPy4oImhyZWYiKSksdGhpcy5pc0FuY2hvckVsZW1lbnQ/dGhpcy5zZXRUYWJJbmRleElmTm90T25OYXRpdmVFbCgiMCIpOnRoaXMuc3Vic2NyaWJlVG9OYXZpZ2F0aW9uRXZlbnRzSWZOZWNlc3NhcnkoKX1zdWJzY3JpYmVUb05hdmlnYXRpb25FdmVudHNJZk5lY2Vzc2FyeSgpe2lmKHRoaXMuc3Vic2NyaXB0aW9uIT09dm9pZCAwfHwhdGhpcy5pc0FuY2hvckVsZW1lbnQpcmV0dXJuO2xldCB0PXRoaXMucHJlc2VydmVGcmFnbWVudCxlPXI9PnI9PT0ibWVyZ2UifHxyPT09InByZXNlcnZlIjt0fHw9ZSh0aGlzLnF1ZXJ5UGFyYW1zSGFuZGxpbmcpLHR8fD0hdGhpcy5xdWVyeVBhcmFtc0hhbmRsaW5nJiYhZSh0aGlzLm9wdGlvbnM/LmRlZmF1bHRRdWVyeVBhcmFtc0hhbmRsaW5nKSx0JiYodGhpcy5zdWJzY3JpcHRpb249dGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShyPT57ciBpbnN0YW5jZW9mIGp0JiZ0aGlzLnVwZGF0ZUhyZWYoKX0pKX1wcmVzZXJ2ZUZyYWdtZW50PSExO3NraXBMb2NhdGlvbkNoYW5nZT0hMTtyZXBsYWNlVXJsPSExO3NldFRhYkluZGV4SWZOb3RPbk5hdGl2ZUVsKHQpe3RoaXMudGFiSW5kZXhBdHRyaWJ1dGUhPW51bGx8fHRoaXMuaXNBbmNob3JFbGVtZW50fHx0aGlzLmFwcGx5QXR0cmlidXRlVmFsdWUoInRhYmluZGV4Iix0KX1uZ09uQ2hhbmdlcyh0KXt0aGlzLmlzQW5jaG9yRWxlbWVudCYmKHRoaXMudXBkYXRlSHJlZigpLHRoaXMuc3Vic2NyaWJlVG9OYXZpZ2F0aW9uRXZlbnRzSWZOZWNlc3NhcnkoKSksdGhpcy5vbkNoYW5nZXMubmV4dCh0aGlzKX1yb3V0ZXJMaW5rSW5wdXQ9bnVsbDtzZXQgcm91dGVyTGluayh0KXt0PT1udWxsPyh0aGlzLnJvdXRlckxpbmtJbnB1dD1udWxsLHRoaXMuc2V0VGFiSW5kZXhJZk5vdE9uTmF0aXZlRWwobnVsbCkpOih2ZSh0KT90aGlzLnJvdXRlckxpbmtJbnB1dD10OnRoaXMucm91dGVyTGlua0lucHV0PUFycmF5LmlzQXJyYXkodCk/dDpbdF0sdGhpcy5zZXRUYWJJbmRleElmTm90T25OYXRpdmVFbCgiMCIpKX1vbkNsaWNrKHQsZSxyLG8sYSl7bGV0IHM9dGhpcy51cmxUcmVlO2lmKHM9PT1udWxsfHx0aGlzLmlzQW5jaG9yRWxlbWVudCYmKHQhPT0wfHxlfHxyfHxvfHxhfHx0eXBlb2YgdGhpcy50YXJnZXQ9PSJzdHJpbmciJiZ0aGlzLnRhcmdldCE9Il9zZWxmIikpcmV0dXJuITA7bGV0IGM9e3NraXBMb2NhdGlvbkNoYW5nZTp0aGlzLnNraXBMb2NhdGlvbkNoYW5nZSxyZXBsYWNlVXJsOnRoaXMucmVwbGFjZVVybCxzdGF0ZTp0aGlzLnN0YXRlLGluZm86dGhpcy5pbmZvfTtyZXR1cm4gdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChzLGMpPy5jYXRjaChkPT57dGhpcy5hcHBsaWNhdGlvbkVycm9ySGFuZGxlcihkKX0pLCF0aGlzLmlzQW5jaG9yRWxlbWVudH1uZ09uRGVzdHJveSgpe3RoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpfXVwZGF0ZUhyZWYoKXtsZXQgdD10aGlzLnVybFRyZWU7dGhpcy5yZWFjdGl2ZUhyZWYuc2V0KHQhPT1udWxsJiZ0aGlzLmxvY2F0aW9uU3RyYXRlZ3k/dGhpcy5sb2NhdGlvblN0cmF0ZWd5Py5wcmVwYXJlRXh0ZXJuYWxVcmwodGhpcy5yb3V0ZXIuc2VyaWFsaXplVXJsKHQpKT8/IiI6bnVsbCl9YXBwbHlBdHRyaWJ1dGVWYWx1ZSh0LGUpe2xldCByPXRoaXMucmVuZGVyZXIsbz10aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7ZSE9PW51bGw/ci5zZXRBdHRyaWJ1dGUobyx0LGUpOnIucmVtb3ZlQXR0cmlidXRlKG8sdCl9Z2V0IHVybFRyZWUoKXtyZXR1cm4gdGhpcy5yb3V0ZXJMaW5rSW5wdXQ9PT1udWxsP251bGw6dmUodGhpcy5yb3V0ZXJMaW5rSW5wdXQpP3RoaXMucm91dGVyTGlua0lucHV0OnRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUodGhpcy5yb3V0ZXJMaW5rSW5wdXQse3JlbGF0aXZlVG86dGhpcy5yZWxhdGl2ZVRvIT09dm9pZCAwP3RoaXMucmVsYXRpdmVUbzp0aGlzLnJvdXRlLHF1ZXJ5UGFyYW1zOnRoaXMucXVlcnlQYXJhbXMsZnJhZ21lbnQ6dGhpcy5mcmFnbWVudCxxdWVyeVBhcmFtc0hhbmRsaW5nOnRoaXMucXVlcnlQYXJhbXNIYW5kbGluZyxwcmVzZXJ2ZUZyYWdtZW50OnRoaXMucHJlc2VydmVGcmFnbWVudH0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKShDKGFlKSxDKHJlKSxacygidGFiaW5kZXgiKSxDKGx0KSxDKEQpLEMocWkpKX07c3RhdGljIFx1MDI3NWRpcj1wKHt0eXBlOmksc2VsZWN0b3JzOltbIiIsInJvdXRlckxpbmsiLCIiXV0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24oZSxyKXtlJjEmJmR0KCJjbGljayIsZnVuY3Rpb24oYSl7cmV0dXJuIHIub25DbGljayhhLmJ1dHRvbixhLmN0cmxLZXksYS5zaGlmdEtleSxhLmFsdEtleSxhLm1ldGFLZXkpfSksZSYyJiZ0dCgiaHJlZiIsci5yZWFjdGl2ZUhyZWYoKSx0bCkoInRhcmdldCIsci50YXJnZXQpfSxpbnB1dHM6e3RhcmdldDoidGFyZ2V0IixxdWVyeVBhcmFtczoicXVlcnlQYXJhbXMiLGZyYWdtZW50OiJmcmFnbWVudCIscXVlcnlQYXJhbXNIYW5kbGluZzoicXVlcnlQYXJhbXNIYW5kbGluZyIsc3RhdGU6InN0YXRlIixpbmZvOiJpbmZvIixyZWxhdGl2ZVRvOiJyZWxhdGl2ZVRvIixwcmVzZXJ2ZUZyYWdtZW50OlsyLCJwcmVzZXJ2ZUZyYWdtZW50IiwicHJlc2VydmVGcmFnbWVudCIsRl0sc2tpcExvY2F0aW9uQ2hhbmdlOlsyLCJza2lwTG9jYXRpb25DaGFuZ2UiLCJza2lwTG9jYXRpb25DaGFuZ2UiLEZdLHJlcGxhY2VVcmw6WzIsInJlcGxhY2VVcmwiLCJyZXBsYWNlVXJsIixGXSxyb3V0ZXJMaW5rOiJyb3V0ZXJMaW5rIn0sZmVhdHVyZXM6W210XX0pfXJldHVybiBpfSkoKSxobj1jbGFzc3t9LHljPSgoKT0+e2NsYXNzIGl7cm91dGVyO2luamVjdG9yO3ByZWxvYWRpbmdTdHJhdGVneTtsb2FkZXI7c3Vic2NyaXB0aW9uO2NvbnN0cnVjdG9yKHQsZSxyLG8pe3RoaXMucm91dGVyPXQsdGhpcy5pbmplY3Rvcj1lLHRoaXMucHJlbG9hZGluZ1N0cmF0ZWd5PXIsdGhpcy5sb2FkZXI9b31zZXRVcFByZWxvYWRpbmcoKXt0aGlzLnN1YnNjcmlwdGlvbj10aGlzLnJvdXRlci5ldmVudHMucGlwZShLKHQ9PnQgaW5zdGFuY2VvZiBqdCksZWUoKCk9PnRoaXMucHJlbG9hZCgpKSkuc3Vic2NyaWJlKCgpPT57fSl9cHJlbG9hZCgpe3JldHVybiB0aGlzLnByb2Nlc3NSb3V0ZXModGhpcy5pbmplY3Rvcix0aGlzLnJvdXRlci5jb25maWcpfW5nT25EZXN0cm95KCl7dGhpcy5zdWJzY3JpcHRpb24mJnRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9cHJvY2Vzc1JvdXRlcyh0LGUpe2xldCByPVtdO2ZvcihsZXQgbyBvZiBlKXtvLnByb3ZpZGVycyYmIW8uX2luamVjdG9yJiYoby5faW5qZWN0b3I9cW4oby5wcm92aWRlcnMsdCxgUm91dGU6ICR7by5wYXRofWApKTtsZXQgYT1vLl9pbmplY3Rvcj8/dCxzPW8uX2xvYWRlZEluamVjdG9yPz9hOyhvLmxvYWRDaGlsZHJlbiYmIW8uX2xvYWRlZFJvdXRlcyYmby5jYW5Mb2FkPT09dm9pZCAwfHxvLmxvYWRDb21wb25lbnQmJiFvLl9sb2FkZWRDb21wb25lbnQpJiZyLnB1c2godGhpcy5wcmVsb2FkQ29uZmlnKGEsbykpLChvLmNoaWxkcmVufHxvLl9sb2FkZWRSb3V0ZXMpJiZyLnB1c2godGhpcy5wcm9jZXNzUm91dGVzKHMsby5jaGlsZHJlbj8/by5fbG9hZGVkUm91dGVzKSl9cmV0dXJuIHB0KHIpLnBpcGUoTW8oKSl9cHJlbG9hZENvbmZpZyh0LGUpe3JldHVybiB0aGlzLnByZWxvYWRpbmdTdHJhdGVneS5wcmVsb2FkKGUsKCk9PntsZXQgcjtlLmxvYWRDaGlsZHJlbiYmZS5jYW5Mb2FkPT09dm9pZCAwP3I9dGhpcy5sb2FkZXIubG9hZENoaWxkcmVuKHQsZSk6cj1nKG51bGwpO2xldCBvPXIucGlwZShTdChhPT5hPT09bnVsbD9nKHZvaWQgMCk6KGUuX2xvYWRlZFJvdXRlcz1hLnJvdXRlcyxlLl9sb2FkZWRJbmplY3Rvcj1hLmluamVjdG9yLHRoaXMucHJvY2Vzc1JvdXRlcyhhLmluamVjdG9yPz90LGEucm91dGVzKSkpKTtpZihlLmxvYWRDb21wb25lbnQmJiFlLl9sb2FkZWRDb21wb25lbnQpe2xldCBhPXRoaXMubG9hZGVyLmxvYWRDb21wb25lbnQodCxlKTtyZXR1cm4gcHQoW28sYV0pLnBpcGUoTW8oKSl9ZWxzZSByZXR1cm4gb30pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKShHKGFlKSxHKEl0KSxHKGhuKSxHKFNyKSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKSxDYz1uZXcgdigiIiksVG09KCgpPT57Y2xhc3MgaXt1cmxTZXJpYWxpemVyO3RyYW5zaXRpb25zO3ZpZXdwb3J0U2Nyb2xsZXI7em9uZTtvcHRpb25zO3JvdXRlckV2ZW50c1N1YnNjcmlwdGlvbjtzY3JvbGxFdmVudHNTdWJzY3JpcHRpb247bGFzdElkPTA7bGFzdFNvdXJjZT11aTtyZXN0b3JlZElkPTA7c3RvcmU9e307Y29uc3RydWN0b3IodCxlLHIsbyxhPXt9KXt0aGlzLnVybFNlcmlhbGl6ZXI9dCx0aGlzLnRyYW5zaXRpb25zPWUsdGhpcy52aWV3cG9ydFNjcm9sbGVyPXIsdGhpcy56b25lPW8sdGhpcy5vcHRpb25zPWEsYS5zY3JvbGxQb3NpdGlvblJlc3RvcmF0aW9ufHw9ImRpc2FibGVkIixhLmFuY2hvclNjcm9sbGluZ3x8PSJkaXNhYmxlZCJ9aW5pdCgpe3RoaXMub3B0aW9ucy5zY3JvbGxQb3NpdGlvblJlc3RvcmF0aW9uIT09ImRpc2FibGVkIiYmdGhpcy52aWV3cG9ydFNjcm9sbGVyLnNldEhpc3RvcnlTY3JvbGxSZXN0b3JhdGlvbigibWFudWFsIiksdGhpcy5yb3V0ZXJFdmVudHNTdWJzY3JpcHRpb249dGhpcy5jcmVhdGVTY3JvbGxFdmVudHMoKSx0aGlzLnNjcm9sbEV2ZW50c1N1YnNjcmlwdGlvbj10aGlzLmNvbnN1bWVTY3JvbGxFdmVudHMoKX1jcmVhdGVTY3JvbGxFdmVudHMoKXtyZXR1cm4gdGhpcy50cmFuc2l0aW9ucy5ldmVudHMuc3Vic2NyaWJlKHQ9Pnt0IGluc3RhbmNlb2YgX2U/KHRoaXMuc3RvcmVbdGhpcy5sYXN0SWRdPXRoaXMudmlld3BvcnRTY3JvbGxlci5nZXRTY3JvbGxQb3NpdGlvbigpLHRoaXMubGFzdFNvdXJjZT10Lm5hdmlnYXRpb25UcmlnZ2VyLHRoaXMucmVzdG9yZWRJZD10LnJlc3RvcmVkU3RhdGU/dC5yZXN0b3JlZFN0YXRlLm5hdmlnYXRpb25JZDowKTp0IGluc3RhbmNlb2YganQ/KHRoaXMubGFzdElkPXQuaWQsdGhpcy5zY2hlZHVsZVNjcm9sbEV2ZW50KHQsdGhpcy51cmxTZXJpYWxpemVyLnBhcnNlKHQudXJsQWZ0ZXJSZWRpcmVjdHMpLmZyYWdtZW50KSk6dCBpbnN0YW5jZW9mIHRlJiZ0LmNvZGU9PT1taS5JZ25vcmVkU2FtZVVybE5hdmlnYXRpb24mJih0aGlzLmxhc3RTb3VyY2U9dm9pZCAwLHRoaXMucmVzdG9yZWRJZD0wLHRoaXMuc2NoZWR1bGVTY3JvbGxFdmVudCh0LHRoaXMudXJsU2VyaWFsaXplci5wYXJzZSh0LnVybCkuZnJhZ21lbnQpKX0pfWNvbnN1bWVTY3JvbGxFdmVudHMoKXtyZXR1cm4gdGhpcy50cmFuc2l0aW9ucy5ldmVudHMuc3Vic2NyaWJlKHQ9PntpZighKHQgaW5zdGFuY2VvZiBwaSkpcmV0dXJuO2xldCBlPXtiZWhhdmlvcjoiaW5zdGFudCJ9O3QucG9zaXRpb24/dGhpcy5vcHRpb25zLnNjcm9sbFBvc2l0aW9uUmVzdG9yYXRpb249PT0idG9wIj90aGlzLnZpZXdwb3J0U2Nyb2xsZXIuc2Nyb2xsVG9Qb3NpdGlvbihbMCwwXSxlKTp0aGlzLm9wdGlvbnMuc2Nyb2xsUG9zaXRpb25SZXN0b3JhdGlvbj09PSJlbmFibGVkIiYmdGhpcy52aWV3cG9ydFNjcm9sbGVyLnNjcm9sbFRvUG9zaXRpb24odC5wb3NpdGlvbixlKTp0LmFuY2hvciYmdGhpcy5vcHRpb25zLmFuY2hvclNjcm9sbGluZz09PSJlbmFibGVkIj90aGlzLnZpZXdwb3J0U2Nyb2xsZXIuc2Nyb2xsVG9BbmNob3IodC5hbmNob3IpOnRoaXMub3B0aW9ucy5zY3JvbGxQb3NpdGlvblJlc3RvcmF0aW9uIT09ImRpc2FibGVkIiYmdGhpcy52aWV3cG9ydFNjcm9sbGVyLnNjcm9sbFRvUG9zaXRpb24oWzAsMF0pfSl9c2NoZWR1bGVTY3JvbGxFdmVudCh0LGUpe3RoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+anModGhpcyxudWxsLGZ1bmN0aW9uKigpe3lpZWxkIG5ldyBQcm9taXNlKHI9PntzZXRUaW1lb3V0KHIpLHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU8InUiJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUocil9KSx0aGlzLnpvbmUucnVuKCgpPT57dGhpcy50cmFuc2l0aW9ucy5ldmVudHMubmV4dChuZXcgcGkodCx0aGlzLmxhc3RTb3VyY2U9PT0icG9wc3RhdGUiP3RoaXMuc3RvcmVbdGhpcy5yZXN0b3JlZElkXTpudWxsLGUpKX0pfSkpfW5nT25EZXN0cm95KCl7dGhpcy5yb3V0ZXJFdmVudHNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCksdGhpcy5zY3JvbGxFdmVudHNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtpbCgpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWN9KX1yZXR1cm4gaX0pKCk7eGM9bmV3IHYoIiIse2ZhY3Rvcnk6KCk9Pm5ldyB5fSksRWE9bmV3IHYoIiIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9PjF9KTtTYz1uZXcgdigiIik7TWM9W2ZlLHtwcm92aWRlOkJlLHVzZUNsYXNzOmdlfSxhZSx6ZSx7cHJvdmlkZTpyZSx1c2VGYWN0b3J5OkZtLGRlcHM6W2FlXX0sU3IsW11dLFBtPSgoKT0+e2NsYXNzIGl7Y29uc3RydWN0b3IoKXt9c3RhdGljIGZvclJvb3QodCxlKXtyZXR1cm57bmdNb2R1bGU6aSxwcm92aWRlcnM6W01jLFtdLHtwcm92aWRlOkNpLG11bHRpOiEwLHVzZVZhbHVlOnR9LFtdLGU/LmVycm9ySGFuZGxlcj97cHJvdmlkZTpDYSx1c2VWYWx1ZTplLmVycm9ySGFuZGxlcn06W10se3Byb3ZpZGU6YmUsdXNlVmFsdWU6ZXx8e319LGU/LnVzZUhhc2g/Vm0oKTpqbSgpLExtKCksZT8ucHJlbG9hZGluZ1N0cmF0ZWd5P0RjKGUucHJlbG9hZGluZ1N0cmF0ZWd5KS5cdTAyNzVwcm92aWRlcnM6W10sZT8uaW5pdGlhbE5hdmlnYXRpb24/Qm0oZSk6W10sZT8uYmluZFRvQ29tcG9uZW50SW5wdXRzP1JjKCkuXHUwMjc1cHJvdmlkZXJzOltdLGU/LmVuYWJsZVZpZXdUcmFuc2l0aW9ucz9BYygpLlx1MDI3NXByb3ZpZGVyczpbXSx6bSgpXX19c3RhdGljIGZvckNoaWxkKHQpe3JldHVybntuZ01vZHVsZTppLHByb3ZpZGVyczpbe3Byb3ZpZGU6Q2ksbXVsdGk6ITAsdXNlVmFsdWU6dH1dfX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVtb2Q9Uih7dHlwZTppfSk7c3RhdGljIFx1MDI3NWluaj1TKHt9KX1yZXR1cm4gaX0pKCk7d2E9bmV3IHYoIiIpfSk7dmFyIFVtPV8oKCk9Pnt4YSgpO0ljKCk7fSk7dmFyIHJfLEhtPV8oKCk9PntIbygpO2YoKTtVbygpO2h0KCk7ZigpO3JfPSgoKT0+e2NsYXNzIGl7aHR0cD1sKG5pKTtob3N0U2VydmVyPUpuLmhvc3RTZXJ2ZXI7aG9zdD10aGlzLmhvc3RTZXJ2ZXIrIi9yZXN0L2FkbWluIjtjb25maWdPYnNlcnZhYmxlO2dldEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbigpe3JldHVybiB0aGlzLmNvbmZpZ09ic2VydmFibGU/dGhpcy5jb25maWdPYnNlcnZhYmxlOih0aGlzLmNvbmZpZ09ic2VydmFibGU9dGhpcy5odHRwLmdldCh0aGlzLmhvc3QrIi9hcHBsaWNhdGlvbi1jb25maWd1cmF0aW9uIikucGlwZShiKHQ9PnQuY29uZmlnLGF0KHQ9Pnt0aHJvdyB0fSkpKSx0aGlzLmNvbmZpZ09ic2VydmFibGUpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7dmFyIFNhLFQsc2U9XygoKT0+e2YoKTtmKCk7UGUoKTt0cnl7U2E9dHlwZW9mIEludGw8InUiJiZJbnRsLnY4QnJlYWtJdGVyYXRvcn1jYXRjaHtTYT0hMX1UPSgoKT0+e2NsYXNzIGl7X3BsYXRmb3JtSWQ9bChYcyk7aXNCcm93c2VyPXRoaXMuX3BsYXRmb3JtSWQ/eWwodGhpcy5fcGxhdGZvcm1JZCk6dHlwZW9mIGRvY3VtZW50PT0ib2JqZWN0IiYmISFkb2N1bWVudDtFREdFPXRoaXMuaXNCcm93c2VyJiYvKGVkZ2UpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtUUklERU5UPXRoaXMuaXNCcm93c2VyJiYvKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO0JMSU5LPXRoaXMuaXNCcm93c2VyJiYhISh3aW5kb3cuY2hyb21lfHxTYSkmJnR5cGVvZiBDU1M8InUiJiYhdGhpcy5FREdFJiYhdGhpcy5UUklERU5UO1dFQktJVD10aGlzLmlzQnJvd3NlciYmL0FwcGxlV2ViS2l0L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXRoaXMuQkxJTksmJiF0aGlzLkVER0UmJiF0aGlzLlRSSURFTlQ7SU9TPXRoaXMuaXNCcm93c2VyJiYvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmISgiTVNTdHJlYW0iaW4gd2luZG93KTtGSVJFRk9YPXRoaXMuaXNCcm93c2VyJiYvKGZpcmVmb3h8bWluZWZpZWxkKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7QU5EUk9JRD10aGlzLmlzQnJvd3NlciYmL2FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhdGhpcy5UUklERU5UO1NBRkFSST10aGlzLmlzQnJvd3NlciYmL3NhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJnRoaXMuV0VCS0lUO2NvbnN0cnVjdG9yKCl7fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7ZnVuY3Rpb24gT2MoKXtpZihEYT09bnVsbCl7bGV0IGk9dHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudC5oZWFkOm51bGw7RGE9ISEoaSYmKGkuY3JlYXRlU2hhZG93Um9vdHx8aS5hdHRhY2hTaGFkb3cpKX1yZXR1cm4gRGF9ZnVuY3Rpb24gUmEoaSl7aWYoT2MoKSl7bGV0IG49aS5nZXRSb290Tm9kZT9pLmdldFJvb3ROb2RlKCk6bnVsbDtpZih0eXBlb2YgU2hhZG93Um9vdDwidSImJlNoYWRvd1Jvb3QmJm4gaW5zdGFuY2VvZiBTaGFkb3dSb290KXJldHVybiBufXJldHVybiBudWxsfWZ1bmN0aW9uIEFhKCl7bGV0IGk9dHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQ/ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDpudWxsO2Zvcig7aSYmaS5zaGFkb3dSb290Oyl7bGV0IG49aS5zaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQ7aWYobj09PWkpYnJlYWs7aT1ufXJldHVybiBpfWZ1bmN0aW9uIHh0KGkpe3JldHVybiBpLmNvbXBvc2VkUGF0aD9pLmNvbXBvc2VkUGF0aCgpWzBdOmkudGFyZ2V0fXZhciBEYSxmbj1fKCgpPT57fSk7ZnVuY3Rpb24gTWEoKXtyZXR1cm4gdHlwZW9mIF9fa2FybWFfXzwidSImJiEhX19rYXJtYV9ffHx0eXBlb2YgamFzbWluZTwidSImJiEhamFzbWluZXx8dHlwZW9mIGplc3Q8InUiJiYhIWplc3R8fHR5cGVvZiBNb2NoYTwidSImJiEhTW9jaGF9dmFyIGtjPV8oKCk9Pnt9KTt2YXIgTXIsTXQseGk9XygoKT0+e2YoKTtmKCk7TXI9bmV3IFdlYWtNYXAsTXQ9KCgpPT57Y2xhc3MgaXtfYXBwUmVmO19pbmplY3Rvcj1sKE4pO19lbnZpcm9ubWVudEluamVjdG9yPWwoSXQpO2xvYWQodCl7bGV0IGU9dGhpcy5fYXBwUmVmPXRoaXMuX2FwcFJlZnx8dGhpcy5faW5qZWN0b3IuZ2V0KGllKSxyPU1yLmdldChlKTtyfHwocj17bG9hZGVyczpuZXcgU2V0LHJlZnM6W119LE1yLnNldChlLHIpLGUub25EZXN0cm95KCgpPT57TXIuZ2V0KGUpPy5yZWZzLmZvckVhY2gobz0+by5kZXN0cm95KCkpLE1yLmRlbGV0ZShlKX0pKSxyLmxvYWRlcnMuaGFzKHQpfHwoci5sb2FkZXJzLmFkZCh0KSxyLnJlZnMucHVzaChRbih0LHtlbnZpcm9ubWVudEluamVjdG9yOnRoaXMuX2Vudmlyb25tZW50SW5qZWN0b3J9KSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7ZnVuY3Rpb24gWShpKXtyZXR1cm4gaT09bnVsbD8iIjp0eXBlb2YgaT09InN0cmluZyI/aTpgJHtpfXB4YH12YXIgSWE9XygoKT0+e30pO2Z1bmN0aW9uIHdpKGkpe3JldHVybiBBcnJheS5pc0FycmF5KGkpP2k6W2ldfXZhciBPYT1fKCgpPT57fSk7ZnVuY3Rpb24gcG4oaSxuPTApe3JldHVybiBUYyhpKT9OdW1iZXIoaSk6YXJndW1lbnRzLmxlbmd0aD09PTI/bjowfWZ1bmN0aW9uIFRjKGkpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGkpKSYmIWlzTmFOKE51bWJlcihpKSl9ZnVuY3Rpb24gd3QoaSl7cmV0dXJuIGkgaW5zdGFuY2VvZiBEP2kubmF0aXZlRWxlbWVudDppfXZhciBFaT1fKCgpPT57ZigpfSk7ZnVuY3Rpb24gV20oKXtyZXR1cm4gbChPKX1mdW5jdGlvbiBrYShpKXtsZXQgbj1pPy50b0xvd2VyQ2FzZSgpfHwiIjtyZXR1cm4gbj09PSJhdXRvIiYmdHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvcj8ubGFuZ3VhZ2U/R20udGVzdChuYXZpZ2F0b3IubGFuZ3VhZ2UpPyJydGwiOiJsdHIiOm49PT0icnRsIj8icnRsIjoibHRyIn12YXIgJG0sR20sbGUsSXI9XygoKT0+e2YoKTtmKCk7JG09bmV3IHYoImNkay1kaXItZG9jIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpXbX0pO0dtPS9eKGFyfGNrYnxkdnxoZXxpd3xmYXxucW98cHN8c2R8dWd8dXJ8eWl8LipbLV9dKEFkbG18QXJhYnxIZWJyfE5rb298Um9oZ3xUaGFhKSkoPyEuKlstX10oTGF0bnxDeXJsKSgkfC18XykpKCR8LXxfKS9pO2xlPSgoKT0+e2NsYXNzIGl7Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMudmFsdWVTaWduYWwoKX12YWx1ZVNpZ25hbD1KKCJsdHIiKTtjaGFuZ2U9bmV3IEE7Y29uc3RydWN0b3IoKXtsZXQgdD1sKCRtLHtvcHRpb25hbDohMH0pO2lmKHQpe2xldCBlPXQuYm9keT90LmJvZHkuZGlyOm51bGwscj10LmRvY3VtZW50RWxlbWVudD90LmRvY3VtZW50RWxlbWVudC5kaXI6bnVsbDt0aGlzLnZhbHVlU2lnbmFsLnNldChrYShlfHxyfHwibHRyIikpfX1uZ09uRGVzdHJveSgpe3RoaXMuY2hhbmdlLmNvbXBsZXRlKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCl9KTtmdW5jdGlvbiBnbigpe2lmKFVlPT1udWxsKXtpZih0eXBlb2YgZG9jdW1lbnQhPSJvYmplY3QifHwhZG9jdW1lbnR8fHR5cGVvZiBFbGVtZW50IT0iZnVuY3Rpb24ifHwhRWxlbWVudClyZXR1cm4gVWU9ITEsVWU7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Py5zdHlsZSYmInNjcm9sbEJlaGF2aW9yImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSlVZT0hMDtlbHNle2xldCBpPUVsZW1lbnQucHJvdG90eXBlLnNjcm9sbFRvO2k/VWU9IS9ce1xzKlxbbmF0aXZlIGNvZGVcXVxzKlx9Ly50ZXN0KGkudG9TdHJpbmcoKSk6VWU9ITF9fXJldHVybiBVZX1mdW5jdGlvbiBIZSgpe2lmKHR5cGVvZiBkb2N1bWVudCE9Im9iamVjdCJ8fCFkb2N1bWVudClyZXR1cm4gQnQuTk9STUFMO2lmKE9yPT1udWxsKXtsZXQgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxuPWkuc3R5bGU7aS5kaXI9InJ0bCIsbi53aWR0aD0iMXB4IixuLm92ZXJmbG93PSJhdXRvIixuLnZpc2liaWxpdHk9ImhpZGRlbiIsbi5wb2ludGVyRXZlbnRzPSJub25lIixuLnBvc2l0aW9uPSJhYnNvbHV0ZSI7bGV0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZT10LnN0eWxlO2Uud2lkdGg9IjJweCIsZS5oZWlnaHQ9IjFweCIsaS5hcHBlbmRDaGlsZCh0KSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGkpLE9yPUJ0Lk5PUk1BTCxpLnNjcm9sbExlZnQ9PT0wJiYoaS5zY3JvbGxMZWZ0PTEsT3I9aS5zY3JvbGxMZWZ0PT09MD9CdC5ORUdBVEVEOkJ0LklOVkVSVEVEKSxpLnJlbW92ZSgpfXJldHVybiBPcn12YXIgQnQsT3IsVWUsa3I9XygoKT0+e0J0PShmdW5jdGlvbihpKXtyZXR1cm4gaVtpLk5PUk1BTD0wXT0iTk9STUFMIixpW2kuTkVHQVRFRD0xXT0iTkVHQVRFRCIsaVtpLklOVkVSVEVEPTJdPSJJTlZFUlRFRCIsaX0pKEJ0fHx7fSl9KTt2YXIgTV8seWUsdm49XygoKT0+e0lyKCk7ZigpO2YoKTtNXz0oKCk9PntjbGFzcyBpe19pc0luaXRpYWxpemVkPSExO19yYXdEaXI7Y2hhbmdlPW5ldyBBO2dldCBkaXIoKXtyZXR1cm4gdGhpcy52YWx1ZVNpZ25hbCgpfXNldCBkaXIodCl7bGV0IGU9dGhpcy52YWx1ZVNpZ25hbCgpO3RoaXMudmFsdWVTaWduYWwuc2V0KGthKHQpKSx0aGlzLl9yYXdEaXI9dCxlIT09dGhpcy52YWx1ZVNpZ25hbCgpJiZ0aGlzLl9pc0luaXRpYWxpemVkJiZ0aGlzLmNoYW5nZS5lbWl0KHRoaXMudmFsdWVTaWduYWwoKSl9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuZGlyfXZhbHVlU2lnbmFsPUooImx0ciIpO25nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2lzSW5pdGlhbGl6ZWQ9ITB9bmdPbkRlc3Ryb3koKXt0aGlzLmNoYW5nZS5jb21wbGV0ZSgpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWRpcj1wKHt0eXBlOmksc2VsZWN0b3JzOltbIiIsImRpciIsIiJdXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMiYmdHQoImRpciIsci5fcmF3RGlyKX0saW5wdXRzOntkaXI6ImRpciJ9LG91dHB1dHM6e2NoYW5nZToiZGlyQ2hhbmdlIn0sZXhwb3J0QXM6WyJkaXIiXSxmZWF0dXJlczpbeihbe3Byb3ZpZGU6bGUsdXNlRXhpc3Rpbmc6aX1dKV19KX1yZXR1cm4gaX0pKCkseWU9KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVtb2Q9Uih7dHlwZTppfSk7c3RhdGljIFx1MDI3NWluaj1TKHt9KX1yZXR1cm4gaX0pKCl9KTtmdW5jdGlvbiBrXyhpKXtyZXR1cm4gaSYmdHlwZW9mIGkuY29ubmVjdD09ImZ1bmN0aW9uIiYmIShpIGluc3RhbmNlb2YgamkpfXZhciBGYyxxbT1fKCgpPT57bnQoKTtGYz1jbGFzc3t9fSk7dmFyIFltLE5fLEttPV8oKCk9PntmKCk7WW09KGZ1bmN0aW9uKGkpe3JldHVybiBpW2kuUkVQTEFDRUQ9MF09IlJFUExBQ0VEIixpW2kuSU5TRVJURUQ9MV09IklOU0VSVEVEIixpW2kuTU9WRUQ9Ml09Ik1PVkVEIixpW2kuUkVNT1ZFRD0zXT0iUkVNT1ZFRCIsaX0pKFltfHx7fSksTl89bmV3IHYoIl9WaWV3UmVwZWF0ZXIiKX0pO3ZhciBYbSxfbixRbSxKbSxTaSxUYSxGYSxOYT1fKCgpPT57ZigpO2YoKTtudCgpO2h0KCk7RWkoKTtzZSgpO0lyKCk7a3IoKTt2bigpO1htPTIwLF9uPSgoKT0+e2NsYXNzIGl7X25nWm9uZT1sKEUpO19wbGF0Zm9ybT1sKFQpO19yZW5kZXJlcj1sKGt0KS5jcmVhdGVSZW5kZXJlcihudWxsLG51bGwpO19jbGVhbnVwR2xvYmFsTGlzdGVuZXI7Y29uc3RydWN0b3IoKXt9X3Njcm9sbGVkPW5ldyB5O19zY3JvbGxlZENvdW50PTA7c2Nyb2xsQ29udGFpbmVycz1uZXcgTWFwO3JlZ2lzdGVyKHQpe3RoaXMuc2Nyb2xsQ29udGFpbmVycy5oYXModCl8fHRoaXMuc2Nyb2xsQ29udGFpbmVycy5zZXQodCx0LmVsZW1lbnRTY3JvbGxlZCgpLnN1YnNjcmliZSgoKT0+dGhpcy5fc2Nyb2xsZWQubmV4dCh0KSkpfWRlcmVnaXN0ZXIodCl7bGV0IGU9dGhpcy5zY3JvbGxDb250YWluZXJzLmdldCh0KTtlJiYoZS51bnN1YnNjcmliZSgpLHRoaXMuc2Nyb2xsQ29udGFpbmVycy5kZWxldGUodCkpfXNjcm9sbGVkKHQ9WG0pe3JldHVybiB0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXI/bmV3IFl0KGU9Pnt0aGlzLl9jbGVhbnVwR2xvYmFsTGlzdGVuZXJ8fCh0aGlzLl9jbGVhbnVwR2xvYmFsTGlzdGVuZXI9dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT50aGlzLl9yZW5kZXJlci5saXN0ZW4oImRvY3VtZW50Iiwic2Nyb2xsIiwoKT0+dGhpcy5fc2Nyb2xsZWQubmV4dCgpKSkpO2xldCByPXQ+MD90aGlzLl9zY3JvbGxlZC5waXBlKElvKHQpKS5zdWJzY3JpYmUoZSk6dGhpcy5fc2Nyb2xsZWQuc3Vic2NyaWJlKGUpO3JldHVybiB0aGlzLl9zY3JvbGxlZENvdW50KyssKCk9PntyLnVuc3Vic2NyaWJlKCksdGhpcy5fc2Nyb2xsZWRDb3VudC0tLHRoaXMuX3Njcm9sbGVkQ291bnR8fCh0aGlzLl9jbGVhbnVwR2xvYmFsTGlzdGVuZXI/LigpLHRoaXMuX2NsZWFudXBHbG9iYWxMaXN0ZW5lcj12b2lkIDApfX0pOmcoKX1uZ09uRGVzdHJveSgpe3RoaXMuX2NsZWFudXBHbG9iYWxMaXN0ZW5lcj8uKCksdGhpcy5fY2xlYW51cEdsb2JhbExpc3RlbmVyPXZvaWQgMCx0aGlzLnNjcm9sbENvbnRhaW5lcnMuZm9yRWFjaCgodCxlKT0+dGhpcy5kZXJlZ2lzdGVyKGUpKSx0aGlzLl9zY3JvbGxlZC5jb21wbGV0ZSgpfWFuY2VzdG9yU2Nyb2xsZWQodCxlKXtsZXQgcj10aGlzLmdldEFuY2VzdG9yU2Nyb2xsQ29udGFpbmVycyh0KTtyZXR1cm4gdGhpcy5zY3JvbGxlZChlKS5waXBlKEsobz0+IW98fHIuaW5kZXhPZihvKT4tMSkpfWdldEFuY2VzdG9yU2Nyb2xsQ29udGFpbmVycyh0KXtsZXQgZT1bXTtyZXR1cm4gdGhpcy5zY3JvbGxDb250YWluZXJzLmZvckVhY2goKHIsbyk9Pnt0aGlzLl9zY3JvbGxhYmxlQ29udGFpbnNFbGVtZW50KG8sdCkmJmUucHVzaChvKX0pLGV9X3Njcm9sbGFibGVDb250YWluc0VsZW1lbnQodCxlKXtsZXQgcj13dChlKSxvPXQuZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQ7ZG8gaWYocj09bylyZXR1cm4hMDt3aGlsZShyPXIucGFyZW50RWxlbWVudCk7cmV0dXJuITF9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCksUW09KCgpPT57Y2xhc3MgaXtlbGVtZW50UmVmPWwoRCk7c2Nyb2xsRGlzcGF0Y2hlcj1sKF9uKTtuZ1pvbmU9bChFKTtkaXI9bChsZSx7b3B0aW9uYWw6ITB9KTtfc2Nyb2xsRWxlbWVudD10aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtfZGVzdHJveWVkPW5ldyB5O19yZW5kZXJlcj1sKGx0KTtfY2xlYW51cFNjcm9sbDtfZWxlbWVudFNjcm9sbGVkPW5ldyB5O2NvbnN0cnVjdG9yKCl7fW5nT25Jbml0KCl7dGhpcy5fY2xlYW51cFNjcm9sbD10aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+dGhpcy5fcmVuZGVyZXIubGlzdGVuKHRoaXMuX3Njcm9sbEVsZW1lbnQsInNjcm9sbCIsdD0+dGhpcy5fZWxlbWVudFNjcm9sbGVkLm5leHQodCkpKSx0aGlzLnNjcm9sbERpc3BhdGNoZXIucmVnaXN0ZXIodGhpcyl9bmdPbkRlc3Ryb3koKXt0aGlzLl9jbGVhbnVwU2Nyb2xsPy4oKSx0aGlzLl9lbGVtZW50U2Nyb2xsZWQuY29tcGxldGUoKSx0aGlzLnNjcm9sbERpc3BhdGNoZXIuZGVyZWdpc3Rlcih0aGlzKSx0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpfWVsZW1lbnRTY3JvbGxlZCgpe3JldHVybiB0aGlzLl9lbGVtZW50U2Nyb2xsZWR9Z2V0RWxlbWVudFJlZigpe3JldHVybiB0aGlzLmVsZW1lbnRSZWZ9c2Nyb2xsVG8odCl7bGV0IGU9dGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQscj10aGlzLmRpciYmdGhpcy5kaXIudmFsdWU9PSJydGwiO3QubGVmdD09bnVsbCYmKHQubGVmdD1yP3QuZW5kOnQuc3RhcnQpLHQucmlnaHQ9PW51bGwmJih0LnJpZ2h0PXI/dC5zdGFydDp0LmVuZCksdC5ib3R0b20hPW51bGwmJih0LnRvcD1lLnNjcm9sbEhlaWdodC1lLmNsaWVudEhlaWdodC10LmJvdHRvbSksciYmSGUoKSE9QnQuTk9STUFMPyh0LmxlZnQhPW51bGwmJih0LnJpZ2h0PWUuc2Nyb2xsV2lkdGgtZS5jbGllbnRXaWR0aC10LmxlZnQpLEhlKCk9PUJ0LklOVkVSVEVEP3QubGVmdD10LnJpZ2h0OkhlKCk9PUJ0Lk5FR0FURUQmJih0LmxlZnQ9dC5yaWdodD8tdC5yaWdodDp0LnJpZ2h0KSk6dC5yaWdodCE9bnVsbCYmKHQubGVmdD1lLnNjcm9sbFdpZHRoLWUuY2xpZW50V2lkdGgtdC5yaWdodCksdGhpcy5fYXBwbHlTY3JvbGxUb09wdGlvbnModCl9X2FwcGx5U2Nyb2xsVG9PcHRpb25zKHQpe2xldCBlPXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2duKCk/ZS5zY3JvbGxUbyh0KToodC50b3AhPW51bGwmJihlLnNjcm9sbFRvcD10LnRvcCksdC5sZWZ0IT1udWxsJiYoZS5zY3JvbGxMZWZ0PXQubGVmdCkpfW1lYXN1cmVTY3JvbGxPZmZzZXQodCl7bGV0IGU9ImxlZnQiLHI9InJpZ2h0IixvPXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2lmKHQ9PSJ0b3AiKXJldHVybiBvLnNjcm9sbFRvcDtpZih0PT0iYm90dG9tIilyZXR1cm4gby5zY3JvbGxIZWlnaHQtby5jbGllbnRIZWlnaHQtby5zY3JvbGxUb3A7bGV0IGE9dGhpcy5kaXImJnRoaXMuZGlyLnZhbHVlPT0icnRsIjtyZXR1cm4gdD09InN0YXJ0Ij90PWE/cjplOnQ9PSJlbmQiJiYodD1hP2U6ciksYSYmSGUoKT09QnQuSU5WRVJURUQ/dD09ZT9vLnNjcm9sbFdpZHRoLW8uY2xpZW50V2lkdGgtby5zY3JvbGxMZWZ0Om8uc2Nyb2xsTGVmdDphJiZIZSgpPT1CdC5ORUdBVEVEP3Q9PWU/by5zY3JvbGxMZWZ0K28uc2Nyb2xsV2lkdGgtby5jbGllbnRXaWR0aDotby5zY3JvbGxMZWZ0OnQ9PWU/by5zY3JvbGxMZWZ0Om8uc2Nyb2xsV2lkdGgtby5jbGllbnRXaWR0aC1vLnNjcm9sbExlZnR9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwiY2RrLXNjcm9sbGFibGUiLCIiXSxbIiIsImNka1Njcm9sbGFibGUiLCIiXV19KX1yZXR1cm4gaX0pKCksSm09MjAsU2k9KCgpPT57Y2xhc3MgaXtfcGxhdGZvcm09bChUKTtfbGlzdGVuZXJzO192aWV3cG9ydFNpemU7X2NoYW5nZT1uZXcgeTtfZG9jdW1lbnQ9bChPKTtjb25zdHJ1Y3Rvcigpe2xldCB0PWwoRSksZT1sKGt0KS5jcmVhdGVSZW5kZXJlcihudWxsLG51bGwpO3QucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntpZih0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpe2xldCByPW89PnRoaXMuX2NoYW5nZS5uZXh0KG8pO3RoaXMuX2xpc3RlbmVycz1bZS5saXN0ZW4oIndpbmRvdyIsInJlc2l6ZSIsciksZS5saXN0ZW4oIndpbmRvdyIsIm9yaWVudGF0aW9uY2hhbmdlIixyKV19dGhpcy5jaGFuZ2UoKS5zdWJzY3JpYmUoKCk9PnRoaXMuX3ZpZXdwb3J0U2l6ZT1udWxsKX0pfW5nT25EZXN0cm95KCl7dGhpcy5fbGlzdGVuZXJzPy5mb3JFYWNoKHQ9PnQoKSksdGhpcy5fY2hhbmdlLmNvbXBsZXRlKCl9Z2V0Vmlld3BvcnRTaXplKCl7dGhpcy5fdmlld3BvcnRTaXplfHx0aGlzLl91cGRhdGVWaWV3cG9ydFNpemUoKTtsZXQgdD17d2lkdGg6dGhpcy5fdmlld3BvcnRTaXplLndpZHRoLGhlaWdodDp0aGlzLl92aWV3cG9ydFNpemUuaGVpZ2h0fTtyZXR1cm4gdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyfHwodGhpcy5fdmlld3BvcnRTaXplPW51bGwpLHR9Z2V0Vmlld3BvcnRSZWN0KCl7bGV0IHQ9dGhpcy5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCkse3dpZHRoOmUsaGVpZ2h0OnJ9PXRoaXMuZ2V0Vmlld3BvcnRTaXplKCk7cmV0dXJue3RvcDp0LnRvcCxsZWZ0OnQubGVmdCxib3R0b206dC50b3ArcixyaWdodDp0LmxlZnQrZSxoZWlnaHQ6cix3aWR0aDplfX1nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCl7aWYoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcilyZXR1cm57dG9wOjAsbGVmdDowfTtsZXQgdD10aGlzLl9kb2N1bWVudCxlPXRoaXMuX2dldFdpbmRvdygpLHI9dC5kb2N1bWVudEVsZW1lbnQsbz1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9LW8udG9wfHx0LmJvZHkuc2Nyb2xsVG9wfHxlLnNjcm9sbFl8fHIuc2Nyb2xsVG9wfHwwLHM9LW8ubGVmdHx8dC5ib2R5LnNjcm9sbExlZnR8fGUuc2Nyb2xsWHx8ci5zY3JvbGxMZWZ0fHwwO3JldHVybnt0b3A6YSxsZWZ0OnN9fWNoYW5nZSh0PUptKXtyZXR1cm4gdD4wP3RoaXMuX2NoYW5nZS5waXBlKElvKHQpKTp0aGlzLl9jaGFuZ2V9X2dldFdpbmRvdygpe3JldHVybiB0aGlzLl9kb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93fV91cGRhdGVWaWV3cG9ydFNpemUoKXtsZXQgdD10aGlzLl9nZXRXaW5kb3coKTt0aGlzLl92aWV3cG9ydFNpemU9dGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyP3t3aWR0aDp0LmlubmVyV2lkdGgsaGVpZ2h0OnQuaW5uZXJIZWlnaHR9Ont3aWR0aDowLGhlaWdodDowfX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKSxUYT0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NW1vZD1SKHt0eXBlOml9KTtzdGF0aWMgXHUwMjc1aW5qPVMoe30pfXJldHVybiBpfSkoKSxGYT0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NW1vZD1SKHt0eXBlOml9KTtzdGF0aWMgXHUwMjc1aW5qPVMoe2ltcG9ydHM6W3llLFRhLHllLFRhXX0pfXJldHVybiBpfSkoKX0pO3ZhciBibixEaSxDZSxQYSxSaSxUcix1YixMYSxGcixWYT1fKCgpPT57ZigpO2YoKTtibj1jbGFzc3tfYXR0YWNoZWRIb3N0O2F0dGFjaChuKXtyZXR1cm4gdGhpcy5fYXR0YWNoZWRIb3N0PW4sbi5hdHRhY2godGhpcyl9ZGV0YWNoKCl7bGV0IG49dGhpcy5fYXR0YWNoZWRIb3N0O24hPW51bGwmJih0aGlzLl9hdHRhY2hlZEhvc3Q9bnVsbCxuLmRldGFjaCgpKX1nZXQgaXNBdHRhY2hlZCgpe3JldHVybiB0aGlzLl9hdHRhY2hlZEhvc3QhPW51bGx9c2V0QXR0YWNoZWRIb3N0KG4pe3RoaXMuX2F0dGFjaGVkSG9zdD1ufX0sRGk9Y2xhc3MgZXh0ZW5kcyBibntjb21wb25lbnQ7dmlld0NvbnRhaW5lclJlZjtpbmplY3Rvcjtwcm9qZWN0YWJsZU5vZGVzO2NvbnN0cnVjdG9yKG4sdCxlLHIpe3N1cGVyKCksdGhpcy5jb21wb25lbnQ9bix0aGlzLnZpZXdDb250YWluZXJSZWY9dCx0aGlzLmluamVjdG9yPWUsdGhpcy5wcm9qZWN0YWJsZU5vZGVzPXJ9fSxDZT1jbGFzcyBleHRlbmRzIGJue3RlbXBsYXRlUmVmO3ZpZXdDb250YWluZXJSZWY7Y29udGV4dDtpbmplY3Rvcjtjb25zdHJ1Y3RvcihuLHQsZSxyKXtzdXBlcigpLHRoaXMudGVtcGxhdGVSZWY9bix0aGlzLnZpZXdDb250YWluZXJSZWY9dCx0aGlzLmNvbnRleHQ9ZSx0aGlzLmluamVjdG9yPXJ9Z2V0IG9yaWdpbigpe3JldHVybiB0aGlzLnRlbXBsYXRlUmVmLmVsZW1lbnRSZWZ9YXR0YWNoKG4sdD10aGlzLmNvbnRleHQpe3JldHVybiB0aGlzLmNvbnRleHQ9dCxzdXBlci5hdHRhY2gobil9ZGV0YWNoKCl7cmV0dXJuIHRoaXMuY29udGV4dD12b2lkIDAsc3VwZXIuZGV0YWNoKCl9fSxQYT1jbGFzcyBleHRlbmRzIGJue2VsZW1lbnQ7Y29uc3RydWN0b3Iobil7c3VwZXIoKSx0aGlzLmVsZW1lbnQ9biBpbnN0YW5jZW9mIEQ/bi5uYXRpdmVFbGVtZW50Om59fSxSaT1jbGFzc3tfYXR0YWNoZWRQb3J0YWw7X2Rpc3Bvc2VGbjtfaXNEaXNwb3NlZD0hMTtoYXNBdHRhY2hlZCgpe3JldHVybiEhdGhpcy5fYXR0YWNoZWRQb3J0YWx9YXR0YWNoKG4pe2lmKG4gaW5zdGFuY2VvZiBEaSlyZXR1cm4gdGhpcy5fYXR0YWNoZWRQb3J0YWw9bix0aGlzLmF0dGFjaENvbXBvbmVudFBvcnRhbChuKTtpZihuIGluc3RhbmNlb2YgQ2UpcmV0dXJuIHRoaXMuX2F0dGFjaGVkUG9ydGFsPW4sdGhpcy5hdHRhY2hUZW1wbGF0ZVBvcnRhbChuKTtpZih0aGlzLmF0dGFjaERvbVBvcnRhbCYmbiBpbnN0YW5jZW9mIFBhKXJldHVybiB0aGlzLl9hdHRhY2hlZFBvcnRhbD1uLHRoaXMuYXR0YWNoRG9tUG9ydGFsKG4pfWF0dGFjaERvbVBvcnRhbD1udWxsO2RldGFjaCgpe3RoaXMuX2F0dGFjaGVkUG9ydGFsJiYodGhpcy5fYXR0YWNoZWRQb3J0YWwuc2V0QXR0YWNoZWRIb3N0KG51bGwpLHRoaXMuX2F0dGFjaGVkUG9ydGFsPW51bGwpLHRoaXMuX2ludm9rZURpc3Bvc2VGbigpfWRpc3Bvc2UoKXt0aGlzLmhhc0F0dGFjaGVkKCkmJnRoaXMuZGV0YWNoKCksdGhpcy5faW52b2tlRGlzcG9zZUZuKCksdGhpcy5faXNEaXNwb3NlZD0hMH1zZXREaXNwb3NlRm4obil7dGhpcy5fZGlzcG9zZUZuPW59X2ludm9rZURpc3Bvc2VGbigpe3RoaXMuX2Rpc3Bvc2VGbiYmKHRoaXMuX2Rpc3Bvc2VGbigpLHRoaXMuX2Rpc3Bvc2VGbj1udWxsKX19LFRyPWNsYXNzIGV4dGVuZHMgUml7b3V0bGV0RWxlbWVudDtfYXBwUmVmO19kZWZhdWx0SW5qZWN0b3I7Y29uc3RydWN0b3Iobix0LGUpe3N1cGVyKCksdGhpcy5vdXRsZXRFbGVtZW50PW4sdGhpcy5fYXBwUmVmPXQsdGhpcy5fZGVmYXVsdEluamVjdG9yPWV9YXR0YWNoQ29tcG9uZW50UG9ydGFsKG4pe2xldCB0O2lmKG4udmlld0NvbnRhaW5lclJlZil7bGV0IGU9bi5pbmplY3Rvcnx8bi52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yLHI9ZS5nZXQoUG8sbnVsbCx7b3B0aW9uYWw6ITB9KXx8dm9pZCAwO3Q9bi52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChuLmNvbXBvbmVudCx7aW5kZXg6bi52aWV3Q29udGFpbmVyUmVmLmxlbmd0aCxpbmplY3RvcjplLG5nTW9kdWxlUmVmOnIscHJvamVjdGFibGVOb2RlczpuLnByb2plY3RhYmxlTm9kZXN8fHZvaWQgMH0pLHRoaXMuc2V0RGlzcG9zZUZuKCgpPT50LmRlc3Ryb3koKSl9ZWxzZXtsZXQgZT10aGlzLl9hcHBSZWYscj1uLmluamVjdG9yfHx0aGlzLl9kZWZhdWx0SW5qZWN0b3J8fE4uTlVMTCxvPXIuZ2V0KEl0LGUuaW5qZWN0b3IpO3Q9UW4obi5jb21wb25lbnQse2VsZW1lbnRJbmplY3RvcjpyLGVudmlyb25tZW50SW5qZWN0b3I6byxwcm9qZWN0YWJsZU5vZGVzOm4ucHJvamVjdGFibGVOb2Rlc3x8dm9pZCAwfSksZS5hdHRhY2hWaWV3KHQuaG9zdFZpZXcpLHRoaXMuc2V0RGlzcG9zZUZuKCgpPT57ZS52aWV3Q291bnQ+MCYmZS5kZXRhY2hWaWV3KHQuaG9zdFZpZXcpLHQuZGVzdHJveSgpfSl9cmV0dXJuIHRoaXMub3V0bGV0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9nZXRDb21wb25lbnRSb290Tm9kZSh0KSksdGhpcy5fYXR0YWNoZWRQb3J0YWw9bix0fWF0dGFjaFRlbXBsYXRlUG9ydGFsKG4pe2xldCB0PW4udmlld0NvbnRhaW5lclJlZixlPXQuY3JlYXRlRW1iZWRkZWRWaWV3KG4udGVtcGxhdGVSZWYsbi5jb250ZXh0LHtpbmplY3RvcjpuLmluamVjdG9yfSk7cmV0dXJuIGUucm9vdE5vZGVzLmZvckVhY2gocj0+dGhpcy5vdXRsZXRFbGVtZW50LmFwcGVuZENoaWxkKHIpKSxlLmRldGVjdENoYW5nZXMoKSx0aGlzLnNldERpc3Bvc2VGbigoKT0+e2xldCByPXQuaW5kZXhPZihlKTtyIT09LTEmJnQucmVtb3ZlKHIpfSksdGhpcy5fYXR0YWNoZWRQb3J0YWw9bixlfWF0dGFjaERvbVBvcnRhbD1uPT57bGV0IHQ9bi5lbGVtZW50O3QucGFyZW50Tm9kZTtsZXQgZT10aGlzLm91dGxldEVsZW1lbnQub3duZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KCJkb20tcG9ydGFsIik7dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHQpLHRoaXMub3V0bGV0RWxlbWVudC5hcHBlbmRDaGlsZCh0KSx0aGlzLl9hdHRhY2hlZFBvcnRhbD1uLHN1cGVyLnNldERpc3Bvc2VGbigoKT0+e2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0LGUpfSl9O2Rpc3Bvc2UoKXtzdXBlci5kaXNwb3NlKCksdGhpcy5vdXRsZXRFbGVtZW50LnJlbW92ZSgpfV9nZXRDb21wb25lbnRSb290Tm9kZShuKXtyZXR1cm4gbi5ob3N0Vmlldy5yb290Tm9kZXNbMF19fSx1Yj0oKCk9PntjbGFzcyBpIGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IoKXtsZXQgdD1sKE9lKSxlPWwobWUpO3N1cGVyKHQsZSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwiY2RrUG9ydGFsIiwiIl1dLGV4cG9ydEFzOlsiY2RrUG9ydGFsIl0sZmVhdHVyZXM6W0xdfSl9cmV0dXJuIGl9KSgpLExhPSgoKT0+e2NsYXNzIGkgZXh0ZW5kcyBSaXtfbW9kdWxlUmVmPWwoUG8se29wdGlvbmFsOiEwfSk7X2RvY3VtZW50PWwoTyk7X3ZpZXdDb250YWluZXJSZWY9bChtZSk7X2lzSW5pdGlhbGl6ZWQ9ITE7X2F0dGFjaGVkUmVmO2NvbnN0cnVjdG9yKCl7c3VwZXIoKX1nZXQgcG9ydGFsKCl7cmV0dXJuIHRoaXMuX2F0dGFjaGVkUG9ydGFsfXNldCBwb3J0YWwodCl7dGhpcy5oYXNBdHRhY2hlZCgpJiYhdCYmIXRoaXMuX2lzSW5pdGlhbGl6ZWR8fCh0aGlzLmhhc0F0dGFjaGVkKCkmJnN1cGVyLmRldGFjaCgpLHQmJnN1cGVyLmF0dGFjaCh0KSx0aGlzLl9hdHRhY2hlZFBvcnRhbD10fHxudWxsKX1hdHRhY2hlZD1uZXcgQTtnZXQgYXR0YWNoZWRSZWYoKXtyZXR1cm4gdGhpcy5fYXR0YWNoZWRSZWZ9bmdPbkluaXQoKXt0aGlzLl9pc0luaXRpYWxpemVkPSEwfW5nT25EZXN0cm95KCl7c3VwZXIuZGlzcG9zZSgpLHRoaXMuX2F0dGFjaGVkUmVmPXRoaXMuX2F0dGFjaGVkUG9ydGFsPW51bGx9YXR0YWNoQ29tcG9uZW50UG9ydGFsKHQpe3Quc2V0QXR0YWNoZWRIb3N0KHRoaXMpO2xldCBlPXQudmlld0NvbnRhaW5lclJlZiE9bnVsbD90LnZpZXdDb250YWluZXJSZWY6dGhpcy5fdmlld0NvbnRhaW5lclJlZixyPWUuY3JlYXRlQ29tcG9uZW50KHQuY29tcG9uZW50LHtpbmRleDplLmxlbmd0aCxpbmplY3Rvcjp0LmluamVjdG9yfHxlLmluamVjdG9yLHByb2plY3RhYmxlTm9kZXM6dC5wcm9qZWN0YWJsZU5vZGVzfHx2b2lkIDAsbmdNb2R1bGVSZWY6dGhpcy5fbW9kdWxlUmVmfHx2b2lkIDB9KTtyZXR1cm4gZSE9PXRoaXMuX3ZpZXdDb250YWluZXJSZWYmJnRoaXMuX2dldFJvb3ROb2RlKCkuYXBwZW5kQ2hpbGQoci5ob3N0Vmlldy5yb290Tm9kZXNbMF0pLHN1cGVyLnNldERpc3Bvc2VGbigoKT0+ci5kZXN0cm95KCkpLHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQsdGhpcy5fYXR0YWNoZWRSZWY9cix0aGlzLmF0dGFjaGVkLmVtaXQocikscn1hdHRhY2hUZW1wbGF0ZVBvcnRhbCh0KXt0LnNldEF0dGFjaGVkSG9zdCh0aGlzKTtsZXQgZT10aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0LnRlbXBsYXRlUmVmLHQuY29udGV4dCx7aW5qZWN0b3I6dC5pbmplY3Rvcn0pO3JldHVybiBzdXBlci5zZXREaXNwb3NlRm4oKCk9PnRoaXMuX3ZpZXdDb250YWluZXJSZWYuY2xlYXIoKSksdGhpcy5fYXR0YWNoZWRQb3J0YWw9dCx0aGlzLl9hdHRhY2hlZFJlZj1lLHRoaXMuYXR0YWNoZWQuZW1pdChlKSxlfWF0dGFjaERvbVBvcnRhbD10PT57bGV0IGU9dC5lbGVtZW50O2UucGFyZW50Tm9kZTtsZXQgcj10aGlzLl9kb2N1bWVudC5jcmVhdGVDb21tZW50KCJkb20tcG9ydGFsIik7dC5zZXRBdHRhY2hlZEhvc3QodGhpcyksZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLGUpLHRoaXMuX2dldFJvb3ROb2RlKCkuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYXR0YWNoZWRQb3J0YWw9dCxzdXBlci5zZXREaXNwb3NlRm4oKCk9PntyLnBhcmVudE5vZGUmJnIucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZSxyKX0pfTtfZ2V0Um9vdE5vZGUoKXtsZXQgdD10aGlzLl92aWV3Q29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudDtyZXR1cm4gdC5ub2RlVHlwZT09PXQuRUxFTUVOVF9OT0RFP3Q6dC5wYXJlbnROb2RlfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWRpcj1wKHt0eXBlOmksc2VsZWN0b3JzOltbIiIsImNka1BvcnRhbE91dGxldCIsIiJdXSxpbnB1dHM6e3BvcnRhbDpbMCwiY2RrUG9ydGFsT3V0bGV0IiwicG9ydGFsIl19LG91dHB1dHM6e2F0dGFjaGVkOiJhdHRhY2hlZCJ9LGV4cG9ydEFzOlsiY2RrUG9ydGFsT3V0bGV0Il0sZmVhdHVyZXM6W0xdfSl9cmV0dXJuIGl9KSgpLEZyPSgoKT0+e2NsYXNzIGl7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1bW9kPVIoe3R5cGU6aX0pO3N0YXRpYyBcdTAyNzVpbmo9Uyh7fSl9cmV0dXJuIGl9KSgpfSk7dmFyIGphLFd0LEJhPV8oKCk9PntmKCk7ZigpO2phPXt9LFd0PSgoKT0+e2NsYXNzIGl7X2FwcElkPWwoV24pO2dldElkKHQpe3JldHVybiB0aGlzLl9hcHBJZCE9PSJuZyImJih0Kz10aGlzLl9hcHBJZCksamEuaGFzT3duUHJvcGVydHkodCl8fChqYVt0XT0wKSxgJHt0fSR7amFbdF0rK31gfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7ZnVuY3Rpb24gTnIoaSwuLi5uKXtyZXR1cm4gbi5sZW5ndGg/bi5zb21lKHQ9PmlbdF0pOmkuYWx0S2V5fHxpLnNoaWZ0S2V5fHxpLmN0cmxLZXl8fGkubWV0YUtleX12YXIgemE9XygoKT0+e30pO2Z1bmN0aW9uIFVjKGkpe3JldHVybiBuZXcgUHIoaS5nZXQoU2kpLGkuZ2V0KE8pKX1mdW5jdGlvbiBIYyhpLG4pe3JldHVybiBuZXcgTHIoaS5nZXQoX24pLGkuZ2V0KEUpLGkuZ2V0KFNpKSxuKX1mdW5jdGlvbiBVYShpLG4pe3JldHVybiBuLnNvbWUodD0+e2xldCBlPWkuYm90dG9tPHQudG9wLHI9aS50b3A+dC5ib3R0b20sbz1pLnJpZ2h0PHQubGVmdCxhPWkubGVmdD50LnJpZ2h0O3JldHVybiBlfHxyfHxvfHxhfSl9ZnVuY3Rpb24gUGMoaSxuKXtyZXR1cm4gbi5zb21lKHQ9PntsZXQgZT1pLnRvcDx0LnRvcCxyPWkuYm90dG9tPnQuYm90dG9tLG89aS5sZWZ0PHQubGVmdCxhPWkucmlnaHQ+dC5yaWdodDtyZXR1cm4gZXx8cnx8b3x8YX0pfWZ1bmN0aW9uIEhyKGksbil7cmV0dXJuIG5ldyBWcihpLmdldChfbiksaS5nZXQoU2kpLGkuZ2V0KEUpLG4pfWZ1bmN0aW9uIExjKGksbil7bGV0IHQ9dHlwZW9mIFNoYWRvd1Jvb3Q8InUiJiZTaGFkb3dSb290LGU9bjtmb3IoO2U7KXtpZihlPT09aSlyZXR1cm4hMDtlPXQmJmUgaW5zdGFuY2VvZiBTaGFkb3dSb290P2UuaG9zdDplLnBhcmVudE5vZGV9cmV0dXJuITF9ZnVuY3Rpb24gR2EoaSxuKXtyZXR1cm4gbmV3IHpyKG4saS5nZXQoU2kpLGkuZ2V0KE8pLGkuZ2V0KFQpLGkuZ2V0KFdhKSl9ZnVuY3Rpb24gJGUoaSxuKXtmb3IobGV0IHQgaW4gbiluLmhhc093blByb3BlcnR5KHQpJiYoaVt0XT1uW3RdKTtyZXR1cm4gaX1mdW5jdGlvbiBqYyhpKXtpZih0eXBlb2YgaSE9Im51bWJlciImJmkhPW51bGwpe2xldFtuLHRdPWkuc3BsaXQodGYpO3JldHVybiF0fHx0PT09InB4Ij9wYXJzZUZsb2F0KG4pOm51bGx9cmV0dXJuIGl8fG51bGx9ZnVuY3Rpb24gQmMoaSl7cmV0dXJue3RvcDpNYXRoLmZsb29yKGkudG9wKSxyaWdodDpNYXRoLmZsb29yKGkucmlnaHQpLGJvdHRvbTpNYXRoLmZsb29yKGkuYm90dG9tKSxsZWZ0Ok1hdGguZmxvb3IoaS5sZWZ0KSx3aWR0aDpNYXRoLmZsb29yKGkud2lkdGgpLGhlaWdodDpNYXRoLmZsb29yKGkuaGVpZ2h0KX19ZnVuY3Rpb24gZWYoaSxuKXtyZXR1cm4gaT09PW4/ITA6aS5pc09yaWdpbkNsaXBwZWQ9PT1uLmlzT3JpZ2luQ2xpcHBlZCYmaS5pc09yaWdpbk91dHNpZGVWaWV3PT09bi5pc09yaWdpbk91dHNpZGVWaWV3JiZpLmlzT3ZlcmxheUNsaXBwZWQ9PT1uLmlzT3ZlcmxheUNsaXBwZWQmJmkuaXNPdmVybGF5T3V0c2lkZVZpZXc9PT1uLmlzT3ZlcmxheU91dHNpZGVWaWV3fWZ1bmN0aW9uICRyKGkpe3JldHVybiBuZXcgVXJ9ZnVuY3Rpb24gQ24oaSxuKXtpLmdldChNdCkubG9hZChZYyk7bGV0IHQ9aS5nZXQoV2EpLGU9aS5nZXQoTykscj1pLmdldChXdCksbz1pLmdldChpZSksYT1pLmdldChsZSkscz1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXIuZ2V0SWQoImNkay1vdmVybGF5LSIpLGMuY2xhc3NMaXN0LmFkZCgiY2RrLW92ZXJsYXktcGFuZSIpLHMuYXBwZW5kQ2hpbGQoYyksdC5nZXRDb250YWluZXJFbGVtZW50KCkuYXBwZW5kQ2hpbGQocyk7bGV0IGQ9bmV3IFRyKGMsbyxpKSx1PW5ldyBXZShuKSx4PWkuZ2V0KGx0LG51bGwse29wdGlvbmFsOiEwfSl8fGkuZ2V0KGt0KS5jcmVhdGVSZW5kZXJlcihudWxsLG51bGwpO3JldHVybiB1LmRpcmVjdGlvbj11LmRpcmVjdGlvbnx8YS52YWx1ZSxuZXcgQnIoZCxzLGMsdSxpLmdldChFKSxpLmdldChHYyksZSxpLmdldChmZSksaS5nZXQocWMpLG4/LmRpc2FibGVBbmltYXRpb25zPz9pLmdldChHbixudWxsLHtvcHRpb25hbDohMH0pPT09Ik5vb3BBbmltYXRpb25zIixpLmdldChJdCkseCl9ZnVuY3Rpb24gb2YoaSl7bGV0IG49bChOKTtyZXR1cm4oKT0+SHIobil9dmFyIE5jLFByLExyLHluLFZyLCRjLFdlLGpyLFdjLEdjLHFjLFljLFdhLEhhLEJyLFZjLHRmLHpyLHpjLFVyLEtjLFpjLG5mLFhjLCRhLHJmLGFmLHFhLFlhPV8oKCk9PntmKCk7ZigpO1BlKCk7c2UoKTtmbigpO2tjKCk7eGkoKTtudCgpO0lhKCk7T2EoKTtOYSgpO1ZhKCk7a3IoKTtodCgpO0JhKCk7SXIoKTt6YSgpO3ZuKCk7TmM9Z24oKTtQcj1jbGFzc3tfdmlld3BvcnRSdWxlcjtfcHJldmlvdXNIVE1MU3R5bGVzPXt0b3A6IiIsbGVmdDoiIn07X3ByZXZpb3VzU2Nyb2xsUG9zaXRpb247X2lzRW5hYmxlZD0hMTtfZG9jdW1lbnQ7Y29uc3RydWN0b3Iobix0KXt0aGlzLl92aWV3cG9ydFJ1bGVyPW4sdGhpcy5fZG9jdW1lbnQ9dH1hdHRhY2goKXt9ZW5hYmxlKCl7aWYodGhpcy5fY2FuQmVFbmFibGVkKCkpe2xldCBuPXRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudDt0aGlzLl9wcmV2aW91c1Njcm9sbFBvc2l0aW9uPXRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpLHRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcy5sZWZ0PW4uc3R5bGUubGVmdHx8IiIsdGhpcy5fcHJldmlvdXNIVE1MU3R5bGVzLnRvcD1uLnN0eWxlLnRvcHx8IiIsbi5zdHlsZS5sZWZ0PVkoLXRoaXMuX3ByZXZpb3VzU2Nyb2xsUG9zaXRpb24ubGVmdCksbi5zdHlsZS50b3A9WSgtdGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbi50b3ApLG4uY2xhc3NMaXN0LmFkZCgiY2RrLWdsb2JhbC1zY3JvbGxibG9jayIpLHRoaXMuX2lzRW5hYmxlZD0hMH19ZGlzYWJsZSgpe2lmKHRoaXMuX2lzRW5hYmxlZCl7bGV0IG49dGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHQ9dGhpcy5fZG9jdW1lbnQuYm9keSxlPW4uc3R5bGUscj10LnN0eWxlLG89ZS5zY3JvbGxCZWhhdmlvcnx8IiIsYT1yLnNjcm9sbEJlaGF2aW9yfHwiIjt0aGlzLl9pc0VuYWJsZWQ9ITEsZS5sZWZ0PXRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcy5sZWZ0LGUudG9wPXRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcy50b3Asbi5jbGFzc0xpc3QucmVtb3ZlKCJjZGstZ2xvYmFsLXNjcm9sbGJsb2NrIiksTmMmJihlLnNjcm9sbEJlaGF2aW9yPXIuc2Nyb2xsQmVoYXZpb3I9ImF1dG8iKSx3aW5kb3cuc2Nyb2xsKHRoaXMuX3ByZXZpb3VzU2Nyb2xsUG9zaXRpb24ubGVmdCx0aGlzLl9wcmV2aW91c1Njcm9sbFBvc2l0aW9uLnRvcCksTmMmJihlLnNjcm9sbEJlaGF2aW9yPW8sci5zY3JvbGxCZWhhdmlvcj1hKX19X2NhbkJlRW5hYmxlZCgpe2lmKHRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImNkay1nbG9iYWwtc2Nyb2xsYmxvY2siKXx8dGhpcy5faXNFbmFibGVkKXJldHVybiExO2xldCB0PXRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlPXRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTaXplKCk7cmV0dXJuIHQuc2Nyb2xsSGVpZ2h0PmUuaGVpZ2h0fHx0LnNjcm9sbFdpZHRoPmUud2lkdGh9fTtMcj1jbGFzc3tfc2Nyb2xsRGlzcGF0Y2hlcjtfbmdab25lO192aWV3cG9ydFJ1bGVyO19jb25maWc7X3Njcm9sbFN1YnNjcmlwdGlvbj1udWxsO19vdmVybGF5UmVmO19pbml0aWFsU2Nyb2xsUG9zaXRpb247Y29uc3RydWN0b3Iobix0LGUscil7dGhpcy5fc2Nyb2xsRGlzcGF0Y2hlcj1uLHRoaXMuX25nWm9uZT10LHRoaXMuX3ZpZXdwb3J0UnVsZXI9ZSx0aGlzLl9jb25maWc9cn1hdHRhY2gobil7dGhpcy5fb3ZlcmxheVJlZix0aGlzLl9vdmVybGF5UmVmPW59ZW5hYmxlKCl7aWYodGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uKXJldHVybjtsZXQgbj10aGlzLl9zY3JvbGxEaXNwYXRjaGVyLnNjcm9sbGVkKDApLnBpcGUoSyh0PT4hdHx8IXRoaXMuX292ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuY29udGFpbnModC5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudCkpKTt0aGlzLl9jb25maWcmJnRoaXMuX2NvbmZpZy50aHJlc2hvbGQmJnRoaXMuX2NvbmZpZy50aHJlc2hvbGQ+MT8odGhpcy5faW5pdGlhbFNjcm9sbFBvc2l0aW9uPXRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpLnRvcCx0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb249bi5zdWJzY3JpYmUoKCk9PntsZXQgdD10aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKS50b3A7TWF0aC5hYnModC10aGlzLl9pbml0aWFsU2Nyb2xsUG9zaXRpb24pPnRoaXMuX2NvbmZpZy50aHJlc2hvbGQ/dGhpcy5fZGV0YWNoKCk6dGhpcy5fb3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpfSkpOnRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj1uLnN1YnNjcmliZSh0aGlzLl9kZXRhY2gpfWRpc2FibGUoKXt0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24mJih0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb249bnVsbCl9ZGV0YWNoKCl7dGhpcy5kaXNhYmxlKCksdGhpcy5fb3ZlcmxheVJlZj1udWxsfV9kZXRhY2g9KCk9Pnt0aGlzLmRpc2FibGUoKSx0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkmJnRoaXMuX25nWm9uZS5ydW4oKCk9PnRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCkpfX0seW49Y2xhc3N7ZW5hYmxlKCl7fWRpc2FibGUoKXt9YXR0YWNoKCl7fX07VnI9Y2xhc3N7X3Njcm9sbERpc3BhdGNoZXI7X3ZpZXdwb3J0UnVsZXI7X25nWm9uZTtfY29uZmlnO19zY3JvbGxTdWJzY3JpcHRpb249bnVsbDtfb3ZlcmxheVJlZjtjb25zdHJ1Y3RvcihuLHQsZSxyKXt0aGlzLl9zY3JvbGxEaXNwYXRjaGVyPW4sdGhpcy5fdmlld3BvcnRSdWxlcj10LHRoaXMuX25nWm9uZT1lLHRoaXMuX2NvbmZpZz1yfWF0dGFjaChuKXt0aGlzLl9vdmVybGF5UmVmLHRoaXMuX292ZXJsYXlSZWY9bn1lbmFibGUoKXtpZighdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uKXtsZXQgbj10aGlzLl9jb25maWc/dGhpcy5fY29uZmlnLnNjcm9sbFRocm90dGxlOjA7dGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uPXRoaXMuX3Njcm9sbERpc3BhdGNoZXIuc2Nyb2xsZWQobikuc3Vic2NyaWJlKCgpPT57aWYodGhpcy5fb3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpLHRoaXMuX2NvbmZpZyYmdGhpcy5fY29uZmlnLmF1dG9DbG9zZSl7bGV0IHQ9dGhpcy5fb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6ZSxoZWlnaHQ6cn09dGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNpemUoKTtVYSh0LFt7d2lkdGg6ZSxoZWlnaHQ6cixib3R0b206cixyaWdodDplLHRvcDowLGxlZnQ6MH1dKSYmKHRoaXMuZGlzYWJsZSgpLHRoaXMuX25nWm9uZS5ydW4oKCk9PnRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCkpKX19KX19ZGlzYWJsZSgpe3RoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbiYmKHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj1udWxsKX1kZXRhY2goKXt0aGlzLmRpc2FibGUoKSx0aGlzLl9vdmVybGF5UmVmPW51bGx9fSwkYz0oKCk9PntjbGFzcyBpe19pbmplY3Rvcj1sKE4pO2NvbnN0cnVjdG9yKCl7fW5vb3A9KCk9Pm5ldyB5bjtjbG9zZT10PT5IYyh0aGlzLl9pbmplY3Rvcix0KTtibG9jaz0oKT0+VWModGhpcy5faW5qZWN0b3IpO3JlcG9zaXRpb249dD0+SHIodGhpcy5faW5qZWN0b3IsdCk7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCksV2U9Y2xhc3N7cG9zaXRpb25TdHJhdGVneTtzY3JvbGxTdHJhdGVneT1uZXcgeW47cGFuZWxDbGFzcz0iIjtoYXNCYWNrZHJvcD0hMTtiYWNrZHJvcENsYXNzPSJjZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wIjtkaXNhYmxlQW5pbWF0aW9uczt3aWR0aDtoZWlnaHQ7bWluV2lkdGg7bWluSGVpZ2h0O21heFdpZHRoO21heEhlaWdodDtkaXJlY3Rpb247ZGlzcG9zZU9uTmF2aWdhdGlvbj0hMTtjb25zdHJ1Y3RvcihuKXtpZihuKXtsZXQgdD1PYmplY3Qua2V5cyhuKTtmb3IobGV0IGUgb2YgdCluW2VdIT09dm9pZCAwJiYodGhpc1tlXT1uW2VdKX19fSxqcj1jbGFzc3tjb25uZWN0aW9uUGFpcjtzY3JvbGxhYmxlVmlld1Byb3BlcnRpZXM7Y29uc3RydWN0b3Iobix0KXt0aGlzLmNvbm5lY3Rpb25QYWlyPW4sdGhpcy5zY3JvbGxhYmxlVmlld1Byb3BlcnRpZXM9dH19LFdjPSgoKT0+e2NsYXNzIGl7X2F0dGFjaGVkT3ZlcmxheXM9W107X2RvY3VtZW50PWwoTyk7X2lzQXR0YWNoZWQ7Y29uc3RydWN0b3IoKXt9bmdPbkRlc3Ryb3koKXt0aGlzLmRldGFjaCgpfWFkZCh0KXt0aGlzLnJlbW92ZSh0KSx0aGlzLl9hdHRhY2hlZE92ZXJsYXlzLnB1c2godCl9cmVtb3ZlKHQpe2xldCBlPXRoaXMuX2F0dGFjaGVkT3ZlcmxheXMuaW5kZXhPZih0KTtlPi0xJiZ0aGlzLl9hdHRhY2hlZE92ZXJsYXlzLnNwbGljZShlLDEpLHRoaXMuX2F0dGFjaGVkT3ZlcmxheXMubGVuZ3RoPT09MCYmdGhpcy5kZXRhY2goKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKSxHYz0oKCk9PntjbGFzcyBpIGV4dGVuZHMgV2N7X25nWm9uZT1sKEUpO19yZW5kZXJlcj1sKGt0KS5jcmVhdGVSZW5kZXJlcihudWxsLG51bGwpO19jbGVhbnVwS2V5ZG93bjthZGQodCl7c3VwZXIuYWRkKHQpLHRoaXMuX2lzQXR0YWNoZWR8fCh0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLl9jbGVhbnVwS2V5ZG93bj10aGlzLl9yZW5kZXJlci5saXN0ZW4oImJvZHkiLCJrZXlkb3duIix0aGlzLl9rZXlkb3duTGlzdGVuZXIpfSksdGhpcy5faXNBdHRhY2hlZD0hMCl9ZGV0YWNoKCl7dGhpcy5faXNBdHRhY2hlZCYmKHRoaXMuX2NsZWFudXBLZXlkb3duPy4oKSx0aGlzLl9pc0F0dGFjaGVkPSExKX1fa2V5ZG93bkxpc3RlbmVyPXQ9PntsZXQgZT10aGlzLl9hdHRhY2hlZE92ZXJsYXlzO2ZvcihsZXQgcj1lLmxlbmd0aC0xO3I+LTE7ci0tKWlmKGVbcl0uX2tleWRvd25FdmVudHMub2JzZXJ2ZXJzLmxlbmd0aD4wKXt0aGlzLl9uZ1pvbmUucnVuKCgpPT5lW3JdLl9rZXlkb3duRXZlbnRzLm5leHQodCkpO2JyZWFrfX07c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgdDtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuKHR8fCh0PVooaSkpKShyfHxpKX19KSgpO3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKSxxYz0oKCk9PntjbGFzcyBpIGV4dGVuZHMgV2N7X3BsYXRmb3JtPWwoVCk7X25nWm9uZT1sKEUpO19yZW5kZXJlcj1sKGt0KS5jcmVhdGVSZW5kZXJlcihudWxsLG51bGwpO19jdXJzb3JPcmlnaW5hbFZhbHVlO19jdXJzb3JTdHlsZUlzU2V0PSExO19wb2ludGVyRG93bkV2ZW50VGFyZ2V0O19jbGVhbnVwczthZGQodCl7aWYoc3VwZXIuYWRkKHQpLCF0aGlzLl9pc0F0dGFjaGVkKXtsZXQgZT10aGlzLl9kb2N1bWVudC5ib2R5LHI9e2NhcHR1cmU6ITB9LG89dGhpcy5fcmVuZGVyZXI7dGhpcy5fY2xlYW51cHM9dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT5bby5saXN0ZW4oZSwicG9pbnRlcmRvd24iLHRoaXMuX3BvaW50ZXJEb3duTGlzdGVuZXIsciksby5saXN0ZW4oZSwiY2xpY2siLHRoaXMuX2NsaWNrTGlzdGVuZXIsciksby5saXN0ZW4oZSwiYXV4Y2xpY2siLHRoaXMuX2NsaWNrTGlzdGVuZXIsciksby5saXN0ZW4oZSwiY29udGV4dG1lbnUiLHRoaXMuX2NsaWNrTGlzdGVuZXIscildKSx0aGlzLl9wbGF0Zm9ybS5JT1MmJiF0aGlzLl9jdXJzb3JTdHlsZUlzU2V0JiYodGhpcy5fY3Vyc29yT3JpZ2luYWxWYWx1ZT1lLnN0eWxlLmN1cnNvcixlLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy5fY3Vyc29yU3R5bGVJc1NldD0hMCksdGhpcy5faXNBdHRhY2hlZD0hMH19ZGV0YWNoKCl7dGhpcy5faXNBdHRhY2hlZCYmKHRoaXMuX2NsZWFudXBzPy5mb3JFYWNoKHQ9PnQoKSksdGhpcy5fY2xlYW51cHM9dm9pZCAwLHRoaXMuX3BsYXRmb3JtLklPUyYmdGhpcy5fY3Vyc29yU3R5bGVJc1NldCYmKHRoaXMuX2RvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yPXRoaXMuX2N1cnNvck9yaWdpbmFsVmFsdWUsdGhpcy5fY3Vyc29yU3R5bGVJc1NldD0hMSksdGhpcy5faXNBdHRhY2hlZD0hMSl9X3BvaW50ZXJEb3duTGlzdGVuZXI9dD0+e3RoaXMuX3BvaW50ZXJEb3duRXZlbnRUYXJnZXQ9eHQodCl9O19jbGlja0xpc3RlbmVyPXQ9PntsZXQgZT14dCh0KSxyPXQudHlwZT09PSJjbGljayImJnRoaXMuX3BvaW50ZXJEb3duRXZlbnRUYXJnZXQ/dGhpcy5fcG9pbnRlckRvd25FdmVudFRhcmdldDplO3RoaXMuX3BvaW50ZXJEb3duRXZlbnRUYXJnZXQ9bnVsbDtsZXQgbz10aGlzLl9hdHRhY2hlZE92ZXJsYXlzLnNsaWNlKCk7Zm9yKGxldCBhPW8ubGVuZ3RoLTE7YT4tMTthLS0pe2xldCBzPW9bYV07aWYocy5fb3V0c2lkZVBvaW50ZXJFdmVudHMub2JzZXJ2ZXJzLmxlbmd0aDwxfHwhcy5oYXNBdHRhY2hlZCgpKWNvbnRpbnVlO2lmKExjKHMub3ZlcmxheUVsZW1lbnQsZSl8fExjKHMub3ZlcmxheUVsZW1lbnQscikpYnJlYWs7bGV0IGM9cy5fb3V0c2lkZVBvaW50ZXJFdmVudHM7dGhpcy5fbmdab25lP3RoaXMuX25nWm9uZS5ydW4oKCk9PmMubmV4dCh0KSk6Yy5uZXh0KHQpfX07c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgdDtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuKHR8fCh0PVooaSkpKShyfHxpKX19KSgpO3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKTtZYz0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWNtcD1QKHt0eXBlOmksc2VsZWN0b3JzOltbIm5nLWNvbXBvbmVudCJdXSxob3N0QXR0cnM6WyJjZGstb3ZlcmxheS1zdHlsZS1sb2FkZXIiLCIiXSxkZWNsczowLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbihlLHIpe30sc3R5bGVzOltgLmNkay1vdmVybGF5LWNvbnRhaW5lciwuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVye3Bvc2l0aW9uOmZpeGVkfUBsYXllciBjZGstb3ZlcmxheXsuY2RrLW92ZXJsYXktY29udGFpbmVye3otaW5kZXg6MTAwMH19LmNkay1vdmVybGF5LWNvbnRhaW5lcjplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVye2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZX1AbGF5ZXIgY2RrLW92ZXJsYXl7LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVye3otaW5kZXg6MTAwMH19LmNkay1vdmVybGF5LXBhbmV7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX1AbGF5ZXIgY2RrLW92ZXJsYXl7LmNkay1vdmVybGF5LXBhbmV7ei1pbmRleDoxMDAwfX0uY2RrLW92ZXJsYXktYmFja2Ryb3B7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKTtvcGFjaXR5OjA7dG91Y2gtYWN0aW9uOm1hbmlwdWxhdGlvbn1AbGF5ZXIgY2RrLW92ZXJsYXl7LmNkay1vdmVybGF5LWJhY2tkcm9we3otaW5kZXg6MTAwMDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9fUBtZWRpYShwcmVmZXJzLXJlZHVjZWQtbW90aW9uKXsuY2RrLW92ZXJsYXktYmFja2Ryb3B7dHJhbnNpdGlvbi1kdXJhdGlvbjoxbXN9fS5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5ne29wYWNpdHk6MX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5Oi42fX1AbGF5ZXIgY2RrLW92ZXJsYXl7LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3B7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9fS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcHt0cmFuc2l0aW9uOnZpc2liaWxpdHkgMW1zIGxpbmVhcixvcGFjaXR5IDFtcyBsaW5lYXI7dmlzaWJpbGl0eTpoaWRkZW47b3BhY2l0eToxfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9we29wYWNpdHk6MDt2aXNpYmlsaXR5OnZpc2libGV9LmNkay1vdmVybGF5LWJhY2tkcm9wLW5vb3AtYW5pbWF0aW9ue3RyYW5zaXRpb246bm9uZX0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveHtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9QGxheWVyIGNkay1vdmVybGF5ey5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94e3otaW5kZXg6MTAwMH19LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2t7cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH0KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIGl9KSgpLFdhPSgoKT0+e2NsYXNzIGl7X3BsYXRmb3JtPWwoVCk7X2NvbnRhaW5lckVsZW1lbnQ7X2RvY3VtZW50PWwoTyk7X3N0eWxlTG9hZGVyPWwoTXQpO2NvbnN0cnVjdG9yKCl7fW5nT25EZXN0cm95KCl7dGhpcy5fY29udGFpbmVyRWxlbWVudD8ucmVtb3ZlKCl9Z2V0Q29udGFpbmVyRWxlbWVudCgpe3JldHVybiB0aGlzLl9sb2FkU3R5bGVzKCksdGhpcy5fY29udGFpbmVyRWxlbWVudHx8dGhpcy5fY3JlYXRlQ29udGFpbmVyKCksdGhpcy5fY29udGFpbmVyRWxlbWVudH1fY3JlYXRlQ29udGFpbmVyKCl7bGV0IHQ9ImNkay1vdmVybGF5LWNvbnRhaW5lciI7aWYodGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyfHxNYSgpKXtsZXQgcj10aGlzLl9kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAuJHt0fVtwbGF0Zm9ybT0ic2VydmVyIl0sIC4ke3R9W3BsYXRmb3JtPSJ0ZXN0Il1gKTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKylyW29dLnJlbW92ZSgpfWxldCBlPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NMaXN0LmFkZCh0KSxNYSgpP2Uuc2V0QXR0cmlidXRlKCJwbGF0Zm9ybSIsInRlc3QiKTp0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXJ8fGUuc2V0QXR0cmlidXRlKCJwbGF0Zm9ybSIsInNlcnZlciIpLHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSksdGhpcy5fY29udGFpbmVyRWxlbWVudD1lfV9sb2FkU3R5bGVzKCl7dGhpcy5fc3R5bGVMb2FkZXIubG9hZChZYyl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCksSGE9Y2xhc3N7X3JlbmRlcmVyO19uZ1pvbmU7ZWxlbWVudDtfY2xlYW51cENsaWNrO19jbGVhbnVwVHJhbnNpdGlvbkVuZDtfZmFsbGJhY2tUaW1lb3V0O2NvbnN0cnVjdG9yKG4sdCxlLHIpe3RoaXMuX3JlbmRlcmVyPXQsdGhpcy5fbmdab25lPWUsdGhpcy5lbGVtZW50PW4uY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoImNkay1vdmVybGF5LWJhY2tkcm9wIiksdGhpcy5fY2xlYW51cENsaWNrPXQubGlzdGVuKHRoaXMuZWxlbWVudCwiY2xpY2siLHIpfWRldGFjaCgpe3RoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e2xldCBuPXRoaXMuZWxlbWVudDtjbGVhclRpbWVvdXQodGhpcy5fZmFsbGJhY2tUaW1lb3V0KSx0aGlzLl9jbGVhbnVwVHJhbnNpdGlvbkVuZD8uKCksdGhpcy5fY2xlYW51cFRyYW5zaXRpb25FbmQ9dGhpcy5fcmVuZGVyZXIubGlzdGVuKG4sInRyYW5zaXRpb25lbmQiLHRoaXMuZGlzcG9zZSksdGhpcy5fZmFsbGJhY2tUaW1lb3V0PXNldFRpbWVvdXQodGhpcy5kaXNwb3NlLDUwMCksbi5zdHlsZS5wb2ludGVyRXZlbnRzPSJub25lIixuLmNsYXNzTGlzdC5yZW1vdmUoImNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmciKX0pfWRpc3Bvc2U9KCk9PntjbGVhclRpbWVvdXQodGhpcy5fZmFsbGJhY2tUaW1lb3V0KSx0aGlzLl9jbGVhbnVwQ2xpY2s/LigpLHRoaXMuX2NsZWFudXBUcmFuc2l0aW9uRW5kPy4oKSx0aGlzLl9jbGVhbnVwQ2xpY2s9dGhpcy5fY2xlYW51cFRyYW5zaXRpb25FbmQ9dGhpcy5fZmFsbGJhY2tUaW1lb3V0PXZvaWQgMCx0aGlzLmVsZW1lbnQucmVtb3ZlKCl9fSxCcj1jbGFzc3tfcG9ydGFsT3V0bGV0O19ob3N0O19wYW5lO19jb25maWc7X25nWm9uZTtfa2V5Ym9hcmREaXNwYXRjaGVyO19kb2N1bWVudDtfbG9jYXRpb247X291dHNpZGVDbGlja0Rpc3BhdGNoZXI7X2FuaW1hdGlvbnNEaXNhYmxlZDtfaW5qZWN0b3I7X3JlbmRlcmVyO19iYWNrZHJvcENsaWNrPW5ldyB5O19hdHRhY2htZW50cz1uZXcgeTtfZGV0YWNobWVudHM9bmV3IHk7X3Bvc2l0aW9uU3RyYXRlZ3k7X3Njcm9sbFN0cmF0ZWd5O19sb2NhdGlvbkNoYW5nZXM9ZnQuRU1QVFk7X2JhY2tkcm9wUmVmPW51bGw7X2RldGFjaENvbnRlbnRNdXRhdGlvbk9ic2VydmVyO19kZXRhY2hDb250ZW50QWZ0ZXJSZW5kZXJSZWY7X3ByZXZpb3VzSG9zdFBhcmVudDtfa2V5ZG93bkV2ZW50cz1uZXcgeTtfb3V0c2lkZVBvaW50ZXJFdmVudHM9bmV3IHk7X2FmdGVyTmV4dFJlbmRlclJlZjtjb25zdHJ1Y3RvcihuLHQsZSxyLG8sYSxzLGMsZCx1PSExLHgsail7dGhpcy5fcG9ydGFsT3V0bGV0PW4sdGhpcy5faG9zdD10LHRoaXMuX3BhbmU9ZSx0aGlzLl9jb25maWc9cix0aGlzLl9uZ1pvbmU9byx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXI9YSx0aGlzLl9kb2N1bWVudD1zLHRoaXMuX2xvY2F0aW9uPWMsdGhpcy5fb3V0c2lkZUNsaWNrRGlzcGF0Y2hlcj1kLHRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZD11LHRoaXMuX2luamVjdG9yPXgsdGhpcy5fcmVuZGVyZXI9aixyLnNjcm9sbFN0cmF0ZWd5JiYodGhpcy5fc2Nyb2xsU3RyYXRlZ3k9ci5zY3JvbGxTdHJhdGVneSx0aGlzLl9zY3JvbGxTdHJhdGVneS5hdHRhY2godGhpcykpLHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3k9ci5wb3NpdGlvblN0cmF0ZWd5fWdldCBvdmVybGF5RWxlbWVudCgpe3JldHVybiB0aGlzLl9wYW5lfWdldCBiYWNrZHJvcEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fYmFja2Ryb3BSZWY/LmVsZW1lbnR8fG51bGx9Z2V0IGhvc3RFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2hvc3R9YXR0YWNoKG4peyF0aGlzLl9ob3N0LnBhcmVudEVsZW1lbnQmJnRoaXMuX3ByZXZpb3VzSG9zdFBhcmVudCYmdGhpcy5fcHJldmlvdXNIb3N0UGFyZW50LmFwcGVuZENoaWxkKHRoaXMuX2hvc3QpO2xldCB0PXRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2gobik7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kmJnRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuYXR0YWNoKHRoaXMpLHRoaXMuX3VwZGF0ZVN0YWNraW5nT3JkZXIoKSx0aGlzLl91cGRhdGVFbGVtZW50U2l6ZSgpLHRoaXMuX3VwZGF0ZUVsZW1lbnREaXJlY3Rpb24oKSx0aGlzLl9zY3JvbGxTdHJhdGVneSYmdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuZW5hYmxlKCksdGhpcy5fYWZ0ZXJOZXh0UmVuZGVyUmVmPy5kZXN0cm95KCksdGhpcy5fYWZ0ZXJOZXh0UmVuZGVyUmVmPU90KCgpPT57dGhpcy5oYXNBdHRhY2hlZCgpJiZ0aGlzLnVwZGF0ZVBvc2l0aW9uKCl9LHtpbmplY3Rvcjp0aGlzLl9pbmplY3Rvcn0pLHRoaXMuX3RvZ2dsZVBvaW50ZXJFdmVudHMoITApLHRoaXMuX2NvbmZpZy5oYXNCYWNrZHJvcCYmdGhpcy5fYXR0YWNoQmFja2Ryb3AoKSx0aGlzLl9jb25maWcucGFuZWxDbGFzcyYmdGhpcy5fdG9nZ2xlQ2xhc3Nlcyh0aGlzLl9wYW5lLHRoaXMuX2NvbmZpZy5wYW5lbENsYXNzLCEwKSx0aGlzLl9hdHRhY2htZW50cy5uZXh0KCksdGhpcy5fY29tcGxldGVEZXRhY2hDb250ZW50KCksdGhpcy5fa2V5Ym9hcmREaXNwYXRjaGVyLmFkZCh0aGlzKSx0aGlzLl9jb25maWcuZGlzcG9zZU9uTmF2aWdhdGlvbiYmKHRoaXMuX2xvY2F0aW9uQ2hhbmdlcz10aGlzLl9sb2NhdGlvbi5zdWJzY3JpYmUoKCk9PnRoaXMuZGlzcG9zZSgpKSksdGhpcy5fb3V0c2lkZUNsaWNrRGlzcGF0Y2hlci5hZGQodGhpcyksdHlwZW9mIHQ/Lm9uRGVzdHJveT09ImZ1bmN0aW9uIiYmdC5vbkRlc3Ryb3koKCk9Pnt0aGlzLmhhc0F0dGFjaGVkKCkmJnRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+dGhpcy5kZXRhY2goKSkpfSksdH1kZXRhY2goKXtpZighdGhpcy5oYXNBdHRhY2hlZCgpKXJldHVybjt0aGlzLmRldGFjaEJhY2tkcm9wKCksdGhpcy5fdG9nZ2xlUG9pbnRlckV2ZW50cyghMSksdGhpcy5fcG9zaXRpb25TdHJhdGVneSYmdGhpcy5fcG9zaXRpb25TdHJhdGVneS5kZXRhY2gmJnRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuZGV0YWNoKCksdGhpcy5fc2Nyb2xsU3RyYXRlZ3kmJnRoaXMuX3Njcm9sbFN0cmF0ZWd5LmRpc2FibGUoKTtsZXQgbj10aGlzLl9wb3J0YWxPdXRsZXQuZGV0YWNoKCk7cmV0dXJuIHRoaXMuX2RldGFjaG1lbnRzLm5leHQoKSx0aGlzLl9jb21wbGV0ZURldGFjaENvbnRlbnQoKSx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXIucmVtb3ZlKHRoaXMpLHRoaXMuX2RldGFjaENvbnRlbnRXaGVuRW1wdHkoKSx0aGlzLl9sb2NhdGlvbkNoYW5nZXMudW5zdWJzY3JpYmUoKSx0aGlzLl9vdXRzaWRlQ2xpY2tEaXNwYXRjaGVyLnJlbW92ZSh0aGlzKSxufWRpc3Bvc2UoKXtsZXQgbj10aGlzLmhhc0F0dGFjaGVkKCk7dGhpcy5fcG9zaXRpb25TdHJhdGVneSYmdGhpcy5fcG9zaXRpb25TdHJhdGVneS5kaXNwb3NlKCksdGhpcy5fZGlzcG9zZVNjcm9sbFN0cmF0ZWd5KCksdGhpcy5fYmFja2Ryb3BSZWY/LmRpc3Bvc2UoKSx0aGlzLl9sb2NhdGlvbkNoYW5nZXMudW5zdWJzY3JpYmUoKSx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXIucmVtb3ZlKHRoaXMpLHRoaXMuX3BvcnRhbE91dGxldC5kaXNwb3NlKCksdGhpcy5fYXR0YWNobWVudHMuY29tcGxldGUoKSx0aGlzLl9iYWNrZHJvcENsaWNrLmNvbXBsZXRlKCksdGhpcy5fa2V5ZG93bkV2ZW50cy5jb21wbGV0ZSgpLHRoaXMuX291dHNpZGVQb2ludGVyRXZlbnRzLmNvbXBsZXRlKCksdGhpcy5fb3V0c2lkZUNsaWNrRGlzcGF0Y2hlci5yZW1vdmUodGhpcyksdGhpcy5faG9zdD8ucmVtb3ZlKCksdGhpcy5fYWZ0ZXJOZXh0UmVuZGVyUmVmPy5kZXN0cm95KCksdGhpcy5fcHJldmlvdXNIb3N0UGFyZW50PXRoaXMuX3BhbmU9dGhpcy5faG9zdD10aGlzLl9iYWNrZHJvcFJlZj1udWxsLG4mJnRoaXMuX2RldGFjaG1lbnRzLm5leHQoKSx0aGlzLl9kZXRhY2htZW50cy5jb21wbGV0ZSgpLHRoaXMuX2NvbXBsZXRlRGV0YWNoQ29udGVudCgpfWhhc0F0dGFjaGVkKCl7cmV0dXJuIHRoaXMuX3BvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpfWJhY2tkcm9wQ2xpY2soKXtyZXR1cm4gdGhpcy5fYmFja2Ryb3BDbGlja31hdHRhY2htZW50cygpe3JldHVybiB0aGlzLl9hdHRhY2htZW50c31kZXRhY2htZW50cygpe3JldHVybiB0aGlzLl9kZXRhY2htZW50c31rZXlkb3duRXZlbnRzKCl7cmV0dXJuIHRoaXMuX2tleWRvd25FdmVudHN9b3V0c2lkZVBvaW50ZXJFdmVudHMoKXtyZXR1cm4gdGhpcy5fb3V0c2lkZVBvaW50ZXJFdmVudHN9Z2V0Q29uZmlnKCl7cmV0dXJuIHRoaXMuX2NvbmZpZ311cGRhdGVQb3NpdGlvbigpe3RoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kmJnRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuYXBwbHkoKX11cGRhdGVQb3NpdGlvblN0cmF0ZWd5KG4pe24hPT10aGlzLl9wb3NpdGlvblN0cmF0ZWd5JiYodGhpcy5fcG9zaXRpb25TdHJhdGVneSYmdGhpcy5fcG9zaXRpb25TdHJhdGVneS5kaXNwb3NlKCksdGhpcy5fcG9zaXRpb25TdHJhdGVneT1uLHRoaXMuaGFzQXR0YWNoZWQoKSYmKG4uYXR0YWNoKHRoaXMpLHRoaXMudXBkYXRlUG9zaXRpb24oKSkpfXVwZGF0ZVNpemUobil7dGhpcy5fY29uZmlnPWgoaCh7fSx0aGlzLl9jb25maWcpLG4pLHRoaXMuX3VwZGF0ZUVsZW1lbnRTaXplKCl9c2V0RGlyZWN0aW9uKG4pe3RoaXMuX2NvbmZpZz0kKGgoe30sdGhpcy5fY29uZmlnKSx7ZGlyZWN0aW9uOm59KSx0aGlzLl91cGRhdGVFbGVtZW50RGlyZWN0aW9uKCl9YWRkUGFuZWxDbGFzcyhuKXt0aGlzLl9wYW5lJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsbiwhMCl9cmVtb3ZlUGFuZWxDbGFzcyhuKXt0aGlzLl9wYW5lJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsbiwhMSl9Z2V0RGlyZWN0aW9uKCl7bGV0IG49dGhpcy5fY29uZmlnLmRpcmVjdGlvbjtyZXR1cm4gbj90eXBlb2Ygbj09InN0cmluZyI/bjpuLnZhbHVlOiJsdHIifXVwZGF0ZVNjcm9sbFN0cmF0ZWd5KG4pe24hPT10aGlzLl9zY3JvbGxTdHJhdGVneSYmKHRoaXMuX2Rpc3Bvc2VTY3JvbGxTdHJhdGVneSgpLHRoaXMuX3Njcm9sbFN0cmF0ZWd5PW4sdGhpcy5oYXNBdHRhY2hlZCgpJiYobi5hdHRhY2godGhpcyksbi5lbmFibGUoKSkpfV91cGRhdGVFbGVtZW50RGlyZWN0aW9uKCl7dGhpcy5faG9zdC5zZXRBdHRyaWJ1dGUoImRpciIsdGhpcy5nZXREaXJlY3Rpb24oKSl9X3VwZGF0ZUVsZW1lbnRTaXplKCl7aWYoIXRoaXMuX3BhbmUpcmV0dXJuO2xldCBuPXRoaXMuX3BhbmUuc3R5bGU7bi53aWR0aD1ZKHRoaXMuX2NvbmZpZy53aWR0aCksbi5oZWlnaHQ9WSh0aGlzLl9jb25maWcuaGVpZ2h0KSxuLm1pbldpZHRoPVkodGhpcy5fY29uZmlnLm1pbldpZHRoKSxuLm1pbkhlaWdodD1ZKHRoaXMuX2NvbmZpZy5taW5IZWlnaHQpLG4ubWF4V2lkdGg9WSh0aGlzLl9jb25maWcubWF4V2lkdGgpLG4ubWF4SGVpZ2h0PVkodGhpcy5fY29uZmlnLm1heEhlaWdodCl9X3RvZ2dsZVBvaW50ZXJFdmVudHMobil7dGhpcy5fcGFuZS5zdHlsZS5wb2ludGVyRXZlbnRzPW4/IiI6Im5vbmUifV9hdHRhY2hCYWNrZHJvcCgpe2xldCBuPSJjZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIjt0aGlzLl9iYWNrZHJvcFJlZj8uZGlzcG9zZSgpLHRoaXMuX2JhY2tkcm9wUmVmPW5ldyBIYSh0aGlzLl9kb2N1bWVudCx0aGlzLl9yZW5kZXJlcix0aGlzLl9uZ1pvbmUsdD0+e3RoaXMuX2JhY2tkcm9wQ2xpY2submV4dCh0KX0pLHRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZCYmdGhpcy5fYmFja2Ryb3BSZWYuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJjZGstb3ZlcmxheS1iYWNrZHJvcC1ub29wLWFuaW1hdGlvbiIpLHRoaXMuX2NvbmZpZy5iYWNrZHJvcENsYXNzJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX2JhY2tkcm9wUmVmLmVsZW1lbnQsdGhpcy5fY29uZmlnLmJhY2tkcm9wQ2xhc3MsITApLHRoaXMuX2hvc3QucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5fYmFja2Ryb3BSZWYuZWxlbWVudCx0aGlzLl9ob3N0KSwhdGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkJiZ0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lPCJ1Ij90aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMuX2JhY2tkcm9wUmVmPy5lbGVtZW50LmNsYXNzTGlzdC5hZGQobikpfSk6dGhpcy5fYmFja2Ryb3BSZWYuZWxlbWVudC5jbGFzc0xpc3QuYWRkKG4pfV91cGRhdGVTdGFja2luZ09yZGVyKCl7dGhpcy5faG9zdC5uZXh0U2libGluZyYmdGhpcy5faG9zdC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMuX2hvc3QpfWRldGFjaEJhY2tkcm9wKCl7dGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkPyh0aGlzLl9iYWNrZHJvcFJlZj8uZGlzcG9zZSgpLHRoaXMuX2JhY2tkcm9wUmVmPW51bGwpOnRoaXMuX2JhY2tkcm9wUmVmPy5kZXRhY2goKX1fdG9nZ2xlQ2xhc3NlcyhuLHQsZSl7bGV0IHI9d2kodHx8W10pLmZpbHRlcihvPT4hIW8pO3IubGVuZ3RoJiYoZT9uLmNsYXNzTGlzdC5hZGQoLi4ucik6bi5jbGFzc0xpc3QucmVtb3ZlKC4uLnIpKX1fZGV0YWNoQ29udGVudFdoZW5FbXB0eSgpe2xldCBuPSExO3RyeXt0aGlzLl9kZXRhY2hDb250ZW50QWZ0ZXJSZW5kZXJSZWY9T3QoKCk9PntuPSEwLHRoaXMuX2RldGFjaENvbnRlbnQoKX0se2luamVjdG9yOnRoaXMuX2luamVjdG9yfSl9Y2F0Y2godCl7aWYobil0aHJvdyB0O3RoaXMuX2RldGFjaENvbnRlbnQoKX1nbG9iYWxUaGlzLk11dGF0aW9uT2JzZXJ2ZXImJnRoaXMuX3BhbmUmJih0aGlzLl9kZXRhY2hDb250ZW50TXV0YXRpb25PYnNlcnZlcnx8PW5ldyBnbG9iYWxUaGlzLk11dGF0aW9uT2JzZXJ2ZXIoKCk9Pnt0aGlzLl9kZXRhY2hDb250ZW50KCl9KSx0aGlzLl9kZXRhY2hDb250ZW50TXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKHRoaXMuX3BhbmUse2NoaWxkTGlzdDohMH0pKX1fZGV0YWNoQ29udGVudCgpeyghdGhpcy5fcGFuZXx8IXRoaXMuX2hvc3R8fHRoaXMuX3BhbmUuY2hpbGRyZW4ubGVuZ3RoPT09MCkmJih0aGlzLl9wYW5lJiZ0aGlzLl9jb25maWcucGFuZWxDbGFzcyYmdGhpcy5fdG9nZ2xlQ2xhc3Nlcyh0aGlzLl9wYW5lLHRoaXMuX2NvbmZpZy5wYW5lbENsYXNzLCExKSx0aGlzLl9ob3N0JiZ0aGlzLl9ob3N0LnBhcmVudEVsZW1lbnQmJih0aGlzLl9wcmV2aW91c0hvc3RQYXJlbnQ9dGhpcy5faG9zdC5wYXJlbnRFbGVtZW50LHRoaXMuX2hvc3QucmVtb3ZlKCkpLHRoaXMuX2NvbXBsZXRlRGV0YWNoQ29udGVudCgpKX1fY29tcGxldGVEZXRhY2hDb250ZW50KCl7dGhpcy5fZGV0YWNoQ29udGVudEFmdGVyUmVuZGVyUmVmPy5kZXN0cm95KCksdGhpcy5fZGV0YWNoQ29udGVudEFmdGVyUmVuZGVyUmVmPXZvaWQgMCx0aGlzLl9kZXRhY2hDb250ZW50TXV0YXRpb25PYnNlcnZlcj8uZGlzY29ubmVjdCgpfV9kaXNwb3NlU2Nyb2xsU3RyYXRlZ3koKXtsZXQgbj10aGlzLl9zY3JvbGxTdHJhdGVneTtuPy5kaXNhYmxlKCksbj8uZGV0YWNoPy4oKX19LFZjPSJjZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94Iix0Zj0vKFtBLVphLXolXSspJC87enI9Y2xhc3N7X3ZpZXdwb3J0UnVsZXI7X2RvY3VtZW50O19wbGF0Zm9ybTtfb3ZlcmxheUNvbnRhaW5lcjtfb3ZlcmxheVJlZjtfaXNJbml0aWFsUmVuZGVyO19sYXN0Qm91bmRpbmdCb3hTaXplPXt3aWR0aDowLGhlaWdodDowfTtfaXNQdXNoZWQ9ITE7X2NhblB1c2g9ITA7X2dyb3dBZnRlck9wZW49ITE7X2hhc0ZsZXhpYmxlRGltZW5zaW9ucz0hMDtfcG9zaXRpb25Mb2NrZWQ9ITE7X29yaWdpblJlY3Q7X292ZXJsYXlSZWN0O192aWV3cG9ydFJlY3Q7X2NvbnRhaW5lclJlY3Q7X3ZpZXdwb3J0TWFyZ2luPTA7X3Njcm9sbGFibGVzPVtdO19wcmVmZXJyZWRQb3NpdGlvbnM9W107X29yaWdpbjtfcGFuZTtfaXNEaXNwb3NlZDtfYm91bmRpbmdCb3g7X2xhc3RQb3NpdGlvbjtfbGFzdFNjcm9sbFZpc2liaWxpdHk7X3Bvc2l0aW9uQ2hhbmdlcz1uZXcgeTtfcmVzaXplU3Vic2NyaXB0aW9uPWZ0LkVNUFRZO19vZmZzZXRYPTA7X29mZnNldFk9MDtfdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3I7X2FwcGxpZWRQYW5lbENsYXNzZXM9W107X3ByZXZpb3VzUHVzaEFtb3VudDtwb3NpdGlvbkNoYW5nZXM9dGhpcy5fcG9zaXRpb25DaGFuZ2VzO2dldCBwb3NpdGlvbnMoKXtyZXR1cm4gdGhpcy5fcHJlZmVycmVkUG9zaXRpb25zfWNvbnN0cnVjdG9yKG4sdCxlLHIsbyl7dGhpcy5fdmlld3BvcnRSdWxlcj10LHRoaXMuX2RvY3VtZW50PWUsdGhpcy5fcGxhdGZvcm09cix0aGlzLl9vdmVybGF5Q29udGFpbmVyPW8sdGhpcy5zZXRPcmlnaW4obil9YXR0YWNoKG4pe3RoaXMuX292ZXJsYXlSZWYmJnRoaXMuX292ZXJsYXlSZWYsdGhpcy5fdmFsaWRhdGVQb3NpdGlvbnMoKSxuLmhvc3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoVmMpLHRoaXMuX292ZXJsYXlSZWY9bix0aGlzLl9ib3VuZGluZ0JveD1uLmhvc3RFbGVtZW50LHRoaXMuX3BhbmU9bi5vdmVybGF5RWxlbWVudCx0aGlzLl9pc0Rpc3Bvc2VkPSExLHRoaXMuX2lzSW5pdGlhbFJlbmRlcj0hMCx0aGlzLl9sYXN0UG9zaXRpb249bnVsbCx0aGlzLl9yZXNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9yZXNpemVTdWJzY3JpcHRpb249dGhpcy5fdmlld3BvcnRSdWxlci5jaGFuZ2UoKS5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9pc0luaXRpYWxSZW5kZXI9ITAsdGhpcy5hcHBseSgpfSl9YXBwbHkoKXtpZih0aGlzLl9pc0Rpc3Bvc2VkfHwhdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXJldHVybjtpZighdGhpcy5faXNJbml0aWFsUmVuZGVyJiZ0aGlzLl9wb3NpdGlvbkxvY2tlZCYmdGhpcy5fbGFzdFBvc2l0aW9uKXt0aGlzLnJlYXBwbHlMYXN0UG9zaXRpb24oKTtyZXR1cm59dGhpcy5fY2xlYXJQYW5lbENsYXNzZXMoKSx0aGlzLl9yZXNldE92ZXJsYXlFbGVtZW50U3R5bGVzKCksdGhpcy5fcmVzZXRCb3VuZGluZ0JveFN0eWxlcygpLHRoaXMuX3ZpZXdwb3J0UmVjdD10aGlzLl9nZXROYXJyb3dlZFZpZXdwb3J0UmVjdCgpLHRoaXMuX29yaWdpblJlY3Q9dGhpcy5fZ2V0T3JpZ2luUmVjdCgpLHRoaXMuX292ZXJsYXlSZWN0PXRoaXMuX3BhbmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5fY29udGFpbmVyUmVjdD10aGlzLl9vdmVybGF5Q29udGFpbmVyLmdldENvbnRhaW5lckVsZW1lbnQoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtsZXQgbj10aGlzLl9vcmlnaW5SZWN0LHQ9dGhpcy5fb3ZlcmxheVJlY3QsZT10aGlzLl92aWV3cG9ydFJlY3Qscj10aGlzLl9jb250YWluZXJSZWN0LG89W10sYTtmb3IobGV0IHMgb2YgdGhpcy5fcHJlZmVycmVkUG9zaXRpb25zKXtsZXQgYz10aGlzLl9nZXRPcmlnaW5Qb2ludChuLHIscyksZD10aGlzLl9nZXRPdmVybGF5UG9pbnQoYyx0LHMpLHU9dGhpcy5fZ2V0T3ZlcmxheUZpdChkLHQsZSxzKTtpZih1LmlzQ29tcGxldGVseVdpdGhpblZpZXdwb3J0KXt0aGlzLl9pc1B1c2hlZD0hMSx0aGlzLl9hcHBseVBvc2l0aW9uKHMsYyk7cmV0dXJufWlmKHRoaXMuX2NhbkZpdFdpdGhGbGV4aWJsZURpbWVuc2lvbnModSxkLGUpKXtvLnB1c2goe3Bvc2l0aW9uOnMsb3JpZ2luOmMsb3ZlcmxheVJlY3Q6dCxib3VuZGluZ0JveFJlY3Q6dGhpcy5fY2FsY3VsYXRlQm91bmRpbmdCb3hSZWN0KGMscyl9KTtjb250aW51ZX0oIWF8fGEub3ZlcmxheUZpdC52aXNpYmxlQXJlYTx1LnZpc2libGVBcmVhKSYmKGE9e292ZXJsYXlGaXQ6dSxvdmVybGF5UG9pbnQ6ZCxvcmlnaW5Qb2ludDpjLHBvc2l0aW9uOnMsb3ZlcmxheVJlY3Q6dH0pfWlmKG8ubGVuZ3RoKXtsZXQgcz1udWxsLGM9LTE7Zm9yKGxldCBkIG9mIG8pe2xldCB1PWQuYm91bmRpbmdCb3hSZWN0LndpZHRoKmQuYm91bmRpbmdCb3hSZWN0LmhlaWdodCooZC5wb3NpdGlvbi53ZWlnaHR8fDEpO3U+YyYmKGM9dSxzPWQpfXRoaXMuX2lzUHVzaGVkPSExLHRoaXMuX2FwcGx5UG9zaXRpb24ocy5wb3NpdGlvbixzLm9yaWdpbik7cmV0dXJufWlmKHRoaXMuX2NhblB1c2gpe3RoaXMuX2lzUHVzaGVkPSEwLHRoaXMuX2FwcGx5UG9zaXRpb24oYS5wb3NpdGlvbixhLm9yaWdpblBvaW50KTtyZXR1cm59dGhpcy5fYXBwbHlQb3NpdGlvbihhLnBvc2l0aW9uLGEub3JpZ2luUG9pbnQpfWRldGFjaCgpe3RoaXMuX2NsZWFyUGFuZWxDbGFzc2VzKCksdGhpcy5fbGFzdFBvc2l0aW9uPW51bGwsdGhpcy5fcHJldmlvdXNQdXNoQW1vdW50PW51bGwsdGhpcy5fcmVzaXplU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9ZGlzcG9zZSgpe3RoaXMuX2lzRGlzcG9zZWR8fCh0aGlzLl9ib3VuZGluZ0JveCYmJGUodGhpcy5fYm91bmRpbmdCb3guc3R5bGUse3RvcDoiIixsZWZ0OiIiLHJpZ2h0OiIiLGJvdHRvbToiIixoZWlnaHQ6IiIsd2lkdGg6IiIsYWxpZ25JdGVtczoiIixqdXN0aWZ5Q29udGVudDoiIn0pLHRoaXMuX3BhbmUmJnRoaXMuX3Jlc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMoKSx0aGlzLl9vdmVybGF5UmVmJiZ0aGlzLl9vdmVybGF5UmVmLmhvc3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoVmMpLHRoaXMuZGV0YWNoKCksdGhpcy5fcG9zaXRpb25DaGFuZ2VzLmNvbXBsZXRlKCksdGhpcy5fb3ZlcmxheVJlZj10aGlzLl9ib3VuZGluZ0JveD1udWxsLHRoaXMuX2lzRGlzcG9zZWQ9ITApfXJlYXBwbHlMYXN0UG9zaXRpb24oKXtpZih0aGlzLl9pc0Rpc3Bvc2VkfHwhdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXJldHVybjtsZXQgbj10aGlzLl9sYXN0UG9zaXRpb247aWYobil7dGhpcy5fb3JpZ2luUmVjdD10aGlzLl9nZXRPcmlnaW5SZWN0KCksdGhpcy5fb3ZlcmxheVJlY3Q9dGhpcy5fcGFuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0aGlzLl92aWV3cG9ydFJlY3Q9dGhpcy5fZ2V0TmFycm93ZWRWaWV3cG9ydFJlY3QoKSx0aGlzLl9jb250YWluZXJSZWN0PXRoaXMuX292ZXJsYXlDb250YWluZXIuZ2V0Q29udGFpbmVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2xldCB0PXRoaXMuX2dldE9yaWdpblBvaW50KHRoaXMuX29yaWdpblJlY3QsdGhpcy5fY29udGFpbmVyUmVjdCxuKTt0aGlzLl9hcHBseVBvc2l0aW9uKG4sdCl9ZWxzZSB0aGlzLmFwcGx5KCl9d2l0aFNjcm9sbGFibGVDb250YWluZXJzKG4pe3JldHVybiB0aGlzLl9zY3JvbGxhYmxlcz1uLHRoaXN9d2l0aFBvc2l0aW9ucyhuKXtyZXR1cm4gdGhpcy5fcHJlZmVycmVkUG9zaXRpb25zPW4sbi5pbmRleE9mKHRoaXMuX2xhc3RQb3NpdGlvbik9PT0tMSYmKHRoaXMuX2xhc3RQb3NpdGlvbj1udWxsKSx0aGlzLl92YWxpZGF0ZVBvc2l0aW9ucygpLHRoaXN9d2l0aFZpZXdwb3J0TWFyZ2luKG4pe3JldHVybiB0aGlzLl92aWV3cG9ydE1hcmdpbj1uLHRoaXN9d2l0aEZsZXhpYmxlRGltZW5zaW9ucyhuPSEwKXtyZXR1cm4gdGhpcy5faGFzRmxleGlibGVEaW1lbnNpb25zPW4sdGhpc313aXRoR3Jvd0FmdGVyT3BlbihuPSEwKXtyZXR1cm4gdGhpcy5fZ3Jvd0FmdGVyT3Blbj1uLHRoaXN9d2l0aFB1c2gobj0hMCl7cmV0dXJuIHRoaXMuX2NhblB1c2g9bix0aGlzfXdpdGhMb2NrZWRQb3NpdGlvbihuPSEwKXtyZXR1cm4gdGhpcy5fcG9zaXRpb25Mb2NrZWQ9bix0aGlzfXNldE9yaWdpbihuKXtyZXR1cm4gdGhpcy5fb3JpZ2luPW4sdGhpc313aXRoRGVmYXVsdE9mZnNldFgobil7cmV0dXJuIHRoaXMuX29mZnNldFg9bix0aGlzfXdpdGhEZWZhdWx0T2Zmc2V0WShuKXtyZXR1cm4gdGhpcy5fb2Zmc2V0WT1uLHRoaXN9d2l0aFRyYW5zZm9ybU9yaWdpbk9uKG4pe3JldHVybiB0aGlzLl90cmFuc2Zvcm1PcmlnaW5TZWxlY3Rvcj1uLHRoaXN9X2dldE9yaWdpblBvaW50KG4sdCxlKXtsZXQgcjtpZihlLm9yaWdpblg9PSJjZW50ZXIiKXI9bi5sZWZ0K24ud2lkdGgvMjtlbHNle2xldCBhPXRoaXMuX2lzUnRsKCk/bi5yaWdodDpuLmxlZnQscz10aGlzLl9pc1J0bCgpP24ubGVmdDpuLnJpZ2h0O3I9ZS5vcmlnaW5YPT0ic3RhcnQiP2E6c310LmxlZnQ8MCYmKHItPXQubGVmdCk7bGV0IG87cmV0dXJuIGUub3JpZ2luWT09ImNlbnRlciI/bz1uLnRvcCtuLmhlaWdodC8yOm89ZS5vcmlnaW5ZPT0idG9wIj9uLnRvcDpuLmJvdHRvbSx0LnRvcDwwJiYoby09dC50b3ApLHt4OnIseTpvfX1fZ2V0T3ZlcmxheVBvaW50KG4sdCxlKXtsZXQgcjtlLm92ZXJsYXlYPT0iY2VudGVyIj9yPS10LndpZHRoLzI6ZS5vdmVybGF5WD09PSJzdGFydCI/cj10aGlzLl9pc1J0bCgpPy10LndpZHRoOjA6cj10aGlzLl9pc1J0bCgpPzA6LXQud2lkdGg7bGV0IG87cmV0dXJuIGUub3ZlcmxheVk9PSJjZW50ZXIiP289LXQuaGVpZ2h0LzI6bz1lLm92ZXJsYXlZPT0idG9wIj8wOi10LmhlaWdodCx7eDpuLngrcix5Om4ueStvfX1fZ2V0T3ZlcmxheUZpdChuLHQsZSxyKXtsZXQgbz1CYyh0KSx7eDphLHk6c309bixjPXRoaXMuX2dldE9mZnNldChyLCJ4IiksZD10aGlzLl9nZXRPZmZzZXQociwieSIpO2MmJihhKz1jKSxkJiYocys9ZCk7bGV0IHU9MC1hLHg9YStvLndpZHRoLWUud2lkdGgsaj0wLXMsQj1zK28uaGVpZ2h0LWUuaGVpZ2h0LEk9dGhpcy5fc3VidHJhY3RPdmVyZmxvd3Moby53aWR0aCx1LHgpLFY9dGhpcy5fc3VidHJhY3RPdmVyZmxvd3Moby5oZWlnaHQsaixCKSxidD1JKlY7cmV0dXJue3Zpc2libGVBcmVhOmJ0LGlzQ29tcGxldGVseVdpdGhpblZpZXdwb3J0Om8ud2lkdGgqby5oZWlnaHQ9PT1idCxmaXRzSW5WaWV3cG9ydFZlcnRpY2FsbHk6Vj09PW8uaGVpZ2h0LGZpdHNJblZpZXdwb3J0SG9yaXpvbnRhbGx5Okk9PW8ud2lkdGh9fV9jYW5GaXRXaXRoRmxleGlibGVEaW1lbnNpb25zKG4sdCxlKXtpZih0aGlzLl9oYXNGbGV4aWJsZURpbWVuc2lvbnMpe2xldCByPWUuYm90dG9tLXQueSxvPWUucmlnaHQtdC54LGE9amModGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5taW5IZWlnaHQpLHM9amModGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5taW5XaWR0aCksYz1uLmZpdHNJblZpZXdwb3J0VmVydGljYWxseXx8YSE9bnVsbCYmYTw9cixkPW4uZml0c0luVmlld3BvcnRIb3Jpem9udGFsbHl8fHMhPW51bGwmJnM8PW87cmV0dXJuIGMmJmR9cmV0dXJuITF9X3B1c2hPdmVybGF5T25TY3JlZW4obix0LGUpe2lmKHRoaXMuX3ByZXZpb3VzUHVzaEFtb3VudCYmdGhpcy5fcG9zaXRpb25Mb2NrZWQpcmV0dXJue3g6bi54K3RoaXMuX3ByZXZpb3VzUHVzaEFtb3VudC54LHk6bi55K3RoaXMuX3ByZXZpb3VzUHVzaEFtb3VudC55fTtsZXQgcj1CYyh0KSxvPXRoaXMuX3ZpZXdwb3J0UmVjdCxhPU1hdGgubWF4KG4ueCtyLndpZHRoLW8ud2lkdGgsMCkscz1NYXRoLm1heChuLnkrci5oZWlnaHQtby5oZWlnaHQsMCksYz1NYXRoLm1heChvLnRvcC1lLnRvcC1uLnksMCksZD1NYXRoLm1heChvLmxlZnQtZS5sZWZ0LW4ueCwwKSx1PTAseD0wO3JldHVybiByLndpZHRoPD1vLndpZHRoP3U9ZHx8LWE6dT1uLng8dGhpcy5fdmlld3BvcnRNYXJnaW4/by5sZWZ0LWUubGVmdC1uLng6MCxyLmhlaWdodDw9by5oZWlnaHQ/eD1jfHwtczp4PW4ueTx0aGlzLl92aWV3cG9ydE1hcmdpbj9vLnRvcC1lLnRvcC1uLnk6MCx0aGlzLl9wcmV2aW91c1B1c2hBbW91bnQ9e3g6dSx5Onh9LHt4Om4ueCt1LHk6bi55K3h9fV9hcHBseVBvc2l0aW9uKG4sdCl7aWYodGhpcy5fc2V0VHJhbnNmb3JtT3JpZ2luKG4pLHRoaXMuX3NldE92ZXJsYXlFbGVtZW50U3R5bGVzKHQsbiksdGhpcy5fc2V0Qm91bmRpbmdCb3hTdHlsZXModCxuKSxuLnBhbmVsQ2xhc3MmJnRoaXMuX2FkZFBhbmVsQ2xhc3NlcyhuLnBhbmVsQ2xhc3MpLHRoaXMuX3Bvc2l0aW9uQ2hhbmdlcy5vYnNlcnZlcnMubGVuZ3RoKXtsZXQgZT10aGlzLl9nZXRTY3JvbGxWaXNpYmlsaXR5KCk7aWYobiE9PXRoaXMuX2xhc3RQb3NpdGlvbnx8IXRoaXMuX2xhc3RTY3JvbGxWaXNpYmlsaXR5fHwhZWYodGhpcy5fbGFzdFNjcm9sbFZpc2liaWxpdHksZSkpe2xldCByPW5ldyBqcihuLGUpO3RoaXMuX3Bvc2l0aW9uQ2hhbmdlcy5uZXh0KHIpfXRoaXMuX2xhc3RTY3JvbGxWaXNpYmlsaXR5PWV9dGhpcy5fbGFzdFBvc2l0aW9uPW4sdGhpcy5faXNJbml0aWFsUmVuZGVyPSExfV9zZXRUcmFuc2Zvcm1PcmlnaW4obil7aWYoIXRoaXMuX3RyYW5zZm9ybU9yaWdpblNlbGVjdG9yKXJldHVybjtsZXQgdD10aGlzLl9ib3VuZGluZ0JveC5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuX3RyYW5zZm9ybU9yaWdpblNlbGVjdG9yKSxlLHI9bi5vdmVybGF5WTtuLm92ZXJsYXlYPT09ImNlbnRlciI/ZT0iY2VudGVyIjp0aGlzLl9pc1J0bCgpP2U9bi5vdmVybGF5WD09PSJzdGFydCI/InJpZ2h0IjoibGVmdCI6ZT1uLm92ZXJsYXlYPT09InN0YXJ0Ij8ibGVmdCI6InJpZ2h0Ijtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl0W29dLnN0eWxlLnRyYW5zZm9ybU9yaWdpbj1gJHtlfSAke3J9YH1fY2FsY3VsYXRlQm91bmRpbmdCb3hSZWN0KG4sdCl7bGV0IGU9dGhpcy5fdmlld3BvcnRSZWN0LHI9dGhpcy5faXNSdGwoKSxvLGEscztpZih0Lm92ZXJsYXlZPT09InRvcCIpYT1uLnksbz1lLmhlaWdodC1hK3RoaXMuX3ZpZXdwb3J0TWFyZ2luO2Vsc2UgaWYodC5vdmVybGF5WT09PSJib3R0b20iKXM9ZS5oZWlnaHQtbi55K3RoaXMuX3ZpZXdwb3J0TWFyZ2luKjIsbz1lLmhlaWdodC1zK3RoaXMuX3ZpZXdwb3J0TWFyZ2luO2Vsc2V7bGV0IEI9TWF0aC5taW4oZS5ib3R0b20tbi55K2UudG9wLG4ueSksST10aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplLmhlaWdodDtvPUIqMixhPW4ueS1CLG8+SSYmIXRoaXMuX2lzSW5pdGlhbFJlbmRlciYmIXRoaXMuX2dyb3dBZnRlck9wZW4mJihhPW4ueS1JLzIpfWxldCBjPXQub3ZlcmxheVg9PT0ic3RhcnQiJiYhcnx8dC5vdmVybGF5WD09PSJlbmQiJiZyLGQ9dC5vdmVybGF5WD09PSJlbmQiJiYhcnx8dC5vdmVybGF5WD09PSJzdGFydCImJnIsdSx4LGo7aWYoZClqPWUud2lkdGgtbi54K3RoaXMuX3ZpZXdwb3J0TWFyZ2luKjIsdT1uLngtdGhpcy5fdmlld3BvcnRNYXJnaW47ZWxzZSBpZihjKXg9bi54LHU9ZS5yaWdodC1uLng7ZWxzZXtsZXQgQj1NYXRoLm1pbihlLnJpZ2h0LW4ueCtlLmxlZnQsbi54KSxJPXRoaXMuX2xhc3RCb3VuZGluZ0JveFNpemUud2lkdGg7dT1CKjIseD1uLngtQix1PkkmJiF0aGlzLl9pc0luaXRpYWxSZW5kZXImJiF0aGlzLl9ncm93QWZ0ZXJPcGVuJiYoeD1uLngtSS8yKX1yZXR1cm57dG9wOmEsbGVmdDp4LGJvdHRvbTpzLHJpZ2h0Omosd2lkdGg6dSxoZWlnaHQ6b319X3NldEJvdW5kaW5nQm94U3R5bGVzKG4sdCl7bGV0IGU9dGhpcy5fY2FsY3VsYXRlQm91bmRpbmdCb3hSZWN0KG4sdCk7IXRoaXMuX2lzSW5pdGlhbFJlbmRlciYmIXRoaXMuX2dyb3dBZnRlck9wZW4mJihlLmhlaWdodD1NYXRoLm1pbihlLmhlaWdodCx0aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplLmhlaWdodCksZS53aWR0aD1NYXRoLm1pbihlLndpZHRoLHRoaXMuX2xhc3RCb3VuZGluZ0JveFNpemUud2lkdGgpKTtsZXQgcj17fTtpZih0aGlzLl9oYXNFeGFjdFBvc2l0aW9uKCkpci50b3A9ci5sZWZ0PSIwIixyLmJvdHRvbT1yLnJpZ2h0PXIubWF4SGVpZ2h0PXIubWF4V2lkdGg9IiIsci53aWR0aD1yLmhlaWdodD0iMTAwJSI7ZWxzZXtsZXQgbz10aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLm1heEhlaWdodCxhPXRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkubWF4V2lkdGg7ci5oZWlnaHQ9WShlLmhlaWdodCksci50b3A9WShlLnRvcCksci5ib3R0b209WShlLmJvdHRvbSksci53aWR0aD1ZKGUud2lkdGgpLHIubGVmdD1ZKGUubGVmdCksci5yaWdodD1ZKGUucmlnaHQpLHQub3ZlcmxheVg9PT0iY2VudGVyIj9yLmFsaWduSXRlbXM9ImNlbnRlciI6ci5hbGlnbkl0ZW1zPXQub3ZlcmxheVg9PT0iZW5kIj8iZmxleC1lbmQiOiJmbGV4LXN0YXJ0Iix0Lm92ZXJsYXlZPT09ImNlbnRlciI/ci5qdXN0aWZ5Q29udGVudD0iY2VudGVyIjpyLmp1c3RpZnlDb250ZW50PXQub3ZlcmxheVk9PT0iYm90dG9tIj8iZmxleC1lbmQiOiJmbGV4LXN0YXJ0IixvJiYoci5tYXhIZWlnaHQ9WShvKSksYSYmKHIubWF4V2lkdGg9WShhKSl9dGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZT1lLCRlKHRoaXMuX2JvdW5kaW5nQm94LnN0eWxlLHIpfV9yZXNldEJvdW5kaW5nQm94U3R5bGVzKCl7JGUodGhpcy5fYm91bmRpbmdCb3guc3R5bGUse3RvcDoiMCIsbGVmdDoiMCIscmlnaHQ6IjAiLGJvdHRvbToiMCIsaGVpZ2h0OiIiLHdpZHRoOiIiLGFsaWduSXRlbXM6IiIsanVzdGlmeUNvbnRlbnQ6IiJ9KX1fcmVzZXRPdmVybGF5RWxlbWVudFN0eWxlcygpeyRlKHRoaXMuX3BhbmUuc3R5bGUse3RvcDoiIixsZWZ0OiIiLGJvdHRvbToiIixyaWdodDoiIixwb3NpdGlvbjoiIix0cmFuc2Zvcm06IiJ9KX1fc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMobix0KXtsZXQgZT17fSxyPXRoaXMuX2hhc0V4YWN0UG9zaXRpb24oKSxvPXRoaXMuX2hhc0ZsZXhpYmxlRGltZW5zaW9ucyxhPXRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCk7aWYocil7bGV0IHU9dGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCk7JGUoZSx0aGlzLl9nZXRFeGFjdE92ZXJsYXlZKHQsbix1KSksJGUoZSx0aGlzLl9nZXRFeGFjdE92ZXJsYXlYKHQsbix1KSl9ZWxzZSBlLnBvc2l0aW9uPSJzdGF0aWMiO2xldCBzPSIiLGM9dGhpcy5fZ2V0T2Zmc2V0KHQsIngiKSxkPXRoaXMuX2dldE9mZnNldCh0LCJ5Iik7YyYmKHMrPWB0cmFuc2xhdGVYKCR7Y31weCkgYCksZCYmKHMrPWB0cmFuc2xhdGVZKCR7ZH1weClgKSxlLnRyYW5zZm9ybT1zLnRyaW0oKSxhLm1heEhlaWdodCYmKHI/ZS5tYXhIZWlnaHQ9WShhLm1heEhlaWdodCk6byYmKGUubWF4SGVpZ2h0PSIiKSksYS5tYXhXaWR0aCYmKHI/ZS5tYXhXaWR0aD1ZKGEubWF4V2lkdGgpOm8mJihlLm1heFdpZHRoPSIiKSksJGUodGhpcy5fcGFuZS5zdHlsZSxlKX1fZ2V0RXhhY3RPdmVybGF5WShuLHQsZSl7bGV0IHI9e3RvcDoiIixib3R0b206IiJ9LG89dGhpcy5fZ2V0T3ZlcmxheVBvaW50KHQsdGhpcy5fb3ZlcmxheVJlY3Qsbik7aWYodGhpcy5faXNQdXNoZWQmJihvPXRoaXMuX3B1c2hPdmVybGF5T25TY3JlZW4obyx0aGlzLl9vdmVybGF5UmVjdCxlKSksbi5vdmVybGF5WT09PSJib3R0b20iKXtsZXQgYT10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O3IuYm90dG9tPWAke2EtKG8ueSt0aGlzLl9vdmVybGF5UmVjdC5oZWlnaHQpfXB4YH1lbHNlIHIudG9wPVkoby55KTtyZXR1cm4gcn1fZ2V0RXhhY3RPdmVybGF5WChuLHQsZSl7bGV0IHI9e2xlZnQ6IiIscmlnaHQ6IiJ9LG89dGhpcy5fZ2V0T3ZlcmxheVBvaW50KHQsdGhpcy5fb3ZlcmxheVJlY3Qsbik7dGhpcy5faXNQdXNoZWQmJihvPXRoaXMuX3B1c2hPdmVybGF5T25TY3JlZW4obyx0aGlzLl9vdmVybGF5UmVjdCxlKSk7bGV0IGE7aWYodGhpcy5faXNSdGwoKT9hPW4ub3ZlcmxheVg9PT0iZW5kIj8ibGVmdCI6InJpZ2h0IjphPW4ub3ZlcmxheVg9PT0iZW5kIj8icmlnaHQiOiJsZWZ0IixhPT09InJpZ2h0Iil7bGV0IHM9dGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO3IucmlnaHQ9YCR7cy0oby54K3RoaXMuX292ZXJsYXlSZWN0LndpZHRoKX1weGB9ZWxzZSByLmxlZnQ9WShvLngpO3JldHVybiByfV9nZXRTY3JvbGxWaXNpYmlsaXR5KCl7bGV0IG49dGhpcy5fZ2V0T3JpZ2luUmVjdCgpLHQ9dGhpcy5fcGFuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxlPXRoaXMuX3Njcm9sbGFibGVzLm1hcChyPT5yLmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtyZXR1cm57aXNPcmlnaW5DbGlwcGVkOlBjKG4sZSksaXNPcmlnaW5PdXRzaWRlVmlldzpVYShuLGUpLGlzT3ZlcmxheUNsaXBwZWQ6UGModCxlKSxpc092ZXJsYXlPdXRzaWRlVmlldzpVYSh0LGUpfX1fc3VidHJhY3RPdmVyZmxvd3MobiwuLi50KXtyZXR1cm4gdC5yZWR1Y2UoKGUscik9PmUtTWF0aC5tYXgociwwKSxuKX1fZ2V0TmFycm93ZWRWaWV3cG9ydFJlY3QoKXtsZXQgbj10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsdD10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LGU9dGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCk7cmV0dXJue3RvcDplLnRvcCt0aGlzLl92aWV3cG9ydE1hcmdpbixsZWZ0OmUubGVmdCt0aGlzLl92aWV3cG9ydE1hcmdpbixyaWdodDplLmxlZnQrbi10aGlzLl92aWV3cG9ydE1hcmdpbixib3R0b206ZS50b3ArdC10aGlzLl92aWV3cG9ydE1hcmdpbix3aWR0aDpuLTIqdGhpcy5fdmlld3BvcnRNYXJnaW4saGVpZ2h0OnQtMip0aGlzLl92aWV3cG9ydE1hcmdpbn19X2lzUnRsKCl7cmV0dXJuIHRoaXMuX292ZXJsYXlSZWYuZ2V0RGlyZWN0aW9uKCk9PT0icnRsIn1faGFzRXhhY3RQb3NpdGlvbigpe3JldHVybiF0aGlzLl9oYXNGbGV4aWJsZURpbWVuc2lvbnN8fHRoaXMuX2lzUHVzaGVkfV9nZXRPZmZzZXQobix0KXtyZXR1cm4gdD09PSJ4Ij9uLm9mZnNldFg9PW51bGw/dGhpcy5fb2Zmc2V0WDpuLm9mZnNldFg6bi5vZmZzZXRZPT1udWxsP3RoaXMuX29mZnNldFk6bi5vZmZzZXRZfV92YWxpZGF0ZVBvc2l0aW9ucygpe31fYWRkUGFuZWxDbGFzc2VzKG4pe3RoaXMuX3BhbmUmJndpKG4pLmZvckVhY2godD0+e3QhPT0iIiYmdGhpcy5fYXBwbGllZFBhbmVsQ2xhc3Nlcy5pbmRleE9mKHQpPT09LTEmJih0aGlzLl9hcHBsaWVkUGFuZWxDbGFzc2VzLnB1c2godCksdGhpcy5fcGFuZS5jbGFzc0xpc3QuYWRkKHQpKX0pfV9jbGVhclBhbmVsQ2xhc3Nlcygpe3RoaXMuX3BhbmUmJih0aGlzLl9hcHBsaWVkUGFuZWxDbGFzc2VzLmZvckVhY2gobj0+e3RoaXMuX3BhbmUuY2xhc3NMaXN0LnJlbW92ZShuKX0pLHRoaXMuX2FwcGxpZWRQYW5lbENsYXNzZXM9W10pfV9nZXRPcmlnaW5SZWN0KCl7bGV0IG49dGhpcy5fb3JpZ2luO2lmKG4gaW5zdGFuY2VvZiBEKXJldHVybiBuLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYobiBpbnN0YW5jZW9mIEVsZW1lbnQpcmV0dXJuIG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bGV0IHQ9bi53aWR0aHx8MCxlPW4uaGVpZ2h0fHwwO3JldHVybnt0b3A6bi55LGJvdHRvbTpuLnkrZSxsZWZ0Om4ueCxyaWdodDpuLngrdCxoZWlnaHQ6ZSx3aWR0aDp0fX19O3pjPSJjZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlciI7VXI9Y2xhc3N7X292ZXJsYXlSZWY7X2Nzc1Bvc2l0aW9uPSJzdGF0aWMiO190b3BPZmZzZXQ9IiI7X2JvdHRvbU9mZnNldD0iIjtfYWxpZ25JdGVtcz0iIjtfeFBvc2l0aW9uPSIiO194T2Zmc2V0PSIiO193aWR0aD0iIjtfaGVpZ2h0PSIiO19pc0Rpc3Bvc2VkPSExO2F0dGFjaChuKXtsZXQgdD1uLmdldENvbmZpZygpO3RoaXMuX292ZXJsYXlSZWY9bix0aGlzLl93aWR0aCYmIXQud2lkdGgmJm4udXBkYXRlU2l6ZSh7d2lkdGg6dGhpcy5fd2lkdGh9KSx0aGlzLl9oZWlnaHQmJiF0LmhlaWdodCYmbi51cGRhdGVTaXplKHtoZWlnaHQ6dGhpcy5faGVpZ2h0fSksbi5ob3N0RWxlbWVudC5jbGFzc0xpc3QuYWRkKHpjKSx0aGlzLl9pc0Rpc3Bvc2VkPSExfXRvcChuPSIiKXtyZXR1cm4gdGhpcy5fYm90dG9tT2Zmc2V0PSIiLHRoaXMuX3RvcE9mZnNldD1uLHRoaXMuX2FsaWduSXRlbXM9ImZsZXgtc3RhcnQiLHRoaXN9bGVmdChuPSIiKXtyZXR1cm4gdGhpcy5feE9mZnNldD1uLHRoaXMuX3hQb3NpdGlvbj0ibGVmdCIsdGhpc31ib3R0b20obj0iIil7cmV0dXJuIHRoaXMuX3RvcE9mZnNldD0iIix0aGlzLl9ib3R0b21PZmZzZXQ9bix0aGlzLl9hbGlnbkl0ZW1zPSJmbGV4LWVuZCIsdGhpc31yaWdodChuPSIiKXtyZXR1cm4gdGhpcy5feE9mZnNldD1uLHRoaXMuX3hQb3NpdGlvbj0icmlnaHQiLHRoaXN9c3RhcnQobj0iIil7cmV0dXJuIHRoaXMuX3hPZmZzZXQ9bix0aGlzLl94UG9zaXRpb249InN0YXJ0Iix0aGlzfWVuZChuPSIiKXtyZXR1cm4gdGhpcy5feE9mZnNldD1uLHRoaXMuX3hQb3NpdGlvbj0iZW5kIix0aGlzfXdpZHRoKG49IiIpe3JldHVybiB0aGlzLl9vdmVybGF5UmVmP3RoaXMuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7d2lkdGg6bn0pOnRoaXMuX3dpZHRoPW4sdGhpc31oZWlnaHQobj0iIil7cmV0dXJuIHRoaXMuX292ZXJsYXlSZWY/dGhpcy5fb3ZlcmxheVJlZi51cGRhdGVTaXplKHtoZWlnaHQ6bn0pOnRoaXMuX2hlaWdodD1uLHRoaXN9Y2VudGVySG9yaXpvbnRhbGx5KG49IiIpe3JldHVybiB0aGlzLmxlZnQobiksdGhpcy5feFBvc2l0aW9uPSJjZW50ZXIiLHRoaXN9Y2VudGVyVmVydGljYWxseShuPSIiKXtyZXR1cm4gdGhpcy50b3AobiksdGhpcy5fYWxpZ25JdGVtcz0iY2VudGVyIix0aGlzfWFwcGx5KCl7aWYoIXRoaXMuX292ZXJsYXlSZWZ8fCF0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpcmV0dXJuO2xldCBuPXRoaXMuX292ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUsdD10aGlzLl9vdmVybGF5UmVmLmhvc3RFbGVtZW50LnN0eWxlLGU9dGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKSx7d2lkdGg6cixoZWlnaHQ6byxtYXhXaWR0aDphLG1heEhlaWdodDpzfT1lLGM9KHI9PT0iMTAwJSJ8fHI9PT0iMTAwdnciKSYmKCFhfHxhPT09IjEwMCUifHxhPT09IjEwMHZ3IiksZD0obz09PSIxMDAlInx8bz09PSIxMDB2aCIpJiYoIXN8fHM9PT0iMTAwJSJ8fHM9PT0iMTAwdmgiKSx1PXRoaXMuX3hQb3NpdGlvbix4PXRoaXMuX3hPZmZzZXQsaj10aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLmRpcmVjdGlvbj09PSJydGwiLEI9IiIsST0iIixWPSIiO2M/Vj0iZmxleC1zdGFydCI6dT09PSJjZW50ZXIiPyhWPSJjZW50ZXIiLGo/ST14OkI9eCk6aj91PT09ImxlZnQifHx1PT09ImVuZCI/KFY9ImZsZXgtZW5kIixCPXgpOih1PT09InJpZ2h0Inx8dT09PSJzdGFydCIpJiYoVj0iZmxleC1zdGFydCIsST14KTp1PT09ImxlZnQifHx1PT09InN0YXJ0Ij8oVj0iZmxleC1zdGFydCIsQj14KToodT09PSJyaWdodCJ8fHU9PT0iZW5kIikmJihWPSJmbGV4LWVuZCIsST14KSxuLnBvc2l0aW9uPXRoaXMuX2Nzc1Bvc2l0aW9uLG4ubWFyZ2luTGVmdD1jPyIwIjpCLG4ubWFyZ2luVG9wPWQ/IjAiOnRoaXMuX3RvcE9mZnNldCxuLm1hcmdpbkJvdHRvbT10aGlzLl9ib3R0b21PZmZzZXQsbi5tYXJnaW5SaWdodD1jPyIwIjpJLHQuanVzdGlmeUNvbnRlbnQ9Vix0LmFsaWduSXRlbXM9ZD8iZmxleC1zdGFydCI6dGhpcy5fYWxpZ25JdGVtc31kaXNwb3NlKCl7aWYodGhpcy5faXNEaXNwb3NlZHx8IXRoaXMuX292ZXJsYXlSZWYpcmV0dXJuO2xldCBuPXRoaXMuX292ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUsdD10aGlzLl9vdmVybGF5UmVmLmhvc3RFbGVtZW50LGU9dC5zdHlsZTt0LmNsYXNzTGlzdC5yZW1vdmUoemMpLGUuanVzdGlmeUNvbnRlbnQ9ZS5hbGlnbkl0ZW1zPW4ubWFyZ2luVG9wPW4ubWFyZ2luQm90dG9tPW4ubWFyZ2luTGVmdD1uLm1hcmdpblJpZ2h0PW4ucG9zaXRpb249IiIsdGhpcy5fb3ZlcmxheVJlZj1udWxsLHRoaXMuX2lzRGlzcG9zZWQ9ITB9fSxLYz0oKCk9PntjbGFzcyBpe19pbmplY3Rvcj1sKE4pO2NvbnN0cnVjdG9yKCl7fWdsb2JhbCgpe3JldHVybiAkcigpfWZsZXhpYmxlQ29ubmVjdGVkVG8odCl7cmV0dXJuIEdhKHRoaXMuX2luamVjdG9yLHQpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpO1pjPSgoKT0+e2NsYXNzIGl7c2Nyb2xsU3RyYXRlZ2llcz1sKCRjKTtfcG9zaXRpb25CdWlsZGVyPWwoS2MpO19pbmplY3Rvcj1sKE4pO2NvbnN0cnVjdG9yKCl7fWNyZWF0ZSh0KXtyZXR1cm4gQ24odGhpcy5faW5qZWN0b3IsdCl9cG9zaXRpb24oKXtyZXR1cm4gdGhpcy5fcG9zaXRpb25CdWlsZGVyfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpLG5mPVt7b3JpZ2luWDoic3RhcnQiLG9yaWdpblk6ImJvdHRvbSIsb3ZlcmxheVg6InN0YXJ0IixvdmVybGF5WToidG9wIn0se29yaWdpblg6InN0YXJ0IixvcmlnaW5ZOiJ0b3AiLG92ZXJsYXlYOiJzdGFydCIsb3ZlcmxheVk6ImJvdHRvbSJ9LHtvcmlnaW5YOiJlbmQiLG9yaWdpblk6InRvcCIsb3ZlcmxheVg6ImVuZCIsb3ZlcmxheVk6ImJvdHRvbSJ9LHtvcmlnaW5YOiJlbmQiLG9yaWdpblk6ImJvdHRvbSIsb3ZlcmxheVg6ImVuZCIsb3ZlcmxheVk6InRvcCJ9XSxYYz1uZXcgdigiY2RrLWNvbm5lY3RlZC1vdmVybGF5LXNjcm9sbC1zdHJhdGVneSIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9PntsZXQgaT1sKE4pO3JldHVybigpPT5IcihpKX19KSwkYT0oKCk9PntjbGFzcyBpe2VsZW1lbnRSZWY9bChEKTtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyIiLCJjZGstb3ZlcmxheS1vcmlnaW4iLCIiXSxbIiIsIm92ZXJsYXktb3JpZ2luIiwiIl0sWyIiLCJjZGtPdmVybGF5T3JpZ2luIiwiIl1dLGV4cG9ydEFzOlsiY2RrT3ZlcmxheU9yaWdpbiJdfSl9cmV0dXJuIGl9KSgpLHJmPSgoKT0+e2NsYXNzIGl7X2Rpcj1sKGxlLHtvcHRpb25hbDohMH0pO19pbmplY3Rvcj1sKE4pO19vdmVybGF5UmVmO190ZW1wbGF0ZVBvcnRhbDtfYmFja2Ryb3BTdWJzY3JpcHRpb249ZnQuRU1QVFk7X2F0dGFjaFN1YnNjcmlwdGlvbj1mdC5FTVBUWTtfZGV0YWNoU3Vic2NyaXB0aW9uPWZ0LkVNUFRZO19wb3NpdGlvblN1YnNjcmlwdGlvbj1mdC5FTVBUWTtfb2Zmc2V0WDtfb2Zmc2V0WTtfcG9zaXRpb247X3Njcm9sbFN0cmF0ZWd5RmFjdG9yeT1sKFhjKTtfZGlzcG9zZU9uTmF2aWdhdGlvbj0hMTtfbmdab25lPWwoRSk7b3JpZ2luO3Bvc2l0aW9ucztwb3NpdGlvblN0cmF0ZWd5O2dldCBvZmZzZXRYKCl7cmV0dXJuIHRoaXMuX29mZnNldFh9c2V0IG9mZnNldFgodCl7dGhpcy5fb2Zmc2V0WD10LHRoaXMuX3Bvc2l0aW9uJiZ0aGlzLl91cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHRoaXMuX3Bvc2l0aW9uKX1nZXQgb2Zmc2V0WSgpe3JldHVybiB0aGlzLl9vZmZzZXRZfXNldCBvZmZzZXRZKHQpe3RoaXMuX29mZnNldFk9dCx0aGlzLl9wb3NpdGlvbiYmdGhpcy5fdXBkYXRlUG9zaXRpb25TdHJhdGVneSh0aGlzLl9wb3NpdGlvbil9d2lkdGg7aGVpZ2h0O21pbldpZHRoO21pbkhlaWdodDtiYWNrZHJvcENsYXNzO3BhbmVsQ2xhc3M7dmlld3BvcnRNYXJnaW49MDtzY3JvbGxTdHJhdGVneTtvcGVuPSExO2Rpc2FibGVDbG9zZT0hMTt0cmFuc2Zvcm1PcmlnaW5TZWxlY3RvcjtoYXNCYWNrZHJvcD0hMTtsb2NrUG9zaXRpb249ITE7ZmxleGlibGVEaW1lbnNpb25zPSExO2dyb3dBZnRlck9wZW49ITE7cHVzaD0hMTtnZXQgZGlzcG9zZU9uTmF2aWdhdGlvbigpe3JldHVybiB0aGlzLl9kaXNwb3NlT25OYXZpZ2F0aW9ufXNldCBkaXNwb3NlT25OYXZpZ2F0aW9uKHQpe3RoaXMuX2Rpc3Bvc2VPbk5hdmlnYXRpb249dH1iYWNrZHJvcENsaWNrPW5ldyBBO3Bvc2l0aW9uQ2hhbmdlPW5ldyBBO2F0dGFjaD1uZXcgQTtkZXRhY2g9bmV3IEE7b3ZlcmxheUtleWRvd249bmV3IEE7b3ZlcmxheU91dHNpZGVDbGljaz1uZXcgQTtjb25zdHJ1Y3Rvcigpe2xldCB0PWwoT2UpLGU9bChtZSk7dGhpcy5fdGVtcGxhdGVQb3J0YWw9bmV3IENlKHQsZSksdGhpcy5zY3JvbGxTdHJhdGVneT10aGlzLl9zY3JvbGxTdHJhdGVneUZhY3RvcnkoKX1nZXQgb3ZlcmxheVJlZigpe3JldHVybiB0aGlzLl9vdmVybGF5UmVmfWdldCBkaXIoKXtyZXR1cm4gdGhpcy5fZGlyP3RoaXMuX2Rpci52YWx1ZToibHRyIn1uZ09uRGVzdHJveSgpe3RoaXMuX2F0dGFjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2RldGFjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fcG9zaXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9vdmVybGF5UmVmPy5kaXNwb3NlKCl9bmdPbkNoYW5nZXModCl7dGhpcy5fcG9zaXRpb24mJih0aGlzLl91cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHRoaXMuX3Bvc2l0aW9uKSx0aGlzLl9vdmVybGF5UmVmPy51cGRhdGVTaXplKHt3aWR0aDp0aGlzLndpZHRoLG1pbldpZHRoOnRoaXMubWluV2lkdGgsaGVpZ2h0OnRoaXMuaGVpZ2h0LG1pbkhlaWdodDp0aGlzLm1pbkhlaWdodH0pLHQub3JpZ2luJiZ0aGlzLm9wZW4mJnRoaXMuX3Bvc2l0aW9uLmFwcGx5KCkpLHQub3BlbiYmKHRoaXMub3Blbj90aGlzLmF0dGFjaE92ZXJsYXkoKTp0aGlzLmRldGFjaE92ZXJsYXkoKSl9X2NyZWF0ZU92ZXJsYXkoKXsoIXRoaXMucG9zaXRpb25zfHwhdGhpcy5wb3NpdGlvbnMubGVuZ3RoKSYmKHRoaXMucG9zaXRpb25zPW5mKTtsZXQgdD10aGlzLl9vdmVybGF5UmVmPUNuKHRoaXMuX2luamVjdG9yLHRoaXMuX2J1aWxkQ29uZmlnKCkpO3RoaXMuX2F0dGFjaFN1YnNjcmlwdGlvbj10LmF0dGFjaG1lbnRzKCkuc3Vic2NyaWJlKCgpPT50aGlzLmF0dGFjaC5lbWl0KCkpLHRoaXMuX2RldGFjaFN1YnNjcmlwdGlvbj10LmRldGFjaG1lbnRzKCkuc3Vic2NyaWJlKCgpPT50aGlzLmRldGFjaC5lbWl0KCkpLHQua2V5ZG93bkV2ZW50cygpLnN1YnNjcmliZShlPT57dGhpcy5vdmVybGF5S2V5ZG93bi5uZXh0KGUpLGUua2V5Q29kZT09PTI3JiYhdGhpcy5kaXNhYmxlQ2xvc2UmJiFOcihlKSYmKGUucHJldmVudERlZmF1bHQoKSx0aGlzLmRldGFjaE92ZXJsYXkoKSl9KSx0aGlzLl9vdmVybGF5UmVmLm91dHNpZGVQb2ludGVyRXZlbnRzKCkuc3Vic2NyaWJlKGU9PntsZXQgcj10aGlzLl9nZXRPcmlnaW5FbGVtZW50KCksbz14dChlKTsoIXJ8fHIhPT1vJiYhci5jb250YWlucyhvKSkmJnRoaXMub3ZlcmxheU91dHNpZGVDbGljay5uZXh0KGUpfSl9X2J1aWxkQ29uZmlnKCl7bGV0IHQ9dGhpcy5fcG9zaXRpb249dGhpcy5wb3NpdGlvblN0cmF0ZWd5fHx0aGlzLl9jcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCksZT1uZXcgV2Uoe2RpcmVjdGlvbjp0aGlzLl9kaXJ8fCJsdHIiLHBvc2l0aW9uU3RyYXRlZ3k6dCxzY3JvbGxTdHJhdGVneTp0aGlzLnNjcm9sbFN0cmF0ZWd5LGhhc0JhY2tkcm9wOnRoaXMuaGFzQmFja2Ryb3AsZGlzcG9zZU9uTmF2aWdhdGlvbjp0aGlzLmRpc3Bvc2VPbk5hdmlnYXRpb259KTtyZXR1cm4odGhpcy53aWR0aHx8dGhpcy53aWR0aD09PTApJiYoZS53aWR0aD10aGlzLndpZHRoKSwodGhpcy5oZWlnaHR8fHRoaXMuaGVpZ2h0PT09MCkmJihlLmhlaWdodD10aGlzLmhlaWdodCksKHRoaXMubWluV2lkdGh8fHRoaXMubWluV2lkdGg9PT0wKSYmKGUubWluV2lkdGg9dGhpcy5taW5XaWR0aCksKHRoaXMubWluSGVpZ2h0fHx0aGlzLm1pbkhlaWdodD09PTApJiYoZS5taW5IZWlnaHQ9dGhpcy5taW5IZWlnaHQpLHRoaXMuYmFja2Ryb3BDbGFzcyYmKGUuYmFja2Ryb3BDbGFzcz10aGlzLmJhY2tkcm9wQ2xhc3MpLHRoaXMucGFuZWxDbGFzcyYmKGUucGFuZWxDbGFzcz10aGlzLnBhbmVsQ2xhc3MpLGV9X3VwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodCl7bGV0IGU9dGhpcy5wb3NpdGlvbnMubWFwKHI9Pih7b3JpZ2luWDpyLm9yaWdpblgsb3JpZ2luWTpyLm9yaWdpblksb3ZlcmxheVg6ci5vdmVybGF5WCxvdmVybGF5WTpyLm92ZXJsYXlZLG9mZnNldFg6ci5vZmZzZXRYfHx0aGlzLm9mZnNldFgsb2Zmc2V0WTpyLm9mZnNldFl8fHRoaXMub2Zmc2V0WSxwYW5lbENsYXNzOnIucGFuZWxDbGFzc3x8dm9pZCAwfSkpO3JldHVybiB0LnNldE9yaWdpbih0aGlzLl9nZXRPcmlnaW4oKSkud2l0aFBvc2l0aW9ucyhlKS53aXRoRmxleGlibGVEaW1lbnNpb25zKHRoaXMuZmxleGlibGVEaW1lbnNpb25zKS53aXRoUHVzaCh0aGlzLnB1c2gpLndpdGhHcm93QWZ0ZXJPcGVuKHRoaXMuZ3Jvd0FmdGVyT3Blbikud2l0aFZpZXdwb3J0TWFyZ2luKHRoaXMudmlld3BvcnRNYXJnaW4pLndpdGhMb2NrZWRQb3NpdGlvbih0aGlzLmxvY2tQb3NpdGlvbikud2l0aFRyYW5zZm9ybU9yaWdpbk9uKHRoaXMudHJhbnNmb3JtT3JpZ2luU2VsZWN0b3IpfV9jcmVhdGVQb3NpdGlvblN0cmF0ZWd5KCl7bGV0IHQ9R2EodGhpcy5faW5qZWN0b3IsdGhpcy5fZ2V0T3JpZ2luKCkpO3JldHVybiB0aGlzLl91cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHQpLHR9X2dldE9yaWdpbigpe3JldHVybiB0aGlzLm9yaWdpbiBpbnN0YW5jZW9mICRhP3RoaXMub3JpZ2luLmVsZW1lbnRSZWY6dGhpcy5vcmlnaW59X2dldE9yaWdpbkVsZW1lbnQoKXtyZXR1cm4gdGhpcy5vcmlnaW4gaW5zdGFuY2VvZiAkYT90aGlzLm9yaWdpbi5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ6dGhpcy5vcmlnaW4gaW5zdGFuY2VvZiBEP3RoaXMub3JpZ2luLm5hdGl2ZUVsZW1lbnQ6dHlwZW9mIEVsZW1lbnQ8InUiJiZ0aGlzLm9yaWdpbiBpbnN0YW5jZW9mIEVsZW1lbnQ/dGhpcy5vcmlnaW46bnVsbH1hdHRhY2hPdmVybGF5KCl7dGhpcy5fb3ZlcmxheVJlZj90aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLmhhc0JhY2tkcm9wPXRoaXMuaGFzQmFja2Ryb3A6dGhpcy5fY3JlYXRlT3ZlcmxheSgpLHRoaXMuX292ZXJsYXlSZWYuaGFzQXR0YWNoZWQoKXx8dGhpcy5fb3ZlcmxheVJlZi5hdHRhY2godGhpcy5fdGVtcGxhdGVQb3J0YWwpLHRoaXMuaGFzQmFja2Ryb3A/dGhpcy5fYmFja2Ryb3BTdWJzY3JpcHRpb249dGhpcy5fb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKHQ9Pnt0aGlzLmJhY2tkcm9wQ2xpY2suZW1pdCh0KX0pOnRoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fcG9zaXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLnBvc2l0aW9uQ2hhbmdlLm9ic2VydmVycy5sZW5ndGg+MCYmKHRoaXMuX3Bvc2l0aW9uU3Vic2NyaXB0aW9uPXRoaXMuX3Bvc2l0aW9uLnBvc2l0aW9uQ2hhbmdlcy5waXBlKEdzKCgpPT50aGlzLnBvc2l0aW9uQ2hhbmdlLm9ic2VydmVycy5sZW5ndGg+MCkpLnN1YnNjcmliZSh0PT57dGhpcy5fbmdab25lLnJ1bigoKT0+dGhpcy5wb3NpdGlvbkNoYW5nZS5lbWl0KHQpKSx0aGlzLnBvc2l0aW9uQ2hhbmdlLm9ic2VydmVycy5sZW5ndGg9PT0wJiZ0aGlzLl9wb3NpdGlvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfSkpLHRoaXMub3Blbj0hMH1kZXRhY2hPdmVybGF5KCl7dGhpcy5fb3ZlcmxheVJlZj8uZGV0YWNoKCksdGhpcy5fYmFja2Ryb3BTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9wb3NpdGlvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMub3Blbj0hMX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyIiLCJjZGstY29ubmVjdGVkLW92ZXJsYXkiLCIiXSxbIiIsImNvbm5lY3RlZC1vdmVybGF5IiwiIl0sWyIiLCJjZGtDb25uZWN0ZWRPdmVybGF5IiwiIl1dLGlucHV0czp7b3JpZ2luOlswLCJjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luIiwib3JpZ2luIl0scG9zaXRpb25zOlswLCJjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zIiwicG9zaXRpb25zIl0scG9zaXRpb25TdHJhdGVneTpbMCwiY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uU3RyYXRlZ3kiLCJwb3NpdGlvblN0cmF0ZWd5Il0sb2Zmc2V0WDpbMCwiY2RrQ29ubmVjdGVkT3ZlcmxheU9mZnNldFgiLCJvZmZzZXRYIl0sb2Zmc2V0WTpbMCwiY2RrQ29ubmVjdGVkT3ZlcmxheU9mZnNldFkiLCJvZmZzZXRZIl0sd2lkdGg6WzAsImNka0Nvbm5lY3RlZE92ZXJsYXlXaWR0aCIsIndpZHRoIl0saGVpZ2h0OlswLCJjZGtDb25uZWN0ZWRPdmVybGF5SGVpZ2h0IiwiaGVpZ2h0Il0sbWluV2lkdGg6WzAsImNka0Nvbm5lY3RlZE92ZXJsYXlNaW5XaWR0aCIsIm1pbldpZHRoIl0sbWluSGVpZ2h0OlswLCJjZGtDb25uZWN0ZWRPdmVybGF5TWluSGVpZ2h0IiwibWluSGVpZ2h0Il0sYmFja2Ryb3BDbGFzczpbMCwiY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3MiLCJiYWNrZHJvcENsYXNzIl0scGFuZWxDbGFzczpbMCwiY2RrQ29ubmVjdGVkT3ZlcmxheVBhbmVsQ2xhc3MiLCJwYW5lbENsYXNzIl0sdmlld3BvcnRNYXJnaW46WzAsImNka0Nvbm5lY3RlZE92ZXJsYXlWaWV3cG9ydE1hcmdpbiIsInZpZXdwb3J0TWFyZ2luIl0sc2Nyb2xsU3RyYXRlZ3k6WzAsImNka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneSIsInNjcm9sbFN0cmF0ZWd5Il0sb3BlbjpbMCwiY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW4iLCJvcGVuIl0sZGlzYWJsZUNsb3NlOlswLCJjZGtDb25uZWN0ZWRPdmVybGF5RGlzYWJsZUNsb3NlIiwiZGlzYWJsZUNsb3NlIl0sdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3I6WzAsImNka0Nvbm5lY3RlZE92ZXJsYXlUcmFuc2Zvcm1PcmlnaW5PbiIsInRyYW5zZm9ybU9yaWdpblNlbGVjdG9yIl0saGFzQmFja2Ryb3A6WzIsImNka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcCIsImhhc0JhY2tkcm9wIixGXSxsb2NrUG9zaXRpb246WzIsImNka0Nvbm5lY3RlZE92ZXJsYXlMb2NrUG9zaXRpb24iLCJsb2NrUG9zaXRpb24iLEZdLGZsZXhpYmxlRGltZW5zaW9uczpbMiwiY2RrQ29ubmVjdGVkT3ZlcmxheUZsZXhpYmxlRGltZW5zaW9ucyIsImZsZXhpYmxlRGltZW5zaW9ucyIsRl0sZ3Jvd0FmdGVyT3BlbjpbMiwiY2RrQ29ubmVjdGVkT3ZlcmxheUdyb3dBZnRlck9wZW4iLCJncm93QWZ0ZXJPcGVuIixGXSxwdXNoOlsyLCJjZGtDb25uZWN0ZWRPdmVybGF5UHVzaCIsInB1c2giLEZdLGRpc3Bvc2VPbk5hdmlnYXRpb246WzIsImNka0Nvbm5lY3RlZE92ZXJsYXlEaXNwb3NlT25OYXZpZ2F0aW9uIiwiZGlzcG9zZU9uTmF2aWdhdGlvbiIsRl19LG91dHB1dHM6e2JhY2tkcm9wQ2xpY2s6ImJhY2tkcm9wQ2xpY2siLHBvc2l0aW9uQ2hhbmdlOiJwb3NpdGlvbkNoYW5nZSIsYXR0YWNoOiJhdHRhY2giLGRldGFjaDoiZGV0YWNoIixvdmVybGF5S2V5ZG93bjoib3ZlcmxheUtleWRvd24iLG92ZXJsYXlPdXRzaWRlQ2xpY2s6Im92ZXJsYXlPdXRzaWRlQ2xpY2sifSxleHBvcnRBczpbImNka0Nvbm5lY3RlZE92ZXJsYXkiXSxmZWF0dXJlczpbbXRdfSl9cmV0dXJuIGl9KSgpO2FmPXtwcm92aWRlOlhjLHVzZUZhY3Rvcnk6b2Z9LHFhPSgoKT0+e2NsYXNzIGl7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1bW9kPVIoe3R5cGU6aX0pO3N0YXRpYyBcdTAyNzVpbmo9Uyh7cHJvdmlkZXJzOltaYyxhZl0saW1wb3J0czpbeWUsRnIsRmEsRmFdfSl9cmV0dXJuIGl9KSgpfSk7dmFyIFFjPV8oKCk9PntZYSgpO1lhKCk7TmEoKX0pO2Z1bmN0aW9uIHNmKGksbil7aWYoIUpjLmhhcyhpKSl0cnl7R2V8fChHZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLG4mJkdlLnNldEF0dHJpYnV0ZSgibm9uY2UiLG4pLEdlLnNldEF0dHJpYnV0ZSgidHlwZSIsInRleHQvY3NzIiksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChHZSkpLEdlLnNoZWV0JiYoR2Uuc2hlZXQuaW5zZXJ0UnVsZShgQG1lZGlhICR7aX0ge2JvZHl7IH19YCwwKSxKYy5hZGQoaSkpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IodCl9fWZ1bmN0aW9uIGxmKGkpe3JldHVybnttYXRjaGVzOmk9PT0iYWxsInx8aT09PSIiLG1lZGlhOmksYWRkTGlzdGVuZXI6KCk9Pnt9LHJlbW92ZUxpc3RlbmVyOigpPT57fX19ZnVuY3Rpb24gdGQoaSl7cmV0dXJuIGkubWFwKG49Pm4uc3BsaXQoIiwiKSkucmVkdWNlKChuLHQpPT5uLmNvbmNhdCh0KSkubWFwKG49Pm4udHJpbSgpKX12YXIgSmMsR2UsV3IseG4sS2E9XygoKT0+e2YoKTtmKCk7bnQoKTtodCgpO3NlKCk7T2EoKTtKYz1uZXcgU2V0LFdyPSgoKT0+e2NsYXNzIGl7X3BsYXRmb3JtPWwoVCk7X25vbmNlPWwoUXMse29wdGlvbmFsOiEwfSk7X21hdGNoTWVkaWE7Y29uc3RydWN0b3IoKXt0aGlzLl9tYXRjaE1lZGlhPXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlciYmd2luZG93Lm1hdGNoTWVkaWE/d2luZG93Lm1hdGNoTWVkaWEuYmluZCh3aW5kb3cpOmxmfW1hdGNoTWVkaWEodCl7cmV0dXJuKHRoaXMuX3BsYXRmb3JtLldFQktJVHx8dGhpcy5fcGxhdGZvcm0uQkxJTkspJiZzZih0LHRoaXMuX25vbmNlKSx0aGlzLl9tYXRjaE1lZGlhKHQpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpO3huPSgoKT0+e2NsYXNzIGl7X21lZGlhTWF0Y2hlcj1sKFdyKTtfem9uZT1sKEUpO19xdWVyaWVzPW5ldyBNYXA7X2Rlc3Ryb3lTdWJqZWN0PW5ldyB5O2NvbnN0cnVjdG9yKCl7fW5nT25EZXN0cm95KCl7dGhpcy5fZGVzdHJveVN1YmplY3QubmV4dCgpLHRoaXMuX2Rlc3Ryb3lTdWJqZWN0LmNvbXBsZXRlKCl9aXNNYXRjaGVkKHQpe3JldHVybiB0ZCh3aSh0KSkuc29tZShyPT50aGlzLl9yZWdpc3RlclF1ZXJ5KHIpLm1xbC5tYXRjaGVzKX1vYnNlcnZlKHQpe2xldCByPXRkKHdpKHQpKS5tYXAoYT0+dGhpcy5fcmVnaXN0ZXJRdWVyeShhKS5vYnNlcnZhYmxlKSxvPUtlKHIpO3JldHVybiBvPUFlKG8ucGlwZSh5dCgxKSksby5waXBlKHpuKDEpLFhlKDApKSksby5waXBlKGIoYT0+e2xldCBzPXttYXRjaGVzOiExLGJyZWFrcG9pbnRzOnt9fTtyZXR1cm4gYS5mb3JFYWNoKCh7bWF0Y2hlczpjLHF1ZXJ5OmR9KT0+e3MubWF0Y2hlcz1zLm1hdGNoZXN8fGMscy5icmVha3BvaW50c1tkXT1jfSksc30pKX1fcmVnaXN0ZXJRdWVyeSh0KXtpZih0aGlzLl9xdWVyaWVzLmhhcyh0KSlyZXR1cm4gdGhpcy5fcXVlcmllcy5nZXQodCk7bGV0IGU9dGhpcy5fbWVkaWFNYXRjaGVyLm1hdGNoTWVkaWEodCksbz17b2JzZXJ2YWJsZTpuZXcgWXQoYT0+e2xldCBzPWM9PnRoaXMuX3pvbmUucnVuKCgpPT5hLm5leHQoYykpO3JldHVybiBlLmFkZExpc3RlbmVyKHMpLCgpPT57ZS5yZW1vdmVMaXN0ZW5lcihzKX19KS5waXBlKEllKGUpLGIoKHttYXRjaGVzOmF9KT0+KHtxdWVyeTp0LG1hdGNoZXM6YX0pKSxEdCh0aGlzLl9kZXN0cm95U3ViamVjdCkpLG1xbDplfTtyZXR1cm4gdGhpcy5fcXVlcmllcy5zZXQodCxvKSxvfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7dmFyIGZ5LGVkLFphPV8oKCk9PntmKCk7S2EoKTtmeT0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NW1vZD1SKHt0eXBlOml9KTtzdGF0aWMgXHUwMjc1aW5qPVMoe30pfXJldHVybiBpfSkoKSxlZD17WFNtYWxsOiIobWF4LXdpZHRoOiA1OTkuOThweCkiLFNtYWxsOiIobWluLXdpZHRoOiA2MDBweCkgYW5kIChtYXgtd2lkdGg6IDk1OS45OHB4KSIsTWVkaXVtOiIobWluLXdpZHRoOiA5NjBweCkgYW5kIChtYXgtd2lkdGg6IDEyNzkuOThweCkiLExhcmdlOiIobWluLXdpZHRoOiAxMjgwcHgpIGFuZCAobWF4LXdpZHRoOiAxOTE5Ljk4cHgpIixYTGFyZ2U6IihtaW4td2lkdGg6IDE5MjBweCkiLEhhbmRzZXQ6IihtYXgtd2lkdGg6IDU5OS45OHB4KSBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCksIChtYXgtd2lkdGg6IDk1OS45OHB4KSBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIixUYWJsZXQ6IihtaW4td2lkdGg6IDYwMHB4KSBhbmQgKG1heC13aWR0aDogODM5Ljk4cHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSwgKG1pbi13aWR0aDogOTYwcHgpIGFuZCAobWF4LXdpZHRoOiAxMjc5Ljk4cHgpIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkiLFdlYjoiKG1pbi13aWR0aDogODQwcHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSwgKG1pbi13aWR0aDogMTI4MHB4KSBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIixIYW5kc2V0UG9ydHJhaXQ6IihtYXgtd2lkdGg6IDU5OS45OHB4KSBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCkiLFRhYmxldFBvcnRyYWl0OiIobWluLXdpZHRoOiA2MDBweCkgYW5kIChtYXgtd2lkdGg6IDgzOS45OHB4KSBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCkiLFdlYlBvcnRyYWl0OiIobWluLXdpZHRoOiA4NDBweCkgYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpIixIYW5kc2V0TGFuZHNjYXBlOiIobWF4LXdpZHRoOiA5NTkuOThweCkgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSIsVGFibGV0TGFuZHNjYXBlOiIobWluLXdpZHRoOiA5NjBweCkgYW5kIChtYXgtd2lkdGg6IDEyNzkuOThweCkgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSIsV2ViTGFuZHNjYXBlOiIobWluLXdpZHRoOiAxMjgwcHgpIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkifX0pO2Z1bmN0aW9uIGNmKCl7aWYoR3I9PT12b2lkIDAmJihHcj1udWxsLHR5cGVvZiB3aW5kb3c8InUiKSl7bGV0IGk9d2luZG93O2kudHJ1c3RlZFR5cGVzIT09dm9pZCAwJiYoR3I9aS50cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCJhbmd1bGFyI2NvbXBvbmVudHMiLHtjcmVhdGVIVE1MOm49Pm59KSl9cmV0dXJuIEdyfWZ1bmN0aW9uIHduKGkpe3JldHVybiBjZigpPy5jcmVhdGVIVE1MKGkpfHxpfWZ1bmN0aW9uIGlkKGkpe3JldHVybiBFcnJvcihgVW5hYmxlIHRvIGZpbmQgaWNvbiB3aXRoIHRoZSBuYW1lICIke2l9ImApfWZ1bmN0aW9uIGRmKCl7cmV0dXJuIEVycm9yKCJDb3VsZCBub3QgZmluZCBIdHRwQ2xpZW50IGZvciB1c2Ugd2l0aCBBbmd1bGFyIE1hdGVyaWFsIGljb25zLiBQbGVhc2UgYWRkIHByb3ZpZGVIdHRwQ2xpZW50KCkgdG8geW91ciBwcm92aWRlcnMuIil9ZnVuY3Rpb24gbmQoaSl7cmV0dXJuIEVycm9yKGBUaGUgVVJMIHByb3ZpZGVkIHRvIE1hdEljb25SZWdpc3RyeSB3YXMgbm90IHRydXN0ZWQgYXMgYSByZXNvdXJjZSBVUkwgdmlhIEFuZ3VsYXIncyBEb21TYW5pdGl6ZXIuIEF0dGVtcHRlZCBVUkwgd2FzICIke2l9Ii5gKX1mdW5jdGlvbiByZChpKXtyZXR1cm4gRXJyb3IoYFRoZSBsaXRlcmFsIHByb3ZpZGVkIHRvIE1hdEljb25SZWdpc3RyeSB3YXMgbm90IHRydXN0ZWQgYXMgc2FmZSBIVE1MIGJ5IEFuZ3VsYXIncyBEb21TYW5pdGl6ZXIuIEF0dGVtcHRlZCBsaXRlcmFsIHdhcyAiJHtpfSIuYCl9ZnVuY3Rpb24gcXIoaSl7cmV0dXJuIGkuY2xvbmVOb2RlKCEwKX1mdW5jdGlvbiBvZChpLG4pe3JldHVybiBpKyI6IitufWZ1bmN0aW9uIHVmKGkpe3JldHVybiEhKGkudXJsJiZpLm9wdGlvbnMpfXZhciBHcixjZSxhZCxzZD1fKCgpPT57VW8oKTtmKCk7ZigpO0VsKCk7bnQoKTtodCgpO2NlPWNsYXNze3VybDtzdmdUZXh0O29wdGlvbnM7c3ZnRWxlbWVudDtjb25zdHJ1Y3RvcihuLHQsZSl7dGhpcy51cmw9bix0aGlzLnN2Z1RleHQ9dCx0aGlzLm9wdGlvbnM9ZX19LGFkPSgoKT0+e2NsYXNzIGl7X2h0dHBDbGllbnQ7X3Nhbml0aXplcjtfZXJyb3JIYW5kbGVyO19kb2N1bWVudDtfc3ZnSWNvbkNvbmZpZ3M9bmV3IE1hcDtfaWNvblNldENvbmZpZ3M9bmV3IE1hcDtfY2FjaGVkSWNvbnNCeVVybD1uZXcgTWFwO19pblByb2dyZXNzVXJsRmV0Y2hlcz1uZXcgTWFwO19mb250Q3NzQ2xhc3Nlc0J5QWxpYXM9bmV3IE1hcDtfcmVzb2x2ZXJzPVtdO19kZWZhdWx0Rm9udFNldENsYXNzPVsibWF0ZXJpYWwtaWNvbnMiLCJtYXQtbGlnYXR1cmUtZm9udCJdO2NvbnN0cnVjdG9yKHQsZSxyLG8pe3RoaXMuX2h0dHBDbGllbnQ9dCx0aGlzLl9zYW5pdGl6ZXI9ZSx0aGlzLl9lcnJvckhhbmRsZXI9byx0aGlzLl9kb2N1bWVudD1yfWFkZFN2Z0ljb24odCxlLHIpe3JldHVybiB0aGlzLmFkZFN2Z0ljb25Jbk5hbWVzcGFjZSgiIix0LGUscil9YWRkU3ZnSWNvbkxpdGVyYWwodCxlLHIpe3JldHVybiB0aGlzLmFkZFN2Z0ljb25MaXRlcmFsSW5OYW1lc3BhY2UoIiIsdCxlLHIpfWFkZFN2Z0ljb25Jbk5hbWVzcGFjZSh0LGUscixvKXtyZXR1cm4gdGhpcy5fYWRkU3ZnSWNvbkNvbmZpZyh0LGUsbmV3IGNlKHIsbnVsbCxvKSl9YWRkU3ZnSWNvblJlc29sdmVyKHQpe3JldHVybiB0aGlzLl9yZXNvbHZlcnMucHVzaCh0KSx0aGlzfWFkZFN2Z0ljb25MaXRlcmFsSW5OYW1lc3BhY2UodCxlLHIsbyl7bGV0IGE9dGhpcy5fc2FuaXRpemVyLnNhbml0aXplKHRpLkhUTUwscik7aWYoIWEpdGhyb3cgcmQocik7bGV0IHM9d24oYSk7cmV0dXJuIHRoaXMuX2FkZFN2Z0ljb25Db25maWcodCxlLG5ldyBjZSgiIixzLG8pKX1hZGRTdmdJY29uU2V0KHQsZSl7cmV0dXJuIHRoaXMuYWRkU3ZnSWNvblNldEluTmFtZXNwYWNlKCIiLHQsZSl9YWRkU3ZnSWNvblNldExpdGVyYWwodCxlKXtyZXR1cm4gdGhpcy5hZGRTdmdJY29uU2V0TGl0ZXJhbEluTmFtZXNwYWNlKCIiLHQsZSl9YWRkU3ZnSWNvblNldEluTmFtZXNwYWNlKHQsZSxyKXtyZXR1cm4gdGhpcy5fYWRkU3ZnSWNvblNldENvbmZpZyh0LG5ldyBjZShlLG51bGwscikpfWFkZFN2Z0ljb25TZXRMaXRlcmFsSW5OYW1lc3BhY2UodCxlLHIpe2xldCBvPXRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZSh0aS5IVE1MLGUpO2lmKCFvKXRocm93IHJkKGUpO2xldCBhPXduKG8pO3JldHVybiB0aGlzLl9hZGRTdmdJY29uU2V0Q29uZmlnKHQsbmV3IGNlKCIiLGEscikpfXJlZ2lzdGVyRm9udENsYXNzQWxpYXModCxlPXQpe3JldHVybiB0aGlzLl9mb250Q3NzQ2xhc3Nlc0J5QWxpYXMuc2V0KHQsZSksdGhpc31jbGFzc05hbWVGb3JGb250QWxpYXModCl7cmV0dXJuIHRoaXMuX2ZvbnRDc3NDbGFzc2VzQnlBbGlhcy5nZXQodCl8fHR9c2V0RGVmYXVsdEZvbnRTZXRDbGFzcyguLi50KXtyZXR1cm4gdGhpcy5fZGVmYXVsdEZvbnRTZXRDbGFzcz10LHRoaXN9Z2V0RGVmYXVsdEZvbnRTZXRDbGFzcygpe3JldHVybiB0aGlzLl9kZWZhdWx0Rm9udFNldENsYXNzfWdldFN2Z0ljb25Gcm9tVXJsKHQpe2xldCBlPXRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZSh0aS5SRVNPVVJDRV9VUkwsdCk7aWYoIWUpdGhyb3cgbmQodCk7bGV0IHI9dGhpcy5fY2FjaGVkSWNvbnNCeVVybC5nZXQoZSk7cmV0dXJuIHI/ZyhxcihyKSk6dGhpcy5fbG9hZFN2Z0ljb25Gcm9tQ29uZmlnKG5ldyBjZSh0LG51bGwpKS5waXBlKFcobz0+dGhpcy5fY2FjaGVkSWNvbnNCeVVybC5zZXQoZSxvKSksYihvPT5xcihvKSkpfWdldE5hbWVkU3ZnSWNvbih0LGU9IiIpe2xldCByPW9kKGUsdCksbz10aGlzLl9zdmdJY29uQ29uZmlncy5nZXQocik7aWYobylyZXR1cm4gdGhpcy5fZ2V0U3ZnRnJvbUNvbmZpZyhvKTtpZihvPXRoaXMuX2dldEljb25Db25maWdGcm9tUmVzb2x2ZXJzKGUsdCksbylyZXR1cm4gdGhpcy5fc3ZnSWNvbkNvbmZpZ3Muc2V0KHIsbyksdGhpcy5fZ2V0U3ZnRnJvbUNvbmZpZyhvKTtsZXQgYT10aGlzLl9pY29uU2V0Q29uZmlncy5nZXQoZSk7cmV0dXJuIGE/dGhpcy5fZ2V0U3ZnRnJvbUljb25TZXRDb25maWdzKHQsYSk6UmUoaWQocikpfW5nT25EZXN0cm95KCl7dGhpcy5fcmVzb2x2ZXJzPVtdLHRoaXMuX3N2Z0ljb25Db25maWdzLmNsZWFyKCksdGhpcy5faWNvblNldENvbmZpZ3MuY2xlYXIoKSx0aGlzLl9jYWNoZWRJY29uc0J5VXJsLmNsZWFyKCl9X2dldFN2Z0Zyb21Db25maWcodCl7cmV0dXJuIHQuc3ZnVGV4dD9nKHFyKHRoaXMuX3N2Z0VsZW1lbnRGcm9tQ29uZmlnKHQpKSk6dGhpcy5fbG9hZFN2Z0ljb25Gcm9tQ29uZmlnKHQpLnBpcGUoYihlPT5xcihlKSkpfV9nZXRTdmdGcm9tSWNvblNldENvbmZpZ3ModCxlKXtsZXQgcj10aGlzLl9leHRyYWN0SWNvbldpdGhOYW1lRnJvbUFueVNldCh0LGUpO2lmKHIpcmV0dXJuIGcocik7bGV0IG89ZS5maWx0ZXIoYT0+IWEuc3ZnVGV4dCkubWFwKGE9PnRoaXMuX2xvYWRTdmdJY29uU2V0RnJvbUNvbmZpZyhhKS5waXBlKGF0KHM9PntsZXQgZD1gTG9hZGluZyBpY29uIHNldCBVUkw6ICR7dGhpcy5fc2FuaXRpemVyLnNhbml0aXplKHRpLlJFU09VUkNFX1VSTCxhLnVybCl9IGZhaWxlZDogJHtzLm1lc3NhZ2V9YDtyZXR1cm4gdGhpcy5fZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKG5ldyBFcnJvcihkKSksZyhudWxsKX0pKSk7cmV0dXJuIFplKG8pLnBpcGUoYigoKT0+e2xldCBhPXRoaXMuX2V4dHJhY3RJY29uV2l0aE5hbWVGcm9tQW55U2V0KHQsZSk7aWYoIWEpdGhyb3cgaWQodCk7cmV0dXJuIGF9KSl9X2V4dHJhY3RJY29uV2l0aE5hbWVGcm9tQW55U2V0KHQsZSl7Zm9yKGxldCByPWUubGVuZ3RoLTE7cj49MDtyLS0pe2xldCBvPWVbcl07aWYoby5zdmdUZXh0JiZvLnN2Z1RleHQudG9TdHJpbmcoKS5pbmRleE9mKHQpPi0xKXtsZXQgYT10aGlzLl9zdmdFbGVtZW50RnJvbUNvbmZpZyhvKSxzPXRoaXMuX2V4dHJhY3RTdmdJY29uRnJvbVNldChhLHQsby5vcHRpb25zKTtpZihzKXJldHVybiBzfX1yZXR1cm4gbnVsbH1fbG9hZFN2Z0ljb25Gcm9tQ29uZmlnKHQpe3JldHVybiB0aGlzLl9mZXRjaEljb24odCkucGlwZShXKGU9PnQuc3ZnVGV4dD1lKSxiKCgpPT50aGlzLl9zdmdFbGVtZW50RnJvbUNvbmZpZyh0KSkpfV9sb2FkU3ZnSWNvblNldEZyb21Db25maWcodCl7cmV0dXJuIHQuc3ZnVGV4dD9nKG51bGwpOnRoaXMuX2ZldGNoSWNvbih0KS5waXBlKFcoZT0+dC5zdmdUZXh0PWUpKX1fZXh0cmFjdFN2Z0ljb25Gcm9tU2V0KHQsZSxyKXtsZXQgbz10LnF1ZXJ5U2VsZWN0b3IoYFtpZD0iJHtlfSJdYCk7aWYoIW8pcmV0dXJuIG51bGw7bGV0IGE9by5jbG9uZU5vZGUoITApO2lmKGEucmVtb3ZlQXR0cmlidXRlKCJpZCIpLGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzdmciKXJldHVybiB0aGlzLl9zZXRTdmdBdHRyaWJ1dGVzKGEscik7aWYoYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InN5bWJvbCIpcmV0dXJuIHRoaXMuX3NldFN2Z0F0dHJpYnV0ZXModGhpcy5fdG9TdmdFbGVtZW50KGEpLHIpO2xldCBzPXRoaXMuX3N2Z0VsZW1lbnRGcm9tU3RyaW5nKHduKCI8c3ZnPjwvc3ZnPiIpKTtyZXR1cm4gcy5hcHBlbmRDaGlsZChhKSx0aGlzLl9zZXRTdmdBdHRyaWJ1dGVzKHMscil9X3N2Z0VsZW1lbnRGcm9tU3RyaW5nKHQpe2xldCBlPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpO2UuaW5uZXJIVE1MPXQ7bGV0IHI9ZS5xdWVyeVNlbGVjdG9yKCJzdmciKTtpZighcil0aHJvdyBFcnJvcigiPHN2Zz4gdGFnIG5vdCBmb3VuZCIpO3JldHVybiByfV90b1N2Z0VsZW1lbnQodCl7bGV0IGU9dGhpcy5fc3ZnRWxlbWVudEZyb21TdHJpbmcod24oIjxzdmc+PC9zdmc+IikpLHI9dC5hdHRyaWJ1dGVzO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bysrKXtsZXR7bmFtZTphLHZhbHVlOnN9PXJbb107YSE9PSJpZCImJmUuc2V0QXR0cmlidXRlKGEscyl9Zm9yKGxldCBvPTA7bzx0LmNoaWxkTm9kZXMubGVuZ3RoO28rKyl0LmNoaWxkTm9kZXNbb10ubm9kZVR5cGU9PT10aGlzLl9kb2N1bWVudC5FTEVNRU5UX05PREUmJmUuYXBwZW5kQ2hpbGQodC5jaGlsZE5vZGVzW29dLmNsb25lTm9kZSghMCkpO3JldHVybiBlfV9zZXRTdmdBdHRyaWJ1dGVzKHQsZSl7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJmaXQiLCIiKSx0LnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpLHQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKSx0LnNldEF0dHJpYnV0ZSgicHJlc2VydmVBc3BlY3RSYXRpbyIsInhNaWRZTWlkIG1lZXQiKSx0LnNldEF0dHJpYnV0ZSgiZm9jdXNhYmxlIiwiZmFsc2UiKSxlJiZlLnZpZXdCb3gmJnQuc2V0QXR0cmlidXRlKCJ2aWV3Qm94IixlLnZpZXdCb3gpLHR9X2ZldGNoSWNvbih0KXtsZXR7dXJsOmUsb3B0aW9uczpyfT10LG89cj8ud2l0aENyZWRlbnRpYWxzPz8hMTtpZighdGhpcy5faHR0cENsaWVudCl0aHJvdyBkZigpO2lmKGU9PW51bGwpdGhyb3cgRXJyb3IoYENhbm5vdCBmZXRjaCBpY29uIGZyb20gVVJMICIke2V9Ii5gKTtsZXQgYT10aGlzLl9zYW5pdGl6ZXIuc2FuaXRpemUodGkuUkVTT1VSQ0VfVVJMLGUpO2lmKCFhKXRocm93IG5kKGUpO2xldCBzPXRoaXMuX2luUHJvZ3Jlc3NVcmxGZXRjaGVzLmdldChhKTtpZihzKXJldHVybiBzO2xldCBjPXRoaXMuX2h0dHBDbGllbnQuZ2V0KGEse3Jlc3BvbnNlVHlwZToidGV4dCIsd2l0aENyZWRlbnRpYWxzOm99KS5waXBlKGIoZD0+d24oZCkpLFFlKCgpPT50aGlzLl9pblByb2dyZXNzVXJsRmV0Y2hlcy5kZWxldGUoYSkpLFdzKCkpO3JldHVybiB0aGlzLl9pblByb2dyZXNzVXJsRmV0Y2hlcy5zZXQoYSxjKSxjfV9hZGRTdmdJY29uQ29uZmlnKHQsZSxyKXtyZXR1cm4gdGhpcy5fc3ZnSWNvbkNvbmZpZ3Muc2V0KG9kKHQsZSksciksdGhpc31fYWRkU3ZnSWNvblNldENvbmZpZyh0LGUpe2xldCByPXRoaXMuX2ljb25TZXRDb25maWdzLmdldCh0KTtyZXR1cm4gcj9yLnB1c2goZSk6dGhpcy5faWNvblNldENvbmZpZ3Muc2V0KHQsW2VdKSx0aGlzfV9zdmdFbGVtZW50RnJvbUNvbmZpZyh0KXtpZighdC5zdmdFbGVtZW50KXtsZXQgZT10aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZyh0LnN2Z1RleHQpO3RoaXMuX3NldFN2Z0F0dHJpYnV0ZXMoZSx0Lm9wdGlvbnMpLHQuc3ZnRWxlbWVudD1lfXJldHVybiB0LnN2Z0VsZW1lbnR9X2dldEljb25Db25maWdGcm9tUmVzb2x2ZXJzKHQsZSl7Zm9yKGxldCByPTA7cjx0aGlzLl9yZXNvbHZlcnMubGVuZ3RoO3IrKyl7bGV0IG89dGhpcy5fcmVzb2x2ZXJzW3JdKGUsdCk7aWYobylyZXR1cm4gdWYobyk/bmV3IGNlKG8udXJsLG51bGwsby5vcHRpb25zKTpuZXcgY2UobyxudWxsKX19c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpKEcobmksOCksRyh3bCksRyhPLDgpLEcoemkpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7ZnVuY3Rpb24gRW4oaSl7cmV0dXJuIGkuYnV0dG9ucz09PTB8fGkuZGV0YWlsPT09MH1mdW5jdGlvbiBTbihpKXtsZXQgbj1pLnRvdWNoZXMmJmkudG91Y2hlc1swXXx8aS5jaGFuZ2VkVG91Y2hlcyYmaS5jaGFuZ2VkVG91Y2hlc1swXTtyZXR1cm4hIW4mJm4uaWRlbnRpZmllcj09PS0xJiYobi5yYWRpdXNYPT1udWxsfHxuLnJhZGl1c1g9PT0xKSYmKG4ucmFkaXVzWT09bnVsbHx8bi5yYWRpdXNZPT09MSl9dmFyIFhhPV8oKCk9Pnt9KTtmdW5jdGlvbiBsZCgpe2lmKERuPT1udWxsJiZ0eXBlb2Ygd2luZG93PCJ1Iil0cnl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLG51bGwsT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJwYXNzaXZlIix7Z2V0OigpPT5Ebj0hMH0pKX1maW5hbGx5e0RuPURufHwhMX1yZXR1cm4gRG59ZnVuY3Rpb24gQWkoaSl7cmV0dXJuIGxkKCk/aTohIWkuY2FwdHVyZX12YXIgRG4sUWE9XygoKT0+e30pO3ZhciBjZCxkZCx1ZCxKYSxoZCxSbixtZCxZcixLcixoZixmZD1fKCgpPT57ZigpO2YoKTtudCgpO2h0KCk7WGEoKTtmbigpO3NlKCk7UWEoKTtFaSgpO2NkPW5ldyB2KCJjZGstaW5wdXQtbW9kYWxpdHktZGV0ZWN0b3Itb3B0aW9ucyIpLGRkPXtpZ25vcmVLZXlzOlsxOCwxNywyMjQsOTEsMTZdfSx1ZD02NTAsSmE9e3Bhc3NpdmU6ITAsY2FwdHVyZTohMH0saGQ9KCgpPT57Y2xhc3MgaXtfcGxhdGZvcm09bChUKTtfbGlzdGVuZXJDbGVhbnVwczttb2RhbGl0eURldGVjdGVkO21vZGFsaXR5Q2hhbmdlZDtnZXQgbW9zdFJlY2VudE1vZGFsaXR5KCl7cmV0dXJuIHRoaXMuX21vZGFsaXR5LnZhbHVlfV9tb3N0UmVjZW50VGFyZ2V0PW51bGw7X21vZGFsaXR5PW5ldyBFdChudWxsKTtfb3B0aW9ucztfbGFzdFRvdWNoTXM9MDtfb25LZXlkb3duPXQ9Pnt0aGlzLl9vcHRpb25zPy5pZ25vcmVLZXlzPy5zb21lKGU9PmU9PT10LmtleUNvZGUpfHwodGhpcy5fbW9kYWxpdHkubmV4dCgia2V5Ym9hcmQiKSx0aGlzLl9tb3N0UmVjZW50VGFyZ2V0PXh0KHQpKX07X29uTW91c2Vkb3duPXQ9PntEYXRlLm5vdygpLXRoaXMuX2xhc3RUb3VjaE1zPHVkfHwodGhpcy5fbW9kYWxpdHkubmV4dChFbih0KT8ia2V5Ym9hcmQiOiJtb3VzZSIpLHRoaXMuX21vc3RSZWNlbnRUYXJnZXQ9eHQodCkpfTtfb25Ub3VjaHN0YXJ0PXQ9PntpZihTbih0KSl7dGhpcy5fbW9kYWxpdHkubmV4dCgia2V5Ym9hcmQiKTtyZXR1cm59dGhpcy5fbGFzdFRvdWNoTXM9RGF0ZS5ub3coKSx0aGlzLl9tb2RhbGl0eS5uZXh0KCJ0b3VjaCIpLHRoaXMuX21vc3RSZWNlbnRUYXJnZXQ9eHQodCl9O2NvbnN0cnVjdG9yKCl7bGV0IHQ9bChFKSxlPWwoTykscj1sKGNkLHtvcHRpb25hbDohMH0pO2lmKHRoaXMuX29wdGlvbnM9aChoKHt9LGRkKSxyKSx0aGlzLm1vZGFsaXR5RGV0ZWN0ZWQ9dGhpcy5fbW9kYWxpdHkucGlwZSh6bigxKSksdGhpcy5tb2RhbGl0eUNoYW5nZWQ9dGhpcy5tb2RhbGl0eURldGVjdGVkLnBpcGUoa28oKSksdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXtsZXQgbz1sKGt0KS5jcmVhdGVSZW5kZXJlcihudWxsLG51bGwpO3RoaXMuX2xpc3RlbmVyQ2xlYW51cHM9dC5ydW5PdXRzaWRlQW5ndWxhcigoKT0+W28ubGlzdGVuKGUsImtleWRvd24iLHRoaXMuX29uS2V5ZG93bixKYSksby5saXN0ZW4oZSwibW91c2Vkb3duIix0aGlzLl9vbk1vdXNlZG93bixKYSksby5saXN0ZW4oZSwidG91Y2hzdGFydCIsdGhpcy5fb25Ub3VjaHN0YXJ0LEphKV0pfX1uZ09uRGVzdHJveSgpe3RoaXMuX21vZGFsaXR5LmNvbXBsZXRlKCksdGhpcy5fbGlzdGVuZXJDbGVhbnVwcz8uZm9yRWFjaCh0PT50KCkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpLFJuPShmdW5jdGlvbihpKXtyZXR1cm4gaVtpLklNTUVESUFURT0wXT0iSU1NRURJQVRFIixpW2kuRVZFTlRVQUw9MV09IkVWRU5UVUFMIixpfSkoUm58fHt9KSxtZD1uZXcgdigiY2RrLWZvY3VzLW1vbml0b3ItZGVmYXVsdC1vcHRpb25zIiksWXI9QWkoe3Bhc3NpdmU6ITAsY2FwdHVyZTohMH0pLEtyPSgoKT0+e2NsYXNzIGl7X25nWm9uZT1sKEUpO19wbGF0Zm9ybT1sKFQpO19pbnB1dE1vZGFsaXR5RGV0ZWN0b3I9bChoZCk7X29yaWdpbj1udWxsO19sYXN0Rm9jdXNPcmlnaW47X3dpbmRvd0ZvY3VzZWQ9ITE7X3dpbmRvd0ZvY3VzVGltZW91dElkO19vcmlnaW5UaW1lb3V0SWQ7X29yaWdpbkZyb21Ub3VjaEludGVyYWN0aW9uPSExO19lbGVtZW50SW5mbz1uZXcgTWFwO19tb25pdG9yZWRFbGVtZW50Q291bnQ9MDtfcm9vdE5vZGVGb2N1c0xpc3RlbmVyQ291bnQ9bmV3IE1hcDtfZGV0ZWN0aW9uTW9kZTtfd2luZG93Rm9jdXNMaXN0ZW5lcj0oKT0+e3RoaXMuX3dpbmRvd0ZvY3VzZWQ9ITAsdGhpcy5fd2luZG93Rm9jdXNUaW1lb3V0SWQ9c2V0VGltZW91dCgoKT0+dGhpcy5fd2luZG93Rm9jdXNlZD0hMSl9O19kb2N1bWVudD1sKE8pO19zdG9wSW5wdXRNb2RhbGl0eURldGVjdG9yPW5ldyB5O2NvbnN0cnVjdG9yKCl7bGV0IHQ9bChtZCx7b3B0aW9uYWw6ITB9KTt0aGlzLl9kZXRlY3Rpb25Nb2RlPXQ/LmRldGVjdGlvbk1vZGV8fFJuLklNTUVESUFURX1fcm9vdE5vZGVGb2N1c0FuZEJsdXJMaXN0ZW5lcj10PT57bGV0IGU9eHQodCk7Zm9yKGxldCByPWU7cjtyPXIucGFyZW50RWxlbWVudCl0LnR5cGU9PT0iZm9jdXMiP3RoaXMuX29uRm9jdXModCxyKTp0aGlzLl9vbkJsdXIodCxyKX07bW9uaXRvcih0LGU9ITEpe2xldCByPXd0KHQpO2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXJ8fHIubm9kZVR5cGUhPT0xKXJldHVybiBnKCk7bGV0IG89UmEocil8fHRoaXMuX2RvY3VtZW50LGE9dGhpcy5fZWxlbWVudEluZm8uZ2V0KHIpO2lmKGEpcmV0dXJuIGUmJihhLmNoZWNrQ2hpbGRyZW49ITApLGEuc3ViamVjdDtsZXQgcz17Y2hlY2tDaGlsZHJlbjplLHN1YmplY3Q6bmV3IHkscm9vdE5vZGU6b307cmV0dXJuIHRoaXMuX2VsZW1lbnRJbmZvLnNldChyLHMpLHRoaXMuX3JlZ2lzdGVyR2xvYmFsTGlzdGVuZXJzKHMpLHMuc3ViamVjdH1zdG9wTW9uaXRvcmluZyh0KXtsZXQgZT13dCh0KSxyPXRoaXMuX2VsZW1lbnRJbmZvLmdldChlKTtyJiYoci5zdWJqZWN0LmNvbXBsZXRlKCksdGhpcy5fc2V0Q2xhc3NlcyhlKSx0aGlzLl9lbGVtZW50SW5mby5kZWxldGUoZSksdGhpcy5fcmVtb3ZlR2xvYmFsTGlzdGVuZXJzKHIpKX1mb2N1c1ZpYSh0LGUscil7bGV0IG89d3QodCksYT10aGlzLl9kb2N1bWVudC5hY3RpdmVFbGVtZW50O289PT1hP3RoaXMuX2dldENsb3Nlc3RFbGVtZW50c0luZm8obykuZm9yRWFjaCgoW3MsY10pPT50aGlzLl9vcmlnaW5DaGFuZ2VkKHMsZSxjKSk6KHRoaXMuX3NldE9yaWdpbihlKSx0eXBlb2Ygby5mb2N1cz09ImZ1bmN0aW9uIiYmby5mb2N1cyhyKSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9lbGVtZW50SW5mby5mb3JFYWNoKCh0LGUpPT50aGlzLnN0b3BNb25pdG9yaW5nKGUpKX1fZ2V0V2luZG93KCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3d9X2dldEZvY3VzT3JpZ2luKHQpe3JldHVybiB0aGlzLl9vcmlnaW4/dGhpcy5fb3JpZ2luRnJvbVRvdWNoSW50ZXJhY3Rpb24/dGhpcy5fc2hvdWxkQmVBdHRyaWJ1dGVkVG9Ub3VjaCh0KT8idG91Y2giOiJwcm9ncmFtIjp0aGlzLl9vcmlnaW46dGhpcy5fd2luZG93Rm9jdXNlZCYmdGhpcy5fbGFzdEZvY3VzT3JpZ2luP3RoaXMuX2xhc3RGb2N1c09yaWdpbjp0JiZ0aGlzLl9pc0xhc3RJbnRlcmFjdGlvbkZyb21JbnB1dExhYmVsKHQpPyJtb3VzZSI6InByb2dyYW0ifV9zaG91bGRCZUF0dHJpYnV0ZWRUb1RvdWNoKHQpe3JldHVybiB0aGlzLl9kZXRlY3Rpb25Nb2RlPT09Um4uRVZFTlRVQUx8fCEhdD8uY29udGFpbnModGhpcy5faW5wdXRNb2RhbGl0eURldGVjdG9yLl9tb3N0UmVjZW50VGFyZ2V0KX1fc2V0Q2xhc3Nlcyh0LGUpe3QuY2xhc3NMaXN0LnRvZ2dsZSgiY2RrLWZvY3VzZWQiLCEhZSksdC5jbGFzc0xpc3QudG9nZ2xlKCJjZGstdG91Y2gtZm9jdXNlZCIsZT09PSJ0b3VjaCIpLHQuY2xhc3NMaXN0LnRvZ2dsZSgiY2RrLWtleWJvYXJkLWZvY3VzZWQiLGU9PT0ia2V5Ym9hcmQiKSx0LmNsYXNzTGlzdC50b2dnbGUoImNkay1tb3VzZS1mb2N1c2VkIixlPT09Im1vdXNlIiksdC5jbGFzc0xpc3QudG9nZ2xlKCJjZGstcHJvZ3JhbS1mb2N1c2VkIixlPT09InByb2dyYW0iKX1fc2V0T3JpZ2luKHQsZT0hMSl7dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57aWYodGhpcy5fb3JpZ2luPXQsdGhpcy5fb3JpZ2luRnJvbVRvdWNoSW50ZXJhY3Rpb249dD09PSJ0b3VjaCImJmUsdGhpcy5fZGV0ZWN0aW9uTW9kZT09PVJuLklNTUVESUFURSl7Y2xlYXJUaW1lb3V0KHRoaXMuX29yaWdpblRpbWVvdXRJZCk7bGV0IHI9dGhpcy5fb3JpZ2luRnJvbVRvdWNoSW50ZXJhY3Rpb24/dWQ6MTt0aGlzLl9vcmlnaW5UaW1lb3V0SWQ9c2V0VGltZW91dCgoKT0+dGhpcy5fb3JpZ2luPW51bGwscil9fSl9X29uRm9jdXModCxlKXtsZXQgcj10aGlzLl9lbGVtZW50SW5mby5nZXQoZSksbz14dCh0KTshcnx8IXIuY2hlY2tDaGlsZHJlbiYmZSE9PW98fHRoaXMuX29yaWdpbkNoYW5nZWQoZSx0aGlzLl9nZXRGb2N1c09yaWdpbihvKSxyKX1fb25CbHVyKHQsZSl7bGV0IHI9dGhpcy5fZWxlbWVudEluZm8uZ2V0KGUpOyFyfHxyLmNoZWNrQ2hpbGRyZW4mJnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIE5vZGUmJmUuY29udGFpbnModC5yZWxhdGVkVGFyZ2V0KXx8KHRoaXMuX3NldENsYXNzZXMoZSksdGhpcy5fZW1pdE9yaWdpbihyLG51bGwpKX1fZW1pdE9yaWdpbih0LGUpe3Quc3ViamVjdC5vYnNlcnZlcnMubGVuZ3RoJiZ0aGlzLl9uZ1pvbmUucnVuKCgpPT50LnN1YmplY3QubmV4dChlKSl9X3JlZ2lzdGVyR2xvYmFsTGlzdGVuZXJzKHQpe2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJuO2xldCBlPXQucm9vdE5vZGUscj10aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudC5nZXQoZSl8fDA7cnx8dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57ZS5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fcm9vdE5vZGVGb2N1c0FuZEJsdXJMaXN0ZW5lcixZciksZS5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9yb290Tm9kZUZvY3VzQW5kQmx1ckxpc3RlbmVyLFlyKX0pLHRoaXMuX3Jvb3ROb2RlRm9jdXNMaXN0ZW5lckNvdW50LnNldChlLHIrMSksKyt0aGlzLl9tb25pdG9yZWRFbGVtZW50Q291bnQ9PT0xJiYodGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57dGhpcy5fZ2V0V2luZG93KCkuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX3dpbmRvd0ZvY3VzTGlzdGVuZXIpfSksdGhpcy5faW5wdXRNb2RhbGl0eURldGVjdG9yLm1vZGFsaXR5RGV0ZWN0ZWQucGlwZShEdCh0aGlzLl9zdG9wSW5wdXRNb2RhbGl0eURldGVjdG9yKSkuc3Vic2NyaWJlKG89Pnt0aGlzLl9zZXRPcmlnaW4obywhMCl9KSl9X3JlbW92ZUdsb2JhbExpc3RlbmVycyh0KXtsZXQgZT10LnJvb3ROb2RlO2lmKHRoaXMuX3Jvb3ROb2RlRm9jdXNMaXN0ZW5lckNvdW50LmhhcyhlKSl7bGV0IHI9dGhpcy5fcm9vdE5vZGVGb2N1c0xpc3RlbmVyQ291bnQuZ2V0KGUpO3I+MT90aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudC5zZXQoZSxyLTEpOihlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9yb290Tm9kZUZvY3VzQW5kQmx1ckxpc3RlbmVyLFlyKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX3Jvb3ROb2RlRm9jdXNBbmRCbHVyTGlzdGVuZXIsWXIpLHRoaXMuX3Jvb3ROb2RlRm9jdXNMaXN0ZW5lckNvdW50LmRlbGV0ZShlKSl9LS10aGlzLl9tb25pdG9yZWRFbGVtZW50Q291bnR8fCh0aGlzLl9nZXRXaW5kb3coKS5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fd2luZG93Rm9jdXNMaXN0ZW5lciksdGhpcy5fc3RvcElucHV0TW9kYWxpdHlEZXRlY3Rvci5uZXh0KCksY2xlYXJUaW1lb3V0KHRoaXMuX3dpbmRvd0ZvY3VzVGltZW91dElkKSxjbGVhclRpbWVvdXQodGhpcy5fb3JpZ2luVGltZW91dElkKSl9X29yaWdpbkNoYW5nZWQodCxlLHIpe3RoaXMuX3NldENsYXNzZXModCxlKSx0aGlzLl9lbWl0T3JpZ2luKHIsZSksdGhpcy5fbGFzdEZvY3VzT3JpZ2luPWV9X2dldENsb3Nlc3RFbGVtZW50c0luZm8odCl7bGV0IGU9W107cmV0dXJuIHRoaXMuX2VsZW1lbnRJbmZvLmZvckVhY2goKHIsbyk9Pnsobz09PXR8fHIuY2hlY2tDaGlsZHJlbiYmby5jb250YWlucyh0KSkmJmUucHVzaChbbyxyXSl9KSxlfV9pc0xhc3RJbnRlcmFjdGlvbkZyb21JbnB1dExhYmVsKHQpe2xldHtfbW9zdFJlY2VudFRhcmdldDplLG1vc3RSZWNlbnRNb2RhbGl0eTpyfT10aGlzLl9pbnB1dE1vZGFsaXR5RGV0ZWN0b3I7aWYociE9PSJtb3VzZSJ8fCFlfHxlPT09dHx8dC5ub2RlTmFtZSE9PSJJTlBVVCImJnQubm9kZU5hbWUhPT0iVEVYVEFSRUEifHx0LmRpc2FibGVkKXJldHVybiExO2xldCBvPXQubGFiZWxzO2lmKG8pe2ZvcihsZXQgYT0wO2E8by5sZW5ndGg7YSsrKWlmKG9bYV0uY29udGFpbnMoZSkpcmV0dXJuITB9cmV0dXJuITF9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCksaGY9KCgpPT57Y2xhc3MgaXtfZWxlbWVudFJlZj1sKEQpO19mb2N1c01vbml0b3I9bChLcik7X21vbml0b3JTdWJzY3JpcHRpb247X2ZvY3VzT3JpZ2luPW51bGw7Y2RrRm9jdXNDaGFuZ2U9bmV3IEE7Y29uc3RydWN0b3IoKXt9Z2V0IGZvY3VzT3JpZ2luKCl7cmV0dXJuIHRoaXMuX2ZvY3VzT3JpZ2lufW5nQWZ0ZXJWaWV3SW5pdCgpe2xldCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDt0aGlzLl9tb25pdG9yU3Vic2NyaXB0aW9uPXRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHQsdC5ub2RlVHlwZT09PTEmJnQuaGFzQXR0cmlidXRlKCJjZGtNb25pdG9yU3VidHJlZUZvY3VzIikpLnN1YnNjcmliZShlPT57dGhpcy5fZm9jdXNPcmlnaW49ZSx0aGlzLmNka0ZvY3VzQ2hhbmdlLmVtaXQoZSl9KX1uZ09uRGVzdHJveSgpe3RoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKSx0aGlzLl9tb25pdG9yU3Vic2NyaXB0aW9uJiZ0aGlzLl9tb25pdG9yU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwiY2RrTW9uaXRvckVsZW1lbnRGb2N1cyIsIiJdLFsiIiwiY2RrTW9uaXRvclN1YnRyZWVGb2N1cyIsIiJdXSxvdXRwdXRzOntjZGtGb2N1c0NoYW5nZToiY2RrRm9jdXNDaGFuZ2UifSxleHBvcnRBczpbImNka01vbml0b3JGb2N1cyJdfSl9cmV0dXJuIGl9KSgpfSk7dmFyIFpyLEFuPV8oKCk9Pnt4aSgpO2YoKTtacj0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWNtcD1QKHt0eXBlOmksc2VsZWN0b3JzOltbIm5nLWNvbXBvbmVudCJdXSxleHBvcnRBczpbImNka1Zpc3VhbGx5SGlkZGVuIl0sZGVjbHM6MCx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24oZSxyKXt9LHN0eWxlczpbYC5jZGstdmlzdWFsbHktaGlkZGVue2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmU7bGVmdDowfVtkaXI9cnRsXSAuY2RrLXZpc3VhbGx5LWhpZGRlbntsZWZ0OmF1dG87cmlnaHQ6MH0KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIGl9KSgpfSk7ZnVuY3Rpb24gbWYoaSl7aWYoaS50eXBlPT09ImNoYXJhY3RlckRhdGEiJiZpLnRhcmdldCBpbnN0YW5jZW9mIENvbW1lbnQpcmV0dXJuITA7aWYoaS50eXBlPT09ImNoaWxkTGlzdCIpe2ZvcihsZXQgbj0wO248aS5hZGRlZE5vZGVzLmxlbmd0aDtuKyspaWYoIShpLmFkZGVkTm9kZXNbbl1pbnN0YW5jZW9mIENvbW1lbnQpKXJldHVybiExO2ZvcihsZXQgbj0wO248aS5yZW1vdmVkTm9kZXMubGVuZ3RoO24rKylpZighKGkucmVtb3ZlZE5vZGVzW25daW5zdGFuY2VvZiBDb21tZW50KSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX12YXIgcGQsZ2QsaUMsWHIsdHM9XygoKT0+e2YoKTtmKCk7bnQoKTtodCgpO0VpKCk7cGQ9KCgpPT57Y2xhc3MgaXtjcmVhdGUodCl7cmV0dXJuIHR5cGVvZiBNdXRhdGlvbk9ic2VydmVyPiJ1Ij9udWxsOm5ldyBNdXRhdGlvbk9ic2VydmVyKHQpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpLGdkPSgoKT0+e2NsYXNzIGl7X211dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5PWwocGQpO19vYnNlcnZlZEVsZW1lbnRzPW5ldyBNYXA7X25nWm9uZT1sKEUpO2NvbnN0cnVjdG9yKCl7fW5nT25EZXN0cm95KCl7dGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5mb3JFYWNoKCh0LGUpPT50aGlzLl9jbGVhbnVwT2JzZXJ2ZXIoZSkpfW9ic2VydmUodCl7bGV0IGU9d3QodCk7cmV0dXJuIG5ldyBZdChyPT57bGV0IGE9dGhpcy5fb2JzZXJ2ZUVsZW1lbnQoZSkucGlwZShiKHM9PnMuZmlsdGVyKGM9PiFtZihjKSkpLEsocz0+ISFzLmxlbmd0aCkpLnN1YnNjcmliZShzPT57dGhpcy5fbmdab25lLnJ1bigoKT0+e3IubmV4dChzKX0pfSk7cmV0dXJuKCk9PnthLnVuc3Vic2NyaWJlKCksdGhpcy5fdW5vYnNlcnZlRWxlbWVudChlKX19KX1fb2JzZXJ2ZUVsZW1lbnQodCl7cmV0dXJuIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e2lmKHRoaXMuX29ic2VydmVkRWxlbWVudHMuaGFzKHQpKXRoaXMuX29ic2VydmVkRWxlbWVudHMuZ2V0KHQpLmNvdW50Kys7ZWxzZXtsZXQgZT1uZXcgeSxyPXRoaXMuX211dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5LmNyZWF0ZShvPT5lLm5leHQobykpO3ImJnIub2JzZXJ2ZSh0LHtjaGFyYWN0ZXJEYXRhOiEwLGNoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5zZXQodCx7b2JzZXJ2ZXI6cixzdHJlYW06ZSxjb3VudDoxfSl9cmV0dXJuIHRoaXMuX29ic2VydmVkRWxlbWVudHMuZ2V0KHQpLnN0cmVhbX0pfV91bm9ic2VydmVFbGVtZW50KHQpe3RoaXMuX29ic2VydmVkRWxlbWVudHMuaGFzKHQpJiYodGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5nZXQodCkuY291bnQtLSx0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmdldCh0KS5jb3VudHx8dGhpcy5fY2xlYW51cE9ic2VydmVyKHQpKX1fY2xlYW51cE9ic2VydmVyKHQpe2lmKHRoaXMuX29ic2VydmVkRWxlbWVudHMuaGFzKHQpKXtsZXR7b2JzZXJ2ZXI6ZSxzdHJlYW06cn09dGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5nZXQodCk7ZSYmZS5kaXNjb25uZWN0KCksci5jb21wbGV0ZSgpLHRoaXMuX29ic2VydmVkRWxlbWVudHMuZGVsZXRlKHQpfX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKSxpQz0oKCk9PntjbGFzcyBpe19jb250ZW50T2JzZXJ2ZXI9bChnZCk7X2VsZW1lbnRSZWY9bChEKTtldmVudD1uZXcgQTtnZXQgZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWR9c2V0IGRpc2FibGVkKHQpe3RoaXMuX2Rpc2FibGVkPXQsdGhpcy5fZGlzYWJsZWQ/dGhpcy5fdW5zdWJzY3JpYmUoKTp0aGlzLl9zdWJzY3JpYmUoKX1fZGlzYWJsZWQ9ITE7Z2V0IGRlYm91bmNlKCl7cmV0dXJuIHRoaXMuX2RlYm91bmNlfXNldCBkZWJvdW5jZSh0KXt0aGlzLl9kZWJvdW5jZT1wbih0KSx0aGlzLl9zdWJzY3JpYmUoKX1fZGVib3VuY2U7X2N1cnJlbnRTdWJzY3JpcHRpb249bnVsbDtjb25zdHJ1Y3Rvcigpe31uZ0FmdGVyQ29udGVudEluaXQoKXshdGhpcy5fY3VycmVudFN1YnNjcmlwdGlvbiYmIXRoaXMuZGlzYWJsZWQmJnRoaXMuX3N1YnNjcmliZSgpfW5nT25EZXN0cm95KCl7dGhpcy5fdW5zdWJzY3JpYmUoKX1fc3Vic2NyaWJlKCl7dGhpcy5fdW5zdWJzY3JpYmUoKTtsZXQgdD10aGlzLl9jb250ZW50T2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50UmVmKTt0aGlzLl9jdXJyZW50U3Vic2NyaXB0aW9uPSh0aGlzLmRlYm91bmNlP3QucGlwZShYZSh0aGlzLmRlYm91bmNlKSk6dCkuc3Vic2NyaWJlKHRoaXMuZXZlbnQpfV91bnN1YnNjcmliZSgpe3RoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwiY2RrT2JzZXJ2ZUNvbnRlbnQiLCIiXV0saW5wdXRzOntkaXNhYmxlZDpbMiwiY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZCIsImRpc2FibGVkIixGXSxkZWJvdW5jZToiZGVib3VuY2UifSxvdXRwdXRzOntldmVudDoiY2RrT2JzZXJ2ZUNvbnRlbnQifSxleHBvcnRBczpbImNka09ic2VydmVDb250ZW50Il19KX1yZXR1cm4gaX0pKCksWHI9KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVtb2Q9Uih7dHlwZTppfSk7c3RhdGljIFx1MDI3NWluaj1TKHtwcm92aWRlcnM6W3BkXX0pfXJldHVybiBpfSkoKX0pO2Z1bmN0aW9uIGZmKGkpe3RyeXtyZXR1cm4gaS5mcmFtZUVsZW1lbnR9Y2F0Y2h7cmV0dXJuIG51bGx9fWZ1bmN0aW9uIHBmKGkpe3JldHVybiEhKGkub2Zmc2V0V2lkdGh8fGkub2Zmc2V0SGVpZ2h0fHx0eXBlb2YgaS5nZXRDbGllbnRSZWN0cz09ImZ1bmN0aW9uIiYmaS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9ZnVuY3Rpb24gZ2YoaSl7bGV0IG49aS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBuPT09ImlucHV0Inx8bj09PSJzZWxlY3QifHxuPT09ImJ1dHRvbiJ8fG49PT0idGV4dGFyZWEifWZ1bmN0aW9uIHZmKGkpe3JldHVybiBiZihpKSYmaS50eXBlPT0iaGlkZGVuIn1mdW5jdGlvbiBfZihpKXtyZXR1cm4geWYoaSkmJmkuaGFzQXR0cmlidXRlKCJocmVmIil9ZnVuY3Rpb24gYmYoaSl7cmV0dXJuIGkubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ImlucHV0In1mdW5jdGlvbiB5ZihpKXtyZXR1cm4gaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT0iYSJ9ZnVuY3Rpb24gQ2QoaSl7aWYoIWkuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfHxpLnRhYkluZGV4PT09dm9pZCAwKXJldHVybiExO2xldCBuPWkuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO3JldHVybiEhKG4mJiFpc05hTihwYXJzZUludChuLDEwKSkpfWZ1bmN0aW9uIHZkKGkpe2lmKCFDZChpKSlyZXR1cm4gbnVsbDtsZXQgbj1wYXJzZUludChpLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8IiIsMTApO3JldHVybiBpc05hTihuKT8tMTpufWZ1bmN0aW9uIENmKGkpe2xldCBuPWkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSx0PW49PT0iaW5wdXQiJiZpLnR5cGU7cmV0dXJuIHQ9PT0idGV4dCJ8fHQ9PT0icGFzc3dvcmQifHxuPT09InNlbGVjdCJ8fG49PT0idGV4dGFyZWEifWZ1bmN0aW9uIHhmKGkpe3JldHVybiB2ZihpKT8hMTpnZihpKXx8X2YoaSl8fGkuaGFzQXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiKXx8Q2QoaSl9ZnVuY3Rpb24gd2YoaSl7cmV0dXJuIGkub3duZXJEb2N1bWVudCYmaS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3d9ZnVuY3Rpb24gRWQoKXtyZXR1cm4gbnVsbH12YXIgeWQsUXIseGQsRWYsd2QsU2QsU2YsaXMseGUsX2QsYmQsZXMsSnIsRGYsbnM9XygoKT0+e2YoKTtmKCk7c2UoKTtmbigpO3hpKCk7QW4oKTtLYSgpO3RzKCk7eWQ9KCgpPT57Y2xhc3MgaXtfcGxhdGZvcm09bChUKTtjb25zdHJ1Y3Rvcigpe31pc0Rpc2FibGVkKHQpe3JldHVybiB0Lmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKX1pc1Zpc2libGUodCl7cmV0dXJuIHBmKHQpJiZnZXRDb21wdXRlZFN0eWxlKHQpLnZpc2liaWxpdHk9PT0idmlzaWJsZSJ9aXNUYWJiYWJsZSh0KXtpZighdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXJldHVybiExO2xldCBlPWZmKHdmKHQpKTtpZihlJiYodmQoZSk9PT0tMXx8IXRoaXMuaXNWaXNpYmxlKGUpKSlyZXR1cm4hMTtsZXQgcj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbz12ZCh0KTtyZXR1cm4gdC5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpP28hPT0tMTpyPT09ImlmcmFtZSJ8fHI9PT0ib2JqZWN0Inx8dGhpcy5fcGxhdGZvcm0uV0VCS0lUJiZ0aGlzLl9wbGF0Zm9ybS5JT1MmJiFDZih0KT8hMTpyPT09ImF1ZGlvIj90Lmhhc0F0dHJpYnV0ZSgiY29udHJvbHMiKT9vIT09LTE6ITE6cj09PSJ2aWRlbyI/bz09PS0xPyExOm8hPT1udWxsPyEwOnRoaXMuX3BsYXRmb3JtLkZJUkVGT1h8fHQuaGFzQXR0cmlidXRlKCJjb250cm9scyIpOnQudGFiSW5kZXg+PTB9aXNGb2N1c2FibGUodCxlKXtyZXR1cm4geGYodCkmJiF0aGlzLmlzRGlzYWJsZWQodCkmJihlPy5pZ25vcmVWaXNpYmlsaXR5fHx0aGlzLmlzVmlzaWJsZSh0KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCk7UXI9Y2xhc3N7X2VsZW1lbnQ7X2NoZWNrZXI7X25nWm9uZTtfZG9jdW1lbnQ7X2luamVjdG9yO19zdGFydEFuY2hvcjtfZW5kQW5jaG9yO19oYXNBdHRhY2hlZD0hMTtzdGFydEFuY2hvckxpc3RlbmVyPSgpPT50aGlzLmZvY3VzTGFzdFRhYmJhYmxlRWxlbWVudCgpO2VuZEFuY2hvckxpc3RlbmVyPSgpPT50aGlzLmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKTtnZXQgZW5hYmxlZCgpe3JldHVybiB0aGlzLl9lbmFibGVkfXNldCBlbmFibGVkKG4pe3RoaXMuX2VuYWJsZWQ9bix0aGlzLl9zdGFydEFuY2hvciYmdGhpcy5fZW5kQW5jaG9yJiYodGhpcy5fdG9nZ2xlQW5jaG9yVGFiSW5kZXgobix0aGlzLl9zdGFydEFuY2hvciksdGhpcy5fdG9nZ2xlQW5jaG9yVGFiSW5kZXgobix0aGlzLl9lbmRBbmNob3IpKX1fZW5hYmxlZD0hMDtjb25zdHJ1Y3RvcihuLHQsZSxyLG89ITEsYSl7dGhpcy5fZWxlbWVudD1uLHRoaXMuX2NoZWNrZXI9dCx0aGlzLl9uZ1pvbmU9ZSx0aGlzLl9kb2N1bWVudD1yLHRoaXMuX2luamVjdG9yPWEsb3x8dGhpcy5hdHRhY2hBbmNob3JzKCl9ZGVzdHJveSgpe2xldCBuPXRoaXMuX3N0YXJ0QW5jaG9yLHQ9dGhpcy5fZW5kQW5jaG9yO24mJihuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLnN0YXJ0QW5jaG9yTGlzdGVuZXIpLG4ucmVtb3ZlKCkpLHQmJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLmVuZEFuY2hvckxpc3RlbmVyKSx0LnJlbW92ZSgpKSx0aGlzLl9zdGFydEFuY2hvcj10aGlzLl9lbmRBbmNob3I9bnVsbCx0aGlzLl9oYXNBdHRhY2hlZD0hMX1hdHRhY2hBbmNob3JzKCl7cmV0dXJuIHRoaXMuX2hhc0F0dGFjaGVkPyEwOih0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLl9zdGFydEFuY2hvcnx8KHRoaXMuX3N0YXJ0QW5jaG9yPXRoaXMuX2NyZWF0ZUFuY2hvcigpLHRoaXMuX3N0YXJ0QW5jaG9yLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLnN0YXJ0QW5jaG9yTGlzdGVuZXIpKSx0aGlzLl9lbmRBbmNob3J8fCh0aGlzLl9lbmRBbmNob3I9dGhpcy5fY3JlYXRlQW5jaG9yKCksdGhpcy5fZW5kQW5jaG9yLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLmVuZEFuY2hvckxpc3RlbmVyKSl9KSx0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUmJih0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuX3N0YXJ0QW5jaG9yLHRoaXMuX2VsZW1lbnQpLHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fZW5kQW5jaG9yLHRoaXMuX2VsZW1lbnQubmV4dFNpYmxpbmcpLHRoaXMuX2hhc0F0dGFjaGVkPSEwKSx0aGlzLl9oYXNBdHRhY2hlZCl9Zm9jdXNJbml0aWFsRWxlbWVudFdoZW5SZWFkeShuKXtyZXR1cm4gbmV3IFByb21pc2UodD0+e3RoaXMuX2V4ZWN1dGVPblN0YWJsZSgoKT0+dCh0aGlzLmZvY3VzSW5pdGlhbEVsZW1lbnQobikpKX0pfWZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnRXaGVuUmVhZHkobil7cmV0dXJuIG5ldyBQcm9taXNlKHQ9Pnt0aGlzLl9leGVjdXRlT25TdGFibGUoKCk9PnQodGhpcy5mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50KG4pKSl9KX1mb2N1c0xhc3RUYWJiYWJsZUVsZW1lbnRXaGVuUmVhZHkobil7cmV0dXJuIG5ldyBQcm9taXNlKHQ9Pnt0aGlzLl9leGVjdXRlT25TdGFibGUoKCk9PnQodGhpcy5mb2N1c0xhc3RUYWJiYWJsZUVsZW1lbnQobikpKX0pfV9nZXRSZWdpb25Cb3VuZGFyeShuKXtsZXQgdD10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtjZGstZm9jdXMtcmVnaW9uLSR7bn1dLCBbY2RrRm9jdXNSZWdpb24ke259XSwgW2Nkay1mb2N1cy0ke259XWApO3JldHVybiBuPT0ic3RhcnQiP3QubGVuZ3RoP3RbMF06dGhpcy5fZ2V0Rmlyc3RUYWJiYWJsZUVsZW1lbnQodGhpcy5fZWxlbWVudCk6dC5sZW5ndGg/dFt0Lmxlbmd0aC0xXTp0aGlzLl9nZXRMYXN0VGFiYmFibGVFbGVtZW50KHRoaXMuX2VsZW1lbnQpfWZvY3VzSW5pdGlhbEVsZW1lbnQobil7bGV0IHQ9dGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKCJbY2RrLWZvY3VzLWluaXRpYWxdLCBbY2RrRm9jdXNJbml0aWFsXSIpO2lmKHQpe2lmKCF0aGlzLl9jaGVja2VyLmlzRm9jdXNhYmxlKHQpKXtsZXQgZT10aGlzLl9nZXRGaXJzdFRhYmJhYmxlRWxlbWVudCh0KTtyZXR1cm4gZT8uZm9jdXMobiksISFlfXJldHVybiB0LmZvY3VzKG4pLCEwfXJldHVybiB0aGlzLmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQobil9Zm9jdXNGaXJzdFRhYmJhYmxlRWxlbWVudChuKXtsZXQgdD10aGlzLl9nZXRSZWdpb25Cb3VuZGFyeSgic3RhcnQiKTtyZXR1cm4gdCYmdC5mb2N1cyhuKSwhIXR9Zm9jdXNMYXN0VGFiYmFibGVFbGVtZW50KG4pe2xldCB0PXRoaXMuX2dldFJlZ2lvbkJvdW5kYXJ5KCJlbmQiKTtyZXR1cm4gdCYmdC5mb2N1cyhuKSwhIXR9aGFzQXR0YWNoZWQoKXtyZXR1cm4gdGhpcy5faGFzQXR0YWNoZWR9X2dldEZpcnN0VGFiYmFibGVFbGVtZW50KG4pe2lmKHRoaXMuX2NoZWNrZXIuaXNGb2N1c2FibGUobikmJnRoaXMuX2NoZWNrZXIuaXNUYWJiYWJsZShuKSlyZXR1cm4gbjtsZXQgdD1uLmNoaWxkcmVuO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXQgcj10W2VdLm5vZGVUeXBlPT09dGhpcy5fZG9jdW1lbnQuRUxFTUVOVF9OT0RFP3RoaXMuX2dldEZpcnN0VGFiYmFibGVFbGVtZW50KHRbZV0pOm51bGw7aWYocilyZXR1cm4gcn1yZXR1cm4gbnVsbH1fZ2V0TGFzdFRhYmJhYmxlRWxlbWVudChuKXtpZih0aGlzLl9jaGVja2VyLmlzRm9jdXNhYmxlKG4pJiZ0aGlzLl9jaGVja2VyLmlzVGFiYmFibGUobikpcmV0dXJuIG47bGV0IHQ9bi5jaGlsZHJlbjtmb3IobGV0IGU9dC5sZW5ndGgtMTtlPj0wO2UtLSl7bGV0IHI9dFtlXS5ub2RlVHlwZT09PXRoaXMuX2RvY3VtZW50LkVMRU1FTlRfTk9ERT90aGlzLl9nZXRMYXN0VGFiYmFibGVFbGVtZW50KHRbZV0pOm51bGw7aWYocilyZXR1cm4gcn1yZXR1cm4gbnVsbH1fY3JlYXRlQW5jaG9yKCl7bGV0IG49dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIHRoaXMuX3RvZ2dsZUFuY2hvclRhYkluZGV4KHRoaXMuX2VuYWJsZWQsbiksbi5jbGFzc0xpc3QuYWRkKCJjZGstdmlzdWFsbHktaGlkZGVuIiksbi5jbGFzc0xpc3QuYWRkKCJjZGstZm9jdXMtdHJhcC1hbmNob3IiKSxuLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIiksbn1fdG9nZ2xlQW5jaG9yVGFiSW5kZXgobix0KXtuP3Quc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIjAiKTp0LnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKX10b2dnbGVBbmNob3JzKG4pe3RoaXMuX3N0YXJ0QW5jaG9yJiZ0aGlzLl9lbmRBbmNob3ImJih0aGlzLl90b2dnbGVBbmNob3JUYWJJbmRleChuLHRoaXMuX3N0YXJ0QW5jaG9yKSx0aGlzLl90b2dnbGVBbmNob3JUYWJJbmRleChuLHRoaXMuX2VuZEFuY2hvcikpfV9leGVjdXRlT25TdGFibGUobil7dGhpcy5faW5qZWN0b3I/T3Qobix7aW5qZWN0b3I6dGhpcy5faW5qZWN0b3J9KTpzZXRUaW1lb3V0KG4pfX0seGQ9KCgpPT57Y2xhc3MgaXtfY2hlY2tlcj1sKHlkKTtfbmdab25lPWwoRSk7X2RvY3VtZW50PWwoTyk7X2luamVjdG9yPWwoTik7Y29uc3RydWN0b3IoKXtsKE10KS5sb2FkKFpyKX1jcmVhdGUodCxlPSExKXtyZXR1cm4gbmV3IFFyKHQsdGhpcy5fY2hlY2tlcix0aGlzLl9uZ1pvbmUsdGhpcy5fZG9jdW1lbnQsZSx0aGlzLl9pbmplY3Rvcil9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCksRWY9KCgpPT57Y2xhc3MgaXtfZWxlbWVudFJlZj1sKEQpO19mb2N1c1RyYXBGYWN0b3J5PWwoeGQpO2ZvY3VzVHJhcDtfcHJldmlvdXNseUZvY3VzZWRFbGVtZW50PW51bGw7Z2V0IGVuYWJsZWQoKXtyZXR1cm4gdGhpcy5mb2N1c1RyYXA/LmVuYWJsZWR8fCExfXNldCBlbmFibGVkKHQpe3RoaXMuZm9jdXNUcmFwJiYodGhpcy5mb2N1c1RyYXAuZW5hYmxlZD10KX1hdXRvQ2FwdHVyZTtjb25zdHJ1Y3Rvcigpe2woVCkuaXNCcm93c2VyJiYodGhpcy5mb2N1c1RyYXA9dGhpcy5fZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCEwKSl9bmdPbkRlc3Ryb3koKXt0aGlzLmZvY3VzVHJhcD8uZGVzdHJveSgpLHRoaXMuX3ByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCYmKHRoaXMuX3ByZXZpb3VzbHlGb2N1c2VkRWxlbWVudC5mb2N1cygpLHRoaXMuX3ByZXZpb3VzbHlGb2N1c2VkRWxlbWVudD1udWxsKX1uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLmZvY3VzVHJhcD8uYXR0YWNoQW5jaG9ycygpLHRoaXMuYXV0b0NhcHR1cmUmJnRoaXMuX2NhcHR1cmVGb2N1cygpfW5nRG9DaGVjaygpe3RoaXMuZm9jdXNUcmFwJiYhdGhpcy5mb2N1c1RyYXAuaGFzQXR0YWNoZWQoKSYmdGhpcy5mb2N1c1RyYXAuYXR0YWNoQW5jaG9ycygpfW5nT25DaGFuZ2VzKHQpe2xldCBlPXQuYXV0b0NhcHR1cmU7ZSYmIWUuZmlyc3RDaGFuZ2UmJnRoaXMuYXV0b0NhcHR1cmUmJnRoaXMuZm9jdXNUcmFwPy5oYXNBdHRhY2hlZCgpJiZ0aGlzLl9jYXB0dXJlRm9jdXMoKX1fY2FwdHVyZUZvY3VzKCl7dGhpcy5fcHJldmlvdXNseUZvY3VzZWRFbGVtZW50PUFhKCksdGhpcy5mb2N1c1RyYXA/LmZvY3VzSW5pdGlhbEVsZW1lbnRXaGVuUmVhZHkoKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyIiLCJjZGtUcmFwRm9jdXMiLCIiXV0saW5wdXRzOntlbmFibGVkOlsyLCJjZGtUcmFwRm9jdXMiLCJlbmFibGVkIixGXSxhdXRvQ2FwdHVyZTpbMiwiY2RrVHJhcEZvY3VzQXV0b0NhcHR1cmUiLCJhdXRvQ2FwdHVyZSIsRl19LGV4cG9ydEFzOlsiY2RrVHJhcEZvY3VzIl0sZmVhdHVyZXM6W210XX0pfXJldHVybiBpfSkoKSx3ZD1uZXcgdigibGl2ZUFubm91bmNlckVsZW1lbnQiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OkVkfSk7U2Q9bmV3IHYoIkxJVkVfQU5OT1VOQ0VSX0RFRkFVTFRfT1BUSU9OUyIpLFNmPTAsaXM9KCgpPT57Y2xhc3MgaXtfbmdab25lPWwoRSk7X2RlZmF1bHRPcHRpb25zPWwoU2Qse29wdGlvbmFsOiEwfSk7X2xpdmVFbGVtZW50O19kb2N1bWVudD1sKE8pO19wcmV2aW91c1RpbWVvdXQ7X2N1cnJlbnRQcm9taXNlO19jdXJyZW50UmVzb2x2ZTtjb25zdHJ1Y3Rvcigpe2xldCB0PWwod2Qse29wdGlvbmFsOiEwfSk7dGhpcy5fbGl2ZUVsZW1lbnQ9dHx8dGhpcy5fY3JlYXRlTGl2ZUVsZW1lbnQoKX1hbm5vdW5jZSh0LC4uLmUpe2xldCByPXRoaXMuX2RlZmF1bHRPcHRpb25zLG8sYTtyZXR1cm4gZS5sZW5ndGg9PT0xJiZ0eXBlb2YgZVswXT09Im51bWJlciI/YT1lWzBdOltvLGFdPWUsdGhpcy5jbGVhcigpLGNsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpLG98fChvPXImJnIucG9saXRlbmVzcz9yLnBvbGl0ZW5lc3M6InBvbGl0ZSIpLGE9PW51bGwmJnImJihhPXIuZHVyYXRpb24pLHRoaXMuX2xpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIixvKSx0aGlzLl9saXZlRWxlbWVudC5pZCYmdGhpcy5fZXhwb3NlQW5ub3VuY2VyVG9Nb2RhbHModGhpcy5fbGl2ZUVsZW1lbnQuaWQpLHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+KHRoaXMuX2N1cnJlbnRQcm9taXNlfHwodGhpcy5fY3VycmVudFByb21pc2U9bmV3IFByb21pc2Uocz0+dGhpcy5fY3VycmVudFJlc29sdmU9cykpLGNsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpLHRoaXMuX3ByZXZpb3VzVGltZW91dD1zZXRUaW1lb3V0KCgpPT57dGhpcy5fbGl2ZUVsZW1lbnQudGV4dENvbnRlbnQ9dCx0eXBlb2YgYT09Im51bWJlciImJih0aGlzLl9wcmV2aW91c1RpbWVvdXQ9c2V0VGltZW91dCgoKT0+dGhpcy5jbGVhcigpLGEpKSx0aGlzLl9jdXJyZW50UmVzb2x2ZT8uKCksdGhpcy5fY3VycmVudFByb21pc2U9dGhpcy5fY3VycmVudFJlc29sdmU9dm9pZCAwfSwxMDApLHRoaXMuX2N1cnJlbnRQcm9taXNlKSl9Y2xlYXIoKXt0aGlzLl9saXZlRWxlbWVudCYmKHRoaXMuX2xpdmVFbGVtZW50LnRleHRDb250ZW50PSIiKX1uZ09uRGVzdHJveSgpe2NsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpLHRoaXMuX2xpdmVFbGVtZW50Py5yZW1vdmUoKSx0aGlzLl9saXZlRWxlbWVudD1udWxsLHRoaXMuX2N1cnJlbnRSZXNvbHZlPy4oKSx0aGlzLl9jdXJyZW50UHJvbWlzZT10aGlzLl9jdXJyZW50UmVzb2x2ZT12b2lkIDB9X2NyZWF0ZUxpdmVFbGVtZW50KCl7bGV0IHQ9ImNkay1saXZlLWFubm91bmNlci1lbGVtZW50IixlPXRoaXMuX2RvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodCkscj10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyllW29dLnJlbW92ZSgpO3JldHVybiByLmNsYXNzTGlzdC5hZGQodCksci5jbGFzc0xpc3QuYWRkKCJjZGstdmlzdWFsbHktaGlkZGVuIiksci5zZXRBdHRyaWJ1dGUoImFyaWEtYXRvbWljIiwidHJ1ZSIpLHIuc2V0QXR0cmlidXRlKCJhcmlhLWxpdmUiLCJwb2xpdGUiKSxyLmlkPWBjZGstbGl2ZS1hbm5vdW5jZXItJHtTZisrfWAsdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyKSxyfV9leHBvc2VBbm5vdW5jZXJUb01vZGFscyh0KXtsZXQgZT10aGlzLl9kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdib2R5ID4gLmNkay1vdmVybGF5LWNvbnRhaW5lciBbYXJpYS1tb2RhbD0idHJ1ZSJdJyk7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2xldCBvPWVbcl0sYT1vLmdldEF0dHJpYnV0ZSgiYXJpYS1vd25zIik7YT9hLmluZGV4T2YodCk9PT0tMSYmby5zZXRBdHRyaWJ1dGUoImFyaWEtb3ducyIsYSsiICIrdCk6by5zZXRBdHRyaWJ1dGUoImFyaWEtb3ducyIsdCl9fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpLHhlPShmdW5jdGlvbihpKXtyZXR1cm4gaVtpLk5PTkU9MF09Ik5PTkUiLGlbaS5CTEFDS19PTl9XSElURT0xXT0iQkxBQ0tfT05fV0hJVEUiLGlbaS5XSElURV9PTl9CTEFDSz0yXT0iV0hJVEVfT05fQkxBQ0siLGl9KSh4ZXx8e30pLF9kPSJjZGstaGlnaC1jb250cmFzdC1ibGFjay1vbi13aGl0ZSIsYmQ9ImNkay1oaWdoLWNvbnRyYXN0LXdoaXRlLW9uLWJsYWNrIixlcz0iY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIixKcj0oKCk9PntjbGFzcyBpe19wbGF0Zm9ybT1sKFQpO19oYXNDaGVja2VkSGlnaENvbnRyYXN0TW9kZTtfZG9jdW1lbnQ9bChPKTtfYnJlYWtwb2ludFN1YnNjcmlwdGlvbjtjb25zdHJ1Y3Rvcigpe3RoaXMuX2JyZWFrcG9pbnRTdWJzY3JpcHRpb249bCh4bikub2JzZXJ2ZSgiKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSkiKS5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9oYXNDaGVja2VkSGlnaENvbnRyYXN0TW9kZSYmKHRoaXMuX2hhc0NoZWNrZWRIaWdoQ29udHJhc3RNb2RlPSExLHRoaXMuX2FwcGx5Qm9keUhpZ2hDb250cmFzdE1vZGVDc3NDbGFzc2VzKCkpfSl9Z2V0SGlnaENvbnRyYXN0TW9kZSgpe2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJuIHhlLk5PTkU7bGV0IHQ9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYigxLDIsMykiLHQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0aGlzLl9kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO2xldCBlPXRoaXMuX2RvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3cscj1lJiZlLmdldENvbXB1dGVkU3R5bGU/ZS5nZXRDb21wdXRlZFN0eWxlKHQpOm51bGwsbz0ociYmci5iYWNrZ3JvdW5kQ29sb3J8fCIiKS5yZXBsYWNlKC8gL2csIiIpO3N3aXRjaCh0LnJlbW92ZSgpLG8pe2Nhc2UicmdiKDAsMCwwKSI6Y2FzZSJyZ2IoNDUsNTAsNTQpIjpjYXNlInJnYigzMiwzMiwzMikiOnJldHVybiB4ZS5XSElURV9PTl9CTEFDSztjYXNlInJnYigyNTUsMjU1LDI1NSkiOmNhc2UicmdiKDI1NSwyNTAsMjM5KSI6cmV0dXJuIHhlLkJMQUNLX09OX1dISVRFfXJldHVybiB4ZS5OT05FfW5nT25EZXN0cm95KCl7dGhpcy5fYnJlYWtwb2ludFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfV9hcHBseUJvZHlIaWdoQ29udHJhc3RNb2RlQ3NzQ2xhc3Nlcygpe2lmKCF0aGlzLl9oYXNDaGVja2VkSGlnaENvbnRyYXN0TW9kZSYmdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyJiZ0aGlzLl9kb2N1bWVudC5ib2R5KXtsZXQgdD10aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdDt0LnJlbW92ZShlcyxfZCxiZCksdGhpcy5faGFzQ2hlY2tlZEhpZ2hDb250cmFzdE1vZGU9ITA7bGV0IGU9dGhpcy5nZXRIaWdoQ29udHJhc3RNb2RlKCk7ZT09PXhlLkJMQUNLX09OX1dISVRFP3QuYWRkKGVzLF9kKTplPT09eGUuV0hJVEVfT05fQkxBQ0smJnQuYWRkKGVzLGJkKX19c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1cHJvdj1tKHt0b2tlbjppLGZhY3Rvcnk6aS5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gaX0pKCksRGY9KCgpPT57Y2xhc3MgaXtjb25zdHJ1Y3Rvcigpe2woSnIpLl9hcHBseUJvZHlIaWdoQ29udHJhc3RNb2RlQ3NzQ2xhc3NlcygpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NW1vZD1SKHt0eXBlOml9KTtzdGF0aWMgXHUwMjc1aW5qPVMoe2ltcG9ydHM6W1hyXX0pfXJldHVybiBpfSkoKX0pO3ZhciBSZix0byxEZD1fKCgpPT57bnQoKTtodCgpO1JmPTIwMCx0bz1jbGFzc3tfbGV0dGVyS2V5U3RyZWFtPW5ldyB5O19pdGVtcz1bXTtfc2VsZWN0ZWRJdGVtSW5kZXg9LTE7X3ByZXNzZWRMZXR0ZXJzPVtdO19za2lwUHJlZGljYXRlRm47X3NlbGVjdGVkSXRlbT1uZXcgeTtzZWxlY3RlZEl0ZW09dGhpcy5fc2VsZWN0ZWRJdGVtO2NvbnN0cnVjdG9yKG4sdCl7bGV0IGU9dHlwZW9mIHQ/LmRlYm91bmNlSW50ZXJ2YWw9PSJudW1iZXIiP3QuZGVib3VuY2VJbnRlcnZhbDpSZjt0Py5za2lwUHJlZGljYXRlJiYodGhpcy5fc2tpcFByZWRpY2F0ZUZuPXQuc2tpcFByZWRpY2F0ZSksdGhpcy5zZXRJdGVtcyhuKSx0aGlzLl9zZXR1cEtleUhhbmRsZXIoZSl9ZGVzdHJveSgpe3RoaXMuX3ByZXNzZWRMZXR0ZXJzPVtdLHRoaXMuX2xldHRlcktleVN0cmVhbS5jb21wbGV0ZSgpLHRoaXMuX3NlbGVjdGVkSXRlbS5jb21wbGV0ZSgpfXNldEN1cnJlbnRTZWxlY3RlZEl0ZW1JbmRleChuKXt0aGlzLl9zZWxlY3RlZEl0ZW1JbmRleD1ufXNldEl0ZW1zKG4pe3RoaXMuX2l0ZW1zPW59aGFuZGxlS2V5KG4pe2xldCB0PW4ua2V5Q29kZTtuLmtleSYmbi5rZXkubGVuZ3RoPT09MT90aGlzLl9sZXR0ZXJLZXlTdHJlYW0ubmV4dChuLmtleS50b0xvY2FsZVVwcGVyQ2FzZSgpKToodD49NjUmJnQ8PTkwfHx0Pj00OCYmdDw9NTcpJiZ0aGlzLl9sZXR0ZXJLZXlTdHJlYW0ubmV4dChTdHJpbmcuZnJvbUNoYXJDb2RlKHQpKX1pc1R5cGluZygpe3JldHVybiB0aGlzLl9wcmVzc2VkTGV0dGVycy5sZW5ndGg+MH1yZXNldCgpe3RoaXMuX3ByZXNzZWRMZXR0ZXJzPVtdfV9zZXR1cEtleUhhbmRsZXIobil7dGhpcy5fbGV0dGVyS2V5U3RyZWFtLnBpcGUoVyh0PT50aGlzLl9wcmVzc2VkTGV0dGVycy5wdXNoKHQpKSxYZShuKSxLKCgpPT50aGlzLl9wcmVzc2VkTGV0dGVycy5sZW5ndGg+MCksYigoKT0+dGhpcy5fcHJlc3NlZExldHRlcnMuam9pbigiIikudG9Mb2NhbGVVcHBlckNhc2UoKSkpLnN1YnNjcmliZSh0PT57Zm9yKGxldCBlPTE7ZTx0aGlzLl9pdGVtcy5sZW5ndGgrMTtlKyspe2xldCByPSh0aGlzLl9zZWxlY3RlZEl0ZW1JbmRleCtlKSV0aGlzLl9pdGVtcy5sZW5ndGgsbz10aGlzLl9pdGVtc1tyXTtpZighdGhpcy5fc2tpcFByZWRpY2F0ZUZuPy4obykmJm8uZ2V0TGFiZWw/LigpLnRvTG9jYWxlVXBwZXJDYXNlKCkudHJpbSgpLmluZGV4T2YodCk9PT0wKXt0aGlzLl9zZWxlY3RlZEl0ZW0ubmV4dChvKTticmVha319dGhpcy5fcHJlc3NlZExldHRlcnM9W119KX19fSk7dmFyIE1pLHJzPV8oKCk9PntmKCk7bnQoKTtEZCgpO3phKCk7TWk9Y2xhc3N7X2l0ZW1zO19hY3RpdmVJdGVtSW5kZXg9SigtMSk7X2FjdGl2ZUl0ZW09SihudWxsKTtfd3JhcD0hMTtfdHlwZWFoZWFkU3Vic2NyaXB0aW9uPWZ0LkVNUFRZO19pdGVtQ2hhbmdlc1N1YnNjcmlwdGlvbjtfdmVydGljYWw9ITA7X2hvcml6b250YWw7X2FsbG93ZWRNb2RpZmllcktleXM9W107X2hvbWVBbmRFbmQ9ITE7X3BhZ2VVcEFuZERvd249e2VuYWJsZWQ6ITEsZGVsdGE6MTB9O19lZmZlY3RSZWY7X3R5cGVhaGVhZDtfc2tpcFByZWRpY2F0ZUZuPW49Pm4uZGlzYWJsZWQ7Y29uc3RydWN0b3Iobix0KXt0aGlzLl9pdGVtcz1uLG4gaW5zdGFuY2VvZiBObz90aGlzLl9pdGVtQ2hhbmdlc1N1YnNjcmlwdGlvbj1uLmNoYW5nZXMuc3Vic2NyaWJlKGU9PnRoaXMuX2l0ZW1zQ2hhbmdlZChlLnRvQXJyYXkoKSkpOlVpKG4pJiYodGhpcy5fZWZmZWN0UmVmPU5lKCgpPT50aGlzLl9pdGVtc0NoYW5nZWQobigpKSx7aW5qZWN0b3I6dH0pKX10YWJPdXQ9bmV3IHk7Y2hhbmdlPW5ldyB5O3NraXBQcmVkaWNhdGUobil7cmV0dXJuIHRoaXMuX3NraXBQcmVkaWNhdGVGbj1uLHRoaXN9d2l0aFdyYXAobj0hMCl7cmV0dXJuIHRoaXMuX3dyYXA9bix0aGlzfXdpdGhWZXJ0aWNhbE9yaWVudGF0aW9uKG49ITApe3JldHVybiB0aGlzLl92ZXJ0aWNhbD1uLHRoaXN9d2l0aEhvcml6b250YWxPcmllbnRhdGlvbihuKXtyZXR1cm4gdGhpcy5faG9yaXpvbnRhbD1uLHRoaXN9d2l0aEFsbG93ZWRNb2RpZmllcktleXMobil7cmV0dXJuIHRoaXMuX2FsbG93ZWRNb2RpZmllcktleXM9bix0aGlzfXdpdGhUeXBlQWhlYWQobj0yMDApe3RoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO2xldCB0PXRoaXMuX2dldEl0ZW1zQXJyYXkoKTtyZXR1cm4gdGhpcy5fdHlwZWFoZWFkPW5ldyB0byh0LHtkZWJvdW5jZUludGVydmFsOnR5cGVvZiBuPT0ibnVtYmVyIj9uOnZvaWQgMCxza2lwUHJlZGljYXRlOmU9PnRoaXMuX3NraXBQcmVkaWNhdGVGbihlKX0pLHRoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbj10aGlzLl90eXBlYWhlYWQuc2VsZWN0ZWRJdGVtLnN1YnNjcmliZShlPT57dGhpcy5zZXRBY3RpdmVJdGVtKGUpfSksdGhpc31jYW5jZWxUeXBlYWhlYWQoKXtyZXR1cm4gdGhpcy5fdHlwZWFoZWFkPy5yZXNldCgpLHRoaXN9d2l0aEhvbWVBbmRFbmQobj0hMCl7cmV0dXJuIHRoaXMuX2hvbWVBbmRFbmQ9bix0aGlzfXdpdGhQYWdlVXBEb3duKG49ITAsdD0xMCl7cmV0dXJuIHRoaXMuX3BhZ2VVcEFuZERvd249e2VuYWJsZWQ6bixkZWx0YTp0fSx0aGlzfXNldEFjdGl2ZUl0ZW0obil7bGV0IHQ9dGhpcy5fYWN0aXZlSXRlbSgpO3RoaXMudXBkYXRlQWN0aXZlSXRlbShuKSx0aGlzLl9hY3RpdmVJdGVtKCkhPT10JiZ0aGlzLmNoYW5nZS5uZXh0KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCgpKX1vbktleWRvd24obil7bGV0IHQ9bi5rZXlDb2RlLHI9WyJhbHRLZXkiLCJjdHJsS2V5IiwibWV0YUtleSIsInNoaWZ0S2V5Il0uZXZlcnkobz0+IW5bb118fHRoaXMuX2FsbG93ZWRNb2RpZmllcktleXMuaW5kZXhPZihvKT4tMSk7c3dpdGNoKHQpe2Nhc2UgOTp0aGlzLnRhYk91dC5uZXh0KCk7cmV0dXJuO2Nhc2UgNDA6aWYodGhpcy5fdmVydGljYWwmJnIpe3RoaXMuc2V0TmV4dEl0ZW1BY3RpdmUoKTticmVha31lbHNlIHJldHVybjtjYXNlIDM4OmlmKHRoaXMuX3ZlcnRpY2FsJiZyKXt0aGlzLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO2JyZWFrfWVsc2UgcmV0dXJuO2Nhc2UgMzk6aWYodGhpcy5faG9yaXpvbnRhbCYmcil7dGhpcy5faG9yaXpvbnRhbD09PSJydGwiP3RoaXMuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk6dGhpcy5zZXROZXh0SXRlbUFjdGl2ZSgpO2JyZWFrfWVsc2UgcmV0dXJuO2Nhc2UgMzc6aWYodGhpcy5faG9yaXpvbnRhbCYmcil7dGhpcy5faG9yaXpvbnRhbD09PSJydGwiP3RoaXMuc2V0TmV4dEl0ZW1BY3RpdmUoKTp0aGlzLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO2JyZWFrfWVsc2UgcmV0dXJuO2Nhc2UgMzY6aWYodGhpcy5faG9tZUFuZEVuZCYmcil7dGhpcy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTticmVha31lbHNlIHJldHVybjtjYXNlIDM1OmlmKHRoaXMuX2hvbWVBbmRFbmQmJnIpe3RoaXMuc2V0TGFzdEl0ZW1BY3RpdmUoKTticmVha31lbHNlIHJldHVybjtjYXNlIDMzOmlmKHRoaXMuX3BhZ2VVcEFuZERvd24uZW5hYmxlZCYmcil7bGV0IG89dGhpcy5fYWN0aXZlSXRlbUluZGV4KCktdGhpcy5fcGFnZVVwQW5kRG93bi5kZWx0YTt0aGlzLl9zZXRBY3RpdmVJdGVtQnlJbmRleChvPjA/bzowLDEpO2JyZWFrfWVsc2UgcmV0dXJuO2Nhc2UgMzQ6aWYodGhpcy5fcGFnZVVwQW5kRG93bi5lbmFibGVkJiZyKXtsZXQgbz10aGlzLl9hY3RpdmVJdGVtSW5kZXgoKSt0aGlzLl9wYWdlVXBBbmREb3duLmRlbHRhLGE9dGhpcy5fZ2V0SXRlbXNBcnJheSgpLmxlbmd0aDt0aGlzLl9zZXRBY3RpdmVJdGVtQnlJbmRleChvPGE/bzphLTEsLTEpO2JyZWFrfWVsc2UgcmV0dXJuO2RlZmF1bHQ6KHJ8fE5yKG4sInNoaWZ0S2V5IikpJiZ0aGlzLl90eXBlYWhlYWQ/LmhhbmRsZUtleShuKTtyZXR1cm59dGhpcy5fdHlwZWFoZWFkPy5yZXNldCgpLG4ucHJldmVudERlZmF1bHQoKX1nZXQgYWN0aXZlSXRlbUluZGV4KCl7cmV0dXJuIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCgpfWdldCBhY3RpdmVJdGVtKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZUl0ZW0oKX1pc1R5cGluZygpe3JldHVybiEhdGhpcy5fdHlwZWFoZWFkJiZ0aGlzLl90eXBlYWhlYWQuaXNUeXBpbmcoKX1zZXRGaXJzdEl0ZW1BY3RpdmUoKXt0aGlzLl9zZXRBY3RpdmVJdGVtQnlJbmRleCgwLDEpfXNldExhc3RJdGVtQWN0aXZlKCl7dGhpcy5fc2V0QWN0aXZlSXRlbUJ5SW5kZXgodGhpcy5fZ2V0SXRlbXNBcnJheSgpLmxlbmd0aC0xLC0xKX1zZXROZXh0SXRlbUFjdGl2ZSgpe3RoaXMuX2FjdGl2ZUl0ZW1JbmRleCgpPDA/dGhpcy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTp0aGlzLl9zZXRBY3RpdmVJdGVtQnlEZWx0YSgxKX1zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKXt0aGlzLl9hY3RpdmVJdGVtSW5kZXgoKTwwJiZ0aGlzLl93cmFwP3RoaXMuc2V0TGFzdEl0ZW1BY3RpdmUoKTp0aGlzLl9zZXRBY3RpdmVJdGVtQnlEZWx0YSgtMSl9dXBkYXRlQWN0aXZlSXRlbShuKXtsZXQgdD10aGlzLl9nZXRJdGVtc0FycmF5KCksZT10eXBlb2Ygbj09Im51bWJlciI/bjp0LmluZGV4T2Yobikscj10W2VdO3RoaXMuX2FjdGl2ZUl0ZW0uc2V0KHI/P251bGwpLHRoaXMuX2FjdGl2ZUl0ZW1JbmRleC5zZXQoZSksdGhpcy5fdHlwZWFoZWFkPy5zZXRDdXJyZW50U2VsZWN0ZWRJdGVtSW5kZXgoZSl9ZGVzdHJveSgpe3RoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2l0ZW1DaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpLHRoaXMuX2VmZmVjdFJlZj8uZGVzdHJveSgpLHRoaXMuX3R5cGVhaGVhZD8uZGVzdHJveSgpLHRoaXMudGFiT3V0LmNvbXBsZXRlKCksdGhpcy5jaGFuZ2UuY29tcGxldGUoKX1fc2V0QWN0aXZlSXRlbUJ5RGVsdGEobil7dGhpcy5fd3JhcD90aGlzLl9zZXRBY3RpdmVJbldyYXBNb2RlKG4pOnRoaXMuX3NldEFjdGl2ZUluRGVmYXVsdE1vZGUobil9X3NldEFjdGl2ZUluV3JhcE1vZGUobil7bGV0IHQ9dGhpcy5fZ2V0SXRlbXNBcnJheSgpO2ZvcihsZXQgZT0xO2U8PXQubGVuZ3RoO2UrKyl7bGV0IHI9KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCgpK24qZSt0Lmxlbmd0aCkldC5sZW5ndGgsbz10W3JdO2lmKCF0aGlzLl9za2lwUHJlZGljYXRlRm4obykpe3RoaXMuc2V0QWN0aXZlSXRlbShyKTtyZXR1cm59fX1fc2V0QWN0aXZlSW5EZWZhdWx0TW9kZShuKXt0aGlzLl9zZXRBY3RpdmVJdGVtQnlJbmRleCh0aGlzLl9hY3RpdmVJdGVtSW5kZXgoKStuLG4pfV9zZXRBY3RpdmVJdGVtQnlJbmRleChuLHQpe2xldCBlPXRoaXMuX2dldEl0ZW1zQXJyYXkoKTtpZihlW25dKXtmb3IoO3RoaXMuX3NraXBQcmVkaWNhdGVGbihlW25dKTspaWYobis9dCwhZVtuXSlyZXR1cm47dGhpcy5zZXRBY3RpdmVJdGVtKG4pfX1fZ2V0SXRlbXNBcnJheSgpe3JldHVybiBVaSh0aGlzLl9pdGVtcyk/dGhpcy5faXRlbXMoKTp0aGlzLl9pdGVtcyBpbnN0YW5jZW9mIE5vP3RoaXMuX2l0ZW1zLnRvQXJyYXkoKTp0aGlzLl9pdGVtc31faXRlbXNDaGFuZ2VkKG4pe3RoaXMuX3R5cGVhaGVhZD8uc2V0SXRlbXMobik7bGV0IHQ9dGhpcy5fYWN0aXZlSXRlbSgpO2lmKHQpe2xldCBlPW4uaW5kZXhPZih0KTtlPi0xJiZlIT09dGhpcy5fYWN0aXZlSXRlbUluZGV4KCkmJih0aGlzLl9hY3RpdmVJdGVtSW5kZXguc2V0KGUpLHRoaXMuX3R5cGVhaGVhZD8uc2V0Q3VycmVudFNlbGVjdGVkSXRlbUluZGV4KGUpKX19fX0pO3ZhciBvcyxSZD1fKCgpPT57cnMoKTtvcz1jbGFzcyBleHRlbmRzIE1pe3NldEFjdGl2ZUl0ZW0obil7dGhpcy5hY3RpdmVJdGVtJiZ0aGlzLmFjdGl2ZUl0ZW0uc2V0SW5hY3RpdmVTdHlsZXMoKSxzdXBlci5zZXRBY3RpdmVJdGVtKG4pLHRoaXMuYWN0aXZlSXRlbSYmdGhpcy5hY3RpdmVJdGVtLnNldEFjdGl2ZVN0eWxlcygpfX19KTt2YXIgYXMsQWQ9XygoKT0+e3JzKCk7YXM9Y2xhc3MgZXh0ZW5kcyBNaXtfb3JpZ2luPSJwcm9ncmFtIjtzZXRGb2N1c09yaWdpbihuKXtyZXR1cm4gdGhpcy5fb3JpZ2luPW4sdGhpc31zZXRBY3RpdmVJdGVtKG4pe3N1cGVyLnNldEFjdGl2ZUl0ZW0obiksdGhpcy5hY3RpdmVJdGVtJiZ0aGlzLmFjdGl2ZUl0ZW0uZm9jdXModGhpcy5fb3JpZ2luKX19fSk7ZnVuY3Rpb24gQWYoaSxuLHQpe2xldCBlPWlvKGksbik7dD10LnRyaW0oKSwhZS5zb21lKHI9PnIudHJpbSgpPT09dCkmJihlLnB1c2godCksaS5zZXRBdHRyaWJ1dGUobixlLmpvaW4oSWQpKSl9ZnVuY3Rpb24gTWYoaSxuLHQpe2xldCBlPWlvKGksbik7dD10LnRyaW0oKTtsZXQgcj1lLmZpbHRlcihvPT5vIT09dCk7ci5sZW5ndGg/aS5zZXRBdHRyaWJ1dGUobixyLmpvaW4oSWQpKTppLnJlbW92ZUF0dHJpYnV0ZShuKX1mdW5jdGlvbiBpbyhpLG4pe3JldHVybiBpLmdldEF0dHJpYnV0ZShuKT8ubWF0Y2goL1xTKy9nKT8/W119ZnVuY3Rpb24gc3MoaSxuKXtyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciP2Ake258fCIifS8ke2l9YDppfWZ1bmN0aW9uIE1kKGksbil7aS5pZHx8KGkuaWQ9YCR7T2R9LSR7bn0tJHtscysrfWApfXZhciBJZCxPZCxlbyxscyxLQyxxZT1fKCgpPT57ZmQoKTtucygpO25zKCk7QmEoKTtmKCk7ZigpO3NlKCk7eGkoKTtBbigpO1JkKCk7QWQoKTtYYSgpO0lkPSIgIjtPZD0iY2RrLWRlc2NyaWJlZGJ5LW1lc3NhZ2UiLGVvPSJjZGstZGVzY3JpYmVkYnktaG9zdCIsbHM9MCxLQz0oKCk9PntjbGFzcyBpe19wbGF0Zm9ybT1sKFQpO19kb2N1bWVudD1sKE8pO19tZXNzYWdlUmVnaXN0cnk9bmV3IE1hcDtfbWVzc2FnZXNDb250YWluZXI9bnVsbDtfaWQ9YCR7bHMrK31gO2NvbnN0cnVjdG9yKCl7bChNdCkubG9hZChaciksdGhpcy5faWQ9bChXbikrIi0iK2xzKyt9ZGVzY3JpYmUodCxlLHIpe2lmKCF0aGlzLl9jYW5CZURlc2NyaWJlZCh0LGUpKXJldHVybjtsZXQgbz1zcyhlLHIpO3R5cGVvZiBlIT0ic3RyaW5nIj8oTWQoZSx0aGlzLl9pZCksdGhpcy5fbWVzc2FnZVJlZ2lzdHJ5LnNldChvLHttZXNzYWdlRWxlbWVudDplLHJlZmVyZW5jZUNvdW50OjB9KSk6dGhpcy5fbWVzc2FnZVJlZ2lzdHJ5LmhhcyhvKXx8dGhpcy5fY3JlYXRlTWVzc2FnZUVsZW1lbnQoZSxyKSx0aGlzLl9pc0VsZW1lbnREZXNjcmliZWRCeU1lc3NhZ2UodCxvKXx8dGhpcy5fYWRkTWVzc2FnZVJlZmVyZW5jZSh0LG8pfXJlbW92ZURlc2NyaXB0aW9uKHQsZSxyKXtpZighZXx8IXRoaXMuX2lzRWxlbWVudE5vZGUodCkpcmV0dXJuO2xldCBvPXNzKGUscik7aWYodGhpcy5faXNFbGVtZW50RGVzY3JpYmVkQnlNZXNzYWdlKHQsbykmJnRoaXMuX3JlbW92ZU1lc3NhZ2VSZWZlcmVuY2UodCxvKSx0eXBlb2YgZT09InN0cmluZyIpe2xldCBhPXRoaXMuX21lc3NhZ2VSZWdpc3RyeS5nZXQobyk7YSYmYS5yZWZlcmVuY2VDb3VudD09PTAmJnRoaXMuX2RlbGV0ZU1lc3NhZ2VFbGVtZW50KG8pfXRoaXMuX21lc3NhZ2VzQ29udGFpbmVyPy5jaGlsZE5vZGVzLmxlbmd0aD09PTAmJih0aGlzLl9tZXNzYWdlc0NvbnRhaW5lci5yZW1vdmUoKSx0aGlzLl9tZXNzYWdlc0NvbnRhaW5lcj1udWxsKX1uZ09uRGVzdHJveSgpe2xldCB0PXRoaXMuX2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske2VvfT0iJHt0aGlzLl9pZH0iXWApO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXRoaXMuX3JlbW92ZUNka0Rlc2NyaWJlZEJ5UmVmZXJlbmNlSWRzKHRbZV0pLHRbZV0ucmVtb3ZlQXR0cmlidXRlKGVvKTt0aGlzLl9tZXNzYWdlc0NvbnRhaW5lcj8ucmVtb3ZlKCksdGhpcy5fbWVzc2FnZXNDb250YWluZXI9bnVsbCx0aGlzLl9tZXNzYWdlUmVnaXN0cnkuY2xlYXIoKX1fY3JlYXRlTWVzc2FnZUVsZW1lbnQodCxlKXtsZXQgcj10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtNZChyLHRoaXMuX2lkKSxyLnRleHRDb250ZW50PXQsZSYmci5zZXRBdHRyaWJ1dGUoInJvbGUiLGUpLHRoaXMuX2NyZWF0ZU1lc3NhZ2VzQ29udGFpbmVyKCksdGhpcy5fbWVzc2FnZXNDb250YWluZXIuYXBwZW5kQ2hpbGQociksdGhpcy5fbWVzc2FnZVJlZ2lzdHJ5LnNldChzcyh0LGUpLHttZXNzYWdlRWxlbWVudDpyLHJlZmVyZW5jZUNvdW50OjB9KX1fZGVsZXRlTWVzc2FnZUVsZW1lbnQodCl7dGhpcy5fbWVzc2FnZVJlZ2lzdHJ5LmdldCh0KT8ubWVzc2FnZUVsZW1lbnQ/LnJlbW92ZSgpLHRoaXMuX21lc3NhZ2VSZWdpc3RyeS5kZWxldGUodCl9X2NyZWF0ZU1lc3NhZ2VzQ29udGFpbmVyKCl7aWYodGhpcy5fbWVzc2FnZXNDb250YWluZXIpcmV0dXJuO2xldCB0PSJjZGstZGVzY3JpYmVkYnktbWVzc2FnZS1jb250YWluZXIiLGU9dGhpcy5fZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7dH1bcGxhdGZvcm09InNlcnZlciJdYCk7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspZVtvXS5yZW1vdmUoKTtsZXQgcj10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsci5jbGFzc0xpc3QuYWRkKHQpLHIuY2xhc3NMaXN0LmFkZCgiY2RrLXZpc3VhbGx5LWhpZGRlbiIpLHRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcnx8ci5zZXRBdHRyaWJ1dGUoInBsYXRmb3JtIiwic2VydmVyIiksdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyKSx0aGlzLl9tZXNzYWdlc0NvbnRhaW5lcj1yfV9yZW1vdmVDZGtEZXNjcmliZWRCeVJlZmVyZW5jZUlkcyh0KXtsZXQgZT1pbyh0LCJhcmlhLWRlc2NyaWJlZGJ5IikuZmlsdGVyKHI9PnIuaW5kZXhPZihPZCkhPTApO3Quc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixlLmpvaW4oIiAiKSl9X2FkZE1lc3NhZ2VSZWZlcmVuY2UodCxlKXtsZXQgcj10aGlzLl9tZXNzYWdlUmVnaXN0cnkuZ2V0KGUpO0FmKHQsImFyaWEtZGVzY3JpYmVkYnkiLHIubWVzc2FnZUVsZW1lbnQuaWQpLHQuc2V0QXR0cmlidXRlKGVvLHRoaXMuX2lkKSxyLnJlZmVyZW5jZUNvdW50Kyt9X3JlbW92ZU1lc3NhZ2VSZWZlcmVuY2UodCxlKXtsZXQgcj10aGlzLl9tZXNzYWdlUmVnaXN0cnkuZ2V0KGUpO3IucmVmZXJlbmNlQ291bnQtLSxNZih0LCJhcmlhLWRlc2NyaWJlZGJ5IixyLm1lc3NhZ2VFbGVtZW50LmlkKSx0LnJlbW92ZUF0dHJpYnV0ZShlbyl9X2lzRWxlbWVudERlc2NyaWJlZEJ5TWVzc2FnZSh0LGUpe2xldCByPWlvKHQsImFyaWEtZGVzY3JpYmVkYnkiKSxvPXRoaXMuX21lc3NhZ2VSZWdpc3RyeS5nZXQoZSksYT1vJiZvLm1lc3NhZ2VFbGVtZW50LmlkO3JldHVybiEhYSYmci5pbmRleE9mKGEpIT0tMX1fY2FuQmVEZXNjcmliZWQodCxlKXtpZighdGhpcy5faXNFbGVtZW50Tm9kZSh0KSlyZXR1cm4hMTtpZihlJiZ0eXBlb2YgZT09Im9iamVjdCIpcmV0dXJuITA7bGV0IHI9ZT09bnVsbD8iIjpgJHtlfWAudHJpbSgpLG89dC5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKTtyZXR1cm4gcj8hb3x8by50cmltKCkhPT1yOiExfV9pc0VsZW1lbnROb2RlKHQpe3JldHVybiB0Lm5vZGVUeXBlPT09dGhpcy5fZG9jdW1lbnQuRUxFTUVOVF9OT0RFfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7dmFyIFgsd2U9XygoKT0+e3FlKCk7dm4oKTtmKCk7ZigpO1g9KCgpPT57Y2xhc3MgaXtjb25zdHJ1Y3Rvcigpe2woSnIpLl9hcHBseUJvZHlIaWdoQ29udHJhc3RNb2RlQ3NzQ2xhc3NlcygpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NW1vZD1SKHt0eXBlOml9KTtzdGF0aWMgXHUwMjc1aW5qPVMoe2ltcG9ydHM6W3llLHllXX0pfXJldHVybiBpfSkoKX0pO2Z1bmN0aW9uIFRmKCl7bGV0IGk9bChPKSxuPWk/aS5sb2NhdGlvbjpudWxsO3JldHVybntnZXRQYXRobmFtZTooKT0+bj9uLnBhdGhuYW1lK24uc2VhcmNoOiIifX12YXIgSWYsT2Ysa2Ysa2QsRmYsTmYsX3gsYngsUGY9XygoKT0+e2YoKTtmKCk7bnQoKTtodCgpO3NkKCk7d2UoKTtJZj1bIioiXSxPZj1uZXcgdigiTUFUX0lDT05fREVGQVVMVF9PUFRJT05TIiksa2Y9bmV3IHYoIm1hdC1pY29uLWxvY2F0aW9uIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpUZn0pO2tkPVsiY2xpcC1wYXRoIiwiY29sb3ItcHJvZmlsZSIsInNyYyIsImN1cnNvciIsImZpbGwiLCJmaWx0ZXIiLCJtYXJrZXIiLCJtYXJrZXItc3RhcnQiLCJtYXJrZXItbWlkIiwibWFya2VyLWVuZCIsIm1hc2siLCJzdHJva2UiXSxGZj1rZC5tYXAoaT0+YFske2l9XWApLmpvaW4oIiwgIiksTmY9L151cmxcKFsnIl0/IyguKj8pWyciXT9cKSQvLF94PSgoKT0+e2NsYXNzIGl7X2VsZW1lbnRSZWY9bChEKTtfaWNvblJlZ2lzdHJ5PWwoYWQpO19sb2NhdGlvbj1sKGtmKTtfZXJyb3JIYW5kbGVyPWwoemkpO19kZWZhdWx0Q29sb3I7Z2V0IGNvbG9yKCl7cmV0dXJuIHRoaXMuX2NvbG9yfHx0aGlzLl9kZWZhdWx0Q29sb3J9c2V0IGNvbG9yKHQpe3RoaXMuX2NvbG9yPXR9X2NvbG9yO2lubGluZT0hMTtnZXQgc3ZnSWNvbigpe3JldHVybiB0aGlzLl9zdmdJY29ufXNldCBzdmdJY29uKHQpe3QhPT10aGlzLl9zdmdJY29uJiYodD90aGlzLl91cGRhdGVTdmdJY29uKHQpOnRoaXMuX3N2Z0ljb24mJnRoaXMuX2NsZWFyU3ZnRWxlbWVudCgpLHRoaXMuX3N2Z0ljb249dCl9X3N2Z0ljb247Z2V0IGZvbnRTZXQoKXtyZXR1cm4gdGhpcy5fZm9udFNldH1zZXQgZm9udFNldCh0KXtsZXQgZT10aGlzLl9jbGVhbnVwRm9udFZhbHVlKHQpO2UhPT10aGlzLl9mb250U2V0JiYodGhpcy5fZm9udFNldD1lLHRoaXMuX3VwZGF0ZUZvbnRJY29uQ2xhc3NlcygpKX1fZm9udFNldDtnZXQgZm9udEljb24oKXtyZXR1cm4gdGhpcy5fZm9udEljb259c2V0IGZvbnRJY29uKHQpe2xldCBlPXRoaXMuX2NsZWFudXBGb250VmFsdWUodCk7ZSE9PXRoaXMuX2ZvbnRJY29uJiYodGhpcy5fZm9udEljb249ZSx0aGlzLl91cGRhdGVGb250SWNvbkNsYXNzZXMoKSl9X2ZvbnRJY29uO19wcmV2aW91c0ZvbnRTZXRDbGFzcz1bXTtfcHJldmlvdXNGb250SWNvbkNsYXNzO19zdmdOYW1lO19zdmdOYW1lc3BhY2U7X3ByZXZpb3VzUGF0aDtfZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzO19jdXJyZW50SWNvbkZldGNoPWZ0LkVNUFRZO2NvbnN0cnVjdG9yKCl7bGV0IHQ9bChuZXcgWG4oImFyaWEtaGlkZGVuIikse29wdGlvbmFsOiEwfSksZT1sKE9mLHtvcHRpb25hbDohMH0pO2UmJihlLmNvbG9yJiYodGhpcy5jb2xvcj10aGlzLl9kZWZhdWx0Q29sb3I9ZS5jb2xvciksZS5mb250U2V0JiYodGhpcy5mb250U2V0PWUuZm9udFNldCkpLHR8fHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpfV9zcGxpdEljb25OYW1lKHQpe2lmKCF0KXJldHVyblsiIiwiIl07bGV0IGU9dC5zcGxpdCgiOiIpO3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAxOnJldHVyblsiIixlWzBdXTtjYXNlIDI6cmV0dXJuIGU7ZGVmYXVsdDp0aHJvdyBFcnJvcihgSW52YWxpZCBpY29uIG5hbWU6ICIke3R9ImApfX1uZ09uSW5pdCgpe3RoaXMuX3VwZGF0ZUZvbnRJY29uQ2xhc3NlcygpfW5nQWZ0ZXJWaWV3Q2hlY2tlZCgpe2xldCB0PXRoaXMuX2VsZW1lbnRzV2l0aEV4dGVybmFsUmVmZXJlbmNlcztpZih0JiZ0LnNpemUpe2xldCBlPXRoaXMuX2xvY2F0aW9uLmdldFBhdGhuYW1lKCk7ZSE9PXRoaXMuX3ByZXZpb3VzUGF0aCYmKHRoaXMuX3ByZXZpb3VzUGF0aD1lLHRoaXMuX3ByZXBlbmRQYXRoVG9SZWZlcmVuY2VzKGUpKX19bmdPbkRlc3Ryb3koKXt0aGlzLl9jdXJyZW50SWNvbkZldGNoLnVuc3Vic2NyaWJlKCksdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzJiZ0aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXMuY2xlYXIoKX1fdXNpbmdGb250SWNvbigpe3JldHVybiF0aGlzLnN2Z0ljb259X3NldFN2Z0VsZW1lbnQodCl7dGhpcy5fY2xlYXJTdmdFbGVtZW50KCk7bGV0IGU9dGhpcy5fbG9jYXRpb24uZ2V0UGF0aG5hbWUoKTt0aGlzLl9wcmV2aW91c1BhdGg9ZSx0aGlzLl9jYWNoZUNoaWxkcmVuV2l0aEV4dGVybmFsUmVmZXJlbmNlcyh0KSx0aGlzLl9wcmVwZW5kUGF0aFRvUmVmZXJlbmNlcyhlKSx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodCl9X2NsZWFyU3ZnRWxlbWVudCgpe2xldCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxlPXQuY2hpbGROb2Rlcy5sZW5ndGg7Zm9yKHRoaXMuX2VsZW1lbnRzV2l0aEV4dGVybmFsUmVmZXJlbmNlcyYmdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzLmNsZWFyKCk7ZS0tOyl7bGV0IHI9dC5jaGlsZE5vZGVzW2VdOyhyLm5vZGVUeXBlIT09MXx8ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InN2ZyIpJiZyLnJlbW92ZSgpfX1fdXBkYXRlRm9udEljb25DbGFzc2VzKCl7aWYoIXRoaXMuX3VzaW5nRm9udEljb24oKSlyZXR1cm47bGV0IHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LGU9KHRoaXMuZm9udFNldD90aGlzLl9pY29uUmVnaXN0cnkuY2xhc3NOYW1lRm9yRm9udEFsaWFzKHRoaXMuZm9udFNldCkuc3BsaXQoLyArLyk6dGhpcy5faWNvblJlZ2lzdHJ5LmdldERlZmF1bHRGb250U2V0Q2xhc3MoKSkuZmlsdGVyKHI9PnIubGVuZ3RoPjApO3RoaXMuX3ByZXZpb3VzRm9udFNldENsYXNzLmZvckVhY2gocj0+dC5jbGFzc0xpc3QucmVtb3ZlKHIpKSxlLmZvckVhY2gocj0+dC5jbGFzc0xpc3QuYWRkKHIpKSx0aGlzLl9wcmV2aW91c0ZvbnRTZXRDbGFzcz1lLHRoaXMuZm9udEljb24hPT10aGlzLl9wcmV2aW91c0ZvbnRJY29uQ2xhc3MmJiFlLmluY2x1ZGVzKCJtYXQtbGlnYXR1cmUtZm9udCIpJiYodGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzJiZ0LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzKSx0aGlzLmZvbnRJY29uJiZ0LmNsYXNzTGlzdC5hZGQodGhpcy5mb250SWNvbiksdGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzPXRoaXMuZm9udEljb24pfV9jbGVhbnVwRm9udFZhbHVlKHQpe3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/dC50cmltKCkuc3BsaXQoIiAiKVswXTp0fV9wcmVwZW5kUGF0aFRvUmVmZXJlbmNlcyh0KXtsZXQgZT10aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXM7ZSYmZS5mb3JFYWNoKChyLG8pPT57ci5mb3JFYWNoKGE9PntvLnNldEF0dHJpYnV0ZShhLm5hbWUsYHVybCgnJHt0fSMke2EudmFsdWV9JylgKX0pfSl9X2NhY2hlQ2hpbGRyZW5XaXRoRXh0ZXJuYWxSZWZlcmVuY2VzKHQpe2xldCBlPXQucXVlcnlTZWxlY3RvckFsbChGZikscj10aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXM9dGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzfHxuZXcgTWFwO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKWtkLmZvckVhY2goYT0+e2xldCBzPWVbb10sYz1zLmdldEF0dHJpYnV0ZShhKSxkPWM/Yy5tYXRjaChOZik6bnVsbDtpZihkKXtsZXQgdT1yLmdldChzKTt1fHwodT1bXSxyLnNldChzLHUpKSx1LnB1c2goe25hbWU6YSx2YWx1ZTpkWzFdfSl9fSl9X3VwZGF0ZVN2Z0ljb24odCl7aWYodGhpcy5fc3ZnTmFtZXNwYWNlPW51bGwsdGhpcy5fc3ZnTmFtZT1udWxsLHRoaXMuX2N1cnJlbnRJY29uRmV0Y2gudW5zdWJzY3JpYmUoKSx0KXtsZXRbZSxyXT10aGlzLl9zcGxpdEljb25OYW1lKHQpO2UmJih0aGlzLl9zdmdOYW1lc3BhY2U9ZSksciYmKHRoaXMuX3N2Z05hbWU9ciksdGhpcy5fY3VycmVudEljb25GZXRjaD10aGlzLl9pY29uUmVnaXN0cnkuZ2V0TmFtZWRTdmdJY29uKHIsZSkucGlwZSh5dCgxKSkuc3Vic2NyaWJlKG89PnRoaXMuX3NldFN2Z0VsZW1lbnQobyksbz0+e2xldCBhPWBFcnJvciByZXRyaWV2aW5nIGljb24gJHtlfToke3J9ISAke28ubWVzc2FnZX1gO3RoaXMuX2Vycm9ySGFuZGxlci5oYW5kbGVFcnJvcihuZXcgRXJyb3IoYSkpfSl9fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWNtcD1QKHt0eXBlOmksc2VsZWN0b3JzOltbIm1hdC1pY29uIl1dLGhvc3RBdHRyczpbInJvbGUiLCJpbWciLDEsIm1hdC1pY29uIiwibm90cmFuc2xhdGUiXSxob3N0VmFyczoxMCxob3N0QmluZGluZ3M6ZnVuY3Rpb24oZSxyKXtlJjImJih0dCgiZGF0YS1tYXQtaWNvbi10eXBlIixyLl91c2luZ0ZvbnRJY29uKCk/ImZvbnQiOiJzdmciKSgiZGF0YS1tYXQtaWNvbi1uYW1lIixyLl9zdmdOYW1lfHxyLmZvbnRJY29uKSgiZGF0YS1tYXQtaWNvbi1uYW1lc3BhY2UiLHIuX3N2Z05hbWVzcGFjZXx8ci5mb250U2V0KSgiZm9udEljb24iLHIuX3VzaW5nRm9udEljb24oKT9yLmZvbnRJY29uOm51bGwpLFpuKHIuY29sb3I/Im1hdC0iK3IuY29sb3I6IiIpLEgoIm1hdC1pY29uLWlubGluZSIsci5pbmxpbmUpKCJtYXQtaWNvbi1uby1jb2xvciIsci5jb2xvciE9PSJwcmltYXJ5IiYmci5jb2xvciE9PSJhY2NlbnQiJiZyLmNvbG9yIT09Indhcm4iKSl9LGlucHV0czp7Y29sb3I6ImNvbG9yIixpbmxpbmU6WzIsImlubGluZSIsImlubGluZSIsRl0sc3ZnSWNvbjoic3ZnSWNvbiIsZm9udFNldDoiZm9udFNldCIsZm9udEljb246ImZvbnRJY29uIn0sZXhwb3J0QXM6WyJtYXRJY29uIl0sbmdDb250ZW50U2VsZWN0b3JzOklmLGRlY2xzOjEsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uKGUscil7ZSYxJiYoVHQoKSxVKDApKX0sc3R5bGVzOltgbWF0LWljb24sbWF0LWljb24ubWF0LXByaW1hcnksbWF0LWljb24ubWF0LWFjY2VudCxtYXQtaWNvbi5tYXQtd2Fybntjb2xvcjp2YXIoLS1tYXQtaWNvbi1jb2xvciwgaW5oZXJpdCl9Lm1hdC1pY29uey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtkaXNwbGF5OmlubGluZS1ibG9jaztmaWxsOmN1cnJlbnRDb2xvcjtoZWlnaHQ6MjRweDt3aWR0aDoyNHB4O292ZXJmbG93OmhpZGRlbn0ubWF0LWljb24ubWF0LWljb24taW5saW5le2ZvbnQtc2l6ZTppbmhlcml0O2hlaWdodDppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7d2lkdGg6aW5oZXJpdH0ubWF0LWljb24ubWF0LWxpZ2F0dXJlLWZvbnRbZm9udEljb25dOjpiZWZvcmV7Y29udGVudDphdHRyKGZvbnRJY29uKX1bZGlyPXJ0bF0gLm1hdC1pY29uLXJ0bC1taXJyb3J7dHJhbnNmb3JtOnNjYWxlKC0xLCAxKX0ubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb257bWFyZ2luOmF1dG99CmBdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiBpfSkoKSxieD0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NW1vZD1SKHt0eXBlOml9KTtzdGF0aWMgXHUwMjc1aW5qPVMoe2ltcG9ydHM6W1gsWF19KX1yZXR1cm4gaX0pKCl9KTtmdW5jdGlvbiBjcygpe2lmKElpKXJldHVybiBJaTtpZih0eXBlb2YgZG9jdW1lbnQhPSJvYmplY3QifHwhZG9jdW1lbnQpcmV0dXJuIElpPW5ldyBTZXQoVGQpLElpO2xldCBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7cmV0dXJuIElpPW5ldyBTZXQoVGQuZmlsdGVyKG49PihpLnNldEF0dHJpYnV0ZSgidHlwZSIsbiksaS50eXBlPT09bikpKSxJaX12YXIgSWksVGQsT2k9XygoKT0+e3NlKCk7UWEoKTtrcigpO2ZuKCk7VGQ9WyJjb2xvciIsImJ1dHRvbiIsImNoZWNrYm94IiwiZGF0ZSIsImRhdGV0aW1lLWxvY2FsIiwiZW1haWwiLCJmaWxlIiwiaGlkZGVuIiwiaW1hZ2UiLCJtb250aCIsIm51bWJlciIsInBhc3N3b3JkIiwicmFkaW8iLCJyYW5nZSIsInJlc2V0Iiwic2VhcmNoIiwic3VibWl0IiwidGVsIiwidGV4dCIsInRpbWUiLCJ1cmwiLCJ3ZWVrIl19KTtmdW5jdGlvbiBraShpKXtyZXR1cm4gaSE9bnVsbCYmYCR7aX1gIT0iZmFsc2UifWZ1bmN0aW9uIER4KGksbj0vXHMrLyl7bGV0IHQ9W107aWYoaSE9bnVsbCl7bGV0IGU9QXJyYXkuaXNBcnJheShpKT9pOmAke2l9YC5zcGxpdChuKTtmb3IobGV0IHIgb2YgZSl7bGV0IG89YCR7cn1gLnRyaW0oKTtvJiZ0LnB1c2gobyl9fXJldHVybiB0fXZhciBubz1fKCgpPT57RWkoKTtJYSgpfSk7ZnVuY3Rpb24gVmYoKXtyZXR1cm4gbChMZix7b3B0aW9uYWw6ITB9KT8uYW5pbWF0aW9uc0Rpc2FibGVkfHxsKEduLHtvcHRpb25hbDohMH0pPT09Ik5vb3BBbmltYXRpb25zIj8iZGktZGlzYWJsZWQiOihGZD8/PWwoV3IpLm1hdGNoTWVkaWEoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uKSIpLm1hdGNoZXMsRmQ/InJlZHVjZWQtbW90aW9uIjoiZW5hYmxlZCIpfWZ1bmN0aW9uIEd0KCl7cmV0dXJuIFZmKCkhPT0iZW5hYmxlZCJ9dmFyIExmLEZkLFRpPV8oKCk9PntaYSgpO2YoKTtMZj1uZXcgdigiTUFURVJJQUxfQU5JTUFUSU9OUyIpLEZkPW51bGx9KTtmdW5jdGlvbiB6ZihpLG4sdCl7bGV0IGU9TWF0aC5tYXgoTWF0aC5hYnMoaS10LmxlZnQpLE1hdGguYWJzKGktdC5yaWdodCkpLHI9TWF0aC5tYXgoTWF0aC5hYnMobi10LnRvcCksTWF0aC5hYnMobi10LmJvdHRvbSkpO3JldHVybiBNYXRoLnNxcnQoZSplK3Iqcil9dmFyIHp0LGRzLE5kLHVzLE1uLGpmLFBkLExkLFZkLEJmLEluLGhzLCR4LGpkPV8oKCk9PntPaSgpO2YoKTtmKCk7cWUoKTtubygpO0FuKCk7VGkoKTt6dD0oZnVuY3Rpb24oaSl7cmV0dXJuIGlbaS5GQURJTkdfSU49MF09IkZBRElOR19JTiIsaVtpLlZJU0lCTEU9MV09IlZJU0lCTEUiLGlbaS5GQURJTkdfT1VUPTJdPSJGQURJTkdfT1VUIixpW2kuSElEREVOPTNdPSJISURERU4iLGl9KSh6dHx8e30pLGRzPWNsYXNze19yZW5kZXJlcjtlbGVtZW50O2NvbmZpZztfYW5pbWF0aW9uRm9yY2libHlEaXNhYmxlZFRocm91Z2hDc3M7c3RhdGU9enQuSElEREVOO2NvbnN0cnVjdG9yKG4sdCxlLHI9ITEpe3RoaXMuX3JlbmRlcmVyPW4sdGhpcy5lbGVtZW50PXQsdGhpcy5jb25maWc9ZSx0aGlzLl9hbmltYXRpb25Gb3JjaWJseURpc2FibGVkVGhyb3VnaENzcz1yfWZhZGVPdXQoKXt0aGlzLl9yZW5kZXJlci5mYWRlT3V0UmlwcGxlKHRoaXMpfX0sTmQ9QWkoe3Bhc3NpdmU6ITAsY2FwdHVyZTohMH0pLHVzPWNsYXNze19ldmVudHM9bmV3IE1hcDthZGRIYW5kbGVyKG4sdCxlLHIpe2xldCBvPXRoaXMuX2V2ZW50cy5nZXQodCk7aWYobyl7bGV0IGE9by5nZXQoZSk7YT9hLmFkZChyKTpvLnNldChlLG5ldyBTZXQoW3JdKSl9ZWxzZSB0aGlzLl9ldmVudHMuc2V0KHQsbmV3IE1hcChbW2UsbmV3IFNldChbcl0pXV0pKSxuLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0LHRoaXMuX2RlbGVnYXRlRXZlbnRIYW5kbGVyLE5kKX0pfXJlbW92ZUhhbmRsZXIobix0LGUpe2xldCByPXRoaXMuX2V2ZW50cy5nZXQobik7aWYoIXIpcmV0dXJuO2xldCBvPXIuZ2V0KHQpO28mJihvLmRlbGV0ZShlKSxvLnNpemU9PT0wJiZyLmRlbGV0ZSh0KSxyLnNpemU9PT0wJiYodGhpcy5fZXZlbnRzLmRlbGV0ZShuKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKG4sdGhpcy5fZGVsZWdhdGVFdmVudEhhbmRsZXIsTmQpKSl9X2RlbGVnYXRlRXZlbnRIYW5kbGVyPW49PntsZXQgdD14dChuKTt0JiZ0aGlzLl9ldmVudHMuZ2V0KG4udHlwZSk/LmZvckVhY2goKGUscik9Pnsocj09PXR8fHIuY29udGFpbnModCkpJiZlLmZvckVhY2gobz0+by5oYW5kbGVFdmVudChuKSl9KX19LE1uPXtlbnRlckR1cmF0aW9uOjIyNSxleGl0RHVyYXRpb246MTUwfSxqZj04MDAsUGQ9QWkoe3Bhc3NpdmU6ITAsY2FwdHVyZTohMH0pLExkPVsibW91c2Vkb3duIiwidG91Y2hzdGFydCJdLFZkPVsibW91c2V1cCIsIm1vdXNlbGVhdmUiLCJ0b3VjaGVuZCIsInRvdWNoY2FuY2VsIl0sQmY9KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVjbXA9UCh7dHlwZTppLHNlbGVjdG9yczpbWyJuZy1jb21wb25lbnQiXV0saG9zdEF0dHJzOlsibWF0LXJpcHBsZS1zdHlsZS1sb2FkZXIiLCIiXSxkZWNsczowLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbihlLHIpe30sc3R5bGVzOltgLm1hdC1yaXBwbGV7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVke292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudHtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZTNkKDAsIDAsIDApO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXJpcHBsZS1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMTAlLCB0cmFuc3BhcmVudCkpfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtcmlwcGxlLWVsZW1lbnR7ZGlzcGxheTpub25lfX0uY2RrLWRyYWctcHJldmlldyAubWF0LXJpcHBsZS1lbGVtZW50LC5jZGstZHJhZy1wbGFjZWhvbGRlciAubWF0LXJpcHBsZS1lbGVtZW50e2Rpc3BsYXk6bm9uZX0KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIGl9KSgpLEluPWNsYXNzIGl7X3RhcmdldDtfbmdab25lO19wbGF0Zm9ybTtfY29udGFpbmVyRWxlbWVudDtfdHJpZ2dlckVsZW1lbnQ7X2lzUG9pbnRlckRvd249ITE7X2FjdGl2ZVJpcHBsZXM9bmV3IE1hcDtfbW9zdFJlY2VudFRyYW5zaWVudFJpcHBsZTtfbGFzdFRvdWNoU3RhcnRFdmVudDtfcG9pbnRlclVwRXZlbnRzUmVnaXN0ZXJlZD0hMTtfY29udGFpbmVyUmVjdDtzdGF0aWMgX2V2ZW50TWFuYWdlcj1uZXcgdXM7Y29uc3RydWN0b3Iobix0LGUscixvKXt0aGlzLl90YXJnZXQ9bix0aGlzLl9uZ1pvbmU9dCx0aGlzLl9wbGF0Zm9ybT1yLHIuaXNCcm93c2VyJiYodGhpcy5fY29udGFpbmVyRWxlbWVudD13dChlKSksbyYmby5nZXQoTXQpLmxvYWQoQmYpfWZhZGVJblJpcHBsZShuLHQsZT17fSl7bGV0IHI9dGhpcy5fY29udGFpbmVyUmVjdD10aGlzLl9jb250YWluZXJSZWN0fHx0aGlzLl9jb250YWluZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89aChoKHt9LE1uKSxlLmFuaW1hdGlvbik7ZS5jZW50ZXJlZCYmKG49ci5sZWZ0K3Iud2lkdGgvMix0PXIudG9wK3IuaGVpZ2h0LzIpO2xldCBhPWUucmFkaXVzfHx6ZihuLHQscikscz1uLXIubGVmdCxjPXQtci50b3AsZD1vLmVudGVyRHVyYXRpb24sdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt1LmNsYXNzTGlzdC5hZGQoIm1hdC1yaXBwbGUtZWxlbWVudCIpLHUuc3R5bGUubGVmdD1gJHtzLWF9cHhgLHUuc3R5bGUudG9wPWAke2MtYX1weGAsdS5zdHlsZS5oZWlnaHQ9YCR7YSoyfXB4YCx1LnN0eWxlLndpZHRoPWAke2EqMn1weGAsZS5jb2xvciE9bnVsbCYmKHUuc3R5bGUuYmFja2dyb3VuZENvbG9yPWUuY29sb3IpLHUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWAke2R9bXNgLHRoaXMuX2NvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodSk7bGV0IHg9d2luZG93LmdldENvbXB1dGVkU3R5bGUodSksaj14LnRyYW5zaXRpb25Qcm9wZXJ0eSxCPXgudHJhbnNpdGlvbkR1cmF0aW9uLEk9aj09PSJub25lInx8Qj09PSIwcyJ8fEI9PT0iMHMsIDBzInx8ci53aWR0aD09PTAmJnIuaGVpZ2h0PT09MCxWPW5ldyBkcyh0aGlzLHUsZSxJKTt1LnN0eWxlLnRyYW5zZm9ybT0ic2NhbGUzZCgxLCAxLCAxKSIsVi5zdGF0ZT16dC5GQURJTkdfSU4sZS5wZXJzaXN0ZW50fHwodGhpcy5fbW9zdFJlY2VudFRyYW5zaWVudFJpcHBsZT1WKTtsZXQgYnQ9bnVsbDtyZXR1cm4hSSYmKGR8fG8uZXhpdER1cmF0aW9uKSYmdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57bGV0IFllPSgpPT57YnQmJihidC5mYWxsYmFja1RpbWVyPW51bGwpLGNsZWFyVGltZW91dChEZSksdGhpcy5fZmluaXNoUmlwcGxlVHJhbnNpdGlvbihWKX0sVmk9KCk9PnRoaXMuX2Rlc3Ryb3lSaXBwbGUoViksRGU9c2V0VGltZW91dChWaSxkKzEwMCk7dS5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uZW5kIixZZSksdS5hZGRFdmVudExpc3RlbmVyKCJ0cmFuc2l0aW9uY2FuY2VsIixWaSksYnQ9e29uVHJhbnNpdGlvbkVuZDpZZSxvblRyYW5zaXRpb25DYW5jZWw6VmksZmFsbGJhY2tUaW1lcjpEZX19KSx0aGlzLl9hY3RpdmVSaXBwbGVzLnNldChWLGJ0KSwoSXx8IWQpJiZ0aGlzLl9maW5pc2hSaXBwbGVUcmFuc2l0aW9uKFYpLFZ9ZmFkZU91dFJpcHBsZShuKXtpZihuLnN0YXRlPT09enQuRkFESU5HX09VVHx8bi5zdGF0ZT09PXp0LkhJRERFTilyZXR1cm47bGV0IHQ9bi5lbGVtZW50LGU9aChoKHt9LE1uKSxuLmNvbmZpZy5hbmltYXRpb24pO3Quc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWAke2UuZXhpdER1cmF0aW9ufW1zYCx0LnN0eWxlLm9wYWNpdHk9IjAiLG4uc3RhdGU9enQuRkFESU5HX09VVCwobi5fYW5pbWF0aW9uRm9yY2libHlEaXNhYmxlZFRocm91Z2hDc3N8fCFlLmV4aXREdXJhdGlvbikmJnRoaXMuX2ZpbmlzaFJpcHBsZVRyYW5zaXRpb24obil9ZmFkZU91dEFsbCgpe3RoaXMuX2dldEFjdGl2ZVJpcHBsZXMoKS5mb3JFYWNoKG49Pm4uZmFkZU91dCgpKX1mYWRlT3V0QWxsTm9uUGVyc2lzdGVudCgpe3RoaXMuX2dldEFjdGl2ZVJpcHBsZXMoKS5mb3JFYWNoKG49PntuLmNvbmZpZy5wZXJzaXN0ZW50fHxuLmZhZGVPdXQoKX0pfXNldHVwVHJpZ2dlckV2ZW50cyhuKXtsZXQgdD13dChuKTshdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyfHwhdHx8dD09PXRoaXMuX3RyaWdnZXJFbGVtZW50fHwodGhpcy5fcmVtb3ZlVHJpZ2dlckV2ZW50cygpLHRoaXMuX3RyaWdnZXJFbGVtZW50PXQsTGQuZm9yRWFjaChlPT57aS5fZXZlbnRNYW5hZ2VyLmFkZEhhbmRsZXIodGhpcy5fbmdab25lLGUsdCx0aGlzKX0pKX1oYW5kbGVFdmVudChuKXtuLnR5cGU9PT0ibW91c2Vkb3duIj90aGlzLl9vbk1vdXNlZG93bihuKTpuLnR5cGU9PT0idG91Y2hzdGFydCI/dGhpcy5fb25Ub3VjaFN0YXJ0KG4pOnRoaXMuX29uUG9pbnRlclVwKCksdGhpcy5fcG9pbnRlclVwRXZlbnRzUmVnaXN0ZXJlZHx8KHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e1ZkLmZvckVhY2godD0+e3RoaXMuX3RyaWdnZXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodCx0aGlzLFBkKX0pfSksdGhpcy5fcG9pbnRlclVwRXZlbnRzUmVnaXN0ZXJlZD0hMCl9X2ZpbmlzaFJpcHBsZVRyYW5zaXRpb24obil7bi5zdGF0ZT09PXp0LkZBRElOR19JTj90aGlzLl9zdGFydEZhZGVPdXRUcmFuc2l0aW9uKG4pOm4uc3RhdGU9PT16dC5GQURJTkdfT1VUJiZ0aGlzLl9kZXN0cm95UmlwcGxlKG4pfV9zdGFydEZhZGVPdXRUcmFuc2l0aW9uKG4pe2xldCB0PW49PT10aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlLHtwZXJzaXN0ZW50OmV9PW4uY29uZmlnO24uc3RhdGU9enQuVklTSUJMRSwhZSYmKCF0fHwhdGhpcy5faXNQb2ludGVyRG93bikmJm4uZmFkZU91dCgpfV9kZXN0cm95UmlwcGxlKG4pe2xldCB0PXRoaXMuX2FjdGl2ZVJpcHBsZXMuZ2V0KG4pPz9udWxsO3RoaXMuX2FjdGl2ZVJpcHBsZXMuZGVsZXRlKG4pLHRoaXMuX2FjdGl2ZVJpcHBsZXMuc2l6ZXx8KHRoaXMuX2NvbnRhaW5lclJlY3Q9bnVsbCksbj09PXRoaXMuX21vc3RSZWNlbnRUcmFuc2llbnRSaXBwbGUmJih0aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlPW51bGwpLG4uc3RhdGU9enQuSElEREVOLHQhPT1udWxsJiYobi5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLHQub25UcmFuc2l0aW9uRW5kKSxuLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmNhbmNlbCIsdC5vblRyYW5zaXRpb25DYW5jZWwpLHQuZmFsbGJhY2tUaW1lciE9PW51bGwmJmNsZWFyVGltZW91dCh0LmZhbGxiYWNrVGltZXIpKSxuLmVsZW1lbnQucmVtb3ZlKCl9X29uTW91c2Vkb3duKG4pe2xldCB0PUVuKG4pLGU9dGhpcy5fbGFzdFRvdWNoU3RhcnRFdmVudCYmRGF0ZS5ub3coKTx0aGlzLl9sYXN0VG91Y2hTdGFydEV2ZW50K2pmOyF0aGlzLl90YXJnZXQucmlwcGxlRGlzYWJsZWQmJiF0JiYhZSYmKHRoaXMuX2lzUG9pbnRlckRvd249ITAsdGhpcy5mYWRlSW5SaXBwbGUobi5jbGllbnRYLG4uY2xpZW50WSx0aGlzLl90YXJnZXQucmlwcGxlQ29uZmlnKSl9X29uVG91Y2hTdGFydChuKXtpZighdGhpcy5fdGFyZ2V0LnJpcHBsZURpc2FibGVkJiYhU24obikpe3RoaXMuX2xhc3RUb3VjaFN0YXJ0RXZlbnQ9RGF0ZS5ub3coKSx0aGlzLl9pc1BvaW50ZXJEb3duPSEwO2xldCB0PW4uY2hhbmdlZFRvdWNoZXM7aWYodClmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0aGlzLmZhZGVJblJpcHBsZSh0W2VdLmNsaWVudFgsdFtlXS5jbGllbnRZLHRoaXMuX3RhcmdldC5yaXBwbGVDb25maWcpfX1fb25Qb2ludGVyVXAoKXt0aGlzLl9pc1BvaW50ZXJEb3duJiYodGhpcy5faXNQb2ludGVyRG93bj0hMSx0aGlzLl9nZXRBY3RpdmVSaXBwbGVzKCkuZm9yRWFjaChuPT57bGV0IHQ9bi5zdGF0ZT09PXp0LlZJU0lCTEV8fG4uY29uZmlnLnRlcm1pbmF0ZU9uUG9pbnRlclVwJiZuLnN0YXRlPT09enQuRkFESU5HX0lOOyFuLmNvbmZpZy5wZXJzaXN0ZW50JiZ0JiZuLmZhZGVPdXQoKX0pKX1fZ2V0QWN0aXZlUmlwcGxlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuX2FjdGl2ZVJpcHBsZXMua2V5cygpKX1fcmVtb3ZlVHJpZ2dlckV2ZW50cygpe2xldCBuPXRoaXMuX3RyaWdnZXJFbGVtZW50O24mJihMZC5mb3JFYWNoKHQ9PmkuX2V2ZW50TWFuYWdlci5yZW1vdmVIYW5kbGVyKHQsbix0aGlzKSksdGhpcy5fcG9pbnRlclVwRXZlbnRzUmVnaXN0ZXJlZCYmKFZkLmZvckVhY2godD0+bi5yZW1vdmVFdmVudExpc3RlbmVyKHQsdGhpcyxQZCkpLHRoaXMuX3BvaW50ZXJVcEV2ZW50c1JlZ2lzdGVyZWQ9ITEpKX19O2hzPW5ldyB2KCJtYXQtcmlwcGxlLWdsb2JhbC1vcHRpb25zIiksJHg9KCgpPT57Y2xhc3MgaXtfZWxlbWVudFJlZj1sKEQpO19hbmltYXRpb25zRGlzYWJsZWQ9R3QoKTtjb2xvcjt1bmJvdW5kZWQ7Y2VudGVyZWQ7cmFkaXVzPTA7YW5pbWF0aW9uO2dldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dCYmdGhpcy5mYWRlT3V0QWxsTm9uUGVyc2lzdGVudCgpLHRoaXMuX2Rpc2FibGVkPXQsdGhpcy5fc2V0dXBUcmlnZ2VyRXZlbnRzSWZFbmFibGVkKCl9X2Rpc2FibGVkPSExO2dldCB0cmlnZ2VyKCl7cmV0dXJuIHRoaXMuX3RyaWdnZXJ8fHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudH1zZXQgdHJpZ2dlcih0KXt0aGlzLl90cmlnZ2VyPXQsdGhpcy5fc2V0dXBUcmlnZ2VyRXZlbnRzSWZFbmFibGVkKCl9X3RyaWdnZXI7X3JpcHBsZVJlbmRlcmVyO19nbG9iYWxPcHRpb25zO19pc0luaXRpYWxpemVkPSExO2NvbnN0cnVjdG9yKCl7bGV0IHQ9bChFKSxlPWwoVCkscj1sKGhzLHtvcHRpb25hbDohMH0pLG89bChOKTt0aGlzLl9nbG9iYWxPcHRpb25zPXJ8fHt9LHRoaXMuX3JpcHBsZVJlbmRlcmVyPW5ldyBJbih0aGlzLHQsdGhpcy5fZWxlbWVudFJlZixlLG8pfW5nT25Jbml0KCl7dGhpcy5faXNJbml0aWFsaXplZD0hMCx0aGlzLl9zZXR1cFRyaWdnZXJFdmVudHNJZkVuYWJsZWQoKX1uZ09uRGVzdHJveSgpe3RoaXMuX3JpcHBsZVJlbmRlcmVyLl9yZW1vdmVUcmlnZ2VyRXZlbnRzKCl9ZmFkZU91dEFsbCgpe3RoaXMuX3JpcHBsZVJlbmRlcmVyLmZhZGVPdXRBbGwoKX1mYWRlT3V0QWxsTm9uUGVyc2lzdGVudCgpe3RoaXMuX3JpcHBsZVJlbmRlcmVyLmZhZGVPdXRBbGxOb25QZXJzaXN0ZW50KCl9Z2V0IHJpcHBsZUNvbmZpZygpe3JldHVybntjZW50ZXJlZDp0aGlzLmNlbnRlcmVkLHJhZGl1czp0aGlzLnJhZGl1cyxjb2xvcjp0aGlzLmNvbG9yLGFuaW1hdGlvbjpoKGgoaCh7fSx0aGlzLl9nbG9iYWxPcHRpb25zLmFuaW1hdGlvbiksdGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkP3tlbnRlckR1cmF0aW9uOjAsZXhpdER1cmF0aW9uOjB9Ont9KSx0aGlzLmFuaW1hdGlvbiksdGVybWluYXRlT25Qb2ludGVyVXA6dGhpcy5fZ2xvYmFsT3B0aW9ucy50ZXJtaW5hdGVPblBvaW50ZXJVcH19Z2V0IHJpcHBsZURpc2FibGVkKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCEhdGhpcy5fZ2xvYmFsT3B0aW9ucy5kaXNhYmxlZH1fc2V0dXBUcmlnZ2VyRXZlbnRzSWZFbmFibGVkKCl7IXRoaXMuZGlzYWJsZWQmJnRoaXMuX2lzSW5pdGlhbGl6ZWQmJnRoaXMuX3JpcHBsZVJlbmRlcmVyLnNldHVwVHJpZ2dlckV2ZW50cyh0aGlzLnRyaWdnZXIpfWxhdW5jaCh0LGU9MCxyKXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiP3RoaXMuX3JpcHBsZVJlbmRlcmVyLmZhZGVJblJpcHBsZSh0LGUsaChoKHt9LHRoaXMucmlwcGxlQ29uZmlnKSxyKSk6dGhpcy5fcmlwcGxlUmVuZGVyZXIuZmFkZUluUmlwcGxlKDAsMCxoKGgoe30sdGhpcy5yaXBwbGVDb25maWcpLHQpKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyIiLCJtYXQtcmlwcGxlIiwiIl0sWyIiLCJtYXRSaXBwbGUiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtcmlwcGxlIl0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24oZSxyKXtlJjImJkgoIm1hdC1yaXBwbGUtdW5ib3VuZGVkIixyLnVuYm91bmRlZCl9LGlucHV0czp7Y29sb3I6WzAsIm1hdFJpcHBsZUNvbG9yIiwiY29sb3IiXSx1bmJvdW5kZWQ6WzAsIm1hdFJpcHBsZVVuYm91bmRlZCIsInVuYm91bmRlZCJdLGNlbnRlcmVkOlswLCJtYXRSaXBwbGVDZW50ZXJlZCIsImNlbnRlcmVkIl0scmFkaXVzOlswLCJtYXRSaXBwbGVSYWRpdXMiLCJyYWRpdXMiXSxhbmltYXRpb246WzAsIm1hdFJpcHBsZUFuaW1hdGlvbiIsImFuaW1hdGlvbiJdLGRpc2FibGVkOlswLCJtYXRSaXBwbGVEaXNhYmxlZCIsImRpc2FibGVkIl0sdHJpZ2dlcjpbMCwibWF0UmlwcGxlVHJpZ2dlciIsInRyaWdnZXIiXX0sZXhwb3J0QXM6WyJtYXRSaXBwbGUiXX0pfXJldHVybiBpfSkoKX0pO3ZhciBCZCx6ZD1fKCgpPT57ZigpO3dlKCk7QmQ9KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVtb2Q9Uih7dHlwZTppfSk7c3RhdGljIFx1MDI3NWluaj1TKHtpbXBvcnRzOltYLFhdfSl9cmV0dXJuIGl9KSgpfSk7dmFyIFVmLEhmLG1zLGZzLFVkLHJvLEhkLCRkPV8oKCk9PntmKCk7ZigpO09pKCk7VGkoKTtqZCgpO1VmPXtjYXB0dXJlOiEwfSxIZj1bImZvY3VzIiwibW91c2Vkb3duIiwibW91c2VlbnRlciIsInRvdWNoc3RhcnQiXSxtcz0ibWF0LXJpcHBsZS1sb2FkZXItdW5pbml0aWFsaXplZCIsZnM9Im1hdC1yaXBwbGUtbG9hZGVyLWNsYXNzLW5hbWUiLFVkPSJtYXQtcmlwcGxlLWxvYWRlci1jZW50ZXJlZCIscm89Im1hdC1yaXBwbGUtbG9hZGVyLWRpc2FibGVkIixIZD0oKCk9PntjbGFzcyBpe19kb2N1bWVudD1sKE8pO19hbmltYXRpb25zRGlzYWJsZWQ9R3QoKTtfZ2xvYmFsUmlwcGxlT3B0aW9ucz1sKGhzLHtvcHRpb25hbDohMH0pO19wbGF0Zm9ybT1sKFQpO19uZ1pvbmU9bChFKTtfaW5qZWN0b3I9bChOKTtfZXZlbnRDbGVhbnVwcztfaG9zdHM9bmV3IE1hcDtjb25zdHJ1Y3Rvcigpe2xldCB0PWwoa3QpLmNyZWF0ZVJlbmRlcmVyKG51bGwsbnVsbCk7dGhpcy5fZXZlbnRDbGVhbnVwcz10aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PkhmLm1hcChlPT50Lmxpc3Rlbih0aGlzLl9kb2N1bWVudCxlLHRoaXMuX29uSW50ZXJhY3Rpb24sVWYpKSl9bmdPbkRlc3Ryb3koKXtsZXQgdD10aGlzLl9ob3N0cy5rZXlzKCk7Zm9yKGxldCBlIG9mIHQpdGhpcy5kZXN0cm95UmlwcGxlKGUpO3RoaXMuX2V2ZW50Q2xlYW51cHMuZm9yRWFjaChlPT5lKCkpfWNvbmZpZ3VyZVJpcHBsZSh0LGUpe3Quc2V0QXR0cmlidXRlKG1zLHRoaXMuX2dsb2JhbFJpcHBsZU9wdGlvbnM/Lm5hbWVzcGFjZT8/IiIpLChlLmNsYXNzTmFtZXx8IXQuaGFzQXR0cmlidXRlKGZzKSkmJnQuc2V0QXR0cmlidXRlKGZzLGUuY2xhc3NOYW1lfHwiIiksZS5jZW50ZXJlZCYmdC5zZXRBdHRyaWJ1dGUoVWQsIiIpLGUuZGlzYWJsZWQmJnQuc2V0QXR0cmlidXRlKHJvLCIiKX1zZXREaXNhYmxlZCh0LGUpe2xldCByPXRoaXMuX2hvc3RzLmdldCh0KTtyPyhyLnRhcmdldC5yaXBwbGVEaXNhYmxlZD1lLCFlJiYhci5oYXNTZXRVcEV2ZW50cyYmKHIuaGFzU2V0VXBFdmVudHM9ITAsci5yZW5kZXJlci5zZXR1cFRyaWdnZXJFdmVudHModCkpKTplP3Quc2V0QXR0cmlidXRlKHJvLCIiKTp0LnJlbW92ZUF0dHJpYnV0ZShybyl9X29uSW50ZXJhY3Rpb249dD0+e2xldCBlPXh0KHQpO2lmKGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCl7bGV0IHI9ZS5jbG9zZXN0KGBbJHttc309IiR7dGhpcy5fZ2xvYmFsUmlwcGxlT3B0aW9ucz8ubmFtZXNwYWNlPz8iIn0iXWApO3ImJnRoaXMuX2NyZWF0ZVJpcHBsZShyKX19O19jcmVhdGVSaXBwbGUodCl7aWYoIXRoaXMuX2RvY3VtZW50fHx0aGlzLl9ob3N0cy5oYXModCkpcmV0dXJuO3QucXVlcnlTZWxlY3RvcigiLm1hdC1yaXBwbGUiKT8ucmVtb3ZlKCk7bGV0IGU9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2UuY2xhc3NMaXN0LmFkZCgibWF0LXJpcHBsZSIsdC5nZXRBdHRyaWJ1dGUoZnMpKSx0LmFwcGVuZChlKTtsZXQgcj10aGlzLl9nbG9iYWxSaXBwbGVPcHRpb25zLG89dGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkPzA6cj8uYW5pbWF0aW9uPy5lbnRlckR1cmF0aW9uPz9Nbi5lbnRlckR1cmF0aW9uLGE9dGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkPzA6cj8uYW5pbWF0aW9uPy5leGl0RHVyYXRpb24/P01uLmV4aXREdXJhdGlvbixzPXtyaXBwbGVEaXNhYmxlZDp0aGlzLl9hbmltYXRpb25zRGlzYWJsZWR8fHI/LmRpc2FibGVkfHx0Lmhhc0F0dHJpYnV0ZShybykscmlwcGxlQ29uZmlnOntjZW50ZXJlZDp0Lmhhc0F0dHJpYnV0ZShVZCksdGVybWluYXRlT25Qb2ludGVyVXA6cj8udGVybWluYXRlT25Qb2ludGVyVXAsYW5pbWF0aW9uOntlbnRlckR1cmF0aW9uOm8sZXhpdER1cmF0aW9uOmF9fX0sYz1uZXcgSW4ocyx0aGlzLl9uZ1pvbmUsZSx0aGlzLl9wbGF0Zm9ybSx0aGlzLl9pbmplY3RvciksZD0hcy5yaXBwbGVEaXNhYmxlZDtkJiZjLnNldHVwVHJpZ2dlckV2ZW50cyh0KSx0aGlzLl9ob3N0cy5zZXQodCx7dGFyZ2V0OnMscmVuZGVyZXI6YyxoYXNTZXRVcEV2ZW50czpkfSksdC5yZW1vdmVBdHRyaWJ1dGUobXMpfWRlc3Ryb3lSaXBwbGUodCl7bGV0IGU9dGhpcy5faG9zdHMuZ2V0KHQpO2UmJihlLnJlbmRlcmVyLl9yZW1vdmVUcmlnZ2VyRXZlbnRzKCksdGhpcy5faG9zdHMuZGVsZXRlKHQpKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKX0pO3ZhciBXZCxHZD1fKCgpPT57ZigpO1dkPSgoKT0+e2NsYXNzIGl7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1Y21wPVAoe3R5cGU6aSxzZWxlY3RvcnM6W1sic3RydWN0dXJhbC1zdHlsZXMiXV0sZGVjbHM6MCx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24oZSxyKXt9LHN0eWxlczpbYC5tYXQtZm9jdXMtaW5kaWNhdG9ye3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O3BvaW50ZXItZXZlbnRzOm5vbmU7ZGlzcGxheTp2YXIoLS1tYXQtZm9jdXMtaW5kaWNhdG9yLWRpc3BsYXksIG5vbmUpO2JvcmRlci13aWR0aDp2YXIoLS1tYXQtZm9jdXMtaW5kaWNhdG9yLWJvcmRlci13aWR0aCwgM3B4KTtib3JkZXItc3R5bGU6dmFyKC0tbWF0LWZvY3VzLWluZGljYXRvci1ib3JkZXItc3R5bGUsIHNvbGlkKTtib3JkZXItY29sb3I6dmFyKC0tbWF0LWZvY3VzLWluZGljYXRvci1ib3JkZXItY29sb3IsIHRyYW5zcGFyZW50KTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1mb2N1cy1pbmRpY2F0b3ItYm9yZGVyLXJhZGl1cywgNHB4KX0ubWF0LWZvY3VzLWluZGljYXRvcjpmb2N1czo6YmVmb3Jle2NvbnRlbnQ6IiJ9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7aHRtbHstLW1hdC1mb2N1cy1pbmRpY2F0b3ItZGlzcGxheTogYmxvY2t9fQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gaX0pKCl9KTtmdW5jdGlvbiBxZChpKXtyZXR1cm4gaT09bnVsbD92b2lkIDA6bWwoaSl9dmFyICRmLFdmLEdmLHBzLHFmLFlkPV8oKCk9PntmKCk7ZigpO3FlKCk7QW4oKTskZCgpO0dkKCk7VGkoKTskZj1bIm1hdC1pY29uLWJ1dHRvbiIsIiJdLFdmPVsiKiJdLEdmPW5ldyB2KCJNQVRfQlVUVE9OX0NPTkZJRyIpO3BzPSgoKT0+e2NsYXNzIGl7X2VsZW1lbnRSZWY9bChEKTtfbmdab25lPWwoRSk7X2FuaW1hdGlvbnNEaXNhYmxlZD1HdCgpO19jb25maWc9bChHZix7b3B0aW9uYWw6ITB9KTtfZm9jdXNNb25pdG9yPWwoS3IpO19jbGVhbnVwQ2xpY2s7X3JlbmRlcmVyPWwobHQpO19yaXBwbGVMb2FkZXI9bChIZCk7X2lzQW5jaG9yO19pc0ZhYj0hMTtjb2xvcjtnZXQgZGlzYWJsZVJpcHBsZSgpe3JldHVybiB0aGlzLl9kaXNhYmxlUmlwcGxlfXNldCBkaXNhYmxlUmlwcGxlKHQpe3RoaXMuX2Rpc2FibGVSaXBwbGU9dCx0aGlzLl91cGRhdGVSaXBwbGVEaXNhYmxlZCgpfV9kaXNhYmxlUmlwcGxlPSExO2dldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9dCx0aGlzLl91cGRhdGVSaXBwbGVEaXNhYmxlZCgpfV9kaXNhYmxlZD0hMTthcmlhRGlzYWJsZWQ7ZGlzYWJsZWRJbnRlcmFjdGl2ZTt0YWJJbmRleDtzZXQgX3RhYmluZGV4KHQpe3RoaXMudGFiSW5kZXg9dH1jb25zdHJ1Y3Rvcigpe2woTXQpLmxvYWQoV2QpO2xldCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDt0aGlzLl9pc0FuY2hvcj10LnRhZ05hbWU9PT0iQSIsdGhpcy5kaXNhYmxlZEludGVyYWN0aXZlPXRoaXMuX2NvbmZpZz8uZGlzYWJsZWRJbnRlcmFjdGl2ZT8/ITEsdGhpcy5jb2xvcj10aGlzLl9jb25maWc/LmNvbG9yPz9udWxsLHRoaXMuX3JpcHBsZUxvYWRlcj8uY29uZmlndXJlUmlwcGxlKHQse2NsYXNzTmFtZToibWF0LW1kYy1idXR0b24tcmlwcGxlIn0pfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsITApLHRoaXMuX2lzQW5jaG9yJiZ0aGlzLl9zZXR1cEFzQW5jaG9yKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9jbGVhbnVwQ2xpY2s/LigpLHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKSx0aGlzLl9yaXBwbGVMb2FkZXI/LmRlc3Ryb3lSaXBwbGUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KX1mb2N1cyh0PSJwcm9ncmFtIixlKXt0P3RoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsdCxlKTp0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoZSl9X2dldEFyaWFEaXNhYmxlZCgpe3JldHVybiB0aGlzLmFyaWFEaXNhYmxlZCE9bnVsbD90aGlzLmFyaWFEaXNhYmxlZDp0aGlzLl9pc0FuY2hvcj90aGlzLmRpc2FibGVkfHxudWxsOnRoaXMuZGlzYWJsZWQmJnRoaXMuZGlzYWJsZWRJbnRlcmFjdGl2ZT8hMDpudWxsfV9nZXREaXNhYmxlZEF0dHJpYnV0ZSgpe3JldHVybiB0aGlzLmRpc2FibGVkSW50ZXJhY3RpdmV8fCF0aGlzLmRpc2FibGVkP251bGw6ITB9X3VwZGF0ZVJpcHBsZURpc2FibGVkKCl7dGhpcy5fcmlwcGxlTG9hZGVyPy5zZXREaXNhYmxlZCh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsdGhpcy5kaXNhYmxlUmlwcGxlfHx0aGlzLmRpc2FibGVkKX1fZ2V0VGFiSW5kZXgoKXtyZXR1cm4gdGhpcy5faXNBbmNob3I/dGhpcy5kaXNhYmxlZCYmIXRoaXMuZGlzYWJsZWRJbnRlcmFjdGl2ZT8tMTp0aGlzLnRhYkluZGV4OnRoaXMudGFiSW5kZXh9X3NldHVwQXNBbmNob3IoKXt0aGlzLl9jbGVhbnVwQ2xpY2s9dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT50aGlzLl9yZW5kZXJlci5saXN0ZW4odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCJjbGljayIsdD0+e3RoaXMuZGlzYWJsZWQmJih0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSl9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtYnV0dG9uLWJhc2UiXSxob3N0VmFyczoxMyxob3N0QmluZGluZ3M6ZnVuY3Rpb24oZSxyKXtlJjImJih0dCgiZGlzYWJsZWQiLHIuX2dldERpc2FibGVkQXR0cmlidXRlKCkpKCJhcmlhLWRpc2FibGVkIixyLl9nZXRBcmlhRGlzYWJsZWQoKSkoInRhYmluZGV4IixyLl9nZXRUYWJJbmRleCgpKSxabihyLmNvbG9yPyJtYXQtIityLmNvbG9yOiIiKSxIKCJtYXQtbWRjLWJ1dHRvbi1kaXNhYmxlZCIsci5kaXNhYmxlZCkoIm1hdC1tZGMtYnV0dG9uLWRpc2FibGVkLWludGVyYWN0aXZlIixyLmRpc2FibGVkSW50ZXJhY3RpdmUpKCJtYXQtdW50aGVtZWQiLCFyLmNvbG9yKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLHIuX2FuaW1hdGlvbnNEaXNhYmxlZCkpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciIsZGlzYWJsZVJpcHBsZTpbMiwiZGlzYWJsZVJpcHBsZSIsImRpc2FibGVSaXBwbGUiLEZdLGRpc2FibGVkOlsyLCJkaXNhYmxlZCIsImRpc2FibGVkIixGXSxhcmlhRGlzYWJsZWQ6WzIsImFyaWEtZGlzYWJsZWQiLCJhcmlhRGlzYWJsZWQiLEZdLGRpc2FibGVkSW50ZXJhY3RpdmU6WzIsImRpc2FibGVkSW50ZXJhY3RpdmUiLCJkaXNhYmxlZEludGVyYWN0aXZlIixGXSx0YWJJbmRleDpbMiwidGFiSW5kZXgiLCJ0YWJJbmRleCIscWRdLF90YWJpbmRleDpbMiwidGFiaW5kZXgiLCJfdGFiaW5kZXgiLHFkXX19KX1yZXR1cm4gaX0pKCkscWY9KCgpPT57Y2xhc3MgaSBleHRlbmRzIHBze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9yaXBwbGVMb2FkZXIuY29uZmlndXJlUmlwcGxlKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCx7Y2VudGVyZWQ6ITB9KX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVjbXA9UCh7dHlwZTppLHNlbGVjdG9yczpbWyJidXR0b24iLCJtYXQtaWNvbi1idXR0b24iLCIiXSxbImEiLCJtYXQtaWNvbi1idXR0b24iLCIiXSxbImJ1dHRvbiIsIm1hdEljb25CdXR0b24iLCIiXSxbImEiLCJtYXRJY29uQnV0dG9uIiwiIl1dLGhvc3RBdHRyczpbMSwibWRjLWljb24tYnV0dG9uIiwibWF0LW1kYy1pY29uLWJ1dHRvbiJdLGV4cG9ydEFzOlsibWF0QnV0dG9uIiwibWF0QW5jaG9yIl0sZmVhdHVyZXM6W0xdLGF0dHJzOiRmLG5nQ29udGVudFNlbGVjdG9yczpXZixkZWNsczo0LHZhcnM6MCxjb25zdHM6W1sxLCJtYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZSIsIm1kYy1pY29uLWJ1dHRvbl9fcmlwcGxlIl0sWzEsIm1hdC1mb2N1cy1pbmRpY2F0b3IiXSxbMSwibWF0LW1kYy1idXR0b24tdG91Y2gtdGFyZ2V0Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGUscil7ZSYxJiYoVHQoKSxLdCgwLCJzcGFuIiwwKSxVKDEpLEt0KDIsInNwYW4iLDEpKDMsInNwYW4iLDIpKX0sc3R5bGVzOltgLm1hdC1tZGMtaWNvbi1idXR0b257LXdlYmtpdC11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpib3JkZXItYm94O2JvcmRlcjpub25lO291dGxpbmU6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMCk7ZmlsbDpjdXJyZW50Q29sb3I7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXI7ei1pbmRleDowO292ZXJmbG93OnZpc2libGU7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYXQtaWNvbi1idXR0b24tY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1mdWxsLCA1MCUpKTtmbGV4LXNocmluazowO3RleHQtYWxpZ246Y2VudGVyO3dpZHRoOnZhcigtLW1hdC1pY29uLWJ1dHRvbi1zdGF0ZS1sYXllci1zaXplLCA0MHB4KTtoZWlnaHQ6dmFyKC0tbWF0LWljb24tYnV0dG9uLXN0YXRlLWxheWVyLXNpemUsIDQwcHgpO3BhZGRpbmc6Y2FsYyhjYWxjKHZhcigtLW1hdC1pY29uLWJ1dHRvbi1zdGF0ZS1sYXllci1zaXplLCA0MHB4KSAtIHZhcigtLW1hdC1pY29uLWJ1dHRvbi1pY29uLXNpemUsIDI0cHgpKSAvIDIpO2ZvbnQtc2l6ZTp2YXIoLS1tYXQtaWNvbi1idXR0b24taWNvbi1zaXplLCAyNHB4KTtjb2xvcjp2YXIoLS1tYXQtaWNvbi1idXR0b24taWNvbi1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKX0ubWF0LW1kYy1pY29uLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcmlwcGxlLC5tYXQtbWRjLWljb24tYnV0dG9uIC5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LW1kYy1pY29uLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6aW5oZXJpdH0ubWF0LW1kYy1pY29uLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcmlwcGxle292ZXJmbG93OmhpZGRlbn0ubWF0LW1kYy1pY29uLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZXtjb250ZW50OiIiO29wYWNpdHk6MH0ubWF0LW1kYy1pY29uLWJ1dHRvbiAubWRjLWJ1dHRvbl9fbGFiZWwsLm1hdC1tZGMtaWNvbi1idXR0b24gLm1hdC1pY29ue3otaW5kZXg6MTtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1pY29uLWJ1dHRvbiAubWF0LWZvY3VzLWluZGljYXRvcnt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOmluaGVyaXR9Lm1hdC1tZGMtaWNvbi1idXR0b246Zm9jdXM+Lm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXtjb250ZW50OiIiO2JvcmRlci1yYWRpdXM6aW5oZXJpdH0ubWF0LW1kYy1pY29uLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWljb24tYnV0dG9uLXJpcHBsZS1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSBjYWxjKHZhcigtLW1hdC1zeXMtcHJlc3NlZC1zdGF0ZS1sYXllci1vcGFjaXR5KSAqIDEwMCUpLCB0cmFuc3BhcmVudCkpfS5tYXQtbWRjLWljb24tYnV0dG9uIC5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWljb24tYnV0dG9uLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tYXQtbWRjLWljb24tYnV0dG9uLm1hdC1tZGMtYnV0dG9uLWRpc2FibGVkIC5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWljb24tYnV0dG9uLWRpc2FibGVkLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tYXQtbWRjLWljb24tYnV0dG9uOmhvdmVyPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle29wYWNpdHk6dmFyKC0tbWF0LWljb24tYnV0dG9uLWhvdmVyLXN0YXRlLWxheWVyLW9wYWNpdHksIHZhcigtLW1hdC1zeXMtaG92ZXItc3RhdGUtbGF5ZXItb3BhY2l0eSkpfS5tYXQtbWRjLWljb24tYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQ+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmUsLm1hdC1tZGMtaWNvbi1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQ+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmUsLm1hdC1tZGMtaWNvbi1idXR0b24ubWF0LW1kYy1idXR0b24tZGlzYWJsZWQtaW50ZXJhY3RpdmU6Zm9jdXM+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7b3BhY2l0eTp2YXIoLS1tYXQtaWNvbi1idXR0b24tZm9jdXMtc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5KSl9Lm1hdC1tZGMtaWNvbi1idXR0b246YWN0aXZlPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle29wYWNpdHk6dmFyKC0tbWF0LWljb24tYnV0dG9uLXByZXNzZWQtc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1wcmVzc2VkLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWF0LW1kYy1pY29uLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tdG91Y2gtdGFyZ2V0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7aGVpZ2h0OnZhcigtLW1hdC1pY29uLWJ1dHRvbi10b3VjaC10YXJnZXQtc2l6ZSwgNDhweCk7ZGlzcGxheTp2YXIoLS1tYXQtaWNvbi1idXR0b24tdG91Y2gtdGFyZ2V0LWRpc3BsYXksIGJsb2NrKTtsZWZ0OjUwJTt3aWR0aDp2YXIoLS1tYXQtaWNvbi1idXR0b24tdG91Y2gtdGFyZ2V0LXNpemUsIDQ4cHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTUwJSl9Lm1hdC1tZGMtaWNvbi1idXR0b24uX21hdC1hbmltYXRpb24tbm9vcGFibGV7dHJhbnNpdGlvbjpub25lICFpbXBvcnRhbnQ7YW5pbWF0aW9uOm5vbmUgIWltcG9ydGFudH0ubWF0LW1kYy1pY29uLWJ1dHRvbltkaXNhYmxlZF0sLm1hdC1tZGMtaWNvbi1idXR0b24ubWF0LW1kYy1idXR0b24tZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHQ7cG9pbnRlci1ldmVudHM6bm9uZTtjb2xvcjp2YXIoLS1tYXQtaWNvbi1idXR0b24tZGlzYWJsZWQtaWNvbi1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpfS5tYXQtbWRjLWljb24tYnV0dG9uLm1hdC1tZGMtYnV0dG9uLWRpc2FibGVkLWludGVyYWN0aXZle3BvaW50ZXItZXZlbnRzOmF1dG99Lm1hdC1tZGMtaWNvbi1idXR0b24gaW1nLC5tYXQtbWRjLWljb24tYnV0dG9uIHN2Z3t3aWR0aDp2YXIoLS1tYXQtaWNvbi1idXR0b24taWNvbi1zaXplLCAyNHB4KTtoZWlnaHQ6dmFyKC0tbWF0LWljb24tYnV0dG9uLWljb24tc2l6ZSwgMjRweCk7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Lm1hdC1tZGMtaWNvbi1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxle2JvcmRlci1yYWRpdXM6dmFyKC0tbWF0LWljb24tYnV0dG9uLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZnVsbCwgNTAlKSl9Lm1hdC1tZGMtaWNvbi1idXR0b25baGlkZGVuXXtkaXNwbGF5Om5vbmV9Lm1hdC1tZGMtaWNvbi1idXR0b24ubWF0LXVudGhlbWVkOm5vdCgubWRjLXJpcHBsZS11cGdyYWRlZCk6Zm9jdXM6OmJlZm9yZSwubWF0LW1kYy1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeTpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOmZvY3VzOjpiZWZvcmUsLm1hdC1tZGMtaWNvbi1idXR0b24ubWF0LWFjY2VudDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOmZvY3VzOjpiZWZvcmUsLm1hdC1tZGMtaWNvbi1idXR0b24ubWF0LXdhcm46bm90KC5tZGMtcmlwcGxlLXVwZ3JhZGVkKTpmb2N1czo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwKTtvcGFjaXR5OjF9CmAsYEBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtbWRjLWJ1dHRvbjpub3QoLm1kYy1idXR0b24tLW91dGxpbmVkKSwubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbjpub3QoLm1kYy1idXR0b24tLW91dGxpbmVkKSwubWF0LW1kYy1yYWlzZWQtYnV0dG9uOm5vdCgubWRjLWJ1dHRvbi0tb3V0bGluZWQpLC5tYXQtbWRjLW91dGxpbmVkLWJ1dHRvbjpub3QoLm1kYy1idXR0b24tLW91dGxpbmVkKSwubWF0LW1kYy1idXR0b24tYmFzZS5tYXQtdG9uYWwtYnV0dG9uLC5tYXQtbWRjLWljb24tYnV0dG9uLm1hdC1tZGMtaWNvbi1idXR0b24sLm1hdC1tZGMtb3V0bGluZWQtYnV0dG9uIC5tZGMtYnV0dG9uX19yaXBwbGV7b3V0bGluZTpzb2xpZCAxcHh9fQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gaX0pKCl9KTtmdW5jdGlvbiBYZihpKXtyZXR1cm4gaS5oYXNBdHRyaWJ1dGUoIm1hdC1yYWlzZWQtYnV0dG9uIik/ImVsZXZhdGVkIjppLmhhc0F0dHJpYnV0ZSgibWF0LXN0cm9rZWQtYnV0dG9uIik/Im91dGxpbmVkIjppLmhhc0F0dHJpYnV0ZSgibWF0LWZsYXQtYnV0dG9uIik/ImZpbGxlZCI6aS5oYXNBdHRyaWJ1dGUoIm1hdC1idXR0b24iKT8idGV4dCI6bnVsbH12YXIgWWYsS2YsWmYsS2QsWmQsWGQsUWQ9XygoKT0+e1lkKCk7ZigpO3pkKCk7d2UoKTtZZj1bIm1hdEJ1dHRvbiIsIiJdLEtmPVtbWyIiLDgsIm1hdGVyaWFsLWljb25zIiwzLCJpY29uUG9zaXRpb25FbmQiLCIiXSxbIm1hdC1pY29uIiwzLCJpY29uUG9zaXRpb25FbmQiLCIiXSxbIiIsIm1hdEJ1dHRvbkljb24iLCIiLDMsImljb25Qb3NpdGlvbkVuZCIsIiJdXSwiKiIsW1siIiwiaWNvblBvc2l0aW9uRW5kIiwiIiw4LCJtYXRlcmlhbC1pY29ucyJdLFsibWF0LWljb24iLCJpY29uUG9zaXRpb25FbmQiLCIiXSxbIiIsIm1hdEJ1dHRvbkljb24iLCIiLCJpY29uUG9zaXRpb25FbmQiLCIiXV1dLFpmPVsiLm1hdGVyaWFsLWljb25zOm5vdChbaWNvblBvc2l0aW9uRW5kXSksIG1hdC1pY29uOm5vdChbaWNvblBvc2l0aW9uRW5kXSksIFttYXRCdXR0b25JY29uXTpub3QoW2ljb25Qb3NpdGlvbkVuZF0pIiwiKiIsIi5tYXRlcmlhbC1pY29uc1tpY29uUG9zaXRpb25FbmRdLCBtYXQtaWNvbltpY29uUG9zaXRpb25FbmRdLCBbbWF0QnV0dG9uSWNvbl1baWNvblBvc2l0aW9uRW5kXSJdLEtkPW5ldyBNYXAoW1sidGV4dCIsWyJtYXQtbWRjLWJ1dHRvbiJdXSxbImZpbGxlZCIsWyJtZGMtYnV0dG9uLS11bmVsZXZhdGVkIiwibWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiJdXSxbImVsZXZhdGVkIixbIm1kYy1idXR0b24tLXJhaXNlZCIsIm1hdC1tZGMtcmFpc2VkLWJ1dHRvbiJdXSxbIm91dGxpbmVkIixbIm1kYy1idXR0b24tLW91dGxpbmVkIiwibWF0LW1kYy1vdXRsaW5lZC1idXR0b24iXV0sWyJ0b25hbCIsWyJtYXQtdG9uYWwtYnV0dG9uIl1dXSksWmQ9KCgpPT57Y2xhc3MgaSBleHRlbmRzIHBze2dldCBhcHBlYXJhbmNlKCl7cmV0dXJuIHRoaXMuX2FwcGVhcmFuY2V9c2V0IGFwcGVhcmFuY2UodCl7dGhpcy5zZXRBcHBlYXJhbmNlKHR8fHRoaXMuX2NvbmZpZz8uZGVmYXVsdEFwcGVhcmFuY2V8fCJ0ZXh0Iil9X2FwcGVhcmFuY2U9bnVsbDtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7bGV0IHQ9WGYodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTt0JiZ0aGlzLnNldEFwcGVhcmFuY2UodCl9c2V0QXBwZWFyYW5jZSh0KXtpZih0PT09dGhpcy5fYXBwZWFyYW5jZSlyZXR1cm47bGV0IGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdCxyPXRoaXMuX2FwcGVhcmFuY2U/S2QuZ2V0KHRoaXMuX2FwcGVhcmFuY2UpOm51bGwsbz1LZC5nZXQodCk7ciYmZS5yZW1vdmUoLi4uciksZS5hZGQoLi4ubyksdGhpcy5fYXBwZWFyYW5jZT10fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWNtcD1QKHt0eXBlOmksc2VsZWN0b3JzOltbImJ1dHRvbiIsIm1hdEJ1dHRvbiIsIiJdLFsiYSIsIm1hdEJ1dHRvbiIsIiJdLFsiYnV0dG9uIiwibWF0LWJ1dHRvbiIsIiJdLFsiYnV0dG9uIiwibWF0LXJhaXNlZC1idXR0b24iLCIiXSxbImJ1dHRvbiIsIm1hdC1mbGF0LWJ1dHRvbiIsIiJdLFsiYnV0dG9uIiwibWF0LXN0cm9rZWQtYnV0dG9uIiwiIl0sWyJhIiwibWF0LWJ1dHRvbiIsIiJdLFsiYSIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIl0sWyJhIiwibWF0LWZsYXQtYnV0dG9uIiwiIl0sWyJhIiwibWF0LXN0cm9rZWQtYnV0dG9uIiwiIl1dLGhvc3RBdHRyczpbMSwibWRjLWJ1dHRvbiJdLGlucHV0czp7YXBwZWFyYW5jZTpbMCwibWF0QnV0dG9uIiwiYXBwZWFyYW5jZSJdfSxleHBvcnRBczpbIm1hdEJ1dHRvbiIsIm1hdEFuY2hvciJdLGZlYXR1cmVzOltMXSxhdHRyczpZZixuZ0NvbnRlbnRTZWxlY3RvcnM6WmYsZGVjbHM6Nyx2YXJzOjQsY29uc3RzOltbMSwibWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGUiXSxbMSwibWRjLWJ1dHRvbl9fbGFiZWwiXSxbMSwibWF0LWZvY3VzLWluZGljYXRvciJdLFsxLCJtYXQtbWRjLWJ1dHRvbi10b3VjaC10YXJnZXQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oZSxyKXtlJjEmJihUdChLZiksS3QoMCwic3BhbiIsMCksVSgxKSxrZSgyLCJzcGFuIiwxKSxVKDMsMSksVGUoKSxVKDQsMiksS3QoNSwic3BhbiIsMikoNiwic3BhbiIsMykpLGUmMiYmSCgibWRjLWJ1dHRvbl9fcmlwcGxlIiwhci5faXNGYWIpKCJtZGMtZmFiX19yaXBwbGUiLHIuX2lzRmFiKX0sc3R5bGVzOltgLm1hdC1tZGMtYnV0dG9uLWJhc2V7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Lm1hdC1tZGMtYnV0dG9uLWJhc2UgLm1hdC1pY29ue21pbi1oZWlnaHQ6Zml0LWNvbnRlbnQ7ZmxleC1zaHJpbms6MH0ubWRjLWJ1dHRvbnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveDttaW4td2lkdGg6NjRweDtib3JkZXI6bm9uZTtvdXRsaW5lOm5vbmU7bGluZS1oZWlnaHQ6aW5oZXJpdDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTtvdmVyZmxvdzp2aXNpYmxlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMCk7cGFkZGluZzowIDhweH0ubWRjLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntwYWRkaW5nOjA7Ym9yZGVyOjB9Lm1kYy1idXR0b246YWN0aXZle291dGxpbmU6bm9uZX0ubWRjLWJ1dHRvbjpob3ZlcntjdXJzb3I6cG9pbnRlcn0ubWRjLWJ1dHRvbjpkaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdDtwb2ludGVyLWV2ZW50czpub25lfS5tZGMtYnV0dG9uW2hpZGRlbl17ZGlzcGxheTpub25lfS5tZGMtYnV0dG9uIC5tZGMtYnV0dG9uX19sYWJlbHtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1idXR0b257cGFkZGluZzowIHZhcigtLW1hdC1idXR0b24tdGV4dC1ob3Jpem9udGFsLXBhZGRpbmcsIDEycHgpO2hlaWdodDp2YXIoLS1tYXQtYnV0dG9uLXRleHQtY29udGFpbmVyLWhlaWdodCwgNDBweCk7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LWJ1dHRvbi10ZXh0LWxhYmVsLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1mb250KSk7Zm9udC1zaXplOnZhcigtLW1hdC1idXR0b24tdGV4dC1sYWJlbC10ZXh0LXNpemUsIHZhcigtLW1hdC1zeXMtbGFiZWwtbGFyZ2Utc2l6ZSkpO2xldHRlci1zcGFjaW5nOnZhcigtLW1hdC1idXR0b24tdGV4dC1sYWJlbC10ZXh0LXRyYWNraW5nLCB2YXIoLS1tYXQtc3lzLWxhYmVsLWxhcmdlLXRyYWNraW5nKSk7dGV4dC10cmFuc2Zvcm06dmFyKC0tbWF0LWJ1dHRvbi10ZXh0LWxhYmVsLXRleHQtdHJhbnNmb3JtKTtmb250LXdlaWdodDp2YXIoLS1tYXQtYnV0dG9uLXRleHQtbGFiZWwtdGV4dC13ZWlnaHQsIHZhcigtLW1hdC1zeXMtbGFiZWwtbGFyZ2Utd2VpZ2h0KSl9Lm1hdC1tZGMtYnV0dG9uLC5tYXQtbWRjLWJ1dHRvbiAubWRjLWJ1dHRvbl9fcmlwcGxle2JvcmRlci1yYWRpdXM6dmFyKC0tbWF0LWJ1dHRvbi10ZXh0LWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZnVsbCkpfS5tYXQtbWRjLWJ1dHRvbjpub3QoOmRpc2FibGVkKXtjb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRleHQtbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1hdC1tZGMtYnV0dG9uW2Rpc2FibGVkXSwubWF0LW1kYy1idXR0b24ubWF0LW1kYy1idXR0b24tZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHQ7cG9pbnRlci1ldmVudHM6bm9uZTtjb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRleHQtZGlzYWJsZWQtbGFiZWwtdGV4dC1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpfS5tYXQtbWRjLWJ1dHRvbi5tYXQtbWRjLWJ1dHRvbi1kaXNhYmxlZC1pbnRlcmFjdGl2ZXtwb2ludGVyLWV2ZW50czphdXRvfS5tYXQtbWRjLWJ1dHRvbjpoYXMoLm1hdGVyaWFsLWljb25zLG1hdC1pY29uLFttYXRCdXR0b25JY29uXSl7cGFkZGluZzowIHZhcigtLW1hdC1idXR0b24tdGV4dC13aXRoLWljb24taG9yaXpvbnRhbC1wYWRkaW5nLCAxNnB4KX0ubWF0LW1kYy1idXR0b24+Lm1hdC1pY29ue21hcmdpbi1yaWdodDp2YXIoLS1tYXQtYnV0dG9uLXRleHQtaWNvbi1zcGFjaW5nLCA4cHgpO21hcmdpbi1sZWZ0OnZhcigtLW1hdC1idXR0b24tdGV4dC1pY29uLW9mZnNldCwgLTRweCl9W2Rpcj1ydGxdIC5tYXQtbWRjLWJ1dHRvbj4ubWF0LWljb257bWFyZ2luLXJpZ2h0OnZhcigtLW1hdC1idXR0b24tdGV4dC1pY29uLW9mZnNldCwgLTRweCk7bWFyZ2luLWxlZnQ6dmFyKC0tbWF0LWJ1dHRvbi10ZXh0LWljb24tc3BhY2luZywgOHB4KX0ubWF0LW1kYy1idXR0b24gLm1kYy1idXR0b25fX2xhYmVsKy5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6dmFyKC0tbWF0LWJ1dHRvbi10ZXh0LWljb24tb2Zmc2V0LCAtNHB4KTttYXJnaW4tbGVmdDp2YXIoLS1tYXQtYnV0dG9uLXRleHQtaWNvbi1zcGFjaW5nLCA4cHgpfVtkaXI9cnRsXSAubWF0LW1kYy1idXR0b24gLm1kYy1idXR0b25fX2xhYmVsKy5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6dmFyKC0tbWF0LWJ1dHRvbi10ZXh0LWljb24tc3BhY2luZywgOHB4KTttYXJnaW4tbGVmdDp2YXIoLS1tYXQtYnV0dG9uLXRleHQtaWNvbi1vZmZzZXQsIC00cHgpfS5tYXQtbWRjLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWJ1dHRvbi10ZXh0LXJpcHBsZS1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkgY2FsYyh2YXIoLS1tYXQtc3lzLXByZXNzZWQtc3RhdGUtbGF5ZXItb3BhY2l0eSkgKiAxMDAlKSwgdHJhbnNwYXJlbnQpKX0ubWF0LW1kYy1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRleHQtc3RhdGUtbGF5ZXItY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tYXQtbWRjLWJ1dHRvbi5tYXQtbWRjLWJ1dHRvbi1kaXNhYmxlZCAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1idXR0b24tdGV4dC1kaXNhYmxlZC1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKX0ubWF0LW1kYy1idXR0b246aG92ZXI+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7b3BhY2l0eTp2YXIoLS1tYXQtYnV0dG9uLXRleHQtaG92ZXItc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5KSl9Lm1hdC1tZGMtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQ+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmUsLm1hdC1tZGMtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3JlLC5tYXQtbWRjLWJ1dHRvbi5tYXQtbWRjLWJ1dHRvbi1kaXNhYmxlZC1pbnRlcmFjdGl2ZTpmb2N1cz4ubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZXtvcGFjaXR5OnZhcigtLW1hdC1idXR0b24tdGV4dC1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLWZvY3VzLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWF0LW1kYy1idXR0b246YWN0aXZlPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle29wYWNpdHk6dmFyKC0tbWF0LWJ1dHRvbi10ZXh0LXByZXNzZWQtc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1wcmVzc2VkLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWF0LW1kYy1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXRvdWNoLXRhcmdldHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2hlaWdodDp2YXIoLS1tYXQtYnV0dG9uLXRleHQtdG91Y2gtdGFyZ2V0LXNpemUsIDQ4cHgpO2Rpc3BsYXk6dmFyKC0tbWF0LWJ1dHRvbi10ZXh0LXRvdWNoLXRhcmdldC1kaXNwbGF5LCBibG9jayk7bGVmdDowO3JpZ2h0OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9Lm1hdC1tZGMtdW5lbGV2YXRlZC1idXR0b257dHJhbnNpdGlvbjpib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7aGVpZ2h0OnZhcigtLW1hdC1idXR0b24tZmlsbGVkLWNvbnRhaW5lci1oZWlnaHQsIDQwcHgpO2ZvbnQtZmFtaWx5OnZhcigtLW1hdC1idXR0b24tZmlsbGVkLWxhYmVsLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1mb250KSk7Zm9udC1zaXplOnZhcigtLW1hdC1idXR0b24tZmlsbGVkLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LWJ1dHRvbi1maWxsZWQtbGFiZWwtdGV4dC10cmFja2luZywgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS10cmFja2luZykpO3RleHQtdHJhbnNmb3JtOnZhcigtLW1hdC1idXR0b24tZmlsbGVkLWxhYmVsLXRleHQtdHJhbnNmb3JtKTtmb250LXdlaWdodDp2YXIoLS1tYXQtYnV0dG9uLWZpbGxlZC1sYWJlbC10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS13ZWlnaHQpKTtwYWRkaW5nOjAgdmFyKC0tbWF0LWJ1dHRvbi1maWxsZWQtaG9yaXpvbnRhbC1wYWRkaW5nLCAyNHB4KX0ubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbj4ubWF0LWljb257bWFyZ2luLXJpZ2h0OnZhcigtLW1hdC1idXR0b24tZmlsbGVkLWljb24tc3BhY2luZywgOHB4KTttYXJnaW4tbGVmdDp2YXIoLS1tYXQtYnV0dG9uLWZpbGxlZC1pY29uLW9mZnNldCwgLThweCl9W2Rpcj1ydGxdIC5tYXQtbWRjLXVuZWxldmF0ZWQtYnV0dG9uPi5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6dmFyKC0tbWF0LWJ1dHRvbi1maWxsZWQtaWNvbi1vZmZzZXQsIC04cHgpO21hcmdpbi1sZWZ0OnZhcigtLW1hdC1idXR0b24tZmlsbGVkLWljb24tc3BhY2luZywgOHB4KX0ubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiAubWRjLWJ1dHRvbl9fbGFiZWwrLm1hdC1pY29ue21hcmdpbi1yaWdodDp2YXIoLS1tYXQtYnV0dG9uLWZpbGxlZC1pY29uLW9mZnNldCwgLThweCk7bWFyZ2luLWxlZnQ6dmFyKC0tbWF0LWJ1dHRvbi1maWxsZWQtaWNvbi1zcGFjaW5nLCA4cHgpfVtkaXI9cnRsXSAubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiAubWRjLWJ1dHRvbl9fbGFiZWwrLm1hdC1pY29ue21hcmdpbi1yaWdodDp2YXIoLS1tYXQtYnV0dG9uLWZpbGxlZC1pY29uLXNwYWNpbmcsIDhweCk7bWFyZ2luLWxlZnQ6dmFyKC0tbWF0LWJ1dHRvbi1maWxsZWQtaWNvbi1vZmZzZXQsIC04cHgpfS5tYXQtbWRjLXVuZWxldmF0ZWQtYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLWZpbGxlZC1yaXBwbGUtY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXByaW1hcnkpIGNhbGModmFyKC0tbWF0LXN5cy1wcmVzc2VkLXN0YXRlLWxheWVyLW9wYWNpdHkpICogMTAwJSksIHRyYW5zcGFyZW50KSl9Lm1hdC1tZGMtdW5lbGV2YXRlZC1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLWZpbGxlZC1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1wcmltYXJ5KSl9Lm1hdC1tZGMtdW5lbGV2YXRlZC1idXR0b24ubWF0LW1kYy1idXR0b24tZGlzYWJsZWQgLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLWZpbGxlZC1kaXNhYmxlZC1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKX0ubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbjpob3Zlcj4ubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZXtvcGFjaXR5OnZhcigtLW1hdC1idXR0b24tZmlsbGVkLWhvdmVyLXN0YXRlLWxheWVyLW9wYWNpdHksIHZhcigtLW1hdC1zeXMtaG92ZXItc3RhdGUtbGF5ZXItb3BhY2l0eSkpfS5tYXQtbWRjLXVuZWxldmF0ZWQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQ+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmUsLm1hdC1tZGMtdW5lbGV2YXRlZC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQ+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmUsLm1hdC1tZGMtdW5lbGV2YXRlZC1idXR0b24ubWF0LW1kYy1idXR0b24tZGlzYWJsZWQtaW50ZXJhY3RpdmU6Zm9jdXM+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7b3BhY2l0eTp2YXIoLS1tYXQtYnV0dG9uLWZpbGxlZC1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLWZvY3VzLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbjphY3RpdmU+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7b3BhY2l0eTp2YXIoLS1tYXQtYnV0dG9uLWZpbGxlZC1wcmVzc2VkLXN0YXRlLWxheWVyLW9wYWNpdHksIHZhcigtLW1hdC1zeXMtcHJlc3NlZC1zdGF0ZS1sYXllci1vcGFjaXR5KSl9Lm1hdC1tZGMtdW5lbGV2YXRlZC1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXRvdWNoLXRhcmdldHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2hlaWdodDp2YXIoLS1tYXQtYnV0dG9uLWZpbGxlZC10b3VjaC10YXJnZXQtc2l6ZSwgNDhweCk7ZGlzcGxheTp2YXIoLS1tYXQtYnV0dG9uLWZpbGxlZC10b3VjaC10YXJnZXQtZGlzcGxheSwgYmxvY2spO2xlZnQ6MDtyaWdodDowO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfS5tYXQtbWRjLXVuZWxldmF0ZWQtYnV0dG9uOm5vdCg6ZGlzYWJsZWQpe2NvbG9yOnZhcigtLW1hdC1idXR0b24tZmlsbGVkLWxhYmVsLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tcHJpbWFyeSkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWJ1dHRvbi1maWxsZWQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiwubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiAubWRjLWJ1dHRvbl9fcmlwcGxle2JvcmRlci1yYWRpdXM6dmFyKC0tbWF0LWJ1dHRvbi1maWxsZWQtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1mdWxsKSl9Lm1hdC1tZGMtdW5lbGV2YXRlZC1idXR0b25bZGlzYWJsZWRdLC5tYXQtbWRjLXVuZWxldmF0ZWQtYnV0dG9uLm1hdC1tZGMtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0O3BvaW50ZXItZXZlbnRzOm5vbmU7Y29sb3I6dmFyKC0tbWF0LWJ1dHRvbi1maWxsZWQtZGlzYWJsZWQtbGFiZWwtdGV4dC1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWJ1dHRvbi1maWxsZWQtZGlzYWJsZWQtY29udGFpbmVyLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAxMiUsIHRyYW5zcGFyZW50KSl9Lm1hdC1tZGMtdW5lbGV2YXRlZC1idXR0b24ubWF0LW1kYy1idXR0b24tZGlzYWJsZWQtaW50ZXJhY3RpdmV7cG9pbnRlci1ldmVudHM6YXV0b30ubWF0LW1kYy1yYWlzZWQtYnV0dG9ue3RyYW5zaXRpb246Ym94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO2JveC1zaGFkb3c6dmFyKC0tbWF0LWJ1dHRvbi1wcm90ZWN0ZWQtY29udGFpbmVyLWVsZXZhdGlvbi1zaGFkb3csIHZhcigtLW1hdC1zeXMtbGV2ZWwxKSk7aGVpZ2h0OnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLWNvbnRhaW5lci1oZWlnaHQsIDQwcHgpO2ZvbnQtZmFtaWx5OnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLWxhYmVsLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1mb250KSk7Zm9udC1zaXplOnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LWJ1dHRvbi1wcm90ZWN0ZWQtbGFiZWwtdGV4dC10cmFja2luZywgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS10cmFja2luZykpO3RleHQtdHJhbnNmb3JtOnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLWxhYmVsLXRleHQtdHJhbnNmb3JtKTtmb250LXdlaWdodDp2YXIoLS1tYXQtYnV0dG9uLXByb3RlY3RlZC1sYWJlbC10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS13ZWlnaHQpKTtwYWRkaW5nOjAgdmFyKC0tbWF0LWJ1dHRvbi1wcm90ZWN0ZWQtaG9yaXpvbnRhbC1wYWRkaW5nLCAyNHB4KX0ubWF0LW1kYy1yYWlzZWQtYnV0dG9uPi5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6dmFyKC0tbWF0LWJ1dHRvbi1wcm90ZWN0ZWQtaWNvbi1zcGFjaW5nLCA4cHgpO21hcmdpbi1sZWZ0OnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLWljb24tb2Zmc2V0LCAtOHB4KX1bZGlyPXJ0bF0gLm1hdC1tZGMtcmFpc2VkLWJ1dHRvbj4ubWF0LWljb257bWFyZ2luLXJpZ2h0OnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLWljb24tb2Zmc2V0LCAtOHB4KTttYXJnaW4tbGVmdDp2YXIoLS1tYXQtYnV0dG9uLXByb3RlY3RlZC1pY29uLXNwYWNpbmcsIDhweCl9Lm1hdC1tZGMtcmFpc2VkLWJ1dHRvbiAubWRjLWJ1dHRvbl9fbGFiZWwrLm1hdC1pY29ue21hcmdpbi1yaWdodDp2YXIoLS1tYXQtYnV0dG9uLXByb3RlY3RlZC1pY29uLW9mZnNldCwgLThweCk7bWFyZ2luLWxlZnQ6dmFyKC0tbWF0LWJ1dHRvbi1wcm90ZWN0ZWQtaWNvbi1zcGFjaW5nLCA4cHgpfVtkaXI9cnRsXSAubWF0LW1kYy1yYWlzZWQtYnV0dG9uIC5tZGMtYnV0dG9uX19sYWJlbCsubWF0LWljb257bWFyZ2luLXJpZ2h0OnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLWljb24tc3BhY2luZywgOHB4KTttYXJnaW4tbGVmdDp2YXIoLS1tYXQtYnV0dG9uLXByb3RlY3RlZC1pY29uLW9mZnNldCwgLThweCl9Lm1hdC1tZGMtcmFpc2VkLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWJ1dHRvbi1wcm90ZWN0ZWQtcmlwcGxlLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSBjYWxjKHZhcigtLW1hdC1zeXMtcHJlc3NlZC1zdGF0ZS1sYXllci1vcGFjaXR5KSAqIDEwMCUpLCB0cmFuc3BhcmVudCkpfS5tYXQtbWRjLXJhaXNlZC1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXByb3RlY3RlZC1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1hdC1tZGMtcmFpc2VkLWJ1dHRvbi5tYXQtbWRjLWJ1dHRvbi1kaXNhYmxlZCAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLWRpc2FibGVkLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tYXQtbWRjLXJhaXNlZC1idXR0b246aG92ZXI+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7b3BhY2l0eTp2YXIoLS1tYXQtYnV0dG9uLXByb3RlY3RlZC1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLWhvdmVyLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWF0LW1kYy1yYWlzZWQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQ+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmUsLm1hdC1tZGMtcmFpc2VkLWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZD4ubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZSwubWF0LW1kYy1yYWlzZWQtYnV0dG9uLm1hdC1tZGMtYnV0dG9uLWRpc2FibGVkLWludGVyYWN0aXZlOmZvY3VzPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle29wYWNpdHk6dmFyKC0tbWF0LWJ1dHRvbi1wcm90ZWN0ZWQtZm9jdXMtc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5KSl9Lm1hdC1tZGMtcmFpc2VkLWJ1dHRvbjphY3RpdmU+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7b3BhY2l0eTp2YXIoLS1tYXQtYnV0dG9uLXByb3RlY3RlZC1wcmVzc2VkLXN0YXRlLWxheWVyLW9wYWNpdHksIHZhcigtLW1hdC1zeXMtcHJlc3NlZC1zdGF0ZS1sYXllci1vcGFjaXR5KSl9Lm1hdC1tZGMtcmFpc2VkLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tdG91Y2gtdGFyZ2V0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7aGVpZ2h0OnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLXRvdWNoLXRhcmdldC1zaXplLCA0OHB4KTtkaXNwbGF5OnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLXRvdWNoLXRhcmdldC1kaXNwbGF5LCBibG9jayk7bGVmdDowO3JpZ2h0OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9Lm1hdC1tZGMtcmFpc2VkLWJ1dHRvbjpub3QoOmRpc2FibGVkKXtjb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXByb3RlY3RlZC1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlKSl9Lm1hdC1tZGMtcmFpc2VkLWJ1dHRvbiwubWF0LW1kYy1yYWlzZWQtYnV0dG9uIC5tZGMtYnV0dG9uX19yaXBwbGV7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYXQtYnV0dG9uLXByb3RlY3RlZC1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWZ1bGwpKX0ubWF0LW1kYy1yYWlzZWQtYnV0dG9uOmhvdmVye2JveC1zaGFkb3c6dmFyKC0tbWF0LWJ1dHRvbi1wcm90ZWN0ZWQtaG92ZXItY29udGFpbmVyLWVsZXZhdGlvbi1zaGFkb3csIHZhcigtLW1hdC1zeXMtbGV2ZWwyKSl9Lm1hdC1tZGMtcmFpc2VkLWJ1dHRvbjpmb2N1c3tib3gtc2hhZG93OnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLWZvY3VzLWNvbnRhaW5lci1lbGV2YXRpb24tc2hhZG93LCB2YXIoLS1tYXQtc3lzLWxldmVsMSkpfS5tYXQtbWRjLXJhaXNlZC1idXR0b246YWN0aXZlLC5tYXQtbWRjLXJhaXNlZC1idXR0b246Zm9jdXM6YWN0aXZle2JveC1zaGFkb3c6dmFyKC0tbWF0LWJ1dHRvbi1wcm90ZWN0ZWQtcHJlc3NlZC1jb250YWluZXItZWxldmF0aW9uLXNoYWRvdywgdmFyKC0tbWF0LXN5cy1sZXZlbDEpKX0ubWF0LW1kYy1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXSwubWF0LW1kYy1yYWlzZWQtYnV0dG9uLm1hdC1tZGMtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0O3BvaW50ZXItZXZlbnRzOm5vbmU7Y29sb3I6dmFyKC0tbWF0LWJ1dHRvbi1wcm90ZWN0ZWQtZGlzYWJsZWQtbGFiZWwtdGV4dC1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWJ1dHRvbi1wcm90ZWN0ZWQtZGlzYWJsZWQtY29udGFpbmVyLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAxMiUsIHRyYW5zcGFyZW50KSl9Lm1hdC1tZGMtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF0ubWF0LW1kYy1idXR0b24tZGlzYWJsZWQsLm1hdC1tZGMtcmFpc2VkLWJ1dHRvbi5tYXQtbWRjLWJ1dHRvbi1kaXNhYmxlZC5tYXQtbWRjLWJ1dHRvbi1kaXNhYmxlZHtib3gtc2hhZG93OnZhcigtLW1hdC1idXR0b24tcHJvdGVjdGVkLWRpc2FibGVkLWNvbnRhaW5lci1lbGV2YXRpb24tc2hhZG93LCB2YXIoLS1tYXQtc3lzLWxldmVsMCkpfS5tYXQtbWRjLXJhaXNlZC1idXR0b24ubWF0LW1kYy1idXR0b24tZGlzYWJsZWQtaW50ZXJhY3RpdmV7cG9pbnRlci1ldmVudHM6YXV0b30ubWF0LW1kYy1vdXRsaW5lZC1idXR0b257Ym9yZGVyLXN0eWxlOnNvbGlkO3RyYW5zaXRpb246Ym9yZGVyIDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7aGVpZ2h0OnZhcigtLW1hdC1idXR0b24tb3V0bGluZWQtY29udGFpbmVyLWhlaWdodCwgNDBweCk7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC1sYWJlbC10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtbGFiZWwtbGFyZ2UtZm9udCkpO2ZvbnQtc2l6ZTp2YXIoLS1tYXQtYnV0dG9uLW91dGxpbmVkLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC1sYWJlbC10ZXh0LXRyYWNraW5nLCB2YXIoLS1tYXQtc3lzLWxhYmVsLWxhcmdlLXRyYWNraW5nKSk7dGV4dC10cmFuc2Zvcm06dmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC1sYWJlbC10ZXh0LXRyYW5zZm9ybSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC1sYWJlbC10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS13ZWlnaHQpKTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1idXR0b24tb3V0bGluZWQtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1mdWxsKSk7Ym9yZGVyLXdpZHRoOnZhcigtLW1hdC1idXR0b24tb3V0bGluZWQtb3V0bGluZS13aWR0aCwgMXB4KTtwYWRkaW5nOjAgdmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC1ob3Jpem9udGFsLXBhZGRpbmcsIDI0cHgpfS5tYXQtbWRjLW91dGxpbmVkLWJ1dHRvbj4ubWF0LWljb257bWFyZ2luLXJpZ2h0OnZhcigtLW1hdC1idXR0b24tb3V0bGluZWQtaWNvbi1zcGFjaW5nLCA4cHgpO21hcmdpbi1sZWZ0OnZhcigtLW1hdC1idXR0b24tb3V0bGluZWQtaWNvbi1vZmZzZXQsIC04cHgpfVtkaXI9cnRsXSAubWF0LW1kYy1vdXRsaW5lZC1idXR0b24+Lm1hdC1pY29ue21hcmdpbi1yaWdodDp2YXIoLS1tYXQtYnV0dG9uLW91dGxpbmVkLWljb24tb2Zmc2V0LCAtOHB4KTttYXJnaW4tbGVmdDp2YXIoLS1tYXQtYnV0dG9uLW91dGxpbmVkLWljb24tc3BhY2luZywgOHB4KX0ubWF0LW1kYy1vdXRsaW5lZC1idXR0b24gLm1kYy1idXR0b25fX2xhYmVsKy5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6dmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC1pY29uLW9mZnNldCwgLThweCk7bWFyZ2luLWxlZnQ6dmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC1pY29uLXNwYWNpbmcsIDhweCl9W2Rpcj1ydGxdIC5tYXQtbWRjLW91dGxpbmVkLWJ1dHRvbiAubWRjLWJ1dHRvbl9fbGFiZWwrLm1hdC1pY29ue21hcmdpbi1yaWdodDp2YXIoLS1tYXQtYnV0dG9uLW91dGxpbmVkLWljb24tc3BhY2luZywgOHB4KTttYXJnaW4tbGVmdDp2YXIoLS1tYXQtYnV0dG9uLW91dGxpbmVkLWljb24tb2Zmc2V0LCAtOHB4KX0ubWF0LW1kYy1vdXRsaW5lZC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1idXR0b24tb3V0bGluZWQtcmlwcGxlLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSBjYWxjKHZhcigtLW1hdC1zeXMtcHJlc3NlZC1zdGF0ZS1sYXllci1vcGFjaXR5KSAqIDEwMCUpLCB0cmFuc3BhcmVudCkpfS5tYXQtbWRjLW91dGxpbmVkLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1idXR0b24tb3V0bGluZWQtc3RhdGUtbGF5ZXItY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tYXQtbWRjLW91dGxpbmVkLWJ1dHRvbi5tYXQtbWRjLWJ1dHRvbi1kaXNhYmxlZCAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1idXR0b24tb3V0bGluZWQtZGlzYWJsZWQtc3RhdGUtbGF5ZXItY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1hdC1tZGMtb3V0bGluZWQtYnV0dG9uOmhvdmVyPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle29wYWNpdHk6dmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLWhvdmVyLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWF0LW1kYy1vdXRsaW5lZC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZD4ubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZSwubWF0LW1kYy1vdXRsaW5lZC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQ+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmUsLm1hdC1tZGMtb3V0bGluZWQtYnV0dG9uLm1hdC1tZGMtYnV0dG9uLWRpc2FibGVkLWludGVyYWN0aXZlOmZvY3VzPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle29wYWNpdHk6dmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLWZvY3VzLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWF0LW1kYy1vdXRsaW5lZC1idXR0b246YWN0aXZlPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle29wYWNpdHk6dmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC1wcmVzc2VkLXN0YXRlLWxheWVyLW9wYWNpdHksIHZhcigtLW1hdC1zeXMtcHJlc3NlZC1zdGF0ZS1sYXllci1vcGFjaXR5KSl9Lm1hdC1tZGMtb3V0bGluZWQtYnV0dG9uIC5tYXQtbWRjLWJ1dHRvbi10b3VjaC10YXJnZXR7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtoZWlnaHQ6dmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC10b3VjaC10YXJnZXQtc2l6ZSwgNDhweCk7ZGlzcGxheTp2YXIoLS1tYXQtYnV0dG9uLW91dGxpbmVkLXRvdWNoLXRhcmdldC1kaXNwbGF5LCBibG9jayk7bGVmdDowO3JpZ2h0OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9Lm1hdC1tZGMtb3V0bGluZWQtYnV0dG9uOm5vdCg6ZGlzYWJsZWQpe2NvbG9yOnZhcigtLW1hdC1idXR0b24tb3V0bGluZWQtbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1idXR0b24tb3V0bGluZWQtb3V0bGluZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1vdXRsaW5lKSl9Lm1hdC1tZGMtb3V0bGluZWQtYnV0dG9uW2Rpc2FibGVkXSwubWF0LW1kYy1vdXRsaW5lZC1idXR0b24ubWF0LW1kYy1idXR0b24tZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHQ7cG9pbnRlci1ldmVudHM6bm9uZTtjb2xvcjp2YXIoLS1tYXQtYnV0dG9uLW91dGxpbmVkLWRpc2FibGVkLWxhYmVsLXRleHQtY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKTtib3JkZXItY29sb3I6dmFyKC0tbWF0LWJ1dHRvbi1vdXRsaW5lZC1kaXNhYmxlZC1vdXRsaW5lLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAxMiUsIHRyYW5zcGFyZW50KSl9Lm1hdC1tZGMtb3V0bGluZWQtYnV0dG9uLm1hdC1tZGMtYnV0dG9uLWRpc2FibGVkLWludGVyYWN0aXZle3BvaW50ZXItZXZlbnRzOmF1dG99Lm1hdC10b25hbC1idXR0b257dHJhbnNpdGlvbjpib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7aGVpZ2h0OnZhcigtLW1hdC1idXR0b24tdG9uYWwtY29udGFpbmVyLWhlaWdodCwgNDBweCk7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LWJ1dHRvbi10b25hbC1sYWJlbC10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtbGFiZWwtbGFyZ2UtZm9udCkpO2ZvbnQtc2l6ZTp2YXIoLS1tYXQtYnV0dG9uLXRvbmFsLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LWJ1dHRvbi10b25hbC1sYWJlbC10ZXh0LXRyYWNraW5nLCB2YXIoLS1tYXQtc3lzLWxhYmVsLWxhcmdlLXRyYWNraW5nKSk7dGV4dC10cmFuc2Zvcm06dmFyKC0tbWF0LWJ1dHRvbi10b25hbC1sYWJlbC10ZXh0LXRyYW5zZm9ybSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LWJ1dHRvbi10b25hbC1sYWJlbC10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS13ZWlnaHQpKTtwYWRkaW5nOjAgdmFyKC0tbWF0LWJ1dHRvbi10b25hbC1ob3Jpem9udGFsLXBhZGRpbmcsIDI0cHgpfS5tYXQtdG9uYWwtYnV0dG9uOm5vdCg6ZGlzYWJsZWQpe2NvbG9yOnZhcigtLW1hdC1idXR0b24tdG9uYWwtbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zZWNvbmRhcnktY29udGFpbmVyKSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRvbmFsLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tbWF0LXN5cy1zZWNvbmRhcnktY29udGFpbmVyKSl9Lm1hdC10b25hbC1idXR0b24sLm1hdC10b25hbC1idXR0b24gLm1kYy1idXR0b25fX3JpcHBsZXtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1idXR0b24tdG9uYWwtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1mdWxsKSl9Lm1hdC10b25hbC1idXR0b25bZGlzYWJsZWRdLC5tYXQtdG9uYWwtYnV0dG9uLm1hdC1tZGMtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0O3BvaW50ZXItZXZlbnRzOm5vbmU7Y29sb3I6dmFyKC0tbWF0LWJ1dHRvbi10b25hbC1kaXNhYmxlZC1sYWJlbC10ZXh0LWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRvbmFsLWRpc2FibGVkLWNvbnRhaW5lci1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMTIlLCB0cmFuc3BhcmVudCkpfS5tYXQtdG9uYWwtYnV0dG9uLm1hdC1tZGMtYnV0dG9uLWRpc2FibGVkLWludGVyYWN0aXZle3BvaW50ZXItZXZlbnRzOmF1dG99Lm1hdC10b25hbC1idXR0b24+Lm1hdC1pY29ue21hcmdpbi1yaWdodDp2YXIoLS1tYXQtYnV0dG9uLXRvbmFsLWljb24tc3BhY2luZywgOHB4KTttYXJnaW4tbGVmdDp2YXIoLS1tYXQtYnV0dG9uLXRvbmFsLWljb24tb2Zmc2V0LCAtOHB4KX1bZGlyPXJ0bF0gLm1hdC10b25hbC1idXR0b24+Lm1hdC1pY29ue21hcmdpbi1yaWdodDp2YXIoLS1tYXQtYnV0dG9uLXRvbmFsLWljb24tb2Zmc2V0LCAtOHB4KTttYXJnaW4tbGVmdDp2YXIoLS1tYXQtYnV0dG9uLXRvbmFsLWljb24tc3BhY2luZywgOHB4KX0ubWF0LXRvbmFsLWJ1dHRvbiAubWRjLWJ1dHRvbl9fbGFiZWwrLm1hdC1pY29ue21hcmdpbi1yaWdodDp2YXIoLS1tYXQtYnV0dG9uLXRvbmFsLWljb24tb2Zmc2V0LCAtOHB4KTttYXJnaW4tbGVmdDp2YXIoLS1tYXQtYnV0dG9uLXRvbmFsLWljb24tc3BhY2luZywgOHB4KX1bZGlyPXJ0bF0gLm1hdC10b25hbC1idXR0b24gLm1kYy1idXR0b25fX2xhYmVsKy5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6dmFyKC0tbWF0LWJ1dHRvbi10b25hbC1pY29uLXNwYWNpbmcsIDhweCk7bWFyZ2luLWxlZnQ6dmFyKC0tbWF0LWJ1dHRvbi10b25hbC1pY29uLW9mZnNldCwgLThweCl9Lm1hdC10b25hbC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1idXR0b24tdG9uYWwtcmlwcGxlLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zZWNvbmRhcnktY29udGFpbmVyKSBjYWxjKHZhcigtLW1hdC1zeXMtcHJlc3NlZC1zdGF0ZS1sYXllci1vcGFjaXR5KSAqIDEwMCUpLCB0cmFuc3BhcmVudCkpfS5tYXQtdG9uYWwtYnV0dG9uIC5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWJ1dHRvbi10b25hbC1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zZWNvbmRhcnktY29udGFpbmVyKSl9Lm1hdC10b25hbC1idXR0b24ubWF0LW1kYy1idXR0b24tZGlzYWJsZWQgLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRvbmFsLWRpc2FibGVkLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tYXQtdG9uYWwtYnV0dG9uOmhvdmVyPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle29wYWNpdHk6dmFyKC0tbWF0LWJ1dHRvbi10b25hbC1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLWhvdmVyLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWF0LXRvbmFsLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3JlLC5tYXQtdG9uYWwtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3JlLC5tYXQtdG9uYWwtYnV0dG9uLm1hdC1tZGMtYnV0dG9uLWRpc2FibGVkLWludGVyYWN0aXZlOmZvY3VzPi5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZTo6YmVmb3Jle29wYWNpdHk6dmFyKC0tbWF0LWJ1dHRvbi10b25hbC1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLWZvY3VzLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWF0LXRvbmFsLWJ1dHRvbjphY3RpdmU+Lm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7b3BhY2l0eTp2YXIoLS1tYXQtYnV0dG9uLXRvbmFsLXByZXNzZWQtc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1wcmVzc2VkLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWF0LXRvbmFsLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tdG91Y2gtdGFyZ2V0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7aGVpZ2h0OnZhcigtLW1hdC1idXR0b24tdG9uYWwtdG91Y2gtdGFyZ2V0LXNpemUsIDQ4cHgpO2Rpc3BsYXk6dmFyKC0tbWF0LWJ1dHRvbi10b25hbC10b3VjaC10YXJnZXQtZGlzcGxheSwgYmxvY2spO2xlZnQ6MDtyaWdodDowO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpfS5tYXQtbWRjLWJ1dHRvbiwubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiwubWF0LW1kYy1yYWlzZWQtYnV0dG9uLC5tYXQtbWRjLW91dGxpbmVkLWJ1dHRvbiwubWF0LXRvbmFsLWJ1dHRvbnstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKX0ubWF0LW1kYy1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXJpcHBsZSwubWF0LW1kYy1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtbWRjLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZSwubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcmlwcGxlLC5tYXQtbWRjLXVuZWxldmF0ZWQtYnV0dG9uIC5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZSwubWF0LW1kYy1yYWlzZWQtYnV0dG9uIC5tYXQtbWRjLWJ1dHRvbi1yaXBwbGUsLm1hdC1tZGMtcmFpc2VkLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1tZGMtcmFpc2VkLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZSwubWF0LW1kYy1vdXRsaW5lZC1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXJpcHBsZSwubWF0LW1kYy1vdXRsaW5lZC1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtbWRjLW91dGxpbmVkLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZSwubWF0LXRvbmFsLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcmlwcGxlLC5tYXQtdG9uYWwtYnV0dG9uIC5tYXQtbWRjLWJ1dHRvbi1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXRvbmFsLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6aW5oZXJpdH0ubWF0LW1kYy1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXJpcHBsZSwubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcmlwcGxlLC5tYXQtbWRjLXJhaXNlZC1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXJpcHBsZSwubWF0LW1kYy1vdXRsaW5lZC1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXJpcHBsZSwubWF0LXRvbmFsLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcmlwcGxle292ZXJmbG93OmhpZGRlbn0ubWF0LW1kYy1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmUsLm1hdC1tZGMtdW5lbGV2YXRlZC1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmUsLm1hdC1tZGMtcmFpc2VkLWJ1dHRvbiAubWF0LW1kYy1idXR0b24tcGVyc2lzdGVudC1yaXBwbGU6OmJlZm9yZSwubWF0LW1kYy1vdXRsaW5lZC1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmUsLm1hdC10b25hbC1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXBlcnNpc3RlbnQtcmlwcGxlOjpiZWZvcmV7Y29udGVudDoiIjtvcGFjaXR5OjB9Lm1hdC1tZGMtYnV0dG9uIC5tZGMtYnV0dG9uX19sYWJlbCwubWF0LW1kYy1idXR0b24gLm1hdC1pY29uLC5tYXQtbWRjLXVuZWxldmF0ZWQtYnV0dG9uIC5tZGMtYnV0dG9uX19sYWJlbCwubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiAubWF0LWljb24sLm1hdC1tZGMtcmFpc2VkLWJ1dHRvbiAubWRjLWJ1dHRvbl9fbGFiZWwsLm1hdC1tZGMtcmFpc2VkLWJ1dHRvbiAubWF0LWljb24sLm1hdC1tZGMtb3V0bGluZWQtYnV0dG9uIC5tZGMtYnV0dG9uX19sYWJlbCwubWF0LW1kYy1vdXRsaW5lZC1idXR0b24gLm1hdC1pY29uLC5tYXQtdG9uYWwtYnV0dG9uIC5tZGMtYnV0dG9uX19sYWJlbCwubWF0LXRvbmFsLWJ1dHRvbiAubWF0LWljb257ei1pbmRleDoxO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWJ1dHRvbiAubWF0LWZvY3VzLWluZGljYXRvciwubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiAubWF0LWZvY3VzLWluZGljYXRvciwubWF0LW1kYy1yYWlzZWQtYnV0dG9uIC5tYXQtZm9jdXMtaW5kaWNhdG9yLC5tYXQtbWRjLW91dGxpbmVkLWJ1dHRvbiAubWF0LWZvY3VzLWluZGljYXRvciwubWF0LXRvbmFsLWJ1dHRvbiAubWF0LWZvY3VzLWluZGljYXRvcnt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOmluaGVyaXR9Lm1hdC1tZGMtYnV0dG9uOmZvY3VzPi5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC1tZGMtdW5lbGV2YXRlZC1idXR0b246Zm9jdXM+Lm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSwubWF0LW1kYy1yYWlzZWQtYnV0dG9uOmZvY3VzPi5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC1tZGMtb3V0bGluZWQtYnV0dG9uOmZvY3VzPi5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10b25hbC1idXR0b246Zm9jdXM+Lm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXtjb250ZW50OiIiO2JvcmRlci1yYWRpdXM6aW5oZXJpdH0ubWF0LW1kYy1idXR0b24uX21hdC1hbmltYXRpb24tbm9vcGFibGUsLm1hdC1tZGMtdW5lbGV2YXRlZC1idXR0b24uX21hdC1hbmltYXRpb24tbm9vcGFibGUsLm1hdC1tZGMtcmFpc2VkLWJ1dHRvbi5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSwubWF0LW1kYy1vdXRsaW5lZC1idXR0b24uX21hdC1hbmltYXRpb24tbm9vcGFibGUsLm1hdC10b25hbC1idXR0b24uX21hdC1hbmltYXRpb24tbm9vcGFibGV7dHJhbnNpdGlvbjpub25lICFpbXBvcnRhbnQ7YW5pbWF0aW9uOm5vbmUgIWltcG9ydGFudH0ubWF0LW1kYy1idXR0b24+Lm1hdC1pY29uLC5tYXQtbWRjLXVuZWxldmF0ZWQtYnV0dG9uPi5tYXQtaWNvbiwubWF0LW1kYy1yYWlzZWQtYnV0dG9uPi5tYXQtaWNvbiwubWF0LW1kYy1vdXRsaW5lZC1idXR0b24+Lm1hdC1pY29uLC5tYXQtdG9uYWwtYnV0dG9uPi5tYXQtaWNvbntkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjp0b3A7Zm9udC1zaXplOjEuMTI1cmVtO2hlaWdodDoxLjEyNXJlbTt3aWR0aDoxLjEyNXJlbX0ubWF0LW1kYy1vdXRsaW5lZC1idXR0b24gLm1hdC1tZGMtYnV0dG9uLXJpcHBsZSwubWF0LW1kYy1vdXRsaW5lZC1idXR0b24gLm1kYy1idXR0b25fX3JpcHBsZXt0b3A6LTFweDtsZWZ0Oi0xcHg7Ym90dG9tOi0xcHg7cmlnaHQ6LTFweH0ubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbiAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLC5tYXQtdG9uYWwtYnV0dG9uIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC1tZGMtcmFpc2VkLWJ1dHRvbiAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3Jle21hcmdpbjpjYWxjKGNhbGModmFyKC0tbWF0LWZvY3VzLWluZGljYXRvci1ib3JkZXItd2lkdGgsIDNweCkgKyAycHgpKi0xKX0ubWF0LW1kYy1vdXRsaW5lZC1idXR0b24gLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXttYXJnaW46Y2FsYyhjYWxjKHZhcigtLW1hdC1mb2N1cy1pbmRpY2F0b3ItYm9yZGVyLXdpZHRoLCAzcHgpICsgM3B4KSotMSl9CmAsYEBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtbWRjLWJ1dHRvbjpub3QoLm1kYy1idXR0b24tLW91dGxpbmVkKSwubWF0LW1kYy11bmVsZXZhdGVkLWJ1dHRvbjpub3QoLm1kYy1idXR0b24tLW91dGxpbmVkKSwubWF0LW1kYy1yYWlzZWQtYnV0dG9uOm5vdCgubWRjLWJ1dHRvbi0tb3V0bGluZWQpLC5tYXQtbWRjLW91dGxpbmVkLWJ1dHRvbjpub3QoLm1kYy1idXR0b24tLW91dGxpbmVkKSwubWF0LW1kYy1idXR0b24tYmFzZS5tYXQtdG9uYWwtYnV0dG9uLC5tYXQtbWRjLWljb24tYnV0dG9uLm1hdC1tZGMtaWNvbi1idXR0b24sLm1hdC1tZGMtb3V0bGluZWQtYnV0dG9uIC5tZGMtYnV0dG9uX19yaXBwbGV7b3V0bGluZTpzb2xpZCAxcHh9fQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gaX0pKCk7WGQ9KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVtb2Q9Uih7dHlwZTppfSk7c3RhdGljIFx1MDI3NWluaj1TKHtpbXBvcnRzOltYLEJkLFhdfSl9cmV0dXJuIGl9KSgpfSk7dmFyIFFmLEpmLHRwLGVwLEQwLFIwLEEwLE0wLEkwLE8wLGswLGlwPV8oKCk9PntmKCk7ZigpO3dlKCk7UWY9WyIqIl0sSmY9W1tbIiIsIm1hdC1jYXJkLWF2YXRhciIsIiJdLFsiIiwibWF0Q2FyZEF2YXRhciIsIiJdXSxbWyJtYXQtY2FyZC10aXRsZSJdLFsibWF0LWNhcmQtc3VidGl0bGUiXSxbIiIsIm1hdC1jYXJkLXRpdGxlIiwiIl0sWyIiLCJtYXQtY2FyZC1zdWJ0aXRsZSIsIiJdLFsiIiwibWF0Q2FyZFRpdGxlIiwiIl0sWyIiLCJtYXRDYXJkU3VidGl0bGUiLCIiXV0sIioiXSx0cD1bIlttYXQtY2FyZC1hdmF0YXJdLCBbbWF0Q2FyZEF2YXRhcl0iLGBtYXQtY2FyZC10aXRsZSwgbWF0LWNhcmQtc3VidGl0bGUsCiAgICAgIFttYXQtY2FyZC10aXRsZV0sIFttYXQtY2FyZC1zdWJ0aXRsZV0sCiAgICAgIFttYXRDYXJkVGl0bGVdLCBbbWF0Q2FyZFN1YnRpdGxlXWAsIioiXSxlcD1uZXcgdigiTUFUX0NBUkRfQ09ORklHIiksRDA9KCgpPT57Y2xhc3MgaXthcHBlYXJhbmNlO2NvbnN0cnVjdG9yKCl7bGV0IHQ9bChlcCx7b3B0aW9uYWw6ITB9KTt0aGlzLmFwcGVhcmFuY2U9dD8uYXBwZWFyYW5jZXx8InJhaXNlZCJ9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1Y21wPVAoe3R5cGU6aSxzZWxlY3RvcnM6W1sibWF0LWNhcmQiXV0saG9zdEF0dHJzOlsxLCJtYXQtbWRjLWNhcmQiLCJtZGMtY2FyZCJdLGhvc3RWYXJzOjgsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGUscil7ZSYyJiZIKCJtYXQtbWRjLWNhcmQtb3V0bGluZWQiLHIuYXBwZWFyYW5jZT09PSJvdXRsaW5lZCIpKCJtZGMtY2FyZC0tb3V0bGluZWQiLHIuYXBwZWFyYW5jZT09PSJvdXRsaW5lZCIpKCJtYXQtbWRjLWNhcmQtZmlsbGVkIixyLmFwcGVhcmFuY2U9PT0iZmlsbGVkIikoIm1kYy1jYXJkLS1maWxsZWQiLHIuYXBwZWFyYW5jZT09PSJmaWxsZWQiKX0saW5wdXRzOnthcHBlYXJhbmNlOiJhcHBlYXJhbmNlIn0sZXhwb3J0QXM6WyJtYXRDYXJkIl0sbmdDb250ZW50U2VsZWN0b3JzOlFmLGRlY2xzOjEsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uKGUscil7ZSYxJiYoVHQoKSxVKDApKX0sc3R5bGVzOltgLm1hdC1tZGMtY2FyZHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjA7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtY2FyZC1lbGV2YXRlZC1jb250YWluZXItY29sb3IsIHZhcigtLW1hdC1zeXMtc3VyZmFjZS1jb250YWluZXItbG93KSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1jYXJkLWVsZXZhdGVkLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlLWNvbnRhaW5lci1sb3cpKTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1jYXJkLWVsZXZhdGVkLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItbWVkaXVtKSk7Ym94LXNoYWRvdzp2YXIoLS1tYXQtY2FyZC1lbGV2YXRlZC1jb250YWluZXItZWxldmF0aW9uLCB2YXIoLS1tYXQtc3lzLWxldmVsMSkpfS5tYXQtbWRjLWNhcmQ6OmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwwKTtjb250ZW50OiIiO2Rpc3BsYXk6YmxvY2s7cG9pbnRlci1ldmVudHM6bm9uZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYXQtY2FyZC1lbGV2YXRlZC1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLW1lZGl1bSkpfS5tYXQtbWRjLWNhcmQtb3V0bGluZWR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtY2FyZC1vdXRsaW5lZC1jb250YWluZXItY29sb3IsIHZhcigtLW1hdC1zeXMtc3VyZmFjZSkpO2JvcmRlci1yYWRpdXM6dmFyKC0tbWF0LWNhcmQtb3V0bGluZWQtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1tZWRpdW0pKTtib3JkZXItd2lkdGg6dmFyKC0tbWF0LWNhcmQtb3V0bGluZWQtb3V0bGluZS13aWR0aCwgMXB4KTtib3JkZXItY29sb3I6dmFyKC0tbWF0LWNhcmQtb3V0bGluZWQtb3V0bGluZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1vdXRsaW5lLXZhcmlhbnQpKTtib3gtc2hhZG93OnZhcigtLW1hdC1jYXJkLW91dGxpbmVkLWNvbnRhaW5lci1lbGV2YXRpb24sIHZhcigtLW1hdC1zeXMtbGV2ZWwwKSl9Lm1hdC1tZGMtY2FyZC1vdXRsaW5lZDo6YWZ0ZXJ7Ym9yZGVyOm5vbmV9Lm1hdC1tZGMtY2FyZC1maWxsZWR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtY2FyZC1maWxsZWQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXN1cmZhY2UtY29udGFpbmVyLWhpZ2hlc3QpKTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1jYXJkLWZpbGxlZC1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLW1lZGl1bSkpO2JveC1zaGFkb3c6dmFyKC0tbWF0LWNhcmQtZmlsbGVkLWNvbnRhaW5lci1lbGV2YXRpb24sIHZhcigtLW1hdC1zeXMtbGV2ZWwwKSl9Lm1kYy1jYXJkX19tZWRpYXtwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyO2JhY2tncm91bmQtc2l6ZTpjb3Zlcn0ubWRjLWNhcmRfX21lZGlhOjpiZWZvcmV7ZGlzcGxheTpibG9jaztjb250ZW50OiIifS5tZGMtY2FyZF9fbWVkaWE6Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czppbmhlcml0O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOmluaGVyaXR9Lm1kYy1jYXJkX19tZWRpYTpsYXN0LWNoaWxke2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6aW5oZXJpdDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czppbmhlcml0fS5tYXQtbWRjLWNhcmQtYWN0aW9uc3tkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWluLWhlaWdodDo1MnB4O3BhZGRpbmc6OHB4fS5tYXQtbWRjLWNhcmQtdGl0bGV7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LWNhcmQtdGl0bGUtdGV4dC1mb250LCB2YXIoLS1tYXQtc3lzLXRpdGxlLWxhcmdlLWZvbnQpKTtsaW5lLWhlaWdodDp2YXIoLS1tYXQtY2FyZC10aXRsZS10ZXh0LWxpbmUtaGVpZ2h0LCB2YXIoLS1tYXQtc3lzLXRpdGxlLWxhcmdlLWxpbmUtaGVpZ2h0KSk7Zm9udC1zaXplOnZhcigtLW1hdC1jYXJkLXRpdGxlLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy10aXRsZS1sYXJnZS1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LWNhcmQtdGl0bGUtdGV4dC10cmFja2luZywgdmFyKC0tbWF0LXN5cy10aXRsZS1sYXJnZS10cmFja2luZykpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hdC1jYXJkLXRpdGxlLXRleHQtd2VpZ2h0LCB2YXIoLS1tYXQtc3lzLXRpdGxlLWxhcmdlLXdlaWdodCkpfS5tYXQtbWRjLWNhcmQtc3VidGl0bGV7Y29sb3I6dmFyKC0tbWF0LWNhcmQtc3VidGl0bGUtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSk7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LWNhcmQtc3VidGl0bGUtdGV4dC1mb250LCB2YXIoLS1tYXQtc3lzLXRpdGxlLW1lZGl1bS1mb250KSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LWNhcmQtc3VidGl0bGUtdGV4dC1saW5lLWhlaWdodCwgdmFyKC0tbWF0LXN5cy10aXRsZS1tZWRpdW0tbGluZS1oZWlnaHQpKTtmb250LXNpemU6dmFyKC0tbWF0LWNhcmQtc3VidGl0bGUtdGV4dC1zaXplLCB2YXIoLS1tYXQtc3lzLXRpdGxlLW1lZGl1bS1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LWNhcmQtc3VidGl0bGUtdGV4dC10cmFja2luZywgdmFyKC0tbWF0LXN5cy10aXRsZS1tZWRpdW0tdHJhY2tpbmcpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtY2FyZC1zdWJ0aXRsZS10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy10aXRsZS1tZWRpdW0td2VpZ2h0KSl9Lm1hdC1tZGMtY2FyZC10aXRsZSwubWF0LW1kYy1jYXJkLXN1YnRpdGxle2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjB9Lm1hdC1tZGMtY2FyZC1hdmF0YXJ+Lm1hdC1tZGMtY2FyZC1oZWFkZXItdGV4dCAubWF0LW1kYy1jYXJkLXRpdGxlLC5tYXQtbWRjLWNhcmQtYXZhdGFyfi5tYXQtbWRjLWNhcmQtaGVhZGVyLXRleHQgLm1hdC1tZGMtY2FyZC1zdWJ0aXRsZXtwYWRkaW5nOjE2cHggMTZweCAwfS5tYXQtbWRjLWNhcmQtaGVhZGVye2Rpc3BsYXk6ZmxleDtwYWRkaW5nOjE2cHggMTZweCAwfS5tYXQtbWRjLWNhcmQtY29udGVudHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MCAxNnB4fS5tYXQtbWRjLWNhcmQtY29udGVudDpmaXJzdC1jaGlsZHtwYWRkaW5nLXRvcDoxNnB4fS5tYXQtbWRjLWNhcmQtY29udGVudDpsYXN0LWNoaWxke3BhZGRpbmctYm90dG9tOjE2cHh9Lm1hdC1tZGMtY2FyZC10aXRsZS1ncm91cHtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47d2lkdGg6MTAwJX0ubWF0LW1kYy1jYXJkLWF2YXRhcntoZWlnaHQ6NDBweDt3aWR0aDo0MHB4O2JvcmRlci1yYWRpdXM6NTAlO2ZsZXgtc2hyaW5rOjA7bWFyZ2luLWJvdHRvbToxNnB4O29iamVjdC1maXQ6Y292ZXJ9Lm1hdC1tZGMtY2FyZC1hdmF0YXJ+Lm1hdC1tZGMtY2FyZC1oZWFkZXItdGV4dCAubWF0LW1kYy1jYXJkLXN1YnRpdGxlLC5tYXQtbWRjLWNhcmQtYXZhdGFyfi5tYXQtbWRjLWNhcmQtaGVhZGVyLXRleHQgLm1hdC1tZGMtY2FyZC10aXRsZXtsaW5lLWhlaWdodDpub3JtYWx9Lm1hdC1tZGMtY2FyZC1zbS1pbWFnZXt3aWR0aDo4MHB4O2hlaWdodDo4MHB4fS5tYXQtbWRjLWNhcmQtbWQtaW1hZ2V7d2lkdGg6MTEycHg7aGVpZ2h0OjExMnB4fS5tYXQtbWRjLWNhcmQtbGctaW1hZ2V7d2lkdGg6MTUycHg7aGVpZ2h0OjE1MnB4fS5tYXQtbWRjLWNhcmQteGwtaW1hZ2V7d2lkdGg6MjQwcHg7aGVpZ2h0OjI0MHB4fS5tYXQtbWRjLWNhcmQtc3VidGl0bGV+Lm1hdC1tZGMtY2FyZC10aXRsZSwubWF0LW1kYy1jYXJkLXRpdGxlfi5tYXQtbWRjLWNhcmQtc3VidGl0bGUsLm1hdC1tZGMtY2FyZC1oZWFkZXIgLm1hdC1tZGMtY2FyZC1oZWFkZXItdGV4dCAubWF0LW1kYy1jYXJkLXRpdGxlLC5tYXQtbWRjLWNhcmQtaGVhZGVyIC5tYXQtbWRjLWNhcmQtaGVhZGVyLXRleHQgLm1hdC1tZGMtY2FyZC1zdWJ0aXRsZSwubWF0LW1kYy1jYXJkLXRpdGxlLWdyb3VwIC5tYXQtbWRjLWNhcmQtdGl0bGUsLm1hdC1tZGMtY2FyZC10aXRsZS1ncm91cCAubWF0LW1kYy1jYXJkLXN1YnRpdGxle3BhZGRpbmctdG9wOjB9Lm1hdC1tZGMtY2FyZC1jb250ZW50PjpsYXN0LWNoaWxkOm5vdCgubWF0LW1kYy1jYXJkLWZvb3Rlcil7bWFyZ2luLWJvdHRvbTowfS5tYXQtbWRjLWNhcmQtYWN0aW9ucy1hbGlnbi1lbmR7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gaX0pKCksUjA9KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyJtYXQtY2FyZC10aXRsZSJdLFsiIiwibWF0LWNhcmQtdGl0bGUiLCIiXSxbIiIsIm1hdENhcmRUaXRsZSIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtY2FyZC10aXRsZSJdfSl9cmV0dXJuIGl9KSgpLEEwPSgoKT0+e2NsYXNzIGl7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1sibWF0LWNhcmQtY29udGVudCJdXSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtY2FyZC1jb250ZW50Il19KX1yZXR1cm4gaX0pKCksTTA9KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyJtYXQtY2FyZC1zdWJ0aXRsZSJdLFsiIiwibWF0LWNhcmQtc3VidGl0bGUiLCIiXSxbIiIsIm1hdENhcmRTdWJ0aXRsZSIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtY2FyZC1zdWJ0aXRsZSJdfSl9cmV0dXJuIGl9KSgpLEkwPSgoKT0+e2NsYXNzIGl7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1Y21wPVAoe3R5cGU6aSxzZWxlY3RvcnM6W1sibWF0LWNhcmQtaGVhZGVyIl1dLGhvc3RBdHRyczpbMSwibWF0LW1kYy1jYXJkLWhlYWRlciJdLG5nQ29udGVudFNlbGVjdG9yczp0cCxkZWNsczo0LHZhcnM6MCxjb25zdHM6W1sxLCJtYXQtbWRjLWNhcmQtaGVhZGVyLXRleHQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oZSxyKXtlJjEmJihUdChKZiksVSgwKSxrZSgxLCJkaXYiLDApLFUoMiwxKSxUZSgpLFUoMywyKSl9LGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiBpfSkoKSxPMD0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWRpcj1wKHt0eXBlOmksc2VsZWN0b3JzOltbIiIsIm1hdC1jYXJkLWltYWdlIiwiIl0sWyIiLCJtYXRDYXJkSW1hZ2UiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtbWRjLWNhcmQtaW1hZ2UiLCJtZGMtY2FyZF9fbWVkaWEiXX0pfXJldHVybiBpfSkoKSxrMD0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NW1vZD1SKHt0eXBlOml9KTtzdGF0aWMgXHUwMjc1aW5qPVMoe2ltcG9ydHM6W1gsWF19KX1yZXR1cm4gaX0pKCl9KTtmdW5jdGlvbiBucChpLG4pe2lmKGkmMSl7bGV0IHQ9S24oKTtjdCgwLCJkaXYiLDEpKDEsImJ1dHRvbiIsMiksZHQoImNsaWNrIixmdW5jdGlvbigpe1VuKHQpO2xldCByPUh0KCk7cmV0dXJuIEhuKHIuYWN0aW9uKCkpfSksV2koMikscnQoKSgpfWlmKGkmMil7bGV0IHQ9SHQoKTtxKDIpLEJvKCIgIix0LmRhdGEuYWN0aW9uLCIgIil9fWZ1bmN0aW9uIG9wKGksbil7fWZ1bmN0aW9uIHVwKCl7cmV0dXJuIG5ldyBGaX12YXIgcnAsYXAsT24sSmQsRmksc3AsbHAsY3AsdHUsZ3MsdnMsZHAsaHAsX3MsUTAsZXU9XygoKT0+e2YoKTtmKCk7bnQoKTtRZCgpO3FlKCk7T2koKTtWYSgpO1RpKCk7WmEoKTtRYygpO2h0KCk7d2UoKTtycD1bImxhYmVsIl07YXA9TWF0aC5wb3coMiwzMSktMSxPbj1jbGFzc3tfb3ZlcmxheVJlZjtpbnN0YW5jZTtjb250YWluZXJJbnN0YW5jZTtfYWZ0ZXJEaXNtaXNzZWQ9bmV3IHk7X2FmdGVyT3BlbmVkPW5ldyB5O19vbkFjdGlvbj1uZXcgeTtfZHVyYXRpb25UaW1lb3V0SWQ7X2Rpc21pc3NlZEJ5QWN0aW9uPSExO2NvbnN0cnVjdG9yKG4sdCl7dGhpcy5fb3ZlcmxheVJlZj10LHRoaXMuY29udGFpbmVySW5zdGFuY2U9bixuLl9vbkV4aXQuc3Vic2NyaWJlKCgpPT50aGlzLl9maW5pc2hEaXNtaXNzKCkpfWRpc21pc3MoKXt0aGlzLl9hZnRlckRpc21pc3NlZC5jbG9zZWR8fHRoaXMuY29udGFpbmVySW5zdGFuY2UuZXhpdCgpLGNsZWFyVGltZW91dCh0aGlzLl9kdXJhdGlvblRpbWVvdXRJZCl9ZGlzbWlzc1dpdGhBY3Rpb24oKXt0aGlzLl9vbkFjdGlvbi5jbG9zZWR8fCh0aGlzLl9kaXNtaXNzZWRCeUFjdGlvbj0hMCx0aGlzLl9vbkFjdGlvbi5uZXh0KCksdGhpcy5fb25BY3Rpb24uY29tcGxldGUoKSx0aGlzLmRpc21pc3MoKSksY2xlYXJUaW1lb3V0KHRoaXMuX2R1cmF0aW9uVGltZW91dElkKX1jbG9zZVdpdGhBY3Rpb24oKXt0aGlzLmRpc21pc3NXaXRoQWN0aW9uKCl9X2Rpc21pc3NBZnRlcihuKXt0aGlzLl9kdXJhdGlvblRpbWVvdXRJZD1zZXRUaW1lb3V0KCgpPT50aGlzLmRpc21pc3MoKSxNYXRoLm1pbihuLGFwKSl9X29wZW4oKXt0aGlzLl9hZnRlck9wZW5lZC5jbG9zZWR8fCh0aGlzLl9hZnRlck9wZW5lZC5uZXh0KCksdGhpcy5fYWZ0ZXJPcGVuZWQuY29tcGxldGUoKSl9X2ZpbmlzaERpc21pc3MoKXt0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKSx0aGlzLl9vbkFjdGlvbi5jbG9zZWR8fHRoaXMuX29uQWN0aW9uLmNvbXBsZXRlKCksdGhpcy5fYWZ0ZXJEaXNtaXNzZWQubmV4dCh7ZGlzbWlzc2VkQnlBY3Rpb246dGhpcy5fZGlzbWlzc2VkQnlBY3Rpb259KSx0aGlzLl9hZnRlckRpc21pc3NlZC5jb21wbGV0ZSgpLHRoaXMuX2Rpc21pc3NlZEJ5QWN0aW9uPSExfWFmdGVyRGlzbWlzc2VkKCl7cmV0dXJuIHRoaXMuX2FmdGVyRGlzbWlzc2VkfWFmdGVyT3BlbmVkKCl7cmV0dXJuIHRoaXMuY29udGFpbmVySW5zdGFuY2UuX29uRW50ZXJ9b25BY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25BY3Rpb259fSxKZD1uZXcgdigiTWF0U25hY2tCYXJEYXRhIiksRmk9Y2xhc3N7cG9saXRlbmVzcz0icG9saXRlIjthbm5vdW5jZW1lbnRNZXNzYWdlPSIiO3ZpZXdDb250YWluZXJSZWY7ZHVyYXRpb249MDtwYW5lbENsYXNzO2RpcmVjdGlvbjtkYXRhPW51bGw7aG9yaXpvbnRhbFBvc2l0aW9uPSJjZW50ZXIiO3ZlcnRpY2FsUG9zaXRpb249ImJvdHRvbSJ9LHNwPSgoKT0+e2NsYXNzIGl7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwibWF0U25hY2tCYXJMYWJlbCIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtc25hY2stYmFyLWxhYmVsIiwibWRjLXNuYWNrYmFyX19sYWJlbCJdfSl9cmV0dXJuIGl9KSgpLGxwPSgoKT0+e2NsYXNzIGl7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwibWF0U25hY2tCYXJBY3Rpb25zIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LW1kYy1zbmFjay1iYXItYWN0aW9ucyIsIm1kYy1zbmFja2Jhcl9fYWN0aW9ucyJdfSl9cmV0dXJuIGl9KSgpLGNwPSgoKT0+e2NsYXNzIGl7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwibWF0U25hY2tCYXJBY3Rpb24iLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtbWRjLXNuYWNrLWJhci1hY3Rpb24iLCJtZGMtc25hY2tiYXJfX2FjdGlvbiJdfSl9cmV0dXJuIGl9KSgpLHR1PSgoKT0+e2NsYXNzIGl7c25hY2tCYXJSZWY9bChPbik7ZGF0YT1sKEpkKTtjb25zdHJ1Y3Rvcigpe31hY3Rpb24oKXt0aGlzLnNuYWNrQmFyUmVmLmRpc21pc3NXaXRoQWN0aW9uKCl9Z2V0IGhhc0FjdGlvbigpe3JldHVybiEhdGhpcy5kYXRhLmFjdGlvbn1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVjbXA9UCh7dHlwZTppLHNlbGVjdG9yczpbWyJzaW1wbGUtc25hY2stYmFyIl1dLGhvc3RBdHRyczpbMSwibWF0LW1kYy1zaW1wbGUtc25hY2stYmFyIl0sZXhwb3J0QXM6WyJtYXRTbmFja0JhciJdLGRlY2xzOjMsdmFyczoyLGNvbnN0czpbWyJtYXRTbmFja0JhckxhYmVsIiwiIl0sWyJtYXRTbmFja0JhckFjdGlvbnMiLCIiXSxbIm1hdEJ1dHRvbiIsIiIsIm1hdFNuYWNrQmFyQWN0aW9uIiwiIiwzLCJjbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihlLHIpe2UmMSYmKGN0KDAsImRpdiIsMCksV2koMSkscnQoKSx2dCgyLG5wLDMsMSwiZGl2IiwxKSksZSYyJiYocSgpLEJvKCIgIixyLmRhdGEubWVzc2FnZSxgCmApLHEoKSxfdChyLmhhc0FjdGlvbj8yOi0xKSl9LGRlcGVuZGVuY2llczpbWmQsc3AsbHAsY3BdLHN0eWxlczpbYC5tYXQtbWRjLXNpbXBsZS1zbmFjay1iYXJ7ZGlzcGxheTpmbGV4fS5tYXQtbWRjLXNpbXBsZS1zbmFjay1iYXIgLm1hdC1tZGMtc25hY2stYmFyLWxhYmVse21heC1oZWlnaHQ6NTB2aDtvdmVyZmxvdzphdXRvfQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gaX0pKCksZ3M9Il9tYXQtc25hY2stYmFyLWVudGVyIix2cz0iX21hdC1zbmFjay1iYXItZXhpdCIsZHA9KCgpPT57Y2xhc3MgaSBleHRlbmRzIFJpe19uZ1pvbmU9bChFKTtfZWxlbWVudFJlZj1sKEQpO19jaGFuZ2VEZXRlY3RvclJlZj1sKEF0KTtfcGxhdGZvcm09bChUKTtfYW5pbWF0aW9uc0Rpc2FibGVkPUd0KCk7c25hY2tCYXJDb25maWc9bChGaSk7X2RvY3VtZW50PWwoTyk7X3RyYWNrZWRNb2RhbHM9bmV3IFNldDtfZW50ZXJGYWxsYmFjaztfZXhpdEZhbGxiYWNrO19pbmplY3Rvcj1sKE4pO19hbm5vdW5jZURlbGF5PTE1MDtfYW5ub3VuY2VUaW1lb3V0SWQ7X2Rlc3Ryb3llZD0hMTtfcG9ydGFsT3V0bGV0O19vbkFubm91bmNlPW5ldyB5O19vbkV4aXQ9bmV3IHk7X29uRW50ZXI9bmV3IHk7X2FuaW1hdGlvblN0YXRlPSJ2b2lkIjtfbGl2ZTtfbGFiZWw7X3JvbGU7X2xpdmVFbGVtZW50SWQ9bChXdCkuZ2V0SWQoIm1hdC1zbmFjay1iYXItY29udGFpbmVyLWxpdmUtIik7Y29uc3RydWN0b3IoKXtzdXBlcigpO2xldCB0PXRoaXMuc25hY2tCYXJDb25maWc7dC5wb2xpdGVuZXNzPT09ImFzc2VydGl2ZSImJiF0LmFubm91bmNlbWVudE1lc3NhZ2U/dGhpcy5fbGl2ZT0iYXNzZXJ0aXZlIjp0LnBvbGl0ZW5lc3M9PT0ib2ZmIj90aGlzLl9saXZlPSJvZmYiOnRoaXMuX2xpdmU9InBvbGl0ZSIsdGhpcy5fcGxhdGZvcm0uRklSRUZPWCYmKHRoaXMuX2xpdmU9PT0icG9saXRlIiYmKHRoaXMuX3JvbGU9InN0YXR1cyIpLHRoaXMuX2xpdmU9PT0iYXNzZXJ0aXZlIiYmKHRoaXMuX3JvbGU9ImFsZXJ0IikpfWF0dGFjaENvbXBvbmVudFBvcnRhbCh0KXt0aGlzLl9hc3NlcnROb3RBdHRhY2hlZCgpO2xldCBlPXRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2hDb21wb25lbnRQb3J0YWwodCk7cmV0dXJuIHRoaXMuX2FmdGVyUG9ydGFsQXR0YWNoZWQoKSxlfWF0dGFjaFRlbXBsYXRlUG9ydGFsKHQpe3RoaXMuX2Fzc2VydE5vdEF0dGFjaGVkKCk7bGV0IGU9dGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaFRlbXBsYXRlUG9ydGFsKHQpO3JldHVybiB0aGlzLl9hZnRlclBvcnRhbEF0dGFjaGVkKCksZX1hdHRhY2hEb21Qb3J0YWw9dD0+e3RoaXMuX2Fzc2VydE5vdEF0dGFjaGVkKCk7bGV0IGU9dGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaERvbVBvcnRhbCh0KTtyZXR1cm4gdGhpcy5fYWZ0ZXJQb3J0YWxBdHRhY2hlZCgpLGV9O29uQW5pbWF0aW9uRW5kKHQpe3Q9PT12cz90aGlzLl9jb21wbGV0ZUV4aXQoKTp0PT09Z3MmJihjbGVhclRpbWVvdXQodGhpcy5fZW50ZXJGYWxsYmFjayksdGhpcy5fbmdab25lLnJ1bigoKT0+e3RoaXMuX29uRW50ZXIubmV4dCgpLHRoaXMuX29uRW50ZXIuY29tcGxldGUoKX0pKX1lbnRlcigpe3RoaXMuX2Rlc3Ryb3llZHx8KHRoaXMuX2FuaW1hdGlvblN0YXRlPSJ2aXNpYmxlIix0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCksdGhpcy5fc2NyZWVuUmVhZGVyQW5ub3VuY2UoKSx0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQ/T3QoKCk9Pnt0aGlzLl9uZ1pvbmUucnVuKCgpPT5xdWV1ZU1pY3JvdGFzaygoKT0+dGhpcy5vbkFuaW1hdGlvbkVuZChncykpKX0se2luamVjdG9yOnRoaXMuX2luamVjdG9yfSk6KGNsZWFyVGltZW91dCh0aGlzLl9lbnRlckZhbGxiYWNrKSx0aGlzLl9lbnRlckZhbGxiYWNrPXNldFRpbWVvdXQoKCk9Pnt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgibWF0LXNuYWNrLWJhci1mYWxsYmFjay12aXNpYmxlIiksdGhpcy5vbkFuaW1hdGlvbkVuZChncyl9LDIwMCkpKX1leGl0KCl7cmV0dXJuIHRoaXMuX2Rlc3Ryb3llZD9nKHZvaWQgMCk6KHRoaXMuX25nWm9uZS5ydW4oKCk9Pnt0aGlzLl9hbmltYXRpb25TdGF0ZT0iaGlkZGVuIix0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJtYXQtZXhpdCIsIiIpLGNsZWFyVGltZW91dCh0aGlzLl9hbm5vdW5jZVRpbWVvdXRJZCksdGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkP090KCgpPT57dGhpcy5fbmdab25lLnJ1bigoKT0+cXVldWVNaWNyb3Rhc2soKCk9PnRoaXMub25BbmltYXRpb25FbmQodnMpKSl9LHtpbmplY3Rvcjp0aGlzLl9pbmplY3Rvcn0pOihjbGVhclRpbWVvdXQodGhpcy5fZXhpdEZhbGxiYWNrKSx0aGlzLl9leGl0RmFsbGJhY2s9c2V0VGltZW91dCgoKT0+dGhpcy5vbkFuaW1hdGlvbkVuZCh2cyksMjAwKSl9KSx0aGlzLl9vbkV4aXQpfW5nT25EZXN0cm95KCl7dGhpcy5fZGVzdHJveWVkPSEwLHRoaXMuX2NsZWFyRnJvbU1vZGFscygpLHRoaXMuX2NvbXBsZXRlRXhpdCgpfV9jb21wbGV0ZUV4aXQoKXtjbGVhclRpbWVvdXQodGhpcy5fZXhpdEZhbGxiYWNrKSxxdWV1ZU1pY3JvdGFzaygoKT0+e3RoaXMuX29uRXhpdC5uZXh0KCksdGhpcy5fb25FeGl0LmNvbXBsZXRlKCl9KX1fYWZ0ZXJQb3J0YWxBdHRhY2hlZCgpe2xldCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxlPXRoaXMuc25hY2tCYXJDb25maWcucGFuZWxDbGFzcztlJiYoQXJyYXkuaXNBcnJheShlKT9lLmZvckVhY2goYT0+dC5jbGFzc0xpc3QuYWRkKGEpKTp0LmNsYXNzTGlzdC5hZGQoZSkpLHRoaXMuX2V4cG9zZVRvTW9kYWxzKCk7bGV0IHI9dGhpcy5fbGFiZWwubmF0aXZlRWxlbWVudCxvPSJtZGMtc25hY2tiYXJfX2xhYmVsIjtyLmNsYXNzTGlzdC50b2dnbGUobywhci5xdWVyeVNlbGVjdG9yKGAuJHtvfWApKX1fZXhwb3NlVG9Nb2RhbHMoKXtsZXQgdD10aGlzLl9saXZlRWxlbWVudElkLGU9dGhpcy5fZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSA+IC5jZGstb3ZlcmxheS1jb250YWluZXIgW2FyaWEtbW9kYWw9InRydWUiXScpO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXtsZXQgbz1lW3JdLGE9by5nZXRBdHRyaWJ1dGUoImFyaWEtb3ducyIpO3RoaXMuX3RyYWNrZWRNb2RhbHMuYWRkKG8pLGE/YS5pbmRleE9mKHQpPT09LTEmJm8uc2V0QXR0cmlidXRlKCJhcmlhLW93bnMiLGErIiAiK3QpOm8uc2V0QXR0cmlidXRlKCJhcmlhLW93bnMiLHQpfX1fY2xlYXJGcm9tTW9kYWxzKCl7dGhpcy5fdHJhY2tlZE1vZGFscy5mb3JFYWNoKHQ9PntsZXQgZT10LmdldEF0dHJpYnV0ZSgiYXJpYS1vd25zIik7aWYoZSl7bGV0IHI9ZS5yZXBsYWNlKHRoaXMuX2xpdmVFbGVtZW50SWQsIiIpLnRyaW0oKTtyLmxlbmd0aD4wP3Quc2V0QXR0cmlidXRlKCJhcmlhLW93bnMiLHIpOnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLW93bnMiKX19KSx0aGlzLl90cmFja2VkTW9kYWxzLmNsZWFyKCl9X2Fzc2VydE5vdEF0dGFjaGVkKCl7dGhpcy5fcG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCl9X3NjcmVlblJlYWRlckFubm91bmNlKCl7dGhpcy5fYW5ub3VuY2VUaW1lb3V0SWR8fHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e3RoaXMuX2Fubm91bmNlVGltZW91dElkPXNldFRpbWVvdXQoKCk9PntpZih0aGlzLl9kZXN0cm95ZWQpcmV0dXJuO2xldCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxlPXQucXVlcnlTZWxlY3RvcigiW2FyaWEtaGlkZGVuXSIpLHI9dC5xdWVyeVNlbGVjdG9yKCJbYXJpYS1saXZlXSIpO2lmKGUmJnIpe2xldCBvPW51bGw7dGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmUuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkmJihvPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLGUucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpLHIuYXBwZW5kQ2hpbGQoZSksbz8uZm9jdXMoKSx0aGlzLl9vbkFubm91bmNlLm5leHQoKSx0aGlzLl9vbkFubm91bmNlLmNvbXBsZXRlKCl9fSx0aGlzLl9hbm5vdW5jZURlbGF5KX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWNtcD1QKHt0eXBlOmksc2VsZWN0b3JzOltbIm1hdC1zbmFjay1iYXItY29udGFpbmVyIl1dLHZpZXdRdWVyeTpmdW5jdGlvbihlLHIpe2lmKGUmMSYmKFJ0KExhLDcpLFJ0KHJwLDcpKSxlJjIpe2xldCBvO2V0KG89aXQoKSkmJihyLl9wb3J0YWxPdXRsZXQ9by5maXJzdCksZXQobz1pdCgpKSYmKHIuX2xhYmVsPW8uZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtZGMtc25hY2tiYXIiLCJtYXQtbWRjLXNuYWNrLWJhci1jb250YWluZXIiXSxob3N0VmFyczo2LGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMSYmZHQoImFuaW1hdGlvbmVuZCIsZnVuY3Rpb24oYSl7cmV0dXJuIHIub25BbmltYXRpb25FbmQoYS5hbmltYXRpb25OYW1lKX0pKCJhbmltYXRpb25jYW5jZWwiLGZ1bmN0aW9uKGEpe3JldHVybiByLm9uQW5pbWF0aW9uRW5kKGEuYW5pbWF0aW9uTmFtZSl9KSxlJjImJkgoIm1hdC1zbmFjay1iYXItY29udGFpbmVyLWVudGVyIixyLl9hbmltYXRpb25TdGF0ZT09PSJ2aXNpYmxlIikoIm1hdC1zbmFjay1iYXItY29udGFpbmVyLWV4aXQiLHIuX2FuaW1hdGlvblN0YXRlPT09ImhpZGRlbiIpKCJtYXQtc25hY2stYmFyLWNvbnRhaW5lci1hbmltYXRpb25zLWVuYWJsZWQiLCFyLl9hbmltYXRpb25zRGlzYWJsZWQpfSxmZWF0dXJlczpbTF0sZGVjbHM6Nix2YXJzOjMsY29uc3RzOltbImxhYmVsIiwiIl0sWzEsIm1kYy1zbmFja2Jhcl9fc3VyZmFjZSIsIm1hdC1tZGMtc25hY2tiYXItc3VyZmFjZSJdLFsxLCJtYXQtbWRjLXNuYWNrLWJhci1sYWJlbCJdLFsiYXJpYS1oaWRkZW4iLCJ0cnVlIl0sWyJjZGtQb3J0YWxPdXRsZXQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oZSxyKXtlJjEmJihjdCgwLCJkaXYiLDEpKDEsImRpdiIsMiwwKSgzLCJkaXYiLDMpLGVpKDQsb3AsMCwwLCJuZy10ZW1wbGF0ZSIsNCkscnQoKSxuZSg1LCJkaXYiKSxydCgpKCkpLGUmMiYmKHEoNSksdHQoImFyaWEtbGl2ZSIsci5fbGl2ZSkoInJvbGUiLHIuX3JvbGUpKCJpZCIsci5fbGl2ZUVsZW1lbnRJZCkpfSxkZXBlbmRlbmNpZXM6W0xhXSxzdHlsZXM6W2BAa2V5ZnJhbWVzIF9tYXQtc25hY2stYmFyLWVudGVye2Zyb217dHJhbnNmb3JtOnNjYWxlKDAuOCk7b3BhY2l0eTowfXRve3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgX21hdC1zbmFjay1iYXItZXhpdHtmcm9te29wYWNpdHk6MX10b3tvcGFjaXR5OjB9fS5tYXQtbWRjLXNuYWNrLWJhci1jb250YWluZXJ7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKTttYXJnaW46OHB4fS5tYXQtbWRjLXNuYWNrLWJhci1oYW5kc2V0IC5tYXQtbWRjLXNuYWNrLWJhci1jb250YWluZXJ7d2lkdGg6MTAwdnd9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyLWFuaW1hdGlvbnMtZW5hYmxlZHtvcGFjaXR5OjB9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyLWFuaW1hdGlvbnMtZW5hYmxlZC5tYXQtc25hY2stYmFyLWZhbGxiYWNrLXZpc2libGV7b3BhY2l0eToxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lci1hbmltYXRpb25zLWVuYWJsZWQubWF0LXNuYWNrLWJhci1jb250YWluZXItZW50ZXJ7YW5pbWF0aW9uOl9tYXQtc25hY2stYmFyLWVudGVyIDE1MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpIGZvcndhcmRzfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lci1hbmltYXRpb25zLWVuYWJsZWQubWF0LXNuYWNrLWJhci1jb250YWluZXItZXhpdHthbmltYXRpb246X21hdC1zbmFjay1iYXItZXhpdCA3NW1zIGN1YmljLWJlemllcigwLjQsIDAsIDEsIDEpIGZvcndhcmRzfS5tYXQtbWRjLXNuYWNrYmFyLXN1cmZhY2V7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDo4cHh9W2Rpcj1ydGxdIC5tYXQtbWRjLXNuYWNrYmFyLXN1cmZhY2V7cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDo4cHh9Lm1hdC1tZGMtc25hY2stYmFyLWNvbnRhaW5lciAubWF0LW1kYy1zbmFja2Jhci1zdXJmYWNle21pbi13aWR0aDozNDRweDttYXgtd2lkdGg6NjcycHh9Lm1hdC1tZGMtc25hY2stYmFyLWhhbmRzZXQgLm1hdC1tZGMtc25hY2tiYXItc3VyZmFjZXt3aWR0aDoxMDAlO21pbi13aWR0aDowfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtbWRjLXNuYWNrYmFyLXN1cmZhY2V7b3V0bGluZTpzb2xpZCAxcHh9fS5tYXQtbWRjLXNuYWNrLWJhci1jb250YWluZXIgLm1hdC1tZGMtc25hY2tiYXItc3VyZmFjZXtjb2xvcjp2YXIoLS1tYXQtc25hY2stYmFyLXN1cHBvcnRpbmctdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1pbnZlcnNlLW9uLXN1cmZhY2UpKTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1zbmFjay1iYXItY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1leHRyYS1zbWFsbCkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXNuYWNrLWJhci1jb250YWluZXItY29sb3IsIHZhcigtLW1hdC1zeXMtaW52ZXJzZS1zdXJmYWNlKSl9Lm1kYy1zbmFja2Jhcl9fbGFiZWx7d2lkdGg6MTAwJTtmbGV4LWdyb3c6MTtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luOjA7cGFkZGluZzoxNHB4IDhweCAxNHB4IDE2cHh9W2Rpcj1ydGxdIC5tZGMtc25hY2tiYXJfX2xhYmVse3BhZGRpbmctbGVmdDo4cHg7cGFkZGluZy1yaWdodDoxNnB4fS5tYXQtbWRjLXNuYWNrLWJhci1jb250YWluZXIgLm1kYy1zbmFja2Jhcl9fbGFiZWx7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LXNuYWNrLWJhci1zdXBwb3J0aW5nLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1mb250KSk7Zm9udC1zaXplOnZhcigtLW1hdC1zbmFjay1iYXItc3VwcG9ydGluZy10ZXh0LXNpemUsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tc2l6ZSkpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hdC1zbmFjay1iYXItc3VwcG9ydGluZy10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS13ZWlnaHQpKTtsaW5lLWhlaWdodDp2YXIoLS1tYXQtc25hY2stYmFyLXN1cHBvcnRpbmctdGV4dC1saW5lLWhlaWdodCwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1saW5lLWhlaWdodCkpfS5tYXQtbWRjLXNuYWNrLWJhci1hY3Rpb25ze2Rpc3BsYXk6ZmxleDtmbGV4LXNocmluazowO2FsaWduLWl0ZW1zOmNlbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1tZGMtc25hY2stYmFyLWhhbmRzZXQsLm1hdC1tZGMtc25hY2stYmFyLWNvbnRhaW5lciwubWF0LW1kYy1zbmFjay1iYXItbGFiZWx7ZmxleDoxIDEgYXV0b30ubWF0LW1kYy1zbmFjay1iYXItY29udGFpbmVyIC5tYXQtbWRjLWJ1dHRvbi5tYXQtbWRjLXNuYWNrLWJhci1hY3Rpb246bm90KDpkaXNhYmxlZCl7LS1tYXQtYnV0dG9uLXRleHQtc3RhdGUtbGF5ZXItY29sb3I6IGN1cnJlbnRDb2xvcjstLW1hdC1idXR0b24tdGV4dC1yaXBwbGUtY29sb3I6IGN1cnJlbnRDb2xvcn0ubWF0LW1kYy1zbmFjay1iYXItY29udGFpbmVyIC5tYXQtbWRjLWJ1dHRvbi5tYXQtbWRjLXNuYWNrLWJhci1hY3Rpb246bm90KDpkaXNhYmxlZCkubWF0LXVudGhlbWVke2NvbG9yOnZhcigtLW1hdC1zbmFjay1iYXItYnV0dG9uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLWludmVyc2UtcHJpbWFyeSkpfS5tYXQtbWRjLXNuYWNrLWJhci1jb250YWluZXIgLm1hdC1tZGMtYnV0dG9uLm1hdC1tZGMtc25hY2stYmFyLWFjdGlvbjpub3QoOmRpc2FibGVkKSAubWF0LXJpcHBsZS1lbGVtZW50e29wYWNpdHk6LjF9CmBdLGVuY2Fwc3VsYXRpb246Mn0pfXJldHVybiBpfSkoKTtocD1uZXcgdigibWF0LXNuYWNrLWJhci1kZWZhdWx0LW9wdGlvbnMiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OnVwfSksX3M9KCgpPT57Y2xhc3MgaXtfbGl2ZT1sKGlzKTtfaW5qZWN0b3I9bChOKTtfYnJlYWtwb2ludE9ic2VydmVyPWwoeG4pO19wYXJlbnRTbmFja0Jhcj1sKGkse29wdGlvbmFsOiEwLHNraXBTZWxmOiEwfSk7X2RlZmF1bHRDb25maWc9bChocCk7X2FuaW1hdGlvbnNEaXNhYmxlZD1HdCgpO19zbmFja0JhclJlZkF0VGhpc0xldmVsPW51bGw7c2ltcGxlU25hY2tCYXJDb21wb25lbnQ9dHU7c25hY2tCYXJDb250YWluZXJDb21wb25lbnQ9ZHA7aGFuZHNldENzc0NsYXNzPSJtYXQtbWRjLXNuYWNrLWJhci1oYW5kc2V0IjtnZXQgX29wZW5lZFNuYWNrQmFyUmVmKCl7bGV0IHQ9dGhpcy5fcGFyZW50U25hY2tCYXI7cmV0dXJuIHQ/dC5fb3BlbmVkU25hY2tCYXJSZWY6dGhpcy5fc25hY2tCYXJSZWZBdFRoaXNMZXZlbH1zZXQgX29wZW5lZFNuYWNrQmFyUmVmKHQpe3RoaXMuX3BhcmVudFNuYWNrQmFyP3RoaXMuX3BhcmVudFNuYWNrQmFyLl9vcGVuZWRTbmFja0JhclJlZj10OnRoaXMuX3NuYWNrQmFyUmVmQXRUaGlzTGV2ZWw9dH1jb25zdHJ1Y3Rvcigpe31vcGVuRnJvbUNvbXBvbmVudCh0LGUpe3JldHVybiB0aGlzLl9hdHRhY2godCxlKX1vcGVuRnJvbVRlbXBsYXRlKHQsZSl7cmV0dXJuIHRoaXMuX2F0dGFjaCh0LGUpfW9wZW4odCxlPSIiLHIpe2xldCBvPWgoaCh7fSx0aGlzLl9kZWZhdWx0Q29uZmlnKSxyKTtyZXR1cm4gby5kYXRhPXttZXNzYWdlOnQsYWN0aW9uOmV9LG8uYW5ub3VuY2VtZW50TWVzc2FnZT09PXQmJihvLmFubm91bmNlbWVudE1lc3NhZ2U9dm9pZCAwKSx0aGlzLm9wZW5Gcm9tQ29tcG9uZW50KHRoaXMuc2ltcGxlU25hY2tCYXJDb21wb25lbnQsbyl9ZGlzbWlzcygpe3RoaXMuX29wZW5lZFNuYWNrQmFyUmVmJiZ0aGlzLl9vcGVuZWRTbmFja0JhclJlZi5kaXNtaXNzKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9zbmFja0JhclJlZkF0VGhpc0xldmVsJiZ0aGlzLl9zbmFja0JhclJlZkF0VGhpc0xldmVsLmRpc21pc3MoKX1fYXR0YWNoU25hY2tCYXJDb250YWluZXIodCxlKXtsZXQgcj1lJiZlLnZpZXdDb250YWluZXJSZWYmJmUudmlld0NvbnRhaW5lclJlZi5pbmplY3RvcixvPU4uY3JlYXRlKHtwYXJlbnQ6cnx8dGhpcy5faW5qZWN0b3IscHJvdmlkZXJzOlt7cHJvdmlkZTpGaSx1c2VWYWx1ZTplfV19KSxhPW5ldyBEaSh0aGlzLnNuYWNrQmFyQ29udGFpbmVyQ29tcG9uZW50LGUudmlld0NvbnRhaW5lclJlZixvKSxzPXQuYXR0YWNoKGEpO3JldHVybiBzLmluc3RhbmNlLnNuYWNrQmFyQ29uZmlnPWUscy5pbnN0YW5jZX1fYXR0YWNoKHQsZSl7bGV0IHI9aChoKGgoe30sbmV3IEZpKSx0aGlzLl9kZWZhdWx0Q29uZmlnKSxlKSxvPXRoaXMuX2NyZWF0ZU92ZXJsYXkociksYT10aGlzLl9hdHRhY2hTbmFja0JhckNvbnRhaW5lcihvLHIpLHM9bmV3IE9uKGEsbyk7aWYodCBpbnN0YW5jZW9mIE9lKXtsZXQgYz1uZXcgQ2UodCxudWxsLHskaW1wbGljaXQ6ci5kYXRhLHNuYWNrQmFyUmVmOnN9KTtzLmluc3RhbmNlPWEuYXR0YWNoVGVtcGxhdGVQb3J0YWwoYyl9ZWxzZXtsZXQgYz10aGlzLl9jcmVhdGVJbmplY3RvcihyLHMpLGQ9bmV3IERpKHQsdm9pZCAwLGMpLHU9YS5hdHRhY2hDb21wb25lbnRQb3J0YWwoZCk7cy5pbnN0YW5jZT11Lmluc3RhbmNlfXJldHVybiB0aGlzLl9icmVha3BvaW50T2JzZXJ2ZXIub2JzZXJ2ZShlZC5IYW5kc2V0UG9ydHJhaXQpLnBpcGUoRHQoby5kZXRhY2htZW50cygpKSkuc3Vic2NyaWJlKGM9PntvLm92ZXJsYXlFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUodGhpcy5oYW5kc2V0Q3NzQ2xhc3MsYy5tYXRjaGVzKX0pLHIuYW5ub3VuY2VtZW50TWVzc2FnZSYmYS5fb25Bbm5vdW5jZS5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9saXZlLmFubm91bmNlKHIuYW5ub3VuY2VtZW50TWVzc2FnZSxyLnBvbGl0ZW5lc3MpfSksdGhpcy5fYW5pbWF0ZVNuYWNrQmFyKHMsciksdGhpcy5fb3BlbmVkU25hY2tCYXJSZWY9cyx0aGlzLl9vcGVuZWRTbmFja0JhclJlZn1fYW5pbWF0ZVNuYWNrQmFyKHQsZSl7dC5hZnRlckRpc21pc3NlZCgpLnN1YnNjcmliZSgoKT0+e3RoaXMuX29wZW5lZFNuYWNrQmFyUmVmPT10JiYodGhpcy5fb3BlbmVkU25hY2tCYXJSZWY9bnVsbCksZS5hbm5vdW5jZW1lbnRNZXNzYWdlJiZ0aGlzLl9saXZlLmNsZWFyKCl9KSxlLmR1cmF0aW9uJiZlLmR1cmF0aW9uPjAmJnQuYWZ0ZXJPcGVuZWQoKS5zdWJzY3JpYmUoKCk9PnQuX2Rpc21pc3NBZnRlcihlLmR1cmF0aW9uKSksdGhpcy5fb3BlbmVkU25hY2tCYXJSZWY/KHRoaXMuX29wZW5lZFNuYWNrQmFyUmVmLmFmdGVyRGlzbWlzc2VkKCkuc3Vic2NyaWJlKCgpPT57dC5jb250YWluZXJJbnN0YW5jZS5lbnRlcigpfSksdGhpcy5fb3BlbmVkU25hY2tCYXJSZWYuZGlzbWlzcygpKTp0LmNvbnRhaW5lckluc3RhbmNlLmVudGVyKCl9X2NyZWF0ZU92ZXJsYXkodCl7bGV0IGU9bmV3IFdlO2UuZGlyZWN0aW9uPXQuZGlyZWN0aW9uO2xldCByPSRyKHRoaXMuX2luamVjdG9yKSxvPXQuZGlyZWN0aW9uPT09InJ0bCIsYT10Lmhvcml6b250YWxQb3NpdGlvbj09PSJsZWZ0Inx8dC5ob3Jpem9udGFsUG9zaXRpb249PT0ic3RhcnQiJiYhb3x8dC5ob3Jpem9udGFsUG9zaXRpb249PT0iZW5kIiYmbyxzPSFhJiZ0Lmhvcml6b250YWxQb3NpdGlvbiE9PSJjZW50ZXIiO3JldHVybiBhP3IubGVmdCgiMCIpOnM/ci5yaWdodCgiMCIpOnIuY2VudGVySG9yaXpvbnRhbGx5KCksdC52ZXJ0aWNhbFBvc2l0aW9uPT09InRvcCI/ci50b3AoIjAiKTpyLmJvdHRvbSgiMCIpLGUucG9zaXRpb25TdHJhdGVneT1yLGUuZGlzYWJsZUFuaW1hdGlvbnM9dGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkLENuKHRoaXMuX2luamVjdG9yLGUpfV9jcmVhdGVJbmplY3Rvcih0LGUpe2xldCByPXQmJnQudmlld0NvbnRhaW5lclJlZiYmdC52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yO3JldHVybiBOLmNyZWF0ZSh7cGFyZW50OnJ8fHRoaXMuX2luamVjdG9yLHByb3ZpZGVyczpbe3Byb3ZpZGU6T24sdXNlVmFsdWU6ZX0se3Byb3ZpZGU6SmQsdXNlVmFsdWU6dC5kYXRhfV19KX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKSxRMD0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NW1vZD1SKHt0eXBlOml9KTtzdGF0aWMgXHUwMjc1aW5qPVMoe3Byb3ZpZGVyczpbX3NdLGltcG9ydHM6W3FhLEZyLFhkLFgsdHUsWF19KX1yZXR1cm4gaX0pKCl9KTtmdW5jdGlvbiBncCgpe2xldCBpPXpvKCk/em8oKS5nZXRVc2VyQWdlbnQoKToiIjtyZXR1cm4vYW5kcm9pZCAoXGQrKS8udGVzdChpLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIHlzKGkpe3JldHVybiBpPT1udWxsfHxDcyhpKT09PTB9ZnVuY3Rpb24gQ3MoaSl7cmV0dXJuIGk9PW51bGw/bnVsbDpBcnJheS5pc0FycmF5KGkpfHx0eXBlb2YgaT09InN0cmluZyI/aS5sZW5ndGg6aSBpbnN0YW5jZW9mIFNldD9pLnNpemU6bnVsbH1mdW5jdGlvbiBicChpKXtyZXR1cm4gbj0+e2lmKG4udmFsdWU9PW51bGx8fGk9PW51bGwpcmV0dXJuIG51bGw7bGV0IHQ9cGFyc2VGbG9hdChuLnZhbHVlKTtyZXR1cm4haXNOYU4odCkmJnQ8aT97bWluOnttaW46aSxhY3R1YWw6bi52YWx1ZX19Om51bGx9fWZ1bmN0aW9uIHlwKGkpe3JldHVybiBuPT57aWYobi52YWx1ZT09bnVsbHx8aT09bnVsbClyZXR1cm4gbnVsbDtsZXQgdD1wYXJzZUZsb2F0KG4udmFsdWUpO3JldHVybiFpc05hTih0KSYmdD5pP3ttYXg6e21heDppLGFjdHVhbDpuLnZhbHVlfX06bnVsbH19ZnVuY3Rpb24gdXUoaSl7cmV0dXJuIHlzKGkudmFsdWUpP3tyZXF1aXJlZDohMH06bnVsbH1mdW5jdGlvbiBDcChpKXtyZXR1cm4gaS52YWx1ZT09PSEwP251bGw6e3JlcXVpcmVkOiEwfX1mdW5jdGlvbiB4cChpKXtyZXR1cm4geXMoaS52YWx1ZSl8fF9wLnRlc3QoaS52YWx1ZSk/bnVsbDp7ZW1haWw6ITB9fWZ1bmN0aW9uIGh1KGkpe3JldHVybiBuPT57bGV0IHQ9bi52YWx1ZT8ubGVuZ3RoPz9DcyhuLnZhbHVlKTtyZXR1cm4gdD09PW51bGx8fHQ9PT0wP251bGw6dDxpP3ttaW5sZW5ndGg6e3JlcXVpcmVkTGVuZ3RoOmksYWN0dWFsTGVuZ3RoOnR9fTpudWxsfX1mdW5jdGlvbiBtdShpKXtyZXR1cm4gbj0+e2xldCB0PW4udmFsdWU/Lmxlbmd0aD8/Q3Mobi52YWx1ZSk7cmV0dXJuIHQhPT1udWxsJiZ0Pmk/e21heGxlbmd0aDp7cmVxdWlyZWRMZW5ndGg6aSxhY3R1YWxMZW5ndGg6dH19Om51bGx9fWZ1bmN0aW9uIGZ1KGkpe2lmKCFpKXJldHVybiBzbztsZXQgbix0O3JldHVybiB0eXBlb2YgaT09InN0cmluZyI/KHQ9IiIsaS5jaGFyQXQoMCkhPT0iXiImJih0Kz0iXiIpLHQrPWksaS5jaGFyQXQoaS5sZW5ndGgtMSkhPT0iJCImJih0Kz0iJCIpLG49bmV3IFJlZ0V4cCh0KSk6KHQ9aS50b1N0cmluZygpLG49aSksZT0+e2lmKHlzKGUudmFsdWUpKXJldHVybiBudWxsO2xldCByPWUudmFsdWU7cmV0dXJuIG4udGVzdChyKT9udWxsOntwYXR0ZXJuOntyZXF1aXJlZFBhdHRlcm46dCxhY3R1YWxWYWx1ZTpyfX19fWZ1bmN0aW9uIHNvKGkpe3JldHVybiBudWxsfWZ1bmN0aW9uIHB1KGkpe3JldHVybiBpIT1udWxsfWZ1bmN0aW9uIGd1KGkpe3JldHVybiBZbihpKT9wdChpKTppfWZ1bmN0aW9uIHZ1KGkpe2xldCBuPXt9O3JldHVybiBpLmZvckVhY2godD0+e249dCE9bnVsbD9oKGgoe30sbiksdCk6bn0pLE9iamVjdC5rZXlzKG4pLmxlbmd0aD09PTA/bnVsbDpufWZ1bmN0aW9uIF91KGksbil7cmV0dXJuIG4ubWFwKHQ9PnQoaSkpfWZ1bmN0aW9uIHdwKGkpe3JldHVybiFpLnZhbGlkYXRlfWZ1bmN0aW9uIGJ1KGkpe3JldHVybiBpLm1hcChuPT53cChuKT9uOnQ9Pm4udmFsaWRhdGUodCkpfWZ1bmN0aW9uIHl1KGkpe2lmKCFpKXJldHVybiBudWxsO2xldCBuPWkuZmlsdGVyKHB1KTtyZXR1cm4gbi5sZW5ndGg9PTA/bnVsbDpmdW5jdGlvbih0KXtyZXR1cm4gdnUoX3UodCxuKSl9fWZ1bmN0aW9uIHhzKGkpe3JldHVybiBpIT1udWxsP3l1KGJ1KGkpKTpudWxsfWZ1bmN0aW9uIEN1KGkpe2lmKCFpKXJldHVybiBudWxsO2xldCBuPWkuZmlsdGVyKHB1KTtyZXR1cm4gbi5sZW5ndGg9PTA/bnVsbDpmdW5jdGlvbih0KXtsZXQgZT1fdSh0LG4pLm1hcChndSk7cmV0dXJuIFplKGUpLnBpcGUoYih2dSkpfX1mdW5jdGlvbiB3cyhpKXtyZXR1cm4gaSE9bnVsbD9DdShidShpKSk6bnVsbH1mdW5jdGlvbiBpdShpLG4pe3JldHVybiBpPT09bnVsbD9bbl06QXJyYXkuaXNBcnJheShpKT9bLi4uaSxuXTpbaSxuXX1mdW5jdGlvbiB4dShpKXtyZXR1cm4gaS5fcmF3VmFsaWRhdG9yc31mdW5jdGlvbiB3dShpKXtyZXR1cm4gaS5fcmF3QXN5bmNWYWxpZGF0b3JzfWZ1bmN0aW9uIGJzKGkpe3JldHVybiBpP0FycmF5LmlzQXJyYXkoaSk/aTpbaV06W119ZnVuY3Rpb24gbG8oaSxuKXtyZXR1cm4gQXJyYXkuaXNBcnJheShpKT9pLmluY2x1ZGVzKG4pOmk9PT1ufWZ1bmN0aW9uIG51KGksbil7bGV0IHQ9YnMobik7cmV0dXJuIGJzKGkpLmZvckVhY2gocj0+e2xvKHQscil8fHQucHVzaChyKX0pLHR9ZnVuY3Rpb24gcnUoaSxuKXtyZXR1cm4gYnMobikuZmlsdGVyKHQ9PiFsbyhpLHQpKX1mdW5jdGlvbiBFdShpKXtyZXR1cm4oYm8oaSk/aS52YWxpZGF0b3JzOmkpfHxudWxsfWZ1bmN0aW9uIFNwKGkpe3JldHVybiBBcnJheS5pc0FycmF5KGkpP3hzKGkpOml8fG51bGx9ZnVuY3Rpb24gU3UoaSxuKXtyZXR1cm4oYm8obik/bi5hc3luY1ZhbGlkYXRvcnM6aSl8fG51bGx9ZnVuY3Rpb24gRHAoaSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoaSk/d3MoaSk6aXx8bnVsbH1mdW5jdGlvbiBibyhpKXtyZXR1cm4gaSE9bnVsbCYmIUFycmF5LmlzQXJyYXkoaSkmJnR5cGVvZiBpPT0ib2JqZWN0In1mdW5jdGlvbiBScChpLG4sdCl7bGV0IGU9aS5jb250cm9scztpZighKG4/T2JqZWN0LmtleXMoZSk6ZSkubGVuZ3RoKXRocm93IG5ldyBRKDFlMywiIik7aWYoIWVbdF0pdGhyb3cgbmV3IFEoMTAwMSwiIil9ZnVuY3Rpb24gQXAoaSxuLHQpe2kuX2ZvckVhY2hDaGlsZCgoZSxyKT0+e2lmKHRbcl09PT12b2lkIDApdGhyb3cgbmV3IFEoMTAwMiwiIil9KX1mdW5jdGlvbiBEdShpLG4pe3JldHVyblsuLi5uLnBhdGgsaV19ZnVuY3Rpb24gVm4oaSxuLHQ9eW8pe0VzKGksbiksbi52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUoaS52YWx1ZSksKGkuZGlzYWJsZWR8fHQ9PT0iYWx3YXlzIikmJm4udmFsdWVBY2Nlc3Nvci5zZXREaXNhYmxlZFN0YXRlPy4oaS5kaXNhYmxlZCksSXAoaSxuKSxrcChpLG4pLE9wKGksbiksTXAoaSxuKX1mdW5jdGlvbiBnbyhpLG4sdD0hMCl7bGV0IGU9KCk9Pnt9O24udmFsdWVBY2Nlc3NvciYmKG4udmFsdWVBY2Nlc3Nvci5yZWdpc3Rlck9uQ2hhbmdlKGUpLG4udmFsdWVBY2Nlc3Nvci5yZWdpc3Rlck9uVG91Y2hlZChlKSksX28oaSxuKSxpJiYobi5faW52b2tlT25EZXN0cm95Q2FsbGJhY2tzKCksaS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKCk9Pnt9KSl9ZnVuY3Rpb24gdm8oaSxuKXtpLmZvckVhY2godD0+e3QucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSYmdC5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKG4pfSl9ZnVuY3Rpb24gTXAoaSxuKXtpZihuLnZhbHVlQWNjZXNzb3Iuc2V0RGlzYWJsZWRTdGF0ZSl7bGV0IHQ9ZT0+e24udmFsdWVBY2Nlc3Nvci5zZXREaXNhYmxlZFN0YXRlKGUpfTtpLnJlZ2lzdGVyT25EaXNhYmxlZENoYW5nZSh0KSxuLl9yZWdpc3Rlck9uRGVzdHJveSgoKT0+e2kuX3VucmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKHQpfSl9fWZ1bmN0aW9uIEVzKGksbil7bGV0IHQ9eHUoaSk7bi52YWxpZGF0b3IhPT1udWxsP2kuc2V0VmFsaWRhdG9ycyhpdSh0LG4udmFsaWRhdG9yKSk6dHlwZW9mIHQ9PSJmdW5jdGlvbiImJmkuc2V0VmFsaWRhdG9ycyhbdF0pO2xldCBlPXd1KGkpO24uYXN5bmNWYWxpZGF0b3IhPT1udWxsP2kuc2V0QXN5bmNWYWxpZGF0b3JzKGl1KGUsbi5hc3luY1ZhbGlkYXRvcikpOnR5cGVvZiBlPT0iZnVuY3Rpb24iJiZpLnNldEFzeW5jVmFsaWRhdG9ycyhbZV0pO2xldCByPSgpPT5pLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTt2byhuLl9yYXdWYWxpZGF0b3JzLHIpLHZvKG4uX3Jhd0FzeW5jVmFsaWRhdG9ycyxyKX1mdW5jdGlvbiBfbyhpLG4pe2xldCB0PSExO2lmKGkhPT1udWxsKXtpZihuLnZhbGlkYXRvciE9PW51bGwpe2xldCByPXh1KGkpO2lmKEFycmF5LmlzQXJyYXkocikmJnIubGVuZ3RoPjApe2xldCBvPXIuZmlsdGVyKGE9PmEhPT1uLnZhbGlkYXRvcik7by5sZW5ndGghPT1yLmxlbmd0aCYmKHQ9ITAsaS5zZXRWYWxpZGF0b3JzKG8pKX19aWYobi5hc3luY1ZhbGlkYXRvciE9PW51bGwpe2xldCByPXd1KGkpO2lmKEFycmF5LmlzQXJyYXkocikmJnIubGVuZ3RoPjApe2xldCBvPXIuZmlsdGVyKGE9PmEhPT1uLmFzeW5jVmFsaWRhdG9yKTtvLmxlbmd0aCE9PXIubGVuZ3RoJiYodD0hMCxpLnNldEFzeW5jVmFsaWRhdG9ycyhvKSl9fX1sZXQgZT0oKT0+e307cmV0dXJuIHZvKG4uX3Jhd1ZhbGlkYXRvcnMsZSksdm8obi5fcmF3QXN5bmNWYWxpZGF0b3JzLGUpLHR9ZnVuY3Rpb24gSXAoaSxuKXtuLnZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPbkNoYW5nZSh0PT57aS5fcGVuZGluZ1ZhbHVlPXQsaS5fcGVuZGluZ0NoYW5nZT0hMCxpLl9wZW5kaW5nRGlydHk9ITAsaS51cGRhdGVPbj09PSJjaGFuZ2UiJiZSdShpLG4pfSl9ZnVuY3Rpb24gT3AoaSxuKXtuLnZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPblRvdWNoZWQoKCk9PntpLl9wZW5kaW5nVG91Y2hlZD0hMCxpLnVwZGF0ZU9uPT09ImJsdXIiJiZpLl9wZW5kaW5nQ2hhbmdlJiZSdShpLG4pLGkudXBkYXRlT24hPT0ic3VibWl0IiYmaS5tYXJrQXNUb3VjaGVkKCl9KX1mdW5jdGlvbiBSdShpLG4pe2kuX3BlbmRpbmdEaXJ0eSYmaS5tYXJrQXNEaXJ0eSgpLGkuc2V0VmFsdWUoaS5fcGVuZGluZ1ZhbHVlLHtlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6ITF9KSxuLnZpZXdUb01vZGVsVXBkYXRlKGkuX3BlbmRpbmdWYWx1ZSksaS5fcGVuZGluZ0NoYW5nZT0hMX1mdW5jdGlvbiBrcChpLG4pe2xldCB0PShlLHIpPT57bi52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUoZSksciYmbi52aWV3VG9Nb2RlbFVwZGF0ZShlKX07aS5yZWdpc3Rlck9uQ2hhbmdlKHQpLG4uX3JlZ2lzdGVyT25EZXN0cm95KCgpPT57aS5fdW5yZWdpc3Rlck9uQ2hhbmdlKHQpfSl9ZnVuY3Rpb24gQXUoaSxuKXtpPT1udWxsLEVzKGksbil9ZnVuY3Rpb24gVHAoaSxuKXtyZXR1cm4gX28oaSxuKX1mdW5jdGlvbiBTcyhpLG4pe2lmKCFpLmhhc093blByb3BlcnR5KCJtb2RlbCIpKXJldHVybiExO2xldCB0PWkubW9kZWw7cmV0dXJuIHQuaXNGaXJzdENoYW5nZSgpPyEwOiFPYmplY3QuaXMobix0LmN1cnJlbnRWYWx1ZSl9ZnVuY3Rpb24gRnAoaSl7cmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihpLmNvbnN0cnVjdG9yKT09PWpufWZ1bmN0aW9uIE11KGksbil7aS5fc3luY1BlbmRpbmdDb250cm9scygpLG4uZm9yRWFjaCh0PT57bGV0IGU9dC5jb250cm9sO2UudXBkYXRlT249PT0ic3VibWl0IiYmZS5fcGVuZGluZ0NoYW5nZSYmKHQudmlld1RvTW9kZWxVcGRhdGUoZS5fcGVuZGluZ1ZhbHVlKSxlLl9wZW5kaW5nQ2hhbmdlPSExKX0pfWZ1bmN0aW9uIERzKGksbil7aWYoIW4pcmV0dXJuIG51bGw7QXJyYXkuaXNBcnJheShuKTtsZXQgdCxlLHI7cmV0dXJuIG4uZm9yRWFjaChvPT57by5jb25zdHJ1Y3Rvcj09PWR1P3Q9bzpGcChvKT9lPW86cj1vfSkscnx8ZXx8dHx8bnVsbH1mdW5jdGlvbiBOcChpLG4pe2xldCB0PWkuaW5kZXhPZihuKTt0Pi0xJiZpLnNwbGljZSh0LDEpfWZ1bmN0aW9uIG91KGksbil7bGV0IHQ9aS5pbmRleE9mKG4pO3Q+LTEmJmkuc3BsaWNlKHQsMSl9ZnVuY3Rpb24gYXUoaSl7cmV0dXJuIHR5cGVvZiBpPT0ib2JqZWN0IiYmaSE9PW51bGwmJk9iamVjdC5rZXlzKGkpLmxlbmd0aD09PTImJiJ2YWx1ZSJpbiBpJiYiZGlzYWJsZWQiaW4gaX1mdW5jdGlvbiBJdShpLG4pe3JldHVybiBpPT1udWxsP2Ake259YDoobiYmdHlwZW9mIG49PSJvYmplY3QiJiYobj0iT2JqZWN0IiksYCR7aX06ICR7bn1gLnNsaWNlKDAsNTApKX1mdW5jdGlvbiBZcChpKXtyZXR1cm4gaS5zcGxpdCgiOiIpWzBdfWZ1bmN0aW9uIGx1KGksbil7cmV0dXJuIGk9PW51bGw/YCR7bn1gOih0eXBlb2Ygbj09InN0cmluZyImJihuPWAnJHtufSdgKSxuJiZ0eXBlb2Ygbj09Im9iamVjdCImJihuPSJPYmplY3QiKSxgJHtpfTogJHtufWAuc2xpY2UoMCw1MCkpfWZ1bmN0aW9uIFpwKGkpe3JldHVybiBpLnNwbGl0KCI6IilbMF19ZnVuY3Rpb24gVHUoaSl7cmV0dXJuIHR5cGVvZiBpPT0ibnVtYmVyIj9pOnBhcnNlSW50KGksMTApfXZhciBjdSxqbixTZSxtcCxmcCxwcCx2cCxkdSx1ZSxCbixfcCxhbyxjbyxkZSxxdCx1byxFcCx2dyxfdyxidyxrbixvbyxOaSxUbixFZSxobyxObixQbixQaSxtbyxmbyxwbyxMbix5dyxMaSx5byxQcCxGbixScyxBcyx4dyxMcCxWcCxzdSxqcCx3dyxCcCx6cCxNcyxVcCxIcCwkcCxJcyxXcCxHcCxxcCxPdSxFdyxLcCxrdSxTdyxDbyxYcCxRcCxKcCx0ZyxlZyxpZyxuZyxyZyxGdSxEdyxSdyxOdT1fKCgpPT57ZigpO2YoKTtQZSgpO250KCk7aHQoKTtjdT0oKCk9PntjbGFzcyBpe19yZW5kZXJlcjtfZWxlbWVudFJlZjtvbkNoYW5nZT10PT57fTtvblRvdWNoZWQ9KCk9Pnt9O2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fcmVuZGVyZXI9dCx0aGlzLl9lbGVtZW50UmVmPWV9c2V0UHJvcGVydHkodCxlKXt0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsdCxlKX1yZWdpc3Rlck9uVG91Y2hlZCh0KXt0aGlzLm9uVG91Y2hlZD10fXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5vbkNoYW5nZT10fXNldERpc2FibGVkU3RhdGUodCl7dGhpcy5zZXRQcm9wZXJ0eSgiZGlzYWJsZWQiLHQpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKShDKGx0KSxDKEQpKX07c3RhdGljIFx1MDI3NWRpcj1wKHt0eXBlOml9KX1yZXR1cm4gaX0pKCksam49KCgpPT57Y2xhc3MgaSBleHRlbmRzIGN1e3N0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybih0fHwodD1aKGkpKSkocnx8aSl9fSkoKTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxmZWF0dXJlczpbTF19KX1yZXR1cm4gaX0pKCksU2U9bmV3IHYoIiIpLG1wPXtwcm92aWRlOlNlLHVzZUV4aXN0aW5nOmd0KCgpPT5mcCksbXVsdGk6ITB9LGZwPSgoKT0+e2NsYXNzIGkgZXh0ZW5kcyBqbnt3cml0ZVZhbHVlKHQpe3RoaXMuc2V0UHJvcGVydHkoImNoZWNrZWQiLHQpfXN0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybih0fHwodD1aKGkpKSkocnx8aSl9fSkoKTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siaW5wdXQiLCJ0eXBlIiwiY2hlY2tib3giLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbImlucHV0IiwidHlwZSIsImNoZWNrYm94IiwiZm9ybUNvbnRyb2wiLCIiXSxbImlucHV0IiwidHlwZSIsImNoZWNrYm94IiwibmdNb2RlbCIsIiJdXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24oZSxyKXtlJjEmJmR0KCJjaGFuZ2UiLGZ1bmN0aW9uKGEpe3JldHVybiByLm9uQ2hhbmdlKGEudGFyZ2V0LmNoZWNrZWQpfSkoImJsdXIiLGZ1bmN0aW9uKCl7cmV0dXJuIHIub25Ub3VjaGVkKCl9KX0sc3RhbmRhbG9uZTohMSxmZWF0dXJlczpbeihbbXBdKSxMXX0pfXJldHVybiBpfSkoKSxwcD17cHJvdmlkZTpTZSx1c2VFeGlzdGluZzpndCgoKT0+ZHUpLG11bHRpOiEwfTt2cD1uZXcgdigiIiksZHU9KCgpPT57Y2xhc3MgaSBleHRlbmRzIGN1e19jb21wb3NpdGlvbk1vZGU7X2NvbXBvc2luZz0hMTtjb25zdHJ1Y3Rvcih0LGUscil7c3VwZXIodCxlKSx0aGlzLl9jb21wb3NpdGlvbk1vZGU9cix0aGlzLl9jb21wb3NpdGlvbk1vZGU9PW51bGwmJih0aGlzLl9jb21wb3NpdGlvbk1vZGU9IWdwKCkpfXdyaXRlVmFsdWUodCl7bGV0IGU9dD8/IiI7dGhpcy5zZXRQcm9wZXJ0eSgidmFsdWUiLGUpfV9oYW5kbGVJbnB1dCh0KXsoIXRoaXMuX2NvbXBvc2l0aW9uTW9kZXx8dGhpcy5fY29tcG9zaXRpb25Nb2RlJiYhdGhpcy5fY29tcG9zaW5nKSYmdGhpcy5vbkNoYW5nZSh0KX1fY29tcG9zaXRpb25TdGFydCgpe3RoaXMuX2NvbXBvc2luZz0hMH1fY29tcG9zaXRpb25FbmQodCl7dGhpcy5fY29tcG9zaW5nPSExLHRoaXMuX2NvbXBvc2l0aW9uTW9kZSYmdGhpcy5vbkNoYW5nZSh0KX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSkoQyhsdCksQyhEKSxDKHZwLDgpKX07c3RhdGljIFx1MDI3NWRpcj1wKHt0eXBlOmksc2VsZWN0b3JzOltbImlucHV0IiwiZm9ybUNvbnRyb2xOYW1lIiwiIiwzLCJ0eXBlIiwiY2hlY2tib3giXSxbInRleHRhcmVhIiwiZm9ybUNvbnRyb2xOYW1lIiwiIl0sWyJpbnB1dCIsImZvcm1Db250cm9sIiwiIiwzLCJ0eXBlIiwiY2hlY2tib3giXSxbInRleHRhcmVhIiwiZm9ybUNvbnRyb2wiLCIiXSxbImlucHV0IiwibmdNb2RlbCIsIiIsMywidHlwZSIsImNoZWNrYm94Il0sWyJ0ZXh0YXJlYSIsIm5nTW9kZWwiLCIiXSxbIiIsIm5nRGVmYXVsdENvbnRyb2wiLCIiXV0saG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGUscil7ZSYxJiZkdCgiaW5wdXQiLGZ1bmN0aW9uKGEpe3JldHVybiByLl9oYW5kbGVJbnB1dChhLnRhcmdldC52YWx1ZSl9KSgiYmx1ciIsZnVuY3Rpb24oKXtyZXR1cm4gci5vblRvdWNoZWQoKX0pKCJjb21wb3NpdGlvbnN0YXJ0IixmdW5jdGlvbigpe3JldHVybiByLl9jb21wb3NpdGlvblN0YXJ0KCl9KSgiY29tcG9zaXRpb25lbmQiLGZ1bmN0aW9uKGEpe3JldHVybiByLl9jb21wb3NpdGlvbkVuZChhLnRhcmdldC52YWx1ZSl9KX0sc3RhbmRhbG9uZTohMSxmZWF0dXJlczpbeihbcHBdKSxMXX0pfXJldHVybiBpfSkoKTt1ZT1uZXcgdigiIiksQm49bmV3IHYoIiIpLF9wPS9eKD89LnsxLDI1NH0kKSg/PS57MSw2NH1AKVthLXpBLVowLTkhIyQlJicqKy89P15fYHt8fX4tXSsoPzpcLlthLXpBLVowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkBbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC8sYW89Y2xhc3N7c3RhdGljIG1pbihuKXtyZXR1cm4gYnAobil9c3RhdGljIG1heChuKXtyZXR1cm4geXAobil9c3RhdGljIHJlcXVpcmVkKG4pe3JldHVybiB1dShuKX1zdGF0aWMgcmVxdWlyZWRUcnVlKG4pe3JldHVybiBDcChuKX1zdGF0aWMgZW1haWwobil7cmV0dXJuIHhwKG4pfXN0YXRpYyBtaW5MZW5ndGgobil7cmV0dXJuIGh1KG4pfXN0YXRpYyBtYXhMZW5ndGgobil7cmV0dXJuIG11KG4pfXN0YXRpYyBwYXR0ZXJuKG4pe3JldHVybiBmdShuKX1zdGF0aWMgbnVsbFZhbGlkYXRvcihuKXtyZXR1cm4gc28oKX1zdGF0aWMgY29tcG9zZShuKXtyZXR1cm4geXUobil9c3RhdGljIGNvbXBvc2VBc3luYyhuKXtyZXR1cm4gQ3Uobil9fTtjbz1jbGFzc3tnZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC52YWx1ZTpudWxsfWdldCB2YWxpZCgpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLnZhbGlkOm51bGx9Z2V0IGludmFsaWQoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5pbnZhbGlkOm51bGx9Z2V0IHBlbmRpbmcoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5wZW5kaW5nOm51bGx9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuZGlzYWJsZWQ6bnVsbH1nZXQgZW5hYmxlZCgpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLmVuYWJsZWQ6bnVsbH1nZXQgZXJyb3JzKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuZXJyb3JzOm51bGx9Z2V0IHByaXN0aW5lKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wucHJpc3RpbmU6bnVsbH1nZXQgZGlydHkoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5kaXJ0eTpudWxsfWdldCB0b3VjaGVkKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wudG91Y2hlZDpudWxsfWdldCBzdGF0dXMoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5zdGF0dXM6bnVsbH1nZXQgdW50b3VjaGVkKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wudW50b3VjaGVkOm51bGx9Z2V0IHN0YXR1c0NoYW5nZXMoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5zdGF0dXNDaGFuZ2VzOm51bGx9Z2V0IHZhbHVlQ2hhbmdlcygpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlczpudWxsfWdldCBwYXRoKCl7cmV0dXJuIG51bGx9X2NvbXBvc2VkVmFsaWRhdG9yRm47X2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbjtfcmF3VmFsaWRhdG9ycz1bXTtfcmF3QXN5bmNWYWxpZGF0b3JzPVtdO19zZXRWYWxpZGF0b3JzKG4pe3RoaXMuX3Jhd1ZhbGlkYXRvcnM9bnx8W10sdGhpcy5fY29tcG9zZWRWYWxpZGF0b3JGbj14cyh0aGlzLl9yYXdWYWxpZGF0b3JzKX1fc2V0QXN5bmNWYWxpZGF0b3JzKG4pe3RoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycz1ufHxbXSx0aGlzLl9jb21wb3NlZEFzeW5jVmFsaWRhdG9yRm49d3ModGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzKX1nZXQgdmFsaWRhdG9yKCl7cmV0dXJuIHRoaXMuX2NvbXBvc2VkVmFsaWRhdG9yRm58fG51bGx9Z2V0IGFzeW5jVmFsaWRhdG9yKCl7cmV0dXJuIHRoaXMuX2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbnx8bnVsbH1fb25EZXN0cm95Q2FsbGJhY2tzPVtdO19yZWdpc3Rlck9uRGVzdHJveShuKXt0aGlzLl9vbkRlc3Ryb3lDYWxsYmFja3MucHVzaChuKX1faW52b2tlT25EZXN0cm95Q2FsbGJhY2tzKCl7dGhpcy5fb25EZXN0cm95Q2FsbGJhY2tzLmZvckVhY2gobj0+bigpKSx0aGlzLl9vbkRlc3Ryb3lDYWxsYmFja3M9W119cmVzZXQobj12b2lkIDApe3RoaXMuY29udHJvbCYmdGhpcy5jb250cm9sLnJlc2V0KG4pfWhhc0Vycm9yKG4sdCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuaGFzRXJyb3Iobix0KTohMX1nZXRFcnJvcihuLHQpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLmdldEVycm9yKG4sdCk6bnVsbH19LGRlPWNsYXNzIGV4dGVuZHMgY297bmFtZTtnZXQgZm9ybURpcmVjdGl2ZSgpe3JldHVybiBudWxsfWdldCBwYXRoKCl7cmV0dXJuIG51bGx9fSxxdD1jbGFzcyBleHRlbmRzIGNve19wYXJlbnQ9bnVsbDtuYW1lPW51bGw7dmFsdWVBY2Nlc3Nvcj1udWxsfSx1bz1jbGFzc3tfY2Q7Y29uc3RydWN0b3Iobil7dGhpcy5fY2Q9bn1nZXQgaXNUb3VjaGVkKCl7cmV0dXJuIHRoaXMuX2NkPy5jb250cm9sPy5fdG91Y2hlZD8uKCksISF0aGlzLl9jZD8uY29udHJvbD8udG91Y2hlZH1nZXQgaXNVbnRvdWNoZWQoKXtyZXR1cm4hIXRoaXMuX2NkPy5jb250cm9sPy51bnRvdWNoZWR9Z2V0IGlzUHJpc3RpbmUoKXtyZXR1cm4gdGhpcy5fY2Q/LmNvbnRyb2w/Ll9wcmlzdGluZT8uKCksISF0aGlzLl9jZD8uY29udHJvbD8ucHJpc3RpbmV9Z2V0IGlzRGlydHkoKXtyZXR1cm4hIXRoaXMuX2NkPy5jb250cm9sPy5kaXJ0eX1nZXQgaXNWYWxpZCgpe3JldHVybiB0aGlzLl9jZD8uY29udHJvbD8uX3N0YXR1cz8uKCksISF0aGlzLl9jZD8uY29udHJvbD8udmFsaWR9Z2V0IGlzSW52YWxpZCgpe3JldHVybiEhdGhpcy5fY2Q/LmNvbnRyb2w/LmludmFsaWR9Z2V0IGlzUGVuZGluZygpe3JldHVybiEhdGhpcy5fY2Q/LmNvbnRyb2w/LnBlbmRpbmd9Z2V0IGlzU3VibWl0dGVkKCl7cmV0dXJuIHRoaXMuX2NkPy5fc3VibWl0dGVkPy4oKSwhIXRoaXMuX2NkPy5zdWJtaXR0ZWR9fSxFcD17IltjbGFzcy5uZy11bnRvdWNoZWRdIjoiaXNVbnRvdWNoZWQiLCJbY2xhc3MubmctdG91Y2hlZF0iOiJpc1RvdWNoZWQiLCJbY2xhc3MubmctcHJpc3RpbmVdIjoiaXNQcmlzdGluZSIsIltjbGFzcy5uZy1kaXJ0eV0iOiJpc0RpcnR5IiwiW2NsYXNzLm5nLXZhbGlkXSI6ImlzVmFsaWQiLCJbY2xhc3MubmctaW52YWxpZF0iOiJpc0ludmFsaWQiLCJbY2xhc3MubmctcGVuZGluZ10iOiJpc1BlbmRpbmcifSx2dz0kKGgoe30sRXApLHsiW2NsYXNzLm5nLXN1Ym1pdHRlZF0iOiJpc1N1Ym1pdHRlZCJ9KSxfdz0oKCk9PntjbGFzcyBpIGV4dGVuZHMgdW97Y29uc3RydWN0b3IodCl7c3VwZXIodCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpKEMocXQsMikpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwiZm9ybUNvbnRyb2xOYW1lIiwiIl0sWyIiLCJuZ01vZGVsIiwiIl0sWyIiLCJmb3JtQ29udHJvbCIsIiJdXSxob3N0VmFyczoxNCxob3N0QmluZGluZ3M6ZnVuY3Rpb24oZSxyKXtlJjImJkgoIm5nLXVudG91Y2hlZCIsci5pc1VudG91Y2hlZCkoIm5nLXRvdWNoZWQiLHIuaXNUb3VjaGVkKSgibmctcHJpc3RpbmUiLHIuaXNQcmlzdGluZSkoIm5nLWRpcnR5IixyLmlzRGlydHkpKCJuZy12YWxpZCIsci5pc1ZhbGlkKSgibmctaW52YWxpZCIsci5pc0ludmFsaWQpKCJuZy1wZW5kaW5nIixyLmlzUGVuZGluZyl9LHN0YW5kYWxvbmU6ITEsZmVhdHVyZXM6W0xdfSl9cmV0dXJuIGl9KSgpLGJ3PSgoKT0+e2NsYXNzIGkgZXh0ZW5kcyB1b3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSkoQyhkZSwxMCkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwiZm9ybUdyb3VwTmFtZSIsIiJdLFsiIiwiZm9ybUFycmF5TmFtZSIsIiJdLFsiIiwibmdNb2RlbEdyb3VwIiwiIl0sWyIiLCJmb3JtR3JvdXAiLCIiXSxbImZvcm0iLDMsIm5nTm9Gb3JtIiwiIl0sWyIiLCJuZ0Zvcm0iLCIiXV0saG9zdFZhcnM6MTYsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGUscil7ZSYyJiZIKCJuZy11bnRvdWNoZWQiLHIuaXNVbnRvdWNoZWQpKCJuZy10b3VjaGVkIixyLmlzVG91Y2hlZCkoIm5nLXByaXN0aW5lIixyLmlzUHJpc3RpbmUpKCJuZy1kaXJ0eSIsci5pc0RpcnR5KSgibmctdmFsaWQiLHIuaXNWYWxpZCkoIm5nLWludmFsaWQiLHIuaXNJbnZhbGlkKSgibmctcGVuZGluZyIsci5pc1BlbmRpbmcpKCJuZy1zdWJtaXR0ZWQiLHIuaXNTdWJtaXR0ZWQpfSxzdGFuZGFsb25lOiExLGZlYXR1cmVzOltMXX0pfXJldHVybiBpfSkoKSxrbj0iVkFMSUQiLG9vPSJJTlZBTElEIixOaT0iUEVORElORyIsVG49IkRJU0FCTEVEIixFZT1jbGFzc3t9LGhvPWNsYXNzIGV4dGVuZHMgRWV7dmFsdWU7c291cmNlO2NvbnN0cnVjdG9yKG4sdCl7c3VwZXIoKSx0aGlzLnZhbHVlPW4sdGhpcy5zb3VyY2U9dH19LE5uPWNsYXNzIGV4dGVuZHMgRWV7cHJpc3RpbmU7c291cmNlO2NvbnN0cnVjdG9yKG4sdCl7c3VwZXIoKSx0aGlzLnByaXN0aW5lPW4sdGhpcy5zb3VyY2U9dH19LFBuPWNsYXNzIGV4dGVuZHMgRWV7dG91Y2hlZDtzb3VyY2U7Y29uc3RydWN0b3Iobix0KXtzdXBlcigpLHRoaXMudG91Y2hlZD1uLHRoaXMuc291cmNlPXR9fSxQaT1jbGFzcyBleHRlbmRzIEVle3N0YXR1cztzb3VyY2U7Y29uc3RydWN0b3Iobix0KXtzdXBlcigpLHRoaXMuc3RhdHVzPW4sdGhpcy5zb3VyY2U9dH19LG1vPWNsYXNzIGV4dGVuZHMgRWV7c291cmNlO2NvbnN0cnVjdG9yKG4pe3N1cGVyKCksdGhpcy5zb3VyY2U9bn19LGZvPWNsYXNzIGV4dGVuZHMgRWV7c291cmNlO2NvbnN0cnVjdG9yKG4pe3N1cGVyKCksdGhpcy5zb3VyY2U9bn19O3BvPWNsYXNze19wZW5kaW5nRGlydHk9ITE7X2hhc093blBlbmRpbmdBc3luY1ZhbGlkYXRvcj1udWxsO19wZW5kaW5nVG91Y2hlZD0hMTtfb25Db2xsZWN0aW9uQ2hhbmdlPSgpPT57fTtfdXBkYXRlT247X3BhcmVudD1udWxsO19hc3luY1ZhbGlkYXRpb25TdWJzY3JpcHRpb247X2NvbXBvc2VkVmFsaWRhdG9yRm47X2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbjtfcmF3VmFsaWRhdG9ycztfcmF3QXN5bmNWYWxpZGF0b3JzO3ZhbHVlO2NvbnN0cnVjdG9yKG4sdCl7dGhpcy5fYXNzaWduVmFsaWRhdG9ycyhuKSx0aGlzLl9hc3NpZ25Bc3luY1ZhbGlkYXRvcnModCl9Z2V0IHZhbGlkYXRvcigpe3JldHVybiB0aGlzLl9jb21wb3NlZFZhbGlkYXRvckZufXNldCB2YWxpZGF0b3Iobil7dGhpcy5fcmF3VmFsaWRhdG9ycz10aGlzLl9jb21wb3NlZFZhbGlkYXRvckZuPW59Z2V0IGFzeW5jVmFsaWRhdG9yKCl7cmV0dXJuIHRoaXMuX2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbn1zZXQgYXN5bmNWYWxpZGF0b3Iobil7dGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzPXRoaXMuX2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbj1ufWdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fWdldCBzdGF0dXMoKXtyZXR1cm4gdXQodGhpcy5zdGF0dXNSZWFjdGl2ZSl9c2V0IHN0YXR1cyhuKXt1dCgoKT0+dGhpcy5zdGF0dXNSZWFjdGl2ZS5zZXQobikpfV9zdGF0dXM9WnQoKCk9PnRoaXMuc3RhdHVzUmVhY3RpdmUoKSk7c3RhdHVzUmVhY3RpdmU9Sih2b2lkIDApO2dldCB2YWxpZCgpe3JldHVybiB0aGlzLnN0YXR1cz09PWtufWdldCBpbnZhbGlkKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT09b299Z2V0IHBlbmRpbmcoKXtyZXR1cm4gdGhpcy5zdGF0dXM9PU5pfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLnN0YXR1cz09PVRufWdldCBlbmFibGVkKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT09VG59ZXJyb3JzO2dldCBwcmlzdGluZSgpe3JldHVybiB1dCh0aGlzLnByaXN0aW5lUmVhY3RpdmUpfXNldCBwcmlzdGluZShuKXt1dCgoKT0+dGhpcy5wcmlzdGluZVJlYWN0aXZlLnNldChuKSl9X3ByaXN0aW5lPVp0KCgpPT50aGlzLnByaXN0aW5lUmVhY3RpdmUoKSk7cHJpc3RpbmVSZWFjdGl2ZT1KKCEwKTtnZXQgZGlydHkoKXtyZXR1cm4hdGhpcy5wcmlzdGluZX1nZXQgdG91Y2hlZCgpe3JldHVybiB1dCh0aGlzLnRvdWNoZWRSZWFjdGl2ZSl9c2V0IHRvdWNoZWQobil7dXQoKCk9PnRoaXMudG91Y2hlZFJlYWN0aXZlLnNldChuKSl9X3RvdWNoZWQ9WnQoKCk9PnRoaXMudG91Y2hlZFJlYWN0aXZlKCkpO3RvdWNoZWRSZWFjdGl2ZT1KKCExKTtnZXQgdW50b3VjaGVkKCl7cmV0dXJuIXRoaXMudG91Y2hlZH1fZXZlbnRzPW5ldyB5O2V2ZW50cz10aGlzLl9ldmVudHMuYXNPYnNlcnZhYmxlKCk7dmFsdWVDaGFuZ2VzO3N0YXR1c0NoYW5nZXM7Z2V0IHVwZGF0ZU9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZU9uP3RoaXMuX3VwZGF0ZU9uOnRoaXMucGFyZW50P3RoaXMucGFyZW50LnVwZGF0ZU9uOiJjaGFuZ2UifXNldFZhbGlkYXRvcnMobil7dGhpcy5fYXNzaWduVmFsaWRhdG9ycyhuKX1zZXRBc3luY1ZhbGlkYXRvcnMobil7dGhpcy5fYXNzaWduQXN5bmNWYWxpZGF0b3JzKG4pfWFkZFZhbGlkYXRvcnMobil7dGhpcy5zZXRWYWxpZGF0b3JzKG51KG4sdGhpcy5fcmF3VmFsaWRhdG9ycykpfWFkZEFzeW5jVmFsaWRhdG9ycyhuKXt0aGlzLnNldEFzeW5jVmFsaWRhdG9ycyhudShuLHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycykpfXJlbW92ZVZhbGlkYXRvcnMobil7dGhpcy5zZXRWYWxpZGF0b3JzKHJ1KG4sdGhpcy5fcmF3VmFsaWRhdG9ycykpfXJlbW92ZUFzeW5jVmFsaWRhdG9ycyhuKXt0aGlzLnNldEFzeW5jVmFsaWRhdG9ycyhydShuLHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycykpfWhhc1ZhbGlkYXRvcihuKXtyZXR1cm4gbG8odGhpcy5fcmF3VmFsaWRhdG9ycyxuKX1oYXNBc3luY1ZhbGlkYXRvcihuKXtyZXR1cm4gbG8odGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzLG4pfWNsZWFyVmFsaWRhdG9ycygpe3RoaXMudmFsaWRhdG9yPW51bGx9Y2xlYXJBc3luY1ZhbGlkYXRvcnMoKXt0aGlzLmFzeW5jVmFsaWRhdG9yPW51bGx9bWFya0FzVG91Y2hlZChuPXt9KXtsZXQgdD10aGlzLnRvdWNoZWQ9PT0hMTt0aGlzLnRvdWNoZWQ9ITA7bGV0IGU9bi5zb3VyY2VDb250cm9sPz90aGlzO3RoaXMuX3BhcmVudCYmIW4ub25seVNlbGYmJnRoaXMuX3BhcmVudC5tYXJrQXNUb3VjaGVkKCQoaCh7fSxuKSx7c291cmNlQ29udHJvbDplfSkpLHQmJm4uZW1pdEV2ZW50IT09ITEmJnRoaXMuX2V2ZW50cy5uZXh0KG5ldyBQbighMCxlKSl9bWFya0FsbEFzRGlydHkobj17fSl7dGhpcy5tYXJrQXNEaXJ0eSh7b25seVNlbGY6ITAsZW1pdEV2ZW50Om4uZW1pdEV2ZW50LHNvdXJjZUNvbnRyb2w6dGhpc30pLHRoaXMuX2ZvckVhY2hDaGlsZCh0PT50Lm1hcmtBbGxBc0RpcnR5KG4pKX1tYXJrQWxsQXNUb3VjaGVkKG49e30pe3RoaXMubWFya0FzVG91Y2hlZCh7b25seVNlbGY6ITAsZW1pdEV2ZW50Om4uZW1pdEV2ZW50LHNvdXJjZUNvbnRyb2w6dGhpc30pLHRoaXMuX2ZvckVhY2hDaGlsZCh0PT50Lm1hcmtBbGxBc1RvdWNoZWQobikpfW1hcmtBc1VudG91Y2hlZChuPXt9KXtsZXQgdD10aGlzLnRvdWNoZWQ9PT0hMDt0aGlzLnRvdWNoZWQ9ITEsdGhpcy5fcGVuZGluZ1RvdWNoZWQ9ITE7bGV0IGU9bi5zb3VyY2VDb250cm9sPz90aGlzO3RoaXMuX2ZvckVhY2hDaGlsZChyPT57ci5tYXJrQXNVbnRvdWNoZWQoe29ubHlTZWxmOiEwLGVtaXRFdmVudDpuLmVtaXRFdmVudCxzb3VyY2VDb250cm9sOmV9KX0pLHRoaXMuX3BhcmVudCYmIW4ub25seVNlbGYmJnRoaXMuX3BhcmVudC5fdXBkYXRlVG91Y2hlZChuLGUpLHQmJm4uZW1pdEV2ZW50IT09ITEmJnRoaXMuX2V2ZW50cy5uZXh0KG5ldyBQbighMSxlKSl9bWFya0FzRGlydHkobj17fSl7bGV0IHQ9dGhpcy5wcmlzdGluZT09PSEwO3RoaXMucHJpc3RpbmU9ITE7bGV0IGU9bi5zb3VyY2VDb250cm9sPz90aGlzO3RoaXMuX3BhcmVudCYmIW4ub25seVNlbGYmJnRoaXMuX3BhcmVudC5tYXJrQXNEaXJ0eSgkKGgoe30sbikse3NvdXJjZUNvbnRyb2w6ZX0pKSx0JiZuLmVtaXRFdmVudCE9PSExJiZ0aGlzLl9ldmVudHMubmV4dChuZXcgTm4oITEsZSkpfW1hcmtBc1ByaXN0aW5lKG49e30pe2xldCB0PXRoaXMucHJpc3RpbmU9PT0hMTt0aGlzLnByaXN0aW5lPSEwLHRoaXMuX3BlbmRpbmdEaXJ0eT0hMTtsZXQgZT1uLnNvdXJjZUNvbnRyb2w/P3RoaXM7dGhpcy5fZm9yRWFjaENoaWxkKHI9PntyLm1hcmtBc1ByaXN0aW5lKHtvbmx5U2VsZjohMCxlbWl0RXZlbnQ6bi5lbWl0RXZlbnR9KX0pLHRoaXMuX3BhcmVudCYmIW4ub25seVNlbGYmJnRoaXMuX3BhcmVudC5fdXBkYXRlUHJpc3RpbmUobixlKSx0JiZuLmVtaXRFdmVudCE9PSExJiZ0aGlzLl9ldmVudHMubmV4dChuZXcgTm4oITAsZSkpfW1hcmtBc1BlbmRpbmcobj17fSl7dGhpcy5zdGF0dXM9Tmk7bGV0IHQ9bi5zb3VyY2VDb250cm9sPz90aGlzO24uZW1pdEV2ZW50IT09ITEmJih0aGlzLl9ldmVudHMubmV4dChuZXcgUGkodGhpcy5zdGF0dXMsdCkpLHRoaXMuc3RhdHVzQ2hhbmdlcy5lbWl0KHRoaXMuc3RhdHVzKSksdGhpcy5fcGFyZW50JiYhbi5vbmx5U2VsZiYmdGhpcy5fcGFyZW50Lm1hcmtBc1BlbmRpbmcoJChoKHt9LG4pLHtzb3VyY2VDb250cm9sOnR9KSl9ZGlzYWJsZShuPXt9KXtsZXQgdD10aGlzLl9wYXJlbnRNYXJrZWREaXJ0eShuLm9ubHlTZWxmKTt0aGlzLnN0YXR1cz1Ubix0aGlzLmVycm9ycz1udWxsLHRoaXMuX2ZvckVhY2hDaGlsZChyPT57ci5kaXNhYmxlKCQoaCh7fSxuKSx7b25seVNlbGY6ITB9KSl9KSx0aGlzLl91cGRhdGVWYWx1ZSgpO2xldCBlPW4uc291cmNlQ29udHJvbD8/dGhpcztuLmVtaXRFdmVudCE9PSExJiYodGhpcy5fZXZlbnRzLm5leHQobmV3IGhvKHRoaXMudmFsdWUsZSkpLHRoaXMuX2V2ZW50cy5uZXh0KG5ldyBQaSh0aGlzLnN0YXR1cyxlKSksdGhpcy52YWx1ZUNoYW5nZXMuZW1pdCh0aGlzLnZhbHVlKSx0aGlzLnN0YXR1c0NoYW5nZXMuZW1pdCh0aGlzLnN0YXR1cykpLHRoaXMuX3VwZGF0ZUFuY2VzdG9ycygkKGgoe30sbikse3NraXBQcmlzdGluZUNoZWNrOnR9KSx0aGlzKSx0aGlzLl9vbkRpc2FibGVkQ2hhbmdlLmZvckVhY2gocj0+cighMCkpfWVuYWJsZShuPXt9KXtsZXQgdD10aGlzLl9wYXJlbnRNYXJrZWREaXJ0eShuLm9ubHlTZWxmKTt0aGlzLnN0YXR1cz1rbix0aGlzLl9mb3JFYWNoQ2hpbGQoZT0+e2UuZW5hYmxlKCQoaCh7fSxuKSx7b25seVNlbGY6ITB9KSl9KSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiEwLGVtaXRFdmVudDpuLmVtaXRFdmVudH0pLHRoaXMuX3VwZGF0ZUFuY2VzdG9ycygkKGgoe30sbikse3NraXBQcmlzdGluZUNoZWNrOnR9KSx0aGlzKSx0aGlzLl9vbkRpc2FibGVkQ2hhbmdlLmZvckVhY2goZT0+ZSghMSkpfV91cGRhdGVBbmNlc3RvcnMobix0KXt0aGlzLl9wYXJlbnQmJiFuLm9ubHlTZWxmJiYodGhpcy5fcGFyZW50LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkobiksbi5za2lwUHJpc3RpbmVDaGVja3x8dGhpcy5fcGFyZW50Ll91cGRhdGVQcmlzdGluZSh7fSx0KSx0aGlzLl9wYXJlbnQuX3VwZGF0ZVRvdWNoZWQoe30sdCkpfXNldFBhcmVudChuKXt0aGlzLl9wYXJlbnQ9bn1nZXRSYXdWYWx1ZSgpe3JldHVybiB0aGlzLnZhbHVlfXVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkobj17fSl7aWYodGhpcy5fc2V0SW5pdGlhbFN0YXR1cygpLHRoaXMuX3VwZGF0ZVZhbHVlKCksdGhpcy5lbmFibGVkKXtsZXQgZT10aGlzLl9jYW5jZWxFeGlzdGluZ1N1YnNjcmlwdGlvbigpO3RoaXMuZXJyb3JzPXRoaXMuX3J1blZhbGlkYXRvcigpLHRoaXMuc3RhdHVzPXRoaXMuX2NhbGN1bGF0ZVN0YXR1cygpLCh0aGlzLnN0YXR1cz09PWtufHx0aGlzLnN0YXR1cz09PU5pKSYmdGhpcy5fcnVuQXN5bmNWYWxpZGF0b3IoZSxuLmVtaXRFdmVudCl9bGV0IHQ9bi5zb3VyY2VDb250cm9sPz90aGlzO24uZW1pdEV2ZW50IT09ITEmJih0aGlzLl9ldmVudHMubmV4dChuZXcgaG8odGhpcy52YWx1ZSx0KSksdGhpcy5fZXZlbnRzLm5leHQobmV3IFBpKHRoaXMuc3RhdHVzLHQpKSx0aGlzLnZhbHVlQ2hhbmdlcy5lbWl0KHRoaXMudmFsdWUpLHRoaXMuc3RhdHVzQ2hhbmdlcy5lbWl0KHRoaXMuc3RhdHVzKSksdGhpcy5fcGFyZW50JiYhbi5vbmx5U2VsZiYmdGhpcy5fcGFyZW50LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoJChoKHt9LG4pLHtzb3VyY2VDb250cm9sOnR9KSl9X3VwZGF0ZVRyZWVWYWxpZGl0eShuPXtlbWl0RXZlbnQ6ITB9KXt0aGlzLl9mb3JFYWNoQ2hpbGQodD0+dC5fdXBkYXRlVHJlZVZhbGlkaXR5KG4pKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiEwLGVtaXRFdmVudDpuLmVtaXRFdmVudH0pfV9zZXRJbml0aWFsU3RhdHVzKCl7dGhpcy5zdGF0dXM9dGhpcy5fYWxsQ29udHJvbHNEaXNhYmxlZCgpP1RuOmtufV9ydW5WYWxpZGF0b3IoKXtyZXR1cm4gdGhpcy52YWxpZGF0b3I/dGhpcy52YWxpZGF0b3IodGhpcyk6bnVsbH1fcnVuQXN5bmNWYWxpZGF0b3Iobix0KXtpZih0aGlzLmFzeW5jVmFsaWRhdG9yKXt0aGlzLnN0YXR1cz1OaSx0aGlzLl9oYXNPd25QZW5kaW5nQXN5bmNWYWxpZGF0b3I9e2VtaXRFdmVudDp0IT09ITEsc2hvdWxkSGF2ZUVtaXR0ZWQ6biE9PSExfTtsZXQgZT1ndSh0aGlzLmFzeW5jVmFsaWRhdG9yKHRoaXMpKTt0aGlzLl9hc3luY1ZhbGlkYXRpb25TdWJzY3JpcHRpb249ZS5zdWJzY3JpYmUocj0+e3RoaXMuX2hhc093blBlbmRpbmdBc3luY1ZhbGlkYXRvcj1udWxsLHRoaXMuc2V0RXJyb3JzKHIse2VtaXRFdmVudDp0LHNob3VsZEhhdmVFbWl0dGVkOm59KX0pfX1fY2FuY2VsRXhpc3RpbmdTdWJzY3JpcHRpb24oKXtpZih0aGlzLl9hc3luY1ZhbGlkYXRpb25TdWJzY3JpcHRpb24pe3RoaXMuX2FzeW5jVmFsaWRhdGlvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO2xldCBuPSh0aGlzLl9oYXNPd25QZW5kaW5nQXN5bmNWYWxpZGF0b3I/LmVtaXRFdmVudHx8dGhpcy5faGFzT3duUGVuZGluZ0FzeW5jVmFsaWRhdG9yPy5zaG91bGRIYXZlRW1pdHRlZCk/PyExO3JldHVybiB0aGlzLl9oYXNPd25QZW5kaW5nQXN5bmNWYWxpZGF0b3I9bnVsbCxufXJldHVybiExfXNldEVycm9ycyhuLHQ9e30pe3RoaXMuZXJyb3JzPW4sdGhpcy5fdXBkYXRlQ29udHJvbHNFcnJvcnModC5lbWl0RXZlbnQhPT0hMSx0aGlzLHQuc2hvdWxkSGF2ZUVtaXR0ZWQpfWdldChuKXtsZXQgdD1uO3JldHVybiB0PT1udWxsfHwoQXJyYXkuaXNBcnJheSh0KXx8KHQ9dC5zcGxpdCgiLiIpKSx0Lmxlbmd0aD09PTApP251bGw6dC5yZWR1Y2UoKGUscik9PmUmJmUuX2ZpbmQociksdGhpcyl9Z2V0RXJyb3Iobix0KXtsZXQgZT10P3RoaXMuZ2V0KHQpOnRoaXM7cmV0dXJuIGUmJmUuZXJyb3JzP2UuZXJyb3JzW25dOm51bGx9aGFzRXJyb3Iobix0KXtyZXR1cm4hIXRoaXMuZ2V0RXJyb3Iobix0KX1nZXQgcm9vdCgpe2xldCBuPXRoaXM7Zm9yKDtuLl9wYXJlbnQ7KW49bi5fcGFyZW50O3JldHVybiBufV91cGRhdGVDb250cm9sc0Vycm9ycyhuLHQsZSl7dGhpcy5zdGF0dXM9dGhpcy5fY2FsY3VsYXRlU3RhdHVzKCksbiYmdGhpcy5zdGF0dXNDaGFuZ2VzLmVtaXQodGhpcy5zdGF0dXMpLChufHxlKSYmdGhpcy5fZXZlbnRzLm5leHQobmV3IFBpKHRoaXMuc3RhdHVzLHQpKSx0aGlzLl9wYXJlbnQmJnRoaXMuX3BhcmVudC5fdXBkYXRlQ29udHJvbHNFcnJvcnMobix0LGUpfV9pbml0T2JzZXJ2YWJsZXMoKXt0aGlzLnZhbHVlQ2hhbmdlcz1uZXcgQSx0aGlzLnN0YXR1c0NoYW5nZXM9bmV3IEF9X2NhbGN1bGF0ZVN0YXR1cygpe3JldHVybiB0aGlzLl9hbGxDb250cm9sc0Rpc2FibGVkKCk/VG46dGhpcy5lcnJvcnM/b286dGhpcy5faGFzT3duUGVuZGluZ0FzeW5jVmFsaWRhdG9yfHx0aGlzLl9hbnlDb250cm9sc0hhdmVTdGF0dXMoTmkpP05pOnRoaXMuX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhvbyk/b286a259X2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhuKXtyZXR1cm4gdGhpcy5fYW55Q29udHJvbHModD0+dC5zdGF0dXM9PT1uKX1fYW55Q29udHJvbHNEaXJ0eSgpe3JldHVybiB0aGlzLl9hbnlDb250cm9scyhuPT5uLmRpcnR5KX1fYW55Q29udHJvbHNUb3VjaGVkKCl7cmV0dXJuIHRoaXMuX2FueUNvbnRyb2xzKG49Pm4udG91Y2hlZCl9X3VwZGF0ZVByaXN0aW5lKG4sdCl7bGV0IGU9IXRoaXMuX2FueUNvbnRyb2xzRGlydHkoKSxyPXRoaXMucHJpc3RpbmUhPT1lO3RoaXMucHJpc3RpbmU9ZSx0aGlzLl9wYXJlbnQmJiFuLm9ubHlTZWxmJiZ0aGlzLl9wYXJlbnQuX3VwZGF0ZVByaXN0aW5lKG4sdCksciYmdGhpcy5fZXZlbnRzLm5leHQobmV3IE5uKHRoaXMucHJpc3RpbmUsdCkpfV91cGRhdGVUb3VjaGVkKG49e30sdCl7dGhpcy50b3VjaGVkPXRoaXMuX2FueUNvbnRyb2xzVG91Y2hlZCgpLHRoaXMuX2V2ZW50cy5uZXh0KG5ldyBQbih0aGlzLnRvdWNoZWQsdCkpLHRoaXMuX3BhcmVudCYmIW4ub25seVNlbGYmJnRoaXMuX3BhcmVudC5fdXBkYXRlVG91Y2hlZChuLHQpfV9vbkRpc2FibGVkQ2hhbmdlPVtdO19yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZShuKXt0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2U9bn1fc2V0VXBkYXRlU3RyYXRlZ3kobil7Ym8obikmJm4udXBkYXRlT24hPW51bGwmJih0aGlzLl91cGRhdGVPbj1uLnVwZGF0ZU9uKX1fcGFyZW50TWFya2VkRGlydHkobil7bGV0IHQ9dGhpcy5fcGFyZW50JiZ0aGlzLl9wYXJlbnQuZGlydHk7cmV0dXJuIW4mJiEhdCYmIXRoaXMuX3BhcmVudC5fYW55Q29udHJvbHNEaXJ0eSgpfV9maW5kKG4pe3JldHVybiBudWxsfV9hc3NpZ25WYWxpZGF0b3JzKG4pe3RoaXMuX3Jhd1ZhbGlkYXRvcnM9QXJyYXkuaXNBcnJheShuKT9uLnNsaWNlKCk6bix0aGlzLl9jb21wb3NlZFZhbGlkYXRvckZuPVNwKHRoaXMuX3Jhd1ZhbGlkYXRvcnMpfV9hc3NpZ25Bc3luY1ZhbGlkYXRvcnMobil7dGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzPUFycmF5LmlzQXJyYXkobik/bi5zbGljZSgpOm4sdGhpcy5fY29tcG9zZWRBc3luY1ZhbGlkYXRvckZuPURwKHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycyl9fSxMbj1jbGFzcyBleHRlbmRzIHBve2NvbnN0cnVjdG9yKG4sdCxlKXtzdXBlcihFdSh0KSxTdShlLHQpKSx0aGlzLmNvbnRyb2xzPW4sdGhpcy5faW5pdE9ic2VydmFibGVzKCksdGhpcy5fc2V0VXBkYXRlU3RyYXRlZ3kodCksdGhpcy5fc2V0VXBDb250cm9scygpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7b25seVNlbGY6ITAsZW1pdEV2ZW50OiEhdGhpcy5hc3luY1ZhbGlkYXRvcn0pfWNvbnRyb2xzO3JlZ2lzdGVyQ29udHJvbChuLHQpe3JldHVybiB0aGlzLmNvbnRyb2xzW25dP3RoaXMuY29udHJvbHNbbl06KHRoaXMuY29udHJvbHNbbl09dCx0LnNldFBhcmVudCh0aGlzKSx0Ll9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSh0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpLHQpfWFkZENvbnRyb2wobix0LGU9e30pe3RoaXMucmVnaXN0ZXJDb250cm9sKG4sdCksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ZS5lbWl0RXZlbnR9KSx0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UoKX1yZW1vdmVDb250cm9sKG4sdD17fSl7dGhpcy5jb250cm9sc1tuXSYmdGhpcy5jb250cm9sc1tuXS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKCk9Pnt9KSxkZWxldGUgdGhpcy5jb250cm9sc1tuXSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDp0LmVtaXRFdmVudH0pLHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSgpfXNldENvbnRyb2wobix0LGU9e30pe3RoaXMuY29udHJvbHNbbl0mJnRoaXMuY29udHJvbHNbbl0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgpPT57fSksZGVsZXRlIHRoaXMuY29udHJvbHNbbl0sdCYmdGhpcy5yZWdpc3RlckNvbnRyb2wobix0KSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDplLmVtaXRFdmVudH0pLHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSgpfWNvbnRhaW5zKG4pe3JldHVybiB0aGlzLmNvbnRyb2xzLmhhc093blByb3BlcnR5KG4pJiZ0aGlzLmNvbnRyb2xzW25dLmVuYWJsZWR9c2V0VmFsdWUobix0PXt9KXtBcCh0aGlzLCEwLG4pLE9iamVjdC5rZXlzKG4pLmZvckVhY2goZT0+e1JwKHRoaXMsITAsZSksdGhpcy5jb250cm9sc1tlXS5zZXRWYWx1ZShuW2VdLHtvbmx5U2VsZjohMCxlbWl0RXZlbnQ6dC5lbWl0RXZlbnR9KX0pLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh0KX1wYXRjaFZhbHVlKG4sdD17fSl7biE9bnVsbCYmKE9iamVjdC5rZXlzKG4pLmZvckVhY2goZT0+e2xldCByPXRoaXMuY29udHJvbHNbZV07ciYmci5wYXRjaFZhbHVlKG5bZV0se29ubHlTZWxmOiEwLGVtaXRFdmVudDp0LmVtaXRFdmVudH0pfSksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHQpKX1yZXNldChuPXt9LHQ9e30pe3RoaXMuX2ZvckVhY2hDaGlsZCgoZSxyKT0+e2UucmVzZXQobj9uW3JdOm51bGwse29ubHlTZWxmOiEwLGVtaXRFdmVudDp0LmVtaXRFdmVudH0pfSksdGhpcy5fdXBkYXRlUHJpc3RpbmUodCx0aGlzKSx0aGlzLl91cGRhdGVUb3VjaGVkKHQsdGhpcyksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHQpLHQ/LmVtaXRFdmVudCE9PSExJiZ0aGlzLl9ldmVudHMubmV4dChuZXcgZm8odGhpcykpfWdldFJhd1ZhbHVlKCl7cmV0dXJuIHRoaXMuX3JlZHVjZUNoaWxkcmVuKHt9LChuLHQsZSk9PihuW2VdPXQuZ2V0UmF3VmFsdWUoKSxuKSl9X3N5bmNQZW5kaW5nQ29udHJvbHMoKXtsZXQgbj10aGlzLl9yZWR1Y2VDaGlsZHJlbighMSwodCxlKT0+ZS5fc3luY1BlbmRpbmdDb250cm9scygpPyEwOnQpO3JldHVybiBuJiZ0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiEwfSksbn1fZm9yRWFjaENoaWxkKG4pe09iamVjdC5rZXlzKHRoaXMuY29udHJvbHMpLmZvckVhY2godD0+e2xldCBlPXRoaXMuY29udHJvbHNbdF07ZSYmbihlLHQpfSl9X3NldFVwQ29udHJvbHMoKXt0aGlzLl9mb3JFYWNoQ2hpbGQobj0+e24uc2V0UGFyZW50KHRoaXMpLG4uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSl9KX1fdXBkYXRlVmFsdWUoKXt0aGlzLnZhbHVlPXRoaXMuX3JlZHVjZVZhbHVlKCl9X2FueUNvbnRyb2xzKG4pe2ZvcihsZXRbdCxlXW9mIE9iamVjdC5lbnRyaWVzKHRoaXMuY29udHJvbHMpKWlmKHRoaXMuY29udGFpbnModCkmJm4oZSkpcmV0dXJuITA7cmV0dXJuITF9X3JlZHVjZVZhbHVlKCl7bGV0IG49e307cmV0dXJuIHRoaXMuX3JlZHVjZUNoaWxkcmVuKG4sKHQsZSxyKT0+KChlLmVuYWJsZWR8fHRoaXMuZGlzYWJsZWQpJiYodFtyXT1lLnZhbHVlKSx0KSl9X3JlZHVjZUNoaWxkcmVuKG4sdCl7bGV0IGU9bjtyZXR1cm4gdGhpcy5fZm9yRWFjaENoaWxkKChyLG8pPT57ZT10KGUscixvKX0pLGV9X2FsbENvbnRyb2xzRGlzYWJsZWQoKXtmb3IobGV0IG4gb2YgT2JqZWN0LmtleXModGhpcy5jb250cm9scykpaWYodGhpcy5jb250cm9sc1tuXS5lbmFibGVkKXJldHVybiExO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2xzKS5sZW5ndGg+MHx8dGhpcy5kaXNhYmxlZH1fZmluZChuKXtyZXR1cm4gdGhpcy5jb250cm9scy5oYXNPd25Qcm9wZXJ0eShuKT90aGlzLmNvbnRyb2xzW25dOm51bGx9fSx5dz1MbixMaT1uZXcgdigiIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTooKT0+eW99KSx5bz0iYWx3YXlzIjtQcD17cHJvdmlkZTpkZSx1c2VFeGlzdGluZzpndCgoKT0+UnMpfSxGbj1Qcm9taXNlLnJlc29sdmUoKSxScz0oKCk9PntjbGFzcyBpIGV4dGVuZHMgZGV7Y2FsbFNldERpc2FibGVkU3RhdGU7Z2V0IHN1Ym1pdHRlZCgpe3JldHVybiB1dCh0aGlzLnN1Ym1pdHRlZFJlYWN0aXZlKX1fc3VibWl0dGVkPVp0KCgpPT50aGlzLnN1Ym1pdHRlZFJlYWN0aXZlKCkpO3N1Ym1pdHRlZFJlYWN0aXZlPUooITEpO19kaXJlY3RpdmVzPW5ldyBTZXQ7Zm9ybTtuZ1N1Ym1pdD1uZXcgQTtvcHRpb25zO2NvbnN0cnVjdG9yKHQsZSxyKXtzdXBlcigpLHRoaXMuY2FsbFNldERpc2FibGVkU3RhdGU9cix0aGlzLmZvcm09bmV3IExuKHt9LHhzKHQpLHdzKGUpKX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9zZXRVcGRhdGVTdHJhdGVneSgpfWdldCBmb3JtRGlyZWN0aXZlKCl7cmV0dXJuIHRoaXN9Z2V0IGNvbnRyb2woKXtyZXR1cm4gdGhpcy5mb3JtfWdldCBwYXRoKCl7cmV0dXJuW119Z2V0IGNvbnRyb2xzKCl7cmV0dXJuIHRoaXMuZm9ybS5jb250cm9sc31hZGRDb250cm9sKHQpe0ZuLnRoZW4oKCk9PntsZXQgZT10aGlzLl9maW5kQ29udGFpbmVyKHQucGF0aCk7dC5jb250cm9sPWUucmVnaXN0ZXJDb250cm9sKHQubmFtZSx0LmNvbnRyb2wpLFZuKHQuY29udHJvbCx0LHRoaXMuY2FsbFNldERpc2FibGVkU3RhdGUpLHQuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ITF9KSx0aGlzLl9kaXJlY3RpdmVzLmFkZCh0KX0pfWdldENvbnRyb2wodCl7cmV0dXJuIHRoaXMuZm9ybS5nZXQodC5wYXRoKX1yZW1vdmVDb250cm9sKHQpe0ZuLnRoZW4oKCk9PntsZXQgZT10aGlzLl9maW5kQ29udGFpbmVyKHQucGF0aCk7ZSYmZS5yZW1vdmVDb250cm9sKHQubmFtZSksdGhpcy5fZGlyZWN0aXZlcy5kZWxldGUodCl9KX1hZGRGb3JtR3JvdXAodCl7Rm4udGhlbigoKT0+e2xldCBlPXRoaXMuX2ZpbmRDb250YWluZXIodC5wYXRoKSxyPW5ldyBMbih7fSk7QXUocix0KSxlLnJlZ2lzdGVyQ29udHJvbCh0Lm5hbWUsciksci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ITF9KX0pfXJlbW92ZUZvcm1Hcm91cCh0KXtGbi50aGVuKCgpPT57bGV0IGU9dGhpcy5fZmluZENvbnRhaW5lcih0LnBhdGgpO2UmJmUucmVtb3ZlQ29udHJvbCh0Lm5hbWUpfSl9Z2V0Rm9ybUdyb3VwKHQpe3JldHVybiB0aGlzLmZvcm0uZ2V0KHQucGF0aCl9dXBkYXRlTW9kZWwodCxlKXtGbi50aGVuKCgpPT57dGhpcy5mb3JtLmdldCh0LnBhdGgpLnNldFZhbHVlKGUpfSl9c2V0VmFsdWUodCl7dGhpcy5jb250cm9sLnNldFZhbHVlKHQpfW9uU3VibWl0KHQpe3JldHVybiB0aGlzLnN1Ym1pdHRlZFJlYWN0aXZlLnNldCghMCksTXUodGhpcy5mb3JtLHRoaXMuX2RpcmVjdGl2ZXMpLHRoaXMubmdTdWJtaXQuZW1pdCh0KSx0aGlzLmZvcm0uX2V2ZW50cy5uZXh0KG5ldyBtbyh0aGlzLmNvbnRyb2wpKSx0Py50YXJnZXQ/Lm1ldGhvZD09PSJkaWFsb2cifW9uUmVzZXQoKXt0aGlzLnJlc2V0Rm9ybSgpfXJlc2V0Rm9ybSh0PXZvaWQgMCl7dGhpcy5mb3JtLnJlc2V0KHQpLHRoaXMuc3VibWl0dGVkUmVhY3RpdmUuc2V0KCExKX1fc2V0VXBkYXRlU3RyYXRlZ3koKXt0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy51cGRhdGVPbiE9bnVsbCYmKHRoaXMuZm9ybS5fdXBkYXRlT249dGhpcy5vcHRpb25zLnVwZGF0ZU9uKX1fZmluZENvbnRhaW5lcih0KXtyZXR1cm4gdC5wb3AoKSx0Lmxlbmd0aD90aGlzLmZvcm0uZ2V0KHQpOnRoaXMuZm9ybX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSkoQyh1ZSwxMCksQyhCbiwxMCksQyhMaSw4KSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyJmb3JtIiwzLCJuZ05vRm9ybSIsIiIsMywiZm9ybUdyb3VwIiwiIl0sWyJuZy1mb3JtIl0sWyIiLCJuZ0Zvcm0iLCIiXV0saG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGUscil7ZSYxJiZkdCgic3VibWl0IixmdW5jdGlvbihhKXtyZXR1cm4gci5vblN1Ym1pdChhKX0pKCJyZXNldCIsZnVuY3Rpb24oKXtyZXR1cm4gci5vblJlc2V0KCl9KX0saW5wdXRzOntvcHRpb25zOlswLCJuZ0Zvcm1PcHRpb25zIiwib3B0aW9ucyJdfSxvdXRwdXRzOntuZ1N1Ym1pdDoibmdTdWJtaXQifSxleHBvcnRBczpbIm5nRm9ybSJdLHN0YW5kYWxvbmU6ITEsZmVhdHVyZXM6W3ooW1BwXSksTF19KX1yZXR1cm4gaX0pKCk7QXM9Y2xhc3MgZXh0ZW5kcyBwb3tkZWZhdWx0VmFsdWU9bnVsbDtfb25DaGFuZ2U9W107X3BlbmRpbmdWYWx1ZTtfcGVuZGluZ0NoYW5nZT0hMTtjb25zdHJ1Y3RvcihuPW51bGwsdCxlKXtzdXBlcihFdSh0KSxTdShlLHQpKSx0aGlzLl9hcHBseUZvcm1TdGF0ZShuKSx0aGlzLl9zZXRVcGRhdGVTdHJhdGVneSh0KSx0aGlzLl9pbml0T2JzZXJ2YWJsZXMoKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiEwLGVtaXRFdmVudDohIXRoaXMuYXN5bmNWYWxpZGF0b3J9KSxibyh0KSYmKHQubm9uTnVsbGFibGV8fHQuaW5pdGlhbFZhbHVlSXNEZWZhdWx0KSYmKGF1KG4pP3RoaXMuZGVmYXVsdFZhbHVlPW4udmFsdWU6dGhpcy5kZWZhdWx0VmFsdWU9bil9c2V0VmFsdWUobix0PXt9KXt0aGlzLnZhbHVlPXRoaXMuX3BlbmRpbmdWYWx1ZT1uLHRoaXMuX29uQ2hhbmdlLmxlbmd0aCYmdC5lbWl0TW9kZWxUb1ZpZXdDaGFuZ2UhPT0hMSYmdGhpcy5fb25DaGFuZ2UuZm9yRWFjaChlPT5lKHRoaXMudmFsdWUsdC5lbWl0Vmlld1RvTW9kZWxDaGFuZ2UhPT0hMSkpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh0KX1wYXRjaFZhbHVlKG4sdD17fSl7dGhpcy5zZXRWYWx1ZShuLHQpfXJlc2V0KG49dGhpcy5kZWZhdWx0VmFsdWUsdD17fSl7dGhpcy5fYXBwbHlGb3JtU3RhdGUobiksdGhpcy5tYXJrQXNQcmlzdGluZSh0KSx0aGlzLm1hcmtBc1VudG91Y2hlZCh0KSx0aGlzLnNldFZhbHVlKHRoaXMudmFsdWUsdCksdGhpcy5fcGVuZGluZ0NoYW5nZT0hMSx0Py5lbWl0RXZlbnQhPT0hMSYmdGhpcy5fZXZlbnRzLm5leHQobmV3IGZvKHRoaXMpKX1fdXBkYXRlVmFsdWUoKXt9X2FueUNvbnRyb2xzKG4pe3JldHVybiExfV9hbGxDb250cm9sc0Rpc2FibGVkKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR9cmVnaXN0ZXJPbkNoYW5nZShuKXt0aGlzLl9vbkNoYW5nZS5wdXNoKG4pfV91bnJlZ2lzdGVyT25DaGFuZ2Uobil7b3UodGhpcy5fb25DaGFuZ2Usbil9cmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKG4pe3RoaXMuX29uRGlzYWJsZWRDaGFuZ2UucHVzaChuKX1fdW5yZWdpc3Rlck9uRGlzYWJsZWRDaGFuZ2Uobil7b3UodGhpcy5fb25EaXNhYmxlZENoYW5nZSxuKX1fZm9yRWFjaENoaWxkKG4pe31fc3luY1BlbmRpbmdDb250cm9scygpe3JldHVybiB0aGlzLnVwZGF0ZU9uPT09InN1Ym1pdCImJih0aGlzLl9wZW5kaW5nRGlydHkmJnRoaXMubWFya0FzRGlydHkoKSx0aGlzLl9wZW5kaW5nVG91Y2hlZCYmdGhpcy5tYXJrQXNUb3VjaGVkKCksdGhpcy5fcGVuZGluZ0NoYW5nZSk/KHRoaXMuc2V0VmFsdWUodGhpcy5fcGVuZGluZ1ZhbHVlLHtvbmx5U2VsZjohMCxlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6ITF9KSwhMCk6ITF9X2FwcGx5Rm9ybVN0YXRlKG4pe2F1KG4pPyh0aGlzLnZhbHVlPXRoaXMuX3BlbmRpbmdWYWx1ZT1uLnZhbHVlLG4uZGlzYWJsZWQ/dGhpcy5kaXNhYmxlKHtvbmx5U2VsZjohMCxlbWl0RXZlbnQ6ITF9KTp0aGlzLmVuYWJsZSh7b25seVNlbGY6ITAsZW1pdEV2ZW50OiExfSkpOnRoaXMudmFsdWU9dGhpcy5fcGVuZGluZ1ZhbHVlPW59fSx4dz1BcyxMcD1pPT5pIGluc3RhbmNlb2YgQXMsVnA9e3Byb3ZpZGU6cXQsdXNlRXhpc3Rpbmc6Z3QoKCk9PmpwKX0sc3U9UHJvbWlzZS5yZXNvbHZlKCksanA9KCgpPT57Y2xhc3MgaSBleHRlbmRzIHF0e19jaGFuZ2VEZXRlY3RvclJlZjtjYWxsU2V0RGlzYWJsZWRTdGF0ZTtjb250cm9sPW5ldyBBcztzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfaXNEaXNhYmxlZDtfcmVnaXN0ZXJlZD0hMTt2aWV3TW9kZWw7bmFtZT0iIjtpc0Rpc2FibGVkO21vZGVsO29wdGlvbnM7dXBkYXRlPW5ldyBBO2NvbnN0cnVjdG9yKHQsZSxyLG8sYSxzKXtzdXBlcigpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWEsdGhpcy5jYWxsU2V0RGlzYWJsZWRTdGF0ZT1zLHRoaXMuX3BhcmVudD10LHRoaXMuX3NldFZhbGlkYXRvcnMoZSksdGhpcy5fc2V0QXN5bmNWYWxpZGF0b3JzKHIpLHRoaXMudmFsdWVBY2Nlc3Nvcj1Ecyh0aGlzLG8pfW5nT25DaGFuZ2VzKHQpe2lmKHRoaXMuX2NoZWNrRm9yRXJyb3JzKCksIXRoaXMuX3JlZ2lzdGVyZWR8fCJuYW1lImluIHQpe2lmKHRoaXMuX3JlZ2lzdGVyZWQmJih0aGlzLl9jaGVja05hbWUoKSx0aGlzLmZvcm1EaXJlY3RpdmUpKXtsZXQgZT10Lm5hbWUucHJldmlvdXNWYWx1ZTt0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlQ29udHJvbCh7bmFtZTplLHBhdGg6dGhpcy5fZ2V0UGF0aChlKX0pfXRoaXMuX3NldFVwQ29udHJvbCgpfSJpc0Rpc2FibGVkImluIHQmJnRoaXMuX3VwZGF0ZURpc2FibGVkKHQpLFNzKHQsdGhpcy52aWV3TW9kZWwpJiYodGhpcy5fdXBkYXRlVmFsdWUodGhpcy5tb2RlbCksdGhpcy52aWV3TW9kZWw9dGhpcy5tb2RlbCl9bmdPbkRlc3Ryb3koKXt0aGlzLmZvcm1EaXJlY3RpdmUmJnRoaXMuZm9ybURpcmVjdGl2ZS5yZW1vdmVDb250cm9sKHRoaXMpfWdldCBwYXRoKCl7cmV0dXJuIHRoaXMuX2dldFBhdGgodGhpcy5uYW1lKX1nZXQgZm9ybURpcmVjdGl2ZSgpe3JldHVybiB0aGlzLl9wYXJlbnQ/dGhpcy5fcGFyZW50LmZvcm1EaXJlY3RpdmU6bnVsbH12aWV3VG9Nb2RlbFVwZGF0ZSh0KXt0aGlzLnZpZXdNb2RlbD10LHRoaXMudXBkYXRlLmVtaXQodCl9X3NldFVwQ29udHJvbCgpe3RoaXMuX3NldFVwZGF0ZVN0cmF0ZWd5KCksdGhpcy5faXNTdGFuZGFsb25lKCk/dGhpcy5fc2V0VXBTdGFuZGFsb25lKCk6dGhpcy5mb3JtRGlyZWN0aXZlLmFkZENvbnRyb2wodGhpcyksdGhpcy5fcmVnaXN0ZXJlZD0hMH1fc2V0VXBkYXRlU3RyYXRlZ3koKXt0aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy51cGRhdGVPbiE9bnVsbCYmKHRoaXMuY29udHJvbC5fdXBkYXRlT249dGhpcy5vcHRpb25zLnVwZGF0ZU9uKX1faXNTdGFuZGFsb25lKCl7cmV0dXJuIXRoaXMuX3BhcmVudHx8ISEodGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMuc3RhbmRhbG9uZSl9X3NldFVwU3RhbmRhbG9uZSgpe1ZuKHRoaXMuY29udHJvbCx0aGlzLHRoaXMuY2FsbFNldERpc2FibGVkU3RhdGUpLHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ITF9KX1fY2hlY2tGb3JFcnJvcnMoKXt0aGlzLl9jaGVja05hbWUoKX1fY2hlY2tOYW1lKCl7dGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMubmFtZSYmKHRoaXMubmFtZT10aGlzLm9wdGlvbnMubmFtZSksIXRoaXMuX2lzU3RhbmRhbG9uZSgpJiZ0aGlzLm5hbWV9X3VwZGF0ZVZhbHVlKHQpe3N1LnRoZW4oKCk9Pnt0aGlzLmNvbnRyb2wuc2V0VmFsdWUodCx7ZW1pdFZpZXdUb01vZGVsQ2hhbmdlOiExfSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY/Lm1hcmtGb3JDaGVjaygpfSl9X3VwZGF0ZURpc2FibGVkKHQpe2xldCBlPXQuaXNEaXNhYmxlZC5jdXJyZW50VmFsdWUscj1lIT09MCYmRihlKTtzdS50aGVuKCgpPT57ciYmIXRoaXMuY29udHJvbC5kaXNhYmxlZD90aGlzLmNvbnRyb2wuZGlzYWJsZSgpOiFyJiZ0aGlzLmNvbnRyb2wuZGlzYWJsZWQmJnRoaXMuY29udHJvbC5lbmFibGUoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj8ubWFya0ZvckNoZWNrKCl9KX1fZ2V0UGF0aCh0KXtyZXR1cm4gdGhpcy5fcGFyZW50P0R1KHQsdGhpcy5fcGFyZW50KTpbdF19c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpKEMoZGUsOSksQyh1ZSwxMCksQyhCbiwxMCksQyhTZSwxMCksQyhBdCw4KSxDKExpLDgpKX07c3RhdGljIFx1MDI3NWRpcj1wKHt0eXBlOmksc2VsZWN0b3JzOltbIiIsIm5nTW9kZWwiLCIiLDMsImZvcm1Db250cm9sTmFtZSIsIiIsMywiZm9ybUNvbnRyb2wiLCIiXV0saW5wdXRzOntuYW1lOiJuYW1lIixpc0Rpc2FibGVkOlswLCJkaXNhYmxlZCIsImlzRGlzYWJsZWQiXSxtb2RlbDpbMCwibmdNb2RlbCIsIm1vZGVsIl0sb3B0aW9uczpbMCwibmdNb2RlbE9wdGlvbnMiLCJvcHRpb25zIl19LG91dHB1dHM6e3VwZGF0ZToibmdNb2RlbENoYW5nZSJ9LGV4cG9ydEFzOlsibmdNb2RlbCJdLHN0YW5kYWxvbmU6ITEsZmVhdHVyZXM6W3ooW1ZwXSksTCxtdF19KX1yZXR1cm4gaX0pKCksd3c9KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyJmb3JtIiwzLCJuZ05vRm9ybSIsIiIsMywibmdOYXRpdmVWYWxpZGF0ZSIsIiJdXSxob3N0QXR0cnM6WyJub3ZhbGlkYXRlIiwiIl0sc3RhbmRhbG9uZTohMX0pfXJldHVybiBpfSkoKSxCcD17cHJvdmlkZTpTZSx1c2VFeGlzdGluZzpndCgoKT0+enApLG11bHRpOiEwfSx6cD0oKCk9PntjbGFzcyBpIGV4dGVuZHMgam57d3JpdGVWYWx1ZSh0KXtsZXQgZT10Pz8iIjt0aGlzLnNldFByb3BlcnR5KCJ2YWx1ZSIsZSl9cmVnaXN0ZXJPbkNoYW5nZSh0KXt0aGlzLm9uQ2hhbmdlPWU9Pnt0KGU9PSIiP251bGw6cGFyc2VGbG9hdChlKSl9fXN0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybih0fHwodD1aKGkpKSkocnx8aSl9fSkoKTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siaW5wdXQiLCJ0eXBlIiwibnVtYmVyIiwiZm9ybUNvbnRyb2xOYW1lIiwiIl0sWyJpbnB1dCIsInR5cGUiLCJudW1iZXIiLCJmb3JtQ29udHJvbCIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwibnVtYmVyIiwibmdNb2RlbCIsIiJdXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24oZSxyKXtlJjEmJmR0KCJpbnB1dCIsZnVuY3Rpb24oYSl7cmV0dXJuIHIub25DaGFuZ2UoYS50YXJnZXQudmFsdWUpfSkoImJsdXIiLGZ1bmN0aW9uKCl7cmV0dXJuIHIub25Ub3VjaGVkKCl9KX0sc3RhbmRhbG9uZTohMSxmZWF0dXJlczpbeihbQnBdKSxMXX0pfXJldHVybiBpfSkoKSxNcz1uZXcgdigiIiksVXA9e3Byb3ZpZGU6cXQsdXNlRXhpc3Rpbmc6Z3QoKCk9PkhwKX0sSHA9KCgpPT57Y2xhc3MgaSBleHRlbmRzIHF0e19uZ01vZGVsV2FybmluZ0NvbmZpZztjYWxsU2V0RGlzYWJsZWRTdGF0ZTt2aWV3TW9kZWw7Zm9ybTtzZXQgaXNEaXNhYmxlZCh0KXt9bW9kZWw7dXBkYXRlPW5ldyBBO3N0YXRpYyBfbmdNb2RlbFdhcm5pbmdTZW50T25jZT0hMTtfbmdNb2RlbFdhcm5pbmdTZW50PSExO2NvbnN0cnVjdG9yKHQsZSxyLG8sYSl7c3VwZXIoKSx0aGlzLl9uZ01vZGVsV2FybmluZ0NvbmZpZz1vLHRoaXMuY2FsbFNldERpc2FibGVkU3RhdGU9YSx0aGlzLl9zZXRWYWxpZGF0b3JzKHQpLHRoaXMuX3NldEFzeW5jVmFsaWRhdG9ycyhlKSx0aGlzLnZhbHVlQWNjZXNzb3I9RHModGhpcyxyKX1uZ09uQ2hhbmdlcyh0KXtpZih0aGlzLl9pc0NvbnRyb2xDaGFuZ2VkKHQpKXtsZXQgZT10LmZvcm0ucHJldmlvdXNWYWx1ZTtlJiZnbyhlLHRoaXMsITEpLFZuKHRoaXMuZm9ybSx0aGlzLHRoaXMuY2FsbFNldERpc2FibGVkU3RhdGUpLHRoaXMuZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ITF9KX1Tcyh0LHRoaXMudmlld01vZGVsKSYmKHRoaXMuZm9ybS5zZXRWYWx1ZSh0aGlzLm1vZGVsKSx0aGlzLnZpZXdNb2RlbD10aGlzLm1vZGVsKX1uZ09uRGVzdHJveSgpe3RoaXMuZm9ybSYmZ28odGhpcy5mb3JtLHRoaXMsITEpfWdldCBwYXRoKCl7cmV0dXJuW119Z2V0IGNvbnRyb2woKXtyZXR1cm4gdGhpcy5mb3JtfXZpZXdUb01vZGVsVXBkYXRlKHQpe3RoaXMudmlld01vZGVsPXQsdGhpcy51cGRhdGUuZW1pdCh0KX1faXNDb250cm9sQ2hhbmdlZCh0KXtyZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eSgiZm9ybSIpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKShDKHVlLDEwKSxDKEJuLDEwKSxDKFNlLDEwKSxDKE1zLDgpLEMoTGksOCkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwiZm9ybUNvbnRyb2wiLCIiXV0saW5wdXRzOntmb3JtOlswLCJmb3JtQ29udHJvbCIsImZvcm0iXSxpc0Rpc2FibGVkOlswLCJkaXNhYmxlZCIsImlzRGlzYWJsZWQiXSxtb2RlbDpbMCwibmdNb2RlbCIsIm1vZGVsIl19LG91dHB1dHM6e3VwZGF0ZToibmdNb2RlbENoYW5nZSJ9LGV4cG9ydEFzOlsibmdGb3JtIl0sc3RhbmRhbG9uZTohMSxmZWF0dXJlczpbeihbVXBdKSxMLG10XX0pfXJldHVybiBpfSkoKSwkcD17cHJvdmlkZTpkZSx1c2VFeGlzdGluZzpndCgoKT0+SXMpfSxJcz0oKCk9PntjbGFzcyBpIGV4dGVuZHMgZGV7Y2FsbFNldERpc2FibGVkU3RhdGU7Z2V0IHN1Ym1pdHRlZCgpe3JldHVybiB1dCh0aGlzLl9zdWJtaXR0ZWRSZWFjdGl2ZSl9c2V0IHN1Ym1pdHRlZCh0KXt0aGlzLl9zdWJtaXR0ZWRSZWFjdGl2ZS5zZXQodCl9X3N1Ym1pdHRlZD1adCgoKT0+dGhpcy5fc3VibWl0dGVkUmVhY3RpdmUoKSk7X3N1Ym1pdHRlZFJlYWN0aXZlPUooITEpO19vbGRGb3JtO19vbkNvbGxlY3Rpb25DaGFuZ2U9KCk9PnRoaXMuX3VwZGF0ZURvbVZhbHVlKCk7ZGlyZWN0aXZlcz1bXTtmb3JtPW51bGw7bmdTdWJtaXQ9bmV3IEE7Y29uc3RydWN0b3IodCxlLHIpe3N1cGVyKCksdGhpcy5jYWxsU2V0RGlzYWJsZWRTdGF0ZT1yLHRoaXMuX3NldFZhbGlkYXRvcnModCksdGhpcy5fc2V0QXN5bmNWYWxpZGF0b3JzKGUpfW5nT25DaGFuZ2VzKHQpe3QuaGFzT3duUHJvcGVydHkoImZvcm0iKSYmKHRoaXMuX3VwZGF0ZVZhbGlkYXRvcnMoKSx0aGlzLl91cGRhdGVEb21WYWx1ZSgpLHRoaXMuX3VwZGF0ZVJlZ2lzdHJhdGlvbnMoKSx0aGlzLl9vbGRGb3JtPXRoaXMuZm9ybSl9bmdPbkRlc3Ryb3koKXt0aGlzLmZvcm0mJihfbyh0aGlzLmZvcm0sdGhpcyksdGhpcy5mb3JtLl9vbkNvbGxlY3Rpb25DaGFuZ2U9PT10aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UmJnRoaXMuZm9ybS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKCk9Pnt9KSl9Z2V0IGZvcm1EaXJlY3RpdmUoKXtyZXR1cm4gdGhpc31nZXQgY29udHJvbCgpe3JldHVybiB0aGlzLmZvcm19Z2V0IHBhdGgoKXtyZXR1cm5bXX1hZGRDb250cm9sKHQpe2xldCBlPXRoaXMuZm9ybS5nZXQodC5wYXRoKTtyZXR1cm4gVm4oZSx0LHRoaXMuY2FsbFNldERpc2FibGVkU3RhdGUpLGUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSksdGhpcy5kaXJlY3RpdmVzLnB1c2godCksZX1nZXRDb250cm9sKHQpe3JldHVybiB0aGlzLmZvcm0uZ2V0KHQucGF0aCl9cmVtb3ZlQ29udHJvbCh0KXtnbyh0LmNvbnRyb2x8fG51bGwsdCwhMSksTnAodGhpcy5kaXJlY3RpdmVzLHQpfWFkZEZvcm1Hcm91cCh0KXt0aGlzLl9zZXRVcEZvcm1Db250YWluZXIodCl9cmVtb3ZlRm9ybUdyb3VwKHQpe3RoaXMuX2NsZWFuVXBGb3JtQ29udGFpbmVyKHQpfWdldEZvcm1Hcm91cCh0KXtyZXR1cm4gdGhpcy5mb3JtLmdldCh0LnBhdGgpfWFkZEZvcm1BcnJheSh0KXt0aGlzLl9zZXRVcEZvcm1Db250YWluZXIodCl9cmVtb3ZlRm9ybUFycmF5KHQpe3RoaXMuX2NsZWFuVXBGb3JtQ29udGFpbmVyKHQpfWdldEZvcm1BcnJheSh0KXtyZXR1cm4gdGhpcy5mb3JtLmdldCh0LnBhdGgpfXVwZGF0ZU1vZGVsKHQsZSl7dGhpcy5mb3JtLmdldCh0LnBhdGgpLnNldFZhbHVlKGUpfW9uU3VibWl0KHQpe3JldHVybiB0aGlzLl9zdWJtaXR0ZWRSZWFjdGl2ZS5zZXQoITApLE11KHRoaXMuZm9ybSx0aGlzLmRpcmVjdGl2ZXMpLHRoaXMubmdTdWJtaXQuZW1pdCh0KSx0aGlzLmZvcm0uX2V2ZW50cy5uZXh0KG5ldyBtbyh0aGlzLmNvbnRyb2wpKSx0Py50YXJnZXQ/Lm1ldGhvZD09PSJkaWFsb2cifW9uUmVzZXQoKXt0aGlzLnJlc2V0Rm9ybSgpfXJlc2V0Rm9ybSh0PXZvaWQgMCxlPXt9KXt0aGlzLmZvcm0ucmVzZXQodCxlKSx0aGlzLl9zdWJtaXR0ZWRSZWFjdGl2ZS5zZXQoITEpfV91cGRhdGVEb21WYWx1ZSgpe3RoaXMuZGlyZWN0aXZlcy5mb3JFYWNoKHQ9PntsZXQgZT10LmNvbnRyb2wscj10aGlzLmZvcm0uZ2V0KHQucGF0aCk7ZSE9PXImJihnbyhlfHxudWxsLHQpLExwKHIpJiYoVm4ocix0LHRoaXMuY2FsbFNldERpc2FibGVkU3RhdGUpLHQuY29udHJvbD1yKSl9KSx0aGlzLmZvcm0uX3VwZGF0ZVRyZWVWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSl9X3NldFVwRm9ybUNvbnRhaW5lcih0KXtsZXQgZT10aGlzLmZvcm0uZ2V0KHQucGF0aCk7QXUoZSx0KSxlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDohMX0pfV9jbGVhblVwRm9ybUNvbnRhaW5lcih0KXtpZih0aGlzLmZvcm0pe2xldCBlPXRoaXMuZm9ybS5nZXQodC5wYXRoKTtlJiZUcChlLHQpJiZlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDohMX0pfX1fdXBkYXRlUmVnaXN0cmF0aW9ucygpe3RoaXMuZm9ybS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UodGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKSx0aGlzLl9vbGRGb3JtJiZ0aGlzLl9vbGRGb3JtLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSgoKT0+e30pfV91cGRhdGVWYWxpZGF0b3JzKCl7RXModGhpcy5mb3JtLHRoaXMpLHRoaXMuX29sZEZvcm0mJl9vKHRoaXMuX29sZEZvcm0sdGhpcyl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpKEModWUsMTApLEMoQm4sMTApLEMoTGksOCkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwiZm9ybUdyb3VwIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMSYmZHQoInN1Ym1pdCIsZnVuY3Rpb24oYSl7cmV0dXJuIHIub25TdWJtaXQoYSl9KSgicmVzZXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHIub25SZXNldCgpfSl9LGlucHV0czp7Zm9ybTpbMCwiZm9ybUdyb3VwIiwiZm9ybSJdfSxvdXRwdXRzOntuZ1N1Ym1pdDoibmdTdWJtaXQifSxleHBvcnRBczpbIm5nRm9ybSJdLHN0YW5kYWxvbmU6ITEsZmVhdHVyZXM6W3ooWyRwXSksTCxtdF19KX1yZXR1cm4gaX0pKCksV3A9e3Byb3ZpZGU6cXQsdXNlRXhpc3Rpbmc6Z3QoKCk9PkdwKX0sR3A9KCgpPT57Y2xhc3MgaSBleHRlbmRzIHF0e19uZ01vZGVsV2FybmluZ0NvbmZpZztfYWRkZWQ9ITE7dmlld01vZGVsO2NvbnRyb2w7bmFtZT1udWxsO3NldCBpc0Rpc2FibGVkKHQpe31tb2RlbDt1cGRhdGU9bmV3IEE7c3RhdGljIF9uZ01vZGVsV2FybmluZ1NlbnRPbmNlPSExO19uZ01vZGVsV2FybmluZ1NlbnQ9ITE7Y29uc3RydWN0b3IodCxlLHIsbyxhKXtzdXBlcigpLHRoaXMuX25nTW9kZWxXYXJuaW5nQ29uZmlnPWEsdGhpcy5fcGFyZW50PXQsdGhpcy5fc2V0VmFsaWRhdG9ycyhlKSx0aGlzLl9zZXRBc3luY1ZhbGlkYXRvcnMociksdGhpcy52YWx1ZUFjY2Vzc29yPURzKHRoaXMsbyl9bmdPbkNoYW5nZXModCl7dGhpcy5fYWRkZWR8fHRoaXMuX3NldFVwQ29udHJvbCgpLFNzKHQsdGhpcy52aWV3TW9kZWwpJiYodGhpcy52aWV3TW9kZWw9dGhpcy5tb2RlbCx0aGlzLmZvcm1EaXJlY3RpdmUudXBkYXRlTW9kZWwodGhpcyx0aGlzLm1vZGVsKSl9bmdPbkRlc3Ryb3koKXt0aGlzLmZvcm1EaXJlY3RpdmUmJnRoaXMuZm9ybURpcmVjdGl2ZS5yZW1vdmVDb250cm9sKHRoaXMpfXZpZXdUb01vZGVsVXBkYXRlKHQpe3RoaXMudmlld01vZGVsPXQsdGhpcy51cGRhdGUuZW1pdCh0KX1nZXQgcGF0aCgpe3JldHVybiBEdSh0aGlzLm5hbWU9PW51bGw/dGhpcy5uYW1lOnRoaXMubmFtZS50b1N0cmluZygpLHRoaXMuX3BhcmVudCl9Z2V0IGZvcm1EaXJlY3RpdmUoKXtyZXR1cm4gdGhpcy5fcGFyZW50P3RoaXMuX3BhcmVudC5mb3JtRGlyZWN0aXZlOm51bGx9X3NldFVwQ29udHJvbCgpe3RoaXMuY29udHJvbD10aGlzLmZvcm1EaXJlY3RpdmUuYWRkQ29udHJvbCh0aGlzKSx0aGlzLl9hZGRlZD0hMH1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSkoQyhkZSwxMyksQyh1ZSwxMCksQyhCbiwxMCksQyhTZSwxMCksQyhNcyw4KSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXV0saW5wdXRzOntuYW1lOlswLCJmb3JtQ29udHJvbE5hbWUiLCJuYW1lIl0saXNEaXNhYmxlZDpbMCwiZGlzYWJsZWQiLCJpc0Rpc2FibGVkIl0sbW9kZWw6WzAsIm5nTW9kZWwiLCJtb2RlbCJdfSxvdXRwdXRzOnt1cGRhdGU6Im5nTW9kZWxDaGFuZ2UifSxzdGFuZGFsb25lOiExLGZlYXR1cmVzOlt6KFtXcF0pLEwsbXRdfSl9cmV0dXJuIGl9KSgpLHFwPXtwcm92aWRlOlNlLHVzZUV4aXN0aW5nOmd0KCgpPT5PdSksbXVsdGk6ITB9O091PSgoKT0+e2NsYXNzIGkgZXh0ZW5kcyBqbnt2YWx1ZTtfb3B0aW9uTWFwPW5ldyBNYXA7X2lkQ291bnRlcj0wO3NldCBjb21wYXJlV2l0aCh0KXt0aGlzLl9jb21wYXJlV2l0aD10fV9jb21wYXJlV2l0aD1PYmplY3QuaXM7YXBwUmVmSW5qZWN0b3I9bChpZSkuaW5qZWN0b3I7ZGVzdHJveVJlZj1sKEJpKTtjZHI9bChBdCk7X3F1ZXVlZFdyaXRlPSExO193cml0ZVZhbHVlQWZ0ZXJSZW5kZXIoKXt0aGlzLl9xdWV1ZWRXcml0ZXx8dGhpcy5hcHBSZWZJbmplY3Rvci5kZXN0cm95ZWR8fCh0aGlzLl9xdWV1ZWRXcml0ZT0hMCxPdCh7d3JpdGU6KCk9Pnt0aGlzLmRlc3Ryb3lSZWYuZGVzdHJveWVkfHwodGhpcy5fcXVldWVkV3JpdGU9ITEsdGhpcy53cml0ZVZhbHVlKHRoaXMudmFsdWUpKX19LHtpbmplY3Rvcjp0aGlzLmFwcFJlZkluamVjdG9yfSkpfXdyaXRlVmFsdWUodCl7dGhpcy5jZHIubWFya0ZvckNoZWNrKCksdGhpcy52YWx1ZT10O2xldCBlPXRoaXMuX2dldE9wdGlvbklkKHQpLHI9SXUoZSx0KTt0aGlzLnNldFByb3BlcnR5KCJ2YWx1ZSIscil9cmVnaXN0ZXJPbkNoYW5nZSh0KXt0aGlzLm9uQ2hhbmdlPWU9Pnt0aGlzLnZhbHVlPXRoaXMuX2dldE9wdGlvblZhbHVlKGUpLHQodGhpcy52YWx1ZSl9fV9yZWdpc3Rlck9wdGlvbigpe3JldHVybih0aGlzLl9pZENvdW50ZXIrKykudG9TdHJpbmcoKX1fZ2V0T3B0aW9uSWQodCl7Zm9yKGxldCBlIG9mIHRoaXMuX29wdGlvbk1hcC5rZXlzKCkpaWYodGhpcy5fY29tcGFyZVdpdGgodGhpcy5fb3B0aW9uTWFwLmdldChlKSx0KSlyZXR1cm4gZTtyZXR1cm4gbnVsbH1fZ2V0T3B0aW9uVmFsdWUodCl7bGV0IGU9WXAodCk7cmV0dXJuIHRoaXMuX29wdGlvbk1hcC5oYXMoZSk/dGhpcy5fb3B0aW9uTWFwLmdldChlKTp0fXN0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybih0fHwodD1aKGkpKSkocnx8aSl9fSkoKTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1sic2VsZWN0IiwiZm9ybUNvbnRyb2xOYW1lIiwiIiwzLCJtdWx0aXBsZSIsIiJdLFsic2VsZWN0IiwiZm9ybUNvbnRyb2wiLCIiLDMsIm11bHRpcGxlIiwiIl0sWyJzZWxlY3QiLCJuZ01vZGVsIiwiIiwzLCJtdWx0aXBsZSIsIiJdXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24oZSxyKXtlJjEmJmR0KCJjaGFuZ2UiLGZ1bmN0aW9uKGEpe3JldHVybiByLm9uQ2hhbmdlKGEudGFyZ2V0LnZhbHVlKX0pKCJibHVyIixmdW5jdGlvbigpe3JldHVybiByLm9uVG91Y2hlZCgpfSl9LGlucHV0czp7Y29tcGFyZVdpdGg6ImNvbXBhcmVXaXRoIn0sc3RhbmRhbG9uZTohMSxmZWF0dXJlczpbeihbcXBdKSxMXX0pfXJldHVybiBpfSkoKSxFdz0oKCk9PntjbGFzcyBpe19lbGVtZW50O19yZW5kZXJlcjtfc2VsZWN0O2lkO2NvbnN0cnVjdG9yKHQsZSxyKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fcmVuZGVyZXI9ZSx0aGlzLl9zZWxlY3Q9cix0aGlzLl9zZWxlY3QmJih0aGlzLmlkPXRoaXMuX3NlbGVjdC5fcmVnaXN0ZXJPcHRpb24oKSl9c2V0IG5nVmFsdWUodCl7dGhpcy5fc2VsZWN0IT1udWxsJiYodGhpcy5fc2VsZWN0Ll9vcHRpb25NYXAuc2V0KHRoaXMuaWQsdCksdGhpcy5fc2V0RWxlbWVudFZhbHVlKEl1KHRoaXMuaWQsdCkpLHRoaXMuX3NlbGVjdC5fd3JpdGVWYWx1ZUFmdGVyUmVuZGVyKCkpfXNldCB2YWx1ZSh0KXt0aGlzLl9zZXRFbGVtZW50VmFsdWUodCksdGhpcy5fc2VsZWN0JiZ0aGlzLl9zZWxlY3QuX3dyaXRlVmFsdWVBZnRlclJlbmRlcigpfV9zZXRFbGVtZW50VmFsdWUodCl7dGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCJ2YWx1ZSIsdCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9zZWxlY3QmJih0aGlzLl9zZWxlY3QuX29wdGlvbk1hcC5kZWxldGUodGhpcy5pZCksdGhpcy5fc2VsZWN0Ll93cml0ZVZhbHVlQWZ0ZXJSZW5kZXIoKSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpKEMoRCksQyhsdCksQyhPdSw5KSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyJvcHRpb24iXV0saW5wdXRzOntuZ1ZhbHVlOiJuZ1ZhbHVlIix2YWx1ZToidmFsdWUifSxzdGFuZGFsb25lOiExfSl9cmV0dXJuIGl9KSgpLEtwPXtwcm92aWRlOlNlLHVzZUV4aXN0aW5nOmd0KCgpPT5rdSksbXVsdGk6ITB9O2t1PSgoKT0+e2NsYXNzIGkgZXh0ZW5kcyBqbnt2YWx1ZTtfb3B0aW9uTWFwPW5ldyBNYXA7X2lkQ291bnRlcj0wO3NldCBjb21wYXJlV2l0aCh0KXt0aGlzLl9jb21wYXJlV2l0aD10fV9jb21wYXJlV2l0aD1PYmplY3QuaXM7d3JpdGVWYWx1ZSh0KXt0aGlzLnZhbHVlPXQ7bGV0IGU7aWYoQXJyYXkuaXNBcnJheSh0KSl7bGV0IHI9dC5tYXAobz0+dGhpcy5fZ2V0T3B0aW9uSWQobykpO2U9KG8sYSk9PntvLl9zZXRTZWxlY3RlZChyLmluZGV4T2YoYS50b1N0cmluZygpKT4tMSl9fWVsc2UgZT0ocixvKT0+e3IuX3NldFNlbGVjdGVkKCExKX07dGhpcy5fb3B0aW9uTWFwLmZvckVhY2goZSl9cmVnaXN0ZXJPbkNoYW5nZSh0KXt0aGlzLm9uQ2hhbmdlPWU9PntsZXQgcj1bXSxvPWUuc2VsZWN0ZWRPcHRpb25zO2lmKG8hPT12b2lkIDApe2xldCBhPW87Zm9yKGxldCBzPTA7czxhLmxlbmd0aDtzKyspe2xldCBjPWFbc10sZD10aGlzLl9nZXRPcHRpb25WYWx1ZShjLnZhbHVlKTtyLnB1c2goZCl9fWVsc2V7bGV0IGE9ZS5vcHRpb25zO2ZvcihsZXQgcz0wO3M8YS5sZW5ndGg7cysrKXtsZXQgYz1hW3NdO2lmKGMuc2VsZWN0ZWQpe2xldCBkPXRoaXMuX2dldE9wdGlvblZhbHVlKGMudmFsdWUpO3IucHVzaChkKX19fXRoaXMudmFsdWU9cix0KHIpfX1fcmVnaXN0ZXJPcHRpb24odCl7bGV0IGU9KHRoaXMuX2lkQ291bnRlcisrKS50b1N0cmluZygpO3JldHVybiB0aGlzLl9vcHRpb25NYXAuc2V0KGUsdCksZX1fZ2V0T3B0aW9uSWQodCl7Zm9yKGxldCBlIG9mIHRoaXMuX29wdGlvbk1hcC5rZXlzKCkpaWYodGhpcy5fY29tcGFyZVdpdGgodGhpcy5fb3B0aW9uTWFwLmdldChlKS5fdmFsdWUsdCkpcmV0dXJuIGU7cmV0dXJuIG51bGx9X2dldE9wdGlvblZhbHVlKHQpe2xldCBlPVpwKHQpO3JldHVybiB0aGlzLl9vcHRpb25NYXAuaGFzKGUpP3RoaXMuX29wdGlvbk1hcC5nZXQoZSkuX3ZhbHVlOnR9c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgdDtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuKHR8fCh0PVooaSkpKShyfHxpKX19KSgpO3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyJzZWxlY3QiLCJtdWx0aXBsZSIsIiIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsic2VsZWN0IiwibXVsdGlwbGUiLCIiLCJmb3JtQ29udHJvbCIsIiJdLFsic2VsZWN0IiwibXVsdGlwbGUiLCIiLCJuZ01vZGVsIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMSYmZHQoImNoYW5nZSIsZnVuY3Rpb24oYSl7cmV0dXJuIHIub25DaGFuZ2UoYS50YXJnZXQpfSkoImJsdXIiLGZ1bmN0aW9uKCl7cmV0dXJuIHIub25Ub3VjaGVkKCl9KX0saW5wdXRzOntjb21wYXJlV2l0aDoiY29tcGFyZVdpdGgifSxzdGFuZGFsb25lOiExLGZlYXR1cmVzOlt6KFtLcF0pLExdfSl9cmV0dXJuIGl9KSgpLFN3PSgoKT0+e2NsYXNzIGl7X2VsZW1lbnQ7X3JlbmRlcmVyO19zZWxlY3Q7aWQ7X3ZhbHVlO2NvbnN0cnVjdG9yKHQsZSxyKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fcmVuZGVyZXI9ZSx0aGlzLl9zZWxlY3Q9cix0aGlzLl9zZWxlY3QmJih0aGlzLmlkPXRoaXMuX3NlbGVjdC5fcmVnaXN0ZXJPcHRpb24odGhpcykpfXNldCBuZ1ZhbHVlKHQpe3RoaXMuX3NlbGVjdCE9bnVsbCYmKHRoaXMuX3ZhbHVlPXQsdGhpcy5fc2V0RWxlbWVudFZhbHVlKGx1KHRoaXMuaWQsdCkpLHRoaXMuX3NlbGVjdC53cml0ZVZhbHVlKHRoaXMuX3NlbGVjdC52YWx1ZSkpfXNldCB2YWx1ZSh0KXt0aGlzLl9zZWxlY3Q/KHRoaXMuX3ZhbHVlPXQsdGhpcy5fc2V0RWxlbWVudFZhbHVlKGx1KHRoaXMuaWQsdCkpLHRoaXMuX3NlbGVjdC53cml0ZVZhbHVlKHRoaXMuX3NlbGVjdC52YWx1ZSkpOnRoaXMuX3NldEVsZW1lbnRWYWx1ZSh0KX1fc2V0RWxlbWVudFZhbHVlKHQpe3RoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCwidmFsdWUiLHQpfV9zZXRTZWxlY3RlZCh0KXt0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsInNlbGVjdGVkIix0KX1uZ09uRGVzdHJveSgpe3RoaXMuX3NlbGVjdCYmKHRoaXMuX3NlbGVjdC5fb3B0aW9uTWFwLmRlbGV0ZSh0aGlzLmlkKSx0aGlzLl9zZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLl9zZWxlY3QudmFsdWUpKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSkoQyhEKSxDKGx0KSxDKGt1LDkpKX07c3RhdGljIFx1MDI3NWRpcj1wKHt0eXBlOmksc2VsZWN0b3JzOltbIm9wdGlvbiJdXSxpbnB1dHM6e25nVmFsdWU6Im5nVmFsdWUiLHZhbHVlOiJ2YWx1ZSJ9LHN0YW5kYWxvbmU6ITF9KX1yZXR1cm4gaX0pKCk7Q289KCgpPT57Y2xhc3MgaXtfdmFsaWRhdG9yPXNvO19vbkNoYW5nZTtfZW5hYmxlZDtuZ09uQ2hhbmdlcyh0KXtpZih0aGlzLmlucHV0TmFtZSBpbiB0KXtsZXQgZT10aGlzLm5vcm1hbGl6ZUlucHV0KHRbdGhpcy5pbnB1dE5hbWVdLmN1cnJlbnRWYWx1ZSk7dGhpcy5fZW5hYmxlZD10aGlzLmVuYWJsZWQoZSksdGhpcy5fdmFsaWRhdG9yPXRoaXMuX2VuYWJsZWQ/dGhpcy5jcmVhdGVWYWxpZGF0b3IoZSk6c28sdGhpcy5fb25DaGFuZ2UmJnRoaXMuX29uQ2hhbmdlKCl9fXZhbGlkYXRlKHQpe3JldHVybiB0aGlzLl92YWxpZGF0b3IodCl9cmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSh0KXt0aGlzLl9vbkNoYW5nZT10fWVuYWJsZWQodCl7cmV0dXJuIHQhPW51bGx9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxmZWF0dXJlczpbbXRdfSl9cmV0dXJuIGl9KSgpLFhwPXtwcm92aWRlOnVlLHVzZUV4aXN0aW5nOmd0KCgpPT5RcCksbXVsdGk6ITB9LFFwPSgoKT0+e2NsYXNzIGkgZXh0ZW5kcyBDb3tyZXF1aXJlZDtpbnB1dE5hbWU9InJlcXVpcmVkIjtub3JtYWxpemVJbnB1dD1GO2NyZWF0ZVZhbGlkYXRvcj10PT51dTtlbmFibGVkKHQpe3JldHVybiB0fXN0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybih0fHwodD1aKGkpKSkocnx8aSl9fSkoKTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiLDMsInR5cGUiLCJjaGVja2JveCJdLFsiIiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbCIsIiIsMywidHlwZSIsImNoZWNrYm94Il0sWyIiLCJyZXF1aXJlZCIsIiIsIm5nTW9kZWwiLCIiLDMsInR5cGUiLCJjaGVja2JveCJdXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMiYmdHQoInJlcXVpcmVkIixyLl9lbmFibGVkPyIiOm51bGwpfSxpbnB1dHM6e3JlcXVpcmVkOiJyZXF1aXJlZCJ9LHN0YW5kYWxvbmU6ITEsZmVhdHVyZXM6W3ooW1hwXSksTF19KX1yZXR1cm4gaX0pKCksSnA9e3Byb3ZpZGU6dWUsdXNlRXhpc3Rpbmc6Z3QoKCk9PnRnKSxtdWx0aTohMH0sdGc9KCgpPT57Y2xhc3MgaSBleHRlbmRzIENve21pbmxlbmd0aDtpbnB1dE5hbWU9Im1pbmxlbmd0aCI7bm9ybWFsaXplSW5wdXQ9dD0+VHUodCk7Y3JlYXRlVmFsaWRhdG9yPXQ9Pmh1KHQpO3N0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybih0fHwodD1aKGkpKSkocnx8aSl9fSkoKTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwibWlubGVuZ3RoIiwiIiwiZm9ybUNvbnRyb2xOYW1lIiwiIl0sWyIiLCJtaW5sZW5ndGgiLCIiLCJmb3JtQ29udHJvbCIsIiJdLFsiIiwibWlubGVuZ3RoIiwiIiwibmdNb2RlbCIsIiJdXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMiYmdHQoIm1pbmxlbmd0aCIsci5fZW5hYmxlZD9yLm1pbmxlbmd0aDpudWxsKX0saW5wdXRzOnttaW5sZW5ndGg6Im1pbmxlbmd0aCJ9LHN0YW5kYWxvbmU6ITEsZmVhdHVyZXM6W3ooW0pwXSksTF19KX1yZXR1cm4gaX0pKCksZWc9e3Byb3ZpZGU6dWUsdXNlRXhpc3Rpbmc6Z3QoKCk9PmlnKSxtdWx0aTohMH0saWc9KCgpPT57Y2xhc3MgaSBleHRlbmRzIENve21heGxlbmd0aDtpbnB1dE5hbWU9Im1heGxlbmd0aCI7bm9ybWFsaXplSW5wdXQ9dD0+VHUodCk7Y3JlYXRlVmFsaWRhdG9yPXQ9Pm11KHQpO3N0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybih0fHwodD1aKGkpKSkocnx8aSl9fSkoKTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwibWF4bGVuZ3RoIiwiIiwiZm9ybUNvbnRyb2xOYW1lIiwiIl0sWyIiLCJtYXhsZW5ndGgiLCIiLCJmb3JtQ29udHJvbCIsIiJdLFsiIiwibWF4bGVuZ3RoIiwiIiwibmdNb2RlbCIsIiJdXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMiYmdHQoIm1heGxlbmd0aCIsci5fZW5hYmxlZD9yLm1heGxlbmd0aDpudWxsKX0saW5wdXRzOnttYXhsZW5ndGg6Im1heGxlbmd0aCJ9LHN0YW5kYWxvbmU6ITEsZmVhdHVyZXM6W3ooW2VnXSksTF19KX1yZXR1cm4gaX0pKCksbmc9e3Byb3ZpZGU6dWUsdXNlRXhpc3Rpbmc6Z3QoKCk9PnJnKSxtdWx0aTohMH0scmc9KCgpPT57Y2xhc3MgaSBleHRlbmRzIENve3BhdHRlcm47aW5wdXROYW1lPSJwYXR0ZXJuIjtub3JtYWxpemVJbnB1dD10PT50O2NyZWF0ZVZhbGlkYXRvcj10PT5mdSh0KTtzdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCB0O3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4odHx8KHQ9WihpKSkpKHJ8fGkpfX0pKCk7c3RhdGljIFx1MDI3NWRpcj1wKHt0eXBlOmksc2VsZWN0b3JzOltbIiIsInBhdHRlcm4iLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbIiIsInBhdHRlcm4iLCIiLCJmb3JtQ29udHJvbCIsIiJdLFsiIiwicGF0dGVybiIsIiIsIm5nTW9kZWwiLCIiXV0saG9zdFZhcnM6MSxob3N0QmluZGluZ3M6ZnVuY3Rpb24oZSxyKXtlJjImJnR0KCJwYXR0ZXJuIixyLl9lbmFibGVkP3IucGF0dGVybjpudWxsKX0saW5wdXRzOntwYXR0ZXJuOiJwYXR0ZXJuIn0sc3RhbmRhbG9uZTohMSxmZWF0dXJlczpbeihbbmddKSxMXX0pfXJldHVybiBpfSkoKSxGdT0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NW1vZD1SKHt0eXBlOml9KTtzdGF0aWMgXHUwMjc1aW5qPVMoe30pfXJldHVybiBpfSkoKSxEdz0oKCk9PntjbGFzcyBpe3N0YXRpYyB3aXRoQ29uZmlnKHQpe3JldHVybntuZ01vZHVsZTppLHByb3ZpZGVyczpbe3Byb3ZpZGU6TGksdXNlVmFsdWU6dC5jYWxsU2V0RGlzYWJsZWRTdGF0ZT8/eW99XX19c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1bW9kPVIoe3R5cGU6aX0pO3N0YXRpYyBcdTAyNzVpbmo9Uyh7aW1wb3J0czpbRnVdfSl9cmV0dXJuIGl9KSgpLFJ3PSgoKT0+e2NsYXNzIGl7c3RhdGljIHdpdGhDb25maWcodCl7cmV0dXJue25nTW9kdWxlOmkscHJvdmlkZXJzOlt7cHJvdmlkZTpNcyx1c2VWYWx1ZTp0Lndhcm5Pbk5nTW9kZWxXaXRoRm9ybUNvbnRyb2w/PyJhbHdheXMifSx7cHJvdmlkZTpMaSx1c2VWYWx1ZTp0LmNhbGxTZXREaXNhYmxlZFN0YXRlPz95b31dfX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVtb2Q9Uih7dHlwZTppfSk7c3RhdGljIFx1MDI3NWluaj1TKHtpbXBvcnRzOltGdV19KX1yZXR1cm4gaX0pKCl9KTt2YXIgT3MsUHUsTHU9XygoKT0+e2YoKTtmKCk7bnQoKTtodCgpO09zPWNsYXNze19ib3g7X2Rlc3Ryb3llZD1uZXcgeTtfcmVzaXplU3ViamVjdD1uZXcgeTtfcmVzaXplT2JzZXJ2ZXI7X2VsZW1lbnRPYnNlcnZhYmxlcz1uZXcgTWFwO2NvbnN0cnVjdG9yKG4pe3RoaXMuX2JveD1uLHR5cGVvZiBSZXNpemVPYnNlcnZlcjwidSImJih0aGlzLl9yZXNpemVPYnNlcnZlcj1uZXcgUmVzaXplT2JzZXJ2ZXIodD0+dGhpcy5fcmVzaXplU3ViamVjdC5uZXh0KHQpKSl9b2JzZXJ2ZShuKXtyZXR1cm4gdGhpcy5fZWxlbWVudE9ic2VydmFibGVzLmhhcyhuKXx8dGhpcy5fZWxlbWVudE9ic2VydmFibGVzLnNldChuLG5ldyBZdCh0PT57bGV0IGU9dGhpcy5fcmVzaXplU3ViamVjdC5zdWJzY3JpYmUodCk7cmV0dXJuIHRoaXMuX3Jlc2l6ZU9ic2VydmVyPy5vYnNlcnZlKG4se2JveDp0aGlzLl9ib3h9KSwoKT0+e3RoaXMuX3Jlc2l6ZU9ic2VydmVyPy51bm9ic2VydmUobiksZS51bnN1YnNjcmliZSgpLHRoaXMuX2VsZW1lbnRPYnNlcnZhYmxlcy5kZWxldGUobil9fSkucGlwZShLKHQ9PnQuc29tZShlPT5lLnRhcmdldD09PW4pKSxKZSh7YnVmZmVyU2l6ZToxLHJlZkNvdW50OiEwfSksRHQodGhpcy5fZGVzdHJveWVkKSkpLHRoaXMuX2VsZW1lbnRPYnNlcnZhYmxlcy5nZXQobil9ZGVzdHJveSgpe3RoaXMuX2Rlc3Ryb3llZC5uZXh0KCksdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCksdGhpcy5fcmVzaXplU3ViamVjdC5jb21wbGV0ZSgpLHRoaXMuX2VsZW1lbnRPYnNlcnZhYmxlcy5jbGVhcigpfX0sUHU9KCgpPT57Y2xhc3MgaXtfY2xlYW51cEVycm9yTGlzdGVuZXI7X29ic2VydmVycz1uZXcgTWFwO19uZ1pvbmU9bChFKTtjb25zdHJ1Y3Rvcigpe3R5cGVvZiBSZXNpemVPYnNlcnZlcjwidSJ9bmdPbkRlc3Ryb3koKXtmb3IobGV0Wyx0XW9mIHRoaXMuX29ic2VydmVycyl0LmRlc3Ryb3koKTt0aGlzLl9vYnNlcnZlcnMuY2xlYXIoKSx0aGlzLl9jbGVhbnVwRXJyb3JMaXN0ZW5lcj8uKCl9b2JzZXJ2ZSh0LGUpe2xldCByPWU/LmJveHx8ImNvbnRlbnQtYm94IjtyZXR1cm4gdGhpcy5fb2JzZXJ2ZXJzLmhhcyhyKXx8dGhpcy5fb2JzZXJ2ZXJzLnNldChyLG5ldyBPcyhyKSksdGhpcy5fb2JzZXJ2ZXJzLmdldChyKS5vYnNlcnZlKHQpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7ZnVuY3Rpb24gdWcoaSxuKXtpJjEmJm5lKDAsInNwYW4iLDIxKX1mdW5jdGlvbiBoZyhpLG4pe2lmKGkmMSYmKGN0KDAsImxhYmVsIiwyMCksVSgxLDEpLHZ0KDIsdWcsMSwwLCJzcGFuIiwyMSkscnQoKSksaSYyKXtsZXQgdD1IdCgyKTtpaSgiZmxvYXRpbmciLHQuX3Nob3VsZExhYmVsRmxvYXQoKSkoIm1vbml0b3JSZXNpemUiLHQuX2hhc091dGxpbmUoKSkoImlkIix0Ll9sYWJlbElkKSx0dCgiZm9yIix0Ll9jb250cm9sLmRpc2FibGVBdXRvbWF0aWNMYWJlbGluZz9udWxsOnQuX2NvbnRyb2wuaWQpLHEoMiksX3QoIXQuaGlkZVJlcXVpcmVkTWFya2VyJiZ0Ll9jb250cm9sLnJlcXVpcmVkPzI6LTEpfX1mdW5jdGlvbiBtZyhpLG4pe2lmKGkmMSYmdnQoMCxoZywzLDUsImxhYmVsIiwyMCksaSYyKXtsZXQgdD1IdCgpO190KHQuX2hhc0Zsb2F0aW5nTGFiZWwoKT8wOi0xKX19ZnVuY3Rpb24gZmcoaSxuKXtpJjEmJm5lKDAsImRpdiIsNyl9ZnVuY3Rpb24gcGcoaSxuKXt9ZnVuY3Rpb24gZ2coaSxuKXtpZihpJjEmJmVpKDAscGcsMCwwLCJuZy10ZW1wbGF0ZSIsMTMpLGkmMil7SHQoMik7bGV0IHQ9am8oMSk7aWkoIm5nVGVtcGxhdGVPdXRsZXQiLHQpfX1mdW5jdGlvbiB2ZyhpLG4pe2lmKGkmMSYmKGN0KDAsImRpdiIsOSksdnQoMSxnZywxLDEsbnVsbCwxMykscnQoKSksaSYyKXtsZXQgdD1IdCgpO2lpKCJtYXRGb3JtRmllbGROb3RjaGVkT3V0bGluZU9wZW4iLHQuX3Nob3VsZExhYmVsRmxvYXQoKSkscSgpLF90KHQuX2ZvcmNlRGlzcGxheUluZml4TGFiZWwoKT8tMToxKX19ZnVuY3Rpb24gX2coaSxuKXtpJjEmJihjdCgwLCJkaXYiLDEwLDIpLFUoMiwyKSxydCgpKX1mdW5jdGlvbiBiZyhpLG4pe2kmMSYmKGN0KDAsImRpdiIsMTEsMyksVSgyLDMpLHJ0KCkpfWZ1bmN0aW9uIHlnKGksbil7fWZ1bmN0aW9uIENnKGksbil7aWYoaSYxJiZlaSgwLHlnLDAsMCwibmctdGVtcGxhdGUiLDEzKSxpJjIpe0h0KCk7bGV0IHQ9am8oMSk7aWkoIm5nVGVtcGxhdGVPdXRsZXQiLHQpfX1mdW5jdGlvbiB4ZyhpLG4pe2kmMSYmKGN0KDAsImRpdiIsMTQsNCksVSgyLDQpLHJ0KCkpfWZ1bmN0aW9uIHdnKGksbil7aSYxJiYoY3QoMCwiZGl2IiwxNSw1KSxVKDIsNSkscnQoKSl9ZnVuY3Rpb24gRWcoaSxuKXtpJjEmJm5lKDAsImRpdiIsMTYpfWZ1bmN0aW9uIFNnKGksbil7aSYxJiYoY3QoMCwiZGl2IiwxOCksVSgxLDYpLHJ0KCkpfWZ1bmN0aW9uIERnKGksbil7aWYoaSYxJiYoY3QoMCwibWF0LWhpbnQiLDIyKSxXaSgxKSxydCgpKSxpJjIpe2xldCB0PUh0KDIpO2lpKCJpZCIsdC5faGludExhYmVsSWQpLHEoKSxsbCh0LmhpbnRMYWJlbCl9fWZ1bmN0aW9uIFJnKGksbil7aWYoaSYxJiYoY3QoMCwiZGl2IiwxOSksdnQoMSxEZywyLDIsIm1hdC1oaW50IiwyMiksVSgyLDcpLG5lKDMsImRpdiIsMjMpLFUoNCw4KSxydCgpKSxpJjIpe2xldCB0PUh0KCk7cSgpLF90KHQuaGludExhYmVsPzE6LTEpfX1mdW5jdGlvbiBPZyhpKXtsZXQgbj1pO2lmKG4ub2Zmc2V0UGFyZW50IT09bnVsbClyZXR1cm4gbi5zY3JvbGxXaWR0aDtsZXQgdD1uLmNsb25lTm9kZSghMCk7dC5zdHlsZS5zZXRQcm9wZXJ0eSgicG9zaXRpb24iLCJhYnNvbHV0ZSIpLHQuc3R5bGUuc2V0UHJvcGVydHkoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgtOTk5OXB4LCAtOTk5OXB4KSIpLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0KTtsZXQgZT10LnNjcm9sbFdpZHRoO3JldHVybiB0LnJlbW92ZSgpLGV9dmFyIG9nLGFnLHNnLFZ1LGp1LEJ1LHp1LGxnLGNnLGRnLGtzLEZzLEFnLFRzLE5zLE1nLFBzLElnLFl1LFV1LEh1LHhvLCR1LFd1LHdvLEVvLEt1LEd1LGtnLHF1LFRnLExzLFNvPV8oKCk9PntxZSgpO3ZuKCk7bm8oKTtPaSgpO1BlKCk7ZigpO2YoKTtudCgpO2h0KCk7THUoKTtUaSgpO29nPVsibm90Y2giXSxhZz1bIm1hdEZvcm1GaWVsZE5vdGNoZWRPdXRsaW5lIiwiIl0sc2c9WyIqIl0sVnU9WyJpY29uUHJlZml4Q29udGFpbmVyIl0sanU9WyJ0ZXh0UHJlZml4Q29udGFpbmVyIl0sQnU9WyJpY29uU3VmZml4Q29udGFpbmVyIl0senU9WyJ0ZXh0U3VmZml4Q29udGFpbmVyIl0sbGc9WyJ0ZXh0RmllbGQiXSxjZz1bIioiLFtbIm1hdC1sYWJlbCJdXSxbWyIiLCJtYXRQcmVmaXgiLCIiXSxbIiIsIm1hdEljb25QcmVmaXgiLCIiXV0sW1siIiwibWF0VGV4dFByZWZpeCIsIiJdXSxbWyIiLCJtYXRUZXh0U3VmZml4IiwiIl1dLFtbIiIsIm1hdFN1ZmZpeCIsIiJdLFsiIiwibWF0SWNvblN1ZmZpeCIsIiJdXSxbWyJtYXQtZXJyb3IiXSxbIiIsIm1hdEVycm9yIiwiIl1dLFtbIm1hdC1oaW50IiwzLCJhbGlnbiIsImVuZCJdXSxbWyJtYXQtaGludCIsImFsaWduIiwiZW5kIl1dXSxkZz1bIioiLCJtYXQtbGFiZWwiLCJbbWF0UHJlZml4XSwgW21hdEljb25QcmVmaXhdIiwiW21hdFRleHRQcmVmaXhdIiwiW21hdFRleHRTdWZmaXhdIiwiW21hdFN1ZmZpeF0sIFttYXRJY29uU3VmZml4XSIsIm1hdC1lcnJvciwgW21hdEVycm9yXSIsIm1hdC1oaW50Om5vdChbYWxpZ249J2VuZCddKSIsIm1hdC1oaW50W2FsaWduPSdlbmQnXSJdO2tzPSgoKT0+e2NsYXNzIGl7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1sibWF0LWxhYmVsIl1dfSl9cmV0dXJuIGl9KSgpLEZzPW5ldyB2KCJNYXRFcnJvciIpLEFnPSgoKT0+e2NsYXNzIGl7aWQ9bChXdCkuZ2V0SWQoIm1hdC1tZGMtZXJyb3ItIik7Y29uc3RydWN0b3IoKXt9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1sibWF0LWVycm9yIl0sWyIiLCJtYXRFcnJvciIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtZm9ybS1maWVsZC1lcnJvciIsIm1hdC1tZGMtZm9ybS1maWVsZC1ib3R0b20tYWxpZ24iXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMiYmSGkoImlkIixyLmlkKX0saW5wdXRzOntpZDoiaWQifSxmZWF0dXJlczpbeihbe3Byb3ZpZGU6RnMsdXNlRXhpc3Rpbmc6aX1dKV19KX1yZXR1cm4gaX0pKCksVHM9KCgpPT57Y2xhc3MgaXthbGlnbj0ic3RhcnQiO2lkPWwoV3QpLmdldElkKCJtYXQtbWRjLWhpbnQtIik7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1sibWF0LWhpbnQiXV0saG9zdEF0dHJzOlsxLCJtYXQtbWRjLWZvcm0tZmllbGQtaGludCIsIm1hdC1tZGMtZm9ybS1maWVsZC1ib3R0b20tYWxpZ24iXSxob3N0VmFyczo0LGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMiYmKEhpKCJpZCIsci5pZCksdHQoImFsaWduIixudWxsKSxIKCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC1lbmQiLHIuYWxpZ249PT0iZW5kIikpfSxpbnB1dHM6e2FsaWduOiJhbGlnbiIsaWQ6ImlkIn19KX1yZXR1cm4gaX0pKCksTnM9bmV3IHYoIk1hdFByZWZpeCIpLE1nPSgoKT0+e2NsYXNzIGl7c2V0IF9pc1RleHRTZWxlY3Rvcih0KXt0aGlzLl9pc1RleHQ9ITB9X2lzVGV4dD0hMTtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyIiLCJtYXRQcmVmaXgiLCIiXSxbIiIsIm1hdEljb25QcmVmaXgiLCIiXSxbIiIsIm1hdFRleHRQcmVmaXgiLCIiXV0saW5wdXRzOntfaXNUZXh0U2VsZWN0b3I6WzAsIm1hdFRleHRQcmVmaXgiLCJfaXNUZXh0U2VsZWN0b3IiXX0sZmVhdHVyZXM6W3ooW3twcm92aWRlOk5zLHVzZUV4aXN0aW5nOml9XSldfSl9cmV0dXJuIGl9KSgpLFBzPW5ldyB2KCJNYXRTdWZmaXgiKSxJZz0oKCk9PntjbGFzcyBpe3NldCBfaXNUZXh0U2VsZWN0b3IodCl7dGhpcy5faXNUZXh0PSEwfV9pc1RleHQ9ITE7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1ZGlyPXAoe3R5cGU6aSxzZWxlY3RvcnM6W1siIiwibWF0U3VmZml4IiwiIl0sWyIiLCJtYXRJY29uU3VmZml4IiwiIl0sWyIiLCJtYXRUZXh0U3VmZml4IiwiIl1dLGlucHV0czp7X2lzVGV4dFNlbGVjdG9yOlswLCJtYXRUZXh0U3VmZml4IiwiX2lzVGV4dFNlbGVjdG9yIl19LGZlYXR1cmVzOlt6KFt7cHJvdmlkZTpQcyx1c2VFeGlzdGluZzppfV0pXX0pfXJldHVybiBpfSkoKSxZdT1uZXcgdigiRmxvYXRpbmdMYWJlbFBhcmVudCIpLFV1PSgoKT0+e2NsYXNzIGl7X2VsZW1lbnRSZWY9bChEKTtnZXQgZmxvYXRpbmcoKXtyZXR1cm4gdGhpcy5fZmxvYXRpbmd9c2V0IGZsb2F0aW5nKHQpe3RoaXMuX2Zsb2F0aW5nPXQsdGhpcy5tb25pdG9yUmVzaXplJiZ0aGlzLl9oYW5kbGVSZXNpemUoKX1fZmxvYXRpbmc9ITE7Z2V0IG1vbml0b3JSZXNpemUoKXtyZXR1cm4gdGhpcy5fbW9uaXRvclJlc2l6ZX1zZXQgbW9uaXRvclJlc2l6ZSh0KXt0aGlzLl9tb25pdG9yUmVzaXplPXQsdGhpcy5fbW9uaXRvclJlc2l6ZT90aGlzLl9zdWJzY3JpYmVUb1Jlc2l6ZSgpOnRoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfV9tb25pdG9yUmVzaXplPSExO19yZXNpemVPYnNlcnZlcj1sKFB1KTtfbmdab25lPWwoRSk7X3BhcmVudD1sKFl1KTtfcmVzaXplU3Vic2NyaXB0aW9uPW5ldyBmdDtjb25zdHJ1Y3Rvcigpe31uZ09uRGVzdHJveSgpe3RoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfWdldFdpZHRoKCl7cmV0dXJuIE9nKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCl9Z2V0IGVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50fV9oYW5kbGVSZXNpemUoKXtzZXRUaW1lb3V0KCgpPT50aGlzLl9wYXJlbnQuX2hhbmRsZUxhYmVsUmVzaXplZCgpKX1fc3Vic2NyaWJlVG9SZXNpemUoKXt0aGlzLl9yZXNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLl9yZXNpemVTdWJzY3JpcHRpb249dGhpcy5fcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQse2JveDoiYm9yZGVyLWJveCJ9KS5zdWJzY3JpYmUoKCk9PnRoaXMuX2hhbmRsZVJlc2l6ZSgpKX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWRpcj1wKHt0eXBlOmksc2VsZWN0b3JzOltbImxhYmVsIiwibWF0Rm9ybUZpZWxkRmxvYXRpbmdMYWJlbCIsIiJdXSxob3N0QXR0cnM6WzEsIm1kYy1mbG9hdGluZy1sYWJlbCIsIm1hdC1tZGMtZmxvYXRpbmctbGFiZWwiXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMiYmSCgibWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSIsci5mbG9hdGluZyl9LGlucHV0czp7ZmxvYXRpbmc6ImZsb2F0aW5nIixtb25pdG9yUmVzaXplOiJtb25pdG9yUmVzaXplIn19KX1yZXR1cm4gaX0pKCk7SHU9Im1kYy1saW5lLXJpcHBsZS0tYWN0aXZlIix4bz0ibWRjLWxpbmUtcmlwcGxlLS1kZWFjdGl2YXRpbmciLCR1PSgoKT0+e2NsYXNzIGl7X2VsZW1lbnRSZWY9bChEKTtfY2xlYW51cFRyYW5zaXRpb25FbmQ7Y29uc3RydWN0b3IoKXtsZXQgdD1sKEUpLGU9bChsdCk7dC5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e3RoaXMuX2NsZWFudXBUcmFuc2l0aW9uRW5kPWUubGlzdGVuKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwidHJhbnNpdGlvbmVuZCIsdGhpcy5faGFuZGxlVHJhbnNpdGlvbkVuZCl9KX1hY3RpdmF0ZSgpe2xldCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7dC5yZW1vdmUoeG8pLHQuYWRkKEh1KX1kZWFjdGl2YXRlKCl7dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoeG8pfV9oYW5kbGVUcmFuc2l0aW9uRW5kPXQ9PntsZXQgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LHI9ZS5jb250YWlucyh4byk7dC5wcm9wZXJ0eU5hbWU9PT0ib3BhY2l0eSImJnImJmUucmVtb3ZlKEh1LHhvKX07bmdPbkRlc3Ryb3koKXt0aGlzLl9jbGVhbnVwVHJhbnNpdGlvbkVuZCgpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWRpcj1wKHt0eXBlOmksc2VsZWN0b3JzOltbImRpdiIsIm1hdEZvcm1GaWVsZExpbmVSaXBwbGUiLCIiXV0saG9zdEF0dHJzOlsxLCJtZGMtbGluZS1yaXBwbGUiXX0pfXJldHVybiBpfSkoKSxXdT0oKCk9PntjbGFzcyBpe19lbGVtZW50UmVmPWwoRCk7X25nWm9uZT1sKEUpO29wZW49ITE7X25vdGNoO25nQWZ0ZXJWaWV3SW5pdCgpe2xldCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxlPXQucXVlcnlTZWxlY3RvcigiLm1kYy1mbG9hdGluZy1sYWJlbCIpO2U/KHQuY2xhc3NMaXN0LmFkZCgibWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQiKSx0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lPT0iZnVuY3Rpb24iJiYoZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IjBzIix0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PmUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIiKX0pKSk6dC5jbGFzc0xpc3QuYWRkKCJtZGMtbm90Y2hlZC1vdXRsaW5lLS1uby1sYWJlbCIpfV9zZXROb3RjaFdpZHRoKHQpe2xldCBlPXRoaXMuX25vdGNoLm5hdGl2ZUVsZW1lbnQ7IXRoaXMub3Blbnx8IXQ/ZS5zdHlsZS53aWR0aD0iIjplLnN0eWxlLndpZHRoPWBjYWxjKCR7dH1weCAqIHZhcigtLW1hdC1tZGMtZm9ybS1maWVsZC1mbG9hdGluZy1sYWJlbC1zY2FsZSwgMC43NSkgKyA5cHgpYH1fc2V0TWF4V2lkdGgodCl7dGhpcy5fbm90Y2gubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1tYXQtZm9ybS1maWVsZC1ub3RjaC1tYXgtd2lkdGgiLGBjYWxjKDEwMCUgLSAke3R9cHgpYCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fGkpfTtzdGF0aWMgXHUwMjc1Y21wPVAoe3R5cGU6aSxzZWxlY3RvcnM6W1siZGl2IiwibWF0Rm9ybUZpZWxkTm90Y2hlZE91dGxpbmUiLCIiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGUscil7aWYoZSYxJiZSdChvZyw1KSxlJjIpe2xldCBvO2V0KG89aXQoKSkmJihyLl9ub3RjaD1vLmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWRjLW5vdGNoZWQtb3V0bGluZSJdLGhvc3RWYXJzOjIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGUscil7ZSYyJiZIKCJtZGMtbm90Y2hlZC1vdXRsaW5lLS1ub3RjaGVkIixyLm9wZW4pfSxpbnB1dHM6e29wZW46WzAsIm1hdEZvcm1GaWVsZE5vdGNoZWRPdXRsaW5lT3BlbiIsIm9wZW4iXX0sYXR0cnM6YWcsbmdDb250ZW50U2VsZWN0b3JzOnNnLGRlY2xzOjUsdmFyczowLGNvbnN0czpbWyJub3RjaCIsIiJdLFsxLCJtYXQtbWRjLW5vdGNoLXBpZWNlIiwibWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyJdLFsxLCJtYXQtbWRjLW5vdGNoLXBpZWNlIiwibWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2giXSxbMSwibWF0LW1kYy1ub3RjaC1waWVjZSIsIm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGUscil7ZSYxJiYoVHQoKSxLdCgwLCJkaXYiLDEpLGtlKDEsImRpdiIsMiwwKSxVKDMpLFRlKCksS3QoNCwiZGl2IiwzKSl9LGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiBpfSkoKSx3bz0oKCk9PntjbGFzcyBpe3ZhbHVlO3N0YXRlQ2hhbmdlcztpZDtwbGFjZWhvbGRlcjtuZ0NvbnRyb2w7Zm9jdXNlZDtlbXB0eTtzaG91bGRMYWJlbEZsb2F0O3JlcXVpcmVkO2Rpc2FibGVkO2Vycm9yU3RhdGU7Y29udHJvbFR5cGU7YXV0b2ZpbGxlZDt1c2VyQXJpYURlc2NyaWJlZEJ5O2Rpc2FibGVBdXRvbWF0aWNMYWJlbGluZztkZXNjcmliZWRCeUlkcztzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppfSl9cmV0dXJuIGl9KSgpLEVvPW5ldyB2KCJNYXRGb3JtRmllbGQiKSxLdT1uZXcgdigiTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TIiksR3U9ImZpbGwiLGtnPSJhdXRvIixxdT0iZml4ZWQiLFRnPSJ0cmFuc2xhdGVZKC01MCUpIixMcz0oKCk9PntjbGFzcyBpe19lbGVtZW50UmVmPWwoRCk7X2NoYW5nZURldGVjdG9yUmVmPWwoQXQpO19wbGF0Zm9ybT1sKFQpO19pZEdlbmVyYXRvcj1sKFd0KTtfbmdab25lPWwoRSk7X2RlZmF1bHRzPWwoS3Use29wdGlvbmFsOiEwfSk7X2N1cnJlbnREaXJlY3Rpb247X3RleHRGaWVsZDtfaWNvblByZWZpeENvbnRhaW5lcjtfdGV4dFByZWZpeENvbnRhaW5lcjtfaWNvblN1ZmZpeENvbnRhaW5lcjtfdGV4dFN1ZmZpeENvbnRhaW5lcjtfZmxvYXRpbmdMYWJlbDtfbm90Y2hlZE91dGxpbmU7X2xpbmVSaXBwbGU7X2ljb25QcmVmaXhDb250YWluZXJTaWduYWw9R2koImljb25QcmVmaXhDb250YWluZXIiKTtfdGV4dFByZWZpeENvbnRhaW5lclNpZ25hbD1HaSgidGV4dFByZWZpeENvbnRhaW5lciIpO19pY29uU3VmZml4Q29udGFpbmVyU2lnbmFsPUdpKCJpY29uU3VmZml4Q29udGFpbmVyIik7X3RleHRTdWZmaXhDb250YWluZXJTaWduYWw9R2koInRleHRTdWZmaXhDb250YWluZXIiKTtfcHJlZml4U3VmZml4Q29udGFpbmVycz1adCgoKT0+W3RoaXMuX2ljb25QcmVmaXhDb250YWluZXJTaWduYWwoKSx0aGlzLl90ZXh0UHJlZml4Q29udGFpbmVyU2lnbmFsKCksdGhpcy5faWNvblN1ZmZpeENvbnRhaW5lclNpZ25hbCgpLHRoaXMuX3RleHRTdWZmaXhDb250YWluZXJTaWduYWwoKV0ubWFwKHQ9PnQ/Lm5hdGl2ZUVsZW1lbnQpLmZpbHRlcih0PT50IT09dm9pZCAwKSk7X2Zvcm1GaWVsZENvbnRyb2w7X3ByZWZpeENoaWxkcmVuO19zdWZmaXhDaGlsZHJlbjtfZXJyb3JDaGlsZHJlbjtfaGludENoaWxkcmVuO19sYWJlbENoaWxkPWhsKGtzKTtnZXQgaGlkZVJlcXVpcmVkTWFya2VyKCl7cmV0dXJuIHRoaXMuX2hpZGVSZXF1aXJlZE1hcmtlcn1zZXQgaGlkZVJlcXVpcmVkTWFya2VyKHQpe3RoaXMuX2hpZGVSZXF1aXJlZE1hcmtlcj1raSh0KX1faGlkZVJlcXVpcmVkTWFya2VyPSExO2NvbG9yPSJwcmltYXJ5IjtnZXQgZmxvYXRMYWJlbCgpe3JldHVybiB0aGlzLl9mbG9hdExhYmVsfHx0aGlzLl9kZWZhdWx0cz8uZmxvYXRMYWJlbHx8a2d9c2V0IGZsb2F0TGFiZWwodCl7dCE9PXRoaXMuX2Zsb2F0TGFiZWwmJih0aGlzLl9mbG9hdExhYmVsPXQsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfV9mbG9hdExhYmVsO2dldCBhcHBlYXJhbmNlKCl7cmV0dXJuIHRoaXMuX2FwcGVhcmFuY2VTaWduYWwoKX1zZXQgYXBwZWFyYW5jZSh0KXtsZXQgZT10fHx0aGlzLl9kZWZhdWx0cz8uYXBwZWFyYW5jZXx8R3U7dGhpcy5fYXBwZWFyYW5jZVNpZ25hbC5zZXQoZSl9X2FwcGVhcmFuY2VTaWduYWw9SihHdSk7Z2V0IHN1YnNjcmlwdFNpemluZygpe3JldHVybiB0aGlzLl9zdWJzY3JpcHRTaXppbmd8fHRoaXMuX2RlZmF1bHRzPy5zdWJzY3JpcHRTaXppbmd8fHF1fXNldCBzdWJzY3JpcHRTaXppbmcodCl7dGhpcy5fc3Vic2NyaXB0U2l6aW5nPXR8fHRoaXMuX2RlZmF1bHRzPy5zdWJzY3JpcHRTaXppbmd8fHF1fV9zdWJzY3JpcHRTaXppbmc9bnVsbDtnZXQgaGludExhYmVsKCl7cmV0dXJuIHRoaXMuX2hpbnRMYWJlbH1zZXQgaGludExhYmVsKHQpe3RoaXMuX2hpbnRMYWJlbD10LHRoaXMuX3Byb2Nlc3NIaW50cygpfV9oaW50TGFiZWw9IiI7X2hhc0ljb25QcmVmaXg9ITE7X2hhc1RleHRQcmVmaXg9ITE7X2hhc0ljb25TdWZmaXg9ITE7X2hhc1RleHRTdWZmaXg9ITE7X2xhYmVsSWQ9dGhpcy5faWRHZW5lcmF0b3IuZ2V0SWQoIm1hdC1tZGMtZm9ybS1maWVsZC1sYWJlbC0iKTtfaGludExhYmVsSWQ9dGhpcy5faWRHZW5lcmF0b3IuZ2V0SWQoIm1hdC1tZGMtaGludC0iKTtfZGVzY3JpYmVkQnlJZHM7Z2V0IF9jb250cm9sKCl7cmV0dXJuIHRoaXMuX2V4cGxpY2l0Rm9ybUZpZWxkQ29udHJvbHx8dGhpcy5fZm9ybUZpZWxkQ29udHJvbH1zZXQgX2NvbnRyb2wodCl7dGhpcy5fZXhwbGljaXRGb3JtRmllbGRDb250cm9sPXR9X2Rlc3Ryb3llZD1uZXcgeTtfaXNGb2N1c2VkPW51bGw7X2V4cGxpY2l0Rm9ybUZpZWxkQ29udHJvbDtfcHJldmlvdXNDb250cm9sPW51bGw7X3ByZXZpb3VzQ29udHJvbFZhbGlkYXRvckZuPW51bGw7X3N0YXRlQ2hhbmdlcztfdmFsdWVDaGFuZ2VzO19kZXNjcmliZWRCeUNoYW5nZXM7X291dGxpbmVMYWJlbE9mZnNldFJlc2l6ZU9ic2VydmVyPW51bGw7X2FuaW1hdGlvbnNEaXNhYmxlZD1HdCgpO2NvbnN0cnVjdG9yKCl7bGV0IHQ9dGhpcy5fZGVmYXVsdHMsZT1sKGxlKTt0JiYodC5hcHBlYXJhbmNlJiYodGhpcy5hcHBlYXJhbmNlPXQuYXBwZWFyYW5jZSksdGhpcy5faGlkZVJlcXVpcmVkTWFya2VyPSEhdD8uaGlkZVJlcXVpcmVkTWFya2VyLHQuY29sb3ImJih0aGlzLmNvbG9yPXQuY29sb3IpKSxOZSgoKT0+dGhpcy5fY3VycmVudERpcmVjdGlvbj1lLnZhbHVlU2lnbmFsKCkpLHRoaXMuX3N5bmNPdXRsaW5lTGFiZWxPZmZzZXQoKX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl91cGRhdGVGb2N1c1N0YXRlKCksdGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkfHx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntzZXRUaW1lb3V0KCgpPT57dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoIm1hdC1mb3JtLWZpZWxkLWFuaW1hdGlvbnMtZW5hYmxlZCIpfSwzMDApfSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2Fzc2VydEZvcm1GaWVsZENvbnRyb2woKSx0aGlzLl9pbml0aWFsaXplU3Vic2NyaXB0KCksdGhpcy5faW5pdGlhbGl6ZVByZWZpeEFuZFN1ZmZpeCgpfW5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpe3RoaXMuX2Fzc2VydEZvcm1GaWVsZENvbnRyb2woKSx0aGlzLl9jb250cm9sIT09dGhpcy5fcHJldmlvdXNDb250cm9sJiYodGhpcy5faW5pdGlhbGl6ZUNvbnRyb2wodGhpcy5fcHJldmlvdXNDb250cm9sKSx0aGlzLl9jb250cm9sLm5nQ29udHJvbCYmdGhpcy5fY29udHJvbC5uZ0NvbnRyb2wuY29udHJvbCYmKHRoaXMuX3ByZXZpb3VzQ29udHJvbFZhbGlkYXRvckZuPXRoaXMuX2NvbnRyb2wubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yKSx0aGlzLl9wcmV2aW91c0NvbnRyb2w9dGhpcy5fY29udHJvbCksdGhpcy5fY29udHJvbC5uZ0NvbnRyb2wmJnRoaXMuX2NvbnRyb2wubmdDb250cm9sLmNvbnRyb2wmJnRoaXMuX2NvbnRyb2wubmdDb250cm9sLmNvbnRyb2wudmFsaWRhdG9yIT09dGhpcy5fcHJldmlvdXNDb250cm9sVmFsaWRhdG9yRm4mJnRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfW5nT25EZXN0cm95KCl7dGhpcy5fb3V0bGluZUxhYmVsT2Zmc2V0UmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKSx0aGlzLl9zdGF0ZUNoYW5nZXM/LnVuc3Vic2NyaWJlKCksdGhpcy5fdmFsdWVDaGFuZ2VzPy51bnN1YnNjcmliZSgpLHRoaXMuX2Rlc2NyaWJlZEJ5Q2hhbmdlcz8udW5zdWJzY3JpYmUoKSx0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpfWdldExhYmVsSWQ9WnQoKCk9PnRoaXMuX2hhc0Zsb2F0aW5nTGFiZWwoKT90aGlzLl9sYWJlbElkOm51bGwpO2dldENvbm5lY3RlZE92ZXJsYXlPcmlnaW4oKXtyZXR1cm4gdGhpcy5fdGV4dEZpZWxkfHx0aGlzLl9lbGVtZW50UmVmfV9hbmltYXRlQW5kTG9ja0xhYmVsKCl7dGhpcy5faGFzRmxvYXRpbmdMYWJlbCgpJiYodGhpcy5mbG9hdExhYmVsPSJhbHdheXMiKX1faW5pdGlhbGl6ZUNvbnRyb2wodCl7bGV0IGU9dGhpcy5fY29udHJvbCxyPSJtYXQtbWRjLWZvcm0tZmllbGQtdHlwZS0iO3QmJnRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHIrdC5jb250cm9sVHlwZSksZS5jb250cm9sVHlwZSYmdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQocitlLmNvbnRyb2xUeXBlKSx0aGlzLl9zdGF0ZUNoYW5nZXM/LnVuc3Vic2NyaWJlKCksdGhpcy5fc3RhdGVDaGFuZ2VzPWUuc3RhdGVDaGFuZ2VzLnN1YnNjcmliZSgoKT0+e3RoaXMuX3VwZGF0ZUZvY3VzU3RhdGUoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pLHRoaXMuX2Rlc2NyaWJlZEJ5Q2hhbmdlcz8udW5zdWJzY3JpYmUoKSx0aGlzLl9kZXNjcmliZWRCeUNoYW5nZXM9ZS5zdGF0ZUNoYW5nZXMucGlwZShJZShbdm9pZCAwLHZvaWQgMF0pLGIoKCk9PltlLmVycm9yU3RhdGUsZS51c2VyQXJpYURlc2NyaWJlZEJ5XSksRm8oKSxLKChbW28sYV0sW3MsY11dKT0+byE9PXN8fGEhPT1jKSkuc3Vic2NyaWJlKCgpPT50aGlzLl9zeW5jRGVzY3JpYmVkQnlJZHMoKSksdGhpcy5fdmFsdWVDaGFuZ2VzPy51bnN1YnNjcmliZSgpLGUubmdDb250cm9sJiZlLm5nQ29udHJvbC52YWx1ZUNoYW5nZXMmJih0aGlzLl92YWx1ZUNoYW5nZXM9ZS5uZ0NvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoRHQodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpPT50aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSkpfV9jaGVja1ByZWZpeEFuZFN1ZmZpeFR5cGVzKCl7dGhpcy5faGFzSWNvblByZWZpeD0hIXRoaXMuX3ByZWZpeENoaWxkcmVuLmZpbmQodD0+IXQuX2lzVGV4dCksdGhpcy5faGFzVGV4dFByZWZpeD0hIXRoaXMuX3ByZWZpeENoaWxkcmVuLmZpbmQodD0+dC5faXNUZXh0KSx0aGlzLl9oYXNJY29uU3VmZml4PSEhdGhpcy5fc3VmZml4Q2hpbGRyZW4uZmluZCh0PT4hdC5faXNUZXh0KSx0aGlzLl9oYXNUZXh0U3VmZml4PSEhdGhpcy5fc3VmZml4Q2hpbGRyZW4uZmluZCh0PT50Ll9pc1RleHQpfV9pbml0aWFsaXplUHJlZml4QW5kU3VmZml4KCl7dGhpcy5fY2hlY2tQcmVmaXhBbmRTdWZmaXhUeXBlcygpLFVzKHRoaXMuX3ByZWZpeENoaWxkcmVuLmNoYW5nZXMsdGhpcy5fc3VmZml4Q2hpbGRyZW4uY2hhbmdlcykuc3Vic2NyaWJlKCgpPT57dGhpcy5fY2hlY2tQcmVmaXhBbmRTdWZmaXhUeXBlcygpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSl9X2luaXRpYWxpemVTdWJzY3JpcHQoKXt0aGlzLl9oaW50Q2hpbGRyZW4uY2hhbmdlcy5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9wcm9jZXNzSGludHMoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pLHRoaXMuX2Vycm9yQ2hpbGRyZW4uY2hhbmdlcy5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9zeW5jRGVzY3JpYmVkQnlJZHMoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pLHRoaXMuX3ZhbGlkYXRlSGludHMoKSx0aGlzLl9zeW5jRGVzY3JpYmVkQnlJZHMoKX1fYXNzZXJ0Rm9ybUZpZWxkQ29udHJvbCgpe3RoaXMuX2NvbnRyb2x9X3VwZGF0ZUZvY3VzU3RhdGUoKXtsZXQgdD10aGlzLl9jb250cm9sLmZvY3VzZWQ7dCYmIXRoaXMuX2lzRm9jdXNlZD8odGhpcy5faXNGb2N1c2VkPSEwLHRoaXMuX2xpbmVSaXBwbGU/LmFjdGl2YXRlKCkpOiF0JiYodGhpcy5faXNGb2N1c2VkfHx0aGlzLl9pc0ZvY3VzZWQ9PT1udWxsKSYmKHRoaXMuX2lzRm9jdXNlZD0hMSx0aGlzLl9saW5lUmlwcGxlPy5kZWFjdGl2YXRlKCkpLHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCJtYXQtZm9jdXNlZCIsdCksdGhpcy5fdGV4dEZpZWxkPy5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoIm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIix0KX1fc3luY091dGxpbmVMYWJlbE9mZnNldCgpe2ZsKHtlYXJseVJlYWQ6KCk9PntpZih0aGlzLl9hcHBlYXJhbmNlU2lnbmFsKCkhPT0ib3V0bGluZSIpcmV0dXJuIHRoaXMuX291dGxpbmVMYWJlbE9mZnNldFJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCksbnVsbDtpZihnbG9iYWxUaGlzLlJlc2l6ZU9ic2VydmVyKXt0aGlzLl9vdXRsaW5lTGFiZWxPZmZzZXRSZXNpemVPYnNlcnZlcnx8PW5ldyBnbG9iYWxUaGlzLlJlc2l6ZU9ic2VydmVyKCgpPT57dGhpcy5fd3JpdGVPdXRsaW5lZExhYmVsU3R5bGVzKHRoaXMuX2dldE91dGxpbmVkTGFiZWxPZmZzZXQoKSl9KTtmb3IobGV0IHQgb2YgdGhpcy5fcHJlZml4U3VmZml4Q29udGFpbmVycygpKXRoaXMuX291dGxpbmVMYWJlbE9mZnNldFJlc2l6ZU9ic2VydmVyLm9ic2VydmUodCx7Ym94OiJib3JkZXItYm94In0pfXJldHVybiB0aGlzLl9nZXRPdXRsaW5lZExhYmVsT2Zmc2V0KCl9LHdyaXRlOnQ9PnRoaXMuX3dyaXRlT3V0bGluZWRMYWJlbFN0eWxlcyh0KCkpfSl9X3Nob3VsZEFsd2F5c0Zsb2F0KCl7cmV0dXJuIHRoaXMuZmxvYXRMYWJlbD09PSJhbHdheXMifV9oYXNPdXRsaW5lKCl7cmV0dXJuIHRoaXMuYXBwZWFyYW5jZT09PSJvdXRsaW5lIn1fZm9yY2VEaXNwbGF5SW5maXhMYWJlbCgpe3JldHVybiF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJnRoaXMuX3ByZWZpeENoaWxkcmVuLmxlbmd0aCYmIXRoaXMuX3Nob3VsZExhYmVsRmxvYXQoKX1faGFzRmxvYXRpbmdMYWJlbD1adCgoKT0+ISF0aGlzLl9sYWJlbENoaWxkKCkpO19zaG91bGRMYWJlbEZsb2F0KCl7cmV0dXJuIHRoaXMuX2hhc0Zsb2F0aW5nTGFiZWwoKT90aGlzLl9jb250cm9sLnNob3VsZExhYmVsRmxvYXR8fHRoaXMuX3Nob3VsZEFsd2F5c0Zsb2F0KCk6ITF9X3Nob3VsZEZvcndhcmQodCl7bGV0IGU9dGhpcy5fY29udHJvbD90aGlzLl9jb250cm9sLm5nQ29udHJvbDpudWxsO3JldHVybiBlJiZlW3RdfV9nZXRTdWJzY3JpcHRNZXNzYWdlVHlwZSgpe3JldHVybiB0aGlzLl9lcnJvckNoaWxkcmVuJiZ0aGlzLl9lcnJvckNoaWxkcmVuLmxlbmd0aD4wJiZ0aGlzLl9jb250cm9sLmVycm9yU3RhdGU/ImVycm9yIjoiaGludCJ9X2hhbmRsZUxhYmVsUmVzaXplZCgpe3RoaXMuX3JlZnJlc2hPdXRsaW5lTm90Y2hXaWR0aCgpfV9yZWZyZXNoT3V0bGluZU5vdGNoV2lkdGgoKXshdGhpcy5faGFzT3V0bGluZSgpfHwhdGhpcy5fZmxvYXRpbmdMYWJlbHx8IXRoaXMuX3Nob3VsZExhYmVsRmxvYXQoKT90aGlzLl9ub3RjaGVkT3V0bGluZT8uX3NldE5vdGNoV2lkdGgoMCk6dGhpcy5fbm90Y2hlZE91dGxpbmU/Ll9zZXROb3RjaFdpZHRoKHRoaXMuX2Zsb2F0aW5nTGFiZWwuZ2V0V2lkdGgoKSl9X3Byb2Nlc3NIaW50cygpe3RoaXMuX3ZhbGlkYXRlSGludHMoKSx0aGlzLl9zeW5jRGVzY3JpYmVkQnlJZHMoKX1fdmFsaWRhdGVIaW50cygpe3RoaXMuX2hpbnRDaGlsZHJlbn1fc3luY0Rlc2NyaWJlZEJ5SWRzKCl7aWYodGhpcy5fY29udHJvbCl7bGV0IHQ9W107aWYodGhpcy5fY29udHJvbC51c2VyQXJpYURlc2NyaWJlZEJ5JiZ0eXBlb2YgdGhpcy5fY29udHJvbC51c2VyQXJpYURlc2NyaWJlZEJ5PT0ic3RyaW5nIiYmdC5wdXNoKC4uLnRoaXMuX2NvbnRyb2wudXNlckFyaWFEZXNjcmliZWRCeS5zcGxpdCgiICIpKSx0aGlzLl9nZXRTdWJzY3JpcHRNZXNzYWdlVHlwZSgpPT09ImhpbnQiKXtsZXQgbz10aGlzLl9oaW50Q2hpbGRyZW4/dGhpcy5faGludENoaWxkcmVuLmZpbmQocz0+cy5hbGlnbj09PSJzdGFydCIpOm51bGwsYT10aGlzLl9oaW50Q2hpbGRyZW4/dGhpcy5faGludENoaWxkcmVuLmZpbmQocz0+cy5hbGlnbj09PSJlbmQiKTpudWxsO28/dC5wdXNoKG8uaWQpOnRoaXMuX2hpbnRMYWJlbCYmdC5wdXNoKHRoaXMuX2hpbnRMYWJlbElkKSxhJiZ0LnB1c2goYS5pZCl9ZWxzZSB0aGlzLl9lcnJvckNoaWxkcmVuJiZ0LnB1c2goLi4udGhpcy5fZXJyb3JDaGlsZHJlbi5tYXAobz0+by5pZCkpO2xldCBlPXRoaXMuX2NvbnRyb2wuZGVzY3JpYmVkQnlJZHMscjtpZihlKXtsZXQgbz10aGlzLl9kZXNjcmliZWRCeUlkc3x8dDtyPXQuY29uY2F0KGUuZmlsdGVyKGE9PmEmJiFvLmluY2x1ZGVzKGEpKSl9ZWxzZSByPXQ7dGhpcy5fY29udHJvbC5zZXREZXNjcmliZWRCeUlkcyhyKSx0aGlzLl9kZXNjcmliZWRCeUlkcz10fX1fZ2V0T3V0bGluZWRMYWJlbE9mZnNldCgpe2lmKCF0aGlzLl9oYXNPdXRsaW5lKCl8fCF0aGlzLl9mbG9hdGluZ0xhYmVsKXJldHVybiBudWxsO2lmKCF0aGlzLl9pY29uUHJlZml4Q29udGFpbmVyJiYhdGhpcy5fdGV4dFByZWZpeENvbnRhaW5lcilyZXR1cm5bIiIsbnVsbF07aWYoIXRoaXMuX2lzQXR0YWNoZWRUb0RvbSgpKXJldHVybiBudWxsO2xldCB0PXRoaXMuX2ljb25QcmVmaXhDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQsZT10aGlzLl90ZXh0UHJlZml4Q29udGFpbmVyPy5uYXRpdmVFbGVtZW50LHI9dGhpcy5faWNvblN1ZmZpeENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCxvPXRoaXMuX3RleHRTdWZmaXhDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQsYT10Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD8/MCxzPWU/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoPz8wLGM9cj8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/PzAsZD1vPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD8/MCx1PXRoaXMuX2N1cnJlbnREaXJlY3Rpb249PT0icnRsIj8iLTEiOiIxIix4PWAke2Erc31weGAsQj1gY2FsYygke3V9ICogKCR7eH0gKyB2YXIoLS1tYXQtbWRjLWZvcm0tZmllbGQtbGFiZWwtb2Zmc2V0LXgsIDBweCkpKWAsST1gdmFyKC0tbWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsLXRyYW5zZm9ybSwgJHtUZ30gdHJhbnNsYXRlWCgke0J9KSlgLFY9YStzK2MrZDtyZXR1cm5bSSxWXX1fd3JpdGVPdXRsaW5lZExhYmVsU3R5bGVzKHQpe2lmKHQhPT1udWxsKXtsZXRbZSxyXT10O3RoaXMuX2Zsb2F0aW5nTGFiZWwmJih0aGlzLl9mbG9hdGluZ0xhYmVsLmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPWUpLHIhPT1udWxsJiZ0aGlzLl9ub3RjaGVkT3V0bGluZT8uX3NldE1heFdpZHRoKHIpfX1faXNBdHRhY2hlZFRvRG9tKCl7bGV0IHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2lmKHQuZ2V0Um9vdE5vZGUpe2xldCBlPXQuZ2V0Um9vdE5vZGUoKTtyZXR1cm4gZSYmZSE9PXR9cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0KX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVjbXA9UCh7dHlwZTppLHNlbGVjdG9yczpbWyJtYXQtZm9ybS1maWVsZCJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbihlLHIsbyl7aWYoZSYxJiYoc2wobyxyLl9sYWJlbENoaWxkLGtzLDUpLEZlKG8sd28sNSksRmUobyxOcyw1KSxGZShvLFBzLDUpLEZlKG8sRnMsNSksRmUobyxUcyw1KSksZSYyKXtWbygpO2xldCBhO2V0KGE9aXQoKSkmJihyLl9mb3JtRmllbGRDb250cm9sPWEuZmlyc3QpLGV0KGE9aXQoKSkmJihyLl9wcmVmaXhDaGlsZHJlbj1hKSxldChhPWl0KCkpJiYoci5fc3VmZml4Q2hpbGRyZW49YSksZXQoYT1pdCgpKSYmKHIuX2Vycm9yQ2hpbGRyZW49YSksZXQoYT1pdCgpKSYmKHIuX2hpbnRDaGlsZHJlbj1hKX19LHZpZXdRdWVyeTpmdW5jdGlvbihlLHIpe2lmKGUmMSYmKCRpKHIuX2ljb25QcmVmaXhDb250YWluZXJTaWduYWwsVnUsNSksJGkoci5fdGV4dFByZWZpeENvbnRhaW5lclNpZ25hbCxqdSw1KSwkaShyLl9pY29uU3VmZml4Q29udGFpbmVyU2lnbmFsLEJ1LDUpLCRpKHIuX3RleHRTdWZmaXhDb250YWluZXJTaWduYWwsenUsNSksUnQobGcsNSksUnQoVnUsNSksUnQoanUsNSksUnQoQnUsNSksUnQoenUsNSksUnQoVXUsNSksUnQoV3UsNSksUnQoJHUsNSkpLGUmMil7Vm8oNCk7bGV0IG87ZXQobz1pdCgpKSYmKHIuX3RleHRGaWVsZD1vLmZpcnN0KSxldChvPWl0KCkpJiYoci5faWNvblByZWZpeENvbnRhaW5lcj1vLmZpcnN0KSxldChvPWl0KCkpJiYoci5fdGV4dFByZWZpeENvbnRhaW5lcj1vLmZpcnN0KSxldChvPWl0KCkpJiYoci5faWNvblN1ZmZpeENvbnRhaW5lcj1vLmZpcnN0KSxldChvPWl0KCkpJiYoci5fdGV4dFN1ZmZpeENvbnRhaW5lcj1vLmZpcnN0KSxldChvPWl0KCkpJiYoci5fZmxvYXRpbmdMYWJlbD1vLmZpcnN0KSxldChvPWl0KCkpJiYoci5fbm90Y2hlZE91dGxpbmU9by5maXJzdCksZXQobz1pdCgpKSYmKHIuX2xpbmVSaXBwbGU9by5maXJzdCl9fSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtZm9ybS1maWVsZCJdLGhvc3RWYXJzOjM4LGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMiYmSCgibWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsLWFsd2F5cy1mbG9hdCIsci5fc2hvdWxkQWx3YXlzRmxvYXQoKSkoIm1hdC1tZGMtZm9ybS1maWVsZC1oYXMtaWNvbi1wcmVmaXgiLHIuX2hhc0ljb25QcmVmaXgpKCJtYXQtbWRjLWZvcm0tZmllbGQtaGFzLWljb24tc3VmZml4IixyLl9oYXNJY29uU3VmZml4KSgibWF0LWZvcm0tZmllbGQtaW52YWxpZCIsci5fY29udHJvbC5lcnJvclN0YXRlKSgibWF0LWZvcm0tZmllbGQtZGlzYWJsZWQiLHIuX2NvbnRyb2wuZGlzYWJsZWQpKCJtYXQtZm9ybS1maWVsZC1hdXRvZmlsbGVkIixyLl9jb250cm9sLmF1dG9maWxsZWQpKCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwiLHIuYXBwZWFyYW5jZT09ImZpbGwiKSgibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIixyLmFwcGVhcmFuY2U9PSJvdXRsaW5lIikoIm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIiLHIuX2hhc0Zsb2F0aW5nTGFiZWwoKSYmIXIuX3Nob3VsZExhYmVsRmxvYXQoKSkoIm1hdC1wcmltYXJ5IixyLmNvbG9yIT09ImFjY2VudCImJnIuY29sb3IhPT0id2FybiIpKCJtYXQtYWNjZW50IixyLmNvbG9yPT09ImFjY2VudCIpKCJtYXQtd2FybiIsci5jb2xvcj09PSJ3YXJuIikoIm5nLXVudG91Y2hlZCIsci5fc2hvdWxkRm9yd2FyZCgidW50b3VjaGVkIikpKCJuZy10b3VjaGVkIixyLl9zaG91bGRGb3J3YXJkKCJ0b3VjaGVkIikpKCJuZy1wcmlzdGluZSIsci5fc2hvdWxkRm9yd2FyZCgicHJpc3RpbmUiKSkoIm5nLWRpcnR5IixyLl9zaG91bGRGb3J3YXJkKCJkaXJ0eSIpKSgibmctdmFsaWQiLHIuX3Nob3VsZEZvcndhcmQoInZhbGlkIikpKCJuZy1pbnZhbGlkIixyLl9zaG91bGRGb3J3YXJkKCJpbnZhbGlkIikpKCJuZy1wZW5kaW5nIixyLl9zaG91bGRGb3J3YXJkKCJwZW5kaW5nIikpfSxpbnB1dHM6e2hpZGVSZXF1aXJlZE1hcmtlcjoiaGlkZVJlcXVpcmVkTWFya2VyIixjb2xvcjoiY29sb3IiLGZsb2F0TGFiZWw6ImZsb2F0TGFiZWwiLGFwcGVhcmFuY2U6ImFwcGVhcmFuY2UiLHN1YnNjcmlwdFNpemluZzoic3Vic2NyaXB0U2l6aW5nIixoaW50TGFiZWw6ImhpbnRMYWJlbCJ9LGV4cG9ydEFzOlsibWF0Rm9ybUZpZWxkIl0sZmVhdHVyZXM6W3ooW3twcm92aWRlOkVvLHVzZUV4aXN0aW5nOml9LHtwcm92aWRlOll1LHVzZUV4aXN0aW5nOml9XSldLG5nQ29udGVudFNlbGVjdG9yczpkZyxkZWNsczoxOCx2YXJzOjIxLGNvbnN0czpbWyJsYWJlbFRlbXBsYXRlIiwiIl0sWyJ0ZXh0RmllbGQiLCIiXSxbImljb25QcmVmaXhDb250YWluZXIiLCIiXSxbInRleHRQcmVmaXhDb250YWluZXIiLCIiXSxbInRleHRTdWZmaXhDb250YWluZXIiLCIiXSxbImljb25TdWZmaXhDb250YWluZXIiLCIiXSxbMSwibWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXIiLCJtZGMtdGV4dC1maWVsZCIsMywiY2xpY2siXSxbMSwibWF0LW1kYy1mb3JtLWZpZWxkLWZvY3VzLW92ZXJsYXkiXSxbMSwibWF0LW1kYy1mb3JtLWZpZWxkLWZsZXgiXSxbIm1hdEZvcm1GaWVsZE5vdGNoZWRPdXRsaW5lIiwiIiwzLCJtYXRGb3JtRmllbGROb3RjaGVkT3V0bGluZU9wZW4iXSxbMSwibWF0LW1kYy1mb3JtLWZpZWxkLWljb24tcHJlZml4Il0sWzEsIm1hdC1tZGMtZm9ybS1maWVsZC10ZXh0LXByZWZpeCJdLFsxLCJtYXQtbWRjLWZvcm0tZmllbGQtaW5maXgiXSxbMywibmdUZW1wbGF0ZU91dGxldCJdLFsxLCJtYXQtbWRjLWZvcm0tZmllbGQtdGV4dC1zdWZmaXgiXSxbMSwibWF0LW1kYy1mb3JtLWZpZWxkLWljb24tc3VmZml4Il0sWyJtYXRGb3JtRmllbGRMaW5lUmlwcGxlIiwiIl0sWyJhcmlhLWF0b21pYyIsInRydWUiLCJhcmlhLWxpdmUiLCJwb2xpdGUiLDEsIm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciIsIm1hdC1tZGMtZm9ybS1maWVsZC1ib3R0b20tYWxpZ24iXSxbMSwibWF0LW1kYy1mb3JtLWZpZWxkLWVycm9yLXdyYXBwZXIiXSxbMSwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlciJdLFsibWF0Rm9ybUZpZWxkRmxvYXRpbmdMYWJlbCIsIiIsMywiZmxvYXRpbmciLCJtb25pdG9yUmVzaXplIiwiaWQiXSxbImFyaWEtaGlkZGVuIiwidHJ1ZSIsMSwibWF0LW1kYy1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciIsIm1kYy1mbG9hdGluZy1sYWJlbC0tcmVxdWlyZWQiXSxbMywiaWQiXSxbMSwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtc3BhY2VyIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGUscil7aWYoZSYxKXtsZXQgbz1LbigpO1R0KGNnKSxlaSgwLG1nLDEsMSwibmctdGVtcGxhdGUiLG51bGwsMCxjbCksY3QoMiwiZGl2Iiw2LDEpLGR0KCJjbGljayIsZnVuY3Rpb24ocyl7cmV0dXJuIFVuKG8pLEhuKHIuX2NvbnRyb2wub25Db250YWluZXJDbGljayhzKSl9KSx2dCg0LGZnLDEsMCwiZGl2Iiw3KSxjdCg1LCJkaXYiLDgpLHZ0KDYsdmcsMiwyLCJkaXYiLDkpLHZ0KDcsX2csMywwLCJkaXYiLDEwKSx2dCg4LGJnLDMsMCwiZGl2IiwxMSksY3QoOSwiZGl2IiwxMiksdnQoMTAsQ2csMSwxLG51bGwsMTMpLFUoMTEpLHJ0KCksdnQoMTIseGcsMywwLCJkaXYiLDE0KSx2dCgxMyx3ZywzLDAsImRpdiIsMTUpLHJ0KCksdnQoMTQsRWcsMSwwLCJkaXYiLDE2KSxydCgpLGN0KDE1LCJkaXYiLDE3KSx2dCgxNixTZywyLDAsImRpdiIsMTgpKDE3LFJnLDUsMSwiZGl2IiwxOSkscnQoKX1pZihlJjIpe2xldCBvO3EoMiksSCgibWRjLXRleHQtZmllbGQtLWZpbGxlZCIsIXIuX2hhc091dGxpbmUoKSkoIm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCIsci5faGFzT3V0bGluZSgpKSgibWRjLXRleHQtZmllbGQtLW5vLWxhYmVsIiwhci5faGFzRmxvYXRpbmdMYWJlbCgpKSgibWRjLXRleHQtZmllbGQtLWRpc2FibGVkIixyLl9jb250cm9sLmRpc2FibGVkKSgibWRjLXRleHQtZmllbGQtLWludmFsaWQiLHIuX2NvbnRyb2wuZXJyb3JTdGF0ZSkscSgyKSxfdCghci5faGFzT3V0bGluZSgpJiYhci5fY29udHJvbC5kaXNhYmxlZD80Oi0xKSxxKDIpLF90KHIuX2hhc091dGxpbmUoKT82Oi0xKSxxKCksX3Qoci5faGFzSWNvblByZWZpeD83Oi0xKSxxKCksX3Qoci5faGFzVGV4dFByZWZpeD84Oi0xKSxxKDIpLF90KCFyLl9oYXNPdXRsaW5lKCl8fHIuX2ZvcmNlRGlzcGxheUluZml4TGFiZWwoKT8xMDotMSkscSgyKSxfdChyLl9oYXNUZXh0U3VmZml4PzEyOi0xKSxxKCksX3Qoci5faGFzSWNvblN1ZmZpeD8xMzotMSkscSgpLF90KHIuX2hhc091dGxpbmUoKT8tMToxNCkscSgpLEgoIm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtZHluYW1pYy1zaXplIixyLnN1YnNjcmlwdFNpemluZz09PSJkeW5hbWljIik7bGV0IGE9ci5fZ2V0U3Vic2NyaXB0TWVzc2FnZVR5cGUoKTtxKCksX3QoKG89YSk9PT0iZXJyb3IiPzE2Om89PT0iaGludCI/MTc6LTEpfX0sZGVwZW5kZW5jaWVzOltVdSxXdSxibCwkdSxUc10sc3R5bGVzOltgLm1kYy10ZXh0LWZpZWxke2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6YmFzZWxpbmU7cGFkZGluZzowIDE2cHg7cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OmhpZGRlbjt3aWxsLWNoYW5nZTpvcGFjaXR5LHRyYW5zZm9ybSxjb2xvcjtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9Lm1kYy10ZXh0LWZpZWxkX19pbnB1dHt3aWR0aDoxMDAlO21pbi13aWR0aDowO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MDtiYWNrZ3JvdW5kOm5vbmU7cGFkZGluZzowOy1tb3otYXBwZWFyYW5jZTpub25lOy13ZWJraXQtYXBwZWFyYW5jZTpub25lO2hlaWdodDoyOHB4fS5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvciwubWRjLXRleHQtZmllbGRfX2lucHV0Ojotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9ue2Rpc3BsYXk6bm9uZX0ubWRjLXRleHQtZmllbGRfX2lucHV0OjotbXMtY2xlYXJ7ZGlzcGxheTpub25lfS5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Zm9jdXN7b3V0bGluZTpub25lfS5tZGMtdGV4dC1maWVsZF9faW5wdXQ6aW52YWxpZHtib3gtc2hhZG93Om5vbmV9Lm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6cGxhY2Vob2xkZXJ7b3BhY2l0eTowfS5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXJ7b3BhY2l0eTowfS5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7b3BhY2l0eTowfS5tZGMtdGV4dC1maWVsZF9faW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye29wYWNpdHk6MH0ubWRjLXRleHQtZmllbGQtLW5vLWxhYmVsIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6OnBsYWNlaG9sZGVyLC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLXRleHQtZmllbGRfX2lucHV0OjpwbGFjZWhvbGRlcntvcGFjaXR5OjF9Lm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbCAubWRjLXRleHQtZmllbGRfX2lucHV0OjotbW96LXBsYWNlaG9sZGVyLC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLXRleHQtZmllbGRfX2lucHV0OjotbW96LXBsYWNlaG9sZGVye29wYWNpdHk6MX0ubWRjLXRleHQtZmllbGQtLW5vLWxhYmVsIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIsLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7b3BhY2l0eToxfS5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWwgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIsLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye29wYWNpdHk6MX0ubWRjLXRleHQtZmllbGQtLWRpc2FibGVkOm5vdCgubWRjLXRleHQtZmllbGQtLW5vLWxhYmVsKSAubWRjLXRleHQtZmllbGRfX2lucHV0Lm1hdC1tZGMtaW5wdXQtZGlzYWJsZWQtaW50ZXJhY3RpdmU6OnBsYWNlaG9sZGVye29wYWNpdHk6MH0ubWRjLXRleHQtZmllbGQtLWRpc2FibGVkOm5vdCgubWRjLXRleHQtZmllbGQtLW5vLWxhYmVsKSAubWRjLXRleHQtZmllbGRfX2lucHV0Lm1hdC1tZGMtaW5wdXQtZGlzYWJsZWQtaW50ZXJhY3RpdmU6Oi1tb3otcGxhY2Vob2xkZXJ7b3BhY2l0eTowfS5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWwpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQubWF0LW1kYy1pbnB1dC1kaXNhYmxlZC1pbnRlcmFjdGl2ZTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntvcGFjaXR5OjB9Lm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dC5tYXQtbWRjLWlucHV0LWRpc2FibGVkLWludGVyYWN0aXZlOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntvcGFjaXR5OjB9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLXRleHQtZmllbGRfX2lucHV0LC5tZGMtdGV4dC1maWVsZC0tZmlsbGVkLm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbCAubWRjLXRleHQtZmllbGRfX2lucHV0e2hlaWdodDoxMDAlfS5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dHtkaXNwbGF5OmZsZXg7Ym9yZGVyOm5vbmUgIWltcG9ydGFudDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMCl9Lm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLXRleHQtZmllbGRfX2lucHV0e3BvaW50ZXItZXZlbnRzOmF1dG99Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtdGV4dC1maWVsZF9faW5wdXR7Y29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtZmlsbGVkLWlucHV0LXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO2NhcmV0LWNvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1jYXJldC1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6OnBsYWNlaG9sZGVye2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1pbnB1dC10ZXh0LXBsYWNlaG9sZGVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tZGMtdGV4dC1maWVsZC0tZmlsbGVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1pbnB1dC10ZXh0LXBsYWNlaG9sZGVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tZGMtdGV4dC1maWVsZC0tZmlsbGVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLXRleHQtZmllbGRfX2lucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1pbnB1dC10ZXh0LXBsYWNlaG9sZGVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tZGMtdGV4dC1maWVsZC0tZmlsbGVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLXRleHQtZmllbGRfX2lucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtaW5wdXQtdGV4dC1wbGFjZWhvbGRlci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLXRleHQtZmllbGRfX2lucHV0e2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWlucHV0LXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO2NhcmV0LWNvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWNhcmV0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLXRleHQtZmllbGRfX2lucHV0OjpwbGFjZWhvbGRlcntjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1pbnB1dC10ZXh0LXBsYWNlaG9sZGVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtb3V0bGluZWQtaW5wdXQtdGV4dC1wbGFjZWhvbGRlci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLXRleHQtZmllbGRfX2lucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWlucHV0LXRleHQtcGxhY2Vob2xkZXItY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtb3V0bGluZWQtaW5wdXQtdGV4dC1wbGFjZWhvbGRlci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKX0ubWRjLXRleHQtZmllbGQtLWZpbGxlZC5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy10ZXh0LWZpZWxkX19pbnB1dHtjYXJldC1jb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtZXJyb3ItY2FyZXQtY29sb3IsIHZhcigtLW1hdC1zeXMtZXJyb3IpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKSAubWRjLXRleHQtZmllbGRfX2lucHV0e2NhcmV0LWNvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWVycm9yLWNhcmV0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLWVycm9yKSl9Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtdGV4dC1maWVsZF9faW5wdXR7Y29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtZmlsbGVkLWRpc2FibGVkLWlucHV0LXRleHQtY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLXRleHQtZmllbGRfX2lucHV0e2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWRpc2FibGVkLWlucHV0LXRleHQtY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtdGV4dC1maWVsZF9faW5wdXR7YmFja2dyb3VuZC1jb2xvcjpXaW5kb3d9fS5tZGMtdGV4dC1maWVsZC0tZmlsbGVke2hlaWdodDo1NnB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6dmFyKC0tbWF0LWZvcm0tZmllbGQtZmlsbGVkLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtc21hbGwpKTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1leHRyYS1zbWFsbCkpfS5tZGMtdGV4dC1maWVsZC0tZmlsbGVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1jb250YWluZXItY29sb3IsIHZhcigtLW1hdC1zeXMtc3VyZmFjZS12YXJpYW50KSl9Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQubWRjLXRleHQtZmllbGQtLWRpc2FibGVke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtZmlsbGVkLWRpc2FibGVkLWNvbnRhaW5lci1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgNCUsIHRyYW5zcGFyZW50KSl9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZHtoZWlnaHQ6NTZweDtvdmVyZmxvdzp2aXNpYmxlO3BhZGRpbmctcmlnaHQ6bWF4KDE2cHgsdmFyKC0tbWF0LWZvcm0tZmllbGQtb3V0bGluZWQtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1leHRyYS1zbWFsbCkpKTtwYWRkaW5nLWxlZnQ6bWF4KDE2cHgsdmFyKC0tbWF0LWZvcm0tZmllbGQtb3V0bGluZWQtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1leHRyYS1zbWFsbCkpICsgNHB4KX1bZGlyPXJ0bF0gLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZHtwYWRkaW5nLXJpZ2h0Om1heCgxNnB4LHZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtc21hbGwpKSArIDRweCk7cGFkZGluZy1sZWZ0Om1heCgxNnB4LHZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtc21hbGwpKSl9Lm1kYy1mbG9hdGluZy1sYWJlbHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IHRvcDtsaW5lLWhlaWdodDoxLjE1cmVtO3RleHQtYWxpZ246bGVmdDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtjdXJzb3I6dGV4dDtvdmVyZmxvdzpoaWRkZW47d2lsbC1jaGFuZ2U6dHJhbnNmb3JtfVtkaXI9cnRsXSAubWRjLWZsb2F0aW5nLWxhYmVse3JpZ2h0OjA7bGVmdDphdXRvO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgdG9wO3RleHQtYWxpZ246cmlnaHR9Lm1kYy10ZXh0LWZpZWxkIC5tZGMtZmxvYXRpbmctbGFiZWx7dG9wOjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTtwb2ludGVyLWV2ZW50czpub25lfS5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtZmxvYXRpbmctbGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7bWF4LXdpZHRoOjEwMCV9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVse2xlZnQ6NHB4O3JpZ2h0OmF1dG99W2Rpcj1ydGxdIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbHtsZWZ0OmF1dG87cmlnaHQ6NHB4fS5tZGMtdGV4dC1maWVsZC0tZmlsbGVkIC5tZGMtZmxvYXRpbmctbGFiZWx7bGVmdDoxNnB4O3JpZ2h0OmF1dG99W2Rpcj1ydGxdIC5tZGMtdGV4dC1maWVsZC0tZmlsbGVkIC5tZGMtZmxvYXRpbmctbGFiZWx7bGVmdDphdXRvO3JpZ2h0OjE2cHh9Lm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLWZsb2F0aW5nLWxhYmVse2N1cnNvcjpkZWZhdWx0fUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1kYy1mbG9hdGluZy1sYWJlbHt6LWluZGV4OjF9fS5tZGMtdGV4dC1maWVsZC0tZmlsbGVkLm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbCAubWRjLWZsb2F0aW5nLWxhYmVse2Rpc3BsYXk6bm9uZX0ubWRjLXRleHQtZmllbGQtLWZpbGxlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1mbG9hdGluZy1sYWJlbHtjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKX0ubWRjLXRleHQtZmllbGQtLWZpbGxlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1mbG9hdGluZy1sYWJlbHtjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtZm9jdXMtbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpOmhvdmVyIC5tZGMtZmxvYXRpbmctbGFiZWx7Y29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtZmlsbGVkLWhvdmVyLWxhYmVsLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtZmxvYXRpbmctbGFiZWx7Y29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtZmlsbGVkLWRpc2FibGVkLWxhYmVsLXRleHQtY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKX0ubWRjLXRleHQtZmllbGQtLWZpbGxlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWludmFsaWQgLm1kYy1mbG9hdGluZy1sYWJlbHtjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtZXJyb3ItbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1lcnJvcikpfS5tZGMtdGV4dC1maWVsZC0tZmlsbGVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0taW52YWxpZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLWZsb2F0aW5nLWxhYmVse2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1lcnJvci1mb2N1cy1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLWVycm9yKSl9Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpob3ZlciAubWRjLWZsb2F0aW5nLWxhYmVse2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1lcnJvci1ob3Zlci1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLWVycm9yLWNvbnRhaW5lcikpfS5tZGMtdGV4dC1maWVsZC0tZmlsbGVkIC5tZGMtZmxvYXRpbmctbGFiZWx7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LWZvcm0tZmllbGQtZmlsbGVkLWxhYmVsLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLWZvbnQpKTtmb250LXNpemU6dmFyKC0tbWF0LWZvcm0tZmllbGQtZmlsbGVkLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXNpemUpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtbGFiZWwtdGV4dC13ZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZS13ZWlnaHQpKTtsZXR0ZXItc3BhY2luZzp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtbGFiZWwtdGV4dC10cmFja2luZywgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXRyYWNraW5nKSl9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1mbG9hdGluZy1sYWJlbHtjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tZGMtZmxvYXRpbmctbGFiZWx7Y29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtb3V0bGluZWQtZm9jdXMtbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCk6aG92ZXIgLm1kYy1mbG9hdGluZy1sYWJlbHtjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1ob3Zlci1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCAubWRjLWZsb2F0aW5nLWxhYmVse2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWRpc2FibGVkLWxhYmVsLXRleHQtY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0taW52YWxpZCAubWRjLWZsb2F0aW5nLWxhYmVse2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWVycm9yLWxhYmVsLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtZXJyb3IpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0taW52YWxpZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLWZsb2F0aW5nLWxhYmVse2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWVycm9yLWZvY3VzLWxhYmVsLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtZXJyb3IpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0taW52YWxpZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCk6aG92ZXIgLm1kYy1mbG9hdGluZy1sYWJlbHtjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1lcnJvci1ob3Zlci1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLWVycm9yLWNvbnRhaW5lcikpfS5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1mbG9hdGluZy1sYWJlbHtmb250LWZhbWlseTp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1sYWJlbC10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZS1mb250KSk7Zm9udC1zaXplOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXNpemUpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1sYWJlbC10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXdlaWdodCkpO2xldHRlci1zcGFjaW5nOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWxhYmVsLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZS10cmFja2luZykpfS5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3Zle2N1cnNvcjphdXRvO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDYlKSBzY2FsZSgwLjc1KX0ubWRjLXRleHQtZmllbGQtLWZpbGxlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTA2JSkgc2NhbGUoMC43NSl9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMzcuMjVweCkgc2NhbGUoMSk7Zm9udC1zaXplOi43NXJlbX0ubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZXt0ZXh0LW92ZXJmbG93OmNsaXB9Lm1kYy1ub3RjaGVkLW91dGxpbmUtLXVwZ3JhZGVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3Zle21heC13aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSwubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMzQuNzVweCkgc2NhbGUoMC43NSl9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZSwubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS11cGdyYWRlZCAubWRjLWZsb2F0aW5nLWxhYmVsLS1mbG9hdC1hYm92ZXtmb250LXNpemU6MXJlbX0ubWRjLWZsb2F0aW5nLWxhYmVsLS1yZXF1aXJlZDpub3QoLm1kYy1mbG9hdGluZy1sYWJlbC0taGlkZS1yZXF1aXJlZC1tYXJrZXIpOjphZnRlcnttYXJnaW4tbGVmdDoxcHg7bWFyZ2luLXJpZ2h0OjA7Y29udGVudDoiKiJ9W2Rpcj1ydGxdIC5tZGMtZmxvYXRpbmctbGFiZWwtLXJlcXVpcmVkOm5vdCgubWRjLWZsb2F0aW5nLWxhYmVsLS1oaWRlLXJlcXVpcmVkLW1hcmtlcik6OmFmdGVye21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjFweH0ubWRjLW5vdGNoZWQtb3V0bGluZXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtsZWZ0OjA7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dGV4dC1hbGlnbjpsZWZ0O3BvaW50ZXItZXZlbnRzOm5vbmV9W2Rpcj1ydGxdIC5tZGMtbm90Y2hlZC1vdXRsaW5le3RleHQtYWxpZ246cmlnaHR9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZXt6LWluZGV4OjF9Lm1hdC1tZGMtbm90Y2gtcGllY2V7Ym94LXNpemluZzpib3JkZXItYm94O2hlaWdodDoxMDAlO3BvaW50ZXItZXZlbnRzOm5vbmU7Ym9yZGVyLXRvcDoxcHggc29saWQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWR9Lm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tYXQtbWRjLW5vdGNoLXBpZWNle2JvcmRlci13aWR0aDoycHh9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1hdC1tZGMtbm90Y2gtcGllY2V7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLW91dGxpbmUtY29sb3IsIHZhcigtLW1hdC1zeXMtb3V0bGluZSkpO2JvcmRlci13aWR0aDp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1vdXRsaW5lLXdpZHRoLCAxcHgpfS5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpOmhvdmVyIC5tYXQtbWRjLW5vdGNoLXBpZWNle2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1ob3Zlci1vdXRsaW5lLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWF0LW1kYy1ub3RjaC1waWVjZXtib3JkZXItY29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtb3V0bGluZWQtZm9jdXMtb3V0bGluZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQgLm1hdC1tZGMtbm90Y2gtcGllY2V7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWRpc2FibGVkLW91dGxpbmUtY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDEyJSwgdHJhbnNwYXJlbnQpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKS5tZGMtdGV4dC1maWVsZC0taW52YWxpZCAubWF0LW1kYy1ub3RjaC1waWVjZXtib3JkZXItY29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtb3V0bGluZWQtZXJyb3Itb3V0bGluZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1lcnJvcikpfS5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpOmhvdmVyIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tYXQtbWRjLW5vdGNoLXBpZWNle2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1lcnJvci1ob3Zlci1vdXRsaW5lLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLWVycm9yLWNvbnRhaW5lcikpfS5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkIC5tYXQtbWRjLW5vdGNoLXBpZWNle2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1lcnJvci1mb2N1cy1vdXRsaW5lLWNvbG9yLCB2YXIoLS1tYXQtc3lzLWVycm9yKSl9Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUgLm1hdC1tZGMtbm90Y2gtcGllY2V7Ym9yZGVyLXdpZHRoOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWZvY3VzLW91dGxpbmUtd2lkdGgsIDJweCl9Lm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmd7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtc21hbGwpKTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtc21hbGwpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5ne3dpZHRoOm1heCgxMnB4LHZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtc21hbGwpKSl9W2Rpcj1ydGxdIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19sZWFkaW5ne2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtc21hbGwpKTtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWV4dHJhLXNtYWxsKSl9Lm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5ne2ZsZXgtZ3JvdzoxO2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtc21hbGwpKTtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czp2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWV4dHJhLXNtYWxsKSl9W2Rpcj1ydGxdIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZ3tib3JkZXItbGVmdDoxcHggc29saWQ7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6dmFyKC0tbWF0LWZvcm0tZmllbGQtb3V0bGluZWQtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1leHRyYS1zbWFsbCkpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tbWF0LWZvcm0tZmllbGQtb3V0bGluZWQtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1leHRyYS1zbWFsbCkpfS5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaHtmbGV4OjAgMCBhdXRvO3dpZHRoOmF1dG99Lm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2h7bWF4LXdpZHRoOm1pbih2YXIoLS1tYXQtZm9ybS1maWVsZC1ub3RjaC1tYXgtd2lkdGgsIDEwMCUpLGNhbGMoMTAwJSAtIG1heCgxMnB4LCB2YXIoLS1tYXQtZm9ybS1maWVsZC1vdXRsaW5lZC1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWV4dHJhLXNtYWxsKSkpICogMikpfS5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmUtLW5vdGNoZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoe21heC13aWR0aDptaW4oMTAwJSxjYWxjKDEwMCUgLSBtYXgoMTJweCwgdmFyKC0tbWF0LWZvcm0tZmllbGQtb3V0bGluZWQtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1leHRyYS1zbWFsbCkpKSAqIDIpKX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS1ub3RjaGVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaHtwYWRkaW5nLXRvcDoxcHh9Lm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tbm90Y2hlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2h7cGFkZGluZy10b3A6MnB4fS5tZGMtbm90Y2hlZC1vdXRsaW5lLS1ub3RjaGVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaHtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjhweDtib3JkZXItdG9wOm5vbmV9W2Rpcj1ydGxdIC5tZGMtbm90Y2hlZC1vdXRsaW5lLS1ub3RjaGVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaHtwYWRkaW5nLWxlZnQ6OHB4O3BhZGRpbmctcmlnaHQ6MH0ubWRjLW5vdGNoZWQtb3V0bGluZS0tbm8tbGFiZWwgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoe2Rpc3BsYXk6bm9uZX0ubWRjLWxpbmUtcmlwcGxlOjpiZWZvcmUsLm1kYy1saW5lLXJpcHBsZTo6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjA7bGVmdDowO3dpZHRoOjEwMCU7Ym9yZGVyLWJvdHRvbS1zdHlsZTpzb2xpZDtjb250ZW50OiIifS5tZGMtbGluZS1yaXBwbGU6OmJlZm9yZXt6LWluZGV4OjE7Ym9yZGVyLWJvdHRvbS13aWR0aDp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtYWN0aXZlLWluZGljYXRvci1oZWlnaHQsIDFweCl9Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbGluZS1yaXBwbGU6OmJlZm9yZXtib3JkZXItYm90dG9tLWNvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1hY3RpdmUtaW5kaWNhdG9yLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tZGMtdGV4dC1maWVsZC0tZmlsbGVkOm5vdCgubWRjLXRleHQtZmllbGQtLWRpc2FibGVkKTpub3QoLm1kYy10ZXh0LWZpZWxkLS1mb2N1c2VkKTpob3ZlciAubWRjLWxpbmUtcmlwcGxlOjpiZWZvcmV7Ym9yZGVyLWJvdHRvbS1jb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtaG92ZXItYWN0aXZlLWluZGljYXRvci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQubWRjLXRleHQtZmllbGQtLWRpc2FibGVkIC5tZGMtbGluZS1yaXBwbGU6OmJlZm9yZXtib3JkZXItYm90dG9tLWNvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1kaXNhYmxlZC1hY3RpdmUtaW5kaWNhdG9yLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSl9Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkIC5tZGMtbGluZS1yaXBwbGU6OmJlZm9yZXtib3JkZXItYm90dG9tLWNvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1lcnJvci1hY3RpdmUtaW5kaWNhdG9yLWNvbG9yLCB2YXIoLS1tYXQtc3lzLWVycm9yKSl9Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkOm5vdCgubWRjLXRleHQtZmllbGQtLWZvY3VzZWQpOmhvdmVyIC5tZGMtbGluZS1yaXBwbGU6OmJlZm9yZXtib3JkZXItYm90dG9tLWNvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1lcnJvci1ob3Zlci1hY3RpdmUtaW5kaWNhdG9yLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLWVycm9yLWNvbnRhaW5lcikpfS5tZGMtbGluZS1yaXBwbGU6OmFmdGVye3RyYW5zZm9ybTpzY2FsZVgoMCk7b3BhY2l0eTowO3otaW5kZXg6Mn0ubWRjLXRleHQtZmllbGQtLWZpbGxlZCAubWRjLWxpbmUtcmlwcGxlOjphZnRlcntib3JkZXItYm90dG9tLXdpZHRoOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1mb2N1cy1hY3RpdmUtaW5kaWNhdG9yLWhlaWdodCwgMnB4KX0ubWRjLXRleHQtZmllbGQtLWZpbGxlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1saW5lLXJpcHBsZTo6YWZ0ZXJ7Ym9yZGVyLWJvdHRvbS1jb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtZm9jdXMtYWN0aXZlLWluZGljYXRvci1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1kYy10ZXh0LWZpZWxkLS1maWxsZWQubWRjLXRleHQtZmllbGQtLWludmFsaWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbGluZS1yaXBwbGU6OmFmdGVye2JvcmRlci1ib3R0b20tY29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtZmlsbGVkLWVycm9yLWZvY3VzLWFjdGl2ZS1pbmRpY2F0b3ItY29sb3IsIHZhcigtLW1hdC1zeXMtZXJyb3IpKX0ubWRjLWxpbmUtcmlwcGxlLS1hY3RpdmU6OmFmdGVye3RyYW5zZm9ybTpzY2FsZVgoMSk7b3BhY2l0eToxfS5tZGMtbGluZS1yaXBwbGUtLWRlYWN0aXZhdGluZzo6YWZ0ZXJ7b3BhY2l0eTowfS5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWR7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LW1kYy1mb3JtLWZpZWxkLXRleHRhcmVhLWNvbnRyb2x7dmVydGljYWwtYWxpZ246bWlkZGxlO3Jlc2l6ZTp2ZXJ0aWNhbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7aGVpZ2h0OmF1dG87bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjpub25lO292ZXJmbG93OmF1dG99Lm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sLm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sey1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkO2ZvbnQ6aW5oZXJpdDtsZXR0ZXItc3BhY2luZzppbmhlcml0O3RleHQtZGVjb3JhdGlvbjppbmhlcml0O3RleHQtdHJhbnNmb3JtOmluaGVyaXQ7Ym9yZGVyOm5vbmV9Lm1hdC1tZGMtZm9ybS1maWVsZCAubWF0LW1kYy1mbG9hdGluZy1sYWJlbC5tZGMtZmxvYXRpbmctbGFiZWx7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7bGluZS1oZWlnaHQ6bm9ybWFsO3BvaW50ZXItZXZlbnRzOmFsbDt3aWxsLWNoYW5nZTphdXRvfS5tYXQtbWRjLWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1tZGMtZmxvYXRpbmctbGFiZWwubWRjLWZsb2F0aW5nLWxhYmVse2N1cnNvcjppbmhlcml0fS5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWw6bm90KC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEpIC5tYXQtbWRjLWZvcm0tZmllbGQtaW5wdXQtY29udHJvbC5tZGMtdGV4dC1maWVsZF9faW5wdXQsLm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyIC5tYXQtbWRjLWZvcm0tZmllbGQtaW5wdXQtY29udHJvbHtoZWlnaHQ6YXV0b30ubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXIgLm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sLm1kYy10ZXh0LWZpZWxkX19pbnB1dFt0eXBlPWNvbG9yXXtoZWlnaHQ6MjNweH0ubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXJ7aGVpZ2h0OmF1dG87ZmxleDphdXRvO3dpbGwtY2hhbmdlOmF1dG99Lm1hdC1tZGMtZm9ybS1maWVsZC1oYXMtaWNvbi1wcmVmaXggLm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVye3BhZGRpbmctbGVmdDowOy0tbWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsLW9mZnNldC14OiAtMTZweH0ubWF0LW1kYy1mb3JtLWZpZWxkLWhhcy1pY29uLXN1ZmZpeCAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXJ7cGFkZGluZy1yaWdodDowfVtkaXI9cnRsXSAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXJ7cGFkZGluZy1sZWZ0OjE2cHg7cGFkZGluZy1yaWdodDoxNnB4fVtkaXI9cnRsXSAubWF0LW1kYy1mb3JtLWZpZWxkLWhhcy1pY29uLXN1ZmZpeCAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXJ7cGFkZGluZy1sZWZ0OjB9W2Rpcj1ydGxdIC5tYXQtbWRjLWZvcm0tZmllbGQtaGFzLWljb24tcHJlZml4IC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlcntwYWRkaW5nLXJpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6OnBsYWNlaG9sZGVye2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWRpc2FibGVkLWlucHV0LXRleHQtcGxhY2Vob2xkZXItY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKX0ubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1kaXNhYmxlZC1pbnB1dC10ZXh0LXBsYWNlaG9sZGVyLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSl9Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtZGlzYWJsZWQtaW5wdXQtdGV4dC1wbGFjZWhvbGRlci1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpfS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWRjLXRleHQtZmllbGRfX2lucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1kaXNhYmxlZC1pbnB1dC10ZXh0LXBsYWNlaG9sZGVyLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSl9Lm1hdC1tZGMtZm9ybS1maWVsZC1sYWJlbC1hbHdheXMtZmxvYXQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6cGxhY2Vob2xkZXJ7dHJhbnNpdGlvbi1kZWxheTo0MG1zO3RyYW5zaXRpb24tZHVyYXRpb246MTEwbXM7b3BhY2l0eToxfS5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlciAubWF0LW1kYy1mb3JtLWZpZWxkLWluZml4IC5tYXQtbWRjLWZsb2F0aW5nLWxhYmVse2xlZnQ6YXV0bztyaWdodDphdXRvfS5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlci5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dHtkaXNwbGF5OmlubGluZS1ibG9ja30ubWF0LW1kYy1mb3JtLWZpZWxkIC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlci5tZGMtdGV4dC1maWVsZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2h7cGFkZGluZy10b3A6MH0ubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtbWRjLWZvcm0tZmllbGQubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtbWRjLWZvcm0tZmllbGQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoe2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDAsMCwwLDApfVtkaXI9cnRsXSAubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtbWRjLWZvcm0tZmllbGQubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtbWRjLWZvcm0tZmllbGQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoe2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCByZ2JhKDAsMCwwLDApfS5tYXQtbWRjLWZvcm0tZmllbGQtaW5maXh7bWluLWhlaWdodDp2YXIoLS1tYXQtZm9ybS1maWVsZC1jb250YWluZXItaGVpZ2h0LCA1NnB4KTtwYWRkaW5nLXRvcDp2YXIoLS1tYXQtZm9ybS1maWVsZC1maWxsZWQtd2l0aC1sYWJlbC1jb250YWluZXItcGFkZGluZy10b3AsIDI0cHgpO3BhZGRpbmctYm90dG9tOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC13aXRoLWxhYmVsLWNvbnRhaW5lci1wYWRkaW5nLWJvdHRvbSwgOHB4KX0ubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tYXQtbWRjLWZvcm0tZmllbGQtaW5maXgsLm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbCAubWF0LW1kYy1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmctdG9wOnZhcigtLW1hdC1mb3JtLWZpZWxkLWNvbnRhaW5lci12ZXJ0aWNhbC1wYWRkaW5nLCAxNnB4KTtwYWRkaW5nLWJvdHRvbTp2YXIoLS1tYXQtZm9ybS1maWVsZC1jb250YWluZXItdmVydGljYWwtcGFkZGluZywgMTZweCl9Lm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyIC5tYXQtbWRjLWZvcm0tZmllbGQtZmxleCAubWF0LW1kYy1mbG9hdGluZy1sYWJlbHt0b3A6Y2FsYyh2YXIoLS1tYXQtZm9ybS1maWVsZC1jb250YWluZXItaGVpZ2h0LCA1NnB4KS8yKX0ubWRjLXRleHQtZmllbGQtLWZpbGxlZCAubWF0LW1kYy1mbG9hdGluZy1sYWJlbHtkaXNwbGF5OnZhcigtLW1hdC1mb3JtLWZpZWxkLWZpbGxlZC1sYWJlbC1kaXNwbGF5LCBibG9jayl9Lm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVyLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmV7LS1tYXQtbWRjLWZvcm0tZmllbGQtbGFiZWwtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKGNhbGMoY2FsYyg2Ljc1cHggKyB2YXIoLS1tYXQtZm9ybS1maWVsZC1jb250YWluZXItaGVpZ2h0LCA1NnB4KSAvIDIpICogLTEpKSBzY2FsZSh2YXIoLS1tYXQtbWRjLWZvcm0tZmllbGQtZmxvYXRpbmctbGFiZWwtc2NhbGUsIDAuNzUpKTt0cmFuc2Zvcm06dmFyKC0tbWF0LW1kYy1mb3JtLWZpZWxkLWxhYmVsLXRyYW5zZm9ybSl9QGtleWZyYW1lcyBfbWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LWFuaW1hdGlvbntmcm9te29wYWNpdHk6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNXB4KX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9fS5tYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXdyYXBwZXIsLm1hdC1tZGMtZm9ybS1maWVsZC1lcnJvci13cmFwcGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtyaWdodDowO3BhZGRpbmc6MCAxNnB4O29wYWNpdHk6MTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTthbmltYXRpb246X21hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC1hbmltYXRpb24gMG1zIGN1YmljLWJlemllcigwLjU1LCAwLCAwLjU1LCAwLjIpfS5tYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LWR5bmFtaWMtc2l6ZSAubWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlciwubWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC1keW5hbWljLXNpemUgLm1hdC1tZGMtZm9ybS1maWVsZC1lcnJvci13cmFwcGVye3Bvc2l0aW9uOnN0YXRpY30ubWF0LW1kYy1mb3JtLWZpZWxkLWJvdHRvbS1hbGlnbjo6YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjE2cHh9Lm1hdC1tZGMtZm9ybS1maWVsZC1ib3R0b20tYWxpZ24ubWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC1keW5hbWljLXNpemU6OmJlZm9yZXtjb250ZW50OnVuc2V0fS5tYXQtbWRjLWZvcm0tZmllbGQtaGludC1lbmR7b3JkZXI6MX0ubWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlcntkaXNwbGF5OmZsZXh9Lm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXNwYWNlcntmbGV4OjEgMCAxZW19Lm1hdC1tZGMtZm9ybS1maWVsZC1lcnJvcntkaXNwbGF5OmJsb2NrO2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWVycm9yLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtZXJyb3IpKX0ubWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyLC5tYXQtbWRjLWZvcm0tZmllbGQtYm90dG9tLWFsaWduOjpiZWZvcmV7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1ib2R5LXNtYWxsLWZvbnQpKTtsaW5lLWhlaWdodDp2YXIoLS1tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtdGV4dC1saW5lLWhlaWdodCwgdmFyKC0tbWF0LXN5cy1ib2R5LXNtYWxsLWxpbmUtaGVpZ2h0KSk7Zm9udC1zaXplOnZhcigtLW1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC10ZXh0LXNpemUsIHZhcigtLW1hdC1zeXMtYm9keS1zbWFsbC1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtYm9keS1zbWFsbC10cmFja2luZykpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1ib2R5LXNtYWxsLXdlaWdodCkpfS5tYXQtbWRjLWZvcm0tZmllbGQtZm9jdXMtb3ZlcmxheXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXI6aG92ZXIgLm1hdC1tZGMtZm9ybS1maWVsZC1mb2N1cy1vdmVybGF5e29wYWNpdHk6dmFyKC0tbWF0LWZvcm0tZmllbGQtaG92ZXItc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5KSl9Lm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LW1kYy1mb3JtLWZpZWxkLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTp2YXIoLS1tYXQtZm9ybS1maWVsZC1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5LCAwKX1zZWxlY3QubWF0LW1kYy1mb3JtLWZpZWxkLWlucHV0LWNvbnRyb2x7LW1vei1hcHBlYXJhbmNlOm5vbmU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApO2Rpc3BsYXk6aW5saW5lLWZsZXg7Ym94LXNpemluZzpib3JkZXItYm94fXNlbGVjdC5tYXQtbWRjLWZvcm0tZmllbGQtaW5wdXQtY29udHJvbDpub3QoOmRpc2FibGVkKXtjdXJzb3I6cG9pbnRlcn1zZWxlY3QubWF0LW1kYy1mb3JtLWZpZWxkLWlucHV0LWNvbnRyb2w6bm90KC5tYXQtbWRjLW5hdGl2ZS1zZWxlY3QtaW5saW5lKSBvcHRpb257Y29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtc2VsZWN0LW9wdGlvbi10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW5ldXRyYWwxMCkpfXNlbGVjdC5tYXQtbWRjLWZvcm0tZmllbGQtaW5wdXQtY29udHJvbDpub3QoLm1hdC1tZGMtbmF0aXZlLXNlbGVjdC1pbmxpbmUpIG9wdGlvbjpkaXNhYmxlZHtjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1zZWxlY3QtZGlzYWJsZWQtb3B0aW9uLXRleHQtY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW5ldXRyYWwxMCkgMzglLCB0cmFuc3BhcmVudCkpfS5tYXQtbWRjLWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LW1kYy1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb250ZW50OiIiO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkIHJnYmEoMCwwLDAsMCk7Ym9yZGVyLXJpZ2h0OjVweCBzb2xpZCByZ2JhKDAsMCwwLDApO2JvcmRlci10b3A6NXB4IHNvbGlkO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjUwJTttYXJnaW4tdG9wOi0yLjVweDtwb2ludGVyLWV2ZW50czpub25lO2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWVuYWJsZWQtc2VsZWN0LWFycm93LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfVtkaXI9cnRsXSAubWF0LW1kYy1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1tZGMtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7cmlnaHQ6YXV0bztsZWZ0OjB9Lm1hdC1tZGMtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkIC5tYXQtbWRjLWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWZvY3VzLXNlbGVjdC1hcnJvdy1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1hdC1tZGMtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtbWRjLWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWRpc2FibGVkLXNlbGVjdC1hcnJvdy1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpfS5tYXQtbWRjLWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LW1kYy1mb3JtLWZpZWxkLWlucHV0LWNvbnRyb2x7cGFkZGluZy1yaWdodDoxNXB4fVtkaXI9cnRsXSAubWF0LW1kYy1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9se3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MTVweH1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlcntvdXRsaW5lOnNvbGlkIDFweH19QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXJ7b3V0bGluZS1jb2xvcjpHcmF5VGV4dH19QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9jdXNlZCAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXJ7b3V0bGluZTpkYXNoZWQgM3B4fX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tZGMtbm90Y2hlZC1vdXRsaW5le2JvcmRlcjpkYXNoZWQgM3B4fX0ubWF0LW1kYy1mb3JtLWZpZWxkLWlucHV0LWNvbnRyb2xbdHlwZT1kYXRlXSwubWF0LW1kYy1mb3JtLWZpZWxkLWlucHV0LWNvbnRyb2xbdHlwZT1kYXRldGltZV0sLm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sW3R5cGU9ZGF0ZXRpbWUtbG9jYWxdLC5tYXQtbWRjLWZvcm0tZmllbGQtaW5wdXQtY29udHJvbFt0eXBlPW1vbnRoXSwubWF0LW1kYy1mb3JtLWZpZWxkLWlucHV0LWNvbnRyb2xbdHlwZT13ZWVrXSwubWF0LW1kYy1mb3JtLWZpZWxkLWlucHV0LWNvbnRyb2xbdHlwZT10aW1lXXtsaW5lLWhlaWdodDoxfS5tYXQtbWRjLWZvcm0tZmllbGQtaW5wdXQtY29udHJvbDo6LXdlYmtpdC1kYXRldGltZS1lZGl0e2xpbmUtaGVpZ2h0OjE7cGFkZGluZzowO21hcmdpbi1ib3R0b206LTJweH0ubWF0LW1kYy1mb3JtLWZpZWxkey0tbWF0LW1kYy1mb3JtLWZpZWxkLWZsb2F0aW5nLWxhYmVsLXNjYWxlOiAwLjc1O2Rpc3BsYXk6aW5saW5lLWZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDowO3RleHQtYWxpZ246bGVmdDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGU7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDtmb250LWZhbWlseTp2YXIoLS1tYXQtZm9ybS1maWVsZC1jb250YWluZXItdGV4dC1mb250LCB2YXIoLS1tYXQtc3lzLWJvZHktbGFyZ2UtZm9udCkpO2xpbmUtaGVpZ2h0OnZhcigtLW1hdC1mb3JtLWZpZWxkLWNvbnRhaW5lci10ZXh0LWxpbmUtaGVpZ2h0LCB2YXIoLS1tYXQtc3lzLWJvZHktbGFyZ2UtbGluZS1oZWlnaHQpKTtmb250LXNpemU6dmFyKC0tbWF0LWZvcm0tZmllbGQtY29udGFpbmVyLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXNpemUpKTtsZXR0ZXItc3BhY2luZzp2YXIoLS1tYXQtZm9ybS1maWVsZC1jb250YWluZXItdGV4dC10cmFja2luZywgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXRyYWNraW5nKSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LWZvcm0tZmllbGQtY29udGFpbmVyLXRleHQtd2VpZ2h0LCB2YXIoLS1tYXQtc3lzLWJvZHktbGFyZ2Utd2VpZ2h0KSl9Lm1hdC1tZGMtZm9ybS1maWVsZCAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3Zle2ZvbnQtc2l6ZTpjYWxjKHZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWxhYmVsLXRleHQtcG9wdWxhdGVkLXNpemUpKnZhcigtLW1hdC1tZGMtZm9ybS1maWVsZC1mbG9hdGluZy1sYWJlbC1zY2FsZSkpfS5tYXQtbWRjLWZvcm0tZmllbGQgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmV7Zm9udC1zaXplOnZhcigtLW1hdC1mb3JtLWZpZWxkLW91dGxpbmVkLWxhYmVsLXRleHQtcG9wdWxhdGVkLXNpemUpfVtkaXI9cnRsXSAubWF0LW1kYy1mb3JtLWZpZWxke3RleHQtYWxpZ246cmlnaHR9Lm1hdC1tZGMtZm9ybS1maWVsZC1mbGV4e2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6YmFzZWxpbmU7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCV9Lm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVye3dpZHRoOjEwMCU7ei1pbmRleDowfS5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1wcmVmaXgsLm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXN1ZmZpeHthbGlnbi1zZWxmOmNlbnRlcjtsaW5lLWhlaWdodDowO3BvaW50ZXItZXZlbnRzOmF1dG87cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxfS5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1wcmVmaXg+Lm1hdC1pY29uLC5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1zdWZmaXg+Lm1hdC1pY29ue3BhZGRpbmc6MCAxMnB4O2JveC1zaXppbmc6Y29udGVudC1ib3h9Lm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXByZWZpeHtjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1sZWFkaW5nLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1wcmVmaXh7Y29sb3I6dmFyKC0tbWF0LWZvcm0tZmllbGQtZGlzYWJsZWQtbGVhZGluZy1pY29uLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSl9Lm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXN1ZmZpeHtjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC10cmFpbGluZy1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LW1kYy1mb3JtLWZpZWxkLWljb24tc3VmZml4e2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWRpc2FibGVkLXRyYWlsaW5nLWljb24tY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKX0ubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LW1kYy1mb3JtLWZpZWxkLWljb24tc3VmZml4e2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWVycm9yLXRyYWlsaW5nLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtZXJyb3IpKX0ubWF0LWZvcm0tZmllbGQtaW52YWxpZDpub3QoLm1hdC1mb2N1c2VkKTpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXI6aG92ZXIgLm1hdC1tZGMtZm9ybS1maWVsZC1pY29uLXN1ZmZpeHtjb2xvcjp2YXIoLS1tYXQtZm9ybS1maWVsZC1lcnJvci1ob3Zlci10cmFpbGluZy1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLWVycm9yLWNvbnRhaW5lcikpfS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb2N1c2VkIC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlciAubWF0LW1kYy1mb3JtLWZpZWxkLWljb24tc3VmZml4e2NvbG9yOnZhcigtLW1hdC1mb3JtLWZpZWxkLWVycm9yLWZvY3VzLXRyYWlsaW5nLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtZXJyb3IpKX0ubWF0LW1kYy1mb3JtLWZpZWxkLWljb24tcHJlZml4LFtkaXI9cnRsXSAubWF0LW1kYy1mb3JtLWZpZWxkLWljb24tc3VmZml4e3BhZGRpbmc6MCA0cHggMCAwfS5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1zdWZmaXgsW2Rpcj1ydGxdIC5tYXQtbWRjLWZvcm0tZmllbGQtaWNvbi1wcmVmaXh7cGFkZGluZzowIDAgMCA0cHh9Lm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciAubWF0LWljb24sLm1hdC1tZGMtZm9ybS1maWVsZCBsYWJlbCAubWF0LWljb257d2lkdGg6MWVtO2hlaWdodDoxZW07Zm9udC1zaXplOmluaGVyaXR9Lm1hdC1tZGMtZm9ybS1maWVsZC1pbmZpeHtmbGV4OmF1dG87bWluLXdpZHRoOjA7d2lkdGg6MTgwcHg7cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbWRjLWZvcm0tZmllbGQtaW5maXg6aGFzKHRleHRhcmVhW2NvbHNdKXt3aWR0aDphdXRvfS5tYXQtbWRjLWZvcm0tZmllbGQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoe21hcmdpbi1sZWZ0Oi0xcHg7LXdlYmtpdC1jbGlwLXBhdGg6aW5zZXQoLTllbSAtOTk5ZW0gLTllbSAxcHgpO2NsaXAtcGF0aDppbnNldCgtOWVtIC05OTllbSAtOWVtIDFweCl9W2Rpcj1ydGxdIC5tYXQtbWRjLWZvcm0tZmllbGQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoe21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0Oi0xcHg7LXdlYmtpdC1jbGlwLXBhdGg6aW5zZXQoLTllbSAxcHggLTllbSAtOTk5ZW0pO2NsaXAtcGF0aDppbnNldCgtOWVtIDFweCAtOWVtIC05OTllbSl9Lm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1hbmltYXRpb25zLWVuYWJsZWQgLm1kYy1mbG9hdGluZy1sYWJlbHt0cmFuc2l0aW9uOnRyYW5zZm9ybSAxNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpLGNvbG9yIDE1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSl9Lm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1hbmltYXRpb25zLWVuYWJsZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dHt0cmFuc2l0aW9uOm9wYWNpdHkgMTUwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWFuaW1hdGlvbnMtZW5hYmxlZCAubWRjLXRleHQtZmllbGRfX2lucHV0OjpwbGFjZWhvbGRlcnt0cmFuc2l0aW9uOm9wYWNpdHkgNjdtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpfS5tYXQtbWRjLWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtYW5pbWF0aW9ucy1lbmFibGVkIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXJ7dHJhbnNpdGlvbjpvcGFjaXR5IDY3bXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWFuaW1hdGlvbnMtZW5hYmxlZCAubWRjLXRleHQtZmllbGRfX2lucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye3RyYW5zaXRpb246b3BhY2l0eSA2N21zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSl9Lm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1hbmltYXRpb25zLWVuYWJsZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7dHJhbnNpdGlvbjpvcGFjaXR5IDY3bXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWFuaW1hdGlvbnMtZW5hYmxlZC5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWwgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6cGxhY2Vob2xkZXIsLm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1hbmltYXRpb25zLWVuYWJsZWQubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6cGxhY2Vob2xkZXJ7dHJhbnNpdGlvbi1kZWxheTo0MG1zO3RyYW5zaXRpb24tZHVyYXRpb246MTEwbXN9Lm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1hbmltYXRpb25zLWVuYWJsZWQubWRjLXRleHQtZmllbGQtLW5vLWxhYmVsIC5tZGMtdGV4dC1maWVsZF9faW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIsLm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1hbmltYXRpb25zLWVuYWJsZWQubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LW1vei1wbGFjZWhvbGRlcnt0cmFuc2l0aW9uLWRlbGF5OjQwbXM7dHJhbnNpdGlvbi1kdXJhdGlvbjoxMTBtc30ubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWFuaW1hdGlvbnMtZW5hYmxlZC5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWwgLm1kYy10ZXh0LWZpZWxkX19pbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciwubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWFuaW1hdGlvbnMtZW5hYmxlZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLXRleHQtZmllbGRfX2lucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye3RyYW5zaXRpb24tZGVsYXk6NDBtczt0cmFuc2l0aW9uLWR1cmF0aW9uOjExMG1zfS5tYXQtbWRjLWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtYW5pbWF0aW9ucy1lbmFibGVkLm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbCAubWRjLXRleHQtZmllbGRfX2lucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciwubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWFuaW1hdGlvbnMtZW5hYmxlZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLXRleHQtZmllbGRfX2lucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcnt0cmFuc2l0aW9uLWRlbGF5OjQwbXM7dHJhbnNpdGlvbi1kdXJhdGlvbjoxMTBtc30ubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWFuaW1hdGlvbnMtZW5hYmxlZCAubWRjLXRleHQtZmllbGQtLWZpbGxlZDpub3QoLm1kYy1yaXBwbGUtdXBncmFkZWQpOmZvY3VzIC5tZGMtdGV4dC1maWVsZF9fcmlwcGxlOjpiZWZvcmV7dHJhbnNpdGlvbi1kdXJhdGlvbjo3NW1zfS5tYXQtbWRjLWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtYW5pbWF0aW9ucy1lbmFibGVkIC5tZGMtbGluZS1yaXBwbGU6OmFmdGVye3RyYW5zaXRpb246dHJhbnNmb3JtIDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksb3BhY2l0eSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpfS5tYXQtbWRjLWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtYW5pbWF0aW9ucy1lbmFibGVkIC5tYXQtbWRjLWZvcm0tZmllbGQtaGludC13cmFwcGVyLC5tYXQtbWRjLWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtYW5pbWF0aW9ucy1lbmFibGVkIC5tYXQtbWRjLWZvcm0tZmllbGQtZXJyb3Itd3JhcHBlcnthbmltYXRpb24tZHVyYXRpb246MzAwbXN9Lm1kYy1ub3RjaGVkLW91dGxpbmUgLm1kYy1mbG9hdGluZy1sYWJlbHttYXgtd2lkdGg6Y2FsYygxMDAlICsgMXB4KX0ubWRjLW5vdGNoZWQtb3V0bGluZS0tdXBncmFkZWQgLm1kYy1mbG9hdGluZy1sYWJlbC0tZmxvYXQtYWJvdmV7bWF4LXdpZHRoOmNhbGMoMTMzLjMzMzMzMzMzMzMlICsgMXB4KX0KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIGl9KSgpfSk7dmFyIERvLFZzPV8oKCk9Pnt0cygpO2YoKTtTbygpO3dlKCk7RG89KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVtb2Q9Uih7dHlwZTppfSk7c3RhdGljIFx1MDI3NWluaj1TKHtpbXBvcnRzOltYLFhyLExzLFhdfSl9cmV0dXJuIGl9KSgpfSk7dmFyIEZnPV8oKCk9PntTbygpO1ZzKCl9KTt2YXIgTmcsUGcsWnUsWHUsUXU9XygoKT0+e2YoKTtmKCk7bnQoKTtzZSgpO3hpKCk7RWkoKTtOZz0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NWNtcD1QKHt0eXBlOmksc2VsZWN0b3JzOltbIm5nLWNvbXBvbmVudCJdXSxob3N0QXR0cnM6WyJjZGstdGV4dC1maWVsZC1zdHlsZS1sb2FkZXIiLCIiXSxkZWNsczowLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbihlLHIpe30sc3R5bGVzOltgdGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXple3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmd7cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveHtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHsvKiEqL31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHsvKiEqL30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9CmBdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiBpfSkoKSxQZz17cGFzc2l2ZTohMH0sWnU9KCgpPT57Y2xhc3MgaXtfcGxhdGZvcm09bChUKTtfbmdab25lPWwoRSk7X3JlbmRlcmVyPWwoa3QpLmNyZWF0ZVJlbmRlcmVyKG51bGwsbnVsbCk7X3N0eWxlTG9hZGVyPWwoTXQpO19tb25pdG9yZWRFbGVtZW50cz1uZXcgTWFwO2NvbnN0cnVjdG9yKCl7fW1vbml0b3IodCl7aWYoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcilyZXR1cm4gVXQ7dGhpcy5fc3R5bGVMb2FkZXIubG9hZChOZyk7bGV0IGU9d3QodCkscj10aGlzLl9tb25pdG9yZWRFbGVtZW50cy5nZXQoZSk7aWYocilyZXR1cm4gci5zdWJqZWN0O2xldCBvPW5ldyB5LGE9ImNkay10ZXh0LWZpZWxkLWF1dG9maWxsZWQiLHM9ZD0+e2QuYW5pbWF0aW9uTmFtZT09PSJjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCImJiFlLmNsYXNzTGlzdC5jb250YWlucyhhKT8oZS5jbGFzc0xpc3QuYWRkKGEpLHRoaXMuX25nWm9uZS5ydW4oKCk9Pm8ubmV4dCh7dGFyZ2V0OmQudGFyZ2V0LGlzQXV0b2ZpbGxlZDohMH0pKSk6ZC5hbmltYXRpb25OYW1lPT09ImNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCImJmUuY2xhc3NMaXN0LmNvbnRhaW5zKGEpJiYoZS5jbGFzc0xpc3QucmVtb3ZlKGEpLHRoaXMuX25nWm9uZS5ydW4oKCk9Pm8ubmV4dCh7dGFyZ2V0OmQudGFyZ2V0LGlzQXV0b2ZpbGxlZDohMX0pKSl9LGM9dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT4oZS5jbGFzc0xpc3QuYWRkKCJjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQiKSx0aGlzLl9yZW5kZXJlci5saXN0ZW4oZSwiYW5pbWF0aW9uc3RhcnQiLHMsUGcpKSk7cmV0dXJuIHRoaXMuX21vbml0b3JlZEVsZW1lbnRzLnNldChlLHtzdWJqZWN0Om8sdW5saXN0ZW46Y30pLG99c3RvcE1vbml0b3JpbmcodCl7bGV0IGU9d3QodCkscj10aGlzLl9tb25pdG9yZWRFbGVtZW50cy5nZXQoZSk7ciYmKHIudW5saXN0ZW4oKSxyLnN1YmplY3QuY29tcGxldGUoKSxlLmNsYXNzTGlzdC5yZW1vdmUoImNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgiY2RrLXRleHQtZmllbGQtYXV0b2ZpbGxlZCIpLHRoaXMuX21vbml0b3JlZEVsZW1lbnRzLmRlbGV0ZShlKSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9tb25pdG9yZWRFbGVtZW50cy5mb3JFYWNoKCh0LGUpPT50aGlzLnN0b3BNb25pdG9yaW5nKGUpKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVwcm92PW0oe3Rva2VuOmksZmFjdG9yeTppLlx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiBpfSkoKSxYdT0oKCk9PntjbGFzcyBpe3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NW1vZD1SKHt0eXBlOml9KTtzdGF0aWMgXHUwMjc1aW5qPVMoe30pfXJldHVybiBpfSkoKX0pO3ZhciBKdSx0aD1fKCgpPT57ZigpO0p1PW5ldyB2KCJNQVRfSU5QVVRfVkFMVUVfQUNDRVNTT1IiKX0pO3ZhciBlaCxpaD1fKCgpPT57ZigpO2VoPSgoKT0+e2NsYXNzIGl7aXNFcnJvclN0YXRlKHQsZSl7cmV0dXJuISEodCYmdC5pbnZhbGlkJiYodC50b3VjaGVkfHxlJiZlLnN1Ym1pdHRlZCkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7dmFyIFJvLG5oPV8oKCk9PntSbz1jbGFzc3tfZGVmYXVsdE1hdGNoZXI7bmdDb250cm9sO19wYXJlbnRGb3JtR3JvdXA7X3BhcmVudEZvcm07X3N0YXRlQ2hhbmdlcztlcnJvclN0YXRlPSExO21hdGNoZXI7Y29uc3RydWN0b3Iobix0LGUscixvKXt0aGlzLl9kZWZhdWx0TWF0Y2hlcj1uLHRoaXMubmdDb250cm9sPXQsdGhpcy5fcGFyZW50Rm9ybUdyb3VwPWUsdGhpcy5fcGFyZW50Rm9ybT1yLHRoaXMuX3N0YXRlQ2hhbmdlcz1vfXVwZGF0ZUVycm9yU3RhdGUoKXtsZXQgbj10aGlzLmVycm9yU3RhdGUsdD10aGlzLl9wYXJlbnRGb3JtR3JvdXB8fHRoaXMuX3BhcmVudEZvcm0sZT10aGlzLm1hdGNoZXJ8fHRoaXMuX2RlZmF1bHRNYXRjaGVyLHI9dGhpcy5uZ0NvbnRyb2w/dGhpcy5uZ0NvbnRyb2wuY29udHJvbDpudWxsLG89ZT8uaXNFcnJvclN0YXRlKHIsdCk/PyExO28hPT1uJiYodGhpcy5lcnJvclN0YXRlPW8sdGhpcy5fc3RhdGVDaGFuZ2VzLm5leHQoKSl9fX0pO3ZhciBMZyxWZyxaRSxYRSxqZz1fKCgpPT57bm8oKTtPaSgpO1F1KCk7ZigpO2YoKTtxZSgpO051KCk7bnQoKTt0aCgpO1NvKCk7aWgoKTtuaCgpO1ZzKCk7d2UoKTtMZz1bImJ1dHRvbiIsImNoZWNrYm94IiwiZmlsZSIsImhpZGRlbiIsImltYWdlIiwicmFkaW8iLCJyYW5nZSIsInJlc2V0Iiwic3VibWl0Il0sVmc9bmV3IHYoIk1BVF9JTlBVVF9DT05GSUciKSxaRT0oKCk9PntjbGFzcyBpe19lbGVtZW50UmVmPWwoRCk7X3BsYXRmb3JtPWwoVCk7bmdDb250cm9sPWwocXQse29wdGlvbmFsOiEwLHNlbGY6ITB9KTtfYXV0b2ZpbGxNb25pdG9yPWwoWnUpO19uZ1pvbmU9bChFKTtfZm9ybUZpZWxkPWwoRW8se29wdGlvbmFsOiEwfSk7X3JlbmRlcmVyPWwobHQpO191aWQ9bChXdCkuZ2V0SWQoIm1hdC1pbnB1dC0iKTtfcHJldmlvdXNOYXRpdmVWYWx1ZTtfaW5wdXRWYWx1ZUFjY2Vzc29yO19zaWduYWxCYXNlZFZhbHVlQWNjZXNzb3I7X3ByZXZpb3VzUGxhY2Vob2xkZXI7X2Vycm9yU3RhdGVUcmFja2VyO19jb25maWc9bChWZyx7b3B0aW9uYWw6ITB9KTtfY2xlYW51cElvc0tleXVwO19jbGVhbnVwV2Via2l0V2hlZWw7X2lzU2VydmVyO19pc05hdGl2ZVNlbGVjdDtfaXNUZXh0YXJlYTtfaXNJbkZvcm1GaWVsZDtmb2N1c2VkPSExO3N0YXRlQ2hhbmdlcz1uZXcgeTtjb250cm9sVHlwZT0ibWF0LWlucHV0IjthdXRvZmlsbGVkPSExO2dldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9a2kodCksdGhpcy5mb2N1c2VkJiYodGhpcy5mb2N1c2VkPSExLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSl9X2Rpc2FibGVkPSExO2dldCBpZCgpe3JldHVybiB0aGlzLl9pZH1zZXQgaWQodCl7dGhpcy5faWQ9dHx8dGhpcy5fdWlkfV9pZDtwbGFjZWhvbGRlcjtuYW1lO2dldCByZXF1aXJlZCgpe3JldHVybiB0aGlzLl9yZXF1aXJlZD8/dGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2w/Lmhhc1ZhbGlkYXRvcihhby5yZXF1aXJlZCk/PyExfXNldCByZXF1aXJlZCh0KXt0aGlzLl9yZXF1aXJlZD1raSh0KX1fcmVxdWlyZWQ7Z2V0IHR5cGUoKXtyZXR1cm4gdGhpcy5fdHlwZX1zZXQgdHlwZSh0KXt0aGlzLl90eXBlPXR8fCJ0ZXh0Iix0aGlzLl92YWxpZGF0ZVR5cGUoKSwhdGhpcy5faXNUZXh0YXJlYSYmY3MoKS5oYXModGhpcy5fdHlwZSkmJih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudHlwZT10aGlzLl90eXBlKX1fdHlwZT0idGV4dCI7Z2V0IGVycm9yU3RhdGVNYXRjaGVyKCl7cmV0dXJuIHRoaXMuX2Vycm9yU3RhdGVUcmFja2VyLm1hdGNoZXJ9c2V0IGVycm9yU3RhdGVNYXRjaGVyKHQpe3RoaXMuX2Vycm9yU3RhdGVUcmFja2VyLm1hdGNoZXI9dH11c2VyQXJpYURlc2NyaWJlZEJ5O2dldCB2YWx1ZSgpe3JldHVybiB0aGlzLl9zaWduYWxCYXNlZFZhbHVlQWNjZXNzb3I/dGhpcy5fc2lnbmFsQmFzZWRWYWx1ZUFjY2Vzc29yLnZhbHVlKCk6dGhpcy5faW5wdXRWYWx1ZUFjY2Vzc29yLnZhbHVlfXNldCB2YWx1ZSh0KXt0IT09dGhpcy52YWx1ZSYmKHRoaXMuX3NpZ25hbEJhc2VkVmFsdWVBY2Nlc3Nvcj90aGlzLl9zaWduYWxCYXNlZFZhbHVlQWNjZXNzb3IudmFsdWUuc2V0KHQpOnRoaXMuX2lucHV0VmFsdWVBY2Nlc3Nvci52YWx1ZT10LHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSl9Z2V0IHJlYWRvbmx5KCl7cmV0dXJuIHRoaXMuX3JlYWRvbmx5fXNldCByZWFkb25seSh0KXt0aGlzLl9yZWFkb25seT1raSh0KX1fcmVhZG9ubHk9ITE7ZGlzYWJsZWRJbnRlcmFjdGl2ZTtnZXQgZXJyb3JTdGF0ZSgpe3JldHVybiB0aGlzLl9lcnJvclN0YXRlVHJhY2tlci5lcnJvclN0YXRlfXNldCBlcnJvclN0YXRlKHQpe3RoaXMuX2Vycm9yU3RhdGVUcmFja2VyLmVycm9yU3RhdGU9dH1fbmV2ZXJFbXB0eUlucHV0VHlwZXM9WyJkYXRlIiwiZGF0ZXRpbWUiLCJkYXRldGltZS1sb2NhbCIsIm1vbnRoIiwidGltZSIsIndlZWsiXS5maWx0ZXIodD0+Y3MoKS5oYXModCkpO2NvbnN0cnVjdG9yKCl7bGV0IHQ9bChScyx7b3B0aW9uYWw6ITB9KSxlPWwoSXMse29wdGlvbmFsOiEwfSkscj1sKGVoKSxvPWwoSnUse29wdGlvbmFsOiEwLHNlbGY6ITB9KSxhPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxzPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtvP1VpKG8udmFsdWUpP3RoaXMuX3NpZ25hbEJhc2VkVmFsdWVBY2Nlc3Nvcj1vOnRoaXMuX2lucHV0VmFsdWVBY2Nlc3Nvcj1vOnRoaXMuX2lucHV0VmFsdWVBY2Nlc3Nvcj1hLHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWU9dGhpcy52YWx1ZSx0aGlzLmlkPXRoaXMuaWQsdGhpcy5fcGxhdGZvcm0uSU9TJiZ0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLl9jbGVhbnVwSW9zS2V5dXA9dGhpcy5fcmVuZGVyZXIubGlzdGVuKGEsImtleXVwIix0aGlzLl9pT1NLZXl1cExpc3RlbmVyKX0pLHRoaXMuX2Vycm9yU3RhdGVUcmFja2VyPW5ldyBSbyhyLHRoaXMubmdDb250cm9sLGUsdCx0aGlzLnN0YXRlQ2hhbmdlcyksdGhpcy5faXNTZXJ2ZXI9IXRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcix0aGlzLl9pc05hdGl2ZVNlbGVjdD1zPT09InNlbGVjdCIsdGhpcy5faXNUZXh0YXJlYT1zPT09InRleHRhcmVhIix0aGlzLl9pc0luRm9ybUZpZWxkPSEhdGhpcy5fZm9ybUZpZWxkLHRoaXMuZGlzYWJsZWRJbnRlcmFjdGl2ZT10aGlzLl9jb25maWc/LmRpc2FibGVkSW50ZXJhY3RpdmV8fCExLHRoaXMuX2lzTmF0aXZlU2VsZWN0JiYodGhpcy5jb250cm9sVHlwZT1hLm11bHRpcGxlPyJtYXQtbmF0aXZlLXNlbGVjdC1tdWx0aXBsZSI6Im1hdC1uYXRpdmUtc2VsZWN0IiksdGhpcy5fc2lnbmFsQmFzZWRWYWx1ZUFjY2Vzc29yJiZOZSgoKT0+e3RoaXMuX3NpZ25hbEJhc2VkVmFsdWVBY2Nlc3Nvci52YWx1ZSgpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX0pfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX3BsYXRmb3JtLmlzQnJvd3NlciYmdGhpcy5fYXV0b2ZpbGxNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5zdWJzY3JpYmUodD0+e3RoaXMuYXV0b2ZpbGxlZD10LmlzQXV0b2ZpbGxlZCx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9KX1uZ09uQ2hhbmdlcygpe3RoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX1uZ09uRGVzdHJveSgpe3RoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCksdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyJiZ0aGlzLl9hdXRvZmlsbE1vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSx0aGlzLl9jbGVhbnVwSW9zS2V5dXA/LigpLHRoaXMuX2NsZWFudXBXZWJraXRXaGVlbD8uKCl9bmdEb0NoZWNrKCl7dGhpcy5uZ0NvbnRyb2wmJih0aGlzLnVwZGF0ZUVycm9yU3RhdGUoKSx0aGlzLm5nQ29udHJvbC5kaXNhYmxlZCE9PW51bGwmJnRoaXMubmdDb250cm9sLmRpc2FibGVkIT09dGhpcy5kaXNhYmxlZCYmKHRoaXMuZGlzYWJsZWQ9dGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKSksdGhpcy5fZGlydHlDaGVja05hdGl2ZVZhbHVlKCksdGhpcy5fZGlydHlDaGVja1BsYWNlaG9sZGVyKCl9Zm9jdXModCl7dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKHQpfXVwZGF0ZUVycm9yU3RhdGUoKXt0aGlzLl9lcnJvclN0YXRlVHJhY2tlci51cGRhdGVFcnJvclN0YXRlKCl9X2ZvY3VzQ2hhbmdlZCh0KXtpZih0IT09dGhpcy5mb2N1c2VkKXtpZighdGhpcy5faXNOYXRpdmVTZWxlY3QmJnQmJnRoaXMuZGlzYWJsZWQmJnRoaXMuZGlzYWJsZWRJbnRlcmFjdGl2ZSl7bGV0IGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2UudHlwZT09PSJudW1iZXIiPyhlLnR5cGU9InRleHQiLGUuc2V0U2VsZWN0aW9uUmFuZ2UoMCwwKSxlLnR5cGU9Im51bWJlciIpOmUuc2V0U2VsZWN0aW9uUmFuZ2UoMCwwKX10aGlzLmZvY3VzZWQ9dCx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9fV9vbklucHV0KCl7fV9kaXJ0eUNoZWNrTmF0aXZlVmFsdWUoKXtsZXQgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWU7dGhpcy5fcHJldmlvdXNOYXRpdmVWYWx1ZSE9PXQmJih0aGlzLl9wcmV2aW91c05hdGl2ZVZhbHVlPXQsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX1fZGlydHlDaGVja1BsYWNlaG9sZGVyKCl7bGV0IHQ9dGhpcy5fZ2V0UGxhY2Vob2xkZXIoKTtpZih0IT09dGhpcy5fcHJldmlvdXNQbGFjZWhvbGRlcil7bGV0IGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O3RoaXMuX3ByZXZpb3VzUGxhY2Vob2xkZXI9dCx0P2Uuc2V0QXR0cmlidXRlKCJwbGFjZWhvbGRlciIsdCk6ZS5yZW1vdmVBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIil9fV9nZXRQbGFjZWhvbGRlcigpe3JldHVybiB0aGlzLnBsYWNlaG9sZGVyfHxudWxsfV92YWxpZGF0ZVR5cGUoKXtMZy5pbmRleE9mKHRoaXMuX3R5cGUpPi0xfV9pc05ldmVyRW1wdHkoKXtyZXR1cm4gdGhpcy5fbmV2ZXJFbXB0eUlucHV0VHlwZXMuaW5kZXhPZih0aGlzLl90eXBlKT4tMX1faXNCYWRJbnB1dCgpe2xldCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWxpZGl0eTtyZXR1cm4gdCYmdC5iYWRJbnB1dH1nZXQgZW1wdHkoKXtyZXR1cm4hdGhpcy5faXNOZXZlckVtcHR5KCkmJiF0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUmJiF0aGlzLl9pc0JhZElucHV0KCkmJiF0aGlzLmF1dG9maWxsZWR9Z2V0IHNob3VsZExhYmVsRmxvYXQoKXtpZih0aGlzLl9pc05hdGl2ZVNlbGVjdCl7bGV0IHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LGU9dC5vcHRpb25zWzBdO3JldHVybiB0aGlzLmZvY3VzZWR8fHQubXVsdGlwbGV8fCF0aGlzLmVtcHR5fHwhISh0LnNlbGVjdGVkSW5kZXg+LTEmJmUmJmUubGFiZWwpfWVsc2UgcmV0dXJuIHRoaXMuZm9jdXNlZCYmIXRoaXMuZGlzYWJsZWR8fCF0aGlzLmVtcHR5fWdldCBkZXNjcmliZWRCeUlkcygpe3JldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5Iik/LnNwbGl0KCIgIil8fFtdfXNldERlc2NyaWJlZEJ5SWRzKHQpe2xldCBlPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDt0Lmxlbmd0aD9lLnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsdC5qb2luKCIgIikpOmUucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5Iil9b25Db250YWluZXJDbGljaygpe3RoaXMuZm9jdXNlZHx8dGhpcy5mb2N1cygpfV9pc0lubGluZVNlbGVjdCgpe2xldCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtyZXR1cm4gdGhpcy5faXNOYXRpdmVTZWxlY3QmJih0Lm11bHRpcGxlfHx0LnNpemU+MSl9X2lPU0tleXVwTGlzdGVuZXI9dD0+e2xldCBlPXQudGFyZ2V0OyFlLnZhbHVlJiZlLnNlbGVjdGlvblN0YXJ0PT09MCYmZS5zZWxlY3Rpb25FbmQ9PT0wJiYoZS5zZXRTZWxlY3Rpb25SYW5nZSgxLDEpLGUuc2V0U2VsZWN0aW9uUmFuZ2UoMCwwKSl9O19nZXRSZWFkb25seUF0dHJpYnV0ZSgpe3JldHVybiB0aGlzLl9pc05hdGl2ZVNlbGVjdD9udWxsOnRoaXMucmVhZG9ubHl8fHRoaXMuZGlzYWJsZWQmJnRoaXMuZGlzYWJsZWRJbnRlcmFjdGl2ZT8idHJ1ZSI6bnVsbH1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVkaXI9cCh7dHlwZTppLHNlbGVjdG9yczpbWyJpbnB1dCIsIm1hdElucHV0IiwiIl0sWyJ0ZXh0YXJlYSIsIm1hdElucHV0IiwiIl0sWyJzZWxlY3QiLCJtYXROYXRpdmVDb250cm9sIiwiIl0sWyJpbnB1dCIsIm1hdE5hdGl2ZUNvbnRyb2wiLCIiXSxbInRleHRhcmVhIiwibWF0TmF0aXZlQ29udHJvbCIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtaW5wdXQtZWxlbWVudCJdLGhvc3RWYXJzOjIxLGhvc3RCaW5kaW5nczpmdW5jdGlvbihlLHIpe2UmMSYmZHQoImZvY3VzIixmdW5jdGlvbigpe3JldHVybiByLl9mb2N1c0NoYW5nZWQoITApfSkoImJsdXIiLGZ1bmN0aW9uKCl7cmV0dXJuIHIuX2ZvY3VzQ2hhbmdlZCghMSl9KSgiaW5wdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHIuX29uSW5wdXQoKX0pLGUmMiYmKEhpKCJpZCIsci5pZCkoImRpc2FibGVkIixyLmRpc2FibGVkJiYhci5kaXNhYmxlZEludGVyYWN0aXZlKSgicmVxdWlyZWQiLHIucmVxdWlyZWQpLHR0KCJuYW1lIixyLm5hbWV8fG51bGwpKCJyZWFkb25seSIsci5fZ2V0UmVhZG9ubHlBdHRyaWJ1dGUoKSkoImFyaWEtZGlzYWJsZWQiLHIuZGlzYWJsZWQmJnIuZGlzYWJsZWRJbnRlcmFjdGl2ZT8idHJ1ZSI6bnVsbCkoImFyaWEtaW52YWxpZCIsci5lbXB0eSYmci5yZXF1aXJlZD9udWxsOnIuZXJyb3JTdGF0ZSkoImFyaWEtcmVxdWlyZWQiLHIucmVxdWlyZWQpKCJpZCIsci5pZCksSCgibWF0LWlucHV0LXNlcnZlciIsci5faXNTZXJ2ZXIpKCJtYXQtbWRjLWZvcm0tZmllbGQtdGV4dGFyZWEtY29udHJvbCIsci5faXNJbkZvcm1GaWVsZCYmci5faXNUZXh0YXJlYSkoIm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sIixyLl9pc0luRm9ybUZpZWxkKSgibWF0LW1kYy1pbnB1dC1kaXNhYmxlZC1pbnRlcmFjdGl2ZSIsci5kaXNhYmxlZEludGVyYWN0aXZlKSgibWRjLXRleHQtZmllbGRfX2lucHV0IixyLl9pc0luRm9ybUZpZWxkKSgibWF0LW1kYy1uYXRpdmUtc2VsZWN0LWlubGluZSIsci5faXNJbmxpbmVTZWxlY3QoKSkpfSxpbnB1dHM6e2Rpc2FibGVkOiJkaXNhYmxlZCIsaWQ6ImlkIixwbGFjZWhvbGRlcjoicGxhY2Vob2xkZXIiLG5hbWU6Im5hbWUiLHJlcXVpcmVkOiJyZXF1aXJlZCIsdHlwZToidHlwZSIsZXJyb3JTdGF0ZU1hdGNoZXI6ImVycm9yU3RhdGVNYXRjaGVyIix1c2VyQXJpYURlc2NyaWJlZEJ5OlswLCJhcmlhLWRlc2NyaWJlZGJ5IiwidXNlckFyaWFEZXNjcmliZWRCeSJdLHZhbHVlOiJ2YWx1ZSIscmVhZG9ubHk6InJlYWRvbmx5IixkaXNhYmxlZEludGVyYWN0aXZlOlsyLCJkaXNhYmxlZEludGVyYWN0aXZlIiwiZGlzYWJsZWRJbnRlcmFjdGl2ZSIsRl19LGV4cG9ydEFzOlsibWF0SW5wdXQiXSxmZWF0dXJlczpbeihbe3Byb3ZpZGU6d28sdXNlRXhpc3Rpbmc6aX1dKSxtdF19KX1yZXR1cm4gaX0pKCksWEU9KCgpPT57Y2xhc3MgaXtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcoZXx8aSl9O3N0YXRpYyBcdTAyNzVtb2Q9Uih7dHlwZTppfSk7c3RhdGljIFx1MDI3NWluaj1TKHtpbXBvcnRzOltYLERvLERvLFh1LFhdfSl9cmV0dXJuIGl9KSgpfSk7dmFyIHJTLEJnPV8oKCk9PntmKCk7VW8oKTtodCgpO0hvKCk7ZigpO3JTPSgoKT0+e2NsYXNzIGl7aHR0cD1sKG5pKTtob3N0U2VydmVyPUpuLmhvc3RTZXJ2ZXI7aG9zdD10aGlzLmhvc3RTZXJ2ZXIrIi9yZXN0L3dlYjMiO25mdFVubG9ja2VkKCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0KyIvbmZ0VW5sb2NrZWQiKS5waXBlKGIodD0+dCksYXQodD0+e3Rocm93IHR9KSl9bmZ0TWludExpc3Rlbigpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaG9zdCsiL25mdE1pbnRMaXN0ZW4iKS5waXBlKGIodD0+dCksYXQodD0+e3Rocm93IHR9KSl9Y2hlY2tOZnRNaW50ZWQoKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmhvc3RTZXJ2ZXIrIi9hcGkvQ2hhbGxlbmdlcy8/a2V5PW5mdE1pbnRDaGFsbGVuZ2UiKS5waXBlKGIodD0+dCksYXQodD0+e3Rocm93IHR9KSl9c3VibWl0S2V5KHQpe2xldCBlPXRoaXMuaG9zdCsiL3N1Ym1pdEtleSIscj17cHJpdmF0ZUtleTp0fTtyZXR1cm4gdGhpcy5odHRwLnBvc3QoZSxyKS5waXBlKGIobz0+byksYXQobz0+e3Rocm93IG99KSl9dmVyaWZ5TkZUV2FsbGV0KHQpe2xldCBlPXRoaXMuaG9zdCsiL3dhbGxldE5GVFZlcmlmeSIscj17d2FsbGV0QWRkcmVzczp0fTtyZXR1cm4gdGhpcy5odHRwLnBvc3QoZSxyKS5waXBlKGIobz0+byksYXQobz0+e3Rocm93IG99KSl9d2FsbGV0QWRkcmVzc1NlbmQodCl7bGV0IGU9dGhpcy5ob3N0KyIvd2FsbGV0RXhwbG9pdEFkZHJlc3MiLHI9e3dhbGxldEFkZHJlc3M6dH07cmV0dXJuIHRoaXMuaHR0cC5wb3N0KGUscikucGlwZShiKG89Pm8pLGF0KG89Pnt0aHJvdyBvfSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7dmFyIGRTLHpnPV8oKCk9PntmKCk7ZXUoKTtJbCgpO2YoKTtkUz0oKCk9PntjbGFzcyBpe3RyYW5zbGF0ZVNlcnZpY2U9bChzaSk7c25hY2tCYXI9bChfcyk7b3Blbih0LGUpe3RoaXMudHJhbnNsYXRlU2VydmljZS5nZXQodCkuc3Vic2NyaWJlKHtuZXh0OnI9Pnt0aGlzLnNuYWNrQmFyLm9wZW4ociwiWCIse2R1cmF0aW9uOjVlMyxwYW5lbENsYXNzOltlLCJtYXQtYm9keSJdfSl9LGVycm9yOigpPT57dGhpcy5zbmFja0Jhci5vcGVuKHQsIlgiLHtkdXJhdGlvbjo1ZTMscGFuZWxDbGFzczpbZSwibWF0LWJvZHkiXX0pfX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHxpKX07c3RhdGljIFx1MDI3NXByb3Y9bSh7dG9rZW46aSxmYWN0b3J5OmkuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIGl9KSgpfSk7ZXhwb3J0e0puIGFzIGEsSG8gYXMgYixyaSBhcyBjLHNpIGFzIGQsUWcgYXMgZSxKZyBhcyBmLHR2IGFzIGcsSWwgYXMgaCxyZSBhcyBpLGZhIGFzIGosYWUgYXMgayxiYyBhcyBsLFBtIGFzIG0sVW0gYXMgbixyXyBhcyBvLEhtIGFzIHAsRGkgYXMgcSxDZSBhcyByLFJpIGFzIHMsdWIgYXMgdCxMYSBhcyB1LEZyIGFzIHYsVmEgYXMgdyxFbiBhcyB4LFNuIGFzIHksQWEgYXMgeixmbiBhcyBBLFQgYXMgQixzZSBhcyBDLEFpIGFzIEQscG4gYXMgRSxUYyBhcyBGLEtyIGFzIEcsaGYgYXMgSCxmZCBhcyBJLE10IGFzIEosWnIgYXMgSyxBbiBhcyBMLGlDIGFzIE0sWHIgYXMgTix0cyBhcyBPLHlkIGFzIFAseGQgYXMgUSxFZiBhcyBSLGlzIGFzIFMsRGYgYXMgVCxucyBhcyBVLE5yIGFzIFYsemEgYXMgVyxZIGFzIFgsbGUgYXMgWSxJciBhcyBaLEJ0IGFzIF8sSGUgYXMgJCxNXyBhcyBhYSx2biBhcyBiYSxGYyBhcyBjYSxrXyBhcyBkYSxxbSBhcyBlYSxZbSBhcyBmYSxOXyBhcyBnYSxLbSBhcyBoYSxfbiBhcyBpYSxRbSBhcyBqYSxTaSBhcyBrYSxUYSBhcyBsYSxGYSBhcyBtYSxOYSBhcyBuYSxXdCBhcyBvYSxCYSBhcyBwYSxVYyBhcyBxYSxIciBhcyByYSxXZSBhcyBzYSxXYSBhcyB0YSxCciBhcyB1YSxHYSBhcyB2YSx6ciBhcyB3YSwkciBhcyB4YSxDbiBhcyB5YSwkYSBhcyB6YSxyZiBhcyBBYSxxYSBhcyBCYSxZYSBhcyBDYSxRYyBhcyBEYSxraSBhcyBFYSxEeCBhcyBGYSxubyBhcyBHYSxmeSBhcyBIYSxaYSBhcyBJYSxWZiBhcyBKYSxHdCBhcyBLYSxUaSBhcyBMYSxvcyBhcyBNYSxhcyBhcyBOYSxBZiBhcyBPYSxNZiBhcyBQYSxLQyBhcyBRYSxxZSBhcyBSYSxYIGFzIFNhLHdlIGFzIFRhLF94IGFzIFVhLGJ4IGFzIFZhLFBmIGFzIFdhLE9pIGFzIFhhLHp0IGFzIFlhLEluIGFzIFphLGhzIGFzIF9hLCR4IGFzICRhLGpkIGFzIGFiLFdkIGFzIGJiLEdkIGFzIGNiLHFmIGFzIGRiLFlkIGFzIGViLEJkIGFzIGZiLHpkIGFzIGdiLFpkIGFzIGhiLFhkIGFzIGliLFFkIGFzIGpiLEQwIGFzIGtiLFIwIGFzIGxiLEEwIGFzIG1iLE0wIGFzIG5iLEkwIGFzIG9iLE8wIGFzIHBiLGswIGFzIHFiLGlwIGFzIHJiLF9zIGFzIHNiLFEwIGFzIHRiLGV1IGFzIHViLGRTIGFzIHZiLHpnIGFzIHdiLFNlIGFzIHhiLGZwIGFzIHliLGR1IGFzIHpiLHVlIGFzIEFiLGFvIGFzIEJiLHF0IGFzIENiLF93IGFzIERiLGJ3IGFzIEViLHl3IGFzIEZiLFJzIGFzIEdiLHh3IGFzIEhiLGpwIGFzIEliLHd3IGFzIEpiLHpwIGFzIEtiLEhwIGFzIExiLElzIGFzIE1iLEdwIGFzIE5iLE91IGFzIE9iLEV3IGFzIFBiLFN3IGFzIFFiLFFwIGFzIFJiLHRnIGFzIFNiLGlnIGFzIFRiLHJnIGFzIFViLER3IGFzIFZiLFJ3IGFzIFdiLE51IGFzIFhiLFB1IGFzIFliLEx1IGFzIFpiLGtzIGFzIF9iLEFnIGFzICRiLFRzIGFzIGFjLE1nIGFzIGJjLElnIGFzIGNjLHdvIGFzIGRjLEVvIGFzIGVjLExzIGFzIGZjLFNvIGFzIGdjLERvIGFzIGhjLFZzIGFzIGljLEZnIGFzIGpjLEp1IGFzIGtjLHRoIGFzIGxjLGVoIGFzIG1jLGloIGFzIG5jLFJvIGFzIG9jLG5oIGFzIHBjLFpFIGFzIHFjLFhFIGFzIHJjLGpnIGFzIHNjLHJTIGFzIHRjLEJnIGFzIHVjfTsK","response_hash":"bd84b01d380b3a50936bcbd425dedbc888fe2488f435fca4737ed0aec241cae9","response_time_ms":0,"response_words":6229,"has_response":true,"parameters":[{"name":"1","value":"chunk-TJME2352.js","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":22}],"sent_at":"2026-04-05T05:33:08.387931Z","received_at":"2026-04-05T05:33:08.38793Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"5a3cea1f-4fa9-4818-9248-c88256e990f4","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"//api-docs","url":"http://localhost:3000//api-docs","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC8vYXBpLWRvY3MgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"5b5db79bd31275677de65fc39616290346b702b4bc207dc81287586167d84830","status_code":301,"response_http_version":"HTTP/1.1","response_headers":{"Access-Control-Allow-Origin":["*"],"Connection":["keep-alive"],"Content-Length":["158"],"Content-Security-Policy":["default-src 'none'"],"Content-Type":["text/html; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:34 GMT"],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Location":["/api-docs/"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=UTF-8","response_content_length":158,"raw_response":"SFRUUC8xLjEgMzAxIE1vdmVkIFBlcm1hbmVudGx5DQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDb250ZW50LUxlbmd0aDogMTU4DQpDb250ZW50LVNlY3VyaXR5LVBvbGljeTogZGVmYXVsdC1zcmMgJ25vbmUnDQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjM0IEdNVA0KWC1Db250ZW50LVR5cGUtT3B0aW9uczogbm9zbmlmZg0KQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgNCkZlYXR1cmUtUG9saWN5OiBwYXltZW50ICdzZWxmJw0KS2VlcC1BbGl2ZTogdGltZW91dD01DQpMb2NhdGlvbjogL2FwaS1kb2NzLw0KVmFyeTogQWNjZXB0LUVuY29kaW5nDQpYLUZyYW1lLU9wdGlvbnM6IFNBTUVPUklHSU4NClgtUmVjcnVpdGluZzogLyMvam9icw0KQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqDQoNCjwhRE9DVFlQRSBodG1sPgo8aHRtbCBsYW5nPSJlbiI+CjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cjx0aXRsZT5SZWRpcmVjdGluZzwvdGl0bGU+CjwvaGVhZD4KPGJvZHk+CjxwcmU+UmVkaXJlY3RpbmcgdG8gL2FwaS1kb2NzLzwvcHJlPgo8L2JvZHk+CjwvaHRtbD4K","response_hash":"5d7b57502894aa01aba129e20e20dde7640752f5c5e6fbfcca0810f9e7b5eb1a","response_time_ms":0,"response_words":49,"has_response":true,"response_title":"Redirecting","parameters":[{"name":"1","value":"api-docs","type":"path","name_start":-1,"name_end":-1,"value_start":6,"value_end":14}],"sent_at":"2026-04-05T05:33:08.387941Z","received_at":"2026-04-05T05:33:08.387941Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"ec8e7f27-8a53-41c3-9004-b7f8fbb278d3","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/main.js","url":"http://localhost:3000/main.js","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9tYWluLmpzIEhUVFAvMS4xDQpIb3N0OiBsb2NhbGhvc3Q6MzAwMA0KDQo=","request_hash":"60a9a8c42824bc645f90f0ebb4af84cf01610882e3487125871d3b7b453726c3","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["application/javascript; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:32 GMT"],"Etag":["W/\"14cdab-19cc8900a68\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sat, 07 Mar 2026 13:50:09 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"application/javascript; charset=UTF-8","response_content_length":1363371,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoNCkNhY2hlLUNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0wDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjMyIEdNVA0KRXRhZzogVy8iMTRjZGFiLTE5Y2M4OTAwYTY4Ig0KRmVhdHVyZS1Qb2xpY3k6IHBheW1lbnQgJ3NlbGYnDQpLZWVwLUFsaXZlOiB0aW1lb3V0PTUNCkxhc3QtTW9kaWZpZWQ6IFNhdCwgMDcgTWFyIDIwMjYgMTM6NTA6MDkgR01UDQpBY2NlcHQtUmFuZ2VzOiBieXRlcw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PVVURi04DQpWYXJ5OiBBY2NlcHQtRW5jb2RpbmcNClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNClgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTg0KWC1SZWNydWl0aW5nOiAvIy9qb2JzDQoNCmltcG9ydHthIGFzIEFtfWZyb20iLi9jaHVuay0yNEVaTFo0SS5qcyI7aW1wb3J0e2EgYXMgQm0sYiBhcyBVbSxjIGFzIE4wLGQgYXMgQTYsZiBhcyBqbSxnIGFzIE9TfWZyb20iLi9jaHVuay1JMlBTRzQ3Mi5qcyI7aW1wb3J0eyQgYXMgYm0sJGEgYXMgTDEsJGIgYXMgUXQsQSBhcyB6UyxBYSBhcyBNNixBYiBhcyB3cixCIGFzIGIxLEJhIGFzIEJpLEJiIGFzIEosQyBhcyBtbSxDYSBhcyBBUyxDYiBhcyB6NixEIGFzIGhtLERhIGFzIFBuLERiIGFzIG10LEUgYXMgSWksRWEgYXMgVzEsRWIgYXMgdTIsRiBhcyBwbSxGYSBhcyBTbSxGYiBhcyBWbixHIGFzIFgxLEdhIGFzIGdhLEdiIGFzIF9hLEggYXMgeDAsSGEgYXMga20sSGIgYXMga2UsSSBhcyBUUyxJYSBhcyBEUyxJYiBhcyBlYSxKIGFzIEMxLEphIGFzIFQwLEpiIGFzIGcyLEsgYXMgX3IsS2EgYXMgUHQsS2IgYXMgUWEsTCBhcyBBMixMYSBhcyBmaSxMYiBhcyBlMSxNIGFzIE0wLE1hIGFzIHptLE1iIGFzIGJhLE4gYXMgZm0sTmEgYXMgWm8sTmIgYXMgU3IsTyBhcyB1bSxPYSBhcyBUbSxPYiBhcyBWbSxQIGFzIFFvLFBhIGFzIHc2LFBiIGFzIEQwLFEgYXMgdzAsUWEgYXMgUzYsUWIgYXMgSTAsUiBhcyBnbSxSYSBhcyB4aSxSYiBhcyBrcixTIGFzIHZtLFNhIGFzIHplLFNiIGFzIEwwLFQgYXMgR2EsVGEgYXMgeTEsVGIgYXMgTWksVSBhcyBFUyxVYSBhcyBDZSxVYiBhcyB6cixWIGFzIHMxLFZhIGFzIGdlLFZiIGFzIGF0LFcgYXMgWTIsV2EgYXMgdmUsV2IgYXMgenQsWCBhcyBiNixYYSBhcyB2YSxYYiBhcyBXZSxZIGFzIG4xLFlhIGFzIEUwLFliIGFzIE9tLFogYXMgX20sWmEgYXMgazYsWmIgYXMgSVMsXyBhcyBTMCxfYSBhcyB4cixfYiBhcyBodCxhIGFzIHVlLGFhIGFzIGswLGFiIGFzIEsyLGFjIGFzIGYxLGIgYXMgTnQsYmEgYXMgWjIsYmIgYXMgRTEsYmMgYXMgUDAsYyBhcyBaZCxjYSBhcyBDNixjYiBhcyBJMixjYyBhcyB2MixkIGFzIEl0LGRhIGFzIFlvLGRiIGFzIGwxLGRjIGFzIFQ2LGUgYXMgU2UsZWEgYXMgQ20sZWIgYXMgRW0sZWMgYXMgVjAsZiBhcyBLLGZhIGFzIEFuLGZiIGFzIHVpLGZjIGFzIFplLGcgYXMgWSxnYSBhcyBicixnYiBhcyBXYSxnYyBhcyBFNixoIGFzIFcsaGEgYXMgeTYsaGIgYXMgbGUsaGMgYXMgUWUsaSBhcyAkMSxpYSBhcyBEbixpYiBhcyBvZSxpYyBhcyBMUyxqIGFzIHkwLGphIGFzIGgyLGpiIGFzIG5lLGpjIGFzIEplLGsgYXMgeXQsa2EgYXMgJDIsa2IgYXMgcGUsa2MgYXMgSG0sbCBhcyBtMixsYSBhcyBYaSxsYiBhcyBYMixsYyBhcyBQUyxtIGFzIG9tLG1hIGFzIHowLG1iIGFzIHAyLG1jIGFzIE8wLG4gYXMgcDEsbmEgYXMgRDIsbmIgYXMgRG0sbmMgYXMgTm0sbyBhcyBMdCxvYSBhcyBxdCxvYiBhcyBJbSxvYyBhcyBSbSxwIGFzIEsxLHBhIGFzIHltLHBiIGFzIEEwLHBjIGFzIFZTLHEgYXMgamEscWEgYXMgQ3IscWIgYXMgZGUscWMgYXMgbnQsciBhcyBwYSxyYSBhcyBMaSxyYiBhcyBoZSxyYyBhcyAkZSxzIGFzIGNtLHNhIGFzIEluLHNiIGFzIEoyLHNjIGFzIGV0LHQgYXMgc20sdGEgYXMgeG0sdGIgYXMgTG0sdGMgYXMgSDAsdSBhcyBLaSx1YSBhcyBNbSx1YiBhcyBNcix1YyBhcyBGbSx2IGFzIGZhLHZhIGFzIExuLHZiIGFzIFZ0LHcgYXMgRW4sd2EgYXMgd20sd2IgYXMgSjEseCBhcyBsbSx4YSBhcyB5cix4YiBhcyBmMix5IGFzIGRtLHlhIGFzIHVhLHliIGFzIFBtLHogYXMgcWEsemEgYXMgeDYsemIgYXMgZ3R9ZnJvbSIuL2NodW5rLVRKTUUyMzUyLmpzIjtpbXBvcnR7JCBhcyBVdCwkYiBhcyBtLCRjIGFzIHZyLEEgYXMgS3QsQWEgYXMgSGUsQWIgYXMgYyxCIGFzICR0LEJhIGFzIGt0LEJiIGFzIHMsQ2IgYXMgdSxEIGFzIGosRGEgYXMgYWUsRGIgYXMgR3QsRGMgYXMgUWQsRWEgYXMgRTIsRWIgYXMgSnQsRWMgYXMgRWUsRiBhcyBUbixGYiBhcyBaaSxGYyBhcyB1cixHYiBhcyBfZSxHYyBhcyBZZCxIIGFzIGoxLEhhIGFzIHY2LEhiIGFzIGJlLEhjIGFzIFosSSBhcyBnNixJYiBhcyBfMSxJYyBhcyBvdCxKIGFzIEFkLEpiIGFzIEwsSyBhcyBEZCxLYiBhcyBBaSxMIGFzIElkLExhIGFzIHR0LExiIGFzIFMsTSBhcyBMZCxNYSBhcyB3dCxNYiBhcyBxZCxNYyBhcyBrLE5hIGFzIF82LE5iIGFzIHYsT2IgYXMgUmUsUGEgYXMgTmQsUGIgYXMgbWUsUWEgYXMgbCxRYiBhcyBCZSxRYyBhcyAkZCxSYSBhcyBSZCxSYiBhcyB0ZSxTYSBhcyBOLFNiIGFzIEYsU2MgYXMgZ3IsVGEgYXMgcmUsVGIgYXMgQixVIGFzIFBkLFVhIGFzIG0xLFVjIGFzIFQxLFYgYXMgaTEsVmEgYXMgaDEsVmMgYXMgQmEsVyBhcyBxMSxXYSBhcyBGZCxXYyBhcyAkaSxYIGFzIHh0LFhhIGFzIHYxLFhiIGFzIHNlLFhjIGFzIF8wLFkgYXMgVmQsWWEgYXMgaXQsWWIgYXMgX3QsWWMgYXMgYjAsWiBhcyBocixaYSBhcyB1MCxaYiBhcyBpZSxaYyBhcyBLZCxfIGFzIFh0LF9hIGFzIEcxLF9iIGFzIER0LF9jIGFzIEMwLGEgYXMgbzEsYWMgYXMgQSxhZCBhcyBVYSxiYSBhcyBoaSxiYyBhcyBFLGJkIGFzIFhkLGMgYXMgbWEsY2EgYXMgJCxjYiBhcyBELGNjIGFzIE8xLGNkIGFzIEpkLGRhIGFzIHllLGRiIGFzIHhlLGRjIGFzIEZhLGRkIGFzIERpLGViIGFzIFgsZWMgYXMgTmksZiBhcyB3ZSxmYSBhcyBjZSxmYiBhcyBnMCxmYyBhcyBSaSxnIGFzIGQyLGdhIGFzIEVpLGdiIGFzIEZlLGdjIGFzIEZpLGdkIGFzIGExLGggYXMgU2QsaGEgYXMgaCxoYiBhcyBCZCxoYyBhcyBWZSxoZCBhcyBlbSxpIGFzIGY2LGlhIGFzIE9kLGliIGFzIFIsaWMgYXMgVzIsaWQgYXMga1MsaiBhcyBIaSxqYiBhcyBwcixqYyBhcyBHZCxqZCBhcyB0bSxrIGFzIGtkLGtjIGFzIEllLGtkIGFzIGltLGwgYXMgYzEsbGEgYXMgeixsYyBhcyBTdCxsZCBhcyBBZSxtYSBhcyBULG1jIGFzIGJ0LG1kIGFzIGFtLG4gYXMgemQsbmEgYXMgTXQsbmMgYXMgejEsbmQgYXMgbm0sb2EgYXMgeWksb2MgYXMgdjAsb2QgYXMgcm0scCBhcyBrbixwYSBhcyBzdCxwYiBhcyBSYSxwYyBhcyBiLHBkIGFzIFd0LHEscWEgYXMganQscWIgYXMgRyxxYyBhcyBDLHIgYXMgSGEscmIgYXMgVWQscmMgYXMgZHQscmQgYXMgWjEscyBhcyB1NixzYiBhcyBNLHNjIGFzIFEyLHNkIGFzIGhhLHRiIGFzIGpkLHVhIGFzIEhkLHViIGFzIHcsdWMgYXMgV2QsdiBhcyBtcix2YSBhcyBmdCx2YiBhcyBmcix3IGFzIHpuLHdiIGFzIEZ0LHggYXMgTmEseGEgYXMgbHQseGIgYXMgcWUseSBhcyBUZCx5YSBhcyBwMCx5YiBhcyBHZSx5YyBhcyBwaSx6IGFzIEVkLHphIGFzIGYwLHpiIGFzIGZ9ZnJvbSIuL2NodW5rLUJCUUpaTjdILmpzIjtpbXBvcnR7YSBhcyBYZSxiIGFzIFUxLGQgYXMgd2QsZSBhcyB4LGYgYXMgVGUsaCBhcyBkcixqIGFzIFBlfWZyb20iLi9jaHVuay1UV1pXNUI0NS5qcyI7ZnVuY3Rpb24gWG8odCl7cmV0dXJuIHR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP1hvPWZ1bmN0aW9uKG4pe3JldHVybiB0eXBlb2Ygbn06WG89ZnVuY3Rpb24obil7cmV0dXJuIG4mJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJm4uY29uc3RydWN0b3I9PT1TeW1ib2wmJm4hPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBufSxYbyh0KX1mdW5jdGlvbiBIUyh0LG4pe2lmKCEodCBpbnN0YW5jZW9mIG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIHFtKHQsbil7Zm9yKHZhciBlPTA7ZTxuLmxlbmd0aDtlKyspe3ZhciBpPW5bZV07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gTlModCxuLGUpe3JldHVybiBuJiZxbSh0LnByb3RvdHlwZSxuKSxlJiZxbSh0LGUpLHR9ZnVuY3Rpb24gUlModCxuLGUpe3JldHVybiBuIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7dmFsdWU6ZSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbbl09ZSx0fWZ1bmN0aW9uIE90KHQpe2Zvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspe3ZhciBlPWFyZ3VtZW50c1tuXSE9bnVsbD9hcmd1bWVudHNbbl06e30saT1PYmplY3Qua2V5cyhlKTt0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz09ImZ1bmN0aW9uIiYmKGk9aS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxhKS5lbnVtZXJhYmxlfSkpKSxpLmZvckVhY2goZnVuY3Rpb24oYSl7UlModCxhLGVbYV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gajYodCxuKXtyZXR1cm4gQlModCl8fGpTKHQsbil8fEdTKCl9ZnVuY3Rpb24gcTYodCl7cmV0dXJuIEZTKHQpfHxVUyh0KXx8cVMoKX1mdW5jdGlvbiBGUyh0KXtpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIG49MCxlPW5ldyBBcnJheSh0Lmxlbmd0aCk7bjx0Lmxlbmd0aDtuKyspZVtuXT10W25dO3JldHVybiBlfX1mdW5jdGlvbiBCUyh0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0fWZ1bmN0aW9uIFVTKHQpe2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCl8fE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KT09PSJbb2JqZWN0IEFyZ3VtZW50c10iKXJldHVybiBBcnJheS5mcm9tKHQpfWZ1bmN0aW9uIGpTKHQsbil7dmFyIGU9W10saT0hMCxhPSExLHI9dm9pZCAwO3RyeXtmb3IodmFyIG89dFtTeW1ib2wuaXRlcmF0b3JdKCksZDshKGk9KGQ9by5uZXh0KCkpLmRvbmUpJiYoZS5wdXNoKGQudmFsdWUpLCEobiYmZS5sZW5ndGg9PT1uKSk7aT0hMCk7fWNhdGNoKHApe2E9ITAscj1wfWZpbmFsbHl7dHJ5eyFpJiZvLnJldHVybiE9bnVsbCYmby5yZXR1cm4oKX1maW5hbGx5e2lmKGEpdGhyb3cgcn19cmV0dXJuIGV9ZnVuY3Rpb24gcVMoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZSIpfWZ1bmN0aW9uIEdTKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZSIpfWZ1bmN0aW9uIHJrKHQpe3ZhciBuPUgxLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFsiK3QrIl0iKTtpZihuKXJldHVybiBuLmdldEF0dHJpYnV0ZSh0KX1mdW5jdGlvbiBvayh0KXtyZXR1cm4gdD09PSIiPyEwOnQ9PT0iZmFsc2UiPyExOnQ9PT0idHJ1ZSI/ITA6dH1mdW5jdGlvbiBsayh0KXtNYSYmKEIwP3NldFRpbWVvdXQodCwwKTp2OS5wdXNoKHQpKX1mdW5jdGlvbiBoaygpe2Zvcih2YXIgdD0wO3Q8JG8ubGVuZ3RoO3QrKykkb1t0XVswXSgkb1t0XVsxXSk7JG89W10sSDY9ITF9ZnVuY3Rpb24gcTAodCxuKXskby5wdXNoKFt0LG5dKSxINnx8KEg2PSEwLG1rKGhrLDApKX1mdW5jdGlvbiBwayh0LG4pe2Z1bmN0aW9uIGUoYSl7UTYobixhKX1mdW5jdGlvbiBpKGEpe0pvKG4sYSl9dHJ5e3QoZSxpKX1jYXRjaChhKXtpKGEpfX1mdW5jdGlvbiBDOSh0KXt2YXIgbj10Lm93bmVyLGU9bi5fc3RhdGUsaT1uLl9kYXRhLGE9dFtlXSxyPXQudGhlbjtpZih0eXBlb2YgYT09ImZ1bmN0aW9uIil7ZT1VMDt0cnl7aT1hKGkpfWNhdGNoKG8pe0pvKHIsbyl9fXk5KHIsaSl8fChlPT09VTAmJlE2KHIsaSksZT09PWowJiZKbyhyLGkpKX1mdW5jdGlvbiB5OSh0LG4pe3ZhciBlO3RyeXtpZih0PT09bil0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2VzIGNhbGxiYWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHByb21pc2UuIik7aWYobiYmKHR5cGVvZiBuPT0iZnVuY3Rpb24ifHxYbyhuKT09PSJvYmplY3QiKSl7dmFyIGk9bi50aGVuO2lmKHR5cGVvZiBpPT0iZnVuY3Rpb24iKXJldHVybiBpLmNhbGwobixmdW5jdGlvbihhKXtlfHwoZT0hMCxuPT09YT94OSh0LGEpOlE2KHQsYSkpfSxmdW5jdGlvbihhKXtlfHwoZT0hMCxKbyh0LGEpKX0pLCEwfX1jYXRjaChhKXtyZXR1cm4gZXx8Sm8odCxhKSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBRNih0LG4peyh0PT09bnx8IXk5KHQsbikpJiZ4OSh0LG4pfWZ1bmN0aW9uIHg5KHQsbil7dC5fc3RhdGU9PT1XNiYmKHQuX3N0YXRlPV85LHQuX2RhdGE9bixxMChmayx0KSl9ZnVuY3Rpb24gSm8odCxuKXt0Ll9zdGF0ZT09PVc2JiYodC5fc3RhdGU9XzksdC5fZGF0YT1uLHEwKHVrLHQpKX1mdW5jdGlvbiBNOSh0KXt0Ll90aGVuPXQuX3RoZW4uZm9yRWFjaChDOSl9ZnVuY3Rpb24gZmsodCl7dC5fc3RhdGU9VTAsTTkodCl9ZnVuY3Rpb24gdWsodCl7dC5fc3RhdGU9ajAsTTkodCksIXQuX2hhbmRsZWQmJmI5JiZnbG9iYWwucHJvY2Vzcy5lbWl0KCJ1bmhhbmRsZWRSZWplY3Rpb24iLHQuX2RhdGEsdCl9ZnVuY3Rpb24gZ2sodCl7Z2xvYmFsLnByb2Nlc3MuZW1pdCgicmVqZWN0aW9uSGFuZGxlZCIsdCl9ZnVuY3Rpb24gSmkodCl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvbWlzZSByZXNvbHZlciAiK3QrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2lmKCEodGhpcyBpbnN0YW5jZW9mIEppKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGYWlsZWQgdG8gY29uc3RydWN0ICdQcm9taXNlJzogUGxlYXNlIHVzZSB0aGUgJ25ldycgb3BlcmF0b3IsIHRoaXMgb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4iKTt0aGlzLl90aGVuPVtdLHBrKHQsdGhpcyl9ZnVuY3Rpb24gdmsodCl7cmV0dXJufm5rLmluZGV4T2YodCl9ZnVuY3Rpb24gdzkodCl7aWYoISghdHx8IU1hKSl7dmFyIG49SDEuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtuLnNldEF0dHJpYnV0ZSgidHlwZSIsInRleHQvY3NzIiksbi5pbm5lckhUTUw9dDtmb3IodmFyIGU9SDEuaGVhZC5jaGlsZE5vZGVzLGk9bnVsbCxhPWUubGVuZ3RoLTE7YT4tMTthLS0pe3ZhciByPWVbYV0sbz0oci50YWdOYW1lfHwiIikudG9VcHBlckNhc2UoKTtbIlNUWUxFIiwiTElOSyJdLmluZGV4T2Yobyk+LTEmJihpPXIpfXJldHVybiBIMS5oZWFkLmluc2VydEJlZm9yZShuLGkpLHR9fWZ1bmN0aW9uIGU0KCl7Zm9yKHZhciB0PTEyLG49IiI7dC0tID4wOyluKz1fa1tNYXRoLnJhbmRvbSgpKjYyfDBdO3JldHVybiBufWZ1bmN0aW9uIERyKHQpe2Zvcih2YXIgbj1bXSxlPSh0fHxbXSkubGVuZ3RoPj4+MDtlLS07KW5bZV09dFtlXTtyZXR1cm4gbn1mdW5jdGlvbiBZNih0KXtyZXR1cm4gdC5jbGFzc0xpc3Q/RHIodC5jbGFzc0xpc3QpOih0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpLnNwbGl0KCIgIikuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBufSl9ZnVuY3Rpb24gYmsodCxuKXt2YXIgZT1uLnNwbGl0KCItIiksaT1lWzBdLGE9ZS5zbGljZSgxKS5qb2luKCItIik7cmV0dXJuIGk9PT10JiZhIT09IiImJiF2ayhhKT9hOm51bGx9ZnVuY3Rpb24gUzkodCl7cmV0dXJuIiIuY29uY2F0KHQpLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpLnJlcGxhY2UoLycvZywiJiMzOTsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX1mdW5jdGlvbiBDayh0KXtyZXR1cm4gT2JqZWN0LmtleXModHx8e30pLnJlZHVjZShmdW5jdGlvbihuLGUpe3JldHVybiBuKyIiLmNvbmNhdChlLCc9IicpLmNvbmNhdChTOSh0W2VdKSwnIiAnKX0sIiIpLnRyaW0oKX1mdW5jdGlvbiBRMCh0KXtyZXR1cm4gT2JqZWN0LmtleXModHx8e30pLnJlZHVjZShmdW5jdGlvbihuLGUpe3JldHVybiBuKyIiLmNvbmNhdChlLCI6ICIpLmNvbmNhdCh0W2VdLCI7Iil9LCIiKX1mdW5jdGlvbiBaNih0KXtyZXR1cm4gdC5zaXplIT09Q2Euc2l6ZXx8dC54IT09Q2EueHx8dC55IT09Q2EueXx8dC5yb3RhdGUhPT1DYS5yb3RhdGV8fHQuZmxpcFh8fHQuZmxpcFl9ZnVuY3Rpb24gazkodCl7dmFyIG49dC50cmFuc2Zvcm0sZT10LmNvbnRhaW5lcldpZHRoLGk9dC5pY29uV2lkdGgsYT17dHJhbnNmb3JtOiJ0cmFuc2xhdGUoIi5jb25jYXQoZS8yLCIgMjU2KSIpfSxyPSJ0cmFuc2xhdGUoIi5jb25jYXQobi54KjMyLCIsICIpLmNvbmNhdChuLnkqMzIsIikgIiksbz0ic2NhbGUoIi5jb25jYXQobi5zaXplLzE2KihuLmZsaXBYPy0xOjEpLCIsICIpLmNvbmNhdChuLnNpemUvMTYqKG4uZmxpcFk/LTE6MSksIikgIiksZD0icm90YXRlKCIuY29uY2F0KG4ucm90YXRlLCIgMCAwKSIpLHA9e3RyYW5zZm9ybToiIi5jb25jYXQociwiICIpLmNvbmNhdChvLCIgIikuY29uY2F0KGQpfSxnPXt0cmFuc2Zvcm06InRyYW5zbGF0ZSgiLmNvbmNhdChpLzIqLTEsIiAtMjU2KSIpfTtyZXR1cm57b3V0ZXI6YSxpbm5lcjpwLHBhdGg6Z319ZnVuY3Rpb24geWsodCl7dmFyIG49dC50cmFuc2Zvcm0sZT10LndpZHRoLGk9ZT09PXZvaWQgMD9QNjplLGE9dC5oZWlnaHQscj1hPT09dm9pZCAwP1A2OmEsbz10LnN0YXJ0Q2VudGVyZWQsZD1vPT09dm9pZCAwPyExOm8scD0iIjtyZXR1cm4gZCYmZDk/cCs9InRyYW5zbGF0ZSgiLmNvbmNhdChuLngvWWEtaS8yLCJlbSwgIikuY29uY2F0KG4ueS9ZYS1yLzIsImVtKSAiKTpkP3ArPSJ0cmFuc2xhdGUoY2FsYygtNTAlICsgIi5jb25jYXQobi54L1lhLCJlbSksIGNhbGMoLTUwJSArICIpLmNvbmNhdChuLnkvWWEsImVtKSkgIik6cCs9InRyYW5zbGF0ZSgiLmNvbmNhdChuLngvWWEsImVtLCAiKS5jb25jYXQobi55L1lhLCJlbSkgIikscCs9InNjYWxlKCIuY29uY2F0KG4uc2l6ZS9ZYSoobi5mbGlwWD8tMToxKSwiLCAiKS5jb25jYXQobi5zaXplL1lhKihuLmZsaXBZPy0xOjEpLCIpICIpLHArPSJyb3RhdGUoIi5jb25jYXQobi5yb3RhdGUsImRlZykgIikscH1mdW5jdGlvbiBLbSh0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITA7cmV0dXJuIHQuYXR0cmlidXRlcyYmKHQuYXR0cmlidXRlcy5maWxsfHxuKSYmKHQuYXR0cmlidXRlcy5maWxsPSJibGFjayIpLHR9ZnVuY3Rpb24geGsodCl7cmV0dXJuIHQudGFnPT09ImciP3QuY2hpbGRyZW46W3RdfWZ1bmN0aW9uIE1rKHQpe3ZhciBuPXQuY2hpbGRyZW4sZT10LmF0dHJpYnV0ZXMsaT10Lm1haW4sYT10Lm1hc2sscj10Lm1hc2tJZCxvPXQudHJhbnNmb3JtLGQ9aS53aWR0aCxwPWkuaWNvbixnPWEud2lkdGgsXz1hLmljb24seT1rOSh7dHJhbnNmb3JtOm8sY29udGFpbmVyV2lkdGg6ZyxpY29uV2lkdGg6ZH0pLEk9e3RhZzoicmVjdCIsYXR0cmlidXRlczpPdCh7fSxENix7ZmlsbDoid2hpdGUifSl9LFA9cC5jaGlsZHJlbj97Y2hpbGRyZW46cC5jaGlsZHJlbi5tYXAoS20pfTp7fSxWPXt0YWc6ImciLGF0dHJpYnV0ZXM6T3Qoe30seS5pbm5lciksY2hpbGRyZW46W0ttKE90KHt0YWc6cC50YWcsYXR0cmlidXRlczpPdCh7fSxwLmF0dHJpYnV0ZXMseS5wYXRoKX0sUCkpXX0sTz17dGFnOiJnIixhdHRyaWJ1dGVzOk90KHt9LHkub3V0ZXIpLGNoaWxkcmVuOltWXX0sVT0ibWFzay0iLmNvbmNhdChyfHxlNCgpKSxRPSJjbGlwLSIuY29uY2F0KHJ8fGU0KCkpLGZlPXt0YWc6Im1hc2siLGF0dHJpYnV0ZXM6T3Qoe30sRDYse2lkOlUsbWFza1VuaXRzOiJ1c2VyU3BhY2VPblVzZSIsbWFza0NvbnRlbnRVbml0czoidXNlclNwYWNlT25Vc2UifSksY2hpbGRyZW46W0ksT119LE9lPXt0YWc6ImRlZnMiLGNoaWxkcmVuOlt7dGFnOiJjbGlwUGF0aCIsYXR0cmlidXRlczp7aWQ6UX0sY2hpbGRyZW46eGsoXyl9LGZlXX07cmV0dXJuIG4ucHVzaChPZSx7dGFnOiJyZWN0IixhdHRyaWJ1dGVzOk90KHtmaWxsOiJjdXJyZW50Q29sb3IiLCJjbGlwLXBhdGgiOiJ1cmwoIyIuY29uY2F0KFEsIikiKSxtYXNrOiJ1cmwoIyIuY29uY2F0KFUsIikiKX0sRDYpfSkse2NoaWxkcmVuOm4sYXR0cmlidXRlczplfX1mdW5jdGlvbiB3ayh0KXt2YXIgbj10LmNoaWxkcmVuLGU9dC5hdHRyaWJ1dGVzLGk9dC5tYWluLGE9dC50cmFuc2Zvcm0scj10LnN0eWxlcyxvPVEwKHIpO2lmKG8ubGVuZ3RoPjAmJihlLnN0eWxlPW8pLFo2KGEpKXt2YXIgZD1rOSh7dHJhbnNmb3JtOmEsY29udGFpbmVyV2lkdGg6aS53aWR0aCxpY29uV2lkdGg6aS53aWR0aH0pO24ucHVzaCh7dGFnOiJnIixhdHRyaWJ1dGVzOk90KHt9LGQub3V0ZXIpLGNoaWxkcmVuOlt7dGFnOiJnIixhdHRyaWJ1dGVzOk90KHt9LGQuaW5uZXIpLGNoaWxkcmVuOlt7dGFnOmkuaWNvbi50YWcsY2hpbGRyZW46aS5pY29uLmNoaWxkcmVuLGF0dHJpYnV0ZXM6T3Qoe30saS5pY29uLmF0dHJpYnV0ZXMsZC5wYXRoKX1dfV19KX1lbHNlIG4ucHVzaChpLmljb24pO3JldHVybntjaGlsZHJlbjpuLGF0dHJpYnV0ZXM6ZX19ZnVuY3Rpb24gU2sodCl7dmFyIG49dC5jaGlsZHJlbixlPXQubWFpbixpPXQubWFzayxhPXQuYXR0cmlidXRlcyxyPXQuc3R5bGVzLG89dC50cmFuc2Zvcm07aWYoWjYobykmJmUuZm91bmQmJiFpLmZvdW5kKXt2YXIgZD1lLndpZHRoLHA9ZS5oZWlnaHQsZz17eDpkL3AvMix5Oi41fTthLnN0eWxlPVEwKE90KHt9LHIseyJ0cmFuc2Zvcm0tb3JpZ2luIjoiIi5jb25jYXQoZy54K28ueC8xNiwiZW0gIikuY29uY2F0KGcueStvLnkvMTYsImVtIil9KSl9cmV0dXJuW3t0YWc6InN2ZyIsYXR0cmlidXRlczphLGNoaWxkcmVuOm59XX1mdW5jdGlvbiBrayh0KXt2YXIgbj10LnByZWZpeCxlPXQuaWNvbk5hbWUsaT10LmNoaWxkcmVuLGE9dC5hdHRyaWJ1dGVzLHI9dC5zeW1ib2wsbz1yPT09ITA/IiIuY29uY2F0KG4sIi0iKS5jb25jYXQodXQuZmFtaWx5UHJlZml4LCItIikuY29uY2F0KGUpOnI7cmV0dXJuW3t0YWc6InN2ZyIsYXR0cmlidXRlczp7c3R5bGU6ImRpc3BsYXk6IG5vbmU7In0sY2hpbGRyZW46W3t0YWc6InN5bWJvbCIsYXR0cmlidXRlczpPdCh7fSxhLHtpZDpvfSksY2hpbGRyZW46aX1dfV19ZnVuY3Rpb24gJDYodCl7dmFyIG49dC5pY29ucyxlPW4ubWFpbixpPW4ubWFzayxhPXQucHJlZml4LHI9dC5pY29uTmFtZSxvPXQudHJhbnNmb3JtLGQ9dC5zeW1ib2wscD10LnRpdGxlLGc9dC5tYXNrSWQsXz10LnRpdGxlSWQseT10LmV4dHJhLEk9dC53YXRjaGFibGUsUD1JPT09dm9pZCAwPyExOkksVj1pLmZvdW5kP2k6ZSxPPVYud2lkdGgsVT1WLmhlaWdodCxRPWE9PT0iZmFrIixmZT1RPyIiOiJmYS13LSIuY29uY2F0KE1hdGguY2VpbChPL1UqMTYpKSxPZT1bdXQucmVwbGFjZW1lbnRDbGFzcyxyPyIiLmNvbmNhdCh1dC5mYW1pbHlQcmVmaXgsIi0iKS5jb25jYXQocik6IiIsZmVdLmZpbHRlcihmdW5jdGlvbihUMil7cmV0dXJuIHkuY2xhc3Nlcy5pbmRleE9mKFQyKT09PS0xfSkuZmlsdGVyKGZ1bmN0aW9uKFQyKXtyZXR1cm4gVDIhPT0iInx8ISFUMn0pLmNvbmNhdCh5LmNsYXNzZXMpLmpvaW4oIiAiKSxNZT17Y2hpbGRyZW46W10sYXR0cmlidXRlczpPdCh7fSx5LmF0dHJpYnV0ZXMseyJkYXRhLXByZWZpeCI6YSwiZGF0YS1pY29uIjpyLGNsYXNzOk9lLHJvbGU6eS5hdHRyaWJ1dGVzLnJvbGV8fCJpbWciLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwICIuY29uY2F0KE8sIiAiKS5jb25jYXQoVSl9KX0scnQ9USYmIX55LmNsYXNzZXMuaW5kZXhPZigiZmEtZnciKT97d2lkdGg6IiIuY29uY2F0KE8vVSoxNiouMDYyNSwiZW0iKX06e307UCYmKE1lLmF0dHJpYnV0ZXNbVHJdPSIiKSxwJiZNZS5jaGlsZHJlbi5wdXNoKHt0YWc6InRpdGxlIixhdHRyaWJ1dGVzOntpZDpNZS5hdHRyaWJ1dGVzWyJhcmlhLWxhYmVsbGVkYnkiXXx8InRpdGxlLSIuY29uY2F0KF98fGU0KCkpfSxjaGlsZHJlbjpbcF19KTt2YXIgTmU9T3Qoe30sTWUse3ByZWZpeDphLGljb25OYW1lOnIsbWFpbjplLG1hc2s6aSxtYXNrSWQ6Zyx0cmFuc2Zvcm06byxzeW1ib2w6ZCxzdHlsZXM6T3Qoe30scnQseS5zdHlsZXMpfSksWWU9aS5mb3VuZCYmZS5mb3VuZD9NayhOZSk6d2soTmUpLHZ0PVllLmNoaWxkcmVuLE0xPVllLmF0dHJpYnV0ZXM7cmV0dXJuIE5lLmNoaWxkcmVuPXZ0LE5lLmF0dHJpYnV0ZXM9TTEsZD9rayhOZSk6U2soTmUpfWZ1bmN0aW9uIHo5KHQpe3ZhciBuPXQuY29udGVudCxlPXQud2lkdGgsaT10LmhlaWdodCxhPXQudHJhbnNmb3JtLHI9dC50aXRsZSxvPXQuZXh0cmEsZD10LndhdGNoYWJsZSxwPWQ9PT12b2lkIDA/ITE6ZCxnPU90KHt9LG8uYXR0cmlidXRlcyxyP3t0aXRsZTpyfTp7fSx7Y2xhc3M6by5jbGFzc2VzLmpvaW4oIiAiKX0pO3AmJihnW1RyXT0iIik7dmFyIF89T3Qoe30sby5zdHlsZXMpO1o2KGEpJiYoXy50cmFuc2Zvcm09eWsoe3RyYW5zZm9ybTphLHN0YXJ0Q2VudGVyZWQ6ITAsd2lkdGg6ZSxoZWlnaHQ6aX0pLF9bIi13ZWJraXQtdHJhbnNmb3JtIl09Xy50cmFuc2Zvcm0pO3ZhciB5PVEwKF8pO3kubGVuZ3RoPjAmJihnLnN0eWxlPXkpO3ZhciBJPVtdO3JldHVybiBJLnB1c2goe3RhZzoic3BhbiIsYXR0cmlidXRlczpnLGNoaWxkcmVuOltuXX0pLHImJkkucHVzaCh7dGFnOiJzcGFuIixhdHRyaWJ1dGVzOntjbGFzczoic3Itb25seSJ9LGNoaWxkcmVuOltyXX0pLEl9ZnVuY3Rpb24gemsodCl7dmFyIG49dC5jb250ZW50LGU9dC50aXRsZSxpPXQuZXh0cmEsYT1PdCh7fSxpLmF0dHJpYnV0ZXMsZT97dGl0bGU6ZX06e30se2NsYXNzOmkuY2xhc3Nlcy5qb2luKCIgIil9KSxyPVEwKGkuc3R5bGVzKTtyLmxlbmd0aD4wJiYoYS5zdHlsZT1yKTt2YXIgbz1bXTtyZXR1cm4gby5wdXNoKHt0YWc6InNwYW4iLGF0dHJpYnV0ZXM6YSxjaGlsZHJlbjpbbl19KSxlJiZvLnB1c2goe3RhZzoic3BhbiIsYXR0cmlidXRlczp7Y2xhc3M6InNyLW9ubHkifSxjaGlsZHJlbjpbZV19KSxvfWZ1bmN0aW9uIEU5KHQpe2Zvcih2YXIgbj0iIixlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBpPXQuY2hhckNvZGVBdChlKS50b1N0cmluZygxNik7bis9KCIwMDAiK2kpLnNsaWNlKC00KX1yZXR1cm4gbn1mdW5jdGlvbiBBOSh0LG4pe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MiYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTp7fSxpPWUuc2tpcEhvb2tzLGE9aT09PXZvaWQgMD8hMTppLHI9T2JqZWN0LmtleXMobikucmVkdWNlKGZ1bmN0aW9uKG8sZCl7dmFyIHA9bltkXSxnPSEhcC5pY29uO3JldHVybiBnP29bcC5pY29uTmFtZV09cC5pY29uOm9bZF09cCxvfSx7fSk7dHlwZW9mIEwyLmhvb2tzLmFkZFBhY2s9PSJmdW5jdGlvbiImJiFhP0wyLmhvb2tzLmFkZFBhY2sodCxyKTpMMi5zdHlsZXNbdF09T3Qoe30sTDIuc3R5bGVzW3RdfHx7fSxyKSx0PT09ImZhcyImJkE5KCJmYSIsbil9ZnVuY3Rpb24gVjkodCxuKXtyZXR1cm4oRDlbdF18fHt9KVtuXX1mdW5jdGlvbiBEayh0LG4pe3JldHVybihJOVt0XXx8e30pW25dfWZ1bmN0aW9uIElrKHQpe3JldHVybiBMOVt0XXx8e3ByZWZpeDpudWxsLGljb25OYW1lOm51bGx9fWZ1bmN0aW9uIEo2KHQpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbihuLGUpe3ZhciBpPWJrKHV0LmZhbWlseVByZWZpeCxlKTtpZihMa1tlXSluLnByZWZpeD1lO2Vsc2UgaWYodXQuYXV0b0ZldGNoU3ZnJiZPYmplY3Qua2V5cyhwOSkuaW5kZXhPZihlKT4tMSluLnByZWZpeD1lO2Vsc2UgaWYoaSl7dmFyIGE9bi5wcmVmaXg9PT0iZmEiP0lrKGkpOnt9O24uaWNvbk5hbWU9YS5pY29uTmFtZXx8aSxuLnByZWZpeD1hLnByZWZpeHx8bi5wcmVmaXh9ZWxzZSBlIT09dXQucmVwbGFjZW1lbnRDbGFzcyYmZS5pbmRleE9mKCJmYS13LSIpIT09MCYmbi5yZXN0LnB1c2goZSk7cmV0dXJuIG59LFg2KCkpfWZ1bmN0aW9uIGU5KHQsbixlKXtpZih0JiZ0W25dJiZ0W25dW2VdKXJldHVybntwcmVmaXg6bixpY29uTmFtZTplLGljb246dFtuXVtlXX19ZnVuY3Rpb24gRXIodCl7dmFyIG49dC50YWcsZT10LmF0dHJpYnV0ZXMsaT1lPT09dm9pZCAwP3t9OmUsYT10LmNoaWxkcmVuLHI9YT09PXZvaWQgMD9bXTphO3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/UzkodCk6IjwiLmNvbmNhdChuLCIgIikuY29uY2F0KENrKGkpLCI+IikuY29uY2F0KHIubWFwKEVyKS5qb2luKCIiKSwiPC8iKS5jb25jYXQobiwiPiIpfWZ1bmN0aW9uIHQ5KHQpe3ZhciBuPXQuZ2V0QXR0cmlidXRlP3QuZ2V0QXR0cmlidXRlKFRyKTpudWxsO3JldHVybiB0eXBlb2Ygbj09InN0cmluZyJ9ZnVuY3Rpb24gVmsoKXtpZih1dC5hdXRvUmVwbGFjZVN2Zz09PSEwKXJldHVybiBGMC5yZXBsYWNlO3ZhciB0PUYwW3V0LmF1dG9SZXBsYWNlU3ZnXTtyZXR1cm4gdHx8RjAucmVwbGFjZX1mdW5jdGlvbiBpOSh0KXt0KCl9ZnVuY3Rpb24gTzkodCxuKXt2YXIgZT10eXBlb2Ygbj09ImZ1bmN0aW9uIj9uOlBrO2lmKHQubGVuZ3RoPT09MCllKCk7ZWxzZXt2YXIgaT1pOTt1dC5tdXRhdGVBcHByb2FjaD09PSRTJiYoaT1Bci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGk5KSxpKGZ1bmN0aW9uKCl7dmFyIGE9VmsoKSxyPUs2LmJlZ2luKCJtdXRhdGUiKTt0Lm1hcChhKSxyKCksZSgpfSl9fWZ1bmN0aW9uIE9rKCl7ZWw9ITB9ZnVuY3Rpb24gYTkoKXtlbD0hMX1mdW5jdGlvbiBIayh0KXtpZihZbSYmdXQub2JzZXJ2ZU11dGF0aW9ucyl7dmFyIG49dC50cmVlQ2FsbGJhY2ssZT10Lm5vZGVDYWxsYmFjayxpPXQucHNldWRvRWxlbWVudHNDYWxsYmFjayxhPXQub2JzZXJ2ZU11dGF0aW9uc1Jvb3Qscj1hPT09dm9pZCAwP0gxOmE7RzA9bmV3IFltKGZ1bmN0aW9uKG8pe2VsfHxEcihvKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2lmKGQudHlwZT09PSJjaGlsZExpc3QiJiZkLmFkZGVkTm9kZXMubGVuZ3RoPjAmJiF0OShkLmFkZGVkTm9kZXNbMF0pJiYodXQuc2VhcmNoUHNldWRvRWxlbWVudHMmJmkoZC50YXJnZXQpLG4oZC50YXJnZXQpKSxkLnR5cGU9PT0iYXR0cmlidXRlcyImJmQudGFyZ2V0LnBhcmVudE5vZGUmJnV0LnNlYXJjaFBzZXVkb0VsZW1lbnRzJiZpKGQudGFyZ2V0LnBhcmVudE5vZGUpLGQudHlwZT09PSJhdHRyaWJ1dGVzIiYmdDkoZC50YXJnZXQpJiZ+YWsuaW5kZXhPZihkLmF0dHJpYnV0ZU5hbWUpKWlmKGQuYXR0cmlidXRlTmFtZT09PSJjbGFzcyIpe3ZhciBwPUo2KFk2KGQudGFyZ2V0KSksZz1wLnByZWZpeCxfPXAuaWNvbk5hbWU7ZyYmZC50YXJnZXQuc2V0QXR0cmlidXRlKCJkYXRhLXByZWZpeCIsZyksXyYmZC50YXJnZXQuc2V0QXR0cmlidXRlKCJkYXRhLWljb24iLF8pfWVsc2UgZShkLnRhcmdldCl9KX0pLE1hJiZHMC5vYnNlcnZlKHIse2NoaWxkTGlzdDohMCxhdHRyaWJ1dGVzOiEwLGNoYXJhY3RlckRhdGE6ITAsc3VidHJlZTohMH0pfX1mdW5jdGlvbiBOaygpe0cwJiZHMC5kaXNjb25uZWN0KCl9ZnVuY3Rpb24gUmsodCl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoInN0eWxlIiksZT1bXTtyZXR1cm4gbiYmKGU9bi5zcGxpdCgiOyIpLnJlZHVjZShmdW5jdGlvbihpLGEpe3ZhciByPWEuc3BsaXQoIjoiKSxvPXJbMF0sZD1yLnNsaWNlKDEpO3JldHVybiBvJiZkLmxlbmd0aD4wJiYoaVtvXT1kLmpvaW4oIjoiKS50cmltKCkpLGl9LHt9KSksZX1mdW5jdGlvbiBGayh0KXt2YXIgbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1wcmVmaXgiKSxlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWljb24iKSxpPXQuaW5uZXJUZXh0IT09dm9pZCAwP3QuaW5uZXJUZXh0LnRyaW0oKToiIixhPUo2KFk2KHQpKTtyZXR1cm4gbiYmZSYmKGEucHJlZml4PW4sYS5pY29uTmFtZT1lKSxhLnByZWZpeCYmaS5sZW5ndGg+MT9hLmljb25OYW1lPURrKGEucHJlZml4LHQuaW5uZXJUZXh0KTphLnByZWZpeCYmaS5sZW5ndGg9PT0xJiYoYS5pY29uTmFtZT1WOShhLnByZWZpeCxFOSh0LmlubmVyVGV4dCkpKSxhfWZ1bmN0aW9uIEJrKHQpe3JldHVybiBIOSh0LmdldEF0dHJpYnV0ZSgiZGF0YS1mYS10cmFuc2Zvcm0iKSl9ZnVuY3Rpb24gVWsodCl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtZmEtc3ltYm9sIik7cmV0dXJuIG49PT1udWxsPyExOm49PT0iIj8hMDpufWZ1bmN0aW9uIGprKHQpe3ZhciBuPURyKHQuYXR0cmlidXRlcykucmVkdWNlKGZ1bmN0aW9uKGEscil7cmV0dXJuIGEubmFtZSE9PSJjbGFzcyImJmEubmFtZSE9PSJzdHlsZSImJihhW3IubmFtZV09ci52YWx1ZSksYX0se30pLGU9dC5nZXRBdHRyaWJ1dGUoInRpdGxlIiksaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1mYS10aXRsZS1pZCIpO3JldHVybiB1dC5hdXRvQTExeSYmKGU/blsiYXJpYS1sYWJlbGxlZGJ5Il09IiIuY29uY2F0KHV0LnJlcGxhY2VtZW50Q2xhc3MsIi10aXRsZS0iKS5jb25jYXQoaXx8ZTQoKSk6KG5bImFyaWEtaGlkZGVuIl09InRydWUiLG4uZm9jdXNhYmxlPSJmYWxzZSIpKSxufWZ1bmN0aW9uIHFrKHQpe3ZhciBuPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWZhLW1hc2siKTtyZXR1cm4gbj9KNihuLnNwbGl0KCIgIikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0oKX0pKTpYNigpfWZ1bmN0aW9uIEdrKCl7cmV0dXJue2ljb25OYW1lOm51bGwsdGl0bGU6bnVsbCx0aXRsZUlkOm51bGwscHJlZml4Om51bGwsdHJhbnNmb3JtOkNhLHN5bWJvbDohMSxtYXNrOm51bGwsbWFza0lkOm51bGwsZXh0cmE6e2NsYXNzZXM6W10sc3R5bGVzOnt9LGF0dHJpYnV0ZXM6e319fX1mdW5jdGlvbiBXayh0KXt2YXIgbj1Gayh0KSxlPW4uaWNvbk5hbWUsaT1uLnByZWZpeCxhPW4ucmVzdCxyPVJrKHQpLG89QmsodCksZD1Vayh0KSxwPWprKHQpLGc9cWsodCk7cmV0dXJue2ljb25OYW1lOmUsdGl0bGU6dC5nZXRBdHRyaWJ1dGUoInRpdGxlIiksdGl0bGVJZDp0LmdldEF0dHJpYnV0ZSgiZGF0YS1mYS10aXRsZS1pZCIpLHByZWZpeDppLHRyYW5zZm9ybTpvLHN5bWJvbDpkLG1hc2s6ZyxtYXNrSWQ6dC5nZXRBdHRyaWJ1dGUoImRhdGEtZmEtbWFzay1pZCIpLGV4dHJhOntjbGFzc2VzOmEsc3R5bGVzOnIsYXR0cmlidXRlczpwfX19ZnVuY3Rpb24gdDQodCl7dGhpcy5uYW1lPSJNaXNzaW5nSWNvbiIsdGhpcy5tZXNzYWdlPXR8fCJJY29uIHVuYXZhaWxhYmxlIix0aGlzLnN0YWNrPW5ldyBFcnJvcigpLnN0YWNrfWZ1bmN0aW9uIFI2KHQpe3ZhciBuPXRbMF0sZT10WzFdLGk9dC5zbGljZSg0KSxhPWo2KGksMSkscj1hWzBdLG89bnVsbDtyZXR1cm4gQXJyYXkuaXNBcnJheShyKT9vPXt0YWc6ImciLGF0dHJpYnV0ZXM6e2NsYXNzOiIiLmNvbmNhdCh1dC5mYW1pbHlQcmVmaXgsIi0iKS5jb25jYXQoT24uR1JPVVApfSxjaGlsZHJlbjpbe3RhZzoicGF0aCIsYXR0cmlidXRlczp7Y2xhc3M6IiIuY29uY2F0KHV0LmZhbWlseVByZWZpeCwiLSIpLmNvbmNhdChPbi5TRUNPTkRBUlkpLGZpbGw6ImN1cnJlbnRDb2xvciIsZDpyWzBdfX0se3RhZzoicGF0aCIsYXR0cmlidXRlczp7Y2xhc3M6IiIuY29uY2F0KHV0LmZhbWlseVByZWZpeCwiLSIpLmNvbmNhdChPbi5QUklNQVJZKSxmaWxsOiJjdXJyZW50Q29sb3IiLGQ6clsxXX19XX06bz17dGFnOiJwYXRoIixhdHRyaWJ1dGVzOntmaWxsOiJjdXJyZW50Q29sb3IiLGQ6cn19LHtmb3VuZDohMCx3aWR0aDpuLGhlaWdodDplLGljb246b319ZnVuY3Rpb24gRjYodCxuKXtyZXR1cm4gbmV3IFAyKGZ1bmN0aW9uKGUsaSl7dmFyIGE9e2ZvdW5kOiExLHdpZHRoOjUxMixoZWlnaHQ6NTEyLGljb246S2t9O2lmKHQmJm4mJkw2W25dJiZMNltuXVt0XSl7dmFyIHI9TDZbbl1bdF07cmV0dXJuIGUoUjYocikpfXQmJm4mJiF1dC5zaG93TWlzc2luZ0ljb25zP2kobmV3IHQ0KCJJY29uIGlzIG1pc3NpbmcgZm9yIHByZWZpeCAiLmNvbmNhdChuLCIgd2l0aCBpY29uIG5hbWUgIikuY29uY2F0KHQpKSk6ZShhKX0pfWZ1bmN0aW9uIEprKHQsbil7dmFyIGU9bi5pY29uTmFtZSxpPW4udGl0bGUsYT1uLnRpdGxlSWQscj1uLnByZWZpeCxvPW4udHJhbnNmb3JtLGQ9bi5zeW1ib2wscD1uLm1hc2ssZz1uLm1hc2tJZCxfPW4uZXh0cmE7cmV0dXJuIG5ldyBQMihmdW5jdGlvbih5LEkpe1AyLmFsbChbRjYoZSxyKSxGNihwLmljb25OYW1lLHAucHJlZml4KV0pLnRoZW4oZnVuY3Rpb24oUCl7dmFyIFY9ajYoUCwyKSxPPVZbMF0sVT1WWzFdO3koW3QsJDYoe2ljb25zOnttYWluOk8sbWFzazpVfSxwcmVmaXg6cixpY29uTmFtZTplLHRyYW5zZm9ybTpvLHN5bWJvbDpkLG1hc2s6VSxtYXNrSWQ6Zyx0aXRsZTppLHRpdGxlSWQ6YSxleHRyYTpfLHdhdGNoYWJsZTohMH0pXSl9KX0pfWZ1bmN0aW9uIGV6KHQsbil7dmFyIGU9bi50aXRsZSxpPW4udHJhbnNmb3JtLGE9bi5leHRyYSxyPW51bGwsbz1udWxsO2lmKGQ5KXt2YXIgZD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHQpLmZvbnRTaXplLDEwKSxwPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cj1wLndpZHRoL2Qsbz1wLmhlaWdodC9kfXJldHVybiB1dC5hdXRvQTExeSYmIWUmJihhLmF0dHJpYnV0ZXNbImFyaWEtaGlkZGVuIl09InRydWUiKSxQMi5yZXNvbHZlKFt0LHo5KHtjb250ZW50OnQuaW5uZXJIVE1MLHdpZHRoOnIsaGVpZ2h0Om8sdHJhbnNmb3JtOmksdGl0bGU6ZSxleHRyYTphLHdhdGNoYWJsZTohMH0pXSl9ZnVuY3Rpb24gUjkodCl7dmFyIG49V2sodCk7cmV0dXJufm4uZXh0cmEuY2xhc3Nlcy5pbmRleE9mKGY5KT9leih0LG4pOkprKHQsbil9ZnVuY3Rpb24gbjkodCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGw7aWYoTWEpe3ZhciBlPUgxLmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QsaT1mdW5jdGlvbih5KXtyZXR1cm4gZS5hZGQoIiIuY29uY2F0KFptLCItIikuY29uY2F0KHkpKX0sYT1mdW5jdGlvbih5KXtyZXR1cm4gZS5yZW1vdmUoIiIuY29uY2F0KFptLCItIikuY29uY2F0KHkpKX0scj11dC5hdXRvRmV0Y2hTdmc/T2JqZWN0LmtleXMocDkpOk9iamVjdC5rZXlzKFhrKSxvPVsiLiIuY29uY2F0KGY5LCI6bm90KFsiKS5jb25jYXQoVHIsIl0pIildLmNvbmNhdChyLm1hcChmdW5jdGlvbihfKXtyZXR1cm4iLiIuY29uY2F0KF8sIjpub3QoWyIpLmNvbmNhdChUciwiXSkiKX0pKS5qb2luKCIsICIpO2lmKG8ubGVuZ3RoIT09MCl7dmFyIGQ9W107dHJ5e2Q9RHIodC5xdWVyeVNlbGVjdG9yQWxsKG8pKX1jYXRjaHt9aWYoZC5sZW5ndGg+MClpKCJwZW5kaW5nIiksYSgiY29tcGxldGUiKTtlbHNlIHJldHVybjt2YXIgcD1LNi5iZWdpbigib25UcmVlIiksZz1kLnJlZHVjZShmdW5jdGlvbihfLHkpe3RyeXt2YXIgST1SOSh5KTtJJiZfLnB1c2goSSl9Y2F0Y2goUCl7WFN8fFAgaW5zdGFuY2VvZiB0NCYmY29uc29sZS5lcnJvcihQKX1yZXR1cm4gX30sW10pO3JldHVybiBuZXcgUDIoZnVuY3Rpb24oXyx5KXtQMi5hbGwoZykudGhlbihmdW5jdGlvbihJKXtPOShJLGZ1bmN0aW9uKCl7aSgiYWN0aXZlIiksaSgiY29tcGxldGUiKSxhKCJwZW5kaW5nIiksdHlwZW9mIG49PSJmdW5jdGlvbiImJm4oKSxwKCksXygpfSl9KS5jYXRjaChmdW5jdGlvbigpe3AoKSx5KCl9KX0pfX19ZnVuY3Rpb24gdHoodCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOm51bGw7UjkodCkudGhlbihmdW5jdGlvbihlKXtlJiZPOShbZV0sbil9KX1mdW5jdGlvbiByOSh0LG4pe3ZhciBlPSIiLmNvbmNhdChRUykuY29uY2F0KG4ucmVwbGFjZSgiOiIsIi0iKSk7cmV0dXJuIG5ldyBQMihmdW5jdGlvbihpLGEpe2lmKHQuZ2V0QXR0cmlidXRlKGUpIT09bnVsbClyZXR1cm4gaSgpO3ZhciByPURyKHQuY2hpbGRyZW4pLG89ci5maWx0ZXIoZnVuY3Rpb24oZmUpe3JldHVybiBmZS5nZXRBdHRyaWJ1dGUoVjYpPT09bn0pWzBdLGQ9QXIuZ2V0Q29tcHV0ZWRTdHlsZSh0LG4pLHA9ZC5nZXRQcm9wZXJ0eVZhbHVlKCJmb250LWZhbWlseSIpLm1hdGNoKGVrKSxnPWQuZ2V0UHJvcGVydHlWYWx1ZSgiZm9udC13ZWlnaHQiKSxfPWQuZ2V0UHJvcGVydHlWYWx1ZSgiY29udGVudCIpO2lmKG8mJiFwKXJldHVybiB0LnJlbW92ZUNoaWxkKG8pLGkoKTtpZihwJiZfIT09Im5vbmUiJiZfIT09IiIpe3ZhciB5PWQuZ2V0UHJvcGVydHlWYWx1ZSgiY29udGVudCIpLEk9flsiU29saWQiLCJSZWd1bGFyIiwiTGlnaHQiLCJEdW90b25lIiwiQnJhbmRzIiwiS2l0Il0uaW5kZXhPZihwWzJdKT9KU1twWzJdLnRvTG93ZXJDYXNlKCldOnRrW2ddLFA9RTkoeS5sZW5ndGg9PT0zP3kuc3Vic3RyKDEsMSk6eSksVj1WOShJLFApLE89VjtpZihWJiYoIW98fG8uZ2V0QXR0cmlidXRlKFlTKSE9PUl8fG8uZ2V0QXR0cmlidXRlKFpTKSE9PU8pKXt0LnNldEF0dHJpYnV0ZShlLE8pLG8mJnQucmVtb3ZlQ2hpbGQobyk7dmFyIFU9R2soKSxRPVUuZXh0cmE7US5hdHRyaWJ1dGVzW1Y2XT1uLEY2KFYsSSkudGhlbihmdW5jdGlvbihmZSl7dmFyIE9lPSQ2KE90KHt9LFUse2ljb25zOnttYWluOmZlLG1hc2s6WDYoKX0scHJlZml4OkksaWNvbk5hbWU6TyxleHRyYTpRLHdhdGNoYWJsZTohMH0pKSxNZT1IMS5jcmVhdGVFbGVtZW50KCJzdmciKTtuPT09IjpiZWZvcmUiP3QuaW5zZXJ0QmVmb3JlKE1lLHQuZmlyc3RDaGlsZCk6dC5hcHBlbmRDaGlsZChNZSksTWUub3V0ZXJIVE1MPU9lLm1hcChmdW5jdGlvbihydCl7cmV0dXJuIEVyKHJ0KX0pLmpvaW4oYApgKSx0LnJlbW92ZUF0dHJpYnV0ZShlKSxpKCl9KS5jYXRjaChhKX1lbHNlIGkoKX1lbHNlIGkoKX0pfWZ1bmN0aW9uIGl6KHQpe3JldHVybiBQMi5hbGwoW3I5KHQsIjpiZWZvcmUiKSxyOSh0LCI6YWZ0ZXIiKV0pfWZ1bmN0aW9uIGF6KHQpe3JldHVybiB0LnBhcmVudE5vZGUhPT1kb2N1bWVudC5oZWFkJiYhfktTLmluZGV4T2YodC50YWdOYW1lLnRvVXBwZXJDYXNlKCkpJiYhdC5nZXRBdHRyaWJ1dGUoVjYpJiYoIXQucGFyZW50Tm9kZXx8dC5wYXJlbnROb2RlLnRhZ05hbWUhPT0ic3ZnIil9ZnVuY3Rpb24gbzkodCl7aWYoTWEpcmV0dXJuIG5ldyBQMihmdW5jdGlvbihuLGUpe3ZhciBpPURyKHQucXVlcnlTZWxlY3RvckFsbCgiKiIpKS5maWx0ZXIoYXopLm1hcChpeiksYT1LNi5iZWdpbigic2VhcmNoUHNldWRvRWxlbWVudHMiKTtPaygpLFAyLmFsbChpKS50aGVuKGZ1bmN0aW9uKCl7YSgpLGE5KCksbigpfSkuY2F0Y2goZnVuY3Rpb24oKXthKCksYTkoKSxlKCl9KX0pfWZ1bmN0aW9uIEI2KCl7dmFyIHQ9bTksbj1oOSxlPXV0LmZhbWlseVByZWZpeCxpPXV0LnJlcGxhY2VtZW50Q2xhc3MsYT1uejtpZihlIT09dHx8aSE9PW4pe3ZhciByPW5ldyBSZWdFeHAoIlxcLiIuY29uY2F0KHQsIlxcLSIpLCJnIiksbz1uZXcgUmVnRXhwKCJcXC0tIi5jb25jYXQodCwiXFwtIiksImciKSxkPW5ldyBSZWdFeHAoIlxcLiIuY29uY2F0KG4pLCJnIik7YT1hLnJlcGxhY2UociwiLiIuY29uY2F0KGUsIi0iKSkucmVwbGFjZShvLCItLSIuY29uY2F0KGUsIi0iKSkucmVwbGFjZShkLCIuIi5jb25jYXQoaSkpfXJldHVybiBhfWZ1bmN0aW9uIGk0KCl7dXQuYXV0b0FkZENzcyYmIVcwJiYodzkoQjYoKSksVzA9ITApfWZ1bmN0aW9uIFowKHQsbil7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJhYnN0cmFjdCIse2dldDpufSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImh0bWwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5hYnN0cmFjdC5tYXAoZnVuY3Rpb24oaSl7cmV0dXJuIEVyKGkpfSl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIm5vZGUiLHtnZXQ6ZnVuY3Rpb24oKXtpZihNYSl7dmFyIGk9SDEuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGkuaW5uZXJIVE1MPXQuaHRtbCxpLmNoaWxkcmVufX19KSx0fWZ1bmN0aW9uIFU2KHQpe3ZhciBuPXQucHJlZml4LGU9bj09PXZvaWQgMD8iZmEiOm4saT10Lmljb25OYW1lO2lmKGkpcmV0dXJuIGU5KExlLmRlZmluaXRpb25zLGUsaSl8fGU5KEwyLnN0eWxlcyxlLGkpfWZ1bmN0aW9uIG96KHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e30saT0obnx8e30pLmljb24/bjpVNihufHx7fSksYT1lLm1hc2s7cmV0dXJuIGEmJihhPShhfHx7fSkuaWNvbj9hOlU2KGF8fHt9KSksdChpLE90KHt9LGUse21hc2s6YX0pKX19dmFyIEdtLEc2LGM5LHM5LGw5LFdTLFdtLFFtLEFyLEgxLFltLFIwLG8kLE1hLGQ5LHlhLFA2LG05LGg5LFRyLFY2LFFTLFlTLFpTLFptLCRTLEtTLFhTLHA5LEpTLGY5LGVrLHRrLHU5LGlrLGFrLE9uLG5rLGc5LCRtLGNrLE82LHV0LHhhLEwyLHY5LHNrLEIwLFc2LF85LFUwLGowLGRrLGI5LG1rLCRvLEg2LFAyLFlhLENhLF9rLEQ2LFhtLE42LEtvLFRrLFQ5LEs2LEVrLEk2LEptLEFrLEQ5LEk5LEw5LFA5LExrLFg2LFBrLEYwLGVsLEcwLEg5LFkwLE45LFFrLHRsLFlrLFprLCRrLEtrLEw2LFhrLG56LHJ6LExlLGN6LFcwLGlsLHN6LGx6LGR6LG16LGh6LHB6LGZ6LFl0PXgoKCk9PntHbT1mdW5jdGlvbigpe30sRzY9e30sYzk9e30sczk9bnVsbCxsOT17bWFyazpHbSxtZWFzdXJlOkdtfTt0cnl7dHlwZW9mIHdpbmRvdzwidSImJihHNj13aW5kb3cpLHR5cGVvZiBkb2N1bWVudDwidSImJihjOT1kb2N1bWVudCksdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXI8InUiJiYoczk9TXV0YXRpb25PYnNlcnZlciksdHlwZW9mIHBlcmZvcm1hbmNlPCJ1IiYmKGw5PXBlcmZvcm1hbmNlKX1jYXRjaHt9V1M9RzYubmF2aWdhdG9yfHx7fSxXbT1XUy51c2VyQWdlbnQsUW09V209PT12b2lkIDA/IiI6V20sQXI9RzYsSDE9YzksWW09czksUjA9bDksbyQ9ISFBci5kb2N1bWVudCxNYT0hIUgxLmRvY3VtZW50RWxlbWVudCYmISFIMS5oZWFkJiZ0eXBlb2YgSDEuYWRkRXZlbnRMaXN0ZW5lcj09ImZ1bmN0aW9uIiYmdHlwZW9mIEgxLmNyZWF0ZUVsZW1lbnQ9PSJmdW5jdGlvbiIsZDk9flFtLmluZGV4T2YoIk1TSUUiKXx8flFtLmluZGV4T2YoIlRyaWRlbnQvIikseWE9Il9fX0ZPTlRfQVdFU09NRV9fXyIsUDY9MTYsbTk9ImZhIixoOT0ic3ZnLWlubGluZS0tZmEiLFRyPSJkYXRhLWZhLWkyc3ZnIixWNj0iZGF0YS1mYS1wc2V1ZG8tZWxlbWVudCIsUVM9ImRhdGEtZmEtcHNldWRvLWVsZW1lbnQtcGVuZGluZyIsWVM9ImRhdGEtcHJlZml4IixaUz0iZGF0YS1pY29uIixabT0iZm9udGF3ZXNvbWUtaTJzdmciLCRTPSJhc3luYyIsS1M9WyJIVE1MIiwiSEVBRCIsIlNUWUxFIiwiU0NSSVBUIl0sWFM9KGZ1bmN0aW9uKCl7dHJ5e3JldHVybiEwfWNhdGNoe3JldHVybiExfX0pKCkscDk9e2Zhczoic29saWQiLGZhcjoicmVndWxhciIsZmFsOiJsaWdodCIsZmFkOiJkdW90b25lIixmYWI6ImJyYW5kcyIsZmFrOiJraXQiLGZhOiJzb2xpZCJ9LEpTPXtzb2xpZDoiZmFzIixyZWd1bGFyOiJmYXIiLGxpZ2h0OiJmYWwiLGR1b3RvbmU6ImZhZCIsYnJhbmRzOiJmYWIiLGtpdDoiZmFrIn0sZjk9ImZhLWxheWVycy10ZXh0Iixlaz0vRm9udCBBd2Vzb21lIChbNSBdKikoU29saWR8UmVndWxhcnxMaWdodHxEdW90b25lfEJyYW5kc3xGcmVlfFByb3xLaXQpLiovaSx0az17OTAwOiJmYXMiLDQwMDoiZmFyIixub3JtYWw6ImZhciIsMzAwOiJmYWwifSx1OT1bMSwyLDMsNCw1LDYsNyw4LDksMTBdLGlrPXU5LmNvbmNhdChbMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjBdKSxhaz1bImNsYXNzIiwiZGF0YS1wcmVmaXgiLCJkYXRhLWljb24iLCJkYXRhLWZhLXRyYW5zZm9ybSIsImRhdGEtZmEtbWFzayJdLE9uPXtHUk9VUDoiZ3JvdXAiLFNXQVBfT1BBQ0lUWToic3dhcC1vcGFjaXR5IixQUklNQVJZOiJwcmltYXJ5IixTRUNPTkRBUlk6InNlY29uZGFyeSJ9LG5rPVsieHMiLCJzbSIsImxnIiwiZnciLCJ1bCIsImxpIiwiYm9yZGVyIiwicHVsbC1sZWZ0IiwicHVsbC1yaWdodCIsInNwaW4iLCJwdWxzZSIsInJvdGF0ZS05MCIsInJvdGF0ZS0xODAiLCJyb3RhdGUtMjcwIiwiZmxpcC1ob3Jpem9udGFsIiwiZmxpcC12ZXJ0aWNhbCIsImZsaXAtYm90aCIsInN0YWNrIiwic3RhY2stMXgiLCJzdGFjay0yeCIsImludmVyc2UiLCJsYXllcnMiLCJsYXllcnMtdGV4dCIsImxheWVycy1jb3VudGVyIixPbi5HUk9VUCxPbi5TV0FQX09QQUNJVFksT24uUFJJTUFSWSxPbi5TRUNPTkRBUlldLmNvbmNhdCh1OS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIiIuY29uY2F0KHQsIngiKX0pKS5jb25jYXQoaWsubWFwKGZ1bmN0aW9uKHQpe3JldHVybiJ3LSIuY29uY2F0KHQpfSkpLGc5PUFyLkZvbnRBd2Vzb21lQ29uZmlnfHx7fTtIMSYmdHlwZW9mIEgxLnF1ZXJ5U2VsZWN0b3I9PSJmdW5jdGlvbiImJigkbT1bWyJkYXRhLWZhbWlseS1wcmVmaXgiLCJmYW1pbHlQcmVmaXgiXSxbImRhdGEtcmVwbGFjZW1lbnQtY2xhc3MiLCJyZXBsYWNlbWVudENsYXNzIl0sWyJkYXRhLWF1dG8tcmVwbGFjZS1zdmciLCJhdXRvUmVwbGFjZVN2ZyJdLFsiZGF0YS1hdXRvLWFkZC1jc3MiLCJhdXRvQWRkQ3NzIl0sWyJkYXRhLWF1dG8tYTExeSIsImF1dG9BMTF5Il0sWyJkYXRhLXNlYXJjaC1wc2V1ZG8tZWxlbWVudHMiLCJzZWFyY2hQc2V1ZG9FbGVtZW50cyJdLFsiZGF0YS1vYnNlcnZlLW11dGF0aW9ucyIsIm9ic2VydmVNdXRhdGlvbnMiXSxbImRhdGEtbXV0YXRlLWFwcHJvYWNoIiwibXV0YXRlQXBwcm9hY2giXSxbImRhdGEta2VlcC1vcmlnaW5hbC1zb3VyY2UiLCJrZWVwT3JpZ2luYWxTb3VyY2UiXSxbImRhdGEtbWVhc3VyZS1wZXJmb3JtYW5jZSIsIm1lYXN1cmVQZXJmb3JtYW5jZSJdLFsiZGF0YS1zaG93LW1pc3NpbmctaWNvbnMiLCJzaG93TWlzc2luZ0ljb25zIl1dLCRtLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49ajYodCwyKSxlPW5bMF0saT1uWzFdLGE9b2socmsoZSkpO2EhPW51bGwmJihnOVtpXT1hKX0pKTtjaz17ZmFtaWx5UHJlZml4Om05LHJlcGxhY2VtZW50Q2xhc3M6aDksYXV0b1JlcGxhY2VTdmc6ITAsYXV0b0FkZENzczohMCxhdXRvQTExeTohMCxzZWFyY2hQc2V1ZG9FbGVtZW50czohMSxvYnNlcnZlTXV0YXRpb25zOiEwLG11dGF0ZUFwcHJvYWNoOiJhc3luYyIsa2VlcE9yaWdpbmFsU291cmNlOiEwLG1lYXN1cmVQZXJmb3JtYW5jZTohMSxzaG93TWlzc2luZ0ljb25zOiEwfSxPNj1PdCh7fSxjayxnOSk7TzYuYXV0b1JlcGxhY2VTdmd8fChPNi5vYnNlcnZlTXV0YXRpb25zPSExKTt1dD1PdCh7fSxPNik7QXIuRm9udEF3ZXNvbWVDb25maWc9dXQ7eGE9QXJ8fHt9O3hhW3lhXXx8KHhhW3lhXT17fSk7eGFbeWFdLnN0eWxlc3x8KHhhW3lhXS5zdHlsZXM9e30pO3hhW3lhXS5ob29rc3x8KHhhW3lhXS5ob29rcz17fSk7eGFbeWFdLnNoaW1zfHwoeGFbeWFdLnNoaW1zPVtdKTtMMj14YVt5YV0sdjk9W10sc2s9ZnVuY3Rpb24gdCgpe0gxLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHQpLEIwPTEsdjkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuKCl9KX0sQjA9ITE7TWEmJihCMD0oSDEuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsPy9ebG9hZGVkfF5jLzovXmxvYWRlZHxeaXxeYy8pLnRlc3QoSDEucmVhZHlTdGF0ZSksQjB8fEgxLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHNrKSk7VzY9InBlbmRpbmciLF85PSJzZXR0bGVkIixVMD0iZnVsZmlsbGVkIixqMD0icmVqZWN0ZWQiLGRrPWZ1bmN0aW9uKCl7fSxiOT10eXBlb2YgZ2xvYmFsPCJ1IiYmdHlwZW9mIGdsb2JhbC5wcm9jZXNzPCJ1IiYmdHlwZW9mIGdsb2JhbC5wcm9jZXNzLmVtaXQ9PSJmdW5jdGlvbiIsbWs9dHlwZW9mIHNldEltbWVkaWF0ZT4idSI/c2V0VGltZW91dDpzZXRJbW1lZGlhdGUsJG89W107SmkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpKaSxfc3RhdGU6VzYsX3RoZW46bnVsbCxfZGF0YTp2b2lkIDAsX2hhbmRsZWQ6ITEsdGhlbjpmdW5jdGlvbihuLGUpe3ZhciBpPXtvd25lcjp0aGlzLHRoZW46bmV3IHRoaXMuY29uc3RydWN0b3IoZGspLGZ1bGZpbGxlZDpuLHJlamVjdGVkOmV9O3JldHVybihlfHxuKSYmIXRoaXMuX2hhbmRsZWQmJih0aGlzLl9oYW5kbGVkPSEwLHRoaXMuX3N0YXRlPT09ajAmJmI5JiZxMChnayx0aGlzKSksdGhpcy5fc3RhdGU9PT1VMHx8dGhpcy5fc3RhdGU9PT1qMD9xMChDOSxpKTp0aGlzLl90aGVuLnB1c2goaSksaS50aGVufSxjYXRjaDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsbil9fTtKaS5hbGw9ZnVuY3Rpb24odCl7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byBQcm9taXNlLmFsbCgpLiIpO3JldHVybiBuZXcgSmkoZnVuY3Rpb24obixlKXt2YXIgaT1bXSxhPTA7ZnVuY3Rpb24gcihwKXtyZXR1cm4gYSsrLGZ1bmN0aW9uKGcpe2lbcF09ZywtLWF8fG4oaSl9fWZvcih2YXIgbz0wLGQ7bzx0Lmxlbmd0aDtvKyspZD10W29dLGQmJnR5cGVvZiBkLnRoZW49PSJmdW5jdGlvbiI/ZC50aGVuKHIobyksZSk6aVtvXT1kO2F8fG4oaSl9KX07SmkucmFjZT1mdW5jdGlvbih0KXtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRvIFByb21pc2UucmFjZSgpLiIpO3JldHVybiBuZXcgSmkoZnVuY3Rpb24obixlKXtmb3IodmFyIGk9MCxhO2k8dC5sZW5ndGg7aSsrKWE9dFtpXSxhJiZ0eXBlb2YgYS50aGVuPT0iZnVuY3Rpb24iP2EudGhlbihuLGUpOm4oYSl9KX07SmkucmVzb2x2ZT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmWG8odCk9PT0ib2JqZWN0IiYmdC5jb25zdHJ1Y3Rvcj09PUppP3Q6bmV3IEppKGZ1bmN0aW9uKG4pe24odCl9KX07SmkucmVqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgSmkoZnVuY3Rpb24obixlKXtlKHQpfSl9O1AyPXR5cGVvZiBQcm9taXNlPT0iZnVuY3Rpb24iP1Byb21pc2U6SmksWWE9UDYsQ2E9e3NpemU6MTYseDowLHk6MCxyb3RhdGU6MCxmbGlwWDohMSxmbGlwWTohMX07X2s9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjtENj17eDowLHk6MCx3aWR0aDoiMTAwJSIsaGVpZ2h0OiIxMDAlIn07WG09ZnVuY3Rpb24oKXt9LE42PXV0Lm1lYXN1cmVQZXJmb3JtYW5jZSYmUjAmJlIwLm1hcmsmJlIwLm1lYXN1cmU/UjA6e21hcms6WG0sbWVhc3VyZTpYbX0sS289J0ZBICI1LjE1LjQiJyxUaz1mdW5jdGlvbihuKXtyZXR1cm4gTjYubWFyaygiIi5jb25jYXQoS28sIiAiKS5jb25jYXQobiwiIGJlZ2lucyIpKSxmdW5jdGlvbigpe3JldHVybiBUOShuKX19LFQ5PWZ1bmN0aW9uKG4pe042Lm1hcmsoIiIuY29uY2F0KEtvLCIgIikuY29uY2F0KG4sIiBlbmRzIikpLE42Lm1lYXN1cmUoIiIuY29uY2F0KEtvLCIgIikuY29uY2F0KG4pLCIiLmNvbmNhdChLbywiICIpLmNvbmNhdChuLCIgYmVnaW5zIiksIiIuY29uY2F0KEtvLCIgIikuY29uY2F0KG4sIiBlbmRzIikpfSxLNj17YmVnaW46VGssZW5kOlQ5fSxFaz1mdW5jdGlvbihuLGUpe3JldHVybiBmdW5jdGlvbihpLGEscixvKXtyZXR1cm4gbi5jYWxsKGUsaSxhLHIsbyl9fSxJNj1mdW5jdGlvbihuLGUsaSxhKXt2YXIgcj1PYmplY3Qua2V5cyhuKSxvPXIubGVuZ3RoLGQ9YSE9PXZvaWQgMD9FayhlLGEpOmUscCxnLF87Zm9yKGk9PT12b2lkIDA/KHA9MSxfPW5bclswXV0pOihwPTAsXz1pKTtwPG87cCsrKWc9cltwXSxfPWQoXyxuW2ddLGcsbik7cmV0dXJuIF99O0ptPUwyLnN0eWxlcyxBaz1MMi5zaGltcyxEOT17fSxJOT17fSxMOT17fSxQOT1mdW5jdGlvbigpe3ZhciBuPWZ1bmN0aW9uKGEpe3JldHVybiBJNihKbSxmdW5jdGlvbihyLG8sZCl7cmV0dXJuIHJbZF09STYobyxhLHt9KSxyfSx7fSl9O0Q5PW4oZnVuY3Rpb24oaSxhLHIpe3JldHVybiBhWzNdJiYoaVthWzNdXT1yKSxpfSksSTk9bihmdW5jdGlvbihpLGEscil7dmFyIG89YVsyXTtyZXR1cm4gaVtyXT1yLG8uZm9yRWFjaChmdW5jdGlvbihkKXtpW2RdPXJ9KSxpfSk7dmFyIGU9ImZhciJpbiBKbTtMOT1JNihBayxmdW5jdGlvbihpLGEpe3ZhciByPWFbMF0sbz1hWzFdLGQ9YVsyXTtyZXR1cm4gbz09PSJmYXIiJiYhZSYmKG89ImZhcyIpLGlbcl09e3ByZWZpeDpvLGljb25OYW1lOmR9LGl9LHt9KX07UDkoKTtMaz1MMi5zdHlsZXMsWDY9ZnVuY3Rpb24oKXtyZXR1cm57cHJlZml4Om51bGwsaWNvbk5hbWU6bnVsbCxyZXN0OltdfX07UGs9ZnVuY3Rpb24oKXt9O0YwPXtyZXBsYWNlOmZ1bmN0aW9uKG4pe3ZhciBlPW5bMF0saT1uWzFdLGE9aS5tYXAoZnVuY3Rpb24obyl7cmV0dXJuIEVyKG8pfSkuam9pbihgCmApO2lmKGUucGFyZW50Tm9kZSYmZS5vdXRlckhUTUwpZS5vdXRlckhUTUw9YSsodXQua2VlcE9yaWdpbmFsU291cmNlJiZlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSE9PSJzdmciPyI8IS0tICIuY29uY2F0KGUub3V0ZXJIVE1MLCIgRm9udCBBd2Vzb21lIGZvbnRhd2Vzb21lLmNvbSAtLT4iKToiIik7ZWxzZSBpZihlLnBhcmVudE5vZGUpe3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHIsZSksci5vdXRlckhUTUw9YX19LG5lc3Q6ZnVuY3Rpb24obil7dmFyIGU9blswXSxpPW5bMV07aWYoflk2KGUpLmluZGV4T2YodXQucmVwbGFjZW1lbnRDbGFzcykpcmV0dXJuIEYwLnJlcGxhY2Uobik7dmFyIGE9bmV3IFJlZ0V4cCgiIi5jb25jYXQodXQuZmFtaWx5UHJlZml4LCItLioiKSk7ZGVsZXRlIGlbMF0uYXR0cmlidXRlcy5zdHlsZSxkZWxldGUgaVswXS5hdHRyaWJ1dGVzLmlkO3ZhciByPWlbMF0uYXR0cmlidXRlcy5jbGFzcy5zcGxpdCgiICIpLnJlZHVjZShmdW5jdGlvbihkLHApe3JldHVybiBwPT09dXQucmVwbGFjZW1lbnRDbGFzc3x8cC5tYXRjaChhKT9kLnRvU3ZnLnB1c2gocCk6ZC50b05vZGUucHVzaChwKSxkfSx7dG9Ob2RlOltdLHRvU3ZnOltdfSk7aVswXS5hdHRyaWJ1dGVzLmNsYXNzPXIudG9Tdmcuam9pbigiICIpO3ZhciBvPWkubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBFcihkKX0pLmpvaW4oYApgKTtlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHIudG9Ob2RlLmpvaW4oIiAiKSksZS5zZXRBdHRyaWJ1dGUoVHIsIiIpLGUuaW5uZXJIVE1MPW99fTtlbD0hMTtHMD1udWxsO0g5PWZ1bmN0aW9uKG4pe3ZhciBlPXtzaXplOjE2LHg6MCx5OjAsZmxpcFg6ITEsZmxpcFk6ITEscm90YXRlOjB9O3JldHVybiBuP24udG9Mb3dlckNhc2UoKS5zcGxpdCgiICIpLnJlZHVjZShmdW5jdGlvbihpLGEpe3ZhciByPWEudG9Mb3dlckNhc2UoKS5zcGxpdCgiLSIpLG89clswXSxkPXIuc2xpY2UoMSkuam9pbigiLSIpO2lmKG8mJmQ9PT0iaCIpcmV0dXJuIGkuZmxpcFg9ITAsaTtpZihvJiZkPT09InYiKXJldHVybiBpLmZsaXBZPSEwLGk7aWYoZD1wYXJzZUZsb2F0KGQpLGlzTmFOKGQpKXJldHVybiBpO3N3aXRjaChvKXtjYXNlImdyb3ciOmkuc2l6ZT1pLnNpemUrZDticmVhaztjYXNlInNocmluayI6aS5zaXplPWkuc2l6ZS1kO2JyZWFrO2Nhc2UibGVmdCI6aS54PWkueC1kO2JyZWFrO2Nhc2UicmlnaHQiOmkueD1pLngrZDticmVhaztjYXNlInVwIjppLnk9aS55LWQ7YnJlYWs7Y2FzZSJkb3duIjppLnk9aS55K2Q7YnJlYWs7Y2FzZSJyb3RhdGUiOmkucm90YXRlPWkucm90YXRlK2Q7YnJlYWt9cmV0dXJuIGl9LGUpOmV9O3Q0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7dDQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQ0O1kwPXtmaWxsOiJjdXJyZW50Q29sb3IifSxOOT17YXR0cmlidXRlVHlwZToiWE1MIixyZXBlYXRDb3VudDoiaW5kZWZpbml0ZSIsZHVyOiIycyJ9LFFrPXt0YWc6InBhdGgiLGF0dHJpYnV0ZXM6T3Qoe30sWTAse2Q6Ik0xNTYuNSw0NDcuN2wtMTIuNiwyOS41Yy0xOC43LTkuNS0zNS45LTIxLjItNTEuNS0zNC45bDIyLjctMjIuN0MxMjcuNiw0MzAuNSwxNDEuNSw0NDAsMTU2LjUsNDQ3Ljd6IE00MC42LDI3Mkg4LjUgYzEuNCwyMS4yLDUuNCw0MS43LDExLjcsNjEuMUw1MCwzMjEuMkM0NS4xLDMwNS41LDQxLjgsMjg5LDQwLjYsMjcyeiBNNDAuNiwyNDBjMS40LTE4LjgsNS4yLTM3LDExLjEtNTQuMWwtMjkuNS0xMi42IEMxNC43LDE5NC4zLDEwLDIxNi43LDguNSwyNDBINDAuNnogTTY0LjMsMTU2LjVjNy44LTE0LjksMTcuMi0yOC44LDI4LjEtNDEuNUw2OS43LDkyLjNjLTEzLjcsMTUuNi0yNS41LDMyLjgtMzQuOSw1MS41IEw2NC4zLDE1Ni41eiBNMzk3LDQxOS42Yy0xMy45LDEyLTI5LjQsMjIuMy00Ni4xLDMwLjRsMTEuOSwyOS44YzIwLjctOS45LDM5LjgtMjIuNiw1Ni45LTM3LjZMMzk3LDQxOS42eiBNMTE1LDkyLjQgYzEzLjktMTIsMjkuNC0yMi4zLDQ2LjEtMzAuNGwtMTEuOS0yOS44Yy0yMC43LDkuOS0zOS44LDIyLjYtNTYuOCwzNy42TDExNSw5Mi40eiBNNDQ3LjcsMzU1LjVjLTcuOCwxNC45LTE3LjIsMjguOC0yOC4xLDQxLjUgbDIyLjcsMjIuN2MxMy43LTE1LjYsMjUuNS0zMi45LDM0LjktNTEuNUw0NDcuNywzNTUuNXogTTQ3MS40LDI3MmMtMS40LDE4LjgtNS4yLDM3LTExLjEsNTQuMWwyOS41LDEyLjYgYzcuNS0yMS4xLDEyLjItNDMuNSwxMy42LTY2LjhINDcxLjR6IE0zMjEuMiw0NjJjLTE1LjcsNS0zMi4yLDguMi00OS4yLDkuNHYzMi4xYzIxLjItMS40LDQxLjctNS40LDYxLjEtMTEuN0wzMjEuMiw0NjJ6IE0yNDAsNDcxLjRjLTE4LjgtMS40LTM3LTUuMi01NC4xLTExLjFsLTEyLjYsMjkuNWMyMS4xLDcuNSw0My41LDEyLjIsNjYuOCwxMy42VjQ3MS40eiBNNDYyLDE5MC44YzUsMTUuNyw4LjIsMzIuMiw5LjQsNDkuMmgzMi4xIGMtMS40LTIxLjItNS40LTQxLjctMTEuNy02MS4xTDQ2MiwxOTAuOHogTTkyLjQsMzk3Yy0xMi0xMy45LTIyLjMtMjkuNC0zMC40LTQ2LjFsLTI5LjgsMTEuOWM5LjksMjAuNywyMi42LDM5LjgsMzcuNiw1Ni45IEw5Mi40LDM5N3ogTTI3Miw0MC42YzE4LjgsMS40LDM2LjksNS4yLDU0LjEsMTEuMWwxMi42LTI5LjVDMzE3LjcsMTQuNywyOTUuMywxMCwyNzIsOC41VjQwLjZ6IE0xOTAuOCw1MCBjMTUuNy01LDMyLjItOC4yLDQ5LjItOS40VjguNWMtMjEuMiwxLjQtNDEuNyw1LjQtNjEuMSwxMS43TDE5MC44LDUweiBNNDQyLjMsOTIuM0w0MTkuNiwxMTVjMTIsMTMuOSwyMi4zLDI5LjQsMzAuNSw0Ni4xIGwyOS44LTExLjlDNDcwLDEyOC41LDQ1Ny4zLDEwOS40LDQ0Mi4zLDkyLjN6IE0zOTcsOTIuNGwyMi43LTIyLjdjLTE1LjYtMTMuNy0zMi44LTI1LjUtNTEuNS0zNC45bC0xMi42LDI5LjUgQzM3MC40LDcyLjEsMzg0LjQsODEuNSwzOTcsOTIuNHoifSl9LHRsPU90KHt9LE45LHthdHRyaWJ1dGVOYW1lOiJvcGFjaXR5In0pLFlrPXt0YWc6ImNpcmNsZSIsYXR0cmlidXRlczpPdCh7fSxZMCx7Y3g6IjI1NiIsY3k6IjM2NCIscjoiMjgifSksY2hpbGRyZW46W3t0YWc6ImFuaW1hdGUiLGF0dHJpYnV0ZXM6T3Qoe30sTjkse2F0dHJpYnV0ZU5hbWU6InIiLHZhbHVlczoiMjg7MTQ7Mjg7Mjg7MTQ7Mjg7In0pfSx7dGFnOiJhbmltYXRlIixhdHRyaWJ1dGVzOk90KHt9LHRsLHt2YWx1ZXM6IjE7MDsxOzE7MDsxOyJ9KX1dfSxaaz17dGFnOiJwYXRoIixhdHRyaWJ1dGVzOk90KHt9LFkwLHtvcGFjaXR5OiIxIixkOiJNMjYzLjcsMzEyaC0xNmMtNi42LDAtMTItNS40LTEyLTEyYzAtNzEsNzcuNC02My45LDc3LjQtMTA3LjhjMC0yMC0xNy44LTQwLjItNTcuNC00MC4yYy0yOS4xLDAtNDQuMyw5LjYtNTkuMiwyOC43IGMtMy45LDUtMTEuMSw2LTE2LjIsMi40bC0xMy4xLTkuMmMtNS42LTMuOS02LjktMTEuOC0yLjYtMTcuMmMyMS4yLTI3LjIsNDYuNC00NC43LDkxLjItNDQuN2M1Mi4zLDAsOTcuNCwyOS44LDk3LjQsODAuMiBjMCw2Ny42LTc3LjQsNjMuNS03Ny40LDEwNy44QzI3NS43LDMwNi42LDI3MC4zLDMxMiwyNjMuNywzMTJ6In0pLGNoaWxkcmVuOlt7dGFnOiJhbmltYXRlIixhdHRyaWJ1dGVzOk90KHt9LHRsLHt2YWx1ZXM6IjE7MDswOzA7MDsxOyJ9KX1dfSwkaz17dGFnOiJwYXRoIixhdHRyaWJ1dGVzOk90KHt9LFkwLHtvcGFjaXR5OiIwIixkOiJNMjMyLjUsMTM0LjVsNywxNjhjMC4zLDYuNCw1LjYsMTEuNSwxMiwxMS41aDljNi40LDAsMTEuNy01LjEsMTItMTEuNWw3LTE2OGMwLjMtNi44LTUuMi0xMi41LTEyLTEyLjVoLTIzIEMyMzcuNywxMjIsMjMyLjIsMTI3LjcsMjMyLjUsMTM0LjV6In0pLGNoaWxkcmVuOlt7dGFnOiJhbmltYXRlIixhdHRyaWJ1dGVzOk90KHt9LHRsLHt2YWx1ZXM6IjA7MDsxOzE7MDswOyJ9KX1dfSxLaz17dGFnOiJnIixjaGlsZHJlbjpbUWssWWssWmssJGtdfSxMNj1MMi5zdHlsZXM7WGs9TDIuc3R5bGVzO256PWBzdmc6bm90KDpyb290KS5zdmctaW5saW5lLS1mYSB7CiAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5zdmctaW5saW5lLS1mYSB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogaW5oZXJpdDsKICBoZWlnaHQ6IDFlbTsKICBvdmVyZmxvdzogdmlzaWJsZTsKICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTI1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLWxnIHsKICB2ZXJ0aWNhbC1hbGlnbjogLTAuMjI1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXctMSB7CiAgd2lkdGg6IDAuMDYyNWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS13LTIgewogIHdpZHRoOiAwLjEyNWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS13LTMgewogIHdpZHRoOiAwLjE4NzVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtdy00IHsKICB3aWR0aDogMC4yNWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS13LTUgewogIHdpZHRoOiAwLjMxMjVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtdy02IHsKICB3aWR0aDogMC4zNzVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtdy03IHsKICB3aWR0aDogMC40Mzc1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXctOCB7CiAgd2lkdGg6IDAuNWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS13LTkgewogIHdpZHRoOiAwLjU2MjVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtdy0xMCB7CiAgd2lkdGg6IDAuNjI1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXctMTEgewogIHdpZHRoOiAwLjY4NzVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtdy0xMiB7CiAgd2lkdGg6IDAuNzVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtdy0xMyB7CiAgd2lkdGg6IDAuODEyNWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS13LTE0IHsKICB3aWR0aDogMC44NzVlbTsKfQouc3ZnLWlubGluZS0tZmEuZmEtdy0xNSB7CiAgd2lkdGg6IDAuOTM3NWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS13LTE2IHsKICB3aWR0aDogMWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS13LTE3IHsKICB3aWR0aDogMS4wNjI1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXctMTggewogIHdpZHRoOiAxLjEyNWVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS13LTE5IHsKICB3aWR0aDogMS4xODc1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXctMjAgewogIHdpZHRoOiAxLjI1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXB1bGwtbGVmdCB7CiAgbWFyZ2luLXJpZ2h0OiAwLjNlbTsKICB3aWR0aDogYXV0bzsKfQouc3ZnLWlubGluZS0tZmEuZmEtcHVsbC1yaWdodCB7CiAgbWFyZ2luLWxlZnQ6IDAuM2VtOwogIHdpZHRoOiBhdXRvOwp9Ci5zdmctaW5saW5lLS1mYS5mYS1ib3JkZXIgewogIGhlaWdodDogMS41ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLWxpIHsKICB3aWR0aDogMmVtOwp9Ci5zdmctaW5saW5lLS1mYS5mYS1mdyB7CiAgd2lkdGg6IDEuMjVlbTsKfQoKLmZhLWxheWVycyBzdmcuc3ZnLWlubGluZS0tZmEgewogIGJvdHRvbTogMDsKICBsZWZ0OiAwOwogIG1hcmdpbjogYXV0bzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwOwp9CgouZmEtbGF5ZXJzIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgaGVpZ2h0OiAxZW07CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB2ZXJ0aWNhbC1hbGlnbjogLTAuMTI1ZW07CiAgd2lkdGg6IDFlbTsKfQouZmEtbGF5ZXJzIHN2Zy5zdmctaW5saW5lLS1mYSB7CiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwogICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKfQoKLmZhLWxheWVycy1jb3VudGVyLCAuZmEtbGF5ZXJzLXRleHQgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZmEtbGF5ZXJzLXRleHQgewogIGxlZnQ6IDUwJTsKICB0b3A6IDUwJTsKICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwogICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKfQoKLmZhLWxheWVycy1jb3VudGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmYyNTNhOwogIGJvcmRlci1yYWRpdXM6IDFlbTsKICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIGNvbG9yOiAjZmZmOwogIGhlaWdodDogMS41ZW07CiAgbGluZS1oZWlnaHQ6IDE7CiAgbWF4LXdpZHRoOiA1ZW07CiAgbWluLXdpZHRoOiAxLjVlbTsKICBvdmVyZmxvdzogaGlkZGVuOwogIHBhZGRpbmc6IDAuMjVlbTsKICByaWdodDogMDsKICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICB0b3A6IDA7CiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMjUpOwogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjI1KTsKICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IHRvcCByaWdodDsKICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCByaWdodDsKfQoKLmZhLWxheWVycy1ib3R0b20tcmlnaHQgewogIGJvdHRvbTogMDsKICByaWdodDogMDsKICB0b3A6IGF1dG87CiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuMjUpOwogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjI1KTsKICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbSByaWdodDsKICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbSByaWdodDsKfQoKLmZhLWxheWVycy1ib3R0b20tbGVmdCB7CiAgYm90dG9tOiAwOwogIGxlZnQ6IDA7CiAgcmlnaHQ6IGF1dG87CiAgdG9wOiBhdXRvOwogIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjI1KTsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4yNSk7CiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBib3R0b20gbGVmdDsKICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbSBsZWZ0Owp9CgouZmEtbGF5ZXJzLXRvcC1yaWdodCB7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwOwogIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjI1KTsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4yNSk7CiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7CiAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgcmlnaHQ7Cn0KCi5mYS1sYXllcnMtdG9wLWxlZnQgewogIGxlZnQ6IDA7CiAgcmlnaHQ6IGF1dG87CiAgdG9wOiAwOwogIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjI1KTsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4yNSk7CiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiB0b3AgbGVmdDsKICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHRvcCBsZWZ0Owp9CgouZmEtbGcgewogIGZvbnQtc2l6ZTogMS4zMzMzMzMzMzMzZW07CiAgbGluZS1oZWlnaHQ6IDAuNzVlbTsKICB2ZXJ0aWNhbC1hbGlnbjogLTAuMDY2N2VtOwp9CgouZmEteHMgewogIGZvbnQtc2l6ZTogMC43NWVtOwp9CgouZmEtc20gewogIGZvbnQtc2l6ZTogMC44NzVlbTsKfQoKLmZhLTF4IHsKICBmb250LXNpemU6IDFlbTsKfQoKLmZhLTJ4IHsKICBmb250LXNpemU6IDJlbTsKfQoKLmZhLTN4IHsKICBmb250LXNpemU6IDNlbTsKfQoKLmZhLTR4IHsKICBmb250LXNpemU6IDRlbTsKfQoKLmZhLTV4IHsKICBmb250LXNpemU6IDVlbTsKfQoKLmZhLTZ4IHsKICBmb250LXNpemU6IDZlbTsKfQoKLmZhLTd4IHsKICBmb250LXNpemU6IDdlbTsKfQoKLmZhLTh4IHsKICBmb250LXNpemU6IDhlbTsKfQoKLmZhLTl4IHsKICBmb250LXNpemU6IDllbTsKfQoKLmZhLTEweCB7CiAgZm9udC1zaXplOiAxMGVtOwp9CgouZmEtZncgewogIHRleHQtYWxpZ246IGNlbnRlcjsKICB3aWR0aDogMS4yNWVtOwp9CgouZmEtdWwgewogIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICBtYXJnaW4tbGVmdDogMi41ZW07CiAgcGFkZGluZy1sZWZ0OiAwOwp9Ci5mYS11bCA+IGxpIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5mYS1saSB7CiAgbGVmdDogLTJlbTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHdpZHRoOiAyZW07CiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7Cn0KCi5mYS1ib3JkZXIgewogIGJvcmRlcjogc29saWQgMC4wOGVtICNlZWU7CiAgYm9yZGVyLXJhZGl1czogMC4xZW07CiAgcGFkZGluZzogMC4yZW0gMC4yNWVtIDAuMTVlbTsKfQoKLmZhLXB1bGwtbGVmdCB7CiAgZmxvYXQ6IGxlZnQ7Cn0KCi5mYS1wdWxsLXJpZ2h0IHsKICBmbG9hdDogcmlnaHQ7Cn0KCi5mYS5mYS1wdWxsLWxlZnQsCi5mYXMuZmEtcHVsbC1sZWZ0LAouZmFyLmZhLXB1bGwtbGVmdCwKLmZhbC5mYS1wdWxsLWxlZnQsCi5mYWIuZmEtcHVsbC1sZWZ0IHsKICBtYXJnaW4tcmlnaHQ6IDAuM2VtOwp9Ci5mYS5mYS1wdWxsLXJpZ2h0LAouZmFzLmZhLXB1bGwtcmlnaHQsCi5mYXIuZmEtcHVsbC1yaWdodCwKLmZhbC5mYS1wdWxsLXJpZ2h0LAouZmFiLmZhLXB1bGwtcmlnaHQgewogIG1hcmdpbi1sZWZ0OiAwLjNlbTsKfQoKLmZhLXNwaW4gewogIC13ZWJraXQtYW5pbWF0aW9uOiBmYS1zcGluIDJzIGluZmluaXRlIGxpbmVhcjsKICAgICAgICAgIGFuaW1hdGlvbjogZmEtc3BpbiAycyBpbmZpbml0ZSBsaW5lYXI7Cn0KCi5mYS1wdWxzZSB7CiAgLXdlYmtpdC1hbmltYXRpb246IGZhLXNwaW4gMXMgaW5maW5pdGUgc3RlcHMoOCk7CiAgICAgICAgICBhbmltYXRpb246IGZhLXNwaW4gMXMgaW5maW5pdGUgc3RlcHMoOCk7Cn0KCkAtd2Via2l0LWtleWZyYW1lcyBmYS1zcGluIHsKICAwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICB9CiAgMTAwJSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgfQp9CgpAa2V5ZnJhbWVzIGZhLXNwaW4gewogIDAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogIH0KICAxMDAlIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICB9Cn0KLmZhLXJvdGF0ZS05MCB7CiAgLW1zLWZpbHRlcjogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTEpIjsKICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKfQoKLmZhLXJvdGF0ZS0xODAgewogIC1tcy1maWx0ZXI6ICJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0yKSI7CiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsKfQoKLmZhLXJvdGF0ZS0yNzAgewogIC1tcy1maWx0ZXI6ICJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0zKSI7CiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsKfQoKLmZhLWZsaXAtaG9yaXpvbnRhbCB7CiAgLW1zLWZpbHRlcjogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTAsIG1pcnJvcj0xKSI7CiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKC0xLCAxKTsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoLTEsIDEpOwp9CgouZmEtZmxpcC12ZXJ0aWNhbCB7CiAgLW1zLWZpbHRlcjogInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5CYXNpY0ltYWdlKHJvdGF0aW9uPTIsIG1pcnJvcj0xKSI7CiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEsIC0xKTsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgLTEpOwp9CgouZmEtZmxpcC1ib3RoLCAuZmEtZmxpcC1ob3Jpem9udGFsLmZhLWZsaXAtdmVydGljYWwgewogIC1tcy1maWx0ZXI6ICJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0yLCBtaXJyb3I9MSkiOwogIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgtMSwgLTEpOwogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgtMSwgLTEpOwp9Cgo6cm9vdCAuZmEtcm90YXRlLTkwLAo6cm9vdCAuZmEtcm90YXRlLTE4MCwKOnJvb3QgLmZhLXJvdGF0ZS0yNzAsCjpyb290IC5mYS1mbGlwLWhvcml6b250YWwsCjpyb290IC5mYS1mbGlwLXZlcnRpY2FsLAo6cm9vdCAuZmEtZmxpcC1ib3RoIHsKICAtd2Via2l0LWZpbHRlcjogbm9uZTsKICAgICAgICAgIGZpbHRlcjogbm9uZTsKfQoKLmZhLXN0YWNrIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgaGVpZ2h0OiAyZW07CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHdpZHRoOiAyLjVlbTsKfQoKLmZhLXN0YWNrLTF4LAouZmEtc3RhY2stMnggewogIGJvdHRvbTogMDsKICBsZWZ0OiAwOwogIG1hcmdpbjogYXV0bzsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwOwp9Cgouc3ZnLWlubGluZS0tZmEuZmEtc3RhY2stMXggewogIGhlaWdodDogMWVtOwogIHdpZHRoOiAxLjI1ZW07Cn0KLnN2Zy1pbmxpbmUtLWZhLmZhLXN0YWNrLTJ4IHsKICBoZWlnaHQ6IDJlbTsKICB3aWR0aDogMi41ZW07Cn0KCi5mYS1pbnZlcnNlIHsKICBjb2xvcjogI2ZmZjsKfQoKLnNyLW9ubHkgewogIGJvcmRlcjogMDsKICBjbGlwOiByZWN0KDAsIDAsIDAsIDApOwogIGhlaWdodDogMXB4OwogIG1hcmdpbjogLTFweDsKICBvdmVyZmxvdzogaGlkZGVuOwogIHBhZGRpbmc6IDA7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHdpZHRoOiAxcHg7Cn0KCi5zci1vbmx5LWZvY3VzYWJsZTphY3RpdmUsIC5zci1vbmx5LWZvY3VzYWJsZTpmb2N1cyB7CiAgY2xpcDogYXV0bzsKICBoZWlnaHQ6IGF1dG87CiAgbWFyZ2luOiAwOwogIG92ZXJmbG93OiB2aXNpYmxlOwogIHBvc2l0aW9uOiBzdGF0aWM7CiAgd2lkdGg6IGF1dG87Cn0KCi5zdmctaW5saW5lLS1mYSAuZmEtcHJpbWFyeSB7CiAgZmlsbDogdmFyKC0tZmEtcHJpbWFyeS1jb2xvciwgY3VycmVudENvbG9yKTsKICBvcGFjaXR5OiAxOwogIG9wYWNpdHk6IHZhcigtLWZhLXByaW1hcnktb3BhY2l0eSwgMSk7Cn0KCi5zdmctaW5saW5lLS1mYSAuZmEtc2Vjb25kYXJ5IHsKICBmaWxsOiB2YXIoLS1mYS1zZWNvbmRhcnktY29sb3IsIGN1cnJlbnRDb2xvcik7CiAgb3BhY2l0eTogMC40OwogIG9wYWNpdHk6IHZhcigtLWZhLXNlY29uZGFyeS1vcGFjaXR5LCAwLjQpOwp9Cgouc3ZnLWlubGluZS0tZmEuZmEtc3dhcC1vcGFjaXR5IC5mYS1wcmltYXJ5IHsKICBvcGFjaXR5OiAwLjQ7CiAgb3BhY2l0eTogdmFyKC0tZmEtc2Vjb25kYXJ5LW9wYWNpdHksIDAuNCk7Cn0KCi5zdmctaW5saW5lLS1mYS5mYS1zd2FwLW9wYWNpdHkgLmZhLXNlY29uZGFyeSB7CiAgb3BhY2l0eTogMTsKICBvcGFjaXR5OiB2YXIoLS1mYS1wcmltYXJ5LW9wYWNpdHksIDEpOwp9Cgouc3ZnLWlubGluZS0tZmEgbWFzayAuZmEtcHJpbWFyeSwKLnN2Zy1pbmxpbmUtLWZhIG1hc2sgLmZhLXNlY29uZGFyeSB7CiAgZmlsbDogYmxhY2s7Cn0KCi5mYWQuZmEtaW52ZXJzZSB7CiAgY29sb3I6ICNmZmY7Cn1gO3J6PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtIUyh0aGlzLHQpLHRoaXMuZGVmaW5pdGlvbnM9e319cmV0dXJuIE5TKHQsW3trZXk6ImFkZCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcyxpPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkoaSkscj0wO3I8aTtyKyspYVtyXT1hcmd1bWVudHNbcl07dmFyIG89YS5yZWR1Y2UodGhpcy5fcHVsbERlZmluaXRpb25zLHt9KTtPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2UuZGVmaW5pdGlvbnNbZF09T3Qoe30sZS5kZWZpbml0aW9uc1tkXXx8e30sb1tkXSksQTkoZCxvW2RdKSxQOSgpfSl9fSx7a2V5OiJyZXNldCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmRlZmluaXRpb25zPXt9fX0se2tleToiX3B1bGxEZWZpbml0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSxpKXt2YXIgYT1pLnByZWZpeCYmaS5pY29uTmFtZSYmaS5pY29uP3swOml9Omk7cmV0dXJuIE9iamVjdC5rZXlzKGEpLm1hcChmdW5jdGlvbihyKXt2YXIgbz1hW3JdLGQ9by5wcmVmaXgscD1vLmljb25OYW1lLGc9by5pY29uO2VbZF18fChlW2RdPXt9KSxlW2RdW3BdPWd9KSxlfX1dKSx0fSkoKTtMZT1uZXcgcnosY3o9ZnVuY3Rpb24oKXt1dC5hdXRvUmVwbGFjZVN2Zz0hMSx1dC5vYnNlcnZlTXV0YXRpb25zPSExLE5rKCl9LFcwPSExLGlsPXtpMnN2ZzpmdW5jdGlvbigpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTp7fTtpZihNYSl7aTQoKTt2YXIgZT1uLm5vZGUsaT1lPT09dm9pZCAwP0gxOmUsYT1uLmNhbGxiYWNrLHI9YT09PXZvaWQgMD9mdW5jdGlvbigpe306YTtyZXR1cm4gdXQuc2VhcmNoUHNldWRvRWxlbWVudHMmJm85KGkpLG45KGkscil9ZWxzZSByZXR1cm4gUDIucmVqZWN0KCJPcGVyYXRpb24gcmVxdWlyZXMgYSBET00gb2Ygc29tZSBraW5kLiIpfSxjc3M6QjYsaW5zZXJ0Q3NzOmZ1bmN0aW9uKCl7VzB8fCh3OShCNigpKSxXMD0hMCl9LHdhdGNoOmZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LGU9bi5hdXRvUmVwbGFjZVN2Z1Jvb3QsaT1uLm9ic2VydmVNdXRhdGlvbnNSb290O3V0LmF1dG9SZXBsYWNlU3ZnPT09ITEmJih1dC5hdXRvUmVwbGFjZVN2Zz0hMCksdXQub2JzZXJ2ZU11dGF0aW9ucz0hMCxsayhmdW5jdGlvbigpe2Z6KHthdXRvUmVwbGFjZVN2Z1Jvb3Q6ZX0pLEhrKHt0cmVlQ2FsbGJhY2s6bjksbm9kZUNhbGxiYWNrOnR6LHBzZXVkb0VsZW1lbnRzQ2FsbGJhY2s6bzksb2JzZXJ2ZU11dGF0aW9uc1Jvb3Q6aX0pfSl9fSxzej17dHJhbnNmb3JtOmZ1bmN0aW9uKG4pe3JldHVybiBIOShuKX19LGx6PW96KGZ1bmN0aW9uKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxlPW4udHJhbnNmb3JtLGk9ZT09PXZvaWQgMD9DYTplLGE9bi5zeW1ib2wscj1hPT09dm9pZCAwPyExOmEsbz1uLm1hc2ssZD1vPT09dm9pZCAwP251bGw6byxwPW4ubWFza0lkLGc9cD09PXZvaWQgMD9udWxsOnAsXz1uLnRpdGxlLHk9Xz09PXZvaWQgMD9udWxsOl8sST1uLnRpdGxlSWQsUD1JPT09dm9pZCAwP251bGw6SSxWPW4uY2xhc3NlcyxPPVY9PT12b2lkIDA/W106VixVPW4uYXR0cmlidXRlcyxRPVU9PT12b2lkIDA/e306VSxmZT1uLnN0eWxlcyxPZT1mZT09PXZvaWQgMD97fTpmZTtpZih0KXt2YXIgTWU9dC5wcmVmaXgscnQ9dC5pY29uTmFtZSxOZT10Lmljb247cmV0dXJuIFowKE90KHt0eXBlOiJpY29uIn0sdCksZnVuY3Rpb24oKXtyZXR1cm4gaTQoKSx1dC5hdXRvQTExeSYmKHk/UVsiYXJpYS1sYWJlbGxlZGJ5Il09IiIuY29uY2F0KHV0LnJlcGxhY2VtZW50Q2xhc3MsIi10aXRsZS0iKS5jb25jYXQoUHx8ZTQoKSk6KFFbImFyaWEtaGlkZGVuIl09InRydWUiLFEuZm9jdXNhYmxlPSJmYWxzZSIpKSwkNih7aWNvbnM6e21haW46UjYoTmUpLG1hc2s6ZD9SNihkLmljb24pOntmb3VuZDohMSx3aWR0aDpudWxsLGhlaWdodDpudWxsLGljb246e319fSxwcmVmaXg6TWUsaWNvbk5hbWU6cnQsdHJhbnNmb3JtOk90KHt9LENhLGkpLHN5bWJvbDpyLHRpdGxlOnksbWFza0lkOmcsdGl0bGVJZDpQLGV4dHJhOnthdHRyaWJ1dGVzOlEsc3R5bGVzOk9lLGNsYXNzZXM6T319KX0pfX0pLGR6PWZ1bmN0aW9uKG4pe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxpPWUudHJhbnNmb3JtLGE9aT09PXZvaWQgMD9DYTppLHI9ZS50aXRsZSxvPXI9PT12b2lkIDA/bnVsbDpyLGQ9ZS5jbGFzc2VzLHA9ZD09PXZvaWQgMD9bXTpkLGc9ZS5hdHRyaWJ1dGVzLF89Zz09PXZvaWQgMD97fTpnLHk9ZS5zdHlsZXMsST15PT09dm9pZCAwP3t9Onk7cmV0dXJuIFowKHt0eXBlOiJ0ZXh0Iixjb250ZW50Om59LGZ1bmN0aW9uKCl7cmV0dXJuIGk0KCksejkoe2NvbnRlbnQ6bix0cmFuc2Zvcm06T3Qoe30sQ2EsYSksdGl0bGU6byxleHRyYTp7YXR0cmlidXRlczpfLHN0eWxlczpJLGNsYXNzZXM6WyIiLmNvbmNhdCh1dC5mYW1pbHlQcmVmaXgsIi1sYXllcnMtdGV4dCIpXS5jb25jYXQocTYocCkpfX0pfSl9LG16PWZ1bmN0aW9uKG4pe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7fSxpPWUudGl0bGUsYT1pPT09dm9pZCAwP251bGw6aSxyPWUuY2xhc3NlcyxvPXI9PT12b2lkIDA/W106cixkPWUuYXR0cmlidXRlcyxwPWQ9PT12b2lkIDA/e306ZCxnPWUuc3R5bGVzLF89Zz09PXZvaWQgMD97fTpnO3JldHVybiBaMCh7dHlwZToiY291bnRlciIsY29udGVudDpufSxmdW5jdGlvbigpe3JldHVybiBpNCgpLHprKHtjb250ZW50Om4udG9TdHJpbmcoKSx0aXRsZTphLGV4dHJhOnthdHRyaWJ1dGVzOnAsc3R5bGVzOl8sY2xhc3NlczpbIiIuY29uY2F0KHV0LmZhbWlseVByZWZpeCwiLWxheWVycy1jb3VudGVyIildLmNvbmNhdChxNihvKSl9fSl9KX0saHo9ZnVuY3Rpb24obil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOnt9LGk9ZS5jbGFzc2VzLGE9aT09PXZvaWQgMD9bXTppO3JldHVybiBaMCh7dHlwZToibGF5ZXIifSxmdW5jdGlvbigpe2k0KCk7dmFyIHI9W107cmV0dXJuIG4oZnVuY3Rpb24obyl7QXJyYXkuaXNBcnJheShvKT9vLm1hcChmdW5jdGlvbihkKXtyPXIuY29uY2F0KGQuYWJzdHJhY3QpfSk6cj1yLmNvbmNhdChvLmFic3RyYWN0KX0pLFt7dGFnOiJzcGFuIixhdHRyaWJ1dGVzOntjbGFzczpbIiIuY29uY2F0KHV0LmZhbWlseVByZWZpeCwiLWxheWVycyIpXS5jb25jYXQocTYoYSkpLmpvaW4oIiAiKX0sY2hpbGRyZW46cn1dfSl9LHB6PXtub0F1dG86Y3osY29uZmlnOnV0LGRvbTppbCxsaWJyYXJ5OkxlLHBhcnNlOnN6LGZpbmRJY29uRGVmaW5pdGlvbjpVNixpY29uOmx6LHRleHQ6ZHosY291bnRlcjpteixsYXllcjpoeix0b0h0bWw6RXJ9LGZ6PWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOnt9LGU9bi5hdXRvUmVwbGFjZVN2Z1Jvb3QsaT1lPT09dm9pZCAwP0gxOmU7KE9iamVjdC5rZXlzKEwyLnN0eWxlcykubGVuZ3RoPjB8fHV0LmF1dG9GZXRjaFN2ZykmJk1hJiZ1dC5hdXRvUmVwbGFjZVN2ZyYmcHouZG9tLmkyc3ZnKHtub2RlOml9KX19KTtmdW5jdGlvbiB1eih0LG4pe31mdW5jdGlvbiBieih0KXtsZXQgbj1mdCh0KSxlPW5ldyBOO3JldHVybnt2YWx1ZVNpZ25hbDpuLGdldCB2YWx1ZSgpe3JldHVybiBuKCl9LGNoYW5nZTplLG5nT25EZXN0cm95KCl7ZS5jb21wbGV0ZSgpfX19ZnVuY3Rpb24gYWwodCxuKXtsZXQgZT10Lmxlbmd0aDtmb3IoO2UtLTspbih0W2VdKX12YXIgWmEsbmwsYTQsZ3osdnosX3oscmwsRjksQjk9eCgoKT0+e2soKTtrKCk7WHQoKTtFbigpO0VTKCk7VFMoKTttbSgpO3pTKCk7WTIoKTtsdCgpO0FTKCk7eW0oKTtfbSgpO1phPWNsYXNze3ZpZXdDb250YWluZXJSZWY7aW5qZWN0b3I7aWQ7cm9sZT0iZGlhbG9nIjtwYW5lbENsYXNzPSIiO2hhc0JhY2tkcm9wPSEwO2JhY2tkcm9wQ2xhc3M9IiI7ZGlzYWJsZUNsb3NlPSExO2Nsb3NlUHJlZGljYXRlO3dpZHRoPSIiO2hlaWdodD0iIjttaW5XaWR0aDttaW5IZWlnaHQ7bWF4V2lkdGg7bWF4SGVpZ2h0O3Bvc2l0aW9uU3RyYXRlZ3k7ZGF0YT1udWxsO2RpcmVjdGlvbjthcmlhRGVzY3JpYmVkQnk9bnVsbDthcmlhTGFiZWxsZWRCeT1udWxsO2FyaWFMYWJlbD1udWxsO2FyaWFNb2RhbD0hMTthdXRvRm9jdXM9ImZpcnN0LXRhYmJhYmxlIjtyZXN0b3JlRm9jdXM9ITA7c2Nyb2xsU3RyYXRlZ3k7Y2xvc2VPbk5hdmlnYXRpb249ITA7Y2xvc2VPbkRlc3Ryb3k9ITA7Y2xvc2VPbk92ZXJsYXlEZXRhY2htZW50cz0hMDtkaXNhYmxlQW5pbWF0aW9ucz0hMTtwcm92aWRlcnM7Y29udGFpbmVyO3RlbXBsYXRlQ29udGV4dH0sbmw9KCgpPT57Y2xhc3MgdCBleHRlbmRzIGNte19lbGVtZW50UmVmPWgoYWUpO19mb2N1c1RyYXBGYWN0b3J5PWgodzApO19jb25maWc7X2ludGVyYWN0aXZpdHlDaGVja2VyPWgoUW8pO19uZ1pvbmU9aChyZSk7X2ZvY3VzTW9uaXRvcj1oKFgxKTtfcmVuZGVyZXI9aCh2MSk7X2NoYW5nZURldGVjdG9yUmVmPWgoRWUpO19pbmplY3Rvcj1oKHN0KTtfcGxhdGZvcm09aChiMSk7X2RvY3VtZW50PWgoanQpO19wb3J0YWxPdXRsZXQ7X2ZvY3VzVHJhcHBlZD1uZXcgd2U7X2ZvY3VzVHJhcD1udWxsO19lbGVtZW50Rm9jdXNlZEJlZm9yZURpYWxvZ1dhc09wZW5lZD1udWxsO19jbG9zZUludGVyYWN0aW9uVHlwZT1udWxsO19hcmlhTGFiZWxsZWRCeVF1ZXVlPVtdO19pc0Rlc3Ryb3llZD0hMTtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5fY29uZmlnPWgoWmEse29wdGlvbmFsOiEwfSl8fG5ldyBaYSx0aGlzLl9jb25maWcuYXJpYUxhYmVsbGVkQnkmJnRoaXMuX2FyaWFMYWJlbGxlZEJ5UXVldWUucHVzaCh0aGlzLl9jb25maWcuYXJpYUxhYmVsbGVkQnkpfV9hZGRBcmlhTGFiZWxsZWRCeShlKXt0aGlzLl9hcmlhTGFiZWxsZWRCeVF1ZXVlLnB1c2goZSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X3JlbW92ZUFyaWFMYWJlbGxlZEJ5KGUpe2xldCBpPXRoaXMuX2FyaWFMYWJlbGxlZEJ5UXVldWUuaW5kZXhPZihlKTtpPi0xJiYodGhpcy5fYXJpYUxhYmVsbGVkQnlRdWV1ZS5zcGxpY2UoaSwxKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9X2NvbnRlbnRBdHRhY2hlZCgpe3RoaXMuX2luaXRpYWxpemVGb2N1c1RyYXAoKSx0aGlzLl9jYXB0dXJlSW5pdGlhbEZvY3VzKCl9X2NhcHR1cmVJbml0aWFsRm9jdXMoKXt0aGlzLl90cmFwRm9jdXMoKX1uZ09uRGVzdHJveSgpe3RoaXMuX2ZvY3VzVHJhcHBlZC5jb21wbGV0ZSgpLHRoaXMuX2lzRGVzdHJveWVkPSEwLHRoaXMuX3Jlc3RvcmVGb2N1cygpfWF0dGFjaENvbXBvbmVudFBvcnRhbChlKXt0aGlzLl9wb3J0YWxPdXRsZXQuaGFzQXR0YWNoZWQoKTtsZXQgaT10aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoQ29tcG9uZW50UG9ydGFsKGUpO3JldHVybiB0aGlzLl9jb250ZW50QXR0YWNoZWQoKSxpfWF0dGFjaFRlbXBsYXRlUG9ydGFsKGUpe3RoaXMuX3BvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpO2xldCBpPXRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2hUZW1wbGF0ZVBvcnRhbChlKTtyZXR1cm4gdGhpcy5fY29udGVudEF0dGFjaGVkKCksaX1hdHRhY2hEb21Qb3J0YWw9ZT0+e3RoaXMuX3BvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpO2xldCBpPXRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2hEb21Qb3J0YWwoZSk7cmV0dXJuIHRoaXMuX2NvbnRlbnRBdHRhY2hlZCgpLGl9O19yZWNhcHR1cmVGb2N1cygpe3RoaXMuX2NvbnRhaW5zRm9jdXMoKXx8dGhpcy5fdHJhcEZvY3VzKCl9X2ZvcmNlRm9jdXMoZSxpKXt0aGlzLl9pbnRlcmFjdGl2aXR5Q2hlY2tlci5pc0ZvY3VzYWJsZShlKXx8KGUudGFiSW5kZXg9LTEsdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57bGV0IGE9KCk9PntyKCksbygpLGUucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpfSxyPXRoaXMuX3JlbmRlcmVyLmxpc3RlbihlLCJibHVyIixhKSxvPXRoaXMuX3JlbmRlcmVyLmxpc3RlbihlLCJtb3VzZWRvd24iLGEpfSkpLGUuZm9jdXMoaSl9X2ZvY3VzQnlDc3NTZWxlY3RvcihlLGkpe2xldCBhPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGUpO2EmJnRoaXMuX2ZvcmNlRm9jdXMoYSxpKX1fdHJhcEZvY3VzKGUpe3RoaXMuX2lzRGVzdHJveWVkfHxtMSgoKT0+e2xldCBpPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtzd2l0Y2godGhpcy5fY29uZmlnLmF1dG9Gb2N1cyl7Y2FzZSExOmNhc2UiZGlhbG9nIjp0aGlzLl9jb250YWluc0ZvY3VzKCl8fGkuZm9jdXMoZSk7YnJlYWs7Y2FzZSEwOmNhc2UiZmlyc3QtdGFiYmFibGUiOnRoaXMuX2ZvY3VzVHJhcD8uZm9jdXNJbml0aWFsRWxlbWVudChlKXx8dGhpcy5fZm9jdXNEaWFsb2dDb250YWluZXIoZSk7YnJlYWs7Y2FzZSJmaXJzdC1oZWFkaW5nIjp0aGlzLl9mb2N1c0J5Q3NzU2VsZWN0b3IoJ2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIFtyb2xlPSJoZWFkaW5nIl0nLGUpO2JyZWFrO2RlZmF1bHQ6dGhpcy5fZm9jdXNCeUNzc1NlbGVjdG9yKHRoaXMuX2NvbmZpZy5hdXRvRm9jdXMsZSk7YnJlYWt9dGhpcy5fZm9jdXNUcmFwcGVkLm5leHQoKX0se2luamVjdG9yOnRoaXMuX2luamVjdG9yfSl9X3Jlc3RvcmVGb2N1cygpe2xldCBlPXRoaXMuX2NvbmZpZy5yZXN0b3JlRm9jdXMsaT1udWxsO2lmKHR5cGVvZiBlPT0ic3RyaW5nIj9pPXRoaXMuX2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk6dHlwZW9mIGU9PSJib29sZWFuIj9pPWU/dGhpcy5fZWxlbWVudEZvY3VzZWRCZWZvcmVEaWFsb2dXYXNPcGVuZWQ6bnVsbDplJiYoaT1lKSx0aGlzLl9jb25maWcucmVzdG9yZUZvY3VzJiZpJiZ0eXBlb2YgaS5mb2N1cz09ImZ1bmN0aW9uIil7bGV0IGE9cWEoKSxyPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsoIWF8fGE9PT10aGlzLl9kb2N1bWVudC5ib2R5fHxhPT09cnx8ci5jb250YWlucyhhKSkmJih0aGlzLl9mb2N1c01vbml0b3I/KHRoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYShpLHRoaXMuX2Nsb3NlSW50ZXJhY3Rpb25UeXBlKSx0aGlzLl9jbG9zZUludGVyYWN0aW9uVHlwZT1udWxsKTppLmZvY3VzKCkpfXRoaXMuX2ZvY3VzVHJhcCYmdGhpcy5fZm9jdXNUcmFwLmRlc3Ryb3koKX1fZm9jdXNEaWFsb2dDb250YWluZXIoZSl7dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzPy4oZSl9X2NvbnRhaW5zRm9jdXMoKXtsZXQgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsaT1xYSgpO3JldHVybiBlPT09aXx8ZS5jb250YWlucyhpKX1faW5pdGlhbGl6ZUZvY3VzVHJhcCgpe3RoaXMuX3BsYXRmb3JtLmlzQnJvd3NlciYmKHRoaXMuX2ZvY3VzVHJhcD10aGlzLl9mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLHRoaXMuX2RvY3VtZW50JiYodGhpcy5fZWxlbWVudEZvY3VzZWRCZWZvcmVEaWFsb2dXYXNPcGVuZWQ9cWEoKSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImNkay1kaWFsb2ctY29udGFpbmVyIl1dLHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmdGUoS2ksNyksaSYyKXtsZXQgcjtGKHI9QigpKSYmKGEuX3BvcnRhbE91dGxldD1yLmZpcnN0KX19LGhvc3RBdHRyczpbInRhYmluZGV4IiwiLTEiLDEsImNkay1kaWFsb2ctY29udGFpbmVyIl0saG9zdFZhcnM6Nixob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJkcoImlkIixhLl9jb25maWcuaWR8fG51bGwpKCJyb2xlIixhLl9jb25maWcucm9sZSkoImFyaWEtbW9kYWwiLGEuX2NvbmZpZy5hcmlhTW9kYWwpKCJhcmlhLWxhYmVsbGVkYnkiLGEuX2NvbmZpZy5hcmlhTGFiZWw/bnVsbDphLl9hcmlhTGFiZWxsZWRCeVF1ZXVlWzBdKSgiYXJpYS1sYWJlbCIsYS5fY29uZmlnLmFyaWFMYWJlbCkoImFyaWEtZGVzY3JpYmVkYnkiLGEuX2NvbmZpZy5hcmlhRGVzY3JpYmVkQnl8fG51bGwpfSxmZWF0dXJlczpbRmVdLGRlY2xzOjEsdmFyczowLGNvbnN0czpbWyJjZGtQb3J0YWxPdXRsZXQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJlIoMCx1eiwwLDAsIm5nLXRlbXBsYXRlIiwwKX0sZGVwZW5kZW5jaWVzOltLaV0sc3R5bGVzOltgLmNkay1kaWFsb2ctY29udGFpbmVye2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTttaW4taGVpZ2h0OmluaGVyaXQ7bWF4LWhlaWdodDppbmhlcml0fQpgXSxlbmNhcHN1bGF0aW9uOjJ9KX1yZXR1cm4gdH0pKCksYTQ9Y2xhc3N7b3ZlcmxheVJlZjtjb25maWc7Y29tcG9uZW50SW5zdGFuY2U7Y29tcG9uZW50UmVmO2NvbnRhaW5lckluc3RhbmNlO2Rpc2FibGVDbG9zZTtjbG9zZWQ9bmV3IHdlO2JhY2tkcm9wQ2xpY2s7a2V5ZG93bkV2ZW50cztvdXRzaWRlUG9pbnRlckV2ZW50cztpZDtfZGV0YWNoU3Vic2NyaXB0aW9uO2NvbnN0cnVjdG9yKG4sZSl7dGhpcy5vdmVybGF5UmVmPW4sdGhpcy5jb25maWc9ZSx0aGlzLmRpc2FibGVDbG9zZT1lLmRpc2FibGVDbG9zZSx0aGlzLmJhY2tkcm9wQ2xpY2s9bi5iYWNrZHJvcENsaWNrKCksdGhpcy5rZXlkb3duRXZlbnRzPW4ua2V5ZG93bkV2ZW50cygpLHRoaXMub3V0c2lkZVBvaW50ZXJFdmVudHM9bi5vdXRzaWRlUG9pbnRlckV2ZW50cygpLHRoaXMuaWQ9ZS5pZCx0aGlzLmtleWRvd25FdmVudHMuc3Vic2NyaWJlKGk9PntpLmtleUNvZGU9PT0yNyYmIXRoaXMuZGlzYWJsZUNsb3NlJiYhczEoaSkmJihpLnByZXZlbnREZWZhdWx0KCksdGhpcy5jbG9zZSh2b2lkIDAse2ZvY3VzT3JpZ2luOiJrZXlib2FyZCJ9KSl9KSx0aGlzLmJhY2tkcm9wQ2xpY2suc3Vic2NyaWJlKCgpPT57IXRoaXMuZGlzYWJsZUNsb3NlJiZ0aGlzLl9jYW5DbG9zZSgpP3RoaXMuY2xvc2Uodm9pZCAwLHtmb2N1c09yaWdpbjoibW91c2UifSk6dGhpcy5jb250YWluZXJJbnN0YW5jZS5fcmVjYXB0dXJlRm9jdXM/LigpfSksdGhpcy5fZGV0YWNoU3Vic2NyaXB0aW9uPW4uZGV0YWNobWVudHMoKS5zdWJzY3JpYmUoKCk9PntlLmNsb3NlT25PdmVybGF5RGV0YWNobWVudHMhPT0hMSYmdGhpcy5jbG9zZSgpfSl9Y2xvc2UobixlKXtpZih0aGlzLl9jYW5DbG9zZShuKSl7bGV0IGk9dGhpcy5jbG9zZWQ7dGhpcy5jb250YWluZXJJbnN0YW5jZS5fY2xvc2VJbnRlcmFjdGlvblR5cGU9ZT8uZm9jdXNPcmlnaW58fCJwcm9ncmFtIix0aGlzLl9kZXRhY2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpLGkubmV4dChuKSxpLmNvbXBsZXRlKCksdGhpcy5jb21wb25lbnRJbnN0YW5jZT10aGlzLmNvbnRhaW5lckluc3RhbmNlPW51bGx9fXVwZGF0ZVBvc2l0aW9uKCl7cmV0dXJuIHRoaXMub3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpLHRoaXN9dXBkYXRlU2l6ZShuPSIiLGU9IiIpe3JldHVybiB0aGlzLm92ZXJsYXlSZWYudXBkYXRlU2l6ZSh7d2lkdGg6bixoZWlnaHQ6ZX0pLHRoaXN9YWRkUGFuZWxDbGFzcyhuKXtyZXR1cm4gdGhpcy5vdmVybGF5UmVmLmFkZFBhbmVsQ2xhc3MobiksdGhpc31yZW1vdmVQYW5lbENsYXNzKG4pe3JldHVybiB0aGlzLm92ZXJsYXlSZWYucmVtb3ZlUGFuZWxDbGFzcyhuKSx0aGlzfV9jYW5DbG9zZShuKXtsZXQgZT10aGlzLmNvbmZpZztyZXR1cm4hIXRoaXMuY29udGFpbmVySW5zdGFuY2UmJighZS5jbG9zZVByZWRpY2F0ZXx8ZS5jbG9zZVByZWRpY2F0ZShuLGUsdGhpcy5jb21wb25lbnRJbnN0YW5jZSkpfX0sZ3o9bmV3IGNlKCJEaWFsb2dTY3JvbGxTdHJhdGVneSIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9PntsZXQgdD1oKHN0KTtyZXR1cm4oKT0+Q3IodCl9fSksdno9bmV3IGNlKCJEaWFsb2dEYXRhIiksX3o9bmV3IGNlKCJEZWZhdWx0RGlhbG9nQ29uZmlnIik7cmw9KCgpPT57Y2xhc3MgdHtfaW5qZWN0b3I9aChzdCk7X2RlZmF1bHRPcHRpb25zPWgoX3ose29wdGlvbmFsOiEwfSk7X3BhcmVudERpYWxvZz1oKHQse29wdGlvbmFsOiEwLHNraXBTZWxmOiEwfSk7X292ZXJsYXlDb250YWluZXI9aCh4bSk7X2lkR2VuZXJhdG9yPWgocXQpO19vcGVuRGlhbG9nc0F0VGhpc0xldmVsPVtdO19hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsPW5ldyB3ZTtfYWZ0ZXJPcGVuZWRBdFRoaXNMZXZlbD1uZXcgd2U7X2FyaWFIaWRkZW5FbGVtZW50cz1uZXcgTWFwO19zY3JvbGxTdHJhdGVneT1oKGd6KTtnZXQgb3BlbkRpYWxvZ3MoKXtyZXR1cm4gdGhpcy5fcGFyZW50RGlhbG9nP3RoaXMuX3BhcmVudERpYWxvZy5vcGVuRGlhbG9nczp0aGlzLl9vcGVuRGlhbG9nc0F0VGhpc0xldmVsfWdldCBhZnRlck9wZW5lZCgpe3JldHVybiB0aGlzLl9wYXJlbnREaWFsb2c/dGhpcy5fcGFyZW50RGlhbG9nLmFmdGVyT3BlbmVkOnRoaXMuX2FmdGVyT3BlbmVkQXRUaGlzTGV2ZWx9YWZ0ZXJBbGxDbG9zZWQ9bXIoKCk9PnRoaXMub3BlbkRpYWxvZ3MubGVuZ3RoP3RoaXMuX2dldEFmdGVyQWxsQ2xvc2VkKCk6dGhpcy5fZ2V0QWZ0ZXJBbGxDbG9zZWQoKS5waXBlKGkxKHZvaWQgMCkpKTtjb25zdHJ1Y3Rvcigpe31vcGVuKGUsaSl7bGV0IGE9dGhpcy5fZGVmYXVsdE9wdGlvbnN8fG5ldyBaYTtpPVhlKFhlKHt9LGEpLGkpLGkuaWQ9aS5pZHx8dGhpcy5faWRHZW5lcmF0b3IuZ2V0SWQoImNkay1kaWFsb2ctIiksaS5pZCYmdGhpcy5nZXREaWFsb2dCeUlkKGkuaWQpO2xldCByPXRoaXMuX2dldE92ZXJsYXlDb25maWcoaSksbz11YSh0aGlzLl9pbmplY3RvcixyKSxkPW5ldyBhNChvLGkpLHA9dGhpcy5fYXR0YWNoQ29udGFpbmVyKG8sZCxpKTtpZihkLmNvbnRhaW5lckluc3RhbmNlPXAsIXRoaXMub3BlbkRpYWxvZ3MubGVuZ3RoKXtsZXQgZz10aGlzLl9vdmVybGF5Q29udGFpbmVyLmdldENvbnRhaW5lckVsZW1lbnQoKTtwLl9mb2N1c1RyYXBwZWQ/cC5fZm9jdXNUcmFwcGVkLnBpcGUoajEoMSkpLnN1YnNjcmliZSgoKT0+e3RoaXMuX2hpZGVOb25EaWFsb2dDb250ZW50RnJvbUFzc2lzdGl2ZVRlY2hub2xvZ3koZyl9KTp0aGlzLl9oaWRlTm9uRGlhbG9nQ29udGVudEZyb21Bc3Npc3RpdmVUZWNobm9sb2d5KGcpfXJldHVybiB0aGlzLl9hdHRhY2hEaWFsb2dDb250ZW50KGUsZCxwLGkpLHRoaXMub3BlbkRpYWxvZ3MucHVzaChkKSxkLmNsb3NlZC5zdWJzY3JpYmUoKCk9PnRoaXMuX3JlbW92ZU9wZW5EaWFsb2coZCwhMCkpLHRoaXMuYWZ0ZXJPcGVuZWQubmV4dChkKSxkfWNsb3NlQWxsKCl7YWwodGhpcy5vcGVuRGlhbG9ncyxlPT5lLmNsb3NlKCkpfWdldERpYWxvZ0J5SWQoZSl7cmV0dXJuIHRoaXMub3BlbkRpYWxvZ3MuZmluZChpPT5pLmlkPT09ZSl9bmdPbkRlc3Ryb3koKXthbCh0aGlzLl9vcGVuRGlhbG9nc0F0VGhpc0xldmVsLGU9PntlLmNvbmZpZy5jbG9zZU9uRGVzdHJveT09PSExJiZ0aGlzLl9yZW1vdmVPcGVuRGlhbG9nKGUsITEpfSksYWwodGhpcy5fb3BlbkRpYWxvZ3NBdFRoaXNMZXZlbCxlPT5lLmNsb3NlKCkpLHRoaXMuX2FmdGVyQWxsQ2xvc2VkQXRUaGlzTGV2ZWwuY29tcGxldGUoKSx0aGlzLl9hZnRlck9wZW5lZEF0VGhpc0xldmVsLmNvbXBsZXRlKCksdGhpcy5fb3BlbkRpYWxvZ3NBdFRoaXNMZXZlbD1bXX1fZ2V0T3ZlcmxheUNvbmZpZyhlKXtsZXQgaT1uZXcgSW4oe3Bvc2l0aW9uU3RyYXRlZ3k6ZS5wb3NpdGlvblN0cmF0ZWd5fHx5cigpLmNlbnRlckhvcml6b250YWxseSgpLmNlbnRlclZlcnRpY2FsbHkoKSxzY3JvbGxTdHJhdGVneTplLnNjcm9sbFN0cmF0ZWd5fHx0aGlzLl9zY3JvbGxTdHJhdGVneSgpLHBhbmVsQ2xhc3M6ZS5wYW5lbENsYXNzLGhhc0JhY2tkcm9wOmUuaGFzQmFja2Ryb3AsZGlyZWN0aW9uOmUuZGlyZWN0aW9uLG1pbldpZHRoOmUubWluV2lkdGgsbWluSGVpZ2h0OmUubWluSGVpZ2h0LG1heFdpZHRoOmUubWF4V2lkdGgsbWF4SGVpZ2h0OmUubWF4SGVpZ2h0LHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0LGRpc3Bvc2VPbk5hdmlnYXRpb246ZS5jbG9zZU9uTmF2aWdhdGlvbixkaXNhYmxlQW5pbWF0aW9uczplLmRpc2FibGVBbmltYXRpb25zfSk7cmV0dXJuIGUuYmFja2Ryb3BDbGFzcyYmKGkuYmFja2Ryb3BDbGFzcz1lLmJhY2tkcm9wQ2xhc3MpLGl9X2F0dGFjaENvbnRhaW5lcihlLGksYSl7bGV0IHI9YS5pbmplY3Rvcnx8YS52aWV3Q29udGFpbmVyUmVmPy5pbmplY3RvcixvPVt7cHJvdmlkZTpaYSx1c2VWYWx1ZTphfSx7cHJvdmlkZTphNCx1c2VWYWx1ZTppfSx7cHJvdmlkZTpNbSx1c2VWYWx1ZTplfV0sZDthLmNvbnRhaW5lcj90eXBlb2YgYS5jb250YWluZXI9PSJmdW5jdGlvbiI/ZD1hLmNvbnRhaW5lcjooZD1hLmNvbnRhaW5lci50eXBlLG8ucHVzaCguLi5hLmNvbnRhaW5lci5wcm92aWRlcnMoYSkpKTpkPW5sO2xldCBwPW5ldyBqYShkLGEudmlld0NvbnRhaW5lclJlZixzdC5jcmVhdGUoe3BhcmVudDpyfHx0aGlzLl9pbmplY3Rvcixwcm92aWRlcnM6b30pKTtyZXR1cm4gZS5hdHRhY2gocCkuaW5zdGFuY2V9X2F0dGFjaERpYWxvZ0NvbnRlbnQoZSxpLGEscil7aWYoZSBpbnN0YW5jZW9mIGgxKXtsZXQgbz10aGlzLl9jcmVhdGVJbmplY3RvcihyLGksYSx2b2lkIDApLGQ9eyRpbXBsaWNpdDpyLmRhdGEsZGlhbG9nUmVmOml9O3IudGVtcGxhdGVDb250ZXh0JiYoZD1YZShYZSh7fSxkKSx0eXBlb2Ygci50ZW1wbGF0ZUNvbnRleHQ9PSJmdW5jdGlvbiI/ci50ZW1wbGF0ZUNvbnRleHQoKTpyLnRlbXBsYXRlQ29udGV4dCkpLGEuYXR0YWNoVGVtcGxhdGVQb3J0YWwobmV3IHBhKGUsbnVsbCxkLG8pKX1lbHNle2xldCBvPXRoaXMuX2NyZWF0ZUluamVjdG9yKHIsaSxhLHRoaXMuX2luamVjdG9yKSxkPWEuYXR0YWNoQ29tcG9uZW50UG9ydGFsKG5ldyBqYShlLHIudmlld0NvbnRhaW5lclJlZixvKSk7aS5jb21wb25lbnRSZWY9ZCxpLmNvbXBvbmVudEluc3RhbmNlPWQuaW5zdGFuY2V9fV9jcmVhdGVJbmplY3RvcihlLGksYSxyKXtsZXQgbz1lLmluamVjdG9yfHxlLnZpZXdDb250YWluZXJSZWY/LmluamVjdG9yLGQ9W3twcm92aWRlOnZ6LHVzZVZhbHVlOmUuZGF0YX0se3Byb3ZpZGU6YTQsdXNlVmFsdWU6aX1dO3JldHVybiBlLnByb3ZpZGVycyYmKHR5cGVvZiBlLnByb3ZpZGVycz09ImZ1bmN0aW9uIj9kLnB1c2goLi4uZS5wcm92aWRlcnMoaSxlLGEpKTpkLnB1c2goLi4uZS5wcm92aWRlcnMpKSxlLmRpcmVjdGlvbiYmKCFvfHwhby5nZXQobjEsbnVsbCx7b3B0aW9uYWw6ITB9KSkmJmQucHVzaCh7cHJvdmlkZTpuMSx1c2VWYWx1ZTpieihlLmRpcmVjdGlvbil9KSxzdC5jcmVhdGUoe3BhcmVudDpvfHxyLHByb3ZpZGVyczpkfSl9X3JlbW92ZU9wZW5EaWFsb2coZSxpKXtsZXQgYT10aGlzLm9wZW5EaWFsb2dzLmluZGV4T2YoZSk7YT4tMSYmKHRoaXMub3BlbkRpYWxvZ3Muc3BsaWNlKGEsMSksdGhpcy5vcGVuRGlhbG9ncy5sZW5ndGh8fCh0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMuZm9yRWFjaCgocixvKT0+e3I/by5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIixyKTpvLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKX0pLHRoaXMuX2FyaWFIaWRkZW5FbGVtZW50cy5jbGVhcigpLGkmJnRoaXMuX2dldEFmdGVyQWxsQ2xvc2VkKCkubmV4dCgpKSl9X2hpZGVOb25EaWFsb2dDb250ZW50RnJvbUFzc2lzdGl2ZVRlY2hub2xvZ3koZSl7aWYoZS5wYXJlbnRFbGVtZW50KXtsZXQgaT1lLnBhcmVudEVsZW1lbnQuY2hpbGRyZW47Zm9yKGxldCBhPWkubGVuZ3RoLTE7YT4tMTthLS0pe2xldCByPWlbYV07ciE9PWUmJnIubm9kZU5hbWUhPT0iU0NSSVBUIiYmci5ub2RlTmFtZSE9PSJTVFlMRSImJiFyLmhhc0F0dHJpYnV0ZSgiYXJpYS1saXZlIikmJih0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMuc2V0KHIsci5nZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIikpLHIuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKSl9fX1fZ2V0QWZ0ZXJBbGxDbG9zZWQoKXtsZXQgZT10aGlzLl9wYXJlbnREaWFsb2c7cmV0dXJuIGU/ZS5fZ2V0QWZ0ZXJBbGxDbG9zZWQoKTp0aGlzLl9hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIHR9KSgpO0Y5PSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1bW9kPXhlKHt0eXBlOnR9KTtzdGF0aWMgXHUwMjc1aW5qPXllKHtwcm92aWRlcnM6W3JsXSxpbXBvcnRzOltCaSxmYSxHYSxmYV19KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiB5eih0LG4pe31mdW5jdGlvbiBHOSh0KXtyZXR1cm4gdD09bnVsbD9udWxsOnR5cGVvZiB0PT0ibnVtYmVyIj90OnQuZW5kc1dpdGgoIm1zIik/SWkodC5zdWJzdHJpbmcoMCx0Lmxlbmd0aC0yKSk6dC5lbmRzV2l0aCgicyIpP0lpKHQuc3Vic3RyaW5nKDAsdC5sZW5ndGgtMSkpKjFlMzp0PT09IjAiPzA6bnVsbH1mdW5jdGlvbiBjbCh0LG4sZSl7cmV0dXJuIHQuX2Nsb3NlSW50ZXJhY3Rpb25UeXBlPW4sdC5jbG9zZShlKX1mdW5jdGlvbiAkOSh0LG4pe2xldCBlPXQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O2Zvcig7ZSYmIWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJtYXQtbWRjLWRpYWxvZy1jb250YWluZXIiKTspZT1lLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGU/bi5maW5kKGk9PmkuaWQ9PT1lLmlkKTpudWxsfXZhciByNCxvbCxVOSxqOSx4eixNeixXOSxxOSxuNCx0YSxVaSxROSxZOSxOMSxQaSxaOSxvNCx0MixpMixzbCxLOT14KCgpPT57QjkoKTtQbigpO0VuKCk7aygpO2soKTtnYSgpO2ZpKCk7WHQoKTtsdCgpO1kyKCk7eGkoKTtEMigpO3kxKCk7cjQ9Y2xhc3N7dmlld0NvbnRhaW5lclJlZjtpbmplY3RvcjtpZDtyb2xlPSJkaWFsb2ciO3BhbmVsQ2xhc3M9IiI7aGFzQmFja2Ryb3A9ITA7YmFja2Ryb3BDbGFzcz0iIjtkaXNhYmxlQ2xvc2U9ITE7Y2xvc2VQcmVkaWNhdGU7d2lkdGg9IiI7aGVpZ2h0PSIiO21pbldpZHRoO21pbkhlaWdodDttYXhXaWR0aDttYXhIZWlnaHQ7cG9zaXRpb247ZGF0YT1udWxsO2RpcmVjdGlvbjthcmlhRGVzY3JpYmVkQnk9bnVsbDthcmlhTGFiZWxsZWRCeT1udWxsO2FyaWFMYWJlbD1udWxsO2FyaWFNb2RhbD0hMTthdXRvRm9jdXM9ImZpcnN0LXRhYmJhYmxlIjtyZXN0b3JlRm9jdXM9ITA7ZGVsYXlGb2N1c1RyYXA9ITA7c2Nyb2xsU3RyYXRlZ3k7Y2xvc2VPbk5hdmlnYXRpb249ITA7ZW50ZXJBbmltYXRpb25EdXJhdGlvbjtleGl0QW5pbWF0aW9uRHVyYXRpb259LG9sPSJtZGMtZGlhbG9nLS1vcGVuIixVOT0ibWRjLWRpYWxvZy0tb3BlbmluZyIsajk9Im1kYy1kaWFsb2ctLWNsb3NpbmciLHh6PTE1MCxNej03NSxXOT0oKCk9PntjbGFzcyB0IGV4dGVuZHMgbmx7X2FuaW1hdGlvblN0YXRlQ2hhbmdlZD1uZXcgTjtfYW5pbWF0aW9uc0VuYWJsZWQ9IVB0KCk7X2FjdGlvblNlY3Rpb25Db3VudD0wO19ob3N0RWxlbWVudD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7X2VudGVyQW5pbWF0aW9uRHVyYXRpb249dGhpcy5fYW5pbWF0aW9uc0VuYWJsZWQ/RzkodGhpcy5fY29uZmlnLmVudGVyQW5pbWF0aW9uRHVyYXRpb24pPz94ejowO19leGl0QW5pbWF0aW9uRHVyYXRpb249dGhpcy5fYW5pbWF0aW9uc0VuYWJsZWQ/RzkodGhpcy5fY29uZmlnLmV4aXRBbmltYXRpb25EdXJhdGlvbik/P016OjA7X2FuaW1hdGlvblRpbWVyPW51bGw7X2NvbnRlbnRBdHRhY2hlZCgpe3N1cGVyLl9jb250ZW50QXR0YWNoZWQoKSx0aGlzLl9zdGFydE9wZW5BbmltYXRpb24oKX1fc3RhcnRPcGVuQW5pbWF0aW9uKCl7dGhpcy5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkLmVtaXQoe3N0YXRlOiJvcGVuaW5nIix0b3RhbFRpbWU6dGhpcy5fZW50ZXJBbmltYXRpb25EdXJhdGlvbn0pLHRoaXMuX2FuaW1hdGlvbnNFbmFibGVkPyh0aGlzLl9ob3N0RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShxOSxgJHt0aGlzLl9lbnRlckFuaW1hdGlvbkR1cmF0aW9ufW1zYCksdGhpcy5fcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9ob3N0RWxlbWVudC5jbGFzc0xpc3QuYWRkKFU5LG9sKSksdGhpcy5fd2FpdEZvckFuaW1hdGlvblRvQ29tcGxldGUodGhpcy5fZW50ZXJBbmltYXRpb25EdXJhdGlvbix0aGlzLl9maW5pc2hEaWFsb2dPcGVuKSk6KHRoaXMuX2hvc3RFbGVtZW50LmNsYXNzTGlzdC5hZGQob2wpLFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PnRoaXMuX2ZpbmlzaERpYWxvZ09wZW4oKSkpfV9zdGFydEV4aXRBbmltYXRpb24oKXt0aGlzLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQuZW1pdCh7c3RhdGU6ImNsb3NpbmciLHRvdGFsVGltZTp0aGlzLl9leGl0QW5pbWF0aW9uRHVyYXRpb259KSx0aGlzLl9ob3N0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKG9sKSx0aGlzLl9hbmltYXRpb25zRW5hYmxlZD8odGhpcy5faG9zdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkocTksYCR7dGhpcy5fZXhpdEFuaW1hdGlvbkR1cmF0aW9ufW1zYCksdGhpcy5fcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9ob3N0RWxlbWVudC5jbGFzc0xpc3QuYWRkKGo5KSksdGhpcy5fd2FpdEZvckFuaW1hdGlvblRvQ29tcGxldGUodGhpcy5fZXhpdEFuaW1hdGlvbkR1cmF0aW9uLHRoaXMuX2ZpbmlzaERpYWxvZ0Nsb3NlKSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+dGhpcy5fZmluaXNoRGlhbG9nQ2xvc2UoKSl9X3VwZGF0ZUFjdGlvblNlY3Rpb25Db3VudChlKXt0aGlzLl9hY3Rpb25TZWN0aW9uQ291bnQrPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X2ZpbmlzaERpYWxvZ09wZW49KCk9Pnt0aGlzLl9jbGVhckFuaW1hdGlvbkNsYXNzZXMoKSx0aGlzLl9vcGVuQW5pbWF0aW9uRG9uZSh0aGlzLl9lbnRlckFuaW1hdGlvbkR1cmF0aW9uKX07X2ZpbmlzaERpYWxvZ0Nsb3NlPSgpPT57dGhpcy5fY2xlYXJBbmltYXRpb25DbGFzc2VzKCksdGhpcy5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkLmVtaXQoe3N0YXRlOiJjbG9zZWQiLHRvdGFsVGltZTp0aGlzLl9leGl0QW5pbWF0aW9uRHVyYXRpb259KX07X2NsZWFyQW5pbWF0aW9uQ2xhc3Nlcygpe3RoaXMuX2hvc3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoVTksajkpfV93YWl0Rm9yQW5pbWF0aW9uVG9Db21wbGV0ZShlLGkpe3RoaXMuX2FuaW1hdGlvblRpbWVyIT09bnVsbCYmY2xlYXJUaW1lb3V0KHRoaXMuX2FuaW1hdGlvblRpbWVyKSx0aGlzLl9hbmltYXRpb25UaW1lcj1zZXRUaW1lb3V0KGksZSl9X3JlcXVlc3RBbmltYXRpb25GcmFtZShlKXt0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lPT0iZnVuY3Rpb24iP3JlcXVlc3RBbmltYXRpb25GcmFtZShlKTplKCl9KX1fY2FwdHVyZUluaXRpYWxGb2N1cygpe3RoaXMuX2NvbmZpZy5kZWxheUZvY3VzVHJhcHx8dGhpcy5fdHJhcEZvY3VzKCl9X29wZW5BbmltYXRpb25Eb25lKGUpe3RoaXMuX2NvbmZpZy5kZWxheUZvY3VzVHJhcCYmdGhpcy5fdHJhcEZvY3VzKCksdGhpcy5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkLm5leHQoe3N0YXRlOiJvcGVuZWQiLHRvdGFsVGltZTplfSl9bmdPbkRlc3Ryb3koKXtzdXBlci5uZ09uRGVzdHJveSgpLHRoaXMuX2FuaW1hdGlvblRpbWVyIT09bnVsbCYmY2xlYXJUaW1lb3V0KHRoaXMuX2FuaW1hdGlvblRpbWVyKX1hdHRhY2hDb21wb25lbnRQb3J0YWwoZSl7bGV0IGk9c3VwZXIuYXR0YWNoQ29tcG9uZW50UG9ydGFsKGUpO3JldHVybiBpLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgibWF0LW1kYy1kaWFsb2ctY29tcG9uZW50LWhvc3QiKSxpfXN0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IGU7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybihlfHwoZT1rdCh0KSkpKGF8fHQpfX0pKCk7c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1kaWFsb2ctY29udGFpbmVyIl1dLGhvc3RBdHRyczpbInRhYmluZGV4IiwiLTEiLDEsIm1hdC1tZGMtZGlhbG9nLWNvbnRhaW5lciIsIm1kYy1kaWFsb2ciXSxob3N0VmFyczoxMCxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJihBaSgiaWQiLGEuX2NvbmZpZy5pZCksRygiYXJpYS1tb2RhbCIsYS5fY29uZmlnLmFyaWFNb2RhbCkoInJvbGUiLGEuX2NvbmZpZy5yb2xlKSgiYXJpYS1sYWJlbGxlZGJ5IixhLl9jb25maWcuYXJpYUxhYmVsP251bGw6YS5fYXJpYUxhYmVsbGVkQnlRdWV1ZVswXSkoImFyaWEtbGFiZWwiLGEuX2NvbmZpZy5hcmlhTGFiZWwpKCJhcmlhLWRlc2NyaWJlZGJ5IixhLl9jb25maWcuYXJpYURlc2NyaWJlZEJ5fHxudWxsKSxpZSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCFhLl9hbmltYXRpb25zRW5hYmxlZCkoIm1hdC1tZGMtZGlhbG9nLWNvbnRhaW5lci13aXRoLWFjdGlvbnMiLGEuX2FjdGlvblNlY3Rpb25Db3VudD4wKSl9LGZlYXR1cmVzOltGZV0sZGVjbHM6Myx2YXJzOjAsY29uc3RzOltbMSwibWF0LW1kYy1kaWFsb2ctaW5uZXItY29udGFpbmVyIiwibWRjLWRpYWxvZ19fY29udGFpbmVyIl0sWzEsIm1hdC1tZGMtZGlhbG9nLXN1cmZhY2UiLCJtZGMtZGlhbG9nX19zdXJmYWNlIl0sWyJjZGtQb3J0YWxPdXRsZXQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsImRpdiIsMCkoMSwiZGl2IiwxKSxSKDIseXosMCwwLCJuZy10ZW1wbGF0ZSIsMikscygpKCkpfSxkZXBlbmRlbmNpZXM6W0tpXSxzdHlsZXM6W2AubWF0LW1kYy1kaWFsb2ctY29udGFpbmVye3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7bWF4LWhlaWdodDppbmhlcml0O21pbi1oZWlnaHQ6aW5oZXJpdDttaW4td2lkdGg6aW5oZXJpdDttYXgtd2lkdGg6aW5oZXJpdDtvdXRsaW5lOjB9LmNkay1vdmVybGF5LXBhbmUubWF0LW1kYy1kaWFsb2ctcGFuZWx7bWF4LXdpZHRoOnZhcigtLW1hdC1kaWFsb2ctY29udGFpbmVyLW1heC13aWR0aCwgNTYwcHgpO21pbi13aWR0aDp2YXIoLS1tYXQtZGlhbG9nLWNvbnRhaW5lci1taW4td2lkdGgsIDI4MHB4KX1AbWVkaWEobWF4LXdpZHRoOiA1OTlweCl7LmNkay1vdmVybGF5LXBhbmUubWF0LW1kYy1kaWFsb2ctcGFuZWx7bWF4LXdpZHRoOnZhcigtLW1hdC1kaWFsb2ctY29udGFpbmVyLXNtYWxsLW1heC13aWR0aCwgY2FsYygxMDB2dyAtIDMycHgpKX19Lm1hdC1tZGMtZGlhbG9nLWlubmVyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYXJvdW5kO2JveC1zaXppbmc6Ym9yZGVyLWJveDtoZWlnaHQ6MTAwJTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IGxpbmVhciB2YXIoLS1tYXQtZGlhbG9nLXRyYW5zaXRpb24tZHVyYXRpb24sIDBtcyk7bWF4LWhlaWdodDppbmhlcml0O21pbi1oZWlnaHQ6aW5oZXJpdDttaW4td2lkdGg6aW5oZXJpdDttYXgtd2lkdGg6aW5oZXJpdH0ubWRjLWRpYWxvZy0tY2xvc2luZyAubWF0LW1kYy1kaWFsb2ctaW5uZXItY29udGFpbmVye3RyYW5zaXRpb246b3BhY2l0eSA3NW1zIGxpbmVhcjt0cmFuc2Zvcm06bm9uZX0ubWRjLWRpYWxvZy0tb3BlbiAubWF0LW1kYy1kaWFsb2ctaW5uZXItY29udGFpbmVye29wYWNpdHk6MX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1tZGMtZGlhbG9nLWlubmVyLWNvbnRhaW5lcnt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1tZGMtZGlhbG9nLXN1cmZhY2V7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWdyb3c6MDtmbGV4LXNocmluazowO2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93LXk6YXV0bztvdXRsaW5lOjA7dHJhbnNmb3JtOnNjYWxlKDAuOCk7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gdmFyKC0tbWF0LWRpYWxvZy10cmFuc2l0aW9uLWR1cmF0aW9uLCAwbXMpIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO21heC1oZWlnaHQ6aW5oZXJpdDttaW4taGVpZ2h0OmluaGVyaXQ7bWluLXdpZHRoOmluaGVyaXQ7bWF4LXdpZHRoOmluaGVyaXQ7Ym94LXNoYWRvdzp2YXIoLS1tYXQtZGlhbG9nLWNvbnRhaW5lci1lbGV2YXRpb24tc2hhZG93LCBub25lKTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1kaWFsb2ctY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1leHRyYS1sYXJnZSwgNHB4KSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtZGlhbG9nLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlLCB3aGl0ZSkpfVtkaXI9cnRsXSAubWF0LW1kYy1kaWFsb2ctc3VyZmFjZXt0ZXh0LWFsaWduOnJpZ2h0fS5tZGMtZGlhbG9nLS1vcGVuIC5tYXQtbWRjLWRpYWxvZy1zdXJmYWNlLC5tZGMtZGlhbG9nLS1jbG9zaW5nIC5tYXQtbWRjLWRpYWxvZy1zdXJmYWNle3RyYW5zZm9ybTpub25lfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LW1kYy1kaWFsb2ctc3VyZmFjZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1tZGMtZGlhbG9nLXN1cmZhY2U6OmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3A6MDtsZWZ0OjA7Ym9yZGVyOjJweCBzb2xpZCByZ2JhKDAsMCwwLDApO2JvcmRlci1yYWRpdXM6aW5oZXJpdDtjb250ZW50OiIiO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1tZGMtZGlhbG9nLXRpdGxle2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmU7ZmxleC1zaHJpbms6MDtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luOjAgMCAxcHg7cGFkZGluZzp2YXIoLS1tYXQtZGlhbG9nLWhlYWRsaW5lLXBhZGRpbmcsIDZweCAyNHB4IDEzcHgpfS5tYXQtbWRjLWRpYWxvZy10aXRsZTo6YmVmb3Jle2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjA7aGVpZ2h0OjQwcHg7Y29udGVudDoiIjt2ZXJ0aWNhbC1hbGlnbjowfVtkaXI9cnRsXSAubWF0LW1kYy1kaWFsb2ctdGl0bGV7dGV4dC1hbGlnbjpyaWdodH0ubWF0LW1kYy1kaWFsb2ctY29udGFpbmVyIC5tYXQtbWRjLWRpYWxvZy10aXRsZXtjb2xvcjp2YXIoLS1tYXQtZGlhbG9nLXN1YmhlYWQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSwgcmdiYSgwLCAwLCAwLCAwLjg3KSkpO2ZvbnQtZmFtaWx5OnZhcigtLW1hdC1kaWFsb2ctc3ViaGVhZC1mb250LCB2YXIoLS1tYXQtc3lzLWhlYWRsaW5lLXNtYWxsLWZvbnQsIGluaGVyaXQpKTtsaW5lLWhlaWdodDp2YXIoLS1tYXQtZGlhbG9nLXN1YmhlYWQtbGluZS1oZWlnaHQsIHZhcigtLW1hdC1zeXMtaGVhZGxpbmUtc21hbGwtbGluZS1oZWlnaHQsIDEuNXJlbSkpO2ZvbnQtc2l6ZTp2YXIoLS1tYXQtZGlhbG9nLXN1YmhlYWQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1oZWFkbGluZS1zbWFsbC1zaXplLCAxcmVtKSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LWRpYWxvZy1zdWJoZWFkLXdlaWdodCwgdmFyKC0tbWF0LXN5cy1oZWFkbGluZS1zbWFsbC13ZWlnaHQsIDQwMCkpO2xldHRlci1zcGFjaW5nOnZhcigtLW1hdC1kaWFsb2ctc3ViaGVhZC10cmFja2luZywgdmFyKC0tbWF0LXN5cy1oZWFkbGluZS1zbWFsbC10cmFja2luZywgMC4wMzEyNWVtKSl9Lm1hdC1tZGMtZGlhbG9nLWNvbnRlbnR7ZGlzcGxheTpibG9jaztmbGV4LWdyb3c6MTtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luOjA7b3ZlcmZsb3c6YXV0bzttYXgtaGVpZ2h0OjY1dmh9Lm1hdC1tZGMtZGlhbG9nLWNvbnRlbnQ+OmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0ubWF0LW1kYy1kaWFsb2ctY29udGVudD46bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9Lm1hdC1tZGMtZGlhbG9nLWNvbnRhaW5lciAubWF0LW1kYy1kaWFsb2ctY29udGVudHtjb2xvcjp2YXIoLS1tYXQtZGlhbG9nLXN1cHBvcnRpbmctdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQsIHJnYmEoMCwgMCwgMCwgMC42KSkpO2ZvbnQtZmFtaWx5OnZhcigtLW1hdC1kaWFsb2ctc3VwcG9ydGluZy10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tZm9udCwgaW5oZXJpdCkpO2xpbmUtaGVpZ2h0OnZhcigtLW1hdC1kaWFsb2ctc3VwcG9ydGluZy10ZXh0LWxpbmUtaGVpZ2h0LCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLWxpbmUtaGVpZ2h0LCAxLjVyZW0pKTtmb250LXNpemU6dmFyKC0tbWF0LWRpYWxvZy1zdXBwb3J0aW5nLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1zaXplLCAxcmVtKSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LWRpYWxvZy1zdXBwb3J0aW5nLXRleHQtd2VpZ2h0LCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLXdlaWdodCwgNDAwKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LWRpYWxvZy1zdXBwb3J0aW5nLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tdHJhY2tpbmcsIDAuMDMxMjVlbSkpfS5tYXQtbWRjLWRpYWxvZy1jb250YWluZXIgLm1hdC1tZGMtZGlhbG9nLWNvbnRlbnR7cGFkZGluZzp2YXIoLS1tYXQtZGlhbG9nLWNvbnRlbnQtcGFkZGluZywgMjBweCAyNHB4KX0ubWF0LW1kYy1kaWFsb2ctY29udGFpbmVyLXdpdGgtYWN0aW9ucyAubWF0LW1kYy1kaWFsb2ctY29udGVudHtwYWRkaW5nOnZhcigtLW1hdC1kaWFsb2ctd2l0aC1hY3Rpb25zLWNvbnRlbnQtcGFkZGluZywgMjBweCAyNHB4IDApfS5tYXQtbWRjLWRpYWxvZy1jb250YWluZXIgLm1hdC1tZGMtZGlhbG9nLXRpdGxlKy5tYXQtbWRjLWRpYWxvZy1jb250ZW50e3BhZGRpbmctdG9wOjB9Lm1hdC1tZGMtZGlhbG9nLWFjdGlvbnN7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtc2hyaW5rOjA7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6Y2VudGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveDttaW4taGVpZ2h0OjUycHg7bWFyZ2luOjA7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwwKTtwYWRkaW5nOnZhcigtLW1hdC1kaWFsb2ctYWN0aW9ucy1wYWRkaW5nLCAxNnB4IDI0cHgpO2p1c3RpZnktY29udGVudDp2YXIoLS1tYXQtZGlhbG9nLWFjdGlvbnMtYWxpZ25tZW50LCBmbGV4LWVuZCl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1hdC1tZGMtZGlhbG9nLWFjdGlvbnN7Ym9yZGVyLXRvcC1jb2xvcjpDYW52YXNUZXh0fX0ubWF0LW1kYy1kaWFsb2ctYWN0aW9ucy5tYXQtbWRjLWRpYWxvZy1hY3Rpb25zLWFsaWduLXN0YXJ0LC5tYXQtbWRjLWRpYWxvZy1hY3Rpb25zW2FsaWduPXN0YXJ0XXtqdXN0aWZ5LWNvbnRlbnQ6c3RhcnR9Lm1hdC1tZGMtZGlhbG9nLWFjdGlvbnMubWF0LW1kYy1kaWFsb2ctYWN0aW9ucy1hbGlnbi1jZW50ZXIsLm1hdC1tZGMtZGlhbG9nLWFjdGlvbnNbYWxpZ249Y2VudGVyXXtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5tYXQtbWRjLWRpYWxvZy1hY3Rpb25zLm1hdC1tZGMtZGlhbG9nLWFjdGlvbnMtYWxpZ24tZW5kLC5tYXQtbWRjLWRpYWxvZy1hY3Rpb25zW2FsaWduPWVuZF17anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5tYXQtbWRjLWRpYWxvZy1hY3Rpb25zIC5tYXQtYnV0dG9uLWJhc2UrLm1hdC1idXR0b24tYmFzZSwubWF0LW1kYy1kaWFsb2ctYWN0aW9ucyAubWF0LW1kYy1idXR0b24tYmFzZSsubWF0LW1kYy1idXR0b24tYmFzZXttYXJnaW4tbGVmdDo4cHh9W2Rpcj1ydGxdIC5tYXQtbWRjLWRpYWxvZy1hY3Rpb25zIC5tYXQtYnV0dG9uLWJhc2UrLm1hdC1idXR0b24tYmFzZSxbZGlyPXJ0bF0gLm1hdC1tZGMtZGlhbG9nLWFjdGlvbnMgLm1hdC1tZGMtYnV0dG9uLWJhc2UrLm1hdC1tZGMtYnV0dG9uLWJhc2V7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6OHB4fS5tYXQtbWRjLWRpYWxvZy1jb21wb25lbnQtaG9zdHtkaXNwbGF5OmNvbnRlbnRzfQpgXSxlbmNhcHN1bGF0aW9uOjJ9KX1yZXR1cm4gdH0pKCkscTk9Ii0tbWF0LWRpYWxvZy10cmFuc2l0aW9uLWR1cmF0aW9uIjtuND0oZnVuY3Rpb24odCl7cmV0dXJuIHRbdC5PUEVOPTBdPSJPUEVOIix0W3QuQ0xPU0lORz0xXT0iQ0xPU0lORyIsdFt0LkNMT1NFRD0yXT0iQ0xPU0VEIix0fSkobjR8fHt9KSx0YT1jbGFzc3tfcmVmO19jb25maWc7X2NvbnRhaW5lckluc3RhbmNlO2NvbXBvbmVudEluc3RhbmNlO2NvbXBvbmVudFJlZjtkaXNhYmxlQ2xvc2U7aWQ7X2FmdGVyT3BlbmVkPW5ldyB3ZTtfYmVmb3JlQ2xvc2VkPW5ldyB3ZTtfcmVzdWx0O19jbG9zZUZhbGxiYWNrVGltZW91dDtfc3RhdGU9bjQuT1BFTjtfY2xvc2VJbnRlcmFjdGlvblR5cGU7Y29uc3RydWN0b3IobixlLGkpe3RoaXMuX3JlZj1uLHRoaXMuX2NvbmZpZz1lLHRoaXMuX2NvbnRhaW5lckluc3RhbmNlPWksdGhpcy5kaXNhYmxlQ2xvc2U9ZS5kaXNhYmxlQ2xvc2UsdGhpcy5pZD1uLmlkLG4uYWRkUGFuZWxDbGFzcygibWF0LW1kYy1kaWFsb2ctcGFuZWwiKSxpLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQucGlwZSgkdChhPT5hLnN0YXRlPT09Im9wZW5lZCIpLGoxKDEpKS5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9hZnRlck9wZW5lZC5uZXh0KCksdGhpcy5fYWZ0ZXJPcGVuZWQuY29tcGxldGUoKX0pLGkuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5waXBlKCR0KGE9PmEuc3RhdGU9PT0iY2xvc2VkIiksajEoMSkpLnN1YnNjcmliZSgoKT0+e2NsZWFyVGltZW91dCh0aGlzLl9jbG9zZUZhbGxiYWNrVGltZW91dCksdGhpcy5fZmluaXNoRGlhbG9nQ2xvc2UoKX0pLG4ub3ZlcmxheVJlZi5kZXRhY2htZW50cygpLnN1YnNjcmliZSgoKT0+e3RoaXMuX2JlZm9yZUNsb3NlZC5uZXh0KHRoaXMuX3Jlc3VsdCksdGhpcy5fYmVmb3JlQ2xvc2VkLmNvbXBsZXRlKCksdGhpcy5fZmluaXNoRGlhbG9nQ2xvc2UoKX0pLEt0KHRoaXMuYmFja2Ryb3BDbGljaygpLHRoaXMua2V5ZG93bkV2ZW50cygpLnBpcGUoJHQoYT0+YS5rZXlDb2RlPT09MjcmJiF0aGlzLmRpc2FibGVDbG9zZSYmIXMxKGEpKSkpLnN1YnNjcmliZShhPT57dGhpcy5kaXNhYmxlQ2xvc2V8fChhLnByZXZlbnREZWZhdWx0KCksY2wodGhpcyxhLnR5cGU9PT0ia2V5ZG93biI/ImtleWJvYXJkIjoibW91c2UiKSl9KX1jbG9zZShuKXtsZXQgZT10aGlzLl9jb25maWcuY2xvc2VQcmVkaWNhdGU7ZSYmIWUobix0aGlzLl9jb25maWcsdGhpcy5jb21wb25lbnRJbnN0YW5jZSl8fCh0aGlzLl9yZXN1bHQ9bix0aGlzLl9jb250YWluZXJJbnN0YW5jZS5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkLnBpcGUoJHQoaT0+aS5zdGF0ZT09PSJjbG9zaW5nIiksajEoMSkpLnN1YnNjcmliZShpPT57dGhpcy5fYmVmb3JlQ2xvc2VkLm5leHQobiksdGhpcy5fYmVmb3JlQ2xvc2VkLmNvbXBsZXRlKCksdGhpcy5fcmVmLm92ZXJsYXlSZWYuZGV0YWNoQmFja2Ryb3AoKSx0aGlzLl9jbG9zZUZhbGxiYWNrVGltZW91dD1zZXRUaW1lb3V0KCgpPT50aGlzLl9maW5pc2hEaWFsb2dDbG9zZSgpLGkudG90YWxUaW1lKzEwMCl9KSx0aGlzLl9zdGF0ZT1uNC5DTE9TSU5HLHRoaXMuX2NvbnRhaW5lckluc3RhbmNlLl9zdGFydEV4aXRBbmltYXRpb24oKSl9YWZ0ZXJPcGVuZWQoKXtyZXR1cm4gdGhpcy5fYWZ0ZXJPcGVuZWR9YWZ0ZXJDbG9zZWQoKXtyZXR1cm4gdGhpcy5fcmVmLmNsb3NlZH1iZWZvcmVDbG9zZWQoKXtyZXR1cm4gdGhpcy5fYmVmb3JlQ2xvc2VkfWJhY2tkcm9wQ2xpY2soKXtyZXR1cm4gdGhpcy5fcmVmLmJhY2tkcm9wQ2xpY2t9a2V5ZG93bkV2ZW50cygpe3JldHVybiB0aGlzLl9yZWYua2V5ZG93bkV2ZW50c311cGRhdGVQb3NpdGlvbihuKXtsZXQgZT10aGlzLl9yZWYuY29uZmlnLnBvc2l0aW9uU3RyYXRlZ3k7cmV0dXJuIG4mJihuLmxlZnR8fG4ucmlnaHQpP24ubGVmdD9lLmxlZnQobi5sZWZ0KTplLnJpZ2h0KG4ucmlnaHQpOmUuY2VudGVySG9yaXpvbnRhbGx5KCksbiYmKG4udG9wfHxuLmJvdHRvbSk/bi50b3A/ZS50b3Aobi50b3ApOmUuYm90dG9tKG4uYm90dG9tKTplLmNlbnRlclZlcnRpY2FsbHkoKSx0aGlzLl9yZWYudXBkYXRlUG9zaXRpb24oKSx0aGlzfXVwZGF0ZVNpemUobj0iIixlPSIiKXtyZXR1cm4gdGhpcy5fcmVmLnVwZGF0ZVNpemUobixlKSx0aGlzfWFkZFBhbmVsQ2xhc3Mobil7cmV0dXJuIHRoaXMuX3JlZi5hZGRQYW5lbENsYXNzKG4pLHRoaXN9cmVtb3ZlUGFuZWxDbGFzcyhuKXtyZXR1cm4gdGhpcy5fcmVmLnJlbW92ZVBhbmVsQ2xhc3MobiksdGhpc31nZXRTdGF0ZSgpe3JldHVybiB0aGlzLl9zdGF0ZX1fZmluaXNoRGlhbG9nQ2xvc2UoKXt0aGlzLl9zdGF0ZT1uNC5DTE9TRUQsdGhpcy5fcmVmLmNsb3NlKHRoaXMuX3Jlc3VsdCx7Zm9jdXNPcmlnaW46dGhpcy5fY2xvc2VJbnRlcmFjdGlvblR5cGV9KSx0aGlzLmNvbXBvbmVudEluc3RhbmNlPW51bGx9fTtVaT1uZXcgY2UoIk1hdE1kY0RpYWxvZ0RhdGEiKSxROT1uZXcgY2UoIm1hdC1tZGMtZGlhbG9nLWRlZmF1bHQtb3B0aW9ucyIpLFk5PW5ldyBjZSgibWF0LW1kYy1kaWFsb2ctc2Nyb2xsLXN0cmF0ZWd5Iix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTooKT0+e2xldCB0PWgoc3QpO3JldHVybigpPT5Dcih0KX19KSxOMT0oKCk9PntjbGFzcyB0e19kZWZhdWx0T3B0aW9ucz1oKFE5LHtvcHRpb25hbDohMH0pO19zY3JvbGxTdHJhdGVneT1oKFk5KTtfcGFyZW50RGlhbG9nPWgodCx7b3B0aW9uYWw6ITAsc2tpcFNlbGY6ITB9KTtfaWRHZW5lcmF0b3I9aChxdCk7X2luamVjdG9yPWgoc3QpO19kaWFsb2c9aChybCk7X2FuaW1hdGlvbnNEaXNhYmxlZD1QdCgpO19vcGVuRGlhbG9nc0F0VGhpc0xldmVsPVtdO19hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsPW5ldyB3ZTtfYWZ0ZXJPcGVuZWRBdFRoaXNMZXZlbD1uZXcgd2U7ZGlhbG9nQ29uZmlnQ2xhc3M9cjQ7X2RpYWxvZ1JlZkNvbnN0cnVjdG9yO19kaWFsb2dDb250YWluZXJUeXBlO19kaWFsb2dEYXRhVG9rZW47Z2V0IG9wZW5EaWFsb2dzKCl7cmV0dXJuIHRoaXMuX3BhcmVudERpYWxvZz90aGlzLl9wYXJlbnREaWFsb2cub3BlbkRpYWxvZ3M6dGhpcy5fb3BlbkRpYWxvZ3NBdFRoaXNMZXZlbH1nZXQgYWZ0ZXJPcGVuZWQoKXtyZXR1cm4gdGhpcy5fcGFyZW50RGlhbG9nP3RoaXMuX3BhcmVudERpYWxvZy5hZnRlck9wZW5lZDp0aGlzLl9hZnRlck9wZW5lZEF0VGhpc0xldmVsfV9nZXRBZnRlckFsbENsb3NlZCgpe2xldCBlPXRoaXMuX3BhcmVudERpYWxvZztyZXR1cm4gZT9lLl9nZXRBZnRlckFsbENsb3NlZCgpOnRoaXMuX2FmdGVyQWxsQ2xvc2VkQXRUaGlzTGV2ZWx9YWZ0ZXJBbGxDbG9zZWQ9bXIoKCk9PnRoaXMub3BlbkRpYWxvZ3MubGVuZ3RoP3RoaXMuX2dldEFmdGVyQWxsQ2xvc2VkKCk6dGhpcy5fZ2V0QWZ0ZXJBbGxDbG9zZWQoKS5waXBlKGkxKHZvaWQgMCkpKTtjb25zdHJ1Y3Rvcigpe3RoaXMuX2RpYWxvZ1JlZkNvbnN0cnVjdG9yPXRhLHRoaXMuX2RpYWxvZ0NvbnRhaW5lclR5cGU9VzksdGhpcy5fZGlhbG9nRGF0YVRva2VuPVVpfW9wZW4oZSxpKXtsZXQgYTtpPVhlKFhlKHt9LHRoaXMuX2RlZmF1bHRPcHRpb25zfHxuZXcgcjQpLGkpLGkuaWQ9aS5pZHx8dGhpcy5faWRHZW5lcmF0b3IuZ2V0SWQoIm1hdC1tZGMtZGlhbG9nLSIpLGkuc2Nyb2xsU3RyYXRlZ3k9aS5zY3JvbGxTdHJhdGVneXx8dGhpcy5fc2Nyb2xsU3RyYXRlZ3koKTtsZXQgcj10aGlzLl9kaWFsb2cub3BlbihlLFUxKFhlKHt9LGkpLHtwb3NpdGlvblN0cmF0ZWd5OnlyKHRoaXMuX2luamVjdG9yKS5jZW50ZXJIb3Jpem9udGFsbHkoKS5jZW50ZXJWZXJ0aWNhbGx5KCksZGlzYWJsZUNsb3NlOiEwLGNsb3NlUHJlZGljYXRlOnZvaWQgMCxjbG9zZU9uRGVzdHJveTohMSxjbG9zZU9uT3ZlcmxheURldGFjaG1lbnRzOiExLGRpc2FibGVBbmltYXRpb25zOnRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZHx8aS5lbnRlckFuaW1hdGlvbkR1cmF0aW9uPy50b0xvY2FsZVN0cmluZygpPT09IjAifHxpLmV4aXRBbmltYXRpb25EdXJhdGlvbj8udG9TdHJpbmcoKT09PSIwIixjb250YWluZXI6e3R5cGU6dGhpcy5fZGlhbG9nQ29udGFpbmVyVHlwZSxwcm92aWRlcnM6KCk9Plt7cHJvdmlkZTp0aGlzLmRpYWxvZ0NvbmZpZ0NsYXNzLHVzZVZhbHVlOml9LHtwcm92aWRlOlphLHVzZVZhbHVlOml9XX0sdGVtcGxhdGVDb250ZXh0OigpPT4oe2RpYWxvZ1JlZjphfSkscHJvdmlkZXJzOihvLGQscCk9PihhPW5ldyB0aGlzLl9kaWFsb2dSZWZDb25zdHJ1Y3RvcihvLGkscCksYS51cGRhdGVQb3NpdGlvbihpPy5wb3NpdGlvbiksW3twcm92aWRlOnRoaXMuX2RpYWxvZ0NvbnRhaW5lclR5cGUsdXNlVmFsdWU6cH0se3Byb3ZpZGU6dGhpcy5fZGlhbG9nRGF0YVRva2VuLHVzZVZhbHVlOmQuZGF0YX0se3Byb3ZpZGU6dGhpcy5fZGlhbG9nUmVmQ29uc3RydWN0b3IsdXNlVmFsdWU6YX1dKX0pKTtyZXR1cm4gYS5jb21wb25lbnRSZWY9ci5jb21wb25lbnRSZWYsYS5jb21wb25lbnRJbnN0YW5jZT1yLmNvbXBvbmVudEluc3RhbmNlLHRoaXMub3BlbkRpYWxvZ3MucHVzaChhKSx0aGlzLmFmdGVyT3BlbmVkLm5leHQoYSksYS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKT0+e2xldCBvPXRoaXMub3BlbkRpYWxvZ3MuaW5kZXhPZihhKTtvPi0xJiYodGhpcy5vcGVuRGlhbG9ncy5zcGxpY2UobywxKSx0aGlzLm9wZW5EaWFsb2dzLmxlbmd0aHx8dGhpcy5fZ2V0QWZ0ZXJBbGxDbG9zZWQoKS5uZXh0KCkpfSksYX1jbG9zZUFsbCgpe3RoaXMuX2Nsb3NlRGlhbG9ncyh0aGlzLm9wZW5EaWFsb2dzKX1nZXREaWFsb2dCeUlkKGUpe3JldHVybiB0aGlzLm9wZW5EaWFsb2dzLmZpbmQoaT0+aS5pZD09PWUpfW5nT25EZXN0cm95KCl7dGhpcy5fY2xvc2VEaWFsb2dzKHRoaXMuX29wZW5EaWFsb2dzQXRUaGlzTGV2ZWwpLHRoaXMuX2FmdGVyQWxsQ2xvc2VkQXRUaGlzTGV2ZWwuY29tcGxldGUoKSx0aGlzLl9hZnRlck9wZW5lZEF0VGhpc0xldmVsLmNvbXBsZXRlKCl9X2Nsb3NlRGlhbG9ncyhlKXtsZXQgaT1lLmxlbmd0aDtmb3IoO2ktLTspZVtpXS5jbG9zZSgpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIHR9KSgpLFBpPSgoKT0+e2NsYXNzIHR7ZGlhbG9nUmVmPWgodGEse29wdGlvbmFsOiEwfSk7X2VsZW1lbnRSZWY9aChhZSk7X2RpYWxvZz1oKE4xKTthcmlhTGFiZWw7dHlwZT0iYnV0dG9uIjtkaWFsb2dSZXN1bHQ7X21hdERpYWxvZ0Nsb3NlO2NvbnN0cnVjdG9yKCl7fW5nT25Jbml0KCl7dGhpcy5kaWFsb2dSZWZ8fCh0aGlzLmRpYWxvZ1JlZj0kOSh0aGlzLl9lbGVtZW50UmVmLHRoaXMuX2RpYWxvZy5vcGVuRGlhbG9ncykpfW5nT25DaGFuZ2VzKGUpe2xldCBpPWUuX21hdERpYWxvZ0Nsb3NlfHxlLl9tYXREaWFsb2dDbG9zZVJlc3VsdDtpJiYodGhpcy5kaWFsb2dSZXN1bHQ9aS5jdXJyZW50VmFsdWUpfV9vbkJ1dHRvbkNsaWNrKGUpe2NsKHRoaXMuZGlhbG9nUmVmLGUuc2NyZWVuWD09PTAmJmUuc2NyZWVuWT09PTA/ImtleWJvYXJkIjoibW91c2UiLHRoaXMuZGlhbG9nUmVzdWx0KX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXQtZGlhbG9nLWNsb3NlIiwiIl0sWyIiLCJtYXREaWFsb2dDbG9zZSIsIiJdXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMSYmUygiY2xpY2siLGZ1bmN0aW9uKG8pe3JldHVybiBhLl9vbkJ1dHRvbkNsaWNrKG8pfSksaSYyJiZHKCJhcmlhLWxhYmVsIixhLmFyaWFMYWJlbHx8bnVsbCkoInR5cGUiLGEudHlwZSl9LGlucHV0czp7YXJpYUxhYmVsOlswLCJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0sdHlwZToidHlwZSIsZGlhbG9nUmVzdWx0OlswLCJtYXQtZGlhbG9nLWNsb3NlIiwiZGlhbG9nUmVzdWx0Il0sX21hdERpYWxvZ0Nsb3NlOlswLCJtYXREaWFsb2dDbG9zZSIsIl9tYXREaWFsb2dDbG9zZSJdfSxleHBvcnRBczpbIm1hdERpYWxvZ0Nsb3NlIl0sZmVhdHVyZXM6W0hlXX0pfXJldHVybiB0fSkoKSxaOT0oKCk9PntjbGFzcyB0e19kaWFsb2dSZWY9aCh0YSx7b3B0aW9uYWw6ITB9KTtfZWxlbWVudFJlZj1oKGFlKTtfZGlhbG9nPWgoTjEpO2NvbnN0cnVjdG9yKCl7fW5nT25Jbml0KCl7dGhpcy5fZGlhbG9nUmVmfHwodGhpcy5fZGlhbG9nUmVmPSQ5KHRoaXMuX2VsZW1lbnRSZWYsdGhpcy5fZGlhbG9nLm9wZW5EaWFsb2dzKSksdGhpcy5fZGlhbG9nUmVmJiZQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT57dGhpcy5fb25BZGQoKX0pfW5nT25EZXN0cm95KCl7dGhpcy5fZGlhbG9nUmVmPy5fY29udGFpbmVySW5zdGFuY2UmJlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9Pnt0aGlzLl9vblJlbW92ZSgpfSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dH0pfXJldHVybiB0fSkoKSxvND0oKCk9PntjbGFzcyB0IGV4dGVuZHMgWjl7aWQ9aChxdCkuZ2V0SWQoIm1hdC1tZGMtZGlhbG9nLXRpdGxlLSIpO19vbkFkZCgpe3RoaXMuX2RpYWxvZ1JlZi5fY29udGFpbmVySW5zdGFuY2U/Ll9hZGRBcmlhTGFiZWxsZWRCeT8uKHRoaXMuaWQpfV9vblJlbW92ZSgpe3RoaXMuX2RpYWxvZ1JlZj8uX2NvbnRhaW5lckluc3RhbmNlPy5fcmVtb3ZlQXJpYUxhYmVsbGVkQnk/Lih0aGlzLmlkKX1zdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXQtZGlhbG9nLXRpdGxlIiwiIl0sWyIiLCJtYXREaWFsb2dUaXRsZSIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtZGlhbG9nLXRpdGxlIiwibWRjLWRpYWxvZ19fdGl0bGUiXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmQWkoImlkIixhLmlkKX0saW5wdXRzOntpZDoiaWQifSxleHBvcnRBczpbIm1hdERpYWxvZ1RpdGxlIl0sZmVhdHVyZXM6W0ZlXX0pfXJldHVybiB0fSkoKSx0Mj0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsIm1hdC1kaWFsb2ctY29udGVudCIsIiJdLFsibWF0LWRpYWxvZy1jb250ZW50Il0sWyIiLCJtYXREaWFsb2dDb250ZW50IiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LW1kYy1kaWFsb2ctY29udGVudCIsIm1kYy1kaWFsb2dfX2NvbnRlbnQiXSxmZWF0dXJlczpbQmQoW2gyXSldfSl9cmV0dXJuIHR9KSgpLGkyPSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBaOXthbGlnbjtfb25BZGQoKXt0aGlzLl9kaWFsb2dSZWYuX2NvbnRhaW5lckluc3RhbmNlPy5fdXBkYXRlQWN0aW9uU2VjdGlvbkNvdW50Py4oMSl9X29uUmVtb3ZlKCl7dGhpcy5fZGlhbG9nUmVmLl9jb250YWluZXJJbnN0YW5jZT8uX3VwZGF0ZUFjdGlvblNlY3Rpb25Db3VudD8uKC0xKX1zdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXQtZGlhbG9nLWFjdGlvbnMiLCIiXSxbIm1hdC1kaWFsb2ctYWN0aW9ucyJdLFsiIiwibWF0RGlhbG9nQWN0aW9ucyIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtZGlhbG9nLWFjdGlvbnMiLCJtZGMtZGlhbG9nX19hY3Rpb25zIl0saG9zdFZhcnM6Nixob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJmllKCJtYXQtbWRjLWRpYWxvZy1hY3Rpb25zLWFsaWduLXN0YXJ0IixhLmFsaWduPT09InN0YXJ0IikoIm1hdC1tZGMtZGlhbG9nLWFjdGlvbnMtYWxpZ24tY2VudGVyIixhLmFsaWduPT09ImNlbnRlciIpKCJtYXQtbWRjLWRpYWxvZy1hY3Rpb25zLWFsaWduLWVuZCIsYS5hbGlnbj09PSJlbmQiKX0saW5wdXRzOnthbGlnbjoiYWxpZ24ifSxmZWF0dXJlczpbRmVdfSl9cmV0dXJuIHR9KSgpO3NsPSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1bW9kPXhlKHt0eXBlOnR9KTtzdGF0aWMgXHUwMjc1aW5qPXllKHtwcm92aWRlcnM6W04xXSxpbXBvcnRzOltGOSxCaSxmYSx6ZSx6ZV19KX1yZXR1cm4gdH0pKCl9KTt2YXIgZ2k9eCgoKT0+e0s5KCl9KTtmdW5jdGlvbiAkMCh0KXtyZXR1cm4gdD09bnVsbH1mdW5jdGlvbiAkYSh0KXtyZXR1cm4hJDAodCl9ZnVuY3Rpb24gd3oodCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIn1mdW5jdGlvbiBlaCh0LG4pe3JldHVybiBuP3twYXRoOiRhKG4ucGF0aCk/bi5wYXRoOnQucGF0aCxkb21haW46JGEobi5kb21haW4pP24uZG9tYWluOnQuZG9tYWluLGV4cGlyZXM6JGEobi5leHBpcmVzKT9uLmV4cGlyZXM6dC5leHBpcmVzLHNlY3VyZTokYShuLnNlY3VyZSk/bi5zZWN1cmU6dC5zZWN1cmUsc2FtZVNpdGU6JGEobi5zYW1lU2l0ZSk/bi5zYW1lU2l0ZTp0LnNhbWVTaXRlLGh0dHBPbmx5OiRhKG4uaHR0cE9ubHkpP24uaHR0cE9ubHk6dC5odHRwT25seSxzdG9yZVVuZW5jb2RlZDokYShuLnN0b3JlVW5lbmNvZGVkKT9uLnN0b3JlVW5lbmNvZGVkOnQuc3RvcmVVbmVuY29kZWR9OnR9ZnVuY3Rpb24gU3oodCl7bGV0IG49e30sZT0iIixpLGEscixvLGQ7aWYodCE9PWUpZm9yKGU9dCxpPWUuc3BsaXQoIjsiKSxuPXt9LHI9MDtyPGkubGVuZ3RoO3IrKylhPWlbcl0sbz1hLmluZGV4T2YoIj0iKSxvPjAmJihkPVg5KGEuc3Vic3RyaW5nKDAsbykudHJpbSgpKSwkMChuW2RdKSYmKG5bZF09WDkoYS5zdWJzdHJpbmcobysxKS50cmltKCkpKSk7cmV0dXJuIG59ZnVuY3Rpb24ga3oodCxuLGUpe2xldCBpPWU/LmV4cGlyZXMsYTskMChuKT8oaT0iVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQiLGE9IiIpOmE9bix3eihpKSYmKGk9bmV3IERhdGUoaSkpO2xldCByPWU/LnN0b3JlVW5lbmNvZGVkP246ZW5jb2RlVVJJQ29tcG9uZW50KGEpLG89ZW5jb2RlVVJJQ29tcG9uZW50KHQpKyI9IityO28rPWU/LnBhdGg/IjtwYXRoPSIrZS5wYXRoOiIiLG8rPWU/LmRvbWFpbj8iO2RvbWFpbj0iK2UuZG9tYWluOiIiLG8rPWk/IjtleHBpcmVzPSIraS50b1VUQ1N0cmluZygpOiIiLG8rPWU/LnNhbWVTaXRlPyI7IFNhbWVTaXRlPSIrZS5zYW1lU2l0ZToiIixvKz1lPy5zZWN1cmU/IjtzZWN1cmUiOiIiLG8rPWU/Lmh0dHBPbmx5PyI7IEh0dHBPbmx5IjoiIjtsZXQgZD1vLmxlbmd0aCsxO3JldHVybiBkPjQwOTYmJmNvbnNvbGUubG9nKCJDb29raWUgJyIrdCsiJyBwb3NzaWJseSBub3Qgc2V0IG9yIG92ZXJmbG93ZWQgYmVjYXVzZSBpdCB3YXMgdG9vIGxhcmdlICgiK2QrIiA+IDQwOTYgYnl0ZXMpISIpLG99ZnVuY3Rpb24gWDkodCl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQodCl9Y2F0Y2h7cmV0dXJuIHR9fWZ1bmN0aW9uIFR6KHQsbixlKXtyZXR1cm4gbmV3IFp0KHQsbixlKX12YXIgSjksbGwsZGwsWnQsenosdGgsd2k9eCgoKT0+e2soKTtrKCk7YTEoKTtKOT1uZXcgY2UoIkNPT0tJRV9PUFRJT05TIiksbGw9bmV3IGNlKCJDT09LSUVfV1JJVEVSIik7ZGw9KCgpPT57Y2xhc3MgdHtjb25zdHJ1Y3RvcihlPXt9LGkpe3RoaXMuaW5qZWN0b3I9aSx0aGlzLmRlZmF1bHRPcHRpb25zPXtwYXRoOnRoaXMuaW5qZWN0b3IuZ2V0KCRkLCIvIiksZG9tYWluOnZvaWQgMCxleHBpcmVzOnZvaWQgMCxzZWN1cmU6ITEsaHR0cE9ubHk6ITF9LHRoaXMub3B0aW9ucz1laCh0aGlzLmRlZmF1bHRPcHRpb25zLGUpfX1yZXR1cm4gdC5cdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHx0KShFaShKOSksRWkoc3QpKX0sdC5cdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhY30pLHR9KSgpLFp0PSgoKT0+e2NsYXNzIHR7Y29uc3RydWN0b3IoZSxpLGEpe3RoaXMuZG9jdW1lbnQ9ZSx0aGlzLm9wdGlvbnNQcm92aWRlcj1pLHRoaXMuY29va2llV3JpdGVyU2VydmljZT1hLHRoaXMub3B0aW9ucz10aGlzLm9wdGlvbnNQcm92aWRlci5vcHRpb25zfWhhc0tleShlKXtsZXQgaT10aGlzLmdldChlKTtyZXR1cm4gJGEoaSl9Z2V0KGUpe3JldHVybiB0aGlzLmdldEFsbCgpPy5bZV19Z2V0T2JqZWN0KGUpe2xldCBpPXRoaXMuZ2V0KGUpO2lmKCEkMChpKSlyZXR1cm4gaT09PSIiP3t9OkpTT04ucGFyc2UoaSl9Z2V0QWxsKCl7bGV0IGU9dGhpcy5jb29raWVXcml0ZXJTZXJ2aWNlLnJlYWRBbGxBc1N0cmluZygpO3JldHVybiBTeihlKX1wdXQoZSxpLGEpe2xldCByPWVoKHRoaXMub3B0aW9ucyxhKTt0aGlzLmNvb2tpZVdyaXRlclNlcnZpY2Uud3JpdGUoZSxpLHIpfXB1dE9iamVjdChlLGksYSl7dGhpcy5wdXQoZSxKU09OLnN0cmluZ2lmeShpKSxhKX1yZW1vdmUoZSxpKXt0aGlzLnB1dChlLHZvaWQgMCxpKX1yZW1vdmVBbGwoZSl7bGV0IGk9dGhpcy5nZXRBbGwoKTtPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGE9PnRoaXMucmVtb3ZlKGEsZSkpfX1yZXR1cm4gdC5cdTAyNzVmYWM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyhlfHx0KShFaShqdCksRWkoZGwpLEVpKGxsKSl9LHQuXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWN9KSx0fSkoKSx6ej0oKCk9PntjbGFzcyB0e2NvbnN0cnVjdG9yKGUpe3RoaXMuZG9jdW1lbnQ9ZX1yZWFkQWxsQXNTdHJpbmcoKXtyZXR1cm4gdGhpcy5kb2N1bWVudC5jb29raWV8fCIifXdyaXRlKGUsaSxhKXt0aGlzLmRvY3VtZW50LmNvb2tpZT1reihlLGksYSl9fXJldHVybiB0Llx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fHQpKEVpKGp0KSl9LHQuXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWN9KSx0fSkoKTt0aD0oKCk9PntjbGFzcyB0e3N0YXRpYyB3aXRoT3B0aW9ucyhlPXt9KXtyZXR1cm57bmdNb2R1bGU6dCxwcm92aWRlcnM6W3twcm92aWRlOko5LHVzZVZhbHVlOmV9LHtwcm92aWRlOmxsLHVzZUNsYXNzOnp6fSx7cHJvdmlkZTpadCx1c2VGYWN0b3J5OlR6LGRlcHM6W2p0LGRsLGxsXX1dfX1zdGF0aWMgZm9yUm9vdChlPXt9KXtyZXR1cm4gdGhpcy53aXRoT3B0aW9ucyhlKX1zdGF0aWMgZm9yQ2hpbGQoZT17fSl7cmV0dXJuIHRoaXMud2l0aE9wdGlvbnMoZSl9fXJldHVybiB0Llx1MDI3NWZhYz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3KGV8fHQpfSx0Llx1MDI3NW1vZD14ZSh7dHlwZTp0fSksdC5cdTAyNzVpbmo9eWUoe3Byb3ZpZGVyczpbZGxdfSksdH0pKCl9KTtmdW5jdGlvbiBuaCh0KXtsZXQgbj1oKHN0KTtyZXR1cm4oKT0+TGkobix7c2Nyb2xsVGhyb3R0bGU6bWx9KX1mdW5jdGlvbiByaCgpe3JldHVybntzaG93RGVsYXk6MCxoaWRlRGVsYXk6MCx0b3VjaGVuZEhpZGVEZWxheToxNTAwfX12YXIgRXosbWwsaGwscGwsb2gsaWgsYWgsQXosRHosSXosTHosUnQsY2gsYzQ9eCgoKT0+e2x0KCk7Z2EoKTtZMigpO2soKTtrKCk7YTEoKTt2YSgpO3hpKCk7WjIoKTtQbigpO0VuKCk7WHQoKTtmaSgpO0V6PVsidG9vbHRpcCJdLG1sPTIwLGhsPW5ldyBjZSgibWF0LXRvb2x0aXAtc2Nyb2xsLXN0cmF0ZWd5Iix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTooKT0+e2xldCB0PWgoc3QpO3JldHVybigpPT5MaSh0LHtzY3JvbGxUaHJvdHRsZTptbH0pfX0pO3BsPXtwcm92aWRlOmhsLGRlcHM6W10sdXNlRmFjdG9yeTpuaH07b2g9bmV3IGNlKCJtYXQtdG9vbHRpcC1kZWZhdWx0LW9wdGlvbnMiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OnJofSksaWg9InRvb2x0aXAtcGFuZWwiLGFoPWhtKHtwYXNzaXZlOiEwfSksQXo9OCxEej04LEl6PTI0LEx6PTIwMCxSdD0oKCk9PntjbGFzcyB0e19lbGVtZW50UmVmPWgoYWUpO19uZ1pvbmU9aChyZSk7X3BsYXRmb3JtPWgoYjEpO19hcmlhRGVzY3JpYmVyPWgoUzYpO19mb2N1c01vbml0b3I9aChYMSk7X2Rpcj1oKG4xKTtfaW5qZWN0b3I9aChzdCk7X3ZpZXdDb250YWluZXJSZWY9aChHMSk7X2FuaW1hdGlvbnNEaXNhYmxlZD1QdCgpO19kZWZhdWx0T3B0aW9ucz1oKG9oLHtvcHRpb25hbDohMH0pO19vdmVybGF5UmVmO190b29sdGlwSW5zdGFuY2U7X292ZXJsYXlQYW5lbENsYXNzO19wb3J0YWw7X3Bvc2l0aW9uPSJiZWxvdyI7X3Bvc2l0aW9uQXRPcmlnaW49ITE7X2Rpc2FibGVkPSExO190b29sdGlwQ2xhc3M7X3ZpZXdJbml0aWFsaXplZD0hMTtfcG9pbnRlckV4aXRFdmVudHNJbml0aWFsaXplZD0hMTtfdG9vbHRpcENvbXBvbmVudD1jaDtfdmlld3BvcnRNYXJnaW49ODtfY3VycmVudFBvc2l0aW9uO19jc3NDbGFzc1ByZWZpeD0ibWF0LW1kYyI7X2FyaWFEZXNjcmlwdGlvblBlbmRpbmc7X2RpclN1YnNjcmliZWQ9ITE7Z2V0IHBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9ufXNldCBwb3NpdGlvbihlKXtlIT09dGhpcy5fcG9zaXRpb24mJih0aGlzLl9wb3NpdGlvbj1lLHRoaXMuX292ZXJsYXlSZWYmJih0aGlzLl91cGRhdGVQb3NpdGlvbih0aGlzLl9vdmVybGF5UmVmKSx0aGlzLl90b29sdGlwSW5zdGFuY2U/LnNob3coMCksdGhpcy5fb3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpKSl9Z2V0IHBvc2l0aW9uQXRPcmlnaW4oKXtyZXR1cm4gdGhpcy5fcG9zaXRpb25BdE9yaWdpbn1zZXQgcG9zaXRpb25BdE9yaWdpbihlKXt0aGlzLl9wb3NpdGlvbkF0T3JpZ2luPVcxKGUpLHRoaXMuX2RldGFjaCgpLHRoaXMuX292ZXJsYXlSZWY9bnVsbH1nZXQgZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWR9c2V0IGRpc2FibGVkKGUpe2xldCBpPVcxKGUpO3RoaXMuX2Rpc2FibGVkIT09aSYmKHRoaXMuX2Rpc2FibGVkPWksaT90aGlzLmhpZGUoMCk6dGhpcy5fc2V0dXBQb2ludGVyRW50ZXJFdmVudHNJZk5lZWRlZCgpLHRoaXMuX3N5bmNBcmlhRGVzY3JpcHRpb24odGhpcy5tZXNzYWdlKSl9Z2V0IHNob3dEZWxheSgpe3JldHVybiB0aGlzLl9zaG93RGVsYXl9c2V0IHNob3dEZWxheShlKXt0aGlzLl9zaG93RGVsYXk9SWkoZSl9X3Nob3dEZWxheTtnZXQgaGlkZURlbGF5KCl7cmV0dXJuIHRoaXMuX2hpZGVEZWxheX1zZXQgaGlkZURlbGF5KGUpe3RoaXMuX2hpZGVEZWxheT1JaShlKSx0aGlzLl90b29sdGlwSW5zdGFuY2UmJih0aGlzLl90b29sdGlwSW5zdGFuY2UuX21vdXNlTGVhdmVIaWRlRGVsYXk9dGhpcy5faGlkZURlbGF5KX1faGlkZURlbGF5O3RvdWNoR2VzdHVyZXM9ImF1dG8iO2dldCBtZXNzYWdlKCl7cmV0dXJuIHRoaXMuX21lc3NhZ2V9c2V0IG1lc3NhZ2UoZSl7bGV0IGk9dGhpcy5fbWVzc2FnZTt0aGlzLl9tZXNzYWdlPWUhPW51bGw/U3RyaW5nKGUpLnRyaW0oKToiIiwhdGhpcy5fbWVzc2FnZSYmdGhpcy5faXNUb29sdGlwVmlzaWJsZSgpP3RoaXMuaGlkZSgwKToodGhpcy5fc2V0dXBQb2ludGVyRW50ZXJFdmVudHNJZk5lZWRlZCgpLHRoaXMuX3VwZGF0ZVRvb2x0aXBNZXNzYWdlKCkpLHRoaXMuX3N5bmNBcmlhRGVzY3JpcHRpb24oaSl9X21lc3NhZ2U9IiI7Z2V0IHRvb2x0aXBDbGFzcygpe3JldHVybiB0aGlzLl90b29sdGlwQ2xhc3N9c2V0IHRvb2x0aXBDbGFzcyhlKXt0aGlzLl90b29sdGlwQ2xhc3M9ZSx0aGlzLl90b29sdGlwSW5zdGFuY2UmJnRoaXMuX3NldFRvb2x0aXBDbGFzcyh0aGlzLl90b29sdGlwQ2xhc3MpfV9wYXNzaXZlTGlzdGVuZXJzPVtdO190b3VjaHN0YXJ0VGltZW91dD1udWxsO19kZXN0cm95ZWQ9bmV3IHdlO19pc0Rlc3Ryb3llZD0hMTtjb25zdHJ1Y3Rvcigpe2xldCBlPXRoaXMuX2RlZmF1bHRPcHRpb25zO2UmJih0aGlzLl9zaG93RGVsYXk9ZS5zaG93RGVsYXksdGhpcy5faGlkZURlbGF5PWUuaGlkZURlbGF5LGUucG9zaXRpb24mJih0aGlzLnBvc2l0aW9uPWUucG9zaXRpb24pLGUucG9zaXRpb25BdE9yaWdpbiYmKHRoaXMucG9zaXRpb25BdE9yaWdpbj1lLnBvc2l0aW9uQXRPcmlnaW4pLGUudG91Y2hHZXN0dXJlcyYmKHRoaXMudG91Y2hHZXN0dXJlcz1lLnRvdWNoR2VzdHVyZXMpLGUudG9vbHRpcENsYXNzJiYodGhpcy50b29sdGlwQ2xhc3M9ZS50b29sdGlwQ2xhc3MpKSx0aGlzLl92aWV3cG9ydE1hcmdpbj1Ben1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl92aWV3SW5pdGlhbGl6ZWQ9ITAsdGhpcy5fc2V0dXBQb2ludGVyRW50ZXJFdmVudHNJZk5lZWRlZCgpLHRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYpLnBpcGUoeHQodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKGU9PntlP2U9PT0ia2V5Ym9hcmQiJiZ0aGlzLl9uZ1pvbmUucnVuKCgpPT50aGlzLnNob3coKSk6dGhpcy5fbmdab25lLnJ1bigoKT0+dGhpcy5oaWRlKDApKX0pfW5nT25EZXN0cm95KCl7bGV0IGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O3RoaXMuX3RvdWNoc3RhcnRUaW1lb3V0JiZjbGVhclRpbWVvdXQodGhpcy5fdG91Y2hzdGFydFRpbWVvdXQpLHRoaXMuX292ZXJsYXlSZWYmJih0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKSx0aGlzLl90b29sdGlwSW5zdGFuY2U9bnVsbCksdGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5mb3JFYWNoKChbaSxhXSk9PntlLnJlbW92ZUV2ZW50TGlzdGVuZXIoaSxhLGFoKX0pLHRoaXMuX3Bhc3NpdmVMaXN0ZW5lcnMubGVuZ3RoPTAsdGhpcy5fZGVzdHJveWVkLm5leHQoKSx0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKSx0aGlzLl9pc0Rlc3Ryb3llZD0hMCx0aGlzLl9hcmlhRGVzY3JpYmVyLnJlbW92ZURlc2NyaXB0aW9uKGUsdGhpcy5tZXNzYWdlLCJ0b29sdGlwIiksdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKGUpfXNob3coZT10aGlzLnNob3dEZWxheSxpKXtpZih0aGlzLmRpc2FibGVkfHwhdGhpcy5tZXNzYWdlfHx0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkpe3RoaXMuX3Rvb2x0aXBJbnN0YW5jZT8uX2NhbmNlbFBlbmRpbmdBbmltYXRpb25zKCk7cmV0dXJufWxldCBhPXRoaXMuX2NyZWF0ZU92ZXJsYXkoaSk7dGhpcy5fZGV0YWNoKCksdGhpcy5fcG9ydGFsPXRoaXMuX3BvcnRhbHx8bmV3IGphKHRoaXMuX3Rvb2x0aXBDb21wb25lbnQsdGhpcy5fdmlld0NvbnRhaW5lclJlZik7bGV0IHI9dGhpcy5fdG9vbHRpcEluc3RhbmNlPWEuYXR0YWNoKHRoaXMuX3BvcnRhbCkuaW5zdGFuY2U7ci5fdHJpZ2dlckVsZW1lbnQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LHIuX21vdXNlTGVhdmVIaWRlRGVsYXk9dGhpcy5faGlkZURlbGF5LHIuYWZ0ZXJIaWRkZW4oKS5waXBlKHh0KHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKT0+dGhpcy5fZGV0YWNoKCkpLHRoaXMuX3NldFRvb2x0aXBDbGFzcyh0aGlzLl90b29sdGlwQ2xhc3MpLHRoaXMuX3VwZGF0ZVRvb2x0aXBNZXNzYWdlKCksci5zaG93KGUpfWhpZGUoZT10aGlzLmhpZGVEZWxheSl7bGV0IGk9dGhpcy5fdG9vbHRpcEluc3RhbmNlO2kmJihpLmlzVmlzaWJsZSgpP2kuaGlkZShlKTooaS5fY2FuY2VsUGVuZGluZ0FuaW1hdGlvbnMoKSx0aGlzLl9kZXRhY2goKSkpfXRvZ2dsZShlKXt0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCk/dGhpcy5oaWRlKCk6dGhpcy5zaG93KHZvaWQgMCxlKX1faXNUb29sdGlwVmlzaWJsZSgpe3JldHVybiEhdGhpcy5fdG9vbHRpcEluc3RhbmNlJiZ0aGlzLl90b29sdGlwSW5zdGFuY2UuaXNWaXNpYmxlKCl9X2NyZWF0ZU92ZXJsYXkoZSl7aWYodGhpcy5fb3ZlcmxheVJlZil7bGV0IG89dGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5wb3NpdGlvblN0cmF0ZWd5O2lmKCghdGhpcy5wb3NpdGlvbkF0T3JpZ2lufHwhZSkmJm8uX29yaWdpbiBpbnN0YW5jZW9mIGFlKXJldHVybiB0aGlzLl9vdmVybGF5UmVmO3RoaXMuX2RldGFjaCgpfWxldCBpPXRoaXMuX2luamVjdG9yLmdldChEbikuZ2V0QW5jZXN0b3JTY3JvbGxDb250YWluZXJzKHRoaXMuX2VsZW1lbnRSZWYpLGE9YCR7dGhpcy5fY3NzQ2xhc3NQcmVmaXh9LSR7aWh9YCxyPUxuKHRoaXMuX2luamVjdG9yLHRoaXMucG9zaXRpb25BdE9yaWdpbj9lfHx0aGlzLl9lbGVtZW50UmVmOnRoaXMuX2VsZW1lbnRSZWYpLndpdGhUcmFuc2Zvcm1PcmlnaW5PbihgLiR7dGhpcy5fY3NzQ2xhc3NQcmVmaXh9LXRvb2x0aXBgKS53aXRoRmxleGlibGVEaW1lbnNpb25zKCExKS53aXRoVmlld3BvcnRNYXJnaW4odGhpcy5fdmlld3BvcnRNYXJnaW4pLndpdGhTY3JvbGxhYmxlQ29udGFpbmVycyhpKTtyZXR1cm4gci5wb3NpdGlvbkNoYW5nZXMucGlwZSh4dCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUobz0+e3RoaXMuX3VwZGF0ZUN1cnJlbnRQb3NpdGlvbkNsYXNzKG8uY29ubmVjdGlvblBhaXIpLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSYmby5zY3JvbGxhYmxlVmlld1Byb3BlcnRpZXMuaXNPdmVybGF5Q2xpcHBlZCYmdGhpcy5fdG9vbHRpcEluc3RhbmNlLmlzVmlzaWJsZSgpJiZ0aGlzLl9uZ1pvbmUucnVuKCgpPT50aGlzLmhpZGUoMCkpfSksdGhpcy5fb3ZlcmxheVJlZj11YSh0aGlzLl9pbmplY3Rvcix7ZGlyZWN0aW9uOnRoaXMuX2Rpcixwb3NpdGlvblN0cmF0ZWd5OnIscGFuZWxDbGFzczp0aGlzLl9vdmVybGF5UGFuZWxDbGFzcz9bLi4udGhpcy5fb3ZlcmxheVBhbmVsQ2xhc3MsYV06YSxzY3JvbGxTdHJhdGVneTp0aGlzLl9pbmplY3Rvci5nZXQoaGwpKCksZGlzYWJsZUFuaW1hdGlvbnM6dGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkfSksdGhpcy5fdXBkYXRlUG9zaXRpb24odGhpcy5fb3ZlcmxheVJlZiksdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2htZW50cygpLnBpcGUoeHQodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpPT50aGlzLl9kZXRhY2goKSksdGhpcy5fb3ZlcmxheVJlZi5vdXRzaWRlUG9pbnRlckV2ZW50cygpLnBpcGUoeHQodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpPT50aGlzLl90b29sdGlwSW5zdGFuY2U/Ll9oYW5kbGVCb2R5SW50ZXJhY3Rpb24oKSksdGhpcy5fb3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCkucGlwZSh4dCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUobz0+e3RoaXMuX2lzVG9vbHRpcFZpc2libGUoKSYmby5rZXlDb2RlPT09MjcmJiFzMShvKSYmKG8ucHJldmVudERlZmF1bHQoKSxvLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX25nWm9uZS5ydW4oKCk9PnRoaXMuaGlkZSgwKSkpfSksdGhpcy5fZGVmYXVsdE9wdGlvbnM/LmRpc2FibGVUb29sdGlwSW50ZXJhY3Rpdml0eSYmdGhpcy5fb3ZlcmxheVJlZi5hZGRQYW5lbENsYXNzKGAke3RoaXMuX2Nzc0NsYXNzUHJlZml4fS10b29sdGlwLXBhbmVsLW5vbi1pbnRlcmFjdGl2ZWApLHRoaXMuX2RpclN1YnNjcmliZWR8fCh0aGlzLl9kaXJTdWJzY3JpYmVkPSEwLHRoaXMuX2Rpci5jaGFuZ2UucGlwZSh4dCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9vdmVybGF5UmVmJiZ0aGlzLl91cGRhdGVQb3NpdGlvbih0aGlzLl9vdmVybGF5UmVmKX0pKSx0aGlzLl9vdmVybGF5UmVmfV9kZXRhY2goKXt0aGlzLl9vdmVybGF5UmVmJiZ0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkmJnRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCksdGhpcy5fdG9vbHRpcEluc3RhbmNlPW51bGx9X3VwZGF0ZVBvc2l0aW9uKGUpe2xldCBpPWUuZ2V0Q29uZmlnKCkucG9zaXRpb25TdHJhdGVneSxhPXRoaXMuX2dldE9yaWdpbigpLHI9dGhpcy5fZ2V0T3ZlcmxheVBvc2l0aW9uKCk7aS53aXRoUG9zaXRpb25zKFt0aGlzLl9hZGRPZmZzZXQoWGUoWGUoe30sYS5tYWluKSxyLm1haW4pKSx0aGlzLl9hZGRPZmZzZXQoWGUoWGUoe30sYS5mYWxsYmFjayksci5mYWxsYmFjaykpXSl9X2FkZE9mZnNldChlKXtsZXQgaT1EeixhPSF0aGlzLl9kaXJ8fHRoaXMuX2Rpci52YWx1ZT09Imx0ciI7cmV0dXJuIGUub3JpZ2luWT09PSJ0b3AiP2Uub2Zmc2V0WT0taTplLm9yaWdpblk9PT0iYm90dG9tIj9lLm9mZnNldFk9aTplLm9yaWdpblg9PT0ic3RhcnQiP2Uub2Zmc2V0WD1hPy1pOmk6ZS5vcmlnaW5YPT09ImVuZCImJihlLm9mZnNldFg9YT9pOi1pKSxlfV9nZXRPcmlnaW4oKXtsZXQgZT0hdGhpcy5fZGlyfHx0aGlzLl9kaXIudmFsdWU9PSJsdHIiLGk9dGhpcy5wb3NpdGlvbixhO2k9PSJhYm92ZSJ8fGk9PSJiZWxvdyI/YT17b3JpZ2luWDoiY2VudGVyIixvcmlnaW5ZOmk9PSJhYm92ZSI/InRvcCI6ImJvdHRvbSJ9Omk9PSJiZWZvcmUifHxpPT0ibGVmdCImJmV8fGk9PSJyaWdodCImJiFlP2E9e29yaWdpblg6InN0YXJ0IixvcmlnaW5ZOiJjZW50ZXIifTooaT09ImFmdGVyInx8aT09InJpZ2h0IiYmZXx8aT09ImxlZnQiJiYhZSkmJihhPXtvcmlnaW5YOiJlbmQiLG9yaWdpblk6ImNlbnRlciJ9KTtsZXR7eDpyLHk6b309dGhpcy5faW52ZXJ0UG9zaXRpb24oYS5vcmlnaW5YLGEub3JpZ2luWSk7cmV0dXJue21haW46YSxmYWxsYmFjazp7b3JpZ2luWDpyLG9yaWdpblk6b319fV9nZXRPdmVybGF5UG9zaXRpb24oKXtsZXQgZT0hdGhpcy5fZGlyfHx0aGlzLl9kaXIudmFsdWU9PSJsdHIiLGk9dGhpcy5wb3NpdGlvbixhO2k9PSJhYm92ZSI/YT17b3ZlcmxheVg6ImNlbnRlciIsb3ZlcmxheVk6ImJvdHRvbSJ9Omk9PSJiZWxvdyI/YT17b3ZlcmxheVg6ImNlbnRlciIsb3ZlcmxheVk6InRvcCJ9Omk9PSJiZWZvcmUifHxpPT0ibGVmdCImJmV8fGk9PSJyaWdodCImJiFlP2E9e292ZXJsYXlYOiJlbmQiLG92ZXJsYXlZOiJjZW50ZXIifTooaT09ImFmdGVyInx8aT09InJpZ2h0IiYmZXx8aT09ImxlZnQiJiYhZSkmJihhPXtvdmVybGF5WDoic3RhcnQiLG92ZXJsYXlZOiJjZW50ZXIifSk7bGV0e3g6cix5Om99PXRoaXMuX2ludmVydFBvc2l0aW9uKGEub3ZlcmxheVgsYS5vdmVybGF5WSk7cmV0dXJue21haW46YSxmYWxsYmFjazp7b3ZlcmxheVg6cixvdmVybGF5WTpvfX19X3VwZGF0ZVRvb2x0aXBNZXNzYWdlKCl7dGhpcy5fdG9vbHRpcEluc3RhbmNlJiYodGhpcy5fdG9vbHRpcEluc3RhbmNlLm1lc3NhZ2U9dGhpcy5tZXNzYWdlLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCksbTEoKCk9Pnt0aGlzLl90b29sdGlwSW5zdGFuY2UmJnRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKX0se2luamVjdG9yOnRoaXMuX2luamVjdG9yfSkpfV9zZXRUb29sdGlwQ2xhc3MoZSl7dGhpcy5fdG9vbHRpcEluc3RhbmNlJiYodGhpcy5fdG9vbHRpcEluc3RhbmNlLnRvb2x0aXBDbGFzcz1lLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCkpfV9pbnZlcnRQb3NpdGlvbihlLGkpe3JldHVybiB0aGlzLnBvc2l0aW9uPT09ImFib3ZlInx8dGhpcy5wb3NpdGlvbj09PSJiZWxvdyI/aT09PSJ0b3AiP2k9ImJvdHRvbSI6aT09PSJib3R0b20iJiYoaT0idG9wIik6ZT09PSJlbmQiP2U9InN0YXJ0IjplPT09InN0YXJ0IiYmKGU9ImVuZCIpLHt4OmUseTppfX1fdXBkYXRlQ3VycmVudFBvc2l0aW9uQ2xhc3MoZSl7bGV0e292ZXJsYXlZOmksb3JpZ2luWDphLG9yaWdpblk6cn09ZSxvO2lmKGk9PT0iY2VudGVyIj90aGlzLl9kaXImJnRoaXMuX2Rpci52YWx1ZT09PSJydGwiP289YT09PSJlbmQiPyJsZWZ0IjoicmlnaHQiOm89YT09PSJzdGFydCI/ImxlZnQiOiJyaWdodCI6bz1pPT09ImJvdHRvbSImJnI9PT0idG9wIj8iYWJvdmUiOiJiZWxvdyIsbyE9PXRoaXMuX2N1cnJlbnRQb3NpdGlvbil7bGV0IGQ9dGhpcy5fb3ZlcmxheVJlZjtpZihkKXtsZXQgcD1gJHt0aGlzLl9jc3NDbGFzc1ByZWZpeH0tJHtpaH0tYDtkLnJlbW92ZVBhbmVsQ2xhc3MocCt0aGlzLl9jdXJyZW50UG9zaXRpb24pLGQuYWRkUGFuZWxDbGFzcyhwK28pfXRoaXMuX2N1cnJlbnRQb3NpdGlvbj1vfX1fc2V0dXBQb2ludGVyRW50ZXJFdmVudHNJZk5lZWRlZCgpe3RoaXMuX2Rpc2FibGVkfHwhdGhpcy5tZXNzYWdlfHwhdGhpcy5fdmlld0luaXRpYWxpemVkfHx0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLmxlbmd0aHx8KHRoaXMuX3BsYXRmb3JtU3VwcG9ydHNNb3VzZUV2ZW50cygpP3RoaXMuX3Bhc3NpdmVMaXN0ZW5lcnMucHVzaChbIm1vdXNlZW50ZXIiLGU9Pnt0aGlzLl9zZXR1cFBvaW50ZXJFeGl0RXZlbnRzSWZOZWVkZWQoKTtsZXQgaTtlLnghPT12b2lkIDAmJmUueSE9PXZvaWQgMCYmKGk9ZSksdGhpcy5zaG93KHZvaWQgMCxpKX1dKTp0aGlzLnRvdWNoR2VzdHVyZXMhPT0ib2ZmIiYmKHRoaXMuX2Rpc2FibGVOYXRpdmVHZXN0dXJlc0lmTmVjZXNzYXJ5KCksdGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5wdXNoKFsidG91Y2hzdGFydCIsZT0+e2xldCBpPWUudGFyZ2V0VG91Y2hlcz8uWzBdLGE9aT97eDppLmNsaWVudFgseTppLmNsaWVudFl9OnZvaWQgMDt0aGlzLl9zZXR1cFBvaW50ZXJFeGl0RXZlbnRzSWZOZWVkZWQoKSx0aGlzLl90b3VjaHN0YXJ0VGltZW91dCYmY2xlYXJUaW1lb3V0KHRoaXMuX3RvdWNoc3RhcnRUaW1lb3V0KTtsZXQgcj01MDA7dGhpcy5fdG91Y2hzdGFydFRpbWVvdXQ9c2V0VGltZW91dCgoKT0+e3RoaXMuX3RvdWNoc3RhcnRUaW1lb3V0PW51bGwsdGhpcy5zaG93KHZvaWQgMCxhKX0sdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnRvdWNoTG9uZ1ByZXNzU2hvd0RlbGF5Pz9yKX1dKSksdGhpcy5fYWRkTGlzdGVuZXJzKHRoaXMuX3Bhc3NpdmVMaXN0ZW5lcnMpKX1fc2V0dXBQb2ludGVyRXhpdEV2ZW50c0lmTmVlZGVkKCl7aWYodGhpcy5fcG9pbnRlckV4aXRFdmVudHNJbml0aWFsaXplZClyZXR1cm47dGhpcy5fcG9pbnRlckV4aXRFdmVudHNJbml0aWFsaXplZD0hMDtsZXQgZT1bXTtpZih0aGlzLl9wbGF0Zm9ybVN1cHBvcnRzTW91c2VFdmVudHMoKSllLnB1c2goWyJtb3VzZWxlYXZlIixpPT57bGV0IGE9aS5yZWxhdGVkVGFyZ2V0OyghYXx8IXRoaXMuX292ZXJsYXlSZWY/Lm92ZXJsYXlFbGVtZW50LmNvbnRhaW5zKGEpKSYmdGhpcy5oaWRlKCl9XSxbIndoZWVsIixpPT50aGlzLl93aGVlbExpc3RlbmVyKGkpXSk7ZWxzZSBpZih0aGlzLnRvdWNoR2VzdHVyZXMhPT0ib2ZmIil7dGhpcy5fZGlzYWJsZU5hdGl2ZUdlc3R1cmVzSWZOZWNlc3NhcnkoKTtsZXQgaT0oKT0+e3RoaXMuX3RvdWNoc3RhcnRUaW1lb3V0JiZjbGVhclRpbWVvdXQodGhpcy5fdG91Y2hzdGFydFRpbWVvdXQpLHRoaXMuaGlkZSh0aGlzLl9kZWZhdWx0T3B0aW9ucz8udG91Y2hlbmRIaWRlRGVsYXkpfTtlLnB1c2goWyJ0b3VjaGVuZCIsaV0sWyJ0b3VjaGNhbmNlbCIsaV0pfXRoaXMuX2FkZExpc3RlbmVycyhlKSx0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLnB1c2goLi4uZSl9X2FkZExpc3RlbmVycyhlKXtlLmZvckVhY2goKFtpLGFdKT0+e3RoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGksYSxhaCl9KX1fcGxhdGZvcm1TdXBwb3J0c01vdXNlRXZlbnRzKCl7cmV0dXJuIXRoaXMuX3BsYXRmb3JtLklPUyYmIXRoaXMuX3BsYXRmb3JtLkFORFJPSUR9X3doZWVsTGlzdGVuZXIoZSl7aWYodGhpcy5faXNUb29sdGlwVmlzaWJsZSgpKXtsZXQgaT10aGlzLl9pbmplY3Rvci5nZXQoanQpLmVsZW1lbnRGcm9tUG9pbnQoZS5jbGllbnRYLGUuY2xpZW50WSksYT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7aSE9PWEmJiFhLmNvbnRhaW5zKGkpJiZ0aGlzLmhpZGUoKX19X2Rpc2FibGVOYXRpdmVHZXN0dXJlc0lmTmVjZXNzYXJ5KCl7bGV0IGU9dGhpcy50b3VjaEdlc3R1cmVzO2lmKGUhPT0ib2ZmIil7bGV0IGk9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LGE9aS5zdHlsZTsoZT09PSJvbiJ8fGkubm9kZU5hbWUhPT0iSU5QVVQiJiZpLm5vZGVOYW1lIT09IlRFWFRBUkVBIikmJihhLnVzZXJTZWxlY3Q9YS5tc1VzZXJTZWxlY3Q9YS53ZWJraXRVc2VyU2VsZWN0PWEuTW96VXNlclNlbGVjdD0ibm9uZSIpLChlPT09Im9uInx8IWkuZHJhZ2dhYmxlKSYmKGEud2Via2l0VXNlckRyYWc9Im5vbmUiKSxhLnRvdWNoQWN0aW9uPSJub25lIixhLndlYmtpdFRhcEhpZ2hsaWdodENvbG9yPSJ0cmFuc3BhcmVudCJ9fV9zeW5jQXJpYURlc2NyaXB0aW9uKGUpe3RoaXMuX2FyaWFEZXNjcmlwdGlvblBlbmRpbmd8fCh0aGlzLl9hcmlhRGVzY3JpcHRpb25QZW5kaW5nPSEwLHRoaXMuX2FyaWFEZXNjcmliZXIucmVtb3ZlRGVzY3JpcHRpb24odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LGUsInRvb2x0aXAiKSx0aGlzLl9pc0Rlc3Ryb3llZHx8bTEoe3dyaXRlOigpPT57dGhpcy5fYXJpYURlc2NyaXB0aW9uUGVuZGluZz0hMSx0aGlzLm1lc3NhZ2UmJiF0aGlzLmRpc2FibGVkJiZ0aGlzLl9hcmlhRGVzY3JpYmVyLmRlc2NyaWJlKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCx0aGlzLm1lc3NhZ2UsInRvb2x0aXAiKX19LHtpbmplY3Rvcjp0aGlzLl9pbmplY3Rvcn0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXRUb29sdGlwIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LW1kYy10b29sdGlwLXRyaWdnZXIiXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmaWUoIm1hdC1tZGMtdG9vbHRpcC1kaXNhYmxlZCIsYS5kaXNhYmxlZCl9LGlucHV0czp7cG9zaXRpb246WzAsIm1hdFRvb2x0aXBQb3NpdGlvbiIsInBvc2l0aW9uIl0scG9zaXRpb25BdE9yaWdpbjpbMCwibWF0VG9vbHRpcFBvc2l0aW9uQXRPcmlnaW4iLCJwb3NpdGlvbkF0T3JpZ2luIl0sZGlzYWJsZWQ6WzAsIm1hdFRvb2x0aXBEaXNhYmxlZCIsImRpc2FibGVkIl0sc2hvd0RlbGF5OlswLCJtYXRUb29sdGlwU2hvd0RlbGF5Iiwic2hvd0RlbGF5Il0saGlkZURlbGF5OlswLCJtYXRUb29sdGlwSGlkZURlbGF5IiwiaGlkZURlbGF5Il0sdG91Y2hHZXN0dXJlczpbMCwibWF0VG9vbHRpcFRvdWNoR2VzdHVyZXMiLCJ0b3VjaEdlc3R1cmVzIl0sbWVzc2FnZTpbMCwibWF0VG9vbHRpcCIsIm1lc3NhZ2UiXSx0b29sdGlwQ2xhc3M6WzAsIm1hdFRvb2x0aXBDbGFzcyIsInRvb2x0aXBDbGFzcyJdfSxleHBvcnRBczpbIm1hdFRvb2x0aXAiXX0pfXJldHVybiB0fSkoKSxjaD0oKCk9PntjbGFzcyB0e19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtfZWxlbWVudFJlZj1oKGFlKTtfaXNNdWx0aWxpbmU9ITE7bWVzc2FnZTt0b29sdGlwQ2xhc3M7X3Nob3dUaW1lb3V0SWQ7X2hpZGVUaW1lb3V0SWQ7X3RyaWdnZXJFbGVtZW50O19tb3VzZUxlYXZlSGlkZURlbGF5O19hbmltYXRpb25zRGlzYWJsZWQ9UHQoKTtfdG9vbHRpcDtfY2xvc2VPbkludGVyYWN0aW9uPSExO19pc1Zpc2libGU9ITE7X29uSGlkZT1uZXcgd2U7X3Nob3dBbmltYXRpb249Im1hdC1tZGMtdG9vbHRpcC1zaG93IjtfaGlkZUFuaW1hdGlvbj0ibWF0LW1kYy10b29sdGlwLWhpZGUiO2NvbnN0cnVjdG9yKCl7fXNob3coZSl7dGhpcy5faGlkZVRpbWVvdXRJZCE9bnVsbCYmY2xlYXJUaW1lb3V0KHRoaXMuX2hpZGVUaW1lb3V0SWQpLHRoaXMuX3Nob3dUaW1lb3V0SWQ9c2V0VGltZW91dCgoKT0+e3RoaXMuX3RvZ2dsZVZpc2liaWxpdHkoITApLHRoaXMuX3Nob3dUaW1lb3V0SWQ9dm9pZCAwfSxlKX1oaWRlKGUpe3RoaXMuX3Nob3dUaW1lb3V0SWQhPW51bGwmJmNsZWFyVGltZW91dCh0aGlzLl9zaG93VGltZW91dElkKSx0aGlzLl9oaWRlVGltZW91dElkPXNldFRpbWVvdXQoKCk9Pnt0aGlzLl90b2dnbGVWaXNpYmlsaXR5KCExKSx0aGlzLl9oaWRlVGltZW91dElkPXZvaWQgMH0sZSl9YWZ0ZXJIaWRkZW4oKXtyZXR1cm4gdGhpcy5fb25IaWRlfWlzVmlzaWJsZSgpe3JldHVybiB0aGlzLl9pc1Zpc2libGV9bmdPbkRlc3Ryb3koKXt0aGlzLl9jYW5jZWxQZW5kaW5nQW5pbWF0aW9ucygpLHRoaXMuX29uSGlkZS5jb21wbGV0ZSgpLHRoaXMuX3RyaWdnZXJFbGVtZW50PW51bGx9X2hhbmRsZUJvZHlJbnRlcmFjdGlvbigpe3RoaXMuX2Nsb3NlT25JbnRlcmFjdGlvbiYmdGhpcy5oaWRlKDApfV9tYXJrRm9yQ2hlY2soKXt0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1faGFuZGxlTW91c2VMZWF2ZSh7cmVsYXRlZFRhcmdldDplfSl7KCFlfHwhdGhpcy5fdHJpZ2dlckVsZW1lbnQuY29udGFpbnMoZSkpJiYodGhpcy5pc1Zpc2libGUoKT90aGlzLmhpZGUodGhpcy5fbW91c2VMZWF2ZUhpZGVEZWxheSk6dGhpcy5fZmluYWxpemVBbmltYXRpb24oITEpKX1fb25TaG93KCl7dGhpcy5faXNNdWx0aWxpbmU9dGhpcy5faXNUb29sdGlwTXVsdGlsaW5lKCksdGhpcy5fbWFya0ZvckNoZWNrKCl9X2lzVG9vbHRpcE11bHRpbGluZSgpe2xldCBlPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gZS5oZWlnaHQ+SXomJmUud2lkdGg+PUx6fV9oYW5kbGVBbmltYXRpb25FbmQoe2FuaW1hdGlvbk5hbWU6ZX0peyhlPT09dGhpcy5fc2hvd0FuaW1hdGlvbnx8ZT09PXRoaXMuX2hpZGVBbmltYXRpb24pJiZ0aGlzLl9maW5hbGl6ZUFuaW1hdGlvbihlPT09dGhpcy5fc2hvd0FuaW1hdGlvbil9X2NhbmNlbFBlbmRpbmdBbmltYXRpb25zKCl7dGhpcy5fc2hvd1RpbWVvdXRJZCE9bnVsbCYmY2xlYXJUaW1lb3V0KHRoaXMuX3Nob3dUaW1lb3V0SWQpLHRoaXMuX2hpZGVUaW1lb3V0SWQhPW51bGwmJmNsZWFyVGltZW91dCh0aGlzLl9oaWRlVGltZW91dElkKSx0aGlzLl9zaG93VGltZW91dElkPXRoaXMuX2hpZGVUaW1lb3V0SWQ9dm9pZCAwfV9maW5hbGl6ZUFuaW1hdGlvbihlKXtlP3RoaXMuX2Nsb3NlT25JbnRlcmFjdGlvbj0hMDp0aGlzLmlzVmlzaWJsZSgpfHx0aGlzLl9vbkhpZGUubmV4dCgpfV90b2dnbGVWaXNpYmlsaXR5KGUpe2xldCBpPXRoaXMuX3Rvb2x0aXAubmF0aXZlRWxlbWVudCxhPXRoaXMuX3Nob3dBbmltYXRpb24scj10aGlzLl9oaWRlQW5pbWF0aW9uO2lmKGkuY2xhc3NMaXN0LnJlbW92ZShlP3I6YSksaS5jbGFzc0xpc3QuYWRkKGU/YTpyKSx0aGlzLl9pc1Zpc2libGUhPT1lJiYodGhpcy5faXNWaXNpYmxlPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpLGUmJiF0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQmJnR5cGVvZiBnZXRDb21wdXRlZFN0eWxlPT0iZnVuY3Rpb24iKXtsZXQgbz1nZXRDb21wdXRlZFN0eWxlKGkpOyhvLmdldFByb3BlcnR5VmFsdWUoImFuaW1hdGlvbi1kdXJhdGlvbiIpPT09IjBzInx8by5nZXRQcm9wZXJ0eVZhbHVlKCJhbmltYXRpb24tbmFtZSIpPT09Im5vbmUiKSYmKHRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZD0hMCl9ZSYmdGhpcy5fb25TaG93KCksdGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkJiYoaS5jbGFzc0xpc3QuYWRkKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIpLHRoaXMuX2ZpbmFsaXplQW5pbWF0aW9uKGUpKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJtYXQtdG9vbHRpcC1jb21wb25lbnQiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiZ0ZShFeiw3KSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5fdG9vbHRpcD1yLmZpcnN0KX19LGhvc3RBdHRyczpbImFyaWEtaGlkZGVuIiwidHJ1ZSJdLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMSYmUygibW91c2VsZWF2ZSIsZnVuY3Rpb24obyl7cmV0dXJuIGEuX2hhbmRsZU1vdXNlTGVhdmUobyl9KX0sZGVjbHM6NCx2YXJzOjQsY29uc3RzOltbInRvb2x0aXAiLCIiXSxbMSwibWRjLXRvb2x0aXAiLCJtYXQtbWRjLXRvb2x0aXAiLDMsImFuaW1hdGlvbmVuZCIsIm5nQ2xhc3MiXSxbMSwibWF0LW1kYy10b29sdGlwLXN1cmZhY2UiLCJtZGMtdG9vbHRpcF9fc3VyZmFjZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO2MoMCwiZGl2IiwxLDApLFMoImFuaW1hdGlvbmVuZCIsZnVuY3Rpb24oZCl7cmV0dXJuIHoociksVChhLl9oYW5kbGVBbmltYXRpb25FbmQoZCkpfSksYygyLCJkaXYiLDIpLG0oMykscygpKCl9aSYyJiYoaWUoIm1kYy10b29sdGlwLS1tdWx0aWxpbmUiLGEuX2lzTXVsdGlsaW5lKSxmKCJuZ0NsYXNzIixhLnRvb2x0aXBDbGFzcyksbCgzKSxBKGEubWVzc2FnZSkpfSxkZXBlbmRlbmNpZXM6W1QxXSxzdHlsZXM6W2AubWF0LW1kYy10b29sdGlwe3Bvc2l0aW9uOnJlbGF0aXZlO3RyYW5zZm9ybTpzY2FsZSgwKTtkaXNwbGF5OmlubGluZS1mbGV4fS5tYXQtbWRjLXRvb2x0aXA6OmJlZm9yZXtjb250ZW50OiIiO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO3otaW5kZXg6LTE7cG9zaXRpb246YWJzb2x1dGV9Lm1hdC1tZGMtdG9vbHRpcC1wYW5lbC1iZWxvdyAubWF0LW1kYy10b29sdGlwOjpiZWZvcmV7dG9wOi04cHh9Lm1hdC1tZGMtdG9vbHRpcC1wYW5lbC1hYm92ZSAubWF0LW1kYy10b29sdGlwOjpiZWZvcmV7Ym90dG9tOi04cHh9Lm1hdC1tZGMtdG9vbHRpcC1wYW5lbC1yaWdodCAubWF0LW1kYy10b29sdGlwOjpiZWZvcmV7bGVmdDotOHB4fS5tYXQtbWRjLXRvb2x0aXAtcGFuZWwtbGVmdCAubWF0LW1kYy10b29sdGlwOjpiZWZvcmV7cmlnaHQ6LThweH0ubWF0LW1kYy10b29sdGlwLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxle2FuaW1hdGlvbjpub25lO3RyYW5zZm9ybTpzY2FsZSgxKX0ubWF0LW1kYy10b29sdGlwLXN1cmZhY2V7d29yZC1icmVhazpub3JtYWw7b3ZlcmZsb3ctd3JhcDphbnl3aGVyZTtwYWRkaW5nOjRweCA4cHg7bWluLXdpZHRoOjQwcHg7bWF4LXdpZHRoOjIwMHB4O21pbi1oZWlnaHQ6MjRweDttYXgtaGVpZ2h0OjQwdmg7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OmhpZGRlbjt0ZXh0LWFsaWduOmNlbnRlcjt3aWxsLWNoYW5nZTp0cmFuc2Zvcm0sb3BhY2l0eTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC10b29sdGlwLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tbWF0LXN5cy1pbnZlcnNlLXN1cmZhY2UpKTtjb2xvcjp2YXIoLS1tYXQtdG9vbHRpcC1zdXBwb3J0aW5nLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtaW52ZXJzZS1vbi1zdXJmYWNlKSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYXQtdG9vbHRpcC1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWV4dHJhLXNtYWxsKSk7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LXRvb2x0aXAtc3VwcG9ydGluZy10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtYm9keS1zbWFsbC1mb250KSk7Zm9udC1zaXplOnZhcigtLW1hdC10b29sdGlwLXN1cHBvcnRpbmctdGV4dC1zaXplLCB2YXIoLS1tYXQtc3lzLWJvZHktc21hbGwtc2l6ZSkpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hdC10b29sdGlwLXN1cHBvcnRpbmctdGV4dC13ZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1zbWFsbC13ZWlnaHQpKTtsaW5lLWhlaWdodDp2YXIoLS1tYXQtdG9vbHRpcC1zdXBwb3J0aW5nLXRleHQtbGluZS1oZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1zbWFsbC1saW5lLWhlaWdodCkpO2xldHRlci1zcGFjaW5nOnZhcigtLW1hdC10b29sdGlwLXN1cHBvcnRpbmctdGV4dC10cmFja2luZywgdmFyKC0tbWF0LXN5cy1ib2R5LXNtYWxsLXRyYWNraW5nKSl9Lm1hdC1tZGMtdG9vbHRpcC1zdXJmYWNlOjpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dG9wOjA7bGVmdDowO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwwKTtib3JkZXItcmFkaXVzOmluaGVyaXQ7Y29udGVudDoiIjtwb2ludGVyLWV2ZW50czpub25lfS5tZGMtdG9vbHRpcC0tbXVsdGlsaW5lIC5tYXQtbWRjLXRvb2x0aXAtc3VyZmFjZXt0ZXh0LWFsaWduOmxlZnR9W2Rpcj1ydGxdIC5tZGMtdG9vbHRpcC0tbXVsdGlsaW5lIC5tYXQtbWRjLXRvb2x0aXAtc3VyZmFjZXt0ZXh0LWFsaWduOnJpZ2h0fS5tYXQtbWRjLXRvb2x0aXAtcGFuZWx7bGluZS1oZWlnaHQ6bm9ybWFsfS5tYXQtbWRjLXRvb2x0aXAtcGFuZWwubWF0LW1kYy10b29sdGlwLXBhbmVsLW5vbi1pbnRlcmFjdGl2ZXtwb2ludGVyLWV2ZW50czpub25lfUBrZXlmcmFtZXMgbWF0LW1kYy10b29sdGlwLXNob3d7MCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSgwLjgpfTEwMCV7b3BhY2l0eToxO3RyYW5zZm9ybTpzY2FsZSgxKX19QGtleWZyYW1lcyBtYXQtbWRjLXRvb2x0aXAtaGlkZXswJXtvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpfTEwMCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSgwLjgpfX0ubWF0LW1kYy10b29sdGlwLXNob3d7YW5pbWF0aW9uOm1hdC1tZGMtdG9vbHRpcC1zaG93IDE1MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpIGZvcndhcmRzfS5tYXQtbWRjLXRvb2x0aXAtaGlkZXthbmltYXRpb246bWF0LW1kYy10b29sdGlwLWhpZGUgNzVtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAxLCAxKSBmb3J3YXJkc30KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIHR9KSgpfSk7dmFyIHM0LGZsPXgoKCk9PntrKCk7eGkoKTtQbigpO0QyKCk7YzQoKTt5MSgpO3M0PSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1bW9kPXhlKHt0eXBlOnR9KTtzdGF0aWMgXHUwMjc1aW5qPXllKHtwcm92aWRlcnM6W3BsXSxpbXBvcnRzOltHYSxCaSx6ZSx6ZSxYaV19KX1yZXR1cm4gdH0pKCl9KTt2YXIgdmk9eCgoKT0+e2M0KCk7ZmwoKX0pO2Z1bmN0aW9uIFB6KHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJidXR0b24iLDQpLGIoMSwidHJhbnNsYXRlIiksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5zdGFydEhhY2tpbmdJbnN0cnVjdG9yKCkpfSksYygyLCJtYXQtaWNvbiIpLG0oMywiIHNjaG9vbCAiKSxzKCksYyg0LCJzcGFuIiw1KSxtKDUpLGIoNiwidHJhbnNsYXRlIikscygpKCl9dCYyJiYoZigibWF0VG9vbHRpcCIsQygxLDIsIlNDT1JFX0JPQVJEX0hBQ0tJTkdfSU5TVFJVQ1RPUiIpKSxsKDUpLEEoQyg2LDQsIkJUTl9HRVRUSU5HX1NUQVJURUQiKSkpfWZ1bmN0aW9uIFZ6KHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJidXR0b24iLDYpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpO3JldHVybiBUKGEuY2xvc2VXZWxjb21lKCkpfSksYygxLCJtYXQtaWNvbiIpLG0oMiwiIHZpc2liaWxpdHlfb2ZmICIpLHMoKSxjKDMsInNwYW4iLDcpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKX10JjImJihsKDQpLEEoQyg1LDEsIkJUTl9ESVNNSVNTIikpKX12YXIgc2gsbGg9eCgoKT0+e2soKTtLMSgpO2dpKCk7d2koKTtXKCk7dmUoKTt2aSgpO25lKCk7aygpO25lKCk7dmUoKTtXKCk7c2g9KCgpPT57Y2xhc3MgdHtkaWFsb2dSZWY9aCh0YSk7Y29uZmlndXJhdGlvblNlcnZpY2U9aChMdCk7Y29va2llU2VydmljZT1oKFp0KTt0aXRsZT0iV2VsY29tZSB0byBPV0FTUCBKdWljZSBTaG9wIjttZXNzYWdlPSI8cD5CZWluZyBhIHdlYiBhcHBsaWNhdGlvbiB3aXRoIGEgdmFzdCBudW1iZXIgb2YgaW50ZW5kZWQgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLCB0aGUgPHN0cm9uZz5PV0FTUCBKdWljZSBTaG9wPC9zdHJvbmc+IGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBvcHBvc2l0ZSBvZiBhIGJlc3QgcHJhY3RpY2Ugb3IgdGVtcGxhdGUgYXBwbGljYXRpb24gZm9yIHdlYiBkZXZlbG9wZXJzOiBJdCBpcyBhbiBhd2FyZW5lc3MsIHRyYWluaW5nLCBkZW1vbnN0cmF0aW9uIGFuZCBleGVyY2lzZSB0b29sIGZvciBzZWN1cml0eSByaXNrcyBpbiBtb2Rlcm4gd2ViIGFwcGxpY2F0aW9ucy4gVGhlIDxzdHJvbmc+T1dBU1AgSnVpY2UgU2hvcDwvc3Ryb25nPiBpcyBhbiBvcGVuLXNvdXJjZSBwcm9qZWN0IGhvc3RlZCBieSB0aGUgbm9uLXByb2ZpdCA8YSBocmVmPSdodHRwczovL293YXNwLm9yZycgdGFyZ2V0PSdfYmxhbmsnPk9wZW4gV29ybGR3aWRlIEFwcGxpY2F0aW9uIFNlY3VyaXR5IFByb2plY3QgKE9XQVNQKTwvYT4gYW5kIGlzIGRldmVsb3BlZCBhbmQgbWFpbnRhaW5lZCBieSB2b2x1bnRlZXJzLiBDaGVjayBvdXQgdGhlIGxpbmsgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24gb24gdGhlIHByb2plY3QuPC9wPjxoMT48YSBocmVmPSdodHRwczovL293YXNwLWp1aWNlLnNob3AnIHRhcmdldD0nX2JsYW5rJz5odHRwczovL293YXNwLWp1aWNlLnNob3A8L2E+PC9oMT4iO3Nob3dIYWNraW5nSW5zdHJ1Y3Rvcj0hMDtzaG93RGlzbWlzc0J0bj0hMDt3ZWxjb21lQmFubmVyU3RhdHVzQ29va2llS2V5PSJ3ZWxjb21lYmFubmVyX3N0YXR1cyI7bmdPbkluaXQoKXt0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbigpLnN1YnNjcmliZSh7bmV4dDplPT57ZT8uYXBwbGljYXRpb24/LndlbGNvbWVCYW5uZXImJih0aGlzLnRpdGxlPWUuYXBwbGljYXRpb24ud2VsY29tZUJhbm5lci50aXRsZSx0aGlzLm1lc3NhZ2U9ZS5hcHBsaWNhdGlvbi53ZWxjb21lQmFubmVyLm1lc3NhZ2UpLHRoaXMuc2hvd0hhY2tpbmdJbnN0cnVjdG9yPWU/LmhhY2tpbmdJbnN0cnVjdG9yPy5pc0VuYWJsZWQsdGhpcy5zaG93SGFja2luZ0luc3RydWN0b3ImJmU/LmNoYWxsZW5nZXM/LnJlc3RyaWN0VG9UdXRvcmlhbHNGaXJzdCYmKHRoaXMuZGlhbG9nUmVmLmRpc2FibGVDbG9zZT0hMCx0aGlzLnNob3dEaXNtaXNzQnRuPSExKX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfXN0YXJ0SGFja2luZ0luc3RydWN0b3IoKXt0aGlzLmNsb3NlV2VsY29tZSgpLGNvbnNvbGUubG9nKCdTdGFydGluZyBpbnN0cnVjdGlvbnMgZm9yIGNoYWxsZW5nZSAiU2NvcmUgQm9hcmQiJyksdGhpcy5sYXVuY2hIYWNraW5nSW5zdHJ1Y3RvcigiU2NvcmUgQm9hcmQiKX1sYXVuY2hIYWNraW5nSW5zdHJ1Y3RvcihlKXtpbXBvcnQoIi4vaGFja2luZy1pbnN0cnVjdG9yLU9ZVUtDREdHLmpzIikudGhlbihpPT57aS5zdGFydEhhY2tpbmdJbnN0cnVjdG9yRm9yKGUpfSl9Y2xvc2VXZWxjb21lKCl7dGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtsZXQgZT1uZXcgRGF0ZTtlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSsxKSx0aGlzLmNvb2tpZVNlcnZpY2UucHV0KHRoaXMud2VsY29tZUJhbm5lclN0YXR1c0Nvb2tpZUtleSwiZGlzbWlzcyIse2V4cGlyZXM6ZX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC13ZWxjb21lLWJhbm5lciJdXSxkZWNsczo2LHZhcnM6NCxjb25zdHM6W1sxLCJ0ZXh0LWp1c3RpZnkiLDMsImlubmVySHRtbCJdLFsxLCJidXR0b24tZm9vdGVyIl0sWyJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsImNvbG9yIiwid2FybiIsIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIiwzLCJtYXRUb29sdGlwIl0sWyJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsImNvbG9yIiwicHJpbWFyeSIsImFyaWEtbGFiZWwiLCJDbG9zZSBXZWxjb21lIEJhbm5lciIsMSwiY2xvc2UtZGlhbG9nIl0sWyJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsImNvbG9yIiwid2FybiIsIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIiwzLCJjbGljayIsIm1hdFRvb2x0aXAiXSxbMSwiaGlkZS1sdC1sZyJdLFsibWF0LXJhaXNlZC1idXR0b24iLCIiLCJjb2xvciIsInByaW1hcnkiLCJhcmlhLWxhYmVsIiwiQ2xvc2UgV2VsY29tZSBCYW5uZXIiLDEsImNsb3NlLWRpYWxvZyIsMywiY2xpY2siXSxbMSwiaGlkZS1sdC1zbSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwiaDEiKSxtKDEpLHMoKSx1KDIsImRpdiIsMCksYygzLCJkaXYiLDEpLE0oNCxQeiw3LDYsImJ1dHRvbiIsMiksTSg1LFZ6LDYsMywiYnV0dG9uIiwzKSxzKCkpLGkmMiYmKGwoKSxBKGEudGl0bGUpLGwoKSxmKCJpbm5lckh0bWwiLGEubWVzc2FnZSx0dCksbCgyKSx3KGEuc2hvd0hhY2tpbmdJbnN0cnVjdG9yPzQ6LTEpLGwoKSx3KGEuc2hvd0Rpc21pc3NCdG4/NTotMSkpfSxkZXBlbmRlbmNpZXM6W29lLGxlLFJ0LGdlLENlLFksS10sc3R5bGVzOltgW19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO21hcmdpbjoxLjVyZW19LnRleHQtanVzdGlmeVtfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpqdXN0aWZ5O3RleHQtanVzdGlmeTppbnRlci13b3JkfVtfbmdob3N0LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0gICBhW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH1bX25naG9zdC0lQ09NUCVdICAgICBzdHJvbmd7Zm9udC1zdHlsZTppdGFsaWN9LmJ1dHRvbi1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmNsb3NlLWRpYWxvZ1tfbmdjb250ZW50LSVDT01QJV17Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjE0cHh9bWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MjRweCFpbXBvcnRhbnQ7aGVpZ2h0OjI0cHghaW1wb3J0YW50O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luLXJpZ2h0Oi4xMjVyZW0haW1wb3J0YW50O3dpZHRoOjI0cHghaW1wb3J0YW50fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEyNzlweCl7bWF0LWljb25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0Oi4xMjVyZW0haW1wb3J0YW50fX0uaGlkZS1sdC1sZ1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmV9QG1lZGlhIChtYXgtd2lkdGg6IDEyNzkuOThweCl7LmhpZGUtbHQtbGdbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fS5oaWRlLWx0LXNtW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZX1AbWVkaWEgKG1heC13aWR0aDogNTk5Ljk4cHgpey5oaWRlLWx0LXNtW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIGRoLG1oPXgoKCk9PntrKCk7SzEoKTtnaSgpO2xoKCk7d2koKTtrKCk7ZGg9KCgpPT57Y2xhc3MgdHtkaWFsb2c9aChOMSk7Y29uZmlndXJhdGlvblNlcnZpY2U9aChMdCk7Y29va2llU2VydmljZT1oKFp0KTt3ZWxjb21lQmFubmVyU3RhdHVzQ29va2llS2V5PSJ3ZWxjb21lYmFubmVyX3N0YXR1cyI7bmdPbkluaXQoKXt0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KHRoaXMud2VsY29tZUJhbm5lclN0YXR1c0Nvb2tpZUtleSkhPT0iZGlzbWlzcyImJnRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0QXBwbGljYXRpb25Db25maWd1cmF0aW9uKCkuc3Vic2NyaWJlKHtuZXh0Omk9PntpPy5hcHBsaWNhdGlvbj8ud2VsY29tZUJhbm5lciYmIWkuYXBwbGljYXRpb24ud2VsY29tZUJhbm5lci5zaG93T25GaXJzdFN0YXJ0fHx0aGlzLmRpYWxvZy5vcGVuKHNoLHttaW5XaWR0aDoiMzIwcHgiLHdpZHRoOiIzNSUiLHBvc2l0aW9uOnt0b3A6IjUwcHgifX0pfSxlcnJvcjppPT57Y29uc29sZS5sb2coaSl9fSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLXdlbGNvbWUiXV0sZGVjbHM6MSx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJlppKDAsImRpdiIpfSxzdHlsZXM6W2Aud2VsY29tZS1zdHlsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW1kYy1kaWFsb2ctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvO21heC13aWR0aDo1MCU7bWluLXdpZHRoOjMyMHB4fQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgU2ksd2E9eCgoKT0+e050KCk7V3QoKTtrKCk7bHQoKTtrKCk7U2k9KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtob3N0PXRoaXMuaG9zdFNlcnZlcisiL2FwaS9DaGFsbGVuZ2VzIjtmaW5kKGUpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaG9zdCsiLyIse3BhcmFtczplfSkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1yZXBlYXROb3RpZmljYXRpb24oZSl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0U2VydmVyKyIvcmVzdC9yZXBlYXQtbm90aWZpY2F0aW9uIix7cGFyYW1zOntjaGFsbGVuZ2U6ZX0scmVzcG9uc2VUeXBlOiJ0ZXh0In0pLnBpcGUoaihpPT57dGhyb3cgaX0pKX1jb250aW51ZUNvZGUoKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmhvc3RTZXJ2ZXIrIi9yZXN0L2NvbnRpbnVlLWNvZGUiKS5waXBlKHEoZT0+ZS5jb250aW51ZUNvZGUpLGooZT0+e3Rocm93IGV9KSl9Y29udGludWVDb2RlRmluZEl0KCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0U2VydmVyKyIvcmVzdC9jb250aW51ZS1jb2RlLWZpbmRJdCIpLnBpcGUocShlPT5lLmNvbnRpbnVlQ29kZSksaihlPT57dGhyb3cgZX0pKX1jb250aW51ZUNvZGVGaXhJdCgpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaG9zdFNlcnZlcisiL3Jlc3QvY29udGludWUtY29kZS1maXhJdCIpLnBpcGUocShlPT5lLmNvbnRpbnVlQ29kZSksaihlPT57dGhyb3cgZX0pKX1yZXN0b3JlUHJvZ3Jlc3MoZSl7cmV0dXJuIHRoaXMuaHR0cC5wdXQodGhpcy5ob3N0U2VydmVyKyIvcmVzdC9jb250aW51ZS1jb2RlL2FwcGx5LyIrZSx7fSkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1yZXN0b3JlUHJvZ3Jlc3NGaW5kSXQoZSl7cmV0dXJuIHRoaXMuaHR0cC5wdXQodGhpcy5ob3N0U2VydmVyKyIvcmVzdC9jb250aW51ZS1jb2RlLWZpbmRJdC9hcHBseS8iK2Use30pLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9cmVzdG9yZVByb2dyZXNzRml4SXQoZSl7cmV0dXJuIHRoaXMuaHR0cC5wdXQodGhpcy5ob3N0U2VydmVyKyIvcmVzdC9jb250aW51ZS1jb2RlLWZpeEl0L2FwcGx5LyIrZSx7fSkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO3ZhciBoaCxwaD14KCgpPT57TnQoKTtXdCgpO2soKTtsdCgpO2soKTtoaD0oKCk9PntjbGFzcyB0e2h0dHA9aChBZSk7aG9zdFNlcnZlcj11ZS5ob3N0U2VydmVyO2dldENvdW50cnlNYXBwaW5nKCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0U2VydmVyKyIvcmVzdC9jb3VudHJ5LW1hcHBpbmciKS5waXBlKGooZT0+e3Rocm93IGV9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTt2YXIgdWw9VGUoKGRYLGZoKT0+e3ZhciBPej0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKGh0dHB8aHR0cHN8d3N8d3NzKTpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPygoPzpbYS1mMC05XXswLDR9Oil7Miw3fVthLWYwLTldezAsNH18W146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLyxIej1bInNvdXJjZSIsInByb3RvY29sIiwiYXV0aG9yaXR5IiwidXNlckluZm8iLCJ1c2VyIiwicGFzc3dvcmQiLCJob3N0IiwicG9ydCIsInJlbGF0aXZlIiwicGF0aCIsImRpcmVjdG9yeSIsImZpbGUiLCJxdWVyeSIsImFuY2hvciJdO2ZoLmV4cG9ydHM9ZnVuY3Rpb24obil7dmFyIGU9bixpPW4uaW5kZXhPZigiWyIpLGE9bi5pbmRleE9mKCJdIik7aSE9LTEmJmEhPS0xJiYobj1uLnN1YnN0cmluZygwLGkpK24uc3Vic3RyaW5nKGksYSkucmVwbGFjZSgvOi9nLCI7Iikrbi5zdWJzdHJpbmcoYSxuLmxlbmd0aCkpO2Zvcih2YXIgcj1Pei5leGVjKG58fCIiKSxvPXt9LGQ9MTQ7ZC0tOylvW0h6W2RdXT1yW2RdfHwiIjtyZXR1cm4gaSE9LTEmJmEhPS0xJiYoby5zb3VyY2U9ZSxvLmhvc3Q9by5ob3N0LnN1YnN0cmluZygxLG8uaG9zdC5sZW5ndGgtMSkucmVwbGFjZSgvOy9nLCI6Iiksby5hdXRob3JpdHk9by5hdXRob3JpdHkucmVwbGFjZSgiWyIsIiIpLnJlcGxhY2UoIl0iLCIiKS5yZXBsYWNlKC87L2csIjoiKSxvLmlwdjZ1cmk9ITApLG8ucGF0aE5hbWVzPU56KG8sby5wYXRoKSxvLnF1ZXJ5S2V5PVJ6KG8sby5xdWVyeSksb307ZnVuY3Rpb24gTnoodCxuKXt2YXIgZT0vXC97Miw5fS9nLGk9bi5yZXBsYWNlKGUsIi8iKS5zcGxpdCgiLyIpO3JldHVybihuLnN1YnN0cigwLDEpPT0iLyJ8fG4ubGVuZ3RoPT09MCkmJmkuc3BsaWNlKDAsMSksbi5zdWJzdHIobi5sZW5ndGgtMSwxKT09Ii8iJiZpLnNwbGljZShpLmxlbmd0aC0xLDEpLGl9ZnVuY3Rpb24gUnoodCxuKXt2YXIgZT17fTtyZXR1cm4gbi5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihpLGEscil7YSYmKGVbYV09cil9KSxlfX0pO3ZhciBnbD1UZSgobVgsdWgpPT57dmFyIElyPTFlMyxMcj1Jcio2MCxQcj1Mcio2MCxIbj1QcioyNCxGej1Ibio3LEJ6PUhuKjM2NS4yNTt1aC5leHBvcnRzPWZ1bmN0aW9uKHQsbil7bj1ufHx7fTt2YXIgZT10eXBlb2YgdDtpZihlPT09InN0cmluZyImJnQubGVuZ3RoPjApcmV0dXJuIFV6KHQpO2lmKGU9PT0ibnVtYmVyIiYmaXNGaW5pdGUodCkpcmV0dXJuIG4ubG9uZz9xeih0KTpqeih0KTt0aHJvdyBuZXcgRXJyb3IoInZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9IitKU09OLnN0cmluZ2lmeSh0KSl9O2Z1bmN0aW9uIFV6KHQpe2lmKHQ9U3RyaW5nKHQpLCEodC5sZW5ndGg+MTAwKSl7dmFyIG49L14oLT8oPzpcZCspP1wuP1xkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKHQpO2lmKG4pe3ZhciBlPXBhcnNlRmxvYXQoblsxXSksaT0oblsyXXx8Im1zIikudG9Mb3dlckNhc2UoKTtzd2l0Y2goaSl7Y2FzZSJ5ZWFycyI6Y2FzZSJ5ZWFyIjpjYXNlInlycyI6Y2FzZSJ5ciI6Y2FzZSJ5IjpyZXR1cm4gZSpCejtjYXNlIndlZWtzIjpjYXNlIndlZWsiOmNhc2UidyI6cmV0dXJuIGUqRno7Y2FzZSJkYXlzIjpjYXNlImRheSI6Y2FzZSJkIjpyZXR1cm4gZSpIbjtjYXNlImhvdXJzIjpjYXNlImhvdXIiOmNhc2UiaHJzIjpjYXNlImhyIjpjYXNlImgiOnJldHVybiBlKlByO2Nhc2UibWludXRlcyI6Y2FzZSJtaW51dGUiOmNhc2UibWlucyI6Y2FzZSJtaW4iOmNhc2UibSI6cmV0dXJuIGUqTHI7Y2FzZSJzZWNvbmRzIjpjYXNlInNlY29uZCI6Y2FzZSJzZWNzIjpjYXNlInNlYyI6Y2FzZSJzIjpyZXR1cm4gZSpJcjtjYXNlIm1pbGxpc2Vjb25kcyI6Y2FzZSJtaWxsaXNlY29uZCI6Y2FzZSJtc2VjcyI6Y2FzZSJtc2VjIjpjYXNlIm1zIjpyZXR1cm4gZTtkZWZhdWx0OnJldHVybn19fX1mdW5jdGlvbiBqeih0KXt2YXIgbj1NYXRoLmFicyh0KTtyZXR1cm4gbj49SG4/TWF0aC5yb3VuZCh0L0huKSsiZCI6bj49UHI/TWF0aC5yb3VuZCh0L1ByKSsiaCI6bj49THI/TWF0aC5yb3VuZCh0L0xyKSsibSI6bj49SXI/TWF0aC5yb3VuZCh0L0lyKSsicyI6dCsibXMifWZ1bmN0aW9uIHF6KHQpe3ZhciBuPU1hdGguYWJzKHQpO3JldHVybiBuPj1Ibj9LMCh0LG4sSG4sImRheSIpOm4+PVByP0swKHQsbixQciwiaG91ciIpOm4+PUxyP0swKHQsbixMciwibWludXRlIik6bj49SXI/SzAodCxuLElyLCJzZWNvbmQiKTp0KyIgbXMifWZ1bmN0aW9uIEswKHQsbixlLGkpe3ZhciBhPW4+PWUqMS41O3JldHVybiBNYXRoLnJvdW5kKHQvZSkrIiAiK2krKGE/InMiOiIiKX19KTt2YXIgdmg9VGUoKGhYLGdoKT0+e2Z1bmN0aW9uIEd6KHQpe2UuZGVidWc9ZSxlLmRlZmF1bHQ9ZSxlLmNvZXJjZT1wLGUuZGlzYWJsZT1yLGUuZW5hYmxlPWEsZS5lbmFibGVkPW8sZS5odW1hbml6ZT1nbCgpLGUuZGVzdHJveT1nLE9iamVjdC5rZXlzKHQpLmZvckVhY2goXz0+e2VbX109dFtfXX0pLGUubmFtZXM9W10sZS5za2lwcz1bXSxlLmZvcm1hdHRlcnM9e307ZnVuY3Rpb24gbihfKXtsZXQgeT0wO2ZvcihsZXQgST0wO0k8Xy5sZW5ndGg7SSsrKXk9KHk8PDUpLXkrXy5jaGFyQ29kZUF0KEkpLHl8PTA7cmV0dXJuIGUuY29sb3JzW01hdGguYWJzKHkpJWUuY29sb3JzLmxlbmd0aF19ZS5zZWxlY3RDb2xvcj1uO2Z1bmN0aW9uIGUoXyl7bGV0IHksST1udWxsLFAsVjtmdW5jdGlvbiBPKC4uLlUpe2lmKCFPLmVuYWJsZWQpcmV0dXJuO2xldCBRPU8sZmU9TnVtYmVyKG5ldyBEYXRlKSxPZT1mZS0oeXx8ZmUpO1EuZGlmZj1PZSxRLnByZXY9eSxRLmN1cnI9ZmUseT1mZSxVWzBdPWUuY29lcmNlKFVbMF0pLHR5cGVvZiBVWzBdIT0ic3RyaW5nIiYmVS51bnNoaWZ0KCIlTyIpO2xldCBNZT0wO1VbMF09VVswXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywoTmUsWWUpPT57aWYoTmU9PT0iJSUiKXJldHVybiIlIjtNZSsrO2xldCB2dD1lLmZvcm1hdHRlcnNbWWVdO2lmKHR5cGVvZiB2dD09ImZ1bmN0aW9uIil7bGV0IE0xPVVbTWVdO05lPXZ0LmNhbGwoUSxNMSksVS5zcGxpY2UoTWUsMSksTWUtLX1yZXR1cm4gTmV9KSxlLmZvcm1hdEFyZ3MuY2FsbChRLFUpLChRLmxvZ3x8ZS5sb2cpLmFwcGx5KFEsVSl9cmV0dXJuIE8ubmFtZXNwYWNlPV8sTy51c2VDb2xvcnM9ZS51c2VDb2xvcnMoKSxPLmNvbG9yPWUuc2VsZWN0Q29sb3IoXyksTy5leHRlbmQ9aSxPLmRlc3Ryb3k9ZS5kZXN0cm95LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCJlbmFibGVkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OigpPT5JIT09bnVsbD9JOihQIT09ZS5uYW1lc3BhY2VzJiYoUD1lLm5hbWVzcGFjZXMsVj1lLmVuYWJsZWQoXykpLFYpLHNldDpVPT57ST1VfX0pLHR5cGVvZiBlLmluaXQ9PSJmdW5jdGlvbiImJmUuaW5pdChPKSxPfWZ1bmN0aW9uIGkoXyx5KXtsZXQgST1lKHRoaXMubmFtZXNwYWNlKyh0eXBlb2YgeT4idSI/IjoiOnkpK18pO3JldHVybiBJLmxvZz10aGlzLmxvZyxJfWZ1bmN0aW9uIGEoXyl7ZS5zYXZlKF8pLGUubmFtZXNwYWNlcz1fLGUubmFtZXM9W10sZS5za2lwcz1bXTtsZXQgeSxJPSh0eXBlb2YgXz09InN0cmluZyI/XzoiIikuc3BsaXQoL1tccyxdKy8pLFA9SS5sZW5ndGg7Zm9yKHk9MDt5PFA7eSsrKUlbeV0mJihfPUlbeV0ucmVwbGFjZSgvXCovZywiLio/IiksX1swXT09PSItIj9lLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgiXiIrXy5zbGljZSgxKSsiJCIpKTplLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgiXiIrXysiJCIpKSl9ZnVuY3Rpb24gcigpe2xldCBfPVsuLi5lLm5hbWVzLm1hcChkKSwuLi5lLnNraXBzLm1hcChkKS5tYXAoeT0+Ii0iK3kpXS5qb2luKCIsIik7cmV0dXJuIGUuZW5hYmxlKCIiKSxffWZ1bmN0aW9uIG8oXyl7aWYoX1tfLmxlbmd0aC0xXT09PSIqIilyZXR1cm4hMDtsZXQgeSxJO2Zvcih5PTAsST1lLnNraXBzLmxlbmd0aDt5PEk7eSsrKWlmKGUuc2tpcHNbeV0udGVzdChfKSlyZXR1cm4hMTtmb3IoeT0wLEk9ZS5uYW1lcy5sZW5ndGg7eTxJO3krKylpZihlLm5hbWVzW3ldLnRlc3QoXykpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZChfKXtyZXR1cm4gXy50b1N0cmluZygpLnN1YnN0cmluZygyLF8udG9TdHJpbmcoKS5sZW5ndGgtMikucmVwbGFjZSgvXC5cKlw/JC8sIioiKX1mdW5jdGlvbiBwKF8pe3JldHVybiBfIGluc3RhbmNlb2YgRXJyb3I/Xy5zdGFja3x8Xy5tZXNzYWdlOl99ZnVuY3Rpb24gZygpe2NvbnNvbGUud2FybigiSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLiIpfXJldHVybiBlLmVuYWJsZShlLmxvYWQoKSksZX1naC5leHBvcnRzPUd6fSk7dmFyIFZyPVRlKChhMixYMCk9PnthMi5mb3JtYXRBcmdzPVF6O2EyLnNhdmU9WXo7YTIubG9hZD1aejthMi51c2VDb2xvcnM9V3o7YTIuc3RvcmFnZT0keigpO2EyLmRlc3Ryb3k9KCgpPT57bGV0IHQ9ITE7cmV0dXJuKCk9Pnt0fHwodD0hMCxjb25zb2xlLndhcm4oIkluc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4iKSl9fSkoKTthMi5jb2xvcnM9WyIjMDAwMENDIiwiIzAwMDBGRiIsIiMwMDMzQ0MiLCIjMDAzM0ZGIiwiIzAwNjZDQyIsIiMwMDY2RkYiLCIjMDA5OUNDIiwiIzAwOTlGRiIsIiMwMENDMDAiLCIjMDBDQzMzIiwiIzAwQ0M2NiIsIiMwMENDOTkiLCIjMDBDQ0NDIiwiIzAwQ0NGRiIsIiMzMzAwQ0MiLCIjMzMwMEZGIiwiIzMzMzNDQyIsIiMzMzMzRkYiLCIjMzM2NkNDIiwiIzMzNjZGRiIsIiMzMzk5Q0MiLCIjMzM5OUZGIiwiIzMzQ0MwMCIsIiMzM0NDMzMiLCIjMzNDQzY2IiwiIzMzQ0M5OSIsIiMzM0NDQ0MiLCIjMzNDQ0ZGIiwiIzY2MDBDQyIsIiM2NjAwRkYiLCIjNjYzM0NDIiwiIzY2MzNGRiIsIiM2NkNDMDAiLCIjNjZDQzMzIiwiIzk5MDBDQyIsIiM5OTAwRkYiLCIjOTkzM0NDIiwiIzk5MzNGRiIsIiM5OUNDMDAiLCIjOTlDQzMzIiwiI0NDMDAwMCIsIiNDQzAwMzMiLCIjQ0MwMDY2IiwiI0NDMDA5OSIsIiNDQzAwQ0MiLCIjQ0MwMEZGIiwiI0NDMzMwMCIsIiNDQzMzMzMiLCIjQ0MzMzY2IiwiI0NDMzM5OSIsIiNDQzMzQ0MiLCIjQ0MzM0ZGIiwiI0NDNjYwMCIsIiNDQzY2MzMiLCIjQ0M5OTAwIiwiI0NDOTkzMyIsIiNDQ0NDMDAiLCIjQ0NDQzMzIiwiI0ZGMDAwMCIsIiNGRjAwMzMiLCIjRkYwMDY2IiwiI0ZGMDA5OSIsIiNGRjAwQ0MiLCIjRkYwMEZGIiwiI0ZGMzMwMCIsIiNGRjMzMzMiLCIjRkYzMzY2IiwiI0ZGMzM5OSIsIiNGRjMzQ0MiLCIjRkYzM0ZGIiwiI0ZGNjYwMCIsIiNGRjY2MzMiLCIjRkY5OTAwIiwiI0ZGOTkzMyIsIiNGRkNDMDAiLCIjRkZDQzMzIl07ZnVuY3Rpb24gV3ooKXtpZih0eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93LnByb2Nlc3MmJih3aW5kb3cucHJvY2Vzcy50eXBlPT09InJlbmRlcmVyInx8d2luZG93LnByb2Nlc3MuX19ud2pzKSlyZXR1cm4hMDtpZih0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVwvKFxkKykvKSlyZXR1cm4hMTtsZXQgdDtyZXR1cm4gdHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlfHx0eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93LmNvbnNvbGUmJih3aW5kb3cuY29uc29sZS5maXJlYnVnfHx3aW5kb3cuY29uc29sZS5leGNlcHRpb24mJndpbmRvdy5jb25zb2xlLnRhYmxlKXx8dHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci51c2VyQWdlbnQmJih0PW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFwvKFxkKykvKSkmJnBhcnNlSW50KHRbMV0sMTApPj0zMXx8dHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcLyhcZCspLyl9ZnVuY3Rpb24gUXoodCl7aWYodFswXT0odGhpcy51c2VDb2xvcnM/IiVjIjoiIikrdGhpcy5uYW1lc3BhY2UrKHRoaXMudXNlQ29sb3JzPyIgJWMiOiIgIikrdFswXSsodGhpcy51c2VDb2xvcnM/IiVjICI6IiAiKSsiKyIrWDAuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpLCF0aGlzLnVzZUNvbG9ycylyZXR1cm47bGV0IG49ImNvbG9yOiAiK3RoaXMuY29sb3I7dC5zcGxpY2UoMSwwLG4sImNvbG9yOiBpbmhlcml0Iik7bGV0IGU9MCxpPTA7dFswXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csYT0+e2EhPT0iJSUiJiYoZSsrLGE9PT0iJWMiJiYoaT1lKSl9KSx0LnNwbGljZShpLDAsbil9YTIubG9nPWNvbnNvbGUuZGVidWd8fGNvbnNvbGUubG9nfHwoKCk9Pnt9KTtmdW5jdGlvbiBZeih0KXt0cnl7dD9hMi5zdG9yYWdlLnNldEl0ZW0oImRlYnVnIix0KTphMi5zdG9yYWdlLnJlbW92ZUl0ZW0oImRlYnVnIil9Y2F0Y2h7fX1mdW5jdGlvbiBaeigpe2xldCB0O3RyeXt0PWEyLnN0b3JhZ2UuZ2V0SXRlbSgiZGVidWciKX1jYXRjaHt9cmV0dXJuIXQmJnR5cGVvZiBwcm9jZXNzPCJ1IiYmImVudiJpbiBwcm9jZXNzJiYodD1wcm9jZXNzLmVudi5ERUJVRyksdH1mdW5jdGlvbiAkeigpe3RyeXtyZXR1cm4gbG9jYWxTdG9yYWdlfWNhdGNoe319WDAuZXhwb3J0cz12aCgpKGEyKTt2YXJ7Zm9ybWF0dGVyczpLen09WDAuZXhwb3J0cztLei5qPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2gobil7cmV0dXJuIltVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAiK24ubWVzc2FnZX19fSk7dmFyIGJoPVRlKEowPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShKMCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7SjAudXJsPXZvaWQgMDt2YXIgWHo9dWwoKSxfaD1WcigpKCJzb2NrZXQuaW8tY2xpZW50OnVybCIpO2Z1bmN0aW9uIEp6KHQsbj0iIixlKXtsZXQgaT10O2U9ZXx8dHlwZW9mIGxvY2F0aW9uPCJ1IiYmbG9jYXRpb24sdD09bnVsbCYmKHQ9ZS5wcm90b2NvbCsiLy8iK2UuaG9zdCksdHlwZW9mIHQ9PSJzdHJpbmciJiYodC5jaGFyQXQoMCk9PT0iLyImJih0LmNoYXJBdCgxKT09PSIvIj90PWUucHJvdG9jb2wrdDp0PWUuaG9zdCt0KSwvXihodHRwcz98d3NzPyk6XC9cLy8udGVzdCh0KXx8KF9oKCJwcm90b2NvbC1sZXNzIHVybCAlcyIsdCksdHlwZW9mIGU8InUiP3Q9ZS5wcm90b2NvbCsiLy8iK3Q6dD0iaHR0cHM6Ly8iK3QpLF9oKCJwYXJzZSAlcyIsdCksaT1Yeih0KSksaS5wb3J0fHwoL14oaHR0cHx3cykkLy50ZXN0KGkucHJvdG9jb2wpP2kucG9ydD0iODAiOi9eKGh0dHB8d3MpcyQvLnRlc3QoaS5wcm90b2NvbCkmJihpLnBvcnQ9IjQ0MyIpKSxpLnBhdGg9aS5wYXRofHwiLyI7bGV0IHI9aS5ob3N0LmluZGV4T2YoIjoiKSE9PS0xPyJbIitpLmhvc3QrIl0iOmkuaG9zdDtyZXR1cm4gaS5pZD1pLnByb3RvY29sKyI6Ly8iK3IrIjoiK2kucG9ydCtuLGkuaHJlZj1pLnByb3RvY29sKyI6Ly8iK3IrKGUmJmUucG9ydD09PWkucG9ydD8iIjoiOiIraS5wb3J0KSxpfUowLnVybD1Ken0pO3ZhciBDaD1UZSgoZlgsdmwpPT57dHJ5e3ZsLmV4cG9ydHM9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0PCJ1IiYmIndpdGhDcmVkZW50aWFscyJpbiBuZXcgWE1MSHR0cFJlcXVlc3R9Y2F0Y2h7dmwuZXhwb3J0cz0hMX19KTt2YXIgbDQ9VGUoKHVYLHloKT0+e3loLmV4cG9ydHM9dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OkZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9KTt2YXIgX2w9VGUoKGdYLHhoKT0+e3ZhciBlVD1DaCgpLHRUPWw0KCk7eGguZXhwb3J0cz1mdW5jdGlvbih0KXtsZXQgbj10Lnhkb21haW4sZT10LnhzY2hlbWUsaT10LmVuYWJsZXNYRFI7dHJ5e2lmKHR5cGVvZiBYTUxIdHRwUmVxdWVzdDwidSImJighbnx8ZVQpKXJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3R9Y2F0Y2h7fXRyeXtpZih0eXBlb2YgWERvbWFpblJlcXVlc3Q8InUiJiYhZSYmaSlyZXR1cm4gbmV3IFhEb21haW5SZXF1ZXN0fWNhdGNoe31pZighbil0cnl7cmV0dXJuIG5ldyB0VFtbIkFjdGl2ZSJdLmNvbmNhdCgiT2JqZWN0Iikuam9pbigiWCIpXSgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaHt9fX0pO3ZhciBibD1UZSgodlgsd2gpPT57dmFyIGlhPU9iamVjdC5jcmVhdGUobnVsbCk7aWEub3Blbj0iMCI7aWEuY2xvc2U9IjEiO2lhLnBpbmc9IjIiO2lhLnBvbmc9IjMiO2lhLm1lc3NhZ2U9IjQiO2lhLnVwZ3JhZGU9IjUiO2lhLm5vb3A9IjYiO3ZhciBNaD1PYmplY3QuY3JlYXRlKG51bGwpO09iamVjdC5rZXlzKGlhKS5mb3JFYWNoKHQ9PntNaFtpYVt0XV09dH0pO3ZhciBpVD17dHlwZToiZXJyb3IiLGRhdGE6InBhcnNlciBlcnJvciJ9O3doLmV4cG9ydHM9e1BBQ0tFVF9UWVBFUzppYSxQQUNLRVRfVFlQRVNfUkVWRVJTRTpNaCxFUlJPUl9QQUNLRVQ6aVR9fSk7dmFyIHpoPVRlKChfWCxraCk9Pnt2YXJ7UEFDS0VUX1RZUEVTOmFUfT1ibCgpLG5UPXR5cGVvZiBCbG9iPT0iZnVuY3Rpb24ifHx0eXBlb2YgQmxvYjwidSImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChCbG9iKT09PSJbb2JqZWN0IEJsb2JDb25zdHJ1Y3Rvcl0iLHJUPXR5cGVvZiBBcnJheUJ1ZmZlcj09ImZ1bmN0aW9uIixvVD10PT50eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3PT0iZnVuY3Rpb24iP0FycmF5QnVmZmVyLmlzVmlldyh0KTp0JiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyLGNUPSh7dHlwZTp0LGRhdGE6bn0sZSxpKT0+blQmJm4gaW5zdGFuY2VvZiBCbG9iP2U/aShuKTpTaChuLGkpOnJUJiYobiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxvVChuKSk/ZT9pKG4pOlNoKG5ldyBCbG9iKFtuXSksaSk6aShhVFt0XSsobnx8IiIpKSxTaD0odCxuKT0+e2xldCBlPW5ldyBGaWxlUmVhZGVyO3JldHVybiBlLm9ubG9hZD1mdW5jdGlvbigpe2xldCBpPWUucmVzdWx0LnNwbGl0KCIsIilbMV07bigiYiIraSl9LGUucmVhZEFzRGF0YVVSTCh0KX07a2guZXhwb3J0cz1jVH0pO3ZhciBUaD1UZShDbD0+eyhmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7Q2wuZW5jb2RlPWZ1bmN0aW9uKG4pe3ZhciBlPW5ldyBVaW50OEFycmF5KG4pLGksYT1lLmxlbmd0aCxyPSIiO2ZvcihpPTA7aTxhO2krPTMpcis9dFtlW2ldPj4yXSxyKz10WyhlW2ldJjMpPDw0fGVbaSsxXT4+NF0scis9dFsoZVtpKzFdJjE1KTw8MnxlW2krMl0+PjZdLHIrPXRbZVtpKzJdJjYzXTtyZXR1cm4gYSUzPT09Mj9yPXIuc3Vic3RyaW5nKDAsci5sZW5ndGgtMSkrIj0iOmElMz09PTEmJihyPXIuc3Vic3RyaW5nKDAsci5sZW5ndGgtMikrIj09Iikscn0sQ2wuZGVjb2RlPWZ1bmN0aW9uKG4pe3ZhciBlPW4ubGVuZ3RoKi43NSxpPW4ubGVuZ3RoLGEscj0wLG8sZCxwLGc7bltuLmxlbmd0aC0xXT09PSI9IiYmKGUtLSxuW24ubGVuZ3RoLTJdPT09Ij0iJiZlLS0pO3ZhciBfPW5ldyBBcnJheUJ1ZmZlcihlKSx5PW5ldyBVaW50OEFycmF5KF8pO2ZvcihhPTA7YTxpO2ErPTQpbz10LmluZGV4T2YoblthXSksZD10LmluZGV4T2YoblthKzFdKSxwPXQuaW5kZXhPZihuW2ErMl0pLGc9dC5pbmRleE9mKG5bYSszXSkseVtyKytdPW88PDJ8ZD4+NCx5W3IrK109KGQmMTUpPDw0fHA+PjIseVtyKytdPShwJjMpPDw2fGcmNjM7cmV0dXJuIF99fSkoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iKX0pO3ZhciBEaD1UZSgoQ1gsQWgpPT57dmFye1BBQ0tFVF9UWVBFU19SRVZFUlNFOnlsLEVSUk9SX1BBQ0tFVDpzVH09YmwoKSxsVD10eXBlb2YgQXJyYXlCdWZmZXI9PSJmdW5jdGlvbiIseGw7bFQmJih4bD1UaCgpKTt2YXIgZFQ9KHQsbik9PntpZih0eXBlb2YgdCE9InN0cmluZyIpcmV0dXJue3R5cGU6Im1lc3NhZ2UiLGRhdGE6RWgodCxuKX07bGV0IGU9dC5jaGFyQXQoMCk7cmV0dXJuIGU9PT0iYiI/e3R5cGU6Im1lc3NhZ2UiLGRhdGE6bVQodC5zdWJzdHJpbmcoMSksbil9OnlsW2VdP3QubGVuZ3RoPjE/e3R5cGU6eWxbZV0sZGF0YTp0LnN1YnN0cmluZygxKX06e3R5cGU6eWxbZV19OnNUfSxtVD0odCxuKT0+e2lmKHhsKXtsZXQgZT14bC5kZWNvZGUodCk7cmV0dXJuIEVoKGUsbil9ZWxzZSByZXR1cm57YmFzZTY0OiEwLGRhdGE6dH19LEVoPSh0LG4pPT57c3dpdGNoKG4pe2Nhc2UiYmxvYiI6cmV0dXJuIHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9uZXcgQmxvYihbdF0pOnQ7Y2FzZSJhcnJheWJ1ZmZlciI6ZGVmYXVsdDpyZXR1cm4gdH19O0FoLmV4cG9ydHM9ZFR9KTt2YXIgT3I9VGUoKHlYLFZoKT0+e3ZhciBJaD16aCgpLExoPURoKCksUGg9Ih4iLGhUPSh0LG4pPT57bGV0IGU9dC5sZW5ndGgsaT1uZXcgQXJyYXkoZSksYT0wO3QuZm9yRWFjaCgocixvKT0+e0loKHIsITEsZD0+e2lbb109ZCwrK2E9PT1lJiZuKGkuam9pbihQaCkpfSl9KX0scFQ9KHQsbik9PntsZXQgZT10LnNwbGl0KFBoKSxpPVtdO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtsZXQgcj1MaChlW2FdLG4pO2lmKGkucHVzaChyKSxyLnR5cGU9PT0iZXJyb3IiKWJyZWFrfXJldHVybiBpfTtWaC5leHBvcnRzPXtwcm90b2NvbDo0LGVuY29kZVBhY2tldDpJaCxlbmNvZGVQYXlsb2FkOmhULGRlY29kZVBhY2tldDpMaCxkZWNvZGVQYXlsb2FkOnBUfX0pO3ZhciBObj1UZSgoeFgsTWwpPT57dHlwZW9mIE1sPCJ1IiYmKE1sLmV4cG9ydHM9bjIpO2Z1bmN0aW9uIG4yKHQpe2lmKHQpcmV0dXJuIGZUKHQpfWZ1bmN0aW9uIGZUKHQpe2Zvcih2YXIgbiBpbiBuMi5wcm90b3R5cGUpdFtuXT1uMi5wcm90b3R5cGVbbl07cmV0dXJuIHR9bjIucHJvdG90eXBlLm9uPW4yLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9LCh0aGlzLl9jYWxsYmFja3NbIiQiK3RdPXRoaXMuX2NhbGxiYWNrc1siJCIrdF18fFtdKS5wdXNoKG4pLHRoaXN9O24yLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3RoaXMub2ZmKHQsZSksbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGUuZm49bix0aGlzLm9uKHQsZSksdGhpc307bjIucHJvdG90eXBlLm9mZj1uMi5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9bjIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1uMi5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbih0LG4pe2lmKHRoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9LGFyZ3VtZW50cy5sZW5ndGg9PTApcmV0dXJuIHRoaXMuX2NhbGxiYWNrcz17fSx0aGlzO3ZhciBlPXRoaXMuX2NhbGxiYWNrc1siJCIrdF07aWYoIWUpcmV0dXJuIHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09MSlyZXR1cm4gZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1siJCIrdF0sdGhpcztmb3IodmFyIGksYT0wO2E8ZS5sZW5ndGg7YSsrKWlmKGk9ZVthXSxpPT09bnx8aS5mbj09PW4pe2Uuc3BsaWNlKGEsMSk7YnJlYWt9cmV0dXJuIGUubGVuZ3RoPT09MCYmZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1siJCIrdF0sdGhpc307bjIucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e307Zm9yKHZhciBuPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLGU9dGhpcy5fY2FsbGJhY2tzWyIkIit0XSxpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyluW2ktMV09YXJndW1lbnRzW2ldO2lmKGUpe2U9ZS5zbGljZSgwKTtmb3IodmFyIGk9MCxhPWUubGVuZ3RoO2k8YTsrK2kpZVtpXS5hcHBseSh0aGlzLG4pfXJldHVybiB0aGlzfTtuMi5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fSx0aGlzLl9jYWxsYmFja3NbIiQiK3RdfHxbXX07bjIucHJvdG90eXBlLmhhc0xpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMubGlzdGVuZXJzKHQpLmxlbmd0aH19KTt2YXIgSGg9VGUoKE1YLE9oKT0+e2Z1bmN0aW9uIHVUKHQpe2UuZGVidWc9ZSxlLmRlZmF1bHQ9ZSxlLmNvZXJjZT1wLGUuZGlzYWJsZT1yLGUuZW5hYmxlPWEsZS5lbmFibGVkPW8sZS5odW1hbml6ZT1nbCgpLGUuZGVzdHJveT1nLE9iamVjdC5rZXlzKHQpLmZvckVhY2goXz0+e2VbX109dFtfXX0pLGUubmFtZXM9W10sZS5za2lwcz1bXSxlLmZvcm1hdHRlcnM9e307ZnVuY3Rpb24gbihfKXtsZXQgeT0wO2ZvcihsZXQgST0wO0k8Xy5sZW5ndGg7SSsrKXk9KHk8PDUpLXkrXy5jaGFyQ29kZUF0KEkpLHl8PTA7cmV0dXJuIGUuY29sb3JzW01hdGguYWJzKHkpJWUuY29sb3JzLmxlbmd0aF19ZS5zZWxlY3RDb2xvcj1uO2Z1bmN0aW9uIGUoXyl7bGV0IHksST1udWxsLFAsVjtmdW5jdGlvbiBPKC4uLlUpe2lmKCFPLmVuYWJsZWQpcmV0dXJuO2xldCBRPU8sZmU9TnVtYmVyKG5ldyBEYXRlKSxPZT1mZS0oeXx8ZmUpO1EuZGlmZj1PZSxRLnByZXY9eSxRLmN1cnI9ZmUseT1mZSxVWzBdPWUuY29lcmNlKFVbMF0pLHR5cGVvZiBVWzBdIT0ic3RyaW5nIiYmVS51bnNoaWZ0KCIlTyIpO2xldCBNZT0wO1VbMF09VVswXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywoTmUsWWUpPT57aWYoTmU9PT0iJSUiKXJldHVybiIlIjtNZSsrO2xldCB2dD1lLmZvcm1hdHRlcnNbWWVdO2lmKHR5cGVvZiB2dD09ImZ1bmN0aW9uIil7bGV0IE0xPVVbTWVdO05lPXZ0LmNhbGwoUSxNMSksVS5zcGxpY2UoTWUsMSksTWUtLX1yZXR1cm4gTmV9KSxlLmZvcm1hdEFyZ3MuY2FsbChRLFUpLChRLmxvZ3x8ZS5sb2cpLmFwcGx5KFEsVSl9cmV0dXJuIE8ubmFtZXNwYWNlPV8sTy51c2VDb2xvcnM9ZS51c2VDb2xvcnMoKSxPLmNvbG9yPWUuc2VsZWN0Q29sb3IoXyksTy5leHRlbmQ9aSxPLmRlc3Ryb3k9ZS5kZXN0cm95LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCJlbmFibGVkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITEsZ2V0OigpPT5JIT09bnVsbD9JOihQIT09ZS5uYW1lc3BhY2VzJiYoUD1lLm5hbWVzcGFjZXMsVj1lLmVuYWJsZWQoXykpLFYpLHNldDpVPT57ST1VfX0pLHR5cGVvZiBlLmluaXQ9PSJmdW5jdGlvbiImJmUuaW5pdChPKSxPfWZ1bmN0aW9uIGkoXyx5KXtsZXQgST1lKHRoaXMubmFtZXNwYWNlKyh0eXBlb2YgeT4idSI/IjoiOnkpK18pO3JldHVybiBJLmxvZz10aGlzLmxvZyxJfWZ1bmN0aW9uIGEoXyl7ZS5zYXZlKF8pLGUubmFtZXNwYWNlcz1fLGUubmFtZXM9W10sZS5za2lwcz1bXTtsZXQgeSxJPSh0eXBlb2YgXz09InN0cmluZyI/XzoiIikuc3BsaXQoL1tccyxdKy8pLFA9SS5sZW5ndGg7Zm9yKHk9MDt5PFA7eSsrKUlbeV0mJihfPUlbeV0ucmVwbGFjZSgvXCovZywiLio/IiksX1swXT09PSItIj9lLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgiXiIrXy5zbGljZSgxKSsiJCIpKTplLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgiXiIrXysiJCIpKSl9ZnVuY3Rpb24gcigpe2xldCBfPVsuLi5lLm5hbWVzLm1hcChkKSwuLi5lLnNraXBzLm1hcChkKS5tYXAoeT0+Ii0iK3kpXS5qb2luKCIsIik7cmV0dXJuIGUuZW5hYmxlKCIiKSxffWZ1bmN0aW9uIG8oXyl7aWYoX1tfLmxlbmd0aC0xXT09PSIqIilyZXR1cm4hMDtsZXQgeSxJO2Zvcih5PTAsST1lLnNraXBzLmxlbmd0aDt5PEk7eSsrKWlmKGUuc2tpcHNbeV0udGVzdChfKSlyZXR1cm4hMTtmb3IoeT0wLEk9ZS5uYW1lcy5sZW5ndGg7eTxJO3krKylpZihlLm5hbWVzW3ldLnRlc3QoXykpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gZChfKXtyZXR1cm4gXy50b1N0cmluZygpLnN1YnN0cmluZygyLF8udG9TdHJpbmcoKS5sZW5ndGgtMikucmVwbGFjZSgvXC5cKlw/JC8sIioiKX1mdW5jdGlvbiBwKF8pe3JldHVybiBfIGluc3RhbmNlb2YgRXJyb3I/Xy5zdGFja3x8Xy5tZXNzYWdlOl99ZnVuY3Rpb24gZygpe2NvbnNvbGUud2FybigiSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLiIpfXJldHVybiBlLmVuYWJsZShlLmxvYWQoKSksZX1PaC5leHBvcnRzPXVUfSk7dmFyIEhyPVRlKChyMixlMyk9PntyMi5mb3JtYXRBcmdzPXZUO3IyLnNhdmU9X1Q7cjIubG9hZD1iVDtyMi51c2VDb2xvcnM9Z1Q7cjIuc3RvcmFnZT1DVCgpO3IyLmRlc3Ryb3k9KCgpPT57bGV0IHQ9ITE7cmV0dXJuKCk9Pnt0fHwodD0hMCxjb25zb2xlLndhcm4oIkluc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4iKSl9fSkoKTtyMi5jb2xvcnM9WyIjMDAwMENDIiwiIzAwMDBGRiIsIiMwMDMzQ0MiLCIjMDAzM0ZGIiwiIzAwNjZDQyIsIiMwMDY2RkYiLCIjMDA5OUNDIiwiIzAwOTlGRiIsIiMwMENDMDAiLCIjMDBDQzMzIiwiIzAwQ0M2NiIsIiMwMENDOTkiLCIjMDBDQ0NDIiwiIzAwQ0NGRiIsIiMzMzAwQ0MiLCIjMzMwMEZGIiwiIzMzMzNDQyIsIiMzMzMzRkYiLCIjMzM2NkNDIiwiIzMzNjZGRiIsIiMzMzk5Q0MiLCIjMzM5OUZGIiwiIzMzQ0MwMCIsIiMzM0NDMzMiLCIjMzNDQzY2IiwiIzMzQ0M5OSIsIiMzM0NDQ0MiLCIjMzNDQ0ZGIiwiIzY2MDBDQyIsIiM2NjAwRkYiLCIjNjYzM0NDIiwiIzY2MzNGRiIsIiM2NkNDMDAiLCIjNjZDQzMzIiwiIzk5MDBDQyIsIiM5OTAwRkYiLCIjOTkzM0NDIiwiIzk5MzNGRiIsIiM5OUNDMDAiLCIjOTlDQzMzIiwiI0NDMDAwMCIsIiNDQzAwMzMiLCIjQ0MwMDY2IiwiI0NDMDA5OSIsIiNDQzAwQ0MiLCIjQ0MwMEZGIiwiI0NDMzMwMCIsIiNDQzMzMzMiLCIjQ0MzMzY2IiwiI0NDMzM5OSIsIiNDQzMzQ0MiLCIjQ0MzM0ZGIiwiI0NDNjYwMCIsIiNDQzY2MzMiLCIjQ0M5OTAwIiwiI0NDOTkzMyIsIiNDQ0NDMDAiLCIjQ0NDQzMzIiwiI0ZGMDAwMCIsIiNGRjAwMzMiLCIjRkYwMDY2IiwiI0ZGMDA5OSIsIiNGRjAwQ0MiLCIjRkYwMEZGIiwiI0ZGMzMwMCIsIiNGRjMzMzMiLCIjRkYzMzY2IiwiI0ZGMzM5OSIsIiNGRjMzQ0MiLCIjRkYzM0ZGIiwiI0ZGNjYwMCIsIiNGRjY2MzMiLCIjRkY5OTAwIiwiI0ZGOTkzMyIsIiNGRkNDMDAiLCIjRkZDQzMzIl07ZnVuY3Rpb24gZ1QoKXtpZih0eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93LnByb2Nlc3MmJih3aW5kb3cucHJvY2Vzcy50eXBlPT09InJlbmRlcmVyInx8d2luZG93LnByb2Nlc3MuX19ud2pzKSlyZXR1cm4hMDtpZih0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVwvKFxkKykvKSlyZXR1cm4hMTtsZXQgdDtyZXR1cm4gdHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlfHx0eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93LmNvbnNvbGUmJih3aW5kb3cuY29uc29sZS5maXJlYnVnfHx3aW5kb3cuY29uc29sZS5leGNlcHRpb24mJndpbmRvdy5jb25zb2xlLnRhYmxlKXx8dHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci51c2VyQWdlbnQmJih0PW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFwvKFxkKykvKSkmJnBhcnNlSW50KHRbMV0sMTApPj0zMXx8dHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcLyhcZCspLyl9ZnVuY3Rpb24gdlQodCl7aWYodFswXT0odGhpcy51c2VDb2xvcnM/IiVjIjoiIikrdGhpcy5uYW1lc3BhY2UrKHRoaXMudXNlQ29sb3JzPyIgJWMiOiIgIikrdFswXSsodGhpcy51c2VDb2xvcnM/IiVjICI6IiAiKSsiKyIrZTMuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpLCF0aGlzLnVzZUNvbG9ycylyZXR1cm47bGV0IG49ImNvbG9yOiAiK3RoaXMuY29sb3I7dC5zcGxpY2UoMSwwLG4sImNvbG9yOiBpbmhlcml0Iik7bGV0IGU9MCxpPTA7dFswXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csYT0+e2EhPT0iJSUiJiYoZSsrLGE9PT0iJWMiJiYoaT1lKSl9KSx0LnNwbGljZShpLDAsbil9cjIubG9nPWNvbnNvbGUuZGVidWd8fGNvbnNvbGUubG9nfHwoKCk9Pnt9KTtmdW5jdGlvbiBfVCh0KXt0cnl7dD9yMi5zdG9yYWdlLnNldEl0ZW0oImRlYnVnIix0KTpyMi5zdG9yYWdlLnJlbW92ZUl0ZW0oImRlYnVnIil9Y2F0Y2h7fX1mdW5jdGlvbiBiVCgpe2xldCB0O3RyeXt0PXIyLnN0b3JhZ2UuZ2V0SXRlbSgiZGVidWciKX1jYXRjaHt9cmV0dXJuIXQmJnR5cGVvZiBwcm9jZXNzPCJ1IiYmImVudiJpbiBwcm9jZXNzJiYodD1wcm9jZXNzLmVudi5ERUJVRyksdH1mdW5jdGlvbiBDVCgpe3RyeXtyZXR1cm4gbG9jYWxTdG9yYWdlfWNhdGNoe319ZTMuZXhwb3J0cz1IaCgpKHIyKTt2YXJ7Zm9ybWF0dGVyczp5VH09ZTMuZXhwb3J0czt5VC5qPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCl9Y2F0Y2gobil7cmV0dXJuIltVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAiK24ubWVzc2FnZX19fSk7dmFyIHQzPVRlKCh3WCxOaCk9Pnt2YXIgeFQ9T3IoKSxNVD1ObigpLHdUPUhyKCkoImVuZ2luZS5pby1jbGllbnQ6dHJhbnNwb3J0Iiksd2w9Y2xhc3MgZXh0ZW5kcyBNVHtjb25zdHJ1Y3RvcihuKXtzdXBlcigpLHRoaXMub3B0cz1uLHRoaXMucXVlcnk9bi5xdWVyeSx0aGlzLnJlYWR5U3RhdGU9IiIsdGhpcy5zb2NrZXQ9bi5zb2NrZXR9b25FcnJvcihuLGUpe2xldCBpPW5ldyBFcnJvcihuKTtyZXR1cm4gaS50eXBlPSJUcmFuc3BvcnRFcnJvciIsaS5kZXNjcmlwdGlvbj1lLHRoaXMuZW1pdCgiZXJyb3IiLGkpLHRoaXN9b3Blbigpe3JldHVybih0aGlzLnJlYWR5U3RhdGU9PT0iY2xvc2VkInx8dGhpcy5yZWFkeVN0YXRlPT09IiIpJiYodGhpcy5yZWFkeVN0YXRlPSJvcGVuaW5nIix0aGlzLmRvT3BlbigpKSx0aGlzfWNsb3NlKCl7cmV0dXJuKHRoaXMucmVhZHlTdGF0ZT09PSJvcGVuaW5nInx8dGhpcy5yZWFkeVN0YXRlPT09Im9wZW4iKSYmKHRoaXMuZG9DbG9zZSgpLHRoaXMub25DbG9zZSgpKSx0aGlzfXNlbmQobil7dGhpcy5yZWFkeVN0YXRlPT09Im9wZW4iP3RoaXMud3JpdGUobik6d1QoInRyYW5zcG9ydCBpcyBub3Qgb3BlbiwgZGlzY2FyZGluZyBwYWNrZXRzIil9b25PcGVuKCl7dGhpcy5yZWFkeVN0YXRlPSJvcGVuIix0aGlzLndyaXRhYmxlPSEwLHRoaXMuZW1pdCgib3BlbiIpfW9uRGF0YShuKXtsZXQgZT14VC5kZWNvZGVQYWNrZXQobix0aGlzLnNvY2tldC5iaW5hcnlUeXBlKTt0aGlzLm9uUGFja2V0KGUpfW9uUGFja2V0KG4pe3RoaXMuZW1pdCgicGFja2V0IixuKX1vbkNsb3NlKCl7dGhpcy5yZWFkeVN0YXRlPSJjbG9zZWQiLHRoaXMuZW1pdCgiY2xvc2UiKX19O05oLmV4cG9ydHM9d2x9KTt2YXIgaTM9VGUoU2w9PntTbC5lbmNvZGU9ZnVuY3Rpb24odCl7dmFyIG49IiI7Zm9yKHZhciBlIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShlKSYmKG4ubGVuZ3RoJiYobis9IiYiKSxuKz1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0W2VdKSk7cmV0dXJuIG59O1NsLmRlY29kZT1mdW5jdGlvbih0KXtmb3IodmFyIG49e30sZT10LnNwbGl0KCImIiksaT0wLGE9ZS5sZW5ndGg7aTxhO2krKyl7dmFyIHI9ZVtpXS5zcGxpdCgiPSIpO25bZGVjb2RlVVJJQ29tcG9uZW50KHJbMF0pXT1kZWNvZGVVUklDb21wb25lbnQoclsxXSl9cmV0dXJuIG59fSk7dmFyIFRsPVRlKChrWCxqaCk9PnsidXNlIHN0cmljdCI7dmFyIEJoPSIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei1fIi5zcGxpdCgiIiksYTM9NjQsVWg9e30sUmg9MCxLYT0wLEZoO2Z1bmN0aW9uIGtsKHQpe3ZhciBuPSIiO2RvIG49QmhbdCVhM10rbix0PU1hdGguZmxvb3IodC9hMyk7d2hpbGUodD4wKTtyZXR1cm4gbn1mdW5jdGlvbiBTVCh0KXt2YXIgbj0wO2ZvcihLYT0wO0thPHQubGVuZ3RoO0thKyspbj1uKmEzK1VoW3QuY2hhckF0KEthKV07cmV0dXJuIG59ZnVuY3Rpb24gemwoKXt2YXIgdD1rbCgrbmV3IERhdGUpO3JldHVybiB0IT09Rmg/KFJoPTAsRmg9dCk6dCsiLiIra2woUmgrKyl9Zm9yKDtLYTxhMztLYSsrKVVoW0JoW0thXV09S2E7emwuZW5jb2RlPWtsO3psLmRlY29kZT1TVDtqaC5leHBvcnRzPXpsfSk7dmFyIEFsPVRlKCh6WCxHaCk9Pnt2YXIga1Q9dDMoKSx6VD1pMygpLHFoPU9yKCksVFQ9VGwoKSxWMj1IcigpKCJlbmdpbmUuaW8tY2xpZW50OnBvbGxpbmciKSxFbD1jbGFzcyBleHRlbmRzIGtUe2dldCBuYW1lKCl7cmV0dXJuInBvbGxpbmcifWRvT3Blbigpe3RoaXMucG9sbCgpfXBhdXNlKG4pe2xldCBlPXRoaXM7dGhpcy5yZWFkeVN0YXRlPSJwYXVzaW5nIjtmdW5jdGlvbiBpKCl7VjIoInBhdXNlZCIpLGUucmVhZHlTdGF0ZT0icGF1c2VkIixuKCl9aWYodGhpcy5wb2xsaW5nfHwhdGhpcy53cml0YWJsZSl7bGV0IGE9MDt0aGlzLnBvbGxpbmcmJihWMigid2UgYXJlIGN1cnJlbnRseSBwb2xsaW5nIC0gd2FpdGluZyB0byBwYXVzZSIpLGErKyx0aGlzLm9uY2UoInBvbGxDb21wbGV0ZSIsZnVuY3Rpb24oKXtWMigicHJlLXBhdXNlIHBvbGxpbmcgY29tcGxldGUiKSwtLWF8fGkoKX0pKSx0aGlzLndyaXRhYmxlfHwoVjIoIndlIGFyZSBjdXJyZW50bHkgd3JpdGluZyAtIHdhaXRpbmcgdG8gcGF1c2UiKSxhKyssdGhpcy5vbmNlKCJkcmFpbiIsZnVuY3Rpb24oKXtWMigicHJlLXBhdXNlIHdyaXRpbmcgY29tcGxldGUiKSwtLWF8fGkoKX0pKX1lbHNlIGkoKX1wb2xsKCl7VjIoInBvbGxpbmciKSx0aGlzLnBvbGxpbmc9ITAsdGhpcy5kb1BvbGwoKSx0aGlzLmVtaXQoInBvbGwiKX1vbkRhdGEobil7bGV0IGU9dGhpcztWMigicG9sbGluZyBnb3QgZGF0YSAlcyIsbik7bGV0IGk9ZnVuY3Rpb24oYSxyLG8pe2lmKGUucmVhZHlTdGF0ZT09PSJvcGVuaW5nIiYmYS50eXBlPT09Im9wZW4iJiZlLm9uT3BlbigpLGEudHlwZT09PSJjbG9zZSIpcmV0dXJuIGUub25DbG9zZSgpLCExO2Uub25QYWNrZXQoYSl9O3FoLmRlY29kZVBheWxvYWQobix0aGlzLnNvY2tldC5iaW5hcnlUeXBlKS5mb3JFYWNoKGkpLHRoaXMucmVhZHlTdGF0ZSE9PSJjbG9zZWQiJiYodGhpcy5wb2xsaW5nPSExLHRoaXMuZW1pdCgicG9sbENvbXBsZXRlIiksdGhpcy5yZWFkeVN0YXRlPT09Im9wZW4iP3RoaXMucG9sbCgpOlYyKCdpZ25vcmluZyBwb2xsIC0gdHJhbnNwb3J0IHN0YXRlICIlcyInLHRoaXMucmVhZHlTdGF0ZSkpfWRvQ2xvc2UoKXtsZXQgbj10aGlzO2Z1bmN0aW9uIGUoKXtWMigid3JpdGluZyBjbG9zZSBwYWNrZXQiKSxuLndyaXRlKFt7dHlwZToiY2xvc2UifV0pfXRoaXMucmVhZHlTdGF0ZT09PSJvcGVuIj8oVjIoInRyYW5zcG9ydCBvcGVuIC0gY2xvc2luZyIpLGUoKSk6KFYyKCJ0cmFuc3BvcnQgbm90IG9wZW4gLSBkZWZlcnJpbmcgY2xvc2UiKSx0aGlzLm9uY2UoIm9wZW4iLGUpKX13cml0ZShuKXt0aGlzLndyaXRhYmxlPSExLHFoLmVuY29kZVBheWxvYWQobixlPT57dGhpcy5kb1dyaXRlKGUsKCk9Pnt0aGlzLndyaXRhYmxlPSEwLHRoaXMuZW1pdCgiZHJhaW4iKX0pfSl9dXJpKCl7bGV0IG49dGhpcy5xdWVyeXx8e30sZT10aGlzLm9wdHMuc2VjdXJlPyJodHRwcyI6Imh0dHAiLGk9IiI7dGhpcy5vcHRzLnRpbWVzdGFtcFJlcXVlc3RzIT09ITEmJihuW3RoaXMub3B0cy50aW1lc3RhbXBQYXJhbV09VFQoKSksIXRoaXMuc3VwcG9ydHNCaW5hcnkmJiFuLnNpZCYmKG4uYjY0PTEpLG49elQuZW5jb2RlKG4pLHRoaXMub3B0cy5wb3J0JiYoZT09PSJodHRwcyImJk51bWJlcih0aGlzLm9wdHMucG9ydCkhPT00NDN8fGU9PT0iaHR0cCImJk51bWJlcih0aGlzLm9wdHMucG9ydCkhPT04MCkmJihpPSI6Iit0aGlzLm9wdHMucG9ydCksbi5sZW5ndGgmJihuPSI/IituKTtsZXQgYT10aGlzLm9wdHMuaG9zdG5hbWUuaW5kZXhPZigiOiIpIT09LTE7cmV0dXJuIGUrIjovLyIrKGE/IlsiK3RoaXMub3B0cy5ob3N0bmFtZSsiXSI6dGhpcy5vcHRzLmhvc3RuYW1lKStpK3RoaXMub3B0cy5wYXRoK259fTtHaC5leHBvcnRzPUVsfSk7dmFyIERsPVRlKChUWCxXaCk9PntXaC5leHBvcnRzLnBpY2s9KHQsLi4ubik9Pm4ucmVkdWNlKChlLGkpPT4odC5oYXNPd25Qcm9wZXJ0eShpKSYmKGVbaV09dFtpXSksZSkse30pfSk7dmFyICRoPVRlKChFWCxQbCk9Pnt2YXIgWmg9X2woKSxFVD1BbCgpLEFUPU5uKCkse3BpY2s6RFR9PURsKCksSVQ9bDQoKSxJbD1IcigpKCJlbmdpbmUuaW8tY2xpZW50OnBvbGxpbmcteGhyIik7ZnVuY3Rpb24gUWgoKXt9dmFyIExUPShmdW5jdGlvbigpe3JldHVybiBuZXcgWmgoe3hkb21haW46ITF9KS5yZXNwb25zZVR5cGUhPW51bGx9KSgpLExsPWNsYXNzIGV4dGVuZHMgRVR7Y29uc3RydWN0b3Iobil7aWYoc3VwZXIobiksdHlwZW9mIGxvY2F0aW9uPCJ1Iil7bGV0IGk9bG9jYXRpb24ucHJvdG9jb2w9PT0iaHR0cHM6IixhPWxvY2F0aW9uLnBvcnQ7YXx8KGE9aT80NDM6ODApLHRoaXMueGQ9dHlwZW9mIGxvY2F0aW9uPCJ1IiYmbi5ob3N0bmFtZSE9PWxvY2F0aW9uLmhvc3RuYW1lfHxhIT09bi5wb3J0LHRoaXMueHM9bi5zZWN1cmUhPT1pfWxldCBlPW4mJm4uZm9yY2VCYXNlNjQ7dGhpcy5zdXBwb3J0c0JpbmFyeT1MVCYmIWV9cmVxdWVzdChuPXt9KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuLHt4ZDp0aGlzLnhkLHhzOnRoaXMueHN9LHRoaXMub3B0cyksbmV3IGQ0KHRoaXMudXJpKCksbil9ZG9Xcml0ZShuLGUpe2xldCBpPXRoaXMucmVxdWVzdCh7bWV0aG9kOiJQT1NUIixkYXRhOm59KSxhPXRoaXM7aS5vbigic3VjY2VzcyIsZSksaS5vbigiZXJyb3IiLGZ1bmN0aW9uKHIpe2Eub25FcnJvcigieGhyIHBvc3QgZXJyb3IiLHIpfSl9ZG9Qb2xsKCl7SWwoInhociBwb2xsIik7bGV0IG49dGhpcy5yZXF1ZXN0KCksZT10aGlzO24ub24oImRhdGEiLGZ1bmN0aW9uKGkpe2Uub25EYXRhKGkpfSksbi5vbigiZXJyb3IiLGZ1bmN0aW9uKGkpe2Uub25FcnJvcigieGhyIHBvbGwgZXJyb3IiLGkpfSksdGhpcy5wb2xsWGhyPW59fSxkND0oKCk9PntjbGFzcyB0IGV4dGVuZHMgQVR7Y29uc3RydWN0b3IoZSxpKXtzdXBlcigpLHRoaXMub3B0cz1pLHRoaXMubWV0aG9kPWkubWV0aG9kfHwiR0VUIix0aGlzLnVyaT1lLHRoaXMuYXN5bmM9aS5hc3luYyE9PSExLHRoaXMuZGF0YT1pLmRhdGEhPT12b2lkIDA/aS5kYXRhOm51bGwsdGhpcy5jcmVhdGUoKX1jcmVhdGUoKXtsZXQgZT1EVCh0aGlzLm9wdHMsImFnZW50IiwiZW5hYmxlc1hEUiIsInBmeCIsImtleSIsInBhc3NwaHJhc2UiLCJjZXJ0IiwiY2EiLCJjaXBoZXJzIiwicmVqZWN0VW5hdXRob3JpemVkIik7ZS54ZG9tYWluPSEhdGhpcy5vcHRzLnhkLGUueHNjaGVtZT0hIXRoaXMub3B0cy54cztsZXQgaT10aGlzLnhocj1uZXcgWmgoZSksYT10aGlzO3RyeXtJbCgieGhyIG9wZW4gJXM6ICVzIix0aGlzLm1ldGhvZCx0aGlzLnVyaSksaS5vcGVuKHRoaXMubWV0aG9kLHRoaXMudXJpLHRoaXMuYXN5bmMpO3RyeXtpZih0aGlzLm9wdHMuZXh0cmFIZWFkZXJzKXtpLnNldERpc2FibGVIZWFkZXJDaGVjayYmaS5zZXREaXNhYmxlSGVhZGVyQ2hlY2soITApO2ZvcihsZXQgciBpbiB0aGlzLm9wdHMuZXh0cmFIZWFkZXJzKXRoaXMub3B0cy5leHRyYUhlYWRlcnMuaGFzT3duUHJvcGVydHkocikmJmkuc2V0UmVxdWVzdEhlYWRlcihyLHRoaXMub3B0cy5leHRyYUhlYWRlcnNbcl0pfX1jYXRjaHt9aWYodGhpcy5tZXRob2Q9PT0iUE9TVCIpdHJ5e2kuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwidGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Iil9Y2F0Y2h7fXRyeXtpLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsIiovKiIpfWNhdGNoe30id2l0aENyZWRlbnRpYWxzImluIGkmJihpLndpdGhDcmVkZW50aWFscz10aGlzLm9wdHMud2l0aENyZWRlbnRpYWxzKSx0aGlzLm9wdHMucmVxdWVzdFRpbWVvdXQmJihpLnRpbWVvdXQ9dGhpcy5vcHRzLnJlcXVlc3RUaW1lb3V0KSx0aGlzLmhhc1hEUigpPyhpLm9ubG9hZD1mdW5jdGlvbigpe2Eub25Mb2FkKCl9LGkub25lcnJvcj1mdW5jdGlvbigpe2Eub25FcnJvcihpLnJlc3BvbnNlVGV4dCl9KTppLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2kucmVhZHlTdGF0ZT09PTQmJihpLnN0YXR1cz09PTIwMHx8aS5zdGF0dXM9PT0xMjIzP2Eub25Mb2FkKCk6c2V0VGltZW91dChmdW5jdGlvbigpe2Eub25FcnJvcih0eXBlb2YgaS5zdGF0dXM9PSJudW1iZXIiP2kuc3RhdHVzOjApfSwwKSl9LElsKCJ4aHIgZGF0YSAlcyIsdGhpcy5kYXRhKSxpLnNlbmQodGhpcy5kYXRhKX1jYXRjaChyKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5vbkVycm9yKHIpfSwwKTtyZXR1cm59dHlwZW9mIGRvY3VtZW50PCJ1IiYmKHRoaXMuaW5kZXg9dC5yZXF1ZXN0c0NvdW50KyssdC5yZXF1ZXN0c1t0aGlzLmluZGV4XT10aGlzKX1vblN1Y2Nlc3MoKXt0aGlzLmVtaXQoInN1Y2Nlc3MiKSx0aGlzLmNsZWFudXAoKX1vbkRhdGEoZSl7dGhpcy5lbWl0KCJkYXRhIixlKSx0aGlzLm9uU3VjY2VzcygpfW9uRXJyb3IoZSl7dGhpcy5lbWl0KCJlcnJvciIsZSksdGhpcy5jbGVhbnVwKCEwKX1jbGVhbnVwKGUpe2lmKCEodHlwZW9mIHRoaXMueGhyPiJ1Inx8dGhpcy54aHI9PT1udWxsKSl7aWYodGhpcy5oYXNYRFIoKT90aGlzLnhoci5vbmxvYWQ9dGhpcy54aHIub25lcnJvcj1RaDp0aGlzLnhoci5vbnJlYWR5c3RhdGVjaGFuZ2U9UWgsZSl0cnl7dGhpcy54aHIuYWJvcnQoKX1jYXRjaHt9dHlwZW9mIGRvY3VtZW50PCJ1IiYmZGVsZXRlIHQucmVxdWVzdHNbdGhpcy5pbmRleF0sdGhpcy54aHI9bnVsbH19b25Mb2FkKCl7bGV0IGU9dGhpcy54aHIucmVzcG9uc2VUZXh0O2UhPT1udWxsJiZ0aGlzLm9uRGF0YShlKX1oYXNYRFIoKXtyZXR1cm4gdHlwZW9mIFhEb21haW5SZXF1ZXN0PCJ1IiYmIXRoaXMueHMmJnRoaXMuZW5hYmxlc1hEUn1hYm9ydCgpe3RoaXMuY2xlYW51cCgpfX1yZXR1cm4gdC5yZXF1ZXN0c0NvdW50PTAsdC5yZXF1ZXN0cz17fSx0fSkoKTtpZih0eXBlb2YgZG9jdW1lbnQ8InUiKXtpZih0eXBlb2YgYXR0YWNoRXZlbnQ9PSJmdW5jdGlvbiIpYXR0YWNoRXZlbnQoIm9udW5sb2FkIixZaCk7ZWxzZSBpZih0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lcj09ImZ1bmN0aW9uIil7bGV0IHQ9Im9ucGFnZWhpZGUiaW4gSVQ/InBhZ2VoaWRlIjoidW5sb2FkIjthZGRFdmVudExpc3RlbmVyKHQsWWgsITEpfX1mdW5jdGlvbiBZaCgpe2ZvcihsZXQgdCBpbiBkNC5yZXF1ZXN0cylkNC5yZXF1ZXN0cy5oYXNPd25Qcm9wZXJ0eSh0KSYmZDQucmVxdWVzdHNbdF0uYWJvcnQoKX1QbC5leHBvcnRzPUxsO1BsLmV4cG9ydHMuUmVxdWVzdD1kNH0pO3ZhciBKaD1UZSgoQVgsWGgpPT57dmFyIFBUPUFsKCksS2g9bDQoKSxWVD0vXG4vZyxPVD0vXFxuL2csbjMsVmw9Y2xhc3MgZXh0ZW5kcyBQVHtjb25zdHJ1Y3RvcihuKXtzdXBlcihuKSx0aGlzLnF1ZXJ5PXRoaXMucXVlcnl8fHt9LG4zfHwobjM9S2guX19fZWlvPUtoLl9fX2Vpb3x8W10pLHRoaXMuaW5kZXg9bjMubGVuZ3RoO2xldCBlPXRoaXM7bjMucHVzaChmdW5jdGlvbihpKXtlLm9uRGF0YShpKX0pLHRoaXMucXVlcnkuaj10aGlzLmluZGV4fWdldCBzdXBwb3J0c0JpbmFyeSgpe3JldHVybiExfWRvQ2xvc2UoKXt0aGlzLnNjcmlwdCYmKHRoaXMuc2NyaXB0Lm9uZXJyb3I9KCk9Pnt9LHRoaXMuc2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zY3JpcHQpLHRoaXMuc2NyaXB0PW51bGwpLHRoaXMuZm9ybSYmKHRoaXMuZm9ybS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZm9ybSksdGhpcy5mb3JtPW51bGwsdGhpcy5pZnJhbWU9bnVsbCksc3VwZXIuZG9DbG9zZSgpfWRvUG9sbCgpe2xldCBuPXRoaXMsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTt0aGlzLnNjcmlwdCYmKHRoaXMuc2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zY3JpcHQpLHRoaXMuc2NyaXB0PW51bGwpLGUuYXN5bmM9ITAsZS5zcmM9dGhpcy51cmkoKSxlLm9uZXJyb3I9ZnVuY3Rpb24ocil7bi5vbkVycm9yKCJqc29ucCBwb2xsIGVycm9yIixyKX07bGV0IGk9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpWzBdO2k/aS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGkpOihkb2N1bWVudC5oZWFkfHxkb2N1bWVudC5ib2R5KS5hcHBlbmRDaGlsZChlKSx0aGlzLnNjcmlwdD1lLHR5cGVvZiBuYXZpZ2F0b3I8InUiJiYvZ2Vja28vaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bGV0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyKSxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHIpfSwxMDApfWRvV3JpdGUobixlKXtsZXQgaT10aGlzLGE7aWYoIXRoaXMuZm9ybSl7bGV0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZm9ybSIpLHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKSxnPXRoaXMuaWZyYW1lSWQ9ImVpb19pZnJhbWVfIit0aGlzLmluZGV4O2QuY2xhc3NOYW1lPSJzb2NrZXRpbyIsZC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGQuc3R5bGUudG9wPSItMTAwMHB4IixkLnN0eWxlLmxlZnQ9Ii0xMDAwcHgiLGQudGFyZ2V0PWcsZC5tZXRob2Q9IlBPU1QiLGQuc2V0QXR0cmlidXRlKCJhY2NlcHQtY2hhcnNldCIsInV0Zi04IikscC5uYW1lPSJkIixkLmFwcGVuZENoaWxkKHApLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCksdGhpcy5mb3JtPWQsdGhpcy5hcmVhPXB9dGhpcy5mb3JtLmFjdGlvbj10aGlzLnVyaSgpO2Z1bmN0aW9uIHIoKXtvKCksZSgpfWZ1bmN0aW9uIG8oKXtpZihpLmlmcmFtZSl0cnl7aS5mb3JtLnJlbW92ZUNoaWxkKGkuaWZyYW1lKX1jYXRjaChkKXtpLm9uRXJyb3IoImpzb25wIHBvbGxpbmcgaWZyYW1lIHJlbW92YWwgZXJyb3IiLGQpfXRyeXtsZXQgZD0nPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6MCIgbmFtZT0iJytpLmlmcmFtZUlkKyciPic7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGQpfWNhdGNoe2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYS5uYW1lPWkuaWZyYW1lSWQsYS5zcmM9ImphdmFzY3JpcHQ6MCJ9YS5pZD1pLmlmcmFtZUlkLGkuZm9ybS5hcHBlbmRDaGlsZChhKSxpLmlmcmFtZT1hfW8oKSxuPW4ucmVwbGFjZShPVCxgXFwKYCksdGhpcy5hcmVhLnZhbHVlPW4ucmVwbGFjZShWVCwiXFxuIik7dHJ5e3RoaXMuZm9ybS5zdWJtaXQoKX1jYXRjaHt9dGhpcy5pZnJhbWUuYXR0YWNoRXZlbnQ/dGhpcy5pZnJhbWUub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aS5pZnJhbWUucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSImJnIoKX06dGhpcy5pZnJhbWUub25sb2FkPXJ9fTtYaC5leHBvcnRzPVZsfSk7dmFyIGlwPVRlKChEWCx0cCk9Pnt2YXIgZXA9bDQoKTt0cC5leHBvcnRzPXtXZWJTb2NrZXQ6ZXAuV2ViU29ja2V0fHxlcC5Nb3pXZWJTb2NrZXQsdXNpbmdCcm93c2VyV2ViU29ja2V0OiEwLGRlZmF1bHRCaW5hcnlUeXBlOiJhcnJheWJ1ZmZlciJ9fSk7dmFyIG9wPVRlKChJWCxycCk9Pnt2YXIgYXA9dDMoKSxIVD1PcigpLE5UPWkzKCksUlQ9VGwoKSx7cGljazpGVH09RGwoKSx7V2ViU29ja2V0Om00LHVzaW5nQnJvd3NlcldlYlNvY2tldDpPbCxkZWZhdWx0QmluYXJ5VHlwZTpCVH09aXAoKSxVVD1IcigpKCJlbmdpbmUuaW8tY2xpZW50OndlYnNvY2tldCIpLG5wPXR5cGVvZiBuYXZpZ2F0b3I8InUiJiZ0eXBlb2YgbmF2aWdhdG9yLnByb2R1Y3Q9PSJzdHJpbmciJiZuYXZpZ2F0b3IucHJvZHVjdC50b0xvd2VyQ2FzZSgpPT09InJlYWN0bmF0aXZlIixIbD1jbGFzcyB0IGV4dGVuZHMgYXB7Y29uc3RydWN0b3Iobil7c3VwZXIobiksdGhpcy5zdXBwb3J0c0JpbmFyeT0hbi5mb3JjZUJhc2U2NH1nZXQgbmFtZSgpe3JldHVybiJ3ZWJzb2NrZXQifWRvT3Blbigpe2lmKCF0aGlzLmNoZWNrKCkpcmV0dXJuO2xldCBuPXRoaXMudXJpKCksZT10aGlzLm9wdHMucHJvdG9jb2xzLGk9bnA/e306RlQodGhpcy5vcHRzLCJhZ2VudCIsInBlck1lc3NhZ2VEZWZsYXRlIiwicGZ4Iiwia2V5IiwicGFzc3BocmFzZSIsImNlcnQiLCJjYSIsImNpcGhlcnMiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJsb2NhbEFkZHJlc3MiLCJwcm90b2NvbFZlcnNpb24iLCJvcmlnaW4iLCJtYXhQYXlsb2FkIiwiZmFtaWx5IiwiY2hlY2tTZXJ2ZXJJZGVudGl0eSIpO3RoaXMub3B0cy5leHRyYUhlYWRlcnMmJihpLmhlYWRlcnM9dGhpcy5vcHRzLmV4dHJhSGVhZGVycyk7dHJ5e3RoaXMud3M9T2wmJiFucD9lP25ldyBtNChuLGUpOm5ldyBtNChuKTpuZXcgbTQobixlLGkpfWNhdGNoKGEpe3JldHVybiB0aGlzLmVtaXQoImVycm9yIixhKX10aGlzLndzLmJpbmFyeVR5cGU9dGhpcy5zb2NrZXQuYmluYXJ5VHlwZXx8QlQsdGhpcy5hZGRFdmVudExpc3RlbmVycygpfWFkZEV2ZW50TGlzdGVuZXJzKCl7bGV0IG49dGhpczt0aGlzLndzLm9ub3Blbj1mdW5jdGlvbigpe24ub25PcGVuKCl9LHRoaXMud3Mub25jbG9zZT1mdW5jdGlvbigpe24ub25DbG9zZSgpfSx0aGlzLndzLm9ubWVzc2FnZT1mdW5jdGlvbihlKXtuLm9uRGF0YShlLmRhdGEpfSx0aGlzLndzLm9uZXJyb3I9ZnVuY3Rpb24oZSl7bi5vbkVycm9yKCJ3ZWJzb2NrZXQgZXJyb3IiLGUpfX13cml0ZShuKXtsZXQgZT10aGlzO3RoaXMud3JpdGFibGU9ITE7bGV0IGk9bi5sZW5ndGgsYT0wLHI9aTtmb3IoO2E8cjthKyspKGZ1bmN0aW9uKGQpe0hULmVuY29kZVBhY2tldChkLGUuc3VwcG9ydHNCaW5hcnksZnVuY3Rpb24ocCl7bGV0IGc9e307T2x8fChkLm9wdGlvbnMmJihnLmNvbXByZXNzPWQub3B0aW9ucy5jb21wcmVzcyksZS5vcHRzLnBlck1lc3NhZ2VEZWZsYXRlJiYodHlwZW9mIHA9PSJzdHJpbmciP0J1ZmZlci5ieXRlTGVuZ3RoKHApOnAubGVuZ3RoKTxlLm9wdHMucGVyTWVzc2FnZURlZmxhdGUudGhyZXNob2xkJiYoZy5jb21wcmVzcz0hMSkpO3RyeXtPbD9lLndzLnNlbmQocCk6ZS53cy5zZW5kKHAsZyl9Y2F0Y2h7VVQoIndlYnNvY2tldCBjbG9zZWQgYmVmb3JlIG9uY2xvc2UgZXZlbnQiKX0tLWl8fG8oKX0pfSkoblthXSk7ZnVuY3Rpb24gbygpe2UuZW1pdCgiZmx1c2giKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS53cml0YWJsZT0hMCxlLmVtaXQoImRyYWluIil9LDApfX1vbkNsb3NlKCl7YXAucHJvdG90eXBlLm9uQ2xvc2UuY2FsbCh0aGlzKX1kb0Nsb3NlKCl7dHlwZW9mIHRoaXMud3M8InUiJiYodGhpcy53cy5jbG9zZSgpLHRoaXMud3M9bnVsbCl9dXJpKCl7bGV0IG49dGhpcy5xdWVyeXx8e30sZT10aGlzLm9wdHMuc2VjdXJlPyJ3c3MiOiJ3cyIsaT0iIjt0aGlzLm9wdHMucG9ydCYmKGU9PT0id3NzIiYmTnVtYmVyKHRoaXMub3B0cy5wb3J0KSE9PTQ0M3x8ZT09PSJ3cyImJk51bWJlcih0aGlzLm9wdHMucG9ydCkhPT04MCkmJihpPSI6Iit0aGlzLm9wdHMucG9ydCksdGhpcy5vcHRzLnRpbWVzdGFtcFJlcXVlc3RzJiYoblt0aGlzLm9wdHMudGltZXN0YW1wUGFyYW1dPVJUKCkpLHRoaXMuc3VwcG9ydHNCaW5hcnl8fChuLmI2ND0xKSxuPU5ULmVuY29kZShuKSxuLmxlbmd0aCYmKG49Ij8iK24pO2xldCBhPXRoaXMub3B0cy5ob3N0bmFtZS5pbmRleE9mKCI6IikhPT0tMTtyZXR1cm4gZSsiOi8vIisoYT8iWyIrdGhpcy5vcHRzLmhvc3RuYW1lKyJdIjp0aGlzLm9wdHMuaG9zdG5hbWUpK2krdGhpcy5vcHRzLnBhdGgrbn1jaGVjaygpe3JldHVybiEhbTQmJiEoIl9faW5pdGlhbGl6ZSJpbiBtNCYmdGhpcy5uYW1lPT09dC5wcm90b3R5cGUubmFtZSl9fTtycC5leHBvcnRzPUhsfSk7dmFyIFJsPVRlKE5sPT57dmFyIGpUPV9sKCkscVQ9JGgoKSxHVD1KaCgpLFdUPW9wKCk7TmwucG9sbGluZz1RVDtObC53ZWJzb2NrZXQ9V1Q7ZnVuY3Rpb24gUVQodCl7bGV0IG4sZT0hMSxpPSExLGE9dC5qc29ucCE9PSExO2lmKHR5cGVvZiBsb2NhdGlvbjwidSIpe2xldCByPWxvY2F0aW9uLnByb3RvY29sPT09Imh0dHBzOiIsbz1sb2NhdGlvbi5wb3J0O298fChvPXI/NDQzOjgwKSxlPXQuaG9zdG5hbWUhPT1sb2NhdGlvbi5ob3N0bmFtZXx8byE9PXQucG9ydCxpPXQuc2VjdXJlIT09cn1pZih0Lnhkb21haW49ZSx0LnhzY2hlbWU9aSxuPW5ldyBqVCh0KSwib3BlbiJpbiBuJiYhdC5mb3JjZUpTT05QKXJldHVybiBuZXcgcVQodCk7aWYoIWEpdGhyb3cgbmV3IEVycm9yKCJKU09OUCBkaXNhYmxlZCIpO3JldHVybiBuZXcgR1QodCl9fSk7dmFyIGRwPVRlKChQWCxscCk9Pnt2YXIgWVQ9UmwoKSxaVD1ObigpLFAxPUhyKCkoImVuZ2luZS5pby1jbGllbnQ6c29ja2V0Iiksc3A9T3IoKSxjcD11bCgpLCRUPWkzKCksaDQ9Y2xhc3MgdCBleHRlbmRzIFpUe2NvbnN0cnVjdG9yKG4sZT17fSl7c3VwZXIoKSxuJiZ0eXBlb2Ygbj09Im9iamVjdCImJihlPW4sbj1udWxsKSxuPyhuPWNwKG4pLGUuaG9zdG5hbWU9bi5ob3N0LGUuc2VjdXJlPW4ucHJvdG9jb2w9PT0iaHR0cHMifHxuLnByb3RvY29sPT09IndzcyIsZS5wb3J0PW4ucG9ydCxuLnF1ZXJ5JiYoZS5xdWVyeT1uLnF1ZXJ5KSk6ZS5ob3N0JiYoZS5ob3N0bmFtZT1jcChlLmhvc3QpLmhvc3QpLHRoaXMuc2VjdXJlPWUuc2VjdXJlIT1udWxsP2Uuc2VjdXJlOnR5cGVvZiBsb2NhdGlvbjwidSImJmxvY2F0aW9uLnByb3RvY29sPT09Imh0dHBzOiIsZS5ob3N0bmFtZSYmIWUucG9ydCYmKGUucG9ydD10aGlzLnNlY3VyZT8iNDQzIjoiODAiKSx0aGlzLmhvc3RuYW1lPWUuaG9zdG5hbWV8fCh0eXBlb2YgbG9jYXRpb248InUiP2xvY2F0aW9uLmhvc3RuYW1lOiJsb2NhbGhvc3QiKSx0aGlzLnBvcnQ9ZS5wb3J0fHwodHlwZW9mIGxvY2F0aW9uPCJ1IiYmbG9jYXRpb24ucG9ydD9sb2NhdGlvbi5wb3J0OnRoaXMuc2VjdXJlPzQ0Mzo4MCksdGhpcy50cmFuc3BvcnRzPWUudHJhbnNwb3J0c3x8WyJwb2xsaW5nIiwid2Vic29ja2V0Il0sdGhpcy5yZWFkeVN0YXRlPSIiLHRoaXMud3JpdGVCdWZmZXI9W10sdGhpcy5wcmV2QnVmZmVyTGVuPTAsdGhpcy5vcHRzPU9iamVjdC5hc3NpZ24oe3BhdGg6Ii9lbmdpbmUuaW8iLGFnZW50OiExLHdpdGhDcmVkZW50aWFsczohMSx1cGdyYWRlOiEwLGpzb25wOiEwLHRpbWVzdGFtcFBhcmFtOiJ0IixyZW1lbWJlclVwZ3JhZGU6ITEscmVqZWN0VW5hdXRob3JpemVkOiEwLHBlck1lc3NhZ2VEZWZsYXRlOnt0aHJlc2hvbGQ6MTAyNH0sdHJhbnNwb3J0T3B0aW9uczp7fX0sZSksdGhpcy5vcHRzLnBhdGg9dGhpcy5vcHRzLnBhdGgucmVwbGFjZSgvXC8kLywiIikrIi8iLHR5cGVvZiB0aGlzLm9wdHMucXVlcnk9PSJzdHJpbmciJiYodGhpcy5vcHRzLnF1ZXJ5PSRULmRlY29kZSh0aGlzLm9wdHMucXVlcnkpKSx0aGlzLmlkPW51bGwsdGhpcy51cGdyYWRlcz1udWxsLHRoaXMucGluZ0ludGVydmFsPW51bGwsdGhpcy5waW5nVGltZW91dD1udWxsLHRoaXMucGluZ1RpbWVvdXRUaW1lcj1udWxsLHR5cGVvZiBhZGRFdmVudExpc3RlbmVyPT0iZnVuY3Rpb24iJiZhZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLCgpPT57dGhpcy50cmFuc3BvcnQmJih0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKSx0aGlzLnRyYW5zcG9ydC5jbG9zZSgpKX0sITEpLHRoaXMub3BlbigpfWNyZWF0ZVRyYW5zcG9ydChuKXtQMSgnY3JlYXRpbmcgdHJhbnNwb3J0ICIlcyInLG4pO2xldCBlPUtUKHRoaXMub3B0cy5xdWVyeSk7ZS5FSU89c3AucHJvdG9jb2wsZS50cmFuc3BvcnQ9bix0aGlzLmlkJiYoZS5zaWQ9dGhpcy5pZCk7bGV0IGk9T2JqZWN0LmFzc2lnbih7fSx0aGlzLm9wdHMudHJhbnNwb3J0T3B0aW9uc1tuXSx0aGlzLm9wdHMse3F1ZXJ5OmUsc29ja2V0OnRoaXMsaG9zdG5hbWU6dGhpcy5ob3N0bmFtZSxzZWN1cmU6dGhpcy5zZWN1cmUscG9ydDp0aGlzLnBvcnR9KTtyZXR1cm4gUDEoIm9wdGlvbnM6ICVqIixpKSxuZXcgWVRbbl0oaSl9b3Blbigpe2xldCBuO2lmKHRoaXMub3B0cy5yZW1lbWJlclVwZ3JhZGUmJnQucHJpb3JXZWJzb2NrZXRTdWNjZXNzJiZ0aGlzLnRyYW5zcG9ydHMuaW5kZXhPZigid2Vic29ja2V0IikhPT0tMSluPSJ3ZWJzb2NrZXQiO2Vsc2UgaWYodGhpcy50cmFuc3BvcnRzLmxlbmd0aD09PTApe2xldCBlPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2UuZW1pdCgiZXJyb3IiLCJObyB0cmFuc3BvcnRzIGF2YWlsYWJsZSIpfSwwKTtyZXR1cm59ZWxzZSBuPXRoaXMudHJhbnNwb3J0c1swXTt0aGlzLnJlYWR5U3RhdGU9Im9wZW5pbmciO3RyeXtuPXRoaXMuY3JlYXRlVHJhbnNwb3J0KG4pfWNhdGNoKGUpe1AxKCJlcnJvciB3aGlsZSBjcmVhdGluZyB0cmFuc3BvcnQ6ICVzIixlKSx0aGlzLnRyYW5zcG9ydHMuc2hpZnQoKSx0aGlzLm9wZW4oKTtyZXR1cm59bi5vcGVuKCksdGhpcy5zZXRUcmFuc3BvcnQobil9c2V0VHJhbnNwb3J0KG4pe1AxKCJzZXR0aW5nIHRyYW5zcG9ydCAlcyIsbi5uYW1lKTtsZXQgZT10aGlzO3RoaXMudHJhbnNwb3J0JiYoUDEoImNsZWFyaW5nIGV4aXN0aW5nIHRyYW5zcG9ydCAlcyIsdGhpcy50cmFuc3BvcnQubmFtZSksdGhpcy50cmFuc3BvcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCkpLHRoaXMudHJhbnNwb3J0PW4sbi5vbigiZHJhaW4iLGZ1bmN0aW9uKCl7ZS5vbkRyYWluKCl9KS5vbigicGFja2V0IixmdW5jdGlvbihpKXtlLm9uUGFja2V0KGkpfSkub24oImVycm9yIixmdW5jdGlvbihpKXtlLm9uRXJyb3IoaSl9KS5vbigiY2xvc2UiLGZ1bmN0aW9uKCl7ZS5vbkNsb3NlKCJ0cmFuc3BvcnQgY2xvc2UiKX0pfXByb2JlKG4pe1AxKCdwcm9iaW5nIHRyYW5zcG9ydCAiJXMiJyxuKTtsZXQgZT10aGlzLmNyZWF0ZVRyYW5zcG9ydChuLHtwcm9iZToxfSksaT0hMSxhPXRoaXM7dC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9ITE7ZnVuY3Rpb24gcigpe2lmKGEub25seUJpbmFyeVVwZ3JhZGVzKXtsZXQgST0hdGhpcy5zdXBwb3J0c0JpbmFyeSYmYS50cmFuc3BvcnQuc3VwcG9ydHNCaW5hcnk7aT1pfHxJfWl8fChQMSgncHJvYmUgdHJhbnNwb3J0ICIlcyIgb3BlbmVkJyxuKSxlLnNlbmQoW3t0eXBlOiJwaW5nIixkYXRhOiJwcm9iZSJ9XSksZS5vbmNlKCJwYWNrZXQiLGZ1bmN0aW9uKEkpe2lmKCFpKWlmKEkudHlwZT09PSJwb25nIiYmSS5kYXRhPT09InByb2JlIil7aWYoUDEoJ3Byb2JlIHRyYW5zcG9ydCAiJXMiIHBvbmcnLG4pLGEudXBncmFkaW5nPSEwLGEuZW1pdCgidXBncmFkaW5nIixlKSwhZSlyZXR1cm47dC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9ZS5uYW1lPT09IndlYnNvY2tldCIsUDEoJ3BhdXNpbmcgY3VycmVudCB0cmFuc3BvcnQgIiVzIicsYS50cmFuc3BvcnQubmFtZSksYS50cmFuc3BvcnQucGF1c2UoZnVuY3Rpb24oKXtpfHxhLnJlYWR5U3RhdGUhPT0iY2xvc2VkIiYmKFAxKCJjaGFuZ2luZyB0cmFuc3BvcnQgYW5kIHNlbmRpbmcgdXBncmFkZSBwYWNrZXQiKSx5KCksYS5zZXRUcmFuc3BvcnQoZSksZS5zZW5kKFt7dHlwZToidXBncmFkZSJ9XSksYS5lbWl0KCJ1cGdyYWRlIixlKSxlPW51bGwsYS51cGdyYWRpbmc9ITEsYS5mbHVzaCgpKX0pfWVsc2V7UDEoJ3Byb2JlIHRyYW5zcG9ydCAiJXMiIGZhaWxlZCcsbik7bGV0IFA9bmV3IEVycm9yKCJwcm9iZSBlcnJvciIpO1AudHJhbnNwb3J0PWUubmFtZSxhLmVtaXQoInVwZ3JhZGVFcnJvciIsUCl9fSkpfWZ1bmN0aW9uIG8oKXtpfHwoaT0hMCx5KCksZS5jbG9zZSgpLGU9bnVsbCl9ZnVuY3Rpb24gZChJKXtsZXQgUD1uZXcgRXJyb3IoInByb2JlIGVycm9yOiAiK0kpO1AudHJhbnNwb3J0PWUubmFtZSxvKCksUDEoJ3Byb2JlIHRyYW5zcG9ydCAiJXMiIGZhaWxlZCBiZWNhdXNlIG9mIGVycm9yOiAlcycsbixJKSxhLmVtaXQoInVwZ3JhZGVFcnJvciIsUCl9ZnVuY3Rpb24gcCgpe2QoInRyYW5zcG9ydCBjbG9zZWQiKX1mdW5jdGlvbiBnKCl7ZCgic29ja2V0IGNsb3NlZCIpfWZ1bmN0aW9uIF8oSSl7ZSYmSS5uYW1lIT09ZS5uYW1lJiYoUDEoJyIlcyIgd29ya3MgLSBhYm9ydGluZyAiJXMiJyxJLm5hbWUsZS5uYW1lKSxvKCkpfWZ1bmN0aW9uIHkoKXtlLnJlbW92ZUxpc3RlbmVyKCJvcGVuIixyKSxlLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsZCksZS5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLHApLGEucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixnKSxhLnJlbW92ZUxpc3RlbmVyKCJ1cGdyYWRpbmciLF8pfWUub25jZSgib3BlbiIsciksZS5vbmNlKCJlcnJvciIsZCksZS5vbmNlKCJjbG9zZSIscCksdGhpcy5vbmNlKCJjbG9zZSIsZyksdGhpcy5vbmNlKCJ1cGdyYWRpbmciLF8pLGUub3BlbigpfW9uT3Blbigpe2lmKFAxKCJzb2NrZXQgb3BlbiIpLHRoaXMucmVhZHlTdGF0ZT0ib3BlbiIsdC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9dGhpcy50cmFuc3BvcnQubmFtZT09PSJ3ZWJzb2NrZXQiLHRoaXMuZW1pdCgib3BlbiIpLHRoaXMuZmx1c2goKSx0aGlzLnJlYWR5U3RhdGU9PT0ib3BlbiImJnRoaXMub3B0cy51cGdyYWRlJiZ0aGlzLnRyYW5zcG9ydC5wYXVzZSl7UDEoInN0YXJ0aW5nIHVwZ3JhZGUgcHJvYmVzIik7bGV0IG49MCxlPXRoaXMudXBncmFkZXMubGVuZ3RoO2Zvcig7bjxlO24rKyl0aGlzLnByb2JlKHRoaXMudXBncmFkZXNbbl0pfX1vblBhY2tldChuKXtpZih0aGlzLnJlYWR5U3RhdGU9PT0ib3BlbmluZyJ8fHRoaXMucmVhZHlTdGF0ZT09PSJvcGVuInx8dGhpcy5yZWFkeVN0YXRlPT09ImNsb3NpbmciKXN3aXRjaChQMSgnc29ja2V0IHJlY2VpdmU6IHR5cGUgIiVzIiwgZGF0YSAiJXMiJyxuLnR5cGUsbi5kYXRhKSx0aGlzLmVtaXQoInBhY2tldCIsbiksdGhpcy5lbWl0KCJoZWFydGJlYXQiKSxuLnR5cGUpe2Nhc2Uib3BlbiI6dGhpcy5vbkhhbmRzaGFrZShKU09OLnBhcnNlKG4uZGF0YSkpO2JyZWFrO2Nhc2UicGluZyI6dGhpcy5yZXNldFBpbmdUaW1lb3V0KCksdGhpcy5zZW5kUGFja2V0KCJwb25nIiksdGhpcy5lbWl0KCJwb25nIik7YnJlYWs7Y2FzZSJlcnJvciI6bGV0IGU9bmV3IEVycm9yKCJzZXJ2ZXIgZXJyb3IiKTtlLmNvZGU9bi5kYXRhLHRoaXMub25FcnJvcihlKTticmVhaztjYXNlIm1lc3NhZ2UiOnRoaXMuZW1pdCgiZGF0YSIsbi5kYXRhKSx0aGlzLmVtaXQoIm1lc3NhZ2UiLG4uZGF0YSk7YnJlYWt9ZWxzZSBQMSgncGFja2V0IHJlY2VpdmVkIHdpdGggc29ja2V0IHJlYWR5U3RhdGUgIiVzIicsdGhpcy5yZWFkeVN0YXRlKX1vbkhhbmRzaGFrZShuKXt0aGlzLmVtaXQoImhhbmRzaGFrZSIsbiksdGhpcy5pZD1uLnNpZCx0aGlzLnRyYW5zcG9ydC5xdWVyeS5zaWQ9bi5zaWQsdGhpcy51cGdyYWRlcz10aGlzLmZpbHRlclVwZ3JhZGVzKG4udXBncmFkZXMpLHRoaXMucGluZ0ludGVydmFsPW4ucGluZ0ludGVydmFsLHRoaXMucGluZ1RpbWVvdXQ9bi5waW5nVGltZW91dCx0aGlzLm9uT3BlbigpLHRoaXMucmVhZHlTdGF0ZSE9PSJjbG9zZWQiJiZ0aGlzLnJlc2V0UGluZ1RpbWVvdXQoKX1yZXNldFBpbmdUaW1lb3V0KCl7Y2xlYXJUaW1lb3V0KHRoaXMucGluZ1RpbWVvdXRUaW1lciksdGhpcy5waW5nVGltZW91dFRpbWVyPXNldFRpbWVvdXQoKCk9Pnt0aGlzLm9uQ2xvc2UoInBpbmcgdGltZW91dCIpfSx0aGlzLnBpbmdJbnRlcnZhbCt0aGlzLnBpbmdUaW1lb3V0KX1vbkRyYWluKCl7dGhpcy53cml0ZUJ1ZmZlci5zcGxpY2UoMCx0aGlzLnByZXZCdWZmZXJMZW4pLHRoaXMucHJldkJ1ZmZlckxlbj0wLHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoPT09MD90aGlzLmVtaXQoImRyYWluIik6dGhpcy5mbHVzaCgpfWZsdXNoKCl7dGhpcy5yZWFkeVN0YXRlIT09ImNsb3NlZCImJnRoaXMudHJhbnNwb3J0LndyaXRhYmxlJiYhdGhpcy51cGdyYWRpbmcmJnRoaXMud3JpdGVCdWZmZXIubGVuZ3RoJiYoUDEoImZsdXNoaW5nICVkIHBhY2tldHMgaW4gc29ja2V0Iix0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCksdGhpcy50cmFuc3BvcnQuc2VuZCh0aGlzLndyaXRlQnVmZmVyKSx0aGlzLnByZXZCdWZmZXJMZW49dGhpcy53cml0ZUJ1ZmZlci5sZW5ndGgsdGhpcy5lbWl0KCJmbHVzaCIpKX13cml0ZShuLGUsaSl7cmV0dXJuIHRoaXMuc2VuZFBhY2tldCgibWVzc2FnZSIsbixlLGkpLHRoaXN9c2VuZChuLGUsaSl7cmV0dXJuIHRoaXMuc2VuZFBhY2tldCgibWVzc2FnZSIsbixlLGkpLHRoaXN9c2VuZFBhY2tldChuLGUsaSxhKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKGE9ZSxlPXZvaWQgMCksdHlwZW9mIGk9PSJmdW5jdGlvbiImJihhPWksaT1udWxsKSx0aGlzLnJlYWR5U3RhdGU9PT0iY2xvc2luZyJ8fHRoaXMucmVhZHlTdGF0ZT09PSJjbG9zZWQiKXJldHVybjtpPWl8fHt9LGkuY29tcHJlc3M9aS5jb21wcmVzcyE9PSExO2xldCByPXt0eXBlOm4sZGF0YTplLG9wdGlvbnM6aX07dGhpcy5lbWl0KCJwYWNrZXRDcmVhdGUiLHIpLHRoaXMud3JpdGVCdWZmZXIucHVzaChyKSxhJiZ0aGlzLm9uY2UoImZsdXNoIixhKSx0aGlzLmZsdXNoKCl9Y2xvc2UoKXtsZXQgbj10aGlzOyh0aGlzLnJlYWR5U3RhdGU9PT0ib3BlbmluZyJ8fHRoaXMucmVhZHlTdGF0ZT09PSJvcGVuIikmJih0aGlzLnJlYWR5U3RhdGU9ImNsb3NpbmciLHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoP3RoaXMub25jZSgiZHJhaW4iLGZ1bmN0aW9uKCl7dGhpcy51cGdyYWRpbmc/YSgpOmUoKX0pOnRoaXMudXBncmFkaW5nP2EoKTplKCkpO2Z1bmN0aW9uIGUoKXtuLm9uQ2xvc2UoImZvcmNlZCBjbG9zZSIpLFAxKCJzb2NrZXQgY2xvc2luZyAtIHRlbGxpbmcgdHJhbnNwb3J0IHRvIGNsb3NlIiksbi50cmFuc3BvcnQuY2xvc2UoKX1mdW5jdGlvbiBpKCl7bi5yZW1vdmVMaXN0ZW5lcigidXBncmFkZSIsaSksbi5yZW1vdmVMaXN0ZW5lcigidXBncmFkZUVycm9yIixpKSxlKCl9ZnVuY3Rpb24gYSgpe24ub25jZSgidXBncmFkZSIsaSksbi5vbmNlKCJ1cGdyYWRlRXJyb3IiLGkpfXJldHVybiB0aGlzfW9uRXJyb3Iobil7UDEoInNvY2tldCBlcnJvciAlaiIsbiksdC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9ITEsdGhpcy5lbWl0KCJlcnJvciIsbiksdGhpcy5vbkNsb3NlKCJ0cmFuc3BvcnQgZXJyb3IiLG4pfW9uQ2xvc2UobixlKXtpZih0aGlzLnJlYWR5U3RhdGU9PT0ib3BlbmluZyJ8fHRoaXMucmVhZHlTdGF0ZT09PSJvcGVuInx8dGhpcy5yZWFkeVN0YXRlPT09ImNsb3NpbmciKXtQMSgnc29ja2V0IGNsb3NlIHdpdGggcmVhc29uOiAiJXMiJyxuKTtsZXQgaT10aGlzO2NsZWFyVGltZW91dCh0aGlzLnBpbmdJbnRlcnZhbFRpbWVyKSxjbGVhclRpbWVvdXQodGhpcy5waW5nVGltZW91dFRpbWVyKSx0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoImNsb3NlIiksdGhpcy50cmFuc3BvcnQuY2xvc2UoKSx0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKSx0aGlzLnJlYWR5U3RhdGU9ImNsb3NlZCIsdGhpcy5pZD1udWxsLHRoaXMuZW1pdCgiY2xvc2UiLG4sZSksaS53cml0ZUJ1ZmZlcj1bXSxpLnByZXZCdWZmZXJMZW49MH19ZmlsdGVyVXBncmFkZXMobil7bGV0IGU9W10saT0wLGE9bi5sZW5ndGg7Zm9yKDtpPGE7aSsrKX50aGlzLnRyYW5zcG9ydHMuaW5kZXhPZihuW2ldKSYmZS5wdXNoKG5baV0pO3JldHVybiBlfX07aDQucHJpb3JXZWJzb2NrZXRTdWNjZXNzPSExO2g0LnByb3RvY29sPXNwLnByb3RvY29sO2Z1bmN0aW9uIEtUKHQpe2xldCBuPXt9O2ZvcihsZXQgZSBpbiB0KXQuaGFzT3duUHJvcGVydHkoZSkmJihuW2VdPXRbZV0pO3JldHVybiBufWxwLmV4cG9ydHM9aDR9KTt2YXIgbXA9VGUoKFZYLFJuKT0+e3ZhciBGbD1kcCgpO1JuLmV4cG9ydHM9KHQsbik9Pm5ldyBGbCh0LG4pO1JuLmV4cG9ydHMuU29ja2V0PUZsO1JuLmV4cG9ydHMucHJvdG9jb2w9RmwucHJvdG9jb2w7Um4uZXhwb3J0cy5UcmFuc3BvcnQ9dDMoKTtSbi5leHBvcnRzLnRyYW5zcG9ydHM9UmwoKTtSbi5leHBvcnRzLnBhcnNlcj1PcigpfSk7dmFyIEJsPVRlKE5yPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOciwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7TnIuaGFzQmluYXJ5PU5yLmlzQmluYXJ5PXZvaWQgMDt2YXIgWFQ9dHlwZW9mIEFycmF5QnVmZmVyPT0iZnVuY3Rpb24iLEpUPXQ9PnR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXc9PSJmdW5jdGlvbiI/QXJyYXlCdWZmZXIuaXNWaWV3KHQpOnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsaHA9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxlRT10eXBlb2YgQmxvYj09ImZ1bmN0aW9uInx8dHlwZW9mIEJsb2I8InUiJiZocC5jYWxsKEJsb2IpPT09IltvYmplY3QgQmxvYkNvbnN0cnVjdG9yXSIsdEU9dHlwZW9mIEZpbGU9PSJmdW5jdGlvbiJ8fHR5cGVvZiBGaWxlPCJ1IiYmaHAuY2FsbChGaWxlKT09PSJbb2JqZWN0IEZpbGVDb25zdHJ1Y3Rvcl0iO2Z1bmN0aW9uIHBwKHQpe3JldHVybiBYVCYmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8SlQodCkpfHxlRSYmdCBpbnN0YW5jZW9mIEJsb2J8fHRFJiZ0IGluc3RhbmNlb2YgRmlsZX1Oci5pc0JpbmFyeT1wcDtmdW5jdGlvbiByMyh0LG4pe2lmKCF0fHx0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuITE7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKGxldCBlPTAsaT10Lmxlbmd0aDtlPGk7ZSsrKWlmKHIzKHRbZV0pKXJldHVybiEwO3JldHVybiExfWlmKHBwKHQpKXJldHVybiEwO2lmKHQudG9KU09OJiZ0eXBlb2YgdC50b0pTT049PSJmdW5jdGlvbiImJmFyZ3VtZW50cy5sZW5ndGg9PT0xKXJldHVybiByMyh0LnRvSlNPTigpLCEwKTtmb3IobGV0IGUgaW4gdClpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKSYmcjModFtlXSkpcmV0dXJuITA7cmV0dXJuITF9TnIuaGFzQmluYXJ5PXIzfSk7dmFyIGZwPVRlKFJyPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSciwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7UnIucmVjb25zdHJ1Y3RQYWNrZXQ9UnIuZGVjb25zdHJ1Y3RQYWNrZXQ9dm9pZCAwO3ZhciBpRT1CbCgpO2Z1bmN0aW9uIGFFKHQpe2xldCBuPVtdLGU9dC5kYXRhLGk9dDtyZXR1cm4gaS5kYXRhPVVsKGUsbiksaS5hdHRhY2htZW50cz1uLmxlbmd0aCx7cGFja2V0OmksYnVmZmVyczpufX1Sci5kZWNvbnN0cnVjdFBhY2tldD1hRTtmdW5jdGlvbiBVbCh0LG4pe2lmKCF0KXJldHVybiB0O2lmKGlFLmlzQmluYXJ5KHQpKXtsZXQgZT17X3BsYWNlaG9sZGVyOiEwLG51bTpuLmxlbmd0aH07cmV0dXJuIG4ucHVzaCh0KSxlfWVsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7bGV0IGU9bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krKyllW2ldPVVsKHRbaV0sbik7cmV0dXJuIGV9ZWxzZSBpZih0eXBlb2YgdD09Im9iamVjdCImJiEodCBpbnN0YW5jZW9mIERhdGUpKXtsZXQgZT17fTtmb3IobGV0IGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiYoZVtpXT1VbCh0W2ldLG4pKTtyZXR1cm4gZX1yZXR1cm4gdH1mdW5jdGlvbiBuRSh0LG4pe3JldHVybiB0LmRhdGE9amwodC5kYXRhLG4pLHQuYXR0YWNobWVudHM9dm9pZCAwLHR9UnIucmVjb25zdHJ1Y3RQYWNrZXQ9bkU7ZnVuY3Rpb24gamwodCxuKXtpZighdClyZXR1cm4gdDtpZih0JiZ0Ll9wbGFjZWhvbGRlcj09PSEwKXtpZih0eXBlb2YgdC5udW09PSJudW1iZXIiJiZ0Lm51bT49MCYmdC5udW08bi5sZW5ndGgpcmV0dXJuIG5bdC5udW1dO3Rocm93IG5ldyBFcnJvcigiaWxsZWdhbCBhdHRhY2htZW50cyIpfWVsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPWpsKHRbZV0sbik7ZWxzZSBpZih0eXBlb2YgdD09Im9iamVjdCIpZm9yKGxldCBlIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShlKSYmKHRbZV09amwodFtlXSxuKSk7cmV0dXJuIHR9fSk7dmFyIG8zPVRlKE8yPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShPMiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7TzIuRGVjb2Rlcj1PMi5FbmNvZGVyPU8yLlBhY2tldFR5cGU9TzIucHJvdG9jb2w9dm9pZCAwO3ZhciByRT1ObigpLHVwPWZwKCksZ3A9QmwoKSxxbD1WcigpKCJzb2NrZXQuaW8tcGFyc2VyIik7TzIucHJvdG9jb2w9NTt2YXIgUjE7KGZ1bmN0aW9uKHQpe3RbdC5DT05ORUNUPTBdPSJDT05ORUNUIix0W3QuRElTQ09OTkVDVD0xXT0iRElTQ09OTkVDVCIsdFt0LkVWRU5UPTJdPSJFVkVOVCIsdFt0LkFDSz0zXT0iQUNLIix0W3QuQ09OTkVDVF9FUlJPUj00XT0iQ09OTkVDVF9FUlJPUiIsdFt0LkJJTkFSWV9FVkVOVD01XT0iQklOQVJZX0VWRU5UIix0W3QuQklOQVJZX0FDSz02XT0iQklOQVJZX0FDSyJ9KShSMT1PMi5QYWNrZXRUeXBlfHwoTzIuUGFja2V0VHlwZT17fSkpO3ZhciBHbD1jbGFzc3tlbmNvZGUobil7cmV0dXJuIHFsKCJlbmNvZGluZyBwYWNrZXQgJWoiLG4pLChuLnR5cGU9PT1SMS5FVkVOVHx8bi50eXBlPT09UjEuQUNLKSYmZ3AuaGFzQmluYXJ5KG4pPyhuLnR5cGU9bi50eXBlPT09UjEuRVZFTlQ/UjEuQklOQVJZX0VWRU5UOlIxLkJJTkFSWV9BQ0ssdGhpcy5lbmNvZGVBc0JpbmFyeShuKSk6W3RoaXMuZW5jb2RlQXNTdHJpbmcobildfWVuY29kZUFzU3RyaW5nKG4pe2xldCBlPSIiK24udHlwZTtyZXR1cm4obi50eXBlPT09UjEuQklOQVJZX0VWRU5UfHxuLnR5cGU9PT1SMS5CSU5BUllfQUNLKSYmKGUrPW4uYXR0YWNobWVudHMrIi0iKSxuLm5zcCYmbi5uc3AhPT0iLyImJihlKz1uLm5zcCsiLCIpLG4uaWQhPW51bGwmJihlKz1uLmlkKSxuLmRhdGEhPW51bGwmJihlKz1KU09OLnN0cmluZ2lmeShuLmRhdGEpKSxxbCgiZW5jb2RlZCAlaiBhcyAlcyIsbixlKSxlfWVuY29kZUFzQmluYXJ5KG4pe2xldCBlPXVwLmRlY29uc3RydWN0UGFja2V0KG4pLGk9dGhpcy5lbmNvZGVBc1N0cmluZyhlLnBhY2tldCksYT1lLmJ1ZmZlcnM7cmV0dXJuIGEudW5zaGlmdChpKSxhfX07TzIuRW5jb2Rlcj1HbDt2YXIgV2w9Y2xhc3MgdCBleHRlbmRzIHJFe2NvbnN0cnVjdG9yKCl7c3VwZXIoKX1hZGQobil7bGV0IGU7aWYodHlwZW9mIG49PSJzdHJpbmciKXtpZih0aGlzLnJlY29uc3RydWN0b3IpdGhyb3cgbmV3IEVycm9yKCJnb3QgcGxhaW50ZXh0IGRhdGEgd2hlbiByZWNvbnN0cnVjdGluZyBhIHBhY2tldCIpO2U9dGhpcy5kZWNvZGVTdHJpbmcobiksZS50eXBlPT09UjEuQklOQVJZX0VWRU5UfHxlLnR5cGU9PT1SMS5CSU5BUllfQUNLPyh0aGlzLnJlY29uc3RydWN0b3I9bmV3IFFsKGUpLGUuYXR0YWNobWVudHM9PT0wJiZzdXBlci5lbWl0KCJkZWNvZGVkIixlKSk6c3VwZXIuZW1pdCgiZGVjb2RlZCIsZSl9ZWxzZSBpZihncC5pc0JpbmFyeShuKXx8bi5iYXNlNjQpaWYodGhpcy5yZWNvbnN0cnVjdG9yKWU9dGhpcy5yZWNvbnN0cnVjdG9yLnRha2VCaW5hcnlEYXRhKG4pLGUmJih0aGlzLnJlY29uc3RydWN0b3I9bnVsbCxzdXBlci5lbWl0KCJkZWNvZGVkIixlKSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoImdvdCBiaW5hcnkgZGF0YSB3aGVuIG5vdCByZWNvbnN0cnVjdGluZyBhIHBhY2tldCIpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHR5cGU6ICIrbil9ZGVjb2RlU3RyaW5nKG4pe2xldCBlPTAsaT17dHlwZTpOdW1iZXIobi5jaGFyQXQoMCkpfTtpZihSMVtpLnR5cGVdPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigidW5rbm93biBwYWNrZXQgdHlwZSAiK2kudHlwZSk7aWYoaS50eXBlPT09UjEuQklOQVJZX0VWRU5UfHxpLnR5cGU9PT1SMS5CSU5BUllfQUNLKXtsZXQgcj1lKzE7Zm9yKDtuLmNoYXJBdCgrK2UpIT09Ii0iJiZlIT1uLmxlbmd0aDspO2xldCBvPW4uc3Vic3RyaW5nKHIsZSk7aWYobyE9TnVtYmVyKG8pfHxuLmNoYXJBdChlKSE9PSItIil0aHJvdyBuZXcgRXJyb3IoIklsbGVnYWwgYXR0YWNobWVudHMiKTtpLmF0dGFjaG1lbnRzPU51bWJlcihvKX1pZihuLmNoYXJBdChlKzEpPT09Ii8iKXtsZXQgcj1lKzE7Zm9yKDsrK2UmJiEobi5jaGFyQXQoZSk9PT0iLCJ8fGU9PT1uLmxlbmd0aCk7KTtpLm5zcD1uLnN1YnN0cmluZyhyLGUpfWVsc2UgaS5uc3A9Ii8iO2xldCBhPW4uY2hhckF0KGUrMSk7aWYoYSE9PSIiJiZOdW1iZXIoYSk9PWEpe2xldCByPWUrMTtmb3IoOysrZTspe2xldCBvPW4uY2hhckF0KGUpO2lmKG89PW51bGx8fE51bWJlcihvKSE9byl7LS1lO2JyZWFrfWlmKGU9PT1uLmxlbmd0aClicmVha31pLmlkPU51bWJlcihuLnN1YnN0cmluZyhyLGUrMSkpfWlmKG4uY2hhckF0KCsrZSkpe2xldCByPW9FKG4uc3Vic3RyKGUpKTtpZih0LmlzUGF5bG9hZFZhbGlkKGkudHlwZSxyKSlpLmRhdGE9cjtlbHNlIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBwYXlsb2FkIil9cmV0dXJuIHFsKCJkZWNvZGVkICVzIGFzICVqIixuLGkpLGl9c3RhdGljIGlzUGF5bG9hZFZhbGlkKG4sZSl7c3dpdGNoKG4pe2Nhc2UgUjEuQ09OTkVDVDpyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiO2Nhc2UgUjEuRElTQ09OTkVDVDpyZXR1cm4gZT09PXZvaWQgMDtjYXNlIFIxLkNPTk5FQ1RfRVJST1I6cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJvYmplY3QiO2Nhc2UgUjEuRVZFTlQ6Y2FzZSBSMS5CSU5BUllfRVZFTlQ6cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPjA7Y2FzZSBSMS5BQ0s6Y2FzZSBSMS5CSU5BUllfQUNLOnJldHVybiBBcnJheS5pc0FycmF5KGUpfX1kZXN0cm95KCl7dGhpcy5yZWNvbnN0cnVjdG9yJiZ0aGlzLnJlY29uc3RydWN0b3IuZmluaXNoZWRSZWNvbnN0cnVjdGlvbigpfX07TzIuRGVjb2Rlcj1XbDtmdW5jdGlvbiBvRSh0KXt0cnl7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7cmV0dXJuITF9fXZhciBRbD1jbGFzc3tjb25zdHJ1Y3RvcihuKXt0aGlzLnBhY2tldD1uLHRoaXMuYnVmZmVycz1bXSx0aGlzLnJlY29uUGFjaz1ufXRha2VCaW5hcnlEYXRhKG4pe2lmKHRoaXMuYnVmZmVycy5wdXNoKG4pLHRoaXMuYnVmZmVycy5sZW5ndGg9PT10aGlzLnJlY29uUGFjay5hdHRhY2htZW50cyl7bGV0IGU9dXAucmVjb25zdHJ1Y3RQYWNrZXQodGhpcy5yZWNvblBhY2ssdGhpcy5idWZmZXJzKTtyZXR1cm4gdGhpcy5maW5pc2hlZFJlY29uc3RydWN0aW9uKCksZX1yZXR1cm4gbnVsbH1maW5pc2hlZFJlY29uc3RydWN0aW9uKCl7dGhpcy5yZWNvblBhY2s9bnVsbCx0aGlzLmJ1ZmZlcnM9W119fX0pO3ZhciBZbD1UZShjMz0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoYzMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO2MzLm9uPXZvaWQgMDtmdW5jdGlvbiBjRSh0LG4sZSl7cmV0dXJuIHQub24obixlKSxmdW5jdGlvbigpe3Qub2ZmKG4sZSl9fWMzLm9uPWNFfSk7dmFyICRsPVRlKGwzPT57InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShsMywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7bDMuU29ja2V0PXZvaWQgMDt2YXIgXzI9bzMoKSxzRT1ObigpLHMzPVlsKCksYjI9VnIoKSgic29ja2V0LmlvLWNsaWVudDpzb2NrZXQiKSxsRT1PYmplY3QuZnJlZXplKHtjb25uZWN0OjEsY29ubmVjdF9lcnJvcjoxLGRpc2Nvbm5lY3Q6MSxkaXNjb25uZWN0aW5nOjEsbmV3TGlzdGVuZXI6MSxyZW1vdmVMaXN0ZW5lcjoxfSksWmw9Y2xhc3MgZXh0ZW5kcyBzRXtjb25zdHJ1Y3RvcihuLGUsaSl7c3VwZXIoKSx0aGlzLnJlY2VpdmVCdWZmZXI9W10sdGhpcy5zZW5kQnVmZmVyPVtdLHRoaXMuaWRzPTAsdGhpcy5hY2tzPXt9LHRoaXMuZmxhZ3M9e30sdGhpcy5pbz1uLHRoaXMubnNwPWUsdGhpcy5pZHM9MCx0aGlzLmFja3M9e30sdGhpcy5yZWNlaXZlQnVmZmVyPVtdLHRoaXMuc2VuZEJ1ZmZlcj1bXSx0aGlzLmNvbm5lY3RlZD0hMSx0aGlzLmRpc2Nvbm5lY3RlZD0hMCx0aGlzLmZsYWdzPXt9LGkmJmkuYXV0aCYmKHRoaXMuYXV0aD1pLmF1dGgpLHRoaXMuaW8uX2F1dG9Db25uZWN0JiZ0aGlzLm9wZW4oKX1zdWJFdmVudHMoKXtpZih0aGlzLnN1YnMpcmV0dXJuO2xldCBuPXRoaXMuaW87dGhpcy5zdWJzPVtzMy5vbihuLCJvcGVuIix0aGlzLm9ub3Blbi5iaW5kKHRoaXMpKSxzMy5vbihuLCJwYWNrZXQiLHRoaXMub25wYWNrZXQuYmluZCh0aGlzKSksczMub24obiwiZXJyb3IiLHRoaXMub25lcnJvci5iaW5kKHRoaXMpKSxzMy5vbihuLCJjbG9zZSIsdGhpcy5vbmNsb3NlLmJpbmQodGhpcykpXX1nZXQgYWN0aXZlKCl7cmV0dXJuISF0aGlzLnN1YnN9Y29ubmVjdCgpe3JldHVybiB0aGlzLmNvbm5lY3RlZD90aGlzOih0aGlzLnN1YkV2ZW50cygpLHRoaXMuaW8uX3JlY29ubmVjdGluZ3x8dGhpcy5pby5vcGVuKCksdGhpcy5pby5fcmVhZHlTdGF0ZT09PSJvcGVuIiYmdGhpcy5vbm9wZW4oKSx0aGlzKX1vcGVuKCl7cmV0dXJuIHRoaXMuY29ubmVjdCgpfXNlbmQoLi4ubil7cmV0dXJuIG4udW5zaGlmdCgibWVzc2FnZSIpLHRoaXMuZW1pdC5hcHBseSh0aGlzLG4pLHRoaXN9ZW1pdChuLC4uLmUpe2lmKGxFLmhhc093blByb3BlcnR5KG4pKXRocm93IG5ldyBFcnJvcignIicrbisnIiBpcyBhIHJlc2VydmVkIGV2ZW50IG5hbWUnKTtlLnVuc2hpZnQobik7bGV0IGk9e3R5cGU6XzIuUGFja2V0VHlwZS5FVkVOVCxkYXRhOmV9O2kub3B0aW9ucz17fSxpLm9wdGlvbnMuY29tcHJlc3M9dGhpcy5mbGFncy5jb21wcmVzcyE9PSExLHR5cGVvZiBlW2UubGVuZ3RoLTFdPT0iZnVuY3Rpb24iJiYoYjIoImVtaXR0aW5nIHBhY2tldCB3aXRoIGFjayBpZCAlZCIsdGhpcy5pZHMpLHRoaXMuYWNrc1t0aGlzLmlkc109ZS5wb3AoKSxpLmlkPXRoaXMuaWRzKyspO2xldCBhPXRoaXMuaW8uZW5naW5lJiZ0aGlzLmlvLmVuZ2luZS50cmFuc3BvcnQmJnRoaXMuaW8uZW5naW5lLnRyYW5zcG9ydC53cml0YWJsZTtyZXR1cm4gdGhpcy5mbGFncy52b2xhdGlsZSYmKCFhfHwhdGhpcy5jb25uZWN0ZWQpP2IyKCJkaXNjYXJkIHBhY2tldCBhcyB0aGUgdHJhbnNwb3J0IGlzIG5vdCBjdXJyZW50bHkgd3JpdGFibGUiKTp0aGlzLmNvbm5lY3RlZD90aGlzLnBhY2tldChpKTp0aGlzLnNlbmRCdWZmZXIucHVzaChpKSx0aGlzLmZsYWdzPXt9LHRoaXN9cGFja2V0KG4pe24ubnNwPXRoaXMubnNwLHRoaXMuaW8uX3BhY2tldChuKX1vbm9wZW4oKXtiMigidHJhbnNwb3J0IGlzIG9wZW4gLSBjb25uZWN0aW5nIiksdHlwZW9mIHRoaXMuYXV0aD09ImZ1bmN0aW9uIj90aGlzLmF1dGgobj0+e3RoaXMucGFja2V0KHt0eXBlOl8yLlBhY2tldFR5cGUuQ09OTkVDVCxkYXRhOm59KX0pOnRoaXMucGFja2V0KHt0eXBlOl8yLlBhY2tldFR5cGUuQ09OTkVDVCxkYXRhOnRoaXMuYXV0aH0pfW9uZXJyb3Iobil7dGhpcy5jb25uZWN0ZWR8fHN1cGVyLmVtaXQoImNvbm5lY3RfZXJyb3IiLG4pfW9uY2xvc2Uobil7YjIoImNsb3NlICglcykiLG4pLHRoaXMuY29ubmVjdGVkPSExLHRoaXMuZGlzY29ubmVjdGVkPSEwLGRlbGV0ZSB0aGlzLmlkLHN1cGVyLmVtaXQoImRpc2Nvbm5lY3QiLG4pfW9ucGFja2V0KG4pe2lmKG4ubnNwPT09dGhpcy5uc3Apc3dpdGNoKG4udHlwZSl7Y2FzZSBfMi5QYWNrZXRUeXBlLkNPTk5FQ1Q6aWYobi5kYXRhJiZuLmRhdGEuc2lkKXtsZXQgYT1uLmRhdGEuc2lkO3RoaXMub25jb25uZWN0KGEpfWVsc2Ugc3VwZXIuZW1pdCgiY29ubmVjdF9lcnJvciIsbmV3IEVycm9yKCJJdCBzZWVtcyB5b3UgYXJlIHRyeWluZyB0byByZWFjaCBhIFNvY2tldC5JTyBzZXJ2ZXIgaW4gdjIueCB3aXRoIGEgdjMueCBjbGllbnQsIGJ1dCB0aGV5IGFyZSBub3QgY29tcGF0aWJsZSAobW9yZSBpbmZvcm1hdGlvbiBoZXJlOiBodHRwczovL3NvY2tldC5pby9kb2NzL3YzL21pZ3JhdGluZy1mcm9tLTIteC10by0zLTAvKSIpKTticmVhaztjYXNlIF8yLlBhY2tldFR5cGUuRVZFTlQ6dGhpcy5vbmV2ZW50KG4pO2JyZWFrO2Nhc2UgXzIuUGFja2V0VHlwZS5CSU5BUllfRVZFTlQ6dGhpcy5vbmV2ZW50KG4pO2JyZWFrO2Nhc2UgXzIuUGFja2V0VHlwZS5BQ0s6dGhpcy5vbmFjayhuKTticmVhaztjYXNlIF8yLlBhY2tldFR5cGUuQklOQVJZX0FDSzp0aGlzLm9uYWNrKG4pO2JyZWFrO2Nhc2UgXzIuUGFja2V0VHlwZS5ESVNDT05ORUNUOnRoaXMub25kaXNjb25uZWN0KCk7YnJlYWs7Y2FzZSBfMi5QYWNrZXRUeXBlLkNPTk5FQ1RfRVJST1I6bGV0IGk9bmV3IEVycm9yKG4uZGF0YS5tZXNzYWdlKTtpLmRhdGE9bi5kYXRhLmRhdGEsc3VwZXIuZW1pdCgiY29ubmVjdF9lcnJvciIsaSk7YnJlYWt9fW9uZXZlbnQobil7bGV0IGU9bi5kYXRhfHxbXTtiMigiZW1pdHRpbmcgZXZlbnQgJWoiLGUpLG4uaWQhPW51bGwmJihiMigiYXR0YWNoaW5nIGFjayBjYWxsYmFjayB0byBldmVudCIpLGUucHVzaCh0aGlzLmFjayhuLmlkKSkpLHRoaXMuY29ubmVjdGVkP3RoaXMuZW1pdEV2ZW50KGUpOnRoaXMucmVjZWl2ZUJ1ZmZlci5wdXNoKE9iamVjdC5mcmVlemUoZSkpfWVtaXRFdmVudChuKXtpZih0aGlzLl9hbnlMaXN0ZW5lcnMmJnRoaXMuX2FueUxpc3RlbmVycy5sZW5ndGgpe2xldCBlPXRoaXMuX2FueUxpc3RlbmVycy5zbGljZSgpO2ZvcihsZXQgaSBvZiBlKWkuYXBwbHkodGhpcyxuKX1zdXBlci5lbWl0LmFwcGx5KHRoaXMsbil9YWNrKG4pe2xldCBlPXRoaXMsaT0hMTtyZXR1cm4gZnVuY3Rpb24oLi4uYSl7aXx8KGk9ITAsYjIoInNlbmRpbmcgYWNrICVqIixhKSxlLnBhY2tldCh7dHlwZTpfMi5QYWNrZXRUeXBlLkFDSyxpZDpuLGRhdGE6YX0pKX19b25hY2sobil7bGV0IGU9dGhpcy5hY2tzW24uaWRdO3R5cGVvZiBlPT0iZnVuY3Rpb24iPyhiMigiY2FsbGluZyBhY2sgJXMgd2l0aCAlaiIsbi5pZCxuLmRhdGEpLGUuYXBwbHkodGhpcyxuLmRhdGEpLGRlbGV0ZSB0aGlzLmFja3Nbbi5pZF0pOmIyKCJiYWQgYWNrICVzIixuLmlkKX1vbmNvbm5lY3Qobil7YjIoInNvY2tldCBjb25uZWN0ZWQgd2l0aCBpZCAlcyIsbiksdGhpcy5pZD1uLHRoaXMuY29ubmVjdGVkPSEwLHRoaXMuZGlzY29ubmVjdGVkPSExLHN1cGVyLmVtaXQoImNvbm5lY3QiKSx0aGlzLmVtaXRCdWZmZXJlZCgpfWVtaXRCdWZmZXJlZCgpe3RoaXMucmVjZWl2ZUJ1ZmZlci5mb3JFYWNoKG49PnRoaXMuZW1pdEV2ZW50KG4pKSx0aGlzLnJlY2VpdmVCdWZmZXI9W10sdGhpcy5zZW5kQnVmZmVyLmZvckVhY2gobj0+dGhpcy5wYWNrZXQobikpLHRoaXMuc2VuZEJ1ZmZlcj1bXX1vbmRpc2Nvbm5lY3QoKXtiMigic2VydmVyIGRpc2Nvbm5lY3QgKCVzKSIsdGhpcy5uc3ApLHRoaXMuZGVzdHJveSgpLHRoaXMub25jbG9zZSgiaW8gc2VydmVyIGRpc2Nvbm5lY3QiKX1kZXN0cm95KCl7dGhpcy5zdWJzJiYodGhpcy5zdWJzLmZvckVhY2gobj0+bigpKSx0aGlzLnN1YnM9dm9pZCAwKSx0aGlzLmlvLl9kZXN0cm95KHRoaXMpfWRpc2Nvbm5lY3QoKXtyZXR1cm4gdGhpcy5jb25uZWN0ZWQmJihiMigicGVyZm9ybWluZyBkaXNjb25uZWN0ICglcykiLHRoaXMubnNwKSx0aGlzLnBhY2tldCh7dHlwZTpfMi5QYWNrZXRUeXBlLkRJU0NPTk5FQ1R9KSksdGhpcy5kZXN0cm95KCksdGhpcy5jb25uZWN0ZWQmJnRoaXMub25jbG9zZSgiaW8gY2xpZW50IGRpc2Nvbm5lY3QiKSx0aGlzfWNsb3NlKCl7cmV0dXJuIHRoaXMuZGlzY29ubmVjdCgpfWNvbXByZXNzKG4pe3JldHVybiB0aGlzLmZsYWdzLmNvbXByZXNzPW4sdGhpc31nZXQgdm9sYXRpbGUoKXtyZXR1cm4gdGhpcy5mbGFncy52b2xhdGlsZT0hMCx0aGlzfW9uQW55KG4pe3JldHVybiB0aGlzLl9hbnlMaXN0ZW5lcnM9dGhpcy5fYW55TGlzdGVuZXJzfHxbXSx0aGlzLl9hbnlMaXN0ZW5lcnMucHVzaChuKSx0aGlzfXByZXBlbmRBbnkobil7cmV0dXJuIHRoaXMuX2FueUxpc3RlbmVycz10aGlzLl9hbnlMaXN0ZW5lcnN8fFtdLHRoaXMuX2FueUxpc3RlbmVycy51bnNoaWZ0KG4pLHRoaXN9b2ZmQW55KG4pe2lmKCF0aGlzLl9hbnlMaXN0ZW5lcnMpcmV0dXJuIHRoaXM7aWYobil7bGV0IGU9dGhpcy5fYW55TGlzdGVuZXJzO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKWlmKG49PT1lW2ldKXJldHVybiBlLnNwbGljZShpLDEpLHRoaXN9ZWxzZSB0aGlzLl9hbnlMaXN0ZW5lcnM9W107cmV0dXJuIHRoaXN9bGlzdGVuZXJzQW55KCl7cmV0dXJuIHRoaXMuX2FueUxpc3RlbmVyc3x8W119fTtsMy5Tb2NrZXQ9Wmx9KTt2YXIgX3A9VGUoKEJYLHZwKT0+e3ZwLmV4cG9ydHM9RnI7ZnVuY3Rpb24gRnIodCl7dD10fHx7fSx0aGlzLm1zPXQubWlufHwxMDAsdGhpcy5tYXg9dC5tYXh8fDFlNCx0aGlzLmZhY3Rvcj10LmZhY3Rvcnx8Mix0aGlzLmppdHRlcj10LmppdHRlcj4wJiZ0LmppdHRlcjw9MT90LmppdHRlcjowLHRoaXMuYXR0ZW1wdHM9MH1Gci5wcm90b3R5cGUuZHVyYXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm1zKk1hdGgucG93KHRoaXMuZmFjdG9yLHRoaXMuYXR0ZW1wdHMrKyk7aWYodGhpcy5qaXR0ZXIpe3ZhciBuPU1hdGgucmFuZG9tKCksZT1NYXRoLmZsb29yKG4qdGhpcy5qaXR0ZXIqdCk7dD0oTWF0aC5mbG9vcihuKjEwKSYxKT09MD90LWU6dCtlfXJldHVybiBNYXRoLm1pbih0LHRoaXMubWF4KXwwfTtGci5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmF0dGVtcHRzPTB9O0ZyLnByb3RvdHlwZS5zZXRNaW49ZnVuY3Rpb24odCl7dGhpcy5tcz10fTtGci5wcm90b3R5cGUuc2V0TWF4PWZ1bmN0aW9uKHQpe3RoaXMubWF4PXR9O0ZyLnByb3RvdHlwZS5zZXRKaXR0ZXI9ZnVuY3Rpb24odCl7dGhpcy5qaXR0ZXI9dH19KTt2YXIgWGw9VGUoZDM9PnsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGQzLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtkMy5NYW5hZ2VyPXZvaWQgMDt2YXIgZEU9bXAoKSxtRT0kbCgpLGhFPU5uKCkscEU9bzMoKSxGbj1ZbCgpLGZFPV9wKCksX2k9VnIoKSgic29ja2V0LmlvLWNsaWVudDptYW5hZ2VyIiksS2w9Y2xhc3MgZXh0ZW5kcyBoRXtjb25zdHJ1Y3RvcihuLGUpe3N1cGVyKCksdGhpcy5uc3BzPXt9LHRoaXMuc3Vicz1bXSxuJiZ0eXBlb2Ygbj09Im9iamVjdCImJihlPW4sbj12b2lkIDApLGU9ZXx8e30sZS5wYXRoPWUucGF0aHx8Ii9zb2NrZXQuaW8iLHRoaXMub3B0cz1lLHRoaXMucmVjb25uZWN0aW9uKGUucmVjb25uZWN0aW9uIT09ITEpLHRoaXMucmVjb25uZWN0aW9uQXR0ZW1wdHMoZS5yZWNvbm5lY3Rpb25BdHRlbXB0c3x8MS8wKSx0aGlzLnJlY29ubmVjdGlvbkRlbGF5KGUucmVjb25uZWN0aW9uRGVsYXl8fDFlMyksdGhpcy5yZWNvbm5lY3Rpb25EZWxheU1heChlLnJlY29ubmVjdGlvbkRlbGF5TWF4fHw1ZTMpLHRoaXMucmFuZG9taXphdGlvbkZhY3RvcihlLnJhbmRvbWl6YXRpb25GYWN0b3J8fC41KSx0aGlzLmJhY2tvZmY9bmV3IGZFKHttaW46dGhpcy5yZWNvbm5lY3Rpb25EZWxheSgpLG1heDp0aGlzLnJlY29ubmVjdGlvbkRlbGF5TWF4KCksaml0dGVyOnRoaXMucmFuZG9taXphdGlvbkZhY3RvcigpfSksdGhpcy50aW1lb3V0KGUudGltZW91dD09bnVsbD8yZTQ6ZS50aW1lb3V0KSx0aGlzLl9yZWFkeVN0YXRlPSJjbG9zZWQiLHRoaXMudXJpPW47bGV0IGk9ZS5wYXJzZXJ8fHBFO3RoaXMuZW5jb2Rlcj1uZXcgaS5FbmNvZGVyLHRoaXMuZGVjb2Rlcj1uZXcgaS5EZWNvZGVyLHRoaXMuX2F1dG9Db25uZWN0PWUuYXV0b0Nvbm5lY3QhPT0hMSx0aGlzLl9hdXRvQ29ubmVjdCYmdGhpcy5vcGVuKCl9cmVjb25uZWN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9yZWNvbm5lY3Rpb249ISFuLHRoaXMpOnRoaXMuX3JlY29ubmVjdGlvbn1yZWNvbm5lY3Rpb25BdHRlbXB0cyhuKXtyZXR1cm4gbj09PXZvaWQgMD90aGlzLl9yZWNvbm5lY3Rpb25BdHRlbXB0czoodGhpcy5fcmVjb25uZWN0aW9uQXR0ZW1wdHM9bix0aGlzKX1yZWNvbm5lY3Rpb25EZWxheShuKXt2YXIgZTtyZXR1cm4gbj09PXZvaWQgMD90aGlzLl9yZWNvbm5lY3Rpb25EZWxheToodGhpcy5fcmVjb25uZWN0aW9uRGVsYXk9biwoZT10aGlzLmJhY2tvZmYpPT09bnVsbHx8ZT09PXZvaWQgMHx8ZS5zZXRNaW4obiksdGhpcyl9cmFuZG9taXphdGlvbkZhY3RvcihuKXt2YXIgZTtyZXR1cm4gbj09PXZvaWQgMD90aGlzLl9yYW5kb21pemF0aW9uRmFjdG9yOih0aGlzLl9yYW5kb21pemF0aW9uRmFjdG9yPW4sKGU9dGhpcy5iYWNrb2ZmKT09PW51bGx8fGU9PT12b2lkIDB8fGUuc2V0Sml0dGVyKG4pLHRoaXMpfXJlY29ubmVjdGlvbkRlbGF5TWF4KG4pe3ZhciBlO3JldHVybiBuPT09dm9pZCAwP3RoaXMuX3JlY29ubmVjdGlvbkRlbGF5TWF4Oih0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heD1uLChlPXRoaXMuYmFja29mZik9PT1udWxsfHxlPT09dm9pZCAwfHxlLnNldE1heChuKSx0aGlzKX10aW1lb3V0KG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl90aW1lb3V0PW4sdGhpcyk6dGhpcy5fdGltZW91dH1tYXliZVJlY29ubmVjdE9uT3BlbigpeyF0aGlzLl9yZWNvbm5lY3RpbmcmJnRoaXMuX3JlY29ubmVjdGlvbiYmdGhpcy5iYWNrb2ZmLmF0dGVtcHRzPT09MCYmdGhpcy5yZWNvbm5lY3QoKX1vcGVuKG4pe2lmKF9pKCJyZWFkeVN0YXRlICVzIix0aGlzLl9yZWFkeVN0YXRlKSx+dGhpcy5fcmVhZHlTdGF0ZS5pbmRleE9mKCJvcGVuIikpcmV0dXJuIHRoaXM7X2koIm9wZW5pbmcgJXMiLHRoaXMudXJpKSx0aGlzLmVuZ2luZT1kRSh0aGlzLnVyaSx0aGlzLm9wdHMpO2xldCBlPXRoaXMuZW5naW5lLGk9dGhpczt0aGlzLl9yZWFkeVN0YXRlPSJvcGVuaW5nIix0aGlzLnNraXBSZWNvbm5lY3Q9ITE7bGV0IGE9Rm4ub24oZSwib3BlbiIsZnVuY3Rpb24oKXtpLm9ub3BlbigpLG4mJm4oKX0pLHI9Rm4ub24oZSwiZXJyb3IiLG89PntfaSgiZXJyb3IiKSxpLmNsZWFudXAoKSxpLl9yZWFkeVN0YXRlPSJjbG9zZWQiLHN1cGVyLmVtaXQoImVycm9yIixvKSxuP24obyk6aS5tYXliZVJlY29ubmVjdE9uT3BlbigpfSk7aWYodGhpcy5fdGltZW91dCE9PSExKXtsZXQgbz10aGlzLl90aW1lb3V0O19pKCJjb25uZWN0IGF0dGVtcHQgd2lsbCB0aW1lb3V0IGFmdGVyICVkIixvKSxvPT09MCYmYSgpO2xldCBkPXNldFRpbWVvdXQoKCk9PntfaSgiY29ubmVjdCBhdHRlbXB0IHRpbWVkIG91dCBhZnRlciAlZCIsbyksYSgpLGUuY2xvc2UoKSxlLmVtaXQoImVycm9yIixuZXcgRXJyb3IoInRpbWVvdXQiKSl9LG8pO3RoaXMuc3Vicy5wdXNoKGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfSl9cmV0dXJuIHRoaXMuc3Vicy5wdXNoKGEpLHRoaXMuc3Vicy5wdXNoKHIpLHRoaXN9Y29ubmVjdChuKXtyZXR1cm4gdGhpcy5vcGVuKG4pfW9ub3Blbigpe19pKCJvcGVuIiksdGhpcy5jbGVhbnVwKCksdGhpcy5fcmVhZHlTdGF0ZT0ib3BlbiIsc3VwZXIuZW1pdCgib3BlbiIpO2xldCBuPXRoaXMuZW5naW5lO3RoaXMuc3Vicy5wdXNoKEZuLm9uKG4sInBpbmciLHRoaXMub25waW5nLmJpbmQodGhpcykpLEZuLm9uKG4sImRhdGEiLHRoaXMub25kYXRhLmJpbmQodGhpcykpLEZuLm9uKG4sImVycm9yIix0aGlzLm9uZXJyb3IuYmluZCh0aGlzKSksRm4ub24obiwiY2xvc2UiLHRoaXMub25jbG9zZS5iaW5kKHRoaXMpKSxGbi5vbih0aGlzLmRlY29kZXIsImRlY29kZWQiLHRoaXMub25kZWNvZGVkLmJpbmQodGhpcykpKX1vbnBpbmcoKXtzdXBlci5lbWl0KCJwaW5nIil9b25kYXRhKG4pe3RoaXMuZGVjb2Rlci5hZGQobil9b25kZWNvZGVkKG4pe3N1cGVyLmVtaXQoInBhY2tldCIsbil9b25lcnJvcihuKXtfaSgiZXJyb3IiLG4pLHN1cGVyLmVtaXQoImVycm9yIixuKX1zb2NrZXQobixlKXtsZXQgaT10aGlzLm5zcHNbbl07cmV0dXJuIGl8fChpPW5ldyBtRS5Tb2NrZXQodGhpcyxuLGUpLHRoaXMubnNwc1tuXT1pKSxpfV9kZXN0cm95KG4pe2xldCBlPU9iamVjdC5rZXlzKHRoaXMubnNwcyk7Zm9yKGxldCBpIG9mIGUpaWYodGhpcy5uc3BzW2ldLmFjdGl2ZSl7X2koInNvY2tldCAlcyBpcyBzdGlsbCBhY3RpdmUsIHNraXBwaW5nIGNsb3NlIixpKTtyZXR1cm59dGhpcy5fY2xvc2UoKX1fcGFja2V0KG4pe19pKCJ3cml0aW5nIHBhY2tldCAlaiIsbik7bGV0IGU9dGhpcy5lbmNvZGVyLmVuY29kZShuKTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl0aGlzLmVuZ2luZS53cml0ZShlW2ldLG4ub3B0aW9ucyl9Y2xlYW51cCgpe19pKCJjbGVhbnVwIiksdGhpcy5zdWJzLmZvckVhY2gobj0+bigpKSx0aGlzLnN1YnMubGVuZ3RoPTAsdGhpcy5kZWNvZGVyLmRlc3Ryb3koKX1fY2xvc2UoKXtfaSgiZGlzY29ubmVjdCIpLHRoaXMuc2tpcFJlY29ubmVjdD0hMCx0aGlzLl9yZWNvbm5lY3Rpbmc9ITEsdGhpcy5fcmVhZHlTdGF0ZT09PSJvcGVuaW5nIiYmdGhpcy5jbGVhbnVwKCksdGhpcy5iYWNrb2ZmLnJlc2V0KCksdGhpcy5fcmVhZHlTdGF0ZT0iY2xvc2VkIix0aGlzLmVuZ2luZSYmdGhpcy5lbmdpbmUuY2xvc2UoKX1kaXNjb25uZWN0KCl7cmV0dXJuIHRoaXMuX2Nsb3NlKCl9b25jbG9zZShuKXtfaSgib25jbG9zZSIpLHRoaXMuY2xlYW51cCgpLHRoaXMuYmFja29mZi5yZXNldCgpLHRoaXMuX3JlYWR5U3RhdGU9ImNsb3NlZCIsc3VwZXIuZW1pdCgiY2xvc2UiLG4pLHRoaXMuX3JlY29ubmVjdGlvbiYmIXRoaXMuc2tpcFJlY29ubmVjdCYmdGhpcy5yZWNvbm5lY3QoKX1yZWNvbm5lY3QoKXtpZih0aGlzLl9yZWNvbm5lY3Rpbmd8fHRoaXMuc2tpcFJlY29ubmVjdClyZXR1cm4gdGhpcztsZXQgbj10aGlzO2lmKHRoaXMuYmFja29mZi5hdHRlbXB0cz49dGhpcy5fcmVjb25uZWN0aW9uQXR0ZW1wdHMpX2koInJlY29ubmVjdCBmYWlsZWQiKSx0aGlzLmJhY2tvZmYucmVzZXQoKSxzdXBlci5lbWl0KCJyZWNvbm5lY3RfZmFpbGVkIiksdGhpcy5fcmVjb25uZWN0aW5nPSExO2Vsc2V7bGV0IGU9dGhpcy5iYWNrb2ZmLmR1cmF0aW9uKCk7X2koIndpbGwgd2FpdCAlZG1zIGJlZm9yZSByZWNvbm5lY3QgYXR0ZW1wdCIsZSksdGhpcy5fcmVjb25uZWN0aW5nPSEwO2xldCBpPXNldFRpbWVvdXQoKCk9PntuLnNraXBSZWNvbm5lY3R8fChfaSgiYXR0ZW1wdGluZyByZWNvbm5lY3QiKSxzdXBlci5lbWl0KCJyZWNvbm5lY3RfYXR0ZW1wdCIsbi5iYWNrb2ZmLmF0dGVtcHRzKSwhbi5za2lwUmVjb25uZWN0JiZuLm9wZW4oYT0+e2E/KF9pKCJyZWNvbm5lY3QgYXR0ZW1wdCBlcnJvciIpLG4uX3JlY29ubmVjdGluZz0hMSxuLnJlY29ubmVjdCgpLHN1cGVyLmVtaXQoInJlY29ubmVjdF9lcnJvciIsYSkpOihfaSgicmVjb25uZWN0IHN1Y2Nlc3MiKSxuLm9ucmVjb25uZWN0KCkpfSkpfSxlKTt0aGlzLnN1YnMucHVzaChmdW5jdGlvbigpe2NsZWFyVGltZW91dChpKX0pfX1vbnJlY29ubmVjdCgpe2xldCBuPXRoaXMuYmFja29mZi5hdHRlbXB0czt0aGlzLl9yZWNvbm5lY3Rpbmc9ITEsdGhpcy5iYWNrb2ZmLnJlc2V0KCksc3VwZXIuZW1pdCgicmVjb25uZWN0IixuKX19O2QzLk1hbmFnZXI9S2x9KTt2YXIgeHA9VGUoKG8yLHlwKT0+eyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobzIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO28yLlNvY2tldD1vMi5pbz1vMi5NYW5hZ2VyPW8yLnByb3RvY29sPXZvaWQgMDt2YXIgdUU9YmgoKSxicD1YbCgpLGdFPSRsKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG8yLCJTb2NrZXQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBnRS5Tb2NrZXR9fSk7dmFyIENwPVZyKCkoInNvY2tldC5pby1jbGllbnQiKTt5cC5leHBvcnRzPW8yPUpsO3ZhciBwND1vMi5tYW5hZ2Vycz17fTtmdW5jdGlvbiBKbCh0LG4pe3R5cGVvZiB0PT0ib2JqZWN0IiYmKG49dCx0PXZvaWQgMCksbj1ufHx7fTtsZXQgZT11RS51cmwodCxuLnBhdGgpLGk9ZS5zb3VyY2UsYT1lLmlkLHI9ZS5wYXRoLG89cDRbYV0mJnIgaW4gcDRbYV0ubnNwcyxkPW4uZm9yY2VOZXd8fG5bImZvcmNlIG5ldyBjb25uZWN0aW9uIl18fG4ubXVsdGlwbGV4PT09ITF8fG8scDtyZXR1cm4gZD8oQ3AoImlnbm9yaW5nIHNvY2tldCBjYWNoZSBmb3IgJXMiLGkpLHA9bmV3IGJwLk1hbmFnZXIoaSxuKSk6KHA0W2FdfHwoQ3AoIm5ldyBpbyBpbnN0YW5jZSBmb3IgJXMiLGkpLHA0W2FdPW5ldyBicC5NYW5hZ2VyKGksbikpLHA9cDRbYV0pLGUucXVlcnkmJiFuLnF1ZXJ5JiYobi5xdWVyeT1lLnF1ZXJ5S2V5KSxwLnNvY2tldChlLnBhdGgsbil9bzIuaW89Smw7dmFyIHZFPW8zKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG8yLCJwcm90b2NvbCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZFLnByb3RvY29sfX0pO28yLmNvbm5lY3Q9Smw7dmFyIF9FPVhsKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG8yLCJNYW5hZ2VyIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gX0UuTWFuYWdlcn19KX0pO3ZhciBmNCxqWCxNcD14KCgpPT57ZjQ9ZHIoeHAoKSwxKSxqWD1mNC5kZWZhdWx0Lk1hbmFnZXJ9KTt2YXIgamksWGE9eCgoKT0+e050KCk7aygpO01wKCk7aygpO2ppPSgoKT0+e2NsYXNzIHR7bmdab25lPWgocmUpO19zb2NrZXQ7Y29uc3RydWN0b3IoKXt0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e3VlLmhvc3RTZXJ2ZXI9PT0iLiI/dGhpcy5fc29ja2V0PSgwLGY0LmRlZmF1bHQpKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4se3BhdGg6KHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5lbmRzV2l0aCgiLyIpP3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTp3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUrIi8iKSsic29ja2V0LmlvIn0pOnRoaXMuX3NvY2tldD0oMCxmNC5kZWZhdWx0KSh1ZS5ob3N0U2VydmVyKX0pfXNvY2tldCgpe3JldHVybiB0aGlzLl9zb2NrZXR9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBDRSh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiZGl2Iiw1KSgxLCJidXR0b24iLDcpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpLiRpbXBsaWNpdCxyPXYoKTtyZXR1cm4gVChyLm5hdmlnYXRlVG9DaGFsbGVuZ2UoYS5rZXkpKX0pLGMoMiwibWF0LWljb24iKSxtKDMsImNvZGUiKSxzKCksYyg0LCJzcGFuIiksbSg1KSxiKDYsInRyYW5zbGF0ZSIpLHMoKSgpKCl9dCYyJiYobCg1KSxBKEMoNiwxLCJKVU1QX1RPX1JFTEFURURfQ09ESU5HX0NIQUxMRU5HRSIpKSl9ZnVuY3Rpb24geUUodCxuKXtpZih0JjEmJih1KDAsInNwYW4iKSxiKDEsImxvd2VyY2FzZSIpKSx0JjIpe2xldCBlPXYoMykuJGltcGxpY2l0O0R0KFcyKCJmaSBmaS0iLEMoMSwzLGUuY291bnRyeS5jb2RlKSkpfX1mdW5jdGlvbiB4RSh0LG4pe3QmMSYmKGMoMCwibWF0LWljb24iKSxtKDEsIm15X2xvY2F0aW9uIikscygpKX1mdW5jdGlvbiBNRSh0LG4pe2lmKHQmMSYmKGMoMCwic3BhbiIpLG0oMSkscygpKSx0JjIpe2xldCBlPXYoMykuJGltcGxpY2l0O2woKSxBKGUuY291bnRyeS5uYW1lKX19ZnVuY3Rpb24gd0UodCxuKXtpZih0JjEmJihjKDAsInNwYW4iLDkpLE0oMSx5RSwyLDUsInNwYW4iLDEwKSxNKDIseEUsMiwwLCJtYXQtaWNvbiIpLE0oMyxNRSwyLDEsInNwYW4iKSxzKCkpLHQmMil7bGV0IGU9digzKTtsKCksdyhlLnNob3dDdGZDb3VudHJ5RGV0YWlsc0luTm90aWZpY2F0aW9ucz09PSJmbGFnInx8ZS5zaG93Q3RmQ291bnRyeURldGFpbHNJbk5vdGlmaWNhdGlvbnM9PT0iYm90aCI/MTotMSksbCgpLHcoZS5zaG93Q3RmQ291bnRyeURldGFpbHNJbk5vdGlmaWNhdGlvbnM9PT0ibmFtZSI/MjotMSksbCgpLHcoZS5zaG93Q3RmQ291bnRyeURldGFpbHNJbk5vdGlmaWNhdGlvbnM9PT0ibmFtZSJ8fGUuc2hvd0N0ZkNvdW50cnlEZXRhaWxzSW5Ob3RpZmljYXRpb25zPT09ImJvdGgiPzM6LTEpfX1mdW5jdGlvbiBTRSh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO3UoMCwiYnIiKSxjKDEsImRpdiIpKDIsInNwYW4iLDgpLGIoMywidHJhbnNsYXRlIiksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCkuJGltcGxpY2l0LHI9digpO3JldHVybiBUKHIuY29weVRvQ2xpcGJvYXJkKGEuZmxhZykpfSksYyg0LCJtYXQtaWNvbiIpLG0oNSwib3V0bGluZWRfZmxhZyIpLHMoKSxtKDYpLHMoKSx1KDcsImJyIiksTSg4LHdFLDQsMywic3BhbiIsOSkscygpfWlmKHQmMil7bGV0IGU9digpLiRpbXBsaWNpdCxpPXYoKTtsKDIpLGYoIm1hdFRvb2x0aXAiLEMoMywzLCJDT1BZX1RPX0NMSVBCT0FSRCIpKSxsKDQpLEUoIiAiLGUuZmxhZywiICIpLGwoMiksdyhpLnNob3dDdGZDb3VudHJ5RGV0YWlsc0luTm90aWZpY2F0aW9ucyE9PSJub25lIj84Oi0xKX19ZnVuY3Rpb24ga0UodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsIm1hdC1jYXJkIiwxKSgxLCJkaXYiLDIpKDIsImRpdiIsMykoMywiZGl2Iiw0KSxtKDQpLE0oNSxDRSw3LDMsImRpdiIsNSkscygpLGMoNiwiYnV0dG9uIiw2KSxTKCJjbGljayIsZnVuY3Rpb24oYSl7bGV0IHI9eihlKS4kaW5kZXgsbz12KCk7cmV0dXJuIFQoby5jbG9zZU5vdGlmaWNhdGlvbihyLGEuc2hpZnRLZXkpKX0pLG0oNywiWCIpLHMoKSgpLE0oOCxTRSw5LDUpLHMoKSgpfWlmKHQmMil7bGV0IGU9bi4kaW1wbGljaXQsaT12KCk7bCg0KSxFKCIiLGUubWVzc2FnZSwiICIpLGwoKSx3KGUuY29kaW5nQ2hhbGxlbmdlPzU6LTEpLGwoMyksdyhpLnNob3dDdGZGbGFnc0luTm90aWZpY2F0aW9ucz84Oi0xKX19dmFyIGJFLHdwLFNwPXgoKCk9PntXKCk7d2EoKTtLMSgpO2soKTt3aSgpO3BoKCk7WGEoKTt2ZSgpO25lKCk7aGUoKTthMSgpO1h0KCk7SjEoKTtwMSgpO2soKTtoZSgpO25lKCk7dmUoKTtXKCk7YkU9KHQsbik9Pm4ua2V5O3dwPSgoKT0+e2NsYXNzIHR7bmdab25lPWgocmUpO2NvbmZpZ3VyYXRpb25TZXJ2aWNlPWgoTHQpO2NoYWxsZW5nZVNlcnZpY2U9aChTaSk7Y291bnRyeU1hcHBpbmdTZXJ2aWNlPWgoaGgpO3RyYW5zbGF0ZT1oKEl0KTtjb29raWVTZXJ2aWNlPWgoWnQpO3JlZj1oKEVlKTtpbz1oKGppKTtzbmFja0JhckhlbHBlclNlcnZpY2U9aChWdCk7cm91dGVyPWgoeXQpO25vdGlmaWNhdGlvbnM9W107c2hvd0N0ZkZsYWdzSW5Ob3RpZmljYXRpb25zPSExO3Nob3dDdGZDb3VudHJ5RGV0YWlsc0luTm90aWZpY2F0aW9ucz0ibm9uZSI7Y291bnRyeU1hcDtjb2RpbmdDaGFsbGVuZ2VzRW5hYmxlZD0ic29sdmVkIjtuZ09uSW5pdCgpe3RoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57dGhpcy5pby5zb2NrZXQoKS5vbigiY2hhbGxlbmdlIHNvbHZlZCIsZT0+e2U/LmNoYWxsZW5nZSYmKGUuaGlkZGVufHx0aGlzLnNob3dOb3RpZmljYXRpb24oZSksZS5pc1Jlc3RvcmV8fCh0aGlzLnNhdmVQcm9ncmVzcygpLGUuaGlkZGVufHxpbXBvcnQoIi4vY29uZmV0dGktNU5XNjdVR1kuanMiKS50aGVuKGk9PntpLnNob290Q29uZmV0dGkoKX0pKSx0aGlzLmlvLnNvY2tldCgpLmVtaXQoIm5vdGlmaWNhdGlvbiByZWNlaXZlZCIsZS5mbGFnKSl9KX0pLHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0QXBwbGljYXRpb25Db25maWd1cmF0aW9uKCkuc3Vic2NyaWJlKGU9PntlPy5jdGYmJihlLmN0Zi5zaG93RmxhZ3NJbk5vdGlmaWNhdGlvbnM/dGhpcy5zaG93Q3RmRmxhZ3NJbk5vdGlmaWNhdGlvbnM9ZS5jdGYuc2hvd0ZsYWdzSW5Ob3RpZmljYXRpb25zOnRoaXMuc2hvd0N0ZkZsYWdzSW5Ob3RpZmljYXRpb25zPSExLGUuY3RmLnNob3dDb3VudHJ5RGV0YWlsc0luTm90aWZpY2F0aW9ucz8odGhpcy5zaG93Q3RmQ291bnRyeURldGFpbHNJbk5vdGlmaWNhdGlvbnM9ZS5jdGYuc2hvd0NvdW50cnlEZXRhaWxzSW5Ob3RpZmljYXRpb25zLGUuY3RmLnNob3dDb3VudHJ5RGV0YWlsc0luTm90aWZpY2F0aW9ucyE9PSJub25lIiYmdGhpcy5jb3VudHJ5TWFwcGluZ1NlcnZpY2UuZ2V0Q291bnRyeU1hcHBpbmcoKS5zdWJzY3JpYmUoe25leHQ6aT0+e3RoaXMuY291bnRyeU1hcD1pfSxlcnJvcjppPT57Y29uc29sZS5sb2coaSl9fSkpOnRoaXMuc2hvd0N0ZkNvdW50cnlEZXRhaWxzSW5Ob3RpZmljYXRpb25zPSJub25lIil9KX1jbG9zZU5vdGlmaWNhdGlvbihlLGk9ITEpe2k/KHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57dGhpcy5pby5zb2NrZXQoKS5lbWl0KCJ2ZXJpZnlDbG9zZU5vdGlmaWNhdGlvbnNDaGFsbGVuZ2UiLHRoaXMubm90aWZpY2F0aW9ucyl9KSx0aGlzLm5vdGlmaWNhdGlvbnM9W10pOnRoaXMubm90aWZpY2F0aW9ucy5zcGxpY2UoZSwxKSx0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCl9c2hvd05vdGlmaWNhdGlvbihlKXtrbih0aGlzLnRyYW5zbGF0ZS5nZXQoIkNIQUxMRU5HRV9TT0xWRUQiLHtjaGFsbGVuZ2U6ZS5jaGFsbGVuZ2V9KSkudGhlbihpPT57bGV0IGE7dGhpcy5zaG93Q3RmQ291bnRyeURldGFpbHNJbk5vdGlmaWNhdGlvbnMmJnRoaXMuc2hvd0N0ZkNvdW50cnlEZXRhaWxzSW5Ob3RpZmljYXRpb25zIT09Im5vbmUiJiYoYT10aGlzLmNvdW50cnlNYXBbZS5rZXldKSx0aGlzLm5vdGlmaWNhdGlvbnMucHVzaCh7bWVzc2FnZTppLGtleTplLmtleSxmbGFnOmUuZmxhZyxjb3VudHJ5OmEsY29waWVkOiExLGNvZGluZ0NoYWxsZW5nZTplLmNvZGluZ0NoYWxsZW5nZT8/ITF9KSx0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCl9KX1zYXZlUHJvZ3Jlc3MoKXt0aGlzLmNoYWxsZW5nZVNlcnZpY2UuY29udGludWVDb2RlKCkuc3Vic2NyaWJlKHtuZXh0OmU9PntpZighZSl0aHJvdyBuZXcgRXJyb3IoIlJlY2VpdmVkIGludmFsaWQgY29udGludWUgY29kZSBmcm9tIHRoZSBzZXJ2ZXIhIik7bGV0IGk9bmV3IERhdGU7aS5zZXRGdWxsWWVhcihpLmdldEZ1bGxZZWFyKCkrMSksdGhpcy5jb29raWVTZXJ2aWNlLnB1dCgiY29udGludWVDb2RlIixlLHtleHBpcmVzOml9KX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfWNvcHlUb0NsaXBib2FyZChlKXtuYXZpZ2F0b3IuY2xpcGJvYXJkJiZuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChlKS50aGVuKCgpPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbigiQ09QWV9TVUNDRVNTIiwiY29uZmlybUJhciIpfSl9bmF2aWdhdGVUb0NoYWxsZW5nZShlKXtlJiZ0aGlzLm5nWm9uZS5ydW4oKCk9Pnt0aGlzLnJvdXRlci5uYXZpZ2F0ZShbIi9zY29yZS1ib2FyZCJdLHtxdWVyeVBhcmFtczp7aGlnaGxpZ2h0Q2hhbGxlbmdlOmV9fSl9KX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtY2hhbGxlbmdlLXNvbHZlZC1ub3RpZmljYXRpb24iXV0sZGVjbHM6Myx2YXJzOjAsY29uc3RzOltbMSwiY29udGFpbmVyIiwiY2hhbGxlbmdlLXNvbHZlZC10b2FzdCIsIm1hdC1lbGV2YXRpb24tejQiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwiYWNjZW50LW5vdGlmaWNhdGlvbiJdLFsxLCJtZGMtY2FyZCJdLFsxLCJub3RpZmljYXRpb25NZXNzYWdlIl0sWzEsImNvbnRlbnRzIl0sWzEsIm5vdGlmaWNhdGlvbi1hY3Rpb25zIl0sWyJpZCIsImNsb3NlQnV0dG9uIiwibWF0LWJ1dHRvbiIsIiIsMywiY2xpY2siXSxbIm1hdC1zdHJva2VkLWJ1dHRvbiIsIiIsMSwidmlldy1jaGFsbGVuZ2UtYnV0dG9uIiwzLCJjbGljayJdLFsxLCJpY29uLWJveCIsImZsYWctYm94IiwzLCJjbGljayIsIm1hdFRvb2x0aXAiXSxbMSwiaWNvbi1ib3giXSxbMywiY2xhc3MiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsImRpdiIsMCkscWUoMSxrRSw5LDMsIm1hdC1jYXJkIiwxLGJFKSxzKCkpLGkmMiYmKGwoKSxHZShhLm5vdGlmaWNhdGlvbnMpKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxvZSxsZSxnZSxDZSxZLFhkLEtdLHN0eWxlczpbYC5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O21hcmdpbjoyLjVyZW19bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206LjYyNXJlbX1tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV0gICAubm90aWZpY2F0aW9uTWVzc2FnZVtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0jY2xvc2VCdXR0b25bX25nY29udGVudC0lQ09NUCVde2Zsb2F0OnJpZ2h0fS5pY29uLWJveFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtZmxleDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZsYWctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjRweDtjdXJzb3I6Y29weTtwYWRkaW5nOi4xMjVyZW0gLjI1cmVtO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMnMgZWFzZX0uZmxhZy1ib3hbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzAwMDAwMDFhfS5jb250ZW50c1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6LjI1cmVtO2p1c3RpZnktY29udGVudDpzcGFjZS1hcm91bmR9LnZpZXctY2hhbGxlbmdlLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tkcm9wLWZpbHRlcjpzYXR1cmF0ZSgxLjEpO2JvcmRlcjozcHggc29saWQ7Ym9yZGVyLXJhZGl1czo0cHg7Y29sb3I6aW5oZXJpdDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjUwMDtnYXA6LjEyNXJlbTtoZWlnaHQ6MzJweDtsZXR0ZXItc3BhY2luZzpub3JtYWw7cGFkZGluZzowIC42MjVyZW07dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xNXMgZWFzZX0udmlldy1jaGFsbGVuZ2UtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweDtoZWlnaHQ6MThweDt3aWR0aDoxOHB4fS52aWV3LWNoYWxsZW5nZS1idXR0b25bX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2QzZDNkMzBhO2JveC1zaGFkb3c6bm9uZX0udmlldy1jaGFsbGVuZ2UtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmV7dHJhbnNmb3JtOm5vbmV9CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO3ZhciBrcCx6cD14KCgpPT57aygpO1d0KCk7aygpO2twPSgoKT0+e2NsYXNzIHR7aHR0cD1oKEFlKTtmZXRjaE5vdGlmaWNhdGlvbihlKXtyZXR1cm4gdGhpcy5odHRwLmdldChlKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIHpFKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJkaXYiLDApKDEsIm1hdC1jYXJkIiwxKSgyLCJkaXYiLDIpKDMsImRpdiIsMykoNCwiZGl2Iiw0KSxtKDUpLHMoKSxjKDYsImJ1dHRvbiIsNSksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5kaXNtaXNzKCkpfSksbSg3LCJYIikscygpKCkoKSgpKCl9aWYodCYyKXtsZXQgZT12KCk7bCg1KSxBKGUubm90aWZpY2F0aW9uLm1lc3NhZ2UpfX12YXIgVHAsRXA9eCgoKT0+e2soKTtYdCgpO2x0KCk7SzEoKTt6cCgpO25lKCk7aGUoKTtrKCk7aGUoKTtuZSgpO1RwPSgoKT0+e2NsYXNzIHR7Y29uZmlndXJhdGlvblNlcnZpY2U9aChMdCk7bm90aWZpY2F0aW9uU2VydmljZT1oKGtwKTtyZWY9aChFZSk7bm90aWZpY2F0aW9uPW51bGw7ZGlzbWlzc2VkQXQ9bnVsbDtzdWJzY3JpcHRpb249bnVsbDtuZ09uSW5pdCgpe3RoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0QXBwbGljYXRpb25Db25maWd1cmF0aW9uKCkuc3Vic2NyaWJlKGU9PntsZXQgaT1lPy5jdGY/LnN5c3RlbVdpZGVOb3RpZmljYXRpb25zPy51cmwsYT1lPy5jdGY/LnN5c3RlbVdpZGVOb3RpZmljYXRpb25zPy5wb2xsRnJlcXVlbmN5U2Vjb25kczshaXx8IWF8fCh0aGlzLnN1YnNjcmlwdGlvbj1FZChhKjFlMykucGlwZShpMSgwKSxxMSgoKT0+dGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmZldGNoTm90aWZpY2F0aW9uKGkpLnBpcGUoaigoKT0+YzEobnVsbCkpKSkpLnN1YnNjcmliZShyPT57cj8uZW5hYmxlZCYmci5tZXNzYWdlJiZyLnVwZGF0ZWRBdCE9PXRoaXMuZGlzbWlzc2VkQXQ/dGhpcy5ub3RpZmljYXRpb249cjp0aGlzLm5vdGlmaWNhdGlvbj1udWxsLHRoaXMucmVmLmRldGVjdENoYW5nZXMoKX0pKX0pfW5nT25EZXN0cm95KCl7dGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCl9ZGlzbWlzcygpe3RoaXMubm90aWZpY2F0aW9uJiYodGhpcy5kaXNtaXNzZWRBdD10aGlzLm5vdGlmaWNhdGlvbi51cGRhdGVkQXQsdGhpcy5ub3RpZmljYXRpb249bnVsbCx0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1jdGYtc3lzdGVtLXdpZGUtbm90aWZpY2F0aW9uIl1dLGRlY2xzOjEsdmFyczoxLGNvbnN0czpbWzEsImNvbnRhaW5lciIsImN0Zi1zeXN0ZW0tbm90aWZpY2F0aW9uIiwibWF0LWVsZXZhdGlvbi16NCJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJwcmltYXJ5LW5vdGlmaWNhdGlvbiJdLFsxLCJtZGMtY2FyZCJdLFsxLCJub3RpZmljYXRpb25NZXNzYWdlIl0sWzEsImNvbnRlbnRzIl0sWyJpZCIsImNsb3NlQnV0dG9uIiwibWF0LWJ1dHRvbiIsIiIsMywiY2xpY2siXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJk0oMCx6RSw4LDEsImRpdiIsMCksaSYyJiZ3KGEubm90aWZpY2F0aW9uPzA6LTEpfSxkZXBlbmRlbmNpZXM6W2RlLHBlLG9lLGxlXSxzdHlsZXM6W2AuY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDttYXJnaW46Mi41cmVtfW1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOi42MjVyZW19bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm5vdGlmaWNhdGlvbk1lc3NhZ2VbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59I2Nsb3NlQnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmbG9hdDpyaWdodH0uY29udGVudHNbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOi4yNXJlbTtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYXJvdW5kfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBURSh0LG4pe3QmMSYmKGMoMCwic3BhbiIsMSksbSgxLCJSRVNUQVJUX1JFUVVJUkVEIikscygpKX1mdW5jdGlvbiBFRSh0LG4pe3QmMSYmKGMoMCwic3BhbiIsMSksbSgxLCJSRVNFVF9IQUNLSU5HX1BST0dSRVNTIikscygpKX1mdW5jdGlvbiBBRSh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwibWF0LWNhcmQiLDApKDEsIm1hdC1jYXJkLWNvbnRlbnQiKSgyLCJzcGFuIiwxKSxtKDMsIk5PVElGSUNBVElPTl9TRVJWRVJfU1RBUlRFRCIpLHMoKSxtKDQpLGMoNSwiYnV0dG9uIiwyKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLmNsb3NlTm90aWZpY2F0aW9uKCkpfSksbSg2LCJYIikscygpLGMoNywiYnV0dG9uIiwzKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLmNsZWFyUHJvZ3Jlc3MoKSl9KSxjKDgsIm1hdC1pY29uIiksbSg5LCJkZWxldGVfZm9yZXZlciIpLHMoKSxNKDEwLFRFLDIsMCwic3BhbiIsMSkoMTEsRUUsMiwwLCJzcGFuIiwxKSxzKCkoKSgpfWlmKHQmMil7bGV0IGU9digpO2woNCksRSgiOiAiLGUuaGFja2luZ1Byb2dyZXNzLmF1dG9SZXN0b3JlTWVzc2FnZSwiXHhBMCIpLGwoMyksZigiZGlzYWJsZWQiLGUuaGFja2luZ1Byb2dyZXNzLmNsZWFyZWQpLGwoMyksdyhlLmhhY2tpbmdQcm9ncmVzcy5jbGVhcmVkPzEwOjExKX19dmFyIEFwLERwPXgoKCk9PntXKCk7d2EoKTtrKCk7d2koKTtYYSgpO3ZlKCk7bmUoKTtoZSgpO2soKTtoZSgpO1coKTtuZSgpO3ZlKCk7QXA9KCgpPT57Y2xhc3MgdHtuZ1pvbmU9aChyZSk7Y2hhbGxlbmdlU2VydmljZT1oKFNpKTt0cmFuc2xhdGU9aChJdCk7Y29va2llU2VydmljZT1oKFp0KTtyZWY9aChFZSk7aW89aChqaSk7aGFja2luZ1Byb2dyZXNzPXt9O25nT25Jbml0KCl7dGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLmlvLnNvY2tldCgpLm9uKCJzZXJ2ZXIgc3RhcnRlZCIsKCk9PntsZXQgZT10aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCJjb250aW51ZUNvZGUiKSxpPXRoaXMuY29va2llU2VydmljZS5nZXQoImNvbnRpbnVlQ29kZUZpbmRJdCIpLGE9dGhpcy5jb29raWVTZXJ2aWNlLmdldCgiY29udGludWVDb2RlRml4SXQiKTtlJiZ0aGlzLmNoYWxsZW5nZVNlcnZpY2UucmVzdG9yZVByb2dyZXNzKGVuY29kZVVSSUNvbXBvbmVudChlKSkuc3Vic2NyaWJlKHtuZXh0OigpPT57dGhpcy50cmFuc2xhdGUuZ2V0KCJBVVRPX1JFU1RPUkVEX1BST0dSRVNTIikuc3Vic2NyaWJlKHtuZXh0OnI9Pnt0aGlzLmhhY2tpbmdQcm9ncmVzcy5hdXRvUmVzdG9yZU1lc3NhZ2U9cn0sZXJyb3I6cj0+e3RoaXMuaGFja2luZ1Byb2dyZXNzLmF1dG9SZXN0b3JlTWVzc2FnZT1yfX0pfSxlcnJvcjpyPT57Y29uc29sZS5sb2cociksdGhpcy50cmFuc2xhdGUuZ2V0KCJBVVRPX1JFU1RPUkVfUFJPR1JFU1NfRkFJTEVEIix7ZXJyb3I6cn0pLnN1YnNjcmliZSh7bmV4dDpvPT57dGhpcy5oYWNraW5nUHJvZ3Jlc3MuYXV0b1Jlc3RvcmVNZXNzYWdlPW99LGVycm9yOm89Pnt0aGlzLmhhY2tpbmdQcm9ncmVzcy5hdXRvUmVzdG9yZU1lc3NhZ2U9b319KX19KSxpJiZ0aGlzLmNoYWxsZW5nZVNlcnZpY2UucmVzdG9yZVByb2dyZXNzRmluZEl0KGVuY29kZVVSSUNvbXBvbmVudChpKSkuc3Vic2NyaWJlKHtuZXh0OigpPT57fSxlcnJvcjpyPT57Y29uc29sZS5sb2cocil9fSksYSYmdGhpcy5jaGFsbGVuZ2VTZXJ2aWNlLnJlc3RvcmVQcm9ncmVzc0ZpeEl0KGVuY29kZVVSSUNvbXBvbmVudChhKSkuc3Vic2NyaWJlKHtuZXh0OigpPT57fSxlcnJvcjpyPT57Y29uc29sZS5sb2cocil9fSksdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpfSl9KX1jbG9zZU5vdGlmaWNhdGlvbigpe3RoaXMuaGFja2luZ1Byb2dyZXNzLmF1dG9SZXN0b3JlTWVzc2FnZT1udWxsfWNsZWFyUHJvZ3Jlc3MoKXt0aGlzLmNvb2tpZVNlcnZpY2UucmVtb3ZlKCJjb250aW51ZUNvZGUiKSx0aGlzLmNvb2tpZVNlcnZpY2UucmVtb3ZlKCJjb250aW51ZUNvZGVGaXhJdCIpLHRoaXMuY29va2llU2VydmljZS5yZW1vdmUoImNvbnRpbnVlQ29kZUZpbmRJdCIpLHRoaXMuY29va2llU2VydmljZS5yZW1vdmUoInRva2VuIiksc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgiYmlkIiksc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgiaXRlbVRvdGFsIiksbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oInRva2VuIiksbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImRpc3BsYXllZERpZmZpY3VsdGllcyIpLGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJzaG93U29sdmVkQ2hhbGxlbmdlcyIpLGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJzaG93RGlzYWJsZWRDaGFsbGVuZ2VzIiksbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oInNob3dPbmx5VHV0b3JpYWxDaGFsbGVuZ2VzIiksbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImRpc3BsYXllZENoYWxsZW5nZUNhdGVnb3JpZXMiKSx0aGlzLmhhY2tpbmdQcm9ncmVzcy5jbGVhcmVkPSEwfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1zZXJ2ZXItc3RhcnRlZC1ub3RpZmljYXRpb24iXV0sZGVjbHM6MSx2YXJzOjEsY29uc3RzOltbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwiY29udGFpbmVyIiwicHJpbWFyeS1ub3RpZmljYXRpb24iLCJtYXQtZWxldmF0aW9uLXo0Il0sWyJ0cmFuc2xhdGUiLCIiXSxbImlkIiwiY2xvc2VCdXR0b24iLCJtYXQtYnV0dG9uIiwiIiwzLCJjbGljayJdLFsibWF0LXN0cm9rZWQtYnV0dG9uIiwiIiwzLCJjbGljayIsImRpc2FibGVkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiZNKDAsQUUsMTIsMywibWF0LWNhcmQiLDApLGkmMiYmdyhhLmhhY2tpbmdQcm9ncmVzcy5hdXRvUmVzdG9yZU1lc3NhZ2U/MDotMSl9LGRlcGVuZGVuY2llczpbZGUscGUscDIsWSxTZSxvZSxsZSxnZSxDZV0sc3R5bGVzOltgLmNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7bWFyZ2luOjIuNXJlbX0jY2xvc2VCdXR0b25bX25nY29udGVudC0lQ09NUCVde2Zsb2F0OnJpZ2h0fQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgQXQsRjE9eCgoKT0+e050KCk7aygpO1d0KCk7bHQoKTtYdCgpO2soKTtBdD0oKCk9PntjbGFzcyB0e2h0dHA9aChBZSk7aXNMb2dnZWRJbj1uZXcgd2U7aG9zdFNlcnZlcj11ZS5ob3N0U2VydmVyO2hvc3Q9dGhpcy5ob3N0U2VydmVyKyIvYXBpL1VzZXJzIjtmaW5kKGUpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaG9zdFNlcnZlcisiL3Jlc3QvdXNlci9hdXRoZW50aWNhdGlvbi1kZXRhaWxzLyIse3BhcmFtczplfSkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1nZXQoZSl7cmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5ob3N0fS8ke2V9YCkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1zYXZlKGUpe3JldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLmhvc3QrIi8iLGUpLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9bG9naW4oZSl7cmV0dXJuIHRoaXMuaXNMb2dnZWRJbi5uZXh0KCEwKSx0aGlzLmh0dHAucG9zdCh0aGlzLmhvc3RTZXJ2ZXIrIi9yZXN0L3VzZXIvbG9naW4iLGUpLnBpcGUocShpPT5pLmF1dGhlbnRpY2F0aW9uKSxqKGk9Pnt0aHJvdyBpfSkpfWdldExvZ2dlZEluU3RhdGUoKXtyZXR1cm4gdGhpcy5pc0xvZ2dlZEluLmFzT2JzZXJ2YWJsZSgpfWNoYW5nZVBhc3N3b3JkKGUpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaG9zdFNlcnZlcisiL3Jlc3QvdXNlci9jaGFuZ2UtcGFzc3dvcmQ/Y3VycmVudD0iK2UuY3VycmVudCsiJm5ldz0iK2UubmV3KyImcmVwZWF0PSIrZS5yZXBlYXQpLnBpcGUocShpPT5pLnVzZXIpLGooaT0+e3Rocm93IGkuZXJyb3J9KSl9cmVzZXRQYXNzd29yZChlKXtyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5ob3N0U2VydmVyKyIvcmVzdC91c2VyL3Jlc2V0LXBhc3N3b3JkIixlKS5waXBlKHEoaT0+aS51c2VyKSxqKGk9Pnt0aHJvdyBpfSkpfXdob0FtSShlKXtsZXQgaT1lJiZlLmxlbmd0aD4wP2A/ZmllbGRzPSR7ZS5qb2luKCIsIil9YDoiIjtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmhvc3RTZXJ2ZXIrIi9yZXN0L3VzZXIvd2hvYW1pIitpKS5waXBlKHEoYT0+YS51c2VyKSxqKGE9Pnt0aHJvdyBhfSkpfW9hdXRoTG9naW4oZSl7cmV0dXJuIHRoaXMuaHR0cC5nZXQoImh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92MS91c2VyaW5mbz9hbHQ9anNvbiZhY2Nlc3NfdG9rZW49IitlKX1zYXZlTGFzdExvZ2luSXAoKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmhvc3RTZXJ2ZXIrIi9yZXN0L3NhdmVMb2dpbklwIikucGlwZShxKGU9PmUpLGooZT0+e3Rocm93IGV9KSl9ZGVsdXhlU3RhdHVzKCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0U2VydmVyKyIvcmVzdC9kZWx1eGUtbWVtYmVyc2hpcCIpLnBpcGUocShlPT5lLmRhdGEpLGooZT0+e3Rocm93IGV9KSl9dXBncmFkZVRvRGVsdXhlKGUsaSl7cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuaG9zdFNlcnZlcisiL3Jlc3QvZGVsdXhlLW1lbWJlcnNoaXAiLHtwYXltZW50TW9kZTplLHBheW1lbnRJZDppfSkucGlwZShxKGE9PmEuZGF0YSksaihhPT57dGhyb3cgYX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO3ZhciBCcixtMz14KCgpPT57TnQoKTtXdCgpO2soKTtsdCgpO2soKTtCcj0oKCk9PntjbGFzcyB0e2h0dHA9aChBZSk7aG9zdFNlcnZlcj11ZS5ob3N0U2VydmVyO2hvc3Q9dGhpcy5ob3N0U2VydmVyKyIvcmVzdC9hZG1pbiI7Z2V0QXBwbGljYXRpb25WZXJzaW9uKCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0KyIvYXBwbGljYXRpb24tdmVyc2lvbiIpLnBpcGUocShlPT5lLnZlcnNpb24pLGooZT0+e3Rocm93IGV9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTt2YXIgSXAsTHA9eCgoKT0+e2soKTtOdCgpO1d0KCk7bHQoKTtrKCk7SXA9KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtnZXRMYW5ndWFnZXMoKXtyZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmhvc3RTZXJ2ZXJ9L3Jlc3QvbGFuZ3VhZ2VzYCkucGlwZShqKGU9Pnt0aHJvdyBlfSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIHR9KSgpfSk7dmFyIGVpLGFhPXgoKCk9PntOdCgpO2soKTtXdCgpO2x0KCk7WHQoKTtrKCk7ZWk9KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtpdGVtVG90YWw9bmV3IHdlO2hvc3Q9dGhpcy5ob3N0U2VydmVyKyIvYXBpL0Jhc2tldEl0ZW1zIjtmaW5kKGUpe3JldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuaG9zdFNlcnZlcn0vcmVzdC9iYXNrZXQvJHtlfWApLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9Z2V0KGUpe3JldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuaG9zdH0vJHtlfWApLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9cHV0KGUsaSl7cmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5ob3N0fS8ke2V9YCxpKS5waXBlKHEoYT0+YS5kYXRhKSxqKGE9Pnt0aHJvdyBhfSkpfWRlbChlKXtyZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShgJHt0aGlzLmhvc3R9LyR7ZX1gKS5waXBlKHEoaT0+aS5kYXRhKSxqKGk9Pnt0aHJvdyBpfSkpfXNhdmUoZSl7cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuaG9zdCsiLyIsZSkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1jaGVja291dChlLGksYSl7cmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuaG9zdFNlcnZlcn0vcmVzdC9iYXNrZXQvJHtlfS9jaGVja291dGAse2NvdXBvbkRhdGE6aSxvcmRlckRldGFpbHM6YX0pLnBpcGUocShyPT5yLm9yZGVyQ29uZmlybWF0aW9uKSxqKHI9Pnt0aHJvdyByfSkpfWFwcGx5Q291cG9uKGUsaSl7cmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5ob3N0U2VydmVyfS9yZXN0L2Jhc2tldC8ke2V9L2NvdXBvbi8ke2l9YCx7fSkucGlwZShxKGE9PmEuZGlzY291bnQpLGooYT0+e3Rocm93IGF9KSl9dXBkYXRlTnVtYmVyT2ZDYXJ0SXRlbXMoKXt0aGlzLmZpbmQocGFyc2VJbnQoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiYmlkIiksMTApKS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMuaXRlbVRvdGFsLm5leHQoZS5Qcm9kdWN0cy5yZWR1Y2UoKGksYSk9PmkrYS5CYXNrZXRJdGVtLnF1YW50aXR5LDApKX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfWdldEl0ZW1Ub3RhbCgpe3JldHVybiB0aGlzLml0ZW1Ub3RhbC5hc09ic2VydmFibGUoKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO3ZhciBQcCxKYSxWcCxVcixoMyxPcCxIcCxOcCxScCxGcCxCcCxVcCxqcCxqcixxcCxHcCxXcCxRcCxZcCxacCxwMywkcCxLcCxYcCxKcCxlZixmMyxuYSx0ZixhZixuZixxcixyZixvZixjZixzZixsZix1MyxkZixtZixoZixwZixmZix1ZixnZixnMyx2ZixfZixiZix2MyxDZix5Zix4ZixfMyxNZix3ZixTZixrZix6ZixUZixFZixyMT14KCgpPT57UHA9e3ByZWZpeDoiZmFzIixpY29uTmFtZToiYXJjaGl2ZSIsaWNvbjpbNTEyLDUxMixbXSwiZjE4NyIsIk0zMiA0NDhjMCAxNy43IDE0LjMgMzIgMzIgMzJoMzg0YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjE2MEgzMnYyODh6bTE2MC0yMTJjMC02LjYgNS40LTEyIDEyLTEyaDEwNGM2LjYgMCAxMiA1LjQgMTIgMTJ2OGMwIDYuNi01LjQgMTItMTIgMTJIMjA0Yy02LjYgMC0xMi01LjQtMTItMTJ2LTh6TTQ4MCAzMkgzMkMxNC4zIDMyIDAgNDYuMyAwIDY0djQ4YzAgOC44IDcuMiAxNiAxNiAxNmg0ODBjOC44IDAgMTYtNy4yIDE2LTE2VjY0YzAtMTcuNy0xNC4zLTMyLTMyLTMyeiJdfSxKYT17cHJlZml4OiJmYXMiLGljb25OYW1lOiJhcnJvdy1jaXJjbGUtbGVmdCIsaWNvbjpbNTEyLDUxMixbXSwiZjBhOCIsIk0yNTYgNTA0QzExOSA1MDQgOCAzOTMgOCAyNTZTMTE5IDggMjU2IDhzMjQ4IDExMSAyNDggMjQ4LTExMSAyNDgtMjQ4IDI0OHptMjguOS0xNDMuNkwyMDkuNCAyODhIMzkyYzEzLjMgMCAyNC0xMC43IDI0LTI0di0xNmMwLTEzLjMtMTAuNy0yNC0yNC0yNEgyMDkuNGw3NS41LTcyLjRjOS43LTkuMyA5LjktMjQuOC40LTM0LjNsLTExLTEwLjljLTkuNC05LjQtMjQuNi05LjQtMzMuOSAwTDEwNy43IDIzOWMtOS40IDkuNC05LjQgMjQuNiAwIDMzLjlsMTMyLjcgMTMyLjdjOS40IDkuNCAyNC42IDkuNCAzMy45IDBsMTEtMTAuOWM5LjUtOS41IDkuMy0yNS0uNC0zNC4zeiJdfSxWcD17cHJlZml4OiJmYXMiLGljb25OYW1lOiJib2xkIixpY29uOlszODQsNTEyLFtdLCJmMDMyIiwiTTMzMy40OSAyMzhhMTIyIDEyMiAwIDAgMCAyNy02NS4yMUMzNjcuODcgOTYuNDkgMzA4IDMyIDIzMy40MiAzMkgzNGExNiAxNiAwIDAgMC0xNiAxNnY0OGExNiAxNiAwIDAgMCAxNiAxNmgzMS44N3YyODhIMzRhMTYgMTYgMCAwIDAtMTYgMTZ2NDhhMTYgMTYgMCAwIDAgMTYgMTZoMjA5LjMyYzcwLjggMCAxMzQuMTQtNTEuNzUgMTQxLTEyMi40IDQuNzQtNDguNDUtMTYuMzktOTIuMDYtNTAuODMtMTE5LjZ6TTE0NS42NiAxMTJoODcuNzZhNDggNDggMCAwIDEgMCA5NmgtODcuNzZ6bTg3Ljc2IDI4OGgtODcuNzZWMjg4aDg3Ljc2YTU2IDU2IDAgMCAxIDAgMTEyeiJdfSxVcj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJib21iIixpY29uOls1MTIsNTEyLFtdLCJmMWUyIiwiTTQ0MC41IDg4LjVsLTUyIDUyTDQxNSAxNjdjOS40IDkuNCA5LjQgMjQuNiAwIDMzLjlsLTE3LjQgMTcuNGMxMS44IDI2LjEgMTguNCA1NS4xIDE4LjQgODUuNiAwIDExNC45LTkzLjEgMjA4LTIwOCAyMDhTMCA0MTguOSAwIDMwNCA5My4xIDk2IDIwOCA5NmMzMC41IDAgNTkuNSA2LjYgODUuNiAxOC40TDMxMSA5N2M5LjQtOS40IDI0LjYtOS40IDMzLjkgMGwyNi41IDI2LjUgNTItNTIgMTcuMSAxN3pNNTAwIDYwaC0yNGMtNi42IDAtMTIgNS40LTEyIDEyczUuNCAxMiAxMiAxMmgyNGM2LjYgMCAxMi01LjQgMTItMTJzLTUuNC0xMi0xMi0xMnpNNDQwIDBjLTYuNiAwLTEyIDUuNC0xMiAxMnYyNGMwIDYuNiA1LjQgMTIgMTIgMTJzMTItNS40IDEyLTEyVjEyYzAtNi42LTUuNC0xMi0xMi0xMnptMzMuOSA1NWwxNy0xN2M0LjctNC43IDQuNy0xMi4zIDAtMTctNC43LTQuNy0xMi4zLTQuNy0xNyAwbC0xNyAxN2MtNC43IDQuNy00LjcgMTIuMyAwIDE3IDQuOCA0LjcgMTIuNCA0LjcgMTcgMHptLTY3LjggMGM0LjcgNC43IDEyLjMgNC43IDE3IDAgNC43LTQuNyA0LjctMTIuMyAwLTE3bC0xNy0xN2MtNC43LTQuNy0xMi4zLTQuNy0xNyAwLTQuNyA0LjctNC43IDEyLjMgMCAxN2wxNyAxN3ptNjcuOCAzNGMtNC43LTQuNy0xMi4zLTQuNy0xNyAwLTQuNyA0LjctNC43IDEyLjMgMCAxN2wxNyAxN2M0LjcgNC43IDEyLjMgNC43IDE3IDAgNC43LTQuNyA0LjctMTIuMyAwLTE3bC0xNy0xN3pNMTEyIDI3MmMwLTM1LjMgMjguNy02NCA2NC02NCA4LjggMCAxNi03LjIgMTYtMTZzLTcuMi0xNi0xNi0xNmMtNTIuOSAwLTk2IDQzLjEtOTYgOTYgMCA4LjggNy4yIDE2IDE2IDE2czE2LTcuMiAxNi0xNnoiXX0saDM9e3ByZWZpeDoiZmFzIixpY29uTmFtZToiY2FydC1hcnJvdy1kb3duIixpY29uOls1NzYsNTEyLFtdLCJmMjE4IiwiTTUwNC43MTcgMzIwSDIxMS41NzJsNi41NDUgMzJoMjY4LjQxOGMxNS40MDEgMCAyNi44MTYgMTQuMzAxIDIzLjQwMyAyOS4zMTlsLTUuNTE3IDI0LjI3NkM1MjMuMTEyIDQxNC42NjggNTM2IDQzMy44MjggNTM2IDQ1NmMwIDMxLjIwMi0yNS41MTkgNTYuNDQ0LTU2LjgyNCA1NS45OTQtMjkuODIzLS40MjktNTQuMzUtMjQuNjMxLTU1LjE1NS01NC40NDctLjQ0LTE2LjI4NyA2LjA4NS0zMS4wNDkgMTYuODAzLTQxLjU0OEgyMzEuMTc2QzI0MS41NTMgNDI2LjE2NSAyNDggNDQwLjMyNiAyNDggNDU2YzAgMzEuODEzLTI2LjUyOCA1Ny40MzEtNTguNjcgNTUuOTM4LTI4LjU0LTEuMzI1LTUxLjc1MS0yNC4zODUtNTMuMjUxLTUyLjkxNy0xLjE1OC0yMi4wMzQgMTAuNDM2LTQxLjQ1NSAyOC4wNTEtNTEuNTg2TDkzLjg4MyA2NEgyNEMxMC43NDUgNjQgMCA1My4yNTUgMCA0MFYyNEMwIDEwLjc0NSAxMC43NDUgMCAyNCAwaDEwMi41MjljMTEuNDAxIDAgMjEuMjI4IDguMDIxIDIzLjUxMyAxOS4xOUwxNTkuMjA4IDY0SDU1MS45OWMxNS40MDEgMCAyNi44MTYgMTQuMzAxIDIzLjQwMyAyOS4zMTlsLTQ3LjI3MyAyMDhDNTI1LjYzNyAzMTIuMjQ2IDUxNS45MjMgMzIwIDUwNC43MTcgMzIwek00MDMuMDI5IDE5MkgzNjB2LTYwYzAtNi42MjctNS4zNzMtMTItMTItMTJoLTI0Yy02LjYyNyAwLTEyIDUuMzczLTEyIDEydjYwaC00My4wMjljLTEwLjY5MSAwLTE2LjA0NSAxMi45MjYtOC40ODUgMjAuNDg1bDY3LjAyOSA2Ny4wMjljNC42ODYgNC42ODYgMTIuMjg0IDQuNjg2IDE2Ljk3MSAwbDY3LjAyOS02Ny4wMjljNy41NTktNy41NTkgMi4yMDUtMjAuNDg1LTguNDg2LTIwLjQ4NXoiXX0sT3A9e3ByZWZpeDoiZmFzIixpY29uTmFtZToiY2FydC1wbHVzIixpY29uOls1NzYsNTEyLFtdLCJmMjE3IiwiTTUwNC43MTcgMzIwSDIxMS41NzJsNi41NDUgMzJoMjY4LjQxOGMxNS40MDEgMCAyNi44MTYgMTQuMzAxIDIzLjQwMyAyOS4zMTlsLTUuNTE3IDI0LjI3NkM1MjMuMTEyIDQxNC42NjggNTM2IDQzMy44MjggNTM2IDQ1NmMwIDMxLjIwMi0yNS41MTkgNTYuNDQ0LTU2LjgyNCA1NS45OTQtMjkuODIzLS40MjktNTQuMzUtMjQuNjMxLTU1LjE1NS01NC40NDctLjQ0LTE2LjI4NyA2LjA4NS0zMS4wNDkgMTYuODAzLTQxLjU0OEgyMzEuMTc2QzI0MS41NTMgNDI2LjE2NSAyNDggNDQwLjMyNiAyNDggNDU2YzAgMzEuODEzLTI2LjUyOCA1Ny40MzEtNTguNjcgNTUuOTM4LTI4LjU0LTEuMzI1LTUxLjc1MS0yNC4zODUtNTMuMjUxLTUyLjkxNy0xLjE1OC0yMi4wMzQgMTAuNDM2LTQxLjQ1NSAyOC4wNTEtNTEuNTg2TDkzLjg4MyA2NEgyNEMxMC43NDUgNjQgMCA1My4yNTUgMCA0MFYyNEMwIDEwLjc0NSAxMC43NDUgMCAyNCAwaDEwMi41MjljMTEuNDAxIDAgMjEuMjI4IDguMDIxIDIzLjUxMyAxOS4xOUwxNTkuMjA4IDY0SDU1MS45OWMxNS40MDEgMCAyNi44MTYgMTQuMzAxIDIzLjQwMyAyOS4zMTlsLTQ3LjI3MyAyMDhDNTI1LjYzNyAzMTIuMjQ2IDUxNS45MjMgMzIwIDUwNC43MTcgMzIwek00MDggMTY4aC00OHYtNDBjMC04LjgzNy03LjE2My0xNi0xNi0xNmgtMTZjLTguODM3IDAtMTYgNy4xNjMtMTYgMTZ2NDBoLTQ4Yy04LjgzNyAwLTE2IDcuMTYzLTE2IDE2djE2YzAgOC44MzcgNy4xNjMgMTYgMTYgMTZoNDh2NDBjMCA4LjgzNyA3LjE2MyAxNiAxNiAxNmgxNmM4LjgzNyAwIDE2LTcuMTYzIDE2LTE2di00MGg0OGM4LjgzNyAwIDE2LTcuMTYzIDE2LTE2di0xNmMwLTguODM3LTcuMTYzLTE2LTE2LTE2eiJdfSxIcD17cHJlZml4OiJmYXMiLGljb25OYW1lOiJjaGVjayIsaWNvbjpbNTEyLDUxMixbXSwiZjAwYyIsIk0xNzMuODk4IDQzOS40MDRsLTE2Ni40LTE2Ni40Yy05Ljk5Ny05Ljk5Ny05Ljk5Ny0yNi4yMDYgMC0zNi4yMDRsMzYuMjAzLTM2LjIwNGM5Ljk5Ny05Ljk5OCAyNi4yMDctOS45OTggMzYuMjA0IDBMMTkyIDMxMi42OSA0MzIuMDk1IDcyLjU5NmM5Ljk5Ny05Ljk5NyAyNi4yMDctOS45OTcgMzYuMjA0IDBsMzYuMjAzIDM2LjIwNGM5Ljk5NyA5Ljk5NyA5Ljk5NyAyNi4yMDYgMCAzNi4yMDRsLTI5NC40IDI5NC40MDFjLTkuOTk4IDkuOTk3LTI2LjIwNyA5Ljk5Ny0zNi4yMDQtLjAwMXoiXX0sTnA9e3ByZWZpeDoiZmFzIixpY29uTmFtZToiY29mZmVlIixpY29uOls2NDAsNTEyLFtdLCJmMGY0IiwiTTE5MiAzODRoMTkyYzUzIDAgOTYtNDMgOTYtOTZoMzJjNzAuNiAwIDEyOC01Ny40IDEyOC0xMjhTNTgyLjYgMzIgNTEyIDMySDEyMGMtMTMuMyAwLTI0IDEwLjctMjQgMjR2MjMyYzAgNTMgNDMgOTYgOTYgOTZ6TTUxMiA5NmMzNS4zIDAgNjQgMjguNyA2NCA2NHMtMjguNyA2NC02NCA2NGgtMzJWOTZoMzJ6bTQ3LjcgMzg0SDQ4LjNjLTQ3LjYgMC02MS02NC0zNi02NGg1ODMuM2MyNSAwIDExLjggNjQtMzUuOSA2NHoiXX0sUnA9e3ByZWZpeDoiZmFzIixpY29uTmFtZToiY29tbWVudCIsaWNvbjpbNTEyLDUxMixbXSwiZjA3NSIsIk0yNTYgMzJDMTE0LjYgMzIgMCAxMjUuMSAwIDI0MGMwIDQ5LjYgMjEuNCA5NSA1NyAxMzAuN0M0NC41IDQyMS4xIDIuNyA0NjYgMi4yIDQ2Ni41Yy0yLjIgMi4zLTIuOCA1LjctMS41IDguN1M0LjggNDgwIDggNDgwYzY2LjMgMCAxMTYtMzEuOCAxNDAuNi01MS40IDMyLjcgMTIuMyA2OSAxOS40IDEwNy40IDE5LjQgMTQxLjQgMCAyNTYtOTMuMSAyNTYtMjA4UzM5Ny40IDMyIDI1NiAzMnoiXX0sRnA9e3ByZWZpeDoiZmFzIixpY29uTmFtZToiY29tbWVudC1hbHQiLGljb246WzUxMiw1MTIsW10sImYyN2EiLCJNNDQ4IDBINjRDMjguNyAwIDAgMjguNyAwIDY0djI4OGMwIDM1LjMgMjguNyA2NCA2NCA2NGg5NnY4NGMwIDkuOCAxMS4yIDE1LjUgMTkuMSA5LjdMMzA0IDQxNmgxNDRjMzUuMyAwIDY0LTI4LjcgNjQtNjRWNjRjMC0zNS4zLTI4LjctNjQtNjQtNjR6Il19LEJwPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6ImNvbW1lbnRzIixpY29uOls1NzYsNTEyLFtdLCJmMDg2IiwiTTQxNiAxOTJjMC04OC40LTkzLjEtMTYwLTIwOC0xNjBTMCAxMDMuNiAwIDE5MmMwIDM0LjMgMTQuMSA2NS45IDM4IDkyLTEzLjQgMzAuMi0zNS41IDU0LjItMzUuOCA1NC41LTIuMiAyLjMtMi44IDUuNy0xLjUgOC43UzQuOCAzNTIgOCAzNTJjMzYuNiAwIDY2LjktMTIuMyA4OC43LTI1IDMyLjIgMTUuNyA3MC4zIDI1IDExMS4zIDI1IDExNC45IDAgMjA4LTcxLjYgMjA4LTE2MHptMTIyIDIyMGMyMy45LTI2IDM4LTU3LjcgMzgtOTIgMC02Ni45LTUzLjUtMTI0LjItMTI5LjMtMTQ4LjEuOSA2LjYgMS4zIDEzLjMgMS4zIDIwLjEgMCAxMDUuOS0xMDcuNyAxOTItMjQwIDE5Mi0xMC44IDAtMjEuMy0uOC0zMS43LTEuOUMyMDcuOCA0MzkuNiAyODEuOCA0ODAgMzY4IDQ4MGM0MSAwIDc5LjEtOS4yIDExMS4zLTI1IDIxLjggMTIuNyA1Mi4xIDI1IDg4LjcgMjUgMy4yIDAgNi4xLTEuOSA3LjMtNC44IDEuMy0yLjkuNy02LjMtMS41LTguNy0uMy0uMy0yMi40LTI0LjItMzUuOC01NC41eiJdfSxVcD17cHJlZml4OiJmYXMiLGljb25OYW1lOiJjcm93biIsaWNvbjpbNjQwLDUxMixbXSwiZjUyMSIsIk01MjggNDQ4SDExMmMtOC44IDAtMTYgNy4yLTE2IDE2djMyYzAgOC44IDcuMiAxNiAxNiAxNmg0MTZjOC44IDAgMTYtNy4yIDE2LTE2di0zMmMwLTguOC03LjItMTYtMTYtMTZ6bTY0LTMyMGMtMjYuNSAwLTQ4IDIxLjUtNDggNDggMCA3LjEgMS42IDEzLjcgNC40IDE5LjhMNDc2IDIzOS4yYy0xNS40IDkuMi0zNS4zIDQtNDQuMi0xMS42TDM1MC4zIDg1QzM2MSA3Ni4yIDM2OCA2MyAzNjggNDhjMC0yNi41LTIxLjUtNDgtNDgtNDhzLTQ4IDIxLjUtNDggNDhjMCAxNSA3IDI4LjIgMTcuNyAzN2wtODEuNSAxNDIuNmMtOC45IDE1LjYtMjguOSAyMC44LTQ0LjIgMTEuNmwtNzIuMy00My40YzIuNy02IDQuNC0xMi43IDQuNC0xOS44IDAtMjYuNS0yMS41LTQ4LTQ4LTQ4UzAgMTQ5LjUgMCAxNzZzMjEuNSA0OCA0OCA0OGMyLjYgMCA1LjItLjQgNy43LS44TDEyOCA0MTZoMzg0bDcyLjMtMTkyLjhjMi41LjQgNS4xLjggNy43LjggMjYuNSAwIDQ4LTIxLjUgNDgtNDhzLTIxLjUtNDgtNDgtNDh6Il19LGpwPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6ImV4Y2xhbWF0aW9uLWNpcmNsZSIsaWNvbjpbNTEyLDUxMixbXSwiZjA2YSIsIk01MDQgMjU2YzAgMTM2Ljk5Ny0xMTEuMDQzIDI0OC0yNDggMjQ4UzggMzkyLjk5NyA4IDI1NkM4IDExOS4wODMgMTE5LjA0MyA4IDI1NiA4czI0OCAxMTEuMDgzIDI0OCAyNDh6bS0yNDggNTBjLTI1LjQwNSAwLTQ2IDIwLjU5NS00NiA0NnMyMC41OTUgNDYgNDYgNDYgNDYtMjAuNTk1IDQ2LTQ2LTIwLjU5NS00Ni00Ni00NnptLTQzLjY3My0xNjUuMzQ2bDcuNDE4IDEzNmMuMzQ3IDYuMzY0IDUuNjA5IDExLjM0NiAxMS45ODIgMTEuMzQ2aDQ4LjU0NmM2LjM3MyAwIDExLjYzNS00Ljk4MiAxMS45ODItMTEuMzQ2bDcuNDE4LTEzNmMuMzc1LTYuODc0LTUuMDk4LTEyLjY1NC0xMS45ODItMTIuNjU0aC02My4zODNjLTYuODg0IDAtMTIuMzU2IDUuNzgtMTEuOTgxIDEyLjY1NHoiXX0sanI9e3ByZWZpeDoiZmFzIixpY29uTmFtZToiZXllIixpY29uOls1NzYsNTEyLFtdLCJmMDZlIiwiTTU3Mi41MiAyNDEuNEM1MTguMjkgMTM1LjU5IDQxMC45MyA2NCAyODggNjRTNTcuNjggMTM1LjY0IDMuNDggMjQxLjQxYTMyLjM1IDMyLjM1IDAgMCAwIDAgMjkuMTlDNTcuNzEgMzc2LjQxIDE2NS4wNyA0NDggMjg4IDQ0OHMyMzAuMzItNzEuNjQgMjg0LjUyLTE3Ny40MWEzMi4zNSAzMi4zNSAwIDAgMCAwLTI5LjE5ek0yODggNDAwYTE0NCAxNDQgMCAxIDEgMTQ0LTE0NCAxNDMuOTMgMTQzLjkzIDAgMCAxLTE0NCAxNDR6bTAtMjQwYTk1LjMxIDk1LjMxIDAgMCAwLTI1LjMxIDMuNzkgNDcuODUgNDcuODUgMCAwIDEtNjYuOSA2Ni45QTk1Ljc4IDk1Ljc4IDAgMSAwIDI4OCAxNjB6Il19LHFwPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6ImV5ZS1zbGFzaCIsaWNvbjpbNjQwLDUxMixbXSwiZjA3MCIsIk0zMjAgNDAwYy03NS44NSAwLTEzNy4yNS01OC43MS0xNDIuOS0xMzMuMTFMNzIuMiAxODUuODJjLTEzLjc5IDE3LjMtMjYuNDggMzUuNTktMzYuNzIgNTUuNTlhMzIuMzUgMzIuMzUgMCAwIDAgMCAyOS4xOUM4OS43MSAzNzYuNDEgMTk3LjA3IDQ0OCAzMjAgNDQ4YzI2LjkxIDAgNTIuODctNCA3Ny44OS0xMC40NkwzNDYgMzk3LjM5YTE0NC4xMyAxNDQuMTMgMCAwIDEtMjYgMi42MXptMzEzLjgyIDU4LjFsLTExMC41NS04NS40NGEzMzEuMjUgMzMxLjI1IDAgMCAwIDgxLjI1LTEwMi4wNyAzMi4zNSAzMi4zNSAwIDAgMCAwLTI5LjE5QzU1MC4yOSAxMzUuNTkgNDQyLjkzIDY0IDMyMCA2NGEzMDguMTUgMzA4LjE1IDAgMCAwLTE0Ny4zMiAzNy43TDQ1LjQ2IDMuMzdBMTYgMTYgMCAwIDAgMjMgNi4xOEwzLjM3IDMxLjQ1QTE2IDE2IDAgMCAwIDYuMTggNTMuOWw1ODguMzYgNDU0LjczYTE2IDE2IDAgMCAwIDIyLjQ2LTIuODFsMTkuNjQtMjUuMjdhMTYgMTYgMCAwIDAtMi44Mi0yMi40NXptLTE4My43Mi0xNDJsLTM5LjMtMzAuMzhBOTQuNzUgOTQuNzUgMCAwIDAgNDE2IDI1NmE5NC43NiA5NC43NiAwIDAgMC0xMjEuMzEtOTIuMjFBNDcuNjUgNDcuNjUgMCAwIDEgMzA0IDE5MmE0Ni42NCA0Ni42NCAwIDAgMS0xLjU0IDEwbC03My42MS01Ni44OUExNDIuMzEgMTQyLjMxIDAgMCAxIDMyMCAxMTJhMTQzLjkyIDE0My45MiAwIDAgMSAxNDQgMTQ0YzAgMjEuNjMtNS4yOSA0MS43OS0xMy45IDYwLjExeiJdfSxHcD17cHJlZml4OiJmYXMiLGljb25OYW1lOiJnaWZ0IixpY29uOls1MTIsNTEyLFtdLCJmMDZiIiwiTTMyIDQ0OGMwIDE3LjcgMTQuMyAzMiAzMiAzMmgxNjBWMzIwSDMydjEyOHptMjU2IDMyaDE2MGMxNy43IDAgMzItMTQuMyAzMi0zMlYzMjBIMjg4djE2MHptMTkyLTMyMGgtNDIuMWM2LjItMTIuMSAxMC4xLTI1LjUgMTAuMS00MCAwLTQ4LjUtMzkuNS04OC04OC04OC00MS42IDAtNjguNSAyMS4zLTEwMyA2OC4zLTM0LjUtNDctNjEuNC02OC4zLTEwMy02OC4zLTQ4LjUgMC04OCAzOS41LTg4IDg4IDAgMTQuNSAzLjggMjcuOSAxMC4xIDQwSDMyYy0xNy43IDAtMzIgMTQuMy0zMiAzMnY4MGMwIDguOCA3LjIgMTYgMTYgMTZoNDgwYzguOCAwIDE2LTcuMiAxNi0xNnYtODBjMC0xNy43LTE0LjMtMzItMzItMzJ6bS0zMjYuMSAwYy0yMi4xIDAtNDAtMTcuOS00MC00MHMxNy45LTQwIDQwLTQwYzE5LjkgMCAzNC42IDMuMyA4Ni4xIDgwaC04Ni4xem0yMDYuMSAwaC04Ni4xYzUxLjQtNzYuNSA2NS43LTgwIDg2LjEtODAgMjIuMSAwIDQwIDE3LjkgNDAgNDBzLTE3LjkgNDAtNDAgNDB6Il19LFdwPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6ImdyYWR1YXRpb24tY2FwIixpY29uOls2NDAsNTEyLFtdLCJmMTlkIiwiTTYyMi4zNCAxNTMuMkwzNDMuNCA2Ny41Yy0xNS4yLTQuNjctMzEuNi00LjY3LTQ2Ljc5IDBMMTcuNjYgMTUzLjJjLTIzLjU0IDcuMjMtMjMuNTQgMzguMzYgMCA0NS41OWw0OC42MyAxNC45NGMtMTAuNjcgMTMuMTktMTcuMjMgMjkuMjgtMTcuODggNDYuOUMzOC43OCAyNjYuMTUgMzIgMjc2LjExIDMyIDI4OGMwIDEwLjc4IDUuNjggMTkuODUgMTMuODYgMjUuNjVMMjAuMzMgNDI4LjUzQzE4LjExIDQzOC41MiAyNS43MSA0NDggMzUuOTQgNDQ4aDU2LjExYzEwLjI0IDAgMTcuODQtOS40OCAxNS42Mi0xOS40N0w4Mi4xNCAzMTMuNjVDOTAuMzIgMzA3Ljg1IDk2IDI5OC43OCA5NiAyODhjMC0xMS41Ny02LjQ3LTIxLjI1LTE1LjY2LTI2Ljg3Ljc2LTE1LjAyIDguNDQtMjguMyAyMC42OS0zNi43MkwyOTYuNiAyODQuNWM5LjA2IDIuNzggMjYuNDQgNi4yNSA0Ni43OSAwbDI3OC45NS04NS43YzIzLjU1LTcuMjQgMjMuNTUtMzguMzYgMC00NS42ek0zNTIuNzkgMzE1LjA5Yy0yOC41MyA4Ljc2LTUyLjg0IDMuOTItNjUuNTkgMGwtMTQ1LjAyLTQ0LjU1TDEyOCAzODRjMCAzNS4zNSA4NS45NiA2NCAxOTIgNjRzMTkyLTI4LjY1IDE5Mi02NGwtMTQuMTgtMTEzLjQ3LTE0NS4wMyA0NC41NnoiXX0sUXA9e3ByZWZpeDoiZmFzIixpY29uTmFtZToiaGFuZC1ob2xkaW5nLXVzZCIsaWNvbjpbNTc2LDUxMixbXSwiZjRjMCIsIk0yNzEuMDYsMTQ0LjNsNTQuMjcsMTQuM2E4LjU5LDguNTksMCwwLDEsNi42Myw4LjFjMCw0LjYtNC4wOSw4LjQtOS4xMiw4LjRoLTM1LjZhMzAsMzAsMCwwLDEtMTEuMTktMi4yYy01LjI0LTIuMi0xMS4yOC0xLjctMTUuMywybC0xOSwxNy41YTExLjY4LDExLjY4LDAsMCwwLTIuMjUsMi42NiwxMS40MiwxMS40MiwwLDAsMCwzLjg4LDE1Ljc0LDgzLjc3LDgzLjc3LDAsMCwwLDM0LjUxLDExLjVWMjQwYzAsOC44LDcuODMsMTYsMTcuMzcsMTZoMTcuMzdjOS41NSwwLDE3LjM4LTcuMiwxNy4zOC0xNlYyMjIuNGMzMi45My0zLjYsNTcuODQtMzEsNTMuNS02My0zLjE1LTIzLTIyLjQ2LTQxLjMtNDYuNTYtNDcuN0wyODIuNjgsOTcuNGE4LjU5LDguNTksMCwwLDEtNi42My04LjFjMC00LjYsNC4wOS04LjQsOS4xMi04LjRoMzUuNkEzMCwzMCwwLDAsMSwzMzIsODMuMWM1LjIzLDIuMiwxMS4yOCwxLjcsMTUuMy0ybDE5LTE3LjVBMTEuMzEsMTEuMzEsMCwwLDAsMzY4LjQ3LDYxYTExLjQzLDExLjQzLDAsMCwwLTMuODQtMTUuNzgsODMuODIsODMuODIsMCwwLDAtMzQuNTItMTEuNVYxNmMwLTguOC03LjgyLTE2LTE3LjM3LTE2SDI5NS4zN0MyODUuODIsMCwyNzgsNy4yLDI3OCwxNlYzMy42Yy0zMi44OSwzLjYtNTcuODUsMzEtNTMuNTEsNjNDMjI3LjYzLDExOS42LDI0NywxMzcuOSwyNzEuMDYsMTQ0LjNaTTU2NS4yNywzMjguMWMtMTEuOC0xMC43LTMwLjItMTAtNDIuNiwwTDQzMC4yNyw0MDJhNjMuNjQsNjMuNjQsMCwwLDEtNDAsMTRIMjcyYTE2LDE2LDAsMCwxLDAtMzJoNzguMjljMTUuOSwwLDMwLjcxLTEwLjksMzMuMjUtMjYuNmEzMS4yLDMxLjIsMCwwLDAsLjQ2LTUuNDZBMzIsMzIsMCwwLDAsMzUyLDMyMEgxOTJhMTE3LjY2LDExNy42NiwwLDAsMC03NC4xLDI2LjI5TDcxLjQsMzg0SDE2QTE2LDE2LDAsMCwwLDAsNDAwdjk2YTE2LDE2LDAsMCwwLDE2LDE2SDM3Mi43N2E2NCw2NCwwLDAsMCw0MC0xNEw1NjQsMzc3YTMyLDMyLDAsMCwwLDEuMjgtNDguOVoiXX0sWXA9e3ByZWZpeDoiZmFzIixpY29uTmFtZToiaGFuZC1wYXBlciIsaWNvbjpbNDQ4LDUxMixbXSwiZjI1NiIsIk00MDguNzgxIDEyOC4wMDdDMzg2LjM1NiAxMjcuNTc4IDM2OCAxNDYuMzYgMzY4IDE2OC43OVYyNTZoLThWNzkuNzljMC0yMi40My0xOC4zNTYtNDEuMjEyLTQwLjc4MS00MC43ODNDMjk3LjQ4OCAzOS40MjMgMjgwIDU3LjE2OSAyODAgNzl2MTc3aC04VjQwLjc5QzI3MiAxOC4zNiAyNTMuNjQ0LS40MjIgMjMxLjIxOS4wMDcgMjA5LjQ4OC40MjMgMTkyIDE4LjE2OSAxOTIgNDB2MjE2aC04VjgwLjc5YzAtMjIuNDMtMTguMzU2LTQxLjIxMi00MC43ODEtNDAuNzgzQzEyMS40ODggNDAuNDIzIDEwNCA1OC4xNjkgMTA0IDgwdjIzNS45OTJsLTMxLjY0OC00My41MTljLTEyLjk5My0xNy44NjYtMzguMDA5LTIxLjgxNy01NS44NzctOC44MjMtMTcuODY1IDEyLjk5NC0yMS44MTUgMzguMDEtOC44MjIgNTUuODc3bDEyNS42MDEgMTcyLjcwNUE0OCA0OCAwIDAgMCAxNzIuMDczIDUxMmgxOTcuNTljMjIuMjc0IDAgNDEuNjIyLTE1LjMyNCA0Ni43MjQtMzcuMDA2bDI2LjUwOC0xMTIuNjZhMTkyLjAxMSAxOTIuMDExIDAgMCAwIDUuMTA0LTQzLjk3NVYxNjhjLjAwMS0yMS44MzEtMTcuNDg3LTM5LjU3Ny0zOS4yMTgtMzkuOTkzeiJdfSxacD17cHJlZml4OiJmYXMiLGljb25OYW1lOiJoZWFydCIsaWNvbjpbNTEyLDUxMixbXSwiZjAwNCIsIk00NjIuMyA2Mi42QzQwNy41IDE1LjkgMzI2IDI0LjMgMjc1LjcgNzYuMkwyNTYgOTYuNWwtMTkuNy0yMC4zQzE4Ni4xIDI0LjMgMTA0LjUgMTUuOSA0OS43IDYyLjZjLTYyLjggNTMuNi02Ni4xIDE0OS44LTkuOSAyMDcuOWwxOTMuNSAxOTkuOGMxMi41IDEyLjkgMzIuOCAxMi45IDQ1LjMgMGwxOTMuNS0xOTkuOGM1Ni4zLTU4LjEgNTMtMTU0LjMtOS44LTIwNy45eiJdfSxwMz17cHJlZml4OiJmYXMiLGljb25OYW1lOiJob21lIixpY29uOls1NzYsNTEyLFtdLCJmMDE1IiwiTTI4MC4zNyAxNDguMjZMOTYgMzAwLjExVjQ2NGExNiAxNiAwIDAgMCAxNiAxNmwxMTIuMDYtLjI5YTE2IDE2IDAgMCAwIDE1LjkyLTE2VjM2OGExNiAxNiAwIDAgMSAxNi0xNmg2NGExNiAxNiAwIDAgMSAxNiAxNnY5NS42NGExNiAxNiAwIDAgMCAxNiAxNi4wNUw0NjQgNDgwYTE2IDE2IDAgMCAwIDE2LTE2VjMwMEwyOTUuNjcgMTQ4LjI2YTEyLjE5IDEyLjE5IDAgMCAwLTE1LjMgMHpNNTcxLjYgMjUxLjQ3TDQ4OCAxODIuNTZWNDQuMDVhMTIgMTIgMCAwIDAtMTItMTJoLTU2YTEyIDEyIDAgMCAwLTEyIDEydjcyLjYxTDMxOC40NyA0M2E0OCA0OCAwIDAgMC02MSAwTDQuMzQgMjUxLjQ3YTEyIDEyIDAgMCAwLTEuNiAxNi45bDI1LjUgMzFBMTIgMTIgMCAwIDAgNDUuMTUgMzAxbDIzNS4yMi0xOTMuNzRhMTIuMTkgMTIuMTkgMCAwIDEgMTUuMyAwTDUzMC45IDMwMWExMiAxMiAwIDAgMCAxNi45LTEuNmwyNS41LTMxYTEyIDEyIDAgMCAwLTEuNy0xNi45M3oiXX0sJHA9e3ByZWZpeDoiZmFzIixpY29uTmFtZToiaW5mby1jaXJjbGUiLGljb246WzUxMiw1MTIsW10sImYwNWEiLCJNMjU2IDhDMTE5LjA0MyA4IDggMTE5LjA4MyA4IDI1NmMwIDEzNi45OTcgMTExLjA0MyAyNDggMjQ4IDI0OHMyNDgtMTExLjAwMyAyNDgtMjQ4QzUwNCAxMTkuMDgzIDM5Mi45NTcgOCAyNTYgOHptMCAxMTBjMjMuMTk2IDAgNDIgMTguODA0IDQyIDQycy0xOC44MDQgNDItNDIgNDItNDItMTguODA0LTQyLTQyIDE4LjgwNC00MiA0Mi00MnptNTYgMjU0YzAgNi42MjctNS4zNzMgMTItMTIgMTJoLTg4Yy02LjYyNyAwLTEyLTUuMzczLTEyLTEydi0yNGMwLTYuNjI3IDUuMzczLTEyIDEyLTEyaDEydi02NGgtMTJjLTYuNjI3IDAtMTItNS4zNzMtMTItMTJ2LTI0YzAtNi42MjcgNS4zNzMtMTIgMTItMTJoNjRjNi42MjcgMCAxMiA1LjM3MyAxMiAxMnYxMDBoMTJjNi42MjcgMCAxMiA1LjM3MyAxMiAxMnYyNHoiXX0sS3A9e3ByZWZpeDoiZmFzIixpY29uTmFtZToia2V5IixpY29uOls1MTIsNTEyLFtdLCJmMDg0IiwiTTUxMiAxNzYuMDAxQzUxMiAyNzMuMjAzIDQzMy4yMDIgMzUyIDMzNiAzNTJjLTExLjIyIDAtMjIuMTktMS4wNjItMzIuODI3LTMuMDY5bC0yNC4wMTIgMjcuMDE0QTIzLjk5OSAyMy45OTkgMCAwIDEgMjYxLjIyMyAzODRIMjI0djQwYzAgMTMuMjU1LTEwLjc0NSAyNC0yNCAyNGgtNDB2NDBjMCAxMy4yNTUtMTAuNzQ1IDI0LTI0IDI0SDI0Yy0xMy4yNTUgMC0yNC0xMC43NDUtMjQtMjR2LTc4LjA1OWMwLTYuMzY1IDIuNTI5LTEyLjQ3IDcuMDI5LTE2Ljk3MWwxNjEuODAyLTE2MS44MDJDMTYzLjEwOCAyMTMuODE0IDE2MCAxOTUuMjcxIDE2MCAxNzYgMTYwIDc4Ljc5OCAyMzguNzk3LjAwMSAzMzUuOTk5IDAgNDMzLjQ4OC0uMDAxIDUxMiA3OC41MTEgNTEyIDE3Ni4wMDF6TTMzNiAxMjhjMCAyNi41MSAyMS40OSA0OCA0OCA0OHM0OC0yMS40OSA0OC00OC0yMS40OS00OC00OC00OC00OCAyMS40OS00OCA0OHoiXX0sWHA9e3ByZWZpeDoiZmFzIixpY29uTmFtZToibGFuZ3VhZ2UiLGljb246WzY0MCw1MTIsW10sImYxYWIiLCJNMTUyLjEgMjM2LjJjLTMuNS0xMi4xLTcuOC0zMy4yLTcuOC0zMy4yaC0uNXMtNC4zIDIxLjEtNy44IDMzLjJsLTExLjEgMzcuNUgxNjN6TTYxNiA5NkgzMzZ2MzIwaDI4MGMxMy4zIDAgMjQtMTAuNyAyNC0yNFYxMjBjMC0xMy4zLTEwLjctMjQtMjQtMjR6bS0yNCAxMjBjMCA2LjYtNS40IDEyLTEyIDEyaC0xMS40Yy02LjkgMjMuNi0yMS43IDQ3LjQtNDIuNyA2OS45IDguNCA2LjQgMTcuMSAxMi41IDI2LjEgMTggNS41IDMuNCA3LjMgMTAuNSA0LjEgMTYuMmwtNy45IDEzLjljLTMuNCA1LjktMTAuOSA3LjgtMTYuNyA0LjMtMTIuNi03LjgtMjQuNS0xNi4xLTM1LjQtMjQuOS0xMC45IDguNy0yMi43IDE3LjEtMzUuNCAyNC45LTUuOCAzLjUtMTMuMyAxLjYtMTYuNy00LjNsLTcuOS0xMy45Yy0zLjItNS42LTEuNC0xMi44IDQuMi0xNi4yIDkuMy01LjcgMTgtMTEuNyAyNi4xLTE4LTcuOS04LjQtMTQuOS0xNy0yMS0yNS43LTQtNS43LTIuMi0xMy42IDMuNy0xNy4xbDYuNS0zLjkgNy4zLTQuM2M1LjQtMy4yIDEyLjQtMS43IDE2IDMuNCA1IDcgMTAuOCAxNCAxNy40IDIwLjkgMTMuNS0xNC4yIDIzLjgtMjguOSAzMC00My4ySDQxMmMtNi42IDAtMTItNS40LTEyLTEydi0xNmMwLTYuNiA1LjQtMTIgMTItMTJoNjR2LTE2YzAtNi42IDUuNC0xMiAxMi0xMmgxNmM2LjYgMCAxMiA1LjQgMTIgMTJ2MTZoNjRjNi42IDAgMTIgNS40IDEyIDEyek0wIDEyMHYyNzJjMCAxMy4zIDEwLjcgMjQgMjQgMjRoMjgwVjk2SDI0Yy0xMy4zIDAtMjQgMTAuNy0yNCAyNHptNTguOSAyMTYuMUwxMTYuNCAxNjdjMS43LTQuOSA2LjItOC4xIDExLjQtOC4xaDMyLjVjNS4xIDAgOS43IDMuMyAxMS40IDguMWw1Ny41IDE2OS4xYzIuNiA3LjgtMy4xIDE1LjktMTEuNCAxNS45aC0yMi45YTEyIDEyIDAgMCAxLTExLjUtOC42bC05LjQtMzEuOWgtNjAuMmwtOS4xIDMxLjhjLTEuNSA1LjEtNi4yIDguNy0xMS41IDguN0g3MC4zYy04LjIgMC0xNC04LjEtMTEuNC0xNS45eiJdfSxKcD17cHJlZml4OiJmYXMiLGljb25OYW1lOiJtYXAtbWFya2VyIixpY29uOlszODQsNTEyLFtdLCJmMDQxIiwiTTE3Mi4yNjggNTAxLjY3QzI2Ljk3IDI5MS4wMzEgMCAyNjkuNDEzIDAgMTkyIDAgODUuOTYxIDg1Ljk2MSAwIDE5MiAwczE5MiA4NS45NjEgMTkyIDE5MmMwIDc3LjQxMy0yNi45NyA5OS4wMzEtMTcyLjI2OCAzMDkuNjctOS41MzUgMTMuNzc0LTI5LjkzIDEzLjc3My0zOS40NjQgMHoiXX0sZWY9e3ByZWZpeDoiZmFzIixpY29uTmFtZToibWludXMtc3F1YXJlIixpY29uOls0NDgsNTEyLFtdLCJmMTQ2IiwiTTQwMCAzMkg0OEMyMS41IDMyIDAgNTMuNSAwIDgwdjM1MmMwIDI2LjUgMjEuNSA0OCA0OCA0OGgzNTJjMjYuNSAwIDQ4LTIxLjUgNDgtNDhWODBjMC0yNi41LTIxLjUtNDgtNDgtNDh6TTkyIDI5NmMtNi42IDAtMTItNS40LTEyLTEydi01NmMwLTYuNiA1LjQtMTIgMTItMTJoMjY0YzYuNiAwIDEyIDUuNCAxMiAxMnY1NmMwIDYuNi01LjQgMTItMTIgMTJIOTJ6Il19LGYzPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InBhbGV0dGUiLGljb246WzUxMiw1MTIsW10sImY1M2YiLCJNMjA0LjMgNUMxMDQuOSAyNC40IDI0LjggMTA0LjMgNS4yIDIwMy40Yy0zNyAxODcgMTMxLjcgMzI2LjQgMjU4LjggMzA2LjcgNDEuMi02LjQgNjEuNC01NC42IDQyLjUtOTEuNy0yMy4xLTQ1LjQgOS45LTk4LjQgNjAuOS05OC40aDc5LjdjMzUuOCAwIDY0LjgtMjkuNiA2NC45LTY1LjNDNTExLjUgOTcuMSAzNjguMS0yNi45IDIwNC4zIDV6TTk2IDMyMGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMiAzMiAxNC4zIDMyIDMyLTE0LjMgMzItMzIgMzJ6bTMyLTEyOGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMiAzMiAxNC4zIDMyIDMyLTE0LjMgMzItMzIgMzJ6bTEyOC02NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMiAzMiAxNC4zIDMyIDMyLTE0LjMgMzItMzIgMzJ6bTEyOCA2NGMtMTcuNyAwLTMyLTE0LjMtMzItMzJzMTQuMy0zMiAzMi0zMiAzMiAxNC4zIDMyIDMyLTE0LjMgMzItMzIgMzJ6Il19LG5hPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InBhcGVyLXBsYW5lIixpY29uOls1MTIsNTEyLFtdLCJmMWQ4IiwiTTQ3NiAzLjJMMTIuNSAyNzAuNmMtMTguMSAxMC40LTE1LjggMzUuNiAyLjIgNDMuMkwxMjEgMzU4LjRsMjg3LjMtMjUzLjJjNS41LTQuOSAxMy4zIDIuNiA4LjYgOC4zTDE3NiA0MDd2ODAuNWMwIDIzLjYgMjguNSAzMi45IDQyLjUgMTUuOEwyODIgNDI2bDEyNC42IDUyLjJjMTQuMiA2IDMwLjQtMi45IDMzLTE4LjJsNzItNDMyQzUxNSA3LjggNDkzLjMtNi44IDQ3NiAzLjJ6Il19LHRmPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InBsdXMtc3F1YXJlIixpY29uOls0NDgsNTEyLFtdLCJmMGZlIiwiTTQwMCAzMkg0OEMyMS41IDMyIDAgNTMuNSAwIDgwdjM1MmMwIDI2LjUgMjEuNSA0OCA0OCA0OGgzNTJjMjYuNSAwIDQ4LTIxLjUgNDgtNDhWODBjMC0yNi41LTIxLjUtNDgtNDgtNDh6bS0zMiAyNTJjMCA2LjYtNS40IDEyLTEyIDEyaC05MnY5MmMwIDYuNi01LjQgMTItMTIgMTJoLTU2Yy02LjYgMC0xMi01LjQtMTItMTJ2LTkySDkyYy02LjYgMC0xMi01LjQtMTItMTJ2LTU2YzAtNi42IDUuNC0xMiAxMi0xMmg5MnYtOTJjMC02LjYgNS40LTEyIDEyLTEyaDU2YzYuNiAwIDEyIDUuNCAxMiAxMnY5Mmg5MmM2LjYgMCAxMiA1LjQgMTIgMTJ2NTZ6Il19LGFmPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InJlY3ljbGUiLGljb246WzUxMiw1MTIsW10sImYxYjgiLCJNMTg0LjU2MSAyNjEuOTAzYzMuMjMyIDEzLjk5Ny0xMi4xMjMgMjQuNjM1LTI0LjA2OCAxNy4xNjhsLTQwLjczNi0yNS40NTUtNTAuODY3IDgxLjQwMkM1NS42MDYgMzU2LjI3MyA3MC45NiAzODQgOTYuMDEyIDM4NEgxNDhjNi42MjcgMCAxMiA1LjM3MyAxMiAxMnY0MGMwIDYuNjI3LTUuMzczIDEyLTEyIDEySDk2LjExNWMtNzUuMzM0IDAtMTIxLjMwMi04My4wNDgtODEuNDA4LTE0Ni44OGw1MC44MjItODEuMzg4LTQwLjcyNS0yNS40NDhjLTEyLjA4MS03LjU0Ny04Ljk2Ni0yNS45NjEgNC44NzktMjkuMTU4bDExMC4yMzctMjUuNDVjOC42MTEtMS45ODggMTcuMjAxIDMuMzgxIDE5LjE4OSAxMS45OWwyNS40NTIgMTEwLjIzN3ptOTguNTYxLTE4Mi45MTVsNDEuMjg5IDY2LjA3Ni00MC43NCAyNS40NTdjLTEyLjA1MSA3LjUyOC05IDI1Ljk1MyA0Ljg3OSAyOS4xNThsMTEwLjIzNyAyNS40NWM4LjY3MiAxLjk5OSAxNy4yMTUtMy40MzggMTkuMTg5LTExLjk5bDI1LjQ1LTExMC4yMzdjMy4xOTctMTMuODQ0LTExLjk5LTI0LjcxOS0yNC4wNjgtMTcuMTY4bC00MC42ODcgMjUuNDI0LTQxLjI2My02Ni4wODJjLTM3LjUyMS02MC4wMzMtMTI1LjIwOS02MC4xNzEtMTYyLjgxNiAwbC0xNy45NjMgMjguNzY2Yy0zLjUxIDUuNjItMS44IDEzLjAyMSAzLjgyIDE2LjUzM2wzMy45MTkgMjEuMTk1YzUuNjIgMy41MTIgMTMuMDI0IDEuODAzIDE2LjUzNi0zLjgxN2wxNy45NjEtMjguNzQzYzEyLjcxMi0yMC4zNDEgNDEuOTczLTE5LjY3NiA1NC4yNTctLjAyMnpNNDk3LjI4OCAzMDEuMTJsLTI3LjUxNS00NC4wNjVjLTMuNTExLTUuNjIzLTEwLjkxNi03LjMzNC0xNi41MzgtMy44MjFsLTMzLjg2MSAyMS4xNTljLTUuNjIgMy41MTItNy4zMyAxMC45MTUtMy44MTggMTYuNTM2bDI3LjU2NCA0NC4xMTJjMTMuMjU3IDIxLjIxMS0yLjA1NyA0OC45Ni0yNy4xMzYgNDguOTZIMzIwVjMzNi4wMmMwLTE0LjIxMy0xNy4yNDItMjEuMzgzLTI3LjMxMy0xMS4zMTNsLTgwIDc5Ljk4MWMtNi4yNDkgNi4yNDgtNi4yNDkgMTYuMzc5IDAgMjIuNjI3bDgwIDc5Ljk4OUMzMDIuNjg5IDUxNy4zMDggMzIwIDUxMC4zIDMyMCA0OTUuOTg5VjQ0OGg5NS44OGM3NS4yNzQgMCAxMjEuMzM1LTgyLjk5NyA4MS40MDgtMTQ2Ljg4eiJdfSxuZj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJyb2NrZXQiLGljb246WzUxMiw1MTIsW10sImYxMzUiLCJNNTA1LjEyMDE5LDE5LjA5Mzc1Yy0xLjE4OTQ1LTUuNTMxMjUtNi42NTgxOS0xMS0xMi4yMDctMTIuMTg3NUM0NjAuNzE2LDAsNDM1LjUwNywwLDQxMC40MDc0NywwLDMwNy4xNzUyMywwLDI0NS4yNjkwOSw1NS4yMDMxMiwxOTkuMDUyMzgsMTI4SDk0LjgzNzcyYy0xNi4zNDc2My4wMTU2Mi0zNS41NTY1OCwxMS44NzUtNDIuODg2NjQsMjYuNDg0MzhMMi41MTU2MiwyNTMuMjk2ODhBMjguNCwyOC40LDAsMCwwLDAsMjY0YTI0LjAwODY3LDI0LjAwODY3LDAsMCwwLDI0LjAwNTgyLDI0SDEyNy44MTYxOGwtMjIuNDc0NTcsMjIuNDY4NzVjLTExLjM2NTIxLDExLjM2MTMzLTEyLjk5NjA3LDMyLjI1NzgxLDAsNDUuMjVMMTU2LjI0NTgyLDQwNi42MjVjMTEuMTU2MjMsMTEuMTg3NSwzMi4xNTYxOSwxMy4xNTYyNSw0NS4yNzcyNiwwbDIyLjQ3NDU3LTIyLjQ2ODc1VjQ4OGEyNC4wMDg2NywyNC4wMDg2NywwLDAsMCwyNC4wMDU4MSwyNCwyOC41NTkzNCwyOC41NTkzNCwwLDAsMCwxMC43MDctMi41MTU2Mmw5OC43MjgzNC00OS4zOTA2M2MxNC42Mjg4OC03LjI5Njg3LDI2LjUwNzc2LTI2LjUsMjYuNTA3NzYtNDIuODU5MzdWMzEyLjc5Njg4YzcyLjU5NzUzLTQ2LjMxMjUsMTI4LjAzNDkzLTEwOC40MDYyNiwxMjguMDM0OTMtMjExLjA5Mzc2QzUxMi4wNzUyNiw3Ni41LDUxMi4wNzUyNiw1MS4yOTY4OCw1MDUuMTIwMTksMTkuMDkzNzVaTTM4NC4wNDAzMywxNjhBNDAsNDAsMCwxLDEsNDI0LjA1LDEyOCw0MC4wMjMyMiw0MC4wMjMyMiwwLDAsMSwzODQuMDQwMzMsMTY4WiJdfSxxcj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJzYXZlIixpY29uOls0NDgsNTEyLFtdLCJmMGM3IiwiTTQzMy45NDEgMTI5Ljk0MWwtODMuODgyLTgzLjg4MkE0OCA0OCAwIDAgMCAzMTYuMTE4IDMySDQ4QzIxLjQ5IDMyIDAgNTMuNDkgMCA4MHYzNTJjMCAyNi41MSAyMS40OSA0OCA0OCA0OGgzNTJjMjYuNTEgMCA0OC0yMS40OSA0OC00OFYxNjMuODgyYTQ4IDQ4IDAgMCAwLTE0LjA1OS0zMy45NDF6TTIyNCA0MTZjLTM1LjM0NiAwLTY0LTI4LjY1NC02NC02NCAwLTM1LjM0NiAyOC42NTQtNjQgNjQtNjRzNjQgMjguNjU0IDY0IDY0YzAgMzUuMzQ2LTI4LjY1NCA2NC02NCA2NHptOTYtMzA0LjUyVjIxMmMwIDYuNjI3LTUuMzczIDEyLTEyIDEySDc2Yy02LjYyNyAwLTEyLTUuMzczLTEyLTEyVjEwOGMwLTYuNjI3IDUuMzczLTEyIDEyLTEyaDIyOC41MmMzLjE4MyAwIDYuMjM1IDEuMjY0IDguNDg1IDMuNTE1bDMuNDggMy40OEExMS45OTYgMTEuOTk2IDAgMCAxIDMyMCAxMTEuNDh6Il19LHJmPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InNlYXJjaCIsaWNvbjpbNTEyLDUxMixbXSwiZjAwMiIsIk01MDUgNDQyLjdMNDA1LjMgMzQzYy00LjUtNC41LTEwLjYtNy0xNy03SDM3MmMyNy42LTM1LjMgNDQtNzkuNyA0NC0xMjhDNDE2IDkzLjEgMzIyLjkgMCAyMDggMFMwIDkzLjEgMCAyMDhzOTMuMSAyMDggMjA4IDIwOGM0OC4zIDAgOTIuNy0xNi40IDEyOC00NHYxNi4zYzAgNi40IDIuNSAxMi41IDcgMTdsOTkuNyA5OS43YzkuNCA5LjQgMjQuNiA5LjQgMzMuOSAwbDI4LjMtMjguM2M5LjQtOS40IDkuNC0yNC42LjEtMzR6TTIwOCAzMzZjLTcwLjcgMC0xMjgtNTcuMi0xMjgtMTI4IDAtNzAuNyA1Ny4yLTEyOCAxMjgtMTI4IDcwLjcgMCAxMjggNTcuMiAxMjggMTI4IDAgNzAuNy01Ny4yIDEyOC0xMjggMTI4eiJdfSxvZj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJzaGlwcGluZy1mYXN0IixpY29uOls2NDAsNTEyLFtdLCJmNDhiIiwiTTYyNCAzNTJoLTE2VjI0My45YzAtMTIuNy01LjEtMjQuOS0xNC4xLTMzLjlMNDk0IDExMC4xYy05LTktMjEuMi0xNC4xLTMzLjktMTQuMUg0MTZWNDhjMC0yNi41LTIxLjUtNDgtNDgtNDhIMTEyQzg1LjUgMCA2NCAyMS41IDY0IDQ4djQ4SDhjLTQuNCAwLTggMy42LTggOHYxNmMwIDQuNCAzLjYgOCA4IDhoMjcyYzQuNCAwIDggMy42IDggOHYxNmMwIDQuNC0zLjYgOC04IDhINDBjLTQuNCAwLTggMy42LTggOHYxNmMwIDQuNCAzLjYgOCA4IDhoMjA4YzQuNCAwIDggMy42IDggOHYxNmMwIDQuNC0zLjYgOC04IDhIOGMtNC40IDAtOCAzLjYtOCA4djE2YzAgNC40IDMuNiA4IDggOGgyMDhjNC40IDAgOCAzLjYgOCA4djE2YzAgNC40LTMuNiA4LTggOEg2NHYxMjhjMCA1MyA0MyA5NiA5NiA5NnM5Ni00MyA5Ni05NmgxMjhjMCA1MyA0MyA5NiA5NiA5NnM5Ni00MyA5Ni05Nmg0OGM4LjggMCAxNi03LjIgMTYtMTZ2LTMyYzAtOC44LTcuMi0xNi0xNi0xNnpNMTYwIDQ2NGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhzMjEuNS00OCA0OC00OCA0OCAyMS41IDQ4IDQ4LTIxLjUgNDgtNDggNDh6bTMyMCAwYy0yNi41IDAtNDgtMjEuNS00OC00OHMyMS41LTQ4IDQ4LTQ4IDQ4IDIxLjUgNDggNDgtMjEuNSA0OC00OCA0OHptODAtMjA4SDQxNlYxNDRoNDQuMWw5OS45IDk5LjlWMjU2eiJdfSxjZj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJzaG9wcGluZy1jYXJ0IixpY29uOls1NzYsNTEyLFtdLCJmMDdhIiwiTTUyOC4xMiAzMDEuMzE5bDQ3LjI3My0yMDhDNTc4LjgwNiA3OC4zMDEgNTY3LjM5MSA2NCA1NTEuOTkgNjRIMTU5LjIwOGwtOS4xNjYtNDQuODFDMTQ3Ljc1OCA4LjAyMSAxMzcuOTMgMCAxMjYuNTI5IDBIMjRDMTAuNzQ1IDAgMCAxMC43NDUgMCAyNHYxNmMwIDEzLjI1NSAxMC43NDUgMjQgMjQgMjRoNjkuODgzbDcwLjI0OCAzNDMuNDM1QzE0Ny4zMjUgNDE3LjEgMTM2IDQzNS4yMjIgMTM2IDQ1NmMwIDMwLjkyOCAyNS4wNzIgNTYgNTYgNTZzNTYtMjUuMDcyIDU2LTU2YzAtMTUuNjc0LTYuNDQ3LTI5LjgzNS0xNi44MjQtNDBoMjA5LjY0N0M0MzAuNDQ3IDQyNi4xNjUgNDI0IDQ0MC4zMjYgNDI0IDQ1NmMwIDMwLjkyOCAyNS4wNzIgNTYgNTYgNTZzNTYtMjUuMDcyIDU2LTU2YzAtMjIuMTcyLTEyLjg4OC00MS4zMzItMzEuNTc5LTUwLjQwNWw1LjUxNy0yNC4yNzZjMy40MTMtMTUuMDE4LTguMDAyLTI5LjMxOS0yMy40MDMtMjkuMzE5SDIxOC4xMTdsLTYuNTQ1LTMyaDI5My4xNDVjMTEuMjA2IDAgMjAuOTItNy43NTQgMjMuNDAzLTE4LjY4MXoiXX0sc2Y9e3ByZWZpeDoiZmFzIixpY29uTmFtZToic2lnbi1pbi1hbHQiLGljb246WzUxMiw1MTIsW10sImYyZjYiLCJNNDE2IDQ0OGgtODRjLTYuNiAwLTEyLTUuNC0xMi0xMnYtNDBjMC02LjYgNS40LTEyIDEyLTEyaDg0YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjE2MGMwLTE3LjctMTQuMy0zMi0zMi0zMmgtODRjLTYuNiAwLTEyLTUuNC0xMi0xMlY3NmMwLTYuNiA1LjQtMTIgMTItMTJoODRjNTMgMCA5NiA0MyA5NiA5NnYxOTJjMCA1My00MyA5Ni05NiA5NnptLTQ3LTIwMUwyMDEgNzljLTE1LTE1LTQxLTQuNS00MSAxN3Y5NkgyNGMtMTMuMyAwLTI0IDEwLjctMjQgMjR2OTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRoMTM2djk2YzAgMjEuNSAyNiAzMiA0MSAxN2wxNjgtMTY4YzkuMy05LjQgOS4zLTI0LjYgMC0zNHoiXX0sbGY9e3ByZWZpeDoiZmFzIixpY29uTmFtZToic2lnbi1vdXQtYWx0IixpY29uOls1MTIsNTEyLFtdLCJmMmY1IiwiTTQ5NyAyNzNMMzI5IDQ0MWMtMTUgMTUtNDEgNC41LTQxLTE3di05NkgxNTJjLTEzLjMgMC0yNC0xMC43LTI0LTI0di05NmMwLTEzLjMgMTAuNy0yNCAyNC0yNGgxMzZWODhjMC0yMS40IDI1LjktMzIgNDEtMTdsMTY4IDE2OGM5LjMgOS40IDkuMyAyNC42IDAgMzR6TTE5MiA0MzZ2LTQwYzAtNi42LTUuNC0xMi0xMi0xMkg5NmMtMTcuNyAwLTMyLTE0LjMtMzItMzJWMTYwYzAtMTcuNyAxNC4zLTMyIDMyLTMyaDg0YzYuNiAwIDEyLTUuNCAxMi0xMlY3NmMwLTYuNi01LjQtMTItMTItMTJIOTZjLTUzIDAtOTYgNDMtOTYgOTZ2MTkyYzAgNTMgNDMgOTYgOTYgOTZoODRjNi42IDAgMTItNS40IDEyLTEyeiJdfSx1Mz17cHJlZml4OiJmYXMiLGljb25OYW1lOiJzdGFyIixpY29uOls1NzYsNTEyLFtdLCJmMDA1IiwiTTI1OS4zIDE3LjhMMTk0IDE1MC4yIDQ3LjkgMTcxLjVjLTI2LjIgMy44LTM2LjcgMzYuMS0xNy43IDU0LjZsMTA1LjcgMTAzLTI1IDE0NS41Yy00LjUgMjYuMyAyMy4yIDQ2IDQ2LjQgMzMuN0wyODggNDM5LjZsMTMwLjcgNjguN2MyMy4yIDEyLjIgNTAuOS03LjQgNDYuNC0zMy43bC0yNS0xNDUuNSAxMDUuNy0xMDNjMTktMTguNSA4LjUtNTAuOC0xNy43LTU0LjZMMzgyIDE1MC4yIDMxNi43IDE3LjhjLTExLjctMjMuNi00NS42LTIzLjktNTcuNCAweiJdfSxkZj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJzdGlja3ktbm90ZSIsaWNvbjpbNDQ4LDUxMixbXSwiZjI0OSIsIk0zMTIgMzIwaDEzNlY1NmMwLTEzLjMtMTAuNy0yNC0yNC0yNEgyNEMxMC43IDMyIDAgNDIuNyAwIDU2djQwMGMwIDEzLjMgMTAuNyAyNCAyNCAyNGgyNjRWMzQ0YzAtMTMuMiAxMC44LTI0IDI0LTI0em0xMjkgNTVsLTk4IDk4Yy00LjUgNC41LTEwLjYgNy0xNyA3aC02VjM1MmgxMjh2Ni4xYzAgNi4zLTIuNSAxMi40LTcgMTYuOXoiXX0sbWY9e3ByZWZpeDoiZmFzIixpY29uTmFtZToic3luYyIsaWNvbjpbNTEyLDUxMixbXSwiZjAyMSIsIk00NDAuNjUgMTIuNTdsNCA4Mi43N0EyNDcuMTYgMjQ3LjE2IDAgMCAwIDI1NS44MyA4QzEzNC43MyA4IDMzLjkxIDk0LjkyIDEyLjI5IDIwOS44MkExMiAxMiAwIDAgMCAyNC4wOSAyMjRoNDkuMDVhMTIgMTIgMCAwIDAgMTEuNjctOS4yNiAxNzUuOTEgMTc1LjkxIDAgMCAxIDMxNy01Ni45NGwtMTAxLjQ2LTQuODZhMTIgMTIgMCAwIDAtMTIuNTcgMTJ2NDcuNDFhMTIgMTIgMCAwIDAgMTIgMTJINTAwYTEyIDEyIDAgMCAwIDEyLTEyVjEyYTEyIDEyIDAgMCAwLTEyLTEyaC00Ny4zN2ExMiAxMiAwIDAgMC0xMS45OCAxMi41N3pNMjU1LjgzIDQzMmExNzUuNjEgMTc1LjYxIDAgMCAxLTE0Ni03Ny44bDEwMS44IDQuODdhMTIgMTIgMCAwIDAgMTIuNTctMTJ2LTQ3LjRhMTIgMTIgMCAwIDAtMTItMTJIMTJhMTIgMTIgMCAwIDAtMTIgMTJWNTAwYTEyIDEyIDAgMCAwIDEyIDEyaDQ3LjM1YTEyIDEyIDAgMCAwIDEyLTEyLjZsLTQuMTUtODIuNTdBMjQ3LjE3IDI0Ny4xNyAwIDAgMCAyNTUuODMgNTA0YzEyMS4xMSAwIDIyMS45My04Ni45MiAyNDMuNTUtMjAxLjgyYTEyIDEyIDAgMCAwLTExLjgtMTQuMThoLTQ5LjA1YTEyIDEyIDAgMCAwLTExLjY3IDkuMjZBMTc1Ljg2IDE3NS44NiAwIDAgMSAyNTUuODMgNDMyeiJdfSxoZj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJ0aGVybW9tZXRlci1lbXB0eSIsaWNvbjpbMjU2LDUxMixbXSwiZjJjYiIsIk0xOTIgMzg0YzAgMzUuMzQ2LTI4LjY1NCA2NC02NCA2NHMtNjQtMjguNjU0LTY0LTY0YzAtMzUuMzQ2IDI4LjY1NC02NCA2NC02NHM2NCAyOC42NTQgNjQgNjR6bTMyLTg0LjY1M2MxOS45MTIgMjIuNTYzIDMyIDUyLjE5NCAzMiA4NC42NTMgMCA3MC42OTYtNTcuMzAzIDEyOC0xMjggMTI4LS4yOTkgMC0uNjA5LS4wMDEtLjkwOS0uMDAzQzU2Ljc4OSA1MTEuNTA5LS4zNTcgNDUzLjYzNi4wMDIgMzgzLjMzMy4xNjYgMzUxLjEzNSAxMi4yMjUgMzIxLjc1NSAzMiAyOTkuMzQ3Vjk2YzAtNTMuMDE5IDQyLjk4MS05NiA5Ni05NnM5NiA0Mi45ODEgOTYgOTZ2MjAzLjM0N3pNMjA4IDM4NGMwLTM0LjMzOS0xOS4zNy01Mi4xOS0zMi02Ni41MDJWOTZjMC0yNi40NjctMjEuNTMzLTQ4LTQ4LTQ4UzgwIDY5LjUzMyA4MCA5NnYyMjEuNDk4Yy0xMi43MzIgMTQuNDI4LTMxLjgyNSAzMi4xLTMxLjk5OSA2Ni4wOC0uMjI0IDQzLjg3NiAzNS41NjMgODAuMTE2IDc5LjQyMyA4MC40MkwxMjggNDY0YzQ0LjExMiAwIDgwLTM1Ljg4OCA4MC04MHoiXX0scGY9e3ByZWZpeDoiZmFzIixpY29uTmFtZToidGhlcm1vbWV0ZXItZnVsbCIsaWNvbjpbMjU2LDUxMixbXSwiZjJjNyIsIk0yMjQgOTZjMC01My4wMTktNDIuOTgxLTk2LTk2LTk2UzMyIDQyLjk4MSAzMiA5NnYyMDMuMzQ3QzEyLjIyNSAzMjEuNzU2LjE2NiAzNTEuMTM2LjAwMiAzODMuMzMzYy0uMzU5IDcwLjMwMyA1Ni43ODcgMTI4LjE3NiAxMjcuMDg5IDEyOC42NjQuMjk5LjAwMi42MS4wMDMuOTA5LjAwMyA3MC42OTggMCAxMjgtNTcuMzA0IDEyOC0xMjggMC0zMi40NTktMTIuMDg4LTYyLjA5LTMyLTg0LjY1M1Y5NnptLTk2IDM2OGwtLjU3Ni0uMDAyYy00My44Ni0uMzA0LTc5LjY0Ny0zNi41NDQtNzkuNDIzLTgwLjQyLjE3My0zMy45OCAxOS4yNjYtNTEuNjUyIDMxLjk5OS02Ni4wOFY5NmMwLTI2LjQ2NyAyMS41MzMtNDggNDgtNDhzNDggMjEuNTMzIDQ4IDQ4djIyMS40OThjMTIuNjMgMTQuMzEyIDMyIDMyLjE2NCAzMiA2Ni41MDIgMCA0NC4xMTItMzUuODg4IDgwLTgwIDgwem02NC04MGMwIDM1LjM0Ni0yOC42NTQgNjQtNjQgNjRzLTY0LTI4LjY1NC02NC02NGMwLTIzLjY4NSAxMi44NzYtNDQuMzQ5IDMyLTU1LjQxN1Y5NmMwLTE3LjY3MyAxNC4zMjctMzIgMzItMzJzMzIgMTQuMzI3IDMyIDMydjIzMi41ODNjMTkuMTI0IDExLjA2OCAzMiAzMS43MzIgMzIgNTUuNDE3eiJdfSxmZj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJ0aGVybW9tZXRlci1oYWxmIixpY29uOlsyNTYsNTEyLFtdLCJmMmM5IiwiTTE5MiAzODRjMCAzNS4zNDYtMjguNjU0IDY0LTY0IDY0cy02NC0yOC42NTQtNjQtNjRjMC0yMy42ODUgMTIuODc2LTQ0LjM0OSAzMi01NS40MTdWMjI0YzAtMTcuNjczIDE0LjMyNy0zMiAzMi0zMnMzMiAxNC4zMjcgMzIgMzJ2MTA0LjU4M2MxOS4xMjQgMTEuMDY4IDMyIDMxLjczMiAzMiA1NS40MTd6bTMyLTg0LjY1M2MxOS45MTIgMjIuNTYzIDMyIDUyLjE5NCAzMiA4NC42NTMgMCA3MC42OTYtNTcuMzAzIDEyOC0xMjggMTI4LS4yOTkgMC0uNjA5LS4wMDEtLjkwOS0uMDAzQzU2Ljc4OSA1MTEuNTA5LS4zNTcgNDUzLjYzNi4wMDIgMzgzLjMzMy4xNjYgMzUxLjEzNSAxMi4yMjUgMzIxLjc1NSAzMiAyOTkuMzQ3Vjk2YzAtNTMuMDE5IDQyLjk4MS05NiA5Ni05NnM5NiA0Mi45ODEgOTYgOTZ2MjAzLjM0N3pNMjA4IDM4NGMwLTM0LjMzOS0xOS4zNy01Mi4xOS0zMi02Ni41MDJWOTZjMC0yNi40NjctMjEuNTMzLTQ4LTQ4LTQ4UzgwIDY5LjUzMyA4MCA5NnYyMjEuNDk4Yy0xMi43MzIgMTQuNDI4LTMxLjgyNSAzMi4xLTMxLjk5OSA2Ni4wOC0uMjI0IDQzLjg3NiAzNS41NjMgODAuMTE2IDc5LjQyMyA4MC40MkwxMjggNDY0YzQ0LjExMiAwIDgwLTM1Ljg4OCA4MC04MHoiXX0sdWY9e3ByZWZpeDoiZmFzIixpY29uTmFtZToidGhlcm1vbWV0ZXItcXVhcnRlciIsaWNvbjpbMjU2LDUxMixbXSwiZjJjYSIsIk0xOTIgMzg0YzAgMzUuMzQ2LTI4LjY1NCA2NC02NCA2NHMtNjQtMjguNjU0LTY0LTY0YzAtMjMuNjg1IDEyLjg3Ni00NC4zNDkgMzItNTUuNDE3VjI4OGMwLTE3LjY3MyAxNC4zMjctMzIgMzItMzJzMzIgMTQuMzI3IDMyIDMydjQwLjU4M2MxOS4xMjQgMTEuMDY4IDMyIDMxLjczMiAzMiA1NS40MTd6bTMyLTg0LjY1M2MxOS45MTIgMjIuNTYzIDMyIDUyLjE5NCAzMiA4NC42NTMgMCA3MC42OTYtNTcuMzAzIDEyOC0xMjggMTI4LS4yOTkgMC0uNjA5LS4wMDEtLjkwOS0uMDAzQzU2Ljc4OSA1MTEuNTA5LS4zNTcgNDUzLjYzNi4wMDIgMzgzLjMzMy4xNjYgMzUxLjEzNSAxMi4yMjUgMzIxLjc1NSAzMiAyOTkuMzQ3Vjk2YzAtNTMuMDE5IDQyLjk4MS05NiA5Ni05NnM5NiA0Mi45ODEgOTYgOTZ2MjAzLjM0N3pNMjA4IDM4NGMwLTM0LjMzOS0xOS4zNy01Mi4xOS0zMi02Ni41MDJWOTZjMC0yNi40NjctMjEuNTMzLTQ4LTQ4LTQ4UzgwIDY5LjUzMyA4MCA5NnYyMjEuNDk4Yy0xMi43MzIgMTQuNDI4LTMxLjgyNSAzMi4xLTMxLjk5OSA2Ni4wOC0uMjI0IDQzLjg3NiAzNS41NjMgODAuMTE2IDc5LjQyMyA4MC40MkwxMjggNDY0YzQ0LjExMiAwIDgwLTM1Ljg4OCA4MC04MHoiXX0sZ2Y9e3ByZWZpeDoiZmFzIixpY29uTmFtZToidGhlcm1vbWV0ZXItdGhyZWUtcXVhcnRlcnMiLGljb246WzI1Niw1MTIsW10sImYyYzgiLCJNMTkyIDM4NGMwIDM1LjM0Ni0yOC42NTQgNjQtNjQgNjQtMzUuMzQ2IDAtNjQtMjguNjU0LTY0LTY0IDAtMjMuNjg1IDEyLjg3Ni00NC4zNDkgMzItNTUuNDE3VjE2MGMwLTE3LjY3MyAxNC4zMjctMzIgMzItMzJzMzIgMTQuMzI3IDMyIDMydjE2OC41ODNjMTkuMTI0IDExLjA2OCAzMiAzMS43MzIgMzIgNTUuNDE3em0zMi04NC42NTNjMTkuOTEyIDIyLjU2MyAzMiA1Mi4xOTQgMzIgODQuNjUzIDAgNzAuNjk2LTU3LjMwMyAxMjgtMTI4IDEyOC0uMjk5IDAtLjYwOS0uMDAxLS45MDktLjAwM0M1Ni43ODkgNTExLjUwOS0uMzU3IDQ1My42MzYuMDAyIDM4My4zMzMuMTY2IDM1MS4xMzUgMTIuMjI1IDMyMS43NTUgMzIgMjk5LjM0N1Y5NmMwLTUzLjAxOSA0Mi45ODEtOTYgOTYtOTZzOTYgNDIuOTgxIDk2IDk2djIwMy4zNDd6TTIwOCAzODRjMC0zNC4zMzktMTkuMzctNTIuMTktMzItNjYuNTAyVjk2YzAtMjYuNDY3LTIxLjUzMy00OC00OC00OFM4MCA2OS41MzMgODAgOTZ2MjIxLjQ5OGMtMTIuNzMyIDE0LjQyOC0zMS44MjUgMzIuMS0zMS45OTkgNjYuMDgtLjIyNCA0My44NzYgMzUuNTYzIDgwLjExNiA3OS40MjMgODAuNDJMMTI4IDQ2NGM0NC4xMTIgMCA4MC0zNS44ODggODAtODB6Il19LGczPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InRodW1icy11cCIsaWNvbjpbNTEyLDUxMixbXSwiZjE2NCIsIk0xMDQgMjI0SDI0Yy0xMy4yNTUgMC0yNCAxMC43NDUtMjQgMjR2MjQwYzAgMTMuMjU1IDEwLjc0NSAyNCAyNCAyNGg4MGMxMy4yNTUgMCAyNC0xMC43NDUgMjQtMjRWMjQ4YzAtMTMuMjU1LTEwLjc0NS0yNC0yNC0yNHpNNjQgNDcyYy0xMy4yNTUgMC0yNC0xMC43NDUtMjQtMjRzMTAuNzQ1LTI0IDI0LTI0IDI0IDEwLjc0NSAyNCAyNC0xMC43NDUgMjQtMjQgMjR6TTM4NCA4MS40NTJjMCA0Mi40MTYtMjUuOTcgNjYuMjA4LTMzLjI3NyA5NC41NDhoMTAxLjcyM2MzMy4zOTcgMCA1OS4zOTcgMjcuNzQ2IDU5LjU1MyA1OC4wOTguMDg0IDE3LjkzOC03LjU0NiAzNy4yNDktMTkuNDM5IDQ5LjE5N2wtLjExLjExYzkuODM2IDIzLjMzNyA4LjIzNyA1Ni4wMzctOS4zMDggNzkuNDY5IDguNjgxIDI1Ljg5NS0uMDY5IDU3LjcwNC0xNi4zODIgNzQuNzU3IDQuMjk4IDE3LjU5OCAyLjI0NCAzMi41NzUtNi4xNDggNDQuNjMyQzQ0MC4yMDIgNTExLjU4NyAzODkuNjE2IDUxMiAzNDYuODM5IDUxMmwtMi44NDUtLjAwMWMtNDguMjg3LS4wMTctODcuODA2LTE3LjU5OC0xMTkuNTYtMzEuNzI1LTE1Ljk1Ny03LjA5OS0zNi44MjEtMTUuODg3LTUyLjY1MS0xNi4xNzgtNi41NC0uMTItMTEuNzgzLTUuNDU3LTExLjc4My0xMS45OTh2LTIxMy43N2MwLTMuMiAxLjI4Mi02LjI3MSAzLjU1OC04LjUyMSAzOS42MTQtMzkuMTQ0IDU2LjY0OC04MC41ODcgODkuMTE3LTExMy4xMTEgMTQuODA0LTE0LjgzMiAyMC4xODgtMzcuMjM2IDI1LjM5My01OC45MDJDMjgyLjUxNSAzOS4yOTMgMjkxLjgxNyAwIDMxMiAwYzI0IDAgNzIgOCA3MiA4MS40NTJ6Il19LHZmPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InRpbWVzIixpY29uOlszNTIsNTEyLFtdLCJmMDBkIiwiTTI0Mi43MiAyNTZsMTAwLjA3LTEwMC4wN2MxMi4yOC0xMi4yOCAxMi4yOC0zMi4xOSAwLTQ0LjQ4bC0yMi4yNC0yMi4yNGMtMTIuMjgtMTIuMjgtMzIuMTktMTIuMjgtNDQuNDggMEwxNzYgMTg5LjI4IDc1LjkzIDg5LjIxYy0xMi4yOC0xMi4yOC0zMi4xOS0xMi4yOC00NC40OCAwTDkuMjEgMTExLjQ1Yy0xMi4yOCAxMi4yOC0xMi4yOCAzMi4xOSAwIDQ0LjQ4TDEwOS4yOCAyNTYgOS4yMSAzNTYuMDdjLTEyLjI4IDEyLjI4LTEyLjI4IDMyLjE5IDAgNDQuNDhsMjIuMjQgMjIuMjRjMTIuMjggMTIuMjggMzIuMiAxMi4yOCA0NC40OCAwTDE3NiAzMjIuNzJsMTAwLjA3IDEwMC4wN2MxMi4yOCAxMi4yOCAzMi4yIDEyLjI4IDQ0LjQ4IDBsMjIuMjQtMjIuMjRjMTIuMjgtMTIuMjggMTIuMjgtMzIuMTkgMC00NC40OEwyNDIuNzIgMjU2eiJdfSxfZj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJ0cmFzaC1hbHQiLGljb246WzQ0OCw1MTIsW10sImYyZWQiLCJNMzIgNDY0YTQ4IDQ4IDAgMCAwIDQ4IDQ4aDI4OGE0OCA0OCAwIDAgMCA0OC00OFYxMjhIMzJ6bTI3Mi0yNTZhMTYgMTYgMCAwIDEgMzIgMHYyMjRhMTYgMTYgMCAwIDEtMzIgMHptLTk2IDBhMTYgMTYgMCAwIDEgMzIgMHYyMjRhMTYgMTYgMCAwIDEtMzIgMHptLTk2IDBhMTYgMTYgMCAwIDEgMzIgMHYyMjRhMTYgMTYgMCAwIDEtMzIgMHpNNDMyIDMySDMxMmwtOS40LTE4LjdBMjQgMjQgMCAwIDAgMjgxLjEgMEgxNjYuOGEyMy43MiAyMy43MiAwIDAgMC0yMS40IDEzLjNMMTM2IDMySDE2QTE2IDE2IDAgMCAwIDAgNDh2MzJhMTYgMTYgMCAwIDAgMTYgMTZoNDE2YTE2IDE2IDAgMCAwIDE2LTE2VjQ4YTE2IDE2IDAgMCAwLTE2LTE2eiJdfSxiZj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJ0cm9waHkiLGljb246WzU3Niw1MTIsW10sImYwOTEiLCJNNTUyIDY0SDQ0OFYyNGMwLTEzLjMtMTAuNy0yNC0yNC0yNEgxNTJjLTEzLjMgMC0yNCAxMC43LTI0IDI0djQwSDI0QzEwLjcgNjQgMCA3NC43IDAgODh2NTZjMCAzNS43IDIyLjUgNzIuNCA2MS45IDEwMC43IDMxLjUgMjIuNyA2OS44IDM3LjEgMTEwIDQxLjdDMjAzLjMgMzM4LjUgMjQwIDM2MCAyNDAgMzYwdjcyaC00OGMtMzUuMyAwLTY0IDIwLjctNjQgNTZ2MTJjMCA2LjYgNS40IDEyIDEyIDEyaDI5NmM2LjYgMCAxMi01LjQgMTItMTJ2LTEyYzAtMzUuMy0yOC43LTU2LTY0LTU2aC00OHYtNzJzMzYuNy0yMS41IDY4LjEtNzMuNmM0MC4zLTQuNiA3OC42LTE5IDExMC00MS43IDM5LjMtMjguMyA2MS45LTY1IDYxLjktMTAwLjdWODhjMC0xMy4zLTEwLjctMjQtMjQtMjR6TTk5LjMgMTkyLjhDNzQuOSAxNzUuMiA2NCAxNTUuNiA2NCAxNDR2LTE2aDY0LjJjMSAzMi42IDUuOCA2MS4yIDEyLjggODYuMi0xNS4xLTUuMi0yOS4yLTEyLjQtNDEuNy0yMS40ek01MTIgMTQ0YzAgMTYuMS0xNy43IDM2LjEtMzUuMyA0OC44LTEyLjUgOS0yNi43IDE2LjItNDEuOCAyMS40IDctMjUgMTEuOC01My42IDEyLjgtODYuMkg1MTJ2MTZ6Il19LHYzPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InRydWNrIixpY29uOls2NDAsNTEyLFtdLCJmMGQxIiwiTTYyNCAzNTJoLTE2VjI0My45YzAtMTIuNy01LjEtMjQuOS0xNC4xLTMzLjlMNDk0IDExMC4xYy05LTktMjEuMi0xNC4xLTMzLjktMTQuMUg0MTZWNDhjMC0yNi41LTIxLjUtNDgtNDgtNDhINDhDMjEuNSAwIDAgMjEuNSAwIDQ4djMyMGMwIDI2LjUgMjEuNSA0OCA0OCA0OGgxNmMwIDUzIDQzIDk2IDk2IDk2czk2LTQzIDk2LTk2aDEyOGMwIDUzIDQzIDk2IDk2IDk2czk2LTQzIDk2LTk2aDQ4YzguOCAwIDE2LTcuMiAxNi0xNnYtMzJjMC04LjgtNy4yLTE2LTE2LTE2ek0xNjAgNDY0Yy0yNi41IDAtNDgtMjEuNS00OC00OHMyMS41LTQ4IDQ4LTQ4IDQ4IDIxLjUgNDggNDgtMjEuNSA0OC00OCA0OHptMzIwIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4czIxLjUtNDggNDgtNDggNDggMjEuNSA0OCA0OC0yMS41IDQ4LTQ4IDQ4em04MC0yMDhINDE2VjE0NGg0NC4xbDk5LjkgOTkuOVYyNTZ6Il19LENmPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InRydWNrLWxvYWRpbmciLGljb246WzY0MCw1MTIsW10sImY0ZGUiLCJNNTAuMiAzNzUuNmMyLjMgOC41IDExLjEgMTMuNiAxOS42IDExLjNsMjE2LjQtNThjOC41LTIuMyAxMy42LTExLjEgMTEuMy0xOS42bC00OS43LTE4NS41Yy0yLjMtOC41LTExLjEtMTMuNi0xOS42LTExLjNMMTUxIDEzMy4zbDI0LjggOTIuNy02MS44IDE2LjUtMjQuOC05Mi43LTc3LjMgMjAuN0MzLjQgMTcyLjgtMS43IDE4MS42LjYgMTkwLjFsNDkuNiAxODUuNXpNMzg0IDBjLTE3LjcgMC0zMiAxNC4zLTMyIDMydjMyMy42TDUuOSA0NTBjLTQuMyAxLjItNi44IDUuNi01LjYgOS44bDEyLjYgNDYuM2MxLjIgNC4zIDUuNiA2LjggOS44IDUuNmwzOTMuNy0xMDcuNEM0MTguOCA0NjQuMSA0NjcuNiA1MTIgNTI4IDUxMmM2MS45IDAgMTEyLTUwLjEgMTEyLTExMlYwSDM4NHptMTQ0IDQ0OGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhzMjEuNS00OCA0OC00OCA0OCAyMS41IDQ4IDQ4LTIxLjUgNDgtNDggNDh6Il19LHlmPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InRzaGlydCIsaWNvbjpbNjQwLDUxMixbXSwiZjU1MyIsIk02MzEuMiA5Ni41TDQzNi41IDBDNDE2LjQgMjcuOCAzNzEuOSA0Ny4yIDMyMCA0Ny4yUzIyMy42IDI3LjggMjAzLjUgMEw4LjggOTYuNWMtNy45IDQtMTEuMSAxMy42LTcuMiAyMS41bDU3LjIgMTE0LjVjNCA3LjkgMTMuNiAxMS4xIDIxLjUgNy4ybDU2LjYtMjcuN2MxMC42LTUuMiAyMyAyLjUgMjMgMTQuNFY0ODBjMCAxNy43IDE0LjMgMzIgMzIgMzJoMjU2YzE3LjcgMCAzMi0xNC4zIDMyLTMyVjIyNi4zYzAtMTEuOCAxMi40LTE5LjYgMjMtMTQuNGw1Ni42IDI3LjdjNy45IDQgMTcuNS44IDIxLjUtNy4yTDYzOC4zIDExOGM0LTcuOS44LTE3LjYtNy4xLTIxLjV6Il19LHhmPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InVuaXZlcnNpdHkiLGljb246WzUxMiw1MTIsW10sImYxOWMiLCJNNDk2IDEyOHYxNmE4IDggMCAwIDEtOCA4aC0yNHYxMmMwIDYuNjI3LTUuMzczIDEyLTEyIDEySDYwYy02LjYyNyAwLTEyLTUuMzczLTEyLTEydi0xMkgyNGE4IDggMCAwIDEtOC04di0xNmE4IDggMCAwIDEgNC45NDEtNy4zOTJsMjMyLTg4YTcuOTk2IDcuOTk2IDAgMCAxIDYuMTE4IDBsMjMyIDg4QTggOCAwIDAgMSA0OTYgMTI4em0tMjQgMzA0SDQwYy0xMy4yNTUgMC0yNCAxMC43NDUtMjQgMjR2MTZhOCA4IDAgMCAwIDggOGg0NjRhOCA4IDAgMCAwIDgtOHYtMTZjMC0xMy4yNTUtMTAuNzQ1LTI0LTI0LTI0ek05NiAxOTJ2MTkySDYwYy02LjYyNyAwLTEyIDUuMzczLTEyIDEydjIwaDQxNnYtMjBjMC02LjYyNy01LjM3My0xMi0xMi0xMmgtMzZWMTkyaC02NHYxOTJoLTY0VjE5MmgtNjR2MTkyaC02NFYxOTJIOTZ6Il19LF8zPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6InVubG9jay1hbHQiLGljb246WzQ0OCw1MTIsW10sImYxM2UiLCJNNDAwIDI1NkgxNTJWMTUyLjljMC0zOS42IDMxLjctNzIuNSA3MS4zLTcyLjkgNDAtLjQgNzIuNyAzMi4xIDcyLjcgNzJ2MTZjMCAxMy4zIDEwLjcgMjQgMjQgMjRoMzJjMTMuMyAwIDI0LTEwLjcgMjQtMjR2LTE2QzM3NiA2OCAzMDcuNS0uMyAyMjMuNSAwIDEzOS41LjMgNzIgNjkuNSA3MiAxNTMuNVYyNTZINDhjLTI2LjUgMC00OCAyMS41LTQ4IDQ4djE2MGMwIDI2LjUgMjEuNSA0OCA0OCA0OGgzNTJjMjYuNSAwIDQ4LTIxLjUgNDgtNDhWMzA0YzAtMjYuNS0yMS41LTQ4LTQ4LTQ4ek0yNjQgNDA4YzAgMjIuMS0xNy45IDQwLTQwIDQwcy00MC0xNy45LTQwLTQwdi00OGMwLTIyLjEgMTcuOS00MCA0MC00MHM0MCAxNy45IDQwIDQwdjQ4eiJdfSxNZj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJ1c2VyIixpY29uOls0NDgsNTEyLFtdLCJmMDA3IiwiTTIyNCAyNTZjNzAuNyAwIDEyOC01Ny4zIDEyOC0xMjhTMjk0LjcgMCAyMjQgMCA5NiA1Ny4zIDk2IDEyOHM1Ny4zIDEyOCAxMjggMTI4em04OS42IDMyaC0xNi43Yy0yMi4yIDEwLjItNDYuOSAxNi03Mi45IDE2cy01MC42LTUuOC03Mi45LTE2aC0xNi43QzYwLjIgMjg4IDAgMzQ4LjIgMCA0MjIuNFY0NjRjMCAyNi41IDIxLjUgNDggNDggNDhoMzUyYzI2LjUgMCA0OC0yMS41IDQ4LTQ4di00MS42YzAtNzQuMi02MC4yLTEzNC40LTEzNC40LTEzNC40eiJdfSx3Zj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJ1c2VyLWNpcmNsZSIsaWNvbjpbNDk2LDUxMixbXSwiZjJiZCIsIk0yNDggOEMxMTEgOCAwIDExOSAwIDI1NnMxMTEgMjQ4IDI0OCAyNDggMjQ4LTExMSAyNDgtMjQ4UzM4NSA4IDI0OCA4em0wIDk2YzQ4LjYgMCA4OCAzOS40IDg4IDg4cy0zOS40IDg4LTg4IDg4LTg4LTM5LjQtODgtODggMzkuNC04OCA4OC04OHptMCAzNDRjLTU4LjcgMC0xMTEuMy0yNi42LTE0Ni41LTY4LjIgMTguOC0zNS40IDU1LjYtNTkuOCA5OC41LTU5LjggMi40IDAgNC44LjQgNy4xIDEuMSAxMyA0LjIgMjYuNiA2LjkgNDAuOSA2LjkgMTQuMyAwIDI4LTIuNyA0MC45LTYuOSAyLjMtLjcgNC43LTEuMSA3LjEtMS4xIDQyLjkgMCA3OS43IDI0LjQgOTguNSA1OS44QzM1OS4zIDQyMS40IDMwNi43IDQ0OCAyNDggNDQ4eiJdfSxTZj17cHJlZml4OiJmYXMiLGljb25OYW1lOiJ1c2VyLWVkaXQiLGljb246WzY0MCw1MTIsW10sImY0ZmYiLCJNMjI0IDI1NmM3MC43IDAgMTI4LTU3LjMgMTI4LTEyOFMyOTQuNyAwIDIyNCAwIDk2IDU3LjMgOTYgMTI4czU3LjMgMTI4IDEyOCAxMjh6bTg5LjYgMzJoLTE2LjdjLTIyLjIgMTAuMi00Ni45IDE2LTcyLjkgMTZzLTUwLjYtNS44LTcyLjktMTZoLTE2LjdDNjAuMiAyODggMCAzNDguMiAwIDQyMi40VjQ2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGgyNzQuOWMtMi40LTYuOC0zLjQtMTQtMi42LTIxLjNsNi44LTYwLjkgMS4yLTExLjEgNy45LTcuOSA3Ny4zLTc3LjNjLTI0LjUtMjcuNy02MC00NS41LTk5LjktNDUuNXptNDUuMyAxNDUuM2wtNi44IDYxYy0xLjEgMTAuMiA3LjUgMTguOCAxNy42IDE3LjZsNjAuOS02LjggMTM3LjktMTM3LjktNzEuNy03MS43LTEzNy45IDEzNy44ek02MzMgMjY4LjlMNTk1LjEgMjMxYy05LjMtOS4zLTI0LjUtOS4zLTMzLjggMGwtMzcuOCAzNy44LTQuMSA0LjEgNzEuOCA3MS43IDQxLjgtNDEuOGM5LjMtOS40IDkuMy0yNC41IDAtMzMuOXoiXX0sa2Y9e3ByZWZpeDoiZmFzIixpY29uTmFtZToidXNlci1wbHVzIixpY29uOls2NDAsNTEyLFtdLCJmMjM0IiwiTTYyNCAyMDhoLTY0di02NGMwLTguOC03LjItMTYtMTYtMTZoLTMyYy04LjggMC0xNiA3LjItMTYgMTZ2NjRoLTY0Yy04LjggMC0xNiA3LjItMTYgMTZ2MzJjMCA4LjggNy4yIDE2IDE2IDE2aDY0djY0YzAgOC44IDcuMiAxNiAxNiAxNmgzMmM4LjggMCAxNi03LjIgMTYtMTZ2LTY0aDY0YzguOCAwIDE2LTcuMiAxNi0xNnYtMzJjMC04LjgtNy4yLTE2LTE2LTE2em0tNDAwIDQ4YzcwLjcgMCAxMjgtNTcuMyAxMjgtMTI4UzI5NC43IDAgMjI0IDAgOTYgNTcuMyA5NiAxMjhzNTcuMyAxMjggMTI4IDEyOHptODkuNiAzMmgtMTYuN2MtMjIuMiAxMC4yLTQ2LjkgMTYtNzIuOSAxNnMtNTAuNi01LjgtNzIuOS0xNmgtMTYuN0M2MC4yIDI4OCAwIDM0OC4yIDAgNDIyLjRWNDY0YzAgMjYuNSAyMS41IDQ4IDQ4IDQ4aDM1MmMyNi41IDAgNDgtMjEuNSA0OC00OHYtNDEuNmMwLTc0LjItNjAuMi0xMzQuNC0xMzQuNC0xMzQuNHoiXX0semY9e3ByZWZpeDoiZmFzIixpY29uTmFtZToidXNlci1zZWNyZXQiLGljb246WzQ0OCw1MTIsW10sImYyMWIiLCJNMzgzLjkgMzA4LjNsMjMuOS02Mi42YzQtMTAuNS0zLjctMjEuNy0xNS0yMS43aC01OC41YzExLTE4LjkgMTcuOC00MC42IDE3LjgtNjR2LS4zYzM5LjItNy44IDY0LTE5LjEgNjQtMzEuNyAwLTEzLjMtMjcuMy0yNS4xLTcwLjEtMzMtOS4yLTMyLjgtMjctNjUuOC00MC42LTgyLjgtOS41LTExLjktMjUuOS0xNS42LTM5LjUtOC44bC0yNy42IDEzLjhjLTkgNC41LTE5LjYgNC41LTI4LjYgMEwxODIuMSAzLjRjLTEzLjYtNi44LTMwLTMuMS0zOS41IDguOC0xMy41IDE3LTMxLjQgNTAtNDAuNiA4Mi44LTQyLjcgNy45LTcwIDE5LjctNzAgMzMgMCAxMi42IDI0LjggMjMuOSA2NCAzMS43di4zYzAgMjMuNCA2LjggNDUuMSAxNy44IDY0SDU2LjNjLTExLjUgMC0xOS4yIDExLjctMTQuNyAyMi4zbDI1LjggNjAuMkMyNy4zIDMyOS44IDAgMzcyLjcgMCA0MjIuNHY0NC44QzAgNDkxLjkgMjAuMSA1MTIgNDQuOCA1MTJoMzU4LjRjMjQuNyAwIDQ0LjgtMjAuMSA0NC44LTQ0Ljh2LTQ0LjhjMC00OC40LTI1LjgtOTAuNC02NC4xLTExNC4xek0xNzYgNDgwbC00MS42LTE5MiA0OS42IDMyIDI0IDQwLTMyIDEyMHptOTYgMGwtMzItMTIwIDI0LTQwIDQ5LjYtMzJMMjcyIDQ4MHptNDEuNy0yOTguNWMtMy45IDExLjktNyAyNC42LTE2LjUgMzMuNC0xMC4xIDkuMy00OCAyMi40LTY0LTI1LTIuOC04LjQtMTUuNC04LjQtMTguMyAwLTE3IDUwLjItNTYgMzIuNC02NCAyNS05LjUtOC44LTEyLjctMjEuNS0xNi41LTMzLjQtLjgtMi41LTYuMy01LjctNi4zLTUuOHYtMTAuOGMyOC4zIDMuNiA2MSA1LjggOTYgNS44czY3LjctMi4xIDk2LTUuOHYxMC44Yy0uMS4xLTUuNiAzLjItNi40IDUuOHoiXX0sVGY9e3ByZWZpeDoiZmFzIixpY29uTmFtZToidXNlci1zbGFzaCIsaWNvbjpbNjQwLDUxMixbXSwiZjUwNiIsIk02MzMuOCA0NTguMUwzNjIuMyAyNDguM0M0MTIuMSAyMzAuNyA0NDggMTgzLjggNDQ4IDEyOCA0NDggNTcuMyAzOTAuNyAwIDMyMCAwYy02Ny4xIDAtMTIxLjUgNTEuOC0xMjYuOSAxMTcuNEw0NS41IDMuNEMzOC41LTIgMjguNS0uOCAyMyA2LjJMMy40IDMxLjRjLTUuNCA3LTQuMiAxNyAyLjggMjIuNGw1ODguNCA0NTQuN2M3IDUuNCAxNyA0LjIgMjIuNS0yLjhsMTkuNi0yNS4zYzUuNC02LjggNC4xLTE2LjktMi45LTIyLjN6TTk2IDQyMi40VjQ2NGMwIDI2LjUgMjEuNSA0OCA0OCA0OGgzNTAuMkwyMDcuNCAyOTAuM0MxNDQuMiAzMDEuMyA5NiAzNTYgOTYgNDIyLjR6Il19LEVmPXtwcmVmaXg6ImZhcyIsaWNvbk5hbWU6IndhcmVob3VzZSIsaWNvbjpbNjQwLDUxMixbXSwiZjQ5NCIsIk01MDQgMzUySDEzNi40Yy00LjQgMC04IDMuNi04IDhsLS4xIDQ4YzAgNC40IDMuNiA4IDggOEg1MDRjNC40IDAgOC0zLjYgOC04di00OGMwLTQuNC0zLjYtOC04LTh6bTAgOTZIMTM2LjFjLTQuNCAwLTggMy42LTggOGwtLjEgNDhjMCA0LjQgMy42IDggOCA4aDM2OGM0LjQgMCA4LTMuNiA4LTh2LTQ4YzAtNC40LTMuNi04LTgtOHptMC0xOTJIMTM2LjZjLTQuNCAwLTggMy42LTggOGwtLjEgNDhjMCA0LjQgMy42IDggOCA4SDUwNGM0LjQgMCA4LTMuNiA4LTh2LTQ4YzAtNC40LTMuNi04LTgtOHptMTA2LjUtMTM5TDMzOC40IDMuN2E0OC4xNSA0OC4xNSAwIDAgMC0zNi45IDBMMjkuNSAxMTdDMTEuNyAxMjQuNSAwIDE0MS45IDAgMTYxLjNWNTA0YzAgNC40IDMuNiA4IDggOGg4MGM0LjQgMCA4LTMuNiA4LThWMjU2YzAtMTcuNiAxNC42LTMyIDMyLjYtMzJoMzgyLjhjMTggMCAzMi42IDE0LjQgMzIuNiAzMnYyNDhjMCA0LjQgMy42IDggOCA4aDgwYzQuNCAwIDgtMy42IDgtOFYxNjEuM2MwLTE5LjQtMTEuNy0zNi44LTI5LjUtNDQuM3oiXX19KTt2YXIgQWYsYjMsR3IsRGYsSWYsV3IsU2E9eCgoKT0+e0FmPXtwcmVmaXg6ImZhciIsaWNvbk5hbWU6ImNvbW1lbnQtYWx0IixpY29uOls1MTIsNTEyLFtdLCJmMjdhIiwiTTQ0OCAwSDY0QzI4LjcgMCAwIDI4LjcgMCA2NHYyODhjMCAzNS4zIDI4LjcgNjQgNjQgNjRoOTZ2ODRjMCA3LjEgNS44IDEyIDEyIDEyIDIuNCAwIDQuOS0uNyA3LjEtMi40TDMwNCA0MTZoMTQ0YzM1LjMgMCA2NC0yOC43IDY0LTY0VjY0YzAtMzUuMy0yOC43LTY0LTY0LTY0em0xNiAzNTJjMCA4LjgtNy4yIDE2LTE2IDE2SDI4OGwtMTIuOCA5LjZMMjA4IDQyOHYtNjBINjRjLTguOCAwLTE2LTcuMi0xNi0xNlY2NGMwLTguOCA3LjItMTYgMTYtMTZoMzg0YzguOCAwIDE2IDcuMiAxNiAxNnYyODh6Il19LGIzPXtwcmVmaXg6ImZhciIsaWNvbk5hbWU6ImNvbW1lbnRzIixpY29uOls1NzYsNTEyLFtdLCJmMDg2IiwiTTUzMiAzODYuMmMyNy41LTI3LjEgNDQtNjEuMSA0NC05OC4yIDAtODAtNzYuNS0xNDYuMS0xNzYuMi0xNTcuOUMzNjguMyA3Mi41IDI5NC4zIDMyIDIwOCAzMiA5My4xIDMyIDAgMTAzLjYgMCAxOTJjMCAzNyAxNi41IDcxIDQ0IDk4LjItMTUuMyAzMC43LTM3LjMgNTQuNS0zNy43IDU0LjktNi4zIDYuNy04LjEgMTYuNS00LjQgMjUgMy42IDguNSAxMiAxNCAyMS4yIDE0IDUzLjUgMCA5Ni43LTIwLjIgMTI1LjItMzguOCA5LjIgMi4xIDE4LjcgMy43IDI4LjQgNC45QzIwOC4xIDQwNy42IDI4MS44IDQ0OCAzNjggNDQ4YzIwLjggMCA0MC44LTIuNCA1OS44LTYuOEM0NTYuMyA0NTkuNyA0OTkuNCA0ODAgNTUzIDQ4MGM5LjIgMCAxNy41LTUuNSAyMS4yLTE0IDMuNi04LjUgMS45LTE4LjMtNC40LTI1LS40LS4zLTIyLjUtMjQuMS0zNy44LTU0Ljh6bS0zOTIuOC05Mi4zTDEyMi4xIDMwNWMtMTQuMSA5LjEtMjguNSAxNi4zLTQzLjEgMjEuNCAyLjctNC43IDUuNC05LjcgOC0xNC44bDE1LjUtMzEuMUw3Ny43IDI1NkM2NC4yIDI0Mi42IDQ4IDIyMC43IDQ4IDE5MmMwLTYwLjcgNzMuMy0xMTIgMTYwLTExMnMxNjAgNTEuMyAxNjAgMTEyLTczLjMgMTEyLTE2MCAxMTJjLTE2LjUgMC0zMy0xLjktNDktNS42bC0xOS44LTQuNXpNNDk4LjMgMzUybC0yNC43IDI0LjQgMTUuNSAzMS4xYzIuNiA1LjEgNS4zIDEwLjEgOCAxNC44LTE0LjYtNS4xLTI5LTEyLjMtNDMuMS0yMS40bC0xNy4xLTExLjEtMTkuOSA0LjZjLTE2IDMuNy0zMi41IDUuNi00OSA1LjYtNTQgMC0xMDIuMi0yMC4xLTEzMS4zLTQ5LjdDMzM4IDMzOS41IDQxNiAyNzIuOSA0MTYgMTkyYzAtMy40LS40LTYuNy0uNy0xMEM0NzkuNyAxOTYuNSA1MjggMjM4LjggNTI4IDI4OGMwIDI4LjctMTYuMiA1MC42LTI5LjcgNjR6Il19LEdyPXtwcmVmaXg6ImZhciIsaWNvbk5hbWU6ImVkaXQiLGljb246WzU3Niw1MTIsW10sImYwNDQiLCJNNDAyLjMgMzQ0LjlsMzItMzJjNS01IDEzLjctMS41IDEzLjcgNS43VjQ2NGMwIDI2LjUtMjEuNSA0OC00OCA0OEg0OGMtMjYuNSAwLTQ4LTIxLjUtNDgtNDhWMTEyYzAtMjYuNSAyMS41LTQ4IDQ4LTQ4aDI3My41YzcuMSAwIDEwLjcgOC42IDUuNyAxMy43bC0zMiAzMmMtMS41IDEuNS0zLjUgMi4zLTUuNyAyLjNINDh2MzUyaDM1MlYzNTAuNWMwLTIuMS44LTQuMSAyLjMtNS42em0xNTYuNi0yMDEuOEwyOTYuMyA0MDUuN2wtOTAuNCAxMGMtMjYuMiAyLjktNDguNS0xOS4yLTQ1LjYtNDUuNmwxMC05MC40TDQzMi45IDE3LjFjMjIuOS0yMi45IDU5LjktMjIuOSA4Mi43IDBsNDMuMiA0My4yYzIyLjkgMjIuOSAyMi45IDYwIC4xIDgyLjh6TTQ2MC4xIDE3NEw0MDIgMTE1LjkgMjE2LjIgMzAxLjhsLTcuMyA2NS4zIDY1LjMtNy4zTDQ2MC4xIDE3NHptNjQuOC03OS43bC00My4yLTQzLjJjLTQuMS00LjEtMTAuOC00LjEtMTQuOCAwTDQzNiA4Mmw1OC4xIDU4LjEgMzAuOS0zMC45YzQtNC4yIDQtMTAuOC0uMS0xNC45eiJdfSxEZj17cHJlZml4OiJmYXIiLGljb25OYW1lOiJuZXdzcGFwZXIiLGljb246WzU3Niw1MTIsW10sImYxZWEiLCJNNTUyIDY0SDExMmMtMjAuODU4IDAtMzguNjQzIDEzLjM3Ny00NS4yNDggMzJIMjRjLTEzLjI1NSAwLTI0IDEwLjc0NS0yNCAyNHYyNzJjMCAzMC45MjggMjUuMDcyIDU2IDU2IDU2aDQ5NmMxMy4yNTUgMCAyNC0xMC43NDUgMjQtMjRWODhjMC0xMy4yNTUtMTAuNzQ1LTI0LTI0LTI0ek00OCAzOTJWMTQ0aDE2djI0OGMwIDQuNDExLTMuNTg5IDgtOCA4cy04LTMuNTg5LTgtOHptNDgwIDhIMTExLjQyMmMuMzc0LTIuNjE0LjU3OC01LjI4My41NzgtOFYxMTJoNDE2djI4OHpNMTcyIDI4MGgxMzZjNi42MjcgMCAxMi01LjM3MyAxMi0xMnYtOTZjMC02LjYyNy01LjM3My0xMi0xMi0xMkgxNzJjLTYuNjI3IDAtMTIgNS4zNzMtMTIgMTJ2OTZjMCA2LjYyNyA1LjM3MyAxMiAxMiAxMnptMjgtODBoODB2NDBoLTgwdi00MHptLTQwIDE0MHYtMjRjMC02LjYyNyA1LjM3My0xMiAxMi0xMmgxMzZjNi42MjcgMCAxMiA1LjM3MyAxMiAxMnYyNGMwIDYuNjI3LTUuMzczIDEyLTEyIDEySDE3MmMtNi42MjcgMC0xMi01LjM3My0xMi0xMnptMTkyIDB2LTI0YzAtNi42MjcgNS4zNzMtMTIgMTItMTJoMTA0YzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjRjMCA2LjYyNy01LjM3MyAxMi0xMiAxMkgzNjRjLTYuNjI3IDAtMTItNS4zNzMtMTItMTJ6bTAtMTQ0di0yNGMwLTYuNjI3IDUuMzczLTEyIDEyLTEyaDEwNGM2LjYyNyAwIDEyIDUuMzczIDEyIDEydjI0YzAgNi42MjctNS4zNzMgMTItMTIgMTJIMzY0Yy02LjYyNyAwLTEyLTUuMzczLTEyLTEyem0wIDcydi0yNGMwLTYuNjI3IDUuMzczLTEyIDEyLTEyaDEwNGM2LjYyNyAwIDEyIDUuMzczIDEyIDEydjI0YzAgNi42MjctNS4zNzMgMTItMTIgMTJIMzY0Yy02LjYyNyAwLTEyLTUuMzczLTEyLTEyeiJdfSxJZj17cHJlZml4OiJmYXIiLGljb25OYW1lOiJzdGFyIixpY29uOls1NzYsNTEyLFtdLCJmMDA1IiwiTTUyOC4xIDE3MS41TDM4MiAxNTAuMiAzMTYuNyAxNy44Yy0xMS43LTIzLjYtNDUuNi0yMy45LTU3LjQgMEwxOTQgMTUwLjIgNDcuOSAxNzEuNWMtMjYuMiAzLjgtMzYuNyAzNi4xLTE3LjcgNTQuNmwxMDUuNyAxMDMtMjUgMTQ1LjVjLTQuNSAyNi4zIDIzLjIgNDYgNDYuNCAzMy43TDI4OCA0MzkuNmwxMzAuNyA2OC43YzIzLjIgMTIuMiA1MC45LTcuNCA0Ni40LTMzLjdsLTI1LTE0NS41IDEwNS43LTEwM2MxOS0xOC41IDguNS01MC44LTE3LjctNTQuNnpNMzg4LjYgMzEyLjNsMjMuNyAxMzguNEwyODggMzg1LjRsLTEyNC4zIDY1LjMgMjMuNy0xMzguNC0xMDAuNi05OCAxMzktMjAuMiA2Mi4yLTEyNiA2Mi4yIDEyNiAxMzkgMjAuMi0xMDAuNiA5OHoiXX0sV3I9e3ByZWZpeDoiZmFyIixpY29uTmFtZToidHJhc2gtYWx0IixpY29uOls0NDgsNTEyLFtdLCJmMmVkIiwiTTI2OCA0MTZoMjRhMTIgMTIgMCAwIDAgMTItMTJWMTg4YTEyIDEyIDAgMCAwLTEyLTEyaC0yNGExMiAxMiAwIDAgMC0xMiAxMnYyMTZhMTIgMTIgMCAwIDAgMTIgMTJ6TTQzMiA4MGgtODIuNDFsLTM0LTU2LjdBNDggNDggMCAwIDAgMjc0LjQxIDBIMTczLjU5YTQ4IDQ4IDAgMCAwLTQxLjE2IDIzLjNMOTguNDEgODBIMTZBMTYgMTYgMCAwIDAgMCA5NnYxNmExNiAxNiAwIDAgMCAxNiAxNmgxNnYzMzZhNDggNDggMCAwIDAgNDggNDhoMjg4YTQ4IDQ4IDAgMCAwIDQ4LTQ4VjEyOGgxNmExNiAxNiAwIDAgMCAxNi0xNlY5NmExNiAxNiAwIDAgMC0xNi0xNnpNMTcxLjg0IDUwLjkxQTYgNiAwIDAgMSAxNzcgNDhoOTRhNiA2IDAgMCAxIDUuMTUgMi45MUwyOTMuNjEgODBIMTU0LjM5ek0zNjggNDY0SDgwVjEyOGgyODh6bS0yMTItNDhoMjRhMTIgMTIgMCAwIDAgMTItMTJWMTg4YTEyIDEyIDAgMCAwLTEyLTEyaC0yNGExMiAxMiAwIDAgMC0xMiAxMnYyMTZhMTIgMTIgMCAwIDAgMTIgMTJ6Il19fSk7dmFyIExmLFBmLFZmLE9mLEhmLE5mLFJmLEZmLEJmLFFyLGVuPXgoKCk9PntMZj17cHJlZml4OiJmYWIiLGljb25OYW1lOiJiaXRjb2luIixpY29uOls1MTIsNTEyLFtdLCJmMzc5IiwiTTUwNCAyNTZjMCAxMzYuOTY3LTExMS4wMzMgMjQ4LTI0OCAyNDhTOCAzOTIuOTY3IDggMjU2IDExOS4wMzMgOCAyNTYgOHMyNDggMTExLjAzMyAyNDggMjQ4em0tMTQxLjY1MS0zNS4zM2M0LjkzNy0zMi45OTktMjAuMTkxLTUwLjczOS01NC41NS02Mi41NzNsMTEuMTQ2LTQ0LjcwMi0yNy4yMTMtNi43ODEtMTAuODUxIDQzLjUyNGMtNy4xNTQtMS43ODMtMTQuNTAyLTMuNDY0LTIxLjgwMy01LjEzbDEwLjkyOS00My44MS0yNy4xOTgtNi43ODEtMTEuMTUzIDQ0LjY4NmMtNS45MjItMS4zNDktMTEuNzM1LTIuNjgyLTE3LjM3Ny00LjA4NGwuMDMxLS4xNC0zNy41My05LjM3LTcuMjM5IDI5LjA2MnMyMC4xOTEgNC42MjcgMTkuNzY1IDQuOTEzYzExLjAyMiAyLjc1MSAxMy4wMTQgMTAuMDQ0IDEyLjY4IDE1LjgyNWwtMTIuNjk2IDUwLjkyNWMuNzYuMTk0IDEuNzQ0LjQ3MyAyLjgyOS45MDctLjkwNy0uMjI1LTEuODc2LS40NzMtMi44NzYtLjcxM2wtMTcuNzk2IDcxLjMzOGMtMS4zNDkgMy4zNDgtNC43NjcgOC4zNy0xMi40NzEgNi40NjQuMjcxLjM5NS0xOS43OC00LjkzNy0xOS43OC00LjkzN2wtMTMuNTEgMzEuMTQ3IDM1LjQxNCA4LjgyN2M2LjU4OCAxLjY1MSAxMy4wNDUgMy4zNzkgMTkuNCA1LjAwNmwtMTEuMjYyIDQ1LjIxMyAyNy4xODIgNi43ODEgMTEuMTUzLTQ0LjczM2ExMDM4LjIwOSAxMDM4LjIwOSAwIDAgMCAyMS42ODcgNS42MjdsLTExLjExNSA0NC41MjMgMjcuMjEzIDYuNzgxIDExLjI2Mi00NS4xMjhjNDYuNDA0IDguNzgxIDgxLjI5OSA1LjIzOSA5NS45ODYtMzYuNzI3IDExLjgzNi0zMy43OS0uNTg5LTUzLjI4MS0yNS4wMDQtNjUuOTkxIDE3Ljc4LTQuMDk4IDMxLjE3NC0xNS43OTIgMzQuNzQ3LTM5Ljk0OXptLTYyLjE3NyA4Ny4xNzljLTguNDEgMzMuNzktNjUuMzA4IDE1LjUyMy04My43NTUgMTAuOTQzbDE0Ljk0NC01OS44OTljMTguNDQ2IDQuNjAzIDc3LjYgMTMuNzE3IDY4LjgxMSA0OC45NTZ6bTguNDE3LTg3LjY2N2MtNy42NzMgMzAuNzM2LTU1LjAzMSAxNS4xMi03MC4zOTMgMTEuMjkybDEzLjU0OC01NC4zMjdjMTUuMzYzIDMuODI4IDY0LjgzNiAxMC45NzMgNTYuODQ1IDQzLjAzNXoiXX0sUGY9e3ByZWZpeDoiZmFiIixpY29uTmFtZToiZmFjZWJvb2siLGljb246WzUxMiw1MTIsW10sImYwOWEiLCJNNTA0IDI1NkM1MDQgMTE5IDM5MyA4IDI1NiA4UzggMTE5IDggMjU2YzAgMTIzLjc4IDkwLjY5IDIyNi4zOCAyMDkuMjUgMjQ1VjMyNy42OWgtNjNWMjU2aDYzdi01NC42NGMwLTYyLjE1IDM3LTk2LjQ4IDkzLjY3LTk2LjQ4IDI3LjE0IDAgNTUuNTIgNC44NCA1NS41MiA0Ljg0djYxaC0zMS4yOGMtMzAuOCAwLTQwLjQxIDE5LjEyLTQwLjQxIDM4LjczVjI1Nmg2OC43OGwtMTEgNzEuNjloLTU3Ljc4VjUwMUM0MTMuMzEgNDgyLjM4IDUwNCAzNzkuNzggNTA0IDI1NnoiXX0sVmY9e3ByZWZpeDoiZmFiIixpY29uTmFtZToiZ2l0aHViIixpY29uOls0OTYsNTEyLFtdLCJmMDliIiwiTTE2NS45IDM5Ny40YzAgMi0yLjMgMy42LTUuMiAzLjYtMy4zLjMtNS42LTEuMy01LjYtMy42IDAtMiAyLjMtMy42IDUuMi0zLjYgMy0uMyA1LjYgMS4zIDUuNiAzLjZ6bS0zMS4xLTQuNWMtLjcgMiAxLjMgNC4zIDQuMyA0LjkgMi42IDEgNS42IDAgNi4yLTJzLTEuMy00LjMtNC4zLTUuMmMtMi42LS43LTUuNS4zLTYuMiAyLjN6bTQ0LjItMS43Yy0yLjkuNy00LjkgMi42LTQuNiA0LjkuMyAyIDIuOSAzLjMgNS45IDIuNiAyLjktLjcgNC45LTIuNiA0LjYtNC42LS4zLTEuOS0zLTMuMi01LjktMi45ek0yNDQuOCA4QzEwNi4xIDggMCAxMTMuMyAwIDI1MmMwIDExMC45IDY5LjggMjA1LjggMTY5LjUgMjM5LjIgMTIuOCAyLjMgMTcuMy01LjYgMTcuMy0xMi4xIDAtNi4yLS4zLTQwLjQtLjMtNjEuNCAwIDAtNzAgMTUtODQuNy0yOS44IDAgMC0xMS40LTI5LjEtMjcuOC0zNi42IDAgMC0yMi45LTE1LjcgMS42LTE1LjQgMCAwIDI0LjkgMiAzOC42IDI1LjggMjEuOSAzOC42IDU4LjYgMjcuNSA3Mi45IDIwLjkgMi4zLTE2IDguOC0yNy4xIDE2LTMzLjctNTUuOS02LjItMTEyLjMtMTQuMy0xMTIuMy0xMTAuNSAwLTI3LjUgNy42LTQxLjMgMjMuNi01OC45LTIuNi02LjUtMTEuMS0zMy4zIDIuNi02Ny45IDIwLjktNi41IDY5IDI3IDY5IDI3IDIwLTUuNiA0MS41LTguNSA2Mi44LTguNXM0Mi44IDIuOSA2Mi44IDguNWMwIDAgNDguMS0zMy42IDY5LTI3IDEzLjcgMzQuNyA1LjIgNjEuNCAyLjYgNjcuOSAxNiAxNy43IDI1LjggMzEuNSAyNS44IDU4LjkgMCA5Ni41LTU4LjkgMTA0LjItMTE0LjggMTEwLjUgOS4yIDcuOSAxNyAyMi45IDE3IDQ2LjQgMCAzMy43LS4zIDc1LjQtLjMgODMuNiAwIDYuNSA0LjYgMTQuNCAxNy4zIDEyLjFDNDI4LjIgNDU3LjggNDk2IDM2Mi45IDQ5NiAyNTIgNDk2IDExMy4zIDM4My41IDggMjQ0LjggOHpNOTcuMiAzNTIuOWMtMS4zIDEtMSAzLjMuNyA1LjIgMS42IDEuNiAzLjkgMi4zIDUuMiAxIDEuMy0xIDEtMy4zLS43LTUuMi0xLjYtMS42LTMuOS0yLjMtNS4yLTF6bS0xMC44LTguMWMtLjcgMS4zLjMgMi45IDIuMyAzLjkgMS42IDEgMy42LjcgNC4zLS43LjctMS4zLS4zLTIuOS0yLjMtMy45LTItLjYtMy42LS4zLTQuMy43em0zMi40IDM1LjZjLTEuNiAxLjMtMSA0LjMgMS4zIDYuMiAyLjMgMi4zIDUuMiAyLjYgNi41IDEgMS4zLTEuMy43LTQuMy0xLjMtNi4yLTIuMi0yLjMtNS4yLTIuNi02LjUtMXptLTExLjQtMTQuN2MtMS42IDEtMS42IDMuNiAwIDUuOSAxLjYgMi4zIDQuMyAzLjMgNS42IDIuMyAxLjYtMS4zIDEuNi0zLjkgMC02LjItMS40LTIuMy00LTMuMy01LjYtMnoiXX0sT2Y9e3ByZWZpeDoiZmFiIixpY29uTmFtZToiZ29vZ2xlIixpY29uOls0ODgsNTEyLFtdLCJmMWEwIiwiTTQ4OCAyNjEuOEM0ODggNDAzLjMgMzkxLjEgNTA0IDI0OCA1MDQgMTEwLjggNTA0IDAgMzkzLjIgMCAyNTZTMTEwLjggOCAyNDggOGM2Ni44IDAgMTIzIDI0LjUgMTY2LjMgNjQuOWwtNjcuNSA2NC45QzI1OC41IDUyLjYgOTQuMyAxMTYuNiA5NC4zIDI1NmMwIDg2LjUgNjkuMSAxNTYuNiAxNTMuNyAxNTYuNiA5OC4yIDAgMTM1LTcwLjQgMTQwLjgtMTA2LjlIMjQ4di04NS4zaDIzNi4xYzIuMyAxMi43IDMuOSAyNC45IDMuOSA0MS40eiJdfSxIZj17cHJlZml4OiJmYWIiLGljb25OYW1lOiJsZWFucHViIixpY29uOls1NzYsNTEyLFtdLCJmMjEyIiwiTTM4Ni41MzkgMTExLjQ4NWwxNS4wOTYgMjQ4Ljk1NS0xMC45NzktLjI3NWMtMzYuMjMyLS44MjQtNzEuNjQgOC43ODMtMTAyLjY1NyAyNy45OTctMzEuMDE2LTE5LjIxNC02Ni40MjQtMjcuOTk3LTEwMi42NTctMjcuOTk3LTQ1LjU2NCAwLTgyLjA3IDEwLjcwNS0xMjMuNTE2IDI3LjcyM0w5My4xMTcgMTI5LjZjMjguNTQ2LTExLjgwMyA2MS40ODQtMTguMTE1IDkyLjIyNi0xOC4xMTUgNDEuMTczIDAgNzMuODM2IDEzLjE3NSAxMDIuNjU3IDQyLjU0NCAyNy43MjMtMjguMjcxIDU5LjAxMy00MS43MjEgOTguNTM5LTQyLjU0NHpNNTY5LjA3IDQ0OGMtMjUuNTI2IDAtNDcuNDg1LTUuMjE1LTcwLjU0Mi0xNS42NDUtMzQuMzEtMTUuNjQ1LTY5Ljk5My0yNC45NzgtMTA3Ljg3MS0yNC45NzgtMzguOTc3IDAtNzQuOTM0IDEyLjkwMS0xMDIuNjU3IDQwLjYyMy0yNy43MjMtMjcuNzIzLTYzLjY4LTQwLjYyMy0xMDIuNjU3LTQwLjYyMy0zNy44NzggMC03My41NjEgOS4zMzMtMTA3Ljg3MSAyNC45NzhDNTUuMjM5IDQ0Mi4yMzYgMzIuNzMxIDQ0OCA4LjMwMyA0NDhINi45M0w0OS40NzUgOTguODU5Qzg4LjcyNiA3Ni42MjYgMTM2LjQ4NiA2NCAxODEuNzc1IDY0IDIxOC44MyA2NCAyNTYuOTg0IDcxLjY4NSAyODggOTMuMDk1IDMxOS4wMTYgNzEuNjg1IDM1Ny4xNyA2NCAzOTQuMjI1IDY0YzQ1LjI4OSAwIDkzLjA0OSAxMi42MjYgMTMyLjMgMzQuODU5TDU2OS4wNyA0NDh6bS00My4zNjgtNDQuNzQxbC0zNC4wMzYtMjgwLjI0NmMtMzAuNzQyLTEzLjk5OS02Ny4yNDgtMjEuNDEtMTAxLjAwOS0yMS40MS0zOC40MjggMC03NC4zODUgMTIuMDc3LTEwMi42NTcgMzguNzAyLTI4LjI3Mi0yNi42MjUtNjQuMjI4LTM4LjcwMi0xMDIuNjU3LTM4LjcwMi0zMy43NjEgMC03MC4yNjcgNy40MTEtMTAxLjAwOSAyMS40MUw1MC4yOTggNDAzLjI1OWM0Ny4yMTEtMTkuNDg3IDgyLjg5NC0zMy40ODYgMTM1LjA0NS0zMy40ODYgMzcuNjA0IDAgNzAuODE3IDkuNjA2IDEwMi42NTcgMjkuNjQ0IDMxLjg0LTIwLjAzOCA2NS4wNTItMjkuNjQ0IDEwMi42NTctMjkuNjQ0IDUyLjE1MSAwIDg3LjgzNCAxMy45OTkgMTM1LjA0NSAzMy40ODZ6Il19LE5mPXtwcmVmaXg6ImZhYiIsaWNvbk5hbWU6Im1hc3RvZG9uIixpY29uOls0NDgsNTEyLFtdLCJmNGY2IiwiTTQzMyAxNzkuMTFjMC05Ny4yLTYzLjcxLTEyNS43LTYzLjcxLTEyNS43LTYyLjUyLTI4LjctMjI4LjU2LTI4LjQtMjkwLjQ4IDAgMCAwLTYzLjcyIDI4LjUtNjMuNzIgMTI1LjcgMCAxMTUuNy02LjYgMjU5LjQgMTA1LjYzIDI4OS4xIDQwLjUxIDEwLjcgNzUuMzIgMTMgMTAzLjMzIDExLjQgNTAuODEtMi44IDc5LjMyLTE4LjEgNzkuMzItMTguMWwtMS43LTM2LjlzLTM2LjMxIDExLjQtNzcuMTIgMTAuMWMtNDAuNDEtMS40LTgzLTQuNC04OS42My01NGExMDIuNTQgMTAyLjU0IDAgMCAxLS45LTEzLjljODUuNjMgMjAuOSAxNTguNjUgOS4xIDE3OC43NSA2LjcgNTYuMTItNi43IDEwNS00MS4zIDExMS4yMy03Mi45IDkuOC00OS44IDktMTIxLjUgOS0xMjEuNXptLTc1LjEyIDEyNS4yaC00Ni42M3YtMTE0LjJjMC00OS43LTY0LTUxLjYtNjQgNi45djYyLjVoLTQ2LjMzVjE5N2MwLTU4LjUtNjQtNTYuNi02NC02Ljl2MTE0LjJIOTAuMTljMC0xMjIuMS01LjItMTQ3LjkgMTguNDEtMTc1IDI1LjktMjguOSA3OS44Mi0zMC44IDEwMy44MyA2LjFsMTEuNiAxOS41IDExLjYtMTkuNWMyNC4xMS0zNy4xIDc4LjEyLTM0LjggMTAzLjgzLTYuMSAyMy43MSAyNy4zIDE4LjQgNTMgMTguNCAxNzV6Il19LFJmPXtwcmVmaXg6ImZhYiIsaWNvbk5hbWU6InJlZGRpdCIsaWNvbjpbNTEyLDUxMixbXSwiZjFhMSIsIk0yMDEuNSAzMDUuNWMtMTMuOCAwLTI0LjktMTEuMS0yNC45LTI0LjYgMC0xMy44IDExLjEtMjQuOSAyNC45LTI0LjkgMTMuNiAwIDI0LjYgMTEuMSAyNC42IDI0LjkgMCAxMy42LTExLjEgMjQuNi0yNC42IDI0LjZ6TTUwNCAyNTZjMCAxMzctMTExIDI0OC0yNDggMjQ4UzggMzkzIDggMjU2IDExOSA4IDI1NiA4czI0OCAxMTEgMjQ4IDI0OHptLTEzMi4zLTQxLjJjLTkuNCAwLTE3LjcgMy45LTIzLjggMTAtMjIuNC0xNS41LTUyLjYtMjUuNS04Ni4xLTI2LjZsMTcuNC03OC4zIDU1LjQgMTIuNWMwIDEzLjYgMTEuMSAyNC42IDI0LjYgMjQuNiAxMy44IDAgMjQuOS0xMS4zIDI0LjktMjQuOXMtMTEuMS0yNC45LTI0LjktMjQuOWMtOS43IDAtMTggNS44LTIyLjEgMTMuOGwtNjEuMi0xMy42Yy0zLS44LTYuMSAxLjQtNi45IDQuNGwtMTkuMSA4Ni40Yy0zMy4yIDEuNC02My4xIDExLjMtODUuNSAyNi44LTYuMS02LjQtMTQuNy0xMC4yLTI0LjEtMTAuMi0zNC45IDAtNDYuMyA0Ni45LTE0LjQgNjIuOC0xLjEgNS0xLjcgMTAuMi0xLjcgMTUuNSAwIDUyLjYgNTkuMiA5NS4yIDEzMiA5NS4yIDczLjEgMCAxMzIuMy00Mi42IDEzMi4zLTk1LjIgMC01LjMtLjYtMTAuOC0xLjktMTUuOCAzMS4zLTE2IDE5LjgtNjIuNS0xNC45LTYyLjV6TTMwMi44IDMzMWMtMTguMiAxOC4yLTc2LjEgMTcuOS05My42IDAtMi4yLTIuMi02LjEtMi4yLTguMyAwLTIuNSAyLjUtMi41IDYuNCAwIDguNiAyMi44IDIyLjggODcuMyAyMi44IDExMC4yIDAgMi41LTIuMiAyLjUtNi4xIDAtOC42LTIuMi0yLjItNi4xLTIuMi04LjMgMHptNy43LTc1Yy0xMy42IDAtMjQuNiAxMS4xLTI0LjYgMjQuOSAwIDEzLjYgMTEuMSAyNC42IDI0LjYgMjQuNiAxMy44IDAgMjQuOS0xMS4xIDI0LjktMjQuNiAwLTEzLjgtMTEtMjQuOS0yNC45LTI0Ljl6Il19LEZmPXtwcmVmaXg6ImZhYiIsaWNvbk5hbWU6InNsYWNrIixpY29uOls0NDgsNTEyLFtdLCJmMTk4IiwiTTk0LjEyIDMxNS4xYzAgMjUuOS0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNlMwIDM0MSAwIDMxNS4xYzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNmg0Ny4wNnY0Ny4wNnptMjMuNzIgMGMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2MTE3Ljg0YzAgMjUuOS0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNnMtNDcuMDYtMjEuMTYtNDcuMDYtNDcuMDZWMzE1LjF6bTQ3LjA2LTE4OC45OGMtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2UzEzOSAzMiAxNjQuOSAzMnM0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnY0Ny4wNkgxNjQuOXptMCAyMy43MmMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZzLTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2SDQ3LjA2QzIxLjE2IDI0My45NiAwIDIyMi44IDAgMTk2LjlzMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZIMTY0Ljl6bTE4OC45OCA0Ny4wNmMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDYgMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNmgtNDcuMDZWMTk2Ljl6bS0yMy43MiAwYzAgMjUuOS0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNi0yNS45IDAtNDcuMDYtMjEuMTYtNDcuMDYtNDcuMDZWNzkuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNlYxOTYuOXpNMjgzLjEgMzg1Ljg4YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2di00Ny4wNmg0Ny4wNnptMC0yMy43MmMtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2IDAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNmgxMTcuODRjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2IDAgMjUuOS0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkgyODMuMXoiXX0sQmY9e3ByZWZpeDoiZmFiIixpY29uTmFtZToic3RyaXBlIixpY29uOls2NDAsNTEyLFtdLCJmNDI5IiwiTTE2NSAxNDQuN2wtNDMuMyA5LjItLjIgMTQyLjRjMCAyNi4zIDE5LjggNDMuMyA0Ni4xIDQzLjMgMTQuNiAwIDI1LjMtMi43IDMxLjItNS45di0zMy44Yy01LjcgMi4zLTMzLjcgMTAuNS0zMy43LTE1LjdWMjIxaDMzLjd2LTM3LjhoLTMzLjd6bTg5LjEgNTEuNmwtMi43LTEzLjFIMjEzdjE1My4yaDQ0LjNWMjMzLjNjMTAuNS0xMy44IDI4LjItMTEuMSAzMy45LTkuM3YtNDAuOGMtNi0yLjEtMjYuNy02LTM3LjEgMTMuMXptOTIuMy03Mi4zbC00NC42IDkuNXYzNi4ybDQ0LjYtOS41ek00NC45IDIyOC4zYzAtNi45IDUuOC05LjYgMTUuMS05LjcgMTMuNSAwIDMwLjcgNC4xIDQ0LjIgMTEuNHYtNDEuOGMtMTQuNy01LjgtMjkuNC04LjEtNDQuMS04LjEtMzYgMC02MCAxOC44LTYwIDUwLjIgMCA0OS4yIDY3LjUgNDEuMiA2Ny41IDYyLjQgMCA4LjItNy4xIDEwLjktMTcgMTAuOS0xNC43IDAtMzMuNy02LjEtNDguNi0xNC4ydjQwYzE2LjUgNy4xIDMzLjIgMTAuMSA0OC41IDEwLjEgMzYuOSAwIDYyLjMtMTUuOCA2Mi4zLTQ3LjggMC01Mi45LTY3LjktNDMuNC02Ny45LTYzLjR6TTY0MCAyNjEuNmMwLTQ1LjUtMjItODEuNC02NC4yLTgxLjRzLTY3LjkgMzUuOS02Ny45IDgxLjFjMCA1My41IDMwLjMgNzguMiA3My41IDc4LjIgMjEuMiAwIDM3LjEtNC44IDQ5LjItMTEuNXYtMzMuNGMtMTIuMSA2LjEtMjYgOS44LTQzLjYgOS44LTE3LjMgMC0zMi41LTYuMS0zNC41LTI2LjloODYuOWMuMi0yLjMuNi0xMS42LjYtMTUuOXptLTg3LjktMTYuOGMwLTIwIDEyLjMtMjguNCAyMy40LTI4LjQgMTAuOSAwIDIyLjUgOC40IDIyLjUgMjguNHptLTExMi45LTY0LjZjLTE3LjQgMC0yOC42IDguMi0zNC44IDEzLjlsLTIuMy0xMUgzNjN2MjA0LjhsNDQuNC05LjQuMS01MC4yYzYuNCA0LjcgMTUuOSAxMS4yIDMxLjQgMTEuMiAzMS44IDAgNjAuOC0yMy4yIDYwLjgtNzkuNi4xLTUxLjYtMjkuMy03OS43LTYwLjUtNzkuN3ptLTEwLjYgMTIyLjVjLTEwLjQgMC0xNi42LTMuOC0yMC45LTguNGwtLjMtNjZjNC42LTUuMSAxMS04LjggMjEuMi04LjggMTYuMiAwIDI3LjQgMTguMiAyNy40IDQxLjQuMSAyMy45LTEwLjkgNDEuOC0yNy40IDQxLjh6bS0xMjYuNyAzMy43aDQ0LjZWMTgzLjJoLTQ0LjZ6Il19LFFyPXtwcmVmaXg6ImZhYiIsaWNvbk5hbWU6InR3aXR0ZXIiLGljb246WzUxMiw1MTIsW10sImYwOTkiLCJNNDU5LjM3IDE1MS43MTZjLjMyNSA0LjU0OC4zMjUgOS4wOTcuMzI1IDEzLjY0NSAwIDEzOC43Mi0xMDUuNTgzIDI5OC41NTgtMjk4LjU1OCAyOTguNTU4LTU5LjQ1MiAwLTExNC42OC0xNy4yMTktMTYxLjEzNy00Ny4xMDYgOC40NDcuOTc0IDE2LjU2OCAxLjI5OSAyNS4zNCAxLjI5OSA0OS4wNTUgMCA5NC4yMTMtMTYuNTY4IDEzMC4yNzQtNDQuODMyLTQ2LjEzMi0uOTc1LTg0Ljc5Mi0zMS4xODgtOTguMTEyLTcyLjc3MiA2LjQ5OC45NzQgMTIuOTk1IDEuNjI0IDE5LjgxOCAxLjYyNCA5LjQyMSAwIDE4Ljg0My0xLjMgMjcuNjE0LTMuNTczLTQ4LjA4MS05Ljc0Ny04NC4xNDMtNTEuOTgtODQuMTQzLTEwMi45ODV2LTEuMjk5YzEzLjk2OSA3Ljc5NyAzMC4yMTQgMTIuNjcgNDcuNDMxIDEzLjMxOS0yOC4yNjQtMTguODQzLTQ2Ljc4MS01MS4wMDUtNDYuNzgxLTg3LjM5MSAwLTE5LjQ5MiA1LjE5Ny0zNy4zNiAxNC4yOTQtNTIuOTU0IDUxLjY1NSA2My42NzUgMTI5LjMgMTA1LjI1OCAyMTYuMzY1IDEwOS44MDctMS42MjQtNy43OTctMi41OTktMTUuOTE4LTIuNTk5LTI0LjA0IDAtNTcuODI4IDQ2Ljc4Mi0xMDQuOTM0IDEwNC45MzQtMTA0LjkzNCAzMC4yMTMgMCA1Ny41MDIgMTIuNjcgNzYuNjcgMzMuMTM3IDIzLjcxNS00LjU0OCA0Ni40NTYtMTMuMzIgNjYuNTk5LTI1LjM0LTcuNzk4IDI0LjM2Ni0yNC4zNjYgNDQuODMzLTQ2LjEzMiA1Ny44MjcgMjEuMTE3LTIuMjczIDQxLjU4NC04LjEyMiA2MC40MjYtMTYuMjQzLTE0LjI5MiAyMC43OTEtMzIuMTYxIDM5LjMwOC01Mi42MjggNTQuMjUzeiJdfX0pO3ZhciB0bixDMz14KCgpPT57dG49e2N1c3RvbWVyOiJjdXN0b21lciIsZGVsdXhlOiJkZWx1eGUiLGFjY291bnRpbmc6ImFjY291bnRpbmciLGFkbWluOiJhZG1pbiJ9fSk7dmFyIFVmLFZpLHkzLHgzLFlyLEJuPXgoKCk9PntwMSgpO1VmPWRyKEFtKCkpO0MzKCk7aygpO2soKTtWaT0oKCk9PntjbGFzcyB0e3JvdXRlcj1oKHl0KTtuZ1pvbmU9aChyZSk7Y2FuQWN0aXZhdGUoKXtyZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInRva2VuIik/ITA6KHRoaXMuZm9yYmlkUm91dGUoIlVOQVVUSE9SSVpFRF9BQ0NFU1NfRVJST1IiKSwhMSl9Zm9yYmlkUm91dGUoZT0iVU5BVVRIT1JJWkVEX1BBR0VfQUNDRVNTX0VSUk9SIil7dGhpcy5uZ1pvbmUucnVuKCgpPT5QZSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMucm91dGVyLm5hdmlnYXRlKFsiNDAzIl0se3NraXBMb2NhdGlvbkNoYW5nZTohMCxxdWVyeVBhcmFtczp7ZXJyb3I6ZX19KX0pKX10b2tlbkRlY29kZSgpe2xldCBlPW51bGwsaT1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidG9rZW4iKTtpZihpKXRyeXtlPSgwLFVmLmRlZmF1bHQpKGkpfWNhdGNoKGEpe2NvbnNvbGUubG9nKGEpfXJldHVybiBlfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjfSl9cmV0dXJuIHR9KSgpLHkzPSgoKT0+e2NsYXNzIHR7bG9naW5HdWFyZD1oKFZpKTtjYW5BY3RpdmF0ZSgpe2xldCBlPXRoaXMubG9naW5HdWFyZC50b2tlbkRlY29kZSgpO3JldHVybiBlPy5kYXRhJiZlLmRhdGEucm9sZT09PXRuLmFkbWluPyEwOih0aGlzLmxvZ2luR3VhcmQuZm9yYmlkUm91dGUoKSwhMSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWN9KX1yZXR1cm4gdH0pKCkseDM9KCgpPT57Y2xhc3MgdHtsb2dpbkd1YXJkPWgoVmkpO2NhbkFjdGl2YXRlKCl7bGV0IGU9dGhpcy5sb2dpbkd1YXJkLnRva2VuRGVjb2RlKCk7cmV0dXJuIGU/LmRhdGEmJmUuZGF0YS5yb2xlPT09dG4uYWNjb3VudGluZz8hMDoodGhpcy5sb2dpbkd1YXJkLmZvcmJpZFJvdXRlKCksITEpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjfSl9cmV0dXJuIHR9KSgpLFlyPSgoKT0+e2NsYXNzIHR7bG9naW5HdWFyZD1oKFZpKTtpc0RlbHV4ZSgpe2xldCBlPXRoaXMubG9naW5HdWFyZC50b2tlbkRlY29kZSgpO3JldHVybiBlPy5kYXRhJiZlLmRhdGEucm9sZT09PXRuLmRlbHV4ZX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhY30pfXJldHVybiB0fSkoKX0pO3ZhciBBMSxNMyxxaT14KCgpPT57aygpO2dhKCk7eTEoKTtBMT0oKCk9PntjbGFzcyB0e2dldCB2ZXJ0aWNhbCgpe3JldHVybiB0aGlzLl92ZXJ0aWNhbH1zZXQgdmVydGljYWwoZSl7dGhpcy5fdmVydGljYWw9VzEoZSl9X3ZlcnRpY2FsPSExO2dldCBpbnNldCgpe3JldHVybiB0aGlzLl9pbnNldH1zZXQgaW5zZXQoZSl7dGhpcy5faW5zZXQ9VzEoZSl9X2luc2V0PSExO3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1kaXZpZGVyIl1dLGhvc3RBdHRyczpbInJvbGUiLCJzZXBhcmF0b3IiLDEsIm1hdC1kaXZpZGVyIl0saG9zdFZhcnM6Nyxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJihHKCJhcmlhLW9yaWVudGF0aW9uIixhLnZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiKSxpZSgibWF0LWRpdmlkZXItdmVydGljYWwiLGEudmVydGljYWwpKCJtYXQtZGl2aWRlci1ob3Jpem9udGFsIiwhYS52ZXJ0aWNhbCkoIm1hdC1kaXZpZGVyLWluc2V0IixhLmluc2V0KSl9LGlucHV0czp7dmVydGljYWw6InZlcnRpY2FsIixpbnNldDoiaW5zZXQifSxkZWNsczowLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe30sc3R5bGVzOltgLm1hdC1kaXZpZGVye2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyLXRvcC1zdHlsZTpzb2xpZDtib3JkZXItdG9wLWNvbG9yOnZhcigtLW1hdC1kaXZpZGVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW91dGxpbmUtdmFyaWFudCkpO2JvcmRlci10b3Atd2lkdGg6dmFyKC0tbWF0LWRpdmlkZXItd2lkdGgsIDFweCl9Lm1hdC1kaXZpZGVyLm1hdC1kaXZpZGVyLXZlcnRpY2Fse2JvcmRlci10b3A6MDtib3JkZXItcmlnaHQtc3R5bGU6c29saWQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnZhcigtLW1hdC1kaXZpZGVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW91dGxpbmUtdmFyaWFudCkpO2JvcmRlci1yaWdodC13aWR0aDp2YXIoLS1tYXQtZGl2aWRlci13aWR0aCwgMXB4KX0ubWF0LWRpdmlkZXIubWF0LWRpdmlkZXItaW5zZXR7bWFyZ2luLWxlZnQ6ODBweH1bZGlyPXJ0bF0gLm1hdC1kaXZpZGVyLm1hdC1kaXZpZGVyLWluc2V0e21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OjgwcHh9CmBdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxNMz0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NW1vZD14ZSh7dHlwZTp0fSk7c3RhdGljIFx1MDI3NWluaj15ZSh7aW1wb3J0czpbemUsemVdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIFVuLGU4PXgoKCk9PntrKCk7VW49KCgpPT57Y2xhc3MgdHtfbGlzdGVuZXJzPVtdO25vdGlmeShlLGkpe2ZvcihsZXQgYSBvZiB0aGlzLl9saXN0ZW5lcnMpYShlLGkpfWxpc3RlbihlKXtyZXR1cm4gdGhpcy5fbGlzdGVuZXJzLnB1c2goZSksKCk9Pnt0aGlzLl9saXN0ZW5lcnM9dGhpcy5fbGlzdGVuZXJzLmZpbHRlcihpPT5lIT09aSl9fW5nT25EZXN0cm95KCl7dGhpcy5fbGlzdGVuZXJzPVtdfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIHR9KSgpfSk7dmFyIGpuLHQ4PXgoKCk9Pnt5NigpO2puPWNsYXNze2FwcGx5Q2hhbmdlcyhuLGUsaSxhLHIpe24uZm9yRWFjaE9wZXJhdGlvbigobyxkLHApPT57bGV0IGcsXztpZihvLnByZXZpb3VzSW5kZXg9PW51bGwpe2xldCB5PWkobyxkLHApO2c9ZS5jcmVhdGVFbWJlZGRlZFZpZXcoeS50ZW1wbGF0ZVJlZix5LmNvbnRleHQseS5pbmRleCksXz1Bbi5JTlNFUlRFRH1lbHNlIHA9PW51bGw/KGUucmVtb3ZlKGQpLF89QW4uUkVNT1ZFRCk6KGc9ZS5nZXQoZCksZS5tb3ZlKGcscCksXz1Bbi5NT1ZFRCk7ciYmcih7Y29udGV4dDpnPy5jb250ZXh0LG9wZXJhdGlvbjpfLHJlY29yZDpvfSl9KX1kZXRhY2goKXt9fX0pO3ZhciBrYSxqZj14KCgpPT57WHQoKTtrYT1jbGFzc3tfbXVsdGlwbGU7X2VtaXRDaGFuZ2VzO2NvbXBhcmVXaXRoO19zZWxlY3Rpb249bmV3IFNldDtfZGVzZWxlY3RlZFRvRW1pdD1bXTtfc2VsZWN0ZWRUb0VtaXQ9W107X3NlbGVjdGVkO2dldCBzZWxlY3RlZCgpe3JldHVybiB0aGlzLl9zZWxlY3RlZHx8KHRoaXMuX3NlbGVjdGVkPUFycmF5LmZyb20odGhpcy5fc2VsZWN0aW9uLnZhbHVlcygpKSksdGhpcy5fc2VsZWN0ZWR9Y2hhbmdlZD1uZXcgd2U7Y29uc3RydWN0b3Iobj0hMSxlLGk9ITAsYSl7dGhpcy5fbXVsdGlwbGU9bix0aGlzLl9lbWl0Q2hhbmdlcz1pLHRoaXMuY29tcGFyZVdpdGg9YSxlJiZlLmxlbmd0aCYmKG4/ZS5mb3JFYWNoKHI9PnRoaXMuX21hcmtTZWxlY3RlZChyKSk6dGhpcy5fbWFya1NlbGVjdGVkKGVbMF0pLHRoaXMuX3NlbGVjdGVkVG9FbWl0Lmxlbmd0aD0wKX1zZWxlY3QoLi4ubil7dGhpcy5fdmVyaWZ5VmFsdWVBc3NpZ25tZW50KG4pLG4uZm9yRWFjaChpPT50aGlzLl9tYXJrU2VsZWN0ZWQoaSkpO2xldCBlPXRoaXMuX2hhc1F1ZXVlZENoYW5nZXMoKTtyZXR1cm4gdGhpcy5fZW1pdENoYW5nZUV2ZW50KCksZX1kZXNlbGVjdCguLi5uKXt0aGlzLl92ZXJpZnlWYWx1ZUFzc2lnbm1lbnQobiksbi5mb3JFYWNoKGk9PnRoaXMuX3VubWFya1NlbGVjdGVkKGkpKTtsZXQgZT10aGlzLl9oYXNRdWV1ZWRDaGFuZ2VzKCk7cmV0dXJuIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpLGV9c2V0U2VsZWN0aW9uKC4uLm4pe3RoaXMuX3ZlcmlmeVZhbHVlQXNzaWdubWVudChuKTtsZXQgZT10aGlzLnNlbGVjdGVkLGk9bmV3IFNldChuLm1hcChyPT50aGlzLl9nZXRDb25jcmV0ZVZhbHVlKHIpKSk7bi5mb3JFYWNoKHI9PnRoaXMuX21hcmtTZWxlY3RlZChyKSksZS5maWx0ZXIocj0+IWkuaGFzKHRoaXMuX2dldENvbmNyZXRlVmFsdWUocixpKSkpLmZvckVhY2gocj0+dGhpcy5fdW5tYXJrU2VsZWN0ZWQocikpO2xldCBhPXRoaXMuX2hhc1F1ZXVlZENoYW5nZXMoKTtyZXR1cm4gdGhpcy5fZW1pdENoYW5nZUV2ZW50KCksYX10b2dnbGUobil7cmV0dXJuIHRoaXMuaXNTZWxlY3RlZChuKT90aGlzLmRlc2VsZWN0KG4pOnRoaXMuc2VsZWN0KG4pfWNsZWFyKG49ITApe3RoaXMuX3VubWFya0FsbCgpO2xldCBlPXRoaXMuX2hhc1F1ZXVlZENoYW5nZXMoKTtyZXR1cm4gbiYmdGhpcy5fZW1pdENoYW5nZUV2ZW50KCksZX1pc1NlbGVjdGVkKG4pe3JldHVybiB0aGlzLl9zZWxlY3Rpb24uaGFzKHRoaXMuX2dldENvbmNyZXRlVmFsdWUobikpfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLnNpemU9PT0wfWhhc1ZhbHVlKCl7cmV0dXJuIXRoaXMuaXNFbXB0eSgpfXNvcnQobil7dGhpcy5fbXVsdGlwbGUmJnRoaXMuc2VsZWN0ZWQmJnRoaXMuX3NlbGVjdGVkLnNvcnQobil9aXNNdWx0aXBsZVNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9tdWx0aXBsZX1fZW1pdENoYW5nZUV2ZW50KCl7dGhpcy5fc2VsZWN0ZWQ9bnVsbCwodGhpcy5fc2VsZWN0ZWRUb0VtaXQubGVuZ3RofHx0aGlzLl9kZXNlbGVjdGVkVG9FbWl0Lmxlbmd0aCkmJih0aGlzLmNoYW5nZWQubmV4dCh7c291cmNlOnRoaXMsYWRkZWQ6dGhpcy5fc2VsZWN0ZWRUb0VtaXQscmVtb3ZlZDp0aGlzLl9kZXNlbGVjdGVkVG9FbWl0fSksdGhpcy5fZGVzZWxlY3RlZFRvRW1pdD1bXSx0aGlzLl9zZWxlY3RlZFRvRW1pdD1bXSl9X21hcmtTZWxlY3RlZChuKXtuPXRoaXMuX2dldENvbmNyZXRlVmFsdWUobiksdGhpcy5pc1NlbGVjdGVkKG4pfHwodGhpcy5fbXVsdGlwbGV8fHRoaXMuX3VubWFya0FsbCgpLHRoaXMuaXNTZWxlY3RlZChuKXx8dGhpcy5fc2VsZWN0aW9uLmFkZChuKSx0aGlzLl9lbWl0Q2hhbmdlcyYmdGhpcy5fc2VsZWN0ZWRUb0VtaXQucHVzaChuKSl9X3VubWFya1NlbGVjdGVkKG4pe249dGhpcy5fZ2V0Q29uY3JldGVWYWx1ZShuKSx0aGlzLmlzU2VsZWN0ZWQobikmJih0aGlzLl9zZWxlY3Rpb24uZGVsZXRlKG4pLHRoaXMuX2VtaXRDaGFuZ2VzJiZ0aGlzLl9kZXNlbGVjdGVkVG9FbWl0LnB1c2gobikpfV91bm1hcmtBbGwoKXt0aGlzLmlzRW1wdHkoKXx8dGhpcy5fc2VsZWN0aW9uLmZvckVhY2gobj0+dGhpcy5fdW5tYXJrU2VsZWN0ZWQobikpfV92ZXJpZnlWYWx1ZUFzc2lnbm1lbnQobil7bi5sZW5ndGg+MSYmdGhpcy5fbXVsdGlwbGV9X2hhc1F1ZXVlZENoYW5nZXMoKXtyZXR1cm4hISh0aGlzLl9kZXNlbGVjdGVkVG9FbWl0Lmxlbmd0aHx8dGhpcy5fc2VsZWN0ZWRUb0VtaXQubGVuZ3RoKX1fZ2V0Q29uY3JldGVWYWx1ZShuLGUpe2lmKHRoaXMuY29tcGFyZVdpdGgpe2U9ZT8/dGhpcy5fc2VsZWN0aW9uO2ZvcihsZXQgaSBvZiBlKWlmKHRoaXMuY29tcGFyZVdpdGgobixpKSlyZXR1cm4gaTtyZXR1cm4gbn1lbHNlIHJldHVybiBufX19KTt2YXIgcW49eCgoKT0+e2U4KCk7eTYoKTtDbSgpO3Q4KCk7amYoKX0pO3ZhciBERSxJRSxacix3Mz14KCgpPT57aygpO0RFPVsibWF0LWludGVybmFsLWZvcm0tZmllbGQiLCIiXSxJRT1bIioiXSxacj0oKCk9PntjbGFzcyB0e2xhYmVsUG9zaXRpb247c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siZGl2IiwibWF0LWludGVybmFsLWZvcm0tZmllbGQiLCIiXV0saG9zdEF0dHJzOlsxLCJtZGMtZm9ybS1maWVsZCIsIm1hdC1pbnRlcm5hbC1mb3JtLWZpZWxkIl0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJmllKCJtZGMtZm9ybS1maWVsZC0tYWxpZ24tZW5kIixhLmxhYmVsUG9zaXRpb249PT0iYmVmb3JlIil9LGlucHV0czp7bGFiZWxQb3NpdGlvbjoibGFiZWxQb3NpdGlvbiJ9LGF0dHJzOkRFLG5nQ29udGVudFNlbGVjdG9yczpJRSxkZWNsczoxLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKFJlKCksbWUoMCkpfSxzdHlsZXM6W2AubWF0LWludGVybmFsLWZvcm0tZmllbGR7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtaW50ZXJuYWwtZm9ybS1maWVsZD5sYWJlbHttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDphdXRvO3BhZGRpbmctbGVmdDo0cHg7cGFkZGluZy1yaWdodDowO29yZGVyOjB9W2Rpcj1ydGxdIC5tYXQtaW50ZXJuYWwtZm9ybS1maWVsZD5sYWJlbHttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDowO3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6NHB4fS5tZGMtZm9ybS1maWVsZC0tYWxpZ24tZW5kPmxhYmVse21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDo0cHg7b3JkZXI6LTF9W2Rpcj1ydGxdIC5tZGMtZm9ybS1maWVsZC0tYWxpZ24tZW5kIC5tZGMtZm9ybS1maWVsZC0tYWxpZ24tZW5kIGxhYmVse21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OmF1dG87cGFkZGluZy1sZWZ0OjRweDtwYWRkaW5nLXJpZ2h0OjB9CmBdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIE5FKCl7cmV0dXJue2NvbG9yOiJhY2NlbnQiLGRpc2FibGVkSW50ZXJhY3RpdmU6ITF9fXZhciBMRSxQRSxWRSxTMyxPRSxHZixIRSxpOCxDMixXZixHbj14KCgpPT57eGkoKTtxbigpO2soKTtrKCk7V2UoKTtBMigpO2ZpKCk7STIoKTtLMigpO3czKCk7eTEoKTtXYSgpO0xFPVsiaW5wdXQiXSxQRT1bImZvcm1GaWVsZCJdLFZFPVsiKiJdLFMzPWNsYXNze3NvdXJjZTt2YWx1ZTtjb25zdHJ1Y3RvcihuLGUpe3RoaXMuc291cmNlPW4sdGhpcy52YWx1ZT1lfX0sT0U9e3Byb3ZpZGU6ZjIsdXNlRXhpc3Rpbmc6aGkoKCk9Pmk4KSxtdWx0aTohMH0sR2Y9bmV3IGNlKCJNYXRSYWRpb0dyb3VwIiksSEU9bmV3IGNlKCJtYXQtcmFkaW8tZGVmYXVsdC1vcHRpb25zIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpORX0pO2k4PSgoKT0+e2NsYXNzIHR7X2NoYW5nZURldGVjdG9yPWgoRWUpO192YWx1ZT1udWxsO19uYW1lPWgocXQpLmdldElkKCJtYXQtcmFkaW8tZ3JvdXAtIik7X3NlbGVjdGVkPW51bGw7X2lzSW5pdGlhbGl6ZWQ9ITE7X2xhYmVsUG9zaXRpb249ImFmdGVyIjtfZGlzYWJsZWQ9ITE7X3JlcXVpcmVkPSExO19idXR0b25DaGFuZ2VzO19jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuPSgpPT57fTtvblRvdWNoZWQ9KCk9Pnt9O2NoYW5nZT1uZXcgTjtfcmFkaW9zO2NvbG9yO2dldCBuYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9c2V0IG5hbWUoZSl7dGhpcy5fbmFtZT1lLHRoaXMuX3VwZGF0ZVJhZGlvQnV0dG9uTmFtZXMoKX1nZXQgbGFiZWxQb3NpdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbFBvc2l0aW9ufXNldCBsYWJlbFBvc2l0aW9uKGUpe3RoaXMuX2xhYmVsUG9zaXRpb249ZT09PSJiZWZvcmUiPyJiZWZvcmUiOiJhZnRlciIsdGhpcy5fbWFya1JhZGlvc0ZvckNoZWNrKCl9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfXNldCB2YWx1ZShlKXt0aGlzLl92YWx1ZSE9PWUmJih0aGlzLl92YWx1ZT1lLHRoaXMuX3VwZGF0ZVNlbGVjdGVkUmFkaW9Gcm9tVmFsdWUoKSx0aGlzLl9jaGVja1NlbGVjdGVkUmFkaW9CdXR0b24oKSl9X2NoZWNrU2VsZWN0ZWRSYWRpb0J1dHRvbigpe3RoaXMuX3NlbGVjdGVkJiYhdGhpcy5fc2VsZWN0ZWQuY2hlY2tlZCYmKHRoaXMuX3NlbGVjdGVkLmNoZWNrZWQ9ITApfWdldCBzZWxlY3RlZCgpe3JldHVybiB0aGlzLl9zZWxlY3RlZH1zZXQgc2VsZWN0ZWQoZSl7dGhpcy5fc2VsZWN0ZWQ9ZSx0aGlzLnZhbHVlPWU/ZS52YWx1ZTpudWxsLHRoaXMuX2NoZWNrU2VsZWN0ZWRSYWRpb0J1dHRvbigpfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQoZSl7dGhpcy5fZGlzYWJsZWQ9ZSx0aGlzLl9tYXJrUmFkaW9zRm9yQ2hlY2soKX1nZXQgcmVxdWlyZWQoKXtyZXR1cm4gdGhpcy5fcmVxdWlyZWR9c2V0IHJlcXVpcmVkKGUpe3RoaXMuX3JlcXVpcmVkPWUsdGhpcy5fbWFya1JhZGlvc0ZvckNoZWNrKCl9Z2V0IGRpc2FibGVkSW50ZXJhY3RpdmUoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWRJbnRlcmFjdGl2ZX1zZXQgZGlzYWJsZWRJbnRlcmFjdGl2ZShlKXt0aGlzLl9kaXNhYmxlZEludGVyYWN0aXZlPWUsdGhpcy5fbWFya1JhZGlvc0ZvckNoZWNrKCl9X2Rpc2FibGVkSW50ZXJhY3RpdmU9ITE7Y29uc3RydWN0b3IoKXt9bmdBZnRlckNvbnRlbnRJbml0KCl7dGhpcy5faXNJbml0aWFsaXplZD0hMCx0aGlzLl9idXR0b25DaGFuZ2VzPXRoaXMuX3JhZGlvcy5jaGFuZ2VzLnN1YnNjcmliZSgoKT0+e3RoaXMuc2VsZWN0ZWQmJiF0aGlzLl9yYWRpb3MuZmluZChlPT5lPT09dGhpcy5zZWxlY3RlZCkmJih0aGlzLl9zZWxlY3RlZD1udWxsKX0pfW5nT25EZXN0cm95KCl7dGhpcy5fYnV0dG9uQ2hhbmdlcz8udW5zdWJzY3JpYmUoKX1fdG91Y2goKXt0aGlzLm9uVG91Y2hlZCYmdGhpcy5vblRvdWNoZWQoKX1fdXBkYXRlUmFkaW9CdXR0b25OYW1lcygpe3RoaXMuX3JhZGlvcyYmdGhpcy5fcmFkaW9zLmZvckVhY2goZT0+e2UubmFtZT10aGlzLm5hbWUsZS5fbWFya0ZvckNoZWNrKCl9KX1fdXBkYXRlU2VsZWN0ZWRSYWRpb0Zyb21WYWx1ZSgpe2xldCBlPXRoaXMuX3NlbGVjdGVkIT09bnVsbCYmdGhpcy5fc2VsZWN0ZWQudmFsdWU9PT10aGlzLl92YWx1ZTt0aGlzLl9yYWRpb3MmJiFlJiYodGhpcy5fc2VsZWN0ZWQ9bnVsbCx0aGlzLl9yYWRpb3MuZm9yRWFjaChpPT57aS5jaGVja2VkPXRoaXMudmFsdWU9PT1pLnZhbHVlLGkuY2hlY2tlZCYmKHRoaXMuX3NlbGVjdGVkPWkpfSkpfV9lbWl0Q2hhbmdlRXZlbnQoKXt0aGlzLl9pc0luaXRpYWxpemVkJiZ0aGlzLmNoYW5nZS5lbWl0KG5ldyBTMyh0aGlzLl9zZWxlY3RlZCx0aGlzLl92YWx1ZSkpfV9tYXJrUmFkaW9zRm9yQ2hlY2soKXt0aGlzLl9yYWRpb3MmJnRoaXMuX3JhZGlvcy5mb3JFYWNoKGU9PmUuX21hcmtGb3JDaGVjaygpKX13cml0ZVZhbHVlKGUpe3RoaXMudmFsdWU9ZSx0aGlzLl9jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKX1yZWdpc3Rlck9uQ2hhbmdlKGUpe3RoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm49ZX1yZWdpc3Rlck9uVG91Y2hlZChlKXt0aGlzLm9uVG91Y2hlZD1lfXNldERpc2FibGVkU3RhdGUoZSl7dGhpcy5kaXNhYmxlZD1lLHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1yYWRpby1ncm91cCJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbihpLGEscil7aWYoaSYxJiZCZShyLEMyLDUpLGkmMil7bGV0IG87RihvPUIoKSkmJihhLl9yYWRpb3M9byl9fSxob3N0QXR0cnM6WyJyb2xlIiwicmFkaW9ncm91cCIsMSwibWF0LW1kYy1yYWRpby1ncm91cCJdLGlucHV0czp7Y29sb3I6ImNvbG9yIixuYW1lOiJuYW1lIixsYWJlbFBvc2l0aW9uOiJsYWJlbFBvc2l0aW9uIix2YWx1ZToidmFsdWUiLHNlbGVjdGVkOiJzZWxlY3RlZCIsZGlzYWJsZWQ6WzIsImRpc2FibGVkIiwiZGlzYWJsZWQiLFpdLHJlcXVpcmVkOlsyLCJyZXF1aXJlZCIsInJlcXVpcmVkIixaXSxkaXNhYmxlZEludGVyYWN0aXZlOlsyLCJkaXNhYmxlZEludGVyYWN0aXZlIiwiZGlzYWJsZWRJbnRlcmFjdGl2ZSIsWl19LG91dHB1dHM6e2NoYW5nZToiY2hhbmdlIn0sZXhwb3J0QXM6WyJtYXRSYWRpb0dyb3VwIl0sZmVhdHVyZXM6W0llKFtPRSx7cHJvdmlkZTpHZix1c2VFeGlzdGluZzp0fV0pXX0pfXJldHVybiB0fSkoKSxDMj0oKCk9PntjbGFzcyB0e19lbGVtZW50UmVmPWgoYWUpO19jaGFuZ2VEZXRlY3Rvcj1oKEVlKTtfZm9jdXNNb25pdG9yPWgoWDEpO19yYWRpb0Rpc3BhdGNoZXI9aChVbik7X2RlZmF1bHRPcHRpb25zPWgoSEUse29wdGlvbmFsOiEwfSk7X25nWm9uZT1oKHJlKTtfcmVuZGVyZXI9aCh2MSk7X3VuaXF1ZUlkPWgocXQpLmdldElkKCJtYXQtcmFkaW8tIik7X2NsZWFudXBDbGljaztpZD10aGlzLl91bmlxdWVJZDtuYW1lO2FyaWFMYWJlbDthcmlhTGFiZWxsZWRieTthcmlhRGVzY3JpYmVkYnk7ZGlzYWJsZVJpcHBsZT0hMTt0YWJJbmRleD0wO2dldCBjaGVja2VkKCl7cmV0dXJuIHRoaXMuX2NoZWNrZWR9c2V0IGNoZWNrZWQoZSl7dGhpcy5fY2hlY2tlZCE9PWUmJih0aGlzLl9jaGVja2VkPWUsZSYmdGhpcy5yYWRpb0dyb3VwJiZ0aGlzLnJhZGlvR3JvdXAudmFsdWUhPT10aGlzLnZhbHVlP3RoaXMucmFkaW9Hcm91cC5zZWxlY3RlZD10aGlzOiFlJiZ0aGlzLnJhZGlvR3JvdXAmJnRoaXMucmFkaW9Hcm91cC52YWx1ZT09PXRoaXMudmFsdWUmJih0aGlzLnJhZGlvR3JvdXAuc2VsZWN0ZWQ9bnVsbCksZSYmdGhpcy5fcmFkaW9EaXNwYXRjaGVyLm5vdGlmeSh0aGlzLmlkLHRoaXMubmFtZSksdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCkpfWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl92YWx1ZX1zZXQgdmFsdWUoZSl7dGhpcy5fdmFsdWUhPT1lJiYodGhpcy5fdmFsdWU9ZSx0aGlzLnJhZGlvR3JvdXAhPT1udWxsJiYodGhpcy5jaGVja2VkfHwodGhpcy5jaGVja2VkPXRoaXMucmFkaW9Hcm91cC52YWx1ZT09PWUpLHRoaXMuY2hlY2tlZCYmKHRoaXMucmFkaW9Hcm91cC5zZWxlY3RlZD10aGlzKSkpfWdldCBsYWJlbFBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsUG9zaXRpb258fHRoaXMucmFkaW9Hcm91cCYmdGhpcy5yYWRpb0dyb3VwLmxhYmVsUG9zaXRpb258fCJhZnRlciJ9c2V0IGxhYmVsUG9zaXRpb24oZSl7dGhpcy5fbGFiZWxQb3NpdGlvbj1lfV9sYWJlbFBvc2l0aW9uO2dldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZHx8dGhpcy5yYWRpb0dyb3VwIT09bnVsbCYmdGhpcy5yYWRpb0dyb3VwLmRpc2FibGVkfXNldCBkaXNhYmxlZChlKXt0aGlzLl9zZXREaXNhYmxlZChlKX1nZXQgcmVxdWlyZWQoKXtyZXR1cm4gdGhpcy5fcmVxdWlyZWR8fHRoaXMucmFkaW9Hcm91cCYmdGhpcy5yYWRpb0dyb3VwLnJlcXVpcmVkfXNldCByZXF1aXJlZChlKXtlIT09dGhpcy5fcmVxdWlyZWQmJnRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpLHRoaXMuX3JlcXVpcmVkPWV9Z2V0IGNvbG9yKCl7cmV0dXJuIHRoaXMuX2NvbG9yfHx0aGlzLnJhZGlvR3JvdXAmJnRoaXMucmFkaW9Hcm91cC5jb2xvcnx8dGhpcy5fZGVmYXVsdE9wdGlvbnMmJnRoaXMuX2RlZmF1bHRPcHRpb25zLmNvbG9yfHwiYWNjZW50In1zZXQgY29sb3IoZSl7dGhpcy5fY29sb3I9ZX1fY29sb3I7Z2V0IGRpc2FibGVkSW50ZXJhY3RpdmUoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWRJbnRlcmFjdGl2ZXx8dGhpcy5yYWRpb0dyb3VwIT09bnVsbCYmdGhpcy5yYWRpb0dyb3VwLmRpc2FibGVkSW50ZXJhY3RpdmV9c2V0IGRpc2FibGVkSW50ZXJhY3RpdmUoZSl7dGhpcy5fZGlzYWJsZWRJbnRlcmFjdGl2ZT1lfV9kaXNhYmxlZEludGVyYWN0aXZlO2NoYW5nZT1uZXcgTjtyYWRpb0dyb3VwO2dldCBpbnB1dElkKCl7cmV0dXJuYCR7dGhpcy5pZHx8dGhpcy5fdW5pcXVlSWR9LWlucHV0YH1fY2hlY2tlZD0hMTtfZGlzYWJsZWQ7X3JlcXVpcmVkO192YWx1ZT1udWxsO19yZW1vdmVVbmlxdWVTZWxlY3Rpb25MaXN0ZW5lcj0oKT0+e307X3ByZXZpb3VzVGFiSW5kZXg7X2lucHV0RWxlbWVudDtfcmlwcGxlVHJpZ2dlcjtfbm9vcEFuaW1hdGlvbnM9UHQoKTtfaW5qZWN0b3I9aChzdCk7Y29uc3RydWN0b3IoKXtoKEMxKS5sb2FkKEUxKTtsZXQgZT1oKEdmLHtvcHRpb25hbDohMH0pLGk9aChuZXcgcGkoInRhYmluZGV4Iikse29wdGlvbmFsOiEwfSk7dGhpcy5yYWRpb0dyb3VwPWUsdGhpcy5fZGlzYWJsZWRJbnRlcmFjdGl2ZT10aGlzLl9kZWZhdWx0T3B0aW9ucz8uZGlzYWJsZWRJbnRlcmFjdGl2ZT8/ITEsaSYmKHRoaXMudGFiSW5kZXg9b3QoaSwwKSl9Zm9jdXMoZSxpKXtpP3RoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9pbnB1dEVsZW1lbnQsaSxlKTp0aGlzLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cyhlKX1fbWFya0ZvckNoZWNrKCl7dGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCl9bmdPbkluaXQoKXt0aGlzLnJhZGlvR3JvdXAmJih0aGlzLmNoZWNrZWQ9dGhpcy5yYWRpb0dyb3VwLnZhbHVlPT09dGhpcy5fdmFsdWUsdGhpcy5jaGVja2VkJiYodGhpcy5yYWRpb0dyb3VwLnNlbGVjdGVkPXRoaXMpLHRoaXMubmFtZT10aGlzLnJhZGlvR3JvdXAubmFtZSksdGhpcy5fcmVtb3ZlVW5pcXVlU2VsZWN0aW9uTGlzdGVuZXI9dGhpcy5fcmFkaW9EaXNwYXRjaGVyLmxpc3RlbigoZSxpKT0+e2UhPT10aGlzLmlkJiZpPT09dGhpcy5uYW1lJiYodGhpcy5jaGVja2VkPSExKX0pfW5nRG9DaGVjaygpe3RoaXMuX3VwZGF0ZVRhYkluZGV4KCl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fdXBkYXRlVGFiSW5kZXgoKSx0aGlzLl9mb2N1c01vbml0b3IubW9uaXRvcih0aGlzLl9lbGVtZW50UmVmLCEwKS5zdWJzY3JpYmUoZT0+eyFlJiZ0aGlzLnJhZGlvR3JvdXAmJnRoaXMucmFkaW9Hcm91cC5fdG91Y2goKX0pLHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e3RoaXMuX2NsZWFudXBDbGljaz10aGlzLl9yZW5kZXJlci5saXN0ZW4odGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsImNsaWNrIix0aGlzLl9vbklucHV0Q2xpY2spfSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9jbGVhbnVwQ2xpY2s/LigpLHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKSx0aGlzLl9yZW1vdmVVbmlxdWVTZWxlY3Rpb25MaXN0ZW5lcigpfV9lbWl0Q2hhbmdlRXZlbnQoKXt0aGlzLmNoYW5nZS5lbWl0KG5ldyBTMyh0aGlzLHRoaXMuX3ZhbHVlKSl9X2lzUmlwcGxlRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5kaXNhYmxlUmlwcGxlfHx0aGlzLmRpc2FibGVkfV9vbklucHV0SW50ZXJhY3Rpb24oZSl7aWYoZS5zdG9wUHJvcGFnYXRpb24oKSwhdGhpcy5jaGVja2VkJiYhdGhpcy5kaXNhYmxlZCl7bGV0IGk9dGhpcy5yYWRpb0dyb3VwJiZ0aGlzLnZhbHVlIT09dGhpcy5yYWRpb0dyb3VwLnZhbHVlO3RoaXMuY2hlY2tlZD0hMCx0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKSx0aGlzLnJhZGlvR3JvdXAmJih0aGlzLnJhZGlvR3JvdXAuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy52YWx1ZSksaSYmdGhpcy5yYWRpb0dyb3VwLl9lbWl0Q2hhbmdlRXZlbnQoKSl9fV9vblRvdWNoVGFyZ2V0Q2xpY2soZSl7dGhpcy5fb25JbnB1dEludGVyYWN0aW9uKGUpLCghdGhpcy5kaXNhYmxlZHx8dGhpcy5kaXNhYmxlZEludGVyYWN0aXZlKSYmdGhpcy5faW5wdXRFbGVtZW50Py5uYXRpdmVFbGVtZW50LmZvY3VzKCl9X3NldERpc2FibGVkKGUpe3RoaXMuX2Rpc2FibGVkIT09ZSYmKHRoaXMuX2Rpc2FibGVkPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCkpfV9vbklucHV0Q2xpY2s9ZT0+e3RoaXMuZGlzYWJsZWQmJnRoaXMuZGlzYWJsZWRJbnRlcmFjdGl2ZSYmZS5wcmV2ZW50RGVmYXVsdCgpfTtfdXBkYXRlVGFiSW5kZXgoKXtsZXQgZT10aGlzLnJhZGlvR3JvdXAsaTtpZighZXx8IWUuc2VsZWN0ZWR8fHRoaXMuZGlzYWJsZWQ/aT10aGlzLnRhYkluZGV4Omk9ZS5zZWxlY3RlZD09PXRoaXM/dGhpcy50YWJJbmRleDotMSxpIT09dGhpcy5fcHJldmlvdXNUYWJJbmRleCl7bGV0IGE9dGhpcy5faW5wdXRFbGVtZW50Py5uYXRpdmVFbGVtZW50O2EmJihhLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGkrIiIpLHRoaXMuX3ByZXZpb3VzVGFiSW5kZXg9aSxtMSgoKT0+e3F1ZXVlTWljcm90YXNrKCgpPT57ZSYmZS5zZWxlY3RlZCYmZS5zZWxlY3RlZCE9PXRoaXMmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1hJiYoZS5zZWxlY3RlZD8uX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCksZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWEmJnRoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmJsdXIoKSl9KX0se2luamVjdG9yOnRoaXMuX2luamVjdG9yfSkpfX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJtYXQtcmFkaW8tYnV0dG9uIl1dLHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKHRlKExFLDUpLHRlKFBFLDcsYWUpKSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5faW5wdXRFbGVtZW50PXIuZmlyc3QpLEYocj1CKCkpJiYoYS5fcmlwcGxlVHJpZ2dlcj1yLmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LW1kYy1yYWRpby1idXR0b24iXSxob3N0VmFyczoxOSxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjEmJlMoImZvY3VzIixmdW5jdGlvbigpe3JldHVybiBhLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpfSksaSYyJiYoRygiaWQiLGEuaWQpKCJ0YWJpbmRleCIsbnVsbCkoImFyaWEtbGFiZWwiLG51bGwpKCJhcmlhLWxhYmVsbGVkYnkiLG51bGwpKCJhcmlhLWRlc2NyaWJlZGJ5IixudWxsKSxpZSgibWF0LXByaW1hcnkiLGEuY29sb3I9PT0icHJpbWFyeSIpKCJtYXQtYWNjZW50IixhLmNvbG9yPT09ImFjY2VudCIpKCJtYXQtd2FybiIsYS5jb2xvcj09PSJ3YXJuIikoIm1hdC1tZGMtcmFkaW8tY2hlY2tlZCIsYS5jaGVja2VkKSgibWF0LW1kYy1yYWRpby1kaXNhYmxlZCIsYS5kaXNhYmxlZCkoIm1hdC1tZGMtcmFkaW8tZGlzYWJsZWQtaW50ZXJhY3RpdmUiLGEuZGlzYWJsZWRJbnRlcmFjdGl2ZSkoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixhLl9ub29wQW5pbWF0aW9ucykpfSxpbnB1dHM6e2lkOiJpZCIsbmFtZToibmFtZSIsYXJpYUxhYmVsOlswLCJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0sYXJpYUxhYmVsbGVkYnk6WzAsImFyaWEtbGFiZWxsZWRieSIsImFyaWFMYWJlbGxlZGJ5Il0sYXJpYURlc2NyaWJlZGJ5OlswLCJhcmlhLWRlc2NyaWJlZGJ5IiwiYXJpYURlc2NyaWJlZGJ5Il0sZGlzYWJsZVJpcHBsZTpbMiwiZGlzYWJsZVJpcHBsZSIsImRpc2FibGVSaXBwbGUiLFpdLHRhYkluZGV4OlsyLCJ0YWJJbmRleCIsInRhYkluZGV4IixlPT5lPT1udWxsPzA6b3QoZSldLGNoZWNrZWQ6WzIsImNoZWNrZWQiLCJjaGVja2VkIixaXSx2YWx1ZToidmFsdWUiLGxhYmVsUG9zaXRpb246ImxhYmVsUG9zaXRpb24iLGRpc2FibGVkOlsyLCJkaXNhYmxlZCIsImRpc2FibGVkIixaXSxyZXF1aXJlZDpbMiwicmVxdWlyZWQiLCJyZXF1aXJlZCIsWl0sY29sb3I6ImNvbG9yIixkaXNhYmxlZEludGVyYWN0aXZlOlsyLCJkaXNhYmxlZEludGVyYWN0aXZlIiwiZGlzYWJsZWRJbnRlcmFjdGl2ZSIsWl19LG91dHB1dHM6e2NoYW5nZToiY2hhbmdlIn0sZXhwb3J0QXM6WyJtYXRSYWRpb0J1dHRvbiJdLG5nQ29udGVudFNlbGVjdG9yczpWRSxkZWNsczoxMyx2YXJzOjE3LGNvbnN0czpbWyJmb3JtRmllbGQiLCIiXSxbImlucHV0IiwiIl0sWyJtYXQtaW50ZXJuYWwtZm9ybS1maWVsZCIsIiIsMywibGFiZWxQb3NpdGlvbiJdLFsxLCJtZGMtcmFkaW8iXSxbMSwibWF0LW1kYy1yYWRpby10b3VjaC10YXJnZXQiLDMsImNsaWNrIl0sWyJ0eXBlIiwicmFkaW8iLCJhcmlhLWludmFsaWQiLCJmYWxzZSIsMSwibWRjLXJhZGlvX19uYXRpdmUtY29udHJvbCIsMywiY2hhbmdlIiwiaWQiLCJjaGVja2VkIiwiZGlzYWJsZWQiLCJyZXF1aXJlZCJdLFsxLCJtZGMtcmFkaW9fX2JhY2tncm91bmQiXSxbMSwibWRjLXJhZGlvX19vdXRlci1jaXJjbGUiXSxbMSwibWRjLXJhZGlvX19pbm5lci1jaXJjbGUiXSxbIm1hdC1yaXBwbGUiLCIiLDEsIm1hdC1yYWRpby1yaXBwbGUiLCJtYXQtZm9jdXMtaW5kaWNhdG9yIiwzLCJtYXRSaXBwbGVUcmlnZ2VyIiwibWF0UmlwcGxlRGlzYWJsZWQiLCJtYXRSaXBwbGVDZW50ZXJlZCJdLFsxLCJtYXQtcmlwcGxlLWVsZW1lbnQiLCJtYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUiXSxbMSwibWRjLWxhYmVsIiwzLCJmb3IiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtSZSgpLGMoMCwiZGl2IiwyLDApKDIsImRpdiIsMykoMywiZGl2Iiw0KSxTKCJjbGljayIsZnVuY3Rpb24oZCl7cmV0dXJuIHoociksVChhLl9vblRvdWNoVGFyZ2V0Q2xpY2soZCkpfSkscygpLGMoNCwiaW5wdXQiLDUsMSksUygiY2hhbmdlIixmdW5jdGlvbihkKXtyZXR1cm4geihyKSxUKGEuX29uSW5wdXRJbnRlcmFjdGlvbihkKSl9KSxzKCksYyg2LCJkaXYiLDYpLHUoNywiZGl2Iiw3KSg4LCJkaXYiLDgpLHMoKSxjKDksImRpdiIsOSksdSgxMCwiZGl2IiwxMCkscygpKCksYygxMSwibGFiZWwiLDExKSxtZSgxMikscygpKCl9aSYyJiYoZigibGFiZWxQb3NpdGlvbiIsYS5sYWJlbFBvc2l0aW9uKSxsKDIpLGllKCJtZGMtcmFkaW8tLWRpc2FibGVkIixhLmRpc2FibGVkKSxsKDIpLGYoImlkIixhLmlucHV0SWQpKCJjaGVja2VkIixhLmNoZWNrZWQpKCJkaXNhYmxlZCIsYS5kaXNhYmxlZCYmIWEuZGlzYWJsZWRJbnRlcmFjdGl2ZSkoInJlcXVpcmVkIixhLnJlcXVpcmVkKSxHKCJuYW1lIixhLm5hbWUpKCJ2YWx1ZSIsYS52YWx1ZSkoImFyaWEtbGFiZWwiLGEuYXJpYUxhYmVsKSgiYXJpYS1sYWJlbGxlZGJ5IixhLmFyaWFMYWJlbGxlZGJ5KSgiYXJpYS1kZXNjcmliZWRieSIsYS5hcmlhRGVzY3JpYmVkYnkpKCJhcmlhLWRpc2FibGVkIixhLmRpc2FibGVkJiZhLmRpc2FibGVkSW50ZXJhY3RpdmU/InRydWUiOm51bGwpLGwoNSksZigibWF0UmlwcGxlVHJpZ2dlciIsYS5fcmlwcGxlVHJpZ2dlci5uYXRpdmVFbGVtZW50KSgibWF0UmlwcGxlRGlzYWJsZWQiLGEuX2lzUmlwcGxlRGlzYWJsZWQoKSkoIm1hdFJpcHBsZUNlbnRlcmVkIiwhMCksbCgyKSxmKCJmb3IiLGEuaW5wdXRJZCkpfSxkZXBlbmRlbmNpZXM6W0wxLFpyXSxzdHlsZXM6W2AubWF0LW1kYy1yYWRpby1idXR0b257LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsMCl9Lm1hdC1tZGMtcmFkaW8tYnV0dG9uIC5tZGMtcmFkaW97ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7ZmxleDowIDAgYXV0bztib3gtc2l6aW5nOmNvbnRlbnQtYm94O3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Y3Vyc29yOnBvaW50ZXI7d2lsbC1jaGFuZ2U6b3BhY2l0eSx0cmFuc2Zvcm0sYm9yZGVyLWNvbG9yLGNvbG9yO3BhZGRpbmc6Y2FsYygodmFyKC0tbWF0LXJhZGlvLXN0YXRlLWxheWVyLXNpemUsIDQwcHgpIC0gMjBweCkvMil9Lm1hdC1tZGMtcmFkaW8tYnV0dG9uIC5tZGMtcmFkaW86aG92ZXI+Lm1kYy1yYWRpb19fbmF0aXZlLWNvbnRyb2w6bm90KFtkaXNhYmxlZF0pOm5vdCg6Zm9jdXMpfi5tZGMtcmFkaW9fX2JhY2tncm91bmQ6OmJlZm9yZXtvcGFjaXR5Oi4wNDt0cmFuc2Zvcm06c2NhbGUoMSl9Lm1hdC1tZGMtcmFkaW8tYnV0dG9uIC5tZGMtcmFkaW86aG92ZXI+Lm1kYy1yYWRpb19fbmF0aXZlLWNvbnRyb2w6bm90KFtkaXNhYmxlZF0pfi5tZGMtcmFkaW9fX2JhY2tncm91bmQ+Lm1kYy1yYWRpb19fb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtcmFkaW8tdW5zZWxlY3RlZC1ob3Zlci1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWF0LW1kYy1yYWRpby1idXR0b24gLm1kYy1yYWRpbzpob3Zlcj4ubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDplbmFibGVkOmNoZWNrZWQrLm1kYy1yYWRpb19fYmFja2dyb3VuZD4ubWRjLXJhZGlvX19vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1yYWRpby1zZWxlY3RlZC1ob3Zlci1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWF0LW1kYy1yYWRpby1idXR0b24gLm1kYy1yYWRpbzpob3Zlcj4ubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDplbmFibGVkOmNoZWNrZWQrLm1kYy1yYWRpb19fYmFja2dyb3VuZD4ubWRjLXJhZGlvX19pbm5lci1jaXJjbGV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtcmFkaW8tc2VsZWN0ZWQtaG92ZXItaWNvbi1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5LCBjdXJyZW50Q29sb3IpKX0ubWF0LW1kYy1yYWRpby1idXR0b24gLm1kYy1yYWRpbzphY3RpdmU+Lm1kYy1yYWRpb19fbmF0aXZlLWNvbnRyb2w6ZW5hYmxlZDpub3QoOmNoZWNrZWQpKy5tZGMtcmFkaW9fX2JhY2tncm91bmQ+Lm1kYy1yYWRpb19fb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtcmFkaW8tdW5zZWxlY3RlZC1wcmVzc2VkLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvOmFjdGl2ZT4ubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDplbmFibGVkOmNoZWNrZWQrLm1kYy1yYWRpb19fYmFja2dyb3VuZD4ubWRjLXJhZGlvX19vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1yYWRpby1zZWxlY3RlZC1wcmVzc2VkLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvOmFjdGl2ZT4ubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDplbmFibGVkOmNoZWNrZWQrLm1kYy1yYWRpb19fYmFja2dyb3VuZD4ubWRjLXJhZGlvX19pbm5lci1jaXJjbGV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtcmFkaW8tc2VsZWN0ZWQtcHJlc3NlZC1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnksIGN1cnJlbnRDb2xvcikpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19iYWNrZ3JvdW5ke2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDoyMHB4O2hlaWdodDoyMHB4fS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19iYWNrZ3JvdW5kOjpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnNjYWxlKDAsIDApO2JvcmRlci1yYWRpdXM6NTAlO29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lO2NvbnRlbnQ6IiI7dHJhbnNpdGlvbjpvcGFjaXR5IDkwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKSx0cmFuc2Zvcm0gOTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpO3dpZHRoOnZhcigtLW1hdC1yYWRpby1zdGF0ZS1sYXllci1zaXplLCA0MHB4KTtoZWlnaHQ6dmFyKC0tbWF0LXJhZGlvLXN0YXRlLWxheWVyLXNpemUsIDQwcHgpO3RvcDpjYWxjKC0xKih2YXIoLS1tYXQtcmFkaW8tc3RhdGUtbGF5ZXItc2l6ZSwgNDBweCkgLSAyMHB4KS8yKTtsZWZ0OmNhbGMoLTEqKHZhcigtLW1hdC1yYWRpby1zdGF0ZS1sYXllci1zaXplLCA0MHB4KSAtIDIwcHgpLzIpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19vdXRlci1jaXJjbGV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlci13aWR0aDoycHg7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIDkwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC42LCAxKX0ubWF0LW1kYy1yYWRpby1idXR0b24gLm1kYy1yYWRpb19faW5uZXItY2lyY2xle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0cmFuc2Zvcm06c2NhbGUoMCk7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gOTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpLGJhY2tncm91bmQtY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19pbm5lci1jaXJjbGV7YmFja2dyb3VuZC1jb2xvcjpDYW52YXNUZXh0ICFpbXBvcnRhbnR9fS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbHtwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW46MDtwYWRkaW5nOjA7b3BhY2l0eTowO3RvcDowO3JpZ2h0OjA7bGVmdDowO2N1cnNvcjppbmhlcml0O3otaW5kZXg6MTt3aWR0aDp2YXIoLS1tYXQtcmFkaW8tc3RhdGUtbGF5ZXItc2l6ZSwgNDBweCk7aGVpZ2h0OnZhcigtLW1hdC1yYWRpby1zdGF0ZS1sYXllci1zaXplLCA0MHB4KX0ubWF0LW1kYy1yYWRpby1idXR0b24gLm1kYy1yYWRpb19fbmF0aXZlLWNvbnRyb2w6Y2hlY2tlZCsubWRjLXJhZGlvX19iYWNrZ3JvdW5kLC5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDpkaXNhYmxlZCsubWRjLXJhZGlvX19iYWNrZ3JvdW5ke3RyYW5zaXRpb246b3BhY2l0eSA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpLHRyYW5zZm9ybSA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDpjaGVja2VkKy5tZGMtcmFkaW9fX2JhY2tncm91bmQ+Lm1kYy1yYWRpb19fb3V0ZXItY2lyY2xlLC5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDpkaXNhYmxlZCsubWRjLXJhZGlvX19iYWNrZ3JvdW5kPi5tZGMtcmFkaW9fX291dGVyLWNpcmNsZXt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDpjaGVja2VkKy5tZGMtcmFkaW9fX2JhY2tncm91bmQ+Lm1kYy1yYWRpb19faW5uZXItY2lyY2xlLC5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDpkaXNhYmxlZCsubWRjLXJhZGlvX19iYWNrZ3JvdW5kPi5tZGMtcmFkaW9fX2lubmVyLWNpcmNsZXt0cmFuc2l0aW9uOnRyYW5zZm9ybSA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpLGJhY2tncm91bmQtY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKX0ubWF0LW1kYy1yYWRpby1idXR0b24gLm1kYy1yYWRpb19fbmF0aXZlLWNvbnRyb2w6Zm9jdXMrLm1kYy1yYWRpb19fYmFja2dyb3VuZDo6YmVmb3Jle3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5Oi4xMjt0cmFuc2l0aW9uOm9wYWNpdHkgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSx0cmFuc2Zvcm0gOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKX0ubWF0LW1kYy1yYWRpby1idXR0b24gLm1kYy1yYWRpb19fbmF0aXZlLWNvbnRyb2w6ZGlzYWJsZWQ6bm90KDpjaGVja2VkKSsubWRjLXJhZGlvX19iYWNrZ3JvdW5kPi5tZGMtcmFkaW9fX291dGVyLWNpcmNsZXtib3JkZXItY29sb3I6dmFyKC0tbWF0LXJhZGlvLWRpc2FibGVkLXVuc2VsZWN0ZWQtaWNvbi1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSk7b3BhY2l0eTp2YXIoLS1tYXQtcmFkaW8tZGlzYWJsZWQtdW5zZWxlY3RlZC1pY29uLW9wYWNpdHksIDAuMzgpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDpkaXNhYmxlZCsubWRjLXJhZGlvX19iYWNrZ3JvdW5ke2N1cnNvcjpkZWZhdWx0fS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDpkaXNhYmxlZCsubWRjLXJhZGlvX19iYWNrZ3JvdW5kPi5tZGMtcmFkaW9fX291dGVyLWNpcmNsZXtib3JkZXItY29sb3I6dmFyKC0tbWF0LXJhZGlvLWRpc2FibGVkLXNlbGVjdGVkLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO29wYWNpdHk6dmFyKC0tbWF0LXJhZGlvLWRpc2FibGVkLXNlbGVjdGVkLWljb24tb3BhY2l0eSwgMC4zOCl9Lm1hdC1tZGMtcmFkaW8tYnV0dG9uIC5tZGMtcmFkaW9fX25hdGl2ZS1jb250cm9sOmRpc2FibGVkKy5tZGMtcmFkaW9fX2JhY2tncm91bmQ+Lm1kYy1yYWRpb19faW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXJhZGlvLWRpc2FibGVkLXNlbGVjdGVkLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSwgY3VycmVudENvbG9yKSk7b3BhY2l0eTp2YXIoLS1tYXQtcmFkaW8tZGlzYWJsZWQtc2VsZWN0ZWQtaWNvbi1vcGFjaXR5LCAwLjM4KX0ubWF0LW1kYy1yYWRpby1idXR0b24gLm1kYy1yYWRpb19fbmF0aXZlLWNvbnRyb2w6ZW5hYmxlZDpub3QoOmNoZWNrZWQpKy5tZGMtcmFkaW9fX2JhY2tncm91bmQ+Lm1kYy1yYWRpb19fb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtcmFkaW8tdW5zZWxlY3RlZC1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDplbmFibGVkOmNoZWNrZWQrLm1kYy1yYWRpb19fYmFja2dyb3VuZD4ubWRjLXJhZGlvX19vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1yYWRpby1zZWxlY3RlZC1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWF0LW1kYy1yYWRpby1idXR0b24gLm1kYy1yYWRpb19fbmF0aXZlLWNvbnRyb2w6ZW5hYmxlZDpjaGVja2VkKy5tZGMtcmFkaW9fX2JhY2tncm91bmQ+Lm1kYy1yYWRpb19faW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXJhZGlvLXNlbGVjdGVkLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSwgY3VycmVudENvbG9yKSl9Lm1hdC1tZGMtcmFkaW8tYnV0dG9uIC5tZGMtcmFkaW9fX25hdGl2ZS1jb250cm9sOmVuYWJsZWQ6Zm9jdXM6Y2hlY2tlZCsubWRjLXJhZGlvX19iYWNrZ3JvdW5kPi5tZGMtcmFkaW9fX291dGVyLWNpcmNsZXtib3JkZXItY29sb3I6dmFyKC0tbWF0LXJhZGlvLXNlbGVjdGVkLWZvY3VzLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDplbmFibGVkOmZvY3VzOmNoZWNrZWQrLm1kYy1yYWRpb19fYmFja2dyb3VuZD4ubWRjLXJhZGlvX19pbm5lci1jaXJjbGV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtcmFkaW8tc2VsZWN0ZWQtZm9jdXMtaWNvbi1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5LCBjdXJyZW50Q29sb3IpKX0ubWF0LW1kYy1yYWRpby1idXR0b24gLm1kYy1yYWRpb19fbmF0aXZlLWNvbnRyb2w6Y2hlY2tlZCsubWRjLXJhZGlvX19iYWNrZ3JvdW5kPi5tZGMtcmFkaW9fX2lubmVyLWNpcmNsZXt0cmFuc2Zvcm06c2NhbGUoMC41KTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpLGJhY2tncm91bmQtY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKX0ubWF0LW1kYy1yYWRpby1idXR0b24ubWF0LW1kYy1yYWRpby1kaXNhYmxlZC1pbnRlcmFjdGl2ZSAubWRjLXJhZGlvLS1kaXNhYmxlZHtwb2ludGVyLWV2ZW50czphdXRvfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbi5tYXQtbWRjLXJhZGlvLWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtcmFkaW8tLWRpc2FibGVkIC5tZGMtcmFkaW9fX25hdGl2ZS1jb250cm9sOm5vdCg6Y2hlY2tlZCkrLm1kYy1yYWRpb19fYmFja2dyb3VuZD4ubWRjLXJhZGlvX19vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1yYWRpby1kaXNhYmxlZC11bnNlbGVjdGVkLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO29wYWNpdHk6dmFyKC0tbWF0LXJhZGlvLWRpc2FibGVkLXVuc2VsZWN0ZWQtaWNvbi1vcGFjaXR5LCAwLjM4KX0ubWF0LW1kYy1yYWRpby1idXR0b24ubWF0LW1kYy1yYWRpby1kaXNhYmxlZC1pbnRlcmFjdGl2ZSAubWRjLXJhZGlvLS1kaXNhYmxlZDpob3ZlciAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbDpjaGVja2VkKy5tZGMtcmFkaW9fX2JhY2tncm91bmQ+Lm1kYy1yYWRpb19fb3V0ZXItY2lyY2xlLC5tYXQtbWRjLXJhZGlvLWJ1dHRvbi5tYXQtbWRjLXJhZGlvLWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtcmFkaW8tLWRpc2FibGVkIC5tZGMtcmFkaW9fX25hdGl2ZS1jb250cm9sOmNoZWNrZWQ6Zm9jdXMrLm1kYy1yYWRpb19fYmFja2dyb3VuZD4ubWRjLXJhZGlvX19vdXRlci1jaXJjbGUsLm1hdC1tZGMtcmFkaW8tYnV0dG9uLm1hdC1tZGMtcmFkaW8tZGlzYWJsZWQtaW50ZXJhY3RpdmUgLm1kYy1yYWRpby0tZGlzYWJsZWQgLm1kYy1yYWRpb19fbmF0aXZlLWNvbnRyb2wrLm1kYy1yYWRpb19fYmFja2dyb3VuZD4ubWRjLXJhZGlvX19vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1yYWRpby1kaXNhYmxlZC1zZWxlY3RlZC1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKTtvcGFjaXR5OnZhcigtLW1hdC1yYWRpby1kaXNhYmxlZC1zZWxlY3RlZC1pY29uLW9wYWNpdHksIDAuMzgpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbi5tYXQtbWRjLXJhZGlvLWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtcmFkaW8tLWRpc2FibGVkOmhvdmVyIC5tZGMtcmFkaW9fX25hdGl2ZS1jb250cm9sOmNoZWNrZWQrLm1kYy1yYWRpb19fYmFja2dyb3VuZD4ubWRjLXJhZGlvX19pbm5lci1jaXJjbGUsLm1hdC1tZGMtcmFkaW8tYnV0dG9uLm1hdC1tZGMtcmFkaW8tZGlzYWJsZWQtaW50ZXJhY3RpdmUgLm1kYy1yYWRpby0tZGlzYWJsZWQgLm1kYy1yYWRpb19fbmF0aXZlLWNvbnRyb2w6Y2hlY2tlZDpmb2N1cysubWRjLXJhZGlvX19iYWNrZ3JvdW5kPi5tZGMtcmFkaW9fX2lubmVyLWNpcmNsZSwubWF0LW1kYy1yYWRpby1idXR0b24ubWF0LW1kYy1yYWRpby1kaXNhYmxlZC1pbnRlcmFjdGl2ZSAubWRjLXJhZGlvLS1kaXNhYmxlZCAubWRjLXJhZGlvX19uYXRpdmUtY29udHJvbCsubWRjLXJhZGlvX19iYWNrZ3JvdW5kPi5tZGMtcmFkaW9fX2lubmVyLWNpcmNsZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1yYWRpby1kaXNhYmxlZC1zZWxlY3RlZC1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UsIGN1cnJlbnRDb2xvcikpO29wYWNpdHk6dmFyKC0tbWF0LXJhZGlvLWRpc2FibGVkLXNlbGVjdGVkLWljb24tb3BhY2l0eSwgMC4zOCl9Lm1hdC1tZGMtcmFkaW8tYnV0dG9uLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tZGMtcmFkaW9fX2JhY2tncm91bmQ6OmJlZm9yZSwubWF0LW1kYy1yYWRpby1idXR0b24uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1kYy1yYWRpb19fb3V0ZXItY2lyY2xlLC5tYXQtbWRjLXJhZGlvLWJ1dHRvbi5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWRjLXJhZGlvX19pbm5lci1jaXJjbGV7dHJhbnNpdGlvbjpub25lICFpbXBvcnRhbnR9Lm1hdC1tZGMtcmFkaW8tYnV0dG9uIGxhYmVse2N1cnNvcjpwb2ludGVyfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvX19iYWNrZ3JvdW5kOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtcmFkaW8tcmlwcGxlLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWF0LW1kYy1yYWRpby1idXR0b24ubWF0LW1kYy1yYWRpby1jaGVja2VkIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1tZGMtcmFkaW8tYnV0dG9uLm1hdC1tZGMtcmFkaW8tY2hlY2tlZCAubWRjLXJhZGlvX19iYWNrZ3JvdW5kOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtcmFkaW8tY2hlY2tlZC1yaXBwbGUtY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbi5tYXQtbWRjLXJhZGlvLWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtcmFkaW8tLWRpc2FibGVkIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1tZGMtcmFkaW8tYnV0dG9uLm1hdC1tZGMtcmFkaW8tZGlzYWJsZWQtaW50ZXJhY3RpdmUgLm1kYy1yYWRpby0tZGlzYWJsZWQgLm1kYy1yYWRpb19fYmFja2dyb3VuZDo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXJhZGlvLXJpcHBsZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1hdC1tZGMtcmFkaW8tYnV0dG9uIC5tYXQtaW50ZXJuYWwtZm9ybS1maWVsZHtjb2xvcjp2YXIoLS1tYXQtcmFkaW8tbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSk7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LXJhZGlvLWxhYmVsLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1mb250KSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LXJhZGlvLWxhYmVsLXRleHQtbGluZS1oZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tbGluZS1oZWlnaHQpKTtmb250LXNpemU6dmFyKC0tbWF0LXJhZGlvLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LXJhZGlvLWxhYmVsLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tdHJhY2tpbmcpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtcmFkaW8tbGFiZWwtdGV4dC13ZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0td2VpZ2h0KSl9Lm1hdC1tZGMtcmFkaW8tYnV0dG9uIC5tZGMtcmFkaW8tLWRpc2FibGVkK2xhYmVse2NvbG9yOnZhcigtLW1hdC1yYWRpby1kaXNhYmxlZC1sYWJlbC1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWF0LXJhZGlvLXJpcHBsZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6NTAlfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWF0LXJhZGlvLXJpcHBsZT4ubWF0LXJpcHBsZS1lbGVtZW50e29wYWNpdHk6LjE0fS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWF0LXJhZGlvLXJpcHBsZTo6YmVmb3Jle2JvcmRlci1yYWRpdXM6NTAlfS5tYXQtbWRjLXJhZGlvLWJ1dHRvbiAubWRjLXJhZGlvPi5tZGMtcmFkaW9fX25hdGl2ZS1jb250cm9sOmZvY3VzOmVuYWJsZWQ6bm90KDpjaGVja2VkKX4ubWRjLXJhZGlvX19iYWNrZ3JvdW5kPi5tZGMtcmFkaW9fX291dGVyLWNpcmNsZXtib3JkZXItY29sb3I6dmFyKC0tbWF0LXJhZGlvLXVuc2VsZWN0ZWQtZm9jdXMtaWNvbi1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1hdC1tZGMtcmFkaW8tYnV0dG9uLmNkay1mb2N1c2VkIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7Y29udGVudDoiIn0ubWF0LW1kYy1yYWRpby1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdDtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtbWRjLXJhZGlvLWRpc2FibGVkLm1hdC1tZGMtcmFkaW8tZGlzYWJsZWQtaW50ZXJhY3RpdmV7cG9pbnRlci1ldmVudHM6YXV0b30ubWF0LW1kYy1yYWRpby10b3VjaC10YXJnZXR7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTtoZWlnaHQ6dmFyKC0tbWF0LXJhZGlvLXRvdWNoLXRhcmdldC1zaXplLCA0OHB4KTt3aWR0aDp2YXIoLS1tYXQtcmFkaW8tdG91Y2gtdGFyZ2V0LXNpemUsIDQ4cHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTUwJSk7ZGlzcGxheTp2YXIoLS1tYXQtcmFkaW8tdG91Y2gtdGFyZ2V0LWRpc3BsYXksIGJsb2NrKX1bZGlyPXJ0bF0gLm1hdC1tZGMtcmFkaW8tdG91Y2gtdGFyZ2V0e2xlZnQ6YXV0bztyaWdodDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSg1MCUsIC01MCUpfQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCksV2Y9KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVtb2Q9eGUoe3R5cGU6dH0pO3N0YXRpYyBcdTAyNzVpbmo9eWUoe2ltcG9ydHM6W3plLHVpLEMyLHplXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIFVFKHQsbil7dCYxJiYoTXQoKSxjKDAsInN2ZyIsMiksdSgxLCJwb2x5Z29uIiwzKSxzKCkpfWZ1bmN0aW9uIHFFKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7R3QoMCwiZGl2IiwwKSxxZCgiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5jbG9zZWQuZW1pdCgiY2xpY2siKSl9KSgiYW5pbWF0aW9uc3RhcnQiLGZ1bmN0aW9uKGEpe3ooZSk7bGV0IHI9digpO3JldHVybiBUKHIuX29uQW5pbWF0aW9uU3RhcnQoYS5hbmltYXRpb25OYW1lKSl9KSgiYW5pbWF0aW9uZW5kIixmdW5jdGlvbihhKXt6KGUpO2xldCByPXYoKTtyZXR1cm4gVChyLl9vbkFuaW1hdGlvbkRvbmUoYS5hbmltYXRpb25OYW1lKSl9KSgiYW5pbWF0aW9uY2FuY2VsIixmdW5jdGlvbihhKXt6KGUpO2xldCByPXYoKTtyZXR1cm4gVChyLl9vbkFuaW1hdGlvbkRvbmUoYS5hbmltYXRpb25OYW1lKSl9KSxHdCgxLCJkaXYiLDEpLG1lKDIpLEp0KCkoKX1pZih0JjIpe2xldCBlPXYoKTtEdChlLl9jbGFzc0xpc3QpLGllKCJtYXQtbWVudS1wYW5lbC1hbmltYXRpb25zLWRpc2FibGVkIixlLl9hbmltYXRpb25zRGlzYWJsZWQpKCJtYXQtbWVudS1wYW5lbC1leGl0LWFuaW1hdGlvbiIsZS5fcGFuZWxBbmltYXRpb25TdGF0ZT09PSJ2b2lkIikoIm1hdC1tZW51LXBhbmVsLWFuaW1hdGluZyIsZS5faXNBbmltYXRpbmcoKSksQWkoImlkIixlLnBhbmVsSWQpLEcoImFyaWEtbGFiZWwiLGUuYXJpYUxhYmVsfHxudWxsKSgiYXJpYS1sYWJlbGxlZGJ5IixlLmFyaWFMYWJlbGxlZGJ5fHxudWxsKSgiYXJpYS1kZXNjcmliZWRieSIsZS5hcmlhRGVzY3JpYmVkYnl8fG51bGwpfX1mdW5jdGlvbiBRRSgpe3JldHVybntvdmVybGFwVHJpZ2dlcjohMSx4UG9zaXRpb246ImFmdGVyIix5UG9zaXRpb246ImJlbG93IixiYWNrZHJvcENsYXNzOiJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCJ9fWZ1bmN0aW9uIFlFKHQpe2xldCBuPWgoc3QpO3JldHVybigpPT5MaShuKX12YXIgUkUsRkUsQkUsakUsbjgsdTQsR0UsV0UsYTgsazMsS3IsUWYsWkUsJHIsJEUsWWYsWmYsJGYsQXRlLER0ZSxyOD14KCgpPT57aygpO2soKTt4aSgpO1kyKCk7WHQoKTtsdCgpO0EyKCk7STIoKTtLMigpO0VuKCk7ZmkoKTtaMigpO1BuKCk7RDIoKTtXYSgpO3kxKCk7UkU9WyJtYXQtbWVudS1pdGVtIiwiIl0sRkU9W1tbIm1hdC1pY29uIl0sWyIiLCJtYXRNZW51SXRlbUljb24iLCIiXV0sIioiXSxCRT1bIm1hdC1pY29uLCBbbWF0TWVudUl0ZW1JY29uXSIsIioiXTtqRT1bIioiXTtuOD1uZXcgY2UoIk1BVF9NRU5VX1BBTkVMIiksdTQ9KCgpPT57Y2xhc3MgdHtfZWxlbWVudFJlZj1oKGFlKTtfZG9jdW1lbnQ9aChqdCk7X2ZvY3VzTW9uaXRvcj1oKFgxKTtfcGFyZW50TWVudT1oKG44LHtvcHRpb25hbDohMH0pO19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtyb2xlPSJtZW51aXRlbSI7ZGlzYWJsZWQ9ITE7ZGlzYWJsZVJpcHBsZT0hMTtfaG92ZXJlZD1uZXcgd2U7X2ZvY3VzZWQ9bmV3IHdlO19oaWdobGlnaHRlZD0hMTtfdHJpZ2dlcnNTdWJtZW51PSExO2NvbnN0cnVjdG9yKCl7aChDMSkubG9hZChFMSksdGhpcy5fcGFyZW50TWVudT8uYWRkSXRlbT8uKHRoaXMpfWZvY3VzKGUsaSl7dGhpcy5fZm9jdXNNb25pdG9yJiZlP3RoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9nZXRIb3N0RWxlbWVudCgpLGUsaSk6dGhpcy5fZ2V0SG9zdEVsZW1lbnQoKS5mb2N1cyhpKSx0aGlzLl9mb2N1c2VkLm5leHQodGhpcyl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fZm9jdXNNb25pdG9yJiZ0aGlzLl9mb2N1c01vbml0b3IubW9uaXRvcih0aGlzLl9lbGVtZW50UmVmLCExKX1uZ09uRGVzdHJveSgpe3RoaXMuX2ZvY3VzTW9uaXRvciYmdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpLHRoaXMuX3BhcmVudE1lbnUmJnRoaXMuX3BhcmVudE1lbnUucmVtb3ZlSXRlbSYmdGhpcy5fcGFyZW50TWVudS5yZW1vdmVJdGVtKHRoaXMpLHRoaXMuX2hvdmVyZWQuY29tcGxldGUoKSx0aGlzLl9mb2N1c2VkLmNvbXBsZXRlKCl9X2dldFRhYkluZGV4KCl7cmV0dXJuIHRoaXMuZGlzYWJsZWQ/Ii0xIjoiMCJ9X2dldEhvc3RFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudH1fY2hlY2tEaXNhYmxlZChlKXt0aGlzLmRpc2FibGVkJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpfV9oYW5kbGVNb3VzZUVudGVyKCl7dGhpcy5faG92ZXJlZC5uZXh0KHRoaXMpfWdldExhYmVsKCl7bGV0IGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsb25lTm9kZSghMCksaT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIm1hdC1pY29uLCAubWF0ZXJpYWwtaWNvbnMiKTtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErKylpW2FdLnJlbW92ZSgpO3JldHVybiBlLnRleHRDb250ZW50Py50cmltKCl8fCIifV9zZXRIaWdobGlnaHRlZChlKXt0aGlzLl9oaWdobGlnaHRlZD1lLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfV9zZXRUcmlnZ2Vyc1N1Ym1lbnUoZSl7dGhpcy5fdHJpZ2dlcnNTdWJtZW51PWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X2hhc0ZvY3VzKCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50JiZ0aGlzLl9kb2N1bWVudC5hY3RpdmVFbGVtZW50PT09dGhpcy5fZ2V0SG9zdEVsZW1lbnQoKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXQtbWVudS1pdGVtIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LW1kYy1tZW51LWl0ZW0iLCJtYXQtZm9jdXMtaW5kaWNhdG9yIl0saG9zdFZhcnM6OCxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjEmJlMoImNsaWNrIixmdW5jdGlvbihvKXtyZXR1cm4gYS5fY2hlY2tEaXNhYmxlZChvKX0pKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe3JldHVybiBhLl9oYW5kbGVNb3VzZUVudGVyKCl9KSxpJjImJihHKCJyb2xlIixhLnJvbGUpKCJ0YWJpbmRleCIsYS5fZ2V0VGFiSW5kZXgoKSkoImFyaWEtZGlzYWJsZWQiLGEuZGlzYWJsZWQpKCJkaXNhYmxlZCIsYS5kaXNhYmxlZHx8bnVsbCksaWUoIm1hdC1tZGMtbWVudS1pdGVtLWhpZ2hsaWdodGVkIixhLl9oaWdobGlnaHRlZCkoIm1hdC1tZGMtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlciIsYS5fdHJpZ2dlcnNTdWJtZW51KSl9LGlucHV0czp7cm9sZToicm9sZSIsZGlzYWJsZWQ6WzIsImRpc2FibGVkIiwiZGlzYWJsZWQiLFpdLGRpc2FibGVSaXBwbGU6WzIsImRpc2FibGVSaXBwbGUiLCJkaXNhYmxlUmlwcGxlIixaXX0sZXhwb3J0QXM6WyJtYXRNZW51SXRlbSJdLGF0dHJzOlJFLG5nQ29udGVudFNlbGVjdG9yczpCRSxkZWNsczo1LHZhcnM6Myxjb25zdHM6W1sxLCJtYXQtbWRjLW1lbnUtaXRlbS10ZXh0Il0sWyJtYXRSaXBwbGUiLCIiLDEsIm1hdC1tZGMtbWVudS1yaXBwbGUiLDMsIm1hdFJpcHBsZURpc2FibGVkIiwibWF0UmlwcGxlVHJpZ2dlciJdLFsidmlld0JveCIsIjAgMCA1IDEwIiwiZm9jdXNhYmxlIiwiZmFsc2UiLCJhcmlhLWhpZGRlbiIsInRydWUiLDEsIm1hdC1tZGMtbWVudS1zdWJtZW51LWljb24iXSxbInBvaW50cyIsIjAsMCA1LDUgMCwxMCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKFJlKEZFKSxtZSgwKSxjKDEsInNwYW4iLDApLG1lKDIsMSkscygpLHUoMywiZGl2IiwxKSxNKDQsVUUsMiwwLCI6c3ZnOnN2ZyIsMikpLGkmMiYmKGwoMyksZigibWF0UmlwcGxlRGlzYWJsZWQiLGEuZGlzYWJsZVJpcHBsZXx8YS5kaXNhYmxlZCkoIm1hdFJpcHBsZVRyaWdnZXIiLGEuX2dldEhvc3RFbGVtZW50KCkpLGwoKSx3KGEuX3RyaWdnZXJzU3VibWVudT80Oi0xKSl9LGRlcGVuZGVuY2llczpbTDFdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxHRT1uZXcgY2UoIk1hdE1lbnVDb250ZW50IiksV0U9bmV3IGNlKCJtYXQtbWVudS1kZWZhdWx0LW9wdGlvbnMiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OlFFfSk7YTg9Il9tYXQtbWVudS1lbnRlciIsazM9Il9tYXQtbWVudS1leGl0IixLcj0oKCk9PntjbGFzcyB0e19lbGVtZW50UmVmPWgoYWUpO19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtfaW5qZWN0b3I9aChzdCk7X2tleU1hbmFnZXI7X3hQb3NpdGlvbjtfeVBvc2l0aW9uO19maXJzdEl0ZW1Gb2N1c1JlZjtfZXhpdEZhbGxiYWNrVGltZW91dDtfYW5pbWF0aW9uc0Rpc2FibGVkPVB0KCk7X2FsbEl0ZW1zO19kaXJlY3REZXNjZW5kYW50SXRlbXM9bmV3IEUyO19jbGFzc0xpc3Q9e307X3BhbmVsQW5pbWF0aW9uU3RhdGU9InZvaWQiO19hbmltYXRpb25Eb25lPW5ldyB3ZTtfaXNBbmltYXRpbmc9ZnQoITEpO3BhcmVudE1lbnU7ZGlyZWN0aW9uO292ZXJsYXlQYW5lbENsYXNzO2JhY2tkcm9wQ2xhc3M7YXJpYUxhYmVsO2FyaWFMYWJlbGxlZGJ5O2FyaWFEZXNjcmliZWRieTtnZXQgeFBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3hQb3NpdGlvbn1zZXQgeFBvc2l0aW9uKGUpe3RoaXMuX3hQb3NpdGlvbj1lLHRoaXMuc2V0UG9zaXRpb25DbGFzc2VzKCl9Z2V0IHlQb3NpdGlvbigpe3JldHVybiB0aGlzLl95UG9zaXRpb259c2V0IHlQb3NpdGlvbihlKXt0aGlzLl95UG9zaXRpb249ZSx0aGlzLnNldFBvc2l0aW9uQ2xhc3NlcygpfXRlbXBsYXRlUmVmO2l0ZW1zO2xhenlDb250ZW50O292ZXJsYXBUcmlnZ2VyO2hhc0JhY2tkcm9wO3NldCBwYW5lbENsYXNzKGUpe2xldCBpPXRoaXMuX3ByZXZpb3VzUGFuZWxDbGFzcyxhPVhlKHt9LHRoaXMuX2NsYXNzTGlzdCk7aSYmaS5sZW5ndGgmJmkuc3BsaXQoIiAiKS5mb3JFYWNoKHI9PnthW3JdPSExfSksdGhpcy5fcHJldmlvdXNQYW5lbENsYXNzPWUsZSYmZS5sZW5ndGgmJihlLnNwbGl0KCIgIikuZm9yRWFjaChyPT57YVtyXT0hMH0pLHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc05hbWU9IiIpLHRoaXMuX2NsYXNzTGlzdD1hfV9wcmV2aW91c1BhbmVsQ2xhc3M7Z2V0IGNsYXNzTGlzdCgpe3JldHVybiB0aGlzLnBhbmVsQ2xhc3N9c2V0IGNsYXNzTGlzdChlKXt0aGlzLnBhbmVsQ2xhc3M9ZX1jbG9zZWQ9bmV3IE47Y2xvc2U9dGhpcy5jbG9zZWQ7cGFuZWxJZD1oKHF0KS5nZXRJZCgibWF0LW1lbnUtcGFuZWwtIik7Y29uc3RydWN0b3IoKXtsZXQgZT1oKFdFKTt0aGlzLm92ZXJsYXlQYW5lbENsYXNzPWUub3ZlcmxheVBhbmVsQ2xhc3N8fCIiLHRoaXMuX3hQb3NpdGlvbj1lLnhQb3NpdGlvbix0aGlzLl95UG9zaXRpb249ZS55UG9zaXRpb24sdGhpcy5iYWNrZHJvcENsYXNzPWUuYmFja2Ryb3BDbGFzcyx0aGlzLm92ZXJsYXBUcmlnZ2VyPWUub3ZlcmxhcFRyaWdnZXIsdGhpcy5oYXNCYWNrZHJvcD1lLmhhc0JhY2tkcm9wfW5nT25Jbml0KCl7dGhpcy5zZXRQb3NpdGlvbkNsYXNzZXMoKX1uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLl91cGRhdGVEaXJlY3REZXNjZW5kYW50cygpLHRoaXMuX2tleU1hbmFnZXI9bmV3IFpvKHRoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcykud2l0aFdyYXAoKS53aXRoVHlwZUFoZWFkKCkud2l0aEhvbWVBbmRFbmQoKSx0aGlzLl9rZXlNYW5hZ2VyLnRhYk91dC5zdWJzY3JpYmUoKCk9PnRoaXMuY2xvc2VkLmVtaXQoInRhYiIpKSx0aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMuY2hhbmdlcy5waXBlKGkxKHRoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcykscTEoZT0+S3QoLi4uZS5tYXAoaT0+aS5fZm9jdXNlZCkpKSkuc3Vic2NyaWJlKGU9PnRoaXMuX2tleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbShlKSksdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zLmNoYW5nZXMuc3Vic2NyaWJlKGU9PntsZXQgaT10aGlzLl9rZXlNYW5hZ2VyO2lmKHRoaXMuX3BhbmVsQW5pbWF0aW9uU3RhdGU9PT0iZW50ZXIiJiZpLmFjdGl2ZUl0ZW0/Ll9oYXNGb2N1cygpKXtsZXQgYT1lLnRvQXJyYXkoKSxyPU1hdGgubWF4KDAsTWF0aC5taW4oYS5sZW5ndGgtMSxpLmFjdGl2ZUl0ZW1JbmRleHx8MCkpO2Fbcl0mJiFhW3JdLmRpc2FibGVkP2kuc2V0QWN0aXZlSXRlbShyKTppLnNldE5leHRJdGVtQWN0aXZlKCl9fSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9rZXlNYW5hZ2VyPy5kZXN0cm95KCksdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zLmRlc3Ryb3koKSx0aGlzLmNsb3NlZC5jb21wbGV0ZSgpLHRoaXMuX2ZpcnN0SXRlbUZvY3VzUmVmPy5kZXN0cm95KCksY2xlYXJUaW1lb3V0KHRoaXMuX2V4aXRGYWxsYmFja1RpbWVvdXQpfV9ob3ZlcmVkKCl7cmV0dXJuIHRoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcy5jaGFuZ2VzLnBpcGUoaTEodGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zKSxxMShpPT5LdCguLi5pLm1hcChhPT5hLl9ob3ZlcmVkKSkpKX1hZGRJdGVtKGUpe31yZW1vdmVJdGVtKGUpe31faGFuZGxlS2V5ZG93bihlKXtsZXQgaT1lLmtleUNvZGUsYT10aGlzLl9rZXlNYW5hZ2VyO3N3aXRjaChpKXtjYXNlIDI3OnMxKGUpfHwoZS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2xvc2VkLmVtaXQoImtleWRvd24iKSk7YnJlYWs7Y2FzZSAzNzp0aGlzLnBhcmVudE1lbnUmJnRoaXMuZGlyZWN0aW9uPT09Imx0ciImJnRoaXMuY2xvc2VkLmVtaXQoImtleWRvd24iKTticmVhaztjYXNlIDM5OnRoaXMucGFyZW50TWVudSYmdGhpcy5kaXJlY3Rpb249PT0icnRsIiYmdGhpcy5jbG9zZWQuZW1pdCgia2V5ZG93biIpO2JyZWFrO2RlZmF1bHQ6KGk9PT0zOHx8aT09PTQwKSYmYS5zZXRGb2N1c09yaWdpbigia2V5Ym9hcmQiKSxhLm9uS2V5ZG93bihlKTtyZXR1cm59fWZvY3VzRmlyc3RJdGVtKGU9InByb2dyYW0iKXt0aGlzLl9maXJzdEl0ZW1Gb2N1c1JlZj8uZGVzdHJveSgpLHRoaXMuX2ZpcnN0SXRlbUZvY3VzUmVmPW0xKCgpPT57bGV0IGk9dGhpcy5fcmVzb2x2ZVBhbmVsKCk7aWYoIWl8fCFpLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKXtsZXQgYT10aGlzLl9rZXlNYW5hZ2VyO2Euc2V0Rm9jdXNPcmlnaW4oZSkuc2V0Rmlyc3RJdGVtQWN0aXZlKCksIWEuYWN0aXZlSXRlbSYmaSYmaS5mb2N1cygpfX0se2luamVjdG9yOnRoaXMuX2luamVjdG9yfSl9cmVzZXRBY3RpdmVJdGVtKCl7dGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKC0xKX1zZXRFbGV2YXRpb24oZSl7fXNldFBvc2l0aW9uQ2xhc3NlcyhlPXRoaXMueFBvc2l0aW9uLGk9dGhpcy55UG9zaXRpb24pe3RoaXMuX2NsYXNzTGlzdD1VMShYZSh7fSx0aGlzLl9jbGFzc0xpc3QpLHsibWF0LW1lbnUtYmVmb3JlIjplPT09ImJlZm9yZSIsIm1hdC1tZW51LWFmdGVyIjplPT09ImFmdGVyIiwibWF0LW1lbnUtYWJvdmUiOmk9PT0iYWJvdmUiLCJtYXQtbWVudS1iZWxvdyI6aT09PSJiZWxvdyJ9KSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1fb25BbmltYXRpb25Eb25lKGUpe2xldCBpPWU9PT1rMzsoaXx8ZT09PWE4KSYmKGkmJihjbGVhclRpbWVvdXQodGhpcy5fZXhpdEZhbGxiYWNrVGltZW91dCksdGhpcy5fZXhpdEZhbGxiYWNrVGltZW91dD12b2lkIDApLHRoaXMuX2FuaW1hdGlvbkRvbmUubmV4dChpPyJ2b2lkIjoiZW50ZXIiKSx0aGlzLl9pc0FuaW1hdGluZy5zZXQoITEpKX1fb25BbmltYXRpb25TdGFydChlKXsoZT09PWE4fHxlPT09azMpJiZ0aGlzLl9pc0FuaW1hdGluZy5zZXQoITApfV9zZXRJc09wZW4oZSl7aWYodGhpcy5fcGFuZWxBbmltYXRpb25TdGF0ZT1lPyJlbnRlciI6InZvaWQiLGUpe2lmKHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4PT09MCl7bGV0IGk9dGhpcy5fcmVzb2x2ZVBhbmVsKCk7aSYmKGkuc2Nyb2xsVG9wPTApfX1lbHNlIHRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZHx8KHRoaXMuX2V4aXRGYWxsYmFja1RpbWVvdXQ9c2V0VGltZW91dCgoKT0+dGhpcy5fb25BbmltYXRpb25Eb25lKGszKSwyMDApKTt0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQmJnNldFRpbWVvdXQoKCk9Pnt0aGlzLl9vbkFuaW1hdGlvbkRvbmUoZT9hODprMyl9KSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1fdXBkYXRlRGlyZWN0RGVzY2VuZGFudHMoKXt0aGlzLl9hbGxJdGVtcy5jaGFuZ2VzLnBpcGUoaTEodGhpcy5fYWxsSXRlbXMpKS5zdWJzY3JpYmUoZT0+e3RoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcy5yZXNldChlLmZpbHRlcihpPT5pLl9wYXJlbnRNZW51PT09dGhpcykpLHRoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcy5ub3RpZnlPbkNoYW5nZXMoKX0pfV9yZXNvbHZlUGFuZWwoKXtsZXQgZT1udWxsO3JldHVybiB0aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMubGVuZ3RoJiYoZT10aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMuZmlyc3QuX2dldEhvc3RFbGVtZW50KCkuY2xvc2VzdCgnW3JvbGU9Im1lbnUiXScpKSxlfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1tZW51Il1dLGNvbnRlbnRRdWVyaWVzOmZ1bmN0aW9uKGksYSxyKXtpZihpJjEmJihCZShyLEdFLDUpLEJlKHIsdTQsNSksQmUocix1NCw0KSksaSYyKXtsZXQgbztGKG89QigpKSYmKGEubGF6eUNvbnRlbnQ9by5maXJzdCksRihvPUIoKSkmJihhLl9hbGxJdGVtcz1vKSxGKG89QigpKSYmKGEuaXRlbXM9byl9fSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJnRlKGgxLDUpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLnRlbXBsYXRlUmVmPXIuZmlyc3QpfX0saG9zdFZhcnM6Myxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJkcoImFyaWEtbGFiZWwiLG51bGwpKCJhcmlhLWxhYmVsbGVkYnkiLG51bGwpKCJhcmlhLWRlc2NyaWJlZGJ5IixudWxsKX0saW5wdXRzOntiYWNrZHJvcENsYXNzOiJiYWNrZHJvcENsYXNzIixhcmlhTGFiZWw6WzAsImFyaWEtbGFiZWwiLCJhcmlhTGFiZWwiXSxhcmlhTGFiZWxsZWRieTpbMCwiYXJpYS1sYWJlbGxlZGJ5IiwiYXJpYUxhYmVsbGVkYnkiXSxhcmlhRGVzY3JpYmVkYnk6WzAsImFyaWEtZGVzY3JpYmVkYnkiLCJhcmlhRGVzY3JpYmVkYnkiXSx4UG9zaXRpb246InhQb3NpdGlvbiIseVBvc2l0aW9uOiJ5UG9zaXRpb24iLG92ZXJsYXBUcmlnZ2VyOlsyLCJvdmVybGFwVHJpZ2dlciIsIm92ZXJsYXBUcmlnZ2VyIixaXSxoYXNCYWNrZHJvcDpbMiwiaGFzQmFja2Ryb3AiLCJoYXNCYWNrZHJvcCIsZT0+ZT09bnVsbD9udWxsOlooZSldLHBhbmVsQ2xhc3M6WzAsImNsYXNzIiwicGFuZWxDbGFzcyJdLGNsYXNzTGlzdDoiY2xhc3NMaXN0In0sb3V0cHV0czp7Y2xvc2VkOiJjbG9zZWQiLGNsb3NlOiJjbG9zZSJ9LGV4cG9ydEFzOlsibWF0TWVudSJdLGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6bjgsdXNlRXhpc3Rpbmc6dH1dKV0sbmdDb250ZW50U2VsZWN0b3JzOmpFLGRlY2xzOjEsdmFyczowLGNvbnN0czpbWyJ0YWJpbmRleCIsIi0xIiwicm9sZSIsIm1lbnUiLDEsIm1hdC1tZGMtbWVudS1wYW5lbCIsMywiY2xpY2siLCJhbmltYXRpb25zdGFydCIsImFuaW1hdGlvbmVuZCIsImFuaW1hdGlvbmNhbmNlbCIsImlkIl0sWzEsIm1hdC1tZGMtbWVudS1jb250ZW50Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoUmUoKSxwcigwLHFFLDMsMTIsIm5nLXRlbXBsYXRlIikpfSxzdHlsZXM6W2BtYXQtbWVudXtkaXNwbGF5Om5vbmV9Lm1hdC1tZGMtbWVudS1jb250ZW50e21hcmdpbjowO3BhZGRpbmc6OHB4IDA7b3V0bGluZTowfS5tYXQtbWRjLW1lbnUtY29udGVudCwubWF0LW1kYy1tZW51LWNvbnRlbnQgLm1hdC1tZGMtbWVudS1pdGVtIC5tYXQtbWRjLW1lbnUtaXRlbS10ZXh0ey1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkO2ZsZXg6MTt3aGl0ZS1zcGFjZTpub3JtYWw7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LW1lbnUtaXRlbS1sYWJlbC10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtbGFiZWwtbGFyZ2UtZm9udCkpO2xpbmUtaGVpZ2h0OnZhcigtLW1hdC1tZW51LWl0ZW0tbGFiZWwtdGV4dC1saW5lLWhlaWdodCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1saW5lLWhlaWdodCkpO2ZvbnQtc2l6ZTp2YXIoLS1tYXQtbWVudS1pdGVtLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LW1lbnUtaXRlbS1sYWJlbC10ZXh0LXRyYWNraW5nLCB2YXIoLS1tYXQtc3lzLWxhYmVsLWxhcmdlLXRyYWNraW5nKSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LW1lbnUtaXRlbS1sYWJlbC10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS13ZWlnaHQpKX1Aa2V5ZnJhbWVzIF9tYXQtbWVudS1lbnRlcntmcm9te29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoMC44KX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgX21hdC1tZW51LWV4aXR7ZnJvbXtvcGFjaXR5OjF9dG97b3BhY2l0eTowfX0ubWF0LW1kYy1tZW51LXBhbmVse21pbi13aWR0aDoxMTJweDttYXgtd2lkdGg6MjgwcHg7b3ZlcmZsb3c6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3V0bGluZTowO2FuaW1hdGlvbjpfbWF0LW1lbnUtZW50ZXIgMTIwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYXQtbWVudS1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWV4dHJhLXNtYWxsKSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtbWVudS1jb250YWluZXItY29sb3IsIHZhcigtLW1hdC1zeXMtc3VyZmFjZS1jb250YWluZXIpKTtib3gtc2hhZG93OnZhcigtLW1hdC1tZW51LWNvbnRhaW5lci1lbGV2YXRpb24tc2hhZG93LCAwcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpKTt3aWxsLWNoYW5nZTp0cmFuc2Zvcm0sb3BhY2l0eX0ubWF0LW1kYy1tZW51LXBhbmVsLm1hdC1tZW51LXBhbmVsLWV4aXQtYW5pbWF0aW9ue2FuaW1hdGlvbjpfbWF0LW1lbnUtZXhpdCAxMDBtcyAyNW1zIGxpbmVhciBmb3J3YXJkc30ubWF0LW1kYy1tZW51LXBhbmVsLm1hdC1tZW51LXBhbmVsLWFuaW1hdGlvbnMtZGlzYWJsZWR7YW5pbWF0aW9uOm5vbmV9Lm1hdC1tZGMtbWVudS1wYW5lbC5tYXQtbWVudS1wYW5lbC1hbmltYXRpbmd7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LW1kYy1tZW51LXBhbmVsLm1hdC1tZW51LXBhbmVsLWFuaW1hdGluZzpoYXMoLm1hdC1tZGMtbWVudS1jb250ZW50OmVtcHR5KXtkaXNwbGF5Om5vbmV9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1hdC1tZGMtbWVudS1wYW5lbHtvdXRsaW5lOnNvbGlkIDFweH19Lm1hdC1tZGMtbWVudS1wYW5lbCAubWF0LWRpdmlkZXJ7Y29sb3I6dmFyKC0tbWF0LW1lbnUtZGl2aWRlci1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlLXZhcmlhbnQpKTttYXJnaW4tYm90dG9tOnZhcigtLW1hdC1tZW51LWRpdmlkZXItYm90dG9tLXNwYWNpbmcsIDhweCk7bWFyZ2luLXRvcDp2YXIoLS1tYXQtbWVudS1kaXZpZGVyLXRvcC1zcGFjaW5nLCA4cHgpfS5tYXQtbWRjLW1lbnUtaXRlbXtkaXNwbGF5OmZsZXg7cG9zaXRpb246cmVsYXRpdmU7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7Y3Vyc29yOnBvaW50ZXI7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmxlZnQ7Ym94LXNpemluZzpib3JkZXItYm94O2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7YmFja2dyb3VuZDpub25lO3RleHQtZGVjb3JhdGlvbjpub25lO21hcmdpbjowO21pbi1oZWlnaHQ6NDhweDtwYWRkaW5nLWxlZnQ6dmFyKC0tbWF0LW1lbnUtaXRlbS1sZWFkaW5nLXNwYWNpbmcsIDEycHgpO3BhZGRpbmctcmlnaHQ6dmFyKC0tbWF0LW1lbnUtaXRlbS10cmFpbGluZy1zcGFjaW5nLCAxMnB4KTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsMCl9Lm1hdC1tZGMtbWVudS1pdGVtOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfVtkaXI9cnRsXSAubWF0LW1kYy1tZW51LWl0ZW17cGFkZGluZy1sZWZ0OnZhcigtLW1hdC1tZW51LWl0ZW0tdHJhaWxpbmctc3BhY2luZywgMTJweCk7cGFkZGluZy1yaWdodDp2YXIoLS1tYXQtbWVudS1pdGVtLWxlYWRpbmctc3BhY2luZywgMTJweCl9Lm1hdC1tZGMtbWVudS1pdGVtOmhhcygubWF0ZXJpYWwtaWNvbnMsbWF0LWljb24sW21hdEJ1dHRvbkljb25dKXtwYWRkaW5nLWxlZnQ6dmFyKC0tbWF0LW1lbnUtaXRlbS13aXRoLWljb24tbGVhZGluZy1zcGFjaW5nLCAxMnB4KTtwYWRkaW5nLXJpZ2h0OnZhcigtLW1hdC1tZW51LWl0ZW0td2l0aC1pY29uLXRyYWlsaW5nLXNwYWNpbmcsIDEycHgpfVtkaXI9cnRsXSAubWF0LW1kYy1tZW51LWl0ZW06aGFzKC5tYXRlcmlhbC1pY29ucyxtYXQtaWNvbixbbWF0QnV0dG9uSWNvbl0pe3BhZGRpbmctbGVmdDp2YXIoLS1tYXQtbWVudS1pdGVtLXdpdGgtaWNvbi10cmFpbGluZy1zcGFjaW5nLCAxMnB4KTtwYWRkaW5nLXJpZ2h0OnZhcigtLW1hdC1tZW51LWl0ZW0td2l0aC1pY29uLWxlYWRpbmctc3BhY2luZywgMTJweCl9Lm1hdC1tZGMtbWVudS1pdGVtLC5tYXQtbWRjLW1lbnUtaXRlbTp2aXNpdGVkLC5tYXQtbWRjLW1lbnUtaXRlbTpsaW5re2NvbG9yOnZhcigtLW1hdC1tZW51LWl0ZW0tbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1hdC1tZGMtbWVudS1pdGVtIC5tYXQtaWNvbi1uby1jb2xvciwubWF0LW1kYy1tZW51LWl0ZW0gLm1hdC1tZGMtbWVudS1zdWJtZW51LWljb257Y29sb3I6dmFyKC0tbWF0LW1lbnUtaXRlbS1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tYXQtbWRjLW1lbnUtaXRlbVtkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHQ7b3BhY2l0eTouMzh9Lm1hdC1tZGMtbWVudS1pdGVtW2Rpc2FibGVkXTo6YWZ0ZXJ7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OiIiO3RvcDowO2xlZnQ6MDtib3R0b206MDtyaWdodDowfS5tYXQtbWRjLW1lbnUtaXRlbTpmb2N1c3tvdXRsaW5lOjB9Lm1hdC1tZGMtbWVudS1pdGVtIC5tYXQtaWNvbntmbGV4LXNocmluazowO21hcmdpbi1yaWdodDp2YXIoLS1tYXQtbWVudS1pdGVtLXNwYWNpbmcsIDEycHgpO2hlaWdodDp2YXIoLS1tYXQtbWVudS1pdGVtLWljb24tc2l6ZSwgMjRweCk7d2lkdGg6dmFyKC0tbWF0LW1lbnUtaXRlbS1pY29uLXNpemUsIDI0cHgpfVtkaXI9cnRsXSAubWF0LW1kYy1tZW51LWl0ZW17dGV4dC1hbGlnbjpyaWdodH1bZGlyPXJ0bF0gLm1hdC1tZGMtbWVudS1pdGVtIC5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDp2YXIoLS1tYXQtbWVudS1pdGVtLXNwYWNpbmcsIDEycHgpfS5tYXQtbWRjLW1lbnUtaXRlbTpub3QoW2Rpc2FibGVkXSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtbWVudS1pdGVtLWhvdmVyLXN0YXRlLWxheWVyLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSBjYWxjKHZhcigtLW1hdC1zeXMtaG92ZXItc3RhdGUtbGF5ZXItb3BhY2l0eSkgKiAxMDAlKSwgdHJhbnNwYXJlbnQpKX0ubWF0LW1kYy1tZW51LWl0ZW06bm90KFtkaXNhYmxlZF0pLmNkay1wcm9ncmFtLWZvY3VzZWQsLm1hdC1tZGMtbWVudS1pdGVtOm5vdChbZGlzYWJsZWRdKS5jZGsta2V5Ym9hcmQtZm9jdXNlZCwubWF0LW1kYy1tZW51LWl0ZW06bm90KFtkaXNhYmxlZF0pLm1hdC1tZGMtbWVudS1pdGVtLWhpZ2hsaWdodGVke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LW1lbnUtaXRlbS1mb2N1cy1zdGF0ZS1sYXllci1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgY2FsYyh2YXIoLS1tYXQtc3lzLWZvY3VzLXN0YXRlLWxheWVyLW9wYWNpdHkpICogMTAwJSksIHRyYW5zcGFyZW50KSl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1hdC1tZGMtbWVudS1pdGVte21hcmdpbi10b3A6MXB4fX0ubWF0LW1kYy1tZW51LXN1Ym1lbnUtaWNvbnt3aWR0aDp2YXIoLS1tYXQtbWVudS1pdGVtLWljb24tc2l6ZSwgMjRweCk7aGVpZ2h0OjEwcHg7ZmlsbDpjdXJyZW50Q29sb3I7cGFkZGluZy1sZWZ0OnZhcigtLW1hdC1tZW51LWl0ZW0tc3BhY2luZywgMTJweCl9W2Rpcj1ydGxdIC5tYXQtbWRjLW1lbnUtc3VibWVudS1pY29ue3BhZGRpbmctcmlnaHQ6dmFyKC0tbWF0LW1lbnUtaXRlbS1zcGFjaW5nLCAxMnB4KTtwYWRkaW5nLWxlZnQ6MH1bZGlyPXJ0bF0gLm1hdC1tZGMtbWVudS1zdWJtZW51LWljb24gcG9seWdvbnt0cmFuc2Zvcm06c2NhbGVYKC0xKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcn1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWF0LW1kYy1tZW51LXN1Ym1lbnUtaWNvbntmaWxsOkNhbnZhc1RleHR9fS5tYXQtbWRjLW1lbnUtaXRlbSAubWF0LW1kYy1tZW51LXJpcHBsZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lfQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCksUWY9bmV3IGNlKCJtYXQtbWVudS1zY3JvbGwtc3RyYXRlZ3kiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT57bGV0IHQ9aChzdCk7cmV0dXJuKCk9PkxpKHQpfX0pO1pFPXtwcm92aWRlOlFmLGRlcHM6W10sdXNlRmFjdG9yeTpZRX0sJHI9bmV3IFdlYWtNYXAsJEU9KCgpPT57Y2xhc3MgdHtfY2FuSGF2ZUJhY2tkcm9wO19lbGVtZW50PWgoYWUpO192aWV3Q29udGFpbmVyUmVmPWgoRzEpO19tZW51SXRlbUluc3RhbmNlPWgodTQse29wdGlvbmFsOiEwLHNlbGY6ITB9KTtfZGlyPWgobjEse29wdGlvbmFsOiEwfSk7X2ZvY3VzTW9uaXRvcj1oKFgxKTtfbmdab25lPWgocmUpO19pbmplY3Rvcj1oKHN0KTtfc2Nyb2xsU3RyYXRlZ3k9aChRZik7X2NoYW5nZURldGVjdG9yUmVmPWgoRWUpO19hbmltYXRpb25zRGlzYWJsZWQ9UHQoKTtfcG9ydGFsO19vdmVybGF5UmVmPW51bGw7X21lbnVPcGVuPSExO19jbG9zaW5nQWN0aW9uc1N1YnNjcmlwdGlvbj1vMS5FTVBUWTtfbWVudUNsb3NlU3Vic2NyaXB0aW9uPW8xLkVNUFRZO19wZW5kaW5nUmVtb3ZhbDtfcGFyZW50TWF0ZXJpYWxNZW51O19wYXJlbnRJbm5lclBhZGRpbmc7X29wZW5lZEJ5PXZvaWQgMDtnZXQgX21lbnUoKXtyZXR1cm4gdGhpcy5fbWVudUludGVybmFsfXNldCBfbWVudShlKXtlIT09dGhpcy5fbWVudUludGVybmFsJiYodGhpcy5fbWVudUludGVybmFsPWUsdGhpcy5fbWVudUNsb3NlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksZSYmKHRoaXMuX3BhcmVudE1hdGVyaWFsTWVudSx0aGlzLl9tZW51Q2xvc2VTdWJzY3JpcHRpb249ZS5jbG9zZS5zdWJzY3JpYmUoaT0+e3RoaXMuX2Rlc3Ryb3lNZW51KGkpLChpPT09ImNsaWNrInx8aT09PSJ0YWIiKSYmdGhpcy5fcGFyZW50TWF0ZXJpYWxNZW51JiZ0aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnUuY2xvc2VkLmVtaXQoaSl9KSksdGhpcy5fbWVudUl0ZW1JbnN0YW5jZT8uX3NldFRyaWdnZXJzU3VibWVudSh0aGlzLl90cmlnZ2Vyc1N1Ym1lbnUoKSkpfV9tZW51SW50ZXJuYWw7Y29uc3RydWN0b3IoZSl7dGhpcy5fY2FuSGF2ZUJhY2tkcm9wPWU7bGV0IGk9aChuOCx7b3B0aW9uYWw6ITB9KTt0aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnU9aSBpbnN0YW5jZW9mIEtyP2k6dm9pZCAwfW5nT25EZXN0cm95KCl7dGhpcy5fbWVudSYmdGhpcy5fb3duc01lbnUodGhpcy5fbWVudSkmJiRyLmRlbGV0ZSh0aGlzLl9tZW51KSx0aGlzLl9wZW5kaW5nUmVtb3ZhbD8udW5zdWJzY3JpYmUoKSx0aGlzLl9tZW51Q2xvc2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9jbG9zaW5nQWN0aW9uc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX292ZXJsYXlSZWYmJih0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKSx0aGlzLl9vdmVybGF5UmVmPW51bGwpfWdldCBtZW51T3Blbigpe3JldHVybiB0aGlzLl9tZW51T3Blbn1nZXQgZGlyKCl7cmV0dXJuIHRoaXMuX2RpciYmdGhpcy5fZGlyLnZhbHVlPT09InJ0bCI/InJ0bCI6Imx0ciJ9X3RyaWdnZXJzU3VibWVudSgpe3JldHVybiEhKHRoaXMuX21lbnVJdGVtSW5zdGFuY2UmJnRoaXMuX3BhcmVudE1hdGVyaWFsTWVudSYmdGhpcy5fbWVudSl9X2Nsb3NlTWVudSgpe3RoaXMuX21lbnU/LmNsb3NlLmVtaXQoKX1fb3Blbk1lbnUoZSl7bGV0IGk9dGhpcy5fbWVudTtpZih0aGlzLl9tZW51T3Blbnx8IWkpcmV0dXJuO3RoaXMuX3BlbmRpbmdSZW1vdmFsPy51bnN1YnNjcmliZSgpO2xldCBhPSRyLmdldChpKTskci5zZXQoaSx0aGlzKSxhJiZhIT09dGhpcyYmYS5fY2xvc2VNZW51KCk7bGV0IHI9dGhpcy5fY3JlYXRlT3ZlcmxheShpKSxvPXIuZ2V0Q29uZmlnKCksZD1vLnBvc2l0aW9uU3RyYXRlZ3k7dGhpcy5fc2V0UG9zaXRpb24oaSxkKSx0aGlzLl9jYW5IYXZlQmFja2Ryb3A/by5oYXNCYWNrZHJvcD1pLmhhc0JhY2tkcm9wPT1udWxsPyF0aGlzLl90cmlnZ2Vyc1N1Ym1lbnUoKTppLmhhc0JhY2tkcm9wOm8uaGFzQmFja2Ryb3A9ITEsci5oYXNBdHRhY2hlZCgpfHwoci5hdHRhY2godGhpcy5fZ2V0UG9ydGFsKGkpKSxpLmxhenlDb250ZW50Py5hdHRhY2godGhpcy5tZW51RGF0YSkpLHRoaXMuX2Nsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uPXRoaXMuX21lbnVDbG9zaW5nQWN0aW9ucygpLnN1YnNjcmliZSgoKT0+dGhpcy5fY2xvc2VNZW51KCkpLGkucGFyZW50TWVudT10aGlzLl90cmlnZ2Vyc1N1Ym1lbnUoKT90aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnU6dm9pZCAwLGkuZGlyZWN0aW9uPXRoaXMuZGlyLGUmJmkuZm9jdXNGaXJzdEl0ZW0odGhpcy5fb3BlbmVkQnl8fCJwcm9ncmFtIiksdGhpcy5fc2V0SXNNZW51T3BlbighMCksaSBpbnN0YW5jZW9mIEtyJiYoaS5fc2V0SXNPcGVuKCEwKSxpLl9kaXJlY3REZXNjZW5kYW50SXRlbXMuY2hhbmdlcy5waXBlKHh0KGkuY2xvc2UpKS5zdWJzY3JpYmUoKCk9PntkLndpdGhMb2NrZWRQb3NpdGlvbighMSkucmVhcHBseUxhc3RQb3NpdGlvbigpLGQud2l0aExvY2tlZFBvc2l0aW9uKCEwKX0pKX1mb2N1cyhlLGkpe3RoaXMuX2ZvY3VzTW9uaXRvciYmZT90aGlzLl9mb2N1c01vbml0b3IuZm9jdXNWaWEodGhpcy5fZWxlbWVudCxlLGkpOnRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cyhpKX1fZGVzdHJveU1lbnUoZSl7bGV0IGk9dGhpcy5fb3ZlcmxheVJlZixhPXRoaXMuX21lbnU7IWl8fCF0aGlzLm1lbnVPcGVufHwodGhpcy5fY2xvc2luZ0FjdGlvbnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9wZW5kaW5nUmVtb3ZhbD8udW5zdWJzY3JpYmUoKSxhIGluc3RhbmNlb2YgS3ImJnRoaXMuX293bnNNZW51KGEpPyh0aGlzLl9wZW5kaW5nUmVtb3ZhbD1hLl9hbmltYXRpb25Eb25lLnBpcGUoajEoMSkpLnN1YnNjcmliZSgoKT0+e2kuZGV0YWNoKCksJHIuaGFzKGEpfHxhLmxhenlDb250ZW50Py5kZXRhY2goKX0pLGEuX3NldElzT3BlbighMSkpOihpLmRldGFjaCgpLGE/LmxhenlDb250ZW50Py5kZXRhY2goKSksYSYmdGhpcy5fb3duc01lbnUoYSkmJiRyLmRlbGV0ZShhKSx0aGlzLnJlc3RvcmVGb2N1cyYmKGU9PT0ia2V5ZG93biJ8fCF0aGlzLl9vcGVuZWRCeXx8IXRoaXMuX3RyaWdnZXJzU3VibWVudSgpKSYmdGhpcy5mb2N1cyh0aGlzLl9vcGVuZWRCeSksdGhpcy5fb3BlbmVkQnk9dm9pZCAwLHRoaXMuX3NldElzTWVudU9wZW4oITEpKX1fc2V0SXNNZW51T3BlbihlKXtlIT09dGhpcy5fbWVudU9wZW4mJih0aGlzLl9tZW51T3Blbj1lLHRoaXMuX21lbnVPcGVuP3RoaXMubWVudU9wZW5lZC5lbWl0KCk6dGhpcy5tZW51Q2xvc2VkLmVtaXQoKSx0aGlzLl90cmlnZ2Vyc1N1Ym1lbnUoKSYmdGhpcy5fbWVudUl0ZW1JbnN0YW5jZS5fc2V0SGlnaGxpZ2h0ZWQoZSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfV9jcmVhdGVPdmVybGF5KGUpe2lmKCF0aGlzLl9vdmVybGF5UmVmKXtsZXQgaT10aGlzLl9nZXRPdmVybGF5Q29uZmlnKGUpO3RoaXMuX3N1YnNjcmliZVRvUG9zaXRpb25zKGUsaS5wb3NpdGlvblN0cmF0ZWd5KSx0aGlzLl9vdmVybGF5UmVmPXVhKHRoaXMuX2luamVjdG9yLGkpLHRoaXMuX292ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpLnN1YnNjcmliZShhPT57dGhpcy5fbWVudSBpbnN0YW5jZW9mIEtyJiZ0aGlzLl9tZW51Ll9oYW5kbGVLZXlkb3duKGEpfSl9cmV0dXJuIHRoaXMuX292ZXJsYXlSZWZ9X2dldE92ZXJsYXlDb25maWcoZSl7cmV0dXJuIG5ldyBJbih7cG9zaXRpb25TdHJhdGVneTpMbih0aGlzLl9pbmplY3Rvcix0aGlzLl9nZXRPdmVybGF5T3JpZ2luKCkpLndpdGhMb2NrZWRQb3NpdGlvbigpLndpdGhHcm93QWZ0ZXJPcGVuKCkud2l0aFRyYW5zZm9ybU9yaWdpbk9uKCIubWF0LW1lbnUtcGFuZWwsIC5tYXQtbWRjLW1lbnUtcGFuZWwiKSxiYWNrZHJvcENsYXNzOmUuYmFja2Ryb3BDbGFzc3x8ImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wIixwYW5lbENsYXNzOmUub3ZlcmxheVBhbmVsQ2xhc3Msc2Nyb2xsU3RyYXRlZ3k6dGhpcy5fc2Nyb2xsU3RyYXRlZ3koKSxkaXJlY3Rpb246dGhpcy5fZGlyfHwibHRyIixkaXNhYmxlQW5pbWF0aW9uczp0aGlzLl9hbmltYXRpb25zRGlzYWJsZWR9KX1fc3Vic2NyaWJlVG9Qb3NpdGlvbnMoZSxpKXtlLnNldFBvc2l0aW9uQ2xhc3NlcyYmaS5wb3NpdGlvbkNoYW5nZXMuc3Vic2NyaWJlKGE9Pnt0aGlzLl9uZ1pvbmUucnVuKCgpPT57bGV0IHI9YS5jb25uZWN0aW9uUGFpci5vdmVybGF5WD09PSJzdGFydCI/ImFmdGVyIjoiYmVmb3JlIixvPWEuY29ubmVjdGlvblBhaXIub3ZlcmxheVk9PT0idG9wIj8iYmVsb3ciOiJhYm92ZSI7ZS5zZXRQb3NpdGlvbkNsYXNzZXMocixvKX0pfSl9X3NldFBvc2l0aW9uKGUsaSl7bGV0W2Escl09ZS54UG9zaXRpb249PT0iYmVmb3JlIj9bImVuZCIsInN0YXJ0Il06WyJzdGFydCIsImVuZCJdLFtvLGRdPWUueVBvc2l0aW9uPT09ImFib3ZlIj9bImJvdHRvbSIsInRvcCJdOlsidG9wIiwiYm90dG9tIl0sW3AsZ109W28sZF0sW18seV09W2Escl0sST0wO2lmKHRoaXMuX3RyaWdnZXJzU3VibWVudSgpKXtpZih5PWE9ZS54UG9zaXRpb249PT0iYmVmb3JlIj8ic3RhcnQiOiJlbmQiLHI9Xz1hPT09ImVuZCI/InN0YXJ0IjoiZW5kIix0aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnUpe2lmKHRoaXMuX3BhcmVudElubmVyUGFkZGluZz09bnVsbCl7bGV0IFA9dGhpcy5fcGFyZW50TWF0ZXJpYWxNZW51Lml0ZW1zLmZpcnN0O3RoaXMuX3BhcmVudElubmVyUGFkZGluZz1QP1AuX2dldEhvc3RFbGVtZW50KCkub2Zmc2V0VG9wOjB9ST1vPT09ImJvdHRvbSI/dGhpcy5fcGFyZW50SW5uZXJQYWRkaW5nOi10aGlzLl9wYXJlbnRJbm5lclBhZGRpbmd9fWVsc2UgZS5vdmVybGFwVHJpZ2dlcnx8KHA9bz09PSJ0b3AiPyJib3R0b20iOiJ0b3AiLGc9ZD09PSJ0b3AiPyJib3R0b20iOiJ0b3AiKTtpLndpdGhQb3NpdGlvbnMoW3tvcmlnaW5YOmEsb3JpZ2luWTpwLG92ZXJsYXlYOl8sb3ZlcmxheVk6byxvZmZzZXRZOkl9LHtvcmlnaW5YOnIsb3JpZ2luWTpwLG92ZXJsYXlYOnksb3ZlcmxheVk6byxvZmZzZXRZOkl9LHtvcmlnaW5YOmEsb3JpZ2luWTpnLG92ZXJsYXlYOl8sb3ZlcmxheVk6ZCxvZmZzZXRZOi1JfSx7b3JpZ2luWDpyLG9yaWdpblk6ZyxvdmVybGF5WDp5LG92ZXJsYXlZOmQsb2Zmc2V0WTotSX1dKX1fbWVudUNsb3NpbmdBY3Rpb25zKCl7bGV0IGU9dGhpcy5fZ2V0T3V0c2lkZUNsaWNrU3RyZWFtKHRoaXMuX292ZXJsYXlSZWYpLGk9dGhpcy5fb3ZlcmxheVJlZi5kZXRhY2htZW50cygpLGE9dGhpcy5fcGFyZW50TWF0ZXJpYWxNZW51P3RoaXMuX3BhcmVudE1hdGVyaWFsTWVudS5jbG9zZWQ6YzEoKSxyPXRoaXMuX3BhcmVudE1hdGVyaWFsTWVudT90aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnUuX2hvdmVyZWQoKS5waXBlKCR0KG89PnRoaXMuX21lbnVPcGVuJiZvIT09dGhpcy5fbWVudUl0ZW1JbnN0YW5jZSkpOmMxKCk7cmV0dXJuIEt0KGUsYSxyLGkpfV9nZXRQb3J0YWwoZSl7cmV0dXJuKCF0aGlzLl9wb3J0YWx8fHRoaXMuX3BvcnRhbC50ZW1wbGF0ZVJlZiE9PWUudGVtcGxhdGVSZWYpJiYodGhpcy5fcG9ydGFsPW5ldyBwYShlLnRlbXBsYXRlUmVmLHRoaXMuX3ZpZXdDb250YWluZXJSZWYpKSx0aGlzLl9wb3J0YWx9X293bnNNZW51KGUpe3JldHVybiAkci5nZXQoZSk9PT10aGlzfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7dTAoKX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnR9KX1yZXR1cm4gdH0pKCksWWY9KCgpPT57Y2xhc3MgdCBleHRlbmRzICRFe19jbGVhbnVwVG91Y2hzdGFydDtfaG92ZXJTdWJzY3JpcHRpb249bzEuRU1QVFk7Z2V0IF9kZXByZWNhdGVkTWF0TWVudVRyaWdnZXJGb3IoKXtyZXR1cm4gdGhpcy5tZW51fXNldCBfZGVwcmVjYXRlZE1hdE1lbnVUcmlnZ2VyRm9yKGUpe3RoaXMubWVudT1lfWdldCBtZW51KCl7cmV0dXJuIHRoaXMuX21lbnV9c2V0IG1lbnUoZSl7dGhpcy5fbWVudT1lfW1lbnVEYXRhO3Jlc3RvcmVGb2N1cz0hMDttZW51T3BlbmVkPW5ldyBOO29uTWVudU9wZW49dGhpcy5tZW51T3BlbmVkO21lbnVDbG9zZWQ9bmV3IE47b25NZW51Q2xvc2U9dGhpcy5tZW51Q2xvc2VkO2NvbnN0cnVjdG9yKCl7c3VwZXIoITApO2xldCBlPWgodjEpO3RoaXMuX2NsZWFudXBUb3VjaHN0YXJ0PWUubGlzdGVuKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCwidG91Y2hzdGFydCIsaT0+e2RtKGkpfHwodGhpcy5fb3BlbmVkQnk9InRvdWNoIil9LHtwYXNzaXZlOiEwfSl9dHJpZ2dlcnNTdWJtZW51KCl7cmV0dXJuIHN1cGVyLl90cmlnZ2Vyc1N1Ym1lbnUoKX10b2dnbGVNZW51KCl7cmV0dXJuIHRoaXMubWVudU9wZW4/dGhpcy5jbG9zZU1lbnUoKTp0aGlzLm9wZW5NZW51KCl9b3Blbk1lbnUoKXt0aGlzLl9vcGVuTWVudSghMCl9Y2xvc2VNZW51KCl7dGhpcy5fY2xvc2VNZW51KCl9dXBkYXRlUG9zaXRpb24oKXt0aGlzLl9vdmVybGF5UmVmPy51cGRhdGVQb3NpdGlvbigpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2hhbmRsZUhvdmVyKCl9bmdPbkRlc3Ryb3koKXtzdXBlci5uZ09uRGVzdHJveSgpLHRoaXMuX2NsZWFudXBUb3VjaHN0YXJ0KCksdGhpcy5faG92ZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKX1fZ2V0T3ZlcmxheU9yaWdpbigpe3JldHVybiB0aGlzLl9lbGVtZW50fV9nZXRPdXRzaWRlQ2xpY2tTdHJlYW0oZSl7cmV0dXJuIGUuYmFja2Ryb3BDbGljaygpfV9oYW5kbGVNb3VzZWRvd24oZSl7bG0oZSl8fCh0aGlzLl9vcGVuZWRCeT1lLmJ1dHRvbj09PTA/Im1vdXNlIjp2b2lkIDAsdGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKSYmZS5wcmV2ZW50RGVmYXVsdCgpKX1faGFuZGxlS2V5ZG93bihlKXtsZXQgaT1lLmtleUNvZGU7KGk9PT0xM3x8aT09PTMyKSYmKHRoaXMuX29wZW5lZEJ5PSJrZXlib2FyZCIpLHRoaXMudHJpZ2dlcnNTdWJtZW51KCkmJihpPT09MzkmJnRoaXMuZGlyPT09Imx0ciJ8fGk9PT0zNyYmdGhpcy5kaXI9PT0icnRsIikmJih0aGlzLl9vcGVuZWRCeT0ia2V5Ym9hcmQiLHRoaXMub3Blbk1lbnUoKSl9X2hhbmRsZUNsaWNrKGUpe3RoaXMudHJpZ2dlcnNTdWJtZW51KCk/KGUuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5vcGVuTWVudSgpKTp0aGlzLnRvZ2dsZU1lbnUoKX1faGFuZGxlSG92ZXIoKXt0aGlzLnRyaWdnZXJzU3VibWVudSgpJiZ0aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnUmJih0aGlzLl9ob3ZlclN1YnNjcmlwdGlvbj10aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnUuX2hvdmVyZWQoKS5zdWJzY3JpYmUoZT0+e2U9PT10aGlzLl9tZW51SXRlbUluc3RhbmNlJiYhZS5kaXNhYmxlZCYmdGhpcy5fcGFyZW50TWF0ZXJpYWxNZW51Py5fcGFuZWxBbmltYXRpb25TdGF0ZSE9PSJ2b2lkIiYmKHRoaXMuX29wZW5lZEJ5PSJtb3VzZSIsdGhpcy5fb3Blbk1lbnUoITEpKX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXQtbWVudS10cmlnZ2VyLWZvciIsIiJdLFsiIiwibWF0TWVudVRyaWdnZXJGb3IiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtbWRjLW1lbnUtdHJpZ2dlciJdLGhvc3RWYXJzOjMsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGksYSl7aSYxJiZTKCJjbGljayIsZnVuY3Rpb24obyl7cmV0dXJuIGEuX2hhbmRsZUNsaWNrKG8pfSkoIm1vdXNlZG93biIsZnVuY3Rpb24obyl7cmV0dXJuIGEuX2hhbmRsZU1vdXNlZG93bihvKX0pKCJrZXlkb3duIixmdW5jdGlvbihvKXtyZXR1cm4gYS5faGFuZGxlS2V5ZG93bihvKX0pLGkmMiYmRygiYXJpYS1oYXNwb3B1cCIsYS5tZW51PyJtZW51IjpudWxsKSgiYXJpYS1leHBhbmRlZCIsYS5tZW51T3BlbikoImFyaWEtY29udHJvbHMiLGEubWVudU9wZW4/YS5tZW51PT1udWxsP251bGw6YS5tZW51LnBhbmVsSWQ6bnVsbCl9LGlucHV0czp7X2RlcHJlY2F0ZWRNYXRNZW51VHJpZ2dlckZvcjpbMCwibWF0LW1lbnUtdHJpZ2dlci1mb3IiLCJfZGVwcmVjYXRlZE1hdE1lbnVUcmlnZ2VyRm9yIl0sbWVudTpbMCwibWF0TWVudVRyaWdnZXJGb3IiLCJtZW51Il0sbWVudURhdGE6WzAsIm1hdE1lbnVUcmlnZ2VyRGF0YSIsIm1lbnVEYXRhIl0scmVzdG9yZUZvY3VzOlswLCJtYXRNZW51VHJpZ2dlclJlc3RvcmVGb2N1cyIsInJlc3RvcmVGb2N1cyJdfSxvdXRwdXRzOnttZW51T3BlbmVkOiJtZW51T3BlbmVkIixvbk1lbnVPcGVuOiJvbk1lbnVPcGVuIixtZW51Q2xvc2VkOiJtZW51Q2xvc2VkIixvbk1lbnVDbG9zZToib25NZW51Q2xvc2UifSxleHBvcnRBczpbIm1hdE1lbnVUcmlnZ2VyIl0sZmVhdHVyZXM6W0ZlXX0pfXJldHVybiB0fSkoKSxaZj0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NW1vZD14ZSh7dHlwZTp0fSk7c3RhdGljIFx1MDI3NWluaj15ZSh7cHJvdmlkZXJzOltaRV0saW1wb3J0czpbdWksemUsQmksWGksemVdfSl9cmV0dXJuIHR9KSgpLCRmPXt0cmFuc2Zvcm1NZW51Ont0eXBlOjcsbmFtZToidHJhbnNmb3JtTWVudSIsZGVmaW5pdGlvbnM6W3t0eXBlOjAsbmFtZToidm9pZCIsc3R5bGVzOnt0eXBlOjYsc3R5bGVzOntvcGFjaXR5OjAsdHJhbnNmb3JtOiJzY2FsZSgwLjgpIn0sb2Zmc2V0Om51bGx9fSx7dHlwZToxLGV4cHI6InZvaWQgPT4gZW50ZXIiLGFuaW1hdGlvbjp7dHlwZTo0LHN0eWxlczp7dHlwZTo2LHN0eWxlczp7b3BhY2l0eToxLHRyYW5zZm9ybToic2NhbGUoMSkifSxvZmZzZXQ6bnVsbH0sdGltaW5nczoiMTIwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSkifSxvcHRpb25zOm51bGx9LHt0eXBlOjEsZXhwcjoiKiA9PiB2b2lkIixhbmltYXRpb246e3R5cGU6NCxzdHlsZXM6e3R5cGU6NixzdHlsZXM6e29wYWNpdHk6MH0sb2Zmc2V0Om51bGx9LHRpbWluZ3M6IjEwMG1zIDI1bXMgbGluZWFyIn0sb3B0aW9uczpudWxsfV0sb3B0aW9uczp7fX0sZmFkZUluSXRlbXM6e3R5cGU6NyxuYW1lOiJmYWRlSW5JdGVtcyIsZGVmaW5pdGlvbnM6W3t0eXBlOjAsbmFtZToic2hvd2luZyIsc3R5bGVzOnt0eXBlOjYsc3R5bGVzOntvcGFjaXR5OjF9LG9mZnNldDpudWxsfX0se3R5cGU6MSxleHByOiJ2b2lkID0+ICoiLGFuaW1hdGlvbjpbe3R5cGU6NixzdHlsZXM6e29wYWNpdHk6MH0sb2Zmc2V0Om51bGx9LHt0eXBlOjQsc3R5bGVzOm51bGwsdGltaW5nczoiNDAwbXMgMTAwbXMgY3ViaWMtYmV6aWVyKDAuNTUsIDAsIDAuNTUsIDAuMikifV0sb3B0aW9uczpudWxsfV0sb3B0aW9uczp7fX19LEF0ZT0kZi5mYWRlSW5JdGVtcyxEdGU9JGYudHJhbnNmb3JtTWVudX0pO2Z1bmN0aW9uIGc0KHQsbil7cmV0dXJue3R5cGU6cHQuVHJpZ2dlcixuYW1lOnQsZGVmaW5pdGlvbnM6bixvcHRpb25zOnt9fX1mdW5jdGlvbiBYcih0LG49bnVsbCl7cmV0dXJue3R5cGU6cHQuQW5pbWF0ZSxzdHlsZXM6bix0aW1pbmdzOnR9fWZ1bmN0aW9uIEtmKHQsbj1udWxsKXtyZXR1cm57dHlwZTpwdC5TZXF1ZW5jZSxzdGVwczp0LG9wdGlvbnM6bn19ZnVuY3Rpb24gc2EodCl7cmV0dXJue3R5cGU6cHQuU3R5bGUsc3R5bGVzOnQsb2Zmc2V0Om51bGx9fWZ1bmN0aW9uIHozKHQsbixlKXtyZXR1cm57dHlwZTpwdC5TdGF0ZSxuYW1lOnQsc3R5bGVzOm4sb3B0aW9uczplfX1mdW5jdGlvbiBKcih0LG4sZT1udWxsKXtyZXR1cm57dHlwZTpwdC5UcmFuc2l0aW9uLGV4cHI6dCxhbmltYXRpb246bixvcHRpb25zOmV9fXZhciBwdCx5MixjYSxXbixlbyxUMz14KCgpPT57cHQ9KGZ1bmN0aW9uKHQpe3JldHVybiB0W3QuU3RhdGU9MF09IlN0YXRlIix0W3QuVHJhbnNpdGlvbj0xXT0iVHJhbnNpdGlvbiIsdFt0LlNlcXVlbmNlPTJdPSJTZXF1ZW5jZSIsdFt0Lkdyb3VwPTNdPSJHcm91cCIsdFt0LkFuaW1hdGU9NF09IkFuaW1hdGUiLHRbdC5LZXlmcmFtZXM9NV09IktleWZyYW1lcyIsdFt0LlN0eWxlPTZdPSJTdHlsZSIsdFt0LlRyaWdnZXI9N109IlRyaWdnZXIiLHRbdC5SZWZlcmVuY2U9OF09IlJlZmVyZW5jZSIsdFt0LkFuaW1hdGVDaGlsZD05XT0iQW5pbWF0ZUNoaWxkIix0W3QuQW5pbWF0ZVJlZj0xMF09IkFuaW1hdGVSZWYiLHRbdC5RdWVyeT0xMV09IlF1ZXJ5Iix0W3QuU3RhZ2dlcj0xMl09IlN0YWdnZXIiLHR9KShwdHx8e30pLHkyPSIqIjtjYT1jbGFzc3tfb25Eb25lRm5zPVtdO19vblN0YXJ0Rm5zPVtdO19vbkRlc3Ryb3lGbnM9W107X29yaWdpbmFsT25Eb25lRm5zPVtdO19vcmlnaW5hbE9uU3RhcnRGbnM9W107X3N0YXJ0ZWQ9ITE7X2Rlc3Ryb3llZD0hMTtfZmluaXNoZWQ9ITE7X3Bvc2l0aW9uPTA7cGFyZW50UGxheWVyPW51bGw7dG90YWxUaW1lO2NvbnN0cnVjdG9yKG49MCxlPTApe3RoaXMudG90YWxUaW1lPW4rZX1fb25GaW5pc2goKXt0aGlzLl9maW5pc2hlZHx8KHRoaXMuX2ZpbmlzaGVkPSEwLHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKG49Pm4oKSksdGhpcy5fb25Eb25lRm5zPVtdKX1vblN0YXJ0KG4pe3RoaXMuX29yaWdpbmFsT25TdGFydEZucy5wdXNoKG4pLHRoaXMuX29uU3RhcnRGbnMucHVzaChuKX1vbkRvbmUobil7dGhpcy5fb3JpZ2luYWxPbkRvbmVGbnMucHVzaChuKSx0aGlzLl9vbkRvbmVGbnMucHVzaChuKX1vbkRlc3Ryb3kobil7dGhpcy5fb25EZXN0cm95Rm5zLnB1c2gobil9aGFzU3RhcnRlZCgpe3JldHVybiB0aGlzLl9zdGFydGVkfWluaXQoKXt9cGxheSgpe3RoaXMuaGFzU3RhcnRlZCgpfHwodGhpcy5fb25TdGFydCgpLHRoaXMudHJpZ2dlck1pY3JvdGFzaygpKSx0aGlzLl9zdGFydGVkPSEwfXRyaWdnZXJNaWNyb3Rhc2soKXtxdWV1ZU1pY3JvdGFzaygoKT0+dGhpcy5fb25GaW5pc2goKSl9X29uU3RhcnQoKXt0aGlzLl9vblN0YXJ0Rm5zLmZvckVhY2gobj0+bigpKSx0aGlzLl9vblN0YXJ0Rm5zPVtdfXBhdXNlKCl7fXJlc3RhcnQoKXt9ZmluaXNoKCl7dGhpcy5fb25GaW5pc2goKX1kZXN0cm95KCl7dGhpcy5fZGVzdHJveWVkfHwodGhpcy5fZGVzdHJveWVkPSEwLHRoaXMuaGFzU3RhcnRlZCgpfHx0aGlzLl9vblN0YXJ0KCksdGhpcy5maW5pc2goKSx0aGlzLl9vbkRlc3Ryb3lGbnMuZm9yRWFjaChuPT5uKCkpLHRoaXMuX29uRGVzdHJveUZucz1bXSl9cmVzZXQoKXt0aGlzLl9zdGFydGVkPSExLHRoaXMuX2ZpbmlzaGVkPSExLHRoaXMuX29uU3RhcnRGbnM9dGhpcy5fb3JpZ2luYWxPblN0YXJ0Rm5zLHRoaXMuX29uRG9uZUZucz10aGlzLl9vcmlnaW5hbE9uRG9uZUZuc31zZXRQb3NpdGlvbihuKXt0aGlzLl9wb3NpdGlvbj10aGlzLnRvdGFsVGltZT9uKnRoaXMudG90YWxUaW1lOjF9Z2V0UG9zaXRpb24oKXtyZXR1cm4gdGhpcy50b3RhbFRpbWU/dGhpcy5fcG9zaXRpb24vdGhpcy50b3RhbFRpbWU6MX10cmlnZ2VyQ2FsbGJhY2sobil7bGV0IGU9bj09InN0YXJ0Ij90aGlzLl9vblN0YXJ0Rm5zOnRoaXMuX29uRG9uZUZucztlLmZvckVhY2goaT0+aSgpKSxlLmxlbmd0aD0wfX0sV249Y2xhc3N7X29uRG9uZUZucz1bXTtfb25TdGFydEZucz1bXTtfZmluaXNoZWQ9ITE7X3N0YXJ0ZWQ9ITE7X2Rlc3Ryb3llZD0hMTtfb25EZXN0cm95Rm5zPVtdO3BhcmVudFBsYXllcj1udWxsO3RvdGFsVGltZT0wO3BsYXllcnM7Y29uc3RydWN0b3Iobil7dGhpcy5wbGF5ZXJzPW47bGV0IGU9MCxpPTAsYT0wLHI9dGhpcy5wbGF5ZXJzLmxlbmd0aDtyPT0wP3F1ZXVlTWljcm90YXNrKCgpPT50aGlzLl9vbkZpbmlzaCgpKTp0aGlzLnBsYXllcnMuZm9yRWFjaChvPT57by5vbkRvbmUoKCk9PnsrK2U9PXImJnRoaXMuX29uRmluaXNoKCl9KSxvLm9uRGVzdHJveSgoKT0+eysraT09ciYmdGhpcy5fb25EZXN0cm95KCl9KSxvLm9uU3RhcnQoKCk9PnsrK2E9PXImJnRoaXMuX29uU3RhcnQoKX0pfSksdGhpcy50b3RhbFRpbWU9dGhpcy5wbGF5ZXJzLnJlZHVjZSgobyxkKT0+TWF0aC5tYXgobyxkLnRvdGFsVGltZSksMCl9X29uRmluaXNoKCl7dGhpcy5fZmluaXNoZWR8fCh0aGlzLl9maW5pc2hlZD0hMCx0aGlzLl9vbkRvbmVGbnMuZm9yRWFjaChuPT5uKCkpLHRoaXMuX29uRG9uZUZucz1bXSl9aW5pdCgpe3RoaXMucGxheWVycy5mb3JFYWNoKG49Pm4uaW5pdCgpKX1vblN0YXJ0KG4pe3RoaXMuX29uU3RhcnRGbnMucHVzaChuKX1fb25TdGFydCgpe3RoaXMuaGFzU3RhcnRlZCgpfHwodGhpcy5fc3RhcnRlZD0hMCx0aGlzLl9vblN0YXJ0Rm5zLmZvckVhY2gobj0+bigpKSx0aGlzLl9vblN0YXJ0Rm5zPVtdKX1vbkRvbmUobil7dGhpcy5fb25Eb25lRm5zLnB1c2gobil9b25EZXN0cm95KG4pe3RoaXMuX29uRGVzdHJveUZucy5wdXNoKG4pfWhhc1N0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5fc3RhcnRlZH1wbGF5KCl7dGhpcy5wYXJlbnRQbGF5ZXJ8fHRoaXMuaW5pdCgpLHRoaXMuX29uU3RhcnQoKSx0aGlzLnBsYXllcnMuZm9yRWFjaChuPT5uLnBsYXkoKSl9cGF1c2UoKXt0aGlzLnBsYXllcnMuZm9yRWFjaChuPT5uLnBhdXNlKCkpfXJlc3RhcnQoKXt0aGlzLnBsYXllcnMuZm9yRWFjaChuPT5uLnJlc3RhcnQoKSl9ZmluaXNoKCl7dGhpcy5fb25GaW5pc2goKSx0aGlzLnBsYXllcnMuZm9yRWFjaChuPT5uLmZpbmlzaCgpKX1kZXN0cm95KCl7dGhpcy5fb25EZXN0cm95KCl9X29uRGVzdHJveSgpe3RoaXMuX2Rlc3Ryb3llZHx8KHRoaXMuX2Rlc3Ryb3llZD0hMCx0aGlzLl9vbkZpbmlzaCgpLHRoaXMucGxheWVycy5mb3JFYWNoKG49Pm4uZGVzdHJveSgpKSx0aGlzLl9vbkRlc3Ryb3lGbnMuZm9yRWFjaChuPT5uKCkpLHRoaXMuX29uRGVzdHJveUZucz1bXSl9cmVzZXQoKXt0aGlzLnBsYXllcnMuZm9yRWFjaChuPT5uLnJlc2V0KCkpLHRoaXMuX2Rlc3Ryb3llZD0hMSx0aGlzLl9maW5pc2hlZD0hMSx0aGlzLl9zdGFydGVkPSExfXNldFBvc2l0aW9uKG4pe2xldCBlPW4qdGhpcy50b3RhbFRpbWU7dGhpcy5wbGF5ZXJzLmZvckVhY2goaT0+e2xldCBhPWkudG90YWxUaW1lP01hdGgubWluKDEsZS9pLnRvdGFsVGltZSk6MTtpLnNldFBvc2l0aW9uKGEpfSl9Z2V0UG9zaXRpb24oKXtsZXQgbj10aGlzLnBsYXllcnMucmVkdWNlKChlLGkpPT5lPT09bnVsbHx8aS50b3RhbFRpbWU+ZS50b3RhbFRpbWU/aTplLG51bGwpO3JldHVybiBuIT1udWxsP24uZ2V0UG9zaXRpb24oKTowfWJlZm9yZURlc3Ryb3koKXt0aGlzLnBsYXllcnMuZm9yRWFjaChuPT57bi5iZWZvcmVEZXN0cm95JiZuLmJlZm9yZURlc3Ryb3koKX0pfXRyaWdnZXJDYWxsYmFjayhuKXtsZXQgZT1uPT0ic3RhcnQiP3RoaXMuX29uU3RhcnRGbnM6dGhpcy5fb25Eb25lRm5zO2UuZm9yRWFjaChpPT5pKCkpLGUubGVuZ3RoPTB9fSxlbz0iISJ9KTt2YXIgbzg9eCgoKT0+e1QzKCk7fSk7dmFyIEUzLGM4PXgoKCk9PntrKCk7ZmkoKTtFMz0oKCk9PntjbGFzcyB0e19hbmltYXRpb25zRGlzYWJsZWQ9UHQoKTtzdGF0ZT0idW5jaGVja2VkIjtkaXNhYmxlZD0hMTthcHBlYXJhbmNlPSJmdWxsIjtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJtYXQtcHNldWRvLWNoZWNrYm94Il1dLGhvc3RBdHRyczpbMSwibWF0LXBzZXVkby1jaGVja2JveCJdLGhvc3RWYXJzOjEyLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmaWUoIm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSIsYS5zdGF0ZT09PSJpbmRldGVybWluYXRlIikoIm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCIsYS5zdGF0ZT09PSJjaGVja2VkIikoIm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWQiLGEuZGlzYWJsZWQpKCJtYXQtcHNldWRvLWNoZWNrYm94LW1pbmltYWwiLGEuYXBwZWFyYW5jZT09PSJtaW5pbWFsIikoIm1hdC1wc2V1ZG8tY2hlY2tib3gtZnVsbCIsYS5hcHBlYXJhbmNlPT09ImZ1bGwiKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLGEuX2FuaW1hdGlvbnNEaXNhYmxlZCl9LGlucHV0czp7c3RhdGU6InN0YXRlIixkaXNhYmxlZDoiZGlzYWJsZWQiLGFwcGVhcmFuY2U6ImFwcGVhcmFuY2UifSxkZWNsczowLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe30sc3R5bGVzOltgLm1hdC1wc2V1ZG8tY2hlY2tib3h7Ym9yZGVyLXJhZGl1czoycHg7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4LXNocmluazowO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKSxiYWNrZ3JvdW5kLWNvbG9yIDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKX0ubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowO2NvbnRlbnQ6IiI7Ym9yZGVyLWJvdHRvbToycHggc29saWQgY3VycmVudENvbG9yO3RyYW5zaXRpb246b3BhY2l0eSA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSl9Lm1hdC1wc2V1ZG8tY2hlY2tib3guX21hdC1hbmltYXRpb24tbm9vcGFibGV7dHJhbnNpdGlvbjpub25lICFpbXBvcnRhbnQ7YW5pbWF0aW9uOm5vbmUgIWltcG9ydGFudH0ubWF0LXBzZXVkby1jaGVja2JveC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZTo6YWZ0ZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGU6OmFmdGVye2xlZnQ6MXB4O29wYWNpdHk6MTtib3JkZXItcmFkaXVzOjJweH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkOjphZnRlcntsZWZ0OjFweDtib3JkZXItbGVmdDoycHggc29saWQgY3VycmVudENvbG9yO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTtvcGFjaXR5OjE7Ym94LXNpemluZzpjb250ZW50LWJveH0ubWF0LXBzZXVkby1jaGVja2JveC1taW5pbWFsLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZDo6YWZ0ZXIsLm1hdC1wc2V1ZG8tY2hlY2tib3gtbWluaW1hbC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGU6OmFmdGVye2NvbG9yOnZhcigtLW1hdC1wc2V1ZG8tY2hlY2tib3gtbWluaW1hbC1zZWxlY3RlZC1jaGVja21hcmstY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tYXQtcHNldWRvLWNoZWNrYm94LW1pbmltYWwubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWQ6OmFmdGVyLC5tYXQtcHNldWRvLWNoZWNrYm94LW1pbmltYWwubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWQ6OmFmdGVye2NvbG9yOnZhcigtLW1hdC1wc2V1ZG8tY2hlY2tib3gtbWluaW1hbC1kaXNhYmxlZC1zZWxlY3RlZC1jaGVja21hcmstY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKX0ubWF0LXBzZXVkby1jaGVja2JveC1mdWxse2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtcHNldWRvLWNoZWNrYm94LWZ1bGwtdW5zZWxlY3RlZC1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpO2JvcmRlci13aWR0aDoycHg7Ym9yZGVyLXN0eWxlOnNvbGlkfS5tYXQtcHNldWRvLWNoZWNrYm94LWZ1bGwubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtib3JkZXItY29sb3I6dmFyKC0tbWF0LXBzZXVkby1jaGVja2JveC1mdWxsLWRpc2FibGVkLXVuc2VsZWN0ZWQtaWNvbi1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpfS5tYXQtcHNldWRvLWNoZWNrYm94LWZ1bGwubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtcHNldWRvLWNoZWNrYm94LWZ1bGwubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXBzZXVkby1jaGVja2JveC1mdWxsLXNlbGVjdGVkLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpO2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLDApfS5tYXQtcHNldWRvLWNoZWNrYm94LWZ1bGwubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkOjphZnRlciwubWF0LXBzZXVkby1jaGVja2JveC1mdWxsLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZTo6YWZ0ZXJ7Y29sb3I6dmFyKC0tbWF0LXBzZXVkby1jaGVja2JveC1mdWxsLXNlbGVjdGVkLWNoZWNrbWFyay1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1wcmltYXJ5KSl9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtZnVsbC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCwubWF0LXBzZXVkby1jaGVja2JveC1mdWxsLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXBzZXVkby1jaGVja2JveC1mdWxsLWRpc2FibGVkLXNlbGVjdGVkLWljb24tY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKX0ubWF0LXBzZXVkby1jaGVja2JveC1mdWxsLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkOjphZnRlciwubWF0LXBzZXVkby1jaGVja2JveC1mdWxsLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkOjphZnRlcntjb2xvcjp2YXIoLS1tYXQtcHNldWRvLWNoZWNrYm94LWZ1bGwtZGlzYWJsZWQtc2VsZWN0ZWQtY2hlY2ttYXJrLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXN1cmZhY2UpKX0ubWF0LXBzZXVkby1jaGVja2JveHt3aWR0aDoxOHB4O2hlaWdodDoxOHB4fS5tYXQtcHNldWRvLWNoZWNrYm94LW1pbmltYWwubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkOjphZnRlcnt3aWR0aDoxNHB4O2hlaWdodDo2cHg7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dG9wOi00LjI0MjY0MDY4NzFweDtsZWZ0OjA7Ym90dG9tOjA7cmlnaHQ6MDttYXJnaW46YXV0b30ubWF0LXBzZXVkby1jaGVja2JveC1taW5pbWFsLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZTo6YWZ0ZXJ7dG9wOjhweDt3aWR0aDoxNnB4fS5tYXQtcHNldWRvLWNoZWNrYm94LWZ1bGwubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkOjphZnRlcnt3aWR0aDoxMHB4O2hlaWdodDo0cHg7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dG9wOi0yLjgyODQyNzEyNDdweDtsZWZ0OjA7Ym90dG9tOjA7cmlnaHQ6MDttYXJnaW46YXV0b30ubWF0LXBzZXVkby1jaGVja2JveC1mdWxsLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZTo6YWZ0ZXJ7dG9wOjZweDt3aWR0aDoxMnB4fQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBlQSh0LG4pe2lmKHQmMSYmdSgwLCJtYXQtcHNldWRvLWNoZWNrYm94IiwxKSx0JjIpe2xldCBlPXYoKTtmKCJkaXNhYmxlZCIsZS5kaXNhYmxlZCkoInN0YXRlIixlLnNlbGVjdGVkPyJjaGVja2VkIjoidW5jaGVja2VkIil9fWZ1bmN0aW9uIHRBKHQsbil7aWYodCYxJiZ1KDAsIm1hdC1wc2V1ZG8tY2hlY2tib3giLDMpLHQmMil7bGV0IGU9digpO2YoImRpc2FibGVkIixlLmRpc2FibGVkKX19ZnVuY3Rpb24gaUEodCxuKXtpZih0JjEmJihjKDAsInNwYW4iLDQpLG0oMSkscygpKSx0JjIpe2xldCBlPXYoKTtsKCksRSgiKCIsZS5ncm91cC5sYWJlbCwiKSIpfX1mdW5jdGlvbiBzOCh0LG4sZSl7aWYoZS5sZW5ndGgpe2xldCBpPW4udG9BcnJheSgpLGE9ZS50b0FycmF5KCkscj0wO2ZvcihsZXQgbz0wO288dCsxO28rKylpW29dLmdyb3VwJiZpW29dLmdyb3VwPT09YVtyXSYmcisrO3JldHVybiByfXJldHVybiAwfWZ1bmN0aW9uIGw4KHQsbixlLGkpe3JldHVybiB0PGU/dDp0K24+ZStpP01hdGgubWF4KDAsdC1pK24pOmV9dmFyIEtFLFhFLEpFLEQzLEkzLEEzLEgyLHY0PXgoKCk9Pnt4aSgpO1kyKCk7aygpO2soKTtYdCgpO0syKCk7YzgoKTtJMigpO0EyKCk7S0U9WyJ0ZXh0Il0sWEU9W1tbIm1hdC1pY29uIl1dLCIqIl0sSkU9WyJtYXQtaWNvbiIsIioiXTtEMz1uZXcgY2UoIk1BVF9PUFRJT05fUEFSRU5UX0NPTVBPTkVOVCIpLEkzPW5ldyBjZSgiTWF0T3B0Z3JvdXAiKSxBMz1jbGFzc3tzb3VyY2U7aXNVc2VySW5wdXQ7Y29uc3RydWN0b3IobixlPSExKXt0aGlzLnNvdXJjZT1uLHRoaXMuaXNVc2VySW5wdXQ9ZX19LEgyPSgoKT0+e2NsYXNzIHR7X2VsZW1lbnQ9aChhZSk7X2NoYW5nZURldGVjdG9yUmVmPWgoRWUpO19wYXJlbnQ9aChEMyx7b3B0aW9uYWw6ITB9KTtncm91cD1oKEkzLHtvcHRpb25hbDohMH0pO19zaWduYWxEaXNhYmxlUmlwcGxlPSExO19zZWxlY3RlZD0hMTtfYWN0aXZlPSExO19tb3N0UmVjZW50Vmlld1ZhbHVlPSIiO2dldCBtdWx0aXBsZSgpe3JldHVybiB0aGlzLl9wYXJlbnQmJnRoaXMuX3BhcmVudC5tdWx0aXBsZX1nZXQgc2VsZWN0ZWQoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWR9dmFsdWU7aWQ9aChxdCkuZ2V0SWQoIm1hdC1vcHRpb24tIik7Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuZ3JvdXAmJnRoaXMuZ3JvdXAuZGlzYWJsZWR8fHRoaXMuX2Rpc2FibGVkKCl9c2V0IGRpc2FibGVkKGUpe3RoaXMuX2Rpc2FibGVkLnNldChlKX1fZGlzYWJsZWQ9ZnQoITEpO2dldCBkaXNhYmxlUmlwcGxlKCl7cmV0dXJuIHRoaXMuX3NpZ25hbERpc2FibGVSaXBwbGU/dGhpcy5fcGFyZW50LmRpc2FibGVSaXBwbGUoKTohIXRoaXMuX3BhcmVudD8uZGlzYWJsZVJpcHBsZX1nZXQgaGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvcigpe3JldHVybiEhKHRoaXMuX3BhcmVudCYmdGhpcy5fcGFyZW50LmhpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3IpfW9uU2VsZWN0aW9uQ2hhbmdlPW5ldyBOO190ZXh0O19zdGF0ZUNoYW5nZXM9bmV3IHdlO2NvbnN0cnVjdG9yKCl7bGV0IGU9aChDMSk7ZS5sb2FkKEUxKSxlLmxvYWQoX3IpLHRoaXMuX3NpZ25hbERpc2FibGVSaXBwbGU9ISF0aGlzLl9wYXJlbnQmJkhkKHRoaXMuX3BhcmVudC5kaXNhYmxlUmlwcGxlKX1nZXQgYWN0aXZlKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZX1nZXQgdmlld1ZhbHVlKCl7cmV0dXJuKHRoaXMuX3RleHQ/Lm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnR8fCIiKS50cmltKCl9c2VsZWN0KGU9ITApe3RoaXMuX3NlbGVjdGVkfHwodGhpcy5fc2VsZWN0ZWQ9ITAsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksZSYmdGhpcy5fZW1pdFNlbGVjdGlvbkNoYW5nZUV2ZW50KCkpfWRlc2VsZWN0KGU9ITApe3RoaXMuX3NlbGVjdGVkJiYodGhpcy5fc2VsZWN0ZWQ9ITEsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksZSYmdGhpcy5fZW1pdFNlbGVjdGlvbkNoYW5nZUV2ZW50KCkpfWZvY3VzKGUsaSl7bGV0IGE9dGhpcy5fZ2V0SG9zdEVsZW1lbnQoKTt0eXBlb2YgYS5mb2N1cz09ImZ1bmN0aW9uIiYmYS5mb2N1cyhpKX1zZXRBY3RpdmVTdHlsZXMoKXt0aGlzLl9hY3RpdmV8fCh0aGlzLl9hY3RpdmU9ITAsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfXNldEluYWN0aXZlU3R5bGVzKCl7dGhpcy5fYWN0aXZlJiYodGhpcy5fYWN0aXZlPSExLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX1nZXRMYWJlbCgpe3JldHVybiB0aGlzLnZpZXdWYWx1ZX1faGFuZGxlS2V5ZG93bihlKXsoZS5rZXlDb2RlPT09MTN8fGUua2V5Q29kZT09PTMyKSYmIXMxKGUpJiYodGhpcy5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKSxlLnByZXZlbnREZWZhdWx0KCkpfV9zZWxlY3RWaWFJbnRlcmFjdGlvbigpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLl9zZWxlY3RlZD10aGlzLm11bHRpcGxlPyF0aGlzLl9zZWxlY3RlZDohMCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLl9lbWl0U2VsZWN0aW9uQ2hhbmdlRXZlbnQoITApKX1fZ2V0VGFiSW5kZXgoKXtyZXR1cm4gdGhpcy5kaXNhYmxlZD8iLTEiOiIwIn1fZ2V0SG9zdEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50fW5nQWZ0ZXJWaWV3Q2hlY2tlZCgpe2lmKHRoaXMuX3NlbGVjdGVkKXtsZXQgZT10aGlzLnZpZXdWYWx1ZTtlIT09dGhpcy5fbW9zdFJlY2VudFZpZXdWYWx1ZSYmKHRoaXMuX21vc3RSZWNlbnRWaWV3VmFsdWUmJnRoaXMuX3N0YXRlQ2hhbmdlcy5uZXh0KCksdGhpcy5fbW9zdFJlY2VudFZpZXdWYWx1ZT1lKX19bmdPbkRlc3Ryb3koKXt0aGlzLl9zdGF0ZUNoYW5nZXMuY29tcGxldGUoKX1fZW1pdFNlbGVjdGlvbkNoYW5nZUV2ZW50KGU9ITEpe3RoaXMub25TZWxlY3Rpb25DaGFuZ2UuZW1pdChuZXcgQTModGhpcyxlKSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LW9wdGlvbiJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJnRlKEtFLDcpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLl90ZXh0PXIuZmlyc3QpfX0saG9zdEF0dHJzOlsicm9sZSIsIm9wdGlvbiIsMSwibWF0LW1kYy1vcHRpb24iLCJtZGMtbGlzdC1pdGVtIl0saG9zdFZhcnM6MTEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGksYSl7aSYxJiZTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4gYS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKX0pKCJrZXlkb3duIixmdW5jdGlvbihvKXtyZXR1cm4gYS5faGFuZGxlS2V5ZG93bihvKX0pLGkmMiYmKEFpKCJpZCIsYS5pZCksRygiYXJpYS1zZWxlY3RlZCIsYS5zZWxlY3RlZCkoImFyaWEtZGlzYWJsZWQiLGEuZGlzYWJsZWQudG9TdHJpbmcoKSksaWUoIm1kYy1saXN0LWl0ZW0tLXNlbGVjdGVkIixhLnNlbGVjdGVkKSgibWF0LW1kYy1vcHRpb24tbXVsdGlwbGUiLGEubXVsdGlwbGUpKCJtYXQtbWRjLW9wdGlvbi1hY3RpdmUiLGEuYWN0aXZlKSgibWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQiLGEuZGlzYWJsZWQpKX0saW5wdXRzOnt2YWx1ZToidmFsdWUiLGlkOiJpZCIsZGlzYWJsZWQ6WzIsImRpc2FibGVkIiwiZGlzYWJsZWQiLFpdfSxvdXRwdXRzOntvblNlbGVjdGlvbkNoYW5nZToib25TZWxlY3Rpb25DaGFuZ2UifSxleHBvcnRBczpbIm1hdE9wdGlvbiJdLG5nQ29udGVudFNlbGVjdG9yczpKRSxkZWNsczo4LHZhcnM6NSxjb25zdHM6W1sidGV4dCIsIiJdLFsiYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJtYXQtbWRjLW9wdGlvbi1wc2V1ZG8tY2hlY2tib3giLDMsImRpc2FibGVkIiwic3RhdGUiXSxbMSwibWRjLWxpc3QtaXRlbV9fcHJpbWFyeS10ZXh0Il0sWyJzdGF0ZSIsImNoZWNrZWQiLCJhcmlhLWhpZGRlbiIsInRydWUiLCJhcHBlYXJhbmNlIiwibWluaW1hbCIsMSwibWF0LW1kYy1vcHRpb24tcHNldWRvLWNoZWNrYm94IiwzLCJkaXNhYmxlZCJdLFsxLCJjZGstdmlzdWFsbHktaGlkZGVuIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLCJtYXQtcmlwcGxlIiwiIiwxLCJtYXQtbWRjLW9wdGlvbi1yaXBwbGUiLCJtYXQtZm9jdXMtaW5kaWNhdG9yIiwzLCJtYXRSaXBwbGVUcmlnZ2VyIiwibWF0UmlwcGxlRGlzYWJsZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihSZShYRSksTSgwLGVBLDEsMiwibWF0LXBzZXVkby1jaGVja2JveCIsMSksbWUoMSksYygyLCJzcGFuIiwyLDApLG1lKDQsMSkscygpLE0oNSx0QSwxLDEsIm1hdC1wc2V1ZG8tY2hlY2tib3giLDMpLE0oNixpQSwyLDEsInNwYW4iLDQpLHUoNywiZGl2Iiw1KSksaSYyJiYodyhhLm11bHRpcGxlPzA6LTEpLGwoNSksdyghYS5tdWx0aXBsZSYmYS5zZWxlY3RlZCYmIWEuaGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvcj81Oi0xKSxsKCksdyhhLmdyb3VwJiZhLmdyb3VwLl9pbmVydD82Oi0xKSxsKCksZigibWF0UmlwcGxlVHJpZ2dlciIsYS5fZ2V0SG9zdEVsZW1lbnQoKSkoIm1hdFJpcHBsZURpc2FibGVkIixhLmRpc2FibGVkfHxhLmRpc2FibGVSaXBwbGUpKX0sZGVwZW5kZW5jaWVzOltFMyxMMV0sc3R5bGVzOltgLm1hdC1tZGMtb3B0aW9uey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkO2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjpyZWxhdGl2ZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQ7b3ZlcmZsb3c6aGlkZGVuO21pbi1oZWlnaHQ6NDhweDtwYWRkaW5nOjAgMTZweDtjdXJzb3I6cG9pbnRlcjstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKTtjb2xvcjp2YXIoLS1tYXQtb3B0aW9uLWxhYmVsLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO2ZvbnQtZmFtaWx5OnZhcigtLW1hdC1vcHRpb24tbGFiZWwtdGV4dC1mb250LCB2YXIoLS1tYXQtc3lzLWxhYmVsLWxhcmdlLWZvbnQpKTtsaW5lLWhlaWdodDp2YXIoLS1tYXQtb3B0aW9uLWxhYmVsLXRleHQtbGluZS1oZWlnaHQsIHZhcigtLW1hdC1zeXMtbGFiZWwtbGFyZ2UtbGluZS1oZWlnaHQpKTtmb250LXNpemU6dmFyKC0tbWF0LW9wdGlvbi1sYWJlbC10ZXh0LXNpemUsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZS1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LW9wdGlvbi1sYWJlbC10ZXh0LXRyYWNraW5nLCB2YXIoLS1tYXQtc3lzLWxhYmVsLWxhcmdlLXRyYWNraW5nKSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LW9wdGlvbi1sYWJlbC10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXdlaWdodCkpfS5tYXQtbWRjLW9wdGlvbjpob3Zlcjpub3QoLm1kYy1saXN0LWl0ZW0tLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1vcHRpb24taG92ZXItc3RhdGUtbGF5ZXItY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIGNhbGModmFyKC0tbWF0LXN5cy1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5KSAqIDEwMCUpLCB0cmFuc3BhcmVudCkpfS5tYXQtbWRjLW9wdGlvbjpmb2N1cy5tZGMtbGlzdC1pdGVtLC5tYXQtbWRjLW9wdGlvbi5tYXQtbWRjLW9wdGlvbi1hY3RpdmUubWRjLWxpc3QtaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1vcHRpb24tZm9jdXMtc3RhdGUtbGF5ZXItY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIGNhbGModmFyKC0tbWF0LXN5cy1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5KSAqIDEwMCUpLCB0cmFuc3BhcmVudCkpO291dGxpbmU6MH0ubWF0LW1kYy1vcHRpb24ubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6bm90KC5tZGMtbGlzdC1pdGVtLS1kaXNhYmxlZCk6bm90KC5tYXQtbWRjLW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtb3B0aW9uLXNlbGVjdGVkLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXNlY29uZGFyeS1jb250YWluZXIpKX0ubWF0LW1kYy1vcHRpb24ubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6bm90KC5tZGMtbGlzdC1pdGVtLS1kaXNhYmxlZCk6bm90KC5tYXQtbWRjLW9wdGlvbi1tdWx0aXBsZSkgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dHtjb2xvcjp2YXIoLS1tYXQtb3B0aW9uLXNlbGVjdGVkLXN0YXRlLWxhYmVsLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc2Vjb25kYXJ5LWNvbnRhaW5lcikpfS5tYXQtbWRjLW9wdGlvbiAubWF0LXBzZXVkby1jaGVja2JveHstLW1hdC1wc2V1ZG8tY2hlY2tib3gtbWluaW1hbC1zZWxlY3RlZC1jaGVja21hcmstY29sb3I6IHZhcigtLW1hdC1vcHRpb24tc2VsZWN0ZWQtc3RhdGUtbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zZWNvbmRhcnktY29udGFpbmVyKSl9Lm1hdC1tZGMtb3B0aW9uLm1kYy1saXN0LWl0ZW17YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwKX0ubWF0LW1kYy1vcHRpb24ubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHQ7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LW1kYy1vcHRpb24ubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQgLm1hdC1tZGMtb3B0aW9uLXBzZXVkby1jaGVja2JveCwubWF0LW1kYy1vcHRpb24ubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dCwubWF0LW1kYy1vcHRpb24ubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQ+bWF0LWljb257b3BhY2l0eTouMzh9Lm1hdC1tZGMtb3B0Z3JvdXAgLm1hdC1tZGMtb3B0aW9uOm5vdCgubWF0LW1kYy1vcHRpb24tbXVsdGlwbGUpe3BhZGRpbmctbGVmdDozMnB4fVtkaXI9cnRsXSAubWF0LW1kYy1vcHRncm91cCAubWF0LW1kYy1vcHRpb246bm90KC5tYXQtbWRjLW9wdGlvbi1tdWx0aXBsZSl7cGFkZGluZy1sZWZ0OjE2cHg7cGFkZGluZy1yaWdodDozMnB4fS5tYXQtbWRjLW9wdGlvbiAubWF0LWljb24sLm1hdC1tZGMtb3B0aW9uIC5tYXQtcHNldWRvLWNoZWNrYm94LWZ1bGx7bWFyZ2luLXJpZ2h0OjE2cHg7ZmxleC1zaHJpbms6MH1bZGlyPXJ0bF0gLm1hdC1tZGMtb3B0aW9uIC5tYXQtaWNvbixbZGlyPXJ0bF0gLm1hdC1tZGMtb3B0aW9uIC5tYXQtcHNldWRvLWNoZWNrYm94LWZ1bGx7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MTZweH0ubWF0LW1kYy1vcHRpb24gLm1hdC1wc2V1ZG8tY2hlY2tib3gtbWluaW1hbHttYXJnaW4tbGVmdDoxNnB4O2ZsZXgtc2hyaW5rOjB9W2Rpcj1ydGxdIC5tYXQtbWRjLW9wdGlvbiAubWF0LXBzZXVkby1jaGVja2JveC1taW5pbWFse21hcmdpbi1yaWdodDoxNnB4O21hcmdpbi1sZWZ0OjB9Lm1hdC1tZGMtb3B0aW9uIC5tYXQtbWRjLW9wdGlvbi1yaXBwbGV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LW1kYy1vcHRpb24gLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dHt3aGl0ZS1zcGFjZTpub3JtYWw7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdDtsZXR0ZXItc3BhY2luZzppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7Zm9udC1mYW1pbHk6aW5oZXJpdDt0ZXh0LWRlY29yYXRpb246aW5oZXJpdDt0ZXh0LXRyYW5zZm9ybTppbmhlcml0O21hcmdpbi1yaWdodDphdXRvfVtkaXI9cnRsXSAubWF0LW1kYy1vcHRpb24gLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dHttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDphdXRvfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtbWRjLW9wdGlvbi5tZGMtbGlzdC1pdGVtLS1zZWxlY3RlZDpub3QoOmhhcygubWF0LW1kYy1vcHRpb24tcHNldWRvLWNoZWNrYm94KSk6OmFmdGVye2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDoxNnB4O3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpO3dpZHRoOjEwcHg7aGVpZ2h0OjA7Ym9yZGVyLWJvdHRvbTpzb2xpZCAxMHB4O2JvcmRlci1yYWRpdXM6MTBweH1bZGlyPXJ0bF0gLm1hdC1tZGMtb3B0aW9uLm1kYy1saXN0LWl0ZW0tLXNlbGVjdGVkOm5vdCg6aGFzKC5tYXQtbWRjLW9wdGlvbi1wc2V1ZG8tY2hlY2tib3gpKTo6YWZ0ZXJ7cmlnaHQ6YXV0bztsZWZ0OjE2cHh9fS5tYXQtbWRjLW9wdGlvbi1tdWx0aXBsZXstLW1hdC1saXN0LWxpc3QtaXRlbS1zZWxlY3RlZC1jb250YWluZXItY29sb3I6IHZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1jb250YWluZXItY29sb3IsIHRyYW5zcGFyZW50KX0ubWF0LW1kYy1vcHRpb24tYWN0aXZlIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7Y29udGVudDoiIn0KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIHR9KSgpfSk7dmFyIEwzLGQ4PXgoKCk9PntrKCk7eTEoKTtMMz0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NW1vZD14ZSh7dHlwZTp0fSk7c3RhdGljIFx1MDI3NWluaj15ZSh7aW1wb3J0czpbemVdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIHRvLG04PXgoKCk9PntrKCk7V2EoKTtkOCgpO3kxKCk7djQoKTt0bz0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NW1vZD14ZSh7dHlwZTp0fSk7c3RhdGljIFx1MDI3NWluaj15ZSh7aW1wb3J0czpbdWksemUsTDMsSDJdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gbkEodCl7bGV0IG49aChzdCk7cmV0dXJuKCk9PkxpKG4pfXZhciBhQSxyQSxYZixKZj14KCgpPT57aygpO2soKTtEMigpO1BuKCk7bTgoKTt5MSgpO2FBPW5ldyBjZSgibWF0LWF1dG9jb21wbGV0ZS1zY3JvbGwtc3RyYXRlZ3kiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT57bGV0IHQ9aChzdCk7cmV0dXJuKCk9PkxpKHQpfX0pO3JBPXtwcm92aWRlOmFBLGRlcHM6W10sdXNlRmFjdG9yeTpuQX0sWGY9KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVtb2Q9eGUoe3R5cGU6dH0pO3N0YXRpYyBcdTAyNzVpbmo9eWUoe3Byb3ZpZGVyczpbckFdLGltcG9ydHM6W0JpLHRvLHplLFhpLHRvLHplXX0pfXJldHVybiB0fSkoKX0pO3ZhciBQMyxldT14KCgpPT57UDM9Y2xhc3N7dmFsdWU7b25DaGFuZ2U9KCk9Pnt9O29uVG91Y2hlZD0oKT0+e307dXBkYXRlQ2hhbmdlcygpe3RoaXMub25DaGFuZ2UodGhpcy52YWx1ZSl9d3JpdGVWYWx1ZShuKXt0aGlzLnZhbHVlPW4sdGhpcy51cGRhdGVDaGFuZ2VzKCl9cmVnaXN0ZXJPbkNoYW5nZShuKXt0aGlzLm9uQ2hhbmdlPW59cmVnaXN0ZXJPblRvdWNoZWQobil7dGhpcy5vblRvdWNoZWQ9bn19fSk7ZnVuY3Rpb24gb0EoKXtyZXR1cm4gaChXZCl9dmFyIGg4LGlvLGtpLGFuLHA4PXgoKCk9PntrKCk7WHQoKTtoOD1uZXcgY2UoIk1BVF9EQVRFX0xPQ0FMRSIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6b0F9KTtpbz0iTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIsa2k9Y2xhc3N7bG9jYWxlO19sb2NhbGVDaGFuZ2VzPW5ldyB3ZTtsb2NhbGVDaGFuZ2VzPXRoaXMuX2xvY2FsZUNoYW5nZXM7c2V0VGltZShuLGUsaSxhKXt0aHJvdyBuZXcgRXJyb3IoaW8pfWdldEhvdXJzKG4pe3Rocm93IG5ldyBFcnJvcihpbyl9Z2V0TWludXRlcyhuKXt0aHJvdyBuZXcgRXJyb3IoaW8pfWdldFNlY29uZHMobil7dGhyb3cgbmV3IEVycm9yKGlvKX1wYXJzZVRpbWUobixlKXt0aHJvdyBuZXcgRXJyb3IoaW8pfWFkZFNlY29uZHMobixlKXt0aHJvdyBuZXcgRXJyb3IoaW8pfWdldFZhbGlkRGF0ZU9yTnVsbChuKXtyZXR1cm4gdGhpcy5pc0RhdGVJbnN0YW5jZShuKSYmdGhpcy5pc1ZhbGlkKG4pP246bnVsbH1kZXNlcmlhbGl6ZShuKXtyZXR1cm4gbj09bnVsbHx8dGhpcy5pc0RhdGVJbnN0YW5jZShuKSYmdGhpcy5pc1ZhbGlkKG4pP246dGhpcy5pbnZhbGlkKCl9c2V0TG9jYWxlKG4pe3RoaXMubG9jYWxlPW4sdGhpcy5fbG9jYWxlQ2hhbmdlcy5uZXh0KCl9Y29tcGFyZURhdGUobixlKXtyZXR1cm4gdGhpcy5nZXRZZWFyKG4pLXRoaXMuZ2V0WWVhcihlKXx8dGhpcy5nZXRNb250aChuKS10aGlzLmdldE1vbnRoKGUpfHx0aGlzLmdldERhdGUobiktdGhpcy5nZXREYXRlKGUpfWNvbXBhcmVUaW1lKG4sZSl7cmV0dXJuIHRoaXMuZ2V0SG91cnMobiktdGhpcy5nZXRIb3VycyhlKXx8dGhpcy5nZXRNaW51dGVzKG4pLXRoaXMuZ2V0TWludXRlcyhlKXx8dGhpcy5nZXRTZWNvbmRzKG4pLXRoaXMuZ2V0U2Vjb25kcyhlKX1zYW1lRGF0ZShuLGUpe2lmKG4mJmUpe2xldCBpPXRoaXMuaXNWYWxpZChuKSxhPXRoaXMuaXNWYWxpZChlKTtyZXR1cm4gaSYmYT8hdGhpcy5jb21wYXJlRGF0ZShuLGUpOmk9PWF9cmV0dXJuIG49PWV9c2FtZVRpbWUobixlKXtpZihuJiZlKXtsZXQgaT10aGlzLmlzVmFsaWQobiksYT10aGlzLmlzVmFsaWQoZSk7cmV0dXJuIGkmJmE/IXRoaXMuY29tcGFyZVRpbWUobixlKTppPT1hfXJldHVybiBuPT1lfWNsYW1wRGF0ZShuLGUsaSl7cmV0dXJuIGUmJnRoaXMuY29tcGFyZURhdGUobixlKTwwP2U6aSYmdGhpcy5jb21wYXJlRGF0ZShuLGkpPjA/aTpufX0sYW49bmV3IGNlKCJtYXQtZGF0ZS1mb3JtYXRzIil9KTt2YXIgZjgsdHU9eCgoKT0+e2soKTt5MSgpO2Y4PSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1bW9kPXhlKHt0eXBlOnR9KTtzdGF0aWMgXHUwMjc1aW5qPXllKHtpbXBvcnRzOlt6ZSx6ZV19KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiB1OCh0LG4pe2xldCBlPUFycmF5KHQpO2ZvcihsZXQgaT0wO2k8dDtpKyspZVtpXT1uKGkpO3JldHVybiBlfWZ1bmN0aW9uIGc4KHQsbixlKXtyZXR1cm4haXNOYU4odCkmJnQ+PW4mJnQ8PWV9ZnVuY3Rpb24gbUEodD1kQSl7cmV0dXJuW3twcm92aWRlOmtpLHVzZUNsYXNzOmxBfSx7cHJvdmlkZTphbix1c2VWYWx1ZTp0fV19dmFyIGNBLHNBLGxBLGRBLGl1LF80PXgoKCk9PntrKCk7aygpO3A4KCk7djQoKTtLMigpO1dhKCk7Y0E9L15cZHs0fS1cZHsyfS1cZHsyfSg/OlRcZHsyfTpcZHsyfTpcZHsyfSg/OlwuXGQrKT8oPzpafCg/Oig/OlwrfC0pXGR7Mn06XGR7Mn0pKT8pPyQvLHNBPS9eKFxkP1xkKVs6Ll0oXGQ/XGQpKD86WzouXShcZD9cZCkpP1xzKihBTXxQTSk/JC9pO2xBPSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBraXt1c2VVdGNGb3JEaXNwbGF5PSExO19tYXREYXRlTG9jYWxlPWgoaDgse29wdGlvbmFsOiEwfSk7Y29uc3RydWN0b3IoKXtzdXBlcigpO2xldCBlPWgoaDgse29wdGlvbmFsOiEwfSk7ZSE9PXZvaWQgMCYmKHRoaXMuX21hdERhdGVMb2NhbGU9ZSksc3VwZXIuc2V0TG9jYWxlKHRoaXMuX21hdERhdGVMb2NhbGUpfWdldFllYXIoZSl7cmV0dXJuIGUuZ2V0RnVsbFllYXIoKX1nZXRNb250aChlKXtyZXR1cm4gZS5nZXRNb250aCgpfWdldERhdGUoZSl7cmV0dXJuIGUuZ2V0RGF0ZSgpfWdldERheU9mV2VlayhlKXtyZXR1cm4gZS5nZXREYXkoKX1nZXRNb250aE5hbWVzKGUpe2xldCBpPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLHttb250aDplLHRpbWVab25lOiJ1dGMifSk7cmV0dXJuIHU4KDEyLGE9PnRoaXMuX2Zvcm1hdChpLG5ldyBEYXRlKDIwMTcsYSwxKSkpfWdldERhdGVOYW1lcygpe2xldCBlPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLHtkYXk6Im51bWVyaWMiLHRpbWVab25lOiJ1dGMifSk7cmV0dXJuIHU4KDMxLGk9PnRoaXMuX2Zvcm1hdChlLG5ldyBEYXRlKDIwMTcsMCxpKzEpKSl9Z2V0RGF5T2ZXZWVrTmFtZXMoZSl7bGV0IGk9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUse3dlZWtkYXk6ZSx0aW1lWm9uZToidXRjIn0pO3JldHVybiB1OCg3LGE9PnRoaXMuX2Zvcm1hdChpLG5ldyBEYXRlKDIwMTcsMCxhKzEpKSl9Z2V0WWVhck5hbWUoZSl7bGV0IGk9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUse3llYXI6Im51bWVyaWMiLHRpbWVab25lOiJ1dGMifSk7cmV0dXJuIHRoaXMuX2Zvcm1hdChpLGUpfWdldEZpcnN0RGF5T2ZXZWVrKCl7aWYodHlwZW9mIEludGw8InUiJiZJbnRsLkxvY2FsZSl7bGV0IGU9bmV3IEludGwuTG9jYWxlKHRoaXMubG9jYWxlKSxpPShlLmdldFdlZWtJbmZvPy4oKXx8ZS53ZWVrSW5mbyk/LmZpcnN0RGF5Pz8wO3JldHVybiBpPT09Nz8wOml9cmV0dXJuIDB9Z2V0TnVtRGF5c0luTW9udGgoZSl7cmV0dXJuIHRoaXMuZ2V0RGF0ZSh0aGlzLl9jcmVhdGVEYXRlV2l0aE92ZXJmbG93KHRoaXMuZ2V0WWVhcihlKSx0aGlzLmdldE1vbnRoKGUpKzEsMCkpfWNsb25lKGUpe3JldHVybiBuZXcgRGF0ZShlLmdldFRpbWUoKSl9Y3JlYXRlRGF0ZShlLGksYSl7bGV0IHI9dGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyhlLGksYSk7cmV0dXJuIHIuZ2V0TW9udGgoKSE9aSxyfXRvZGF5KCl7cmV0dXJuIG5ldyBEYXRlfXBhcnNlKGUsaSl7cmV0dXJuIHR5cGVvZiBlPT0ibnVtYmVyIj9uZXcgRGF0ZShlKTplP25ldyBEYXRlKERhdGUucGFyc2UoZSkpOm51bGx9Zm9ybWF0KGUsaSl7aWYoIXRoaXMuaXNWYWxpZChlKSl0aHJvdyBFcnJvcigiTmF0aXZlRGF0ZUFkYXB0ZXI6IENhbm5vdCBmb3JtYXQgaW52YWxpZCBkYXRlLiIpO2xldCBhPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLFUxKFhlKHt9LGkpLHt0aW1lWm9uZToidXRjIn0pKTtyZXR1cm4gdGhpcy5fZm9ybWF0KGEsZSl9YWRkQ2FsZW5kYXJZZWFycyhlLGkpe3JldHVybiB0aGlzLmFkZENhbGVuZGFyTW9udGhzKGUsaSoxMil9YWRkQ2FsZW5kYXJNb250aHMoZSxpKXtsZXQgYT10aGlzLl9jcmVhdGVEYXRlV2l0aE92ZXJmbG93KHRoaXMuZ2V0WWVhcihlKSx0aGlzLmdldE1vbnRoKGUpK2ksdGhpcy5nZXREYXRlKGUpKTtyZXR1cm4gdGhpcy5nZXRNb250aChhKSE9KCh0aGlzLmdldE1vbnRoKGUpK2kpJTEyKzEyKSUxMiYmKGE9dGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIoYSksdGhpcy5nZXRNb250aChhKSwwKSksYX1hZGRDYWxlbmRhckRheXMoZSxpKXtyZXR1cm4gdGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIoZSksdGhpcy5nZXRNb250aChlKSx0aGlzLmdldERhdGUoZSkraSl9dG9Jc284NjAxKGUpe3JldHVybltlLmdldFVUQ0Z1bGxZZWFyKCksdGhpcy5fMmRpZ2l0KGUuZ2V0VVRDTW9udGgoKSsxKSx0aGlzLl8yZGlnaXQoZS5nZXRVVENEYXRlKCkpXS5qb2luKCItIil9ZGVzZXJpYWxpemUoZSl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXtpZighZSlyZXR1cm4gbnVsbDtpZihjQS50ZXN0KGUpKXtsZXQgaT1uZXcgRGF0ZShlKTtpZih0aGlzLmlzVmFsaWQoaSkpcmV0dXJuIGl9fXJldHVybiBzdXBlci5kZXNlcmlhbGl6ZShlKX1pc0RhdGVJbnN0YW5jZShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIERhdGV9aXNWYWxpZChlKXtyZXR1cm4haXNOYU4oZS5nZXRUaW1lKCkpfWludmFsaWQoKXtyZXR1cm4gbmV3IERhdGUoTmFOKX1zZXRUaW1lKGUsaSxhLHIpe2xldCBvPXRoaXMuY2xvbmUoZSk7cmV0dXJuIG8uc2V0SG91cnMoaSxhLHIsMCksb31nZXRIb3VycyhlKXtyZXR1cm4gZS5nZXRIb3VycygpfWdldE1pbnV0ZXMoZSl7cmV0dXJuIGUuZ2V0TWludXRlcygpfWdldFNlY29uZHMoZSl7cmV0dXJuIGUuZ2V0U2Vjb25kcygpfXBhcnNlVGltZShlLGkpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm4gZSBpbnN0YW5jZW9mIERhdGU/bmV3IERhdGUoZS5nZXRUaW1lKCkpOm51bGw7bGV0IGE9ZS50cmltKCk7aWYoYS5sZW5ndGg9PT0wKXJldHVybiBudWxsO2xldCByPXRoaXMuX3BhcnNlVGltZVN0cmluZyhhKTtpZihyPT09bnVsbCl7bGV0IG89YS5yZXBsYWNlKC9bXjAtOTooQU18UE0pXS9naSwiIikudHJpbSgpO28ubGVuZ3RoPjAmJihyPXRoaXMuX3BhcnNlVGltZVN0cmluZyhvKSl9cmV0dXJuIHJ8fHRoaXMuaW52YWxpZCgpfWFkZFNlY29uZHMoZSxpKXtyZXR1cm4gbmV3IERhdGUoZS5nZXRUaW1lKCkraSoxZTMpfV9jcmVhdGVEYXRlV2l0aE92ZXJmbG93KGUsaSxhKXtsZXQgcj1uZXcgRGF0ZTtyZXR1cm4gci5zZXRGdWxsWWVhcihlLGksYSksci5zZXRIb3VycygwLDAsMCwwKSxyfV8yZGlnaXQoZSl7cmV0dXJuKCIwMCIrZSkuc2xpY2UoLTIpfV9mb3JtYXQoZSxpKXtsZXQgYT1uZXcgRGF0ZTtyZXR1cm4gYS5zZXRVVENGdWxsWWVhcihpLmdldEZ1bGxZZWFyKCksaS5nZXRNb250aCgpLGkuZ2V0RGF0ZSgpKSxhLnNldFVUQ0hvdXJzKGkuZ2V0SG91cnMoKSxpLmdldE1pbnV0ZXMoKSxpLmdldFNlY29uZHMoKSxpLmdldE1pbGxpc2Vjb25kcygpKSxlLmZvcm1hdChhKX1fcGFyc2VUaW1lU3RyaW5nKGUpe2xldCBpPWUudG9VcHBlckNhc2UoKS5tYXRjaChzQSk7aWYoaSl7bGV0IGE9cGFyc2VJbnQoaVsxXSkscj1wYXJzZUludChpWzJdKSxvPWlbM109PW51bGw/dm9pZCAwOnBhcnNlSW50KGlbM10pLGQ9aVs0XTtpZihhPT09MTI/YT1kPT09IkFNIj8wOmE6ZD09PSJQTSImJihhKz0xMiksZzgoYSwwLDIzKSYmZzgociwwLDU5KSYmKG89PW51bGx8fGc4KG8sMCw1OSkpKXJldHVybiB0aGlzLnNldFRpbWUodGhpcy50b2RheSgpLGEscixvfHwwKX1yZXR1cm4gbnVsbH1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhY30pfXJldHVybiB0fSkoKTtkQT17cGFyc2U6e2RhdGVJbnB1dDpudWxsLHRpbWVJbnB1dDpudWxsfSxkaXNwbGF5OntkYXRlSW5wdXQ6e3llYXI6Im51bWVyaWMiLG1vbnRoOiJudW1lcmljIixkYXk6Im51bWVyaWMifSx0aW1lSW5wdXQ6e2hvdXI6Im51bWVyaWMiLG1pbnV0ZToibnVtZXJpYyJ9LG1vbnRoWWVhckxhYmVsOnt5ZWFyOiJudW1lcmljIixtb250aDoic2hvcnQifSxkYXRlQTExeUxhYmVsOnt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIn0sbW9udGhZZWFyQTExeUxhYmVsOnt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyJ9LHRpbWVPcHRpb25MYWJlbDp7aG91cjoibnVtZXJpYyIsbWludXRlOiJudW1lcmljIn19fSxpdT0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NW1vZD14ZSh7dHlwZTp0fSk7c3RhdGljIFx1MDI3NWluaj15ZSh7cHJvdmlkZXJzOlttQSgpXX0pfXJldHVybiB0fSkoKX0pO3ZhciBoQSxhdSxudT14KCgpPT57bzgoKTtrKCk7V2UoKTtldSgpO180KCk7dmUoKTtldCgpO0plKCk7aygpO0plKCk7ZXQoKTtXZSgpO3ZlKCk7aEE9WyJpbnB1dCJdLGF1PSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBQM3tpbnB1dEVsZW1lbnQ7Zm9ybUNvbnRyb2w7bWF0QXV0b2NvbXBsZXRlO3BsYWNlaG9sZGVyPSIiO2Fsd2F5c09wZW49ITE7b25CbHVyPW5ldyBOO29uQ2xvc2U9bmV3IE47b25FbnRlcj1uZXcgTjtvbkZvY3VzPW5ldyBOO29uT3Blbj1uZXcgTjtzZWFyY2hWaXNpYmxlPSExO2dldCBpc0Rpc2FibGVkKCl7cmV0dXJuIHRoaXMuc2VhcmNoVmlzaWJsZT9udWxsOiJkaXNhYmxlZCJ9bmdPbkluaXQoKXt0aGlzLmFsd2F5c09wZW4mJih0aGlzLnNlYXJjaFZpc2libGU9ITApfWNsb3NlKCl7dGhpcy5hbHdheXNPcGVufHwodGhpcy5zZWFyY2hWaXNpYmxlPSExKSx0aGlzLnZhbHVlPSIiLHRoaXMudXBkYXRlQ2hhbmdlcygpLHRoaXMub25DbG9zZS5lbWl0KCl9b3Blbigpe3RoaXMuc2VhcmNoVmlzaWJsZT0hMCx0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCksdGhpcy5vbk9wZW4uZW1pdCgpfW9uQmx1cnJpbmcoZSl7IWUmJiF0aGlzLmFsd2F5c09wZW4mJih0aGlzLnNlYXJjaFZpc2libGU9ITEpLHRoaXMub25CbHVyLmVtaXQoZSl9b25FbnRlcnJpbmcoZSl7dGhpcy5vbkVudGVyLmVtaXQoZSl9b25Gb2N1c3NpbmcoZSl7dGhpcy5vbkZvY3VzLmVtaXQoZSl9c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgZTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuKGV8fChlPWt0KHQpKSkoYXx8dCl9fSkoKTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLW1hdC1zZWFyY2gtYmFyIl1dLHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmdGUoaEEsNSksaSYyKXtsZXQgcjtGKHI9QigpKSYmKGEuaW5wdXRFbGVtZW50PXIuZmlyc3QpfX0saW5wdXRzOntmb3JtQ29udHJvbDoiZm9ybUNvbnRyb2wiLG1hdEF1dG9jb21wbGV0ZToibWF0QXV0b2NvbXBsZXRlIixwbGFjZWhvbGRlcjoicGxhY2Vob2xkZXIiLGFsd2F5c09wZW46ImFsd2F5c09wZW4ifSxvdXRwdXRzOntvbkJsdXI6Im9uQmx1ciIsb25DbG9zZToib25DbG9zZSIsb25FbnRlcjoib25FbnRlciIsb25Gb2N1czoib25Gb2N1cyIsb25PcGVuOiJvbk9wZW4ifSxmZWF0dXJlczpbSWUoW3twcm92aWRlOmYyLHVzZUV4aXN0aW5nOmhpKCgpPT50KSxtdWx0aTohMH1dKSxGZV0sZGVjbHM6OCx2YXJzOjYsY29uc3RzOltbImlucHV0IiwiIl0sWzEsIm1hdC1zZWFyY2hfZmllbGQiXSxbIm1hdElucHV0IiwiIiwidHlwZSIsInRleHQiLCJhdXRvY2FwaXRhbGl6ZSIsIm5vbmUiLDMsIm5nTW9kZWxDaGFuZ2UiLCJibHVyIiwia2V5dXAuZW50ZXIiLCJmb2N1cyIsIm5nTW9kZWwiLCJwbGFjZWhvbGRlciIsImRpc2FibGVkIl0sWzEsIm1hdC1zZWFyY2hfaWNvbnMiXSxbIm1hdFJpcHBsZSIsIiIsMSwibWF0LXNlYXJjaF9pY29uLWNsb3NlIiwzLCJjbGljayJdLFsibWF0UmlwcGxlIiwiIiwxLCJtYXQtc2VhcmNoX2ljb24tc2VhcmNoIiwzLCJjbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO2MoMCwibWF0LWZvcm0tZmllbGQiLDEpKDEsImlucHV0IiwyLDApLEZpKCJuZ01vZGVsQ2hhbmdlIixmdW5jdGlvbihkKXtyZXR1cm4geihyKSxSaShhLnZhbHVlLGQpfHwoYS52YWx1ZT1kKSxUKGQpfSksUygibmdNb2RlbENoYW5nZSIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEudXBkYXRlQ2hhbmdlcygpKX0pKCJibHVyIixmdW5jdGlvbigpe3oocik7bGV0IGQ9c2UoMik7cmV0dXJuIFQoYS5vbkJsdXJyaW5nKGQudmFsdWUpKX0pKCJrZXl1cC5lbnRlciIsZnVuY3Rpb24oKXt6KHIpO2xldCBkPXNlKDIpO3JldHVybiBUKGEub25FbnRlcnJpbmcoZC52YWx1ZSkpfSkoImZvY3VzIixmdW5jdGlvbigpe3oocik7bGV0IGQ9c2UoMik7cmV0dXJuIFQoYS5vbkZvY3Vzc2luZyhkLnZhbHVlKSl9KSxzKCkoKSxjKDMsInNwYW4iLDMpKDQsIm1hdC1pY29uIiw0KSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuY2xvc2UoKSl9KSxtKDUsIiBjbG9zZSAiKSxzKCksYyg2LCJtYXQtaWNvbiIsNSksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLm9wZW4oKSl9KSxtKDcsIiBzZWFyY2ggIikscygpKCl9aSYyJiYoZigiQHNsaWRlSW5PdXQiLGEuc2VhcmNoVmlzaWJsZSksbCgpLE5pKCJuZ01vZGVsIixhLnZhbHVlKSxmKCJwbGFjZWhvbGRlciIsYS5wbGFjZWhvbGRlcikoImRpc2FibGVkIixhLmlzRGlzYWJsZWQpLGwoMiksaWUoIm1hdC1zZWFyY2hfaWNvbnMtLWFjdGl2ZSIsYS5zZWFyY2hWaXNpYmxlKSl9LGRlcGVuZGVuY2llczpbUWUsWmUsJGUsbnQsYXQsZ3QsbXQsZWEsZ2UsQ2UsTDFdLHN0eWxlczpbYFtfbmdob3N0LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2RpcmVjdGlvbjpydGw7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztoZWlnaHQ6MjRweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MjRweH0ubWF0LXNlYXJjaF9maWVsZFtfbmdjb250ZW50LSVDT01QJV17ZGlyZWN0aW9uOmx0cjtwYWRkaW5nOjAgMS41cmVtIDAgMDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3dpZHRoOjE1MHB4O3otaW5kZXg6MX0ubWF0LXNlYXJjaF9maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAgIC5tYXQtbWRjLXRleHQtZmllbGQtd3JhcHBlcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudDtoZWlnaHQ6MjRweDtwYWRkaW5nOjB9Lm1hdC1zZWFyY2hfZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgICAubWF0LW1kYy1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7aGVpZ2h0OjI0cHh9Lm1hdC1zZWFyY2hfZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgICAubWF0LW1kYy1mb3JtLWZpZWxkLWluZml4e2FsaWduLWl0ZW1zOmZsZXgtZW5kO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7ZGlzcGxheTpmbGV4O2hlaWdodDoyNHB4O21pbi1oZWlnaHQ6dW5zZXQ7cGFkZGluZzowfS5tYXQtc2VhcmNoX2ZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgLm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntkaXNwbGF5Om5vbmV9Lm1hdC1zZWFyY2hfZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgICAubWRjLXRleHQtZmllbGQtLWZpbGxlZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9Lm1hdC1zZWFyY2hfZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgICAubWRjLXRleHQtZmllbGQtLWZpbGxlZCAubWRjLWxpbmUtcmlwcGxlOmJlZm9yZSwgLm1hdC1zZWFyY2hfZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgICAubWRjLXRleHQtZmllbGQtLWZpbGxlZCAubWRjLWxpbmUtcmlwcGxlOmFmdGVye2JvcmRlci1ib3R0b20tY29sb3I6I2ZmZn0ubWF0LXNlYXJjaF9maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAgIGlucHV0Lm1hdC1tZGMtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZmZmO2NvbG9yOiNmZmY7Zm9udC1zaXplOjE0cHg7aGVpZ2h0OjI0cHg7cGFkZGluZzowfS5tYXQtc2VhcmNoX2ZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsIC5tYXQtc2VhcmNoX2ZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgLm1kYy1ub3RjaGVkLW91dGxpbmVfX25vdGNoLCAubWF0LXNlYXJjaF9maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAgIC5tZGMtbm90Y2hlZC1vdXRsaW5lX190cmFpbGluZ3tiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudDtib3JkZXI6MCFpbXBvcnRhbnR9Lm1hdC1zZWFyY2hfZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgICAubWF0LW1kYy1mb3JtLWZpZWxkLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9Lm1hdC1zZWFyY2hfZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgICAubWRjLXRleHQtZmllbGR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7Ym9yZGVyOjAhaW1wb3J0YW50O2hlaWdodDoyNHB4O21pbi1oZWlnaHQ6dW5zZXQ7b3V0bGluZTpub25lIWltcG9ydGFudDtwYWRkaW5nOjAhaW1wb3J0YW50fS5tYXQtc2VhcmNoX2ZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgLm1kYy10ZXh0LWZpZWxkLS1uby1sYWJlbDpub3QoLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCk6bm90KC5tZGMtdGV4dC1maWVsZC0tdGV4dGFyZWEpIC5tYXQtbWRjLWZvcm0tZmllbGQtaW5maXh7cGFkZGluZy1ib3R0b206MDtwYWRkaW5nLXRvcDowfS5tYXQtc2VhcmNoX2ljb25zW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO21hcmdpbjowO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowfS5tYXQtc2VhcmNoX2ljb25zW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntjdXJzb3I6cG9pbnRlcn0ubWF0LXNlYXJjaF9pY29uc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlYXJjaF9pY29uLWNsb3NlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zZWFyY2hfaWNvbnNbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWFyY2hfaWNvbi1zZWFyY2hbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yYWRpdXM6NTAlO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjA7dHJhbnNpdGlvbjphbGwgLjJzIGN1YmljLWJlemllciguNCwwLC4yLDEpO3otaW5kZXg6Mn0ubWF0LXNlYXJjaF9pY29uc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlYXJjaF9pY29uLWNsb3NlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zZWFyY2hfaWNvbnMubWF0LXNlYXJjaF9pY29ucy0tYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VhcmNoX2ljb24tc2VhcmNoW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjA7dHJhbnNmb3JtOnJvdGF0ZSgyMjVkZWcpfS5tYXQtc2VhcmNoX2ljb25zLm1hdC1zZWFyY2hfaWNvbnMtLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlYXJjaF9pY29uLWNsb3NlW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjE7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3Zpc2liaWxpdHk6dmlzaWJsZTt6LWluZGV4OjN9CgoKCgpgXSxkYXRhOnthbmltYXRpb246W2c0KCJzbGlkZUluT3V0IixbejMoInRydWUiLHNhKHt3aWR0aDoiKiJ9KSksejMoImZhbHNlIixzYSh7d2lkdGg6IjAifSkpLEpyKCJ0cnVlID0+IGZhbHNlIixYcigiMzAwbXMgZWFzZS1pbiIpKSxKcigiZmFsc2UgPT4gdHJ1ZSIsWHIoIjMwMG1zIGVhc2Utb3V0IikpXSldfX0pfXJldHVybiB0fSkoKX0pO3ZhciBwQSxmQSxiNCxWMyxydSxPMz14KCgpPT57aygpO2soKTt2YSgpO3kxKCk7cEE9WyIqIixbWyJtYXQtdG9vbGJhci1yb3ciXV1dLGZBPVsiKiIsIm1hdC10b29sYmFyLXJvdyJdLGI0PSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LXRvb2xiYXItcm93Il1dLGhvc3RBdHRyczpbMSwibWF0LXRvb2xiYXItcm93Il0sZXhwb3J0QXM6WyJtYXRUb29sYmFyUm93Il19KX1yZXR1cm4gdH0pKCksVjM9KCgpPT57Y2xhc3MgdHtfZWxlbWVudFJlZj1oKGFlKTtfcGxhdGZvcm09aChiMSk7X2RvY3VtZW50PWgoanQpO2NvbG9yO190b29sYmFyUm93cztjb25zdHJ1Y3Rvcigpe31uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJih0aGlzLl9jaGVja1Rvb2xiYXJNaXhlZE1vZGVzKCksdGhpcy5fdG9vbGJhclJvd3MuY2hhbmdlcy5zdWJzY3JpYmUoKCk9PnRoaXMuX2NoZWNrVG9vbGJhck1peGVkTW9kZXMoKSkpfV9jaGVja1Rvb2xiYXJNaXhlZE1vZGVzKCl7dGhpcy5fdG9vbGJhclJvd3MubGVuZ3RofXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC10b29sYmFyIl1dLGNvbnRlbnRRdWVyaWVzOmZ1bmN0aW9uKGksYSxyKXtpZihpJjEmJkJlKHIsYjQsNSksaSYyKXtsZXQgbztGKG89QigpKSYmKGEuX3Rvb2xiYXJSb3dzPW8pfX0saG9zdEF0dHJzOlsxLCJtYXQtdG9vbGJhciJdLGhvc3RWYXJzOjYsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGksYSl7aSYyJiYoRHQoYS5jb2xvcj8ibWF0LSIrYS5jb2xvcjoiIiksaWUoIm1hdC10b29sYmFyLW11bHRpcGxlLXJvd3MiLGEuX3Rvb2xiYXJSb3dzLmxlbmd0aD4wKSgibWF0LXRvb2xiYXItc2luZ2xlLXJvdyIsYS5fdG9vbGJhclJvd3MubGVuZ3RoPT09MCkpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciJ9LGV4cG9ydEFzOlsibWF0VG9vbGJhciJdLG5nQ29udGVudFNlbGVjdG9yczpmQSxkZWNsczoyLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKFJlKHBBKSxtZSgwKSxtZSgxLDEpKX0sc3R5bGVzOltgLm1hdC10b29sYmFye2JhY2tncm91bmQ6dmFyKC0tbWF0LXRvb2xiYXItY29udGFpbmVyLWJhY2tncm91bmQtY29sb3IsIHZhcigtLW1hdC1zeXMtc3VyZmFjZSkpO2NvbG9yOnZhcigtLW1hdC10b29sYmFyLWNvbnRhaW5lci10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWF0LXRvb2xiYXIsLm1hdC10b29sYmFyIGgxLC5tYXQtdG9vbGJhciBoMiwubWF0LXRvb2xiYXIgaDMsLm1hdC10b29sYmFyIGg0LC5tYXQtdG9vbGJhciBoNSwubWF0LXRvb2xiYXIgaDZ7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LXRvb2xiYXItdGl0bGUtdGV4dC1mb250LCB2YXIoLS1tYXQtc3lzLXRpdGxlLWxhcmdlLWZvbnQpKTtmb250LXNpemU6dmFyKC0tbWF0LXRvb2xiYXItdGl0bGUtdGV4dC1zaXplLCB2YXIoLS1tYXQtc3lzLXRpdGxlLWxhcmdlLXNpemUpKTtsaW5lLWhlaWdodDp2YXIoLS1tYXQtdG9vbGJhci10aXRsZS10ZXh0LWxpbmUtaGVpZ2h0LCB2YXIoLS1tYXQtc3lzLXRpdGxlLWxhcmdlLWxpbmUtaGVpZ2h0KSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LXRvb2xiYXItdGl0bGUtdGV4dC13ZWlnaHQsIHZhcigtLW1hdC1zeXMtdGl0bGUtbGFyZ2Utd2VpZ2h0KSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LXRvb2xiYXItdGl0bGUtdGV4dC10cmFja2luZywgdmFyKC0tbWF0LXN5cy10aXRsZS1sYXJnZS10cmFja2luZykpO21hcmdpbjowfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtdG9vbGJhcntvdXRsaW5lOnNvbGlkIDFweH19Lm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUsLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsLm1hdC10b29sYmFyIC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC10b29sYmFyIC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC10b29sYmFyIC5tYXQtc2VsZWN0LXZhbHVlLC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC1hcnJvdywubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyIC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyIC5tYXQtbWRjLWJ1dHRvbi1iYXNlLm1hdC1tZGMtYnV0dG9uLWJhc2UubWF0LXVudGhlbWVkey0tbWF0LWJ1dHRvbi10ZXh0LWxhYmVsLXRleHQtY29sb3I6IHZhcigtLW1hdC10b29sYmFyLWNvbnRhaW5lci10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKTstLW1hdC1idXR0b24tb3V0bGluZWQtbGFiZWwtdGV4dC1jb2xvcjogdmFyKC0tbWF0LXRvb2xiYXItY29udGFpbmVyLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7ZGlzcGxheTpmbGV4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjAgMTZweDt3aWR0aDoxMDAlO2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO2hlaWdodDp2YXIoLS1tYXQtdG9vbGJhci1zdGFuZGFyZC1oZWlnaHQsIDY0cHgpfUBtZWRpYShtYXgtd2lkdGg6IDU5OXB4KXsubWF0LXRvb2xiYXItcm93LC5tYXQtdG9vbGJhci1zaW5nbGUtcm93e2hlaWdodDp2YXIoLS1tYXQtdG9vbGJhci1tb2JpbGUtaGVpZ2h0LCA1NnB4KX19Lm1hdC10b29sYmFyLW11bHRpcGxlLXJvd3N7ZGlzcGxheTpmbGV4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47d2lkdGg6MTAwJTttaW4taGVpZ2h0OnZhcigtLW1hdC10b29sYmFyLXN0YW5kYXJkLWhlaWdodCwgNjRweCl9QG1lZGlhKG1heC13aWR0aDogNTk5cHgpey5tYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dze21pbi1oZWlnaHQ6dmFyKC0tbWF0LXRvb2xiYXItbW9iaWxlLWhlaWdodCwgNTZweCl9fQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCkscnU9KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVtb2Q9eGUoe3R5cGU6dH0pO3N0YXRpYyBcdTAyNzVpbmo9eWUoe2ltcG9ydHM6W3plLHplXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIHlBKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJidXR0b24iLDQzKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLmdvVG9Qcm9maWxlUGFnZSgpKX0pLGMoMSwibWF0LWljb24iKSxtKDIsIiBhY2NvdW50X2NpcmNsZSAiKSxzKCksYygzLCJzcGFuIiksbSg0KSxzKCkoKX1pZih0JjIpe2xldCBlPXYoKTtsKDQpLEUoIiAiLGUudXNlckVtYWlsLCIgIil9fWZ1bmN0aW9uIHhBKHQsbil7dCYxJiYoYygwLCJidXR0b24iLDE3KSgxLCJtYXQtaWNvbiIpLG0oMiwiIGV4aXRfdG9fYXBwICIpLHMoKSxjKDMsInNwYW4iKSxtKDQpLGIoNSwidHJhbnNsYXRlIikscygpKCkpLHQmMiYmKGwoNCksRSgiICIsQyg1LDEsIlRJVExFX0xPR0lOIiksIiAiKSl9ZnVuY3Rpb24gTUEodCxuKXt0JjEmJihjKDAsImJ1dHRvbiIsMTgpKDEsIm1hdC1pY29uIiksbSgyLCIgYWNjb3VudF9iYWxhbmNlICIpLHMoKSxjKDMsInNwYW4iKSxtKDQpLGIoNSwidHJhbnNsYXRlIikscygpKCkpLHQmMiYmKGwoNCksRSgiICIsQyg1LDEsIkFDQ09VTlRJTkciKSwiICIpKX1mdW5jdGlvbiB3QSh0LG4pe2lmKHQmMSYmKGMoMCwiYnV0dG9uIiwxOSkoMSwibWF0LWljb24iKSxtKDIsIiBjaGVja19jaXJjbGVfb3V0bGluZSAiKSxzKCksYygzLCJzcGFuIiksbSg0KSxiKDUsInRyYW5zbGF0ZSIpLHMoKSgpKSx0JjIpe3YoKTtsZXQgZT1zZSg4Myk7ZigibWF0TWVudVRyaWdnZXJGb3IiLGUpLGwoNCksRSgiICIsQyg1LDIsIk9SREVSU19BTkRfUEFZTUVOVCIpLCIgIil9fWZ1bmN0aW9uIFNBKHQsbil7aWYodCYxJiYoYygwLCJidXR0b24iLDIwKSgxLCJtYXQtaWNvbiIpLG0oMiwiIHNlY3VyaXR5ICIpLHMoKSxjKDMsInNwYW4iKSxtKDQpLGIoNSwidHJhbnNsYXRlIikscygpKCkpLHQmMil7digpO2xldCBlPXNlKDUwKTtmKCJtYXRNZW51VHJpZ2dlckZvciIsZSksbCg0KSxFKCIgIixDKDUsMiwiUFJJVkFDWV9BTkRfU0VDVVJJVFkiKSwiICIpfX1mdW5jdGlvbiBrQSh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYnV0dG9uIiw0NCksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5sb2dvdXQoKSl9KSxjKDEsIm1hdC1pY29uIiksbSgyLCIgcG93ZXJfc2V0dGluZ3NfbmV3ICIpLHMoKSxjKDMsInNwYW4iKSxtKDQpLGIoNSwidHJhbnNsYXRlIikscygpKCl9dCYyJiYobCg0KSxFKCIgIixDKDUsMSwiVElUTEVfTE9HT1VUIiksIiAiKSl9ZnVuY3Rpb24gekEodCxuKXtpZih0JjEmJihjKDAsImJ1dHRvbiIsMjIpKDEsIm1hdC1pY29uIiksbSgyLCIgc2hvcHBpbmdfY2FydCAiKSxzKCksYygzLCJzcGFuIiw0NSksbSg0KSxiKDUsInRyYW5zbGF0ZSIpLHMoKSxjKDYsInNwYW4iLDQ2KSxtKDcpLHMoKSgpKSx0JjIpe2xldCBlPXYoKTtsKDQpLEUoIiAiLEMoNSwyLCJUSVRMRV9CQVNLRVQiKSksbCgzKSxBKGUuaXRlbVRvdGFsKX19ZnVuY3Rpb24gVEEodCxuKXtpZih0JjEmJnUoMCwic3BhbiIpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7RHQoImZpIGZpLSIrZSl9fWZ1bmN0aW9uIEVBKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJtYXQtcmFkaW8tYnV0dG9uIiw0NyksUygiY2xpY2siLGZ1bmN0aW9uKCl7bGV0IGE9eihlKS4kaW1wbGljaXQscj12KCk7cmV0dXJuIFQoci5jaGFuZ2VMYW5ndWFnZShhLmtleSkpfSksYygxLCJkaXYiLDQ4KSxxZSgyLFRBLDEsMiwic3BhbiIsNDksRnQpLG0oNCkscygpLHUoNSwiaSIsNTApLHMoKX1pZih0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9digpO2YoInZhbHVlIixlKSgiY2hlY2tlZCIsaS5zZWxlY3RlZExhbmd1YWdlPT09ZSksUmEoImFyaWEtbGFiZWwiLGUubGFuZyksbCgyKSxHZShlLmljb25zKSxsKDIpLEUoIiAiLGU9PW51bGw/bnVsbDplLmxhbmcsIiAiKSxsKCksRHQoImZhcyBmYS10aGVybW9tZXRlci0iK2UuZ2F1Z2UpLGYoInRpdGxlIixlLnBlcmNlbnRhZ2UrIiUgdHJhbnNsYXRlZCIpfX1mdW5jdGlvbiBBQSh0LG4pe3QmMSYmKGMoMCwiYnV0dG9uIiw0MCkoMSwibWF0LWljb24iKSxtKDIsIiBteV9sb2NhdGlvbiAiKSxzKCksYygzLCJzcGFuIiksbSg0KSxiKDUsInRyYW5zbGF0ZSIpLHMoKSgpKSx0JjImJihsKDQpLEUoIiAiLEMoNSwxLCJNWV9TQVZFRF9BRFJFU1NFUyIpLCIgIikpfWZ1bmN0aW9uIERBKHQsbil7dCYxJiYoYygwLCJidXR0b24iLDQxKSgxLCJtYXQtaWNvbiIpLG0oMiwiIGNyZWRpdF9jYXJkICIpLHMoKSxjKDMsInNwYW4iKSxtKDQpLGIoNSwidHJhbnNsYXRlIikscygpKCkpLHQmMiYmKGwoNCksRSgiICIsQyg1LDEsIk1ZX1BBWU1FTlRfT1BUSU9OUyIpLCIgIikpfWZ1bmN0aW9uIElBKHQsbil7dCYxJiYoYygwLCJidXR0b24iLDQyKSgxLCJtYXQtaWNvbiIpLG0oMiwiIGFjY291bnRfYmFsYW5jZV93YWxsZXQgIikscygpLGMoMywic3BhbiIpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKSksdCYyJiYobCg0KSxFKCIgIixDKDUsMSwiRElHSVRBTF9XQUxMRVQiKSwiICIpKX12YXIgdUEsZ0EsdkEsX0EsYkEsQ0Esb3UsY3U9eCgoKT0+e2soKTtOdCgpO3dhKCk7RjEoKTttMygpO0sxKCk7d2koKTtXKCk7cDEoKTtYYSgpO0xwKCk7TXIoKTthYSgpO1dlKCk7SmUoKTtldCgpO3IxKCk7U2EoKTtlbigpO1l0KCk7Qm4oKTtDMygpO3FpKCk7R24oKTtyOCgpO251KCk7dmUoKTt2aSgpO25lKCk7TzMoKTtrKCk7bmUoKTt2ZSgpO1coKTtKZSgpO2V0KCk7V2UoKTt1QT0oKT0+WyJwcml2YWN5LXNlY3VyaXR5L3ByaXZhY3ktcG9saWN5Il0sZ0E9KCk9PlsicHJpdmFjeS1zZWN1cml0eS9kYXRhLWV4cG9ydCJdLHZBPSgpPT5bInByaXZhY3ktc2VjdXJpdHkvY2hhbmdlLXBhc3N3b3JkIl0sX0E9KCk9PlsicHJpdmFjeS1zZWN1cml0eS90d28tZmFjdG9yLWF1dGhlbnRpY2F0aW9uIl0sYkE9KCk9PlsicHJpdmFjeS1zZWN1cml0eS9sYXN0LWxvZ2luLWlwIl0sQ0E9KHQsbik9Pm4ua2V5O0xlLmFkZChYcCxyZixzZixsZixScCxVcixiZiwkcCxjZix6ZixhZixKcCx3ZixWZixiMyxoZix1ZixmZixnZixwZik7b3U9KCgpPT57Y2xhc3MgdHthZG1pbmlzdHJhdGlvblNlcnZpY2U9aChCcik7Y2hhbGxlbmdlU2VydmljZT1oKFNpKTtjb25maWd1cmF0aW9uU2VydmljZT1oKEx0KTt1c2VyU2VydmljZT1oKEF0KTtuZ1pvbmU9aChyZSk7Y29va2llU2VydmljZT1oKFp0KTtyb3V0ZXI9aCh5dCk7dHJhbnNsYXRlPWgoSXQpO2lvPWgoamkpO2xhbmdTZXJ2aWNlPWgoSXApO2xvZ2luR3VhcmQ9aChWaSk7c25hY2tCYXI9aChKMik7YmFza2V0U2VydmljZT1oKGVpKTt1c2VyRW1haWw9IiI7bGFuZ3VhZ2VzPVtdO2ZpbHRlcmVkTGFuZ3VhZ2VzPVtdO2xhbmd1YWdlU2VhcmNoUXVlcnk9IiI7c2VsZWN0ZWRMYW5ndWFnZT0icGxhY2Vob2xkZXIiO3ZlcnNpb249IiI7YXBwbGljYXRpb25OYW1lPSJPV0FTUCBKdWljZSBTaG9wIjtzaG93R2l0SHViTGluaz0hMDtsb2dvU3JjPSJhc3NldHMvcHVibGljL2ltYWdlcy9KdWljZVNob3BfTG9nby5wbmciO3Njb3JlQm9hcmRWaXNpYmxlPSExO3Nob3J0S2V5TGFuZz0icGxhY2Vob2xkZXIiO2l0ZW1Ub3RhbD0wO3NpZGVuYXZUb2dnbGU9bmV3IE47bmdPbkluaXQoKXt0aGlzLmdldExhbmd1YWdlcygpLHRoaXMuYmFza2V0U2VydmljZS5nZXRJdGVtVG90YWwoKS5zdWJzY3JpYmUoZT0+dGhpcy5pdGVtVG90YWw9ZSksdGhpcy5hZG1pbmlzdHJhdGlvblNlcnZpY2UuZ2V0QXBwbGljYXRpb25WZXJzaW9uKCkuc3Vic2NyaWJlKHtuZXh0OmU9PntlJiYodGhpcy52ZXJzaW9uPWB2JHtlfWApfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSksdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5nZXRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb24oKS5zdWJzY3JpYmUoe25leHQ6ZT0+e2lmKGU/LmFwcGxpY2F0aW9uPy5uYW1lJiYodGhpcy5hcHBsaWNhdGlvbk5hbWU9ZS5hcHBsaWNhdGlvbi5uYW1lKSxlPy5hcHBsaWNhdGlvbiYmKHRoaXMuc2hvd0dpdEh1Ykxpbms9ZS5hcHBsaWNhdGlvbi5zaG93R2l0SHViTGlua3MpLGU/LmFwcGxpY2F0aW9uPy5sb2dvKXtsZXQgaT1lLmFwcGxpY2F0aW9uLmxvZ287aS5zdWJzdHJpbmcoMCw0KT09PSJodHRwIiYmKGk9ZGVjb2RlVVJJQ29tcG9uZW50KGkuc3Vic3RyaW5nKGkubGFzdEluZGV4T2YoIi8iKSsxKSkpLHRoaXMubG9nb1NyYz0iYXNzZXRzL3B1YmxpYy9pbWFnZXMvIitpfX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pLGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ0b2tlbiIpP3RoaXMuZ2V0VXNlckRldGFpbHMoKTp0aGlzLnVzZXJFbWFpbD0iIix0aGlzLnVzZXJTZXJ2aWNlLmdldExvZ2dlZEluU3RhdGUoKS5zdWJzY3JpYmUoZT0+e2U/dGhpcy5nZXRVc2VyRGV0YWlscygpOnRoaXMudXNlckVtYWlsPSIifSksdGhpcy5nZXRTY29yZUJvYXJkU3RhdHVzKCksdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLmlvLnNvY2tldCgpLm9uKCJjaGFsbGVuZ2Ugc29sdmVkIixlPT57ZS5rZXk9PT0ic2NvcmVCb2FyZENoYWxsZW5nZSImJih0aGlzLnNjb3JlQm9hcmRWaXNpYmxlPSEwKX0pfSl9ZmlsdGVyTGFuZ3VhZ2VzKCl7aWYoIXRoaXMubGFuZ3VhZ2VTZWFyY2hRdWVyeSl7dGhpcy5maWx0ZXJlZExhbmd1YWdlcz1bLi4udGhpcy5sYW5ndWFnZXNdO3JldHVybn1sZXQgZT10aGlzLmxhbmd1YWdlU2VhcmNoUXVlcnkudG9Mb3dlckNhc2UoKTt0aGlzLmZpbHRlcmVkTGFuZ3VhZ2VzPXRoaXMubGFuZ3VhZ2VzLmZpbHRlcihpPT4hIShpLmxhbmcudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhlKXx8aS5rZXkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhlKXx8aS5zaG9ydEtleT8udG9Mb3dlckNhc2UoKT8uaW5jbHVkZXMoZSkpKX1jaGVja0xhbmd1YWdlKCl7aWYodGhpcy5jb29raWVTZXJ2aWNlLmdldCgibGFuZ3VhZ2UiKSl7bGV0IGU9dGhpcy5jb29raWVTZXJ2aWNlLmdldCgibGFuZ3VhZ2UiKTt0aGlzLnRyYW5zbGF0ZS51c2UoZSksdGhpcy5zZWxlY3RlZExhbmd1YWdlPXRoaXMubGFuZ3VhZ2VzLmZpbmQoaT0+aS5rZXk9PT1lKSx0aGlzLnNob3J0S2V5TGFuZz10aGlzLmxhbmd1YWdlcy5maW5kKGk9Pmkua2V5PT09ZSkuc2hvcnRLZXl9ZWxzZSB0aGlzLmNoYW5nZUxhbmd1YWdlKCJlbiIpLHRoaXMuc2VsZWN0ZWRMYW5ndWFnZT10aGlzLmxhbmd1YWdlcy5maW5kKGU9PmUua2V5PT09ImVuIiksdGhpcy5zaG9ydEtleUxhbmc9dGhpcy5sYW5ndWFnZXMuZmluZChlPT5lLmtleT09PSJlbiIpLnNob3J0S2V5fXNlYXJjaChlKXtpZihlKXtsZXQgaT17cXVlcnlQYXJhbXM6e3E6ZX19O3RoaXMubmdab25lLnJ1bigoKT0+UGUodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbIi9zZWFyY2giXSxpKX0pKX1lbHNlIHRoaXMubmdab25lLnJ1bigoKT0+UGUodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbIi9zZWFyY2giXSl9KSl9Z2V0VXNlckRldGFpbHMoKXt0aGlzLnVzZXJTZXJ2aWNlLndob0FtSSgpLnN1YnNjcmliZSh7bmV4dDplPT57dGhpcy51c2VyRW1haWw9ZS5lbWFpbH0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfWlzTG9nZ2VkSW4oKXtyZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInRva2VuIil9bG9nb3V0KCl7dGhpcy51c2VyU2VydmljZS5zYXZlTGFzdExvZ2luSXAoKS5zdWJzY3JpYmUoe25leHQ6KCk9Pnt0aGlzLm5vb3AoKX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pLGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJ0b2tlbiIpLHRoaXMuY29va2llU2VydmljZS5yZW1vdmUoInRva2VuIiksc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgiYmlkIiksc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgiaXRlbVRvdGFsIiksdGhpcy51c2VyU2VydmljZS5pc0xvZ2dlZEluLm5leHQoITEpLHRoaXMubmdab25lLnJ1bigoKT0+UGUodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbIi8iXSl9KSl9Y2hhbmdlTGFuZ3VhZ2UoZSl7dGhpcy50cmFuc2xhdGUudXNlKGUpO2xldCBpPW5ldyBEYXRlO2lmKGkuc2V0RnVsbFllYXIoaS5nZXRGdWxsWWVhcigpKzEpLHRoaXMuY29va2llU2VydmljZS5wdXQoImxhbmd1YWdlIixlLHtleHBpcmVzOml9KSx0aGlzLmxhbmd1YWdlcy5maW5kKGE9PmEua2V5PT09ZSkpe2xldCBhPXRoaXMubGFuZ3VhZ2VzLmZpbmQobz0+by5rZXk9PT1lKTt0aGlzLnNob3J0S2V5TGFuZz1hLnNob3J0S2V5LHRoaXMuc25hY2tCYXIub3BlbihgTGFuZ3VhZ2UgaGFzIGJlZW4gY2hhbmdlZCB0byAke2EubGFuZ31gLCJGb3JjZSBwYWdlIHJlbG9hZCIse2R1cmF0aW9uOjVlMyxwYW5lbENsYXNzOlsibWF0LWJvZHkiXX0pLm9uQWN0aW9uKCkuc3Vic2NyaWJlKCgpPT57bG9jYXRpb24ucmVsb2FkKCl9KX19Z2V0U2NvcmVCb2FyZFN0YXR1cygpe3RoaXMuY2hhbGxlbmdlU2VydmljZS5maW5kKHtuYW1lOiJTY29yZSBCb2FyZCJ9KS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMubmdab25lLnJ1bigoKT0+e3RoaXMuc2NvcmVCb2FyZFZpc2libGU9ZVswXS5zb2x2ZWR9KX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfWdvVG9Qcm9maWxlUGFnZSgpe3dpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHVlLmhvc3RTZXJ2ZXIrIi9wcm9maWxlIil9Z29Ub0RhdGFFcmFzdXJlUGFnZSgpe3dpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHVlLmhvc3RTZXJ2ZXIrIi9kYXRhZXJhc3VyZSIpfW9uVG9nZ2xlU2lkZW5hdj0oKT0+e3RoaXMuc2lkZW5hdlRvZ2dsZS5lbWl0KCl9O25vb3AoKXt9Z2V0TGFuZ3VhZ2VzKCl7dGhpcy5sYW5nU2VydmljZS5nZXRMYW5ndWFnZXMoKS5zdWJzY3JpYmUoZT0+e3RoaXMubGFuZ3VhZ2VzPWUsdGhpcy5maWx0ZXJlZExhbmd1YWdlcz1BcnJheS5pc0FycmF5KGUpP1suLi5lXTpbXSx0aGlzLmNoZWNrTGFuZ3VhZ2UoKX0pfWlzQWNjb3VudGluZygpe2xldCBlPXRoaXMubG9naW5HdWFyZC50b2tlbkRlY29kZSgpO3JldHVybiBlPy5kYXRhJiZlLmRhdGEucm9sZT09PXRuLmFjY291bnRpbmd9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLW5hdmJhciJdXSxvdXRwdXRzOntzaWRlbmF2VG9nZ2xlOiJzaWRlbmF2VG9nZ2xlIn0sZGVjbHM6MTAwLHZhcnM6NDgsY29uc3RzOltbInNlYXJjaENvbnRyb2wiLCIiXSxbInVzZXJNZW51IiwibWF0TWVudSJdLFsibWVudSIsIm1hdE1lbnUiXSxbInByaXZhY3lTdWJNZW51IiwibWF0TWVudSJdLFsib3JkZXJzU3ViTWVudSIsIm1hdE1lbnUiXSxbImNvbG9yIiwicHJpbWFyeSIsMSwibWF0LWVsZXZhdGlvbi16NiIsIm5hdmJhci10b29sYmFyIl0sWzEsIm5hdmJhci1yb3ciXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLCJPcGVuIFNpZGVuYXYiLCJtYXRUb29sdGlwUG9zaXRpb24iLCJiZWxvdyIsMSwibmF2LXNxdWFyZS1idXR0b24iLDMsImNsaWNrIiwibWF0VG9vbHRpcCJdLFsibWF0LWJ1dHRvbiIsIiIsInJvdXRlckxpbmsiLCIvc2VhcmNoIiwiYXJpYS1sYWJlbCIsIkJhY2sgdG8gaG9tZXBhZ2UiLDEsImJ1dHRvbnMiLCJuYXYtaG9tZS1idXR0b24iXSxbImlkIiwiaG9tZUJ1dHRvbiJdLFsxLCJsb2dvIiwzLCJzcmMiLCJhbHQiXSxbMSwiaGlkZS1sdC1zbSIsImFwcC1uYW1lIl0sWzEsImZpbGwtcmVtYWluaW5nLXNwYWNlIl0sWyJpZCIsInByb2R1Y3Qtc2VhcmNoLWZpeHR1cmUiXSxbImlkIiwic2VhcmNoUXVlcnkiLCJhcmlhLWxhYmVsIiwiQ2xpY2sgdG8gc2VhcmNoIiwzLCJvbkVudGVyIl0sWyJtYXQtYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsIlNob3cvaGlkZSBhY2NvdW50IG1lbnUiLCJpZCIsIm5hdmJhckFjY291bnQiLDEsImJ1dHRvbnMiLCJoaWRlLWx0LW1kIiwibmF2LWJ1dHRvbiIsIm5hdi1hY2NvdW50LWJ1dHRvbiIsMywibWF0TWVudVRyaWdnZXJGb3IiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJhcmlhLWxhYmVsIiwiR28gdG8gdXNlciBwcm9maWxlIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm91dGVyTGluayIsIi9sb2dpbiIsImFyaWEtbGFiZWwiLCJHbyB0byBsb2dpbiBwYWdlIiwiaWQiLCJuYXZiYXJMb2dpbkJ1dHRvbiJdLFsibWF0LW1lbnUtaXRlbSIsIiIsInJvdXRlckxpbmsiLCIvYWNjb3VudGluZyIsImFyaWEtbGFiZWwiLCJHbyB0byBhY2NvdW50aW5nIHBhZ2UiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJhcmlhLWxhYmVsIiwiU2hvdyBPcmRlcnMgYW5kIFBheW1lbnQgTWVudSIsMywibWF0TWVudVRyaWdnZXJGb3IiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJhcmlhLWxhYmVsIiwiU2hvdyBQcml2YWN5IGFuZCBTZWN1cml0eSBNZW51IiwzLCJtYXRNZW51VHJpZ2dlckZvciJdLFsibWF0LW1lbnUtaXRlbSIsIiIsImFyaWEtbGFiZWwiLCJMb2dvdXQiLCJpZCIsIm5hdmJhckxvZ291dEJ1dHRvbiJdLFsibWF0LWJ1dHRvbiIsIiIsInJvdXRlckxpbmsiLCIvYmFza2V0IiwiYXJpYS1sYWJlbCIsIlNob3cgdGhlIHNob3BwaW5nIGNhcnQiLDEsImJ1dHRvbnMiLCJuYXYtYnV0dG9uIl0sWyJpZCIsIm5hdmJhckxhbmd1YWdlQnV0dG9uIiwibWF0LWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLCJMYW5ndWFnZSBzZWxlY3Rpb24gbWVudSIsIm1hdFRvb2x0aXBQb3NpdGlvbiIsImJlbG93IiwxLCJidXR0b25zIiwibmF2LXNxdWFyZS1idXR0b24iLDMsIm1hdE1lbnVUcmlnZ2VyRm9yIiwibWF0VG9vbHRpcCJdLFsxLCJoaWRlLWx0LW1kIl0sWzMsIm92ZXJsYXBUcmlnZ2VyIl0sWzEsImxhbmd1YWdlLXNlYXJjaC1jb250YWluZXIiLDMsImNsaWNrIl0sWzEsImxhbmd1YWdlLXNlYXJjaC1maWVsZCJdLFsibWF0UHJlZml4IiwiIiwxLCJzZWFyY2gtaWNvbiJdLFsidHlwZSIsInNlYXJjaCIsIm1hdElucHV0IiwiIiwzLCJuZ01vZGVsQ2hhbmdlIiwiaW5wdXQiLCJuZ01vZGVsIl0sWzEsIm1hdC1tZW51LWl0ZW0iLCJsYW5ndWFnZS1vcHRpb24iLDMsInZhbHVlIiwiY2hlY2tlZCIsImFyaWEtbGFiZWwiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJhcmlhLWxhYmVsIiwiR28gdG8gcHJpdmFjeSBwb2xpY3kgcGFnZSIsMywicm91dGVyTGluayJdLFsidHJhbnNsYXRlIiwiIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwiYXJpYS1sYWJlbCIsIkdvIHRvIGRhdGEgZXhwb3J0IHBhZ2UiLDMsInJvdXRlckxpbmsiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJhcmlhLWxhYmVsIiwiR28gdG8gZGF0YSBzdWJqZWN0IHBhZ2UiLDMsImNsaWNrIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwiYXJpYS1sYWJlbCIsIkdvIHRvIGNoYW5nZSBwYXNzd29yZCBwYWdlIiwzLCJyb3V0ZXJMaW5rIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwiYXJpYS1sYWJlbCIsIkdvIHRvIHR3byBmYWN0b3IgYXV0aGVudGljYXRpb24gcGFnZSIsMywicm91dGVyTGluayJdLFsibWF0LW1lbnUtaXRlbSIsIiIsImFyaWEtbGFiZWwiLCJHbyB0byBsYXN0IGxvZ2luIGlwIHBhZ2UiLDMsInJvdXRlckxpbmsiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwiL29yZGVyLWhpc3RvcnkiLCJhcmlhLWxhYmVsIiwiR28gdG8gb3JkZXIgaGlzdG9yeSBwYWdlIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm91dGVyTGluayIsIi9yZWN5Y2xlIiwiYXJpYS1sYWJlbCIsIkdvIHRvIHJlY3ljbGluZyBwYWdlIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm91dGVyTGluayIsIi9hZGRyZXNzL3NhdmVkIiwiYXJpYS1sYWJlbCIsIkdvIHRvIHNhdmVkIGFkZHJlc3MgcGFnZSJdLFsibWF0LW1lbnUtaXRlbSIsIiIsInJvdXRlckxpbmsiLCIvc2F2ZWQtcGF5bWVudC1tZXRob2RzIiwiYXJpYS1sYWJlbCIsIkdvIHRvIHNhdmVkIHBheW1lbnQgbWV0aG9kcyBwYWdlIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm91dGVyTGluayIsIi93YWxsZXQiLCJhcmlhLWxhYmVsIiwiR28gdG8gd2FsbGV0IHBhZ2UiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJhcmlhLWxhYmVsIiwiR28gdG8gdXNlciBwcm9maWxlIiwzLCJjbGljayJdLFsibWF0LW1lbnUtaXRlbSIsIiIsImFyaWEtbGFiZWwiLCJMb2dvdXQiLCJpZCIsIm5hdmJhckxvZ291dEJ1dHRvbiIsMywiY2xpY2siXSxbMSwiaGlkZS1sdC1tZCIsImJhc2tldC1sYWJlbCJdLFsxLCJmYS1sYXllcnMtY291bnRlciIsImZhLWxheWVycy10b3AtcmlnaHQiLCJmYS0zeCIsIndhcm4tbm90aWZpY2F0aW9uIl0sWzEsIm1hdC1tZW51LWl0ZW0iLCJsYW5ndWFnZS1vcHRpb24iLDMsImNsaWNrIiwidmFsdWUiLCJjaGVja2VkIiwiYXJpYS1sYWJlbCJdLFsxLCJtYXQtYm9keSIsImxhbmd1YWdlLW9wdGlvbi1jb250ZW50Il0sWzMsImNsYXNzIl0sWzMsInRpdGxlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aWYoaSYxKXtsZXQgcj1MKCk7YygwLCJtYXQtdG9vbGJhciIsNSkoMSwibWF0LXRvb2xiYXItcm93Iiw2KSgyLCJidXR0b24iLDcpLGIoMywidHJhbnNsYXRlIiksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLm9uVG9nZ2xlU2lkZW5hdigpKX0pLGMoNCwibWF0LWljb24iKSxtKDUsIm1lbnUiKSxzKCkoKSxjKDYsImJ1dHRvbiIsOCkoNywiZGl2Iiw5KSx1KDgsImltZyIsMTApLGMoOSwic3BhbiIsMTEpLG0oMTApLHMoKSgpKCksdSgxMSwic3BhbiIsMTIpLGMoMTIsImRpdiIpLHUoMTMsImRpdiIsMTMpLHMoKSxjKDE0LCJhcHAtbWF0LXNlYXJjaC1iYXIiLDE0LDApLFMoIm9uRW50ZXIiLGZ1bmN0aW9uKCl7eihyKTtsZXQgZD1zZSgxNSk7cmV0dXJuIFQoYS5zZWFyY2goZC52YWx1ZSkpfSkscygpLGMoMTYsImJ1dHRvbiIsMTUpKDE3LCJtYXQtaWNvbiIpLG0oMTgsIiBhY2NvdW50X2NpcmNsZSAiKSxzKCksYygxOSwic3BhbiIpLG0oMjApLGIoMjEsInRyYW5zbGF0ZSIpLHMoKSgpLGMoMjIsIm1hdC1tZW51IixudWxsLDEpLE0oMjQseUEsNSwxLCJidXR0b24iLDE2KSgyNSx4QSw2LDMsImJ1dHRvbiIsMTcpLE0oMjYsTUEsNiwzLCJidXR0b24iLDE4KSxNKDI3LHdBLDYsNCwiYnV0dG9uIiwxOSksTSgyOCxTQSw2LDQsImJ1dHRvbiIsMjApLE0oMjksa0EsNiwzLCJidXR0b24iLDIxKSxzKCksTSgzMCx6QSw4LDQsImJ1dHRvbiIsMjIpLGMoMzEsImJ1dHRvbiIsMjMpLGIoMzIsInRyYW5zbGF0ZSIpLGMoMzMsIm1hdC1pY29uIiksbSgzNCwiIGxhbmd1YWdlICIpLHMoKSxjKDM1LCJzcGFuIiwyNCksbSgzNikscygpKCksYygzNywibWF0LW1lbnUiLDI1LDIpKDM5LCJkaXYiLDI2KSxTKCJjbGljayIsZnVuY3Rpb24oZCl7cmV0dXJuIHoociksVChkLnN0b3BQcm9wYWdhdGlvbigpKX0pLGMoNDAsIm1hdC1mb3JtLWZpZWxkIiwyNykoNDEsIm1hdC1pY29uIiwyOCksbSg0Miwic2VhcmNoIikscygpLGMoNDMsIm1hdC1sYWJlbCIpLG0oNDQpLGIoNDUsInRyYW5zbGF0ZSIpLHMoKSxjKDQ2LCJpbnB1dCIsMjkpLEZpKCJuZ01vZGVsQ2hhbmdlIixmdW5jdGlvbihkKXtyZXR1cm4geihyKSxSaShhLmxhbmd1YWdlU2VhcmNoUXVlcnksZCl8fChhLmxhbmd1YWdlU2VhcmNoUXVlcnk9ZCksVChkKX0pLFMoImlucHV0IixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5maWx0ZXJMYW5ndWFnZXMoKSl9KSxzKCkoKSgpLHFlKDQ3LEVBLDYsNywibWF0LXJhZGlvLWJ1dHRvbiIsMzAsQ0EpLHMoKSxjKDQ5LCJtYXQtbWVudSIsbnVsbCwzKSg1MSwiYnV0dG9uIiwzMSkoNTIsIm1hdC1pY29uIiksbSg1MywiIGFzc2lnbm1lbnQgIikscygpLGMoNTQsInNwYW4iLDMyKSxtKDU1LCJUSVRMRV9QUklWQUNZX1BPTElDWSIpLHMoKSgpLGMoNTYsImJ1dHRvbiIsMzMpKDU3LCJtYXQtaWNvbiIpLG0oNTgsIiBnZXRfYXBwICIpLHMoKSxjKDU5LCJzcGFuIiwzMiksbSg2MCwiVElUTEVfUkVRVUVTVF9EQVRBX0VYUE9SVCIpLHMoKSgpLGMoNjEsImJ1dHRvbiIsMzQpLFMoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5nb1RvRGF0YUVyYXN1cmVQYWdlKCkpfSksYyg2MiwibWF0LWljb24iKSxtKDYzLCIgZGVsZXRlX2ZvcmV2ZXIgIikscygpLGMoNjQsInNwYW4iLDMyKSxtKDY1LCJEQVRBX1NVQkpFQ1RfVElUTEUiKSxzKCkoKSx1KDY2LCJtYXQtZGl2aWRlciIpLGMoNjcsImJ1dHRvbiIsMzUpKDY4LCJtYXQtaWNvbiIpLG0oNjksIiBlZGl0ICIpLHMoKSxjKDcwLCJzcGFuIiwzMiksbSg3MSwiVElUTEVfQ0hBTkdFX1BBU1NXT1JEIikscygpKCksYyg3MiwiYnV0dG9uIiwzNikoNzMsIm1hdC1pY29uIiksbSg3NCwiIGV4cG9zdXJlX3BsdXNfMiAiKSxzKCksYyg3NSwic3BhbiIsMzIpLG0oNzYsIlRJVExFX1RXT19GQUNUT1JfQVVUSF9DT05GSUciKSxzKCkoKSxjKDc3LCJidXR0b24iLDM3KSg3OCwibWF0LWljb24iKSxtKDc5LCIgcGxhY2UgIikscygpLGMoODAsInNwYW4iLDMyKSxtKDgxLCJMQVNUX0xPR0lOX0lQIikscygpKCkoKSxjKDgyLCJtYXQtbWVudSIsbnVsbCw0KSg4NCwiYnV0dG9uIiwzOCkoODUsIm1hdC1pY29uIiksbSg4NiwiIGFyY2hpdmUgIikscygpLGMoODcsInNwYW4iKSxtKDg4KSxiKDg5LCJ0cmFuc2xhdGUiKSxzKCkoKSxjKDkwLCJidXR0b24iLDM5KSg5MSwibWF0LWljb24iKSxtKDkyLCIgYXV0b3JlbmV3ICIpLHMoKSxjKDkzLCJzcGFuIiksbSg5NCksYig5NSwidHJhbnNsYXRlIikscygpKCksdSg5NiwibWF0LWRpdmlkZXIiKSxNKDk3LEFBLDYsMywiYnV0dG9uIiw0MCksTSg5OCxEQSw2LDMsImJ1dHRvbiIsNDEpLE0oOTksSUEsNiwzLCJidXR0b24iLDQyKSxzKCkoKSgpfWlmKGkmMil7bGV0IHI9c2UoMjMpLG89c2UoMzgpO2woMiksZigibWF0VG9vbHRpcCIsVmUoQygzLDMxLCJTSURFTkFWX0hJTlQiKSkpLGwoNiksZigiYWx0IixWZShhLmFwcGxpY2F0aW9uTmFtZSkpKCJzcmMiLGEubG9nb1NyYyx3dCksbCgyKSxFKCIgIixhLmFwcGxpY2F0aW9uTmFtZSwiICIpLGwoNiksZigibWF0TWVudVRyaWdnZXJGb3IiLHIpLGwoNCksRSgiICIsQygyMSwzMywiQUNDT1VOVCIpLCIgIiksbCg0KSx3KGEuaXNMb2dnZWRJbigpPzI0OjI1KSxsKDIpLHcoYS5pc0xvZ2dlZEluKCkmJmEuaXNBY2NvdW50aW5nKCk/MjY6LTEpLGwoKSx3KGEuaXNMb2dnZWRJbigpPzI3Oi0xKSxsKCksdyhhLmlzTG9nZ2VkSW4oKT8yODotMSksbCgpLHcoYS5pc0xvZ2dlZEluKCk/Mjk6LTEpLGwoKSx3KGEuaXNMb2dnZWRJbigpPzMwOi0xKSxsKCksZigibWF0VG9vbHRpcCIsVmUoQygzMiwzNSwiTEFOR1VBR0VfU0VMX0hJTlQiKSkpKCJtYXRNZW51VHJpZ2dlckZvciIsbyksbCg1KSxFKCIgIixhLnNob3J0S2V5TGFuZywiICIpLGwoKSxmKCJvdmVybGFwVHJpZ2dlciIsITApLGwoNyksQShDKDQ1LDM3LCJTRUFSQ0hfUExBQ0VIT0xERVIiKSksbCgyKSxOaSgibmdNb2RlbCIsYS5sYW5ndWFnZVNlYXJjaFF1ZXJ5KSxsKCksR2UoYS5maWx0ZXJlZExhbmd1YWdlcyksbCg0KSxmKCJyb3V0ZXJMaW5rIixTdCg0Myx1QSkpLGwoNSksZigicm91dGVyTGluayIsU3QoNDQsZ0EpKSxsKDExKSxmKCJyb3V0ZXJMaW5rIixTdCg0NSx2QSkpLGwoNSksZigicm91dGVyTGluayIsU3QoNDYsX0EpKSxsKDUpLGYoInJvdXRlckxpbmsiLFN0KDQ3LGJBKSksbCgxMSksRSgiICIsQyg4OSwzOSwiTEFCRUxfT1JERVJfSElTVE9SWSIpLCIgIiksbCg2KSxFKCIgIixDKDk1LDQxLCJOQVZfUkVDWUNMRSIpLCIgIiksbCgzKSx3KGEuaXNMb2dnZWRJbigpPzk3Oi0xKSxsKCksdyhhLmlzTG9nZ2VkSW4oKT85ODotMSksbCgpLHcoYS5pc0xvZ2dlZEluKCk/OTk6LTEpfX0sZGVwZW5kZW5jaWVzOltWMyxiNCxvZSxsZSxsMSxSdCxnZSxDZSxtMixhdSxZZixLcix1NCxDMixZLFNlLEExLFFlLFplLGh0LFAwLCRlLG50LGF0LGd0LG10LGVhLEtdLHN0eWxlczpbYG1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6YXV0bzttaW4td2lkdGg6MTAwJTtwYWRkaW5nOi4yNXJlbSAwO3dpZHRoOjEwMCV9Lm1hdC1tZGMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWxlZnQ6LjI1cmVtO3BhZGRpbmctcmlnaHQ6LjI1cmVtfS5uYXZiYXItdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0ubmF2YmFyLXJvd1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleH1AbWVkaWEgKG1heC13aWR0aDogNTk5Ljk4cHgpey5oaWRlLWx0LXNtW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX1AbWVkaWEgKG1heC13aWR0aDogOTU5Ljk4cHgpey5oaWRlLWx0LW1kW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX0jbmF2YmFyTGFuZ3VhZ2VCdXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2hlaWdodDoyNnB4O21hcmdpbi1yaWdodDouMTI1cmVtO3dpZHRoOjI2cHh9bWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyM3B4O2hlaWdodDoyNHB4O3dpZHRoOjI0cHh9Lndhcm4tbm90aWZpY2F0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NDdweDtsZWZ0OjE1cHg7dG9wOi0xNXB4fS5sb2dvW19uZ2NvbnRlbnQtJUNPTVAlXXttYXgtaGVpZ2h0OjYwcHg7d2lkdGg6YXV0b30jaG9tZUJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDttaW4td2lkdGg6MH0uYXZhdGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQgbm8tcmVwZWF0O2JvcmRlci1yYWRpdXM6NTAlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21heC1oZWlnaHQ6MzVweDttYXgtd2lkdGg6MzVweDtwYWRkaW5nOjA7cG9pbnRlci1ldmVudHM6bm9uZX0uZmlsbC1yZW1haW5pbmctc3BhY2VbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIGF1dG99Lmxhbmd1YWdlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6LjYyNXJlbTt3aWR0aDoxMSV9LnVzZXItaW5mb1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6LjYyNXJlbTttYXJnaW4tcmlnaHQ6LjYyNXJlbX0uZmlbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1yaWdodDouMTI1cmVtfVtfbmdob3N0LSVDT01QJV0gICAgIG1hdC1mb3JtLWZpZWxke2JhY2tncm91bmQ6dHJhbnNwYXJlbnQhaW1wb3J0YW50fVtfbmdob3N0LSVDT01QJV0gICAgIG1hdC1pY29ue2JhY2tncm91bmQ6dHJhbnNwYXJlbnQhaW1wb3J0YW50fW1hdC1zZWFyY2gtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweDttYXJnaW4tcmlnaHQ6NHJlbTttaW4td2lkdGg6MjAwcHg7cGFkZGluZy1yaWdodDo0cmVtfS5idXR0b25zW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDphdXRvfS5uYXYtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6M3JlbX0ubmF2LXNxdWFyZS1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDozcmVtO3dpZHRoOjNyZW19Lm5hdi1ob21lLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjMuNzVyZW19Lm5hdi1hY2NvdW50LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17dmVydGljYWwtYWxpZ246bWlkZGxlfS5hcHAtbmFtZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOngtbGFyZ2V9LmJhc2tldC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXJpZ2h0Oi42MjVyZW19Lmxhbmd1YWdlLXNlYXJjaC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVyZW0gMXJlbX0ubGFuZ3VhZ2Utc2VhcmNoLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5sYW5ndWFnZS1vcHRpb25bX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE1cmVtfS5sYW5ndWFnZS1vcHRpb24tY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLWxlZnQ6LjI1cmVtO3dpZHRoOjEyLjVyZW19LnNlYXJjaC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjp2YXIoLS10aGVtZS10ZXh0LWZhZGUtMzApfUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDk1OXB4KXsuYnV0dG9uc1tfbmdjb250ZW50LSVDT01QJV17d2lkdGg6NDhweH0ud2Fybi1ub3RpZmljYXRpb25bX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTYwcHg7cG9zaXRpb246YWJzb2x1dGV9fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDk1OXB4KSBhbmQgKG1pbi13aWR0aDogNjAwcHgpeyNob21lQnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDouNXJlbX0jaG9tZUJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MS4ycmVtIWltcG9ydGFudDt3aGl0ZS1zcGFjZTpub3dyYXB9YnV0dG9uW21hdC1idXR0b25dW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjAgLjVyZW19LmJ1dHRvbnNbX25nY29udGVudC0lQ09NUCVde21pbi13aWR0aDo0OHB4O3dpZHRoOmF1dG8haW1wb3J0YW50fX0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIExBLFBBLFZBLE9BLEhBLE5BLFJBLEZBLEJBLFVBLHN1LGpBLHFBLEdBLHY4LFdBLGx1LGR1LG11LGh1LF84PXgoKCk9PntnYSgpO2soKTtrKCk7dmEoKTtBMigpO1h0KCk7SzIoKTtmaSgpO0kyKCk7dW0oKTtxaSgpO2Q4KCk7eTEoKTtXYSgpO0xBPVsiKiJdLFBBPWAubWRjLWxpc3R7bWFyZ2luOjA7cGFkZGluZzo4cHggMDtsaXN0LXN0eWxlLXR5cGU6bm9uZX0ubWRjLWxpc3Q6Zm9jdXN7b3V0bGluZTpub25lfS5tZGMtbGlzdC1pdGVte2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjpyZWxhdGl2ZTtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO2FsaWduLWl0ZW1zOnN0cmV0Y2g7Y3Vyc29yOnBvaW50ZXI7cGFkZGluZy1sZWZ0OjE2cHg7cGFkZGluZy1yaWdodDoxNnB4O2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWNvbnRhaW5lci1jb2xvciwgdHJhbnNwYXJlbnQpO2JvcmRlci1yYWRpdXM6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItbm9uZSkpfS5tZGMtbGlzdC1pdGVtLm1kYy1saXN0LWl0ZW0tLXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLXNlbGVjdGVkLWNvbnRhaW5lci1jb2xvcil9Lm1kYy1saXN0LWl0ZW06Zm9jdXN7b3V0bGluZTowfS5tZGMtbGlzdC1pdGVtLm1kYy1saXN0LWl0ZW0tLWRpc2FibGVke2N1cnNvcjphdXRvfS5tZGMtbGlzdC1pdGVtLm1kYy1saXN0LWl0ZW0tLXdpdGgtb25lLWxpbmV7aGVpZ2h0OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1vbmUtbGluZS1jb250YWluZXItaGVpZ2h0LCA0OHB4KX0ubWRjLWxpc3QtaXRlbS5tZGMtbGlzdC1pdGVtLS13aXRoLW9uZS1saW5lIC5tZGMtbGlzdC1pdGVtX19zdGFydHthbGlnbi1zZWxmOmNlbnRlcjttYXJnaW4tdG9wOjB9Lm1kYy1saXN0LWl0ZW0ubWRjLWxpc3QtaXRlbS0td2l0aC1vbmUtbGluZSAubWRjLWxpc3QtaXRlbV9fZW5ke2FsaWduLXNlbGY6Y2VudGVyO21hcmdpbi10b3A6MH0ubWRjLWxpc3QtaXRlbS5tZGMtbGlzdC1pdGVtLS13aXRoLXR3by1saW5lc3toZWlnaHQ6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLXR3by1saW5lLWNvbnRhaW5lci1oZWlnaHQsIDY0cHgpfS5tZGMtbGlzdC1pdGVtLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19zdGFydHthbGlnbi1zZWxmOmZsZXgtc3RhcnQ7bWFyZ2luLXRvcDoxNnB4fS5tZGMtbGlzdC1pdGVtLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19lbmR7YWxpZ24tc2VsZjpjZW50ZXI7bWFyZ2luLXRvcDowfS5tZGMtbGlzdC1pdGVtLm1kYy1saXN0LWl0ZW0tLXdpdGgtdGhyZWUtbGluZXN7aGVpZ2h0OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS10aHJlZS1saW5lLWNvbnRhaW5lci1oZWlnaHQsIDg4cHgpfS5tZGMtbGlzdC1pdGVtLm1kYy1saXN0LWl0ZW0tLXdpdGgtdGhyZWUtbGluZXMgLm1kYy1saXN0LWl0ZW1fX3N0YXJ0e2FsaWduLXNlbGY6ZmxleC1zdGFydDttYXJnaW4tdG9wOjE2cHh9Lm1kYy1saXN0LWl0ZW0ubWRjLWxpc3QtaXRlbS0td2l0aC10aHJlZS1saW5lcyAubWRjLWxpc3QtaXRlbV9fZW5ke2FsaWduLXNlbGY6ZmxleC1zdGFydDttYXJnaW4tdG9wOjE2cHh9Lm1kYy1saXN0LWl0ZW0ubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQ6OmJlZm9yZSwubWRjLWxpc3QtaXRlbS5tZGMtbGlzdC1pdGVtLS1zZWxlY3RlZDpmb2N1czo6YmVmb3JlLC5tZGMtbGlzdC1pdGVtOm5vdCgubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQpOmZvY3VzOjpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dG9wOjA7bGVmdDowO2NvbnRlbnQ6IiI7cG9pbnRlci1ldmVudHM6bm9uZX1hLm1kYy1saXN0LWl0ZW17Y29sb3I6aW5oZXJpdDt0ZXh0LWRlY29yYXRpb246bm9uZX0ubWRjLWxpc3QtaXRlbV9fc3RhcnR7ZmlsbDpjdXJyZW50Q29sb3I7ZmxleC1zaHJpbms6MDtwb2ludGVyLWV2ZW50czpub25lfS5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWxpc3QtaXRlbV9fc3RhcnR7Y29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWxlYWRpbmctaWNvbi1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKTt3aWR0aDp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0tbGVhZGluZy1pY29uLXNpemUsIDI0cHgpO2hlaWdodDp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0tbGVhZGluZy1pY29uLXNpemUsIDI0cHgpO21hcmdpbi1sZWZ0OjE2cHg7bWFyZ2luLXJpZ2h0OjMycHh9W2Rpcj1ydGxdIC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctaWNvbiAubWRjLWxpc3QtaXRlbV9fc3RhcnR7bWFyZ2luLWxlZnQ6MzJweDttYXJnaW4tcmlnaHQ6MTZweH0ubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLWljb246aG92ZXIgLm1kYy1saXN0LWl0ZW1fX3N0YXJ0e2NvbG9yOnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1ob3Zlci1sZWFkaW5nLWljb24tY29sb3IpfS5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctYXZhdGFyIC5tZGMtbGlzdC1pdGVtX19zdGFydHt3aWR0aDp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0tbGVhZGluZy1hdmF0YXItc2l6ZSwgNDBweCk7aGVpZ2h0OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1sZWFkaW5nLWF2YXRhci1zaXplLCA0MHB4KTttYXJnaW4tbGVmdDoxNnB4O21hcmdpbi1yaWdodDoxNnB4O2JvcmRlci1yYWRpdXM6NTAlfS5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctYXZhdGFyIC5tZGMtbGlzdC1pdGVtX19zdGFydCxbZGlyPXJ0bF0gLm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1hdmF0YXIgLm1kYy1saXN0LWl0ZW1fX3N0YXJ0e21hcmdpbi1sZWZ0OjE2cHg7bWFyZ2luLXJpZ2h0OjE2cHg7Ym9yZGVyLXJhZGl1czo1MCV9Lm1kYy1saXN0LWl0ZW1fX2VuZHtmbGV4LXNocmluazowO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctbWV0YSAubWRjLWxpc3QtaXRlbV9fZW5ke2ZvbnQtZmFtaWx5OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS10cmFpbGluZy1zdXBwb3J0aW5nLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1zbWFsbC1mb250KSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLXRyYWlsaW5nLXN1cHBvcnRpbmctdGV4dC1saW5lLWhlaWdodCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1zbWFsbC1saW5lLWhlaWdodCkpO2ZvbnQtc2l6ZTp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0tdHJhaWxpbmctc3VwcG9ydGluZy10ZXh0LXNpemUsIHZhcigtLW1hdC1zeXMtbGFiZWwtc21hbGwtc2l6ZSkpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS10cmFpbGluZy1zdXBwb3J0aW5nLXRleHQtd2VpZ2h0LCB2YXIoLS1tYXQtc3lzLWxhYmVsLXNtYWxsLXdlaWdodCkpO2xldHRlci1zcGFjaW5nOnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS10cmFpbGluZy1zdXBwb3J0aW5nLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtbGFiZWwtc21hbGwtdHJhY2tpbmcpKX0ubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtbGlzdC1pdGVtX19lbmR7Y29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLXRyYWlsaW5nLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSk7d2lkdGg6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLXRyYWlsaW5nLWljb24tc2l6ZSwgMjRweCk7aGVpZ2h0OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS10cmFpbGluZy1pY29uLXNpemUsIDI0cHgpfS5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLWljb246aG92ZXIgLm1kYy1saXN0LWl0ZW1fX2VuZHtjb2xvcjp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0taG92ZXItdHJhaWxpbmctaWNvbi1jb2xvcil9Lm1kYy1saXN0LWl0ZW0ubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1tZXRhIC5tZGMtbGlzdC1pdGVtX19lbmR7Y29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLXRyYWlsaW5nLXN1cHBvcnRpbmctdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKX0ubWRjLWxpc3QtaXRlbS0tc2VsZWN0ZWQubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtbGlzdC1pdGVtX19lbmR7Y29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLXNlbGVjdGVkLXRyYWlsaW5nLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tZGMtbGlzdC1pdGVtX19jb250ZW50e3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjthbGlnbi1zZWxmOmNlbnRlcjtmbGV4OjE7cG9pbnRlci1ldmVudHM6bm9uZX0ubWRjLWxpc3QtaXRlbS0td2l0aC10d28tbGluZXMgLm1kYy1saXN0LWl0ZW1fX2NvbnRlbnQsLm1kYy1saXN0LWl0ZW0tLXdpdGgtdGhyZWUtbGluZXMgLm1kYy1saXN0LWl0ZW1fX2NvbnRlbnR7YWxpZ24tc2VsZjpzdHJldGNofS5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHR7dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO2NvbG9yOnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKTtmb250LWZhbWlseTp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0tbGFiZWwtdGV4dC1mb250LCB2YXIoLS1tYXQtc3lzLWJvZHktbGFyZ2UtZm9udCkpO2xpbmUtaGVpZ2h0OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1sYWJlbC10ZXh0LWxpbmUtaGVpZ2h0LCB2YXIoLS1tYXQtc3lzLWJvZHktbGFyZ2UtbGluZS1oZWlnaHQpKTtmb250LXNpemU6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXNpemUpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0tbGFiZWwtdGV4dC13ZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZS13ZWlnaHQpKTtsZXR0ZXItc3BhY2luZzp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0tbGFiZWwtdGV4dC10cmFja2luZywgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXRyYWNraW5nKSl9Lm1kYy1saXN0LWl0ZW06aG92ZXIgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dHtjb2xvcjp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0taG92ZXItbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1kYy1saXN0LWl0ZW06Zm9jdXMgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dHtjb2xvcjp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0tZm9jdXMtbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQsLm1kYy1saXN0LWl0ZW0tLXdpdGgtdGhyZWUtbGluZXMgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dHtkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6MDtsaW5lLWhlaWdodDpub3JtYWw7bWFyZ2luLWJvdHRvbTotMjBweH0ubWRjLWxpc3QtaXRlbS0td2l0aC10d28tbGluZXMgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dDo6YmVmb3JlLC5tZGMtbGlzdC1pdGVtLS13aXRoLXRocmVlLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQ6OmJlZm9yZXtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDowO2hlaWdodDoyOHB4O2NvbnRlbnQ6IiI7dmVydGljYWwtYWxpZ246MH0ubWRjLWxpc3QtaXRlbS0td2l0aC10d28tbGluZXMgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dDo6YWZ0ZXIsLm1kYy1saXN0LWl0ZW0tLXdpdGgtdGhyZWUtbGluZXMgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dDo6YWZ0ZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MDtoZWlnaHQ6MjBweDtjb250ZW50OiIiO3ZlcnRpY2FsLWFsaWduOi0yMHB4fS5tZGMtbGlzdC1pdGVtX19zZWNvbmRhcnktdGV4dHt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjA7Y29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLXN1cHBvcnRpbmctdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKTtmb250LWZhbWlseTp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0tc3VwcG9ydGluZy10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tZm9udCkpO2xpbmUtaGVpZ2h0OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1zdXBwb3J0aW5nLXRleHQtbGluZS1oZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tbGluZS1oZWlnaHQpKTtmb250LXNpemU6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLXN1cHBvcnRpbmctdGV4dC1zaXplLCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLXNpemUpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0tc3VwcG9ydGluZy10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS13ZWlnaHQpKTtsZXR0ZXItc3BhY2luZzp2YXIoLS1tYXQtbGlzdC1saXN0LWl0ZW0tc3VwcG9ydGluZy10ZXh0LXRyYWNraW5nLCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLXRyYWNraW5nKSl9Lm1kYy1saXN0LWl0ZW1fX3NlY29uZGFyeS10ZXh0OjpiZWZvcmV7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MDtoZWlnaHQ6MjBweDtjb250ZW50OiIiO3ZlcnRpY2FsLWFsaWduOjB9Lm1kYy1saXN0LWl0ZW0tLXdpdGgtdGhyZWUtbGluZXMgLm1kYy1saXN0LWl0ZW1fX3NlY29uZGFyeS10ZXh0e3doaXRlLXNwYWNlOm5vcm1hbDtsaW5lLWhlaWdodDoyMHB4fS5tZGMtbGlzdC1pdGVtLS13aXRoLW92ZXJsaW5lIC5tZGMtbGlzdC1pdGVtX19zZWNvbmRhcnktdGV4dHt3aGl0ZS1zcGFjZTpub3dyYXA7bGluZS1oZWlnaHQ6YXV0b30ubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLXJhZGlvLm1kYy1saXN0LWl0ZW0sLm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1jaGVja2JveC5tZGMtbGlzdC1pdGVtLC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtbGlzdC1pdGVtLC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctYXZhdGFyLm1kYy1saXN0LWl0ZW17cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDoxNnB4fVtkaXI9cnRsXSAubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLXJhZGlvLm1kYy1saXN0LWl0ZW0sW2Rpcj1ydGxdIC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctY2hlY2tib3gubWRjLWxpc3QtaXRlbSxbZGlyPXJ0bF0gLm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1pY29uLm1kYy1saXN0LWl0ZW0sW2Rpcj1ydGxdIC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctYXZhdGFyLm1kYy1saXN0LWl0ZW17cGFkZGluZy1sZWZ0OjE2cHg7cGFkZGluZy1yaWdodDowfS5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctcmFkaW8ubWRjLWxpc3QtaXRlbS0td2l0aC10d28tbGluZXMgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dCwubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLWNoZWNrYm94Lm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQsLm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1pY29uLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQsLm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1hdmF0YXIubWRjLWxpc3QtaXRlbS0td2l0aC10d28tbGluZXMgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dHtkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6MDtsaW5lLWhlaWdodDpub3JtYWw7bWFyZ2luLWJvdHRvbTotMjBweH0ubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLXJhZGlvLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQ6OmJlZm9yZSwubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLWNoZWNrYm94Lm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQ6OmJlZm9yZSwubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLWljb24ubWRjLWxpc3QtaXRlbS0td2l0aC10d28tbGluZXMgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dDo6YmVmb3JlLC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctYXZhdGFyLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQ6OmJlZm9yZXtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDowO2hlaWdodDozMnB4O2NvbnRlbnQ6IiI7dmVydGljYWwtYWxpZ246MH0ubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLXJhZGlvLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQ6OmFmdGVyLC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctY2hlY2tib3gubWRjLWxpc3QtaXRlbS0td2l0aC10d28tbGluZXMgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dDo6YWZ0ZXIsLm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1pY29uLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQ6OmFmdGVyLC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctYXZhdGFyLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIC5tZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQ6OmFmdGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjA7aGVpZ2h0OjIwcHg7Y29udGVudDoiIjt2ZXJ0aWNhbC1hbGlnbjotMjBweH0ubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLXJhZGlvLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctbWV0YSAubWRjLWxpc3QtaXRlbV9fZW5kLC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctY2hlY2tib3gubWRjLWxpc3QtaXRlbS0td2l0aC10d28tbGluZXMubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1tZXRhIC5tZGMtbGlzdC1pdGVtX19lbmQsLm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1pY29uLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctbWV0YSAubWRjLWxpc3QtaXRlbV9fZW5kLC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctYXZhdGFyLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctbWV0YSAubWRjLWxpc3QtaXRlbV9fZW5ke2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDowO2xpbmUtaGVpZ2h0Om5vcm1hbH0ubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLXJhZGlvLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctbWV0YSAubWRjLWxpc3QtaXRlbV9fZW5kOjpiZWZvcmUsLm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1jaGVja2JveC5tZGMtbGlzdC1pdGVtLS13aXRoLXR3by1saW5lcy5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLW1ldGEgLm1kYy1saXN0LWl0ZW1fX2VuZDo6YmVmb3JlLC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctaWNvbi5tZGMtbGlzdC1pdGVtLS13aXRoLXR3by1saW5lcy5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLW1ldGEgLm1kYy1saXN0LWl0ZW1fX2VuZDo6YmVmb3JlLC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctYXZhdGFyLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctbWV0YSAubWRjLWxpc3QtaXRlbV9fZW5kOjpiZWZvcmV7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MDtoZWlnaHQ6MzJweDtjb250ZW50OiIiO3ZlcnRpY2FsLWFsaWduOjB9Lm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctaWNvbi5tZGMtbGlzdC1pdGVtLFtkaXI9cnRsXSAubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1pY29uLm1kYy1saXN0LWl0ZW17cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDowfS5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLWljb24gLm1kYy1saXN0LWl0ZW1fX2VuZHttYXJnaW4tbGVmdDoxNnB4O21hcmdpbi1yaWdodDoxNnB4fS5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLW1ldGEubWRjLWxpc3QtaXRlbXtwYWRkaW5nLWxlZnQ6MTZweDtwYWRkaW5nLXJpZ2h0OjB9W2Rpcj1ydGxdIC5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLW1ldGEubWRjLWxpc3QtaXRlbXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjE2cHh9Lm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctbWV0YSAubWRjLWxpc3QtaXRlbV9fZW5key13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO21hcmdpbi1sZWZ0OjI4cHg7bWFyZ2luLXJpZ2h0OjE2cHh9W2Rpcj1ydGxdIC5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLW1ldGEgLm1kYy1saXN0LWl0ZW1fX2VuZHttYXJnaW4tbGVmdDoxNnB4O21hcmdpbi1yaWdodDoyOHB4fS5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLW1ldGEubWRjLWxpc3QtaXRlbS0td2l0aC10aHJlZS1saW5lcyAubWRjLWxpc3QtaXRlbV9fZW5kLC5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLW1ldGEubWRjLWxpc3QtaXRlbS0td2l0aC10d28tbGluZXMgLm1kYy1saXN0LWl0ZW1fX2VuZHtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0Om5vcm1hbDthbGlnbi1zZWxmOmZsZXgtc3RhcnQ7bWFyZ2luLXRvcDowfS5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLW1ldGEubWRjLWxpc3QtaXRlbS0td2l0aC10aHJlZS1saW5lcyAubWRjLWxpc3QtaXRlbV9fZW5kOjpiZWZvcmUsLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctbWV0YS5tZGMtbGlzdC1pdGVtLS13aXRoLXR3by1saW5lcyAubWRjLWxpc3QtaXRlbV9fZW5kOjpiZWZvcmV7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MDtoZWlnaHQ6MjhweDtjb250ZW50OiIiO3ZlcnRpY2FsLWFsaWduOjB9Lm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1yYWRpbyAubWRjLWxpc3QtaXRlbV9fc3RhcnQsLm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1jaGVja2JveCAubWRjLWxpc3QtaXRlbV9fc3RhcnR7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDoyNHB4fVtkaXI9cnRsXSAubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLXJhZGlvIC5tZGMtbGlzdC1pdGVtX19zdGFydCxbZGlyPXJ0bF0gLm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1jaGVja2JveCAubWRjLWxpc3QtaXRlbV9fc3RhcnR7bWFyZ2luLWxlZnQ6MjRweDttYXJnaW4tcmlnaHQ6OHB4fS5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctcmFkaW8ubWRjLWxpc3QtaXRlbS0td2l0aC10d28tbGluZXMgLm1kYy1saXN0LWl0ZW1fX3N0YXJ0LC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctY2hlY2tib3gubWRjLWxpc3QtaXRlbS0td2l0aC10d28tbGluZXMgLm1kYy1saXN0LWl0ZW1fX3N0YXJ0e2FsaWduLXNlbGY6ZmxleC1zdGFydDttYXJnaW4tdG9wOjhweH0ubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1yYWRpby5tZGMtbGlzdC1pdGVtLC5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLWNoZWNrYm94Lm1kYy1saXN0LWl0ZW17cGFkZGluZy1sZWZ0OjE2cHg7cGFkZGluZy1yaWdodDowfVtkaXI9cnRsXSAubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1yYWRpby5tZGMtbGlzdC1pdGVtLFtkaXI9cnRsXSAubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1jaGVja2JveC5tZGMtbGlzdC1pdGVte3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MTZweH0ubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1yYWRpby5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctaWNvbiwubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1yYWRpby5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctYXZhdGFyLC5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLWNoZWNrYm94Lm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1pY29uLC5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLWNoZWNrYm94Lm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1hdmF0YXJ7cGFkZGluZy1sZWZ0OjB9W2Rpcj1ydGxdIC5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLXJhZGlvLm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1pY29uLFtkaXI9cnRsXSAubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1yYWRpby5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctYXZhdGFyLFtkaXI9cnRsXSAubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1jaGVja2JveC5tZGMtbGlzdC1pdGVtLS13aXRoLWxlYWRpbmctaWNvbixbZGlyPXJ0bF0gLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctY2hlY2tib3gubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLWF2YXRhcntwYWRkaW5nLXJpZ2h0OjB9Lm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctcmFkaW8gLm1kYy1saXN0LWl0ZW1fX2VuZCwubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1jaGVja2JveCAubWRjLWxpc3QtaXRlbV9fZW5ke21hcmdpbi1sZWZ0OjI0cHg7bWFyZ2luLXJpZ2h0OjhweH1bZGlyPXJ0bF0gLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctcmFkaW8gLm1kYy1saXN0LWl0ZW1fX2VuZCxbZGlyPXJ0bF0gLm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctY2hlY2tib3ggLm1kYy1saXN0LWl0ZW1fX2VuZHttYXJnaW4tbGVmdDo4cHg7bWFyZ2luLXJpZ2h0OjI0cHh9Lm1kYy1saXN0LWl0ZW0tLXdpdGgtdHJhaWxpbmctcmFkaW8ubWRjLWxpc3QtaXRlbS0td2l0aC10aHJlZS1saW5lcyAubWRjLWxpc3QtaXRlbV9fZW5kLC5tZGMtbGlzdC1pdGVtLS13aXRoLXRyYWlsaW5nLWNoZWNrYm94Lm1kYy1saXN0LWl0ZW0tLXdpdGgtdGhyZWUtbGluZXMgLm1kYy1saXN0LWl0ZW1fX2VuZHthbGlnbi1zZWxmOmZsZXgtc3RhcnQ7bWFyZ2luLXRvcDo4cHh9Lm1kYy1saXN0LWdyb3VwX19zdWJoZWFkZXJ7bWFyZ2luOi43NXJlbSAxNnB4fS5tZGMtbGlzdC1pdGVtLS1kaXNhYmxlZCAubWRjLWxpc3QtaXRlbV9fc3RhcnQsLm1kYy1saXN0LWl0ZW0tLWRpc2FibGVkIC5tZGMtbGlzdC1pdGVtX19jb250ZW50LC5tZGMtbGlzdC1pdGVtLS1kaXNhYmxlZCAubWRjLWxpc3QtaXRlbV9fZW5ke29wYWNpdHk6MX0ubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQgLm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dCwubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQgLm1kYy1saXN0LWl0ZW1fX3NlY29uZGFyeS10ZXh0e29wYWNpdHk6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWRpc2FibGVkLWxhYmVsLXRleHQtb3BhY2l0eSwgMC4zKX0ubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQubWRjLWxpc3QtaXRlbS0td2l0aC1sZWFkaW5nLWljb24gLm1kYy1saXN0LWl0ZW1fX3N0YXJ0e2NvbG9yOnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1kaXNhYmxlZC1sZWFkaW5nLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO29wYWNpdHk6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWRpc2FibGVkLWxlYWRpbmctaWNvbi1vcGFjaXR5LCAwLjM4KX0ubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQubWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1pY29uIC5tZGMtbGlzdC1pdGVtX19lbmR7Y29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWRpc2FibGVkLXRyYWlsaW5nLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO29wYWNpdHk6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWRpc2FibGVkLXRyYWlsaW5nLWljb24tb3BhY2l0eSwgMC4zOCl9Lm1hdC1tZGMtbGlzdC1pdGVtLm1hdC1tZGMtbGlzdC1pdGVtLWJvdGgtbGVhZGluZy1hbmQtdHJhaWxpbmcsW2Rpcj1ydGxdIC5tYXQtbWRjLWxpc3QtaXRlbS5tYXQtbWRjLWxpc3QtaXRlbS1ib3RoLWxlYWRpbmctYW5kLXRyYWlsaW5ne3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MH0ubWRjLWxpc3QtaXRlbS5tZGMtbGlzdC1pdGVtLS1kaXNhYmxlZCAubWRjLWxpc3QtaXRlbV9fcHJpbWFyeS10ZXh0e2NvbG9yOnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1kaXNhYmxlZC1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWRjLWxpc3QtaXRlbTpob3Zlcjo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWhvdmVyLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKTtvcGFjaXR5OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLWhvdmVyLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWRjLWxpc3QtaXRlbS5tZGMtbGlzdC1pdGVtLS1kaXNhYmxlZDo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWRpc2FibGVkLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKTtvcGFjaXR5OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1kaXNhYmxlZC1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLWZvY3VzLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWRjLWxpc3QtaXRlbTpmb2N1czo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWZvY3VzLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKTtvcGFjaXR5OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLWZvY3VzLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQgLm1kYy1yYWRpbywubWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQgLm1kYy1jaGVja2JveHtvcGFjaXR5OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1kaXNhYmxlZC1sYWJlbC10ZXh0LW9wYWNpdHksIDAuMyl9Lm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1hdmF0YXIgLm1hdC1tZGMtbGlzdC1pdGVtLWF2YXRhcntib3JkZXItcmFkaXVzOnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1sZWFkaW5nLWF2YXRhci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZnVsbCkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWxpc3QtbGlzdC1pdGVtLWxlYWRpbmctYXZhdGFyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnktY29udGFpbmVyKSl9Lm1hdC1tZGMtbGlzdC1pdGVtLWljb257Zm9udC1zaXplOnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1sZWFkaW5nLWljb24tc2l6ZSwgMjRweCl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7YS5tZGMtbGlzdC1pdGVtLS1hY3RpdmF0ZWQ6OmFmdGVye2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDoxNnB4O3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpO3dpZHRoOjEwcHg7aGVpZ2h0OjA7Ym9yZGVyLWJvdHRvbTpzb2xpZCAxMHB4O2JvcmRlci1yYWRpdXM6MTBweH1hLm1kYy1saXN0LWl0ZW0tLWFjdGl2YXRlZCBbZGlyPXJ0bF06OmFmdGVye3JpZ2h0OmF1dG87bGVmdDoxNnB4fX0ubWF0LW1kYy1saXN0LWJhc2V7ZGlzcGxheTpibG9ja30ubWF0LW1kYy1saXN0LWJhc2UgLm1kYy1saXN0LWl0ZW1fX3N0YXJ0LC5tYXQtbWRjLWxpc3QtYmFzZSAubWRjLWxpc3QtaXRlbV9fZW5kLC5tYXQtbWRjLWxpc3QtYmFzZSAubWRjLWxpc3QtaXRlbV9fY29udGVudHtwb2ludGVyLWV2ZW50czphdXRvfS5tYXQtbWRjLWxpc3QtaXRlbSwubWF0LW1kYy1saXN0LW9wdGlvbnt3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKX0ubWF0LW1kYy1saXN0LWl0ZW06bm90KC5tYXQtbWRjLWxpc3QtaXRlbS1pbnRlcmFjdGl2ZSksLm1hdC1tZGMtbGlzdC1vcHRpb246bm90KC5tYXQtbWRjLWxpc3QtaXRlbS1pbnRlcmFjdGl2ZSl7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1tZGMtbGlzdC1pdGVtIC5tYXQtZGl2aWRlci1pbnNldCwubWF0LW1kYy1saXN0LW9wdGlvbiAubWF0LWRpdmlkZXItaW5zZXR7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjB9Lm1hdC1tZGMtbGlzdC1pdGVtIC5tYXQtbWRjLWxpc3QtaXRlbS1hdmF0YXJ+Lm1hdC1kaXZpZGVyLWluc2V0LC5tYXQtbWRjLWxpc3Qtb3B0aW9uIC5tYXQtbWRjLWxpc3QtaXRlbS1hdmF0YXJ+Lm1hdC1kaXZpZGVyLWluc2V0e21hcmdpbi1sZWZ0OjcycHh9W2Rpcj1ydGxdIC5tYXQtbWRjLWxpc3QtaXRlbSAubWF0LW1kYy1saXN0LWl0ZW0tYXZhdGFyfi5tYXQtZGl2aWRlci1pbnNldCxbZGlyPXJ0bF0gLm1hdC1tZGMtbGlzdC1vcHRpb24gLm1hdC1tZGMtbGlzdC1pdGVtLWF2YXRhcn4ubWF0LWRpdmlkZXItaW5zZXR7bWFyZ2luLXJpZ2h0OjcycHh9Lm1hdC1tZGMtbGlzdC1pdGVtLWludGVyYWN0aXZlOjpiZWZvcmV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDoiIjtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTtib3JkZXItcmFkaXVzOmluaGVyaXR9Lm1hdC1tZGMtbGlzdC1pdGVtPi5tYXQtZm9jdXMtaW5kaWNhdG9ye3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1tZGMtbGlzdC1pdGVtOmZvY3VzPi5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7Y29udGVudDoiIn0ubWF0LW1kYy1saXN0LWl0ZW0ubWRjLWxpc3QtaXRlbS0td2l0aC10aHJlZS1saW5lcyAubWF0LW1kYy1saXN0LWl0ZW0tbGluZS5tZGMtbGlzdC1pdGVtX19zZWNvbmRhcnktdGV4dHt3aGl0ZS1zcGFjZTpub3dyYXA7bGluZS1oZWlnaHQ6bm9ybWFsfS5tYXQtbWRjLWxpc3QtaXRlbS5tZGMtbGlzdC1pdGVtLS13aXRoLXRocmVlLWxpbmVzIC5tYXQtbWRjLWxpc3QtaXRlbS11bnNjb3BlZC1jb250ZW50Lm1kYy1saXN0LWl0ZW1fX3NlY29uZGFyeS10ZXh0e2Rpc3BsYXk6LXdlYmtpdC1ib3g7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtbGluZS1jbGFtcDoyfW1hdC1hY3Rpb24tbGlzdCBidXR0b257YmFja2dyb3VuZDpub25lO2NvbG9yOmluaGVyaXQ7Ym9yZGVyOm5vbmU7Zm9udDppbmhlcml0O291dGxpbmU6aW5oZXJpdDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKTt0ZXh0LWFsaWduOnN0YXJ0fW1hdC1hY3Rpb24tbGlzdCBidXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1pY29uIC5tZGMtbGlzdC1pdGVtX19zdGFydHttYXJnaW4taW5saW5lLXN0YXJ0OnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1sZWFkaW5nLWljb24tc3RhcnQtc3BhY2UsIDE2cHgpO21hcmdpbi1pbmxpbmUtZW5kOnZhcigtLW1hdC1saXN0LWxpc3QtaXRlbS1sZWFkaW5nLWljb24tZW5kLXNwYWNlLCAxNnB4KX0ubWF0LW1kYy1uYXYtbGlzdCAubWF0LW1kYy1saXN0LWl0ZW17Ym9yZGVyLXJhZGl1czp2YXIoLS1tYXQtbGlzdC1hY3RpdmUtaW5kaWNhdG9yLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1mdWxsKSk7LS1tYXQtZm9jdXMtaW5kaWNhdG9yLWJvcmRlci1yYWRpdXM6IHZhcigtLW1hdC1saXN0LWFjdGl2ZS1pbmRpY2F0b3Itc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWZ1bGwpKX0ubWF0LW1kYy1uYXYtbGlzdCAubWF0LW1kYy1saXN0LWl0ZW0ubWRjLWxpc3QtaXRlbS0tYWN0aXZhdGVke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWxpc3QtYWN0aXZlLWluZGljYXRvci1jb2xvciwgdmFyKC0tbWF0LXN5cy1zZWNvbmRhcnktY29udGFpbmVyKSl9CmAsVkE9WyJ1bnNjb3BlZENvbnRlbnQiXSxPQT1bInRleHQiXSxIQT1bW1siIiwibWF0TGlzdEl0ZW1BdmF0YXIiLCIiXSxbIiIsIm1hdExpc3RJdGVtSWNvbiIsIiJdXSxbWyIiLCJtYXRMaXN0SXRlbVRpdGxlIiwiIl1dLFtbIiIsIm1hdExpc3RJdGVtTGluZSIsIiJdXSwiKiIsW1siIiwibWF0TGlzdEl0ZW1NZXRhIiwiIl1dLFtbIm1hdC1kaXZpZGVyIl1dXSxOQT1bIlttYXRMaXN0SXRlbUF2YXRhcl0sW21hdExpc3RJdGVtSWNvbl0iLCJbbWF0TGlzdEl0ZW1UaXRsZV0iLCJbbWF0TGlzdEl0ZW1MaW5lXSIsIioiLCJbbWF0TGlzdEl0ZW1NZXRhXSIsIm1hdC1kaXZpZGVyIl0sUkE9bmV3IGNlKCJMaXN0T3B0aW9uIiksRkE9KCgpPT57Y2xhc3MgdHtfZWxlbWVudFJlZj1oKGFlKTtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXRMaXN0SXRlbVRpdGxlIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LW1kYy1saXN0LWl0ZW0tdGl0bGUiLCJtZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQiXX0pfXJldHVybiB0fSkoKSxCQT0oKCk9PntjbGFzcyB0e19lbGVtZW50UmVmPWgoYWUpO2NvbnN0cnVjdG9yKCl7fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsIm1hdExpc3RJdGVtTGluZSIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtbGlzdC1pdGVtLWxpbmUiLCJtZGMtbGlzdC1pdGVtX19zZWNvbmRhcnktdGV4dCJdfSl9cmV0dXJuIHR9KSgpLFVBPSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siIiwibWF0TGlzdEl0ZW1NZXRhIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LW1kYy1saXN0LWl0ZW0tbWV0YSIsIm1kYy1saXN0LWl0ZW1fX2VuZCJdfSl9cmV0dXJuIHR9KSgpLHN1PSgoKT0+e2NsYXNzIHR7X2xpc3RPcHRpb249aChSQSx7b3B0aW9uYWw6ITB9KTtjb25zdHJ1Y3Rvcigpe31faXNBbGlnbmVkQXRTdGFydCgpe3JldHVybiF0aGlzLl9saXN0T3B0aW9ufHx0aGlzLl9saXN0T3B0aW9uPy5fZ2V0VG9nZ2xlUG9zaXRpb24oKT09PSJhZnRlciJ9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxob3N0VmFyczo0LGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmaWUoIm1kYy1saXN0LWl0ZW1fX3N0YXJ0IixhLl9pc0FsaWduZWRBdFN0YXJ0KCkpKCJtZGMtbGlzdC1pdGVtX19lbmQiLCFhLl9pc0FsaWduZWRBdFN0YXJ0KCkpfX0pfXJldHVybiB0fSkoKSxqQT0oKCk9PntjbGFzcyB0IGV4dGVuZHMgc3V7c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgZTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuKGV8fChlPWt0KHQpKSkoYXx8dCl9fSkoKTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siIiwibWF0TGlzdEl0ZW1BdmF0YXIiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtbWRjLWxpc3QtaXRlbS1hdmF0YXIiXSxmZWF0dXJlczpbRmVdfSl9cmV0dXJuIHR9KSgpLHFBPSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBzdXtzdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXRMaXN0SXRlbUljb24iLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtbWRjLWxpc3QtaXRlbS1pY29uIl0sZmVhdHVyZXM6W0ZlXX0pfXJldHVybiB0fSkoKSxHQT1uZXcgY2UoIk1BVF9MSVNUX0NPTkZJRyIpLHY4PSgoKT0+e2NsYXNzIHR7X2lzTm9uSW50ZXJhY3RpdmU9ITA7Z2V0IGRpc2FibGVSaXBwbGUoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZVJpcHBsZX1zZXQgZGlzYWJsZVJpcHBsZShlKXt0aGlzLl9kaXNhYmxlUmlwcGxlPVcxKGUpfV9kaXNhYmxlUmlwcGxlPSExO2dldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZCgpfXNldCBkaXNhYmxlZChlKXt0aGlzLl9kaXNhYmxlZC5zZXQoVzEoZSkpfV9kaXNhYmxlZD1mdCghMSk7X2RlZmF1bHRPcHRpb25zPWgoR0Ese29wdGlvbmFsOiEwfSk7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmRygiYXJpYS1kaXNhYmxlZCIsYS5kaXNhYmxlZCl9LGlucHV0czp7ZGlzYWJsZVJpcHBsZToiZGlzYWJsZVJpcHBsZSIsZGlzYWJsZWQ6ImRpc2FibGVkIn19KX1yZXR1cm4gdH0pKCksV0E9KCgpPT57Y2xhc3MgdHtfZWxlbWVudFJlZj1oKGFlKTtfbmdab25lPWgocmUpO19saXN0QmFzZT1oKHY4LHtvcHRpb25hbDohMH0pO19wbGF0Zm9ybT1oKGIxKTtfaG9zdEVsZW1lbnQ7X2lzQnV0dG9uRWxlbWVudDtfbm9vcEFuaW1hdGlvbnM9UHQoKTtfYXZhdGFycztfaWNvbnM7c2V0IGxpbmVzKGUpe3RoaXMuX2V4cGxpY2l0TGluZXM9SWkoZSxudWxsKSx0aGlzLl91cGRhdGVJdGVtTGluZXMoITEpfV9leHBsaWNpdExpbmVzPW51bGw7Z2V0IGRpc2FibGVSaXBwbGUoKXtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8dGhpcy5fZGlzYWJsZVJpcHBsZXx8dGhpcy5fbm9vcEFuaW1hdGlvbnN8fCEhdGhpcy5fbGlzdEJhc2U/LmRpc2FibGVSaXBwbGV9c2V0IGRpc2FibGVSaXBwbGUoZSl7dGhpcy5fZGlzYWJsZVJpcHBsZT1XMShlKX1fZGlzYWJsZVJpcHBsZT0hMTtnZXQgZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWQoKXx8ISF0aGlzLl9saXN0QmFzZT8uZGlzYWJsZWR9c2V0IGRpc2FibGVkKGUpe3RoaXMuX2Rpc2FibGVkLnNldChXMShlKSl9X2Rpc2FibGVkPWZ0KCExKTtfc3Vic2NyaXB0aW9ucz1uZXcgbzE7X3JpcHBsZVJlbmRlcmVyPW51bGw7X2hhc1Vuc2NvcGVkVGV4dENvbnRlbnQ9ITE7cmlwcGxlQ29uZmlnO2dldCByaXBwbGVEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVSaXBwbGV8fCEhdGhpcy5yaXBwbGVDb25maWcuZGlzYWJsZWR9Y29uc3RydWN0b3IoKXtoKEMxKS5sb2FkKEUxKTtsZXQgZT1oKHhyLHtvcHRpb25hbDohMH0pO3RoaXMucmlwcGxlQ29uZmlnPWV8fHt9LHRoaXMuX2hvc3RFbGVtZW50PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCx0aGlzLl9pc0J1dHRvbkVsZW1lbnQ9dGhpcy5faG9zdEVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJidXR0b24iLHRoaXMuX2xpc3RCYXNlJiYhdGhpcy5fbGlzdEJhc2UuX2lzTm9uSW50ZXJhY3RpdmUmJnRoaXMuX2luaXRJbnRlcmFjdGl2ZUxpc3RJdGVtKCksdGhpcy5faXNCdXR0b25FbGVtZW50JiYhdGhpcy5faG9zdEVsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikmJnRoaXMuX2hvc3RFbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsImJ1dHRvbiIpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX21vbml0b3JQcm9qZWN0ZWRMaW5lc0FuZFRpdGxlKCksdGhpcy5fdXBkYXRlSXRlbUxpbmVzKCEwKX1uZ09uRGVzdHJveSgpe3RoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKSx0aGlzLl9yaXBwbGVSZW5kZXJlciE9PW51bGwmJnRoaXMuX3JpcHBsZVJlbmRlcmVyLl9yZW1vdmVUcmlnZ2VyRXZlbnRzKCl9X2hhc0ljb25PckF2YXRhcigpe3JldHVybiEhKHRoaXMuX2F2YXRhcnMubGVuZ3RofHx0aGlzLl9pY29ucy5sZW5ndGgpfV9pbml0SW50ZXJhY3RpdmVMaXN0SXRlbSgpe3RoaXMuX2hvc3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoIm1hdC1tZGMtbGlzdC1pdGVtLWludGVyYWN0aXZlIiksdGhpcy5fcmlwcGxlUmVuZGVyZXI9bmV3IGs2KHRoaXMsdGhpcy5fbmdab25lLHRoaXMuX2hvc3RFbGVtZW50LHRoaXMuX3BsYXRmb3JtLGgoc3QpKSx0aGlzLl9yaXBwbGVSZW5kZXJlci5zZXR1cFRyaWdnZXJFdmVudHModGhpcy5faG9zdEVsZW1lbnQpfV9tb25pdG9yUHJvamVjdGVkTGluZXNBbmRUaXRsZSgpe3RoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e3RoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKEt0KHRoaXMuX2xpbmVzLmNoYW5nZXMsdGhpcy5fdGl0bGVzLmNoYW5nZXMpLnN1YnNjcmliZSgoKT0+dGhpcy5fdXBkYXRlSXRlbUxpbmVzKCExKSkpfSl9X3VwZGF0ZUl0ZW1MaW5lcyhlKXtpZighdGhpcy5fbGluZXN8fCF0aGlzLl90aXRsZXN8fCF0aGlzLl91bnNjb3BlZENvbnRlbnQpcmV0dXJuO2UmJnRoaXMuX2NoZWNrRG9tRm9yVW5zY29wZWRUZXh0Q29udGVudCgpO2xldCBpPXRoaXMuX2V4cGxpY2l0TGluZXM/P3RoaXMuX2luZmVyTGluZXNGcm9tQ29udGVudCgpLGE9dGhpcy5fdW5zY29wZWRDb250ZW50Lm5hdGl2ZUVsZW1lbnQ7aWYodGhpcy5faG9zdEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgibWF0LW1kYy1saXN0LWl0ZW0tc2luZ2xlLWxpbmUiLGk8PTEpLHRoaXMuX2hvc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoIm1kYy1saXN0LWl0ZW0tLXdpdGgtb25lLWxpbmUiLGk8PTEpLHRoaXMuX2hvc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoIm1kYy1saXN0LWl0ZW0tLXdpdGgtdHdvLWxpbmVzIixpPT09MiksdGhpcy5faG9zdEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgibWRjLWxpc3QtaXRlbS0td2l0aC10aHJlZS1saW5lcyIsaT09PTMpLHRoaXMuX2hhc1Vuc2NvcGVkVGV4dENvbnRlbnQpe2xldCByPXRoaXMuX3RpdGxlcy5sZW5ndGg9PT0wJiZpPT09MTthLmNsYXNzTGlzdC50b2dnbGUoIm1kYy1saXN0LWl0ZW1fX3ByaW1hcnktdGV4dCIsciksYS5jbGFzc0xpc3QudG9nZ2xlKCJtZGMtbGlzdC1pdGVtX19zZWNvbmRhcnktdGV4dCIsIXIpfWVsc2UgYS5jbGFzc0xpc3QucmVtb3ZlKCJtZGMtbGlzdC1pdGVtX19wcmltYXJ5LXRleHQiKSxhLmNsYXNzTGlzdC5yZW1vdmUoIm1kYy1saXN0LWl0ZW1fX3NlY29uZGFyeS10ZXh0Iil9X2luZmVyTGluZXNGcm9tQ29udGVudCgpe2xldCBlPXRoaXMuX3RpdGxlcy5sZW5ndGgrdGhpcy5fbGluZXMubGVuZ3RoO3JldHVybiB0aGlzLl9oYXNVbnNjb3BlZFRleHRDb250ZW50JiYoZSs9MSksZX1fY2hlY2tEb21Gb3JVbnNjb3BlZFRleHRDb250ZW50KCl7dGhpcy5faGFzVW5zY29wZWRUZXh0Q29udGVudD1BcnJheS5mcm9tKHRoaXMuX3Vuc2NvcGVkQ29udGVudC5uYXRpdmVFbGVtZW50LmNoaWxkTm9kZXMpLmZpbHRlcihlPT5lLm5vZGVUeXBlIT09ZS5DT01NRU5UX05PREUpLnNvbWUoZT0+ISEoZS50ZXh0Q29udGVudCYmZS50ZXh0Q29udGVudC50cmltKCkpKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LGNvbnRlbnRRdWVyaWVzOmZ1bmN0aW9uKGksYSxyKXtpZihpJjEmJihCZShyLGpBLDQpLEJlKHIscUEsNCkpLGkmMil7bGV0IG87RihvPUIoKSkmJihhLl9hdmF0YXJzPW8pLEYobz1CKCkpJiYoYS5faWNvbnM9byl9fSxob3N0VmFyczo0LGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmKEcoImFyaWEtZGlzYWJsZWQiLGEuZGlzYWJsZWQpKCJkaXNhYmxlZCIsYS5faXNCdXR0b25FbGVtZW50JiZhLmRpc2FibGVkfHxudWxsKSxpZSgibWRjLWxpc3QtaXRlbS0tZGlzYWJsZWQiLGEuZGlzYWJsZWQpKX0saW5wdXRzOntsaW5lczoibGluZXMiLGRpc2FibGVSaXBwbGU6ImRpc2FibGVSaXBwbGUiLGRpc2FibGVkOiJkaXNhYmxlZCJ9fSl9cmV0dXJuIHR9KSgpLGx1PSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBXQXtfbGluZXM7X3RpdGxlcztfbWV0YTtfdW5zY29wZWRDb250ZW50O19pdGVtVGV4dDtnZXQgYWN0aXZhdGVkKCl7cmV0dXJuIHRoaXMuX2FjdGl2YXRlZH1zZXQgYWN0aXZhdGVkKGUpe3RoaXMuX2FjdGl2YXRlZD1XMShlKX1fYWN0aXZhdGVkPSExO19nZXRBcmlhQ3VycmVudCgpe3JldHVybiB0aGlzLl9ob3N0RWxlbWVudC5ub2RlTmFtZT09PSJBIiYmdGhpcy5fYWN0aXZhdGVkPyJwYWdlIjpudWxsfV9oYXNCb3RoTGVhZGluZ0FuZFRyYWlsaW5nKCl7cmV0dXJuIHRoaXMuX21ldGEubGVuZ3RoIT09MCYmKHRoaXMuX2F2YXRhcnMubGVuZ3RoIT09MHx8dGhpcy5faWNvbnMubGVuZ3RoIT09MCl9c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgZTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuKGV8fChlPWt0KHQpKSkoYXx8dCl9fSkoKTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LWxpc3QtaXRlbSJdLFsiYSIsIm1hdC1saXN0LWl0ZW0iLCIiXSxbImJ1dHRvbiIsIm1hdC1saXN0LWl0ZW0iLCIiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24oaSxhLHIpe2lmKGkmMSYmKEJlKHIsQkEsNSksQmUocixGQSw1KSxCZShyLFVBLDUpKSxpJjIpe2xldCBvO0Yobz1CKCkpJiYoYS5fbGluZXM9byksRihvPUIoKSkmJihhLl90aXRsZXM9byksRihvPUIoKSkmJihhLl9tZXRhPW8pfX0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiYodGUoVkEsNSksdGUoT0EsNSkpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLl91bnNjb3BlZENvbnRlbnQ9ci5maXJzdCksRihyPUIoKSkmJihhLl9pdGVtVGV4dD1yLmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LW1kYy1saXN0LWl0ZW0iLCJtZGMtbGlzdC1pdGVtIl0saG9zdFZhcnM6MTMsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGksYSl7aSYyJiYoRygiYXJpYS1jdXJyZW50IixhLl9nZXRBcmlhQ3VycmVudCgpKSxpZSgibWRjLWxpc3QtaXRlbS0tYWN0aXZhdGVkIixhLmFjdGl2YXRlZCkoIm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1hdmF0YXIiLGEuX2F2YXRhcnMubGVuZ3RoIT09MCkoIm1kYy1saXN0LWl0ZW0tLXdpdGgtbGVhZGluZy1pY29uIixhLl9pY29ucy5sZW5ndGghPT0wKSgibWRjLWxpc3QtaXRlbS0td2l0aC10cmFpbGluZy1tZXRhIixhLl9tZXRhLmxlbmd0aCE9PTApKCJtYXQtbWRjLWxpc3QtaXRlbS1ib3RoLWxlYWRpbmctYW5kLXRyYWlsaW5nIixhLl9oYXNCb3RoTGVhZGluZ0FuZFRyYWlsaW5nKCkpKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsYS5fbm9vcEFuaW1hdGlvbnMpKX0saW5wdXRzOnthY3RpdmF0ZWQ6ImFjdGl2YXRlZCJ9LGV4cG9ydEFzOlsibWF0TGlzdEl0ZW0iXSxmZWF0dXJlczpbRmVdLG5nQ29udGVudFNlbGVjdG9yczpOQSxkZWNsczoxMCx2YXJzOjAsY29uc3RzOltbInVuc2NvcGVkQ29udGVudCIsIiJdLFsxLCJtZGMtbGlzdC1pdGVtX19jb250ZW50Il0sWzEsIm1hdC1tZGMtbGlzdC1pdGVtLXVuc2NvcGVkLWNvbnRlbnQiLDMsImNka09ic2VydmVDb250ZW50Il0sWzEsIm1hdC1mb2N1cy1pbmRpY2F0b3IiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtSZShIQSksbWUoMCksYygxLCJzcGFuIiwxKSxtZSgyLDEpLG1lKDMsMiksYyg0LCJzcGFuIiwyLDApLFMoImNka09ic2VydmVDb250ZW50IixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5fdXBkYXRlSXRlbUxpbmVzKCEwKSl9KSxtZSg2LDMpLHMoKSgpLG1lKDcsNCksbWUoOCw1KSx1KDksImRpdiIsMyl9fSxkZXBlbmRlbmNpZXM6W00wXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCksZHU9KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXQtc3ViaGVhZGVyIiwiIl0sWyIiLCJtYXRTdWJoZWFkZXIiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtbWRjLXN1YmhlYWRlciIsIm1kYy1saXN0LWdyb3VwX19zdWJoZWFkZXIiXX0pfXJldHVybiB0fSkoKSxtdT0oKCk9PntjbGFzcyB0IGV4dGVuZHMgdjh7X2lzTm9uSW50ZXJhY3RpdmU9ITE7c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgZTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuKGV8fChlPWt0KHQpKSkoYXx8dCl9fSkoKTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LW5hdi1saXN0Il1dLGhvc3RBdHRyczpbInJvbGUiLCJuYXZpZ2F0aW9uIiwxLCJtYXQtbWRjLW5hdi1saXN0IiwibWF0LW1kYy1saXN0LWJhc2UiLCJtZGMtbGlzdCJdLGV4cG9ydEFzOlsibWF0TmF2TGlzdCJdLGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6djgsdXNlRXhpc3Rpbmc6dH1dKSxGZV0sbmdDb250ZW50U2VsZWN0b3JzOkxBLGRlY2xzOjEsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoUmUoKSxtZSgwKSl9LHN0eWxlczpbUEFdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxodT0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NW1vZD14ZSh7dHlwZTp0fSk7c3RhdGljIFx1MDI3NWluaj15ZSh7aW1wb3J0czpbZm0semUsdWksTDMsTTNdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gUUEodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImEiLDM1KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLm9uVG9nZ2xlU2lkZW5hdigpKX0pLGMoMSwibWF0LWljb24iKSxtKDIsIiBleGl0X3RvX2FwcCAiKSxzKCksYygzLCJzcGFuIiwxMyksbSg0KSxiKDUsInRyYW5zbGF0ZSIpLHMoKSgpfXQmMiYmKGwoNCksRSgiICIsQyg1LDEsIlRJVExFX0xPR0lOIiksIiAiKSl9ZnVuY3Rpb24gWUEodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImEiLDM2KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gYS5vblRvZ2dsZVNpZGVuYXYoKSxUKGEuZ29Ub1Byb2ZpbGVQYWdlKCkpfSksYygxLCJtYXQtaWNvbiIpLG0oMiwiIGFjY291bnRfY2lyY2xlICIpLHMoKSxjKDMsInNwYW4iLDEzKSxtKDQpLHMoKSgpfWlmKHQmMil7bGV0IGU9digpO2woNCksRSgiICIsZS51c2VyRW1haWwsIiAiKX19ZnVuY3Rpb24gWkEodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImEiLDM3KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLm9uVG9nZ2xlU2lkZW5hdigpKX0pLGMoMSwibWF0LWljb24iKSxtKDIsIiBhY2NvdW50X2JhbGFuY2UgIikscygpLGMoMywic3BhbiIsMTMpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKX10JjImJihsKDQpLEUoIiAiLEMoNSwxLCJBQ0NPVU5USU5HIiksIiAiKSl9ZnVuY3Rpb24gJEEodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsIm1hdC1saXN0LWl0ZW0iLDM4KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLnNob3dPcmRlcnNTdWJtZW51PSFhLnNob3dPcmRlcnNTdWJtZW51KX0pLGMoMSwibWF0LWljb24iKSxtKDIsIiBjaGVja19jaXJjbGVfb3V0bGluZSAiKSxzKCksYygzLCJzcGFuIiwxMyksbSg0KSxiKDUsInRyYW5zbGF0ZSIpLHMoKSxjKDYsIm1hdC1pY29uIiwzOSksbSg3LCIgZXhwYW5kX21vcmUgIikscygpKCl9aWYodCYyKXtsZXQgZT12KCk7bCg0KSxFKCIgIixDKDUsMiwiT1JERVJTX0FORF9QQVlNRU5UIiksIiAiKSxsKDIpLGYoIm5nQ2xhc3MiLGJ0KDQscHUsZS5zaG93T3JkZXJzU3VibWVudSkpfX1mdW5jdGlvbiBLQSh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYSIsNDUpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digyKTtyZXR1cm4gYS5vblRvZ2dsZVNpZGVuYXYoKSxUKGEuc2hvd09yZGVyc1N1Ym1lbnU9IWEuc2hvd09yZGVyc1N1Ym1lbnUpfSksYygxLCJtYXQtaWNvbiIpLG0oMiwiIGFyY2hpdmUgIikscygpLGMoMywic3BhbiIsMTMpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKX10JjImJihsKDQpLEUoIiAiLEMoNSwxLCJMQUJFTF9PUkRFUl9ISVNUT1JZIiksIiAiKSl9ZnVuY3Rpb24gWEEodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImEiLDQ2KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoMik7cmV0dXJuIGEub25Ub2dnbGVTaWRlbmF2KCksVChhLnNob3dPcmRlcnNTdWJtZW51PSFhLnNob3dPcmRlcnNTdWJtZW51KX0pLGMoMSwibWF0LWljb24iKSxtKDIsIiBhdXRvcmVuZXcgIikscygpLGMoMywic3BhbiIsMTMpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKX10JjImJihsKDQpLEUoIiAiLEMoNSwxLCJOQVZfUkVDWUNMRSIpLCIgIikpfWZ1bmN0aW9uIEpBKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJhIiw0NyksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KDIpO3JldHVybiBhLm9uVG9nZ2xlU2lkZW5hdigpLFQoYS5zaG93T3JkZXJzU3VibWVudT0hYS5zaG93T3JkZXJzU3VibWVudSl9KSxjKDEsIm1hdC1pY29uIiksbSgyLCIgbXlfbG9jYXRpb24gIikscygpLGMoMywic3BhbiIsMTMpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKX10JjImJihsKDQpLEUoIiAiLEMoNSwxLCJNWV9TQVZFRF9BRFJFU1NFUyIpLCIgIikpfWZ1bmN0aW9uIGVEKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJhIiw0OCksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KDIpO3JldHVybiBhLm9uVG9nZ2xlU2lkZW5hdigpLFQoYS5zaG93T3JkZXJzU3VibWVudT0hYS5zaG93T3JkZXJzU3VibWVudSl9KSxjKDEsIm1hdC1pY29uIiksbSgyLCIgY3JlZGl0X2NhcmQgIikscygpLGMoMywic3BhbiIsMTMpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKX10JjImJihsKDQpLEUoIiAiLEMoNSwxLCJNWV9QQVlNRU5UX09QVElPTlMiKSwiICIpKX1mdW5jdGlvbiB0RCh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYSIsNDkpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digyKTtyZXR1cm4gYS5vblRvZ2dsZVNpZGVuYXYoKSxUKGEuc2hvd09yZGVyc1N1Ym1lbnU9IWEuc2hvd09yZGVyc1N1Ym1lbnUpfSksYygxLCJtYXQtaWNvbiIpLG0oMiwiIGFjY291bnRfYmFsYW5jZV93YWxsZXQgIikscygpLGMoMywic3BhbiIsMTMpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKX10JjImJihsKDQpLEUoIiAiLEMoNSwxLCJESUdJVEFMX1dBTExFVCIpLCIgIikpfWZ1bmN0aW9uIGlEKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDgpLE0oMSxLQSw2LDMsImEiLDQwKSxNKDIsWEEsNiwzLCJhIiw0MSksdSgzLCJtYXQtZGl2aWRlciIpLE0oNCxKQSw2LDMsImEiLDQyKSxNKDUsZUQsNiwzLCJhIiw0MyksTSg2LHRELDYsMywiYSIsNDQpLHMoKSksdCYyKXtsZXQgZT12KCk7ZigibmdDbGFzcyIsYnQoNixmdSxlLnNob3dPcmRlcnNTdWJtZW51KSksbCgpLHcoZS5pc0xvZ2dlZEluKCk/MTotMSksbCgpLHcoZS5pc0xvZ2dlZEluKCk/MjotMSksbCgyKSx3KGUuaXNMb2dnZWRJbigpPzQ6LTEpLGwoKSx3KGUuaXNMb2dnZWRJbigpPzU6LTEpLGwoKSx3KGUuaXNMb2dnZWRJbigpPzY6LTEpfX1mdW5jdGlvbiBhRCh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwibWF0LWxpc3QtaXRlbSIsNTApLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpO3JldHVybiBUKGEuc2hvd1ByaXZhY3lTdWJtZW51PSFhLnNob3dQcml2YWN5U3VibWVudSl9KSxjKDEsIm1hdC1pY29uIiksbSgyLCIgc2VjdXJpdHkgIikscygpLGMoMywic3BhbiIsMTMpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCksYyg2LCJtYXQtaWNvbiIsMzkpLG0oNywiIGV4cGFuZF9tb3JlICIpLHMoKSgpfWlmKHQmMil7bGV0IGU9digpO2woNCksRSgiICIsQyg1LDIsIlBSSVZBQ1lfQU5EX1NFQ1VSSVRZIiksIiAiKSxsKDIpLGYoIm5nQ2xhc3MiLGJ0KDQscHUsZS5zaG93UHJpdmFjeVN1Ym1lbnUpKX19ZnVuY3Rpb24gbkQodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImEiLDU3KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoMik7cmV0dXJuIGEub25Ub2dnbGVTaWRlbmF2KCksVChhLnNob3dQcml2YWN5U3VibWVudT0hYS5zaG93UHJpdmFjeVN1Ym1lbnUpfSksYygxLCJtYXQtaWNvbiIpLG0oMiwiIGFzc2lnbm1lbnQgIikscygpLGMoMywic3BhbiIsNTgpLG0oNCwiVElUTEVfUFJJVkFDWV9QT0xJQ1kiKSxzKCkoKX19ZnVuY3Rpb24gckQodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImEiLDU5KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoMik7cmV0dXJuIGEub25Ub2dnbGVTaWRlbmF2KCksVChhLnNob3dQcml2YWN5U3VibWVudT0hYS5zaG93UHJpdmFjeVN1Ym1lbnUpfSksYygxLCJtYXQtaWNvbiIpLG0oMiwiIGdldF9hcHAgIikscygpLGMoMywic3BhbiIsNTgpLG0oNCwiVElUTEVfUkVRVUVTVF9EQVRBX0VYUE9SVCIpLHMoKSgpfX1mdW5jdGlvbiBvRCh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYSIsNjApLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digyKTtyZXR1cm4gVChhLmdvVG9EYXRhRXJhc3VyZVBhZ2UoKSl9KSgiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KDIpO3JldHVybiBhLm9uVG9nZ2xlU2lkZW5hdigpLFQoYS5zaG93UHJpdmFjeVN1Ym1lbnU9IWEuc2hvd1ByaXZhY3lTdWJtZW51KX0pLGMoMSwibWF0LWljb24iKSxtKDIsIiBkZWxldGVfZm9yZXZlciAiKSxzKCksYygzLCJzcGFuIiw1OCksbSg0LCJEQVRBX1NVQkpFQ1RfVElUTEUiKSxzKCkoKX19ZnVuY3Rpb24gY0QodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImEiLDYxKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoMik7cmV0dXJuIGEub25Ub2dnbGVTaWRlbmF2KCksVChhLnNob3dQcml2YWN5U3VibWVudT0hYS5zaG93UHJpdmFjeVN1Ym1lbnUpfSksYygxLCJtYXQtaWNvbiIpLG0oMiwiIGVkaXQgIikscygpLGMoMywic3BhbiIsNTgpLG0oNCwiVElUTEVfQ0hBTkdFX1BBU1NXT1JEIikscygpKCl9fWZ1bmN0aW9uIHNEKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJhIiw2MiksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KDIpO3JldHVybiBhLm9uVG9nZ2xlU2lkZW5hdigpLFQoYS5zaG93UHJpdmFjeVN1Ym1lbnU9IWEuc2hvd1ByaXZhY3lTdWJtZW51KX0pLGMoMSwibWF0LWljb24iKSxtKDIsIiBleHBvc3VyZV9wbHVzXzIgIikscygpLGMoMywic3BhbiIsNTgpLG0oNCwiVElUTEVfVFdPX0ZBQ1RPUl9BVVRIX0NPTkZJRyIpLHMoKSgpfX1mdW5jdGlvbiBsRCh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYSIsNjMpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digyKTtyZXR1cm4gYS5vblRvZ2dsZVNpZGVuYXYoKSxUKGEuc2hvd1ByaXZhY3lTdWJtZW51PSFhLnNob3dQcml2YWN5U3VibWVudSl9KSxjKDEsIm1hdC1pY29uIiksbSgyLCIgcGxhY2UgIikscygpLGMoMywic3BhbiIsNTgpLG0oNCwiTEFTVF9MT0dJTl9JUCIpLHMoKSgpfX1mdW5jdGlvbiBkRCh0LG4pe2lmKHQmMSYmKGMoMCwiZGl2Iiw4KSxNKDEsbkQsNSwwLCJhIiw1MSksTSgyLHJELDUsMCwiYSIsNTIpLE0oMyxvRCw1LDAsImEiLDUzKSx1KDQsIm1hdC1kaXZpZGVyIiksTSg1LGNELDUsMCwiYSIsNTQpLE0oNixzRCw1LDAsImEiLDU1KSxNKDcsbEQsNSwwLCJhIiw1NikscygpKSx0JjIpe2xldCBlPXYoKTtmKCJuZ0NsYXNzIixidCg3LGZ1LGUuc2hvd1ByaXZhY3lTdWJtZW51KSksbCgpLHcoZS5pc0xvZ2dlZEluKCk/MTotMSksbCgpLHcoZS5pc0xvZ2dlZEluKCk/MjotMSksbCgpLHcoZS5pc0xvZ2dlZEluKCk/MzotMSksbCgyKSx3KGUuaXNMb2dnZWRJbigpPzU6LTEpLGwoKSx3KGUuaXNMb2dnZWRJbigpPzY6LTEpLGwoKSx3KGUuaXNMb2dnZWRJbigpPzc6LTEpfX1mdW5jdGlvbiBtRCh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYSIsNjQpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpO3JldHVybiBhLm9uVG9nZ2xlU2lkZW5hdigpLFQoYS5sb2dvdXQoKSl9KSxjKDEsIm1hdC1pY29uIiksbSgyLCIgcG93ZXJfc2V0dGluZ3NfbmV3ICIpLHMoKSxjKDMsInNwYW4iLDEzKSxtKDQpLGIoNSwidHJhbnNsYXRlIikscygpKCl9dCYyJiYobCg0KSxFKCIgIixDKDUsMSwiVElUTEVfTE9HT1VUIiksIiAiKSl9ZnVuY3Rpb24gaEQodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImEiLDY1KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLm9uVG9nZ2xlU2lkZW5hdigpKX0pLGMoMSwibWF0LWljb24iKSxtKDIsInNlbnRpbWVudF9kaXNzYXRpc2ZpZWQiKSxzKCksYygzLCJzcGFuIiwxMyksbSg0KSxiKDUsInRyYW5zbGF0ZSIpLHMoKSgpfXQmMiYmKGwoNCksRSgiICIsQyg1LDEsIk5BVl9DT01QTEFJTiIpLCIgIikpfWZ1bmN0aW9uIHBEKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJhIiw2NiksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5vblRvZ2dsZVNpZGVuYXYoKSl9KSxjKDEsIm1hdC1pY29uIiksbSgyLCJjaGF0IikscygpLGMoMywic3BhbiIsMTMpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKX10JjImJihsKDQpLEUoIiAiLEMoNSwxLCJTRUNUSU9OX1NVUFBPUlRfQ0hBVCIpLCIgIikpfWZ1bmN0aW9uIGZEKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJhIiw2NyksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5vblRvZ2dsZVNpZGVuYXYoKSl9KSxjKDEsIm1hdC1pY29uIiksbSgyLCJjYXJkX21lbWJlcnNoaXAiKSxzKCksYygzLCJzcGFuIiwxMyksbSg0KSxiKDUsInRyYW5zbGF0ZSIpLHMoKSgpfXQmMiYmKGwoNCksRSgiICIsQyg1LDEsIkxBQkVMX0RFTFVYRV9NRU1CRVJTSElQIiksIiAiKSl9ZnVuY3Rpb24gdUQodCxuKXt0JjEmJnUoMCwibWF0LWRpdmlkZXIiLDE5KX1mdW5jdGlvbiBnRCh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYSIsNjgpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpO3JldHVybiBUKGEub25Ub2dnbGVTaWRlbmF2KCkpfSksdSgxLCJtYXQtaWNvbiIsNjkpLGMoMiwic3BhbiIsMTMpLG0oMyksYig0LCJ0cmFuc2xhdGUiKSxzKCkoKX10JjImJihsKDMpLEUoIiAiLEMoNCwxLCJUSVRMRV9TQ09SRV9CT0FSRCIpLCIgIikpfWZ1bmN0aW9uIHZEKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJhIiw3MCksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5zdGFydEhhY2tpbmdJbnN0cnVjdG9yKCkpfSksYygxLCJtYXQtaWNvbiIpLG0oMiwic2Nob29sIikscygpLGMoMywic3BhbiIsMTMpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKX10JjImJihsKDQpLEUoIiAiLEMoNSwxLCJCVE5fR0VUVElOR19TVEFSVEVEIiksIiAiKSl9ZnVuY3Rpb24gX0QodCxuKXt0JjEmJihjKDAsImEiLDIyKSx1KDEsIm1hdC1pY29uIiw3MSksYygyLCJzcGFuIiwxMyksbSgzLCIgR2l0SHViICIpLHMoKSgpKX12YXIgcHUsZnUsdXUsZ3U9eCgoKT0+e050KCk7d2EoKTtrKCk7WGEoKTttMygpO3AxKCk7RjEoKTt3aSgpO0sxKCk7Qm4oKTtDMygpO3FpKCk7dmUoKTthMSgpO1coKTtuZSgpO184KCk7TzMoKTtrKCk7bmUoKTtXKCk7dmUoKTtwdT10PT4oe3JvdGF0ZWQ6dH0pLGZ1PXQ9Pih7ZXhwYW5kZWQ6dH0pO3V1PSgoKT0+e2NsYXNzIHR7YWRtaW5pc3RyYXRpb25TZXJ2aWNlPWgoQnIpO2NoYWxsZW5nZVNlcnZpY2U9aChTaSk7bmdab25lPWgocmUpO2lvPWgoamkpO3VzZXJTZXJ2aWNlPWgoQXQpO2Nvb2tpZVNlcnZpY2U9aChadCk7cm91dGVyPWgoeXQpO2NvbmZpZ3VyYXRpb25TZXJ2aWNlPWgoTHQpO2xvZ2luR3VhcmQ9aChWaSk7YXBwbGljYXRpb25OYW1lPSJPV0FTUCBKdWljZSBTaG9wIjtzaG93R2l0SHViTGluaz0hMDt1c2VyRW1haWw9IiI7c2NvcmVCb2FyZFZpc2libGU9ITE7dmVyc2lvbj0iIjtzaG93UHJpdmFjeVN1Ym1lbnU9ITE7c2hvd09yZGVyc1N1Ym1lbnU9ITE7aXNTaG93aW5nPSExO29mZmVyU2NvcmVCb2FyZFR1dG9yaWFsPSExO3NpZGVuYXZUb2dnbGU9bmV3IE47bmdPbkluaXQoKXt0aGlzLmFkbWluaXN0cmF0aW9uU2VydmljZS5nZXRBcHBsaWNhdGlvblZlcnNpb24oKS5zdWJzY3JpYmUoe25leHQ6ZT0+e2UmJih0aGlzLnZlcnNpb249YHYke2V9YCl9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KSx0aGlzLmdldEFwcGxpY2F0aW9uRGV0YWlscygpLHRoaXMuZ2V0U2NvcmVCb2FyZFN0YXR1cygpLGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ0b2tlbiIpP3RoaXMuZ2V0VXNlckRldGFpbHMoKTp0aGlzLnVzZXJFbWFpbD0iIix0aGlzLnVzZXJTZXJ2aWNlLmdldExvZ2dlZEluU3RhdGUoKS5zdWJzY3JpYmUoZT0+e2U/dGhpcy5nZXRVc2VyRGV0YWlscygpOnRoaXMudXNlckVtYWlsPSIifSksdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLmlvLnNvY2tldCgpLm9uKCJjaGFsbGVuZ2Ugc29sdmVkIixlPT57ZS5rZXk9PT0ic2NvcmVCb2FyZENoYWxsZW5nZSImJih0aGlzLnNjb3JlQm9hcmRWaXNpYmxlPSEwKX0pfSl9aXNMb2dnZWRJbigpe3JldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidG9rZW4iKX1sb2dvdXQoKXt0aGlzLnVzZXJTZXJ2aWNlLnNhdmVMYXN0TG9naW5JcCgpLnN1YnNjcmliZSh7bmV4dDooKT0+e3RoaXMubm9vcCgpfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSksbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oInRva2VuIiksdGhpcy5jb29raWVTZXJ2aWNlLnJlbW92ZSgidG9rZW4iKSxzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCJiaWQiKSxzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCJpdGVtVG90YWwiKSx0aGlzLnVzZXJTZXJ2aWNlLmlzTG9nZ2VkSW4ubmV4dCghMSksdGhpcy5uZ1pvbmUucnVuKCgpPT5QZSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMucm91dGVyLm5hdmlnYXRlKFsiLyJdKX0pKX1nb1RvUHJvZmlsZVBhZ2UoKXt3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh1ZS5ob3N0U2VydmVyKyIvcHJvZmlsZSIpfWdvVG9EYXRhRXJhc3VyZVBhZ2UoKXt3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh1ZS5ob3N0U2VydmVyKyIvZGF0YWVyYXN1cmUiKX1ub29wKCl7fWdldFNjb3JlQm9hcmRTdGF0dXMoKXt0aGlzLmNoYWxsZW5nZVNlcnZpY2UuZmluZCh7bmFtZToiU2NvcmUgQm9hcmQifSkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLm5nWm9uZS5ydW4oKCk9Pnt0aGlzLnNjb3JlQm9hcmRWaXNpYmxlPWVbMF0uc29sdmVkfSl9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KX1nZXRVc2VyRGV0YWlscygpe3RoaXMudXNlclNlcnZpY2Uud2hvQW1JKFsiZW1haWwiXSkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLnVzZXJFbWFpbD1lLmVtYWlsfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSl9b25Ub2dnbGVTaWRlbmF2PSgpPT57dGhpcy5zaWRlbmF2VG9nZ2xlLmVtaXQoKX07Z2V0QXBwbGljYXRpb25EZXRhaWxzKCl7dGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5nZXRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb24oKS5zdWJzY3JpYmUoe25leHQ6ZT0+e2U/LmFwcGxpY2F0aW9uPy5uYW1lJiYodGhpcy5hcHBsaWNhdGlvbk5hbWU9ZS5hcHBsaWNhdGlvbi5uYW1lKSxlPy5hcHBsaWNhdGlvbiYmKHRoaXMuc2hvd0dpdEh1Ykxpbms9ZS5hcHBsaWNhdGlvbi5zaG93R2l0SHViTGlua3MpLGU/LmFwcGxpY2F0aW9uLndlbGNvbWVCYW5uZXIuc2hvd09uRmlyc3RTdGFydCYmZS5oYWNraW5nSW5zdHJ1Y3Rvci5pc0VuYWJsZWQmJih0aGlzLm9mZmVyU2NvcmVCb2FyZFR1dG9yaWFsPWUuYXBwbGljYXRpb24ud2VsY29tZUJhbm5lci5zaG93T25GaXJzdFN0YXJ0JiZlLmhhY2tpbmdJbnN0cnVjdG9yLmlzRW5hYmxlZCl9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KX1pc0FjY291bnRpbmcoKXtyZXR1cm4gdGhpcy5sb2dpbkd1YXJkLnRva2VuRGVjb2RlKCk/LmRhdGE/LnJvbGU9PT10bi5hY2NvdW50aW5nfXN0YXJ0SGFja2luZ0luc3RydWN0b3IoKXt0aGlzLm9uVG9nZ2xlU2lkZW5hdigpLGNvbnNvbGUubG9nKCdTdGFydGluZyBpbnN0cnVjdGlvbnMgZm9yIGNoYWxsZW5nZSAiU2NvcmUgQm9hcmQiJyksaW1wb3J0KCIuL2hhY2tpbmctaW5zdHJ1Y3Rvci1PWVVLQ0RHRy5qcyIpLnRoZW4oZT0+e2Uuc3RhcnRIYWNraW5nSW5zdHJ1Y3RvckZvcigiU2NvcmUgQm9hcmQiKX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbInNpZGVuYXYiXV0sb3V0cHV0czp7c2lkZW5hdlRvZ2dsZToic2lkZW5hdlRvZ2dsZSJ9LGRlY2xzOjcyLHZhcnM6MjcsY29uc3RzOltbImNvbG9yIiwicHJpbWFyeSIsMSwibWF0LWVsZXZhdGlvbi16NiJdLFsibWF0LWJ1dHRvbiIsIiIsMSwiYXV0by1mb2N1cy1hYnNvcmIiXSxbIm1hdC1zdWJoZWFkZXIiLCIiLCJ0cmFuc2xhdGUiLCIiLDEsInNpZGUtc3ViSGVhZGVyIiwic2hvdy1sdC1tZC1vbmx5Il0sWzEsInNob3ctbHQtbWQtb25seSJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCIvbG9naW4iLCJhcmlhLWxhYmVsIiwiR28gdG8gbG9naW4gcGFnZSJdLFsibWF0LWxpc3QtaXRlbSIsIiIsImFyaWEtbGFiZWwiLCJHbyB0byB1c2VyIHByb2ZpbGUiXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwiL2FjY291bnRpbmciLCJhcmlhLWxhYmVsIiwiR28gdG8gYWNjb3VudGluZyBwYWdlIl0sWyJhcmlhLWxhYmVsIiwiU2hvdyBPcmRlcnMgYW5kIFBheW1lbnQgTWVudSIsMSwicGFyZW50Il0sWzEsInN1Ym1lbnUiLDMsIm5nQ2xhc3MiXSxbImFyaWEtbGFiZWwiLCJTaG93IFByaXZhY3kgYW5kIFNlY3VyaXR5IE1lbnUiLDEsInBhcmVudCJdLFsibWF0LWxpc3QtaXRlbSIsIiIsImFyaWEtbGFiZWwiLCJMb2dvdXQiXSxbIm1hdC1zdWJoZWFkZXIiLCIiLCJ0cmFuc2xhdGUiLCIiLDEsInNpZGUtc3ViSGVhZGVyIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwicm91dGVyTGluayIsIi9jb250YWN0IiwiYXJpYS1sYWJlbCIsIkdvIHRvIGNvbnRhY3QgdXMgcGFnZSIsMywiY2xpY2siXSxbMSwibWVudS10ZXh0IiwidHJ1bmNhdGUiXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwiL2NvbXBsYWluIiwiYXJpYS1sYWJlbCIsIkdvIHRvIGNvbXBsYWluIHBhZ2UiXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwiL2NoYXRib3QiLCJhcmlhLWxhYmVsIiwiR28gdG8gY2hhdGJvdCBwYWdlIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwicm91dGVyTGluayIsIi9hYm91dCIsImFyaWEtbGFiZWwiLCJHbyB0byBhYm91dCB1cyBwYWdlIiwzLCJjbGljayJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCIvcGhvdG8td2FsbCIsImFyaWEtbGFiZWwiLCJHbyB0byBwaG90byB3YWxsIiwzLCJjbGljayJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCIvZGVsdXhlLW1lbWJlcnNoaXAiLCJhcmlhLWxhYmVsIiwiR28gdG8gZGVsdXhlIG1lbWJlcnNoaXAgcGFnZSJdLFsxLCJkaXZpZGVyLXNwYWNpbmciXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwiL3Njb3JlLWJvYXJkIiwiYXJpYS1sYWJlbCIsIk9wZW4gc2NvcmUtYm9hcmQiXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJhcmlhLWxhYmVsIiwiTGF1bmNoIGJlZ2lubmVycyB0dXRvcmlhbCJdLFsibWF0LWxpc3QtaXRlbSIsIiIsImhyZWYiLCIuL3JlZGlyZWN0P3RvPWh0dHBzOi8vZ2l0aHViLmNvbS9qdWljZS1zaG9wL2p1aWNlLXNob3AiLCJhcmlhLWxhYmVsIiwiR28gdG8gT1dBU1AgSnVpY2UgU2hvcCBHaXRIdWIgcGFnZSJdLFsxLCJhcHBWZXJzaW9uIl0sWzEsImFwcC1uYW1lIl0sWzEsImFwcC12ZXJzaW9uIl0sWzEsInRlY2gtaWNvbnMiXSxbMSwiaWNvbi1hbmd1bGFyIl0sWzEsImljb24taHRtbDUiXSxbMSwiaWNvbi1zYXNzIl0sWzEsImljb24tY3NzMyJdLFsxLCJpY29uLWphdmFzY3JpcHQtYWx0Il0sWzEsImljb24tbm9kZWpzIl0sWzEsImljb24tZGF0YWJhc2UtYWx0MiJdLFsxLCJpY29uLW1vbmdvZGIiXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwiL2xvZ2luIiwiYXJpYS1sYWJlbCIsIkdvIHRvIGxvZ2luIHBhZ2UiLDMsImNsaWNrIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwiYXJpYS1sYWJlbCIsIkdvIHRvIHVzZXIgcHJvZmlsZSIsMywiY2xpY2siXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwiL2FjY291bnRpbmciLCJhcmlhLWxhYmVsIiwiR28gdG8gYWNjb3VudGluZyBwYWdlIiwzLCJjbGljayJdLFsiYXJpYS1sYWJlbCIsIlNob3cgT3JkZXJzIGFuZCBQYXltZW50IE1lbnUiLDEsInBhcmVudCIsMywiY2xpY2siXSxbMSwibWVudS1idXR0b24iLDMsIm5nQ2xhc3MiXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwiL29yZGVyLWhpc3RvcnkiLCJhcmlhLWxhYmVsIiwiR28gdG8gb3JkZXIgaGlzdG9yeSBwYWdlIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwicm91dGVyTGluayIsIi9yZWN5Y2xlIiwiYXJpYS1sYWJlbCIsIkdvIHRvIHJlY3ljbGluZyBwYWdlIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwicm91dGVyTGluayIsIi9hZGRyZXNzL3NhdmVkIiwiYXJpYS1sYWJlbCIsIkdvIHRvIHNhdmVkIGFkZHJlc3MgcGFnZSJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCIvc2F2ZWQtcGF5bWVudC1tZXRob2RzIiwiYXJpYS1sYWJlbCIsIkdvIHRvIHNhdmVkIHBheW1lbnQgbWV0aG9kcyBwYWdlIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwicm91dGVyTGluayIsIi93YWxsZXQiLCJhcmlhLWxhYmVsIiwiR28gdG8gd2FsbGV0IHBhZ2UiXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwiL29yZGVyLWhpc3RvcnkiLCJhcmlhLWxhYmVsIiwiR28gdG8gb3JkZXIgaGlzdG9yeSBwYWdlIiwzLCJjbGljayJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCIvcmVjeWNsZSIsImFyaWEtbGFiZWwiLCJHbyB0byByZWN5Y2xpbmcgcGFnZSIsMywiY2xpY2siXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwiL2FkZHJlc3Mvc2F2ZWQiLCJhcmlhLWxhYmVsIiwiR28gdG8gc2F2ZWQgYWRkcmVzcyBwYWdlIiwzLCJjbGljayJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCIvc2F2ZWQtcGF5bWVudC1tZXRob2RzIiwiYXJpYS1sYWJlbCIsIkdvIHRvIHNhdmVkIHBheW1lbnQgbWV0aG9kcyBwYWdlIiwzLCJjbGljayJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCIvd2FsbGV0IiwiYXJpYS1sYWJlbCIsIkdvIHRvIHdhbGxldCBwYWdlIiwzLCJjbGljayJdLFsiYXJpYS1sYWJlbCIsIlNob3cgUHJpdmFjeSBhbmQgU2VjdXJpdHkgTWVudSIsMSwicGFyZW50IiwzLCJjbGljayJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCJwcml2YWN5LXNlY3VyaXR5L3ByaXZhY3ktcG9saWN5IiwiYXJpYS1sYWJlbCIsIkdvIHRvIHByaXZhY3kgcG9saWN5IHBhZ2UiXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwicHJpdmFjeS1zZWN1cml0eS9kYXRhLWV4cG9ydCIsImFyaWEtbGFiZWwiLCJHbyB0byBkYXRhIGV4cG9ydCBwYWdlIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwiYXJpYS1sYWJlbCIsIkdvIHRvIGRhdGEgc3ViamVjdCBwYWdlIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwicm91dGVyTGluayIsInByaXZhY3ktc2VjdXJpdHkvY2hhbmdlLXBhc3N3b3JkIiwiYXJpYS1sYWJlbCIsIkdvIHRvIGNoYW5nZSBwYXNzd29yZCBwYWdlIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwicm91dGVyTGluayIsInByaXZhY3ktc2VjdXJpdHkvdHdvLWZhY3Rvci1hdXRoZW50aWNhdGlvbiIsImFyaWEtbGFiZWwiLCJHbyB0byB0d28gZmFjdG9yIGF1dGhlbnRpY2F0aW9uIHBhZ2UiXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJyb3V0ZXJMaW5rIiwicHJpdmFjeS1zZWN1cml0eS9sYXN0LWxvZ2luLWlwIiwiYXJpYS1sYWJlbCIsIkdvIHRvIGxhc3QgbG9naW4gaXAgcGFnZSJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCJwcml2YWN5LXNlY3VyaXR5L3ByaXZhY3ktcG9saWN5IiwiYXJpYS1sYWJlbCIsIkdvIHRvIHByaXZhY3kgcG9saWN5IHBhZ2UiLDMsImNsaWNrIl0sWyJ0cmFuc2xhdGUiLCIiLDEsIm1lbnUtdGV4dCIsInRydW5jYXRlIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwicm91dGVyTGluayIsInByaXZhY3ktc2VjdXJpdHkvZGF0YS1leHBvcnQiLCJhcmlhLWxhYmVsIiwiR28gdG8gZGF0YSBleHBvcnQgcGFnZSIsMywiY2xpY2siXSxbIm1hdC1saXN0LWl0ZW0iLCIiLCJhcmlhLWxhYmVsIiwiR28gdG8gZGF0YSBzdWJqZWN0IHBhZ2UiLDMsImNsaWNrIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwicm91dGVyTGluayIsInByaXZhY3ktc2VjdXJpdHkvY2hhbmdlLXBhc3N3b3JkIiwiYXJpYS1sYWJlbCIsIkdvIHRvIGNoYW5nZSBwYXNzd29yZCBwYWdlIiwzLCJjbGljayJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCJwcml2YWN5LXNlY3VyaXR5L3R3by1mYWN0b3ItYXV0aGVudGljYXRpb24iLCJhcmlhLWxhYmVsIiwiR28gdG8gdHdvIGZhY3RvciBhdXRoZW50aWNhdGlvbiBwYWdlIiwzLCJjbGljayJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCJwcml2YWN5LXNlY3VyaXR5L2xhc3QtbG9naW4taXAiLCJhcmlhLWxhYmVsIiwiR28gdG8gbGFzdCBsb2dpbiBpcCBwYWdlIiwzLCJjbGljayJdLFsibWF0LWxpc3QtaXRlbSIsIiIsImFyaWEtbGFiZWwiLCJMb2dvdXQiLDMsImNsaWNrIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwicm91dGVyTGluayIsIi9jb21wbGFpbiIsImFyaWEtbGFiZWwiLCJHbyB0byBjb21wbGFpbiBwYWdlIiwzLCJjbGljayJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCIvY2hhdGJvdCIsImFyaWEtbGFiZWwiLCJHbyB0byBjaGF0Ym90IHBhZ2UiLDMsImNsaWNrIl0sWyJtYXQtbGlzdC1pdGVtIiwiIiwicm91dGVyTGluayIsIi9kZWx1eGUtbWVtYmVyc2hpcCIsImFyaWEtbGFiZWwiLCJHbyB0byBkZWx1eGUgbWVtYmVyc2hpcCBwYWdlIiwzLCJjbGljayJdLFsibWF0LWxpc3QtaXRlbSIsIiIsInJvdXRlckxpbmsiLCIvc2NvcmUtYm9hcmQiLCJhcmlhLWxhYmVsIiwiT3BlbiBzY29yZS1ib2FyZCIsMywiY2xpY2siXSxbIm1hdExpc3RJY29uIiwiIiwxLCJmYXMiLCJmYS10cm9waHkiLCJmYS1sZyJdLFsibWF0LWxpc3QtaXRlbSIsIiIsImFyaWEtbGFiZWwiLCJMYXVuY2ggYmVnaW5uZXJzIHR1dG9yaWFsIiwzLCJjbGljayJdLFsibWF0TGlzdEljb24iLCIiLDEsImZhYiIsImZhLWdpdGh1YiIsImZhLWxnIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYXQtdG9vbGJhciIsMCkoMSwibWF0LXRvb2xiYXItcm93IikoMiwiaDIiKSxtKDMpLHMoKSgpKCksYyg0LCJtYXQtbmF2LWxpc3QiKSx1KDUsImJ1dHRvbiIsMSksYyg2LCJoMyIsMiksbSg3LCJBQ0NPVU5UIikscygpLGMoOCwiZGl2IiwzKSxNKDksUUEsNiwzLCJhIiw0KSxNKDEwLFlBLDUsMSwiYSIsNSksTSgxMSxaQSw2LDMsImEiLDYpLE0oMTIsJEEsOCw2LCJtYXQtbGlzdC1pdGVtIiw3KSxNKDEzLGlELDcsOCwiZGl2Iiw4KSxNKDE0LGFELDgsNiwibWF0LWxpc3QtaXRlbSIsOSksTSgxNSxkRCw4LDksImRpdiIsOCksTSgxNixtRCw2LDMsImEiLDEwKSxzKCksdSgxNywibWF0LWRpdmlkZXIiLDMpLGMoMTgsImgzIiwxMSksbSgxOSwiVElUTEVfQ09OVEFDVCIpLHMoKSxjKDIwLCJhIiwxMiksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIGEub25Ub2dnbGVTaWRlbmF2KCl9KSxjKDIxLCJtYXQtaWNvbiIpLG0oMjIsImZlZWRiYWNrIikscygpLGMoMjMsInNwYW4iLDEzKSxtKDI0KSxiKDI1LCJ0cmFuc2xhdGUiKSxzKCkoKSxNKDI2LGhELDYsMywiYSIsMTQpLE0oMjcscEQsNiwzLCJhIiwxNSksdSgyOCwibWF0LWRpdmlkZXIiKSxjKDI5LCJoMyIsMTEpLG0oMzAsIkNPTVBBTlkiKSxzKCksYygzMSwiYSIsMTYpLFMoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiBhLm9uVG9nZ2xlU2lkZW5hdigpfSksYygzMiwibWF0LWljb24iKSxtKDMzLCJidXNpbmVzc19jZW50ZXIiKSxzKCksYygzNCwic3BhbiIsMTMpLG0oMzUpLGIoMzYsInRyYW5zbGF0ZSIpLHMoKSgpLGMoMzcsImEiLDE3KSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4gYS5vblRvZ2dsZVNpZGVuYXYoKX0pLGMoMzgsIm1hdC1pY29uIiksbSgzOSwiY2FtZXJhIikscygpLGMoNDAsInNwYW4iLDEzKSxtKDQxKSxiKDQyLCJ0cmFuc2xhdGUiKSxzKCkoKSxNKDQzLGZELDYsMywiYSIsMTgpLE0oNDQsdUQsMSwwLCJtYXQtZGl2aWRlciIsMTkpLE0oNDUsZ0QsNSwzLCJhIiwyMCksTSg0Nix2RCw2LDMsImEiLDIxKSxNKDQ3LF9ELDQsMCwiYSIsMjIpLHMoKSxjKDQ4LCJkaXYiLDIzKSg0OSwic3BhbiIpKDUwLCJzcGFuIiwyNCksbSg1MSkscygpLHUoNTIsImJyIiksYyg1Mywic3BhbiIsMjUpLG0oNTQpLHMoKSx1KDU1LCJiciIpLGMoNTYsImRpdiIsMjYpLHUoNTcsImkiLDI3KSxtKDU4LCJceEEwICIpLHUoNTksImkiLDI4KSxtKDYwLCJceEEwICIpLHUoNjEsImkiLDI5KSxtKDYyLCJceEEwICIpLHUoNjMsImkiLDMwKSxtKDY0LCJceEEwICIpLHUoNjUsImkiLDMxKSxtKDY2LCJceEEwICIpLHUoNjcsImkiLDMyKSxtKDY4LCJceEEwICIpLHUoNjksImkiLDMzKSxtKDcwLCJceEEwICIpLHUoNzEsImkiLDM0KSxzKCkoKSgpKSxpJjImJihsKDMpLEUoIiAiLGEuYXBwbGljYXRpb25OYW1lKSxsKDYpLHcoYS5pc0xvZ2dlZEluKCk/LTE6OSksbCgpLHcoYS5pc0xvZ2dlZEluKCk/MTA6LTEpLGwoKSx3KGEuaXNMb2dnZWRJbigpJiZhLmlzQWNjb3VudGluZygpPzExOi0xKSxsKCksdyhhLmlzTG9nZ2VkSW4oKT8xMjotMSksbCgpLHcoYS5zaG93T3JkZXJzU3VibWVudT8xMzotMSksbCgpLHcoYS5pc0xvZ2dlZEluKCk/MTQ6LTEpLGwoKSx3KGEuc2hvd1ByaXZhY3lTdWJtZW51PzE1Oi0xKSxsKCksdyhhLmlzTG9nZ2VkSW4oKT8xNjotMSksbCg4KSxFKCIgIixDKDI1LDIxLCJTRUNUSU9OX0NVU1RPTUVSX0ZFRURCQUNLIiksIiAiKSxsKDIpLHcoYS5pc0xvZ2dlZEluKCk/MjY6LTEpLGwoKSx3KGEuaXNMb2dnZWRJbigpPzI3Oi0xKSxsKDgpLEUoIiAiLEMoMzYsMjMsIlRJVExFX0FCT1VUIiksIiAiKSxsKDYpLEUoIiAiLEMoNDIsMjUsIkxBQkVMX1BIT1RPX1dBTEwiKSwiICIpLGwoMiksdyhhLmlzTG9nZ2VkSW4oKT80MzotMSksbCgpLHcoYS5zY29yZUJvYXJkVmlzaWJsZXx8YS5zaG93R2l0SHViTGluaz80NDotMSksbCgpLHcoYS5zY29yZUJvYXJkVmlzaWJsZT80NTotMSksbCgpLHcoIWEuc2NvcmVCb2FyZFZpc2libGUmJmEub2ZmZXJTY29yZUJvYXJkVHV0b3JpYWw/NDY6LTEpLGwoKSx3KGEuc2hvd0dpdEh1Ykxpbms/NDc6LTEpLGwoNCksQShhLmFwcGxpY2F0aW9uTmFtZSksbCgzKSxBKGEudmVyc2lvbikpfSxkZXBlbmRlbmNpZXM6W1YzLGI0LG11LG9lLGxlLGR1LFksU2UsbHUsbTIsZ2UsQ2UsVDEsQTEsS10sc3R5bGVzOltgbWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4O2hlaWdodDphdXRvO21pbi13aWR0aDoxMDAlO3BhZGRpbmctYm90dG9tOi4yNXJlbTt3aWR0aDoxMDAlfWFbX25nY29udGVudC0lQ09NUCVde3RleHQtZGVjb3JhdGlvbjpub25lIWltcG9ydGFudH0ubWVudS10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweDtwYWRkaW5nLWxlZnQ6LjYyNXJlbX0ubWF0LW1kYy1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1kYy1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1kYy1saXN0LWl0ZW0taWNvbltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzowIWltcG9ydGFudH0ubWF0LW1kYy1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgICAubWRjLWxpc3QtaXRlbV9fcHJpbWFyeS10ZXh0e2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7cGFkZGluZzowIDFyZW19LnRvb2xiYXItdGl0bGVbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDFyZW19Lm1hdC1tZGMtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweDtmb250LXdlaWdodDo5MDA7bWFyZ2luLWxlZnQ6MS4yNXJlbTttYXJnaW4tdG9wOi42MjVyZW19LmFwcC1uYXYtbGlzdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAuNjI1cmVtfS5zaWRlLXN1YkhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6MzAwfW1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTozcmVtfS5tZW51LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2l0aW9uOi4zcyBlYXNlLWluLW91dH0ubWVudS1idXR0b24ucm90YXRlZFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfS5zdWJtZW51W19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdy15OmhpZGRlbjtwYWRkaW5nLWxlZnQ6MnJlbTt0cmFuc2Zvcm06c2NhbGVZKDApO3RyYW5zZm9ybS1vcmlnaW46dG9wO3RyYW5zaXRpb246dHJhbnNmb3JtIC4zcyBlYXNlfS5zdWJtZW51LmV4cGFuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06c2NhbGVZKDEpfS5hcHBWZXJzaW9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjEuMjVyZW07bWFyZ2luLXRvcDoxLjI1cmVtO3RleHQtYWxpZ246Y2VudGVyfS50cnVuY2F0ZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS5zaG93LWx0LW1kLW9ubHlbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9QG1lZGlhIChtYXgtd2lkdGg6IDk1OS45OHB4KXsuc2hvdy1sdC1tZC1vbmx5W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrIWltcG9ydGFudH19LmF1dG8tZm9jdXMtYWJzb3JiW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZX0uZGl2aWRlci1zcGFjaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOi42MjVyZW19LmFwcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0uYXBwLXZlcnNpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS50ZWNoLWljb25zW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi42MjVyZW19CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIHhEKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJkaXYiLDEpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpO3JldHVybiBUKGEuX29uQmFja2Ryb3BDbGlja2VkKCkpfSkscygpfWlmKHQmMil7bGV0IGU9digpO2llKCJtYXQtZHJhd2VyLXNob3duIixlLl9pc1Nob3dpbmdCYWNrZHJvcCgpKX19ZnVuY3Rpb24gTUQodCxuKXt0JjEmJihjKDAsIm1hdC1kcmF3ZXItY29udGVudCIpLG1lKDEsMikscygpKX1mdW5jdGlvbiBrRCh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiZGl2IiwxKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLl9vbkJhY2tkcm9wQ2xpY2tlZCgpKX0pLHMoKX1pZih0JjIpe2xldCBlPXYoKTtpZSgibWF0LWRyYXdlci1zaG93biIsZS5faXNTaG93aW5nQmFja2Ryb3AoKSl9fWZ1bmN0aW9uIHpEKHQsbil7dCYxJiYoYygwLCJtYXQtc2lkZW5hdi1jb250ZW50IiksbWUoMSwyKSxzKCkpfWZ1bmN0aW9uIEFEKCl7cmV0dXJuITF9dmFyIE4zLGJELENELHlELHdELFNELFRELEVELHk4LEgzLGI4LEM4LHZ1LHg4LF91LGJ1LE04PXgoKCk9Pnt4aSgpO1oyKCk7Z2EoKTtZMigpO3ZhKCk7RDIoKTtrKCk7aygpO1h0KCk7bHQoKTtmaSgpO3kxKCk7TjM9WyIqIl0sYkQ9WyJjb250ZW50Il0sQ0Q9W1tbIm1hdC1kcmF3ZXIiXV0sW1sibWF0LWRyYXdlci1jb250ZW50Il1dLCIqIl0seUQ9WyJtYXQtZHJhd2VyIiwibWF0LWRyYXdlci1jb250ZW50IiwiKiJdO3dEPVtbWyJtYXQtc2lkZW5hdiJdXSxbWyJtYXQtc2lkZW5hdi1jb250ZW50Il1dLCIqIl0sU0Q9WyJtYXQtc2lkZW5hdiIsIm1hdC1zaWRlbmF2LWNvbnRlbnQiLCIqIl07VEQ9YC5tYXQtZHJhd2VyLWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjE7Y29sb3I6dmFyKC0tbWF0LXNpZGVuYXYtY29udGVudC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLWJhY2tncm91bmQpKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRlbnQtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tbWF0LXN5cy1iYWNrZ3JvdW5kKSk7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6aGlkZGVufS5tYXQtZHJhd2VyLWNvbnRhaW5lcltmdWxsc2NyZWVuXXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZX0ubWF0LWRyYXdlci1jb250YWluZXJbZnVsbHNjcmVlbl0ubWF0LWRyYXdlci1jb250YWluZXItaGFzLW9wZW57b3ZlcmZsb3c6aGlkZGVufS5tYXQtZHJhd2VyLWNvbnRhaW5lci5tYXQtZHJhd2VyLWNvbnRhaW5lci1leHBsaWNpdC1iYWNrZHJvcCAubWF0LWRyYXdlci1zaWRle3otaW5kZXg6M30ubWF0LWRyYXdlci1jb250YWluZXIubmctYW5pbWF0ZS1kaXNhYmxlZCAubWF0LWRyYXdlci1iYWNrZHJvcCwubWF0LWRyYXdlci1jb250YWluZXIubmctYW5pbWF0ZS1kaXNhYmxlZCAubWF0LWRyYXdlci1jb250ZW50LC5uZy1hbmltYXRlLWRpc2FibGVkIC5tYXQtZHJhd2VyLWNvbnRhaW5lciAubWF0LWRyYXdlci1iYWNrZHJvcCwubmctYW5pbWF0ZS1kaXNhYmxlZCAubWF0LWRyYXdlci1jb250YWluZXIgLm1hdC1kcmF3ZXItY29udGVudHt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1kcmF3ZXItYmFja2Ryb3B7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jazt6LWluZGV4OjM7dmlzaWJpbGl0eTpoaWRkZW59Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bnt2aXNpYmlsaXR5OnZpc2libGU7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtc2lkZW5hdi1zY3JpbS1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtbmV1dHJhbC12YXJpYW50MjApIDQwJSwgdHJhbnNwYXJlbnQpKX0ubWF0LWRyYXdlci10cmFuc2l0aW9uIC5tYXQtZHJhd2VyLWJhY2tkcm9we3RyYW5zaXRpb24tZHVyYXRpb246NDAwbXM7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7dHJhbnNpdGlvbi1wcm9wZXJ0eTpiYWNrZ3JvdW5kLWNvbG9yLHZpc2liaWxpdHl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1hdC1kcmF3ZXItYmFja2Ryb3B7b3BhY2l0eTouNX19Lm1hdC1kcmF3ZXItY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjE7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTtvdmVyZmxvdzphdXRvfS5tYXQtZHJhd2VyLWNvbnRlbnQubWF0LWRyYXdlci1jb250ZW50LWhpZGRlbntvcGFjaXR5OjB9Lm1hdC1kcmF3ZXItdHJhbnNpdGlvbiAubWF0LWRyYXdlci1jb250ZW50e3RyYW5zaXRpb24tZHVyYXRpb246NDAwbXM7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7dHJhbnNpdGlvbi1wcm9wZXJ0eTp0cmFuc2Zvcm0sbWFyZ2luLWxlZnQsbWFyZ2luLXJpZ2h0fS5tYXQtZHJhd2Vye3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6NDtjb2xvcjp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKTtib3gtc2hhZG93OnZhcigtLW1hdC1zaWRlbmF2LWNvbnRhaW5lci1lbGV2YXRpb24tc2hhZG93LCBub25lKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXN1cmZhY2UpKTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWxhcmdlKSk7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tbWF0LXNpZGVuYXYtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1sYXJnZSkpO3dpZHRoOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRhaW5lci13aWR0aCwgMzYwcHgpO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7ei1pbmRleDozO291dGxpbmU6MDtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3cteTphdXRvO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1hdC1kcmF3ZXIsW2Rpcj1ydGxdIC5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1yaWdodDpzb2xpZCAxcHggY3VycmVudENvbG9yfX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXtbZGlyPXJ0bF0gLm1hdC1kcmF3ZXIsLm1hdC1kcmF3ZXIubWF0LWRyYXdlci1lbmR7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IGN1cnJlbnRDb2xvcjtib3JkZXItcmlnaHQ6bm9uZX19Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1zaWRle3otaW5kZXg6Mn0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLWVuZHtyaWdodDowO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKTtib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItbGFyZ2UpKTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItbGFyZ2UpKTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9W2Rpcj1ydGxdIC5tYXQtZHJhd2Vye2JvcmRlci10b3AtbGVmdC1yYWRpdXM6dmFyKC0tbWF0LXNpZGVuYXYtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1sYXJnZSkpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tbWF0LXNpZGVuYXYtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1sYXJnZSkpO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwgMCwgMCl9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItZW5ke2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItbGFyZ2UpKTtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWxhcmdlKSk7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtsZWZ0OjA7cmlnaHQ6YXV0bzt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApfS5tYXQtZHJhd2VyLXRyYW5zaXRpb24gLm1hdC1kcmF3ZXJ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1kcmF3ZXI6bm90KC5tYXQtZHJhd2VyLW9wZW5lZCk6bm90KC5tYXQtZHJhd2VyLWFuaW1hdGluZyl7dmlzaWJpbGl0eTpoaWRkZW47Ym94LXNoYWRvdzpub25lfS5tYXQtZHJhd2VyOm5vdCgubWF0LWRyYXdlci1vcGVuZWQpOm5vdCgubWF0LWRyYXdlci1hbmltYXRpbmcpIC5tYXQtZHJhd2VyLWlubmVyLWNvbnRhaW5lcntkaXNwbGF5Om5vbmV9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1vcGVuZWQubWF0LWRyYXdlci1vcGVuZWR7dHJhbnNmb3JtOm5vbmV9Lm1hdC1kcmF3ZXItc2lkZXtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLXJpZ2h0LWNvbG9yOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRhaW5lci1kaXZpZGVyLWNvbG9yLCB0cmFuc3BhcmVudCk7Ym9yZGVyLXJpZ2h0LXdpZHRoOjFweDtib3JkZXItcmlnaHQtc3R5bGU6c29saWR9Lm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdC1jb2xvcjp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItZGl2aWRlci1jb2xvciwgdHJhbnNwYXJlbnQpO2JvcmRlci1sZWZ0LXdpZHRoOjFweDtib3JkZXItbGVmdC1zdHlsZTpzb2xpZDtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXItc2lkZXtib3JkZXItbGVmdC1jb2xvcjp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItZGl2aWRlci1jb2xvciwgdHJhbnNwYXJlbnQpO2JvcmRlci1sZWZ0LXdpZHRoOjFweDtib3JkZXItbGVmdC1zdHlsZTpzb2xpZDtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItcmlnaHQtY29sb3I6dmFyKC0tbWF0LXNpZGVuYXYtY29udGFpbmVyLWRpdmlkZXItY29sb3IsIHRyYW5zcGFyZW50KTtib3JkZXItcmlnaHQtd2lkdGg6MXB4O2JvcmRlci1yaWdodC1zdHlsZTpzb2xpZDtib3JkZXItbGVmdDpub25lfS5tYXQtZHJhd2VyLWlubmVyLWNvbnRhaW5lcnt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG99Lm1hdC1zaWRlbmF2LWZpeGVke3Bvc2l0aW9uOmZpeGVkfQpgLEVEPW5ldyBjZSgiTUFUX0RSQVdFUl9ERUZBVUxUX0FVVE9TSVpFIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpBRH0pLHk4PW5ldyBjZSgiTUFUX0RSQVdFUl9DT05UQUlORVIiKTtIMz0oKCk9PntjbGFzcyB0IGV4dGVuZHMgaDJ7X3BsYXRmb3JtPWgoYjEpO19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtfY29udGFpbmVyPWgoQzgpO2NvbnN0cnVjdG9yKCl7bGV0IGU9aChhZSksaT1oKERuKSxhPWgocmUpO3N1cGVyKGUsaSxhKX1uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLl9jb250YWluZXIuX2NvbnRlbnRNYXJnaW5DaGFuZ2VzLnN1YnNjcmliZSgoKT0+e3RoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSl9X3Nob3VsZEJlSGlkZGVuKCl7aWYodGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXJldHVybiExO2xldHtzdGFydDplLGVuZDppfT10aGlzLl9jb250YWluZXI7cmV0dXJuIGUhPW51bGwmJmUubW9kZSE9PSJvdmVyIiYmZS5vcGVuZWR8fGkhPW51bGwmJmkubW9kZSE9PSJvdmVyIiYmaS5vcGVuZWR9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LWRyYXdlci1jb250ZW50Il1dLGhvc3RBdHRyczpbMSwibWF0LWRyYXdlci1jb250ZW50Il0saG9zdFZhcnM6Nixob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJihfdCgibWFyZ2luLWxlZnQiLGEuX2NvbnRhaW5lci5fY29udGVudE1hcmdpbnMubGVmdCwicHgiKSgibWFyZ2luLXJpZ2h0IixhLl9jb250YWluZXIuX2NvbnRlbnRNYXJnaW5zLnJpZ2h0LCJweCIpLGllKCJtYXQtZHJhd2VyLWNvbnRlbnQtaGlkZGVuIixhLl9zaG91bGRCZUhpZGRlbigpKSl9LGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6aDIsdXNlRXhpc3Rpbmc6dH1dKSxGZV0sbmdDb250ZW50U2VsZWN0b3JzOk4zLGRlY2xzOjEsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoUmUoKSxtZSgwKSl9LGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxiOD0oKCk9PntjbGFzcyB0e19lbGVtZW50UmVmPWgoYWUpO19mb2N1c1RyYXBGYWN0b3J5PWgodzApO19mb2N1c01vbml0b3I9aChYMSk7X3BsYXRmb3JtPWgoYjEpO19uZ1pvbmU9aChyZSk7X3JlbmRlcmVyPWgodjEpO19pbnRlcmFjdGl2aXR5Q2hlY2tlcj1oKFFvKTtfZG9jPWgoanQpO19jb250YWluZXI9aCh5OCx7b3B0aW9uYWw6ITB9KTtfZm9jdXNUcmFwPW51bGw7X2VsZW1lbnRGb2N1c2VkQmVmb3JlRHJhd2VyV2FzT3BlbmVkPW51bGw7X2V2ZW50Q2xlYW51cHM7X2lzQXR0YWNoZWQ7X2FuY2hvcjtnZXQgcG9zaXRpb24oKXtyZXR1cm4gdGhpcy5fcG9zaXRpb259c2V0IHBvc2l0aW9uKGUpe2U9ZT09PSJlbmQiPyJlbmQiOiJzdGFydCIsZSE9PXRoaXMuX3Bvc2l0aW9uJiYodGhpcy5faXNBdHRhY2hlZCYmdGhpcy5fdXBkYXRlUG9zaXRpb25JblBhcmVudChlKSx0aGlzLl9wb3NpdGlvbj1lLHRoaXMub25Qb3NpdGlvbkNoYW5nZWQuZW1pdCgpKX1fcG9zaXRpb249InN0YXJ0IjtnZXQgbW9kZSgpe3JldHVybiB0aGlzLl9tb2RlfXNldCBtb2RlKGUpe3RoaXMuX21vZGU9ZSx0aGlzLl91cGRhdGVGb2N1c1RyYXBTdGF0ZSgpLHRoaXMuX21vZGVDaGFuZ2VkLm5leHQoKX1fbW9kZT0ib3ZlciI7Z2V0IGRpc2FibGVDbG9zZSgpe3JldHVybiB0aGlzLl9kaXNhYmxlQ2xvc2V9c2V0IGRpc2FibGVDbG9zZShlKXt0aGlzLl9kaXNhYmxlQ2xvc2U9VzEoZSl9X2Rpc2FibGVDbG9zZT0hMTtnZXQgYXV0b0ZvY3VzKCl7bGV0IGU9dGhpcy5fYXV0b0ZvY3VzO3JldHVybiBlPz8odGhpcy5tb2RlPT09InNpZGUiPyJkaWFsb2ciOiJmaXJzdC10YWJiYWJsZSIpfXNldCBhdXRvRm9jdXMoZSl7KGU9PT0idHJ1ZSJ8fGU9PT0iZmFsc2UifHxlPT1udWxsKSYmKGU9VzEoZSkpLHRoaXMuX2F1dG9Gb2N1cz1lfV9hdXRvRm9jdXM7Z2V0IG9wZW5lZCgpe3JldHVybiB0aGlzLl9vcGVuZWQoKX1zZXQgb3BlbmVkKGUpe3RoaXMudG9nZ2xlKFcxKGUpKX1fb3BlbmVkPWZ0KCExKTtfb3BlbmVkVmlhO19hbmltYXRpb25TdGFydGVkPW5ldyB3ZTtfYW5pbWF0aW9uRW5kPW5ldyB3ZTtvcGVuZWRDaGFuZ2U9bmV3IE4oITApO19vcGVuZWRTdHJlYW09dGhpcy5vcGVuZWRDaGFuZ2UucGlwZSgkdChlPT5lKSxxKCgpPT57fSkpO29wZW5lZFN0YXJ0PXRoaXMuX2FuaW1hdGlvblN0YXJ0ZWQucGlwZSgkdCgoKT0+dGhpcy5vcGVuZWQpLGc2KHZvaWQgMCkpO19jbG9zZWRTdHJlYW09dGhpcy5vcGVuZWRDaGFuZ2UucGlwZSgkdChlPT4hZSkscSgoKT0+e30pKTtjbG9zZWRTdGFydD10aGlzLl9hbmltYXRpb25TdGFydGVkLnBpcGUoJHQoKCk9PiF0aGlzLm9wZW5lZCksZzYodm9pZCAwKSk7X2Rlc3Ryb3llZD1uZXcgd2U7b25Qb3NpdGlvbkNoYW5nZWQ9bmV3IE47X2NvbnRlbnQ7X21vZGVDaGFuZ2VkPW5ldyB3ZTtfaW5qZWN0b3I9aChzdCk7X2NoYW5nZURldGVjdG9yUmVmPWgoRWUpO2NvbnN0cnVjdG9yKCl7dGhpcy5vcGVuZWRDaGFuZ2UucGlwZSh4dCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoZT0+e2U/KHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRHJhd2VyV2FzT3BlbmVkPXRoaXMuX2RvYy5hY3RpdmVFbGVtZW50LHRoaXMuX3Rha2VGb2N1cygpKTp0aGlzLl9pc0ZvY3VzV2l0aGluRHJhd2VyKCkmJnRoaXMuX3Jlc3RvcmVGb2N1cyh0aGlzLl9vcGVuZWRWaWF8fCJwcm9ncmFtIil9KSx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntsZXQgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7TmEoZSwia2V5ZG93biIpLnBpcGUoJHQoaT0+aS5rZXlDb2RlPT09MjcmJiF0aGlzLmRpc2FibGVDbG9zZSYmIXMxKGkpKSx4dCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoaT0+dGhpcy5fbmdab25lLnJ1bigoKT0+e3RoaXMuY2xvc2UoKSxpLnN0b3BQcm9wYWdhdGlvbigpLGkucHJldmVudERlZmF1bHQoKX0pKSx0aGlzLl9ldmVudENsZWFudXBzPVt0aGlzLl9yZW5kZXJlci5saXN0ZW4oZSwidHJhbnNpdGlvbnJ1biIsdGhpcy5faGFuZGxlVHJhbnNpdGlvbkV2ZW50KSx0aGlzLl9yZW5kZXJlci5saXN0ZW4oZSwidHJhbnNpdGlvbmVuZCIsdGhpcy5faGFuZGxlVHJhbnNpdGlvbkV2ZW50KSx0aGlzLl9yZW5kZXJlci5saXN0ZW4oZSwidHJhbnNpdGlvbmNhbmNlbCIsdGhpcy5faGFuZGxlVHJhbnNpdGlvbkV2ZW50KV19KSx0aGlzLl9hbmltYXRpb25FbmQuc3Vic2NyaWJlKCgpPT57dGhpcy5vcGVuZWRDaGFuZ2UuZW1pdCh0aGlzLm9wZW5lZCl9KX1fZm9yY2VGb2N1cyhlLGkpe3RoaXMuX2ludGVyYWN0aXZpdHlDaGVja2VyLmlzRm9jdXNhYmxlKGUpfHwoZS50YWJJbmRleD0tMSx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntsZXQgYT0oKT0+e3IoKSxvKCksZS5yZW1vdmVBdHRyaWJ1dGUoInRhYmluZGV4Iil9LHI9dGhpcy5fcmVuZGVyZXIubGlzdGVuKGUsImJsdXIiLGEpLG89dGhpcy5fcmVuZGVyZXIubGlzdGVuKGUsIm1vdXNlZG93biIsYSl9KSksZS5mb2N1cyhpKX1fZm9jdXNCeUNzc1NlbGVjdG9yKGUsaSl7bGV0IGE9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoZSk7YSYmdGhpcy5fZm9yY2VGb2N1cyhhLGkpfV90YWtlRm9jdXMoKXtpZighdGhpcy5fZm9jdXNUcmFwKXJldHVybjtsZXQgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7c3dpdGNoKHRoaXMuYXV0b0ZvY3VzKXtjYXNlITE6Y2FzZSJkaWFsb2ciOnJldHVybjtjYXNlITA6Y2FzZSJmaXJzdC10YWJiYWJsZSI6bTEoKCk9PnshdGhpcy5fZm9jdXNUcmFwLmZvY3VzSW5pdGlhbEVsZW1lbnQoKSYmdHlwZW9mIGUuZm9jdXM9PSJmdW5jdGlvbiImJmUuZm9jdXMoKX0se2luamVjdG9yOnRoaXMuX2luamVjdG9yfSk7YnJlYWs7Y2FzZSJmaXJzdC1oZWFkaW5nIjp0aGlzLl9mb2N1c0J5Q3NzU2VsZWN0b3IoJ2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIFtyb2xlPSJoZWFkaW5nIl0nKTticmVhaztkZWZhdWx0OnRoaXMuX2ZvY3VzQnlDc3NTZWxlY3Rvcih0aGlzLmF1dG9Gb2N1cyk7YnJlYWt9fV9yZXN0b3JlRm9jdXMoZSl7dGhpcy5hdXRvRm9jdXMhPT0iZGlhbG9nIiYmKHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRHJhd2VyV2FzT3BlbmVkP3RoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9lbGVtZW50Rm9jdXNlZEJlZm9yZURyYXdlcldhc09wZW5lZCxlKTp0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYmx1cigpLHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRHJhd2VyV2FzT3BlbmVkPW51bGwpfV9pc0ZvY3VzV2l0aGluRHJhd2VyKCl7bGV0IGU9dGhpcy5fZG9jLmFjdGl2ZUVsZW1lbnQ7cmV0dXJuISFlJiZ0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZSl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5faXNBdHRhY2hlZD0hMCx0aGlzLl9wb3NpdGlvbj09PSJlbmQiJiZ0aGlzLl91cGRhdGVQb3NpdGlvbkluUGFyZW50KCJlbmQiKSx0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJih0aGlzLl9mb2N1c1RyYXA9dGhpcy5fZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSx0aGlzLl91cGRhdGVGb2N1c1RyYXBTdGF0ZSgpKX1uZ09uRGVzdHJveSgpe3RoaXMuX2V2ZW50Q2xlYW51cHMuZm9yRWFjaChlPT5lKCkpLHRoaXMuX2ZvY3VzVHJhcD8uZGVzdHJveSgpLHRoaXMuX2FuY2hvcj8ucmVtb3ZlKCksdGhpcy5fYW5jaG9yPW51bGwsdGhpcy5fYW5pbWF0aW9uU3RhcnRlZC5jb21wbGV0ZSgpLHRoaXMuX2FuaW1hdGlvbkVuZC5jb21wbGV0ZSgpLHRoaXMuX21vZGVDaGFuZ2VkLmNvbXBsZXRlKCksdGhpcy5fZGVzdHJveWVkLm5leHQoKSx0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKX1vcGVuKGUpe3JldHVybiB0aGlzLnRvZ2dsZSghMCxlKX1jbG9zZSgpe3JldHVybiB0aGlzLnRvZ2dsZSghMSl9X2Nsb3NlVmlhQmFja2Ryb3BDbGljaygpe3JldHVybiB0aGlzLl9zZXRPcGVuKCExLCEwLCJtb3VzZSIpfXRvZ2dsZShlPSF0aGlzLm9wZW5lZCxpKXtlJiZpJiYodGhpcy5fb3BlbmVkVmlhPWkpO2xldCBhPXRoaXMuX3NldE9wZW4oZSwhZSYmdGhpcy5faXNGb2N1c1dpdGhpbkRyYXdlcigpLHRoaXMuX29wZW5lZFZpYXx8InByb2dyYW0iKTtyZXR1cm4gZXx8KHRoaXMuX29wZW5lZFZpYT1udWxsKSxhfV9zZXRPcGVuKGUsaSxhKXtyZXR1cm4gZT09PXRoaXMub3BlbmVkP1Byb21pc2UucmVzb2x2ZShlPyJvcGVuIjoiY2xvc2UiKToodGhpcy5fb3BlbmVkLnNldChlKSx0aGlzLl9jb250YWluZXI/Ll90cmFuc2l0aW9uc0VuYWJsZWQ/dGhpcy5fc2V0SXNBbmltYXRpbmcoITApOnNldFRpbWVvdXQoKCk9Pnt0aGlzLl9hbmltYXRpb25TdGFydGVkLm5leHQoKSx0aGlzLl9hbmltYXRpb25FbmQubmV4dCgpfSksdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoIm1hdC1kcmF3ZXItb3BlbmVkIixlKSwhZSYmaSYmdGhpcy5fcmVzdG9yZUZvY3VzKGEpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpLHRoaXMuX3VwZGF0ZUZvY3VzVHJhcFN0YXRlKCksbmV3IFByb21pc2Uocj0+e3RoaXMub3BlbmVkQ2hhbmdlLnBpcGUoajEoMSkpLnN1YnNjcmliZShvPT5yKG8/Im9wZW4iOiJjbG9zZSIpKX0pKX1fc2V0SXNBbmltYXRpbmcoZSl7dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoIm1hdC1kcmF3ZXItYW5pbWF0aW5nIixlKX1fZ2V0V2lkdGgoKXtyZXR1cm4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRofHwwfV91cGRhdGVGb2N1c1RyYXBTdGF0ZSgpe3RoaXMuX2ZvY3VzVHJhcCYmKHRoaXMuX2ZvY3VzVHJhcC5lbmFibGVkPSEhdGhpcy5fY29udGFpbmVyPy5oYXNCYWNrZHJvcCYmdGhpcy5vcGVuZWQpfV91cGRhdGVQb3NpdGlvbkluUGFyZW50KGUpe2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJuO2xldCBpPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxhPWkucGFyZW50Tm9kZTtlPT09ImVuZCI/KHRoaXMuX2FuY2hvcnx8KHRoaXMuX2FuY2hvcj10aGlzLl9kb2MuY3JlYXRlQ29tbWVudCgibWF0LWRyYXdlci1hbmNob3IiKSxhLmluc2VydEJlZm9yZSh0aGlzLl9hbmNob3IsaSkpLGEuYXBwZW5kQ2hpbGQoaSkpOnRoaXMuX2FuY2hvciYmdGhpcy5fYW5jaG9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGksdGhpcy5fYW5jaG9yKX1faGFuZGxlVHJhbnNpdGlvbkV2ZW50PWU9PntsZXQgaT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7ZS50YXJnZXQ9PT1pJiZ0aGlzLl9uZ1pvbmUucnVuKCgpPT57ZS50eXBlPT09InRyYW5zaXRpb25ydW4iP3RoaXMuX2FuaW1hdGlvblN0YXJ0ZWQubmV4dChlKTooZS50eXBlPT09InRyYW5zaXRpb25lbmQiJiZ0aGlzLl9zZXRJc0FuaW1hdGluZyghMSksdGhpcy5fYW5pbWF0aW9uRW5kLm5leHQoZSkpfSl9O3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1kcmF3ZXIiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiZ0ZShiRCw1KSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5fY29udGVudD1yLmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LWRyYXdlciJdLGhvc3RWYXJzOjEyLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmKEcoImFsaWduIixudWxsKSgidGFiSW5kZXgiLGEubW9kZSE9PSJzaWRlIj8iLTEiOm51bGwpLF90KCJ2aXNpYmlsaXR5IiwhYS5fY29udGFpbmVyJiYhYS5vcGVuZWQ/ImhpZGRlbiI6bnVsbCksaWUoIm1hdC1kcmF3ZXItZW5kIixhLnBvc2l0aW9uPT09ImVuZCIpKCJtYXQtZHJhd2VyLW92ZXIiLGEubW9kZT09PSJvdmVyIikoIm1hdC1kcmF3ZXItcHVzaCIsYS5tb2RlPT09InB1c2giKSgibWF0LWRyYXdlci1zaWRlIixhLm1vZGU9PT0ic2lkZSIpKX0saW5wdXRzOntwb3NpdGlvbjoicG9zaXRpb24iLG1vZGU6Im1vZGUiLGRpc2FibGVDbG9zZToiZGlzYWJsZUNsb3NlIixhdXRvRm9jdXM6ImF1dG9Gb2N1cyIsb3BlbmVkOiJvcGVuZWQifSxvdXRwdXRzOntvcGVuZWRDaGFuZ2U6Im9wZW5lZENoYW5nZSIsX29wZW5lZFN0cmVhbToib3BlbmVkIixvcGVuZWRTdGFydDoib3BlbmVkU3RhcnQiLF9jbG9zZWRTdHJlYW06ImNsb3NlZCIsY2xvc2VkU3RhcnQ6ImNsb3NlZFN0YXJ0IixvblBvc2l0aW9uQ2hhbmdlZDoicG9zaXRpb25DaGFuZ2VkIn0sZXhwb3J0QXM6WyJtYXREcmF3ZXIiXSxuZ0NvbnRlbnRTZWxlY3RvcnM6TjMsZGVjbHM6Myx2YXJzOjAsY29uc3RzOltbImNvbnRlbnQiLCIiXSxbImNka1Njcm9sbGFibGUiLCIiLDEsIm1hdC1kcmF3ZXItaW5uZXItY29udGFpbmVyIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoUmUoKSxjKDAsImRpdiIsMSwwKSxtZSgyKSxzKCkpfSxkZXBlbmRlbmNpZXM6W2gyXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCksQzg9KCgpPT57Y2xhc3MgdHtfZGlyPWgobjEse29wdGlvbmFsOiEwfSk7X2VsZW1lbnQ9aChhZSk7X25nWm9uZT1oKHJlKTtfY2hhbmdlRGV0ZWN0b3JSZWY9aChFZSk7X2FuaW1hdGlvbkRpc2FibGVkPVB0KCk7X3RyYW5zaXRpb25zRW5hYmxlZD0hMTtfYWxsRHJhd2VycztfZHJhd2Vycz1uZXcgRTI7X2NvbnRlbnQ7X3VzZXJDb250ZW50O2dldCBzdGFydCgpe3JldHVybiB0aGlzLl9zdGFydH1nZXQgZW5kKCl7cmV0dXJuIHRoaXMuX2VuZH1nZXQgYXV0b3NpemUoKXtyZXR1cm4gdGhpcy5fYXV0b3NpemV9c2V0IGF1dG9zaXplKGUpe3RoaXMuX2F1dG9zaXplPVcxKGUpfV9hdXRvc2l6ZT1oKEVEKTtnZXQgaGFzQmFja2Ryb3AoKXtyZXR1cm4gdGhpcy5fZHJhd2VySGFzQmFja2Ryb3AodGhpcy5fc3RhcnQpfHx0aGlzLl9kcmF3ZXJIYXNCYWNrZHJvcCh0aGlzLl9lbmQpfXNldCBoYXNCYWNrZHJvcChlKXt0aGlzLl9iYWNrZHJvcE92ZXJyaWRlPWU9PW51bGw/bnVsbDpXMShlKX1fYmFja2Ryb3BPdmVycmlkZTtiYWNrZHJvcENsaWNrPW5ldyBOO19zdGFydDtfZW5kO19sZWZ0O19yaWdodDtfZGVzdHJveWVkPW5ldyB3ZTtfZG9DaGVja1N1YmplY3Q9bmV3IHdlO19jb250ZW50TWFyZ2lucz17bGVmdDpudWxsLHJpZ2h0Om51bGx9O19jb250ZW50TWFyZ2luQ2hhbmdlcz1uZXcgd2U7Z2V0IHNjcm9sbGFibGUoKXtyZXR1cm4gdGhpcy5fdXNlckNvbnRlbnR8fHRoaXMuX2NvbnRlbnR9X2luamVjdG9yPWgoc3QpO2NvbnN0cnVjdG9yKCl7bGV0IGU9aChiMSksaT1oKCQyKTt0aGlzLl9kaXI/LmNoYW5nZS5waXBlKHh0KHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKT0+e3RoaXMuX3ZhbGlkYXRlRHJhd2VycygpLHRoaXMudXBkYXRlQ29udGVudE1hcmdpbnMoKX0pLGkuY2hhbmdlKCkucGlwZSh4dCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCk9PnRoaXMudXBkYXRlQ29udGVudE1hcmdpbnMoKSksIXRoaXMuX2FuaW1hdGlvbkRpc2FibGVkJiZlLmlzQnJvd3NlciYmdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57c2V0VGltZW91dCgoKT0+e3RoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCJtYXQtZHJhd2VyLXRyYW5zaXRpb24iKSx0aGlzLl90cmFuc2l0aW9uc0VuYWJsZWQ9ITB9LDIwMCl9KX1uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLl9hbGxEcmF3ZXJzLmNoYW5nZXMucGlwZShpMSh0aGlzLl9hbGxEcmF3ZXJzKSx4dCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoZT0+e3RoaXMuX2RyYXdlcnMucmVzZXQoZS5maWx0ZXIoaT0+IWkuX2NvbnRhaW5lcnx8aS5fY29udGFpbmVyPT09dGhpcykpLHRoaXMuX2RyYXdlcnMubm90aWZ5T25DaGFuZ2VzKCl9KSx0aGlzLl9kcmF3ZXJzLmNoYW5nZXMucGlwZShpMShudWxsKSkuc3Vic2NyaWJlKCgpPT57dGhpcy5fdmFsaWRhdGVEcmF3ZXJzKCksdGhpcy5fZHJhd2Vycy5mb3JFYWNoKGU9Pnt0aGlzLl93YXRjaERyYXdlclRvZ2dsZShlKSx0aGlzLl93YXRjaERyYXdlclBvc2l0aW9uKGUpLHRoaXMuX3dhdGNoRHJhd2VyTW9kZShlKX0pLCghdGhpcy5fZHJhd2Vycy5sZW5ndGh8fHRoaXMuX2lzRHJhd2VyT3Blbih0aGlzLl9zdGFydCl8fHRoaXMuX2lzRHJhd2VyT3Blbih0aGlzLl9lbmQpKSYmdGhpcy51cGRhdGVDb250ZW50TWFyZ2lucygpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSksdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57dGhpcy5fZG9DaGVja1N1YmplY3QucGlwZShUbigxMCkseHQodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgpPT50aGlzLnVwZGF0ZUNvbnRlbnRNYXJnaW5zKCkpfSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9jb250ZW50TWFyZ2luQ2hhbmdlcy5jb21wbGV0ZSgpLHRoaXMuX2RvQ2hlY2tTdWJqZWN0LmNvbXBsZXRlKCksdGhpcy5fZHJhd2Vycy5kZXN0cm95KCksdGhpcy5fZGVzdHJveWVkLm5leHQoKSx0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKX1vcGVuKCl7dGhpcy5fZHJhd2Vycy5mb3JFYWNoKGU9PmUub3BlbigpKX1jbG9zZSgpe3RoaXMuX2RyYXdlcnMuZm9yRWFjaChlPT5lLmNsb3NlKCkpfXVwZGF0ZUNvbnRlbnRNYXJnaW5zKCl7bGV0IGU9MCxpPTA7aWYodGhpcy5fbGVmdCYmdGhpcy5fbGVmdC5vcGVuZWQpe2lmKHRoaXMuX2xlZnQubW9kZT09InNpZGUiKWUrPXRoaXMuX2xlZnQuX2dldFdpZHRoKCk7ZWxzZSBpZih0aGlzLl9sZWZ0Lm1vZGU9PSJwdXNoIil7bGV0IGE9dGhpcy5fbGVmdC5fZ2V0V2lkdGgoKTtlKz1hLGktPWF9fWlmKHRoaXMuX3JpZ2h0JiZ0aGlzLl9yaWdodC5vcGVuZWQpe2lmKHRoaXMuX3JpZ2h0Lm1vZGU9PSJzaWRlIilpKz10aGlzLl9yaWdodC5fZ2V0V2lkdGgoKTtlbHNlIGlmKHRoaXMuX3JpZ2h0Lm1vZGU9PSJwdXNoIil7bGV0IGE9dGhpcy5fcmlnaHQuX2dldFdpZHRoKCk7aSs9YSxlLT1hfX1lPWV8fG51bGwsaT1pfHxudWxsLChlIT09dGhpcy5fY29udGVudE1hcmdpbnMubGVmdHx8aSE9PXRoaXMuX2NvbnRlbnRNYXJnaW5zLnJpZ2h0KSYmKHRoaXMuX2NvbnRlbnRNYXJnaW5zPXtsZWZ0OmUscmlnaHQ6aX0sdGhpcy5fbmdab25lLnJ1bigoKT0+dGhpcy5fY29udGVudE1hcmdpbkNoYW5nZXMubmV4dCh0aGlzLl9jb250ZW50TWFyZ2lucykpKX1uZ0RvQ2hlY2soKXt0aGlzLl9hdXRvc2l6ZSYmdGhpcy5faXNQdXNoZWQoKSYmdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT50aGlzLl9kb0NoZWNrU3ViamVjdC5uZXh0KCkpfV93YXRjaERyYXdlclRvZ2dsZShlKXtlLl9hbmltYXRpb25TdGFydGVkLnBpcGUoeHQodGhpcy5fZHJhd2Vycy5jaGFuZ2VzKSkuc3Vic2NyaWJlKCgpPT57dGhpcy51cGRhdGVDb250ZW50TWFyZ2lucygpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSksZS5tb2RlIT09InNpZGUiJiZlLm9wZW5lZENoYW5nZS5waXBlKHh0KHRoaXMuX2RyYXdlcnMuY2hhbmdlcykpLnN1YnNjcmliZSgoKT0+dGhpcy5fc2V0Q29udGFpbmVyQ2xhc3MoZS5vcGVuZWQpKX1fd2F0Y2hEcmF3ZXJQb3NpdGlvbihlKXtlLm9uUG9zaXRpb25DaGFuZ2VkLnBpcGUoeHQodGhpcy5fZHJhd2Vycy5jaGFuZ2VzKSkuc3Vic2NyaWJlKCgpPT57bTEoe3JlYWQ6KCk9PnRoaXMuX3ZhbGlkYXRlRHJhd2VycygpfSx7aW5qZWN0b3I6dGhpcy5faW5qZWN0b3J9KX0pfV93YXRjaERyYXdlck1vZGUoZSl7ZS5fbW9kZUNoYW5nZWQucGlwZSh4dChLdCh0aGlzLl9kcmF3ZXJzLmNoYW5nZXMsdGhpcy5fZGVzdHJveWVkKSkpLnN1YnNjcmliZSgoKT0+e3RoaXMudXBkYXRlQ29udGVudE1hcmdpbnMoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pfV9zZXRDb250YWluZXJDbGFzcyhlKXtsZXQgaT10aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LGE9Im1hdC1kcmF3ZXItY29udGFpbmVyLWhhcy1vcGVuIjtlP2kuYWRkKGEpOmkucmVtb3ZlKGEpfV92YWxpZGF0ZURyYXdlcnMoKXt0aGlzLl9zdGFydD10aGlzLl9lbmQ9bnVsbCx0aGlzLl9kcmF3ZXJzLmZvckVhY2goZT0+e2UucG9zaXRpb249PSJlbmQiPyh0aGlzLl9lbmQhPW51bGwsdGhpcy5fZW5kPWUpOih0aGlzLl9zdGFydCE9bnVsbCx0aGlzLl9zdGFydD1lKX0pLHRoaXMuX3JpZ2h0PXRoaXMuX2xlZnQ9bnVsbCx0aGlzLl9kaXImJnRoaXMuX2Rpci52YWx1ZT09PSJydGwiPyh0aGlzLl9sZWZ0PXRoaXMuX2VuZCx0aGlzLl9yaWdodD10aGlzLl9zdGFydCk6KHRoaXMuX2xlZnQ9dGhpcy5fc3RhcnQsdGhpcy5fcmlnaHQ9dGhpcy5fZW5kKX1faXNQdXNoZWQoKXtyZXR1cm4gdGhpcy5faXNEcmF3ZXJPcGVuKHRoaXMuX3N0YXJ0KSYmdGhpcy5fc3RhcnQubW9kZSE9Im92ZXIifHx0aGlzLl9pc0RyYXdlck9wZW4odGhpcy5fZW5kKSYmdGhpcy5fZW5kLm1vZGUhPSJvdmVyIn1fb25CYWNrZHJvcENsaWNrZWQoKXt0aGlzLmJhY2tkcm9wQ2xpY2suZW1pdCgpLHRoaXMuX2Nsb3NlTW9kYWxEcmF3ZXJzVmlhQmFja2Ryb3AoKX1fY2xvc2VNb2RhbERyYXdlcnNWaWFCYWNrZHJvcCgpe1t0aGlzLl9zdGFydCx0aGlzLl9lbmRdLmZpbHRlcihlPT5lJiYhZS5kaXNhYmxlQ2xvc2UmJnRoaXMuX2RyYXdlckhhc0JhY2tkcm9wKGUpKS5mb3JFYWNoKGU9PmUuX2Nsb3NlVmlhQmFja2Ryb3BDbGljaygpKX1faXNTaG93aW5nQmFja2Ryb3AoKXtyZXR1cm4gdGhpcy5faXNEcmF3ZXJPcGVuKHRoaXMuX3N0YXJ0KSYmdGhpcy5fZHJhd2VySGFzQmFja2Ryb3AodGhpcy5fc3RhcnQpfHx0aGlzLl9pc0RyYXdlck9wZW4odGhpcy5fZW5kKSYmdGhpcy5fZHJhd2VySGFzQmFja2Ryb3AodGhpcy5fZW5kKX1faXNEcmF3ZXJPcGVuKGUpe3JldHVybiBlIT1udWxsJiZlLm9wZW5lZH1fZHJhd2VySGFzQmFja2Ryb3AoZSl7cmV0dXJuIHRoaXMuX2JhY2tkcm9wT3ZlcnJpZGU9PW51bGw/ISFlJiZlLm1vZGUhPT0ic2lkZSI6dGhpcy5fYmFja2Ryb3BPdmVycmlkZX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJtYXQtZHJhd2VyLWNvbnRhaW5lciJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbihpLGEscil7aWYoaSYxJiYoQmUocixIMyw1KSxCZShyLGI4LDUpKSxpJjIpe2xldCBvO0Yobz1CKCkpJiYoYS5fY29udGVudD1vLmZpcnN0KSxGKG89QigpKSYmKGEuX2FsbERyYXdlcnM9byl9fSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJnRlKEgzLDUpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLl91c2VyQ29udGVudD1yLmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LWRyYXdlci1jb250YWluZXIiXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmaWUoIm1hdC1kcmF3ZXItY29udGFpbmVyLWV4cGxpY2l0LWJhY2tkcm9wIixhLl9iYWNrZHJvcE92ZXJyaWRlKX0saW5wdXRzOnthdXRvc2l6ZToiYXV0b3NpemUiLGhhc0JhY2tkcm9wOiJoYXNCYWNrZHJvcCJ9LG91dHB1dHM6e2JhY2tkcm9wQ2xpY2s6ImJhY2tkcm9wQ2xpY2sifSxleHBvcnRBczpbIm1hdERyYXdlckNvbnRhaW5lciJdLGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6eTgsdXNlRXhpc3Rpbmc6dH1dKV0sbmdDb250ZW50U2VsZWN0b3JzOnlELGRlY2xzOjQsdmFyczoyLGNvbnN0czpbWzEsIm1hdC1kcmF3ZXItYmFja2Ryb3AiLDMsIm1hdC1kcmF3ZXItc2hvd24iXSxbMSwibWF0LWRyYXdlci1iYWNrZHJvcCIsMywiY2xpY2siXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihSZShDRCksTSgwLHhELDEsMiwiZGl2IiwwKSxtZSgxKSxtZSgyLDEpLE0oMyxNRCwyLDAsIm1hdC1kcmF3ZXItY29udGVudCIpKSxpJjImJih3KGEuaGFzQmFja2Ryb3A/MDotMSksbCgzKSx3KGEuX2NvbnRlbnQ/LTE6MykpfSxkZXBlbmRlbmNpZXM6W0gzXSxzdHlsZXM6W2AubWF0LWRyYXdlci1jb250YWluZXJ7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxO2NvbG9yOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRlbnQtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1iYWNrZ3JvdW5kKSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtc2lkZW5hdi1jb250ZW50LWJhY2tncm91bmQtY29sb3IsIHZhcigtLW1hdC1zeXMtYmFja2dyb3VuZCkpO2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbn0ubWF0LWRyYXdlci1jb250YWluZXJbZnVsbHNjcmVlbl17dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW2Z1bGxzY3JlZW5dLm1hdC1kcmF3ZXItY29udGFpbmVyLWhhcy1vcGVue292ZXJmbG93OmhpZGRlbn0ubWF0LWRyYXdlci1jb250YWluZXIubWF0LWRyYXdlci1jb250YWluZXItZXhwbGljaXQtYmFja2Ryb3AgLm1hdC1kcmF3ZXItc2lkZXt6LWluZGV4OjN9Lm1hdC1kcmF3ZXItY29udGFpbmVyLm5nLWFuaW1hdGUtZGlzYWJsZWQgLm1hdC1kcmF3ZXItYmFja2Ryb3AsLm1hdC1kcmF3ZXItY29udGFpbmVyLm5nLWFuaW1hdGUtZGlzYWJsZWQgLm1hdC1kcmF3ZXItY29udGVudCwubmctYW5pbWF0ZS1kaXNhYmxlZCAubWF0LWRyYXdlci1jb250YWluZXIgLm1hdC1kcmF3ZXItYmFja2Ryb3AsLm5nLWFuaW1hdGUtZGlzYWJsZWQgLm1hdC1kcmF3ZXItY29udGFpbmVyIC5tYXQtZHJhd2VyLWNvbnRlbnR7dHJhbnNpdGlvbjpub25lfS5tYXQtZHJhd2VyLWJhY2tkcm9we3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7ei1pbmRleDozO3Zpc2liaWxpdHk6aGlkZGVufS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd257dmlzaWJpbGl0eTp2aXNpYmxlO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXNpZGVuYXYtc2NyaW0tY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW5ldXRyYWwtdmFyaWFudDIwKSA0MCUsIHRyYW5zcGFyZW50KSl9Lm1hdC1kcmF3ZXItdHJhbnNpdGlvbiAubWF0LWRyYXdlci1iYWNrZHJvcHt0cmFuc2l0aW9uLWR1cmF0aW9uOjQwMG1zO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO3RyYW5zaXRpb24tcHJvcGVydHk6YmFja2dyb3VuZC1jb2xvcix2aXNpYmlsaXR5fUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtZHJhd2VyLWJhY2tkcm9we29wYWNpdHk6LjV9fS5tYXQtZHJhd2VyLWNvbnRlbnR7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6YXV0b30ubWF0LWRyYXdlci1jb250ZW50Lm1hdC1kcmF3ZXItY29udGVudC1oaWRkZW57b3BhY2l0eTowfS5tYXQtZHJhd2VyLXRyYW5zaXRpb24gLm1hdC1kcmF3ZXItY29udGVudHt0cmFuc2l0aW9uLWR1cmF0aW9uOjQwMG1zO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO3RyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtLG1hcmdpbi1sZWZ0LG1hcmdpbi1yaWdodH0ubWF0LWRyYXdlcntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjQ7Y29sb3I6dmFyKC0tbWF0LXNpZGVuYXYtY29udGFpbmVyLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSk7Ym94LXNoYWRvdzp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItZWxldmF0aW9uLXNoYWRvdywgbm9uZSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlKSk7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tbWF0LXNpZGVuYXYtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1sYXJnZSkpO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItbGFyZ2UpKTt3aWR0aDp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItd2lkdGgsIDM2MHB4KTtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3otaW5kZXg6MztvdXRsaW5lOjA7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93LXk6YXV0bzt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtZHJhd2VyLFtkaXI9cnRsXSAubWF0LWRyYXdlci5tYXQtZHJhd2VyLWVuZHtib3JkZXItcmlnaHQ6c29saWQgMXB4IGN1cnJlbnRDb2xvcn19QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLC5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1sZWZ0OnNvbGlkIDFweCBjdXJyZW50Q29sb3I7Ym9yZGVyLXJpZ2h0Om5vbmV9fS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItc2lkZXt6LWluZGV4OjJ9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1lbmR7cmlnaHQ6MDt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwgMCwgMCk7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWxhcmdlKSk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWxhcmdlKSk7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfVtkaXI9cnRsXSAubWF0LWRyYXdlcntib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItbGFyZ2UpKTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItbGFyZ2UpKTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApfVtkaXI9cnRsXSAubWF0LWRyYXdlci5tYXQtZHJhd2VyLWVuZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWxhcmdlKSk7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tbWF0LXNpZGVuYXYtY29udGFpbmVyLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1sYXJnZSkpO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7bGVmdDowO3JpZ2h0OmF1dG87dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKX0ubWF0LWRyYXdlci10cmFuc2l0aW9uIC5tYXQtZHJhd2Vye3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtZHJhd2VyOm5vdCgubWF0LWRyYXdlci1vcGVuZWQpOm5vdCgubWF0LWRyYXdlci1hbmltYXRpbmcpe3Zpc2liaWxpdHk6aGlkZGVuO2JveC1zaGFkb3c6bm9uZX0ubWF0LWRyYXdlcjpub3QoLm1hdC1kcmF3ZXItb3BlbmVkKTpub3QoLm1hdC1kcmF3ZXItYW5pbWF0aW5nKSAubWF0LWRyYXdlci1pbm5lci1jb250YWluZXJ7ZGlzcGxheTpub25lfS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItb3BlbmVkLm1hdC1kcmF3ZXItb3BlbmVke3RyYW5zZm9ybTpub25lfS5tYXQtZHJhd2VyLXNpZGV7Ym94LXNoYWRvdzpub25lO2JvcmRlci1yaWdodC1jb2xvcjp2YXIoLS1tYXQtc2lkZW5hdi1jb250YWluZXItZGl2aWRlci1jb2xvciwgdHJhbnNwYXJlbnQpO2JvcmRlci1yaWdodC13aWR0aDoxcHg7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmR7Ym9yZGVyLWxlZnQtY29sb3I6dmFyKC0tbWF0LXNpZGVuYXYtY29udGFpbmVyLWRpdmlkZXItY29sb3IsIHRyYW5zcGFyZW50KTtib3JkZXItbGVmdC13aWR0aDoxcHg7Ym9yZGVyLWxlZnQtc3R5bGU6c29saWQ7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLWxlZnQtY29sb3I6dmFyKC0tbWF0LXNpZGVuYXYtY29udGFpbmVyLWRpdmlkZXItY29sb3IsIHRyYW5zcGFyZW50KTtib3JkZXItbGVmdC13aWR0aDoxcHg7Ym9yZGVyLWxlZnQtc3R5bGU6c29saWQ7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmR7Ym9yZGVyLXJpZ2h0LWNvbG9yOnZhcigtLW1hdC1zaWRlbmF2LWNvbnRhaW5lci1kaXZpZGVyLWNvbG9yLCB0cmFuc3BhcmVudCk7Ym9yZGVyLXJpZ2h0LXdpZHRoOjFweDtib3JkZXItcmlnaHQtc3R5bGU6c29saWQ7Ym9yZGVyLWxlZnQ6bm9uZX0ubWF0LWRyYXdlci1pbm5lci1jb250YWluZXJ7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvdmVyZmxvdzphdXRvfS5tYXQtc2lkZW5hdi1maXhlZHtwb3NpdGlvbjpmaXhlZH0KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIHR9KSgpLHZ1PSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBIM3tzdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJtYXQtc2lkZW5hdi1jb250ZW50Il1dLGhvc3RBdHRyczpbMSwibWF0LWRyYXdlci1jb250ZW50IiwibWF0LXNpZGVuYXYtY29udGVudCJdLGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6aDIsdXNlRXhpc3Rpbmc6dH1dKSxGZV0sbmdDb250ZW50U2VsZWN0b3JzOk4zLGRlY2xzOjEsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoUmUoKSxtZSgwKSl9LGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSx4OD0oKCk9PntjbGFzcyB0IGV4dGVuZHMgYjh7Z2V0IGZpeGVkSW5WaWV3cG9ydCgpe3JldHVybiB0aGlzLl9maXhlZEluVmlld3BvcnR9c2V0IGZpeGVkSW5WaWV3cG9ydChlKXt0aGlzLl9maXhlZEluVmlld3BvcnQ9VzEoZSl9X2ZpeGVkSW5WaWV3cG9ydD0hMTtnZXQgZml4ZWRUb3BHYXAoKXtyZXR1cm4gdGhpcy5fZml4ZWRUb3BHYXB9c2V0IGZpeGVkVG9wR2FwKGUpe3RoaXMuX2ZpeGVkVG9wR2FwPUlpKGUpfV9maXhlZFRvcEdhcD0wO2dldCBmaXhlZEJvdHRvbUdhcCgpe3JldHVybiB0aGlzLl9maXhlZEJvdHRvbUdhcH1zZXQgZml4ZWRCb3R0b21HYXAoZSl7dGhpcy5fZml4ZWRCb3R0b21HYXA9SWkoZSl9X2ZpeGVkQm90dG9tR2FwPTA7c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgZTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuKGV8fChlPWt0KHQpKSkoYXx8dCl9fSkoKTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LXNpZGVuYXYiXV0saG9zdEF0dHJzOlsxLCJtYXQtZHJhd2VyIiwibWF0LXNpZGVuYXYiXSxob3N0VmFyczoxNixob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJihHKCJ0YWJJbmRleCIsYS5tb2RlIT09InNpZGUiPyItMSI6bnVsbCkoImFsaWduIixudWxsKSxfdCgidG9wIixhLmZpeGVkSW5WaWV3cG9ydD9hLmZpeGVkVG9wR2FwOm51bGwsInB4IikoImJvdHRvbSIsYS5maXhlZEluVmlld3BvcnQ/YS5maXhlZEJvdHRvbUdhcDpudWxsLCJweCIpLGllKCJtYXQtZHJhd2VyLWVuZCIsYS5wb3NpdGlvbj09PSJlbmQiKSgibWF0LWRyYXdlci1vdmVyIixhLm1vZGU9PT0ib3ZlciIpKCJtYXQtZHJhd2VyLXB1c2giLGEubW9kZT09PSJwdXNoIikoIm1hdC1kcmF3ZXItc2lkZSIsYS5tb2RlPT09InNpZGUiKSgibWF0LXNpZGVuYXYtZml4ZWQiLGEuZml4ZWRJblZpZXdwb3J0KSl9LGlucHV0czp7Zml4ZWRJblZpZXdwb3J0OiJmaXhlZEluVmlld3BvcnQiLGZpeGVkVG9wR2FwOiJmaXhlZFRvcEdhcCIsZml4ZWRCb3R0b21HYXA6ImZpeGVkQm90dG9tR2FwIn0sZXhwb3J0QXM6WyJtYXRTaWRlbmF2Il0sZmVhdHVyZXM6W0llKFt7cHJvdmlkZTpiOCx1c2VFeGlzdGluZzp0fV0pLEZlXSxuZ0NvbnRlbnRTZWxlY3RvcnM6TjMsZGVjbHM6Myx2YXJzOjAsY29uc3RzOltbImNvbnRlbnQiLCIiXSxbImNka1Njcm9sbGFibGUiLCIiLDEsIm1hdC1kcmF3ZXItaW5uZXItY29udGFpbmVyIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoUmUoKSxjKDAsImRpdiIsMSwwKSxtZSgyKSxzKCkpfSxkZXBlbmRlbmNpZXM6W2gyXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCksX3U9KCgpPT57Y2xhc3MgdCBleHRlbmRzIEM4e19hbGxEcmF3ZXJzPXZvaWQgMDtfY29udGVudD12b2lkIDA7c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgZTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuKGV8fChlPWt0KHQpKSkoYXx8dCl9fSkoKTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LXNpZGVuYXYtY29udGFpbmVyIl1dLGNvbnRlbnRRdWVyaWVzOmZ1bmN0aW9uKGksYSxyKXtpZihpJjEmJihCZShyLHZ1LDUpLEJlKHIseDgsNSkpLGkmMil7bGV0IG87RihvPUIoKSkmJihhLl9jb250ZW50PW8uZmlyc3QpLEYobz1CKCkpJiYoYS5fYWxsRHJhd2Vycz1vKX19LGhvc3RBdHRyczpbMSwibWF0LWRyYXdlci1jb250YWluZXIiLCJtYXQtc2lkZW5hdi1jb250YWluZXIiXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmaWUoIm1hdC1kcmF3ZXItY29udGFpbmVyLWV4cGxpY2l0LWJhY2tkcm9wIixhLl9iYWNrZHJvcE92ZXJyaWRlKX0sZXhwb3J0QXM6WyJtYXRTaWRlbmF2Q29udGFpbmVyIl0sZmVhdHVyZXM6W0llKFt7cHJvdmlkZTp5OCx1c2VFeGlzdGluZzp0fSx7cHJvdmlkZTpDOCx1c2VFeGlzdGluZzp0fV0pLEZlXSxuZ0NvbnRlbnRTZWxlY3RvcnM6U0QsZGVjbHM6NCx2YXJzOjIsY29uc3RzOltbMSwibWF0LWRyYXdlci1iYWNrZHJvcCIsMywibWF0LWRyYXdlci1zaG93biJdLFsxLCJtYXQtZHJhd2VyLWJhY2tkcm9wIiwzLCJjbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKFJlKHdEKSxNKDAsa0QsMSwyLCJkaXYiLDApLG1lKDEpLG1lKDIsMSksTSgzLHpELDIsMCwibWF0LXNpZGVuYXYtY29udGVudCIpKSxpJjImJih3KGEuaGFzQmFja2Ryb3A/MDotMSksbCgzKSx3KGEuX2NvbnRlbnQ/LTE6MykpfSxkZXBlbmRlbmNpZXM6W3Z1XSxzdHlsZXM6W1REXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCksYnU9KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVtb2Q9eGUoe3R5cGU6dH0pO3N0YXRpYyBcdTAyNzVpbmo9eWUoe2ltcG9ydHM6W3plLFhpLFhpLHplXX0pfXJldHVybiB0fSkoKX0pO3ZhciBDdSx5dT14KCgpPT57aygpO1coKTthMSgpO1l0KCk7cDEoKTttaCgpO1NwKCk7RXAoKTtEcCgpO2N1KCk7Z3UoKTtNOCgpO2soKTtpbC53YXRjaCgpO0N1PSgoKT0+e2NsYXNzIHR7X2RvY3VtZW50PWgoanQpO3RyYW5zbGF0ZT1oKEl0KTtjb25zdHJ1Y3Rvcigpe3RoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKCJlbiIpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1yb290Il1dLGRlY2xzOjEwLHZhcnM6MCxjb25zdHM6W1sic2lkZW5hdiIsIiJdLFsiZnVsbHNjcmVlbiIsIiJdLFsibW9kZSIsIm92ZXIiXSxbMywic2lkZW5hdlRvZ2dsZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO2MoMCwibWF0LXNpZGVuYXYtY29udGFpbmVyIiwxKSgxLCJtYXQtc2lkZW5hdiIsMiwwKSgzLCJzaWRlbmF2IiwzKSxTKCJzaWRlbmF2VG9nZ2xlIixmdW5jdGlvbigpe3oocik7bGV0IGQ9c2UoMik7cmV0dXJuIFQoZC50b2dnbGUoKSl9KSxzKCkoKSxjKDQsImFwcC1uYXZiYXIiLDMpLFMoInNpZGVuYXZUb2dnbGUiLGZ1bmN0aW9uKCl7eihyKTtsZXQgZD1zZSgyKTtyZXR1cm4gVChkLnRvZ2dsZSgpKX0pLHMoKSx1KDUsImFwcC1zZXJ2ZXItc3RhcnRlZC1ub3RpZmljYXRpb24iKSg2LCJhcHAtY3RmLXN5c3RlbS13aWRlLW5vdGlmaWNhdGlvbiIpKDcsImFwcC1jaGFsbGVuZ2Utc29sdmVkLW5vdGlmaWNhdGlvbiIpKDgsImFwcC13ZWxjb21lIikoOSwicm91dGVyLW91dGxldCIpLHMoKX19LGRlcGVuZGVuY2llczpbX3UseDgsdXUsb3UsQXAsd3AsVHAsZGgseTBdLHN0eWxlczpbYC5tYXQtc2lkZW5hdltfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjgwcHh9CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO3ZhciBERCx4dSxNdT14KCgpPT57aygpO2soKTtObSgpO3kxKCk7V2EoKTtERD1uZXcgY2UoIm1hdC1jaGlwcy1kZWZhdWx0LW9wdGlvbnMiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT4oe3NlcGFyYXRvcktleUNvZGVzOlsxM119KX0pLHh1PSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1bW9kPXhlKHt0eXBlOnR9KTtzdGF0aWMgXHUwMjc1aW5qPXllKHtwcm92aWRlcnM6W08wLHtwcm92aWRlOkRELHVzZVZhbHVlOntzZXBhcmF0b3JLZXlDb2RlczpbMTNdfX1dLGltcG9ydHM6W3plLHVpLHplXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIFBEKHQsbil7dCYxJiYoYygwLCJzcGFuIiwxMSksTXQoKSxjKDEsInN2ZyIsMTMpLHUoMiwicGF0aCIsMTQpLHMoKSxjKDMsInN2ZyIsMTUpLHUoNCwicGF0aCIsMTYpLHMoKSgpKX12YXIgSUQsTEQsVkQsUjMsQzQsd3UsRjM9eCgoKT0+e2soKTtrKCk7V2UoKTt4aSgpO0EyKCk7ZmkoKTtJMigpO0syKCk7dzMoKTt5MSgpO0lEPVsic3dpdGNoIl0sTEQ9WyIqIl07VkQ9bmV3IGNlKCJtYXQtc2xpZGUtdG9nZ2xlLWRlZmF1bHQtb3B0aW9ucyIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6KCk9Pih7ZGlzYWJsZVRvZ2dsZVZhbHVlOiExLGhpZGVJY29uOiExLGRpc2FibGVkSW50ZXJhY3RpdmU6ITF9KX0pLFIzPWNsYXNze3NvdXJjZTtjaGVja2VkO2NvbnN0cnVjdG9yKG4sZSl7dGhpcy5zb3VyY2U9bix0aGlzLmNoZWNrZWQ9ZX19LEM0PSgoKT0+e2NsYXNzIHR7X2VsZW1lbnRSZWY9aChhZSk7X2ZvY3VzTW9uaXRvcj1oKFgxKTtfY2hhbmdlRGV0ZWN0b3JSZWY9aChFZSk7ZGVmYXVsdHM9aChWRCk7X29uQ2hhbmdlPWU9Pnt9O19vblRvdWNoZWQ9KCk9Pnt9O192YWxpZGF0b3JPbkNoYW5nZT0oKT0+e307X3VuaXF1ZUlkO19jaGVja2VkPSExO19jcmVhdGVDaGFuZ2VFdmVudChlKXtyZXR1cm4gbmV3IFIzKHRoaXMsZSl9X2xhYmVsSWQ7Z2V0IGJ1dHRvbklkKCl7cmV0dXJuYCR7dGhpcy5pZHx8dGhpcy5fdW5pcXVlSWR9LWJ1dHRvbmB9X3N3aXRjaEVsZW1lbnQ7Zm9jdXMoKXt0aGlzLl9zd2l0Y2hFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKX1fbm9vcEFuaW1hdGlvbnM9UHQoKTtfZm9jdXNlZDtuYW1lPW51bGw7aWQ7bGFiZWxQb3NpdGlvbj0iYWZ0ZXIiO2FyaWFMYWJlbD1udWxsO2FyaWFMYWJlbGxlZGJ5PW51bGw7YXJpYURlc2NyaWJlZGJ5O3JlcXVpcmVkO2NvbG9yO2Rpc2FibGVkPSExO2Rpc2FibGVSaXBwbGU9ITE7dGFiSW5kZXg9MDtnZXQgY2hlY2tlZCgpe3JldHVybiB0aGlzLl9jaGVja2VkfXNldCBjaGVja2VkKGUpe3RoaXMuX2NoZWNrZWQ9ZSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1oaWRlSWNvbjtkaXNhYmxlZEludGVyYWN0aXZlO2NoYW5nZT1uZXcgTjt0b2dnbGVDaGFuZ2U9bmV3IE47Z2V0IGlucHV0SWQoKXtyZXR1cm5gJHt0aGlzLmlkfHx0aGlzLl91bmlxdWVJZH0taW5wdXRgfWNvbnN0cnVjdG9yKCl7aChDMSkubG9hZChFMSk7bGV0IGU9aChuZXcgcGkoInRhYmluZGV4Iikse29wdGlvbmFsOiEwfSksaT10aGlzLmRlZmF1bHRzO3RoaXMudGFiSW5kZXg9ZT09bnVsbD8wOnBhcnNlSW50KGUpfHwwLHRoaXMuY29sb3I9aS5jb2xvcnx8ImFjY2VudCIsdGhpcy5pZD10aGlzLl91bmlxdWVJZD1oKHF0KS5nZXRJZCgibWF0LW1kYy1zbGlkZS10b2dnbGUtIiksdGhpcy5oaWRlSWNvbj1pLmhpZGVJY29uPz8hMSx0aGlzLmRpc2FibGVkSW50ZXJhY3RpdmU9aS5kaXNhYmxlZEludGVyYWN0aXZlPz8hMSx0aGlzLl9sYWJlbElkPXRoaXMuX3VuaXF1ZUlkKyItbGFiZWwifW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsITApLnN1YnNjcmliZShlPT57ZT09PSJrZXlib2FyZCJ8fGU9PT0icHJvZ3JhbSI/KHRoaXMuX2ZvY3VzZWQ9ITAsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpOmV8fFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9Pnt0aGlzLl9mb2N1c2VkPSExLHRoaXMuX29uVG91Y2hlZCgpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSl9KX1uZ09uQ2hhbmdlcyhlKXtlLnJlcXVpcmVkJiZ0aGlzLl92YWxpZGF0b3JPbkNoYW5nZSgpfW5nT25EZXN0cm95KCl7dGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpfXdyaXRlVmFsdWUoZSl7dGhpcy5jaGVja2VkPSEhZX1yZWdpc3Rlck9uQ2hhbmdlKGUpe3RoaXMuX29uQ2hhbmdlPWV9cmVnaXN0ZXJPblRvdWNoZWQoZSl7dGhpcy5fb25Ub3VjaGVkPWV9dmFsaWRhdGUoZSl7cmV0dXJuIHRoaXMucmVxdWlyZWQmJmUudmFsdWUhPT0hMD97cmVxdWlyZWQ6ITB9Om51bGx9cmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShlKXt0aGlzLl92YWxpZGF0b3JPbkNoYW5nZT1lfXNldERpc2FibGVkU3RhdGUoZSl7dGhpcy5kaXNhYmxlZD1lLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfXRvZ2dsZSgpe3RoaXMuY2hlY2tlZD0hdGhpcy5jaGVja2VkLHRoaXMuX29uQ2hhbmdlKHRoaXMuY2hlY2tlZCl9X2VtaXRDaGFuZ2VFdmVudCgpe3RoaXMuX29uQ2hhbmdlKHRoaXMuY2hlY2tlZCksdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLl9jcmVhdGVDaGFuZ2VFdmVudCh0aGlzLmNoZWNrZWQpKX1faGFuZGxlQ2xpY2soKXt0aGlzLmRpc2FibGVkfHwodGhpcy50b2dnbGVDaGFuZ2UuZW1pdCgpLHRoaXMuZGVmYXVsdHMuZGlzYWJsZVRvZ2dsZVZhbHVlfHwodGhpcy5jaGVja2VkPSF0aGlzLmNoZWNrZWQsdGhpcy5fb25DaGFuZ2UodGhpcy5jaGVja2VkKSx0aGlzLmNoYW5nZS5lbWl0KG5ldyBSMyh0aGlzLHRoaXMuY2hlY2tlZCkpKSl9X2dldEFyaWFMYWJlbGxlZEJ5KCl7cmV0dXJuIHRoaXMuYXJpYUxhYmVsbGVkYnk/dGhpcy5hcmlhTGFiZWxsZWRieTp0aGlzLmFyaWFMYWJlbD9udWxsOnRoaXMuX2xhYmVsSWR9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LXNsaWRlLXRvZ2dsZSJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJnRlKElELDUpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLl9zd2l0Y2hFbGVtZW50PXIuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtbWRjLXNsaWRlLXRvZ2dsZSJdLGhvc3RWYXJzOjEzLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmKEFpKCJpZCIsYS5pZCksRygidGFiaW5kZXgiLG51bGwpKCJhcmlhLWxhYmVsIixudWxsKSgibmFtZSIsbnVsbCkoImFyaWEtbGFiZWxsZWRieSIsbnVsbCksRHQoYS5jb2xvcj8ibWF0LSIrYS5jb2xvcjoiIiksaWUoIm1hdC1tZGMtc2xpZGUtdG9nZ2xlLWZvY3VzZWQiLGEuX2ZvY3VzZWQpKCJtYXQtbWRjLXNsaWRlLXRvZ2dsZS1jaGVja2VkIixhLmNoZWNrZWQpKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsYS5fbm9vcEFuaW1hdGlvbnMpKX0saW5wdXRzOntuYW1lOiJuYW1lIixpZDoiaWQiLGxhYmVsUG9zaXRpb246ImxhYmVsUG9zaXRpb24iLGFyaWFMYWJlbDpbMCwiYXJpYS1sYWJlbCIsImFyaWFMYWJlbCJdLGFyaWFMYWJlbGxlZGJ5OlswLCJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhTGFiZWxsZWRieSJdLGFyaWFEZXNjcmliZWRieTpbMCwiYXJpYS1kZXNjcmliZWRieSIsImFyaWFEZXNjcmliZWRieSJdLHJlcXVpcmVkOlsyLCJyZXF1aXJlZCIsInJlcXVpcmVkIixaXSxjb2xvcjoiY29sb3IiLGRpc2FibGVkOlsyLCJkaXNhYmxlZCIsImRpc2FibGVkIixaXSxkaXNhYmxlUmlwcGxlOlsyLCJkaXNhYmxlUmlwcGxlIiwiZGlzYWJsZVJpcHBsZSIsWl0sdGFiSW5kZXg6WzIsInRhYkluZGV4IiwidGFiSW5kZXgiLGU9PmU9PW51bGw/MDpvdChlKV0sY2hlY2tlZDpbMiwiY2hlY2tlZCIsImNoZWNrZWQiLFpdLGhpZGVJY29uOlsyLCJoaWRlSWNvbiIsImhpZGVJY29uIixaXSxkaXNhYmxlZEludGVyYWN0aXZlOlsyLCJkaXNhYmxlZEludGVyYWN0aXZlIiwiZGlzYWJsZWRJbnRlcmFjdGl2ZSIsWl19LG91dHB1dHM6e2NoYW5nZToiY2hhbmdlIix0b2dnbGVDaGFuZ2U6InRvZ2dsZUNoYW5nZSJ9LGV4cG9ydEFzOlsibWF0U2xpZGVUb2dnbGUiXSxmZWF0dXJlczpbSWUoW3twcm92aWRlOmYyLHVzZUV4aXN0aW5nOmhpKCgpPT50KSxtdWx0aTohMH0se3Byb3ZpZGU6d3IsdXNlRXhpc3Rpbmc6dCxtdWx0aTohMH1dKSxIZV0sbmdDb250ZW50U2VsZWN0b3JzOkxELGRlY2xzOjE0LHZhcnM6MjcsY29uc3RzOltbInN3aXRjaCIsIiJdLFsibWF0LWludGVybmFsLWZvcm0tZmllbGQiLCIiLDMsImxhYmVsUG9zaXRpb24iXSxbInJvbGUiLCJzd2l0Y2giLCJ0eXBlIiwiYnV0dG9uIiwxLCJtZGMtc3dpdGNoIiwzLCJjbGljayIsInRhYkluZGV4IiwiZGlzYWJsZWQiXSxbMSwibWF0LW1kYy1zbGlkZS10b2dnbGUtdG91Y2gtdGFyZ2V0Il0sWzEsIm1kYy1zd2l0Y2hfX3RyYWNrIl0sWzEsIm1kYy1zd2l0Y2hfX2hhbmRsZS10cmFjayJdLFsxLCJtZGMtc3dpdGNoX19oYW5kbGUiXSxbMSwibWRjLXN3aXRjaF9fc2hhZG93Il0sWzEsIm1kYy1lbGV2YXRpb24tb3ZlcmxheSJdLFsxLCJtZGMtc3dpdGNoX19yaXBwbGUiXSxbIm1hdC1yaXBwbGUiLCIiLDEsIm1hdC1tZGMtc2xpZGUtdG9nZ2xlLXJpcHBsZSIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiLDMsIm1hdFJpcHBsZVRyaWdnZXIiLCJtYXRSaXBwbGVEaXNhYmxlZCIsIm1hdFJpcHBsZUNlbnRlcmVkIl0sWzEsIm1kYy1zd2l0Y2hfX2ljb25zIl0sWzEsIm1kYy1sYWJlbCIsMywiY2xpY2siLCJmb3IiXSxbInZpZXdCb3giLCIwIDAgMjQgMjQiLCJhcmlhLWhpZGRlbiIsInRydWUiLDEsIm1kYy1zd2l0Y2hfX2ljb24iLCJtZGMtc3dpdGNoX19pY29uLS1vbiJdLFsiZCIsIk0xOS42OSw1LjIzTDguOTYsMTUuOTZsLTQuMjMtNC4yM0wyLjk2LDEzLjVsNiw2TDIxLjQ2LDdMMTkuNjksNS4yM3oiXSxbInZpZXdCb3giLCIwIDAgMjQgMjQiLCJhcmlhLWhpZGRlbiIsInRydWUiLDEsIm1kYy1zd2l0Y2hfX2ljb24iLCJtZGMtc3dpdGNoX19pY29uLS1vZmYiXSxbImQiLCJNMjAgMTNINHYtMmgxNnYyeiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO1JlKCksYygwLCJkaXYiLDEpKDEsImJ1dHRvbiIsMiwwKSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuX2hhbmRsZUNsaWNrKCkpfSksdSgzLCJkaXYiLDMpKDQsInNwYW4iLDQpLGMoNSwic3BhbiIsNSkoNiwic3BhbiIsNikoNywic3BhbiIsNyksdSg4LCJzcGFuIiw4KSxzKCksYyg5LCJzcGFuIiw5KSx1KDEwLCJzcGFuIiwxMCkscygpLE0oMTEsUEQsNSwwLCJzcGFuIiwxMSkscygpKCkoKSxjKDEyLCJsYWJlbCIsMTIpLFMoImNsaWNrIixmdW5jdGlvbihkKXtyZXR1cm4geihyKSxUKGQuc3RvcFByb3BhZ2F0aW9uKCkpfSksbWUoMTMpLHMoKSgpfWlmKGkmMil7bGV0IHI9c2UoMik7ZigibGFiZWxQb3NpdGlvbiIsYS5sYWJlbFBvc2l0aW9uKSxsKCksaWUoIm1kYy1zd2l0Y2gtLXNlbGVjdGVkIixhLmNoZWNrZWQpKCJtZGMtc3dpdGNoLS11bnNlbGVjdGVkIiwhYS5jaGVja2VkKSgibWRjLXN3aXRjaC0tY2hlY2tlZCIsYS5jaGVja2VkKSgibWRjLXN3aXRjaC0tZGlzYWJsZWQiLGEuZGlzYWJsZWQpKCJtYXQtbWRjLXNsaWRlLXRvZ2dsZS1kaXNhYmxlZC1pbnRlcmFjdGl2ZSIsYS5kaXNhYmxlZEludGVyYWN0aXZlKSxmKCJ0YWJJbmRleCIsYS5kaXNhYmxlZCYmIWEuZGlzYWJsZWRJbnRlcmFjdGl2ZT8tMTphLnRhYkluZGV4KSgiZGlzYWJsZWQiLGEuZGlzYWJsZWQmJiFhLmRpc2FibGVkSW50ZXJhY3RpdmUpLEcoImlkIixhLmJ1dHRvbklkKSgibmFtZSIsYS5uYW1lKSgiYXJpYS1sYWJlbCIsYS5hcmlhTGFiZWwpKCJhcmlhLWxhYmVsbGVkYnkiLGEuX2dldEFyaWFMYWJlbGxlZEJ5KCkpKCJhcmlhLWRlc2NyaWJlZGJ5IixhLmFyaWFEZXNjcmliZWRieSkoImFyaWEtcmVxdWlyZWQiLGEucmVxdWlyZWR8fG51bGwpKCJhcmlhLWNoZWNrZWQiLGEuY2hlY2tlZCkoImFyaWEtZGlzYWJsZWQiLGEuZGlzYWJsZWQmJmEuZGlzYWJsZWRJbnRlcmFjdGl2ZT8idHJ1ZSI6bnVsbCksbCg5KSxmKCJtYXRSaXBwbGVUcmlnZ2VyIixyKSgibWF0UmlwcGxlRGlzYWJsZWQiLGEuZGlzYWJsZVJpcHBsZXx8YS5kaXNhYmxlZCkoIm1hdFJpcHBsZUNlbnRlcmVkIiwhMCksbCgpLHcoYS5oaWRlSWNvbj8tMToxMSksbCgpLGYoImZvciIsYS5idXR0b25JZCksRygiaWQiLGEuX2xhYmVsSWQpfX0sZGVwZW5kZW5jaWVzOltMMSxacl0sc3R5bGVzOltgLm1kYy1zd2l0Y2h7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2ZsZXgtc2hyaW5rOjA7bWFyZ2luOjA7b3V0bGluZTpub25lO292ZXJmbG93OnZpc2libGU7cGFkZGluZzowO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtdHJhY2std2lkdGgsIDUycHgpfS5tZGMtc3dpdGNoLm1kYy1zd2l0Y2gtLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0O3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1kYy1zd2l0Y2gubWF0LW1kYy1zbGlkZS10b2dnbGUtZGlzYWJsZWQtaW50ZXJhY3RpdmV7cG9pbnRlci1ldmVudHM6YXV0b30ubWRjLXN3aXRjaF9fdHJhY2t7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCU7aGVpZ2h0OnZhcigtLW1hdC1zbGlkZS10b2dnbGUtdHJhY2staGVpZ2h0LCAzMnB4KTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtdHJhY2stc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWZ1bGwpKX0ubWRjLXN3aXRjaC0tZGlzYWJsZWQubWRjLXN3aXRjaCAubWRjLXN3aXRjaF9fdHJhY2t7b3BhY2l0eTp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLXRyYWNrLW9wYWNpdHksIDAuMTIpfS5tZGMtc3dpdGNoX190cmFjazo6YmVmb3JlLC5tZGMtc3dpdGNoX190cmFjazo6YWZ0ZXJ7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLDApO2JvcmRlci1yYWRpdXM6aW5oZXJpdDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29udGVudDoiIjtoZWlnaHQ6MTAwJTtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtib3JkZXItd2lkdGg6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS10cmFjay1vdXRsaW5lLXdpZHRoLCAycHgpO2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXRyYWNrLW91dGxpbmUtY29sb3IsIHZhcigtLW1hdC1zeXMtb3V0bGluZSkpfS5tZGMtc3dpdGNoLS1zZWxlY3RlZCAubWRjLXN3aXRjaF9fdHJhY2s6OmJlZm9yZSwubWRjLXN3aXRjaC0tc2VsZWN0ZWQgLm1kYy1zd2l0Y2hfX3RyYWNrOjphZnRlcntib3JkZXItd2lkdGg6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1zZWxlY3RlZC10cmFjay1vdXRsaW5lLXdpZHRoLCAycHgpO2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXNlbGVjdGVkLXRyYWNrLW91dGxpbmUtY29sb3IsIHRyYW5zcGFyZW50KX0ubWRjLXN3aXRjaC0tZGlzYWJsZWQgLm1kYy1zd2l0Y2hfX3RyYWNrOjpiZWZvcmUsLm1kYy1zd2l0Y2gtLWRpc2FibGVkIC5tZGMtc3dpdGNoX190cmFjazo6YWZ0ZXJ7Ym9yZGVyLXdpZHRoOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtZGlzYWJsZWQtdW5zZWxlY3RlZC10cmFjay1vdXRsaW5lLXdpZHRoLCAycHgpO2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLXVuc2VsZWN0ZWQtdHJhY2stb3V0bGluZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1kYy1zd2l0Y2hfX3RyYWNre2JvcmRlci1jb2xvcjpjdXJyZW50Q29sb3J9fS5tZGMtc3dpdGNoX190cmFjazo6YmVmb3Jle3RyYW5zaXRpb246dHJhbnNmb3JtIDc1bXMgMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApO2JhY2tncm91bmQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS11bnNlbGVjdGVkLXRyYWNrLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXN1cmZhY2UtdmFyaWFudCkpfS5tZGMtc3dpdGNoLS1zZWxlY3RlZCAubWRjLXN3aXRjaF9fdHJhY2s6OmJlZm9yZXt0cmFuc2l0aW9uOnRyYW5zZm9ybSA3NW1zIDBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwMCUpfVtkaXI9cnRsXSAubWRjLXN3aXRjaC0tc2VsZWN0ZWQgLm1kYy1zd2l0Y2gtLXNlbGVjdGVkIC5tZGMtc3dpdGNoX190cmFjazo6YmVmb3Jle3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKX0ubWRjLXN3aXRjaC0tc2VsZWN0ZWQgLm1kYy1zd2l0Y2hfX3RyYWNrOjpiZWZvcmV7b3BhY2l0eTp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWhpZGRlbi10cmFjay1vcGFjaXR5LCAwKTt0cmFuc2l0aW9uOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtaGlkZGVuLXRyYWNrLXRyYW5zaXRpb24sIG9wYWNpdHkgNzVtcyl9Lm1kYy1zd2l0Y2gtLXVuc2VsZWN0ZWQgLm1kYy1zd2l0Y2hfX3RyYWNrOjpiZWZvcmV7b3BhY2l0eTp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXZpc2libGUtdHJhY2stb3BhY2l0eSwgMSk7dHJhbnNpdGlvbjp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXZpc2libGUtdHJhY2stdHJhbnNpdGlvbiwgb3BhY2l0eSA3NW1zKX0ubWRjLXN3aXRjaDplbmFibGVkOmhvdmVyOm5vdCg6Zm9jdXMpOm5vdCg6YWN0aXZlKSAubWRjLXN3aXRjaF9fdHJhY2s6OmJlZm9yZXtiYWNrZ3JvdW5kOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtdW5zZWxlY3RlZC1ob3Zlci10cmFjay1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlLXZhcmlhbnQpKX0ubWRjLXN3aXRjaDplbmFibGVkOmZvY3VzOm5vdCg6YWN0aXZlKSAubWRjLXN3aXRjaF9fdHJhY2s6OmJlZm9yZXtiYWNrZ3JvdW5kOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtdW5zZWxlY3RlZC1mb2N1cy10cmFjay1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlLXZhcmlhbnQpKX0ubWRjLXN3aXRjaDplbmFibGVkOmFjdGl2ZSAubWRjLXN3aXRjaF9fdHJhY2s6OmJlZm9yZXtiYWNrZ3JvdW5kOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtdW5zZWxlY3RlZC1wcmVzc2VkLXRyYWNrLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXN1cmZhY2UtdmFyaWFudCkpfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZS1kaXNhYmxlZC1pbnRlcmFjdGl2ZS5tZGMtc3dpdGNoLS1kaXNhYmxlZDpob3Zlcjpub3QoOmZvY3VzKTpub3QoOmFjdGl2ZSkgLm1kYy1zd2l0Y2hfX3RyYWNrOjpiZWZvcmUsLm1hdC1tZGMtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLWludGVyYWN0aXZlLm1kYy1zd2l0Y2gtLWRpc2FibGVkOmZvY3VzOm5vdCg6YWN0aXZlKSAubWRjLXN3aXRjaF9fdHJhY2s6OmJlZm9yZSwubWF0LW1kYy1zbGlkZS10b2dnbGUtZGlzYWJsZWQtaW50ZXJhY3RpdmUubWRjLXN3aXRjaC0tZGlzYWJsZWQ6YWN0aXZlIC5tZGMtc3dpdGNoX190cmFjazo6YmVmb3JlLC5tZGMtc3dpdGNoLm1kYy1zd2l0Y2gtLWRpc2FibGVkIC5tZGMtc3dpdGNoX190cmFjazo6YmVmb3Jle2JhY2tncm91bmQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1kaXNhYmxlZC11bnNlbGVjdGVkLXRyYWNrLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXN1cmZhY2UtdmFyaWFudCkpfS5tZGMtc3dpdGNoX190cmFjazo6YWZ0ZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO2JhY2tncm91bmQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1zZWxlY3RlZC10cmFjay1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9W2Rpcj1ydGxdIC5tZGMtc3dpdGNoX190cmFjazo6YWZ0ZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSl9Lm1kYy1zd2l0Y2gtLXNlbGVjdGVkIC5tZGMtc3dpdGNoX190cmFjazo6YWZ0ZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9Lm1kYy1zd2l0Y2gtLXNlbGVjdGVkIC5tZGMtc3dpdGNoX190cmFjazo6YWZ0ZXJ7b3BhY2l0eTp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXZpc2libGUtdHJhY2stb3BhY2l0eSwgMSk7dHJhbnNpdGlvbjp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXZpc2libGUtdHJhY2stdHJhbnNpdGlvbiwgb3BhY2l0eSA3NW1zKX0ubWRjLXN3aXRjaC0tdW5zZWxlY3RlZCAubWRjLXN3aXRjaF9fdHJhY2s6OmFmdGVye29wYWNpdHk6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1oaWRkZW4tdHJhY2stb3BhY2l0eSwgMCk7dHJhbnNpdGlvbjp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWhpZGRlbi10cmFjay10cmFuc2l0aW9uLCBvcGFjaXR5IDc1bXMpfS5tZGMtc3dpdGNoOmVuYWJsZWQ6aG92ZXI6bm90KDpmb2N1cyk6bm90KDphY3RpdmUpIC5tZGMtc3dpdGNoX190cmFjazo6YWZ0ZXJ7YmFja2dyb3VuZDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXNlbGVjdGVkLWhvdmVyLXRyYWNrLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWRjLXN3aXRjaDplbmFibGVkOmZvY3VzOm5vdCg6YWN0aXZlKSAubWRjLXN3aXRjaF9fdHJhY2s6OmFmdGVye2JhY2tncm91bmQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1zZWxlY3RlZC1mb2N1cy10cmFjay1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1kYy1zd2l0Y2g6ZW5hYmxlZDphY3RpdmUgLm1kYy1zd2l0Y2hfX3RyYWNrOjphZnRlcntiYWNrZ3JvdW5kOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtc2VsZWN0ZWQtcHJlc3NlZC10cmFjay1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1hdC1tZGMtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLWludGVyYWN0aXZlLm1kYy1zd2l0Y2gtLWRpc2FibGVkOmhvdmVyOm5vdCg6Zm9jdXMpOm5vdCg6YWN0aXZlKSAubWRjLXN3aXRjaF9fdHJhY2s6OmFmdGVyLC5tYXQtbWRjLXNsaWRlLXRvZ2dsZS1kaXNhYmxlZC1pbnRlcmFjdGl2ZS5tZGMtc3dpdGNoLS1kaXNhYmxlZDpmb2N1czpub3QoOmFjdGl2ZSkgLm1kYy1zd2l0Y2hfX3RyYWNrOjphZnRlciwubWF0LW1kYy1zbGlkZS10b2dnbGUtZGlzYWJsZWQtaW50ZXJhY3RpdmUubWRjLXN3aXRjaC0tZGlzYWJsZWQ6YWN0aXZlIC5tZGMtc3dpdGNoX190cmFjazo6YWZ0ZXIsLm1kYy1zd2l0Y2gubWRjLXN3aXRjaC0tZGlzYWJsZWQgLm1kYy1zd2l0Y2hfX3RyYWNrOjphZnRlcntiYWNrZ3JvdW5kOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtZGlzYWJsZWQtc2VsZWN0ZWQtdHJhY2stY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfS5tZGMtc3dpdGNoX19oYW5kbGUtdHJhY2t7aGVpZ2h0OjEwMCU7cG9pbnRlci1ldmVudHM6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA3NW1zIDBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO2xlZnQ6MDtyaWdodDphdXRvO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3dpZHRoOmNhbGMoMTAwJSAtIHZhcigtLW1hdC1zbGlkZS10b2dnbGUtaGFuZGxlLXdpZHRoKSl9W2Rpcj1ydGxdIC5tZGMtc3dpdGNoX19oYW5kbGUtdHJhY2t7bGVmdDphdXRvO3JpZ2h0OjB9Lm1kYy1zd2l0Y2gtLXNlbGVjdGVkIC5tZGMtc3dpdGNoX19oYW5kbGUtdHJhY2t7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSl9W2Rpcj1ydGxdIC5tZGMtc3dpdGNoLS1zZWxlY3RlZCAubWRjLXN3aXRjaF9faGFuZGxlLXRyYWNre3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKX0ubWRjLXN3aXRjaF9faGFuZGxle2Rpc3BsYXk6ZmxleDtwb2ludGVyLWV2ZW50czphdXRvO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSk7bGVmdDowO3JpZ2h0OmF1dG87dHJhbnNpdGlvbjp3aWR0aCA3NW1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksaGVpZ2h0IDc1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSxtYXJnaW4gNzVtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO3dpZHRoOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtaGFuZGxlLXdpZHRoKTtoZWlnaHQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1oYW5kbGUtaGVpZ2h0KTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtaGFuZGxlLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1mdWxsKSl9W2Rpcj1ydGxdIC5tZGMtc3dpdGNoX19oYW5kbGV7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1tZGMtc2xpZGUtdG9nZ2xlIC5tZGMtc3dpdGNoLS11bnNlbGVjdGVkIC5tZGMtc3dpdGNoX19oYW5kbGV7d2lkdGg6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS11bnNlbGVjdGVkLWhhbmRsZS1zaXplLCAxNnB4KTtoZWlnaHQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS11bnNlbGVjdGVkLWhhbmRsZS1zaXplLCAxNnB4KTttYXJnaW46dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS11bnNlbGVjdGVkLWhhbmRsZS1ob3Jpem9udGFsLW1hcmdpbiwgMCA4cHgpfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZSAubWRjLXN3aXRjaC0tdW5zZWxlY3RlZCAubWRjLXN3aXRjaF9faGFuZGxlOmhhcygubWRjLXN3aXRjaF9faWNvbnMpe21hcmdpbjp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXVuc2VsZWN0ZWQtd2l0aC1pY29uLWhhbmRsZS1ob3Jpem9udGFsLW1hcmdpbiwgMCA0cHgpfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZSAubWRjLXN3aXRjaC0tc2VsZWN0ZWQgLm1kYy1zd2l0Y2hfX2hhbmRsZXt3aWR0aDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXNlbGVjdGVkLWhhbmRsZS1zaXplLCAyNHB4KTtoZWlnaHQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1zZWxlY3RlZC1oYW5kbGUtc2l6ZSwgMjRweCk7bWFyZ2luOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtc2VsZWN0ZWQtaGFuZGxlLWhvcml6b250YWwtbWFyZ2luLCAwIDI0cHgpfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZSAubWRjLXN3aXRjaC0tc2VsZWN0ZWQgLm1kYy1zd2l0Y2hfX2hhbmRsZTpoYXMoLm1kYy1zd2l0Y2hfX2ljb25zKXttYXJnaW46dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1zZWxlY3RlZC13aXRoLWljb24taGFuZGxlLWhvcml6b250YWwtbWFyZ2luLCAwIDI0cHgpfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZSAubWRjLXN3aXRjaF9faGFuZGxlOmhhcygubWRjLXN3aXRjaF9faWNvbnMpe3dpZHRoOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtd2l0aC1pY29uLWhhbmRsZS1zaXplLCAyNHB4KTtoZWlnaHQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS13aXRoLWljb24taGFuZGxlLXNpemUsIDI0cHgpfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZSAubWRjLXN3aXRjaDphY3RpdmU6bm90KC5tZGMtc3dpdGNoLS1kaXNhYmxlZCkgLm1kYy1zd2l0Y2hfX2hhbmRsZXt3aWR0aDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXByZXNzZWQtaGFuZGxlLXNpemUsIDI4cHgpO2hlaWdodDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXByZXNzZWQtaGFuZGxlLXNpemUsIDI4cHgpfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZSAubWRjLXN3aXRjaC0tc2VsZWN0ZWQ6YWN0aXZlOm5vdCgubWRjLXN3aXRjaC0tZGlzYWJsZWQpIC5tZGMtc3dpdGNoX19oYW5kbGV7bWFyZ2luOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtc2VsZWN0ZWQtcHJlc3NlZC1oYW5kbGUtaG9yaXpvbnRhbC1tYXJnaW4sIDAgMjJweCl9Lm1hdC1tZGMtc2xpZGUtdG9nZ2xlIC5tZGMtc3dpdGNoLS11bnNlbGVjdGVkOmFjdGl2ZTpub3QoLm1kYy1zd2l0Y2gtLWRpc2FibGVkKSAubWRjLXN3aXRjaF9faGFuZGxle21hcmdpbjp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXVuc2VsZWN0ZWQtcHJlc3NlZC1oYW5kbGUtaG9yaXpvbnRhbC1tYXJnaW4sIDAgMnB4KX0ubWRjLXN3aXRjaC0tZGlzYWJsZWQubWRjLXN3aXRjaC0tc2VsZWN0ZWQgLm1kYy1zd2l0Y2hfX2hhbmRsZTo6YWZ0ZXJ7b3BhY2l0eTp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLXNlbGVjdGVkLWhhbmRsZS1vcGFjaXR5LCAxKX0ubWRjLXN3aXRjaC0tZGlzYWJsZWQubWRjLXN3aXRjaC0tdW5zZWxlY3RlZCAubWRjLXN3aXRjaF9faGFuZGxlOjphZnRlcntvcGFjaXR5OnZhcigtLW1hdC1zbGlkZS10b2dnbGUtZGlzYWJsZWQtdW5zZWxlY3RlZC1oYW5kbGUtb3BhY2l0eSwgMC4zOCl9Lm1kYy1zd2l0Y2hfX2hhbmRsZTo6YmVmb3JlLC5tZGMtc3dpdGNoX19oYW5kbGU6OmFmdGVye2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwwKTtib3JkZXItcmFkaXVzOmluaGVyaXQ7Ym94LXNpemluZzpib3JkZXItYm94O2NvbnRlbnQ6IiI7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDc1bXMgMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSksYm9yZGVyLWNvbG9yIDc1bXMgMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7ei1pbmRleDotMX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWRjLXN3aXRjaF9faGFuZGxlOjpiZWZvcmUsLm1kYy1zd2l0Y2hfX2hhbmRsZTo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOmN1cnJlbnRDb2xvcn19Lm1kYy1zd2l0Y2gtLXNlbGVjdGVkOmVuYWJsZWQgLm1kYy1zd2l0Y2hfX2hhbmRsZTo6YWZ0ZXJ7YmFja2dyb3VuZDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXNlbGVjdGVkLWhhbmRsZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1wcmltYXJ5KSl9Lm1kYy1zd2l0Y2gtLXNlbGVjdGVkOmVuYWJsZWQ6aG92ZXI6bm90KDpmb2N1cyk6bm90KDphY3RpdmUpIC5tZGMtc3dpdGNoX19oYW5kbGU6OmFmdGVye2JhY2tncm91bmQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1zZWxlY3RlZC1ob3Zlci1oYW5kbGUtY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeS1jb250YWluZXIpKX0ubWRjLXN3aXRjaC0tc2VsZWN0ZWQ6ZW5hYmxlZDpmb2N1czpub3QoOmFjdGl2ZSkgLm1kYy1zd2l0Y2hfX2hhbmRsZTo6YWZ0ZXJ7YmFja2dyb3VuZDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXNlbGVjdGVkLWZvY3VzLWhhbmRsZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5LWNvbnRhaW5lcikpfS5tZGMtc3dpdGNoLS1zZWxlY3RlZDplbmFibGVkOmFjdGl2ZSAubWRjLXN3aXRjaF9faGFuZGxlOjphZnRlcntiYWNrZ3JvdW5kOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtc2VsZWN0ZWQtcHJlc3NlZC1oYW5kbGUtY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeS1jb250YWluZXIpKX0ubWF0LW1kYy1zbGlkZS10b2dnbGUtZGlzYWJsZWQtaW50ZXJhY3RpdmUubWRjLXN3aXRjaC0tZGlzYWJsZWQubWRjLXN3aXRjaC0tc2VsZWN0ZWQ6aG92ZXI6bm90KDpmb2N1cyk6bm90KDphY3RpdmUpIC5tZGMtc3dpdGNoX19oYW5kbGU6OmFmdGVyLC5tYXQtbWRjLXNsaWRlLXRvZ2dsZS1kaXNhYmxlZC1pbnRlcmFjdGl2ZS5tZGMtc3dpdGNoLS1kaXNhYmxlZC5tZGMtc3dpdGNoLS1zZWxlY3RlZDpmb2N1czpub3QoOmFjdGl2ZSkgLm1kYy1zd2l0Y2hfX2hhbmRsZTo6YWZ0ZXIsLm1hdC1tZGMtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLWludGVyYWN0aXZlLm1kYy1zd2l0Y2gtLWRpc2FibGVkLm1kYy1zd2l0Y2gtLXNlbGVjdGVkOmFjdGl2ZSAubWRjLXN3aXRjaF9faGFuZGxlOjphZnRlciwubWRjLXN3aXRjaC0tc2VsZWN0ZWQubWRjLXN3aXRjaC0tZGlzYWJsZWQgLm1kYy1zd2l0Y2hfX2hhbmRsZTo6YWZ0ZXJ7YmFja2dyb3VuZDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLXNlbGVjdGVkLWhhbmRsZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlKSl9Lm1kYy1zd2l0Y2gtLXVuc2VsZWN0ZWQ6ZW5hYmxlZCAubWRjLXN3aXRjaF9faGFuZGxlOjphZnRlcntiYWNrZ3JvdW5kOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtdW5zZWxlY3RlZC1oYW5kbGUtY29sb3IsIHZhcigtLW1hdC1zeXMtb3V0bGluZSkpfS5tZGMtc3dpdGNoLS11bnNlbGVjdGVkOmVuYWJsZWQ6aG92ZXI6bm90KDpmb2N1cyk6bm90KDphY3RpdmUpIC5tZGMtc3dpdGNoX19oYW5kbGU6OmFmdGVye2JhY2tncm91bmQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS11bnNlbGVjdGVkLWhvdmVyLWhhbmRsZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKX0ubWRjLXN3aXRjaC0tdW5zZWxlY3RlZDplbmFibGVkOmZvY3VzOm5vdCg6YWN0aXZlKSAubWRjLXN3aXRjaF9faGFuZGxlOjphZnRlcntiYWNrZ3JvdW5kOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtdW5zZWxlY3RlZC1mb2N1cy1oYW5kbGUtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1kYy1zd2l0Y2gtLXVuc2VsZWN0ZWQ6ZW5hYmxlZDphY3RpdmUgLm1kYy1zd2l0Y2hfX2hhbmRsZTo6YWZ0ZXJ7YmFja2dyb3VuZDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXVuc2VsZWN0ZWQtcHJlc3NlZC1oYW5kbGUtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1kYy1zd2l0Y2gtLXVuc2VsZWN0ZWQubWRjLXN3aXRjaC0tZGlzYWJsZWQgLm1kYy1zd2l0Y2hfX2hhbmRsZTo6YWZ0ZXJ7YmFja2dyb3VuZDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLXVuc2VsZWN0ZWQtaGFuZGxlLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWRjLXN3aXRjaF9faGFuZGxlOjpiZWZvcmV7YmFja2dyb3VuZDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWhhbmRsZS1zdXJmYWNlLWNvbG9yKX0ubWRjLXN3aXRjaF9fc2hhZG93e2JvcmRlci1yYWRpdXM6aW5oZXJpdDtib3R0b206MDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MH0ubWRjLXN3aXRjaDplbmFibGVkIC5tZGMtc3dpdGNoX19zaGFkb3d7Ym94LXNoYWRvdzp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWhhbmRsZS1lbGV2YXRpb24tc2hhZG93KX0ubWF0LW1kYy1zbGlkZS10b2dnbGUtZGlzYWJsZWQtaW50ZXJhY3RpdmUubWRjLXN3aXRjaC0tZGlzYWJsZWQ6aG92ZXI6bm90KDpmb2N1cyk6bm90KDphY3RpdmUpIC5tZGMtc3dpdGNoX19zaGFkb3csLm1hdC1tZGMtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLWludGVyYWN0aXZlLm1kYy1zd2l0Y2gtLWRpc2FibGVkOmZvY3VzOm5vdCg6YWN0aXZlKSAubWRjLXN3aXRjaF9fc2hhZG93LC5tYXQtbWRjLXNsaWRlLXRvZ2dsZS1kaXNhYmxlZC1pbnRlcmFjdGl2ZS5tZGMtc3dpdGNoLS1kaXNhYmxlZDphY3RpdmUgLm1kYy1zd2l0Y2hfX3NoYWRvdywubWRjLXN3aXRjaC5tZGMtc3dpdGNoLS1kaXNhYmxlZCAubWRjLXN3aXRjaF9fc2hhZG93e2JveC1zaGFkb3c6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1kaXNhYmxlZC1oYW5kbGUtZWxldmF0aW9uLXNoYWRvdyl9Lm1kYy1zd2l0Y2hfX3JpcHBsZXtsZWZ0OjUwJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTUwJSk7ei1pbmRleDotMTt3aWR0aDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXN0YXRlLWxheWVyLXNpemUsIDQwcHgpO2hlaWdodDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXN0YXRlLWxheWVyLXNpemUsIDQwcHgpfS5tZGMtc3dpdGNoX19yaXBwbGU6OmFmdGVye2NvbnRlbnQ6IiI7b3BhY2l0eTowfS5tZGMtc3dpdGNoLS1kaXNhYmxlZCAubWRjLXN3aXRjaF9fcmlwcGxlOjphZnRlcntkaXNwbGF5Om5vbmV9Lm1hdC1tZGMtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtc3dpdGNoX19yaXBwbGU6OmFmdGVye2Rpc3BsYXk6YmxvY2t9Lm1kYy1zd2l0Y2g6aG92ZXIgLm1kYy1zd2l0Y2hfX3JpcHBsZTo6YWZ0ZXJ7dHJhbnNpdGlvbjo3NW1zIG9wYWNpdHkgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSl9Lm1hdC1tZGMtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLWludGVyYWN0aXZlLm1kYy1zd2l0Y2gtLWRpc2FibGVkOmVuYWJsZWQ6Zm9jdXMgLm1kYy1zd2l0Y2hfX3JpcHBsZTo6YWZ0ZXIsLm1hdC1tZGMtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLWludGVyYWN0aXZlLm1kYy1zd2l0Y2gtLWRpc2FibGVkOmVuYWJsZWQ6YWN0aXZlIC5tZGMtc3dpdGNoX19yaXBwbGU6OmFmdGVyLC5tYXQtbWRjLXNsaWRlLXRvZ2dsZS1kaXNhYmxlZC1pbnRlcmFjdGl2ZS5tZGMtc3dpdGNoLS1kaXNhYmxlZDplbmFibGVkOmhvdmVyOm5vdCg6Zm9jdXMpIC5tZGMtc3dpdGNoX19yaXBwbGU6OmFmdGVyLC5tZGMtc3dpdGNoLS11bnNlbGVjdGVkOmVuYWJsZWQ6aG92ZXI6bm90KDpmb2N1cykgLm1kYy1zd2l0Y2hfX3JpcHBsZTo6YWZ0ZXJ7YmFja2dyb3VuZDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXVuc2VsZWN0ZWQtaG92ZXItc3RhdGUtbGF5ZXItY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO29wYWNpdHk6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS11bnNlbGVjdGVkLWhvdmVyLXN0YXRlLWxheWVyLW9wYWNpdHksIHZhcigtLW1hdC1zeXMtaG92ZXItc3RhdGUtbGF5ZXItb3BhY2l0eSkpfS5tZGMtc3dpdGNoLS11bnNlbGVjdGVkOmVuYWJsZWQ6Zm9jdXMgLm1kYy1zd2l0Y2hfX3JpcHBsZTo6YWZ0ZXJ7YmFja2dyb3VuZDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXVuc2VsZWN0ZWQtZm9jdXMtc3RhdGUtbGF5ZXItY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO29wYWNpdHk6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS11bnNlbGVjdGVkLWZvY3VzLXN0YXRlLWxheWVyLW9wYWNpdHksIHZhcigtLW1hdC1zeXMtZm9jdXMtc3RhdGUtbGF5ZXItb3BhY2l0eSkpfS5tZGMtc3dpdGNoLS11bnNlbGVjdGVkOmVuYWJsZWQ6YWN0aXZlIC5tZGMtc3dpdGNoX19yaXBwbGU6OmFmdGVye2JhY2tncm91bmQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS11bnNlbGVjdGVkLXByZXNzZWQtc3RhdGUtbGF5ZXItY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO29wYWNpdHk6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS11bnNlbGVjdGVkLXByZXNzZWQtc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1wcmVzc2VkLXN0YXRlLWxheWVyLW9wYWNpdHkpKTt0cmFuc2l0aW9uOm9wYWNpdHkgNzVtcyBsaW5lYXJ9Lm1kYy1zd2l0Y2gtLXNlbGVjdGVkOmVuYWJsZWQ6aG92ZXI6bm90KDpmb2N1cykgLm1kYy1zd2l0Y2hfX3JpcHBsZTo6YWZ0ZXJ7YmFja2dyb3VuZDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXNlbGVjdGVkLWhvdmVyLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKTtvcGFjaXR5OnZhcigtLW1hdC1zbGlkZS10b2dnbGUtc2VsZWN0ZWQtaG92ZXItc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5KSl9Lm1kYy1zd2l0Y2gtLXNlbGVjdGVkOmVuYWJsZWQ6Zm9jdXMgLm1kYy1zd2l0Y2hfX3JpcHBsZTo6YWZ0ZXJ7YmFja2dyb3VuZDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXNlbGVjdGVkLWZvY3VzLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKTtvcGFjaXR5OnZhcigtLW1hdC1zbGlkZS10b2dnbGUtc2VsZWN0ZWQtZm9jdXMtc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5KSl9Lm1kYy1zd2l0Y2gtLXNlbGVjdGVkOmVuYWJsZWQ6YWN0aXZlIC5tZGMtc3dpdGNoX19yaXBwbGU6OmFmdGVye2JhY2tncm91bmQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1zZWxlY3RlZC1wcmVzc2VkLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKTtvcGFjaXR5OnZhcigtLW1hdC1zbGlkZS10b2dnbGUtc2VsZWN0ZWQtcHJlc3NlZC1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLXByZXNzZWQtc3RhdGUtbGF5ZXItb3BhY2l0eSkpO3RyYW5zaXRpb246b3BhY2l0eSA3NW1zIGxpbmVhcn0ubWRjLXN3aXRjaF9faWNvbnN7cG9zaXRpb246cmVsYXRpdmU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTt6LWluZGV4OjE7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1kYy1zd2l0Y2gtLWRpc2FibGVkLm1kYy1zd2l0Y2gtLXVuc2VsZWN0ZWQgLm1kYy1zd2l0Y2hfX2ljb25ze29wYWNpdHk6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1kaXNhYmxlZC11bnNlbGVjdGVkLWljb24tb3BhY2l0eSwgMC4zOCl9Lm1kYy1zd2l0Y2gtLWRpc2FibGVkLm1kYy1zd2l0Y2gtLXNlbGVjdGVkIC5tZGMtc3dpdGNoX19pY29uc3tvcGFjaXR5OnZhcigtLW1hdC1zbGlkZS10b2dnbGUtZGlzYWJsZWQtc2VsZWN0ZWQtaWNvbi1vcGFjaXR5LCAwLjM4KX0ubWRjLXN3aXRjaF9faWNvbntib3R0b206MDtsZWZ0OjA7bWFyZ2luOmF1dG87cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MDtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDMwbXMgMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDEsIDEpfS5tZGMtc3dpdGNoLS11bnNlbGVjdGVkIC5tZGMtc3dpdGNoX19pY29ue3dpZHRoOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtdW5zZWxlY3RlZC1pY29uLXNpemUsIDE2cHgpO2hlaWdodDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLXVuc2VsZWN0ZWQtaWNvbi1zaXplLCAxNnB4KTtmaWxsOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtdW5zZWxlY3RlZC1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXN1cmZhY2UtdmFyaWFudCkpfS5tZGMtc3dpdGNoLS11bnNlbGVjdGVkLm1kYy1zd2l0Y2gtLWRpc2FibGVkIC5tZGMtc3dpdGNoX19pY29ue2ZpbGw6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1kaXNhYmxlZC11bnNlbGVjdGVkLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtc3VyZmFjZS12YXJpYW50KSl9Lm1kYy1zd2l0Y2gtLXNlbGVjdGVkIC5tZGMtc3dpdGNoX19pY29ue3dpZHRoOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtc2VsZWN0ZWQtaWNvbi1zaXplLCAxNnB4KTtoZWlnaHQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1zZWxlY3RlZC1pY29uLXNpemUsIDE2cHgpO2ZpbGw6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1zZWxlY3RlZC1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXByaW1hcnktY29udGFpbmVyKSl9Lm1kYy1zd2l0Y2gtLXNlbGVjdGVkLm1kYy1zd2l0Y2gtLWRpc2FibGVkIC5tZGMtc3dpdGNoX19pY29ue2ZpbGw6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1kaXNhYmxlZC1zZWxlY3RlZC1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWRjLXN3aXRjaC0tc2VsZWN0ZWQgLm1kYy1zd2l0Y2hfX2ljb24tLW9uLC5tZGMtc3dpdGNoLS11bnNlbGVjdGVkIC5tZGMtc3dpdGNoX19pY29uLS1vZmZ7b3BhY2l0eToxO3RyYW5zaXRpb246b3BhY2l0eSA0NW1zIDMwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSl9Lm1hdC1tZGMtc2xpZGUtdG9nZ2xley13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDAsMCwwLDApO291dGxpbmU6MH0ubWF0LW1kYy1zbGlkZS10b2dnbGUgLm1hdC1tZGMtc2xpZGUtdG9nZ2xlLXJpcHBsZSwubWF0LW1kYy1zbGlkZS10b2dnbGUgLm1kYy1zd2l0Y2hfX3JpcHBsZTo6YWZ0ZXJ7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LW1kYy1zbGlkZS10b2dnbGUgLm1hdC1tZGMtc2xpZGUtdG9nZ2xlLXJpcHBsZTpub3QoOmVtcHR5KSwubWF0LW1kYy1zbGlkZS10b2dnbGUgLm1kYy1zd2l0Y2hfX3JpcHBsZTo6YWZ0ZXI6bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1tZGMtc2xpZGUtdG9nZ2xlLm1hdC1tZGMtc2xpZGUtdG9nZ2xlLWZvY3VzZWQgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXtjb250ZW50OiIifS5tYXQtbWRjLXNsaWRlLXRvZ2dsZSAubWF0LWludGVybmFsLWZvcm0tZmllbGR7Y29sb3I6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKTtmb250LWZhbWlseTp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1mb250KSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC10ZXh0LWxpbmUtaGVpZ2h0LCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLWxpbmUtaGVpZ2h0KSk7Zm9udC1zaXplOnZhcigtLW1hdC1zbGlkZS10b2dnbGUtbGFiZWwtdGV4dC1zaXplLCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLXNpemUpKTtsZXR0ZXItc3BhY2luZzp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tdHJhY2tpbmcpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLXRleHQtd2VpZ2h0LCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLXdlaWdodCkpfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZSAubWF0LXJpcHBsZS1lbGVtZW50e29wYWNpdHk6LjEyfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZSAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3Jle2JvcmRlci1yYWRpdXM6NTAlfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWRjLXN3aXRjaF9faGFuZGxlLXRyYWNrLC5tYXQtbWRjLXNsaWRlLXRvZ2dsZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWRjLXN3aXRjaF9faWNvbiwubWF0LW1kYy1zbGlkZS10b2dnbGUuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1kYy1zd2l0Y2hfX2hhbmRsZTo6YmVmb3JlLC5tYXQtbWRjLXNsaWRlLXRvZ2dsZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWRjLXN3aXRjaF9faGFuZGxlOjphZnRlciwubWF0LW1kYy1zbGlkZS10b2dnbGUuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1kYy1zd2l0Y2hfX3RyYWNrOjpiZWZvcmUsLm1hdC1tZGMtc2xpZGUtdG9nZ2xlLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tZGMtc3dpdGNoX190cmFjazo6YWZ0ZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZSAubWRjLXN3aXRjaDplbmFibGVkKy5tZGMtbGFiZWx7Y3Vyc29yOnBvaW50ZXJ9Lm1hdC1tZGMtc2xpZGUtdG9nZ2xlIC5tZGMtc3dpdGNoLS1kaXNhYmxlZCtsYWJlbHtjb2xvcjp2YXIoLS1tYXQtc2xpZGUtdG9nZ2xlLWRpc2FibGVkLWxhYmVsLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfS5tYXQtbWRjLXNsaWRlLXRvZ2dsZS10b3VjaC10YXJnZXR7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTtoZWlnaHQ6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS10b3VjaC10YXJnZXQtc2l6ZSwgNDhweCk7d2lkdGg6MTAwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsIC01MCUpO2Rpc3BsYXk6dmFyKC0tbWF0LXNsaWRlLXRvZ2dsZS10b3VjaC10YXJnZXQtZGlzcGxheSwgYmxvY2spfVtkaXI9cnRsXSAubWF0LW1kYy1zbGlkZS10b2dnbGUtdG91Y2gtdGFyZ2V0e2xlZnQ6YXV0bztyaWdodDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSg1MCUsIC01MCUpfQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCksd3U9KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVtb2Q9eGUoe3R5cGU6dH0pO3N0YXRpYyBcdTAyNzVpbmo9eWUoe2ltcG9ydHM6W0M0LHplLHplXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIE9EKHQsbil7dCYxJiZtZSgwKX1mdW5jdGlvbiBqRCh0LG4pe31mdW5jdGlvbiBXRCh0LG4pe31mdW5jdGlvbiBRRCh0LG4pe2lmKHQmMSYmUigwLFdELDAsMCwibmctdGVtcGxhdGUiLDEyKSx0JjIpe2xldCBlPXYoKS4kaW1wbGljaXQ7ZigiY2RrUG9ydGFsT3V0bGV0IixlLnRlbXBsYXRlTGFiZWwpfX1mdW5jdGlvbiBZRCh0LG4pe2lmKHQmMSYmbSgwKSx0JjIpe2xldCBlPXYoKS4kaW1wbGljaXQ7QShlLnRleHRMYWJlbCl9fWZ1bmN0aW9uIFpEKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJkaXYiLDcsMiksUygiY2xpY2siLGZ1bmN0aW9uKCl7bGV0IGE9eihlKSxyPWEuJGltcGxpY2l0LG89YS4kaW5kZXgsZD12KCkscD1zZSgxKTtyZXR1cm4gVChkLl9oYW5kbGVDbGljayhyLHAsbykpfSkoImNka0ZvY3VzQ2hhbmdlIixmdW5jdGlvbihhKXtsZXQgcj16KGUpLiRpbmRleCxvPXYoKTtyZXR1cm4gVChvLl90YWJGb2N1c0NoYW5nZWQoYSxyKSl9KSx1KDIsInNwYW4iLDgpKDMsImRpdiIsOSksYyg0LCJzcGFuIiwxMCkoNSwic3BhbiIsMTEpLE0oNixRRCwxLDEsbnVsbCwxMikoNyxZRCwxLDEpLHMoKSgpKCl9aWYodCYyKXtsZXQgZT1uLiRpbXBsaWNpdCxpPW4uJGluZGV4LGE9c2UoMSkscj12KCk7RHQoZS5sYWJlbENsYXNzKSxpZSgibWRjLXRhYi0tYWN0aXZlIixyLnNlbGVjdGVkSW5kZXg9PT1pKSxmKCJpZCIsci5fZ2V0VGFiTGFiZWxJZChlLGkpKSgiZGlzYWJsZWQiLGUuZGlzYWJsZWQpKCJmaXRJbmtCYXJUb0NvbnRlbnQiLHIuZml0SW5rQmFyVG9Db250ZW50KSxHKCJ0YWJJbmRleCIsci5fZ2V0VGFiSW5kZXgoaSkpKCJhcmlhLXBvc2luc2V0IixpKzEpKCJhcmlhLXNldHNpemUiLHIuX3RhYnMubGVuZ3RoKSgiYXJpYS1jb250cm9scyIsci5fZ2V0VGFiQ29udGVudElkKGkpKSgiYXJpYS1zZWxlY3RlZCIsci5zZWxlY3RlZEluZGV4PT09aSkoImFyaWEtbGFiZWwiLGUuYXJpYUxhYmVsfHxudWxsKSgiYXJpYS1sYWJlbGxlZGJ5IiwhZS5hcmlhTGFiZWwmJmUuYXJpYUxhYmVsbGVkYnk/ZS5hcmlhTGFiZWxsZWRieTpudWxsKSxsKDMpLGYoIm1hdFJpcHBsZVRyaWdnZXIiLGEpKCJtYXRSaXBwbGVEaXNhYmxlZCIsZS5kaXNhYmxlZHx8ci5kaXNhYmxlUmlwcGxlKSxsKDMpLHcoZS50ZW1wbGF0ZUxhYmVsPzY6Nyl9fWZ1bmN0aW9uICREKHQsbil7dCYxJiZtZSgwKX1mdW5jdGlvbiBLRCh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwibWF0LXRhYi1ib2R5IiwxMyksUygiX29uQ2VudGVyZWQiLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5fcmVtb3ZlVGFiQm9keVdyYXBwZXJIZWlnaHQoKSl9KSgiX29uQ2VudGVyaW5nIixmdW5jdGlvbihhKXt6KGUpO2xldCByPXYoKTtyZXR1cm4gVChyLl9zZXRUYWJCb2R5V3JhcHBlckhlaWdodChhKSl9KSgiX2JlZm9yZUNlbnRlcmluZyIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5fYm9keUNlbnRlcmVkKGEpKX0pLHMoKX1pZih0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9bi4kaW5kZXgsYT12KCk7RHQoZS5ib2R5Q2xhc3MpLGYoImlkIixhLl9nZXRUYWJDb250ZW50SWQoaSkpKCJjb250ZW50IixlLmNvbnRlbnQpKCJwb3NpdGlvbiIsZS5wb3NpdGlvbikoImFuaW1hdGlvbkR1cmF0aW9uIixhLmFuaW1hdGlvbkR1cmF0aW9uKSgicHJlc2VydmVDb250ZW50IixhLnByZXNlcnZlQ29udGVudCksRygidGFiaW5kZXgiLGEuY29udGVudFRhYkluZGV4IT1udWxsJiZhLnNlbGVjdGVkSW5kZXg9PT1pP2EuY29udGVudFRhYkluZGV4Om51bGwpKCJhcmlhLWxhYmVsbGVkYnkiLGEuX2dldFRhYkxhYmVsSWQoZSxpKSkoImFyaWEtaGlkZGVuIixhLnNlbGVjdGVkSW5kZXghPT1pKX19dmFyIFQ4LEhELE5ELFJELEZELEJELFVELHFELEdELFhELEpELGVJLFR1LEU4LEV1LEE4LHc4LFN1LFM4LHRJLEF1LGt1LGlJLGFJLG5JLHJJLG9JLHp1LGs4LER1LHo4LEl1LEQ4PXgoKCk9Pnt4aSgpO1oyKCk7WTIoKTtJUygpO3ZhKCk7RDIoKTtrKCk7aygpO1h0KCk7bHQoKTtmaSgpO0VuKCk7QTIoKTtJMigpO3VtKCk7SzIoKTt5MSgpO1Q4PVsiKiJdO0hEPVsidGFiTGlzdENvbnRhaW5lciJdLE5EPVsidGFiTGlzdCJdLFJEPVsidGFiTGlzdElubmVyIl0sRkQ9WyJuZXh0UGFnaW5hdG9yIl0sQkQ9WyJwcmV2aW91c1BhZ2luYXRvciJdLFVEPVsiY29udGVudCJdO3FEPVsidGFiQm9keVdyYXBwZXIiXSxHRD1bInRhYkhlYWRlciJdO1hEPW5ldyBjZSgiTWF0VGFiQ29udGVudCIpLEpEPSgoKT0+e2NsYXNzIHR7dGVtcGxhdGU9aChoMSk7Y29uc3RydWN0b3IoKXt9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siIiwibWF0VGFiQ29udGVudCIsIiJdXSxmZWF0dXJlczpbSWUoW3twcm92aWRlOlhELHVzZUV4aXN0aW5nOnR9XSldfSl9cmV0dXJuIHR9KSgpLGVJPW5ldyBjZSgiTWF0VGFiTGFiZWwiKSxUdT1uZXcgY2UoIk1BVF9UQUIiKSxFOD0oKCk9PntjbGFzcyB0IGV4dGVuZHMgc217X2Nsb3Nlc3RUYWI9aChUdSx7b3B0aW9uYWw6ITB9KTtzdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXQtdGFiLWxhYmVsIiwiIl0sWyIiLCJtYXRUYWJMYWJlbCIsIiJdXSxmZWF0dXJlczpbSWUoW3twcm92aWRlOmVJLHVzZUV4aXN0aW5nOnR9XSksRmVdfSl9cmV0dXJuIHR9KSgpLEV1PW5ldyBjZSgiTUFUX1RBQl9HUk9VUCIpLEE4PSgoKT0+e2NsYXNzIHR7X3ZpZXdDb250YWluZXJSZWY9aChHMSk7X2Nsb3Nlc3RUYWJHcm91cD1oKEV1LHtvcHRpb25hbDohMH0pO2Rpc2FibGVkPSExO2dldCB0ZW1wbGF0ZUxhYmVsKCl7cmV0dXJuIHRoaXMuX3RlbXBsYXRlTGFiZWx9c2V0IHRlbXBsYXRlTGFiZWwoZSl7dGhpcy5fc2V0VGVtcGxhdGVMYWJlbElucHV0KGUpfV90ZW1wbGF0ZUxhYmVsO19leHBsaWNpdENvbnRlbnQ9dm9pZCAwO19pbXBsaWNpdENvbnRlbnQ7dGV4dExhYmVsPSIiO2FyaWFMYWJlbDthcmlhTGFiZWxsZWRieTtsYWJlbENsYXNzO2JvZHlDbGFzcztpZD1udWxsO19jb250ZW50UG9ydGFsPW51bGw7Z2V0IGNvbnRlbnQoKXtyZXR1cm4gdGhpcy5fY29udGVudFBvcnRhbH1fc3RhdGVDaGFuZ2VzPW5ldyB3ZTtwb3NpdGlvbj1udWxsO29yaWdpbj1udWxsO2lzQWN0aXZlPSExO2NvbnN0cnVjdG9yKCl7aChDMSkubG9hZChFMSl9bmdPbkNoYW5nZXMoZSl7KGUuaGFzT3duUHJvcGVydHkoInRleHRMYWJlbCIpfHxlLmhhc093blByb3BlcnR5KCJkaXNhYmxlZCIpKSYmdGhpcy5fc3RhdGVDaGFuZ2VzLm5leHQoKX1uZ09uRGVzdHJveSgpe3RoaXMuX3N0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpfW5nT25Jbml0KCl7dGhpcy5fY29udGVudFBvcnRhbD1uZXcgcGEodGhpcy5fZXhwbGljaXRDb250ZW50fHx0aGlzLl9pbXBsaWNpdENvbnRlbnQsdGhpcy5fdmlld0NvbnRhaW5lclJlZil9X3NldFRlbXBsYXRlTGFiZWxJbnB1dChlKXtlJiZlLl9jbG9zZXN0VGFiPT09dGhpcyYmKHRoaXMuX3RlbXBsYXRlTGFiZWw9ZSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LXRhYiJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbihpLGEscil7aWYoaSYxJiYoQmUocixFOCw1KSxCZShyLEpELDcsaDEpKSxpJjIpe2xldCBvO0Yobz1CKCkpJiYoYS50ZW1wbGF0ZUxhYmVsPW8uZmlyc3QpLEYobz1CKCkpJiYoYS5fZXhwbGljaXRDb250ZW50PW8uZmlyc3QpfX0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiZ0ZShoMSw3KSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5faW1wbGljaXRDb250ZW50PXIuZmlyc3QpfX0saG9zdEF0dHJzOlsiaGlkZGVuIiwiIl0saG9zdFZhcnM6MSxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJkcoImlkIixudWxsKX0saW5wdXRzOntkaXNhYmxlZDpbMiwiZGlzYWJsZWQiLCJkaXNhYmxlZCIsWl0sdGV4dExhYmVsOlswLCJsYWJlbCIsInRleHRMYWJlbCJdLGFyaWFMYWJlbDpbMCwiYXJpYS1sYWJlbCIsImFyaWFMYWJlbCJdLGFyaWFMYWJlbGxlZGJ5OlswLCJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhTGFiZWxsZWRieSJdLGxhYmVsQ2xhc3M6ImxhYmVsQ2xhc3MiLGJvZHlDbGFzczoiYm9keUNsYXNzIixpZDoiaWQifSxleHBvcnRBczpbIm1hdFRhYiJdLGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6VHUsdXNlRXhpc3Rpbmc6dH1dKSxIZV0sbmdDb250ZW50U2VsZWN0b3JzOlQ4LGRlY2xzOjEsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoUmUoKSxwcigwLE9ELDEsMCwibmctdGVtcGxhdGUiKSl9LGVuY2Fwc3VsYXRpb246Mn0pfXJldHVybiB0fSkoKSx3OD0ibWRjLXRhYi1pbmRpY2F0b3ItLWFjdGl2ZSIsU3U9Im1kYy10YWItaW5kaWNhdG9yLS1uby10cmFuc2l0aW9uIixTOD1jbGFzc3tfaXRlbXM7X2N1cnJlbnRJdGVtO2NvbnN0cnVjdG9yKG4pe3RoaXMuX2l0ZW1zPW59aGlkZSgpe3RoaXMuX2l0ZW1zLmZvckVhY2gobj0+bi5kZWFjdGl2YXRlSW5rQmFyKCkpLHRoaXMuX2N1cnJlbnRJdGVtPXZvaWQgMH1hbGlnblRvRWxlbWVudChuKXtsZXQgZT10aGlzLl9pdGVtcy5maW5kKGE9PmEuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50PT09biksaT10aGlzLl9jdXJyZW50SXRlbTtpZihlIT09aSYmKGk/LmRlYWN0aXZhdGVJbmtCYXIoKSxlKSl7bGV0IGE9aT8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdD8uKCk7ZS5hY3RpdmF0ZUlua0JhcihhKSx0aGlzLl9jdXJyZW50SXRlbT1lfX19LHRJPSgoKT0+e2NsYXNzIHR7X2VsZW1lbnRSZWY9aChhZSk7X2lua0JhckVsZW1lbnQ7X2lua0JhckNvbnRlbnRFbGVtZW50O19maXRUb0NvbnRlbnQ9ITE7Z2V0IGZpdElua0JhclRvQ29udGVudCgpe3JldHVybiB0aGlzLl9maXRUb0NvbnRlbnR9c2V0IGZpdElua0JhclRvQ29udGVudChlKXt0aGlzLl9maXRUb0NvbnRlbnQhPT1lJiYodGhpcy5fZml0VG9Db250ZW50PWUsdGhpcy5faW5rQmFyRWxlbWVudCYmdGhpcy5fYXBwZW5kSW5rQmFyRWxlbWVudCgpKX1hY3RpdmF0ZUlua0JhcihlKXtsZXQgaT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7aWYoIWV8fCFpLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8IXRoaXMuX2lua0JhckNvbnRlbnRFbGVtZW50KXtpLmNsYXNzTGlzdC5hZGQodzgpO3JldHVybn1sZXQgYT1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9ZS53aWR0aC9hLndpZHRoLG89ZS5sZWZ0LWEubGVmdDtpLmNsYXNzTGlzdC5hZGQoU3UpLHRoaXMuX2lua0JhckNvbnRlbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCJ0cmFuc2Zvcm0iLGB0cmFuc2xhdGVYKCR7b31weCkgc2NhbGVYKCR7cn0pYCksaS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpLmNsYXNzTGlzdC5yZW1vdmUoU3UpLGkuY2xhc3NMaXN0LmFkZCh3OCksdGhpcy5faW5rQmFyQ29udGVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoInRyYW5zZm9ybSIsIiIpfWRlYWN0aXZhdGVJbmtCYXIoKXt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh3OCl9bmdPbkluaXQoKXt0aGlzLl9jcmVhdGVJbmtCYXJFbGVtZW50KCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9pbmtCYXJFbGVtZW50Py5yZW1vdmUoKSx0aGlzLl9pbmtCYXJFbGVtZW50PXRoaXMuX2lua0JhckNvbnRlbnRFbGVtZW50PW51bGx9X2NyZWF0ZUlua0JhckVsZW1lbnQoKXtsZXQgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQsaT10aGlzLl9pbmtCYXJFbGVtZW50PWUuY3JlYXRlRWxlbWVudCgic3BhbiIpLGE9dGhpcy5faW5rQmFyQ29udGVudEVsZW1lbnQ9ZS5jcmVhdGVFbGVtZW50KCJzcGFuIik7aS5jbGFzc05hbWU9Im1kYy10YWItaW5kaWNhdG9yIixhLmNsYXNzTmFtZT0ibWRjLXRhYi1pbmRpY2F0b3JfX2NvbnRlbnQgbWRjLXRhYi1pbmRpY2F0b3JfX2NvbnRlbnQtLXVuZGVybGluZSIsaS5hcHBlbmRDaGlsZCh0aGlzLl9pbmtCYXJDb250ZW50RWxlbWVudCksdGhpcy5fYXBwZW5kSW5rQmFyRWxlbWVudCgpfV9hcHBlbmRJbmtCYXJFbGVtZW50KCl7dGhpcy5faW5rQmFyRWxlbWVudDtsZXQgZT10aGlzLl9maXRUb0NvbnRlbnQ/dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi5tZGMtdGFiX19jb250ZW50Iik6dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2UuYXBwZW5kQ2hpbGQodGhpcy5faW5rQmFyRWxlbWVudCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxpbnB1dHM6e2ZpdElua0JhclRvQ29udGVudDpbMiwiZml0SW5rQmFyVG9Db250ZW50IiwiZml0SW5rQmFyVG9Db250ZW50IixaXX19KX1yZXR1cm4gdH0pKCksQXU9KCgpPT57Y2xhc3MgdCBleHRlbmRzIHRJe2VsZW1lbnRSZWY9aChhZSk7ZGlzYWJsZWQ9ITE7Zm9jdXMoKXt0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpfWdldE9mZnNldExlZnQoKXtyZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdH1nZXRPZmZzZXRXaWR0aCgpe3JldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aH1zdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXRUYWJMYWJlbFdyYXBwZXIiLCIiXV0saG9zdFZhcnM6Myxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJihHKCJhcmlhLWRpc2FibGVkIiwhIWEuZGlzYWJsZWQpLGllKCJtYXQtbWRjLXRhYi1kaXNhYmxlZCIsYS5kaXNhYmxlZCkpfSxpbnB1dHM6e2Rpc2FibGVkOlsyLCJkaXNhYmxlZCIsImRpc2FibGVkIixaXX0sZmVhdHVyZXM6W0ZlXX0pfXJldHVybiB0fSkoKSxrdT17cGFzc2l2ZTohMH0saUk9NjUwLGFJPTEwMCxuST0oKCk9PntjbGFzcyB0e19lbGVtZW50UmVmPWgoYWUpO19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtfdmlld3BvcnRSdWxlcj1oKCQyKTtfZGlyPWgobjEse29wdGlvbmFsOiEwfSk7X25nWm9uZT1oKHJlKTtfcGxhdGZvcm09aChiMSk7X3NoYXJlZFJlc2l6ZU9ic2VydmVyPWgoT20pO19pbmplY3Rvcj1oKHN0KTtfcmVuZGVyZXI9aCh2MSk7X2FuaW1hdGlvbnNEaXNhYmxlZD1QdCgpO19ldmVudENsZWFudXBzO19zY3JvbGxEaXN0YW5jZT0wO19zZWxlY3RlZEluZGV4Q2hhbmdlZD0hMTtfZGVzdHJveWVkPW5ldyB3ZTtfc2hvd1BhZ2luYXRpb25Db250cm9scz0hMTtfZGlzYWJsZVNjcm9sbEFmdGVyPSEwO19kaXNhYmxlU2Nyb2xsQmVmb3JlPSEwO190YWJMYWJlbENvdW50O19zY3JvbGxEaXN0YW5jZUNoYW5nZWQ7X2tleU1hbmFnZXI7X2N1cnJlbnRUZXh0Q29udGVudDtfc3RvcFNjcm9sbGluZz1uZXcgd2U7ZGlzYWJsZVBhZ2luYXRpb249ITE7Z2V0IHNlbGVjdGVkSW5kZXgoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWRJbmRleH1zZXQgc2VsZWN0ZWRJbmRleChlKXtsZXQgaT1pc05hTihlKT8wOmU7dGhpcy5fc2VsZWN0ZWRJbmRleCE9aSYmKHRoaXMuX3NlbGVjdGVkSW5kZXhDaGFuZ2VkPSEwLHRoaXMuX3NlbGVjdGVkSW5kZXg9aSx0aGlzLl9rZXlNYW5hZ2VyJiZ0aGlzLl9rZXlNYW5hZ2VyLnVwZGF0ZUFjdGl2ZUl0ZW0oaSkpfV9zZWxlY3RlZEluZGV4PTA7c2VsZWN0Rm9jdXNlZEluZGV4PW5ldyBOO2luZGV4Rm9jdXNlZD1uZXcgTjtjb25zdHJ1Y3Rvcigpe3RoaXMuX2V2ZW50Q2xlYW51cHM9dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT5bdGhpcy5fcmVuZGVyZXIubGlzdGVuKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwibW91c2VsZWF2ZSIsKCk9PnRoaXMuX3N0b3BJbnRlcnZhbCgpKV0pfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX2V2ZW50Q2xlYW51cHMucHVzaCh0aGlzLl9yZW5kZXJlci5saXN0ZW4odGhpcy5fcHJldmlvdXNQYWdpbmF0b3IubmF0aXZlRWxlbWVudCwidG91Y2hzdGFydCIsKCk9PnRoaXMuX2hhbmRsZVBhZ2luYXRvclByZXNzKCJiZWZvcmUiKSxrdSksdGhpcy5fcmVuZGVyZXIubGlzdGVuKHRoaXMuX25leHRQYWdpbmF0b3IubmF0aXZlRWxlbWVudCwidG91Y2hzdGFydCIsKCk9PnRoaXMuX2hhbmRsZVBhZ2luYXRvclByZXNzKCJhZnRlciIpLGt1KSl9bmdBZnRlckNvbnRlbnRJbml0KCl7bGV0IGU9dGhpcy5fZGlyP3RoaXMuX2Rpci5jaGFuZ2U6YzEoImx0ciIpLGk9dGhpcy5fc2hhcmVkUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnBpcGUoVG4oMzIpLHh0KHRoaXMuX2Rlc3Ryb3llZCkpLGE9dGhpcy5fdmlld3BvcnRSdWxlci5jaGFuZ2UoMTUwKS5waXBlKHh0KHRoaXMuX2Rlc3Ryb3llZCkpLHI9KCk9Pnt0aGlzLnVwZGF0ZVBhZ2luYXRpb24oKSx0aGlzLl9hbGlnbklua0JhclRvU2VsZWN0ZWRUYWIoKX07dGhpcy5fa2V5TWFuYWdlcj1uZXcgWm8odGhpcy5faXRlbXMpLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCkpLndpdGhIb21lQW5kRW5kKCkud2l0aFdyYXAoKS5za2lwUHJlZGljYXRlKCgpPT4hMSksdGhpcy5fa2V5TWFuYWdlci51cGRhdGVBY3RpdmVJdGVtKE1hdGgubWF4KHRoaXMuX3NlbGVjdGVkSW5kZXgsMCkpLG0xKHIse2luamVjdG9yOnRoaXMuX2luamVjdG9yfSksS3QoZSxhLGksdGhpcy5faXRlbXMuY2hhbmdlcyx0aGlzLl9pdGVtc1Jlc2l6ZWQoKSkucGlwZSh4dCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9uZ1pvbmUucnVuKCgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e3RoaXMuX3Njcm9sbERpc3RhbmNlPU1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5fZ2V0TWF4U2Nyb2xsRGlzdGFuY2UoKSx0aGlzLl9zY3JvbGxEaXN0YW5jZSkpLHIoKX0pfSksdGhpcy5fa2V5TWFuYWdlcj8ud2l0aEhvcml6b250YWxPcmllbnRhdGlvbih0aGlzLl9nZXRMYXlvdXREaXJlY3Rpb24oKSl9KSx0aGlzLl9rZXlNYW5hZ2VyLmNoYW5nZS5zdWJzY3JpYmUobz0+e3RoaXMuaW5kZXhGb2N1c2VkLmVtaXQobyksdGhpcy5fc2V0VGFiRm9jdXMobyl9KX1faXRlbXNSZXNpemVkKCl7cmV0dXJuIHR5cGVvZiBSZXNpemVPYnNlcnZlciE9ImZ1bmN0aW9uIj9IaTp0aGlzLl9pdGVtcy5jaGFuZ2VzLnBpcGUoaTEodGhpcy5faXRlbXMpLHExKGU9Pm5ldyBtYShpPT50aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntsZXQgYT1uZXcgUmVzaXplT2JzZXJ2ZXIocj0+aS5uZXh0KHIpKTtyZXR1cm4gZS5mb3JFYWNoKHI9PmEub2JzZXJ2ZShyLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkpLCgpPT57YS5kaXNjb25uZWN0KCl9fSkpKSxQZCgxKSwkdChlPT5lLnNvbWUoaT0+aS5jb250ZW50UmVjdC53aWR0aD4wJiZpLmNvbnRlbnRSZWN0LmhlaWdodD4wKSkpfW5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpe3RoaXMuX3RhYkxhYmVsQ291bnQhPXRoaXMuX2l0ZW1zLmxlbmd0aCYmKHRoaXMudXBkYXRlUGFnaW5hdGlvbigpLHRoaXMuX3RhYkxhYmVsQ291bnQ9dGhpcy5faXRlbXMubGVuZ3RoLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKSx0aGlzLl9zZWxlY3RlZEluZGV4Q2hhbmdlZCYmKHRoaXMuX3Njcm9sbFRvTGFiZWwodGhpcy5fc2VsZWN0ZWRJbmRleCksdGhpcy5fY2hlY2tTY3JvbGxpbmdDb250cm9scygpLHRoaXMuX2FsaWduSW5rQmFyVG9TZWxlY3RlZFRhYigpLHRoaXMuX3NlbGVjdGVkSW5kZXhDaGFuZ2VkPSExLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKSx0aGlzLl9zY3JvbGxEaXN0YW5jZUNoYW5nZWQmJih0aGlzLl91cGRhdGVUYWJTY3JvbGxQb3NpdGlvbigpLHRoaXMuX3Njcm9sbERpc3RhbmNlQ2hhbmdlZD0hMSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9ldmVudENsZWFudXBzLmZvckVhY2goZT0+ZSgpKSx0aGlzLl9rZXlNYW5hZ2VyPy5kZXN0cm95KCksdGhpcy5fZGVzdHJveWVkLm5leHQoKSx0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKSx0aGlzLl9zdG9wU2Nyb2xsaW5nLmNvbXBsZXRlKCl9X2hhbmRsZUtleWRvd24oZSl7aWYoIXMxKGUpKXN3aXRjaChlLmtleUNvZGUpe2Nhc2UgMTM6Y2FzZSAzMjppZih0aGlzLmZvY3VzSW5kZXghPT10aGlzLnNlbGVjdGVkSW5kZXgpe2xldCBpPXRoaXMuX2l0ZW1zLmdldCh0aGlzLmZvY3VzSW5kZXgpO2kmJiFpLmRpc2FibGVkJiYodGhpcy5zZWxlY3RGb2N1c2VkSW5kZXguZW1pdCh0aGlzLmZvY3VzSW5kZXgpLHRoaXMuX2l0ZW1TZWxlY3RlZChlKSl9YnJlYWs7ZGVmYXVsdDp0aGlzLl9rZXlNYW5hZ2VyPy5vbktleWRvd24oZSl9fV9vbkNvbnRlbnRDaGFuZ2VzKCl7bGV0IGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50O2UhPT10aGlzLl9jdXJyZW50VGV4dENvbnRlbnQmJih0aGlzLl9jdXJyZW50VGV4dENvbnRlbnQ9ZXx8IiIsdGhpcy5fbmdab25lLnJ1bigoKT0+e3RoaXMudXBkYXRlUGFnaW5hdGlvbigpLHRoaXMuX2FsaWduSW5rQmFyVG9TZWxlY3RlZFRhYigpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSkpfXVwZGF0ZVBhZ2luYXRpb24oKXt0aGlzLl9jaGVja1BhZ2luYXRpb25FbmFibGVkKCksdGhpcy5fY2hlY2tTY3JvbGxpbmdDb250cm9scygpLHRoaXMuX3VwZGF0ZVRhYlNjcm9sbFBvc2l0aW9uKCl9Z2V0IGZvY3VzSW5kZXgoKXtyZXR1cm4gdGhpcy5fa2V5TWFuYWdlcj90aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleDowfXNldCBmb2N1c0luZGV4KGUpeyF0aGlzLl9pc1ZhbGlkSW5kZXgoZSl8fHRoaXMuZm9jdXNJbmRleD09PWV8fCF0aGlzLl9rZXlNYW5hZ2VyfHx0aGlzLl9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oZSl9X2lzVmFsaWRJbmRleChlKXtyZXR1cm4gdGhpcy5faXRlbXM/ISF0aGlzLl9pdGVtcy50b0FycmF5KClbZV06ITB9X3NldFRhYkZvY3VzKGUpe2lmKHRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHMmJnRoaXMuX3Njcm9sbFRvTGFiZWwoZSksdGhpcy5faXRlbXMmJnRoaXMuX2l0ZW1zLmxlbmd0aCl7dGhpcy5faXRlbXMudG9BcnJheSgpW2VdLmZvY3VzKCk7bGV0IGk9dGhpcy5fdGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50O3RoaXMuX2dldExheW91dERpcmVjdGlvbigpPT0ibHRyIj9pLnNjcm9sbExlZnQ9MDppLnNjcm9sbExlZnQ9aS5zY3JvbGxXaWR0aC1pLm9mZnNldFdpZHRofX1fZ2V0TGF5b3V0RGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpciYmdGhpcy5fZGlyLnZhbHVlPT09InJ0bCI/InJ0bCI6Imx0ciJ9X3VwZGF0ZVRhYlNjcm9sbFBvc2l0aW9uKCl7aWYodGhpcy5kaXNhYmxlUGFnaW5hdGlvbilyZXR1cm47bGV0IGU9dGhpcy5zY3JvbGxEaXN0YW5jZSxpPXRoaXMuX2dldExheW91dERpcmVjdGlvbigpPT09Imx0ciI/LWU6ZTt0aGlzLl90YWJMaXN0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGVYKCR7TWF0aC5yb3VuZChpKX1weClgLCh0aGlzLl9wbGF0Zm9ybS5UUklERU5UfHx0aGlzLl9wbGF0Zm9ybS5FREdFKSYmKHRoaXMuX3RhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0PTApfWdldCBzY3JvbGxEaXN0YW5jZSgpe3JldHVybiB0aGlzLl9zY3JvbGxEaXN0YW5jZX1zZXQgc2Nyb2xsRGlzdGFuY2UoZSl7dGhpcy5fc2Nyb2xsVG8oZSl9X3Njcm9sbEhlYWRlcihlKXtsZXQgaT10aGlzLl90YWJMaXN0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsYT0oZT09ImJlZm9yZSI/LTE6MSkqaS8zO3JldHVybiB0aGlzLl9zY3JvbGxUbyh0aGlzLl9zY3JvbGxEaXN0YW5jZSthKX1faGFuZGxlUGFnaW5hdG9yQ2xpY2soZSl7dGhpcy5fc3RvcEludGVydmFsKCksdGhpcy5fc2Nyb2xsSGVhZGVyKGUpfV9zY3JvbGxUb0xhYmVsKGUpe2lmKHRoaXMuZGlzYWJsZVBhZ2luYXRpb24pcmV0dXJuO2xldCBpPXRoaXMuX2l0ZW1zP3RoaXMuX2l0ZW1zLnRvQXJyYXkoKVtlXTpudWxsO2lmKCFpKXJldHVybjtsZXQgYT10aGlzLl90YWJMaXN0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgse29mZnNldExlZnQ6cixvZmZzZXRXaWR0aDpvfT1pLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxkLHA7dGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCk9PSJsdHIiPyhkPXIscD1kK28pOihwPXRoaXMuX3RhYkxpc3RJbm5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoLXIsZD1wLW8pO2xldCBnPXRoaXMuc2Nyb2xsRGlzdGFuY2UsXz10aGlzLnNjcm9sbERpc3RhbmNlK2E7ZDxnP3RoaXMuc2Nyb2xsRGlzdGFuY2UtPWctZDpwPl8mJih0aGlzLnNjcm9sbERpc3RhbmNlKz1NYXRoLm1pbihwLV8sZC1nKSl9X2NoZWNrUGFnaW5hdGlvbkVuYWJsZWQoKXtpZih0aGlzLmRpc2FibGVQYWdpbmF0aW9uKXRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHM9ITE7ZWxzZXtsZXQgZT10aGlzLl90YWJMaXN0SW5uZXIubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aCxpPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCxhPWUtaT49NTthfHwodGhpcy5zY3JvbGxEaXN0YW5jZT0wKSxhIT09dGhpcy5fc2hvd1BhZ2luYXRpb25Db250cm9scyYmKHRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHM9YSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9fV9jaGVja1Njcm9sbGluZ0NvbnRyb2xzKCl7dGhpcy5kaXNhYmxlUGFnaW5hdGlvbj90aGlzLl9kaXNhYmxlU2Nyb2xsQWZ0ZXI9dGhpcy5fZGlzYWJsZVNjcm9sbEJlZm9yZT0hMDoodGhpcy5fZGlzYWJsZVNjcm9sbEJlZm9yZT10aGlzLnNjcm9sbERpc3RhbmNlPT0wLHRoaXMuX2Rpc2FibGVTY3JvbGxBZnRlcj10aGlzLnNjcm9sbERpc3RhbmNlPT10aGlzLl9nZXRNYXhTY3JvbGxEaXN0YW5jZSgpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX1fZ2V0TWF4U2Nyb2xsRGlzdGFuY2UoKXtsZXQgZT10aGlzLl90YWJMaXN0SW5uZXIubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aCxpPXRoaXMuX3RhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtyZXR1cm4gZS1pfHwwfV9hbGlnbklua0JhclRvU2VsZWN0ZWRUYWIoKXtsZXQgZT10aGlzLl9pdGVtcyYmdGhpcy5faXRlbXMubGVuZ3RoP3RoaXMuX2l0ZW1zLnRvQXJyYXkoKVt0aGlzLnNlbGVjdGVkSW5kZXhdOm51bGwsaT1lP2UuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Om51bGw7aT90aGlzLl9pbmtCYXIuYWxpZ25Ub0VsZW1lbnQoaSk6dGhpcy5faW5rQmFyLmhpZGUoKX1fc3RvcEludGVydmFsKCl7dGhpcy5fc3RvcFNjcm9sbGluZy5uZXh0KCl9X2hhbmRsZVBhZ2luYXRvclByZXNzKGUsaSl7aSYmaS5idXR0b24hPW51bGwmJmkuYnV0dG9uIT09MHx8KHRoaXMuX3N0b3BJbnRlcnZhbCgpLFRkKGlJLGFJKS5waXBlKHh0KEt0KHRoaXMuX3N0b3BTY3JvbGxpbmcsdGhpcy5fZGVzdHJveWVkKSkpLnN1YnNjcmliZSgoKT0+e2xldHttYXhTY3JvbGxEaXN0YW5jZTphLGRpc3RhbmNlOnJ9PXRoaXMuX3Njcm9sbEhlYWRlcihlKTsocj09PTB8fHI+PWEpJiZ0aGlzLl9zdG9wSW50ZXJ2YWwoKX0pKX1fc2Nyb2xsVG8oZSl7aWYodGhpcy5kaXNhYmxlUGFnaW5hdGlvbilyZXR1cm57bWF4U2Nyb2xsRGlzdGFuY2U6MCxkaXN0YW5jZTowfTtsZXQgaT10aGlzLl9nZXRNYXhTY3JvbGxEaXN0YW5jZSgpO3JldHVybiB0aGlzLl9zY3JvbGxEaXN0YW5jZT1NYXRoLm1heCgwLE1hdGgubWluKGksZSkpLHRoaXMuX3Njcm9sbERpc3RhbmNlQ2hhbmdlZD0hMCx0aGlzLl9jaGVja1Njcm9sbGluZ0NvbnRyb2xzKCkse21heFNjcm9sbERpc3RhbmNlOmksZGlzdGFuY2U6dGhpcy5fc2Nyb2xsRGlzdGFuY2V9fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsaW5wdXRzOntkaXNhYmxlUGFnaW5hdGlvbjpbMiwiZGlzYWJsZVBhZ2luYXRpb24iLCJkaXNhYmxlUGFnaW5hdGlvbiIsWl0sc2VsZWN0ZWRJbmRleDpbMiwic2VsZWN0ZWRJbmRleCIsInNlbGVjdGVkSW5kZXgiLG90XX0sb3V0cHV0czp7c2VsZWN0Rm9jdXNlZEluZGV4OiJzZWxlY3RGb2N1c2VkSW5kZXgiLGluZGV4Rm9jdXNlZDoiaW5kZXhGb2N1c2VkIn19KX1yZXR1cm4gdH0pKCksckk9KCgpPT57Y2xhc3MgdCBleHRlbmRzIG5Je19pdGVtcztfdGFiTGlzdENvbnRhaW5lcjtfdGFiTGlzdDtfdGFiTGlzdElubmVyO19uZXh0UGFnaW5hdG9yO19wcmV2aW91c1BhZ2luYXRvcjtfaW5rQmFyO2FyaWFMYWJlbDthcmlhTGFiZWxsZWRieTtkaXNhYmxlUmlwcGxlPSExO25nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2lua0Jhcj1uZXcgUzgodGhpcy5faXRlbXMpLHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpfV9pdGVtU2VsZWN0ZWQoZSl7ZS5wcmV2ZW50RGVmYXVsdCgpfXN0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IGU7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybihlfHwoZT1rdCh0KSkpKGF8fHQpfX0pKCk7c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC10YWItaGVhZGVyIl1dLGNvbnRlbnRRdWVyaWVzOmZ1bmN0aW9uKGksYSxyKXtpZihpJjEmJkJlKHIsQXUsNCksaSYyKXtsZXQgbztGKG89QigpKSYmKGEuX2l0ZW1zPW8pfX0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiYodGUoSEQsNyksdGUoTkQsNyksdGUoUkQsNyksdGUoRkQsNSksdGUoQkQsNSkpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLl90YWJMaXN0Q29udGFpbmVyPXIuZmlyc3QpLEYocj1CKCkpJiYoYS5fdGFiTGlzdD1yLmZpcnN0KSxGKHI9QigpKSYmKGEuX3RhYkxpc3RJbm5lcj1yLmZpcnN0KSxGKHI9QigpKSYmKGEuX25leHRQYWdpbmF0b3I9ci5maXJzdCksRihyPUIoKSkmJihhLl9wcmV2aW91c1BhZ2luYXRvcj1yLmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LW1kYy10YWItaGVhZGVyIl0saG9zdFZhcnM6NCxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJmllKCJtYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIixhLl9zaG93UGFnaW5hdGlvbkNvbnRyb2xzKSgibWF0LW1kYy10YWItaGVhZGVyLXJ0bCIsYS5fZ2V0TGF5b3V0RGlyZWN0aW9uKCk9PSJydGwiKX0saW5wdXRzOnthcmlhTGFiZWw6WzAsImFyaWEtbGFiZWwiLCJhcmlhTGFiZWwiXSxhcmlhTGFiZWxsZWRieTpbMCwiYXJpYS1sYWJlbGxlZGJ5IiwiYXJpYUxhYmVsbGVkYnkiXSxkaXNhYmxlUmlwcGxlOlsyLCJkaXNhYmxlUmlwcGxlIiwiZGlzYWJsZVJpcHBsZSIsWl19LGZlYXR1cmVzOltGZV0sbmdDb250ZW50U2VsZWN0b3JzOlQ4LGRlY2xzOjEzLHZhcnM6MTAsY29uc3RzOltbInByZXZpb3VzUGFnaW5hdG9yIiwiIl0sWyJ0YWJMaXN0Q29udGFpbmVyIiwiIl0sWyJ0YWJMaXN0IiwiIl0sWyJ0YWJMaXN0SW5uZXIiLCIiXSxbIm5leHRQYWdpbmF0b3IiLCIiXSxbIm1hdC1yaXBwbGUiLCIiLDEsIm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uIiwibWF0LW1kYy10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIiwzLCJjbGljayIsIm1vdXNlZG93biIsInRvdWNoZW5kIiwibWF0UmlwcGxlRGlzYWJsZWQiXSxbMSwibWF0LW1kYy10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiJdLFsxLCJtYXQtbWRjLXRhYi1sYWJlbC1jb250YWluZXIiLDMsImtleWRvd24iXSxbInJvbGUiLCJ0YWJsaXN0IiwxLCJtYXQtbWRjLXRhYi1saXN0IiwzLCJjZGtPYnNlcnZlQ29udGVudCJdLFsxLCJtYXQtbWRjLXRhYi1sYWJlbHMiXSxbIm1hdC1yaXBwbGUiLCIiLDEsIm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uIiwibWF0LW1kYy10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIiLDMsIm1vdXNlZG93biIsImNsaWNrIiwidG91Y2hlbmQiLCJtYXRSaXBwbGVEaXNhYmxlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO1JlKCksYygwLCJkaXYiLDUsMCksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLl9oYW5kbGVQYWdpbmF0b3JDbGljaygiYmVmb3JlIikpfSkoIm1vdXNlZG93biIsZnVuY3Rpb24oZCl7cmV0dXJuIHoociksVChhLl9oYW5kbGVQYWdpbmF0b3JQcmVzcygiYmVmb3JlIixkKSl9KSgidG91Y2hlbmQiLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLl9zdG9wSW50ZXJ2YWwoKSl9KSx1KDIsImRpdiIsNikscygpLGMoMywiZGl2Iiw3LDEpLFMoImtleWRvd24iLGZ1bmN0aW9uKGQpe3JldHVybiB6KHIpLFQoYS5faGFuZGxlS2V5ZG93bihkKSl9KSxjKDUsImRpdiIsOCwyKSxTKCJjZGtPYnNlcnZlQ29udGVudCIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuX29uQ29udGVudENoYW5nZXMoKSl9KSxjKDcsImRpdiIsOSwzKSxtZSg5KSxzKCkoKSgpLGMoMTAsImRpdiIsMTAsNCksUygibW91c2Vkb3duIixmdW5jdGlvbihkKXtyZXR1cm4geihyKSxUKGEuX2hhbmRsZVBhZ2luYXRvclByZXNzKCJhZnRlciIsZCkpfSkoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5faGFuZGxlUGFnaW5hdG9yQ2xpY2soImFmdGVyIikpfSkoInRvdWNoZW5kIixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5fc3RvcEludGVydmFsKCkpfSksdSgxMiwiZGl2Iiw2KSxzKCl9aSYyJiYoaWUoIm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIixhLl9kaXNhYmxlU2Nyb2xsQmVmb3JlKSxmKCJtYXRSaXBwbGVEaXNhYmxlZCIsYS5fZGlzYWJsZVNjcm9sbEJlZm9yZXx8YS5kaXNhYmxlUmlwcGxlKSxsKDMpLGllKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsYS5fYW5pbWF0aW9uc0Rpc2FibGVkKSxsKDIpLEcoImFyaWEtbGFiZWwiLGEuYXJpYUxhYmVsfHxudWxsKSgiYXJpYS1sYWJlbGxlZGJ5IixhLmFyaWFMYWJlbGxlZGJ5fHxudWxsKSxsKDUpLGllKCJtYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCIsYS5fZGlzYWJsZVNjcm9sbEFmdGVyKSxmKCJtYXRSaXBwbGVEaXNhYmxlZCIsYS5fZGlzYWJsZVNjcm9sbEFmdGVyfHxhLmRpc2FibGVSaXBwbGUpKX0sZGVwZW5kZW5jaWVzOltMMSxNMF0sc3R5bGVzOltgLm1hdC1tZGMtdGFiLWhlYWRlcntkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtc2hyaW5rOjB9Lm1kYy10YWItaW5kaWNhdG9yIC5tZGMtdGFiLWluZGljYXRvcl9fY29udGVudHt0cmFuc2l0aW9uLWR1cmF0aW9uOnZhcigtLW1hdC10YWItYW5pbWF0aW9uLWR1cmF0aW9uLCAyNTBtcyl9Lm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6bm9uZTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjttaW4td2lkdGg6MzJweDtjdXJzb3I6cG9pbnRlcjt6LWluZGV4OjI7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsMCk7dG91Y2gtYWN0aW9uOm5vbmU7Ym94LXNpemluZzpjb250ZW50LWJveDtvdXRsaW5lOjB9Lm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50e29wYWNpdHk6LjEyO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXRhYi1pbmFjdGl2ZS1yaXBwbGUtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfS5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIC5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbntkaXNwbGF5OmZsZXh9Lm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSwubWF0LW1kYy10YWItaGVhZGVyLXJ0bCAubWF0LW1kYy10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXJ7cGFkZGluZy1sZWZ0OjRweH0ubWF0LW1kYy10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIC5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtbWRjLXRhYi1oZWFkZXItcnRsIC5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciAubWF0LW1kYy10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbnt0cmFuc2Zvcm06cm90YXRlKC0xMzVkZWcpfS5tYXQtbWRjLXRhYi1oZWFkZXItcnRsIC5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUsLm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVye3BhZGRpbmctcmlnaHQ6NHB4fS5tYXQtbWRjLXRhYi1oZWFkZXItcnRsIC5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUgLm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIC5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MnB4IDJweCAwIDA7aGVpZ2h0OjhweDt3aWR0aDo4cHg7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC10YWItcGFnaW5hdGlvbi1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWF0LW1kYy10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWR7Ym94LXNoYWRvdzpub25lO2N1cnNvcjpkZWZhdWx0O3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue29wYWNpdHk6LjR9Lm1hdC1tZGMtdGFiLWxpc3R7ZmxleC1ncm93OjE7cG9zaXRpb246cmVsYXRpdmU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LW1kYy10YWItbGlzdHt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1tZGMtdGFiLWxhYmVsLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVuO3otaW5kZXg6MTtib3JkZXItYm90dG9tLXN0eWxlOnNvbGlkO2JvcmRlci1ib3R0b20td2lkdGg6dmFyKC0tbWF0LXRhYi1kaXZpZGVyLWhlaWdodCwgMXB4KTtib3JkZXItYm90dG9tLWNvbG9yOnZhcigtLW1hdC10YWItZGl2aWRlci1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlLXZhcmlhbnQpKX0ubWF0LW1kYy10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtbWRjLXRhYi1sYWJlbC1jb250YWluZXJ7Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3Atc3R5bGU6c29saWQ7Ym9yZGVyLXRvcC13aWR0aDp2YXIoLS1tYXQtdGFiLWRpdmlkZXItaGVpZ2h0LCAxcHgpO2JvcmRlci10b3AtY29sb3I6dmFyKC0tbWF0LXRhYi1kaXZpZGVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXN1cmZhY2UtdmFyaWFudCkpfS5tYXQtbWRjLXRhYi1sYWJlbHN7ZGlzcGxheTpmbGV4O2ZsZXg6MSAwIGF1dG99W21hdC1hbGlnbi10YWJzPWNlbnRlcl0+Lm1hdC1tZGMtdGFiLWhlYWRlciAubWF0LW1kYy10YWItbGFiZWxze2p1c3RpZnktY29udGVudDpjZW50ZXJ9W21hdC1hbGlnbi10YWJzPWVuZF0+Lm1hdC1tZGMtdGFiLWhlYWRlciAubWF0LW1kYy10YWItbGFiZWxze2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uY2RrLWRyb3AtbGlzdCAubWF0LW1kYy10YWItbGFiZWxzLC5tYXQtbWRjLXRhYi1sYWJlbHMuY2RrLWRyb3AtbGlzdHttaW4taGVpZ2h0OnZhcigtLW1hdC10YWItY29udGFpbmVyLWhlaWdodCwgNDhweCl9Lm1hdC1tZGMtdGFiOjpiZWZvcmV7bWFyZ2luOjVweH1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWF0LW1kYy10YWJbYXJpYS1kaXNhYmxlZD10cnVlXXtjb2xvcjpHcmF5VGV4dH19CmBdLGVuY2Fwc3VsYXRpb246Mn0pfXJldHVybiB0fSkoKSxvST1uZXcgY2UoIk1BVF9UQUJTX0NPTkZJRyIpLHp1PSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBLaXtfaG9zdD1oKGs4KTtfbmdab25lPWgocmUpO19jZW50ZXJpbmdTdWI9bzEuRU1QVFk7X2xlYXZpbmdTdWI9bzEuRU1QVFk7Y29uc3RydWN0b3IoKXtzdXBlcigpfW5nT25Jbml0KCl7c3VwZXIubmdPbkluaXQoKSx0aGlzLl9jZW50ZXJpbmdTdWI9dGhpcy5faG9zdC5fYmVmb3JlQ2VudGVyaW5nLnBpcGUoaTEodGhpcy5faG9zdC5faXNDZW50ZXJQb3NpdGlvbigpKSkuc3Vic2NyaWJlKGU9Pnt0aGlzLl9ob3N0Ll9jb250ZW50JiZlJiYhdGhpcy5oYXNBdHRhY2hlZCgpJiZ0aGlzLl9uZ1pvbmUucnVuKCgpPT57UHJvbWlzZS5yZXNvbHZlKCkudGhlbigpLHRoaXMuYXR0YWNoKHRoaXMuX2hvc3QuX2NvbnRlbnQpfSl9KSx0aGlzLl9sZWF2aW5nU3ViPXRoaXMuX2hvc3QuX2FmdGVyTGVhdmluZ0NlbnRlci5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9ob3N0LnByZXNlcnZlQ29udGVudHx8dGhpcy5fbmdab25lLnJ1bigoKT0+dGhpcy5kZXRhY2goKSl9KX1uZ09uRGVzdHJveSgpe3N1cGVyLm5nT25EZXN0cm95KCksdGhpcy5fY2VudGVyaW5nU3ViLnVuc3Vic2NyaWJlKCksdGhpcy5fbGVhdmluZ1N1Yi51bnN1YnNjcmliZSgpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsIm1hdFRhYkJvZHlIb3N0IiwiIl1dLGZlYXR1cmVzOltGZV19KX1yZXR1cm4gdH0pKCksazg9KCgpPT57Y2xhc3MgdHtfZWxlbWVudFJlZj1oKGFlKTtfZGlyPWgobjEse29wdGlvbmFsOiEwfSk7X25nWm9uZT1oKHJlKTtfaW5qZWN0b3I9aChzdCk7X3JlbmRlcmVyPWgodjEpO19kaUFuaW1hdGlvbnNEaXNhYmxlZD1QdCgpO19ldmVudENsZWFudXBzO19pbml0aWFsaXplZDtfZmFsbGJhY2tUaW1lcjtfcG9zaXRpb25JbmRleDtfZGlyQ2hhbmdlU3Vic2NyaXB0aW9uPW8xLkVNUFRZO19wb3NpdGlvbjtfcHJldmlvdXNQb3NpdGlvbjtfb25DZW50ZXJpbmc9bmV3IE47X2JlZm9yZUNlbnRlcmluZz1uZXcgTjtfYWZ0ZXJMZWF2aW5nQ2VudGVyPW5ldyBOO19vbkNlbnRlcmVkPW5ldyBOKCEwKTtfcG9ydGFsSG9zdDtfY29udGVudEVsZW1lbnQ7X2NvbnRlbnQ7YW5pbWF0aW9uRHVyYXRpb249IjUwMG1zIjtwcmVzZXJ2ZUNvbnRlbnQ9ITE7c2V0IHBvc2l0aW9uKGUpe3RoaXMuX3Bvc2l0aW9uSW5kZXg9ZSx0aGlzLl9jb21wdXRlUG9zaXRpb25BbmltYXRpb25TdGF0ZSgpfWNvbnN0cnVjdG9yKCl7aWYodGhpcy5fZGlyKXtsZXQgZT1oKEVlKTt0aGlzLl9kaXJDaGFuZ2VTdWJzY3JpcHRpb249dGhpcy5fZGlyLmNoYW5nZS5zdWJzY3JpYmUoaT0+e3RoaXMuX2NvbXB1dGVQb3NpdGlvbkFuaW1hdGlvblN0YXRlKGkpLGUubWFya0ZvckNoZWNrKCl9KX19bmdPbkluaXQoKXt0aGlzLl9iaW5kVHJhbnNpdGlvbkV2ZW50cygpLHRoaXMuX3Bvc2l0aW9uPT09ImNlbnRlciImJih0aGlzLl9zZXRBY3RpdmVDbGFzcyghMCksbTEoKCk9PnRoaXMuX29uQ2VudGVyaW5nLmVtaXQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCkse2luamVjdG9yOnRoaXMuX2luamVjdG9yfSkpLHRoaXMuX2luaXRpYWxpemVkPSEwfW5nT25EZXN0cm95KCl7Y2xlYXJUaW1lb3V0KHRoaXMuX2ZhbGxiYWNrVGltZXIpLHRoaXMuX2V2ZW50Q2xlYW51cHM/LmZvckVhY2goZT0+ZSgpKSx0aGlzLl9kaXJDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKX1fYmluZFRyYW5zaXRpb25FdmVudHMoKXt0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntsZXQgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsaT1hPT57YS50YXJnZXQ9PT10aGlzLl9jb250ZW50RWxlbWVudD8ubmF0aXZlRWxlbWVudCYmKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJtYXQtdGFiLWJvZHktYW5pbWF0aW5nIiksYS50eXBlPT09InRyYW5zaXRpb25lbmQiJiZ0aGlzLl90cmFuc2l0aW9uRG9uZSgpKX07dGhpcy5fZXZlbnRDbGVhbnVwcz1bdGhpcy5fcmVuZGVyZXIubGlzdGVuKGUsInRyYW5zaXRpb25zdGFydCIsYT0+e2EudGFyZ2V0PT09dGhpcy5fY29udGVudEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQmJih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgibWF0LXRhYi1ib2R5LWFuaW1hdGluZyIpLHRoaXMuX3RyYW5zaXRpb25TdGFydGVkKCkpfSksdGhpcy5fcmVuZGVyZXIubGlzdGVuKGUsInRyYW5zaXRpb25lbmQiLGkpLHRoaXMuX3JlbmRlcmVyLmxpc3RlbihlLCJ0cmFuc2l0aW9uY2FuY2VsIixpKV19KX1fdHJhbnNpdGlvblN0YXJ0ZWQoKXtjbGVhclRpbWVvdXQodGhpcy5fZmFsbGJhY2tUaW1lcik7bGV0IGU9dGhpcy5fcG9zaXRpb249PT0iY2VudGVyIjt0aGlzLl9iZWZvcmVDZW50ZXJpbmcuZW1pdChlKSxlJiZ0aGlzLl9vbkNlbnRlcmluZy5lbWl0KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQpfV90cmFuc2l0aW9uRG9uZSgpe3RoaXMuX3Bvc2l0aW9uPT09ImNlbnRlciI/dGhpcy5fb25DZW50ZXJlZC5lbWl0KCk6dGhpcy5fcHJldmlvdXNQb3NpdGlvbj09PSJjZW50ZXIiJiZ0aGlzLl9hZnRlckxlYXZpbmdDZW50ZXIuZW1pdCgpfV9zZXRBY3RpdmVDbGFzcyhlKXt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgibWF0LW1kYy10YWItYm9keS1hY3RpdmUiLGUpfV9nZXRMYXlvdXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlyJiZ0aGlzLl9kaXIudmFsdWU9PT0icnRsIj8icnRsIjoibHRyIn1faXNDZW50ZXJQb3NpdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvbkluZGV4PT09MH1fY29tcHV0ZVBvc2l0aW9uQW5pbWF0aW9uU3RhdGUoZT10aGlzLl9nZXRMYXlvdXREaXJlY3Rpb24oKSl7dGhpcy5fcHJldmlvdXNQb3NpdGlvbj10aGlzLl9wb3NpdGlvbix0aGlzLl9wb3NpdGlvbkluZGV4PDA/dGhpcy5fcG9zaXRpb249ZT09Imx0ciI/ImxlZnQiOiJyaWdodCI6dGhpcy5fcG9zaXRpb25JbmRleD4wP3RoaXMuX3Bvc2l0aW9uPWU9PSJsdHIiPyJyaWdodCI6ImxlZnQiOnRoaXMuX3Bvc2l0aW9uPSJjZW50ZXIiLHRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZCgpP3RoaXMuX3NpbXVsYXRlVHJhbnNpdGlvbkV2ZW50cygpOnRoaXMuX2luaXRpYWxpemVkJiYodGhpcy5fcG9zaXRpb249PT0iY2VudGVyInx8dGhpcy5fcHJldmlvdXNQb3NpdGlvbj09PSJjZW50ZXIiKSYmKGNsZWFyVGltZW91dCh0aGlzLl9mYWxsYmFja1RpbWVyKSx0aGlzLl9mYWxsYmFja1RpbWVyPXRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+c2V0VGltZW91dCgoKT0+dGhpcy5fc2ltdWxhdGVUcmFuc2l0aW9uRXZlbnRzKCksMTAwKSkpfV9zaW11bGF0ZVRyYW5zaXRpb25FdmVudHMoKXt0aGlzLl90cmFuc2l0aW9uU3RhcnRlZCgpLG0xKCgpPT50aGlzLl90cmFuc2l0aW9uRG9uZSgpLHtpbmplY3Rvcjp0aGlzLl9pbmplY3Rvcn0pfV9hbmltYXRpb25zRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fZGlBbmltYXRpb25zRGlzYWJsZWR8fHRoaXMuYW5pbWF0aW9uRHVyYXRpb249PT0iMG1zInx8dGhpcy5hbmltYXRpb25EdXJhdGlvbj09PSIwcyJ9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LXRhYi1ib2R5Il1dLHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKHRlKHp1LDUpLHRlKFVELDUpKSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5fcG9ydGFsSG9zdD1yLmZpcnN0KSxGKHI9QigpKSYmKGEuX2NvbnRlbnRFbGVtZW50PXIuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtbWRjLXRhYi1ib2R5Il0saG9zdFZhcnM6MSxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJkcoImluZXJ0IixhLl9wb3NpdGlvbj09PSJjZW50ZXIiP251bGw6IiIpfSxpbnB1dHM6e19jb250ZW50OlswLCJjb250ZW50IiwiX2NvbnRlbnQiXSxhbmltYXRpb25EdXJhdGlvbjoiYW5pbWF0aW9uRHVyYXRpb24iLHByZXNlcnZlQ29udGVudDoicHJlc2VydmVDb250ZW50Iixwb3NpdGlvbjoicG9zaXRpb24ifSxvdXRwdXRzOntfb25DZW50ZXJpbmc6Il9vbkNlbnRlcmluZyIsX2JlZm9yZUNlbnRlcmluZzoiX2JlZm9yZUNlbnRlcmluZyIsX29uQ2VudGVyZWQ6Il9vbkNlbnRlcmVkIn0sZGVjbHM6Myx2YXJzOjYsY29uc3RzOltbImNvbnRlbnQiLCIiXSxbImNka1Njcm9sbGFibGUiLCIiLDEsIm1hdC1tZGMtdGFiLWJvZHktY29udGVudCJdLFsibWF0VGFiQm9keUhvc3QiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsImRpdiIsMSwwKSxSKDIsakQsMCwwLCJuZy10ZW1wbGF0ZSIsMikscygpKSxpJjImJmllKCJtYXQtdGFiLWJvZHktY29udGVudC1sZWZ0IixhLl9wb3NpdGlvbj09PSJsZWZ0IikoIm1hdC10YWItYm9keS1jb250ZW50LXJpZ2h0IixhLl9wb3NpdGlvbj09PSJyaWdodCIpKCJtYXQtdGFiLWJvZHktY29udGVudC1jYW4tYW5pbWF0ZSIsYS5fcG9zaXRpb249PT0iY2VudGVyInx8YS5fcHJldmlvdXNQb3NpdGlvbj09PSJjZW50ZXIiKX0sZGVwZW5kZW5jaWVzOlt6dSxoMl0sc3R5bGVzOltgLm1hdC1tZGMtdGFiLWJvZHl7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47b3V0bGluZTowO2ZsZXgtYmFzaXM6MTAwJX0ubWF0LW1kYy10YWItYm9keS5tYXQtbWRjLXRhYi1ib2R5LWFjdGl2ZXtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87ei1pbmRleDoxO2ZsZXgtZ3JvdzoxfS5tYXQtbWRjLXRhYi1ncm91cC5tYXQtbWRjLXRhYi1ncm91cC1keW5hbWljLWhlaWdodCAubWF0LW1kYy10YWItYm9keS5tYXQtbWRjLXRhYi1ib2R5LWFjdGl2ZXtvdmVyZmxvdy15OmhpZGRlbn0ubWF0LW1kYy10YWItYm9keS1jb250ZW50e2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG87dHJhbnNmb3JtOm5vbmU7dmlzaWJpbGl0eTpoaWRkZW59Lm1hdC10YWItYm9keS1hbmltYXRpbmc+Lm1hdC1tZGMtdGFiLWJvZHktY29udGVudCwubWF0LW1kYy10YWItYm9keS1hY3RpdmU+Lm1hdC1tZGMtdGFiLWJvZHktY29udGVudHt2aXNpYmlsaXR5OnZpc2libGV9Lm1hdC10YWItYm9keS1hbmltYXRpbmc+Lm1hdC1tZGMtdGFiLWJvZHktY29udGVudHttaW4taGVpZ2h0OjFweH0ubWF0LW1kYy10YWItZ3JvdXAtZHluYW1pYy1oZWlnaHQgLm1hdC1tZGMtdGFiLWJvZHktY29udGVudHtvdmVyZmxvdzpoaWRkZW59Lm1hdC10YWItYm9keS1jb250ZW50LWNhbi1hbmltYXRle3RyYW5zaXRpb246dHJhbnNmb3JtIHZhcigtLW1hdC10YWItYW5pbWF0aW9uLWR1cmF0aW9uKSAxbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5tYXQtbWRjLXRhYi1ib2R5LXdyYXBwZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC10YWItYm9keS1jb250ZW50LWNhbi1hbmltYXRle3RyYW5zaXRpb246bm9uZX0ubWF0LXRhYi1ib2R5LWNvbnRlbnQtbGVmdHt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApfS5tYXQtdGFiLWJvZHktY29udGVudC1yaWdodHt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwgMCwgMCl9CmBdLGVuY2Fwc3VsYXRpb246Mn0pfXJldHVybiB0fSkoKSxEdT0oKCk9PntjbGFzcyB0e19lbGVtZW50UmVmPWgoYWUpO19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtfbmdab25lPWgocmUpO190YWJzU3Vic2NyaXB0aW9uPW8xLkVNUFRZO190YWJMYWJlbFN1YnNjcmlwdGlvbj1vMS5FTVBUWTtfdGFiQm9keVN1YnNjcmlwdGlvbj1vMS5FTVBUWTtfZGlBbmltYXRpb25zRGlzYWJsZWQ9UHQoKTtfYWxsVGFicztfdGFiQm9kaWVzO190YWJCb2R5V3JhcHBlcjtfdGFiSGVhZGVyO190YWJzPW5ldyBFMjtfaW5kZXhUb1NlbGVjdD0wO19sYXN0Rm9jdXNlZFRhYkluZGV4PW51bGw7X3RhYkJvZHlXcmFwcGVySGVpZ2h0PTA7Y29sb3I7Z2V0IGZpdElua0JhclRvQ29udGVudCgpe3JldHVybiB0aGlzLl9maXRJbmtCYXJUb0NvbnRlbnR9c2V0IGZpdElua0JhclRvQ29udGVudChlKXt0aGlzLl9maXRJbmtCYXJUb0NvbnRlbnQ9ZSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1fZml0SW5rQmFyVG9Db250ZW50PSExO3N0cmV0Y2hUYWJzPSEwO2FsaWduVGFicz1udWxsO2R5bmFtaWNIZWlnaHQ9ITE7Z2V0IHNlbGVjdGVkSW5kZXgoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWRJbmRleH1zZXQgc2VsZWN0ZWRJbmRleChlKXt0aGlzLl9pbmRleFRvU2VsZWN0PWlzTmFOKGUpP251bGw6ZX1fc2VsZWN0ZWRJbmRleD1udWxsO2hlYWRlclBvc2l0aW9uPSJhYm92ZSI7Z2V0IGFuaW1hdGlvbkR1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbkR1cmF0aW9ufXNldCBhbmltYXRpb25EdXJhdGlvbihlKXtsZXQgaT1lKyIiO3RoaXMuX2FuaW1hdGlvbkR1cmF0aW9uPS9eXGQrJC8udGVzdChpKT9lKyJtcyI6aX1fYW5pbWF0aW9uRHVyYXRpb247Z2V0IGNvbnRlbnRUYWJJbmRleCgpe3JldHVybiB0aGlzLl9jb250ZW50VGFiSW5kZXh9c2V0IGNvbnRlbnRUYWJJbmRleChlKXt0aGlzLl9jb250ZW50VGFiSW5kZXg9aXNOYU4oZSk/bnVsbDplfV9jb250ZW50VGFiSW5kZXg7ZGlzYWJsZVBhZ2luYXRpb249ITE7ZGlzYWJsZVJpcHBsZT0hMTtwcmVzZXJ2ZUNvbnRlbnQ9ITE7Z2V0IGJhY2tncm91bmRDb2xvcigpe3JldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3J9c2V0IGJhY2tncm91bmRDb2xvcihlKXtsZXQgaT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0O2kucmVtb3ZlKCJtYXQtdGFicy13aXRoLWJhY2tncm91bmQiLGBtYXQtYmFja2dyb3VuZC0ke3RoaXMuYmFja2dyb3VuZENvbG9yfWApLGUmJmkuYWRkKCJtYXQtdGFicy13aXRoLWJhY2tncm91bmQiLGBtYXQtYmFja2dyb3VuZC0ke2V9YCksdGhpcy5fYmFja2dyb3VuZENvbG9yPWV9X2JhY2tncm91bmRDb2xvcjthcmlhTGFiZWw7YXJpYUxhYmVsbGVkYnk7c2VsZWN0ZWRJbmRleENoYW5nZT1uZXcgTjtmb2N1c0NoYW5nZT1uZXcgTjthbmltYXRpb25Eb25lPW5ldyBOO3NlbGVjdGVkVGFiQ2hhbmdlPW5ldyBOKCEwKTtfZ3JvdXBJZDtfaXNTZXJ2ZXI9IWgoYjEpLmlzQnJvd3Nlcjtjb25zdHJ1Y3Rvcigpe2xldCBlPWgob0kse29wdGlvbmFsOiEwfSk7dGhpcy5fZ3JvdXBJZD1oKHF0KS5nZXRJZCgibWF0LXRhYi1ncm91cC0iKSx0aGlzLmFuaW1hdGlvbkR1cmF0aW9uPWUmJmUuYW5pbWF0aW9uRHVyYXRpb24/ZS5hbmltYXRpb25EdXJhdGlvbjoiNTAwbXMiLHRoaXMuZGlzYWJsZVBhZ2luYXRpb249ZSYmZS5kaXNhYmxlUGFnaW5hdGlvbiE9bnVsbD9lLmRpc2FibGVQYWdpbmF0aW9uOiExLHRoaXMuZHluYW1pY0hlaWdodD1lJiZlLmR5bmFtaWNIZWlnaHQhPW51bGw/ZS5keW5hbWljSGVpZ2h0OiExLGU/LmNvbnRlbnRUYWJJbmRleCE9bnVsbCYmKHRoaXMuY29udGVudFRhYkluZGV4PWUuY29udGVudFRhYkluZGV4KSx0aGlzLnByZXNlcnZlQ29udGVudD0hIWU/LnByZXNlcnZlQ29udGVudCx0aGlzLmZpdElua0JhclRvQ29udGVudD1lJiZlLmZpdElua0JhclRvQ29udGVudCE9bnVsbD9lLmZpdElua0JhclRvQ29udGVudDohMSx0aGlzLnN0cmV0Y2hUYWJzPWUmJmUuc3RyZXRjaFRhYnMhPW51bGw/ZS5zdHJldGNoVGFiczohMCx0aGlzLmFsaWduVGFicz1lJiZlLmFsaWduVGFicyE9bnVsbD9lLmFsaWduVGFiczpudWxsfW5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpe2xldCBlPXRoaXMuX2luZGV4VG9TZWxlY3Q9dGhpcy5fY2xhbXBUYWJJbmRleCh0aGlzLl9pbmRleFRvU2VsZWN0KTtpZih0aGlzLl9zZWxlY3RlZEluZGV4IT1lKXtsZXQgaT10aGlzLl9zZWxlY3RlZEluZGV4PT1udWxsO2lmKCFpKXt0aGlzLnNlbGVjdGVkVGFiQ2hhbmdlLmVtaXQodGhpcy5fY3JlYXRlQ2hhbmdlRXZlbnQoZSkpO2xldCBhPXRoaXMuX3RhYkJvZHlXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7YS5zdHlsZS5taW5IZWlnaHQ9YS5jbGllbnRIZWlnaHQrInB4In1Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT57dGhpcy5fdGFicy5mb3JFYWNoKChhLHIpPT5hLmlzQWN0aXZlPXI9PT1lKSxpfHwodGhpcy5zZWxlY3RlZEluZGV4Q2hhbmdlLmVtaXQoZSksdGhpcy5fdGFiQm9keVdyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5taW5IZWlnaHQ9IiIpfSl9dGhpcy5fdGFicy5mb3JFYWNoKChpLGEpPT57aS5wb3NpdGlvbj1hLWUsdGhpcy5fc2VsZWN0ZWRJbmRleCE9bnVsbCYmaS5wb3NpdGlvbj09MCYmIWkub3JpZ2luJiYoaS5vcmlnaW49ZS10aGlzLl9zZWxlY3RlZEluZGV4KX0pLHRoaXMuX3NlbGVjdGVkSW5kZXghPT1lJiYodGhpcy5fc2VsZWN0ZWRJbmRleD1lLHRoaXMuX2xhc3RGb2N1c2VkVGFiSW5kZXg9bnVsbCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9bmdBZnRlckNvbnRlbnRJbml0KCl7dGhpcy5fc3Vic2NyaWJlVG9BbGxUYWJDaGFuZ2VzKCksdGhpcy5fc3Vic2NyaWJlVG9UYWJMYWJlbHMoKSx0aGlzLl90YWJzU3Vic2NyaXB0aW9uPXRoaXMuX3RhYnMuY2hhbmdlcy5zdWJzY3JpYmUoKCk9PntsZXQgZT10aGlzLl9jbGFtcFRhYkluZGV4KHRoaXMuX2luZGV4VG9TZWxlY3QpO2lmKGU9PT10aGlzLl9zZWxlY3RlZEluZGV4KXtsZXQgaT10aGlzLl90YWJzLnRvQXJyYXkoKSxhO2ZvcihsZXQgcj0wO3I8aS5sZW5ndGg7cisrKWlmKGlbcl0uaXNBY3RpdmUpe3RoaXMuX2luZGV4VG9TZWxlY3Q9dGhpcy5fc2VsZWN0ZWRJbmRleD1yLHRoaXMuX2xhc3RGb2N1c2VkVGFiSW5kZXg9bnVsbCxhPWlbcl07YnJlYWt9IWEmJmlbZV0mJlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PntpW2VdLmlzQWN0aXZlPSEwLHRoaXMuc2VsZWN0ZWRUYWJDaGFuZ2UuZW1pdCh0aGlzLl9jcmVhdGVDaGFuZ2VFdmVudChlKSl9KX10aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX3RhYkJvZHlTdWJzY3JpcHRpb249dGhpcy5fdGFiQm9kaWVzLmNoYW5nZXMuc3Vic2NyaWJlKCgpPT50aGlzLl9ib2R5Q2VudGVyZWQoITApKX1fc3Vic2NyaWJlVG9BbGxUYWJDaGFuZ2VzKCl7dGhpcy5fYWxsVGFicy5jaGFuZ2VzLnBpcGUoaTEodGhpcy5fYWxsVGFicykpLnN1YnNjcmliZShlPT57dGhpcy5fdGFicy5yZXNldChlLmZpbHRlcihpPT5pLl9jbG9zZXN0VGFiR3JvdXA9PT10aGlzfHwhaS5fY2xvc2VzdFRhYkdyb3VwKSksdGhpcy5fdGFicy5ub3RpZnlPbkNoYW5nZXMoKX0pfW5nT25EZXN0cm95KCl7dGhpcy5fdGFicy5kZXN0cm95KCksdGhpcy5fdGFic1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3RhYkxhYmVsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fdGFiQm9keVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfXJlYWxpZ25JbmtCYXIoKXt0aGlzLl90YWJIZWFkZXImJnRoaXMuX3RhYkhlYWRlci5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCl9dXBkYXRlUGFnaW5hdGlvbigpe3RoaXMuX3RhYkhlYWRlciYmdGhpcy5fdGFiSGVhZGVyLnVwZGF0ZVBhZ2luYXRpb24oKX1mb2N1c1RhYihlKXtsZXQgaT10aGlzLl90YWJIZWFkZXI7aSYmKGkuZm9jdXNJbmRleD1lKX1fZm9jdXNDaGFuZ2VkKGUpe3RoaXMuX2xhc3RGb2N1c2VkVGFiSW5kZXg9ZSx0aGlzLmZvY3VzQ2hhbmdlLmVtaXQodGhpcy5fY3JlYXRlQ2hhbmdlRXZlbnQoZSkpfV9jcmVhdGVDaGFuZ2VFdmVudChlKXtsZXQgaT1uZXcgejg7cmV0dXJuIGkuaW5kZXg9ZSx0aGlzLl90YWJzJiZ0aGlzLl90YWJzLmxlbmd0aCYmKGkudGFiPXRoaXMuX3RhYnMudG9BcnJheSgpW2VdKSxpfV9zdWJzY3JpYmVUb1RhYkxhYmVscygpe3RoaXMuX3RhYkxhYmVsU3Vic2NyaXB0aW9uJiZ0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3RhYkxhYmVsU3Vic2NyaXB0aW9uPUt0KC4uLnRoaXMuX3RhYnMubWFwKGU9PmUuX3N0YXRlQ2hhbmdlcykpLnN1YnNjcmliZSgoKT0+dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfV9jbGFtcFRhYkluZGV4KGUpe3JldHVybiBNYXRoLm1pbih0aGlzLl90YWJzLmxlbmd0aC0xLE1hdGgubWF4KGV8fDAsMCkpfV9nZXRUYWJMYWJlbElkKGUsaSl7cmV0dXJuIGUuaWR8fGAke3RoaXMuX2dyb3VwSWR9LWxhYmVsLSR7aX1gfV9nZXRUYWJDb250ZW50SWQoZSl7cmV0dXJuYCR7dGhpcy5fZ3JvdXBJZH0tY29udGVudC0ke2V9YH1fc2V0VGFiQm9keVdyYXBwZXJIZWlnaHQoZSl7aWYoIXRoaXMuZHluYW1pY0hlaWdodHx8IXRoaXMuX3RhYkJvZHlXcmFwcGVySGVpZ2h0KXt0aGlzLl90YWJCb2R5V3JhcHBlckhlaWdodD1lO3JldHVybn1sZXQgaT10aGlzLl90YWJCb2R5V3JhcHBlci5uYXRpdmVFbGVtZW50O2kuc3R5bGUuaGVpZ2h0PXRoaXMuX3RhYkJvZHlXcmFwcGVySGVpZ2h0KyJweCIsdGhpcy5fdGFiQm9keVdyYXBwZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQmJihpLnN0eWxlLmhlaWdodD1lKyJweCIpfV9yZW1vdmVUYWJCb2R5V3JhcHBlckhlaWdodCgpe2xldCBlPXRoaXMuX3RhYkJvZHlXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7dGhpcy5fdGFiQm9keVdyYXBwZXJIZWlnaHQ9ZS5jbGllbnRIZWlnaHQsZS5zdHlsZS5oZWlnaHQ9IiIsdGhpcy5fbmdab25lLnJ1bigoKT0+dGhpcy5hbmltYXRpb25Eb25lLmVtaXQoKSl9X2hhbmRsZUNsaWNrKGUsaSxhKXtpLmZvY3VzSW5kZXg9YSxlLmRpc2FibGVkfHwodGhpcy5zZWxlY3RlZEluZGV4PWEpfV9nZXRUYWJJbmRleChlKXtsZXQgaT10aGlzLl9sYXN0Rm9jdXNlZFRhYkluZGV4Pz90aGlzLnNlbGVjdGVkSW5kZXg7cmV0dXJuIGU9PT1pPzA6LTF9X3RhYkZvY3VzQ2hhbmdlZChlLGkpe2UmJmUhPT0ibW91c2UiJiZlIT09InRvdWNoIiYmKHRoaXMuX3RhYkhlYWRlci5mb2N1c0luZGV4PWkpfV9ib2R5Q2VudGVyZWQoZSl7ZSYmdGhpcy5fdGFiQm9kaWVzPy5mb3JFYWNoKChpLGEpPT5pLl9zZXRBY3RpdmVDbGFzcyhhPT09dGhpcy5fc2VsZWN0ZWRJbmRleCkpfV9hbmltYXRpb25zRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fZGlBbmltYXRpb25zRGlzYWJsZWR8fHRoaXMuYW5pbWF0aW9uRHVyYXRpb249PT0iMCJ8fHRoaXMuYW5pbWF0aW9uRHVyYXRpb249PT0iMG1zIn1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJtYXQtdGFiLWdyb3VwIl1dLGNvbnRlbnRRdWVyaWVzOmZ1bmN0aW9uKGksYSxyKXtpZihpJjEmJkJlKHIsQTgsNSksaSYyKXtsZXQgbztGKG89QigpKSYmKGEuX2FsbFRhYnM9byl9fSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJih0ZShxRCw1KSx0ZShHRCw1KSx0ZShrOCw1KSksaSYyKXtsZXQgcjtGKHI9QigpKSYmKGEuX3RhYkJvZHlXcmFwcGVyPXIuZmlyc3QpLEYocj1CKCkpJiYoYS5fdGFiSGVhZGVyPXIuZmlyc3QpLEYocj1CKCkpJiYoYS5fdGFiQm9kaWVzPXIpfX0saG9zdEF0dHJzOlsxLCJtYXQtbWRjLXRhYi1ncm91cCJdLGhvc3RWYXJzOjExLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmKEcoIm1hdC1hbGlnbi10YWJzIixhLmFsaWduVGFicyksRHQoIm1hdC0iKyhhLmNvbG9yfHwicHJpbWFyeSIpKSxfdCgiLS1tYXQtdGFiLWFuaW1hdGlvbi1kdXJhdGlvbiIsYS5hbmltYXRpb25EdXJhdGlvbiksaWUoIm1hdC1tZGMtdGFiLWdyb3VwLWR5bmFtaWMtaGVpZ2h0IixhLmR5bmFtaWNIZWlnaHQpKCJtYXQtbWRjLXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIiLGEuaGVhZGVyUG9zaXRpb249PT0iYmVsb3ciKSgibWF0LW1kYy10YWItZ3JvdXAtc3RyZXRjaC10YWJzIixhLnN0cmV0Y2hUYWJzKSl9LGlucHV0czp7Y29sb3I6ImNvbG9yIixmaXRJbmtCYXJUb0NvbnRlbnQ6WzIsImZpdElua0JhclRvQ29udGVudCIsImZpdElua0JhclRvQ29udGVudCIsWl0sc3RyZXRjaFRhYnM6WzIsIm1hdC1zdHJldGNoLXRhYnMiLCJzdHJldGNoVGFicyIsWl0sYWxpZ25UYWJzOlswLCJtYXQtYWxpZ24tdGFicyIsImFsaWduVGFicyJdLGR5bmFtaWNIZWlnaHQ6WzIsImR5bmFtaWNIZWlnaHQiLCJkeW5hbWljSGVpZ2h0IixaXSxzZWxlY3RlZEluZGV4OlsyLCJzZWxlY3RlZEluZGV4Iiwic2VsZWN0ZWRJbmRleCIsb3RdLGhlYWRlclBvc2l0aW9uOiJoZWFkZXJQb3NpdGlvbiIsYW5pbWF0aW9uRHVyYXRpb246ImFuaW1hdGlvbkR1cmF0aW9uIixjb250ZW50VGFiSW5kZXg6WzIsImNvbnRlbnRUYWJJbmRleCIsImNvbnRlbnRUYWJJbmRleCIsb3RdLGRpc2FibGVQYWdpbmF0aW9uOlsyLCJkaXNhYmxlUGFnaW5hdGlvbiIsImRpc2FibGVQYWdpbmF0aW9uIixaXSxkaXNhYmxlUmlwcGxlOlsyLCJkaXNhYmxlUmlwcGxlIiwiZGlzYWJsZVJpcHBsZSIsWl0scHJlc2VydmVDb250ZW50OlsyLCJwcmVzZXJ2ZUNvbnRlbnQiLCJwcmVzZXJ2ZUNvbnRlbnQiLFpdLGJhY2tncm91bmRDb2xvcjoiYmFja2dyb3VuZENvbG9yIixhcmlhTGFiZWw6WzAsImFyaWEtbGFiZWwiLCJhcmlhTGFiZWwiXSxhcmlhTGFiZWxsZWRieTpbMCwiYXJpYS1sYWJlbGxlZGJ5IiwiYXJpYUxhYmVsbGVkYnkiXX0sb3V0cHV0czp7c2VsZWN0ZWRJbmRleENoYW5nZToic2VsZWN0ZWRJbmRleENoYW5nZSIsZm9jdXNDaGFuZ2U6ImZvY3VzQ2hhbmdlIixhbmltYXRpb25Eb25lOiJhbmltYXRpb25Eb25lIixzZWxlY3RlZFRhYkNoYW5nZToic2VsZWN0ZWRUYWJDaGFuZ2UifSxleHBvcnRBczpbIm1hdFRhYkdyb3VwIl0sZmVhdHVyZXM6W0llKFt7cHJvdmlkZTpFdSx1c2VFeGlzdGluZzp0fV0pXSxuZ0NvbnRlbnRTZWxlY3RvcnM6VDgsZGVjbHM6OSx2YXJzOjgsY29uc3RzOltbInRhYkhlYWRlciIsIiJdLFsidGFiQm9keVdyYXBwZXIiLCIiXSxbInRhYk5vZGUiLCIiXSxbMywiaW5kZXhGb2N1c2VkIiwic2VsZWN0Rm9jdXNlZEluZGV4Iiwic2VsZWN0ZWRJbmRleCIsImRpc2FibGVSaXBwbGUiLCJkaXNhYmxlUGFnaW5hdGlvbiIsImFyaWEtbGFiZWwiLCJhcmlhLWxhYmVsbGVkYnkiXSxbInJvbGUiLCJ0YWIiLCJtYXRUYWJMYWJlbFdyYXBwZXIiLCIiLCJjZGtNb25pdG9yRWxlbWVudEZvY3VzIiwiIiwxLCJtZGMtdGFiIiwibWF0LW1kYy10YWIiLCJtYXQtZm9jdXMtaW5kaWNhdG9yIiwzLCJpZCIsIm1kYy10YWItLWFjdGl2ZSIsImNsYXNzIiwiZGlzYWJsZWQiLCJmaXRJbmtCYXJUb0NvbnRlbnQiXSxbMSwibWF0LW1kYy10YWItYm9keS13cmFwcGVyIl0sWyJyb2xlIiwidGFicGFuZWwiLDMsImlkIiwiY2xhc3MiLCJjb250ZW50IiwicG9zaXRpb24iLCJhbmltYXRpb25EdXJhdGlvbiIsInByZXNlcnZlQ29udGVudCJdLFsicm9sZSIsInRhYiIsIm1hdFRhYkxhYmVsV3JhcHBlciIsIiIsImNka01vbml0b3JFbGVtZW50Rm9jdXMiLCIiLDEsIm1kYy10YWIiLCJtYXQtbWRjLXRhYiIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiLDMsImNsaWNrIiwiY2RrRm9jdXNDaGFuZ2UiLCJpZCIsImRpc2FibGVkIiwiZml0SW5rQmFyVG9Db250ZW50Il0sWzEsIm1kYy10YWJfX3JpcHBsZSJdLFsibWF0LXJpcHBsZSIsIiIsMSwibWF0LW1kYy10YWItcmlwcGxlIiwzLCJtYXRSaXBwbGVUcmlnZ2VyIiwibWF0UmlwcGxlRGlzYWJsZWQiXSxbMSwibWRjLXRhYl9fY29udGVudCJdLFsxLCJtZGMtdGFiX190ZXh0LWxhYmVsIl0sWzMsImNka1BvcnRhbE91dGxldCJdLFsicm9sZSIsInRhYnBhbmVsIiwzLCJfb25DZW50ZXJlZCIsIl9vbkNlbnRlcmluZyIsIl9iZWZvcmVDZW50ZXJpbmciLCJpZCIsImNvbnRlbnQiLCJwb3NpdGlvbiIsImFuaW1hdGlvbkR1cmF0aW9uIiwicHJlc2VydmVDb250ZW50Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aWYoaSYxKXtsZXQgcj1MKCk7UmUoKSxjKDAsIm1hdC10YWItaGVhZGVyIiwzLDApLFMoImluZGV4Rm9jdXNlZCIsZnVuY3Rpb24oZCl7cmV0dXJuIHoociksVChhLl9mb2N1c0NoYW5nZWQoZCkpfSkoInNlbGVjdEZvY3VzZWRJbmRleCIsZnVuY3Rpb24oZCl7cmV0dXJuIHoociksVChhLnNlbGVjdGVkSW5kZXg9ZCl9KSxxZSgyLFpELDgsMTcsImRpdiIsNCxGdCkscygpLE0oNCwkRCwxLDApLGMoNSwiZGl2Iiw1LDEpLHFlKDcsS0QsMSwxMCwibWF0LXRhYi1ib2R5Iiw2LEZ0KSxzKCl9aSYyJiYoZigic2VsZWN0ZWRJbmRleCIsYS5zZWxlY3RlZEluZGV4fHwwKSgiZGlzYWJsZVJpcHBsZSIsYS5kaXNhYmxlUmlwcGxlKSgiZGlzYWJsZVBhZ2luYXRpb24iLGEuZGlzYWJsZVBhZ2luYXRpb24pLFJhKCJhcmlhLWxhYmVsIixhLmFyaWFMYWJlbCkoImFyaWEtbGFiZWxsZWRieSIsYS5hcmlhTGFiZWxsZWRieSksbCgyKSxHZShhLl90YWJzKSxsKDIpLHcoYS5faXNTZXJ2ZXI/NDotMSksbCgpLGllKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsYS5fYW5pbWF0aW9uc0Rpc2FibGVkKCkpLGwoMiksR2UoYS5fdGFicykpfSxkZXBlbmRlbmNpZXM6W3JJLEF1LHgwLEwxLEtpLGs4XSxzdHlsZXM6W2AubWRjLXRhYnttaW4td2lkdGg6OTBweDtwYWRkaW5nOjAgMjRweDtkaXNwbGF5OmZsZXg7ZmxleDoxIDAgYXV0bztqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveDtib3JkZXI6bm9uZTtvdXRsaW5lOm5vbmU7dGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO2N1cnNvcjpwb2ludGVyO3otaW5kZXg6MTt0b3VjaC1hY3Rpb246bWFuaXB1bGF0aW9ufS5tZGMtdGFiX19jb250ZW50e2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtoZWlnaHQ6aW5oZXJpdDtwb2ludGVyLWV2ZW50czpub25lfS5tZGMtdGFiX190ZXh0LWxhYmVse3RyYW5zaXRpb246MTUwbXMgY29sb3IgbGluZWFyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjE7ei1pbmRleDoyfS5tZGMtdGFiLS1hY3RpdmUgLm1kYy10YWJfX3RleHQtbGFiZWx7dHJhbnNpdGlvbi1kZWxheToxMDBtc30uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1kYy10YWJfX3RleHQtbGFiZWx7dHJhbnNpdGlvbjpub25lfS5tZGMtdGFiLWluZGljYXRvcntkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtwb2ludGVyLWV2ZW50czpub25lO3otaW5kZXg6MX0ubWRjLXRhYi1pbmRpY2F0b3JfX2NvbnRlbnR7dHJhbnNpdGlvbjp2YXIoLS1tYXQtdGFiLWFuaW1hdGlvbi1kdXJhdGlvbiwgMjUwbXMpIHRyYW5zZm9ybSBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO3RyYW5zZm9ybS1vcmlnaW46bGVmdDtvcGFjaXR5OjB9Lm1kYy10YWItaW5kaWNhdG9yX19jb250ZW50LS11bmRlcmxpbmV7YWxpZ24tc2VsZjpmbGV4LWVuZDtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MTAwJTtib3JkZXItdG9wLXN0eWxlOnNvbGlkfS5tZGMtdGFiLWluZGljYXRvci0tYWN0aXZlIC5tZGMtdGFiLWluZGljYXRvcl9fY29udGVudHtvcGFjaXR5OjF9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tZGMtdGFiLWluZGljYXRvcl9fY29udGVudCwubWRjLXRhYi1pbmRpY2F0b3ItLW5vLXRyYW5zaXRpb24gLm1kYy10YWItaW5kaWNhdG9yX19jb250ZW50e3RyYW5zaXRpb246bm9uZX0ubWF0LW1kYy10YWItcmlwcGxlLm1hdC1tZGMtdGFiLXJpcHBsZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Ym90dG9tOjA7cmlnaHQ6MDtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtbWRjLXRhYnstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZTt0ZXh0LWRlY29yYXRpb246bm9uZTtiYWNrZ3JvdW5kOm5vbmU7aGVpZ2h0OnZhcigtLW1hdC10YWItY29udGFpbmVyLWhlaWdodCwgNDhweCk7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LXRhYi1sYWJlbC10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtdGl0bGUtc21hbGwtZm9udCkpO2ZvbnQtc2l6ZTp2YXIoLS1tYXQtdGFiLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy10aXRsZS1zbWFsbC1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LXRhYi1sYWJlbC10ZXh0LXRyYWNraW5nLCB2YXIoLS1tYXQtc3lzLXRpdGxlLXNtYWxsLXRyYWNraW5nKSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LXRhYi1sYWJlbC10ZXh0LWxpbmUtaGVpZ2h0LCB2YXIoLS1tYXQtc3lzLXRpdGxlLXNtYWxsLWxpbmUtaGVpZ2h0KSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LXRhYi1sYWJlbC10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy10aXRsZS1zbWFsbC13ZWlnaHQpKX0ubWF0LW1kYy10YWIubWRjLXRhYntmbGV4LWdyb3c6MH0ubWF0LW1kYy10YWIgLm1kYy10YWItaW5kaWNhdG9yX19jb250ZW50LS11bmRlcmxpbmV7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC10YWItYWN0aXZlLWluZGljYXRvci1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSk7Ym9yZGVyLXRvcC13aWR0aDp2YXIoLS1tYXQtdGFiLWFjdGl2ZS1pbmRpY2F0b3ItaGVpZ2h0LCAycHgpO2JvcmRlci1yYWRpdXM6dmFyKC0tbWF0LXRhYi1hY3RpdmUtaW5kaWNhdG9yLXNoYXBlLCAwKX0ubWF0LW1kYy10YWI6aG92ZXIgLm1kYy10YWJfX3RleHQtbGFiZWx7Y29sb3I6dmFyKC0tbWF0LXRhYi1pbmFjdGl2ZS1ob3Zlci1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWF0LW1kYy10YWI6Zm9jdXMgLm1kYy10YWJfX3RleHQtbGFiZWx7Y29sb3I6dmFyKC0tbWF0LXRhYi1pbmFjdGl2ZS1mb2N1cy1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWF0LW1kYy10YWIubWRjLXRhYi0tYWN0aXZlIC5tZGMtdGFiX190ZXh0LWxhYmVse2NvbG9yOnZhcigtLW1hdC10YWItYWN0aXZlLWxhYmVsLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfS5tYXQtbWRjLXRhYi5tZGMtdGFiLS1hY3RpdmUgLm1kYy10YWJfX3JpcHBsZTo6YmVmb3JlLC5tYXQtbWRjLXRhYi5tZGMtdGFiLS1hY3RpdmUgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC10YWItYWN0aXZlLXJpcHBsZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1hdC1tZGMtdGFiLm1kYy10YWItLWFjdGl2ZTpob3ZlciAubWRjLXRhYl9fdGV4dC1sYWJlbHtjb2xvcjp2YXIoLS1tYXQtdGFiLWFjdGl2ZS1ob3Zlci1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWF0LW1kYy10YWIubWRjLXRhYi0tYWN0aXZlOmhvdmVyIC5tZGMtdGFiLWluZGljYXRvcl9fY29udGVudC0tdW5kZXJsaW5le2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtdGFiLWFjdGl2ZS1ob3Zlci1pbmRpY2F0b3ItY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tYXQtbWRjLXRhYi5tZGMtdGFiLS1hY3RpdmU6Zm9jdXMgLm1kYy10YWJfX3RleHQtbGFiZWx7Y29sb3I6dmFyKC0tbWF0LXRhYi1hY3RpdmUtZm9jdXMtbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1hdC1tZGMtdGFiLm1kYy10YWItLWFjdGl2ZTpmb2N1cyAubWRjLXRhYi1pbmRpY2F0b3JfX2NvbnRlbnQtLXVuZGVybGluZXtib3JkZXItY29sb3I6dmFyKC0tbWF0LXRhYi1hY3RpdmUtZm9jdXMtaW5kaWNhdG9yLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWF0LW1kYy10YWIubWF0LW1kYy10YWItZGlzYWJsZWR7b3BhY2l0eTouNDtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtbWRjLXRhYi5tYXQtbWRjLXRhYi1kaXNhYmxlZCAubWRjLXRhYl9fY29udGVudHtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtbWRjLXRhYi5tYXQtbWRjLXRhYi1kaXNhYmxlZCAubWRjLXRhYl9fcmlwcGxlOjpiZWZvcmUsLm1hdC1tZGMtdGFiLm1hdC1tZGMtdGFiLWRpc2FibGVkIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtdGFiLWRpc2FibGVkLXJpcHBsZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLXZhcmlhbnQpKX0ubWF0LW1kYy10YWIgLm1kYy10YWJfX3JpcHBsZTo6YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC10YWItaW5hY3RpdmUtcmlwcGxlLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWF0LW1kYy10YWIgLm1kYy10YWJfX3RleHQtbGFiZWx7Y29sb3I6dmFyKC0tbWF0LXRhYi1pbmFjdGl2ZS1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKTtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWF0LW1kYy10YWIgLm1kYy10YWJfX2NvbnRlbnR7cG9zaXRpb246cmVsYXRpdmU7cG9pbnRlci1ldmVudHM6YXV0b30ubWF0LW1kYy10YWI6aG92ZXIgLm1kYy10YWJfX3JpcHBsZTo6YmVmb3Jle29wYWNpdHk6LjA0fS5tYXQtbWRjLXRhYi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tZGMtdGFiX19yaXBwbGU6OmJlZm9yZSwubWF0LW1kYy10YWIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1kYy10YWJfX3JpcHBsZTo6YmVmb3Jle29wYWNpdHk6LjEyfS5tYXQtbWRjLXRhYiAubWF0LXJpcHBsZS1lbGVtZW50e29wYWNpdHk6LjEyO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXRhYi1pbmFjdGl2ZS1yaXBwbGUtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfS5tYXQtbWRjLXRhYi1ncm91cC5tYXQtbWRjLXRhYi1ncm91cC1zdHJldGNoLXRhYnM+Lm1hdC1tZGMtdGFiLWhlYWRlciAubWF0LW1kYy10YWJ7ZmxleC1ncm93OjF9Lm1hdC1tZGMtdGFiLWdyb3Vwe2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWF4LXdpZHRoOjEwMCV9Lm1hdC1tZGMtdGFiLWdyb3VwLm1hdC10YWJzLXdpdGgtYmFja2dyb3VuZD4ubWF0LW1kYy10YWItaGVhZGVyLC5tYXQtbWRjLXRhYi1ncm91cC5tYXQtdGFicy13aXRoLWJhY2tncm91bmQ+Lm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9ue2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXRhYi1iYWNrZ3JvdW5kLWNvbG9yKX0ubWF0LW1kYy10YWItZ3JvdXAubWF0LXRhYnMtd2l0aC1iYWNrZ3JvdW5kLm1hdC1wcmltYXJ5Pi5tYXQtbWRjLXRhYi1oZWFkZXIgLm1hdC1tZGMtdGFiIC5tZGMtdGFiX190ZXh0LWxhYmVse2NvbG9yOnZhcigtLW1hdC10YWItZm9yZWdyb3VuZC1jb2xvcil9Lm1hdC1tZGMtdGFiLWdyb3VwLm1hdC10YWJzLXdpdGgtYmFja2dyb3VuZC5tYXQtcHJpbWFyeT4ubWF0LW1kYy10YWItaGVhZGVyIC5tZGMtdGFiLWluZGljYXRvcl9fY29udGVudC0tdW5kZXJsaW5le2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtdGFiLWZvcmVncm91bmQtY29sb3IpfS5tYXQtbWRjLXRhYi1ncm91cC5tYXQtdGFicy13aXRoLWJhY2tncm91bmQ6bm90KC5tYXQtcHJpbWFyeSk+Lm1hdC1tZGMtdGFiLWhlYWRlciAubWF0LW1kYy10YWI6bm90KC5tZGMtdGFiLS1hY3RpdmUpIC5tZGMtdGFiX190ZXh0LWxhYmVse2NvbG9yOnZhcigtLW1hdC10YWItZm9yZWdyb3VuZC1jb2xvcil9Lm1hdC1tZGMtdGFiLWdyb3VwLm1hdC10YWJzLXdpdGgtYmFja2dyb3VuZDpub3QoLm1hdC1wcmltYXJ5KT4ubWF0LW1kYy10YWItaGVhZGVyIC5tYXQtbWRjLXRhYjpub3QoLm1kYy10YWItLWFjdGl2ZSkgLm1kYy10YWItaW5kaWNhdG9yX19jb250ZW50LS11bmRlcmxpbmV7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC10YWItZm9yZWdyb3VuZC1jb2xvcil9Lm1hdC1tZGMtdGFiLWdyb3VwLm1hdC10YWJzLXdpdGgtYmFja2dyb3VuZD4ubWF0LW1kYy10YWItaGVhZGVyIC5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtbWRjLXRhYi1ncm91cC5tYXQtdGFicy13aXRoLWJhY2tncm91bmQ+Lm1hdC1tZGMtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLC5tYXQtbWRjLXRhYi1ncm91cC5tYXQtdGFicy13aXRoLWJhY2tncm91bmQ+Lm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtbWRjLXRhYi1ncm91cC5tYXQtdGFicy13aXRoLWJhY2tncm91bmQ+Lm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC10YWItZm9yZWdyb3VuZC1jb2xvcil9Lm1hdC1tZGMtdGFiLWdyb3VwLm1hdC10YWJzLXdpdGgtYmFja2dyb3VuZD4ubWF0LW1kYy10YWItaGVhZGVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1tZGMtdGFiLWdyb3VwLm1hdC10YWJzLXdpdGgtYmFja2dyb3VuZD4ubWF0LW1kYy10YWItaGVhZGVyIC5tZGMtdGFiX19yaXBwbGU6OmJlZm9yZSwubWF0LW1kYy10YWItZ3JvdXAubWF0LXRhYnMtd2l0aC1iYWNrZ3JvdW5kPi5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtbWRjLXRhYi1ncm91cC5tYXQtdGFicy13aXRoLWJhY2tncm91bmQ+Lm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tZGMtdGFiX19yaXBwbGU6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC10YWItZm9yZWdyb3VuZC1jb2xvcil9Lm1hdC1tZGMtdGFiLWdyb3VwLm1hdC10YWJzLXdpdGgtYmFja2dyb3VuZD4ubWF0LW1kYy10YWItaGVhZGVyIC5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtbWRjLXRhYi1ncm91cC5tYXQtdGFicy13aXRoLWJhY2tncm91bmQ+Lm1hdC1tZGMtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtbWRjLXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2NvbG9yOnZhcigtLW1hdC10YWItZm9yZWdyb3VuZC1jb2xvcil9Lm1hdC1tZGMtdGFiLWdyb3VwLm1hdC1tZGMtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcntmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZX0ubWF0LW1kYy10YWItZ3JvdXAubWF0LW1kYy10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tZGMtdGFiLWluZGljYXRvcl9fY29udGVudC0tdW5kZXJsaW5le2FsaWduLXNlbGY6ZmxleC1zdGFydH0ubWF0LW1kYy10YWItYm9keS13cmFwcGVye3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjtkaXNwbGF5OmZsZXg7dHJhbnNpdGlvbjpoZWlnaHQgNTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5tYXQtbWRjLXRhYi1ib2R5LXdyYXBwZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGV7dHJhbnNpdGlvbjpub25lICFpbXBvcnRhbnQ7YW5pbWF0aW9uOm5vbmUgIWltcG9ydGFudH0KYF0sZW5jYXBzdWxhdGlvbjoyfSl9cmV0dXJuIHR9KSgpLHo4PWNsYXNze2luZGV4O3RhYn0sSXU9KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVtb2Q9eGUoe3R5cGU6dH0pO3N0YXRpYyBcdTAyNzVpbmo9eWUoe2ltcG9ydHM6W3plLHplXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIGxJKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDIsMSkoMiwiZGl2Iiw1KSgzLCJzcGFuIiw2KSxtKDQpLHMoKSgpKCkpLHQmMil7bGV0IGU9digpO2woNCksQShlLnZhbHVlSW5kaWNhdG9yVGV4dCl9fWZ1bmN0aW9uIGhJKHQsbil7aWYodCYxJiZ1KDAsImRpdiIpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQsaT1uLiRpbmRleCxhPXYoMyk7RHQoZT09PTA/Im1kYy1zbGlkZXJfX3RpY2stbWFyay0tYWN0aXZlIjoibWRjLXNsaWRlcl9fdGljay1tYXJrLS1pbmFjdGl2ZSIpLF90KCJ0cmFuc2Zvcm0iLGEuX2NhbGNUaWNrTWFya1RyYW5zZm9ybShpKSl9fWZ1bmN0aW9uIHBJKHQsbil7aWYodCYxJiZxZSgwLGhJLDEsNCwiZGl2Iiw4LGZyKSx0JjIpe2xldCBlPXYoMik7R2UoZS5fdGlja01hcmtzKX19ZnVuY3Rpb24gZkkodCxuKXtpZih0JjEmJihjKDAsImRpdiIsNiwxKSxNKDIscEksMiwwKSxzKCkpLHQmMil7bGV0IGU9digpO2woMiksdyhlLl9jYWNoZWRXaWR0aD8yOi0xKX19ZnVuY3Rpb24gdUkodCxuKXtpZih0JjEmJnUoMCwibWF0LXNsaWRlci12aXN1YWwtdGh1bWIiLDcpLHQmMil7bGV0IGU9digpO2YoImRpc2NyZXRlIixlLmRpc2NyZXRlKSgidGh1bWJQb3NpdGlvbiIsMSkoInZhbHVlSW5kaWNhdG9yVGV4dCIsZS5zdGFydFZhbHVlSW5kaWNhdG9yVGV4dCl9fXZhciBjSSxzSSxkSSxtSSxjdCxhbyxJOCxMdSxnSSxQdSx2SSxWdSxfSSxMOCxCMyxVMz14KCgpPT57WjIoKTt2YSgpO2soKTtrKCk7SzIoKTtBMigpO2ZpKCk7STIoKTtXZSgpO1h0KCk7eTEoKTtXYSgpO2NJPVsia25vYiJdLHNJPVsidmFsdWVJbmRpY2F0b3JDb250YWluZXIiXTtkST1bInRyYWNrQWN0aXZlIl0sbUk9WyIqIl07Y3Q9KGZ1bmN0aW9uKHQpe3JldHVybiB0W3QuU1RBUlQ9MV09IlNUQVJUIix0W3QuRU5EPTJdPSJFTkQiLHR9KShjdHx8e30pLGFvPShmdW5jdGlvbih0KXtyZXR1cm4gdFt0LkFDVElWRT0wXT0iQUNUSVZFIix0W3QuSU5BQ1RJVkU9MV09IklOQUNUSVZFIix0fSkoYW98fHt9KSxJOD1uZXcgY2UoIl9NYXRTbGlkZXIiKSxMdT1uZXcgY2UoIl9NYXRTbGlkZXJUaHVtYiIpLGdJPW5ldyBjZSgiX01hdFNsaWRlclJhbmdlVGh1bWIiKSxQdT1uZXcgY2UoIl9NYXRTbGlkZXJWaXN1YWxUaHVtYiIpLHZJPSgoKT0+e2NsYXNzIHR7X2Nkcj1oKEVlKTtfbmdab25lPWgocmUpO19zbGlkZXI9aChJOCk7X3JlbmRlcmVyPWgodjEpO19saXN0ZW5lckNsZWFudXBzO2Rpc2NyZXRlO3RodW1iUG9zaXRpb247dmFsdWVJbmRpY2F0b3JUZXh0O19yaXBwbGU7X2tub2I7X3ZhbHVlSW5kaWNhdG9yQ29udGFpbmVyO19zbGlkZXJJbnB1dDtfc2xpZGVySW5wdXRFbDtfaG92ZXJSaXBwbGVSZWY7X2ZvY3VzUmlwcGxlUmVmO19hY3RpdmVSaXBwbGVSZWY7X2lzSG92ZXJlZD0hMTtfaXNBY3RpdmU9ITE7X2lzVmFsdWVJbmRpY2F0b3JWaXNpYmxlPSExO19ob3N0RWxlbWVudD1oKGFlKS5uYXRpdmVFbGVtZW50O19wbGF0Zm9ybT1oKGIxKTtjb25zdHJ1Y3Rvcigpe31uZ0FmdGVyVmlld0luaXQoKXtsZXQgZT10aGlzLl9zbGlkZXIuX2dldElucHV0KHRoaXMudGh1bWJQb3NpdGlvbik7ZSYmKHRoaXMuX3JpcHBsZS5yYWRpdXM9MjQsdGhpcy5fc2xpZGVySW5wdXQ9ZSx0aGlzLl9zbGlkZXJJbnB1dEVsPXRoaXMuX3NsaWRlcklucHV0Ll9ob3N0RWxlbWVudCx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntsZXQgaT10aGlzLl9zbGlkZXJJbnB1dEVsLGE9dGhpcy5fcmVuZGVyZXI7dGhpcy5fbGlzdGVuZXJDbGVhbnVwcz1bYS5saXN0ZW4oaSwicG9pbnRlcm1vdmUiLHRoaXMuX29uUG9pbnRlck1vdmUpLGEubGlzdGVuKGksInBvaW50ZXJkb3duIix0aGlzLl9vbkRyYWdTdGFydCksYS5saXN0ZW4oaSwicG9pbnRlcnVwIix0aGlzLl9vbkRyYWdFbmQpLGEubGlzdGVuKGksInBvaW50ZXJsZWF2ZSIsdGhpcy5fb25Nb3VzZUxlYXZlKSxhLmxpc3RlbihpLCJmb2N1cyIsdGhpcy5fb25Gb2N1cyksYS5saXN0ZW4oaSwiYmx1ciIsdGhpcy5fb25CbHVyKV19KSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9saXN0ZW5lckNsZWFudXBzPy5mb3JFYWNoKGU9PmUoKSl9X29uUG9pbnRlck1vdmU9ZT0+e2lmKHRoaXMuX3NsaWRlcklucHV0Ll9pc0ZvY3VzZWQpcmV0dXJuO2xldCBpPXRoaXMuX2hvc3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9dGhpcy5fc2xpZGVyLl9pc0N1cnNvck9uU2xpZGVyVGh1bWIoZSxpKTt0aGlzLl9pc0hvdmVyZWQ9YSxhP3RoaXMuX3Nob3dIb3ZlclJpcHBsZSgpOnRoaXMuX2hpZGVSaXBwbGUodGhpcy5faG92ZXJSaXBwbGVSZWYpfTtfb25Nb3VzZUxlYXZlPSgpPT57dGhpcy5faXNIb3ZlcmVkPSExLHRoaXMuX2hpZGVSaXBwbGUodGhpcy5faG92ZXJSaXBwbGVSZWYpfTtfb25Gb2N1cz0oKT0+e3RoaXMuX2hpZGVSaXBwbGUodGhpcy5faG92ZXJSaXBwbGVSZWYpLHRoaXMuX3Nob3dGb2N1c1JpcHBsZSgpLHRoaXMuX2hvc3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoIm1kYy1zbGlkZXJfX3RodW1iLS1mb2N1c2VkIil9O19vbkJsdXI9KCk9Pnt0aGlzLl9pc0FjdGl2ZXx8dGhpcy5faGlkZVJpcHBsZSh0aGlzLl9mb2N1c1JpcHBsZVJlZiksdGhpcy5faXNIb3ZlcmVkJiZ0aGlzLl9zaG93SG92ZXJSaXBwbGUoKSx0aGlzLl9ob3N0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJtZGMtc2xpZGVyX190aHVtYi0tZm9jdXNlZCIpfTtfb25EcmFnU3RhcnQ9ZT0+e2UuYnV0dG9uPT09MCYmKHRoaXMuX2lzQWN0aXZlPSEwLHRoaXMuX3Nob3dBY3RpdmVSaXBwbGUoKSl9O19vbkRyYWdFbmQ9KCk9Pnt0aGlzLl9pc0FjdGl2ZT0hMSx0aGlzLl9oaWRlUmlwcGxlKHRoaXMuX2FjdGl2ZVJpcHBsZVJlZiksdGhpcy5fc2xpZGVySW5wdXQuX2lzRm9jdXNlZHx8dGhpcy5faGlkZVJpcHBsZSh0aGlzLl9mb2N1c1JpcHBsZVJlZiksdGhpcy5fcGxhdGZvcm0uU0FGQVJJJiZ0aGlzLl9zaG93SG92ZXJSaXBwbGUoKX07X3Nob3dIb3ZlclJpcHBsZSgpe3RoaXMuX2lzU2hvd2luZ1JpcHBsZSh0aGlzLl9ob3ZlclJpcHBsZVJlZil8fCh0aGlzLl9ob3ZlclJpcHBsZVJlZj10aGlzLl9zaG93UmlwcGxlKHtlbnRlckR1cmF0aW9uOjAsZXhpdER1cmF0aW9uOjB9KSx0aGlzLl9ob3ZlclJpcHBsZVJlZj8uZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJtYXQtbWRjLXNsaWRlci1ob3Zlci1yaXBwbGUiKSl9X3Nob3dGb2N1c1JpcHBsZSgpe3RoaXMuX2lzU2hvd2luZ1JpcHBsZSh0aGlzLl9mb2N1c1JpcHBsZVJlZil8fCh0aGlzLl9mb2N1c1JpcHBsZVJlZj10aGlzLl9zaG93UmlwcGxlKHtlbnRlckR1cmF0aW9uOjAsZXhpdER1cmF0aW9uOjB9LCEwKSx0aGlzLl9mb2N1c1JpcHBsZVJlZj8uZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJtYXQtbWRjLXNsaWRlci1mb2N1cy1yaXBwbGUiKSl9X3Nob3dBY3RpdmVSaXBwbGUoKXt0aGlzLl9pc1Nob3dpbmdSaXBwbGUodGhpcy5fYWN0aXZlUmlwcGxlUmVmKXx8KHRoaXMuX2FjdGl2ZVJpcHBsZVJlZj10aGlzLl9zaG93UmlwcGxlKHtlbnRlckR1cmF0aW9uOjIyNSxleGl0RHVyYXRpb246NDAwfSksdGhpcy5fYWN0aXZlUmlwcGxlUmVmPy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoIm1hdC1tZGMtc2xpZGVyLWFjdGl2ZS1yaXBwbGUiKSl9X2lzU2hvd2luZ1JpcHBsZShlKXtyZXR1cm4gZT8uc3RhdGU9PT1FMC5GQURJTkdfSU58fGU/LnN0YXRlPT09RTAuVklTSUJMRX1fc2hvd1JpcHBsZShlLGkpe2lmKCF0aGlzLl9zbGlkZXIuZGlzYWJsZWQmJih0aGlzLl9zaG93VmFsdWVJbmRpY2F0b3IoKSx0aGlzLl9zbGlkZXIuX2lzUmFuZ2UmJnRoaXMuX3NsaWRlci5fZ2V0VGh1bWIodGhpcy50aHVtYlBvc2l0aW9uPT09Y3QuU1RBUlQ/Y3QuRU5EOmN0LlNUQVJUKS5fc2hvd1ZhbHVlSW5kaWNhdG9yKCksISh0aGlzLl9zbGlkZXIuX2dsb2JhbFJpcHBsZU9wdGlvbnM/LmRpc2FibGVkJiYhaSkpKXJldHVybiB0aGlzLl9yaXBwbGUubGF1bmNoKHthbmltYXRpb246dGhpcy5fc2xpZGVyLl9ub29wQW5pbWF0aW9ucz97ZW50ZXJEdXJhdGlvbjowLGV4aXREdXJhdGlvbjowfTplLGNlbnRlcmVkOiEwLHBlcnNpc3RlbnQ6ITB9KX1faGlkZVJpcHBsZShlKXtpZihlPy5mYWRlT3V0KCksdGhpcy5faXNTaG93aW5nQW55UmlwcGxlKCkpcmV0dXJuO3RoaXMuX3NsaWRlci5faXNSYW5nZXx8dGhpcy5faGlkZVZhbHVlSW5kaWNhdG9yKCk7bGV0IGk9dGhpcy5fZ2V0U2libGluZygpO2kuX2lzU2hvd2luZ0FueVJpcHBsZSgpfHwodGhpcy5faGlkZVZhbHVlSW5kaWNhdG9yKCksaS5faGlkZVZhbHVlSW5kaWNhdG9yKCkpfV9zaG93VmFsdWVJbmRpY2F0b3IoKXt0aGlzLl9ob3N0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCJtZGMtc2xpZGVyX190aHVtYi0td2l0aC1pbmRpY2F0b3IiKX1faGlkZVZhbHVlSW5kaWNhdG9yKCl7dGhpcy5faG9zdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgibWRjLXNsaWRlcl9fdGh1bWItLXdpdGgtaW5kaWNhdG9yIil9X2dldFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fc2xpZGVyLl9nZXRUaHVtYih0aGlzLnRodW1iUG9zaXRpb249PT1jdC5TVEFSVD9jdC5FTkQ6Y3QuU1RBUlQpfV9nZXRWYWx1ZUluZGljYXRvckNvbnRhaW5lcigpe3JldHVybiB0aGlzLl92YWx1ZUluZGljYXRvckNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudH1fZ2V0S25vYigpe3JldHVybiB0aGlzLl9rbm9iLm5hdGl2ZUVsZW1lbnR9X2lzU2hvd2luZ0FueVJpcHBsZSgpe3JldHVybiB0aGlzLl9pc1Nob3dpbmdSaXBwbGUodGhpcy5faG92ZXJSaXBwbGVSZWYpfHx0aGlzLl9pc1Nob3dpbmdSaXBwbGUodGhpcy5fZm9jdXNSaXBwbGVSZWYpfHx0aGlzLl9pc1Nob3dpbmdSaXBwbGUodGhpcy5fYWN0aXZlUmlwcGxlUmVmKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJtYXQtc2xpZGVyLXZpc3VhbC10aHVtYiJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJih0ZShMMSw1KSx0ZShjSSw1KSx0ZShzSSw1KSksaSYyKXtsZXQgcjtGKHI9QigpKSYmKGEuX3JpcHBsZT1yLmZpcnN0KSxGKHI9QigpKSYmKGEuX2tub2I9ci5maXJzdCksRihyPUIoKSkmJihhLl92YWx1ZUluZGljYXRvckNvbnRhaW5lcj1yLmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWRjLXNsaWRlcl9fdGh1bWIiLCJtYXQtbWRjLXNsaWRlci12aXN1YWwtdGh1bWIiXSxpbnB1dHM6e2Rpc2NyZXRlOiJkaXNjcmV0ZSIsdGh1bWJQb3NpdGlvbjoidGh1bWJQb3NpdGlvbiIsdmFsdWVJbmRpY2F0b3JUZXh0OiJ2YWx1ZUluZGljYXRvclRleHQifSxmZWF0dXJlczpbSWUoW3twcm92aWRlOlB1LHVzZUV4aXN0aW5nOnR9XSldLGRlY2xzOjQsdmFyczoyLGNvbnN0czpbWyJrbm9iIiwiIl0sWyJ2YWx1ZUluZGljYXRvckNvbnRhaW5lciIsIiJdLFsxLCJtZGMtc2xpZGVyX192YWx1ZS1pbmRpY2F0b3ItY29udGFpbmVyIl0sWzEsIm1kYy1zbGlkZXJfX3RodW1iLWtub2IiXSxbIm1hdFJpcHBsZSIsIiIsMSwibWF0LWZvY3VzLWluZGljYXRvciIsMywibWF0UmlwcGxlRGlzYWJsZWQiXSxbMSwibWRjLXNsaWRlcl9fdmFsdWUtaW5kaWNhdG9yIl0sWzEsIm1kYy1zbGlkZXJfX3ZhbHVlLWluZGljYXRvci10ZXh0Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoTSgwLGxJLDUsMSwiZGl2IiwyKSx1KDEsImRpdiIsMywwKSgzLCJkaXYiLDQpKSxpJjImJih3KGEuZGlzY3JldGU/MDotMSksbCgzKSxmKCJtYXRSaXBwbGVEaXNhYmxlZCIsITApKX0sZGVwZW5kZW5jaWVzOltMMV0sc3R5bGVzOltgLm1hdC1tZGMtc2xpZGVyLXZpc3VhbC10aHVtYiAubWF0LXJpcHBsZXtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5tYXQtbWRjLXNsaWRlciAubWRjLXNsaWRlcl9fdGljay1tYXJrc3tqdXN0aWZ5LWNvbnRlbnQ6c3RhcnR9Lm1hdC1tZGMtc2xpZGVyIC5tZGMtc2xpZGVyX190aWNrLW1hcmtzIC5tZGMtc2xpZGVyX190aWNrLW1hcmstLWFjdGl2ZSwubWF0LW1kYy1zbGlkZXIgLm1kYy1zbGlkZXJfX3RpY2stbWFya3MgLm1kYy1zbGlkZXJfX3RpY2stbWFyay0taW5hY3RpdmV7cG9zaXRpb246YWJzb2x1dGU7bGVmdDoycHh9CmBdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxWdT0oKCk9PntjbGFzcyB0e19uZ1pvbmU9aChyZSk7X2Nkcj1oKEVlKTtfZWxlbWVudFJlZj1oKGFlKTtfZGlyPWgobjEse29wdGlvbmFsOiEwfSk7X2dsb2JhbFJpcHBsZU9wdGlvbnM9aCh4cix7b3B0aW9uYWw6ITB9KTtfdHJhY2tBY3RpdmU7X3RodW1icztfaW5wdXQ7X2lucHV0cztnZXQgZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWR9c2V0IGRpc2FibGVkKGUpe3RoaXMuX2Rpc2FibGVkPWU7bGV0IGk9dGhpcy5fZ2V0SW5wdXQoY3QuRU5EKSxhPXRoaXMuX2dldElucHV0KGN0LlNUQVJUKTtpJiYoaS5kaXNhYmxlZD10aGlzLl9kaXNhYmxlZCksYSYmKGEuZGlzYWJsZWQ9dGhpcy5fZGlzYWJsZWQpfV9kaXNhYmxlZD0hMTtnZXQgZGlzY3JldGUoKXtyZXR1cm4gdGhpcy5fZGlzY3JldGV9c2V0IGRpc2NyZXRlKGUpe3RoaXMuX2Rpc2NyZXRlPWUsdGhpcy5fdXBkYXRlVmFsdWVJbmRpY2F0b3JVSXMoKX1fZGlzY3JldGU9ITE7Z2V0IHNob3dUaWNrTWFya3MoKXtyZXR1cm4gdGhpcy5fc2hvd1RpY2tNYXJrc31zZXQgc2hvd1RpY2tNYXJrcyhlKXt0aGlzLl9zaG93VGlja01hcmtzPWUsdGhpcy5faGFzVmlld0luaXRpYWxpemVkJiYodGhpcy5fdXBkYXRlVGlja01hcmtVSSgpLHRoaXMuX3VwZGF0ZVRpY2tNYXJrVHJhY2tVSSgpKX1fc2hvd1RpY2tNYXJrcz0hMTtnZXQgbWluKCl7cmV0dXJuIHRoaXMuX21pbn1zZXQgbWluKGUpe2xldCBpPWU9PW51bGx8fGlzTmFOKGUpP3RoaXMuX21pbjplO3RoaXMuX21pbiE9PWkmJnRoaXMuX3VwZGF0ZU1pbihpKX1fbWluPTA7Y29sb3I7ZGlzYWJsZVJpcHBsZT0hMTtfdXBkYXRlTWluKGUpe2xldCBpPXRoaXMuX21pbjt0aGlzLl9taW49ZSx0aGlzLl9pc1JhbmdlP3RoaXMuX3VwZGF0ZU1pblJhbmdlKHtvbGQ6aSxuZXc6ZX0pOnRoaXMuX3VwZGF0ZU1pbk5vblJhbmdlKGUpLHRoaXMuX29uTWluTWF4T3JTdGVwQ2hhbmdlKCl9X3VwZGF0ZU1pblJhbmdlKGUpe2xldCBpPXRoaXMuX2dldElucHV0KGN0LkVORCksYT10aGlzLl9nZXRJbnB1dChjdC5TVEFSVCkscj1pLnZhbHVlLG89YS52YWx1ZTthLm1pbj1lLm5ldyxpLm1pbj1NYXRoLm1heChlLm5ldyxhLnZhbHVlKSxhLm1heD1NYXRoLm1pbihpLm1heCxpLnZhbHVlKSxhLl91cGRhdGVXaWR0aEluYWN0aXZlKCksaS5fdXBkYXRlV2lkdGhJbmFjdGl2ZSgpLGUubmV3PGUub2xkP3RoaXMuX29uVHJhbnNsYXRlWENoYW5nZUJ5U2lkZUVmZmVjdChpLGEpOnRoaXMuX29uVHJhbnNsYXRlWENoYW5nZUJ5U2lkZUVmZmVjdChhLGkpLHIhPT1pLnZhbHVlJiZ0aGlzLl9vblZhbHVlQ2hhbmdlKGkpLG8hPT1hLnZhbHVlJiZ0aGlzLl9vblZhbHVlQ2hhbmdlKGEpfV91cGRhdGVNaW5Ob25SYW5nZShlKXtsZXQgaT10aGlzLl9nZXRJbnB1dChjdC5FTkQpO2lmKGkpe2xldCBhPWkudmFsdWU7aS5taW49ZSxpLl91cGRhdGVUaHVtYlVJQnlWYWx1ZSgpLHRoaXMuX3VwZGF0ZVRyYWNrVUkoaSksYSE9PWkudmFsdWUmJnRoaXMuX29uVmFsdWVDaGFuZ2UoaSl9fWdldCBtYXgoKXtyZXR1cm4gdGhpcy5fbWF4fXNldCBtYXgoZSl7bGV0IGk9ZT09bnVsbHx8aXNOYU4oZSk/dGhpcy5fbWF4OmU7dGhpcy5fbWF4IT09aSYmdGhpcy5fdXBkYXRlTWF4KGkpfV9tYXg9MTAwO191cGRhdGVNYXgoZSl7bGV0IGk9dGhpcy5fbWF4O3RoaXMuX21heD1lLHRoaXMuX2lzUmFuZ2U/dGhpcy5fdXBkYXRlTWF4UmFuZ2Uoe29sZDppLG5ldzplfSk6dGhpcy5fdXBkYXRlTWF4Tm9uUmFuZ2UoZSksdGhpcy5fb25NaW5NYXhPclN0ZXBDaGFuZ2UoKX1fdXBkYXRlTWF4UmFuZ2UoZSl7bGV0IGk9dGhpcy5fZ2V0SW5wdXQoY3QuRU5EKSxhPXRoaXMuX2dldElucHV0KGN0LlNUQVJUKSxyPWkudmFsdWUsbz1hLnZhbHVlO2kubWF4PWUubmV3LGEubWF4PU1hdGgubWluKGUubmV3LGkudmFsdWUpLGkubWluPWEudmFsdWUsaS5fdXBkYXRlV2lkdGhJbmFjdGl2ZSgpLGEuX3VwZGF0ZVdpZHRoSW5hY3RpdmUoKSxlLm5ldz5lLm9sZD90aGlzLl9vblRyYW5zbGF0ZVhDaGFuZ2VCeVNpZGVFZmZlY3QoYSxpKTp0aGlzLl9vblRyYW5zbGF0ZVhDaGFuZ2VCeVNpZGVFZmZlY3QoaSxhKSxyIT09aS52YWx1ZSYmdGhpcy5fb25WYWx1ZUNoYW5nZShpKSxvIT09YS52YWx1ZSYmdGhpcy5fb25WYWx1ZUNoYW5nZShhKX1fdXBkYXRlTWF4Tm9uUmFuZ2UoZSl7bGV0IGk9dGhpcy5fZ2V0SW5wdXQoY3QuRU5EKTtpZihpKXtsZXQgYT1pLnZhbHVlO2kubWF4PWUsaS5fdXBkYXRlVGh1bWJVSUJ5VmFsdWUoKSx0aGlzLl91cGRhdGVUcmFja1VJKGkpLGEhPT1pLnZhbHVlJiZ0aGlzLl9vblZhbHVlQ2hhbmdlKGkpfX1nZXQgc3RlcCgpe3JldHVybiB0aGlzLl9zdGVwfXNldCBzdGVwKGUpe2xldCBpPWlzTmFOKGUpP3RoaXMuX3N0ZXA6ZTt0aGlzLl9zdGVwIT09aSYmdGhpcy5fdXBkYXRlU3RlcChpKX1fc3RlcD0xO191cGRhdGVTdGVwKGUpe3RoaXMuX3N0ZXA9ZSx0aGlzLl9pc1JhbmdlP3RoaXMuX3VwZGF0ZVN0ZXBSYW5nZSgpOnRoaXMuX3VwZGF0ZVN0ZXBOb25SYW5nZSgpLHRoaXMuX29uTWluTWF4T3JTdGVwQ2hhbmdlKCl9X3VwZGF0ZVN0ZXBSYW5nZSgpe2xldCBlPXRoaXMuX2dldElucHV0KGN0LkVORCksaT10aGlzLl9nZXRJbnB1dChjdC5TVEFSVCksYT1lLnZhbHVlLHI9aS52YWx1ZSxvPWkudmFsdWU7ZS5taW49dGhpcy5fbWluLGkubWF4PXRoaXMuX21heCxlLnN0ZXA9dGhpcy5fc3RlcCxpLnN0ZXA9dGhpcy5fc3RlcCx0aGlzLl9wbGF0Zm9ybS5TQUZBUkkmJihlLnZhbHVlPWUudmFsdWUsaS52YWx1ZT1pLnZhbHVlKSxlLm1pbj1NYXRoLm1heCh0aGlzLl9taW4saS52YWx1ZSksaS5tYXg9TWF0aC5taW4odGhpcy5fbWF4LGUudmFsdWUpLGkuX3VwZGF0ZVdpZHRoSW5hY3RpdmUoKSxlLl91cGRhdGVXaWR0aEluYWN0aXZlKCksZS52YWx1ZTxvP3RoaXMuX29uVHJhbnNsYXRlWENoYW5nZUJ5U2lkZUVmZmVjdChpLGUpOnRoaXMuX29uVHJhbnNsYXRlWENoYW5nZUJ5U2lkZUVmZmVjdChlLGkpLGEhPT1lLnZhbHVlJiZ0aGlzLl9vblZhbHVlQ2hhbmdlKGUpLHIhPT1pLnZhbHVlJiZ0aGlzLl9vblZhbHVlQ2hhbmdlKGkpfV91cGRhdGVTdGVwTm9uUmFuZ2UoKXtsZXQgZT10aGlzLl9nZXRJbnB1dChjdC5FTkQpO2lmKGUpe2xldCBpPWUudmFsdWU7ZS5zdGVwPXRoaXMuX3N0ZXAsdGhpcy5fcGxhdGZvcm0uU0FGQVJJJiYoZS52YWx1ZT1lLnZhbHVlKSxlLl91cGRhdGVUaHVtYlVJQnlWYWx1ZSgpLGkhPT1lLnZhbHVlJiZ0aGlzLl9vblZhbHVlQ2hhbmdlKGUpfX1kaXNwbGF5V2l0aD1lPT5gJHtlfWA7X3RpY2tNYXJrcztfbm9vcEFuaW1hdGlvbnM9UHQoKTtfZGlyQ2hhbmdlU3Vic2NyaXB0aW9uO19yZXNpemVPYnNlcnZlcjtfY2FjaGVkV2lkdGg7X2NhY2hlZExlZnQ7X3JpcHBsZVJhZGl1cz0yNDtzdGFydFZhbHVlSW5kaWNhdG9yVGV4dD0iIjtlbmRWYWx1ZUluZGljYXRvclRleHQ9IiI7X2VuZFRodW1iVHJhbnNmb3JtO19zdGFydFRodW1iVHJhbnNmb3JtO19pc1JhbmdlPSExO19pc1J0bD0hMTtfaGFzVmlld0luaXRpYWxpemVkPSExO190aWNrTWFya1RyYWNrV2lkdGg9MDtfaGFzQW5pbWF0aW9uPSExO19yZXNpemVUaW1lcj1udWxsO19wbGF0Zm9ybT1oKGIxKTtjb25zdHJ1Y3Rvcigpe2goQzEpLmxvYWQoRTEpLHRoaXMuX2RpciYmKHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbj10aGlzLl9kaXIuY2hhbmdlLnN1YnNjcmliZSgoKT0+dGhpcy5fb25EaXJDaGFuZ2UoKSksdGhpcy5faXNSdGw9dGhpcy5fZGlyLnZhbHVlPT09InJ0bCIpfV9rbm9iUmFkaXVzPTg7X2lucHV0UGFkZGluZztuZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJnRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtsZXQgZT10aGlzLl9nZXRJbnB1dChjdC5FTkQpLGk9dGhpcy5fZ2V0SW5wdXQoY3QuU1RBUlQpO3RoaXMuX2lzUmFuZ2U9ISFlJiYhIWksdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtsZXQgYT10aGlzLl9nZXRUaHVtYihjdC5FTkQpO3RoaXMuX3JpcHBsZVJhZGl1cz1hLl9yaXBwbGUucmFkaXVzLHRoaXMuX2lucHV0UGFkZGluZz10aGlzLl9yaXBwbGVSYWRpdXMtdGhpcy5fa25vYlJhZGl1cyx0aGlzLl9pc1JhbmdlP3RoaXMuX2luaXRVSVJhbmdlKGUsaSk6dGhpcy5faW5pdFVJTm9uUmFuZ2UoZSksdGhpcy5fdXBkYXRlVHJhY2tVSShlKSx0aGlzLl91cGRhdGVUaWNrTWFya1VJKCksdGhpcy5fdXBkYXRlVGlja01hcmtUcmFja1VJKCksdGhpcy5fb2JzZXJ2ZUhvc3RSZXNpemUoKSx0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpfV9pbml0VUlOb25SYW5nZShlKXtlLmluaXRQcm9wcygpLGUuaW5pdFVJKCksdGhpcy5fdXBkYXRlVmFsdWVJbmRpY2F0b3JVSShlKSx0aGlzLl9oYXNWaWV3SW5pdGlhbGl6ZWQ9ITAsZS5fdXBkYXRlVGh1bWJVSUJ5VmFsdWUoKX1faW5pdFVJUmFuZ2UoZSxpKXtlLmluaXRQcm9wcygpLGUuaW5pdFVJKCksaS5pbml0UHJvcHMoKSxpLmluaXRVSSgpLGUuX3VwZGF0ZU1pbk1heCgpLGkuX3VwZGF0ZU1pbk1heCgpLGUuX3VwZGF0ZVN0YXRpY1N0eWxlcygpLGkuX3VwZGF0ZVN0YXRpY1N0eWxlcygpLHRoaXMuX3VwZGF0ZVZhbHVlSW5kaWNhdG9yVUlzKCksdGhpcy5faGFzVmlld0luaXRpYWxpemVkPSEwLGUuX3VwZGF0ZVRodW1iVUlCeVZhbHVlKCksaS5fdXBkYXRlVGh1bWJVSUJ5VmFsdWUoKX1uZ09uRGVzdHJveSgpe3RoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3Jlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCksdGhpcy5fcmVzaXplT2JzZXJ2ZXI9bnVsbH1fb25EaXJDaGFuZ2UoKXt0aGlzLl9pc1J0bD10aGlzLl9kaXI/LnZhbHVlPT09InJ0bCIsdGhpcy5faXNSYW5nZT90aGlzLl9vbkRpckNoYW5nZVJhbmdlKCk6dGhpcy5fb25EaXJDaGFuZ2VOb25SYW5nZSgpLHRoaXMuX3VwZGF0ZVRpY2tNYXJrVUkoKX1fb25EaXJDaGFuZ2VSYW5nZSgpe2xldCBlPXRoaXMuX2dldElucHV0KGN0LkVORCksaT10aGlzLl9nZXRJbnB1dChjdC5TVEFSVCk7ZS5fc2V0SXNMZWZ0VGh1bWIoKSxpLl9zZXRJc0xlZnRUaHVtYigpLGUudHJhbnNsYXRlWD1lLl9jYWxjVHJhbnNsYXRlWEJ5VmFsdWUoKSxpLnRyYW5zbGF0ZVg9aS5fY2FsY1RyYW5zbGF0ZVhCeVZhbHVlKCksZS5fdXBkYXRlU3RhdGljU3R5bGVzKCksaS5fdXBkYXRlU3RhdGljU3R5bGVzKCksZS5fdXBkYXRlV2lkdGhJbmFjdGl2ZSgpLGkuX3VwZGF0ZVdpZHRoSW5hY3RpdmUoKSxlLl91cGRhdGVUaHVtYlVJQnlWYWx1ZSgpLGkuX3VwZGF0ZVRodW1iVUlCeVZhbHVlKCl9X29uRGlyQ2hhbmdlTm9uUmFuZ2UoKXt0aGlzLl9nZXRJbnB1dChjdC5FTkQpLl91cGRhdGVUaHVtYlVJQnlWYWx1ZSgpfV9vYnNlcnZlSG9zdFJlc2l6ZSgpe3R5cGVvZiBSZXNpemVPYnNlcnZlcj4idSJ8fCFSZXNpemVPYnNlcnZlcnx8dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57dGhpcy5fcmVzaXplT2JzZXJ2ZXI9bmV3IFJlc2l6ZU9ic2VydmVyKCgpPT57dGhpcy5faXNBY3RpdmUoKXx8KHRoaXMuX3Jlc2l6ZVRpbWVyJiZjbGVhclRpbWVvdXQodGhpcy5fcmVzaXplVGltZXIpLHRoaXMuX29uUmVzaXplKCkpfSksdGhpcy5fcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpfSl9X2lzQWN0aXZlKCl7cmV0dXJuIHRoaXMuX2dldFRodW1iKGN0LlNUQVJUKS5faXNBY3RpdmV8fHRoaXMuX2dldFRodW1iKGN0LkVORCkuX2lzQWN0aXZlfV9nZXRWYWx1ZShlPWN0LkVORCl7bGV0IGk9dGhpcy5fZ2V0SW5wdXQoZSk7cmV0dXJuIGk/aS52YWx1ZTp0aGlzLm1pbn1fc2tpcFVwZGF0ZSgpe3JldHVybiEhKHRoaXMuX2dldElucHV0KGN0LlNUQVJUKT8uX3NraXBVSVVwZGF0ZXx8dGhpcy5fZ2V0SW5wdXQoY3QuRU5EKT8uX3NraXBVSVVwZGF0ZSl9X3VwZGF0ZURpbWVuc2lvbnMoKXt0aGlzLl9jYWNoZWRXaWR0aD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsdGhpcy5fY2FjaGVkTGVmdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH1fc2V0VHJhY2tBY3RpdmVTdHlsZXMoZSl7bGV0IGk9dGhpcy5fdHJhY2tBY3RpdmUubmF0aXZlRWxlbWVudC5zdHlsZTtpLmxlZnQ9ZS5sZWZ0LGkucmlnaHQ9ZS5yaWdodCxpLnRyYW5zZm9ybU9yaWdpbj1lLnRyYW5zZm9ybU9yaWdpbixpLnRyYW5zZm9ybT1lLnRyYW5zZm9ybX1fY2FsY1RpY2tNYXJrVHJhbnNmb3JtKGUpe2xldCBpPWUqKHRoaXMuX3RpY2tNYXJrVHJhY2tXaWR0aC8odGhpcy5fdGlja01hcmtzLmxlbmd0aC0xKSk7cmV0dXJuYHRyYW5zbGF0ZVgoJHt0aGlzLl9pc1J0bD90aGlzLl9jYWNoZWRXaWR0aC02LWk6aX1weGB9X29uVHJhbnNsYXRlWENoYW5nZShlKXt0aGlzLl9oYXNWaWV3SW5pdGlhbGl6ZWQmJih0aGlzLl91cGRhdGVUaHVtYlVJKGUpLHRoaXMuX3VwZGF0ZVRyYWNrVUkoZSksdGhpcy5fdXBkYXRlT3ZlcmxhcHBpbmdUaHVtYlVJKGUpKX1fb25UcmFuc2xhdGVYQ2hhbmdlQnlTaWRlRWZmZWN0KGUsaSl7dGhpcy5faGFzVmlld0luaXRpYWxpemVkJiYoZS5fdXBkYXRlVGh1bWJVSUJ5VmFsdWUoKSxpLl91cGRhdGVUaHVtYlVJQnlWYWx1ZSgpKX1fb25WYWx1ZUNoYW5nZShlKXt0aGlzLl9oYXNWaWV3SW5pdGlhbGl6ZWQmJih0aGlzLl91cGRhdGVWYWx1ZUluZGljYXRvclVJKGUpLHRoaXMuX3VwZGF0ZVRpY2tNYXJrVUkoKSx0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpKX1fb25NaW5NYXhPclN0ZXBDaGFuZ2UoKXt0aGlzLl9oYXNWaWV3SW5pdGlhbGl6ZWQmJih0aGlzLl91cGRhdGVUaWNrTWFya1VJKCksdGhpcy5fdXBkYXRlVGlja01hcmtUcmFja1VJKCksdGhpcy5fY2RyLm1hcmtGb3JDaGVjaygpKX1fb25SZXNpemUoKXtpZih0aGlzLl9oYXNWaWV3SW5pdGlhbGl6ZWQpe2lmKHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKSx0aGlzLl9pc1JhbmdlKXtsZXQgZT10aGlzLl9nZXRJbnB1dChjdC5FTkQpLGk9dGhpcy5fZ2V0SW5wdXQoY3QuU1RBUlQpO2UuX3VwZGF0ZVRodW1iVUlCeVZhbHVlKCksaS5fdXBkYXRlVGh1bWJVSUJ5VmFsdWUoKSxlLl91cGRhdGVTdGF0aWNTdHlsZXMoKSxpLl91cGRhdGVTdGF0aWNTdHlsZXMoKSxlLl91cGRhdGVNaW5NYXgoKSxpLl91cGRhdGVNaW5NYXgoKSxlLl91cGRhdGVXaWR0aEluYWN0aXZlKCksaS5fdXBkYXRlV2lkdGhJbmFjdGl2ZSgpfWVsc2V7bGV0IGU9dGhpcy5fZ2V0SW5wdXQoY3QuRU5EKTtlJiZlLl91cGRhdGVUaHVtYlVJQnlWYWx1ZSgpfXRoaXMuX3VwZGF0ZVRpY2tNYXJrVUkoKSx0aGlzLl91cGRhdGVUaWNrTWFya1RyYWNrVUkoKSx0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpfX1fdGh1bWJzT3ZlcmxhcD0hMTtfYXJlVGh1bWJzT3ZlcmxhcHBpbmcoKXtsZXQgZT10aGlzLl9nZXRJbnB1dChjdC5TVEFSVCksaT10aGlzLl9nZXRJbnB1dChjdC5FTkQpO3JldHVybiFlfHwhaT8hMTppLnRyYW5zbGF0ZVgtZS50cmFuc2xhdGVYPDIwfV91cGRhdGVPdmVybGFwcGluZ1RodW1iQ2xhc3NOYW1lcyhlKXtsZXQgaT1lLmdldFNpYmxpbmcoKSxhPXRoaXMuX2dldFRodW1iKGUudGh1bWJQb3NpdGlvbik7dGhpcy5fZ2V0VGh1bWIoaS50aHVtYlBvc2l0aW9uKS5faG9zdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgibWRjLXNsaWRlcl9fdGh1bWItLXRvcCIpLGEuX2hvc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoIm1kYy1zbGlkZXJfX3RodW1iLS10b3AiLHRoaXMuX3RodW1ic092ZXJsYXApfV91cGRhdGVPdmVybGFwcGluZ1RodW1iVUkoZSl7IXRoaXMuX2lzUmFuZ2V8fHRoaXMuX3NraXBVcGRhdGUoKXx8dGhpcy5fdGh1bWJzT3ZlcmxhcCE9PXRoaXMuX2FyZVRodW1ic092ZXJsYXBwaW5nKCkmJih0aGlzLl90aHVtYnNPdmVybGFwPSF0aGlzLl90aHVtYnNPdmVybGFwLHRoaXMuX3VwZGF0ZU92ZXJsYXBwaW5nVGh1bWJDbGFzc05hbWVzKGUpKX1fdXBkYXRlVGh1bWJVSShlKXtpZih0aGlzLl9za2lwVXBkYXRlKCkpcmV0dXJuO2xldCBpPXRoaXMuX2dldFRodW1iKGUudGh1bWJQb3NpdGlvbj09PWN0LkVORD9jdC5FTkQ6Y3QuU1RBUlQpO2kuX2hvc3RFbGVtZW50LnN0eWxlLnRyYW5zZm9ybT1gdHJhbnNsYXRlWCgke2UudHJhbnNsYXRlWH1weClgfV91cGRhdGVWYWx1ZUluZGljYXRvclVJKGUpe2lmKHRoaXMuX3NraXBVcGRhdGUoKSlyZXR1cm47bGV0IGk9dGhpcy5kaXNwbGF5V2l0aChlLnZhbHVlKTtpZih0aGlzLl9oYXNWaWV3SW5pdGlhbGl6ZWQ/ZS5fdmFsdWV0ZXh0LnNldChpKTplLl9ob3N0RWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWV0ZXh0IixpKSx0aGlzLmRpc2NyZXRlKXtlLnRodW1iUG9zaXRpb249PT1jdC5TVEFSVD90aGlzLnN0YXJ0VmFsdWVJbmRpY2F0b3JUZXh0PWk6dGhpcy5lbmRWYWx1ZUluZGljYXRvclRleHQ9aTtsZXQgYT10aGlzLl9nZXRUaHVtYihlLnRodW1iUG9zaXRpb24pO2kubGVuZ3RoPDM/YS5faG9zdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgibWRjLXNsaWRlcl9fdGh1bWItLXNob3J0LXZhbHVlIik6YS5faG9zdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgibWRjLXNsaWRlcl9fdGh1bWItLXNob3J0LXZhbHVlIil9fV91cGRhdGVWYWx1ZUluZGljYXRvclVJcygpe2xldCBlPXRoaXMuX2dldElucHV0KGN0LkVORCksaT10aGlzLl9nZXRJbnB1dChjdC5TVEFSVCk7ZSYmdGhpcy5fdXBkYXRlVmFsdWVJbmRpY2F0b3JVSShlKSxpJiZ0aGlzLl91cGRhdGVWYWx1ZUluZGljYXRvclVJKGkpfV91cGRhdGVUaWNrTWFya1RyYWNrVUkoKXtpZighdGhpcy5zaG93VGlja01hcmtzfHx0aGlzLl9za2lwVXBkYXRlKCkpcmV0dXJuO2xldCBlPXRoaXMuX3N0ZXAmJnRoaXMuX3N0ZXA+MD90aGlzLl9zdGVwOjEsYT0oTWF0aC5mbG9vcih0aGlzLm1heC9lKSplLXRoaXMubWluKS8odGhpcy5tYXgtdGhpcy5taW4pO3RoaXMuX3RpY2tNYXJrVHJhY2tXaWR0aD0odGhpcy5fY2FjaGVkV2lkdGgtNikqYX1fdXBkYXRlVHJhY2tVSShlKXt0aGlzLl9za2lwVXBkYXRlKCl8fCh0aGlzLl9pc1JhbmdlP3RoaXMuX3VwZGF0ZVRyYWNrVUlSYW5nZShlKTp0aGlzLl91cGRhdGVUcmFja1VJTm9uUmFuZ2UoZSkpfV91cGRhdGVUcmFja1VJUmFuZ2UoZSl7bGV0IGk9ZS5nZXRTaWJsaW5nKCk7aWYoIWl8fCF0aGlzLl9jYWNoZWRXaWR0aClyZXR1cm47bGV0IGE9TWF0aC5hYnMoaS50cmFuc2xhdGVYLWUudHJhbnNsYXRlWCkvdGhpcy5fY2FjaGVkV2lkdGg7ZS5faXNMZWZ0VGh1bWImJnRoaXMuX2NhY2hlZFdpZHRoP3RoaXMuX3NldFRyYWNrQWN0aXZlU3R5bGVzKHtsZWZ0OiJhdXRvIixyaWdodDpgJHt0aGlzLl9jYWNoZWRXaWR0aC1pLnRyYW5zbGF0ZVh9cHhgLHRyYW5zZm9ybU9yaWdpbjoicmlnaHQiLHRyYW5zZm9ybTpgc2NhbGVYKCR7YX0pYH0pOnRoaXMuX3NldFRyYWNrQWN0aXZlU3R5bGVzKHtsZWZ0OmAke2kudHJhbnNsYXRlWH1weGAscmlnaHQ6ImF1dG8iLHRyYW5zZm9ybU9yaWdpbjoibGVmdCIsdHJhbnNmb3JtOmBzY2FsZVgoJHthfSlgfSl9X3VwZGF0ZVRyYWNrVUlOb25SYW5nZShlKXt0aGlzLl9pc1J0bD90aGlzLl9zZXRUcmFja0FjdGl2ZVN0eWxlcyh7bGVmdDoiYXV0byIscmlnaHQ6IjBweCIsdHJhbnNmb3JtT3JpZ2luOiJyaWdodCIsdHJhbnNmb3JtOmBzY2FsZVgoJHsxLWUuZmlsbFBlcmNlbnRhZ2V9KWB9KTp0aGlzLl9zZXRUcmFja0FjdGl2ZVN0eWxlcyh7bGVmdDoiMHB4IixyaWdodDoiYXV0byIsdHJhbnNmb3JtT3JpZ2luOiJsZWZ0Iix0cmFuc2Zvcm06YHNjYWxlWCgke2UuZmlsbFBlcmNlbnRhZ2V9KWB9KX1fdXBkYXRlVGlja01hcmtVSSgpe2lmKCF0aGlzLnNob3dUaWNrTWFya3N8fHRoaXMuc3RlcD09PXZvaWQgMHx8dGhpcy5taW49PT12b2lkIDB8fHRoaXMubWF4PT09dm9pZCAwKXJldHVybjtsZXQgZT10aGlzLnN0ZXA+MD90aGlzLnN0ZXA6MTt0aGlzLl9pc1JhbmdlP3RoaXMuX3VwZGF0ZVRpY2tNYXJrVUlSYW5nZShlKTp0aGlzLl91cGRhdGVUaWNrTWFya1VJTm9uUmFuZ2UoZSl9X3VwZGF0ZVRpY2tNYXJrVUlOb25SYW5nZShlKXtsZXQgaT10aGlzLl9nZXRWYWx1ZSgpLGE9TWF0aC5tYXgoTWF0aC5yb3VuZCgoaS10aGlzLm1pbikvZSksMCkrMSxyPU1hdGgubWF4KE1hdGgucm91bmQoKHRoaXMubWF4LWkpL2UpLDApLTE7dGhpcy5faXNSdGw/YSsrOnIrKyx0aGlzLl90aWNrTWFya3M9QXJyYXkoYSkuZmlsbChhby5BQ1RJVkUpLmNvbmNhdChBcnJheShyKS5maWxsKGFvLklOQUNUSVZFKSl9X3VwZGF0ZVRpY2tNYXJrVUlSYW5nZShlKXtsZXQgaT10aGlzLl9nZXRWYWx1ZSgpLGE9dGhpcy5fZ2V0VmFsdWUoY3QuU1RBUlQpLHI9TWF0aC5tYXgoTWF0aC5yb3VuZCgoYS10aGlzLm1pbikvZSksMCksbz1NYXRoLm1heChNYXRoLnJvdW5kKChpLWEpL2UpKzEsMCksZD1NYXRoLm1heChNYXRoLnJvdW5kKCh0aGlzLm1heC1pKS9lKSwwKTt0aGlzLl90aWNrTWFya3M9QXJyYXkocikuZmlsbChhby5JTkFDVElWRSkuY29uY2F0KEFycmF5KG8pLmZpbGwoYW8uQUNUSVZFKSxBcnJheShkKS5maWxsKGFvLklOQUNUSVZFKSl9X2dldElucHV0KGUpe2lmKGU9PT1jdC5FTkQmJnRoaXMuX2lucHV0KXJldHVybiB0aGlzLl9pbnB1dDtpZih0aGlzLl9pbnB1dHM/Lmxlbmd0aClyZXR1cm4gZT09PWN0LlNUQVJUP3RoaXMuX2lucHV0cy5maXJzdDp0aGlzLl9pbnB1dHMubGFzdH1fZ2V0VGh1bWIoZSl7cmV0dXJuIGU9PT1jdC5FTkQ/dGhpcy5fdGh1bWJzPy5sYXN0OnRoaXMuX3RodW1icz8uZmlyc3R9X3NldFRyYW5zaXRpb24oZSl7dGhpcy5faGFzQW5pbWF0aW9uPSF0aGlzLl9wbGF0Zm9ybS5JT1MmJmUmJiF0aGlzLl9ub29wQW5pbWF0aW9ucyx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgibWF0LW1kYy1zbGlkZXItd2l0aC1hbmltYXRpb24iLHRoaXMuX2hhc0FuaW1hdGlvbil9X2lzQ3Vyc29yT25TbGlkZXJUaHVtYihlLGkpe2xldCBhPWkud2lkdGgvMixyPWkueCthLG89aS55K2EsZD1lLmNsaWVudFgtcixwPWUuY2xpZW50WS1vO3JldHVybiBNYXRoLnBvdyhkLDIpK01hdGgucG93KHAsMik8TWF0aC5wb3coYSwyKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJtYXQtc2xpZGVyIl1dLGNvbnRlbnRRdWVyaWVzOmZ1bmN0aW9uKGksYSxyKXtpZihpJjEmJihCZShyLEx1LDUpLEJlKHIsZ0ksNCkpLGkmMil7bGV0IG87RihvPUIoKSkmJihhLl9pbnB1dD1vLmZpcnN0KSxGKG89QigpKSYmKGEuX2lucHV0cz1vKX19LHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKHRlKGRJLDUpLHRlKFB1LDUpKSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5fdHJhY2tBY3RpdmU9ci5maXJzdCksRihyPUIoKSkmJihhLl90aHVtYnM9cil9fSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtc2xpZGVyIiwibWRjLXNsaWRlciJdLGhvc3RWYXJzOjEyLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmKER0KCJtYXQtIisoYS5jb2xvcnx8InByaW1hcnkiKSksaWUoIm1kYy1zbGlkZXItLXJhbmdlIixhLl9pc1JhbmdlKSgibWRjLXNsaWRlci0tZGlzYWJsZWQiLGEuZGlzYWJsZWQpKCJtZGMtc2xpZGVyLS1kaXNjcmV0ZSIsYS5kaXNjcmV0ZSkoIm1kYy1zbGlkZXItLXRpY2stbWFya3MiLGEuc2hvd1RpY2tNYXJrcykoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixhLl9ub29wQW5pbWF0aW9ucykpfSxpbnB1dHM6e2Rpc2FibGVkOlsyLCJkaXNhYmxlZCIsImRpc2FibGVkIixaXSxkaXNjcmV0ZTpbMiwiZGlzY3JldGUiLCJkaXNjcmV0ZSIsWl0sc2hvd1RpY2tNYXJrczpbMiwic2hvd1RpY2tNYXJrcyIsInNob3dUaWNrTWFya3MiLFpdLG1pbjpbMiwibWluIiwibWluIixvdF0sY29sb3I6ImNvbG9yIixkaXNhYmxlUmlwcGxlOlsyLCJkaXNhYmxlUmlwcGxlIiwiZGlzYWJsZVJpcHBsZSIsWl0sbWF4OlsyLCJtYXgiLCJtYXgiLG90XSxzdGVwOlsyLCJzdGVwIiwic3RlcCIsb3RdLGRpc3BsYXlXaXRoOiJkaXNwbGF5V2l0aCJ9LGV4cG9ydEFzOlsibWF0U2xpZGVyIl0sZmVhdHVyZXM6W0llKFt7cHJvdmlkZTpJOCx1c2VFeGlzdGluZzp0fV0pXSxuZ0NvbnRlbnRTZWxlY3RvcnM6bUksZGVjbHM6OSx2YXJzOjUsY29uc3RzOltbInRyYWNrQWN0aXZlIiwiIl0sWyJ0aWNrTWFya0NvbnRhaW5lciIsIiJdLFsxLCJtZGMtc2xpZGVyX190cmFjayJdLFsxLCJtZGMtc2xpZGVyX190cmFjay0taW5hY3RpdmUiXSxbMSwibWRjLXNsaWRlcl9fdHJhY2stLWFjdGl2ZSJdLFsxLCJtZGMtc2xpZGVyX190cmFjay0tYWN0aXZlX2ZpbGwiXSxbMSwibWRjLXNsaWRlcl9fdGljay1tYXJrcyJdLFszLCJkaXNjcmV0ZSIsInRodW1iUG9zaXRpb24iLCJ2YWx1ZUluZGljYXRvclRleHQiXSxbMywiY2xhc3MiLCJ0cmFuc2Zvcm0iXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihSZSgpLG1lKDApLGMoMSwiZGl2IiwyKSx1KDIsImRpdiIsMyksYygzLCJkaXYiLDQpLHUoNCwiZGl2Iiw1LDApLHMoKSxNKDYsZkksMywxLCJkaXYiLDYpLHMoKSxNKDcsdUksMSwzLCJtYXQtc2xpZGVyLXZpc3VhbC10aHVtYiIsNyksdSg4LCJtYXQtc2xpZGVyLXZpc3VhbC10aHVtYiIsNykpLGkmMiYmKGwoNiksdyhhLnNob3dUaWNrTWFya3M/NjotMSksbCgpLHcoYS5faXNSYW5nZT83Oi0xKSxsKCksZigiZGlzY3JldGUiLGEuZGlzY3JldGUpKCJ0aHVtYlBvc2l0aW9uIiwyKSgidmFsdWVJbmRpY2F0b3JUZXh0IixhLmVuZFZhbHVlSW5kaWNhdG9yVGV4dCkpfSxkZXBlbmRlbmNpZXM6W3ZJXSxzdHlsZXM6W2AubWRjLXNsaWRlcl9fdHJhY2t7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTt3aWR0aDoxMDAlO3BvaW50ZXItZXZlbnRzOm5vbmU7aGVpZ2h0OnZhcigtLW1hdC1zbGlkZXItaW5hY3RpdmUtdHJhY2staGVpZ2h0LCA0cHgpfS5tZGMtc2xpZGVyX190cmFjay0tYWN0aXZlLC5tZGMtc2xpZGVyX190cmFjay0taW5hY3RpdmV7ZGlzcGxheTpmbGV4O2hlaWdodDoxMDAlO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCV9Lm1kYy1zbGlkZXJfX3RyYWNrLS1hY3RpdmV7b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1yYWRpdXM6dmFyKC0tbWF0LXNsaWRlci1hY3RpdmUtdHJhY2stc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWZ1bGwpKTtoZWlnaHQ6dmFyKC0tbWF0LXNsaWRlci1hY3RpdmUtdHJhY2staGVpZ2h0LCA0cHgpO3RvcDpjYWxjKCh2YXIoLS1tYXQtc2xpZGVyLWluYWN0aXZlLXRyYWNrLWhlaWdodCwgNHB4KSAtIHZhcigtLW1hdC1zbGlkZXItYWN0aXZlLXRyYWNrLWhlaWdodCwgNHB4KSkvMil9Lm1kYy1zbGlkZXJfX3RyYWNrLS1hY3RpdmVfZmlsbHtib3JkZXItdG9wLXN0eWxlOnNvbGlkO2JveC1zaXppbmc6Ym9yZGVyLWJveDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlO3RyYW5zZm9ybS1vcmlnaW46bGVmdDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA4MG1zIGVhc2U7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1zbGlkZXItYWN0aXZlLXRyYWNrLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKTtib3JkZXItdG9wLXdpZHRoOnZhcigtLW1hdC1zbGlkZXItYWN0aXZlLXRyYWNrLWhlaWdodCwgNHB4KX0ubWRjLXNsaWRlci0tZGlzYWJsZWQgLm1kYy1zbGlkZXJfX3RyYWNrLS1hY3RpdmVfZmlsbHtib3JkZXItY29sb3I6dmFyKC0tbWF0LXNsaWRlci1kaXNhYmxlZC1hY3RpdmUtdHJhY2stY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfVtkaXI9cnRsXSAubWRjLXNsaWRlcl9fdHJhY2stLWFjdGl2ZV9maWxsey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodDt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0fS5tZGMtc2xpZGVyX190cmFjay0taW5hY3RpdmV7bGVmdDowO3RvcDowO29wYWNpdHk6LjI0O2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXNsaWRlci1pbmFjdGl2ZS10cmFjay1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlLXZhcmlhbnQpKTtoZWlnaHQ6dmFyKC0tbWF0LXNsaWRlci1pbmFjdGl2ZS10cmFjay1oZWlnaHQsIDRweCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYXQtc2xpZGVyLWluYWN0aXZlLXRyYWNrLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1mdWxsKSl9Lm1kYy1zbGlkZXItLWRpc2FibGVkIC5tZGMtc2xpZGVyX190cmFjay0taW5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtc2xpZGVyLWRpc2FibGVkLWluYWN0aXZlLXRyYWNrLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKTtvcGFjaXR5Oi4yNH0ubWRjLXNsaWRlcl9fdHJhY2stLWluYWN0aXZlOjpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dG9wOjA7bGVmdDowO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwwKTtib3JkZXItcmFkaXVzOmluaGVyaXQ7Y29udGVudDoiIjtwb2ludGVyLWV2ZW50czpub25lfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tZGMtc2xpZGVyX190cmFjay0taW5hY3RpdmU6OmJlZm9yZXtib3JkZXItY29sb3I6Q2FudmFzVGV4dH19Lm1kYy1zbGlkZXJfX3ZhbHVlLWluZGljYXRvci1jb250YWluZXJ7Ym90dG9tOjQ0cHg7bGVmdDo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt0cmFuc2Zvcm06dmFyKC0tbWF0LXNsaWRlci12YWx1ZS1pbmRpY2F0b3ItY29udGFpbmVyLXRyYW5zZm9ybSwgdHJhbnNsYXRlWCgtNTAlKSByb3RhdGUoLTQ1ZGVnKSl9Lm1kYy1zbGlkZXJfX3RodW1iLS13aXRoLWluZGljYXRvciAubWRjLXNsaWRlcl9fdmFsdWUtaW5kaWNhdG9yLWNvbnRhaW5lcntwb2ludGVyLWV2ZW50czphdXRvfS5tZGMtc2xpZGVyX192YWx1ZS1pbmRpY2F0b3J7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjt0cmFuc2Zvcm06c2NhbGUoMCk7dHJhbnNmb3JtLW9yaWdpbjp2YXIoLS1tYXQtc2xpZGVyLXZhbHVlLWluZGljYXRvci10cmFuc2Zvcm0tb3JpZ2luLCAwIDI4cHgpO3RyYW5zaXRpb246dHJhbnNmb3JtIDEwMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDEsIDEpO3dvcmQtYnJlYWs6bm9ybWFsO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXNsaWRlci1sYWJlbC1jb250YWluZXItY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpO2NvbG9yOnZhcigtLW1hdC1zbGlkZXItbGFiZWwtbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1wcmltYXJ5KSk7d2lkdGg6dmFyKC0tbWF0LXNsaWRlci12YWx1ZS1pbmRpY2F0b3Itd2lkdGgsIDI4cHgpO2hlaWdodDp2YXIoLS1tYXQtc2xpZGVyLXZhbHVlLWluZGljYXRvci1oZWlnaHQsIDI4cHgpO3BhZGRpbmc6dmFyKC0tbWF0LXNsaWRlci12YWx1ZS1pbmRpY2F0b3ItcGFkZGluZywgMCk7b3BhY2l0eTp2YXIoLS1tYXQtc2xpZGVyLXZhbHVlLWluZGljYXRvci1vcGFjaXR5LCAxKTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1zbGlkZXItdmFsdWUtaW5kaWNhdG9yLWJvcmRlci1yYWRpdXMsIDUwJSA1MCUgNTAlIDApfS5tZGMtc2xpZGVyX190aHVtYi0td2l0aC1pbmRpY2F0b3IgLm1kYy1zbGlkZXJfX3ZhbHVlLWluZGljYXRvcnt0cmFuc2l0aW9uOnRyYW5zZm9ybSAxMDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMSl9Lm1kYy1zbGlkZXJfX3ZhbHVlLWluZGljYXRvcjo6YmVmb3Jle2JvcmRlci1sZWZ0OjZweCBzb2xpZCByZ2JhKDAsMCwwLDApO2JvcmRlci1yaWdodDo2cHggc29saWQgcmdiYSgwLDAsMCwwKTtib3JkZXItdG9wOjZweCBzb2xpZDtib3R0b206LTVweDtjb250ZW50OiIiO2hlaWdodDowO2xlZnQ6NTAlO3Bvc2l0aW9uOmFic29sdXRlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO3dpZHRoOjA7ZGlzcGxheTp2YXIoLS1tYXQtc2xpZGVyLXZhbHVlLWluZGljYXRvci1jYXJldC1kaXNwbGF5LCBub25lKTtib3JkZXItdG9wLWNvbG9yOnZhcigtLW1hdC1zbGlkZXItbGFiZWwtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWRjLXNsaWRlcl9fdmFsdWUtaW5kaWNhdG9yOjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3A6MDtsZWZ0OjA7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLDApO2JvcmRlci1yYWRpdXM6aW5oZXJpdDtjb250ZW50OiIiO3BvaW50ZXItZXZlbnRzOm5vbmV9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1kYy1zbGlkZXJfX3ZhbHVlLWluZGljYXRvcjo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOkNhbnZhc1RleHR9fS5tZGMtc2xpZGVyX192YWx1ZS1pbmRpY2F0b3ItdGV4dHt0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDp2YXIoLS1tYXQtc2xpZGVyLXZhbHVlLWluZGljYXRvci13aWR0aCwgMjhweCk7dHJhbnNmb3JtOnZhcigtLW1hdC1zbGlkZXItdmFsdWUtaW5kaWNhdG9yLXRleHQtdHJhbnNmb3JtLCByb3RhdGUoNDVkZWcpKTtmb250LWZhbWlseTp2YXIoLS1tYXQtc2xpZGVyLWxhYmVsLWxhYmVsLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1tZWRpdW0tZm9udCkpO2ZvbnQtc2l6ZTp2YXIoLS1tYXQtc2xpZGVyLWxhYmVsLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1sYWJlbC1tZWRpdW0tc2l6ZSkpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hdC1zbGlkZXItbGFiZWwtbGFiZWwtdGV4dC13ZWlnaHQsIHZhcigtLW1hdC1zeXMtbGFiZWwtbWVkaXVtLXdlaWdodCkpO2xpbmUtaGVpZ2h0OnZhcigtLW1hdC1zbGlkZXItbGFiZWwtbGFiZWwtdGV4dC1saW5lLWhlaWdodCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1tZWRpdW0tbGluZS1oZWlnaHQpKTtsZXR0ZXItc3BhY2luZzp2YXIoLS1tYXQtc2xpZGVyLWxhYmVsLWxhYmVsLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtbGFiZWwtbWVkaXVtLXRyYWNraW5nKSl9Lm1kYy1zbGlkZXJfX3RodW1iey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2Rpc3BsYXk6ZmxleDtsZWZ0Oi0yNHB4O291dGxpbmU6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6NDhweDt3aWR0aDo0OHB4O3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1kYy1zbGlkZXItLWRpc2NyZXRlIC5tZGMtc2xpZGVyX190aHVtYnt0cmFuc2l0aW9uOnRyYW5zZm9ybSA4MG1zIGVhc2V9Lm1kYy1zbGlkZXItLWRpc2FibGVkIC5tZGMtc2xpZGVyX190aHVtYntwb2ludGVyLWV2ZW50czpub25lfS5tZGMtc2xpZGVyX190aHVtYi0tdG9we3otaW5kZXg6MX0ubWRjLXNsaWRlcl9fdGh1bWIta25vYntwb3NpdGlvbjphYnNvbHV0ZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7bGVmdDo1MCU7dG9wOjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsIC01MCUpO2JvcmRlci1zdHlsZTpzb2xpZDt3aWR0aDp2YXIoLS1tYXQtc2xpZGVyLWhhbmRsZS13aWR0aCwgMjBweCk7aGVpZ2h0OnZhcigtLW1hdC1zbGlkZXItaGFuZGxlLWhlaWdodCwgMjBweCk7Ym9yZGVyLXdpZHRoOmNhbGModmFyKC0tbWF0LXNsaWRlci1oYW5kbGUtaGVpZ2h0LCAyMHB4KS8yKSBjYWxjKHZhcigtLW1hdC1zbGlkZXItaGFuZGxlLXdpZHRoLCAyMHB4KS8yKTtib3gtc2hhZG93OnZhcigtLW1hdC1zbGlkZXItaGFuZGxlLWVsZXZhdGlvbiwgdmFyKC0tbWF0LXN5cy1sZXZlbDEpKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1zbGlkZXItaGFuZGxlLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKTtib3JkZXItY29sb3I6dmFyKC0tbWF0LXNsaWRlci1oYW5kbGUtY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpO2JvcmRlci1yYWRpdXM6dmFyKC0tbWF0LXNsaWRlci1oYW5kbGUtc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWZ1bGwpKX0ubWRjLXNsaWRlcl9fdGh1bWI6aG92ZXIgLm1kYy1zbGlkZXJfX3RodW1iLWtub2J7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtc2xpZGVyLWhvdmVyLWhhbmRsZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1zbGlkZXItaG92ZXItaGFuZGxlLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWRjLXNsaWRlcl9fdGh1bWItLWZvY3VzZWQgLm1kYy1zbGlkZXJfX3RodW1iLWtub2J7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtc2xpZGVyLWZvY3VzLWhhbmRsZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1zbGlkZXItZm9jdXMtaGFuZGxlLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWRjLXNsaWRlci0tZGlzYWJsZWQgLm1kYy1zbGlkZXJfX3RodW1iLWtub2J7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtc2xpZGVyLWRpc2FibGVkLWhhbmRsZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1zbGlkZXItZGlzYWJsZWQtaGFuZGxlLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWRjLXNsaWRlcl9fdGh1bWItLXRvcCAubWRjLXNsaWRlcl9fdGh1bWIta25vYiwubWRjLXNsaWRlcl9fdGh1bWItLXRvcC5tZGMtc2xpZGVyX190aHVtYjpob3ZlciAubWRjLXNsaWRlcl9fdGh1bWIta25vYiwubWRjLXNsaWRlcl9fdGh1bWItLXRvcC5tZGMtc2xpZGVyX190aHVtYi0tZm9jdXNlZCAubWRjLXNsaWRlcl9fdGh1bWIta25vYntib3JkZXI6c29saWQgMXB4ICNmZmY7Ym94LXNpemluZzpjb250ZW50LWJveDtib3JkZXItY29sb3I6dmFyKC0tbWF0LXNsaWRlci13aXRoLW92ZXJsYXAtaGFuZGxlLW91dGxpbmUtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tcHJpbWFyeSkpO2JvcmRlci13aWR0aDp2YXIoLS1tYXQtc2xpZGVyLXdpdGgtb3ZlcmxhcC1oYW5kbGUtb3V0bGluZS13aWR0aCwgMXB4KX0ubWRjLXNsaWRlcl9fdGljay1tYXJrc3thbGlnbi1pdGVtczpjZW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6ZmxleDtoZWlnaHQ6MTAwJTtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtwYWRkaW5nOjAgMXB4O3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCV9Lm1kYy1zbGlkZXJfX3RpY2stbWFyay0tYWN0aXZlLC5tZGMtc2xpZGVyX190aWNrLW1hcmstLWluYWN0aXZle3dpZHRoOnZhcigtLW1hdC1zbGlkZXItd2l0aC10aWNrLW1hcmtzLWNvbnRhaW5lci1zaXplLCAycHgpO2hlaWdodDp2YXIoLS1tYXQtc2xpZGVyLXdpdGgtdGljay1tYXJrcy1jb250YWluZXItc2l6ZSwgMnB4KTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1zbGlkZXItd2l0aC10aWNrLW1hcmtzLWNvbnRhaW5lci1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZnVsbCkpfS5tZGMtc2xpZGVyX190aWNrLW1hcmstLWluYWN0aXZle29wYWNpdHk6dmFyKC0tbWF0LXNsaWRlci13aXRoLXRpY2stbWFya3MtaW5hY3RpdmUtY29udGFpbmVyLW9wYWNpdHksIDAuMzgpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXNsaWRlci13aXRoLXRpY2stbWFya3MtaW5hY3RpdmUtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tZGMtc2xpZGVyLS1kaXNhYmxlZCAubWRjLXNsaWRlcl9fdGljay1tYXJrLS1pbmFjdGl2ZXtvcGFjaXR5OnZhcigtLW1hdC1zbGlkZXItd2l0aC10aWNrLW1hcmtzLWluYWN0aXZlLWNvbnRhaW5lci1vcGFjaXR5LCAwLjM4KTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1zbGlkZXItd2l0aC10aWNrLW1hcmtzLWRpc2FibGVkLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1kYy1zbGlkZXJfX3RpY2stbWFyay0tYWN0aXZle29wYWNpdHk6dmFyKC0tbWF0LXNsaWRlci13aXRoLXRpY2stbWFya3MtYWN0aXZlLWNvbnRhaW5lci1vcGFjaXR5LCAwLjM4KTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1zbGlkZXItd2l0aC10aWNrLW1hcmtzLWFjdGl2ZS1jb250YWluZXItY29sb3IsIHZhcigtLW1hdC1zeXMtb24tcHJpbWFyeSkpfS5tZGMtc2xpZGVyX19pbnB1dHtjdXJzb3I6cG9pbnRlcjtsZWZ0OjJweDttYXJnaW46MDtoZWlnaHQ6NDRweDtvcGFjaXR5OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjJweDt3aWR0aDo0NHB4O2JveC1zaXppbmc6Y29udGVudC1ib3h9Lm1kYy1zbGlkZXJfX2lucHV0Lm1hdC1tZGMtc2xpZGVyLWlucHV0LW5vLXBvaW50ZXItZXZlbnRze3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1kYy1zbGlkZXJfX2lucHV0Lm1hdC1zbGlkZXJfX3JpZ2h0LWlucHV0e2xlZnQ6YXV0bztyaWdodDowfS5tYXQtbWRjLXNsaWRlcntkaXNwbGF5OmlubGluZS1ibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3V0bGluZTpub25lO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtjdXJzb3I6cG9pbnRlcjtoZWlnaHQ6NDhweDttYXJnaW46MCA4cHg7cG9zaXRpb246cmVsYXRpdmU7dG91Y2gtYWN0aW9uOnBhbi15O3dpZHRoOmF1dG87bWluLXdpZHRoOjExMnB4Oy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDAsMCwwLDApfS5tYXQtbWRjLXNsaWRlci5tZGMtc2xpZGVyLS1kaXNhYmxlZHtjdXJzb3I6YXV0bztvcGFjaXR5Oi4zOH0ubWF0LW1kYy1zbGlkZXIubWRjLXNsaWRlci0tZGlzYWJsZWQgLm1kYy1zbGlkZXJfX2lucHV0e2N1cnNvcjphdXRvfS5tYXQtbWRjLXNsaWRlciAubWRjLXNsaWRlcl9fdGh1bWIsLm1hdC1tZGMtc2xpZGVyIC5tZGMtc2xpZGVyX190cmFjay0tYWN0aXZlX2ZpbGx7dHJhbnNpdGlvbi1kdXJhdGlvbjowbXN9Lm1hdC1tZGMtc2xpZGVyLm1hdC1tZGMtc2xpZGVyLXdpdGgtYW5pbWF0aW9uIC5tZGMtc2xpZGVyX190aHVtYiwubWF0LW1kYy1zbGlkZXIubWF0LW1kYy1zbGlkZXItd2l0aC1hbmltYXRpb24gLm1kYy1zbGlkZXJfX3RyYWNrLS1hY3RpdmVfZmlsbHt0cmFuc2l0aW9uLWR1cmF0aW9uOjgwbXN9Lm1hdC1tZGMtc2xpZGVyLm1kYy1zbGlkZXItLWRpc2NyZXRlIC5tZGMtc2xpZGVyX190aHVtYiwubWF0LW1kYy1zbGlkZXIubWRjLXNsaWRlci0tZGlzY3JldGUgLm1kYy1zbGlkZXJfX3RyYWNrLS1hY3RpdmVfZmlsbHt0cmFuc2l0aW9uLWR1cmF0aW9uOjBtc30ubWF0LW1kYy1zbGlkZXIubWF0LW1kYy1zbGlkZXItd2l0aC1hbmltYXRpb24gLm1kYy1zbGlkZXJfX3RodW1iLC5tYXQtbWRjLXNsaWRlci5tYXQtbWRjLXNsaWRlci13aXRoLWFuaW1hdGlvbiAubWRjLXNsaWRlcl9fdHJhY2stLWFjdGl2ZV9maWxse3RyYW5zaXRpb24tZHVyYXRpb246ODBtc30ubWF0LW1kYy1zbGlkZXIgLm1hdC1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1zbGlkZXItcmlwcGxlLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWF0LW1kYy1zbGlkZXIgLm1hdC1yaXBwbGUgLm1hdC1tZGMtc2xpZGVyLWhvdmVyLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1zbGlkZXItaG92ZXItc3RhdGUtbGF5ZXItY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpIDUlLCB0cmFuc3BhcmVudCkpfS5tYXQtbWRjLXNsaWRlciAubWF0LXJpcHBsZSAubWF0LW1kYy1zbGlkZXItZm9jdXMtcmlwcGxlLC5tYXQtbWRjLXNsaWRlciAubWF0LXJpcHBsZSAubWF0LW1kYy1zbGlkZXItYWN0aXZlLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1zbGlkZXItZm9jdXMtc3RhdGUtbGF5ZXItY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpIDIwJSwgdHJhbnNwYXJlbnQpKX0ubWF0LW1kYy1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUubWRjLXNsaWRlci0tZGlzY3JldGUgLm1kYy1zbGlkZXJfX3RodW1iLC5tYXQtbWRjLXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tZGMtc2xpZGVyLS1kaXNjcmV0ZSAubWRjLXNsaWRlcl9fdHJhY2stLWFjdGl2ZV9maWxsLC5tYXQtbWRjLXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWRjLXNsaWRlcl9fdmFsdWUtaW5kaWNhdG9ye3RyYW5zaXRpb246bm9uZX0ubWF0LW1kYy1zbGlkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXtib3JkZXItcmFkaXVzOjUwJX0ubWRjLXNsaWRlcl9fdGh1bWItLWZvY3VzZWQgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXtjb250ZW50OiIifQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCksX0k9e3Byb3ZpZGU6ZjIsdXNlRXhpc3Rpbmc6aGkoKCk9Pkw4KSxtdWx0aTohMH0sTDg9KCgpPT57Y2xhc3MgdHtfbmdab25lPWgocmUpO19lbGVtZW50UmVmPWgoYWUpO19jZHI9aChFZSk7X3NsaWRlcj1oKEk4KTtfcGxhdGZvcm09aChiMSk7X2xpc3RlbmVyQ2xlYW51cHM7Z2V0IHZhbHVlKCl7cmV0dXJuIG90KHRoaXMuX2hvc3RFbGVtZW50LnZhbHVlLDApfXNldCB2YWx1ZShlKXtlPT09bnVsbCYmKGU9dGhpcy5fZ2V0RGVmYXVsdFZhbHVlKCkpLGU9aXNOYU4oZSk/MDplO2xldCBpPWUrIiI7aWYoIXRoaXMuX2hhc1NldEluaXRpYWxWYWx1ZSl7dGhpcy5faW5pdGlhbFZhbHVlPWk7cmV0dXJufXRoaXMuX2lzQWN0aXZlfHx0aGlzLl9zZXRWYWx1ZShpKX1fc2V0VmFsdWUoZSl7dGhpcy5faG9zdEVsZW1lbnQudmFsdWU9ZSx0aGlzLl91cGRhdGVUaHVtYlVJQnlWYWx1ZSgpLHRoaXMuX3NsaWRlci5fb25WYWx1ZUNoYW5nZSh0aGlzKSx0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpLHRoaXMuX3NsaWRlci5fY2RyLm1hcmtGb3JDaGVjaygpfXZhbHVlQ2hhbmdlPW5ldyBOO2RyYWdTdGFydD1uZXcgTjtkcmFnRW5kPW5ldyBOO2dldCB0cmFuc2xhdGVYKCl7cmV0dXJuIHRoaXMuX3NsaWRlci5taW4+PXRoaXMuX3NsaWRlci5tYXg/KHRoaXMuX3RyYW5zbGF0ZVg9dGhpcy5fdGlja01hcmtPZmZzZXQsdGhpcy5fdHJhbnNsYXRlWCk6KHRoaXMuX3RyYW5zbGF0ZVg9PT12b2lkIDAmJih0aGlzLl90cmFuc2xhdGVYPXRoaXMuX2NhbGNUcmFuc2xhdGVYQnlWYWx1ZSgpKSx0aGlzLl90cmFuc2xhdGVYKX1zZXQgdHJhbnNsYXRlWChlKXt0aGlzLl90cmFuc2xhdGVYPWV9X3RyYW5zbGF0ZVg7dGh1bWJQb3NpdGlvbj1jdC5FTkQ7Z2V0IG1pbigpe3JldHVybiBvdCh0aGlzLl9ob3N0RWxlbWVudC5taW4sMCl9c2V0IG1pbihlKXt0aGlzLl9ob3N0RWxlbWVudC5taW49ZSsiIix0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpfWdldCBtYXgoKXtyZXR1cm4gb3QodGhpcy5faG9zdEVsZW1lbnQubWF4LDApfXNldCBtYXgoZSl7dGhpcy5faG9zdEVsZW1lbnQubWF4PWUrIiIsdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKX1nZXQgc3RlcCgpe3JldHVybiBvdCh0aGlzLl9ob3N0RWxlbWVudC5zdGVwLDApfXNldCBzdGVwKGUpe3RoaXMuX2hvc3RFbGVtZW50LnN0ZXA9ZSsiIix0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpfWdldCBkaXNhYmxlZCgpe3JldHVybiBaKHRoaXMuX2hvc3RFbGVtZW50LmRpc2FibGVkKX1zZXQgZGlzYWJsZWQoZSl7dGhpcy5faG9zdEVsZW1lbnQuZGlzYWJsZWQ9ZSx0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpLHRoaXMuX3NsaWRlci5kaXNhYmxlZCE9PXRoaXMuZGlzYWJsZWQmJih0aGlzLl9zbGlkZXIuZGlzYWJsZWQ9dGhpcy5kaXNhYmxlZCl9Z2V0IHBlcmNlbnRhZ2UoKXtyZXR1cm4gdGhpcy5fc2xpZGVyLm1pbj49dGhpcy5fc2xpZGVyLm1heD90aGlzLl9zbGlkZXIuX2lzUnRsPzE6MDoodGhpcy52YWx1ZS10aGlzLl9zbGlkZXIubWluKS8odGhpcy5fc2xpZGVyLm1heC10aGlzLl9zbGlkZXIubWluKX1nZXQgZmlsbFBlcmNlbnRhZ2UoKXtyZXR1cm4gdGhpcy5fc2xpZGVyLl9jYWNoZWRXaWR0aD90aGlzLl90cmFuc2xhdGVYPT09MD8wOnRoaXMudHJhbnNsYXRlWC90aGlzLl9zbGlkZXIuX2NhY2hlZFdpZHRoOnRoaXMuX3NsaWRlci5faXNSdGw/MTowfV9ob3N0RWxlbWVudD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7X3ZhbHVldGV4dD1mdCgiIik7X2tub2JSYWRpdXM9ODtfdGlja01hcmtPZmZzZXQ9MztfaXNBY3RpdmU9ITE7X2lzRm9jdXNlZD0hMTtfc2V0SXNGb2N1c2VkKGUpe3RoaXMuX2lzRm9jdXNlZD1lfV9oYXNTZXRJbml0aWFsVmFsdWU9ITE7X2luaXRpYWxWYWx1ZTtfZm9ybUNvbnRyb2w7X2Rlc3Ryb3llZD1uZXcgd2U7X3NraXBVSVVwZGF0ZT0hMTtfb25DaGFuZ2VGbjtfb25Ub3VjaGVkRm49KCk9Pnt9O19pc0NvbnRyb2xJbml0aWFsaXplZD0hMTtjb25zdHJ1Y3Rvcigpe2xldCBlPWgodjEpO3RoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e3RoaXMuX2xpc3RlbmVyQ2xlYW51cHM9W2UubGlzdGVuKHRoaXMuX2hvc3RFbGVtZW50LCJwb2ludGVyZG93biIsdGhpcy5fb25Qb2ludGVyRG93bi5iaW5kKHRoaXMpKSxlLmxpc3Rlbih0aGlzLl9ob3N0RWxlbWVudCwicG9pbnRlcm1vdmUiLHRoaXMuX29uUG9pbnRlck1vdmUuYmluZCh0aGlzKSksZS5saXN0ZW4odGhpcy5faG9zdEVsZW1lbnQsInBvaW50ZXJ1cCIsdGhpcy5fb25Qb2ludGVyVXAuYmluZCh0aGlzKSldfSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9saXN0ZW5lckNsZWFudXBzLmZvckVhY2goZT0+ZSgpKSx0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpLHRoaXMuZHJhZ1N0YXJ0LmNvbXBsZXRlKCksdGhpcy5kcmFnRW5kLmNvbXBsZXRlKCl9aW5pdFByb3BzKCl7dGhpcy5fdXBkYXRlV2lkdGhJbmFjdGl2ZSgpLHRoaXMuZGlzYWJsZWQhPT10aGlzLl9zbGlkZXIuZGlzYWJsZWQmJih0aGlzLl9zbGlkZXIuZGlzYWJsZWQ9ITApLHRoaXMuc3RlcD10aGlzLl9zbGlkZXIuc3RlcCx0aGlzLm1pbj10aGlzLl9zbGlkZXIubWluLHRoaXMubWF4PXRoaXMuX3NsaWRlci5tYXgsdGhpcy5faW5pdFZhbHVlKCl9aW5pdFVJKCl7dGhpcy5fdXBkYXRlVGh1bWJVSUJ5VmFsdWUoKX1faW5pdFZhbHVlKCl7dGhpcy5faGFzU2V0SW5pdGlhbFZhbHVlPSEwLHRoaXMuX2luaXRpYWxWYWx1ZT09PXZvaWQgMD90aGlzLnZhbHVlPXRoaXMuX2dldERlZmF1bHRWYWx1ZSgpOih0aGlzLl9ob3N0RWxlbWVudC52YWx1ZT10aGlzLl9pbml0aWFsVmFsdWUsdGhpcy5fdXBkYXRlVGh1bWJVSUJ5VmFsdWUoKSx0aGlzLl9zbGlkZXIuX29uVmFsdWVDaGFuZ2UodGhpcyksdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKSl9X2dldERlZmF1bHRWYWx1ZSgpe3JldHVybiB0aGlzLm1pbn1fb25CbHVyKCl7dGhpcy5fc2V0SXNGb2N1c2VkKCExKSx0aGlzLl9vblRvdWNoZWRGbigpfV9vbkZvY3VzKCl7dGhpcy5fc2xpZGVyLl9zZXRUcmFuc2l0aW9uKCExKSx0aGlzLl9zbGlkZXIuX3VwZGF0ZVRyYWNrVUkodGhpcyksdGhpcy5fc2V0SXNGb2N1c2VkKCEwKX1fb25DaGFuZ2UoKXt0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSksdGhpcy5faXNBY3RpdmUmJnRoaXMuX3VwZGF0ZVRodW1iVUlCeVZhbHVlKHt3aXRoQW5pbWF0aW9uOiEwfSl9X29uSW5wdXQoKXt0aGlzLl9vbkNoYW5nZUZuPy4odGhpcy52YWx1ZSksKHRoaXMuX3NsaWRlci5zdGVwfHwhdGhpcy5faXNBY3RpdmUpJiZ0aGlzLl91cGRhdGVUaHVtYlVJQnlWYWx1ZSh7d2l0aEFuaW1hdGlvbjohMH0pLHRoaXMuX3NsaWRlci5fb25WYWx1ZUNoYW5nZSh0aGlzKX1fb25OZ0NvbnRyb2xWYWx1ZUNoYW5nZSgpeyghdGhpcy5faXNBY3RpdmV8fCF0aGlzLl9pc0ZvY3VzZWQpJiYodGhpcy5fc2xpZGVyLl9vblZhbHVlQ2hhbmdlKHRoaXMpLHRoaXMuX3VwZGF0ZVRodW1iVUlCeVZhbHVlKCkpLHRoaXMuX3NsaWRlci5kaXNhYmxlZD10aGlzLl9mb3JtQ29udHJvbC5kaXNhYmxlZH1fb25Qb2ludGVyRG93bihlKXtpZighKHRoaXMuZGlzYWJsZWR8fGUuYnV0dG9uIT09MCkpe2lmKHRoaXMuX3BsYXRmb3JtLklPUyl7bGV0IGk9dGhpcy5fc2xpZGVyLl9pc0N1cnNvck9uU2xpZGVyVGh1bWIoZSx0aGlzLl9zbGlkZXIuX2dldFRodW1iKHRoaXMudGh1bWJQb3NpdGlvbikuX2hvc3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTt0aGlzLl9pc0FjdGl2ZT1pLHRoaXMuX3VwZGF0ZVdpZHRoQWN0aXZlKCksdGhpcy5fc2xpZGVyLl91cGRhdGVEaW1lbnNpb25zKCk7cmV0dXJufXRoaXMuX2lzQWN0aXZlPSEwLHRoaXMuX3NldElzRm9jdXNlZCghMCksdGhpcy5fdXBkYXRlV2lkdGhBY3RpdmUoKSx0aGlzLl9zbGlkZXIuX3VwZGF0ZURpbWVuc2lvbnMoKSx0aGlzLl9zbGlkZXIuc3RlcHx8dGhpcy5fdXBkYXRlVGh1bWJVSUJ5UG9pbnRlckV2ZW50KGUse3dpdGhBbmltYXRpb246ITB9KSx0aGlzLmRpc2FibGVkfHwodGhpcy5faGFuZGxlVmFsdWVDb3JyZWN0aW9uKGUpLHRoaXMuZHJhZ1N0YXJ0LmVtaXQoe3NvdXJjZTp0aGlzLHBhcmVudDp0aGlzLl9zbGlkZXIsdmFsdWU6dGhpcy52YWx1ZX0pKX19X2hhbmRsZVZhbHVlQ29ycmVjdGlvbihlKXt0aGlzLl9za2lwVUlVcGRhdGU9ITAsc2V0VGltZW91dCgoKT0+e3RoaXMuX3NraXBVSVVwZGF0ZT0hMSx0aGlzLl9maXhWYWx1ZShlKX0sMCl9X2ZpeFZhbHVlKGUpe2xldCBpPWUuY2xpZW50WC10aGlzLl9zbGlkZXIuX2NhY2hlZExlZnQsYT10aGlzLl9zbGlkZXIuX2NhY2hlZFdpZHRoLHI9dGhpcy5fc2xpZGVyLnN0ZXA9PT0wPzE6dGhpcy5fc2xpZGVyLnN0ZXAsbz1NYXRoLmZsb29yKCh0aGlzLl9zbGlkZXIubWF4LXRoaXMuX3NsaWRlci5taW4pL3IpLGQ9dGhpcy5fc2xpZGVyLl9pc1J0bD8xLWkvYTppL2EsZz1NYXRoLnJvdW5kKGQqbykvbyoodGhpcy5fc2xpZGVyLm1heC10aGlzLl9zbGlkZXIubWluKSt0aGlzLl9zbGlkZXIubWluLF89TWF0aC5yb3VuZChnL3IpKnIseT10aGlzLnZhbHVlO2lmKF89PT15KXt0aGlzLl9zbGlkZXIuX29uVmFsdWVDaGFuZ2UodGhpcyksdGhpcy5fc2xpZGVyLnN0ZXA+MD90aGlzLl91cGRhdGVUaHVtYlVJQnlWYWx1ZSgpOnRoaXMuX3VwZGF0ZVRodW1iVUlCeVBvaW50ZXJFdmVudChlLHt3aXRoQW5pbWF0aW9uOnRoaXMuX3NsaWRlci5faGFzQW5pbWF0aW9ufSk7cmV0dXJufXRoaXMudmFsdWU9Xyx0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSksdGhpcy5fb25DaGFuZ2VGbj8uKHRoaXMudmFsdWUpLHRoaXMuX3NsaWRlci5fb25WYWx1ZUNoYW5nZSh0aGlzKSx0aGlzLl9zbGlkZXIuc3RlcD4wP3RoaXMuX3VwZGF0ZVRodW1iVUlCeVZhbHVlKCk6dGhpcy5fdXBkYXRlVGh1bWJVSUJ5UG9pbnRlckV2ZW50KGUse3dpdGhBbmltYXRpb246dGhpcy5fc2xpZGVyLl9oYXNBbmltYXRpb259KX1fb25Qb2ludGVyTW92ZShlKXshdGhpcy5fc2xpZGVyLnN0ZXAmJnRoaXMuX2lzQWN0aXZlJiZ0aGlzLl91cGRhdGVUaHVtYlVJQnlQb2ludGVyRXZlbnQoZSl9X29uUG9pbnRlclVwKCl7dGhpcy5faXNBY3RpdmUmJih0aGlzLl9pc0FjdGl2ZT0hMSx0aGlzLl9wbGF0Zm9ybS5TQUZBUkkmJnRoaXMuX3NldElzRm9jdXNlZCghMSksdGhpcy5kcmFnRW5kLmVtaXQoe3NvdXJjZTp0aGlzLHBhcmVudDp0aGlzLl9zbGlkZXIsdmFsdWU6dGhpcy52YWx1ZX0pLHNldFRpbWVvdXQoKCk9PnRoaXMuX3VwZGF0ZVdpZHRoSW5hY3RpdmUoKSx0aGlzLl9wbGF0Zm9ybS5JT1M/MTA6MCkpfV9jbGFtcChlKXtsZXQgaT10aGlzLl90aWNrTWFya09mZnNldCxhPXRoaXMuX3NsaWRlci5fY2FjaGVkV2lkdGgtdGhpcy5fdGlja01hcmtPZmZzZXQ7cmV0dXJuIE1hdGgubWF4KE1hdGgubWluKGUsYSksaSl9X2NhbGNUcmFuc2xhdGVYQnlWYWx1ZSgpe3JldHVybiB0aGlzLl9zbGlkZXIuX2lzUnRsPygxLXRoaXMucGVyY2VudGFnZSkqKHRoaXMuX3NsaWRlci5fY2FjaGVkV2lkdGgtdGhpcy5fdGlja01hcmtPZmZzZXQqMikrdGhpcy5fdGlja01hcmtPZmZzZXQ6dGhpcy5wZXJjZW50YWdlKih0aGlzLl9zbGlkZXIuX2NhY2hlZFdpZHRoLXRoaXMuX3RpY2tNYXJrT2Zmc2V0KjIpK3RoaXMuX3RpY2tNYXJrT2Zmc2V0fV9jYWxjVHJhbnNsYXRlWEJ5UG9pbnRlckV2ZW50KGUpe3JldHVybiBlLmNsaWVudFgtdGhpcy5fc2xpZGVyLl9jYWNoZWRMZWZ0fV91cGRhdGVXaWR0aEFjdGl2ZSgpe31fdXBkYXRlV2lkdGhJbmFjdGl2ZSgpe3RoaXMuX2hvc3RFbGVtZW50LnN0eWxlLnBhZGRpbmc9YDAgJHt0aGlzLl9zbGlkZXIuX2lucHV0UGFkZGluZ31weGAsdGhpcy5faG9zdEVsZW1lbnQuc3R5bGUud2lkdGg9YGNhbGMoMTAwJSArICR7dGhpcy5fc2xpZGVyLl9pbnB1dFBhZGRpbmctdGhpcy5fdGlja01hcmtPZmZzZXQqMn1weClgLHRoaXMuX2hvc3RFbGVtZW50LnN0eWxlLmxlZnQ9YC0ke3RoaXMuX3NsaWRlci5fcmlwcGxlUmFkaXVzLXRoaXMuX3RpY2tNYXJrT2Zmc2V0fXB4YH1fdXBkYXRlVGh1bWJVSUJ5VmFsdWUoZSl7dGhpcy50cmFuc2xhdGVYPXRoaXMuX2NsYW1wKHRoaXMuX2NhbGNUcmFuc2xhdGVYQnlWYWx1ZSgpKSx0aGlzLl91cGRhdGVUaHVtYlVJKGUpfV91cGRhdGVUaHVtYlVJQnlQb2ludGVyRXZlbnQoZSxpKXt0aGlzLnRyYW5zbGF0ZVg9dGhpcy5fY2xhbXAodGhpcy5fY2FsY1RyYW5zbGF0ZVhCeVBvaW50ZXJFdmVudChlKSksdGhpcy5fdXBkYXRlVGh1bWJVSShpKX1fdXBkYXRlVGh1bWJVSShlKXt0aGlzLl9zbGlkZXIuX3NldFRyYW5zaXRpb24oISFlPy53aXRoQW5pbWF0aW9uKSx0aGlzLl9zbGlkZXIuX29uVHJhbnNsYXRlWENoYW5nZSh0aGlzKX13cml0ZVZhbHVlKGUpeyh0aGlzLl9pc0NvbnRyb2xJbml0aWFsaXplZHx8ZSE9PW51bGwpJiYodGhpcy52YWx1ZT1lKX1yZWdpc3Rlck9uQ2hhbmdlKGUpe3RoaXMuX29uQ2hhbmdlRm49ZSx0aGlzLl9pc0NvbnRyb2xJbml0aWFsaXplZD0hMH1yZWdpc3Rlck9uVG91Y2hlZChlKXt0aGlzLl9vblRvdWNoZWRGbj1lfXNldERpc2FibGVkU3RhdGUoZSl7dGhpcy5kaXNhYmxlZD1lfWZvY3VzKCl7dGhpcy5faG9zdEVsZW1lbnQuZm9jdXMoKX1ibHVyKCl7dGhpcy5faG9zdEVsZW1lbnQuYmx1cigpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbImlucHV0IiwibWF0U2xpZGVyVGh1bWIiLCIiXV0saG9zdEF0dHJzOlsidHlwZSIsInJhbmdlIiwxLCJtZGMtc2xpZGVyX19pbnB1dCJdLGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGksYSl7aSYxJiZTKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7cmV0dXJuIGEuX29uQ2hhbmdlKCl9KSgiaW5wdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGEuX29uSW5wdXQoKX0pKCJibHVyIixmdW5jdGlvbigpe3JldHVybiBhLl9vbkJsdXIoKX0pKCJmb2N1cyIsZnVuY3Rpb24oKXtyZXR1cm4gYS5fb25Gb2N1cygpfSksaSYyJiZHKCJhcmlhLXZhbHVldGV4dCIsYS5fdmFsdWV0ZXh0KCkpfSxpbnB1dHM6e3ZhbHVlOlsyLCJ2YWx1ZSIsInZhbHVlIixvdF19LG91dHB1dHM6e3ZhbHVlQ2hhbmdlOiJ2YWx1ZUNoYW5nZSIsZHJhZ1N0YXJ0OiJkcmFnU3RhcnQiLGRyYWdFbmQ6ImRyYWdFbmQifSxleHBvcnRBczpbIm1hdFNsaWRlclRodW1iIl0sZmVhdHVyZXM6W0llKFtfSSx7cHJvdmlkZTpMdSx1c2VFeGlzdGluZzp0fV0pXX0pfXJldHVybiB0fSkoKSxCMz0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NW1vZD14ZSh7dHlwZTp0fSk7c3RhdGljIFx1MDI3NWluaj15ZSh7aW1wb3J0czpbemUsdWldfSl9cmV0dXJuIHR9KSgpfSk7dmFyIE91LEh1PXgoKCk9Pnt4aSgpO2soKTt5MSgpO091PSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1bW9kPXhlKHt0eXBlOnR9KTtzdGF0aWMgXHUwMjc1aW5qPXllKHtpbXBvcnRzOltHYSx6ZSx6ZV19KX1yZXR1cm4gdH0pKCl9KTt2YXIgajMsUDgsTnU9eCgoKT0+e2ozPWNsYXNze3RyYWNrZXI7Y29sdW1uSW5kZXg9MDtyb3dJbmRleD0wO2dldCByb3dDb3VudCgpe3JldHVybiB0aGlzLnJvd0luZGV4KzF9Z2V0IHJvd3NwYW4oKXtsZXQgbj1NYXRoLm1heCguLi50aGlzLnRyYWNrZXIpO3JldHVybiBuPjE/dGhpcy5yb3dDb3VudCtuLTE6dGhpcy5yb3dDb3VudH1wb3NpdGlvbnM7dXBkYXRlKG4sZSl7dGhpcy5jb2x1bW5JbmRleD0wLHRoaXMucm93SW5kZXg9MCx0aGlzLnRyYWNrZXI9bmV3IEFycmF5KG4pLHRoaXMudHJhY2tlci5maWxsKDAsMCx0aGlzLnRyYWNrZXIubGVuZ3RoKSx0aGlzLnBvc2l0aW9ucz1lLm1hcChpPT50aGlzLl90cmFja1RpbGUoaSkpfV90cmFja1RpbGUobil7bGV0IGU9dGhpcy5fZmluZE1hdGNoaW5nR2FwKG4uY29sc3Bhbik7cmV0dXJuIHRoaXMuX21hcmtUaWxlUG9zaXRpb24oZSxuKSx0aGlzLmNvbHVtbkluZGV4PWUrbi5jb2xzcGFuLG5ldyBQOCh0aGlzLnJvd0luZGV4LGUpfV9maW5kTWF0Y2hpbmdHYXAobil7bj50aGlzLnRyYWNrZXIubGVuZ3RoO2xldCBlPS0xLGk9LTE7ZG97aWYodGhpcy5jb2x1bW5JbmRleCtuPnRoaXMudHJhY2tlci5sZW5ndGgpe3RoaXMuX25leHRSb3coKSxlPXRoaXMudHJhY2tlci5pbmRleE9mKDAsdGhpcy5jb2x1bW5JbmRleCksaT10aGlzLl9maW5kR2FwRW5kSW5kZXgoZSk7Y29udGludWV9aWYoZT10aGlzLnRyYWNrZXIuaW5kZXhPZigwLHRoaXMuY29sdW1uSW5kZXgpLGU9PS0xKXt0aGlzLl9uZXh0Um93KCksZT10aGlzLnRyYWNrZXIuaW5kZXhPZigwLHRoaXMuY29sdW1uSW5kZXgpLGk9dGhpcy5fZmluZEdhcEVuZEluZGV4KGUpO2NvbnRpbnVlfWk9dGhpcy5fZmluZEdhcEVuZEluZGV4KGUpLHRoaXMuY29sdW1uSW5kZXg9ZSsxfXdoaWxlKGktZTxufHxpPT0wKTtyZXR1cm4gTWF0aC5tYXgoZSwwKX1fbmV4dFJvdygpe3RoaXMuY29sdW1uSW5kZXg9MCx0aGlzLnJvd0luZGV4Kys7Zm9yKGxldCBuPTA7bjx0aGlzLnRyYWNrZXIubGVuZ3RoO24rKyl0aGlzLnRyYWNrZXJbbl09TWF0aC5tYXgoMCx0aGlzLnRyYWNrZXJbbl0tMSl9X2ZpbmRHYXBFbmRJbmRleChuKXtmb3IobGV0IGU9bisxO2U8dGhpcy50cmFja2VyLmxlbmd0aDtlKyspaWYodGhpcy50cmFja2VyW2VdIT0wKXJldHVybiBlO3JldHVybiB0aGlzLnRyYWNrZXIubGVuZ3RofV9tYXJrVGlsZVBvc2l0aW9uKG4sZSl7Zm9yKGxldCBpPTA7aTxlLmNvbHNwYW47aSsrKXRoaXMudHJhY2tlcltuK2ldPWUucm93c3Bhbn19LFA4PWNsYXNze3Jvdztjb2w7Y29uc3RydWN0b3IobixlKXt0aGlzLnJvdz1uLHRoaXMuY29sPWV9fX0pO2Z1bmN0aW9uIFFuKHQpe3JldHVybmBjYWxjKCR7dH0pYH1mdW5jdGlvbiBCdSh0KXtyZXR1cm4gdC5tYXRjaCgvKFtBLVphLXolXSspJC8pP3Q6YCR7dH1weGB9dmFyIFJ1LENJLEZ1LE44LHlJLHk0LFY4LE84LEg4LHhJLFV1LGp1LFI4PXgoKCk9PntOdSgpO3R1KCk7aygpO2soKTtnYSgpO1oyKCk7eTEoKTtSdT1bIioiXSxDST1gLm1hdC1ncmlkLWxpc3R7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWdyaWQtdGlsZXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO292ZXJmbG93OmhpZGRlbn0ubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtdGlsZS1oZWFkZXIsLm1hdC1ncmlkLXRpbGUgLm1hdC1ncmlkLXRpbGUtZm9vdGVye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7aGVpZ2h0OjQ4cHg7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjM4KTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowIDE2cHg7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3JpZ2h0OjB9Lm1hdC1ncmlkLXRpbGUgLm1hdC1ncmlkLXRpbGUtaGVhZGVyPiosLm1hdC1ncmlkLXRpbGUgLm1hdC1ncmlkLXRpbGUtZm9vdGVyPip7bWFyZ2luOjA7cGFkZGluZzowO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6aW5oZXJpdH0ubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtdGlsZS1oZWFkZXIubWF0LTItbGluZSwubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtdGlsZS1mb290ZXIubWF0LTItbGluZXtoZWlnaHQ6NjhweH0ubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtbGlzdC10ZXh0e2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleDphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpoaWRkZW59Lm1hdC1ncmlkLXRpbGUgLm1hdC1ncmlkLWxpc3QtdGV4dD4qe21hcmdpbjowO3BhZGRpbmc6MDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zaXplOmluaGVyaXR9Lm1hdC1ncmlkLXRpbGUgLm1hdC1ncmlkLWxpc3QtdGV4dDplbXB0eXtkaXNwbGF5Om5vbmV9Lm1hdC1ncmlkLXRpbGUgLm1hdC1ncmlkLXRpbGUtaGVhZGVye3RvcDowfS5tYXQtZ3JpZC10aWxlIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcntib3R0b206MH0ubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtYXZhdGFye3BhZGRpbmctcmlnaHQ6MTZweH1bZGlyPXJ0bF0gLm1hdC1ncmlkLXRpbGUgLm1hdC1ncmlkLWF2YXRhcntwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjE2cHh9Lm1hdC1ncmlkLXRpbGUgLm1hdC1ncmlkLWF2YXRhcjplbXB0eXtkaXNwbGF5Om5vbmV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVye2ZvbnQtc2l6ZTp2YXIoLS1tYXQtZ3JpZC1saXN0LXRpbGUtaGVhZGVyLXByaW1hcnktdGV4dC1zaXplLCB2YXIoLS1tYXQtc3lzLWJvZHktbGFyZ2UpKX0ubWF0LWdyaWQtdGlsZS1oZWFkZXIgLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZTp2YXIoLS1tYXQtZ3JpZC1saXN0LXRpbGUtaGVhZGVyLXNlY29uZGFyeS10ZXh0LXNpemUsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0pKX0ubWF0LWdyaWQtdGlsZS1mb290ZXJ7Zm9udC1zaXplOnZhcigtLW1hdC1ncmlkLWxpc3QtdGlsZS1mb290ZXItcHJpbWFyeS10ZXh0LXNpemUsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZSkpfS5tYXQtZ3JpZC10aWxlLWZvb3RlciAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWZvb3RlciAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOnZhcigtLW1hdC1ncmlkLWxpc3QtdGlsZS1mb290ZXItc2Vjb25kYXJ5LXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bSkpfS5tYXQtZ3JpZC10aWxlLWNvbnRlbnR7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2hlaWdodDoxMDAlO3BhZGRpbmc6MDttYXJnaW46MH0KYCxGdT1uZXcgY2UoIk1BVF9HUklEX0xJU1QiKSxOOD0oKCk9PntjbGFzcyB0e19lbGVtZW50PWgoYWUpO19ncmlkTGlzdD1oKEZ1LHtvcHRpb25hbDohMH0pO19yb3dzcGFuPTE7X2NvbHNwYW49MTtjb25zdHJ1Y3Rvcigpe31nZXQgcm93c3Bhbigpe3JldHVybiB0aGlzLl9yb3dzcGFufXNldCByb3dzcGFuKGUpe3RoaXMuX3Jvd3NwYW49TWF0aC5yb3VuZChJaShlKSl9Z2V0IGNvbHNwYW4oKXtyZXR1cm4gdGhpcy5fY29sc3Bhbn1zZXQgY29sc3BhbihlKXt0aGlzLl9jb2xzcGFuPU1hdGgucm91bmQoSWkoZSkpfV9zZXRTdHlsZShlLGkpe3RoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZVtlXT1pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1ncmlkLXRpbGUiXV0saG9zdEF0dHJzOlsxLCJtYXQtZ3JpZC10aWxlIl0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJkcoInJvd3NwYW4iLGEucm93c3BhbikoImNvbHNwYW4iLGEuY29sc3Bhbil9LGlucHV0czp7cm93c3Bhbjoicm93c3BhbiIsY29sc3BhbjoiY29sc3BhbiJ9LGV4cG9ydEFzOlsibWF0R3JpZFRpbGUiXSxuZ0NvbnRlbnRTZWxlY3RvcnM6UnUsZGVjbHM6Mix2YXJzOjAsY29uc3RzOltbMSwibWF0LWdyaWQtdGlsZS1jb250ZW50Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoUmUoKSxHdCgwLCJkaXYiLDApLG1lKDEpLEp0KCkpfSxzdHlsZXM6W2AubWF0LWdyaWQtbGlzdHtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZ3JpZC10aWxle2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtZ3JpZC10aWxlIC5tYXQtZ3JpZC10aWxlLWhlYWRlciwubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtdGlsZS1mb290ZXJ7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6NDhweDtjb2xvcjojZmZmO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzgpO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjAgMTZweDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7cmlnaHQ6MH0ubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtdGlsZS1oZWFkZXI+KiwubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtdGlsZS1mb290ZXI+KnttYXJnaW46MDtwYWRkaW5nOjA7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc2l6ZTppbmhlcml0fS5tYXQtZ3JpZC10aWxlIC5tYXQtZ3JpZC10aWxlLWhlYWRlci5tYXQtMi1saW5lLC5tYXQtZ3JpZC10aWxlIC5tYXQtZ3JpZC10aWxlLWZvb3Rlci5tYXQtMi1saW5le2hlaWdodDo2OHB4fS5tYXQtZ3JpZC10aWxlIC5tYXQtZ3JpZC1saXN0LXRleHR7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4OmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OmhpZGRlbn0ubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtbGlzdC10ZXh0Pip7bWFyZ2luOjA7cGFkZGluZzowO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXNpemU6aW5oZXJpdH0ubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtbGlzdC10ZXh0OmVtcHR5e2Rpc3BsYXk6bm9uZX0ubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtdGlsZS1oZWFkZXJ7dG9wOjB9Lm1hdC1ncmlkLXRpbGUgLm1hdC1ncmlkLXRpbGUtZm9vdGVye2JvdHRvbTowfS5tYXQtZ3JpZC10aWxlIC5tYXQtZ3JpZC1hdmF0YXJ7cGFkZGluZy1yaWdodDoxNnB4fVtkaXI9cnRsXSAubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtYXZhdGFye3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MTZweH0ubWF0LWdyaWQtdGlsZSAubWF0LWdyaWQtYXZhdGFyOmVtcHR5e2Rpc3BsYXk6bm9uZX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJ7Zm9udC1zaXplOnZhcigtLW1hdC1ncmlkLWxpc3QtdGlsZS1oZWFkZXItcHJpbWFyeS10ZXh0LXNpemUsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZSkpfS5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOnZhcigtLW1hdC1ncmlkLWxpc3QtdGlsZS1oZWFkZXItc2Vjb25kYXJ5LXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bSkpfS5tYXQtZ3JpZC10aWxlLWZvb3Rlcntmb250LXNpemU6dmFyKC0tbWF0LWdyaWQtbGlzdC10aWxlLWZvb3Rlci1wcmltYXJ5LXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlKSl9Lm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6dmFyKC0tbWF0LWdyaWQtbGlzdC10aWxlLWZvb3Rlci1zZWNvbmRhcnktdGV4dC1zaXplLCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtKSl9Lm1hdC1ncmlkLXRpbGUtY29udGVudHt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7aGVpZ2h0OjEwMCU7cGFkZGluZzowO21hcmdpbjowfQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCkseUk9L14tP1xkKygoXC5cZCspP1tBLVphLXolJF0/KSskLyx5ND1jbGFzc3tfZ3V0dGVyU2l6ZTtfcm93cz0wO19yb3dzcGFuPTA7X2NvbHM7X2RpcmVjdGlvbjtpbml0KG4sZSxpLGEpe3RoaXMuX2d1dHRlclNpemU9QnUobiksdGhpcy5fcm93cz1lLnJvd0NvdW50LHRoaXMuX3Jvd3NwYW49ZS5yb3dzcGFuLHRoaXMuX2NvbHM9aSx0aGlzLl9kaXJlY3Rpb249YX1nZXRCYXNlVGlsZVNpemUobixlKXtyZXR1cm5gKCR7bn0lIC0gKCR7dGhpcy5fZ3V0dGVyU2l6ZX0gKiAke2V9KSlgfWdldFRpbGVQb3NpdGlvbihuLGUpe3JldHVybiBlPT09MD8iMCI6UW4oYCgke259ICsgJHt0aGlzLl9ndXR0ZXJTaXplfSkgKiAke2V9YCl9Z2V0VGlsZVNpemUobixlKXtyZXR1cm5gKCR7bn0gKiAke2V9KSArICgke2UtMX0gKiAke3RoaXMuX2d1dHRlclNpemV9KWB9c2V0U3R5bGUobixlLGkpe2xldCBhPTEwMC90aGlzLl9jb2xzLHI9KHRoaXMuX2NvbHMtMSkvdGhpcy5fY29sczt0aGlzLnNldENvbFN0eWxlcyhuLGksYSxyKSx0aGlzLnNldFJvd1N0eWxlcyhuLGUsYSxyKX1zZXRDb2xTdHlsZXMobixlLGksYSl7bGV0IHI9dGhpcy5nZXRCYXNlVGlsZVNpemUoaSxhKSxvPXRoaXMuX2RpcmVjdGlvbj09PSJydGwiPyJyaWdodCI6ImxlZnQiO24uX3NldFN0eWxlKG8sdGhpcy5nZXRUaWxlUG9zaXRpb24ocixlKSksbi5fc2V0U3R5bGUoIndpZHRoIixRbih0aGlzLmdldFRpbGVTaXplKHIsbi5jb2xzcGFuKSkpfWdldEd1dHRlclNwYW4oKXtyZXR1cm5gJHt0aGlzLl9ndXR0ZXJTaXplfSAqICgke3RoaXMuX3Jvd3NwYW59IC0gMSlgfWdldFRpbGVTcGFuKG4pe3JldHVybmAke3RoaXMuX3Jvd3NwYW59ICogJHt0aGlzLmdldFRpbGVTaXplKG4sMSl9YH1nZXRDb21wdXRlZEhlaWdodCgpe3JldHVybiBudWxsfX0sVjg9Y2xhc3MgZXh0ZW5kcyB5NHtmaXhlZFJvd0hlaWdodDtjb25zdHJ1Y3RvcihuKXtzdXBlcigpLHRoaXMuZml4ZWRSb3dIZWlnaHQ9bn1pbml0KG4sZSxpLGEpe3N1cGVyLmluaXQobixlLGksYSksdGhpcy5maXhlZFJvd0hlaWdodD1CdSh0aGlzLmZpeGVkUm93SGVpZ2h0KSx5SS50ZXN0KHRoaXMuZml4ZWRSb3dIZWlnaHQpfXNldFJvd1N0eWxlcyhuLGUpe24uX3NldFN0eWxlKCJ0b3AiLHRoaXMuZ2V0VGlsZVBvc2l0aW9uKHRoaXMuZml4ZWRSb3dIZWlnaHQsZSkpLG4uX3NldFN0eWxlKCJoZWlnaHQiLFFuKHRoaXMuZ2V0VGlsZVNpemUodGhpcy5maXhlZFJvd0hlaWdodCxuLnJvd3NwYW4pKSl9Z2V0Q29tcHV0ZWRIZWlnaHQoKXtyZXR1cm5bImhlaWdodCIsUW4oYCR7dGhpcy5nZXRUaWxlU3Bhbih0aGlzLmZpeGVkUm93SGVpZ2h0KX0gKyAke3RoaXMuZ2V0R3V0dGVyU3BhbigpfWApXX1yZXNldChuKXtuLl9zZXRMaXN0U3R5bGUoWyJoZWlnaHQiLG51bGxdKSxuLl90aWxlcyYmbi5fdGlsZXMuZm9yRWFjaChlPT57ZS5fc2V0U3R5bGUoInRvcCIsbnVsbCksZS5fc2V0U3R5bGUoImhlaWdodCIsbnVsbCl9KX19LE84PWNsYXNzIGV4dGVuZHMgeTR7cm93SGVpZ2h0UmF0aW87YmFzZVRpbGVIZWlnaHQ7Y29uc3RydWN0b3Iobil7c3VwZXIoKSx0aGlzLl9wYXJzZVJhdGlvKG4pfXNldFJvd1N0eWxlcyhuLGUsaSxhKXtsZXQgcj1pL3RoaXMucm93SGVpZ2h0UmF0aW87dGhpcy5iYXNlVGlsZUhlaWdodD10aGlzLmdldEJhc2VUaWxlU2l6ZShyLGEpLG4uX3NldFN0eWxlKCJtYXJnaW5Ub3AiLHRoaXMuZ2V0VGlsZVBvc2l0aW9uKHRoaXMuYmFzZVRpbGVIZWlnaHQsZSkpLG4uX3NldFN0eWxlKCJwYWRkaW5nVG9wIixRbih0aGlzLmdldFRpbGVTaXplKHRoaXMuYmFzZVRpbGVIZWlnaHQsbi5yb3dzcGFuKSkpfWdldENvbXB1dGVkSGVpZ2h0KCl7cmV0dXJuWyJwYWRkaW5nQm90dG9tIixRbihgJHt0aGlzLmdldFRpbGVTcGFuKHRoaXMuYmFzZVRpbGVIZWlnaHQpfSArICR7dGhpcy5nZXRHdXR0ZXJTcGFuKCl9YCldfXJlc2V0KG4pe24uX3NldExpc3RTdHlsZShbInBhZGRpbmdCb3R0b20iLG51bGxdKSxuLl90aWxlcy5mb3JFYWNoKGU9PntlLl9zZXRTdHlsZSgibWFyZ2luVG9wIixudWxsKSxlLl9zZXRTdHlsZSgicGFkZGluZ1RvcCIsbnVsbCl9KX1fcGFyc2VSYXRpbyhuKXtsZXQgZT1uLnNwbGl0KCI6Iik7ZS5sZW5ndGgsdGhpcy5yb3dIZWlnaHRSYXRpbz1wYXJzZUZsb2F0KGVbMF0pL3BhcnNlRmxvYXQoZVsxXSl9fSxIOD1jbGFzcyBleHRlbmRzIHk0e3NldFJvd1N0eWxlcyhuLGUpe2xldCBpPTEwMC90aGlzLl9yb3dzcGFuLGE9KHRoaXMuX3Jvd3MtMSkvdGhpcy5fcm93cyxyPXRoaXMuZ2V0QmFzZVRpbGVTaXplKGksYSk7bi5fc2V0U3R5bGUoInRvcCIsdGhpcy5nZXRUaWxlUG9zaXRpb24ocixlKSksbi5fc2V0U3R5bGUoImhlaWdodCIsUW4odGhpcy5nZXRUaWxlU2l6ZShyLG4ucm93c3BhbikpKX1yZXNldChuKXtuLl90aWxlcyYmbi5fdGlsZXMuZm9yRWFjaChlPT57ZS5fc2V0U3R5bGUoInRvcCIsbnVsbCksZS5fc2V0U3R5bGUoImhlaWdodCIsbnVsbCl9KX19O3hJPSJmaXQiLFV1PSgoKT0+e2NsYXNzIHR7X2VsZW1lbnQ9aChhZSk7X2Rpcj1oKG4xLHtvcHRpb25hbDohMH0pO19jb2xzO190aWxlQ29vcmRpbmF0b3I7X3Jvd0hlaWdodDtfZ3V0dGVyPSIxcHgiO190aWxlU3R5bGVyO190aWxlcztjb25zdHJ1Y3Rvcigpe31nZXQgY29scygpe3JldHVybiB0aGlzLl9jb2xzfXNldCBjb2xzKGUpe3RoaXMuX2NvbHM9TWF0aC5tYXgoMSxNYXRoLnJvdW5kKElpKGUpKSl9Z2V0IGd1dHRlclNpemUoKXtyZXR1cm4gdGhpcy5fZ3V0dGVyfXNldCBndXR0ZXJTaXplKGUpe3RoaXMuX2d1dHRlcj1gJHtlPz8iIn1gfWdldCByb3dIZWlnaHQoKXtyZXR1cm4gdGhpcy5fcm93SGVpZ2h0fXNldCByb3dIZWlnaHQoZSl7bGV0IGk9YCR7ZT8/IiJ9YDtpIT09dGhpcy5fcm93SGVpZ2h0JiYodGhpcy5fcm93SGVpZ2h0PWksdGhpcy5fc2V0VGlsZVN0eWxlcih0aGlzLl9yb3dIZWlnaHQpKX1uZ09uSW5pdCgpe3RoaXMuX2NoZWNrQ29scygpLHRoaXMuX2NoZWNrUm93SGVpZ2h0KCl9bmdBZnRlckNvbnRlbnRDaGVja2VkKCl7dGhpcy5fbGF5b3V0VGlsZXMoKX1fY2hlY2tDb2xzKCl7dGhpcy5jb2xzfV9jaGVja1Jvd0hlaWdodCgpe3RoaXMuX3Jvd0hlaWdodHx8dGhpcy5fc2V0VGlsZVN0eWxlcigiMToxIil9X3NldFRpbGVTdHlsZXIoZSl7dGhpcy5fdGlsZVN0eWxlciYmdGhpcy5fdGlsZVN0eWxlci5yZXNldCh0aGlzKSxlPT09eEk/dGhpcy5fdGlsZVN0eWxlcj1uZXcgSDg6ZSYmZS5pbmRleE9mKCI6Iik+LTE/dGhpcy5fdGlsZVN0eWxlcj1uZXcgTzgoZSk6dGhpcy5fdGlsZVN0eWxlcj1uZXcgVjgoZSl9X2xheW91dFRpbGVzKCl7dGhpcy5fdGlsZUNvb3JkaW5hdG9yfHwodGhpcy5fdGlsZUNvb3JkaW5hdG9yPW5ldyBqMyk7bGV0IGU9dGhpcy5fdGlsZUNvb3JkaW5hdG9yLGk9dGhpcy5fdGlsZXMuZmlsdGVyKHI9PiFyLl9ncmlkTGlzdHx8ci5fZ3JpZExpc3Q9PT10aGlzKSxhPXRoaXMuX2Rpcj90aGlzLl9kaXIudmFsdWU6Imx0ciI7dGhpcy5fdGlsZUNvb3JkaW5hdG9yLnVwZGF0ZSh0aGlzLmNvbHMsaSksdGhpcy5fdGlsZVN0eWxlci5pbml0KHRoaXMuZ3V0dGVyU2l6ZSxlLHRoaXMuY29scyxhKSxpLmZvckVhY2goKHIsbyk9PntsZXQgZD1lLnBvc2l0aW9uc1tvXTt0aGlzLl90aWxlU3R5bGVyLnNldFN0eWxlKHIsZC5yb3csZC5jb2wpfSksdGhpcy5fc2V0TGlzdFN0eWxlKHRoaXMuX3RpbGVTdHlsZXIuZ2V0Q29tcHV0ZWRIZWlnaHQoKSl9X3NldExpc3RTdHlsZShlKXtlJiYodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlW2VbMF1dPWVbMV0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1ncmlkLWxpc3QiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24oaSxhLHIpe2lmKGkmMSYmQmUocixOOCw1KSxpJjIpe2xldCBvO0Yobz1CKCkpJiYoYS5fdGlsZXM9byl9fSxob3N0QXR0cnM6WzEsIm1hdC1ncmlkLWxpc3QiXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmRygiY29scyIsYS5jb2xzKX0saW5wdXRzOntjb2xzOiJjb2xzIixndXR0ZXJTaXplOiJndXR0ZXJTaXplIixyb3dIZWlnaHQ6InJvd0hlaWdodCJ9LGV4cG9ydEFzOlsibWF0R3JpZExpc3QiXSxmZWF0dXJlczpbSWUoW3twcm92aWRlOkZ1LHVzZUV4aXN0aW5nOnR9XSldLG5nQ29udGVudFNlbGVjdG9yczpSdSxkZWNsczoyLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKFJlKCksR3QoMCwiZGl2IiksbWUoMSksSnQoKSl9LHN0eWxlczpbQ0ldLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxqdT0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NW1vZD14ZSh7dHlwZTp0fSk7c3RhdGljIFx1MDI3NWluaj15ZSh7aW1wb3J0czpbZjgsemUsZjgsemVdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gU0kodCxuKXtpZih0JjEmJihjKDAsImRpdiIsMiksdSgxLCJtYXQtcHNldWRvLWNoZWNrYm94Iiw2KSxzKCkpLHQmMil7bGV0IGU9digpO2woKSxmKCJkaXNhYmxlZCIsZS5kaXNhYmxlZCl9fWZ1bmN0aW9uIHpJKCl7cmV0dXJue2hpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3I6ITEsaGlkZU11bHRpcGxlU2VsZWN0aW9uSW5kaWNhdG9yOiExLGRpc2FibGVkSW50ZXJhY3RpdmU6ITF9fXZhciBNSSx3SSxrSSxUSSxGOCxFSSxxdSxHdT14KCgpPT57eGkoKTtBMigpO2soKTtrKCk7SzIoKTtjOCgpO2ZpKCk7STIoKTt5MSgpO1dhKCk7TUk9WyJidXR0b24iXSx3ST1bIioiXTtrST1uZXcgY2UoIk1BVF9CVVRUT05fVE9HR0xFX0RFRkFVTFRfT1BUSU9OUyIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6ekl9KTtUST1uZXcgY2UoIk1hdEJ1dHRvblRvZ2dsZUdyb3VwIiksRjg9Y2xhc3N7c291cmNlO3ZhbHVlO2NvbnN0cnVjdG9yKG4sZSl7dGhpcy5zb3VyY2U9bix0aGlzLnZhbHVlPWV9fSxFST0oKCk9PntjbGFzcyB0e19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtfZWxlbWVudFJlZj1oKGFlKTtfZm9jdXNNb25pdG9yPWgoWDEpO19pZEdlbmVyYXRvcj1oKHF0KTtfYW5pbWF0aW9uRGlzYWJsZWQ9UHQoKTtfY2hlY2tlZD0hMTthcmlhTGFiZWw7YXJpYUxhYmVsbGVkYnk9bnVsbDtfYnV0dG9uRWxlbWVudDtidXR0b25Ub2dnbGVHcm91cDtnZXQgYnV0dG9uSWQoKXtyZXR1cm5gJHt0aGlzLmlkfS1idXR0b25gfWlkO25hbWU7dmFsdWU7Z2V0IHRhYkluZGV4KCl7cmV0dXJuIHRoaXMuX3RhYkluZGV4KCl9c2V0IHRhYkluZGV4KGUpe3RoaXMuX3RhYkluZGV4LnNldChlKX1fdGFiSW5kZXg7ZGlzYWJsZVJpcHBsZTtnZXQgYXBwZWFyYW5jZSgpe3JldHVybiB0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwP3RoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuYXBwZWFyYW5jZTp0aGlzLl9hcHBlYXJhbmNlfXNldCBhcHBlYXJhbmNlKGUpe3RoaXMuX2FwcGVhcmFuY2U9ZX1fYXBwZWFyYW5jZTtnZXQgY2hlY2tlZCgpe3JldHVybiB0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwP3RoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuX2lzU2VsZWN0ZWQodGhpcyk6dGhpcy5fY2hlY2tlZH1zZXQgY2hlY2tlZChlKXtlIT09dGhpcy5fY2hlY2tlZCYmKHRoaXMuX2NoZWNrZWQ9ZSx0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwJiZ0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwLl9zeW5jQnV0dG9uVG9nZ2xlKHRoaXMsdGhpcy5fY2hlY2tlZCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZHx8dGhpcy5idXR0b25Ub2dnbGVHcm91cCYmdGhpcy5idXR0b25Ub2dnbGVHcm91cC5kaXNhYmxlZH1zZXQgZGlzYWJsZWQoZSl7dGhpcy5fZGlzYWJsZWQ9ZX1fZGlzYWJsZWQ9ITE7Z2V0IGRpc2FibGVkSW50ZXJhY3RpdmUoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWRJbnRlcmFjdGl2ZXx8dGhpcy5idXR0b25Ub2dnbGVHcm91cCE9PW51bGwmJnRoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuZGlzYWJsZWRJbnRlcmFjdGl2ZX1zZXQgZGlzYWJsZWRJbnRlcmFjdGl2ZShlKXt0aGlzLl9kaXNhYmxlZEludGVyYWN0aXZlPWV9X2Rpc2FibGVkSW50ZXJhY3RpdmU7Y2hhbmdlPW5ldyBOO2NvbnN0cnVjdG9yKCl7aChDMSkubG9hZChFMSk7bGV0IGU9aChUSSx7b3B0aW9uYWw6ITB9KSxpPWgobmV3IHBpKCJ0YWJpbmRleCIpLHtvcHRpb25hbDohMH0pfHwiIixhPWgoa0kse29wdGlvbmFsOiEwfSk7dGhpcy5fdGFiSW5kZXg9ZnQocGFyc2VJbnQoaSl8fDApLHRoaXMuYnV0dG9uVG9nZ2xlR3JvdXA9ZSx0aGlzLmFwcGVhcmFuY2U9YSYmYS5hcHBlYXJhbmNlP2EuYXBwZWFyYW5jZToic3RhbmRhcmQiLHRoaXMuZGlzYWJsZWRJbnRlcmFjdGl2ZT1hPy5kaXNhYmxlZEludGVyYWN0aXZlPz8hMX1uZ09uSW5pdCgpe2xldCBlPXRoaXMuYnV0dG9uVG9nZ2xlR3JvdXA7dGhpcy5pZD10aGlzLmlkfHx0aGlzLl9pZEdlbmVyYXRvci5nZXRJZCgibWF0LWJ1dHRvbi10b2dnbGUtIiksZSYmKGUuX2lzUHJlY2hlY2tlZCh0aGlzKT90aGlzLmNoZWNrZWQ9ITA6ZS5faXNTZWxlY3RlZCh0aGlzKSE9PXRoaXMuX2NoZWNrZWQmJmUuX3N5bmNCdXR0b25Ub2dnbGUodGhpcyx0aGlzLl9jaGVja2VkKSl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fYW5pbWF0aW9uRGlzYWJsZWR8fHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCJtYXQtYnV0dG9uLXRvZ2dsZS1hbmltYXRpb25zLWVuYWJsZWQiKSx0aGlzLl9mb2N1c01vbml0b3IubW9uaXRvcih0aGlzLl9lbGVtZW50UmVmLCEwKX1uZ09uRGVzdHJveSgpe2xldCBlPXRoaXMuYnV0dG9uVG9nZ2xlR3JvdXA7dGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpLGUmJmUuX2lzU2VsZWN0ZWQodGhpcykmJmUuX3N5bmNCdXR0b25Ub2dnbGUodGhpcywhMSwhMSwhMCl9Zm9jdXMoZSl7dGhpcy5fYnV0dG9uRWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKGUpfV9vbkJ1dHRvbkNsaWNrKCl7aWYodGhpcy5kaXNhYmxlZClyZXR1cm47bGV0IGU9dGhpcy5pc1NpbmdsZVNlbGVjdG9yKCk/ITA6IXRoaXMuX2NoZWNrZWQ7aWYoZSE9PXRoaXMuX2NoZWNrZWQmJih0aGlzLl9jaGVja2VkPWUsdGhpcy5idXR0b25Ub2dnbGVHcm91cCYmKHRoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuX3N5bmNCdXR0b25Ub2dnbGUodGhpcyx0aGlzLl9jaGVja2VkLCEwKSx0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwLl9vblRvdWNoZWQoKSkpLHRoaXMuaXNTaW5nbGVTZWxlY3RvcigpKXtsZXQgaT10aGlzLmJ1dHRvblRvZ2dsZUdyb3VwLl9idXR0b25Ub2dnbGVzLmZpbmQoYT0+YS50YWJJbmRleD09PTApO2kmJihpLnRhYkluZGV4PS0xKSx0aGlzLnRhYkluZGV4PTB9dGhpcy5jaGFuZ2UuZW1pdChuZXcgRjgodGhpcyx0aGlzLnZhbHVlKSl9X21hcmtGb3JDaGVjaygpe3RoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfV9nZXRCdXR0b25OYW1lKCl7cmV0dXJuIHRoaXMuaXNTaW5nbGVTZWxlY3RvcigpP3RoaXMuYnV0dG9uVG9nZ2xlR3JvdXAubmFtZTp0aGlzLm5hbWV8fG51bGx9aXNTaW5nbGVTZWxlY3Rvcigpe3JldHVybiB0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwJiYhdGhpcy5idXR0b25Ub2dnbGVHcm91cC5tdWx0aXBsZX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJtYXQtYnV0dG9uLXRvZ2dsZSJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJnRlKE1JLDUpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLl9idXR0b25FbGVtZW50PXIuZmlyc3QpfX0saG9zdEF0dHJzOlsicm9sZSIsInByZXNlbnRhdGlvbiIsMSwibWF0LWJ1dHRvbi10b2dnbGUiXSxob3N0VmFyczoxNCxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjEmJlMoImZvY3VzIixmdW5jdGlvbigpe3JldHVybiBhLmZvY3VzKCl9KSxpJjImJihHKCJhcmlhLWxhYmVsIixudWxsKSgiYXJpYS1sYWJlbGxlZGJ5IixudWxsKSgiaWQiLGEuaWQpKCJuYW1lIixudWxsKSxpZSgibWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSIsIWEuYnV0dG9uVG9nZ2xlR3JvdXApKCJtYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkIixhLmNoZWNrZWQpKCJtYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZCIsYS5kaXNhYmxlZCkoIm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLWludGVyYWN0aXZlIixhLmRpc2FibGVkSW50ZXJhY3RpdmUpKCJtYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIixhLmFwcGVhcmFuY2U9PT0ic3RhbmRhcmQiKSl9LGlucHV0czp7YXJpYUxhYmVsOlswLCJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0sYXJpYUxhYmVsbGVkYnk6WzAsImFyaWEtbGFiZWxsZWRieSIsImFyaWFMYWJlbGxlZGJ5Il0saWQ6ImlkIixuYW1lOiJuYW1lIix2YWx1ZToidmFsdWUiLHRhYkluZGV4OiJ0YWJJbmRleCIsZGlzYWJsZVJpcHBsZTpbMiwiZGlzYWJsZVJpcHBsZSIsImRpc2FibGVSaXBwbGUiLFpdLGFwcGVhcmFuY2U6ImFwcGVhcmFuY2UiLGNoZWNrZWQ6WzIsImNoZWNrZWQiLCJjaGVja2VkIixaXSxkaXNhYmxlZDpbMiwiZGlzYWJsZWQiLCJkaXNhYmxlZCIsWl0sZGlzYWJsZWRJbnRlcmFjdGl2ZTpbMiwiZGlzYWJsZWRJbnRlcmFjdGl2ZSIsImRpc2FibGVkSW50ZXJhY3RpdmUiLFpdfSxvdXRwdXRzOntjaGFuZ2U6ImNoYW5nZSJ9LGV4cG9ydEFzOlsibWF0QnV0dG9uVG9nZ2xlIl0sbmdDb250ZW50U2VsZWN0b3JzOndJLGRlY2xzOjcsdmFyczoxMyxjb25zdHM6W1siYnV0dG9uIiwiIl0sWyJ0eXBlIiwiYnV0dG9uIiwxLCJtYXQtYnV0dG9uLXRvZ2dsZS1idXR0b24iLCJtYXQtZm9jdXMtaW5kaWNhdG9yIiwzLCJjbGljayIsImlkIiwiZGlzYWJsZWQiXSxbMSwibWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tib3gtd3JhcHBlciJdLFsxLCJtYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50Il0sWzEsIm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXkiXSxbIm1hdFJpcHBsZSIsIiIsMSwibWF0LWJ1dHRvbi10b2dnbGUtcmlwcGxlIiwzLCJtYXRSaXBwbGVUcmlnZ2VyIiwibWF0UmlwcGxlRGlzYWJsZWQiXSxbInN0YXRlIiwiY2hlY2tlZCIsImFyaWEtaGlkZGVuIiwidHJ1ZSIsImFwcGVhcmFuY2UiLCJtaW5pbWFsIiwzLCJkaXNhYmxlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO1JlKCksYygwLCJidXR0b24iLDEsMCksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLl9vbkJ1dHRvbkNsaWNrKCkpfSksTSgyLFNJLDIsMSwiZGl2IiwyKSxjKDMsInNwYW4iLDMpLG1lKDQpLHMoKSgpLHUoNSwic3BhbiIsNCkoNiwic3BhbiIsNSl9aWYoaSYyKXtsZXQgcj1zZSgxKTtmKCJpZCIsYS5idXR0b25JZCkoImRpc2FibGVkIixhLmRpc2FibGVkJiYhYS5kaXNhYmxlZEludGVyYWN0aXZlfHxudWxsKSxHKCJyb2xlIixhLmlzU2luZ2xlU2VsZWN0b3IoKT8icmFkaW8iOiJidXR0b24iKSgidGFiaW5kZXgiLGEuZGlzYWJsZWQmJiFhLmRpc2FibGVkSW50ZXJhY3RpdmU/LTE6YS50YWJJbmRleCkoImFyaWEtcHJlc3NlZCIsYS5pc1NpbmdsZVNlbGVjdG9yKCk/bnVsbDphLmNoZWNrZWQpKCJhcmlhLWNoZWNrZWQiLGEuaXNTaW5nbGVTZWxlY3RvcigpP2EuY2hlY2tlZDpudWxsKSgibmFtZSIsYS5fZ2V0QnV0dG9uTmFtZSgpKSgiYXJpYS1sYWJlbCIsYS5hcmlhTGFiZWwpKCJhcmlhLWxhYmVsbGVkYnkiLGEuYXJpYUxhYmVsbGVkYnkpKCJhcmlhLWRpc2FibGVkIixhLmRpc2FibGVkJiZhLmRpc2FibGVkSW50ZXJhY3RpdmU/InRydWUiOm51bGwpLGwoMiksdyhhLmJ1dHRvblRvZ2dsZUdyb3VwJiYoIWEuYnV0dG9uVG9nZ2xlR3JvdXAubXVsdGlwbGUmJiFhLmJ1dHRvblRvZ2dsZUdyb3VwLmhpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3J8fGEuYnV0dG9uVG9nZ2xlR3JvdXAubXVsdGlwbGUmJiFhLmJ1dHRvblRvZ2dsZUdyb3VwLmhpZGVNdWx0aXBsZVNlbGVjdGlvbkluZGljYXRvcik/MjotMSksbCg0KSxmKCJtYXRSaXBwbGVUcmlnZ2VyIixyKSgibWF0UmlwcGxlRGlzYWJsZWQiLGEuZGlzYWJsZVJpcHBsZXx8YS5kaXNhYmxlZCl9fSxkZXBlbmRlbmNpZXM6W0wxLEUzXSxzdHlsZXM6W2AubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXB7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWxlZ2FjeS1zaGFwZSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXB7b3V0bGluZTpzb2xpZCAxcHh9fS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtbGFyZ2UpKTtib3JkZXI6c29saWQgMXB4IHZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWRpdmlkZXItY29sb3IsIHZhcigtLW1hdC1zeXMtb3V0bGluZSkpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1wc2V1ZG8tY2hlY2tib3gsLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1wc2V1ZG8tY2hlY2tib3h7LS1tYXQtcHNldWRvLWNoZWNrYm94LW1pbmltYWwtc2VsZWN0ZWQtY2hlY2ttYXJrLWNvbG9yOiB2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1zZWxlY3RlZC1zdGF0ZS10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXNlY29uZGFyeS1jb250YWluZXIpKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6bm9uZX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke291dGxpbmU6MH19Lm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2Fse2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0ubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnR7ZGlzcGxheTpibG9ja30ubWF0LWJ1dHRvbi10b2dnbGV7d2hpdGUtc3BhY2U6bm93cmFwO3Bvc2l0aW9uOnJlbGF0aXZlO2NvbG9yOnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWxlZ2FjeS10ZXh0LWNvbG9yKTtmb250LWZhbWlseTp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1sZWdhY3ktbGFiZWwtdGV4dC1mb250KTtmb250LXNpemU6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtbGVnYWN5LWxhYmVsLXRleHQtc2l6ZSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtbGVnYWN5LWxhYmVsLXRleHQtbGluZS1oZWlnaHQpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWxlZ2FjeS1sYWJlbC10ZXh0LXdlaWdodCk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtbGVnYWN5LWxhYmVsLXRleHQtdHJhY2tpbmcpOy0tbWF0LXBzZXVkby1jaGVja2JveC1taW5pbWFsLXNlbGVjdGVkLWNoZWNrbWFyay1jb2xvcjogdmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtbGVnYWN5LXNlbGVjdGVkLXN0YXRlLXRleHQtY29sb3IpfS5tYXQtYnV0dG9uLXRvZ2dsZS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5OnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWxlZ2FjeS1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5KX0ubWF0LWJ1dHRvbi10b2dnbGUgLm1hdC1pY29uIHN2Z3t2ZXJ0aWNhbC1hbGlnbjp0b3B9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrYm94LXdyYXBwZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQ7YWxpZ24taXRlbXM6Y2VudGVyO3dpZHRoOjA7aGVpZ2h0OjE4cHg7bGluZS1oZWlnaHQ6MThweDtvdmVyZmxvdzpoaWRkZW47Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bGVmdDoxNnB4O3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAtNTAlLCAwKX1bZGlyPXJ0bF0gLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrYm94LXdyYXBwZXJ7bGVmdDphdXRvO3JpZ2h0OjE2cHh9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrYm94LXdyYXBwZXJ7bGVmdDoxMnB4fVtkaXI9cnRsXSAubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tib3gtd3JhcHBlcntsZWZ0OmF1dG87cmlnaHQ6MTJweH0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tib3gtd3JhcHBlcnt3aWR0aDoxOHB4fS5tYXQtYnV0dG9uLXRvZ2dsZS1hbmltYXRpb25zLWVuYWJsZWQgLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrYm94LXdyYXBwZXJ7dHJhbnNpdGlvbjp3aWR0aCAxNTBtcyA0NW1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSl9Lm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsIC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2JveC13cmFwcGVye3RyYW5zaXRpb246bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtjb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1sZWdhY3ktc2VsZWN0ZWQtc3RhdGUtdGV4dC1jb2xvcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1sZWdhY3ktc2VsZWN0ZWQtc3RhdGUtYmFja2dyb3VuZC1jb2xvcil9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVke3BvaW50ZXItZXZlbnRzOm5vbmU7Y29sb3I6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtbGVnYWN5LWRpc2FibGVkLXN0YXRlLXRleHQtY29sb3IpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtbGVnYWN5LWRpc2FibGVkLXN0YXRlLWJhY2tncm91bmQtY29sb3IpOy0tbWF0LXBzZXVkby1jaGVja2JveC1taW5pbWFsLWRpc2FibGVkLXNlbGVjdGVkLWNoZWNrbWFyay1jb2xvcjogdmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtbGVnYWN5LWRpc2FibGVkLXN0YXRlLXRleHQtY29sb3IpfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2Vke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtbGVnYWN5LWRpc2FibGVkLXNlbGVjdGVkLXN0YXRlLWJhY2tncm91bmQtY29sb3IpfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC1pbnRlcmFjdGl2ZXtwb2ludGVyLWV2ZW50czphdXRvfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2NvbG9yOnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtYmFja2dyb3VuZC1jb2xvciwgdHJhbnNwYXJlbnQpO2ZvbnQtZmFtaWx5OnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1mb250KSk7Zm9udC1zaXplOnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1zaXplKSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtdGV4dC1saW5lLWhlaWdodCwgdmFyKC0tbWF0LXN5cy1sYWJlbC1sYXJnZS1saW5lLWhlaWdodCkpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLXRleHQtd2VpZ2h0LCB2YXIoLS1tYXQtc3lzLWxhYmVsLWxhcmdlLXdlaWdodCkpO2xldHRlci1zcGFjaW5nOnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtbGFiZWwtbGFyZ2UtdHJhY2tpbmcpKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCsubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtib3JkZXItbGVmdDpzb2xpZCAxcHggdmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtZGl2aWRlci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vdXRsaW5lKSl9W2Rpcj1ydGxdIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkKy5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCB2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1kaXZpZGVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW91dGxpbmUpKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbCAubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCsubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWRpdmlkZXItY29sb3IsIHZhcigtLW1hdC1zeXMtb3V0bGluZSkpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWR7Y29sb3I6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtc2VsZWN0ZWQtc3RhdGUtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zZWNvbmRhcnktY29udGFpbmVyKSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1zZWxlY3RlZC1zdGF0ZS1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXNlY29uZGFyeS1jb250YWluZXIpKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZHtjb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC1zdGF0ZS10ZXh0LWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC1zdGF0ZS1iYWNrZ3JvdW5kLWNvbG9yLCB0cmFuc3BhcmVudCl9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQgLm1hdC1wc2V1ZG8tY2hlY2tib3h7LS1tYXQtcHNldWRvLWNoZWNrYm94LW1pbmltYWwtZGlzYWJsZWQtc2VsZWN0ZWQtY2hlY2ttYXJrLWNvbG9yOiB2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC1zZWxlY3RlZC1zdGF0ZS10ZXh0LWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSl9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtjb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC1zZWxlY3RlZC1zdGF0ZS10ZXh0LWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC1zZWxlY3RlZC1zdGF0ZS1iYWNrZ3JvdW5kLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAxMiUsIHRyYW5zcGFyZW50KSl9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQ6aG92ZXIgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLWhvdmVyLXN0YXRlLWxheWVyLW9wYWNpdHkpKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5OnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLXN0YXRlLWxheWVyLW9wYWNpdHksIHZhcigtLW1hdC1zeXMtZm9jdXMtc3RhdGUtbGF5ZXItb3BhY2l0eSkpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQ6aG92ZXIgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7ZGlzcGxheTpub25lfX0ubWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudHstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjAgMTZweDtsaW5lLWhlaWdodDp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1sZWdhY3ktaGVpZ2h0KTtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudHtwYWRkaW5nOjAgMTJweDtsaW5lLWhlaWdodDp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1oZWlnaHQsIDQwcHgpfS5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50Pip7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6aW5oZXJpdDtwb2ludGVyLWV2ZW50czpub25lO29wYWNpdHk6MDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLWxlZ2FjeS1zdGF0ZS1sYXllci1jb2xvcil9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7Ym9yZGVyLWJvdHRvbTpzb2xpZCA1MDBweDtvcGFjaXR5Oi41O2hlaWdodDowfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkOmhvdmVyIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjZ9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtib3JkZXItYm90dG9tOnNvbGlkIDUwMHB4fX0ubWF0LWJ1dHRvbi10b2dnbGUgLm1hdC1idXR0b24tdG9nZ2xlLXJpcHBsZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b257Ym9yZGVyOjA7YmFja2dyb3VuZDpub25lO2NvbG9yOmluaGVyaXQ7cGFkZGluZzowO21hcmdpbjowO2ZvbnQ6aW5oZXJpdDtvdXRsaW5lOm5vbmU7d2lkdGg6MTAwJTtjdXJzb3I6cG9pbnRlcn0ubWF0LWJ1dHRvbi10b2dnbGUtYW5pbWF0aW9ucy1lbmFibGVkIC5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b257dHJhbnNpdGlvbjpwYWRkaW5nIDE1MG1zIDQ1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbnt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkIC5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b257Y3Vyc29yOmRlZmF1bHR9Lm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCAubWF0LWJ1dHRvbi10b2dnbGUtYnV0dG9uOmhhcygubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tib3gtd3JhcHBlcil7cGFkZGluZy1sZWZ0OjMwcHh9W2Rpcj1ydGxdIC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkIC5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b246aGFzKC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2JveC13cmFwcGVyKXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjMwcHh9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHstLW1hdC1mb2N1cy1pbmRpY2F0b3ItYm9yZGVyLXJhZGl1czogdmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWV4dHJhLWxhcmdlKSl9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQ6bm90KC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbCkgLm1hdC1idXR0b24tdG9nZ2xlOmxhc3Qtb2YtdHlwZSAubWF0LWJ1dHRvbi10b2dnbGUtYnV0dG9uOjpiZWZvcmV7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWV4dHJhLWxhcmdlKSk7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWV4dHJhLWxhcmdlKSl9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQ6bm90KC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbCkgLm1hdC1idXR0b24tdG9nZ2xlOmZpcnN0LW9mLXR5cGUgLm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbjo6YmVmb3Jle2JvcmRlci10b3AtbGVmdC1yYWRpdXM6dmFyKC0tbWF0LWJ1dHRvbi10b2dnbGUtc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWV4dHJhLWxhcmdlKSk7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtbGFyZ2UpKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbCAubWF0LWJ1dHRvbi10b2dnbGU6bGFzdC1vZi10eXBlIC5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b246OmJlZm9yZXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtbGFyZ2UpKTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1leHRyYS1sYXJnZSkpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsIC5tYXQtYnV0dG9uLXRvZ2dsZTpmaXJzdC1vZi10eXBlIC5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b246OmJlZm9yZXtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czp2YXIoLS1tYXQtYnV0dG9uLXRvZ2dsZS1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtbGFyZ2UpKTtib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLW1hdC1idXR0b24tdG9nZ2xlLXNoYXBlLCB2YXIoLS1tYXQtc3lzLWNvcm5lci1leHRyYS1sYXJnZSkpfQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCkscXU9KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVtb2Q9eGUoe3R5cGU6dH0pO3N0YXRpYyBcdTAyNzVpbmo9eWUoe2ltcG9ydHM6W3plLHVpLEVJLHplXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIEFJKHQsbil7dCYxJiZaaSgwLCJkaXYiLDIpfWZ1bmN0aW9uIFd1KHQsbj0wLGU9MTAwKXtyZXR1cm4gTWF0aC5tYXgobixNYXRoLm1pbihlLHQpKX12YXIgREksUXUscTMsRzM9eCgoKT0+e2soKTtrKCk7ZmkoKTt5MSgpO0RJPW5ldyBjZSgiTUFUX1BST0dSRVNTX0JBUl9ERUZBVUxUX09QVElPTlMiKSxRdT0oKCk9PntjbGFzcyB0e19lbGVtZW50UmVmPWgoYWUpO19uZ1pvbmU9aChyZSk7X2NoYW5nZURldGVjdG9yUmVmPWgoRWUpO19yZW5kZXJlcj1oKHYxKTtfY2xlYW51cFRyYW5zaXRpb25FbmQ7Y29uc3RydWN0b3IoKXtsZXQgZT1UMCgpLGk9aChESSx7b3B0aW9uYWw6ITB9KTt0aGlzLl9pc05vb3BBbmltYXRpb249ZT09PSJkaS1kaXNhYmxlZCIsZT09PSJyZWR1Y2VkLW1vdGlvbiImJnRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCJtYXQtcHJvZ3Jlc3MtYmFyLXJlZHVjZWQtbW90aW9uIiksaSYmKGkuY29sb3ImJih0aGlzLmNvbG9yPXRoaXMuX2RlZmF1bHRDb2xvcj1pLmNvbG9yKSx0aGlzLm1vZGU9aS5tb2RlfHx0aGlzLm1vZGUpfV9pc05vb3BBbmltYXRpb247Z2V0IGNvbG9yKCl7cmV0dXJuIHRoaXMuX2NvbG9yfHx0aGlzLl9kZWZhdWx0Q29sb3J9c2V0IGNvbG9yKGUpe3RoaXMuX2NvbG9yPWV9X2NvbG9yO19kZWZhdWx0Q29sb3I9InByaW1hcnkiO2dldCB2YWx1ZSgpe3JldHVybiB0aGlzLl92YWx1ZX1zZXQgdmFsdWUoZSl7dGhpcy5fdmFsdWU9V3UoZXx8MCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X3ZhbHVlPTA7Z2V0IGJ1ZmZlclZhbHVlKCl7cmV0dXJuIHRoaXMuX2J1ZmZlclZhbHVlfHwwfXNldCBidWZmZXJWYWx1ZShlKXt0aGlzLl9idWZmZXJWYWx1ZT1XdShlfHwwKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1fYnVmZmVyVmFsdWU9MDthbmltYXRpb25FbmQ9bmV3IE47Z2V0IG1vZGUoKXtyZXR1cm4gdGhpcy5fbW9kZX1zZXQgbW9kZShlKXt0aGlzLl9tb2RlPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X21vZGU9ImRldGVybWluYXRlIjtuZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLl9jbGVhbnVwVHJhbnNpdGlvbkVuZD10aGlzLl9yZW5kZXJlci5saXN0ZW4odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCJ0cmFuc2l0aW9uZW5kIix0aGlzLl90cmFuc2l0aW9uZW5kSGFuZGxlcil9KX1uZ09uRGVzdHJveSgpe3RoaXMuX2NsZWFudXBUcmFuc2l0aW9uRW5kPy4oKX1fZ2V0UHJpbWFyeUJhclRyYW5zZm9ybSgpe3JldHVybmBzY2FsZVgoJHt0aGlzLl9pc0luZGV0ZXJtaW5hdGUoKT8xOnRoaXMudmFsdWUvMTAwfSlgfV9nZXRCdWZmZXJCYXJGbGV4QmFzaXMoKXtyZXR1cm5gJHt0aGlzLm1vZGU9PT0iYnVmZmVyIj90aGlzLmJ1ZmZlclZhbHVlOjEwMH0lYH1faXNJbmRldGVybWluYXRlKCl7cmV0dXJuIHRoaXMubW9kZT09PSJpbmRldGVybWluYXRlInx8dGhpcy5tb2RlPT09InF1ZXJ5In1fdHJhbnNpdGlvbmVuZEhhbmRsZXI9ZT0+e3RoaXMuYW5pbWF0aW9uRW5kLm9ic2VydmVycy5sZW5ndGg9PT0wfHwhZS50YXJnZXR8fCFlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoIm1kYy1saW5lYXItcHJvZ3Jlc3NfX3ByaW1hcnktYmFyIil8fCh0aGlzLm1vZGU9PT0iZGV0ZXJtaW5hdGUifHx0aGlzLm1vZGU9PT0iYnVmZmVyIikmJnRoaXMuX25nWm9uZS5ydW4oKCk9PnRoaXMuYW5pbWF0aW9uRW5kLm5leHQoe3ZhbHVlOnRoaXMudmFsdWV9KSl9O3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1wcm9ncmVzcy1iYXIiXV0saG9zdEF0dHJzOlsicm9sZSIsInByb2dyZXNzYmFyIiwiYXJpYS12YWx1ZW1pbiIsIjAiLCJhcmlhLXZhbHVlbWF4IiwiMTAwIiwidGFiaW5kZXgiLCItMSIsMSwibWF0LW1kYy1wcm9ncmVzcy1iYXIiLCJtZGMtbGluZWFyLXByb2dyZXNzIl0saG9zdFZhcnM6MTAsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGksYSl7aSYyJiYoRygiYXJpYS12YWx1ZW5vdyIsYS5faXNJbmRldGVybWluYXRlKCk/bnVsbDphLnZhbHVlKSgibW9kZSIsYS5tb2RlKSxEdCgibWF0LSIrYS5jb2xvciksaWUoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixhLl9pc05vb3BBbmltYXRpb24pKCJtZGMtbGluZWFyLXByb2dyZXNzLS1hbmltYXRpb24tcmVhZHkiLCFhLl9pc05vb3BBbmltYXRpb24pKCJtZGMtbGluZWFyLXByb2dyZXNzLS1pbmRldGVybWluYXRlIixhLl9pc0luZGV0ZXJtaW5hdGUoKSkpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciIsdmFsdWU6WzIsInZhbHVlIiwidmFsdWUiLG90XSxidWZmZXJWYWx1ZTpbMiwiYnVmZmVyVmFsdWUiLCJidWZmZXJWYWx1ZSIsb3RdLG1vZGU6Im1vZGUifSxvdXRwdXRzOnthbmltYXRpb25FbmQ6ImFuaW1hdGlvbkVuZCJ9LGV4cG9ydEFzOlsibWF0UHJvZ3Jlc3NCYXIiXSxkZWNsczo3LHZhcnM6NSxjb25zdHM6W1siYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJtZGMtbGluZWFyLXByb2dyZXNzX19idWZmZXIiXSxbMSwibWRjLWxpbmVhci1wcm9ncmVzc19fYnVmZmVyLWJhciJdLFsxLCJtZGMtbGluZWFyLXByb2dyZXNzX19idWZmZXItZG90cyJdLFsiYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJtZGMtbGluZWFyLXByb2dyZXNzX19iYXIiLCJtZGMtbGluZWFyLXByb2dyZXNzX19wcmltYXJ5LWJhciJdLFsxLCJtZGMtbGluZWFyLXByb2dyZXNzX19iYXItaW5uZXIiXSxbImFyaWEtaGlkZGVuIiwidHJ1ZSIsMSwibWRjLWxpbmVhci1wcm9ncmVzc19fYmFyIiwibWRjLWxpbmVhci1wcm9ncmVzc19fc2Vjb25kYXJ5LWJhciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKEd0KDAsImRpdiIsMCksWmkoMSwiZGl2IiwxKSxNKDIsQUksMSwwLCJkaXYiLDIpLEp0KCksR3QoMywiZGl2IiwzKSxaaSg0LCJzcGFuIiw0KSxKdCgpLEd0KDUsImRpdiIsNSksWmkoNiwic3BhbiIsNCksSnQoKSksaSYyJiYobCgpLF90KCJmbGV4LWJhc2lzIixhLl9nZXRCdWZmZXJCYXJGbGV4QmFzaXMoKSksbCgpLHcoYS5tb2RlPT09ImJ1ZmZlciI/MjotMSksbCgpLF90KCJ0cmFuc2Zvcm0iLGEuX2dldFByaW1hcnlCYXJUcmFuc2Zvcm0oKSkpfSxzdHlsZXM6W2AubWF0LW1kYy1wcm9ncmVzcy1iYXJ7LS1tYXQtcHJvZ3Jlc3MtYmFyLWFuaW1hdGlvbi1tdWx0aXBsaWVyOiAxO2Rpc3BsYXk6YmxvY2s7dGV4dC1hbGlnbjpzdGFydH0ubWF0LW1kYy1wcm9ncmVzcy1iYXJbbW9kZT1xdWVyeV17dHJhbnNmb3JtOnNjYWxlWCgtMSl9Lm1hdC1tZGMtcHJvZ3Jlc3MtYmFyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tZGMtbGluZWFyLXByb2dyZXNzX19idWZmZXItZG90cywubWF0LW1kYy1wcm9ncmVzcy1iYXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1kYy1saW5lYXItcHJvZ3Jlc3NfX3ByaW1hcnktYmFyLC5tYXQtbWRjLXByb2dyZXNzLWJhci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWRjLWxpbmVhci1wcm9ncmVzc19fc2Vjb25kYXJ5LWJhciwubWF0LW1kYy1wcm9ncmVzcy1iYXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1kYy1saW5lYXItcHJvZ3Jlc3NfX2Jhci1pbm5lci5tZGMtbGluZWFyLXByb2dyZXNzX19iYXItaW5uZXJ7YW5pbWF0aW9uOm5vbmV9Lm1hdC1tZGMtcHJvZ3Jlc3MtYmFyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tZGMtbGluZWFyLXByb2dyZXNzX19wcmltYXJ5LWJhciwubWF0LW1kYy1wcm9ncmVzcy1iYXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1kYy1saW5lYXItcHJvZ3Jlc3NfX2J1ZmZlci1iYXJ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMW1zfS5tYXQtcHJvZ3Jlc3MtYmFyLXJlZHVjZWQtbW90aW9uey0tbWF0LXByb2dyZXNzLWJhci1hbmltYXRpb24tbXVsdGlwbGllcjogMn0ubWRjLWxpbmVhci1wcm9ncmVzc3twb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApO291dGxpbmU6MXB4IHNvbGlkIHJnYmEoMCwwLDAsMCk7b3ZlcmZsb3cteDpoaWRkZW47dHJhbnNpdGlvbjpvcGFjaXR5IDI1MG1zIDBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpO2hlaWdodDptYXgodmFyKC0tbWF0LXByb2dyZXNzLWJhci10cmFjay1oZWlnaHQsIDRweCksdmFyKC0tbWF0LXByb2dyZXNzLWJhci1hY3RpdmUtaW5kaWNhdG9yLWhlaWdodCwgNHB4KSl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1kYy1saW5lYXItcHJvZ3Jlc3N7b3V0bGluZS1jb2xvcjpDYW52YXNUZXh0fX0ubWRjLWxpbmVhci1wcm9ncmVzc19fYmFye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO21hcmdpbjphdXRvIDA7d2lkdGg6MTAwJTthbmltYXRpb246bm9uZTt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0O3RyYW5zaXRpb246dHJhbnNmb3JtIDI1MG1zIDBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpO2hlaWdodDp2YXIoLS1tYXQtcHJvZ3Jlc3MtYmFyLWFjdGl2ZS1pbmRpY2F0b3ItaGVpZ2h0LCA0cHgpfS5tZGMtbGluZWFyLXByb2dyZXNzLS1pbmRldGVybWluYXRlIC5tZGMtbGluZWFyLXByb2dyZXNzX19iYXJ7dHJhbnNpdGlvbjpub25lfVtkaXI9cnRsXSAubWRjLWxpbmVhci1wcm9ncmVzc19fYmFye3JpZ2h0OjA7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgcmlnaHR9Lm1kYy1saW5lYXItcHJvZ3Jlc3NfX2Jhci1pbm5lcntkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO2FuaW1hdGlvbjpub25lO2JvcmRlci10b3Atc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1wcm9ncmVzcy1iYXItYWN0aXZlLWluZGljYXRvci1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSk7Ym9yZGVyLXRvcC13aWR0aDp2YXIoLS1tYXQtcHJvZ3Jlc3MtYmFyLWFjdGl2ZS1pbmRpY2F0b3ItaGVpZ2h0LCA0cHgpfS5tZGMtbGluZWFyLXByb2dyZXNzX19idWZmZXJ7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO21hcmdpbjphdXRvIDA7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47aGVpZ2h0OnZhcigtLW1hdC1wcm9ncmVzcy1iYXItdHJhY2staGVpZ2h0LCA0cHgpO2JvcmRlci1yYWRpdXM6dmFyKC0tbWF0LXByb2dyZXNzLWJhci10cmFjay1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItbm9uZSkpfS5tZGMtbGluZWFyLXByb2dyZXNzX19idWZmZXItZG90c3tiYWNrZ3JvdW5kLWltYWdlOnJhZGlhbC1ncmFkaWVudChjaXJjbGUsIHZhcigtLW1hdC1wcm9ncmVzcy1iYXItdHJhY2stY29sb3IsIHZhcigtLW1hdC1zeXMtc3VyZmFjZS12YXJpYW50KSkgY2FsYyh2YXIoLS1tYXQtcHJvZ3Jlc3MtYmFyLXRyYWNrLWhlaWdodCwgNHB4KSAvIDIpLCB0cmFuc3BhcmVudCAwKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDtiYWNrZ3JvdW5kLXNpemU6Y2FsYyhjYWxjKHZhcigtLW1hdC1wcm9ncmVzcy1iYXItdHJhY2staGVpZ2h0LCA0cHgpIC8gMikqNSk7YmFja2dyb3VuZC1wb3NpdGlvbjpsZWZ0O2ZsZXg6YXV0bzt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyk7YW5pbWF0aW9uOm1kYy1saW5lYXItcHJvZ3Jlc3MtYnVmZmVyaW5nIGNhbGMoMjUwbXMqdmFyKC0tbWF0LXByb2dyZXNzLWJhci1hbmltYXRpb24tbXVsdGlwbGllcikpIGluZmluaXRlIGxpbmVhcn1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWRjLWxpbmVhci1wcm9ncmVzc19fYnVmZmVyLWRvdHN7YmFja2dyb3VuZC1jb2xvcjpCdXR0b25Cb3JkZXJ9fVtkaXI9cnRsXSAubWRjLWxpbmVhci1wcm9ncmVzc19fYnVmZmVyLWRvdHN7YW5pbWF0aW9uOm1kYy1saW5lYXItcHJvZ3Jlc3MtYnVmZmVyaW5nLXJldmVyc2UgY2FsYygyNTBtcyp2YXIoLS1tYXQtcHJvZ3Jlc3MtYmFyLWFuaW1hdGlvbi1tdWx0aXBsaWVyKSkgaW5maW5pdGUgbGluZWFyO3RyYW5zZm9ybTpyb3RhdGUoMCl9Lm1kYy1saW5lYXItcHJvZ3Jlc3NfX2J1ZmZlci1iYXJ7ZmxleDowIDEgMTAwJTt0cmFuc2l0aW9uOmZsZXgtYmFzaXMgMjUwbXMgMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtcHJvZ3Jlc3MtYmFyLXRyYWNrLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXN1cmZhY2UtdmFyaWFudCkpfS5tZGMtbGluZWFyLXByb2dyZXNzX19wcmltYXJ5LWJhcnt0cmFuc2Zvcm06c2NhbGVYKDApfS5tZGMtbGluZWFyLXByb2dyZXNzLS1pbmRldGVybWluYXRlIC5tZGMtbGluZWFyLXByb2dyZXNzX19wcmltYXJ5LWJhcntsZWZ0Oi0xNDUuMTY2NjExJX0ubWRjLWxpbmVhci1wcm9ncmVzcy0taW5kZXRlcm1pbmF0ZS5tZGMtbGluZWFyLXByb2dyZXNzLS1hbmltYXRpb24tcmVhZHkgLm1kYy1saW5lYXItcHJvZ3Jlc3NfX3ByaW1hcnktYmFye2FuaW1hdGlvbjptZGMtbGluZWFyLXByb2dyZXNzLXByaW1hcnktaW5kZXRlcm1pbmF0ZS10cmFuc2xhdGUgY2FsYygycyp2YXIoLS1tYXQtcHJvZ3Jlc3MtYmFyLWFuaW1hdGlvbi1tdWx0aXBsaWVyKSkgaW5maW5pdGUgbGluZWFyfS5tZGMtbGluZWFyLXByb2dyZXNzLS1pbmRldGVybWluYXRlLm1kYy1saW5lYXItcHJvZ3Jlc3MtLWFuaW1hdGlvbi1yZWFkeSAubWRjLWxpbmVhci1wcm9ncmVzc19fcHJpbWFyeS1iYXI+Lm1kYy1saW5lYXItcHJvZ3Jlc3NfX2Jhci1pbm5lcnthbmltYXRpb246bWRjLWxpbmVhci1wcm9ncmVzcy1wcmltYXJ5LWluZGV0ZXJtaW5hdGUtc2NhbGUgY2FsYygycyp2YXIoLS1tYXQtcHJvZ3Jlc3MtYmFyLWFuaW1hdGlvbi1tdWx0aXBsaWVyKSkgaW5maW5pdGUgbGluZWFyfVtkaXI9cnRsXSAubWRjLWxpbmVhci1wcm9ncmVzcy5tZGMtbGluZWFyLXByb2dyZXNzLS1hbmltYXRpb24tcmVhZHkgLm1kYy1saW5lYXItcHJvZ3Jlc3NfX3ByaW1hcnktYmFye2FuaW1hdGlvbi1uYW1lOm1kYy1saW5lYXItcHJvZ3Jlc3MtcHJpbWFyeS1pbmRldGVybWluYXRlLXRyYW5zbGF0ZS1yZXZlcnNlfVtkaXI9cnRsXSAubWRjLWxpbmVhci1wcm9ncmVzcy5tZGMtbGluZWFyLXByb2dyZXNzLS1pbmRldGVybWluYXRlIC5tZGMtbGluZWFyLXByb2dyZXNzX19wcmltYXJ5LWJhcntyaWdodDotMTQ1LjE2NjYxMSU7bGVmdDphdXRvfS5tZGMtbGluZWFyLXByb2dyZXNzX19zZWNvbmRhcnktYmFye2Rpc3BsYXk6bm9uZX0ubWRjLWxpbmVhci1wcm9ncmVzcy0taW5kZXRlcm1pbmF0ZSAubWRjLWxpbmVhci1wcm9ncmVzc19fc2Vjb25kYXJ5LWJhcntsZWZ0Oi01NC44ODg4OTElO2Rpc3BsYXk6YmxvY2t9Lm1kYy1saW5lYXItcHJvZ3Jlc3MtLWluZGV0ZXJtaW5hdGUubWRjLWxpbmVhci1wcm9ncmVzcy0tYW5pbWF0aW9uLXJlYWR5IC5tZGMtbGluZWFyLXByb2dyZXNzX19zZWNvbmRhcnktYmFye2FuaW1hdGlvbjptZGMtbGluZWFyLXByb2dyZXNzLXNlY29uZGFyeS1pbmRldGVybWluYXRlLXRyYW5zbGF0ZSBjYWxjKDJzKnZhcigtLW1hdC1wcm9ncmVzcy1iYXItYW5pbWF0aW9uLW11bHRpcGxpZXIpKSBpbmZpbml0ZSBsaW5lYXJ9Lm1kYy1saW5lYXItcHJvZ3Jlc3MtLWluZGV0ZXJtaW5hdGUubWRjLWxpbmVhci1wcm9ncmVzcy0tYW5pbWF0aW9uLXJlYWR5IC5tZGMtbGluZWFyLXByb2dyZXNzX19zZWNvbmRhcnktYmFyPi5tZGMtbGluZWFyLXByb2dyZXNzX19iYXItaW5uZXJ7YW5pbWF0aW9uOm1kYy1saW5lYXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWluZGV0ZXJtaW5hdGUtc2NhbGUgY2FsYygycyp2YXIoLS1tYXQtcHJvZ3Jlc3MtYmFyLWFuaW1hdGlvbi1tdWx0aXBsaWVyKSkgaW5maW5pdGUgbGluZWFyfVtkaXI9cnRsXSAubWRjLWxpbmVhci1wcm9ncmVzcy5tZGMtbGluZWFyLXByb2dyZXNzLS1hbmltYXRpb24tcmVhZHkgLm1kYy1saW5lYXItcHJvZ3Jlc3NfX3NlY29uZGFyeS1iYXJ7YW5pbWF0aW9uLW5hbWU6bWRjLWxpbmVhci1wcm9ncmVzcy1zZWNvbmRhcnktaW5kZXRlcm1pbmF0ZS10cmFuc2xhdGUtcmV2ZXJzZX1bZGlyPXJ0bF0gLm1kYy1saW5lYXItcHJvZ3Jlc3MubWRjLWxpbmVhci1wcm9ncmVzcy0taW5kZXRlcm1pbmF0ZSAubWRjLWxpbmVhci1wcm9ncmVzc19fc2Vjb25kYXJ5LWJhcntyaWdodDotNTQuODg4ODkxJTtsZWZ0OmF1dG99QGtleWZyYW1lcyBtZGMtbGluZWFyLXByb2dyZXNzLWJ1ZmZlcmluZ3tmcm9te3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKSB0cmFuc2xhdGVYKGNhbGModmFyKC0tbWF0LXByb2dyZXNzLWJhci10cmFjay1oZWlnaHQsIDRweCkgKiAtMi41KSl9fUBrZXlmcmFtZXMgbWRjLWxpbmVhci1wcm9ncmVzcy1wcmltYXJ5LWluZGV0ZXJtaW5hdGUtdHJhbnNsYXRlezAle3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTIwJXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjUsIDAsIDAuNzAxNzMyLCAwLjQ5NTgxOSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9NTkuMTUle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMzAyNDM1LCAwLjM4MTM1MiwgMC41NSwgMC45NTYzNTIpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDgzLjY3MTQyJSl9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgyMDAuNjExMDU3JSl9fUBrZXlmcmFtZXMgbWRjLWxpbmVhci1wcm9ncmVzcy1wcmltYXJ5LWluZGV0ZXJtaW5hdGUtc2NhbGV7MCV7dHJhbnNmb3JtOnNjYWxlWCgwLjA4KX0zNi42NSV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4zMzQ3MzEsIDAuMTI0ODIsIDAuNzg1ODQ0LCAxKTt0cmFuc2Zvcm06c2NhbGVYKDAuMDgpfTY5LjE1JXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjA2LCAwLjExLCAwLjYsIDEpO3RyYW5zZm9ybTpzY2FsZVgoMC42NjE0NzkpfTEwMCV7dHJhbnNmb3JtOnNjYWxlWCgwLjA4KX19QGtleWZyYW1lcyBtZGMtbGluZWFyLXByb2dyZXNzLXNlY29uZGFyeS1pbmRldGVybWluYXRlLXRyYW5zbGF0ZXswJXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE1LCAwLCAwLjUxNTA1OCwgMC40MDk2ODUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTI1JXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjMxMDMzLCAwLjI4NDA1OCwgMC44LCAwLjczMzcxMik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMzcuNjUxOTEzJSl9NDguMzUle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNCwgMC42MjcwMzUsIDAuNiwgMC45MDIwMjYpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDg0LjM4NjE2NSUpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTYwLjI3Nzc4MiUpfX1Aa2V5ZnJhbWVzIG1kYy1saW5lYXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWluZGV0ZXJtaW5hdGUtc2NhbGV7MCV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMDUwMjgsIDAuMDU3MDUxLCAwLjU3NjYxLCAwLjQ1Mzk3MSk7dHJhbnNmb3JtOnNjYWxlWCgwLjA4KX0xOS4xNSV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNTIzMTMsIDAuMTk2NDMyLCAwLjY0ODM3NCwgMS4wMDQzMTUpO3RyYW5zZm9ybTpzY2FsZVgoMC40NTcxMDQpfTQ0LjE1JXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjI1Nzc1OSwgLTAuMDAzMTYzLCAwLjIxMTc2MiwgMS4zODE3OSk7dHJhbnNmb3JtOnNjYWxlWCgwLjcyNzk2KX0xMDAle3RyYW5zZm9ybTpzY2FsZVgoMC4wOCl9fUBrZXlmcmFtZXMgbWRjLWxpbmVhci1wcm9ncmVzcy1wcmltYXJ5LWluZGV0ZXJtaW5hdGUtdHJhbnNsYXRlLXJldmVyc2V7MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9MjAle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNSwgMCwgMC43MDE3MzIsIDAuNDk1ODE5KTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX01OS4xNSV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4zMDI0MzUsIDAuMzgxMzUyLCAwLjU1LCAwLjk1NjM1Mik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTgzLjY3MTQyJSl9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMjAwLjYxMTA1NyUpfX1Aa2V5ZnJhbWVzIG1kYy1saW5lYXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWluZGV0ZXJtaW5hdGUtdHJhbnNsYXRlLXJldmVyc2V7MCV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNSwgMCwgMC41MTUwNTgsIDAuNDA5Njg1KTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0yNSV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4zMTAzMywgMC4yODQwNTgsIDAuOCwgMC43MzM3MTIpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0zNy42NTE5MTMlKX00OC4zNSV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC40LCAwLjYyNzAzNSwgMC42LCAwLjkwMjAyNik7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTg0LjM4NjE2NSUpfTEwMCV7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTE2MC4yNzc3ODIlKX19QGtleWZyYW1lcyBtZGMtbGluZWFyLXByb2dyZXNzLWJ1ZmZlcmluZy1yZXZlcnNle2Zyb217dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwcHgpfX0KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIHR9KSgpO3EzPSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1bW9kPXhlKHt0eXBlOnR9KTtzdGF0aWMgXHUwMjc1aW5qPXllKHtpbXBvcnRzOlt6ZV19KX1yZXR1cm4gdH0pKCl9KTt2YXIgWXUsWnUsJHUsS3U9eCgoKT0+e2soKTtrKCk7WHQoKTt5bSgpO2U4KCk7WXU9bmV3IGNlKCJDZGtBY2NvcmRpb24iKSxadT0oKCk9PntjbGFzcyB0e2FjY29yZGlvbj1oKFl1LHtvcHRpb25hbDohMCxza2lwU2VsZjohMH0pO19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtfZXhwYW5zaW9uRGlzcGF0Y2hlcj1oKFVuKTtfb3BlbkNsb3NlQWxsU3Vic2NyaXB0aW9uPW8xLkVNUFRZO2Nsb3NlZD1uZXcgTjtvcGVuZWQ9bmV3IE47ZGVzdHJveWVkPW5ldyBOO2V4cGFuZGVkQ2hhbmdlPW5ldyBOO2lkPWgocXQpLmdldElkKCJjZGstYWNjb3JkaW9uLWNoaWxkLSIpO2dldCBleHBhbmRlZCgpe3JldHVybiB0aGlzLl9leHBhbmRlZH1zZXQgZXhwYW5kZWQoZSl7aWYodGhpcy5fZXhwYW5kZWQhPT1lKXtpZih0aGlzLl9leHBhbmRlZD1lLHRoaXMuZXhwYW5kZWRDaGFuZ2UuZW1pdChlKSxlKXt0aGlzLm9wZW5lZC5lbWl0KCk7bGV0IGk9dGhpcy5hY2NvcmRpb24/dGhpcy5hY2NvcmRpb24uaWQ6dGhpcy5pZDt0aGlzLl9leHBhbnNpb25EaXNwYXRjaGVyLm5vdGlmeSh0aGlzLmlkLGkpfWVsc2UgdGhpcy5jbG9zZWQuZW1pdCgpO3RoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfX1fZXhwYW5kZWQ9ITE7Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVkKCl9c2V0IGRpc2FibGVkKGUpe3RoaXMuX2Rpc2FibGVkLnNldChlKX1fZGlzYWJsZWQ9ZnQoITEpO19yZW1vdmVVbmlxdWVTZWxlY3Rpb25MaXN0ZW5lcj0oKT0+e307Y29uc3RydWN0b3IoKXt9bmdPbkluaXQoKXt0aGlzLl9yZW1vdmVVbmlxdWVTZWxlY3Rpb25MaXN0ZW5lcj10aGlzLl9leHBhbnNpb25EaXNwYXRjaGVyLmxpc3RlbigoZSxpKT0+e3RoaXMuYWNjb3JkaW9uJiYhdGhpcy5hY2NvcmRpb24ubXVsdGkmJnRoaXMuYWNjb3JkaW9uLmlkPT09aSYmdGhpcy5pZCE9PWUmJih0aGlzLmV4cGFuZGVkPSExKX0pLHRoaXMuYWNjb3JkaW9uJiYodGhpcy5fb3BlbkNsb3NlQWxsU3Vic2NyaXB0aW9uPXRoaXMuX3N1YnNjcmliZVRvT3BlbkNsb3NlQWxsQWN0aW9ucygpKX1uZ09uRGVzdHJveSgpe3RoaXMub3BlbmVkLmNvbXBsZXRlKCksdGhpcy5jbG9zZWQuY29tcGxldGUoKSx0aGlzLmRlc3Ryb3llZC5lbWl0KCksdGhpcy5kZXN0cm95ZWQuY29tcGxldGUoKSx0aGlzLl9yZW1vdmVVbmlxdWVTZWxlY3Rpb25MaXN0ZW5lcigpLHRoaXMuX29wZW5DbG9zZUFsbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfXRvZ2dsZSgpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLmV4cGFuZGVkPSF0aGlzLmV4cGFuZGVkKX1jbG9zZSgpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLmV4cGFuZGVkPSExKX1vcGVuKCl7dGhpcy5kaXNhYmxlZHx8KHRoaXMuZXhwYW5kZWQ9ITApfV9zdWJzY3JpYmVUb09wZW5DbG9zZUFsbEFjdGlvbnMoKXtyZXR1cm4gdGhpcy5hY2NvcmRpb24uX29wZW5DbG9zZUFsbEFjdGlvbnMuc3Vic2NyaWJlKGU9Pnt0aGlzLmRpc2FibGVkfHwodGhpcy5leHBhbmRlZD1lKX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbImNkay1hY2NvcmRpb24taXRlbSJdLFsiIiwiY2RrQWNjb3JkaW9uSXRlbSIsIiJdXSxpbnB1dHM6e2V4cGFuZGVkOlsyLCJleHBhbmRlZCIsImV4cGFuZGVkIixaXSxkaXNhYmxlZDpbMiwiZGlzYWJsZWQiLCJkaXNhYmxlZCIsWl19LG91dHB1dHM6e2Nsb3NlZDoiY2xvc2VkIixvcGVuZWQ6Im9wZW5lZCIsZGVzdHJveWVkOiJkZXN0cm95ZWQiLGV4cGFuZGVkQ2hhbmdlOiJleHBhbmRlZENoYW5nZSJ9LGV4cG9ydEFzOlsiY2RrQWNjb3JkaW9uSXRlbSJdLGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6WXUsdXNlVmFsdWU6dm9pZCAwfV0pXX0pfXJldHVybiB0fSkoKSwkdT0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NW1vZD14ZSh7dHlwZTp0fSk7c3RhdGljIFx1MDI3NWluaj15ZSh7fSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gSEkodCxuKXt9ZnVuY3Rpb24gRkkodCxuKXt0JjEmJihHdCgwLCJzcGFuIiwxKSxNdCgpLEd0KDEsInN2ZyIsMiksWmkoMiwicGF0aCIsMyksSnQoKSgpKX12YXIgTEksUEksVkksT0ksTkksUkksWHUsSnUsQkksZWcsWW4sbm8sVzMscm8sdGcseDQ9eCgoKT0+e2soKTtrKCk7S3UoKTtFbigpO3hpKCk7bHQoKTtZMigpO1h0KCk7cW4oKTtmaSgpO0EyKCk7STIoKTt5MSgpO0xJPVsiYm9keSJdLFBJPVsiYm9keVdyYXBwZXIiXSxWST1bW1sibWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIiXV0sIioiLFtbIm1hdC1hY3Rpb24tcm93Il1dXSxPST1bIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIiwiKiIsIm1hdC1hY3Rpb24tcm93Il07Tkk9W1tbIm1hdC1wYW5lbC10aXRsZSJdXSxbWyJtYXQtcGFuZWwtZGVzY3JpcHRpb24iXV0sIioiXSxSST1bIm1hdC1wYW5lbC10aXRsZSIsIm1hdC1wYW5lbC1kZXNjcmlwdGlvbiIsIioiXTtYdT1uZXcgY2UoIk1BVF9BQ0NPUkRJT04iKSxKdT1uZXcgY2UoIk1BVF9FWFBBTlNJT05fUEFORUwiKSxCST0oKCk9PntjbGFzcyB0e190ZW1wbGF0ZT1oKGgxKTtfZXhwYW5zaW9uUGFuZWw9aChKdSx7b3B0aW9uYWw6ITB9KTtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyJuZy10ZW1wbGF0ZSIsIm1hdEV4cGFuc2lvblBhbmVsQ29udGVudCIsIiJdXX0pfXJldHVybiB0fSkoKSxlZz1uZXcgY2UoIk1BVF9FWFBBTlNJT05fUEFORUxfREVGQVVMVF9PUFRJT05TIiksWW49KCgpPT57Y2xhc3MgdCBleHRlbmRzIFp1e192aWV3Q29udGFpbmVyUmVmPWgoRzEpO19hbmltYXRpb25zRGlzYWJsZWQ9UHQoKTtfZG9jdW1lbnQ9aChqdCk7X25nWm9uZT1oKHJlKTtfZWxlbWVudFJlZj1oKGFlKTtfcmVuZGVyZXI9aCh2MSk7X2NsZWFudXBUcmFuc2l0aW9uRW5kO2dldCBoaWRlVG9nZ2xlKCl7cmV0dXJuIHRoaXMuX2hpZGVUb2dnbGV8fHRoaXMuYWNjb3JkaW9uJiZ0aGlzLmFjY29yZGlvbi5oaWRlVG9nZ2xlfXNldCBoaWRlVG9nZ2xlKGUpe3RoaXMuX2hpZGVUb2dnbGU9ZX1faGlkZVRvZ2dsZT0hMTtnZXQgdG9nZ2xlUG9zaXRpb24oKXtyZXR1cm4gdGhpcy5fdG9nZ2xlUG9zaXRpb258fHRoaXMuYWNjb3JkaW9uJiZ0aGlzLmFjY29yZGlvbi50b2dnbGVQb3NpdGlvbn1zZXQgdG9nZ2xlUG9zaXRpb24oZSl7dGhpcy5fdG9nZ2xlUG9zaXRpb249ZX1fdG9nZ2xlUG9zaXRpb247YWZ0ZXJFeHBhbmQ9bmV3IE47YWZ0ZXJDb2xsYXBzZT1uZXcgTjtfaW5wdXRDaGFuZ2VzPW5ldyB3ZTthY2NvcmRpb249aChYdSx7b3B0aW9uYWw6ITAsc2tpcFNlbGY6ITB9KTtfbGF6eUNvbnRlbnQ7X2JvZHk7X2JvZHlXcmFwcGVyO19wb3J0YWw7X2hlYWRlcklkPWgocXQpLmdldElkKCJtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci0iKTtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7bGV0IGU9aChlZyx7b3B0aW9uYWw6ITB9KTt0aGlzLl9leHBhbnNpb25EaXNwYXRjaGVyPWgoVW4pLGUmJih0aGlzLmhpZGVUb2dnbGU9ZS5oaWRlVG9nZ2xlKX1faGFzU3BhY2luZygpe3JldHVybiB0aGlzLmFjY29yZGlvbj90aGlzLmV4cGFuZGVkJiZ0aGlzLmFjY29yZGlvbi5kaXNwbGF5TW9kZT09PSJkZWZhdWx0IjohMX1fZ2V0RXhwYW5kZWRTdGF0ZSgpe3JldHVybiB0aGlzLmV4cGFuZGVkPyJleHBhbmRlZCI6ImNvbGxhcHNlZCJ9dG9nZ2xlKCl7dGhpcy5leHBhbmRlZD0hdGhpcy5leHBhbmRlZH1jbG9zZSgpe3RoaXMuZXhwYW5kZWQ9ITF9b3Blbigpe3RoaXMuZXhwYW5kZWQ9ITB9bmdBZnRlckNvbnRlbnRJbml0KCl7dGhpcy5fbGF6eUNvbnRlbnQmJnRoaXMuX2xhenlDb250ZW50Ll9leHBhbnNpb25QYW5lbD09PXRoaXMmJnRoaXMub3BlbmVkLnBpcGUoaTEobnVsbCksJHQoKCk9PnRoaXMuZXhwYW5kZWQmJiF0aGlzLl9wb3J0YWwpLGoxKDEpKS5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9wb3J0YWw9bmV3IHBhKHRoaXMuX2xhenlDb250ZW50Ll90ZW1wbGF0ZSx0aGlzLl92aWV3Q29udGFpbmVyUmVmKX0pLHRoaXMuX3NldHVwQW5pbWF0aW9uRXZlbnRzKCl9bmdPbkNoYW5nZXMoZSl7dGhpcy5faW5wdXRDaGFuZ2VzLm5leHQoZSl9bmdPbkRlc3Ryb3koKXtzdXBlci5uZ09uRGVzdHJveSgpLHRoaXMuX2NsZWFudXBUcmFuc2l0aW9uRW5kPy4oKSx0aGlzLl9pbnB1dENoYW5nZXMuY29tcGxldGUoKX1fY29udGFpbnNGb2N1cygpe2lmKHRoaXMuX2JvZHkpe2xldCBlPXRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQsaT10aGlzLl9ib2R5Lm5hdGl2ZUVsZW1lbnQ7cmV0dXJuIGU9PT1pfHxpLmNvbnRhaW5zKGUpfXJldHVybiExfV90cmFuc2l0aW9uRW5kTGlzdGVuZXI9KHt0YXJnZXQ6ZSxwcm9wZXJ0eU5hbWU6aX0pPT57ZT09PXRoaXMuX2JvZHlXcmFwcGVyPy5uYXRpdmVFbGVtZW50JiZpPT09ImdyaWQtdGVtcGxhdGUtcm93cyImJnRoaXMuX25nWm9uZS5ydW4oKCk9Pnt0aGlzLmV4cGFuZGVkP3RoaXMuYWZ0ZXJFeHBhbmQuZW1pdCgpOnRoaXMuYWZ0ZXJDb2xsYXBzZS5lbWl0KCl9KX07X3NldHVwQW5pbWF0aW9uRXZlbnRzKCl7dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT57dGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkPyh0aGlzLm9wZW5lZC5zdWJzY3JpYmUoKCk9PnRoaXMuX25nWm9uZS5ydW4oKCk9PnRoaXMuYWZ0ZXJFeHBhbmQuZW1pdCgpKSksdGhpcy5jbG9zZWQuc3Vic2NyaWJlKCgpPT50aGlzLl9uZ1pvbmUucnVuKCgpPT50aGlzLmFmdGVyQ29sbGFwc2UuZW1pdCgpKSkpOnNldFRpbWVvdXQoKCk9PntsZXQgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7dGhpcy5fY2xlYW51cFRyYW5zaXRpb25FbmQ9dGhpcy5fcmVuZGVyZXIubGlzdGVuKGUsInRyYW5zaXRpb25lbmQiLHRoaXMuX3RyYW5zaXRpb25FbmRMaXN0ZW5lciksZS5jbGFzc0xpc3QuYWRkKCJtYXQtZXhwYW5zaW9uLXBhbmVsLWFuaW1hdGlvbnMtZW5hYmxlZCIpfSwyMDApfSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LWV4cGFuc2lvbi1wYW5lbCJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbihpLGEscil7aWYoaSYxJiZCZShyLEJJLDUpLGkmMil7bGV0IG87RihvPUIoKSkmJihhLl9sYXp5Q29udGVudD1vLmZpcnN0KX19LHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKHRlKExJLDUpLHRlKFBJLDUpKSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5fYm9keT1yLmZpcnN0KSxGKHI9QigpKSYmKGEuX2JvZHlXcmFwcGVyPXIuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtZXhwYW5zaW9uLXBhbmVsIl0saG9zdFZhcnM6NCxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJmllKCJtYXQtZXhwYW5kZWQiLGEuZXhwYW5kZWQpKCJtYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmciLGEuX2hhc1NwYWNpbmcoKSl9LGlucHV0czp7aGlkZVRvZ2dsZTpbMiwiaGlkZVRvZ2dsZSIsImhpZGVUb2dnbGUiLFpdLHRvZ2dsZVBvc2l0aW9uOiJ0b2dnbGVQb3NpdGlvbiJ9LG91dHB1dHM6e2FmdGVyRXhwYW5kOiJhZnRlckV4cGFuZCIsYWZ0ZXJDb2xsYXBzZToiYWZ0ZXJDb2xsYXBzZSJ9LGV4cG9ydEFzOlsibWF0RXhwYW5zaW9uUGFuZWwiXSxmZWF0dXJlczpbSWUoW3twcm92aWRlOlh1LHVzZVZhbHVlOnZvaWQgMH0se3Byb3ZpZGU6SnUsdXNlRXhpc3Rpbmc6dH1dKSxGZSxIZV0sbmdDb250ZW50U2VsZWN0b3JzOk9JLGRlY2xzOjksdmFyczo0LGNvbnN0czpbWyJib2R5V3JhcHBlciIsIiJdLFsiYm9keSIsIiJdLFsxLCJtYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnQtd3JhcHBlciJdLFsicm9sZSIsInJlZ2lvbiIsMSwibWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50IiwzLCJpZCJdLFsxLCJtYXQtZXhwYW5zaW9uLXBhbmVsLWJvZHkiXSxbMywiY2RrUG9ydGFsT3V0bGV0Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoUmUoVkkpLG1lKDApLGMoMSwiZGl2IiwyLDApKDMsImRpdiIsMywxKSg1LCJkaXYiLDQpLG1lKDYsMSksUig3LEhJLDAsMCwibmctdGVtcGxhdGUiLDUpLHMoKSxtZSg4LDIpLHMoKSgpKSxpJjImJihsKCksRygiaW5lcnQiLGEuZXhwYW5kZWQ/bnVsbDoiIiksbCgyKSxmKCJpZCIsYS5pZCksRygiYXJpYS1sYWJlbGxlZGJ5IixhLl9oZWFkZXJJZCksbCg0KSxmKCJjZGtQb3J0YWxPdXRsZXQiLGEuX3BvcnRhbCkpfSxkZXBlbmRlbmNpZXM6W0tpXSxzdHlsZXM6W2AubWF0LWV4cGFuc2lvbi1wYW5lbHtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQ6dmFyKC0tbWF0LWV4cGFuc2lvbi1jb250YWluZXItYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlKSk7Y29sb3I6dmFyKC0tbWF0LWV4cGFuc2lvbi1jb250YWluZXItdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYXQtZXhwYW5zaW9uLWNvbnRhaW5lci1zaGFwZSwgMTJweCl9Lm1hdC1leHBhbnNpb24tcGFuZWwubWF0LWV4cGFuc2lvbi1wYW5lbC1hbmltYXRpb25zLWVuYWJsZWR7dHJhbnNpdGlvbjptYXJnaW4gMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSl9Lm1hdC1leHBhbnNpb24tcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzp2YXIoLS1tYXQtZXhwYW5zaW9uLWNvbnRhaW5lci1lbGV2YXRpb24tc2hhZG93LCAwcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpKX0ubWF0LWFjY29yZGlvbiAubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCksLm1hdC1hY2NvcmRpb24gLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmcpe2JvcmRlci1yYWRpdXM6MH0ubWF0LWFjY29yZGlvbiAubWF0LWV4cGFuc2lvbi1wYW5lbDpmaXJzdC1vZi10eXBle2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOnZhcigtLW1hdC1leHBhbnNpb24tY29udGFpbmVyLXNoYXBlLCAxMnB4KTtib3JkZXItdG9wLWxlZnQtcmFkaXVzOnZhcigtLW1hdC1leHBhbnNpb24tY29udGFpbmVyLXNoYXBlLCAxMnB4KX0ubWF0LWFjY29yZGlvbiAubWF0LWV4cGFuc2lvbi1wYW5lbDpsYXN0LW9mLXR5cGV7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6dmFyKC0tbWF0LWV4cGFuc2lvbi1jb250YWluZXItc2hhcGUsIDEycHgpO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6dmFyKC0tbWF0LWV4cGFuc2lvbi1jb250YWluZXItc2hhcGUsIDEycHgpfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtZXhwYW5zaW9uLXBhbmVse291dGxpbmU6c29saWQgMXB4fX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50LXdyYXBwZXJ7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtcm93czowZnI7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjEwMCV9Lm1hdC1leHBhbnNpb24tcGFuZWwtYW5pbWF0aW9ucy1lbmFibGVkIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnQtd3JhcHBlcnt0cmFuc2l0aW9uOmdyaWQtdGVtcGxhdGUtcm93cyAyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLm1hdC1leHBhbmRlZD4ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50LXdyYXBwZXJ7Z3JpZC10ZW1wbGF0ZS1yb3dzOjFmcn1Ac3VwcG9ydHMgbm90IChncmlkLXRlbXBsYXRlLXJvd3M6IDBmcil7Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudC13cmFwcGVye2hlaWdodDowfS5tYXQtZXhwYW5zaW9uLXBhbmVsLm1hdC1leHBhbmRlZD4ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50LXdyYXBwZXJ7aGVpZ2h0OmF1dG99fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnR7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtvdmVyZmxvdzp2aXNpYmxlO21pbi1oZWlnaHQ6MDt2aXNpYmlsaXR5OmhpZGRlbjtmb250LWZhbWlseTp2YXIoLS1tYXQtZXhwYW5zaW9uLWNvbnRhaW5lci10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZS1mb250KSk7Zm9udC1zaXplOnZhcigtLW1hdC1leHBhbnNpb24tY29udGFpbmVyLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXNpemUpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtZXhwYW5zaW9uLWNvbnRhaW5lci10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXdlaWdodCkpO2xpbmUtaGVpZ2h0OnZhcigtLW1hdC1leHBhbnNpb24tY29udGFpbmVyLXRleHQtbGluZS1oZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZS1saW5lLWhlaWdodCkpO2xldHRlci1zcGFjaW5nOnZhcigtLW1hdC1leHBhbnNpb24tY29udGFpbmVyLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZS10cmFja2luZykpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWFuaW1hdGlvbnMtZW5hYmxlZCAubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50e3RyYW5zaXRpb246dmlzaWJpbGl0eSAxOTBtcyBsaW5lYXJ9Lm1hdC1leHBhbnNpb24tcGFuZWwubWF0LWV4cGFuZGVkPi5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnQtd3JhcHBlcj4ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50e3Zpc2liaWxpdHk6dmlzaWJsZX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1ib2R5e3BhZGRpbmc6MCAyNHB4IDE2cHh9Lm1hdC1leHBhbnNpb24tcGFuZWwtc3BhY2luZ3ttYXJnaW46MTZweCAwfS5tYXQtYWNjb3JkaW9uPi5tYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmc6Zmlyc3QtY2hpbGQsLm1hdC1hY2NvcmRpb24+KjpmaXJzdC1jaGlsZDpub3QoLm1hdC1leHBhbnNpb24tcGFuZWwpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmd7bWFyZ2luLXRvcDowfS5tYXQtYWNjb3JkaW9uPi5tYXQtZXhwYW5zaW9uLXBhbmVsLXNwYWNpbmc6bGFzdC1jaGlsZCwubWF0LWFjY29yZGlvbj4qOmxhc3QtY2hpbGQ6bm90KC5tYXQtZXhwYW5zaW9uLXBhbmVsKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1zcGFjaW5ne21hcmdpbi1ib3R0b206MH0ubWF0LWFjdGlvbi1yb3d7Ym9yZGVyLXRvcC1zdHlsZTpzb2xpZDtib3JkZXItdG9wLXdpZHRoOjFweDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtwYWRkaW5nOjE2cHggOHB4IDE2cHggMjRweDtib3JkZXItdG9wLWNvbG9yOnZhcigtLW1hdC1leHBhbnNpb24tYWN0aW9ucy1kaXZpZGVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW91dGxpbmUpKX0ubWF0LWFjdGlvbi1yb3cgLm1hdC1idXR0b24tYmFzZSwubWF0LWFjdGlvbi1yb3cgLm1hdC1tZGMtYnV0dG9uLWJhc2V7bWFyZ2luLWxlZnQ6OHB4fVtkaXI9cnRsXSAubWF0LWFjdGlvbi1yb3cgLm1hdC1idXR0b24tYmFzZSxbZGlyPXJ0bF0gLm1hdC1hY3Rpb24tcm93IC5tYXQtbWRjLWJ1dHRvbi1iYXNle21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjhweH0KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIHR9KSgpLG5vPSgoKT0+e2NsYXNzIHR7cGFuZWw9aChZbix7aG9zdDohMH0pO19lbGVtZW50PWgoYWUpO19mb2N1c01vbml0b3I9aChYMSk7X2NoYW5nZURldGVjdG9yUmVmPWgoRWUpO19wYXJlbnRDaGFuZ2VTdWJzY3JpcHRpb249bzEuRU1QVFk7Y29uc3RydWN0b3IoKXtoKEMxKS5sb2FkKEUxKTtsZXQgZT10aGlzLnBhbmVsLGk9aChlZyx7b3B0aW9uYWw6ITB9KSxhPWgobmV3IHBpKCJ0YWJpbmRleCIpLHtvcHRpb25hbDohMH0pLHI9ZS5hY2NvcmRpb24/ZS5hY2NvcmRpb24uX3N0YXRlQ2hhbmdlcy5waXBlKCR0KG89PiEhKG8uaGlkZVRvZ2dsZXx8by50b2dnbGVQb3NpdGlvbikpKTpIaTt0aGlzLnRhYkluZGV4PXBhcnNlSW50KGF8fCIiKXx8MCx0aGlzLl9wYXJlbnRDaGFuZ2VTdWJzY3JpcHRpb249S3QoZS5vcGVuZWQsZS5jbG9zZWQscixlLl9pbnB1dENoYW5nZXMucGlwZSgkdChvPT4hIShvLmhpZGVUb2dnbGV8fG8uZGlzYWJsZWR8fG8udG9nZ2xlUG9zaXRpb24pKSkpLnN1YnNjcmliZSgoKT0+dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpLGUuY2xvc2VkLnBpcGUoJHQoKCk9PmUuX2NvbnRhaW5zRm9jdXMoKSkpLnN1YnNjcmliZSgoKT0+dGhpcy5fZm9jdXNNb25pdG9yLmZvY3VzVmlhKHRoaXMuX2VsZW1lbnQsInByb2dyYW0iKSksaSYmKHRoaXMuZXhwYW5kZWRIZWlnaHQ9aS5leHBhbmRlZEhlaWdodCx0aGlzLmNvbGxhcHNlZEhlaWdodD1pLmNvbGxhcHNlZEhlaWdodCl9ZXhwYW5kZWRIZWlnaHQ7Y29sbGFwc2VkSGVpZ2h0O3RhYkluZGV4PTA7Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMucGFuZWwuZGlzYWJsZWR9X3RvZ2dsZSgpe3RoaXMuZGlzYWJsZWR8fHRoaXMucGFuZWwudG9nZ2xlKCl9X2lzRXhwYW5kZWQoKXtyZXR1cm4gdGhpcy5wYW5lbC5leHBhbmRlZH1fZ2V0RXhwYW5kZWRTdGF0ZSgpe3JldHVybiB0aGlzLnBhbmVsLl9nZXRFeHBhbmRlZFN0YXRlKCl9X2dldFBhbmVsSWQoKXtyZXR1cm4gdGhpcy5wYW5lbC5pZH1fZ2V0VG9nZ2xlUG9zaXRpb24oKXtyZXR1cm4gdGhpcy5wYW5lbC50b2dnbGVQb3NpdGlvbn1fc2hvd1RvZ2dsZSgpe3JldHVybiF0aGlzLnBhbmVsLmhpZGVUb2dnbGUmJiF0aGlzLnBhbmVsLmRpc2FibGVkfV9nZXRIZWFkZXJIZWlnaHQoKXtsZXQgZT10aGlzLl9pc0V4cGFuZGVkKCk7cmV0dXJuIGUmJnRoaXMuZXhwYW5kZWRIZWlnaHQ/dGhpcy5leHBhbmRlZEhlaWdodDohZSYmdGhpcy5jb2xsYXBzZWRIZWlnaHQ/dGhpcy5jb2xsYXBzZWRIZWlnaHQ6bnVsbH1fa2V5ZG93bihlKXtzd2l0Y2goZS5rZXlDb2RlKXtjYXNlIDMyOmNhc2UgMTM6czEoZSl8fChlLnByZXZlbnREZWZhdWx0KCksdGhpcy5fdG9nZ2xlKCkpO2JyZWFrO2RlZmF1bHQ6dGhpcy5wYW5lbC5hY2NvcmRpb24mJnRoaXMucGFuZWwuYWNjb3JkaW9uLl9oYW5kbGVIZWFkZXJLZXlkb3duKGUpO3JldHVybn19Zm9jdXMoZSxpKXtlP3RoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9lbGVtZW50LGUsaSk6dGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKGkpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnQpLnN1YnNjcmliZShlPT57ZSYmdGhpcy5wYW5lbC5hY2NvcmRpb24mJnRoaXMucGFuZWwuYWNjb3JkaW9uLl9oYW5kbGVIZWFkZXJGb2N1cyh0aGlzKX0pfW5nT25EZXN0cm95KCl7dGhpcy5fcGFyZW50Q2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnQpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIl1dLGhvc3RBdHRyczpbInJvbGUiLCJidXR0b24iLDEsIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyIiwibWF0LWZvY3VzLWluZGljYXRvciJdLGhvc3RWYXJzOjEzLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMSYmUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIGEuX3RvZ2dsZSgpfSkoImtleWRvd24iLGZ1bmN0aW9uKG8pe3JldHVybiBhLl9rZXlkb3duKG8pfSksaSYyJiYoRygiaWQiLGEucGFuZWwuX2hlYWRlcklkKSgidGFiaW5kZXgiLGEuZGlzYWJsZWQ/LTE6YS50YWJJbmRleCkoImFyaWEtY29udHJvbHMiLGEuX2dldFBhbmVsSWQoKSkoImFyaWEtZXhwYW5kZWQiLGEuX2lzRXhwYW5kZWQoKSkoImFyaWEtZGlzYWJsZWQiLGEucGFuZWwuZGlzYWJsZWQpLF90KCJoZWlnaHQiLGEuX2dldEhlYWRlckhlaWdodCgpKSxpZSgibWF0LWV4cGFuZGVkIixhLl9pc0V4cGFuZGVkKCkpKCJtYXQtZXhwYW5zaW9uLXRvZ2dsZS1pbmRpY2F0b3ItYWZ0ZXIiLGEuX2dldFRvZ2dsZVBvc2l0aW9uKCk9PT0iYWZ0ZXIiKSgibWF0LWV4cGFuc2lvbi10b2dnbGUtaW5kaWNhdG9yLWJlZm9yZSIsYS5fZ2V0VG9nZ2xlUG9zaXRpb24oKT09PSJiZWZvcmUiKSl9LGlucHV0czp7ZXhwYW5kZWRIZWlnaHQ6ImV4cGFuZGVkSGVpZ2h0Iixjb2xsYXBzZWRIZWlnaHQ6ImNvbGxhcHNlZEhlaWdodCIsdGFiSW5kZXg6WzIsInRhYkluZGV4IiwidGFiSW5kZXgiLGU9PmU9PW51bGw/MDpvdChlKV19LG5nQ29udGVudFNlbGVjdG9yczpSSSxkZWNsczo1LHZhcnM6Myxjb25zdHM6W1sxLCJtYXQtY29udGVudCJdLFsxLCJtYXQtZXhwYW5zaW9uLWluZGljYXRvciJdLFsieG1sbnMiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsInZpZXdCb3giLCIwIC05NjAgOTYwIDk2MCIsImFyaWEtaGlkZGVuIiwidHJ1ZSIsImZvY3VzYWJsZSIsImZhbHNlIl0sWyJkIiwiTTQ4MC0zNDUgMjQwLTU4NWw1Ni01NiAxODQgMTg0IDE4NC0xODQgNTYgNTYtMjQwIDI0MFoiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihSZShOSSksR3QoMCwic3BhbiIsMCksbWUoMSksbWUoMiwxKSxtZSgzLDIpLEp0KCksTSg0LEZJLDMsMCwic3BhbiIsMSkpLGkmMiYmKGllKCJtYXQtY29udGVudC1oaWRlLXRvZ2dsZSIsIWEuX3Nob3dUb2dnbGUoKSksbCg0KSx3KGEuX3Nob3dUb2dnbGUoKT80Oi0xKSl9LHN0eWxlczpbYC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcntkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlcjtwYWRkaW5nOjAgMjRweDtib3JkZXItcmFkaXVzOmluaGVyaXQ7aGVpZ2h0OnZhcigtLW1hdC1leHBhbnNpb24taGVhZGVyLWNvbGxhcHNlZC1zdGF0ZS1oZWlnaHQsIDQ4cHgpO2ZvbnQtZmFtaWx5OnZhcigtLW1hdC1leHBhbnNpb24taGVhZGVyLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy10aXRsZS1tZWRpdW0tZm9udCkpO2ZvbnQtc2l6ZTp2YXIoLS1tYXQtZXhwYW5zaW9uLWhlYWRlci10ZXh0LXNpemUsIHZhcigtLW1hdC1zeXMtdGl0bGUtbWVkaXVtLXNpemUpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtZXhwYW5zaW9uLWhlYWRlci10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy10aXRsZS1tZWRpdW0td2VpZ2h0KSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LWV4cGFuc2lvbi1oZWFkZXItdGV4dC1saW5lLWhlaWdodCwgdmFyKC0tbWF0LXN5cy10aXRsZS1tZWRpdW0tbGluZS1oZWlnaHQpKTtsZXR0ZXItc3BhY2luZzp2YXIoLS1tYXQtZXhwYW5zaW9uLWhlYWRlci10ZXh0LXRyYWNraW5nLCB2YXIoLS1tYXQtc3lzLXRpdGxlLW1lZGl1bS10cmFja2luZykpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWFuaW1hdGlvbnMtZW5hYmxlZCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJ7dHJhbnNpdGlvbjpoZWlnaHQgMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6OmJlZm9yZXtib3JkZXItcmFkaXVzOmluaGVyaXR9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLm1hdC1leHBhbmRlZHtoZWlnaHQ6dmFyKC0tbWF0LWV4cGFuc2lvbi1oZWFkZXItZXhwYW5kZWQtc3RhdGUtaGVpZ2h0LCA2NHB4KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXXtjb2xvcjp2YXIoLS1tYXQtZXhwYW5zaW9uLWhlYWRlci1kaXNhYmxlZC1zdGF0ZS10ZXh0LWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSl9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7Y3Vyc29yOnBvaW50ZXJ9Lm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pOmhvdmVye2JhY2tncm91bmQ6dmFyKC0tbWF0LWV4cGFuc2lvbi1oZWFkZXItaG92ZXItc3RhdGUtbGF5ZXItY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIGNhbGModmFyKC0tbWF0LXN5cy1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5KSAqIDEwMCUpLCB0cmFuc3BhcmVudCkpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pOmhvdmVye2JhY2tncm91bmQ6dmFyKC0tbWF0LWV4cGFuc2lvbi1jb250YWluZXItYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlKSl9fS5tYXQtZXhwYW5zaW9uLXBhbmVsIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLmNkay1rZXlib2FyZC1mb2N1c2VkLC5tYXQtZXhwYW5zaW9uLXBhbmVsIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLmNkay1wcm9ncmFtLWZvY3VzZWR7YmFja2dyb3VuZDp2YXIoLS1tYXQtZXhwYW5zaW9uLWhlYWRlci1mb2N1cy1zdGF0ZS1sYXllci1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgY2FsYyh2YXIoLS1tYXQtc3lzLWZvY3VzLXN0YXRlLWxheWVyLW9wYWNpdHkpICogMTAwJSksIHRyYW5zcGFyZW50KSl9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxle3RyYW5zaXRpb246bm9uZX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6Zm9jdXMsLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVye291dGxpbmU6bm9uZX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIubWF0LWV4cGFuZGVkOmZvY3VzLC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5tYXQtZXhwYW5kZWQ6aG92ZXJ7YmFja2dyb3VuZDppbmhlcml0fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5tYXQtZXhwYW5zaW9uLXRvZ2dsZS1pbmRpY2F0b3ItYmVmb3Jle2ZsZXgtZGlyZWN0aW9uOnJvdy1yZXZlcnNlfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5tYXQtZXhwYW5zaW9uLXRvZ2dsZS1pbmRpY2F0b3ItYmVmb3JlIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcnttYXJnaW46MCAxNnB4IDAgMH1bZGlyPXJ0bF0gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLm1hdC1leHBhbnNpb24tdG9nZ2xlLWluZGljYXRvci1iZWZvcmUgLm1hdC1leHBhbnNpb24taW5kaWNhdG9ye21hcmdpbjowIDAgMCAxNnB4fS5tYXQtY29udGVudHtkaXNwbGF5OmZsZXg7ZmxleDoxO2ZsZXgtZGlyZWN0aW9uOnJvdztvdmVyZmxvdzpoaWRkZW59Lm1hdC1jb250ZW50Lm1hdC1jb250ZW50LWhpZGUtdG9nZ2xle21hcmdpbi1yaWdodDo4cHh9W2Rpcj1ydGxdIC5tYXQtY29udGVudC5tYXQtY29udGVudC1oaWRlLXRvZ2dsZXttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDo4cHh9Lm1hdC1leHBhbnNpb24tdG9nZ2xlLWluZGljYXRvci1iZWZvcmUgLm1hdC1jb250ZW50Lm1hdC1jb250ZW50LWhpZGUtdG9nZ2xle21hcmdpbi1sZWZ0OjI0cHg7bWFyZ2luLXJpZ2h0OjB9W2Rpcj1ydGxdIC5tYXQtZXhwYW5zaW9uLXRvZ2dsZS1pbmRpY2F0b3ItYmVmb3JlIC5tYXQtY29udGVudC5tYXQtY29udGVudC1oaWRlLXRvZ2dsZXttYXJnaW4tcmlnaHQ6MjRweDttYXJnaW4tbGVmdDowfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZXtjb2xvcjp2YXIoLS1tYXQtZXhwYW5zaW9uLWhlYWRlci10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUsLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9ue2Rpc3BsYXk6ZmxleDtmbGV4LWdyb3c6MTtmbGV4LWJhc2lzOjA7bWFyZ2luLXJpZ2h0OjE2cHg7YWxpZ24taXRlbXM6Y2VudGVyfVtkaXI9cnRsXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUsW2Rpcj1ydGxdIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbnttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDoxNnB4fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZSwubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb257Y29sb3I6aW5oZXJpdH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb257ZmxleC1ncm93OjI7Y29sb3I6dmFyKC0tbWF0LWV4cGFuc2lvbi1oZWFkZXItZGVzY3JpcHRpb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1hdC1leHBhbnNpb24tcGFuZWwtYW5pbWF0aW9ucy1lbmFibGVkIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcnt0cmFuc2l0aW9uOnRyYW5zZm9ybSAyMjVtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5tYXQtZXhwYW5kZWQgLm1hdC1leHBhbnNpb24taW5kaWNhdG9ye3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKX0ubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3I6OmFmdGVye2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MCAycHggMnB4IDA7Y29udGVudDoiIjtwYWRkaW5nOjNweDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Y29sb3I6dmFyKC0tbWF0LWV4cGFuc2lvbi1oZWFkZXItaW5kaWNhdG9yLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpO2Rpc3BsYXk6dmFyKC0tbWF0LWV4cGFuc2lvbi1sZWdhY3ktaGVhZGVyLWluZGljYXRvci1kaXNwbGF5LCBub25lKX0ubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3Igc3Zne3dpZHRoOjI0cHg7aGVpZ2h0OjI0cHg7bWFyZ2luOjAgLThweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZmlsbDp2YXIoLS1tYXQtZXhwYW5zaW9uLWhlYWRlci1pbmRpY2F0b3ItY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSk7ZGlzcGxheTp2YXIoLS1tYXQtZXhwYW5zaW9uLWhlYWRlci1pbmRpY2F0b3ItZGlzcGxheSwgaW5saW5lLWJsb2NrKX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50e2JvcmRlci10b3A6MXB4IHNvbGlkO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfX0KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIHR9KSgpLFczPSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LXBhbmVsLWRlc2NyaXB0aW9uIl1dLGhvc3RBdHRyczpbMSwibWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24iXX0pfXJldHVybiB0fSkoKSxybz0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1wYW5lbC10aXRsZSJdXSxob3N0QXR0cnM6WzEsIm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlIl19KX1yZXR1cm4gdH0pKCksdGc9KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVtb2Q9eGUoe3R5cGU6dH0pO3N0YXRpYyBcdTAyNzVpbmo9eWUoe2ltcG9ydHM6W3plLCR1LGZhXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIGpJKHQsbil7cmV0dXJuIHRoaXMuX3RyYWNrUm93KG4pfWZ1bmN0aW9uIHFJKHQsbil7aWYodCYxJiYoYygwLCJ0ciIsMCkoMSwidGQiLDMpLG0oMikscygpKCkpLHQmMil7bGV0IGU9digpO2woKSxfdCgicGFkZGluZy10b3AiLGUuX2NlbGxQYWRkaW5nKSgicGFkZGluZy1ib3R0b20iLGUuX2NlbGxQYWRkaW5nKSxHKCJjb2xzcGFuIixlLm51bUNvbHMpLGwoKSxFKCIgIixlLmxhYmVsLCIgIil9fWZ1bmN0aW9uIEdJKHQsbil7aWYodCYxJiYoYygwLCJ0ZCIsMyksbSgxKSxzKCkpLHQmMil7bGV0IGU9digyKTtfdCgicGFkZGluZy10b3AiLGUuX2NlbGxQYWRkaW5nKSgicGFkZGluZy1ib3R0b20iLGUuX2NlbGxQYWRkaW5nKSxHKCJjb2xzcGFuIixlLl9maXJzdFJvd09mZnNldCksbCgpLEUoIiAiLGUuX2ZpcnN0Um93T2Zmc2V0Pj1lLmxhYmVsTWluUmVxdWlyZWRDZWxscz9lLmxhYmVsOiIiLCIgIil9fWZ1bmN0aW9uIFdJKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJ0ZCIsNikoMSwiYnV0dG9uIiw3KSxTKCJjbGljayIsZnVuY3Rpb24oYSl7bGV0IHI9eihlKS4kaW1wbGljaXQsbz12KDIpO3JldHVybiBUKG8uX2NlbGxDbGlja2VkKHIsYSkpfSkoImZvY3VzIixmdW5jdGlvbihhKXtsZXQgcj16KGUpLiRpbXBsaWNpdCxvPXYoMik7cmV0dXJuIFQoby5fZW1pdEFjdGl2ZURhdGVDaGFuZ2UocixhKSl9KSxjKDIsInNwYW4iLDgpLG0oMykscygpLHUoNCwic3BhbiIsOSkscygpKCl9aWYodCYyKXtsZXQgZT1uLiRpbXBsaWNpdCxpPW4uJGluZGV4LGE9digpLiRpbmRleCxyPXYoKTtfdCgid2lkdGgiLHIuX2NlbGxXaWR0aCkoInBhZGRpbmctdG9wIixyLl9jZWxsUGFkZGluZykoInBhZGRpbmctYm90dG9tIixyLl9jZWxsUGFkZGluZyksRygiZGF0YS1tYXQtcm93IixhKSgiZGF0YS1tYXQtY29sIixpKSxsKCksaWUoIm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkIiwhZS5lbmFibGVkKSgibWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlIixyLl9pc0FjdGl2ZUNlbGwoYSxpKSkoIm1hdC1jYWxlbmRhci1ib2R5LXJhbmdlLXN0YXJ0IixyLl9pc1JhbmdlU3RhcnQoZS5jb21wYXJlVmFsdWUpKSgibWF0LWNhbGVuZGFyLWJvZHktcmFuZ2UtZW5kIixyLl9pc1JhbmdlRW5kKGUuY29tcGFyZVZhbHVlKSkoIm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlIixyLl9pc0luUmFuZ2UoZS5jb21wYXJlVmFsdWUpKSgibWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQiLHIuX2lzQ29tcGFyaXNvbkJyaWRnZVN0YXJ0KGUuY29tcGFyZVZhbHVlLGEsaSkpKCJtYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmQiLHIuX2lzQ29tcGFyaXNvbkJyaWRnZUVuZChlLmNvbXBhcmVWYWx1ZSxhLGkpKSgibWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1zdGFydCIsci5faXNDb21wYXJpc29uU3RhcnQoZS5jb21wYXJlVmFsdWUpKSgibWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1lbmQiLHIuX2lzQ29tcGFyaXNvbkVuZChlLmNvbXBhcmVWYWx1ZSkpKCJtYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlIixyLl9pc0luQ29tcGFyaXNvblJhbmdlKGUuY29tcGFyZVZhbHVlKSkoIm1hdC1jYWxlbmRhci1ib2R5LXByZXZpZXctc3RhcnQiLHIuX2lzUHJldmlld1N0YXJ0KGUuY29tcGFyZVZhbHVlKSkoIm1hdC1jYWxlbmRhci1ib2R5LXByZXZpZXctZW5kIixyLl9pc1ByZXZpZXdFbmQoZS5jb21wYXJlVmFsdWUpKSgibWF0LWNhbGVuZGFyLWJvZHktaW4tcHJldmlldyIsci5faXNJblByZXZpZXcoZS5jb21wYXJlVmFsdWUpKSxmKCJuZ0NsYXNzIixlLmNzc0NsYXNzZXMpKCJ0YWJpbmRleCIsci5faXNBY3RpdmVDZWxsKGEsaSk/MDotMSksRygiYXJpYS1sYWJlbCIsZS5hcmlhTGFiZWwpKCJhcmlhLWRpc2FibGVkIiwhZS5lbmFibGVkfHxudWxsKSgiYXJpYS1wcmVzc2VkIixyLl9pc1NlbGVjdGVkKGUuY29tcGFyZVZhbHVlKSkoImFyaWEtY3VycmVudCIsci50b2RheVZhbHVlPT09ZS5jb21wYXJlVmFsdWU/ImRhdGUiOm51bGwpKCJhcmlhLWRlc2NyaWJlZGJ5IixyLl9nZXREZXNjcmliZWRieShlLmNvbXBhcmVWYWx1ZSkpLGwoKSxpZSgibWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQiLHIuX2lzU2VsZWN0ZWQoZS5jb21wYXJlVmFsdWUpKSgibWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwiLHIuX2lzQ29tcGFyaXNvbklkZW50aWNhbChlLmNvbXBhcmVWYWx1ZSkpKCJtYXQtY2FsZW5kYXItYm9keS10b2RheSIsci50b2RheVZhbHVlPT09ZS5jb21wYXJlVmFsdWUpLGwoKSxFKCIgIixlLmRpc3BsYXlWYWx1ZSwiICIpfX1mdW5jdGlvbiBRSSh0LG4pe2lmKHQmMSYmKGMoMCwidHIiLDEpLE0oMSxHSSwyLDYsInRkIiw0KSxxZSgyLFdJLDUsNDgsInRkIiw1LHNnKSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQsaT1uLiRpbmRleCxhPXYoKTtsKCksdyhpPT09MCYmYS5fZmlyc3RSb3dPZmZzZXQ/MTotMSksbCgpLEdlKGUpfX1mdW5jdGlvbiBZSSh0LG4pe2lmKHQmMSYmKGMoMCwidGgiLDIpKDEsInNwYW4iLDYpLG0oMikscygpLGMoMywic3BhbiIsMyksbSg0KSxzKCkoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKDIpLEEoZS5sb25nKSxsKDIpLEEoZS5uYXJyb3cpfX1mdW5jdGlvbiAkSSh0LG4pe31mdW5jdGlvbiBLSSh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwibWF0LW1vbnRoLXZpZXciLDQpLEZpKCJhY3RpdmVEYXRlQ2hhbmdlIixmdW5jdGlvbihhKXt6KGUpO2xldCByPXYoKTtyZXR1cm4gUmkoci5hY3RpdmVEYXRlLGEpfHwoci5hY3RpdmVEYXRlPWEpLFQoYSl9KSxTKCJfdXNlclNlbGVjdGlvbiIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5fZGF0ZVNlbGVjdGVkKGEpKX0pKCJkcmFnU3RhcnRlZCIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5fZHJhZ1N0YXJ0ZWQoYSkpfSkoImRyYWdFbmRlZCIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5fZHJhZ0VuZGVkKGEpKX0pLHMoKX1pZih0JjIpe2xldCBlPXYoKTtOaSgiYWN0aXZlRGF0ZSIsZS5hY3RpdmVEYXRlKSxmKCJzZWxlY3RlZCIsZS5zZWxlY3RlZCkoImRhdGVGaWx0ZXIiLGUuZGF0ZUZpbHRlcikoIm1heERhdGUiLGUubWF4RGF0ZSkoIm1pbkRhdGUiLGUubWluRGF0ZSkoImRhdGVDbGFzcyIsZS5kYXRlQ2xhc3MpKCJjb21wYXJpc29uU3RhcnQiLGUuY29tcGFyaXNvblN0YXJ0KSgiY29tcGFyaXNvbkVuZCIsZS5jb21wYXJpc29uRW5kKSgic3RhcnREYXRlQWNjZXNzaWJsZU5hbWUiLGUuc3RhcnREYXRlQWNjZXNzaWJsZU5hbWUpKCJlbmREYXRlQWNjZXNzaWJsZU5hbWUiLGUuZW5kRGF0ZUFjY2Vzc2libGVOYW1lKSgiYWN0aXZlRHJhZyIsZS5fYWN0aXZlRHJhZyl9fWZ1bmN0aW9uIFhJKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJtYXQteWVhci12aWV3Iiw1KSxGaSgiYWN0aXZlRGF0ZUNoYW5nZSIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFJpKHIuYWN0aXZlRGF0ZSxhKXx8KHIuYWN0aXZlRGF0ZT1hKSxUKGEpfSksUygibW9udGhTZWxlY3RlZCIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5fbW9udGhTZWxlY3RlZEluWWVhclZpZXcoYSkpfSkoInNlbGVjdGVkQ2hhbmdlIixmdW5jdGlvbihhKXt6KGUpO2xldCByPXYoKTtyZXR1cm4gVChyLl9nb1RvRGF0ZUluVmlldyhhLCJtb250aCIpKX0pLHMoKX1pZih0JjIpe2xldCBlPXYoKTtOaSgiYWN0aXZlRGF0ZSIsZS5hY3RpdmVEYXRlKSxmKCJzZWxlY3RlZCIsZS5zZWxlY3RlZCkoImRhdGVGaWx0ZXIiLGUuZGF0ZUZpbHRlcikoIm1heERhdGUiLGUubWF4RGF0ZSkoIm1pbkRhdGUiLGUubWluRGF0ZSkoImRhdGVDbGFzcyIsZS5kYXRlQ2xhc3MpfX1mdW5jdGlvbiBKSSh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwibWF0LW11bHRpLXllYXItdmlldyIsNiksRmkoImFjdGl2ZURhdGVDaGFuZ2UiLGZ1bmN0aW9uKGEpe3ooZSk7bGV0IHI9digpO3JldHVybiBSaShyLmFjdGl2ZURhdGUsYSl8fChyLmFjdGl2ZURhdGU9YSksVChhKX0pLFMoInllYXJTZWxlY3RlZCIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5feWVhclNlbGVjdGVkSW5NdWx0aVllYXJWaWV3KGEpKX0pKCJzZWxlY3RlZENoYW5nZSIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5fZ29Ub0RhdGVJblZpZXcoYSwieWVhciIpKX0pLHMoKX1pZih0JjIpe2xldCBlPXYoKTtOaSgiYWN0aXZlRGF0ZSIsZS5hY3RpdmVEYXRlKSxmKCJzZWxlY3RlZCIsZS5zZWxlY3RlZCkoImRhdGVGaWx0ZXIiLGUuZGF0ZUZpbHRlcikoIm1heERhdGUiLGUubWF4RGF0ZSkoIm1pbkRhdGUiLGUubWluRGF0ZSkoImRhdGVDbGFzcyIsZS5kYXRlQ2xhc3MpfX1mdW5jdGlvbiBlTCh0LG4pe31mdW5jdGlvbiBuTCh0LG4pe3QmMSYmKE10KCksYygwLCJzdmciLDIpLHUoMSwicGF0aCIsMykscygpKX1mdW5jdGlvbiBCOCh0KXtyZXR1cm4gdD8ubm9kZU5hbWU9PT0iVEQifWZ1bmN0aW9uIFU4KHQpe2xldCBuO3JldHVybiBCOCh0KT9uPXQ6QjgodC5wYXJlbnROb2RlKT9uPXQucGFyZW50Tm9kZTpCOCh0LnBhcmVudE5vZGU/LnBhcmVudE5vZGUpJiYobj10LnBhcmVudE5vZGUucGFyZW50Tm9kZSksbj8uZ2V0QXR0cmlidXRlKCJkYXRhLW1hdC1yb3ciKSE9bnVsbD9uOm51bGx9ZnVuY3Rpb24gajgodCxuLGUpe3JldHVybiBlIT09bnVsbCYmbiE9PWUmJnQ8ZSYmdD09PW59ZnVuY3Rpb24gcTgodCxuLGUpe3JldHVybiBuIT09bnVsbCYmbiE9PWUmJnQ+PW4mJnQ9PT1lfWZ1bmN0aW9uIEc4KHQsbixlLGkpe3JldHVybiBpJiZuIT09bnVsbCYmZSE9PW51bGwmJm4hPT1lJiZ0Pj1uJiZ0PD1lfWZ1bmN0aW9uIGFnKHQpe2xldCBuPXQuY2hhbmdlZFRvdWNoZXNbMF07cmV0dXJuIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQobi5jbGllbnRYLG4uY2xpZW50WSl9ZnVuY3Rpb24gc0wodCxuKXtyZXR1cm4gdHx8bmV3IGNMKG4pfWZ1bmN0aW9uIG1nKHQsbixlLGksYSl7bGV0IHI9dC5nZXRZZWFyKG4pLG89dC5nZXRZZWFyKGUpLGQ9aGcodCxpLGEpO3JldHVybiBNYXRoLmZsb29yKChyLWQpL2MyKT09PU1hdGguZmxvb3IoKG8tZCkvYzIpfWZ1bmN0aW9uIE00KHQsbixlLGkpe2xldCBhPXQuZ2V0WWVhcihuKTtyZXR1cm4gZEwoYS1oZyh0LGUsaSksYzIpfWZ1bmN0aW9uIGhnKHQsbixlKXtsZXQgaT0wO3JldHVybiBlP2k9dC5nZXRZZWFyKGUpLWMyKzE6biYmKGk9dC5nZXRZZWFyKG4pKSxpfWZ1bmN0aW9uIGRMKHQsbil7cmV0dXJuKHQlbituKSVufWZ1bmN0aW9uIG1MKHQpe2xldCBuPWgoc3QpO3JldHVybigpPT5MaShuKX1mdW5jdGlvbiBmTCh0LG4pe2xldCBlPU9iamVjdC5rZXlzKHQpO2ZvcihsZXQgaSBvZiBlKXtsZXR7cHJldmlvdXNWYWx1ZTphLGN1cnJlbnRWYWx1ZTpyfT10W2ldO2lmKG4uaXNEYXRlSW5zdGFuY2UoYSkmJm4uaXNEYXRlSW5zdGFuY2Uocikpe2lmKCFuLnNhbWVEYXRlKGEscikpcmV0dXJuITB9ZWxzZSByZXR1cm4hMH1yZXR1cm4hMX12YXIgVUksc2csWkksdEwsaUwsYUwsc28sckwsdzQsb0wsUTMsaWcsY28seDIsUzQsY0wsbGcsZGcsVzgsbEwsbmcsYzIsUTgscmcsb2cscGcsWTgsZmcsaEwsdWcsY2csZ2csb28scEwsdUwsZ0wsJDMsdkwsSzgsdmcsWDg9eCgoKT0+e2soKTtrKCk7WHQoKTtwOCgpO3hpKCk7WjIoKTtnYSgpO1kyKCk7UG4oKTt2YSgpO0VuKCk7bHQoKTthMSgpO0EyKCk7STIoKTtuZSgpO0VtKCk7YzQoKTtmaSgpO1dlKCk7UFMoKTtFNigpO0QyKCk7eTEoKTtVST1bIm1hdC1jYWxlbmRhci1ib2R5IiwiIl07c2c9KHQsbik9Pm4uaWQ7Wkk9WyIqIl07dEw9WyJidXR0b24iXSxpTD1bW1siIiwibWF0RGF0ZXBpY2tlclRvZ2dsZUljb24iLCIiXV1dLGFMPVsiW21hdERhdGVwaWNrZXJUb2dnbGVJY29uXSJdO3NvPSgoKT0+e2NsYXNzIHR7Y2hhbmdlcz1uZXcgd2U7Y2FsZW5kYXJMYWJlbD0iQ2FsZW5kYXIiO29wZW5DYWxlbmRhckxhYmVsPSJPcGVuIGNhbGVuZGFyIjtjbG9zZUNhbGVuZGFyTGFiZWw9IkNsb3NlIGNhbGVuZGFyIjtwcmV2TW9udGhMYWJlbD0iUHJldmlvdXMgbW9udGgiO25leHRNb250aExhYmVsPSJOZXh0IG1vbnRoIjtwcmV2WWVhckxhYmVsPSJQcmV2aW91cyB5ZWFyIjtuZXh0WWVhckxhYmVsPSJOZXh0IHllYXIiO3ByZXZNdWx0aVllYXJMYWJlbD0iUHJldmlvdXMgMjQgeWVhcnMiO25leHRNdWx0aVllYXJMYWJlbD0iTmV4dCAyNCB5ZWFycyI7c3dpdGNoVG9Nb250aFZpZXdMYWJlbD0iQ2hvb3NlIGRhdGUiO3N3aXRjaFRvTXVsdGlZZWFyVmlld0xhYmVsPSJDaG9vc2UgbW9udGggYW5kIHllYXIiO3N0YXJ0RGF0ZUxhYmVsPSJTdGFydCBkYXRlIjtlbmREYXRlTGFiZWw9IkVuZCBkYXRlIjtjb21wYXJpc29uRGF0ZUxhYmVsPSJDb21wYXJpc29uIHJhbmdlIjtmb3JtYXRZZWFyUmFuZ2UoZSxpKXtyZXR1cm5gJHtlfSBcdTIwMTMgJHtpfWB9Zm9ybWF0WWVhclJhbmdlTGFiZWwoZSxpKXtyZXR1cm5gJHtlfSB0byAke2l9YH1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKSxyTD0wLHc0PWNsYXNze3ZhbHVlO2Rpc3BsYXlWYWx1ZTthcmlhTGFiZWw7ZW5hYmxlZDtjc3NDbGFzc2VzO2NvbXBhcmVWYWx1ZTtyYXdWYWx1ZTtpZD1yTCsrO2NvbnN0cnVjdG9yKG4sZSxpLGEscj17fSxvPW4sZCl7dGhpcy52YWx1ZT1uLHRoaXMuZGlzcGxheVZhbHVlPWUsdGhpcy5hcmlhTGFiZWw9aSx0aGlzLmVuYWJsZWQ9YSx0aGlzLmNzc0NsYXNzZXM9cix0aGlzLmNvbXBhcmVWYWx1ZT1vLHRoaXMucmF3VmFsdWU9ZH19LG9MPXtwYXNzaXZlOiExLGNhcHR1cmU6ITB9LFEzPXtwYXNzaXZlOiEwLGNhcHR1cmU6ITB9LGlnPXtwYXNzaXZlOiEwfSxjbz0oKCk9PntjbGFzcyB0e19lbGVtZW50UmVmPWgoYWUpO19uZ1pvbmU9aChyZSk7X3BsYXRmb3JtPWgoYjEpO19pbnRsPWgoc28pO19ldmVudENsZWFudXBzO19za2lwTmV4dEZvY3VzO19mb2N1c0FjdGl2ZUNlbGxBZnRlclZpZXdDaGVja2VkPSExO2xhYmVsO3Jvd3M7dG9kYXlWYWx1ZTtzdGFydFZhbHVlO2VuZFZhbHVlO2xhYmVsTWluUmVxdWlyZWRDZWxscztudW1Db2xzPTc7YWN0aXZlQ2VsbD0wO25nQWZ0ZXJWaWV3Q2hlY2tlZCgpe3RoaXMuX2ZvY3VzQWN0aXZlQ2VsbEFmdGVyVmlld0NoZWNrZWQmJih0aGlzLl9mb2N1c0FjdGl2ZUNlbGwoKSx0aGlzLl9mb2N1c0FjdGl2ZUNlbGxBZnRlclZpZXdDaGVja2VkPSExKX1pc1JhbmdlPSExO2NlbGxBc3BlY3RSYXRpbz0xO2NvbXBhcmlzb25TdGFydDtjb21wYXJpc29uRW5kO3ByZXZpZXdTdGFydD1udWxsO3ByZXZpZXdFbmQ9bnVsbDtzdGFydERhdGVBY2Nlc3NpYmxlTmFtZTtlbmREYXRlQWNjZXNzaWJsZU5hbWU7c2VsZWN0ZWRWYWx1ZUNoYW5nZT1uZXcgTjtwcmV2aWV3Q2hhbmdlPW5ldyBOO2FjdGl2ZURhdGVDaGFuZ2U9bmV3IE47ZHJhZ1N0YXJ0ZWQ9bmV3IE47ZHJhZ0VuZGVkPW5ldyBOO19maXJzdFJvd09mZnNldDtfY2VsbFBhZGRpbmc7X2NlbGxXaWR0aDtfc3RhcnREYXRlTGFiZWxJZDtfZW5kRGF0ZUxhYmVsSWQ7X2NvbXBhcmlzb25TdGFydERhdGVMYWJlbElkO19jb21wYXJpc29uRW5kRGF0ZUxhYmVsSWQ7X2RpZERyYWdTaW5jZU1vdXNlRG93bj0hMTtfaW5qZWN0b3I9aChzdCk7Y29tcGFyaXNvbkRhdGVBY2Nlc3NpYmxlTmFtZT10aGlzLl9pbnRsLmNvbXBhcmlzb25EYXRlTGFiZWw7X3RyYWNrUm93PWU9PmU7Y29uc3RydWN0b3IoKXtsZXQgZT1oKHYxKSxpPWgocXQpO3RoaXMuX3N0YXJ0RGF0ZUxhYmVsSWQ9aS5nZXRJZCgibWF0LWNhbGVuZGFyLWJvZHktc3RhcnQtIiksdGhpcy5fZW5kRGF0ZUxhYmVsSWQ9aS5nZXRJZCgibWF0LWNhbGVuZGFyLWJvZHktZW5kLSIpLHRoaXMuX2NvbXBhcmlzb25TdGFydERhdGVMYWJlbElkPWkuZ2V0SWQoIm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tc3RhcnQtIiksdGhpcy5fY29tcGFyaXNvbkVuZERhdGVMYWJlbElkPWkuZ2V0SWQoIm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tZW5kLSIpLGgoQzEpLmxvYWQoRTEpLHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e2xldCBhPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxyPVtlLmxpc3RlbihhLCJ0b3VjaG1vdmUiLHRoaXMuX3RvdWNobW92ZUhhbmRsZXIsb0wpLGUubGlzdGVuKGEsIm1vdXNlZW50ZXIiLHRoaXMuX2VudGVySGFuZGxlcixRMyksZS5saXN0ZW4oYSwiZm9jdXMiLHRoaXMuX2VudGVySGFuZGxlcixRMyksZS5saXN0ZW4oYSwibW91c2VsZWF2ZSIsdGhpcy5fbGVhdmVIYW5kbGVyLFEzKSxlLmxpc3RlbihhLCJibHVyIix0aGlzLl9sZWF2ZUhhbmRsZXIsUTMpLGUubGlzdGVuKGEsIm1vdXNlZG93biIsdGhpcy5fbW91c2Vkb3duSGFuZGxlcixpZyksZS5saXN0ZW4oYSwidG91Y2hzdGFydCIsdGhpcy5fbW91c2Vkb3duSGFuZGxlcixpZyldO3RoaXMuX3BsYXRmb3JtLmlzQnJvd3NlciYmci5wdXNoKGUubGlzdGVuKCJ3aW5kb3ciLCJtb3VzZXVwIix0aGlzLl9tb3VzZXVwSGFuZGxlciksZS5saXN0ZW4oIndpbmRvdyIsInRvdWNoZW5kIix0aGlzLl90b3VjaGVuZEhhbmRsZXIpKSx0aGlzLl9ldmVudENsZWFudXBzPXJ9KX1fY2VsbENsaWNrZWQoZSxpKXt0aGlzLl9kaWREcmFnU2luY2VNb3VzZURvd258fGUuZW5hYmxlZCYmdGhpcy5zZWxlY3RlZFZhbHVlQ2hhbmdlLmVtaXQoe3ZhbHVlOmUudmFsdWUsZXZlbnQ6aX0pfV9lbWl0QWN0aXZlRGF0ZUNoYW5nZShlLGkpe2UuZW5hYmxlZCYmdGhpcy5hY3RpdmVEYXRlQ2hhbmdlLmVtaXQoe3ZhbHVlOmUudmFsdWUsZXZlbnQ6aX0pfV9pc1NlbGVjdGVkKGUpe3JldHVybiB0aGlzLnN0YXJ0VmFsdWU9PT1lfHx0aGlzLmVuZFZhbHVlPT09ZX1uZ09uQ2hhbmdlcyhlKXtsZXQgaT1lLm51bUNvbHMse3Jvd3M6YSxudW1Db2xzOnJ9PXRoaXM7KGUucm93c3x8aSkmJih0aGlzLl9maXJzdFJvd09mZnNldD1hJiZhLmxlbmd0aCYmYVswXS5sZW5ndGg/ci1hWzBdLmxlbmd0aDowKSwoZS5jZWxsQXNwZWN0UmF0aW98fGl8fCF0aGlzLl9jZWxsUGFkZGluZykmJih0aGlzLl9jZWxsUGFkZGluZz1gJHs1MCp0aGlzLmNlbGxBc3BlY3RSYXRpby9yfSVgKSwoaXx8IXRoaXMuX2NlbGxXaWR0aCkmJih0aGlzLl9jZWxsV2lkdGg9YCR7MTAwL3J9JWApfW5nT25EZXN0cm95KCl7dGhpcy5fZXZlbnRDbGVhbnVwcy5mb3JFYWNoKGU9PmUoKSl9X2lzQWN0aXZlQ2VsbChlLGkpe2xldCBhPWUqdGhpcy5udW1Db2xzK2k7cmV0dXJuIGUmJihhLT10aGlzLl9maXJzdFJvd09mZnNldCksYT09dGhpcy5hY3RpdmVDZWxsfV9mb2N1c0FjdGl2ZUNlbGwoZT0hMCl7bTEoKCk9PntzZXRUaW1lb3V0KCgpPT57bGV0IGk9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIi5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmUiKTtpJiYoZXx8KHRoaXMuX3NraXBOZXh0Rm9jdXM9ITApLGkuZm9jdXMoKSl9KX0se2luamVjdG9yOnRoaXMuX2luamVjdG9yfSl9X3NjaGVkdWxlRm9jdXNBY3RpdmVDZWxsQWZ0ZXJWaWV3Q2hlY2tlZCgpe3RoaXMuX2ZvY3VzQWN0aXZlQ2VsbEFmdGVyVmlld0NoZWNrZWQ9ITB9X2lzUmFuZ2VTdGFydChlKXtyZXR1cm4gajgoZSx0aGlzLnN0YXJ0VmFsdWUsdGhpcy5lbmRWYWx1ZSl9X2lzUmFuZ2VFbmQoZSl7cmV0dXJuIHE4KGUsdGhpcy5zdGFydFZhbHVlLHRoaXMuZW5kVmFsdWUpfV9pc0luUmFuZ2UoZSl7cmV0dXJuIEc4KGUsdGhpcy5zdGFydFZhbHVlLHRoaXMuZW5kVmFsdWUsdGhpcy5pc1JhbmdlKX1faXNDb21wYXJpc29uU3RhcnQoZSl7cmV0dXJuIGo4KGUsdGhpcy5jb21wYXJpc29uU3RhcnQsdGhpcy5jb21wYXJpc29uRW5kKX1faXNDb21wYXJpc29uQnJpZGdlU3RhcnQoZSxpLGEpe2lmKCF0aGlzLl9pc0NvbXBhcmlzb25TdGFydChlKXx8dGhpcy5faXNSYW5nZVN0YXJ0KGUpfHwhdGhpcy5faXNJblJhbmdlKGUpKXJldHVybiExO2xldCByPXRoaXMucm93c1tpXVthLTFdO2lmKCFyKXtsZXQgbz10aGlzLnJvd3NbaS0xXTtyPW8mJm9bby5sZW5ndGgtMV19cmV0dXJuIHImJiF0aGlzLl9pc1JhbmdlRW5kKHIuY29tcGFyZVZhbHVlKX1faXNDb21wYXJpc29uQnJpZGdlRW5kKGUsaSxhKXtpZighdGhpcy5faXNDb21wYXJpc29uRW5kKGUpfHx0aGlzLl9pc1JhbmdlRW5kKGUpfHwhdGhpcy5faXNJblJhbmdlKGUpKXJldHVybiExO2xldCByPXRoaXMucm93c1tpXVthKzFdO2lmKCFyKXtsZXQgbz10aGlzLnJvd3NbaSsxXTtyPW8mJm9bMF19cmV0dXJuIHImJiF0aGlzLl9pc1JhbmdlU3RhcnQoci5jb21wYXJlVmFsdWUpfV9pc0NvbXBhcmlzb25FbmQoZSl7cmV0dXJuIHE4KGUsdGhpcy5jb21wYXJpc29uU3RhcnQsdGhpcy5jb21wYXJpc29uRW5kKX1faXNJbkNvbXBhcmlzb25SYW5nZShlKXtyZXR1cm4gRzgoZSx0aGlzLmNvbXBhcmlzb25TdGFydCx0aGlzLmNvbXBhcmlzb25FbmQsdGhpcy5pc1JhbmdlKX1faXNDb21wYXJpc29uSWRlbnRpY2FsKGUpe3JldHVybiB0aGlzLmNvbXBhcmlzb25TdGFydD09PXRoaXMuY29tcGFyaXNvbkVuZCYmZT09PXRoaXMuY29tcGFyaXNvblN0YXJ0fV9pc1ByZXZpZXdTdGFydChlKXtyZXR1cm4gajgoZSx0aGlzLnByZXZpZXdTdGFydCx0aGlzLnByZXZpZXdFbmQpfV9pc1ByZXZpZXdFbmQoZSl7cmV0dXJuIHE4KGUsdGhpcy5wcmV2aWV3U3RhcnQsdGhpcy5wcmV2aWV3RW5kKX1faXNJblByZXZpZXcoZSl7cmV0dXJuIEc4KGUsdGhpcy5wcmV2aWV3U3RhcnQsdGhpcy5wcmV2aWV3RW5kLHRoaXMuaXNSYW5nZSl9X2dldERlc2NyaWJlZGJ5KGUpe2lmKCF0aGlzLmlzUmFuZ2UpcmV0dXJuIG51bGw7aWYodGhpcy5zdGFydFZhbHVlPT09ZSYmdGhpcy5lbmRWYWx1ZT09PWUpcmV0dXJuYCR7dGhpcy5fc3RhcnREYXRlTGFiZWxJZH0gJHt0aGlzLl9lbmREYXRlTGFiZWxJZH1gO2lmKHRoaXMuc3RhcnRWYWx1ZT09PWUpcmV0dXJuIHRoaXMuX3N0YXJ0RGF0ZUxhYmVsSWQ7aWYodGhpcy5lbmRWYWx1ZT09PWUpcmV0dXJuIHRoaXMuX2VuZERhdGVMYWJlbElkO2lmKHRoaXMuY29tcGFyaXNvblN0YXJ0IT09bnVsbCYmdGhpcy5jb21wYXJpc29uRW5kIT09bnVsbCl7aWYoZT09PXRoaXMuY29tcGFyaXNvblN0YXJ0JiZlPT09dGhpcy5jb21wYXJpc29uRW5kKXJldHVybmAke3RoaXMuX2NvbXBhcmlzb25TdGFydERhdGVMYWJlbElkfSAke3RoaXMuX2NvbXBhcmlzb25FbmREYXRlTGFiZWxJZH1gO2lmKGU9PT10aGlzLmNvbXBhcmlzb25TdGFydClyZXR1cm4gdGhpcy5fY29tcGFyaXNvblN0YXJ0RGF0ZUxhYmVsSWQ7aWYoZT09PXRoaXMuY29tcGFyaXNvbkVuZClyZXR1cm4gdGhpcy5fY29tcGFyaXNvbkVuZERhdGVMYWJlbElkfXJldHVybiBudWxsfV9lbnRlckhhbmRsZXI9ZT0+e2lmKHRoaXMuX3NraXBOZXh0Rm9jdXMmJmUudHlwZT09PSJmb2N1cyIpe3RoaXMuX3NraXBOZXh0Rm9jdXM9ITE7cmV0dXJufWlmKGUudGFyZ2V0JiZ0aGlzLmlzUmFuZ2Upe2xldCBpPXRoaXMuX2dldENlbGxGcm9tRWxlbWVudChlLnRhcmdldCk7aSYmdGhpcy5fbmdab25lLnJ1bigoKT0+dGhpcy5wcmV2aWV3Q2hhbmdlLmVtaXQoe3ZhbHVlOmkuZW5hYmxlZD9pOm51bGwsZXZlbnQ6ZX0pKX19O190b3VjaG1vdmVIYW5kbGVyPWU9PntpZighdGhpcy5pc1JhbmdlKXJldHVybjtsZXQgaT1hZyhlKSxhPWk/dGhpcy5fZ2V0Q2VsbEZyb21FbGVtZW50KGkpOm51bGw7aSE9PWUudGFyZ2V0JiYodGhpcy5fZGlkRHJhZ1NpbmNlTW91c2VEb3duPSEwKSxVOChlLnRhcmdldCkmJmUucHJldmVudERlZmF1bHQoKSx0aGlzLl9uZ1pvbmUucnVuKCgpPT50aGlzLnByZXZpZXdDaGFuZ2UuZW1pdCh7dmFsdWU6YT8uZW5hYmxlZD9hOm51bGwsZXZlbnQ6ZX0pKX07X2xlYXZlSGFuZGxlcj1lPT57dGhpcy5wcmV2aWV3RW5kIT09bnVsbCYmdGhpcy5pc1JhbmdlJiYoZS50eXBlIT09ImJsdXIiJiYodGhpcy5fZGlkRHJhZ1NpbmNlTW91c2VEb3duPSEwKSxlLnRhcmdldCYmdGhpcy5fZ2V0Q2VsbEZyb21FbGVtZW50KGUudGFyZ2V0KSYmIShlLnJlbGF0ZWRUYXJnZXQmJnRoaXMuX2dldENlbGxGcm9tRWxlbWVudChlLnJlbGF0ZWRUYXJnZXQpKSYmdGhpcy5fbmdab25lLnJ1bigoKT0+dGhpcy5wcmV2aWV3Q2hhbmdlLmVtaXQoe3ZhbHVlOm51bGwsZXZlbnQ6ZX0pKSl9O19tb3VzZWRvd25IYW5kbGVyPWU9PntpZighdGhpcy5pc1JhbmdlKXJldHVybjt0aGlzLl9kaWREcmFnU2luY2VNb3VzZURvd249ITE7bGV0IGk9ZS50YXJnZXQmJnRoaXMuX2dldENlbGxGcm9tRWxlbWVudChlLnRhcmdldCk7IWl8fCF0aGlzLl9pc0luUmFuZ2UoaS5jb21wYXJlVmFsdWUpfHx0aGlzLl9uZ1pvbmUucnVuKCgpPT57dGhpcy5kcmFnU3RhcnRlZC5lbWl0KHt2YWx1ZTppLnJhd1ZhbHVlLGV2ZW50OmV9KX0pfTtfbW91c2V1cEhhbmRsZXI9ZT0+e2lmKCF0aGlzLmlzUmFuZ2UpcmV0dXJuO2xldCBpPVU4KGUudGFyZ2V0KTtpZighaSl7dGhpcy5fbmdab25lLnJ1bigoKT0+e3RoaXMuZHJhZ0VuZGVkLmVtaXQoe3ZhbHVlOm51bGwsZXZlbnQ6ZX0pfSk7cmV0dXJufWkuY2xvc2VzdCgiLm1hdC1jYWxlbmRhci1ib2R5Iik9PT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQmJnRoaXMuX25nWm9uZS5ydW4oKCk9PntsZXQgYT10aGlzLl9nZXRDZWxsRnJvbUVsZW1lbnQoaSk7dGhpcy5kcmFnRW5kZWQuZW1pdCh7dmFsdWU6YT8ucmF3VmFsdWU/P251bGwsZXZlbnQ6ZX0pfSl9O190b3VjaGVuZEhhbmRsZXI9ZT0+e2xldCBpPWFnKGUpO2kmJnRoaXMuX21vdXNldXBIYW5kbGVyKHt0YXJnZXQ6aX0pfTtfZ2V0Q2VsbEZyb21FbGVtZW50KGUpe2xldCBpPVU4KGUpO2lmKGkpe2xldCBhPWkuZ2V0QXR0cmlidXRlKCJkYXRhLW1hdC1yb3ciKSxyPWkuZ2V0QXR0cmlidXRlKCJkYXRhLW1hdC1jb2wiKTtpZihhJiZyKXJldHVybiB0aGlzLnJvd3NbcGFyc2VJbnQoYSldPy5bcGFyc2VJbnQocildfHxudWxsfXJldHVybiBudWxsfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsIm1hdC1jYWxlbmRhci1ib2R5IiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LWNhbGVuZGFyLWJvZHkiXSxpbnB1dHM6e2xhYmVsOiJsYWJlbCIscm93czoicm93cyIsdG9kYXlWYWx1ZToidG9kYXlWYWx1ZSIsc3RhcnRWYWx1ZToic3RhcnRWYWx1ZSIsZW5kVmFsdWU6ImVuZFZhbHVlIixsYWJlbE1pblJlcXVpcmVkQ2VsbHM6ImxhYmVsTWluUmVxdWlyZWRDZWxscyIsbnVtQ29sczoibnVtQ29scyIsYWN0aXZlQ2VsbDoiYWN0aXZlQ2VsbCIsaXNSYW5nZToiaXNSYW5nZSIsY2VsbEFzcGVjdFJhdGlvOiJjZWxsQXNwZWN0UmF0aW8iLGNvbXBhcmlzb25TdGFydDoiY29tcGFyaXNvblN0YXJ0Iixjb21wYXJpc29uRW5kOiJjb21wYXJpc29uRW5kIixwcmV2aWV3U3RhcnQ6InByZXZpZXdTdGFydCIscHJldmlld0VuZDoicHJldmlld0VuZCIsc3RhcnREYXRlQWNjZXNzaWJsZU5hbWU6InN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lIixlbmREYXRlQWNjZXNzaWJsZU5hbWU6ImVuZERhdGVBY2Nlc3NpYmxlTmFtZSJ9LG91dHB1dHM6e3NlbGVjdGVkVmFsdWVDaGFuZ2U6InNlbGVjdGVkVmFsdWVDaGFuZ2UiLHByZXZpZXdDaGFuZ2U6InByZXZpZXdDaGFuZ2UiLGFjdGl2ZURhdGVDaGFuZ2U6ImFjdGl2ZURhdGVDaGFuZ2UiLGRyYWdTdGFydGVkOiJkcmFnU3RhcnRlZCIsZHJhZ0VuZGVkOiJkcmFnRW5kZWQifSxleHBvcnRBczpbIm1hdENhbGVuZGFyQm9keSJdLGZlYXR1cmVzOltIZV0sYXR0cnM6VUksZGVjbHM6MTEsdmFyczoxMSxjb25zdHM6W1siYXJpYS1oaWRkZW4iLCJ0cnVlIl0sWyJyb2xlIiwicm93Il0sWzEsIm1hdC1jYWxlbmRhci1ib2R5LWhpZGRlbi1sYWJlbCIsMywiaWQiXSxbMSwibWF0LWNhbGVuZGFyLWJvZHktbGFiZWwiXSxbMSwibWF0LWNhbGVuZGFyLWJvZHktbGFiZWwiLDMsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0sWyJyb2xlIiwiZ3JpZGNlbGwiLDEsIm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGFpbmVyIiwzLCJ3aWR0aCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0sWyJyb2xlIiwiZ3JpZGNlbGwiLDEsIm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGFpbmVyIl0sWyJ0eXBlIiwiYnV0dG9uIiwxLCJtYXQtY2FsZW5kYXItYm9keS1jZWxsIiwzLCJjbGljayIsImZvY3VzIiwibmdDbGFzcyIsInRhYmluZGV4Il0sWzEsIm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudCIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiXSxbImFyaWEtaGlkZGVuIiwidHJ1ZSIsMSwibWF0LWNhbGVuZGFyLWJvZHktY2VsbC1wcmV2aWV3Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoTSgwLHFJLDMsNiwidHIiLDApLHFlKDEsUUksNCwxLCJ0ciIsMSxqSSwhMCksYygzLCJzcGFuIiwyKSxtKDQpLHMoKSxjKDUsInNwYW4iLDIpLG0oNikscygpLGMoNywic3BhbiIsMiksbSg4KSxzKCksYyg5LCJzcGFuIiwyKSxtKDEwKSxzKCkpLGkmMiYmKHcoYS5fZmlyc3RSb3dPZmZzZXQ8YS5sYWJlbE1pblJlcXVpcmVkQ2VsbHM/MDotMSksbCgpLEdlKGEucm93cyksbCgyKSxmKCJpZCIsYS5fc3RhcnREYXRlTGFiZWxJZCksbCgpLEUoIiAiLGEuc3RhcnREYXRlQWNjZXNzaWJsZU5hbWUsYApgKSxsKCksZigiaWQiLGEuX2VuZERhdGVMYWJlbElkKSxsKCksRSgiICIsYS5lbmREYXRlQWNjZXNzaWJsZU5hbWUsYApgKSxsKCksZigiaWQiLGEuX2NvbXBhcmlzb25TdGFydERhdGVMYWJlbElkKSxsKCksTzEoIiAiLGEuY29tcGFyaXNvbkRhdGVBY2Nlc3NpYmxlTmFtZSwiICIsYS5zdGFydERhdGVBY2Nlc3NpYmxlTmFtZSxgCmApLGwoKSxmKCJpZCIsYS5fY29tcGFyaXNvbkVuZERhdGVMYWJlbElkKSxsKCksTzEoIiAiLGEuY29tcGFyaXNvbkRhdGVBY2Nlc3NpYmxlTmFtZSwiICIsYS5lbmREYXRlQWNjZXNzaWJsZU5hbWUsYApgKSl9LGRlcGVuZGVuY2llczpbVDFdLHN0eWxlczpbYC5tYXQtY2FsZW5kYXItYm9keXttaW4td2lkdGg6MjI0cHh9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1kYXRlLXRvZGF5LW91dGxpbmUtY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbHtoZWlnaHQ6MDtsaW5lLWhlaWdodDowO3RleHQtYWxpZ246c3RhcnQ7cGFkZGluZy1sZWZ0OjQuNzE0Mjg1NzE0MyU7cGFkZGluZy1yaWdodDo0LjcxNDI4NTcxNDMlO2ZvbnQtc2l6ZTp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1ib2R5LWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy10aXRsZS1zbWFsbC1zaXplKSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItYm9keS1sYWJlbC10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy10aXRsZS1zbWFsbC13ZWlnaHQpKTtjb2xvcjp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1ib2R5LWxhYmVsLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfS5tYXQtY2FsZW5kYXItYm9keS1oaWRkZW4tbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRhaW5lcntwb3NpdGlvbjpyZWxhdGl2ZTtoZWlnaHQ6MDtsaW5lLWhlaWdodDowfS5tYXQtY2FsZW5kYXItYm9keS1jZWxse3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQ6bm9uZTt0ZXh0LWFsaWduOmNlbnRlcjtvdXRsaW5lOm5vbmU7bWFyZ2luOjA7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItdGV4dC1mb250LCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLWZvbnQpKTtmb250LXNpemU6dmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItdGV4dC1zaXplLCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLXNpemUpKTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsMCl9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6OmJlZm9yZSwubWF0LWNhbGVuZGFyLWJvZHktY2VsbDo6YWZ0ZXIsLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtcHJldmlld3tjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1JTtsZWZ0OjA7ei1pbmRleDowO2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmJsb2NrO2hlaWdodDo5MCU7d2lkdGg6MTAwJX0ubWF0LWNhbGVuZGFyLWJvZHktcmFuZ2Utc3RhcnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlKTo6YmVmb3JlLC5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1zdGFydDo6YWZ0ZXIsLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tc3RhcnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydCk6OmJlZm9yZSwubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1zdGFydDo6YWZ0ZXIsLm1hdC1jYWxlbmRhci1ib2R5LXByZXZpZXctc3RhcnQgLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtcHJldmlld3tsZWZ0OjUlO3dpZHRoOjk1JTtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjk5OXB4O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6OTk5cHh9W2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1zdGFydDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UpOjpiZWZvcmUsW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1zdGFydDo6YWZ0ZXIsW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLXN0YXJ0Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQpOjpiZWZvcmUsW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLXN0YXJ0OjphZnRlcixbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LXByZXZpZXctc3RhcnQgLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtcHJldmlld3tsZWZ0OjA7Ym9yZGVyLXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjk5OXB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjk5OXB4fS5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1lbmQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlKTo6YmVmb3JlLC5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1lbmQ6OmFmdGVyLC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWVuZDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZCk6OmJlZm9yZSwubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1lbmQ6OmFmdGVyLC5tYXQtY2FsZW5kYXItYm9keS1wcmV2aWV3LWVuZCAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1wcmV2aWV3e3dpZHRoOjk1JTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo5OTlweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo5OTlweH1bZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LXJhbmdlLWVuZDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UpOjpiZWZvcmUsW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1lbmQ6OmFmdGVyLFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1lbmQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmQpOjpiZWZvcmUsW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWVuZDo6YWZ0ZXIsW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1wcmV2aWV3LWVuZCAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1wcmV2aWV3e2xlZnQ6NSU7Ym9yZGVyLXJhZGl1czowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6OTk5cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo5OTlweH1bZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0Lm1hdC1jYWxlbmRhci1ib2R5LXJhbmdlLWVuZDo6YWZ0ZXIsW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmQubWF0LWNhbGVuZGFyLWJvZHktcmFuZ2Utc3RhcnQ6OmFmdGVye3dpZHRoOjk1JTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo5OTlweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo5OTlweH0ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1zdGFydC5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1lbmQ6OmFmdGVyLFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1zdGFydC5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1lbmQ6OmFmdGVyLC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWVuZC5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1zdGFydDo6YWZ0ZXIsW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWVuZC5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1zdGFydDo6YWZ0ZXJ7d2lkdGg6OTAlfS5tYXQtY2FsZW5kYXItYm9keS1pbi1wcmV2aWV3e2NvbG9yOnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWRhdGUtcHJldmlldy1zdGF0ZS1vdXRsaW5lLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWF0LWNhbGVuZGFyLWJvZHktaW4tcHJldmlldyAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1wcmV2aWV3e2JvcmRlci10b3A6ZGFzaGVkIDFweDtib3JkZXItYm90dG9tOmRhc2hlZCAxcHh9Lm1hdC1jYWxlbmRhci1ib2R5LXByZXZpZXctc3RhcnQgLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtcHJldmlld3tib3JkZXItbGVmdDpkYXNoZWQgMXB4fVtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktcHJldmlldy1zdGFydCAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1wcmV2aWV3e2JvcmRlci1sZWZ0OjA7Ym9yZGVyLXJpZ2h0OmRhc2hlZCAxcHh9Lm1hdC1jYWxlbmRhci1ib2R5LXByZXZpZXctZW5kIC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLXByZXZpZXd7Ym9yZGVyLXJpZ2h0OmRhc2hlZCAxcHh9W2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1wcmV2aWV3LWVuZCAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1wcmV2aWV3e2JvcmRlci1yaWdodDowO2JvcmRlci1sZWZ0OmRhc2hlZCAxcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2NvbG9yOnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWRhdGUtZGlzYWJsZWQtc3RhdGUtdGV4dC1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWRhdGUtdG9kYXktZGlzYWJsZWQtc3RhdGUtb3V0bGluZS1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZHtvcGFjaXR5Oi41fX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50e3RvcDo1JTtsZWZ0OjUlO3otaW5kZXg6MTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjkwJTtoZWlnaHQ6OTAlO2xpbmUtaGVpZ2h0OjE7Ym9yZGVyLXdpZHRoOjFweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXJhZGl1czo5OTlweDtjb2xvcjp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1kYXRlLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1kYXRlLW91dGxpbmUtY29sb3IsIHRyYW5zcGFyZW50KX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Lm1hdC1mb2N1cy1pbmRpY2F0b3J7cG9zaXRpb246YWJzb2x1dGV9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudHtib3JkZXI6bm9uZX19LmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSwuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1kYXRlLWZvY3VzLXN0YXRlLWJhY2tncm91bmQtY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIGNhbGModmFyKC0tbWF0LXN5cy1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5KSAqIDEwMCUpLCB0cmFuc3BhcmVudCkpfUBtZWRpYShob3ZlcjogaG92ZXIpey5tYXQtY2FsZW5kYXItYm9keS1jZWxsOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQpOmhvdmVyPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1kYXRlLWhvdmVyLXN0YXRlLWJhY2tncm91bmQtY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIGNhbGModmFyKC0tbWF0LXN5cy1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5KSAqIDEwMCUpLCB0cmFuc3BhcmVudCkpfX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1kYXRlLXNlbGVjdGVkLXN0YXRlLWJhY2tncm91bmQtY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpO2NvbG9yOnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWRhdGUtc2VsZWN0ZWQtc3RhdGUtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1wcmltYXJ5KSl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWRhdGUtc2VsZWN0ZWQtZGlzYWJsZWQtc3RhdGUtYmFja2dyb3VuZC1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpfS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZC5tYXQtY2FsZW5kYXItYm9keS10b2RheXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCB2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1kYXRlLXRvZGF5LXNlbGVjdGVkLXN0YXRlLW91dGxpbmUtY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6dmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItZGF0ZS1pbi1yYW5nZS1zdGF0ZS1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnktY29udGFpbmVyKSl9Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlOjpiZWZvcmV7YmFja2dyb3VuZDp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1kYXRlLWluLWNvbXBhcmlzb24tcmFuZ2Utc3RhdGUtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tbWF0LXN5cy10ZXJ0aWFyeS1jb250YWluZXIpKX0ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWRhdGUtaW4tY29tcGFyaXNvbi1yYW5nZS1zdGF0ZS1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXRlcnRpYXJ5LWNvbnRhaW5lcikpfS5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3JlLFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2UtZW5kOjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWRhdGUtaW4tcmFuZ2Utc3RhdGUtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5LWNvbnRhaW5lcikpIDUwJSwgdmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItZGF0ZS1pbi1jb21wYXJpc29uLXJhbmdlLXN0YXRlLWJhY2tncm91bmQtY29sb3IsIHZhcigtLW1hdC1zeXMtdGVydGlhcnktY29udGFpbmVyKSkgNTAlKX0ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2UtZW5kOjpiZWZvcmUsW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQsIHZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWRhdGUtaW4tcmFuZ2Utc3RhdGUtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5LWNvbnRhaW5lcikpIDUwJSwgdmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItZGF0ZS1pbi1jb21wYXJpc29uLXJhbmdlLXN0YXRlLWJhY2tncm91bmQtY29sb3IsIHZhcigtLW1hdC1zeXMtdGVydGlhcnktY29udGFpbmVyKSkgNTAlKX0ubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjphZnRlcntiYWNrZ3JvdW5kOnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWRhdGUtaW4tb3ZlcmxhcC1yYW5nZS1zdGF0ZS1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXNlY29uZGFyeS1jb250YWluZXIpKX0ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQsLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQ6dmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItZGF0ZS1pbi1vdmVybGFwLXJhbmdlLXNlbGVjdGVkLXN0YXRlLWJhY2tncm91bmQtY29sb3IsIHZhcigtLW1hdC1zeXMtc2Vjb25kYXJ5KSl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1hdC1kYXRlcGlja2VyLXBvcHVwOm5vdCg6ZW1wdHkpLC5tYXQtY2FsZW5kYXItYm9keS1jZWxsOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2UpIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXl7b3V0bGluZTpkb3R0ZWQgMXB4fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsOjpiZWZvcmUsLm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6OmFmdGVyLC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOm5vbmV9Lm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjpiZWZvcmUsLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmUsLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JvcmRlci10b3A6c29saWQgMXB4O2JvcmRlci1ib3R0b206c29saWQgMXB4fS5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1zdGFydDo6YmVmb3Jle2JvcmRlci1sZWZ0OnNvbGlkIDFweH1bZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LXJhbmdlLXN0YXJ0OjpiZWZvcmV7Ym9yZGVyLWxlZnQ6MDtib3JkZXItcmlnaHQ6c29saWQgMXB4fS5tYXQtY2FsZW5kYXItYm9keS1yYW5nZS1lbmQ6OmJlZm9yZXtib3JkZXItcmlnaHQ6c29saWQgMXB4fVtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktcmFuZ2UtZW5kOjpiZWZvcmV7Ym9yZGVyLXJpZ2h0OjA7Ym9yZGVyLWxlZnQ6c29saWQgMXB4fS5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlOjpiZWZvcmV7Ym9yZGVyLXRvcDpkYXNoZWQgMXB4O2JvcmRlci1ib3R0b206ZGFzaGVkIDFweH0ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1zdGFydDo6YmVmb3Jle2JvcmRlci1sZWZ0OmRhc2hlZCAxcHh9W2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLXN0YXJ0OjpiZWZvcmV7Ym9yZGVyLWxlZnQ6MDtib3JkZXItcmlnaHQ6ZGFzaGVkIDFweH0ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1lbmQ6OmJlZm9yZXtib3JkZXItcmlnaHQ6ZGFzaGVkIDFweH1bZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tZW5kOjpiZWZvcmV7Ym9yZGVyLXJpZ2h0OjA7Ym9yZGVyLWxlZnQ6ZGFzaGVkIDFweH19CmBdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKTt4Mj1jbGFzc3tzdGFydDtlbmQ7X2Rpc2FibGVTdHJ1Y3R1cmFsRXF1aXZhbGVuY3k7Y29uc3RydWN0b3IobixlKXt0aGlzLnN0YXJ0PW4sdGhpcy5lbmQ9ZX19LFM0PSgoKT0+e2NsYXNzIHR7c2VsZWN0aW9uO19hZGFwdGVyO19zZWxlY3Rpb25DaGFuZ2VkPW5ldyB3ZTtzZWxlY3Rpb25DaGFuZ2VkPXRoaXMuX3NlbGVjdGlvbkNoYW5nZWQ7Y29uc3RydWN0b3IoZSxpKXt0aGlzLnNlbGVjdGlvbj1lLHRoaXMuX2FkYXB0ZXI9aSx0aGlzLnNlbGVjdGlvbj1lfXVwZGF0ZVNlbGVjdGlvbihlLGkpe2xldCBhPXRoaXMuc2VsZWN0aW9uO3RoaXMuc2VsZWN0aW9uPWUsdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZC5uZXh0KHtzZWxlY3Rpb246ZSxzb3VyY2U6aSxvbGRWYWx1ZTphfSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9zZWxlY3Rpb25DaGFuZ2VkLmNvbXBsZXRlKCl9X2lzVmFsaWREYXRlSW5zdGFuY2UoZSl7cmV0dXJuIHRoaXMuX2FkYXB0ZXIuaXNEYXRlSW5zdGFuY2UoZSkmJnRoaXMuX2FkYXB0ZXIuaXNWYWxpZChlKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3UwKCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhY30pfXJldHVybiB0fSkoKSxjTD0oKCk9PntjbGFzcyB0IGV4dGVuZHMgUzR7Y29uc3RydWN0b3IoZSl7c3VwZXIobnVsbCxlKX1hZGQoZSl7c3VwZXIudXBkYXRlU2VsZWN0aW9uKGUsdGhpcyl9aXNWYWxpZCgpe3JldHVybiB0aGlzLnNlbGVjdGlvbiE9bnVsbCYmdGhpcy5faXNWYWxpZERhdGVJbnN0YW5jZSh0aGlzLnNlbGVjdGlvbil9aXNDb21wbGV0ZSgpe3JldHVybiB0aGlzLnNlbGVjdGlvbiE9bnVsbH1jbG9uZSgpe2xldCBlPW5ldyB0KHRoaXMuX2FkYXB0ZXIpO3JldHVybiBlLnVwZGF0ZVNlbGVjdGlvbih0aGlzLnNlbGVjdGlvbix0aGlzKSxlfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KShFaShraSkpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWN9KX1yZXR1cm4gdH0pKCk7bGc9e3Byb3ZpZGU6UzQsZGVwczpbW25ldyBwMCxuZXcgZjAsUzRdLGtpXSx1c2VGYWN0b3J5OnNMfSxkZz1uZXcgY2UoIk1BVF9EQVRFX1JBTkdFX1NFTEVDVElPTl9TVFJBVEVHWSIpLFc4PTcsbEw9MCxuZz0oKCk9PntjbGFzcyB0e19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtfZGF0ZUZvcm1hdHM9aChhbix7b3B0aW9uYWw6ITB9KTtfZGF0ZUFkYXB0ZXI9aChraSx7b3B0aW9uYWw6ITB9KTtfZGlyPWgobjEse29wdGlvbmFsOiEwfSk7X3JhbmdlU3RyYXRlZ3k9aChkZyx7b3B0aW9uYWw6ITB9KTtfcmVyZW5kZXJTdWJzY3JpcHRpb249bzEuRU1QVFk7X3NlbGVjdGlvbktleVByZXNzZWQ7Z2V0IGFjdGl2ZURhdGUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZX1zZXQgYWN0aXZlRGF0ZShlKXtsZXQgaT10aGlzLl9hY3RpdmVEYXRlLGE9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGUpKXx8dGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKTt0aGlzLl9hY3RpdmVEYXRlPXRoaXMuX2RhdGVBZGFwdGVyLmNsYW1wRGF0ZShhLHRoaXMubWluRGF0ZSx0aGlzLm1heERhdGUpLHRoaXMuX2hhc1NhbWVNb250aEFuZFllYXIoaSx0aGlzLl9hY3RpdmVEYXRlKXx8dGhpcy5faW5pdCgpfV9hY3RpdmVEYXRlO2dldCBzZWxlY3RlZCgpe3JldHVybiB0aGlzLl9zZWxlY3RlZH1zZXQgc2VsZWN0ZWQoZSl7ZSBpbnN0YW5jZW9mIHgyP3RoaXMuX3NlbGVjdGVkPWU6dGhpcy5fc2VsZWN0ZWQ9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGUpKSx0aGlzLl9zZXRSYW5nZXModGhpcy5fc2VsZWN0ZWQpfV9zZWxlY3RlZDtnZXQgbWluRGF0ZSgpe3JldHVybiB0aGlzLl9taW5EYXRlfXNldCBtaW5EYXRlKGUpe3RoaXMuX21pbkRhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGUpKX1fbWluRGF0ZTtnZXQgbWF4RGF0ZSgpe3JldHVybiB0aGlzLl9tYXhEYXRlfXNldCBtYXhEYXRlKGUpe3RoaXMuX21heERhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGUpKX1fbWF4RGF0ZTtkYXRlRmlsdGVyO2RhdGVDbGFzcztjb21wYXJpc29uU3RhcnQ7Y29tcGFyaXNvbkVuZDtzdGFydERhdGVBY2Nlc3NpYmxlTmFtZTtlbmREYXRlQWNjZXNzaWJsZU5hbWU7YWN0aXZlRHJhZz1udWxsO3NlbGVjdGVkQ2hhbmdlPW5ldyBOO191c2VyU2VsZWN0aW9uPW5ldyBOO2RyYWdTdGFydGVkPW5ldyBOO2RyYWdFbmRlZD1uZXcgTjthY3RpdmVEYXRlQ2hhbmdlPW5ldyBOO19tYXRDYWxlbmRhckJvZHk7X21vbnRoTGFiZWw9ZnQoIiIpO193ZWVrcz1mdChbXSk7X2ZpcnN0V2Vla09mZnNldD1mdCgwKTtfcmFuZ2VTdGFydD1mdChudWxsKTtfcmFuZ2VFbmQ9ZnQobnVsbCk7X2NvbXBhcmlzb25SYW5nZVN0YXJ0PWZ0KG51bGwpO19jb21wYXJpc29uUmFuZ2VFbmQ9ZnQobnVsbCk7X3ByZXZpZXdTdGFydD1mdChudWxsKTtfcHJldmlld0VuZD1mdChudWxsKTtfaXNSYW5nZT1mdCghMSk7X3RvZGF5RGF0ZT1mdChudWxsKTtfd2Vla2RheXM9ZnQoW10pO2NvbnN0cnVjdG9yKCl7aChDMSkubG9hZChfciksdGhpcy5fYWN0aXZlRGF0ZT10aGlzLl9kYXRlQWRhcHRlci50b2RheSgpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX3JlcmVuZGVyU3Vic2NyaXB0aW9uPXRoaXMuX2RhdGVBZGFwdGVyLmxvY2FsZUNoYW5nZXMucGlwZShpMShudWxsKSkuc3Vic2NyaWJlKCgpPT50aGlzLl9pbml0KCkpfW5nT25DaGFuZ2VzKGUpe2xldCBpPWUuY29tcGFyaXNvblN0YXJ0fHxlLmNvbXBhcmlzb25FbmQ7aSYmIWkuZmlyc3RDaGFuZ2UmJnRoaXMuX3NldFJhbmdlcyh0aGlzLnNlbGVjdGVkKSxlLmFjdGl2ZURyYWcmJiF0aGlzLmFjdGl2ZURyYWcmJnRoaXMuX2NsZWFyUHJldmlldygpfW5nT25EZXN0cm95KCl7dGhpcy5fcmVyZW5kZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKX1fZGF0ZVNlbGVjdGVkKGUpe2xldCBpPWUudmFsdWUsYT10aGlzLl9nZXREYXRlRnJvbURheU9mTW9udGgoaSkscixvO3RoaXMuX3NlbGVjdGVkIGluc3RhbmNlb2YgeDI/KHI9dGhpcy5fZ2V0RGF0ZUluQ3VycmVudE1vbnRoKHRoaXMuX3NlbGVjdGVkLnN0YXJ0KSxvPXRoaXMuX2dldERhdGVJbkN1cnJlbnRNb250aCh0aGlzLl9zZWxlY3RlZC5lbmQpKTpyPW89dGhpcy5fZ2V0RGF0ZUluQ3VycmVudE1vbnRoKHRoaXMuX3NlbGVjdGVkKSwociE9PWl8fG8hPT1pKSYmdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KGEpLHRoaXMuX3VzZXJTZWxlY3Rpb24uZW1pdCh7dmFsdWU6YSxldmVudDplLmV2ZW50fSksdGhpcy5fY2xlYXJQcmV2aWV3KCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X3VwZGF0ZUFjdGl2ZURhdGUoZSl7bGV0IGk9ZS52YWx1ZSxhPXRoaXMuX2FjdGl2ZURhdGU7dGhpcy5hY3RpdmVEYXRlPXRoaXMuX2dldERhdGVGcm9tRGF5T2ZNb250aChpKSx0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShhLHRoaXMuYWN0aXZlRGF0ZSkmJnRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuX2FjdGl2ZURhdGUpfV9oYW5kbGVDYWxlbmRhckJvZHlLZXlkb3duKGUpe2xldCBpPXRoaXMuX2FjdGl2ZURhdGUsYT10aGlzLl9pc1J0bCgpO3N3aXRjaChlLmtleUNvZGUpe2Nhc2UgMzc6dGhpcy5hY3RpdmVEYXRlPXRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyRGF5cyh0aGlzLl9hY3RpdmVEYXRlLGE/MTotMSk7YnJlYWs7Y2FzZSAzOTp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHRoaXMuX2FjdGl2ZURhdGUsYT8tMToxKTticmVhaztjYXNlIDM4OnRoaXMuYWN0aXZlRGF0ZT10aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXModGhpcy5fYWN0aXZlRGF0ZSwtNyk7YnJlYWs7Y2FzZSA0MDp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHRoaXMuX2FjdGl2ZURhdGUsNyk7YnJlYWs7Y2FzZSAzNjp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHRoaXMuX2FjdGl2ZURhdGUsMS10aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpKTticmVhaztjYXNlIDM1OnRoaXMuYWN0aXZlRGF0ZT10aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXModGhpcy5fYWN0aXZlRGF0ZSx0aGlzLl9kYXRlQWRhcHRlci5nZXROdW1EYXlzSW5Nb250aCh0aGlzLl9hY3RpdmVEYXRlKS10aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpKTticmVhaztjYXNlIDMzOnRoaXMuYWN0aXZlRGF0ZT1lLmFsdEtleT90aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX2FjdGl2ZURhdGUsLTEpOnRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsLTEpO2JyZWFrO2Nhc2UgMzQ6dGhpcy5hY3RpdmVEYXRlPWUuYWx0S2V5P3RoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyWWVhcnModGhpcy5fYWN0aXZlRGF0ZSwxKTp0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLDEpO2JyZWFrO2Nhc2UgMTM6Y2FzZSAzMjp0aGlzLl9zZWxlY3Rpb25LZXlQcmVzc2VkPSEwLHRoaXMuX2NhblNlbGVjdCh0aGlzLl9hY3RpdmVEYXRlKSYmZS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybjtjYXNlIDI3OnRoaXMuX3ByZXZpZXdFbmQoKSE9bnVsbCYmIXMxKGUpJiYodGhpcy5fY2xlYXJQcmV2aWV3KCksdGhpcy5hY3RpdmVEcmFnP3RoaXMuZHJhZ0VuZGVkLmVtaXQoe3ZhbHVlOm51bGwsZXZlbnQ6ZX0pOih0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQobnVsbCksdGhpcy5fdXNlclNlbGVjdGlvbi5lbWl0KHt2YWx1ZTpudWxsLGV2ZW50OmV9KSksZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpO3JldHVybjtkZWZhdWx0OnJldHVybn10aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShpLHRoaXMuYWN0aXZlRGF0ZSkmJih0aGlzLmFjdGl2ZURhdGVDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZURhdGUpLHRoaXMuX2ZvY3VzQWN0aXZlQ2VsbEFmdGVyVmlld0NoZWNrZWQoKSksZS5wcmV2ZW50RGVmYXVsdCgpfV9oYW5kbGVDYWxlbmRhckJvZHlLZXl1cChlKXsoZS5rZXlDb2RlPT09MzJ8fGUua2V5Q29kZT09PTEzKSYmKHRoaXMuX3NlbGVjdGlvbktleVByZXNzZWQmJnRoaXMuX2NhblNlbGVjdCh0aGlzLl9hY3RpdmVEYXRlKSYmdGhpcy5fZGF0ZVNlbGVjdGVkKHt2YWx1ZTp0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuX2FjdGl2ZURhdGUpLGV2ZW50OmV9KSx0aGlzLl9zZWxlY3Rpb25LZXlQcmVzc2VkPSExKX1faW5pdCgpe3RoaXMuX3NldFJhbmdlcyh0aGlzLnNlbGVjdGVkKSx0aGlzLl90b2RheURhdGUuc2V0KHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUodGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKSkpLHRoaXMuX21vbnRoTGFiZWwuc2V0KHRoaXMuX2RhdGVGb3JtYXRzLmRpc3BsYXkubW9udGhMYWJlbD90aGlzLl9kYXRlQWRhcHRlci5mb3JtYXQodGhpcy5hY3RpdmVEYXRlLHRoaXMuX2RhdGVGb3JtYXRzLmRpc3BsYXkubW9udGhMYWJlbCk6dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGhOYW1lcygic2hvcnQiKVt0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUpXS50b0xvY2FsZVVwcGVyQ2FzZSgpKTtsZXQgZT10aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5hY3RpdmVEYXRlKSx0aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUpLDEpO3RoaXMuX2ZpcnN0V2Vla09mZnNldC5zZXQoKFc4K3RoaXMuX2RhdGVBZGFwdGVyLmdldERheU9mV2VlayhlKS10aGlzLl9kYXRlQWRhcHRlci5nZXRGaXJzdERheU9mV2VlaygpKSVXOCksdGhpcy5faW5pdFdlZWtkYXlzKCksdGhpcy5fY3JlYXRlV2Vla0NlbGxzKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X2ZvY3VzQWN0aXZlQ2VsbChlKXt0aGlzLl9tYXRDYWxlbmRhckJvZHkuX2ZvY3VzQWN0aXZlQ2VsbChlKX1fZm9jdXNBY3RpdmVDZWxsQWZ0ZXJWaWV3Q2hlY2tlZCgpe3RoaXMuX21hdENhbGVuZGFyQm9keS5fc2NoZWR1bGVGb2N1c0FjdGl2ZUNlbGxBZnRlclZpZXdDaGVja2VkKCl9X3ByZXZpZXdDaGFuZ2VkKHtldmVudDplLHZhbHVlOml9KXtpZih0aGlzLl9yYW5nZVN0cmF0ZWd5KXtsZXQgYT1pP2kucmF3VmFsdWU6bnVsbCxyPXRoaXMuX3JhbmdlU3RyYXRlZ3kuY3JlYXRlUHJldmlldyhhLHRoaXMuc2VsZWN0ZWQsZSk7aWYodGhpcy5fcHJldmlld1N0YXJ0LnNldCh0aGlzLl9nZXRDZWxsQ29tcGFyZVZhbHVlKHIuc3RhcnQpKSx0aGlzLl9wcmV2aWV3RW5kLnNldCh0aGlzLl9nZXRDZWxsQ29tcGFyZVZhbHVlKHIuZW5kKSksdGhpcy5hY3RpdmVEcmFnJiZhKXtsZXQgbz10aGlzLl9yYW5nZVN0cmF0ZWd5LmNyZWF0ZURyYWc/Lih0aGlzLmFjdGl2ZURyYWcudmFsdWUsdGhpcy5zZWxlY3RlZCxhLGUpO28mJih0aGlzLl9wcmV2aWV3U3RhcnQuc2V0KHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUoby5zdGFydCkpLHRoaXMuX3ByZXZpZXdFbmQuc2V0KHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUoby5lbmQpKSl9fX1fZHJhZ0VuZGVkKGUpe2lmKHRoaXMuYWN0aXZlRHJhZylpZihlLnZhbHVlKXtsZXQgaT10aGlzLl9yYW5nZVN0cmF0ZWd5Py5jcmVhdGVEcmFnPy4odGhpcy5hY3RpdmVEcmFnLnZhbHVlLHRoaXMuc2VsZWN0ZWQsZS52YWx1ZSxlLmV2ZW50KTt0aGlzLmRyYWdFbmRlZC5lbWl0KHt2YWx1ZTppPz9udWxsLGV2ZW50OmUuZXZlbnR9KX1lbHNlIHRoaXMuZHJhZ0VuZGVkLmVtaXQoe3ZhbHVlOm51bGwsZXZlbnQ6ZS5ldmVudH0pfV9nZXREYXRlRnJvbURheU9mTW9udGgoZSl7cmV0dXJuIHRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLmFjdGl2ZURhdGUpLHRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMuYWN0aXZlRGF0ZSksZSl9X2luaXRXZWVrZGF5cygpe2xldCBlPXRoaXMuX2RhdGVBZGFwdGVyLmdldEZpcnN0RGF5T2ZXZWVrKCksaT10aGlzLl9kYXRlQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygibmFycm93Iikscj10aGlzLl9kYXRlQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygibG9uZyIpLm1hcCgobyxkKT0+KHtsb25nOm8sbmFycm93OmlbZF0saWQ6bEwrK30pKTt0aGlzLl93ZWVrZGF5cy5zZXQoci5zbGljZShlKS5jb25jYXQoci5zbGljZSgwLGUpKSl9X2NyZWF0ZVdlZWtDZWxscygpe2xldCBlPXRoaXMuX2RhdGVBZGFwdGVyLmdldE51bURheXNJbk1vbnRoKHRoaXMuYWN0aXZlRGF0ZSksaT10aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlTmFtZXMoKSxhPVtbXV07Zm9yKGxldCByPTAsbz10aGlzLl9maXJzdFdlZWtPZmZzZXQoKTtyPGU7cisrLG8rKyl7bz09VzgmJihhLnB1c2goW10pLG89MCk7bGV0IGQ9dGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuYWN0aXZlRGF0ZSksdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5hY3RpdmVEYXRlKSxyKzEpLHA9dGhpcy5fc2hvdWxkRW5hYmxlRGF0ZShkKSxnPXRoaXMuX2RhdGVBZGFwdGVyLmZvcm1hdChkLHRoaXMuX2RhdGVGb3JtYXRzLmRpc3BsYXkuZGF0ZUExMXlMYWJlbCksXz10aGlzLmRhdGVDbGFzcz90aGlzLmRhdGVDbGFzcyhkLCJtb250aCIpOnZvaWQgMDthW2EubGVuZ3RoLTFdLnB1c2gobmV3IHc0KHIrMSxpW3JdLGcscCxfLHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUoZCksZCkpfXRoaXMuX3dlZWtzLnNldChhKX1fc2hvdWxkRW5hYmxlRGF0ZShlKXtyZXR1cm4hIWUmJighdGhpcy5taW5EYXRlfHx0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShlLHRoaXMubWluRGF0ZSk+PTApJiYoIXRoaXMubWF4RGF0ZXx8dGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUoZSx0aGlzLm1heERhdGUpPD0wKSYmKCF0aGlzLmRhdGVGaWx0ZXJ8fHRoaXMuZGF0ZUZpbHRlcihlKSl9X2dldERhdGVJbkN1cnJlbnRNb250aChlKXtyZXR1cm4gZSYmdGhpcy5faGFzU2FtZU1vbnRoQW5kWWVhcihlLHRoaXMuYWN0aXZlRGF0ZSk/dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShlKTpudWxsfV9oYXNTYW1lTW9udGhBbmRZZWFyKGUsaSl7cmV0dXJuISEoZSYmaSYmdGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZSk9PXRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGkpJiZ0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGUpPT10aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGkpKX1fZ2V0Q2VsbENvbXBhcmVWYWx1ZShlKXtpZihlKXtsZXQgaT10aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGUpLGE9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgoZSkscj10aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKGUpO3JldHVybiBuZXcgRGF0ZShpLGEscikuZ2V0VGltZSgpfXJldHVybiBudWxsfV9pc1J0bCgpe3JldHVybiB0aGlzLl9kaXImJnRoaXMuX2Rpci52YWx1ZT09PSJydGwifV9zZXRSYW5nZXMoZSl7ZSBpbnN0YW5jZW9mIHgyPyh0aGlzLl9yYW5nZVN0YXJ0LnNldCh0aGlzLl9nZXRDZWxsQ29tcGFyZVZhbHVlKGUuc3RhcnQpKSx0aGlzLl9yYW5nZUVuZC5zZXQodGhpcy5fZ2V0Q2VsbENvbXBhcmVWYWx1ZShlLmVuZCkpLHRoaXMuX2lzUmFuZ2Uuc2V0KCEwKSk6KHRoaXMuX3JhbmdlU3RhcnQuc2V0KHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUoZSkpLHRoaXMuX3JhbmdlRW5kLnNldCh0aGlzLl9yYW5nZVN0YXJ0KCkpLHRoaXMuX2lzUmFuZ2Uuc2V0KCExKSksdGhpcy5fY29tcGFyaXNvblJhbmdlU3RhcnQuc2V0KHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUodGhpcy5jb21wYXJpc29uU3RhcnQpKSx0aGlzLl9jb21wYXJpc29uUmFuZ2VFbmQuc2V0KHRoaXMuX2dldENlbGxDb21wYXJlVmFsdWUodGhpcy5jb21wYXJpc29uRW5kKSl9X2NhblNlbGVjdChlKXtyZXR1cm4hdGhpcy5kYXRlRmlsdGVyfHx0aGlzLmRhdGVGaWx0ZXIoZSl9X2NsZWFyUHJldmlldygpe3RoaXMuX3ByZXZpZXdTdGFydC5zZXQobnVsbCksdGhpcy5fcHJldmlld0VuZC5zZXQobnVsbCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LW1vbnRoLXZpZXciXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiZ0ZShjbyw1KSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5fbWF0Q2FsZW5kYXJCb2R5PXIuZmlyc3QpfX0saW5wdXRzOnthY3RpdmVEYXRlOiJhY3RpdmVEYXRlIixzZWxlY3RlZDoic2VsZWN0ZWQiLG1pbkRhdGU6Im1pbkRhdGUiLG1heERhdGU6Im1heERhdGUiLGRhdGVGaWx0ZXI6ImRhdGVGaWx0ZXIiLGRhdGVDbGFzczoiZGF0ZUNsYXNzIixjb21wYXJpc29uU3RhcnQ6ImNvbXBhcmlzb25TdGFydCIsY29tcGFyaXNvbkVuZDoiY29tcGFyaXNvbkVuZCIsc3RhcnREYXRlQWNjZXNzaWJsZU5hbWU6InN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lIixlbmREYXRlQWNjZXNzaWJsZU5hbWU6ImVuZERhdGVBY2Nlc3NpYmxlTmFtZSIsYWN0aXZlRHJhZzoiYWN0aXZlRHJhZyJ9LG91dHB1dHM6e3NlbGVjdGVkQ2hhbmdlOiJzZWxlY3RlZENoYW5nZSIsX3VzZXJTZWxlY3Rpb246Il91c2VyU2VsZWN0aW9uIixkcmFnU3RhcnRlZDoiZHJhZ1N0YXJ0ZWQiLGRyYWdFbmRlZDoiZHJhZ0VuZGVkIixhY3RpdmVEYXRlQ2hhbmdlOiJhY3RpdmVEYXRlQ2hhbmdlIn0sZXhwb3J0QXM6WyJtYXRNb250aFZpZXciXSxmZWF0dXJlczpbSGVdLGRlY2xzOjgsdmFyczoxNCxjb25zdHM6W1sicm9sZSIsImdyaWQiLDEsIm1hdC1jYWxlbmRhci10YWJsZSJdLFsxLCJtYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyIl0sWyJzY29wZSIsImNvbCJdLFsiYXJpYS1oaWRkZW4iLCJ0cnVlIl0sWyJjb2xzcGFuIiwiNyIsMSwibWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyIl0sWyJtYXQtY2FsZW5kYXItYm9keSIsIiIsMywic2VsZWN0ZWRWYWx1ZUNoYW5nZSIsImFjdGl2ZURhdGVDaGFuZ2UiLCJwcmV2aWV3Q2hhbmdlIiwiZHJhZ1N0YXJ0ZWQiLCJkcmFnRW5kZWQiLCJrZXl1cCIsImtleWRvd24iLCJsYWJlbCIsInJvd3MiLCJ0b2RheVZhbHVlIiwic3RhcnRWYWx1ZSIsImVuZFZhbHVlIiwiY29tcGFyaXNvblN0YXJ0IiwiY29tcGFyaXNvbkVuZCIsInByZXZpZXdTdGFydCIsInByZXZpZXdFbmQiLCJpc1JhbmdlIiwibGFiZWxNaW5SZXF1aXJlZENlbGxzIiwiYWN0aXZlQ2VsbCIsInN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lIiwiZW5kRGF0ZUFjY2Vzc2libGVOYW1lIl0sWzEsImNkay12aXN1YWxseS1oaWRkZW4iXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsInRhYmxlIiwwKSgxLCJ0aGVhZCIsMSkoMiwidHIiKSxxZSgzLFlJLDUsMiwidGgiLDIsc2cpLHMoKSxjKDUsInRyIiwzKSx1KDYsInRoIiw0KSxzKCkoKSxjKDcsInRib2R5Iiw1KSxTKCJzZWxlY3RlZFZhbHVlQ2hhbmdlIixmdW5jdGlvbihvKXtyZXR1cm4gYS5fZGF0ZVNlbGVjdGVkKG8pfSkoImFjdGl2ZURhdGVDaGFuZ2UiLGZ1bmN0aW9uKG8pe3JldHVybiBhLl91cGRhdGVBY3RpdmVEYXRlKG8pfSkoInByZXZpZXdDaGFuZ2UiLGZ1bmN0aW9uKG8pe3JldHVybiBhLl9wcmV2aWV3Q2hhbmdlZChvKX0pKCJkcmFnU3RhcnRlZCIsZnVuY3Rpb24obyl7cmV0dXJuIGEuZHJhZ1N0YXJ0ZWQuZW1pdChvKX0pKCJkcmFnRW5kZWQiLGZ1bmN0aW9uKG8pe3JldHVybiBhLl9kcmFnRW5kZWQobyl9KSgia2V5dXAiLGZ1bmN0aW9uKG8pe3JldHVybiBhLl9oYW5kbGVDYWxlbmRhckJvZHlLZXl1cChvKX0pKCJrZXlkb3duIixmdW5jdGlvbihvKXtyZXR1cm4gYS5faGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bihvKX0pLHMoKSgpKSxpJjImJihsKDMpLEdlKGEuX3dlZWtkYXlzKCkpLGwoNCksZigibGFiZWwiLGEuX21vbnRoTGFiZWwoKSkoInJvd3MiLGEuX3dlZWtzKCkpKCJ0b2RheVZhbHVlIixhLl90b2RheURhdGUoKSkoInN0YXJ0VmFsdWUiLGEuX3JhbmdlU3RhcnQoKSkoImVuZFZhbHVlIixhLl9yYW5nZUVuZCgpKSgiY29tcGFyaXNvblN0YXJ0IixhLl9jb21wYXJpc29uUmFuZ2VTdGFydCgpKSgiY29tcGFyaXNvbkVuZCIsYS5fY29tcGFyaXNvblJhbmdlRW5kKCkpKCJwcmV2aWV3U3RhcnQiLGEuX3ByZXZpZXdTdGFydCgpKSgicHJldmlld0VuZCIsYS5fcHJldmlld0VuZCgpKSgiaXNSYW5nZSIsYS5faXNSYW5nZSgpKSgibGFiZWxNaW5SZXF1aXJlZENlbGxzIiwzKSgiYWN0aXZlQ2VsbCIsYS5fZGF0ZUFkYXB0ZXIuZ2V0RGF0ZShhLmFjdGl2ZURhdGUpLTEpKCJzdGFydERhdGVBY2Nlc3NpYmxlTmFtZSIsYS5zdGFydERhdGVBY2Nlc3NpYmxlTmFtZSkoImVuZERhdGVBY2Nlc3NpYmxlTmFtZSIsYS5lbmREYXRlQWNjZXNzaWJsZU5hbWUpKX0sZGVwZW5kZW5jaWVzOltjb10sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIHR9KSgpLGMyPTI0LFE4PTQscmc9KCgpPT57Y2xhc3MgdHtfY2hhbmdlRGV0ZWN0b3JSZWY9aChFZSk7X2RhdGVBZGFwdGVyPWgoa2kse29wdGlvbmFsOiEwfSk7X2Rpcj1oKG4xLHtvcHRpb25hbDohMH0pO19yZXJlbmRlclN1YnNjcmlwdGlvbj1vMS5FTVBUWTtfc2VsZWN0aW9uS2V5UHJlc3NlZDtnZXQgYWN0aXZlRGF0ZSgpe3JldHVybiB0aGlzLl9hY3RpdmVEYXRlfXNldCBhY3RpdmVEYXRlKGUpe2xldCBpPXRoaXMuX2FjdGl2ZURhdGUsYT10aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZSkpfHx0aGlzLl9kYXRlQWRhcHRlci50b2RheSgpO3RoaXMuX2FjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuY2xhbXBEYXRlKGEsdGhpcy5taW5EYXRlLHRoaXMubWF4RGF0ZSksbWcodGhpcy5fZGF0ZUFkYXB0ZXIsaSx0aGlzLl9hY3RpdmVEYXRlLHRoaXMubWluRGF0ZSx0aGlzLm1heERhdGUpfHx0aGlzLl9pbml0KCl9X2FjdGl2ZURhdGU7Z2V0IHNlbGVjdGVkKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGVkfXNldCBzZWxlY3RlZChlKXtlIGluc3RhbmNlb2YgeDI/dGhpcy5fc2VsZWN0ZWQ9ZTp0aGlzLl9zZWxlY3RlZD10aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZSkpLHRoaXMuX3NldFNlbGVjdGVkWWVhcihlKX1fc2VsZWN0ZWQ7Z2V0IG1pbkRhdGUoKXtyZXR1cm4gdGhpcy5fbWluRGF0ZX1zZXQgbWluRGF0ZShlKXt0aGlzLl9taW5EYXRlPXRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlKSl9X21pbkRhdGU7Z2V0IG1heERhdGUoKXtyZXR1cm4gdGhpcy5fbWF4RGF0ZX1zZXQgbWF4RGF0ZShlKXt0aGlzLl9tYXhEYXRlPXRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlKSl9X21heERhdGU7ZGF0ZUZpbHRlcjtkYXRlQ2xhc3M7c2VsZWN0ZWRDaGFuZ2U9bmV3IE47eWVhclNlbGVjdGVkPW5ldyBOO2FjdGl2ZURhdGVDaGFuZ2U9bmV3IE47X21hdENhbGVuZGFyQm9keTtfeWVhcnM9ZnQoW10pO190b2RheVllYXI9ZnQoMCk7X3NlbGVjdGVkWWVhcj1mdChudWxsKTtjb25zdHJ1Y3Rvcigpe3RoaXMuX2RhdGVBZGFwdGVyLHRoaXMuX2FjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKX1uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLl9yZXJlbmRlclN1YnNjcmlwdGlvbj10aGlzLl9kYXRlQWRhcHRlci5sb2NhbGVDaGFuZ2VzLnBpcGUoaTEobnVsbCkpLnN1YnNjcmliZSgoKT0+dGhpcy5faW5pdCgpKX1uZ09uRGVzdHJveSgpe3RoaXMuX3JlcmVuZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9X2luaXQoKXt0aGlzLl90b2RheVllYXIuc2V0KHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKSkpO2xldCBpPXRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fYWN0aXZlRGF0ZSktTTQodGhpcy5fZGF0ZUFkYXB0ZXIsdGhpcy5hY3RpdmVEYXRlLHRoaXMubWluRGF0ZSx0aGlzLm1heERhdGUpLGE9W107Zm9yKGxldCByPTAsbz1bXTtyPGMyO3IrKylvLnB1c2goaStyKSxvLmxlbmd0aD09UTgmJihhLnB1c2goby5tYXAoZD0+dGhpcy5fY3JlYXRlQ2VsbEZvclllYXIoZCkpKSxvPVtdKTt0aGlzLl95ZWFycy5zZXQoYSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X3llYXJTZWxlY3RlZChlKXtsZXQgaT1lLnZhbHVlLGE9dGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShpLDAsMSkscj10aGlzLl9nZXREYXRlRnJvbVllYXIoaSk7dGhpcy55ZWFyU2VsZWN0ZWQuZW1pdChhKSx0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQocil9X3VwZGF0ZUFjdGl2ZURhdGUoZSl7bGV0IGk9ZS52YWx1ZSxhPXRoaXMuX2FjdGl2ZURhdGU7dGhpcy5hY3RpdmVEYXRlPXRoaXMuX2dldERhdGVGcm9tWWVhcihpKSx0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShhLHRoaXMuYWN0aXZlRGF0ZSkmJnRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlRGF0ZSl9X2hhbmRsZUNhbGVuZGFyQm9keUtleWRvd24oZSl7bGV0IGk9dGhpcy5fYWN0aXZlRGF0ZSxhPXRoaXMuX2lzUnRsKCk7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSAzNzp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLGE/MTotMSk7YnJlYWs7Y2FzZSAzOTp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLGE/LTE6MSk7YnJlYWs7Y2FzZSAzODp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLC1ROCk7YnJlYWs7Y2FzZSA0MDp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLFE4KTticmVhaztjYXNlIDM2OnRoaXMuYWN0aXZlRGF0ZT10aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX2FjdGl2ZURhdGUsLU00KHRoaXMuX2RhdGVBZGFwdGVyLHRoaXMuYWN0aXZlRGF0ZSx0aGlzLm1pbkRhdGUsdGhpcy5tYXhEYXRlKSk7YnJlYWs7Y2FzZSAzNTp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLGMyLU00KHRoaXMuX2RhdGVBZGFwdGVyLHRoaXMuYWN0aXZlRGF0ZSx0aGlzLm1pbkRhdGUsdGhpcy5tYXhEYXRlKS0xKTticmVhaztjYXNlIDMzOnRoaXMuYWN0aXZlRGF0ZT10aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuX2FjdGl2ZURhdGUsZS5hbHRLZXk/LWMyKjEwOi1jMik7YnJlYWs7Y2FzZSAzNDp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLGUuYWx0S2V5P2MyKjEwOmMyKTticmVhaztjYXNlIDEzOmNhc2UgMzI6dGhpcy5fc2VsZWN0aW9uS2V5UHJlc3NlZD0hMDticmVhaztkZWZhdWx0OnJldHVybn10aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShpLHRoaXMuYWN0aXZlRGF0ZSkmJnRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlRGF0ZSksdGhpcy5fZm9jdXNBY3RpdmVDZWxsQWZ0ZXJWaWV3Q2hlY2tlZCgpLGUucHJldmVudERlZmF1bHQoKX1faGFuZGxlQ2FsZW5kYXJCb2R5S2V5dXAoZSl7KGUua2V5Q29kZT09PTMyfHxlLmtleUNvZGU9PT0xMykmJih0aGlzLl9zZWxlY3Rpb25LZXlQcmVzc2VkJiZ0aGlzLl95ZWFyU2VsZWN0ZWQoe3ZhbHVlOnRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5fYWN0aXZlRGF0ZSksZXZlbnQ6ZX0pLHRoaXMuX3NlbGVjdGlvbktleVByZXNzZWQ9ITEpfV9nZXRBY3RpdmVDZWxsKCl7cmV0dXJuIE00KHRoaXMuX2RhdGVBZGFwdGVyLHRoaXMuYWN0aXZlRGF0ZSx0aGlzLm1pbkRhdGUsdGhpcy5tYXhEYXRlKX1fZm9jdXNBY3RpdmVDZWxsKCl7dGhpcy5fbWF0Q2FsZW5kYXJCb2R5Ll9mb2N1c0FjdGl2ZUNlbGwoKX1fZm9jdXNBY3RpdmVDZWxsQWZ0ZXJWaWV3Q2hlY2tlZCgpe3RoaXMuX21hdENhbGVuZGFyQm9keS5fc2NoZWR1bGVGb2N1c0FjdGl2ZUNlbGxBZnRlclZpZXdDaGVja2VkKCl9X2dldERhdGVGcm9tWWVhcihlKXtsZXQgaT10aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLmFjdGl2ZURhdGUpLGE9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgodGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShlLGksMSkpO3JldHVybiB0aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKGUsaSxNYXRoLm1pbih0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuYWN0aXZlRGF0ZSksYSkpfV9jcmVhdGVDZWxsRm9yWWVhcihlKXtsZXQgaT10aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKGUsMCwxKSxhPXRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXJOYW1lKGkpLHI9dGhpcy5kYXRlQ2xhc3M/dGhpcy5kYXRlQ2xhc3MoaSwibXVsdGkteWVhciIpOnZvaWQgMDtyZXR1cm4gbmV3IHc0KGUsYSxhLHRoaXMuX3Nob3VsZEVuYWJsZVllYXIoZSkscil9X3Nob3VsZEVuYWJsZVllYXIoZSl7aWYoZT09bnVsbHx8dGhpcy5tYXhEYXRlJiZlPnRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5tYXhEYXRlKXx8dGhpcy5taW5EYXRlJiZlPHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5taW5EYXRlKSlyZXR1cm4hMTtpZighdGhpcy5kYXRlRmlsdGVyKXJldHVybiEwO2xldCBpPXRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoZSwwLDEpO2ZvcihsZXQgYT1pO3RoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoYSk9PWU7YT10aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhckRheXMoYSwxKSlpZih0aGlzLmRhdGVGaWx0ZXIoYSkpcmV0dXJuITA7cmV0dXJuITF9X2lzUnRsKCl7cmV0dXJuIHRoaXMuX2RpciYmdGhpcy5fZGlyLnZhbHVlPT09InJ0bCJ9X3NldFNlbGVjdGVkWWVhcihlKXtpZih0aGlzLl9zZWxlY3RlZFllYXIuc2V0KG51bGwpLGUgaW5zdGFuY2VvZiB4Mil7bGV0IGk9ZS5zdGFydHx8ZS5lbmQ7aSYmdGhpcy5fc2VsZWN0ZWRZZWFyLnNldCh0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGkpKX1lbHNlIGUmJnRoaXMuX3NlbGVjdGVkWWVhci5zZXQodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihlKSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LW11bHRpLXllYXItdmlldyJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJnRlKGNvLDUpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLl9tYXRDYWxlbmRhckJvZHk9ci5maXJzdCl9fSxpbnB1dHM6e2FjdGl2ZURhdGU6ImFjdGl2ZURhdGUiLHNlbGVjdGVkOiJzZWxlY3RlZCIsbWluRGF0ZToibWluRGF0ZSIsbWF4RGF0ZToibWF4RGF0ZSIsZGF0ZUZpbHRlcjoiZGF0ZUZpbHRlciIsZGF0ZUNsYXNzOiJkYXRlQ2xhc3MifSxvdXRwdXRzOntzZWxlY3RlZENoYW5nZToic2VsZWN0ZWRDaGFuZ2UiLHllYXJTZWxlY3RlZDoieWVhclNlbGVjdGVkIixhY3RpdmVEYXRlQ2hhbmdlOiJhY3RpdmVEYXRlQ2hhbmdlIn0sZXhwb3J0QXM6WyJtYXRNdWx0aVllYXJWaWV3Il0sZGVjbHM6NSx2YXJzOjcsY29uc3RzOltbInJvbGUiLCJncmlkIiwxLCJtYXQtY2FsZW5kYXItdGFibGUiXSxbImFyaWEtaGlkZGVuIiwidHJ1ZSIsMSwibWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciJdLFsiY29sc3BhbiIsIjQiLDEsIm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlciJdLFsibWF0LWNhbGVuZGFyLWJvZHkiLCIiLDMsInNlbGVjdGVkVmFsdWVDaGFuZ2UiLCJhY3RpdmVEYXRlQ2hhbmdlIiwia2V5dXAiLCJrZXlkb3duIiwicm93cyIsInRvZGF5VmFsdWUiLCJzdGFydFZhbHVlIiwiZW5kVmFsdWUiLCJudW1Db2xzIiwiY2VsbEFzcGVjdFJhdGlvIiwiYWN0aXZlQ2VsbCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwidGFibGUiLDApKDEsInRoZWFkIiwxKSgyLCJ0ciIpLHUoMywidGgiLDIpLHMoKSgpLGMoNCwidGJvZHkiLDMpLFMoInNlbGVjdGVkVmFsdWVDaGFuZ2UiLGZ1bmN0aW9uKG8pe3JldHVybiBhLl95ZWFyU2VsZWN0ZWQobyl9KSgiYWN0aXZlRGF0ZUNoYW5nZSIsZnVuY3Rpb24obyl7cmV0dXJuIGEuX3VwZGF0ZUFjdGl2ZURhdGUobyl9KSgia2V5dXAiLGZ1bmN0aW9uKG8pe3JldHVybiBhLl9oYW5kbGVDYWxlbmRhckJvZHlLZXl1cChvKX0pKCJrZXlkb3duIixmdW5jdGlvbihvKXtyZXR1cm4gYS5faGFuZGxlQ2FsZW5kYXJCb2R5S2V5ZG93bihvKX0pLHMoKSgpKSxpJjImJihsKDQpLGYoInJvd3MiLGEuX3llYXJzKCkpKCJ0b2RheVZhbHVlIixhLl90b2RheVllYXIoKSkoInN0YXJ0VmFsdWUiLGEuX3NlbGVjdGVkWWVhcigpKSgiZW5kVmFsdWUiLGEuX3NlbGVjdGVkWWVhcigpKSgibnVtQ29scyIsNCkoImNlbGxBc3BlY3RSYXRpbyIsNC83KSgiYWN0aXZlQ2VsbCIsYS5fZ2V0QWN0aXZlQ2VsbCgpKSl9LGRlcGVuZGVuY2llczpbY29dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKTtvZz0oKCk9PntjbGFzcyB0e19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtfZGF0ZUZvcm1hdHM9aChhbix7b3B0aW9uYWw6ITB9KTtfZGF0ZUFkYXB0ZXI9aChraSx7b3B0aW9uYWw6ITB9KTtfZGlyPWgobjEse29wdGlvbmFsOiEwfSk7X3JlcmVuZGVyU3Vic2NyaXB0aW9uPW8xLkVNUFRZO19zZWxlY3Rpb25LZXlQcmVzc2VkO2dldCBhY3RpdmVEYXRlKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZURhdGV9c2V0IGFjdGl2ZURhdGUoZSl7bGV0IGk9dGhpcy5fYWN0aXZlRGF0ZSxhPXRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlKSl8fHRoaXMuX2RhdGVBZGFwdGVyLnRvZGF5KCk7dGhpcy5fYWN0aXZlRGF0ZT10aGlzLl9kYXRlQWRhcHRlci5jbGFtcERhdGUoYSx0aGlzLm1pbkRhdGUsdGhpcy5tYXhEYXRlKSx0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKGkpIT09dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLl9hY3RpdmVEYXRlKSYmdGhpcy5faW5pdCgpfV9hY3RpdmVEYXRlO2dldCBzZWxlY3RlZCgpe3JldHVybiB0aGlzLl9zZWxlY3RlZH1zZXQgc2VsZWN0ZWQoZSl7ZSBpbnN0YW5jZW9mIHgyP3RoaXMuX3NlbGVjdGVkPWU6dGhpcy5fc2VsZWN0ZWQ9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGUpKSx0aGlzLl9zZXRTZWxlY3RlZE1vbnRoKGUpfV9zZWxlY3RlZDtnZXQgbWluRGF0ZSgpe3JldHVybiB0aGlzLl9taW5EYXRlfXNldCBtaW5EYXRlKGUpe3RoaXMuX21pbkRhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGUpKX1fbWluRGF0ZTtnZXQgbWF4RGF0ZSgpe3JldHVybiB0aGlzLl9tYXhEYXRlfXNldCBtYXhEYXRlKGUpe3RoaXMuX21heERhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGUpKX1fbWF4RGF0ZTtkYXRlRmlsdGVyO2RhdGVDbGFzcztzZWxlY3RlZENoYW5nZT1uZXcgTjttb250aFNlbGVjdGVkPW5ldyBOO2FjdGl2ZURhdGVDaGFuZ2U9bmV3IE47X21hdENhbGVuZGFyQm9keTtfbW9udGhzPWZ0KFtdKTtfeWVhckxhYmVsPWZ0KCIiKTtfdG9kYXlNb250aD1mdChudWxsKTtfc2VsZWN0ZWRNb250aD1mdChudWxsKTtjb25zdHJ1Y3Rvcigpe3RoaXMuX2FjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKX1uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLl9yZXJlbmRlclN1YnNjcmlwdGlvbj10aGlzLl9kYXRlQWRhcHRlci5sb2NhbGVDaGFuZ2VzLnBpcGUoaTEobnVsbCkpLnN1YnNjcmliZSgoKT0+dGhpcy5faW5pdCgpKX1uZ09uRGVzdHJveSgpe3RoaXMuX3JlcmVuZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9X21vbnRoU2VsZWN0ZWQoZSl7bGV0IGk9ZS52YWx1ZSxhPXRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLmFjdGl2ZURhdGUpLGksMSk7dGhpcy5tb250aFNlbGVjdGVkLmVtaXQoYSk7bGV0IHI9dGhpcy5fZ2V0RGF0ZUZyb21Nb250aChpKTt0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQocil9X3VwZGF0ZUFjdGl2ZURhdGUoZSl7bGV0IGk9ZS52YWx1ZSxhPXRoaXMuX2FjdGl2ZURhdGU7dGhpcy5hY3RpdmVEYXRlPXRoaXMuX2dldERhdGVGcm9tTW9udGgoaSksdGhpcy5fZGF0ZUFkYXB0ZXIuY29tcGFyZURhdGUoYSx0aGlzLmFjdGl2ZURhdGUpJiZ0aGlzLmFjdGl2ZURhdGVDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZURhdGUpfV9oYW5kbGVDYWxlbmRhckJvZHlLZXlkb3duKGUpe2xldCBpPXRoaXMuX2FjdGl2ZURhdGUsYT10aGlzLl9pc1J0bCgpO3N3aXRjaChlLmtleUNvZGUpe2Nhc2UgMzc6dGhpcy5hY3RpdmVEYXRlPXRoaXMuX2RhdGVBZGFwdGVyLmFkZENhbGVuZGFyTW9udGhzKHRoaXMuX2FjdGl2ZURhdGUsYT8xOi0xKTticmVhaztjYXNlIDM5OnRoaXMuYWN0aXZlRGF0ZT10aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLGE/LTE6MSk7YnJlYWs7Y2FzZSAzODp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwtNCk7YnJlYWs7Y2FzZSA0MDp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSw0KTticmVhaztjYXNlIDM2OnRoaXMuYWN0aXZlRGF0ZT10aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLl9hY3RpdmVEYXRlLC10aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9hY3RpdmVEYXRlKSk7YnJlYWs7Y2FzZSAzNTp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5fYWN0aXZlRGF0ZSwxMS10aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aCh0aGlzLl9hY3RpdmVEYXRlKSk7YnJlYWs7Y2FzZSAzMzp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLGUuYWx0S2V5Py0xMDotMSk7YnJlYWs7Y2FzZSAzNDp0aGlzLmFjdGl2ZURhdGU9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLl9hY3RpdmVEYXRlLGUuYWx0S2V5PzEwOjEpO2JyZWFrO2Nhc2UgMTM6Y2FzZSAzMjp0aGlzLl9zZWxlY3Rpb25LZXlQcmVzc2VkPSEwO2JyZWFrO2RlZmF1bHQ6cmV0dXJufXRoaXMuX2RhdGVBZGFwdGVyLmNvbXBhcmVEYXRlKGksdGhpcy5hY3RpdmVEYXRlKSYmKHRoaXMuYWN0aXZlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlRGF0ZSksdGhpcy5fZm9jdXNBY3RpdmVDZWxsQWZ0ZXJWaWV3Q2hlY2tlZCgpKSxlLnByZXZlbnREZWZhdWx0KCl9X2hhbmRsZUNhbGVuZGFyQm9keUtleXVwKGUpeyhlLmtleUNvZGU9PT0zMnx8ZS5rZXlDb2RlPT09MTMpJiYodGhpcy5fc2VsZWN0aW9uS2V5UHJlc3NlZCYmdGhpcy5fbW9udGhTZWxlY3RlZCh7dmFsdWU6dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5fYWN0aXZlRGF0ZSksZXZlbnQ6ZX0pLHRoaXMuX3NlbGVjdGlvbktleVByZXNzZWQ9ITEpfV9pbml0KCl7dGhpcy5fc2V0U2VsZWN0ZWRNb250aCh0aGlzLnNlbGVjdGVkKSx0aGlzLl90b2RheU1vbnRoLnNldCh0aGlzLl9nZXRNb250aEluQ3VycmVudFllYXIodGhpcy5fZGF0ZUFkYXB0ZXIudG9kYXkoKSkpLHRoaXMuX3llYXJMYWJlbC5zZXQodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhck5hbWUodGhpcy5hY3RpdmVEYXRlKSk7bGV0IGU9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGhOYW1lcygic2hvcnQiKTt0aGlzLl9tb250aHMuc2V0KFtbMCwxLDIsM10sWzQsNSw2LDddLFs4LDksMTAsMTFdXS5tYXAoaT0+aS5tYXAoYT0+dGhpcy5fY3JlYXRlQ2VsbEZvck1vbnRoKGEsZVthXSkpKSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X2ZvY3VzQWN0aXZlQ2VsbCgpe3RoaXMuX21hdENhbGVuZGFyQm9keS5fZm9jdXNBY3RpdmVDZWxsKCl9X2ZvY3VzQWN0aXZlQ2VsbEFmdGVyVmlld0NoZWNrZWQoKXt0aGlzLl9tYXRDYWxlbmRhckJvZHkuX3NjaGVkdWxlRm9jdXNBY3RpdmVDZWxsQWZ0ZXJWaWV3Q2hlY2tlZCgpfV9nZXRNb250aEluQ3VycmVudFllYXIoZSl7cmV0dXJuIGUmJnRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZSk9PXRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5hY3RpdmVEYXRlKT90aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChlKTpudWxsfV9nZXREYXRlRnJvbU1vbnRoKGUpe2xldCBpPXRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUodGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLmFjdGl2ZURhdGUpLGUsMSksYT10aGlzLl9kYXRlQWRhcHRlci5nZXROdW1EYXlzSW5Nb250aChpKTtyZXR1cm4gdGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh0aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuYWN0aXZlRGF0ZSksZSxNYXRoLm1pbih0aGlzLl9kYXRlQWRhcHRlci5nZXREYXRlKHRoaXMuYWN0aXZlRGF0ZSksYSkpfV9jcmVhdGVDZWxsRm9yTW9udGgoZSxpKXtsZXQgYT10aGlzLl9kYXRlQWRhcHRlci5jcmVhdGVEYXRlKHRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5hY3RpdmVEYXRlKSxlLDEpLHI9dGhpcy5fZGF0ZUFkYXB0ZXIuZm9ybWF0KGEsdGhpcy5fZGF0ZUZvcm1hdHMuZGlzcGxheS5tb250aFllYXJBMTF5TGFiZWwpLG89dGhpcy5kYXRlQ2xhc3M/dGhpcy5kYXRlQ2xhc3MoYSwieWVhciIpOnZvaWQgMDtyZXR1cm4gbmV3IHc0KGUsaS50b0xvY2FsZVVwcGVyQ2FzZSgpLHIsdGhpcy5fc2hvdWxkRW5hYmxlTW9udGgoZSksbyl9X3Nob3VsZEVuYWJsZU1vbnRoKGUpe2xldCBpPXRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5hY3RpdmVEYXRlKTtpZihlPT1udWxsfHx0aGlzLl9pc1llYXJBbmRNb250aEFmdGVyTWF4RGF0ZShpLGUpfHx0aGlzLl9pc1llYXJBbmRNb250aEJlZm9yZU1pbkRhdGUoaSxlKSlyZXR1cm4hMTtpZighdGhpcy5kYXRlRmlsdGVyKXJldHVybiEwO2xldCBhPXRoaXMuX2RhdGVBZGFwdGVyLmNyZWF0ZURhdGUoaSxlLDEpO2ZvcihsZXQgcj1hO3RoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHIpPT1lO3I9dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJEYXlzKHIsMSkpaWYodGhpcy5kYXRlRmlsdGVyKHIpKXJldHVybiEwO3JldHVybiExfV9pc1llYXJBbmRNb250aEFmdGVyTWF4RGF0ZShlLGkpe2lmKHRoaXMubWF4RGF0ZSl7bGV0IGE9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcih0aGlzLm1heERhdGUpLHI9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0TW9udGgodGhpcy5tYXhEYXRlKTtyZXR1cm4gZT5hfHxlPT09YSYmaT5yfXJldHVybiExfV9pc1llYXJBbmRNb250aEJlZm9yZU1pbkRhdGUoZSxpKXtpZih0aGlzLm1pbkRhdGUpe2xldCBhPXRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIodGhpcy5taW5EYXRlKSxyPXRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKHRoaXMubWluRGF0ZSk7cmV0dXJuIGU8YXx8ZT09PWEmJmk8cn1yZXR1cm4hMX1faXNSdGwoKXtyZXR1cm4gdGhpcy5fZGlyJiZ0aGlzLl9kaXIudmFsdWU9PT0icnRsIn1fc2V0U2VsZWN0ZWRNb250aChlKXtlIGluc3RhbmNlb2YgeDI/dGhpcy5fc2VsZWN0ZWRNb250aC5zZXQodGhpcy5fZ2V0TW9udGhJbkN1cnJlbnRZZWFyKGUuc3RhcnQpfHx0aGlzLl9nZXRNb250aEluQ3VycmVudFllYXIoZS5lbmQpKTp0aGlzLl9zZWxlY3RlZE1vbnRoLnNldCh0aGlzLl9nZXRNb250aEluQ3VycmVudFllYXIoZSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC15ZWFyLXZpZXciXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiZ0ZShjbyw1KSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5fbWF0Q2FsZW5kYXJCb2R5PXIuZmlyc3QpfX0saW5wdXRzOnthY3RpdmVEYXRlOiJhY3RpdmVEYXRlIixzZWxlY3RlZDoic2VsZWN0ZWQiLG1pbkRhdGU6Im1pbkRhdGUiLG1heERhdGU6Im1heERhdGUiLGRhdGVGaWx0ZXI6ImRhdGVGaWx0ZXIiLGRhdGVDbGFzczoiZGF0ZUNsYXNzIn0sb3V0cHV0czp7c2VsZWN0ZWRDaGFuZ2U6InNlbGVjdGVkQ2hhbmdlIixtb250aFNlbGVjdGVkOiJtb250aFNlbGVjdGVkIixhY3RpdmVEYXRlQ2hhbmdlOiJhY3RpdmVEYXRlQ2hhbmdlIn0sZXhwb3J0QXM6WyJtYXRZZWFyVmlldyJdLGRlY2xzOjUsdmFyczo5LGNvbnN0czpbWyJyb2xlIiwiZ3JpZCIsMSwibWF0LWNhbGVuZGFyLXRhYmxlIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLDEsIm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXIiXSxbImNvbHNwYW4iLCI0IiwxLCJtYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXIiXSxbIm1hdC1jYWxlbmRhci1ib2R5IiwiIiwzLCJzZWxlY3RlZFZhbHVlQ2hhbmdlIiwiYWN0aXZlRGF0ZUNoYW5nZSIsImtleXVwIiwia2V5ZG93biIsImxhYmVsIiwicm93cyIsInRvZGF5VmFsdWUiLCJzdGFydFZhbHVlIiwiZW5kVmFsdWUiLCJsYWJlbE1pblJlcXVpcmVkQ2VsbHMiLCJudW1Db2xzIiwiY2VsbEFzcGVjdFJhdGlvIiwiYWN0aXZlQ2VsbCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwidGFibGUiLDApKDEsInRoZWFkIiwxKSgyLCJ0ciIpLHUoMywidGgiLDIpLHMoKSgpLGMoNCwidGJvZHkiLDMpLFMoInNlbGVjdGVkVmFsdWVDaGFuZ2UiLGZ1bmN0aW9uKG8pe3JldHVybiBhLl9tb250aFNlbGVjdGVkKG8pfSkoImFjdGl2ZURhdGVDaGFuZ2UiLGZ1bmN0aW9uKG8pe3JldHVybiBhLl91cGRhdGVBY3RpdmVEYXRlKG8pfSkoImtleXVwIixmdW5jdGlvbihvKXtyZXR1cm4gYS5faGFuZGxlQ2FsZW5kYXJCb2R5S2V5dXAobyl9KSgia2V5ZG93biIsZnVuY3Rpb24obyl7cmV0dXJuIGEuX2hhbmRsZUNhbGVuZGFyQm9keUtleWRvd24obyl9KSxzKCkoKSksaSYyJiYobCg0KSxmKCJsYWJlbCIsYS5feWVhckxhYmVsKCkpKCJyb3dzIixhLl9tb250aHMoKSkoInRvZGF5VmFsdWUiLGEuX3RvZGF5TW9udGgoKSkoInN0YXJ0VmFsdWUiLGEuX3NlbGVjdGVkTW9udGgoKSkoImVuZFZhbHVlIixhLl9zZWxlY3RlZE1vbnRoKCkpKCJsYWJlbE1pblJlcXVpcmVkQ2VsbHMiLDIpKCJudW1Db2xzIiw0KSgiY2VsbEFzcGVjdFJhdGlvIiw0LzcpKCJhY3RpdmVDZWxsIixhLl9kYXRlQWRhcHRlci5nZXRNb250aChhLmFjdGl2ZURhdGUpKSl9LGRlcGVuZGVuY2llczpbY29dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxwZz0oKCk9PntjbGFzcyB0e19pbnRsPWgoc28pO2NhbGVuZGFyPWgoWTgpO19kYXRlQWRhcHRlcj1oKGtpLHtvcHRpb25hbDohMH0pO19kYXRlRm9ybWF0cz1oKGFuLHtvcHRpb25hbDohMH0pO19wZXJpb2RCdXR0b25UZXh0O19wZXJpb2RCdXR0b25EZXNjcmlwdGlvbjtfcGVyaW9kQnV0dG9uTGFiZWw7X3ByZXZCdXR0b25MYWJlbDtfbmV4dEJ1dHRvbkxhYmVsO2NvbnN0cnVjdG9yKCl7aChDMSkubG9hZChfcik7bGV0IGU9aChFZSk7dGhpcy5fdXBkYXRlTGFiZWxzKCksdGhpcy5jYWxlbmRhci5zdGF0ZUNoYW5nZXMuc3Vic2NyaWJlKCgpPT57dGhpcy5fdXBkYXRlTGFiZWxzKCksZS5tYXJrRm9yQ2hlY2soKX0pfWdldCBwZXJpb2RCdXR0b25UZXh0KCl7cmV0dXJuIHRoaXMuX3BlcmlvZEJ1dHRvblRleHR9Z2V0IHBlcmlvZEJ1dHRvbkRlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMuX3BlcmlvZEJ1dHRvbkRlc2NyaXB0aW9ufWdldCBwZXJpb2RCdXR0b25MYWJlbCgpe3JldHVybiB0aGlzLl9wZXJpb2RCdXR0b25MYWJlbH1nZXQgcHJldkJ1dHRvbkxhYmVsKCl7cmV0dXJuIHRoaXMuX3ByZXZCdXR0b25MYWJlbH1nZXQgbmV4dEJ1dHRvbkxhYmVsKCl7cmV0dXJuIHRoaXMuX25leHRCdXR0b25MYWJlbH1jdXJyZW50UGVyaW9kQ2xpY2tlZCgpe3RoaXMuY2FsZW5kYXIuY3VycmVudFZpZXc9dGhpcy5jYWxlbmRhci5jdXJyZW50Vmlldz09Im1vbnRoIj8ibXVsdGkteWVhciI6Im1vbnRoIn1wcmV2aW91c0NsaWNrZWQoKXt0aGlzLnByZXZpb3VzRW5hYmxlZCgpJiYodGhpcy5jYWxlbmRhci5hY3RpdmVEYXRlPXRoaXMuY2FsZW5kYXIuY3VycmVudFZpZXc9PSJtb250aCI/dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJNb250aHModGhpcy5jYWxlbmRhci5hY3RpdmVEYXRlLC0xKTp0aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhclllYXJzKHRoaXMuY2FsZW5kYXIuYWN0aXZlRGF0ZSx0aGlzLmNhbGVuZGFyLmN1cnJlbnRWaWV3PT0ieWVhciI/LTE6LWMyKSl9bmV4dENsaWNrZWQoKXt0aGlzLm5leHRFbmFibGVkKCkmJih0aGlzLmNhbGVuZGFyLmFjdGl2ZURhdGU9dGhpcy5jYWxlbmRhci5jdXJyZW50Vmlldz09Im1vbnRoIj90aGlzLl9kYXRlQWRhcHRlci5hZGRDYWxlbmRhck1vbnRocyh0aGlzLmNhbGVuZGFyLmFjdGl2ZURhdGUsMSk6dGhpcy5fZGF0ZUFkYXB0ZXIuYWRkQ2FsZW5kYXJZZWFycyh0aGlzLmNhbGVuZGFyLmFjdGl2ZURhdGUsdGhpcy5jYWxlbmRhci5jdXJyZW50Vmlldz09InllYXIiPzE6YzIpKX1wcmV2aW91c0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5jYWxlbmRhci5taW5EYXRlPyF0aGlzLmNhbGVuZGFyLm1pbkRhdGV8fCF0aGlzLl9pc1NhbWVWaWV3KHRoaXMuY2FsZW5kYXIuYWN0aXZlRGF0ZSx0aGlzLmNhbGVuZGFyLm1pbkRhdGUpOiEwfW5leHRFbmFibGVkKCl7cmV0dXJuIXRoaXMuY2FsZW5kYXIubWF4RGF0ZXx8IXRoaXMuX2lzU2FtZVZpZXcodGhpcy5jYWxlbmRhci5hY3RpdmVEYXRlLHRoaXMuY2FsZW5kYXIubWF4RGF0ZSl9X3VwZGF0ZUxhYmVscygpe2xldCBlPXRoaXMuY2FsZW5kYXIsaT10aGlzLl9pbnRsLGE9dGhpcy5fZGF0ZUFkYXB0ZXI7ZS5jdXJyZW50Vmlldz09PSJtb250aCI/KHRoaXMuX3BlcmlvZEJ1dHRvblRleHQ9YS5mb3JtYXQoZS5hY3RpdmVEYXRlLHRoaXMuX2RhdGVGb3JtYXRzLmRpc3BsYXkubW9udGhZZWFyTGFiZWwpLnRvTG9jYWxlVXBwZXJDYXNlKCksdGhpcy5fcGVyaW9kQnV0dG9uRGVzY3JpcHRpb249YS5mb3JtYXQoZS5hY3RpdmVEYXRlLHRoaXMuX2RhdGVGb3JtYXRzLmRpc3BsYXkubW9udGhZZWFyTGFiZWwpLnRvTG9jYWxlVXBwZXJDYXNlKCksdGhpcy5fcGVyaW9kQnV0dG9uTGFiZWw9aS5zd2l0Y2hUb011bHRpWWVhclZpZXdMYWJlbCx0aGlzLl9wcmV2QnV0dG9uTGFiZWw9aS5wcmV2TW9udGhMYWJlbCx0aGlzLl9uZXh0QnV0dG9uTGFiZWw9aS5uZXh0TW9udGhMYWJlbCk6ZS5jdXJyZW50Vmlldz09PSJ5ZWFyIj8odGhpcy5fcGVyaW9kQnV0dG9uVGV4dD1hLmdldFllYXJOYW1lKGUuYWN0aXZlRGF0ZSksdGhpcy5fcGVyaW9kQnV0dG9uRGVzY3JpcHRpb249YS5nZXRZZWFyTmFtZShlLmFjdGl2ZURhdGUpLHRoaXMuX3BlcmlvZEJ1dHRvbkxhYmVsPWkuc3dpdGNoVG9Nb250aFZpZXdMYWJlbCx0aGlzLl9wcmV2QnV0dG9uTGFiZWw9aS5wcmV2WWVhckxhYmVsLHRoaXMuX25leHRCdXR0b25MYWJlbD1pLm5leHRZZWFyTGFiZWwpOih0aGlzLl9wZXJpb2RCdXR0b25UZXh0PWkuZm9ybWF0WWVhclJhbmdlKC4uLnRoaXMuX2Zvcm1hdE1pbkFuZE1heFllYXJMYWJlbHMoKSksdGhpcy5fcGVyaW9kQnV0dG9uRGVzY3JpcHRpb249aS5mb3JtYXRZZWFyUmFuZ2VMYWJlbCguLi50aGlzLl9mb3JtYXRNaW5BbmRNYXhZZWFyTGFiZWxzKCkpLHRoaXMuX3BlcmlvZEJ1dHRvbkxhYmVsPWkuc3dpdGNoVG9Nb250aFZpZXdMYWJlbCx0aGlzLl9wcmV2QnV0dG9uTGFiZWw9aS5wcmV2TXVsdGlZZWFyTGFiZWwsdGhpcy5fbmV4dEJ1dHRvbkxhYmVsPWkubmV4dE11bHRpWWVhckxhYmVsKX1faXNTYW1lVmlldyhlLGkpe3JldHVybiB0aGlzLmNhbGVuZGFyLmN1cnJlbnRWaWV3PT0ibW9udGgiP3RoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoZSk9PXRoaXMuX2RhdGVBZGFwdGVyLmdldFllYXIoaSkmJnRoaXMuX2RhdGVBZGFwdGVyLmdldE1vbnRoKGUpPT10aGlzLl9kYXRlQWRhcHRlci5nZXRNb250aChpKTp0aGlzLmNhbGVuZGFyLmN1cnJlbnRWaWV3PT0ieWVhciI/dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihlKT09dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhcihpKTptZyh0aGlzLl9kYXRlQWRhcHRlcixlLGksdGhpcy5jYWxlbmRhci5taW5EYXRlLHRoaXMuY2FsZW5kYXIubWF4RGF0ZSl9X2Zvcm1hdE1pbkFuZE1heFllYXJMYWJlbHMoKXtsZXQgaT10aGlzLl9kYXRlQWRhcHRlci5nZXRZZWFyKHRoaXMuY2FsZW5kYXIuYWN0aXZlRGF0ZSktTTQodGhpcy5fZGF0ZUFkYXB0ZXIsdGhpcy5jYWxlbmRhci5hY3RpdmVEYXRlLHRoaXMuY2FsZW5kYXIubWluRGF0ZSx0aGlzLmNhbGVuZGFyLm1heERhdGUpLGE9aStjMi0xLHI9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhck5hbWUodGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShpLDAsMSkpLG89dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0WWVhck5hbWUodGhpcy5fZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZShhLDAsMSkpO3JldHVybltyLG9dfV9wZXJpb2RCdXR0b25MYWJlbElkPWgocXQpLmdldElkKCJtYXQtY2FsZW5kYXItcGVyaW9kLWxhYmVsLSIpO3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1jYWxlbmRhci1oZWFkZXIiXV0sZXhwb3J0QXM6WyJtYXRDYWxlbmRhckhlYWRlciJdLG5nQ29udGVudFNlbGVjdG9yczpaSSxkZWNsczoxNyx2YXJzOjEzLGNvbnN0czpbWzEsIm1hdC1jYWxlbmRhci1oZWFkZXIiXSxbMSwibWF0LWNhbGVuZGFyLWNvbnRyb2xzIl0sWyJhcmlhLWxpdmUiLCJwb2xpdGUiLDEsImNkay12aXN1YWxseS1oaWRkZW4iLDMsImlkIl0sWyJtYXRCdXR0b24iLCIiLCJ0eXBlIiwiYnV0dG9uIiwxLCJtYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbiIsMywiY2xpY2siXSxbImFyaWEtaGlkZGVuIiwidHJ1ZSJdLFsidmlld0JveCIsIjAgMCAxMCA1IiwiZm9jdXNhYmxlIiwiZmFsc2UiLCJhcmlhLWhpZGRlbiIsInRydWUiLDEsIm1hdC1jYWxlbmRhci1hcnJvdyJdLFsicG9pbnRzIiwiMCwwIDUsNSAxMCwwIl0sWzEsIm1hdC1jYWxlbmRhci1zcGFjZXIiXSxbIm1hdEljb25CdXR0b24iLCIiLCJ0eXBlIiwiYnV0dG9uIiwiZGlzYWJsZWRJbnRlcmFjdGl2ZSIsIiIsMSwibWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbiIsMywiY2xpY2siLCJkaXNhYmxlZCIsIm1hdFRvb2x0aXAiXSxbInZpZXdCb3giLCIwIDAgMjQgMjQiLCJmb2N1c2FibGUiLCJmYWxzZSIsImFyaWEtaGlkZGVuIiwidHJ1ZSJdLFsiZCIsIk0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiJdLFsibWF0SWNvbkJ1dHRvbiIsIiIsInR5cGUiLCJidXR0b24iLCJkaXNhYmxlZEludGVyYWN0aXZlIiwiIiwxLCJtYXQtY2FsZW5kYXItbmV4dC1idXR0b24iLDMsImNsaWNrIiwiZGlzYWJsZWQiLCJtYXRUb29sdGlwIl0sWyJkIiwiTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKFJlKCksYygwLCJkaXYiLDApKDEsImRpdiIsMSkoMiwic3BhbiIsMiksbSgzKSxzKCksYyg0LCJidXR0b24iLDMpLFMoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiBhLmN1cnJlbnRQZXJpb2RDbGlja2VkKCl9KSxjKDUsInNwYW4iLDQpLG0oNikscygpLE10KCksYyg3LCJzdmciLDUpLHUoOCwicG9seWdvbiIsNikscygpKCkseWkoKSx1KDksImRpdiIsNyksbWUoMTApLGMoMTEsImJ1dHRvbiIsOCksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIGEucHJldmlvdXNDbGlja2VkKCl9KSxNdCgpLGMoMTIsInN2ZyIsOSksdSgxMywicGF0aCIsMTApLHMoKSgpLHlpKCksYygxNCwiYnV0dG9uIiwxMSksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIGEubmV4dENsaWNrZWQoKX0pLE10KCksYygxNSwic3ZnIiw5KSx1KDE2LCJwYXRoIiwxMikscygpKCkoKSgpKSxpJjImJihsKDIpLGYoImlkIixhLl9wZXJpb2RCdXR0b25MYWJlbElkKSxsKCksQShhLnBlcmlvZEJ1dHRvbkRlc2NyaXB0aW9uKSxsKCksRygiYXJpYS1sYWJlbCIsYS5wZXJpb2RCdXR0b25MYWJlbCkoImFyaWEtZGVzY3JpYmVkYnkiLGEuX3BlcmlvZEJ1dHRvbkxhYmVsSWQpLGwoMiksQShhLnBlcmlvZEJ1dHRvblRleHQpLGwoKSxpZSgibWF0LWNhbGVuZGFyLWludmVydCIsYS5jYWxlbmRhci5jdXJyZW50VmlldyE9PSJtb250aCIpLGwoNCksZigiZGlzYWJsZWQiLCFhLnByZXZpb3VzRW5hYmxlZCgpKSgibWF0VG9vbHRpcCIsYS5wcmV2QnV0dG9uTGFiZWwpLEcoImFyaWEtbGFiZWwiLGEucHJldkJ1dHRvbkxhYmVsKSxsKDMpLGYoImRpc2FibGVkIiwhYS5uZXh0RW5hYmxlZCgpKSgibWF0VG9vbHRpcCIsYS5uZXh0QnV0dG9uTGFiZWwpLEcoImFyaWEtbGFiZWwiLGEubmV4dEJ1dHRvbkxhYmVsKSl9LGRlcGVuZGVuY2llczpbbGUsbDEsUnRdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxZOD0oKCk9PntjbGFzcyB0e19kYXRlQWRhcHRlcj1oKGtpLHtvcHRpb25hbDohMH0pO19kYXRlRm9ybWF0cz1oKGFuLHtvcHRpb25hbDohMH0pO19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtfZWxlbWVudFJlZj1oKGFlKTtoZWFkZXJDb21wb25lbnQ7X2NhbGVuZGFySGVhZGVyUG9ydGFsO19pbnRsQ2hhbmdlcztfbW92ZUZvY3VzT25OZXh0VGljaz0hMTtnZXQgc3RhcnRBdCgpe3JldHVybiB0aGlzLl9zdGFydEF0fXNldCBzdGFydEF0KGUpe3RoaXMuX3N0YXJ0QXQ9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGUpKX1fc3RhcnRBdDtzdGFydFZpZXc9Im1vbnRoIjtnZXQgc2VsZWN0ZWQoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWR9c2V0IHNlbGVjdGVkKGUpe2UgaW5zdGFuY2VvZiB4Mj90aGlzLl9zZWxlY3RlZD1lOnRoaXMuX3NlbGVjdGVkPXRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlKSl9X3NlbGVjdGVkO2dldCBtaW5EYXRlKCl7cmV0dXJuIHRoaXMuX21pbkRhdGV9c2V0IG1pbkRhdGUoZSl7dGhpcy5fbWluRGF0ZT10aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZSkpfV9taW5EYXRlO2dldCBtYXhEYXRlKCl7cmV0dXJuIHRoaXMuX21heERhdGV9c2V0IG1heERhdGUoZSl7dGhpcy5fbWF4RGF0ZT10aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwodGhpcy5fZGF0ZUFkYXB0ZXIuZGVzZXJpYWxpemUoZSkpfV9tYXhEYXRlO2RhdGVGaWx0ZXI7ZGF0ZUNsYXNzO2NvbXBhcmlzb25TdGFydDtjb21wYXJpc29uRW5kO3N0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lO2VuZERhdGVBY2Nlc3NpYmxlTmFtZTtzZWxlY3RlZENoYW5nZT1uZXcgTjt5ZWFyU2VsZWN0ZWQ9bmV3IE47bW9udGhTZWxlY3RlZD1uZXcgTjt2aWV3Q2hhbmdlZD1uZXcgTighMCk7X3VzZXJTZWxlY3Rpb249bmV3IE47X3VzZXJEcmFnRHJvcD1uZXcgTjttb250aFZpZXc7eWVhclZpZXc7bXVsdGlZZWFyVmlldztnZXQgYWN0aXZlRGF0ZSgpe3JldHVybiB0aGlzLl9jbGFtcGVkQWN0aXZlRGF0ZX1zZXQgYWN0aXZlRGF0ZShlKXt0aGlzLl9jbGFtcGVkQWN0aXZlRGF0ZT10aGlzLl9kYXRlQWRhcHRlci5jbGFtcERhdGUoZSx0aGlzLm1pbkRhdGUsdGhpcy5tYXhEYXRlKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X2NsYW1wZWRBY3RpdmVEYXRlO2dldCBjdXJyZW50Vmlldygpe3JldHVybiB0aGlzLl9jdXJyZW50Vmlld31zZXQgY3VycmVudFZpZXcoZSl7bGV0IGk9dGhpcy5fY3VycmVudFZpZXchPT1lP2U6bnVsbDt0aGlzLl9jdXJyZW50Vmlldz1lLHRoaXMuX21vdmVGb2N1c09uTmV4dFRpY2s9ITAsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksaSYmKHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSx0aGlzLnZpZXdDaGFuZ2VkLmVtaXQoaSkpfV9jdXJyZW50VmlldztfYWN0aXZlRHJhZz1udWxsO3N0YXRlQ2hhbmdlcz1uZXcgd2U7Y29uc3RydWN0b3IoKXt0aGlzLl9pbnRsQ2hhbmdlcz1oKHNvKS5jaGFuZ2VzLnN1YnNjcmliZSgoKT0+e3RoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX0pfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2NhbGVuZGFySGVhZGVyUG9ydGFsPW5ldyBqYSh0aGlzLmhlYWRlckNvbXBvbmVudHx8cGcpLHRoaXMuYWN0aXZlRGF0ZT10aGlzLnN0YXJ0QXR8fHRoaXMuX2RhdGVBZGFwdGVyLnRvZGF5KCksdGhpcy5fY3VycmVudFZpZXc9dGhpcy5zdGFydFZpZXd9bmdBZnRlclZpZXdDaGVja2VkKCl7dGhpcy5fbW92ZUZvY3VzT25OZXh0VGljayYmKHRoaXMuX21vdmVGb2N1c09uTmV4dFRpY2s9ITEsdGhpcy5mb2N1c0FjdGl2ZUNlbGwoKSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9pbnRsQ2hhbmdlcy51bnN1YnNjcmliZSgpLHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCl9bmdPbkNoYW5nZXMoZSl7bGV0IGk9ZS5taW5EYXRlJiYhdGhpcy5fZGF0ZUFkYXB0ZXIuc2FtZURhdGUoZS5taW5EYXRlLnByZXZpb3VzVmFsdWUsZS5taW5EYXRlLmN1cnJlbnRWYWx1ZSk/ZS5taW5EYXRlOnZvaWQgMCxhPWUubWF4RGF0ZSYmIXRoaXMuX2RhdGVBZGFwdGVyLnNhbWVEYXRlKGUubWF4RGF0ZS5wcmV2aW91c1ZhbHVlLGUubWF4RGF0ZS5jdXJyZW50VmFsdWUpP2UubWF4RGF0ZTp2b2lkIDAscj1pfHxhfHxlLmRhdGVGaWx0ZXI7aWYociYmIXIuZmlyc3RDaGFuZ2Upe2xldCBvPXRoaXMuX2dldEN1cnJlbnRWaWV3Q29tcG9uZW50KCk7byYmKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhxYSgpKSYmKHRoaXMuX21vdmVGb2N1c09uTmV4dFRpY2s9ITApLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKSxvLl9pbml0KCkpfXRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX1mb2N1c0FjdGl2ZUNlbGwoKXt0aGlzLl9nZXRDdXJyZW50Vmlld0NvbXBvbmVudCgpLl9mb2N1c0FjdGl2ZUNlbGwoITEpfXVwZGF0ZVRvZGF5c0RhdGUoKXt0aGlzLl9nZXRDdXJyZW50Vmlld0NvbXBvbmVudCgpLl9pbml0KCl9X2RhdGVTZWxlY3RlZChlKXtsZXQgaT1lLnZhbHVlOyh0aGlzLnNlbGVjdGVkIGluc3RhbmNlb2YgeDJ8fGkmJiF0aGlzLl9kYXRlQWRhcHRlci5zYW1lRGF0ZShpLHRoaXMuc2VsZWN0ZWQpKSYmdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KGkpLHRoaXMuX3VzZXJTZWxlY3Rpb24uZW1pdChlKX1feWVhclNlbGVjdGVkSW5NdWx0aVllYXJWaWV3KGUpe3RoaXMueWVhclNlbGVjdGVkLmVtaXQoZSl9X21vbnRoU2VsZWN0ZWRJblllYXJWaWV3KGUpe3RoaXMubW9udGhTZWxlY3RlZC5lbWl0KGUpfV9nb1RvRGF0ZUluVmlldyhlLGkpe3RoaXMuYWN0aXZlRGF0ZT1lLHRoaXMuY3VycmVudFZpZXc9aX1fZHJhZ1N0YXJ0ZWQoZSl7dGhpcy5fYWN0aXZlRHJhZz1lfV9kcmFnRW5kZWQoZSl7dGhpcy5fYWN0aXZlRHJhZyYmKGUudmFsdWUmJnRoaXMuX3VzZXJEcmFnRHJvcC5lbWl0KGUpLHRoaXMuX2FjdGl2ZURyYWc9bnVsbCl9X2dldEN1cnJlbnRWaWV3Q29tcG9uZW50KCl7cmV0dXJuIHRoaXMubW9udGhWaWV3fHx0aGlzLnllYXJWaWV3fHx0aGlzLm11bHRpWWVhclZpZXd9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LWNhbGVuZGFyIl1dLHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKHRlKG5nLDUpLHRlKG9nLDUpLHRlKHJnLDUpKSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5tb250aFZpZXc9ci5maXJzdCksRihyPUIoKSkmJihhLnllYXJWaWV3PXIuZmlyc3QpLEYocj1CKCkpJiYoYS5tdWx0aVllYXJWaWV3PXIuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtY2FsZW5kYXIiXSxpbnB1dHM6e2hlYWRlckNvbXBvbmVudDoiaGVhZGVyQ29tcG9uZW50IixzdGFydEF0OiJzdGFydEF0IixzdGFydFZpZXc6InN0YXJ0VmlldyIsc2VsZWN0ZWQ6InNlbGVjdGVkIixtaW5EYXRlOiJtaW5EYXRlIixtYXhEYXRlOiJtYXhEYXRlIixkYXRlRmlsdGVyOiJkYXRlRmlsdGVyIixkYXRlQ2xhc3M6ImRhdGVDbGFzcyIsY29tcGFyaXNvblN0YXJ0OiJjb21wYXJpc29uU3RhcnQiLGNvbXBhcmlzb25FbmQ6ImNvbXBhcmlzb25FbmQiLHN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lOiJzdGFydERhdGVBY2Nlc3NpYmxlTmFtZSIsZW5kRGF0ZUFjY2Vzc2libGVOYW1lOiJlbmREYXRlQWNjZXNzaWJsZU5hbWUifSxvdXRwdXRzOntzZWxlY3RlZENoYW5nZToic2VsZWN0ZWRDaGFuZ2UiLHllYXJTZWxlY3RlZDoieWVhclNlbGVjdGVkIixtb250aFNlbGVjdGVkOiJtb250aFNlbGVjdGVkIix2aWV3Q2hhbmdlZDoidmlld0NoYW5nZWQiLF91c2VyU2VsZWN0aW9uOiJfdXNlclNlbGVjdGlvbiIsX3VzZXJEcmFnRHJvcDoiX3VzZXJEcmFnRHJvcCJ9LGV4cG9ydEFzOlsibWF0Q2FsZW5kYXIiXSxmZWF0dXJlczpbSWUoW2xnXSksSGVdLGRlY2xzOjUsdmFyczoyLGNvbnN0czpbWzMsImNka1BvcnRhbE91dGxldCJdLFsiY2RrTW9uaXRvclN1YnRyZWVGb2N1cyIsIiIsInRhYmluZGV4IiwiLTEiLDEsIm1hdC1jYWxlbmRhci1jb250ZW50Il0sWzMsImFjdGl2ZURhdGUiLCJzZWxlY3RlZCIsImRhdGVGaWx0ZXIiLCJtYXhEYXRlIiwibWluRGF0ZSIsImRhdGVDbGFzcyIsImNvbXBhcmlzb25TdGFydCIsImNvbXBhcmlzb25FbmQiLCJzdGFydERhdGVBY2Nlc3NpYmxlTmFtZSIsImVuZERhdGVBY2Nlc3NpYmxlTmFtZSIsImFjdGl2ZURyYWciXSxbMywiYWN0aXZlRGF0ZSIsInNlbGVjdGVkIiwiZGF0ZUZpbHRlciIsIm1heERhdGUiLCJtaW5EYXRlIiwiZGF0ZUNsYXNzIl0sWzMsImFjdGl2ZURhdGVDaGFuZ2UiLCJfdXNlclNlbGVjdGlvbiIsImRyYWdTdGFydGVkIiwiZHJhZ0VuZGVkIiwiYWN0aXZlRGF0ZSIsInNlbGVjdGVkIiwiZGF0ZUZpbHRlciIsIm1heERhdGUiLCJtaW5EYXRlIiwiZGF0ZUNsYXNzIiwiY29tcGFyaXNvblN0YXJ0IiwiY29tcGFyaXNvbkVuZCIsInN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lIiwiZW5kRGF0ZUFjY2Vzc2libGVOYW1lIiwiYWN0aXZlRHJhZyJdLFszLCJhY3RpdmVEYXRlQ2hhbmdlIiwibW9udGhTZWxlY3RlZCIsInNlbGVjdGVkQ2hhbmdlIiwiYWN0aXZlRGF0ZSIsInNlbGVjdGVkIiwiZGF0ZUZpbHRlciIsIm1heERhdGUiLCJtaW5EYXRlIiwiZGF0ZUNsYXNzIl0sWzMsImFjdGl2ZURhdGVDaGFuZ2UiLCJ5ZWFyU2VsZWN0ZWQiLCJzZWxlY3RlZENoYW5nZSIsImFjdGl2ZURhdGUiLCJzZWxlY3RlZCIsImRhdGVGaWx0ZXIiLCJtYXhEYXRlIiwibWluRGF0ZSIsImRhdGVDbGFzcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKFIoMCwkSSwwLDAsIm5nLXRlbXBsYXRlIiwwKSxjKDEsImRpdiIsMSksTSgyLEtJLDEsMTEsIm1hdC1tb250aC12aWV3IiwyKSgzLFhJLDEsNiwibWF0LXllYXItdmlldyIsMykoNCxKSSwxLDYsIm1hdC1tdWx0aS15ZWFyLXZpZXciLDMpLHMoKSksaSYyKXtsZXQgcjtmKCJjZGtQb3J0YWxPdXRsZXQiLGEuX2NhbGVuZGFySGVhZGVyUG9ydGFsKSxsKDIpLHcoKHI9YS5jdXJyZW50Vmlldyk9PT0ibW9udGgiPzI6cj09PSJ5ZWFyIj8zOnI9PT0ibXVsdGkteWVhciI/NDotMSl9fSxkZXBlbmRlbmNpZXM6W0tpLHgwLG5nLG9nLHJnXSxzdHlsZXM6W2AubWF0LWNhbGVuZGFye2Rpc3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6bm9ybWFsO2ZvbnQtZmFtaWx5OnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1mb250KSk7Zm9udC1zaXplOnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1zaXplKSl9Lm1hdC1jYWxlbmRhci1oZWFkZXJ7cGFkZGluZzo4cHggOHB4IDAgOHB4fS5tYXQtY2FsZW5kYXItY29udGVudHtwYWRkaW5nOjAgOHB4IDhweCA4cHg7b3V0bGluZTpub25lfS5tYXQtY2FsZW5kYXItY29udHJvbHN7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW46NSUgY2FsYyg0LjcxNDI4NTcxNDMlIC0gMTZweCl9Lm1hdC1jYWxlbmRhci1zcGFjZXJ7ZmxleDoxIDEgYXV0b30ubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b257bWluLXdpZHRoOjA7bWFyZ2luOjAgOHB4O2ZvbnQtc2l6ZTp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1wZXJpb2QtYnV0dG9uLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy10aXRsZS1zbWFsbC1zaXplKSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItcGVyaW9kLWJ1dHRvbi10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy10aXRsZS1zbWFsbC13ZWlnaHQpKTstLW1hdC1idXR0b24tdGV4dC1sYWJlbC10ZXh0LWNvbG9yOiB2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1wZXJpb2QtYnV0dG9uLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1hdC1jYWxlbmRhci1hcnJvd3tkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMHB4O2hlaWdodDo1cHg7bWFyZ2luOjAgMCAwIDVweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZmlsbDp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1wZXJpb2QtYnV0dG9uLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1hdC1jYWxlbmRhci1hcnJvdy5tYXQtY2FsZW5kYXItaW52ZXJ0e3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKX1bZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1hcnJvd3ttYXJnaW46MCA1cHggMCAwfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtY2FsZW5kYXItYXJyb3d7ZmlsbDpDYW52YXNUZXh0fX0ubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbjpub3QoLm1hdC1tZGMtYnV0dG9uLWRpc2FibGVkKSwubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uOm5vdCgubWF0LW1kYy1idXR0b24tZGlzYWJsZWQpe2NvbG9yOnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLW5hdmlnYXRpb24tYnV0dG9uLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9W2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uLFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9ue3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKX0ubWF0LWNhbGVuZGFyLXRhYmxle2JvcmRlci1zcGFjaW5nOjA7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO3dpZHRoOjEwMCV9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXIgdGh7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzowIDAgOHB4IDA7Y29sb3I6dmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItaGVhZGVyLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSk7Zm9udC1zaXplOnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWhlYWRlci10ZXh0LXNpemUsIHZhcigtLW1hdC1zeXMtdGl0bGUtc21hbGwtc2l6ZSkpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWhlYWRlci10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy10aXRsZS1zbWFsbC13ZWlnaHQpKX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVye3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDoxcHh9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcjo6YWZ0ZXJ7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0Oi04cHg7cmlnaHQ6LThweDtoZWlnaHQ6MXB4O2JhY2tncm91bmQ6dmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItaGVhZGVyLWRpdmlkZXItY29sb3IsIHRyYW5zcGFyZW50KX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50OjpiZWZvcmV7bWFyZ2luOmNhbGMoY2FsYyh2YXIoLS1tYXQtZm9jdXMtaW5kaWNhdG9yLWJvcmRlci13aWR0aCwgM3B4KSArIDNweCkqLTEpfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsOmZvY3VzIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7Y29udGVudDoiIn0KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIHR9KSgpLGZnPW5ldyBjZSgibWF0LWRhdGVwaWNrZXItc2Nyb2xsLXN0cmF0ZWd5Iix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTooKT0+e2xldCB0PWgoc3QpO3JldHVybigpPT5MaSh0KX19KTtoTD17cHJvdmlkZTpmZyxkZXBzOltdLHVzZUZhY3Rvcnk6bUx9LHVnPSgoKT0+e2NsYXNzIHR7X2VsZW1lbnRSZWY9aChhZSk7X2FuaW1hdGlvbnNEaXNhYmxlZD1QdCgpO19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtfZ2xvYmFsTW9kZWw9aChTNCk7X2RhdGVBZGFwdGVyPWgoa2kpO19uZ1pvbmU9aChyZSk7X3JhbmdlU2VsZWN0aW9uU3RyYXRlZ3k9aChkZyx7b3B0aW9uYWw6ITB9KTtfc3RhdGVDaGFuZ2VzO19tb2RlbDtfZXZlbnRDbGVhbnVwcztfYW5pbWF0aW9uRmFsbGJhY2s7X2NhbGVuZGFyO2NvbG9yO2RhdGVwaWNrZXI7Y29tcGFyaXNvblN0YXJ0O2NvbXBhcmlzb25FbmQ7c3RhcnREYXRlQWNjZXNzaWJsZU5hbWU7ZW5kRGF0ZUFjY2Vzc2libGVOYW1lO19pc0Fib3ZlO19hbmltYXRpb25Eb25lPW5ldyB3ZTtfaXNBbmltYXRpbmc9ITE7X2Nsb3NlQnV0dG9uVGV4dDtfY2xvc2VCdXR0b25Gb2N1c2VkO19hY3Rpb25zUG9ydGFsPW51bGw7X2RpYWxvZ0xhYmVsSWQ7Y29uc3RydWN0b3IoKXtpZihoKEMxKS5sb2FkKF9yKSx0aGlzLl9jbG9zZUJ1dHRvblRleHQ9aChzbykuY2xvc2VDYWxlbmRhckxhYmVsLCF0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQpe2xldCBlPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxpPWgodjEpO3RoaXMuX2V2ZW50Q2xlYW51cHM9dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpPT5baS5saXN0ZW4oZSwiYW5pbWF0aW9uc3RhcnQiLHRoaXMuX2hhbmRsZUFuaW1hdGlvbkV2ZW50KSxpLmxpc3RlbihlLCJhbmltYXRpb25lbmQiLHRoaXMuX2hhbmRsZUFuaW1hdGlvbkV2ZW50KSxpLmxpc3RlbihlLCJhbmltYXRpb25jYW5jZWwiLHRoaXMuX2hhbmRsZUFuaW1hdGlvbkV2ZW50KV0pfX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9zdGF0ZUNoYW5nZXM9dGhpcy5kYXRlcGlja2VyLnN0YXRlQ2hhbmdlcy5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pLHRoaXMuX2NhbGVuZGFyLmZvY3VzQWN0aXZlQ2VsbCgpfW5nT25EZXN0cm95KCl7Y2xlYXJUaW1lb3V0KHRoaXMuX2FuaW1hdGlvbkZhbGxiYWNrKSx0aGlzLl9ldmVudENsZWFudXBzPy5mb3JFYWNoKGU9PmUoKSksdGhpcy5fc3RhdGVDaGFuZ2VzPy51bnN1YnNjcmliZSgpLHRoaXMuX2FuaW1hdGlvbkRvbmUuY29tcGxldGUoKX1faGFuZGxlVXNlclNlbGVjdGlvbihlKXtsZXQgaT10aGlzLl9tb2RlbC5zZWxlY3Rpb24sYT1lLnZhbHVlLHI9aSBpbnN0YW5jZW9mIHgyO2lmKHImJnRoaXMuX3JhbmdlU2VsZWN0aW9uU3RyYXRlZ3kpe2xldCBvPXRoaXMuX3JhbmdlU2VsZWN0aW9uU3RyYXRlZ3kuc2VsZWN0aW9uRmluaXNoZWQoYSxpLGUuZXZlbnQpO3RoaXMuX21vZGVsLnVwZGF0ZVNlbGVjdGlvbihvLHRoaXMpfWVsc2UgYSYmKHJ8fCF0aGlzLl9kYXRlQWRhcHRlci5zYW1lRGF0ZShhLGkpKSYmdGhpcy5fbW9kZWwuYWRkKGEpOyghdGhpcy5fbW9kZWx8fHRoaXMuX21vZGVsLmlzQ29tcGxldGUoKSkmJiF0aGlzLl9hY3Rpb25zUG9ydGFsJiZ0aGlzLmRhdGVwaWNrZXIuY2xvc2UoKX1faGFuZGxlVXNlckRyYWdEcm9wKGUpe3RoaXMuX21vZGVsLnVwZGF0ZVNlbGVjdGlvbihlLnZhbHVlLHRoaXMpfV9zdGFydEV4aXRBbmltYXRpb24oKXt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgibWF0LWRhdGVwaWNrZXItY29udGVudC1leGl0IiksdGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkP3RoaXMuX2FuaW1hdGlvbkRvbmUubmV4dCgpOihjbGVhclRpbWVvdXQodGhpcy5fYW5pbWF0aW9uRmFsbGJhY2spLHRoaXMuX2FuaW1hdGlvbkZhbGxiYWNrPXNldFRpbWVvdXQoKCk9Pnt0aGlzLl9pc0FuaW1hdGluZ3x8dGhpcy5fYW5pbWF0aW9uRG9uZS5uZXh0KCl9LDIwMCkpfV9oYW5kbGVBbmltYXRpb25FdmVudD1lPT57bGV0IGk9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2UudGFyZ2V0IT09aXx8IWUuYW5pbWF0aW9uTmFtZS5zdGFydHNXaXRoKCJfbWF0LWRhdGVwaWNrZXItY29udGVudCIpfHwoY2xlYXJUaW1lb3V0KHRoaXMuX2FuaW1hdGlvbkZhbGxiYWNrKSx0aGlzLl9pc0FuaW1hdGluZz1lLnR5cGU9PT0iYW5pbWF0aW9uc3RhcnQiLGkuY2xhc3NMaXN0LnRvZ2dsZSgibWF0LWRhdGVwaWNrZXItY29udGVudC1hbmltYXRpbmciLHRoaXMuX2lzQW5pbWF0aW5nKSx0aGlzLl9pc0FuaW1hdGluZ3x8dGhpcy5fYW5pbWF0aW9uRG9uZS5uZXh0KCkpfTtfZ2V0U2VsZWN0ZWQoKXtyZXR1cm4gdGhpcy5fbW9kZWwuc2VsZWN0aW9ufV9hcHBseVBlbmRpbmdTZWxlY3Rpb24oKXt0aGlzLl9tb2RlbCE9PXRoaXMuX2dsb2JhbE1vZGVsJiZ0aGlzLl9nbG9iYWxNb2RlbC51cGRhdGVTZWxlY3Rpb24odGhpcy5fbW9kZWwuc2VsZWN0aW9uLHRoaXMpfV9hc3NpZ25BY3Rpb25zKGUsaSl7dGhpcy5fbW9kZWw9ZT90aGlzLl9nbG9iYWxNb2RlbC5jbG9uZSgpOnRoaXMuX2dsb2JhbE1vZGVsLHRoaXMuX2FjdGlvbnNQb3J0YWw9ZSxpJiZ0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LWRhdGVwaWNrZXItY29udGVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJnRlKFk4LDUpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLl9jYWxlbmRhcj1yLmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LWRhdGVwaWNrZXItY29udGVudCJdLGhvc3RWYXJzOjYsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGksYSl7aSYyJiYoRHQoYS5jb2xvcj8ibWF0LSIrYS5jb2xvcjoiIiksaWUoIm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2giLGEuZGF0ZXBpY2tlci50b3VjaFVpKSgibWF0LWRhdGVwaWNrZXItY29udGVudC1hbmltYXRpb25zLWVuYWJsZWQiLCFhLl9hbmltYXRpb25zRGlzYWJsZWQpKX0saW5wdXRzOntjb2xvcjoiY29sb3IifSxleHBvcnRBczpbIm1hdERhdGVwaWNrZXJDb250ZW50Il0sZGVjbHM6NSx2YXJzOjI2LGNvbnN0czpbWyJjZGtUcmFwRm9jdXMiLCIiLCJyb2xlIiwiZGlhbG9nIiwxLCJtYXQtZGF0ZXBpY2tlci1jb250ZW50LWNvbnRhaW5lciJdLFszLCJ5ZWFyU2VsZWN0ZWQiLCJtb250aFNlbGVjdGVkIiwidmlld0NoYW5nZWQiLCJfdXNlclNlbGVjdGlvbiIsIl91c2VyRHJhZ0Ryb3AiLCJpZCIsInN0YXJ0QXQiLCJzdGFydFZpZXciLCJtaW5EYXRlIiwibWF4RGF0ZSIsImRhdGVGaWx0ZXIiLCJoZWFkZXJDb21wb25lbnQiLCJzZWxlY3RlZCIsImRhdGVDbGFzcyIsImNvbXBhcmlzb25TdGFydCIsImNvbXBhcmlzb25FbmQiLCJzdGFydERhdGVBY2Nlc3NpYmxlTmFtZSIsImVuZERhdGVBY2Nlc3NpYmxlTmFtZSJdLFszLCJjZGtQb3J0YWxPdXRsZXQiXSxbInR5cGUiLCJidXR0b24iLCJtYXRCdXR0b24iLCJlbGV2YXRlZCIsMSwibWF0LWRhdGVwaWNrZXItY2xvc2UtYnV0dG9uIiwzLCJmb2N1cyIsImJsdXIiLCJjbGljayIsImNvbG9yIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJkaXYiLDApKDEsIm1hdC1jYWxlbmRhciIsMSksUygieWVhclNlbGVjdGVkIixmdW5jdGlvbihvKXtyZXR1cm4gYS5kYXRlcGlja2VyLl9zZWxlY3RZZWFyKG8pfSkoIm1vbnRoU2VsZWN0ZWQiLGZ1bmN0aW9uKG8pe3JldHVybiBhLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoKG8pfSkoInZpZXdDaGFuZ2VkIixmdW5jdGlvbihvKXtyZXR1cm4gYS5kYXRlcGlja2VyLl92aWV3Q2hhbmdlZChvKX0pKCJfdXNlclNlbGVjdGlvbiIsZnVuY3Rpb24obyl7cmV0dXJuIGEuX2hhbmRsZVVzZXJTZWxlY3Rpb24obyl9KSgiX3VzZXJEcmFnRHJvcCIsZnVuY3Rpb24obyl7cmV0dXJuIGEuX2hhbmRsZVVzZXJEcmFnRHJvcChvKX0pLHMoKSxSKDIsZUwsMCwwLCJuZy10ZW1wbGF0ZSIsMiksYygzLCJidXR0b24iLDMpLFMoImZvY3VzIixmdW5jdGlvbigpe3JldHVybiBhLl9jbG9zZUJ1dHRvbkZvY3VzZWQ9ITB9KSgiYmx1ciIsZnVuY3Rpb24oKXtyZXR1cm4gYS5fY2xvc2VCdXR0b25Gb2N1c2VkPSExfSkoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiBhLmRhdGVwaWNrZXIuY2xvc2UoKX0pLG0oNCkscygpKCkpLGkmMiYmKGllKCJtYXQtZGF0ZXBpY2tlci1jb250ZW50LWNvbnRhaW5lci13aXRoLWN1c3RvbS1oZWFkZXIiLGEuZGF0ZXBpY2tlci5jYWxlbmRhckhlYWRlckNvbXBvbmVudCkoIm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtY29udGFpbmVyLXdpdGgtYWN0aW9ucyIsYS5fYWN0aW9uc1BvcnRhbCksRygiYXJpYS1tb2RhbCIsITApKCJhcmlhLWxhYmVsbGVkYnkiLGEuX2RpYWxvZ0xhYmVsSWQ/P3ZvaWQgMCksbCgpLER0KGEuZGF0ZXBpY2tlci5wYW5lbENsYXNzKSxmKCJpZCIsYS5kYXRlcGlja2VyLmlkKSgic3RhcnRBdCIsYS5kYXRlcGlja2VyLnN0YXJ0QXQpKCJzdGFydFZpZXciLGEuZGF0ZXBpY2tlci5zdGFydFZpZXcpKCJtaW5EYXRlIixhLmRhdGVwaWNrZXIuX2dldE1pbkRhdGUoKSkoIm1heERhdGUiLGEuZGF0ZXBpY2tlci5fZ2V0TWF4RGF0ZSgpKSgiZGF0ZUZpbHRlciIsYS5kYXRlcGlja2VyLl9nZXREYXRlRmlsdGVyKCkpKCJoZWFkZXJDb21wb25lbnQiLGEuZGF0ZXBpY2tlci5jYWxlbmRhckhlYWRlckNvbXBvbmVudCkoInNlbGVjdGVkIixhLl9nZXRTZWxlY3RlZCgpKSgiZGF0ZUNsYXNzIixhLmRhdGVwaWNrZXIuZGF0ZUNsYXNzKSgiY29tcGFyaXNvblN0YXJ0IixhLmNvbXBhcmlzb25TdGFydCkoImNvbXBhcmlzb25FbmQiLGEuY29tcGFyaXNvbkVuZCkoInN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lIixhLnN0YXJ0RGF0ZUFjY2Vzc2libGVOYW1lKSgiZW5kRGF0ZUFjY2Vzc2libGVOYW1lIixhLmVuZERhdGVBY2Nlc3NpYmxlTmFtZSksbCgpLGYoImNka1BvcnRhbE91dGxldCIsYS5fYWN0aW9uc1BvcnRhbCksbCgpLGllKCJjZGstdmlzdWFsbHktaGlkZGVuIiwhYS5fY2xvc2VCdXR0b25Gb2N1c2VkKSxmKCJjb2xvciIsYS5jb2xvcnx8InByaW1hcnkiKSxsKCksQShhLl9jbG9zZUJ1dHRvblRleHQpKX0sZGVwZW5kZW5jaWVzOltnbSxZOCxLaSxsZV0sc3R5bGVzOltgQGtleWZyYW1lcyBfbWF0LWRhdGVwaWNrZXItY29udGVudC1kcm9wZG93bi1lbnRlcntmcm9te29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGVZKDAuOCl9dG97b3BhY2l0eToxO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIF9tYXQtZGF0ZXBpY2tlci1jb250ZW50LWRpYWxvZy1lbnRlcntmcm9te29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoMC44KX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgX21hdC1kYXRlcGlja2VyLWNvbnRlbnQtZXhpdHtmcm9te29wYWNpdHk6MX10b3tvcGFjaXR5OjB9fS5tYXQtZGF0ZXBpY2tlci1jb250ZW50e2Rpc3BsYXk6YmxvY2s7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1jb250YWluZXItYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlLWNvbnRhaW5lci1oaWdoKSk7Y29sb3I6dmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItY29udGFpbmVyLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO2JveC1zaGFkb3c6dmFyKC0tbWF0LWRhdGVwaWNrZXItY2FsZW5kYXItY29udGFpbmVyLWVsZXZhdGlvbi1zaGFkb3csIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCAwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1jb250YWluZXItc2hhcGUsIHZhcigtLW1hdC1zeXMtY29ybmVyLWxhcmdlKSl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWRhdGVwaWNrZXItY29udGVudC1hbmltYXRpb25zLWVuYWJsZWR7YW5pbWF0aW9uOl9tYXQtZGF0ZXBpY2tlci1jb250ZW50LWRyb3Bkb3duLWVudGVyIDEyMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXJ7d2lkdGg6Mjk2cHg7aGVpZ2h0OjM1NHB4fS5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtZGF0ZXBpY2tlci1jb250ZW50LWNvbnRhaW5lci13aXRoLWN1c3RvbS1oZWFkZXIgLm1hdC1jYWxlbmRhcntoZWlnaHQ6YXV0b30ubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWRhdGVwaWNrZXItY2xvc2UtYnV0dG9ue3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMDAlO2xlZnQ6MDttYXJnaW4tdG9wOjhweH0ubWF0LWRhdGVwaWNrZXItY29udGVudC1hbmltYXRpbmcgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQgLm1hdC1kYXRlcGlja2VyLWNsb3NlLWJ1dHRvbntkaXNwbGF5Om5vbmV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtY29udGFpbmVye2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2h7ZGlzcGxheTpibG9jazttYXgtaGVpZ2h0Ojgwdmg7Ym94LXNoYWRvdzp2YXIoLS1tYXQtZGF0ZXBpY2tlci1jYWxlbmRhci1jb250YWluZXItdG91Y2gtZWxldmF0aW9uLXNoYWRvdywgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpKTtib3JkZXItcmFkaXVzOnZhcigtLW1hdC1kYXRlcGlja2VyLWNhbGVuZGFyLWNvbnRhaW5lci10b3VjaC1zaGFwZSwgdmFyKC0tbWF0LXN5cy1jb3JuZXItZXh0cmEtbGFyZ2UpKTtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtYW5pbWF0aW9ucy1lbmFibGVke2FuaW1hdGlvbjpfbWF0LWRhdGVwaWNrZXItY29udGVudC1kaWFsb2ctZW50ZXIgMTUwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2ggLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtY29udGFpbmVye21pbi1oZWlnaHQ6MzEycHg7bWF4LWhlaWdodDo3ODhweDttaW4td2lkdGg6MjUwcHg7bWF4LXdpZHRoOjc1MHB4fS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoIC5tYXQtY2FsZW5kYXJ7d2lkdGg6MTAwJTtoZWlnaHQ6YXV0b30ubWF0LWRhdGVwaWNrZXItY29udGVudC1leGl0Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtYW5pbWF0aW9ucy1lbmFibGVke2FuaW1hdGlvbjpfbWF0LWRhdGVwaWNrZXItY29udGVudC1leGl0IDEwMG1zIGxpbmVhcn1AbWVkaWEgYWxsIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSl7Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2ggLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtY29udGFpbmVye3dpZHRoOjY0dmg7aGVpZ2h0Ojgwdmh9fUBtZWRpYSBhbGwgYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpey5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50LWNvbnRhaW5lcnt3aWR0aDo4MHZ3O2hlaWdodDoxMDB2d30ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaCAubWF0LWRhdGVwaWNrZXItY29udGVudC1jb250YWluZXItd2l0aC1hY3Rpb25ze2hlaWdodDoxMTV2d319CmBdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxjZz0oKCk9PntjbGFzcyB0e19pbmplY3Rvcj1oKHN0KTtfdmlld0NvbnRhaW5lclJlZj1oKEcxKTtfZGF0ZUFkYXB0ZXI9aChraSx7b3B0aW9uYWw6ITB9KTtfZGlyPWgobjEse29wdGlvbmFsOiEwfSk7X21vZGVsPWgoUzQpO19hbmltYXRpb25zRGlzYWJsZWQ9UHQoKTtfc2Nyb2xsU3RyYXRlZ3k9aChmZyk7X2lucHV0U3RhdGVDaGFuZ2VzPW8xLkVNUFRZO19kb2N1bWVudD1oKGp0KTtjYWxlbmRhckhlYWRlckNvbXBvbmVudDtnZXQgc3RhcnRBdCgpe3JldHVybiB0aGlzLl9zdGFydEF0fHwodGhpcy5kYXRlcGlja2VySW5wdXQ/dGhpcy5kYXRlcGlja2VySW5wdXQuZ2V0U3RhcnRWYWx1ZSgpOm51bGwpfXNldCBzdGFydEF0KGUpe3RoaXMuX3N0YXJ0QXQ9dGhpcy5fZGF0ZUFkYXB0ZXIuZ2V0VmFsaWREYXRlT3JOdWxsKHRoaXMuX2RhdGVBZGFwdGVyLmRlc2VyaWFsaXplKGUpKX1fc3RhcnRBdDtzdGFydFZpZXc9Im1vbnRoIjtnZXQgY29sb3IoKXtyZXR1cm4gdGhpcy5fY29sb3J8fCh0aGlzLmRhdGVwaWNrZXJJbnB1dD90aGlzLmRhdGVwaWNrZXJJbnB1dC5nZXRUaGVtZVBhbGV0dGUoKTp2b2lkIDApfXNldCBjb2xvcihlKXt0aGlzLl9jb2xvcj1lfV9jb2xvcjt0b3VjaFVpPSExO2dldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZD09PXZvaWQgMCYmdGhpcy5kYXRlcGlja2VySW5wdXQ/dGhpcy5kYXRlcGlja2VySW5wdXQuZGlzYWJsZWQ6ISF0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQoZSl7ZSE9PXRoaXMuX2Rpc2FibGVkJiYodGhpcy5fZGlzYWJsZWQ9ZSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KHZvaWQgMCkpfV9kaXNhYmxlZDt4UG9zaXRpb249InN0YXJ0Ijt5UG9zaXRpb249ImJlbG93IjtyZXN0b3JlRm9jdXM9ITA7eWVhclNlbGVjdGVkPW5ldyBOO21vbnRoU2VsZWN0ZWQ9bmV3IE47dmlld0NoYW5nZWQ9bmV3IE4oITApO2RhdGVDbGFzcztvcGVuZWRTdHJlYW09bmV3IE47Y2xvc2VkU3RyZWFtPW5ldyBOO2dldCBwYW5lbENsYXNzKCl7cmV0dXJuIHRoaXMuX3BhbmVsQ2xhc3N9c2V0IHBhbmVsQ2xhc3MoZSl7dGhpcy5fcGFuZWxDbGFzcz1TbShlKX1fcGFuZWxDbGFzcztnZXQgb3BlbmVkKCl7cmV0dXJuIHRoaXMuX29wZW5lZH1zZXQgb3BlbmVkKGUpe2U/dGhpcy5vcGVuKCk6dGhpcy5jbG9zZSgpfV9vcGVuZWQ9ITE7aWQ9aChxdCkuZ2V0SWQoIm1hdC1kYXRlcGlja2VyLSIpO19nZXRNaW5EYXRlKCl7cmV0dXJuIHRoaXMuZGF0ZXBpY2tlcklucHV0JiZ0aGlzLmRhdGVwaWNrZXJJbnB1dC5taW59X2dldE1heERhdGUoKXtyZXR1cm4gdGhpcy5kYXRlcGlja2VySW5wdXQmJnRoaXMuZGF0ZXBpY2tlcklucHV0Lm1heH1fZ2V0RGF0ZUZpbHRlcigpe3JldHVybiB0aGlzLmRhdGVwaWNrZXJJbnB1dCYmdGhpcy5kYXRlcGlja2VySW5wdXQuZGF0ZUZpbHRlcn1fb3ZlcmxheVJlZjtfY29tcG9uZW50UmVmO19mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW49bnVsbDtfYmFja2Ryb3BIYXJuZXNzQ2xhc3M9YCR7dGhpcy5pZH0tYmFja2Ryb3BgO19hY3Rpb25zUG9ydGFsO2RhdGVwaWNrZXJJbnB1dDtzdGF0ZUNoYW5nZXM9bmV3IHdlO19jaGFuZ2VEZXRlY3RvclJlZj1oKEVlKTtjb25zdHJ1Y3Rvcigpe3RoaXMuX2RhdGVBZGFwdGVyLHRoaXMuX21vZGVsLnNlbGVjdGlvbkNoYW5nZWQuc3Vic2NyaWJlKCgpPT57dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KX1uZ09uQ2hhbmdlcyhlKXtsZXQgaT1lLnhQb3NpdGlvbnx8ZS55UG9zaXRpb247aWYoaSYmIWkuZmlyc3RDaGFuZ2UmJnRoaXMuX292ZXJsYXlSZWYpe2xldCBhPXRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkucG9zaXRpb25TdHJhdGVneTthIGluc3RhbmNlb2Ygd20mJih0aGlzLl9zZXRDb25uZWN0ZWRQb3NpdGlvbnMoYSksdGhpcy5vcGVuZWQmJnRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKSl9dGhpcy5zdGF0ZUNoYW5nZXMubmV4dCh2b2lkIDApfW5nT25EZXN0cm95KCl7dGhpcy5fZGVzdHJveU92ZXJsYXkoKSx0aGlzLmNsb3NlKCksdGhpcy5faW5wdXRTdGF0ZUNoYW5nZXMudW5zdWJzY3JpYmUoKSx0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpfXNlbGVjdChlKXt0aGlzLl9tb2RlbC5hZGQoZSl9X3NlbGVjdFllYXIoZSl7dGhpcy55ZWFyU2VsZWN0ZWQuZW1pdChlKX1fc2VsZWN0TW9udGgoZSl7dGhpcy5tb250aFNlbGVjdGVkLmVtaXQoZSl9X3ZpZXdDaGFuZ2VkKGUpe3RoaXMudmlld0NoYW5nZWQuZW1pdChlKX1yZWdpc3RlcklucHV0KGUpe3JldHVybiB0aGlzLmRhdGVwaWNrZXJJbnB1dCx0aGlzLl9pbnB1dFN0YXRlQ2hhbmdlcy51bnN1YnNjcmliZSgpLHRoaXMuZGF0ZXBpY2tlcklucHV0PWUsdGhpcy5faW5wdXRTdGF0ZUNoYW5nZXM9ZS5zdGF0ZUNoYW5nZXMuc3Vic2NyaWJlKCgpPT50aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KHZvaWQgMCkpLHRoaXMuX21vZGVsfXJlZ2lzdGVyQWN0aW9ucyhlKXt0aGlzLl9hY3Rpb25zUG9ydGFsLHRoaXMuX2FjdGlvbnNQb3J0YWw9ZSx0aGlzLl9jb21wb25lbnRSZWY/Lmluc3RhbmNlLl9hc3NpZ25BY3Rpb25zKGUsITApfXJlbW92ZUFjdGlvbnMoZSl7ZT09PXRoaXMuX2FjdGlvbnNQb3J0YWwmJih0aGlzLl9hY3Rpb25zUG9ydGFsPW51bGwsdGhpcy5fY29tcG9uZW50UmVmPy5pbnN0YW5jZS5fYXNzaWduQWN0aW9ucyhudWxsLCEwKSl9b3Blbigpe3RoaXMuX29wZW5lZHx8dGhpcy5kaXNhYmxlZHx8dGhpcy5fY29tcG9uZW50UmVmPy5pbnN0YW5jZS5faXNBbmltYXRpbmd8fCh0aGlzLmRhdGVwaWNrZXJJbnB1dCx0aGlzLl9mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW49cWEoKSx0aGlzLl9vcGVuT3ZlcmxheSgpLHRoaXMuX29wZW5lZD0hMCx0aGlzLm9wZW5lZFN0cmVhbS5lbWl0KCkpfWNsb3NlKCl7aWYoIXRoaXMuX29wZW5lZHx8dGhpcy5fY29tcG9uZW50UmVmPy5pbnN0YW5jZS5faXNBbmltYXRpbmcpcmV0dXJuO2xldCBlPXRoaXMucmVzdG9yZUZvY3VzJiZ0aGlzLl9mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW4mJnR5cGVvZiB0aGlzLl9mb2N1c2VkRWxlbWVudEJlZm9yZU9wZW4uZm9jdXM9PSJmdW5jdGlvbiIsaT0oKT0+e3RoaXMuX29wZW5lZCYmKHRoaXMuX29wZW5lZD0hMSx0aGlzLmNsb3NlZFN0cmVhbS5lbWl0KCkpfTtpZih0aGlzLl9jb21wb25lbnRSZWYpe2xldHtpbnN0YW5jZTphLGxvY2F0aW9uOnJ9PXRoaXMuX2NvbXBvbmVudFJlZjthLl9hbmltYXRpb25Eb25lLnBpcGUoajEoMSkpLnN1YnNjcmliZSgoKT0+e2xldCBvPXRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7ZSYmKCFvfHxvPT09dGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudHx8ci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKG8pKSYmdGhpcy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuLmZvY3VzKCksdGhpcy5fZm9jdXNlZEVsZW1lbnRCZWZvcmVPcGVuPW51bGwsdGhpcy5fZGVzdHJveU92ZXJsYXkoKX0pLGEuX3N0YXJ0RXhpdEFuaW1hdGlvbigpfWU/c2V0VGltZW91dChpKTppKCl9X2FwcGx5UGVuZGluZ1NlbGVjdGlvbigpe3RoaXMuX2NvbXBvbmVudFJlZj8uaW5zdGFuY2U/Ll9hcHBseVBlbmRpbmdTZWxlY3Rpb24oKX1fZm9yd2FyZENvbnRlbnRWYWx1ZXMoZSl7ZS5kYXRlcGlja2VyPXRoaXMsZS5jb2xvcj10aGlzLmNvbG9yLGUuX2RpYWxvZ0xhYmVsSWQ9dGhpcy5kYXRlcGlja2VySW5wdXQuZ2V0T3ZlcmxheUxhYmVsSWQoKSxlLl9hc3NpZ25BY3Rpb25zKHRoaXMuX2FjdGlvbnNQb3J0YWwsITEpfV9vcGVuT3ZlcmxheSgpe3RoaXMuX2Rlc3Ryb3lPdmVybGF5KCk7bGV0IGU9dGhpcy50b3VjaFVpLGk9bmV3IGphKHVnLHRoaXMuX3ZpZXdDb250YWluZXJSZWYpLGE9dGhpcy5fb3ZlcmxheVJlZj11YSh0aGlzLl9pbmplY3RvcixuZXcgSW4oe3Bvc2l0aW9uU3RyYXRlZ3k6ZT90aGlzLl9nZXREaWFsb2dTdHJhdGVneSgpOnRoaXMuX2dldERyb3Bkb3duU3RyYXRlZ3koKSxoYXNCYWNrZHJvcDohMCxiYWNrZHJvcENsYXNzOltlPyJjZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wIjoibWF0LW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AiLHRoaXMuX2JhY2tkcm9wSGFybmVzc0NsYXNzXSxkaXJlY3Rpb246dGhpcy5fZGlyfHwibHRyIixzY3JvbGxTdHJhdGVneTplP0NyKHRoaXMuX2luamVjdG9yKTp0aGlzLl9zY3JvbGxTdHJhdGVneSgpLHBhbmVsQ2xhc3M6YG1hdC1kYXRlcGlja2VyLSR7ZT8iZGlhbG9nIjoicG9wdXAifWAsZGlzYWJsZUFuaW1hdGlvbnM6dGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkfSkpO3RoaXMuX2dldENsb3NlU3RyZWFtKGEpLnN1YnNjcmliZShyPT57ciYmci5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2xvc2UoKX0pLGEua2V5ZG93bkV2ZW50cygpLnN1YnNjcmliZShyPT57bGV0IG89ci5rZXlDb2RlOyhvPT09Mzh8fG89PT00MHx8bz09PTM3fHxvPT09Mzl8fG89PT0zM3x8bz09PTM0KSYmci5wcmV2ZW50RGVmYXVsdCgpfSksdGhpcy5fY29tcG9uZW50UmVmPWEuYXR0YWNoKGkpLHRoaXMuX2ZvcndhcmRDb250ZW50VmFsdWVzKHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZSksZXx8bTEoKCk9PnthLnVwZGF0ZVBvc2l0aW9uKCl9LHtpbmplY3Rvcjp0aGlzLl9pbmplY3Rvcn0pfV9kZXN0cm95T3ZlcmxheSgpe3RoaXMuX292ZXJsYXlSZWYmJih0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKSx0aGlzLl9vdmVybGF5UmVmPXRoaXMuX2NvbXBvbmVudFJlZj1udWxsKX1fZ2V0RGlhbG9nU3RyYXRlZ3koKXtyZXR1cm4geXIodGhpcy5faW5qZWN0b3IpLmNlbnRlckhvcml6b250YWxseSgpLmNlbnRlclZlcnRpY2FsbHkoKX1fZ2V0RHJvcGRvd25TdHJhdGVneSgpe2xldCBlPUxuKHRoaXMuX2luamVjdG9yLHRoaXMuZGF0ZXBpY2tlcklucHV0LmdldENvbm5lY3RlZE92ZXJsYXlPcmlnaW4oKSkud2l0aFRyYW5zZm9ybU9yaWdpbk9uKCIubWF0LWRhdGVwaWNrZXItY29udGVudCIpLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoITEpLndpdGhWaWV3cG9ydE1hcmdpbig4KS53aXRoTG9ja2VkUG9zaXRpb24oKTtyZXR1cm4gdGhpcy5fc2V0Q29ubmVjdGVkUG9zaXRpb25zKGUpfV9zZXRDb25uZWN0ZWRQb3NpdGlvbnMoZSl7bGV0IGk9dGhpcy54UG9zaXRpb249PT0iZW5kIj8iZW5kIjoic3RhcnQiLGE9aT09PSJzdGFydCI/ImVuZCI6InN0YXJ0IixyPXRoaXMueVBvc2l0aW9uPT09ImFib3ZlIj8iYm90dG9tIjoidG9wIixvPXI9PT0idG9wIj8iYm90dG9tIjoidG9wIjtyZXR1cm4gZS53aXRoUG9zaXRpb25zKFt7b3JpZ2luWDppLG9yaWdpblk6byxvdmVybGF5WDppLG92ZXJsYXlZOnJ9LHtvcmlnaW5YOmksb3JpZ2luWTpyLG92ZXJsYXlYOmksb3ZlcmxheVk6b30se29yaWdpblg6YSxvcmlnaW5ZOm8sb3ZlcmxheVg6YSxvdmVybGF5WTpyfSx7b3JpZ2luWDphLG9yaWdpblk6cixvdmVybGF5WDphLG92ZXJsYXlZOm99XSl9X2dldENsb3NlU3RyZWFtKGUpe2xldCBpPVsiY3RybEtleSIsInNoaWZ0S2V5IiwibWV0YUtleSJdO3JldHVybiBLdChlLmJhY2tkcm9wQ2xpY2soKSxlLmRldGFjaG1lbnRzKCksZS5rZXlkb3duRXZlbnRzKCkucGlwZSgkdChhPT5hLmtleUNvZGU9PT0yNyYmIXMxKGEpfHx0aGlzLmRhdGVwaWNrZXJJbnB1dCYmczEoYSwiYWx0S2V5IikmJmEua2V5Q29kZT09PTM4JiZpLmV2ZXJ5KHI9PiFzMShhLHIpKSkpKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LGlucHV0czp7Y2FsZW5kYXJIZWFkZXJDb21wb25lbnQ6ImNhbGVuZGFySGVhZGVyQ29tcG9uZW50IixzdGFydEF0OiJzdGFydEF0IixzdGFydFZpZXc6InN0YXJ0VmlldyIsY29sb3I6ImNvbG9yIix0b3VjaFVpOlsyLCJ0b3VjaFVpIiwidG91Y2hVaSIsWl0sZGlzYWJsZWQ6WzIsImRpc2FibGVkIiwiZGlzYWJsZWQiLFpdLHhQb3NpdGlvbjoieFBvc2l0aW9uIix5UG9zaXRpb246InlQb3NpdGlvbiIscmVzdG9yZUZvY3VzOlsyLCJyZXN0b3JlRm9jdXMiLCJyZXN0b3JlRm9jdXMiLFpdLGRhdGVDbGFzczoiZGF0ZUNsYXNzIixwYW5lbENsYXNzOiJwYW5lbENsYXNzIixvcGVuZWQ6WzIsIm9wZW5lZCIsIm9wZW5lZCIsWl19LG91dHB1dHM6e3llYXJTZWxlY3RlZDoieWVhclNlbGVjdGVkIixtb250aFNlbGVjdGVkOiJtb250aFNlbGVjdGVkIix2aWV3Q2hhbmdlZDoidmlld0NoYW5nZWQiLG9wZW5lZFN0cmVhbToib3BlbmVkIixjbG9zZWRTdHJlYW06ImNsb3NlZCJ9LGZlYXR1cmVzOltIZV19KX1yZXR1cm4gdH0pKCksZ2c9KCgpPT57Y2xhc3MgdCBleHRlbmRzIGNne3N0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IGU7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybihlfHwoZT1rdCh0KSkpKGF8fHQpfX0pKCk7c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1kYXRlcGlja2VyIl1dLGV4cG9ydEFzOlsibWF0RGF0ZXBpY2tlciJdLGZlYXR1cmVzOltJZShbbGcse3Byb3ZpZGU6Y2csdXNlRXhpc3Rpbmc6dH1dKSxGZV0sZGVjbHM6MCx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXt9LGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxvbz1jbGFzc3t0YXJnZXQ7dGFyZ2V0RWxlbWVudDt2YWx1ZTtjb25zdHJ1Y3RvcihuLGUpe3RoaXMudGFyZ2V0PW4sdGhpcy50YXJnZXRFbGVtZW50PWUsdGhpcy52YWx1ZT10aGlzLnRhcmdldC52YWx1ZX19LHBMPSgoKT0+e2NsYXNzIHR7X2VsZW1lbnRSZWY9aChhZSk7X2RhdGVBZGFwdGVyPWgoa2kse29wdGlvbmFsOiEwfSk7X2RhdGVGb3JtYXRzPWgoYW4se29wdGlvbmFsOiEwfSk7X2lzSW5pdGlhbGl6ZWQ7Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX21vZGVsP3RoaXMuX2dldFZhbHVlRnJvbU1vZGVsKHRoaXMuX21vZGVsLnNlbGVjdGlvbik6dGhpcy5fcGVuZGluZ1ZhbHVlfXNldCB2YWx1ZShlKXt0aGlzLl9hc3NpZ25WYWx1ZVByb2dyYW1tYXRpY2FsbHkoZSl9X21vZGVsO2dldCBkaXNhYmxlZCgpe3JldHVybiEhdGhpcy5fZGlzYWJsZWR8fHRoaXMuX3BhcmVudERpc2FibGVkKCl9c2V0IGRpc2FibGVkKGUpe2xldCBpPWUsYT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7dGhpcy5fZGlzYWJsZWQhPT1pJiYodGhpcy5fZGlzYWJsZWQ9aSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KHZvaWQgMCkpLGkmJnRoaXMuX2lzSW5pdGlhbGl6ZWQmJmEuYmx1ciYmYS5ibHVyKCl9X2Rpc2FibGVkO2RhdGVDaGFuZ2U9bmV3IE47ZGF0ZUlucHV0PW5ldyBOO3N0YXRlQ2hhbmdlcz1uZXcgd2U7X29uVG91Y2hlZD0oKT0+e307X3ZhbGlkYXRvck9uQ2hhbmdlPSgpPT57fTtfY3ZhT25DaGFuZ2U9KCk9Pnt9O192YWx1ZUNoYW5nZXNTdWJzY3JpcHRpb249bzEuRU1QVFk7X2xvY2FsZVN1YnNjcmlwdGlvbj1vMS5FTVBUWTtfcGVuZGluZ1ZhbHVlO19wYXJzZVZhbGlkYXRvcj0oKT0+dGhpcy5fbGFzdFZhbHVlVmFsaWQ/bnVsbDp7bWF0RGF0ZXBpY2tlclBhcnNlOnt0ZXh0OnRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZX19O19maWx0ZXJWYWxpZGF0b3I9ZT0+e2xldCBpPXRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlLnZhbHVlKSk7cmV0dXJuIWl8fHRoaXMuX21hdGNoZXNGaWx0ZXIoaSk/bnVsbDp7bWF0RGF0ZXBpY2tlckZpbHRlcjohMH19O19taW5WYWxpZGF0b3I9ZT0+e2xldCBpPXRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlLnZhbHVlKSksYT10aGlzLl9nZXRNaW5EYXRlKCk7cmV0dXJuIWF8fCFpfHx0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShhLGkpPD0wP251bGw6e21hdERhdGVwaWNrZXJNaW46e21pbjphLGFjdHVhbDppfX19O19tYXhWYWxpZGF0b3I9ZT0+e2xldCBpPXRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlLnZhbHVlKSksYT10aGlzLl9nZXRNYXhEYXRlKCk7cmV0dXJuIWF8fCFpfHx0aGlzLl9kYXRlQWRhcHRlci5jb21wYXJlRGF0ZShhLGkpPj0wP251bGw6e21hdERhdGVwaWNrZXJNYXg6e21heDphLGFjdHVhbDppfX19O19nZXRWYWxpZGF0b3JzKCl7cmV0dXJuW3RoaXMuX3BhcnNlVmFsaWRhdG9yLHRoaXMuX21pblZhbGlkYXRvcix0aGlzLl9tYXhWYWxpZGF0b3IsdGhpcy5fZmlsdGVyVmFsaWRhdG9yXX1fcmVnaXN0ZXJNb2RlbChlKXt0aGlzLl9tb2RlbD1lLHRoaXMuX3ZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3BlbmRpbmdWYWx1ZSYmdGhpcy5fYXNzaWduVmFsdWUodGhpcy5fcGVuZGluZ1ZhbHVlKSx0aGlzLl92YWx1ZUNoYW5nZXNTdWJzY3JpcHRpb249dGhpcy5fbW9kZWwuc2VsZWN0aW9uQ2hhbmdlZC5zdWJzY3JpYmUoaT0+e2lmKHRoaXMuX3Nob3VsZEhhbmRsZUNoYW5nZUV2ZW50KGkpKXtsZXQgYT10aGlzLl9nZXRWYWx1ZUZyb21Nb2RlbChpLnNlbGVjdGlvbik7dGhpcy5fbGFzdFZhbHVlVmFsaWQ9dGhpcy5faXNWYWxpZFZhbHVlKGEpLHRoaXMuX2N2YU9uQ2hhbmdlKGEpLHRoaXMuX29uVG91Y2hlZCgpLHRoaXMuX2Zvcm1hdFZhbHVlKGEpLHRoaXMuZGF0ZUlucHV0LmVtaXQobmV3IG9vKHRoaXMsdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSksdGhpcy5kYXRlQ2hhbmdlLmVtaXQobmV3IG9vKHRoaXMsdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSl9fSl9X2xhc3RWYWx1ZVZhbGlkPSExO2NvbnN0cnVjdG9yKCl7dGhpcy5fbG9jYWxlU3Vic2NyaXB0aW9uPXRoaXMuX2RhdGVBZGFwdGVyLmxvY2FsZUNoYW5nZXMuc3Vic2NyaWJlKCgpPT57dGhpcy5fYXNzaWduVmFsdWVQcm9ncmFtbWF0aWNhbGx5KHRoaXMudmFsdWUpfSl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5faXNJbml0aWFsaXplZD0hMH1uZ09uQ2hhbmdlcyhlKXtmTChlLHRoaXMuX2RhdGVBZGFwdGVyKSYmdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCh2b2lkIDApfW5nT25EZXN0cm95KCl7dGhpcy5fdmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fbG9jYWxlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKX1yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGUpe3RoaXMuX3ZhbGlkYXRvck9uQ2hhbmdlPWV9dmFsaWRhdGUoZSl7cmV0dXJuIHRoaXMuX3ZhbGlkYXRvcj90aGlzLl92YWxpZGF0b3IoZSk6bnVsbH13cml0ZVZhbHVlKGUpe3RoaXMuX2Fzc2lnblZhbHVlUHJvZ3JhbW1hdGljYWxseShlKX1yZWdpc3Rlck9uQ2hhbmdlKGUpe3RoaXMuX2N2YU9uQ2hhbmdlPWV9cmVnaXN0ZXJPblRvdWNoZWQoZSl7dGhpcy5fb25Ub3VjaGVkPWV9c2V0RGlzYWJsZWRTdGF0ZShlKXt0aGlzLmRpc2FibGVkPWV9X29uS2V5ZG93bihlKXtsZXQgaT1bImN0cmxLZXkiLCJzaGlmdEtleSIsIm1ldGFLZXkiXTtzMShlLCJhbHRLZXkiKSYmZS5rZXlDb2RlPT09NDAmJmkuZXZlcnkocj0+IXMxKGUscikpJiYhdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnJlYWRPbmx5JiYodGhpcy5fb3BlblBvcHVwKCksZS5wcmV2ZW50RGVmYXVsdCgpKX1fb25JbnB1dChlKXtsZXQgaT1lLnRhcmdldC52YWx1ZSxhPXRoaXMuX2xhc3RWYWx1ZVZhbGlkLHI9dGhpcy5fZGF0ZUFkYXB0ZXIucGFyc2UoaSx0aGlzLl9kYXRlRm9ybWF0cy5wYXJzZS5kYXRlSW5wdXQpO3RoaXMuX2xhc3RWYWx1ZVZhbGlkPXRoaXMuX2lzVmFsaWRWYWx1ZShyKSxyPXRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbChyKTtsZXQgbz0hdGhpcy5fZGF0ZUFkYXB0ZXIuc2FtZURhdGUocix0aGlzLnZhbHVlKTshcnx8bz90aGlzLl9jdmFPbkNoYW5nZShyKTooaSYmIXRoaXMudmFsdWUmJnRoaXMuX2N2YU9uQ2hhbmdlKHIpLGEhPT10aGlzLl9sYXN0VmFsdWVWYWxpZCYmdGhpcy5fdmFsaWRhdG9yT25DaGFuZ2UoKSksbyYmKHRoaXMuX2Fzc2lnblZhbHVlKHIpLHRoaXMuZGF0ZUlucHV0LmVtaXQobmV3IG9vKHRoaXMsdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSkpfV9vbkNoYW5nZSgpe3RoaXMuZGF0ZUNoYW5nZS5lbWl0KG5ldyBvbyh0aGlzLHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkpfV9vbkJsdXIoKXt0aGlzLnZhbHVlJiZ0aGlzLl9mb3JtYXRWYWx1ZSh0aGlzLnZhbHVlKSx0aGlzLl9vblRvdWNoZWQoKX1fZm9ybWF0VmFsdWUoZSl7dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlPWUhPW51bGw/dGhpcy5fZGF0ZUFkYXB0ZXIuZm9ybWF0KGUsdGhpcy5fZGF0ZUZvcm1hdHMuZGlzcGxheS5kYXRlSW5wdXQpOiIifV9hc3NpZ25WYWx1ZShlKXt0aGlzLl9tb2RlbD8odGhpcy5fYXNzaWduVmFsdWVUb01vZGVsKGUpLHRoaXMuX3BlbmRpbmdWYWx1ZT1udWxsKTp0aGlzLl9wZW5kaW5nVmFsdWU9ZX1faXNWYWxpZFZhbHVlKGUpe3JldHVybiFlfHx0aGlzLl9kYXRlQWRhcHRlci5pc1ZhbGlkKGUpfV9wYXJlbnREaXNhYmxlZCgpe3JldHVybiExfV9hc3NpZ25WYWx1ZVByb2dyYW1tYXRpY2FsbHkoZSl7ZT10aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlKSx0aGlzLl9sYXN0VmFsdWVWYWxpZD10aGlzLl9pc1ZhbGlkVmFsdWUoZSksZT10aGlzLl9kYXRlQWRhcHRlci5nZXRWYWxpZERhdGVPck51bGwoZSksdGhpcy5fYXNzaWduVmFsdWUoZSksdGhpcy5fZm9ybWF0VmFsdWUoZSl9X21hdGNoZXNGaWx0ZXIoZSl7bGV0IGk9dGhpcy5fZ2V0RGF0ZUZpbHRlcigpO3JldHVybiFpfHxpKGUpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsaW5wdXRzOnt2YWx1ZToidmFsdWUiLGRpc2FibGVkOlsyLCJkaXNhYmxlZCIsImRpc2FibGVkIixaXX0sb3V0cHV0czp7ZGF0ZUNoYW5nZToiZGF0ZUNoYW5nZSIsZGF0ZUlucHV0OiJkYXRlSW5wdXQifSxmZWF0dXJlczpbSGVdfSl9cmV0dXJuIHR9KSgpO3VMPXtwcm92aWRlOmYyLHVzZUV4aXN0aW5nOmhpKCgpPT4kMyksbXVsdGk6ITB9LGdMPXtwcm92aWRlOndyLHVzZUV4aXN0aW5nOmhpKCgpPT4kMyksbXVsdGk6ITB9LCQzPSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBwTHtfZm9ybUZpZWxkPWgoVjAse29wdGlvbmFsOiEwfSk7X2Nsb3NlZFN1YnNjcmlwdGlvbj1vMS5FTVBUWTtfb3BlbmVkU3Vic2NyaXB0aW9uPW8xLkVNUFRZO3NldCBtYXREYXRlcGlja2VyKGUpe2UmJih0aGlzLl9kYXRlcGlja2VyPWUsdGhpcy5fYXJpYU93bnMuc2V0KGUub3BlbmVkP2UuaWQ6bnVsbCksdGhpcy5fY2xvc2VkU3Vic2NyaXB0aW9uPWUuY2xvc2VkU3RyZWFtLnN1YnNjcmliZSgoKT0+e3RoaXMuX29uVG91Y2hlZCgpLHRoaXMuX2FyaWFPd25zLnNldChudWxsKX0pLHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbj1lLm9wZW5lZFN0cmVhbS5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9hcmlhT3ducy5zZXQoZS5pZCl9KSx0aGlzLl9yZWdpc3Rlck1vZGVsKGUucmVnaXN0ZXJJbnB1dCh0aGlzKSkpfV9kYXRlcGlja2VyO19hcmlhT3ducz1mdChudWxsKTtnZXQgbWluKCl7cmV0dXJuIHRoaXMuX21pbn1zZXQgbWluKGUpe2xldCBpPXRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlKSk7dGhpcy5fZGF0ZUFkYXB0ZXIuc2FtZURhdGUoaSx0aGlzLl9taW4pfHwodGhpcy5fbWluPWksdGhpcy5fdmFsaWRhdG9yT25DaGFuZ2UoKSl9X21pbjtnZXQgbWF4KCl7cmV0dXJuIHRoaXMuX21heH1zZXQgbWF4KGUpe2xldCBpPXRoaXMuX2RhdGVBZGFwdGVyLmdldFZhbGlkRGF0ZU9yTnVsbCh0aGlzLl9kYXRlQWRhcHRlci5kZXNlcmlhbGl6ZShlKSk7dGhpcy5fZGF0ZUFkYXB0ZXIuc2FtZURhdGUoaSx0aGlzLl9tYXgpfHwodGhpcy5fbWF4PWksdGhpcy5fdmFsaWRhdG9yT25DaGFuZ2UoKSl9X21heDtnZXQgZGF0ZUZpbHRlcigpe3JldHVybiB0aGlzLl9kYXRlRmlsdGVyfXNldCBkYXRlRmlsdGVyKGUpe2xldCBpPXRoaXMuX21hdGNoZXNGaWx0ZXIodGhpcy52YWx1ZSk7dGhpcy5fZGF0ZUZpbHRlcj1lLHRoaXMuX21hdGNoZXNGaWx0ZXIodGhpcy52YWx1ZSkhPT1pJiZ0aGlzLl92YWxpZGF0b3JPbkNoYW5nZSgpfV9kYXRlRmlsdGVyO192YWxpZGF0b3I7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX3ZhbGlkYXRvcj1KLmNvbXBvc2Uoc3VwZXIuX2dldFZhbGlkYXRvcnMoKSl9Z2V0Q29ubmVjdGVkT3ZlcmxheU9yaWdpbigpe3JldHVybiB0aGlzLl9mb3JtRmllbGQ/dGhpcy5fZm9ybUZpZWxkLmdldENvbm5lY3RlZE92ZXJsYXlPcmlnaW4oKTp0aGlzLl9lbGVtZW50UmVmfWdldE92ZXJsYXlMYWJlbElkKCl7cmV0dXJuIHRoaXMuX2Zvcm1GaWVsZD90aGlzLl9mb3JtRmllbGQuZ2V0TGFiZWxJZCgpOnRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIpfWdldFRoZW1lUGFsZXR0ZSgpe3JldHVybiB0aGlzLl9mb3JtRmllbGQ/dGhpcy5fZm9ybUZpZWxkLmNvbG9yOnZvaWQgMH1nZXRTdGFydFZhbHVlKCl7cmV0dXJuIHRoaXMudmFsdWV9bmdPbkRlc3Ryb3koKXtzdXBlci5uZ09uRGVzdHJveSgpLHRoaXMuX2Nsb3NlZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX29wZW5lZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfV9vcGVuUG9wdXAoKXt0aGlzLl9kYXRlcGlja2VyJiZ0aGlzLl9kYXRlcGlja2VyLm9wZW4oKX1fZ2V0VmFsdWVGcm9tTW9kZWwoZSl7cmV0dXJuIGV9X2Fzc2lnblZhbHVlVG9Nb2RlbChlKXt0aGlzLl9tb2RlbCYmdGhpcy5fbW9kZWwudXBkYXRlU2VsZWN0aW9uKGUsdGhpcyl9X2dldE1pbkRhdGUoKXtyZXR1cm4gdGhpcy5fbWlufV9nZXRNYXhEYXRlKCl7cmV0dXJuIHRoaXMuX21heH1fZ2V0RGF0ZUZpbHRlcigpe3JldHVybiB0aGlzLl9kYXRlRmlsdGVyfV9zaG91bGRIYW5kbGVDaGFuZ2VFdmVudChlKXtyZXR1cm4gZS5zb3VyY2UhPT10aGlzfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbImlucHV0IiwibWF0RGF0ZXBpY2tlciIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1kYXRlcGlja2VyLWlucHV0Il0saG9zdFZhcnM6Nixob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjEmJlMoImlucHV0IixmdW5jdGlvbihvKXtyZXR1cm4gYS5fb25JbnB1dChvKX0pKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7cmV0dXJuIGEuX29uQ2hhbmdlKCl9KSgiYmx1ciIsZnVuY3Rpb24oKXtyZXR1cm4gYS5fb25CbHVyKCl9KSgia2V5ZG93biIsZnVuY3Rpb24obyl7cmV0dXJuIGEuX29uS2V5ZG93bihvKX0pLGkmMiYmKEFpKCJkaXNhYmxlZCIsYS5kaXNhYmxlZCksRygiYXJpYS1oYXNwb3B1cCIsYS5fZGF0ZXBpY2tlcj8iZGlhbG9nIjpudWxsKSgiYXJpYS1vd25zIixhLl9hcmlhT3ducygpKSgibWluIixhLm1pbj9hLl9kYXRlQWRhcHRlci50b0lzbzg2MDEoYS5taW4pOm51bGwpKCJtYXgiLGEubWF4P2EuX2RhdGVBZGFwdGVyLnRvSXNvODYwMShhLm1heCk6bnVsbCkoImRhdGEtbWF0LWNhbGVuZGFyIixhLl9kYXRlcGlja2VyP2EuX2RhdGVwaWNrZXIuaWQ6bnVsbCkpfSxpbnB1dHM6e21hdERhdGVwaWNrZXI6Im1hdERhdGVwaWNrZXIiLG1pbjoibWluIixtYXg6Im1heCIsZGF0ZUZpbHRlcjpbMCwibWF0RGF0ZXBpY2tlckZpbHRlciIsImRhdGVGaWx0ZXIiXX0sZXhwb3J0QXM6WyJtYXREYXRlcGlja2VySW5wdXQiXSxmZWF0dXJlczpbSWUoW3VMLGdMLHtwcm92aWRlOkhtLHVzZUV4aXN0aW5nOnR9XSksRmVdfSl9cmV0dXJuIHR9KSgpLHZMPSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siIiwibWF0RGF0ZXBpY2tlclRvZ2dsZUljb24iLCIiXV19KX1yZXR1cm4gdH0pKCksSzg9KCgpPT57Y2xhc3MgdHtfaW50bD1oKHNvKTtfY2hhbmdlRGV0ZWN0b3JSZWY9aChFZSk7X3N0YXRlQ2hhbmdlcz1vMS5FTVBUWTtkYXRlcGlja2VyO3RhYkluZGV4O2FyaWFMYWJlbDtnZXQgZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWQ9PT12b2lkIDAmJnRoaXMuZGF0ZXBpY2tlcj90aGlzLmRhdGVwaWNrZXIuZGlzYWJsZWQ6ISF0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQoZSl7dGhpcy5fZGlzYWJsZWQ9ZX1fZGlzYWJsZWQ7ZGlzYWJsZVJpcHBsZTtfY3VzdG9tSWNvbjtfYnV0dG9uO2NvbnN0cnVjdG9yKCl7bGV0IGU9aChuZXcgcGkoInRhYmluZGV4Iikse29wdGlvbmFsOiEwfSksaT1OdW1iZXIoZSk7dGhpcy50YWJJbmRleD1pfHxpPT09MD9pOm51bGx9bmdPbkNoYW5nZXMoZSl7ZS5kYXRlcGlja2VyJiZ0aGlzLl93YXRjaFN0YXRlQ2hhbmdlcygpfW5nT25EZXN0cm95KCl7dGhpcy5fc3RhdGVDaGFuZ2VzLnVuc3Vic2NyaWJlKCl9bmdBZnRlckNvbnRlbnRJbml0KCl7dGhpcy5fd2F0Y2hTdGF0ZUNoYW5nZXMoKX1fb3BlbihlKXt0aGlzLmRhdGVwaWNrZXImJiF0aGlzLmRpc2FibGVkJiYodGhpcy5kYXRlcGlja2VyLm9wZW4oKSxlLnN0b3BQcm9wYWdhdGlvbigpKX1fd2F0Y2hTdGF0ZUNoYW5nZXMoKXtsZXQgZT10aGlzLmRhdGVwaWNrZXI/dGhpcy5kYXRlcGlja2VyLnN0YXRlQ2hhbmdlczpjMSgpLGk9dGhpcy5kYXRlcGlja2VyJiZ0aGlzLmRhdGVwaWNrZXIuZGF0ZXBpY2tlcklucHV0P3RoaXMuZGF0ZXBpY2tlci5kYXRlcGlja2VySW5wdXQuc3RhdGVDaGFuZ2VzOmMxKCksYT10aGlzLmRhdGVwaWNrZXI/S3QodGhpcy5kYXRlcGlja2VyLm9wZW5lZFN0cmVhbSx0aGlzLmRhdGVwaWNrZXIuY2xvc2VkU3RyZWFtKTpjMSgpO3RoaXMuX3N0YXRlQ2hhbmdlcy51bnN1YnNjcmliZSgpLHRoaXMuX3N0YXRlQ2hhbmdlcz1LdCh0aGlzLl9pbnRsLmNoYW5nZXMsZSxpLGEpLnN1YnNjcmliZSgoKT0+dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1kYXRlcGlja2VyLXRvZ2dsZSJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbihpLGEscil7aWYoaSYxJiZCZShyLHZMLDUpLGkmMil7bGV0IG87RihvPUIoKSkmJihhLl9jdXN0b21JY29uPW8uZmlyc3QpfX0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiZ0ZSh0TCw1KSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5fYnV0dG9uPXIuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtZGF0ZXBpY2tlci10b2dnbGUiXSxob3N0VmFyczo4LGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMSYmUygiY2xpY2siLGZ1bmN0aW9uKG8pe3JldHVybiBhLl9vcGVuKG8pfSksaSYyJiYoRygidGFiaW5kZXgiLG51bGwpKCJkYXRhLW1hdC1jYWxlbmRhciIsYS5kYXRlcGlja2VyP2EuZGF0ZXBpY2tlci5pZDpudWxsKSxpZSgibWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZSIsYS5kYXRlcGlja2VyJiZhLmRhdGVwaWNrZXIub3BlbmVkKSgibWF0LWFjY2VudCIsYS5kYXRlcGlja2VyJiZhLmRhdGVwaWNrZXIuY29sb3I9PT0iYWNjZW50IikoIm1hdC13YXJuIixhLmRhdGVwaWNrZXImJmEuZGF0ZXBpY2tlci5jb2xvcj09PSJ3YXJuIikpfSxpbnB1dHM6e2RhdGVwaWNrZXI6WzAsImZvciIsImRhdGVwaWNrZXIiXSx0YWJJbmRleDoidGFiSW5kZXgiLGFyaWFMYWJlbDpbMCwiYXJpYS1sYWJlbCIsImFyaWFMYWJlbCJdLGRpc2FibGVkOlsyLCJkaXNhYmxlZCIsImRpc2FibGVkIixaXSxkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIn0sZXhwb3J0QXM6WyJtYXREYXRlcGlja2VyVG9nZ2xlIl0sZmVhdHVyZXM6W0hlXSxuZ0NvbnRlbnRTZWxlY3RvcnM6YUwsZGVjbHM6NCx2YXJzOjcsY29uc3RzOltbImJ1dHRvbiIsIiJdLFsibWF0SWNvbkJ1dHRvbiIsIiIsInR5cGUiLCJidXR0b24iLDMsInRhYkluZGV4IiwiZGlzYWJsZWQiLCJkaXNhYmxlUmlwcGxlIl0sWyJ2aWV3Qm94IiwiMCAwIDI0IDI0Iiwid2lkdGgiLCIyNHB4IiwiaGVpZ2h0IiwiMjRweCIsImZpbGwiLCJjdXJyZW50Q29sb3IiLCJmb2N1c2FibGUiLCJmYWxzZSIsImFyaWEtaGlkZGVuIiwidHJ1ZSIsMSwibWF0LWRhdGVwaWNrZXItdG9nZ2xlLWRlZmF1bHQtaWNvbiJdLFsiZCIsIk0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjhoMTR2MTF6TTcgMTBoNXY1SDd6Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoUmUoaUwpLGMoMCwiYnV0dG9uIiwxLDApLE0oMixuTCwyLDAsIjpzdmc6c3ZnIiwyKSxtZSgzKSxzKCkpLGkmMiYmKGYoInRhYkluZGV4IixhLmRpc2FibGVkPy0xOmEudGFiSW5kZXgpKCJkaXNhYmxlZCIsYS5kaXNhYmxlZCkoImRpc2FibGVSaXBwbGUiLGEuZGlzYWJsZVJpcHBsZSksRygiYXJpYS1oYXNwb3B1cCIsYS5kYXRlcGlja2VyPyJkaWFsb2ciOm51bGwpKCJhcmlhLWxhYmVsIixhLmFyaWFMYWJlbHx8YS5faW50bC5vcGVuQ2FsZW5kYXJMYWJlbCkoImFyaWEtZXhwYW5kZWQiLGEuZGF0ZXBpY2tlcj9hLmRhdGVwaWNrZXIub3BlbmVkOm51bGwpLGwoMiksdyhhLl9jdXN0b21JY29uPy0xOjIpKX0sZGVwZW5kZW5jaWVzOltsMV0sc3R5bGVzOltgLm1hdC1kYXRlcGlja2VyLXRvZ2dsZXtwb2ludGVyLWV2ZW50czphdXRvO2NvbG9yOnZhcigtLW1hdC1kYXRlcGlja2VyLXRvZ2dsZS1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUgYnV0dG9ue2NvbG9yOmluaGVyaXR9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmV7Y29sb3I6dmFyKC0tbWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS1zdGF0ZS1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWRlZmF1bHQtaWNvbntjb2xvcjpDYW52YXNUZXh0fX0KYF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSl9cmV0dXJuIHR9KSgpLHZnPSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1bW9kPXhlKHt0eXBlOnR9KTtzdGF0aWMgXHUwMjc1aW5qPXllKHtwcm92aWRlcnM6W3NvLGhMXSxpbXBvcnRzOltvZSxCaSxHYSxmYSx6ZSx1ZyxLOCxwZyxYaV19KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBiZygpe3JldHVybntjb2xvcjoiYWNjZW50IixjbGlja0FjdGlvbjoiY2hlY2staW5kZXRlcm1pbmF0ZSIsZGlzYWJsZWRJbnRlcmFjdGl2ZTohMX19dmFyIF9MLGJMLENMLHlMLHppLEo4LF9nLGs0LENnLEszPXgoKCk9Pnt4aSgpO2soKTtrKCk7V2UoKTtBMigpO3czKCk7ZmkoKTtJMigpO0syKCk7eTEoKTtfTD1bImlucHV0Il0sYkw9WyJsYWJlbCJdLENMPVsiKiJdLHlMPW5ldyBjZSgibWF0LWNoZWNrYm94LWRlZmF1bHQtb3B0aW9ucyIse3Byb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6Ymd9KTt6aT0oZnVuY3Rpb24odCl7cmV0dXJuIHRbdC5Jbml0PTBdPSJJbml0Iix0W3QuQ2hlY2tlZD0xXT0iQ2hlY2tlZCIsdFt0LlVuY2hlY2tlZD0yXT0iVW5jaGVja2VkIix0W3QuSW5kZXRlcm1pbmF0ZT0zXT0iSW5kZXRlcm1pbmF0ZSIsdH0pKHppfHx7fSksSjg9Y2xhc3N7c291cmNlO2NoZWNrZWR9LF9nPWJnKCksazQ9KCgpPT57Y2xhc3MgdHtfZWxlbWVudFJlZj1oKGFlKTtfY2hhbmdlRGV0ZWN0b3JSZWY9aChFZSk7X25nWm9uZT1oKHJlKTtfYW5pbWF0aW9uc0Rpc2FibGVkPVB0KCk7X29wdGlvbnM9aCh5TCx7b3B0aW9uYWw6ITB9KTtmb2N1cygpe3RoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCl9X2NyZWF0ZUNoYW5nZUV2ZW50KGUpe2xldCBpPW5ldyBKODtyZXR1cm4gaS5zb3VyY2U9dGhpcyxpLmNoZWNrZWQ9ZSxpfV9nZXRBbmltYXRpb25UYXJnZXRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudD8ubmF0aXZlRWxlbWVudH1fYW5pbWF0aW9uQ2xhc3Nlcz17dW5jaGVja2VkVG9DaGVja2VkOiJtZGMtY2hlY2tib3gtLWFuaW0tdW5jaGVja2VkLWNoZWNrZWQiLHVuY2hlY2tlZFRvSW5kZXRlcm1pbmF0ZToibWRjLWNoZWNrYm94LS1hbmltLXVuY2hlY2tlZC1pbmRldGVybWluYXRlIixjaGVja2VkVG9VbmNoZWNrZWQ6Im1kYy1jaGVja2JveC0tYW5pbS1jaGVja2VkLXVuY2hlY2tlZCIsY2hlY2tlZFRvSW5kZXRlcm1pbmF0ZToibWRjLWNoZWNrYm94LS1hbmltLWNoZWNrZWQtaW5kZXRlcm1pbmF0ZSIsaW5kZXRlcm1pbmF0ZVRvQ2hlY2tlZDoibWRjLWNoZWNrYm94LS1hbmltLWluZGV0ZXJtaW5hdGUtY2hlY2tlZCIsaW5kZXRlcm1pbmF0ZVRvVW5jaGVja2VkOiJtZGMtY2hlY2tib3gtLWFuaW0taW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQifTthcmlhTGFiZWw9IiI7YXJpYUxhYmVsbGVkYnk9bnVsbDthcmlhRGVzY3JpYmVkYnk7YXJpYUV4cGFuZGVkO2FyaWFDb250cm9sczthcmlhT3ducztfdW5pcXVlSWQ7aWQ7Z2V0IGlucHV0SWQoKXtyZXR1cm5gJHt0aGlzLmlkfHx0aGlzLl91bmlxdWVJZH0taW5wdXRgfXJlcXVpcmVkO2xhYmVsUG9zaXRpb249ImFmdGVyIjtuYW1lPW51bGw7Y2hhbmdlPW5ldyBOO2luZGV0ZXJtaW5hdGVDaGFuZ2U9bmV3IE47dmFsdWU7ZGlzYWJsZVJpcHBsZTtfaW5wdXRFbGVtZW50O19sYWJlbEVsZW1lbnQ7dGFiSW5kZXg7Y29sb3I7ZGlzYWJsZWRJbnRlcmFjdGl2ZTtfb25Ub3VjaGVkPSgpPT57fTtfY3VycmVudEFuaW1hdGlvbkNsYXNzPSIiO19jdXJyZW50Q2hlY2tTdGF0ZT16aS5Jbml0O19jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuPSgpPT57fTtfdmFsaWRhdG9yQ2hhbmdlRm49KCk9Pnt9O2NvbnN0cnVjdG9yKCl7aChDMSkubG9hZChFMSk7bGV0IGU9aChuZXcgcGkoInRhYmluZGV4Iikse29wdGlvbmFsOiEwfSk7dGhpcy5fb3B0aW9ucz10aGlzLl9vcHRpb25zfHxfZyx0aGlzLmNvbG9yPXRoaXMuX29wdGlvbnMuY29sb3J8fF9nLmNvbG9yLHRoaXMudGFiSW5kZXg9ZT09bnVsbD8wOnBhcnNlSW50KGUpfHwwLHRoaXMuaWQ9dGhpcy5fdW5pcXVlSWQ9aChxdCkuZ2V0SWQoIm1hdC1tZGMtY2hlY2tib3gtIiksdGhpcy5kaXNhYmxlZEludGVyYWN0aXZlPXRoaXMuX29wdGlvbnM/LmRpc2FibGVkSW50ZXJhY3RpdmU/PyExfW5nT25DaGFuZ2VzKGUpe2UucmVxdWlyZWQmJnRoaXMuX3ZhbGlkYXRvckNoYW5nZUZuKCl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fc3luY0luZGV0ZXJtaW5hdGUodGhpcy5pbmRldGVybWluYXRlKX1nZXQgY2hlY2tlZCgpe3JldHVybiB0aGlzLl9jaGVja2VkfXNldCBjaGVja2VkKGUpe2UhPXRoaXMuY2hlY2tlZCYmKHRoaXMuX2NoZWNrZWQ9ZSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9X2NoZWNrZWQ9ITE7Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVkfXNldCBkaXNhYmxlZChlKXtlIT09dGhpcy5kaXNhYmxlZCYmKHRoaXMuX2Rpc2FibGVkPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfV9kaXNhYmxlZD0hMTtnZXQgaW5kZXRlcm1pbmF0ZSgpe3JldHVybiB0aGlzLl9pbmRldGVybWluYXRlKCl9c2V0IGluZGV0ZXJtaW5hdGUoZSl7bGV0IGk9ZSE9dGhpcy5faW5kZXRlcm1pbmF0ZSgpO3RoaXMuX2luZGV0ZXJtaW5hdGUuc2V0KGUpLGkmJihlP3RoaXMuX3RyYW5zaXRpb25DaGVja1N0YXRlKHppLkluZGV0ZXJtaW5hdGUpOnRoaXMuX3RyYW5zaXRpb25DaGVja1N0YXRlKHRoaXMuY2hlY2tlZD96aS5DaGVja2VkOnppLlVuY2hlY2tlZCksdGhpcy5pbmRldGVybWluYXRlQ2hhbmdlLmVtaXQoZSkpLHRoaXMuX3N5bmNJbmRldGVybWluYXRlKGUpfV9pbmRldGVybWluYXRlPWZ0KCExKTtfaXNSaXBwbGVEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVSaXBwbGV8fHRoaXMuZGlzYWJsZWR9X29uTGFiZWxUZXh0Q2hhbmdlKCl7dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpfXdyaXRlVmFsdWUoZSl7dGhpcy5jaGVja2VkPSEhZX1yZWdpc3Rlck9uQ2hhbmdlKGUpe3RoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm49ZX1yZWdpc3Rlck9uVG91Y2hlZChlKXt0aGlzLl9vblRvdWNoZWQ9ZX1zZXREaXNhYmxlZFN0YXRlKGUpe3RoaXMuZGlzYWJsZWQ9ZX12YWxpZGF0ZShlKXtyZXR1cm4gdGhpcy5yZXF1aXJlZCYmZS52YWx1ZSE9PSEwP3tyZXF1aXJlZDohMH06bnVsbH1yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGUpe3RoaXMuX3ZhbGlkYXRvckNoYW5nZUZuPWV9X3RyYW5zaXRpb25DaGVja1N0YXRlKGUpe2xldCBpPXRoaXMuX2N1cnJlbnRDaGVja1N0YXRlLGE9dGhpcy5fZ2V0QW5pbWF0aW9uVGFyZ2V0RWxlbWVudCgpO2lmKCEoaT09PWV8fCFhKSYmKHRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzcyYmYS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzcyksdGhpcy5fY3VycmVudEFuaW1hdGlvbkNsYXNzPXRoaXMuX2dldEFuaW1hdGlvbkNsYXNzRm9yQ2hlY2tTdGF0ZVRyYW5zaXRpb24oaSxlKSx0aGlzLl9jdXJyZW50Q2hlY2tTdGF0ZT1lLHRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzcy5sZW5ndGg+MCkpe2EuY2xhc3NMaXN0LmFkZCh0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MpO2xldCByPXRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzczt0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntzZXRUaW1lb3V0KCgpPT57YS5jbGFzc0xpc3QucmVtb3ZlKHIpfSwxZTMpfSl9fV9lbWl0Q2hhbmdlRXZlbnQoKXt0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuKHRoaXMuY2hlY2tlZCksdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLl9jcmVhdGVDaGFuZ2VFdmVudCh0aGlzLmNoZWNrZWQpKSx0aGlzLl9pbnB1dEVsZW1lbnQmJih0aGlzLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGVja2VkPXRoaXMuY2hlY2tlZCl9dG9nZ2xlKCl7dGhpcy5jaGVja2VkPSF0aGlzLmNoZWNrZWQsdGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLmNoZWNrZWQpfV9oYW5kbGVJbnB1dENsaWNrKCl7bGV0IGU9dGhpcy5fb3B0aW9ucz8uY2xpY2tBY3Rpb247IXRoaXMuZGlzYWJsZWQmJmUhPT0ibm9vcCI/KHRoaXMuaW5kZXRlcm1pbmF0ZSYmZSE9PSJjaGVjayImJlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9Pnt0aGlzLl9pbmRldGVybWluYXRlLnNldCghMSksdGhpcy5pbmRldGVybWluYXRlQ2hhbmdlLmVtaXQoITEpfSksdGhpcy5fY2hlY2tlZD0hdGhpcy5fY2hlY2tlZCx0aGlzLl90cmFuc2l0aW9uQ2hlY2tTdGF0ZSh0aGlzLl9jaGVja2VkP3ppLkNoZWNrZWQ6emkuVW5jaGVja2VkKSx0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKSk6KHRoaXMuZGlzYWJsZWQmJnRoaXMuZGlzYWJsZWRJbnRlcmFjdGl2ZXx8IXRoaXMuZGlzYWJsZWQmJmU9PT0ibm9vcCIpJiYodGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hlY2tlZD10aGlzLmNoZWNrZWQsdGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZT10aGlzLmluZGV0ZXJtaW5hdGUpfV9vbkludGVyYWN0aW9uRXZlbnQoZSl7ZS5zdG9wUHJvcGFnYXRpb24oKX1fb25CbHVyKCl7UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e3RoaXMuX29uVG91Y2hlZCgpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSl9X2dldEFuaW1hdGlvbkNsYXNzRm9yQ2hlY2tTdGF0ZVRyYW5zaXRpb24oZSxpKXtpZih0aGlzLl9hbmltYXRpb25zRGlzYWJsZWQpcmV0dXJuIiI7c3dpdGNoKGUpe2Nhc2UgemkuSW5pdDppZihpPT09emkuQ2hlY2tlZClyZXR1cm4gdGhpcy5fYW5pbWF0aW9uQ2xhc3Nlcy51bmNoZWNrZWRUb0NoZWNrZWQ7aWYoaT09emkuSW5kZXRlcm1pbmF0ZSlyZXR1cm4gdGhpcy5fY2hlY2tlZD90aGlzLl9hbmltYXRpb25DbGFzc2VzLmNoZWNrZWRUb0luZGV0ZXJtaW5hdGU6dGhpcy5fYW5pbWF0aW9uQ2xhc3Nlcy51bmNoZWNrZWRUb0luZGV0ZXJtaW5hdGU7YnJlYWs7Y2FzZSB6aS5VbmNoZWNrZWQ6cmV0dXJuIGk9PT16aS5DaGVja2VkP3RoaXMuX2FuaW1hdGlvbkNsYXNzZXMudW5jaGVja2VkVG9DaGVja2VkOnRoaXMuX2FuaW1hdGlvbkNsYXNzZXMudW5jaGVja2VkVG9JbmRldGVybWluYXRlO2Nhc2UgemkuQ2hlY2tlZDpyZXR1cm4gaT09PXppLlVuY2hlY2tlZD90aGlzLl9hbmltYXRpb25DbGFzc2VzLmNoZWNrZWRUb1VuY2hlY2tlZDp0aGlzLl9hbmltYXRpb25DbGFzc2VzLmNoZWNrZWRUb0luZGV0ZXJtaW5hdGU7Y2FzZSB6aS5JbmRldGVybWluYXRlOnJldHVybiBpPT09emkuQ2hlY2tlZD90aGlzLl9hbmltYXRpb25DbGFzc2VzLmluZGV0ZXJtaW5hdGVUb0NoZWNrZWQ6dGhpcy5fYW5pbWF0aW9uQ2xhc3Nlcy5pbmRldGVybWluYXRlVG9VbmNoZWNrZWR9cmV0dXJuIiJ9X3N5bmNJbmRldGVybWluYXRlKGUpe2xldCBpPXRoaXMuX2lucHV0RWxlbWVudDtpJiYoaS5uYXRpdmVFbGVtZW50LmluZGV0ZXJtaW5hdGU9ZSl9X29uSW5wdXRDbGljaygpe3RoaXMuX2hhbmRsZUlucHV0Q2xpY2soKX1fb25Ub3VjaFRhcmdldENsaWNrKCl7dGhpcy5faGFuZGxlSW5wdXRDbGljaygpLHRoaXMuZGlzYWJsZWR8fHRoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCl9X3ByZXZlbnRCdWJibGluZ0Zyb21MYWJlbChlKXtlLnRhcmdldCYmdGhpcy5fbGFiZWxFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZS50YXJnZXQpJiZlLnN0b3BQcm9wYWdhdGlvbigpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1jaGVja2JveCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJih0ZShfTCw1KSx0ZShiTCw1KSksaSYyKXtsZXQgcjtGKHI9QigpKSYmKGEuX2lucHV0RWxlbWVudD1yLmZpcnN0KSxGKHI9QigpKSYmKGEuX2xhYmVsRWxlbWVudD1yLmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LW1kYy1jaGVja2JveCJdLGhvc3RWYXJzOjE2LGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmKEFpKCJpZCIsYS5pZCksRygidGFiaW5kZXgiLG51bGwpKCJhcmlhLWxhYmVsIixudWxsKSgiYXJpYS1sYWJlbGxlZGJ5IixudWxsKSxEdChhLmNvbG9yPyJtYXQtIithLmNvbG9yOiJtYXQtYWNjZW50IiksaWUoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixhLl9hbmltYXRpb25zRGlzYWJsZWQpKCJtZGMtY2hlY2tib3gtLWRpc2FibGVkIixhLmRpc2FibGVkKSgibWF0LW1kYy1jaGVja2JveC1kaXNhYmxlZCIsYS5kaXNhYmxlZCkoIm1hdC1tZGMtY2hlY2tib3gtY2hlY2tlZCIsYS5jaGVja2VkKSgibWF0LW1kYy1jaGVja2JveC1kaXNhYmxlZC1pbnRlcmFjdGl2ZSIsYS5kaXNhYmxlZEludGVyYWN0aXZlKSl9LGlucHV0czp7YXJpYUxhYmVsOlswLCJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0sYXJpYUxhYmVsbGVkYnk6WzAsImFyaWEtbGFiZWxsZWRieSIsImFyaWFMYWJlbGxlZGJ5Il0sYXJpYURlc2NyaWJlZGJ5OlswLCJhcmlhLWRlc2NyaWJlZGJ5IiwiYXJpYURlc2NyaWJlZGJ5Il0sYXJpYUV4cGFuZGVkOlsyLCJhcmlhLWV4cGFuZGVkIiwiYXJpYUV4cGFuZGVkIixaXSxhcmlhQ29udHJvbHM6WzAsImFyaWEtY29udHJvbHMiLCJhcmlhQ29udHJvbHMiXSxhcmlhT3duczpbMCwiYXJpYS1vd25zIiwiYXJpYU93bnMiXSxpZDoiaWQiLHJlcXVpcmVkOlsyLCJyZXF1aXJlZCIsInJlcXVpcmVkIixaXSxsYWJlbFBvc2l0aW9uOiJsYWJlbFBvc2l0aW9uIixuYW1lOiJuYW1lIix2YWx1ZToidmFsdWUiLGRpc2FibGVSaXBwbGU6WzIsImRpc2FibGVSaXBwbGUiLCJkaXNhYmxlUmlwcGxlIixaXSx0YWJJbmRleDpbMiwidGFiSW5kZXgiLCJ0YWJJbmRleCIsZT0+ZT09bnVsbD92b2lkIDA6b3QoZSldLGNvbG9yOiJjb2xvciIsZGlzYWJsZWRJbnRlcmFjdGl2ZTpbMiwiZGlzYWJsZWRJbnRlcmFjdGl2ZSIsImRpc2FibGVkSW50ZXJhY3RpdmUiLFpdLGNoZWNrZWQ6WzIsImNoZWNrZWQiLCJjaGVja2VkIixaXSxkaXNhYmxlZDpbMiwiZGlzYWJsZWQiLCJkaXNhYmxlZCIsWl0saW5kZXRlcm1pbmF0ZTpbMiwiaW5kZXRlcm1pbmF0ZSIsImluZGV0ZXJtaW5hdGUiLFpdfSxvdXRwdXRzOntjaGFuZ2U6ImNoYW5nZSIsaW5kZXRlcm1pbmF0ZUNoYW5nZToiaW5kZXRlcm1pbmF0ZUNoYW5nZSJ9LGV4cG9ydEFzOlsibWF0Q2hlY2tib3giXSxmZWF0dXJlczpbSWUoW3twcm92aWRlOmYyLHVzZUV4aXN0aW5nOmhpKCgpPT50KSxtdWx0aTohMH0se3Byb3ZpZGU6d3IsdXNlRXhpc3Rpbmc6dCxtdWx0aTohMH1dKSxIZV0sbmdDb250ZW50U2VsZWN0b3JzOkNMLGRlY2xzOjE1LHZhcnM6MjMsY29uc3RzOltbImNoZWNrYm94IiwiIl0sWyJpbnB1dCIsIiJdLFsibGFiZWwiLCIiXSxbIm1hdC1pbnRlcm5hbC1mb3JtLWZpZWxkIiwiIiwzLCJjbGljayIsImxhYmVsUG9zaXRpb24iXSxbMSwibWRjLWNoZWNrYm94Il0sWzEsIm1hdC1tZGMtY2hlY2tib3gtdG91Y2gtdGFyZ2V0IiwzLCJjbGljayJdLFsidHlwZSIsImNoZWNrYm94IiwxLCJtZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sIiwzLCJibHVyIiwiY2xpY2siLCJjaGFuZ2UiLCJjaGVja2VkIiwiaW5kZXRlcm1pbmF0ZSIsImRpc2FibGVkIiwiaWQiLCJyZXF1aXJlZCIsInRhYkluZGV4Il0sWzEsIm1kYy1jaGVja2JveF9fcmlwcGxlIl0sWzEsIm1kYy1jaGVja2JveF9fYmFja2dyb3VuZCJdLFsiZm9jdXNhYmxlIiwiZmFsc2UiLCJ2aWV3Qm94IiwiMCAwIDI0IDI0IiwiYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJtZGMtY2hlY2tib3hfX2NoZWNrbWFyayJdLFsiZmlsbCIsIm5vbmUiLCJkIiwiTTEuNzMsMTIuOTEgOC4xLDE5LjI4IDIyLjc5LDQuNTkiLDEsIm1kYy1jaGVja2JveF9fY2hlY2ttYXJrLXBhdGgiXSxbMSwibWRjLWNoZWNrYm94X19taXhlZG1hcmsiXSxbIm1hdC1yaXBwbGUiLCIiLDEsIm1hdC1tZGMtY2hlY2tib3gtcmlwcGxlIiwibWF0LWZvY3VzLWluZGljYXRvciIsMywibWF0UmlwcGxlVHJpZ2dlciIsIm1hdFJpcHBsZURpc2FibGVkIiwibWF0UmlwcGxlQ2VudGVyZWQiXSxbMSwibWRjLWxhYmVsIiwzLCJmb3IiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtSZSgpLGMoMCwiZGl2IiwzKSxTKCJjbGljayIsZnVuY3Rpb24oZCl7cmV0dXJuIHoociksVChhLl9wcmV2ZW50QnViYmxpbmdGcm9tTGFiZWwoZCkpfSksYygxLCJkaXYiLDQsMCkoMywiZGl2Iiw1KSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuX29uVG91Y2hUYXJnZXRDbGljaygpKX0pLHMoKSxjKDQsImlucHV0Iiw2LDEpLFMoImJsdXIiLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLl9vbkJsdXIoKSl9KSgiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLl9vbklucHV0Q2xpY2soKSl9KSgiY2hhbmdlIixmdW5jdGlvbihkKXtyZXR1cm4geihyKSxUKGEuX29uSW50ZXJhY3Rpb25FdmVudChkKSl9KSxzKCksdSg2LCJkaXYiLDcpLGMoNywiZGl2Iiw4KSxNdCgpLGMoOCwic3ZnIiw5KSx1KDksInBhdGgiLDEwKSxzKCkseWkoKSx1KDEwLCJkaXYiLDExKSxzKCksdSgxMSwiZGl2IiwxMikscygpLGMoMTIsImxhYmVsIiwxMywyKSxtZSgxNCkscygpKCl9aWYoaSYyKXtsZXQgcj1zZSgyKTtmKCJsYWJlbFBvc2l0aW9uIixhLmxhYmVsUG9zaXRpb24pLGwoNCksaWUoIm1kYy1jaGVja2JveC0tc2VsZWN0ZWQiLGEuY2hlY2tlZCksZigiY2hlY2tlZCIsYS5jaGVja2VkKSgiaW5kZXRlcm1pbmF0ZSIsYS5pbmRldGVybWluYXRlKSgiZGlzYWJsZWQiLGEuZGlzYWJsZWQmJiFhLmRpc2FibGVkSW50ZXJhY3RpdmUpKCJpZCIsYS5pbnB1dElkKSgicmVxdWlyZWQiLGEucmVxdWlyZWQpKCJ0YWJJbmRleCIsYS5kaXNhYmxlZCYmIWEuZGlzYWJsZWRJbnRlcmFjdGl2ZT8tMTphLnRhYkluZGV4KSxHKCJhcmlhLWxhYmVsIixhLmFyaWFMYWJlbHx8bnVsbCkoImFyaWEtbGFiZWxsZWRieSIsYS5hcmlhTGFiZWxsZWRieSkoImFyaWEtZGVzY3JpYmVkYnkiLGEuYXJpYURlc2NyaWJlZGJ5KSgiYXJpYS1jaGVja2VkIixhLmluZGV0ZXJtaW5hdGU/Im1peGVkIjpudWxsKSgiYXJpYS1jb250cm9scyIsYS5hcmlhQ29udHJvbHMpKCJhcmlhLWRpc2FibGVkIixhLmRpc2FibGVkJiZhLmRpc2FibGVkSW50ZXJhY3RpdmU/ITA6bnVsbCkoImFyaWEtZXhwYW5kZWQiLGEuYXJpYUV4cGFuZGVkKSgiYXJpYS1vd25zIixhLmFyaWFPd25zKSgibmFtZSIsYS5uYW1lKSgidmFsdWUiLGEudmFsdWUpLGwoNyksZigibWF0UmlwcGxlVHJpZ2dlciIscikoIm1hdFJpcHBsZURpc2FibGVkIixhLmRpc2FibGVSaXBwbGV8fGEuZGlzYWJsZWQpKCJtYXRSaXBwbGVDZW50ZXJlZCIsITApLGwoKSxmKCJmb3IiLGEuaW5wdXRJZCl9fSxkZXBlbmRlbmNpZXM6W0wxLFpyXSxzdHlsZXM6W2AubWRjLWNoZWNrYm94e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXg6MCAwIDE4cHg7Ym94LXNpemluZzpjb250ZW50LWJveDt3aWR0aDoxOHB4O2hlaWdodDoxOHB4O2xpbmUtaGVpZ2h0OjA7d2hpdGUtc3BhY2U6bm93cmFwO2N1cnNvcjpwb2ludGVyO3ZlcnRpY2FsLWFsaWduOmJvdHRvbTtwYWRkaW5nOmNhbGMoKHZhcigtLW1hdC1jaGVja2JveC1zdGF0ZS1sYXllci1zaXplLCA0MHB4KSAtIDE4cHgpLzIpO21hcmdpbjpjYWxjKCh2YXIoLS1tYXQtY2hlY2tib3gtc3RhdGUtbGF5ZXItc2l6ZSwgNDBweCkgLSB2YXIoLS1tYXQtY2hlY2tib3gtc3RhdGUtbGF5ZXItc2l6ZSwgNDBweCkpLzIpfS5tZGMtY2hlY2tib3g6aG92ZXI+Lm1kYy1jaGVja2JveF9fcmlwcGxle29wYWNpdHk6dmFyKC0tbWF0LWNoZWNrYm94LXVuc2VsZWN0ZWQtaG92ZXItc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1ob3Zlci1zdGF0ZS1sYXllci1vcGFjaXR5KSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtY2hlY2tib3gtdW5zZWxlY3RlZC1ob3Zlci1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1kYy1jaGVja2JveDpob3Zlcj4ubWF0LW1kYy1jaGVja2JveC1yaXBwbGU+Lm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1jaGVja2JveC11bnNlbGVjdGVkLWhvdmVyLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpKX0ubWRjLWNoZWNrYm94IC5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmZvY3VzKy5tZGMtY2hlY2tib3hfX3JpcHBsZXtvcGFjaXR5OnZhcigtLW1hdC1jaGVja2JveC11bnNlbGVjdGVkLWZvY3VzLXN0YXRlLWxheWVyLW9wYWNpdHksIHZhcigtLW1hdC1zeXMtZm9jdXMtc3RhdGUtbGF5ZXItb3BhY2l0eSkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWNoZWNrYm94LXVuc2VsZWN0ZWQtZm9jdXMtc3RhdGUtbGF5ZXItY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfS5tZGMtY2hlY2tib3ggLm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2w6Zm9jdXN+Lm1hdC1tZGMtY2hlY2tib3gtcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtY2hlY2tib3gtdW5zZWxlY3RlZC1mb2N1cy1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1kYy1jaGVja2JveDphY3RpdmU+Lm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2wrLm1kYy1jaGVja2JveF9fcmlwcGxle29wYWNpdHk6dmFyKC0tbWF0LWNoZWNrYm94LXVuc2VsZWN0ZWQtcHJlc3NlZC1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLXByZXNzZWQtc3RhdGUtbGF5ZXItb3BhY2l0eSkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWNoZWNrYm94LXVuc2VsZWN0ZWQtcHJlc3NlZC1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1kYy1jaGVja2JveDphY3RpdmU+Lm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2x+Lm1hdC1tZGMtY2hlY2tib3gtcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtY2hlY2tib3gtdW5zZWxlY3RlZC1wcmVzc2VkLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWRjLWNoZWNrYm94OmhvdmVyIC5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmNoZWNrZWQrLm1kYy1jaGVja2JveF9fcmlwcGxle29wYWNpdHk6dmFyKC0tbWF0LWNoZWNrYm94LXNlbGVjdGVkLWhvdmVyLXN0YXRlLWxheWVyLW9wYWNpdHksIHZhcigtLW1hdC1zeXMtaG92ZXItc3RhdGUtbGF5ZXItb3BhY2l0eSkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWNoZWNrYm94LXNlbGVjdGVkLWhvdmVyLXN0YXRlLWxheWVyLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWRjLWNoZWNrYm94OmhvdmVyIC5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmNoZWNrZWR+Lm1hdC1tZGMtY2hlY2tib3gtcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtY2hlY2tib3gtc2VsZWN0ZWQtaG92ZXItc3RhdGUtbGF5ZXItY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tZGMtY2hlY2tib3ggLm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2w6Zm9jdXM6Y2hlY2tlZCsubWRjLWNoZWNrYm94X19yaXBwbGV7b3BhY2l0eTp2YXIoLS1tYXQtY2hlY2tib3gtc2VsZWN0ZWQtZm9jdXMtc3RhdGUtbGF5ZXItb3BhY2l0eSwgdmFyKC0tbWF0LXN5cy1mb2N1cy1zdGF0ZS1sYXllci1vcGFjaXR5KSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtY2hlY2tib3gtc2VsZWN0ZWQtZm9jdXMtc3RhdGUtbGF5ZXItY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tZGMtY2hlY2tib3ggLm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2w6Zm9jdXM6Y2hlY2tlZH4ubWF0LW1kYy1jaGVja2JveC1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1jaGVja2JveC1zZWxlY3RlZC1mb2N1cy1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1kYy1jaGVja2JveDphY3RpdmU+Lm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2w6Y2hlY2tlZCsubWRjLWNoZWNrYm94X19yaXBwbGV7b3BhY2l0eTp2YXIoLS1tYXQtY2hlY2tib3gtc2VsZWN0ZWQtcHJlc3NlZC1zdGF0ZS1sYXllci1vcGFjaXR5LCB2YXIoLS1tYXQtc3lzLXByZXNzZWQtc3RhdGUtbGF5ZXItb3BhY2l0eSkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWNoZWNrYm94LXNlbGVjdGVkLXByZXNzZWQtc3RhdGUtbGF5ZXItY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfS5tZGMtY2hlY2tib3g6YWN0aXZlPi5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmNoZWNrZWR+Lm1hdC1tZGMtY2hlY2tib3gtcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtY2hlY2tib3gtc2VsZWN0ZWQtcHJlc3NlZC1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1kYy1jaGVja2JveC0tZGlzYWJsZWQubWF0LW1kYy1jaGVja2JveC1kaXNhYmxlZC1pbnRlcmFjdGl2ZSAubWRjLWNoZWNrYm94IC5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sfi5tYXQtbWRjLWNoZWNrYm94LXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50LC5tZGMtY2hlY2tib3gtLWRpc2FibGVkLm1hdC1tZGMtY2hlY2tib3gtZGlzYWJsZWQtaW50ZXJhY3RpdmUgLm1kYy1jaGVja2JveCAubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbCsubWRjLWNoZWNrYm94X19yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtY2hlY2tib3gtdW5zZWxlY3RlZC1ob3Zlci1zdGF0ZS1sYXllci1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSl9Lm1kYy1jaGVja2JveCAubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbHtwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW46MDtwYWRkaW5nOjA7b3BhY2l0eTowO2N1cnNvcjppbmhlcml0O3otaW5kZXg6MTt3aWR0aDp2YXIoLS1tYXQtY2hlY2tib3gtc3RhdGUtbGF5ZXItc2l6ZSwgNDBweCk7aGVpZ2h0OnZhcigtLW1hdC1jaGVja2JveC1zdGF0ZS1sYXllci1zaXplLCA0MHB4KTt0b3A6Y2FsYygodmFyKC0tbWF0LWNoZWNrYm94LXN0YXRlLWxheWVyLXNpemUsIDQwcHgpIC0gdmFyKC0tbWF0LWNoZWNrYm94LXN0YXRlLWxheWVyLXNpemUsIDQwcHgpKS8yKTtyaWdodDpjYWxjKCh2YXIoLS1tYXQtY2hlY2tib3gtc3RhdGUtbGF5ZXItc2l6ZSwgNDBweCkgLSB2YXIoLS1tYXQtY2hlY2tib3gtc3RhdGUtbGF5ZXItc2l6ZSwgNDBweCkpLzIpO2xlZnQ6Y2FsYygodmFyKC0tbWF0LWNoZWNrYm94LXN0YXRlLWxheWVyLXNpemUsIDQwcHgpIC0gdmFyKC0tbWF0LWNoZWNrYm94LXN0YXRlLWxheWVyLXNpemUsIDQwcHgpKS8yKX0ubWRjLWNoZWNrYm94LS1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdDtwb2ludGVyLWV2ZW50czpub25lfS5tZGMtY2hlY2tib3hfX2JhY2tncm91bmR7ZGlzcGxheTppbmxpbmUtZmxleDtwb3NpdGlvbjphYnNvbHV0ZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MThweDtoZWlnaHQ6MThweDtib3JkZXI6MnB4IHNvbGlkIGN1cnJlbnRDb2xvcjtib3JkZXItcmFkaXVzOjJweDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMCk7cG9pbnRlci1ldmVudHM6bm9uZTt3aWxsLWNoYW5nZTpiYWNrZ3JvdW5kLWNvbG9yLGJvcmRlci1jb2xvcjt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpLGJvcmRlci1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSk7LXdlYmtpdC1wcmludC1jb2xvci1hZGp1c3Q6ZXhhY3Q7Y29sb3ItYWRqdXN0OmV4YWN0O2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtY2hlY2tib3gtdW5zZWxlY3RlZC1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UtdmFyaWFudCkpO3RvcDpjYWxjKCh2YXIoLS1tYXQtY2hlY2tib3gtc3RhdGUtbGF5ZXItc2l6ZSwgNDBweCkgLSAxOHB4KS8yKTtsZWZ0OmNhbGMoKHZhcigtLW1hdC1jaGVja2JveC1zdGF0ZS1sYXllci1zaXplLCA0MHB4KSAtIDE4cHgpLzIpfS5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmVuYWJsZWQ6Y2hlY2tlZH4ubWRjLWNoZWNrYm94X19iYWNrZ3JvdW5kLC5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmVuYWJsZWQ6aW5kZXRlcm1pbmF0ZX4ubWRjLWNoZWNrYm94X19iYWNrZ3JvdW5ke2JvcmRlci1jb2xvcjp2YXIoLS1tYXQtY2hlY2tib3gtc2VsZWN0ZWQtaWNvbi1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtY2hlY2tib3gtc2VsZWN0ZWQtaWNvbi1jb2xvciwgdmFyKC0tbWF0LXN5cy1wcmltYXJ5KSl9Lm1kYy1jaGVja2JveC0tZGlzYWJsZWQgLm1kYy1jaGVja2JveF9fYmFja2dyb3VuZHtib3JkZXItY29sb3I6dmFyKC0tbWF0LWNoZWNrYm94LWRpc2FibGVkLXVuc2VsZWN0ZWQtaWNvbi1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tZGMtY2hlY2tib3gtLWRpc2FibGVkIC5tZGMtY2hlY2tib3hfX2JhY2tncm91bmR7Ym9yZGVyLWNvbG9yOkdyYXlUZXh0fX0ubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbDpkaXNhYmxlZDpjaGVja2Vkfi5tZGMtY2hlY2tib3hfX2JhY2tncm91bmQsLm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2w6ZGlzYWJsZWQ6aW5kZXRlcm1pbmF0ZX4ubWRjLWNoZWNrYm94X19iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWNoZWNrYm94LWRpc2FibGVkLXNlbGVjdGVkLWljb24tY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKTtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwwKX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbDpkaXNhYmxlZDpjaGVja2Vkfi5tZGMtY2hlY2tib3hfX2JhY2tncm91bmQsLm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2w6ZGlzYWJsZWQ6aW5kZXRlcm1pbmF0ZX4ubWRjLWNoZWNrYm94X19iYWNrZ3JvdW5ke2JvcmRlci1jb2xvcjpHcmF5VGV4dH19Lm1kYy1jaGVja2JveDpob3Zlcj4ubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbDpub3QoOmNoZWNrZWQpfi5tZGMtY2hlY2tib3hfX2JhY2tncm91bmQsLm1kYy1jaGVja2JveDpob3Zlcj4ubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbDpub3QoOmluZGV0ZXJtaW5hdGUpfi5tZGMtY2hlY2tib3hfX2JhY2tncm91bmR7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1jaGVja2JveC11bnNlbGVjdGVkLWhvdmVyLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKX0ubWRjLWNoZWNrYm94OmhvdmVyPi5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmNoZWNrZWR+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZCwubWRjLWNoZWNrYm94OmhvdmVyPi5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmluZGV0ZXJtaW5hdGV+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZHtib3JkZXItY29sb3I6dmFyKC0tbWF0LWNoZWNrYm94LXNlbGVjdGVkLWhvdmVyLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LWNoZWNrYm94LXNlbGVjdGVkLWhvdmVyLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfS5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmZvY3VzOmZvY3VzOm5vdCg6Y2hlY2tlZCl+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZCwubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbDpmb2N1czpmb2N1czpub3QoOmluZGV0ZXJtaW5hdGUpfi5tZGMtY2hlY2tib3hfX2JhY2tncm91bmR7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1jaGVja2JveC11bnNlbGVjdGVkLWZvY3VzLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpfS5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmZvY3VzOmZvY3VzOmNoZWNrZWR+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZCwubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbDpmb2N1czpmb2N1czppbmRldGVybWluYXRlfi5tZGMtY2hlY2tib3hfX2JhY2tncm91bmR7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1jaGVja2JveC1zZWxlY3RlZC1mb2N1cy1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1jaGVja2JveC1zZWxlY3RlZC1mb2N1cy1pY29uLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWRjLWNoZWNrYm94LS1kaXNhYmxlZC5tYXQtbWRjLWNoZWNrYm94LWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtY2hlY2tib3g6aG92ZXI+Lm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2x+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZCwubWRjLWNoZWNrYm94LS1kaXNhYmxlZC5tYXQtbWRjLWNoZWNrYm94LWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtY2hlY2tib3ggLm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2w6Zm9jdXN+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZCwubWRjLWNoZWNrYm94LS1kaXNhYmxlZC5tYXQtbWRjLWNoZWNrYm94LWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtY2hlY2tib3hfX2JhY2tncm91bmR7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1jaGVja2JveC1kaXNhYmxlZC11bnNlbGVjdGVkLWljb24tY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWRjLWNoZWNrYm94LS1kaXNhYmxlZC5tYXQtbWRjLWNoZWNrYm94LWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtY2hlY2tib3g6aG92ZXI+Lm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2x+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZCwubWRjLWNoZWNrYm94LS1kaXNhYmxlZC5tYXQtbWRjLWNoZWNrYm94LWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtY2hlY2tib3ggLm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2w6Zm9jdXN+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZCwubWRjLWNoZWNrYm94LS1kaXNhYmxlZC5tYXQtbWRjLWNoZWNrYm94LWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtY2hlY2tib3hfX2JhY2tncm91bmR7Ym9yZGVyLWNvbG9yOkdyYXlUZXh0fX0ubWRjLWNoZWNrYm94LS1kaXNhYmxlZC5tYXQtbWRjLWNoZWNrYm94LWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmNoZWNrZWR+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZCwubWRjLWNoZWNrYm94LS1kaXNhYmxlZC5tYXQtbWRjLWNoZWNrYm94LWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmluZGV0ZXJtaW5hdGV+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hdC1jaGVja2JveC1kaXNhYmxlZC1zZWxlY3RlZC1pY29uLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSk7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsMCl9Lm1kYy1jaGVja2JveF9fY2hlY2ttYXJre3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO3dpZHRoOjEwMCU7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAxODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpO2NvbG9yOnZhcigtLW1hdC1jaGVja2JveC1zZWxlY3RlZC1jaGVja21hcmstY29sb3IsIHZhcigtLW1hdC1zeXMtb24tcHJpbWFyeSkpfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tZGMtY2hlY2tib3hfX2NoZWNrbWFya3tjb2xvcjpDYW52YXNUZXh0fX0ubWRjLWNoZWNrYm94LS1kaXNhYmxlZCAubWRjLWNoZWNrYm94X19jaGVja21hcmssLm1kYy1jaGVja2JveC0tZGlzYWJsZWQubWF0LW1kYy1jaGVja2JveC1kaXNhYmxlZC1pbnRlcmFjdGl2ZSAubWRjLWNoZWNrYm94X19jaGVja21hcmt7Y29sb3I6dmFyKC0tbWF0LWNoZWNrYm94LWRpc2FibGVkLXNlbGVjdGVkLWNoZWNrbWFyay1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlKSl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1kYy1jaGVja2JveC0tZGlzYWJsZWQgLm1kYy1jaGVja2JveF9fY2hlY2ttYXJrLC5tZGMtY2hlY2tib3gtLWRpc2FibGVkLm1hdC1tZGMtY2hlY2tib3gtZGlzYWJsZWQtaW50ZXJhY3RpdmUgLm1kYy1jaGVja2JveF9fY2hlY2ttYXJre2NvbG9yOkdyYXlUZXh0fX0ubWRjLWNoZWNrYm94X19jaGVja21hcmstcGF0aHt0cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IDE4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSk7c3Ryb2tlOmN1cnJlbnRDb2xvcjtzdHJva2Utd2lkdGg6My4xMnB4O3N0cm9rZS1kYXNob2Zmc2V0OjI5Ljc4MzMzODU7c3Ryb2tlLWRhc2hhcnJheToyOS43ODMzMzg1fS5tZGMtY2hlY2tib3hfX21peGVkbWFya3t3aWR0aDoxMDAlO2hlaWdodDowO3RyYW5zZm9ybTpzY2FsZVgoMCkgcm90YXRlKDBkZWcpO2JvcmRlci13aWR0aDoxcHg7Ym9yZGVyLXN0eWxlOnNvbGlkO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgOTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpLHRyYW5zZm9ybSA5MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1hdC1jaGVja2JveC1zZWxlY3RlZC1jaGVja21hcmstY29sb3IsIHZhcigtLW1hdC1zeXMtb24tcHJpbWFyeSkpfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tZGMtY2hlY2tib3hfX21peGVkbWFya3ttYXJnaW46MCAxcHh9fS5tZGMtY2hlY2tib3gtLWRpc2FibGVkIC5tZGMtY2hlY2tib3hfX21peGVkbWFyaywubWRjLWNoZWNrYm94LS1kaXNhYmxlZC5tYXQtbWRjLWNoZWNrYm94LWRpc2FibGVkLWludGVyYWN0aXZlIC5tZGMtY2hlY2tib3hfX21peGVkbWFya3tib3JkZXItY29sb3I6dmFyKC0tbWF0LWNoZWNrYm94LWRpc2FibGVkLXNlbGVjdGVkLWNoZWNrbWFyay1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlKSl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1kYy1jaGVja2JveC0tZGlzYWJsZWQgLm1kYy1jaGVja2JveF9fbWl4ZWRtYXJrLC5tZGMtY2hlY2tib3gtLWRpc2FibGVkLm1hdC1tZGMtY2hlY2tib3gtZGlzYWJsZWQtaW50ZXJhY3RpdmUgLm1kYy1jaGVja2JveF9fbWl4ZWRtYXJre2JvcmRlci1jb2xvcjpHcmF5VGV4dH19Lm1kYy1jaGVja2JveC0tYW5pbS11bmNoZWNrZWQtY2hlY2tlZCAubWRjLWNoZWNrYm94X19iYWNrZ3JvdW5kLC5tZGMtY2hlY2tib3gtLWFuaW0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUgLm1kYy1jaGVja2JveF9fYmFja2dyb3VuZCwubWRjLWNoZWNrYm94LS1hbmltLWNoZWNrZWQtdW5jaGVja2VkIC5tZGMtY2hlY2tib3hfX2JhY2tncm91bmQsLm1kYy1jaGVja2JveC0tYW5pbS1pbmRldGVybWluYXRlLXVuY2hlY2tlZCAubWRjLWNoZWNrYm94X19iYWNrZ3JvdW5ke2FuaW1hdGlvbi1kdXJhdGlvbjoxODBtczthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmxpbmVhcn0ubWRjLWNoZWNrYm94LS1hbmltLXVuY2hlY2tlZC1jaGVja2VkIC5tZGMtY2hlY2tib3hfX2NoZWNrbWFyay1wYXRoe2FuaW1hdGlvbjptZGMtY2hlY2tib3gtdW5jaGVja2VkLWNoZWNrZWQtY2hlY2ttYXJrLXBhdGggMTgwbXMgbGluZWFyO3RyYW5zaXRpb246bm9uZX0ubWRjLWNoZWNrYm94LS1hbmltLXVuY2hlY2tlZC1pbmRldGVybWluYXRlIC5tZGMtY2hlY2tib3hfX21peGVkbWFya3thbmltYXRpb246bWRjLWNoZWNrYm94LXVuY2hlY2tlZC1pbmRldGVybWluYXRlLW1peGVkbWFyayA5MG1zIGxpbmVhcjt0cmFuc2l0aW9uOm5vbmV9Lm1kYy1jaGVja2JveC0tYW5pbS1jaGVja2VkLXVuY2hlY2tlZCAubWRjLWNoZWNrYm94X19jaGVja21hcmstcGF0aHthbmltYXRpb246bWRjLWNoZWNrYm94LWNoZWNrZWQtdW5jaGVja2VkLWNoZWNrbWFyay1wYXRoIDkwbXMgbGluZWFyO3RyYW5zaXRpb246bm9uZX0ubWRjLWNoZWNrYm94LS1hbmltLWNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWRjLWNoZWNrYm94X19jaGVja21hcmt7YW5pbWF0aW9uOm1kYy1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtY2hlY2ttYXJrIDkwbXMgbGluZWFyO3RyYW5zaXRpb246bm9uZX0ubWRjLWNoZWNrYm94LS1hbmltLWNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWRjLWNoZWNrYm94X19taXhlZG1hcmt7YW5pbWF0aW9uOm1kYy1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJrIDkwbXMgbGluZWFyO3RyYW5zaXRpb246bm9uZX0ubWRjLWNoZWNrYm94LS1hbmltLWluZGV0ZXJtaW5hdGUtY2hlY2tlZCAubWRjLWNoZWNrYm94X19jaGVja21hcmt7YW5pbWF0aW9uOm1kYy1jaGVja2JveC1pbmRldGVybWluYXRlLWNoZWNrZWQtY2hlY2ttYXJrIDUwMG1zIGxpbmVhcjt0cmFuc2l0aW9uOm5vbmV9Lm1kYy1jaGVja2JveC0tYW5pbS1pbmRldGVybWluYXRlLWNoZWNrZWQgLm1kYy1jaGVja2JveF9fbWl4ZWRtYXJre2FuaW1hdGlvbjptZGMtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS1jaGVja2VkLW1peGVkbWFyayA1MDBtcyBsaW5lYXI7dHJhbnNpdGlvbjpub25lfS5tZGMtY2hlY2tib3gtLWFuaW0taW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQgLm1kYy1jaGVja2JveF9fbWl4ZWRtYXJre2FuaW1hdGlvbjptZGMtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQtbWl4ZWRtYXJrIDMwMG1zIGxpbmVhcjt0cmFuc2l0aW9uOm5vbmV9Lm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2w6Y2hlY2tlZH4ubWRjLWNoZWNrYm94X19iYWNrZ3JvdW5kLC5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmluZGV0ZXJtaW5hdGV+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZHt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpLGJhY2tncm91bmQtY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKX0ubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbDpjaGVja2Vkfi5tZGMtY2hlY2tib3hfX2JhY2tncm91bmQ+Lm1kYy1jaGVja2JveF9fY2hlY2ttYXJrPi5tZGMtY2hlY2tib3hfX2NoZWNrbWFyay1wYXRoLC5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmluZGV0ZXJtaW5hdGV+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZD4ubWRjLWNoZWNrYm94X19jaGVja21hcms+Lm1kYy1jaGVja2JveF9fY2hlY2ttYXJrLXBhdGh7c3Ryb2tlLWRhc2hvZmZzZXQ6MH0ubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbDpjaGVja2Vkfi5tZGMtY2hlY2tib3hfX2JhY2tncm91bmQ+Lm1kYy1jaGVja2JveF9fY2hlY2ttYXJre3RyYW5zaXRpb246b3BhY2l0eSAxODBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSx0cmFuc2Zvcm0gMTgwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7b3BhY2l0eToxfS5tZGMtY2hlY2tib3hfX25hdGl2ZS1jb250cm9sOmNoZWNrZWR+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZD4ubWRjLWNoZWNrYm94X19taXhlZG1hcmt7dHJhbnNmb3JtOnNjYWxlWCgxKSByb3RhdGUoLTQ1ZGVnKX0ubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbDppbmRldGVybWluYXRlfi5tZGMtY2hlY2tib3hfX2JhY2tncm91bmQ+Lm1kYy1jaGVja2JveF9fY2hlY2ttYXJre3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgOTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjYsIDEpLHRyYW5zZm9ybSA5MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSl9Lm1kYy1jaGVja2JveF9fbmF0aXZlLWNvbnRyb2w6aW5kZXRlcm1pbmF0ZX4ubWRjLWNoZWNrYm94X19iYWNrZ3JvdW5kPi5tZGMtY2hlY2tib3hfX21peGVkbWFya3t0cmFuc2Zvcm06c2NhbGVYKDEpIHJvdGF0ZSgwZGVnKTtvcGFjaXR5OjF9QGtleWZyYW1lcyBtZGMtY2hlY2tib3gtdW5jaGVja2VkLWNoZWNrZWQtY2hlY2ttYXJrLXBhdGh7MCUsNTAle3N0cm9rZS1kYXNob2Zmc2V0OjI5Ljc4MzMzODV9NTAle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSl9MTAwJXtzdHJva2UtZGFzaG9mZnNldDowfX1Aa2V5ZnJhbWVzIG1kYy1jaGVja2JveC11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1taXhlZG1hcmt7MCUsNjguMiV7dHJhbnNmb3JtOnNjYWxlWCgwKX02OC4yJXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLCAwLCAwLCAxKX0xMDAle3RyYW5zZm9ybTpzY2FsZVgoMSl9fUBrZXlmcmFtZXMgbWRjLWNoZWNrYm94LWNoZWNrZWQtdW5jaGVja2VkLWNoZWNrbWFyay1wYXRoe2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC40LCAwLCAxLCAxKTtvcGFjaXR5OjE7c3Ryb2tlLWRhc2hvZmZzZXQ6MH10b3tvcGFjaXR5OjA7c3Ryb2tlLWRhc2hvZmZzZXQ6LTI5Ljc4MzMzODV9fUBrZXlmcmFtZXMgbWRjLWNoZWNrYm94LWNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1jaGVja21hcmt7ZnJvbXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyk7b3BhY2l0eToxfXRve3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBtZGMtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS1jaGVja2VkLWNoZWNrbWFya3tmcm9te2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTQsIDAsIDAsIDEpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO29wYWNpdHk6MH10b3t0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIG1kYy1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJre2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7b3BhY2l0eTowfXRve3RyYW5zZm9ybTpyb3RhdGUoMGRlZyk7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIG1kYy1jaGVja2JveC1pbmRldGVybWluYXRlLWNoZWNrZWQtbWl4ZWRtYXJre2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNCwgMCwgMCwgMSk7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKTtvcGFjaXR5OjF9dG97dHJhbnNmb3JtOnJvdGF0ZSgzMTVkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBtZGMtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQtbWl4ZWRtYXJrezAle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246bGluZWFyO3RyYW5zZm9ybTpzY2FsZVgoMSk7b3BhY2l0eToxfTMyLjglLDEwMCV7dHJhbnNmb3JtOnNjYWxlWCgwKTtvcGFjaXR5OjB9fS5tYXQtbWRjLWNoZWNrYm94e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDAsMCwwLDApfS5tYXQtbWRjLWNoZWNrYm94Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlPi5tYXQtaW50ZXJuYWwtZm9ybS1maWVsZD4ubWRjLWNoZWNrYm94Pi5tYXQtbWRjLWNoZWNrYm94LXRvdWNoLXRhcmdldCwubWF0LW1kYy1jaGVja2JveC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZT4ubWF0LWludGVybmFsLWZvcm0tZmllbGQ+Lm1kYy1jaGVja2JveD4ubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbCwubWF0LW1kYy1jaGVja2JveC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZT4ubWF0LWludGVybmFsLWZvcm0tZmllbGQ+Lm1kYy1jaGVja2JveD4ubWRjLWNoZWNrYm94X19yaXBwbGUsLm1hdC1tZGMtY2hlY2tib3guX21hdC1hbmltYXRpb24tbm9vcGFibGU+Lm1hdC1pbnRlcm5hbC1mb3JtLWZpZWxkPi5tZGMtY2hlY2tib3g+Lm1hdC1tZGMtY2hlY2tib3gtcmlwcGxlOjpiZWZvcmUsLm1hdC1tZGMtY2hlY2tib3guX21hdC1hbmltYXRpb24tbm9vcGFibGU+Lm1hdC1pbnRlcm5hbC1mb3JtLWZpZWxkPi5tZGMtY2hlY2tib3g+Lm1kYy1jaGVja2JveF9fYmFja2dyb3VuZCwubWF0LW1kYy1jaGVja2JveC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZT4ubWF0LWludGVybmFsLWZvcm0tZmllbGQ+Lm1kYy1jaGVja2JveD4ubWRjLWNoZWNrYm94X19iYWNrZ3JvdW5kPi5tZGMtY2hlY2tib3hfX2NoZWNrbWFyaywubWF0LW1kYy1jaGVja2JveC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZT4ubWF0LWludGVybmFsLWZvcm0tZmllbGQ+Lm1kYy1jaGVja2JveD4ubWRjLWNoZWNrYm94X19iYWNrZ3JvdW5kPi5tZGMtY2hlY2tib3hfX2NoZWNrbWFyaz4ubWRjLWNoZWNrYm94X19jaGVja21hcmstcGF0aCwubWF0LW1kYy1jaGVja2JveC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZT4ubWF0LWludGVybmFsLWZvcm0tZmllbGQ+Lm1kYy1jaGVja2JveD4ubWRjLWNoZWNrYm94X19iYWNrZ3JvdW5kPi5tZGMtY2hlY2tib3hfX21peGVkbWFya3t0cmFuc2l0aW9uOm5vbmUgIWltcG9ydGFudDthbmltYXRpb246bm9uZSAhaW1wb3J0YW50fS5tYXQtbWRjLWNoZWNrYm94IGxhYmVse2N1cnNvcjpwb2ludGVyfS5tYXQtbWRjLWNoZWNrYm94IC5tYXQtaW50ZXJuYWwtZm9ybS1maWVsZHtjb2xvcjp2YXIoLS1tYXQtY2hlY2tib3gtbGFiZWwtdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSk7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LWNoZWNrYm94LWxhYmVsLXRleHQtZm9udCwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1mb250KSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LWNoZWNrYm94LWxhYmVsLXRleHQtbGluZS1oZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tbGluZS1oZWlnaHQpKTtmb250LXNpemU6dmFyKC0tbWF0LWNoZWNrYm94LWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1zaXplKSk7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LWNoZWNrYm94LWxhYmVsLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tdHJhY2tpbmcpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtY2hlY2tib3gtbGFiZWwtdGV4dC13ZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0td2VpZ2h0KSl9Lm1hdC1tZGMtY2hlY2tib3gubWF0LW1kYy1jaGVja2JveC1kaXNhYmxlZC5tYXQtbWRjLWNoZWNrYm94LWRpc2FibGVkLWludGVyYWN0aXZle3BvaW50ZXItZXZlbnRzOmF1dG99Lm1hdC1tZGMtY2hlY2tib3gubWF0LW1kYy1jaGVja2JveC1kaXNhYmxlZC5tYXQtbWRjLWNoZWNrYm94LWRpc2FibGVkLWludGVyYWN0aXZlIGlucHV0e2N1cnNvcjpkZWZhdWx0fS5tYXQtbWRjLWNoZWNrYm94Lm1hdC1tZGMtY2hlY2tib3gtZGlzYWJsZWQgbGFiZWx7Y3Vyc29yOmRlZmF1bHQ7Y29sb3I6dmFyKC0tbWF0LWNoZWNrYm94LWRpc2FibGVkLWxhYmVsLWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7Lm1hdC1tZGMtY2hlY2tib3gubWF0LW1kYy1jaGVja2JveC1kaXNhYmxlZCBsYWJlbHtjb2xvcjpHcmF5VGV4dH19Lm1hdC1tZGMtY2hlY2tib3ggbGFiZWw6ZW1wdHl7ZGlzcGxheTpub25lfS5tYXQtbWRjLWNoZWNrYm94IC5tZGMtY2hlY2tib3hfX3JpcHBsZXtvcGFjaXR5OjB9Lm1hdC1tZGMtY2hlY2tib3ggLm1hdC1tZGMtY2hlY2tib3gtcmlwcGxlLC5tZGMtY2hlY2tib3hfX3JpcHBsZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtbWRjLWNoZWNrYm94IC5tYXQtbWRjLWNoZWNrYm94LXJpcHBsZTpub3QoOmVtcHR5KSwubWRjLWNoZWNrYm94X19yaXBwbGU6bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1tZGMtY2hlY2tib3gtcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnR7b3BhY2l0eTouMX0ubWF0LW1kYy1jaGVja2JveC10b3VjaC10YXJnZXR7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTtoZWlnaHQ6dmFyKC0tbWF0LWNoZWNrYm94LXRvdWNoLXRhcmdldC1zaXplLCA0OHB4KTt3aWR0aDp2YXIoLS1tYXQtY2hlY2tib3gtdG91Y2gtdGFyZ2V0LXNpemUsIDQ4cHgpO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwgLTUwJSk7ZGlzcGxheTp2YXIoLS1tYXQtY2hlY2tib3gtdG91Y2gtdGFyZ2V0LWRpc3BsYXksIGJsb2NrKX0ubWF0LW1kYy1jaGVja2JveCAubWF0LW1kYy1jaGVja2JveC1yaXBwbGU6OmJlZm9yZXtib3JkZXItcmFkaXVzOjUwJX0ubWRjLWNoZWNrYm94X19uYXRpdmUtY29udHJvbDpmb2N1c34ubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3Jle2NvbnRlbnQ6IiJ9CmBdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxDZz0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NW1vZD14ZSh7dHlwZTp0fSk7c3RhdGljIFx1MDI3NWluaj15ZSh7aW1wb3J0czpbazQsemUsemVdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gekwodCxuKXtpZih0JjEmJihjKDAsInNwYW4iLDQpLG0oMSkscygpKSx0JjIpe2xldCBlPXYoKTtsKCksQShlLnBsYWNlaG9sZGVyKX19ZnVuY3Rpb24gVEwodCxuKXt0JjEmJm1lKDApfWZ1bmN0aW9uIEVMKHQsbil7aWYodCYxJiYoYygwLCJzcGFuIiwxMSksbSgxKSxzKCkpLHQmMil7bGV0IGU9digyKTtsKCksQShlLnRyaWdnZXJWYWx1ZSl9fWZ1bmN0aW9uIEFMKHQsbil7aWYodCYxJiYoYygwLCJzcGFuIiw1KSxNKDEsVEwsMSwwKSgyLEVMLDIsMSwic3BhbiIsMTEpLHMoKSksdCYyKXtsZXQgZT12KCk7bCgpLHcoZS5jdXN0b21UcmlnZ2VyPzE6Mil9fWZ1bmN0aW9uIERMKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJkaXYiLDEyLDEpLFMoImtleWRvd24iLGZ1bmN0aW9uKGEpe3ooZSk7bGV0IHI9digpO3JldHVybiBUKHIuX2hhbmRsZUtleWRvd24oYSkpfSksbWUoMiwxKSxzKCl9aWYodCYyKXtsZXQgZT12KCk7RHQoVzIoIm1hdC1tZGMtc2VsZWN0LXBhbmVsIG1kYy1tZW51LXN1cmZhY2UgbWRjLW1lbnUtc3VyZmFjZS0tb3BlbiAiLGUuX2dldFBhbmVsVGhlbWUoKSkpLGllKCJtYXQtc2VsZWN0LXBhbmVsLWFuaW1hdGlvbnMtZW5hYmxlZCIsIWUuX2FuaW1hdGlvbnNEaXNhYmxlZCksZigibmdDbGFzcyIsZS5wYW5lbENsYXNzKSxHKCJpZCIsZS5pZCsiLXBhbmVsIikoImFyaWEtbXVsdGlzZWxlY3RhYmxlIixlLm11bHRpcGxlKSgiYXJpYS1sYWJlbCIsZS5hcmlhTGFiZWx8fG51bGwpKCJhcmlhLWxhYmVsbGVkYnkiLGUuX2dldFBhbmVsQXJpYUxhYmVsbGVkYnkoKSl9fWZ1bmN0aW9uIHlnKHQpe2xldCBuPWgoc3QpO3JldHVybigpPT5MaShuKX12YXIgTUwsd0wsU0wsa0wsZTUseGcsTWcsdDUsWDMsWm4saTUsejQsYTU9eCgoKT0+e1BuKCk7aygpO2soKTtEMigpO3hpKCk7WjIoKTtxbigpO1kyKCk7V2UoKTtYdCgpO2x0KCk7YTEoKTtFNigpO2ZpKCk7djQoKTtObSgpO1ZTKCk7bTgoKTt5MSgpO0xTKCk7TUw9WyJ0cmlnZ2VyIl0sd0w9WyJwYW5lbCJdLFNMPVtbWyJtYXQtc2VsZWN0LXRyaWdnZXIiXV0sIioiXSxrTD1bIm1hdC1zZWxlY3QtdHJpZ2dlciIsIioiXTtlNT1uZXcgY2UoIm1hdC1zZWxlY3Qtc2Nyb2xsLXN0cmF0ZWd5Iix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTooKT0+e2xldCB0PWgoc3QpO3JldHVybigpPT5MaSh0KX19KTt4Zz1uZXcgY2UoIk1BVF9TRUxFQ1RfQ09ORklHIiksTWc9e3Byb3ZpZGU6ZTUsZGVwczpbXSx1c2VGYWN0b3J5OnlnfSx0NT1uZXcgY2UoIk1hdFNlbGVjdFRyaWdnZXIiKSxYMz1jbGFzc3tzb3VyY2U7dmFsdWU7Y29uc3RydWN0b3IobixlKXt0aGlzLnNvdXJjZT1uLHRoaXMudmFsdWU9ZX19LFpuPSgoKT0+e2NsYXNzIHR7X3ZpZXdwb3J0UnVsZXI9aCgkMik7X2NoYW5nZURldGVjdG9yUmVmPWgoRWUpO19lbGVtZW50UmVmPWgoYWUpO19kaXI9aChuMSx7b3B0aW9uYWw6ITB9KTtfaWRHZW5lcmF0b3I9aChxdCk7X3JlbmRlcmVyPWgodjEpO19wYXJlbnRGb3JtRmllbGQ9aChWMCx7b3B0aW9uYWw6ITB9KTtuZ0NvbnRyb2w9aCh6Nix7c2VsZjohMCxvcHRpb25hbDohMH0pO19saXZlQW5ub3VuY2VyPWgodm0pO19kZWZhdWx0T3B0aW9ucz1oKHhnLHtvcHRpb25hbDohMH0pO19hbmltYXRpb25zRGlzYWJsZWQ9UHQoKTtfaW5pdGlhbGl6ZWQ9bmV3IHdlO19jbGVhbnVwRGV0YWNoO29wdGlvbnM7b3B0aW9uR3JvdXBzO2N1c3RvbVRyaWdnZXI7X3Bvc2l0aW9ucz1be29yaWdpblg6InN0YXJ0IixvcmlnaW5ZOiJib3R0b20iLG92ZXJsYXlYOiJzdGFydCIsb3ZlcmxheVk6InRvcCJ9LHtvcmlnaW5YOiJlbmQiLG9yaWdpblk6ImJvdHRvbSIsb3ZlcmxheVg6ImVuZCIsb3ZlcmxheVk6InRvcCJ9LHtvcmlnaW5YOiJzdGFydCIsb3JpZ2luWToidG9wIixvdmVybGF5WDoic3RhcnQiLG92ZXJsYXlZOiJib3R0b20iLHBhbmVsQ2xhc3M6Im1hdC1tZGMtc2VsZWN0LXBhbmVsLWFib3ZlIn0se29yaWdpblg6ImVuZCIsb3JpZ2luWToidG9wIixvdmVybGF5WDoiZW5kIixvdmVybGF5WToiYm90dG9tIixwYW5lbENsYXNzOiJtYXQtbWRjLXNlbGVjdC1wYW5lbC1hYm92ZSJ9XTtfc2Nyb2xsT3B0aW9uSW50b1ZpZXcoZSl7bGV0IGk9dGhpcy5vcHRpb25zLnRvQXJyYXkoKVtlXTtpZihpKXtsZXQgYT10aGlzLnBhbmVsLm5hdGl2ZUVsZW1lbnQscj1zOChlLHRoaXMub3B0aW9ucyx0aGlzLm9wdGlvbkdyb3Vwcyksbz1pLl9nZXRIb3N0RWxlbWVudCgpO2U9PT0wJiZyPT09MT9hLnNjcm9sbFRvcD0wOmEuc2Nyb2xsVG9wPWw4KG8ub2Zmc2V0VG9wLG8ub2Zmc2V0SGVpZ2h0LGEuc2Nyb2xsVG9wLGEub2Zmc2V0SGVpZ2h0KX19X3Bvc2l0aW9uaW5nU2V0dGxlZCgpe3RoaXMuX3Njcm9sbE9wdGlvbkludG9WaWV3KHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4fHwwKX1fZ2V0Q2hhbmdlRXZlbnQoZSl7cmV0dXJuIG5ldyBYMyh0aGlzLGUpfV9zY3JvbGxTdHJhdGVneUZhY3Rvcnk9aChlNSk7X3BhbmVsT3Blbj0hMTtfY29tcGFyZVdpdGg9KGUsaSk9PmU9PT1pO191aWQ9dGhpcy5faWRHZW5lcmF0b3IuZ2V0SWQoIm1hdC1zZWxlY3QtIik7X3RyaWdnZXJBcmlhTGFiZWxsZWRCeT1udWxsO19wcmV2aW91c0NvbnRyb2w7X2Rlc3Ryb3k9bmV3IHdlO19lcnJvclN0YXRlVHJhY2tlcjtzdGF0ZUNoYW5nZXM9bmV3IHdlO2Rpc2FibGVBdXRvbWF0aWNMYWJlbGluZz0hMDt1c2VyQXJpYURlc2NyaWJlZEJ5O19zZWxlY3Rpb25Nb2RlbDtfa2V5TWFuYWdlcjtfcHJlZmVycmVkT3ZlcmxheU9yaWdpbjtfb3ZlcmxheVdpZHRoO19vbkNoYW5nZT0oKT0+e307X29uVG91Y2hlZD0oKT0+e307X3ZhbHVlSWQ9dGhpcy5faWRHZW5lcmF0b3IuZ2V0SWQoIm1hdC1zZWxlY3QtdmFsdWUtIik7X3Njcm9sbFN0cmF0ZWd5O19vdmVybGF5UGFuZWxDbGFzcz10aGlzLl9kZWZhdWx0T3B0aW9ucz8ub3ZlcmxheVBhbmVsQ2xhc3N8fCIiO2dldCBmb2N1c2VkKCl7cmV0dXJuIHRoaXMuX2ZvY3VzZWR8fHRoaXMuX3BhbmVsT3Blbn1fZm9jdXNlZD0hMTtjb250cm9sVHlwZT0ibWF0LXNlbGVjdCI7dHJpZ2dlcjtwYW5lbDtfb3ZlcmxheURpcjtwYW5lbENsYXNzO2Rpc2FibGVkPSExO2dldCBkaXNhYmxlUmlwcGxlKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVSaXBwbGUoKX1zZXQgZGlzYWJsZVJpcHBsZShlKXt0aGlzLl9kaXNhYmxlUmlwcGxlLnNldChlKX1fZGlzYWJsZVJpcHBsZT1mdCghMSk7dGFiSW5kZXg9MDtnZXQgaGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvcigpe3JldHVybiB0aGlzLl9oaWRlU2luZ2xlU2VsZWN0aW9uSW5kaWNhdG9yfXNldCBoaWRlU2luZ2xlU2VsZWN0aW9uSW5kaWNhdG9yKGUpe3RoaXMuX2hpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3I9ZSx0aGlzLl9zeW5jUGFyZW50UHJvcGVydGllcygpfV9oaWRlU2luZ2xlU2VsZWN0aW9uSW5kaWNhdG9yPXRoaXMuX2RlZmF1bHRPcHRpb25zPy5oaWRlU2luZ2xlU2VsZWN0aW9uSW5kaWNhdG9yPz8hMTtnZXQgcGxhY2Vob2xkZXIoKXtyZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXJ9c2V0IHBsYWNlaG9sZGVyKGUpe3RoaXMuX3BsYWNlaG9sZGVyPWUsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfV9wbGFjZWhvbGRlcjtnZXQgcmVxdWlyZWQoKXtyZXR1cm4gdGhpcy5fcmVxdWlyZWQ/P3RoaXMubmdDb250cm9sPy5jb250cm9sPy5oYXNWYWxpZGF0b3IoSi5yZXF1aXJlZCk/PyExfXNldCByZXF1aXJlZChlKXt0aGlzLl9yZXF1aXJlZD1lLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX1fcmVxdWlyZWQ7Z2V0IG11bHRpcGxlKCl7cmV0dXJuIHRoaXMuX211bHRpcGxlfXNldCBtdWx0aXBsZShlKXt0aGlzLl9zZWxlY3Rpb25Nb2RlbCx0aGlzLl9tdWx0aXBsZT1lfV9tdWx0aXBsZT0hMTtkaXNhYmxlT3B0aW9uQ2VudGVyaW5nPXRoaXMuX2RlZmF1bHRPcHRpb25zPy5kaXNhYmxlT3B0aW9uQ2VudGVyaW5nPz8hMTtnZXQgY29tcGFyZVdpdGgoKXtyZXR1cm4gdGhpcy5fY29tcGFyZVdpdGh9c2V0IGNvbXBhcmVXaXRoKGUpe3RoaXMuX2NvbXBhcmVXaXRoPWUsdGhpcy5fc2VsZWN0aW9uTW9kZWwmJnRoaXMuX2luaXRpYWxpemVTZWxlY3Rpb24oKX1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5fdmFsdWV9c2V0IHZhbHVlKGUpe3RoaXMuX2Fzc2lnblZhbHVlKGUpJiZ0aGlzLl9vbkNoYW5nZShlKX1fdmFsdWU7YXJpYUxhYmVsPSIiO2FyaWFMYWJlbGxlZGJ5O2dldCBlcnJvclN0YXRlTWF0Y2hlcigpe3JldHVybiB0aGlzLl9lcnJvclN0YXRlVHJhY2tlci5tYXRjaGVyfXNldCBlcnJvclN0YXRlTWF0Y2hlcihlKXt0aGlzLl9lcnJvclN0YXRlVHJhY2tlci5tYXRjaGVyPWV9dHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDtzb3J0Q29tcGFyYXRvcjtnZXQgaWQoKXtyZXR1cm4gdGhpcy5faWR9c2V0IGlkKGUpe3RoaXMuX2lkPWV8fHRoaXMuX3VpZCx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9X2lkO2dldCBlcnJvclN0YXRlKCl7cmV0dXJuIHRoaXMuX2Vycm9yU3RhdGVUcmFja2VyLmVycm9yU3RhdGV9c2V0IGVycm9yU3RhdGUoZSl7dGhpcy5fZXJyb3JTdGF0ZVRyYWNrZXIuZXJyb3JTdGF0ZT1lfXBhbmVsV2lkdGg9dGhpcy5fZGVmYXVsdE9wdGlvbnMmJnR5cGVvZiB0aGlzLl9kZWZhdWx0T3B0aW9ucy5wYW5lbFdpZHRoPCJ1Ij90aGlzLl9kZWZhdWx0T3B0aW9ucy5wYW5lbFdpZHRoOiJhdXRvIjtjYW5TZWxlY3ROdWxsYWJsZU9wdGlvbnM9dGhpcy5fZGVmYXVsdE9wdGlvbnM/LmNhblNlbGVjdE51bGxhYmxlT3B0aW9ucz8/ITE7b3B0aW9uU2VsZWN0aW9uQ2hhbmdlcz1tcigoKT0+e2xldCBlPXRoaXMub3B0aW9ucztyZXR1cm4gZT9lLmNoYW5nZXMucGlwZShpMShlKSxxMSgoKT0+S3QoLi4uZS5tYXAoaT0+aS5vblNlbGVjdGlvbkNoYW5nZSkpKSk6dGhpcy5faW5pdGlhbGl6ZWQucGlwZShxMSgoKT0+dGhpcy5vcHRpb25TZWxlY3Rpb25DaGFuZ2VzKSl9KTtvcGVuZWRDaGFuZ2U9bmV3IE47X29wZW5lZFN0cmVhbT10aGlzLm9wZW5lZENoYW5nZS5waXBlKCR0KGU9PmUpLHEoKCk9Pnt9KSk7X2Nsb3NlZFN0cmVhbT10aGlzLm9wZW5lZENoYW5nZS5waXBlKCR0KGU9PiFlKSxxKCgpPT57fSkpO3NlbGVjdGlvbkNoYW5nZT1uZXcgTjt2YWx1ZUNoYW5nZT1uZXcgTjtjb25zdHJ1Y3Rvcigpe2xldCBlPWgoTzApLGk9aChfYSx7b3B0aW9uYWw6ITB9KSxhPWgoYmEse29wdGlvbmFsOiEwfSkscj1oKG5ldyBwaSgidGFiaW5kZXgiKSx7b3B0aW9uYWw6ITB9KTt0aGlzLm5nQ29udHJvbCYmKHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3I9dGhpcyksdGhpcy5fZGVmYXVsdE9wdGlvbnM/LnR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwhPW51bGwmJih0aGlzLnR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWw9dGhpcy5fZGVmYXVsdE9wdGlvbnMudHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCksdGhpcy5fZXJyb3JTdGF0ZVRyYWNrZXI9bmV3IFJtKGUsdGhpcy5uZ0NvbnRyb2wsYSxpLHRoaXMuc3RhdGVDaGFuZ2VzKSx0aGlzLl9zY3JvbGxTdHJhdGVneT10aGlzLl9zY3JvbGxTdHJhdGVneUZhY3RvcnkoKSx0aGlzLnRhYkluZGV4PXI9PW51bGw/MDpwYXJzZUludChyKXx8MCx0aGlzLmlkPXRoaXMuaWR9bmdPbkluaXQoKXt0aGlzLl9zZWxlY3Rpb25Nb2RlbD1uZXcga2EodGhpcy5tdWx0aXBsZSksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpLHRoaXMuX3ZpZXdwb3J0UnVsZXIuY2hhbmdlKCkucGlwZSh4dCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKCgpPT57dGhpcy5wYW5lbE9wZW4mJih0aGlzLl9vdmVybGF5V2lkdGg9dGhpcy5fZ2V0T3ZlcmxheVdpZHRoKHRoaXMuX3ByZWZlcnJlZE92ZXJsYXlPcmlnaW4pLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKSl9KX1uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLl9pbml0aWFsaXplZC5uZXh0KCksdGhpcy5faW5pdGlhbGl6ZWQuY29tcGxldGUoKSx0aGlzLl9pbml0S2V5TWFuYWdlcigpLHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNoYW5nZWQucGlwZSh4dCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKGU9PntlLmFkZGVkLmZvckVhY2goaT0+aS5zZWxlY3QoKSksZS5yZW1vdmVkLmZvckVhY2goaT0+aS5kZXNlbGVjdCgpKX0pLHRoaXMub3B0aW9ucy5jaGFuZ2VzLnBpcGUoaTEobnVsbCkseHQodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZSgoKT0+e3RoaXMuX3Jlc2V0T3B0aW9ucygpLHRoaXMuX2luaXRpYWxpemVTZWxlY3Rpb24oKX0pfW5nRG9DaGVjaygpe2xldCBlPXRoaXMuX2dldFRyaWdnZXJBcmlhTGFiZWxsZWRieSgpLGk9dGhpcy5uZ0NvbnRyb2w7aWYoZSE9PXRoaXMuX3RyaWdnZXJBcmlhTGFiZWxsZWRCeSl7bGV0IGE9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O3RoaXMuX3RyaWdnZXJBcmlhTGFiZWxsZWRCeT1lLGU/YS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsZSk6YS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIpfWkmJih0aGlzLl9wcmV2aW91c0NvbnRyb2whPT1pLmNvbnRyb2wmJih0aGlzLl9wcmV2aW91c0NvbnRyb2whPT12b2lkIDAmJmkuZGlzYWJsZWQhPT1udWxsJiZpLmRpc2FibGVkIT09dGhpcy5kaXNhYmxlZCYmKHRoaXMuZGlzYWJsZWQ9aS5kaXNhYmxlZCksdGhpcy5fcHJldmlvdXNDb250cm9sPWkuY29udHJvbCksdGhpcy51cGRhdGVFcnJvclN0YXRlKCkpfW5nT25DaGFuZ2VzKGUpeyhlLmRpc2FibGVkfHxlLnVzZXJBcmlhRGVzY3JpYmVkQnkpJiZ0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCksZS50eXBlYWhlYWREZWJvdW5jZUludGVydmFsJiZ0aGlzLl9rZXlNYW5hZ2VyJiZ0aGlzLl9rZXlNYW5hZ2VyLndpdGhUeXBlQWhlYWQodGhpcy50eXBlYWhlYWREZWJvdW5jZUludGVydmFsKX1uZ09uRGVzdHJveSgpe3RoaXMuX2NsZWFudXBEZXRhY2g/LigpLHRoaXMuX2tleU1hbmFnZXI/LmRlc3Ryb3koKSx0aGlzLl9kZXN0cm95Lm5leHQoKSx0aGlzLl9kZXN0cm95LmNvbXBsZXRlKCksdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKSx0aGlzLl9jbGVhckZyb21Nb2RhbCgpfXRvZ2dsZSgpe3RoaXMucGFuZWxPcGVuP3RoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKX1vcGVuKCl7dGhpcy5fY2FuT3BlbigpJiYodGhpcy5fcGFyZW50Rm9ybUZpZWxkJiYodGhpcy5fcHJlZmVycmVkT3ZlcmxheU9yaWdpbj10aGlzLl9wYXJlbnRGb3JtRmllbGQuZ2V0Q29ubmVjdGVkT3ZlcmxheU9yaWdpbigpKSx0aGlzLl9jbGVhbnVwRGV0YWNoPy4oKSx0aGlzLl9vdmVybGF5V2lkdGg9dGhpcy5fZ2V0T3ZlcmxheVdpZHRoKHRoaXMuX3ByZWZlcnJlZE92ZXJsYXlPcmlnaW4pLHRoaXMuX2FwcGx5TW9kYWxQYW5lbE93bmVyc2hpcCgpLHRoaXMuX3BhbmVsT3Blbj0hMCx0aGlzLl9vdmVybGF5RGlyLnBvc2l0aW9uQ2hhbmdlLnBpcGUoajEoMSkpLnN1YnNjcmliZSgoKT0+e3RoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKSx0aGlzLl9wb3NpdGlvbmluZ1NldHRsZWQoKX0pLHRoaXMuX292ZXJsYXlEaXIuYXR0YWNoT3ZlcmxheSgpLHRoaXMuX2tleU1hbmFnZXIud2l0aEhvcml6b250YWxPcmllbnRhdGlvbihudWxsKSx0aGlzLl9oaWdobGlnaHRDb3JyZWN0T3B0aW9uKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpLFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PnRoaXMub3BlbmVkQ2hhbmdlLmVtaXQoITApKSl9X3RyYWNrZWRNb2RhbD1udWxsO19hcHBseU1vZGFsUGFuZWxPd25lcnNoaXAoKXtsZXQgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xvc2VzdCgnYm9keSA+IC5jZGstb3ZlcmxheS1jb250YWluZXIgW2FyaWEtbW9kYWw9InRydWUiXScpO2lmKCFlKXJldHVybjtsZXQgaT1gJHt0aGlzLmlkfS1wYW5lbGA7dGhpcy5fdHJhY2tlZE1vZGFsJiZ3Nih0aGlzLl90cmFja2VkTW9kYWwsImFyaWEtb3ducyIsaSksVG0oZSwiYXJpYS1vd25zIixpKSx0aGlzLl90cmFja2VkTW9kYWw9ZX1fY2xlYXJGcm9tTW9kYWwoKXtpZighdGhpcy5fdHJhY2tlZE1vZGFsKXJldHVybjtsZXQgZT1gJHt0aGlzLmlkfS1wYW5lbGA7dzYodGhpcy5fdHJhY2tlZE1vZGFsLCJhcmlhLW93bnMiLGUpLHRoaXMuX3RyYWNrZWRNb2RhbD1udWxsfWNsb3NlKCl7dGhpcy5fcGFuZWxPcGVuJiYodGhpcy5fcGFuZWxPcGVuPSExLHRoaXMuX2V4aXRBbmREZXRhY2goKSx0aGlzLl9rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5faXNSdGwoKT8icnRsIjoibHRyIiksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5fb25Ub3VjaGVkKCksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpLFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PnRoaXMub3BlbmVkQ2hhbmdlLmVtaXQoITEpKSl9X2V4aXRBbmREZXRhY2goKXtpZih0aGlzLl9hbmltYXRpb25zRGlzYWJsZWR8fCF0aGlzLnBhbmVsKXt0aGlzLl9kZXRhY2hPdmVybGF5KCk7cmV0dXJufXRoaXMuX2NsZWFudXBEZXRhY2g/LigpLHRoaXMuX2NsZWFudXBEZXRhY2g9KCk9PntpKCksY2xlYXJUaW1lb3V0KGEpLHRoaXMuX2NsZWFudXBEZXRhY2g9dm9pZCAwfTtsZXQgZT10aGlzLnBhbmVsLm5hdGl2ZUVsZW1lbnQsaT10aGlzLl9yZW5kZXJlci5saXN0ZW4oZSwiYW5pbWF0aW9uZW5kIixyPT57ci5hbmltYXRpb25OYW1lPT09Il9tYXQtc2VsZWN0LWV4aXQiJiYodGhpcy5fY2xlYW51cERldGFjaD8uKCksdGhpcy5fZGV0YWNoT3ZlcmxheSgpKX0pLGE9c2V0VGltZW91dCgoKT0+e3RoaXMuX2NsZWFudXBEZXRhY2g/LigpLHRoaXMuX2RldGFjaE92ZXJsYXkoKX0sMjAwKTtlLmNsYXNzTGlzdC5hZGQoIm1hdC1zZWxlY3QtcGFuZWwtZXhpdCIpfV9kZXRhY2hPdmVybGF5KCl7dGhpcy5fb3ZlcmxheURpci5kZXRhY2hPdmVybGF5KCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9d3JpdGVWYWx1ZShlKXt0aGlzLl9hc3NpZ25WYWx1ZShlKX1yZWdpc3Rlck9uQ2hhbmdlKGUpe3RoaXMuX29uQ2hhbmdlPWV9cmVnaXN0ZXJPblRvdWNoZWQoZSl7dGhpcy5fb25Ub3VjaGVkPWV9c2V0RGlzYWJsZWRTdGF0ZShlKXt0aGlzLmRpc2FibGVkPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfWdldCBwYW5lbE9wZW4oKXtyZXR1cm4gdGhpcy5fcGFuZWxPcGVufWdldCBzZWxlY3RlZCgpe3JldHVybiB0aGlzLm11bHRpcGxlP3RoaXMuX3NlbGVjdGlvbk1vZGVsPy5zZWxlY3RlZHx8W106dGhpcy5fc2VsZWN0aW9uTW9kZWw/LnNlbGVjdGVkWzBdfWdldCB0cmlnZ2VyVmFsdWUoKXtpZih0aGlzLmVtcHR5KXJldHVybiIiO2lmKHRoaXMuX211bHRpcGxlKXtsZXQgZT10aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5tYXAoaT0+aS52aWV3VmFsdWUpO3JldHVybiB0aGlzLl9pc1J0bCgpJiZlLnJldmVyc2UoKSxlLmpvaW4oIiwgIil9cmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdLnZpZXdWYWx1ZX11cGRhdGVFcnJvclN0YXRlKCl7dGhpcy5fZXJyb3JTdGF0ZVRyYWNrZXIudXBkYXRlRXJyb3JTdGF0ZSgpfV9pc1J0bCgpe3JldHVybiB0aGlzLl9kaXI/dGhpcy5fZGlyLnZhbHVlPT09InJ0bCI6ITF9X2hhbmRsZUtleWRvd24oZSl7dGhpcy5kaXNhYmxlZHx8KHRoaXMucGFuZWxPcGVuP3RoaXMuX2hhbmRsZU9wZW5LZXlkb3duKGUpOnRoaXMuX2hhbmRsZUNsb3NlZEtleWRvd24oZSkpfV9oYW5kbGVDbG9zZWRLZXlkb3duKGUpe2xldCBpPWUua2V5Q29kZSxhPWk9PT00MHx8aT09PTM4fHxpPT09Mzd8fGk9PT0zOSxyPWk9PT0xM3x8aT09PTMyLG89dGhpcy5fa2V5TWFuYWdlcjtpZighby5pc1R5cGluZygpJiZyJiYhczEoZSl8fCh0aGlzLm11bHRpcGxlfHxlLmFsdEtleSkmJmEpZS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMub3BlbigpO2Vsc2UgaWYoIXRoaXMubXVsdGlwbGUpe2xldCBkPXRoaXMuc2VsZWN0ZWQ7by5vbktleWRvd24oZSk7bGV0IHA9dGhpcy5zZWxlY3RlZDtwJiZkIT09cCYmdGhpcy5fbGl2ZUFubm91bmNlci5hbm5vdW5jZShwLnZpZXdWYWx1ZSwxZTQpfX1faGFuZGxlT3BlbktleWRvd24oZSl7bGV0IGk9dGhpcy5fa2V5TWFuYWdlcixhPWUua2V5Q29kZSxyPWE9PT00MHx8YT09PTM4LG89aS5pc1R5cGluZygpO2lmKHImJmUuYWx0S2V5KWUucHJldmVudERlZmF1bHQoKSx0aGlzLmNsb3NlKCk7ZWxzZSBpZighbyYmKGE9PT0xM3x8YT09PTMyKSYmaS5hY3RpdmVJdGVtJiYhczEoZSkpZS5wcmV2ZW50RGVmYXVsdCgpLGkuYWN0aXZlSXRlbS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKTtlbHNlIGlmKCFvJiZ0aGlzLl9tdWx0aXBsZSYmYT09PTY1JiZlLmN0cmxLZXkpe2UucHJldmVudERlZmF1bHQoKTtsZXQgZD10aGlzLm9wdGlvbnMuc29tZShwPT4hcC5kaXNhYmxlZCYmIXAuc2VsZWN0ZWQpO3RoaXMub3B0aW9ucy5mb3JFYWNoKHA9PntwLmRpc2FibGVkfHwoZD9wLnNlbGVjdCgpOnAuZGVzZWxlY3QoKSl9KX1lbHNle2xldCBkPWkuYWN0aXZlSXRlbUluZGV4O2kub25LZXlkb3duKGUpLHRoaXMuX211bHRpcGxlJiZyJiZlLnNoaWZ0S2V5JiZpLmFjdGl2ZUl0ZW0mJmkuYWN0aXZlSXRlbUluZGV4IT09ZCYmaS5hY3RpdmVJdGVtLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpfX1faGFuZGxlT3ZlcmxheUtleWRvd24oZSl7ZS5rZXlDb2RlPT09MjcmJiFzMShlKSYmKGUucHJldmVudERlZmF1bHQoKSx0aGlzLmNsb3NlKCkpfV9vbkZvY3VzKCl7dGhpcy5kaXNhYmxlZHx8KHRoaXMuX2ZvY3VzZWQ9ITAsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX1fb25CbHVyKCl7dGhpcy5fZm9jdXNlZD0hMSx0aGlzLl9rZXlNYW5hZ2VyPy5jYW5jZWxUeXBlYWhlYWQoKSwhdGhpcy5kaXNhYmxlZCYmIXRoaXMucGFuZWxPcGVuJiYodGhpcy5fb25Ub3VjaGVkKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX1fZ2V0UGFuZWxUaGVtZSgpe3JldHVybiB0aGlzLl9wYXJlbnRGb3JtRmllbGQ/YG1hdC0ke3RoaXMuX3BhcmVudEZvcm1GaWVsZC5jb2xvcn1gOiIifWdldCBlbXB0eSgpe3JldHVybiF0aGlzLl9zZWxlY3Rpb25Nb2RlbHx8dGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNFbXB0eSgpfV9pbml0aWFsaXplU2VsZWN0aW9uKCl7UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e3RoaXMubmdDb250cm9sJiYodGhpcy5fdmFsdWU9dGhpcy5uZ0NvbnRyb2wudmFsdWUpLHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodGhpcy5fdmFsdWUpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX0pfV9zZXRTZWxlY3Rpb25CeVZhbHVlKGUpe2lmKHRoaXMub3B0aW9ucy5mb3JFYWNoKGk9Pmkuc2V0SW5hY3RpdmVTdHlsZXMoKSksdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKSx0aGlzLm11bHRpcGxlJiZlKUFycmF5LmlzQXJyYXkoZSksZS5mb3JFYWNoKGk9PnRoaXMuX3NlbGVjdE9wdGlvbkJ5VmFsdWUoaSkpLHRoaXMuX3NvcnRWYWx1ZXMoKTtlbHNle2xldCBpPXRoaXMuX3NlbGVjdE9wdGlvbkJ5VmFsdWUoZSk7aT90aGlzLl9rZXlNYW5hZ2VyLnVwZGF0ZUFjdGl2ZUl0ZW0oaSk6dGhpcy5wYW5lbE9wZW58fHRoaXMuX2tleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbSgtMSl9dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X3NlbGVjdE9wdGlvbkJ5VmFsdWUoZSl7bGV0IGk9dGhpcy5vcHRpb25zLmZpbmQoYT0+e2lmKHRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQoYSkpcmV0dXJuITE7dHJ5e3JldHVybihhLnZhbHVlIT1udWxsfHx0aGlzLmNhblNlbGVjdE51bGxhYmxlT3B0aW9ucykmJnRoaXMuX2NvbXBhcmVXaXRoKGEudmFsdWUsZSl9Y2F0Y2h7cmV0dXJuITF9fSk7cmV0dXJuIGkmJnRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChpKSxpfV9hc3NpZ25WYWx1ZShlKXtyZXR1cm4gZSE9PXRoaXMuX3ZhbHVlfHx0aGlzLl9tdWx0aXBsZSYmQXJyYXkuaXNBcnJheShlKT8odGhpcy5vcHRpb25zJiZ0aGlzLl9zZXRTZWxlY3Rpb25CeVZhbHVlKGUpLHRoaXMuX3ZhbHVlPWUsITApOiExfV9za2lwUHJlZGljYXRlPWU9PnRoaXMucGFuZWxPcGVuPyExOmUuZGlzYWJsZWQ7X2dldE92ZXJsYXlXaWR0aChlKXtyZXR1cm4gdGhpcy5wYW5lbFdpZHRoPT09ImF1dG8iPyhlIGluc3RhbmNlb2YgeDY/ZS5lbGVtZW50UmVmOmV8fHRoaXMuX2VsZW1lbnRSZWYpLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg6dGhpcy5wYW5lbFdpZHRoPT09bnVsbD8iIjp0aGlzLnBhbmVsV2lkdGh9X3N5bmNQYXJlbnRQcm9wZXJ0aWVzKCl7aWYodGhpcy5vcHRpb25zKWZvcihsZXQgZSBvZiB0aGlzLm9wdGlvbnMpZS5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X2luaXRLZXlNYW5hZ2VyKCl7dGhpcy5fa2V5TWFuYWdlcj1uZXcgem0odGhpcy5vcHRpb25zKS53aXRoVHlwZUFoZWFkKHRoaXMudHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCkud2l0aFZlcnRpY2FsT3JpZW50YXRpb24oKS53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKHRoaXMuX2lzUnRsKCk/InJ0bCI6Imx0ciIpLndpdGhIb21lQW5kRW5kKCkud2l0aFBhZ2VVcERvd24oKS53aXRoQWxsb3dlZE1vZGlmaWVyS2V5cyhbInNoaWZ0S2V5Il0pLnNraXBQcmVkaWNhdGUodGhpcy5fc2tpcFByZWRpY2F0ZSksdGhpcy5fa2V5TWFuYWdlci50YWJPdXQuc3Vic2NyaWJlKCgpPT57dGhpcy5wYW5lbE9wZW4mJighdGhpcy5tdWx0aXBsZSYmdGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtJiZ0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0uX3NlbGVjdFZpYUludGVyYWN0aW9uKCksdGhpcy5mb2N1cygpLHRoaXMuY2xvc2UoKSl9KSx0aGlzLl9rZXlNYW5hZ2VyLmNoYW5nZS5zdWJzY3JpYmUoKCk9Pnt0aGlzLl9wYW5lbE9wZW4mJnRoaXMucGFuZWw/dGhpcy5fc2Nyb2xsT3B0aW9uSW50b1ZpZXcodGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtSW5kZXh8fDApOiF0aGlzLl9wYW5lbE9wZW4mJiF0aGlzLm11bHRpcGxlJiZ0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0mJnRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKX0pfV9yZXNldE9wdGlvbnMoKXtsZXQgZT1LdCh0aGlzLm9wdGlvbnMuY2hhbmdlcyx0aGlzLl9kZXN0cm95KTt0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXMucGlwZSh4dChlKSkuc3Vic2NyaWJlKGk9Pnt0aGlzLl9vblNlbGVjdChpLnNvdXJjZSxpLmlzVXNlcklucHV0KSxpLmlzVXNlcklucHV0JiYhdGhpcy5tdWx0aXBsZSYmdGhpcy5fcGFuZWxPcGVuJiYodGhpcy5jbG9zZSgpLHRoaXMuZm9jdXMoKSl9KSxLdCguLi50aGlzLm9wdGlvbnMubWFwKGk9PmkuX3N0YXRlQ2hhbmdlcykpLnBpcGUoeHQoZSkpLnN1YnNjcmliZSgoKT0+e3RoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9KX1fb25TZWxlY3QoZSxpKXtsZXQgYT10aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKGUpOyF0aGlzLmNhblNlbGVjdE51bGxhYmxlT3B0aW9ucyYmZS52YWx1ZT09bnVsbCYmIXRoaXMuX211bHRpcGxlPyhlLmRlc2VsZWN0KCksdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKSx0aGlzLnZhbHVlIT1udWxsJiZ0aGlzLl9wcm9wYWdhdGVDaGFuZ2VzKGUudmFsdWUpKTooYSE9PWUuc2VsZWN0ZWQmJihlLnNlbGVjdGVkP3RoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChlKTp0aGlzLl9zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChlKSksaSYmdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKGUpLHRoaXMubXVsdGlwbGUmJih0aGlzLl9zb3J0VmFsdWVzKCksaSYmdGhpcy5mb2N1cygpKSksYSE9PXRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQoZSkmJnRoaXMuX3Byb3BhZ2F0ZUNoYW5nZXMoKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9X3NvcnRWYWx1ZXMoKXtpZih0aGlzLm11bHRpcGxlKXtsZXQgZT10aGlzLm9wdGlvbnMudG9BcnJheSgpO3RoaXMuX3NlbGVjdGlvbk1vZGVsLnNvcnQoKGksYSk9PnRoaXMuc29ydENvbXBhcmF0b3I/dGhpcy5zb3J0Q29tcGFyYXRvcihpLGEsZSk6ZS5pbmRleE9mKGkpLWUuaW5kZXhPZihhKSksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfX1fcHJvcGFnYXRlQ2hhbmdlcyhlKXtsZXQgaTt0aGlzLm11bHRpcGxlP2k9dGhpcy5zZWxlY3RlZC5tYXAoYT0+YS52YWx1ZSk6aT10aGlzLnNlbGVjdGVkP3RoaXMuc2VsZWN0ZWQudmFsdWU6ZSx0aGlzLl92YWx1ZT1pLHRoaXMudmFsdWVDaGFuZ2UuZW1pdChpKSx0aGlzLl9vbkNoYW5nZShpKSx0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuX2dldENoYW5nZUV2ZW50KGkpKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1faGlnaGxpZ2h0Q29ycmVjdE9wdGlvbigpe2lmKHRoaXMuX2tleU1hbmFnZXIpaWYodGhpcy5lbXB0eSl7bGV0IGU9LTE7Zm9yKGxldCBpPTA7aTx0aGlzLm9wdGlvbnMubGVuZ3RoO2krKylpZighdGhpcy5vcHRpb25zLmdldChpKS5kaXNhYmxlZCl7ZT1pO2JyZWFrfXRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShlKX1lbHNlIHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSh0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXSl9X2Nhbk9wZW4oKXtyZXR1cm4hdGhpcy5fcGFuZWxPcGVuJiYhdGhpcy5kaXNhYmxlZCYmdGhpcy5vcHRpb25zPy5sZW5ndGg+MCYmISF0aGlzLl9vdmVybGF5RGlyfWZvY3VzKGUpe3RoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cyhlKX1fZ2V0UGFuZWxBcmlhTGFiZWxsZWRieSgpe2lmKHRoaXMuYXJpYUxhYmVsKXJldHVybiBudWxsO2xldCBlPXRoaXMuX3BhcmVudEZvcm1GaWVsZD8uZ2V0TGFiZWxJZCgpfHxudWxsLGk9ZT9lKyIgIjoiIjtyZXR1cm4gdGhpcy5hcmlhTGFiZWxsZWRieT9pK3RoaXMuYXJpYUxhYmVsbGVkYnk6ZX1fZ2V0QXJpYUFjdGl2ZURlc2NlbmRhbnQoKXtyZXR1cm4gdGhpcy5wYW5lbE9wZW4mJnRoaXMuX2tleU1hbmFnZXImJnRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbT90aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0uaWQ6bnVsbH1fZ2V0VHJpZ2dlckFyaWFMYWJlbGxlZGJ5KCl7aWYodGhpcy5hcmlhTGFiZWwpcmV0dXJuIG51bGw7bGV0IGU9dGhpcy5fcGFyZW50Rm9ybUZpZWxkPy5nZXRMYWJlbElkKCl8fCIiO3JldHVybiB0aGlzLmFyaWFMYWJlbGxlZGJ5JiYoZSs9IiAiK3RoaXMuYXJpYUxhYmVsbGVkYnkpLGV8fChlPXRoaXMuX3ZhbHVlSWQpLGV9Z2V0IGRlc2NyaWJlZEJ5SWRzKCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiKT8uc3BsaXQoIiAiKXx8W119c2V0RGVzY3JpYmVkQnlJZHMoZSl7ZS5sZW5ndGg/dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsZS5qb2luKCIgIikpOnRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiKX1vbkNvbnRhaW5lckNsaWNrKCl7dGhpcy5mb2N1cygpLHRoaXMub3BlbigpfWdldCBzaG91bGRMYWJlbEZsb2F0KCl7cmV0dXJuIHRoaXMucGFuZWxPcGVufHwhdGhpcy5lbXB0eXx8dGhpcy5mb2N1c2VkJiYhIXRoaXMucGxhY2Vob2xkZXJ9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LXNlbGVjdCJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbihpLGEscil7aWYoaSYxJiYoQmUocix0NSw1KSxCZShyLEgyLDUpLEJlKHIsSTMsNSkpLGkmMil7bGV0IG87RihvPUIoKSkmJihhLmN1c3RvbVRyaWdnZXI9by5maXJzdCksRihvPUIoKSkmJihhLm9wdGlvbnM9byksRihvPUIoKSkmJihhLm9wdGlvbkdyb3Vwcz1vKX19LHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKHRlKE1MLDUpLHRlKHdMLDUpLHRlKE02LDUpKSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS50cmlnZ2VyPXIuZmlyc3QpLEYocj1CKCkpJiYoYS5wYW5lbD1yLmZpcnN0KSxGKHI9QigpKSYmKGEuX292ZXJsYXlEaXI9ci5maXJzdCl9fSxob3N0QXR0cnM6WyJyb2xlIiwiY29tYm9ib3giLCJhcmlhLWhhc3BvcHVwIiwibGlzdGJveCIsMSwibWF0LW1kYy1zZWxlY3QiXSxob3N0VmFyczoyMSxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjEmJlMoImtleWRvd24iLGZ1bmN0aW9uKG8pe3JldHVybiBhLl9oYW5kbGVLZXlkb3duKG8pfSkoImZvY3VzIixmdW5jdGlvbigpe3JldHVybiBhLl9vbkZvY3VzKCl9KSgiYmx1ciIsZnVuY3Rpb24oKXtyZXR1cm4gYS5fb25CbHVyKCl9KSxpJjImJihHKCJpZCIsYS5pZCkoInRhYmluZGV4IixhLmRpc2FibGVkPy0xOmEudGFiSW5kZXgpKCJhcmlhLWNvbnRyb2xzIixhLnBhbmVsT3Blbj9hLmlkKyItcGFuZWwiOm51bGwpKCJhcmlhLWV4cGFuZGVkIixhLnBhbmVsT3BlbikoImFyaWEtbGFiZWwiLGEuYXJpYUxhYmVsfHxudWxsKSgiYXJpYS1yZXF1aXJlZCIsYS5yZXF1aXJlZC50b1N0cmluZygpKSgiYXJpYS1kaXNhYmxlZCIsYS5kaXNhYmxlZC50b1N0cmluZygpKSgiYXJpYS1pbnZhbGlkIixhLmVycm9yU3RhdGUpKCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLGEuX2dldEFyaWFBY3RpdmVEZXNjZW5kYW50KCkpLGllKCJtYXQtbWRjLXNlbGVjdC1kaXNhYmxlZCIsYS5kaXNhYmxlZCkoIm1hdC1tZGMtc2VsZWN0LWludmFsaWQiLGEuZXJyb3JTdGF0ZSkoIm1hdC1tZGMtc2VsZWN0LXJlcXVpcmVkIixhLnJlcXVpcmVkKSgibWF0LW1kYy1zZWxlY3QtZW1wdHkiLGEuZW1wdHkpKCJtYXQtbWRjLXNlbGVjdC1tdWx0aXBsZSIsYS5tdWx0aXBsZSkoIm1hdC1zZWxlY3Qtb3BlbiIsYS5wYW5lbE9wZW4pKX0saW5wdXRzOnt1c2VyQXJpYURlc2NyaWJlZEJ5OlswLCJhcmlhLWRlc2NyaWJlZGJ5IiwidXNlckFyaWFEZXNjcmliZWRCeSJdLHBhbmVsQ2xhc3M6InBhbmVsQ2xhc3MiLGRpc2FibGVkOlsyLCJkaXNhYmxlZCIsImRpc2FibGVkIixaXSxkaXNhYmxlUmlwcGxlOlsyLCJkaXNhYmxlUmlwcGxlIiwiZGlzYWJsZVJpcHBsZSIsWl0sdGFiSW5kZXg6WzIsInRhYkluZGV4IiwidGFiSW5kZXgiLGU9PmU9PW51bGw/MDpvdChlKV0saGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvcjpbMiwiaGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvciIsImhpZGVTaW5nbGVTZWxlY3Rpb25JbmRpY2F0b3IiLFpdLHBsYWNlaG9sZGVyOiJwbGFjZWhvbGRlciIscmVxdWlyZWQ6WzIsInJlcXVpcmVkIiwicmVxdWlyZWQiLFpdLG11bHRpcGxlOlsyLCJtdWx0aXBsZSIsIm11bHRpcGxlIixaXSxkaXNhYmxlT3B0aW9uQ2VudGVyaW5nOlsyLCJkaXNhYmxlT3B0aW9uQ2VudGVyaW5nIiwiZGlzYWJsZU9wdGlvbkNlbnRlcmluZyIsWl0sY29tcGFyZVdpdGg6ImNvbXBhcmVXaXRoIix2YWx1ZToidmFsdWUiLGFyaWFMYWJlbDpbMCwiYXJpYS1sYWJlbCIsImFyaWFMYWJlbCJdLGFyaWFMYWJlbGxlZGJ5OlswLCJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhTGFiZWxsZWRieSJdLGVycm9yU3RhdGVNYXRjaGVyOiJlcnJvclN0YXRlTWF0Y2hlciIsdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDpbMiwidHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCIsInR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwiLG90XSxzb3J0Q29tcGFyYXRvcjoic29ydENvbXBhcmF0b3IiLGlkOiJpZCIscGFuZWxXaWR0aDoicGFuZWxXaWR0aCIsY2FuU2VsZWN0TnVsbGFibGVPcHRpb25zOlsyLCJjYW5TZWxlY3ROdWxsYWJsZU9wdGlvbnMiLCJjYW5TZWxlY3ROdWxsYWJsZU9wdGlvbnMiLFpdfSxvdXRwdXRzOntvcGVuZWRDaGFuZ2U6Im9wZW5lZENoYW5nZSIsX29wZW5lZFN0cmVhbToib3BlbmVkIixfY2xvc2VkU3RyZWFtOiJjbG9zZWQiLHNlbGVjdGlvbkNoYW5nZToic2VsZWN0aW9uQ2hhbmdlIix2YWx1ZUNoYW5nZToidmFsdWVDaGFuZ2UifSxleHBvcnRBczpbIm1hdFNlbGVjdCJdLGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6VDYsdXNlRXhpc3Rpbmc6dH0se3Byb3ZpZGU6RDMsdXNlRXhpc3Rpbmc6dH1dKSxIZV0sbmdDb250ZW50U2VsZWN0b3JzOmtMLGRlY2xzOjExLHZhcnM6OSxjb25zdHM6W1siZmFsbGJhY2tPdmVybGF5T3JpZ2luIiwiY2RrT3ZlcmxheU9yaWdpbiIsInRyaWdnZXIiLCIiXSxbInBhbmVsIiwiIl0sWyJjZGstb3ZlcmxheS1vcmlnaW4iLCIiLDEsIm1hdC1tZGMtc2VsZWN0LXRyaWdnZXIiLDMsImNsaWNrIl0sWzEsIm1hdC1tZGMtc2VsZWN0LXZhbHVlIl0sWzEsIm1hdC1tZGMtc2VsZWN0LXBsYWNlaG9sZGVyIiwibWF0LW1kYy1zZWxlY3QtbWluLWxpbmUiXSxbMSwibWF0LW1kYy1zZWxlY3QtdmFsdWUtdGV4dCJdLFsxLCJtYXQtbWRjLXNlbGVjdC1hcnJvdy13cmFwcGVyIl0sWzEsIm1hdC1tZGMtc2VsZWN0LWFycm93Il0sWyJ2aWV3Qm94IiwiMCAwIDI0IDI0Iiwid2lkdGgiLCIyNHB4IiwiaGVpZ2h0IiwiMjRweCIsImZvY3VzYWJsZSIsImZhbHNlIiwiYXJpYS1oaWRkZW4iLCJ0cnVlIl0sWyJkIiwiTTcgMTBsNSA1IDUtNXoiXSxbImNkay1jb25uZWN0ZWQtb3ZlcmxheSIsIiIsImNka0Nvbm5lY3RlZE92ZXJsYXlMb2NrUG9zaXRpb24iLCIiLCJjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3AiLCIiLCJjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcyIsImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wIiwzLCJkZXRhY2giLCJiYWNrZHJvcENsaWNrIiwib3ZlcmxheUtleWRvd24iLCJjZGtDb25uZWN0ZWRPdmVybGF5RGlzYWJsZUNsb3NlIiwiY2RrQ29ubmVjdGVkT3ZlcmxheVBhbmVsQ2xhc3MiLCJjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3kiLCJjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luIiwiY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9ucyIsImNka0Nvbm5lY3RlZE92ZXJsYXlXaWR0aCIsImNka0Nvbm5lY3RlZE92ZXJsYXlGbGV4aWJsZURpbWVuc2lvbnMiXSxbMSwibWF0LW1kYy1zZWxlY3QtbWluLWxpbmUiXSxbInJvbGUiLCJsaXN0Ym94IiwidGFiaW5kZXgiLCItMSIsMywia2V5ZG93biIsIm5nQ2xhc3MiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtSZShTTCksYygwLCJkaXYiLDIsMCksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLm9wZW4oKSl9KSxjKDMsImRpdiIsMyksTSg0LHpMLDIsMSwic3BhbiIsNCkoNSxBTCwzLDEsInNwYW4iLDUpLHMoKSxjKDYsImRpdiIsNikoNywiZGl2Iiw3KSxNdCgpLGMoOCwic3ZnIiw4KSx1KDksInBhdGgiLDkpLHMoKSgpKCkoKSxSKDEwLERMLDMsMTAsIm5nLXRlbXBsYXRlIiwxMCksUygiZGV0YWNoIixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5jbG9zZSgpKX0pKCJiYWNrZHJvcENsaWNrIixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5jbG9zZSgpKX0pKCJvdmVybGF5S2V5ZG93biIsZnVuY3Rpb24oZCl7cmV0dXJuIHoociksVChhLl9oYW5kbGVPdmVybGF5S2V5ZG93bihkKSl9KX1pZihpJjIpe2xldCByPXNlKDEpO2woMyksRygiaWQiLGEuX3ZhbHVlSWQpLGwoKSx3KGEuZW1wdHk/NDo1KSxsKDYpLGYoImNka0Nvbm5lY3RlZE92ZXJsYXlEaXNhYmxlQ2xvc2UiLCEwKSgiY2RrQ29ubmVjdGVkT3ZlcmxheVBhbmVsQ2xhc3MiLGEuX292ZXJsYXlQYW5lbENsYXNzKSgiY2RrQ29ubmVjdGVkT3ZlcmxheVNjcm9sbFN0cmF0ZWd5IixhLl9zY3JvbGxTdHJhdGVneSkoImNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4iLGEuX3ByZWZlcnJlZE92ZXJsYXlPcmlnaW58fHIpKCJjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zIixhLl9wb3NpdGlvbnMpKCJjZGtDb25uZWN0ZWRPdmVybGF5V2lkdGgiLGEuX292ZXJsYXlXaWR0aCkoImNka0Nvbm5lY3RlZE92ZXJsYXlGbGV4aWJsZURpbWVuc2lvbnMiLCEwKX19LGRlcGVuZGVuY2llczpbeDYsTTYsVDFdLHN0eWxlczpbYEBrZXlmcmFtZXMgX21hdC1zZWxlY3QtZW50ZXJ7ZnJvbXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlWSgwLjgpfXRve29wYWNpdHk6MTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBfbWF0LXNlbGVjdC1leGl0e2Zyb217b3BhY2l0eToxfXRve29wYWNpdHk6MH19Lm1hdC1tZGMtc2VsZWN0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCU7b3V0bGluZTpub25lOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkO2NvbG9yOnZhcigtLW1hdC1zZWxlY3QtZW5hYmxlZC10cmlnZ2VyLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkpO2ZvbnQtZmFtaWx5OnZhcigtLW1hdC1zZWxlY3QtdHJpZ2dlci10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZS1mb250KSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LXNlbGVjdC10cmlnZ2VyLXRleHQtbGluZS1oZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1sYXJnZS1saW5lLWhlaWdodCkpO2ZvbnQtc2l6ZTp2YXIoLS1tYXQtc2VsZWN0LXRyaWdnZXItdGV4dC1zaXplLCB2YXIoLS1tYXQtc3lzLWJvZHktbGFyZ2Utc2l6ZSkpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hdC1zZWxlY3QtdHJpZ2dlci10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1ib2R5LWxhcmdlLXdlaWdodCkpO2xldHRlci1zcGFjaW5nOnZhcigtLW1hdC1zZWxlY3QtdHJpZ2dlci10ZXh0LXRyYWNraW5nLCB2YXIoLS1tYXQtc3lzLWJvZHktbGFyZ2UtdHJhY2tpbmcpKX1kaXYubWF0LW1kYy1zZWxlY3QtcGFuZWx7Ym94LXNoYWRvdzp2YXIoLS1tYXQtc2VsZWN0LWNvbnRhaW5lci1lbGV2YXRpb24tc2hhZG93LCAwcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwgMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksIDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpKX0ubWF0LW1kYy1zZWxlY3QtZGlzYWJsZWR7Y29sb3I6dmFyKC0tbWF0LXNlbGVjdC1kaXNhYmxlZC10cmlnZ2VyLXRleHQtY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKX0ubWF0LW1kYy1zZWxlY3QtZGlzYWJsZWQgLm1hdC1tZGMtc2VsZWN0LXBsYWNlaG9sZGVye2NvbG9yOnZhcigtLW1hdC1zZWxlY3QtZGlzYWJsZWQtdHJpZ2dlci10ZXh0LWNvbG9yLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSAzOCUsIHRyYW5zcGFyZW50KSl9Lm1hdC1tZGMtc2VsZWN0LXRyaWdnZXJ7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCV9Lm1hdC1tZGMtc2VsZWN0LWRpc2FibGVkIC5tYXQtbWRjLXNlbGVjdC10cmlnZ2Vyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpkZWZhdWx0fS5tYXQtbWRjLXNlbGVjdC12YWx1ZXt3aWR0aDoxMDAlO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0ubWF0LW1kYy1zZWxlY3QtdmFsdWUtdGV4dHt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1tZGMtc2VsZWN0LWFycm93LXdyYXBwZXJ7aGVpZ2h0OjI0cHg7ZmxleC1zaHJpbms6MDtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tZGMtdGV4dC1maWVsZC0tbm8tbGFiZWwgLm1hdC1tZGMtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNmb3JtOm5vbmV9Lm1hdC1tZGMtZm9ybS1maWVsZCAubWF0LW1kYy1zZWxlY3QubWF0LW1kYy1zZWxlY3QtaW52YWxpZCAubWF0LW1kYy1zZWxlY3QtYXJyb3csLm1hdC1mb3JtLWZpZWxkLWludmFsaWQ6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1tZGMtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6dmFyKC0tbWF0LXNlbGVjdC1pbnZhbGlkLWFycm93LWNvbG9yLCB2YXIoLS1tYXQtc3lzLWVycm9yKSl9Lm1hdC1tZGMtc2VsZWN0LWFycm93e3dpZHRoOjEwcHg7aGVpZ2h0OjVweDtwb3NpdGlvbjpyZWxhdGl2ZTtjb2xvcjp2YXIoLS1tYXQtc2VsZWN0LWVuYWJsZWQtYXJyb3ctY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1hdC1tZGMtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LW1kYy1zZWxlY3QtYXJyb3d7Y29sb3I6dmFyKC0tbWF0LXNlbGVjdC1mb2N1c2VkLWFycm93LWNvbG9yLCB2YXIoLS1tYXQtc3lzLXByaW1hcnkpKX0ubWF0LW1kYy1mb3JtLWZpZWxkIC5tYXQtbWRjLXNlbGVjdC5tYXQtbWRjLXNlbGVjdC1kaXNhYmxlZCAubWF0LW1kYy1zZWxlY3QtYXJyb3d7Y29sb3I6dmFyKC0tbWF0LXNlbGVjdC1kaXNhYmxlZC1hcnJvdy1jb2xvciwgY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSkgMzglLCB0cmFuc3BhcmVudCkpfS5tYXQtc2VsZWN0LW9wZW4gLm1hdC1tZGMtc2VsZWN0LWFycm93e3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKX0ubWF0LWZvcm0tZmllbGQtYW5pbWF0aW9ucy1lbmFibGVkIC5tYXQtbWRjLXNlbGVjdC1hcnJvd3t0cmFuc2l0aW9uOnRyYW5zZm9ybSA4MG1zIGxpbmVhcn0ubWF0LW1kYy1zZWxlY3QtYXJyb3cgc3Zne2ZpbGw6Y3VycmVudENvbG9yO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLCAtNTAlKX1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWF0LW1kYy1zZWxlY3QtYXJyb3cgc3Zne2ZpbGw6Q2FudmFzVGV4dH0ubWF0LW1kYy1zZWxlY3QtZGlzYWJsZWQgLm1hdC1tZGMtc2VsZWN0LWFycm93IHN2Z3tmaWxsOkdyYXlUZXh0fX1kaXYubWF0LW1kYy1zZWxlY3QtcGFuZWx7d2lkdGg6MTAwJTttYXgtaGVpZ2h0OjI3NXB4O291dGxpbmU6MDtvdmVyZmxvdzphdXRvO3BhZGRpbmc6OHB4IDA7Ym9yZGVyLXJhZGl1czo0cHg7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWF0LXNlbGVjdC1wYW5lbC1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXN1cmZhY2UtY29udGFpbmVyKSl9QG1lZGlhKGZvcmNlZC1jb2xvcnM6IGFjdGl2ZSl7ZGl2Lm1hdC1tZGMtc2VsZWN0LXBhbmVse291dGxpbmU6c29saWQgMXB4fX0uY2RrLW92ZXJsYXktcGFuZTpub3QoLm1hdC1tZGMtc2VsZWN0LXBhbmVsLWFib3ZlKSBkaXYubWF0LW1kYy1zZWxlY3QtcGFuZWx7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7dHJhbnNmb3JtLW9yaWdpbjp0b3AgY2VudGVyfS5tYXQtbWRjLXNlbGVjdC1wYW5lbC1hYm92ZSBkaXYubWF0LW1kYy1zZWxlY3QtcGFuZWx7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7dHJhbnNmb3JtLW9yaWdpbjpib3R0b20gY2VudGVyfS5tYXQtc2VsZWN0LXBhbmVsLWFuaW1hdGlvbnMtZW5hYmxlZHthbmltYXRpb246X21hdC1zZWxlY3QtZW50ZXIgMTIwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSl9Lm1hdC1zZWxlY3QtcGFuZWwtYW5pbWF0aW9ucy1lbmFibGVkLm1hdC1zZWxlY3QtcGFuZWwtZXhpdHthbmltYXRpb246X21hdC1zZWxlY3QtZXhpdCAxMDBtcyBsaW5lYXJ9Lm1hdC1tZGMtc2VsZWN0LXBsYWNlaG9sZGVye3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtjb2xvcjp2YXIoLS1tYXQtc2VsZWN0LXBsYWNlaG9sZGVyLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1hdC1tZGMtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFuaW1hdGlvbnMtZW5hYmxlZCkgLm1hdC1tZGMtc2VsZWN0LXBsYWNlaG9sZGVyLC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LW1kYy1zZWxlY3QtcGxhY2Vob2xkZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtbWRjLXNlbGVjdC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDAsMCwwLDApOy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnJnYmEoMCwwLDAsMCk7dHJhbnNpdGlvbjpub25lO2Rpc3BsYXk6YmxvY2t9Lm1hdC1tZGMtZm9ybS1maWVsZC10eXBlLW1hdC1zZWxlY3Q6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1tZGMtdGV4dC1maWVsZC13cmFwcGVye2N1cnNvcjpwb2ludGVyfS5tYXQtbWRjLWZvcm0tZmllbGQtdHlwZS1tYXQtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LW1kYy1mbG9hdGluZy1sYWJlbHttYXgtd2lkdGg6Y2FsYygxMDAlIC0gMThweCl9Lm1hdC1tZGMtZm9ybS1maWVsZC10eXBlLW1hdC1zZWxlY3QubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tZGMtZmxvYXRpbmctbGFiZWwtLWZsb2F0LWFib3Zle21heC13aWR0aDpjYWxjKDEwMCUvMC43NSAtIDI0cHgpfS5tYXQtbWRjLWZvcm0tZmllbGQtdHlwZS1tYXQtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2h7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDYwcHgpfS5tYXQtbWRjLWZvcm0tZmllbGQtdHlwZS1tYXQtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWRjLXRleHQtZmllbGQtLWxhYmVsLWZsb2F0aW5nIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaHttYXgtd2lkdGg6Y2FsYygxMDAlIC0gMjRweCl9Lm1hdC1tZGMtc2VsZWN0LW1pbi1saW5lOmVtcHR5OjpiZWZvcmV7Y29udGVudDoiICI7d2hpdGUtc3BhY2U6cHJlO3dpZHRoOjFweDtkaXNwbGF5OmlubGluZS1ibG9jazt2aXNpYmlsaXR5OmhpZGRlbn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtbWRjLXNlbGVjdC1hcnJvdy13cmFwcGVye3RyYW5zZm9ybTp2YXIoLS1tYXQtc2VsZWN0LWFycm93LXRyYW5zZm9ybSwgdHJhbnNsYXRlWSgtOHB4KSl9CmBdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfXJldHVybiB0fSkoKSxpNT0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1zZWxlY3QtdHJpZ2dlciJdXSxmZWF0dXJlczpbSWUoW3twcm92aWRlOnQ1LHVzZUV4aXN0aW5nOnR9XSldfSl9cmV0dXJuIHR9KSgpLHo0PSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1bW9kPXhlKHt0eXBlOnR9KTtzdGF0aWMgXHUwMjc1aW5qPXllKHtwcm92aWRlcnM6W01nXSxpbXBvcnRzOltCaSx0byx6ZSxYaSxRZSx0byx6ZV19KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBJTCh0LG4pe2lmKHQmMSYmKGMoMCwibWF0LW9wdGlvbiIsMTcpLG0oMSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2YoInZhbHVlIixlKSxsKCksRSgiICIsZSwiICIpfX1mdW5jdGlvbiBMTCh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwibWF0LWZvcm0tZmllbGQiLDE0KSgxLCJtYXQtc2VsZWN0IiwxNiwwKSxTKCJzZWxlY3Rpb25DaGFuZ2UiLGZ1bmN0aW9uKGEpe3ooZSk7bGV0IHI9digyKTtyZXR1cm4gVChyLl9jaGFuZ2VQYWdlU2l6ZShhLnZhbHVlKSl9KSxxZSgzLElMLDIsMiwibWF0LW9wdGlvbiIsMTcsRnQpLHMoKSxjKDUsImRpdiIsMTgpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9c2UoMik7cmV0dXJuIFQoYS5vcGVuKCkpfSkscygpKCl9aWYodCYyKXtsZXQgZT12KDIpO2YoImFwcGVhcmFuY2UiLGUuX2Zvcm1GaWVsZEFwcGVhcmFuY2UpKCJjb2xvciIsZS5jb2xvciksbCgpLGYoInZhbHVlIixlLnBhZ2VTaXplKSgiZGlzYWJsZWQiLGUuZGlzYWJsZWQpLFJhKCJhcmlhLWxhYmVsbGVkYnkiLGUuX3BhZ2VTaXplTGFiZWxJZCksZigicGFuZWxDbGFzcyIsZS5zZWxlY3RDb25maWcucGFuZWxDbGFzc3x8IiIpKCJkaXNhYmxlT3B0aW9uQ2VudGVyaW5nIixlLnNlbGVjdENvbmZpZy5kaXNhYmxlT3B0aW9uQ2VudGVyaW5nKSxsKDIpLEdlKGUuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucyl9fWZ1bmN0aW9uIFBMKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDE1KSxtKDEpLHMoKSksdCYyKXtsZXQgZT12KDIpO2woKSxBKGUucGFnZVNpemUpfX1mdW5jdGlvbiBWTCh0LG4pe2lmKHQmMSYmKGMoMCwiZGl2IiwzKSgxLCJkaXYiLDEzKSxtKDIpLHMoKSxNKDMsTEwsNiw3LCJtYXQtZm9ybS1maWVsZCIsMTQpLE0oNCxQTCwyLDEsImRpdiIsMTUpLHMoKSksdCYyKXtsZXQgZT12KCk7bCgpLEcoImlkIixlLl9wYWdlU2l6ZUxhYmVsSWQpLGwoKSxFKCIgIixlLl9pbnRsLml0ZW1zUGVyUGFnZUxhYmVsLCIgIiksbCgpLHcoZS5fZGlzcGxheWVkUGFnZVNpemVPcHRpb25zLmxlbmd0aD4xPzM6LTEpLGwoKSx3KGUuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucy5sZW5ndGg8PTE/NDotMSl9fWZ1bmN0aW9uIE9MKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJidXR0b24iLDE5KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLl9idXR0b25DbGlja2VkKDAsYS5fcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSkpfSksTXQoKSxjKDEsInN2ZyIsOCksdSgyLCJwYXRoIiwyMCkscygpKCl9aWYodCYyKXtsZXQgZT12KCk7ZigibWF0VG9vbHRpcCIsZS5faW50bC5maXJzdFBhZ2VMYWJlbCkoIm1hdFRvb2x0aXBEaXNhYmxlZCIsZS5fcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSkoImRpc2FibGVkIixlLl9wcmV2aW91c0J1dHRvbnNEaXNhYmxlZCgpKSgidGFiaW5kZXgiLGUuX3ByZXZpb3VzQnV0dG9uc0Rpc2FibGVkKCk/LTE6bnVsbCksRygiYXJpYS1sYWJlbCIsZS5faW50bC5maXJzdFBhZ2VMYWJlbCl9fWZ1bmN0aW9uIEhMKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJidXR0b24iLDIxKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLl9idXR0b25DbGlja2VkKGEuZ2V0TnVtYmVyT2ZQYWdlcygpLTEsYS5fbmV4dEJ1dHRvbnNEaXNhYmxlZCgpKSl9KSxNdCgpLGMoMSwic3ZnIiw4KSx1KDIsInBhdGgiLDIyKSxzKCkoKX1pZih0JjIpe2xldCBlPXYoKTtmKCJtYXRUb29sdGlwIixlLl9pbnRsLmxhc3RQYWdlTGFiZWwpKCJtYXRUb29sdGlwRGlzYWJsZWQiLGUuX25leHRCdXR0b25zRGlzYWJsZWQoKSkoImRpc2FibGVkIixlLl9uZXh0QnV0dG9uc0Rpc2FibGVkKCkpKCJ0YWJpbmRleCIsZS5fbmV4dEJ1dHRvbnNEaXNhYmxlZCgpPy0xOm51bGwpLEcoImFyaWEtbGFiZWwiLGUuX2ludGwubGFzdFBhZ2VMYWJlbCl9fWZ1bmN0aW9uIE5MKHQpe3JldHVybiB0fHxuZXcgSjN9dmFyIEozLFJMLEZMLEJMLG5uLHdnLFQ0PXgoKCk9PntrKCk7aygpO1h0KCk7eGkoKTtFNigpO2E1KCk7djQoKTtFbSgpO2M0KCk7ZmwoKTtuZSgpO0ozPSgoKT0+e2NsYXNzIHR7Y2hhbmdlcz1uZXcgd2U7aXRlbXNQZXJQYWdlTGFiZWw9Ikl0ZW1zIHBlciBwYWdlOiI7bmV4dFBhZ2VMYWJlbD0iTmV4dCBwYWdlIjtwcmV2aW91c1BhZ2VMYWJlbD0iUHJldmlvdXMgcGFnZSI7Zmlyc3RQYWdlTGFiZWw9IkZpcnN0IHBhZ2UiO2xhc3RQYWdlTGFiZWw9Ikxhc3QgcGFnZSI7Z2V0UmFuZ2VMYWJlbD0oZSxpLGEpPT57aWYoYT09MHx8aT09MClyZXR1cm5gMCBvZiAke2F9YDthPU1hdGgubWF4KGEsMCk7bGV0IHI9ZSppLG89cjxhP01hdGgubWluKHIraSxhKTpyK2k7cmV0dXJuYCR7cisxfSBcdTIwMTMgJHtvfSBvZiAke2F9YH07c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCk7Ukw9e3Byb3ZpZGU6SjMsZGVwczpbW25ldyBwMCxuZXcgZjAsSjNdXSx1c2VGYWN0b3J5Ok5MfSxGTD01MCxCTD1uZXcgY2UoIk1BVF9QQUdJTkFUT1JfREVGQVVMVF9PUFRJT05TIiksbm49KCgpPT57Y2xhc3MgdHtfaW50bD1oKEozKTtfY2hhbmdlRGV0ZWN0b3JSZWY9aChFZSk7X2Zvcm1GaWVsZEFwcGVhcmFuY2U7X3BhZ2VTaXplTGFiZWxJZD1oKHF0KS5nZXRJZCgibWF0LXBhZ2luYXRvci1wYWdlLXNpemUtbGFiZWwtIik7X2ludGxDaGFuZ2VzO19pc0luaXRpYWxpemVkPSExO19pbml0aWFsaXplZFN0cmVhbT1uZXcgU2QoMSk7Y29sb3I7Z2V0IHBhZ2VJbmRleCgpe3JldHVybiB0aGlzLl9wYWdlSW5kZXh9c2V0IHBhZ2VJbmRleChlKXt0aGlzLl9wYWdlSW5kZXg9TWF0aC5tYXgoZXx8MCwwKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1fcGFnZUluZGV4PTA7Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLl9sZW5ndGh9c2V0IGxlbmd0aChlKXt0aGlzLl9sZW5ndGg9ZXx8MCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1fbGVuZ3RoPTA7Z2V0IHBhZ2VTaXplKCl7cmV0dXJuIHRoaXMuX3BhZ2VTaXplfXNldCBwYWdlU2l6ZShlKXt0aGlzLl9wYWdlU2l6ZT1NYXRoLm1heChlfHwwLDApLHRoaXMuX3VwZGF0ZURpc3BsYXllZFBhZ2VTaXplT3B0aW9ucygpfV9wYWdlU2l6ZTtnZXQgcGFnZVNpemVPcHRpb25zKCl7cmV0dXJuIHRoaXMuX3BhZ2VTaXplT3B0aW9uc31zZXQgcGFnZVNpemVPcHRpb25zKGUpe3RoaXMuX3BhZ2VTaXplT3B0aW9ucz0oZXx8W10pLm1hcChpPT5vdChpLDApKSx0aGlzLl91cGRhdGVEaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMoKX1fcGFnZVNpemVPcHRpb25zPVtdO2hpZGVQYWdlU2l6ZT0hMTtzaG93Rmlyc3RMYXN0QnV0dG9ucz0hMTtzZWxlY3RDb25maWc9e307ZGlzYWJsZWQ9ITE7cGFnZT1uZXcgTjtfZGlzcGxheWVkUGFnZVNpemVPcHRpb25zO2luaXRpYWxpemVkPXRoaXMuX2luaXRpYWxpemVkU3RyZWFtO2NvbnN0cnVjdG9yKCl7bGV0IGU9dGhpcy5faW50bCxpPWgoQkwse29wdGlvbmFsOiEwfSk7aWYodGhpcy5faW50bENoYW5nZXM9ZS5jaGFuZ2VzLnN1YnNjcmliZSgoKT0+dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpLGkpe2xldHtwYWdlU2l6ZTphLHBhZ2VTaXplT3B0aW9uczpyLGhpZGVQYWdlU2l6ZTpvLHNob3dGaXJzdExhc3RCdXR0b25zOmR9PWk7YSE9bnVsbCYmKHRoaXMuX3BhZ2VTaXplPWEpLHIhPW51bGwmJih0aGlzLl9wYWdlU2l6ZU9wdGlvbnM9ciksbyE9bnVsbCYmKHRoaXMuaGlkZVBhZ2VTaXplPW8pLGQhPW51bGwmJih0aGlzLnNob3dGaXJzdExhc3RCdXR0b25zPWQpfXRoaXMuX2Zvcm1GaWVsZEFwcGVhcmFuY2U9aT8uZm9ybUZpZWxkQXBwZWFyYW5jZXx8Im91dGxpbmUifW5nT25Jbml0KCl7dGhpcy5faXNJbml0aWFsaXplZD0hMCx0aGlzLl91cGRhdGVEaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMoKSx0aGlzLl9pbml0aWFsaXplZFN0cmVhbS5uZXh0KCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9pbml0aWFsaXplZFN0cmVhbS5jb21wbGV0ZSgpLHRoaXMuX2ludGxDaGFuZ2VzLnVuc3Vic2NyaWJlKCl9bmV4dFBhZ2UoKXt0aGlzLmhhc05leHRQYWdlKCkmJnRoaXMuX25hdmlnYXRlKHRoaXMucGFnZUluZGV4KzEpfXByZXZpb3VzUGFnZSgpe3RoaXMuaGFzUHJldmlvdXNQYWdlKCkmJnRoaXMuX25hdmlnYXRlKHRoaXMucGFnZUluZGV4LTEpfWZpcnN0UGFnZSgpe3RoaXMuaGFzUHJldmlvdXNQYWdlKCkmJnRoaXMuX25hdmlnYXRlKDApfWxhc3RQYWdlKCl7dGhpcy5oYXNOZXh0UGFnZSgpJiZ0aGlzLl9uYXZpZ2F0ZSh0aGlzLmdldE51bWJlck9mUGFnZXMoKS0xKX1oYXNQcmV2aW91c1BhZ2UoKXtyZXR1cm4gdGhpcy5wYWdlSW5kZXg+PTEmJnRoaXMucGFnZVNpemUhPTB9aGFzTmV4dFBhZ2UoKXtsZXQgZT10aGlzLmdldE51bWJlck9mUGFnZXMoKS0xO3JldHVybiB0aGlzLnBhZ2VJbmRleDxlJiZ0aGlzLnBhZ2VTaXplIT0wfWdldE51bWJlck9mUGFnZXMoKXtyZXR1cm4gdGhpcy5wYWdlU2l6ZT9NYXRoLmNlaWwodGhpcy5sZW5ndGgvdGhpcy5wYWdlU2l6ZSk6MH1fY2hhbmdlUGFnZVNpemUoZSl7bGV0IGk9dGhpcy5wYWdlSW5kZXgqdGhpcy5wYWdlU2l6ZSxhPXRoaXMucGFnZUluZGV4O3RoaXMucGFnZUluZGV4PU1hdGguZmxvb3IoaS9lKXx8MCx0aGlzLnBhZ2VTaXplPWUsdGhpcy5fZW1pdFBhZ2VFdmVudChhKX1fbmV4dEJ1dHRvbnNEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5oYXNOZXh0UGFnZSgpfV9wcmV2aW91c0J1dHRvbnNEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5oYXNQcmV2aW91c1BhZ2UoKX1fdXBkYXRlRGlzcGxheWVkUGFnZVNpemVPcHRpb25zKCl7dGhpcy5faXNJbml0aWFsaXplZCYmKHRoaXMucGFnZVNpemV8fCh0aGlzLl9wYWdlU2l6ZT10aGlzLnBhZ2VTaXplT3B0aW9ucy5sZW5ndGghPTA/dGhpcy5wYWdlU2l6ZU9wdGlvbnNbMF06RkwpLHRoaXMuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucz10aGlzLnBhZ2VTaXplT3B0aW9ucy5zbGljZSgpLHRoaXMuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucy5pbmRleE9mKHRoaXMucGFnZVNpemUpPT09LTEmJnRoaXMuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucy5wdXNoKHRoaXMucGFnZVNpemUpLHRoaXMuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucy5zb3J0KChlLGkpPT5lLWkpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX1fZW1pdFBhZ2VFdmVudChlKXt0aGlzLnBhZ2UuZW1pdCh7cHJldmlvdXNQYWdlSW5kZXg6ZSxwYWdlSW5kZXg6dGhpcy5wYWdlSW5kZXgscGFnZVNpemU6dGhpcy5wYWdlU2l6ZSxsZW5ndGg6dGhpcy5sZW5ndGh9KX1fbmF2aWdhdGUoZSl7bGV0IGk9dGhpcy5wYWdlSW5kZXg7ZSE9PWkmJih0aGlzLnBhZ2VJbmRleD1lLHRoaXMuX2VtaXRQYWdlRXZlbnQoaSkpfV9idXR0b25DbGlja2VkKGUsaSl7aXx8dGhpcy5fbmF2aWdhdGUoZSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LXBhZ2luYXRvciJdXSxob3N0QXR0cnM6WyJyb2xlIiwiZ3JvdXAiLDEsIm1hdC1tZGMtcGFnaW5hdG9yIl0saW5wdXRzOntjb2xvcjoiY29sb3IiLHBhZ2VJbmRleDpbMiwicGFnZUluZGV4IiwicGFnZUluZGV4IixvdF0sbGVuZ3RoOlsyLCJsZW5ndGgiLCJsZW5ndGgiLG90XSxwYWdlU2l6ZTpbMiwicGFnZVNpemUiLCJwYWdlU2l6ZSIsb3RdLHBhZ2VTaXplT3B0aW9uczoicGFnZVNpemVPcHRpb25zIixoaWRlUGFnZVNpemU6WzIsImhpZGVQYWdlU2l6ZSIsImhpZGVQYWdlU2l6ZSIsWl0sc2hvd0ZpcnN0TGFzdEJ1dHRvbnM6WzIsInNob3dGaXJzdExhc3RCdXR0b25zIiwic2hvd0ZpcnN0TGFzdEJ1dHRvbnMiLFpdLHNlbGVjdENvbmZpZzoic2VsZWN0Q29uZmlnIixkaXNhYmxlZDpbMiwiZGlzYWJsZWQiLCJkaXNhYmxlZCIsWl19LG91dHB1dHM6e3BhZ2U6InBhZ2UifSxleHBvcnRBczpbIm1hdFBhZ2luYXRvciJdLGRlY2xzOjE0LHZhcnM6MTQsY29uc3RzOltbInNlbGVjdFJlZiIsIiJdLFsxLCJtYXQtbWRjLXBhZ2luYXRvci1vdXRlci1jb250YWluZXIiXSxbMSwibWF0LW1kYy1wYWdpbmF0b3ItY29udGFpbmVyIl0sWzEsIm1hdC1tZGMtcGFnaW5hdG9yLXBhZ2Utc2l6ZSJdLFsxLCJtYXQtbWRjLXBhZ2luYXRvci1yYW5nZS1hY3Rpb25zIl0sWyJhcmlhLWxpdmUiLCJwb2xpdGUiLDEsIm1hdC1tZGMtcGFnaW5hdG9yLXJhbmdlLWxhYmVsIl0sWyJtYXRJY29uQnV0dG9uIiwiIiwidHlwZSIsImJ1dHRvbiIsIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIiwiZGlzYWJsZWRJbnRlcmFjdGl2ZSIsIiIsMSwibWF0LW1kYy1wYWdpbmF0b3ItbmF2aWdhdGlvbi1maXJzdCIsMywibWF0VG9vbHRpcCIsIm1hdFRvb2x0aXBEaXNhYmxlZCIsImRpc2FibGVkIiwidGFiaW5kZXgiXSxbIm1hdEljb25CdXR0b24iLCIiLCJ0eXBlIiwiYnV0dG9uIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiYWJvdmUiLCJkaXNhYmxlZEludGVyYWN0aXZlIiwiIiwxLCJtYXQtbWRjLXBhZ2luYXRvci1uYXZpZ2F0aW9uLXByZXZpb3VzIiwzLCJjbGljayIsIm1hdFRvb2x0aXAiLCJtYXRUb29sdGlwRGlzYWJsZWQiLCJkaXNhYmxlZCIsInRhYmluZGV4Il0sWyJ2aWV3Qm94IiwiMCAwIDI0IDI0IiwiZm9jdXNhYmxlIiwiZmFsc2UiLCJhcmlhLWhpZGRlbiIsInRydWUiLDEsIm1hdC1tZGMtcGFnaW5hdG9yLWljb24iXSxbImQiLCJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiXSxbIm1hdEljb25CdXR0b24iLCIiLCJ0eXBlIiwiYnV0dG9uIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiYWJvdmUiLCJkaXNhYmxlZEludGVyYWN0aXZlIiwiIiwxLCJtYXQtbWRjLXBhZ2luYXRvci1uYXZpZ2F0aW9uLW5leHQiLDMsImNsaWNrIiwibWF0VG9vbHRpcCIsIm1hdFRvb2x0aXBEaXNhYmxlZCIsImRpc2FibGVkIiwidGFiaW5kZXgiXSxbImQiLCJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6Il0sWyJtYXRJY29uQnV0dG9uIiwiIiwidHlwZSIsImJ1dHRvbiIsIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIiwiZGlzYWJsZWRJbnRlcmFjdGl2ZSIsIiIsMSwibWF0LW1kYy1wYWdpbmF0b3ItbmF2aWdhdGlvbi1sYXN0IiwzLCJtYXRUb29sdGlwIiwibWF0VG9vbHRpcERpc2FibGVkIiwiZGlzYWJsZWQiLCJ0YWJpbmRleCJdLFsxLCJtYXQtbWRjLXBhZ2luYXRvci1wYWdlLXNpemUtbGFiZWwiXSxbMSwibWF0LW1kYy1wYWdpbmF0b3ItcGFnZS1zaXplLXNlbGVjdCIsMywiYXBwZWFyYW5jZSIsImNvbG9yIl0sWzEsIm1hdC1tZGMtcGFnaW5hdG9yLXBhZ2Utc2l6ZS12YWx1ZSJdLFsiaGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvciIsIiIsMywic2VsZWN0aW9uQ2hhbmdlIiwidmFsdWUiLCJkaXNhYmxlZCIsImFyaWEtbGFiZWxsZWRieSIsInBhbmVsQ2xhc3MiLCJkaXNhYmxlT3B0aW9uQ2VudGVyaW5nIl0sWzMsInZhbHVlIl0sWzEsIm1hdC1tZGMtcGFnaW5hdG9yLXRvdWNoLXRhcmdldCIsMywiY2xpY2siXSxbIm1hdEljb25CdXR0b24iLCIiLCJ0eXBlIiwiYnV0dG9uIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiYWJvdmUiLCJkaXNhYmxlZEludGVyYWN0aXZlIiwiIiwxLCJtYXQtbWRjLXBhZ2luYXRvci1uYXZpZ2F0aW9uLWZpcnN0IiwzLCJjbGljayIsIm1hdFRvb2x0aXAiLCJtYXRUb29sdGlwRGlzYWJsZWQiLCJkaXNhYmxlZCIsInRhYmluZGV4Il0sWyJkIiwiTTE4LjQxIDE2LjU5TDEzLjgyIDEybDQuNTktNC41OUwxNyA2bC02IDYgNiA2ek02IDZoMnYxMkg2eiJdLFsibWF0SWNvbkJ1dHRvbiIsIiIsInR5cGUiLCJidXR0b24iLCJtYXRUb29sdGlwUG9zaXRpb24iLCJhYm92ZSIsImRpc2FibGVkSW50ZXJhY3RpdmUiLCIiLDEsIm1hdC1tZGMtcGFnaW5hdG9yLW5hdmlnYXRpb24tbGFzdCIsMywiY2xpY2siLCJtYXRUb29sdGlwIiwibWF0VG9vbHRpcERpc2FibGVkIiwiZGlzYWJsZWQiLCJ0YWJpbmRleCJdLFsiZCIsIk01LjU5IDcuNDFMMTAuMTggMTJsLTQuNTkgNC41OUw3IDE4bDYtNi02LTZ6TTE2IDZoMnYxMmgtMnoiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsImRpdiIsMSkoMSwiZGl2IiwyKSxNKDIsVkwsNSw0LCJkaXYiLDMpLGMoMywiZGl2Iiw0KSg0LCJkaXYiLDUpLG0oNSkscygpLE0oNixPTCwzLDUsImJ1dHRvbiIsNiksYyg3LCJidXR0b24iLDcpLFMoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiBhLl9idXR0b25DbGlja2VkKGEucGFnZUluZGV4LTEsYS5fcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSl9KSxNdCgpLGMoOCwic3ZnIiw4KSx1KDksInBhdGgiLDkpLHMoKSgpLHlpKCksYygxMCwiYnV0dG9uIiwxMCksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIGEuX2J1dHRvbkNsaWNrZWQoYS5wYWdlSW5kZXgrMSxhLl9uZXh0QnV0dG9uc0Rpc2FibGVkKCkpfSksTXQoKSxjKDExLCJzdmciLDgpLHUoMTIsInBhdGgiLDExKSxzKCkoKSxNKDEzLEhMLDMsNSwiYnV0dG9uIiwxMikscygpKCkoKSksaSYyJiYobCgyKSx3KGEuaGlkZVBhZ2VTaXplPy0xOjIpLGwoMyksRSgiICIsYS5faW50bC5nZXRSYW5nZUxhYmVsKGEucGFnZUluZGV4LGEucGFnZVNpemUsYS5sZW5ndGgpLCIgIiksbCgpLHcoYS5zaG93Rmlyc3RMYXN0QnV0dG9ucz82Oi0xKSxsKCksZigibWF0VG9vbHRpcCIsYS5faW50bC5wcmV2aW91c1BhZ2VMYWJlbCkoIm1hdFRvb2x0aXBEaXNhYmxlZCIsYS5fcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSkoImRpc2FibGVkIixhLl9wcmV2aW91c0J1dHRvbnNEaXNhYmxlZCgpKSgidGFiaW5kZXgiLGEuX3ByZXZpb3VzQnV0dG9uc0Rpc2FibGVkKCk/LTE6bnVsbCksRygiYXJpYS1sYWJlbCIsYS5faW50bC5wcmV2aW91c1BhZ2VMYWJlbCksbCgzKSxmKCJtYXRUb29sdGlwIixhLl9pbnRsLm5leHRQYWdlTGFiZWwpKCJtYXRUb29sdGlwRGlzYWJsZWQiLGEuX25leHRCdXR0b25zRGlzYWJsZWQoKSkoImRpc2FibGVkIixhLl9uZXh0QnV0dG9uc0Rpc2FibGVkKCkpKCJ0YWJpbmRleCIsYS5fbmV4dEJ1dHRvbnNEaXNhYmxlZCgpPy0xOm51bGwpLEcoImFyaWEtbGFiZWwiLGEuX2ludGwubmV4dFBhZ2VMYWJlbCksbCgzKSx3KGEuc2hvd0ZpcnN0TGFzdEJ1dHRvbnM/MTM6LTEpKX0sZGVwZW5kZW5jaWVzOltaZSxabixIMixsMSxSdF0sc3R5bGVzOltgLm1hdC1tZGMtcGFnaW5hdG9ye2Rpc3BsYXk6YmxvY2s7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7Y29sb3I6dmFyKC0tbWF0LXBhZ2luYXRvci1jb250YWluZXItdGV4dC1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlKSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtcGFnaW5hdG9yLWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1tYXQtc3lzLXN1cmZhY2UpKTtmb250LWZhbWlseTp2YXIoLS1tYXQtcGFnaW5hdG9yLWNvbnRhaW5lci10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtYm9keS1zbWFsbC1mb250KSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LXBhZ2luYXRvci1jb250YWluZXItdGV4dC1saW5lLWhlaWdodCwgdmFyKC0tbWF0LXN5cy1ib2R5LXNtYWxsLWxpbmUtaGVpZ2h0KSk7Zm9udC1zaXplOnZhcigtLW1hdC1wYWdpbmF0b3ItY29udGFpbmVyLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LXNtYWxsLXNpemUpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtcGFnaW5hdG9yLWNvbnRhaW5lci10ZXh0LXdlaWdodCwgdmFyKC0tbWF0LXN5cy1ib2R5LXNtYWxsLXdlaWdodCkpO2xldHRlci1zcGFjaW5nOnZhcigtLW1hdC1wYWdpbmF0b3ItY29udGFpbmVyLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtYm9keS1zbWFsbC10cmFja2luZykpOy0tbWF0LWZvcm0tZmllbGQtY29udGFpbmVyLWhlaWdodDogdmFyKC0tbWF0LXBhZ2luYXRvci1mb3JtLWZpZWxkLWNvbnRhaW5lci1oZWlnaHQsIDQwcHgpOy0tbWF0LWZvcm0tZmllbGQtY29udGFpbmVyLXZlcnRpY2FsLXBhZGRpbmc6IHZhcigtLW1hdC1wYWdpbmF0b3ItZm9ybS1maWVsZC1jb250YWluZXItdmVydGljYWwtcGFkZGluZywgOHB4KX0ubWF0LW1kYy1wYWdpbmF0b3IgLm1hdC1tZGMtc2VsZWN0LXZhbHVle2ZvbnQtc2l6ZTp2YXIoLS1tYXQtcGFnaW5hdG9yLXNlbGVjdC10cmlnZ2VyLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LXNtYWxsLXNpemUpKX0ubWF0LW1kYy1wYWdpbmF0b3IgLm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntkaXNwbGF5Om5vbmV9Lm1hdC1tZGMtcGFnaW5hdG9yIC5tYXQtbWRjLXNlbGVjdHtsaW5lLWhlaWdodDoxLjV9Lm1hdC1tZGMtcGFnaW5hdG9yLW91dGVyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXh9Lm1hdC1tZGMtcGFnaW5hdG9yLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtwYWRkaW5nOjAgOHB4O2ZsZXgtd3JhcDp3cmFwO3dpZHRoOjEwMCU7bWluLWhlaWdodDp2YXIoLS1tYXQtcGFnaW5hdG9yLWNvbnRhaW5lci1zaXplLCA1NnB4KX0ubWF0LW1kYy1wYWdpbmF0b3ItcGFnZS1zaXple2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpiYXNlbGluZTttYXJnaW4tcmlnaHQ6OHB4fVtkaXI9cnRsXSAubWF0LW1kYy1wYWdpbmF0b3ItcGFnZS1zaXple21hcmdpbi1yaWdodDowO21hcmdpbi1sZWZ0OjhweH0ubWF0LW1kYy1wYWdpbmF0b3ItcGFnZS1zaXplLWxhYmVse21hcmdpbjowIDRweH0ubWF0LW1kYy1wYWdpbmF0b3ItcGFnZS1zaXplLXNlbGVjdHttYXJnaW46MCA0cHg7d2lkdGg6dmFyKC0tbWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0LXdpZHRoLCA4NHB4KX0ubWF0LW1kYy1wYWdpbmF0b3ItcmFuZ2UtbGFiZWx7bWFyZ2luOjAgMzJweCAwIDI0cHh9Lm1hdC1tZGMtcGFnaW5hdG9yLXJhbmdlLWFjdGlvbnN7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWF0LW1kYy1wYWdpbmF0b3ItaWNvbntkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoyOHB4O2ZpbGw6dmFyKC0tbWF0LXBhZ2luYXRvci1lbmFibGVkLWljb24tY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZS12YXJpYW50KSl9Lm1hdC1tZGMtaWNvbi1idXR0b25bYXJpYS1kaXNhYmxlZF0gLm1hdC1tZGMtcGFnaW5hdG9yLWljb257ZmlsbDp2YXIoLS1tYXQtcGFnaW5hdG9yLWRpc2FibGVkLWljb24tY29sb3IsIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UpIDM4JSwgdHJhbnNwYXJlbnQpKX1bZGlyPXJ0bF0gLm1hdC1tZGMtcGFnaW5hdG9yLWljb257dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtbWRjLWljb24tYnV0dG9uW2FyaWEtZGlzYWJsZWRdIC5tYXQtbWRjLXBhZ2luYXRvci1pY29uLC5tYXQtbWRjLXBhZ2luYXRvci1pY29ue2ZpbGw6Y3VycmVudENvbG9yfS5tYXQtbWRjLXBhZ2luYXRvci1yYW5nZS1hY3Rpb25zIC5tYXQtbWRjLWljb24tYnV0dG9ue291dGxpbmU6c29saWQgMXB4fS5tYXQtbWRjLXBhZ2luYXRvci1yYW5nZS1hY3Rpb25zIC5tYXQtbWRjLWljb24tYnV0dG9uW2FyaWEtZGlzYWJsZWRde2NvbG9yOkdyYXlUZXh0fX0ubWF0LW1kYy1wYWdpbmF0b3ItdG91Y2gtdGFyZ2V0e2Rpc3BsYXk6dmFyKC0tbWF0LXBhZ2luYXRvci10b3VjaC10YXJnZXQtZGlzcGxheSwgYmxvY2spO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bGVmdDo1MCU7d2lkdGg6dmFyKC0tbWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0LXdpZHRoLCA4NHB4KTtoZWlnaHQ6dmFyKC0tbWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0LXRvdWNoLXRhcmdldC1oZWlnaHQsIDQ4cHgpO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsIC01MCUpO2N1cnNvcjpwb2ludGVyfQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCksd2c9KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVtb2Q9eGUoe3R5cGU6dH0pO3N0YXRpYyBcdTAyNzVpbmo9eWUoe3Byb3ZpZGVyczpbUkxdLGltcG9ydHM6W29lLHo0LHM0LG5uXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIHFMKHQsbil7dCYxJiZtZSgwLDIpfWZ1bmN0aW9uIEdMKHQsbil7dCYxJiYoYygwLCJ0aGVhZCIsMCksXzEoMSwxKSxzKCksYygyLCJ0Ym9keSIsMCksXzEoMywyKSg0LDMpLHMoKSxjKDUsInRmb290IiwwKSxfMSg2LDQpLHMoKSl9ZnVuY3Rpb24gV0wodCxuKXt0JjEmJl8xKDAsMSkoMSwyKSgyLDMpKDMsNCl9ZnVuY3Rpb24gUUwodCl7cmV0dXJuWyJjZGstY2VsbCIsImNkay1oZWFkZXItY2VsbCIsImNkay1mb290ZXItY2VsbCJdLnNvbWUobj0+dC5jbGFzc0xpc3QuY29udGFpbnMobikpfWZ1bmN0aW9uIGVjKHQsbil7cmV0dXJuIHQuY29uY2F0KEFycmF5LmZyb20obikpfWZ1bmN0aW9uIGtnKHQsbil7bGV0IGU9bi50b1VwcGVyQ2FzZSgpLGk9dC52aWV3Q29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtmb3IoO2k7KXtsZXQgYT1pLm5vZGVUeXBlPT09MT9pLm5vZGVOYW1lOm51bGw7aWYoYT09PWUpcmV0dXJuIGk7aWYoYT09PSJUQUJMRSIpYnJlYWs7aT1pLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9dmFyIFVMLGpMLE4yLGljLGFjLG5jLCRuLEU0LHpnLFRnLEVnLHI1LEE0LEQ0LHJjLEVhLG81LGM1LHM1LEFnLFNnLG41LHRjLGw1LGQ1LG01LGg1LHA1LERnLElnPXgoKCk9PntDbSgpO2soKTtrKCk7WHQoKTtsdCgpO3k2KCk7dDgoKTtfbSgpO21tKCk7RDIoKTtVTD1bW1siY2FwdGlvbiJdXSxbWyJjb2xncm91cCJdLFsiY29sIl1dLCIqIl0sakw9WyJjYXB0aW9uIiwiY29sZ3JvdXAsIGNvbCIsIioiXTtOMj1uZXcgY2UoIkNES19UQUJMRSIpLGljPSgoKT0+e2NsYXNzIHR7dGVtcGxhdGU9aChoMSk7Y29uc3RydWN0b3IoKXt9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siIiwiY2RrQ2VsbERlZiIsIiJdXX0pfXJldHVybiB0fSkoKSxhYz0oKCk9PntjbGFzcyB0e3RlbXBsYXRlPWgoaDEpO2NvbnN0cnVjdG9yKCl7fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsImNka0hlYWRlckNlbGxEZWYiLCIiXV19KX1yZXR1cm4gdH0pKCksbmM9KCgpPT57Y2xhc3MgdHt0ZW1wbGF0ZT1oKGgxKTtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJjZGtGb290ZXJDZWxsRGVmIiwiIl1dfSl9cmV0dXJuIHR9KSgpLCRuPSgoKT0+e2NsYXNzIHR7X3RhYmxlPWgoTjIse29wdGlvbmFsOiEwfSk7X2hhc1N0aWNreUNoYW5nZWQ9ITE7Z2V0IG5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZX1zZXQgbmFtZShlKXt0aGlzLl9zZXROYW1lSW5wdXQoZSl9X25hbWU7Z2V0IHN0aWNreSgpe3JldHVybiB0aGlzLl9zdGlja3l9c2V0IHN0aWNreShlKXtlIT09dGhpcy5fc3RpY2t5JiYodGhpcy5fc3RpY2t5PWUsdGhpcy5faGFzU3RpY2t5Q2hhbmdlZD0hMCl9X3N0aWNreT0hMTtnZXQgc3RpY2t5RW5kKCl7cmV0dXJuIHRoaXMuX3N0aWNreUVuZH1zZXQgc3RpY2t5RW5kKGUpe2UhPT10aGlzLl9zdGlja3lFbmQmJih0aGlzLl9zdGlja3lFbmQ9ZSx0aGlzLl9oYXNTdGlja3lDaGFuZ2VkPSEwKX1fc3RpY2t5RW5kPSExO2NlbGw7aGVhZGVyQ2VsbDtmb290ZXJDZWxsO2Nzc0NsYXNzRnJpZW5kbHlOYW1lO19jb2x1bW5Dc3NDbGFzc05hbWU7Y29uc3RydWN0b3IoKXt9aGFzU3RpY2t5Q2hhbmdlZCgpe2xldCBlPXRoaXMuX2hhc1N0aWNreUNoYW5nZWQ7cmV0dXJuIHRoaXMucmVzZXRTdGlja3lDaGFuZ2VkKCksZX1yZXNldFN0aWNreUNoYW5nZWQoKXt0aGlzLl9oYXNTdGlja3lDaGFuZ2VkPSExfV91cGRhdGVDb2x1bW5Dc3NDbGFzc05hbWUoKXt0aGlzLl9jb2x1bW5Dc3NDbGFzc05hbWU9W2BjZGstY29sdW1uLSR7dGhpcy5jc3NDbGFzc0ZyaWVuZGx5TmFtZX1gXX1fc2V0TmFtZUlucHV0KGUpe2UmJih0aGlzLl9uYW1lPWUsdGhpcy5jc3NDbGFzc0ZyaWVuZGx5TmFtZT1lLnJlcGxhY2UoL1teYS16MC05Xy1dL2dpLCItIiksdGhpcy5fdXBkYXRlQ29sdW1uQ3NzQ2xhc3NOYW1lKCkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsImNka0NvbHVtbkRlZiIsIiJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbihpLGEscil7aWYoaSYxJiYoQmUocixpYyw1KSxCZShyLGFjLDUpLEJlKHIsbmMsNSkpLGkmMil7bGV0IG87RihvPUIoKSkmJihhLmNlbGw9by5maXJzdCksRihvPUIoKSkmJihhLmhlYWRlckNlbGw9by5maXJzdCksRihvPUIoKSkmJihhLmZvb3RlckNlbGw9by5maXJzdCl9fSxpbnB1dHM6e25hbWU6WzAsImNka0NvbHVtbkRlZiIsIm5hbWUiXSxzdGlja3k6WzIsInN0aWNreSIsInN0aWNreSIsWl0sc3RpY2t5RW5kOlsyLCJzdGlja3lFbmQiLCJzdGlja3lFbmQiLFpdfSxmZWF0dXJlczpbSWUoW3twcm92aWRlOiJNQVRfU09SVF9IRUFERVJfQ09MVU1OX0RFRiIsdXNlRXhpc3Rpbmc6dH1dKV19KX1yZXR1cm4gdH0pKCksRTQ9Y2xhc3N7Y29uc3RydWN0b3IobixlKXtlLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5uLl9jb2x1bW5Dc3NDbGFzc05hbWUpfX0semc9KCgpPT57Y2xhc3MgdCBleHRlbmRzIEU0e2NvbnN0cnVjdG9yKCl7c3VwZXIoaCgkbiksaChhZSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbImNkay1oZWFkZXItY2VsbCJdLFsidGgiLCJjZGstaGVhZGVyLWNlbGwiLCIiXV0saG9zdEF0dHJzOlsicm9sZSIsImNvbHVtbmhlYWRlciIsMSwiY2RrLWhlYWRlci1jZWxsIl0sZmVhdHVyZXM6W0ZlXX0pfXJldHVybiB0fSkoKSxUZz0oKCk9PntjbGFzcyB0IGV4dGVuZHMgRTR7Y29uc3RydWN0b3IoKXtsZXQgZT1oKCRuKSxpPWgoYWUpO3N1cGVyKGUsaSk7bGV0IGE9ZS5fdGFibGU/Ll9nZXRDZWxsUm9sZSgpO2EmJmkubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoInJvbGUiLGEpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbImNkay1mb290ZXItY2VsbCJdLFsidGQiLCJjZGstZm9vdGVyLWNlbGwiLCIiXV0saG9zdEF0dHJzOlsxLCJjZGstZm9vdGVyLWNlbGwiXSxmZWF0dXJlczpbRmVdfSl9cmV0dXJuIHR9KSgpLEVnPSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBFNHtjb25zdHJ1Y3Rvcigpe2xldCBlPWgoJG4pLGk9aChhZSk7c3VwZXIoZSxpKTtsZXQgYT1lLl90YWJsZT8uX2dldENlbGxSb2xlKCk7YSYmaS5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgicm9sZSIsYSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siY2RrLWNlbGwiXSxbInRkIiwiY2RrLWNlbGwiLCIiXV0saG9zdEF0dHJzOlsxLCJjZGstY2VsbCJdLGZlYXR1cmVzOltGZV19KX1yZXR1cm4gdH0pKCkscjU9KCgpPT57Y2xhc3MgdHt0ZW1wbGF0ZT1oKGgxKTtfZGlmZmVycz1oKHVyKTtjb2x1bW5zO19jb2x1bW5zRGlmZmVyO2NvbnN0cnVjdG9yKCl7fW5nT25DaGFuZ2VzKGUpe2lmKCF0aGlzLl9jb2x1bW5zRGlmZmVyKXtsZXQgaT1lLmNvbHVtbnMmJmUuY29sdW1ucy5jdXJyZW50VmFsdWV8fFtdO3RoaXMuX2NvbHVtbnNEaWZmZXI9dGhpcy5fZGlmZmVycy5maW5kKGkpLmNyZWF0ZSgpLHRoaXMuX2NvbHVtbnNEaWZmZXIuZGlmZihpKX19Z2V0Q29sdW1uc0RpZmYoKXtyZXR1cm4gdGhpcy5fY29sdW1uc0RpZmZlci5kaWZmKHRoaXMuY29sdW1ucyl9ZXh0cmFjdENlbGxUZW1wbGF0ZShlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIEE0P2UuaGVhZGVyQ2VsbC50ZW1wbGF0ZTp0aGlzIGluc3RhbmNlb2YgRDQ/ZS5mb290ZXJDZWxsLnRlbXBsYXRlOmUuY2VsbC50ZW1wbGF0ZX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LGZlYXR1cmVzOltIZV19KX1yZXR1cm4gdH0pKCksQTQ9KCgpPT57Y2xhc3MgdCBleHRlbmRzIHI1e190YWJsZT1oKE4yLHtvcHRpb25hbDohMH0pO19oYXNTdGlja3lDaGFuZ2VkPSExO2dldCBzdGlja3koKXtyZXR1cm4gdGhpcy5fc3RpY2t5fXNldCBzdGlja3koZSl7ZSE9PXRoaXMuX3N0aWNreSYmKHRoaXMuX3N0aWNreT1lLHRoaXMuX2hhc1N0aWNreUNoYW5nZWQ9ITApfV9zdGlja3k9ITE7Y29uc3RydWN0b3IoKXtzdXBlcihoKGgxKSxoKHVyKSl9bmdPbkNoYW5nZXMoZSl7c3VwZXIubmdPbkNoYW5nZXMoZSl9aGFzU3RpY2t5Q2hhbmdlZCgpe2xldCBlPXRoaXMuX2hhc1N0aWNreUNoYW5nZWQ7cmV0dXJuIHRoaXMucmVzZXRTdGlja3lDaGFuZ2VkKCksZX1yZXNldFN0aWNreUNoYW5nZWQoKXt0aGlzLl9oYXNTdGlja3lDaGFuZ2VkPSExfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsImNka0hlYWRlclJvd0RlZiIsIiJdXSxpbnB1dHM6e2NvbHVtbnM6WzAsImNka0hlYWRlclJvd0RlZiIsImNvbHVtbnMiXSxzdGlja3k6WzIsImNka0hlYWRlclJvd0RlZlN0aWNreSIsInN0aWNreSIsWl19LGZlYXR1cmVzOltGZSxIZV19KX1yZXR1cm4gdH0pKCksRDQ9KCgpPT57Y2xhc3MgdCBleHRlbmRzIHI1e190YWJsZT1oKE4yLHtvcHRpb25hbDohMH0pO19oYXNTdGlja3lDaGFuZ2VkPSExO2dldCBzdGlja3koKXtyZXR1cm4gdGhpcy5fc3RpY2t5fXNldCBzdGlja3koZSl7ZSE9PXRoaXMuX3N0aWNreSYmKHRoaXMuX3N0aWNreT1lLHRoaXMuX2hhc1N0aWNreUNoYW5nZWQ9ITApfV9zdGlja3k9ITE7Y29uc3RydWN0b3IoKXtzdXBlcihoKGgxKSxoKHVyKSl9bmdPbkNoYW5nZXMoZSl7c3VwZXIubmdPbkNoYW5nZXMoZSl9aGFzU3RpY2t5Q2hhbmdlZCgpe2xldCBlPXRoaXMuX2hhc1N0aWNreUNoYW5nZWQ7cmV0dXJuIHRoaXMucmVzZXRTdGlja3lDaGFuZ2VkKCksZX1yZXNldFN0aWNreUNoYW5nZWQoKXt0aGlzLl9oYXNTdGlja3lDaGFuZ2VkPSExfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsImNka0Zvb3RlclJvd0RlZiIsIiJdXSxpbnB1dHM6e2NvbHVtbnM6WzAsImNka0Zvb3RlclJvd0RlZiIsImNvbHVtbnMiXSxzdGlja3k6WzIsImNka0Zvb3RlclJvd0RlZlN0aWNreSIsInN0aWNreSIsWl19LGZlYXR1cmVzOltGZSxIZV19KX1yZXR1cm4gdH0pKCkscmM9KCgpPT57Y2xhc3MgdCBleHRlbmRzIHI1e190YWJsZT1oKE4yLHtvcHRpb25hbDohMH0pO3doZW47Y29uc3RydWN0b3IoKXtzdXBlcihoKGgxKSxoKHVyKSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siIiwiY2RrUm93RGVmIiwiIl1dLGlucHV0czp7Y29sdW1uczpbMCwiY2RrUm93RGVmQ29sdW1ucyIsImNvbHVtbnMiXSx3aGVuOlswLCJjZGtSb3dEZWZXaGVuIiwid2hlbiJdfSxmZWF0dXJlczpbRmVdfSl9cmV0dXJuIHR9KSgpLEVhPSgoKT0+e2NsYXNzIHR7X3ZpZXdDb250YWluZXI9aChHMSk7Y2VsbHM7Y29udGV4dDtzdGF0aWMgbW9zdFJlY2VudENlbGxPdXRsZXQ9bnVsbDtjb25zdHJ1Y3Rvcigpe3QubW9zdFJlY2VudENlbGxPdXRsZXQ9dGhpc31uZ09uRGVzdHJveSgpe3QubW9zdFJlY2VudENlbGxPdXRsZXQ9PT10aGlzJiYodC5tb3N0UmVjZW50Q2VsbE91dGxldD1udWxsKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJjZGtDZWxsT3V0bGV0IiwiIl1dfSl9cmV0dXJuIHR9KSgpLG81PSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siY2RrLWhlYWRlci1yb3ciXSxbInRyIiwiY2RrLWhlYWRlci1yb3ciLCIiXV0saG9zdEF0dHJzOlsicm9sZSIsInJvdyIsMSwiY2RrLWhlYWRlci1yb3ciXSxkZWNsczoxLHZhcnM6MCxjb25zdHM6W1siY2RrQ2VsbE91dGxldCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmXzEoMCwwKX0sZGVwZW5kZW5jaWVzOltFYV0sZW5jYXBzdWxhdGlvbjoyfSl9cmV0dXJuIHR9KSgpLGM1PSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siY2RrLWZvb3Rlci1yb3ciXSxbInRyIiwiY2RrLWZvb3Rlci1yb3ciLCIiXV0saG9zdEF0dHJzOlsicm9sZSIsInJvdyIsMSwiY2RrLWZvb3Rlci1yb3ciXSxkZWNsczoxLHZhcnM6MCxjb25zdHM6W1siY2RrQ2VsbE91dGxldCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmXzEoMCwwKX0sZGVwZW5kZW5jaWVzOltFYV0sZW5jYXBzdWxhdGlvbjoyfSl9cmV0dXJuIHR9KSgpLHM1PSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siY2RrLXJvdyJdLFsidHIiLCJjZGstcm93IiwiIl1dLGhvc3RBdHRyczpbInJvbGUiLCJyb3ciLDEsImNkay1yb3ciXSxkZWNsczoxLHZhcnM6MCxjb25zdHM6W1siY2RrQ2VsbE91dGxldCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmXzEoMCwwKX0sZGVwZW5kZW5jaWVzOltFYV0sZW5jYXBzdWxhdGlvbjoyfSl9cmV0dXJuIHR9KSgpLEFnPSgoKT0+e2NsYXNzIHR7dGVtcGxhdGVSZWY9aChoMSk7X2NvbnRlbnRDbGFzc05hbWVzPVsiY2RrLW5vLWRhdGEtcm93IiwiY2RrLXJvdyJdO19jZWxsQ2xhc3NOYW1lcz1bImNkay1jZWxsIiwiY2RrLW5vLWRhdGEtY2VsbCJdO19jZWxsU2VsZWN0b3I9InRkLCBjZGstY2VsbCwgW2Nkay1jZWxsXSwgLmNkay1jZWxsIjtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyJuZy10ZW1wbGF0ZSIsImNka05vRGF0YVJvdyIsIiJdXX0pfXJldHVybiB0fSkoKSxTZz1bInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdLG41PWNsYXNze19pc05hdGl2ZUh0bWxUYWJsZTtfc3RpY2tDZWxsQ3NzO19pc0Jyb3dzZXI7X25lZWRzUG9zaXRpb25TdGlja3lPbkVsZW1lbnQ7ZGlyZWN0aW9uO19wb3NpdGlvbkxpc3RlbmVyO190YWJsZUluamVjdG9yO19lbGVtU2l6ZUNhY2hlPW5ldyBXZWFrTWFwO19yZXNpemVPYnNlcnZlcj1nbG9iYWxUaGlzPy5SZXNpemVPYnNlcnZlcj9uZXcgZ2xvYmFsVGhpcy5SZXNpemVPYnNlcnZlcihuPT50aGlzLl91cGRhdGVDYWNoZWRTaXplcyhuKSk6bnVsbDtfdXBkYXRlZFN0aWNreUNvbHVtbnNQYXJhbXNUb1JlcGxheT1bXTtfc3RpY2t5Q29sdW1uc1JlcGxheVRpbWVvdXQ9bnVsbDtfY2FjaGVkQ2VsbFdpZHRocz1bXTtfYm9yZGVyQ2VsbENzcztfZGVzdHJveWVkPSExO2NvbnN0cnVjdG9yKG4sZSxpPSEwLGE9ITAscixvLGQpe3RoaXMuX2lzTmF0aXZlSHRtbFRhYmxlPW4sdGhpcy5fc3RpY2tDZWxsQ3NzPWUsdGhpcy5faXNCcm93c2VyPWksdGhpcy5fbmVlZHNQb3NpdGlvblN0aWNreU9uRWxlbWVudD1hLHRoaXMuZGlyZWN0aW9uPXIsdGhpcy5fcG9zaXRpb25MaXN0ZW5lcj1vLHRoaXMuX3RhYmxlSW5qZWN0b3I9ZCx0aGlzLl9ib3JkZXJDZWxsQ3NzPXt0b3A6YCR7ZX0tYm9yZGVyLWVsZW0tdG9wYCxib3R0b206YCR7ZX0tYm9yZGVyLWVsZW0tYm90dG9tYCxsZWZ0OmAke2V9LWJvcmRlci1lbGVtLWxlZnRgLHJpZ2h0OmAke2V9LWJvcmRlci1lbGVtLXJpZ2h0YH19Y2xlYXJTdGlja3lQb3NpdGlvbmluZyhuLGUpeyhlLmluY2x1ZGVzKCJsZWZ0Iil8fGUuaW5jbHVkZXMoInJpZ2h0IikpJiZ0aGlzLl9yZW1vdmVGcm9tU3RpY2t5Q29sdW1uUmVwbGF5UXVldWUobik7bGV0IGk9W107Zm9yKGxldCBhIG9mIG4pYS5ub2RlVHlwZT09PWEuRUxFTUVOVF9OT0RFJiZpLnB1c2goYSwuLi5BcnJheS5mcm9tKGEuY2hpbGRyZW4pKTttMSh7d3JpdGU6KCk9Pntmb3IobGV0IGEgb2YgaSl0aGlzLl9yZW1vdmVTdGlja3lTdHlsZShhLGUpfX0se2luamVjdG9yOnRoaXMuX3RhYmxlSW5qZWN0b3J9KX11cGRhdGVTdGlja3lDb2x1bW5zKG4sZSxpLGE9ITAscj0hMCl7aWYoIW4ubGVuZ3RofHwhdGhpcy5faXNCcm93c2VyfHwhKGUuc29tZShVPT5VKXx8aS5zb21lKFU9PlUpKSl7dGhpcy5fcG9zaXRpb25MaXN0ZW5lcj8uc3RpY2t5Q29sdW1uc1VwZGF0ZWQoe3NpemVzOltdfSksdGhpcy5fcG9zaXRpb25MaXN0ZW5lcj8uc3RpY2t5RW5kQ29sdW1uc1VwZGF0ZWQoe3NpemVzOltdfSk7cmV0dXJufWxldCBvPW5bMF0sZD1vLmNoaWxkcmVuLmxlbmd0aCxwPXRoaXMuZGlyZWN0aW9uPT09InJ0bCIsZz1wPyJyaWdodCI6ImxlZnQiLF89cD8ibGVmdCI6InJpZ2h0Iix5PWUubGFzdEluZGV4T2YoITApLEk9aS5pbmRleE9mKCEwKSxQLFYsTztyJiZ0aGlzLl91cGRhdGVTdGlja3lDb2x1bW5SZXBsYXlRdWV1ZSh7cm93czpbLi4ubl0sc3RpY2t5U3RhcnRTdGF0ZXM6Wy4uLmVdLHN0aWNreUVuZFN0YXRlczpbLi4uaV19KSxtMSh7ZWFybHlSZWFkOigpPT57UD10aGlzLl9nZXRDZWxsV2lkdGhzKG8sYSksVj10aGlzLl9nZXRTdGlja3lTdGFydENvbHVtblBvc2l0aW9ucyhQLGUpLE89dGhpcy5fZ2V0U3RpY2t5RW5kQ29sdW1uUG9zaXRpb25zKFAsaSl9LHdyaXRlOigpPT57Zm9yKGxldCBVIG9mIG4pZm9yKGxldCBRPTA7UTxkO1ErKyl7bGV0IGZlPVUuY2hpbGRyZW5bUV07ZVtRXSYmdGhpcy5fYWRkU3RpY2t5U3R5bGUoZmUsZyxWW1FdLFE9PT15KSxpW1FdJiZ0aGlzLl9hZGRTdGlja3lTdHlsZShmZSxfLE9bUV0sUT09PUkpfXRoaXMuX3Bvc2l0aW9uTGlzdGVuZXImJlAuc29tZShVPT4hIVUpJiYodGhpcy5fcG9zaXRpb25MaXN0ZW5lci5zdGlja3lDb2x1bW5zVXBkYXRlZCh7c2l6ZXM6eT09PS0xP1tdOlAuc2xpY2UoMCx5KzEpLm1hcCgoVSxRKT0+ZVtRXT9VOm51bGwpfSksdGhpcy5fcG9zaXRpb25MaXN0ZW5lci5zdGlja3lFbmRDb2x1bW5zVXBkYXRlZCh7c2l6ZXM6ST09PS0xP1tdOlAuc2xpY2UoSSkubWFwKChVLFEpPT5pW1ErSV0/VTpudWxsKS5yZXZlcnNlKCl9KSl9fSx7aW5qZWN0b3I6dGhpcy5fdGFibGVJbmplY3Rvcn0pfXN0aWNrUm93cyhuLGUsaSl7aWYoIXRoaXMuX2lzQnJvd3NlcilyZXR1cm47bGV0IGE9aT09PSJib3R0b20iP24uc2xpY2UoKS5yZXZlcnNlKCk6bixyPWk9PT0iYm90dG9tIj9lLnNsaWNlKCkucmV2ZXJzZSgpOmUsbz1bXSxkPVtdLHA9W107bTEoe2Vhcmx5UmVhZDooKT0+e2ZvcihsZXQgZz0wLF89MDtnPGEubGVuZ3RoO2crKyl7aWYoIXJbZ10pY29udGludWU7b1tnXT1fO2xldCB5PWFbZ107cFtnXT10aGlzLl9pc05hdGl2ZUh0bWxUYWJsZT9BcnJheS5mcm9tKHkuY2hpbGRyZW4pOlt5XTtsZXQgST10aGlzLl9yZXRyaWV2ZUVsZW1lbnRTaXplKHkpLmhlaWdodDtfKz1JLGRbZ109SX19LHdyaXRlOigpPT57bGV0IGc9ci5sYXN0SW5kZXhPZighMCk7Zm9yKGxldCBfPTA7XzxhLmxlbmd0aDtfKyspe2lmKCFyW19dKWNvbnRpbnVlO2xldCB5PW9bX10sST1fPT09Zztmb3IobGV0IFAgb2YgcFtfXSl0aGlzLl9hZGRTdGlja3lTdHlsZShQLGkseSxJKX1pPT09InRvcCI/dGhpcy5fcG9zaXRpb25MaXN0ZW5lcj8uc3RpY2t5SGVhZGVyUm93c1VwZGF0ZWQoe3NpemVzOmQsb2Zmc2V0czpvLGVsZW1lbnRzOnB9KTp0aGlzLl9wb3NpdGlvbkxpc3RlbmVyPy5zdGlja3lGb290ZXJSb3dzVXBkYXRlZCh7c2l6ZXM6ZCxvZmZzZXRzOm8sZWxlbWVudHM6cH0pfX0se2luamVjdG9yOnRoaXMuX3RhYmxlSW5qZWN0b3J9KX11cGRhdGVTdGlja3lGb290ZXJDb250YWluZXIobixlKXt0aGlzLl9pc05hdGl2ZUh0bWxUYWJsZSYmbTEoe3dyaXRlOigpPT57bGV0IGk9bi5xdWVyeVNlbGVjdG9yKCJ0Zm9vdCIpO2kmJihlLnNvbWUoYT0+IWEpP3RoaXMuX3JlbW92ZVN0aWNreVN0eWxlKGksWyJib3R0b20iXSk6dGhpcy5fYWRkU3RpY2t5U3R5bGUoaSwiYm90dG9tIiwwLCExKSl9fSx7aW5qZWN0b3I6dGhpcy5fdGFibGVJbmplY3Rvcn0pfWRlc3Ryb3koKXt0aGlzLl9zdGlja3lDb2x1bW5zUmVwbGF5VGltZW91dCYmY2xlYXJUaW1lb3V0KHRoaXMuX3N0aWNreUNvbHVtbnNSZXBsYXlUaW1lb3V0KSx0aGlzLl9yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpLHRoaXMuX2Rlc3Ryb3llZD0hMH1fcmVtb3ZlU3RpY2t5U3R5bGUobixlKXtpZighbi5jbGFzc0xpc3QuY29udGFpbnModGhpcy5fc3RpY2tDZWxsQ3NzKSlyZXR1cm47Zm9yKGxldCBhIG9mIGUpbi5zdHlsZVthXT0iIixuLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fYm9yZGVyQ2VsbENzc1thXSk7U2cuc29tZShhPT5lLmluZGV4T2YoYSk9PT0tMSYmbi5zdHlsZVthXSk/bi5zdHlsZS56SW5kZXg9dGhpcy5fZ2V0Q2FsY3VsYXRlZFpJbmRleChuKToobi5zdHlsZS56SW5kZXg9IiIsdGhpcy5fbmVlZHNQb3NpdGlvblN0aWNreU9uRWxlbWVudCYmKG4uc3R5bGUucG9zaXRpb249IiIpLG4uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9zdGlja0NlbGxDc3MpKX1fYWRkU3RpY2t5U3R5bGUobixlLGksYSl7bi5jbGFzc0xpc3QuYWRkKHRoaXMuX3N0aWNrQ2VsbENzcyksYSYmbi5jbGFzc0xpc3QuYWRkKHRoaXMuX2JvcmRlckNlbGxDc3NbZV0pLG4uc3R5bGVbZV09YCR7aX1weGAsbi5zdHlsZS56SW5kZXg9dGhpcy5fZ2V0Q2FsY3VsYXRlZFpJbmRleChuKSx0aGlzLl9uZWVkc1Bvc2l0aW9uU3RpY2t5T25FbGVtZW50JiYobi5zdHlsZS5jc3NUZXh0Kz0icG9zaXRpb246IC13ZWJraXQtc3RpY2t5OyBwb3NpdGlvbjogc3RpY2t5OyAiKX1fZ2V0Q2FsY3VsYXRlZFpJbmRleChuKXtsZXQgZT17dG9wOjEwMCxib3R0b206MTAsbGVmdDoxLHJpZ2h0OjF9LGk9MDtmb3IobGV0IGEgb2YgU2cpbi5zdHlsZVthXSYmKGkrPWVbYV0pO3JldHVybiBpP2Ake2l9YDoiIn1fZ2V0Q2VsbFdpZHRocyhuLGU9ITApe2lmKCFlJiZ0aGlzLl9jYWNoZWRDZWxsV2lkdGhzLmxlbmd0aClyZXR1cm4gdGhpcy5fY2FjaGVkQ2VsbFdpZHRocztsZXQgaT1bXSxhPW4uY2hpbGRyZW47Zm9yKGxldCByPTA7cjxhLmxlbmd0aDtyKyspe2xldCBvPWFbcl07aS5wdXNoKHRoaXMuX3JldHJpZXZlRWxlbWVudFNpemUobykud2lkdGgpfXJldHVybiB0aGlzLl9jYWNoZWRDZWxsV2lkdGhzPWksaX1fZ2V0U3RpY2t5U3RhcnRDb2x1bW5Qb3NpdGlvbnMobixlKXtsZXQgaT1bXSxhPTA7Zm9yKGxldCByPTA7cjxuLmxlbmd0aDtyKyspZVtyXSYmKGlbcl09YSxhKz1uW3JdKTtyZXR1cm4gaX1fZ2V0U3RpY2t5RW5kQ29sdW1uUG9zaXRpb25zKG4sZSl7bGV0IGk9W10sYT0wO2ZvcihsZXQgcj1uLmxlbmd0aDtyPjA7ci0tKWVbcl0mJihpW3JdPWEsYSs9bltyXSk7cmV0dXJuIGl9X3JldHJpZXZlRWxlbWVudFNpemUobil7bGV0IGU9dGhpcy5fZWxlbVNpemVDYWNoZS5nZXQobik7aWYoZSlyZXR1cm4gZTtsZXQgaT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9e3dpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0fTtyZXR1cm4gdGhpcy5fcmVzaXplT2JzZXJ2ZXImJih0aGlzLl9lbGVtU2l6ZUNhY2hlLnNldChuLGEpLHRoaXMuX3Jlc2l6ZU9ic2VydmVyLm9ic2VydmUobix7Ym94OiJib3JkZXItYm94In0pKSxhfV91cGRhdGVTdGlja3lDb2x1bW5SZXBsYXlRdWV1ZShuKXt0aGlzLl9yZW1vdmVGcm9tU3RpY2t5Q29sdW1uUmVwbGF5UXVldWUobi5yb3dzKSx0aGlzLl9zdGlja3lDb2x1bW5zUmVwbGF5VGltZW91dHx8dGhpcy5fdXBkYXRlZFN0aWNreUNvbHVtbnNQYXJhbXNUb1JlcGxheS5wdXNoKG4pfV9yZW1vdmVGcm9tU3RpY2t5Q29sdW1uUmVwbGF5UXVldWUobil7bGV0IGU9bmV3IFNldChuKTtmb3IobGV0IGkgb2YgdGhpcy5fdXBkYXRlZFN0aWNreUNvbHVtbnNQYXJhbXNUb1JlcGxheSlpLnJvd3M9aS5yb3dzLmZpbHRlcihhPT4hZS5oYXMoYSkpO3RoaXMuX3VwZGF0ZWRTdGlja3lDb2x1bW5zUGFyYW1zVG9SZXBsYXk9dGhpcy5fdXBkYXRlZFN0aWNreUNvbHVtbnNQYXJhbXNUb1JlcGxheS5maWx0ZXIoaT0+ISFpLnJvd3MubGVuZ3RoKX1fdXBkYXRlQ2FjaGVkU2l6ZXMobil7bGV0IGU9ITE7Zm9yKGxldCBpIG9mIG4pe2xldCBhPWkuYm9yZGVyQm94U2l6ZT8ubGVuZ3RoP3t3aWR0aDppLmJvcmRlckJveFNpemVbMF0uaW5saW5lU2l6ZSxoZWlnaHQ6aS5ib3JkZXJCb3hTaXplWzBdLmJsb2NrU2l6ZX06e3dpZHRoOmkuY29udGVudFJlY3Qud2lkdGgsaGVpZ2h0OmkuY29udGVudFJlY3QuaGVpZ2h0fTthLndpZHRoIT09dGhpcy5fZWxlbVNpemVDYWNoZS5nZXQoaS50YXJnZXQpPy53aWR0aCYmUUwoaS50YXJnZXQpJiYoZT0hMCksdGhpcy5fZWxlbVNpemVDYWNoZS5zZXQoaS50YXJnZXQsYSl9ZSYmdGhpcy5fdXBkYXRlZFN0aWNreUNvbHVtbnNQYXJhbXNUb1JlcGxheS5sZW5ndGgmJih0aGlzLl9zdGlja3lDb2x1bW5zUmVwbGF5VGltZW91dCYmY2xlYXJUaW1lb3V0KHRoaXMuX3N0aWNreUNvbHVtbnNSZXBsYXlUaW1lb3V0KSx0aGlzLl9zdGlja3lDb2x1bW5zUmVwbGF5VGltZW91dD1zZXRUaW1lb3V0KCgpPT57aWYoIXRoaXMuX2Rlc3Ryb3llZCl7Zm9yKGxldCBpIG9mIHRoaXMuX3VwZGF0ZWRTdGlja3lDb2x1bW5zUGFyYW1zVG9SZXBsYXkpdGhpcy51cGRhdGVTdGlja3lDb2x1bW5zKGkucm93cyxpLnN0aWNreVN0YXJ0U3RhdGVzLGkuc3RpY2t5RW5kU3RhdGVzLCEwLCExKTt0aGlzLl91cGRhdGVkU3RpY2t5Q29sdW1uc1BhcmFtc1RvUmVwbGF5PVtdLHRoaXMuX3N0aWNreUNvbHVtbnNSZXBsYXlUaW1lb3V0PW51bGx9fSwwKSl9fTt0Yz1uZXcgY2UoIkNES19TUEwiKSxsNT0oKCk9PntjbGFzcyB0e3ZpZXdDb250YWluZXI9aChHMSk7ZWxlbWVudFJlZj1oKGFlKTtjb25zdHJ1Y3Rvcigpe2xldCBlPWgoTjIpO2UuX3Jvd091dGxldD10aGlzLGUuX291dGxldEFzc2lnbmVkKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siIiwicm93T3V0bGV0IiwiIl1dfSl9cmV0dXJuIHR9KSgpLGQ1PSgoKT0+e2NsYXNzIHR7dmlld0NvbnRhaW5lcj1oKEcxKTtlbGVtZW50UmVmPWgoYWUpO2NvbnN0cnVjdG9yKCl7bGV0IGU9aChOMik7ZS5faGVhZGVyUm93T3V0bGV0PXRoaXMsZS5fb3V0bGV0QXNzaWduZWQoKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJoZWFkZXJSb3dPdXRsZXQiLCIiXV19KX1yZXR1cm4gdH0pKCksbTU9KCgpPT57Y2xhc3MgdHt2aWV3Q29udGFpbmVyPWgoRzEpO2VsZW1lbnRSZWY9aChhZSk7Y29uc3RydWN0b3IoKXtsZXQgZT1oKE4yKTtlLl9mb290ZXJSb3dPdXRsZXQ9dGhpcyxlLl9vdXRsZXRBc3NpZ25lZCgpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsImZvb3RlclJvd091dGxldCIsIiJdXX0pfXJldHVybiB0fSkoKSxoNT0oKCk9PntjbGFzcyB0e3ZpZXdDb250YWluZXI9aChHMSk7ZWxlbWVudFJlZj1oKGFlKTtjb25zdHJ1Y3Rvcigpe2xldCBlPWgoTjIpO2UuX25vRGF0YVJvd091dGxldD10aGlzLGUuX291dGxldEFzc2lnbmVkKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siIiwibm9EYXRhUm93T3V0bGV0IiwiIl1dfSl9cmV0dXJuIHR9KSgpLHA1PSgoKT0+e2NsYXNzIHR7X2RpZmZlcnM9aCh1cik7X2NoYW5nZURldGVjdG9yUmVmPWgoRWUpO19lbGVtZW50UmVmPWgoYWUpO19kaXI9aChuMSx7b3B0aW9uYWw6ITB9KTtfcGxhdGZvcm09aChiMSk7X3ZpZXdSZXBlYXRlcj1oKGJyKTtfdmlld3BvcnRSdWxlcj1oKCQyKTtfc3RpY2t5UG9zaXRpb25pbmdMaXN0ZW5lcj1oKHRjLHtvcHRpb25hbDohMCxza2lwU2VsZjohMH0pO19kb2N1bWVudD1oKGp0KTtfZGF0YTtfb25EZXN0cm95PW5ldyB3ZTtfcmVuZGVyUm93cztfcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uO19jb2x1bW5EZWZzQnlOYW1lPW5ldyBNYXA7X3Jvd0RlZnM7X2hlYWRlclJvd0RlZnM7X2Zvb3RlclJvd0RlZnM7X2RhdGFEaWZmZXI7X2RlZmF1bHRSb3dEZWY7X2N1c3RvbUNvbHVtbkRlZnM9bmV3IFNldDtfY3VzdG9tUm93RGVmcz1uZXcgU2V0O19jdXN0b21IZWFkZXJSb3dEZWZzPW5ldyBTZXQ7X2N1c3RvbUZvb3RlclJvd0RlZnM9bmV3IFNldDtfY3VzdG9tTm9EYXRhUm93O19oZWFkZXJSb3dEZWZDaGFuZ2VkPSEwO19mb290ZXJSb3dEZWZDaGFuZ2VkPSEwO19zdGlja3lDb2x1bW5TdHlsZXNOZWVkUmVzZXQ9ITA7X2ZvcmNlUmVjYWxjdWxhdGVDZWxsV2lkdGhzPSEwO19jYWNoZWRSZW5kZXJSb3dzTWFwPW5ldyBNYXA7X2lzTmF0aXZlSHRtbFRhYmxlO19zdGlja3lTdHlsZXI7c3RpY2t5Q3NzQ2xhc3M9ImNkay10YWJsZS1zdGlja3kiO25lZWRzUG9zaXRpb25TdGlja3lPbkVsZW1lbnQ9ITA7X2lzU2VydmVyO19pc1Nob3dpbmdOb0RhdGFSb3c9ITE7X2hhc0FsbE91dGxldHM9ITE7X2hhc0luaXRpYWxpemVkPSExO19nZXRDZWxsUm9sZSgpe2lmKHRoaXMuX2NlbGxSb2xlSW50ZXJuYWw9PT12b2lkIDApe2xldCBlPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoInJvbGUiKTtyZXR1cm4gZT09PSJncmlkInx8ZT09PSJ0cmVlZ3JpZCI/ImdyaWRjZWxsIjoiY2VsbCJ9cmV0dXJuIHRoaXMuX2NlbGxSb2xlSW50ZXJuYWx9X2NlbGxSb2xlSW50ZXJuYWw9dm9pZCAwO2dldCB0cmFja0J5KCl7cmV0dXJuIHRoaXMuX3RyYWNrQnlGbn1zZXQgdHJhY2tCeShlKXt0aGlzLl90cmFja0J5Rm49ZX1fdHJhY2tCeUZuO2dldCBkYXRhU291cmNlKCl7cmV0dXJuIHRoaXMuX2RhdGFTb3VyY2V9c2V0IGRhdGFTb3VyY2UoZSl7dGhpcy5fZGF0YVNvdXJjZSE9PWUmJnRoaXMuX3N3aXRjaERhdGFTb3VyY2UoZSl9X2RhdGFTb3VyY2U7Z2V0IG11bHRpVGVtcGxhdGVEYXRhUm93cygpe3JldHVybiB0aGlzLl9tdWx0aVRlbXBsYXRlRGF0YVJvd3N9c2V0IG11bHRpVGVtcGxhdGVEYXRhUm93cyhlKXt0aGlzLl9tdWx0aVRlbXBsYXRlRGF0YVJvd3M9ZSx0aGlzLl9yb3dPdXRsZXQmJnRoaXMuX3Jvd091dGxldC52aWV3Q29udGFpbmVyLmxlbmd0aCYmKHRoaXMuX2ZvcmNlUmVuZGVyRGF0YVJvd3MoKSx0aGlzLnVwZGF0ZVN0aWNreUNvbHVtblN0eWxlcygpKX1fbXVsdGlUZW1wbGF0ZURhdGFSb3dzPSExO2dldCBmaXhlZExheW91dCgpe3JldHVybiB0aGlzLl9maXhlZExheW91dH1zZXQgZml4ZWRMYXlvdXQoZSl7dGhpcy5fZml4ZWRMYXlvdXQ9ZSx0aGlzLl9mb3JjZVJlY2FsY3VsYXRlQ2VsbFdpZHRocz0hMCx0aGlzLl9zdGlja3lDb2x1bW5TdHlsZXNOZWVkUmVzZXQ9ITB9X2ZpeGVkTGF5b3V0PSExO2NvbnRlbnRDaGFuZ2VkPW5ldyBOO3ZpZXdDaGFuZ2U9bmV3IGQyKHtzdGFydDowLGVuZDpOdW1iZXIuTUFYX1ZBTFVFfSk7X3Jvd091dGxldDtfaGVhZGVyUm93T3V0bGV0O19mb290ZXJSb3dPdXRsZXQ7X25vRGF0YVJvd091dGxldDtfY29udGVudENvbHVtbkRlZnM7X2NvbnRlbnRSb3dEZWZzO19jb250ZW50SGVhZGVyUm93RGVmcztfY29udGVudEZvb3RlclJvd0RlZnM7X25vRGF0YVJvdztfaW5qZWN0b3I9aChzdCk7Y29uc3RydWN0b3IoKXtoKG5ldyBwaSgicm9sZSIpLHtvcHRpb25hbDohMH0pfHx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJyb2xlIiwidGFibGUiKSx0aGlzLl9pc1NlcnZlcj0hdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyLHRoaXMuX2lzTmF0aXZlSHRtbFRhYmxlPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5ub2RlTmFtZT09PSJUQUJMRSIsdGhpcy5fZGF0YURpZmZlcj10aGlzLl9kaWZmZXJzLmZpbmQoW10pLmNyZWF0ZSgoaSxhKT0+dGhpcy50cmFja0J5P3RoaXMudHJhY2tCeShhLmRhdGFJbmRleCxhLmRhdGEpOmEpfW5nT25Jbml0KCl7dGhpcy5fc2V0dXBTdGlja3lTdHlsZXIoKSx0aGlzLl92aWV3cG9ydFJ1bGVyLmNoYW5nZSgpLnBpcGUoeHQodGhpcy5fb25EZXN0cm95KSkuc3Vic2NyaWJlKCgpPT57dGhpcy5fZm9yY2VSZWNhbGN1bGF0ZUNlbGxXaWR0aHM9ITB9KX1uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLl9oYXNJbml0aWFsaXplZD0hMH1uZ0FmdGVyQ29udGVudENoZWNrZWQoKXt0aGlzLl9jYW5SZW5kZXIoKSYmdGhpcy5fcmVuZGVyKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9zdGlja3lTdHlsZXI/LmRlc3Ryb3koKSxbdGhpcy5fcm93T3V0bGV0Py52aWV3Q29udGFpbmVyLHRoaXMuX2hlYWRlclJvd091dGxldD8udmlld0NvbnRhaW5lcix0aGlzLl9mb290ZXJSb3dPdXRsZXQ/LnZpZXdDb250YWluZXIsdGhpcy5fY2FjaGVkUmVuZGVyUm93c01hcCx0aGlzLl9jdXN0b21Db2x1bW5EZWZzLHRoaXMuX2N1c3RvbVJvd0RlZnMsdGhpcy5fY3VzdG9tSGVhZGVyUm93RGVmcyx0aGlzLl9jdXN0b21Gb290ZXJSb3dEZWZzLHRoaXMuX2NvbHVtbkRlZnNCeU5hbWVdLmZvckVhY2goZT0+e2U/LmNsZWFyKCl9KSx0aGlzLl9oZWFkZXJSb3dEZWZzPVtdLHRoaXMuX2Zvb3RlclJvd0RlZnM9W10sdGhpcy5fZGVmYXVsdFJvd0RlZj1udWxsLHRoaXMuX29uRGVzdHJveS5uZXh0KCksdGhpcy5fb25EZXN0cm95LmNvbXBsZXRlKCksWW8odGhpcy5kYXRhU291cmNlKSYmdGhpcy5kYXRhU291cmNlLmRpc2Nvbm5lY3QodGhpcyl9cmVuZGVyUm93cygpe3RoaXMuX3JlbmRlclJvd3M9dGhpcy5fZ2V0QWxsUmVuZGVyUm93cygpO2xldCBlPXRoaXMuX2RhdGFEaWZmZXIuZGlmZih0aGlzLl9yZW5kZXJSb3dzKTtpZighZSl7dGhpcy5fdXBkYXRlTm9EYXRhUm93KCksdGhpcy5jb250ZW50Q2hhbmdlZC5uZXh0KCk7cmV0dXJufWxldCBpPXRoaXMuX3Jvd091dGxldC52aWV3Q29udGFpbmVyO3RoaXMuX3ZpZXdSZXBlYXRlci5hcHBseUNoYW5nZXMoZSxpLChhLHIsbyk9PnRoaXMuX2dldEVtYmVkZGVkVmlld0FyZ3MoYS5pdGVtLG8pLGE9PmEuaXRlbS5kYXRhLGE9PnthLm9wZXJhdGlvbj09PUFuLklOU0VSVEVEJiZhLmNvbnRleHQmJnRoaXMuX3JlbmRlckNlbGxUZW1wbGF0ZUZvckl0ZW0oYS5yZWNvcmQuaXRlbS5yb3dEZWYsYS5jb250ZXh0KX0pLHRoaXMuX3VwZGF0ZVJvd0luZGV4Q29udGV4dCgpLGUuZm9yRWFjaElkZW50aXR5Q2hhbmdlKGE9PntsZXQgcj1pLmdldChhLmN1cnJlbnRJbmRleCk7ci5jb250ZXh0LiRpbXBsaWNpdD1hLml0ZW0uZGF0YX0pLHRoaXMuX3VwZGF0ZU5vRGF0YVJvdygpLHRoaXMuY29udGVudENoYW5nZWQubmV4dCgpLHRoaXMudXBkYXRlU3RpY2t5Q29sdW1uU3R5bGVzKCl9YWRkQ29sdW1uRGVmKGUpe3RoaXMuX2N1c3RvbUNvbHVtbkRlZnMuYWRkKGUpfXJlbW92ZUNvbHVtbkRlZihlKXt0aGlzLl9jdXN0b21Db2x1bW5EZWZzLmRlbGV0ZShlKX1hZGRSb3dEZWYoZSl7dGhpcy5fY3VzdG9tUm93RGVmcy5hZGQoZSl9cmVtb3ZlUm93RGVmKGUpe3RoaXMuX2N1c3RvbVJvd0RlZnMuZGVsZXRlKGUpfWFkZEhlYWRlclJvd0RlZihlKXt0aGlzLl9jdXN0b21IZWFkZXJSb3dEZWZzLmFkZChlKSx0aGlzLl9oZWFkZXJSb3dEZWZDaGFuZ2VkPSEwfXJlbW92ZUhlYWRlclJvd0RlZihlKXt0aGlzLl9jdXN0b21IZWFkZXJSb3dEZWZzLmRlbGV0ZShlKSx0aGlzLl9oZWFkZXJSb3dEZWZDaGFuZ2VkPSEwfWFkZEZvb3RlclJvd0RlZihlKXt0aGlzLl9jdXN0b21Gb290ZXJSb3dEZWZzLmFkZChlKSx0aGlzLl9mb290ZXJSb3dEZWZDaGFuZ2VkPSEwfXJlbW92ZUZvb3RlclJvd0RlZihlKXt0aGlzLl9jdXN0b21Gb290ZXJSb3dEZWZzLmRlbGV0ZShlKSx0aGlzLl9mb290ZXJSb3dEZWZDaGFuZ2VkPSEwfXNldE5vRGF0YVJvdyhlKXt0aGlzLl9jdXN0b21Ob0RhdGFSb3c9ZX11cGRhdGVTdGlja3lIZWFkZXJSb3dTdHlsZXMoKXtsZXQgZT10aGlzLl9nZXRSZW5kZXJlZFJvd3ModGhpcy5faGVhZGVyUm93T3V0bGV0KTtpZih0aGlzLl9pc05hdGl2ZUh0bWxUYWJsZSl7bGV0IGE9a2codGhpcy5faGVhZGVyUm93T3V0bGV0LCJ0aGVhZCIpO2EmJihhLnN0eWxlLmRpc3BsYXk9ZS5sZW5ndGg/IiI6Im5vbmUiKX1sZXQgaT10aGlzLl9oZWFkZXJSb3dEZWZzLm1hcChhPT5hLnN0aWNreSk7dGhpcy5fc3RpY2t5U3R5bGVyLmNsZWFyU3RpY2t5UG9zaXRpb25pbmcoZSxbInRvcCJdKSx0aGlzLl9zdGlja3lTdHlsZXIuc3RpY2tSb3dzKGUsaSwidG9wIiksdGhpcy5faGVhZGVyUm93RGVmcy5mb3JFYWNoKGE9PmEucmVzZXRTdGlja3lDaGFuZ2VkKCkpfXVwZGF0ZVN0aWNreUZvb3RlclJvd1N0eWxlcygpe2xldCBlPXRoaXMuX2dldFJlbmRlcmVkUm93cyh0aGlzLl9mb290ZXJSb3dPdXRsZXQpO2lmKHRoaXMuX2lzTmF0aXZlSHRtbFRhYmxlKXtsZXQgYT1rZyh0aGlzLl9mb290ZXJSb3dPdXRsZXQsInRmb290Iik7YSYmKGEuc3R5bGUuZGlzcGxheT1lLmxlbmd0aD8iIjoibm9uZSIpfWxldCBpPXRoaXMuX2Zvb3RlclJvd0RlZnMubWFwKGE9PmEuc3RpY2t5KTt0aGlzLl9zdGlja3lTdHlsZXIuY2xlYXJTdGlja3lQb3NpdGlvbmluZyhlLFsiYm90dG9tIl0pLHRoaXMuX3N0aWNreVN0eWxlci5zdGlja1Jvd3MoZSxpLCJib3R0b20iKSx0aGlzLl9zdGlja3lTdHlsZXIudXBkYXRlU3RpY2t5Rm9vdGVyQ29udGFpbmVyKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxpKSx0aGlzLl9mb290ZXJSb3dEZWZzLmZvckVhY2goYT0+YS5yZXNldFN0aWNreUNoYW5nZWQoKSl9dXBkYXRlU3RpY2t5Q29sdW1uU3R5bGVzKCl7bGV0IGU9dGhpcy5fZ2V0UmVuZGVyZWRSb3dzKHRoaXMuX2hlYWRlclJvd091dGxldCksaT10aGlzLl9nZXRSZW5kZXJlZFJvd3ModGhpcy5fcm93T3V0bGV0KSxhPXRoaXMuX2dldFJlbmRlcmVkUm93cyh0aGlzLl9mb290ZXJSb3dPdXRsZXQpOyh0aGlzLl9pc05hdGl2ZUh0bWxUYWJsZSYmIXRoaXMuX2ZpeGVkTGF5b3V0fHx0aGlzLl9zdGlja3lDb2x1bW5TdHlsZXNOZWVkUmVzZXQpJiYodGhpcy5fc3RpY2t5U3R5bGVyLmNsZWFyU3RpY2t5UG9zaXRpb25pbmcoWy4uLmUsLi4uaSwuLi5hXSxbImxlZnQiLCJyaWdodCJdKSx0aGlzLl9zdGlja3lDb2x1bW5TdHlsZXNOZWVkUmVzZXQ9ITEpLGUuZm9yRWFjaCgocixvKT0+e3RoaXMuX2FkZFN0aWNreUNvbHVtblN0eWxlcyhbcl0sdGhpcy5faGVhZGVyUm93RGVmc1tvXSl9KSx0aGlzLl9yb3dEZWZzLmZvckVhY2gocj0+e2xldCBvPVtdO2ZvcihsZXQgZD0wO2Q8aS5sZW5ndGg7ZCsrKXRoaXMuX3JlbmRlclJvd3NbZF0ucm93RGVmPT09ciYmby5wdXNoKGlbZF0pO3RoaXMuX2FkZFN0aWNreUNvbHVtblN0eWxlcyhvLHIpfSksYS5mb3JFYWNoKChyLG8pPT57dGhpcy5fYWRkU3RpY2t5Q29sdW1uU3R5bGVzKFtyXSx0aGlzLl9mb290ZXJSb3dEZWZzW29dKX0pLEFycmF5LmZyb20odGhpcy5fY29sdW1uRGVmc0J5TmFtZS52YWx1ZXMoKSkuZm9yRWFjaChyPT5yLnJlc2V0U3RpY2t5Q2hhbmdlZCgpKX1fb3V0bGV0QXNzaWduZWQoKXshdGhpcy5faGFzQWxsT3V0bGV0cyYmdGhpcy5fcm93T3V0bGV0JiZ0aGlzLl9oZWFkZXJSb3dPdXRsZXQmJnRoaXMuX2Zvb3RlclJvd091dGxldCYmdGhpcy5fbm9EYXRhUm93T3V0bGV0JiYodGhpcy5faGFzQWxsT3V0bGV0cz0hMCx0aGlzLl9jYW5SZW5kZXIoKSYmdGhpcy5fcmVuZGVyKCkpfV9jYW5SZW5kZXIoKXtyZXR1cm4gdGhpcy5faGFzQWxsT3V0bGV0cyYmdGhpcy5faGFzSW5pdGlhbGl6ZWR9X3JlbmRlcigpe3RoaXMuX2NhY2hlUm93RGVmcygpLHRoaXMuX2NhY2hlQ29sdW1uRGVmcygpLCF0aGlzLl9oZWFkZXJSb3dEZWZzLmxlbmd0aCYmIXRoaXMuX2Zvb3RlclJvd0RlZnMubGVuZ3RoJiZ0aGlzLl9yb3dEZWZzLmxlbmd0aDtsZXQgaT10aGlzLl9yZW5kZXJVcGRhdGVkQ29sdW1ucygpfHx0aGlzLl9oZWFkZXJSb3dEZWZDaGFuZ2VkfHx0aGlzLl9mb290ZXJSb3dEZWZDaGFuZ2VkO3RoaXMuX3N0aWNreUNvbHVtblN0eWxlc05lZWRSZXNldD10aGlzLl9zdGlja3lDb2x1bW5TdHlsZXNOZWVkUmVzZXR8fGksdGhpcy5fZm9yY2VSZWNhbGN1bGF0ZUNlbGxXaWR0aHM9aSx0aGlzLl9oZWFkZXJSb3dEZWZDaGFuZ2VkJiYodGhpcy5fZm9yY2VSZW5kZXJIZWFkZXJSb3dzKCksdGhpcy5faGVhZGVyUm93RGVmQ2hhbmdlZD0hMSksdGhpcy5fZm9vdGVyUm93RGVmQ2hhbmdlZCYmKHRoaXMuX2ZvcmNlUmVuZGVyRm9vdGVyUm93cygpLHRoaXMuX2Zvb3RlclJvd0RlZkNoYW5nZWQ9ITEpLHRoaXMuZGF0YVNvdXJjZSYmdGhpcy5fcm93RGVmcy5sZW5ndGg+MCYmIXRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbj90aGlzLl9vYnNlcnZlUmVuZGVyQ2hhbmdlcygpOnRoaXMuX3N0aWNreUNvbHVtblN0eWxlc05lZWRSZXNldCYmdGhpcy51cGRhdGVTdGlja3lDb2x1bW5TdHlsZXMoKSx0aGlzLl9jaGVja1N0aWNreVN0YXRlcygpfV9nZXRBbGxSZW5kZXJSb3dzKCl7bGV0IGU9W10saT10aGlzLl9jYWNoZWRSZW5kZXJSb3dzTWFwO2lmKHRoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXA9bmV3IE1hcCwhdGhpcy5fZGF0YSlyZXR1cm4gZTtmb3IobGV0IGE9MDthPHRoaXMuX2RhdGEubGVuZ3RoO2ErKyl7bGV0IHI9dGhpcy5fZGF0YVthXSxvPXRoaXMuX2dldFJlbmRlclJvd3NGb3JEYXRhKHIsYSxpLmdldChyKSk7dGhpcy5fY2FjaGVkUmVuZGVyUm93c01hcC5oYXMocil8fHRoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXAuc2V0KHIsbmV3IFdlYWtNYXApO2ZvcihsZXQgZD0wO2Q8by5sZW5ndGg7ZCsrKXtsZXQgcD1vW2RdLGc9dGhpcy5fY2FjaGVkUmVuZGVyUm93c01hcC5nZXQocC5kYXRhKTtnLmhhcyhwLnJvd0RlZik/Zy5nZXQocC5yb3dEZWYpLnB1c2gocCk6Zy5zZXQocC5yb3dEZWYsW3BdKSxlLnB1c2gocCl9fXJldHVybiBlfV9nZXRSZW5kZXJSb3dzRm9yRGF0YShlLGksYSl7cmV0dXJuIHRoaXMuX2dldFJvd0RlZnMoZSxpKS5tYXAobz0+e2xldCBkPWEmJmEuaGFzKG8pP2EuZ2V0KG8pOltdO2lmKGQubGVuZ3RoKXtsZXQgcD1kLnNoaWZ0KCk7cmV0dXJuIHAuZGF0YUluZGV4PWkscH1lbHNlIHJldHVybntkYXRhOmUscm93RGVmOm8sZGF0YUluZGV4Oml9fSl9X2NhY2hlQ29sdW1uRGVmcygpe3RoaXMuX2NvbHVtbkRlZnNCeU5hbWUuY2xlYXIoKSxlYyh0aGlzLl9nZXRPd25EZWZzKHRoaXMuX2NvbnRlbnRDb2x1bW5EZWZzKSx0aGlzLl9jdXN0b21Db2x1bW5EZWZzKS5mb3JFYWNoKGk9Pnt0aGlzLl9jb2x1bW5EZWZzQnlOYW1lLmhhcyhpLm5hbWUpLHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuc2V0KGkubmFtZSxpKX0pfV9jYWNoZVJvd0RlZnMoKXt0aGlzLl9oZWFkZXJSb3dEZWZzPWVjKHRoaXMuX2dldE93bkRlZnModGhpcy5fY29udGVudEhlYWRlclJvd0RlZnMpLHRoaXMuX2N1c3RvbUhlYWRlclJvd0RlZnMpLHRoaXMuX2Zvb3RlclJvd0RlZnM9ZWModGhpcy5fZ2V0T3duRGVmcyh0aGlzLl9jb250ZW50Rm9vdGVyUm93RGVmcyksdGhpcy5fY3VzdG9tRm9vdGVyUm93RGVmcyksdGhpcy5fcm93RGVmcz1lYyh0aGlzLl9nZXRPd25EZWZzKHRoaXMuX2NvbnRlbnRSb3dEZWZzKSx0aGlzLl9jdXN0b21Sb3dEZWZzKTtsZXQgZT10aGlzLl9yb3dEZWZzLmZpbHRlcihpPT4haS53aGVuKTshdGhpcy5tdWx0aVRlbXBsYXRlRGF0YVJvd3MmJmUubGVuZ3RoPjEsdGhpcy5fZGVmYXVsdFJvd0RlZj1lWzBdfV9yZW5kZXJVcGRhdGVkQ29sdW1ucygpe2xldCBlPShvLGQpPT57bGV0IHA9ISFkLmdldENvbHVtbnNEaWZmKCk7cmV0dXJuIG98fHB9LGk9dGhpcy5fcm93RGVmcy5yZWR1Y2UoZSwhMSk7aSYmdGhpcy5fZm9yY2VSZW5kZXJEYXRhUm93cygpO2xldCBhPXRoaXMuX2hlYWRlclJvd0RlZnMucmVkdWNlKGUsITEpO2EmJnRoaXMuX2ZvcmNlUmVuZGVySGVhZGVyUm93cygpO2xldCByPXRoaXMuX2Zvb3RlclJvd0RlZnMucmVkdWNlKGUsITEpO3JldHVybiByJiZ0aGlzLl9mb3JjZVJlbmRlckZvb3RlclJvd3MoKSxpfHxhfHxyfV9zd2l0Y2hEYXRhU291cmNlKGUpe3RoaXMuX2RhdGE9W10sWW8odGhpcy5kYXRhU291cmNlKSYmdGhpcy5kYXRhU291cmNlLmRpc2Nvbm5lY3QodGhpcyksdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uJiYodGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uPW51bGwpLGV8fCh0aGlzLl9kYXRhRGlmZmVyJiZ0aGlzLl9kYXRhRGlmZmVyLmRpZmYoW10pLHRoaXMuX3Jvd091dGxldCYmdGhpcy5fcm93T3V0bGV0LnZpZXdDb250YWluZXIuY2xlYXIoKSksdGhpcy5fZGF0YVNvdXJjZT1lfV9vYnNlcnZlUmVuZGVyQ2hhbmdlcygpe2lmKCF0aGlzLmRhdGFTb3VyY2UpcmV0dXJuO2xldCBlO1lvKHRoaXMuZGF0YVNvdXJjZSk/ZT10aGlzLmRhdGFTb3VyY2UuY29ubmVjdCh0aGlzKTp6ZCh0aGlzLmRhdGFTb3VyY2UpP2U9dGhpcy5kYXRhU291cmNlOkFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSYmKGU9YzEodGhpcy5kYXRhU291cmNlKSksdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uPWUucGlwZSh4dCh0aGlzLl9vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoaT0+e3RoaXMuX2RhdGE9aXx8W10sdGhpcy5yZW5kZXJSb3dzKCl9KX1fZm9yY2VSZW5kZXJIZWFkZXJSb3dzKCl7dGhpcy5faGVhZGVyUm93T3V0bGV0LnZpZXdDb250YWluZXIubGVuZ3RoPjAmJnRoaXMuX2hlYWRlclJvd091dGxldC52aWV3Q29udGFpbmVyLmNsZWFyKCksdGhpcy5faGVhZGVyUm93RGVmcy5mb3JFYWNoKChlLGkpPT50aGlzLl9yZW5kZXJSb3codGhpcy5faGVhZGVyUm93T3V0bGV0LGUsaSkpLHRoaXMudXBkYXRlU3RpY2t5SGVhZGVyUm93U3R5bGVzKCl9X2ZvcmNlUmVuZGVyRm9vdGVyUm93cygpe3RoaXMuX2Zvb3RlclJvd091dGxldC52aWV3Q29udGFpbmVyLmxlbmd0aD4wJiZ0aGlzLl9mb290ZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMuX2Zvb3RlclJvd0RlZnMuZm9yRWFjaCgoZSxpKT0+dGhpcy5fcmVuZGVyUm93KHRoaXMuX2Zvb3RlclJvd091dGxldCxlLGkpKSx0aGlzLnVwZGF0ZVN0aWNreUZvb3RlclJvd1N0eWxlcygpfV9hZGRTdGlja3lDb2x1bW5TdHlsZXMoZSxpKXtsZXQgYT1BcnJheS5mcm9tKGk/LmNvbHVtbnN8fFtdKS5tYXAoZD0+e2xldCBwPXRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuZ2V0KGQpO3JldHVybiBwfSkscj1hLm1hcChkPT5kLnN0aWNreSksbz1hLm1hcChkPT5kLnN0aWNreUVuZCk7dGhpcy5fc3RpY2t5U3R5bGVyLnVwZGF0ZVN0aWNreUNvbHVtbnMoZSxyLG8sIXRoaXMuX2ZpeGVkTGF5b3V0fHx0aGlzLl9mb3JjZVJlY2FsY3VsYXRlQ2VsbFdpZHRocyl9X2dldFJlbmRlcmVkUm93cyhlKXtsZXQgaT1bXTtmb3IobGV0IGE9MDthPGUudmlld0NvbnRhaW5lci5sZW5ndGg7YSsrKXtsZXQgcj1lLnZpZXdDb250YWluZXIuZ2V0KGEpO2kucHVzaChyLnJvb3ROb2Rlc1swXSl9cmV0dXJuIGl9X2dldFJvd0RlZnMoZSxpKXtpZih0aGlzLl9yb3dEZWZzLmxlbmd0aD09MSlyZXR1cm5bdGhpcy5fcm93RGVmc1swXV07bGV0IGE9W107aWYodGhpcy5tdWx0aVRlbXBsYXRlRGF0YVJvd3MpYT10aGlzLl9yb3dEZWZzLmZpbHRlcihyPT4hci53aGVufHxyLndoZW4oaSxlKSk7ZWxzZXtsZXQgcj10aGlzLl9yb3dEZWZzLmZpbmQobz0+by53aGVuJiZvLndoZW4oaSxlKSl8fHRoaXMuX2RlZmF1bHRSb3dEZWY7ciYmYS5wdXNoKHIpfXJldHVybiBhLmxlbmd0aCxhfV9nZXRFbWJlZGRlZFZpZXdBcmdzKGUsaSl7bGV0IGE9ZS5yb3dEZWYscj17JGltcGxpY2l0OmUuZGF0YX07cmV0dXJue3RlbXBsYXRlUmVmOmEudGVtcGxhdGUsY29udGV4dDpyLGluZGV4Oml9fV9yZW5kZXJSb3coZSxpLGEscj17fSl7bGV0IG89ZS52aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyhpLnRlbXBsYXRlLHIsYSk7cmV0dXJuIHRoaXMuX3JlbmRlckNlbGxUZW1wbGF0ZUZvckl0ZW0oaSxyKSxvfV9yZW5kZXJDZWxsVGVtcGxhdGVGb3JJdGVtKGUsaSl7Zm9yKGxldCBhIG9mIHRoaXMuX2dldENlbGxUZW1wbGF0ZXMoZSkpRWEubW9zdFJlY2VudENlbGxPdXRsZXQmJkVhLm1vc3RSZWNlbnRDZWxsT3V0bGV0Ll92aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyhhLGkpO3RoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfV91cGRhdGVSb3dJbmRleENvbnRleHQoKXtsZXQgZT10aGlzLl9yb3dPdXRsZXQudmlld0NvbnRhaW5lcjtmb3IobGV0IGk9MCxhPWUubGVuZ3RoO2k8YTtpKyspe2xldCBvPWUuZ2V0KGkpLmNvbnRleHQ7by5jb3VudD1hLG8uZmlyc3Q9aT09PTAsby5sYXN0PWk9PT1hLTEsby5ldmVuPWklMj09PTAsby5vZGQ9IW8uZXZlbix0aGlzLm11bHRpVGVtcGxhdGVEYXRhUm93cz8oby5kYXRhSW5kZXg9dGhpcy5fcmVuZGVyUm93c1tpXS5kYXRhSW5kZXgsby5yZW5kZXJJbmRleD1pKTpvLmluZGV4PXRoaXMuX3JlbmRlclJvd3NbaV0uZGF0YUluZGV4fX1fZ2V0Q2VsbFRlbXBsYXRlcyhlKXtyZXR1cm4hZXx8IWUuY29sdW1ucz9bXTpBcnJheS5mcm9tKGUuY29sdW1ucyxpPT57bGV0IGE9dGhpcy5fY29sdW1uRGVmc0J5TmFtZS5nZXQoaSk7cmV0dXJuIGUuZXh0cmFjdENlbGxUZW1wbGF0ZShhKX0pfV9mb3JjZVJlbmRlckRhdGFSb3dzKCl7dGhpcy5fZGF0YURpZmZlci5kaWZmKFtdKSx0aGlzLl9yb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMucmVuZGVyUm93cygpfV9jaGVja1N0aWNreVN0YXRlcygpe2xldCBlPShpLGEpPT5pfHxhLmhhc1N0aWNreUNoYW5nZWQoKTt0aGlzLl9oZWFkZXJSb3dEZWZzLnJlZHVjZShlLCExKSYmdGhpcy51cGRhdGVTdGlja3lIZWFkZXJSb3dTdHlsZXMoKSx0aGlzLl9mb290ZXJSb3dEZWZzLnJlZHVjZShlLCExKSYmdGhpcy51cGRhdGVTdGlja3lGb290ZXJSb3dTdHlsZXMoKSxBcnJheS5mcm9tKHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUudmFsdWVzKCkpLnJlZHVjZShlLCExKSYmKHRoaXMuX3N0aWNreUNvbHVtblN0eWxlc05lZWRSZXNldD0hMCx0aGlzLnVwZGF0ZVN0aWNreUNvbHVtblN0eWxlcygpKX1fc2V0dXBTdGlja3lTdHlsZXIoKXtsZXQgZT10aGlzLl9kaXI/dGhpcy5fZGlyLnZhbHVlOiJsdHIiO3RoaXMuX3N0aWNreVN0eWxlcj1uZXcgbjUodGhpcy5faXNOYXRpdmVIdG1sVGFibGUsdGhpcy5zdGlja3lDc3NDbGFzcyx0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIsdGhpcy5uZWVkc1Bvc2l0aW9uU3RpY2t5T25FbGVtZW50LGUsdGhpcy5fc3RpY2t5UG9zaXRpb25pbmdMaXN0ZW5lcix0aGlzLl9pbmplY3RvciksKHRoaXMuX2Rpcj90aGlzLl9kaXIuY2hhbmdlOmMxKCkpLnBpcGUoeHQodGhpcy5fb25EZXN0cm95KSkuc3Vic2NyaWJlKGk9Pnt0aGlzLl9zdGlja3lTdHlsZXIuZGlyZWN0aW9uPWksdGhpcy51cGRhdGVTdGlja3lDb2x1bW5TdHlsZXMoKX0pfV9nZXRPd25EZWZzKGUpe3JldHVybiBlLmZpbHRlcihpPT4haS5fdGFibGV8fGkuX3RhYmxlPT09dGhpcyl9X3VwZGF0ZU5vRGF0YVJvdygpe2xldCBlPXRoaXMuX2N1c3RvbU5vRGF0YVJvd3x8dGhpcy5fbm9EYXRhUm93O2lmKCFlKXJldHVybjtsZXQgaT10aGlzLl9yb3dPdXRsZXQudmlld0NvbnRhaW5lci5sZW5ndGg9PT0wO2lmKGk9PT10aGlzLl9pc1Nob3dpbmdOb0RhdGFSb3cpcmV0dXJuO2xldCBhPXRoaXMuX25vRGF0YVJvd091dGxldC52aWV3Q29udGFpbmVyO2lmKGkpe2xldCByPWEuY3JlYXRlRW1iZWRkZWRWaWV3KGUudGVtcGxhdGVSZWYpLG89ci5yb290Tm9kZXNbMF07aWYoci5yb290Tm9kZXMubGVuZ3RoPT09MSYmbz8ubm9kZVR5cGU9PT10aGlzLl9kb2N1bWVudC5FTEVNRU5UX05PREUpe28uc2V0QXR0cmlidXRlKCJyb2xlIiwicm93Iiksby5jbGFzc0xpc3QuYWRkKC4uLmUuX2NvbnRlbnRDbGFzc05hbWVzKTtsZXQgZD1vLnF1ZXJ5U2VsZWN0b3JBbGwoZS5fY2VsbFNlbGVjdG9yKTtmb3IobGV0IHA9MDtwPGQubGVuZ3RoO3ArKylkW3BdLmNsYXNzTGlzdC5hZGQoLi4uZS5fY2VsbENsYXNzTmFtZXMpfX1lbHNlIGEuY2xlYXIoKTt0aGlzLl9pc1Nob3dpbmdOb0RhdGFSb3c9aSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJjZGstdGFibGUiXSxbInRhYmxlIiwiY2RrLXRhYmxlIiwiIl1dLGNvbnRlbnRRdWVyaWVzOmZ1bmN0aW9uKGksYSxyKXtpZihpJjEmJihCZShyLEFnLDUpLEJlKHIsJG4sNSksQmUocixyYyw1KSxCZShyLEE0LDUpLEJlKHIsRDQsNSkpLGkmMil7bGV0IG87RihvPUIoKSkmJihhLl9ub0RhdGFSb3c9by5maXJzdCksRihvPUIoKSkmJihhLl9jb250ZW50Q29sdW1uRGVmcz1vKSxGKG89QigpKSYmKGEuX2NvbnRlbnRSb3dEZWZzPW8pLEYobz1CKCkpJiYoYS5fY29udGVudEhlYWRlclJvd0RlZnM9byksRihvPUIoKSkmJihhLl9jb250ZW50Rm9vdGVyUm93RGVmcz1vKX19LGhvc3RBdHRyczpbMSwiY2RrLXRhYmxlIl0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJmllKCJjZGstdGFibGUtZml4ZWQtbGF5b3V0IixhLmZpeGVkTGF5b3V0KX0saW5wdXRzOnt0cmFja0J5OiJ0cmFja0J5IixkYXRhU291cmNlOiJkYXRhU291cmNlIixtdWx0aVRlbXBsYXRlRGF0YVJvd3M6WzIsIm11bHRpVGVtcGxhdGVEYXRhUm93cyIsIm11bHRpVGVtcGxhdGVEYXRhUm93cyIsWl0sZml4ZWRMYXlvdXQ6WzIsImZpeGVkTGF5b3V0IiwiZml4ZWRMYXlvdXQiLFpdfSxvdXRwdXRzOntjb250ZW50Q2hhbmdlZDoiY29udGVudENoYW5nZWQifSxleHBvcnRBczpbImNka1RhYmxlIl0sZmVhdHVyZXM6W0llKFt7cHJvdmlkZTpOMix1c2VFeGlzdGluZzp0fSx7cHJvdmlkZTpicix1c2VDbGFzczpqbn0se3Byb3ZpZGU6dGMsdXNlVmFsdWU6bnVsbH1dKV0sbmdDb250ZW50U2VsZWN0b3JzOmpMLGRlY2xzOjUsdmFyczoyLGNvbnN0czpbWyJyb2xlIiwicm93Z3JvdXAiXSxbImhlYWRlclJvd091dGxldCIsIiJdLFsicm93T3V0bGV0IiwiIl0sWyJub0RhdGFSb3dPdXRsZXQiLCIiXSxbImZvb3RlclJvd091dGxldCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKFJlKFVMKSxtZSgwKSxtZSgxLDEpLE0oMixxTCwxLDApLE0oMyxHTCw3LDApKDQsV0wsNCwwKSksaSYyJiYobCgyKSx3KGEuX2lzU2VydmVyPzI6LTEpLGwoKSx3KGEuX2lzTmF0aXZlSHRtbFRhYmxlPzM6NCkpfSxkZXBlbmRlbmNpZXM6W2Q1LGw1LGg1LG01XSxzdHlsZXM6W2AuY2RrLXRhYmxlLWZpeGVkLWxheW91dHt0YWJsZS1sYXlvdXQ6Zml4ZWR9CmBdLGVuY2Fwc3VsYXRpb246Mn0pfXJldHVybiB0fSkoKTtEZz0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NW1vZD14ZSh7dHlwZTp0fSk7c3RhdGljIFx1MDI3NWluaj15ZSh7aW1wb3J0czpbejBdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gJEwodCxuKXt0JjEmJm1lKDAsMil9ZnVuY3Rpb24gS0wodCxuKXt0JjEmJihjKDAsInRoZWFkIiwwKSxfMSgxLDEpLHMoKSxjKDIsInRib2R5IiwyKSxfMSgzLDMpKDQsNCkscygpLGMoNSwidGZvb3QiLDApLF8xKDYsNSkscygpKX1mdW5jdGlvbiBYTCh0LG4pe3QmMSYmXzEoMCwxKSgxLDMpKDIsNCkoMyw1KX12YXIgWUwsWkwsdGksaWksYWksb2MsbmkscmksY2Msb2ksY2ksc2Msc2ksbGksbGMsZGksTGcsSkwsSTEsTTI9eCgoKT0+e2soKTtrKCk7SWcoKTtxbigpO3kxKCk7WHQoKTtnYSgpO2x0KCk7WUw9W1tbImNhcHRpb24iXV0sW1siY29sZ3JvdXAiXSxbImNvbCJdXSwiKiJdLFpMPVsiY2FwdGlvbiIsImNvbGdyb3VwLCBjb2wiLCIqIl07dGk9KCgpPT57Y2xhc3MgdCBleHRlbmRzIHA1e3N0aWNreUNzc0NsYXNzPSJtYXQtbWRjLXRhYmxlLXN0aWNreSI7bmVlZHNQb3NpdGlvblN0aWNreU9uRWxlbWVudD0hMTtzdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJtYXQtdGFibGUiXSxbInRhYmxlIiwibWF0LXRhYmxlIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LW1kYy10YWJsZSIsIm1kYy1kYXRhLXRhYmxlX190YWJsZSJdLGhvc3RWYXJzOjIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGksYSl7aSYyJiZpZSgibWRjLXRhYmxlLWZpeGVkLWxheW91dCIsYS5maXhlZExheW91dCl9LGV4cG9ydEFzOlsibWF0VGFibGUiXSxmZWF0dXJlczpbSWUoW3twcm92aWRlOnA1LHVzZUV4aXN0aW5nOnR9LHtwcm92aWRlOk4yLHVzZUV4aXN0aW5nOnR9LHtwcm92aWRlOmJyLHVzZUNsYXNzOmpufSx7cHJvdmlkZTp0Yyx1c2VWYWx1ZTpudWxsfV0pLEZlXSxuZ0NvbnRlbnRTZWxlY3RvcnM6WkwsZGVjbHM6NSx2YXJzOjIsY29uc3RzOltbInJvbGUiLCJyb3dncm91cCJdLFsiaGVhZGVyUm93T3V0bGV0IiwiIl0sWyJyb2xlIiwicm93Z3JvdXAiLDEsIm1kYy1kYXRhLXRhYmxlX19jb250ZW50Il0sWyJyb3dPdXRsZXQiLCIiXSxbIm5vRGF0YVJvd091dGxldCIsIiJdLFsiZm9vdGVyUm93T3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoUmUoWUwpLG1lKDApLG1lKDEsMSksTSgyLCRMLDEsMCksTSgzLEtMLDcsMCkoNCxYTCw0LDApKSxpJjImJihsKDIpLHcoYS5faXNTZXJ2ZXI/MjotMSksbCgpLHcoYS5faXNOYXRpdmVIdG1sVGFibGU/Mzo0KSl9LGRlcGVuZGVuY2llczpbZDUsbDUsaDUsbTVdLHN0eWxlczpbYC5tYXQtbWRjLXRhYmxlLXN0aWNreXtwb3NpdGlvbjpzdGlja3kgIWltcG9ydGFudH1tYXQtdGFibGV7ZGlzcGxheTpibG9ja31tYXQtaGVhZGVyLXJvd3ttaW4taGVpZ2h0OnZhcigtLW1hdC10YWJsZS1oZWFkZXItY29udGFpbmVyLWhlaWdodCwgNTZweCl9bWF0LXJvd3ttaW4taGVpZ2h0OnZhcigtLW1hdC10YWJsZS1yb3ctaXRlbS1jb250YWluZXItaGVpZ2h0LCA1MnB4KX1tYXQtZm9vdGVyLXJvd3ttaW4taGVpZ2h0OnZhcigtLW1hdC10YWJsZS1mb290ZXItY29udGFpbmVyLWhlaWdodCwgNTJweCl9bWF0LXJvdyxtYXQtaGVhZGVyLXJvdyxtYXQtZm9vdGVyLXJvd3tkaXNwbGF5OmZsZXg7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHg7Ym9yZGVyLXN0eWxlOnNvbGlkO2FsaWduLWl0ZW1zOmNlbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3h9bWF0LWNlbGw6Zmlyc3Qtb2YtdHlwZSxtYXQtaGVhZGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZSxtYXQtZm9vdGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZXtwYWRkaW5nLWxlZnQ6MjRweH1bZGlyPXJ0bF0gbWF0LWNlbGw6Zmlyc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIG1hdC1oZWFkZXItY2VsbDpmaXJzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gbWF0LWZvb3Rlci1jZWxsOmZpcnN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpe3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MjRweH1tYXQtY2VsbDpsYXN0LW9mLXR5cGUsbWF0LWhlYWRlci1jZWxsOmxhc3Qtb2YtdHlwZSxtYXQtZm9vdGVyLWNlbGw6bGFzdC1vZi10eXBle3BhZGRpbmctcmlnaHQ6MjRweH1bZGlyPXJ0bF0gbWF0LWNlbGw6bGFzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gbWF0LWhlYWRlci1jZWxsOmxhc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIG1hdC1mb290ZXItY2VsbDpsYXN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpe3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MjRweH1tYXQtY2VsbCxtYXQtaGVhZGVyLWNlbGwsbWF0LWZvb3Rlci1jZWxse2ZsZXg6MTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO292ZXJmbG93OmhpZGRlbjt3b3JkLXdyYXA6YnJlYWstd29yZDttaW4taGVpZ2h0OmluaGVyaXR9Lm1hdC1tZGMtdGFibGV7bWluLXdpZHRoOjEwMCU7Ym9yZGVyOjA7Ym9yZGVyLXNwYWNpbmc6MDt0YWJsZS1sYXlvdXQ6YXV0bzt3aGl0ZS1zcGFjZTpub3JtYWw7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXQtdGFibGUtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tbWF0LXN5cy1zdXJmYWNlKSl9Lm1kYy1kYXRhLXRhYmxlX19jZWxse2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpoaWRkZW47dGV4dC1hbGlnbjpsZWZ0O3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9W2Rpcj1ydGxdIC5tZGMtZGF0YS10YWJsZV9fY2VsbHt0ZXh0LWFsaWduOnJpZ2h0fS5tZGMtZGF0YS10YWJsZV9fY2VsbCwubWRjLWRhdGEtdGFibGVfX2hlYWRlci1jZWxse3BhZGRpbmc6MCAxNnB4fS5tYXQtbWRjLWhlYWRlci1yb3d7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7aGVpZ2h0OnZhcigtLW1hdC10YWJsZS1oZWFkZXItY29udGFpbmVyLWhlaWdodCwgNTZweCk7Y29sb3I6dmFyKC0tbWF0LXRhYmxlLWhlYWRlci1oZWFkbGluZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1vbi1zdXJmYWNlLCByZ2JhKDAsIDAsIDAsIDAuODcpKSk7Zm9udC1mYW1pbHk6dmFyKC0tbWF0LXRhYmxlLWhlYWRlci1oZWFkbGluZS1mb250LCB2YXIoLS1tYXQtc3lzLXRpdGxlLXNtYWxsLWZvbnQsIFJvYm90bywgc2Fucy1zZXJpZikpO2xpbmUtaGVpZ2h0OnZhcigtLW1hdC10YWJsZS1oZWFkZXItaGVhZGxpbmUtbGluZS1oZWlnaHQsIHZhcigtLW1hdC1zeXMtdGl0bGUtc21hbGwtbGluZS1oZWlnaHQpKTtmb250LXNpemU6dmFyKC0tbWF0LXRhYmxlLWhlYWRlci1oZWFkbGluZS1zaXplLCB2YXIoLS1tYXQtc3lzLXRpdGxlLXNtYWxsLXNpemUsIDE0cHgpKTtmb250LXdlaWdodDp2YXIoLS1tYXQtdGFibGUtaGVhZGVyLWhlYWRsaW5lLXdlaWdodCwgdmFyKC0tbWF0LXN5cy10aXRsZS1zbWFsbC13ZWlnaHQsIDUwMCkpfS5tYXQtbWRjLXJvd3toZWlnaHQ6dmFyKC0tbWF0LXRhYmxlLXJvdy1pdGVtLWNvbnRhaW5lci1oZWlnaHQsIDUycHgpO2NvbG9yOnZhcigtLW1hdC10YWJsZS1yb3ctaXRlbS1sYWJlbC10ZXh0LWNvbG9yLCB2YXIoLS1tYXQtc3lzLW9uLXN1cmZhY2UsIHJnYmEoMCwgMCwgMCwgMC44NykpKX0ubWF0LW1kYy1yb3csLm1kYy1kYXRhLXRhYmxlX19jb250ZW50ey1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkO2ZvbnQtZmFtaWx5OnZhcigtLW1hdC10YWJsZS1yb3ctaXRlbS1sYWJlbC10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tZm9udCwgUm9ib3RvLCBzYW5zLXNlcmlmKSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LXRhYmxlLXJvdy1pdGVtLWxhYmVsLXRleHQtbGluZS1oZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tbGluZS1oZWlnaHQpKTtmb250LXNpemU6dmFyKC0tbWF0LXRhYmxlLXJvdy1pdGVtLWxhYmVsLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1zaXplLCAxNHB4KSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LXRhYmxlLXJvdy1pdGVtLWxhYmVsLXRleHQtd2VpZ2h0LCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLXdlaWdodCkpfS5tYXQtbWRjLWZvb3Rlci1yb3d7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7aGVpZ2h0OnZhcigtLW1hdC10YWJsZS1mb290ZXItY29udGFpbmVyLWhlaWdodCwgNTJweCk7Y29sb3I6dmFyKC0tbWF0LXRhYmxlLXJvdy1pdGVtLWxhYmVsLXRleHQtY29sb3IsIHZhcigtLW1hdC1zeXMtb24tc3VyZmFjZSwgcmdiYSgwLCAwLCAwLCAwLjg3KSkpO2ZvbnQtZmFtaWx5OnZhcigtLW1hdC10YWJsZS1mb290ZXItc3VwcG9ydGluZy10ZXh0LWZvbnQsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tZm9udCwgUm9ib3RvLCBzYW5zLXNlcmlmKSk7bGluZS1oZWlnaHQ6dmFyKC0tbWF0LXRhYmxlLWZvb3Rlci1zdXBwb3J0aW5nLXRleHQtbGluZS1oZWlnaHQsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tbGluZS1oZWlnaHQpKTtmb250LXNpemU6dmFyKC0tbWF0LXRhYmxlLWZvb3Rlci1zdXBwb3J0aW5nLXRleHQtc2l6ZSwgdmFyKC0tbWF0LXN5cy1ib2R5LW1lZGl1bS1zaXplLCAxNHB4KSk7Zm9udC13ZWlnaHQ6dmFyKC0tbWF0LXRhYmxlLWZvb3Rlci1zdXBwb3J0aW5nLXRleHQtd2VpZ2h0LCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLXdlaWdodCkpO2xldHRlci1zcGFjaW5nOnZhcigtLW1hdC10YWJsZS1mb290ZXItc3VwcG9ydGluZy10ZXh0LXRyYWNraW5nLCB2YXIoLS1tYXQtc3lzLWJvZHktbWVkaXVtLXRyYWNraW5nKSl9Lm1hdC1tZGMtaGVhZGVyLWNlbGx7Ym9yZGVyLWJvdHRvbS1jb2xvcjp2YXIoLS1tYXQtdGFibGUtcm93LWl0ZW0tb3V0bGluZS1jb2xvciwgdmFyKC0tbWF0LXN5cy1vdXRsaW5lLCByZ2JhKDAsIDAsIDAsIDAuMTIpKSk7Ym9yZGVyLWJvdHRvbS13aWR0aDp2YXIoLS1tYXQtdGFibGUtcm93LWl0ZW0tb3V0bGluZS13aWR0aCwgMXB4KTtib3JkZXItYm90dG9tLXN0eWxlOnNvbGlkO2xldHRlci1zcGFjaW5nOnZhcigtLW1hdC10YWJsZS1oZWFkZXItaGVhZGxpbmUtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtdGl0bGUtc21hbGwtdHJhY2tpbmcpKTtmb250LXdlaWdodDppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7Ym94LXNpemluZzpib3JkZXItYm94O3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7b3ZlcmZsb3c6aGlkZGVuO291dGxpbmU6bm9uZTt0ZXh0LWFsaWduOmxlZnR9W2Rpcj1ydGxdIC5tYXQtbWRjLWhlYWRlci1jZWxse3RleHQtYWxpZ246cmlnaHR9Lm1kYy1kYXRhLXRhYmxlX19yb3c6bGFzdC1jaGlsZD4ubWF0LW1kYy1oZWFkZXItY2VsbHtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC1tZGMtY2VsbHtib3JkZXItYm90dG9tLWNvbG9yOnZhcigtLW1hdC10YWJsZS1yb3ctaXRlbS1vdXRsaW5lLWNvbG9yLCB2YXIoLS1tYXQtc3lzLW91dGxpbmUsIHJnYmEoMCwgMCwgMCwgMC4xMikpKTtib3JkZXItYm90dG9tLXdpZHRoOnZhcigtLW1hdC10YWJsZS1yb3ctaXRlbS1vdXRsaW5lLXdpZHRoLCAxcHgpO2JvcmRlci1ib3R0b20tc3R5bGU6c29saWQ7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LXRhYmxlLXJvdy1pdGVtLWxhYmVsLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tdHJhY2tpbmcpKTtsaW5lLWhlaWdodDppbmhlcml0fS5tZGMtZGF0YS10YWJsZV9fcm93Omxhc3QtY2hpbGQ+Lm1hdC1tZGMtY2VsbHtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC1tZGMtZm9vdGVyLWNlbGx7bGV0dGVyLXNwYWNpbmc6dmFyKC0tbWF0LXRhYmxlLXJvdy1pdGVtLWxhYmVsLXRleHQtdHJhY2tpbmcsIHZhcigtLW1hdC1zeXMtYm9keS1tZWRpdW0tdHJhY2tpbmcpKX1tYXQtcm93Lm1hdC1tZGMtcm93LG1hdC1oZWFkZXItcm93Lm1hdC1tZGMtaGVhZGVyLXJvdyxtYXQtZm9vdGVyLXJvdy5tYXQtbWRjLWZvb3Rlci1yb3d7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtbWRjLXRhYmxlIHRib2R5LC5tYXQtbWRjLXRhYmxlIHRmb290LC5tYXQtbWRjLXRhYmxlIHRoZWFkLC5tYXQtbWRjLWNlbGwsLm1hdC1tZGMtZm9vdGVyLWNlbGwsLm1hdC1tZGMtaGVhZGVyLXJvdywubWF0LW1kYy1yb3csLm1hdC1tZGMtZm9vdGVyLXJvdywubWF0LW1kYy10YWJsZSAubWF0LW1kYy1oZWFkZXItY2VsbHtiYWNrZ3JvdW5kOmluaGVyaXR9Lm1hdC1tZGMtdGFibGUgbWF0LWhlYWRlci1yb3cubWF0LW1kYy1oZWFkZXItcm93LC5tYXQtbWRjLXRhYmxlIG1hdC1yb3cubWF0LW1kYy1yb3csLm1hdC1tZGMtdGFibGUgbWF0LWZvb3Rlci1yb3cubWF0LW1kYy1mb290ZXItY2VsbHtoZWlnaHQ6dW5zZXR9bWF0LWhlYWRlci1jZWxsLm1hdC1tZGMtaGVhZGVyLWNlbGwsbWF0LWNlbGwubWF0LW1kYy1jZWxsLG1hdC1mb290ZXItY2VsbC5tYXQtbWRjLWZvb3Rlci1jZWxse2FsaWduLXNlbGY6c3RyZXRjaH0KYF0sZW5jYXBzdWxhdGlvbjoyfSl9cmV0dXJuIHR9KSgpLGlpPSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBpY3tzdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXRDZWxsRGVmIiwiIl1dLGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6aWMsdXNlRXhpc3Rpbmc6dH1dKSxGZV19KX1yZXR1cm4gdH0pKCksYWk9KCgpPT57Y2xhc3MgdCBleHRlbmRzIGFje3N0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IGU7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybihlfHwoZT1rdCh0KSkpKGF8fHQpfX0pKCk7c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsIm1hdEhlYWRlckNlbGxEZWYiLCIiXV0sZmVhdHVyZXM6W0llKFt7cHJvdmlkZTphYyx1c2VFeGlzdGluZzp0fV0pLEZlXX0pfXJldHVybiB0fSkoKSxvYz0oKCk9PntjbGFzcyB0IGV4dGVuZHMgbmN7c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgZTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuKGV8fChlPWt0KHQpKSkoYXx8dCl9fSkoKTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siIiwibWF0Rm9vdGVyQ2VsbERlZiIsIiJdXSxmZWF0dXJlczpbSWUoW3twcm92aWRlOm5jLHVzZUV4aXN0aW5nOnR9XSksRmVdfSl9cmV0dXJuIHR9KSgpLG5pPSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyAkbntnZXQgbmFtZSgpe3JldHVybiB0aGlzLl9uYW1lfXNldCBuYW1lKGUpe3RoaXMuX3NldE5hbWVJbnB1dChlKX1fdXBkYXRlQ29sdW1uQ3NzQ2xhc3NOYW1lKCl7c3VwZXIuX3VwZGF0ZUNvbHVtbkNzc0NsYXNzTmFtZSgpLHRoaXMuX2NvbHVtbkNzc0NsYXNzTmFtZS5wdXNoKGBtYXQtY29sdW1uLSR7dGhpcy5jc3NDbGFzc0ZyaWVuZGx5TmFtZX1gKX1zdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXRDb2x1bW5EZWYiLCIiXV0saW5wdXRzOntuYW1lOlswLCJtYXRDb2x1bW5EZWYiLCJuYW1lIl19LGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6JG4sdXNlRXhpc3Rpbmc6dH0se3Byb3ZpZGU6Ik1BVF9TT1JUX0hFQURFUl9DT0xVTU5fREVGIix1c2VFeGlzdGluZzp0fV0pLEZlXX0pfXJldHVybiB0fSkoKSxyaT0oKCk9PntjbGFzcyB0IGV4dGVuZHMgemd7c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgZTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuKGV8fChlPWt0KHQpKSkoYXx8dCl9fSkoKTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LWhlYWRlci1jZWxsIl0sWyJ0aCIsIm1hdC1oZWFkZXItY2VsbCIsIiJdXSxob3N0QXR0cnM6WyJyb2xlIiwiY29sdW1uaGVhZGVyIiwxLCJtYXQtbWRjLWhlYWRlci1jZWxsIiwibWRjLWRhdGEtdGFibGVfX2hlYWRlci1jZWxsIl0sZmVhdHVyZXM6W0ZlXX0pfXJldHVybiB0fSkoKSxjYz0oKCk9PntjbGFzcyB0IGV4dGVuZHMgVGd7c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgZTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuKGV8fChlPWt0KHQpKSkoYXx8dCl9fSkoKTtzdGF0aWMgXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LWZvb3Rlci1jZWxsIl0sWyJ0ZCIsIm1hdC1mb290ZXItY2VsbCIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1tZGMtZm9vdGVyLWNlbGwiLCJtZGMtZGF0YS10YWJsZV9fY2VsbCJdLGZlYXR1cmVzOltGZV19KX1yZXR1cm4gdH0pKCksb2k9KCgpPT57Y2xhc3MgdCBleHRlbmRzIEVne3N0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IGU7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybihlfHwoZT1rdCh0KSkpKGF8fHQpfX0pKCk7c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1jZWxsIl0sWyJ0ZCIsIm1hdC1jZWxsIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LW1kYy1jZWxsIiwibWRjLWRhdGEtdGFibGVfX2NlbGwiXSxmZWF0dXJlczpbRmVdfSl9cmV0dXJuIHR9KSgpLGNpPSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBBNHtzdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXRIZWFkZXJSb3dEZWYiLCIiXV0saW5wdXRzOntjb2x1bW5zOlswLCJtYXRIZWFkZXJSb3dEZWYiLCJjb2x1bW5zIl0sc3RpY2t5OlsyLCJtYXRIZWFkZXJSb3dEZWZTdGlja3kiLCJzdGlja3kiLFpdfSxmZWF0dXJlczpbSWUoW3twcm92aWRlOkE0LHVzZUV4aXN0aW5nOnR9XSksRmVdfSl9cmV0dXJuIHR9KSgpLHNjPSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyBENHtzdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXRGb290ZXJSb3dEZWYiLCIiXV0saW5wdXRzOntjb2x1bW5zOlswLCJtYXRGb290ZXJSb3dEZWYiLCJjb2x1bW5zIl0sc3RpY2t5OlsyLCJtYXRGb290ZXJSb3dEZWZTdGlja3kiLCJzdGlja3kiLFpdfSxmZWF0dXJlczpbSWUoW3twcm92aWRlOkQ0LHVzZUV4aXN0aW5nOnR9XSksRmVdfSl9cmV0dXJuIHR9KSgpLHNpPSgoKT0+e2NsYXNzIHQgZXh0ZW5kcyByY3tzdGF0aWMgXHUwMjc1ZmFjPSgoKT0+e2xldCBlO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4oZXx8KGU9a3QodCkpKShhfHx0KX19KSgpO3N0YXRpYyBcdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJtYXRSb3dEZWYiLCIiXV0saW5wdXRzOntjb2x1bW5zOlswLCJtYXRSb3dEZWZDb2x1bW5zIiwiY29sdW1ucyJdLHdoZW46WzAsIm1hdFJvd0RlZldoZW4iLCJ3aGVuIl19LGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6cmMsdXNlRXhpc3Rpbmc6dH1dKSxGZV19KX1yZXR1cm4gdH0pKCksbGk9KCgpPT57Y2xhc3MgdCBleHRlbmRzIG81e3N0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IGU7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybihlfHwoZT1rdCh0KSkpKGF8fHQpfX0pKCk7c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1oZWFkZXItcm93Il0sWyJ0ciIsIm1hdC1oZWFkZXItcm93IiwiIl1dLGhvc3RBdHRyczpbInJvbGUiLCJyb3ciLDEsIm1hdC1tZGMtaGVhZGVyLXJvdyIsIm1kYy1kYXRhLXRhYmxlX19oZWFkZXItcm93Il0sZXhwb3J0QXM6WyJtYXRIZWFkZXJSb3ciXSxmZWF0dXJlczpbSWUoW3twcm92aWRlOm81LHVzZUV4aXN0aW5nOnR9XSksRmVdLGRlY2xzOjEsdmFyczowLGNvbnN0czpbWyJjZGtDZWxsT3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiZfMSgwLDApfSxkZXBlbmRlbmNpZXM6W0VhXSxlbmNhcHN1bGF0aW9uOjJ9KX1yZXR1cm4gdH0pKCksbGM9KCgpPT57Y2xhc3MgdCBleHRlbmRzIGM1e3N0YXRpYyBcdTAyNzVmYWM9KCgpPT57bGV0IGU7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybihlfHwoZT1rdCh0KSkpKGF8fHQpfX0pKCk7c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1mb290ZXItcm93Il0sWyJ0ciIsIm1hdC1mb290ZXItcm93IiwiIl1dLGhvc3RBdHRyczpbInJvbGUiLCJyb3ciLDEsIm1hdC1tZGMtZm9vdGVyLXJvdyIsIm1kYy1kYXRhLXRhYmxlX19yb3ciXSxleHBvcnRBczpbIm1hdEZvb3RlclJvdyJdLGZlYXR1cmVzOltJZShbe3Byb3ZpZGU6YzUsdXNlRXhpc3Rpbmc6dH1dKSxGZV0sZGVjbHM6MSx2YXJzOjAsY29uc3RzOltbImNka0NlbGxPdXRsZXQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJl8xKDAsMCl9LGRlcGVuZGVuY2llczpbRWFdLGVuY2Fwc3VsYXRpb246Mn0pfXJldHVybiB0fSkoKSxkaT0oKCk9PntjbGFzcyB0IGV4dGVuZHMgczV7c3RhdGljIFx1MDI3NWZhYz0oKCk9PntsZXQgZTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuKGV8fChlPWt0KHQpKSkoYXx8dCl9fSkoKTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sibWF0LXJvdyJdLFsidHIiLCJtYXQtcm93IiwiIl1dLGhvc3RBdHRyczpbInJvbGUiLCJyb3ciLDEsIm1hdC1tZGMtcm93IiwibWRjLWRhdGEtdGFibGVfX3JvdyJdLGV4cG9ydEFzOlsibWF0Um93Il0sZmVhdHVyZXM6W0llKFt7cHJvdmlkZTpzNSx1c2VFeGlzdGluZzp0fV0pLEZlXSxkZWNsczoxLHZhcnM6MCxjb25zdHM6W1siY2RrQ2VsbE91dGxldCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmXzEoMCwwKX0sZGVwZW5kZW5jaWVzOltFYV0sZW5jYXBzdWxhdGlvbjoyfSl9cmV0dXJuIHR9KSgpLExnPSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1bW9kPXhlKHt0eXBlOnR9KTtzdGF0aWMgXHUwMjc1aW5qPXllKHtpbXBvcnRzOlt6ZSxEZyx6ZV19KX1yZXR1cm4gdH0pKCksSkw9OTAwNzE5OTI1NDc0MDk5MSxJMT1jbGFzcyBleHRlbmRzIEM2e19kYXRhO19yZW5kZXJEYXRhPW5ldyBkMihbXSk7X2ZpbHRlcj1uZXcgZDIoIiIpO19pbnRlcm5hbFBhZ2VDaGFuZ2VzPW5ldyB3ZTtfcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbj1udWxsO2ZpbHRlcmVkRGF0YTtnZXQgZGF0YSgpe3JldHVybiB0aGlzLl9kYXRhLnZhbHVlfXNldCBkYXRhKG4pe249QXJyYXkuaXNBcnJheShuKT9uOltdLHRoaXMuX2RhdGEubmV4dChuKSx0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9ufHx0aGlzLl9maWx0ZXJEYXRhKG4pfWdldCBmaWx0ZXIoKXtyZXR1cm4gdGhpcy5fZmlsdGVyLnZhbHVlfXNldCBmaWx0ZXIobil7dGhpcy5fZmlsdGVyLm5leHQobiksdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbnx8dGhpcy5fZmlsdGVyRGF0YSh0aGlzLmRhdGEpfWdldCBzb3J0KCl7cmV0dXJuIHRoaXMuX3NvcnR9c2V0IHNvcnQobil7dGhpcy5fc29ydD1uLHRoaXMuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpfV9zb3J0O2dldCBwYWdpbmF0b3IoKXtyZXR1cm4gdGhpcy5fcGFnaW5hdG9yfXNldCBwYWdpbmF0b3Iobil7dGhpcy5fcGFnaW5hdG9yPW4sdGhpcy5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCl9X3BhZ2luYXRvcjtzb3J0aW5nRGF0YUFjY2Vzc29yPShuLGUpPT57bGV0IGk9bltlXTtpZihwbShpKSl7bGV0IGE9TnVtYmVyKGkpO3JldHVybiBhPEpMP2E6aX1yZXR1cm4gaX07c29ydERhdGE9KG4sZSk9PntsZXQgaT1lLmFjdGl2ZSxhPWUuZGlyZWN0aW9uO3JldHVybiFpfHxhPT0iIj9uOm4uc29ydCgocixvKT0+e2xldCBkPXRoaXMuc29ydGluZ0RhdGFBY2Nlc3NvcihyLGkpLHA9dGhpcy5zb3J0aW5nRGF0YUFjY2Vzc29yKG8saSksZz10eXBlb2YgZCxfPXR5cGVvZiBwO2chPT1fJiYoZz09PSJudW1iZXIiJiYoZCs9IiIpLF89PT0ibnVtYmVyIiYmKHArPSIiKSk7bGV0IHk9MDtyZXR1cm4gZCE9bnVsbCYmcCE9bnVsbD9kPnA/eT0xOmQ8cCYmKHk9LTEpOmQhPW51bGw/eT0xOnAhPW51bGwmJih5PS0xKSx5KihhPT0iYXNjIj8xOi0xKX0pfTtmaWx0ZXJQcmVkaWNhdGU9KG4sZSk9PntsZXQgaT1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO3JldHVybiBPYmplY3QudmFsdWVzKG4pLnNvbWUoYT0+YCR7YX1gLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoaSkpfTtjb25zdHJ1Y3RvcihuPVtdKXtzdXBlcigpLHRoaXMuX2RhdGE9bmV3IGQyKG4pLHRoaXMuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpfV91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKXtsZXQgbj10aGlzLl9zb3J0P0t0KHRoaXMuX3NvcnQuc29ydENoYW5nZSx0aGlzLl9zb3J0LmluaXRpYWxpemVkKTpjMShudWxsKSxlPXRoaXMuX3BhZ2luYXRvcj9LdCh0aGlzLl9wYWdpbmF0b3IucGFnZSx0aGlzLl9pbnRlcm5hbFBhZ2VDaGFuZ2VzLHRoaXMuX3BhZ2luYXRvci5pbml0aWFsaXplZCk6YzEobnVsbCksaT10aGlzLl9kYXRhLGE9SGEoW2ksdGhpcy5fZmlsdGVyXSkucGlwZShxKChbZF0pPT50aGlzLl9maWx0ZXJEYXRhKGQpKSkscj1IYShbYSxuXSkucGlwZShxKChbZF0pPT50aGlzLl9vcmRlckRhdGEoZCkpKSxvPUhhKFtyLGVdKS5waXBlKHEoKFtkXSk9PnRoaXMuX3BhZ2VEYXRhKGQpKSk7dGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKSx0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uPW8uc3Vic2NyaWJlKGQ9PnRoaXMuX3JlbmRlckRhdGEubmV4dChkKSl9X2ZpbHRlckRhdGEobil7cmV0dXJuIHRoaXMuZmlsdGVyZWREYXRhPXRoaXMuZmlsdGVyPT1udWxsfHx0aGlzLmZpbHRlcj09PSIiP246bi5maWx0ZXIoZT0+dGhpcy5maWx0ZXJQcmVkaWNhdGUoZSx0aGlzLmZpbHRlcikpLHRoaXMucGFnaW5hdG9yJiZ0aGlzLl91cGRhdGVQYWdpbmF0b3IodGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoKSx0aGlzLmZpbHRlcmVkRGF0YX1fb3JkZXJEYXRhKG4pe3JldHVybiB0aGlzLnNvcnQ/dGhpcy5zb3J0RGF0YShuLnNsaWNlKCksdGhpcy5zb3J0KTpufV9wYWdlRGF0YShuKXtpZighdGhpcy5wYWdpbmF0b3IpcmV0dXJuIG47bGV0IGU9dGhpcy5wYWdpbmF0b3IucGFnZUluZGV4KnRoaXMucGFnaW5hdG9yLnBhZ2VTaXplO3JldHVybiBuLnNsaWNlKGUsZSt0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSl9X3VwZGF0ZVBhZ2luYXRvcihuKXtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT57bGV0IGU9dGhpcy5wYWdpbmF0b3I7aWYoZSYmKGUubGVuZ3RoPW4sZS5wYWdlSW5kZXg+MCkpe2xldCBpPU1hdGguY2VpbChlLmxlbmd0aC9lLnBhZ2VTaXplKS0xfHwwLGE9TWF0aC5taW4oZS5wYWdlSW5kZXgsaSk7YSE9PWUucGFnZUluZGV4JiYoZS5wYWdlSW5kZXg9YSx0aGlzLl9pbnRlcm5hbFBhZ2VDaGFuZ2VzLm5leHQoKSl9fSl9Y29ubmVjdCgpe3JldHVybiB0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9ufHx0aGlzLl91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKSx0aGlzLl9yZW5kZXJEYXRhfWRpc2Nvbm5lY3QoKXt0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpLHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb249bnVsbH19fSk7dmFyIGRjPXgoKCk9PnthNSgpfSk7ZnVuY3Rpb24gdFAodCl7cmV0dXJuIEZpbGUmJnQgaW5zdGFuY2VvZiBGaWxlfXZhciBJNCxmNSxlUCxtYyxQZyxoYyxwYz14KCgpPT57aygpO2soKTthMSgpO0k0PWNsYXNze2NvbnN0cnVjdG9yKG4pe3RoaXMucmF3RmlsZT1uO2xldCBlPW4gaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50P24udmFsdWU6bjt0aGlzW2BfY3JlYXRlRnJvbSR7dHlwZW9mIGU9PSJzdHJpbmciPyJGYWtlUGF0aCI6Ik9iamVjdCJ9YF0oZSl9X2NyZWF0ZUZyb21GYWtlUGF0aChuKXt0aGlzLmxhc3RNb2RpZmllZERhdGU9dm9pZCAwLHRoaXMuc2l6ZT12b2lkIDAsdGhpcy50eXBlPWBsaWtlLyR7bi5zbGljZShuLmxhc3RJbmRleE9mKCIuIikrMSkudG9Mb3dlckNhc2UoKX1gLHRoaXMubmFtZT1uLnNsaWNlKG4ubGFzdEluZGV4T2YoIi8iKStuLmxhc3RJbmRleE9mKCJcXCIpKzIpfV9jcmVhdGVGcm9tT2JqZWN0KG4pe3RoaXMuc2l6ZT1uLnNpemUsdGhpcy50eXBlPW4udHlwZSx0aGlzLm5hbWU9bi5uYW1lfX0sZjU9Y2xhc3N7Y29uc3RydWN0b3IobixlLGkpe3RoaXMudXJsPSIvIix0aGlzLmhlYWRlcnM9W10sdGhpcy53aXRoQ3JlZGVudGlhbHM9ITAsdGhpcy5mb3JtRGF0YT1bXSx0aGlzLmlzUmVhZHk9ITEsdGhpcy5pc1VwbG9hZGluZz0hMSx0aGlzLmlzVXBsb2FkZWQ9ITEsdGhpcy5pc1N1Y2Nlc3M9ITEsdGhpcy5pc0NhbmNlbD0hMSx0aGlzLmlzRXJyb3I9ITEsdGhpcy5wcm9ncmVzcz0wLHRoaXMudXBsb2FkZXI9bix0aGlzLnNvbWU9ZSx0aGlzLm9wdGlvbnM9aSx0aGlzLmZpbGU9bmV3IEk0KGUpLHRoaXMuX2ZpbGU9ZSxuLm9wdGlvbnMmJih0aGlzLm1ldGhvZD1uLm9wdGlvbnMubWV0aG9kfHwiUE9TVCIsdGhpcy5hbGlhcz1uLm9wdGlvbnMuaXRlbUFsaWFzfHwiZmlsZSIpLHRoaXMudXJsPW4ub3B0aW9ucy51cmx9dXBsb2FkKCl7dHJ5e3RoaXMudXBsb2FkZXIudXBsb2FkSXRlbSh0aGlzKX1jYXRjaHt0aGlzLnVwbG9hZGVyLl9vbkNvbXBsZXRlSXRlbSh0aGlzLCIiLDAse30pLHRoaXMudXBsb2FkZXIuX29uRXJyb3JJdGVtKHRoaXMsIiIsMCx7fSl9fWNhbmNlbCgpe3RoaXMudXBsb2FkZXIuY2FuY2VsSXRlbSh0aGlzKX1yZW1vdmUoKXt0aGlzLnVwbG9hZGVyLnJlbW92ZUZyb21RdWV1ZSh0aGlzKX1vbkJlZm9yZVVwbG9hZCgpe31vbkJ1aWxkRm9ybShuKXtyZXR1cm57Zm9ybTpufX1vblByb2dyZXNzKG4pe3JldHVybntwcm9ncmVzczpufX1vblN1Y2Nlc3MobixlLGkpe3JldHVybntyZXNwb25zZTpuLHN0YXR1czplLGhlYWRlcnM6aX19b25FcnJvcihuLGUsaSl7cmV0dXJue3Jlc3BvbnNlOm4sc3RhdHVzOmUsaGVhZGVyczppfX1vbkNhbmNlbChuLGUsaSl7cmV0dXJue3Jlc3BvbnNlOm4sc3RhdHVzOmUsaGVhZGVyczppfX1vbkNvbXBsZXRlKG4sZSxpKXtyZXR1cm57cmVzcG9uc2U6bixzdGF0dXM6ZSxoZWFkZXJzOml9fV9vbkJlZm9yZVVwbG9hZCgpe3RoaXMuaXNSZWFkeT0hMCx0aGlzLmlzVXBsb2FkaW5nPSEwLHRoaXMuaXNVcGxvYWRlZD0hMSx0aGlzLmlzU3VjY2Vzcz0hMSx0aGlzLmlzQ2FuY2VsPSExLHRoaXMuaXNFcnJvcj0hMSx0aGlzLnByb2dyZXNzPTAsdGhpcy5vbkJlZm9yZVVwbG9hZCgpfV9vbkJ1aWxkRm9ybShuKXt0aGlzLm9uQnVpbGRGb3JtKG4pfV9vblByb2dyZXNzKG4pe3RoaXMucHJvZ3Jlc3M9bix0aGlzLm9uUHJvZ3Jlc3Mobil9X29uU3VjY2VzcyhuLGUsaSl7dGhpcy5pc1JlYWR5PSExLHRoaXMuaXNVcGxvYWRpbmc9ITEsdGhpcy5pc1VwbG9hZGVkPSEwLHRoaXMuaXNTdWNjZXNzPSEwLHRoaXMuaXNDYW5jZWw9ITEsdGhpcy5pc0Vycm9yPSExLHRoaXMucHJvZ3Jlc3M9MTAwLHRoaXMuaW5kZXg9dm9pZCAwLHRoaXMub25TdWNjZXNzKG4sZSxpKX1fb25FcnJvcihuLGUsaSl7dGhpcy5pc1JlYWR5PSExLHRoaXMuaXNVcGxvYWRpbmc9ITEsdGhpcy5pc1VwbG9hZGVkPSEwLHRoaXMuaXNTdWNjZXNzPSExLHRoaXMuaXNDYW5jZWw9ITEsdGhpcy5pc0Vycm9yPSEwLHRoaXMucHJvZ3Jlc3M9MCx0aGlzLmluZGV4PXZvaWQgMCx0aGlzLm9uRXJyb3IobixlLGkpfV9vbkNhbmNlbChuLGUsaSl7dGhpcy5pc1JlYWR5PSExLHRoaXMuaXNVcGxvYWRpbmc9ITEsdGhpcy5pc1VwbG9hZGVkPSExLHRoaXMuaXNTdWNjZXNzPSExLHRoaXMuaXNDYW5jZWw9ITAsdGhpcy5pc0Vycm9yPSExLHRoaXMucHJvZ3Jlc3M9MCx0aGlzLmluZGV4PXZvaWQgMCx0aGlzLm9uQ2FuY2VsKG4sZSxpKX1fb25Db21wbGV0ZShuLGUsaSl7dGhpcy5vbkNvbXBsZXRlKG4sZSxpKSx0aGlzLnVwbG9hZGVyLm9wdGlvbnMucmVtb3ZlQWZ0ZXJVcGxvYWQmJnRoaXMucmVtb3ZlKCl9X3ByZXBhcmVUb1VwbG9hZGluZygpe3RoaXMuaW5kZXg9dGhpcy5pbmRleHx8Kyt0aGlzLnVwbG9hZGVyLl9uZXh0SW5kZXgsdGhpcy5pc1JlYWR5PSEwfX0sZVA9KCgpPT57Y2xhc3MgdHtzdGF0aWN7dGhpcy5taW1lX2RvYz1bImFwcGxpY2F0aW9uL21zd29yZCIsImFwcGxpY2F0aW9uL21zd29yZCIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50IiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwudGVtcGxhdGUiLCJhcHBsaWNhdGlvbi92bmQubXMtd29yZC5kb2N1bWVudC5tYWNyb0VuYWJsZWQuMTIiLCJhcHBsaWNhdGlvbi92bmQubXMtd29yZC50ZW1wbGF0ZS5tYWNyb0VuYWJsZWQuMTIiXX1zdGF0aWN7dGhpcy5taW1lX3hzbD1bImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCIsImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0IiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGVtcGxhdGUiLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hlZXQubWFjcm9FbmFibGVkLjEyIiwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRlbXBsYXRlLm1hY3JvRW5hYmxlZC4xMiIsImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5hZGRpbi5tYWNyb0VuYWJsZWQuMTIiLCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hlZXQuYmluYXJ5Lm1hY3JvRW5hYmxlZC4xMiJdfXN0YXRpY3t0aGlzLm1pbWVfcHB0PVsiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiLCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCIsImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IiwiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQiLCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlIiwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlc2hvdyIsImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LmFkZGluLm1hY3JvRW5hYmxlZC4xMiIsImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnByZXNlbnRhdGlvbi5tYWNyb0VuYWJsZWQuMTIiLCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5wcmVzZW50YXRpb24ubWFjcm9FbmFibGVkLjEyIiwiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQuc2xpZGVzaG93Lm1hY3JvRW5hYmxlZC4xMiJdfXN0YXRpY3t0aGlzLm1pbWVfcHNkPVsiaW1hZ2UvcGhvdG9zaG9wIiwiaW1hZ2UveC1waG90b3Nob3AiLCJpbWFnZS9wc2QiLCJhcHBsaWNhdGlvbi9waG90b3Nob3AiLCJhcHBsaWNhdGlvbi9wc2QiLCJ6ei1hcHBsaWNhdGlvbi96ei13aW5hc3NvYy1wc2QiXX1zdGF0aWN7dGhpcy5taW1lX2NvbXByZXNzPVsiYXBwbGljYXRpb24veC1ndGFyIiwiYXBwbGljYXRpb24veC1nY29tcHJlc3MiLCJhcHBsaWNhdGlvbi9jb21wcmVzcyIsImFwcGxpY2F0aW9uL3gtdGFyIiwiYXBwbGljYXRpb24veC1yYXItY29tcHJlc3NlZCIsImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsImFwcGxpY2F0aW9uL3gtemlwLWNvbXByZXNzZWQiLCJhcHBsaWNhdGlvbi96aXAtY29tcHJlc3NlZCIsImFwcGxpY2F0aW9uL3gtN3otY29tcHJlc3NlZCIsImFwcGxpY2F0aW9uL2d6aXAiLCJhcHBsaWNhdGlvbi94LWJ6aXAyIl19c3RhdGljIGdldE1pbWVDbGFzcyhlKXtsZXQgaT0iYXBwbGljYXRpb24iO3JldHVybiBlPy50eXBlJiZ0aGlzLm1pbWVfcHNkLmluZGV4T2YoZS50eXBlKSE9PS0xfHxlPy50eXBlPy5tYXRjaCgiaW1hZ2UuKiIpP2k9ImltYWdlIjplPy50eXBlPy5tYXRjaCgidmlkZW8uKiIpP2k9InZpZGVvIjplPy50eXBlPy5tYXRjaCgiYXVkaW8uKiIpP2k9ImF1ZGlvIjplPy50eXBlPT09ImFwcGxpY2F0aW9uL3BkZiI/aT0icGRmIjplPy50eXBlJiZ0aGlzLm1pbWVfY29tcHJlc3MuaW5kZXhPZihlLnR5cGUpIT09LTE/aT0iY29tcHJlc3MiOmU/LnR5cGUmJnRoaXMubWltZV9kb2MuaW5kZXhPZihlLnR5cGUpIT09LTE/aT0iZG9jIjplPy50eXBlJiZ0aGlzLm1pbWVfeHNsLmluZGV4T2YoZS50eXBlKSE9PS0xP2k9InhscyI6ZT8udHlwZSYmdGhpcy5taW1lX3BwdC5pbmRleE9mKGUudHlwZSkhPT0tMSYmKGk9InBwdCIpLGk9PT0iYXBwbGljYXRpb24iJiZlPy5uYW1lJiYoaT10aGlzLmZpbGVUeXBlRGV0ZWN0aW9uKGUubmFtZSkpLGl9c3RhdGljIGZpbGVUeXBlRGV0ZWN0aW9uKGUpe2xldCBpPXtqcGc6ImltYWdlIixqcGVnOiJpbWFnZSIsdGlmOiJpbWFnZSIscHNkOiJpbWFnZSIsYm1wOiJpbWFnZSIscG5nOiJpbWFnZSIsbmVmOiJpbWFnZSIsdGlmZjoiaW1hZ2UiLGNyMjoiaW1hZ2UiLGR3ZzoiaW1hZ2UiLGNkcjoiaW1hZ2UiLGFpOiJpbWFnZSIsaW5kZDoiaW1hZ2UiLHBpbjoiaW1hZ2UiLGNkcDoiaW1hZ2UiLHNrcDoiaW1hZ2UiLHN0cDoiaW1hZ2UiLCIzZG0iOiJpbWFnZSIsbXAzOiJhdWRpbyIsd2F2OiJhdWRpbyIsd21hOiJhdWRpbyIsbW9kOiJhdWRpbyIsbTRhOiJhdWRpbyIsY29tcHJlc3M6ImNvbXByZXNzIix6aXA6ImNvbXByZXNzIixyYXI6ImNvbXByZXNzIiwiN3oiOiJjb21wcmVzcyIsbHo6ImNvbXByZXNzIix6MDE6ImNvbXByZXNzIixiejI6ImNvbXByZXNzIixnejoiY29tcHJlc3MiLHBkZjoicGRmIix4bHM6InhscyIseGxzeDoieGxzIixvZHM6InhscyIsbXA0OiJ2aWRlbyIsYXZpOiJ2aWRlbyIsd212OiJ2aWRlbyIsbXBnOiJ2aWRlbyIsbXRzOiJ2aWRlbyIsZmx2OiJ2aWRlbyIsIjNncCI6InZpZGVvIix2b2I6InZpZGVvIixtNHY6InZpZGVvIixtcGVnOiJ2aWRlbyIsbTJ0czoidmlkZW8iLG1vdjoidmlkZW8iLGRvYzoiZG9jIixkb2N4OiJkb2MiLGVwczoiZG9jIix0eHQ6ImRvYyIsb2R0OiJkb2MiLHJ0ZjoiZG9jIixwcHQ6InBwdCIscHB0eDoicHB0IixwcHM6InBwdCIscHBzeDoicHB0IixvZHA6InBwdCJ9LGE9ZS5zcGxpdCgiLiIpO2lmKGEubGVuZ3RoPDIpcmV0dXJuImFwcGxpY2F0aW9uIjtsZXQgcj1hW2EubGVuZ3RoLTFdLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGlbcl09PT12b2lkIDA/ImFwcGxpY2F0aW9uIjppW3JdfX1yZXR1cm4gdH0pKCk7bWM9Y2xhc3N7Y29uc3RydWN0b3Iobil7dGhpcy5pc1VwbG9hZGluZz0hMSx0aGlzLnF1ZXVlPVtdLHRoaXMucHJvZ3Jlc3M9MCx0aGlzLl9uZXh0SW5kZXg9MCx0aGlzLm9wdGlvbnM9e2F1dG9VcGxvYWQ6ITEsaXNIVE1MNTohMCxmaWx0ZXJzOltdLHJlbW92ZUFmdGVyVXBsb2FkOiExLGRpc2FibGVNdWx0aXBhcnQ6ITEsZm9ybWF0RGF0YUZ1bmN0aW9uOmU9PmUuX2ZpbGUsZm9ybWF0RGF0YUZ1bmN0aW9uSXNBc3luYzohMSx1cmw6IiJ9LHRoaXMuc2V0T3B0aW9ucyhuKSx0aGlzLnJlc3BvbnNlPW5ldyBOfXNldE9wdGlvbnMobil7dGhpcy5vcHRpb25zPU9iamVjdC5hc3NpZ24odGhpcy5vcHRpb25zLG4pLHRoaXMuYXV0aFRva2VuPXRoaXMub3B0aW9ucy5hdXRoVG9rZW4sdGhpcy5hdXRoVG9rZW5IZWFkZXI9dGhpcy5vcHRpb25zLmF1dGhUb2tlbkhlYWRlcnx8IkF1dGhvcml6YXRpb24iLHRoaXMuYXV0b1VwbG9hZD10aGlzLm9wdGlvbnMuYXV0b1VwbG9hZCx0aGlzLm9wdGlvbnMuZmlsdGVycz8udW5zaGlmdCh7bmFtZToicXVldWVMaW1pdCIsZm46dGhpcy5fcXVldWVMaW1pdEZpbHRlcn0pLHRoaXMub3B0aW9ucy5tYXhGaWxlU2l6ZSYmdGhpcy5vcHRpb25zLmZpbHRlcnM/LnVuc2hpZnQoe25hbWU6ImZpbGVTaXplIixmbjp0aGlzLl9maWxlU2l6ZUZpbHRlcn0pLHRoaXMub3B0aW9ucy5hbGxvd2VkRmlsZVR5cGUmJnRoaXMub3B0aW9ucy5maWx0ZXJzPy51bnNoaWZ0KHtuYW1lOiJmaWxlVHlwZSIsZm46dGhpcy5fZmlsZVR5cGVGaWx0ZXJ9KSx0aGlzLm9wdGlvbnMuYWxsb3dlZE1pbWVUeXBlJiZ0aGlzLm9wdGlvbnMuZmlsdGVycz8udW5zaGlmdCh7bmFtZToibWltZVR5cGUiLGZuOnRoaXMuX21pbWVUeXBlRmlsdGVyfSk7Zm9yKGxldCBlPTA7ZTx0aGlzLnF1ZXVlLmxlbmd0aDtlKyspdGhpcy5xdWV1ZVtlXS51cmw9dGhpcy5vcHRpb25zLnVybH1hZGRUb1F1ZXVlKG4sZSxpKXtsZXQgYT1lLHI9W107Zm9yKGxldCBnIG9mIG4pci5wdXNoKGcpO2xldCBvPXRoaXMuX2dldEZpbHRlcnMoaSksZD10aGlzLnF1ZXVlLmxlbmd0aCxwPVtdO3IubWFwKGc9PnthfHwoYT10aGlzLm9wdGlvbnMpO2xldCBfPW5ldyBJNChnKTtpZih0aGlzLl9pc1ZhbGlkRmlsZShfLG8sYSkpe2xldCB5PW5ldyBmNSh0aGlzLGcsYSk7cC5wdXNoKHkpLHRoaXMucXVldWUucHVzaCh5KSx0aGlzLl9vbkFmdGVyQWRkaW5nRmlsZSh5KX1lbHNlIGlmKHR5cGVvZiB0aGlzLl9mYWlsRmlsdGVySW5kZXg9PSJudW1iZXIiJiZ0aGlzLl9mYWlsRmlsdGVySW5kZXg+PTApe2xldCB5PW9bdGhpcy5fZmFpbEZpbHRlckluZGV4XTt0aGlzLl9vbldoZW5BZGRpbmdGaWxlRmFpbGVkKF8seSxhKX19KSx0aGlzLnF1ZXVlLmxlbmd0aCE9PWQmJih0aGlzLl9vbkFmdGVyQWRkaW5nQWxsKHApLHRoaXMucHJvZ3Jlc3M9dGhpcy5fZ2V0VG90YWxQcm9ncmVzcygpKSx0aGlzLl9yZW5kZXIoKSx0aGlzLm9wdGlvbnMuYXV0b1VwbG9hZCYmdGhpcy51cGxvYWRBbGwoKX1yZW1vdmVGcm9tUXVldWUobil7bGV0IGU9dGhpcy5nZXRJbmRleE9mSXRlbShuKSxpPXRoaXMucXVldWVbZV07aS5pc1VwbG9hZGluZyYmaS5jYW5jZWwoKSx0aGlzLnF1ZXVlLnNwbGljZShlLDEpLHRoaXMucHJvZ3Jlc3M9dGhpcy5fZ2V0VG90YWxQcm9ncmVzcygpfWNsZWFyUXVldWUoKXtmb3IoO3RoaXMucXVldWUubGVuZ3RoOyl0aGlzLnF1ZXVlWzBdLnJlbW92ZSgpO3RoaXMucHJvZ3Jlc3M9MH11cGxvYWRJdGVtKG4pe2xldCBlPXRoaXMuZ2V0SW5kZXhPZkl0ZW0obiksaT10aGlzLnF1ZXVlW2VdLGE9dGhpcy5vcHRpb25zLmlzSFRNTDU/Il94aHJUcmFuc3BvcnQiOiJfaWZyYW1lVHJhbnNwb3J0IjtpLl9wcmVwYXJlVG9VcGxvYWRpbmcoKSwhdGhpcy5pc1VwbG9hZGluZyYmKHRoaXMuaXNVcGxvYWRpbmc9ITAsdGhpc1thXShpKSl9Y2FuY2VsSXRlbShuKXtsZXQgZT10aGlzLmdldEluZGV4T2ZJdGVtKG4pLGk9dGhpcy5xdWV1ZVtlXSxhPXRoaXMub3B0aW9ucy5pc0hUTUw1P2kuX3hocjppLl9mb3JtO2kmJmkuaXNVcGxvYWRpbmcmJmEuYWJvcnQoKX11cGxvYWRBbGwoKXtsZXQgbj10aGlzLmdldE5vdFVwbG9hZGVkSXRlbXMoKS5maWx0ZXIoZT0+IWUuaXNVcGxvYWRpbmcpO24ubGVuZ3RoJiYobi5tYXAoZT0+ZS5fcHJlcGFyZVRvVXBsb2FkaW5nKCkpLG5bMF0udXBsb2FkKCkpfWNhbmNlbEFsbCgpe3RoaXMuZ2V0Tm90VXBsb2FkZWRJdGVtcygpLm1hcChlPT5lLmNhbmNlbCgpKX1pc0ZpbGUobil7cmV0dXJuIHRQKG4pfWlzRmlsZUxpa2VPYmplY3Qobil7cmV0dXJuIG4gaW5zdGFuY2VvZiBJNH1nZXRJbmRleE9mSXRlbShuKXtyZXR1cm4gdHlwZW9mIG49PSJudW1iZXIiP246dGhpcy5xdWV1ZS5pbmRleE9mKG4pfWdldE5vdFVwbG9hZGVkSXRlbXMoKXtyZXR1cm4gdGhpcy5xdWV1ZS5maWx0ZXIobj0+IW4uaXNVcGxvYWRlZCl9Z2V0UmVhZHlJdGVtcygpe3JldHVybiB0aGlzLnF1ZXVlLmZpbHRlcihuPT5uLmlzUmVhZHkmJiFuLmlzVXBsb2FkaW5nKS5zb3J0KChuLGUpPT5uLmluZGV4LWUuaW5kZXgpfW9uQWZ0ZXJBZGRpbmdBbGwobil7cmV0dXJue2ZpbGVJdGVtczpufX1vbkJ1aWxkSXRlbUZvcm0obixlKXtyZXR1cm57ZmlsZUl0ZW06bixmb3JtOmV9fW9uQWZ0ZXJBZGRpbmdGaWxlKG4pe3JldHVybntmaWxlSXRlbTpufX1vbldoZW5BZGRpbmdGaWxlRmFpbGVkKG4sZSxpKXtyZXR1cm57aXRlbTpuLGZpbHRlcjplLG9wdGlvbnM6aX19b25CZWZvcmVVcGxvYWRJdGVtKG4pe3JldHVybntmaWxlSXRlbTpufX1vblByb2dyZXNzSXRlbShuLGUpe3JldHVybntmaWxlSXRlbTpuLHByb2dyZXNzOmV9fW9uUHJvZ3Jlc3NBbGwobil7cmV0dXJue3Byb2dyZXNzOm59fW9uU3VjY2Vzc0l0ZW0obixlLGksYSl7cmV0dXJue2l0ZW06bixyZXNwb25zZTplLHN0YXR1czppLGhlYWRlcnM6YX19b25FcnJvckl0ZW0obixlLGksYSl7cmV0dXJue2l0ZW06bixyZXNwb25zZTplLHN0YXR1czppLGhlYWRlcnM6YX19b25DYW5jZWxJdGVtKG4sZSxpLGEpe3JldHVybntpdGVtOm4scmVzcG9uc2U6ZSxzdGF0dXM6aSxoZWFkZXJzOmF9fW9uQ29tcGxldGVJdGVtKG4sZSxpLGEpe3JldHVybntpdGVtOm4scmVzcG9uc2U6ZSxzdGF0dXM6aSxoZWFkZXJzOmF9fW9uQ29tcGxldGVBbGwoKXt9X21pbWVUeXBlRmlsdGVyKG4pe3JldHVybiEobj8udHlwZSYmdGhpcy5vcHRpb25zLmFsbG93ZWRNaW1lVHlwZSYmdGhpcy5vcHRpb25zLmFsbG93ZWRNaW1lVHlwZT8uaW5kZXhPZihuLnR5cGUpPT09LTEpfV9maWxlU2l6ZUZpbHRlcihuKXtyZXR1cm4hKHRoaXMub3B0aW9ucy5tYXhGaWxlU2l6ZSYmbi5zaXplPnRoaXMub3B0aW9ucy5tYXhGaWxlU2l6ZSl9X2ZpbGVUeXBlRmlsdGVyKG4pe3JldHVybiEodGhpcy5vcHRpb25zLmFsbG93ZWRGaWxlVHlwZSYmdGhpcy5vcHRpb25zLmFsbG93ZWRGaWxlVHlwZS5pbmRleE9mKGVQLmdldE1pbWVDbGFzcyhuKSk9PT0tMSl9X29uRXJyb3JJdGVtKG4sZSxpLGEpe24uX29uRXJyb3IoZSxpLGEpLHRoaXMub25FcnJvckl0ZW0obixlLGksYSl9X29uQ29tcGxldGVJdGVtKG4sZSxpLGEpe24uX29uQ29tcGxldGUoZSxpLGEpLHRoaXMub25Db21wbGV0ZUl0ZW0obixlLGksYSk7bGV0IHI9dGhpcy5nZXRSZWFkeUl0ZW1zKClbMF07aWYodGhpcy5pc1VwbG9hZGluZz0hMSxyKXtyLnVwbG9hZCgpO3JldHVybn10aGlzLm9uQ29tcGxldGVBbGwoKSx0aGlzLnByb2dyZXNzPXRoaXMuX2dldFRvdGFsUHJvZ3Jlc3MoKSx0aGlzLl9yZW5kZXIoKX1faGVhZGVyc0dldHRlcihuKXtyZXR1cm4gZT0+ZT9uW2UudG9Mb3dlckNhc2UoKV18fHZvaWQgMDpufV94aHJUcmFuc3BvcnQobil7bGV0IGU9dGhpcyxpPW4uX3hocj1uZXcgWE1MSHR0cFJlcXVlc3QsYTtpZih0aGlzLl9vbkJlZm9yZVVwbG9hZEl0ZW0obiksdHlwZW9mIG4uX2ZpbGUuc2l6ZSE9Im51bWJlciIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGZpbGUgc3BlY2lmaWVkIGlzIG5vIGxvbmdlciB2YWxpZCIpO2lmKHRoaXMub3B0aW9ucy5kaXNhYmxlTXVsdGlwYXJ0KXRoaXMub3B0aW9ucy5mb3JtYXREYXRhRnVuY3Rpb24mJihhPXRoaXMub3B0aW9ucy5mb3JtYXREYXRhRnVuY3Rpb24obikpO2Vsc2V7YT1uZXcgRm9ybURhdGEsdGhpcy5fb25CdWlsZEl0ZW1Gb3JtKG4sYSk7bGV0IHI9KCk9PmEuYXBwZW5kKG4uYWxpYXMsbi5fZmlsZSxuLmZpbGUubmFtZSk7dGhpcy5vcHRpb25zLnBhcmFtZXRlcnNCZWZvcmVGaWxlc3x8cigpLHRoaXMub3B0aW9ucy5hZGRpdGlvbmFsUGFyYW1ldGVyIT09dm9pZCAwJiZPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMuYWRkaXRpb25hbFBhcmFtZXRlcikuZm9yRWFjaChvPT57bGV0IGQ9dGhpcy5vcHRpb25zLmFkZGl0aW9uYWxQYXJhbWV0ZXI/LltvXTt0eXBlb2YgZD09InN0cmluZyImJmQuaW5kZXhPZigie3tmaWxlX25hbWV9fSIpPj0wJiZuLmZpbGU/Lm5hbWUmJihkPWQucmVwbGFjZSgie3tmaWxlX25hbWV9fSIsbi5maWxlLm5hbWUpKSxhLmFwcGVuZChvLGQpfSksciYmdGhpcy5vcHRpb25zLnBhcmFtZXRlcnNCZWZvcmVGaWxlcyYmcigpfWlmKGkudXBsb2FkLm9ucHJvZ3Jlc3M9cj0+e2xldCBvPU1hdGgucm91bmQoci5sZW5ndGhDb21wdXRhYmxlP3IubG9hZGVkKjEwMC9yLnRvdGFsOjApO3RoaXMuX29uUHJvZ3Jlc3NJdGVtKG4sbyl9LGkub25sb2FkPSgpPT57bGV0IHI9dGhpcy5fcGFyc2VIZWFkZXJzKGkuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpLG89dGhpcy5fdHJhbnNmb3JtUmVzcG9uc2UoaS5yZXNwb25zZSkscD1gX29uJHt0aGlzLl9pc1N1Y2Nlc3NDb2RlKGkuc3RhdHVzKT8iU3VjY2VzcyI6IkVycm9yIn1JdGVtYDt0aGlzW3BdKG4sbyxpLnN0YXR1cyxyKSx0aGlzLl9vbkNvbXBsZXRlSXRlbShuLG8saS5zdGF0dXMscil9LGkub25lcnJvcj0oKT0+e2xldCByPXRoaXMuX3BhcnNlSGVhZGVycyhpLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSxvPXRoaXMuX3RyYW5zZm9ybVJlc3BvbnNlKGkucmVzcG9uc2UpO3RoaXMuX29uRXJyb3JJdGVtKG4sbyxpLnN0YXR1cyxyKSx0aGlzLl9vbkNvbXBsZXRlSXRlbShuLG8saS5zdGF0dXMscil9LGkub25hYm9ydD0oKT0+e2xldCByPXRoaXMuX3BhcnNlSGVhZGVycyhpLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSxvPXRoaXMuX3RyYW5zZm9ybVJlc3BvbnNlKGkucmVzcG9uc2UpO3RoaXMuX29uQ2FuY2VsSXRlbShuLG8saS5zdGF0dXMsciksdGhpcy5fb25Db21wbGV0ZUl0ZW0obixvLGkuc3RhdHVzLHIpfSxuLm1ldGhvZCYmbi51cmwmJmkub3BlbihuLm1ldGhvZCxuLnVybCwhMCksaS53aXRoQ3JlZGVudGlhbHM9bi53aXRoQ3JlZGVudGlhbHMsdGhpcy5vcHRpb25zLmhlYWRlcnMpZm9yKGxldCByIG9mIHRoaXMub3B0aW9ucy5oZWFkZXJzKWkuc2V0UmVxdWVzdEhlYWRlcihyLm5hbWUsci52YWx1ZSk7aWYobi5oZWFkZXJzLmxlbmd0aClmb3IobGV0IHIgb2Ygbi5oZWFkZXJzKWkuc2V0UmVxdWVzdEhlYWRlcihyLm5hbWUsci52YWx1ZSk7dGhpcy5hdXRoVG9rZW4mJnRoaXMuYXV0aFRva2VuSGVhZGVyJiZpLnNldFJlcXVlc3RIZWFkZXIodGhpcy5hdXRoVG9rZW5IZWFkZXIsdGhpcy5hdXRoVG9rZW4pLGkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aS5yZWFkeVN0YXRlPT1YTUxIdHRwUmVxdWVzdC5ET05FJiZlLnJlc3BvbnNlLmVtaXQoaS5yZXNwb25zZVRleHQpfSx0aGlzLm9wdGlvbnMuZm9ybWF0RGF0YUZ1bmN0aW9uSXNBc3luYz9hLnRoZW4ocj0+aS5zZW5kKEpTT04uc3RyaW5naWZ5KHIpKSk6aS5zZW5kKGEpLHRoaXMuX3JlbmRlcigpfV9nZXRUb3RhbFByb2dyZXNzKG49MCl7aWYodGhpcy5vcHRpb25zLnJlbW92ZUFmdGVyVXBsb2FkKXJldHVybiBuO2xldCBlPXRoaXMuZ2V0Tm90VXBsb2FkZWRJdGVtcygpLmxlbmd0aCxpPWU/dGhpcy5xdWV1ZS5sZW5ndGgtZTp0aGlzLnF1ZXVlLmxlbmd0aCxhPTEwMC90aGlzLnF1ZXVlLmxlbmd0aCxyPW4qYS8xMDA7cmV0dXJuIE1hdGgucm91bmQoaSphK3IpfV9nZXRGaWx0ZXJzKG4pe2lmKCFuKXJldHVybiB0aGlzLm9wdGlvbnM/LmZpbHRlcnN8fFtdO2lmKEFycmF5LmlzQXJyYXkobikpcmV0dXJuIG47aWYodHlwZW9mIG49PSJzdHJpbmciKXtsZXQgZT1uLm1hdGNoKC9bXlxzLF0rL2cpO3JldHVybiB0aGlzLm9wdGlvbnM/LmZpbHRlcnN8fFtdLmZpbHRlcihpPT5lPy5pbmRleE9mKGkubmFtZSkhPT0tMSl9cmV0dXJuIHRoaXMub3B0aW9ucz8uZmlsdGVyc3x8W119X3JlbmRlcigpe31fcXVldWVMaW1pdEZpbHRlcigpe3JldHVybiB0aGlzLm9wdGlvbnMucXVldWVMaW1pdD09PXZvaWQgMHx8dGhpcy5xdWV1ZS5sZW5ndGg8dGhpcy5vcHRpb25zLnF1ZXVlTGltaXR9X2lzVmFsaWRGaWxlKG4sZSxpKXtyZXR1cm4gdGhpcy5fZmFpbEZpbHRlckluZGV4PS0xLGUubGVuZ3RoP2UuZXZlcnkoYT0+KHR5cGVvZiB0aGlzLl9mYWlsRmlsdGVySW5kZXg9PSJudW1iZXIiJiZ0aGlzLl9mYWlsRmlsdGVySW5kZXgrKyxhLmZuLmNhbGwodGhpcyxuLGkpKSk6ITB9X2lzU3VjY2Vzc0NvZGUobil7cmV0dXJuIG4+PTIwMCYmbjwzMDB8fG49PT0zMDR9X3RyYW5zZm9ybVJlc3BvbnNlKG4pe3JldHVybiBufV9wYXJzZUhlYWRlcnMobil7bGV0IGU9e30saSxhLHI7cmV0dXJuIG4mJm4uc3BsaXQoYApgKS5tYXAobz0+e3I9by5pbmRleE9mKCI6IiksaT1vLnNsaWNlKDAscikudHJpbSgpLnRvTG93ZXJDYXNlKCksYT1vLnNsaWNlKHIrMSkudHJpbSgpLGkmJihlW2ldPWVbaV0/ZVtpXSsiLCAiK2E6YSl9KSxlfV9vbldoZW5BZGRpbmdGaWxlRmFpbGVkKG4sZSxpKXt0aGlzLm9uV2hlbkFkZGluZ0ZpbGVGYWlsZWQobixlLGkpfV9vbkFmdGVyQWRkaW5nRmlsZShuKXt0aGlzLm9uQWZ0ZXJBZGRpbmdGaWxlKG4pfV9vbkFmdGVyQWRkaW5nQWxsKG4pe3RoaXMub25BZnRlckFkZGluZ0FsbChuKX1fb25CZWZvcmVVcGxvYWRJdGVtKG4pe24uX29uQmVmb3JlVXBsb2FkKCksdGhpcy5vbkJlZm9yZVVwbG9hZEl0ZW0obil9X29uQnVpbGRJdGVtRm9ybShuLGUpe24uX29uQnVpbGRGb3JtKGUpLHRoaXMub25CdWlsZEl0ZW1Gb3JtKG4sZSl9X29uUHJvZ3Jlc3NJdGVtKG4sZSl7bGV0IGk9dGhpcy5fZ2V0VG90YWxQcm9ncmVzcyhlKTt0aGlzLnByb2dyZXNzPWksbi5fb25Qcm9ncmVzcyhlKSx0aGlzLm9uUHJvZ3Jlc3NJdGVtKG4sZSksdGhpcy5vblByb2dyZXNzQWxsKGkpLHRoaXMuX3JlbmRlcigpfV9vblN1Y2Nlc3NJdGVtKG4sZSxpLGEpe24uX29uU3VjY2VzcyhlLGksYSksdGhpcy5vblN1Y2Nlc3NJdGVtKG4sZSxpLGEpfV9vbkNhbmNlbEl0ZW0obixlLGksYSl7bi5fb25DYW5jZWwoZSxpLGEpLHRoaXMub25DYW5jZWxJdGVtKG4sZSxpLGEpfX0sUGc9KCgpPT57Y2xhc3MgdHtjb25zdHJ1Y3Rvcigpe3RoaXMub25GaWxlU2VsZWN0ZWQ9bmV3IE4sdGhpcy5lbGVtZW50PWgoYWUpfWdldE9wdGlvbnMoKXtyZXR1cm4gdGhpcy51cGxvYWRlcj8ub3B0aW9uc31nZXRGaWx0ZXJzKCl7cmV0dXJuIiJ9aXNFbXB0eUFmdGVyU2VsZWN0aW9uKCl7cmV0dXJuISF0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hdHRyaWJ1dGVzLm11bHRpcGxlfW9uQ2hhbmdlKCl7bGV0IGU9dGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZmlsZXMsaT10aGlzLmdldE9wdGlvbnMoKSxhPXRoaXMuZ2V0RmlsdGVycygpO3RoaXMudXBsb2FkZXI/LmFkZFRvUXVldWUoZSxpLGEpLHRoaXMub25GaWxlU2VsZWN0ZWQuZW1pdChlKSx0aGlzLmlzRW1wdHlBZnRlclNlbGVjdGlvbigpJiYodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWU9IiIpfXN0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfX1zdGF0aWN7dGhpcy5cdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJuZzJGaWxlU2VsZWN0IiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMSYmUygiY2hhbmdlIixmdW5jdGlvbigpe3JldHVybiBhLm9uQ2hhbmdlKCl9KX0saW5wdXRzOnt1cGxvYWRlcjoidXBsb2FkZXIifSxvdXRwdXRzOntvbkZpbGVTZWxlY3RlZDoib25GaWxlU2VsZWN0ZWQifSxzdGFuZGFsb25lOiExfSl9fXJldHVybiB0fSkoKSxoYz0oKCk9PntjbGFzcyB0e3N0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfX1zdGF0aWN7dGhpcy5cdTAyNzVtb2Q9eGUoe3R5cGU6dH0pfXN0YXRpY3t0aGlzLlx1MDI3NWluaj15ZSh7aW1wb3J0czpbRGldfSl9fXJldHVybiB0fSkoKX0pO3ZhciBWZz1UZSgodTNlLGxvKT0+e3ZhciBlZT1mdW5jdGlvbigpe3RoaXMuRGlmZl9UaW1lb3V0PTEsdGhpcy5EaWZmX0VkaXRDb3N0PTQsdGhpcy5NYXRjaF9UaHJlc2hvbGQ9LjUsdGhpcy5NYXRjaF9EaXN0YW5jZT0xZTMsdGhpcy5QYXRjaF9EZWxldGVUaHJlc2hvbGQ9LjUsdGhpcy5QYXRjaF9NYXJnaW49NCx0aGlzLk1hdGNoX01heEJpdHM9MzJ9LGQxPS0xLHUxPTEsQ3Q9MDtlZS5EaWZmPWZ1bmN0aW9uKHQsbil7cmV0dXJuW3Qsbl19O2VlLnByb3RvdHlwZS5kaWZmX21haW49ZnVuY3Rpb24odCxuLGUsaSl7dHlwZW9mIGk+InUiJiYodGhpcy5EaWZmX1RpbWVvdXQ8PTA/aT1OdW1iZXIuTUFYX1ZBTFVFOmk9bmV3IERhdGUoKS5nZXRUaW1lKCkrdGhpcy5EaWZmX1RpbWVvdXQqMWUzKTt2YXIgYT1pO2lmKHQ9PW51bGx8fG49PW51bGwpdGhyb3cgbmV3IEVycm9yKCJOdWxsIGlucHV0LiAoZGlmZl9tYWluKSIpO2lmKHQ9PW4pcmV0dXJuIHQ/W25ldyBlZS5EaWZmKEN0LHQpXTpbXTt0eXBlb2YgZT4idSImJihlPSEwKTt2YXIgcj1lLG89dGhpcy5kaWZmX2NvbW1vblByZWZpeCh0LG4pLGQ9dC5zdWJzdHJpbmcoMCxvKTt0PXQuc3Vic3RyaW5nKG8pLG49bi5zdWJzdHJpbmcobyksbz10aGlzLmRpZmZfY29tbW9uU3VmZml4KHQsbik7dmFyIHA9dC5zdWJzdHJpbmcodC5sZW5ndGgtbyk7dD10LnN1YnN0cmluZygwLHQubGVuZ3RoLW8pLG49bi5zdWJzdHJpbmcoMCxuLmxlbmd0aC1vKTt2YXIgZz10aGlzLmRpZmZfY29tcHV0ZV8odCxuLHIsYSk7cmV0dXJuIGQmJmcudW5zaGlmdChuZXcgZWUuRGlmZihDdCxkKSkscCYmZy5wdXNoKG5ldyBlZS5EaWZmKEN0LHApKSx0aGlzLmRpZmZfY2xlYW51cE1lcmdlKGcpLGd9O2VlLnByb3RvdHlwZS5kaWZmX2NvbXB1dGVfPWZ1bmN0aW9uKHQsbixlLGkpe3ZhciBhO2lmKCF0KXJldHVybltuZXcgZWUuRGlmZih1MSxuKV07aWYoIW4pcmV0dXJuW25ldyBlZS5EaWZmKGQxLHQpXTt2YXIgcj10Lmxlbmd0aD5uLmxlbmd0aD90Om4sbz10Lmxlbmd0aD5uLmxlbmd0aD9uOnQsZD1yLmluZGV4T2Yobyk7aWYoZCE9LTEpcmV0dXJuIGE9W25ldyBlZS5EaWZmKHUxLHIuc3Vic3RyaW5nKDAsZCkpLG5ldyBlZS5EaWZmKEN0LG8pLG5ldyBlZS5EaWZmKHUxLHIuc3Vic3RyaW5nKGQrby5sZW5ndGgpKV0sdC5sZW5ndGg+bi5sZW5ndGgmJihhWzBdWzBdPWFbMl1bMF09ZDEpLGE7aWYoby5sZW5ndGg9PTEpcmV0dXJuW25ldyBlZS5EaWZmKGQxLHQpLG5ldyBlZS5EaWZmKHUxLG4pXTt2YXIgcD10aGlzLmRpZmZfaGFsZk1hdGNoXyh0LG4pO2lmKHApe3ZhciBnPXBbMF0sXz1wWzFdLHk9cFsyXSxJPXBbM10sUD1wWzRdLFY9dGhpcy5kaWZmX21haW4oZyx5LGUsaSksTz10aGlzLmRpZmZfbWFpbihfLEksZSxpKTtyZXR1cm4gVi5jb25jYXQoW25ldyBlZS5EaWZmKEN0LFApXSxPKX1yZXR1cm4gZSYmdC5sZW5ndGg+MTAwJiZuLmxlbmd0aD4xMDA/dGhpcy5kaWZmX2xpbmVNb2RlXyh0LG4saSk6dGhpcy5kaWZmX2Jpc2VjdF8odCxuLGkpfTtlZS5wcm90b3R5cGUuZGlmZl9saW5lTW9kZV89ZnVuY3Rpb24odCxuLGUpe3ZhciBpPXRoaXMuZGlmZl9saW5lc1RvQ2hhcnNfKHQsbik7dD1pLmNoYXJzMSxuPWkuY2hhcnMyO3ZhciBhPWkubGluZUFycmF5LHI9dGhpcy5kaWZmX21haW4odCxuLCExLGUpO3RoaXMuZGlmZl9jaGFyc1RvTGluZXNfKHIsYSksdGhpcy5kaWZmX2NsZWFudXBTZW1hbnRpYyhyKSxyLnB1c2gobmV3IGVlLkRpZmYoQ3QsIiIpKTtmb3IodmFyIG89MCxkPTAscD0wLGc9IiIsXz0iIjtvPHIubGVuZ3RoOyl7c3dpdGNoKHJbb11bMF0pe2Nhc2UgdTE6cCsrLF8rPXJbb11bMV07YnJlYWs7Y2FzZSBkMTpkKyssZys9cltvXVsxXTticmVhaztjYXNlIEN0OmlmKGQ+PTEmJnA+PTEpe3Iuc3BsaWNlKG8tZC1wLGQrcCksbz1vLWQtcDtmb3IodmFyIHk9dGhpcy5kaWZmX21haW4oZyxfLCExLGUpLEk9eS5sZW5ndGgtMTtJPj0wO0ktLSlyLnNwbGljZShvLDAseVtJXSk7bz1vK3kubGVuZ3RofXA9MCxkPTAsZz0iIixfPSIiO2JyZWFrfW8rK31yZXR1cm4gci5wb3AoKSxyfTtlZS5wcm90b3R5cGUuZGlmZl9iaXNlY3RfPWZ1bmN0aW9uKHQsbixlKXtmb3IodmFyIGk9dC5sZW5ndGgsYT1uLmxlbmd0aCxyPU1hdGguY2VpbCgoaSthKS8yKSxvPXIsZD0yKnIscD1uZXcgQXJyYXkoZCksZz1uZXcgQXJyYXkoZCksXz0wO188ZDtfKyspcFtfXT0tMSxnW19dPS0xO3BbbysxXT0wLGdbbysxXT0wO2Zvcih2YXIgeT1pLWEsST15JTIhPTAsUD0wLFY9MCxPPTAsVT0wLFE9MDtRPHImJiEobmV3IERhdGUoKS5nZXRUaW1lKCk+ZSk7USsrKXtmb3IodmFyIGZlPS1RK1A7ZmU8PVEtVjtmZSs9Mil7dmFyIE9lPW8rZmUsTWU7ZmU9PS1RfHxmZSE9USYmcFtPZS0xXTxwW09lKzFdP01lPXBbT2UrMV06TWU9cFtPZS0xXSsxO2Zvcih2YXIgcnQ9TWUtZmU7TWU8aSYmcnQ8YSYmdC5jaGFyQXQoTWUpPT1uLmNoYXJBdChydCk7KU1lKysscnQrKztpZihwW09lXT1NZSxNZT5pKVYrPTI7ZWxzZSBpZihydD5hKVArPTI7ZWxzZSBpZihJKXt2YXIgTmU9byt5LWZlO2lmKE5lPj0wJiZOZTxkJiZnW05lXSE9LTEpe3ZhciBZZT1pLWdbTmVdO2lmKE1lPj1ZZSlyZXR1cm4gdGhpcy5kaWZmX2Jpc2VjdFNwbGl0Xyh0LG4sTWUscnQsZSl9fX1mb3IodmFyIHZ0PS1RK087dnQ8PVEtVTt2dCs9Mil7dmFyIE5lPW8rdnQsWWU7dnQ9PS1RfHx2dCE9USYmZ1tOZS0xXTxnW05lKzFdP1llPWdbTmUrMV06WWU9Z1tOZS0xXSsxO2Zvcih2YXIgTTE9WWUtdnQ7WWU8aSYmTTE8YSYmdC5jaGFyQXQoaS1ZZS0xKT09bi5jaGFyQXQoYS1NMS0xKTspWWUrKyxNMSsrO2lmKGdbTmVdPVllLFllPmkpVSs9MjtlbHNlIGlmKE0xPmEpTys9MjtlbHNlIGlmKCFJKXt2YXIgT2U9byt5LXZ0O2lmKE9lPj0wJiZPZTxkJiZwW09lXSE9LTEpe3ZhciBNZT1wW09lXSxydD1vK01lLU9lO2lmKFllPWktWWUsTWU+PVllKXJldHVybiB0aGlzLmRpZmZfYmlzZWN0U3BsaXRfKHQsbixNZSxydCxlKX19fX1yZXR1cm5bbmV3IGVlLkRpZmYoZDEsdCksbmV3IGVlLkRpZmYodTEsbildfTtlZS5wcm90b3R5cGUuZGlmZl9iaXNlY3RTcGxpdF89ZnVuY3Rpb24odCxuLGUsaSxhKXt2YXIgcj10LnN1YnN0cmluZygwLGUpLG89bi5zdWJzdHJpbmcoMCxpKSxkPXQuc3Vic3RyaW5nKGUpLHA9bi5zdWJzdHJpbmcoaSksZz10aGlzLmRpZmZfbWFpbihyLG8sITEsYSksXz10aGlzLmRpZmZfbWFpbihkLHAsITEsYSk7cmV0dXJuIGcuY29uY2F0KF8pfTtlZS5wcm90b3R5cGUuZGlmZl9saW5lc1RvQ2hhcnNfPWZ1bmN0aW9uKHQsbil7dmFyIGU9W10saT17fTtlWzBdPSIiO2Z1bmN0aW9uIGEocCl7Zm9yKHZhciBnPSIiLF89MCx5PS0xLEk9ZS5sZW5ndGg7eTxwLmxlbmd0aC0xOyl7eT1wLmluZGV4T2YoYApgLF8pLHk9PS0xJiYoeT1wLmxlbmd0aC0xKTt2YXIgUD1wLnN1YnN0cmluZyhfLHkrMSk7KGkuaGFzT3duUHJvcGVydHk/aS5oYXNPd25Qcm9wZXJ0eShQKTppW1BdIT09dm9pZCAwKT9nKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGlbUF0pOihJPT1yJiYoUD1wLnN1YnN0cmluZyhfKSx5PXAubGVuZ3RoKSxnKz1TdHJpbmcuZnJvbUNoYXJDb2RlKEkpLGlbUF09SSxlW0krK109UCksXz15KzF9cmV0dXJuIGd9dmFyIHI9NGU0LG89YSh0KTtyPTY1NTM1O3ZhciBkPWEobik7cmV0dXJue2NoYXJzMTpvLGNoYXJzMjpkLGxpbmVBcnJheTplfX07ZWUucHJvdG90eXBlLmRpZmZfY2hhcnNUb0xpbmVzXz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXtmb3IodmFyIGk9dFtlXVsxXSxhPVtdLHI9MDtyPGkubGVuZ3RoO3IrKylhW3JdPW5baS5jaGFyQ29kZUF0KHIpXTt0W2VdWzFdPWEuam9pbigiIil9fTtlZS5wcm90b3R5cGUuZGlmZl9jb21tb25QcmVmaXg9ZnVuY3Rpb24odCxuKXtpZighdHx8IW58fHQuY2hhckF0KDApIT1uLmNoYXJBdCgwKSlyZXR1cm4gMDtmb3IodmFyIGU9MCxpPU1hdGgubWluKHQubGVuZ3RoLG4ubGVuZ3RoKSxhPWkscj0wO2U8YTspdC5zdWJzdHJpbmcocixhKT09bi5zdWJzdHJpbmcocixhKT8oZT1hLHI9ZSk6aT1hLGE9TWF0aC5mbG9vcigoaS1lKS8yK2UpO3JldHVybiBhfTtlZS5wcm90b3R5cGUuZGlmZl9jb21tb25TdWZmaXg9ZnVuY3Rpb24odCxuKXtpZighdHx8IW58fHQuY2hhckF0KHQubGVuZ3RoLTEpIT1uLmNoYXJBdChuLmxlbmd0aC0xKSlyZXR1cm4gMDtmb3IodmFyIGU9MCxpPU1hdGgubWluKHQubGVuZ3RoLG4ubGVuZ3RoKSxhPWkscj0wO2U8YTspdC5zdWJzdHJpbmcodC5sZW5ndGgtYSx0Lmxlbmd0aC1yKT09bi5zdWJzdHJpbmcobi5sZW5ndGgtYSxuLmxlbmd0aC1yKT8oZT1hLHI9ZSk6aT1hLGE9TWF0aC5mbG9vcigoaS1lKS8yK2UpO3JldHVybiBhfTtlZS5wcm90b3R5cGUuZGlmZl9jb21tb25PdmVybGFwXz1mdW5jdGlvbih0LG4pe3ZhciBlPXQubGVuZ3RoLGk9bi5sZW5ndGg7aWYoZT09MHx8aT09MClyZXR1cm4gMDtlPmk/dD10LnN1YnN0cmluZyhlLWkpOmU8aSYmKG49bi5zdWJzdHJpbmcoMCxlKSk7dmFyIGE9TWF0aC5taW4oZSxpKTtpZih0PT1uKXJldHVybiBhO2Zvcih2YXIgcj0wLG89MTs7KXt2YXIgZD10LnN1YnN0cmluZyhhLW8pLHA9bi5pbmRleE9mKGQpO2lmKHA9PS0xKXJldHVybiByO28rPXAsKHA9PTB8fHQuc3Vic3RyaW5nKGEtbyk9PW4uc3Vic3RyaW5nKDAsbykpJiYocj1vLG8rKyl9fTtlZS5wcm90b3R5cGUuZGlmZl9oYWxmTWF0Y2hfPWZ1bmN0aW9uKHQsbil7aWYodGhpcy5EaWZmX1RpbWVvdXQ8PTApcmV0dXJuIG51bGw7dmFyIGU9dC5sZW5ndGg+bi5sZW5ndGg/dDpuLGk9dC5sZW5ndGg+bi5sZW5ndGg/bjp0O2lmKGUubGVuZ3RoPDR8fGkubGVuZ3RoKjI8ZS5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIGE9dGhpcztmdW5jdGlvbiByKFYsTyxVKXtmb3IodmFyIFE9Vi5zdWJzdHJpbmcoVSxVK01hdGguZmxvb3IoVi5sZW5ndGgvNCkpLGZlPS0xLE9lPSIiLE1lLHJ0LE5lLFllOyhmZT1PLmluZGV4T2YoUSxmZSsxKSkhPS0xOyl7dmFyIHZ0PWEuZGlmZl9jb21tb25QcmVmaXgoVi5zdWJzdHJpbmcoVSksTy5zdWJzdHJpbmcoZmUpKSxNMT1hLmRpZmZfY29tbW9uU3VmZml4KFYuc3Vic3RyaW5nKDAsVSksTy5zdWJzdHJpbmcoMCxmZSkpO09lLmxlbmd0aDxNMSt2dCYmKE9lPU8uc3Vic3RyaW5nKGZlLU0xLGZlKStPLnN1YnN0cmluZyhmZSxmZSt2dCksTWU9Vi5zdWJzdHJpbmcoMCxVLU0xKSxydD1WLnN1YnN0cmluZyhVK3Z0KSxOZT1PLnN1YnN0cmluZygwLGZlLU0xKSxZZT1PLnN1YnN0cmluZyhmZSt2dCkpfXJldHVybiBPZS5sZW5ndGgqMj49Vi5sZW5ndGg/W01lLHJ0LE5lLFllLE9lXTpudWxsfXZhciBvPXIoZSxpLE1hdGguY2VpbChlLmxlbmd0aC80KSksZD1yKGUsaSxNYXRoLmNlaWwoZS5sZW5ndGgvMikpLHA7aWYoIW8mJiFkKXJldHVybiBudWxsO2Q/bz9wPW9bNF0ubGVuZ3RoPmRbNF0ubGVuZ3RoP286ZDpwPWQ6cD1vO3ZhciBnLF8seSxJO3QubGVuZ3RoPm4ubGVuZ3RoPyhnPXBbMF0sXz1wWzFdLHk9cFsyXSxJPXBbM10pOih5PXBbMF0sST1wWzFdLGc9cFsyXSxfPXBbM10pO3ZhciBQPXBbNF07cmV0dXJuW2csXyx5LEksUF19O2VlLnByb3RvdHlwZS5kaWZmX2NsZWFudXBTZW1hbnRpYz1mdW5jdGlvbih0KXtmb3IodmFyIG49ITEsZT1bXSxpPTAsYT1udWxsLHI9MCxvPTAsZD0wLHA9MCxnPTA7cjx0Lmxlbmd0aDspdFtyXVswXT09Q3Q/KGVbaSsrXT1yLG89cCxkPWcscD0wLGc9MCxhPXRbcl1bMV0pOih0W3JdWzBdPT11MT9wKz10W3JdWzFdLmxlbmd0aDpnKz10W3JdWzFdLmxlbmd0aCxhJiZhLmxlbmd0aDw9TWF0aC5tYXgobyxkKSYmYS5sZW5ndGg8PU1hdGgubWF4KHAsZykmJih0LnNwbGljZShlW2ktMV0sMCxuZXcgZWUuRGlmZihkMSxhKSksdFtlW2ktMV0rMV1bMF09dTEsaS0tLGktLSxyPWk+MD9lW2ktMV06LTEsbz0wLGQ9MCxwPTAsZz0wLGE9bnVsbCxuPSEwKSkscisrO2ZvcihuJiZ0aGlzLmRpZmZfY2xlYW51cE1lcmdlKHQpLHRoaXMuZGlmZl9jbGVhbnVwU2VtYW50aWNMb3NzbGVzcyh0KSxyPTE7cjx0Lmxlbmd0aDspe2lmKHRbci0xXVswXT09ZDEmJnRbcl1bMF09PXUxKXt2YXIgXz10W3ItMV1bMV0seT10W3JdWzFdLEk9dGhpcy5kaWZmX2NvbW1vbk92ZXJsYXBfKF8seSksUD10aGlzLmRpZmZfY29tbW9uT3ZlcmxhcF8oeSxfKTtJPj1QPyhJPj1fLmxlbmd0aC8yfHxJPj15Lmxlbmd0aC8yKSYmKHQuc3BsaWNlKHIsMCxuZXcgZWUuRGlmZihDdCx5LnN1YnN0cmluZygwLEkpKSksdFtyLTFdWzFdPV8uc3Vic3RyaW5nKDAsXy5sZW5ndGgtSSksdFtyKzFdWzFdPXkuc3Vic3RyaW5nKEkpLHIrKyk6KFA+PV8ubGVuZ3RoLzJ8fFA+PXkubGVuZ3RoLzIpJiYodC5zcGxpY2UociwwLG5ldyBlZS5EaWZmKEN0LF8uc3Vic3RyaW5nKDAsUCkpKSx0W3ItMV1bMF09dTEsdFtyLTFdWzFdPXkuc3Vic3RyaW5nKDAseS5sZW5ndGgtUCksdFtyKzFdWzBdPWQxLHRbcisxXVsxXT1fLnN1YnN0cmluZyhQKSxyKyspLHIrK31yKyt9fTtlZS5wcm90b3R5cGUuZGlmZl9jbGVhbnVwU2VtYW50aWNMb3NzbGVzcz1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKFAsVil7aWYoIVB8fCFWKXJldHVybiA2O3ZhciBPPVAuY2hhckF0KFAubGVuZ3RoLTEpLFU9Vi5jaGFyQXQoMCksUT1PLm1hdGNoKGVlLm5vbkFscGhhTnVtZXJpY1JlZ2V4XyksZmU9VS5tYXRjaChlZS5ub25BbHBoYU51bWVyaWNSZWdleF8pLE9lPVEmJk8ubWF0Y2goZWUud2hpdGVzcGFjZVJlZ2V4XyksTWU9ZmUmJlUubWF0Y2goZWUud2hpdGVzcGFjZVJlZ2V4XykscnQ9T2UmJk8ubWF0Y2goZWUubGluZWJyZWFrUmVnZXhfKSxOZT1NZSYmVS5tYXRjaChlZS5saW5lYnJlYWtSZWdleF8pLFllPXJ0JiZQLm1hdGNoKGVlLmJsYW5rbGluZUVuZFJlZ2V4XyksdnQ9TmUmJlYubWF0Y2goZWUuYmxhbmtsaW5lU3RhcnRSZWdleF8pO3JldHVybiBZZXx8dnQ/NTpydHx8TmU/NDpRJiYhT2UmJk1lPzM6T2V8fE1lPzI6UXx8ZmU/MTowfWZvcih2YXIgZT0xO2U8dC5sZW5ndGgtMTspe2lmKHRbZS0xXVswXT09Q3QmJnRbZSsxXVswXT09Q3Qpe3ZhciBpPXRbZS0xXVsxXSxhPXRbZV1bMV0scj10W2UrMV1bMV0sbz10aGlzLmRpZmZfY29tbW9uU3VmZml4KGksYSk7aWYobyl7dmFyIGQ9YS5zdWJzdHJpbmcoYS5sZW5ndGgtbyk7aT1pLnN1YnN0cmluZygwLGkubGVuZ3RoLW8pLGE9ZCthLnN1YnN0cmluZygwLGEubGVuZ3RoLW8pLHI9ZCtyfWZvcih2YXIgcD1pLGc9YSxfPXIseT1uKGksYSkrbihhLHIpO2EuY2hhckF0KDApPT09ci5jaGFyQXQoMCk7KXtpKz1hLmNoYXJBdCgwKSxhPWEuc3Vic3RyaW5nKDEpK3IuY2hhckF0KDApLHI9ci5zdWJzdHJpbmcoMSk7dmFyIEk9bihpLGEpK24oYSxyKTtJPj15JiYoeT1JLHA9aSxnPWEsXz1yKX10W2UtMV1bMV0hPXAmJihwP3RbZS0xXVsxXT1wOih0LnNwbGljZShlLTEsMSksZS0tKSx0W2VdWzFdPWcsXz90W2UrMV1bMV09XzoodC5zcGxpY2UoZSsxLDEpLGUtLSkpfWUrK319O2VlLm5vbkFscGhhTnVtZXJpY1JlZ2V4Xz0vW15hLXpBLVowLTldLztlZS53aGl0ZXNwYWNlUmVnZXhfPS9ccy87ZWUubGluZWJyZWFrUmVnZXhfPS9bXHJcbl0vO2VlLmJsYW5rbGluZUVuZFJlZ2V4Xz0vXG5ccj9cbiQvO2VlLmJsYW5rbGluZVN0YXJ0UmVnZXhfPS9eXHI/XG5ccj9cbi87ZWUucHJvdG90eXBlLmRpZmZfY2xlYW51cEVmZmljaWVuY3k9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPSExLGU9W10saT0wLGE9bnVsbCxyPTAsbz0hMSxkPSExLHA9ITEsZz0hMTtyPHQubGVuZ3RoOyl0W3JdWzBdPT1DdD8odFtyXVsxXS5sZW5ndGg8dGhpcy5EaWZmX0VkaXRDb3N0JiYocHx8Zyk/KGVbaSsrXT1yLG89cCxkPWcsYT10W3JdWzFdKTooaT0wLGE9bnVsbCkscD1nPSExKToodFtyXVswXT09ZDE/Zz0hMDpwPSEwLGEmJihvJiZkJiZwJiZnfHxhLmxlbmd0aDx0aGlzLkRpZmZfRWRpdENvc3QvMiYmbytkK3ArZz09MykmJih0LnNwbGljZShlW2ktMV0sMCxuZXcgZWUuRGlmZihkMSxhKSksdFtlW2ktMV0rMV1bMF09dTEsaS0tLGE9bnVsbCxvJiZkPyhwPWc9ITAsaT0wKTooaS0tLHI9aT4wP2VbaS0xXTotMSxwPWc9ITEpLG49ITApKSxyKys7biYmdGhpcy5kaWZmX2NsZWFudXBNZXJnZSh0KX07ZWUucHJvdG90eXBlLmRpZmZfY2xlYW51cE1lcmdlPWZ1bmN0aW9uKHQpe3QucHVzaChuZXcgZWUuRGlmZihDdCwiIikpO2Zvcih2YXIgbj0wLGU9MCxpPTAsYT0iIixyPSIiLG87bjx0Lmxlbmd0aDspc3dpdGNoKHRbbl1bMF0pe2Nhc2UgdTE6aSsrLHIrPXRbbl1bMV0sbisrO2JyZWFrO2Nhc2UgZDE6ZSsrLGErPXRbbl1bMV0sbisrO2JyZWFrO2Nhc2UgQ3Q6ZStpPjE/KGUhPT0wJiZpIT09MCYmKG89dGhpcy5kaWZmX2NvbW1vblByZWZpeChyLGEpLG8hPT0wJiYobi1lLWk+MCYmdFtuLWUtaS0xXVswXT09Q3Q/dFtuLWUtaS0xXVsxXSs9ci5zdWJzdHJpbmcoMCxvKToodC5zcGxpY2UoMCwwLG5ldyBlZS5EaWZmKEN0LHIuc3Vic3RyaW5nKDAsbykpKSxuKyspLHI9ci5zdWJzdHJpbmcobyksYT1hLnN1YnN0cmluZyhvKSksbz10aGlzLmRpZmZfY29tbW9uU3VmZml4KHIsYSksbyE9PTAmJih0W25dWzFdPXIuc3Vic3RyaW5nKHIubGVuZ3RoLW8pK3Rbbl1bMV0scj1yLnN1YnN0cmluZygwLHIubGVuZ3RoLW8pLGE9YS5zdWJzdHJpbmcoMCxhLmxlbmd0aC1vKSkpLG4tPWUraSx0LnNwbGljZShuLGUraSksYS5sZW5ndGgmJih0LnNwbGljZShuLDAsbmV3IGVlLkRpZmYoZDEsYSkpLG4rKyksci5sZW5ndGgmJih0LnNwbGljZShuLDAsbmV3IGVlLkRpZmYodTEscikpLG4rKyksbisrKTpuIT09MCYmdFtuLTFdWzBdPT1DdD8odFtuLTFdWzFdKz10W25dWzFdLHQuc3BsaWNlKG4sMSkpOm4rKyxpPTAsZT0wLGE9IiIscj0iIjticmVha310W3QubGVuZ3RoLTFdWzFdPT09IiImJnQucG9wKCk7dmFyIGQ9ITE7Zm9yKG49MTtuPHQubGVuZ3RoLTE7KXRbbi0xXVswXT09Q3QmJnRbbisxXVswXT09Q3QmJih0W25dWzFdLnN1YnN0cmluZyh0W25dWzFdLmxlbmd0aC10W24tMV1bMV0ubGVuZ3RoKT09dFtuLTFdWzFdPyh0W25dWzFdPXRbbi0xXVsxXSt0W25dWzFdLnN1YnN0cmluZygwLHRbbl1bMV0ubGVuZ3RoLXRbbi0xXVsxXS5sZW5ndGgpLHRbbisxXVsxXT10W24tMV1bMV0rdFtuKzFdWzFdLHQuc3BsaWNlKG4tMSwxKSxkPSEwKTp0W25dWzFdLnN1YnN0cmluZygwLHRbbisxXVsxXS5sZW5ndGgpPT10W24rMV1bMV0mJih0W24tMV1bMV0rPXRbbisxXVsxXSx0W25dWzFdPXRbbl1bMV0uc3Vic3RyaW5nKHRbbisxXVsxXS5sZW5ndGgpK3RbbisxXVsxXSx0LnNwbGljZShuKzEsMSksZD0hMCkpLG4rKztkJiZ0aGlzLmRpZmZfY2xlYW51cE1lcmdlKHQpfTtlZS5wcm90b3R5cGUuZGlmZl94SW5kZXg9ZnVuY3Rpb24odCxuKXt2YXIgZT0wLGk9MCxhPTAscj0wLG87Zm9yKG89MDtvPHQubGVuZ3RoJiYodFtvXVswXSE9PXUxJiYoZSs9dFtvXVsxXS5sZW5ndGgpLHRbb11bMF0hPT1kMSYmKGkrPXRbb11bMV0ubGVuZ3RoKSwhKGU+bikpO28rKylhPWUscj1pO3JldHVybiB0Lmxlbmd0aCE9byYmdFtvXVswXT09PWQxP3I6cisobi1hKX07ZWUucHJvdG90eXBlLmRpZmZfcHJldHR5SHRtbD1mdW5jdGlvbih0KXtmb3IodmFyIG49W10sZT0vJi9nLGk9LzwvZyxhPS8+L2cscj0vXG4vZyxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBkPXRbb11bMF0scD10W29dWzFdLGc9cC5yZXBsYWNlKGUsIiZhbXA7IikucmVwbGFjZShpLCImbHQ7IikucmVwbGFjZShhLCImZ3Q7IikucmVwbGFjZShyLCImcGFyYTs8YnI+Iik7c3dpdGNoKGQpe2Nhc2UgdTE6bltvXT0nPGlucyBzdHlsZT0iYmFja2dyb3VuZDojZTZmZmU2OyI+JytnKyI8L2lucz4iO2JyZWFrO2Nhc2UgZDE6bltvXT0nPGRlbCBzdHlsZT0iYmFja2dyb3VuZDojZmZlNmU2OyI+JytnKyI8L2RlbD4iO2JyZWFrO2Nhc2UgQ3Q6bltvXT0iPHNwYW4+IitnKyI8L3NwYW4+IjticmVha319cmV0dXJuIG4uam9pbigiIil9O2VlLnByb3RvdHlwZS5kaWZmX3RleHQxPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1bXSxlPTA7ZTx0Lmxlbmd0aDtlKyspdFtlXVswXSE9PXUxJiYobltlXT10W2VdWzFdKTtyZXR1cm4gbi5qb2luKCIiKX07ZWUucHJvdG90eXBlLmRpZmZfdGV4dDI9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPVtdLGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdWzBdIT09ZDEmJihuW2VdPXRbZV1bMV0pO3JldHVybiBuLmpvaW4oIiIpfTtlZS5wcm90b3R5cGUuZGlmZl9sZXZlbnNodGVpbj1mdW5jdGlvbih0KXtmb3IodmFyIG49MCxlPTAsaT0wLGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIHI9dFthXVswXSxvPXRbYV1bMV07c3dpdGNoKHIpe2Nhc2UgdTE6ZSs9by5sZW5ndGg7YnJlYWs7Y2FzZSBkMTppKz1vLmxlbmd0aDticmVhaztjYXNlIEN0Om4rPU1hdGgubWF4KGUsaSksZT0wLGk9MDticmVha319cmV0dXJuIG4rPU1hdGgubWF4KGUsaSksbn07ZWUucHJvdG90eXBlLmRpZmZfdG9EZWx0YT1mdW5jdGlvbih0KXtmb3IodmFyIG49W10sZT0wO2U8dC5sZW5ndGg7ZSsrKXN3aXRjaCh0W2VdWzBdKXtjYXNlIHUxOm5bZV09IisiK2VuY29kZVVSSSh0W2VdWzFdKTticmVhaztjYXNlIGQxOm5bZV09Ii0iK3RbZV1bMV0ubGVuZ3RoO2JyZWFrO2Nhc2UgQ3Q6bltlXT0iPSIrdFtlXVsxXS5sZW5ndGg7YnJlYWt9cmV0dXJuIG4uam9pbigiCSIpLnJlcGxhY2UoLyUyMC9nLCIgIil9O2VlLnByb3RvdHlwZS5kaWZmX2Zyb21EZWx0YT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1bXSxpPTAsYT0wLHI9bi5zcGxpdCgvXHQvZyksbz0wO288ci5sZW5ndGg7bysrKXt2YXIgZD1yW29dLnN1YnN0cmluZygxKTtzd2l0Y2gocltvXS5jaGFyQXQoMCkpe2Nhc2UiKyI6dHJ5e2VbaSsrXT1uZXcgZWUuRGlmZih1MSxkZWNvZGVVUkkoZCkpfWNhdGNoe3Rocm93IG5ldyBFcnJvcigiSWxsZWdhbCBlc2NhcGUgaW4gZGlmZl9mcm9tRGVsdGE6ICIrZCl9YnJlYWs7Y2FzZSItIjpjYXNlIj0iOnZhciBwPXBhcnNlSW50KGQsMTApO2lmKGlzTmFOKHApfHxwPDApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG51bWJlciBpbiBkaWZmX2Zyb21EZWx0YTogIitkKTt2YXIgZz10LnN1YnN0cmluZyhhLGErPXApO3Jbb10uY2hhckF0KDApPT0iPSI/ZVtpKytdPW5ldyBlZS5EaWZmKEN0LGcpOmVbaSsrXT1uZXcgZWUuRGlmZihkMSxnKTticmVhaztkZWZhdWx0OmlmKHJbb10pdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRpZmYgb3BlcmF0aW9uIGluIGRpZmZfZnJvbURlbHRhOiAiK3Jbb10pfX1pZihhIT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkRlbHRhIGxlbmd0aCAoIithKyIpIGRvZXMgbm90IGVxdWFsIHNvdXJjZSB0ZXh0IGxlbmd0aCAoIit0Lmxlbmd0aCsiKS4iKTtyZXR1cm4gZX07ZWUucHJvdG90eXBlLm1hdGNoX21haW49ZnVuY3Rpb24odCxuLGUpe2lmKHQ9PW51bGx8fG49PW51bGx8fGU9PW51bGwpdGhyb3cgbmV3IEVycm9yKCJOdWxsIGlucHV0LiAobWF0Y2hfbWFpbikiKTtyZXR1cm4gZT1NYXRoLm1heCgwLE1hdGgubWluKGUsdC5sZW5ndGgpKSx0PT1uPzA6dC5sZW5ndGg/dC5zdWJzdHJpbmcoZSxlK24ubGVuZ3RoKT09bj9lOnRoaXMubWF0Y2hfYml0YXBfKHQsbixlKTotMX07ZWUucHJvdG90eXBlLm1hdGNoX2JpdGFwXz1mdW5jdGlvbih0LG4sZSl7aWYobi5sZW5ndGg+dGhpcy5NYXRjaF9NYXhCaXRzKXRocm93IG5ldyBFcnJvcigiUGF0dGVybiB0b28gbG9uZyBmb3IgdGhpcyBicm93c2VyLiIpO3ZhciBpPXRoaXMubWF0Y2hfYWxwaGFiZXRfKG4pLGE9dGhpcztmdW5jdGlvbiByKE1lLHJ0KXt2YXIgTmU9TWUvbi5sZW5ndGgsWWU9TWF0aC5hYnMoZS1ydCk7cmV0dXJuIGEuTWF0Y2hfRGlzdGFuY2U/TmUrWWUvYS5NYXRjaF9EaXN0YW5jZTpZZT8xOk5lfXZhciBvPXRoaXMuTWF0Y2hfVGhyZXNob2xkLGQ9dC5pbmRleE9mKG4sZSk7ZCE9LTEmJihvPU1hdGgubWluKHIoMCxkKSxvKSxkPXQubGFzdEluZGV4T2YobixlK24ubGVuZ3RoKSxkIT0tMSYmKG89TWF0aC5taW4ocigwLGQpLG8pKSk7dmFyIHA9MTw8bi5sZW5ndGgtMTtkPS0xO2Zvcih2YXIgZyxfLHk9bi5sZW5ndGgrdC5sZW5ndGgsSSxQPTA7UDxuLmxlbmd0aDtQKyspe2ZvcihnPTAsXz15O2c8XzspcihQLGUrXyk8PW8/Zz1fOnk9XyxfPU1hdGguZmxvb3IoKHktZykvMitnKTt5PV87dmFyIFY9TWF0aC5tYXgoMSxlLV8rMSksTz1NYXRoLm1pbihlK18sdC5sZW5ndGgpK24ubGVuZ3RoLFU9QXJyYXkoTysyKTtVW08rMV09KDE8PFApLTE7Zm9yKHZhciBRPU87UT49VjtRLS0pe3ZhciBmZT1pW3QuY2hhckF0KFEtMSldO2lmKFA9PT0wP1VbUV09KFVbUSsxXTw8MXwxKSZmZTpVW1FdPShVW1ErMV08PDF8MSkmZmV8KChJW1ErMV18SVtRXSk8PDF8MSl8SVtRKzFdLFVbUV0mcCl7dmFyIE9lPXIoUCxRLTEpO2lmKE9lPD1vKWlmKG89T2UsZD1RLTEsZD5lKVY9TWF0aC5tYXgoMSwyKmUtZCk7ZWxzZSBicmVha319aWYocihQKzEsZSk+bylicmVhaztJPVV9cmV0dXJuIGR9O2VlLnByb3RvdHlwZS5tYXRjaF9hbHBoYWJldF89ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXt9LGU9MDtlPHQubGVuZ3RoO2UrKyluW3QuY2hhckF0KGUpXT0wO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKW5bdC5jaGFyQXQoZSldfD0xPDx0Lmxlbmd0aC1lLTE7cmV0dXJuIG59O2VlLnByb3RvdHlwZS5wYXRjaF9hZGRDb250ZXh0Xz1mdW5jdGlvbih0LG4pe2lmKG4ubGVuZ3RoIT0wKXtpZih0LnN0YXJ0Mj09PW51bGwpdGhyb3cgRXJyb3IoInBhdGNoIG5vdCBpbml0aWFsaXplZCIpO2Zvcih2YXIgZT1uLnN1YnN0cmluZyh0LnN0YXJ0Mix0LnN0YXJ0Mit0Lmxlbmd0aDEpLGk9MDtuLmluZGV4T2YoZSkhPW4ubGFzdEluZGV4T2YoZSkmJmUubGVuZ3RoPHRoaXMuTWF0Y2hfTWF4Qml0cy10aGlzLlBhdGNoX01hcmdpbi10aGlzLlBhdGNoX01hcmdpbjspaSs9dGhpcy5QYXRjaF9NYXJnaW4sZT1uLnN1YnN0cmluZyh0LnN0YXJ0Mi1pLHQuc3RhcnQyK3QubGVuZ3RoMStpKTtpKz10aGlzLlBhdGNoX01hcmdpbjt2YXIgYT1uLnN1YnN0cmluZyh0LnN0YXJ0Mi1pLHQuc3RhcnQyKTthJiZ0LmRpZmZzLnVuc2hpZnQobmV3IGVlLkRpZmYoQ3QsYSkpO3ZhciByPW4uc3Vic3RyaW5nKHQuc3RhcnQyK3QubGVuZ3RoMSx0LnN0YXJ0Mit0Lmxlbmd0aDEraSk7ciYmdC5kaWZmcy5wdXNoKG5ldyBlZS5EaWZmKEN0LHIpKSx0LnN0YXJ0MS09YS5sZW5ndGgsdC5zdGFydDItPWEubGVuZ3RoLHQubGVuZ3RoMSs9YS5sZW5ndGgrci5sZW5ndGgsdC5sZW5ndGgyKz1hLmxlbmd0aCtyLmxlbmd0aH19O2VlLnByb3RvdHlwZS5wYXRjaF9tYWtlPWZ1bmN0aW9uKHQsbixlKXt2YXIgaSxhO2lmKHR5cGVvZiB0PT0ic3RyaW5nIiYmdHlwZW9mIG49PSJzdHJpbmciJiZ0eXBlb2YgZT4idSIpaT10LGE9dGhpcy5kaWZmX21haW4oaSxuLCEwKSxhLmxlbmd0aD4yJiYodGhpcy5kaWZmX2NsZWFudXBTZW1hbnRpYyhhKSx0aGlzLmRpZmZfY2xlYW51cEVmZmljaWVuY3koYSkpO2Vsc2UgaWYodCYmdHlwZW9mIHQ9PSJvYmplY3QiJiZ0eXBlb2Ygbj4idSImJnR5cGVvZiBlPiJ1IilhPXQsaT10aGlzLmRpZmZfdGV4dDEoYSk7ZWxzZSBpZih0eXBlb2YgdD09InN0cmluZyImJm4mJnR5cGVvZiBuPT0ib2JqZWN0IiYmdHlwZW9mIGU+InUiKWk9dCxhPW47ZWxzZSBpZih0eXBlb2YgdD09InN0cmluZyImJnR5cGVvZiBuPT0ic3RyaW5nIiYmZSYmdHlwZW9mIGU9PSJvYmplY3QiKWk9dCxhPWU7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY2FsbCBmb3JtYXQgdG8gcGF0Y2hfbWFrZS4iKTtpZihhLmxlbmd0aD09PTApcmV0dXJuW107Zm9yKHZhciByPVtdLG89bmV3IGVlLnBhdGNoX29iaixkPTAscD0wLGc9MCxfPWkseT1pLEk9MDtJPGEubGVuZ3RoO0krKyl7dmFyIFA9YVtJXVswXSxWPWFbSV1bMV07c3dpdGNoKCFkJiZQIT09Q3QmJihvLnN0YXJ0MT1wLG8uc3RhcnQyPWcpLFApe2Nhc2UgdTE6by5kaWZmc1tkKytdPWFbSV0sby5sZW5ndGgyKz1WLmxlbmd0aCx5PXkuc3Vic3RyaW5nKDAsZykrVit5LnN1YnN0cmluZyhnKTticmVhaztjYXNlIGQxOm8ubGVuZ3RoMSs9Vi5sZW5ndGgsby5kaWZmc1tkKytdPWFbSV0seT15LnN1YnN0cmluZygwLGcpK3kuc3Vic3RyaW5nKGcrVi5sZW5ndGgpO2JyZWFrO2Nhc2UgQ3Q6Vi5sZW5ndGg8PTIqdGhpcy5QYXRjaF9NYXJnaW4mJmQmJmEubGVuZ3RoIT1JKzE/KG8uZGlmZnNbZCsrXT1hW0ldLG8ubGVuZ3RoMSs9Vi5sZW5ndGgsby5sZW5ndGgyKz1WLmxlbmd0aCk6Vi5sZW5ndGg+PTIqdGhpcy5QYXRjaF9NYXJnaW4mJmQmJih0aGlzLnBhdGNoX2FkZENvbnRleHRfKG8sXyksci5wdXNoKG8pLG89bmV3IGVlLnBhdGNoX29iaixkPTAsXz15LHA9Zyk7YnJlYWt9UCE9PXUxJiYocCs9Vi5sZW5ndGgpLFAhPT1kMSYmKGcrPVYubGVuZ3RoKX1yZXR1cm4gZCYmKHRoaXMucGF0Y2hfYWRkQ29udGV4dF8obyxfKSxyLnB1c2gobykpLHJ9O2VlLnByb3RvdHlwZS5wYXRjaF9kZWVwQ29weT1mdW5jdGlvbih0KXtmb3IodmFyIG49W10sZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgaT10W2VdLGE9bmV3IGVlLnBhdGNoX29iajthLmRpZmZzPVtdO2Zvcih2YXIgcj0wO3I8aS5kaWZmcy5sZW5ndGg7cisrKWEuZGlmZnNbcl09bmV3IGVlLkRpZmYoaS5kaWZmc1tyXVswXSxpLmRpZmZzW3JdWzFdKTthLnN0YXJ0MT1pLnN0YXJ0MSxhLnN0YXJ0Mj1pLnN0YXJ0MixhLmxlbmd0aDE9aS5sZW5ndGgxLGEubGVuZ3RoMj1pLmxlbmd0aDIsbltlXT1hfXJldHVybiBufTtlZS5wcm90b3R5cGUucGF0Y2hfYXBwbHk9ZnVuY3Rpb24odCxuKXtpZih0Lmxlbmd0aD09MClyZXR1cm5bbixbXV07dD10aGlzLnBhdGNoX2RlZXBDb3B5KHQpO3ZhciBlPXRoaXMucGF0Y2hfYWRkUGFkZGluZyh0KTtuPWUrbitlLHRoaXMucGF0Y2hfc3BsaXRNYXgodCk7Zm9yKHZhciBpPTAsYT1bXSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBvPXRbcl0uc3RhcnQyK2ksZD10aGlzLmRpZmZfdGV4dDEodFtyXS5kaWZmcykscCxnPS0xO2lmKGQubGVuZ3RoPnRoaXMuTWF0Y2hfTWF4Qml0cz8ocD10aGlzLm1hdGNoX21haW4obixkLnN1YnN0cmluZygwLHRoaXMuTWF0Y2hfTWF4Qml0cyksbykscCE9LTEmJihnPXRoaXMubWF0Y2hfbWFpbihuLGQuc3Vic3RyaW5nKGQubGVuZ3RoLXRoaXMuTWF0Y2hfTWF4Qml0cyksbytkLmxlbmd0aC10aGlzLk1hdGNoX01heEJpdHMpLChnPT0tMXx8cD49ZykmJihwPS0xKSkpOnA9dGhpcy5tYXRjaF9tYWluKG4sZCxvKSxwPT0tMSlhW3JdPSExLGktPXRbcl0ubGVuZ3RoMi10W3JdLmxlbmd0aDE7ZWxzZXthW3JdPSEwLGk9cC1vO3ZhciBfO2lmKGc9PS0xP189bi5zdWJzdHJpbmcocCxwK2QubGVuZ3RoKTpfPW4uc3Vic3RyaW5nKHAsZyt0aGlzLk1hdGNoX01heEJpdHMpLGQ9PV8pbj1uLnN1YnN0cmluZygwLHApK3RoaXMuZGlmZl90ZXh0Mih0W3JdLmRpZmZzKStuLnN1YnN0cmluZyhwK2QubGVuZ3RoKTtlbHNle3ZhciB5PXRoaXMuZGlmZl9tYWluKGQsXywhMSk7aWYoZC5sZW5ndGg+dGhpcy5NYXRjaF9NYXhCaXRzJiZ0aGlzLmRpZmZfbGV2ZW5zaHRlaW4oeSkvZC5sZW5ndGg+dGhpcy5QYXRjaF9EZWxldGVUaHJlc2hvbGQpYVtyXT0hMTtlbHNle3RoaXMuZGlmZl9jbGVhbnVwU2VtYW50aWNMb3NzbGVzcyh5KTtmb3IodmFyIEk9MCxQLFY9MDtWPHRbcl0uZGlmZnMubGVuZ3RoO1YrKyl7dmFyIE89dFtyXS5kaWZmc1tWXTtPWzBdIT09Q3QmJihQPXRoaXMuZGlmZl94SW5kZXgoeSxJKSksT1swXT09PXUxP249bi5zdWJzdHJpbmcoMCxwK1ApK09bMV0rbi5zdWJzdHJpbmcocCtQKTpPWzBdPT09ZDEmJihuPW4uc3Vic3RyaW5nKDAscCtQKStuLnN1YnN0cmluZyhwK3RoaXMuZGlmZl94SW5kZXgoeSxJK09bMV0ubGVuZ3RoKSkpLE9bMF0hPT1kMSYmKEkrPU9bMV0ubGVuZ3RoKX19fX19cmV0dXJuIG49bi5zdWJzdHJpbmcoZS5sZW5ndGgsbi5sZW5ndGgtZS5sZW5ndGgpLFtuLGFdfTtlZS5wcm90b3R5cGUucGF0Y2hfYWRkUGFkZGluZz1mdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5QYXRjaF9NYXJnaW4sZT0iIixpPTE7aTw9bjtpKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZShpKTtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyl0W2ldLnN0YXJ0MSs9bix0W2ldLnN0YXJ0Mis9bjt2YXIgYT10WzBdLHI9YS5kaWZmcztpZihyLmxlbmd0aD09MHx8clswXVswXSE9Q3Qpci51bnNoaWZ0KG5ldyBlZS5EaWZmKEN0LGUpKSxhLnN0YXJ0MS09bixhLnN0YXJ0Mi09bixhLmxlbmd0aDErPW4sYS5sZW5ndGgyKz1uO2Vsc2UgaWYobj5yWzBdWzFdLmxlbmd0aCl7dmFyIG89bi1yWzBdWzFdLmxlbmd0aDtyWzBdWzFdPWUuc3Vic3RyaW5nKHJbMF1bMV0ubGVuZ3RoKStyWzBdWzFdLGEuc3RhcnQxLT1vLGEuc3RhcnQyLT1vLGEubGVuZ3RoMSs9byxhLmxlbmd0aDIrPW99aWYoYT10W3QubGVuZ3RoLTFdLHI9YS5kaWZmcyxyLmxlbmd0aD09MHx8cltyLmxlbmd0aC0xXVswXSE9Q3Qpci5wdXNoKG5ldyBlZS5EaWZmKEN0LGUpKSxhLmxlbmd0aDErPW4sYS5sZW5ndGgyKz1uO2Vsc2UgaWYobj5yW3IubGVuZ3RoLTFdWzFdLmxlbmd0aCl7dmFyIG89bi1yW3IubGVuZ3RoLTFdWzFdLmxlbmd0aDtyW3IubGVuZ3RoLTFdWzFdKz1lLnN1YnN0cmluZygwLG8pLGEubGVuZ3RoMSs9byxhLmxlbmd0aDIrPW99cmV0dXJuIGV9O2VlLnByb3RvdHlwZS5wYXRjaF9zcGxpdE1heD1mdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5NYXRjaF9NYXhCaXRzLGU9MDtlPHQubGVuZ3RoO2UrKylpZighKHRbZV0ubGVuZ3RoMTw9bikpe3ZhciBpPXRbZV07dC5zcGxpY2UoZS0tLDEpO2Zvcih2YXIgYT1pLnN0YXJ0MSxyPWkuc3RhcnQyLG89IiI7aS5kaWZmcy5sZW5ndGghPT0wOyl7dmFyIGQ9bmV3IGVlLnBhdGNoX29iaixwPSEwO2ZvcihkLnN0YXJ0MT1hLW8ubGVuZ3RoLGQuc3RhcnQyPXItby5sZW5ndGgsbyE9PSIiJiYoZC5sZW5ndGgxPWQubGVuZ3RoMj1vLmxlbmd0aCxkLmRpZmZzLnB1c2gobmV3IGVlLkRpZmYoQ3QsbykpKTtpLmRpZmZzLmxlbmd0aCE9PTAmJmQubGVuZ3RoMTxuLXRoaXMuUGF0Y2hfTWFyZ2luOyl7dmFyIGc9aS5kaWZmc1swXVswXSxfPWkuZGlmZnNbMF1bMV07Zz09PXUxPyhkLmxlbmd0aDIrPV8ubGVuZ3RoLHIrPV8ubGVuZ3RoLGQuZGlmZnMucHVzaChpLmRpZmZzLnNoaWZ0KCkpLHA9ITEpOmc9PT1kMSYmZC5kaWZmcy5sZW5ndGg9PTEmJmQuZGlmZnNbMF1bMF09PUN0JiZfLmxlbmd0aD4yKm4/KGQubGVuZ3RoMSs9Xy5sZW5ndGgsYSs9Xy5sZW5ndGgscD0hMSxkLmRpZmZzLnB1c2gobmV3IGVlLkRpZmYoZyxfKSksaS5kaWZmcy5zaGlmdCgpKTooXz1fLnN1YnN0cmluZygwLG4tZC5sZW5ndGgxLXRoaXMuUGF0Y2hfTWFyZ2luKSxkLmxlbmd0aDErPV8ubGVuZ3RoLGErPV8ubGVuZ3RoLGc9PT1DdD8oZC5sZW5ndGgyKz1fLmxlbmd0aCxyKz1fLmxlbmd0aCk6cD0hMSxkLmRpZmZzLnB1c2gobmV3IGVlLkRpZmYoZyxfKSksXz09aS5kaWZmc1swXVsxXT9pLmRpZmZzLnNoaWZ0KCk6aS5kaWZmc1swXVsxXT1pLmRpZmZzWzBdWzFdLnN1YnN0cmluZyhfLmxlbmd0aCkpfW89dGhpcy5kaWZmX3RleHQyKGQuZGlmZnMpLG89by5zdWJzdHJpbmcoby5sZW5ndGgtdGhpcy5QYXRjaF9NYXJnaW4pO3ZhciB5PXRoaXMuZGlmZl90ZXh0MShpLmRpZmZzKS5zdWJzdHJpbmcoMCx0aGlzLlBhdGNoX01hcmdpbik7eSE9PSIiJiYoZC5sZW5ndGgxKz15Lmxlbmd0aCxkLmxlbmd0aDIrPXkubGVuZ3RoLGQuZGlmZnMubGVuZ3RoIT09MCYmZC5kaWZmc1tkLmRpZmZzLmxlbmd0aC0xXVswXT09PUN0P2QuZGlmZnNbZC5kaWZmcy5sZW5ndGgtMV1bMV0rPXk6ZC5kaWZmcy5wdXNoKG5ldyBlZS5EaWZmKEN0LHkpKSkscHx8dC5zcGxpY2UoKytlLDAsZCl9fX07ZWUucHJvdG90eXBlLnBhdGNoX3RvVGV4dD1mdW5jdGlvbih0KXtmb3IodmFyIG49W10sZT0wO2U8dC5sZW5ndGg7ZSsrKW5bZV09dFtlXTtyZXR1cm4gbi5qb2luKCIiKX07ZWUucHJvdG90eXBlLnBhdGNoX2Zyb21UZXh0PWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2lmKCF0KXJldHVybiBuO2Zvcih2YXIgZT10LnNwbGl0KGAKYCksaT0wLGE9L15AQCAtKFxkKyksPyhcZCopIFwrKFxkKyksPyhcZCopIEBAJC87aTxlLmxlbmd0aDspe3ZhciByPWVbaV0ubWF0Y2goYSk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHBhdGNoIHN0cmluZzogIitlW2ldKTt2YXIgbz1uZXcgZWUucGF0Y2hfb2JqO2ZvcihuLnB1c2gobyksby5zdGFydDE9cGFyc2VJbnQoclsxXSwxMCksclsyXT09PSIiPyhvLnN0YXJ0MS0tLG8ubGVuZ3RoMT0xKTpyWzJdPT0iMCI/by5sZW5ndGgxPTA6KG8uc3RhcnQxLS0sby5sZW5ndGgxPXBhcnNlSW50KHJbMl0sMTApKSxvLnN0YXJ0Mj1wYXJzZUludChyWzNdLDEwKSxyWzRdPT09IiI/KG8uc3RhcnQyLS0sby5sZW5ndGgyPTEpOnJbNF09PSIwIj9vLmxlbmd0aDI9MDooby5zdGFydDItLSxvLmxlbmd0aDI9cGFyc2VJbnQocls0XSwxMCkpLGkrKztpPGUubGVuZ3RoOyl7dmFyIGQ9ZVtpXS5jaGFyQXQoMCk7dHJ5e3ZhciBwPWRlY29kZVVSSShlW2ldLnN1YnN0cmluZygxKSl9Y2F0Y2h7dGhyb3cgbmV3IEVycm9yKCJJbGxlZ2FsIGVzY2FwZSBpbiBwYXRjaF9mcm9tVGV4dDogIitwKX1pZihkPT0iLSIpby5kaWZmcy5wdXNoKG5ldyBlZS5EaWZmKGQxLHApKTtlbHNlIGlmKGQ9PSIrIilvLmRpZmZzLnB1c2gobmV3IGVlLkRpZmYodTEscCkpO2Vsc2UgaWYoZD09IiAiKW8uZGlmZnMucHVzaChuZXcgZWUuRGlmZihDdCxwKSk7ZWxzZXtpZihkPT0iQCIpYnJlYWs7aWYoZCE9PSIiKXRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXRjaCBtb2RlICInK2QrJyIgaW46ICcrcCl9aSsrfX1yZXR1cm4gbn07ZWUucGF0Y2hfb2JqPWZ1bmN0aW9uKCl7dGhpcy5kaWZmcz1bXSx0aGlzLnN0YXJ0MT1udWxsLHRoaXMuc3RhcnQyPW51bGwsdGhpcy5sZW5ndGgxPTAsdGhpcy5sZW5ndGgyPTB9O2VlLnBhdGNoX29iai5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdCxuO3RoaXMubGVuZ3RoMT09PTA/dD10aGlzLnN0YXJ0MSsiLDAiOnRoaXMubGVuZ3RoMT09MT90PXRoaXMuc3RhcnQxKzE6dD10aGlzLnN0YXJ0MSsxKyIsIit0aGlzLmxlbmd0aDEsdGhpcy5sZW5ndGgyPT09MD9uPXRoaXMuc3RhcnQyKyIsMCI6dGhpcy5sZW5ndGgyPT0xP249dGhpcy5zdGFydDIrMTpuPXRoaXMuc3RhcnQyKzErIiwiK3RoaXMubGVuZ3RoMjtmb3IodmFyIGU9WyJAQCAtIit0KyIgKyIrbitgIEBACmBdLGksYT0wO2E8dGhpcy5kaWZmcy5sZW5ndGg7YSsrKXtzd2l0Y2godGhpcy5kaWZmc1thXVswXSl7Y2FzZSB1MTppPSIrIjticmVhaztjYXNlIGQxOmk9Ii0iO2JyZWFrO2Nhc2UgQ3Q6aT0iICI7YnJlYWt9ZVthKzFdPWkrZW5jb2RlVVJJKHRoaXMuZGlmZnNbYV1bMV0pK2AKYH1yZXR1cm4gZS5qb2luKCIiKS5yZXBsYWNlKC8lMjAvZywiICIpfTtsby5leHBvcnRzPWVlO2xvLmV4cG9ydHMuZGlmZl9tYXRjaF9wYXRjaD1lZTtsby5leHBvcnRzLkRJRkZfREVMRVRFPWQxO2xvLmV4cG9ydHMuRElGRl9JTlNFUlQ9dTE7bG8uZXhwb3J0cy5ESUZGX0VRVUFMPUN0fSk7ZnVuY3Rpb24gYVAodCxuKXt0JjEmJihjKDAsImRpdiIsMSksdSgxLCJkaXYiKSgyLCJkaXYiKSgzLCJkaXYiKSg0LCJkaXYiKSg1LCJkaXYiKSg2LCJkaXYiKSg3LCJkaXYiKSg4LCJkaXYiKSxzKCkpfWZ1bmN0aW9uIHJQKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJkaXYiLDkpKDEsImRpdiIsMTApKDIsImxhYmVsIiwxMSksbSgzKSxjKDQsImlucHV0IiwxMiksUygibmdNb2RlbENoYW5nZSIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KDIpO3JldHVybiBUKHIuaGlkZU1hdGNoaW5nTGluZXNDaGFuZ2VkKGEpKX0pLHMoKSx1KDUsInNwYW4iLDEzKSxzKCkoKSgpfWlmKHQmMil7bGV0IGU9digyKTtmKCJuZ0NsYXNzIixlLnRvb2xiYXJDbGFzcykoIm5nU3R5bGUiLGUudG9vbGJhclN0eWxlKSxsKDMpLEUoIiBPbmx5IFNob3cgTGluZXMgd2l0aCBEaWZmZXJlbmNlcyAoIixlLmRpZmZzQ291bnQsIikgIiksbCgpLGYoIm5nTW9kZWwiLGUuaGlkZU1hdGNoaW5nTGluZXMpfX1mdW5jdGlvbiBvUCh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYnV0dG9uIiwxNyksUygiY2xpY2siLGZ1bmN0aW9uKCl7bGV0IGE9eihlKS4kaW1wbGljaXQscj12KDMpO3JldHVybiBUKHIuc2V0RGlmZlRhYmxlRm9ybWF0KGEudmFsdWUpKX0pLG0oMSkscygpfWlmKHQmMil7bGV0IGU9bi4kaW1wbGljaXQsaT12KDMpO2YoIm5nQ2xhc3MiLHoxKDUsblAsaS5mb3JtYXQ9PT1lLnZhbHVlLCEhZS5kaXNhYmxlZCkpKCJuYW1lIixlLm5hbWUpKCJpZCIsZS5pZCkoImRpc2FibGVkIiwhIWUuZGlzYWJsZWQpLGwoKSxFKCIgIixlLmxhYmVsLCIgIil9fWZ1bmN0aW9uIGNQKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDE0KSgxLCJkaXYiLDE1KSxSKDIsb1AsMiw4LCJidXR0b24iLDE2KSxzKCkoKSksdCYyKXtsZXQgZT12KDIpO2woMiksZigibmdGb3JPZiIsZS5mb3JtYXRPcHRpb25zKX19ZnVuY3Rpb24gc1AodCxuKXtpZih0JjEmJihjKDAsInRkIiwyNCksdSgxLCJzcGFuIiwyNSksYigyLCJmb3JtYXRMaW5lIikscygpKSx0JjIpe2xldCBlPXYoKS4kaW1wbGljaXQ7ZigibmdDbGFzcyIsejEoNCxmYywoZS5sZWZ0Q29udGVudD09bnVsbD9udWxsOmUubGVmdENvbnRlbnQucHJlZml4KT09PSItIiwhKGUubGVmdENvbnRlbnQhPW51bGwmJmUubGVmdENvbnRlbnQubGluZUNvbnRlbnQpKSksbCgpLGYoImlubmVySFRNTCIsQygyLDIsZS5sZWZ0Q29udGVudD09bnVsbD9udWxsOmUubGVmdENvbnRlbnQubGluZUNvbnRlbnQpLHR0KX19ZnVuY3Rpb24gbFAodCxuKXtpZih0JjEmJih1KDAsInNwYW4iLDI3KSxiKDEsImZvcm1hdExpbmUiKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtmKCJpbm5lckhUTUwiLEMoMSwyLGUuY29udGVudCksdHQpKCJuZ0NsYXNzIixidCg0LGdjLGUuaXNEaWZmKSl9fWZ1bmN0aW9uIGRQKHQsbil7aWYodCYxJiYoYygwLCJ0ZCIsMjQpLFIoMSxsUCwyLDYsInNwYW4iLDI2KSxzKCkpLHQmMil7bGV0IGU9digpLiRpbXBsaWNpdCxpPXYoMyk7ZigibmdDbGFzcyIsejEoMyxmYywoZS5sZWZ0Q29udGVudD09bnVsbD9udWxsOmUubGVmdENvbnRlbnQucHJlZml4KT09PSItIiwhKGUubGVmdENvbnRlbnQhPW51bGwmJmUubGVmdENvbnRlbnQubGluZUNvbnRlbnQpKSksbCgpLGYoIm5nRm9yT2YiLGUubGVmdENvbnRlbnQ9PW51bGw/bnVsbDplLmxlZnRDb250ZW50LmxpbmVEaWZmcykoIm5nRm9yVHJhY2tCeSIsaS50cmFja0RpZmZzKX19ZnVuY3Rpb24gbVAodCxuKXtpZih0JjEmJihjKDAsInRyIikoMSwidGQiLDIxKSxtKDIpLHMoKSxjKDMsInRkIiwyMikoNCwic3BhbiIpLG0oNSkscygpKCksUig2LHNQLDMsNywidGQiLDIzKSg3LGRQLDIsNiwidGQiLDIzKSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgpLGYoIm5nQ2xhc3MiLHoxKDYsZmMsKGUubGVmdENvbnRlbnQ9PW51bGw/bnVsbDplLmxlZnRDb250ZW50LnByZWZpeCk9PT0iLSIsIShlLmxlZnRDb250ZW50IT1udWxsJiZlLmxlZnRDb250ZW50LmxpbmVDb250ZW50KSkpLGwoKSxFKCIgIiwoZS5sZWZ0Q29udGVudD09bnVsbD9udWxsOmUubGVmdENvbnRlbnQubGluZU51bWJlcikhPT0tMT9lLmxlZnRDb250ZW50PT1udWxsP251bGw6ZS5sZWZ0Q29udGVudC5saW5lTnVtYmVyOiIgIiwiICIpLGwoKSxmKCJuZ0NsYXNzIix6MSg5LGZjLChlLmxlZnRDb250ZW50PT1udWxsP251bGw6ZS5sZWZ0Q29udGVudC5wcmVmaXgpPT09Ii0iLCEoZS5sZWZ0Q29udGVudCE9bnVsbCYmZS5sZWZ0Q29udGVudC5saW5lQ29udGVudCkpKSxsKDIpLEEoKGUubGVmdENvbnRlbnQ9PW51bGw/bnVsbDplLmxlZnRDb250ZW50LnByZWZpeCl8fCIgIiksbCgpLGYoIm5nSWYiLCFlLmhhc0RpZmZzKSxsKCksZigibmdJZiIsZS5oYXNEaWZmcyl9fWZ1bmN0aW9uIGhQKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDE4KSgxLCJ0YWJsZSIsMTkpKDIsInRib2R5IiksUigzLG1QLDgsMTIsInRyIiwyMCkscygpKCkoKSksdCYyKXtsZXQgZT12KDIpO2woMyksZigibmdGb3JPZiIsZS5maWx0ZXJlZFRhYmxlUm93cykoIm5nRm9yVHJhY2tCeSIsZS50cmFja1RhYmxlUm93cyl9fWZ1bmN0aW9uIHBQKHQsbil7aWYodCYxJiYoYygwLCJ0ZCIsMjQpLHUoMSwic3BhbiIsMjUpLGIoMiwiZm9ybWF0TGluZSIpLHMoKSksdCYyKXtsZXQgZT12KCkuJGltcGxpY2l0O2YoIm5nQ2xhc3MiLHoxKDQsdWMsKGUucmlnaHRDb250ZW50PT1udWxsP251bGw6ZS5yaWdodENvbnRlbnQucHJlZml4KT09PSIrIiwhKGUucmlnaHRDb250ZW50IT1udWxsJiZlLnJpZ2h0Q29udGVudC5saW5lQ29udGVudCkpKSxsKCksZigiaW5uZXJIVE1MIixDKDIsMixlLnJpZ2h0Q29udGVudD09bnVsbD9udWxsOmUucmlnaHRDb250ZW50LmxpbmVDb250ZW50KSx0dCl9fWZ1bmN0aW9uIGZQKHQsbil7aWYodCYxJiYodSgwLCJzcGFuIiwyNyksYigxLCJmb3JtYXRMaW5lIikpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7ZigiaW5uZXJIVE1MIixDKDEsMixlLmNvbnRlbnQpLHR0KSgibmdDbGFzcyIsYnQoNCxnYyxlLmlzRGlmZikpfX1mdW5jdGlvbiB1UCh0LG4pe2lmKHQmMSYmKGMoMCwidGQiLDI0KSxSKDEsZlAsMiw2LCJzcGFuIiwyNikscygpKSx0JjIpe2xldCBlPXYoKS4kaW1wbGljaXQsaT12KDMpO2YoIm5nQ2xhc3MiLHoxKDMsdWMsKGUucmlnaHRDb250ZW50PT1udWxsP251bGw6ZS5yaWdodENvbnRlbnQucHJlZml4KT09PSIrIiwhKGUucmlnaHRDb250ZW50IT1udWxsJiZlLnJpZ2h0Q29udGVudC5saW5lQ29udGVudCkpKSxsKCksZigibmdGb3JPZiIsZS5yaWdodENvbnRlbnQ9PW51bGw/bnVsbDplLnJpZ2h0Q29udGVudC5saW5lRGlmZnMpKCJuZ0ZvclRyYWNrQnkiLGkudHJhY2tEaWZmcyl9fWZ1bmN0aW9uIGdQKHQsbil7aWYodCYxJiYoYygwLCJ0ciIpKDEsInRkIiwyMSksbSgyKSxzKCksYygzLCJ0ZCIsMjIpKDQsInNwYW4iKSxtKDUpLHMoKSgpLFIoNixwUCwzLDcsInRkIiwyMykoNyx1UCwyLDYsInRkIiwyMykscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxmKCJuZ0NsYXNzIix6MSg2LHVjLChlLnJpZ2h0Q29udGVudD09bnVsbD9udWxsOmUucmlnaHRDb250ZW50LnByZWZpeCk9PT0iKyIsIShlLnJpZ2h0Q29udGVudCE9bnVsbCYmZS5yaWdodENvbnRlbnQubGluZUNvbnRlbnQpKSksbCgpLEUoIiAiLChlLnJpZ2h0Q29udGVudD09bnVsbD9udWxsOmUucmlnaHRDb250ZW50LmxpbmVOdW1iZXIpIT09LTE/ZS5yaWdodENvbnRlbnQ9PW51bGw/bnVsbDplLnJpZ2h0Q29udGVudC5saW5lTnVtYmVyOiIgIiwiICIpLGwoKSxmKCJuZ0NsYXNzIix6MSg5LHVjLChlLnJpZ2h0Q29udGVudD09bnVsbD9udWxsOmUucmlnaHRDb250ZW50LnByZWZpeCk9PT0iKyIsIShlLnJpZ2h0Q29udGVudCE9bnVsbCYmZS5yaWdodENvbnRlbnQubGluZUNvbnRlbnQpKSksbCgyKSxBKChlLnJpZ2h0Q29udGVudD09bnVsbD9udWxsOmUucmlnaHRDb250ZW50LnByZWZpeCl8fCIgIiksbCgpLGYoIm5nSWYiLCFlLmhhc0RpZmZzKSxsKCksZigibmdJZiIsZS5oYXNEaWZmcyl9fWZ1bmN0aW9uIHZQKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDI4KSgxLCJ0YWJsZSIsMTkpKDIsInRib2R5IiksUigzLGdQLDgsMTIsInRyIiwyMCkscygpKCkoKSksdCYyKXtsZXQgZT12KDIpO2woMyksZigibmdGb3JPZiIsZS5maWx0ZXJlZFRhYmxlUm93cykoIm5nRm9yVHJhY2tCeSIsZS50cmFja1RhYmxlUm93cyl9fWZ1bmN0aW9uIF9QKHQsbil7aWYodCYxJiYoYygwLCJ0ZCIsMjQpLHUoMSwic3BhbiIsMjUpLGIoMiwiZm9ybWF0TGluZSIpLHMoKSksdCYyKXtsZXQgZT12KCkuJGltcGxpY2l0O2YoIm5nQ2xhc3MiLHoxKDQsdmMsKGUubGVmdENvbnRlbnQ9PW51bGw/bnVsbDplLmxlZnRDb250ZW50LnByZWZpeCk9PT0iLSIsKGUucmlnaHRDb250ZW50PT1udWxsP251bGw6ZS5yaWdodENvbnRlbnQucHJlZml4KT09PSIrIikpLGwoKSxmKCJpbm5lckhUTUwiLEMoMiwyLGUubGVmdENvbnRlbnQ9PW51bGw/bnVsbDplLmxlZnRDb250ZW50LmxpbmVDb250ZW50KSx0dCl9fWZ1bmN0aW9uIGJQKHQsbil7aWYodCYxJiYodSgwLCJzcGFuIiwyNyksYigxLCJmb3JtYXRMaW5lIikpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7ZigiaW5uZXJIVE1MIixDKDEsMixlLmNvbnRlbnQpLHR0KSgibmdDbGFzcyIsYnQoNCxnYyxlLmlzRGlmZikpfX1mdW5jdGlvbiBDUCh0LG4pe2lmKHQmMSYmKGMoMCwidGQiLDI0KSxSKDEsYlAsMiw2LCJzcGFuIiwyNikscygpKSx0JjIpe2xldCBlPXYoKS4kaW1wbGljaXQsaT12KDMpO2YoIm5nQ2xhc3MiLHoxKDMsdmMsKGUubGVmdENvbnRlbnQ9PW51bGw/bnVsbDplLmxlZnRDb250ZW50LnByZWZpeCk9PT0iLSIsKGUucmlnaHRDb250ZW50PT1udWxsP251bGw6ZS5yaWdodENvbnRlbnQucHJlZml4KT09PSIrIikpLGwoKSxmKCJuZ0Zvck9mIixlLmxlZnRDb250ZW50PT1udWxsP251bGw6ZS5sZWZ0Q29udGVudC5saW5lRGlmZnMpKCJuZ0ZvclRyYWNrQnkiLGkudHJhY2tEaWZmcyl9fWZ1bmN0aW9uIHlQKHQsbil7aWYodCYxJiYodSgwLCJzcGFuIiwyNyksYigxLCJmb3JtYXRMaW5lIikpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7ZigiaW5uZXJIVE1MIixDKDEsMixlLmNvbnRlbnQpLHR0KSgibmdDbGFzcyIsYnQoNCxnYyxlLmlzRGlmZikpfX1mdW5jdGlvbiB4UCh0LG4pe2lmKHQmMSYmKGMoMCwidGQiLDI0KSxSKDEseVAsMiw2LCJzcGFuIiwyNikscygpKSx0JjIpe2xldCBlPXYoKS4kaW1wbGljaXQsaT12KDMpO2YoIm5nQ2xhc3MiLHoxKDMsdmMsKGUubGVmdENvbnRlbnQ9PW51bGw/bnVsbDplLmxlZnRDb250ZW50LnByZWZpeCk9PT0iLSIsKGUucmlnaHRDb250ZW50PT1udWxsP251bGw6ZS5yaWdodENvbnRlbnQucHJlZml4KT09PSIrIikpLGwoKSxmKCJuZ0Zvck9mIixlLnJpZ2h0Q29udGVudD09bnVsbD9udWxsOmUucmlnaHRDb250ZW50LmxpbmVEaWZmcykoIm5nRm9yVHJhY2tCeSIsaS50cmFja0RpZmZzKX19ZnVuY3Rpb24gTVAodCxuKXtpZih0JjEmJihjKDAsInRyIikoMSwidGQiLDMwKSxtKDIpLHMoKSxjKDMsInRkIiwzMSksbSg0KSxzKCksYyg1LCJ0ZCIsMjIpKDYsInNwYW4iKSxtKDcpLHMoKSgpLFIoOCxfUCwzLDcsInRkIiwyMykoOSxDUCwyLDYsInRkIiwyMykoMTAseFAsMiw2LCJ0ZCIsMjMpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKDIpLEEoZS5sZWZ0Q29udGVudD09bnVsbD9udWxsOmUubGVmdENvbnRlbnQubGluZU51bWJlciksbCgyKSxBKGUucmlnaHRDb250ZW50PT1udWxsP251bGw6ZS5yaWdodENvbnRlbnQubGluZU51bWJlciksbCgpLGYoIm5nQ2xhc3MiLHoxKDcsdmMsKGUubGVmdENvbnRlbnQ9PW51bGw/bnVsbDplLmxlZnRDb250ZW50LnByZWZpeCk9PT0iLSIsKGUucmlnaHRDb250ZW50PT1udWxsP251bGw6ZS5yaWdodENvbnRlbnQucHJlZml4KT09PSIrIikpLGwoMiksQSgoZS5sZWZ0Q29udGVudD09bnVsbD9udWxsOmUubGVmdENvbnRlbnQucHJlZml4KXx8KGUucmlnaHRDb250ZW50PT1udWxsP251bGw6ZS5yaWdodENvbnRlbnQucHJlZml4KXx8IiAiKSxsKCksZigibmdJZiIsIWUuaGFzRGlmZnMpLGwoKSxmKCJuZ0lmIixlLmhhc0RpZmZzJiZlLmxlZnRDb250ZW50JiYoZS5sZWZ0Q29udGVudD09bnVsbD9udWxsOmUubGVmdENvbnRlbnQubGluZURpZmZzLmxlbmd0aCkhPT0wKSxsKCksZigibmdJZiIsZS5oYXNEaWZmcyYmZS5yaWdodENvbnRlbnQmJihlLnJpZ2h0Q29udGVudD09bnVsbD9udWxsOmUucmlnaHRDb250ZW50LmxpbmVEaWZmcy5sZW5ndGgpIT09MCl9fWZ1bmN0aW9uIHdQKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDI5KSgxLCJ0YWJsZSIsMTkpKDIsInRib2R5IiksUigzLE1QLDExLDEwLCJ0ciIsMjApLHMoKSgpKCkpLHQmMil7bGV0IGU9digyKTtsKDMpLGYoIm5nRm9yT2YiLGUuZmlsdGVyZWRUYWJsZVJvd3NMaW5lQnlMaW5lKSgibmdGb3JUcmFja0J5IixlLnRyYWNrVGFibGVSb3dzKX19ZnVuY3Rpb24gU1AodCxuKXtpZih0JjEmJihjKDAsImRpdiIsMiksUigxLHJQLDYsNCwiZGl2IiwzKSgyLGNQLDMsMSwiZGl2Iiw0KSxjKDMsImRpdiIsNSksUig0LGhQLDQsMiwiZGl2Iiw2KSg1LHZQLDQsMiwiZGl2Iiw3KSg2LHdQLDQsMiwiZGl2Iiw4KSxzKCkoKSksdCYyKXtsZXQgZT12KCk7ZigibmdDbGFzcyIsZS5vdXRlckNvbnRhaW5lckNsYXNzKSgibmdTdHlsZSIsZS5vdXRlckNvbnRhaW5lclN0eWxlKSxsKCksZigibmdJZiIsZS5zaG93VG9vbGJhciksbCgpLGYoIm5nSWYiLGUuc2hvd1Rvb2xiYXImJmUuc2hvd0J0blRvb2xiYXIpLGwoKSxmKCJuZ0NsYXNzIixlLmNvbXBhcmVSb3dzQ2xhc3MpKCJuZ1N0eWxlIixlLmNvbXBhcmVSb3dzU3R5bGUpLGwoKSxmKCJuZ0lmIixlLmZvcm1hdD09PSJTaWRlQnlTaWRlIiksbCgpLGYoIm5nSWYiLGUuZm9ybWF0PT09IlNpZGVCeVNpZGUiKSxsKCksZigibmdJZiIsZS5mb3JtYXQ9PT0iTGluZUJ5TGluZSIpfX12YXIgcm4sblAsZmMsZ2MsdWMsdmMsdTUsa1AsT2cselAsVFAsTmcsX2MsYmM9eCgoKT0+e2soKTtrKCk7cm49ZHIoVmcoKSwxKTtEMigpO0QyKCk7YTEoKTthMSgpO1dlKCk7V2UoKTtuUD0odCxuKT0+KHthY3RpdmU6dCxkaXNhYmxlZDpufSksZmM9KHQsbik9Pih7ImRlbGV0ZS1yb3ciOnQsImVtcHR5LXJvdyI6bn0pLGdjPXQ9Pih7aGlnaGxpZ2h0OnR9KSx1Yz0odCxuKT0+KHsiaW5zZXJ0LXJvdyI6dCwiZW1wdHktcm93IjpufSksdmM9KHQsbik9Pih7ImRlbGV0ZS1yb3ciOnQsImluc2VydC1yb3ciOm59KTt1NT10PT50PT1udWxsfHwhKE9iamVjdC5rZXlzKHQpfHx0KS5sZW5ndGh8fChPYmplY3Qua2V5cyh0KXx8dCkubGVuZ3RoPT09MCxrUD0oKCk9PntjbGFzcyB0e2RpZmZQYXJzZXI7Y29uc3RydWN0b3IoKXt0aGlzLmluaXRQYXJzZXIoKX1pbml0UGFyc2VyKCl7dGhpcy5kaWZmUGFyc2VyPW5ldyBybi5kaWZmX21hdGNoX3BhdGNofWdldERpZmZzQnlMaW5lcyhlLGkpe3JldHVybiBuZXcgUHJvbWlzZSgoYSxyKT0+e2xldCBvPXRoaXMuZGlmZlBhcnNlci5kaWZmX2xpbmVzVG9DaGFyc18oZSxpKSxkPW8uY2hhcnMxLHA9by5jaGFyczIsZz1vLmxpbmVBcnJheSxfPXRoaXMuZGlmZlBhcnNlci5kaWZmX21haW4oZCxwLCEwKTt0aGlzLmRpZmZQYXJzZXIuZGlmZl9jaGFyc1RvTGluZXNfKF8sZyk7bGV0IHk9dGhpcy5mb3JtYXRPdXRwdXQoXyk7eXx8cigiRXJyb3IiKSxhKHkpfSl9Zm9ybWF0T3V0cHV0KGUpe2xldCBpPTEsYT0xO3JldHVybiBlLnJlZHVjZSgocixvKT0+e3J8fChyPVtdKTtsZXQgZD1vWzBdLHA9b1sxXSxnPW51bGwsXz1udWxsLHk9bnVsbCxJPW51bGwsUD1udWxsO3N3aXRjaChkKXtjYXNlIHJuLkRJRkZfRVFVQUw6cC5zcGxpdChgCmApLmZpbHRlcigoVixPLFUpPT5PPT09VS5sZW5ndGgtMT8hdTUoVik6ITApLmZvckVhY2goVj0+e3k9e2xpbmVOdW1iZXI6aSxsaW5lQ29udGVudDpWLGxpbmVEaWZmczpbXSxwcmVmaXg6IiJ9LEk9e2xpbmVOdW1iZXI6YSxsaW5lQ29udGVudDpWLGxpbmVEaWZmczpbXSxwcmVmaXg6IiJ9LFA9e2xlZnRDb250ZW50OnkscmlnaHRDb250ZW50OkksYmVsb25nVG86ImJvdGgiLGhhc0RpZmZzOiExLG51bURpZmZzOjB9LHIucHVzaChQKSxhPWErMSxpPWkrMX0pO2JyZWFrO2Nhc2Ugcm4uRElGRl9ERUxFVEU6cC5zcGxpdChgCmApLmZpbHRlcigoVixPLFUpPT5PPT09VS5sZW5ndGgtMT8hdTUoVik6ITApLmZvckVhY2goVj0+e189ci5maW5kKE89PiFPLmxlZnRDb250ZW50JiZPLnJpZ2h0Q29udGVudCYmTy5yaWdodENvbnRlbnQubGluZU51bWJlcj09PWkmJk8ucmlnaHRDb250ZW50LnByZWZpeCE9PSIiKSx5PXtsaW5lTnVtYmVyOmksbGluZUNvbnRlbnQ6VixsaW5lRGlmZnM6W3tjb250ZW50OlYsaXNEaWZmOiEwfV0scHJlZml4OiItIn0sXz8oXy5sZWZ0Q29udGVudD15LF8ubGVmdENvbnRlbnQubGluZURpZmZzPXRoaXMuZ2V0RGlmZlBhcnRzKF8ubGVmdENvbnRlbnQubGluZUNvbnRlbnQsXy5yaWdodENvbnRlbnQubGluZUNvbnRlbnQpLF8ucmlnaHRDb250ZW50LmxpbmVEaWZmcz10aGlzLmdldERpZmZQYXJ0cyhfLnJpZ2h0Q29udGVudC5saW5lQ29udGVudCxfLmxlZnRDb250ZW50LmxpbmVDb250ZW50KSxfLmJlbG9uZ1RvPSJib3RoIixfLm51bURpZmZzPXRoaXMuY291bnREaWZmcyhfKSk6ci5wdXNoKHtsZWZ0Q29udGVudDp5LHJpZ2h0Q29udGVudDpudWxsLGhhc0RpZmZzOiEwLGJlbG9uZ1RvOiJsZWZ0IixudW1EaWZmczoxfSksaT1pKzF9KTticmVhaztjYXNlIHJuLkRJRkZfSU5TRVJUOnAuc3BsaXQoYApgKS5maWx0ZXIoKFYsTyxVKT0+Tz09PVUubGVuZ3RoLTE/IXU1KFYpOiEwKS5mb3JFYWNoKFY9PntnPXIuZmluZChPPT5PLmxlZnRDb250ZW50JiYhTy5yaWdodENvbnRlbnQmJk8ubGVmdENvbnRlbnQubGluZU51bWJlcj09PWEmJk8ubGVmdENvbnRlbnQucHJlZml4IT09IiIpLEk9e2xpbmVOdW1iZXI6YSxsaW5lQ29udGVudDpWLGxpbmVEaWZmczpbe2NvbnRlbnQ6Vixpc0RpZmY6ITB9XSxwcmVmaXg6IisifSxnPyhnLnJpZ2h0Q29udGVudD1JLGcubGVmdENvbnRlbnQubGluZURpZmZzPXRoaXMuZ2V0RGlmZlBhcnRzKGcubGVmdENvbnRlbnQubGluZUNvbnRlbnQsZy5yaWdodENvbnRlbnQubGluZUNvbnRlbnQpLGcucmlnaHRDb250ZW50LmxpbmVEaWZmcz10aGlzLmdldERpZmZQYXJ0cyhnLnJpZ2h0Q29udGVudC5saW5lQ29udGVudCxnLmxlZnRDb250ZW50LmxpbmVDb250ZW50KSxnLmJlbG9uZ1RvPSJib3RoIixnLm51bURpZmZzPXRoaXMuY291bnREaWZmcyhnKSk6ci5wdXNoKHtsZWZ0Q29udGVudDpudWxsLHJpZ2h0Q29udGVudDpJLGhhc0RpZmZzOiEwLGJlbG9uZ1RvOiJyaWdodCIsbnVtRGlmZnM6MX0pLGE9YSsxfSk7YnJlYWt9cmV0dXJuIHJ9LFtdKX1jb3VudERpZmZzKGUpe2xldCBpPTA7cmV0dXJuIGUubGVmdENvbnRlbnQmJihpKz1lLmxlZnRDb250ZW50LmxpbmVEaWZmcy5maWx0ZXIoYT0+YS5pc0RpZmYpLmxlbmd0aCksZS5sZWZ0Q29udGVudCYmKGkrPWUucmlnaHRDb250ZW50LmxpbmVEaWZmcy5maWx0ZXIoYT0+YS5pc0RpZmYpLmxlbmd0aCksaX1nZXREaWZmUGFydHMoZSxpKXtsZXQgYT1bXSxyPTAsbz0wLGQ9IiIscD0iIjtmb3IoO3I8ZS5sZW5ndGg7KWVbcl09PT1pW29dJiZvPGkubGVuZ3RoPyhwIT09IiImJihhLnB1c2goe2NvbnRlbnQ6cCxpc0RpZmY6ITB9KSxwPSIiKSxkKz1lW3JdKTooZCE9PSIiJiYoYS5wdXNoKHtjb250ZW50OmQsaXNEaWZmOiExfSksZD0iIikscCs9ZVtyXSkscisrLG8rKztyZXR1cm4gcCE9PSIiP2EucHVzaCh7Y29udGVudDpwLGlzRGlmZjohMH0pOmQhPT0iIiYmYS5wdXNoKHtjb250ZW50OmQsaXNEaWZmOiExfSksYX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKSxPZz0oKCk9PntjbGFzcyB0e19lbDtpZDtlbGVtZW50O2NvbnN0cnVjdG9yKGUpe3RoaXMuX2VsPWUsdGhpcy5lbGVtZW50PWUubmF0aXZlRWxlbWVudH1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCkoaXQoYWUpKX07c3RhdGljIFx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsInRkQ29udGFpbmVyIiwiIl1dLGlucHV0czp7aWQ6ImlkIn0sc3RhbmRhbG9uZTohMX0pfXJldHVybiB0fSkoKSx6UD0oKCk9PntjbGFzcyB0e2FjdGl2ZT0hMTtjb25zdHJ1Y3Rvcigpe31uZ09uSW5pdCgpe31zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJ0ZC1sb2FkZXItc3Bpbm5lciJdXSxpbnB1dHM6e2FjdGl2ZToiYWN0aXZlIn0sc3RhbmRhbG9uZTohMSxkZWNsczoxLHZhcnM6MSxjb25zdHM6W1siY2xhc3MiLCJ0ZC1sb2FkaW5nLXJvbGxlciIsNCwibmdJZiJdLFsxLCJ0ZC1sb2FkaW5nLXJvbGxlciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmUigwLGFQLDksMCwiZGl2IiwwKSxpJjImJmYoIm5nSWYiLGEuYWN0aXZlKX0sZGVwZW5kZW5jaWVzOlskaV0sc3R5bGVzOlsnLnRkLWxvYWRpbmctcm9sbGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDo2NHB4O2hlaWdodDo2NHB4fS50ZC1sb2FkaW5nLXJvbGxlcltfbmdjb250ZW50LSVDT01QJV0gICBkaXZbX25nY29udGVudC0lQ09NUCVde2FuaW1hdGlvbjpfbmdjb250ZW50LSVDT01QJV9sZHMtcm9sbGVyIDEuMnMgY3ViaWMtYmV6aWVyKC41LDAsLjUsMSkgaW5maW5pdGU7dHJhbnNmb3JtLW9yaWdpbjozMnB4IDMycHh9LnRkLWxvYWRpbmctcm9sbGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGRpdltfbmdjb250ZW50LSVDT01QJV06YWZ0ZXJ7Y29udGVudDoiICI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDo2cHg7aGVpZ2h0OjZweDtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOiMwMDA7bWFyZ2luOi0zcHggMCAwIC0zcHh9LnRkLWxvYWRpbmctcm9sbGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGRpdltfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKDEpe2FuaW1hdGlvbi1kZWxheTotMzZtc30udGQtbG9hZGluZy1yb2xsZXJbX25nY29udGVudC0lQ09NUCVdICAgZGl2W19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQoMSk6YWZ0ZXJ7dG9wOjUwcHg7bGVmdDo1MHB4fS50ZC1sb2FkaW5nLXJvbGxlcltfbmdjb250ZW50LSVDT01QJV0gICBkaXZbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZCgyKXthbmltYXRpb24tZGVsYXk6LTcybXN9LnRkLWxvYWRpbmctcm9sbGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGRpdltfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKDIpOmFmdGVye3RvcDo1NHB4O2xlZnQ6NDVweH0udGQtbG9hZGluZy1yb2xsZXJbX25nY29udGVudC0lQ09NUCVdICAgZGl2W19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQoMyl7YW5pbWF0aW9uLWRlbGF5Oi0uMTA4c30udGQtbG9hZGluZy1yb2xsZXJbX25nY29udGVudC0lQ09NUCVdICAgZGl2W19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQoMyk6YWZ0ZXJ7dG9wOjU3cHg7bGVmdDozOXB4fS50ZC1sb2FkaW5nLXJvbGxlcltfbmdjb250ZW50LSVDT01QJV0gICBkaXZbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZCg0KXthbmltYXRpb24tZGVsYXk6LS4xNDRzfS50ZC1sb2FkaW5nLXJvbGxlcltfbmdjb250ZW50LSVDT01QJV0gICBkaXZbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZCg0KTphZnRlcnt0b3A6NThweDtsZWZ0OjMycHh9LnRkLWxvYWRpbmctcm9sbGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGRpdltfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKDUpe2FuaW1hdGlvbi1kZWxheTotLjE4c30udGQtbG9hZGluZy1yb2xsZXJbX25nY29udGVudC0lQ09NUCVdICAgZGl2W19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQoNSk6YWZ0ZXJ7dG9wOjU3cHg7bGVmdDoyNXB4fS50ZC1sb2FkaW5nLXJvbGxlcltfbmdjb250ZW50LSVDT01QJV0gICBkaXZbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZCg2KXthbmltYXRpb24tZGVsYXk6LS4yMTZzfS50ZC1sb2FkaW5nLXJvbGxlcltfbmdjb250ZW50LSVDT01QJV0gICBkaXZbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZCg2KTphZnRlcnt0b3A6NTRweDtsZWZ0OjE5cHh9LnRkLWxvYWRpbmctcm9sbGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGRpdltfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKDcpe2FuaW1hdGlvbi1kZWxheTotLjI1MnN9LnRkLWxvYWRpbmctcm9sbGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGRpdltfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKDcpOmFmdGVye3RvcDo1MHB4O2xlZnQ6MTRweH0udGQtbG9hZGluZy1yb2xsZXJbX25nY29udGVudC0lQ09NUCVdICAgZGl2W19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQoOCl7YW5pbWF0aW9uLWRlbGF5Oi0uMjg4c30udGQtbG9hZGluZy1yb2xsZXJbX25nY29udGVudC0lQ09NUCVdICAgZGl2W19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQoOCk6YWZ0ZXJ7dG9wOjQ1cHg7bGVmdDoxMHB4fUBrZXlmcmFtZXMgX25nY29udGVudC0lQ09NUCVfbGRzLXJvbGxlcnswJXt0cmFuc2Zvcm06cm90YXRlKDApfXRve3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19J119KX1yZXR1cm4gdH0pKCksVFA9KCgpPT57Y2xhc3MgdHt0cmFuc2Zvcm0oZSxpKXtyZXR1cm4gZT8oaSYmaS5sZW5ndGg+MCxlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpLnJlcGxhY2UoLyAvZywiJm5ic3A7IikpOiIgIn1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwaXBlPWcwKHtuYW1lOiJmb3JtYXRMaW5lIix0eXBlOnQscHVyZTohMCxzdGFuZGFsb25lOiExfSl9cmV0dXJuIHR9KSgpLE5nPSgoKT0+e2NsYXNzIHR7c2Nyb2xsU2VydmljZTtkaWZmO2NkO19oaWRlTWF0Y2hpbmdMaW5lcz0hMTtjb250YWluZXJzO2Zvcm1hdD0iU2lkZUJ5U2lkZSI7bGVmdD0iIjtyaWdodD0iIjtkaWZmQ29udGVudDtsb2FkaW5nPSExO3Nob3dUb29sYmFyPSEwO3Nob3dCdG5Ub29sYmFyPSEwO2dldCBoaWRlTWF0Y2hpbmdMaW5lcygpe3JldHVybiB0aGlzLl9oaWRlTWF0Y2hpbmdMaW5lc31zZXQgaGlkZU1hdGNoaW5nTGluZXMoZSl7dGhpcy5oaWRlTWF0Y2hpbmdMaW5lc0NoYW5nZWQoZSl9b3V0ZXJDb250YWluZXJDbGFzcztvdXRlckNvbnRhaW5lclN0eWxlO3Rvb2xiYXJDbGFzczt0b29sYmFyU3R5bGU7Y29tcGFyZVJvd3NDbGFzcztjb21wYXJlUm93c1N0eWxlO3N5bmNocm9uaXplU2Nyb2xsaW5nPSEwO2NvbXBhcmVSZXN1bHRzPW5ldyBOO3N1YnNjcmlwdGlvbnM9W107dGFibGVSb3dzPVtdO2ZpbHRlcmVkVGFibGVSb3dzPVtdO3RhYmxlUm93c0xpbmVCeUxpbmU9W107ZmlsdGVyZWRUYWJsZVJvd3NMaW5lQnlMaW5lPVtdO2RpZmZzQ291bnQ9MDtmb3JtYXRPcHRpb25zPVt7aWQ6InNpZGUtYnktc2lkZSIsbmFtZToic2lkZS1ieS1zaWRlIixsYWJlbDoiU2lkZSBieSBTaWRlIix2YWx1ZToiU2lkZUJ5U2lkZSIsaWNvbjoibGEtY29kZSJ9LHtpZDoibGluZS1ieS1saW5lIixuYW1lOiJsaW5lLWJ5LWxpbmUiLGxhYmVsOiJMaW5lIGJ5IExpbmUiLHZhbHVlOiJMaW5lQnlMaW5lIixpY29uOiJsYS1maWxlLXRleHQifV07Y29uc3RydWN0b3IoZSxpLGEpe3RoaXMuc2Nyb2xsU2VydmljZT1lLHRoaXMuZGlmZj1pLHRoaXMuY2Q9YX1uZ09uSW5pdCgpe3RoaXMubG9hZGluZz0hMCx0aGlzLmRpZmZDb250ZW50JiZ0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmRpZmZDb250ZW50LnN1YnNjcmliZShlPT57dGhpcy5sb2FkaW5nPSEwLHRoaXMubGVmdD1lLmxlZnRDb250ZW50LHRoaXMucmlnaHQ9ZS5yaWdodENvbnRlbnQsdGhpcy5yZW5kZXJEaWZmcygpLnRoZW4oKCk9Pnt0aGlzLmNkLmRldGVjdENoYW5nZXMoKSx0aGlzLmxvYWRpbmc9ITF9KS5jYXRjaCgoKT0+dGhpcy5sb2FkaW5nPSExKX0pKSx0aGlzLnJlbmRlckRpZmZzKCkudGhlbigoKT0+dGhpcy5sb2FkaW5nPSExKS5jYXRjaChlPT50aGlzLmxvYWRpbmc9ITEpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuaW5pdFNjcm9sbExpc3RlbmVyKCl9bmdPbkRlc3Ryb3koKXt0aGlzLnN1YnNjcmlwdGlvbnMmJnRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKGU9PmUudW5zdWJzY3JpYmUoKSl9aGlkZU1hdGNoaW5nTGluZXNDaGFuZ2VkKGUpe3RoaXMuX2hpZGVNYXRjaGluZ0xpbmVzPWUsdGhpcy5oaWRlTWF0Y2hpbmdMaW5lcz8odGhpcy5maWx0ZXJlZFRhYmxlUm93cz10aGlzLnRhYmxlUm93cy5maWx0ZXIoaT0+aS5sZWZ0Q29udGVudCYmaS5sZWZ0Q29udGVudC5wcmVmaXg9PT0iLSJ8fGkucmlnaHRDb250ZW50JiZpLnJpZ2h0Q29udGVudC5wcmVmaXg9PT0iKyIpLHRoaXMuZmlsdGVyZWRUYWJsZVJvd3NMaW5lQnlMaW5lPXRoaXMudGFibGVSb3dzTGluZUJ5TGluZS5maWx0ZXIoaT0+aS5sZWZ0Q29udGVudCYmaS5sZWZ0Q29udGVudC5wcmVmaXg9PT0iLSJ8fGkucmlnaHRDb250ZW50JiZpLnJpZ2h0Q29udGVudC5wcmVmaXg9PT0iKyIpKToodGhpcy5maWx0ZXJlZFRhYmxlUm93cz10aGlzLnRhYmxlUm93cyx0aGlzLmZpbHRlcmVkVGFibGVSb3dzTGluZUJ5TGluZT10aGlzLnRhYmxlUm93c0xpbmVCeUxpbmUpfXNldERpZmZUYWJsZUZvcm1hdChlKXt0aGlzLmZvcm1hdD1lfXJlbmRlckRpZmZzKCl7cmV0dXJuIFBlKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7dGhpcy5kaWZmc0NvdW50PTAsdGhpcy50YWJsZVJvd3M9eWllbGQgdGhpcy5kaWZmLmdldERpZmZzQnlMaW5lcyh0aGlzLmxlZnQsdGhpcy5yaWdodCksdGhpcy50YWJsZVJvd3NMaW5lQnlMaW5lPXRoaXMudGFibGVSb3dzLnJlZHVjZSgoZSxpKT0+KGV8fChlPVtdKSxpLmhhc0RpZmZzPyhpLmxlZnRDb250ZW50JiZlLnB1c2goe2xlZnRDb250ZW50OmkubGVmdENvbnRlbnQscmlnaHRDb250ZW50Om51bGwsYmVsb25nVG86aS5iZWxvbmdUbyxoYXNEaWZmczohMCxudW1EaWZmczppLm51bURpZmZzfSksaS5yaWdodENvbnRlbnQmJmUucHVzaCh7bGVmdENvbnRlbnQ6bnVsbCxyaWdodENvbnRlbnQ6aS5yaWdodENvbnRlbnQsYmVsb25nVG86aS5iZWxvbmdUbyxoYXNEaWZmczohMCxudW1EaWZmczppLm51bURpZmZzfSkpOmUucHVzaChpKSxlKSxbXSksdGhpcy5kaWZmc0NvdW50PXRoaXMudGFibGVSb3dzLmZpbHRlcihlPT5lLmhhc0RpZmZzKS5sZW5ndGgsdGhpcy5maWx0ZXJlZFRhYmxlUm93cz10aGlzLnRhYmxlUm93cyx0aGlzLmZpbHRlcmVkVGFibGVSb3dzTGluZUJ5TGluZT10aGlzLnRhYmxlUm93c0xpbmVCeUxpbmUsdGhpcy5lbWl0Q29tcGFyZVJlc3VsdHNFdmVudCgpfWNhdGNoKGUpe3Rocm93IGV9fSl9ZW1pdENvbXBhcmVSZXN1bHRzRXZlbnQoKXtsZXQgZT17aGFzRGlmZjp0aGlzLmRpZmZzQ291bnQ+MCxkaWZmc0NvdW50OnRoaXMuZGlmZnNDb3VudCxyb3dzV2l0aERpZmY6dGhpcy50YWJsZVJvd3MuZmlsdGVyKGk9PmkuaGFzRGlmZnMpLm1hcChpPT4oe2xlZnRMaW5lTnVtYmVyOmkubGVmdENvbnRlbnQ/aS5sZWZ0Q29udGVudC5saW5lTnVtYmVyOm51bGwscmlnaHRMaW5lTnVtYmVyOmkucmlnaHRDb250ZW50P2kucmlnaHRDb250ZW50LmxpbmVOdW1iZXI6bnVsbCxudW1EaWZmczppLm51bURpZmZzfSkpfTt0aGlzLmNvbXBhcmVSZXN1bHRzLm5leHQoZSl9dHJhY2tUYWJsZVJvd3MoZSxpKXtyZXR1cm4gaSYmaS5sZWZ0Q29udGVudD9pLmxlZnRDb250ZW50LmxpbmVDb250ZW50OmkmJmkucmlnaHRDb250ZW50P2kucmlnaHRDb250ZW50LmxpbmVDb250ZW50OnZvaWQgMH10cmFja0RpZmZzKGUsaSl7cmV0dXJuIGkmJmkuY29udGVudD9pLmNvbnRlbnQ6dm9pZCAwfWluaXRTY3JvbGxMaXN0ZW5lcigpe3RoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxlZCgpLnN1YnNjcmliZShlPT57aWYoZSYmdGhpcy5zeW5jaHJvbml6ZVNjcm9sbGluZyl7bGV0IGk9ZS5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudC5pZCxhPXRoaXMuY29udGFpbmVycy5maW5kKHI9PnIuaWQhPT1pKTthJiZhLmVsZW1lbnQuc2Nyb2xsVG8oe3RvcDplLm1lYXN1cmVTY3JvbGxPZmZzZXQoInRvcCIpLGxlZnQ6ZS5tZWFzdXJlU2Nyb2xsT2Zmc2V0KCJsZWZ0Iil9KX19KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpKGl0KERuKSxpdChrUCksaXQoRWUpKX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbInRkLW5neC10ZXh0LWRpZmYiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiZ0ZShPZyw1KSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5jb250YWluZXJzPXIpfX0saW5wdXRzOntmb3JtYXQ6ImZvcm1hdCIsbGVmdDoibGVmdCIscmlnaHQ6InJpZ2h0IixkaWZmQ29udGVudDoiZGlmZkNvbnRlbnQiLGxvYWRpbmc6ImxvYWRpbmciLHNob3dUb29sYmFyOiJzaG93VG9vbGJhciIsc2hvd0J0blRvb2xiYXI6InNob3dCdG5Ub29sYmFyIixoaWRlTWF0Y2hpbmdMaW5lczoiaGlkZU1hdGNoaW5nTGluZXMiLG91dGVyQ29udGFpbmVyQ2xhc3M6Im91dGVyQ29udGFpbmVyQ2xhc3MiLG91dGVyQ29udGFpbmVyU3R5bGU6Im91dGVyQ29udGFpbmVyU3R5bGUiLHRvb2xiYXJDbGFzczoidG9vbGJhckNsYXNzIix0b29sYmFyU3R5bGU6InRvb2xiYXJTdHlsZSIsY29tcGFyZVJvd3NDbGFzczoiY29tcGFyZVJvd3NDbGFzcyIsY29tcGFyZVJvd3NTdHlsZToiY29tcGFyZVJvd3NTdHlsZSIsc3luY2hyb25pemVTY3JvbGxpbmc6InN5bmNocm9uaXplU2Nyb2xsaW5nIn0sb3V0cHV0czp7Y29tcGFyZVJlc3VsdHM6ImNvbXBhcmVSZXN1bHRzIn0sc3RhbmRhbG9uZTohMSxkZWNsczoyLHZhcnM6Mixjb25zdHM6W1szLCJhY3RpdmUiXSxbImNsYXNzIiwidGQtd3JhcHBlciIsMywibmdDbGFzcyIsIm5nU3R5bGUiLDQsIm5nSWYiXSxbMSwidGQtd3JhcHBlciIsMywibmdDbGFzcyIsIm5nU3R5bGUiXSxbMywibmdDbGFzcyIsIm5nU3R5bGUiLDQsIm5nSWYiXSxbImNsYXNzIiwidGQtdG9vbGJhci1zZWxlY3QtZm9ybWF0Iiw0LCJuZ0lmIl0sWzEsInRkLXRhYmxlLXdyYXBwZXIiLDMsIm5nQ2xhc3MiLCJuZ1N0eWxlIl0sWyJjbGFzcyIsInRkLXRhYmxlLWNvbnRhaW5lciBzaWRlLWJ5LXNpZGUiLCJpZCIsInRkLWxlZnQtY29tcGFyZS1jb250YWluZXIiLCJ0ZENvbnRhaW5lciIsIiIsImNka1Njcm9sbGFibGUiLCIiLDQsIm5nSWYiXSxbImNsYXNzIiwidGQtdGFibGUtY29udGFpbmVyIHNpZGUtYnktc2lkZSIsImlkIiwidGQtcmlnaHQtY29tcGFyZS1jb250YWluZXIiLCJ0ZENvbnRhaW5lciIsIiIsImNka1Njcm9sbGFibGUiLCIiLDQsIm5nSWYiXSxbImNsYXNzIiwidGQtdGFibGUtY29udGFpbmVyIGxpbmUtYnktbGluZSIsNCwibmdJZiJdLFszLCJuZ0NsYXNzIiwibmdTdHlsZSJdLFsxLCJ0ZC10b29sYmFyLXNob3ctZGlmZiJdLFsxLCJ0ZC1jaGVja2JveC1jb250YWluZXIiXSxbInR5cGUiLCJjaGVja2JveCIsImlkIiwic2hvd0RpZmZzIiwzLCJuZ01vZGVsQ2hhbmdlIiwibmdNb2RlbCJdLFsxLCJjaGVja21hcmsiXSxbMSwidGQtdG9vbGJhci1zZWxlY3QtZm9ybWF0Il0sWyJkYXRhLXRvZ2dsZSIsImJ1dHRvbnMiLDEsInRkLWJ0bi1ncm91cCIsInRkLWJ0bi1ncm91cC10b2dnbGUiXSxbMywibmdDbGFzcyIsIm5hbWUiLCJpZCIsImRpc2FibGVkIiwiY2xpY2siLDQsIm5nRm9yIiwibmdGb3JPZiJdLFszLCJjbGljayIsIm5nQ2xhc3MiLCJuYW1lIiwiaWQiLCJkaXNhYmxlZCJdLFsiaWQiLCJ0ZC1sZWZ0LWNvbXBhcmUtY29udGFpbmVyIiwidGRDb250YWluZXIiLCIiLCJjZGtTY3JvbGxhYmxlIiwiIiwxLCJ0ZC10YWJsZS1jb250YWluZXIiLCJzaWRlLWJ5LXNpZGUiXSxbMSwidGQtdGFibGUiXSxbNCwibmdGb3IiLCJuZ0Zvck9mIiwibmdGb3JUcmFja0J5Il0sWyJzY29wZSIsInJvdyIsMSwiZml0LWNvbHVtbiIsImxpbmUtbnVtYmVyLWNvbCIsMywibmdDbGFzcyJdLFsxLCJmaXQtY29sdW1uIiwicHJlZml4LWNvbCIsMywibmdDbGFzcyJdLFsiY2xhc3MiLCJjb250ZW50LWNvbCIsMywibmdDbGFzcyIsNCwibmdJZiJdLFsxLCJjb250ZW50LWNvbCIsMywibmdDbGFzcyJdLFszLCJpbm5lckhUTUwiXSxbMywiaW5uZXJIVE1MIiwibmdDbGFzcyIsNCwibmdGb3IiLCJuZ0Zvck9mIiwibmdGb3JUcmFja0J5Il0sWzMsImlubmVySFRNTCIsIm5nQ2xhc3MiXSxbImlkIiwidGQtcmlnaHQtY29tcGFyZS1jb250YWluZXIiLCJ0ZENvbnRhaW5lciIsIiIsImNka1Njcm9sbGFibGUiLCIiLDEsInRkLXRhYmxlLWNvbnRhaW5lciIsInNpZGUtYnktc2lkZSJdLFsxLCJ0ZC10YWJsZS1jb250YWluZXIiLCJsaW5lLWJ5LWxpbmUiXSxbInNjb3BlIiwicm93IiwxLCJmaXQtY29sdW1uIiwibGluZS1udW1iZXItY29sLWxlZnQiXSxbInNjb3BlIiwicm93IiwxLCJmaXQtY29sdW1uIiwibGluZS1udW1iZXItY29sIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYodSgwLCJ0ZC1sb2FkZXItc3Bpbm5lciIsMCksUigxLFNQLDcsOSwiZGl2IiwxKSksaSYyJiYoZigiYWN0aXZlIixhLmxvYWRpbmcpLGwoKSxmKCJuZ0lmIiwhYS5sb2FkaW5nKSl9LGRlcGVuZGVuY2llczpbVDEsQmEsJGksQzAsUG0sbXQsZWEsaDIselAsT2csVFBdLHN0eWxlczpbJy50ZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmdyaWQ7d2lkdGg6MTAwJTtncmlkLXJvdy1nYXA6MTBweDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDIsW2NvbF0gNTAlKTtncmlkLXRlbXBsYXRlLXJvd3M6cmVwZWF0KDIsW3Jvd10gYXV0byk7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiM0NDR9LnRkLXRvb2xiYXItc2hvdy1kaWZmW19uZ2NvbnRlbnQtJUNPTVAlXXtncmlkLWNvbHVtbjoxO2dyaWQtcm93OjF9LnRkLXRvb2xiYXItc2VsZWN0LWZvcm1hdFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6YXV0bztncmlkLWNvbHVtbjoyO2dyaWQtcm93OjF9LnRkLXRhYmxlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Z3JpZC1jb2x1bW46MSAvIDI7Z3JpZC1yb3c6Mjt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlO292ZXJmbG93LXg6YXV0b30udGQtdGFibGUtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3dpZHRoOjIwMCV9LnRkLXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MXB4IHNvbGlkIGRhcmtncmF5O21heC1oZWlnaHQ6NTB2aDt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlfS5maXQtY29sdW1uW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwfS5saW5lLW51bWJlci1jb2xbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlO3Bvc2l0aW9uOi13ZWJraXQtc3RpY2t5O3Bvc2l0aW9uOnN0aWNreTtsZWZ0OjA7dG9wOmF1dG87Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZGRkO2NvbG9yOiM5OTk7dGV4dC1hbGlnbjpyaWdodDtiYWNrZ3JvdW5kLWNvbG9yOiNmN2Y3Zjc7cGFkZGluZy1sZWZ0OjEwcHg7cGFkZGluZy1yaWdodDoxMHB4O2ZvbnQtc2l6ZTo4Ny41JX0ubGluZS1udW1iZXItY29sLWxlZnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM5OTk7cGFkZGluZy1sZWZ0OjEwcHg7cGFkZGluZy1yaWdodDoxMHB4O3RleHQtYWxpZ246cmlnaHQ7YmFja2dyb3VuZC1jb2xvcjojZjdmN2Y3O2ZvbnQtc2l6ZTo4Ny41JX0uaW5zZXJ0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5pbnNlcnQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5saW5lLW51bWJlci1jb2xbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2RmZDtib3JkZXItY29sb3I6I2I0ZTJiNH0uZGVsZXRlLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5kZWxldGUtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5saW5lLW51bWJlci1jb2xbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZlZThlOTtib3JkZXItY29sb3I6I2U5YWVhZX0uZW1wdHktcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmN2Y3Zjc7aGVpZ2h0OjI0cHh9LnRkLXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjA7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO3doaXRlLXNwYWNlOm5vd3JhcDttYXgtd2lkdGg6NTAlfXByZVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTowfXRkLmNvbnRlbnQtY29sW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjA7bWFyZ2luOjA7bGluZS1oZWlnaHQ6MjRweH10ZC5wcmVmaXgtY29sW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWxlZnQ6MTBweDtwYWRkaW5nLXJpZ2h0OjEwcHg7bGluZS1oZWlnaHQ6MjRweH0udGQtYnRuLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjRweH0udGQtYnRuLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMTdhMmI4YjM7Ym9yZGVyOjFweCBzb2xpZCAjMTdhMmI4O2NvbG9yOiNmZmY7Y3Vyc29yOnBvaW50ZXI7ZmxvYXQ6bGVmdH0udGQtYnRuLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KDpsYXN0LWNoaWxkKXtib3JkZXItcmlnaHQ6bm9uZX0udGQtYnRuLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDstd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1cy10b3BsZWZ0OjRweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDo0cHg7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHh9LnRkLWJ0bi1ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICBidXR0b25bX25nY29udGVudC0lQ09NUCVdOmxhc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OjRweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHh9LnRkLWJ0bi1ncm91cFtfbmdjb250ZW50LSVDT01QJV06YWZ0ZXJ7Y29udGVudDoiIjtjbGVhcjpib3RoO2Rpc3BsYXk6dGFibGV9LnRkLWJ0bi1ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICBidXR0b25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAudGQtYnRuLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbi5hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzE3YTJiOH0udGQtY2hlY2tib3gtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmctbGVmdDoyMXB4O21hcmdpbi1ib3R0b206MDtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyOHB4Oy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0udGQtY2hlY2tib3gtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7Y3Vyc29yOnBvaW50ZXI7aGVpZ2h0OjA7d2lkdGg6MH0uY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6N3B4O2xlZnQ6MDtoZWlnaHQ6MTZweDt3aWR0aDoxNnB4O2JhY2tncm91bmQtY29sb3I6I2VlZX0udGQtY2hlY2tib3gtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIGlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXSB+IC5jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2NjY30udGQtY2hlY2tib3gtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXTpjaGVja2VkIH4gLmNoZWNrbWFya1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMTdhMmI4fS5jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVdOmFmdGVye2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpub25lfS50ZC1jaGVja2JveC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdICAgaW5wdXRbX25nY29udGVudC0lQ09NUCVdOmNoZWNrZWQgfiAuY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXTphZnRlcntkaXNwbGF5OmJsb2NrfS50ZC1jaGVja2JveC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdICAgLmNoZWNrbWFya1tfbmdjb250ZW50LSVDT01QJV06YWZ0ZXJ7bGVmdDo1cHg7dG9wOjNweDt3aWR0aDo1cHg7aGVpZ2h0OjEwcHg7Ym9yZGVyOnNvbGlkIHdoaXRlO2JvcmRlci13aWR0aDowIDNweCAzcHggMDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpOy1tcy10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uaW5zZXJ0LXJvd1tfbmdjb250ZW50LSVDT01QJV0gPiAuaGlnaGxpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNhY2YyYmQhaW1wb3J0YW50fS5kZWxldGUtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5oaWdobGlnaHRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZkYjhjMCFpbXBvcnRhbnR9J119KX1yZXR1cm4gdH0pKCksX2M9KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVtb2Q9eGUoe3R5cGU6dH0pO3N0YXRpYyBcdTAyNzVpbmo9eWUoe2ltcG9ydHM6W0RpLGF0LHowXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIEFQKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJkaXYiLDEpLFMoImNsaWNrIixmdW5jdGlvbigpe2xldCBhPXooZSkuaW5kZXgscj12KCk7cmV0dXJuIFQoci5jb25maWcuZGlzYWJsZUJ1bGxldHM/bnVsbDpyLmdhbGxlcnkucmVmKHIuZ2FsbGVyeUlkKS5zZXQoYSkpfSksdSgxLCJkaXYiLDIpLHMoKX1pZih0JjIpe2xldCBlPW4uaW5kZXgsaT12KCk7X3QoIndpZHRoIixpLmNvbmZpZz09bnVsbD9udWxsOmkuY29uZmlnLmJ1bGxldFNpemUsInB4IikoImhlaWdodCIsaS5jb25maWc9PW51bGw/bnVsbDppLmNvbmZpZy5idWxsZXRTaXplLCJweCIpLGllKCJnLWJ1bGxldC1hY3RpdmUiLGU9PT1pLnN0YXRlLmN1cnJJbmRleCl9fWZ1bmN0aW9uIERQKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJpIiwyKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLmdhbGxlcnkucmVmKGEuaWQpLnByZXYoYS5jb25maWcuc2Nyb2xsQmVoYXZpb3IpKX0pLHMoKX1pZih0JjIpe2xldCBlPXYoKTtmKCJpbm5lckh0bWwiLGUubmF2SWNvbix0dCl9fWZ1bmN0aW9uIElQKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJpIiwzKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLmdhbGxlcnkucmVmKGEuaWQpLm5leHQoYS5jb25maWcuc2Nyb2xsQmVoYXZpb3IpKX0pLHMoKX1pZih0JjIpe2xldCBlPXYoKTtmKCJpbm5lckh0bWwiLGUubmF2SWNvbix0dCl9fWZ1bmN0aW9uIFBQKHQsbil7aWYodCYxJiZ1KDAsImlmcmFtZSIsMywxKSx0JjIpe2xldCBlPXYoKTtmKCJzcmMiLGUuaWZyYW1lU3JjLF82KSxHKCJsb2FkaW5nIixlLmxvYWRpbmdBdHRyKX19ZnVuY3Rpb24gVlAodCxuKXtpZih0JjEmJnUoMCwiaWZyYW1lIiw0LDEpLHQmMil7bGV0IGU9digpO2YoInNyYyIsZS5pZnJhbWVTcmMsXzYpLEcoImxvYWRpbmciLGUubG9hZGluZ0F0dHIpfX1mdW5jdGlvbiBIUCh0LG4pe2lmKHQmMSYmdSgwLCJzb3VyY2UiLDUpLHQmMil7bGV0IGU9digpLiRpbXBsaWNpdDtmKCJzcmMiLGU9PW51bGw/bnVsbDplLnVybCx3dCkoInR5cGUiLGUudHlwZSl9fWZ1bmN0aW9uIE5QKHQsbil7aWYodCYxJiZ1KDAsInNvdXJjZSIsNiksdCYyKXtsZXQgZT12KCkuJGltcGxpY2l0O2YoInNyYyIsZT09bnVsbD9udWxsOmUudXJsLHd0KX19ZnVuY3Rpb24gUlAodCxuKXtpZih0JjEmJihfZSgwKSxSKDEsSFAsMSwyLCJzb3VyY2UiLDQpKDIsTlAsMSwxLCJuZy10ZW1wbGF0ZSIsbnVsbCwxLFEyKSxiZSgpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9c2UoMyk7bCgpLGYoIm5nSWYiLGU9PW51bGw/bnVsbDplLnR5cGUpKCJuZ0lmRWxzZSIsaSl9fWZ1bmN0aW9uIEZQKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7X2UoMCksYygxLCJpbWciLDgpLFMoImxvYWQiLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5zdGF0ZT0ic3VjY2VzcyIpfSkoImVycm9yIixmdW5jdGlvbihhKXt6KGUpO2xldCByPXYoKTtyZXR1cm4gci5zdGF0ZT0iZmFpbGVkIixUKHIuZXJyb3IuZW1pdChhKSl9KSxzKCksYmUoKX1pZih0JjIpe2xldCBlPXYoKTtsKCksX3QoInZpc2liaWxpdHkiLGUuc3RhdGU9PT0ic3VjY2VzcyI/InZpc2libGUiOiJoaWRkZW4iKSxmKCJAZmFkZUluIixlLnN0YXRlKSgic3JjIixlLnNyYyx3dCksRygiYWx0IixlLmFsdCkoImxvYWRpbmciLGUubG9hZGluZ0F0dHIpfX1mdW5jdGlvbiBCUCh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiaW1nIiw5KSxTKCJsb2FkIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpO3JldHVybiBUKGEuc3RhdGU9InN1Y2Nlc3MiKX0pKCJlcnJvciIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIHIuc3RhdGU9ImZhaWxlZCIsVChyLmVycm9yLmVtaXQoYSkpfSkscygpfWlmKHQmMil7bGV0IGU9digpO190KCJ2aXNpYmlsaXR5IixlLnN0YXRlPT09InN1Y2Nlc3MiPyJ2aXNpYmxlIjoiaGlkZGVuIiksZigiZ2FsbGVyeUltYWdlIixlLmluZGV4KSgiQGZhZGVJbiIsZS5zdGF0ZSkoInNyYyIsZS5zcmMsd3QpLEcoImFsdCIsZS5hbHQpKCJsb2FkaW5nIixlLmxvYWRpbmdBdHRyKX19ZnVuY3Rpb24gVVAodCxuKXtpZih0JjEmJnUoMCwiZGl2IiwxMiksdCYyKXtsZXQgZT12KDIpO2YoImlubmVySFRNTCIsZS5lcnJvclRlbXBsYXRlLHR0KX19ZnVuY3Rpb24galAodCxuKXtpZih0JjEmJihfZSgwKSxjKDEsImg0IiksdSgyLCJkaXYiLDEzKSxzKCksYmUoKSksdCYyKXtsZXQgZT12KDMpO2woMiksZigiaW5uZXJIVE1MIixlLmVycm9yU3ZnLHR0KX19ZnVuY3Rpb24gcVAodCxuKXtpZih0JjEmJihjKDAsImgyIiksdSgxLCJkaXYiLDE0KSxzKCksYygyLCJwIiksbSgzLCJVbmFibGUgdG8gbG9hZCB0aGUgaW1hZ2UhIikscygpKSx0JjIpe2xldCBlPXYoMyk7bCgpLGYoImlubmVySFRNTCIsZS5lcnJvclN2Zyx0dCl9fWZ1bmN0aW9uIEdQKHQsbil7aWYodCYxJiZSKDAsalAsMywxLCJuZy1jb250YWluZXIiLDUpKDEscVAsNCwxLCJuZy10ZW1wbGF0ZSIsbnVsbCwyLFEyKSx0JjIpe2xldCBlPXNlKDIpLGk9digyKTtmKCJuZ0lmIixpLmlzVGh1bWJuYWlsKSgibmdJZkVsc2UiLGUpfX1mdW5jdGlvbiBXUCh0LG4pe2lmKHQmMSYmKGMoMCwiZGl2IiwxMCksUigxLFVQLDEsMSwiZGl2IiwxMSkoMixHUCwzLDIsIm5nLXRlbXBsYXRlIixudWxsLDEsUTIpLHMoKSksdCYyKXtsZXQgZT1zZSgzKSxpPXYoKTtsKCksZigibmdJZiIsaS5lcnJvclRlbXBsYXRlKSgibmdJZkVsc2UiLGUpfX1mdW5jdGlvbiBRUCh0LG4pe2lmKHQmMSYmdSgwLCJkaXYiLDE2KSx0JjIpe2xldCBlPXYoMik7ZigiaW5uZXJIVE1MIixlLmxvYWRlclRlbXBsYXRlLHR0KX19ZnVuY3Rpb24gWVAodCxuKXt0JjEmJnUoMCwiZGl2IiwxOCl9ZnVuY3Rpb24gWlAodCxuKXtpZih0JjEmJlIoMCxZUCwxLDAsImRpdiIsMTcpLHQmMil7bGV0IGU9digyKTtmKCJuZ0lmIixlLmlzVGh1bWJuYWlsKX19ZnVuY3Rpb24gJFAodCxuKXtpZih0JjEmJihfZSgwKSxSKDEsUVAsMSwxLCJkaXYiLDE1KSgyLFpQLDEsMSwibmctdGVtcGxhdGUiLG51bGwsMyxRMiksYmUoKSksdCYyKXtsZXQgZT1zZSgzKSxpPXYoKTtsKCksZigibmdJZiIsaS5sb2FkZXJUZW1wbGF0ZSkoIm5nSWZFbHNlIixlKX19ZnVuY3Rpb24gS1AodCxuKXt0JjEmJl8xKDApfWZ1bmN0aW9uIFhQKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDkpLFIoMSxLUCwxLDAsIm5nLWNvbnRhaW5lciIsMTApLHMoKSksdCYyKXtsZXQgZT12KDMpO2woKSxmKCJuZ1RlbXBsYXRlT3V0bGV0IixlLmNvbmZpZy5pbWFnZVRlbXBsYXRlKSgibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLGUuaW1hZ2VDb250ZXh0KX19ZnVuY3Rpb24gSlAodCxuKXtpZih0JjEpe2xldCBlPUwoKTtfZSgwKSxjKDEsImdhbGxlcnktaW1hZ2UiLDcpLFMoImVycm9yIixmdW5jdGlvbihhKXt6KGUpO2xldCByPXYoMik7cmV0dXJuIFQoci5lcnJvci5lbWl0KGEpKX0pLHMoKSxSKDIsWFAsMiwyLCJkaXYiLDgpLGJlKCl9aWYodCYyKXtsZXQgZT12KDIpO2woKSxmKCJzcmMiLGUuaW1hZ2VEYXRhLnNyYykoImFsdCIsZS5pbWFnZURhdGEuYWx0KSgiaW5kZXgiLGUuaW5kZXgpKCJsb2FkaW5nQXR0ciIsZS5jb25maWcubG9hZGluZ0F0dHIpKCJsb2FkaW5nSWNvbiIsZS5jb25maWcubG9hZGluZ0ljb24pKCJsb2FkaW5nRXJyb3IiLGUuY29uZmlnLmxvYWRpbmdFcnJvciksbCgpLGYoIm5nSWYiLGUuY29uZmlnLmltYWdlVGVtcGxhdGUpfX1mdW5jdGlvbiBlVih0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiZ2FsbGVyeS12aWRlbyIsMTEpLFMoImVycm9yIixmdW5jdGlvbihhKXt6KGUpO2xldCByPXYoMik7cmV0dXJuIFQoci5lcnJvci5lbWl0KGEpKX0pLHMoKX1pZih0JjIpe2xldCBlPXYoMik7Zigic3JjIixlLnZpZGVvRGF0YS5zcmMpKCJtdXRlIixlLnZpZGVvRGF0YS5tdXRlKSgicG9zdGVyIixlLnZpZGVvRGF0YS5wb3N0ZXIpKCJjb250cm9scyIsZS52aWRlb0RhdGEuY29udHJvbHMpKCJjb250cm9sc0xpc3QiLGUudmlkZW9EYXRhLmNvbnRyb2xzTGlzdCkoImRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIixlLnZpZGVvRGF0YS5kaXNhYmxlUGljdHVyZUluUGljdHVyZSkoInBsYXkiLGUuaXNBdXRvUGxheSkoInBhdXNlIixlLmN1cnJJbmRleCE9PWUuaW5kZXgpfX1mdW5jdGlvbiB0Vih0LG4pe2lmKHQmMSYmdSgwLCJnYWxsZXJ5LWlmcmFtZSIsMTIpLHQmMil7bGV0IGU9digyKTtmKCJzcmMiLGUueW91dHViZVNyYykoImF1dG9wbGF5IixlLmlzQXV0b1BsYXkpKCJsb2FkaW5nQXR0ciIsZS5jb25maWcubG9hZGluZ0F0dHIpKCJwYXVzZSIsZS5jdXJySW5kZXghPT1lLmluZGV4KX19ZnVuY3Rpb24gaVYodCxuKXtpZih0JjEmJnUoMCwiZ2FsbGVyeS1pZnJhbWUiLDEyKSx0JjIpe2xldCBlPXYoMik7Zigic3JjIixlLnZpbWVvU3JjKSgiYXV0b3BsYXkiLGUuaXNBdXRvUGxheSkoImxvYWRpbmdBdHRyIixlLmNvbmZpZy5sb2FkaW5nQXR0cikoInBhdXNlIixlLmN1cnJJbmRleCE9PWUuaW5kZXgpfX1mdW5jdGlvbiBhVih0LG4pe2lmKHQmMSYmdSgwLCJnYWxsZXJ5LWlmcmFtZSIsMTMpLHQmMil7bGV0IGU9digyKTtmKCJzcmMiLGUuZGF0YS5zcmMpKCJsb2FkaW5nQXR0ciIsZS5jb25maWcubG9hZGluZ0F0dHIpfX1mdW5jdGlvbiBuVih0LG4pe3QmMSYmXzEoMCl9ZnVuY3Rpb24gclYodCxuKXtpZih0JjEmJihjKDAsImRpdiIsOSksUigxLG5WLDEsMCwibmctY29udGFpbmVyIiwxMCkscygpKSx0JjIpe2xldCBlPXYoMyk7bCgpLGYoIm5nVGVtcGxhdGVPdXRsZXQiLGUuY29uZmlnLml0ZW1UZW1wbGF0ZSkoIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0IixlLml0ZW1Db250ZXh0KX19ZnVuY3Rpb24gb1YodCxuKXtpZih0JjEmJihfZSgwKSxSKDEsclYsMiwyLCJkaXYiLDgpLGJlKCkpLHQmMil7bGV0IGU9digyKTtsKCksZigibmdJZiIsZS5jb25maWcuaXRlbVRlbXBsYXRlKX19ZnVuY3Rpb24gY1YodCxuKXtpZih0JjEmJihfZSgwLDEpLFIoMSxKUCwzLDcsIm5nLWNvbnRhaW5lciIsMikoMixlViwxLDgsImdhbGxlcnktdmlkZW8iLDMpKDMsdFYsMSw0LCJnYWxsZXJ5LWlmcmFtZSIsNCkoNCxpViwxLDQsImdhbGxlcnktaWZyYW1lIiw0KSg1LGFWLDEsMiwiZ2FsbGVyeS1pZnJhbWUiLDUpKDYsb1YsMiwxLCJuZy1jb250YWluZXIiLDYpLGJlKCkpLHQmMil7bGV0IGU9digpO2YoIm5nU3dpdGNoIixlLnR5cGUpLGwoKSxmKCJuZ1N3aXRjaENhc2UiLGUuVHlwZXMuSW1hZ2UpLGwoKSxmKCJuZ1N3aXRjaENhc2UiLGUuVHlwZXMuVmlkZW8pLGwoKSxmKCJuZ1N3aXRjaENhc2UiLGUuVHlwZXMuWW91dHViZSksbCgpLGYoIm5nU3dpdGNoQ2FzZSIsZS5UeXBlcy5WaW1lbyksbCgpLGYoIm5nU3dpdGNoQ2FzZSIsZS5UeXBlcy5JZnJhbWUpfX1mdW5jdGlvbiBsVih0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiZ2FsbGVyeS1pdGVtIiw1KSxTKCJhY3RpdmVJbmRleENoYW5nZSIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5vbkFjdGl2ZUluZGV4Q2hhbmdlKGEpKX0pKCJjbGljayIsZnVuY3Rpb24oKXtsZXQgYT16KGUpLmluZGV4LHI9digpO3JldHVybiBUKHIuaXRlbUNsaWNrLmVtaXQoYSkpfSkoImVycm9yIixmdW5jdGlvbihhKXtsZXQgcj16KGUpLmluZGV4LG89digpO3JldHVybiBUKG8uZXJyb3IuZW1pdCh7aXRlbUluZGV4OnIsZXJyb3I6YX0pKX0pLHMoKX1pZih0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9bi5pbmRleCxhPXYoKTtmKCJ0eXBlIixlLnR5cGUpKCJjb25maWciLGEuY29uZmlnKSgiZGF0YSIsZS5kYXRhKSgiY3VyckluZGV4IixhLnN0YXRlLmN1cnJJbmRleCkoImluZGV4IixpKSgiY291bnQiLGEuc3RhdGUuaXRlbXMubGVuZ3RoKSgiaXRlbUludGVyc2VjdGlvbk9ic2VydmVyRGlzYWJsZWQiLGEuaXNTY3JvbGxpbmd8fGEuaXNTbGlkaW5nfHxhLmlzUmVzaXppbmcpKCJhZGFwdGVyIixhLmFkYXB0ZXIpLEcoImdhbGxlcnlJZCIsYS5nYWxsZXJ5SWQpfX1mdW5jdGlvbiBkVih0LG4pe3QmMSYmKGMoMCwiZGl2Iiw2KSgxLCJkaXYiLDcpLG0oMiwiUkVTSVpJTkciKSxzKCksYygzLCJkaXYiLDgpLG0oNCwiU0NST0xMSU5HIikscygpLGMoNSwiZGl2Iiw5KSxtKDYsIlNMSURJTkciKSxzKCkoKSl9ZnVuY3Rpb24gbVYodCxuKXt0JjEmJl8xKDApfWZ1bmN0aW9uIGhWKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDIpLFIoMSxtViwxLDAsIm5nLWNvbnRhaW5lciIsMykscygpKSx0JjIpe2xldCBlPXYoKTtsKCksZigibmdUZW1wbGF0ZU91dGxldCIsZS5jb25maWcudGh1bWJUZW1wbGF0ZSkoIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0IixlLmltYWdlQ29udGV4dCl9fWZ1bmN0aW9uIHBWKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJnYWxsZXJ5LXRodW1iIiw0KSxTKCJjbGljayIsZnVuY3Rpb24oKXtsZXQgYT16KGUpLmluZGV4LHI9digpO3JldHVybiBUKHIuY29uZmlnLmRpc2FibGVUaHVtYnM/bnVsbDpyLnRodW1iQ2xpY2suZW1pdChhKSl9KSgiZXJyb3IiLGZ1bmN0aW9uKGEpe2xldCByPXooZSkuaW5kZXgsbz12KCk7cmV0dXJuIFQoby5lcnJvci5lbWl0KHtpdGVtSW5kZXg6cixlcnJvcjphfSkpfSkscygpfWlmKHQmMil7bGV0IGU9bi4kaW1wbGljaXQsaT1uLmluZGV4LGE9digpO2YoInR5cGUiLGUudHlwZSkoImNvbmZpZyIsYS5jb25maWcpKCJkYXRhIixlLmRhdGEpKCJjdXJySW5kZXgiLGEuc3RhdGUuY3VyckluZGV4KSgiaW5kZXgiLGkpKCJjb3VudCIsYS5zdGF0ZS5pdGVtcy5sZW5ndGgpLEcoImdhbGxlcnlJZCIsYS5nYWxsZXJ5SWQpfX1mdW5jdGlvbiB1Vih0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiZ2FsbGVyeS10aHVtYnMiLDcpLFMoInRodW1iQ2xpY2siLGZ1bmN0aW9uKGEpe3ooZSk7bGV0IHI9digpO3JldHVybiBUKHIudGh1bWJDbGljay5lbWl0KGEpKX0pKCJlcnJvciIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5lcnJvci5lbWl0KGEpKX0pLHMoKX1pZih0JjIpe2xldCBlPXYoKTtmKCJzdGF0ZSIsZS5zdGF0ZSkoImNvbmZpZyIsZS5jb25maWcpKCJnYWxsZXJ5SWQiLGUuZ2FsbGVyeUlkKX19ZnVuY3Rpb24gZ1YodCxuKXtpZih0JjEmJnUoMCwiZ2FsbGVyeS1uYXYiLDgpLHQmMil7bGV0IGU9digpO2YoInN0YXRlIixlLnN0YXRlKSgiY29uZmlnIixlLmNvbmZpZykoImdhbGxlcnlJZCIsZS5nYWxsZXJ5SWQpfX1mdW5jdGlvbiB2Vih0LG4pe2lmKHQmMSYmdSgwLCJnYWxsZXJ5LWJ1bGxldHMiLDgpLHQmMil7bGV0IGU9digpO2YoInN0YXRlIixlLnN0YXRlKSgiY29uZmlnIixlLmNvbmZpZykoImdhbGxlcnlJZCIsZS5nYWxsZXJ5SWQpfX1mdW5jdGlvbiBfVih0LG4pe2lmKHQmMSYmdSgwLCJnYWxsZXJ5LWNvdW50ZXIiLDkpLHQmMil7bGV0IGU9digpO2YoInN0YXRlIixlLnN0YXRlKX19ZnVuY3Rpb24gYlYodCxuKXt0JjEmJl8xKDApfWZ1bmN0aW9uIFdnKHQsbil7cmV0dXJuIDEtMypuKzMqdH1mdW5jdGlvbiBRZyh0LG4pe3JldHVybiAzKm4tNip0fWZ1bmN0aW9uIFlnKHQpe3JldHVybiAzKnR9ZnVuY3Rpb24gU2ModCxuLGUpe3JldHVybigoV2cobixlKSp0K1FnKG4sZSkpKnQrWWcobikpKnR9ZnVuY3Rpb24gWmcodCxuLGUpe3JldHVybiAzKldnKG4sZSkqdCp0KzIqUWcobixlKSp0K1lnKG4pfWZ1bmN0aW9uIExWKHQsbixlLGksYSl7bGV0IHIsbyxkPTA7ZG8gbz1uKyhlLW4pLzIscj1TYyhvLGksYSktdCxyPjA/ZT1vOm49bzt3aGlsZShNYXRoLmFicyhyKT5BViYmKytkPERWKTtyZXR1cm4gb31mdW5jdGlvbiBQVih0LG4sZSxpKXtmb3IobGV0IGE9MDthPFRWOysrYSl7bGV0IHI9WmcobixlLGkpO2lmKHI9PT0wKXJldHVybiBuO2xldCBvPVNjKG4sZSxpKS10O24tPW8vcn1yZXR1cm4gbn1mdW5jdGlvbiBWVih0KXtyZXR1cm4gdH1mdW5jdGlvbiBPVih0LG4sZSxpKXtpZighKDA8PXQmJnQ8PTEmJjA8PWUmJmU8PTEpKXRocm93IG5ldyBFcnJvcigiYmV6aWVyIHggdmFsdWVzIG11c3QgYmUgaW4gWzAsIDFdIHJhbmdlIik7aWYodD09PW4mJmU9PT1pKXJldHVybiBWVjtsZXQgYT1JVj9uZXcgRmxvYXQzMkFycmF5KEw0KTpuZXcgQXJyYXkoTDQpO2ZvcihsZXQgbz0wO288TDQ7KytvKWFbb109U2Mobyp5Yyx0LGUpO2Z1bmN0aW9uIHIobyl7bGV0IGQ9MCxwPTEsZz1MNC0xO2Zvcig7cCE9PWcmJmFbcF08PW87KytwKWQrPXljOy0tcDtsZXQgXz0oby1hW3BdKS8oYVtwKzFdLWFbcF0pLHk9ZCtfKnljLEk9WmcoeSx0LGUpO3JldHVybiBJPj1FVj9QVihvLHksdCxlKTpJPT09MD95OkxWKG8sZCxkK3ljLHQsZSl9cmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiBkPT09MD8wOmQ9PT0xPzE6U2MocihkKSxuLGkpfX1mdW5jdGlvbiBIVih0LG4sZSl7cmV0dXJuIG5ldyBtYShpPT57bGV0IGE9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKHI9PmkubmV4dChyKSx7cm9vdDp0LHJvb3RNYXJnaW46ZSx0aHJlc2hvbGQ6MX0pO3JldHVybiBuLmZvckVhY2gocj0+YS5vYnNlcnZlKHIpKSwoKT0+e24uZm9yRWFjaChyPT5hLnVub2JzZXJ2ZShyKSksYS5kaXNjb25uZWN0KCl9fSkucGlwZSh1NihpPT5pKSl9ZnVuY3Rpb24gemModCxuKXtyZXR1cm4gbmV3IG1hKGU9PntsZXQgaT1uZXcgUmVzaXplT2JzZXJ2ZXIoYT0+ZS5uZXh0KGEpKTtyZXR1cm4gaS5vYnNlcnZlKHQpLG4mJm4oaSksKCk9PmkuZGlzY29ubmVjdCgpfSkucGlwZSh1NihlPT5lKSl9dmFyIExQLE9QLFVnLHNWLGZWLHMyLGc1LHhjLGpnLG1vLHFnLEdnLFA0LHcyLFJnLEZnLHY1LF81LGI1LEM1LHk1LENjLHg1LENWLG9uLHlWLHhWLE1WLHdWLFNWLGtWLHpWLE1jLHdjLFRWLEVWLEFWLERWLEw0LHljLElWLCRnLEtnLGtjLE5WLFJWLEZWLEJWLEVjLFVWLFhnLFRjLGpWLHFWLEdWLEJnLFdWLFFWLFlWLE01LFpWLCRWLEtWLFhWLHc1LEpnLFM1PXgoKCk9PntrKCk7aygpO1h0KCk7YTEoKTthMSgpO2dhKCk7aGEoKTtaMigpO1oyKCk7dmEoKTt2YSgpO284KCk7TFA9WyJpZnJhbWUiXTtPUD1bInZpZGVvIl07VWc9WyJzbGlkZXIiXSxzVj1bIioiXTtmVj0odCxuKT0+KHtzdGF0ZTp0LGNvbmZpZzpufSk7czI9KGZ1bmN0aW9uKHQpe3JldHVybiB0LklOSVRJQUxJWkVEPSJpbml0aWFsaXplZCIsdC5JVEVNU19DSEFOR0VEPSJpdGVtc0NoYW5nZWQiLHQuSU5ERVhfQ0hBTkdFRD0iaW5kZXhDaGFuZ2VkIix0LlBMQVk9InBsYXkiLHQuU1RPUD0ic3RvcCIsdH0pKHMyfHx7fSksZzU9KGZ1bmN0aW9uKHQpe3JldHVybiB0LkNvdmVyPSJjb3ZlciIsdC5Db250YWluPSJjb250YWluIix0fSkoZzV8fHt9KSx4Yz0oZnVuY3Rpb24odCl7cmV0dXJuIHQuUHJlbG9hZD0icHJlbG9hZCIsdC5MYXp5PSJsYXp5Iix0LkRlZmF1bHQ9ImRlZmF1bHQiLHR9KSh4Y3x8e30pLGpnPShmdW5jdGlvbih0KXtyZXR1cm4gdC5FYWdlcj0iZWFnZXIiLHQuTGF6eT0ibGF6eSIsdH0pKGpnfHx7fSksbW89KGZ1bmN0aW9uKHQpe3JldHVybiB0LlRvcD0idG9wIix0LkxlZnQ9ImxlZnQiLHQuUmlnaHQ9InJpZ2h0Iix0LkJvdHRvbT0iYm90dG9tIix0fSkobW98fHt9KSxxZz0oZnVuY3Rpb24odCl7cmV0dXJuIHQuVG9wPSJ0b3AiLHQuQm90dG9tPSJib3R0b20iLHR9KShxZ3x8e30pLEdnPShmdW5jdGlvbih0KXtyZXR1cm4gdC5Ub3A9InRvcCIsdC5Cb3R0b209ImJvdHRvbSIsdH0pKEdnfHx7fSksUDQ9KGZ1bmN0aW9uKHQpe3JldHVybiB0Lkhvcml6b250YWw9Imhvcml6b250YWwiLHQuVmVydGljYWw9InZlcnRpY2FsIix0fSkoUDR8fHt9KSx3Mj0oZnVuY3Rpb24odCl7cmV0dXJuIHQuSW1hZ2U9ImltYWdlIix0LlZpZGVvPSJ2aWRlbyIsdC5Zb3V0dWJlPSJ5b3V0dWJlIix0LlZpbWVvPSJ2aW1lbyIsdC5JZnJhbWU9ImlmcmFtZSIsdH0pKHcyfHx7fSksUmc9e2FjdGlvbjpzMi5JTklUSUFMSVpFRCxpc1BsYXlpbmc6ITEsaGFzTmV4dDohMSxoYXNQcmV2OiExLGN1cnJJbmRleDowLGl0ZW1zOltdfSxGZz17bmF2OiEwLGxvb3A6ITEsYnVsbGV0czohMSx0aHVtYnM6ITEsZGVidWc6ITEsYnVsbGV0U2l6ZTo2LGNvdW50ZXI6ITEsYXV0b3BsYXk6ITEsdGh1bWJXaWR0aDoxMjAsdGh1bWJIZWlnaHQ6OTAsZGlzYWJsZUJ1bGxldHM6ITEsZGlzYWJsZVRodW1iczohMSxkaXNhYmxlU2Nyb2xsOiExLGRpc2FibGVUaHVtYlNjcm9sbDohMSxkaXNhYmxlTW91c2VTY3JvbGw6ITEsZGlzYWJsZVRodW1iTW91c2VTY3JvbGw6ITEsYXV0b3BsYXlJbnRlcnZhbDozZTMsc2Nyb2xsRHVyYXRpb246NDY4LHNjcm9sbEVhc2U6e3gxOi40Mix5MTowLHgyOi41OCx5MjoxfSx0aHVtYkNlbnRyYWxpemVkOiExLHRodW1iQXV0b3NpemU6ITEsaXRlbUF1dG9zaXplOiExLGF1dG9IZWlnaHQ6ITEsc2Nyb2xsQmVoYXZpb3I6InNtb290aCIscmVzaXplRGVib3VuY2VUaW1lOjAsbG9hZGluZ0F0dHI6amcuTGF6eSxpbWFnZVNpemU6ZzUuQ29udGFpbix0aHVtYkltYWdlU2l6ZTpnNS5Db3ZlcixidWxsZXRQb3NpdGlvbjpxZy5Cb3R0b20sY291bnRlclBvc2l0aW9uOkdnLlRvcCx0aHVtYlBvc2l0aW9uOm1vLkJvdHRvbSxsb2FkaW5nU3RyYXRlZ3k6eGMuUHJlbG9hZCxvcmllbnRhdGlvbjpQNC5Ib3Jpem9udGFsLG5hdkljb246JzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNTEyIDUxMiI+PHBhdGggZD0iTTAgMjU2QzAgMzk3LjQgMTE0LjYgNTEyIDI1NiA1MTJzMjU2LTExNC42IDI1Ni0yNTZTMzk3LjQgMCAyNTYgMFMwIDExNC42IDAgMjU2ek0yNDEgMzc3Yy05LjQgOS40LTI0LjYgOS40LTMzLjkgMHMtOS40LTI0LjYgMC0zMy45bDg3LTg3LTg3LTg3Yy05LjQtOS40LTkuNC0yNC42IDAtMzMuOXMyNC42LTkuNCAzMy45IDBMMzQ1IDIzOWM5LjQgOS40IDkuNCAyNC42IDAgMzMuOUwyNDEgMzc3eiIvPjwvc3ZnPicsbG9hZGluZ0ljb246Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHN2ZyBzdHJva2U9IiNmZmYiIHZpZXdCb3g9IjAgMCA0NCA0NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS13aWR0aD0iMiI+PGNpcmNsZSBjeD0iMjIiIGN5PSIyMiIgcj0iMSI+PGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iciIgYmVnaW49IjBzIiBjYWxjTW9kZT0ic3BsaW5lIiBkdXI9IjEuOHMiIGtleVNwbGluZXM9IjAuMTY1LCAwLjg0LCAwLjQ0LCAxIiBrZXlUaW1lcz0iMDsgMSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iMTsgMjAiLz48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJzdHJva2Utb3BhY2l0eSIgYmVnaW49IjBzIiBjYWxjTW9kZT0ic3BsaW5lIiBkdXI9IjEuOHMiIGtleVNwbGluZXM9IjAuMywgMC42MSwgMC4zNTUsIDEiIGtleVRpbWVzPSIwOyAxIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIxOyAwIi8+PC9jaXJjbGU+PGNpcmNsZSBjeD0iMjIiIGN5PSIyMiIgcj0iMSI+PGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iciIgYmVnaW49Ii0wLjlzIiBjYWxjTW9kZT0ic3BsaW5lIiBkdXI9IjEuOHMiIGtleVNwbGluZXM9IjAuMTY1LCAwLjg0LCAwLjQ0LCAxIiBrZXlUaW1lcz0iMDsgMSIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiIHZhbHVlcz0iMTsgMjAiLz48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSJzdHJva2Utb3BhY2l0eSIgYmVnaW49Ii0wLjlzIiBjYWxjTW9kZT0ic3BsaW5lIiBkdXI9IjEuOHMiIGtleVNwbGluZXM9IjAuMywgMC42MSwgMC4zNTUsIDEiIGtleVRpbWVzPSIwOyAxIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgdmFsdWVzPSIxOyAwIi8+PC9jaXJjbGU+PC9nPjwvc3ZnPid9LHY1PWNsYXNze2NvbnN0cnVjdG9yKG4pe3RoaXMuZGF0YT1uLHRoaXMudHlwZT13Mi5JbWFnZX19LF81PWNsYXNze2NvbnN0cnVjdG9yKG4pe3RoaXMuZGF0YT1uLHRoaXMudHlwZT13Mi5WaWRlb319LGI1PWNsYXNze2NvbnN0cnVjdG9yKG4pe3RoaXMuZGF0YT1uLHRoaXMudHlwZT13Mi5JZnJhbWV9fSxDNT1jbGFzc3tjb25zdHJ1Y3RvcihuKXt0aGlzLmRhdGE9VTEoWGUoe30sbikse3NyYzpgaHR0cHM6Ly95b3V0dWJlLmNvbS9lbWJlZC8ke24uc3JjfWAsdGh1bWI6bi50aHVtYj9uLnRodW1iOmAvL2ltZy55b3V0dWJlLmNvbS92aS8ke24uc3JjfS9kZWZhdWx0LmpwZ2B9KSx0aGlzLnR5cGU9dzIuWW91dHViZX19LHk1PWNsYXNze2NvbnN0cnVjdG9yKG4pe3RoaXMuZGF0YT1VMShYZSh7fSxuKSx7c3JjOmBodHRwczovL3BsYXllci52aW1lby5jb20vdmlkZW8vJHtuLnNyY31gLHRodW1iOm4udGh1bWI/bi50aHVtYjp0aGlzLmdldFZpbWVvVGh1bWIobi5zcmMpfSksdGhpcy50eXBlPXcyLlZpbWVvfWdldFZpbWVvVGh1bWIobil7cmV0dXJuYC8vdnVtYm5haWwuY29tLyR7bn0uanBnYH19LENjPXQ9PiR0KG49PnQuaW5kZXhPZihuLmFjdGlvbik+LTEpLHg1PWNsYXNze2dldCBzdGF0ZVNuYXBzaG90KCl7cmV0dXJuIHRoaXMuX3N0YXRlLnZhbHVlfWdldCBjb25maWdTbmFwc2hvdCgpe3JldHVybiB0aGlzLl9jb25maWcudmFsdWV9Z2V0IGluaXRpYWxpemVkKCl7cmV0dXJuIHRoaXMuc3RhdGUucGlwZShDYyhbczIuSU5JVElBTElaRURdKSl9Z2V0IGl0ZW1zQ2hhbmdlZCgpe3JldHVybiB0aGlzLnN0YXRlLnBpcGUoQ2MoW3MyLklURU1TX0NIQU5HRURdKSl9Z2V0IGluZGV4Q2hhbmdlZCgpe3JldHVybiB0aGlzLnN0YXRlLnBpcGUoQ2MoW3MyLklOREVYX0NIQU5HRURdKSl9Z2V0IHBsYXlpbmdDaGFuZ2VkKCl7cmV0dXJuIHRoaXMuc3RhdGUucGlwZShDYyhbczIuUExBWSxzMi5TVE9QXSkpfWNvbnN0cnVjdG9yKG4sZSl7dGhpcy5kZWxldGVJbnN0YW5jZT1lLHRoaXMuaXRlbUNsaWNrPW5ldyB3ZSx0aGlzLnRodW1iQ2xpY2s9bmV3IHdlLHRoaXMuZXJyb3I9bmV3IHdlLHRoaXMuX3N0YXRlPW5ldyBkMihSZyksdGhpcy5fY29uZmlnPW5ldyBkMihuKSx0aGlzLnN0YXRlPXRoaXMuX3N0YXRlLmFzT2JzZXJ2YWJsZSgpLHRoaXMuY29uZmlnPXRoaXMuX2NvbmZpZy5hc09ic2VydmFibGUoKX1zZXRTdGF0ZShuKXt0aGlzLl9zdGF0ZS5uZXh0KFhlKFhlKHt9LHRoaXMuc3RhdGVTbmFwc2hvdCksbikpfXNldENvbmZpZyhuKXt0aGlzLl9jb25maWcubmV4dChYZShYZSh7fSx0aGlzLl9jb25maWcudmFsdWUpLG4pKX1hZGQobixlKXtsZXQgaT1bLi4udGhpcy5zdGF0ZVNuYXBzaG90Lml0ZW1zLG5dO3RoaXMuc2V0U3RhdGUoe2FjdGlvbjpzMi5JVEVNU19DSEFOR0VELGl0ZW1zOmksaGFzTmV4dDppLmxlbmd0aD4xLGN1cnJJbmRleDplP2kubGVuZ3RoLTE6dGhpcy5zdGF0ZVNuYXBzaG90LmN1cnJJbmRleH0pfWFkZEltYWdlKG4sZSl7dGhpcy5hZGQobmV3IHY1KG4pLGUpfWFkZFZpZGVvKG4sZSl7dGhpcy5hZGQobmV3IF81KG4pLGUpfWFkZElmcmFtZShuLGUpe3RoaXMuYWRkKG5ldyBiNShuKSxlKX1hZGRZb3V0dWJlKG4sZSl7dGhpcy5hZGQobmV3IEM1KG4pLGUpfWFkZFZpbWVvKG4sZSl7dGhpcy5hZGQobmV3IHk1KG4pLGUpfXJlbW92ZShuKXtsZXQgZT10aGlzLnN0YXRlU25hcHNob3QsaT1bLi4uZS5pdGVtcy5zbGljZSgwLG4pLC4uLmUuaXRlbXMuc2xpY2UobisxLGUuaXRlbXMubGVuZ3RoKV07dGhpcy5zZXRTdGF0ZSh7YWN0aW9uOnMyLklURU1TX0NIQU5HRUQsY3VyckluZGV4Om48MT9lLmN1cnJJbmRleDpuLTEsaXRlbXM6aSxoYXNOZXh0OmkubGVuZ3RoPjEsaGFzUHJldjpuPjB9KX1sb2FkKG4pe24mJnRoaXMuc2V0U3RhdGUoe2FjdGlvbjpzMi5JVEVNU19DSEFOR0VELGl0ZW1zOm4saGFzTmV4dDpuLmxlbmd0aD4xLGhhc1ByZXY6ITF9KX1zZXQobixlPXRoaXMuX2NvbmZpZy52YWx1ZS5zY3JvbGxCZWhhdmlvcil7aWYobjwwfHxuPj10aGlzLnN0YXRlU25hcHNob3QuaXRlbXMubGVuZ3RoKXtjb25zb2xlLmVycm9yKGBbTmdHYWxsZXJ5XTogVW5hYmxlIHRvIHNldCB0aGUgYWN0aXZlIGl0ZW0gYmVjYXVzZSB0aGUgZ2l2ZW4gaW5kZXggKCR7bn0pIGlzIG91dHNpZGUgdGhlIGl0ZW1zIHJhbmdlIWApO3JldHVybn1uIT09dGhpcy5zdGF0ZVNuYXBzaG90LmN1cnJJbmRleCYmdGhpcy5zZXRTdGF0ZSh7YmVoYXZpb3I6ZSxhY3Rpb246czIuSU5ERVhfQ0hBTkdFRCxjdXJySW5kZXg6bixoYXNOZXh0Om48dGhpcy5zdGF0ZVNuYXBzaG90Lml0ZW1zLmxlbmd0aC0xLGhhc1ByZXY6bj4wfSl9bmV4dChuPXRoaXMuX2NvbmZpZy52YWx1ZS5zY3JvbGxCZWhhdmlvcixlPSEwKXt0aGlzLnN0YXRlU25hcHNob3QuaGFzTmV4dD90aGlzLnNldCh0aGlzLnN0YXRlU25hcHNob3QuY3VyckluZGV4KzEsbik6ZSYmdGhpcy5fY29uZmlnLnZhbHVlLmxvb3AmJnRoaXMuc2V0KDAsbil9cHJldihuPXRoaXMuX2NvbmZpZy52YWx1ZS5zY3JvbGxCZWhhdmlvcixlPSEwKXt0aGlzLnN0YXRlU25hcHNob3QuaGFzUHJldj90aGlzLnNldCh0aGlzLnN0YXRlU25hcHNob3QuY3VyckluZGV4LTEsbik6ZSYmdGhpcy5fY29uZmlnLnZhbHVlLmxvb3AmJnRoaXMuc2V0KHRoaXMuc3RhdGVTbmFwc2hvdC5pdGVtcy5sZW5ndGgtMSxuKX1wbGF5KG4pe24mJnRoaXMuc2V0Q29uZmlnKHthdXRvcGxheUludGVydmFsOm59KSx0aGlzLnNldFN0YXRlKHthY3Rpb246czIuUExBWSxiZWhhdmlvcjoiYXV0byIsaXNQbGF5aW5nOiEwfSl9c3RvcCgpe3RoaXMuc2V0U3RhdGUoe2FjdGlvbjpzMi5TVE9QLGlzUGxheWluZzohMX0pfXJlc2V0KCl7dGhpcy5zZXRTdGF0ZShSZyl9ZGVzdHJveSgpe3RoaXMuX3N0YXRlLmNvbXBsZXRlKCksdGhpcy5fY29uZmlnLmNvbXBsZXRlKCksdGhpcy5pdGVtQ2xpY2suY29tcGxldGUoKSx0aGlzLnRodW1iQ2xpY2suY29tcGxldGUoKSx0aGlzLmRlbGV0ZUluc3RhbmNlKCl9fSxDVj1uZXcgY2UoIkdBTExFUllfQ09ORklHIiksb249KCgpPT57Y2xhc3MgdHtjb25zdHJ1Y3RvcihlKXt0aGlzLl9pbnN0YW5jZXM9bmV3IE1hcCx0aGlzLmNvbmZpZz1lP1hlKFhlKHt9LEZnKSxlKTpGZ31yZWYoZT0icm9vdCIsaSl7aWYodGhpcy5faW5zdGFuY2VzLmhhcyhlKSl7bGV0IGE9dGhpcy5faW5zdGFuY2VzLmdldChlKTtyZXR1cm4gaSYmYS5zZXRDb25maWcoaSksYX1lbHNlIHJldHVybiB0aGlzLl9pbnN0YW5jZXMuc2V0KGUsbmV3IHg1KFhlKFhlKHt9LHRoaXMuY29uZmlnKSxpKSx0aGlzLmRlbGV0ZUluc3RhbmNlKGUpKSkuZ2V0KGUpfWRlc3Ryb3lBbGwoKXt0aGlzLl9pbnN0YW5jZXMuZm9yRWFjaChlPT5lLmRlc3Ryb3koKSl9cmVzZXRBbGwoKXt0aGlzLl9pbnN0YW5jZXMuZm9yRWFjaChlPT5lLnJlc2V0KCkpfWRlYnVnQ29uc29sZSguLi5lKXt0aGlzLmNvbmZpZy5kZWJ1ZyYmY29uc29sZS5sb2coLi4uZSl9ZGVsZXRlSW5zdGFuY2UoZSl7cmV0dXJuKCk9Pnt0aGlzLl9pbnN0YW5jZXMuaGFzKGUpJiZ0aGlzLl9pbnN0YW5jZXMuZGVsZXRlKGUpfX1zdGF0aWN7dGhpcy5cdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KShFaShDViw4KSl9fXN0YXRpY3t0aGlzLlx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9fXJldHVybiB0fSkoKSx5Vj0oKCk9PntjbGFzcyB0e3N0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfX1zdGF0aWN7dGhpcy5cdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJnYWxsZXJ5LWNvdW50ZXIiXV0saW5wdXRzOntzdGF0ZToic3RhdGUifSxkZWNsczoyLHZhcnM6MSxjb25zdHM6W1sxLCJnLWNvdW50ZXIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihHdCgwLCJkaXYiLDApLG0oMSksSnQoKSksaSYyJiYobCgpLEEoYS5zdGF0ZS5jdXJySW5kZXgrMSsiIC8gIithLnN0YXRlLml0ZW1zLmxlbmd0aCkpfSxzdHlsZXM6WyIuZy1jb3VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo3MDA7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7b3BhY2l0eTouNjt0cmFuc2l0aW9uOm9wYWNpdHkgbGluZWFyIC4xNXM7ei1pbmRleDo1MDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUpIHBlcnNwZWN0aXZlKDFweCk7Zm9udC1zaXplOjEycHg7cGFkZGluZzo0cHggMTBweDtjb2xvcjp2YXIoLS1nLWZvbnQtY29sb3IpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tZy1vdmVybGF5LWNvbG9yKTtib3gtc2hhZG93OnZhcigtLWctYm94LXNoYWRvdyk7dG9wOnZhcigtLWNvdW50ZXItdG9wKTtib3R0b206dmFyKC0tY291bnRlci1ib3R0b20pO2JvcmRlci1yYWRpdXM6dmFyKC0tY291bnRlci1ib3JkZXItcmFkaXVzKX0uZy1jb3VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5Oi44fSJdLGNoYW5nZURldGVjdGlvbjowfSl9fXJldHVybiB0fSkoKSx4Vj0oKCk9PntjbGFzcyB0e2NvbnN0cnVjdG9yKGUpe3RoaXMuZ2FsbGVyeT1lfXN0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpKGl0KG9uKSl9fXN0YXRpY3t0aGlzLlx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImdhbGxlcnktYnVsbGV0cyJdXSxpbnB1dHM6e2dhbGxlcnlJZDoiZ2FsbGVyeUlkIixzdGF0ZToic3RhdGUiLGNvbmZpZzoiY29uZmlnIn0sZGVjbHM6MSx2YXJzOjEsY29uc3RzOltbImNsYXNzIiwiZy1idWxsZXQiLDMsImctYnVsbGV0LWFjdGl2ZSIsIndpZHRoIiwiaGVpZ2h0IiwiY2xpY2siLDQsIm5nRm9yIiwibmdGb3JPZiJdLFsxLCJnLWJ1bGxldCIsMywiY2xpY2siXSxbMSwiZy1idWxsZXQtaW5uZXIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJlIoMCxBUCwyLDYsImRpdiIsMCksaSYyJiZmKCJuZ0Zvck9mIixhLnN0YXRlLml0ZW1zKX0sZGVwZW5kZW5jaWVzOltEaSxCYV0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTt6LWluZGV4Ojk5O3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSk7ZGlzcGxheTpmbGV4O2dhcDo2cHg7dG9wOnZhcigtLWJ1bGxldHMtdG9wKTtib3R0b206dmFyKC0tYnVsbGV0cy1ib3R0b20pfVtfbmdob3N0LSVDT01QJV0sIC5nLWJ1bGxldFtfbmdjb250ZW50LSVDT01QJV0sIC5nLWJ1bGxldC1pbm5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS5nLWJ1bGxldFtfbmdjb250ZW50LSVDT01QJV17Y3Vyc29yOnZhcigtLWJ1bGxldHMtY3Vyc29yKTt6LWluZGV4OjIwfS5nLWJ1bGxldFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAuZy1idWxsZXQtaW5uZXJbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6dmFyKC0tYnVsbGV0cy1ob3Zlci1vcGFjaXR5KX0uZy1idWxsZXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5nLWJ1bGxldC1pbm5lcltfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTp2YXIoLS1idWxsZXRzLWFjdGl2ZS1vcGFjaXR5KX0uZy1idWxsZXQtaW5uZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dmFyKC0tZy1vdmVybGF5LWNvbG9yKTtvcGFjaXR5OnZhcigtLWJ1bGxldHMtb3BhY2l0eSk7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOm9wYWNpdHkgbGluZWFyIC4xNXN9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KX19cmV0dXJuIHR9KSgpLE1WPSgoKT0+e2NsYXNzIHR7Y29uc3RydWN0b3IoZSxpLGEpe3RoaXMuZ2FsbGVyeT1lLHRoaXMuX3Nhbml0aXplcj1pLHRoaXMuZGlyPWF9bmdPbkluaXQoKXt0aGlzLm5hdkljb249dGhpcy5fc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHRoaXMuY29uZmlnLm5hdkljb24pfXJpZ2h0QnV0dG9uKCl7fWxlZnRCdXR0b24oKXt9c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCkoaXQob24pLGl0KFoxKSxpdChuMSkpfX1zdGF0aWN7dGhpcy5cdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJnYWxsZXJ5LW5hdiJdXSxpbnB1dHM6e2lkOlswLCJnYWxsZXJ5SWQiLCJpZCJdLHN0YXRlOiJzdGF0ZSIsY29uZmlnOiJjb25maWcifSxkZWNsczoyLHZhcnM6Mixjb25zdHM6W1siY2xhc3MiLCJnLW5hdi1wcmV2IiwiYXJpYS1sYWJlbCIsIlByZXZpb3VzIiwicm9sZSIsImJ1dHRvbiIsMywiaW5uZXJIdG1sIiwiY2xpY2siLDQsIm5nSWYiXSxbImNsYXNzIiwiZy1uYXYtbmV4dCIsImFyaWEtbGFiZWwiLCJOZXh0Iiwicm9sZSIsImJ1dHRvbiIsMywiaW5uZXJIdG1sIiwiY2xpY2siLDQsIm5nSWYiXSxbImFyaWEtbGFiZWwiLCJQcmV2aW91cyIsInJvbGUiLCJidXR0b24iLDEsImctbmF2LXByZXYiLDMsImNsaWNrIiwiaW5uZXJIdG1sIl0sWyJhcmlhLWxhYmVsIiwiTmV4dCIsInJvbGUiLCJidXR0b24iLDEsImctbmF2LW5leHQiLDMsImNsaWNrIiwiaW5uZXJIdG1sIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiZSKDAsRFAsMSwxLCJpIiwwKSgxLElQLDEsMSwiaSIsMSksaSYyJiYoZigibmdJZiIsYS5jb25maWcubG9vcHx8YS5zdGF0ZS5oYXNQcmV2KSxsKCksZigibmdJZiIsYS5jb25maWcubG9vcHx8YS5zdGF0ZS5oYXNOZXh0KSl9LGRlcGVuZGVuY2llczpbRGksJGldLHN0eWxlczpbIi5nLW5hdi1uZXh0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLmctbmF2LXByZXZbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7ZGlzcGxheTpmbGV4O3BhZGRpbmc6MTZweCA4cHg7Y3Vyc29yOnBvaW50ZXI7ei1pbmRleDo5OTk7b3BhY2l0eTouNjt0cmFuc2l0aW9uOm9wYWNpdHkgbGluZWFyIC4xNXMscmlnaHQgbGluZWFyIC4xNXMsbGVmdCBsaW5lYXIgLjE1c30uZy1uYXYtbmV4dFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5nLW5hdi1wcmV2W19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5OjF9LmctbmF2LW5leHRbX25nY29udGVudC0lQ09NUCVdICAgICBzdmcsIC5nLW5hdi1wcmV2W19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgc3Zne2ZpbHRlcjp2YXIoLS1nLW5hdi1kcm9wLXNoYWRvdyk7d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtmaWxsOiNmZmZ9LmctbmF2LW5leHRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6dmFyKC0tbmF2LW5leHQtbGVmdCk7cmlnaHQ6dmFyKC0tbmF2LW5leHQtcmlnaHQpO3RyYW5zZm9ybTp2YXIoLS1uYXYtbmV4dC10cmFuc2Zvcm0pfS5nLW5hdi1uZXh0W19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntsZWZ0OnZhcigtLW5hdi1uZXh0LWhvdmVyLWxlZnQpO3JpZ2h0OnZhcigtLW5hdi1uZXh0LWhvdmVyLXJpZ2h0KX0uZy1uYXYtcHJldltfbmdjb250ZW50LSVDT01QJV17bGVmdDp2YXIoLS1uYXYtcHJldi1sZWZ0KTtyaWdodDp2YXIoLS1uYXYtcHJldi1yaWdodCk7dHJhbnNmb3JtOnZhcigtLW5hdi1wcmV2LXRyYW5zZm9ybSl9LmctbmF2LXByZXZbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2xlZnQ6dmFyKC0tbmF2LXByZXYtaG92ZXItbGVmdCk7cmlnaHQ6dmFyKC0tbmF2LXByZXYtaG92ZXItcmlnaHQpfSJdLGNoYW5nZURldGVjdGlvbjowfSl9fXJldHVybiB0fSkoKSx3Vj0yLFNWPTQsa1Y9OCx6Vj0xNixNYz1jbGFzc3tnZXQgc2Nyb2xsVmFsdWUoKXtyZXR1cm4gdGhpcy5zbGlkZXIuc2Nyb2xsTGVmdH1nZXQgY2xpZW50U2l6ZSgpe3JldHVybiB0aGlzLnNsaWRlci5jbGllbnRXaWR0aH1nZXQgaXNDb250ZW50TGVzc1RoYW5Db250YWluZXIoKXtyZXR1cm4gdGhpcy5jbGllbnRTaXplPj10aGlzLnNsaWRlci5maXJzdEVsZW1lbnRDaGlsZC5jbGllbnRXaWR0aH1jb25zdHJ1Y3RvcihuLGUpe3RoaXMuc2xpZGVyPW4sdGhpcy5jb25maWc9ZSx0aGlzLmhhbW1lckRpcmVjdGlvbj13VnxTVix0aGlzLnNjcm9sbFNuYXBUeXBlPSJ4IG1hbmRhdG9yeSJ9Z2V0U2Nyb2xsVG9WYWx1ZShuLGUpe2xldCBpPW4ub2Zmc2V0TGVmdC0odGhpcy5jbGllbnRTaXplLW4uY2xpZW50V2lkdGgpLzI7cmV0dXJue2JlaGF2aW9yOmUsc3RhcnQ6aX19Z2V0Um9vdE1hcmdpbigpe3JldHVybiIxMDAwcHggMXB4IDEwMDBweCAxcHgifWdldEVsZW1lbnRSb290TWFyZ2luKG4sZSl7bGV0IGk9LTEqKChuLmNsaWVudFdpZHRoLWUuY2xpZW50V2lkdGgpLzIpKzE7cmV0dXJuYDBweCAke2l9cHggMHB4ICR7aX1weGB9Z2V0Q2VudHJhbGl6ZXJTdGFydFNpemUoKXtyZXR1cm4gdGhpcy5pc0NvbnRlbnRMZXNzVGhhbkNvbnRhaW5lcj8odGhpcy5jbGllbnRTaXplLXRoaXMuc2xpZGVyLmZpcnN0RWxlbWVudENoaWxkLmNsaWVudFdpZHRoKS8yOnRoaXMuY2xpZW50U2l6ZS8yLXRoaXMuc2xpZGVyLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkPy5jbGllbnRXaWR0aC8yfWdldENlbnRyYWxpemVyRW5kU2l6ZSgpe3JldHVybiB0aGlzLmlzQ29udGVudExlc3NUaGFuQ29udGFpbmVyPyh0aGlzLmNsaWVudFNpemUtdGhpcy5zbGlkZXIuZmlyc3RFbGVtZW50Q2hpbGQuY2xpZW50V2lkdGgpLzI6dGhpcy5jbGllbnRTaXplLzItdGhpcy5zbGlkZXIuZmlyc3RFbGVtZW50Q2hpbGQubGFzdEVsZW1lbnRDaGlsZD8uY2xpZW50V2lkdGgvMn1nZXRIYW1tZXJWZWxvY2l0eShuKXtyZXR1cm4gbi52ZWxvY2l0eVh9Z2V0SGFtbWVyVmFsdWUobixlLGkpe3JldHVybntiZWhhdmlvcjppLGxlZnQ6bi1lLmRlbHRhWH19fSx3Yz1jbGFzc3tnZXQgc2Nyb2xsVmFsdWUoKXtyZXR1cm4gdGhpcy5zbGlkZXIuc2Nyb2xsVG9wfWdldCBjbGllbnRTaXplKCl7cmV0dXJuIHRoaXMuc2xpZGVyLmNsaWVudEhlaWdodH1nZXQgaXNDb250ZW50TGVzc1RoYW5Db250YWluZXIoKXtyZXR1cm4gdGhpcy5jbGllbnRTaXplPj10aGlzLnNsaWRlci5maXJzdEVsZW1lbnRDaGlsZC5jbGllbnRIZWlnaHR9Y29uc3RydWN0b3IobixlKXt0aGlzLnNsaWRlcj1uLHRoaXMuY29uZmlnPWUsdGhpcy5oYW1tZXJEaXJlY3Rpb249a1Z8elYsdGhpcy5zY3JvbGxTbmFwVHlwZT0ieSBtYW5kYXRvcnkifWdldFNjcm9sbFRvVmFsdWUobixlKXtsZXQgaT1uLm9mZnNldFRvcC0odGhpcy5jbGllbnRTaXplLW4uY2xpZW50SGVpZ2h0KS8yO3JldHVybntiZWhhdmlvcjplLHRvcDppfX1nZXRSb290TWFyZ2luKCl7cmV0dXJuIjFweCAxMDAwcHggMXB4IDEwMDBweCJ9Z2V0RWxlbWVudFJvb3RNYXJnaW4obixlKXtsZXQgaT0tMSooKG4uY2xpZW50SGVpZ2h0LWUuY2xpZW50SGVpZ2h0KS8yKSsxO3JldHVybmAke2l9cHggMHB4ICR7aX1weCAwcHhgfWdldENlbnRyYWxpemVyU3RhcnRTaXplKCl7cmV0dXJuIHRoaXMuaXNDb250ZW50TGVzc1RoYW5Db250YWluZXI/KHRoaXMuY2xpZW50U2l6ZS10aGlzLnNsaWRlci5maXJzdEVsZW1lbnRDaGlsZC5jbGllbnRIZWlnaHQpLzI6dGhpcy5jbGllbnRTaXplLzItdGhpcy5zbGlkZXIuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQ/LmNsaWVudEhlaWdodC8yfWdldENlbnRyYWxpemVyRW5kU2l6ZSgpe3JldHVybiB0aGlzLmlzQ29udGVudExlc3NUaGFuQ29udGFpbmVyPyh0aGlzLmNsaWVudFNpemUtdGhpcy5zbGlkZXIuZmlyc3RFbGVtZW50Q2hpbGQuY2xpZW50SGVpZ2h0KS8yOnRoaXMuY2xpZW50U2l6ZS8yLXRoaXMuc2xpZGVyLmZpcnN0RWxlbWVudENoaWxkLmxhc3RFbGVtZW50Q2hpbGQ/LmNsaWVudEhlaWdodC8yfWdldEhhbW1lclZlbG9jaXR5KG4pe3JldHVybiBuLnZlbG9jaXR5WX1nZXRIYW1tZXJWYWx1ZShuLGUsaSl7cmV0dXJue2JlaGF2aW9yOmksdG9wOm4tZS5kZWx0YVl9fX0sVFY9NCxFVj0uMDAxLEFWPTFlLTcsRFY9MTAsTDQ9MTEseWM9MS8oTDQtMSksSVY9dHlwZW9mIEZsb2F0MzJBcnJheT09ImZ1bmN0aW9uIjskZz0oKCk9PntjbGFzcyB0e2dldCBfdygpe3JldHVybiB0aGlzLl9kb2N1bWVudC5kZWZhdWx0Vmlld31nZXQgX25vdygpe3JldHVybiB0aGlzLl93LnBlcmZvcm1hbmNlPy5ub3c/LmJpbmQodGhpcy5fdy5wZXJmb3JtYW5jZSl8fERhdGUubm93fXNldCBzbW9vdGhTY3JvbGwoZSl7ZSYmdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e3RoaXMuc2Nyb2xsVG8oZSl9KX1jb25zdHJ1Y3RvcihlLGksYSxyKXt0aGlzLl9kb2N1bWVudD1lLHRoaXMuX3pvbmU9aSx0aGlzLl9kaXI9YSx0aGlzLl9zY3JvbGxDb250cm9sbGVyPW5ldyB3ZSx0aGlzLl9maW5pc2hlZD1uZXcgd2UsdGhpcy5pc1Njcm9sbGluZ0NoYW5nZT1uZXcgTix0aGlzLl9lbD1yLm5hdGl2ZUVsZW1lbnR9bmdPbkluaXQoKXt0aGlzLl9zdWJzY3JpcHRpb249dGhpcy5fc2Nyb2xsQ29udHJvbGxlci5waXBlKHExKGU9Pih0aGlzLl96b25lLnJ1bigoKT0+e3RoaXMuaXNTY3JvbGxpbmdDaGFuZ2UuZW1pdCghMCl9KSx0aGlzLl9lbC5jbGFzc0xpc3QuYWRkKCJnLXNjcm9sbGluZyIpLHRoaXMuX2VsLnN0eWxlLnNldFByb3BlcnR5KCItLXNsaWRlci1zY3JvbGwtc25hcC10eXBlIiwibm9uZSIpLGMxKG51bGwpLnBpcGUoSWQoKCk9PnRoaXMuX3N0ZXAoZSkucGlwZShWZChpPT50aGlzLl9pc0ZpbmlzaGVkKGkpKSx4dCh0aGlzLl9maW5pc2hlZCkpKSxMZCgoKT0+dGhpcy5yZXNldEVsZW1lbnQoKSkseHQodGhpcy5faW50ZXJydXB0ZWQoKSkpKSkpLnN1YnNjcmliZSgpfW5nT25EZXN0cm95KCl7dGhpcy5fc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpLHRoaXMuX3Njcm9sbENvbnRyb2xsZXIuY29tcGxldGUoKX1fc2Nyb2xsRWxlbWVudChlLGkpe3RoaXMuX2VsLnNjcm9sbExlZnQ9ZSx0aGlzLl9lbC5zY3JvbGxUb3A9aX1yZXNldEVsZW1lbnQoKXt0aGlzLl96b25lLnJ1bigoKT0+e3RoaXMuaXNTY3JvbGxpbmdDaGFuZ2UuZW1pdCghMSl9KSx0aGlzLl9lbC5jbGFzc0xpc3QucmVtb3ZlKCJnLXNjcm9sbGluZyIpLHRoaXMuX2lzSW50ZXJydXB0ZWRCeU1vdXNlfHx0aGlzLl9lbC5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1zbGlkZXItc2Nyb2xsLXNuYXAtdHlwZSIsdGhpcy5hZGFwdGVyLnNjcm9sbFNuYXBUeXBlKSx0aGlzLl9pc0ludGVycnVwdGVkQnlNb3VzZT0hMX1faXNGaW5pc2hlZChlKXtyZXR1cm4gZS5jdXJyZW50WCE9PWUueHx8ZS5jdXJyZW50WSE9PWUueT8hMDoodGhpcy5fZmluaXNoZWQubmV4dCgpLCExKX1faW50ZXJydXB0ZWQoKXtsZXQgZTtyZXR1cm4gdGhpcy5pbnRlcnJ1cHRPbk1vdXNlbW92ZSYmdHlwZW9mIEhhbW1lcjwidSI/KHRoaXMuX2hhbW1lcj1uZXcgSGFtbWVyKHRoaXMuX2VsLHtpbnB1dENsYXNzOkhhbW1lci5Nb3VzZUlucHV0fSksdGhpcy5faGFtbWVyLmdldCgicGFuIikuc2V0KHtkaXJlY3Rpb246dGhpcy5hZGFwdGVyLmhhbW1lckRpcmVjdGlvbn0pLGU9S3QobmV3IG1hKGk9Pih0aGlzLl9oYW1tZXIub24oInBhbnN0YXJ0IiwoKT0+e3RoaXMuX2lzSW50ZXJydXB0ZWRCeU1vdXNlPSEwLGkubmV4dCgpLGkuY29tcGxldGUoKX0pLCgpPT57dGhpcy5faGFtbWVyLmRlc3Ryb3koKX0pKSxOYSh0aGlzLl9lbCwid2hlZWwiLHtwYXNzaXZlOiEwLGNhcHR1cmU6ITB9KSxOYSh0aGlzLl9lbCwidG91Y2htb3ZlIix7cGFzc2l2ZTohMCxjYXB0dXJlOiEwfSkpKTplPUt0KE5hKHRoaXMuX2VsLCJ3aGVlbCIse3Bhc3NpdmU6ITAsY2FwdHVyZTohMH0pLE5hKHRoaXMuX2VsLCJ0b3VjaG1vdmUiLHtwYXNzaXZlOiEwLGNhcHR1cmU6ITB9KSksZS5waXBlKGoxKDEpKX1fc3RlcChlKXtyZXR1cm4gbmV3IG1hKGk9PntsZXQgYT0odGhpcy5fbm93KCktZS5zdGFydFRpbWUpL2UuZHVyYXRpb247YT1hPjE/MTphO2xldCByPWUuZWFzaW5nKGEpO2UuY3VycmVudFg9ZS5zdGFydFgrKGUueC1lLnN0YXJ0WCkqcixlLmN1cnJlbnRZPWUuc3RhcnRZKyhlLnktZS5zdGFydFkpKnIsdGhpcy5fc2Nyb2xsRWxlbWVudChlLmN1cnJlbnRYLGUuY3VycmVudFkpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2kubmV4dChlKSxpLmNvbXBsZXRlKCl9KX0pfV9hcHBseVNjcm9sbFRvT3B0aW9ucyhlKXtlLmR1cmF0aW9ufHx0aGlzLl9zY3JvbGxFbGVtZW50KGUubGVmdCxlLnRvcCk7bGV0IGk9e3Njcm9sbGFibGU6dGhpcy5fZWwsc3RhcnRUaW1lOnRoaXMuX25vdygpLHN0YXJ0WDp0aGlzLl9lbC5zY3JvbGxMZWZ0LHN0YXJ0WTp0aGlzLl9lbC5zY3JvbGxUb3AseDplLmxlZnQ9PW51bGw/dGhpcy5fZWwuc2Nyb2xsTGVmdDp+fmUubGVmdCx5OmUudG9wPT1udWxsP3RoaXMuX2VsLnNjcm9sbFRvcDp+fmUudG9wLGR1cmF0aW9uOmUuZHVyYXRpb24sZWFzaW5nOk9WKGUuZWFzaW5nLngxLGUuZWFzaW5nLnkxLGUuZWFzaW5nLngyLGUuZWFzaW5nLnkyKX07dGhpcy5fc2Nyb2xsQ29udHJvbGxlci5uZXh0KGkpfXNjcm9sbFRvKGUpe2xldCBpPXRoaXMuX2Rpci52YWx1ZT09PSJydGwiLGE9Ym0oKSxyPVUxKFhlKHt9LGUpLHtsZWZ0OmUubGVmdD09bnVsbD9pP2UuZW5kOmUuc3RhcnQ6ZS5sZWZ0LHJpZ2h0OmUucmlnaHQ9PW51bGw/aT9lLnN0YXJ0OmUuZW5kOmUucmlnaHQsZHVyYXRpb246ZS5iZWhhdmlvcj09PSJzbW9vdGgiP3RoaXMuY29uZmlnLnNjcm9sbER1cmF0aW9uOjAsZWFzaW5nOnRoaXMuY29uZmlnLnNjcm9sbEVhc2V9KTtyZXR1cm4gci5ib3R0b20hPW51bGwmJihyLnRvcD10aGlzLl9lbC5zY3JvbGxIZWlnaHQtdGhpcy5fZWwuY2xpZW50SGVpZ2h0LXIuYm90dG9tKSxpJiZhIT09UzAuTk9STUFMPyhyLmxlZnQhPW51bGwmJihyLnJpZ2h0PXRoaXMuX2VsLnNjcm9sbFdpZHRoLXRoaXMuX2VsLmNsaWVudFdpZHRoLXIubGVmdCksYT09PVMwLklOVkVSVEVEP3IubGVmdD1yLnJpZ2h0OmE9PT1TMC5ORUdBVEVEJiYoci5sZWZ0PXIucmlnaHQ/LXIucmlnaHQ6ci5yaWdodCkpOnIucmlnaHQhPW51bGwmJihyLmxlZnQ9dGhpcy5fZWwuc2Nyb2xsV2lkdGgtdGhpcy5fZWwuY2xpZW50V2lkdGgtci5yaWdodCksdGhpcy5fYXBwbHlTY3JvbGxUb09wdGlvbnMocil9c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCkoaXQoanQpLGl0KHJlKSxpdChrMCksaXQoYWUpKX19c3RhdGlje3RoaXMuXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siIiwic21vb3RoU2Nyb2xsIiwiIl1dLGlucHV0czp7c21vb3RoU2Nyb2xsOiJzbW9vdGhTY3JvbGwiLGFkYXB0ZXI6ImFkYXB0ZXIiLGNvbmZpZzoiY29uZmlnIixpbnRlcnJ1cHRPbk1vdXNlbW92ZTpbMCwic21vb3RoU2Nyb2xsSW50ZXJydXB0T25Nb3VzZW1vdmUiLCJpbnRlcnJ1cHRPbk1vdXNlbW92ZSJdfSxvdXRwdXRzOntpc1Njcm9sbGluZ0NoYW5nZToiaXNTY3JvbGxpbmdDaGFuZ2UifSxmZWF0dXJlczpbSWUoW2swXSldfSl9fXJldHVybiB0fSkoKSxLZz0oKCk9PntjbGFzcyB0e2dldCBfdmlld3BvcnQoKXtyZXR1cm4gdGhpcy5fZWwubmF0aXZlRWxlbWVudH1jb25zdHJ1Y3RvcihlLGksYSxyLG8pe3RoaXMuX2RvY3VtZW50PWUsdGhpcy5fZWw9aSx0aGlzLl9kaXI9YSx0aGlzLl9wbGF0Zm9ybT1yLHRoaXMuX3pvbmU9byx0aGlzLmFjdGl2ZUluZGV4Q2hhbmdlPW5ldyBOLHRoaXMuaXNTbGlkaW5nQ2hhbmdlPW5ldyBOfW5nT25DaGFuZ2VzKGUpe2UuZW5hYmxlZCYmZS5lbmFibGVkPy5jdXJyZW50VmFsdWUhPT1lLmVuYWJsZWQ/LnByZXZpb3VzVmFsdWUmJih0aGlzLmVuYWJsZWQ/dGhpcy5fc3Vic2NyaWJlKCk6dGhpcy5fdW5zdWJzY3JpYmUoKSksIWUuYWRhcHRlcj8uZmlyc3RDaGFuZ2UmJmUuYWRhcHRlcj8uY3VycmVudFZhbHVlIT09ZS5hZGFwdGVyPy5wcmV2aW91c1ZhbHVlJiYodGhpcy5lbmFibGVkP3RoaXMuX3N1YnNjcmliZSgpOnRoaXMuX3Vuc3Vic2NyaWJlKCkpfW5nT25EZXN0cm95KCl7dGhpcy5fdW5zdWJzY3JpYmUoKX1fc3Vic2NyaWJlKCl7dGhpcy5fdW5zdWJzY3JpYmUoKSwhdGhpcy5fcGxhdGZvcm0uQU5EUk9JRCYmIXRoaXMuX3BsYXRmb3JtLklPUyYmdHlwZW9mIEhhbW1lcjwidSImJnRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntsZXQgZT10aGlzLmFkYXB0ZXIuaGFtbWVyRGlyZWN0aW9uO3RoaXMuX2hhbW1lcj1uZXcgSGFtbWVyKHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQse2lucHV0Q2xhc3M6SGFtbWVyLk1vdXNlSW5wdXR9KSx0aGlzLl9oYW1tZXIuZ2V0KCJwYW4iKS5zZXQoe2RpcmVjdGlvbjplfSk7bGV0IGk7dGhpcy5faGFtbWVyLm9uKCJwYW5zdGFydCIsKCk9Pnt0aGlzLl96b25lLnJ1bigoKT0+e3RoaXMuaXNTbGlkaW5nQ2hhbmdlLmVtaXQoITApfSksaT10aGlzLmFkYXB0ZXIuc2Nyb2xsVmFsdWUsdGhpcy5fdmlld3BvcnQuY2xhc3NMaXN0LmFkZCgiZy1zbGlkaW5nIiksdGhpcy5fdmlld3BvcnQuc3R5bGUuc2V0UHJvcGVydHkoIi0tc2xpZGVyLXNjcm9sbC1zbmFwLXR5cGUiLCJub25lIil9KSx0aGlzLl9oYW1tZXIub24oInBhbm1vdmUiLGE9PnRoaXMuX3ZpZXdwb3J0LnNjcm9sbFRvKHRoaXMuYWRhcHRlci5nZXRIYW1tZXJWYWx1ZShpLGEsImF1dG8iKSkpLHRoaXMuX2hhbW1lci5vbigicGFuZW5kIixhPT57dGhpcy5fZG9jdW1lbnQub25zZWxlY3RzdGFydD1udWxsLHRoaXMuX3ZpZXdwb3J0LmNsYXNzTGlzdC5yZW1vdmUoImctc2xpZGluZyIpO2xldCByPXRoaXMuZ2V0SW5kZXhPbk1vdXNlVXAoYSk7dGhpcy5fem9uZS5ydW4oKCk9Pnt0aGlzLmlzU2xpZGluZ0NoYW5nZS5lbWl0KCExKSx0aGlzLmFjdGl2ZUluZGV4Q2hhbmdlLmVtaXQocil9KX0pfSl9X3Vuc3Vic2NyaWJlKCl7dGhpcy5faGFtbWVyPy5kZXN0cm95KCl9Z2V0SW5kZXhPbk1vdXNlVXAoZSl7bGV0IGk9dGhpcy5pdGVtc1t0aGlzLnN0YXRlLmN1cnJJbmRleF0ubmF0aXZlRWxlbWVudCxhPXRoaXMuZ2V0RWxlbWVudEZyb21WaWV3cG9ydENlbnRlcigpO2lmKGEmJmEhPT1pKXJldHVybithLmdldEF0dHJpYnV0ZSgiZ2FsbGVyeUluZGV4Iik7bGV0IHI9dGhpcy5hZGFwdGVyLmdldEhhbW1lclZlbG9jaXR5KGUpO3JldHVybiBNYXRoLmFicyhyKT4uMz90aGlzLmNvbmZpZy5vcmllbnRhdGlvbj09PVA0Lkhvcml6b250YWw/cj4wP3RoaXMuX2Rpci52YWx1ZT09PSJydGwiP3RoaXMuc3RhdGUuY3VyckluZGV4KzE6dGhpcy5zdGF0ZS5jdXJySW5kZXgtMTp0aGlzLl9kaXIudmFsdWU9PT0icnRsIj90aGlzLnN0YXRlLmN1cnJJbmRleC0xOnRoaXMuc3RhdGUuY3VyckluZGV4KzE6cj4wP3RoaXMuc3RhdGUuY3VyckluZGV4LTE6dGhpcy5zdGF0ZS5jdXJySW5kZXgrMTotMX1nZXRFbGVtZW50RnJvbVZpZXdwb3J0Q2VudGVyKCl7bGV0IGU9dGhpcy5fdmlld3BvcnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHRoaXMuX2RvY3VtZW50LmVsZW1lbnRzRnJvbVBvaW50KGUueCtlLndpZHRoLzIsZS55K2UuaGVpZ2h0LzIpLmZpbmQoYT0+YS5nZXRBdHRyaWJ1dGUoImdhbGxlcnlJZCIpPT09dGhpcy5nYWxsZXJ5SWQpfXN0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpKGl0KGp0KSxpdChhZSksaXQobjEpLGl0KGIxKSxpdChyZSkpfX1zdGF0aWN7dGhpcy5cdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJoYW1tZXJTbGlkaW5nIiwiIl1dLGlucHV0czp7ZW5hYmxlZDpbMCwiaGFtbWVyU2xpZGluZyIsImVuYWJsZWQiXSxnYWxsZXJ5SWQ6ImdhbGxlcnlJZCIsaXRlbXM6Iml0ZW1zIixhZGFwdGVyOiJhZGFwdGVyIixzdGF0ZToic3RhdGUiLGNvbmZpZzoiY29uZmlnIn0sb3V0cHV0czp7YWN0aXZlSW5kZXhDaGFuZ2U6ImFjdGl2ZUluZGV4Q2hhbmdlIixpc1NsaWRpbmdDaGFuZ2U6ImlzU2xpZGluZ0NoYW5nZSJ9LGZlYXR1cmVzOltIZV19KX19cmV0dXJuIHR9KSgpLGtjPWNsYXNze29ic2VydmUobixlLGkpe3JldHVybiBIVihuLGUsaSkucGlwZShxKGE9PmEuaXNJbnRlcnNlY3Rpbmc/KGEudGFyZ2V0LmNsYXNzTGlzdC5hZGQoImctaXRlbS1oaWdobGlnaHQiKSwrYS50YXJnZXQuZ2V0QXR0cmlidXRlKCJnYWxsZXJ5SW5kZXgiKSk6KGEudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoImctaXRlbS1oaWdobGlnaHQiKSwtMSkpLCR0KGE9PmEhPT0tMSkpfX07TlY9KCgpPT57Y2xhc3MgdHtnZXQgX3ZpZXdwb3J0KCl7cmV0dXJuIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnR9Y29uc3RydWN0b3IoZSxpKXt0aGlzLl96b25lPWUsdGhpcy5fZWw9aSx0aGlzLl9zZW5zb3I9bmV3IGtjLHRoaXMuYWN0aXZlSW5kZXhDaGFuZ2U9bmV3IE59bmdPbkNoYW5nZXMoKXt0aGlzLmNvbmZpZy5pdGVtQXV0b3NpemV8fHRoaXMuZGlzYWJsZWQ/dGhpcy5fdW5zdWJzY3JpYmUoKTp0aGlzLl9zdWJzY3JpYmUoKX1uZ09uRGVzdHJveSgpe3RoaXMuX3Vuc3Vic2NyaWJlKCl9X3N1YnNjcmliZSgpe2lmKHRoaXMuX3Vuc3Vic2NyaWJlKCksdGhpcy5hZGFwdGVyJiZ0aGlzLml0ZW1zPy5sZW5ndGgpe2xldCBlPXRoaXMuYWRhcHRlci5nZXRSb290TWFyZ2luKCk7dGhpcy5jb25maWcuZGVidWcmJnRoaXMuX3ZpZXdwb3J0LnN0eWxlLnNldFByb3BlcnR5KCItLWludGVyc2VjdGlvbi1tYXJnaW4iLGAiSU5URVJTRUNUSU9OKCR7ZX0pImApLHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLl9jdXJyZW50U3Vic2NyaXB0aW9uPXRoaXMuX3NlbnNvci5vYnNlcnZlKHRoaXMuX3ZpZXdwb3J0LHRoaXMuaXRlbXMubWFwKGk9PmkubmF0aXZlRWxlbWVudCksZSkuc3Vic2NyaWJlKGk9Pnt0aGlzLl96b25lLnJ1bigoKT0+dGhpcy5hY3RpdmVJbmRleENoYW5nZS5lbWl0KGkpKX0pfSl9fV91bnN1YnNjcmliZSgpe3RoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCl9c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCkoaXQocmUpLGl0KGFlKSl9fXN0YXRpY3t0aGlzLlx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsInNsaWRlckludGVyc2VjdGlvbk9ic2VydmVyIiwiIl1dLGlucHV0czp7YWRhcHRlcjoiYWRhcHRlciIsaXRlbXM6Iml0ZW1zIixjb25maWc6ImNvbmZpZyIsZGlzYWJsZWQ6WzAsInNsaWRlckludGVyc2VjdGlvbk9ic2VydmVyRGlzYWJsZWQiLCJkaXNhYmxlZCJdfSxvdXRwdXRzOnthY3RpdmVJbmRleENoYW5nZToiYWN0aXZlSW5kZXhDaGFuZ2UifSxmZWF0dXJlczpbSGVdfSl9fXJldHVybiB0fSkoKTtSVj0oKCk9PntjbGFzcyB0e3NldCBzcmMoZSl7dGhpcy52aWRlb1NyYz1lLHRoaXMuaWZyYW1lU3JjPXRoaXMuX3Nhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoZSl9c2V0IHBhdXNlVmlkZW8oZSl7aWYodGhpcy5pZnJhbWU/Lm5hdGl2ZUVsZW1lbnQmJmUpe2xldCBpPXRoaXMuaWZyYW1lLm5hdGl2ZUVsZW1lbnQ7aS5zcmM9bnVsbCwhdGhpcy5hdXRvcGxheSYmdGhpcy52aWRlb1NyYyYmKHRoaXMuaWZyYW1lU3JjPXRoaXMuX3Nhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodGhpcy52aWRlb1NyYykpfX1jb25zdHJ1Y3RvcihlKXt0aGlzLl9zYW5pdGl6ZXI9ZX1zdGF0aWN7dGhpcy5cdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KShpdChaMSkpfX1zdGF0aWN7dGhpcy5cdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJnYWxsZXJ5LWlmcmFtZSJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJnRlKExQLDUpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLmlmcmFtZT1yLmZpcnN0KX19LGlucHV0czp7c3JjOiJzcmMiLHBhdXNlVmlkZW86WzAsInBhdXNlIiwicGF1c2VWaWRlbyJdLGF1dG9wbGF5OiJhdXRvcGxheSIsbG9hZGluZ0F0dHI6ImxvYWRpbmdBdHRyIn0sZGVjbHM6Myx2YXJzOjIsY29uc3RzOltbImRlZmF1bHQiLCIiXSxbImlmcmFtZSIsIiJdLFsiYWxsb3dmdWxsc2NyZWVuIiwiIiwiYWxsb3ciLCIiLCJzdHlsZSIsImJvcmRlcjpub25lIiwzLCJzcmMiLDQsIm5nSWYiLCJuZ0lmRWxzZSJdLFsiYWxsb3dmdWxsc2NyZWVuIiwiIiwiYWxsb3ciLCIiLDIsImJvcmRlciIsIm5vbmUiLDMsInNyYyJdLFsiYWxsb3dmdWxsc2NyZWVuIiwiIiwyLCJib3JkZXIiLCJub25lIiwzLCJzcmMiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJlIoMCxQUCwyLDIsImlmcmFtZSIsMikoMSxWUCwyLDIsIm5nLXRlbXBsYXRlIixudWxsLDAsUTIpLGkmMil7bGV0IHI9c2UoMik7ZigibmdJZiIsYS5hdXRvcGxheSkoIm5nSWZFbHNlIixyKX19LGRlcGVuZGVuY2llczpbJGldLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pfX1yZXR1cm4gdH0pKCksRlY9KCgpPT57Y2xhc3MgdHtjb25zdHJ1Y3Rvcigpe3RoaXMuZXJyb3I9bmV3IE59c2V0IHBhdXNlVmlkZW8oZSl7aWYodGhpcy52aWRlby5uYXRpdmVFbGVtZW50KXtsZXQgaT10aGlzLnZpZGVvLm5hdGl2ZUVsZW1lbnQ7ZSYmIWkucGF1c2VkJiZpLnBhdXNlKCl9fXNldCBwbGF5VmlkZW8oZSl7aWYodGhpcy52aWRlby5uYXRpdmVFbGVtZW50KXtsZXQgaT10aGlzLnZpZGVvLm5hdGl2ZUVsZW1lbnQ7ZSYmaS5wbGF5KCl9fW5nT25Jbml0KCl7dGhpcy5zcmMgaW5zdGFuY2VvZiBBcnJheT90aGlzLnZpZGVvU291cmNlcz1bLi4udGhpcy5zcmNdOnRoaXMudmlkZW9Tb3VyY2VzPVt7dXJsOnRoaXMuc3JjfV19c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9fXN0YXRpY3t0aGlzLlx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImdhbGxlcnktdmlkZW8iXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiZ0ZShPUCw3KSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS52aWRlbz1yLmZpcnN0KX19LGlucHV0czp7c3JjOiJzcmMiLHBvc3RlcjoicG9zdGVyIixtdXRlOiJtdXRlIixsb29wOiJsb29wIixjb250cm9sczoiY29udHJvbHMiLGNvbnRyb2xzTGlzdDoiY29udHJvbHNMaXN0IixkaXNhYmxlUmVtb3RlUGxheWJhY2s6ImRpc2FibGVSZW1vdGVQbGF5YmFjayIsZGlzYWJsZVBpY3R1cmVJblBpY3R1cmU6ImRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIixwYXVzZVZpZGVvOlswLCJwYXVzZSIsInBhdXNlVmlkZW8iXSxwbGF5VmlkZW86WzAsInBsYXkiLCJwbGF5VmlkZW8iXX0sb3V0cHV0czp7ZXJyb3I6ImVycm9yIn0sZGVjbHM6Myx2YXJzOjgsY29uc3RzOltbInZpZGVvIiwiIl0sWyJub1R5cGUiLCIiXSxbMywiZXJyb3IiLCJkaXNhYmxlUmVtb3RlUGxheWJhY2siLCJjb250cm9scyIsImxvb3AiLCJwb3N0ZXIiXSxbNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzMsInNyYyIsInR5cGUiLDQsIm5nSWYiLCJuZ0lmRWxzZSJdLFszLCJzcmMiLCJ0eXBlIl0sWzMsInNyYyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO2MoMCwidmlkZW8iLDIsMCksUygiZXJyb3IiLGZ1bmN0aW9uKGQpe3JldHVybiB6KHIpLFQoYS5lcnJvci5lbWl0KGQpKX0pLFIoMixSUCw0LDIsIm5nLWNvbnRhaW5lciIsMykscygpfWkmMiYmKGYoImRpc2FibGVSZW1vdGVQbGF5YmFjayIsYS5kaXNhYmxlUmVtb3RlUGxheWJhY2spKCJjb250cm9scyIsYS5jb250cm9scykoImxvb3AiLGEubG9vcCkoInBvc3RlciIsYS5wb3N0ZXIsd3QpLEcoIm11dGUiLGEubXV0ZSkoImNvbnRyb2xzTGlzdCIsYS5jb250cm9sc0xpc3QpKCJkaXNhYmxlUGljdHVyZUluUGljdHVyZSIsYS5kaXNhYmxlUGljdHVyZUluUGljdHVyZSksbCgyKSxmKCJuZ0Zvck9mIixhLnZpZGVvU291cmNlcykpfSxkZXBlbmRlbmNpZXM6W0JhLCRpXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX19cmV0dXJuIHR9KSgpLEJWPWA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pgo8c3ZnIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS40MDY2IDEuNDA2Nikgc2NhbGUoMi44MSkiPgoJPHBhdGggZD0ibTc0LjQ1MyA0OC42MjdjLTUuNTM4IDAtMTEuMDc1LTIuMTA3LTE1LjI5MS02LjMyNC02LjExLTYuMTEtNy43NjgtMTQuOTktNS4wMjQtMjIuNjI5aC00OC4wOGMtMy4zNDYgMWUtMyAtNi4wNTggMi43MTMtNi4wNTggNi4wNTl2MTYuMzIybDIzLjgzNCAyMC4zMTVjMi4yNzggMS45NDIgNS41NzMgMi4xMTkgOC4wNDcgMC40MzRsMTQuMzgyLTkuODAxYzIuMzMtMS41ODggNS40MDgtMS41MzEgNy42NzcgMC4xNDFsMjcuMTUgMjAuMDAxdi0yNS41NzRjLTIuMTU2IDAuNjkyLTQuMzk0IDEuMDU2LTYuNjM3IDEuMDU2eiIgZmlsbD0iI2MxZTVmNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiA8Y2lyY2xlIGN4PSIyNy45NDIiIGN5PSIzNy45NDIiIHI9IjYuMDcyIiBmaWxsPSIjZmZmMGE5Ii8+CiA8cGF0aCBkPSJtODUuNDQ2IDE2LjAyYy02LjA2MS02LjA2MS0xNS45MjItNi4wNjEtMjEuOTgzIDBzLTYuMDYxIDE1LjkyMyAwIDIxLjk4NGMzLjAzMSAzLjAzMSA3LjAxMSA0LjU0NiAxMC45OTIgNC41NDYgMy45OCAwIDcuOTYyLTEuNTE1IDEwLjk5Mi00LjU0NSAyLjkzNi0yLjkzNyA0LjU1My02Ljg0MSA0LjU1My0xMC45OTNzLTEuNjE3LTguMDU2LTQuNTU0LTEwLjk5MnptLTMuNTU1IDMuNTU1YzEuOTg3IDEuOTg2IDMuMDgxIDQuNjI3IDMuMDgxIDcuNDM2IDAgMS45NS0wLjUzOCAzLjgxMy0xLjUyNSA1LjQzOGwtMTQuNDI4LTE0LjQyOGM0LjA0My0yLjQ0MiA5LjM4NC0xLjkzNCAxMi44NzIgMS41NTR6bS0xNC44NzMgMTQuODc0Yy0zLjQ4Ni0zLjQ4Ny0zLjk5Ny04LjgyOS0xLjU1NC0xMi44NzNsMTQuNDI2IDE0LjQyN2MtNC4wNDMgMi40NDMtOS4zODUgMS45MzItMTIuODcyLTEuNTU0eiIgZmlsbD0iI2UyOTM5MyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiA8cGF0aCBkPSJtMCA0MC4wNDN2MzIuNDI1YzAgMy4zNDYgMi43MTIgNi4wNTggNi4wNTggNi4wNThoNjguOTc0YzMuMzQ2IDAgNi4wNTgtMi43MTIgNi4wNTgtNi4wNTh2LTEuMzM1bC0yNy4xNS0yMC4wMDFjLTIuMjctMS42NzItNS4zNDgtMS43MjktNy42NzctMC4xNDFsLTE0LjM4MyA5LjgwMWMtMi40NzMgMS42ODYtNS43NjkgMS41MDgtOC4wNDctMC40MzRsLTIzLjgzMy0yMC4zMTV6IiBmaWxsPSIjOTZlYTljIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KPC9nPgo8L3N2Zz4KYCxFYz0oKCk9PntjbGFzcyB0e2NvbnN0cnVjdG9yKCl7dGhpcy50cmlnZ2VyJD1uZXcgZDIobnVsbCksdGhpcy5pbWFnZXM9bmV3IE1hcH1nZXRBY3RpdmVJdGVtKGUpe3JldHVybiB0aGlzLnRyaWdnZXIkLnBpcGUocTEoKCk9PmUucGlwZShxMShpPT57bGV0IGE9dGhpcy5pbWFnZXMuZ2V0KGkuY3VyckluZGV4KTtyZXR1cm4gYT9hLnN0YXRlLnBpcGUoJHQocj0+ciE9PSJsb2FkaW5nIikscSgoKT0+YS50YXJnZXQpKTpIaX0pKSkpfWFkZEl0ZW0oZSxpKXt0aGlzLmltYWdlcy5zZXQoZSxpKSx0aGlzLnRyaWdnZXIkLm5leHQoKX1kZWxldGVJdGVtKGUpe3RoaXMuaW1hZ2VzLmhhcyhlKSYmKHRoaXMuaW1hZ2VzLmRlbGV0ZShlKSx0aGlzLnRyaWdnZXIkLm5leHQoKSl9c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9fXN0YXRpY3t0aGlzLlx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjfSl9fXJldHVybiB0fSkoKSxVVj0oKCk9PntjbGFzcyB0e29uTG9hZCgpe3RoaXMuaXRlbS5zdGF0ZSQubmV4dCgic3VjY2VzcyIpfW9uRXJyb3IoKXt0aGlzLml0ZW0uc3RhdGUkLm5leHQoImZhaWxlZCIpfWNvbnN0cnVjdG9yKGUsaSxhKXtpZih0aGlzLmVsPWUsdGhpcy5tYW5hZ2VyPWksdGhpcy5pdGVtPWEsYSlhLmlzSXRlbUNvbnRhaW5JbWFnZT0hMDtlbHNlIHRocm93IG5ldyBFcnJvcigiW05nR2FsbGVyeV06IGdhbGxlcnlJbWFnZSBkaXJlY3RpdmUgc2hvdWxkIGJlIG9ubHkgdXNlZCBpbnNpZGUgZ2FsbGVyeSBpdGVtIHRlbXBsYXRlcyEiKX1uZ09uSW5pdCgpe3RoaXMubWFuYWdlci5hZGRJdGVtKHRoaXMuaW5kZXgse3N0YXRlOnRoaXMuaXRlbS5zdGF0ZSQuYXNPYnNlcnZhYmxlKCksdGFyZ2V0OnRoaXMuZWwubmF0aXZlRWxlbWVudH0pfW5nT25EZXN0cm95KCl7dGhpcy5tYW5hZ2VyLmRlbGV0ZUl0ZW0odGhpcy5pbmRleCl9c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCkoaXQoYWUpLGl0KEVjKSxpdChUYykpfX1zdGF0aWN7dGhpcy5cdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyJpbWciLCJnYWxsZXJ5SW1hZ2UiLCIiXV0saG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGksYSl7aSYxJiZTKCJsb2FkIixmdW5jdGlvbihvKXtyZXR1cm4gYS5vbkxvYWQobyl9KSgiZXJyb3IiLGZ1bmN0aW9uKG8pe3JldHVybiBhLm9uRXJyb3Iobyl9KX0saW5wdXRzOntpbmRleDpbMCwiZ2FsbGVyeUltYWdlIiwiaW5kZXgiXX19KX19cmV0dXJuIHR9KSgpLFhnPSgoKT0+e2NsYXNzIHR7Z2V0IGltYWdlU3RhdGUoKXtyZXR1cm4gdGhpcy5zdGF0ZX1jb25zdHJ1Y3RvcihlKXt0aGlzLl9zYW5pdGl6ZXI9ZSx0aGlzLnN0YXRlPSJsb2FkaW5nIix0aGlzLmVycm9ySWNvbj1CVix0aGlzLmVycm9yPW5ldyBOfW5nT25Jbml0KCl7dGhpcy5sb2FkaW5nSWNvbiYmKHRoaXMubG9hZGVyVGVtcGxhdGU9dGhpcy5fc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHRoaXMubG9hZGluZ0ljb24pKSx0aGlzLmxvYWRpbmdFcnJvciYmKHRoaXMuZXJyb3JUZW1wbGF0ZT10aGlzLl9zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5sb2FkaW5nRXJyb3IpKSx0aGlzLmVycm9ySWNvbiYmKHRoaXMuZXJyb3JTdmc9dGhpcy5fc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHRoaXMuZXJyb3JJY29uKSl9c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCkoaXQoWjEpKX19c3RhdGlje3RoaXMuXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siZ2FsbGVyeS1pbWFnZSJdXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmRygiaW1hZ2VTdGF0ZSIsYS5pbWFnZVN0YXRlKX0saW5wdXRzOntpc1RodW1ibmFpbDoiaXNUaHVtYm5haWwiLGluZGV4OiJpbmRleCIsbG9hZGluZ0F0dHI6ImxvYWRpbmdBdHRyIixhbHQ6ImFsdCIsc3JjOiJzcmMiLGxvYWRpbmdJY29uOiJsb2FkaW5nSWNvbiIsbG9hZGluZ0Vycm9yOiJsb2FkaW5nRXJyb3IiLGVycm9ySWNvbjoiZXJyb3JJY29uIn0sb3V0cHV0czp7ZXJyb3I6ImVycm9yIn0sZGVjbHM6Nix2YXJzOjUsY29uc3RzOltbIm1haW4iLCIiXSxbImRlZmF1bHRFcnJvciIsIiJdLFsiaXNMYXJnZSIsIiJdLFsiZGVmYXVsdExvYWRlciIsIiJdLFszLCJuZ1N3aXRjaCJdLFs0LCJuZ0lmIiwibmdJZkVsc2UiXSxbImNsYXNzIiwiZy1pbWFnZS1lcnJvci1tZXNzYWdlIiw0LCJuZ1N3aXRjaENhc2UiXSxbNCwibmdTd2l0Y2hDYXNlIl0sWzEsImctaW1hZ2UtaXRlbSIsMywibG9hZCIsImVycm9yIiwic3JjIl0sWzEsImctaW1hZ2UtaXRlbSIsMywibG9hZCIsImVycm9yIiwiZ2FsbGVyeUltYWdlIiwic3JjIl0sWzEsImctaW1hZ2UtZXJyb3ItbWVzc2FnZSJdLFszLCJpbm5lckhUTUwiLDQsIm5nSWYiLCJuZ0lmRWxzZSJdLFszLCJpbm5lckhUTUwiXSxbMSwiZ2FsbGVyeS10aHVtYi1lcnJvciIsMywiaW5uZXJIVE1MIl0sWzEsImdhbGxlcnktaW1hZ2UtZXJyb3IiLDMsImlubmVySFRNTCJdLFsiY2xhc3MiLCJnLWxvYWRpbmciLDMsImlubmVySFRNTCIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWzEsImctbG9hZGluZyIsMywiaW5uZXJIVE1MIl0sWyJjbGFzcyIsImctdGh1bWItbG9hZGluZyIsNCwibmdJZiJdLFsxLCJnLXRodW1iLWxvYWRpbmciXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJihfZSgwLDQpLFIoMSxGUCwyLDYsIm5nLWNvbnRhaW5lciIsNSkoMixCUCwxLDcsIm5nLXRlbXBsYXRlIixudWxsLDAsUTIpKDQsV1AsNCwyLCJkaXYiLDYpKDUsJFAsNCwyLCJuZy1jb250YWluZXIiLDcpLGJlKCkpLGkmMil7bGV0IHI9c2UoMyk7ZigibmdTd2l0Y2giLGEuc3RhdGUpLGwoKSxmKCJuZ0lmIixhLmlzVGh1bWJuYWlsKSgibmdJZkVsc2UiLHIpLGwoMyksZigibmdTd2l0Y2hDYXNlIiwiZmFpbGVkIiksbCgpLGYoIm5nU3dpdGNoQ2FzZSIsImxvYWRpbmciKX19LGRlcGVuZGVuY2llczpbXzAsYjAsJGksVVZdLHN0eWxlczpbJ1tfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWF4LWhlaWdodDoxMDAlO21heC13aWR0aDoxMDAlO3RyYW5zaXRpb246b3BhY2l0eSAuM3MgY3ViaWMtYmV6aWVyKC41LDAsLjUsMSk7b3BhY2l0eTp2YXIoLS1nLXRodW1iLW9wYWNpdHkpfVtpbWFnZVN0YXRlPXN1Y2Nlc3NdW19uZ2hvc3QtJUNPTVAlXXthbGlnbi1zZWxmOmNlbnRlcn1bX25naG9zdC0lQ09NUCVdICAgICBzdmd7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0uZ2FsbGVyeS1pbWFnZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwcHg7aGVpZ2h0OjEwMHB4fS5nYWxsZXJ5LXRodW1iLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDo0MHB4O2hlaWdodDo0MHB4fWltZy5nLWltYWdlLWl0ZW1bX25nY29udGVudC0lQ09NUCVde29iamVjdC1maXQ6dmFyKC0taW1hZ2Utb2JqZWN0LWZpdCk7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtwb2ludGVyLWV2ZW50czpub25lO21heC1oZWlnaHQ6MTAwJTttYXgtd2lkdGg6MTAwJX0uZy1pbWFnZS1lcnJvci1tZXNzYWdlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwO2luc2V0OjA7Y29sb3I6I2ZmZjtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7ZmxleC1kaXJlY3Rpb246Y29sdW1ufWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgaDRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmNvcmFsO21hcmdpbjowfWgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6My41ZW07bWFyZ2luLWJvdHRvbTouM2VtfWg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MS42ZW19LmctbG9hZGluZ1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01MCUsLTUwJSwwKTtsZWZ0OjUwJTt0b3A6NTAlO3dpZHRoOjgwcHg7aGVpZ2h0OjgwcHh9LmctYWN0aXZlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5nLXRodW1iLWxvYWRpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzQ2NDY0Nn0uZy10aHVtYi1sb2FkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiMyNjI2MjZ9LmctdGh1bWItbG9hZGluZ1tfbmdjb250ZW50LSVDT01QJV06YmVmb3Jle2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MCAwIDAgNTAlO3otaW5kZXg6MTt3aWR0aDo1MDAlO21hcmdpbi1sZWZ0Oi0yNTAlO2FuaW1hdGlvbjpfbmdjb250ZW50LSVDT01QJV9waEFuaW1hdGlvbiAuOHMgbGluZWFyIGluZmluaXRlO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCNmZmYwIDQ2JSwjZmZmZmZmNTksI2ZmZjAgNTQlKSA1MCUgNTAlfUBrZXlmcmFtZXMgX25nY29udGVudC0lQ09NUCVfcGhBbmltYXRpb257MCV7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0zMCUsMCwwKX10b3t0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMzAlLDAsMCl9fSddLGRhdGE6e2FuaW1hdGlvbjpbZzQoImZhZGVJbiIsW0pyKCIqID0+IHN1Y2Nlc3MiLFtzYSh7b3BhY2l0eTowfSksWHIoIjMwMG1zIGVhc2UtaW4iLHNhKHtvcGFjaXR5OjF9KSldKV0pXX0sY2hhbmdlRGV0ZWN0aW9uOjB9KX19cmV0dXJuIHR9KSgpLFRjPSgoKT0+e2NsYXNzIHR7Z2V0IGlzQWN0aXZlKCl7cmV0dXJuIHRoaXMuaW5kZXg9PT10aGlzLmN1cnJJbmRleH1nZXQgaXNJbmRleEF0dHIoKXtyZXR1cm4gdGhpcy5pbmRleH1nZXQgaXRlbVN0YXRlKCl7cmV0dXJuIHRoaXMuc3RhdGUkLnZhbHVlfWdldCBpbWFnZUNvbnRleHQoKXtyZXR1cm57JGltcGxpY2l0OnRoaXMuaW1hZ2VEYXRhLGluZGV4OnRoaXMuaW5kZXgsdHlwZTp0aGlzLnR5cGUsYWN0aXZlOnRoaXMuaXNBY3RpdmUsY291bnQ6dGhpcy5jb3VudCxmaXJzdDp0aGlzLmluZGV4PT09MCxsYXN0OnRoaXMuaW5kZXg9PT10aGlzLmNvdW50LTF9fWdldCBpdGVtQ29udGV4dCgpe3JldHVybnskaW1wbGljaXQ6dGhpcy5kYXRhLGluZGV4OnRoaXMuaW5kZXgsdHlwZTp0aGlzLnR5cGUsYWN0aXZlOnRoaXMuaXNBY3RpdmUsY291bnQ6dGhpcy5jb3VudCxmaXJzdDp0aGlzLmluZGV4PT09MCxsYXN0OnRoaXMuaW5kZXg9PT10aGlzLmNvdW50LTF9fWdldCBuYXRpdmVFbGVtZW50KCl7cmV0dXJuIHRoaXMuZWwubmF0aXZlRWxlbWVudH1nZXQgaXNBdXRvUGxheSgpe2lmKHRoaXMuaXNBY3RpdmUmJih0aGlzLnR5cGU9PT13Mi5WaWRlb3x8dGhpcy50eXBlPT09dzIuWW91dHViZXx8dGhpcy50eXBlPT09dzIuVmltZW8pKXJldHVybiB0aGlzLnZpZGVvRGF0YS5hdXRvcGxheX1nZXQgeW91dHViZVNyYygpe2xldCBlPTA7dGhpcy5pc0FjdGl2ZSYmdGhpcy50eXBlPT09dzIuWW91dHViZSYmdGhpcy5kYXRhLmF1dG9wbGF5JiYoZT0xKTtsZXQgaT1uZXcgVVJMKHRoaXMuZGF0YS5zcmMpO3JldHVybiBpLnNlYXJjaD1uZXcgVVJMU2VhcmNoUGFyYW1zKFUxKFhlKHt3bW9kZToidHJhbnNwYXJlbnQifSx0aGlzLmRhdGEucGFyYW1zKSx7YXV0b3BsYXk6ZX0pKS50b1N0cmluZygpLGkuaHJlZn1nZXQgdmltZW9TcmMoKXtsZXQgZT0wO3RoaXMuaXNBY3RpdmUmJnRoaXMudHlwZT09PXcyLlZpbWVvJiZ0aGlzLmRhdGEuYXV0b3BsYXkmJihlPTEpO2xldCBpPW5ldyBVUkwodGhpcy5kYXRhLnNyYyk7cmV0dXJuIGkuc2VhcmNoPW5ldyBVUkxTZWFyY2hQYXJhbXMoVTEoWGUoe30sdGhpcy5kYXRhLnBhcmFtcykse2F1dG9wbGF5OmV9KSkudG9TdHJpbmcoKSxpLmhyZWZ9Z2V0IGxvYWQoKXtzd2l0Y2godGhpcy5jb25maWcubG9hZGluZ1N0cmF0ZWd5KXtjYXNlIHhjLlByZWxvYWQ6cmV0dXJuITA7Y2FzZSB4Yy5MYXp5OnJldHVybiB0aGlzLmN1cnJJbmRleD09PXRoaXMuaW5kZXg7ZGVmYXVsdDpyZXR1cm4gdGhpcy5jdXJySW5kZXg9PT10aGlzLmluZGV4fHx0aGlzLmN1cnJJbmRleD09PXRoaXMuaW5kZXgtMXx8dGhpcy5jdXJySW5kZXg9PT10aGlzLmluZGV4KzF9fWdldCBpbWFnZURhdGEoKXtyZXR1cm4gdGhpcy5kYXRhfWdldCB2aWRlb0RhdGEoKXtyZXR1cm4gdGhpcy5kYXRhfWNvbnN0cnVjdG9yKGUpe3RoaXMuZWw9ZSx0aGlzLlR5cGVzPXcyLHRoaXMuc3RhdGUkPW5ldyBkMigibG9hZGluZyIpLHRoaXMuZXJyb3I9bmV3IE59bmdBZnRlclZpZXdJbml0KCl7dGhpcy5pc0l0ZW1Db250YWluSW1hZ2V8fHRoaXMuc3RhdGUkLm5leHQoInN1Y2Nlc3MiKX1zdGF0aWN7dGhpcy5cdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KShpdChhZSkpfX1zdGF0aWN7dGhpcy5cdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJnYWxsZXJ5LWl0ZW0iXV0saG9zdFZhcnM6NCxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJihHKCJnYWxsZXJ5SW5kZXgiLGEuaXNJbmRleEF0dHIpKCJpdGVtU3RhdGUiLGEuaXRlbVN0YXRlKSxpZSgiZy1hY3RpdmUtaXRlbSIsYS5pc0FjdGl2ZSkpfSxpbnB1dHM6e2NvbmZpZzoiY29uZmlnIixpbmRleDoiaW5kZXgiLGNvdW50OiJjb3VudCIsY3VyckluZGV4OiJjdXJySW5kZXgiLHR5cGU6InR5cGUiLGRhdGE6ImRhdGEifSxvdXRwdXRzOntlcnJvcjoiZXJyb3IifSxkZWNsczoxLHZhcnM6MSxjb25zdHM6W1szLCJuZ1N3aXRjaCIsNCwibmdJZiJdLFszLCJuZ1N3aXRjaCJdLFs0LCJuZ1N3aXRjaENhc2UiXSxbMywic3JjIiwibXV0ZSIsInBvc3RlciIsImNvbnRyb2xzIiwiY29udHJvbHNMaXN0IiwiZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUiLCJwbGF5IiwicGF1c2UiLCJlcnJvciIsNCwibmdTd2l0Y2hDYXNlIl0sWzMsInNyYyIsImF1dG9wbGF5IiwibG9hZGluZ0F0dHIiLCJwYXVzZSIsNCwibmdTd2l0Y2hDYXNlIl0sWzMsInNyYyIsImxvYWRpbmdBdHRyIiw0LCJuZ1N3aXRjaENhc2UiXSxbNCwibmdTd2l0Y2hEZWZhdWx0Il0sWzMsImVycm9yIiwic3JjIiwiYWx0IiwiaW5kZXgiLCJsb2FkaW5nQXR0ciIsImxvYWRpbmdJY29uIiwibG9hZGluZ0Vycm9yIl0sWyJjbGFzcyIsImctdGVtcGxhdGUgZy1pdGVtLXRlbXBsYXRlIiw0LCJuZ0lmIl0sWzEsImctdGVtcGxhdGUiLCJnLWl0ZW0tdGVtcGxhdGUiXSxbNCwibmdUZW1wbGF0ZU91dGxldCIsIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0Il0sWzMsImVycm9yIiwic3JjIiwibXV0ZSIsInBvc3RlciIsImNvbnRyb2xzIiwiY29udHJvbHNMaXN0IiwiZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUiLCJwbGF5IiwicGF1c2UiXSxbMywic3JjIiwiYXV0b3BsYXkiLCJsb2FkaW5nQXR0ciIsInBhdXNlIl0sWzMsInNyYyIsImxvYWRpbmdBdHRyIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiZSKDAsY1YsNyw2LCJuZy1jb250YWluZXIiLDApLGkmMiYmZigibmdJZiIsYS5sb2FkKX0sZGVwZW5kZW5jaWVzOltEaSwkaSx2cixfMCxiMCxLZCxYZyxGVixSVl0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXXtjdXJzb3I6dmFyKC0tZy1pdGVtLWN1cnNvcik7aGVpZ2h0OnZhcigtLWctaXRlbS1oZWlnaHQpO3dpZHRoOnZhcigtLWctaXRlbS13aWR0aCk7bWF4LWhlaWdodDp2YXIoLS1nLWl0ZW0tbWF4LWhlaWdodCk7bWF4LXdpZHRoOnZhcigtLXNsaWRlci13aWR0aCk7ei1pbmRleDoxMDtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4OjAgMCBhdXRvO3Njcm9sbC1zbmFwLWFsaWduOmNlbnRlcjstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTstd2Via2l0LXVzZXItZHJhZzpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDAsMCwwLDApfVtpdGVtU3RhdGU9bG9hZGluZ11bX25naG9zdC0lQ09NUCVde3dpZHRoOnZhcigtLXNsaWRlci13aWR0aCk7aGVpZ2h0OnZhcigtLXNsaWRlci1oZWlnaHQpfVtfbmdob3N0LSVDT01QJV0gPiAqW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJX1bX25naG9zdC0lQ09NUCVdICAgICB2aWRlbywgW19uZ2hvc3QtJUNPTVAlXSAgICAgaWZyYW1le3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9Z2FsbGVyeS1pbWFnZVtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6dmFyKC0tZy1pdGVtLXdpZHRoKTtoZWlnaHQ6dmFyKC0tZy1pdGVtLWhlaWdodCl9LmctdGVtcGxhdGVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTA7aW5zZXQ6MDtjb2xvcjojZmZmO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KX19cmV0dXJuIHR9KSgpLGpWPSgoKT0+e2NsYXNzIHR7Z2V0IF92aWV3cG9ydCgpe3JldHVybiB0aGlzLl9pdGVtLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50fWNvbnN0cnVjdG9yKGUsaSl7dGhpcy5fem9uZT1lLHRoaXMuX2l0ZW09aSx0aGlzLl9zZW5zb3I9bmV3IGtjLHRoaXMuYWN0aXZlSW5kZXhDaGFuZ2U9bmV3IE59bmdPbkNoYW5nZXMoKXt0aGlzLmNvbmZpZy5pdGVtQXV0b3NpemUmJiF0aGlzLmRpc2FibGVkP3RoaXMuX3N1YnNjcmliZSgpOnRoaXMuX3Vuc3Vic2NyaWJlKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl91bnN1YnNjcmliZSgpfV9zdWJzY3JpYmUoKXt0aGlzLl91bnN1YnNjcmliZSgpLHRoaXMuYWRhcHRlciYmdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e3RoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb249SGEoW3pjKHRoaXMuX3ZpZXdwb3J0KSx6Yyh0aGlzLl9pdGVtLm5hdGl2ZUVsZW1lbnQpXSkucGlwZShxMSgoKT0+dGhpcy5faXRlbS5zdGF0ZSQpLCR0KGU9PmUhPT0ibG9hZGluZyIpLHExKCgpPT57bGV0IGU9dGhpcy5hZGFwdGVyLmdldEVsZW1lbnRSb290TWFyZ2luKHRoaXMuX3ZpZXdwb3J0LHRoaXMuX2l0ZW0ubmF0aXZlRWxlbWVudCk7cmV0dXJuIHRoaXMuY29uZmlnLmRlYnVnJiZ0aGlzLl9pdGVtLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoIi0taXRlbS1pbnRlcnNlY3Rpb24tbWFyZ2luIixgIlZJRVdQT1JUKCR7dGhpcy5fdmlld3BvcnQuY2xpZW50V2lkdGh9eCR7dGhpcy5fdmlld3BvcnQuY2xpZW50SGVpZ2h0fSkgSVRFTSgke3RoaXMuX2l0ZW0ubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aH14JHt0aGlzLl9pdGVtLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0fSkgSU5URVJTRUNUSU9OKCR7ZX0pImApLHRoaXMuX3NlbnNvci5vYnNlcnZlKHRoaXMuX3ZpZXdwb3J0LFt0aGlzLl9pdGVtLm5hdGl2ZUVsZW1lbnRdLGUpfSkpLnN1YnNjcmliZShlPT57dGhpcy5fem9uZS5ydW4oKCk9PnRoaXMuYWN0aXZlSW5kZXhDaGFuZ2UuZW1pdChlKSl9KX0pfV91bnN1YnNjcmliZSgpe3RoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCl9c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCkoaXQocmUpLGl0KFRjKSl9fXN0YXRpY3t0aGlzLlx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsIml0ZW1JbnRlcnNlY3Rpb25PYnNlcnZlciIsIiJdXSxpbnB1dHM6e2FkYXB0ZXI6ImFkYXB0ZXIiLGNvbmZpZzoiY29uZmlnIixkaXNhYmxlZDpbMCwiaXRlbUludGVyc2VjdGlvbk9ic2VydmVyRGlzYWJsZWQiLCJkaXNhYmxlZCJdfSxvdXRwdXRzOnthY3RpdmVJbmRleENoYW5nZToiYWN0aXZlSW5kZXhDaGFuZ2UifSxmZWF0dXJlczpbSGVdfSl9fXJldHVybiB0fSkoKSxxVj0oKCk9PntjbGFzcyB0e2dldCBfdmlld3BvcnQoKXtyZXR1cm4gdGhpcy5fZWwubmF0aXZlRWxlbWVudH1nZXQgX2dhbGxlcnlDb3JlKCl7cmV0dXJuIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnR9Z2V0IF9pc0F1dG9IZWlnaHQoKXtyZXR1cm4gdGhpcy5jb25maWcuYXV0b0hlaWdodCYmIXRoaXMuY29uZmlnLml0ZW1BdXRvc2l6ZSYmdGhpcy5jb25maWcub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCImJih0aGlzLmNvbmZpZy50aHVtYlBvc2l0aW9uPT09InRvcCJ8fHRoaXMuY29uZmlnLnRodW1iUG9zaXRpb249PT0iYm90dG9tIil9Y29uc3RydWN0b3IoZSxpLGEscil7dGhpcy5fZWw9ZSx0aGlzLl96b25lPWksdGhpcy5fZ2FsbGVyeT1hLHRoaXMuX2ltZ01hbmFnZXI9cix0aGlzLmlzUmVzaXppbmdDaGFuZ2U9bmV3IE59bmdPbkluaXQoKXtsZXQgZT10aGlzLl9nYWxsZXJ5LnJlZih0aGlzLmdhbGxlcnlJZCksaT1nZXRDb21wdXRlZFN0eWxlKHRoaXMuX3ZpZXdwb3J0KS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2l0aW9uLWR1cmF0aW9uIik7cGFyc2VGbG9hdChpKT09PTA/dGhpcy5fYWZ0ZXJIZWlnaHRDaGFuZ2VkJD1jMShudWxsKTp0aGlzLl9hZnRlckhlaWdodENoYW5nZWQkPU5hKHRoaXMuX3ZpZXdwb3J0LCJ0cmFuc2l0aW9uZW5kIiksdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e3RoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbj16Yyh0aGlzLl92aWV3cG9ydCxhPT50aGlzLl9yZXNpemVPYnNlcnZlcj1hKS5waXBlKCR0KCgpPT4hdGhpcy5fc2hvdWxkU2tpcHx8ISh0aGlzLl9zaG91bGRTa2lwPSExKSksaHIoKCk9PnRoaXMuc2V0UmVzaXppbmdTdGF0ZSgpKSxUbih0aGlzLmNvbmZpZy5yZXNpemVEZWJvdW5jZVRpbWUsZjYpLGhyKGE9PlBlKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZih0aGlzLnVwZGF0ZVNsaWRlclNpemUoKSx0aGlzLl9pc0F1dG9IZWlnaHQpe2xldCByPXlpZWxkIGtuKHRoaXMuX2ltZ01hbmFnZXIuZ2V0QWN0aXZlSXRlbShlLnN0YXRlKSk7ci5oZWlnaHQ9PT10aGlzLl92aWV3cG9ydC5jbGllbnRIZWlnaHQ/dGhpcy5yZXNldFJlc2l6aW5nU3RhdGUoKToodGhpcy5zZXRSZXNpemluZ1N0YXRlKHt1bm9ic2VydmU6ITB9KSx0aGlzLl9nYWxsZXJ5Q29yZS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1zbGlkZXItaGVpZ2h0IixgJHtyLmhlaWdodH1weGApLHlpZWxkIGtuKHRoaXMuX2FmdGVySGVpZ2h0Q2hhbmdlZCQpLHRoaXMucmVzZXRSZXNpemluZ1N0YXRlKHtzaG91bGRTa2lwOmEuY29udGVudFJlY3QuaGVpZ2h0PT09dGhpcy5fdmlld3BvcnQuY2xpZW50SGVpZ2h0LG9ic2VydmU6ITB9KSl9ZWxzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMucmVzZXRSZXNpemluZ1N0YXRlKHtzaG91bGRTa2lwOiEwfSkpfSkpKS5zdWJzY3JpYmUoKX0pfW5nT25DaGFuZ2VzKCl7dGhpcy5faXNBdXRvSGVpZ2h0P3RoaXMuX3N1YnNjcmliZUF1dG9IZWlnaHQoKTp0aGlzLl91bnN1YnNjcmliZUF1dG9IZWlnaHQoKX1uZ09uRGVzdHJveSgpe3RoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKSx0aGlzLl91bnN1YnNjcmliZUF1dG9IZWlnaHQoKX1uZ0FmdGVyVmlld0NoZWNrZWQoKXt0aGlzLnVwZGF0ZVNsaWRlclNpemUoKX11cGRhdGVTbGlkZXJTaXplKCl7dGhpcy5fZ2FsbGVyeUNvcmUuc3R5bGUuc2V0UHJvcGVydHkoIi0tc2xpZGVyLXdpZHRoIixgJHt0aGlzLl92aWV3cG9ydC5jbGllbnRXaWR0aH1weGApLHRoaXMuY29uZmlnLmF1dG9IZWlnaHR8fHRoaXMuX2dhbGxlcnlDb3JlLnN0eWxlLnNldFByb3BlcnR5KCItLXNsaWRlci1oZWlnaHQiLGAke3RoaXMuX3ZpZXdwb3J0LmNsaWVudEhlaWdodH1weGApLHRoaXMudXBkYXRlQ2VudHJhbGl6ZUNTU1ZhcmlhYmxlcygpfXVwZGF0ZUNlbnRyYWxpemVDU1NWYXJpYWJsZXMoKXt0aGlzLmNvbmZpZy5pdGVtQXV0b3NpemUmJih0aGlzLl9nYWxsZXJ5Q29yZS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1zbGlkZXItY2VudHJhbGl6ZS1zdGFydC1zaXplIixgJHt0aGlzLmFkYXB0ZXIuZ2V0Q2VudHJhbGl6ZXJTdGFydFNpemUoKX1weGApLHRoaXMuX2dhbGxlcnlDb3JlLnN0eWxlLnNldFByb3BlcnR5KCItLXNsaWRlci1jZW50cmFsaXplLWVuZC1zaXplIixgJHt0aGlzLmFkYXB0ZXIuZ2V0Q2VudHJhbGl6ZXJFbmRTaXplKCl9cHhgKSl9X3N1YnNjcmliZUF1dG9IZWlnaHQoKXt0aGlzLl91bnN1YnNjcmliZUF1dG9IZWlnaHQoKSx0aGlzLl9zaG91bGRTa2lwPSExLHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9PntsZXQgaT10aGlzLl9nYWxsZXJ5LnJlZih0aGlzLmdhbGxlcnlJZCkuc3RhdGUucGlwZShEZCgoYSxyKT0+YS5jdXJySW5kZXg9PT1yLmN1cnJJbmRleCkpO3RoaXMuX2F1dG9IZWlnaHRTdWJzY3JpcHRpb249dGhpcy5faW1nTWFuYWdlci5nZXRBY3RpdmVJdGVtKGkpLnBpcGUocTEoYT0+KHRoaXMuc2V0UmVzaXppbmdTdGF0ZSh7dW5vYnNlcnZlOiEwfSksdGhpcy5fZ2FsbGVyeUNvcmUuc3R5bGUuc2V0UHJvcGVydHkoIi0tc2xpZGVyLWhlaWdodCIsYCR7YS5jbGllbnRIZWlnaHR9cHhgKSxhLmhlaWdodD09PXRoaXMuX3ZpZXdwb3J0LmNsaWVudEhlaWdodD8odGhpcy5yZXNldFJlc2l6aW5nU3RhdGUoe3Nob3VsZFNraXA6ITAsb2JzZXJ2ZTohMH0pLEhpKTp0aGlzLl9hZnRlckhlaWdodENoYW5nZWQkLnBpcGUoaHIoKCk9PnRoaXMucmVzZXRSZXNpemluZ1N0YXRlKHtzaG91bGRTa2lwOiEwLG9ic2VydmU6ITB9KSksajEoMSkpKSkpLnN1YnNjcmliZSgpfSl9X3Vuc3Vic2NyaWJlQXV0b0hlaWdodCgpe3RoaXMuX2F1dG9IZWlnaHRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCl9c2V0UmVzaXppbmdTdGF0ZSh7dW5vYnNlcnZlOmV9PXt9KXt0aGlzLl96b25lLnJ1bigoKT0+e3RoaXMuaXNSZXNpemluZ0NoYW5nZS5lbWl0KCEwKX0pLHRoaXMuX3ZpZXdwb3J0LmNsYXNzTGlzdC5hZGQoImctcmVzaXppbmciKSxlJiZ0aGlzLl9yZXNpemVPYnNlcnZlci51bm9ic2VydmUodGhpcy5fdmlld3BvcnQpfXJlc2V0UmVzaXppbmdTdGF0ZSh7c2hvdWxkU2tpcDplLG9ic2VydmU6aX09e30pe3RoaXMuX3pvbmUucnVuKCgpPT57dGhpcy5pc1Jlc2l6aW5nQ2hhbmdlLmVtaXQoITEpfSksdGhpcy5fdmlld3BvcnQuY2xhc3NMaXN0LnJlbW92ZSgiZy1yZXNpemluZyIpLHRoaXMuX3Nob3VsZFNraXA9ZSxpJiZ0aGlzLl9yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMuX3ZpZXdwb3J0KX1zdGF0aWN7dGhpcy5cdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KShpdChhZSksaXQocmUpLGl0KG9uKSxpdChFYykpfX1zdGF0aWN7dGhpcy5cdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJzbGlkZXJSZXNpemVPYnNlcnZlciIsIiJdXSxpbnB1dHM6e2dhbGxlcnlJZDoiZ2FsbGVyeUlkIixhZGFwdGVyOiJhZGFwdGVyIixjb25maWc6ImNvbmZpZyJ9LG91dHB1dHM6e2lzUmVzaXppbmdDaGFuZ2U6ImlzUmVzaXppbmdDaGFuZ2UifSxmZWF0dXJlczpbSGVdfSl9fXJldHVybiB0fSkoKSxHVj0oKCk9PntjbGFzcyB0e2dldCBzbGlkZXIoKXtyZXR1cm4gdGhpcy5zbGlkZXJFbC5uYXRpdmVFbGVtZW50fWNvbnN0cnVjdG9yKGUpe3RoaXMuX2dhbGxlcnk9ZSx0aGlzLnBvc2l0aW9uJD1uZXcgd2UsdGhpcy5pdGVtQ2xpY2s9bmV3IE4sdGhpcy5lcnJvcj1uZXcgTix0aGlzLml0ZW1zPW5ldyBFMn1uZ09uQ2hhbmdlcyhlKXtpZihlLmNvbmZpZyl7aWYoZS5jb25maWcuY3VycmVudFZhbHVlPy5vcmllbnRhdGlvbiE9PWUuY29uZmlnLnByZXZpb3VzVmFsdWU/Lm9yaWVudGF0aW9uKXN3aXRjaCh0aGlzLmNvbmZpZy5vcmllbnRhdGlvbil7Y2FzZSBQNC5Ib3Jpem9udGFsOnRoaXMuYWRhcHRlcj1uZXcgTWModGhpcy5zbGlkZXIsdGhpcy5jb25maWcpO2JyZWFrO2Nhc2UgUDQuVmVydGljYWw6dGhpcy5hZGFwdGVyPW5ldyB3Yyh0aGlzLnNsaWRlcix0aGlzLmNvbmZpZyk7YnJlYWt9ZS5jb25maWcuZmlyc3RDaGFuZ2V8fHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLnN0YXRlLmN1cnJJbmRleCwiYXV0byIpfSl9ZS5zdGF0ZSYmZS5zdGF0ZS5jdXJyZW50VmFsdWU/LmN1cnJJbmRleCE9PWUuc3RhdGUucHJldmlvdXNWYWx1ZT8uY3VyckluZGV4JiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5zdGF0ZS5jdXJySW5kZXgsZS5zdGF0ZS5maXJzdENoYW5nZT8iYXV0byI6dGhpcy5zdGF0ZS5iZWhhdmlvcil9KX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLml0ZW1zLm5vdGlmeU9uQ2hhbmdlcygpLHRoaXMuaXRlbXMkPXRoaXMuaXRlbXMuY2hhbmdlcy5waXBlKGkxKG51bGwpLHEoKCk9PnRoaXMuaXRlbXMudG9BcnJheSgpKSl9dHJhY2tCeUZuKGUsaSl7cmV0dXJuIGkudHlwZX1vbkFjdGl2ZUluZGV4Q2hhbmdlKGUpe2U9PT0tMT90aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5zdGF0ZS5jdXJySW5kZXgsInNtb290aCIpOnRoaXMuX2dhbGxlcnkucmVmKHRoaXMuZ2FsbGVyeUlkKS5zZXQoZSwic21vb3RoIil9c2Nyb2xsVG9JbmRleChlLGkpe2xldCBhPXRoaXMuaXRlbXMuZ2V0KGUpPy5uYXRpdmVFbGVtZW50O2lmKGEpe2xldCByPXRoaXMuYWRhcHRlci5nZXRTY3JvbGxUb1ZhbHVlKGEsaXx8dGhpcy5jb25maWcuc2Nyb2xsQmVoYXZpb3IpO3RoaXMucG9zaXRpb24kLm5leHQocil9fXN0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpKGl0KG9uKSl9fXN0YXRpY3t0aGlzLlx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImdhbGxlcnktc2xpZGVyIl1dLHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKHRlKFVnLDcpLHRlKFRjLDUpKSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5zbGlkZXJFbD1yLmZpcnN0KSxGKHI9QigpKSYmKGEuaXRlbXM9cil9fSxpbnB1dHM6e2dhbGxlcnlJZDoiZ2FsbGVyeUlkIixzdGF0ZToic3RhdGUiLGNvbmZpZzoiY29uZmlnIn0sb3V0cHV0czp7aXRlbUNsaWNrOiJpdGVtQ2xpY2siLGVycm9yOiJlcnJvciJ9LGZlYXR1cmVzOltIZV0sbmdDb250ZW50U2VsZWN0b3JzOnNWLGRlY2xzOjgsdmFyczoxNyxjb25zdHM6W1sic2xpZGVyIiwiIl0sWyJzbGlkZXJJbnRlcnNlY3Rpb25PYnNlcnZlciIsIiIsInNsaWRlclJlc2l6ZU9ic2VydmVyIiwiIiwxLCJnLXNsaWRlciIsMywiaXNTY3JvbGxpbmdDaGFuZ2UiLCJpc1NsaWRpbmdDaGFuZ2UiLCJhY3RpdmVJbmRleENoYW5nZSIsImlzUmVzaXppbmdDaGFuZ2UiLCJzbW9vdGhTY3JvbGwiLCJzbW9vdGhTY3JvbGxJbnRlcnJ1cHRPbk1vdXNlbW92ZSIsInNsaWRlckludGVyc2VjdGlvbk9ic2VydmVyRGlzYWJsZWQiLCJoYW1tZXJTbGlkaW5nIiwiYWRhcHRlciIsIml0ZW1zIiwiY29uZmlnIiwic3RhdGUiLCJnYWxsZXJ5SWQiXSxbMSwiZy1zbGlkZXItY29udGVudCJdLFsiaXRlbUludGVyc2VjdGlvbk9ic2VydmVyIiwiIiwzLCJ0eXBlIiwiY29uZmlnIiwiZGF0YSIsImN1cnJJbmRleCIsImluZGV4IiwiY291bnQiLCJpdGVtSW50ZXJzZWN0aW9uT2JzZXJ2ZXJEaXNhYmxlZCIsImFkYXB0ZXIiLCJhY3RpdmVJbmRleENoYW5nZSIsImNsaWNrIiwiZXJyb3IiLDQsIm5nRm9yIiwibmdGb3JPZiIsIm5nRm9yVHJhY2tCeSJdLFsiY2xhc3MiLCJnLXNsaWRlci1kZWJ1ZyIsNCwibmdJZiJdLFsiaXRlbUludGVyc2VjdGlvbk9ic2VydmVyIiwiIiwzLCJhY3RpdmVJbmRleENoYW5nZSIsImNsaWNrIiwiZXJyb3IiLCJ0eXBlIiwiY29uZmlnIiwiZGF0YSIsImN1cnJJbmRleCIsImluZGV4IiwiY291bnQiLCJpdGVtSW50ZXJzZWN0aW9uT2JzZXJ2ZXJEaXNhYmxlZCIsImFkYXB0ZXIiXSxbMSwiZy1zbGlkZXItZGVidWciXSxbMSwiZy1zbGlkZXItcmVzaXppbmciXSxbMSwiZy1zbGlkZXItc2Nyb2xsaW5nIl0sWzEsImctc2xpZGVyLXNsaWRpbmciXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtSZSgpLGMoMCwiZGl2IiwxLDApLGIoMiwiYXN5bmMiKSxiKDMsImFzeW5jIiksUygiaXNTY3JvbGxpbmdDaGFuZ2UiLGZ1bmN0aW9uKGQpe3JldHVybiB6KHIpLFQoYS5pc1Njcm9sbGluZz1kKX0pKCJpc1NsaWRpbmdDaGFuZ2UiLGZ1bmN0aW9uKGQpe3JldHVybiB6KHIpLFQoYS5pc1NsaWRpbmc9ZCl9KSgiYWN0aXZlSW5kZXhDaGFuZ2UiLGZ1bmN0aW9uKGQpe3JldHVybiB6KHIpLFQoYS5vbkFjdGl2ZUluZGV4Q2hhbmdlKGQpKX0pKCJpc1Jlc2l6aW5nQ2hhbmdlIixmdW5jdGlvbihkKXtyZXR1cm4geihyKSxUKGEuaXNSZXNpemluZz1kKX0pLGMoNCwiZGl2IiwyKSxSKDUsbFYsMSw5LCJnYWxsZXJ5LWl0ZW0iLDMpLHMoKSxSKDYsZFYsNywwLCJkaXYiLDQpLHMoKSxtZSg3KX1pJjImJihmKCJzbW9vdGhTY3JvbGwiLEMoMiwxMyxhLnBvc2l0aW9uJCkpKCJzbW9vdGhTY3JvbGxJbnRlcnJ1cHRPbk1vdXNlbW92ZSIsIWEuY29uZmlnLmRpc2FibGVNb3VzZVNjcm9sbCkoInNsaWRlckludGVyc2VjdGlvbk9ic2VydmVyRGlzYWJsZWQiLGEuaXNTY3JvbGxpbmd8fGEuaXNTbGlkaW5nfHxhLmlzUmVzaXppbmcpKCJoYW1tZXJTbGlkaW5nIiwhYS5jb25maWcuZGlzYWJsZU1vdXNlU2Nyb2xsKSgiYWRhcHRlciIsYS5hZGFwdGVyKSgiaXRlbXMiLEMoMywxNSxhLml0ZW1zJCkpKCJjb25maWciLGEuY29uZmlnKSgic3RhdGUiLGEuc3RhdGUpKCJnYWxsZXJ5SWQiLGEuZ2FsbGVyeUlkKSxHKCJjZW50cmFsaXNlZCIsYS5jb25maWcuaXRlbUF1dG9zaXplKSxsKDUpLGYoIm5nRm9yT2YiLGEuc3RhdGUuaXRlbXMpKCJuZ0ZvclRyYWNrQnkiLGEudHJhY2tCeUZuKSxsKCksZigibmdJZiIsYS5jb25maWcuZGVidWcpKX0sZGVwZW5kZW5jaWVzOltEaSxCYSwkaSxVYSxUYywkZyxLZyxOVixqVixxVl0sc3R5bGVzOlsnW19uZ2hvc3QtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7b3ZlcmZsb3c6aGlkZGVuO29yZGVyOjE7ZmxleDoxfS5nLXNsaWRlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjt0cmFuc2l0aW9uOnZhcigtLWctaGVpZ2h0LXRyYW5zaXRpb24pO21pbi1oZWlnaHQ6MTAwJTttaW4td2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCU7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OnZhcigtLXNsaWRlci1oZWlnaHQsIDEwMCUpO3dpZHRoOnZhcigtLXNsaWRlci13aWR0aCwgMTAwJSk7b3ZlcmZsb3c6dmFyKC0tc2xpZGVyLW92ZXJmbG93KTtzY3JvbGwtc25hcC10eXBlOnZhcigtLXNsaWRlci1zY3JvbGwtc25hcC10eXBlKTtmbGV4LWRpcmVjdGlvbjp2YXIoLS1zbGlkZXItZmxleC1kaXJlY3Rpb24pO3Njcm9sbGJhci13aWR0aDpub25lfS5nLXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtc2Nyb2xsYmFye2Rpc3BsYXk6bm9uZX0uZy1zbGlkZXIuZy1zbGlkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5nLXNsaWRlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLmctc2xpZGVyLmctc2Nyb2xsaW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5nLXNsaWRlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lfS5nLXNsaWRlcltjZW50cmFsaXNlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV06YmVmb3JlLCAuZy1zbGlkZXJbY2VudHJhbGlzZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdOmFmdGVye2NvbnRlbnQ6IiJ9Lmctc2xpZGVyW2NlbnRyYWxpc2VkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXTpiZWZvcmV7ZmxleDowIDAgdmFyKC0tc2xpZGVyLWNlbnRyYWxpemUtc3RhcnQtc2l6ZSl9Lmctc2xpZGVyW2NlbnRyYWxpc2VkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXTphZnRlcntmbGV4OjAgMCB2YXIoLS1zbGlkZXItY2VudHJhbGl6ZS1lbmQtc2l6ZSl9Lmctc2xpZGVyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MCAwIGF1dG87ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MXB4O3dpZHRoOnZhcigtLXNsaWRlci1jb250ZW50LXdpZHRoLCB1bnNldCk7aGVpZ2h0OnZhcigtLXNsaWRlci1jb250ZW50LWhlaWdodCwgdW5zZXQpO2ZsZXgtZGlyZWN0aW9uOnZhcigtLXNsaWRlci1mbGV4LWRpcmVjdGlvbil9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KX19cmV0dXJuIHR9KSgpLEJnPSgoKT0+e2NsYXNzIHR7Z2V0IGlzQWN0aXZlKCl7cmV0dXJuIHRoaXMuaW5kZXg9PT10aGlzLmN1cnJJbmRleH1nZXQgaXNJbmRleEF0dHIoKXtyZXR1cm4gdGhpcy5pbmRleH1nZXQgaW1hZ2VDb250ZXh0KCl7cmV0dXJueyRpbXBsaWNpdDp0aGlzLmRhdGEsaW5kZXg6dGhpcy5pbmRleCx0eXBlOnRoaXMudHlwZSxhY3RpdmU6dGhpcy5pc0FjdGl2ZSxjb3VudDp0aGlzLmNvdW50LGZpcnN0OnRoaXMuaW5kZXg9PT0wLGxhc3Q6dGhpcy5pbmRleD09PXRoaXMuY291bnQtMX19Z2V0IG5hdGl2ZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5lbC5uYXRpdmVFbGVtZW50fWNvbnN0cnVjdG9yKGUpe3RoaXMuZWw9ZSx0aGlzLmVycm9yPW5ldyBOfXN0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpKGl0KGFlKSl9fXN0YXRpY3t0aGlzLlx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImdhbGxlcnktdGh1bWIiXV0saG9zdFZhcnM6Myxob3N0QmluZGluZ3M6ZnVuY3Rpb24oaSxhKXtpJjImJihHKCJnYWxsZXJ5SW5kZXgiLGEuaXNJbmRleEF0dHIpLGllKCJnLWFjdGl2ZS10aHVtYiIsYS5pc0FjdGl2ZSkpfSxpbnB1dHM6e2NvbmZpZzoiY29uZmlnIixpbmRleDoiaW5kZXgiLGNvdW50OiJjb3VudCIsY3VyckluZGV4OiJjdXJySW5kZXgiLHR5cGU6InR5cGUiLGRhdGE6ImRhdGEifSxvdXRwdXRzOntlcnJvcjoiZXJyb3IifSxkZWNsczoyLHZhcnM6Nixjb25zdHM6W1szLCJlcnJvciIsInNyYyIsImFsdCIsImlzVGh1bWJuYWlsIiwibG9hZGluZ0ljb24iLCJsb2FkaW5nRXJyb3IiXSxbImNsYXNzIiwiZy10ZW1wbGF0ZSBnLXRodW1iLXRlbXBsYXRlIiw0LCJuZ0lmIl0sWzEsImctdGVtcGxhdGUiLCJnLXRodW1iLXRlbXBsYXRlIl0sWzQsIm5nVGVtcGxhdGVPdXRsZXQiLCJuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwiZ2FsbGVyeS1pbWFnZSIsMCksUygiZXJyb3IiLGZ1bmN0aW9uKG8pe3JldHVybiBhLmVycm9yLmVtaXQobyl9KSxzKCksUigxLGhWLDIsMiwiZGl2IiwxKSksaSYyJiYoZigic3JjIixhLmRhdGEudGh1bWIpKCJhbHQiLGEuZGF0YS5hbHQrIi10aHVtYm5haWwiKSgiaXNUaHVtYm5haWwiLCEwKSgibG9hZGluZ0ljb24iLGEuY29uZmlnLnRodW1iTG9hZGluZ0ljb24pKCJsb2FkaW5nRXJyb3IiLGEuY29uZmlnLnRodW1iTG9hZGluZ0Vycm9yKSxsKCksZigibmdJZiIsYS5jb25maWcudGh1bWJUZW1wbGF0ZSkpfSxkZXBlbmRlbmNpZXM6W0RpLCRpLHZyLFhnXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde2N1cnNvcjp2YXIoLS1nLXRodW1iLWN1cnNvcik7aGVpZ2h0OnZhcigtLWctdGh1bWItaGVpZ2h0KTt3aWR0aDp2YXIoLS1nLXRodW1iLXdpZHRoKTttYXgtaGVpZ2h0OnZhcigtLWctdGh1bWItaGVpZ2h0KTttYXgtd2lkdGg6dmFyKC0tZy10aHVtYi13aWR0aCk7YWxpZ24tc2VsZjpjZW50ZXI7YmFja2dyb3VuZDojMDAwO3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW47ZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXg6MCAwIGF1dG87c2Nyb2xsLXNuYXAtYWxpZ246Y2VudGVyOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdXNlci1kcmFnOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsMCk7LS1nLXRodW1iLW9wYWNpdHk6IC41fS5nLWFjdGl2ZS10aHVtYltfbmdob3N0LSVDT01QJV17LS1nLXRodW1iLW9wYWNpdHk6IDF9LmctdGVtcGxhdGVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTA7aW5zZXQ6MDtjb2xvcjojZmZmO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KX19cmV0dXJuIHR9KSgpLFdWPSgoKT0+e2NsYXNzIHR7Z2V0IF92aWV3cG9ydCgpe3JldHVybiB0aGlzLl9lbC5uYXRpdmVFbGVtZW50fWNvbnN0cnVjdG9yKGUsaSl7dGhpcy5fZWw9ZSx0aGlzLl96b25lPWksdGhpcy5yZXNpemVkPW5ldyBOfW5nT25Jbml0KCl7dGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e3RoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbj16Yyh0aGlzLl92aWV3cG9ydCkucGlwZShUbih0aGlzLmNvbmZpZy5yZXNpemVEZWJvdW5jZVRpbWUsZjYpLGhyKCgpPT57dGhpcy51cGRhdGVTbGlkZXJTaXplKCksdGhpcy5yZXNpemVkLmVtaXQoKX0pKS5zdWJzY3JpYmUoKX0pfW5nT25DaGFuZ2VzKGUpe2UuY29uZmlnLmZpcnN0Q2hhbmdlfHx0aGlzLnVwZGF0ZVNsaWRlclNpemUoKX1uZ09uRGVzdHJveSgpe3RoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKX11cGRhdGVTbGlkZXJTaXplKCl7dGhpcy5fdmlld3BvcnQuc3R5bGUuc2V0UHJvcGVydHkoIi0tdGh1bWItY2VudHJhbGl6ZS1zdGFydC1zaXplIix0aGlzLmFkYXB0ZXIuZ2V0Q2VudHJhbGl6ZXJTdGFydFNpemUoKSsicHgiKSx0aGlzLl92aWV3cG9ydC5zdHlsZS5zZXRQcm9wZXJ0eSgiLS10aHVtYi1jZW50cmFsaXplLWVuZC1zaXplIix0aGlzLmFkYXB0ZXIuZ2V0Q2VudHJhbGl6ZXJFbmRTaXplKCkrInB4Iil9c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCkoaXQoYWUpLGl0KHJlKSl9fXN0YXRpY3t0aGlzLlx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsInRodW1iUmVzaXplT2JzZXJ2ZXIiLCIiXV0saW5wdXRzOntjb25maWc6ImNvbmZpZyIsYWRhcHRlcjoiYWRhcHRlciJ9LG91dHB1dHM6e3Jlc2l6ZWQ6InRodW1iUmVzaXplT2JzZXJ2ZXIifSxmZWF0dXJlczpbSGVdfSl9fXJldHVybiB0fSkoKSxRVj0oKCk9PntjbGFzcyB0e2NvbnN0cnVjdG9yKCl7dGhpcy5wb3NpdGlvbiQ9bmV3IHdlLHRoaXMudGh1bWJDbGljaz1uZXcgTix0aGlzLmVycm9yPW5ldyBOLHRoaXMuaXRlbXM9bmV3IEUyfWdldCBzbGlkZXIoKXtyZXR1cm4gdGhpcy5zbGlkZXJFbC5uYXRpdmVFbGVtZW50fW5nT25DaGFuZ2VzKGUpe2lmKGUuY29uZmlnJiZlLmNvbmZpZy5jdXJyZW50VmFsdWU/LnRodW1iUG9zaXRpb24hPT1lLmNvbmZpZy5wcmV2aW91c1ZhbHVlPy50aHVtYlBvc2l0aW9uKXtzd2l0Y2godGhpcy5jb25maWcudGh1bWJQb3NpdGlvbil7Y2FzZSBtby5SaWdodDpjYXNlIG1vLkxlZnQ6dGhpcy5hZGFwdGVyPW5ldyB3Yyh0aGlzLnNsaWRlcix0aGlzLmNvbmZpZyk7YnJlYWs7Y2FzZSBtby5Ub3A6Y2FzZSBtby5Cb3R0b206dGhpcy5hZGFwdGVyPW5ldyBNYyh0aGlzLnNsaWRlcix0aGlzLmNvbmZpZyk7YnJlYWt9ZS5jb25maWcuZmlyc3RDaGFuZ2V8fHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLnN0YXRlLmN1cnJJbmRleCwiYXV0byIpfSl9ZS5zdGF0ZSYmKGUuc3RhdGUuZmlyc3RDaGFuZ2V8fCF0aGlzLmNvbmZpZy5kZXRhY2hUaHVtYnMpJiZlLnN0YXRlLmN1cnJlbnRWYWx1ZT8uY3VyckluZGV4IT09ZS5zdGF0ZS5wcmV2aW91c1ZhbHVlPy5jdXJySW5kZXgmJnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLnN0YXRlLmN1cnJJbmRleCxlLnN0YXRlPy5maXJzdENoYW5nZT8iYXV0byI6InNtb290aCIpfSl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5pdGVtcy5ub3RpZnlPbkNoYW5nZXMoKSx0aGlzLml0ZW1zJD10aGlzLml0ZW1zLmNoYW5nZXMucGlwZShpMShudWxsKSxxKCgpPT50aGlzLml0ZW1zLnRvQXJyYXkoKSkpfXRyYWNrQnlGbihlLGkpe3JldHVybiBpLnR5cGV9b25BY3RpdmVJbmRleENoYW5nZShlKXtlPT09LTE/dGhpcy5zY3JvbGxUb0luZGV4KHRoaXMuc3RhdGUuY3VyckluZGV4LCJzbW9vdGgiKTp0aGlzLnNjcm9sbFRvSW5kZXgoZSwic21vb3RoIil9c2Nyb2xsVG9JbmRleChlLGkpe2xldCBhPXRoaXMuaXRlbXMuZ2V0KGUpPy5uYXRpdmVFbGVtZW50O2lmKGEpe2xldCByPXRoaXMuYWRhcHRlci5nZXRTY3JvbGxUb1ZhbHVlKGEsaSk7dGhpcy5wb3NpdGlvbiQubmV4dChyKX19c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9fXN0YXRpY3t0aGlzLlx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImdhbGxlcnktdGh1bWJzIl1dLHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKHRlKFVnLDcpLHRlKEJnLDUpKSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5zbGlkZXJFbD1yLmZpcnN0KSxGKHI9QigpKSYmKGEuaXRlbXM9cil9fSxpbnB1dHM6e2dhbGxlcnlJZDoiZ2FsbGVyeUlkIixzdGF0ZToic3RhdGUiLGNvbmZpZzoiY29uZmlnIn0sb3V0cHV0czp7dGh1bWJDbGljazoidGh1bWJDbGljayIsZXJyb3I6ImVycm9yIn0sZmVhdHVyZXM6W0hlXSxkZWNsczo2LHZhcnM6MTUsY29uc3RzOltbInNsaWRlciIsIiJdLFsxLCJnLXNsaWRlciIsMywidGh1bWJSZXNpemVPYnNlcnZlciIsImFjdGl2ZUluZGV4Q2hhbmdlIiwic21vb3RoU2Nyb2xsIiwic21vb3RoU2Nyb2xsSW50ZXJydXB0T25Nb3VzZW1vdmUiLCJoYW1tZXJTbGlkaW5nIiwiZ2FsbGVyeUlkIiwiaXRlbXMiLCJzdGF0ZSIsImNvbmZpZyIsImFkYXB0ZXIiXSxbMSwiZy1zbGlkZXItY29udGVudCJdLFszLCJ0eXBlIiwiY29uZmlnIiwiZGF0YSIsImN1cnJJbmRleCIsImluZGV4IiwiY291bnQiLCJjbGljayIsImVycm9yIiw0LCJuZ0ZvciIsIm5nRm9yT2YiLCJuZ0ZvclRyYWNrQnkiXSxbMywiY2xpY2siLCJlcnJvciIsInR5cGUiLCJjb25maWciLCJkYXRhIiwiY3VyckluZGV4IiwiaW5kZXgiLCJjb3VudCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO2MoMCwiZGl2IiwxLDApLGIoMiwiYXN5bmMiKSxiKDMsImFzeW5jIiksUygidGh1bWJSZXNpemVPYnNlcnZlciIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuc2Nyb2xsVG9JbmRleChhLnN0YXRlLmN1cnJJbmRleCwiYXV0byIpKX0pKCJhY3RpdmVJbmRleENoYW5nZSIsZnVuY3Rpb24oZCl7cmV0dXJuIHoociksVChhLm9uQWN0aXZlSW5kZXhDaGFuZ2UoZCkpfSksYyg0LCJkaXYiLDIpLFIoNSxwViwxLDcsImdhbGxlcnktdGh1bWIiLDMpLHMoKSgpfWkmMiYmKGYoInNtb290aFNjcm9sbCIsQygyLDExLGEucG9zaXRpb24kKSkoInNtb290aFNjcm9sbEludGVycnVwdE9uTW91c2Vtb3ZlIiwhYS5jb25maWcuZGlzYWJsZVRodW1iTW91c2VTY3JvbGwpKCJoYW1tZXJTbGlkaW5nIiwhYS5jb25maWcuZGlzYWJsZVRodW1iTW91c2VTY3JvbGwpKCJnYWxsZXJ5SWQiLGEuZ2FsbGVyeUlkKSgiaXRlbXMiLEMoMywxMyxhLml0ZW1zJCkpKCJzdGF0ZSIsYS5zdGF0ZSkoImNvbmZpZyIsYS5jb25maWcpKCJhZGFwdGVyIixhLmFkYXB0ZXIpLEcoImNlbnRyYWxpc2VkIixhLmNvbmZpZy50aHVtYkNlbnRyYWxpemVkfHxhLmFkYXB0ZXIuaXNDb250ZW50TGVzc1RoYW5Db250YWluZXIpLGwoNSksZigibmdGb3JPZiIsYS5zdGF0ZS5pdGVtcykoIm5nRm9yVHJhY2tCeSIsYS50cmFja0J5Rm4pKX0sZGVwZW5kZW5jaWVzOltEaSxCYSxVYSxCZywkZyxLZyxXVl0sc3R5bGVzOlsnW19uZ2hvc3QtJUNPTVAlXXttYXgtaGVpZ2h0OjEwMCU7bWF4LXdpZHRoOjEwMCU7ZGlzcGxheTpibG9jazt6LWluZGV4OjEwMH0uZy1zbGlkZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7dHJhbnNpdGlvbjp2YXIoLS1nLWhlaWdodC10cmFuc2l0aW9uKTttYXgtaGVpZ2h0OjEwMCU7bWluLXdpZHRoOjEwMCU7aGVpZ2h0OnZhcigtLXRodW1iLXNsaWRlci1oZWlnaHQpO3dpZHRoOnZhcigtLXRodW1iLXNsaWRlci13aWR0aCk7dG9wOnZhcigtLXRodW1iLXNsaWRlci10b3ApO2xlZnQ6dmFyKC0tdGh1bWItc2xpZGVyLWxlZnQpO292ZXJmbG93OnZhcigtLXRodW1iLXNsaWRlci1vdmVyZmxvdyk7c2Nyb2xsLXNuYXAtdHlwZTp2YXIoLS1zbGlkZXItc2Nyb2xsLXNuYXAtdHlwZSk7ZmxleC1kaXJlY3Rpb246dmFyKC0tdGh1bWItc2xpZGVyLWZsZXgtZGlyZWN0aW9uKTtzY3JvbGxiYXItd2lkdGg6bm9uZX0uZy1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmV9Lmctc2xpZGVyLmctc2xpZGluZ1tfbmdjb250ZW50LSVDT01QJV0gICAuZy1zbGlkZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZX0uZy1zbGlkZXJbY2VudHJhbGlzZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdOmJlZm9yZSwgLmctc2xpZGVyW2NlbnRyYWxpc2VkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXTphZnRlcntjb250ZW50OiIifS5nLXNsaWRlcltjZW50cmFsaXNlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV06YmVmb3Jle2ZsZXg6MCAwIHZhcigtLXRodW1iLWNlbnRyYWxpemUtc3RhcnQtc2l6ZSl9Lmctc2xpZGVyW2NlbnRyYWxpc2VkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXTphZnRlcntmbGV4OjAgMCB2YXIoLS10aHVtYi1jZW50cmFsaXplLWVuZC1zaXplKX0uZy1zbGlkZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZmxleDowIDAgYXV0bztkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246dmFyKC0tdGh1bWItc2xpZGVyLWZsZXgtZGlyZWN0aW9uKTthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjFweH0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pfX1yZXR1cm4gdH0pKCksWVY9KCgpPT57Y2xhc3MgdHtnZXQgdGh1bWJQb3NpdGlvbigpe3JldHVybiB0aGlzLmNvbmZpZy50aHVtYlBvc2l0aW9ufWdldCBvcmllbnRhdGlvbigpe3JldHVybiB0aGlzLmNvbmZpZy5vcmllbnRhdGlvbn1nZXQgZGlzYWJsZVRodW1iKCl7cmV0dXJuIHRoaXMuY29uZmlnLmRpc2FibGVUaHVtYnN9Z2V0IGJ1bGxldERpc2FibGVkKCl7cmV0dXJuIHRoaXMuY29uZmlnLmRpc2FibGVCdWxsZXRzfWdldCBidWxsZXRQb3NpdGlvbigpe3JldHVybiB0aGlzLmNvbmZpZy5idWxsZXRQb3NpdGlvbn1nZXQgaW1hZ2VTaXplKCl7cmV0dXJuIHRoaXMuY29uZmlnLmltYWdlU2l6ZX1nZXQgdGh1bWJJbWFnZVNpemUoKXtyZXR1cm4gdGhpcy5jb25maWcudGh1bWJJbWFnZVNpemV9Z2V0IGNvdW50ZXJQb3NpdGlvbigpe3JldHVybiB0aGlzLmNvbmZpZy5jb3VudGVyUG9zaXRpb259Z2V0IHNjcm9sbERpc2FibGVkKCl7cmV0dXJuIHRoaXMuY29uZmlnLmRpc2FibGVTY3JvbGx9Z2V0IHRodW1iU2Nyb2xsRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5jb25maWcuZGlzYWJsZVRodW1iU2Nyb2xsfWdldCBpdGVtQXV0b3NpemUoKXtyZXR1cm4gdGhpcy5jb25maWcuaXRlbUF1dG9zaXplfWdldCBhdXRvSGVpZ2h0KCl7cmV0dXJuIHRoaXMuY29uZmlnLmF1dG9IZWlnaHR9Z2V0IHRodW1iQXV0b3NpemUoKXtyZXR1cm4gdGhpcy5jb25maWcudGh1bWJBdXRvc2l6ZX1nZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuZGlyLnZhbHVlfWdldCBkZWJ1Zygpe3JldHVybiB0aGlzLmNvbmZpZy5kZWJ1Z31jb25zdHJ1Y3RvcihlLGkpe3RoaXMuZWw9ZSx0aGlzLmRpcj1pLHRoaXMuaXRlbUNsaWNrPW5ldyBOLHRoaXMudGh1bWJDbGljaz1uZXcgTix0aGlzLmVycm9yPW5ldyBOfW5nT25DaGFuZ2VzKGUpe2UuY29uZmlnJiYoZS5jb25maWcuY3VycmVudFZhbHVlPy50aHVtYldpZHRoIT09ZS5jb25maWcucHJldmlvdXNWYWx1ZT8udGh1bWJXaWR0aCYmdGhpcy5lbC5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCItLWctdGh1bWItd2lkdGgiLGI2KGUuY29uZmlnLmN1cnJlbnRWYWx1ZS50aHVtYldpZHRoKSksZS5jb25maWcuY3VycmVudFZhbHVlPy50aHVtYkhlaWdodCE9PWUuY29uZmlnLnByZXZpb3VzVmFsdWU/LnRodW1iSGVpZ2h0JiZ0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoIi0tZy10aHVtYi1oZWlnaHQiLGI2KGUuY29uZmlnLmN1cnJlbnRWYWx1ZS50aHVtYkhlaWdodCkpKX1zdGF0aWN7dGhpcy5cdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KShpdChhZSksaXQobjEpKX19c3RhdGlje3RoaXMuXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siZ2FsbGVyeS1jb3JlIl1dLGhvc3RWYXJzOjE1LGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmRygidGh1bWJQb3NpdGlvbiIsYS50aHVtYlBvc2l0aW9uKSgib3JpZW50YXRpb24iLGEub3JpZW50YXRpb24pKCJ0aHVtYkRpc2FibGVkIixhLmRpc2FibGVUaHVtYikoImJ1bGxldERpc2FibGVkIixhLmJ1bGxldERpc2FibGVkKSgiYnVsbGV0UG9zaXRpb24iLGEuYnVsbGV0UG9zaXRpb24pKCJpbWFnZVNpemUiLGEuaW1hZ2VTaXplKSgidGh1bWJJbWFnZVNpemUiLGEudGh1bWJJbWFnZVNpemUpKCJjb3VudGVyUG9zaXRpb24iLGEuY291bnRlclBvc2l0aW9uKSgic2Nyb2xsRGlzYWJsZWQiLGEuc2Nyb2xsRGlzYWJsZWQpKCJ0aHVtYlNjcm9sbERpc2FibGVkIixhLnRodW1iU2Nyb2xsRGlzYWJsZWQpKCJpdGVtQXV0b3NpemUiLGEuaXRlbUF1dG9zaXplKSgiYXV0b0hlaWdodCIsYS5hdXRvSGVpZ2h0KSgidGh1bWJBdXRvc2l6ZSIsYS50aHVtYkF1dG9zaXplKSgiZGlyIixhLmRpcmVjdGlvbikoImRlYnVnIixhLmRlYnVnKX0saW5wdXRzOntnYWxsZXJ5SWQ6ImdhbGxlcnlJZCIsc3RhdGU6InN0YXRlIixjb25maWc6ImNvbmZpZyJ9LG91dHB1dHM6e2l0ZW1DbGljazoiaXRlbUNsaWNrIix0aHVtYkNsaWNrOiJ0aHVtYkNsaWNrIixlcnJvcjoiZXJyb3IifSxmZWF0dXJlczpbSGVdLGRlY2xzOjgsdmFyczoxNCxjb25zdHM6W1szLCJzdGF0ZSIsImNvbmZpZyIsImdhbGxlcnlJZCIsInRodW1iQ2xpY2siLCJlcnJvciIsNCwibmdJZiJdLFsxLCJnLWJveCJdLFszLCJpdGVtQ2xpY2siLCJlcnJvciIsInN0YXRlIiwiY29uZmlnIiwiZ2FsbGVyeUlkIl0sWzMsInN0YXRlIiwiY29uZmlnIiwiZ2FsbGVyeUlkIiw0LCJuZ0lmIl0sWzMsInN0YXRlIiw0LCJuZ0lmIl0sWzEsImctYm94LXRlbXBsYXRlIl0sWzQsIm5nVGVtcGxhdGVPdXRsZXQiLCJuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCJdLFszLCJ0aHVtYkNsaWNrIiwiZXJyb3IiLCJzdGF0ZSIsImNvbmZpZyIsImdhbGxlcnlJZCJdLFszLCJzdGF0ZSIsImNvbmZpZyIsImdhbGxlcnlJZCJdLFszLCJzdGF0ZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKFIoMCx1ViwxLDMsImdhbGxlcnktdGh1bWJzIiwwKSxjKDEsImRpdiIsMSkoMiwiZ2FsbGVyeS1zbGlkZXIiLDIpLFMoIml0ZW1DbGljayIsZnVuY3Rpb24obyl7cmV0dXJuIGEuaXRlbUNsaWNrLmVtaXQobyl9KSgiZXJyb3IiLGZ1bmN0aW9uKG8pe3JldHVybiBhLmVycm9yLmVtaXQobyl9KSxSKDMsZ1YsMSwzLCJnYWxsZXJ5LW5hdiIsMykscygpLFIoNCx2ViwxLDMsImdhbGxlcnktYnVsbGV0cyIsMykoNSxfViwxLDEsImdhbGxlcnktY291bnRlciIsNCksYyg2LCJkaXYiLDUpLFIoNyxiViwxLDAsIm5nLWNvbnRhaW5lciIsNikscygpKCkpLGkmMiYmKGYoIm5nSWYiLGEuY29uZmlnLnRodW1icyksbCgyKSxpZSgiZy1kZWJ1ZyIsYS5jb25maWcuZGVidWcpLGYoInN0YXRlIixhLnN0YXRlKSgiY29uZmlnIixhLmNvbmZpZykoImdhbGxlcnlJZCIsYS5nYWxsZXJ5SWQpLGwoKSxmKCJuZ0lmIixhLmNvbmZpZy5uYXYmJmEuc3RhdGUuaXRlbXMubGVuZ3RoPjEpLGwoKSxmKCJuZ0lmIixhLmNvbmZpZy5idWxsZXRzKSxsKCksZigibmdJZiIsYS5jb25maWcuY291bnRlciksbCgyKSxmKCJuZ1RlbXBsYXRlT3V0bGV0IixhLmNvbmZpZy5ib3hUZW1wbGF0ZSkoIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0Iix6MSgxMSxmVixhLnN0YXRlLGEuY29uZmlnKSkpfSxkZXBlbmRlbmNpZXM6W0RpLCRpLHZyLFFWLEdWLE1WLHhWLHlWXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjtkaXNwbGF5OmZsZXg7Z2FwOnZhcigtLWctZ3V0dGVyLXNpemUpO3dpZHRoOjEwMCU7aGVpZ2h0OjUwMHB4O21pbi1oZWlnaHQ6MTAwJTttYXgtaGVpZ2h0OjEwMCU7LS1pbWFnZS1vYmplY3QtZml0OiB1bnNldDstLXNsaWRlci10aHVtYi1oZWlnaHQ6IHVuc2V0Oy0tc2xpZGVyLXRodW1iLXdpZHRoOiB1bnNldDstLXRodW1iLXNsaWRlci1sZWZ0OiB1bnNldDstLXRodW1iLXNsaWRlci1vdmVyZmxvdzogdW5zZXQ7LS10aHVtYi1zbGlkZXItZmxleC1kaXJlY3Rpb246IHVuc2V0Oy0tZy10aHVtYi13aWR0aDogdW5zZXQ7LS1nLXRodW1iLWhlaWdodDogdW5zZXQ7LS1nLXRodW1iLWN1cnNvcjogcG9pbnRlcjstLXNsaWRlci1zY3JvbGwtc25hcC10eXBlOiB1bnNldDstLXNsaWRlci1vdmVyZmxvdzogdW5zZXQ7LS1zbGlkZXItZmxleC1kaXJlY3Rpb246IHVuc2V0Oy0tc2xpZGVyLXdpZHRoOiB1bnNldDstLXNsaWRlci1oZWlnaHQ6IHVuc2V0Oy0tc2xpZGVyLWNvbnRlbnQtd2lkdGg6IHVuc2V0Oy0tc2xpZGVyLWNvbnRlbnQtaGVpZ2h0OiB1bnNldDstLWctaXRlbS13aWR0aDogdW5zZXQ7LS1nLWl0ZW0taGVpZ2h0OiB1bnNldDstLWctaXRlbS1tYXgtaGVpZ2h0OiB2YXIoLS1zbGlkZXItaGVpZ2h0KTstLWJ1bGxldHMtdG9wOiB1bnNldDstLWJ1bGxldHMtYm90dG9tOiB1bnNldDstLWJ1bGxldHMtY3Vyc29yOiBwb2ludGVyOy0tYnVsbGV0cy1vcGFjaXR5OiAuNDstLWJ1bGxldHMtaG92ZXItb3BhY2l0eTogMTstLWJ1bGxldHMtYWN0aXZlLW9wYWNpdHk6IDE7LS1jb3VudGVyLXRvcDogdW5zZXQ7LS1jb3VudGVyLWJvdHRvbTogdW5zZXQ7LS1jb3VudGVyLWJvcmRlci1yYWRpdXM6IHVuc2V0Oy0tbmF2LXNwYWNlOiA4cHg7LS1uYXYtaG92ZXItc3BhY2U6IDYuNHB4Oy0tbmF2LW5leHQtcmlnaHQ6IHVuc2V0Oy0tbmF2LW5leHQtaG92ZXItcmlnaHQ6IHVuc2V0Oy0tbmF2LW5leHQtbGVmdDogdW5zZXQ7LS1uYXYtbmV4dC1ob3Zlci1sZWZ0OiB1bnNldH1bdGh1bWJQb3NpdGlvbj10b3BdW19uZ2hvc3QtJUNPTVAlXXtmbGV4LWRpcmVjdGlvbjpjb2x1bW59W3RodW1iUG9zaXRpb249bGVmdF1bX25naG9zdC0lQ09NUCVde2ZsZXgtZGlyZWN0aW9uOnJvd31bdGh1bWJQb3NpdGlvbj1yaWdodF1bX25naG9zdC0lQ09NUCVde2ZsZXgtZGlyZWN0aW9uOnJvdy1yZXZlcnNlfVt0aHVtYlBvc2l0aW9uPWJvdHRvbV1bX25naG9zdC0lQ09NUCVde2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlfVthdXRvSGVpZ2h0PXRydWVdW2l0ZW1BdXRvU2l6ZT1mYWxzZV1bb3JpZW50YXRpb249aG9yaXpvbnRhbF1bdGh1bWJQb3NpdGlvbj10b3BdW19uZ2hvc3QtJUNPTVAlXSwgW2F1dG9IZWlnaHQ9dHJ1ZV1baXRlbUF1dG9TaXplPWZhbHNlXVtvcmllbnRhdGlvbj1ob3Jpem9udGFsXVt0aHVtYlBvc2l0aW9uPWJvdHRvbV1bX25naG9zdC0lQ09NUCVde2hlaWdodDpmaXQtY29udGVudDstLWctaXRlbS1oZWlnaHQ6IGF1dG8gIWltcG9ydGFudDstLWctaXRlbS1tYXgtaGVpZ2h0OiBhdXRvfVtpbWFnZVNpemU9Y29udGFpbl1bX25naG9zdC0lQ09NUCVdICAgZ2FsbGVyeS1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdLCBbdGh1bWJJbWFnZVNpemU9Y29udGFpbl1bX25naG9zdC0lQ09NUCVdICAgZ2FsbGVyeS10aHVtYnNbX25nY29udGVudC0lQ09NUCVdey0taW1hZ2Utb2JqZWN0LWZpdDogY29udGFpbn1baW1hZ2VTaXplPWNvdmVyXVtfbmdob3N0LSVDT01QJV0gICBnYWxsZXJ5LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV0sIFt0aHVtYkltYWdlU2l6ZT1jb3Zlcl1bX25naG9zdC0lQ09NUCVdICAgZ2FsbGVyeS10aHVtYnNbX25nY29udGVudC0lQ09NUCVdey0taW1hZ2Utb2JqZWN0LWZpdDogY292ZXJ9W3RodW1iUG9zaXRpb249dG9wXVtfbmdob3N0LSVDT01QJV0sIFt0aHVtYlBvc2l0aW9uPWJvdHRvbV1bX25naG9zdC0lQ09NUCVdey0tdGh1bWItc2xpZGVyLXRvcDogMDstLXRodW1iLXNsaWRlci1vdmVyZmxvdzogYXV0byBoaWRkZW47LS10aHVtYi1zbGlkZXItZmxleC1kaXJlY3Rpb246IHJvdzstLWctdGh1bWItaGVpZ2h0OiAxMDAlfVt0aHVtYlBvc2l0aW9uPXRvcF1bdGh1bWJBdXRvc2l6ZT10cnVlXVtfbmdob3N0LSVDT01QJV0sIFt0aHVtYlBvc2l0aW9uPWJvdHRvbV1bdGh1bWJBdXRvc2l6ZT10cnVlXVtfbmdob3N0LSVDT01QJV17LS1nLXRodW1iLXdpZHRoOiBhdXRvICFpbXBvcnRhbnR9W3RodW1iUG9zaXRpb249bGVmdF1bX25naG9zdC0lQ09NUCVdLCBbdGh1bWJQb3NpdGlvbj1yaWdodF1bX25naG9zdC0lQ09NUCVdey0tdGh1bWItc2xpZGVyLWxlZnQ6IDA7LS10aHVtYi1zbGlkZXItb3ZlcmZsb3c6IGhpZGRlbiBhdXRvOy0tdGh1bWItc2xpZGVyLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47LS1nLXRodW1iLXdpZHRoOiAxMDAlfVt0aHVtYlBvc2l0aW9uPWxlZnRdW3RodW1iQXV0b3NpemU9dHJ1ZV1bX25naG9zdC0lQ09NUCVdLCBbdGh1bWJQb3NpdGlvbj1yaWdodF1bdGh1bWJBdXRvc2l6ZT10cnVlXVtfbmdob3N0LSVDT01QJV17LS1nLXRodW1iLWhlaWdodDogYXV0byAhaW1wb3J0YW50fVt0aHVtYkRpc2JsZWQ9dHJ1ZV1bX25naG9zdC0lQ09NUCVdey0tZy10aHVtYi1jdXJzb3I6IGRlZmF1bHR9W3RodW1iU2Nyb2xsRGlzYWJsZWQ9dHJ1ZV1bX25naG9zdC0lQ09NUCVdey0tdGh1bWItc2xpZGVyLW92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudH1bb3JpZW50YXRpb249aG9yaXpvbnRhbF1bX25naG9zdC0lQ09NUCVdey0tc2xpZGVyLW92ZXJmbG93OiBhdXRvIGhpZGRlbjstLXNsaWRlci1zY3JvbGwtc25hcC10eXBlOiB4IG1hbmRhdG9yeTstLXNsaWRlci1mbGV4LWRpcmVjdGlvbjogcm93Oy0tc2xpZGVyLWNvbnRlbnQtaGVpZ2h0OiAxMDAlfVtvcmllbnRhdGlvbj12ZXJ0aWNhbF1bX25naG9zdC0lQ09NUCVdey0tc2xpZGVyLW92ZXJmbG93OiBoaWRkZW4gYXV0bzstLXNsaWRlci1zY3JvbGwtc25hcC10eXBlOiB5IG1hbmRhdG9yeTstLXNsaWRlci1mbGV4LWRpcmVjdGlvbjogY29sdW1uOy0tc2xpZGVyLWNvbnRlbnQtd2lkdGg6IDEwMCV9W3Njcm9sbERpc2FibGVkPXRydWVdW19uZ2hvc3QtJUNPTVAlXXstLXNsaWRlci1vdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnR9W29yaWVudGF0aW9uPWhvcml6b250YWxdW19uZ2hvc3QtJUNPTVAlXXstLWctaXRlbS13aWR0aDogdmFyKC0tc2xpZGVyLXdpZHRoKTstLWctaXRlbS1oZWlnaHQ6IDEwMCV9W29yaWVudGF0aW9uPWhvcml6b250YWxdW2l0ZW1BdXRvU2l6ZT10cnVlXVtfbmdob3N0LSVDT01QJV17LS1nLWl0ZW0td2lkdGg6IGF1dG99W29yaWVudGF0aW9uPXZlcnRpY2FsXVtfbmdob3N0LSVDT01QJV17LS1nLWl0ZW0td2lkdGg6IDEwMCU7LS1nLWl0ZW0taGVpZ2h0OiB2YXIoLS1zbGlkZXItaGVpZ2h0KX1bb3JpZW50YXRpb249dmVydGljYWxdW2l0ZW1BdXRvU2l6ZT10cnVlXVtfbmdob3N0LSVDT01QJV17LS1nLWl0ZW0taGVpZ2h0OiBhdXRvfVtidWxsZXRQb3NpdGlvbj10b3BdW19uZ2hvc3QtJUNPTVAlXXstLWJ1bGxldHMtdG9wOiAxNXB4fVtidWxsZXRQb3NpdGlvbj1ib3R0b21dW19uZ2hvc3QtJUNPTVAlXXstLWJ1bGxldHMtYm90dG9tOiAxNXB4fVtidWxsZXREaXNhYmxlZD10cnVlXVtfbmdob3N0LSVDT01QJV17LS1idWxsZXRzLWN1cnNvcjogZGVmYXVsdDstLWJ1bGxldHMtaG92ZXItb3BhY2l0eTogdmFyKC0tYnVsbGV0cy1vcGFjaXR5KX1bY291bnRlclBvc2l0aW9uPXRvcF1bX25naG9zdC0lQ09NUCVdey0tY291bnRlci10b3A6IDA7LS1jb3VudGVyLWJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4fVtjb3VudGVyUG9zaXRpb249Ym90dG9tXVtfbmdob3N0LSVDT01QJV17LS1jb3VudGVyLWJvdHRvbTogMDstLWNvdW50ZXItYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDB9W2Rpcj1sdHJdW19uZ2hvc3QtJUNPTVAlXXstLW5hdi1uZXh0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKSBwZXJzcGVjdGl2ZSgxcHgpOy0tbmF2LW5leHQtcmlnaHQ6IHZhcigtLW5hdi1zcGFjZSk7LS1uYXYtbmV4dC1ob3Zlci1yaWdodDogdmFyKC0tbmF2LWhvdmVyLXNwYWNlKTstLW5hdi1wcmV2LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKSBwZXJzcGVjdGl2ZSgxcHgpIHNjYWxlKC0xLCAtMSk7LS1uYXYtcHJldi1sZWZ0OiB2YXIoLS1uYXYtc3BhY2UpOy0tbmF2LXByZXYtaG92ZXItbGVmdDogdmFyKC0tbmF2LWhvdmVyLXNwYWNlKX1bZGlyPXJ0bF1bX25naG9zdC0lQ09NUCVdey0tbmF2LW5leHQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHBlcnNwZWN0aXZlKDFweCkgc2NhbGUoLTEsIC0xKTstLW5hdi1uZXh0LWxlZnQ6IHZhcigtLW5hdi1zcGFjZSk7LS1uYXYtbmV4dC1ob3Zlci1sZWZ0OiB2YXIoLS1uYXYtaG92ZXItc3BhY2UpOy0tbmF2LXByZXYtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpIHBlcnNwZWN0aXZlKDFweCk7LS1uYXYtcHJldi1yaWdodDogdmFyKC0tbmF2LXNwYWNlKTstLW5hdi1wcmV2LWhvdmVyLXJpZ2h0OiB2YXIoLS1uYXYtaG92ZXItc3BhY2UpfS5nLWJveFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47b3JkZXI6MTtmbGV4OjF9LmctYm94LXRlbXBsYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwfSIsJ1tkZWJ1Zz10cnVlXVtfbmdob3N0LSVDT01QJV0gICAgIC5nLXNsaWRpbmcgZ2FsbGVyeS1pdGVtLmctaXRlbS1oaWdobGlnaHQsIFtkZWJ1Zz10cnVlXVtfbmdob3N0LSVDT01QJV0gICAgIC5nLXJlc2l6aW5nIGdhbGxlcnktaXRlbS5nLWl0ZW0taGlnaGxpZ2h0LCBbZGVidWc9dHJ1ZV1bX25naG9zdC0lQ09NUCVdICAgICAuZy1zY3JvbGxpbmcgZ2FsbGVyeS1pdGVtLmctaXRlbS1oaWdobGlnaHR7dmlzaWJpbGl0eTpoaWRkZW59W2RlYnVnPXRydWVdW19uZ2hvc3QtJUNPTVAlXSAgICAgZ2FsbGVyeS1zbGlkZXI6YWZ0ZXIsIFtkZWJ1Zz10cnVlXVtfbmdob3N0LSVDT01QJV0gICAgIGdhbGxlcnktc2xpZGVyOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OiIiO3otaW5kZXg6MTJ9W2RlYnVnPXRydWVdW19uZ2hvc3QtJUNPTVAlXSAgICAgZ2FsbGVyeS1zbGlkZXI6YmVmb3Jle3dpZHRoOjEwMCU7aGVpZ2h0OjA7Ym9yZGVyLXRvcDoxcHggZGFzaGVkIGxpbWV9W2RlYnVnPXRydWVdW19uZ2hvc3QtJUNPTVAlXSAgICAgZ2FsbGVyeS1zbGlkZXI6YWZ0ZXJ7aGVpZ2h0OjEwMCU7d2lkdGg6MDtib3JkZXItbGVmdDoxcHggZGFzaGVkIGxpbWV9W2RlYnVnPXRydWVdW19uZ2hvc3QtJUNPTVAlXSAgICAgZ2FsbGVyeS1zbGlkZXIgZ2FsbGVyeS1pdGVte291dGxpbmU6MXB4IHNvbGlkIGRhcmtvcmFuZ2V9W2RlYnVnPXRydWVdW19uZ2hvc3QtJUNPTVAlXSAgICAgZ2FsbGVyeS1zbGlkZXIgZ2FsbGVyeS1pdGVtLmctaXRlbS1oaWdobGlnaHQ6YWZ0ZXJ7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjozcHggc29saWQgbGltZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMH1bZGVidWc9dHJ1ZV1bX25naG9zdC0lQ09NUCVdICAgICAuZy1zbGlkaW5nIC5nLXNsaWRlci1zbGlkaW5ne2Rpc3BsYXk6YmxvY2t9W2RlYnVnPXRydWVdW19uZ2hvc3QtJUNPTVAlXSAgICAgLmctc2Nyb2xsaW5nIC5nLXNsaWRlci1zY3JvbGxpbmd7ZGlzcGxheTpibG9ja31bZGVidWc9dHJ1ZV1bX25naG9zdC0lQ09NUCVdICAgICAuZy1yZXNpemluZyAuZy1zbGlkZXItcmVzaXppbmd7ZGlzcGxheTpibG9ja31bZGVidWc9dHJ1ZV1bX25naG9zdC0lQ09NUCVdICAgICAuZy1zbGlkZXItZGVidWd7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2Rpc3BsYXk6ZmxleDtnYXA6NXB4O3BhZGRpbmc6MTBweH1bZGVidWc9dHJ1ZV1bX25naG9zdC0lQ09NUCVdICAgICAuZy1zbGlkZXItZGVidWcgLmctc2xpZGVyLXJlc2l6aW5ne2JhY2tncm91bmQ6I2Y1NGMyOH1bZGVidWc9dHJ1ZV1bX25naG9zdC0lQ09NUCVdICAgICAuZy1zbGlkZXItZGVidWcgLmctc2xpZGVyLXNjcm9sbGluZ3tiYWNrZ3JvdW5kOiNmZjg1MjR9W2RlYnVnPXRydWVdW19uZ2hvc3QtJUNPTVAlXSAgICAgLmctc2xpZGVyLWRlYnVnIC5nLXNsaWRlci1zbGlkaW5ne2JhY2tncm91bmQ6IzFmNmNiOX1bZGVidWc9dHJ1ZV1bX25naG9zdC0lQ09NUCVdICAgICAuZy1zbGlkZXItZGVidWcgZGl2LCBbZGVidWc9dHJ1ZV1bX25naG9zdC0lQ09NUCVdICAgICAuZy1zbGlkZXItZGVidWc6YmVmb3Jle2Rpc3BsYXk6bm9uZTtjb2xvcjojZmZmO2ZvbnQtZmFtaWx5Om1vbm9zcGFjZTt6LWluZGV4OjEyO3BhZGRpbmc6MnB4IDZweDtib3JkZXItcmFkaXVzOjNweH1bZGVidWc9dHJ1ZV1baXRlbUF1dG9TaXplPWZhbHNlXVtfbmdob3N0LSVDT01QJV0gICAgIC5nLXNsaWRlci1kZWJ1ZzpiZWZvcmV7Y29udGVudDp2YXIoLS1pbnRlcnNlY3Rpb24tbWFyZ2luKTtiYWNrZ3JvdW5kOiNlY2VjZWNkNjtjb2xvcjojMzYzNjM2O2Rpc3BsYXk6YmxvY2t9W2RlYnVnPXRydWVdW2l0ZW1BdXRvU2l6ZT10cnVlXVtfbmdob3N0LSVDT01QJV0gICAgIGdhbGxlcnktaXRlbTpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7bWFyZ2luOjEwcHg7Y29udGVudDp2YXIoLS1pdGVtLWludGVyc2VjdGlvbi1tYXJnaW4pO2JhY2tncm91bmQ6I2VjZWNlY2Q2O2NvbG9yOiMzNjM2MzY7ZGlzcGxheTpibG9jazt3aWR0aDoyNzBweDtmb250LWZhbWlseTptb25vc3BhY2U7ei1pbmRleDoxMjtwYWRkaW5nOjJweCA2cHg7Ym9yZGVyLXJhZGl1czozcHh9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KX19cmV0dXJuIHR9KSgpLE01PSgoKT0+e2NsYXNzIHR7Y29uc3RydWN0b3IoZSl7dGhpcy50ZW1wbGF0ZVJlZj1lfXN0YXRpYyBuZ1RlbXBsYXRlQ29udGV4dEd1YXJkKGUsaSl7cmV0dXJuITB9c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCkoaXQoaDEpKX19c3RhdGlje3RoaXMuXHUwMjc1ZGlyPVgoe3R5cGU6dCxzZWxlY3RvcnM6W1siIiwiZ2FsbGVyeUltYWdlRGVmIiwiIl1dfSl9fXJldHVybiB0fSkoKSxaVj0oKCk9PntjbGFzcyB0e2NvbnN0cnVjdG9yKGUpe3RoaXMudGVtcGxhdGVSZWY9ZX1zdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZChlLGkpe3JldHVybiEwfXN0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpKGl0KGgxKSl9fXN0YXRpY3t0aGlzLlx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbIiIsImdhbGxlcnlUaHVtYkRlZiIsIiJdXX0pfX1yZXR1cm4gdH0pKCksJFY9KCgpPT57Y2xhc3MgdHtjb25zdHJ1Y3RvcihlKXt0aGlzLnRlbXBsYXRlUmVmPWV9c3RhdGljIG5nVGVtcGxhdGVDb250ZXh0R3VhcmQoZSxpKXtyZXR1cm4hMH1zdGF0aWN7dGhpcy5cdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KShpdChoMSkpfX1zdGF0aWN7dGhpcy5cdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJnYWxsZXJ5SXRlbURlZiIsIiJdXX0pfX1yZXR1cm4gdH0pKCksS1Y9KCgpPT57Y2xhc3MgdHtjb25zdHJ1Y3RvcihlKXt0aGlzLnRlbXBsYXRlUmVmPWV9c3RhdGljIG5nVGVtcGxhdGVDb250ZXh0R3VhcmQoZSxpKXtyZXR1cm4hMH1zdGF0aWN7dGhpcy5cdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KShpdChoMSkpfX1zdGF0aWN7dGhpcy5cdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyIiLCJnYWxsZXJ5Qm94RGVmIiwiIl1dfSl9fXJldHVybiB0fSkoKSxYVj0oKCk9PntjbGFzcyB0e2NvbnN0cnVjdG9yKGUsaSl7dGhpcy5fZ2FsbGVyeT1lLHRoaXMuX2ltZ01hbmFnZXI9aX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9nYWxsZXJ5UmVmPXRoaXMuX2dhbGxlcnkucmVmKHRoaXMuZ2FsbGVyeUlkKSx0aGlzLl9zdWJzY3JpYmUoKSx0aGlzLmNvbmZpZy5hdXRvcGxheSYmdGhpcy5fZ2FsbGVyeVJlZi5wbGF5KCl9bmdPbkNoYW5nZXMoZSl7dGhpcy5fZ2FsbGVyeVJlZiYmZS5jb25maWc/LmN1cnJlbnRWYWx1ZS5hdXRvcGxheSE9PWUuY29uZmlnPy5wcmV2aW91c1ZhbHVlLmF1dG9wbGF5JiYodGhpcy5jb25maWcuYXV0b3BsYXk/dGhpcy5fZ2FsbGVyeVJlZi5wbGF5KCk6dGhpcy5fZ2FsbGVyeVJlZi5zdG9wKCkpfW5nT25EZXN0cm95KCl7dGhpcy5fdW5zdWJzY3JpYmUoKX1fc3Vic2NyaWJlKCl7dGhpcy5fdW5zdWJzY3JpYmUoKSx0aGlzLl9jdXJyZW50U3Vic2NyaXB0aW9uPXRoaXMuX2dhbGxlcnlSZWYucGxheWluZ0NoYW5nZWQucGlwZShxMShlPT5lLmlzUGxheWluZz90aGlzLl9pbWdNYW5hZ2VyLmdldEFjdGl2ZUl0ZW0odGhpcy5fZ2FsbGVyeVJlZi5zdGF0ZSkucGlwZShxMSgoKT0+YzEoe30pLnBpcGUoQWQodGhpcy5jb25maWcuYXV0b3BsYXlJbnRlcnZhbCksaHIoKCk9Pnt0aGlzLl9nYWxsZXJ5UmVmLnN0YXRlU25hcHNob3QuaGFzTmV4dD90aGlzLl9nYWxsZXJ5UmVmLm5leHQodGhpcy5jb25maWcuc2Nyb2xsQmVoYXZpb3IpOnRoaXMuX2dhbGxlcnlSZWYuc2V0KDAsdGhpcy5jb25maWcuc2Nyb2xsQmVoYXZpb3IpfSkpKSk6SGkpKS5zdWJzY3JpYmUoKX1fdW5zdWJzY3JpYmUoKXt0aGlzLl9jdXJyZW50U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpfXN0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpKGl0KG9uKSxpdChFYykpfX1zdGF0aWN7dGhpcy5cdTAyNzVkaXI9WCh7dHlwZTp0LHNlbGVjdG9yczpbWyJnYWxsZXJ5LWNvcmUiLCJhdXRvcGxheSIsIiJdXSxpbnB1dHM6e2NvbmZpZzoiY29uZmlnIixnYWxsZXJ5SWQ6ImdhbGxlcnlJZCJ9LGZlYXR1cmVzOltIZV19KX19cmV0dXJuIHR9KSgpLHc1PSgoKT0+e2NsYXNzIHR7Y29uc3RydWN0b3IoZSl7dGhpcy5fZ2FsbGVyeT1lLHRoaXMuaWQ9InJvb3QiLHRoaXMubmF2PXRoaXMuX2dhbGxlcnkuY29uZmlnLm5hdix0aGlzLmJ1bGxldHM9dGhpcy5fZ2FsbGVyeS5jb25maWcuYnVsbGV0cyx0aGlzLmxvb3A9dGhpcy5fZ2FsbGVyeS5jb25maWcubG9vcCx0aGlzLmRlYnVnPXRoaXMuX2dhbGxlcnkuY29uZmlnLmRlYnVnLHRoaXMudGh1bWJzPXRoaXMuX2dhbGxlcnkuY29uZmlnLnRodW1icyx0aGlzLmNvdW50ZXI9dGhpcy5fZ2FsbGVyeS5jb25maWcuY291bnRlcix0aGlzLmRldGFjaFRodW1icz10aGlzLl9nYWxsZXJ5LmNvbmZpZy5kZXRhY2hUaHVtYnMsdGhpcy50aHVtYkF1dG9zaXplPXRoaXMuX2dhbGxlcnkuY29uZmlnLnRodW1iQXV0b3NpemUsdGhpcy5pdGVtQXV0b3NpemU9dGhpcy5fZ2FsbGVyeS5jb25maWcuaXRlbUF1dG9zaXplLHRoaXMuYXV0b0hlaWdodD10aGlzLl9nYWxsZXJ5LmNvbmZpZy5hdXRvSGVpZ2h0LHRoaXMuYXV0b3BsYXk9dGhpcy5fZ2FsbGVyeS5jb25maWcuYXV0b3BsYXksdGhpcy5kaXNhYmxlVGh1bWJzPXRoaXMuX2dhbGxlcnkuY29uZmlnLmRpc2FibGVUaHVtYnMsdGhpcy5kaXNhYmxlQnVsbGV0cz10aGlzLl9nYWxsZXJ5LmNvbmZpZy5kaXNhYmxlQnVsbGV0cyx0aGlzLmRpc2FibGVTY3JvbGw9dGhpcy5fZ2FsbGVyeS5jb25maWcuZGlzYWJsZVNjcm9sbCx0aGlzLmRpc2FibGVUaHVtYlNjcm9sbD10aGlzLl9nYWxsZXJ5LmNvbmZpZy5kaXNhYmxlVGh1bWJTY3JvbGwsdGhpcy50aHVtYkNlbnRyYWxpemVkPXRoaXMuX2dhbGxlcnkuY29uZmlnLnRodW1iQ2VudHJhbGl6ZWQsdGhpcy5kaXNhYmxlTW91c2VTY3JvbGw9dGhpcy5fZ2FsbGVyeS5jb25maWcuZGlzYWJsZU1vdXNlU2Nyb2xsLHRoaXMuZGlzYWJsZVRodW1iTW91c2VTY3JvbGw9dGhpcy5fZ2FsbGVyeS5jb25maWcuZGlzYWJsZVRodW1iTW91c2VTY3JvbGwsdGhpcy5idWxsZXRTaXplPXRoaXMuX2dhbGxlcnkuY29uZmlnLmJ1bGxldFNpemUsdGhpcy50aHVtYldpZHRoPXRoaXMuX2dhbGxlcnkuY29uZmlnLnRodW1iV2lkdGgsdGhpcy50aHVtYkhlaWdodD10aGlzLl9nYWxsZXJ5LmNvbmZpZy50aHVtYkhlaWdodCx0aGlzLmF1dG9wbGF5SW50ZXJ2YWw9dGhpcy5fZ2FsbGVyeS5jb25maWcuYXV0b3BsYXlJbnRlcnZhbCx0aGlzLnNjcm9sbER1cmF0aW9uPXRoaXMuX2dhbGxlcnkuY29uZmlnLnNjcm9sbER1cmF0aW9uLHRoaXMucmVzaXplRGVib3VuY2VUaW1lPXRoaXMuX2dhbGxlcnkuY29uZmlnLnJlc2l6ZURlYm91bmNlVGltZSx0aGlzLnNjcm9sbEJlaGF2aW9yPXRoaXMuX2dhbGxlcnkuY29uZmlnLnNjcm9sbEJlaGF2aW9yLHRoaXMuc2Nyb2xsRWFzZT10aGlzLl9nYWxsZXJ5LmNvbmZpZy5zY3JvbGxFYXNlLHRoaXMuaW1hZ2VTaXplPXRoaXMuX2dhbGxlcnkuY29uZmlnLmltYWdlU2l6ZSx0aGlzLnRodW1iSW1hZ2VTaXplPXRoaXMuX2dhbGxlcnkuY29uZmlnLnRodW1iSW1hZ2VTaXplLHRoaXMuYnVsbGV0UG9zaXRpb249dGhpcy5fZ2FsbGVyeS5jb25maWcuYnVsbGV0UG9zaXRpb24sdGhpcy5jb3VudGVyUG9zaXRpb249dGhpcy5fZ2FsbGVyeS5jb25maWcuY291bnRlclBvc2l0aW9uLHRoaXMub3JpZW50YXRpb249dGhpcy5fZ2FsbGVyeS5jb25maWcub3JpZW50YXRpb24sdGhpcy5sb2FkaW5nQXR0cj10aGlzLl9nYWxsZXJ5LmNvbmZpZy5sb2FkaW5nQXR0cix0aGlzLmxvYWRpbmdTdHJhdGVneT10aGlzLl9nYWxsZXJ5LmNvbmZpZy5sb2FkaW5nU3RyYXRlZ3ksdGhpcy50aHVtYlBvc2l0aW9uPXRoaXMuX2dhbGxlcnkuY29uZmlnLnRodW1iUG9zaXRpb24sdGhpcy5kZXN0cm95UmVmPSEwLHRoaXMuc2tpcEluaXRDb25maWc9ITEsdGhpcy5pdGVtQ2xpY2s9bmV3IE4sdGhpcy50aHVtYkNsaWNrPW5ldyBOLHRoaXMucGxheWluZ0NoYW5nZT1uZXcgTix0aGlzLmluZGV4Q2hhbmdlPW5ldyBOLHRoaXMuaXRlbXNDaGFuZ2U9bmV3IE4sdGhpcy5lcnJvcj1uZXcgTn1nZXRDb25maWcoKXtyZXR1cm57bmF2OnRoaXMubmF2LGJ1bGxldHM6dGhpcy5idWxsZXRzLGxvb3A6dGhpcy5sb29wLGRlYnVnOnRoaXMuZGVidWcsdGh1bWJzOnRoaXMudGh1bWJzLGNvdW50ZXI6dGhpcy5jb3VudGVyLGF1dG9wbGF5OnRoaXMuYXV0b3BsYXksYnVsbGV0U2l6ZTp0aGlzLmJ1bGxldFNpemUsaW1hZ2VTaXplOnRoaXMuaW1hZ2VTaXplLHRodW1iSW1hZ2VTaXplOnRoaXMudGh1bWJJbWFnZVNpemUsc2Nyb2xsQmVoYXZpb3I6dGhpcy5zY3JvbGxCZWhhdmlvcix0aHVtYkNlbnRyYWxpemVkOnRoaXMudGh1bWJDZW50cmFsaXplZCx0aHVtYldpZHRoOnRoaXMudGh1bWJXaWR0aCx0aHVtYkhlaWdodDp0aGlzLnRodW1iSGVpZ2h0LHNjcm9sbEVhc2U6dGhpcy5zY3JvbGxFYXNlLGJ1bGxldFBvc2l0aW9uOnRoaXMuYnVsbGV0UG9zaXRpb24sbG9hZGluZ0F0dHI6dGhpcy5sb2FkaW5nQXR0cixkZXRhY2hUaHVtYnM6dGhpcy5kZXRhY2hUaHVtYnMsdGh1bWJQb3NpdGlvbjp0aGlzLnRodW1iUG9zaXRpb24sYXV0b3BsYXlJbnRlcnZhbDp0aGlzLmF1dG9wbGF5SW50ZXJ2YWwsY291bnRlclBvc2l0aW9uOnRoaXMuY291bnRlclBvc2l0aW9uLGxvYWRpbmdTdHJhdGVneTp0aGlzLmxvYWRpbmdTdHJhdGVneSxzY3JvbGxEdXJhdGlvbjp0aGlzLnNjcm9sbER1cmF0aW9uLG9yaWVudGF0aW9uOnRoaXMub3JpZW50YXRpb24scmVzaXplRGVib3VuY2VUaW1lOnRoaXMucmVzaXplRGVib3VuY2VUaW1lLGRpc2FibGVCdWxsZXRzOnRoaXMuZGlzYWJsZUJ1bGxldHMsZGlzYWJsZVRodW1iczp0aGlzLmRpc2FibGVUaHVtYnMsZGlzYWJsZVNjcm9sbDp0aGlzLmRpc2FibGVTY3JvbGwsZGlzYWJsZVRodW1iU2Nyb2xsOnRoaXMuZGlzYWJsZVRodW1iU2Nyb2xsLGRpc2FibGVNb3VzZVNjcm9sbDp0aGlzLmRpc2FibGVNb3VzZVNjcm9sbCxkaXNhYmxlVGh1bWJNb3VzZVNjcm9sbDp0aGlzLmRpc2FibGVUaHVtYk1vdXNlU2Nyb2xsLHRodW1iQXV0b3NpemU6dGhpcy50aHVtYkF1dG9zaXplLGl0ZW1BdXRvc2l6ZTp0aGlzLml0ZW1BdXRvc2l6ZSxhdXRvSGVpZ2h0OnRoaXMuYXV0b0hlaWdodH19bmdPbkNoYW5nZXMoZSl7dGhpcy5nYWxsZXJ5UmVmJiYodGhpcy5nYWxsZXJ5UmVmLnNldENvbmZpZyh0aGlzLmdldENvbmZpZygpKSxlLml0ZW1zJiZlLml0ZW1zLmN1cnJlbnRWYWx1ZSE9PWUuaXRlbXMucHJldmlvdXNWYWx1ZSYmdGhpcy5sb2FkKHRoaXMuaXRlbXMpKX1uZ09uSW5pdCgpe3RoaXMuc2tpcEluaXRDb25maWc/dGhpcy5nYWxsZXJ5UmVmPXRoaXMuX2dhbGxlcnkucmVmKHRoaXMuaWQpOnRoaXMuZ2FsbGVyeVJlZj10aGlzLl9nYWxsZXJ5LnJlZih0aGlzLmlkLHRoaXMuZ2V0Q29uZmlnKCkpLHRoaXMubG9hZCh0aGlzLml0ZW1zKSx0aGlzLmluZGV4Q2hhbmdlLm9ic2VydmVkJiYodGhpcy5faW5kZXhDaGFuZ2UkPXRoaXMuZ2FsbGVyeVJlZi5pbmRleENoYW5nZWQuc3Vic2NyaWJlKGU9PnRoaXMuaW5kZXhDaGFuZ2UuZW1pdChlKSkpLHRoaXMuaXRlbXNDaGFuZ2Uub2JzZXJ2ZWQmJih0aGlzLl9pdGVtQ2hhbmdlJD10aGlzLmdhbGxlcnlSZWYuaXRlbXNDaGFuZ2VkLnN1YnNjcmliZShlPT50aGlzLml0ZW1zQ2hhbmdlLmVtaXQoZSkpKSx0aGlzLnBsYXlpbmdDaGFuZ2Uub2JzZXJ2ZWQmJih0aGlzLl9wbGF5aW5nQ2hhbmdlJD10aGlzLmdhbGxlcnlSZWYucGxheWluZ0NoYW5nZWQuc3Vic2NyaWJlKGU9PnRoaXMucGxheWluZ0NoYW5nZS5lbWl0KGUpKSl9bmdBZnRlckNvbnRlbnRJbml0KCl7bGV0IGU9e307dGhpcy5fZ2FsbGVyeUl0ZW1EZWYmJihlLml0ZW1UZW1wbGF0ZT10aGlzLl9nYWxsZXJ5SXRlbURlZi50ZW1wbGF0ZVJlZiksdGhpcy5fZ2FsbGVyeUltYWdlRGVmJiYoZS5pbWFnZVRlbXBsYXRlPXRoaXMuX2dhbGxlcnlJbWFnZURlZi50ZW1wbGF0ZVJlZiksdGhpcy5fZ2FsbGVyeVRodW1iRGVmJiYoZS50aHVtYlRlbXBsYXRlPXRoaXMuX2dhbGxlcnlUaHVtYkRlZi50ZW1wbGF0ZVJlZiksdGhpcy5fZ2FsbGVyeUJveERlZiYmKGUuYm94VGVtcGxhdGU9dGhpcy5fZ2FsbGVyeUJveERlZi50ZW1wbGF0ZVJlZiksT2JqZWN0LmtleXMoZSkubGVuZ3RoJiZ0aGlzLmdhbGxlcnlSZWYuc2V0Q29uZmlnKGUpfW5nT25EZXN0cm95KCl7dGhpcy5faXRlbUNsaWNrJD8udW5zdWJzY3JpYmUoKSx0aGlzLl90aHVtYkNsaWNrJD8udW5zdWJzY3JpYmUoKSx0aGlzLl9pdGVtQ2hhbmdlJD8udW5zdWJzY3JpYmUoKSx0aGlzLl9pbmRleENoYW5nZSQ/LnVuc3Vic2NyaWJlKCksdGhpcy5fcGxheWluZ0NoYW5nZSQ/LnVuc3Vic2NyaWJlKCksdGhpcy5kZXN0cm95UmVmJiZ0aGlzLmdhbGxlcnlSZWY/LmRlc3Ryb3koKX1vbkl0ZW1DbGljayhlKXt0aGlzLml0ZW1DbGljay5lbWl0KGUpLHRoaXMuZ2FsbGVyeVJlZi5pdGVtQ2xpY2submV4dChlKX1vblRodW1iQ2xpY2soZSl7dGhpcy5nYWxsZXJ5UmVmLnNldChlKSx0aGlzLnRodW1iQ2xpY2suZW1pdChlKSx0aGlzLmdhbGxlcnlSZWYudGh1bWJDbGljay5uZXh0KGUpfW9uRXJyb3IoZSl7dGhpcy5lcnJvci5lbWl0KGUpLHRoaXMuZ2FsbGVyeVJlZi5lcnJvci5uZXh0KGUpfWxvYWQoZSl7dGhpcy5nYWxsZXJ5UmVmLmxvYWQoZSl9YWRkKGUsaSl7dGhpcy5nYWxsZXJ5UmVmLmFkZChlLGkpfWFkZEltYWdlKGUsaSl7dGhpcy5nYWxsZXJ5UmVmLmFkZEltYWdlKGUsaSl9YWRkVmlkZW8oZSxpKXt0aGlzLmdhbGxlcnlSZWYuYWRkVmlkZW8oZSxpKX1hZGRJZnJhbWUoZSxpKXt0aGlzLmdhbGxlcnlSZWYuYWRkSWZyYW1lKGUsaSl9YWRkWW91dHViZShlLGkpe3RoaXMuZ2FsbGVyeVJlZi5hZGRZb3V0dWJlKGUsaSl9YWRkVmltZW8oZSxpKXt0aGlzLmdhbGxlcnlSZWYuYWRkVmltZW8oZSxpKX1yZW1vdmUoZSl7dGhpcy5nYWxsZXJ5UmVmLnJlbW92ZShlKX1uZXh0KGUsaSl7dGhpcy5nYWxsZXJ5UmVmLm5leHQoZSxpKX1wcmV2KGUsaSl7dGhpcy5nYWxsZXJ5UmVmLnByZXYoZSxpKX1zZXQoZSxpKXt0aGlzLmdhbGxlcnlSZWYuc2V0KGUsaSl9cmVzZXQoKXt0aGlzLmdhbGxlcnlSZWYucmVzZXQoKX1wbGF5KGUpe3RoaXMuZ2FsbGVyeVJlZi5wbGF5KGUpfXN0b3AoKXt0aGlzLmdhbGxlcnlSZWYuc3RvcCgpfXN0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpKGl0KG9uKSl9fXN0YXRpY3t0aGlzLlx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImdhbGxlcnkiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24oaSxhLHIpe2lmKGkmMSYmKEJlKHIsJFYsNSksQmUocixNNSw1KSxCZShyLFpWLDUpLEJlKHIsS1YsNSkpLGkmMil7bGV0IG87RihvPUIoKSkmJihhLl9nYWxsZXJ5SXRlbURlZj1vLmZpcnN0KSxGKG89QigpKSYmKGEuX2dhbGxlcnlJbWFnZURlZj1vLmZpcnN0KSxGKG89QigpKSYmKGEuX2dhbGxlcnlUaHVtYkRlZj1vLmZpcnN0KSxGKG89QigpKSYmKGEuX2dhbGxlcnlCb3hEZWY9by5maXJzdCl9fSxpbnB1dHM6e2lkOiJpZCIsaXRlbXM6Iml0ZW1zIixuYXY6WzIsIm5hdiIsIm5hdiIsWl0sYnVsbGV0czpbMiwiYnVsbGV0cyIsImJ1bGxldHMiLFpdLGxvb3A6WzIsImxvb3AiLCJsb29wIixaXSxkZWJ1ZzpbMiwiZGVidWciLCJkZWJ1ZyIsWl0sdGh1bWJzOlsyLCJ0aHVtYnMiLCJ0aHVtYnMiLFpdLGNvdW50ZXI6WzIsImNvdW50ZXIiLCJjb3VudGVyIixaXSxkZXRhY2hUaHVtYnM6WzIsImRldGFjaFRodW1icyIsImRldGFjaFRodW1icyIsWl0sdGh1bWJBdXRvc2l6ZTpbMiwidGh1bWJBdXRvc2l6ZSIsInRodW1iQXV0b3NpemUiLFpdLGl0ZW1BdXRvc2l6ZTpbMiwiaXRlbUF1dG9zaXplIiwiaXRlbUF1dG9zaXplIixaXSxhdXRvSGVpZ2h0OlsyLCJhdXRvSGVpZ2h0IiwiYXV0b0hlaWdodCIsWl0sYXV0b3BsYXk6WzIsImF1dG9wbGF5IiwiYXV0b3BsYXkiLFpdLGRpc2FibGVUaHVtYnM6WzIsImRpc2FibGVUaHVtYnMiLCJkaXNhYmxlVGh1bWJzIixaXSxkaXNhYmxlQnVsbGV0czpbMiwiZGlzYWJsZUJ1bGxldHMiLCJkaXNhYmxlQnVsbGV0cyIsWl0sZGlzYWJsZVNjcm9sbDpbMiwiZGlzYWJsZVNjcm9sbCIsImRpc2FibGVTY3JvbGwiLFpdLGRpc2FibGVUaHVtYlNjcm9sbDpbMiwiZGlzYWJsZVRodW1iU2Nyb2xsIiwiZGlzYWJsZVRodW1iU2Nyb2xsIixaXSx0aHVtYkNlbnRyYWxpemVkOlsyLCJ0aHVtYkNlbnRyYWxpemVkIiwidGh1bWJDZW50cmFsaXplZCIsWl0sZGlzYWJsZU1vdXNlU2Nyb2xsOlsyLCJkaXNhYmxlTW91c2VTY3JvbGwiLCJkaXNhYmxlTW91c2VTY3JvbGwiLFpdLGRpc2FibGVUaHVtYk1vdXNlU2Nyb2xsOlsyLCJkaXNhYmxlVGh1bWJNb3VzZVNjcm9sbCIsImRpc2FibGVUaHVtYk1vdXNlU2Nyb2xsIixaXSxidWxsZXRTaXplOlsyLCJidWxsZXRTaXplIiwiYnVsbGV0U2l6ZSIsb3RdLHRodW1iV2lkdGg6WzIsInRodW1iV2lkdGgiLCJ0aHVtYldpZHRoIixvdF0sdGh1bWJIZWlnaHQ6WzIsInRodW1iSGVpZ2h0IiwidGh1bWJIZWlnaHQiLG90XSxhdXRvcGxheUludGVydmFsOlsyLCJhdXRvcGxheUludGVydmFsIiwiYXV0b3BsYXlJbnRlcnZhbCIsb3RdLHNjcm9sbER1cmF0aW9uOlsyLCJzY3JvbGxEdXJhdGlvbiIsInNjcm9sbER1cmF0aW9uIixvdF0scmVzaXplRGVib3VuY2VUaW1lOlsyLCJyZXNpemVEZWJvdW5jZVRpbWUiLCJyZXNpemVEZWJvdW5jZVRpbWUiLG90XSxzY3JvbGxCZWhhdmlvcjoic2Nyb2xsQmVoYXZpb3IiLHNjcm9sbEVhc2U6InNjcm9sbEVhc2UiLGltYWdlU2l6ZToiaW1hZ2VTaXplIix0aHVtYkltYWdlU2l6ZToidGh1bWJJbWFnZVNpemUiLGJ1bGxldFBvc2l0aW9uOiJidWxsZXRQb3NpdGlvbiIsY291bnRlclBvc2l0aW9uOiJjb3VudGVyUG9zaXRpb24iLG9yaWVudGF0aW9uOiJvcmllbnRhdGlvbiIsbG9hZGluZ0F0dHI6ImxvYWRpbmdBdHRyIixsb2FkaW5nU3RyYXRlZ3k6ImxvYWRpbmdTdHJhdGVneSIsdGh1bWJQb3NpdGlvbjoidGh1bWJQb3NpdGlvbiIsZGVzdHJveVJlZjoiZGVzdHJveVJlZiIsc2tpcEluaXRDb25maWc6InNraXBJbml0Q29uZmlnIn0sb3V0cHV0czp7aXRlbUNsaWNrOiJpdGVtQ2xpY2siLHRodW1iQ2xpY2s6InRodW1iQ2xpY2siLHBsYXlpbmdDaGFuZ2U6InBsYXlpbmdDaGFuZ2UiLGluZGV4Q2hhbmdlOiJpbmRleENoYW5nZSIsaXRlbXNDaGFuZ2U6Iml0ZW1zQ2hhbmdlIixlcnJvcjoiZXJyb3IifSxmZWF0dXJlczpbSWUoW0VjXSksSGVdLGRlY2xzOjMsdmFyczo3LGNvbnN0czpbWyJhdXRvcGxheSIsIiIsMywiaXRlbUNsaWNrIiwidGh1bWJDbGljayIsImVycm9yIiwiZ2FsbGVyeUlkIiwic3RhdGUiLCJjb25maWciXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsImdhbGxlcnktY29yZSIsMCksYigxLCJhc3luYyIpLGIoMiwiYXN5bmMiKSxTKCJpdGVtQ2xpY2siLGZ1bmN0aW9uKG8pe3JldHVybiBhLm9uSXRlbUNsaWNrKG8pfSkoInRodW1iQ2xpY2siLGZ1bmN0aW9uKG8pe3JldHVybiBhLm9uVGh1bWJDbGljayhvKX0pKCJlcnJvciIsZnVuY3Rpb24obyl7cmV0dXJuIGEub25FcnJvcihvKX0pLHMoKSksaSYyJiZmKCJnYWxsZXJ5SWQiLGEuaWQpKCJzdGF0ZSIsQygxLDMsYS5nYWxsZXJ5UmVmLnN0YXRlKSkoImNvbmZpZyIsQygyLDUsYS5nYWxsZXJ5UmVmLmNvbmZpZykpfSxkZXBlbmRlbmNpZXM6W0RpLFVhLFlWLFhWXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjt6LWluZGV4OjE7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IzAwMDstLWctaGVpZ2h0LXRyYW5zaXRpb246IGhlaWdodCA0NjhtcyBjdWJpYy1iZXppZXIoLjQyLCAwLCAuNTgsIDEpOy0tZy1uYXYtZHJvcC1zaGFkb3c6IGRyb3Atc2hhZG93KDAgMCAycHggcmdiYSgwLCAwLCAwLCAuNikpOy0tZy1ib3gtc2hhZG93OiAwIDAgM3B4IHJnYmEoMCwgMCwgMCwgLjYpOy0tZy1mb250LWNvbG9yOiAjMDAwOy0tZy1vdmVybGF5LWNvbG9yOiAjZmZmOy0tZy1ndXR0ZXItc2l6ZTogMXB4fVtnYWxsZXJpemVdW19uZ2hvc3QtJUNPTVAlXXstLWctaXRlbS1jdXJzb3I6IHBvaW50ZXJ9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KX19cmV0dXJuIHR9KSgpLEpnPSgoKT0+e2NsYXNzIHR7c3RhdGlje3RoaXMuXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9fXN0YXRpY3t0aGlzLlx1MDI3NW1vZD14ZSh7dHlwZTp0fSl9c3RhdGlje3RoaXMuXHUwMjc1aW5qPXllKHtpbXBvcnRzOlt3NV19KX19cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gZXYodCl7cmV0dXJuIG5ldyBVdCgzZTMsITEpfWZ1bmN0aW9uIEpWKCl7cmV0dXJuIG5ldyBVdCgzMTAwLCExKX1mdW5jdGlvbiBlTygpe3JldHVybiBuZXcgVXQoMzEwMSwhMSl9ZnVuY3Rpb24gdE8odCl7cmV0dXJuIG5ldyBVdCgzMDAxLCExKX1mdW5jdGlvbiBpTyh0KXtyZXR1cm4gbmV3IFV0KDMwMDMsITEpfWZ1bmN0aW9uIGFPKHQpe3JldHVybiBuZXcgVXQoMzAwNCwhMSl9ZnVuY3Rpb24gaXYodCxuKXtyZXR1cm4gbmV3IFV0KDMwMDUsITEpfWZ1bmN0aW9uIGF2KCl7cmV0dXJuIG5ldyBVdCgzMDA2LCExKX1mdW5jdGlvbiBudigpe3JldHVybiBuZXcgVXQoMzAwNywhMSl9ZnVuY3Rpb24gcnYodCxuKXtyZXR1cm4gbmV3IFV0KDMwMDgsITEpfWZ1bmN0aW9uIG92KHQpe3JldHVybiBuZXcgVXQoMzAwMiwhMSl9ZnVuY3Rpb24gY3YodCxuLGUsaSxhKXtyZXR1cm4gbmV3IFV0KDMwMTAsITEpfWZ1bmN0aW9uIHN2KCl7cmV0dXJuIG5ldyBVdCgzMDExLCExKX1mdW5jdGlvbiBsdigpe3JldHVybiBuZXcgVXQoMzAxMiwhMSl9ZnVuY3Rpb24gZHYoKXtyZXR1cm4gbmV3IFV0KDMyMDAsITEpfWZ1bmN0aW9uIG12KCl7cmV0dXJuIG5ldyBVdCgzMjAyLCExKX1mdW5jdGlvbiBodigpe3JldHVybiBuZXcgVXQoMzAxMywhMSl9ZnVuY3Rpb24gcHYodCl7cmV0dXJuIG5ldyBVdCgzMDE0LCExKX1mdW5jdGlvbiBmdih0KXtyZXR1cm4gbmV3IFV0KDMwMTUsITEpfWZ1bmN0aW9uIHV2KHQpe3JldHVybiBuZXcgVXQoMzAxNiwhMSl9ZnVuY3Rpb24gZ3YodCxuKXtyZXR1cm4gbmV3IFV0KDM0MDQsITEpfWZ1bmN0aW9uIG5PKHQpe3JldHVybiBuZXcgVXQoMzUwMiwhMSl9ZnVuY3Rpb24gdnYodCl7cmV0dXJuIG5ldyBVdCgzNTAzLCExKX1mdW5jdGlvbiBfdigpe3JldHVybiBuZXcgVXQoMzMwMCwhMSl9ZnVuY3Rpb24gYnYodCl7cmV0dXJuIG5ldyBVdCgzNTA0LCExKX1mdW5jdGlvbiBDdih0KXtyZXR1cm4gbmV3IFV0KDMzMDEsITEpfWZ1bmN0aW9uIHl2KHQsbil7cmV0dXJuIG5ldyBVdCgzMzAyLCExKX1mdW5jdGlvbiB4dih0KXtyZXR1cm4gbmV3IFV0KDMzMDMsITEpfWZ1bmN0aW9uIE12KHQsbil7cmV0dXJuIG5ldyBVdCgzNDAwLCExKX1mdW5jdGlvbiB3dih0KXtyZXR1cm4gbmV3IFV0KDM0MDEsITEpfWZ1bmN0aW9uIFN2KHQpe3JldHVybiBuZXcgVXQoMzQwMiwhMSl9ZnVuY3Rpb24ga3YodCxuKXtyZXR1cm4gbmV3IFV0KDM1MDUsITEpfWZ1bmN0aW9uIEFhKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgY2E7Y2FzZSAxOnJldHVybiB0WzBdO2RlZmF1bHQ6cmV0dXJuIG5ldyBXbih0KX19ZnVuY3Rpb24gRTUodCxuLGU9bmV3IE1hcCxpPW5ldyBNYXApe2xldCBhPVtdLHI9W10sbz0tMSxkPW51bGw7aWYobi5mb3JFYWNoKHA9PntsZXQgZz1wLmdldCgib2Zmc2V0IiksXz1nPT1vLHk9XyYmZHx8bmV3IE1hcDtwLmZvckVhY2goKEksUCk9PntsZXQgVj1QLE89STtpZihQIT09Im9mZnNldCIpc3dpdGNoKFY9dC5ub3JtYWxpemVQcm9wZXJ0eU5hbWUoVixhKSxPKXtjYXNlIGVvOk89ZS5nZXQoUCk7YnJlYWs7Y2FzZSB5MjpPPWkuZ2V0KFApO2JyZWFrO2RlZmF1bHQ6Tz10Lm5vcm1hbGl6ZVN0eWxlVmFsdWUoUCxWLE8sYSk7YnJlYWt9eS5zZXQoVixPKX0pLF98fHIucHVzaCh5KSxkPXksbz1nfSksYS5sZW5ndGgpdGhyb3cgbk8oYSk7cmV0dXJuIHJ9ZnVuY3Rpb24gQWModCxuLGUsaSl7c3dpdGNoKG4pe2Nhc2Uic3RhcnQiOnQub25TdGFydCgoKT0+aShlJiZrNShlLCJzdGFydCIsdCkpKTticmVhaztjYXNlImRvbmUiOnQub25Eb25lKCgpPT5pKGUmJms1KGUsImRvbmUiLHQpKSk7YnJlYWs7Y2FzZSJkZXN0cm95Ijp0Lm9uRGVzdHJveSgoKT0+aShlJiZrNShlLCJkZXN0cm95Iix0KSkpO2JyZWFrfX1mdW5jdGlvbiBrNSh0LG4sZSl7bGV0IGk9ZS50b3RhbFRpbWUsYT0hIWUuZGlzYWJsZWQscj1EYyh0LmVsZW1lbnQsdC50cmlnZ2VyTmFtZSx0LmZyb21TdGF0ZSx0LnRvU3RhdGUsbnx8dC5waGFzZU5hbWUsaT8/dC50b3RhbFRpbWUsYSksbz10Ll9kYXRhO3JldHVybiBvIT1udWxsJiYoci5fZGF0YT1vKSxyfWZ1bmN0aW9uIERjKHQsbixlLGksYT0iIixyPTAsbyl7cmV0dXJue2VsZW1lbnQ6dCx0cmlnZ2VyTmFtZTpuLGZyb21TdGF0ZTplLHRvU3RhdGU6aSxwaGFzZU5hbWU6YSx0b3RhbFRpbWU6cixkaXNhYmxlZDohIW99fWZ1bmN0aW9uIEdpKHQsbixlKXtsZXQgaT10LmdldChuKTtyZXR1cm4gaXx8dC5zZXQobixpPWUpLGl9ZnVuY3Rpb24gQTUodCl7bGV0IG49dC5pbmRleE9mKCI6IiksZT10LnN1YnN0cmluZygxLG4pLGk9dC5zbGljZShuKzEpO3JldHVybltlLGldfWZ1bmN0aW9uIEljKHQpe2xldCBuPXQucGFyZW50Tm9kZXx8dC5ob3N0fHxudWxsO3JldHVybiBuPT09ck8/bnVsbDpufWZ1bmN0aW9uIG9PKHQpe3JldHVybiB0LnN1YnN0cmluZygxLDYpPT0iZWJraXQifWZ1bmN0aW9uIHp2KHQpe0tufHwoS249Y08oKXx8e30sdHY9S24uc3R5bGU/IldlYmtpdEFwcGVhcmFuY2UiaW4gS24uc3R5bGU6ITEpO2xldCBuPSEwO3JldHVybiBLbi5zdHlsZSYmIW9PKHQpJiYobj10IGluIEtuLnN0eWxlLCFuJiZ0diYmKG49IldlYmtpdCIrdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpaW4gS24uc3R5bGUpKSxufWZ1bmN0aW9uIGNPKCl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQuYm9keTpudWxsfWZ1bmN0aW9uIEQ1KHQsbil7Zm9yKDtuOyl7aWYobj09PXQpcmV0dXJuITA7bj1JYyhuKX1yZXR1cm4hMX1mdW5jdGlvbiBJNSh0LG4sZSl7aWYoZSlyZXR1cm4gQXJyYXkuZnJvbSh0LnF1ZXJ5U2VsZWN0b3JBbGwobikpO2xldCBpPXQucXVlcnlTZWxlY3RvcihuKTtyZXR1cm4gaT9baV06W119ZnVuY3Rpb24gbGEodCl7aWYodHlwZW9mIHQ9PSJudW1iZXIiKXJldHVybiB0O2xldCBuPXQubWF0Y2goL14oLT9bXC5cZF0rKShtP3MpLyk7cmV0dXJuIW58fG4ubGVuZ3RoPDI/MDp6NShwYXJzZUZsb2F0KG5bMV0pLG5bMl0pfWZ1bmN0aW9uIHo1KHQsbil7c3dpdGNoKG4pe2Nhc2UicyI6cmV0dXJuIHQqc087ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gSDQodCxuLGUpe3JldHVybiB0Lmhhc093blByb3BlcnR5KCJkdXJhdGlvbiIpP3Q6bU8odCxuLGUpfWZ1bmN0aW9uIG1PKHQsbixlKXtsZXQgaSxhPTAscj0iIjtpZih0eXBlb2YgdD09InN0cmluZyIpe2xldCBvPXQubWF0Y2goZE8pO2lmKG89PT1udWxsKXJldHVybiBuLnB1c2goZXYodCkpLHtkdXJhdGlvbjowLGRlbGF5OjAsZWFzaW5nOiIifTtpPXo1KHBhcnNlRmxvYXQob1sxXSksb1syXSk7bGV0IGQ9b1szXTtkIT1udWxsJiYoYT16NShwYXJzZUZsb2F0KGQpLG9bNF0pKTtsZXQgcD1vWzVdO3AmJihyPXApfWVsc2UgaT10O2lmKCFlKXtsZXQgbz0hMSxkPW4ubGVuZ3RoO2k8MCYmKG4ucHVzaChKVigpKSxvPSEwKSxhPDAmJihuLnB1c2goZU8oKSksbz0hMCksbyYmbi5zcGxpY2UoZCwwLGV2KHQpKX1yZXR1cm57ZHVyYXRpb246aSxkZWxheTphLGVhc2luZzpyfX1mdW5jdGlvbiBUdih0KXtyZXR1cm4gdC5sZW5ndGg/dFswXWluc3RhbmNlb2YgTWFwP3Q6dC5tYXAobj0+bmV3IE1hcChPYmplY3QuZW50cmllcyhuKSkpOltdfWZ1bmN0aW9uIFIyKHQsbixlKXtuLmZvckVhY2goKGksYSk9PntsZXQgcj1WYyhhKTtlJiYhZS5oYXMoYSkmJmUuc2V0KGEsdC5zdHlsZVtyXSksdC5zdHlsZVtyXT1pfSl9ZnVuY3Rpb24gY24odCxuKXtuLmZvckVhY2goKGUsaSk9PntsZXQgYT1WYyhpKTt0LnN0eWxlW2FdPSIifSl9ZnVuY3Rpb24gaG8odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dC5sZW5ndGg9PTE/dFswXTpLZih0KTp0fWZ1bmN0aW9uIEV2KHQsbixlKXtsZXQgaT1uLnBhcmFtc3x8e30sYT1PNSh0KTthLmxlbmd0aCYmYS5mb3JFYWNoKHI9PntpLmhhc093blByb3BlcnR5KHIpfHxlLnB1c2godE8ocikpfSl9ZnVuY3Rpb24gTzUodCl7bGV0IG49W107aWYodHlwZW9mIHQ9PSJzdHJpbmciKXtsZXQgZTtmb3IoO2U9VDUuZXhlYyh0KTspbi5wdXNoKGVbMV0pO1Q1Lmxhc3RJbmRleD0wfXJldHVybiBufWZ1bmN0aW9uIHBvKHQsbixlKXtsZXQgaT1gJHt0fWAsYT1pLnJlcGxhY2UoVDUsKHIsbyk9PntsZXQgZD1uW29dO3JldHVybiBkPT1udWxsJiYoZS5wdXNoKGlPKG8pKSxkPSIiKSxkLnRvU3RyaW5nKCl9KTtyZXR1cm4gYT09aT90OmF9ZnVuY3Rpb24gVmModCl7cmV0dXJuIHQucmVwbGFjZShoTywoLi4ubik9Pm5bMV0udG9VcHBlckNhc2UoKSl9ZnVuY3Rpb24gQXYodCxuKXtyZXR1cm4gdD09PTB8fG49PT0wfWZ1bmN0aW9uIER2KHQsbixlKXtpZihlLnNpemUmJm4ubGVuZ3RoKXtsZXQgaT1uWzBdLGE9W107aWYoZS5mb3JFYWNoKChyLG8pPT57aS5oYXMobyl8fGEucHVzaChvKSxpLnNldChvLHIpfSksYS5sZW5ndGgpZm9yKGxldCByPTE7cjxuLmxlbmd0aDtyKyspe2xldCBvPW5bcl07YS5mb3JFYWNoKGQ9Pm8uc2V0KGQsT2ModCxkKSkpfX1yZXR1cm4gbn1mdW5jdGlvbiBXaSh0LG4sZSl7c3dpdGNoKG4udHlwZSl7Y2FzZSBwdC5UcmlnZ2VyOnJldHVybiB0LnZpc2l0VHJpZ2dlcihuLGUpO2Nhc2UgcHQuU3RhdGU6cmV0dXJuIHQudmlzaXRTdGF0ZShuLGUpO2Nhc2UgcHQuVHJhbnNpdGlvbjpyZXR1cm4gdC52aXNpdFRyYW5zaXRpb24obixlKTtjYXNlIHB0LlNlcXVlbmNlOnJldHVybiB0LnZpc2l0U2VxdWVuY2UobixlKTtjYXNlIHB0Lkdyb3VwOnJldHVybiB0LnZpc2l0R3JvdXAobixlKTtjYXNlIHB0LkFuaW1hdGU6cmV0dXJuIHQudmlzaXRBbmltYXRlKG4sZSk7Y2FzZSBwdC5LZXlmcmFtZXM6cmV0dXJuIHQudmlzaXRLZXlmcmFtZXMobixlKTtjYXNlIHB0LlN0eWxlOnJldHVybiB0LnZpc2l0U3R5bGUobixlKTtjYXNlIHB0LlJlZmVyZW5jZTpyZXR1cm4gdC52aXNpdFJlZmVyZW5jZShuLGUpO2Nhc2UgcHQuQW5pbWF0ZUNoaWxkOnJldHVybiB0LnZpc2l0QW5pbWF0ZUNoaWxkKG4sZSk7Y2FzZSBwdC5BbmltYXRlUmVmOnJldHVybiB0LnZpc2l0QW5pbWF0ZVJlZihuLGUpO2Nhc2UgcHQuUXVlcnk6cmV0dXJuIHQudmlzaXRRdWVyeShuLGUpO2Nhc2UgcHQuU3RhZ2dlcjpyZXR1cm4gdC52aXNpdFN0YWdnZXIobixlKTtkZWZhdWx0OnRocm93IGFPKG4udHlwZSl9fWZ1bmN0aW9uIE9jKHQsbil7cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpW25dfXZhciByTyxLbix0dixzTyxMNSxsTyxQNSxMYyxWNCxPNCxWNSxQYyxkTyxUNSxoTyxJdj14KCgpPT57VDMoKTtrKCk7ck89dHlwZW9mIGRvY3VtZW50PiJ1Ij9udWxsOmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtLbj1udWxsLHR2PSExO3NPPTFlMyxMNT0ie3siLGxPPSJ9fSIsUDU9Im5nLWVudGVyIixMYz0ibmctbGVhdmUiLFY0PSJuZy10cmlnZ2VyIixPND0iLm5nLXRyaWdnZXIiLFY1PSJuZy1hbmltYXRpbmciLFBjPSIubmctYW5pbWF0aW5nIjtkTz0vXigtP1tcLlxkXSspKG0/cykoPzpccysoLT9bXC5cZF0rKShtP3MpKT8oPzpccysoWy1hLXpdKyg/OlwoLis/XCkpPykpPyQvaTtUNT1uZXcgUmVnRXhwKGAke0w1fVxccyooLis/KVxccyoke2xPfWAsImciKTtoTz0vLSsoW2EtejAtOV0pL2d9KTtmdW5jdGlvbiBmTyh0LG4pe2xldCBlPVtdO3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/dC5zcGxpdCgvXHMqLFxzKi8pLmZvckVhY2goaT0+dU8oaSxlLG4pKTplLnB1c2godCksZX1mdW5jdGlvbiB1Tyh0LG4sZSl7aWYodFswXT09IjoiKXtsZXQgcD1nTyh0LGUpO2lmKHR5cGVvZiBwPT0iZnVuY3Rpb24iKXtuLnB1c2gocCk7cmV0dXJufXQ9cH1sZXQgaT10Lm1hdGNoKC9eKFwqfFstXHddKylccyooPD9bPS1dPilccyooXCp8Wy1cd10rKSQvKTtpZihpPT1udWxsfHxpLmxlbmd0aDw0KXJldHVybiBlLnB1c2goZnYodCkpLG47bGV0IGE9aVsxXSxyPWlbMl0sbz1pWzNdO24ucHVzaChMdihhLG8pKTtsZXQgZD1hPT1VYyYmbz09VWM7clswXT09IjwiJiYhZCYmbi5wdXNoKEx2KG8sYSkpfWZ1bmN0aW9uIGdPKHQsbil7c3dpdGNoKHQpe2Nhc2UiOmVudGVyIjpyZXR1cm4idm9pZCA9PiAqIjtjYXNlIjpsZWF2ZSI6cmV0dXJuIiogPT4gdm9pZCI7Y2FzZSI6aW5jcmVtZW50IjpyZXR1cm4oZSxpKT0+cGFyc2VGbG9hdChpKT5wYXJzZUZsb2F0KGUpO2Nhc2UiOmRlY3JlbWVudCI6cmV0dXJuKGUsaSk9PnBhcnNlRmxvYXQoaSk8cGFyc2VGbG9hdChlKTtkZWZhdWx0OnJldHVybiBuLnB1c2godXYodCkpLCIqID0+ICoifX1mdW5jdGlvbiBMdih0LG4pe2xldCBlPUhjLmhhcyh0KXx8TmMuaGFzKHQpLGk9SGMuaGFzKG4pfHxOYy5oYXMobik7cmV0dXJuKGEscik9PntsZXQgbz10PT1VY3x8dD09YSxkPW49PVVjfHxuPT1yO3JldHVybiFvJiZlJiZ0eXBlb2YgYT09ImJvb2xlYW4iJiYobz1hP0hjLmhhcyh0KTpOYy5oYXModCkpLCFkJiZpJiZ0eXBlb2Ygcj09ImJvb2xlYW4iJiYoZD1yP0hjLmhhcyhuKTpOYy5oYXMobikpLG8mJmR9fWZ1bmN0aW9uIHF2KHQsbixlLGkpe3JldHVybiBuZXcgVTUodCkuYnVpbGQobixlLGkpfWZ1bmN0aW9uIF9PKHQpe2xldCBuPSEhdC5zcGxpdCgvXHMqLFxzKi8pLmZpbmQoZT0+ZT09anYpO3JldHVybiBuJiYodD10LnJlcGxhY2Uodk8sIiIpKSx0PXQucmVwbGFjZSgvQFwqL2csTzQpLnJlcGxhY2UoL0BcdysvZyxlPT5PNCsiLSIrZS5zbGljZSgxKSkucmVwbGFjZSgvOmFuaW1hdGluZy9nLFBjKSxbdCxuXX1mdW5jdGlvbiBiTyh0KXtyZXR1cm4gdD9YZSh7fSx0KTpudWxsfWZ1bmN0aW9uIENPKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gbnVsbDtsZXQgbj1udWxsO2lmKEFycmF5LmlzQXJyYXkodCkpdC5mb3JFYWNoKGU9PntpZihlIGluc3RhbmNlb2YgTWFwJiZlLmhhcygib2Zmc2V0Iikpe2xldCBpPWU7bj1wYXJzZUZsb2F0KGkuZ2V0KCJvZmZzZXQiKSksaS5kZWxldGUoIm9mZnNldCIpfX0pO2Vsc2UgaWYodCBpbnN0YW5jZW9mIE1hcCYmdC5oYXMoIm9mZnNldCIpKXtsZXQgZT10O249cGFyc2VGbG9hdChlLmdldCgib2Zmc2V0IikpLGUuZGVsZXRlKCJvZmZzZXQiKX1yZXR1cm4gbn1mdW5jdGlvbiB5Tyh0LG4pe2lmKHQuaGFzT3duUHJvcGVydHkoImR1cmF0aW9uIikpcmV0dXJuIHQ7aWYodHlwZW9mIHQ9PSJudW1iZXIiKXtsZXQgcj1INCh0LG4pLmR1cmF0aW9uO3JldHVybiBINShyLDAsIiIpfWxldCBlPXQ7aWYoZS5zcGxpdCgvXHMrLykuc29tZShyPT5yLmNoYXJBdCgwKT09InsiJiZyLmNoYXJBdCgxKT09InsiKSl7bGV0IHI9SDUoMCwwLCIiKTtyZXR1cm4gci5keW5hbWljPSEwLHIuc3RyVmFsdWU9ZSxyfWxldCBhPUg0KGUsbik7cmV0dXJuIEg1KGEuZHVyYXRpb24sYS5kZWxheSxhLmVhc2luZyl9ZnVuY3Rpb24gWG4odCl7cmV0dXJuIHQ/KHQ9WGUoe30sdCksdC5wYXJhbXMmJih0LnBhcmFtcz1iTyh0LnBhcmFtcykpKTp0PXt9LHR9ZnVuY3Rpb24gSDUodCxuLGUpe3JldHVybntkdXJhdGlvbjp0LGRlbGF5Om4sZWFzaW5nOmV9fWZ1bmN0aW9uIGU3KHQsbixlLGksYSxyLG89bnVsbCxkPSExKXtyZXR1cm57dHlwZToxLGVsZW1lbnQ6dCxrZXlmcmFtZXM6bixwcmVTdHlsZVByb3BzOmUscG9zdFN0eWxlUHJvcHM6aSxkdXJhdGlvbjphLGRlbGF5OnIsdG90YWxUaW1lOmErcixlYXNpbmc6byxzdWJUaW1lbGluZTpkfX1mdW5jdGlvbiBHdih0LG4sZSxpLGEscj1uZXcgTWFwLG89bmV3IE1hcCxkLHAsZz1bXSl7cmV0dXJuIG5ldyBxNSgpLmJ1aWxkS2V5ZnJhbWVzKHQsbixlLGksYSxyLG8sZCxwLGcpfWZ1bmN0aW9uIFZ2KHQsbj0zKXtsZXQgZT1NYXRoLnBvdygxMCxuLTEpO3JldHVybiBNYXRoLnJvdW5kKHQqZSkvZX1mdW5jdGlvbiB6Tyh0LG4pe2xldCBlPW5ldyBNYXAsaTtyZXR1cm4gdC5mb3JFYWNoKGE9PntpZihhPT09IioiKXtpPz89bi5rZXlzKCk7Zm9yKGxldCByIG9mIGkpZS5zZXQocix5Mil9ZWxzZSBmb3IobGV0W3Isb11vZiBhKWUuc2V0KHIsbyl9KSxlfWZ1bmN0aW9uIE92KHQsbixlLGksYSxyLG8sZCxwLGcsXyx5LEkpe3JldHVybnt0eXBlOjAsZWxlbWVudDp0LHRyaWdnZXJOYW1lOm4saXNSZW1vdmFsVHJhbnNpdGlvbjphLGZyb21TdGF0ZTplLGZyb21TdHlsZXM6cix0b1N0YXRlOmksdG9TdHlsZXM6byx0aW1lbGluZXM6ZCxxdWVyaWVkRWxlbWVudHM6cCxwcmVTdHlsZVByb3BzOmcscG9zdFN0eWxlUHJvcHM6Xyx0b3RhbFRpbWU6eSxlcnJvcnM6SX19ZnVuY3Rpb24gVE8odCxuLGUsaSxhKXtyZXR1cm4gdC5zb21lKHI9PnIobixlLGksYSkpfWZ1bmN0aW9uIFd2KHQsbil7bGV0IGU9WGUoe30sbik7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKFtpLGFdKT0+e2EhPW51bGwmJihlW2ldPWEpfSksZX1mdW5jdGlvbiBFTyh0LG4sZSl7cmV0dXJuIG5ldyBZNSh0LG4sZSl9ZnVuY3Rpb24gQU8odCxuLGUpe2xldCBpPVsobyxkKT0+ITBdLGE9e3R5cGU6cHQuU2VxdWVuY2Usc3RlcHM6W10sb3B0aW9uczpudWxsfSxyPXt0eXBlOnB0LlRyYW5zaXRpb24sYW5pbWF0aW9uOmEsbWF0Y2hlcnM6aSxvcHRpb25zOm51bGwscXVlcnlDb3VudDowLGRlcENvdW50OjB9O3JldHVybiBuZXcgR2ModCxyLG4pfWZ1bmN0aW9uIEh2KHQsbixlKXt0LmhhcyhuKT90LmhhcyhlKXx8dC5zZXQoZSx0LmdldChuKSk6dC5oYXMoZSkmJnQuc2V0KG4sdC5nZXQoZSkpfWZ1bmN0aW9uIE5PKHQsbixlKXtsZXQgaT10LmdldChuKTtpZihpKXtpZihpLmxlbmd0aCl7bGV0IGE9aS5pbmRleE9mKGUpO2kuc3BsaWNlKGEsMSl9aS5sZW5ndGg9PTAmJnQuZGVsZXRlKG4pfXJldHVybiBpfWZ1bmN0aW9uIFJPKHQpe3JldHVybiB0Pz9udWxsfWZ1bmN0aW9uIFJjKHQpe3JldHVybiB0JiZ0Lm5vZGVUeXBlPT09MX1mdW5jdGlvbiBGTyh0KXtyZXR1cm4gdD09InN0YXJ0Inx8dD09ImRvbmUifWZ1bmN0aW9uIFJ2KHQsbil7bGV0IGU9dC5zdHlsZS5kaXNwbGF5O3JldHVybiB0LnN0eWxlLmRpc3BsYXk9bj8/Im5vbmUiLGV9ZnVuY3Rpb24gRnYodCxuLGUsaSxhKXtsZXQgcj1bXTtlLmZvckVhY2gocD0+ci5wdXNoKFJ2KHApKSk7bGV0IG89W107aS5mb3JFYWNoKChwLGcpPT57bGV0IF89bmV3IE1hcDtwLmZvckVhY2goeT0+e2xldCBJPW4uY29tcHV0ZVN0eWxlKGcseSxhKTtfLnNldCh5LEkpLCghSXx8SS5sZW5ndGg9PTApJiYoZ1tGMl09SE8sby5wdXNoKGcpKX0pLHQuc2V0KGcsXyl9KTtsZXQgZD0wO3JldHVybiBlLmZvckVhY2gocD0+UnYocCxyW2QrK10pKSxvfWZ1bmN0aW9uIEJ2KHQsbil7bGV0IGU9bmV3IE1hcDtpZih0LmZvckVhY2goZD0+ZS5zZXQoZCxbXSkpLG4ubGVuZ3RoPT0wKXJldHVybiBlO2xldCBpPTEsYT1uZXcgU2V0KG4pLHI9bmV3IE1hcDtmdW5jdGlvbiBvKGQpe2lmKCFkKXJldHVybiBpO2xldCBwPXIuZ2V0KGQpO2lmKHApcmV0dXJuIHA7bGV0IGc9ZC5wYXJlbnROb2RlO3JldHVybiBlLmhhcyhnKT9wPWc6YS5oYXMoZyk/cD1pOnA9byhnKSxyLnNldChkLHApLHB9cmV0dXJuIG4uZm9yRWFjaChkPT57bGV0IHA9byhkKTtwIT09aSYmZS5nZXQocCkucHVzaChkKX0pLGV9ZnVuY3Rpb24gUzIodCxuKXt0LmNsYXNzTGlzdD8uYWRkKG4pfWZ1bmN0aW9uIGZvKHQsbil7dC5jbGFzc0xpc3Q/LnJlbW92ZShuKX1mdW5jdGlvbiBCTyh0LG4sZSl7QWEoZSkub25Eb25lKCgpPT50LnByb2Nlc3NMZWF2ZU5vZGUobikpfWZ1bmN0aW9uIFVPKHQpe2xldCBuPVtdO3JldHVybiBZdih0LG4pLG59ZnVuY3Rpb24gWXYodCxuKXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7bGV0IGk9dFtlXTtpIGluc3RhbmNlb2YgV24/WXYoaS5wbGF5ZXJzLG4pOm4ucHVzaChpKX19ZnVuY3Rpb24gak8odCxuKXtsZXQgZT1PYmplY3Qua2V5cyh0KSxpPU9iamVjdC5rZXlzKG4pO2lmKGUubGVuZ3RoIT1pLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IGE9MDthPGUubGVuZ3RoO2ErKyl7bGV0IHI9ZVthXTtpZighbi5oYXNPd25Qcm9wZXJ0eShyKXx8dFtyXSE9PW5bcl0pcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gVXYodCxuLGUpe2xldCBpPWUuZ2V0KHQpO2lmKCFpKXJldHVybiExO2xldCBhPW4uZ2V0KHQpO3JldHVybiBhP2kuZm9yRWFjaChyPT5hLmFkZChyKSk6bi5zZXQodCxpKSxlLmRlbGV0ZSh0KSwhMH1mdW5jdGlvbiBxTyh0LG4pe2xldCBlPW51bGwsaT1udWxsO3JldHVybiBBcnJheS5pc0FycmF5KG4pJiZuLmxlbmd0aD8oZT1CNShuWzBdKSxuLmxlbmd0aD4xJiYoaT1CNShuW24ubGVuZ3RoLTFdKSkpOm4gaW5zdGFuY2VvZiBNYXAmJihlPUI1KG4pKSxlfHxpP25ldyBHTyh0LGUsaSk6bnVsbH1mdW5jdGlvbiBCNSh0KXtsZXQgbj1udWxsO3JldHVybiB0LmZvckVhY2goKGUsaSk9PntXTyhpKSYmKG49bnx8bmV3IE1hcCxuLnNldChpLGUpKX0pLG59ZnVuY3Rpb24gV08odCl7cmV0dXJuIHQ9PT0iZGlzcGxheSJ8fHQ9PT0icG9zaXRpb24ifWZ1bmN0aW9uIFFPKHQpe3N3aXRjaCh0KXtjYXNlImJvZHkiOnJldHVybiBkb2N1bWVudC5ib2R5O2Nhc2UiZG9jdW1lbnQiOnJldHVybiBkb2N1bWVudDtjYXNlIndpbmRvdyI6cmV0dXJuIHdpbmRvdztkZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiBZTyh0KXtsZXQgbj10LmluZGV4T2YoIi4iKSxlPXQuc3Vic3RyaW5nKDAsbiksaT10LnNsaWNlKG4rMSk7cmV0dXJuW2UsaV19dmFyIEo1LEpuLGVyLHBPLEJjLFVjLEhjLE5jLGp2LHZPLFB2LFU1LGo1LFI0LHhPLE1PLHdPLFNPLGtPLHE1LGpjLEc1LHFjLFc1LE41LEdjLFE1LFk1LERPLFo1LE52LElPLFI1LExPLFBPLFZPLE9PLFF2LEhPLEYyLEY0LE40LEY1LCQ1LEs1LEI0LHVvLEdPLFdjLFFjLEZjLFp2LFljLFg1LFpjLHQ3PXgoKCk9PntrKCk7SXYoKTtUMygpO0o1PSgoKT0+e2NsYXNzIHR7dmFsaWRhdGVTdHlsZVByb3BlcnR5KGUpe3JldHVybiB6dihlKX1jb250YWluc0VsZW1lbnQoZSxpKXtyZXR1cm4gRDUoZSxpKX1nZXRQYXJlbnRFbGVtZW50KGUpe3JldHVybiBJYyhlKX1xdWVyeShlLGksYSl7cmV0dXJuIEk1KGUsaSxhKX1jb21wdXRlU3R5bGUoZSxpLGEpe3JldHVybiBhfHwiIn1hbmltYXRlKGUsaSxhLHIsbyxkPVtdLHApe3JldHVybiBuZXcgY2EoYSxyKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhY30pfXJldHVybiB0fSkoKSxKbj1jbGFzc3tzdGF0aWMgTk9PUD1uZXcgSjV9LGVyPWNsYXNze30scE89bmV3IFNldChbIndpZHRoIiwiaGVpZ2h0IiwibWluV2lkdGgiLCJtaW5IZWlnaHQiLCJtYXhXaWR0aCIsIm1heEhlaWdodCIsImxlZnQiLCJ0b3AiLCJib3R0b20iLCJyaWdodCIsImZvbnRTaXplIiwib3V0bGluZVdpZHRoIiwib3V0bGluZU9mZnNldCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdCb3R0b20iLCJwYWRkaW5nUmlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5MZWZ0IiwibWFyZ2luQm90dG9tIiwibWFyZ2luUmlnaHQiLCJib3JkZXJSYWRpdXMiLCJib3JkZXJXaWR0aCIsImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwidGV4dEluZGVudCIsInBlcnNwZWN0aXZlIl0pLEJjPWNsYXNzIGV4dGVuZHMgZXJ7bm9ybWFsaXplUHJvcGVydHlOYW1lKG4sZSl7cmV0dXJuIFZjKG4pfW5vcm1hbGl6ZVN0eWxlVmFsdWUobixlLGksYSl7bGV0IHI9IiIsbz1pLnRvU3RyaW5nKCkudHJpbSgpO2lmKHBPLmhhcyhlKSYmaSE9PTAmJmkhPT0iMCIpaWYodHlwZW9mIGk9PSJudW1iZXIiKXI9InB4IjtlbHNle2xldCBkPWkubWF0Y2goL15bKy1dP1tcZFwuXSsoW2Etel0qKSQvKTtkJiZkWzFdLmxlbmd0aD09MCYmYS5wdXNoKGl2KG4saSkpfXJldHVybiBvK3J9fSxVYz0iKiI7SGM9bmV3IFNldChbInRydWUiLCIxIl0pLE5jPW5ldyBTZXQoWyJmYWxzZSIsIjAiXSk7anY9IjpzZWxmIix2Tz1uZXcgUmVnRXhwKGBzKiR7anZ9cyosP2AsImciKTtQdj0iIixVNT1jbGFzc3tfZHJpdmVyO2NvbnN0cnVjdG9yKG4pe3RoaXMuX2RyaXZlcj1ufWJ1aWxkKG4sZSxpKXtsZXQgYT1uZXcgajUoZSk7cmV0dXJuIHRoaXMuX3Jlc2V0Q29udGV4dFN0eWxlVGltaW5nU3RhdGUoYSksV2kodGhpcyxobyhuKSxhKX1fcmVzZXRDb250ZXh0U3R5bGVUaW1pbmdTdGF0ZShuKXtuLmN1cnJlbnRRdWVyeVNlbGVjdG9yPVB2LG4uY29sbGVjdGVkU3R5bGVzPW5ldyBNYXAsbi5jb2xsZWN0ZWRTdHlsZXMuc2V0KFB2LG5ldyBNYXApLG4uY3VycmVudFRpbWU9MH12aXNpdFRyaWdnZXIobixlKXtsZXQgaT1lLnF1ZXJ5Q291bnQ9MCxhPWUuZGVwQ291bnQ9MCxyPVtdLG89W107cmV0dXJuIG4ubmFtZS5jaGFyQXQoMCk9PSJAIiYmZS5lcnJvcnMucHVzaChhdigpKSxuLmRlZmluaXRpb25zLmZvckVhY2goZD0+e2lmKHRoaXMuX3Jlc2V0Q29udGV4dFN0eWxlVGltaW5nU3RhdGUoZSksZC50eXBlPT1wdC5TdGF0ZSl7bGV0IHA9ZCxnPXAubmFtZTtnLnRvU3RyaW5nKCkuc3BsaXQoL1xzKixccyovKS5mb3JFYWNoKF89PntwLm5hbWU9XyxyLnB1c2godGhpcy52aXNpdFN0YXRlKHAsZSkpfSkscC5uYW1lPWd9ZWxzZSBpZihkLnR5cGU9PXB0LlRyYW5zaXRpb24pe2xldCBwPXRoaXMudmlzaXRUcmFuc2l0aW9uKGQsZSk7aSs9cC5xdWVyeUNvdW50LGErPXAuZGVwQ291bnQsby5wdXNoKHApfWVsc2UgZS5lcnJvcnMucHVzaChudigpKX0pLHt0eXBlOnB0LlRyaWdnZXIsbmFtZTpuLm5hbWUsc3RhdGVzOnIsdHJhbnNpdGlvbnM6byxxdWVyeUNvdW50OmksZGVwQ291bnQ6YSxvcHRpb25zOm51bGx9fXZpc2l0U3RhdGUobixlKXtsZXQgaT10aGlzLnZpc2l0U3R5bGUobi5zdHlsZXMsZSksYT1uLm9wdGlvbnMmJm4ub3B0aW9ucy5wYXJhbXN8fG51bGw7aWYoaS5jb250YWluc0R5bmFtaWNTdHlsZXMpe2xldCByPW5ldyBTZXQsbz1hfHx7fTtpLnN0eWxlcy5mb3JFYWNoKGQ9PntkIGluc3RhbmNlb2YgTWFwJiZkLmZvckVhY2gocD0+e081KHApLmZvckVhY2goZz0+e28uaGFzT3duUHJvcGVydHkoZyl8fHIuYWRkKGcpfSl9KX0pLHIuc2l6ZSYmZS5lcnJvcnMucHVzaChydihuLm5hbWUsWy4uLnIudmFsdWVzKCldKSl9cmV0dXJue3R5cGU6cHQuU3RhdGUsbmFtZTpuLm5hbWUsc3R5bGU6aSxvcHRpb25zOmE/e3BhcmFtczphfTpudWxsfX12aXNpdFRyYW5zaXRpb24obixlKXtlLnF1ZXJ5Q291bnQ9MCxlLmRlcENvdW50PTA7bGV0IGk9V2kodGhpcyxobyhuLmFuaW1hdGlvbiksZSksYT1mTyhuLmV4cHIsZS5lcnJvcnMpO3JldHVybnt0eXBlOnB0LlRyYW5zaXRpb24sbWF0Y2hlcnM6YSxhbmltYXRpb246aSxxdWVyeUNvdW50OmUucXVlcnlDb3VudCxkZXBDb3VudDplLmRlcENvdW50LG9wdGlvbnM6WG4obi5vcHRpb25zKX19dmlzaXRTZXF1ZW5jZShuLGUpe3JldHVybnt0eXBlOnB0LlNlcXVlbmNlLHN0ZXBzOm4uc3RlcHMubWFwKGk9PldpKHRoaXMsaSxlKSksb3B0aW9uczpYbihuLm9wdGlvbnMpfX12aXNpdEdyb3VwKG4sZSl7bGV0IGk9ZS5jdXJyZW50VGltZSxhPTAscj1uLnN0ZXBzLm1hcChvPT57ZS5jdXJyZW50VGltZT1pO2xldCBkPVdpKHRoaXMsbyxlKTtyZXR1cm4gYT1NYXRoLm1heChhLGUuY3VycmVudFRpbWUpLGR9KTtyZXR1cm4gZS5jdXJyZW50VGltZT1hLHt0eXBlOnB0Lkdyb3VwLHN0ZXBzOnIsb3B0aW9uczpYbihuLm9wdGlvbnMpfX12aXNpdEFuaW1hdGUobixlKXtsZXQgaT15TyhuLnRpbWluZ3MsZS5lcnJvcnMpO2UuY3VycmVudEFuaW1hdGVUaW1pbmdzPWk7bGV0IGEscj1uLnN0eWxlcz9uLnN0eWxlczpzYSh7fSk7aWYoci50eXBlPT1wdC5LZXlmcmFtZXMpYT10aGlzLnZpc2l0S2V5ZnJhbWVzKHIsZSk7ZWxzZXtsZXQgbz1uLnN0eWxlcyxkPSExO2lmKCFvKXtkPSEwO2xldCBnPXt9O2kuZWFzaW5nJiYoZy5lYXNpbmc9aS5lYXNpbmcpLG89c2EoZyl9ZS5jdXJyZW50VGltZSs9aS5kdXJhdGlvbitpLmRlbGF5O2xldCBwPXRoaXMudmlzaXRTdHlsZShvLGUpO3AuaXNFbXB0eVN0ZXA9ZCxhPXB9cmV0dXJuIGUuY3VycmVudEFuaW1hdGVUaW1pbmdzPW51bGwse3R5cGU6cHQuQW5pbWF0ZSx0aW1pbmdzOmksc3R5bGU6YSxvcHRpb25zOm51bGx9fXZpc2l0U3R5bGUobixlKXtsZXQgaT10aGlzLl9tYWtlU3R5bGVBc3QobixlKTtyZXR1cm4gdGhpcy5fdmFsaWRhdGVTdHlsZUFzdChpLGUpLGl9X21ha2VTdHlsZUFzdChuLGUpe2xldCBpPVtdLGE9QXJyYXkuaXNBcnJheShuLnN0eWxlcyk/bi5zdHlsZXM6W24uc3R5bGVzXTtmb3IobGV0IGQgb2YgYSl0eXBlb2YgZD09InN0cmluZyI/ZD09PXkyP2kucHVzaChkKTplLmVycm9ycy5wdXNoKG92KGQpKTppLnB1c2gobmV3IE1hcChPYmplY3QuZW50cmllcyhkKSkpO2xldCByPSExLG89bnVsbDtyZXR1cm4gaS5mb3JFYWNoKGQ9PntpZihkIGluc3RhbmNlb2YgTWFwJiYoZC5oYXMoImVhc2luZyIpJiYobz1kLmdldCgiZWFzaW5nIiksZC5kZWxldGUoImVhc2luZyIpKSwhcikpe2ZvcihsZXQgcCBvZiBkLnZhbHVlcygpKWlmKHAudG9TdHJpbmcoKS5pbmRleE9mKEw1KT49MCl7cj0hMDticmVha319fSkse3R5cGU6cHQuU3R5bGUsc3R5bGVzOmksZWFzaW5nOm8sb2Zmc2V0Om4ub2Zmc2V0LGNvbnRhaW5zRHluYW1pY1N0eWxlczpyLG9wdGlvbnM6bnVsbH19X3ZhbGlkYXRlU3R5bGVBc3QobixlKXtsZXQgaT1lLmN1cnJlbnRBbmltYXRlVGltaW5ncyxhPWUuY3VycmVudFRpbWUscj1lLmN1cnJlbnRUaW1lO2kmJnI+MCYmKHItPWkuZHVyYXRpb24raS5kZWxheSksbi5zdHlsZXMuZm9yRWFjaChvPT57dHlwZW9mIG8hPSJzdHJpbmciJiZvLmZvckVhY2goKGQscCk9PntsZXQgZz1lLmNvbGxlY3RlZFN0eWxlcy5nZXQoZS5jdXJyZW50UXVlcnlTZWxlY3RvciksXz1nLmdldChwKSx5PSEwO18mJihyIT1hJiZyPj1fLnN0YXJ0VGltZSYmYTw9Xy5lbmRUaW1lJiYoZS5lcnJvcnMucHVzaChjdihwLF8uc3RhcnRUaW1lLF8uZW5kVGltZSxyLGEpKSx5PSExKSxyPV8uc3RhcnRUaW1lKSx5JiZnLnNldChwLHtzdGFydFRpbWU6cixlbmRUaW1lOmF9KSxlLm9wdGlvbnMmJkV2KGQsZS5vcHRpb25zLGUuZXJyb3JzKX0pfSl9dmlzaXRLZXlmcmFtZXMobixlKXtsZXQgaT17dHlwZTpwdC5LZXlmcmFtZXMsc3R5bGVzOltdLG9wdGlvbnM6bnVsbH07aWYoIWUuY3VycmVudEFuaW1hdGVUaW1pbmdzKXJldHVybiBlLmVycm9ycy5wdXNoKHN2KCkpLGk7bGV0IGE9MSxyPTAsbz1bXSxkPSExLHA9ITEsZz0wLF89bi5zdGVwcy5tYXAoUT0+e2xldCBmZT10aGlzLl9tYWtlU3R5bGVBc3QoUSxlKSxPZT1mZS5vZmZzZXQhPW51bGw/ZmUub2Zmc2V0OkNPKGZlLnN0eWxlcyksTWU9MDtyZXR1cm4gT2UhPW51bGwmJihyKyssTWU9ZmUub2Zmc2V0PU9lKSxwPXB8fE1lPDB8fE1lPjEsZD1kfHxNZTxnLGc9TWUsby5wdXNoKE1lKSxmZX0pO3AmJmUuZXJyb3JzLnB1c2gobHYoKSksZCYmZS5lcnJvcnMucHVzaChkdigpKTtsZXQgeT1uLnN0ZXBzLmxlbmd0aCxJPTA7cj4wJiZyPHk/ZS5lcnJvcnMucHVzaChtdigpKTpyPT0wJiYoST1hLyh5LTEpKTtsZXQgUD15LTEsVj1lLmN1cnJlbnRUaW1lLE89ZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3MsVT1PLmR1cmF0aW9uO3JldHVybiBfLmZvckVhY2goKFEsZmUpPT57bGV0IE9lPUk+MD9mZT09UD8xOkkqZmU6b1tmZV0sTWU9T2UqVTtlLmN1cnJlbnRUaW1lPVYrTy5kZWxheStNZSxPLmR1cmF0aW9uPU1lLHRoaXMuX3ZhbGlkYXRlU3R5bGVBc3QoUSxlKSxRLm9mZnNldD1PZSxpLnN0eWxlcy5wdXNoKFEpfSksaX12aXNpdFJlZmVyZW5jZShuLGUpe3JldHVybnt0eXBlOnB0LlJlZmVyZW5jZSxhbmltYXRpb246V2kodGhpcyxobyhuLmFuaW1hdGlvbiksZSksb3B0aW9uczpYbihuLm9wdGlvbnMpfX12aXNpdEFuaW1hdGVDaGlsZChuLGUpe3JldHVybiBlLmRlcENvdW50Kysse3R5cGU6cHQuQW5pbWF0ZUNoaWxkLG9wdGlvbnM6WG4obi5vcHRpb25zKX19dmlzaXRBbmltYXRlUmVmKG4sZSl7cmV0dXJue3R5cGU6cHQuQW5pbWF0ZVJlZixhbmltYXRpb246dGhpcy52aXNpdFJlZmVyZW5jZShuLmFuaW1hdGlvbixlKSxvcHRpb25zOlhuKG4ub3B0aW9ucyl9fXZpc2l0UXVlcnkobixlKXtsZXQgaT1lLmN1cnJlbnRRdWVyeVNlbGVjdG9yLGE9bi5vcHRpb25zfHx7fTtlLnF1ZXJ5Q291bnQrKyxlLmN1cnJlbnRRdWVyeT1uO2xldFtyLG9dPV9PKG4uc2VsZWN0b3IpO2UuY3VycmVudFF1ZXJ5U2VsZWN0b3I9aS5sZW5ndGg/aSsiICIrcjpyLEdpKGUuY29sbGVjdGVkU3R5bGVzLGUuY3VycmVudFF1ZXJ5U2VsZWN0b3IsbmV3IE1hcCk7bGV0IGQ9V2kodGhpcyxobyhuLmFuaW1hdGlvbiksZSk7cmV0dXJuIGUuY3VycmVudFF1ZXJ5PW51bGwsZS5jdXJyZW50UXVlcnlTZWxlY3Rvcj1pLHt0eXBlOnB0LlF1ZXJ5LHNlbGVjdG9yOnIsbGltaXQ6YS5saW1pdHx8MCxvcHRpb25hbDohIWEub3B0aW9uYWwsaW5jbHVkZVNlbGY6byxhbmltYXRpb246ZCxvcmlnaW5hbFNlbGVjdG9yOm4uc2VsZWN0b3Isb3B0aW9uczpYbihuLm9wdGlvbnMpfX12aXNpdFN0YWdnZXIobixlKXtlLmN1cnJlbnRRdWVyeXx8ZS5lcnJvcnMucHVzaChodigpKTtsZXQgaT1uLnRpbWluZ3M9PT0iZnVsbCI/e2R1cmF0aW9uOjAsZGVsYXk6MCxlYXNpbmc6ImZ1bGwifTpINChuLnRpbWluZ3MsZS5lcnJvcnMsITApO3JldHVybnt0eXBlOnB0LlN0YWdnZXIsYW5pbWF0aW9uOldpKHRoaXMsaG8obi5hbmltYXRpb24pLGUpLHRpbWluZ3M6aSxvcHRpb25zOm51bGx9fX07ajU9Y2xhc3N7ZXJyb3JzO3F1ZXJ5Q291bnQ9MDtkZXBDb3VudD0wO2N1cnJlbnRUcmFuc2l0aW9uPW51bGw7Y3VycmVudFF1ZXJ5PW51bGw7Y3VycmVudFF1ZXJ5U2VsZWN0b3I9bnVsbDtjdXJyZW50QW5pbWF0ZVRpbWluZ3M9bnVsbDtjdXJyZW50VGltZT0wO2NvbGxlY3RlZFN0eWxlcz1uZXcgTWFwO29wdGlvbnM9bnVsbDt1bnN1cHBvcnRlZENTU1Byb3BlcnRpZXNGb3VuZD1uZXcgU2V0O2NvbnN0cnVjdG9yKG4pe3RoaXMuZXJyb3JzPW59fTtSND1jbGFzc3tfbWFwPW5ldyBNYXA7Z2V0KG4pe3JldHVybiB0aGlzLl9tYXAuZ2V0KG4pfHxbXX1hcHBlbmQobixlKXtsZXQgaT10aGlzLl9tYXAuZ2V0KG4pO2l8fHRoaXMuX21hcC5zZXQobixpPVtdKSxpLnB1c2goLi4uZSl9aGFzKG4pe3JldHVybiB0aGlzLl9tYXAuaGFzKG4pfWNsZWFyKCl7dGhpcy5fbWFwLmNsZWFyKCl9fSx4Tz0xLE1PPSI6ZW50ZXIiLHdPPW5ldyBSZWdFeHAoTU8sImciKSxTTz0iOmxlYXZlIixrTz1uZXcgUmVnRXhwKFNPLCJnIik7cTU9Y2xhc3N7YnVpbGRLZXlmcmFtZXMobixlLGksYSxyLG8sZCxwLGcsXz1bXSl7Zz1nfHxuZXcgUjQ7bGV0IHk9bmV3IEc1KG4sZSxnLGEscixfLFtdKTt5Lm9wdGlvbnM9cDtsZXQgST1wLmRlbGF5P2xhKHAuZGVsYXkpOjA7eS5jdXJyZW50VGltZWxpbmUuZGVsYXlOZXh0U3RlcChJKSx5LmN1cnJlbnRUaW1lbGluZS5zZXRTdHlsZXMoW29dLG51bGwseS5lcnJvcnMscCksV2kodGhpcyxpLHkpO2xldCBQPXkudGltZWxpbmVzLmZpbHRlcihWPT5WLmNvbnRhaW5zQW5pbWF0aW9uKCkpO2lmKFAubGVuZ3RoJiZkLnNpemUpe2xldCBWO2ZvcihsZXQgTz1QLmxlbmd0aC0xO08+PTA7Ty0tKXtsZXQgVT1QW09dO2lmKFUuZWxlbWVudD09PWUpe1Y9VTticmVha319ViYmIVYuYWxsb3dPbmx5VGltZWxpbmVTdHlsZXMoKSYmVi5zZXRTdHlsZXMoW2RdLG51bGwseS5lcnJvcnMscCl9cmV0dXJuIFAubGVuZ3RoP1AubWFwKFY9PlYuYnVpbGRLZXlmcmFtZXMoKSk6W2U3KGUsW10sW10sW10sMCxJLCIiLCExKV19dmlzaXRUcmlnZ2VyKG4sZSl7fXZpc2l0U3RhdGUobixlKXt9dmlzaXRUcmFuc2l0aW9uKG4sZSl7fXZpc2l0QW5pbWF0ZUNoaWxkKG4sZSl7bGV0IGk9ZS5zdWJJbnN0cnVjdGlvbnMuZ2V0KGUuZWxlbWVudCk7aWYoaSl7bGV0IGE9ZS5jcmVhdGVTdWJDb250ZXh0KG4ub3B0aW9ucykscj1lLmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZSxvPXRoaXMuX3Zpc2l0U3ViSW5zdHJ1Y3Rpb25zKGksYSxhLm9wdGlvbnMpO3IhPW8mJmUudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKG8pfWUucHJldmlvdXNOb2RlPW59dmlzaXRBbmltYXRlUmVmKG4sZSl7bGV0IGk9ZS5jcmVhdGVTdWJDb250ZXh0KG4ub3B0aW9ucyk7aS50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUoKSx0aGlzLl9hcHBseUFuaW1hdGlvblJlZkRlbGF5cyhbbi5vcHRpb25zLG4uYW5pbWF0aW9uLm9wdGlvbnNdLGUsaSksdGhpcy52aXNpdFJlZmVyZW5jZShuLmFuaW1hdGlvbixpKSxlLnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShpLmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZSksZS5wcmV2aW91c05vZGU9bn1fYXBwbHlBbmltYXRpb25SZWZEZWxheXMobixlLGkpe2ZvcihsZXQgYSBvZiBuKXtsZXQgcj1hPy5kZWxheTtpZihyKXtsZXQgbz10eXBlb2Ygcj09Im51bWJlciI/cjpsYShwbyhyLGE/LnBhcmFtcz8/e30sZS5lcnJvcnMpKTtpLmRlbGF5TmV4dFN0ZXAobyl9fX1fdmlzaXRTdWJJbnN0cnVjdGlvbnMobixlLGkpe2xldCByPWUuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lLG89aS5kdXJhdGlvbiE9bnVsbD9sYShpLmR1cmF0aW9uKTpudWxsLGQ9aS5kZWxheSE9bnVsbD9sYShpLmRlbGF5KTpudWxsO3JldHVybiBvIT09MCYmbi5mb3JFYWNoKHA9PntsZXQgZz1lLmFwcGVuZEluc3RydWN0aW9uVG9UaW1lbGluZShwLG8sZCk7cj1NYXRoLm1heChyLGcuZHVyYXRpb24rZy5kZWxheSl9KSxyfXZpc2l0UmVmZXJlbmNlKG4sZSl7ZS51cGRhdGVPcHRpb25zKG4ub3B0aW9ucywhMCksV2kodGhpcyxuLmFuaW1hdGlvbixlKSxlLnByZXZpb3VzTm9kZT1ufXZpc2l0U2VxdWVuY2UobixlKXtsZXQgaT1lLnN1YkNvbnRleHRDb3VudCxhPWUscj1uLm9wdGlvbnM7aWYociYmKHIucGFyYW1zfHxyLmRlbGF5KSYmKGE9ZS5jcmVhdGVTdWJDb250ZXh0KHIpLGEudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKCksci5kZWxheSE9bnVsbCkpe2EucHJldmlvdXNOb2RlLnR5cGU9PXB0LlN0eWxlJiYoYS5jdXJyZW50VGltZWxpbmUuc25hcHNob3RDdXJyZW50U3R5bGVzKCksYS5wcmV2aW91c05vZGU9amMpO2xldCBvPWxhKHIuZGVsYXkpO2EuZGVsYXlOZXh0U3RlcChvKX1uLnN0ZXBzLmxlbmd0aCYmKG4uc3RlcHMuZm9yRWFjaChvPT5XaSh0aGlzLG8sYSkpLGEuY3VycmVudFRpbWVsaW5lLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpLGEuc3ViQ29udGV4dENvdW50PmkmJmEudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKCkpLGUucHJldmlvdXNOb2RlPW59dmlzaXRHcm91cChuLGUpe2xldCBpPVtdLGE9ZS5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWUscj1uLm9wdGlvbnMmJm4ub3B0aW9ucy5kZWxheT9sYShuLm9wdGlvbnMuZGVsYXkpOjA7bi5zdGVwcy5mb3JFYWNoKG89PntsZXQgZD1lLmNyZWF0ZVN1YkNvbnRleHQobi5vcHRpb25zKTtyJiZkLmRlbGF5TmV4dFN0ZXAociksV2kodGhpcyxvLGQpLGE9TWF0aC5tYXgoYSxkLmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZSksaS5wdXNoKGQuY3VycmVudFRpbWVsaW5lKX0pLGkuZm9yRWFjaChvPT5lLmN1cnJlbnRUaW1lbGluZS5tZXJnZVRpbWVsaW5lQ29sbGVjdGVkU3R5bGVzKG8pKSxlLnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShhKSxlLnByZXZpb3VzTm9kZT1ufV92aXNpdFRpbWluZyhuLGUpe2lmKG4uZHluYW1pYyl7bGV0IGk9bi5zdHJWYWx1ZSxhPWUucGFyYW1zP3BvKGksZS5wYXJhbXMsZS5lcnJvcnMpOmk7cmV0dXJuIEg0KGEsZS5lcnJvcnMpfWVsc2UgcmV0dXJue2R1cmF0aW9uOm4uZHVyYXRpb24sZGVsYXk6bi5kZWxheSxlYXNpbmc6bi5lYXNpbmd9fXZpc2l0QW5pbWF0ZShuLGUpe2xldCBpPWUuY3VycmVudEFuaW1hdGVUaW1pbmdzPXRoaXMuX3Zpc2l0VGltaW5nKG4udGltaW5ncyxlKSxhPWUuY3VycmVudFRpbWVsaW5lO2kuZGVsYXkmJihlLmluY3JlbWVudFRpbWUoaS5kZWxheSksYS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKSk7bGV0IHI9bi5zdHlsZTtyLnR5cGU9PXB0LktleWZyYW1lcz90aGlzLnZpc2l0S2V5ZnJhbWVzKHIsZSk6KGUuaW5jcmVtZW50VGltZShpLmR1cmF0aW9uKSx0aGlzLnZpc2l0U3R5bGUocixlKSxhLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpKSxlLmN1cnJlbnRBbmltYXRlVGltaW5ncz1udWxsLGUucHJldmlvdXNOb2RlPW59dmlzaXRTdHlsZShuLGUpe2xldCBpPWUuY3VycmVudFRpbWVsaW5lLGE9ZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3M7IWEmJmkuaGFzQ3VycmVudFN0eWxlUHJvcGVydGllcygpJiZpLmZvcndhcmRGcmFtZSgpO2xldCByPWEmJmEuZWFzaW5nfHxuLmVhc2luZztuLmlzRW1wdHlTdGVwP2kuYXBwbHlFbXB0eVN0ZXAocik6aS5zZXRTdHlsZXMobi5zdHlsZXMscixlLmVycm9ycyxlLm9wdGlvbnMpLGUucHJldmlvdXNOb2RlPW59dmlzaXRLZXlmcmFtZXMobixlKXtsZXQgaT1lLmN1cnJlbnRBbmltYXRlVGltaW5ncyxhPWUuY3VycmVudFRpbWVsaW5lLmR1cmF0aW9uLHI9aS5kdXJhdGlvbixkPWUuY3JlYXRlU3ViQ29udGV4dCgpLmN1cnJlbnRUaW1lbGluZTtkLmVhc2luZz1pLmVhc2luZyxuLnN0eWxlcy5mb3JFYWNoKHA9PntsZXQgZz1wLm9mZnNldHx8MDtkLmZvcndhcmRUaW1lKGcqciksZC5zZXRTdHlsZXMocC5zdHlsZXMscC5lYXNpbmcsZS5lcnJvcnMsZS5vcHRpb25zKSxkLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpfSksZS5jdXJyZW50VGltZWxpbmUubWVyZ2VUaW1lbGluZUNvbGxlY3RlZFN0eWxlcyhkKSxlLnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShhK3IpLGUucHJldmlvdXNOb2RlPW59dmlzaXRRdWVyeShuLGUpe2xldCBpPWUuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lLGE9bi5vcHRpb25zfHx7fSxyPWEuZGVsYXk/bGEoYS5kZWxheSk6MDtyJiYoZS5wcmV2aW91c05vZGUudHlwZT09PXB0LlN0eWxlfHxpPT0wJiZlLmN1cnJlbnRUaW1lbGluZS5oYXNDdXJyZW50U3R5bGVQcm9wZXJ0aWVzKCkpJiYoZS5jdXJyZW50VGltZWxpbmUuc25hcHNob3RDdXJyZW50U3R5bGVzKCksZS5wcmV2aW91c05vZGU9amMpO2xldCBvPWksZD1lLmludm9rZVF1ZXJ5KG4uc2VsZWN0b3Isbi5vcmlnaW5hbFNlbGVjdG9yLG4ubGltaXQsbi5pbmNsdWRlU2VsZiwhIWEub3B0aW9uYWwsZS5lcnJvcnMpO2UuY3VycmVudFF1ZXJ5VG90YWw9ZC5sZW5ndGg7bGV0IHA9bnVsbDtkLmZvckVhY2goKGcsXyk9PntlLmN1cnJlbnRRdWVyeUluZGV4PV87bGV0IHk9ZS5jcmVhdGVTdWJDb250ZXh0KG4ub3B0aW9ucyxnKTtyJiZ5LmRlbGF5TmV4dFN0ZXAociksZz09PWUuZWxlbWVudCYmKHA9eS5jdXJyZW50VGltZWxpbmUpLFdpKHRoaXMsbi5hbmltYXRpb24seSkseS5jdXJyZW50VGltZWxpbmUuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCk7bGV0IEk9eS5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWU7bz1NYXRoLm1heChvLEkpfSksZS5jdXJyZW50UXVlcnlJbmRleD0wLGUuY3VycmVudFF1ZXJ5VG90YWw9MCxlLnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShvKSxwJiYoZS5jdXJyZW50VGltZWxpbmUubWVyZ2VUaW1lbGluZUNvbGxlY3RlZFN0eWxlcyhwKSxlLmN1cnJlbnRUaW1lbGluZS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKSksZS5wcmV2aW91c05vZGU9bn12aXNpdFN0YWdnZXIobixlKXtsZXQgaT1lLnBhcmVudENvbnRleHQsYT1lLmN1cnJlbnRUaW1lbGluZSxyPW4udGltaW5ncyxvPU1hdGguYWJzKHIuZHVyYXRpb24pLGQ9byooZS5jdXJyZW50UXVlcnlUb3RhbC0xKSxwPW8qZS5jdXJyZW50UXVlcnlJbmRleDtzd2l0Y2goci5kdXJhdGlvbjwwPyJyZXZlcnNlIjpyLmVhc2luZyl7Y2FzZSJyZXZlcnNlIjpwPWQtcDticmVhaztjYXNlImZ1bGwiOnA9aS5jdXJyZW50U3RhZ2dlclRpbWU7YnJlYWt9bGV0IF89ZS5jdXJyZW50VGltZWxpbmU7cCYmXy5kZWxheU5leHRTdGVwKHApO2xldCB5PV8uY3VycmVudFRpbWU7V2kodGhpcyxuLmFuaW1hdGlvbixlKSxlLnByZXZpb3VzTm9kZT1uLGkuY3VycmVudFN0YWdnZXJUaW1lPWEuY3VycmVudFRpbWUteSsoYS5zdGFydFRpbWUtaS5jdXJyZW50VGltZWxpbmUuc3RhcnRUaW1lKX19LGpjPXt9LEc1PWNsYXNzIHR7X2RyaXZlcjtlbGVtZW50O3N1Ykluc3RydWN0aW9ucztfZW50ZXJDbGFzc05hbWU7X2xlYXZlQ2xhc3NOYW1lO2Vycm9yczt0aW1lbGluZXM7cGFyZW50Q29udGV4dD1udWxsO2N1cnJlbnRUaW1lbGluZTtjdXJyZW50QW5pbWF0ZVRpbWluZ3M9bnVsbDtwcmV2aW91c05vZGU9amM7c3ViQ29udGV4dENvdW50PTA7b3B0aW9ucz17fTtjdXJyZW50UXVlcnlJbmRleD0wO2N1cnJlbnRRdWVyeVRvdGFsPTA7Y3VycmVudFN0YWdnZXJUaW1lPTA7Y29uc3RydWN0b3IobixlLGksYSxyLG8sZCxwKXt0aGlzLl9kcml2ZXI9bix0aGlzLmVsZW1lbnQ9ZSx0aGlzLnN1Ykluc3RydWN0aW9ucz1pLHRoaXMuX2VudGVyQ2xhc3NOYW1lPWEsdGhpcy5fbGVhdmVDbGFzc05hbWU9cix0aGlzLmVycm9ycz1vLHRoaXMudGltZWxpbmVzPWQsdGhpcy5jdXJyZW50VGltZWxpbmU9cHx8bmV3IHFjKHRoaXMuX2RyaXZlcixlLDApLGQucHVzaCh0aGlzLmN1cnJlbnRUaW1lbGluZSl9Z2V0IHBhcmFtcygpe3JldHVybiB0aGlzLm9wdGlvbnMucGFyYW1zfXVwZGF0ZU9wdGlvbnMobixlKXtpZighbilyZXR1cm47bGV0IGk9bixhPXRoaXMub3B0aW9ucztpLmR1cmF0aW9uIT1udWxsJiYoYS5kdXJhdGlvbj1sYShpLmR1cmF0aW9uKSksaS5kZWxheSE9bnVsbCYmKGEuZGVsYXk9bGEoaS5kZWxheSkpO2xldCByPWkucGFyYW1zO2lmKHIpe2xldCBvPWEucGFyYW1zO298fChvPXRoaXMub3B0aW9ucy5wYXJhbXM9e30pLE9iamVjdC5rZXlzKHIpLmZvckVhY2goZD0+eyghZXx8IW8uaGFzT3duUHJvcGVydHkoZCkpJiYob1tkXT1wbyhyW2RdLG8sdGhpcy5lcnJvcnMpKX0pfX1fY29weU9wdGlvbnMoKXtsZXQgbj17fTtpZih0aGlzLm9wdGlvbnMpe2xldCBlPXRoaXMub3B0aW9ucy5wYXJhbXM7aWYoZSl7bGV0IGk9bi5wYXJhbXM9e307T2JqZWN0LmtleXMoZSkuZm9yRWFjaChhPT57aVthXT1lW2FdfSl9fXJldHVybiBufWNyZWF0ZVN1YkNvbnRleHQobj1udWxsLGUsaSl7bGV0IGE9ZXx8dGhpcy5lbGVtZW50LHI9bmV3IHQodGhpcy5fZHJpdmVyLGEsdGhpcy5zdWJJbnN0cnVjdGlvbnMsdGhpcy5fZW50ZXJDbGFzc05hbWUsdGhpcy5fbGVhdmVDbGFzc05hbWUsdGhpcy5lcnJvcnMsdGhpcy50aW1lbGluZXMsdGhpcy5jdXJyZW50VGltZWxpbmUuZm9yayhhLGl8fDApKTtyZXR1cm4gci5wcmV2aW91c05vZGU9dGhpcy5wcmV2aW91c05vZGUsci5jdXJyZW50QW5pbWF0ZVRpbWluZ3M9dGhpcy5jdXJyZW50QW5pbWF0ZVRpbWluZ3Msci5vcHRpb25zPXRoaXMuX2NvcHlPcHRpb25zKCksci51cGRhdGVPcHRpb25zKG4pLHIuY3VycmVudFF1ZXJ5SW5kZXg9dGhpcy5jdXJyZW50UXVlcnlJbmRleCxyLmN1cnJlbnRRdWVyeVRvdGFsPXRoaXMuY3VycmVudFF1ZXJ5VG90YWwsci5wYXJlbnRDb250ZXh0PXRoaXMsdGhpcy5zdWJDb250ZXh0Q291bnQrKyxyfXRyYW5zZm9ybUludG9OZXdUaW1lbGluZShuKXtyZXR1cm4gdGhpcy5wcmV2aW91c05vZGU9amMsdGhpcy5jdXJyZW50VGltZWxpbmU9dGhpcy5jdXJyZW50VGltZWxpbmUuZm9yayh0aGlzLmVsZW1lbnQsbiksdGhpcy50aW1lbGluZXMucHVzaCh0aGlzLmN1cnJlbnRUaW1lbGluZSksdGhpcy5jdXJyZW50VGltZWxpbmV9YXBwZW5kSW5zdHJ1Y3Rpb25Ub1RpbWVsaW5lKG4sZSxpKXtsZXQgYT17ZHVyYXRpb246ZT8/bi5kdXJhdGlvbixkZWxheTp0aGlzLmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZSsoaT8/MCkrbi5kZWxheSxlYXNpbmc6IiJ9LHI9bmV3IFc1KHRoaXMuX2RyaXZlcixuLmVsZW1lbnQsbi5rZXlmcmFtZXMsbi5wcmVTdHlsZVByb3BzLG4ucG9zdFN0eWxlUHJvcHMsYSxuLnN0cmV0Y2hTdGFydGluZ0tleWZyYW1lKTtyZXR1cm4gdGhpcy50aW1lbGluZXMucHVzaChyKSxhfWluY3JlbWVudFRpbWUobil7dGhpcy5jdXJyZW50VGltZWxpbmUuZm9yd2FyZFRpbWUodGhpcy5jdXJyZW50VGltZWxpbmUuZHVyYXRpb24rbil9ZGVsYXlOZXh0U3RlcChuKXtuPjAmJnRoaXMuY3VycmVudFRpbWVsaW5lLmRlbGF5TmV4dFN0ZXAobil9aW52b2tlUXVlcnkobixlLGksYSxyLG8pe2xldCBkPVtdO2lmKGEmJmQucHVzaCh0aGlzLmVsZW1lbnQpLG4ubGVuZ3RoPjApe249bi5yZXBsYWNlKHdPLCIuIit0aGlzLl9lbnRlckNsYXNzTmFtZSksbj1uLnJlcGxhY2Uoa08sIi4iK3RoaXMuX2xlYXZlQ2xhc3NOYW1lKTtsZXQgcD1pIT0xLGc9dGhpcy5fZHJpdmVyLnF1ZXJ5KHRoaXMuZWxlbWVudCxuLHApO2khPT0wJiYoZz1pPDA/Zy5zbGljZShnLmxlbmd0aCtpLGcubGVuZ3RoKTpnLnNsaWNlKDAsaSkpLGQucHVzaCguLi5nKX1yZXR1cm4hciYmZC5sZW5ndGg9PTAmJm8ucHVzaChwdihlKSksZH19LHFjPWNsYXNzIHR7X2RyaXZlcjtlbGVtZW50O3N0YXJ0VGltZTtfZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwO2R1cmF0aW9uPTA7ZWFzaW5nPW51bGw7X3ByZXZpb3VzS2V5ZnJhbWU9bmV3IE1hcDtfY3VycmVudEtleWZyYW1lPW5ldyBNYXA7X2tleWZyYW1lcz1uZXcgTWFwO19zdHlsZVN1bW1hcnk9bmV3IE1hcDtfbG9jYWxUaW1lbGluZVN0eWxlcz1uZXcgTWFwO19nbG9iYWxUaW1lbGluZVN0eWxlcztfcGVuZGluZ1N0eWxlcz1uZXcgTWFwO19iYWNrRmlsbD1uZXcgTWFwO19jdXJyZW50RW1wdHlTdGVwS2V5ZnJhbWU9bnVsbDtjb25zdHJ1Y3RvcihuLGUsaSxhKXt0aGlzLl9kcml2ZXI9bix0aGlzLmVsZW1lbnQ9ZSx0aGlzLnN0YXJ0VGltZT1pLHRoaXMuX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cD1hLHRoaXMuX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cHx8KHRoaXMuX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cD1uZXcgTWFwKSx0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlcz10aGlzLl9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXAuZ2V0KGUpLHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzfHwodGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXM9dGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcyx0aGlzLl9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXAuc2V0KGUsdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcykpLHRoaXMuX2xvYWRLZXlmcmFtZSgpfWNvbnRhaW5zQW5pbWF0aW9uKCl7c3dpdGNoKHRoaXMuX2tleWZyYW1lcy5zaXplKXtjYXNlIDA6cmV0dXJuITE7Y2FzZSAxOnJldHVybiB0aGlzLmhhc0N1cnJlbnRTdHlsZVByb3BlcnRpZXMoKTtkZWZhdWx0OnJldHVybiEwfX1oYXNDdXJyZW50U3R5bGVQcm9wZXJ0aWVzKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRLZXlmcmFtZS5zaXplPjB9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuc3RhcnRUaW1lK3RoaXMuZHVyYXRpb259ZGVsYXlOZXh0U3RlcChuKXtsZXQgZT10aGlzLl9rZXlmcmFtZXMuc2l6ZT09PTEmJnRoaXMuX3BlbmRpbmdTdHlsZXMuc2l6ZTt0aGlzLmR1cmF0aW9ufHxlPyh0aGlzLmZvcndhcmRUaW1lKHRoaXMuY3VycmVudFRpbWUrbiksZSYmdGhpcy5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKSk6dGhpcy5zdGFydFRpbWUrPW59Zm9yayhuLGUpe3JldHVybiB0aGlzLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpLG5ldyB0KHRoaXMuX2RyaXZlcixuLGV8fHRoaXMuY3VycmVudFRpbWUsdGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwKX1fbG9hZEtleWZyYW1lKCl7dGhpcy5fY3VycmVudEtleWZyYW1lJiYodGhpcy5fcHJldmlvdXNLZXlmcmFtZT10aGlzLl9jdXJyZW50S2V5ZnJhbWUpLHRoaXMuX2N1cnJlbnRLZXlmcmFtZT10aGlzLl9rZXlmcmFtZXMuZ2V0KHRoaXMuZHVyYXRpb24pLHRoaXMuX2N1cnJlbnRLZXlmcmFtZXx8KHRoaXMuX2N1cnJlbnRLZXlmcmFtZT1uZXcgTWFwLHRoaXMuX2tleWZyYW1lcy5zZXQodGhpcy5kdXJhdGlvbix0aGlzLl9jdXJyZW50S2V5ZnJhbWUpKX1mb3J3YXJkRnJhbWUoKXt0aGlzLmR1cmF0aW9uKz14Tyx0aGlzLl9sb2FkS2V5ZnJhbWUoKX1mb3J3YXJkVGltZShuKXt0aGlzLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpLHRoaXMuZHVyYXRpb249bix0aGlzLl9sb2FkS2V5ZnJhbWUoKX1fdXBkYXRlU3R5bGUobixlKXt0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzLnNldChuLGUpLHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzLnNldChuLGUpLHRoaXMuX3N0eWxlU3VtbWFyeS5zZXQobix7dGltZTp0aGlzLmN1cnJlbnRUaW1lLHZhbHVlOmV9KX1hbGxvd09ubHlUaW1lbGluZVN0eWxlcygpe3JldHVybiB0aGlzLl9jdXJyZW50RW1wdHlTdGVwS2V5ZnJhbWUhPT10aGlzLl9jdXJyZW50S2V5ZnJhbWV9YXBwbHlFbXB0eVN0ZXAobil7biYmdGhpcy5fcHJldmlvdXNLZXlmcmFtZS5zZXQoImVhc2luZyIsbik7Zm9yKGxldFtlLGldb2YgdGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXMpdGhpcy5fYmFja0ZpbGwuc2V0KGUsaXx8eTIpLHRoaXMuX2N1cnJlbnRLZXlmcmFtZS5zZXQoZSx5Mik7dGhpcy5fY3VycmVudEVtcHR5U3RlcEtleWZyYW1lPXRoaXMuX2N1cnJlbnRLZXlmcmFtZX1zZXRTdHlsZXMobixlLGksYSl7ZSYmdGhpcy5fcHJldmlvdXNLZXlmcmFtZS5zZXQoImVhc2luZyIsZSk7bGV0IHI9YSYmYS5wYXJhbXN8fHt9LG89ek8obix0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlcyk7Zm9yKGxldFtkLHBdb2Ygbyl7bGV0IGc9cG8ocCxyLGkpO3RoaXMuX3BlbmRpbmdTdHlsZXMuc2V0KGQsZyksdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcy5oYXMoZCl8fHRoaXMuX2JhY2tGaWxsLnNldChkLHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzLmdldChkKT8/eTIpLHRoaXMuX3VwZGF0ZVN0eWxlKGQsZyl9fWFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpe3RoaXMuX3BlbmRpbmdTdHlsZXMuc2l6ZSE9MCYmKHRoaXMuX3BlbmRpbmdTdHlsZXMuZm9yRWFjaCgobixlKT0+e3RoaXMuX2N1cnJlbnRLZXlmcmFtZS5zZXQoZSxuKX0pLHRoaXMuX3BlbmRpbmdTdHlsZXMuY2xlYXIoKSx0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzLmZvckVhY2goKG4sZSk9Pnt0aGlzLl9jdXJyZW50S2V5ZnJhbWUuaGFzKGUpfHx0aGlzLl9jdXJyZW50S2V5ZnJhbWUuc2V0KGUsbil9KSl9c25hcHNob3RDdXJyZW50U3R5bGVzKCl7Zm9yKGxldFtuLGVdb2YgdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcyl0aGlzLl9wZW5kaW5nU3R5bGVzLnNldChuLGUpLHRoaXMuX3VwZGF0ZVN0eWxlKG4sZSl9Z2V0RmluYWxLZXlmcmFtZSgpe3JldHVybiB0aGlzLl9rZXlmcmFtZXMuZ2V0KHRoaXMuZHVyYXRpb24pfWdldCBwcm9wZXJ0aWVzKCl7bGV0IG49W107Zm9yKGxldCBlIGluIHRoaXMuX2N1cnJlbnRLZXlmcmFtZSluLnB1c2goZSk7cmV0dXJuIG59bWVyZ2VUaW1lbGluZUNvbGxlY3RlZFN0eWxlcyhuKXtuLl9zdHlsZVN1bW1hcnkuZm9yRWFjaCgoZSxpKT0+e2xldCBhPXRoaXMuX3N0eWxlU3VtbWFyeS5nZXQoaSk7KCFhfHxlLnRpbWU+YS50aW1lKSYmdGhpcy5fdXBkYXRlU3R5bGUoaSxlLnZhbHVlKX0pfWJ1aWxkS2V5ZnJhbWVzKCl7dGhpcy5hcHBseVN0eWxlc1RvS2V5ZnJhbWUoKTtsZXQgbj1uZXcgU2V0LGU9bmV3IFNldCxpPXRoaXMuX2tleWZyYW1lcy5zaXplPT09MSYmdGhpcy5kdXJhdGlvbj09PTAsYT1bXTt0aGlzLl9rZXlmcmFtZXMuZm9yRWFjaCgoZCxwKT0+e2xldCBnPW5ldyBNYXAoWy4uLnRoaXMuX2JhY2tGaWxsLC4uLmRdKTtnLmZvckVhY2goKF8seSk9PntfPT09ZW8/bi5hZGQoeSk6Xz09PXkyJiZlLmFkZCh5KX0pLGl8fGcuc2V0KCJvZmZzZXQiLHAvdGhpcy5kdXJhdGlvbiksYS5wdXNoKGcpfSk7bGV0IHI9Wy4uLm4udmFsdWVzKCldLG89Wy4uLmUudmFsdWVzKCldO2lmKGkpe2xldCBkPWFbMF0scD1uZXcgTWFwKGQpO2Quc2V0KCJvZmZzZXQiLDApLHAuc2V0KCJvZmZzZXQiLDEpLGE9W2QscF19cmV0dXJuIGU3KHRoaXMuZWxlbWVudCxhLHIsbyx0aGlzLmR1cmF0aW9uLHRoaXMuc3RhcnRUaW1lLHRoaXMuZWFzaW5nLCExKX19LFc1PWNsYXNzIGV4dGVuZHMgcWN7a2V5ZnJhbWVzO3ByZVN0eWxlUHJvcHM7cG9zdFN0eWxlUHJvcHM7X3N0cmV0Y2hTdGFydGluZ0tleWZyYW1lO3RpbWluZ3M7Y29uc3RydWN0b3IobixlLGksYSxyLG8sZD0hMSl7c3VwZXIobixlLG8uZGVsYXkpLHRoaXMua2V5ZnJhbWVzPWksdGhpcy5wcmVTdHlsZVByb3BzPWEsdGhpcy5wb3N0U3R5bGVQcm9wcz1yLHRoaXMuX3N0cmV0Y2hTdGFydGluZ0tleWZyYW1lPWQsdGhpcy50aW1pbmdzPXtkdXJhdGlvbjpvLmR1cmF0aW9uLGRlbGF5Om8uZGVsYXksZWFzaW5nOm8uZWFzaW5nfX1jb250YWluc0FuaW1hdGlvbigpe3JldHVybiB0aGlzLmtleWZyYW1lcy5sZW5ndGg+MX1idWlsZEtleWZyYW1lcygpe2xldCBuPXRoaXMua2V5ZnJhbWVzLHtkZWxheTplLGR1cmF0aW9uOmksZWFzaW5nOmF9PXRoaXMudGltaW5ncztpZih0aGlzLl9zdHJldGNoU3RhcnRpbmdLZXlmcmFtZSYmZSl7bGV0IHI9W10sbz1pK2UsZD1lL28scD1uZXcgTWFwKG5bMF0pO3Auc2V0KCJvZmZzZXQiLDApLHIucHVzaChwKTtsZXQgZz1uZXcgTWFwKG5bMF0pO2cuc2V0KCJvZmZzZXQiLFZ2KGQpKSxyLnB1c2goZyk7bGV0IF89bi5sZW5ndGgtMTtmb3IobGV0IHk9MTt5PD1fO3krKyl7bGV0IEk9bmV3IE1hcChuW3ldKSxQPUkuZ2V0KCJvZmZzZXQiKSxWPWUrUCppO0kuc2V0KCJvZmZzZXQiLFZ2KFYvbykpLHIucHVzaChJKX1pPW8sZT0wLGE9IiIsbj1yfXJldHVybiBlNyh0aGlzLmVsZW1lbnQsbix0aGlzLnByZVN0eWxlUHJvcHMsdGhpcy5wb3N0U3R5bGVQcm9wcyxpLGUsYSwhMCl9fTtONT17fSxHYz1jbGFzc3tfdHJpZ2dlck5hbWU7YXN0O19zdGF0ZVN0eWxlcztjb25zdHJ1Y3RvcihuLGUsaSl7dGhpcy5fdHJpZ2dlck5hbWU9bix0aGlzLmFzdD1lLHRoaXMuX3N0YXRlU3R5bGVzPWl9bWF0Y2gobixlLGksYSl7cmV0dXJuIFRPKHRoaXMuYXN0Lm1hdGNoZXJzLG4sZSxpLGEpfWJ1aWxkU3R5bGVzKG4sZSxpKXtsZXQgYT10aGlzLl9zdGF0ZVN0eWxlcy5nZXQoIioiKTtyZXR1cm4gbiE9PXZvaWQgMCYmKGE9dGhpcy5fc3RhdGVTdHlsZXMuZ2V0KG4/LnRvU3RyaW5nKCkpfHxhKSxhP2EuYnVpbGRTdHlsZXMoZSxpKTpuZXcgTWFwfWJ1aWxkKG4sZSxpLGEscixvLGQscCxnLF8pe2xldCB5PVtdLEk9dGhpcy5hc3Qub3B0aW9ucyYmdGhpcy5hc3Qub3B0aW9ucy5wYXJhbXN8fE41LFA9ZCYmZC5wYXJhbXN8fE41LFY9dGhpcy5idWlsZFN0eWxlcyhpLFAseSksTz1wJiZwLnBhcmFtc3x8TjUsVT10aGlzLmJ1aWxkU3R5bGVzKGEsTyx5KSxRPW5ldyBTZXQsZmU9bmV3IE1hcCxPZT1uZXcgTWFwLE1lPWE9PT0idm9pZCIscnQ9e3BhcmFtczpXdihPLEkpLGRlbGF5OnRoaXMuYXN0Lm9wdGlvbnM/LmRlbGF5fSxOZT1fP1tdOkd2KG4sZSx0aGlzLmFzdC5hbmltYXRpb24scixvLFYsVSxydCxnLHkpLFllPTA7cmV0dXJuIE5lLmZvckVhY2godnQ9PntZZT1NYXRoLm1heCh2dC5kdXJhdGlvbit2dC5kZWxheSxZZSl9KSx5Lmxlbmd0aD9PdihlLHRoaXMuX3RyaWdnZXJOYW1lLGksYSxNZSxWLFUsW10sW10sZmUsT2UsWWUseSk6KE5lLmZvckVhY2godnQ9PntsZXQgTTE9dnQuZWxlbWVudCxUMj1HaShmZSxNMSxuZXcgU2V0KTt2dC5wcmVTdHlsZVByb3BzLmZvckVhY2god249PlQyLmFkZCh3bikpO2xldCBDZD1HaShPZSxNMSxuZXcgU2V0KTt2dC5wb3N0U3R5bGVQcm9wcy5mb3JFYWNoKHduPT5DZC5hZGQod24pKSxNMSE9PWUmJlEuYWRkKE0xKX0pLE92KGUsdGhpcy5fdHJpZ2dlck5hbWUsaSxhLE1lLFYsVSxOZSxbLi4uUS52YWx1ZXMoKV0sZmUsT2UsWWUpKX19O1E1PWNsYXNze3N0eWxlcztkZWZhdWx0UGFyYW1zO25vcm1hbGl6ZXI7Y29uc3RydWN0b3IobixlLGkpe3RoaXMuc3R5bGVzPW4sdGhpcy5kZWZhdWx0UGFyYW1zPWUsdGhpcy5ub3JtYWxpemVyPWl9YnVpbGRTdHlsZXMobixlKXtsZXQgaT1uZXcgTWFwLGE9V3Yobix0aGlzLmRlZmF1bHRQYXJhbXMpO3JldHVybiB0aGlzLnN0eWxlcy5zdHlsZXMuZm9yRWFjaChyPT57dHlwZW9mIHIhPSJzdHJpbmciJiZyLmZvckVhY2goKG8sZCk9PntvJiYobz1wbyhvLGEsZSkpO2xldCBwPXRoaXMubm9ybWFsaXplci5ub3JtYWxpemVQcm9wZXJ0eU5hbWUoZCxlKTtvPXRoaXMubm9ybWFsaXplci5ub3JtYWxpemVTdHlsZVZhbHVlKGQscCxvLGUpLGkuc2V0KGQsbyl9KX0pLGl9fTtZNT1jbGFzc3tuYW1lO2FzdDtfbm9ybWFsaXplcjt0cmFuc2l0aW9uRmFjdG9yaWVzPVtdO2ZhbGxiYWNrVHJhbnNpdGlvbjtzdGF0ZXM9bmV3IE1hcDtjb25zdHJ1Y3RvcihuLGUsaSl7dGhpcy5uYW1lPW4sdGhpcy5hc3Q9ZSx0aGlzLl9ub3JtYWxpemVyPWksZS5zdGF0ZXMuZm9yRWFjaChhPT57bGV0IHI9YS5vcHRpb25zJiZhLm9wdGlvbnMucGFyYW1zfHx7fTt0aGlzLnN0YXRlcy5zZXQoYS5uYW1lLG5ldyBRNShhLnN0eWxlLHIsaSkpfSksSHYodGhpcy5zdGF0ZXMsInRydWUiLCIxIiksSHYodGhpcy5zdGF0ZXMsImZhbHNlIiwiMCIpLGUudHJhbnNpdGlvbnMuZm9yRWFjaChhPT57dGhpcy50cmFuc2l0aW9uRmFjdG9yaWVzLnB1c2gobmV3IEdjKG4sYSx0aGlzLnN0YXRlcykpfSksdGhpcy5mYWxsYmFja1RyYW5zaXRpb249QU8obix0aGlzLnN0YXRlcyl9Z2V0IGNvbnRhaW5zUXVlcmllcygpe3JldHVybiB0aGlzLmFzdC5xdWVyeUNvdW50PjB9bWF0Y2hUcmFuc2l0aW9uKG4sZSxpLGEpe3JldHVybiB0aGlzLnRyYW5zaXRpb25GYWN0b3JpZXMuZmluZChvPT5vLm1hdGNoKG4sZSxpLGEpKXx8bnVsbH1tYXRjaFN0eWxlcyhuLGUsaSl7cmV0dXJuIHRoaXMuZmFsbGJhY2tUcmFuc2l0aW9uLmJ1aWxkU3R5bGVzKG4sZSxpKX19O0RPPW5ldyBSNCxaNT1jbGFzc3tib2R5Tm9kZTtfZHJpdmVyO19ub3JtYWxpemVyO19hbmltYXRpb25zPW5ldyBNYXA7X3BsYXllcnNCeUlkPW5ldyBNYXA7cGxheWVycz1bXTtjb25zdHJ1Y3RvcihuLGUsaSl7dGhpcy5ib2R5Tm9kZT1uLHRoaXMuX2RyaXZlcj1lLHRoaXMuX25vcm1hbGl6ZXI9aX1yZWdpc3RlcihuLGUpe2xldCBpPVtdLGE9W10scj1xdih0aGlzLl9kcml2ZXIsZSxpLGEpO2lmKGkubGVuZ3RoKXRocm93IHZ2KGkpO3RoaXMuX2FuaW1hdGlvbnMuc2V0KG4scil9X2J1aWxkUGxheWVyKG4sZSxpKXtsZXQgYT1uLmVsZW1lbnQscj1FNSh0aGlzLl9ub3JtYWxpemVyLG4ua2V5ZnJhbWVzLGUsaSk7cmV0dXJuIHRoaXMuX2RyaXZlci5hbmltYXRlKGEscixuLmR1cmF0aW9uLG4uZGVsYXksbi5lYXNpbmcsW10sITApfWNyZWF0ZShuLGUsaT17fSl7bGV0IGE9W10scj10aGlzLl9hbmltYXRpb25zLmdldChuKSxvLGQ9bmV3IE1hcDtpZihyPyhvPUd2KHRoaXMuX2RyaXZlcixlLHIsUDUsTGMsbmV3IE1hcCxuZXcgTWFwLGksRE8sYSksby5mb3JFYWNoKF89PntsZXQgeT1HaShkLF8uZWxlbWVudCxuZXcgTWFwKTtfLnBvc3RTdHlsZVByb3BzLmZvckVhY2goST0+eS5zZXQoSSxudWxsKSl9KSk6KGEucHVzaChfdigpKSxvPVtdKSxhLmxlbmd0aCl0aHJvdyBidihhKTtkLmZvckVhY2goKF8seSk9PntfLmZvckVhY2goKEksUCk9PntfLnNldChQLHRoaXMuX2RyaXZlci5jb21wdXRlU3R5bGUoeSxQLHkyKSl9KX0pO2xldCBwPW8ubWFwKF89PntsZXQgeT1kLmdldChfLmVsZW1lbnQpO3JldHVybiB0aGlzLl9idWlsZFBsYXllcihfLG5ldyBNYXAseSl9KSxnPUFhKHApO3JldHVybiB0aGlzLl9wbGF5ZXJzQnlJZC5zZXQobixnKSxnLm9uRGVzdHJveSgoKT0+dGhpcy5kZXN0cm95KG4pKSx0aGlzLnBsYXllcnMucHVzaChnKSxnfWRlc3Ryb3kobil7bGV0IGU9dGhpcy5fZ2V0UGxheWVyKG4pO2UuZGVzdHJveSgpLHRoaXMuX3BsYXllcnNCeUlkLmRlbGV0ZShuKTtsZXQgaT10aGlzLnBsYXllcnMuaW5kZXhPZihlKTtpPj0wJiZ0aGlzLnBsYXllcnMuc3BsaWNlKGksMSl9X2dldFBsYXllcihuKXtsZXQgZT10aGlzLl9wbGF5ZXJzQnlJZC5nZXQobik7aWYoIWUpdGhyb3cgQ3Yobik7cmV0dXJuIGV9bGlzdGVuKG4sZSxpLGEpe2xldCByPURjKGUsIiIsIiIsIiIpO3JldHVybiBBYyh0aGlzLl9nZXRQbGF5ZXIobiksaSxyLGEpLCgpPT57fX1jb21tYW5kKG4sZSxpLGEpe2lmKGk9PSJyZWdpc3RlciIpe3RoaXMucmVnaXN0ZXIobixhWzBdKTtyZXR1cm59aWYoaT09ImNyZWF0ZSIpe2xldCBvPWFbMF18fHt9O3RoaXMuY3JlYXRlKG4sZSxvKTtyZXR1cm59bGV0IHI9dGhpcy5fZ2V0UGxheWVyKG4pO3N3aXRjaChpKXtjYXNlInBsYXkiOnIucGxheSgpO2JyZWFrO2Nhc2UicGF1c2UiOnIucGF1c2UoKTticmVhaztjYXNlInJlc2V0IjpyLnJlc2V0KCk7YnJlYWs7Y2FzZSJyZXN0YXJ0IjpyLnJlc3RhcnQoKTticmVhaztjYXNlImZpbmlzaCI6ci5maW5pc2goKTticmVhaztjYXNlImluaXQiOnIuaW5pdCgpO2JyZWFrO2Nhc2Uic2V0UG9zaXRpb24iOnIuc2V0UG9zaXRpb24ocGFyc2VGbG9hdChhWzBdKSk7YnJlYWs7Y2FzZSJkZXN0cm95Ijp0aGlzLmRlc3Ryb3kobik7YnJlYWt9fX0sTnY9Im5nLWFuaW1hdGUtcXVldWVkIixJTz0iLm5nLWFuaW1hdGUtcXVldWVkIixSNT0ibmctYW5pbWF0ZS1kaXNhYmxlZCIsTE89Ii5uZy1hbmltYXRlLWRpc2FibGVkIixQTz0ibmctc3Rhci1pbnNlcnRlZCIsVk89Ii5uZy1zdGFyLWluc2VydGVkIixPTz1bXSxRdj17bmFtZXNwYWNlSWQ6IiIsc2V0Rm9yUmVtb3ZhbDohMSxzZXRGb3JNb3ZlOiExLGhhc0FuaW1hdGlvbjohMSxyZW1vdmVkQmVmb3JlUXVlcmllZDohMX0sSE89e25hbWVzcGFjZUlkOiIiLHNldEZvck1vdmU6ITEsc2V0Rm9yUmVtb3ZhbDohMSxoYXNBbmltYXRpb246ITEscmVtb3ZlZEJlZm9yZVF1ZXJpZWQ6ITB9LEYyPSJfX25nX3JlbW92ZWQiLEY0PWNsYXNze25hbWVzcGFjZUlkO3ZhbHVlO29wdGlvbnM7Z2V0IHBhcmFtcygpe3JldHVybiB0aGlzLm9wdGlvbnMucGFyYW1zfWNvbnN0cnVjdG9yKG4sZT0iIil7dGhpcy5uYW1lc3BhY2VJZD1lO2xldCBpPW4mJm4uaGFzT3duUHJvcGVydHkoInZhbHVlIiksYT1pP24udmFsdWU6bjtpZih0aGlzLnZhbHVlPVJPKGEpLGkpe2xldCByPW4se3ZhbHVlOm99PXIsZD13ZChyLFsidmFsdWUiXSk7dGhpcy5vcHRpb25zPWR9ZWxzZSB0aGlzLm9wdGlvbnM9e307dGhpcy5vcHRpb25zLnBhcmFtc3x8KHRoaXMub3B0aW9ucy5wYXJhbXM9e30pfWFic29yYk9wdGlvbnMobil7bGV0IGU9bi5wYXJhbXM7aWYoZSl7bGV0IGk9dGhpcy5vcHRpb25zLnBhcmFtcztPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGE9PntpW2FdPT1udWxsJiYoaVthXT1lW2FdKX0pfX19LE40PSJ2b2lkIixGNT1uZXcgRjQoTjQpLCQ1PWNsYXNze2lkO2hvc3RFbGVtZW50O19lbmdpbmU7cGxheWVycz1bXTtfdHJpZ2dlcnM9bmV3IE1hcDtfcXVldWU9W107X2VsZW1lbnRMaXN0ZW5lcnM9bmV3IE1hcDtfaG9zdENsYXNzTmFtZTtjb25zdHJ1Y3RvcihuLGUsaSl7dGhpcy5pZD1uLHRoaXMuaG9zdEVsZW1lbnQ9ZSx0aGlzLl9lbmdpbmU9aSx0aGlzLl9ob3N0Q2xhc3NOYW1lPSJuZy10bnMtIituLFMyKGUsdGhpcy5faG9zdENsYXNzTmFtZSl9bGlzdGVuKG4sZSxpLGEpe2lmKCF0aGlzLl90cmlnZ2Vycy5oYXMoZSkpdGhyb3cgeXYoaSxlKTtpZihpPT1udWxsfHxpLmxlbmd0aD09MCl0aHJvdyB4dihlKTtpZighRk8oaSkpdGhyb3cgTXYoaSxlKTtsZXQgcj1HaSh0aGlzLl9lbGVtZW50TGlzdGVuZXJzLG4sW10pLG89e25hbWU6ZSxwaGFzZTppLGNhbGxiYWNrOmF9O3IucHVzaChvKTtsZXQgZD1HaSh0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LG4sbmV3IE1hcCk7cmV0dXJuIGQuaGFzKGUpfHwoUzIobixWNCksUzIobixWNCsiLSIrZSksZC5zZXQoZSxGNSkpLCgpPT57dGhpcy5fZW5naW5lLmFmdGVyRmx1c2goKCk9PntsZXQgcD1yLmluZGV4T2Yobyk7cD49MCYmci5zcGxpY2UocCwxKSx0aGlzLl90cmlnZ2Vycy5oYXMoZSl8fGQuZGVsZXRlKGUpfSl9fXJlZ2lzdGVyKG4sZSl7cmV0dXJuIHRoaXMuX3RyaWdnZXJzLmhhcyhuKT8hMToodGhpcy5fdHJpZ2dlcnMuc2V0KG4sZSksITApfV9nZXRUcmlnZ2VyKG4pe2xldCBlPXRoaXMuX3RyaWdnZXJzLmdldChuKTtpZighZSl0aHJvdyB3dihuKTtyZXR1cm4gZX10cmlnZ2VyKG4sZSxpLGE9ITApe2xldCByPXRoaXMuX2dldFRyaWdnZXIoZSksbz1uZXcgQjQodGhpcy5pZCxlLG4pLGQ9dGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5nZXQobik7ZHx8KFMyKG4sVjQpLFMyKG4sVjQrIi0iK2UpLHRoaXMuX2VuZ2luZS5zdGF0ZXNCeUVsZW1lbnQuc2V0KG4sZD1uZXcgTWFwKSk7bGV0IHA9ZC5nZXQoZSksZz1uZXcgRjQoaSx0aGlzLmlkKTtpZighKGkmJmkuaGFzT3duUHJvcGVydHkoInZhbHVlIikpJiZwJiZnLmFic29yYk9wdGlvbnMocC5vcHRpb25zKSxkLnNldChlLGcpLHB8fChwPUY1KSwhKGcudmFsdWU9PT1ONCkmJnAudmFsdWU9PT1nLnZhbHVlKXtpZighak8ocC5wYXJhbXMsZy5wYXJhbXMpKXtsZXQgTz1bXSxVPXIubWF0Y2hTdHlsZXMocC52YWx1ZSxwLnBhcmFtcyxPKSxRPXIubWF0Y2hTdHlsZXMoZy52YWx1ZSxnLnBhcmFtcyxPKTtPLmxlbmd0aD90aGlzLl9lbmdpbmUucmVwb3J0RXJyb3IoTyk6dGhpcy5fZW5naW5lLmFmdGVyRmx1c2goKCk9PntjbihuLFUpLFIyKG4sUSl9KX1yZXR1cm59bGV0IEk9R2kodGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQsbixbXSk7SS5mb3JFYWNoKE89PntPLm5hbWVzcGFjZUlkPT10aGlzLmlkJiZPLnRyaWdnZXJOYW1lPT1lJiZPLnF1ZXVlZCYmTy5kZXN0cm95KCl9KTtsZXQgUD1yLm1hdGNoVHJhbnNpdGlvbihwLnZhbHVlLGcudmFsdWUsbixnLnBhcmFtcyksVj0hMTtpZighUCl7aWYoIWEpcmV0dXJuO1A9ci5mYWxsYmFja1RyYW5zaXRpb24sVj0hMH1yZXR1cm4gdGhpcy5fZW5naW5lLnRvdGFsUXVldWVkUGxheWVycysrLHRoaXMuX3F1ZXVlLnB1c2goe2VsZW1lbnQ6bix0cmlnZ2VyTmFtZTplLHRyYW5zaXRpb246UCxmcm9tU3RhdGU6cCx0b1N0YXRlOmcscGxheWVyOm8saXNGYWxsYmFja1RyYW5zaXRpb246Vn0pLFZ8fChTMihuLE52KSxvLm9uU3RhcnQoKCk9PntmbyhuLE52KX0pKSxvLm9uRG9uZSgoKT0+e2xldCBPPXRoaXMucGxheWVycy5pbmRleE9mKG8pO08+PTAmJnRoaXMucGxheWVycy5zcGxpY2UoTywxKTtsZXQgVT10aGlzLl9lbmdpbmUucGxheWVyc0J5RWxlbWVudC5nZXQobik7aWYoVSl7bGV0IFE9VS5pbmRleE9mKG8pO1E+PTAmJlUuc3BsaWNlKFEsMSl9fSksdGhpcy5wbGF5ZXJzLnB1c2gobyksSS5wdXNoKG8pLG99ZGVyZWdpc3RlcihuKXt0aGlzLl90cmlnZ2Vycy5kZWxldGUobiksdGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5mb3JFYWNoKGU9PmUuZGVsZXRlKG4pKSx0aGlzLl9lbGVtZW50TGlzdGVuZXJzLmZvckVhY2goKGUsaSk9Pnt0aGlzLl9lbGVtZW50TGlzdGVuZXJzLnNldChpLGUuZmlsdGVyKGE9PmEubmFtZSE9bikpfSl9Y2xlYXJFbGVtZW50Q2FjaGUobil7dGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5kZWxldGUobiksdGhpcy5fZWxlbWVudExpc3RlbmVycy5kZWxldGUobik7bGV0IGU9dGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQuZ2V0KG4pO2UmJihlLmZvckVhY2goaT0+aS5kZXN0cm95KCkpLHRoaXMuX2VuZ2luZS5wbGF5ZXJzQnlFbGVtZW50LmRlbGV0ZShuKSl9X3NpZ25hbFJlbW92YWxGb3JJbm5lclRyaWdnZXJzKG4sZSl7bGV0IGk9dGhpcy5fZW5naW5lLmRyaXZlci5xdWVyeShuLE80LCEwKTtpLmZvckVhY2goYT0+e2lmKGFbRjJdKXJldHVybjtsZXQgcj10aGlzLl9lbmdpbmUuZmV0Y2hOYW1lc3BhY2VzQnlFbGVtZW50KGEpO3Iuc2l6ZT9yLmZvckVhY2gobz0+by50cmlnZ2VyTGVhdmVBbmltYXRpb24oYSxlLCExLCEwKSk6dGhpcy5jbGVhckVsZW1lbnRDYWNoZShhKX0pLHRoaXMuX2VuZ2luZS5hZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUoKCk9PmkuZm9yRWFjaChhPT50aGlzLmNsZWFyRWxlbWVudENhY2hlKGEpKSl9dHJpZ2dlckxlYXZlQW5pbWF0aW9uKG4sZSxpLGEpe2xldCByPXRoaXMuX2VuZ2luZS5zdGF0ZXNCeUVsZW1lbnQuZ2V0KG4pLG89bmV3IE1hcDtpZihyKXtsZXQgZD1bXTtpZihyLmZvckVhY2goKHAsZyk9PntpZihvLnNldChnLHAudmFsdWUpLHRoaXMuX3RyaWdnZXJzLmhhcyhnKSl7bGV0IF89dGhpcy50cmlnZ2VyKG4sZyxONCxhKTtfJiZkLnB1c2goXyl9fSksZC5sZW5ndGgpcmV0dXJuIHRoaXMuX2VuZ2luZS5tYXJrRWxlbWVudEFzUmVtb3ZlZCh0aGlzLmlkLG4sITAsZSxvKSxpJiZBYShkKS5vbkRvbmUoKCk9PnRoaXMuX2VuZ2luZS5wcm9jZXNzTGVhdmVOb2RlKG4pKSwhMH1yZXR1cm4hMX1wcmVwYXJlTGVhdmVBbmltYXRpb25MaXN0ZW5lcnMobil7bGV0IGU9dGhpcy5fZWxlbWVudExpc3RlbmVycy5nZXQobiksaT10aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LmdldChuKTtpZihlJiZpKXtsZXQgYT1uZXcgU2V0O2UuZm9yRWFjaChyPT57bGV0IG89ci5uYW1lO2lmKGEuaGFzKG8pKXJldHVybjthLmFkZChvKTtsZXQgcD10aGlzLl90cmlnZ2Vycy5nZXQobykuZmFsbGJhY2tUcmFuc2l0aW9uLGc9aS5nZXQobyl8fEY1LF89bmV3IEY0KE40KSx5PW5ldyBCNCh0aGlzLmlkLG8sbik7dGhpcy5fZW5naW5lLnRvdGFsUXVldWVkUGxheWVycysrLHRoaXMuX3F1ZXVlLnB1c2goe2VsZW1lbnQ6bix0cmlnZ2VyTmFtZTpvLHRyYW5zaXRpb246cCxmcm9tU3RhdGU6Zyx0b1N0YXRlOl8scGxheWVyOnksaXNGYWxsYmFja1RyYW5zaXRpb246ITB9KX0pfX1yZW1vdmVOb2RlKG4sZSl7bGV0IGk9dGhpcy5fZW5naW5lO2lmKG4uY2hpbGRFbGVtZW50Q291bnQmJnRoaXMuX3NpZ25hbFJlbW92YWxGb3JJbm5lclRyaWdnZXJzKG4sZSksdGhpcy50cmlnZ2VyTGVhdmVBbmltYXRpb24obixlLCEwKSlyZXR1cm47bGV0IGE9ITE7aWYoaS50b3RhbEFuaW1hdGlvbnMpe2xldCByPWkucGxheWVycy5sZW5ndGg/aS5wbGF5ZXJzQnlRdWVyaWVkRWxlbWVudC5nZXQobik6W107aWYociYmci5sZW5ndGgpYT0hMDtlbHNle2xldCBvPW47Zm9yKDtvPW8ucGFyZW50Tm9kZTspaWYoaS5zdGF0ZXNCeUVsZW1lbnQuZ2V0KG8pKXthPSEwO2JyZWFrfX19aWYodGhpcy5wcmVwYXJlTGVhdmVBbmltYXRpb25MaXN0ZW5lcnMobiksYSlpLm1hcmtFbGVtZW50QXNSZW1vdmVkKHRoaXMuaWQsbiwhMSxlKTtlbHNle2xldCByPW5bRjJdOyghcnx8cj09PVF2KSYmKGkuYWZ0ZXJGbHVzaCgoKT0+dGhpcy5jbGVhckVsZW1lbnRDYWNoZShuKSksaS5kZXN0cm95SW5uZXJBbmltYXRpb25zKG4pLGkuX29uUmVtb3ZhbENvbXBsZXRlKG4sZSkpfX1pbnNlcnROb2RlKG4sZSl7UzIobix0aGlzLl9ob3N0Q2xhc3NOYW1lKX1kcmFpblF1ZXVlZFRyYW5zaXRpb25zKG4pe2xldCBlPVtdO3JldHVybiB0aGlzLl9xdWV1ZS5mb3JFYWNoKGk9PntsZXQgYT1pLnBsYXllcjtpZihhLmRlc3Ryb3llZClyZXR1cm47bGV0IHI9aS5lbGVtZW50LG89dGhpcy5fZWxlbWVudExpc3RlbmVycy5nZXQocik7byYmby5mb3JFYWNoKGQ9PntpZihkLm5hbWU9PWkudHJpZ2dlck5hbWUpe2xldCBwPURjKHIsaS50cmlnZ2VyTmFtZSxpLmZyb21TdGF0ZS52YWx1ZSxpLnRvU3RhdGUudmFsdWUpO3AuX2RhdGE9bixBYyhpLnBsYXllcixkLnBoYXNlLHAsZC5jYWxsYmFjayl9fSksYS5tYXJrZWRGb3JEZXN0cm95P3RoaXMuX2VuZ2luZS5hZnRlckZsdXNoKCgpPT57YS5kZXN0cm95KCl9KTplLnB1c2goaSl9KSx0aGlzLl9xdWV1ZT1bXSxlLnNvcnQoKGksYSk9PntsZXQgcj1pLnRyYW5zaXRpb24uYXN0LmRlcENvdW50LG89YS50cmFuc2l0aW9uLmFzdC5kZXBDb3VudDtyZXR1cm4gcj09MHx8bz09MD9yLW86dGhpcy5fZW5naW5lLmRyaXZlci5jb250YWluc0VsZW1lbnQoaS5lbGVtZW50LGEuZWxlbWVudCk/MTotMX0pfWRlc3Ryb3kobil7dGhpcy5wbGF5ZXJzLmZvckVhY2goZT0+ZS5kZXN0cm95KCkpLHRoaXMuX3NpZ25hbFJlbW92YWxGb3JJbm5lclRyaWdnZXJzKHRoaXMuaG9zdEVsZW1lbnQsbil9fSxLNT1jbGFzc3tib2R5Tm9kZTtkcml2ZXI7X25vcm1hbGl6ZXI7cGxheWVycz1bXTtuZXdIb3N0RWxlbWVudHM9bmV3IE1hcDtwbGF5ZXJzQnlFbGVtZW50PW5ldyBNYXA7cGxheWVyc0J5UXVlcmllZEVsZW1lbnQ9bmV3IE1hcDtzdGF0ZXNCeUVsZW1lbnQ9bmV3IE1hcDtkaXNhYmxlZE5vZGVzPW5ldyBTZXQ7dG90YWxBbmltYXRpb25zPTA7dG90YWxRdWV1ZWRQbGF5ZXJzPTA7X25hbWVzcGFjZUxvb2t1cD17fTtfbmFtZXNwYWNlTGlzdD1bXTtfZmx1c2hGbnM9W107X3doZW5RdWlldEZucz1bXTtuYW1lc3BhY2VzQnlIb3N0RWxlbWVudD1uZXcgTWFwO2NvbGxlY3RlZEVudGVyRWxlbWVudHM9W107Y29sbGVjdGVkTGVhdmVFbGVtZW50cz1bXTtvblJlbW92YWxDb21wbGV0ZT0obixlKT0+e307X29uUmVtb3ZhbENvbXBsZXRlKG4sZSl7dGhpcy5vblJlbW92YWxDb21wbGV0ZShuLGUpfWNvbnN0cnVjdG9yKG4sZSxpKXt0aGlzLmJvZHlOb2RlPW4sdGhpcy5kcml2ZXI9ZSx0aGlzLl9ub3JtYWxpemVyPWl9Z2V0IHF1ZXVlZFBsYXllcnMoKXtsZXQgbj1bXTtyZXR1cm4gdGhpcy5fbmFtZXNwYWNlTGlzdC5mb3JFYWNoKGU9PntlLnBsYXllcnMuZm9yRWFjaChpPT57aS5xdWV1ZWQmJm4ucHVzaChpKX0pfSksbn1jcmVhdGVOYW1lc3BhY2UobixlKXtsZXQgaT1uZXcgJDUobixlLHRoaXMpO3JldHVybiB0aGlzLmJvZHlOb2RlJiZ0aGlzLmRyaXZlci5jb250YWluc0VsZW1lbnQodGhpcy5ib2R5Tm9kZSxlKT90aGlzLl9iYWxhbmNlTmFtZXNwYWNlTGlzdChpLGUpOih0aGlzLm5ld0hvc3RFbGVtZW50cy5zZXQoZSxpKSx0aGlzLmNvbGxlY3RFbnRlckVsZW1lbnQoZSkpLHRoaXMuX25hbWVzcGFjZUxvb2t1cFtuXT1pfV9iYWxhbmNlTmFtZXNwYWNlTGlzdChuLGUpe2xldCBpPXRoaXMuX25hbWVzcGFjZUxpc3QsYT10aGlzLm5hbWVzcGFjZXNCeUhvc3RFbGVtZW50O2lmKGkubGVuZ3RoLTE+PTApe2xldCBvPSExLGQ9dGhpcy5kcml2ZXIuZ2V0UGFyZW50RWxlbWVudChlKTtmb3IoO2Q7KXtsZXQgcD1hLmdldChkKTtpZihwKXtsZXQgZz1pLmluZGV4T2YocCk7aS5zcGxpY2UoZysxLDAsbiksbz0hMDticmVha31kPXRoaXMuZHJpdmVyLmdldFBhcmVudEVsZW1lbnQoZCl9b3x8aS51bnNoaWZ0KG4pfWVsc2UgaS5wdXNoKG4pO3JldHVybiBhLnNldChlLG4pLG59cmVnaXN0ZXIobixlKXtsZXQgaT10aGlzLl9uYW1lc3BhY2VMb29rdXBbbl07cmV0dXJuIGl8fChpPXRoaXMuY3JlYXRlTmFtZXNwYWNlKG4sZSkpLGl9cmVnaXN0ZXJUcmlnZ2VyKG4sZSxpKXtsZXQgYT10aGlzLl9uYW1lc3BhY2VMb29rdXBbbl07YSYmYS5yZWdpc3RlcihlLGkpJiZ0aGlzLnRvdGFsQW5pbWF0aW9ucysrfWRlc3Ryb3kobixlKXtuJiYodGhpcy5hZnRlckZsdXNoKCgpPT57fSksdGhpcy5hZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUoKCk9PntsZXQgaT10aGlzLl9mZXRjaE5hbWVzcGFjZShuKTt0aGlzLm5hbWVzcGFjZXNCeUhvc3RFbGVtZW50LmRlbGV0ZShpLmhvc3RFbGVtZW50KTtsZXQgYT10aGlzLl9uYW1lc3BhY2VMaXN0LmluZGV4T2YoaSk7YT49MCYmdGhpcy5fbmFtZXNwYWNlTGlzdC5zcGxpY2UoYSwxKSxpLmRlc3Ryb3koZSksZGVsZXRlIHRoaXMuX25hbWVzcGFjZUxvb2t1cFtuXX0pKX1fZmV0Y2hOYW1lc3BhY2Uobil7cmV0dXJuIHRoaXMuX25hbWVzcGFjZUxvb2t1cFtuXX1mZXRjaE5hbWVzcGFjZXNCeUVsZW1lbnQobil7bGV0IGU9bmV3IFNldCxpPXRoaXMuc3RhdGVzQnlFbGVtZW50LmdldChuKTtpZihpKXtmb3IobGV0IGEgb2YgaS52YWx1ZXMoKSlpZihhLm5hbWVzcGFjZUlkKXtsZXQgcj10aGlzLl9mZXRjaE5hbWVzcGFjZShhLm5hbWVzcGFjZUlkKTtyJiZlLmFkZChyKX19cmV0dXJuIGV9dHJpZ2dlcihuLGUsaSxhKXtpZihSYyhlKSl7bGV0IHI9dGhpcy5fZmV0Y2hOYW1lc3BhY2Uobik7aWYocilyZXR1cm4gci50cmlnZ2VyKGUsaSxhKSwhMH1yZXR1cm4hMX1pbnNlcnROb2RlKG4sZSxpLGEpe2lmKCFSYyhlKSlyZXR1cm47bGV0IHI9ZVtGMl07aWYociYmci5zZXRGb3JSZW1vdmFsKXtyLnNldEZvclJlbW92YWw9ITEsci5zZXRGb3JNb3ZlPSEwO2xldCBvPXRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5pbmRleE9mKGUpO28+PTAmJnRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5zcGxpY2UobywxKX1pZihuKXtsZXQgbz10aGlzLl9mZXRjaE5hbWVzcGFjZShuKTtvJiZvLmluc2VydE5vZGUoZSxpKX1hJiZ0aGlzLmNvbGxlY3RFbnRlckVsZW1lbnQoZSl9Y29sbGVjdEVudGVyRWxlbWVudChuKXt0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMucHVzaChuKX1tYXJrRWxlbWVudEFzRGlzYWJsZWQobixlKXtlP3RoaXMuZGlzYWJsZWROb2Rlcy5oYXMobil8fCh0aGlzLmRpc2FibGVkTm9kZXMuYWRkKG4pLFMyKG4sUjUpKTp0aGlzLmRpc2FibGVkTm9kZXMuaGFzKG4pJiYodGhpcy5kaXNhYmxlZE5vZGVzLmRlbGV0ZShuKSxmbyhuLFI1KSl9cmVtb3ZlTm9kZShuLGUsaSl7aWYoUmMoZSkpe2xldCBhPW4/dGhpcy5fZmV0Y2hOYW1lc3BhY2Uobik6bnVsbDthP2EucmVtb3ZlTm9kZShlLGkpOnRoaXMubWFya0VsZW1lbnRBc1JlbW92ZWQobixlLCExLGkpO2xldCByPXRoaXMubmFtZXNwYWNlc0J5SG9zdEVsZW1lbnQuZ2V0KGUpO3ImJnIuaWQhPT1uJiZyLnJlbW92ZU5vZGUoZSxpKX1lbHNlIHRoaXMuX29uUmVtb3ZhbENvbXBsZXRlKGUsaSl9bWFya0VsZW1lbnRBc1JlbW92ZWQobixlLGksYSxyKXt0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMucHVzaChlKSxlW0YyXT17bmFtZXNwYWNlSWQ6bixzZXRGb3JSZW1vdmFsOmEsaGFzQW5pbWF0aW9uOmkscmVtb3ZlZEJlZm9yZVF1ZXJpZWQ6ITEscHJldmlvdXNUcmlnZ2Vyc1ZhbHVlczpyfX1saXN0ZW4obixlLGksYSxyKXtyZXR1cm4gUmMoZSk/dGhpcy5fZmV0Y2hOYW1lc3BhY2UobikubGlzdGVuKGUsaSxhLHIpOigpPT57fX1fYnVpbGRJbnN0cnVjdGlvbihuLGUsaSxhLHIpe3JldHVybiBuLnRyYW5zaXRpb24uYnVpbGQodGhpcy5kcml2ZXIsbi5lbGVtZW50LG4uZnJvbVN0YXRlLnZhbHVlLG4udG9TdGF0ZS52YWx1ZSxpLGEsbi5mcm9tU3RhdGUub3B0aW9ucyxuLnRvU3RhdGUub3B0aW9ucyxlLHIpfWRlc3Ryb3lJbm5lckFuaW1hdGlvbnMobil7bGV0IGU9dGhpcy5kcml2ZXIucXVlcnkobixPNCwhMCk7ZS5mb3JFYWNoKGk9PnRoaXMuZGVzdHJveUFjdGl2ZUFuaW1hdGlvbnNGb3JFbGVtZW50KGkpKSx0aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LnNpemUhPTAmJihlPXRoaXMuZHJpdmVyLnF1ZXJ5KG4sUGMsITApLGUuZm9yRWFjaChpPT50aGlzLmZpbmlzaEFjdGl2ZVF1ZXJpZWRBbmltYXRpb25PbkVsZW1lbnQoaSkpKX1kZXN0cm95QWN0aXZlQW5pbWF0aW9uc0ZvckVsZW1lbnQobil7bGV0IGU9dGhpcy5wbGF5ZXJzQnlFbGVtZW50LmdldChuKTtlJiZlLmZvckVhY2goaT0+e2kucXVldWVkP2kubWFya2VkRm9yRGVzdHJveT0hMDppLmRlc3Ryb3koKX0pfWZpbmlzaEFjdGl2ZVF1ZXJpZWRBbmltYXRpb25PbkVsZW1lbnQobil7bGV0IGU9dGhpcy5wbGF5ZXJzQnlRdWVyaWVkRWxlbWVudC5nZXQobik7ZSYmZS5mb3JFYWNoKGk9PmkuZmluaXNoKCkpfXdoZW5SZW5kZXJpbmdEb25lKCl7cmV0dXJuIG5ldyBQcm9taXNlKG49PntpZih0aGlzLnBsYXllcnMubGVuZ3RoKXJldHVybiBBYSh0aGlzLnBsYXllcnMpLm9uRG9uZSgoKT0+bigpKTtuKCl9KX1wcm9jZXNzTGVhdmVOb2RlKG4pe2xldCBlPW5bRjJdO2lmKGUmJmUuc2V0Rm9yUmVtb3ZhbCl7aWYobltGMl09UXYsZS5uYW1lc3BhY2VJZCl7dGhpcy5kZXN0cm95SW5uZXJBbmltYXRpb25zKG4pO2xldCBpPXRoaXMuX2ZldGNoTmFtZXNwYWNlKGUubmFtZXNwYWNlSWQpO2kmJmkuY2xlYXJFbGVtZW50Q2FjaGUobil9dGhpcy5fb25SZW1vdmFsQ29tcGxldGUobixlLnNldEZvclJlbW92YWwpfW4uY2xhc3NMaXN0Py5jb250YWlucyhSNSkmJnRoaXMubWFya0VsZW1lbnRBc0Rpc2FibGVkKG4sITEpLHRoaXMuZHJpdmVyLnF1ZXJ5KG4sTE8sITApLmZvckVhY2goaT0+e3RoaXMubWFya0VsZW1lbnRBc0Rpc2FibGVkKGksITEpfSl9Zmx1c2gobj0tMSl7bGV0IGU9W107aWYodGhpcy5uZXdIb3N0RWxlbWVudHMuc2l6ZSYmKHRoaXMubmV3SG9zdEVsZW1lbnRzLmZvckVhY2goKGksYSk9PnRoaXMuX2JhbGFuY2VOYW1lc3BhY2VMaXN0KGksYSkpLHRoaXMubmV3SG9zdEVsZW1lbnRzLmNsZWFyKCkpLHRoaXMudG90YWxBbmltYXRpb25zJiZ0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMubGVuZ3RoKWZvcihsZXQgaT0wO2k8dGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzLmxlbmd0aDtpKyspe2xldCBhPXRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50c1tpXTtTMihhLFBPKX1pZih0aGlzLl9uYW1lc3BhY2VMaXN0Lmxlbmd0aCYmKHRoaXMudG90YWxRdWV1ZWRQbGF5ZXJzfHx0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMubGVuZ3RoKSl7bGV0IGk9W107dHJ5e2U9dGhpcy5fZmx1c2hBbmltYXRpb25zKGksbil9ZmluYWxseXtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErKylpW2FdKCl9fWVsc2UgZm9yKGxldCBpPTA7aTx0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMubGVuZ3RoO2krKyl7bGV0IGE9dGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzW2ldO3RoaXMucHJvY2Vzc0xlYXZlTm9kZShhKX1pZih0aGlzLnRvdGFsUXVldWVkUGxheWVycz0wLHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cy5sZW5ndGg9MCx0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMubGVuZ3RoPTAsdGhpcy5fZmx1c2hGbnMuZm9yRWFjaChpPT5pKCkpLHRoaXMuX2ZsdXNoRm5zPVtdLHRoaXMuX3doZW5RdWlldEZucy5sZW5ndGgpe2xldCBpPXRoaXMuX3doZW5RdWlldEZuczt0aGlzLl93aGVuUXVpZXRGbnM9W10sZS5sZW5ndGg/QWEoZSkub25Eb25lKCgpPT57aS5mb3JFYWNoKGE9PmEoKSl9KTppLmZvckVhY2goYT0+YSgpKX19cmVwb3J0RXJyb3Iobil7dGhyb3cgU3Yobil9X2ZsdXNoQW5pbWF0aW9ucyhuLGUpe2xldCBpPW5ldyBSNCxhPVtdLHI9bmV3IE1hcCxvPVtdLGQ9bmV3IE1hcCxwPW5ldyBNYXAsZz1uZXcgTWFwLF89bmV3IFNldDt0aGlzLmRpc2FibGVkTm9kZXMuZm9yRWFjaChEZT0+e18uYWRkKERlKTtsZXQgamU9dGhpcy5kcml2ZXIucXVlcnkoRGUsSU8sITApO2ZvcihsZXQgS2U9MDtLZTxqZS5sZW5ndGg7S2UrKylfLmFkZChqZVtLZV0pfSk7bGV0IHk9dGhpcy5ib2R5Tm9kZSxJPUFycmF5LmZyb20odGhpcy5zdGF0ZXNCeUVsZW1lbnQua2V5cygpKSxQPUJ2KEksdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzKSxWPW5ldyBNYXAsTz0wO1AuZm9yRWFjaCgoRGUsamUpPT57bGV0IEtlPVA1K08rKztWLnNldChqZSxLZSksRGUuZm9yRWFjaChCdD0+UzIoQnQsS2UpKX0pO2xldCBVPVtdLFE9bmV3IFNldCxmZT1uZXcgU2V0O2ZvcihsZXQgRGU9MDtEZTx0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMubGVuZ3RoO0RlKyspe2xldCBqZT10aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHNbRGVdLEtlPWplW0YyXTtLZSYmS2Uuc2V0Rm9yUmVtb3ZhbCYmKFUucHVzaChqZSksUS5hZGQoamUpLEtlLmhhc0FuaW1hdGlvbj90aGlzLmRyaXZlci5xdWVyeShqZSxWTywhMCkuZm9yRWFjaChCdD0+US5hZGQoQnQpKTpmZS5hZGQoamUpKX1sZXQgT2U9bmV3IE1hcCxNZT1CdihJLEFycmF5LmZyb20oUSkpO01lLmZvckVhY2goKERlLGplKT0+e2xldCBLZT1MYytPKys7T2Uuc2V0KGplLEtlKSxEZS5mb3JFYWNoKEJ0PT5TMihCdCxLZSkpfSksbi5wdXNoKCgpPT57UC5mb3JFYWNoKChEZSxqZSk9PntsZXQgS2U9Vi5nZXQoamUpO0RlLmZvckVhY2goQnQ9PmZvKEJ0LEtlKSl9KSxNZS5mb3JFYWNoKChEZSxqZSk9PntsZXQgS2U9T2UuZ2V0KGplKTtEZS5mb3JFYWNoKEJ0PT5mbyhCdCxLZSkpfSksVS5mb3JFYWNoKERlPT57dGhpcy5wcm9jZXNzTGVhdmVOb2RlKERlKX0pfSk7bGV0IHJ0PVtdLE5lPVtdO2ZvcihsZXQgRGU9dGhpcy5fbmFtZXNwYWNlTGlzdC5sZW5ndGgtMTtEZT49MDtEZS0tKXRoaXMuX25hbWVzcGFjZUxpc3RbRGVdLmRyYWluUXVldWVkVHJhbnNpdGlvbnMoZSkuZm9yRWFjaChLZT0+e2xldCBCdD1LZS5wbGF5ZXIsWTE9S2UuZWxlbWVudDtpZihydC5wdXNoKEJ0KSx0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMubGVuZ3RoKXtsZXQgQ2k9WTFbRjJdO2lmKENpJiZDaS5zZXRGb3JNb3ZlKXtpZihDaS5wcmV2aW91c1RyaWdnZXJzVmFsdWVzJiZDaS5wcmV2aW91c1RyaWdnZXJzVmFsdWVzLmhhcyhLZS50cmlnZ2VyTmFtZSkpe2xldCBTbj1DaS5wcmV2aW91c1RyaWdnZXJzVmFsdWVzLmdldChLZS50cmlnZ2VyTmFtZSksbDI9dGhpcy5zdGF0ZXNCeUVsZW1lbnQuZ2V0KEtlLmVsZW1lbnQpO2lmKGwyJiZsMi5oYXMoS2UudHJpZ2dlck5hbWUpKXtsZXQgaDA9bDIuZ2V0KEtlLnRyaWdnZXJOYW1lKTtoMC52YWx1ZT1TbixsMi5zZXQoS2UudHJpZ2dlck5hbWUsaDApfX1CdC5kZXN0cm95KCk7cmV0dXJufX1sZXQgRzI9IXl8fCF0aGlzLmRyaXZlci5jb250YWluc0VsZW1lbnQoeSxZMSksWWk9T2UuZ2V0KFkxKSxPYT1WLmdldChZMSksdzE9dGhpcy5fYnVpbGRJbnN0cnVjdGlvbihLZSxpLE9hLFlpLEcyKTtpZih3MS5lcnJvcnMmJncxLmVycm9ycy5sZW5ndGgpe05lLnB1c2godzEpO3JldHVybn1pZihHMil7QnQub25TdGFydCgoKT0+Y24oWTEsdzEuZnJvbVN0eWxlcykpLEJ0Lm9uRGVzdHJveSgoKT0+UjIoWTEsdzEudG9TdHlsZXMpKSxhLnB1c2goQnQpO3JldHVybn1pZihLZS5pc0ZhbGxiYWNrVHJhbnNpdGlvbil7QnQub25TdGFydCgoKT0+Y24oWTEsdzEuZnJvbVN0eWxlcykpLEJ0Lm9uRGVzdHJveSgoKT0+UjIoWTEsdzEudG9TdHlsZXMpKSxhLnB1c2goQnQpO3JldHVybn1sZXQgTWQ9W107dzEudGltZWxpbmVzLmZvckVhY2goQ2k9PntDaS5zdHJldGNoU3RhcnRpbmdLZXlmcmFtZT0hMCx0aGlzLmRpc2FibGVkTm9kZXMuaGFzKENpLmVsZW1lbnQpfHxNZC5wdXNoKENpKX0pLHcxLnRpbWVsaW5lcz1NZCxpLmFwcGVuZChZMSx3MS50aW1lbGluZXMpO2xldCBTUz17aW5zdHJ1Y3Rpb246dzEscGxheWVyOkJ0LGVsZW1lbnQ6WTF9O28ucHVzaChTUyksdzEucXVlcmllZEVsZW1lbnRzLmZvckVhY2goQ2k9PkdpKGQsQ2ksW10pLnB1c2goQnQpKSx3MS5wcmVTdHlsZVByb3BzLmZvckVhY2goKENpLFNuKT0+e2lmKENpLnNpemUpe2xldCBsMj1wLmdldChTbik7bDJ8fHAuc2V0KFNuLGwyPW5ldyBTZXQpLENpLmZvckVhY2goKGgwLHA2KT0+bDIuYWRkKHA2KSl9fSksdzEucG9zdFN0eWxlUHJvcHMuZm9yRWFjaCgoQ2ksU24pPT57bGV0IGwyPWcuZ2V0KFNuKTtsMnx8Zy5zZXQoU24sbDI9bmV3IFNldCksQ2kuZm9yRWFjaCgoaDAscDYpPT5sMi5hZGQocDYpKX0pfSk7aWYoTmUubGVuZ3RoKXtsZXQgRGU9W107TmUuZm9yRWFjaChqZT0+e0RlLnB1c2goa3YoamUudHJpZ2dlck5hbWUsamUuZXJyb3JzKSl9KSxydC5mb3JFYWNoKGplPT5qZS5kZXN0cm95KCkpLHRoaXMucmVwb3J0RXJyb3IoRGUpfWxldCBZZT1uZXcgTWFwLHZ0PW5ldyBNYXA7by5mb3JFYWNoKERlPT57bGV0IGplPURlLmVsZW1lbnQ7aS5oYXMoamUpJiYodnQuc2V0KGplLGplKSx0aGlzLl9iZWZvcmVBbmltYXRpb25CdWlsZChEZS5wbGF5ZXIubmFtZXNwYWNlSWQsRGUuaW5zdHJ1Y3Rpb24sWWUpKX0pLGEuZm9yRWFjaChEZT0+e2xldCBqZT1EZS5lbGVtZW50O3RoaXMuX2dldFByZXZpb3VzUGxheWVycyhqZSwhMSxEZS5uYW1lc3BhY2VJZCxEZS50cmlnZ2VyTmFtZSxudWxsKS5mb3JFYWNoKEJ0PT57R2koWWUsamUsW10pLnB1c2goQnQpLEJ0LmRlc3Ryb3koKX0pfSk7bGV0IE0xPVUuZmlsdGVyKERlPT5VdihEZSxwLGcpKSxUMj1uZXcgTWFwO0Z2KFQyLHRoaXMuZHJpdmVyLGZlLGcseTIpLmZvckVhY2goRGU9PntVdihEZSxwLGcpJiZNMS5wdXNoKERlKX0pO2xldCB3bj1uZXcgTWFwO1AuZm9yRWFjaCgoRGUsamUpPT57RnYod24sdGhpcy5kcml2ZXIsbmV3IFNldChEZSkscCxlbyl9KSxNMS5mb3JFYWNoKERlPT57bGV0IGplPVQyLmdldChEZSksS2U9d24uZ2V0KERlKTtUMi5zZXQoRGUsbmV3IE1hcChbLi4uamU/LmVudHJpZXMoKT8/W10sLi4uS2U/LmVudHJpZXMoKT8/W11dKSl9KTtsZXQgaDY9W10seWQ9W10seGQ9e307by5mb3JFYWNoKERlPT57bGV0e2VsZW1lbnQ6amUscGxheWVyOktlLGluc3RydWN0aW9uOkJ0fT1EZTtpZihpLmhhcyhqZSkpe2lmKF8uaGFzKGplKSl7S2Uub25EZXN0cm95KCgpPT5SMihqZSxCdC50b1N0eWxlcykpLEtlLmRpc2FibGVkPSEwLEtlLm92ZXJyaWRlVG90YWxUaW1lKEJ0LnRvdGFsVGltZSksYS5wdXNoKEtlKTtyZXR1cm59bGV0IFkxPXhkO2lmKHZ0LnNpemU+MSl7bGV0IFlpPWplLE9hPVtdO2Zvcig7WWk9WWkucGFyZW50Tm9kZTspe2xldCB3MT12dC5nZXQoWWkpO2lmKHcxKXtZMT13MTticmVha31PYS5wdXNoKFlpKX1PYS5mb3JFYWNoKHcxPT52dC5zZXQodzEsWTEpKX1sZXQgRzI9dGhpcy5fYnVpbGRBbmltYXRpb24oS2UubmFtZXNwYWNlSWQsQnQsWWUscix3bixUMik7aWYoS2Uuc2V0UmVhbFBsYXllcihHMiksWTE9PT14ZCloNi5wdXNoKEtlKTtlbHNle2xldCBZaT10aGlzLnBsYXllcnNCeUVsZW1lbnQuZ2V0KFkxKTtZaSYmWWkubGVuZ3RoJiYoS2UucGFyZW50UGxheWVyPUFhKFlpKSksYS5wdXNoKEtlKX19ZWxzZSBjbihqZSxCdC5mcm9tU3R5bGVzKSxLZS5vbkRlc3Ryb3koKCk9PlIyKGplLEJ0LnRvU3R5bGVzKSkseWQucHVzaChLZSksXy5oYXMoamUpJiZhLnB1c2goS2UpfSkseWQuZm9yRWFjaChEZT0+e2xldCBqZT1yLmdldChEZS5lbGVtZW50KTtpZihqZSYmamUubGVuZ3RoKXtsZXQgS2U9QWEoamUpO0RlLnNldFJlYWxQbGF5ZXIoS2UpfX0pLGEuZm9yRWFjaChEZT0+e0RlLnBhcmVudFBsYXllcj9EZS5zeW5jUGxheWVyRXZlbnRzKERlLnBhcmVudFBsYXllcik6RGUuZGVzdHJveSgpfSk7Zm9yKGxldCBEZT0wO0RlPFUubGVuZ3RoO0RlKyspe2xldCBqZT1VW0RlXSxLZT1qZVtGMl07aWYoZm8oamUsTGMpLEtlJiZLZS5oYXNBbmltYXRpb24pY29udGludWU7bGV0IEJ0PVtdO2lmKGQuc2l6ZSl7bGV0IEcyPWQuZ2V0KGplKTtHMiYmRzIubGVuZ3RoJiZCdC5wdXNoKC4uLkcyKTtsZXQgWWk9dGhpcy5kcml2ZXIucXVlcnkoamUsUGMsITApO2ZvcihsZXQgT2E9MDtPYTxZaS5sZW5ndGg7T2ErKyl7bGV0IHcxPWQuZ2V0KFlpW09hXSk7dzEmJncxLmxlbmd0aCYmQnQucHVzaCguLi53MSl9fWxldCBZMT1CdC5maWx0ZXIoRzI9PiFHMi5kZXN0cm95ZWQpO1kxLmxlbmd0aD9CTyh0aGlzLGplLFkxKTp0aGlzLnByb2Nlc3NMZWF2ZU5vZGUoamUpfXJldHVybiBVLmxlbmd0aD0wLGg2LmZvckVhY2goRGU9Pnt0aGlzLnBsYXllcnMucHVzaChEZSksRGUub25Eb25lKCgpPT57RGUuZGVzdHJveSgpO2xldCBqZT10aGlzLnBsYXllcnMuaW5kZXhPZihEZSk7dGhpcy5wbGF5ZXJzLnNwbGljZShqZSwxKX0pLERlLnBsYXkoKX0pLGg2fWFmdGVyRmx1c2gobil7dGhpcy5fZmx1c2hGbnMucHVzaChuKX1hZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUobil7dGhpcy5fd2hlblF1aWV0Rm5zLnB1c2gobil9X2dldFByZXZpb3VzUGxheWVycyhuLGUsaSxhLHIpe2xldCBvPVtdO2lmKGUpe2xldCBkPXRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQuZ2V0KG4pO2QmJihvPWQpfWVsc2V7bGV0IGQ9dGhpcy5wbGF5ZXJzQnlFbGVtZW50LmdldChuKTtpZihkKXtsZXQgcD0hcnx8cj09TjQ7ZC5mb3JFYWNoKGc9PntnLnF1ZXVlZHx8IXAmJmcudHJpZ2dlck5hbWUhPWF8fG8ucHVzaChnKX0pfX1yZXR1cm4oaXx8YSkmJihvPW8uZmlsdGVyKGQ9PiEoaSYmaSE9ZC5uYW1lc3BhY2VJZHx8YSYmYSE9ZC50cmlnZ2VyTmFtZSkpKSxvfV9iZWZvcmVBbmltYXRpb25CdWlsZChuLGUsaSl7bGV0IGE9ZS50cmlnZ2VyTmFtZSxyPWUuZWxlbWVudCxvPWUuaXNSZW1vdmFsVHJhbnNpdGlvbj92b2lkIDA6bixkPWUuaXNSZW1vdmFsVHJhbnNpdGlvbj92b2lkIDA6YTtmb3IobGV0IHAgb2YgZS50aW1lbGluZXMpe2xldCBnPXAuZWxlbWVudCxfPWchPT1yLHk9R2koaSxnLFtdKTt0aGlzLl9nZXRQcmV2aW91c1BsYXllcnMoZyxfLG8sZCxlLnRvU3RhdGUpLmZvckVhY2goUD0+e2xldCBWPVAuZ2V0UmVhbFBsYXllcigpO1YuYmVmb3JlRGVzdHJveSYmVi5iZWZvcmVEZXN0cm95KCksUC5kZXN0cm95KCkseS5wdXNoKFApfSl9Y24ocixlLmZyb21TdHlsZXMpfV9idWlsZEFuaW1hdGlvbihuLGUsaSxhLHIsbyl7bGV0IGQ9ZS50cmlnZ2VyTmFtZSxwPWUuZWxlbWVudCxnPVtdLF89bmV3IFNldCx5PW5ldyBTZXQsST1lLnRpbWVsaW5lcy5tYXAoVj0+e2xldCBPPVYuZWxlbWVudDtfLmFkZChPKTtsZXQgVT1PW0YyXTtpZihVJiZVLnJlbW92ZWRCZWZvcmVRdWVyaWVkKXJldHVybiBuZXcgY2EoVi5kdXJhdGlvbixWLmRlbGF5KTtsZXQgUT1PIT09cCxmZT1VTygoaS5nZXQoTyl8fE9PKS5tYXAoWWU9PlllLmdldFJlYWxQbGF5ZXIoKSkpLmZpbHRlcihZZT0+e2xldCB2dD1ZZTtyZXR1cm4gdnQuZWxlbWVudD92dC5lbGVtZW50PT09TzohMX0pLE9lPXIuZ2V0KE8pLE1lPW8uZ2V0KE8pLHJ0PUU1KHRoaXMuX25vcm1hbGl6ZXIsVi5rZXlmcmFtZXMsT2UsTWUpLE5lPXRoaXMuX2J1aWxkUGxheWVyKFYscnQsZmUpO2lmKFYuc3ViVGltZWxpbmUmJmEmJnkuYWRkKE8pLFEpe2xldCBZZT1uZXcgQjQobixkLE8pO1llLnNldFJlYWxQbGF5ZXIoTmUpLGcucHVzaChZZSl9cmV0dXJuIE5lfSk7Zy5mb3JFYWNoKFY9PntHaSh0aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LFYuZWxlbWVudCxbXSkucHVzaChWKSxWLm9uRG9uZSgoKT0+Tk8odGhpcy5wbGF5ZXJzQnlRdWVyaWVkRWxlbWVudCxWLmVsZW1lbnQsVikpfSksXy5mb3JFYWNoKFY9PlMyKFYsVjUpKTtsZXQgUD1BYShJKTtyZXR1cm4gUC5vbkRlc3Ryb3koKCk9PntfLmZvckVhY2goVj0+Zm8oVixWNSkpLFIyKHAsZS50b1N0eWxlcyl9KSx5LmZvckVhY2goVj0+e0dpKGEsVixbXSkucHVzaChQKX0pLFB9X2J1aWxkUGxheWVyKG4sZSxpKXtyZXR1cm4gZS5sZW5ndGg+MD90aGlzLmRyaXZlci5hbmltYXRlKG4uZWxlbWVudCxlLG4uZHVyYXRpb24sbi5kZWxheSxuLmVhc2luZyxpKTpuZXcgY2Eobi5kdXJhdGlvbixuLmRlbGF5KX19LEI0PWNsYXNze25hbWVzcGFjZUlkO3RyaWdnZXJOYW1lO2VsZW1lbnQ7X3BsYXllcj1uZXcgY2E7X2NvbnRhaW5zUmVhbFBsYXllcj0hMTtfcXVldWVkQ2FsbGJhY2tzPW5ldyBNYXA7ZGVzdHJveWVkPSExO3BhcmVudFBsYXllcj1udWxsO21hcmtlZEZvckRlc3Ryb3k9ITE7ZGlzYWJsZWQ9ITE7cXVldWVkPSEwO3RvdGFsVGltZT0wO2NvbnN0cnVjdG9yKG4sZSxpKXt0aGlzLm5hbWVzcGFjZUlkPW4sdGhpcy50cmlnZ2VyTmFtZT1lLHRoaXMuZWxlbWVudD1pfXNldFJlYWxQbGF5ZXIobil7dGhpcy5fY29udGFpbnNSZWFsUGxheWVyfHwodGhpcy5fcGxheWVyPW4sdGhpcy5fcXVldWVkQ2FsbGJhY2tzLmZvckVhY2goKGUsaSk9PntlLmZvckVhY2goYT0+QWMobixpLHZvaWQgMCxhKSl9KSx0aGlzLl9xdWV1ZWRDYWxsYmFja3MuY2xlYXIoKSx0aGlzLl9jb250YWluc1JlYWxQbGF5ZXI9ITAsdGhpcy5vdmVycmlkZVRvdGFsVGltZShuLnRvdGFsVGltZSksdGhpcy5xdWV1ZWQ9ITEpfWdldFJlYWxQbGF5ZXIoKXtyZXR1cm4gdGhpcy5fcGxheWVyfW92ZXJyaWRlVG90YWxUaW1lKG4pe3RoaXMudG90YWxUaW1lPW59c3luY1BsYXllckV2ZW50cyhuKXtsZXQgZT10aGlzLl9wbGF5ZXI7ZS50cmlnZ2VyQ2FsbGJhY2smJm4ub25TdGFydCgoKT0+ZS50cmlnZ2VyQ2FsbGJhY2soInN0YXJ0IikpLG4ub25Eb25lKCgpPT50aGlzLmZpbmlzaCgpKSxuLm9uRGVzdHJveSgoKT0+dGhpcy5kZXN0cm95KCkpfV9xdWV1ZUV2ZW50KG4sZSl7R2kodGhpcy5fcXVldWVkQ2FsbGJhY2tzLG4sW10pLnB1c2goZSl9b25Eb25lKG4pe3RoaXMucXVldWVkJiZ0aGlzLl9xdWV1ZUV2ZW50KCJkb25lIixuKSx0aGlzLl9wbGF5ZXIub25Eb25lKG4pfW9uU3RhcnQobil7dGhpcy5xdWV1ZWQmJnRoaXMuX3F1ZXVlRXZlbnQoInN0YXJ0IixuKSx0aGlzLl9wbGF5ZXIub25TdGFydChuKX1vbkRlc3Ryb3kobil7dGhpcy5xdWV1ZWQmJnRoaXMuX3F1ZXVlRXZlbnQoImRlc3Ryb3kiLG4pLHRoaXMuX3BsYXllci5vbkRlc3Ryb3kobil9aW5pdCgpe3RoaXMuX3BsYXllci5pbml0KCl9aGFzU3RhcnRlZCgpe3JldHVybiB0aGlzLnF1ZXVlZD8hMTp0aGlzLl9wbGF5ZXIuaGFzU3RhcnRlZCgpfXBsYXkoKXshdGhpcy5xdWV1ZWQmJnRoaXMuX3BsYXllci5wbGF5KCl9cGF1c2UoKXshdGhpcy5xdWV1ZWQmJnRoaXMuX3BsYXllci5wYXVzZSgpfXJlc3RhcnQoKXshdGhpcy5xdWV1ZWQmJnRoaXMuX3BsYXllci5yZXN0YXJ0KCl9ZmluaXNoKCl7dGhpcy5fcGxheWVyLmZpbmlzaCgpfWRlc3Ryb3koKXt0aGlzLmRlc3Ryb3llZD0hMCx0aGlzLl9wbGF5ZXIuZGVzdHJveSgpfXJlc2V0KCl7IXRoaXMucXVldWVkJiZ0aGlzLl9wbGF5ZXIucmVzZXQoKX1zZXRQb3NpdGlvbihuKXt0aGlzLnF1ZXVlZHx8dGhpcy5fcGxheWVyLnNldFBvc2l0aW9uKG4pfWdldFBvc2l0aW9uKCl7cmV0dXJuIHRoaXMucXVldWVkPzA6dGhpcy5fcGxheWVyLmdldFBvc2l0aW9uKCl9dHJpZ2dlckNhbGxiYWNrKG4pe2xldCBlPXRoaXMuX3BsYXllcjtlLnRyaWdnZXJDYWxsYmFjayYmZS50cmlnZ2VyQ2FsbGJhY2sobil9fTt1bz1jbGFzc3tfZHJpdmVyO19ub3JtYWxpemVyO190cmFuc2l0aW9uRW5naW5lO190aW1lbGluZUVuZ2luZTtfdHJpZ2dlckNhY2hlPXt9O29uUmVtb3ZhbENvbXBsZXRlPShuLGUpPT57fTtjb25zdHJ1Y3RvcihuLGUsaSl7dGhpcy5fZHJpdmVyPWUsdGhpcy5fbm9ybWFsaXplcj1pLHRoaXMuX3RyYW5zaXRpb25FbmdpbmU9bmV3IEs1KG4uYm9keSxlLGkpLHRoaXMuX3RpbWVsaW5lRW5naW5lPW5ldyBaNShuLmJvZHksZSxpKSx0aGlzLl90cmFuc2l0aW9uRW5naW5lLm9uUmVtb3ZhbENvbXBsZXRlPShhLHIpPT50aGlzLm9uUmVtb3ZhbENvbXBsZXRlKGEscil9cmVnaXN0ZXJUcmlnZ2VyKG4sZSxpLGEscil7bGV0IG89bisiLSIrYSxkPXRoaXMuX3RyaWdnZXJDYWNoZVtvXTtpZighZCl7bGV0IHA9W10sZz1bXSxfPXF2KHRoaXMuX2RyaXZlcixyLHAsZyk7aWYocC5sZW5ndGgpdGhyb3cgZ3YoYSxwKTtkPUVPKGEsXyx0aGlzLl9ub3JtYWxpemVyKSx0aGlzLl90cmlnZ2VyQ2FjaGVbb109ZH10aGlzLl90cmFuc2l0aW9uRW5naW5lLnJlZ2lzdGVyVHJpZ2dlcihlLGEsZCl9cmVnaXN0ZXIobixlKXt0aGlzLl90cmFuc2l0aW9uRW5naW5lLnJlZ2lzdGVyKG4sZSl9ZGVzdHJveShuLGUpe3RoaXMuX3RyYW5zaXRpb25FbmdpbmUuZGVzdHJveShuLGUpfW9uSW5zZXJ0KG4sZSxpLGEpe3RoaXMuX3RyYW5zaXRpb25FbmdpbmUuaW5zZXJ0Tm9kZShuLGUsaSxhKX1vblJlbW92ZShuLGUsaSl7dGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5yZW1vdmVOb2RlKG4sZSxpKX1kaXNhYmxlQW5pbWF0aW9ucyhuLGUpe3RoaXMuX3RyYW5zaXRpb25FbmdpbmUubWFya0VsZW1lbnRBc0Rpc2FibGVkKG4sZSl9cHJvY2VzcyhuLGUsaSxhKXtpZihpLmNoYXJBdCgwKT09IkAiKXtsZXRbcixvXT1BNShpKSxkPWE7dGhpcy5fdGltZWxpbmVFbmdpbmUuY29tbWFuZChyLGUsbyxkKX1lbHNlIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUudHJpZ2dlcihuLGUsaSxhKX1saXN0ZW4obixlLGksYSxyKXtpZihpLmNoYXJBdCgwKT09IkAiKXtsZXRbbyxkXT1BNShpKTtyZXR1cm4gdGhpcy5fdGltZWxpbmVFbmdpbmUubGlzdGVuKG8sZSxkLHIpfXJldHVybiB0aGlzLl90cmFuc2l0aW9uRW5naW5lLmxpc3RlbihuLGUsaSxhLHIpfWZsdXNoKG49LTEpe3RoaXMuX3RyYW5zaXRpb25FbmdpbmUuZmx1c2gobil9Z2V0IHBsYXllcnMoKXtyZXR1cm5bLi4udGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5wbGF5ZXJzLC4uLnRoaXMuX3RpbWVsaW5lRW5naW5lLnBsYXllcnNdfXdoZW5SZW5kZXJpbmdEb25lKCl7cmV0dXJuIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUud2hlblJlbmRlcmluZ0RvbmUoKX1hZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUobil7dGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5hZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUobil9fTtHTz0oKCk9PntjbGFzcyB0e19lbGVtZW50O19zdGFydFN0eWxlcztfZW5kU3R5bGVzO3N0YXRpYyBpbml0aWFsU3R5bGVzQnlFbGVtZW50PW5ldyBXZWFrTWFwO19zdGF0ZT0wO19pbml0aWFsU3R5bGVzO2NvbnN0cnVjdG9yKGUsaSxhKXt0aGlzLl9lbGVtZW50PWUsdGhpcy5fc3RhcnRTdHlsZXM9aSx0aGlzLl9lbmRTdHlsZXM9YTtsZXQgcj10LmluaXRpYWxTdHlsZXNCeUVsZW1lbnQuZ2V0KGUpO3J8fHQuaW5pdGlhbFN0eWxlc0J5RWxlbWVudC5zZXQoZSxyPW5ldyBNYXApLHRoaXMuX2luaXRpYWxTdHlsZXM9cn1zdGFydCgpe3RoaXMuX3N0YXRlPDEmJih0aGlzLl9zdGFydFN0eWxlcyYmUjIodGhpcy5fZWxlbWVudCx0aGlzLl9zdGFydFN0eWxlcyx0aGlzLl9pbml0aWFsU3R5bGVzKSx0aGlzLl9zdGF0ZT0xKX1maW5pc2goKXt0aGlzLnN0YXJ0KCksdGhpcy5fc3RhdGU8MiYmKFIyKHRoaXMuX2VsZW1lbnQsdGhpcy5faW5pdGlhbFN0eWxlcyksdGhpcy5fZW5kU3R5bGVzJiYoUjIodGhpcy5fZWxlbWVudCx0aGlzLl9lbmRTdHlsZXMpLHRoaXMuX2VuZFN0eWxlcz1udWxsKSx0aGlzLl9zdGF0ZT0xKX1kZXN0cm95KCl7dGhpcy5maW5pc2goKSx0aGlzLl9zdGF0ZTwzJiYodC5pbml0aWFsU3R5bGVzQnlFbGVtZW50LmRlbGV0ZSh0aGlzLl9lbGVtZW50KSx0aGlzLl9zdGFydFN0eWxlcyYmKGNuKHRoaXMuX2VsZW1lbnQsdGhpcy5fc3RhcnRTdHlsZXMpLHRoaXMuX2VuZFN0eWxlcz1udWxsKSx0aGlzLl9lbmRTdHlsZXMmJihjbih0aGlzLl9lbGVtZW50LHRoaXMuX2VuZFN0eWxlcyksdGhpcy5fZW5kU3R5bGVzPW51bGwpLFIyKHRoaXMuX2VsZW1lbnQsdGhpcy5faW5pdGlhbFN0eWxlcyksdGhpcy5fc3RhdGU9Myl9fXJldHVybiB0fSkoKTtXYz1jbGFzc3tlbGVtZW50O2tleWZyYW1lcztvcHRpb25zO19zcGVjaWFsU3R5bGVzO19vbkRvbmVGbnM9W107X29uU3RhcnRGbnM9W107X29uRGVzdHJveUZucz1bXTtfZHVyYXRpb247X2RlbGF5O19pbml0aWFsaXplZD0hMTtfZmluaXNoZWQ9ITE7X3N0YXJ0ZWQ9ITE7X2Rlc3Ryb3llZD0hMTtfZmluYWxLZXlmcmFtZTtfb3JpZ2luYWxPbkRvbmVGbnM9W107X29yaWdpbmFsT25TdGFydEZucz1bXTtkb21QbGF5ZXI9bnVsbDt0aW1lPTA7cGFyZW50UGxheWVyPW51bGw7Y3VycmVudFNuYXBzaG90PW5ldyBNYXA7Y29uc3RydWN0b3IobixlLGksYSl7dGhpcy5lbGVtZW50PW4sdGhpcy5rZXlmcmFtZXM9ZSx0aGlzLm9wdGlvbnM9aSx0aGlzLl9zcGVjaWFsU3R5bGVzPWEsdGhpcy5fZHVyYXRpb249aS5kdXJhdGlvbix0aGlzLl9kZWxheT1pLmRlbGF5fHwwLHRoaXMudGltZT10aGlzLl9kdXJhdGlvbit0aGlzLl9kZWxheX1fb25GaW5pc2goKXt0aGlzLl9maW5pc2hlZHx8KHRoaXMuX2ZpbmlzaGVkPSEwLHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKG49Pm4oKSksdGhpcy5fb25Eb25lRm5zPVtdKX1pbml0KCl7dGhpcy5fYnVpbGRQbGF5ZXIoKSYmdGhpcy5fcHJlcGFyZVBsYXllckJlZm9yZVN0YXJ0KCl9X2J1aWxkUGxheWVyKCl7aWYodGhpcy5faW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMuZG9tUGxheWVyO3RoaXMuX2luaXRpYWxpemVkPSEwO2xldCBuPXRoaXMua2V5ZnJhbWVzLGU9dGhpcy5fdHJpZ2dlcldlYkFuaW1hdGlvbih0aGlzLmVsZW1lbnQsbix0aGlzLm9wdGlvbnMpO2lmKCFlKXJldHVybiB0aGlzLl9vbkZpbmlzaCgpLG51bGw7dGhpcy5kb21QbGF5ZXI9ZSx0aGlzLl9maW5hbEtleWZyYW1lPW4ubGVuZ3RoP25bbi5sZW5ndGgtMV06bmV3IE1hcDtsZXQgaT0oKT0+dGhpcy5fb25GaW5pc2goKTtyZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyKCJmaW5pc2giLGkpLHRoaXMub25EZXN0cm95KCgpPT57ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJmaW5pc2giLGkpfSksZX1fcHJlcGFyZVBsYXllckJlZm9yZVN0YXJ0KCl7dGhpcy5fZGVsYXk/dGhpcy5fcmVzZXREb21QbGF5ZXJTdGF0ZSgpOnRoaXMuZG9tUGxheWVyPy5wYXVzZSgpfV9jb252ZXJ0S2V5ZnJhbWVzVG9PYmplY3Qobil7bGV0IGU9W107cmV0dXJuIG4uZm9yRWFjaChpPT57ZS5wdXNoKE9iamVjdC5mcm9tRW50cmllcyhpKSl9KSxlfV90cmlnZ2VyV2ViQW5pbWF0aW9uKG4sZSxpKXtsZXQgYT10aGlzLl9jb252ZXJ0S2V5ZnJhbWVzVG9PYmplY3QoZSk7dHJ5e3JldHVybiBuLmFuaW1hdGUoYSxpKX1jYXRjaHtyZXR1cm4gbnVsbH19b25TdGFydChuKXt0aGlzLl9vcmlnaW5hbE9uU3RhcnRGbnMucHVzaChuKSx0aGlzLl9vblN0YXJ0Rm5zLnB1c2gobil9b25Eb25lKG4pe3RoaXMuX29yaWdpbmFsT25Eb25lRm5zLnB1c2gobiksdGhpcy5fb25Eb25lRm5zLnB1c2gobil9b25EZXN0cm95KG4pe3RoaXMuX29uRGVzdHJveUZucy5wdXNoKG4pfXBsYXkoKXtsZXQgbj10aGlzLl9idWlsZFBsYXllcigpO24mJih0aGlzLmhhc1N0YXJ0ZWQoKXx8KHRoaXMuX29uU3RhcnRGbnMuZm9yRWFjaChlPT5lKCkpLHRoaXMuX29uU3RhcnRGbnM9W10sdGhpcy5fc3RhcnRlZD0hMCx0aGlzLl9zcGVjaWFsU3R5bGVzJiZ0aGlzLl9zcGVjaWFsU3R5bGVzLnN0YXJ0KCkpLG4ucGxheSgpKX1wYXVzZSgpe3RoaXMuaW5pdCgpLHRoaXMuZG9tUGxheWVyPy5wYXVzZSgpfWZpbmlzaCgpe3RoaXMuaW5pdCgpLHRoaXMuZG9tUGxheWVyJiYodGhpcy5fc3BlY2lhbFN0eWxlcyYmdGhpcy5fc3BlY2lhbFN0eWxlcy5maW5pc2goKSx0aGlzLl9vbkZpbmlzaCgpLHRoaXMuZG9tUGxheWVyLmZpbmlzaCgpKX1yZXNldCgpe3RoaXMuX3Jlc2V0RG9tUGxheWVyU3RhdGUoKSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fZmluaXNoZWQ9ITEsdGhpcy5fc3RhcnRlZD0hMSx0aGlzLl9vblN0YXJ0Rm5zPXRoaXMuX29yaWdpbmFsT25TdGFydEZucyx0aGlzLl9vbkRvbmVGbnM9dGhpcy5fb3JpZ2luYWxPbkRvbmVGbnN9X3Jlc2V0RG9tUGxheWVyU3RhdGUoKXt0aGlzLmRvbVBsYXllcj8uY2FuY2VsKCl9cmVzdGFydCgpe3RoaXMucmVzZXQoKSx0aGlzLnBsYXkoKX1oYXNTdGFydGVkKCl7cmV0dXJuIHRoaXMuX3N0YXJ0ZWR9ZGVzdHJveSgpe3RoaXMuX2Rlc3Ryb3llZHx8KHRoaXMuX2Rlc3Ryb3llZD0hMCx0aGlzLl9yZXNldERvbVBsYXllclN0YXRlKCksdGhpcy5fb25GaW5pc2goKSx0aGlzLl9zcGVjaWFsU3R5bGVzJiZ0aGlzLl9zcGVjaWFsU3R5bGVzLmRlc3Ryb3koKSx0aGlzLl9vbkRlc3Ryb3lGbnMuZm9yRWFjaChuPT5uKCkpLHRoaXMuX29uRGVzdHJveUZucz1bXSl9c2V0UG9zaXRpb24obil7dGhpcy5kb21QbGF5ZXJ8fHRoaXMuaW5pdCgpLHRoaXMuZG9tUGxheWVyJiYodGhpcy5kb21QbGF5ZXIuY3VycmVudFRpbWU9bip0aGlzLnRpbWUpfWdldFBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuZG9tUGxheWVyPysodGhpcy5kb21QbGF5ZXIuY3VycmVudFRpbWU/PzApL3RoaXMudGltZTp0aGlzLl9pbml0aWFsaXplZD8xOjB9Z2V0IHRvdGFsVGltZSgpe3JldHVybiB0aGlzLl9kZWxheSt0aGlzLl9kdXJhdGlvbn1iZWZvcmVEZXN0cm95KCl7bGV0IG49bmV3IE1hcDt0aGlzLmhhc1N0YXJ0ZWQoKSYmdGhpcy5fZmluYWxLZXlmcmFtZS5mb3JFYWNoKChpLGEpPT57YSE9PSJvZmZzZXQiJiZuLnNldChhLHRoaXMuX2ZpbmlzaGVkP2k6T2ModGhpcy5lbGVtZW50LGEpKX0pLHRoaXMuY3VycmVudFNuYXBzaG90PW59dHJpZ2dlckNhbGxiYWNrKG4pe2xldCBlPW49PT0ic3RhcnQiP3RoaXMuX29uU3RhcnRGbnM6dGhpcy5fb25Eb25lRm5zO2UuZm9yRWFjaChpPT5pKCkpLGUubGVuZ3RoPTB9fSxRYz1jbGFzc3t2YWxpZGF0ZVN0eWxlUHJvcGVydHkobil7cmV0dXJuITB9dmFsaWRhdGVBbmltYXRhYmxlU3R5bGVQcm9wZXJ0eShuKXtyZXR1cm4hMH1jb250YWluc0VsZW1lbnQobixlKXtyZXR1cm4gRDUobixlKX1nZXRQYXJlbnRFbGVtZW50KG4pe3JldHVybiBJYyhuKX1xdWVyeShuLGUsaSl7cmV0dXJuIEk1KG4sZSxpKX1jb21wdXRlU3R5bGUobixlLGkpe3JldHVybiBPYyhuLGUpfWFuaW1hdGUobixlLGksYSxyLG89W10pe2xldCBkPWE9PTA/ImJvdGgiOiJmb3J3YXJkcyIscD17ZHVyYXRpb246aSxkZWxheTphLGZpbGw6ZH07ciYmKHAuZWFzaW5nPXIpO2xldCBnPW5ldyBNYXAsXz1vLmZpbHRlcihQPT5QIGluc3RhbmNlb2YgV2MpO0F2KGksYSkmJl8uZm9yRWFjaChQPT57UC5jdXJyZW50U25hcHNob3QuZm9yRWFjaCgoVixPKT0+Zy5zZXQoTyxWKSl9KTtsZXQgeT1UdihlKS5tYXAoUD0+bmV3IE1hcChQKSk7eT1EdihuLHksZyk7bGV0IEk9cU8obix5KTtyZXR1cm4gbmV3IFdjKG4seSxwLEkpfX0sRmM9IkAiLFp2PSJALmRpc2FibGVkIixZYz1jbGFzc3tuYW1lc3BhY2VJZDtkZWxlZ2F0ZTtlbmdpbmU7X29uRGVzdHJveTtcdTAyNzV0eXBlPTA7Y29uc3RydWN0b3IobixlLGksYSl7dGhpcy5uYW1lc3BhY2VJZD1uLHRoaXMuZGVsZWdhdGU9ZSx0aGlzLmVuZ2luZT1pLHRoaXMuX29uRGVzdHJveT1hfWdldCBkYXRhKCl7cmV0dXJuIHRoaXMuZGVsZWdhdGUuZGF0YX1kZXN0cm95Tm9kZShuKXt0aGlzLmRlbGVnYXRlLmRlc3Ryb3lOb2RlPy4obil9ZGVzdHJveSgpe3RoaXMuZW5naW5lLmRlc3Ryb3kodGhpcy5uYW1lc3BhY2VJZCx0aGlzLmRlbGVnYXRlKSx0aGlzLmVuZ2luZS5hZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUoKCk9PntxdWV1ZU1pY3JvdGFzaygoKT0+e3RoaXMuZGVsZWdhdGUuZGVzdHJveSgpfSl9KSx0aGlzLl9vbkRlc3Ryb3k/LigpfWNyZWF0ZUVsZW1lbnQobixlKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVFbGVtZW50KG4sZSl9Y3JlYXRlQ29tbWVudChuKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVDb21tZW50KG4pfWNyZWF0ZVRleHQobil7cmV0dXJuIHRoaXMuZGVsZWdhdGUuY3JlYXRlVGV4dChuKX1hcHBlbmRDaGlsZChuLGUpe3RoaXMuZGVsZWdhdGUuYXBwZW5kQ2hpbGQobixlKSx0aGlzLmVuZ2luZS5vbkluc2VydCh0aGlzLm5hbWVzcGFjZUlkLGUsbiwhMSl9aW5zZXJ0QmVmb3JlKG4sZSxpLGE9ITApe3RoaXMuZGVsZWdhdGUuaW5zZXJ0QmVmb3JlKG4sZSxpKSx0aGlzLmVuZ2luZS5vbkluc2VydCh0aGlzLm5hbWVzcGFjZUlkLGUsbixhKX1yZW1vdmVDaGlsZChuLGUsaSxhKXtpZihhKXt0aGlzLmRlbGVnYXRlLnJlbW92ZUNoaWxkKG4sZSxpLGEpO3JldHVybn10aGlzLnBhcmVudE5vZGUoZSkmJnRoaXMuZW5naW5lLm9uUmVtb3ZlKHRoaXMubmFtZXNwYWNlSWQsZSx0aGlzLmRlbGVnYXRlKX1zZWxlY3RSb290RWxlbWVudChuLGUpe3JldHVybiB0aGlzLmRlbGVnYXRlLnNlbGVjdFJvb3RFbGVtZW50KG4sZSl9cGFyZW50Tm9kZShuKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5wYXJlbnROb2RlKG4pfW5leHRTaWJsaW5nKG4pe3JldHVybiB0aGlzLmRlbGVnYXRlLm5leHRTaWJsaW5nKG4pfXNldEF0dHJpYnV0ZShuLGUsaSxhKXt0aGlzLmRlbGVnYXRlLnNldEF0dHJpYnV0ZShuLGUsaSxhKX1yZW1vdmVBdHRyaWJ1dGUobixlLGkpe3RoaXMuZGVsZWdhdGUucmVtb3ZlQXR0cmlidXRlKG4sZSxpKX1hZGRDbGFzcyhuLGUpe3RoaXMuZGVsZWdhdGUuYWRkQ2xhc3MobixlKX1yZW1vdmVDbGFzcyhuLGUpe3RoaXMuZGVsZWdhdGUucmVtb3ZlQ2xhc3MobixlKX1zZXRTdHlsZShuLGUsaSxhKXt0aGlzLmRlbGVnYXRlLnNldFN0eWxlKG4sZSxpLGEpfXJlbW92ZVN0eWxlKG4sZSxpKXt0aGlzLmRlbGVnYXRlLnJlbW92ZVN0eWxlKG4sZSxpKX1zZXRQcm9wZXJ0eShuLGUsaSl7ZS5jaGFyQXQoMCk9PUZjJiZlPT1adj90aGlzLmRpc2FibGVBbmltYXRpb25zKG4sISFpKTp0aGlzLmRlbGVnYXRlLnNldFByb3BlcnR5KG4sZSxpKX1zZXRWYWx1ZShuLGUpe3RoaXMuZGVsZWdhdGUuc2V0VmFsdWUobixlKX1saXN0ZW4obixlLGksYSl7cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKG4sZSxpLGEpfWRpc2FibGVBbmltYXRpb25zKG4sZSl7dGhpcy5lbmdpbmUuZGlzYWJsZUFuaW1hdGlvbnMobixlKX19LFg1PWNsYXNzIGV4dGVuZHMgWWN7ZmFjdG9yeTtjb25zdHJ1Y3RvcihuLGUsaSxhLHIpe3N1cGVyKGUsaSxhLHIpLHRoaXMuZmFjdG9yeT1uLHRoaXMubmFtZXNwYWNlSWQ9ZX1zZXRQcm9wZXJ0eShuLGUsaSl7ZS5jaGFyQXQoMCk9PUZjP2UuY2hhckF0KDEpPT0iLiImJmU9PVp2PyhpPWk9PT12b2lkIDA/ITA6ISFpLHRoaXMuZGlzYWJsZUFuaW1hdGlvbnMobixpKSk6dGhpcy5lbmdpbmUucHJvY2Vzcyh0aGlzLm5hbWVzcGFjZUlkLG4sZS5zbGljZSgxKSxpKTp0aGlzLmRlbGVnYXRlLnNldFByb3BlcnR5KG4sZSxpKX1saXN0ZW4obixlLGksYSl7aWYoZS5jaGFyQXQoMCk9PUZjKXtsZXQgcj1RTyhuKSxvPWUuc2xpY2UoMSksZD0iIjtyZXR1cm4gby5jaGFyQXQoMCkhPUZjJiYoW28sZF09WU8obykpLHRoaXMuZW5naW5lLmxpc3Rlbih0aGlzLm5hbWVzcGFjZUlkLHIsbyxkLHA9PntsZXQgZz1wLl9kYXRhfHwtMTt0aGlzLmZhY3Rvcnkuc2NoZWR1bGVMaXN0ZW5lckNhbGxiYWNrKGcsaSxwKX0pfXJldHVybiB0aGlzLmRlbGVnYXRlLmxpc3RlbihuLGUsaSxhKX19O1pjPWNsYXNze2RlbGVnYXRlO2VuZ2luZTtfem9uZTtfY3VycmVudElkPTA7X21pY3JvdGFza0lkPTE7X2FuaW1hdGlvbkNhbGxiYWNrc0J1ZmZlcj1bXTtfcmVuZGVyZXJDYWNoZT1uZXcgTWFwO19jZFJlY3VyRGVwdGg9MDtjb25zdHJ1Y3RvcihuLGUsaSl7dGhpcy5kZWxlZ2F0ZT1uLHRoaXMuZW5naW5lPWUsdGhpcy5fem9uZT1pLGUub25SZW1vdmFsQ29tcGxldGU9KGEscik9PntyPy5yZW1vdmVDaGlsZChudWxsLGEpfX1jcmVhdGVSZW5kZXJlcihuLGUpe2xldCBhPXRoaXMuZGVsZWdhdGUuY3JlYXRlUmVuZGVyZXIobixlKTtpZighbnx8IWU/LmRhdGE/LmFuaW1hdGlvbil7bGV0IGc9dGhpcy5fcmVuZGVyZXJDYWNoZSxfPWcuZ2V0KGEpO2lmKCFfKXtsZXQgeT0oKT0+Zy5kZWxldGUoYSk7Xz1uZXcgWWMoIiIsYSx0aGlzLmVuZ2luZSx5KSxnLnNldChhLF8pfXJldHVybiBffWxldCByPWUuaWQsbz1lLmlkKyItIit0aGlzLl9jdXJyZW50SWQ7dGhpcy5fY3VycmVudElkKyssdGhpcy5lbmdpbmUucmVnaXN0ZXIobyxuKTtsZXQgZD1nPT57QXJyYXkuaXNBcnJheShnKT9nLmZvckVhY2goZCk6dGhpcy5lbmdpbmUucmVnaXN0ZXJUcmlnZ2VyKHIsbyxuLGcubmFtZSxnKX07cmV0dXJuIGUuZGF0YS5hbmltYXRpb24uZm9yRWFjaChkKSxuZXcgWDUodGhpcyxvLGEsdGhpcy5lbmdpbmUpfWJlZ2luKCl7dGhpcy5fY2RSZWN1ckRlcHRoKyssdGhpcy5kZWxlZ2F0ZS5iZWdpbiYmdGhpcy5kZWxlZ2F0ZS5iZWdpbigpfV9zY2hlZHVsZUNvdW50VGFzaygpe3F1ZXVlTWljcm90YXNrKCgpPT57dGhpcy5fbWljcm90YXNrSWQrK30pfXNjaGVkdWxlTGlzdGVuZXJDYWxsYmFjayhuLGUsaSl7aWYobj49MCYmbjx0aGlzLl9taWNyb3Rhc2tJZCl7dGhpcy5fem9uZS5ydW4oKCk9PmUoaSkpO3JldHVybn1sZXQgYT10aGlzLl9hbmltYXRpb25DYWxsYmFja3NCdWZmZXI7YS5sZW5ndGg9PTAmJnF1ZXVlTWljcm90YXNrKCgpPT57dGhpcy5fem9uZS5ydW4oKCk9PnthLmZvckVhY2gocj0+e2xldFtvLGRdPXI7byhkKX0pLHRoaXMuX2FuaW1hdGlvbkNhbGxiYWNrc0J1ZmZlcj1bXX0pfSksYS5wdXNoKFtlLGldKX1lbmQoKXt0aGlzLl9jZFJlY3VyRGVwdGgtLSx0aGlzLl9jZFJlY3VyRGVwdGg9PTAmJnRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLl9zY2hlZHVsZUNvdW50VGFzaygpLHRoaXMuZW5naW5lLmZsdXNoKHRoaXMuX21pY3JvdGFza0lkKX0pLHRoaXMuZGVsZWdhdGUuZW5kJiZ0aGlzLmRlbGVnYXRlLmVuZCgpfXdoZW5SZW5kZXJpbmdEb25lKCl7cmV0dXJuIHRoaXMuZW5naW5lLndoZW5SZW5kZXJpbmdEb25lKCl9Y29tcG9uZW50UmVwbGFjZWQobil7dGhpcy5lbmdpbmUuZmx1c2goKSx0aGlzLmRlbGVnYXRlLmNvbXBvbmVudFJlcGxhY2VkPy4obil9fX0pO2Z1bmN0aW9uIEtPKCl7cmV0dXJuIG5ldyBCY31mdW5jdGlvbiBYTyh0LG4sZSl7cmV0dXJuIG5ldyBaYyh0LG4sZSl9ZnVuY3Rpb24gS3YoKXtyZXR1cm4gUmQoIk5nRWFnZXJBbmltYXRpb25zIiksWy4uLkpPXX12YXIgJE8sJHYsYmNlLEpPLFh2PXgoKCk9PntrKCk7aygpO3Q3KCk7dDcoKTthMSgpO2tTKCk7JE89KCgpPT57Y2xhc3MgdCBleHRlbmRzIHVve2NvbnN0cnVjdG9yKGUsaSxhKXtzdXBlcihlLGksYSl9bmdPbkRlc3Ryb3koKXt0aGlzLmZsdXNoKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpKEVpKGp0KSxFaShKbiksRWkoZXIpKX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjfSl9cmV0dXJuIHR9KSgpOyR2PVt7cHJvdmlkZTplcix1c2VGYWN0b3J5OktPfSx7cHJvdmlkZTp1byx1c2VDbGFzczokT30se3Byb3ZpZGU6RmQsdXNlRmFjdG9yeTpYTyxkZXBzOltlbSx1byxyZV19XSxiY2U9W3twcm92aWRlOkpuLHVzZUNsYXNzOko1fSx7cHJvdmlkZTp2Nix1c2VWYWx1ZToiTm9vcEFuaW1hdGlvbnMifSwuLi4kdl0sSk89W3twcm92aWRlOkpuLHVzZUZhY3Rvcnk6KCk9Pm5ldyBRY30se3Byb3ZpZGU6djYsdXNlRmFjdG9yeTooKT0+IkJyb3dzZXJBbmltYXRpb25zIn0sLi4uJHZdfSk7dmFyICRjLEp2PXgoKCk9PnskYz1jbGFzc3todHRwO3ByZWZpeDtzdWZmaXg7Y29uc3RydWN0b3IobixlPSIvYXNzZXRzL2kxOG4vIixpPSIuanNvbiIpe3RoaXMuaHR0cD1uLHRoaXMucHJlZml4PWUsdGhpcy5zdWZmaXg9aX1nZXRUcmFuc2xhdGlvbihuKXtyZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLnByZWZpeH0ke259JHt0aGlzLnN1ZmZpeH1gKX19fSk7dmFyIGVfLHRfLGlfPXgoKCk9PntLMSgpO2soKTtZdCgpO2VuKCk7cjEoKTtTYSgpO25lKCk7VygpO2hlKCk7aygpO2hlKCk7bmUoKTtXKCk7ZV89dD0+KHtqdWljeWNvaW46dH0pO0xlLmFkZChMZix4ZixXcCxGcCxCcCxBZixiMyk7dF89KCgpPT57Y2xhc3MgdHtjb25maWd1cmF0aW9uU2VydmljZT1oKEx0KTthbHRjb2luTmFtZT0iSnVpY3ljb2luIjtuZ09uSW5pdCgpe3RoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0QXBwbGljYXRpb25Db25maWd1cmF0aW9uKCkuc3Vic2NyaWJlKHtuZXh0OmU9PntlPy5hcHBsaWNhdGlvbj8uYWx0Y29pbk5hbWUmJih0aGlzLmFsdGNvaW5OYW1lPWUuYXBwbGljYXRpb24uYWx0Y29pbk5hbWUpfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLXRva2VuLXNhbGUiXV0sZGVjbHM6MTMyLHZhcnM6NTMsY29uc3RzOltbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCJdLFsxLCJtZGMtY2FyZCIsImNvbnRhaW5lciJdLFsxLCJ3aGl0ZXBhcGVyLWNvbnRhaW5lciIsIm9mZmVyLWNvbnRhaW5lciIsImFsaWduLXNlbGYtY2VudGVyIl0sWzMsImlubmVySHRtbCJdLFsxLCJkaXZpZGVyIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1lbGV2YXRpb24tejYiXSxbMSwibWRjLWNhcmQiXSxbMSwid2hpdGVwYXBlci1yZWZlcmVuY2UiXSxbMSwid2hpdGVwYXBlci1idXR0b25zIl0sWyJocmVmIiwiaHR0cHM6Ly9wb256aWNvLndpbi9wb256aWNvLnBkZiIsInRhcmdldCIsIl9ibGFuayIsInJlbCIsIm5vb3BlbmVyIG5vcmVmZXJyZXIiXSxbIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiY29sb3IiLCJhY2NlbnQiXSxbMSwiZmFzIiwiZmEtdW5pdmVyc2l0eSIsImZhLWxnIl0sWyJocmVmIiwiaHR0cHM6Ly93d3cuc2VjLmdvdi9pbnZlc3Rvci9hbGVydHMvaWFfdmlydHVhbGN1cnJlbmNpZXMucGRmIiwidGFyZ2V0IiwiX2JsYW5rIiwicmVsIiwibm9vcGVuZXIgbm9yZWZlcnJlciJdLFsxLCJmYXMiLCJmYS1ncmFkdWF0aW9uLWNhcCIsImZhLWxnIl0sWzEsIm9mZmVyLWJveCJdLFsxLCJ0ZXh0LWp1c3RpZnkiXSxbMSwiZmFiIiwiZmEtYml0Y29pbiJdLFsxLCJiYWRnZSJdLFsxLCJmYXEtY29udGFpbmVyIiwiYWxpZ24tc2VsZi1sdC1tZC1jZW50ZXIiXSxbMSwidGl0bGUiXSxbMSwiZmFzIiwiZmEtY29tbWVudHMiLCJmYS0yeCJdLFsxLCJmYXIiLCJmYS1jb21tZW50LWFsdCIsImZhLTJ4Il0sWzEsImZhciIsImZhLWNvbW1lbnRzIiwiZmEtMngiXSxbMSwiZmFzIiwiZmEtY29tbWVudC1hbHQiLCJmYS0yeCJdLFsxLCJmYXEtcXVlc3Rpb24tbGFiZWwiLDMsImlubmVySHRtbCJdLFsic3JjIiwiYXNzZXRzL3B1YmxpYy9pbWFnZXMvcGFkZGluZy81NnB4LnBuZyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwibWF0LWNhcmQiLDApKDEsImRpdiIsMSkoMiwiZGl2IiwyKSgzLCJtYXQtY2FyZC1oZWFkZXIiKSg0LCJtYXQtY2FyZC10aXRsZSIpLG0oNSksYig2LCJ0cmFuc2xhdGUiKSxzKCksdSg3LCJtYXQtY2FyZC1zdWJ0aXRsZSIsMyksYig4LCJ0cmFuc2xhdGUiKSxzKCksdSg5LCJkaXYiLDQpLGMoMTAsIm1hdC1jYXJkIiw1KSgxMSwiZGl2Iiw2KSgxMiwiaDQiKSxtKDEzKSxiKDE0LCJ0cmFuc2xhdGUiKSxjKDE1LCJzbWFsbCIsNyksbSgxNiwiKCIpLGMoMTcsInNwYW4iKSxtKDE4KSxiKDE5LCJ0cmFuc2xhdGUiKSxzKCksbSgyMCwiKSIpLHMoKSgpLGMoMjEsImRpdiIsOCkoMjIsImEiLDkpKDIzLCJidXR0b24iLDEwKSx1KDI0LCJpIiwxMSksbSgyNSwiIFBvbnpJQ08gV2hpdGVwYXBlciIpLHMoKSgpLGMoMjYsImEiLDEyKSgyNywiYnV0dG9uIiwxMCksdSgyOCwiaSIsMTMpLG0oMjksIiBQb256aUNvaW4gV2hpdGVwYXBlciIpLHMoKSgpKCkoKSgpLGMoMzAsImRpdiIsMTQpKDMxLCJoMyIpLG0oMzIpLGIoMzMsInRyYW5zbGF0ZSIpLHMoKSxjKDM0LCJwIiwxNSksbSgzNSwiIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0ICIpLGMoMzYsInN0cm9uZyIpLHUoMzcsImkiLDE2KSxtKDM4KSxzKCksbSgzOSwiLCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCBjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0IGNsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuICIpLGMoNDAsInNwYW4iKSxtKDQxKSxiKDQyLCJ0cmFuc2xhdGUiKSxzKCksbSg0MywiIER1aXMgYXV0ZW0gdmVsIGV1bSBpcml1cmUgZG9sb3IgaW4gaGVuZHJlcml0IGluIHZ1bHB1dGF0ZSB2ZWxpdCBlc3NlIG1vbGVzdGllIGNvbnNlcXVhdCwgdmVsIGlsbHVtIGRvbG9yZSBldSBmZXVnaWF0IG51bGxhIGZhY2lsaXNpcyBhdCB2ZXJvIGVyb3MgZXQgYWNjdW1zYW4gZXQgaXVzdG8gb2RpbyBkaWduaXNzaW0gcXVpIGJsYW5kaXQgcHJhZXNlbnQgbHVwdGF0dW0genpyaWwgZGVsZW5pdCBhdWd1ZSBkdWlzIGRvbG9yZSB0ZSBmZXVnYWl0IG51bGxhIGZhY2lsaXNpLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRpYW0gbm9udW1teSBuaWJoIGV1aXNtb2QgdGluY2lkdW50IHV0IGxhb3JlZXQgZG9sb3JlIG1hZ25hIGFsaXF1YW0gZXJhdCB2b2x1dHBhdC4gIiksYyg0NCwic3BhbiIpLG0oNDUpLGIoNDYsInRyYW5zbGF0ZSIpLHMoKSxtKDQ3LCIgVXQgd2lzaSBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyAiKSxjKDQ4LCJzdHJvbmciKSx1KDQ5LCJpIiwxNiksbSg1MCkscygpLG0oNTEsIiBub3N0cnVkIGV4ZXJjaSB0YXRpb24gdWxsYW1jb3JwZXIgc3VzY2lwaXQgbG9ib3J0aXMgbmlzbCB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlzIGF1dGVtIHZlbCBldW0gaXJpdXJlIGRvbG9yIGluIGhlbmRyZXJpdCBpbiB2dWxwdXRhdGUgdmVsaXQgZXNzZSBtb2xlc3RpZSBjb25zZXF1YXQsIHZlbCBpbGx1bSBkb2xvcmUgZXUgZmV1Z2lhdCBudWxsYSBmYWNpbGlzaXMgYXQgdmVybyBlcm9zIGV0IGFjY3Vtc2FuIGV0IGl1c3RvIG9kaW8gZGlnbmlzc2ltIHF1aSBibGFuZGl0IHByYWVzZW50IGx1cHRhdHVtIHp6cmlsIGRlbGVuaXQgYXVndWUgZHVpcyBkb2xvcmUgdGUgZmV1Z2FpdCBudWxsYSBmYWNpbGlzaS4gIiksYyg1Miwic3BhbiIpLG0oNTMpLGIoNTQsInRyYW5zbGF0ZSIpLHMoKSxtKDU1LCIgTmFtIGxpYmVyIHRlbXBvciBjdW0gc29sdXRhIG5vYmlzIGVsZWlmZW5kIG9wdGlvbiBjb25ndWUgbmloaWwgaW1wZXJkaWV0IGRvbWluZyBpZCBxdW9kIG1hemltIHBsYWNlcmF0IGZhY2VyIHBvc3NpbSBhc3N1bS4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVlciBhZGlwaXNjaW5nIGVsaXQsIHNlZCBkaWFtIG5vbnVtbXkgbmliaCBldWlzbW9kIHRpbmNpZHVudCB1dCBsYW9yZWV0IGRvbG9yZSBtYWduYSBhbGlxdWFtIGVyYXQgdm9sdXRwYXQuIFV0IHdpc2kgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2kgdGF0aW9uIHVsbGFtY29ycGVyIHN1c2NpcGl0IGxvYm9ydGlzIG5pc2wgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gIiksYyg1Niwic3BhbiIpLG0oNTcpLGIoNTgsInRyYW5zbGF0ZSIpLHMoKSxtKDU5LCIgRHVpcyBhdXRlbSB2ZWwgZXVtICIpLGMoNjAsInN0cm9uZyIpLHUoNjEsImkiLDE2KSxtKDYyKSxzKCksbSg2MywiIGlyaXVyZSBkb2xvciBpbiBoZW5kcmVyaXQgaW4gdnVscHV0YXRlIHZlbGl0IGVzc2UgbW9sZXN0aWUgY29uc2VxdWF0LCB2ZWwgaWxsdW0gZG9sb3JlIGV1IGZldWdpYXQgbnVsbGEgZmFjaWxpc2lzLiAiKSxjKDY0LCJzcGFuIiksbSg2NSksYig2NiwidHJhbnNsYXRlIikscygpLG0oNjcsIiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0IGNsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIEF0IGFjY3VzYW0gYWxpcXV5YW0gZGlhbSBkaWFtIGRvbG9yZSBkb2xvcmVzIGR1byBlaXJtb2QgZW9zIGVyYXQsIGV0IG5vbnVteSBzZWQgdGVtcG9yIGV0IGV0IGludmlkdW50IGp1c3RvIGxhYm9yZSBTdGV0IGNsaXRhIGVhIGV0IGd1YmVyZ3Jlbiwga2FzZCBtYWduYSBubyByZWJ1bS4gc2FuY3R1cyBzZWEgc2VkIHRha2ltYXRhIHV0IHZlcm8gdm9sdXB0dWEuICIpLGMoNjgsInNwYW4iLDE3KSx1KDY5LCJpIiwxNiksbSg3MCkscygpLG0oNzEsIiBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyLiAiKSxzKCkoKSgpLGMoNzIsImRpdiIsMTgpKDczLCJtYXQtY2FyZC1oZWFkZXIiKSg3NCwibWF0LWNhcmQtdGl0bGUiLDE5KSxtKDc1KSxiKDc2LCJ0cmFuc2xhdGUiKSxzKCkoKSx1KDc3LCJkaXYiLDQpLGMoNzgsIm1hdC1jYXJkIiw1KSg3OSwiZGl2Iiw2KSg4MCwiaDUiKSx1KDgxLCJpIiwyMCksbSg4MiwiIFN0ZXQgIiksYyg4Mywic3Ryb25nIiksdSg4NCwiaSIsMTYpLG0oODUpLHMoKSxtKDg2LCIgY2xpdGEga2FzZCBndWJlcmdyZW4/IikscygpLGMoODcsInNtYWxsIiwxNSksbSg4OCwiIFN0ZXQgY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vICIpLGMoODksInN0cm9uZyIpLHUoOTAsImkiLDE2KSxtKDkxKSxzKCksbSg5MiwiIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gIikscygpKCkoKSxjKDkzLCJtYXQtY2FyZCIsNSkoOTQsImRpdiIsNikoOTUsImg1IiksdSg5NiwiaSIsMjEpLG0oOTcsIiBDb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHI/IikscygpLGMoOTgsInNtYWxsIiwxNSksbSg5OSwiIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCAiKSxjKDEwMCwic3Ryb25nIiksdSgxMDEsImkiLDE2KSxtKDEwMikscygpLG0oMTAzLCIgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiAiKSxzKCkoKSgpLGMoMTA0LCJtYXQtY2FyZCIsNSkoMTA1LCJkaXYiLDYpKDEwNiwiaDUiKSx1KDEwNywiaSIsMjIpLG0oMTA4LCIgSGVuZHJlcml0ICIpLGMoMTA5LCJzdHJvbmciKSx1KDExMCwiaSIsMTYpLG0oMTExKSxzKCksbSgxMTIsIiBpbiB2dWxwdXRhdGUgdmVsaXQ/IikscygpLGMoMTEzLCJzbWFsbCIsMTUpLG0oMTE0LCIgRHVpcyBhdXRlbSB2ZWwgZXVtIGlyaXVyZSBkb2xvciBpbiBoZW5kcmVyaXQgaW4gdnVscHV0YXRlIHZlbGl0IGVzc2UgbW9sZXN0aWUgY29uc2VxdWF0LCB2ZWwgaWxsdW0gZG9sb3JlIGV1IGZldWdpYXQgbnVsbGEgZmFjaWxpc2lzLiAiKSxzKCkoKSgpLGMoMTE1LCJtYXQtY2FyZCIsNSkoMTE2LCJkaXYiLDYpKDExNywiaDUiKSx1KDExOCwiaSIsMjMpLG0oMTE5LCIgSnVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0/IikscygpLGMoMTIwLCJzbWFsbCIsMTUpLG0oMTIxLCIgQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCBjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiAiKSxzKCkoKSgpLGMoMTIyLCJtYXQtY2FyZCIsNSkoMTIzLCJkaXYiLDYpKDEyNCwiaDUiKSx1KDEyNSwiaSIsMjApKDEyNiwic3BhbiIsMjQpLGIoMTI3LCJ0cmFuc2xhdGUiKSxzKCksYygxMjgsInNtYWxsIiwxNSksbSgxMjkpLGIoMTMwLCJ0cmFuc2xhdGUiKSxzKCkoKSgpKCksdSgxMzEsImltZyIsMjUpLHMoKSgpKSxpJjImJihsKDUpLEUoIiAiLEMoNiwyMSwiVElUTEVfVE9LRU5TQUxFIiksIiAiKSxsKDIpLGYoImlubmVySHRtbCIsZHQoOCwyMywiU0VDVElPTl9JQ08iLGJ0KDQ5LGVfLGEuYWx0Y29pbk5hbWUpKSx0dCksbCg2KSxFKCIiLEMoMTQsMjYsIlNFQ1RJT05fV0hJVEVQQVBFUiIpLCIgIiksbCg1KSxBKEMoMTksMjgsIldISVRFUEFQRVJfUkVGRVJFTkNFUyIpKSxsKDE0KSxBKEMoMzMsMzAsIlNFQ1RJT05fU0FMRVNfUElUQ0giKSksbCg2KSxFKCIgIixhLmFsdGNvaW5OYW1lKSxsKDMpLEEoQyg0MiwzMiwiR0lWRV9VU19BTExfWU9VUl9NT05FWSIpKSxsKDQpLEEoQyg0NiwzNCwiR0lWRV9VU19BTExfWU9VUl9NT05FWSIpKSxsKDUpLEUoIiAiLGEuYWx0Y29pbk5hbWUpLGwoMyksQShDKDU0LDM2LCJHSVZFX1VTX0FMTF9ZT1VSX01PTkVZIikpLGwoNCksQShDKDU4LDM4LCJHSVZFX1VTX0FMTF9ZT1VSX01PTkVZIikpLGwoNSksRSgiICIsYS5hbHRjb2luTmFtZSksbCgzKSxBKEMoNjYsNDAsIkdJVkVfVVNfQUxMX1lPVVJfTU9ORVkiKSksbCg1KSxFKCIgIixhLmFsdGNvaW5OYW1lKSxsKDUpLEEoQyg3Niw0MiwiSUNPX0ZBUSIpKSxsKDEwKSxFKCIgIixhLmFsdGNvaW5OYW1lKSxsKDYpLEUoIiAiLGEuYWx0Y29pbk5hbWUpLGwoMTEpLEUoIiAiLGEuYWx0Y29pbk5hbWUpLGwoOSksRSgiICIsYS5hbHRjb2luTmFtZSksbCgxNSksZigiaW5uZXJIdG1sIixkdCgxMjcsNDQsIklDT19GQVFfUVVFU1RJT04iLGJ0KDUxLGVfLGEuYWx0Y29pbk5hbWUpKSx0dCksbCgzKSxBKEMoMTMwLDQ3LCJJQ09fRkFRX0FOU1dFUiIpKSl9LGRlcGVuZGVuY2llczpbZGUscGUsSW0sRG0sWDIsWSxvZSxsZSxLXSxzdHlsZXM6W2AuY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpzdHJldGNoO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7Z2FwOjEuMjVyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcn1AbWVkaWEgKG1heC13aWR0aDogOTU5Ljk4cHgpey5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0uYWxpZ24tc2VsZi1sdC1tZC1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLXNlbGY6Y2VudGVyfX0uYWxpZ24tc2VsZi1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLXNlbGY6Y2VudGVyfS5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDAwMDAyMTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbi1ib3R0b206LjYyNXJlbTtwYWRkaW5nOjFyZW0gMS4yNXJlbX0ud2hpdGVwYXBlci1jb250YWluZXIub2ZmZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXgtd2lkdGg6NzAwcHg7bWluLXdpZHRoOjMwMHB4O3dpZHRoOjcwJX0ud2hpdGVwYXBlci1idXR0b25zW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtd3JhcDp3cmFwO2dhcDouNXJlbX0uZmFxLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWF4LXdpZHRoOjUwMHB4O21pbi13aWR0aDoyMDBweDt3aWR0aDo3MCV9YVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKDEpe3BhZGRpbmctcmlnaHQ6LjYyNXJlbX0udGl0bGVbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuNXJlbX0uZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOi41cHggc29saWQgI2YyZjJmMjttYXJnaW4tYm90dG9tOi42MjVyZW19LnRleHQtanVzdGlmeVtfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpqdXN0aWZ5fW1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOi42MjVyZW19bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZCgxKXtib3JkZXItcmFkaXVzOjVweDttYXJnaW46MCBhdXRvO3dpZHRoOjgwJX1tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9bWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDotMXJlbTttYXJnaW4tdG9wOjFyZW19aDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNXB4fS5mYXEtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOi42MjVyZW19aW1nW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMHB4fS5tZGMtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjB9Lm9mZmVyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6MXJlbX0uZmFxLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6LjI1cmVtO21hcmdpbi10b3A6LS41cmVtfS53aGl0ZXBhcGVyLXJlZmVyZW5jZVtfbmdjb250ZW50LSVDT01QJV0sIC5mYXEtcXVlc3Rpb24tbGFiZWxbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0Oi42MjVyZW19CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO3ZhciBhXyxuXz14KCgpPT57cDEoKTtGMSgpO3dpKCk7aygpO1coKTtoZSgpO2soKTtoZSgpO1coKTthXz0oKCk9PntjbGFzcyB0e2Nvb2tpZVNlcnZpY2U9aChadCk7dXNlclNlcnZpY2U9aChBdCk7cm91dGVyPWgoeXQpO3JvdXRlPWgoJDEpO25nWm9uZT1oKHJlKTtuZ09uSW5pdCgpe3RoaXMudXNlclNlcnZpY2Uub2F1dGhMb2dpbih0aGlzLnBhcnNlUmVkaXJlY3RVcmxQYXJhbXMoKS5hY2Nlc3NfdG9rZW4pLnN1YnNjcmliZSh7bmV4dDplPT57bGV0IGk9YnRvYShlLmVtYWlsLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIikpO3RoaXMudXNlclNlcnZpY2Uuc2F2ZSh7ZW1haWw6ZS5lbWFpbCxwYXNzd29yZDppLHBhc3N3b3JkUmVwZWF0Oml9KS5zdWJzY3JpYmUoe25leHQ6KCk9Pnt0aGlzLmxvZ2luKGUpfSxlcnJvcjooKT0+e3RoaXMubG9naW4oZSl9fSl9LGVycm9yOmU9Pnt0aGlzLmludmFsaWRhdGVTZXNzaW9uKGUpLHRoaXMubmdab25lLnJ1bigoKT0+UGUodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbIi9sb2dpbiJdKX0pKX19KX1sb2dpbihlKXt0aGlzLnVzZXJTZXJ2aWNlLmxvZ2luKHtlbWFpbDplLmVtYWlsLHBhc3N3b3JkOmJ0b2EoZS5lbWFpbC5zcGxpdCgiIikucmV2ZXJzZSgpLmpvaW4oIiIpKSxvYXV0aDohMH0pLnN1YnNjcmliZSh7bmV4dDppPT57bGV0IGE9bmV3IERhdGU7YS5zZXRIb3VycyhhLmdldEhvdXJzKCkrOCksdGhpcy5jb29raWVTZXJ2aWNlLnB1dCgidG9rZW4iLGkudG9rZW4se2V4cGlyZXM6YX0pLGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJ0b2tlbiIsaS50b2tlbiksc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgiYmlkIixpLmJpZCksdGhpcy51c2VyU2VydmljZS5pc0xvZ2dlZEluLm5leHQoITApLHRoaXMubmdab25lLnJ1bigoKT0+UGUodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbIi8iXSl9KSl9LGVycm9yOmk9Pnt0aGlzLmludmFsaWRhdGVTZXNzaW9uKGkpLHRoaXMubmdab25lLnJ1bigoKT0+UGUodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbIi9sb2dpbiJdKX0pKX19KX1pbnZhbGlkYXRlU2Vzc2lvbihlKXtjb25zb2xlLmxvZyhlKSx0aGlzLmNvb2tpZVNlcnZpY2UucmVtb3ZlKCJ0b2tlbiIpLGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJ0b2tlbiIpLHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oImJpZCIpfXBhcnNlUmVkaXJlY3RVcmxQYXJhbXMoKXtsZXQgaT10aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFyYW1zLnN1YnN0cigxKS5zcGxpdCgiJiIpLGE9e307Zm9yKGxldCByIG9mIGkpe2xldFtvLGRdPXIuc3BsaXQoIj0iKTthW29dPWR9cmV0dXJuIGF9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLW9hdXRoIl1dLGRlY2xzOjksdmFyczo2LGNvbnN0czpbWzEsImNlbnRlci1jb250YWluZXIiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwicHJpbWFyeS1ub3RpZmljYXRpb24iXSxbMSwibWRjLWNhcmQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsImRpdiIsMCkoMSwibWF0LWNhcmQiLDEpKDIsImRpdiIsMikoMywiaDMiKSxtKDQpLGIoNSwidHJhbnNsYXRlIikscygpLGMoNiwiZGl2IiksbSg3KSxiKDgsInRyYW5zbGF0ZSIpLHMoKSgpKCkoKSksaSYyJiYobCg0KSxBKEMoNSwyLCJUSVRMRV9MT0dJTiIpKSxsKDMpLEEoQyg4LDQsIkNPTkZJUk1fTE9HR0VEX0lOX1ZJQV9PQVVUSDIiKSkpfSxkZXBlbmRlbmNpZXM6W2RlLHBlLFksS10sc3R5bGVzOltgbWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDphdXRvO21pbi13aWR0aDozMDBweDt3aWR0aDozNSV9LmNlbnRlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOnN0cmV0Y2g7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXJ9CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIGVIKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIsMTUpfWZ1bmN0aW9uIHRIKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIsMTYpLHUoMSwiaW1nIiwxNykscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxmKCJhbHQiLFZlKGUubmFtZSkpKCJzcmMiLCJhc3NldHMvcHVibGljL2ltYWdlcy9wcm9kdWN0cy8iK2UuaW1hZ2Usd3QpfX1mdW5jdGlvbiBpSCh0LG4pe3QmMSYmdSgwLCJtYXQtZm9vdGVyLWNlbGwiLDE2KX1mdW5jdGlvbiBhSCh0LG4pe3QmMSYmdSgwLCJtYXQtaGVhZGVyLWNlbGwiLDE1KX1mdW5jdGlvbiBuSCh0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWNlbGwiLDE4KSxtKDEpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKCksRSgiICIsZS5uYW1lKX19ZnVuY3Rpb24gckgodCxuKXt0JjEmJnUoMCwibWF0LWZvb3Rlci1jZWxsIil9ZnVuY3Rpb24gb0godCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIiwxNSl9ZnVuY3Rpb24gY0godCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImJ1dHRvbiIsMjApLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpLiRpbXBsaWNpdCxyPXYoKTtyZXR1cm4gVChyLmRlYyhhLkJhc2tldEl0ZW0uaWQpKX0pLHUoMSwiaSIsMjEpLHMoKX19ZnVuY3Rpb24gc0godCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImJ1dHRvbiIsMjApLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpLiRpbXBsaWNpdCxyPXYoKTtyZXR1cm4gVChyLmluYyhhLkJhc2tldEl0ZW0uaWQpKX0pLHUoMSwiaSIsMjIpLHMoKX19ZnVuY3Rpb24gbEgodCxuKXtpZih0JjEmJihjKDAsIm1hdC1jZWxsIiwxNiksTSgxLGNILDIsMCwiYnV0dG9uIiwxOSksYygyLCJzcGFuIiwxOCksbSgzKSxzKCksTSg0LHNILDIsMCwiYnV0dG9uIiwxOSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9digpO2woKSx3KGkuYWxsb3dFZGl0PzE6LTEpLGwoMiksRSgiICIsZS5CYXNrZXRJdGVtLnF1YW50aXR5KSxsKCksdyhpLmFsbG93RWRpdD80Oi0xKX19ZnVuY3Rpb24gZEgodCxuKXt0JjEmJihjKDAsIm1hdC1mb290ZXItY2VsbCIsMjMpLG0oMSwiVE9UQUwiKSxzKCkpfWZ1bmN0aW9uIG1IKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIsMTUpfWZ1bmN0aW9uIGhIKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIsMTgpLG0oMSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxFKCIgIixlLnByaWNlLCJceEE0Iil9fWZ1bmN0aW9uIHBIKHQsbil7dCYxJiZ1KDAsIm1hdC1mb290ZXItY2VsbCIpfWZ1bmN0aW9uIGZIKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIsMTUpfWZ1bmN0aW9uIHVIKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJtYXQtY2VsbCIpKDEsImJ1dHRvbiIsMjApLFMoImNsaWNrIixmdW5jdGlvbigpe2xldCBhPXooZSkuJGltcGxpY2l0LHI9digyKTtyZXR1cm4gVChyLmRlbGV0ZShhLkJhc2tldEl0ZW0uaWQpKX0pLHUoMiwiaSIsMjUpLHMoKSgpfX1mdW5jdGlvbiBnSCh0LG4pe3QmMSYmdSgwLCJtYXQtZm9vdGVyLWNlbGwiKX1mdW5jdGlvbiB2SCh0LG4pe3QmMSYmKF9lKDAsMTEpLFIoMSxmSCwxLDAsIm1hdC1oZWFkZXItY2VsbCIsMikoMix1SCwzLDAsIm1hdC1jZWxsIiwyNCkoMyxnSCwxLDAsIm1hdC1mb290ZXItY2VsbCIsNyksYmUoKSl9ZnVuY3Rpb24gX0godCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1yb3ciKX1mdW5jdGlvbiBiSCh0LG4pe3QmMSYmdSgwLCJtYXQtcm93Iil9ZnVuY3Rpb24gQ0godCxuKXt0JjEmJnUoMCwibWF0LWZvb3Rlci1yb3ciLDI3KX1mdW5jdGlvbiB5SCh0LG4pe2lmKHQmMSYmKGMoMCwic3BhbiIpLFIoMSxDSCwxLDAsIm1hdC1mb290ZXItcm93IiwyNikscygpKSx0JjIpe2xldCBlPXYoKTtsKCksZigibWF0Rm9vdGVyUm93RGVmIixlLnRhYmxlQ29sdW1ucyl9fWZ1bmN0aW9uIHhIKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDE0KSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjIpe2xldCBlPXYoKTtsKCksTzEoIiIsQygyLDIsIkxBQkVMX1RPVEFMX1BSSUNFIiksIjogIixlLml0ZW1Ub3RhbCwiXHhBNCIpfX12YXIgS2MsaTc9eCgoKT0+e2soKTthYSgpO0YxKCk7WXQoKTtTYSgpO3IxKCk7Qm4oKTtKMSgpO1coKTtuZSgpO00yKCk7aygpO1coKTtMZS5hZGQoV3IsZWYsdGYpO0tjPSgoKT0+e2NsYXNzIHR7ZGVsdXhlR3VhcmQ9aChZcik7YmFza2V0U2VydmljZT1oKGVpKTt1c2VyU2VydmljZT1oKEF0KTtzbmFja0JhckhlbHBlclNlcnZpY2U9aChWdCk7YWxsb3dFZGl0PSExO2Rpc3BsYXlUb3RhbD0hMTt0b3RhbFByaWNlPSEwO2VtaXRUb3RhbD1uZXcgTjtlbWl0UHJvZHVjdENvdW50PW5ldyBOO3RhYmxlQ29sdW1ucz1bImltYWdlIiwicHJvZHVjdCIsInF1YW50aXR5IiwicHJpY2UiXTtkYXRhU291cmNlPVtdO2JvbnVzPTA7aXRlbVRvdGFsPTA7dXNlckVtYWlsO25nT25Jbml0KCl7dGhpcy5hbGxvd0VkaXQmJiF0aGlzLnRhYmxlQ29sdW1ucy5pbmNsdWRlcygicmVtb3ZlIikmJnRoaXMudGFibGVDb2x1bW5zLnB1c2goInJlbW92ZSIpLHRoaXMubG9hZCgpLHRoaXMudXNlclNlcnZpY2Uud2hvQW1JKFsiZW1haWwiXSkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLnVzZXJFbWFpbD1lLmVtYWlsfHwiYW5vbnltb3VzIix0aGlzLnVzZXJFbWFpbD0iKCIrdGhpcy51c2VyRW1haWwrIikifSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSl9bG9hZCgpe3RoaXMuYmFza2V0U2VydmljZS5maW5kKHBhcnNlSW50KHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImJpZCIpLDEwKSkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLmlzRGVsdXhlKCkmJmUuUHJvZHVjdHMuZm9yRWFjaChpPT57aS5wcmljZT1pLmRlbHV4ZVByaWNlfSksdGhpcy5kYXRhU291cmNlPWUuUHJvZHVjdHMsdGhpcy5pdGVtVG90YWw9ZS5Qcm9kdWN0cy5yZWR1Y2UoKGksYSk9PmkrYS5wcmljZSphLkJhc2tldEl0ZW0ucXVhbnRpdHksMCksdGhpcy5ib251cz1lLlByb2R1Y3RzLnJlZHVjZSgoaSxhKT0+aStNYXRoLnJvdW5kKGEucHJpY2UvMTApKmEuQmFza2V0SXRlbS5xdWFudGl0eSwwKSx0aGlzLnNlbmRUb1BhcmVudCh0aGlzLmRhdGFTb3VyY2UubGVuZ3RoKX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfWRlbGV0ZShlKXt0aGlzLmJhc2tldFNlcnZpY2UuZGVsKGUpLnN1YnNjcmliZSh7bmV4dDooKT0+e3RoaXMubG9hZCgpLHRoaXMuYmFza2V0U2VydmljZS51cGRhdGVOdW1iZXJPZkNhcnRJdGVtcygpfSxlcnJvcjppPT57Y29uc29sZS5sb2coaSl9fSl9aW5jKGUpe3RoaXMuYWRkVG9RdWFudGl0eShlLDEpfWRlYyhlKXt0aGlzLmFkZFRvUXVhbnRpdHkoZSwtMSl9YWRkVG9RdWFudGl0eShlLGkpe3RoaXMuYmFza2V0U2VydmljZS5nZXQoZSkuc3Vic2NyaWJlKHtuZXh0OmE9PntsZXQgcj1hLnF1YW50aXR5K2k7dGhpcy5iYXNrZXRTZXJ2aWNlLnB1dChlLHtxdWFudGl0eTpyPDE/MTpyfSkuc3Vic2NyaWJlKHtuZXh0OigpPT57dGhpcy5sb2FkKCksdGhpcy5iYXNrZXRTZXJ2aWNlLnVwZGF0ZU51bWJlck9mQ2FydEl0ZW1zKCl9LGVycm9yOm89Pnt0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKG8uZXJyb3I/LmVycm9yLCJlcnJvckJhciIpLGNvbnNvbGUubG9nKG8pfX0pfSxlcnJvcjphPT57Y29uc29sZS5sb2coYSl9fSl9c2VuZFRvUGFyZW50KGUpe3RoaXMuZW1pdFRvdGFsLmVtaXQoW3RoaXMuaXRlbVRvdGFsLHRoaXMuYm9udXNdKSx0aGlzLmVtaXRQcm9kdWN0Q291bnQuZW1pdChlKX1pc0RlbHV4ZSgpe3JldHVybiB0aGlzLmRlbHV4ZUd1YXJkLmlzRGVsdXhlKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLXB1cmNoYXNlLWJhc2tldCJdXSxpbnB1dHM6e2FsbG93RWRpdDoiYWxsb3dFZGl0IixkaXNwbGF5VG90YWw6ImRpc3BsYXlUb3RhbCIsdG90YWxQcmljZToidG90YWxQcmljZSJ9LG91dHB1dHM6e2VtaXRUb3RhbDoiZW1pdFRvdGFsIixlbWl0UHJvZHVjdENvdW50OiJlbWl0UHJvZHVjdENvdW50In0sZGVjbHM6MjcsdmFyczoxMCxjb25zdHM6W1szLCJkYXRhU291cmNlIl0sWyJtYXRDb2x1bW5EZWYiLCJpbWFnZSJdLFsiY2xhc3MiLCJoZWFkZXItaGlkZGVuIiw0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWyJjbGFzcyIsImNvbnRlbnQtYWxpZ24iLDQsIm1hdENlbGxEZWYiXSxbImNsYXNzIiwiY29udGVudC1hbGlnbiIsNCwibWF0Rm9vdGVyQ2VsbERlZiJdLFsibWF0Q29sdW1uRGVmIiwicHJvZHVjdCJdLFsiY2xhc3MiLCJjZWxsLWluaXRpYWwtZm9udCIsNCwibWF0Q2VsbERlZiJdLFs0LCJtYXRGb290ZXJDZWxsRGVmIl0sWyJtYXRDb2x1bW5EZWYiLCJxdWFudGl0eSJdLFsiY2xhc3MiLCJoZWFkZXItYWxpZ24iLDQsIm1hdEZvb3RlckNlbGxEZWYiXSxbIm1hdENvbHVtbkRlZiIsInByaWNlIl0sWyJtYXRDb2x1bW5EZWYiLCJyZW1vdmUiXSxbNCwibWF0SGVhZGVyUm93RGVmIl0sWzQsIm1hdFJvd0RlZiIsIm1hdFJvd0RlZkNvbHVtbnMiXSxbImlkIiwicHJpY2UiXSxbMSwiaGVhZGVyLWhpZGRlbiJdLFsxLCJjb250ZW50LWFsaWduIl0sWzEsImltZy1yZXNwb25zaXZlIiwiaW1nLXRodW1ibmFpbCIsMywic3JjIiwiYWx0Il0sWzEsImNlbGwtaW5pdGlhbC1mb250Il0sWyJtYXQtaWNvbi1idXR0b24iLCIiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsMywiY2xpY2siXSxbMSwiZmFzIiwiZmEtbWludXMtc3F1YXJlIl0sWzEsImZhcyIsImZhLXBsdXMtc3F1YXJlIl0sWzEsImhlYWRlci1hbGlnbiJdLFs0LCJtYXRDZWxsRGVmIl0sWzEsImZhciIsImZhLXRyYXNoLWFsdCJdLFsibWF0LWZvb3Rlci1yb3ciLCIiLDQsIm1hdEZvb3RlclJvd0RlZiJdLFsibWF0LWZvb3Rlci1yb3ciLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsImgxIiksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLGMoMywic21hbGwiKSxtKDQpLHMoKSgpLGMoNSwibWF0LXRhYmxlIiwwKSxfZSg2LDEpLFIoNyxlSCwxLDAsIm1hdC1oZWFkZXItY2VsbCIsMikoOCx0SCwyLDMsIm1hdC1jZWxsIiwzKSg5LGlILDEsMCwibWF0LWZvb3Rlci1jZWxsIiw0KSxiZSgpLF9lKDEwLDUpLFIoMTEsYUgsMSwwLCJtYXQtaGVhZGVyLWNlbGwiLDIpKDEyLG5ILDIsMSwibWF0LWNlbGwiLDYpKDEzLHJILDEsMCwibWF0LWZvb3Rlci1jZWxsIiw3KSxiZSgpLF9lKDE0LDgpLFIoMTUsb0gsMSwwLCJtYXQtaGVhZGVyLWNlbGwiLDIpKDE2LGxILDUsMywibWF0LWNlbGwiLDMpKDE3LGRILDIsMCwibWF0LWZvb3Rlci1jZWxsIiw5KSxiZSgpLF9lKDE4LDEwKSxSKDE5LG1ILDEsMCwibWF0LWhlYWRlci1jZWxsIiwyKSgyMCxoSCwyLDEsIm1hdC1jZWxsIiw2KSgyMSxwSCwxLDAsIm1hdC1mb290ZXItY2VsbCIsNyksYmUoKSxNKDIyLHZILDQsMCwibmctY29udGFpbmVyIiwxMSksUigyMyxfSCwxLDAsIm1hdC1oZWFkZXItcm93IiwxMikoMjQsYkgsMSwwLCJtYXQtcm93IiwxMyksTSgyNSx5SCwyLDEsInNwYW4iKSxzKCksTSgyNix4SCwzLDQsImRpdiIsMTQpKSxpJjImJihsKCksRSgiICIsQygyLDgsIlRJVExFX0JBU0tFVCIpLCIgIiksbCgzKSxBKGEudXNlckVtYWlsKSxsKCksZigiZGF0YVNvdXJjZSIsYS5kYXRhU291cmNlKSxsKDE3KSx3KGEuYWxsb3dFZGl0PzIyOi0xKSxsKCksZigibWF0SGVhZGVyUm93RGVmIixhLnRhYmxlQ29sdW1ucyksbCgpLGYoIm1hdFJvd0RlZkNvbHVtbnMiLGEudGFibGVDb2x1bW5zKSxsKCksdyhhLmRpc3BsYXlUb3RhbD8yNTotMSksbCgpLHcoYS50b3RhbFByaWNlPzI2Oi0xKSl9LGRlcGVuZGVuY2llczpbdGksbmksYWkscmksaWksb2ksb2MsY2MsbDEsY2ksbGksc2ksZGksc2MsbGMsWSxLXSxzdHlsZXM6W2BoMVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTouNjI1cmVtfWgxW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMDAwOTtmb250LXNpemU6LjhlbTttYXJnaW4tbGVmdDouNXJlbX0uaGVhZGluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwMztib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6eC1sYXJnZTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbi1ib3R0b206LjYyNXJlbTtwYWRkaW5nOi41cmVtIDFyZW19bWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOi42MjVyZW07dGFibGUtbGF5b3V0OmZpeGVkO3dpZHRoOjEwMCV9bWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVde21pbi1oZWlnaHQ6NDhweCFpbXBvcnRhbnR9bWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMTUpIWltcG9ydGFudDtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luOjA7cGFkZGluZzouNjI1cmVtIDA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4ycyBlYXNlfW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdOmxhc3Qtb2YtdHlwZXtib3JkZXItYm90dG9tOjAhaW1wb3J0YW50fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzAwMDAwMDBhfW1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MH1tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVyZW19bWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdOmZpcnN0LW9mLXR5cGUsIG1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV06Zmlyc3Qtb2YtdHlwZXtwYWRkaW5nLWxlZnQ6LjI1cmVtfW1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpsYXN0LW9mLXR5cGUsIG1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV06bGFzdC1vZi10eXBle3BhZGRpbmctcmlnaHQ6LjI1cmVtfS5tYXQtY29sdW1uLWltYWdlW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMCV9Lm1hdC1jb2x1bW4tcHJvZHVjdFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MzUlfS5tYXQtY29sdW1uLXF1YW50aXR5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jb2x1bW4tcHJpY2VbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE2JX0ubWF0LWNvbHVtbi1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwJX1AbWVkaWEgKG1heC13aWR0aDogOTU5Ljk4cHgpey5tYXQtY29sdW1uLWltYWdlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jb2x1bW4tcHJpY2VbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNvbHVtbi1wcm9kdWN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jb2x1bW4tcXVhbnRpdHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNvbHVtbi1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW4tYm90dG9tOi41cmVtO3dpZHRoOjEwMCV9fS5pbWctdGh1bWJuYWlsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjRweDtoZWlnaHQ6YXV0bzttYXgtd2lkdGg6ODBweDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMnMgZWFzZX0uaW1nLXRodW1ibmFpbFtfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfS5tYXQtbWRjLWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MS4xZW07Zm9udC13ZWlnaHQ6NTAwfS5jb250ZW50LWFsaWduW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmhlYWRlci1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2VsbC1pbml0aWFsLWZvbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbml0aWFsfS5xdWFudGl0eS1jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtnYXA6LjVyZW19LnF1YW50aXR5LWNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzAwMDk7dHJhbnNpdGlvbjpjb2xvciAuMnMgZWFzZX0ucXVhbnRpdHktY29udHJvbHNbX25nY29udGVudC0lQ09NUCVdICAgYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcntjb2xvcjojMDAwMDAwZGV9LnF1YW50aXR5LWNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHNwYW5bX25nY29udGVudC0lQ09NUCVde21pbi13aWR0aDoyNHB4O3RleHQtYWxpZ246Y2VudGVyfSNwcmljZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmxhcmdlO2ZvbnQtd2VpZ2h0OjUwMDttYXJnaW4tdG9wOi42MjVyZW07dGV4dC1hbGlnbjpyaWdodDt3aWR0aDoxMDAlfUBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCl7LmltZy10aHVtYm5haWxbX25nY29udGVudC0lQ09NUCVde21heC13aWR0aDo3MHB4fSNwcmljZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOm1lZGl1bTttYXJnaW4tdG9wOi41cmVtfW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOi4xMjVyZW07d2lkdGg6MTAwJX19LmZhci5mYS10cmFzaC1hbHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMwMDAwMDA4YTt0cmFuc2l0aW9uOmNvbG9yIC4ycyBlYXNlfS5mYXIuZmEtdHJhc2gtYWx0W19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcntjb2xvcjojZjQ0MzM2fQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgTUgscl8sb189eCgoKT0+e2soKTtZdCgpO3IxKCk7cDEoKTtXKCk7bmUoKTtpNygpO2hlKCk7aygpO2hlKCk7bmUoKTtXKCk7TUg9dD0+KHtib251czp0fSk7TGUuYWRkKGgzKTtyXz0oKCk9PntjbGFzcyB0e3JvdXRlcj1oKHl0KTtuZ1pvbmU9aChyZSk7cHJvZHVjdENvdW50PTA7Ym9udXM9MDtjaGVja291dCgpe3RoaXMubmdab25lLnJ1bigoKT0+UGUodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbIi9hZGRyZXNzL3NlbGVjdCJdKX0pKX1nZXRQcm9kdWN0Q291bnQoZSl7dGhpcy5wcm9kdWN0Q291bnQ9ZX1nZXRCb251c1BvaW50cyhlKXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCJpdGVtVG90YWwiLGVbMF0udG9TdHJpbmcoKSksdGhpcy5ib251cz1lWzFdfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1iYXNrZXQiXV0sZGVjbHM6OSx2YXJzOjgsY29uc3RzOltbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwibWF0LWVsZXZhdGlvbi16NiJdLFsxLCJtZGMtY2FyZCJdLFszLCJlbWl0VG90YWwiLCJlbWl0UHJvZHVjdENvdW50IiwiYWxsb3dFZGl0Il0sWyJpZCIsImNoZWNrb3V0QnV0dG9uIiwiY29sb3IiLCJwcmltYXJ5IiwibWF0LXJhaXNlZC1idXR0b24iLCIiLDEsImNoZWNrb3V0LWJ1dHRvbiIsMywiY2xpY2siLCJkaXNhYmxlZCJdLFsxLCJmYXMiLCJmYS1jYXJ0LWFycm93LWRvd24iXSxbInRyYW5zbGF0ZSIsIiIsMSwiaGludCIsMywidHJhbnNsYXRlUGFyYW1zIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYXQtY2FyZCIsMCkoMSwiZGl2IiwxKSgyLCJhcHAtcHVyY2hhc2UtYmFza2V0IiwyKSxTKCJlbWl0VG90YWwiLGZ1bmN0aW9uKG8pe3JldHVybiBhLmdldEJvbnVzUG9pbnRzKG8pfSkoImVtaXRQcm9kdWN0Q291bnQiLGZ1bmN0aW9uKG8pe3JldHVybiBhLmdldFByb2R1Y3RDb3VudChvKX0pLHMoKSxjKDMsImJ1dHRvbiIsMyksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIGEuY2hlY2tvdXQoKX0pLHUoNCwiaSIsNCksbSg1KSxiKDYsInRyYW5zbGF0ZSIpLHMoKSxjKDcsImRpdiIsNSksbSg4LCJDSEVDS09VVF9GT1JfQk9OVVNfUE9JTlRTIikscygpKCkoKSksaSYyJiYobCgyKSxmKCJhbGxvd0VkaXQiLCEwKSxsKCksZigiZGlzYWJsZWQiLGEucHJvZHVjdENvdW50PDEpLGwoMiksRSgiICIsQyg2LDQsIkJUTl9DSEVDS09VVCIpLCIgIiksbCgyKSxmKCJ0cmFuc2xhdGVQYXJhbXMiLGJ0KDYsTUgsYS5ib251cykpKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxLYyxvZSxsZSxZLFNlLEtdLHN0eWxlczpbYC5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde21pbi13aWR0aDo0MjBweDt3aWR0aDo0MCV9bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tcmlnaHQ6MjAlfS5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDAwMDAyMTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3BhZGRpbmc6LjYyNXJlbSAxLjI1cmVtfS5tYXQtbWRjLXJvd1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206LjYyNXJlbX0ubWF0LWNvbHVtbi1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY29sdW1uLWJvbnVzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jb2x1bW4tcHJpY2VbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0OjEuMjVyZW19bWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6MXJlbTt3aWR0aDoxMDAlfW1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206MS4yNXJlbX0jY2hlY2tvdXRCdXR0b25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tdG9wOjJyZW07d2lkdGg6NjAlfS5oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7Zm9udC1zaXplOjEzcHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW4tdG9wOi4yNXJlbX0ucGF5bWVudC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy10b3A6LjYyNXJlbX1AbWVkaWEgKG1heC13aWR0aDogNTk5Ljk4cHgpe21hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjIuNXJlbTttYXJnaW4tbGVmdDoxcmVtO21hcmdpbi1yaWdodDoxcmVtfX0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIGdvLFhjPXgoKCk9PntrKCk7V3QoKTtOdCgpO2x0KCk7aygpO2dvPSgoKT0+e2NsYXNzIHR7aHR0cD1oKEFlKTtob3N0U2VydmVyPXVlLmhvc3RTZXJ2ZXI7aG9zdD10aGlzLmhvc3RTZXJ2ZXIrIi9yZXN0L3RyYWNrLW9yZGVyIjtmaW5kKGUpe3JldHVybiBlPWVuY29kZVVSSUNvbXBvbmVudChlKSx0aGlzLmh0dHAuZ2V0KGAke3RoaXMuaG9zdH0vJHtlfWApLnBpcGUocShpPT5pKSxqKGk9Pnt0aHJvdyBpfSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gU0godCxuKXt0JjEmJihjKDAsInNwYW4iKSx1KDEsImkiLDI2KSxzKCkpfWZ1bmN0aW9uIGtIKHQsbil7dCYxJiYoYygwLCJzcGFuIiksdSgxLCJpIiwyNykscygpKX1mdW5jdGlvbiB6SCh0LG4pe3QmMSYmKGMoMCwic3BhbiIpLHUoMSwiaSIsMjgpLHMoKSl9ZnVuY3Rpb24gVEgodCxuKXt0JjEmJihjKDAsInNwYW4iKSx1KDEsImkiLDI5KSxzKCkpfWZ1bmN0aW9uIEVIKHQsbil7dCYxJiYoYygwLCJzcGFuIiksdSgxLCJpIiwzMCkscygpKX1mdW5jdGlvbiBBSCh0LG4pe3QmMSYmKGMoMCwic3BhbiIpLHUoMSwiaSIsMzEpLHMoKSl9ZnVuY3Rpb24gREgodCxuKXtpZih0JjEmJihjKDAsInNwYW4iLDgpKDEsInNwYW4iKSx1KDIsImkiLDMyKSxzKCksYygzLCJzcGFuIiwzMyksbSg0KSxiKDUsInRyYW5zbGF0ZSIpLHMoKSgpKSx0JjIpe2xldCBlPXYoKTtsKDQpLE8xKCIiLGUucmVzdWx0cy5ldGEsIiAiLEMoNSwyLCJMQUJFTF9EQVlTIikpfX1mdW5jdGlvbiBJSCh0LG4pe2lmKHQmMSYmKGMoMCwic3BhbiIsOCkoMSwic3BhbiIpLHUoMiwiaSIsMzQpLHMoKSxjKDMsInNwYW4iLDMzKSxtKDQpLGIoNSwidHJhbnNsYXRlIikscygpKCkpLHQmMil7bGV0IGU9digpO2woNCksTzEoIiIsZS5yZXN1bHRzLmV0YSwiICIsQyg1LDIsIkxBQkVMX0RBWVMiKSl9fWZ1bmN0aW9uIExIKHQsbil7dCYxJiYoYygwLCJtYXQtaGVhZGVyLWNlbGwiLDMpLG0oMSwiTEFCRUxfUFJPRFVDVCIpLHMoKSl9ZnVuY3Rpb24gUEgodCxuKXtpZih0JjEmJihjKDAsIm1hdC1jZWxsIiwzNSksbSgxKSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgpLEUoIiAiLGUubmFtZSl9fWZ1bmN0aW9uIFZIKHQsbil7dCYxJiYoYygwLCJtYXQtaGVhZGVyLWNlbGwiLDMpLG0oMSwiTEFCRUxfUFJJQ0UiKSxzKCkpfWZ1bmN0aW9uIE9IKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIsMzYpLG0oMSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxFKCIgIixlLnByaWNlLCJceEE0Iil9fWZ1bmN0aW9uIEhIKHQsbil7dCYxJiYoYygwLCJtYXQtaGVhZGVyLWNlbGwiLDMpLG0oMSwiTEFCRUxfUVVBTlRJVFkiKSxzKCkpfWZ1bmN0aW9uIE5IKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIsMzcpLG0oMSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxFKCIgIixlLnF1YW50aXR5KX19ZnVuY3Rpb24gUkgodCxuKXt0JjEmJihjKDAsIm1hdC1oZWFkZXItY2VsbCIsMyksbSgxLCJMQUJFTF9UT1RBTF9QUklDRSIpLHMoKSl9ZnVuY3Rpb24gRkgodCxuKXtpZih0JjEmJihjKDAsIm1hdC1jZWxsIiwzOCksbSgxKSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgpLEUoIiAiLGUudG90YWwsIlx4QTQiKX19ZnVuY3Rpb24gQkgodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1yb3ciKX1mdW5jdGlvbiBVSCh0LG4pe3QmMSYmdSgwLCJtYXQtcm93Iil9dmFyIHdILHRyLGE3LGNfPXgoKCk9PntwMSgpO00yKCk7aygpO1hjKCk7aGEoKTtZdCgpO3IxKCk7VygpO2hlKCk7aygpO2hlKCk7VygpO3dIPXQ9Pih7Ym9udXM6dH0pO0xlLmFkZChFZixtZixDZix2MyxwMyk7dHI9KGZ1bmN0aW9uKHQpe3JldHVybiB0W3QuTmV3PTBdPSJOZXciLHRbdC5QYWNraW5nPTFdPSJQYWNraW5nIix0W3QuVHJhbnNpdD0yXT0iVHJhbnNpdCIsdFt0LkRlbGl2ZXJlZD0zXT0iRGVsaXZlcmVkIix0fSkodHJ8fHt9KSxhNz0oKCk9PntjbGFzcyB0e3JvdXRlPWgoJDEpO3RyYWNrT3JkZXJTZXJ2aWNlPWgoZ28pO3Nhbml0aXplcj1oKFoxKTtkaXNwbGF5ZWRDb2x1bW5zPVsicHJvZHVjdCIsInByaWNlIiwicXVhbnRpdHkiLCJ0b3RhbCBwcmljZSJdO2RhdGFTb3VyY2U9bmV3IEkxO29yZGVySWQ7cmVzdWx0cz17fTtzdGF0dXM9dHIuTmV3O1N0YXR1cz10cjtuZ09uSW5pdCgpe3RoaXMub3JkZXJJZD10aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLmlkLHRoaXMudHJhY2tPcmRlclNlcnZpY2UuZmluZCh0aGlzLm9yZGVySWQpLnN1YnNjcmliZShlPT57dGhpcy5yZXN1bHRzLm9yZGVyTm89dGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoYDxjb2RlPiR7ZS5kYXRhWzBdLm9yZGVySWR9PC9jb2RlPmApLHRoaXMucmVzdWx0cy5lbWFpbD1lLmRhdGFbMF0uZW1haWwsdGhpcy5yZXN1bHRzLnRvdGFsUHJpY2U9ZS5kYXRhWzBdLnRvdGFsUHJpY2UsdGhpcy5yZXN1bHRzLnByb2R1Y3RzPWUuZGF0YVswXS5wcm9kdWN0cyx0aGlzLnJlc3VsdHMuZXRhPWUuZGF0YVswXS5ldGEhPT12b2lkIDA/ZS5kYXRhWzBdLmV0YToiPyIsdGhpcy5yZXN1bHRzLmJvbnVzPWUuZGF0YVswXS5ib251cyx0aGlzLmRhdGFTb3VyY2UuZGF0YT10aGlzLnJlc3VsdHMucHJvZHVjdHMsZS5kYXRhWzBdLmRlbGl2ZXJlZD90aGlzLnN0YXR1cz10ci5EZWxpdmVyZWQ6dGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnR5cGU/dGhpcy5zdGF0dXM9dHIuTmV3OnRoaXMucmVzdWx0cy5ldGE+Mj90aGlzLnN0YXR1cz10ci5QYWNraW5nOnRoaXMuc3RhdHVzPXRyLlRyYW5zaXR9KX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtdHJhY2stcmVzdWx0Il1dLGRlY2xzOjQ5LHZhcnM6MTQsY29uc3RzOltbInRhYmxlIiwiIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1lbGV2YXRpb24tejYiLCJtYXQtb3duLWNhcmQiXSxbMSwibWRjLWNhcmQiXSxbInRyYW5zbGF0ZSIsIiJdLFszLCJpbm5lckh0bWwiXSxbMSwiZGVsaXZlcnktc3RhdHVzIl0sWzEsImNvbnRhaW5lci1mbHVpZCIsIndlbGwiXSxbMSwicm93IiwiZmEtNHgiXSxbMSwiZmEtbGF5ZXJzIiwiZmEtZnciXSxbMSwidGFibGUtd3JhcHBlciJdLFsxLCJ0YWJsZS1oZWFkaW5nIiwiaGVhZGluZyJdLFsxLCJtZGMtdGFibGUiXSxbMSwibWF0LWVsZXZhdGlvbi16MCIsMywiZGF0YVNvdXJjZSJdLFsibWF0Q29sdW1uRGVmIiwicHJvZHVjdCJdLFsidHJhbnNsYXRlIiwiIiw0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWyJjbGFzcyIsInByb2R1Y3QtbmFtZSIsNCwibWF0Q2VsbERlZiJdLFsibWF0Q29sdW1uRGVmIiwicHJpY2UiXSxbImNsYXNzIiwicHJvZHVjdC1wcmljZSIsNCwibWF0Q2VsbERlZiJdLFsibWF0Q29sdW1uRGVmIiwicXVhbnRpdHkiXSxbImNsYXNzIiwicHJvZHVjdC1xdWFudGl0eSIsNCwibWF0Q2VsbERlZiJdLFsibWF0Q29sdW1uRGVmIiwidG90YWwgcHJpY2UiXSxbImNsYXNzIiwicHJvZHVjdC10b3RhbCIsNCwibWF0Q2VsbERlZiJdLFs0LCJtYXRIZWFkZXJSb3dEZWYiXSxbNCwibWF0Um93RGVmIiwibWF0Um93RGVmQ29sdW1ucyJdLFsxLCJib251cy1jb250YWluZXIiXSxbInRyYW5zbGF0ZSIsIiIsMywidHJhbnNsYXRlUGFyYW1zIl0sWzEsImZhcyIsImZhLXdhcmVob3VzZSIsImNvbmZpcm1hdGlvbiJdLFsxLCJmYXMiLCJmYS13YXJlaG91c2UiXSxbMSwiZmFzIiwiZmEtdHJ1Y2stbG9hZGluZyIsImNvbmZpcm1hdGlvbiJdLFsxLCJmYXMiLCJmYS10cnVjay1sb2FkaW5nIl0sWzEsImZhcyIsImZhLXRydWNrIiwiY29uZmlybWF0aW9uIl0sWzEsImZhcyIsImZhLXRydWNrIl0sWzEsImZhcyIsImZhLWhvbWUiLCJjb25maXJtYXRpb24iXSxbMSwiZmEtbGF5ZXJzLWNvdW50ZXIiLCJhY2NlbnQtbm90aWZpY2F0aW9uIiwiZXRhLWJhZGdlIl0sWzEsImZhcyIsImZhLWhvbWUiXSxbMSwicHJvZHVjdC1uYW1lIl0sWzEsInByb2R1Y3QtcHJpY2UiXSxbMSwicHJvZHVjdC1xdWFudGl0eSJdLFsxLCJwcm9kdWN0LXRvdGFsIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYXQtY2FyZCIsMSkoMSwiZGl2IiwyKSgyLCJoMSIpKDMsInNwYW4iLDMpLG0oNCwiVElUTEVfU0VBUkNIX1JFU1VMVFMiKSxzKCksbSg1LCIgLSAiKSx1KDYsInNwYW4iLDQpLHMoKSxjKDcsImRpdiIsNSkoOCwiaDMiLDMpLG0oOSwiTEFCRUxfRVhQRUNURURfREVMSVZFUlkiKSxzKCksYygxMCwiZGl2Iiw2KSgxMSwiZGl2Iiw3KSxNKDEyLFNILDIsMCwic3BhbiIpKDEzLGtILDIsMCwic3BhbiIpLE0oMTQsekgsMiwwLCJzcGFuIikoMTUsVEgsMiwwLCJzcGFuIiksTSgxNixFSCwyLDAsInNwYW4iKSgxNyxBSCwyLDAsInNwYW4iKSxNKDE4LERILDYsNCwic3BhbiIsOCkoMTksSUgsNiw0LCJzcGFuIiw4KSxzKCkoKSgpLGMoMjAsImRpdiIsOSkoMjEsImRpdiIsMTApKDIyLCJoMiIsMyksbSgyMywiTEFCRUxfUFJPRFVDVF9PUkRFUkVEIikscygpKCkoKSxjKDI0LCJkaXYiLDExKSgyNSwibWF0LXRhYmxlIiwxMiwwKSxfZSgyNywxMyksUigyOCxMSCwyLDAsIm1hdC1oZWFkZXItY2VsbCIsMTQpKDI5LFBILDIsMSwibWF0LWNlbGwiLDE1KSxiZSgpLF9lKDMwLDE2KSxSKDMxLFZILDIsMCwibWF0LWhlYWRlci1jZWxsIiwxNCkoMzIsT0gsMiwxLCJtYXQtY2VsbCIsMTcpLGJlKCksX2UoMzMsMTgpLFIoMzQsSEgsMiwwLCJtYXQtaGVhZGVyLWNlbGwiLDE0KSgzNSxOSCwyLDEsIm1hdC1jZWxsIiwxOSksYmUoKSxfZSgzNiwyMCksUigzNyxSSCwyLDAsIm1hdC1oZWFkZXItY2VsbCIsMTQpKDM4LEZILDIsMSwibWF0LWNlbGwiLDIxKSxiZSgpLFIoMzksQkgsMSwwLCJtYXQtaGVhZGVyLXJvdyIsMjIpKDQwLFVILDEsMCwibWF0LXJvdyIsMjMpLHMoKSgpLGMoNDEsImRpdiIsMjQpKDQyLCJoMiIsMjUpLG0oNDMsIkJPTlVTX1BPSU5UU19FQVJORUQiKSxzKCksYyg0NCwicCIpLG0oNDUsIigiKSx1KDQ2LCJzcGFuIiw0KSxiKDQ3LCJ0cmFuc2xhdGUiKSxtKDQ4LCIpIikscygpKCkoKSgpKSxpJjImJihsKDYpLGYoImlubmVySHRtbCIsYS5yZXN1bHRzLm9yZGVyTm8sdHQpLGwoNiksdyhhLnN0YXR1cz09PWEuU3RhdHVzLk5ldz8xMjoxMyksbCgyKSx3KGEuc3RhdHVzPT09YS5TdGF0dXMuUGFja2luZz8xNDoxNSksbCgyKSx3KGEuc3RhdHVzPT09YS5TdGF0dXMuVHJhbnNpdD8xNjoxNyksbCgyKSx3KGEuc3RhdHVzPT09YS5TdGF0dXMuRGVsaXZlcmVkPzE4OjE5KSxsKDcpLGYoImRhdGFTb3VyY2UiLGEuZGF0YVNvdXJjZSksbCgxNCksZigibWF0SGVhZGVyUm93RGVmIixhLmRpc3BsYXllZENvbHVtbnMpLGwoKSxmKCJtYXRSb3dEZWZDb2x1bW5zIixhLmRpc3BsYXllZENvbHVtbnMpLGwoMiksZigidHJhbnNsYXRlUGFyYW1zIixidCgxMix3SCxhLnJlc3VsdHMuYm9udXMpKSxsKDQpLGYoImlubmVySHRtbCIsQyg0NywxMCwiQk9OVVNfRk9SX0ZVVFVSRV9QVVJDSEFTRVMiKSx0dCkpfSxkZXBlbmRlbmNpZXM6W2RlLHBlLFksU2UsdGksbmksYWkscmksaWksb2ksY2ksbGksc2ksZGksS10sc3R5bGVzOltgbWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6MH0ubWRjLXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1zZWxmOmNlbnRlcjttYXJnaW46MCBhdXRvO3dpZHRoOjkwJX0uaGVhZGluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwMztoZWlnaHQ6MzVweDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3BhZGRpbmc6MCAxLjI1cmVtO3dpZHRoOjkwJX0ucHJvZHVjdC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tcmlnaHQ6MS41cmVtfS50YWJsZS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW4tdG9wOjJyZW19LnRhYmxlLWhlYWRpbmdbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206MH0ucm93LmZhLTR4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHN2Z1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXJpZ2h0Oi42MjVyZW19Lm1hdC1vd24tY2FyZFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9jazttYXJnaW4tbGVmdDoyMCU7bWFyZ2luLXJpZ2h0OjIwJX0uYm9udXMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWFyZ2luLXRvcDouNjI1cmVtO3BsYWNlLWNvbnRlbnQ6c3RyZXRjaCBjZW50ZXJ9LmJvbnVzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjA7cGFkZGluZzowfS5kZWxpdmVyeS1zdGF0dXNbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246Y2VudGVyfS5ldGEtYmFkZ2VbX25nY29udGVudC0lQ09NUCVde3dpZHRoOm1heC1jb250ZW50fUBtZWRpYSAobWF4LXdpZHRoOiA5NTkuOThweCl7Lm1hdC1jb2x1bW4tcHJpY2VbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX19CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO3ZhciBzbixVND14KCgpPT57TnQoKTtrKCk7V3QoKTtsdCgpO2soKTtzbj0oKCk9PntjbGFzcyB0e2h0dHA9aChBZSk7aG9zdFNlcnZlcj11ZS5ob3N0U2VydmVyO2hvc3Q9dGhpcy5ob3N0U2VydmVyKyIvYXBpL0ZlZWRiYWNrcyI7ZmluZChlKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmhvc3QrIi8iLHtwYXJhbXM6ZX0pLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9c2F2ZShlKXtyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5ob3N0KyIvIixlKS5waXBlKHEoaT0+aS5kYXRhKSxqKGk9Pnt0aHJvdyBpfSkpfWRlbChlKXtyZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShgJHt0aGlzLmhvc3R9LyR7ZX1gKS5waXBlKHEoaT0+aS5kYXRhKSxqKGk9Pnt0aHJvdyBpfSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIHR9KSgpfSk7dmFyIEpjLG43PXgoKCk9PntXdCgpO050KCk7aygpO2x0KCk7aygpO0pjPSgoKT0+e2NsYXNzIHR7aHR0cD1oKEFlKTtob3N0U2VydmVyPXVlLmhvc3RTZXJ2ZXI7aG9zdD10aGlzLmhvc3RTZXJ2ZXIrIi9yZXN0L2NhcHRjaGEiO2dldENhcHRjaGEoKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmhvc3QrIi8iKS5waXBlKGooZT0+e3Rocm93IGV9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTt2YXIgVGksRGE9eCgoKT0+e2soKTthMSgpO2soKTtUaT0oKCk9PntjbGFzcyB0e19kb2N1bWVudD1oKGp0KTthdHRhY2hFbnRlcktleUhhbmRsZXIoZSxpLGEpe2xldCByPXRoaXMuX2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLG89dGhpcy5fZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaSk7ci5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsZnVuY3Rpb24oZCl7ZC5wcmV2ZW50RGVmYXVsdCgpLGQua2V5Q29kZT09PTEzJiYhby5kaXNhYmxlZCYmYSgpfSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBxSCh0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiw0KSxtKDEsIk1BTkRBVE9SWV9DT01NRU5UICIpLHMoKSl9ZnVuY3Rpb24gR0godCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsNCksbSgxLCJNQU5EQVRPUllfQ0FQVENIQSAiKSxzKCkpfWZ1bmN0aW9uIFdIKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiLDQpLG0oMSwiSU5WQUxJRF9DQVBUQ0hBICIpLHMoKSl9dmFyIGpILHNfLGxfPXgoKCk9PntVNCgpO243KCk7RjEoKTtXZSgpO2soKTtZdCgpO3IxKCk7RGEoKTtXKCk7SjEoKTtuZSgpO1UzKCk7ZXQoKTtKZSgpO2hlKCk7dmUoKTtrKCk7aGUoKTtXKCk7V2UoKTtKZSgpO2V0KCk7VTMoKTtuZSgpO3ZlKCk7akg9KCk9Pih7bGVuZ3RoOiIxNjAifSk7TGUuYWRkKHUzLG5hKTtzXz0oKCk9PntjbGFzcyB0e3VzZXJTZXJ2aWNlPWgoQXQpO2NhcHRjaGFTZXJ2aWNlPWgoSmMpO2ZlZWRiYWNrU2VydmljZT1oKHNuKTtmb3JtU3VibWl0U2VydmljZT1oKFRpKTt0cmFuc2xhdGU9aChJdCk7c25hY2tCYXJIZWxwZXJTZXJ2aWNlPWgoVnQpO2F1dGhvckNvbnRyb2w9bmV3IGtlKHt2YWx1ZToiIixkaXNhYmxlZDohMH0sW10pO2ZlZWRiYWNrQ29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWQsSi5tYXhMZW5ndGgoMTYwKV0pO2NhcHRjaGFDb250cm9sPW5ldyBrZSgiIixbSi5yZXF1aXJlZCxKLnBhdHRlcm4oIi0/W1xcZF0qIildKTt1c2VySWRDb250cm9sPW5ldyBrZSgiIixbXSk7cmF0aW5nPTA7ZmVlZGJhY2s9dm9pZCAwO2NhcHRjaGE7Y2FwdGNoYUlkO2NvbmZpcm1hdGlvbjtlcnJvcjtuZ09uSW5pdCgpe3RoaXMudXNlclNlcnZpY2Uud2hvQW1JKFsiaWQiLCJlbWFpbCJdKS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMuZmVlZGJhY2s9e30sdGhpcy51c2VySWRDb250cm9sLnNldFZhbHVlKGUuaWQpLHRoaXMuZmVlZGJhY2suVXNlcklkPWUuaWQsdGhpcy5hdXRob3JDb250cm9sLnNldFZhbHVlKGUuZW1haWw/YCoqKiR7ZS5lbWFpbC5zbGljZSgzKX1gOiJhbm9ueW1vdXMiKX0sZXJyb3I6ZT0+e3RoaXMuZmVlZGJhY2s9dm9pZCAwLGNvbnNvbGUubG9nKGUpfX0pLHRoaXMuZ2V0TmV3Q2FwdGNoYSgpLHRoaXMuZm9ybVN1Ym1pdFNlcnZpY2UuYXR0YWNoRW50ZXJLZXlIYW5kbGVyKCJmZWVkYmFjay1mb3JtIiwic3VibWl0QnV0dG9uIiwoKT0+e3RoaXMuc2F2ZSgpfSl9Z2V0TmV3Q2FwdGNoYSgpe3RoaXMuY2FwdGNoYVNlcnZpY2UuZ2V0Q2FwdGNoYSgpLnN1YnNjcmliZSh7bmV4dDplPT57dGhpcy5jYXB0Y2hhPWUuY2FwdGNoYSx0aGlzLmNhcHRjaGFJZD1lLmNhcHRjaGFJZH0sZXJyb3I6ZT0+ZX0pfXNhdmUoKXt0aGlzLmZlZWRiYWNrLmNhcHRjaGFJZD10aGlzLmNhcHRjaGFJZCx0aGlzLmZlZWRiYWNrLmNhcHRjaGE9dGhpcy5jYXB0Y2hhQ29udHJvbC52YWx1ZSx0aGlzLmZlZWRiYWNrLmNvbW1lbnQ9YCR7dGhpcy5mZWVkYmFja0NvbnRyb2wudmFsdWV9ICgke3RoaXMuYXV0aG9yQ29udHJvbC52YWx1ZX0pYCx0aGlzLmZlZWRiYWNrLnJhdGluZz10aGlzLnJhdGluZyx0aGlzLmZlZWRiYWNrLlVzZXJJZD10aGlzLnVzZXJJZENvbnRyb2wudmFsdWUsdGhpcy5mZWVkYmFja1NlcnZpY2Uuc2F2ZSh0aGlzLmZlZWRiYWNrKS5zdWJzY3JpYmUoe25leHQ6ZT0+e2UucmF0aW5nPT09NT90aGlzLnRyYW5zbGF0ZS5nZXQoIkZFRURCQUNLX0ZJVkVfU1RBUl9USEFOS19ZT1UiKS5zdWJzY3JpYmUoe25leHQ6aT0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oaSl9LGVycm9yOmk9Pnt0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKGkpfX0pOnRoaXMudHJhbnNsYXRlLmdldCgiRkVFREJBQ0tfVEhBTktfWU9VIikuc3Vic2NyaWJlKHtuZXh0Omk9Pnt0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKGkpfSxlcnJvcjppPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihpKX19KSx0aGlzLmZlZWRiYWNrPXt9LHRoaXMubmdPbkluaXQoKSx0aGlzLnJlc2V0Rm9ybSgpfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSksdGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihlLmVycm9yLCJlcnJvckJhciIpLHRoaXMuZmVlZGJhY2s9e30sdGhpcy5yZXNldENhcHRjaGEoKX19KX1yZXNldEZvcm0oKXt0aGlzLmF1dGhvckNvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5hdXRob3JDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5hdXRob3JDb250cm9sLnNldFZhbHVlKCIiKSx0aGlzLmZlZWRiYWNrQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKSx0aGlzLmZlZWRiYWNrQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMuZmVlZGJhY2tDb250cm9sLnNldFZhbHVlKCIiKSx0aGlzLnJhdGluZz0wLHRoaXMuY2FwdGNoYUNvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5jYXB0Y2hhQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMuY2FwdGNoYUNvbnRyb2wuc2V0VmFsdWUoIiIpfXJlc2V0Q2FwdGNoYSgpe3RoaXMuY2FwdGNoYUNvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5jYXB0Y2hhQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMuY2FwdGNoYUNvbnRyb2wuc2V0VmFsdWUoIiIpfWZvcm1hdFJhdGluZyhlKXtyZXR1cm5gJHtlfVx1MjYwNWB9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLWNvbnRhY3QiXV0sZGVjbHM6NTQsdmFyczoyOCxjb25zdHM6W1siY29tbWVudCIsIiJdLFsxLCJjZW50ZXItY29udGFpbmVyIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1lbGV2YXRpb24tejYiXSxbMSwibWRjLWNhcmQiXSxbInRyYW5zbGF0ZSIsIiJdLFsiaWQiLCJmZWVkYmFjay1mb3JtIiwxLCJmb3JtLWNvbnRhaW5lciJdLFsiaGlkZGVuIiwiIiwidHlwZSIsInRleHQiLCJpZCIsInVzZXJJZCIsIm5nRGVmYXVsdENvbnRyb2wiLCIiLDMsImZvcm1Db250cm9sIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZSIsImNvbG9yIiwiYWNjZW50Il0sWyJuZ0RlZmF1bHRDb250cm9sIiwiIiwibWF0SW5wdXQiLCIiLCJ0eXBlIiwidGV4dCIsImFyaWEtbGFiZWwiLCJGaWVsZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBhdXRob3IiLDMsImZvcm1Db250cm9sIl0sWzEsImZhcyIsImZhLWV4Y2xhbWF0aW9uLWNpcmNsZSJdLFsidHJhbnNsYXRlIiwiIiwxLCJmZWVkYmFjay1oaW50Il0sWyJpZCIsImNvbW1lbnQiLCJuZ0RlZmF1bHRDb250cm9sIiwiIiwibWF0SW5wdXQiLCIiLCJtYXRBdXRvc2l6ZU1pblJvd3MiLCI0IiwibWF0QXV0b3NpemVNYXhSb3dzIiwiNCIsIm1hdFRleHRhcmVhQXV0b3NpemUiLCIiLCJjb2xzIiwiNTAiLCJtYXhsZW5ndGgiLCIxNjAiLCJhcmlhLWxhYmVsIiwiRmllbGQgZm9yIGVudGVyaW5nIHRoZSBjb21tZW50IG9yIHRoZSBmZWVkYmFjayIsMywiZm9ybUNvbnRyb2wiLCJwbGFjZWhvbGRlciJdLFsiYWxpZ24iLCJlbmQiXSxbMSwicmF0aW5nLWNvbnRhaW5lciJdLFsidHJhbnNsYXRlIiwiIiwxLCJyYXRpbmctbGFiZWwiXSxbImlkIiwicmF0aW5nIiwibWluIiwiMSIsIm1heCIsIjUiLCJzdGVwIiwiMSIsInNob3dUaWNrTWFya3MiLCIiLCJkaXNjcmV0ZSIsIiIsImFyaWEtbGFiZWwiLCJTbGlkZXIgZm9yIHNlbGVjdGluZyB0aGUgc3RhciByYXRpbmciLDMsImRpc3BsYXlXaXRoIl0sWyJtYXRTbGlkZXJUaHVtYiIsIiIsMywibmdNb2RlbENoYW5nZSIsIm5nTW9kZWwiXSxbMSwiY2FwdGNoYS1pbmZvIl0sWzEsImNhcHRjaGEtbGFiZWwiXSxbInRyYW5zbGF0ZSIsIiIsMSwiY2FwdGNoYS1ub3RlIl0sWyJpZCIsImNhcHRjaGEiLCJhcmlhLWxhYmVsIiwiQ0FQVENIQSBjb2RlIHdoaWNoIG11c3QgYmUgc29sdmVkIl0sWzEsImNhcHRjaGEtbm90ZSJdLFsiaWQiLCJjYXB0Y2hhQ29udHJvbCIsIm5nRGVmYXVsdENvbnRyb2wiLCIiLCJtYXRJbnB1dCIsIiIsInR5cGUiLCJ0ZXh0IiwiYXJpYS1sYWJlbCIsIkZpZWxkIGZvciB0aGUgcmVzdWx0IG9mIHRoZSBDQVBUQ0hBIGNvZGUiLCJwYXR0ZXJuIiwiLT9bXFxkXSoiLDMsImZvcm1Db250cm9sIiwicGxhY2Vob2xkZXIiXSxbInR5cGUiLCJzdWJtaXQiLCJpZCIsInN1Ym1pdEJ1dHRvbiIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiY29sb3IiLCJwcmltYXJ5IiwiYXJpYS1sYWJlbCIsIkJ1dHRvbiB0byBzZW5kIHRoZSByZXZpZXciLDMsImNsaWNrIiwiZGlzYWJsZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtjKDAsImRpdiIsMSkoMSwibWF0LWNhcmQiLDIpKDIsImRpdiIsMykoMywiaDEiLDQpLG0oNCwiU0VDVElPTl9DVVNUT01FUl9GRUVEQkFDSyIpLHMoKSxjKDUsImRpdiIsNSksdSg2LCJpbnB1dCIsNiksYyg3LCJtYXQtZm9ybS1maWVsZCIsNykoOCwibWF0LWxhYmVsIiw0KSxtKDksIkxBQkVMX0FVVEhPUiIpLHMoKSx1KDEwLCJpbnB1dCIsOCkscygpLGMoMTEsIm1hdC1mb3JtLWZpZWxkIiw3KSgxMiwibWF0LWxhYmVsIiw0KSxtKDEzLCJMQUJFTF9DT01NRU5UIikscygpLGMoMTQsIm1hdC1oaW50Iiw0KSx1KDE1LCJpIiw5KSxjKDE2LCJlbSIsMTApLG0oMTcpLGIoMTgsInRyYW5zbGF0ZSIpLHMoKSgpLHUoMTksInRleHRhcmVhIiwxMSwwKSxiKDIxLCJ0cmFuc2xhdGUiKSxjKDIyLCJtYXQtaGludCIsMTIpLG0oMjMpLHMoKSxNKDI0LHFILDIsMCwibWF0LWVycm9yIiw0KSxzKCksYygyNSwiZGl2IiwxMykoMjYsImxhYmVsIiwxNCksbSgyNywiTEFCRUxfUkFUSU5HIikscygpLGMoMjgsIm1hdC1zbGlkZXIiLDE1KSgyOSwiaW5wdXQiLDE2KSxGaSgibmdNb2RlbENoYW5nZSIsZnVuY3Rpb24oZCl7cmV0dXJuIHoociksUmkoYS5yYXRpbmcsZCl8fChhLnJhdGluZz1kKSxUKGQpfSkscygpKCkoKSxjKDMwLCJkaXYiLDE3KSgzMSwibGFiZWwiLDE4KSxtKDMyLCJDQVBUQ0hBOiIpLHMoKSxtKDMzLCJceEEwXHhBMCAiKSxjKDM0LCJzcGFuIiwxOSksbSgzNSwiTEFCRUxfV0hBVF9JUyIpLHMoKSxtKDM2LCJceEEwICIpLGMoMzcsImNvZGUiLDIwKSxtKDM4KSxzKCksbSgzOSwiXHhBMCAiKSxjKDQwLCJsYWJlbCIsMjEpLG0oNDEsIj8iKSxzKCkoKSxjKDQyLCJtYXQtZm9ybS1maWVsZCIsNykoNDMsIm1hdC1sYWJlbCIsNCksbSg0NCwiTEFCRUxfUkVTVUxUIikscygpLHUoNDUsImlucHV0IiwyMiksYig0NiwidHJhbnNsYXRlIiksTSg0NyxHSCwyLDAsIm1hdC1lcnJvciIsNCksTSg0OCxXSCwyLDAsIm1hdC1lcnJvciIsNCkscygpKCksYyg0OSwiYnV0dG9uIiwyMyksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLnNhdmUoKSl9KSxjKDUwLCJtYXQtaWNvbiIpLG0oNTEsInNlbmQiKSxzKCksbSg1MiksYig1MywidHJhbnNsYXRlIikscygpKCkoKSgpfWlmKGkmMil7bGV0IHI9c2UoMjApO2woNiksZigiZm9ybUNvbnRyb2wiLGEudXNlcklkQ29udHJvbCksbCg0KSxmKCJmb3JtQ29udHJvbCIsYS5hdXRob3JDb250cm9sKSxsKDcpLEEoZHQoMTgsMTgsIk1BWF9URVhUQVJFQV9MRU5HVEgiLFN0KDI3LGpIKSkpLGwoMiksZigicGxhY2Vob2xkZXIiLFZlKEMoMjEsMjEsIldSSVRFX1JFVklFV19QTEFDRUhPTERFUiIpKSkoImZvcm1Db250cm9sIixhLmZlZWRiYWNrQ29udHJvbCksbCg0KSxFKCIiLChyLnZhbHVlPT1udWxsP251bGw6ci52YWx1ZS5sZW5ndGgpfHwwLCIvMTYwIiksbCgpLHcoYS5mZWVkYmFja0NvbnRyb2wuaW52YWxpZCYmYS5mZWVkYmFja0NvbnRyb2wuZXJyb3JzLnJlcXVpcmVkPzI0Oi0xKSxsKDQpLGYoImRpc3BsYXlXaXRoIixhLmZvcm1hdFJhdGluZyksbCgpLE5pKCJuZ01vZGVsIixhLnJhdGluZyksbCg5KSxBKGEuY2FwdGNoYSksbCg3KSxmKCJwbGFjZWhvbGRlciIsVmUoQyg0NiwyMywiTUFOREFUT1JZX0NBUFRDSEEiKSkpKCJmb3JtQ29udHJvbCIsYS5jYXB0Y2hhQ29udHJvbCksbCgyKSx3KGEuY2FwdGNoYUNvbnRyb2wuaW52YWxpZCYmYS5jYXB0Y2hhQ29udHJvbC5lcnJvcnMucmVxdWlyZWQ/NDc6LTEpLGwoKSx3KGEuY2FwdGNoYUNvbnRyb2wuaW52YWxpZCYmYS5jYXB0Y2hhQ29udHJvbC5lcnJvcnMucGF0dGVybj80ODotMSksbCgpLGYoImRpc2FibGVkIixhLmF1dGhvckNvbnRyb2wuaW52YWxpZHx8YS5mZWVkYmFja0NvbnRyb2wuaW52YWxpZHx8YS5jYXB0Y2hhQ29udHJvbC5pbnZhbGlkfHwhYS5yYXRpbmcpLGwoMyksRSgiICIsQyg1MywyNSwiQlROX1NVQk1JVCIpLCIgIil9fSxkZXBlbmRlbmNpZXM6W2RlLHBlLFksU2UsYXQsZ3QsbXQsTWksenIsZWEsenQsZTEsUWUsWmUsaHQsZjEsUXQsJGUsbnQsQjMsVnUsTDgsb2UsbGUsZ2UsQ2UsS10sc3R5bGVzOltgbWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDphdXRvO21pbi13aWR0aDozMjBweDt3aWR0aDozMCV9LmZvcm0tY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3Bvc2l0aW9uOnJlbGF0aXZlfS5mZWVkYmFjay1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDouMjVyZW19LnJhdGluZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7bWFyZ2luLWJvdHRvbToxcmVtO21hcmdpbi10b3A6MXJlbX0ucmF0aW5nLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmbG9hdDpsZWZ0O2ZvbnQtd2VpZ2h0OjUwMDttYXJnaW4tcmlnaHQ6LjVyZW19LmNhcHRjaGEtaW5mb1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTouNjI1cmVtO21hcmdpbi10b3A6LjYyNXJlbX0uY2FwdGNoYS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NTAwfS5jYXB0Y2hhLW5vdGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTpzbWFsbH0gIC5tYXQtbWRjLXNsaWRlcnstLW1kYy1zbGlkZXItaGFuZGxlLWNvbG9yOiB2YXIoLS10aGVtZS1hY2NlbnQpOy0tbWRjLXNsaWRlci1mb2N1cy1oYW5kbGUtY29sb3I6IHZhcigtLXRoZW1lLWFjY2VudCk7LS1tZGMtc2xpZGVyLWhvdmVyLWhhbmRsZS1jb2xvcjogdmFyKC0tdGhlbWUtYWNjZW50KTstLW1kYy1zbGlkZXItYWN0aXZlLXRyYWNrLWNvbG9yOiB2YXIoLS10aGVtZS1hY2NlbnQpOy0tbWRjLXNsaWRlci1pbmFjdGl2ZS10cmFjay1jb2xvcjogdmFyKC0tdGhlbWUtYWNjZW50LWZhZGUtMzApOy0tbWRjLXNsaWRlci13aXRoLXRpY2stbWFya3MtYWN0aXZlLWNvbnRhaW5lci1jb2xvcjogdmFyKC0tdGhlbWUtYmFja2dyb3VuZCk7LS1tZGMtc2xpZGVyLXdpdGgtdGljay1tYXJrcy1pbmFjdGl2ZS1jb250YWluZXItY29sb3I6IHZhcigtLXRoZW1lLWJhY2tncm91bmQtZGFya2VyKX0gIC5tYXQtbWRjLXNsaWRlciAubWRjLXNsaWRlcl9fdGh1bWIta25vYntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRoZW1lLWFjY2VudCkhaW1wb3J0YW50O2JvcmRlci1jb2xvcjp2YXIoLS10aGVtZS1hY2NlbnQpIWltcG9ydGFudH0gIC5tYXQtbWRjLXNsaWRlciAubWRjLXNsaWRlcl9fdGljay1tYXJrc3tiYWNrZ3JvdW5kLXNpemU6MjUlIDJweCFpbXBvcnRhbnR9ICAubWF0LW1kYy1zbGlkZXIgLm1kYy1zbGlkZXJfX3RodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6dmFyKC0tdGhlbWUtYWNjZW50KTtjb2xvcjp2YXIoLS10aGVtZS1iYWNrZ3JvdW5kKX1tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtdGV4dC1mYWRlLTQwKTtmb250LXNpemU6Ljg1ZW19LnN0YXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNjOGM4Yzh9LmFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0sIC5zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmdvbGR9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmJye21hcmdpbjowIWltcG9ydGFudH0jc3VibWl0QnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDoyMCU7bWFyZ2luLXRvcDoycmVtO3dpZHRoOjYwJX0uY2VudGVyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6c3RyZXRjaDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcn0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gUUgodCxuKXtpZih0JjEmJnUoMCwiZmlndXJlIiwxMiksdCYyKXtsZXQgZT12KCkuJGltcGxpY2l0O2YoImlubmVySFRNTCIsZT09bnVsbD9udWxsOmUuYXJncyx0dCl9fWZ1bmN0aW9uIFlIKHQsbil7aWYodCYxJiYoX2UoMCksTSgxLFFILDEsMSwiZmlndXJlIiwxMiksYmUoKSksdCYyKXtsZXQgZT1uLmFjdGl2ZTtsKCksdyhlPzE6LTEpfX1mdW5jdGlvbiBaSCh0LG4pe2lmKHQmMSYmKGMoMCwibGkiKSgxLCJhIiwxNSkoMiwiYnV0dG9uIiwxNiksdSgzLCJpIiwxNyksbSg0LCIgQmx1ZVNreSAiKSxzKCkoKSgpKSx0JjIpe2xldCBlPXYoMik7bCgpLGYoImhyZWYiLGUuYmx1ZVNreVVybCx3dCl9fWZ1bmN0aW9uICRIKHQsbil7aWYodCYxJiYoYygwLCJsaSIpKDEsImEiLDE4KSgyLCJidXR0b24iLDE2KSx1KDMsImkiLDE5KSxtKDQsIiBNYXN0b2RvbiAiKSxzKCkoKSgpKSx0JjIpe2xldCBlPXYoMik7bCgpLGYoImhyZWYiLGUubWFzdG9kb25Vcmwsd3QpfX1mdW5jdGlvbiBLSCh0LG4pe2lmKHQmMSYmKGMoMCwibGkiKSgxLCJhIiwyMCkoMiwiYnV0dG9uIiwxNiksdSgzLCJpIiwyMSksbSg0LCIgVHdpdHRlciAiKSxzKCkoKSgpKSx0JjIpe2xldCBlPXYoMik7bCgpLGYoImhyZWYiLGUudHdpdHRlclVybCx3dCl9fWZ1bmN0aW9uIFhIKHQsbil7aWYodCYxJiYoYygwLCJsaSIpKDEsImEiLDIyKSgyLCJidXR0b24iLDE2KSx1KDMsImkiLDIzKSxtKDQsIiBGYWNlYm9vayAiKSxzKCkoKSgpKSx0JjIpe2xldCBlPXYoMik7bCgpLGYoImhyZWYiLGUuZmFjZWJvb2tVcmwsd3QpfX1mdW5jdGlvbiBKSCh0LG4pe2lmKHQmMSYmKGMoMCwibGkiKSgxLCJhIiwyNCkoMiwiYnV0dG9uIiwxNiksdSgzLCJpIiwyNSksbSg0LCIgU2xhY2sgIikscygpKCkoKSksdCYyKXtsZXQgZT12KDIpO2woKSxmKCJocmVmIixlLnNsYWNrVXJsLHd0KX19ZnVuY3Rpb24gZU4odCxuKXtpZih0JjEmJihjKDAsImxpIikoMSwiYSIsMjYpKDIsImJ1dHRvbiIsMTYpLHUoMywiaSIsMjcpLG0oNCwiIFJlZGRpdCAiKSxzKCkoKSgpKSx0JjIpe2xldCBlPXYoMik7bCgpLGYoImhyZWYiLGUucmVkZGl0VXJsLHd0KX19ZnVuY3Rpb24gdE4odCxuKXtpZih0JjEmJihjKDAsImxpIikoMSwiYSIsMjgpKDIsImJ1dHRvbiIsMTYpLHUoMywiaSIsMjkpLG0oNCwiIFByZXNzIEtpdCAiKSxzKCkoKSgpKSx0JjIpe2xldCBlPXYoMik7bCgpLGYoImhyZWYiLGUucHJlc3NLaXRVcmwsd3QpfX1mdW5jdGlvbiBpTih0LG4pe2lmKHQmMSYmKGMoMCwibGkiKSgxLCJhIiwzMCkoMiwiYnV0dG9uIiwxNiksdSgzLCJpIiwzMSksbSg0LCIgTkZUICIpLHMoKSgpKCkpLHQmMil7bGV0IGU9digyKTtsKCksZigiaHJlZiIsZS5uZnRVcmwsd3QpfX1mdW5jdGlvbiBhTih0LG4pe2lmKHQmMSYmKGMoMCwibmF2IiwxMSkoMSwiaDIiLDEzKSxtKDIpLGIoMywidHJhbnNsYXRlIikscygpLGMoNCwidWwiLDE0KSxNKDUsWkgsNSwxLCJsaSIpLE0oNiwkSCw1LDEsImxpIiksTSg3LEtILDUsMSwibGkiKSxNKDgsWEgsNSwxLCJsaSIpLE0oOSxKSCw1LDEsImxpIiksTSgxMCxlTiw1LDEsImxpIiksTSgxMSx0Tiw1LDEsImxpIiksTSgxMixpTiw1LDEsImxpIikscygpKCkpLHQmMil7bGV0IGU9digpO2woMiksQShDKDMsOSwiU0VDVElPTl9TT0NJQUxfTUVESUEiKSksbCgzKSx3KGUuYmx1ZVNreVVybD81Oi0xKSxsKCksdyhlLm1hc3RvZG9uVXJsPzY6LTEpLGwoKSx3KGUudHdpdHRlclVybD83Oi0xKSxsKCksdyhlLmZhY2Vib29rVXJsPzg6LTEpLGwoKSx3KGUuc2xhY2tVcmw/OTotMSksbCgpLHcoZS5yZWRkaXRVcmw/MTA6LTEpLGwoKSx3KGUucHJlc3NLaXRVcmw/MTE6LTEpLGwoKSx3KGUubmZ0VXJsPzEyOi0xKX19dmFyIGRfLG1fPXgoKCk9PntrKCk7aGEoKTtLMSgpO1U0KCk7UzUoKTtZdCgpO2VuKCk7U2EoKTtyMSgpO2x0KCk7WHQoKTtuZSgpO1coKTtoZSgpO2soKTtoZSgpO1coKTtuZSgpO0xlLmFkZChQZixRcixGZixSZixEZixJZix1MyxmMyxOZixWcCk7ZF89KCgpPT57Y2xhc3MgdHtjb25maWd1cmF0aW9uU2VydmljZT1oKEx0KTtmZWVkYmFja1NlcnZpY2U9aChzbik7c2FuaXRpemVyPWgoWjEpO2dhbGxlcnk9aChvbik7Ymx1ZVNreVVybDttYXN0b2RvblVybDt0d2l0dGVyVXJsO2ZhY2Vib29rVXJsO3NsYWNrVXJsO3JlZGRpdFVybDtwcmVzc0tpdFVybDtuZnRVcmw7Z2FsbGVyeVJlZjtpbWFnZXM9WyJhc3NldHMvcHVibGljL2ltYWdlcy9jYXJvdXNlbC8xLmpwZyIsImFzc2V0cy9wdWJsaWMvaW1hZ2VzL2Nhcm91c2VsLzIuanBnIiwiYXNzZXRzL3B1YmxpYy9pbWFnZXMvY2Fyb3VzZWwvMy5qcGciLCJhc3NldHMvcHVibGljL2ltYWdlcy9jYXJvdXNlbC80LmpwZyIsImFzc2V0cy9wdWJsaWMvaW1hZ2VzL2Nhcm91c2VsLzUucG5nIiwiYXNzZXRzL3B1YmxpYy9pbWFnZXMvY2Fyb3VzZWwvNi5qcGciLCJhc3NldHMvcHVibGljL2ltYWdlcy9jYXJvdXNlbC83LmpwZyJdO3N0YXJzPVtudWxsLCc8aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFyIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFyIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFyIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFyIGZhLXN0YXIiPjwvaT4nLCc8aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFyIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFyIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFyIGZhLXN0YXIiPjwvaT4nLCc8aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFyIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFyIGZhLXN0YXIiPjwvaT4nLCc8aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFyIGZhLXN0YXIiPjwvaT4nLCc8aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT48aSBjbGFzcz0iZmFzIGZhLXN0YXIiPjwvaT4nXTtuZ09uSW5pdCgpe3RoaXMuZ2FsbGVyeVJlZj10aGlzLmdhbGxlcnkucmVmKCJmZWVkYmFjay1nYWxsZXJ5IiksdGhpcy5wb3B1bGF0ZVNsaWRlc2hvd0Zyb21GZWVkYmFja3MoKSx0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbigpLnBpcGUoaihlPT4oY29uc29sZS5lcnJvcihlKSxIaSkpKS5zdWJzY3JpYmUoZT0+e2U/LmFwcGxpY2F0aW9uPy5zb2NpYWwmJihlLmFwcGxpY2F0aW9uLnNvY2lhbC5ibHVlU2t5VXJsJiYodGhpcy5ibHVlU2t5VXJsPWUuYXBwbGljYXRpb24uc29jaWFsLmJsdWVTa3lVcmwpLGUuYXBwbGljYXRpb24uc29jaWFsLm1hc3RvZG9uVXJsJiYodGhpcy5tYXN0b2RvblVybD1lLmFwcGxpY2F0aW9uLnNvY2lhbC5tYXN0b2RvblVybCksZS5hcHBsaWNhdGlvbi5zb2NpYWwudHdpdHRlclVybCYmKHRoaXMudHdpdHRlclVybD1lLmFwcGxpY2F0aW9uLnNvY2lhbC50d2l0dGVyVXJsKSxlLmFwcGxpY2F0aW9uLnNvY2lhbC5mYWNlYm9va1VybCYmKHRoaXMuZmFjZWJvb2tVcmw9ZS5hcHBsaWNhdGlvbi5zb2NpYWwuZmFjZWJvb2tVcmwpLGUuYXBwbGljYXRpb24uc29jaWFsLnNsYWNrVXJsJiYodGhpcy5zbGFja1VybD1lLmFwcGxpY2F0aW9uLnNvY2lhbC5zbGFja1VybCksZS5hcHBsaWNhdGlvbi5zb2NpYWwucmVkZGl0VXJsJiYodGhpcy5yZWRkaXRVcmw9ZS5hcHBsaWNhdGlvbi5zb2NpYWwucmVkZGl0VXJsKSxlLmFwcGxpY2F0aW9uLnNvY2lhbC5wcmVzc0tpdFVybCYmKHRoaXMucHJlc3NLaXRVcmw9ZS5hcHBsaWNhdGlvbi5zb2NpYWwucHJlc3NLaXRVcmwpLGUuYXBwbGljYXRpb24uc29jaWFsLm5mdFVybCYmKHRoaXMubmZ0VXJsPWUuYXBwbGljYXRpb24uc29jaWFsLm5mdFVybCkpfSl9cG9wdWxhdGVTbGlkZXNob3dGcm9tRmVlZGJhY2tzKCl7dGhpcy5mZWVkYmFja1NlcnZpY2UuZmluZCgpLnBpcGUoaihlPT4oY29uc29sZS5lcnJvcihlKSxIaSkpKS5zdWJzY3JpYmUoZT0+e2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKWVbaV0uY29tbWVudD1gPGZpZ2NhcHRpb24+PHAgY2xhc3M9ImZlZWRiYWNrLWNvbW1lbnQiPiR7ZVtpXS5jb21tZW50fTwvcD48ZGl2IGNsYXNzPSJmZWVkYmFjay1zdGFycyI+KCR7dGhpcy5zdGFyc1tlW2ldLnJhdGluZ119KTwvZGl2PjwvZmlnY2FwdGlvbj5gLGVbaV0uY29tbWVudD10aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChlW2ldLmNvbW1lbnQpLHRoaXMuZ2FsbGVyeVJlZi5hZGRJbWFnZSh7c3JjOnRoaXMuaW1hZ2VzW2kldGhpcy5pbWFnZXMubGVuZ3RoXSxhcmdzOmVbaV0uY29tbWVudH0pfSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLWFib3V0Il1dLGRlY2xzOjI0LHZhcnM6MTQsY29uc3RzOltbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwibWF0LWVsZXZhdGlvbi16NiJdLFsxLCJtZGMtY2FyZCJdLFsxLCJhYm91dC11cyJdLFsiYXJpYS1sYWJlbGxlZGJ5IiwiY29ycG9yYXRlLWhpc3RvcnkiXSxbImlkIiwiY29ycG9yYXRlLWhpc3RvcnkiXSxbMSwidGV4dC1qdXN0aWZ5Il0sWyJocmVmIiwiZnRwL2xlZ2FsLm1kIiwiYXJpYS1sYWJlbCIsIkxpbmsgdG8gdGhlIFRlcm1zIG9mIFVzZSIsInRyYW5zbGF0ZSIsIiJdLFsiYXJpYS1sYWJlbGxlZGJ5IiwiY3VzdG9tZXItZmVlZGJhY2siXSxbImlkIiwiY3VzdG9tZXItZmVlZGJhY2siXSxbImlkIiwiZmVlZGJhY2stZ2FsbGVyeSIsMSwiZ2FsbGVyeSIsMywiYXV0b3BsYXkiLCJ0aHVtYnMiLCJjb3VudGVyIiwiaW1hZ2VTaXplIl0sWzQsImdhbGxlcnlJbWFnZURlZiJdLFsiYXJpYS1sYWJlbGxlZGJ5Iiwic29jaWFsLW1lZGlhIiwxLCJzb2NpYWwtbmF2Il0sWzEsImZlZWRiYWNrIiwzLCJpbm5lckhUTUwiXSxbImlkIiwic29jaWFsLW1lZGlhIl0sWzEsInNvY2lhbCJdLFsidGFyZ2V0IiwiX2JsYW5rIiwicmVsIiwibm9vcGVuZXIgbm9yZWZlcnJlciIsImFyaWEtbGFiZWwiLCJWaXNpdCBvdXIgQmx1ZVNreSBwYWdlIiwzLCJocmVmIl0sWyJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsImNvbG9yIiwiYWNjZW50Il0sWyJhcmlhLWhpZGRlbiIsInRydWUiLDEsImZhcyIsImZhLWJvbGQiLCJmYS1sZyJdLFsidGFyZ2V0IiwiX2JsYW5rIiwicmVsIiwibm9vcGVuZXIgbm9yZWZlcnJlciIsImFyaWEtbGFiZWwiLCJWaXNpdCBvdXIgTWFzdG9kb24gcGFnZSIsMywiaHJlZiJdLFsiYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJmYWIiLCJmYS1tYXN0b2RvbiIsImZhLWxnIl0sWyJ0YXJnZXQiLCJfYmxhbmsiLCJyZWwiLCJub29wZW5lciBub3JlZmVycmVyIiwiYXJpYS1sYWJlbCIsIlZpc2l0IG91ciBUd2l0dGVyIHBhZ2UiLDMsImhyZWYiXSxbImFyaWEtaGlkZGVuIiwidHJ1ZSIsMSwiZmFiIiwiZmEtdHdpdHRlciIsImZhLWxnIl0sWyJ0YXJnZXQiLCJfYmxhbmsiLCJyZWwiLCJub29wZW5lciBub3JlZmVycmVyIiwiYXJpYS1sYWJlbCIsIlZpc2l0IG91ciBGYWNlYm9vayBwYWdlIiwzLCJocmVmIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLDEsImZhYiIsImZhLWZhY2Vib29rIiwiZmEtbGciXSxbInRhcmdldCIsIl9ibGFuayIsInJlbCIsIm5vb3BlbmVyIG5vcmVmZXJyZXIiLCJhcmlhLWxhYmVsIiwiSm9pbiBvdXIgU2xhY2sgd29ya3NwYWNlIiwzLCJocmVmIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLDEsImZhYiIsImZhLXNsYWNrIiwiZmEtbGciXSxbInRhcmdldCIsIl9ibGFuayIsInJlbCIsIm5vb3BlbmVyIG5vcmVmZXJyZXIiLCJhcmlhLWxhYmVsIiwiVmlzaXQgb3VyIFJlZGRpdCBwYWdlIiwzLCJocmVmIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLDEsImZhYiIsImZhLXJlZGRpdCIsImZhLWxnIl0sWyJ0YXJnZXQiLCJfYmxhbmsiLCJyZWwiLCJub29wZW5lciBub3JlZmVycmVyIiwiYXJpYS1sYWJlbCIsIkFjY2VzcyBvdXIgUHJlc3MgS2l0IiwzLCJocmVmIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLDEsImZhciIsImZhLW5ld3NwYXBlciIsImZhLWxnIl0sWyJ0YXJnZXQiLCJfYmxhbmsiLCJyZWwiLCJub29wZW5lciBub3JlZmVycmVyIiwiYXJpYS1sYWJlbCIsIlZpZXcgb3VyIE5GVCIsMywiaHJlZiJdLFsiYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJmYXMiLCJmYS1wYWxldHRlIiwiZmEtbGciXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsIm1hdC1jYXJkIiwwKSgxLCJkaXYiLDEpKDIsImFydGljbGUiLDIpKDMsImhlYWRlciIpKDQsImgxIiksbSg1KSxiKDYsInRyYW5zbGF0ZSIpLHMoKSgpLGMoNywic2VjdGlvbiIsMykoOCwiaDIiLDQpLG0oOSksYigxMCwidHJhbnNsYXRlIikscygpLGMoMTEsInAiLDUpLG0oMTIsIiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0IGNsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSBlaXJtb2QgdGVtcG9yIGludmlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXV5YW0gZXJhdCwgc2VkIGRpYW0gdm9sdXB0dWEuIEF0IHZlcm8gZW9zIGV0IGFjY3VzYW0gZXQganVzdG8gZHVvIGRvbG9yZXMgZXQgZWEgcmVidW0uIFN0ZXQgY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gRHVpcyBhdXRlbSB2ZWwgZXVtIGlyaXVyZSBkb2xvciBpbiBoZW5kcmVyaXQgaW4gdnVscHV0YXRlIHZlbGl0IGVzc2UgbW9sZXN0aWUgY29uc2VxdWF0LCB2ZWwgaWxsdW0gZG9sb3JlIGV1IGZldWdpYXQgbnVsbGEgZmFjaWxpc2lzIGF0IHZlcm8gZXJvcyBldCBhY2N1bXNhbiBldCBpdXN0byBvZGlvIGRpZ25pc3NpbSBxdWkgYmxhbmRpdCBwcmFlc2VudCBsdXB0YXR1bSB6enJpbCBkZWxlbml0IGF1Z3VlIGR1aXMgZG9sb3JlIHRlIGZldWdhaXQgbnVsbGEgZmFjaWxpc2kuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ZXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZGlhbSBub251bW15IG5pYmggZXVpc21vZCB0aW5jaWR1bnQgdXQgbGFvcmVldCBkb2xvcmUgbWFnbmEgYWxpcXVhbSBlcmF0IHZvbHV0cGF0LiAiKSxjKDEzLCJhIiw2KSxtKDE0LCJMSU5LX1RFUk1TX09GX1VTRSIpLHMoKSxtKDE1LCIgQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCBjbGl0YSBrYXNkIGd1YmVyZ3Jlbiwgbm8gc2VhIHRha2ltYXRhIHNhbmN0dXMgZXN0IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiBTdGV0IGNsaXRhIGthc2QgZ3ViZXJncmVuLCBubyBzZWEgdGFraW1hdGEgc2FuY3R1cyBlc3QgTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIEF0IGFjY3VzYW0gYWxpcXV5YW0gZGlhbSBkaWFtIGRvbG9yZSBkb2xvcmVzIGR1byBlaXJtb2QgZW9zIGVyYXQsIGV0IG5vbnVteSBzZWQgdGVtcG9yIGV0IGV0IGludmlkdW50IGp1c3RvIGxhYm9yZSBTdGV0IGNsaXRhIGVhIGV0IGd1YmVyZ3Jlbiwga2FzZCBtYWduYSBubyByZWJ1bS4gIikscygpKCksYygxNiwic2VjdGlvbiIsNykoMTcsImgyIiw4KSgxOCwic3BhbiIpLG0oMTkpLGIoMjAsInRyYW5zbGF0ZSIpLHMoKSgpLGMoMjEsImdhbGxlcnkiLDkpLFIoMjIsWUgsMiwxLCJuZy1jb250YWluZXIiLDEwKSxzKCkoKSxNKDIzLGFOLDEzLDExLCJuYXYiLDExKSxzKCkoKSgpKSxpJjImJihsKDUpLEEoQyg2LDgsIlRJVExFX0FCT1VUIikpLGwoNCksQShDKDEwLDEwLCJTRUNUSU9OX0NPUlBPUkFURV9ISVNUT1JZIikpLGwoMTApLEEoQygyMCwxMiwiU0VDVElPTl9DVVNUT01FUl9GRUVEQkFDSyIpKSxsKDIpLGYoImF1dG9wbGF5IiwhMCkoInRodW1icyIsITEpKCJjb3VudGVyIiwhMSkoImltYWdlU2l6ZSIsImNvdmVyIiksbCgyKSx3KGEuYmx1ZVNreVVybHx8YS5tYXN0b2RvblVybHx8YS50d2l0dGVyVXJsfHxhLmZhY2Vib29rVXJsfHxhLnNsYWNrVXJsfHxhLnJlZGRpdFVybHx8YS5wcmVzc0tpdFVybHx8YS5uZnRVcmw/MjM6LTEpKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxZLFNlLHc1LE01LG9lLGxlLEtdLHN0eWxlczpbYG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjJyZW07bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzt3aWR0aDo4MCV9LmFib3V0LXVzW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDo4LjMzMzMzJTttYXJnaW4tcmlnaHQ6OC4zMzMzMyU7d2lkdGg6ODMuMzMzMyV9LmdhbGxlcnlbX25nY29udGVudC0lQ09NUCVde2hlaWdodDozMDBweH0uc29jaWFsLW5hdltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDoxcmVtfS5zb2NpYWxbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtsaXN0LXN0eWxlLXR5cGU6bm9uZTtwYWRkaW5nLWxlZnQ6MH1idXR0b25bX25nY29udGVudC0lQ09NUCVde21hcmdpbjouMjVyZW19LnRleHQtanVzdGlmeVtfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpqdXN0aWZ5O3RleHQtanVzdGlmeTppbnRlci13b3JkfS5mZWVkYmFja1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwMDAwNTk7Ym90dG9tOjA7Y29sb3I6I2ZmZjtsZWZ0OjA7bWFyZ2luOjA7cGFkZGluZzouNjI1cmVtO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjB9Lm1kYy1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MH0uZmVlZGJhY2stY29tbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTowfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgZXMscjc9eCgoKT0+e050KCk7V3QoKTtrKCk7bHQoKTtrKCk7ZXM9KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtob3N0PXRoaXMuaG9zdFNlcnZlcisiL2FwaS9TZWN1cml0eUFuc3dlcnMiO3NhdmUoZSl7cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuaG9zdCsiLyIsZSkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO3ZhciB2byx0cz14KCgpPT57V3QoKTtrKCk7TnQoKTtsdCgpO2soKTt2bz0oKCk9PntjbGFzcyB0e2h0dHA9aChBZSk7aG9zdFNlcnZlcj11ZS5ob3N0U2VydmVyO2hvc3Q9dGhpcy5ob3N0U2VydmVyKyIvYXBpL1NlY3VyaXR5UXVlc3Rpb25zIjtmaW5kKGUpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaG9zdCsiLyIse3BhcmFtczplfSkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1maW5kQnkoZSl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0U2VydmVyKyIvcmVzdC91c2VyL3NlY3VyaXR5LXF1ZXN0aW9uP2VtYWlsPSIrZSkucGlwZShxKGk9PmkucXVlc3Rpb24pLGooaT0+e3Rocm93IGl9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTt2YXIgaXMsYXM9eCgoKT0+e2ExKCk7RzMoKTtrKCk7RzMoKTtpcz0oKCk9PntjbGFzcyB0e3Bhc3N3b3JkPSIiO3Bhc3N3b3JkU3RyZW5ndGg9MDttaW5MZW5ndGg9ODtyYW5nZXM9WyJsb3ciLCJsb3ctbWVkaXVtIiwibWVkaXVtIiwiaGlnaC1tZWRpdW0iLCJoaWdoIl07bmdPbkNoYW5nZXMoZSl7ZS5wYXNzd29yZCYmKHRoaXMucGFzc3dvcmRTdHJlbmd0aD10aGlzLmNhbGN1bGF0ZVBhc3N3b3JkU3RyZW5ndGgoKSl9Y2FsY3VsYXRlUGFzc3dvcmRTdHJlbmd0aCgpe2xldCBlPVt0aGlzLmNvbnRhaW5BdExlYXN0TWluQ2hhcnMsdGhpcy5jb250YWluQXRMZWFzdE9uZUxvd2VyQ2FzZUxldHRlcix0aGlzLmNvbnRhaW5BdExlYXN0T25lVXBwZXJDYXNlTGV0dGVyLHRoaXMuY29udGFpbkF0TGVhc3RPbmVEaWdpdCx0aGlzLmNvbnRhaW5BdExlYXN0T25lU3BlY2lhbENoYXJdO3JldHVybiBlLmZpbHRlcihpPT5pKS5sZW5ndGgvZS5sZW5ndGgqMTAwfWdldCBwcm9ncmVzc0NvbG9yKCl7cmV0dXJuIHRoaXMucmFuZ2VzW01hdGgubWF4KE1hdGguZmxvb3IodGhpcy5wYXNzd29yZFN0cmVuZ3RoLygxMDAvdGhpcy5yYW5nZXMubGVuZ3RoKSktMSwwKV19Z2V0IGNvbnRhaW5BdExlYXN0TWluQ2hhcnMoKXtyZXR1cm4gdGhpcy5wYXNzd29yZC5sZW5ndGg+PTh9Z2V0IGNvbnRhaW5BdExlYXN0T25lTG93ZXJDYXNlTGV0dGVyKCl7cmV0dXJuL14oPz0uKj9bYS16XSkvLnRlc3QodGhpcy5wYXNzd29yZCl9Z2V0IGNvbnRhaW5BdExlYXN0T25lVXBwZXJDYXNlTGV0dGVyKCl7cmV0dXJuL14oPz0uKj9bQS1aXSkvLnRlc3QodGhpcy5wYXNzd29yZCl9Z2V0IGNvbnRhaW5BdExlYXN0T25lRGlnaXQoKXtyZXR1cm4vXig/PS4qP1swLTldKS8udGVzdCh0aGlzLnBhc3N3b3JkKX1nZXQgY29udGFpbkF0TGVhc3RPbmVTcGVjaWFsQ2hhcigpe3JldHVybi9eKD89Lio/WyIgISIjJCUmJygpKissLS4vOjs8PT4/QFtcXV5fYHt8fX4iXSkvLnRlc3QodGhpcy5wYXNzd29yZCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLXBhc3N3b3JkLXN0cmVuZ3RoIl1dLGlucHV0czp7cGFzc3dvcmQ6InBhc3N3b3JkIn0sZmVhdHVyZXM6W0hlXSxkZWNsczoxLHZhcnM6Myxjb25zdHM6W1sibW9kZSIsImRldGVybWluYXRlIiwzLCJoaWRkZW4iLCJ2YWx1ZSIsIm5nQ2xhc3MiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJnUoMCwibWF0LXByb2dyZXNzLWJhciIsMCksaSYyJiZmKCJoaWRkZW4iLGEucGFzc3dvcmQubGVuZ3RoPT09MCkoInZhbHVlIixhLnBhc3N3b3JkU3RyZW5ndGgpKCJuZ0NsYXNzIixhLnByb2dyZXNzQ29sb3IpfSxkZXBlbmRlbmNpZXM6W3EzLFF1LFQxXSxzdHlsZXM6WyIubG93W19uZ2NvbnRlbnQtJUNPTVAlXXstLW1kYy1saW5lYXItcHJvZ3Jlc3MtYWN0aXZlLWluZGljYXRvci1jb2xvcjogI2YwMCAhaW1wb3J0YW50fS5sb3ctbWVkaXVtW19uZ2NvbnRlbnQtJUNPTVAlXXstLW1kYy1saW5lYXItcHJvZ3Jlc3MtYWN0aXZlLWluZGljYXRvci1jb2xvcjogI2ZmNDUwMCAhaW1wb3J0YW50fS5tZWRpdW1bX25nY29udGVudC0lQ09NUCVdey0tbWRjLWxpbmVhci1wcm9ncmVzcy1hY3RpdmUtaW5kaWNhdG9yLWNvbG9yOiAjZmYwICFpbXBvcnRhbnR9LmhpZ2gtbWVkaXVtW19uZ2NvbnRlbnQtJUNPTVAlXXstLW1kYy1saW5lYXItcHJvZ3Jlc3MtYWN0aXZlLWluZGljYXRvci1jb2xvcjogIzlhY2QzMiAhaW1wb3J0YW50fS5oaWdoW19uZ2NvbnRlbnQtJUNPTVAlXXstLW1kYy1saW5lYXItcHJvZ3Jlc3MtYWN0aXZlLWluZGljYXRvci1jb2xvcjogIzBmMCAhaW1wb3J0YW50fSJdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gbk4odCxuKXt0JjEmJihjKDAsIm1hdC1pY29uIiwyKSxtKDEsImRvbmUiKSxzKCkpfWZ1bmN0aW9uIHJOKHQsbil7dCYxJiYoYygwLCJtYXQtaWNvbiIsMyksbSgxLCJlcnJvciIpLHMoKSl9ZnVuY3Rpb24gb04odCxuKXt0JjEmJihjKDAsIm1hdC1pY29uIiwyKSxtKDEsImRvbmUiKSxzKCkpfWZ1bmN0aW9uIGNOKHQsbil7dCYxJiYoYygwLCJtYXQtaWNvbiIsMyksbSgxLCJlcnJvciIpLHMoKSl9ZnVuY3Rpb24gc04odCxuKXt0JjEmJihjKDAsIm1hdC1pY29uIiwyKSxtKDEsImRvbmUiKSxzKCkpfWZ1bmN0aW9uIGxOKHQsbil7dCYxJiYoYygwLCJtYXQtaWNvbiIsMyksbSgxLCJlcnJvciIpLHMoKSl9ZnVuY3Rpb24gZE4odCxuKXt0JjEmJihjKDAsIm1hdC1pY29uIiwyKSxtKDEsImRvbmUiKSxzKCkpfWZ1bmN0aW9uIG1OKHQsbil7dCYxJiYoYygwLCJtYXQtaWNvbiIsMyksbSgxLCJlcnJvciIpLHMoKSl9ZnVuY3Rpb24gaE4odCxuKXt0JjEmJihjKDAsIm1hdC1pY29uIiwyKSxtKDEsImRvbmUiKSxzKCkpfWZ1bmN0aW9uIHBOKHQsbil7dCYxJiYoYygwLCJtYXQtaWNvbiIsMyksbSgxLCJlcnJvciIpLHMoKSl9dmFyIG5zLG83PXgoKCk9PnthcygpO2hlKCk7dmUoKTtrKCk7aGUoKTt2ZSgpO25zPSgoKT0+e2NsYXNzIHR7cGFzc3dvcmRDb21wb25lbnQ7ZW5hYmxlU2NvcmVJbmZvPSExO2xvd2VyQ2FzZUNyaXRlcmlhTXNnPSJjb250YWlucyBhdCBsZWFzdCBvbmUgbG93ZXIgY2hhcmFjdGVyIjt1cHBlckNhc2VDcml0ZXJpYU1zZz0iY29udGFpbnMgYXQgbGVhc3Qgb25lIHVwcGVyIGNoYXJhY3RlciI7ZGlnaXRzQ3JpdGVyaWFNc2c9ImNvbnRhaW5zIGF0IGxlYXN0IG9uZSBkaWdpdCBjaGFyYWN0ZXIiO3NwZWNpYWxDaGFyc0NyaXRlcmlhTXNnPSJjb250YWlucyBhdCBsZWFzdCBvbmUgc3BlY2lhbCBjaGFyYWN0ZXIiO21pbkNoYXJzQ3JpdGVyaWFNc2c7bmdPbkluaXQoKXt0aGlzLm1pbkNoYXJzQ3JpdGVyaWFNc2d8fCh0aGlzLm1pbkNoYXJzQ3JpdGVyaWFNc2c9YGNvbnRhaW5zIGF0IGxlYXN0ICR7dGhpcy5wYXNzd29yZENvbXBvbmVudC5taW5MZW5ndGh9IGNoYXJhY3RlcnNgKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtcGFzc3dvcmQtc3RyZW5ndGgtaW5mbyJdXSxpbnB1dHM6e3Bhc3N3b3JkQ29tcG9uZW50OiJwYXNzd29yZENvbXBvbmVudCIsZW5hYmxlU2NvcmVJbmZvOiJlbmFibGVTY29yZUluZm8iLGxvd2VyQ2FzZUNyaXRlcmlhTXNnOiJsb3dlckNhc2VDcml0ZXJpYU1zZyIsdXBwZXJDYXNlQ3JpdGVyaWFNc2c6InVwcGVyQ2FzZUNyaXRlcmlhTXNnIixkaWdpdHNDcml0ZXJpYU1zZzoiZGlnaXRzQ3JpdGVyaWFNc2ciLHNwZWNpYWxDaGFyc0NyaXRlcmlhTXNnOiJzcGVjaWFsQ2hhcnNDcml0ZXJpYU1zZyIsbWluQ2hhcnNDcml0ZXJpYU1zZzoibWluQ2hhcnNDcml0ZXJpYU1zZyJ9LGRlY2xzOjI3LHZhcnM6MTAsY29uc3RzOltbMSwiaW5mby1jYXJkIl0sWzEsImluZm8tcm93Il0sWyJjb2xvciIsInByaW1hcnkiLCJmb250SWNvbiIsImRvbmUiXSxbImNvbG9yIiwid2FybiIsImZvbnRJY29uIiwiZXJyb3IiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsIm1hdC1jYXJkIiwwKSgxLCJtYXQtY2FyZC1jb250ZW50IikoMiwiZGl2IiwxKSxNKDMsbk4sMiwwLCJtYXQtaWNvbiIsMikoNCxyTiwyLDAsIm1hdC1pY29uIiwzKSxjKDUsInNwYW4iKSxtKDYpLHMoKSgpLGMoNywiZGl2IiwxKSxNKDgsb04sMiwwLCJtYXQtaWNvbiIsMikoOSxjTiwyLDAsIm1hdC1pY29uIiwzKSxjKDEwLCJzcGFuIiksbSgxMSkscygpKCksYygxMiwiZGl2IiwxKSxNKDEzLHNOLDIsMCwibWF0LWljb24iLDIpKDE0LGxOLDIsMCwibWF0LWljb24iLDMpLGMoMTUsInNwYW4iKSxtKDE2KSxzKCkoKSxjKDE3LCJkaXYiLDEpLE0oMTgsZE4sMiwwLCJtYXQtaWNvbiIsMikoMTksbU4sMiwwLCJtYXQtaWNvbiIsMyksYygyMCwic3BhbiIpLG0oMjEpLHMoKSgpLGMoMjIsImRpdiIsMSksTSgyMyxoTiwyLDAsIm1hdC1pY29uIiwyKSgyNCxwTiwyLDAsIm1hdC1pY29uIiwzKSxjKDI1LCJzcGFuIiksbSgyNikscygpKCkoKSgpKSxpJjImJihsKDMpLHcoYS5wYXNzd29yZENvbXBvbmVudC5jb250YWluQXRMZWFzdE9uZUxvd2VyQ2FzZUxldHRlcj8zOjQpLGwoMyksQShhLmxvd2VyQ2FzZUNyaXRlcmlhTXNnKSxsKDIpLHcoYS5wYXNzd29yZENvbXBvbmVudC5jb250YWluQXRMZWFzdE9uZVVwcGVyQ2FzZUxldHRlcj84OjkpLGwoMyksQShhLnVwcGVyQ2FzZUNyaXRlcmlhTXNnKSxsKDIpLHcoYS5wYXNzd29yZENvbXBvbmVudC5jb250YWluQXRMZWFzdE9uZURpZ2l0PzEzOjE0KSxsKDMpLEEoYS5kaWdpdHNDcml0ZXJpYU1zZyksbCgyKSx3KGEucGFzc3dvcmRDb21wb25lbnQuY29udGFpbkF0TGVhc3RPbmVTcGVjaWFsQ2hhcj8xODoxOSksbCgzKSxBKGEuc3BlY2lhbENoYXJzQ3JpdGVyaWFNc2cpLGwoMiksdyhhLnBhc3N3b3JkQ29tcG9uZW50LmNvbnRhaW5BdExlYXN0TWluQ2hhcnM/MjM6MjQpLGwoMyksQShhLm1pbkNoYXJzQ3JpdGVyaWFNc2cpKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxwMixnZSxDZV0sc3R5bGVzOltgLmluZm8tY2FyZFtfbmdjb250ZW50LSVDT01QJV17YW5pbWF0aW9uOl9uZ2NvbnRlbnQtJUNPTVAlX2NhcmRFbnRyYW5jZSAuNHMgZWFzZS1vdXQgZm9yd2FyZHM7Ym94LXNpemluZzpib3JkZXItYm94O21hcmdpbi10b3A6MXJlbTt3aWR0aDoxMDAlfS5pbmZvLWNhcmRbX25nY29udGVudC0lQ09NUCVdICAgbWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxcmVtfS5pbmZvLXJvd1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2FuaW1hdGlvbjpfbmdjb250ZW50LSVDT01QJV9yb3dFbnRyYW5jZSAuM3MgZWFzZS1vdXQgZm9yd2FyZHM7ZGlzcGxheTpmbGV4O2dhcDouNXJlbTttYXJnaW46LjVyZW0gMDtvcGFjaXR5OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtMjBweCl9LmluZm8tcm93W19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQoMSl7YW5pbWF0aW9uLWRlbGF5Oi4xc30uaW5mby1yb3dbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZCgyKXthbmltYXRpb24tZGVsYXk6LjJzfS5pbmZvLXJvd1tfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKDMpe2FuaW1hdGlvbi1kZWxheTouM3N9LmluZm8tcm93W19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQoNCl7YW5pbWF0aW9uLWRlbGF5Oi40c30uaW5mby1yb3dbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZCg1KXthbmltYXRpb24tZGVsYXk6LjVzfUBrZXlmcmFtZXMgX25nY29udGVudC0lQ09NUCVfY2FyZEVudHJhbmNlezAle29wYWNpdHk6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTBweCl9dG97b3BhY2l0eToxO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfX1Aa2V5ZnJhbWVzIF9uZ2NvbnRlbnQtJUNPTVAlX3Jvd0VudHJhbmNle3Rve29wYWNpdHk6MTt0cmFuc2Zvcm06dHJhbnNsYXRlKDApfX0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gdU4odCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsNyksbSgxLCJNQU5EQVRPUllfRU1BSUwiKSxzKCkpfWZ1bmN0aW9uIGdOKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiLDcpLG0oMSwiSU5WQUxJRF9FTUFJTCIpLHMoKSl9ZnVuY3Rpb24gdk4odCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsNyksbSgxLCJNQU5EQVRPUllfUEFTU1dPUkQgIikscygpKX1mdW5jdGlvbiBfTih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiwxNyksbSgxLCJJTlZBTElEX1BBU1NXT1JEX0xFTkdUSCAiKSxzKCkpLHQmMiYmZigidHJhbnNsYXRlUGFyYW1zIixTdCgxLGhfKSl9ZnVuY3Rpb24gYk4odCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsNyksbSgxLCIgTUFOREFUT1JZX1BBU1NXT1JEX1JFUEVBVCAiKSxzKCkpfWZ1bmN0aW9uIENOKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiLDcpLG0oMSwiIFBBU1NXT1JEU19OT1RfTUFUQ0hJTkcgIikscygpKX1mdW5jdGlvbiB5Tih0LG4pe2lmKHQmMSYmKHUoMCwiYXBwLXBhc3N3b3JkLXN0cmVuZ3RoLWluZm8iLDIxKSxiKDEsInRyYW5zbGF0ZSIpLGIoMiwidHJhbnNsYXRlIiksYigzLCJ0cmFuc2xhdGUiKSxiKDQsInRyYW5zbGF0ZSIpLGIoNSwidHJhbnNsYXRlIikpLHQmMil7digpO2xldCBlPXNlKDQyKTtmKCJwYXNzd29yZENvbXBvbmVudCIsZSkoImxvd2VyQ2FzZUNyaXRlcmlhTXNnIixDKDEsNiwiTE9XRVJfQ0FTRV9DUklURVJJQV9NU0ciKSkoInVwcGVyQ2FzZUNyaXRlcmlhTXNnIixDKDIsOCwiVVBQRVJfQ0FTRV9DUklURVJJQV9NU0ciKSkoImRpZ2l0c0NyaXRlcmlhTXNnIixDKDMsMTAsIkRJR0lUU19DUklURVJJQV9NU0ciKSkoInNwZWNpYWxDaGFyc0NyaXRlcmlhTXNnIixDKDQsMTIsIlNQRUNJQUxfQ0hBUlNfQ1JJVEVSSUFfTVNHIikpKCJtaW5DaGFyc0NyaXRlcmlhTXNnIixkdCg1LDE0LCJNSU5fQ0hBUlNfQ1JJVEVSSUFfTVNHIixTdCgxNyxmTikpKX19ZnVuY3Rpb24geE4odCxuKXtpZih0JjEmJihjKDAsIm1hdC1vcHRpb24iLDI1KSxtKDEpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtmKCJ2YWx1ZSIsZS5pZCksbCgpLEUoIiAiLGUucXVlc3Rpb24sIiAiKX19ZnVuY3Rpb24gTU4odCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsNyksbSgxLCIgTUFOREFUT1JZX1NFQ1VSSVRZX1FVRVNUSU9OICIpLHMoKSl9ZnVuY3Rpb24gd04odCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsNyksbSgxLCIgTUFOREFUT1JZX1NFQ1VSSVRZX0FOU1dFUiAiKSxzKCkpfWZ1bmN0aW9uIFNOKHQpe3JldHVybiBmdW5jdGlvbihlKXtsZXQgaT10LnZhbHVlLGE9ZS52YWx1ZTtyZXR1cm4gaSE9PWE/e25vdFNhbWU6ITB9Om51bGx9fXZhciBoXyxmTixwXyxmXz14KCgpPT57cjcoKTtGMSgpO1dlKCk7aygpO3RzKCk7cDEoKTtZdCgpO01yKCk7cjEoKTtEYSgpO0oxKCk7VygpO25lKCk7XzQoKTtkYygpO2FzKCk7bzcoKTtGMygpO2V0KCk7SmUoKTtoZSgpO3ZlKCk7aygpO2hlKCk7VygpO0plKCk7ZXQoKTtXZSgpO25lKCk7dmUoKTtoXz0oKT0+KHtsZW5ndGg6IjUtNDAifSksZk49KCk9Pih7dmFsdWU6OH0pO0xlLmFkZChrZixqcCk7cF89KCgpPT57Y2xhc3MgdHtzZWN1cml0eVF1ZXN0aW9uU2VydmljZT1oKHZvKTt1c2VyU2VydmljZT1oKEF0KTtzZWN1cml0eUFuc3dlclNlcnZpY2U9aChlcyk7cm91dGVyPWgoeXQpO2Zvcm1TdWJtaXRTZXJ2aWNlPWgoVGkpO3RyYW5zbGF0ZVNlcnZpY2U9aChJdCk7c25hY2tCYXI9aChKMik7c25hY2tCYXJIZWxwZXJTZXJ2aWNlPWgoVnQpO25nWm9uZT1oKHJlKTtlbWFpbENvbnRyb2w9bmV3IGtlKCIiLFtKLnJlcXVpcmVkLEouZW1haWxdKTtwYXNzd29yZENvbnRyb2w9bmV3IGtlKCIiLFtKLnJlcXVpcmVkLEoubWluTGVuZ3RoKDUpLEoubWF4TGVuZ3RoKDQwKV0pO3JlcGVhdFBhc3N3b3JkQ29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWQsU04odGhpcy5wYXNzd29yZENvbnRyb2wpXSk7c2VjdXJpdHlRdWVzdGlvbkNvbnRyb2w9bmV3IGtlKCIiLFtKLnJlcXVpcmVkXSk7c2VjdXJpdHlBbnN3ZXJDb250cm9sPW5ldyBrZSgiIixbSi5yZXF1aXJlZF0pO3NlY3VyaXR5UXVlc3Rpb25zO3NlbGVjdGVkO2Vycm9yPW51bGw7bmdPbkluaXQoKXt0aGlzLnNlY3VyaXR5UXVlc3Rpb25TZXJ2aWNlLmZpbmQobnVsbCkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLnNlY3VyaXR5UXVlc3Rpb25zPWV9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KSx0aGlzLmZvcm1TdWJtaXRTZXJ2aWNlLmF0dGFjaEVudGVyS2V5SGFuZGxlcigicmVnaXN0cmF0aW9uLWZvcm0iLCJyZWdpc3RlckJ1dHRvbiIsKCk9Pnt0aGlzLnNhdmUoKX0pfXNhdmUoKXtsZXQgZT17ZW1haWw6dGhpcy5lbWFpbENvbnRyb2wudmFsdWUscGFzc3dvcmQ6dGhpcy5wYXNzd29yZENvbnRyb2wudmFsdWUscGFzc3dvcmRSZXBlYXQ6dGhpcy5yZXBlYXRQYXNzd29yZENvbnRyb2wudmFsdWUsc2VjdXJpdHlRdWVzdGlvbjp0aGlzLnNlY3VyaXR5UXVlc3Rpb25zLmZpbmQoaT0+aS5pZD09PXRoaXMuc2VjdXJpdHlRdWVzdGlvbkNvbnRyb2wudmFsdWUpLHNlY3VyaXR5QW5zd2VyOnRoaXMuc2VjdXJpdHlBbnN3ZXJDb250cm9sLnZhbHVlfTt0aGlzLnVzZXJTZXJ2aWNlLnNhdmUoZSkuc3Vic2NyaWJlKHtuZXh0Omk9Pnt0aGlzLnNlY3VyaXR5QW5zd2VyU2VydmljZS5zYXZlKHtVc2VySWQ6aS5pZCxhbnN3ZXI6dGhpcy5zZWN1cml0eUFuc3dlckNvbnRyb2wudmFsdWUsU2VjdXJpdHlRdWVzdGlvbklkOnRoaXMuc2VjdXJpdHlRdWVzdGlvbkNvbnRyb2wudmFsdWV9KS5zdWJzY3JpYmUoKCk9Pnt0aGlzLm5nWm9uZS5ydW4oKCk9PlBlKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyIvbG9naW4iXSl9KSksdGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbigiQ09ORklSTV9SRUdJU1RFUiIpfSl9LGVycm9yOmk9PntpZihjb25zb2xlLmxvZyhpKSxpLmVycm9yPy5lcnJvcnMpe2xldCBhPWkuZXJyb3IuZXJyb3JzWzBdO2EubWVzc2FnZT90aGlzLmVycm9yPWEubWVzc2FnZVswXS50b1VwcGVyQ2FzZSgpK2EubWVzc2FnZS5zbGljZSgxKTp0aGlzLmVycm9yPWF9fX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1yZWdpc3RlciJdXSxkZWNsczo3MSx2YXJzOjM4LGNvbnN0czpbWyJwYXNzd29yZCIsIiJdLFsicmVwZWF0UGFzc3dvcmQiLCIiXSxbInBhc3N3b3JkSW5mb1RvZ2dsZSIsIiJdLFsicGFzc3dvcmRTdHJlbmd0aCIsIiJdLFsxLCJjZW50ZXItY29udGFpbmVyIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1lbGV2YXRpb24tejYiXSxbMSwibWRjLWNhcmQiXSxbInRyYW5zbGF0ZSIsIiJdLFsibmctaWYiLCJlcnJvciIsMSwiZXJyb3IiXSxbImlkIiwicmVnaXN0cmF0aW9uLWZvcm0iLDEsImZvcm0tY29udGFpbmVyIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZSIsImNvbG9yIiwiYWNjZW50Il0sWyJpZCIsImVtYWlsQ29udHJvbCIsInR5cGUiLCJ0ZXh0IiwibWF0SW5wdXQiLCIiLCJhcmlhLWxhYmVsIiwiRW1haWwgYWRkcmVzcyBmaWVsZCIsMywiZm9jdXMiLCJmb3JtQ29udHJvbCJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmUiLCJjb2xvciIsImFjY2VudCIsInN1YnNjcmlwdFNpemluZyIsImR5bmFtaWMiXSxbImlkIiwicGFzc3dvcmRDb250cm9sIiwidHlwZSIsInBhc3N3b3JkIiwibWF0SW5wdXQiLCIiLCJhcmlhLWxhYmVsIiwiRmllbGQgZm9yIHRoZSBwYXNzd29yZCIsMywiZm9jdXMiLCJmb3JtQ29udHJvbCJdLFsxLCJmYXMiLCJmYS1leGNsYW1hdGlvbi1jaXJjbGUiXSxbInRyYW5zbGF0ZSIsIiIsMSwiaGludC1zcGFjaW5nIl0sWyJhbGlnbiIsImVuZCJdLFsidHJhbnNsYXRlIiwiIiwzLCJ0cmFuc2xhdGVQYXJhbXMiXSxbImlkIiwicmVwZWF0UGFzc3dvcmRDb250cm9sIiwidHlwZSIsInBhc3N3b3JkIiwibWF0SW5wdXQiLCIiLCJhcmlhLWxhYmVsIiwiRmllbGQgdG8gY29uZmlybSB0aGUgcGFzc3dvcmQiLDMsImZvY3VzIiwiZm9ybUNvbnRyb2wiXSxbMywiY29sb3IiXSxbMywicGFzc3dvcmQiXSxbMywicGFzc3dvcmRDb21wb25lbnQiLCJsb3dlckNhc2VDcml0ZXJpYU1zZyIsInVwcGVyQ2FzZUNyaXRlcmlhTXNnIiwiZGlnaXRzQ3JpdGVyaWFNc2ciLCJzcGVjaWFsQ2hhcnNDcml0ZXJpYU1zZyIsIm1pbkNoYXJzQ3JpdGVyaWFNc2ciXSxbMSwic2VjdXJpdHktY29udGFpbmVyIl0sWyJjb2xvciIsImFjY2VudCIsImFwcGVhcmFuY2UiLCJvdXRsaW5lIl0sWyJwbGFjZWhvbGRlciIsIiIsIm5hbWUiLCJzZWN1cml0eVF1ZXN0aW9uIiwiYXJpYS1sYWJlbCIsIlNlbGVjdGlvbiBsaXN0IGZvciB0aGUgc2VjdXJpdHkgcXVlc3Rpb24iLDMsInZhbHVlQ2hhbmdlIiwiZm9jdXMiLCJmb3JtQ29udHJvbCIsInZhbHVlIl0sWzEsIm1hdC1ib2R5IiwzLCJ2YWx1ZSJdLFsiaWQiLCJzZWN1cml0eUFuc3dlckNvbnRyb2wiLCJ0eXBlIiwidGV4dCIsIm1hdElucHV0IiwiIiwiYXJpYS1sYWJlbCIsIkZpZWxkIGZvciB0aGUgYW5zd2VyIHRvIHRoZSBzZWN1cml0eSBxdWVzdGlvbiIsMywiZm9jdXMiLCJmb3JtQ29udHJvbCIsInBsYWNlaG9sZGVyIl0sWyJ0eXBlIiwic3VibWl0IiwiaWQiLCJyZWdpc3RlckJ1dHRvbiIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiY29sb3IiLCJwcmltYXJ5IiwiYXJpYS1sYWJlbCIsIkJ1dHRvbiB0byBjb21wbGV0ZSB0aGUgcmVnaXN0cmF0aW9uIiwzLCJjbGljayIsImRpc2FibGVkIl0sWyJpZCIsImFscmVhZHlBQ3VzdG9tZXJMaW5rIl0sWyJyb3V0ZXJMaW5rIiwiL2xvZ2luIiwidHJhbnNsYXRlIiwiIiwxLCJwcmltYXJ5LWxpbmsiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtjKDAsImRpdiIsNCkoMSwibWF0LWNhcmQiLDUpKDIsImRpdiIsNikoMywiaDEiLDcpLG0oNCwiVElUTEVfUkVHSVNUUkFUSU9OIikscygpLGMoNSwiZGl2Iiw4KSxtKDYpLHMoKSxjKDcsImRpdiIsOSkoOCwibWF0LWZvcm0tZmllbGQiLDEwKSg5LCJtYXQtbGFiZWwiLDcpLG0oMTAsIkxBQkVMX0VNQUlMIikscygpLGMoMTEsImlucHV0IiwxMSksUygiZm9jdXMiLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLmVycm9yPW51bGwpfSkscygpLE0oMTIsdU4sMiwwLCJtYXQtZXJyb3IiLDcpLE0oMTMsZ04sMiwwLCJtYXQtZXJyb3IiLDcpLHMoKSxjKDE0LCJtYXQtZm9ybS1maWVsZCIsMTIpKDE1LCJtYXQtbGFiZWwiLDcpLG0oMTYsIkxBQkVMX1BBU1NXT1JEIikscygpLGMoMTcsImlucHV0IiwxMywwKSxTKCJmb2N1cyIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuZXJyb3I9bnVsbCl9KSxzKCksYygxOSwibWF0LWhpbnQiLDcpLHUoMjAsImkiLDE0KSxjKDIxLCJlbSIsMTUpLG0oMjIpLGIoMjMsInRyYW5zbGF0ZSIpLHMoKSgpLGMoMjQsIm1hdC1oaW50IiwxNiksbSgyNSkscygpLE0oMjYsdk4sMiwwLCJtYXQtZXJyb3IiLDcpLE0oMjcsX04sMiwyLCJtYXQtZXJyb3IiLDE3KSxzKCksYygyOCwibWF0LWZvcm0tZmllbGQiLDEwKSgyOSwibWF0LWxhYmVsIiw3KSxtKDMwLCJMQUJFTF9QQVNTV09SRF9SRVBFQVQiKSxzKCksYygzMSwiaW5wdXQiLDE4LDEpLFMoImZvY3VzIixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5lcnJvcj1udWxsKX0pLHMoKSxjKDMzLCJtYXQtaGludCIsMTYpLG0oMzQpLHMoKSxNKDM1LGJOLDIsMCwibWF0LWVycm9yIiw3KSxNKDM2LENOLDIsMCwibWF0LWVycm9yIiw3KSxzKCksYygzNywibWF0LXNsaWRlLXRvZ2dsZSIsMTksMiksbSgzOSksYig0MCwidHJhbnNsYXRlIikscygpLHUoNDEsImFwcC1wYXNzd29yZC1zdHJlbmd0aCIsMjAsMyksTSg0Myx5Tiw2LDE4LCJhcHAtcGFzc3dvcmQtc3RyZW5ndGgtaW5mbyIsMjEpLGMoNDQsImRpdiIsMjIpKDQ1LCJtYXQtZm9ybS1maWVsZCIsMjMpKDQ2LCJtYXQtbGFiZWwiKSxtKDQ3KSxiKDQ4LCJ0cmFuc2xhdGUiKSxzKCksYyg0OSwibWF0LXNlbGVjdCIsMjQpLEZpKCJ2YWx1ZUNoYW5nZSIsZnVuY3Rpb24oZCl7cmV0dXJuIHoociksUmkoYS5zZWxlY3RlZCxkKXx8KGEuc2VsZWN0ZWQ9ZCksVChkKX0pLFMoImZvY3VzIixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5lcnJvcj1udWxsKX0pLHFlKDUwLHhOLDIsMiwibWF0LW9wdGlvbiIsMjUsRnQpLHMoKSxjKDUyLCJtYXQtaGludCIsNyksdSg1MywiaSIsMTQpLGMoNTQsImVtIiwxNSksbSg1NSwiQ0FOTk9UX0JFX0NIQU5HRURfTEFURVIiKSxzKCkoKSxNKDU2LE1OLDIsMCwibWF0LWVycm9yIiw3KSxzKCksYyg1NywibWF0LWZvcm0tZmllbGQiLDEwKSg1OCwibWF0LWxhYmVsIiw3KSxtKDU5LCJTRUNVUklUWV9BTlNXRVIiKSxzKCksYyg2MCwiaW5wdXQiLDI2KSxiKDYxLCJ0cmFuc2xhdGUiKSxTKCJmb2N1cyIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuZXJyb3I9bnVsbCl9KSxzKCksTSg2Mix3TiwyLDAsIm1hdC1lcnJvciIsNykscygpKCksYyg2MywiYnV0dG9uIiwyNyksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLnNhdmUoKSl9KSxjKDY0LCJtYXQtaWNvbiIpLG0oNjUsInBlcnNvbl9hZGQiKSxzKCksbSg2NiksYig2NywidHJhbnNsYXRlIikscygpLGMoNjgsImRpdiIsMjgpKDY5LCJhIiwyOSksbSg3MCwiQUxSRUFEWV9BX0NVU1RPTUVSIikscygpKCkoKSgpKCkoKX1pZihpJjIpe2xldCByPXNlKDE4KSxvPXNlKDMyKSxkPXNlKDM4KSxwPXNlKDQyKTtsKDYpLEEoYS5lcnJvciksbCg1KSxmKCJmb3JtQ29udHJvbCIsYS5lbWFpbENvbnRyb2wpLGwoKSx3KGEuZW1haWxDb250cm9sLmludmFsaWQmJmEuZW1haWxDb250cm9sLmVycm9ycy5yZXF1aXJlZD8xMjotMSksbCgpLHcoYS5lbWFpbENvbnRyb2wuaW52YWxpZCYmYS5lbWFpbENvbnRyb2wuZXJyb3JzLmVtYWlsPzEzOi0xKSxsKDQpLGYoImZvcm1Db250cm9sIixhLnBhc3N3b3JkQ29udHJvbCksbCg1KSxBKGR0KDIzLDI2LCJJTlZBTElEX1BBU1NXT1JEX0xFTkdUSCIsU3QoMzcsaF8pKSksbCgzKSxFKCIiLChyLnZhbHVlPT1udWxsP251bGw6ci52YWx1ZS5sZW5ndGgpfHwwLCIvMjAiKSxsKCksdyhhLnBhc3N3b3JkQ29udHJvbC5pbnZhbGlkJiZhLnBhc3N3b3JkQ29udHJvbC5lcnJvcnMucmVxdWlyZWQ/MjY6LTEpLGwoKSx3KGEucGFzc3dvcmRDb250cm9sLmludmFsaWQmJihhLnBhc3N3b3JkQ29udHJvbC5lcnJvcnMubWlubGVuZ3RofHxhLnBhc3N3b3JkQ29udHJvbC5lcnJvcnMubWF4bGVuZ3RoKT8yNzotMSksbCg0KSxmKCJmb3JtQ29udHJvbCIsYS5yZXBlYXRQYXNzd29yZENvbnRyb2wpLGwoMyksRSgiIiwoby52YWx1ZT09bnVsbD9udWxsOm8udmFsdWUubGVuZ3RoKXx8MCwiLzQwIiksbCgpLHcoYS5yZXBlYXRQYXNzd29yZENvbnRyb2wuaW52YWxpZCYmYS5yZXBlYXRQYXNzd29yZENvbnRyb2wuZXJyb3JzLnJlcXVpcmVkPzM1Oi0xKSxsKCksdyhhLnJlcGVhdFBhc3N3b3JkQ29udHJvbC5pbnZhbGlkJiZhLnJlcGVhdFBhc3N3b3JkQ29udHJvbC5lcnJvcnMubm90U2FtZT8zNjotMSksbCgpLGYoImNvbG9yIixwLmNvbG9yKSxsKDIpLEEoQyg0MCwyOSwiU0hPV19QQVNTV09SRF9BRFZJQ0UiKSksbCgyKSxmKCJwYXNzd29yZCIsci52YWx1ZSksbCgyKSx3KGQuY2hlY2tlZD80MzotMSksbCg0KSxFKCIgIixDKDQ4LDMxLCJMQUJFTF9TRUNVUklUWV9RVUVTVElPTiIpLCIgIiksbCgyKSxmKCJmb3JtQ29udHJvbCIsYS5zZWN1cml0eVF1ZXN0aW9uQ29udHJvbCksTmkoInZhbHVlIixhLnNlbGVjdGVkKSxsKCksR2UoYS5zZWN1cml0eVF1ZXN0aW9ucyksbCg2KSx3KGEuc2VjdXJpdHlRdWVzdGlvbkNvbnRyb2wuaW52YWxpZCYmYS5zZWN1cml0eVF1ZXN0aW9uQ29udHJvbC5lcnJvcnMucmVxdWlyZWQ/NTY6LTEpLGwoNCksZigiZm9ybUNvbnRyb2wiLGEuc2VjdXJpdHlBbnN3ZXJDb250cm9sKSgicGxhY2Vob2xkZXIiLEMoNjEsMzMsIlNFQ1VSSVRZX0FOU1dFUl9QTEFDRUhPTERFUiIpKSxsKDIpLHcoYS5zZWN1cml0eUFuc3dlckNvbnRyb2wuaW52YWxpZCYmYS5zZWN1cml0eUFuc3dlckNvbnRyb2wuZXJyb3JzLnJlcXVpcmVkPzYyOi0xKSxsKCksZigiZGlzYWJsZWQiLGEuZW1haWxDb250cm9sLmludmFsaWR8fGEucGFzc3dvcmRDb250cm9sLmludmFsaWR8fGEucmVwZWF0UGFzc3dvcmRDb250cm9sLmludmFsaWR8fGEuc2VjdXJpdHlRdWVzdGlvbkNvbnRyb2wuaW52YWxpZHx8YS5zZWN1cml0eUFuc3dlckNvbnRyb2wuaW52YWxpZCksbCgzKSxFKCIgIixDKDY3LDM1LCJCVE5fUkVHSVNURVIiKSwiICIpfX0sZGVwZW5kZW5jaWVzOltkZSxwZSxZLFNlLFFlLFplLGh0LGYxLFF0LCRlLG50LGF0LGd0LG10LHp0LGUxLEM0LGlzLG5zLFpuLEgyLG9lLGxlLG0yLGdlLENlLEtdLHN0eWxlczpbYG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6YXV0bzttaW4td2lkdGg6MzIwcHg7d2lkdGg6MjUlfW1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLXRvcDouNjI1cmVtfS5mb3JtLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtwb3NpdGlvbjpyZWxhdGl2ZX0jcmVnaXN0ZXJCdXR0b25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tdG9wOjJyZW07d2lkdGg6NjAlfSNhbHJlYWR5QUN1c3RvbWVyTGlua1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24tc2VsZjpjZW50ZXI7Zm9udC1zaXplOjEycHg7bWFyZ2luLXRvcDoyLjVyZW19LnNlY3VyaXR5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtwb3NpdGlvbjpyZWxhdGl2ZX0gIG1hdC1vcHRpb24gLm1hdC1tZGMtb3B0aW9uLXRleHR7Zm9udC1zaXplOjE0cHh9LmNlbnRlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOnN0cmV0Y2g7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmhpbnQtc3BhY2luZ1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6LjI1cmVtfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiB6Tih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiw3KSxtKDEsIk1BTkRBVE9SWV9FTUFJTCIpLHMoKSl9ZnVuY3Rpb24gVE4odCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsNyksbSgxLCJJTlZBTElEX0VNQUlMIikscygpKX1mdW5jdGlvbiBFTih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiw3KSxtKDEsIiBNQU5EQVRPUllfU0VDVVJJVFlfQU5TV0VSICIpLHMoKSl9ZnVuY3Rpb24gQU4odCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsNyksbSgxLCJNQU5EQVRPUllfTkVXX1BBU1NXT1JEICIpLHMoKSl9ZnVuY3Rpb24gRE4odCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsNyksbSgxLCIgTUFOREFUT1JZX1BBU1NXT1JEX1JFUEVBVCAiKSxzKCkpfWZ1bmN0aW9uIElOKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiLDcpLG0oMSwiIFBBU1NXT1JEU19OT1RfTUFUQ0hJTkcgIikscygpKX1mdW5jdGlvbiBMTih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiwyMyksbSgxLCJJTlZBTElEX1BBU1NXT1JEX0xFTkdUSCAiKSxzKCkpLHQmMiYmZigidHJhbnNsYXRlUGFyYW1zIixTdCgxLHVfKSl9ZnVuY3Rpb24gUE4odCxuKXtpZih0JjEmJih1KDAsImFwcC1wYXNzd29yZC1zdHJlbmd0aC1pbmZvIiwyNyksYigxLCJ0cmFuc2xhdGUiKSxiKDIsInRyYW5zbGF0ZSIpLGIoMywidHJhbnNsYXRlIiksYig0LCJ0cmFuc2xhdGUiKSxiKDUsInRyYW5zbGF0ZSIpKSx0JjIpe3YoKTtsZXQgZT1zZSg1Nik7ZigicGFzc3dvcmRDb21wb25lbnQiLGUpKCJsb3dlckNhc2VDcml0ZXJpYU1zZyIsQygxLDYsIkxPV0VSX0NBU0VfQ1JJVEVSSUFfTVNHIikpKCJ1cHBlckNhc2VDcml0ZXJpYU1zZyIsQygyLDgsIlVQUEVSX0NBU0VfQ1JJVEVSSUFfTVNHIikpKCJkaWdpdHNDcml0ZXJpYU1zZyIsQygzLDEwLCJESUdJVFNfQ1JJVEVSSUFfTVNHIikpKCJzcGVjaWFsQ2hhcnNDcml0ZXJpYU1zZyIsQyg0LDEyLCJTUEVDSUFMX0NIQVJTX0NSSVRFUklBX01TRyIpKSgibWluQ2hhcnNDcml0ZXJpYU1zZyIsZHQoNSwxNCwiTUlOX0NIQVJTX0NSSVRFUklBX01TRyIsU3QoMTcsa04pKSl9fWZ1bmN0aW9uIFZOKHQpe3JldHVybiBmdW5jdGlvbihlKXtsZXQgaT10LnZhbHVlLGE9ZS52YWx1ZTtyZXR1cm4gaSE9PWE/e25vdFNhbWU6ITB9Om51bGx9fXZhciB1XyxrTixnXyx2Xz14KCgpPT57RjEoKTt0cygpO1dlKCk7aygpO1l0KCk7cjEoKTtTYSgpO1coKTtuZSgpO2FzKCk7bzcoKTtGMygpO3ZpKCk7dmUoKTtldCgpO0plKCk7aGUoKTtrKCk7aGUoKTtXKCk7SmUoKTtldCgpO1dlKCk7dmUoKTtuZSgpO3VfPSgpPT4oe2xlbmd0aDoiNS00MCJ9KSxrTj0oKT0+KHt2YWx1ZTo4fSk7TGUuYWRkKHFyLEdyKTtnXz0oKCk9PntjbGFzcyB0e3NlY3VyaXR5UXVlc3Rpb25TZXJ2aWNlPWgodm8pO3VzZXJTZXJ2aWNlPWgoQXQpO3RyYW5zbGF0ZT1oKEl0KTtlbWFpbENvbnRyb2w9bmV3IGtlKCIiLFtKLnJlcXVpcmVkLEouZW1haWxdKTtzZWN1cml0eVF1ZXN0aW9uQ29udHJvbD1uZXcga2Uoe2Rpc2FibGVkOiEwLHZhbHVlOiIifSxbSi5yZXF1aXJlZF0pO3Bhc3N3b3JkQ29udHJvbD1uZXcga2Uoe2Rpc2FibGVkOiEwLHZhbHVlOiIifSxbSi5yZXF1aXJlZCxKLm1pbkxlbmd0aCg1KV0pO3JlcGVhdFBhc3N3b3JkQ29udHJvbD1uZXcga2Uoe2Rpc2FibGVkOiEwLHZhbHVlOiIifSxbSi5yZXF1aXJlZCxWTih0aGlzLnBhc3N3b3JkQ29udHJvbCldKTtzZWN1cml0eVF1ZXN0aW9uO2Vycm9yO2NvbmZpcm1hdGlvbjt0aW1lb3V0RHVyYXRpb249MWUzO3RpbWVvdXQ7ZmluZFNlY3VyaXR5UXVlc3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KSx0aGlzLnRpbWVvdXQ9c2V0VGltZW91dCgoKT0+e3RoaXMuc2VjdXJpdHlRdWVzdGlvbj12b2lkIDAsdGhpcy5lbWFpbENvbnRyb2wudmFsdWU/dGhpcy5zZWN1cml0eVF1ZXN0aW9uU2VydmljZS5maW5kQnkodGhpcy5lbWFpbENvbnRyb2wudmFsdWUpLnN1YnNjcmliZSh7bmV4dDplPT57ZT8odGhpcy5zZWN1cml0eVF1ZXN0aW9uPWUucXVlc3Rpb24sdGhpcy5zZWN1cml0eVF1ZXN0aW9uQ29udHJvbC5lbmFibGUoKSx0aGlzLnBhc3N3b3JkQ29udHJvbC5lbmFibGUoKSx0aGlzLnJlcGVhdFBhc3N3b3JkQ29udHJvbC5lbmFibGUoKSk6KHRoaXMuc2VjdXJpdHlRdWVzdGlvbkNvbnRyb2wuZGlzYWJsZSgpLHRoaXMucGFzc3dvcmRDb250cm9sLmRpc2FibGUoKSx0aGlzLnJlcGVhdFBhc3N3b3JkQ29udHJvbC5kaXNhYmxlKCkpfSxlcnJvcjplPT5lfSk6KHRoaXMuc2VjdXJpdHlRdWVzdGlvbkNvbnRyb2wuZGlzYWJsZSgpLHRoaXMucGFzc3dvcmRDb250cm9sLmRpc2FibGUoKSx0aGlzLnJlcGVhdFBhc3N3b3JkQ29udHJvbC5kaXNhYmxlKCkpfSx0aGlzLnRpbWVvdXREdXJhdGlvbil9cmVzZXRQYXNzd29yZCgpe3RoaXMudXNlclNlcnZpY2UucmVzZXRQYXNzd29yZCh7ZW1haWw6dGhpcy5lbWFpbENvbnRyb2wudmFsdWUsYW5zd2VyOnRoaXMuc2VjdXJpdHlRdWVzdGlvbkNvbnRyb2wudmFsdWUsbmV3OnRoaXMucGFzc3dvcmRDb250cm9sLnZhbHVlLHJlcGVhdDp0aGlzLnJlcGVhdFBhc3N3b3JkQ29udHJvbC52YWx1ZX0pLnN1YnNjcmliZSh7bmV4dDooKT0+e3RoaXMuZXJyb3I9dm9pZCAwLHRoaXMudHJhbnNsYXRlLmdldCgiUEFTU1dPUkRfU1VDQ0VTU0ZVTExZX0NIQU5HRUQiKS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMuY29uZmlybWF0aW9uPWV9LGVycm9yOmU9Pnt0aGlzLmNvbmZpcm1hdGlvbj1lfX0pLHRoaXMucmVzZXRGb3JtKCl9LGVycm9yOmU9Pnt0aGlzLmVycm9yPWUuZXJyb3IsdGhpcy5jb25maXJtYXRpb249dm9pZCAwLHRoaXMucmVzZXRFcnJvckZvcm0oKX19KX1yZXNldEZvcm0oKXt0aGlzLmVtYWlsQ29udHJvbC5zZXRWYWx1ZSgiIiksdGhpcy5lbWFpbENvbnRyb2wubWFya0FzUHJpc3RpbmUoKSx0aGlzLmVtYWlsQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKSx0aGlzLnNlY3VyaXR5UXVlc3Rpb25Db250cm9sLnNldFZhbHVlKCIiKSx0aGlzLnNlY3VyaXR5UXVlc3Rpb25Db250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5zZWN1cml0eVF1ZXN0aW9uQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKSx0aGlzLnBhc3N3b3JkQ29udHJvbC5zZXRWYWx1ZSgiIiksdGhpcy5wYXNzd29yZENvbnRyb2wubWFya0FzUHJpc3RpbmUoKSx0aGlzLnBhc3N3b3JkQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKSx0aGlzLnJlcGVhdFBhc3N3b3JkQ29udHJvbC5zZXRWYWx1ZSgiIiksdGhpcy5yZXBlYXRQYXNzd29yZENvbnRyb2wubWFya0FzUHJpc3RpbmUoKSx0aGlzLnJlcGVhdFBhc3N3b3JkQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKX1yZXNldEVycm9yRm9ybSgpe3RoaXMuZW1haWxDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5lbWFpbENvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5zZWN1cml0eVF1ZXN0aW9uQ29udHJvbC5zZXRWYWx1ZSgiIiksdGhpcy5zZWN1cml0eVF1ZXN0aW9uQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMuc2VjdXJpdHlRdWVzdGlvbkNvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5wYXNzd29yZENvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMucGFzc3dvcmRDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5wYXNzd29yZENvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5yZXBlYXRQYXNzd29yZENvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMucmVwZWF0UGFzc3dvcmRDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5yZXBlYXRQYXNzd29yZENvbnRyb2wubWFya0FzVW50b3VjaGVkKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLWZvcmdvdC1wYXNzd29yZCJdXSxkZWNsczo2Myx2YXJzOjQyLGNvbnN0czpbWyJwYXNzd29yZCIsIiJdLFsicmVwZWF0UGFzc3dvcmQiLCIiXSxbInBhc3N3b3JkSW5mb1RvZ2dsZSIsIiJdLFsicGFzc3dvcmRTdHJlbmd0aCIsIiJdLFsxLCJjZW50ZXItY29udGFpbmVyIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1lbGV2YXRpb24tejYiXSxbMSwibWRjLWNhcmQiXSxbInRyYW5zbGF0ZSIsIiJdLFsxLCJjb25maXJtYXRpb24iLDMsImhpZGRlbiJdLFsxLCJlcnJvciIsMywiaGlkZGVuIl0sWzEsImZvcm0tY29udGFpbmVyIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZSIsImNvbG9yIiwiYWNjZW50Il0sWyJpZCIsImVtYWlsIiwidHlwZSIsImVtYWlsIiwibWF0SW5wdXQiLCIiLCJwbGFjZWhvbGRlciIsIkVudGVyIHlvdXIgZW1haWwiLCJhcmlhLWxhYmVsIiwiRW1haWwgYWRkcmVzcyBmaWVsZCIsMywibmdNb2RlbENoYW5nZSIsImZvcm1Db250cm9sIl0sWyJtYXRTdWZmaXgiLCIiLCJtYXRUb29sdGlwUG9zaXRpb24iLCJyaWdodCIsImFyaWEtbGFiZWwiLCJQbGVhc2UgZW50ZXIgeW91ciBlbWFpbCBhZGRyZXNzIHRvIHByb2NlZWQiLDMsIm1hdFRvb2x0aXAiXSxbImlkIiwiZm9yZ290LWZvcm0iLDEsImZvcm0tY29udGFpbmVyIl0sWyJpZCIsInNlY3VyaXR5QW5zd2VyIiwidHlwZSIsInBhc3N3b3JkIiwibWF0SW5wdXQiLCIiLCJhcmlhLWxhYmVsIiwiRmllbGQgZm9yIHRoZSBhbnN3ZXIgdG8gdGhlIHNlY3VyaXR5IHF1ZXN0aW9uIiwzLCJmb3JtQ29udHJvbCIsInBsYWNlaG9sZGVyIl0sWyJtYXRTdWZmaXgiLCIiLCJtYXRUb29sdGlwUG9zaXRpb24iLCJyaWdodCIsImFyaWEtbGFiZWwiLCJQbGVhc2UgYW5zd2VyIHlvdXIgc2VsZWN0ZWQgc2VjdXJpdHkgcXVlc3Rpb24iLDMsIm1hdFRvb2x0aXAiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lIiwiY29sb3IiLCJhY2NlbnQiLCJzdWJzY3JpcHRTaXppbmciLCJkeW5hbWljIl0sWyJpZCIsIm5ld1Bhc3N3b3JkIiwidHlwZSIsInBhc3N3b3JkIiwibWF0SW5wdXQiLCIiLCJwbGFjZWhvbGRlciIsIiIsImFyaWEtbGFiZWwiLCJGaWVsZCBmb3IgTmV3IFBhc3N3b3JkIiwzLCJmb3JtQ29udHJvbCJdLFsxLCJmYXMiLCJmYS1leGNsYW1hdGlvbi1jaXJjbGUiXSxbInRyYW5zbGF0ZSIsIiIsMSwiaW5saW5lLWhpbnQiXSxbImFsaWduIiwiZW5kIl0sWyJpZCIsIm5ld1Bhc3N3b3JkUmVwZWF0IiwidHlwZSIsInBhc3N3b3JkIiwibWF0SW5wdXQiLCIiLCJwbGFjZWhvbGRlciIsIiIsImFyaWEtbGFiZWwiLCJGaWVsZCB0byBjb25maXJtIHRoZSBuZXcgcGFzc3dvcmQiLDMsImZvcm1Db250cm9sIl0sWyJ0cmFuc2xhdGUiLCIiLDMsInRyYW5zbGF0ZVBhcmFtcyJdLFszLCJjb2xvciJdLFszLCJwYXNzd29yZCJdLFsxLCJhZHZpY2UtY29udGFpbmVyIl0sWzMsInBhc3N3b3JkQ29tcG9uZW50IiwibG93ZXJDYXNlQ3JpdGVyaWFNc2ciLCJ1cHBlckNhc2VDcml0ZXJpYU1zZyIsImRpZ2l0c0NyaXRlcmlhTXNnIiwic3BlY2lhbENoYXJzQ3JpdGVyaWFNc2ciLCJtaW5DaGFyc0NyaXRlcmlhTXNnIl0sWyJ0eXBlIiwic3VibWl0IiwiaWQiLCJyZXNldEJ1dHRvbiIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiY29sb3IiLCJwcmltYXJ5IiwiYXJpYS1sYWJlbCIsIkJ1dHRvbiB0byBjb25maXJtIHRoZSBjaGFuZ2VzIiwzLCJjbGljayIsImRpc2FibGVkIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLDEsImZhciIsImZhLWVkaXQiLCJmYS1sZyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO2MoMCwiZGl2Iiw0KSgxLCJtYXQtY2FyZCIsNSkoMiwiZGl2Iiw2KSgzLCJoMSIsNyksbSg0LCJUSVRMRV9GT1JHT1RfUEFTU1dPUkQiKSxzKCksYyg1LCJkaXYiLDgpLG0oNikscygpLGMoNywiZGl2Iiw5KSxtKDgpLHMoKSxjKDksImRpdiIsMTApKDEwLCJtYXQtZm9ybS1maWVsZCIsMTEpKDExLCJtYXQtbGFiZWwiLDcpLG0oMTIsIkxBQkVMX0VNQUlMIikscygpLGMoMTMsImlucHV0IiwxMiksUygibmdNb2RlbENoYW5nZSIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuZmluZFNlY3VyaXR5UXVlc3Rpb24oKSl9KSxzKCksYygxNCwibWF0LWljb24iLDEzKSxiKDE1LCJ0cmFuc2xhdGUiKSxtKDE2LCJoZWxwX291dGxpbmUgIikscygpLE0oMTcsek4sMiwwLCJtYXQtZXJyb3IiLDcpLE0oMTgsVE4sMiwwLCJtYXQtZXJyb3IiLDcpLHMoKSgpLGMoMTksImRpdiIsMTQpKDIwLCJtYXQtZm9ybS1maWVsZCIsMTEpKDIxLCJtYXQtbGFiZWwiLDcpLG0oMjIsIkxBQkVMX1NFQ1VSSVRZX1FVRVNUSU9OIikscygpLHUoMjMsImlucHV0IiwxNSksYygyNCwibWF0LWljb24iLDE2KSxiKDI1LCJ0cmFuc2xhdGUiKSxtKDI2LCJoZWxwX291dGxpbmUgIikscygpLE0oMjcsRU4sMiwwLCJtYXQtZXJyb3IiLDcpLHMoKSxjKDI4LCJtYXQtZm9ybS1maWVsZCIsMTcpKDI5LCJtYXQtbGFiZWwiLDcpLG0oMzAsIkxBQkVMX05FV19QQVNTV09SRCIpLHMoKSx1KDMxLCJpbnB1dCIsMTgsMCksYygzMywibWF0LWhpbnQiLDcpLHUoMzQsImkiLDE5KSxjKDM1LCJlbSIsMjApLG0oMzYpLGIoMzcsInRyYW5zbGF0ZSIpLHMoKSgpLGMoMzgsIm1hdC1oaW50IiwyMSksbSgzOSkscygpLE0oNDAsQU4sMiwwLCJtYXQtZXJyb3IiLDcpLHMoKSxjKDQxLCJtYXQtZm9ybS1maWVsZCIsMTEpKDQyLCJtYXQtbGFiZWwiLDcpLG0oNDMsIkxBQkVMX1JFUEVBVF9ORVdfUEFTU1dPUkQiKSxzKCksdSg0NCwiaW5wdXQiLDIyLDEpLGMoNDYsIm1hdC1oaW50IiwyMSksbSg0NykscygpLE0oNDgsRE4sMiwwLCJtYXQtZXJyb3IiLDcpLE0oNDksSU4sMiwwLCJtYXQtZXJyb3IiLDcpLE0oNTAsTE4sMiwyLCJtYXQtZXJyb3IiLDIzKSxzKCksYyg1MSwibWF0LXNsaWRlLXRvZ2dsZSIsMjQsMiksbSg1MyksYig1NCwidHJhbnNsYXRlIikscygpLHUoNTUsImFwcC1wYXNzd29yZC1zdHJlbmd0aCIsMjUsMyksYyg1NywiZGl2IiwyNiksTSg1OCxQTiw2LDE4LCJhcHAtcGFzc3dvcmQtc3RyZW5ndGgtaW5mbyIsMjcpLHMoKSgpLGMoNTksImJ1dHRvbiIsMjgpLFMoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5yZXNldFBhc3N3b3JkKCkpfSksdSg2MCwiaSIsMjkpLG0oNjEpLGIoNjIsInRyYW5zbGF0ZSIpLHMoKSgpKCkoKX1pZihpJjIpe2xldCByPXNlKDMyKSxvPXNlKDQ1KSxkPXNlKDUyKSxwPXNlKDU2KTtsKDUpLGYoImhpZGRlbiIsIShhLmNvbmZpcm1hdGlvbiYmIWEuZW1haWxDb250cm9sLmRpcnR5JiYhYS5zZWN1cml0eVF1ZXN0aW9uQ29udHJvbC5kaXJ0eSYmIWEucGFzc3dvcmRDb250cm9sLmRpcnR5JiYhYS5yZXBlYXRQYXNzd29yZENvbnRyb2wuZGlydHkpKSxsKCksRSgiICIsYS5jb25maXJtYXRpb24sIiAiKSxsKCksZigiaGlkZGVuIiwhKGEuZXJyb3ImJiFhLmVtYWlsQ29udHJvbC5kaXJ0eSYmIWEuc2VjdXJpdHlRdWVzdGlvbkNvbnRyb2wuZGlydHkmJiFhLnBhc3N3b3JkQ29udHJvbC5kaXJ0eSYmIWEucmVwZWF0UGFzc3dvcmRDb250cm9sLmRpcnR5KSksbCgpLEUoIiAiLGEuZXJyb3IsIiAiKSxsKDUpLGYoImZvcm1Db250cm9sIixhLmVtYWlsQ29udHJvbCksbCgpLGYoIm1hdFRvb2x0aXAiLFZlKEMoMTUsMzAsIk1BTkRBVE9SWV9FTUFJTCIpKSksbCgzKSx3KGEuZW1haWxDb250cm9sLmludmFsaWQmJmEuZW1haWxDb250cm9sLmVycm9ycy5yZXF1aXJlZD8xNzotMSksbCgpLHcoYS5lbWFpbENvbnRyb2wuaW52YWxpZCYmYS5lbWFpbENvbnRyb2wuZXJyb3JzLmVtYWlsPzE4Oi0xKSxsKDUpLGYoInBsYWNlaG9sZGVyIixWZShhLnNlY3VyaXR5UXVlc3Rpb24pKSgiZm9ybUNvbnRyb2wiLGEuc2VjdXJpdHlRdWVzdGlvbkNvbnRyb2wpLGwoKSxmKCJtYXRUb29sdGlwIixWZShDKDI1LDMyLCJNQU5EQVRPUllfU0VDVVJJVFlfQU5TV0VSIikpKSxsKDMpLHcoYS5zZWN1cml0eVF1ZXN0aW9uQ29udHJvbC5pbnZhbGlkJiZhLnNlY3VyaXR5UXVlc3Rpb25Db250cm9sLmVycm9ycy5yZXF1aXJlZD8yNzotMSksbCg0KSxmKCJmb3JtQ29udHJvbCIsYS5wYXNzd29yZENvbnRyb2wpLGwoNSksQShkdCgzNywzNCwiSU5WQUxJRF9QQVNTV09SRF9MRU5HVEgiLFN0KDQxLHVfKSkpLGwoMyksRSgiIiwoci52YWx1ZT09bnVsbD9udWxsOnIudmFsdWUubGVuZ3RoKXx8MCwiLzIwIiksbCgpLHcoYS5wYXNzd29yZENvbnRyb2wuaW52YWxpZCYmYS5wYXNzd29yZENvbnRyb2wuZXJyb3JzLnJlcXVpcmVkPzQwOi0xKSxsKDQpLGYoImZvcm1Db250cm9sIixhLnJlcGVhdFBhc3N3b3JkQ29udHJvbCksbCgzKSxFKCIiLChvLnZhbHVlPT1udWxsP251bGw6by52YWx1ZS5sZW5ndGgpfHwwLCIvMjAiKSxsKCksdyhhLnJlcGVhdFBhc3N3b3JkQ29udHJvbC5pbnZhbGlkJiZhLnJlcGVhdFBhc3N3b3JkQ29udHJvbC5lcnJvcnMucmVxdWlyZWQ/NDg6LTEpLGwoKSx3KGEucmVwZWF0UGFzc3dvcmRDb250cm9sLmludmFsaWQmJmEucmVwZWF0UGFzc3dvcmRDb250cm9sLmVycm9ycy5ub3RTYW1lPzQ5Oi0xKSxsKCksdyhhLnJlcGVhdFBhc3N3b3JkQ29udHJvbC5pbnZhbGlkJiYoYS5yZXBlYXRQYXNzd29yZENvbnRyb2whPW51bGwmJmEucmVwZWF0UGFzc3dvcmRDb250cm9sLmVycm9ycy5taW5sZW5ndGh8fGEucmVwZWF0UGFzc3dvcmRDb250cm9sIT1udWxsJiZhLnJlcGVhdFBhc3N3b3JkQ29udHJvbC5lcnJvcnMubWF4bGVuZ3RoKT81MDotMSksbCgpLGYoImNvbG9yIixwLmNvbG9yKSxsKDIpLEEoQyg1NCwzNywiU0hPV19QQVNTV09SRF9BRFZJQ0UiKSksbCgyKSxmKCJwYXNzd29yZCIsci52YWx1ZSksbCgzKSx3KGQuY2hlY2tlZD81ODotMSksbCgpLGYoImRpc2FibGVkIixhLmVtYWlsQ29udHJvbC5pbnZhbGlkfHxhLnNlY3VyaXR5UXVlc3Rpb25Db250cm9sLmludmFsaWR8fGEucGFzc3dvcmRDb250cm9sLmludmFsaWR8fGEucmVwZWF0UGFzc3dvcmRDb250cm9sLmludmFsaWR8fGEucmVwZWF0UGFzc3dvcmRDb250cm9sLmRpc2FibGVkKSxsKDIpLEUoIiAiLEMoNjIsMzksIkJUTl9DSEFOR0UiKSwiICIpfX0sZGVwZW5kZW5jaWVzOltkZSxwZSxZLFNlLFFlLFplLGh0LGYxLFF0LHYyLCRlLG50LGF0LGd0LG10LHp0LGUxLGdlLENlLFJ0LEM0LGlzLG5zLG9lLGxlLEtdLHN0eWxlczpbYG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6YXV0bzttaW4td2lkdGg6MzIwcHg7d2lkdGg6MjUlfW1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLXRvcDouNjI1cmVtfS5mb3JtLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtwb3NpdGlvbjpyZWxhdGl2ZX1idXR0b25bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tdG9wOjJyZW07d2lkdGg6NjAlfW1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmIWltcG9ydGFudH1tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjpwbGFjZWhvbGRlcntjb2xvcjojZmZmZmZmODAhaW1wb3J0YW50fSNmb3Jnb3QtZm9ybVtfbmdjb250ZW50LSVDT01QJV0gICBtYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2IwYjBiMDtmb250LXNpemU6LjhlbTtmb250LXN0eWxlOml0YWxpY30uaW5saW5lLWhpbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0Oi4yNXJlbX0uYWR2aWNlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luLXRvcDoxcmVtO3BhZGRpbmctdG9wOjFyZW07cG9zaXRpb246cmVsYXRpdmV9LmFkdmljZS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDA0ZDtib3JkZXItcmFkaXVzOjJweDtjb250ZW50OiIiO2hlaWdodDozcHg7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjB9LmFkdmljZS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdICAgYXBwLXBhc3N3b3JkLXN0cmVuZ3RoLWluZm9bX25nY29udGVudC0lQ09NUCVde21heC13aWR0aDo0MDBweDt3aWR0aDoxMDAlfS5jZW50ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpzdHJldGNoO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgX28scnM9eCgoKT0+e050KCk7aygpO1d0KCk7bHQoKTtrKCk7X289KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtob3N0PXRoaXMuaG9zdFNlcnZlcisiL3Jlc3QvcHJvZHVjdHMiO2dldChlKXtyZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmhvc3R9LyR7ZX0vcmV2aWV3c2ApLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9Y3JlYXRlKGUsaSl7cmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5ob3N0fS8ke2V9L3Jldmlld3NgLGkpLnBpcGUocShhPT5hLmRhdGEpLGooYT0+e3Rocm93IGF9KSl9cGF0Y2goZSl7cmV0dXJuIHRoaXMuaHR0cC5wYXRjaCh0aGlzLmhvc3QrIi9yZXZpZXdzIixlKS5waXBlKHEoaT0+aS5kYXRhKSxqKGk9Pnt0aHJvdyBpfSkpfWxpa2UoZSl7cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuaG9zdCsiL3Jldmlld3MiLHtpZDplfSkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIE9OKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiLDIpLG0oMSwiTUFOREFUT1JZX1JFVklFVyIpLHMoKSl9dmFyIF9fLGJfPXgoKCk9PntrKCk7Z2koKTtXZSgpO3JzKCk7WXQoKTtyMSgpO0oxKCk7bmUoKTtldCgpO0plKCk7VygpO3ZlKCk7aygpO1coKTtKZSgpO2V0KCk7V2UoKTtuZSgpO3ZlKCk7TGUuYWRkKG5hLEphKTtfXz0oKCk9PntjbGFzcyB0e2RhdGE9aChVaSk7cHJvZHVjdFJldmlld1NlcnZpY2U9aChfbyk7ZGlhbG9nUmVmPWgodGEpO3NuYWNrQmFySGVscGVyU2VydmljZT1oKFZ0KTtlZGl0UmV2aWV3Q29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWQsSi5taW5MZW5ndGgoMSksSi5tYXhMZW5ndGgoMTYwKV0pO2Vycm9yPW51bGw7bmdPbkluaXQoKXt0aGlzLmVkaXRSZXZpZXdDb250cm9sLnNldFZhbHVlKHRoaXMuZGF0YS5yZXZpZXdEYXRhLm1lc3NhZ2UpfWVkaXRSZXZpZXcoKXt0aGlzLnByb2R1Y3RSZXZpZXdTZXJ2aWNlLnBhdGNoKHtpZDp0aGlzLmRhdGEucmV2aWV3RGF0YS5faWQsbWVzc2FnZTp0aGlzLmVkaXRSZXZpZXdDb250cm9sLnZhbHVlfSkuc3Vic2NyaWJlKHtuZXh0OigpPT57dGhpcy5kaWFsb2dSZWYuY2xvc2UoKX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpLHRoaXMuZXJyb3I9ZX19KSx0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKCJDT05GSVJNX0NIQU5HRVNfU0FWRUQiKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtcHJvZHVjdC1yZXZpZXctZWRpdCJdXSxkZWNsczoyNyx2YXJzOjE0LGNvbnN0czpbWyJ0ZXh0UHV0IiwiIl0sWzEsImNvbnRhaW5lciIsImNvbHVtbi1sYXlvdXQiXSxbInRyYW5zbGF0ZSIsIiJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmUiLCJjb2xvciIsImFjY2VudCIsImhpbnRMYWJlbCIsIk1heCAxNjAgY2hhcmFjdGVycyIsImZsb2F0TGFiZWwiLCJhbHdheXMiXSxbIm1hdElucHV0IiwiIiwibWF0VGV4dGFyZWFBdXRvc2l6ZSIsIiIsIm1hdEF1dG9zaXplTWluUm93cyIsIjIiLCJtYXhsZW5ndGgiLCIxNjAiLCJtYXRBdXRvc2l6ZU1heFJvd3MiLCI0IiwiYXJpYS1sYWJlbCIsIlRleHQgZmllbGQgdG8gZWRpdCBhIHByb2R1Y3QgcmV2aWV3IiwzLCJmb2N1cyIsImZvcm1Db250cm9sIiwicGxhY2Vob2xkZXIiXSxbImFsaWduIiwiZW5kIl0sWyJtYXQtc3Ryb2tlZC1idXR0b24iLCIiLCJtYXQtZGlhbG9nLWNsb3NlIiwiIiwiYXJpYS1sYWJlbCIsIkNsb3NlIERpYWxvZyIsMSwiY2xvc2UtZGlhbG9nIl0sWyJ0eXBlIiwic3VibWl0IiwibWF0LXJhaXNlZC1idXR0b24iLCIiLCJjb2xvciIsInByaW1hcnkiLCJhcmlhLWxhYmVsIiwiU2VuZCB0aGUgcmV2aWV3IiwxLCJzdWJtaXQtYnV0dG9uIiwzLCJjbGljayIsImRpc2FibGVkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aWYoaSYxKXtsZXQgcj1MKCk7YygwLCJtYXQtZGlhbG9nLWNvbnRlbnQiKSgxLCJkaXYiLDEpKDIsImgxIiwyKSxtKDMsIkxBQkVMX0VESVRfUkVWSUVXIikscygpLGMoNCwiZGl2IikoNSwibWF0LWZvcm0tZmllbGQiLDMpKDYsIm1hdC1sYWJlbCIsMiksbSg3LCJMQUJFTF9SRVZJRVciKSxzKCksYyg4LCJ0ZXh0YXJlYSIsNCwwKSxiKDEwLCJ0cmFuc2xhdGUiKSxTKCJmb2N1cyIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuZXJyb3I9bnVsbCl9KSxzKCksYygxMSwibWF0LWhpbnQiLDUpLG0oMTIpLHMoKSxNKDEzLE9OLDIsMCwibWF0LWVycm9yIiwyKSxzKCkoKSgpKCksYygxNCwibWF0LWRpYWxvZy1hY3Rpb25zIiw1KSgxNSwiYnV0dG9uIiw2KSgxNiwibWF0LWljb24iKSxtKDE3LCJjbG9zZSIpLHMoKSxjKDE4LCJzcGFuIiksbSgxOSksYigyMCwidHJhbnNsYXRlIikscygpKCksYygyMSwiYnV0dG9uIiw3KSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuZWRpdFJldmlldygpKX0pLGMoMjIsIm1hdC1pY29uIiksbSgyMywic2VuZCIpLHMoKSxjKDI0LCJzcGFuIiksbSgyNSksYigyNiwidHJhbnNsYXRlIikscygpKCkoKX1pZihpJjIpe2xldCByPXNlKDkpO2woOCksZigicGxhY2Vob2xkZXIiLFZlKEMoMTAsOCwiV1JJVEVfUkVWSUVXX1BMQUNFSE9MREVSIikpKSgiZm9ybUNvbnRyb2wiLGEuZWRpdFJldmlld0NvbnRyb2wpLGwoNCksRSgiIiwoci52YWx1ZT09bnVsbD9udWxsOnIudmFsdWUubGVuZ3RoKXx8MCwiLzE2MCIpLGwoKSx3KGEuZWRpdFJldmlld0NvbnRyb2wuaW52YWxpZD8xMzotMSksbCg2KSxBKEMoMjAsMTAsIkJUTl9DTE9TRSIpKSxsKDIpLGYoImRpc2FibGVkIixhLmVkaXRSZXZpZXdDb250cm9sLmludmFsaWQpLGwoNCksQShDKDI2LDEyLCJCVE5fU1VCTUlUIikpfX0sZGVwZW5kZW5jaWVzOlt0MixZLFNlLFFlLFplLGh0LGYxLFF0LCRlLG50LGF0LGd0LG10LE1pLHp0LGUxLGkyLG9lLGxlLFBpLGdlLENlLEtdLHN0eWxlczpbYG1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5jb2x1bW4tbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5zdWJtaXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDouMjVyZW19CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIE5OKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDcpLGIoMSwidHJhbnNsYXRlIiksYygyLCJzcGFuIiwyMSksdSgzLCJpIiwyMiksYyg0LCJzcGFuIiwyMyksbSg1KSxzKCkoKSgpKSx0JjIpe2xldCBlPXYoKTtmKCJtYXRUb29sdGlwIixWZShDKDEsMywiTEFCRUxfQk9OVVMiKSkpLGwoNSksQShlLmRhdGEucHJvZHVjdERhdGEucG9pbnRzKX19ZnVuY3Rpb24gUk4odCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImRpdiIsMjQpKDEsImRpdiIsMjUpKDIsImRpdiIsMjYpLGIoMywidHJhbnNsYXRlIiksUygiY2xpY2siLGZ1bmN0aW9uKCl7bGV0IGE9eihlKS4kaW1wbGljaXQscj12KDIpO3JldHVybiBUKGEuYXV0aG9yIT09IkFub255bW91cyImJmEuYXV0aG9yPT09ci5hdXRob3ImJnIuZWRpdFJldmlldyhhKSl9KSxjKDQsImNpdGUiKSxtKDUpLHMoKSxjKDYsInAiKSxtKDcpLHMoKSgpLGMoOCwiZGl2IiwyNykoOSwiYnV0dG9uIiwyOCksUygiY2xpY2siLGZ1bmN0aW9uKCl7bGV0IGE9eihlKS4kaW1wbGljaXQscj12KDIpO3JldHVybiBUKHIubGlrZVJldmlldyhhKSl9KSxjKDEwLCJtYXQtaWNvbiIpLG0oMTEsInRodW1iX3VwIikscygpLGMoMTIsInNwYW4iLDI5KSxtKDEzKSxzKCkoKSgpKCkoKX1pZih0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9digyKTtsKDIpLGYoIm1hdFRvb2x0aXBEaXNhYmxlZCIsVmUoZS5hdXRob3IhPT1pLmF1dGhvcikpKCJtYXRUb29sdGlwIixWZShDKDMsOCwiTEFCRUxfRURJVF9SRVZJRVciKSkpLGwoMyksQShlLmF1dGhvciksbCgyKSxBKGUubWVzc2FnZSksbCgyKSxmKCJkaXNhYmxlZCIsZS5saWtlZHx8IWkuaXNMb2dnZWRJbigpKSxsKDQpLEEoZS5saWtlc0NvdW50KX19ZnVuY3Rpb24gRk4odCxuKXtpZih0JjEmJihjKDAsImRpdiIpLHFlKDEsUk4sMTQsMTAsImRpdiIsMjQsRnQpLGIoMywiYXN5bmMiKSxzKCkpLHQmMil7bGV0IGU9digpO2woKSxHZShDKDMsMCxlLnJldmlld3MkKSl9fWZ1bmN0aW9uIEJOKHQsbil7dCYxJiYoYygwLCJkaXYiKSgxLCJzcGFuIiwzMCksbSgyLCIgRU1QVFlfUkVWSUVXX0xJU1QgIikscygpKCkpfXZhciBITixvcyxjNz14KCgpPT57Yl8oKTtGMSgpO3JzKCk7aygpO2dpKCk7WXQoKTtyMSgpO1dlKCk7TXIoKTtKMSgpO2V0KCk7SmUoKTt2ZSgpO1coKTt4NCgpO25lKCk7cWkoKTt2aSgpO2ExKCk7aygpO25lKCk7VygpO3ZlKCk7SmUoKTtldCgpO1dlKCk7SE49KCk9Pih7bGVuZ3RoOiIxNjAifSk7TGUuYWRkKG5hLEphLFNmLGczLFVwKTtvcz0oKCk9PntjbGFzcyB0e2RpYWxvZz1oKE4xKTtkYXRhPWgoVWkpO3Byb2R1Y3RSZXZpZXdTZXJ2aWNlPWgoX28pO3VzZXJTZXJ2aWNlPWgoQXQpO3NuYWNrQmFyPWgoSjIpO3NuYWNrQmFySGVscGVyU2VydmljZT1oKFZ0KTthdXRob3I9IkFub255bW91cyI7cmV2aWV3cyQ7dXNlclN1YnNjcmlwdGlvbjtyZXZpZXdDb250cm9sPW5ldyBrZSgiIixbSi5tYXhMZW5ndGgoMTYwKV0pO25nT25Jbml0KCl7dGhpcy5kYXRhLnByb2R1Y3REYXRhLnBvaW50cz1NYXRoLnJvdW5kKHRoaXMuZGF0YS5wcm9kdWN0RGF0YS5wcmljZS8xMCksdGhpcy5yZXZpZXdzJD10aGlzLnByb2R1Y3RSZXZpZXdTZXJ2aWNlLmdldCh0aGlzLmRhdGEucHJvZHVjdERhdGEuaWQpLHRoaXMudXNlclN1YnNjcmlwdGlvbj10aGlzLnVzZXJTZXJ2aWNlLndob0FtSShbImVtYWlsIl0pLnN1YnNjcmliZSh7bmV4dDplPT57ZT8uZW1haWw/dGhpcy5hdXRob3I9ZS5lbWFpbDp0aGlzLmF1dGhvcj0iQW5vbnltb3VzIn0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfW5nT25EZXN0cm95KCl7dGhpcy51c2VyU3Vic2NyaXB0aW9uJiZ0aGlzLnVzZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKX1hZGRSZXZpZXcoZSl7bGV0IGk9e21lc3NhZ2U6ZS52YWx1ZSxhdXRob3I6dGhpcy5hdXRob3J9O2UudmFsdWU9IiIsdGhpcy5wcm9kdWN0UmV2aWV3U2VydmljZS5jcmVhdGUodGhpcy5kYXRhLnByb2R1Y3REYXRhLmlkLGkpLnN1YnNjcmliZSh7bmV4dDooKT0+e3RoaXMucmV2aWV3cyQ9dGhpcy5wcm9kdWN0UmV2aWV3U2VydmljZS5nZXQodGhpcy5kYXRhLnByb2R1Y3REYXRhLmlkKX0sZXJyb3I6YT0+e2NvbnNvbGUubG9nKGEpfX0pLHRoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oIkNPTkZJUk1fUkVWSUVXX1NBVkVEIil9ZWRpdFJldmlldyhlKXt0aGlzLmRpYWxvZy5vcGVuKF9fLHt3aWR0aDoiNTAwcHgiLGhlaWdodDoibWF4LWNvbnRlbnQiLGRhdGE6e3Jldmlld0RhdGE6ZX19KS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKT0+dGhpcy5yZXZpZXdzJD10aGlzLnByb2R1Y3RSZXZpZXdTZXJ2aWNlLmdldCh0aGlzLmRhdGEucHJvZHVjdERhdGEuaWQpKX1saWtlUmV2aWV3KGUpe3RoaXMucHJvZHVjdFJldmlld1NlcnZpY2UubGlrZShlLl9pZCkuc3Vic2NyaWJlKCgpPT57Y29uc29sZS5sb2coIkxpa2VkICIrZS5faWQpfSksc2V0VGltZW91dCgoKT0+dGhpcy5yZXZpZXdzJD10aGlzLnByb2R1Y3RSZXZpZXdTZXJ2aWNlLmdldCh0aGlzLmRhdGEucHJvZHVjdERhdGEuaWQpLDIwMCl9aXNMb2dnZWRJbigpe3JldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidG9rZW4iKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtcHJvZHVjdC1kZXRhaWxzIl1dLGRlY2xzOjU4LHZhcnM6NDAsY29uc3RzOltbInRleHRQdXQiLCIiXSxbMSwiY29udGFpbmVyIl0sWzEsImRldGFpbHMtcm93Il0sWzEsIm5vLXNocmluayJdLFsxLCJpbWctdGh1bWJuYWlsIiwzLCJzcmMiLCJhbHQiXSxbMywiaW5uZXJIVE1MIl0sWzEsIml0ZW0tcHJpY2UiXSxbImFyaWEtbGFiZWwiLCJCb251cyBwb2ludHMgd2hlbiBidXlpbmcgdGhlIHByb2R1Y3QiLDMsIm1hdFRvb2x0aXAiXSxbMSwiZGV0YWlsLWRpdmlkZXIiXSxbIm1hdC1idXR0b24iLCIiLDEsImF1dG8tZm9jdXMtYWJzb3JiZXIiXSxbImFyaWEtbGFiZWwiLCJFeHBhbmQgZm9yIFJldmlld3MiLDEsIm1hdC1lbGV2YXRpb24tejAiXSxbInRyYW5zbGF0ZSIsIiIsMSwicmV2aWV3LWxhYmVsLXNwYWNpbmciXSxbInRyYW5zbGF0ZSIsIiJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmUiLCJjb2xvciIsImFjY2VudCIsImZsb2F0TGFiZWwiLCJhbHdheXMiXSxbMSwiZmFzIiwiZmEtZXhjbGFtYXRpb24tY2lyY2xlIl0sWzEsImhpbnQtc3BhY2luZyJdLFsiY29scyIsIjUwIiwibWF0SW5wdXQiLCIiLCJtYXRUZXh0YXJlYUF1dG9zaXplIiwiIiwibWF0QXV0b3NpemVNaW5Sb3dzIiwiMiIsIm1heGxlbmd0aCIsIjE2MCIsIm1hdEF1dG9zaXplTWF4Um93cyIsIjQiLCJhcmlhLWxhYmVsIiwiVGV4dCBmaWVsZCB0byByZXZpZXcgYSBwcm9kdWN0IiwzLCJmb3JtQ29udHJvbCIsInBsYWNlaG9sZGVyIl0sWyJhbGlnbiIsImVuZCJdLFsiYWxpZ24iLCJlbmQiLDEsImRpYWxvZ0FjdGlvbiJdLFsibWF0LXN0cm9rZWQtYnV0dG9uIiwiIiwibWF0LWRpYWxvZy1jbG9zZSIsIiIsImFyaWEtbGFiZWwiLCJDbG9zZSBEaWFsb2ciLDEsImNsb3NlLWRpYWxvZyIsImJ1dHRvbnMiXSxbInR5cGUiLCJzdWJtaXQiLCJpZCIsInN1Ym1pdEJ1dHRvbiIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiY29sb3IiLCJwcmltYXJ5IiwiYXJpYS1sYWJlbCIsIlNlbmQgdGhlIHJldmlldyIsMSwiYnV0dG9ucyIsInN1Ym1pdC1idXR0b24tc3BhY2luZyIsMywiY2xpY2siLCJkaXNhYmxlZCJdLFsxLCJmYS0yeCIsImZhLWxheWVycyIsImZhLWZ3Il0sWzEsImZhcyIsImZhLWNyb3duIl0sWzEsImZhLWxheWVycy1jb3VudGVyIiwiZmEtbGF5ZXJzLWJvdHRvbS1sZWZ0IiwiZmEtMngiLCJ3YXJuLW5vdGlmaWNhdGlvbiJdLFsxLCJjb21tZW50Il0sWzEsInJldmlldy1yb3ciXSxbIm1hdFRvb2x0aXBQb3NpdGlvbiIsInJpZ2h0IiwxLCJyZXZpZXctdGV4dCIsMywiY2xpY2siLCJtYXRUb29sdGlwRGlzYWJsZWQiLCJtYXRUb29sdGlwIl0sWzEsImxpa2UtY29udGFpbmVyIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIiwiUmF0ZSBhIGhlbHBmdWwgcmV2aWV3IiwxLCJydy1idXR0b24iLDMsImNsaWNrIiwiZGlzYWJsZWQiXSxbMSwibGlrZS1jb3VudGVyIiwiYWNjZW50LW5vdGlmaWNhdGlvbiJdLFsidHJhbnNsYXRlIiwiIiwxLCJub1Jlc3VsdFRleHQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtjKDAsIm1hdC1kaWFsb2ctY29udGVudCIpKDEsImRpdiIsMSkoMiwiZGl2IiwyKSgzLCJkaXYiLDMpLHUoNCwiaW1nIiw0KSxzKCksYyg1LCJkaXYiKSg2LCJoMSIpLG0oNykscygpLHUoOCwiZGl2Iiw1KSg5LCJiciIpLGMoMTAsImRpdiIpKDExLCJwIiw2KSxtKDEyKSxzKCksTSgxMyxOTiw2LDUsImRpdiIsNykscygpKCkoKSx1KDE0LCJtYXQtZGl2aWRlciIsOCkoMTUsImJ1dHRvbiIsOSksYygxNiwibWF0LWV4cGFuc2lvbi1wYW5lbCIsMTApKDE3LCJtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciIpKDE4LCJtYXQtcGFuZWwtdGl0bGUiKSgxOSwic3BhbiIsMTEpLG0oMjAsIkxBQkVMX1JFVklFV1MiKSxzKCksYygyMSwic3BhbiIpLG0oMjIpLGIoMjMsImFzeW5jIikscygpKCkoKSx1KDI0LCJidXR0b24iLDkpLE0oMjUsRk4sNCwyLCJkaXYiKSxiKDI2LCJhc3luYyIpLGpkKDI3LEJOLDMsMCwiZGl2IikscygpLHUoMjgsIm1hdC1kaXZpZGVyIiw4KSxjKDI5LCJoNCIsMTIpLG0oMzAsIldSSVRFX1JFVklFVyIpLHMoKSxjKDMxLCJtYXQtZm9ybS1maWVsZCIsMTMpKDMyLCJtYXQtbGFiZWwiKSxtKDMzKSxiKDM0LCJ0cmFuc2xhdGUiKSxzKCksYygzNSwibWF0LWhpbnQiKSx1KDM2LCJpIiwxNCksYygzNywiZW0iLDE1KSxtKDM4KSxiKDM5LCJ0cmFuc2xhdGUiKSxzKCkoKSx1KDQwLCJ0ZXh0YXJlYSIsMTYsMCksYig0MiwidHJhbnNsYXRlIiksYyg0MywibWF0LWhpbnQiLDE3KSxtKDQ0KSxzKCkoKSxjKDQ1LCJtYXQtZGlhbG9nLWFjdGlvbnMiLDE4KSg0NiwiYnV0dG9uIiwxOSkoNDcsIm1hdC1pY29uIiksbSg0OCwiY2xvc2UiKSxzKCksYyg0OSwic3BhbiIpLG0oNTApLGIoNTEsInRyYW5zbGF0ZSIpLHMoKSgpLGMoNTIsImJ1dHRvbiIsMjApLFMoImNsaWNrIixmdW5jdGlvbigpe3oocik7bGV0IGQ9c2UoNDEpO3JldHVybiBUKGEuYWRkUmV2aWV3KGQpKX0pLGMoNTMsIm1hdC1pY29uIiksbSg1NCwic2VuZCIpLHMoKSxjKDU1LCJzcGFuIiksbSg1NiksYig1NywidHJhbnNsYXRlIikscygpKCkoKSgpKCl9aWYoaSYyKXtsZXQgcixvLGQ9c2UoNDEpO2woNCksZigiYWx0IixWZShhLmRhdGEucHJvZHVjdERhdGEubmFtZSkpKCJzcmMiLCJhc3NldHMvcHVibGljL2ltYWdlcy9wcm9kdWN0cy8iK2EuZGF0YS5wcm9kdWN0RGF0YS5pbWFnZSx3dCksbCgzKSxBKGEuZGF0YS5wcm9kdWN0RGF0YS5uYW1lKSxsKCksZigiaW5uZXJIVE1MIixhLmRhdGEucHJvZHVjdERhdGEuZGVzY3JpcHRpb24sdHQpLGwoNCksRSgiIixhLmRhdGEucHJvZHVjdERhdGEucHJpY2UsIlx4QTQiKSxsKCksdyhhLmRhdGEucHJvZHVjdERhdGEucG9pbnRzPjA/MTM6LTEpLGwoOSksRSgiKCIsKHI9QygyMywyNCxhLnJldmlld3MkKSk9PW51bGw/bnVsbDpyLmxlbmd0aCwiKSIpLGwoMyksdygoKG89QygyNiwyNixhLnJldmlld3MkKSk9PW51bGw/bnVsbDpvLmxlbmd0aCk+PTE/MjU6MjcpLGwoNCksX3QoImRpc3BsYXkiLGEuaXNMb2dnZWRJbigpPyJibG9jayI6Im5vbmUiKSxsKDIpLF90KCJkaXNwbGF5IixhLmlzTG9nZ2VkSW4oKT8iYmxvY2siOiJub25lIiksbCgyKSxBKEMoMzQsMjgsIkxBQkVMX1JFVklFVyIpKSxsKDUpLEEoZHQoMzksMzAsIk1BWF9URVhUQVJFQV9MRU5HVEgiLFN0KDM5LEhOKSkpLGwoMiksZigicGxhY2Vob2xkZXIiLFZlKEMoNDIsMzMsIldSSVRFX1JFVklFV19QTEFDRUhPTERFUiIpKSkoImZvcm1Db250cm9sIixhLnJldmlld0NvbnRyb2wpLGwoNCksRSgiIiwoZC52YWx1ZT09bnVsbD9udWxsOmQudmFsdWUubGVuZ3RoKXx8MCwiLzE2MCIpLGwoNiksQShDKDUxLDM1LCJCVE5fQ0xPU0UiKSksbCgyKSxfdCgiZGlzcGxheSIsYS5pc0xvZ2dlZEluKCk/ImZsZXgiOiJub25lIiksZigiZGlzYWJsZWQiLCFkLnZhbHVlLnRyaW0oKSksbCg0KSxBKEMoNTcsMzcsIkJUTl9TVUJNSVQiKSl9fSxkZXBlbmRlbmNpZXM6W3QyLFJ0LEExLG9lLGxlLGwxLFluLG5vLHJvLFksU2UsZ2UsQ2UsUWUsWmUsaHQsZjEsJGUsbnQsYXQsZ3QsbXQsTWksenQsZTEsaTIsUGksSyxVYV0sc3R5bGVzOltgLmltZy10aHVtYm5haWxbX25nY29udGVudC0lQ09NUCVde2hlaWdodDphdXRvO21heC13aWR0aDoxMDAlO3BhZGRpbmc6MDt3aWR0aDoyMDBweH1tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX1wW19uZ2NvbnRlbnQtJUNPTVAlXXt3b3JkLWJyZWFrOmJyZWFrLWFsbH0uYnRuLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gICBidXR0b25bX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZCgyKXtsZWZ0OjUzMHB4O3dpZHRoOjUwcHh9LmRldGFpbC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjFyZW07bWFyZ2luLXRvcDoxcmVtfS5ydy1idXR0b25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0Oi41cmVtfS5jb21tZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOi41cmVtfS5yZXZpZXctbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7bWFyZ2luLXRvcDotLjYyNXJlbTt0ZXh0LWRlY29yYXRpb246bm9uZX0jc3VibWl0QnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmbG9hdDpyaWdodH0uaXRlbS1wcmljZVtfbmdjb250ZW50LSVDT01QJV17ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6Mi41cmVtO21hcmdpbi10b3A6LjVyZW19Lm5vUmVzdWx0VGV4dFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9jaztmb250LXNpemU6c21hbGw7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzt0ZXh0LWFsaWduOmNlbnRlcn0uZGlhbG9nQWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjAhaW1wb3J0YW50fS5idXR0b25zW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWxlZnQ6MXJlbTtwYWRkaW5nLXJpZ2h0OjFyZW19Lmxpa2UtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luLWxlZnQ6LjVyZW07bWFyZ2luLXRvcDotLjI1cmVtO3Bvc2l0aW9uOnJlbGF0aXZlfS5saWtlLWNvdW50ZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yYWRpdXM6NTAlO2JvdHRvbToxNHB4O2ZvbnQtc2l6ZTo4cHg7cGFkZGluZzouMTI1cmVtIC4yNXJlbTtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDouNXJlbX1oMVtfbmdjb250ZW50LSVDT01QJV0sIGRpdltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtdGV4dCl9Lm1hdC1tZGMtZm9ybS1maWVsZC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Y29sb3I6dmFyKC0tdGhlbWUtdGV4dC1mYWRlLTMwKTtkaXNwbGF5OmZsZXg7Zm9udC1zaXplOjExcHg7bWFyZ2luLWxlZnQ6LS42MjVyZW07bWFyZ2luLXJpZ2h0Oi0uNjI1cmVtfS5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmRldGFpbHMtcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2dhcDoxLjI1cmVtfUBtZWRpYSAobWF4LXdpZHRoOiA1OTkuOThweCl7LmRldGFpbHMtcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4LWRpcmVjdGlvbjpjb2x1bW59fS5uby1zaHJpbmtbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MCAwIGF1dG99LnJldmlldy1yb3dbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7ZGlzcGxheTpmbGV4O2dhcDouNXJlbX0ubGlrZS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXh9Lndhcm4tbm90aWZpY2F0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NDdweH0uYXV0by1mb2N1cy1hYnNvcmJlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGV9LnJldmlldy1sYWJlbC1zcGFjaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tcmlnaHQ6LjEyNXJlbX0uaGludC1zcGFjaW5nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLnN1Ym1pdC1idXR0b24tc3BhY2luZ1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6LjEyNXJlbX0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIGxuLGo0PXgoKCk9PntOdCgpO2soKTtXdCgpO2x0KCk7aygpO2xuPSgoKT0+e2NsYXNzIHR7aHR0cD1oKEFlKTtob3N0U2VydmVyPXVlLmhvc3RTZXJ2ZXI7aG9zdD10aGlzLmhvc3RTZXJ2ZXIrIi9hcGkvUHJvZHVjdHMiO3NlYXJjaChlKXtyZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmhvc3RTZXJ2ZXJ9L3Jlc3QvcHJvZHVjdHMvc2VhcmNoP3E9JHtlfWApLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9ZmluZChlKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmhvc3QrIi8iLHtwYXJhbXM6ZX0pLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9Z2V0KGUpe3JldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuaG9zdH0vJHtlfT9kPSR7ZW5jb2RlVVJJQ29tcG9uZW50KG5ldyBEYXRlKCkudG9EYXRlU3RyaW5nKCkpfWApLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9cHV0KGUsaSl7cmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5ob3N0fS8ke2V9YCxpKS5waXBlKHEoYT0+YS5kYXRhKSxqKGE9Pnt0aHJvdyBhfSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIHR9KSgpfSk7dmFyIGJvLGNzPXgoKCk9PntOdCgpO2soKTtXdCgpO2x0KCk7aygpO2JvPSgoKT0+e2NsYXNzIHR7aHR0cD1oKEFlKTtob3N0U2VydmVyPXVlLmhvc3RTZXJ2ZXI7aG9zdD10aGlzLmhvc3RTZXJ2ZXIrIi9hcGkvUXVhbnRpdHlzIjtnZXRBbGwoKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmhvc3QrIi8iKS5waXBlKHEoZT0+ZS5kYXRhKSxqKGU9Pnt0aHJvdyBlfSkpfXB1dChlLGkpe3JldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuaG9zdH0vJHtlfWAsaSkucGlwZShxKGE9PmEuZGF0YSksaihhPT57dGhyb3cgYX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIGpOKHQsbil7aWYodCYxJiYoYygwLCJkaXYiKSgxLCJzcGFuIiksbSgyKSxiKDMsInRyYW5zbGF0ZSIpLHMoKSx1KDQsInNwYW4iLDgpLHMoKSksdCYyKXtsZXQgZT12KCk7bCgyKSxFKCIiLEMoMywyLCJUSVRMRV9TRUFSQ0hfUkVTVUxUUyIpLCIgLSAiKSxsKDIpLGYoImlubmVySFRNTCIsZS5zZWFyY2hWYWx1ZSx0dCl9fWZ1bmN0aW9uIHFOKHQsbil7dCYxJiYoYygwLCJkaXYiKSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjImJihsKCksQShDKDIsMSwiVElUTEVfQUxMX1BST0RVQ1RTIikpKX1mdW5jdGlvbiBHTih0LG4pe2lmKHQmMSYmKGMoMCwiZGl2IiwxMikoMSwic3BhbiIsMjEpLG0oMiwiTEFCRUxfT05MWV9RVUFOVElUWV9MRUZUIikscygpKCkpLHQmMil7bGV0IGU9digpLiRpbXBsaWNpdDtsKCksZigidHJhbnNsYXRlUGFyYW1zIixidCgxLFVOLGUucXVhbnRpdHkpKX19ZnVuY3Rpb24gV04odCxuKXt0JjEmJihjKDAsImRpdiIsMTMpKDEsInNwYW4iKSxtKDIpLGIoMywidHJhbnNsYXRlIikscygpKCkpLHQmMiYmKGwoMiksQShDKDMsMSwiTEFCRUxfU09MRF9PVVQiKSkpfWZ1bmN0aW9uIFFOKHQsbil7aWYodCYxJiYoYygwLCJzcGFuIiksbSgxKSxzKCkpLHQmMil7bGV0IGU9digpLiRpbXBsaWNpdDtsKCksRSgiIixlLnByaWNlLCJceEE0Iil9fWZ1bmN0aW9uIFlOKHQsbil7aWYodCYxJiYoYygwLCJzcGFuIikoMSwicyIpLG0oMikscygpLG0oMykscygpKSx0JjIpe2xldCBlPXYoKS4kaW1wbGljaXQ7bCgyKSxBKGUucHJpY2UpLGwoKSxFKCIgIixlLmRlbHV4ZVByaWNlLCJceEE0ICIpfX1mdW5jdGlvbiBaTih0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYnV0dG9uIiwyMiksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCkuJGltcGxpY2l0LHI9digyKTtyZXR1cm4gVChyLmFkZFRvQmFza2V0KGEuaWQpKX0pLGMoMSwic3BhbiIpLG0oMiksYigzLCJ0cmFuc2xhdGUiKSxzKCkoKX10JjImJihsKDIpLEEoQygzLDEsIkFERF9CQVNLRVQiKSkpfWZ1bmN0aW9uICROKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJtYXQtZ3JpZC10aWxlIikoMSwibWF0LWNhcmQiLDEwKSgyLCJkaXYiLDExKSxNKDMsR04sMywzLCJkaXYiLDEyKSxNKDQsV04sNCwzLCJkaXYiLDEzKSxjKDUsImRpdiIsMTQpLFMoImtleWRvd24uZW50ZXIiLGZ1bmN0aW9uKCl7bGV0IGE9eihlKS4kaW1wbGljaXQscj12KDIpO3JldHVybiBUKHIuc2hvd0RldGFpbChhKSl9KSgiY2xpY2siLGZ1bmN0aW9uKCl7bGV0IGE9eihlKS4kaW1wbGljaXQscj12KDIpO3JldHVybiBUKHIuc2hvd0RldGFpbChhKSl9KSx1KDYsImltZyIsMTUpLGMoNywiZGl2IiwxNikoOCwiZGl2IiwxNyksbSg5KSxzKCksYygxMCwiZGl2IiwxOCksTSgxMSxRTiwyLDEsInNwYW4iKSxNKDEyLFlOLDQsMiwic3BhbiIpLHMoKSgpKCksYygxMywiZGl2IiwxOSksTSgxNCxaTiw0LDMsImJ1dHRvbiIsMjApLHMoKSgpKCkoKX1pZih0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9digyKTtsKCksX3QoIndpZHRoIiwiMTAwJSIpLGwoMiksdyhlLnF1YW50aXR5PD01JiZlLnF1YW50aXR5PjA/MzotMSksbCgpLHcoZS5xdWFudGl0eTw9MD80Oi0xKSxsKDIpLGYoImFsdCIsVmUoZS5uYW1lKSkoInNyYyIsImFzc2V0cy9wdWJsaWMvaW1hZ2VzL3Byb2R1Y3RzLyIrZS5pbWFnZSx3dCksbCgzKSxBKGUubmFtZSksbCgyKSx3KCFpLmlzRGVsdXhlKCl8fGUucHJpY2U9PT1lLmRlbHV4ZVByaWNlPzExOi0xKSxsKCksdyhpLmlzRGVsdXhlKCkmJmUucHJpY2UhPT1lLmRlbHV4ZVByaWNlPzEyOi0xKSxsKDIpLHcoaS5pc0xvZ2dlZEluKCk/MTQ6LTEpfX1mdW5jdGlvbiBLTih0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiZGl2IikoMSwibWF0LWdyaWQtbGlzdCIsOSwxKSxTKCJyZXNpemUiLGZ1bmN0aW9uKGEpe3ooZSk7bGV0IHI9digpO3JldHVybiBUKHIub25SZXNpemUoYSkpfSxOZCkscWUoMywkTiwxNSwxMSwibWF0LWdyaWQtdGlsZSIsbnVsbCxGdCksYig1LCJhc3luYyIpLHMoKSgpfWlmKHQmMil7bGV0IGU9digpO2woKSxmKCJjb2xzIixlLmJyZWFrcG9pbnQpLGwoMiksR2UoQyg1LDEsZS5ncmlkRGF0YVNvdXJjZSkpfX1mdW5jdGlvbiBYTih0LG4pe3QmMSYmKGMoMCwibWF0LWNhcmQiLDYpKDEsImRpdiIsMTEpLHUoMiwiaW1nIiwyMyksYygzLCJtYXQtY2FyZC10aXRsZSIpKDQsInNwYW4iLDI0KSxtKDUpLGIoNiwidHJhbnNsYXRlIikscygpKCksYyg3LCJtYXQtY2FyZC1jb250ZW50IikoOCwic3BhbiIsMjQpLG0oOSksYigxMCwidHJhbnNsYXRlIikscygpKCkoKSgpKSx0JjImJihsKDUpLEUoIiAiLEMoNiwyLCJOT19TRUFSQ0hfUkVTVUxUIiksIiAiKSxsKDQpLEUoIiAiLEMoMTAsNCwiRU1QVFlfU0VBUkNIX1JFU1VMVCIpLCIgIikpfXZhciBVTixzcyxDXz14KCgpPT57YzcoKTtwMSgpO2o0KCk7YWEoKTtrKCk7VDQoKTtYdCgpO00yKCk7Z2koKTtoYSgpO1coKTtYYSgpO0oxKCk7WXQoKTtyMSgpO2NzKCk7Qm4oKTtxaSgpO25lKCk7dmkoKTtoZSgpO1I4KCk7YTEoKTtrKCk7aGUoKTtXKCk7bmUoKTtVTj10PT4oe3F1YW50aXR5OnR9KTtMZS5hZGQoanIsT3ApO3NzPSgoKT0+e2NsYXNzIHR7ZGVsdXhlR3VhcmQ9aChZcik7ZGlhbG9nPWgoTjEpO3Byb2R1Y3RTZXJ2aWNlPWgobG4pO3F1YW50aXR5U2VydmljZT1oKGJvKTtiYXNrZXRTZXJ2aWNlPWgoZWkpO3RyYW5zbGF0ZVNlcnZpY2U9aChJdCk7cm91dGVyPWgoeXQpO3JvdXRlPWgoJDEpO3Nhbml0aXplcj1oKFoxKTtuZ1pvbmU9aChyZSk7aW89aChqaSk7c25hY2tCYXJIZWxwZXJTZXJ2aWNlPWgoVnQpO2NkUmVmPWgoRWUpO2Rpc3BsYXllZENvbHVtbnM9WyJJbWFnZSIsIlByb2R1Y3QiLCJEZXNjcmlwdGlvbiIsIlByaWNlIiwiU2VsZWN0Il07dGFibGVEYXRhO3BhZ2VTaXplT3B0aW9ucz1bXTtkYXRhU291cmNlO2dyaWREYXRhU291cmNlO3NlYXJjaFZhbHVlO3Jlc3VsdHNMZW5ndGg9MDtwYWdpbmF0b3I9bnVsbDtwcm9kdWN0U3Vic2NyaXB0aW9uO3JvdXRlclN1YnNjcmlwdGlvbjticmVha3BvaW50PTY7ZW1wdHlTdGF0ZT0hMTtuZ0FmdGVyVmlld0luaXQoKXtsZXQgZT10aGlzLnByb2R1Y3RTZXJ2aWNlLnNlYXJjaCgiIiksaT10aGlzLnF1YW50aXR5U2VydmljZS5nZXRBbGwoKTt6bihbaSxlXSkuc3Vic2NyaWJlKHtuZXh0OihbYSxyXSk9PntsZXQgbz1bXTt0aGlzLnRhYmxlRGF0YT1yLHRoaXMudHJ1c3RQcm9kdWN0RGVzY3JpcHRpb24ocik7Zm9yKGxldCBwIG9mIHIpby5wdXNoKHtuYW1lOnAubmFtZSxwcmljZTpwLnByaWNlLGRlbHV4ZVByaWNlOnAuZGVsdXhlUHJpY2UsaWQ6cC5pZCxpbWFnZTpwLmltYWdlLGRlc2NyaXB0aW9uOnAuZGVzY3JpcHRpb259KTtmb3IobGV0IHAgb2YgYSl7bGV0IGc9by5maW5kKF89Pl8uaWQ9PT1wLlByb2R1Y3RJZCk7ZyE9PXZvaWQgMCYmKGcucXVhbnRpdHk9cC5xdWFudGl0eSl9dGhpcy5kYXRhU291cmNlPW5ldyBJMShvKTtmb3IobGV0IHA9MTtwPD1NYXRoLmNlaWwodGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoLzEyKTtwKyspdGhpcy5wYWdlU2l6ZU9wdGlvbnMucHVzaChwKjEyKTt0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZU9wdGlvbnM9dGhpcy5wYWdlU2l6ZU9wdGlvbnMsdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvcj10aGlzLnBhZ2luYXRvcix0aGlzLmdyaWREYXRhU291cmNlPXRoaXMuZGF0YVNvdXJjZS5jb25uZWN0KCksdGhpcy5yZXN1bHRzTGVuZ3RoPXRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCx0aGlzLmZpbHRlclRhYmxlKCksdGhpcy5yb3V0ZXJTdWJzY3JpcHRpb249dGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoKT0+e3RoaXMuZmlsdGVyVGFibGUoKX0pO2xldCBkPXRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuY2hhbGxlbmdlO2QmJnRoaXMucm91dGUuc25hcHNob3QudXJsLmpvaW4oIiIpLm1hdGNoKC9oYWNraW5nLWluc3RydWN0b3IvKSYmdGhpcy5zdGFydEhhY2tpbmdJbnN0cnVjdG9yKGRlY29kZVVSSUNvbXBvbmVudChkKSksdGhpcy5icmVha3BvaW50PXRoaXMuY2FsY3VsYXRlQnJlYWtwb2ludCh3aW5kb3cuaW5uZXJXaWR0aCksdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCl9LGVycm9yOmE9Pntjb25zb2xlLmxvZyhhKX19KX10cnVzdFByb2R1Y3REZXNjcmlwdGlvbihlKXtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyllW2ldLmRlc2NyaXB0aW9uPXRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGVbaV0uZGVzY3JpcHRpb24pfW9uUmVzaXplKGUpe3RoaXMuYnJlYWtwb2ludD10aGlzLmNhbGN1bGF0ZUJyZWFrcG9pbnQoZS50YXJnZXQuaW5uZXJXaWR0aCl9Y2FsY3VsYXRlQnJlYWtwb2ludChlKXtyZXR1cm4gZT49MjYwMD82OmU+PTE3NDA/NDplPj0xMjgwPzM6ZT49ODUwPzI6MX1uZ09uRGVzdHJveSgpe3RoaXMucm91dGVyU3Vic2NyaXB0aW9uJiZ0aGlzLnJvdXRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMucHJvZHVjdFN1YnNjcmlwdGlvbiYmdGhpcy5wcm9kdWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5kYXRhU291cmNlJiZ0aGlzLmRhdGFTb3VyY2UuZGlzY29ubmVjdCgpfWZpbHRlclRhYmxlKCl7bGV0IGU9dGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5xO2U/KGU9ZS50cmltKCksdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCk9Pnt0aGlzLmlvLnNvY2tldCgpLmVtaXQoInZlcmlmeUxvY2FsWHNzQ2hhbGxlbmdlIixlKX0pLHRoaXMuZGF0YVNvdXJjZS5maWx0ZXI9ZS50b0xvd2VyQ2FzZSgpLHRoaXMuc2VhcmNoVmFsdWU9dGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoZSksdGhpcy5ncmlkRGF0YVNvdXJjZS5zdWJzY3JpYmUoaT0+e2kubGVuZ3RoPT09MD90aGlzLmVtcHR5U3RhdGU9ITA6dGhpcy5lbXB0eVN0YXRlPSExfSkpOih0aGlzLmRhdGFTb3VyY2UuZmlsdGVyPSIiLHRoaXMuc2VhcmNoVmFsdWU9dm9pZCAwLHRoaXMuZW1wdHlTdGF0ZT0hMSl9c3RhcnRIYWNraW5nSW5zdHJ1Y3RvcihlKXtjb25zb2xlLmxvZyhgU3RhcnRpbmcgaW5zdHJ1Y3Rpb25zIGZvciBjaGFsbGVuZ2UgIiR7ZX0iYCksaW1wb3J0KCIuL2hhY2tpbmctaW5zdHJ1Y3Rvci1PWVVLQ0RHRy5qcyIpLnRoZW4oaT0+e2kuc3RhcnRIYWNraW5nSW5zdHJ1Y3RvckZvcihlKX0pfXNob3dEZXRhaWwoZSl7dGhpcy5kaWFsb2cub3Blbihvcyx7d2lkdGg6IjUwMHB4IixoZWlnaHQ6Im1heC1jb250ZW50IixkYXRhOntwcm9kdWN0RGF0YTplfX0pfWFkZFRvQmFza2V0KGUpe3RoaXMuYmFza2V0U2VydmljZS5maW5kKE51bWJlcihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJiaWQiKSkpLnN1YnNjcmliZSh7bmV4dDppPT57bGV0IGE9aS5Qcm9kdWN0cyxyPSExO2ZvcihsZXQgbz0wO288YS5sZW5ndGg7bysrKWlmKGFbb10uaWQ9PT1lKXtyPSEwLHRoaXMuYmFza2V0U2VydmljZS5nZXQoYVtvXS5CYXNrZXRJdGVtLmlkKS5zdWJzY3JpYmUoe25leHQ6ZD0+e2xldCBwPWQucXVhbnRpdHkrMTt0aGlzLmJhc2tldFNlcnZpY2UucHV0KGQuaWQse3F1YW50aXR5OnB9KS5zdWJzY3JpYmUoe25leHQ6Zz0+e3RoaXMucHJvZHVjdFNlcnZpY2UuZ2V0KGcuUHJvZHVjdElkKS5zdWJzY3JpYmUoe25leHQ6Xz0+e3RoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoIkJBU0tFVF9BRERfU0FNRV9QUk9EVUNUIix7cHJvZHVjdDpfLm5hbWV9KS5zdWJzY3JpYmUoe25leHQ6eT0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oeSwiY29uZmlybUJhciIpLHRoaXMuYmFza2V0U2VydmljZS51cGRhdGVOdW1iZXJPZkNhcnRJdGVtcygpfSxlcnJvcjp5PT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3Blbih5LCJjb25maXJtQmFyIiksdGhpcy5iYXNrZXRTZXJ2aWNlLnVwZGF0ZU51bWJlck9mQ2FydEl0ZW1zKCl9fSl9LGVycm9yOl89Pntjb25zb2xlLmxvZyhfKX19KX0sZXJyb3I6Zz0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oZy5lcnJvcj8uZXJyb3IsImVycm9yQmFyIiksY29uc29sZS5sb2coZyl9fSl9LGVycm9yOmQ9Pntjb25zb2xlLmxvZyhkKX19KTticmVha31yfHx0aGlzLmJhc2tldFNlcnZpY2Uuc2F2ZSh7UHJvZHVjdElkOmUsQmFza2V0SWQ6c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiYmlkIikscXVhbnRpdHk6MX0pLnN1YnNjcmliZSh7bmV4dDpvPT57dGhpcy5wcm9kdWN0U2VydmljZS5nZXQoby5Qcm9kdWN0SWQpLnN1YnNjcmliZSh7bmV4dDpkPT57dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldCgiQkFTS0VUX0FERF9QUk9EVUNUIix7cHJvZHVjdDpkLm5hbWV9KS5zdWJzY3JpYmUoe25leHQ6cD0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4ocCwiY29uZmlybUJhciIpLHRoaXMuYmFza2V0U2VydmljZS51cGRhdGVOdW1iZXJPZkNhcnRJdGVtcygpfSxlcnJvcjpwPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihwLCJjb25maXJtQmFyIiksdGhpcy5iYXNrZXRTZXJ2aWNlLnVwZGF0ZU51bWJlck9mQ2FydEl0ZW1zKCl9fSl9LGVycm9yOmQ9Pntjb25zb2xlLmxvZyhkKX19KX0sZXJyb3I6bz0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oby5lcnJvcj8uZXJyb3IsImVycm9yQmFyIiksY29uc29sZS5sb2cobyl9fSl9LGVycm9yOmk9Pntjb25zb2xlLmxvZyhpKX19KX1pc0xvZ2dlZEluKCl7cmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ0b2tlbiIpfWlzRGVsdXhlKCl7cmV0dXJuIHRoaXMuZGVsdXhlR3VhcmQuaXNEZWx1eGUoKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtc2VhcmNoLXJlc3VsdCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJnRlKG5uLDcpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLnBhZ2luYXRvcj1yLmZpcnN0KX19LGRlY2xzOjExLHZhcnM6NSxjb25zdHM6W1sicGFnaW5hdG9yIiwiIl0sWyJ0YWJsZSIsIiJdLFsxLCJjZW50ZXItYWxpZ24iXSxbMSwidGFibGUtY29udGFpbmVyIiwiY3VzdG9tLXNsYXRlIl0sWzEsImhlYWRpbmciLCJtYXQtZWxldmF0aW9uLXo2Il0sWyJpZCIsInNlYXJjaC1yZXN1bHQtaGVhZGluZyJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJtYXQtZWxldmF0aW9uLXo2IiwiZW1wdHlTdGF0ZSJdLFsiY29sb3IiLCJhY2NlbnQiLDEsIm1hdC1lbGV2YXRpb24tejYiLDMsInBhZ2VTaXplIiwicGFnZVNpemVPcHRpb25zIiwibGVuZ3RoIl0sWyJpZCIsInNlYXJjaFZhbHVlIiwzLCJpbm5lckhUTUwiXSxbImd1dHRlclNpemUiLCIzMHB4IiwzLCJyZXNpemUiLCJjb2xzIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1lbGV2YXRpb24tejYiLCJyaWJib24tY2FyZCJdLFsxLCJtZGMtY2FyZCJdLFsxLCJyaWJib24iLCJyaWJib24tdG9wLWxlZnQiXSxbMSwicmliYm9uIiwicmliYm9uLXRvcC1sZWZ0IiwicmliYm9uLXNvbGQiXSxbInRhYmluZGV4IiwiMCIsInJvbGUiLCJidXR0b24iLCJhcmlhLWxhYmVsIiwiQ2xpY2sgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2R1Y3QiLCJtYXRUb29sdGlwIiwiQ2xpY2sgZm9yIG1vcmUgaW5mb3JtYXRpb24iLCJtYXRUb29sdGlwUG9zaXRpb24iLCJhYm92ZSIsMSwicHJvZHVjdCIsMywia2V5ZG93bi5lbnRlciIsImNsaWNrIl0sWyJtYXQtY2FyZC1pbWFnZSIsIiIsInJvbGUiLCJidXR0b24iLDEsImltZy1yZXNwb25zaXZlIiwiaW1nLXRodW1ibmFpbCIsMywic3JjIiwiYWx0Il0sWzEsImluZm8tYm94Il0sWzEsIml0ZW0tbmFtZSJdLFsxLCJpdGVtLXByaWNlIl0sWzEsImJhc2tldC1idG4tY29udGFpbmVyIl0sWyJhcmlhLWxhYmVsIiwiQWRkIHRvIEJhc2tldCIsImNvbG9yIiwicHJpbWFyeSIsIm1hdC1idXR0b24iLCIiLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsMSwiYnRuLWJhc2tldCJdLFsidHJhbnNsYXRlIiwiIiwzLCJ0cmFuc2xhdGVQYXJhbXMiXSxbImFyaWEtbGFiZWwiLCJBZGQgdG8gQmFza2V0IiwiY29sb3IiLCJwcmltYXJ5IiwibWF0LWJ1dHRvbiIsIiIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwxLCJidG4tYmFza2V0IiwzLCJjbGljayJdLFsiYWx0IiwiIE5vIHJlc3VsdHMgZm91bmQiLCJzcmMiLCJhc3NldHMvcHVibGljL2ltYWdlcy9wcm9kdWN0cy9uby1yZXN1bHRzLnBuZyIsMSwiaW1nLXJlc3BvbnNpdmUiLCJub1Jlc3VsdCJdLFsxLCJub1Jlc3VsdFRleHQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsImRpdiIsMikoMSwiZGl2IiwzKSgyLCJkaXYiLDQpLE0oMyxqTiw1LDQsImRpdiIpKDQscU4sMywzLCJkaXYiKSx1KDUsImRpdiIsNSkscygpLE0oNixLTiw2LDMsImRpdiIpKDcsWE4sMTEsNiwibWF0LWNhcmQiLDYpLHUoOCwibWF0LWRpdmlkZXIiKSg5LCJtYXQtcGFnaW5hdG9yIiw3LDApLHMoKSgpKSxpJjImJihsKDMpLHcoYS5zZWFyY2hWYWx1ZT8zOjQpLGwoMyksdyhhLmVtcHR5U3RhdGU/Nzo2KSxsKDMpLGYoInBhZ2VTaXplIiwxMikoInBhZ2VTaXplT3B0aW9ucyIsYS5wYWdlU2l6ZU9wdGlvbnMpKCJsZW5ndGgiLGEucmVzdWx0c0xlbmd0aCkpfSxkZXBlbmRlbmNpZXM6W1V1LE44LGRlLHBlLHAyLEEwLFgyLFksU2UsUnQsb2UsbGUsQTEsbm4sSyxVYV0sc3R5bGVzOltgLnRhYmxlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWluLXdpZHRoOjM1MHB4O3dpZHRoOjgwJX0uaGVhZGluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwMztmb250LXNpemU6eC1sYXJnZTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3BhZGRpbmc6LjYyNXJlbSAxLjI1cmVtfS5pbWctdGh1bWJuYWlsW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1zZWxmOnN0YXJ0O3dpZHRoOjYwJSFpbXBvcnRhbnR9LmhlYWRpbmdbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206LjYyNXJlbX0ucHJvZHVjdFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6c3RyZXRjaDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2dhcDouNjI1cmVtfS5pdGVtLXByaWNlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5pdGlhbDttYXJnaW4tdG9wOi42MjVyZW07dGV4dC1hbGlnbjpjZW50ZXJ9Lml0ZW0tbmFtZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmxhcmdlO3RleHQtYWxpZ246Y2VudGVyfS5lbXB0eVN0YXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO2hlaWdodDphdXRvIWltcG9ydGFudDttYXJnaW46MS4yNXJlbSBhdXRvO3dpZHRoOjUwJX0ubm9SZXN1bHRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzt3aWR0aDo2MCV9Lm5vUmVzdWx0VGV4dFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOi42MjVyZW07dGV4dC1hbGlnbjpjZW50ZXJ9LnJpYmJvbi1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ucmliYm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTUwcHg7b3ZlcmZsb3c6aGlkZGVuO3BvaW50ZXItZXZlbnRzOm5vbmU7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTUwcHh9LnJpYmJvbltfbmdjb250ZW50LSVDT01QJV06YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4Oi0xfS5yaWJib25bX25nY29udGVudC0lQ09NUCVdICAgc3Bhbltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowIDVweCAxMHB4ICMwMDAwMDAxYTtjb2xvcjojZmZmO2Rpc3BsYXk6YmxvY2s7Zm9udDo3MDAgMThweC8xIExhdG8sc2Fucy1zZXJpZjtwYWRkaW5nOjFyZW0gMDtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXNoYWRvdzowIDFweCAxcHggcmdiYSgwLDAsMCwuMik7d2lkdGg6MjI1cHh9LnJpYmJvbi10b3AtbGVmdFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTBweDt0b3A6LTEwcHg7ei1pbmRleDoxfS5yaWJib24tdG9wLWxlZnRbX25nY29udGVudC0lQ09NUCVdOmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50O3JpZ2h0OjA7dG9wOjB9LnJpYmJvbi10b3AtbGVmdFtfbmdjb250ZW50LSVDT01QJV0gICBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjVweDt0b3A6MzBweDt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9LmltZy1yZXNwb25zaXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6YXV0bztvYmplY3QtZml0OmNvdmVyO3dpZHRoOjEwMCV9LmJ0bi1iYXNrZXRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6MS4yNXJlbX0ubWRjLWNhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OmNhbGMoMTAwJSAtIDIwcHgpO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO292ZXJmbG93OmhpZGRlbn1tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OmNhbGMoMTAwJSAtIDcwcHgpO3dpZHRoOjEwMCV9bWF0LWdyaWQtdGlsZVtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6c3RyZXRjaDtoZWlnaHQ6YXV0byFpbXBvcnRhbnR9Lm1hdC1kaXZpZGVyLm1hdC1kaXZpZGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjYyNXJlbX0ucHJvZHVjdFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6LTFyZW07bWFyZ2luLXJpZ2h0Oi41cmVtO21hcmdpbi10b3A6LTFyZW19LmNlbnRlci1hbGlnbltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmluZm8tYm94W19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1zZWxmOmNlbnRlcjt3aWR0aDo0MCV9LmJhc2tldC1idG4tY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcn0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gSk4oKXtyZXR1cm4gd2luZG93fXZhciBscyxzNz14KCgpPT57aygpO2xzPSgoKT0+e2NsYXNzIHR7Z2V0IG5hdGl2ZVdpbmRvdygpe3JldHVybiBKTigpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gZVIodCxuKXtpZih0JjEmJihjKDAsImRpdiIsNSksbSgxKSxzKCkpLHQmMil7bGV0IGU9digpO2woKSxBKGUuZXJyb3IpfX1mdW5jdGlvbiB0Uih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiw4KSxtKDEsIk1BTkRBVE9SWV9FTUFJTCIpLHMoKSl9ZnVuY3Rpb24gaVIodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImJ1dHRvbiIsMjApLGIoMSwidHJhbnNsYXRlIiksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5oaWRlPSFhLmhpZGUpfSksdSgyLCJpIiwyMSkscygpfXQmMiYmZigibWF0VG9vbHRpcCIsVmUoQygxLDIsIlNIT1dfUFdEX1RPT0xUSVAiKSkpfWZ1bmN0aW9uIGFSKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJidXR0b24iLDIyKSxiKDEsInRyYW5zbGF0ZSIpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpO3JldHVybiBUKGEuaGlkZT0hYS5oaWRlKX0pLHUoMiwiaSIsMjMpLHMoKX10JjImJmYoIm1hdFRvb2x0aXAiLFZlKEMoMSwyLCJISURFX1BXRF9UT09MVElQIikpKX1mdW5jdGlvbiBuUih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiw4KSxtKDEsIk1BTkRBVE9SWV9QQVNTV09SRCIpLHMoKSl9ZnVuY3Rpb24gclIodCxuKXt0JjEmJihjKDAsImRpdiIsMTYpKDEsImRpdiIsMjQpLHUoMiwiZGl2IikscygpLGMoMywiZGl2IiwyNSksbSg0LCJMQUJFTF9PUiIpLHMoKSxjKDUsImRpdiIsMjQpLHUoNiwiZGl2IikscygpKCkpfWZ1bmN0aW9uIG9SKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJidXR0b24iLDI2KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLmdvb2dsZUxvZ2luKCkpfSksdSgxLCJpIiwyNyksbSgyKSxiKDMsInRyYW5zbGF0ZSIpLHMoKX10JjImJihsKDIpLEUoIiAiLEMoMywxLCJCVE5fR09PR0xFX0xPR0lOIiksIiAiKSl9dmFyIGNSLHlfLHhfPXgoKCk9Pnt3aSgpO3M3KCk7cDEoKTtrKCk7V2UoKTtZdCgpO0YxKCk7cjEoKTtlbigpO0RhKCk7SzEoKTthYSgpO0szKCk7dmUoKTt2aSgpO25lKCk7ZXQoKTtXKCk7SmUoKTtoZSgpO2soKTtoZSgpO0plKCk7VygpO2V0KCk7V2UoKTtuZSgpO3ZlKCk7TGUuYWRkKEtwLGpyLHFwLE9mKTtjUj0iaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL3YyL2F1dGgiLHlfPSgoKT0+e2NsYXNzIHR7Y29uZmlndXJhdGlvblNlcnZpY2U9aChMdCk7dXNlclNlcnZpY2U9aChBdCk7d2luZG93UmVmU2VydmljZT1oKGxzKTtjb29raWVTZXJ2aWNlPWgoWnQpO3JvdXRlcj1oKHl0KTtmb3JtU3VibWl0U2VydmljZT1oKFRpKTtiYXNrZXRTZXJ2aWNlPWgoZWkpO25nWm9uZT1oKHJlKTtlbWFpbENvbnRyb2w9bmV3IGtlKCIiLFtKLnJlcXVpcmVkXSk7cGFzc3dvcmRDb250cm9sPW5ldyBrZSgiIixbSi5yZXF1aXJlZCxKLm1pbkxlbmd0aCgxKV0pO2hpZGU9ITA7dXNlcjtyZW1lbWJlck1lPW5ldyBrZSghMSk7ZXJyb3I7Y2xpZW50SWQ9IjEwMDU1Njg1NjA1MDItNmhtMTZsZWY4b2g0NmhyMmQ5OHZmMm9obG5qNG5maHEuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iO29hdXRoVW5hdmFpbGFibGU9ITA7cmVkaXJlY3RVcmk9IiI7dGVzdGluZ1VzZXJuYW1lPSJ0ZXN0aW5nQGp1aWNlLXNoLm9wIjt0ZXN0aW5nUGFzc3dvcmQ9IklhbVVzZWRGb3JUZXN0aW5nIjtuZ09uSW5pdCgpe2xldCBlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJlbWFpbCIpO2U/KHRoaXMudXNlcj17fSx0aGlzLnVzZXIuZW1haWw9ZSx0aGlzLnJlbWVtYmVyTWUuc2V0VmFsdWUoITApKTp0aGlzLnJlbWVtYmVyTWUuc2V0VmFsdWUoITEpLHRoaXMucmVkaXJlY3RVcmk9YCR7dGhpcy53aW5kb3dSZWZTZXJ2aWNlLm5hdGl2ZVdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbH0vLyR7dGhpcy53aW5kb3dSZWZTZXJ2aWNlLm5hdGl2ZVdpbmRvdy5sb2NhdGlvbi5ob3N0fWAsdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5nZXRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb24oKS5zdWJzY3JpYmUoe25leHQ6aT0+e2lmKGk/LmFwcGxpY2F0aW9uPy5nb29nbGVPYXV0aCl7dGhpcy5jbGllbnRJZD1pLmFwcGxpY2F0aW9uLmdvb2dsZU9hdXRoLmNsaWVudElkO2xldCBhPWkuYXBwbGljYXRpb24uZ29vZ2xlT2F1dGguYXV0aG9yaXplZFJlZGlyZWN0cy5maW5kKHI9PnIudXJpPT09dGhpcy5yZWRpcmVjdFVyaSk7YT8odGhpcy5vYXV0aFVuYXZhaWxhYmxlPSExLHRoaXMucmVkaXJlY3RVcmk9YS5wcm94eT9hLnByb3h5OmEudXJpKToodGhpcy5vYXV0aFVuYXZhaWxhYmxlPSEwLGNvbnNvbGUubG9nKHRoaXMucmVkaXJlY3RVcmkrIiBpcyBub3QgYW4gYXV0aG9yaXplZCByZWRpcmVjdCBVUkkgZm9yIHRoaXMgYXBwbGljYXRpb24uIikpfX0sZXJyb3I6aT0+e2NvbnNvbGUubG9nKGkpfX0pLHRoaXMuZm9ybVN1Ym1pdFNlcnZpY2UuYXR0YWNoRW50ZXJLZXlIYW5kbGVyKCJsb2dpbi1mb3JtIiwibG9naW5CdXR0b24iLCgpPT57dGhpcy5sb2dpbigpfSl9bG9naW4oKXt0aGlzLnVzZXI9e30sdGhpcy51c2VyLmVtYWlsPXRoaXMuZW1haWxDb250cm9sLnZhbHVlLHRoaXMudXNlci5wYXNzd29yZD10aGlzLnBhc3N3b3JkQ29udHJvbC52YWx1ZSx0aGlzLnVzZXJTZXJ2aWNlLmxvZ2luKHRoaXMudXNlcikuc3Vic2NyaWJlKHtuZXh0OmU9Pntsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgidG9rZW4iLGUudG9rZW4pO2xldCBpPW5ldyBEYXRlO2kuc2V0SG91cnMoaS5nZXRIb3VycygpKzgpLHRoaXMuY29va2llU2VydmljZS5wdXQoInRva2VuIixlLnRva2VuLHtleHBpcmVzOml9KSxzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCJiaWQiLGUuYmlkKSx0aGlzLmJhc2tldFNlcnZpY2UudXBkYXRlTnVtYmVyT2ZDYXJ0SXRlbXMoKSx0aGlzLnVzZXJTZXJ2aWNlLmlzTG9nZ2VkSW4ubmV4dCghMCksdGhpcy5uZ1pvbmUucnVuKCgpPT5QZSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMucm91dGVyLm5hdmlnYXRlKFsiL3NlYXJjaCJdKX0pKX0sZXJyb3I6KHtlcnJvcjplfSk9PntpZihlLnN0YXR1cyYmZS5kYXRhJiZlLnN0YXR1cz09PSJ0b3RwX3Rva2VuX3JlcXVpcmVkIil7bG9jYWxTdG9yYWdlLnNldEl0ZW0oInRvdHBfdG1wX3Rva2VuIixlLmRhdGEudG1wVG9rZW4pLHRoaXMubmdab25lLnJ1bigoKT0+UGUodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbIi8yZmEvZW50ZXIiXSl9KSk7cmV0dXJufWxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJ0b2tlbiIpLHRoaXMuY29va2llU2VydmljZS5yZW1vdmUoInRva2VuIiksc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgiYmlkIiksdGhpcy5lcnJvcj1lLHRoaXMudXNlclNlcnZpY2UuaXNMb2dnZWRJbi5uZXh0KCExKSx0aGlzLmVtYWlsQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMucGFzc3dvcmRDb250cm9sLm1hcmtBc1ByaXN0aW5lKCl9fSksdGhpcy5yZW1lbWJlck1lLnZhbHVlP2xvY2FsU3RvcmFnZS5zZXRJdGVtKCJlbWFpbCIsdGhpcy51c2VyLmVtYWlsKTpsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgiZW1haWwiKX1nb29nbGVMb2dpbigpe3RoaXMud2luZG93UmVmU2VydmljZS5uYXRpdmVXaW5kb3cubG9jYXRpb24ucmVwbGFjZShgJHtjUn0/Y2xpZW50X2lkPSR7dGhpcy5jbGllbnRJZH0mcmVzcG9uc2VfdHlwZT10b2tlbiZzY29wZT1lbWFpbCZyZWRpcmVjdF91cmk9JHt0aGlzLnJlZGlyZWN0VXJpfWApfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1sb2dpbiJdXSxkZWNsczozNix2YXJzOjE3LGNvbnN0czpbWyJlbWFpbCIsIiJdLFsicGFzc3dvcmQiLCIiXSxbMSwiY2VudGVyLWNvbnRhaW5lciJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJtYXQtZWxldmF0aW9uLXo2Il0sWzEsIm1kYy1jYXJkIl0sWzEsImVycm9yIl0sWyJpZCIsImxvZ2luLWZvcm0iLDEsImZvcm0tY29udGFpbmVyIl0sWyJjb2xvciIsImFjY2VudCIsImFwcGVhcmFuY2UiLCJvdXRsaW5lIl0sWyJ0cmFuc2xhdGUiLCIiXSxbImlkIiwiZW1haWwiLCJuYW1lIiwiZW1haWwiLCJtYXRJbnB1dCIsIiIsInBsYWNlaG9sZGVyIiwiIiwiYXJpYS1sYWJlbCIsIlRleHQgZmllbGQgZm9yIHRoZSBsb2dpbiBlbWFpbCIsMywiZm9jdXMiLCJmb3JtQ29udHJvbCJdLFsiaWQiLCJwYXNzd29yZCIsIm5hbWUiLCJwYXNzd29yZCIsIm1hdElucHV0IiwiIiwicGxhY2Vob2xkZXIiLCIiLCJhcmlhLWxhYmVsIiwiVGV4dCBmaWVsZCBmb3IgdGhlIGxvZ2luIHBhc3N3b3JkIiwzLCJmb2N1cyIsImZvcm1Db250cm9sIiwidHlwZSJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwibWF0U3VmZml4IiwiIiwiYXJpYS1sYWJlbCIsIkJ1dHRvbiB0byBkaXNwbGF5IHRoZSBwYXNzd29yZCIsIm1hdFRvb2x0aXBQb3NpdGlvbiIsInJpZ2h0IiwzLCJtYXRUb29sdGlwIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJtYXRTdWZmaXgiLCIiLCJhcmlhLWxhYmVsIiwiQnV0dG9uIHRvIGhpZGUgdGhlIHBhc3N3b3JkIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwicmlnaHQiLDMsIm1hdFRvb2x0aXAiXSxbInJvdXRlckxpbmsiLCIvZm9yZ290LXBhc3N3b3JkIiwidHJhbnNsYXRlIiwiIiwxLCJwcmltYXJ5LWxpbmsiLCJmb3Jnb3QtcHciXSxbInR5cGUiLCJzdWJtaXQiLCJpZCIsImxvZ2luQnV0dG9uIiwibWF0LXJhaXNlZC1idXR0b24iLCIiLCJjb2xvciIsInByaW1hcnkiLCJhcmlhLWxhYmVsIiwiTG9naW4iLDMsImNsaWNrIiwiZGlzYWJsZWQiXSxbImlkIiwicmVtZW1iZXJNZSIsImFyaWEtbGFiZWwiLCJDaGVja2JveCB0byBzdGF5IGxvZ2dlZCBpbiBvciBub3QgbG9nZ2VkIGluIiwzLCJmb3JtQ29udHJvbCJdLFsxLCJicmVha0xpbmUiXSxbImlkIiwibG9naW5CdXR0b25Hb29nbGUiLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsImNvbG9yIiwiYWNjZW50IiwiYXJpYS1sYWJlbCIsIkxvZ2luIHdpdGggR29vZ2xlIiwxLCJnb29nbGUtYnV0dG9uIl0sWyJpZCIsIm5ld0N1c3RvbWVyTGluayJdLFsicm91dGVyTGluayIsIi9yZWdpc3RlciIsInRyYW5zbGF0ZSIsIiIsMSwicHJpbWFyeS1saW5rIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJtYXRTdWZmaXgiLCIiLCJhcmlhLWxhYmVsIiwiQnV0dG9uIHRvIGRpc3BsYXkgdGhlIHBhc3N3b3JkIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwicmlnaHQiLDMsImNsaWNrIiwibWF0VG9vbHRpcCJdLFsiYXJpYS1sYWJlbCIsIkV5ZSIsMSwiZmFzIiwiZmEtZXllIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJtYXRTdWZmaXgiLCIiLCJhcmlhLWxhYmVsIiwiQnV0dG9uIHRvIGhpZGUgdGhlIHBhc3N3b3JkIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwicmlnaHQiLDMsImNsaWNrIiwibWF0VG9vbHRpcCJdLFsiYXJpYS1sYWJlbCIsIkV5ZSBTbGFzaCIsMSwiZmFzIiwiZmEtZXllLXNsYXNoIl0sWzEsImxpbmUiXSxbInRyYW5zbGF0ZSIsIiIsMSwidGV4dE9uTGluZSJdLFsiaWQiLCJsb2dpbkJ1dHRvbkdvb2dsZSIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiY29sb3IiLCJhY2NlbnQiLCJhcmlhLWxhYmVsIiwiTG9naW4gd2l0aCBHb29nbGUiLDEsImdvb2dsZS1idXR0b24iLDMsImNsaWNrIl0sWzEsImZhYiIsImZhLWdvb2dsZSIsImZhLWxnIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aWYoaSYxKXtsZXQgcj1MKCk7YygwLCJkaXYiLDIpKDEsIm1hdC1jYXJkIiwzKSgyLCJkaXYiLDQpKDMsImgxIiksbSg0LCJMb2dpbiIpLHMoKSxNKDUsZVIsMiwxLCJkaXYiLDUpLGMoNiwiZGl2Iiw2KSg3LCJtYXQtZm9ybS1maWVsZCIsNykoOCwibWF0LWxhYmVsIiw4KSxtKDksIkxBQkVMX0VNQUlMIikscygpLGMoMTAsImlucHV0Iiw5LDApLFMoImZvY3VzIixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5lcnJvcj1udWxsKX0pLHMoKSxNKDEyLHRSLDIsMCwibWF0LWVycm9yIiw4KSxzKCksYygxMywibWF0LWZvcm0tZmllbGQiLDcpKDE0LCJtYXQtbGFiZWwiLDgpLG0oMTUsIkxBQkVMX1BBU1NXT1JEIikscygpLGMoMTYsImlucHV0IiwxMCwxKSxTKCJmb2N1cyIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuZXJyb3I9bnVsbCl9KSxzKCksTSgxOCxpUiwzLDQsImJ1dHRvbiIsMTEpKDE5LGFSLDMsNCwiYnV0dG9uIiwxMiksTSgyMCxuUiwyLDAsIm1hdC1lcnJvciIsOCkscygpLGMoMjEsImEiLDEzKSxtKDIyLCJGT1JHT1RfUEFTU1dPUkQiKSxzKCksYygyMywiYnV0dG9uIiwxNCksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLmxvZ2luKCkpfSksYygyNCwibWF0LWljb24iKSxtKDI1LCIgZXhpdF90b19hcHAgIikscygpLG0oMjYpLGIoMjcsInRyYW5zbGF0ZSIpLHMoKSxjKDI4LCJtYXQtY2hlY2tib3giLDE1KSxtKDI5KSxiKDMwLCJ0cmFuc2xhdGUiKSxzKCksTSgzMSxyUiw3LDAsImRpdiIsMTYpLE0oMzIsb1IsNCwzLCJidXR0b24iLDE3KSxjKDMzLCJkaXYiLDE4KSgzNCwiYSIsMTkpLG0oMzUsIk5PX0NVU1RPTUVSIikscygpKCkoKSgpKCkoKX1pJjImJihsKDUpLHcoYS5lcnJvcj81Oi0xKSxsKDUpLGYoImZvcm1Db250cm9sIixhLmVtYWlsQ29udHJvbCksbCgyKSx3KGEuZW1haWxDb250cm9sLmludmFsaWQ/MTI6LTEpLGwoNCksZigiZm9ybUNvbnRyb2wiLGEucGFzc3dvcmRDb250cm9sKSgidHlwZSIsYS5oaWRlPyJwYXNzd29yZCI6InRleHQiKSxsKDIpLHcoYS5oaWRlPzE4OjE5KSxsKDIpLHcoYS5wYXNzd29yZENvbnRyb2wuaW52YWxpZD8yMDotMSksbCgzKSxmKCJkaXNhYmxlZCIsIWEuZW1haWxDb250cm9sLnZhbHVlfHwhYS5wYXNzd29yZENvbnRyb2wudmFsdWUpLGwoMyksRSgiICIsQygyNywxMywiQlROX0xPR0lOIiksIiAiKSxsKDIpLGYoImZvcm1Db250cm9sIixhLnJlbWVtYmVyTWUpLGwoKSxFKCIgIixDKDMwLDE1LCJSRU1FTUJFUl9NRSIpLCIgIiksbCgyKSx3KGEub2F1dGhVbmF2YWlsYWJsZT8tMTozMSksbCgpLHcoYS5vYXV0aFVuYXZhaWxhYmxlPy0xOjMyKSl9LGRlcGVuZGVuY2llczpbZGUscGUsUWUsWmUsaHQsUXQsdjIsWSxTZSwkZSxudCxhdCxndCxtdCx6dCxlMSxsMSxSdCxtMixvZSxsZSxnZSxDZSxrNCxLXSxzdHlsZXM6W2BtYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OmF1dG87bWluLXdpZHRoOjMyMHB4O3dpZHRoOjI1JX0uZm9ybS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47cG9zaXRpb246cmVsYXRpdmV9LmZvcmdvdC1wd1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7bWFyZ2luLXRvcDotMXJlbX1tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206MS4yNXJlbTttYXJnaW4tbGVmdDoyMCU7bWFyZ2luLXRvcDouMjVyZW19bWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctdG9wOi42MjVyZW19bWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZCgyKXtwYWRkaW5nLWJvdHRvbToxLjI1cmVtfSNsb2dpbkJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sICNsb2dpbkJ1dHRvbkdvb2dsZVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MjAlO21hcmdpbi10b3A6MnJlbTt3aWR0aDo2MCV9LmJyZWFrTGluZVtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTp0YWJsZX0uYnJlYWtMaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSA+IGRpdltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTp0YWJsZS1jZWxsO3doaXRlLXNwYWNlOm5vd3JhcH0ubGluZVtfbmdjb250ZW50LSVDT01QJV0gPiBkaXZbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNjMGMwYzA7aGVpZ2h0OjFweH0udGV4dE9uTGluZVtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzowIC4yNXJlbX0ubGluZVtfbmdjb250ZW50LSVDT01QJV17dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOjUwJX0jbmV3Q3VzdG9tZXJMaW5rW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1zZWxmOmNlbnRlcjtmb250LXNpemU6MTJweDttYXJnaW4tdG9wOjIuNXJlbX0uY2VudGVyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6c3RyZXRjaDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcn0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIE1fLHdfPXgoKCk9PntGMSgpO2soKTtnaSgpO1l0KCk7cjEoKTtuZSgpO1coKTtxaSgpO3ZlKCk7aygpO1coKTtuZSgpO3ZlKCk7TGUuYWRkKEphKTtNXz0oKCk9PntjbGFzcyB0e2RpYWxvZ0RhdGE9aChVaSk7dXNlclNlcnZpY2U9aChBdCk7dXNlcjtuZ09uSW5pdCgpe3RoaXMudXNlclNlcnZpY2UuZ2V0KHRoaXMuZGlhbG9nRGF0YS5pZCkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLnVzZXI9ZX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC11c2VyLWRldGFpbHMiXV0sZGVjbHM6MjksdmFyczoxMCxjb25zdHM6W1sxLCJjb250YWluZXIiXSxbMSwicm93Il0sWyJ0cmFuc2xhdGUiLCJMQUJFTF9FTUFJTCJdLFsidHJhbnNsYXRlIiwiTEFCRUxfQ1JFQVRFRF9BVCJdLFsidHJhbnNsYXRlIiwiTEFCRUxfVVBEQVRFRF9BVCJdLFsiYWxpZ24iLCJlbmQiLDEsImRpYWxvZ0FjdGlvbiJdLFsibWF0LWJ1dHRvbiIsIiIsMSwiZm9jdXMtYWJzb3JiZXIiXSxbIm1hdC1zdHJva2VkLWJ1dHRvbiIsIiIsIm1hdC1kaWFsb2ctY2xvc2UiLCIiLCJhcmlhLWxhYmVsIiwiQ2xvc2UgRGlhbG9nIiwxLCJjbG9zZS1kaWFsb2ciLCJidXR0b25zIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYXQtZGlhbG9nLWNvbnRlbnQiKSgxLCJoZWFkZXIiKSgyLCJoMSIpLG0oMyksYig0LCJ0cmFuc2xhdGUiKSxzKCkoKSx1KDUsIm1hdC1kaXZpZGVyIiksYyg2LCJkaXYiLDApKDcsImRpdiIsMSkoOCwiZGl2IiksdSg5LCJzdHJvbmciLDIpLGMoMTAsInAiKSxtKDExKSxzKCkoKSgpLGMoMTIsImRpdiIsMSkoMTMsImRpdiIpLHUoMTQsInN0cm9uZyIsMyksYygxNSwicCIpLG0oMTYpLHMoKSgpLGMoMTcsImRpdiIpLHUoMTgsInN0cm9uZyIsNCksYygxOSwicCIpLG0oMjApLHMoKSgpKCkoKSxjKDIxLCJtYXQtZGlhbG9nLWFjdGlvbnMiLDUpLHUoMjIsImJ1dHRvbiIsNiksYygyMywiYnV0dG9uIiw3KSgyNCwibWF0LWljb24iKSxtKDI1LCJjbG9zZSIpLHMoKSxjKDI2LCJzcGFuIiksbSgyNyksYigyOCwidHJhbnNsYXRlIikscygpKCkoKSgpKSxpJjImJihsKDMpLE8xKCIiLEMoNCw2LCJMQUJFTF9VU0VSIiksIiAjIixhLnVzZXI9PW51bGw/bnVsbDphLnVzZXIuaWQpLGwoOCksQShhLnVzZXI9PW51bGw/bnVsbDphLnVzZXIuZW1haWwpLGwoNSksQShhLnVzZXI9PW51bGw/bnVsbDphLnVzZXIuY3JlYXRlZEF0KSxsKDQpLEEoYS51c2VyPT1udWxsP251bGw6YS51c2VyLnVwZGF0ZWRBdCksbCg3KSxBKEMoMjgsOCwiQlROX0NMT1NFIikpKX0sZGVwZW5kZW5jaWVzOlt0MixBMSxZLFNlLGkyLG9lLGxlLFBpLGdlLENlLEtdLHN0eWxlczpbYG1hdC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOi42MjVyZW19LmRpYWxvZ0FjdGlvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTowIWltcG9ydGFudH0uY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDouNjI1cmVtfS5yb3dbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmJhc2VsaW5lO2Rpc3BsYXk6ZmxleDtnYXA6LjYyNXJlbX0uZm9jdXMtYWJzb3JiZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgU18sa189eCgoKT0+e2soKTtnaSgpO1coKTtuZSgpO3FpKCk7dmUoKTtrKCk7bmUoKTt2ZSgpO1coKTtTXz0oKCk9PntjbGFzcyB0e2RpYWxvZ0RhdGE9aChVaSk7ZmVlZGJhY2s7aWQ7bmdPbkluaXQoKXt0aGlzLmZlZWRiYWNrPXRoaXMuZGlhbG9nRGF0YS5mZWVkYmFjayx0aGlzLmlkPXRoaXMuZGlhbG9nRGF0YS5pZH1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtZmVlZGJhY2stZGV0YWlscyJdXSxkZWNsczoyMyx2YXJzOjExLGNvbnN0czpbWzEsImNvbnRhaW5lciJdLFsxLCJ1c2VyLWxpbmUiXSxbMSwiZmVlZGJhY2stY29udGVudCJdLFszLCJpbm5lckhUTUwiXSxbImFsaWduIiwiZW5kIiwxLCJkaWFsb2dBY3Rpb24iXSxbIm1hdC1idXR0b24iLCIiLDEsImF1dG8tZm9jdXMtYWJzb3JiIl0sWyJtYXQtc3Ryb2tlZC1idXR0b24iLCIiLCJtYXQtZGlhbG9nLWNsb3NlIiwiIiwiYXJpYS1sYWJlbCIsIkNsb3NlIERpYWxvZyIsMSwiY2xvc2UtZGlhbG9nIiwiYnV0dG9ucyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwibWF0LWRpYWxvZy1jb250ZW50IikoMSwiaGVhZGVyIikoMiwiaDEiKSxtKDMpLGIoNCwidHJhbnNsYXRlIikscygpKCksdSg1LCJtYXQtZGl2aWRlciIpLGMoNiwiZGl2IiwwKSg3LCJkaXYiLDEpKDgsInNwYW4iKSxtKDkpLGIoMTAsInRyYW5zbGF0ZSIpLHMoKSxjKDExLCJwIiksbSgxMikscygpKCksYygxMywiZGl2IiwyKSx1KDE0LCJjaXRlIiwzKSxzKCkoKSxjKDE1LCJtYXQtZGlhbG9nLWFjdGlvbnMiLDQpLHUoMTYsImJ1dHRvbiIsNSksYygxNywiYnV0dG9uIiw2KSgxOCwibWF0LWljb24iKSxtKDE5LCJjbG9zZSIpLHMoKSxjKDIwLCJzcGFuIiksbSgyMSksYigyMiwidHJhbnNsYXRlIikscygpKCkoKSgpKSxpJjImJihsKDMpLEEoQyg0LDUsIkxBQkVMX0NPTU1FTlQiKSksbCg2KSxFKCIiLEMoMTAsNywiTEFCRUxfVVNFUiIpLCI6IiksbCgzKSxFKCIjIixhLmlkKSxsKDIpLGYoImlubmVySFRNTCIsYS5mZWVkYmFjayx0dCksbCg3KSxBKEMoMjIsOSwiQlROX0NMT1NFIikpKX0sZGVwZW5kZW5jaWVzOlt0MixBMSxpMixvZSxsZSxQaSxZLGdlLENlLEtdLHN0eWxlczpbYG1hdC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOi42MjVyZW19LmRpYWxvZ0FjdGlvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTowIWltcG9ydGFudH1tYXQtZGlhbG9nLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde21heC13aWR0aDozMjBweDttaW4td2lkdGg6MjgwcHh9LmNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0udXNlci1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpiYXNlbGluZTtkaXNwbGF5OmZsZXg7Z2FwOi42MjVyZW19LmZlZWRiYWNrLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjYyNXJlbSFpbXBvcnRhbnR9LmF1dG8tZm9jdXMtYWJzb3JiW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZX0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gZFIodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIil9ZnVuY3Rpb24gbVIodCxuKXt0JjEmJnUoMCwiaSIsMjgpfWZ1bmN0aW9uIGhSKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIsMjcpLE0oMSxtUiwxLDAsImkiLDI4KSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQsaT12KCk7bCgpLHcoaS5kb2VzVXNlckhhdmVBbkFjdGl2ZVNlc3Npb24oZSk/MTotMSl9fWZ1bmN0aW9uIHBSKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIsNCl9ZnVuY3Rpb24gZlIodCxuKXtpZih0JjEmJnUoMCwibWF0LWNlbGwiLDI5KSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2YoImlubmVySFRNTCIsZS5lbWFpbCx0dCl9fWZ1bmN0aW9uIHVSKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIpfWZ1bmN0aW9uIGdSKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJtYXQtY2VsbCIpKDEsImJ1dHRvbiIsMzApLFMoImNsaWNrIixmdW5jdGlvbigpe2xldCBhPXooZSkuJGltcGxpY2l0LHI9digpO3JldHVybiBUKHIuc2hvd1VzZXJEZXRhaWwoYS5pZCkpfSksdSgyLCJpIiwzMSkscygpKCl9fWZ1bmN0aW9uIHZSKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItcm93Iil9ZnVuY3Rpb24gX1IodCxuKXt0JjEmJnUoMCwibWF0LXJvdyIpfWZ1bmN0aW9uIGJSKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIsNCl9ZnVuY3Rpb24gQ1IodCxuKXtpZih0JjEmJihjKDAsIm1hdC1jZWxsIiksbSgxKSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgpLEUoIiAiLGUuVXNlcklkKX19ZnVuY3Rpb24geVIodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIiw0KX1mdW5jdGlvbiB4Uih0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwibWF0LWNlbGwiLDMyKSxTKCJjbGljayIsZnVuY3Rpb24oKXtsZXQgYT16KGUpLiRpbXBsaWNpdCxyPXYoKTtyZXR1cm4gVChyLnNob3dGZWVkYmFja0RldGFpbHMoYS5jb21tZW50LGEuVXNlcklkKSl9KSx1KDEsInAiLDMzKSxzKCl9aWYodCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKCksZigiaW5uZXJIVE1MIixlLmNvbW1lbnQsdHQpfX1mdW5jdGlvbiBNUih0LG4pe3QmMSYmdSgwLCJtYXQtaGVhZGVyLWNlbGwiLDQpfWZ1bmN0aW9uIHdSKHQsbil7dCYxJiYoYygwLCJtYXQtaWNvbiIpLG0oMSwiIHN0YXJfcmF0ZSAiKSxzKCkpfWZ1bmN0aW9uIFNSKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIpLHFlKDEsd1IsMiwwLCJtYXQtaWNvbiIsbnVsbCxmcikscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9digpO2woKSxHZShpLnRpbWVzKGUucmF0aW5nKSl9fWZ1bmN0aW9uIGtSKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIpfWZ1bmN0aW9uIHpSKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJtYXQtY2VsbCIpKDEsImJ1dHRvbiIsMzApLFMoImNsaWNrIixmdW5jdGlvbigpe2xldCBhPXooZSkuJGltcGxpY2l0LHI9digpO3JldHVybiBUKHIuZGVsZXRlRmVlZGJhY2soYS5pZCkpfSksdSgyLCJpIiwzNCkscygpKCl9fWZ1bmN0aW9uIFRSKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItcm93Iil9ZnVuY3Rpb24gRVIodCxuKXt0JjEmJnUoMCwibWF0LXJvdyIpfWZ1bmN0aW9uIEFSKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIpfWZ1bmN0aW9uIERSKHQsbil7dCYxJiZ1KDAsIm1hdC1jZWxsIiwyNyl9ZnVuY3Rpb24gSVIodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIiw0KX1mdW5jdGlvbiBMUih0LG4pe2lmKHQmMSYmdSgwLCJtYXQtY2VsbCIsMjkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7ZigiaW5uZXJIVE1MIixlLmVtYWlsLHR0KX19ZnVuY3Rpb24gUFIodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIil9ZnVuY3Rpb24gVlIodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsIm1hdC1jZWxsIikoMSwiYnV0dG9uIiwzMCksUygiY2xpY2siLGZ1bmN0aW9uKCl7bGV0IGE9eihlKS4kaW1wbGljaXQscj12KCk7cmV0dXJuIFQoci5zaG93VXNlckRldGFpbChhLmlkKSl9KSx1KDIsImkiLDMxKSxzKCkoKX19ZnVuY3Rpb24gT1IodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1yb3ciKX1mdW5jdGlvbiBIUih0LG4pe3QmMSYmdSgwLCJtYXQtcm93Iil9dmFyIHNSLGxSLHpfLFRfPXgoKCk9Pnt3XygpO2tfKCk7Z2koKTtVNCgpO00yKCk7RjEoKTtrKCk7aGEoKTtZdCgpO3IxKCk7VDQoKTt2ZSgpO3ZpKCk7bmUoKTtXKCk7aGUoKTtrKCk7aGUoKTtXKCk7bmUoKTt2ZSgpO3NSPVsicGFnaW5hdG9yVXNlcnMiXSxsUj1bInBhZ2luYXRvckZlZWRiIl07TGUuYWRkKE1mLGpyLHAzLFBwLF9mKTt6Xz0oKCk9PntjbGFzcyB0e2RpYWxvZz1oKE4xKTt1c2VyU2VydmljZT1oKEF0KTtmZWVkYmFja1NlcnZpY2U9aChzbik7c2FuaXRpemVyPWgoWjEpO3VzZXJEYXRhU291cmNlO3VzZXJEYXRhU291cmNlSGlkZGVuO3VzZXJDb2x1bW5zPVsidXNlciIsImVtYWlsIiwidXNlcl9kZXRhaWwiXTtmZWVkYmFja0RhdGFTb3VyY2U7ZmVlZGJhY2tDb2x1bW5zPVsidXNlciIsImNvbW1lbnQiLCJyYXRpbmciLCJyZW1vdmUiXTtlcnJvcjtyZXN1bHRzTGVuZ3RoVXNlcj0wO3Jlc3VsdHNMZW5ndGhGZWVkYmFjaz0wO3BhZ2luYXRvclVzZXJzO3BhZ2luYXRvckZlZWRiO25nT25Jbml0KCl7dGhpcy5maW5kQWxsVXNlcnMoKSx0aGlzLmZpbmRBbGxGZWVkYmFja3MoKX1maW5kQWxsVXNlcnMoKXt0aGlzLnVzZXJTZXJ2aWNlLmZpbmQoKS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMudXNlckRhdGFTb3VyY2U9ZSx0aGlzLnVzZXJEYXRhU291cmNlSGlkZGVuPWU7Zm9yKGxldCBpIG9mIHRoaXMudXNlckRhdGFTb3VyY2UpaS5lbWFpbD10aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChgPHNwYW4gY2xhc3M9IiR7dGhpcy5kb2VzVXNlckhhdmVBbkFjdGl2ZVNlc3Npb24oaSk/ImNvbmZpcm1hdGlvbiI6ImVycm9yIn0iPiR7aS5lbWFpbH08L3NwYW4+YCk7dGhpcy51c2VyRGF0YVNvdXJjZT1uZXcgSTEodGhpcy51c2VyRGF0YVNvdXJjZSksdGhpcy51c2VyRGF0YVNvdXJjZS5wYWdpbmF0b3I9dGhpcy5wYWdpbmF0b3JVc2Vycyx0aGlzLnJlc3VsdHNMZW5ndGhVc2VyPWUubGVuZ3RofSxlcnJvcjplPT57dGhpcy5lcnJvcj1lLGNvbnNvbGUubG9nKHRoaXMuZXJyb3IpfX0pfWZpbmRBbGxGZWVkYmFja3MoKXt0aGlzLmZlZWRiYWNrU2VydmljZS5maW5kKCkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLmZlZWRiYWNrRGF0YVNvdXJjZT1lO2ZvcihsZXQgaSBvZiB0aGlzLmZlZWRiYWNrRGF0YVNvdXJjZSlpLmNvbW1lbnQ9dGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoaS5jb21tZW50KTt0aGlzLmZlZWRiYWNrRGF0YVNvdXJjZT1uZXcgSTEodGhpcy5mZWVkYmFja0RhdGFTb3VyY2UpLHRoaXMuZmVlZGJhY2tEYXRhU291cmNlLnBhZ2luYXRvcj10aGlzLnBhZ2luYXRvckZlZWRiLHRoaXMucmVzdWx0c0xlbmd0aEZlZWRiYWNrPWUubGVuZ3RofSxlcnJvcjplPT57dGhpcy5lcnJvcj1lLGNvbnNvbGUubG9nKHRoaXMuZXJyb3IpfX0pfWRlbGV0ZUZlZWRiYWNrKGUpe3RoaXMuZmVlZGJhY2tTZXJ2aWNlLmRlbChlKS5zdWJzY3JpYmUoe25leHQ6KCk9Pnt0aGlzLmZpbmRBbGxGZWVkYmFja3MoKX0sZXJyb3I6aT0+e3RoaXMuZXJyb3I9aSxjb25zb2xlLmxvZyh0aGlzLmVycm9yKX19KX1zaG93VXNlckRldGFpbChlKXt0aGlzLmRpYWxvZy5vcGVuKE1fLHtkYXRhOntpZDplfX0pfXNob3dGZWVkYmFja0RldGFpbHMoZSxpKXt0aGlzLmRpYWxvZy5vcGVuKFNfLHtkYXRhOntmZWVkYmFjazplLGlkOml9fSl9dGltZXMoZSl7cmV0dXJuIEFycmF5KGUpLmZpbGwoIlx1MjYwNSIpfWRvZXNVc2VySGF2ZUFuQWN0aXZlU2Vzc2lvbihlKXtyZXR1cm4gZS5sYXN0TG9naW5UaW1lJiZlLmxhc3RMb2dpblRpbWU+RGF0ZS5ub3coKS8xZTMtMjE2MDB9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLWFkbWluaXN0cmF0aW9uIl1dLHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKHRlKHNSLDUpLHRlKGxSLDUpKSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5wYWdpbmF0b3JVc2Vycz1yLmZpcnN0KSxGKHI9QigpKSYmKGEucGFnaW5hdG9yRmVlZGI9ci5maXJzdCl9fSxkZWNsczo1Nyx2YXJzOjEzLGNvbnN0czpbWyJwYWdpbmF0b3JVc2VycyIsIiJdLFsicGFnaW5hdG9yRmVlZGIiLCIiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwibWF0LWVsZXZhdGlvbi16NiIsIm1hdC1vd24tY2FyZCJdLFsxLCJtZGMtY2FyZCJdLFsidHJhbnNsYXRlIiwiIl0sWzEsImNvbnRhaW5lciJdLFsxLCJ1c2VyLXRhYmxlIl0sWzEsImhlYWRpbmciXSxbMywiZGF0YVNvdXJjZSJdLFsibWF0Q29sdW1uRGVmIiwidXNlciJdLFs0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWyJjbGFzcyIsImNlbGwtbWlkZGxlIiw0LCJtYXRDZWxsRGVmIl0sWyJtYXRDb2x1bW5EZWYiLCJlbWFpbCJdLFsidHJhbnNsYXRlIiwiIiw0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWyJjbGFzcyIsImNlbGwtbWlkZGxlIiwzLCJpbm5lckhUTUwiLDQsIm1hdENlbGxEZWYiXSxbIm1hdENvbHVtbkRlZiIsInVzZXJfZGV0YWlsIl0sWzQsIm1hdENlbGxEZWYiXSxbNCwibWF0SGVhZGVyUm93RGVmIl0sWzQsIm1hdFJvd0RlZiIsIm1hdFJvd0RlZkNvbHVtbnMiXSxbImNvbG9yIiwiYWNjZW50IiwxLCJtYXQtZWxldmF0aW9uLXowIiwzLCJwYWdlU2l6ZSIsImxlbmd0aCJdLFsxLCJjdXN0b21lci10YWJsZSJdLFsibWF0Q29sdW1uRGVmIiwiY29tbWVudCJdLFszLCJjbGljayIsNCwibWF0Q2VsbERlZiJdLFsibWF0Q29sdW1uRGVmIiwicmF0aW5nIl0sWyJtYXRDb2x1bW5EZWYiLCJyZW1vdmUiXSxbMSwiaGlkZGVuLXRhYmxlIiwzLCJkYXRhU291cmNlIl0sWyJzcmMiLCJhc3NldHMvcHVibGljL2ltYWdlcy9wYWRkaW5nLzE5cHgucG5nIl0sWzEsImNlbGwtbWlkZGxlIl0sWzEsImZhcyIsImZhLXVzZXIiLCJmYS1sZyIsImNvbmZpcm1hdGlvbiJdLFsxLCJjZWxsLW1pZGRsZSIsMywiaW5uZXJIVE1MIl0sWyJtYXQtYnV0dG9uIiwiIiwzLCJjbGljayJdLFsxLCJmYXMiLCJmYS1leWUiXSxbMywiY2xpY2siXSxbIm1hdFRvb2x0aXAiLCJDbGljayBmb3IgbW9yZSBpbmZvcm1hdGlvbiIsIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIiwzLCJpbm5lckhUTUwiXSxbMSwiZmFzIiwiZmEtdHJhc2gtYWx0Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYXQtY2FyZCIsMikoMSwiZGl2IiwzKSgyLCJoMSIsNCksbSgzLCJUSVRMRV9BRE1JTklTVFJBVElPTiIpLHMoKSxjKDQsImRpdiIsNSkoNSwiZGl2Iiw2KSg2LCJkaXYiLDcpKDcsInNwYW4iLDQpLG0oOCwiU0VDVElPTl9VU0VSIikscygpKCksYyg5LCJtYXQtdGFibGUiLDgpLF9lKDEwLDkpLFIoMTEsZFIsMSwwLCJtYXQtaGVhZGVyLWNlbGwiLDEwKSgxMixoUiwyLDEsIm1hdC1jZWxsIiwxMSksYmUoKSxfZSgxMywxMiksUigxNCxwUiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsMTMpKDE1LGZSLDEsMSwibWF0LWNlbGwiLDE0KSxiZSgpLF9lKDE2LDE1KSxSKDE3LHVSLDEsMCwibWF0LWhlYWRlci1jZWxsIiwxMCkoMTgsZ1IsMywwLCJtYXQtY2VsbCIsMTYpLGJlKCksUigxOSx2UiwxLDAsIm1hdC1oZWFkZXItcm93IiwxNykoMjAsX1IsMSwwLCJtYXQtcm93IiwxOCkscygpLHUoMjEsIm1hdC1wYWdpbmF0b3IiLDE5LDApLHMoKSxjKDIzLCJkaXYiLDIwKSgyNCwiZGl2Iiw3KSgyNSwic3BhbiIsNCksbSgyNiwiU0VDVElPTl9DVVNUT01FUl9GRUVEQkFDSyIpLHMoKSgpLGMoMjcsIm1hdC10YWJsZSIsOCksX2UoMjgsOSksUigyOSxiUiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsMTMpKDMwLENSLDIsMSwibWF0LWNlbGwiLDE2KSxiZSgpLF9lKDMxLDIxKSxSKDMyLHlSLDEsMCwibWF0LWhlYWRlci1jZWxsIiwxMykoMzMseFIsMiwxLCJtYXQtY2VsbCIsMjIpLGJlKCksX2UoMzQsMjMpLFIoMzUsTVIsMSwwLCJtYXQtaGVhZGVyLWNlbGwiLDEzKSgzNixTUiwzLDAsIm1hdC1jZWxsIiwxNiksYmUoKSxfZSgzNywyNCksUigzOCxrUiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsMTApKDM5LHpSLDMsMCwibWF0LWNlbGwiLDE2KSxiZSgpLFIoNDAsVFIsMSwwLCJtYXQtaGVhZGVyLXJvdyIsMTcpKDQxLEVSLDEsMCwibWF0LXJvdyIsMTgpLHMoKSx1KDQyLCJtYXQtcGFnaW5hdG9yIiwxOSwxKSxzKCkoKSgpKCksYyg0NCwibWF0LXRhYmxlIiwyNSksX2UoNDUsOSksUig0NixBUiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsMTApKDQ3LERSLDEsMCwibWF0LWNlbGwiLDExKSxiZSgpLF9lKDQ4LDEyKSxSKDQ5LElSLDEsMCwibWF0LWhlYWRlci1jZWxsIiwxMykoNTAsTFIsMSwxLCJtYXQtY2VsbCIsMTQpLGJlKCksX2UoNTEsMTUpLFIoNTIsUFIsMSwwLCJtYXQtaGVhZGVyLWNlbGwiLDEwKSg1MyxWUiwzLDAsIm1hdC1jZWxsIiwxNiksYmUoKSxSKDU0LE9SLDEsMCwibWF0LWhlYWRlci1yb3ciLDE3KSg1NSxIUiwxLDAsIm1hdC1yb3ciLDE4KSxzKCksdSg1NiwiaW1nIiwyNikpLGkmMiYmKGwoOSksZigiZGF0YVNvdXJjZSIsYS51c2VyRGF0YVNvdXJjZSksbCgxMCksZigibWF0SGVhZGVyUm93RGVmIixhLnVzZXJDb2x1bW5zKSxsKCksZigibWF0Um93RGVmQ29sdW1ucyIsYS51c2VyQ29sdW1ucyksbCgpLGYoInBhZ2VTaXplIiwxMCkoImxlbmd0aCIsYS5yZXN1bHRzTGVuZ3RoVXNlciksbCg2KSxmKCJkYXRhU291cmNlIixhLmZlZWRiYWNrRGF0YVNvdXJjZSksbCgxMyksZigibWF0SGVhZGVyUm93RGVmIixhLmZlZWRiYWNrQ29sdW1ucyksbCgpLGYoIm1hdFJvd0RlZkNvbHVtbnMiLGEuZmVlZGJhY2tDb2x1bW5zKSxsKCksZigicGFnZVNpemUiLDEwKSgibGVuZ3RoIixhLnJlc3VsdHNMZW5ndGhGZWVkYmFjayksbCgyKSxmKCJkYXRhU291cmNlIixhLnVzZXJEYXRhU291cmNlSGlkZGVuKSxsKDEwKSxmKCJtYXRIZWFkZXJSb3dEZWYiLGEudXNlckNvbHVtbnMpLGwoKSxmKCJtYXRSb3dEZWZDb2x1bW5zIixhLnVzZXJDb2x1bW5zKSl9LGRlcGVuZGVuY2llczpbZGUscGUsWSxTZSx0aSxuaSxhaSxyaSxpaSxvaSxvZSxsZSxjaSxsaSxzaSxkaSxubixSdCxnZSxDZV0sc3R5bGVzOltgLmhlYWRpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMDAwMDIxO2ZvbnQtc2l6ZTpsYXJnZTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbi1ib3R0b206LjYyNXJlbTtwYWRkaW5nOjFyZW19LmNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpncmlkO2dhcDozcmVtO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgMWZyfUBtZWRpYSAobWF4LXdpZHRoOiAxMTAwcHgpey5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2dhcDoxLjVyZW07Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcn19bWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6ODAwcHh9bWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVde21pbi1oZWlnaHQ6MCFpbXBvcnRhbnR9Lm1hdC1jb2x1bW4taWNvbltfbmdjb250ZW50LSVDT01QJV0gICBzdmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNvbHVtbi11c2VyX2RldGFpbFtfbmdjb250ZW50LSVDT01QJV0gICBidXR0b25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0OjM4JX1tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6bm9ybWFsO2Rpc3BsYXk6YmxvY2t9LmNlbGwtbWlkZGxlW19uZ2NvbnRlbnQtJUNPTVAlXXt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmhpZGRlbi10YWJsZVtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjA7dmlzaWJpbGl0eTpoaWRkZW59Lm1hdC1jb2x1bW4tY29tbWVudFtfbmdjb250ZW50LSVDT01QJV17ZmxleDowIDAgNTUlIWltcG9ydGFudDstbXMtaHlwaGVuczphdXRvOy1tb3otaHlwaGVuczphdXRvOy13ZWJraXQtaHlwaGVuczphdXRvO2h5cGhlbnM6YXV0bztvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7cGFkZGluZzouMTI1cmVtO3doaXRlLXNwYWNlOnVuc2V0IWltcG9ydGFudDt3aWR0aDo1NSUhaW1wb3J0YW50O3dvcmQtYnJlYWs6YnJlYWstd29yZDt3b3JkLXdyYXA6YnJlYWstd29yZCFpbXBvcnRhbnR9Lm1hdC1jb2x1bW4tdXNlcltfbmdjb250ZW50LSVDT01QJV17ZmxleDowIDAgNyUhaW1wb3J0YW50Oy1tcy1oeXBoZW5zOmF1dG87LW1vei1oeXBoZW5zOmF1dG87LXdlYmtpdC1oeXBoZW5zOmF1dG87aHlwaGVuczphdXRvO292ZXJmbG93LXdyYXA6YnJlYWstd29yZDtwYWRkaW5nOi4xMjVyZW07d2hpdGUtc3BhY2U6dW5zZXQhaW1wb3J0YW50O3dpZHRoOjclIWltcG9ydGFudDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7d29yZC13cmFwOmJyZWFrLXdvcmQhaW1wb3J0YW50fS5tYXQtY29sdW1uLXJhdGluZ1tfbmdjb250ZW50LSVDT01QJV17ZmxleDowIDAgMjAlIWltcG9ydGFudDstbXMtaHlwaGVuczphdXRvOy1tb3otaHlwaGVuczphdXRvOy13ZWJraXQtaHlwaGVuczphdXRvO2h5cGhlbnM6YXV0bztvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7d2hpdGUtc3BhY2U6dW5zZXQhaW1wb3J0YW50O3dpZHRoOjIwJSFpbXBvcnRhbnQ7d29yZC1icmVhazpicmVhay13b3JkO3dvcmQtd3JhcDpicmVhay13b3JkIWltcG9ydGFudH1tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV06bGFzdC1jaGlsZCwgbWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpsYXN0LWNoaWxkLCBtYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdOmxhc3QtY2hpbGR7cGFkZGluZy1yaWdodDozcmVtfW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVde2hlaWdodDo2OXB4fS5tYXQtb3duLWNhcmRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbToxLjI1cmVtO21hcmdpbi1sZWZ0OjEwJTttYXJnaW4tcmlnaHQ6MTAlfXBbX25nY29udGVudC0lQ09NUCVdey13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDtkaXNwbGF5Oi13ZWJraXQtYm94O2xpbmUtY2xhbXA6MjtvdmVyZmxvdzpoaWRkZW59CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIE5SKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiKSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjImJihsKCksQShDKDIsMSwiTUFOREFUT1JZX0NVUlJFTlRfUEFTU1dPUkQiKSkpfWZ1bmN0aW9uIFJSKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiKSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjImJihsKCksRSgiICIsQygyLDEsIk1BTkRBVE9SWV9ORVdfUEFTU1dPUkQiKSwiICIpKX1mdW5jdGlvbiBGUih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiwxNCksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYoZigidHJhbnNsYXRlUGFyYW1zIixTdCg0LEVfKSksbCgpLEUoIiIsQygyLDIsIklOVkFMSURfUEFTU1dPUkRfTEVOR1RIIiksIiAiKSl9ZnVuY3Rpb24gQlIodCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsMTEpLG0oMSwiTUFOREFUT1JZX1BBU1NXT1JEX1JFUEVBVCIpLHMoKSl9ZnVuY3Rpb24gVVIodCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsMTEpLG0oMSksYigyLCJ0cmFuc2xhdGUiKSxzKCkpLHQmMiYmKGwoKSxFKCIgIixDKDIsMSwiUEFTU1dPUkRTX05PVF9NQVRDSElORyIpLCIgIikpfWZ1bmN0aW9uIGpSKHQpe3JldHVybiBmdW5jdGlvbihlKXtsZXQgaT10LnZhbHVlLGE9ZS52YWx1ZTtyZXR1cm4gaSE9PWE/e25vdFNhbWU6ITB9Om51bGx9fXZhciBFXyxBXyxEXz14KCgpPT57V2UoKTtGMSgpO2soKTtZdCgpO3IxKCk7U2EoKTtEYSgpO1coKTtuZSgpO2V0KCk7SmUoKTtoZSgpO2soKTtoZSgpO1coKTtKZSgpO2V0KCk7V2UoKTtuZSgpO0VfPSgpPT4oe2xlbmd0aDoiNS00MCJ9KTtMZS5hZGQocXIsR3IpO0FfPSgoKT0+e2NsYXNzIHR7dXNlclNlcnZpY2U9aChBdCk7Zm9ybVN1Ym1pdFNlcnZpY2U9aChUaSk7dHJhbnNsYXRlPWgoSXQpO3Bhc3N3b3JkQ29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWRdKTtuZXdQYXNzd29yZENvbnRyb2w9bmV3IGtlKCIiLFtKLnJlcXVpcmVkLEoubWluTGVuZ3RoKDUpLEoubWF4TGVuZ3RoKDQwKV0pO3JlcGVhdE5ld1Bhc3N3b3JkQ29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWQsSi5taW5MZW5ndGgoNSksSi5tYXhMZW5ndGgoNDApLGpSKHRoaXMubmV3UGFzc3dvcmRDb250cm9sKV0pO2Vycm9yO2NvbmZpcm1hdGlvbjtuZ09uSW5pdCgpe3RoaXMuZm9ybVN1Ym1pdFNlcnZpY2UuYXR0YWNoRW50ZXJLZXlIYW5kbGVyKCJwYXNzd29yZC1mb3JtIiwiY2hhbmdlQnV0dG9uIiwoKT0+e3RoaXMuY2hhbmdlUGFzc3dvcmQoKX0pfWNoYW5nZVBhc3N3b3JkKCl7bG9jYWxTdG9yYWdlLmdldEl0ZW0oImVtYWlsIik/Lm1hdGNoKC9zdXBwb3J0QC4qLykmJiF0aGlzLm5ld1Bhc3N3b3JkQ29udHJvbC52YWx1ZS5tYXRjaCgvKD89LipbYS16XSkoPz0uKltBLVpdKSg/PS4qXGQpKD89LipbQCQhJSo/Jl0pW0EtWmEtelxkQCQhJSo/Jl17MTIsMzB9LykmJmNvbnNvbGUuZXJyb3IoIlBhcm9sYSBlY2hpcGVpIGRlIGFzaXN0ZW5cdTAyMUJcdTAxMDMgbnUgcmVzcGVjdFx1MDEwMyBwb2xpdGljYSBjb3Jwb3JhdGl2XHUwMTAzIHBlbnRydSBjb250dXJpbGUgcHJpdmlsZWdpYXRlISBWXHUwMTAzIHJ1Z1x1MDEwM20gc1x1MDEwMyBzY2hpbWJhXHUwMjFCaSBwYXJvbGEgXHhFRW4gY29uc2VjaW5cdTAyMUJcdTAxMDMhIiksdGhpcy51c2VyU2VydmljZS5jaGFuZ2VQYXNzd29yZCh7Y3VycmVudDp0aGlzLnBhc3N3b3JkQ29udHJvbC52YWx1ZSxuZXc6dGhpcy5uZXdQYXNzd29yZENvbnRyb2wudmFsdWUscmVwZWF0OnRoaXMucmVwZWF0TmV3UGFzc3dvcmRDb250cm9sLnZhbHVlfSkuc3Vic2NyaWJlKHtuZXh0OigpPT57dGhpcy5lcnJvcj12b2lkIDAsdGhpcy50cmFuc2xhdGUuZ2V0KCJQQVNTV09SRF9TVUNDRVNTRlVMTFlfQ0hBTkdFRCIpLnN1YnNjcmliZSh7bmV4dDplPT57dGhpcy5jb25maXJtYXRpb249ZX0sZXJyb3I6ZT0+e3RoaXMuY29uZmlybWF0aW9uPXtlcnJvcjplfX19KSx0aGlzLnJlc2V0Rm9ybSgpfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSksdGhpcy5lcnJvcj1lLHRoaXMuY29uZmlybWF0aW9uPXZvaWQgMCx0aGlzLnJlc2V0UGFzc3dvcmRzKCl9fSl9cmVzZXRGb3JtKCl7dGhpcy5wYXNzd29yZENvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMucmVzZXRQYXNzd29yZHMoKX1yZXNldFBhc3N3b3Jkcygpe3RoaXMucGFzc3dvcmRDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5wYXNzd29yZENvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5uZXdQYXNzd29yZENvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMubmV3UGFzc3dvcmRDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5uZXdQYXNzd29yZENvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5yZXBlYXROZXdQYXNzd29yZENvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMucmVwZWF0TmV3UGFzc3dvcmRDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5yZXBlYXROZXdQYXNzd29yZENvbnRyb2wubWFya0FzVW50b3VjaGVkKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLWNoYW5nZS1wYXNzd29yZCJdXSxkZWNsczo0Nyx2YXJzOjM5LGNvbnN0czpbWyJwYXNzd29yZCIsIiJdLFsicGFzc3dvcmRSZXBlYXQiLCIiXSxbMSwiY2VudGVyLWNvbnRhaW5lciJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwicm9sZSIsInJlZ2lvbiIsImFyaWEtbGFiZWxsZWRieSIsImNoYW5nZS1wYXNzd29yZC1oZWFkaW5nIiwxLCJtYXQtZWxldmF0aW9uLXo2Il0sWyJpZCIsImNoYW5nZS1wYXNzd29yZC1oZWFkaW5nIl0sWyJyb2xlIiwic3RhdHVzIiwiYXJpYS1saXZlIiwicG9saXRlIiwxLCJjb25maXJtYXRpb24iLDMsImhpZGRlbiJdLFsicm9sZSIsImFsZXJ0IiwiYXJpYS1saXZlIiwiYXNzZXJ0aXZlIiwxLCJlcnJvciIsMywiaGlkZGVuIl0sWyJpZCIsInBhc3N3b3JkLWZvcm0iLDEsImZvcm0tY29udGFpbmVyIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZSIsImNvbG9yIiwiYWNjZW50Il0sWyJpZCIsImN1cnJlbnRQYXNzd29yZCIsInR5cGUiLCJwYXNzd29yZCIsIm1hdElucHV0IiwiIiwicmVxdWlyZWQiLCIiLCJhdXRvY29tcGxldGUiLCJjdXJyZW50LXBhc3N3b3JkIiwiYXJpYS1sYWJlbCIsIkZpZWxkIHRvIGVudGVyIHRoZSBjdXJyZW50IHBhc3N3b3JkIiwzLCJmb3JtQ29udHJvbCIsInBsYWNlaG9sZGVyIl0sWyJpZCIsIm5ld1Bhc3N3b3JkIiwidHlwZSIsInBhc3N3b3JkIiwibWF0SW5wdXQiLCIiLCJyZXF1aXJlZCIsIiIsImF1dG9jb21wbGV0ZSIsIm5ldy1wYXNzd29yZCIsImFyaWEtbGFiZWwiLCJGaWVsZCBmb3IgdGhlIG5ldyBwYXNzd29yZCIsMywiZm9ybUNvbnRyb2wiXSxbInRyYW5zbGF0ZSIsIiJdLFsxLCJmYXMiLCJmYS1leGNsYW1hdGlvbi1jaXJjbGUiXSxbImFsaWduIiwiZW5kIl0sWyJ0cmFuc2xhdGUiLCIiLDMsInRyYW5zbGF0ZVBhcmFtcyJdLFsiaWQiLCJuZXdQYXNzd29yZFJlcGVhdCIsInR5cGUiLCJwYXNzd29yZCIsIm1hdElucHV0IiwiIiwicmVxdWlyZWQiLCIiLCJhdXRvY29tcGxldGUiLCJuZXctcGFzc3dvcmQiLCJhcmlhLWxhYmVsIiwiRmllbGQgdG8gcmVwZWF0IHRoZSBuZXcgcGFzc3dvcmQiLDMsImZvcm1Db250cm9sIl0sWyJ0eXBlIiwic3VibWl0IiwiaWQiLCJjaGFuZ2VCdXR0b24iLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsImNvbG9yIiwicHJpbWFyeSIsImFyaWEtbGFiZWwiLCJCdXR0b24gdG8gY29uZmlybSB0aGUgY2hhbmdlIiwzLCJjbGljayIsImRpc2FibGVkIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLDEsImZhciIsImZhLWVkaXQiLCJmYS1sZyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO2MoMCwic2VjdGlvbiIsMikoMSwibWF0LWNhcmQiLDMpKDIsImhlYWRlciIpKDMsImgxIiw0KSxtKDQpLGIoNSwidHJhbnNsYXRlIikscygpKCksYyg2LCJwIiw1KSxtKDcpLHMoKSxjKDgsInAiLDYpLG0oOSkscygpLGMoMTAsImZvcm0iLDcpKDExLCJtYXQtZm9ybS1maWVsZCIsOCkoMTIsIm1hdC1sYWJlbCIpLG0oMTMpLGIoMTQsInRyYW5zbGF0ZSIpLHMoKSx1KDE1LCJpbnB1dCIsOSksYigxNiwidHJhbnNsYXRlIiksTSgxNyxOUiwzLDMsIm1hdC1lcnJvciIpLHMoKSxjKDE4LCJtYXQtZm9ybS1maWVsZCIsOCkoMTksIm1hdC1sYWJlbCIpLG0oMjApLGIoMjEsInRyYW5zbGF0ZSIpLHMoKSx1KDIyLCJpbnB1dCIsMTAsMCksYygyNCwibWF0LWhpbnQiLDExKSx1KDI1LCJpIiwxMiksYygyNiwiZW0iLDExKSxtKDI3KSxiKDI4LCJ0cmFuc2xhdGUiKSxzKCkoKSxjKDI5LCJtYXQtaGludCIsMTMpLG0oMzApLHMoKSxNKDMxLFJSLDMsMywibWF0LWVycm9yIiksTSgzMixGUiwzLDUsIm1hdC1lcnJvciIsMTQpLHMoKSxjKDMzLCJtYXQtZm9ybS1maWVsZCIsOCkoMzQsIm1hdC1sYWJlbCIpLG0oMzUpLGIoMzYsInRyYW5zbGF0ZSIpLHMoKSx1KDM3LCJpbnB1dCIsMTUsMSksYygzOSwibWF0LWhpbnQiLDEzKSxtKDQwKSxzKCksTSg0MSxCUiwyLDAsIm1hdC1lcnJvciIsMTEpLE0oNDIsVVIsMywzLCJtYXQtZXJyb3IiLDExKSxzKCkoKSxjKDQzLCJidXR0b24iLDE2KSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuY2hhbmdlUGFzc3dvcmQoKSl9KSx1KDQ0LCJpIiwxNyksbSg0NSksYig0NiwidHJhbnNsYXRlIikscygpKCkoKX1pZihpJjIpe2xldCByPXNlKDIzKSxvPXNlKDM4KTtsKDQpLEUoIiAiLEMoNSwyMywiVElUTEVfQ0hBTkdFX1BBU1NXT1JEIiksIiAiKSxsKDIpLGYoImhpZGRlbiIsIShhLmNvbmZpcm1hdGlvbiYmIWEucGFzc3dvcmRDb250cm9sLmRpcnR5JiYhYS5uZXdQYXNzd29yZENvbnRyb2wuZGlydHkmJiFhLnJlcGVhdE5ld1Bhc3N3b3JkQ29udHJvbC5kaXJ0eSkpLGwoKSxFKCIgIixhLmNvbmZpcm1hdGlvbiwiICIpLGwoKSxmKCJoaWRkZW4iLCEoYS5lcnJvciYmIWEucGFzc3dvcmRDb250cm9sLmRpcnR5JiYhYS5uZXdQYXNzd29yZENvbnRyb2wuZGlydHkmJiFhLnJlcGVhdE5ld1Bhc3N3b3JkQ29udHJvbC5kaXJ0eSkpLGwoKSxFKCIgIixhLmVycm9yLCIgIiksbCg0KSxBKEMoMTQsMjUsIkxBQkVMX0NVUlJFTlRfUEFTU1dPUkQiKSksbCgyKSxmKCJwbGFjZWhvbGRlciIsVmUoQygxNiwyNywiTUFOREFUT1JZX0NVUlJFTlRfUEFTU1dPUkQiKSkpKCJmb3JtQ29udHJvbCIsYS5wYXNzd29yZENvbnRyb2wpLGwoMiksdyhhLnBhc3N3b3JkQ29udHJvbC5pbnZhbGlkPzE3Oi0xKSxsKDMpLEEoQygyMSwyOSwiTEFCRUxfTkVXX1BBU1NXT1JEIikpLGwoMiksZigiZm9ybUNvbnRyb2wiLGEubmV3UGFzc3dvcmRDb250cm9sKSxsKDUpLEEoZHQoMjgsMzEsIklOVkFMSURfUEFTU1dPUkRfTEVOR1RIIixTdCgzOCxFXykpKSxsKDMpLEUoIiIsKHIudmFsdWU9PW51bGw/bnVsbDpyLnZhbHVlLmxlbmd0aCl8fDAsIi80MCIpLGwoKSx3KGEubmV3UGFzc3dvcmRDb250cm9sIT1udWxsJiZhLm5ld1Bhc3N3b3JkQ29udHJvbC5pbnZhbGlkJiYoYS5uZXdQYXNzd29yZENvbnRyb2whPW51bGwmJmEubmV3UGFzc3dvcmRDb250cm9sLmVycm9ycy5yZXF1aXJlZCk/MzE6LTEpLGwoKSx3KGEubmV3UGFzc3dvcmRDb250cm9sIT1udWxsJiZhLm5ld1Bhc3N3b3JkQ29udHJvbC5pbnZhbGlkJiYoYS5uZXdQYXNzd29yZENvbnRyb2whPW51bGwmJmEubmV3UGFzc3dvcmRDb250cm9sLmVycm9ycy5taW5sZW5ndGh8fGEubmV3UGFzc3dvcmRDb250cm9sIT1udWxsJiZhLm5ld1Bhc3N3b3JkQ29udHJvbC5lcnJvcnMubWF4bGVuZ3RoKT8zMjotMSksbCgzKSxBKEMoMzYsMzQsIkxBQkVMX1JFUEVBVF9ORVdfUEFTU1dPUkQiKSksbCgyKSxmKCJmb3JtQ29udHJvbCIsYS5yZXBlYXROZXdQYXNzd29yZENvbnRyb2wpLGwoMyksRSgiIiwoby52YWx1ZT09bnVsbD9udWxsOm8udmFsdWUubGVuZ3RoKXx8MCwiLzIwIiksbCgpLHcoYS5yZXBlYXROZXdQYXNzd29yZENvbnRyb2wuaW52YWxpZCYmYS5yZXBlYXROZXdQYXNzd29yZENvbnRyb2wuZXJyb3JzLnJlcXVpcmVkPzQxOi0xKSxsKCksdyhhLnJlcGVhdE5ld1Bhc3N3b3JkQ29udHJvbC5pbnZhbGlkJiZhLnJlcGVhdE5ld1Bhc3N3b3JkQ29udHJvbC5lcnJvcnMubm90U2FtZT80MjotMSksbCgpLGYoImRpc2FibGVkIixhLnBhc3N3b3JkQ29udHJvbC5pbnZhbGlkfHxhLm5ld1Bhc3N3b3JkQ29udHJvbC5pbnZhbGlkfHxhLnJlcGVhdE5ld1Bhc3N3b3JkQ29udHJvbC5pbnZhbGlkKSxsKDIpLEUoIiAiLEMoNDYsMzYsIkJUTl9DSEFOR0UiKSwiICIpfX0sZGVwZW5kZW5jaWVzOltkZSxwZSxZLFNlLFFlLFplLGh0LGYxLFF0LCRlLG50LGF0LGcyLGd0LG10LHUyLGtyLF9hLHp0LGUxLG9lLGxlLEtdLHN0eWxlczpbYG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtoZWlnaHQ6YXV0bzttYXJnaW4tYm90dG9tOjEuMjVyZW07bWluLXdpZHRoOjMyMHB4O3BhZGRpbmc6MXJlbTt3aWR0aDoyNSV9bWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctdG9wOi42MjVyZW19LmNvbmZpcm1hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5lcnJvcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjB9LmZvcm0tY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3Bvc2l0aW9uOnJlbGF0aXZlfWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouMjVyZW19I2NoYW5nZUJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MjAlO21hcmdpbi10b3A6MnJlbTt3aWR0aDo2MCV9ZW1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnZhcigtLXRoZW1lLXRleHQtZmFkZS0zMCkhaW1wb3J0YW50O2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTFweDttYXJnaW4tbGVmdDouNXJlbTt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1hdC1tZGMtZm9ybS1maWVsZC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Y29sb3I6dmFyKC0tdGhlbWUtdGV4dC1mYWRlLTMwKSFpbXBvcnRhbnQ7ZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZToxMXB4O21hcmdpbi1sZWZ0Oi0uNjI1cmVtIWltcG9ydGFudDttYXJnaW4tcmlnaHQ6LS42MjVyZW0haW1wb3J0YW50fS5jZW50ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpzdHJldGNoO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgZHMsbDc9eCgoKT0+e050KCk7V3QoKTtrKCk7bHQoKTtrKCk7ZHM9KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtob3N0PXRoaXMuaG9zdFNlcnZlcisiL2FwaS9Db21wbGFpbnRzIjtzYXZlKGUpe3JldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLmhvc3QrIi8iLGUpLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBZUih0LG4pe3QmMSYmKGMoMCwicCIsNiksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYobCgpLEUoIiAiLGR0KDIsMSwiSU5WQUxJRF9GSUxFX1RZUEUiLFN0KDQsV1IpKSwiICIpKX1mdW5jdGlvbiBaUih0LG4pe3QmMSYmKGMoMCwicCIsNiksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYobCgpLEUoIiAiLGR0KDIsMSwiSU5WQUxJRF9GSUxFX1NJWkUiLFN0KDQsUVIpKSwiICIpKX1mdW5jdGlvbiAkUih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiwxMiksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYobCgpLEUoIiIsQygyLDEsIk1BTkRBVE9SWV9NRVNTQUdFIiksIiAiKSl9dmFyIHFSLEdSLFdSLFFSLElfLExfPXgoKCk9PntOdCgpO2w3KCk7RjEoKTtrKCk7V2UoKTtwYygpO1l0KCk7cjEoKTtEYSgpO1coKTtuZSgpO2V0KCk7SmUoKTtoZSgpO3ZlKCk7aygpO2hlKCk7SmUoKTtldCgpO1dlKCk7cGMoKTtuZSgpO3ZlKCk7VygpO3FSPVsiZmlsZUNvbnRyb2wiXSxHUj0oKT0+KHtsZW5ndGg6IjE2MCJ9KSxXUj0oKT0+KHt0eXBlOiJQREYsIFpJUCJ9KSxRUj0oKT0+KHtzaXplOiIxMDAgS0IifSk7TGUuYWRkKFVyKTtJXz0oKCk9PntjbGFzcyB0e3VzZXJTZXJ2aWNlPWgoQXQpO2NvbXBsYWludFNlcnZpY2U9aChkcyk7Zm9ybVN1Ym1pdFNlcnZpY2U9aChUaSk7dHJhbnNsYXRlPWgoSXQpO2N1c3RvbWVyQ29udHJvbD1uZXcga2Uoe3ZhbHVlOiIiLGRpc2FibGVkOiEwfSxbXSk7bWVzc2FnZUNvbnRyb2w9bmV3IGtlKCIiLFtKLnJlcXVpcmVkLEoubWF4TGVuZ3RoKDE2MCldKTtmaWxlQ29udHJvbDtmaWxlVXBsb2FkRXJyb3I9dm9pZCAwO3VwbG9hZGVyPW5ldyBtYyh7dXJsOnVlLmhvc3RTZXJ2ZXIrIi9maWxlLXVwbG9hZCIsYXV0aFRva2VuOmBCZWFyZXIgJHtsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidG9rZW4iKX1gLGFsbG93ZWRNaW1lVHlwZTpbImFwcGxpY2F0aW9uL3BkZiIsImFwcGxpY2F0aW9uL3htbCIsInRleHQveG1sIiwiYXBwbGljYXRpb24vemlwIiwiYXBwbGljYXRpb24veC16aXAtY29tcHJlc3NlZCIsIm11bHRpcGFydC94LXppcCIsImFwcGxpY2F0aW9uL3lhbWwiLCJhcHBsaWNhdGlvbi94LXlhbWwiLCJ0ZXh0L3lhbWwiLCJ0ZXh0L3gteWFtbCJdLG1heEZpbGVTaXplOjFlNX0pO3VzZXJFbWFpbD12b2lkIDA7Y29tcGxhaW50PXZvaWQgMDtjb25maXJtYXRpb247bmdPbkluaXQoKXt0aGlzLmluaXRDb21wbGFpbnQoKSx0aGlzLnVwbG9hZGVyLm9uV2hlbkFkZGluZ0ZpbGVGYWlsZWQ9KGUsaSk9Pnt0aHJvdyB0aGlzLmZpbGVVcGxvYWRFcnJvcj1pLG5ldyBFcnJvcihgRXJyb3IgZHVlIHRvIDogJHtpLm5hbWV9YCl9LHRoaXMudXBsb2FkZXIub25BZnRlckFkZGluZ0ZpbGU9KCk9Pnt0aGlzLmZpbGVVcGxvYWRFcnJvcj12b2lkIDB9LHRoaXMudXBsb2FkZXIub25TdWNjZXNzSXRlbT0oKT0+e3RoaXMuc2F2ZUNvbXBsYWludCgpLHRoaXMudXBsb2FkZXIuY2xlYXJRdWV1ZSgpfSx0aGlzLmZvcm1TdWJtaXRTZXJ2aWNlLmF0dGFjaEVudGVyS2V5SGFuZGxlcigiY29tcGxhaW50LWZvcm0iLCJzdWJtaXRCdXR0b24iLCgpPT57dGhpcy5zYXZlKCl9KX1pbml0Q29tcGxhaW50KCl7dGhpcy51c2VyU2VydmljZS53aG9BbUkoWyJpZCIsImVtYWlsIl0pLnN1YnNjcmliZSh7bmV4dDplPT57dGhpcy5jb21wbGFpbnQ9e30sdGhpcy5jb21wbGFpbnQuVXNlcklkPWUuaWQsdGhpcy51c2VyRW1haWw9ZS5lbWFpbCx0aGlzLmN1c3RvbWVyQ29udHJvbC5zZXRWYWx1ZSh0aGlzLnVzZXJFbWFpbCl9LGVycm9yOmU9Pnt0aGlzLmNvbXBsYWludD12b2lkIDAsY29uc29sZS5sb2coZSl9fSl9c2F2ZSgpe3RoaXMudXBsb2FkZXIucXVldWVbMF0/KHRoaXMudXBsb2FkZXIucXVldWVbMF0udXBsb2FkKCksdGhpcy5maWxlQ29udHJvbC5uYXRpdmVFbGVtZW50LnZhbHVlPW51bGwpOnRoaXMuc2F2ZUNvbXBsYWludCgpfXNhdmVDb21wbGFpbnQoKXt0aGlzLmNvbXBsYWludC5tZXNzYWdlPXRoaXMubWVzc2FnZUNvbnRyb2wudmFsdWUsdGhpcy5jb21wbGFpbnRTZXJ2aWNlLnNhdmUodGhpcy5jb21wbGFpbnQpLnN1YnNjcmliZSh7bmV4dDplPT57dGhpcy50cmFuc2xhdGUuZ2V0KCJDVVNUT01FUl9TVVBQT1JUX0NPTVBMQUlOVF9SRVBMWSIse3JlZjplLmlkfSkuc3Vic2NyaWJlKHtuZXh0Omk9Pnt0aGlzLmNvbmZpcm1hdGlvbj1pfSxlcnJvcjppPT57dGhpcy5jb25maXJtYXRpb249aX19KSx0aGlzLmluaXRDb21wbGFpbnQoKSx0aGlzLnJlc2V0Rm9ybSgpLHRoaXMuZmlsZVVwbG9hZEVycm9yPXZvaWQgMH0sZXJyb3I6ZT0+ZX0pfXJlc2V0Rm9ybSgpe3RoaXMubWVzc2FnZUNvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMubWVzc2FnZUNvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5tZXNzYWdlQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMuZmlsZUNvbnRyb2wubmF0aXZlRWxlbWVudC52YWx1ZT1udWxsfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1jb21wbGFpbnQiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiZ0ZShxUiw3KSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5maWxlQ29udHJvbD1yLmZpcnN0KX19LGRlY2xzOjQ2LHZhcnM6MzQsY29uc3RzOltbImNvbXBsYWludE1lc3NhZ2UiLCIiXSxbImZpbGVDb250cm9sIiwiIl0sWzEsImNlbnRlci1jb250YWluZXIiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwibWF0LWVsZXZhdGlvbi16NiJdLFsiYXJpYS1saXZlIiwicG9saXRlIl0sWzEsImNvbmZpcm1hdGlvbiIsMywiaGlkZGVuIl0sWyJyb2xlIiwiYWxlcnQiLDEsImVycm9yIiwiZmlsZVVwbG9hZEVycm9yIl0sWyJpZCIsImNvbXBsYWludC1mb3JtIiwxLCJmb3JtLWNvbnRhaW5lciJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmUiLCJjb2xvciIsImFjY2VudCJdLFsidHlwZSIsInRleHQiLCJtYXRJbnB1dCIsIiIsImFyaWEtbGFiZWwiLCJUZXh0IGZpZWxkIGZvciB0aGUgbWFpbCBhZGRyZXNzIG9mIHRoZSB1c2VyIiwzLCJmb3JtQ29udHJvbCJdLFsxLCJmYXMiLCJmYS1leGNsYW1hdGlvbi1jaXJjbGUiXSxbImlkIiwiY29tcGxhaW50TWVzc2FnZSIsIm1hdEF1dG9zaXplTWluUm93cyIsIjQiLCJtYXRBdXRvc2l6ZU1heFJvd3MiLCI0IiwibWF0VGV4dGFyZWFBdXRvc2l6ZSIsIiIsImNvbHMiLCI1MCIsIm1heGxlbmd0aCIsIjE2MCIsIm1hdElucHV0IiwiIiwiYXJpYS1sYWJlbCIsIkZpZWxkIGZvciBlbnRlcmluZyB0aGUgY29tcGxhaW50IiwiYXJpYS1yZXF1aXJlZCIsInRydWUiLCJhcmlhLWRlc2NyaWJlZGJ5IiwibWVzc2FnZUNvdW50ZXIiLDMsImZvcm1Db250cm9sIiwicGxhY2Vob2xkZXIiXSxbInJvbGUiLCJhbGVydCJdLFsiYWxpZ24iLCJlbmQiLCJpZCIsIm1lc3NhZ2VDb3VudGVyIl0sWzEsImludm9pY2UiXSxbImZvciIsImZpbGUiXSxbIm5nMkZpbGVTZWxlY3QiLCIiLCJpZCIsImZpbGUiLCJ0eXBlIiwiZmlsZSIsImFjY2VwdCIsIi5wZGYsLnppcCIsImFyaWEtbGFiZWwiLCJJbnB1dCBhcmVhIGZvciB1cGxvYWRpbmcgYSBzaW5nbGUgaW52b2ljZSBQREYgb3IgWE1MIEIyQiBvcmRlciBmaWxlIG9yIGEgWklQIGFyY2hpdmUgY29udGFpbmluZyBtdWx0aXBsZSBpbnZvaWNlcyBvciBvcmRlcnM8IS0tLS0+IiwzLCJ1cGxvYWRlciJdLFsidHlwZSIsInN1Ym1pdCIsImlkIiwic3VibWl0QnV0dG9uIiwibWF0LXJhaXNlZC1idXR0b24iLCIiLCJjb2xvciIsInByaW1hcnkiLCJhcmlhLWxhYmVsIiwiQnV0dG9uIHRvIHNlbmQgdGhlIGNvbXBsYWludCIsMywiY2xpY2siLCJkaXNhYmxlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO2MoMCwibWFpbiIsMikoMSwibWF0LWNhcmQiLDMpKDIsImgxIiksbSgzKSxiKDQsInRyYW5zbGF0ZSIpLHMoKSxjKDUsInNlY3Rpb24iLDQpKDYsInAiLDUpLG0oNykscygpLE0oOCxZUiwzLDUsInAiLDYpLE0oOSxaUiwzLDUsInAiLDYpLHMoKSxjKDEwLCJmb3JtIiw3KSgxMSwibWF0LWZvcm0tZmllbGQiLDgpKDEyLCJtYXQtbGFiZWwiKSxtKDEzKSxiKDE0LCJ0cmFuc2xhdGUiKSxzKCksdSgxNSwiaW5wdXQiLDkpLHMoKSxjKDE2LCJtYXQtZm9ybS1maWVsZCIsOCkoMTcsIm1hdC1sYWJlbCIpLG0oMTgpLGIoMTksInRyYW5zbGF0ZSIpLHMoKSxjKDIwLCJtYXQtaGludCIpLHUoMjEsImkiLDEwKSxjKDIyLCJlbSIpLG0oMjMpLGIoMjQsInRyYW5zbGF0ZSIpLHMoKSgpLHUoMjUsInRleHRhcmVhIiwxMSwwKSxiKDI3LCJ0cmFuc2xhdGUiKSxNKDI4LCRSLDMsMywibWF0LWVycm9yIiwxMiksYygyOSwibWF0LWhpbnQiLDEzKSgzMCwib3V0cHV0IiksbSgzMSkscygpLG0oMzIsIi8xNjAgIikscygpKCksYygzMywicCIsMTQpKDM0LCJsYWJlbCIsMTUpLG0oMzUpLGIoMzYsInRyYW5zbGF0ZSIpLGMoMzcsInNwYW4iKSxtKDM4LCI6IikscygpKCksdSgzOSwiaW5wdXQiLDE2LDEpLHMoKSgpLGMoNDEsImJ1dHRvbiIsMTcpLFMoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5zYXZlKCkpfSksYyg0MiwibWF0LWljb24iKSxtKDQzLCIgc2VuZCAiKSxzKCksbSg0NCksYig0NSwidHJhbnNsYXRlIikscygpKCkoKX1pZihpJjIpe2xldCByPXNlKDI2KTtsKDMpLEEoQyg0LDE4LCJOQVZfQ09NUExBSU4iKSksbCgzKSxmKCJoaWRkZW4iLCEoYS5jb25maXJtYXRpb24mJiFhLm1lc3NhZ2VDb250cm9sLmRpcnR5KSksbCgpLEUoIiAiLGEuY29uZmlybWF0aW9uLCIgIiksbCgpLHcoYS5maWxlVXBsb2FkRXJyb3ImJmEuZmlsZVVwbG9hZEVycm9yLm5hbWU9PT0ibWltZVR5cGUiPzg6LTEpLGwoKSx3KGEuZmlsZVVwbG9hZEVycm9yJiZhLmZpbGVVcGxvYWRFcnJvci5uYW1lPT09ImZpbGVTaXplIj85Oi0xKSxsKDQpLEEoQygxNCwyMCwiTEFCRUxfQ1VTVE9NRVIiKSksbCgyKSxmKCJmb3JtQ29udHJvbCIsYS5jdXN0b21lckNvbnRyb2wpLGwoMyksQShDKDE5LDIyLCJMQUJFTF9NRVNTQUdFIikpLGwoNSksQShkdCgyNCwyNCwiTUFYX1RFWFRBUkVBX0xFTkdUSCIsU3QoMzMsR1IpKSksbCgyKSxmKCJwbGFjZWhvbGRlciIsVmUoQygyNywyNywiV1JJVEVfTUVTU0FHRV9QTEFDRUhPTERFUiIpKSkoImZvcm1Db250cm9sIixhLm1lc3NhZ2VDb250cm9sKSxsKDMpLHcoYS5tZXNzYWdlQ29udHJvbC5pbnZhbGlkJiYoYS5tZXNzYWdlQ29udHJvbCE9bnVsbCYmYS5tZXNzYWdlQ29udHJvbC5lcnJvcnMucmVxdWlyZWQpPzI4Oi0xKSxsKDMpLEEoKHIudmFsdWU9PW51bGw/bnVsbDpyLnZhbHVlLmxlbmd0aCl8fDApLGwoNCksQShDKDM2LDI5LCJMQUJFTF9JTlZPSUNFIikpLGwoNCksZigidXBsb2FkZXIiLGEudXBsb2FkZXIpLGwoMiksZigiZGlzYWJsZWQiLGEubWVzc2FnZUNvbnRyb2wuaW52YWxpZHx8YS5maWxlVXBsb2FkRXJyb3IpLGwoMyksRSgiICIsQyg0NSwzMSwiQlROX1NVQk1JVCIpLCIgIil9fSxkZXBlbmRlbmNpZXM6W2RlLHBlLFksUWUsWmUsaHQsZjEsUXQsJGUsbnQsYXQsZzIsZ3QsbXQsdTIsTWksX2EsenQsZTEsaGMsUGcsb2UsbGUsZ2UsQ2UsS10sc3R5bGVzOltgbWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDphdXRvO21pbi13aWR0aDozMjBweDtwYWRkaW5nOjFyZW07d2lkdGg6MzAlfW1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLXRvcDouNjI1cmVtfS5mb3JtLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtwb3NpdGlvbjpyZWxhdGl2ZX0jc3VibWl0QnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDoyMCU7bWFyZ2luLXRvcDoycmVtO3dpZHRoOjYwJX0jZmlsZVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6LjYyNXJlbX0ubWRjLWNhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowfS5pbnZvaWNlW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7bWFyZ2luLWxlZnQ6LjEyNXJlbTttYXJnaW4tdG9wOjFyZW19ZW1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnZhcigtLXRoZW1lLXRleHQtZmFkZS0zMCkhaW1wb3J0YW50O2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTFweDttYXJnaW4tbGVmdDouMjVyZW07d2hpdGUtc3BhY2U6bm93cmFwfS5tYXQtbWRjLWZvcm0tZmllbGQtaGludFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2NvbG9yOnZhcigtLXRoZW1lLXRleHQtZmFkZS0zMCkhaW1wb3J0YW50O2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTFweDttYXJnaW4tbGVmdDotLjYyNXJlbSFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0Oi0uNjI1cmVtIWltcG9ydGFudH0uY2VudGVyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6c3RyZXRjaDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcn1wW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MH0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIG1zLGQ3PXgoKCk9PntOdCgpO1d0KCk7aygpO2x0KCk7aygpO21zPSgoKT0+e2NsYXNzIHR7aHR0cD1oKEFlKTtob3N0U2VydmVyPXVlLmhvc3RTZXJ2ZXI7aG9zdD10aGlzLmhvc3RTZXJ2ZXIrIi9yZXN0L2NoYXRib3QiO2dldENoYXRib3RTdGF0dXMoKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmhvc3QrIi9zdGF0dXMiKS5waXBlKHEoZT0+ZSksaihlPT57dGhyb3cgZX0pKX1nZXRSZXNwb25zZShlLGkpe3JldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLmhvc3QrIi9yZXNwb25kIix7YWN0aW9uOmUscXVlcnk6aX0pLnBpcGUocShhPT5hKSxqKGE9Pnt0aHJvdyBhfSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gWFIodCxuKXtpZih0JjEmJnUoMCwiaW1nIiwxNiksdCYyKXtsZXQgZT12KDIpO2YoInNyYyIsVmUoZS5qdWljeUltYWdlU3JjKSx3dCl9fWZ1bmN0aW9uIEpSKHQsbil7aWYodCYxJiZ1KDAsImltZyIsMTcpLHQmMil7bGV0IGU9digyKTtmKCJzcmMiLFZlKGUucHJvZmlsZUltYWdlU3JjKSx3dCl9fWZ1bmN0aW9uIGVGKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDEwKSxNKDEsWFIsMSwyLCJpbWciLDE2KSxNKDIsSlIsMSwyLCJpbWciLDE3KSxjKDMsImRpdiIpLG0oNCkscygpKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgpLHcoZS5hdXRob3I9PT0iYm90Ij8xOi0xKSxsKCksdyhlLmF1dGhvcj09PSJ1c2VyIj8yOi0xKSxsKCksRHQoZS5hdXRob3I9PT0idXNlciI/InNwZWVjaC1idWJibGUtcmlnaHQiOiJzcGVlY2gtYnViYmxlLWxlZnQiKSxsKCksRSgiICIsZS5ib2R5LCIgIil9fXZhciBLUixxNCxQXyxWXz14KCgpPT57ZDcoKTtGMSgpO2soKTtXZSgpO1l0KCk7cjEoKTtEYSgpO1coKTt3aSgpO2V0KCk7SmUoKTtoZSgpO2soKTtoZSgpO0plKCk7VygpO2V0KCk7V2UoKTtLUj0oKT0+KHtjaGF0Ym90OiJqdWljeS1jaGF0LWJvdCJ9KTtMZS5hZGQoVXIpO3E0PShmdW5jdGlvbih0KXtyZXR1cm4gdC51c2VyPSJ1c2VyIix0LmJvdD0iYm90Iix0fSkocTR8fHt9KSxQXz0oKCk9PntjbGFzcyB0e3VzZXJTZXJ2aWNlPWgoQXQpO2NoYXRib3RTZXJ2aWNlPWgobXMpO2Nvb2tpZVNlcnZpY2U9aChadCk7Zm9ybVN1Ym1pdFNlcnZpY2U9aChUaSk7dHJhbnNsYXRlPWgoSXQpO21lc3NhZ2VDb250cm9sPW5ldyBrZTttZXNzYWdlcz1bXTtqdWljeUltYWdlU3JjPSJhc3NldHMvcHVibGljL2ltYWdlcy9DaGF0Ym90QXZhdGFyLnBuZyI7cHJvZmlsZUltYWdlU3JjPSJhc3NldHMvcHVibGljL2ltYWdlcy91cGxvYWRzL2RlZmF1bHQuc3ZnIjttZXNzYWdlQWN0aW9ucz17cmVzcG9uc2U6InF1ZXJ5IixuYW1lcXVlcnk6InNldG5hbWUifTtjdXJyZW50QWN0aW9uPXRoaXMubWVzc2FnZUFjdGlvbnMucmVzcG9uc2U7Y2hhdFNjcm9sbERvd25UaW1lb3V0SWQ9bnVsbDtuZ09uRGVzdHJveSgpe3RoaXMuY2hhdFNjcm9sbERvd25UaW1lb3V0SWQmJmNsZWFyVGltZW91dCh0aGlzLmNoYXRTY3JvbGxEb3duVGltZW91dElkKX1uZ09uSW5pdCgpe3RoaXMuY2hhdGJvdFNlcnZpY2UuZ2V0Q2hhdGJvdFN0YXR1cygpLnN1YnNjcmliZShlPT57dGhpcy5tZXNzYWdlcy5wdXNoKHthdXRob3I6cTQuYm90LGJvZHk6ZS5ib2R5fSksZS5hY3Rpb24mJih0aGlzLmN1cnJlbnRBY3Rpb249dGhpcy5tZXNzYWdlQWN0aW9uc1tlLmFjdGlvbl0pfSksdGhpcy51c2VyU2VydmljZS53aG9BbUkoWyJwcm9maWxlSW1hZ2UiXSkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLnByb2ZpbGVJbWFnZVNyYz1lLnByb2ZpbGVJbWFnZX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfWhhbmRsZVJlc3BvbnNlKGUpe2lmKHRoaXMubWVzc2FnZXMucHVzaCh7YXV0aG9yOnE0LmJvdCxib2R5OmUuYm9keX0pLHRoaXMuY3VycmVudEFjdGlvbj10aGlzLm1lc3NhZ2VBY3Rpb25zW2UuYWN0aW9uXSxlLnRva2VuKXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgidG9rZW4iLGUudG9rZW4pO2xldCBpPW5ldyBEYXRlO2kuc2V0SG91cnMoaS5nZXRIb3VycygpKzgpLHRoaXMuY29va2llU2VydmljZS5wdXQoInRva2VuIixlLnRva2VuLHtleHBpcmVzOml9KX19c2VuZE1lc3NhZ2UoKXtsZXQgZT10aGlzLm1lc3NhZ2VDb250cm9sLnZhbHVlO2UmJih0aGlzLm1lc3NhZ2VzLnB1c2goe2F1dGhvcjpxNC51c2VyLGJvZHk6ZX0pLHRoaXMubWVzc2FnZUNvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMuY2hhdGJvdFNlcnZpY2UuZ2V0Q2hhdGJvdFN0YXR1cygpLnN1YnNjcmliZShpPT57IWkuc3RhdHVzJiYhaS5hY3Rpb24/dGhpcy5tZXNzYWdlcy5wdXNoKHthdXRob3I6cTQuYm90LGJvZHk6aS5ib2R5fSk6dGhpcy5jaGF0Ym90U2VydmljZS5nZXRSZXNwb25zZSh0aGlzLmN1cnJlbnRBY3Rpb24sZSkuc3Vic2NyaWJlKGE9Pnt0aGlzLmhhbmRsZVJlc3BvbnNlKGEpfSksdGhpcy5jaGF0U2Nyb2xsRG93blRpbWVvdXRJZD1zZXRUaW1lb3V0KCgpPT57bGV0IGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNoYXQtd2luZG93Iik7YS5zY3JvbGxUb3A9YS5zY3JvbGxIZWlnaHQsdGhpcy5jaGF0U2Nyb2xsRG93blRpbWVvdXRJZD1udWxsfSwyNTApfSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1jaGF0Ym90Il1dLGRlY2xzOjI0LHZhcnM6MTMsY29uc3RzOltbIm1lc3NhZ2UiLCIiXSxbMSwiY2VudGVyLWNvbnRhaW5lciJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJtYXQtZWxldmF0aW9uLXo2Il0sWzEsIm1kYy1jYXJkIiwiY2hhdC13cmFwcGVyIl0sWzEsInBvd2VyZWQtYnkiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsImlkIiwiY2hhdC1jb250YWluZXIiXSxbMSwibWRjLWNhcmQiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsImlkIiwiY2hhdC1ib3giXSxbMSwibWRjLWNhcmQiLCJjaGF0LWNvbnRlbnQiXSxbImlkIiwiY2hhdC13aW5kb3ciXSxbMSwibWVzc2FnZS1jb250YWluZXIiXSxbMSwibWVzc2FnZS1ib3gtY29udGFpbmVyIl0sWzEsImZvcm0td3JhcHBlciJdLFsiY29sb3IiLCJhY2NlbnQiLCJhcHBlYXJhbmNlIiwib3V0bGluZSJdLFsidHJhbnNsYXRlIiwiIl0sWyJpZCIsIm1lc3NhZ2UtaW5wdXQiLCJuYW1lIiwibWVzc2FnZSIsIm1hdElucHV0IiwiIiwiYXJpYS1sYWJlbCIsIlRleHQgZmllbGQgZm9yIGEgY2hhdCBtZXNzYWdlIiwzLCJrZXl1cC5lbnRlciIsImZvcm1Db250cm9sIiwicGxhY2Vob2xkZXIiXSxbMSwianVpY3ktY2hhdC1ib3QtaW1hZ2UiLDMsInNyYyJdLFsxLCJwcm9maWxlLWltYWdlIiwzLCJzcmMiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtjKDAsImRpdiIsMSkoMSwibWF0LWNhcmQiLDIpKDIsImRpdiIsMykoMywiaDEiKSxtKDQpLGIoNSwidHJhbnNsYXRlIiksYyg2LCJzcGFuIiw0KSxtKDcpLGIoOCwidHJhbnNsYXRlIikscygpKCksYyg5LCJtYXQtY2FyZCIsNSkoMTAsImRpdiIsNikoMTEsIm1hdC1jYXJkIiw3KSgxMiwiZGl2Iiw4KSgxMywiZGl2Iiw5KSxxZSgxNCxlRiw1LDUsImRpdiIsMTAsRnQpLHMoKSxjKDE2LCJkaXYiLDExKSgxNywiZGl2IiwxMikoMTgsIm1hdC1mb3JtLWZpZWxkIiwxMykoMTksIm1hdC1sYWJlbCIsMTQpLG0oMjAsIkxBQkVMX01FU1NBR0UiKSxzKCksYygyMSwiaW5wdXQiLDE1LDApLGIoMjMsInRyYW5zbGF0ZSIpLFMoImtleXVwLmVudGVyIixmdW5jdGlvbigpe3JldHVybiB6KHIpLFQoYS5zZW5kTWVzc2FnZSgpKX0pLHMoKSgpKCkoKSgpKCkoKSgpKCkoKSgpfWkmMiYmKGwoNCksRSgiIixDKDUsNSwiU0VDVElPTl9TVVBQT1JUX0NIQVQiKSwiICIpLGwoMyksRSgiKCIsZHQoOCw3LCJMQUJFTF9QT1dFUkVEX0JZX0NIQVRCT1QiLFN0KDEyLEtSKSksIikiKSxsKDcpLEdlKGEubWVzc2FnZXMpLGwoNyksZigicGxhY2Vob2xkZXIiLFZlKEMoMjMsMTAsIkFTS19NRV9BTllUSElOR19QTEFDRUhPTERFUiIpKSkoImZvcm1Db250cm9sIixhLm1lc3NhZ2VDb250cm9sKSl9LGRlcGVuZGVuY2llczpbZGUscGUsUWUsWmUsaHQsWSxTZSwkZSxudCxhdCxndCxtdCx6dCxlMSxLXSxzdHlsZXM6W2BtYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OmF1dG87bWluLXdpZHRoOjI0MHB4O3dpZHRoOjcwJX0uY2hhdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2hlaWdodDoxMDAlfS5jaGF0LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCU7cG9zaXRpb246cmVsYXRpdmV9bWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG87d2lkdGg6NzAlfSNjaGF0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lO2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDo5NSV9I2NoYXQtYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA0ZDtkaXNwbGF5OmZsZXg7aGVpZ2h0OjY1MHB4O21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG87cGFkZGluZzowO3dpZHRoOjgwJX0jY2hhdC13aW5kb3dbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MTtvdmVyZmxvdy15OmF1dG87cGFkZGluZzoxLjI1cmVtfSNjaGF0LXdpbmRvd1tfbmdjb250ZW50LSVDT01QJV0gICBbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LXNjcm9sbGJhcntiYWNrZ3JvdW5kOm5vbmU7d2lkdGg6MjBweH0jY2hhdC13aW5kb3dbX25nY29udGVudC0lQ09NUCVdICAgW19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7YmFja2dyb3VuZDpub25lfSNjaGF0LXdpbmRvd1tfbmdjb250ZW50LSVDT01QJV0gICBbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kOnJlZDtib3JkZXItcmFkaXVzOjEwcHh9I2NoYXQtd2luZG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVye2JhY2tncm91bmQ6I2IzMDAwMH0ubWVzc2FnZS1ib3gtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOnNvbGlkIDFweCAjZmZmO2JvdHRvbTowO21hcmdpbi1ib3R0b206LTEuMjVyZW07cG9zaXRpb246c3RpY2t5fS5mb3JtLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjFyZW19Lm1lc3NhZ2UtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6YXV0bzttYXJnaW4tcmlnaHQ6MS41cmVtO292ZXJmbG93OmhpZGRlbjt3aWR0aDphdXRvfS5zcGVlY2gtYnViYmxlLXJpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiM1NDZlN2E7Ym9yZGVyLXJhZGl1czo0cHg7ZmxvYXQ6cmlnaHQ7Zm9udC1zaXplOjE1cHg7bGluZS1oZWlnaHQ6MS4zO21hcmdpbi1ib3R0b206MS41cmVtO21heC13aWR0aDo1MDBweDtwYWRkaW5nOjFyZW07cG9zaXRpb246cmVsYXRpdmV9LnNwZWVjaC1idWJibGUtcmlnaHRbX25nY29udGVudC0lQ09NUCVdOmFmdGVye2JvcmRlci1sZWZ0OjIwcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDoyMHB4IHNvbGlkIHJnYig4NCwxMTAsMTIyKTtib3R0b206LTIwcHg7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoyMHB4fS5zcGVlY2gtYnViYmxlLWxlZnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzU0NmU3YTtib3JkZXItcmFkaXVzOjRweDtmbG9hdDpsZWZ0O2ZvbnQtc2l6ZToxNXB4O2xpbmUtaGVpZ2h0OjEuMzttYXJnaW4tYm90dG9tOjEuNXJlbTttYXgtd2lkdGg6NTAwcHg7cGFkZGluZzoxcmVtO3Bvc2l0aW9uOnJlbGF0aXZlfS5zcGVlY2gtYnViYmxlLWxlZnRbX25nY29udGVudC0lQ09NUCVdOmFmdGVye2JvcmRlci1yaWdodDoyMHB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6MjBweCBzb2xpZCByZ2IoODQsMTEwLDEyMik7Ym90dG9tOi0yMHB4O2NvbnRlbnQ6IiI7bGVmdDoyMHB4O3Bvc2l0aW9uOmFic29sdXRlfS5qdWljeS1jaGF0LWJvdC1pbWFnZVtfbmdjb250ZW50LSVDT01QJV17ZmxvYXQ6bGVmdDtoZWlnaHQ6NzBweDttYXJnaW4tdG9wOjEuMjVyZW19LnByb2ZpbGUtaW1hZ2VbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yYWRpdXM6NTAlO2Zsb2F0OnJpZ2h0O2hlaWdodDo0MHB4O21hcmdpbi1sZWZ0Oi42MjVyZW07bWFyZ2luLXRvcDoxLjI1cmVtfS5wb3dlcmVkLWJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6eHgtc21hbGx9LmNlbnRlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOnN0cmV0Y2g7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXJ9QG1lZGlhIChtYXgtd2lkdGg6IDU5OS45OHB4KXttYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6OTAlfSNjaGF0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX19QG1lZGlhIChtYXgtd2lkdGg6IDk1OS45OHB4KXsubWVzc2FnZS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6Z3JpZDtncmlkLWF1dG8tcm93czphdXRvO21hcmdpbi1yaWdodDowfS5wcm9maWxlLWltYWdlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmp1aWN5LWNoYXQtYm90LWltYWdlW19uZ2NvbnRlbnQtJUNPTVAlXXtncmlkLXJvdzoyO21hcmdpbi1ib3R0b206MS4yNXJlbTttYXJnaW4tdG9wOjB9LnByb2ZpbGUtaW1hZ2VbX25nY29udGVudC0lQ09NUCVde2p1c3RpZnktc2VsZjplbmR9LnNwZWVjaC1idWJibGUtcmlnaHRbX25nY29udGVudC0lQ09NUCVdLCAuc3BlZWNoLWJ1YmJsZS1sZWZ0W19uZ2NvbnRlbnQtJUNPTVAlXXtmbG9hdDpub25lO3dpZHRoOmZpdC1jb250ZW50fS5zcGVlY2gtYnViYmxlLXJpZ2h0W19uZ2NvbnRlbnQtJUNPTVAlXXtqdXN0aWZ5LXNlbGY6ZW5kfX0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIGhzLG03PXgoKCk9PntOdCgpO1d0KCk7aygpO2x0KCk7aygpO2hzPSgoKT0+e2NsYXNzIHR7aHR0cD1oKEFlKTtob3N0U2VydmVyPXVlLmhvc3RTZXJ2ZXI7aG9zdD10aGlzLmhvc3RTZXJ2ZXIrIi9hcGkvUmVjeWNsZXMiO2ZpbmQoZSl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0KyIvIix7cGFyYW1zOmV9KS5waXBlKHEoaT0+aS5kYXRhKSxqKGk9Pnt0aHJvdyBpfSkpfXNhdmUoZSl7cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuaG9zdCsiLyIsZSkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO3ZhciBrMixpcj14KCgpPT57TnQoKTtrKCk7V3QoKTtsdCgpO2soKTtrMj0oKCk9PntjbGFzcyB0e2h0dHA9aChBZSk7aG9zdFNlcnZlcj11ZS5ob3N0U2VydmVyO2hvc3Q9dGhpcy5ob3N0U2VydmVyKyIvYXBpL0FkZHJlc3NzIjtnZXQoKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmhvc3QpLnBpcGUocShlPT5lLmRhdGEpLGooZT0+e3Rocm93IGV9KSl9Z2V0QnlJZChlKXtyZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmhvc3R9LyR7ZX1gKS5waXBlKHEoaT0+aS5kYXRhKSxqKGk9Pnt0aHJvdyBpfSkpfXNhdmUoZSl7cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuaG9zdCsiLyIsZSkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1wdXQoZSxpKXtyZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLmhvc3R9LyR7ZX1gLGkpLnBpcGUocShhPT5hLmRhdGEpLGooYT0+e3Rocm93IGF9KSl9ZGVsKGUpe3JldHVybiB0aGlzLmh0dHAuZGVsZXRlKGAke3RoaXMuaG9zdH0vJHtlfWApLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiB0Rih0LG4pe3QmMSYmKGMoMCwiaDEiKSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjImJihsKCksQShDKDIsMSwiVElUTEVfU0VMRUNUX0FERFJFU1MiKSkpfWZ1bmN0aW9uIGlGKHQsbil7dCYxJiYoYygwLCJoMSIpLG0oMSksYigyLCJ0cmFuc2xhdGUiKSxzKCkpLHQmMiYmKGwoKSxBKEMoMiwxLCJNWV9TQVZFRF9BRFJFU1NFUyIpKSl9ZnVuY3Rpb24gYUYodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIiwxNSl9ZnVuY3Rpb24gbkYodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsIm1hdC1jZWxsIikoMSwibWF0LXJhZGlvLWJ1dHRvbiIsMTYpLFMoImNsaWNrIixmdW5jdGlvbigpe2xldCBhPXooZSkuJGltcGxpY2l0LHI9digyKTtyZXR1cm4gVChyLmVtaXRTZWxlY3Rpb25Ub1BhcmVudChhLmlkKSl9KSgiY2hhbmdlIixmdW5jdGlvbihhKXtsZXQgcj16KGUpLiRpbXBsaWNpdCxvPXYoMik7cmV0dXJuIFQoYT9vLnNlbGVjdGlvbi50b2dnbGUocik6bnVsbCl9KSxzKCkoKX1pZih0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9digyKTtsKCksZigiY2hlY2tlZCIsaS5zZWxlY3Rpb24uaXNTZWxlY3RlZChlKSl9fWZ1bmN0aW9uIHJGKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIsMTUpfWZ1bmN0aW9uIG9GKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIpLG0oMSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxFKCIgIixlPT1udWxsP251bGw6ZS5mdWxsTmFtZSwiICIpfX1mdW5jdGlvbiBjRih0LG4pe3QmMSYmdSgwLCJtYXQtaGVhZGVyLWNlbGwiLDE1KX1mdW5jdGlvbiBzRih0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWNlbGwiKSxtKDEpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKCksRmEoIiAiLGU9PW51bGw/bnVsbDplLnN0cmVldEFkZHJlc3MsIiwgIixlPT1udWxsP251bGw6ZS5jaXR5LCIsICIsZT09bnVsbD9udWxsOmUuc3RhdGUsIiwgIixlPT1udWxsP251bGw6ZS56aXBDb2RlLCIgIil9fWZ1bmN0aW9uIGxGKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIsMTUpfWZ1bmN0aW9uIGRGKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIpLG0oMSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxFKCIgIixlPT1udWxsP251bGw6ZS5jb3VudHJ5LCIgIil9fWZ1bmN0aW9uIG1GKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIsMTUpfWZ1bmN0aW9uIGhGKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIpKDEsImJ1dHRvbiIsMTcpLHUoMiwiaSIsMTgpLHMoKSgpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxmKCJyb3V0ZXJMaW5rIixXMigiL2FkZHJlc3MvZWRpdC8iLGUuaWQpKX19ZnVuY3Rpb24gcEYodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIiwxNSl9ZnVuY3Rpb24gZkYodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsIm1hdC1jZWxsIikoMSwiYnV0dG9uIiwxOSksUygiY2xpY2siLGZ1bmN0aW9uKCl7bGV0IGE9eihlKS4kaW1wbGljaXQscj12KDIpO3JldHVybiBUKHIuZGVsZXRlQWRkcmVzcyhhLmlkKSl9KSx1KDIsImkiLDIwKSxzKCkoKX19ZnVuY3Rpb24gdUYodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1yb3ciKX1mdW5jdGlvbiBnRih0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwibWF0LXJvdyIsMjEpLFMoImNsaWNrIixmdW5jdGlvbigpe2xldCBhPXooZSkscj1hLiRpbXBsaWNpdCxvPWEuJGltcGxpY2l0LGQ9digyKTtyZXR1cm4gZC5zZWxlY3Rpb24udG9nZ2xlKHIpLFQoZC5lbWl0U2VsZWN0aW9uVG9QYXJlbnQoby5pZCkpfSkscygpfX1mdW5jdGlvbiB2Rih0LG4pe2lmKHQmMSYmKGMoMCwibWF0LXRhYmxlIiwyKSxfZSgxLDUpLFIoMixhRiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsNikoMyxuRiwyLDEsIm1hdC1jZWxsIiw3KSxiZSgpLF9lKDQsOCksUig1LHJGLDEsMCwibWF0LWhlYWRlci1jZWxsIiw2KSg2LG9GLDIsMSwibWF0LWNlbGwiLDcpLGJlKCksX2UoNyw5KSxSKDgsY0YsMSwwLCJtYXQtaGVhZGVyLWNlbGwiLDYpKDksc0YsMiw0LCJtYXQtY2VsbCIsNyksYmUoKSxfZSgxMCwxMCksUigxMSxsRiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsNikoMTIsZEYsMiwxLCJtYXQtY2VsbCIsNyksYmUoKSxfZSgxMywxMSksUigxNCxtRiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsNikoMTUsaEYsMywyLCJtYXQtY2VsbCIsNyksYmUoKSxfZSgxNiwxMiksUigxNyxwRiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsNikoMTgsZkYsMywwLCJtYXQtY2VsbCIsNyksYmUoKSxSKDE5LHVGLDEsMCwibWF0LWhlYWRlci1yb3ciLDEzKSgyMCxnRiwxLDAsIm1hdC1yb3ciLDE0KSxzKCkpLHQmMil7bGV0IGU9digpO2YoImRhdGFTb3VyY2UiLGUuZGF0YVNvdXJjZSksbCgxOSksZigibWF0SGVhZGVyUm93RGVmIixlLmRpc3BsYXllZENvbHVtbnMpLGwoKSxmKCJtYXRSb3dEZWZDb2x1bW5zIixlLmRpc3BsYXllZENvbHVtbnMpfX1mdW5jdGlvbiBfRih0LG4pe3QmMSYmKGMoMCwiZGl2IiwzKSgxLCJidXR0b24iLDIyKSgyLCJtYXQtaWNvbiIpLG0oMywiYWRkIikscygpLGMoNCwic3BhbiIpLG0oNSksYig2LCJ0cmFuc2xhdGUiKSxzKCkoKSgpKSx0JjImJihsKDUpLEEoQyg2LDEsIkFERF9ORVdfQUREUkVTUyIpKSl9ZnVuY3Rpb24gYkYodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImJ1dHRvbiIsMjMpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpO3JldHVybiBUKGEuY2hvb3NlQWRkcmVzcygpKX0pLGMoMSwibWF0LWljb24iKSxtKDIsIm5hdmlnYXRlX25leHQiKSxzKCksYygzLCJzcGFuIiwyNCksbSg0KSxiKDUsInRyYW5zbGF0ZSIpLHMoKSgpfWlmKHQmMil7bGV0IGU9digpO2YoImRpc2FibGVkIixlLmFkZHJlc3NJZD09PXZvaWQgMCksbCg0KSxBKEMoNSwyLCJMQUJFTF9DT05USU5VRSIpKX19dmFyIENvLHBzPXgoKCk9PntrKCk7aXIoKTtNMigpO1l0KCk7U2EoKTtXKCk7cDEoKTtKMSgpO3FuKCk7dmUoKTtuZSgpO0duKCk7aGUoKTtrKCk7aGUoKTtXKCk7bmUoKTt2ZSgpO0xlLmFkZChHcixXcik7Q289KCgpPT57Y2xhc3MgdHthZGRyZXNzU2VydmljZT1oKGsyKTt0cmFuc2xhdGU9aChJdCk7cm91dGVyPWgoeXQpO25nWm9uZT1oKHJlKTtzbmFja0JhckhlbHBlclNlcnZpY2U9aChWdCk7ZW1pdFNlbGVjdGlvbj1uZXcgTjthbGxvd0VkaXQ9ITE7YWRkTmV3QWRkcmVzc0Rpdj0hMDtzaG93TmV4dEJ1dHRvbj0hMTthZGRyZXNzSWQ9dm9pZCAwO2Rpc3BsYXllZENvbHVtbnM9WyJOYW1lIiwiQWRkcmVzcyIsIkNvdW50cnkiXTtzZWxlY3Rpb249bmV3IGthKCExLFtdKTtzdG9yZWRBZGRyZXNzZXM7ZGF0YVNvdXJjZTtjb25maXJtYXRpb247ZXJyb3I7YWRkcmVzc0V4aXN0PSExO25nT25Jbml0KCl7dGhpcy5hbGxvd0VkaXQ/dGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goIkVkaXQiLCJSZW1vdmUiKTp0aGlzLmRpc3BsYXllZENvbHVtbnMudW5zaGlmdCgiU2VsZWN0aW9uIiksdGhpcy5sb2FkKCl9bG9hZCgpe3RoaXMuYWRkcmVzc1NlcnZpY2UuZ2V0KCkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLmFkZHJlc3NFeGlzdD1lLmxlbmd0aCx0aGlzLnN0b3JlZEFkZHJlc3Nlcz1lLHRoaXMuZGF0YVNvdXJjZT1uZXcgSTEodGhpcy5zdG9yZWRBZGRyZXNzZXMpfSxlcnJvcjplPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihlLmVycm9yPy5lcnJvciwiZXJyb3JCYXIiKSxjb25zb2xlLmxvZyhlKX19KX1lbWl0U2VsZWN0aW9uVG9QYXJlbnQoZSl7dGhpcy5zZWxlY3Rpb24uaGFzVmFsdWUoKT8odGhpcy5lbWl0U2VsZWN0aW9uLmVtaXQoZSksdGhpcy5hZGRyZXNzSWQ9ZSk6KHRoaXMuZW1pdFNlbGVjdGlvbi5lbWl0KHZvaWQgMCksdGhpcy5hZGRyZXNzSWQ9dm9pZCAwKX1jaG9vc2VBZGRyZXNzKCl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgiYWRkcmVzc0lkIix0aGlzLmFkZHJlc3NJZCksdGhpcy5uZ1pvbmUucnVuKCgpPT5QZSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMucm91dGVyLm5hdmlnYXRlKFsiL2RlbGl2ZXJ5LW1ldGhvZCJdKX0pKX1kZWxldGVBZGRyZXNzKGUpe3RoaXMuYWRkcmVzc1NlcnZpY2UuZGVsKGUpLnN1YnNjcmliZSh7bmV4dDooKT0+e3RoaXMuZXJyb3I9bnVsbCx0aGlzLnRyYW5zbGF0ZS5nZXQoIkFERFJFU1NfUkVNT1ZFRCIpLnN1YnNjcmliZSh7bmV4dDppPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihpLCJjb25maXJtQmFyIil9LGVycm9yOmk9Pnt0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKGksImNvbmZpcm1CYXIiKX19KSx0aGlzLmxvYWQoKX0sZXJyb3I6aT0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oaS5lcnJvcj8uZXJyb3IsImVycm9yQmFyIiksY29uc29sZS5sb2coaSl9fSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLWFkZHJlc3MiXV0saW5wdXRzOnthbGxvd0VkaXQ6ImFsbG93RWRpdCIsYWRkTmV3QWRkcmVzc0RpdjoiYWRkTmV3QWRkcmVzc0RpdiIsc2hvd05leHRCdXR0b246InNob3dOZXh0QnV0dG9uIn0sb3V0cHV0czp7ZW1pdFNlbGVjdGlvbjoiZW1pdFNlbGVjdGlvbiJ9LGRlY2xzOjcsdmFyczo2LGNvbnN0czpbWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1lbGV2YXRpb24tejYiXSxbMSwibWRjLWNhcmQiXSxbMSwiYWRkcmVzcy10YWJsZSIsMywiZGF0YVNvdXJjZSJdLFsxLCJhZGQtbmV3LWFkZHJlc3MiXSxbIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwibWF0LWJ1dHRvbiIsIiIsImNvbG9yIiwicHJpbWFyeSIsImFyaWEtbGFiZWwiLCJQcm9jZWVkIHRvIHBheW1lbnQgc2VsZWN0aW9uIiwxLCJidG4iLCJidG4tbmV4dCIsMywiZGlzYWJsZWQiXSxbIm1hdENvbHVtbkRlZiIsIlNlbGVjdGlvbiJdLFsiY2xhc3MiLCJoZWFkZXItaGlkZGVuIiw0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWzQsIm1hdENlbGxEZWYiXSxbIm1hdENvbHVtbkRlZiIsIk5hbWUiXSxbIm1hdENvbHVtbkRlZiIsIkFkZHJlc3MiXSxbIm1hdENvbHVtbkRlZiIsIkNvdW50cnkiXSxbIm1hdENvbHVtbkRlZiIsIkVkaXQiXSxbIm1hdENvbHVtbkRlZiIsIlJlbW92ZSJdLFs0LCJtYXRIZWFkZXJSb3dEZWYiXSxbMywiY2xpY2siLDQsIm1hdFJvd0RlZiIsIm1hdFJvd0RlZkNvbHVtbnMiXSxbMSwiaGVhZGVyLWhpZGRlbiJdLFszLCJjbGljayIsImNoYW5nZSIsImNoZWNrZWQiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsMywicm91dGVyTGluayJdLFsxLCJmYXIiLCJmYS1lZGl0Il0sWyJtYXQtaWNvbi1idXR0b24iLCIiLDMsImNsaWNrIl0sWzEsImZhciIsImZhLXRyYXNoLWFsdCJdLFszLCJjbGljayJdLFsibWF0LXJhaXNlZC1idXR0b24iLCIiLCJtYXQtYnV0dG9uIiwiIiwiY29sb3IiLCJwcmltYXJ5IiwiYXJpYS1sYWJlbCIsIkFkZCBhIG5ldyBhZGRyZXNzIiwicm91dGVyTGluayIsIi9hZGRyZXNzL2NyZWF0ZSIsMSwiYnRuIiwiYnRuLW5ldy1hZGRyZXNzIl0sWyJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsIm1hdC1idXR0b24iLCIiLCJjb2xvciIsInByaW1hcnkiLCJhcmlhLWxhYmVsIiwiUHJvY2VlZCB0byBwYXltZW50IHNlbGVjdGlvbiIsMSwiYnRuIiwiYnRuLW5leHQiLDMsImNsaWNrIiwiZGlzYWJsZWQiXSxbInRyYW5zbGF0ZSIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwibWF0LWNhcmQiLDApKDEsImRpdiIsMSksTSgyLHRGLDMsMywiaDEiKSgzLGlGLDMsMywiaDEiKSxNKDQsdkYsMjEsMywibWF0LXRhYmxlIiwyKSxNKDUsX0YsNywzLCJkaXYiLDMpLE0oNixiRiw2LDQsImJ1dHRvbiIsNCkscygpKCkpLGkmMiYmKGllKCJkaXYtYm91bmRhcnkiLCFhLmFkZE5ld0FkZHJlc3NEaXYpLGwoMiksdyhhLnNob3dOZXh0QnV0dG9uPzI6MyksbCgyKSx3KGEuYWRkcmVzc0V4aXN0PzQ6LTEpLGwoKSx3KGEuYWRkTmV3QWRkcmVzc0Rpdj81Oi0xKSxsKCksdyhhLnNob3dOZXh0QnV0dG9uPzY6LTEpKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxZLFNlLHRpLG5pLGFpLHJpLGlpLG9pLEMyLGwxLG0yLGNpLGxpLHNpLGRpLG9lLGxlLGdlLENlLEtdLHN0eWxlczpbYC5idG4tbmV3LWFkZHJlc3NbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6YXV0b30uYnRuLW5leHRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6MDttYXJnaW4tdG9wOi0yLjVyZW19bWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVde21pbi1oZWlnaHQ6MCFpbXBvcnRhbnR9LmhlYWRpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMDM7Zm9udC1zaXplOngtbGFyZ2V9LmhlYWRpbmctdGV4dFtfbmdjb250ZW50LSVDT01QJV17anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOi42MjVyZW0gMS4yNXJlbX0uZGl2LWJvdW5kYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjMpO2JvcmRlci1yYWRpdXM6NXB4O2JveC1zaGFkb3c6MCAwIWltcG9ydGFudH0ubWRjLWNhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowfW1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tdGhlbWUtYmFja2dyb3VuZC1saWdodCk7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tdGhlbWUtYmFja2dyb3VuZC1saWdodCl9bWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MCFpbXBvcnRhbnR9LmhlYWRlci1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX1zdmdbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMi41cHh9LmFkZHJlc3MtdGFibGVbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9Lm1hdC1jb2x1bW4tU2VsZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jb2x1bW4tTmFtZVtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjAlfS5tYXQtY29sdW1uLUFkZHJlc3NbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjQwJX0ubWF0LWNvbHVtbi1Db3VudHJ5W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMCV9Lm1hdC1jb2x1bW4tRWRpdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY29sdW1uLVJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpyaWdodDt3aWR0aDo0OHB4fS5tYXQtY29sdW1uLUFkZHJlc3NbX25nY29udGVudC0lQ09NUCVde3dvcmQtYnJlYWs6YnJlYWstd29yZH0uYWRkLW5ldy1hZGRyZXNzW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOjEuMjVyZW19CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIHhGKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiLDgpLG0oMSksYigyLCJ0cmFuc2xhdGUiKSxzKCkpLHQmMiYmKGwoKSxFKCIgIixDKDIsMSwiTUFOREFUT1JZX1FVQU5USVRZIiksIiAiKSl9ZnVuY3Rpb24gTUYodCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIpLG0oMSksYigyLCJ0cmFuc2xhdGUiKSxzKCkpLHQmMiYmKGwoKSxFKCIgIixkdCgyLDEsIklOVkFMSURfUVVBTlRJVFkiLFN0KDQseUYpKSwiICIpKX1mdW5jdGlvbiB3Rih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYobCgpLEEoQygyLDEsIklOVkFMSURfREFURSIpKSl9ZnVuY3Rpb24gU0YodCxuKXtpZih0JjEmJihjKDAsIm1hdC1mb3JtLWZpZWxkIiwxMCkoMSwibWF0LWxhYmVsIiksbSgyKSxiKDMsInRyYW5zbGF0ZSIpLHMoKSx1KDQsImlucHV0IiwyMCkoNSwibWF0LWRhdGVwaWNrZXItdG9nZ2xlIiwyMSkoNiwibWF0LWRhdGVwaWNrZXIiLG51bGwsMSksTSg4LHdGLDMsMywibWF0LWVycm9yIikscygpKSx0JjIpe2xldCBlPXNlKDcpLGk9digpO2woMiksQShDKDMsNSwiTEFCRUxfUElDS1VQX0RBVEUiKSksbCgyKSxmKCJmb3JtQ29udHJvbCIsaS5waWNrVXBEYXRlQ29udHJvbCkoIm1hdERhdGVwaWNrZXIiLGUpLGwoKSxmKCJmb3IiLGUpLGwoMyksdyhpLnBpY2tVcERhdGVDb250cm9sLmludmFsaWQ/ODotMSl9fWZ1bmN0aW9uIGtGKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2hlY2tib3giLDExKSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjIpe2xldCBlPXYoKTtmKCJmb3JtQ29udHJvbCIsZS5waWNrdXApLGwoKSxBKEMoMiwyLCJSRVFVRVNUX1BJQ0tVUCIpKX19dmFyIENGLHlGLE9fLEhfPXgoKCk9PntLMSgpO0YxKCk7bTcoKTtrKCk7V2UoKTtZdCgpO3IxKCk7RGEoKTtwcygpO1coKTtKMSgpO25lKCk7SzMoKTtYOCgpO2V0KCk7SmUoKTtoZSgpO2soKTtoZSgpO1coKTtKZSgpO2V0KCk7V2UoKTtuZSgpO0NGPVsiYWRkcmVzc0NvbXAiXSx5Rj0oKT0+KHtyYW5nZToiMTAtMTAwMCJ9KTtMZS5hZGQobmEpO09fPSgoKT0+e2NsYXNzIHR7cmVjeWNsZVNlcnZpY2U9aChocyk7dXNlclNlcnZpY2U9aChBdCk7Y29uZmlndXJhdGlvblNlcnZpY2U9aChMdCk7Zm9ybVN1Ym1pdFNlcnZpY2U9aChUaSk7dHJhbnNsYXRlPWgoSXQpO3NuYWNrQmFySGVscGVyU2VydmljZT1oKFZ0KTthZGRyZXNzQ29tcG9uZW50O3JlcXVlc3RvckNvbnRyb2w9bmV3IGtlKHt2YWx1ZToiIixkaXNhYmxlZDohMH0sW10pO3JlY3ljbGVRdWFudGl0eUNvbnRyb2w9bmV3IGtlKCIiLFtKLnJlcXVpcmVkLEoubWluKDEwKSxKLm1heCgxZTMpXSk7cGlja1VwRGF0ZUNvbnRyb2w9bmV3IGtlO3BpY2t1cD1uZXcga2UoITEpO3RvcEltYWdlO2JvdHRvbUltYWdlO3JlY3ljbGVzO3JlY3ljbGU9e307dXNlckVtYWlsO2NvbmZpcm1hdGlvbjthZGRyZXNzSWQ9dm9pZCAwO25nT25Jbml0KCl7dGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5nZXRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb24oKS5zdWJzY3JpYmUoe25leHQ6ZT0+e2U/LmFwcGxpY2F0aW9uPy5yZWN5Y2xlUGFnZSYmKHRoaXMudG9wSW1hZ2U9YGFzc2V0cy9wdWJsaWMvaW1hZ2VzL3Byb2R1Y3RzLyR7ZS5hcHBsaWNhdGlvbi5yZWN5Y2xlUGFnZS50b3BQcm9kdWN0SW1hZ2V9YCx0aGlzLmJvdHRvbUltYWdlPWBhc3NldHMvcHVibGljL2ltYWdlcy9wcm9kdWN0cy8ke2UuYXBwbGljYXRpb24ucmVjeWNsZVBhZ2UuYm90dG9tUHJvZHVjdEltYWdlfWApfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSksdGhpcy5pbml0UmVjeWNsZSgpLHRoaXMuZmluZEFsbCgpLHRoaXMuZm9ybVN1Ym1pdFNlcnZpY2UuYXR0YWNoRW50ZXJLZXlIYW5kbGVyKCJyZWN5Y2xlLWZvcm0iLCJyZWN5Y2xlQnV0dG9uIiwoKT0+e3RoaXMuc2F2ZSgpfSl9aW5pdFJlY3ljbGUoKXt0aGlzLnVzZXJTZXJ2aWNlLndob0FtSShbImlkIiwiZW1haWwiXSkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLnJlY3ljbGU9e30sdGhpcy5yZWN5Y2xlLlVzZXJJZD1lLmlkLHRoaXMudXNlckVtYWlsPWUuZW1haWwsdGhpcy5yZXF1ZXN0b3JDb250cm9sLnNldFZhbHVlKHRoaXMudXNlckVtYWlsKX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfXNhdmUoKXt0aGlzLnJlY3ljbGUuQWRkcmVzc0lkPXRoaXMuYWRkcmVzc0lkLHRoaXMucmVjeWNsZS5xdWFudGl0eT10aGlzLnJlY3ljbGVRdWFudGl0eUNvbnRyb2wudmFsdWUsdGhpcy5waWNrdXAudmFsdWUmJih0aGlzLnJlY3ljbGUuaXNQaWNrVXA9dGhpcy5waWNrdXAudmFsdWUsdGhpcy5yZWN5Y2xlLmRhdGU9dGhpcy5waWNrVXBEYXRlQ29udHJvbC52YWx1ZSksdGhpcy5yZWN5Y2xlU2VydmljZS5zYXZlKHRoaXMucmVjeWNsZSkuc3Vic2NyaWJlKHtuZXh0OmU9PntlLmlzUGlja3VwP3RoaXMudHJhbnNsYXRlLmdldCgiQ09ORklSTV9SRUNZQ0xJTkdfUElDS1VQIix7cGlja3VwZGF0ZTplLnBpY2t1cERhdGV9KS5zdWJzY3JpYmUoe25leHQ6aT0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oaSwiY29uZmlybUJhciIpfSxlcnJvcjppPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihpLCJjb25maXJtQmFyIil9fSk6dGhpcy50cmFuc2xhdGUuZ2V0KCJDT05GSVJNX1JFQ1lDTElOR19CT1giKS5zdWJzY3JpYmUoe25leHQ6aT0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oaSwiY29uZmlybUJhciIpfSxlcnJvcjppPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihpLCJjb25maXJtQmFyIil9fSksdGhpcy5hZGRyZXNzQ29tcG9uZW50LmxvYWQoKSx0aGlzLmluaXRSZWN5Y2xlKCksdGhpcy5yZXNldEZvcm0oKX0sZXJyb3I6ZT0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oZS5lcnJvcj8uZXJyb3IsImVycm9yQmFyIiksY29uc29sZS5sb2coZSl9fSl9ZmluZEFsbCgpe3RoaXMucmVjeWNsZVNlcnZpY2UuZmluZCgpLnN1YnNjcmliZSh7bmV4dDplPT57dGhpcy5yZWN5Y2xlcz1lfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSl9cmVzZXRGb3JtKCl7dGhpcy5hZGRyZXNzSWQ9dm9pZCAwLHRoaXMucmVjeWNsZVF1YW50aXR5Q29udHJvbC5zZXRWYWx1ZSgiIiksdGhpcy5yZWN5Y2xlUXVhbnRpdHlDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5yZWN5Y2xlUXVhbnRpdHlDb250cm9sLm1hcmtBc1VudG91Y2hlZCgpLHRoaXMucGlja1VwRGF0ZUNvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMucGlja1VwRGF0ZUNvbnRyb2wubWFya0FzUHJpc3RpbmUoKSx0aGlzLnBpY2tVcERhdGVDb250cm9sLm1hcmtBc1VudG91Y2hlZCgpLHRoaXMucGlja3VwLnNldFZhbHVlKCExKX1nZXRNZXNzYWdlKGUpe3RoaXMuYWRkcmVzc0lkPWV9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLXJlY3ljbGUiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uKGksYSl7aWYoaSYxJiZ0ZShDRiw3KSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5hZGRyZXNzQ29tcG9uZW50PXIuZmlyc3QpfX0sZGVjbHM6NDUsdmFyczoyOCxjb25zdHM6W1siYWRkcmVzc0NvbXAiLCIiXSxbInBpY2tlciIsIiJdLFsxLCJtYXQtZWxldmF0aW9uLXo2IiwibWF0LW93bi1jYXJkIiwicmVjeWNsZS1jb250YWluZXIiXSxbMSwibGVmdC1jb250YWluZXIiLCJmbGV4LTUwIl0sWyJpZCIsInJlY3ljbGUtZm9ybSIsMSwiZm9ybS1jb250YWluZXIiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lIiwiY29sb3IiLCJhY2NlbnQiXSxbInR5cGUiLCJ0ZXh0IiwibWF0SW5wdXQiLCIiLDMsImZvcm1Db250cm9sIl0sWyJ0eXBlIiwibnVtYmVyIiwibWF0SW5wdXQiLCIiLDMsImZvcm1Db250cm9sIiwicGxhY2Vob2xkZXIiXSxbInRyYW5zbGF0ZSIsIiJdLFsxLCJtYXQtZWxldmF0aW9uLXowIiwzLCJlbWl0U2VsZWN0aW9uIiwiYWRkTmV3QWRkcmVzc0RpdiJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmUiXSxbMywiZm9ybUNvbnRyb2wiXSxbInR5cGUiLCJzdWJtaXQiLCJpZCIsInJlY3ljbGVCdXR0b24iLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsImNvbG9yIiwicHJpbWFyeSIsMywiY2xpY2siLCJkaXNhYmxlZCJdLFsxLCJmYXMiLCJmYS1wYXBlci1wbGFuZSIsImZhLWxnIl0sWzEsInJpZ2h0LWNvbnRhaW5lciIsImZsZXgtNTAiXSxbMSwicmlnaHQtaW5uZXIiXSxbMSwicmVzcG9uc2liaWxpdHktaGVhZGVyIl0sWzEsIm1hdC1lbGV2YXRpb24tejAiLCJjYXJkLXJvdyJdLFsibWF0LWNhcmQtaW1hZ2UiLCIiLDMsInNyYyJdLFsxLCJmaWxsLXJlbWFpbmluZy1zcGFjZSJdLFsibWF0SW5wdXQiLCIiLDMsImZvcm1Db250cm9sIiwibWF0RGF0ZXBpY2tlciJdLFsibWF0U3VmZml4IiwiIiwzLCJmb3IiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtjKDAsIm1hdC1jYXJkIiwyKSgxLCJkaXYiLDMpKDIsImgxIiksbSgzKSxiKDQsInRyYW5zbGF0ZSIpLHMoKSxjKDUsImRpdiIsNCkoNiwibWF0LWZvcm0tZmllbGQiLDUpKDcsIm1hdC1sYWJlbCIpLG0oOCksYig5LCJ0cmFuc2xhdGUiKSxzKCksdSgxMCwiaW5wdXQiLDYpLHMoKSxjKDExLCJtYXQtZm9ybS1maWVsZCIsNSkoMTIsIm1hdC1sYWJlbCIpLG0oMTMpLGIoMTQsInRyYW5zbGF0ZSIpLHMoKSx1KDE1LCJpbnB1dCIsNyksYigxNiwidHJhbnNsYXRlIiksTSgxNyx4RiwzLDMsIm1hdC1lcnJvciIsOCksTSgxOCxNRiwzLDUsIm1hdC1lcnJvciIpLHMoKSxjKDE5LCJhcHAtYWRkcmVzcyIsOSwwKSxTKCJlbWl0U2VsZWN0aW9uIixmdW5jdGlvbihkKXtyZXR1cm4geihyKSxUKGEuZ2V0TWVzc2FnZShkKSl9KSxzKCksTSgyMSxTRiw5LDcsIm1hdC1mb3JtLWZpZWxkIiwxMCksTSgyMixrRiwzLDQsIm1hdC1jaGVja2JveCIsMTEpLHMoKSxjKDIzLCJidXR0b24iLDEyKSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuc2F2ZSgpKX0pLHUoMjQsImkiLDEzKSxtKDI1KSxiKDI2LCJ0cmFuc2xhdGUiKSxzKCkoKSxjKDI3LCJkaXYiLDE0KSgyOCwiZGl2IiwxNSkoMjksImgzIiwxNiksbSgzMCksYigzMSwidHJhbnNsYXRlIikscygpLGMoMzIsIm1hdC1jYXJkIiwxNyksdSgzMywiaW1nIiwxOCksYygzNCwibWF0LWNhcmQtY29udGVudCIpKDM1LCJkaXYiKSgzNiwic21hbGwiKSxtKDM3LCJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2V0ZXR1ciBzYWRpcHNjaW5nIGVsaXRyLCBzZWQgZGlhbSBub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtIHZvbHVwdHVhLiBBdCB2ZXJvIGVvcyBldCBhY2N1c2FtIGV0IGp1c3RvIGR1byBkb2xvcmVzIGV0IGVhIHJlYnVtLiAiKSxzKCkoKSgpKCksYygzOCwibWF0LWNhcmQiLDE3KSx1KDM5LCJpbWciLDE4KSxjKDQwLCJtYXQtY2FyZC1jb250ZW50IikoNDEsImRpdiIpKDQyLCJzbWFsbCIpLG0oNDMsIlN0ZXQgY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNldGV0dXIgc2FkaXBzY2luZyBlbGl0ciwgc2VkIGRpYW0gbm9udW15IGVpcm1vZCB0ZW1wb3IgaW52aWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdXlhbSBlcmF0LCBzZWQgZGlhbSB2b2x1cHR1YS4gIikscygpKCkoKSgpLHUoNDQsInNwYW4iLDE5KSxzKCkoKSgpfWkmMiYmKGwoMyksQShDKDQsMTYsIlRJVExFX1JFQ1lDTEUiKSksbCg1KSxBKEMoOSwxOCwiTEFCRUxfUkVRVUVTVE9SIikpLGwoMiksZigiZm9ybUNvbnRyb2wiLGEucmVxdWVzdG9yQ29udHJvbCksbCgzKSxBKEMoMTQsMjAsIkxBQkVMX1FVQU5USVRZIikpLGwoMiksZigiZm9ybUNvbnRyb2wiLGEucmVjeWNsZVF1YW50aXR5Q29udHJvbCkoInBsYWNlaG9sZGVyIixDKDE2LDIyLCJJTl9MSVRFUlNfUExBQ0VIT0xERVIiKSksbCgyKSx3KGEucmVjeWNsZVF1YW50aXR5Q29udHJvbC5pbnZhbGlkJiZhLnJlY3ljbGVRdWFudGl0eUNvbnRyb2wuZXJyb3JzLnJlcXVpcmVkPzE3Oi0xKSxsKCksdyhhLnJlY3ljbGVRdWFudGl0eUNvbnRyb2wuaW52YWxpZCYmKGEucmVjeWNsZVF1YW50aXR5Q29udHJvbC5lcnJvcnMubWlufHxhLnJlY3ljbGVRdWFudGl0eUNvbnRyb2wuZXJyb3JzLm1heCk/MTg6LTEpLGwoKSxmKCJhZGROZXdBZGRyZXNzRGl2IiwhMSksbCgyKSx3KGEucGlja3VwLnZhbHVlJiZhLnJlY3ljbGVRdWFudGl0eUNvbnRyb2wudmFsdWU+MTAwPzIxOi0xKSxsKCksdyhhLnJlY3ljbGVRdWFudGl0eUNvbnRyb2wudmFsdWU+MTAwPzIyOi0xKSxsKCksZigiZGlzYWJsZWQiLGEuYWRkcmVzc0lkPT09dm9pZCAwfHxhLnJlY3ljbGVRdWFudGl0eUNvbnRyb2wuaW52YWxpZHx8YS5waWNrVXBEYXRlQ29udHJvbC5pbnZhbGlkKSxsKDIpLEUoIiAiLEMoMjYsMjQsIkJUTl9TVUJNSVQiKSwiICIpLGwoNSksQShDKDMxLDI2LCJTRUNUSU9OX1BSRVNTX0pVSUNFX1JFU1BPTlNJQkxZIikpLGwoMyksZigic3JjIixhLnRvcEltYWdlLHd0KSxsKDYpLGYoInNyYyIsYS5ib3R0b21JbWFnZSx3dCkpfSxkZXBlbmRlbmNpZXM6W2RlLHBlLHAyLEEwLFksU2UsUWUsWmUsaHQsUXQsdjIsJGUsbnQsYXQsZ3QsUWEsbXQsenQsZTEsQ28sJDMsSzgsZ2csazQsb2UsbGUsS10sc3R5bGVzOltgbWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctdG9wOi42MjVyZW19LmZvcm0tY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3Bvc2l0aW9uOnJlbGF0aXZlfWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MjAlO21hcmdpbi10b3A6LjI1cmVtO3dpZHRoOjYwJX0ubWF0LW93bi1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO21hcmdpbi1sZWZ0OjEwJTttYXJnaW4tcmlnaHQ6MTAlfW1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGltZ1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMHB4O21hcmdpbi1sZWZ0OjFyZW0haW1wb3J0YW50O21hcmdpbi1yaWdodDouMTI1cmVtIWltcG9ydGFudH0ucmVzcG9uc2liaWxpdHktaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDoxcmVtO21hcmdpbi10b3A6LjYyNXJlbX0jcmVjeWNsZS1mb3JtW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDoxcmVtO21hcmdpbi1yaWdodDoxcmVtfSAgLm1hdC1tZGMtcm93Lm1kYy1kYXRhLXRhYmxlX19yb3d7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tdGhlbWUtYmFja2dyb3VuZC1saWdodCkhaW1wb3J0YW50O2JvcmRlci10b3A6MXB4IHNvbGlkIHZhcigtLXRoZW1lLWJhY2tncm91bmQtbGlnaHQpIWltcG9ydGFudH1oMVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MXJlbTttYXJnaW4tdG9wOi42MjVyZW19Lm1hdC1tZGMtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tcmlnaHQ6MS4yNXJlbX0ubGVmdC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjEuMjVyZW07bWFyZ2luLWJvdHRvbToxLjI1cmVtIWltcG9ydGFudH0uZmlsbC1yZW1haW5pbmctc3BhY2VbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIGF1dG99LnJlY3ljbGUtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93fS5mbGV4LTUwW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMCA1MCU7bWF4LXdpZHRoOjUwJX1AbWVkaWEgKG1heC13aWR0aDogOTU5Ljk4cHgpey5yZWN5Y2xlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoxLjI1cmVtfS5mbGV4LTUwW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMCAxMDAlO21heC13aWR0aDoxMDAlfX0ucmlnaHQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoxLjI1cmVtfS5yaWdodC1pbm5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjEuMjVyZW19LmNhcmQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7Z2FwOjEuMjVyZW19CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO3ZhciBmcyxoNz14KCgpPT57aygpO1d0KCk7bHQoKTtOdCgpO2soKTtmcz0oKCk9PntjbGFzcyB0e2h0dHA9aChBZSk7dmVyaWZ5KGUpe3JldHVybiB0aGlzLmh0dHAucG9zdChgJHt1ZS5ob3N0U2VydmVyfS9yZXN0LzJmYS92ZXJpZnlgLHt0bXBUb2tlbjpsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidG90cF90bXBfdG9rZW4iKSx0b3RwVG9rZW46ZX0pLnBpcGUocShpPT5pLmF1dGhlbnRpY2F0aW9uKSxqKGk9Pnt0aHJvdyBpfSkpfXN0YXR1cygpe3JldHVybiB0aGlzLmh0dHAuZ2V0KGAke3VlLmhvc3RTZXJ2ZXJ9L3Jlc3QvMmZhL3N0YXR1c2ApLnBpcGUocShlPT5lKSxqKGU9Pnt0aHJvdyBlfSkpfXNldHVwKGUsaSxhKXtyZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dWUuaG9zdFNlcnZlcn0vcmVzdC8yZmEvc2V0dXBgLHtwYXNzd29yZDplLHNldHVwVG9rZW46YSxpbml0aWFsVG9rZW46aX0pLnBpcGUocSgoKT0+e30pLGoocj0+e3Rocm93IHJ9KSl9ZGlzYWJsZShlKXtyZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dWUuaG9zdFNlcnZlcn0vcmVzdC8yZmEvZGlzYWJsZWAse3Bhc3N3b3JkOmV9KS5waXBlKHEoKCk9Pnt9KSxqKGk9Pnt0aHJvdyBpfSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gekYodCxuKXt0JjEmJihjKDAsImRpdiIsNSksbSgxLCJJTlZBTElEX1RXT19GQUNUT1JfQVVUSF9UT0tFTiIpLHMoKSl9dmFyIE5fLFJfPXgoKCk9PntrKCk7V2UoKTtoNygpO3dpKCk7RjEoKTtwMSgpO1l0KCk7cjEoKTtuZSgpO3ZpKCk7dmUoKTtldCgpO0plKCk7VygpO2hlKCk7aygpO2hlKCk7VygpO1dlKCk7SmUoKTtldCgpO3ZlKCk7bmUoKTtMZS5hZGQoXzMpO05fPSgoKT0+e2NsYXNzIHR7dHdvRmFjdG9yQXV0aFNlcnZpY2U9aChmcyk7Y29va2llU2VydmljZT1oKFp0KTt1c2VyU2VydmljZT1oKEF0KTtyb3V0ZXI9aCh5dCk7bmdab25lPWgocmUpO3R3b0ZhY3RvckZvcm09bmV3IFZuKHt0b2tlbjpuZXcga2UoIiIsW0oubWluTGVuZ3RoKDYpLEoubWF4TGVuZ3RoKDYpLEoucmVxdWlyZWQsSi5wYXR0ZXJuKCJeW1xcZF17Nn0kIildKX0pO2Vycm9yZWQ9ITE7dmVyaWZ5KCl7bGV0IGU9dGhpcy50d29GYWN0b3JGb3JtLnZhbHVlO3RoaXMudHdvRmFjdG9yQXV0aFNlcnZpY2UudmVyaWZ5KGUudG9rZW4pLnN1YnNjcmliZSh7bmV4dDppPT57bG9jYWxTdG9yYWdlLnNldEl0ZW0oInRva2VuIixpLnRva2VuKTtsZXQgYT1uZXcgRGF0ZTthLnNldEhvdXJzKGEuZ2V0SG91cnMoKSs4KSx0aGlzLmNvb2tpZVNlcnZpY2UucHV0KCJ0b2tlbiIsaS50b2tlbix7ZXhwaXJlczphfSksc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgiYmlkIixpLmJpZD8udG9TdHJpbmcoKSksdGhpcy51c2VyU2VydmljZS5pc0xvZ2dlZEluLm5leHQoITApLHRoaXMubmdab25lLnJ1bigoKT0+UGUodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbIi9zZWFyY2giXSl9KSl9LGVycm9yOmk9Pih0aGlzLmVycm9yZWQ9ITAsc2V0VGltZW91dCgoKT0+e3RoaXMuZXJyb3JlZD0hMX0sNSoxZTMpLGkpfSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLXR3by1mYWN0b3ItYXV0aC1lbnRlciJdXSxkZWNsczoyOCx2YXJzOjE1LGNvbnN0czpbWyJ0b2tlbklucHV0IiwiIl0sWzEsImNlbnRlci1jb250YWluZXIiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwibWF0LWVsZXZhdGlvbi16NiJdLFsxLCJtZGMtY2FyZCJdLFsidHJhbnNsYXRlIiwiIl0sWyJ0cmFuc2xhdGUiLCIiLDEsImVycm9yIiwidHdvLWZhY3Rvci1lcnJvciJdLFszLCJuZ1N1Ym1pdCIsImZvcm1Hcm91cCJdLFsxLCJmb3JtLWNvbnRhaW5lciJdLFsiaWQiLCJpbnB1dFRva2VuIiwiYXBwZWFyYW5jZSIsIm91dGxpbmUiLCJjb2xvciIsImFjY2VudCJdLFsiZm9ybUNvbnRyb2xOYW1lIiwidG9rZW4iLCJ0eXBlIiwidGV4dCIsIm1pbmxlbmd0aCIsIjYiLCJtYXhsZW5ndGgiLCI2IiwicGF0dGVybiIsIl5bXFxkXXs2fSQiLCJtYXRJbnB1dCIsIiIsImlkIiwidG90cFRva2VuIiwiYXJpYS1sYWJlbCIsIkZpZWxkIGZvciBlbnRlcmluZyB0aGUgVHdvIEZhY3RvciB0b2tlbiIsMywicGxhY2Vob2xkZXIiXSxbIm1hdFN1ZmZpeCIsIiIsIm1hdFRvb2x0aXBQb3NpdGlvbiIsInJpZ2h0IiwiYXJpYS1sYWJlbCIsIlRoZSBjb2RlIHRvIGJlIGVudGVyZWQgZnJvbSB0aGUgYXV0aGVudGljYXRvciBtdXN0IGhhdmUgNiBkaWdpdHMuIiwzLCJtYXRUb29sdGlwIl0sWyJhbGlnbiIsImVuZCJdLFsidHlwZSIsInN1Ym1pdCIsImNvbG9yIiwicHJpbWFyeSIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiaWQiLCJ0b3RwU3VibWl0QnV0dG9uIiwiYXJpYS1sYWJlbCIsIkJ1dHRvbiB0byBjb25maXJtIHRoZSBpbnB1dCIsMywiZGlzYWJsZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtjKDAsImRpdiIsMSkoMSwibWF0LWNhcmQiLDIpKDIsImRpdiIsMykoMywiaDEiLDQpLG0oNCwiVElUTEVfVFdPX0ZBQ1RPUl9BVVRIRU5USUNBVElPTiIpLHMoKSxjKDUsInAiLDQpLG0oNiwiVElUTEVfVFdPX0ZBQ1RPUl9BVVRIX0VOVEVSIikscygpLE0oNyx6RiwyLDAsImRpdiIsNSksYyg4LCJmb3JtIiw2KSxTKCJuZ1N1Ym1pdCIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEudmVyaWZ5KCkpfSksYyg5LCJkaXYiLDcpKDEwLCJtYXQtZm9ybS1maWVsZCIsOCkoMTEsIm1hdC1sYWJlbCIsNCksbSgxMiwiTEFCRUxfVFdPX0ZBQ1RPUl9BVVRIX1RPS0VOIikscygpLHUoMTMsImlucHV0Iiw5LDApLGIoMTUsInRyYW5zbGF0ZSIpLGMoMTYsIm1hdC1pY29uIiwxMCksYigxNywidHJhbnNsYXRlIiksbSgxOCwiIGhlbHBfb3V0bGluZSAiKSxzKCksYygxOSwibWF0LWhpbnQiLDExKSxtKDIwKSxzKCksYygyMSwibWF0LWVycm9yIiw0KSxtKDIyLCJJTlZBTElEX1RXT19GQUNUT1JfQVVUSF9UT0tFTiIpLHMoKSgpKCksYygyMywiYnV0dG9uIiwxMikoMjQsIm1hdC1pY29uIiksbSgyNSwibG9ja19vcGVuIikscygpLG0oMjYpLGIoMjcsInRyYW5zbGF0ZSIpLHMoKSgpKCkoKSgpfWlmKGkmMil7bGV0IHI9c2UoMTQpO2woNyksdyhhLmVycm9yZWQ/NzotMSksbCgpLGYoImZvcm1Hcm91cCIsYS50d29GYWN0b3JGb3JtKSxsKDUpLGYoInBsYWNlaG9sZGVyIixWZShDKDE1LDksIjJGQV9FTlRFUl9DT0RFX1BMQUNFSE9MREVSIikpKSxsKDMpLGYoIm1hdFRvb2x0aXAiLFZlKEMoMTcsMTEsIklOSVRJQUxfVE9LRU5fVE9PTFRJUCIpKSksbCg0KSxFKCIiLChyLnZhbHVlPT1udWxsP251bGw6ci52YWx1ZS5sZW5ndGgpfHwwLCIvNiIpLGwoMyksZigiZGlzYWJsZWQiLGEudHdvRmFjdG9yRm9ybS5pbnZhbGlkKSxsKDMpLEUoIiAiLEMoMjcsMTMsIkJUTl9MT0dJTiIpLCIgIil9fSxkZXBlbmRlbmNpZXM6W2RlLHBlLFksU2UsYXQsZzIsZ3QsbXQsdTIsTDAsTWksenIsenQsYmEsU3IsUWUsWmUsaHQsZjEsUXQsdjIsJGUsbnQsZ2UsQ2UsUnQsb2UsbGUsS10sc3R5bGVzOltgbWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDphdXRvO21pbi13aWR0aDozMjBweDt3aWR0aDoyNSV9I3RvdHBTdWJtaXRCdXR0b25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tdG9wOjJyZW07d2lkdGg6NjAlfSNpbnB1dFRva2VuW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5jZW50ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpzdHJldGNoO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS50d28tZmFjdG9yLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOi42MjVyZW19CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO3ZhciBGXyxCXz14KCgpPT57VygpO2soKTtwMSgpO1l0KCk7cjEoKTtoZSgpO2soKTtoZSgpO0xlLmFkZChUZixZcCk7Rl89KCgpPT57Y2xhc3MgdHtyb3V0ZT1oKCQxKTt0cmFuc2xhdGU9aChJdCk7ZXJyb3I9bnVsbDtuZ09uSW5pdCgpe2xldCBlPXRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuZXJyb3I7ZSYmdGhpcy50cmFuc2xhdGUuZ2V0KGUpLnN1YnNjcmliZSh7bmV4dDppPT57dGhpcy5lcnJvcj1pfSxlcnJvcjppPT57dGhpcy5lcnJvcj1pfX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1lcnJvci1wYWdlIl1dLGRlY2xzOjcsdmFyczoxLGNvbnN0czpbWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIndhcm4tbm90aWZpY2F0aW9uIiwibWF0LWVsZXZhdGlvbi16NiJdLFsxLCJtZGMtY2FyZCJdLFsxLCJtYXQtaGVhZGxpbmUtMiJdLFsxLCJmYXMiLCJmYS1oYW5kLXBhcGVyIl0sWzEsIm1hdC1zdWJ0aXRsZS0xIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYXQtY2FyZCIsMCkoMSwiZGl2IiwxKSgyLCJkaXYiLDIpLHUoMywiaSIsMyksbSg0LCIgNDAzIikscygpLGMoNSwic3BhbiIsNCksbSg2KSxzKCkoKSgpKSxpJjImJihsKDYpLEEoYS5lcnJvcikpfSxkZXBlbmRlbmNpZXM6W2RlLHBlXSxzdHlsZXM6W2BtYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MjAlO21hcmdpbi1yaWdodDoyMCV9CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO3ZhciBVXyxqXz14KCgpPT57cDEoKTtrKCk7VV89KCgpPT57Y2xhc3MgdHtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtcHJpdmFjeS1zZWN1cml0eSJdXSxkZWNsczoxLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmdSgwLCJyb3V0ZXItb3V0bGV0Iil9LGRlcGVuZGVuY2llczpbeTBdLGVuY2Fwc3VsYXRpb246Mn0pfXJldHVybiB0fSkoKX0pO3ZhciBHXz1UZSgoTjllLHFfKT0+e3FfLmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiImJlByb21pc2UucHJvdG90eXBlJiZQcm9taXNlLnByb3RvdHlwZS50aGVufX0pO3ZhciBkbj1UZShhcj0+e3ZhciBwNyxURj1bMCwyNiw0NCw3MCwxMDAsMTM0LDE3MiwxOTYsMjQyLDI5MiwzNDYsNDA0LDQ2Niw1MzIsNTgxLDY1NSw3MzMsODE1LDkwMSw5OTEsMTA4NSwxMTU2LDEyNTgsMTM2NCwxNDc0LDE1ODgsMTcwNiwxODI4LDE5MjEsMjA1MSwyMTg1LDIzMjMsMjQ2NSwyNjExLDI3NjEsMjg3NiwzMDM0LDMxOTYsMzM2MiwzNTMyLDM3MDZdO2FyLmdldFN5bWJvbFNpemU9ZnVuY3Rpb24obil7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCcidmVyc2lvbiIgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkJyk7aWYobjwxfHxuPjQwKXRocm93IG5ldyBFcnJvcignInZlcnNpb24iIHNob3VsZCBiZSBpbiByYW5nZSBmcm9tIDEgdG8gNDAnKTtyZXR1cm4gbio0KzE3fTthci5nZXRTeW1ib2xUb3RhbENvZGV3b3Jkcz1mdW5jdGlvbihuKXtyZXR1cm4gVEZbbl19O2FyLmdldEJDSERpZ2l0PWZ1bmN0aW9uKHQpe2xldCBuPTA7Zm9yKDt0IT09MDspbisrLHQ+Pj49MTtyZXR1cm4gbn07YXIuc2V0VG9TSklTRnVuY3Rpb249ZnVuY3Rpb24obil7aWYodHlwZW9mIG4hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IEVycm9yKCcidG9TSklTRnVuYyIgaXMgbm90IGEgdmFsaWQgZnVuY3Rpb24uJyk7cDc9bn07YXIuaXNLYW5qaU1vZGVFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHR5cGVvZiBwNzwidSJ9O2FyLnRvU0pJUz1mdW5jdGlvbihuKXtyZXR1cm4gcDcobil9fSk7dmFyIHVzPVRlKHoyPT57ejIuTD17Yml0OjF9O3oyLk09e2JpdDowfTt6Mi5RPXtiaXQ6M307ejIuSD17Yml0OjJ9O2Z1bmN0aW9uIEVGKHQpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoIlBhcmFtIGlzIG5vdCBhIHN0cmluZyIpO3N3aXRjaCh0LnRvTG93ZXJDYXNlKCkpe2Nhc2UibCI6Y2FzZSJsb3ciOnJldHVybiB6Mi5MO2Nhc2UibSI6Y2FzZSJtZWRpdW0iOnJldHVybiB6Mi5NO2Nhc2UicSI6Y2FzZSJxdWFydGlsZSI6cmV0dXJuIHoyLlE7Y2FzZSJoIjpjYXNlImhpZ2giOnJldHVybiB6Mi5IO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIEVDIExldmVsOiAiK3QpfX16Mi5pc1ZhbGlkPWZ1bmN0aW9uKG4pe3JldHVybiBuJiZ0eXBlb2Ygbi5iaXQ8InUiJiZuLmJpdD49MCYmbi5iaXQ8NH07ejIuZnJvbT1mdW5jdGlvbihuLGUpe2lmKHoyLmlzVmFsaWQobikpcmV0dXJuIG47dHJ5e3JldHVybiBFRihuKX1jYXRjaHtyZXR1cm4gZX19fSk7dmFyIFlfPVRlKChCOWUsUV8pPT57ZnVuY3Rpb24gV18oKXt0aGlzLmJ1ZmZlcj1bXSx0aGlzLmxlbmd0aD0wfVdfLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKHQpe2xldCBuPU1hdGguZmxvb3IodC84KTtyZXR1cm4odGhpcy5idWZmZXJbbl0+Pj43LXQlOCYxKT09PTF9LHB1dDpmdW5jdGlvbih0LG4pe2ZvcihsZXQgZT0wO2U8bjtlKyspdGhpcy5wdXRCaXQoKHQ+Pj5uLWUtMSYxKT09PTEpfSxnZXRMZW5ndGhJbkJpdHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHB1dEJpdDpmdW5jdGlvbih0KXtsZXQgbj1NYXRoLmZsb29yKHRoaXMubGVuZ3RoLzgpO3RoaXMuYnVmZmVyLmxlbmd0aDw9biYmdGhpcy5idWZmZXIucHVzaCgwKSx0JiYodGhpcy5idWZmZXJbbl18PTEyOD4+PnRoaXMubGVuZ3RoJTgpLHRoaXMubGVuZ3RoKyt9fTtRXy5leHBvcnRzPVdffSk7dmFyICRfPVRlKChVOWUsWl8pPT57ZnVuY3Rpb24gRzQodCl7aWYoIXR8fHQ8MSl0aHJvdyBuZXcgRXJyb3IoIkJpdE1hdHJpeCBzaXplIG11c3QgYmUgZGVmaW5lZCBhbmQgZ3JlYXRlciB0aGFuIDAiKTt0aGlzLnNpemU9dCx0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkodCp0KSx0aGlzLnJlc2VydmVkQml0PW5ldyBVaW50OEFycmF5KHQqdCl9RzQucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LG4sZSxpKXtsZXQgYT10KnRoaXMuc2l6ZStuO3RoaXMuZGF0YVthXT1lLGkmJih0aGlzLnJlc2VydmVkQml0W2FdPSEwKX07RzQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmRhdGFbdCp0aGlzLnNpemUrbl19O0c0LnByb3RvdHlwZS54b3I9ZnVuY3Rpb24odCxuLGUpe3RoaXMuZGF0YVt0KnRoaXMuc2l6ZStuXV49ZX07RzQucHJvdG90eXBlLmlzUmVzZXJ2ZWQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5yZXNlcnZlZEJpdFt0KnRoaXMuc2l6ZStuXX07Wl8uZXhwb3J0cz1HNH0pO3ZhciBLXz1UZShncz0+e3ZhciBBRj1kbigpLmdldFN5bWJvbFNpemU7Z3MuZ2V0Um93Q29sQ29vcmRzPWZ1bmN0aW9uKG4pe2lmKG49PT0xKXJldHVybltdO2xldCBlPU1hdGguZmxvb3Iobi83KSsyLGk9QUYobiksYT1pPT09MTQ1PzI2Ok1hdGguY2VpbCgoaS0xMykvKDIqZS0yKSkqMixyPVtpLTddO2ZvcihsZXQgbz0xO288ZS0xO28rKylyW29dPXJbby0xXS1hO3JldHVybiByLnB1c2goNiksci5yZXZlcnNlKCl9O2dzLmdldFBvc2l0aW9ucz1mdW5jdGlvbihuKXtsZXQgZT1bXSxpPWdzLmdldFJvd0NvbENvb3JkcyhuKSxhPWkubGVuZ3RoO2ZvcihsZXQgcj0wO3I8YTtyKyspZm9yKGxldCBvPTA7bzxhO28rKylyPT09MCYmbz09PTB8fHI9PT0wJiZvPT09YS0xfHxyPT09YS0xJiZvPT09MHx8ZS5wdXNoKFtpW3JdLGlbb11dKTtyZXR1cm4gZX19KTt2YXIgZWI9VGUoSl89Pnt2YXIgREY9ZG4oKS5nZXRTeW1ib2xTaXplLFhfPTc7Sl8uZ2V0UG9zaXRpb25zPWZ1bmN0aW9uKG4pe2xldCBlPURGKG4pO3JldHVybltbMCwwXSxbZS1YXywwXSxbMCxlLVhfXV19fSk7dmFyIHRiPVRlKGcxPT57ZzEuUGF0dGVybnM9e1BBVFRFUk4wMDA6MCxQQVRURVJOMDAxOjEsUEFUVEVSTjAxMDoyLFBBVFRFUk4wMTE6MyxQQVRURVJOMTAwOjQsUEFUVEVSTjEwMTo1LFBBVFRFUk4xMTA6NixQQVRURVJOMTExOjd9O3ZhciBucj17TjE6MyxOMjozLE4zOjQwLE40OjEwfTtnMS5pc1ZhbGlkPWZ1bmN0aW9uKG4pe3JldHVybiBuIT1udWxsJiZuIT09IiImJiFpc05hTihuKSYmbj49MCYmbjw9N307ZzEuZnJvbT1mdW5jdGlvbihuKXtyZXR1cm4gZzEuaXNWYWxpZChuKT9wYXJzZUludChuLDEwKTp2b2lkIDB9O2cxLmdldFBlbmFsdHlOMT1mdW5jdGlvbihuKXtsZXQgZT1uLnNpemUsaT0wLGE9MCxyPTAsbz1udWxsLGQ9bnVsbDtmb3IobGV0IHA9MDtwPGU7cCsrKXthPXI9MCxvPWQ9bnVsbDtmb3IobGV0IGc9MDtnPGU7ZysrKXtsZXQgXz1uLmdldChwLGcpO189PT1vP2ErKzooYT49NSYmKGkrPW5yLk4xKyhhLTUpKSxvPV8sYT0xKSxfPW4uZ2V0KGcscCksXz09PWQ/cisrOihyPj01JiYoaSs9bnIuTjErKHItNSkpLGQ9XyxyPTEpfWE+PTUmJihpKz1uci5OMSsoYS01KSkscj49NSYmKGkrPW5yLk4xKyhyLTUpKX1yZXR1cm4gaX07ZzEuZ2V0UGVuYWx0eU4yPWZ1bmN0aW9uKG4pe2xldCBlPW4uc2l6ZSxpPTA7Zm9yKGxldCBhPTA7YTxlLTE7YSsrKWZvcihsZXQgcj0wO3I8ZS0xO3IrKyl7bGV0IG89bi5nZXQoYSxyKStuLmdldChhLHIrMSkrbi5nZXQoYSsxLHIpK24uZ2V0KGErMSxyKzEpOyhvPT09NHx8bz09PTApJiZpKyt9cmV0dXJuIGkqbnIuTjJ9O2cxLmdldFBlbmFsdHlOMz1mdW5jdGlvbihuKXtsZXQgZT1uLnNpemUsaT0wLGE9MCxyPTA7Zm9yKGxldCBvPTA7bzxlO28rKyl7YT1yPTA7Zm9yKGxldCBkPTA7ZDxlO2QrKylhPWE8PDEmMjA0N3xuLmdldChvLGQpLGQ+PTEwJiYoYT09PTE0ODh8fGE9PT05MykmJmkrKyxyPXI8PDEmMjA0N3xuLmdldChkLG8pLGQ+PTEwJiYocj09PTE0ODh8fHI9PT05MykmJmkrK31yZXR1cm4gaSpuci5OM307ZzEuZ2V0UGVuYWx0eU40PWZ1bmN0aW9uKG4pe2xldCBlPTAsaT1uLmRhdGEubGVuZ3RoO2ZvcihsZXQgcj0wO3I8aTtyKyspZSs9bi5kYXRhW3JdO3JldHVybiBNYXRoLmFicyhNYXRoLmNlaWwoZSoxMDAvaS81KS0xMCkqbnIuTjR9O2Z1bmN0aW9uIElGKHQsbixlKXtzd2l0Y2godCl7Y2FzZSBnMS5QYXR0ZXJucy5QQVRURVJOMDAwOnJldHVybihuK2UpJTI9PT0wO2Nhc2UgZzEuUGF0dGVybnMuUEFUVEVSTjAwMTpyZXR1cm4gbiUyPT09MDtjYXNlIGcxLlBhdHRlcm5zLlBBVFRFUk4wMTA6cmV0dXJuIGUlMz09PTA7Y2FzZSBnMS5QYXR0ZXJucy5QQVRURVJOMDExOnJldHVybihuK2UpJTM9PT0wO2Nhc2UgZzEuUGF0dGVybnMuUEFUVEVSTjEwMDpyZXR1cm4oTWF0aC5mbG9vcihuLzIpK01hdGguZmxvb3IoZS8zKSklMj09PTA7Y2FzZSBnMS5QYXR0ZXJucy5QQVRURVJOMTAxOnJldHVybiBuKmUlMituKmUlMz09PTA7Y2FzZSBnMS5QYXR0ZXJucy5QQVRURVJOMTEwOnJldHVybihuKmUlMituKmUlMyklMj09PTA7Y2FzZSBnMS5QYXR0ZXJucy5QQVRURVJOMTExOnJldHVybihuKmUlMysobitlKSUyKSUyPT09MDtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiYmFkIG1hc2tQYXR0ZXJuOiIrdCl9fWcxLmFwcGx5TWFzaz1mdW5jdGlvbihuLGUpe2xldCBpPWUuc2l6ZTtmb3IobGV0IGE9MDthPGk7YSsrKWZvcihsZXQgcj0wO3I8aTtyKyspZS5pc1Jlc2VydmVkKHIsYSl8fGUueG9yKHIsYSxJRihuLHIsYSkpfTtnMS5nZXRCZXN0TWFzaz1mdW5jdGlvbihuLGUpe2xldCBpPU9iamVjdC5rZXlzKGcxLlBhdHRlcm5zKS5sZW5ndGgsYT0wLHI9MS8wO2ZvcihsZXQgbz0wO288aTtvKyspe2UobyksZzEuYXBwbHlNYXNrKG8sbik7bGV0IGQ9ZzEuZ2V0UGVuYWx0eU4xKG4pK2cxLmdldFBlbmFsdHlOMihuKStnMS5nZXRQZW5hbHR5TjMobikrZzEuZ2V0UGVuYWx0eU40KG4pO2cxLmFwcGx5TWFzayhvLG4pLGQ8ciYmKHI9ZCxhPW8pfXJldHVybiBhfX0pO3ZhciB1Nz1UZShmNz0+e3ZhciBtbj11cygpLHZzPVsxLDEsMSwxLDEsMSwxLDEsMSwxLDIsMiwxLDIsMiw0LDEsMiw0LDQsMiw0LDQsNCwyLDQsNiw1LDIsNCw2LDYsMiw1LDgsOCw0LDUsOCw4LDQsNSw4LDExLDQsOCwxMCwxMSw0LDksMTIsMTYsNCw5LDE2LDE2LDYsMTAsMTIsMTgsNiwxMCwxNywxNiw2LDExLDE2LDE5LDYsMTMsMTgsMjEsNywxNCwyMSwyNSw4LDE2LDIwLDI1LDgsMTcsMjMsMjUsOSwxNywyMywzNCw5LDE4LDI1LDMwLDEwLDIwLDI3LDMyLDEyLDIxLDI5LDM1LDEyLDIzLDM0LDM3LDEyLDI1LDM0LDQwLDEzLDI2LDM1LDQyLDE0LDI4LDM4LDQ1LDE1LDI5LDQwLDQ4LDE2LDMxLDQzLDUxLDE3LDMzLDQ1LDU0LDE4LDM1LDQ4LDU3LDE5LDM3LDUxLDYwLDE5LDM4LDUzLDYzLDIwLDQwLDU2LDY2LDIxLDQzLDU5LDcwLDIyLDQ1LDYyLDc0LDI0LDQ3LDY1LDc3LDI1LDQ5LDY4LDgxXSxfcz1bNywxMCwxMywxNywxMCwxNiwyMiwyOCwxNSwyNiwzNiw0NCwyMCwzNiw1Miw2NCwyNiw0OCw3Miw4OCwzNiw2NCw5NiwxMTIsNDAsNzIsMTA4LDEzMCw0OCw4OCwxMzIsMTU2LDYwLDExMCwxNjAsMTkyLDcyLDEzMCwxOTIsMjI0LDgwLDE1MCwyMjQsMjY0LDk2LDE3NiwyNjAsMzA4LDEwNCwxOTgsMjg4LDM1MiwxMjAsMjE2LDMyMCwzODQsMTMyLDI0MCwzNjAsNDMyLDE0NCwyODAsNDA4LDQ4MCwxNjgsMzA4LDQ0OCw1MzIsMTgwLDMzOCw1MDQsNTg4LDE5NiwzNjQsNTQ2LDY1MCwyMjQsNDE2LDYwMCw3MDAsMjI0LDQ0Miw2NDQsNzUwLDI1Miw0NzYsNjkwLDgxNiwyNzAsNTA0LDc1MCw5MDAsMzAwLDU2MCw4MTAsOTYwLDMxMiw1ODgsODcwLDEwNTAsMzM2LDY0NCw5NTIsMTExMCwzNjAsNzAwLDEwMjAsMTIwMCwzOTAsNzI4LDEwNTAsMTI2MCw0MjAsNzg0LDExNDAsMTM1MCw0NTAsODEyLDEyMDAsMTQ0MCw0ODAsODY4LDEyOTAsMTUzMCw1MTAsOTI0LDEzNTAsMTYyMCw1NDAsOTgwLDE0NDAsMTcxMCw1NzAsMTAzNiwxNTMwLDE4MDAsNTcwLDEwNjQsMTU5MCwxODkwLDYwMCwxMTIwLDE2ODAsMTk4MCw2MzAsMTIwNCwxNzcwLDIxMDAsNjYwLDEyNjAsMTg2MCwyMjIwLDcyMCwxMzE2LDE5NTAsMjMxMCw3NTAsMTM3MiwyMDQwLDI0MzBdO2Y3LmdldEJsb2Nrc0NvdW50PWZ1bmN0aW9uKG4sZSl7c3dpdGNoKGUpe2Nhc2UgbW4uTDpyZXR1cm4gdnNbKG4tMSkqNCswXTtjYXNlIG1uLk06cmV0dXJuIHZzWyhuLTEpKjQrMV07Y2FzZSBtbi5ROnJldHVybiB2c1sobi0xKSo0KzJdO2Nhc2UgbW4uSDpyZXR1cm4gdnNbKG4tMSkqNCszXTtkZWZhdWx0OnJldHVybn19O2Y3LmdldFRvdGFsQ29kZXdvcmRzQ291bnQ9ZnVuY3Rpb24obixlKXtzd2l0Y2goZSl7Y2FzZSBtbi5MOnJldHVybiBfc1sobi0xKSo0KzBdO2Nhc2UgbW4uTTpyZXR1cm4gX3NbKG4tMSkqNCsxXTtjYXNlIG1uLlE6cmV0dXJuIF9zWyhuLTEpKjQrMl07Y2FzZSBtbi5IOnJldHVybiBfc1sobi0xKSo0KzNdO2RlZmF1bHQ6cmV0dXJufX19KTt2YXIgaWI9VGUoQ3M9Pnt2YXIgVzQ9bmV3IFVpbnQ4QXJyYXkoNTEyKSxicz1uZXcgVWludDhBcnJheSgyNTYpOyhmdW5jdGlvbigpe2xldCBuPTE7Zm9yKGxldCBlPTA7ZTwyNTU7ZSsrKVc0W2VdPW4sYnNbbl09ZSxuPDw9MSxuJjI1NiYmKG5ePTI4NSk7Zm9yKGxldCBlPTI1NTtlPDUxMjtlKyspVzRbZV09VzRbZS0yNTVdfSkoKTtDcy5sb2c9ZnVuY3Rpb24obil7aWYobjwxKXRocm93IG5ldyBFcnJvcigibG9nKCIrbisiKSIpO3JldHVybiBic1tuXX07Q3MuZXhwPWZ1bmN0aW9uKG4pe3JldHVybiBXNFtuXX07Q3MubXVsPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIG49PT0wfHxlPT09MD8wOlc0W2JzW25dK2JzW2VdXX19KTt2YXIgYWI9VGUoUTQ9Pnt2YXIgZzc9aWIoKTtRNC5tdWw9ZnVuY3Rpb24obixlKXtsZXQgaT1uZXcgVWludDhBcnJheShuLmxlbmd0aCtlLmxlbmd0aC0xKTtmb3IobGV0IGE9MDthPG4ubGVuZ3RoO2ErKylmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpW2Ercl1ePWc3Lm11bChuW2FdLGVbcl0pO3JldHVybiBpfTtRNC5tb2Q9ZnVuY3Rpb24obixlKXtsZXQgaT1uZXcgVWludDhBcnJheShuKTtmb3IoO2kubGVuZ3RoLWUubGVuZ3RoPj0wOyl7bGV0IGE9aVswXTtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKylpW29dXj1nNy5tdWwoZVtvXSxhKTtsZXQgcj0wO2Zvcig7cjxpLmxlbmd0aCYmaVtyXT09PTA7KXIrKztpPWkuc2xpY2Uocil9cmV0dXJuIGl9O1E0LmdlbmVyYXRlRUNQb2x5bm9taWFsPWZ1bmN0aW9uKG4pe2xldCBlPW5ldyBVaW50OEFycmF5KFsxXSk7Zm9yKGxldCBpPTA7aTxuO2krKyllPVE0Lm11bChlLG5ldyBVaW50OEFycmF5KFsxLGc3LmV4cChpKV0pKTtyZXR1cm4gZX19KTt2YXIgb2I9VGUoKFo5ZSxyYik9Pnt2YXIgbmI9YWIoKTtmdW5jdGlvbiB2Nyh0KXt0aGlzLmdlblBvbHk9dm9pZCAwLHRoaXMuZGVncmVlPXQsdGhpcy5kZWdyZWUmJnRoaXMuaW5pdGlhbGl6ZSh0aGlzLmRlZ3JlZSl9djcucHJvdG90eXBlLmluaXRpYWxpemU9ZnVuY3Rpb24obil7dGhpcy5kZWdyZWU9bix0aGlzLmdlblBvbHk9bmIuZ2VuZXJhdGVFQ1BvbHlub21pYWwodGhpcy5kZWdyZWUpfTt2Ny5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKG4pe2lmKCF0aGlzLmdlblBvbHkpdGhyb3cgbmV3IEVycm9yKCJFbmNvZGVyIG5vdCBpbml0aWFsaXplZCIpO2xldCBlPW5ldyBVaW50OEFycmF5KG4ubGVuZ3RoK3RoaXMuZGVncmVlKTtlLnNldChuKTtsZXQgaT1uYi5tb2QoZSx0aGlzLmdlblBvbHkpLGE9dGhpcy5kZWdyZWUtaS5sZW5ndGg7aWYoYT4wKXtsZXQgcj1uZXcgVWludDhBcnJheSh0aGlzLmRlZ3JlZSk7cmV0dXJuIHIuc2V0KGksYSkscn1yZXR1cm4gaX07cmIuZXhwb3J0cz12N30pO3ZhciBfNz1UZShjYj0+e2NiLmlzVmFsaWQ9ZnVuY3Rpb24obil7cmV0dXJuIWlzTmFOKG4pJiZuPj0xJiZuPD00MH19KTt2YXIgYjc9VGUoSWE9Pnt2YXIgc2I9IlswLTldKyIsTEY9IltBLVogJCUqK1xcLS4vOl0rIixZND0iKD86W3UzMDAwLXUzMDNGXXxbdTMwNDAtdTMwOUZdfFt1MzBBMC11MzBGRl18W3VGRjAwLXVGRkVGXXxbdTRFMDAtdTlGQUZdfFt1MjYwNS11MjYwNl18W3UyMTkwLXUyMTk1XXx1MjAzQnxbdTIwMTB1MjAxNXUyMDE4dTIwMTl1MjAyNXUyMDI2dTIwMUN1MjAxRHUyMjI1dTIyNjBdfFt1MDM5MS11MDQ1MV18W3UwMEE3dTAwQTh1MDBCMXUwMEI0dTAwRDd1MDBGN10pKyI7WTQ9WTQucmVwbGFjZSgvdS9nLCJcXHUiKTt2YXIgUEY9Iig/Oig/IVtBLVowLTkgJCUqK1xcLS4vOl18IitZNCtgKSg/Oi58W1xyCl0pKStgO0lhLktBTkpJPW5ldyBSZWdFeHAoWTQsImciKTtJYS5CWVRFX0tBTkpJPW5ldyBSZWdFeHAoIlteQS1aMC05ICQlKitcXC0uLzpdKyIsImciKTtJYS5CWVRFPW5ldyBSZWdFeHAoUEYsImciKTtJYS5OVU1FUklDPW5ldyBSZWdFeHAoc2IsImciKTtJYS5BTFBIQU5VTUVSSUM9bmV3IFJlZ0V4cChMRiwiZyIpO3ZhciBWRj1uZXcgUmVnRXhwKCJeIitZNCsiJCIpLE9GPW5ldyBSZWdFeHAoIl4iK3NiKyIkIiksSEY9bmV3IFJlZ0V4cCgiXltBLVowLTkgJCUqK1xcLS4vOl0rJCIpO0lhLnRlc3RLYW5qaT1mdW5jdGlvbihuKXtyZXR1cm4gVkYudGVzdChuKX07SWEudGVzdE51bWVyaWM9ZnVuY3Rpb24obil7cmV0dXJuIE9GLnRlc3Qobil9O0lhLnRlc3RBbHBoYW51bWVyaWM9ZnVuY3Rpb24obil7cmV0dXJuIEhGLnRlc3Qobil9fSk7dmFyIGhuPVRlKEIxPT57dmFyIE5GPV83KCksQzc9YjcoKTtCMS5OVU1FUklDPXtpZDoiTnVtZXJpYyIsYml0OjEsY2NCaXRzOlsxMCwxMiwxNF19O0IxLkFMUEhBTlVNRVJJQz17aWQ6IkFscGhhbnVtZXJpYyIsYml0OjIsY2NCaXRzOls5LDExLDEzXX07QjEuQllURT17aWQ6IkJ5dGUiLGJpdDo0LGNjQml0czpbOCwxNiwxNl19O0IxLktBTkpJPXtpZDoiS2FuamkiLGJpdDo4LGNjQml0czpbOCwxMCwxMl19O0IxLk1JWEVEPXtiaXQ6LTF9O0IxLmdldENoYXJDb3VudEluZGljYXRvcj1mdW5jdGlvbihuLGUpe2lmKCFuLmNjQml0cyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbW9kZTogIituKTtpZighTkYuaXNWYWxpZChlKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdmVyc2lvbjogIitlKTtyZXR1cm4gZT49MSYmZTwxMD9uLmNjQml0c1swXTplPDI3P24uY2NCaXRzWzFdOm4uY2NCaXRzWzJdfTtCMS5nZXRCZXN0TW9kZUZvckRhdGE9ZnVuY3Rpb24obil7cmV0dXJuIEM3LnRlc3ROdW1lcmljKG4pP0IxLk5VTUVSSUM6QzcudGVzdEFscGhhbnVtZXJpYyhuKT9CMS5BTFBIQU5VTUVSSUM6QzcudGVzdEthbmppKG4pP0IxLktBTkpJOkIxLkJZVEV9O0IxLnRvU3RyaW5nPWZ1bmN0aW9uKG4pe2lmKG4mJm4uaWQpcmV0dXJuIG4uaWQ7dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIG1vZGUiKX07QjEuaXNWYWxpZD1mdW5jdGlvbihuKXtyZXR1cm4gbiYmbi5iaXQmJm4uY2NCaXRzfTtmdW5jdGlvbiBSRih0KXtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJQYXJhbSBpcyBub3QgYSBzdHJpbmciKTtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlIm51bWVyaWMiOnJldHVybiBCMS5OVU1FUklDO2Nhc2UiYWxwaGFudW1lcmljIjpyZXR1cm4gQjEuQUxQSEFOVU1FUklDO2Nhc2Uia2FuamkiOnJldHVybiBCMS5LQU5KSTtjYXNlImJ5dGUiOnJldHVybiBCMS5CWVRFO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG1vZGU6ICIrdCl9fUIxLmZyb209ZnVuY3Rpb24obixlKXtpZihCMS5pc1ZhbGlkKG4pKXJldHVybiBuO3RyeXtyZXR1cm4gUkYobil9Y2F0Y2h7cmV0dXJuIGV9fX0pO3ZhciBwYj1UZShycj0+e3ZhciB5cz1kbigpLEZGPXU3KCksbGI9dXMoKSxwbj1obigpLHk3PV83KCksbWI9Nzk3MyxkYj15cy5nZXRCQ0hEaWdpdChtYik7ZnVuY3Rpb24gQkYodCxuLGUpe2ZvcihsZXQgaT0xO2k8PTQwO2krKylpZihuPD1yci5nZXRDYXBhY2l0eShpLGUsdCkpcmV0dXJuIGl9ZnVuY3Rpb24gaGIodCxuKXtyZXR1cm4gcG4uZ2V0Q2hhckNvdW50SW5kaWNhdG9yKHQsbikrNH1mdW5jdGlvbiBVRih0LG4pe2xldCBlPTA7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihpKXtsZXQgYT1oYihpLm1vZGUsbik7ZSs9YStpLmdldEJpdHNMZW5ndGgoKX0pLGV9ZnVuY3Rpb24gakYodCxuKXtmb3IobGV0IGU9MTtlPD00MDtlKyspaWYoVUYodCxlKTw9cnIuZ2V0Q2FwYWNpdHkoZSxuLHBuLk1JWEVEKSlyZXR1cm4gZX1yci5mcm9tPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIHk3LmlzVmFsaWQobik/cGFyc2VJbnQobiwxMCk6ZX07cnIuZ2V0Q2FwYWNpdHk9ZnVuY3Rpb24obixlLGkpe2lmKCF5Ny5pc1ZhbGlkKG4pKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBRUiBDb2RlIHZlcnNpb24iKTt0eXBlb2YgaT4idSImJihpPXBuLkJZVEUpO2xldCBhPXlzLmdldFN5bWJvbFRvdGFsQ29kZXdvcmRzKG4pLHI9RkYuZ2V0VG90YWxDb2Rld29yZHNDb3VudChuLGUpLG89KGEtcikqODtpZihpPT09cG4uTUlYRUQpcmV0dXJuIG87bGV0IGQ9by1oYihpLG4pO3N3aXRjaChpKXtjYXNlIHBuLk5VTUVSSUM6cmV0dXJuIE1hdGguZmxvb3IoZC8xMCozKTtjYXNlIHBuLkFMUEhBTlVNRVJJQzpyZXR1cm4gTWF0aC5mbG9vcihkLzExKjIpO2Nhc2UgcG4uS0FOSkk6cmV0dXJuIE1hdGguZmxvb3IoZC8xMyk7Y2FzZSBwbi5CWVRFOmRlZmF1bHQ6cmV0dXJuIE1hdGguZmxvb3IoZC84KX19O3JyLmdldEJlc3RWZXJzaW9uRm9yRGF0YT1mdW5jdGlvbihuLGUpe2xldCBpLGE9bGIuZnJvbShlLGxiLk0pO2lmKEFycmF5LmlzQXJyYXkobikpe2lmKG4ubGVuZ3RoPjEpcmV0dXJuIGpGKG4sYSk7aWYobi5sZW5ndGg9PT0wKXJldHVybiAxO2k9blswXX1lbHNlIGk9bjtyZXR1cm4gQkYoaS5tb2RlLGkuZ2V0TGVuZ3RoKCksYSl9O3JyLmdldEVuY29kZWRCaXRzPWZ1bmN0aW9uKG4pe2lmKCF5Ny5pc1ZhbGlkKG4pfHxuPDcpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIFFSIENvZGUgdmVyc2lvbiIpO2xldCBlPW48PDEyO2Zvcig7eXMuZ2V0QkNIRGlnaXQoZSktZGI+PTA7KWVePW1iPDx5cy5nZXRCQ0hEaWdpdChlKS1kYjtyZXR1cm4gbjw8MTJ8ZX19KTt2YXIgdmI9VGUoZ2I9Pnt2YXIgeDc9ZG4oKSx1Yj0xMzM1LHFGPTIxNTIyLGZiPXg3LmdldEJDSERpZ2l0KHViKTtnYi5nZXRFbmNvZGVkQml0cz1mdW5jdGlvbihuLGUpe2xldCBpPW4uYml0PDwzfGUsYT1pPDwxMDtmb3IoO3g3LmdldEJDSERpZ2l0KGEpLWZiPj0wOylhXj11Yjw8eDcuZ2V0QkNIRGlnaXQoYSktZmI7cmV0dXJuKGk8PDEwfGEpXnFGfX0pO3ZhciBiYj1UZSgodGhlLF9iKT0+e3ZhciBHRj1obigpO2Z1bmN0aW9uIHlvKHQpe3RoaXMubW9kZT1HRi5OVU1FUklDLHRoaXMuZGF0YT10LnRvU3RyaW5nKCl9eW8uZ2V0Qml0c0xlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gMTAqTWF0aC5mbG9vcihuLzMpKyhuJTM/biUzKjMrMTowKX07eW8ucHJvdG90eXBlLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGEubGVuZ3RofTt5by5wcm90b3R5cGUuZ2V0Qml0c0xlbmd0aD1mdW5jdGlvbigpe3JldHVybiB5by5nZXRCaXRzTGVuZ3RoKHRoaXMuZGF0YS5sZW5ndGgpfTt5by5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24obil7bGV0IGUsaSxhO2ZvcihlPTA7ZSszPD10aGlzLmRhdGEubGVuZ3RoO2UrPTMpaT10aGlzLmRhdGEuc3Vic3RyKGUsMyksYT1wYXJzZUludChpLDEwKSxuLnB1dChhLDEwKTtsZXQgcj10aGlzLmRhdGEubGVuZ3RoLWU7cj4wJiYoaT10aGlzLmRhdGEuc3Vic3RyKGUpLGE9cGFyc2VJbnQoaSwxMCksbi5wdXQoYSxyKjMrMSkpfTtfYi5leHBvcnRzPXlvfSk7dmFyIHliPVRlKChpaGUsQ2IpPT57dmFyIFdGPWhuKCksTTc9WyIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkgiLCJJIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIiwiUCIsIlEiLCJSIiwiUyIsIlQiLCJVIiwiViIsIlciLCJYIiwiWSIsIloiLCIgIiwiJCIsIiUiLCIqIiwiKyIsIi0iLCIuIiwiLyIsIjoiXTtmdW5jdGlvbiB4byh0KXt0aGlzLm1vZGU9V0YuQUxQSEFOVU1FUklDLHRoaXMuZGF0YT10fXhvLmdldEJpdHNMZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIDExKk1hdGguZmxvb3Iobi8yKSs2KihuJTIpfTt4by5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5sZW5ndGh9O3hvLnByb3RvdHlwZS5nZXRCaXRzTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHhvLmdldEJpdHNMZW5ndGgodGhpcy5kYXRhLmxlbmd0aCl9O3hvLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihuKXtsZXQgZTtmb3IoZT0wO2UrMjw9dGhpcy5kYXRhLmxlbmd0aDtlKz0yKXtsZXQgaT1NNy5pbmRleE9mKHRoaXMuZGF0YVtlXSkqNDU7aSs9TTcuaW5kZXhPZih0aGlzLmRhdGFbZSsxXSksbi5wdXQoaSwxMSl9dGhpcy5kYXRhLmxlbmd0aCUyJiZuLnB1dChNNy5pbmRleE9mKHRoaXMuZGF0YVtlXSksNil9O0NiLmV4cG9ydHM9eG99KTt2YXIgTWI9VGUoKGFoZSx4Yik9Pnt2YXIgUUY9aG4oKTtmdW5jdGlvbiBNbyh0KXt0aGlzLm1vZGU9UUYuQllURSx0eXBlb2YgdD09InN0cmluZyI/dGhpcy5kYXRhPW5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0KTp0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkodCl9TW8uZ2V0Qml0c0xlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gbio4fTtNby5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5sZW5ndGh9O01vLnByb3RvdHlwZS5nZXRCaXRzTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1vLmdldEJpdHNMZW5ndGgodGhpcy5kYXRhLmxlbmd0aCl9O01vLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtmb3IobGV0IG49MCxlPXRoaXMuZGF0YS5sZW5ndGg7bjxlO24rKyl0LnB1dCh0aGlzLmRhdGFbbl0sOCl9O3hiLmV4cG9ydHM9TW99KTt2YXIgU2I9VGUoKG5oZSx3Yik9Pnt2YXIgWUY9aG4oKSxaRj1kbigpO2Z1bmN0aW9uIHdvKHQpe3RoaXMubW9kZT1ZRi5LQU5KSSx0aGlzLmRhdGE9dH13by5nZXRCaXRzTGVuZ3RoPWZ1bmN0aW9uKG4pe3JldHVybiBuKjEzfTt3by5wcm90b3R5cGUuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5sZW5ndGh9O3dvLnByb3RvdHlwZS5nZXRCaXRzTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHdvLmdldEJpdHNMZW5ndGgodGhpcy5kYXRhLmxlbmd0aCl9O3dvLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0KXtsZXQgbjtmb3Iobj0wO248dGhpcy5kYXRhLmxlbmd0aDtuKyspe2xldCBlPVpGLnRvU0pJUyh0aGlzLmRhdGFbbl0pO2lmKGU+PTMzMDg4JiZlPD00MDk1NillLT0zMzA4ODtlbHNlIGlmKGU+PTU3NDA4JiZlPD02MDM1MSllLT00OTQ3MjtlbHNlIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBTSklTIGNoYXJhY3RlcjogIit0aGlzLmRhdGFbbl0rYApNYWtlIHN1cmUgeW91ciBjaGFyc2V0IGlzIFVURi04YCk7ZT0oZT4+PjgmMjU1KSoxOTIrKGUmMjU1KSx0LnB1dChlLDEzKX19O3diLmV4cG9ydHM9d299KTt2YXIga2I9VGUoKHJoZSx3Nyk9PnsidXNlIHN0cmljdCI7dmFyIFo0PXtzaW5nbGVfc291cmNlX3Nob3J0ZXN0X3BhdGhzOmZ1bmN0aW9uKHQsbixlKXt2YXIgaT17fSxhPXt9O2Fbbl09MDt2YXIgcj1aNC5Qcmlvcml0eVF1ZXVlLm1ha2UoKTtyLnB1c2gobiwwKTtmb3IodmFyIG8sZCxwLGcsXyx5LEksUCxWOyFyLmVtcHR5KCk7KXtvPXIucG9wKCksZD1vLnZhbHVlLGc9by5jb3N0LF89dFtkXXx8e307Zm9yKHAgaW4gXylfLmhhc093blByb3BlcnR5KHApJiYoeT1fW3BdLEk9Zyt5LFA9YVtwXSxWPXR5cGVvZiBhW3BdPiJ1IiwoVnx8UD5JKSYmKGFbcF09SSxyLnB1c2gocCxJKSxpW3BdPWQpKX1pZih0eXBlb2YgZTwidSImJnR5cGVvZiBhW2VdPiJ1Iil7dmFyIE89WyJDb3VsZCBub3QgZmluZCBhIHBhdGggZnJvbSAiLG4sIiB0byAiLGUsIi4iXS5qb2luKCIiKTt0aHJvdyBuZXcgRXJyb3IoTyl9cmV0dXJuIGl9LGV4dHJhY3Rfc2hvcnRlc3RfcGF0aF9mcm9tX3ByZWRlY2Vzc29yX2xpc3Q6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9W10saT1uLGE7aTspZS5wdXNoKGkpLGE9dFtpXSxpPXRbaV07cmV0dXJuIGUucmV2ZXJzZSgpLGV9LGZpbmRfcGF0aDpmdW5jdGlvbih0LG4sZSl7dmFyIGk9WjQuc2luZ2xlX3NvdXJjZV9zaG9ydGVzdF9wYXRocyh0LG4sZSk7cmV0dXJuIFo0LmV4dHJhY3Rfc2hvcnRlc3RfcGF0aF9mcm9tX3ByZWRlY2Vzc29yX2xpc3QoaSxlKX0sUHJpb3JpdHlRdWV1ZTp7bWFrZTpmdW5jdGlvbih0KXt2YXIgbj1aNC5Qcmlvcml0eVF1ZXVlLGU9e30saTt0PXR8fHt9O2ZvcihpIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShpKSYmKGVbaV09bltpXSk7cmV0dXJuIGUucXVldWU9W10sZS5zb3J0ZXI9dC5zb3J0ZXJ8fG4uZGVmYXVsdF9zb3J0ZXIsZX0sZGVmYXVsdF9zb3J0ZXI6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5jb3N0LW4uY29zdH0scHVzaDpmdW5jdGlvbih0LG4pe3ZhciBlPXt2YWx1ZTp0LGNvc3Q6bn07dGhpcy5xdWV1ZS5wdXNoKGUpLHRoaXMucXVldWUuc29ydCh0aGlzLnNvcnRlcil9LHBvcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXVlLnNoaWZ0KCl9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVldWUubGVuZ3RoPT09MH19fTt0eXBlb2Ygdzc8InUiJiYodzcuZXhwb3J0cz1aNCl9KTt2YXIgUGI9VGUoU289Pnt2YXIgdDE9aG4oKSxFYj1iYigpLEFiPXliKCksRGI9TWIoKSxJYj1TYigpLCQ0PWI3KCkseHM9ZG4oKSwkRj1rYigpO2Z1bmN0aW9uIHpiKHQpe3JldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQodCkpLmxlbmd0aH1mdW5jdGlvbiBLNCh0LG4sZSl7bGV0IGk9W10sYTtmb3IoOyhhPXQuZXhlYyhlKSkhPT1udWxsOylpLnB1c2goe2RhdGE6YVswXSxpbmRleDphLmluZGV4LG1vZGU6bixsZW5ndGg6YVswXS5sZW5ndGh9KTtyZXR1cm4gaX1mdW5jdGlvbiBMYih0KXtsZXQgbj1LNCgkNC5OVU1FUklDLHQxLk5VTUVSSUMsdCksZT1LNCgkNC5BTFBIQU5VTUVSSUMsdDEuQUxQSEFOVU1FUklDLHQpLGksYTtyZXR1cm4geHMuaXNLYW5qaU1vZGVFbmFibGVkKCk/KGk9SzQoJDQuQllURSx0MS5CWVRFLHQpLGE9SzQoJDQuS0FOSkksdDEuS0FOSkksdCkpOihpPUs0KCQ0LkJZVEVfS0FOSkksdDEuQllURSx0KSxhPVtdKSxuLmNvbmNhdChlLGksYSkuc29ydChmdW5jdGlvbihvLGQpe3JldHVybiBvLmluZGV4LWQuaW5kZXh9KS5tYXAoZnVuY3Rpb24obyl7cmV0dXJue2RhdGE6by5kYXRhLG1vZGU6by5tb2RlLGxlbmd0aDpvLmxlbmd0aH19KX1mdW5jdGlvbiBTNyh0LG4pe3N3aXRjaChuKXtjYXNlIHQxLk5VTUVSSUM6cmV0dXJuIEViLmdldEJpdHNMZW5ndGgodCk7Y2FzZSB0MS5BTFBIQU5VTUVSSUM6cmV0dXJuIEFiLmdldEJpdHNMZW5ndGgodCk7Y2FzZSB0MS5LQU5KSTpyZXR1cm4gSWIuZ2V0Qml0c0xlbmd0aCh0KTtjYXNlIHQxLkJZVEU6cmV0dXJuIERiLmdldEJpdHNMZW5ndGgodCl9fWZ1bmN0aW9uIEtGKHQpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbihuLGUpe2xldCBpPW4ubGVuZ3RoLTE+PTA/bltuLmxlbmd0aC0xXTpudWxsO3JldHVybiBpJiZpLm1vZGU9PT1lLm1vZGU/KG5bbi5sZW5ndGgtMV0uZGF0YSs9ZS5kYXRhLG4pOihuLnB1c2goZSksbil9LFtdKX1mdW5jdGlvbiBYRih0KXtsZXQgbj1bXTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7bGV0IGk9dFtlXTtzd2l0Y2goaS5tb2RlKXtjYXNlIHQxLk5VTUVSSUM6bi5wdXNoKFtpLHtkYXRhOmkuZGF0YSxtb2RlOnQxLkFMUEhBTlVNRVJJQyxsZW5ndGg6aS5sZW5ndGh9LHtkYXRhOmkuZGF0YSxtb2RlOnQxLkJZVEUsbGVuZ3RoOmkubGVuZ3RofV0pO2JyZWFrO2Nhc2UgdDEuQUxQSEFOVU1FUklDOm4ucHVzaChbaSx7ZGF0YTppLmRhdGEsbW9kZTp0MS5CWVRFLGxlbmd0aDppLmxlbmd0aH1dKTticmVhaztjYXNlIHQxLktBTkpJOm4ucHVzaChbaSx7ZGF0YTppLmRhdGEsbW9kZTp0MS5CWVRFLGxlbmd0aDp6YihpLmRhdGEpfV0pO2JyZWFrO2Nhc2UgdDEuQllURTpuLnB1c2goW3tkYXRhOmkuZGF0YSxtb2RlOnQxLkJZVEUsbGVuZ3RoOnpiKGkuZGF0YSl9XSl9fXJldHVybiBufWZ1bmN0aW9uIEpGKHQsbil7bGV0IGU9e30saT17c3RhcnQ6e319LGE9WyJzdGFydCJdO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKXtsZXQgbz10W3JdLGQ9W107Zm9yKGxldCBwPTA7cDxvLmxlbmd0aDtwKyspe2xldCBnPW9bcF0sXz0iIityK3A7ZC5wdXNoKF8pLGVbX109e25vZGU6ZyxsYXN0Q291bnQ6MH0saVtfXT17fTtmb3IobGV0IHk9MDt5PGEubGVuZ3RoO3krKyl7bGV0IEk9YVt5XTtlW0ldJiZlW0ldLm5vZGUubW9kZT09PWcubW9kZT8oaVtJXVtfXT1TNyhlW0ldLmxhc3RDb3VudCtnLmxlbmd0aCxnLm1vZGUpLVM3KGVbSV0ubGFzdENvdW50LGcubW9kZSksZVtJXS5sYXN0Q291bnQrPWcubGVuZ3RoKTooZVtJXSYmKGVbSV0ubGFzdENvdW50PWcubGVuZ3RoKSxpW0ldW19dPVM3KGcubGVuZ3RoLGcubW9kZSkrNCt0MS5nZXRDaGFyQ291bnRJbmRpY2F0b3IoZy5tb2RlLG4pKX19YT1kfWZvcihsZXQgcj0wO3I8YS5sZW5ndGg7cisrKWlbYVtyXV0uZW5kPTA7cmV0dXJue21hcDppLHRhYmxlOmV9fWZ1bmN0aW9uIFRiKHQsbil7bGV0IGUsaT10MS5nZXRCZXN0TW9kZUZvckRhdGEodCk7aWYoZT10MS5mcm9tKG4saSksZSE9PXQxLkJZVEUmJmUuYml0PGkuYml0KXRocm93IG5ldyBFcnJvcignIicrdCsnIiBjYW5ub3QgYmUgZW5jb2RlZCB3aXRoIG1vZGUgJyt0MS50b1N0cmluZyhlKStgLgogU3VnZ2VzdGVkIG1vZGUgaXM6IGArdDEudG9TdHJpbmcoaSkpO3N3aXRjaChlPT09dDEuS0FOSkkmJiF4cy5pc0thbmppTW9kZUVuYWJsZWQoKSYmKGU9dDEuQllURSksZSl7Y2FzZSB0MS5OVU1FUklDOnJldHVybiBuZXcgRWIodCk7Y2FzZSB0MS5BTFBIQU5VTUVSSUM6cmV0dXJuIG5ldyBBYih0KTtjYXNlIHQxLktBTkpJOnJldHVybiBuZXcgSWIodCk7Y2FzZSB0MS5CWVRFOnJldHVybiBuZXcgRGIodCl9fVNvLmZyb21BcnJheT1mdW5jdGlvbihuKXtyZXR1cm4gbi5yZWR1Y2UoZnVuY3Rpb24oZSxpKXtyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciP2UucHVzaChUYihpLG51bGwpKTppLmRhdGEmJmUucHVzaChUYihpLmRhdGEsaS5tb2RlKSksZX0sW10pfTtTby5mcm9tU3RyaW5nPWZ1bmN0aW9uKG4sZSl7bGV0IGk9TGIobix4cy5pc0thbmppTW9kZUVuYWJsZWQoKSksYT1YRihpKSxyPUpGKGEsZSksbz0kRi5maW5kX3BhdGgoci5tYXAsInN0YXJ0IiwiZW5kIiksZD1bXTtmb3IobGV0IHA9MTtwPG8ubGVuZ3RoLTE7cCsrKWQucHVzaChyLnRhYmxlW29bcF1dLm5vZGUpO3JldHVybiBTby5mcm9tQXJyYXkoS0YoZCkpfTtTby5yYXdTcGxpdD1mdW5jdGlvbihuKXtyZXR1cm4gU28uZnJvbUFycmF5KExiKG4seHMuaXNLYW5qaU1vZGVFbmFibGVkKCkpKX19KTt2YXIgT2I9VGUoVmI9Pnt2YXIgd3M9ZG4oKSxrNz11cygpLGVCPVlfKCksdEI9JF8oKSxpQj1LXygpLGFCPWViKCksRTc9dGIoKSxBNz11NygpLG5CPW9iKCksTXM9cGIoKSxyQj12YigpLG9CPWhuKCksejc9UGIoKTtmdW5jdGlvbiBjQih0LG4pe2xldCBlPXQuc2l6ZSxpPWFCLmdldFBvc2l0aW9ucyhuKTtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErKyl7bGV0IHI9aVthXVswXSxvPWlbYV1bMV07Zm9yKGxldCBkPS0xO2Q8PTc7ZCsrKWlmKCEocitkPD0tMXx8ZTw9citkKSlmb3IobGV0IHA9LTE7cDw9NztwKyspbytwPD0tMXx8ZTw9bytwfHwoZD49MCYmZDw9NiYmKHA9PT0wfHxwPT09Nil8fHA+PTAmJnA8PTYmJihkPT09MHx8ZD09PTYpfHxkPj0yJiZkPD00JiZwPj0yJiZwPD00P3Quc2V0KHIrZCxvK3AsITAsITApOnQuc2V0KHIrZCxvK3AsITEsITApKX19ZnVuY3Rpb24gc0IodCl7bGV0IG49dC5zaXplO2ZvcihsZXQgZT04O2U8bi04O2UrKyl7bGV0IGk9ZSUyPT09MDt0LnNldChlLDYsaSwhMCksdC5zZXQoNixlLGksITApfX1mdW5jdGlvbiBsQih0LG4pe2xldCBlPWlCLmdldFBvc2l0aW9ucyhuKTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7bGV0IGE9ZVtpXVswXSxyPWVbaV1bMV07Zm9yKGxldCBvPS0yO288PTI7bysrKWZvcihsZXQgZD0tMjtkPD0yO2QrKylvPT09LTJ8fG89PT0yfHxkPT09LTJ8fGQ9PT0yfHxvPT09MCYmZD09PTA/dC5zZXQoYStvLHIrZCwhMCwhMCk6dC5zZXQoYStvLHIrZCwhMSwhMCl9fWZ1bmN0aW9uIGRCKHQsbil7bGV0IGU9dC5zaXplLGk9TXMuZ2V0RW5jb2RlZEJpdHMobiksYSxyLG87Zm9yKGxldCBkPTA7ZDwxODtkKyspYT1NYXRoLmZsb29yKGQvMykscj1kJTMrZS04LTMsbz0oaT4+ZCYxKT09PTEsdC5zZXQoYSxyLG8sITApLHQuc2V0KHIsYSxvLCEwKX1mdW5jdGlvbiBUNyh0LG4sZSl7bGV0IGk9dC5zaXplLGE9ckIuZ2V0RW5jb2RlZEJpdHMobixlKSxyLG87Zm9yKHI9MDtyPDE1O3IrKylvPShhPj5yJjEpPT09MSxyPDY/dC5zZXQociw4LG8sITApOnI8OD90LnNldChyKzEsOCxvLCEwKTp0LnNldChpLTE1K3IsOCxvLCEwKSxyPDg/dC5zZXQoOCxpLXItMSxvLCEwKTpyPDk/dC5zZXQoOCwxNS1yLTErMSxvLCEwKTp0LnNldCg4LDE1LXItMSxvLCEwKTt0LnNldChpLTgsOCwxLCEwKX1mdW5jdGlvbiBtQih0LG4pe2xldCBlPXQuc2l6ZSxpPS0xLGE9ZS0xLHI9NyxvPTA7Zm9yKGxldCBkPWUtMTtkPjA7ZC09Milmb3IoZD09PTYmJmQtLTs7KXtmb3IobGV0IHA9MDtwPDI7cCsrKWlmKCF0LmlzUmVzZXJ2ZWQoYSxkLXApKXtsZXQgZz0hMTtvPG4ubGVuZ3RoJiYoZz0obltvXT4+PnImMSk9PT0xKSx0LnNldChhLGQtcCxnKSxyLS0scj09PS0xJiYobysrLHI9Nyl9aWYoYSs9aSxhPDB8fGU8PWEpe2EtPWksaT0taTticmVha319fWZ1bmN0aW9uIGhCKHQsbixlKXtsZXQgaT1uZXcgZUI7ZS5mb3JFYWNoKGZ1bmN0aW9uKHApe2kucHV0KHAubW9kZS5iaXQsNCksaS5wdXQocC5nZXRMZW5ndGgoKSxvQi5nZXRDaGFyQ291bnRJbmRpY2F0b3IocC5tb2RlLHQpKSxwLndyaXRlKGkpfSk7bGV0IGE9d3MuZ2V0U3ltYm9sVG90YWxDb2Rld29yZHModCkscj1BNy5nZXRUb3RhbENvZGV3b3Jkc0NvdW50KHQsbiksbz0oYS1yKSo4O2ZvcihpLmdldExlbmd0aEluQml0cygpKzQ8PW8mJmkucHV0KDAsNCk7aS5nZXRMZW5ndGhJbkJpdHMoKSU4IT09MDspaS5wdXRCaXQoMCk7bGV0IGQ9KG8taS5nZXRMZW5ndGhJbkJpdHMoKSkvODtmb3IobGV0IHA9MDtwPGQ7cCsrKWkucHV0KHAlMj8xNzoyMzYsOCk7cmV0dXJuIHBCKGksdCxuKX1mdW5jdGlvbiBwQih0LG4sZSl7bGV0IGk9d3MuZ2V0U3ltYm9sVG90YWxDb2Rld29yZHMobiksYT1BNy5nZXRUb3RhbENvZGV3b3Jkc0NvdW50KG4sZSkscj1pLWEsbz1BNy5nZXRCbG9ja3NDb3VudChuLGUpLGQ9aSVvLHA9by1kLGc9TWF0aC5mbG9vcihpL28pLF89TWF0aC5mbG9vcihyL28pLHk9XysxLEk9Zy1fLFA9bmV3IG5CKEkpLFY9MCxPPW5ldyBBcnJheShvKSxVPW5ldyBBcnJheShvKSxRPTAsZmU9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIpO2ZvcihsZXQgWWU9MDtZZTxvO1llKyspe2xldCB2dD1ZZTxwP186eTtPW1llXT1mZS5zbGljZShWLFYrdnQpLFVbWWVdPVAuZW5jb2RlKE9bWWVdKSxWKz12dCxRPU1hdGgubWF4KFEsdnQpfWxldCBPZT1uZXcgVWludDhBcnJheShpKSxNZT0wLHJ0LE5lO2ZvcihydD0wO3J0PFE7cnQrKylmb3IoTmU9MDtOZTxvO05lKyspcnQ8T1tOZV0ubGVuZ3RoJiYoT2VbTWUrK109T1tOZV1bcnRdKTtmb3IocnQ9MDtydDxJO3J0KyspZm9yKE5lPTA7TmU8bztOZSsrKU9lW01lKytdPVVbTmVdW3J0XTtyZXR1cm4gT2V9ZnVuY3Rpb24gZkIodCxuLGUsaSl7bGV0IGE7aWYoQXJyYXkuaXNBcnJheSh0KSlhPXo3LmZyb21BcnJheSh0KTtlbHNlIGlmKHR5cGVvZiB0PT0ic3RyaW5nIil7bGV0IGc9bjtpZighZyl7bGV0IF89ejcucmF3U3BsaXQodCk7Zz1Ncy5nZXRCZXN0VmVyc2lvbkZvckRhdGEoXyxlKX1hPXo3LmZyb21TdHJpbmcodCxnfHw0MCl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZGF0YSIpO2xldCByPU1zLmdldEJlc3RWZXJzaW9uRm9yRGF0YShhLGUpO2lmKCFyKXRocm93IG5ldyBFcnJvcigiVGhlIGFtb3VudCBvZiBkYXRhIGlzIHRvbyBiaWcgdG8gYmUgc3RvcmVkIGluIGEgUVIgQ29kZSIpO2lmKCFuKW49cjtlbHNlIGlmKG48cil0aHJvdyBuZXcgRXJyb3IoYApUaGUgY2hvc2VuIFFSIENvZGUgdmVyc2lvbiBjYW5ub3QgY29udGFpbiB0aGlzIGFtb3VudCBvZiBkYXRhLgpNaW5pbXVtIHZlcnNpb24gcmVxdWlyZWQgdG8gc3RvcmUgY3VycmVudCBkYXRhIGlzOiBgK3IrYC4KYCk7bGV0IG89aEIobixlLGEpLGQ9d3MuZ2V0U3ltYm9sU2l6ZShuKSxwPW5ldyB0QihkKTtyZXR1cm4gY0IocCxuKSxzQihwKSxsQihwLG4pLFQ3KHAsZSwwKSxuPj03JiZkQihwLG4pLG1CKHAsbyksaXNOYU4oaSkmJihpPUU3LmdldEJlc3RNYXNrKHAsVDcuYmluZChudWxsLHAsZSkpKSxFNy5hcHBseU1hc2soaSxwKSxUNyhwLGUsaSkse21vZHVsZXM6cCx2ZXJzaW9uOm4sZXJyb3JDb3JyZWN0aW9uTGV2ZWw6ZSxtYXNrUGF0dGVybjppLHNlZ21lbnRzOmF9fVZiLmNyZWF0ZT1mdW5jdGlvbihuLGUpe2lmKHR5cGVvZiBuPiJ1Inx8bj09PSIiKXRocm93IG5ldyBFcnJvcigiTm8gaW5wdXQgdGV4dCIpO2xldCBpPWs3Lk0sYSxyO3JldHVybiB0eXBlb2YgZTwidSImJihpPWs3LmZyb20oZS5lcnJvckNvcnJlY3Rpb25MZXZlbCxrNy5NKSxhPU1zLmZyb20oZS52ZXJzaW9uKSxyPUU3LmZyb20oZS5tYXNrUGF0dGVybiksZS50b1NKSVNGdW5jJiZ3cy5zZXRUb1NKSVNGdW5jdGlvbihlLnRvU0pJU0Z1bmMpKSxmQihuLGEsaSxyKX19KTt2YXIgRDc9VGUob3I9PntmdW5jdGlvbiBIYih0KXtpZih0eXBlb2YgdD09Im51bWJlciImJih0PXQudG9TdHJpbmcoKSksdHlwZW9mIHQhPSJzdHJpbmciKXRocm93IG5ldyBFcnJvcigiQ29sb3Igc2hvdWxkIGJlIGRlZmluZWQgYXMgaGV4IHN0cmluZyIpO2xldCBuPXQuc2xpY2UoKS5yZXBsYWNlKCIjIiwiIikuc3BsaXQoIiIpO2lmKG4ubGVuZ3RoPDN8fG4ubGVuZ3RoPT09NXx8bi5sZW5ndGg+OCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaGV4IGNvbG9yOiAiK3QpOyhuLmxlbmd0aD09PTN8fG4ubGVuZ3RoPT09NCkmJihuPUFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sbi5tYXAoZnVuY3Rpb24oaSl7cmV0dXJuW2ksaV19KSkpLG4ubGVuZ3RoPT09NiYmbi5wdXNoKCJGIiwiRiIpO2xldCBlPXBhcnNlSW50KG4uam9pbigiIiksMTYpO3JldHVybntyOmU+PjI0JjI1NSxnOmU+PjE2JjI1NSxiOmU+PjgmMjU1LGE6ZSYyNTUsaGV4OiIjIituLnNsaWNlKDAsNikuam9pbigiIil9fW9yLmdldE9wdGlvbnM9ZnVuY3Rpb24obil7bnx8KG49e30pLG4uY29sb3J8fChuLmNvbG9yPXt9KTtsZXQgZT10eXBlb2Ygbi5tYXJnaW4+InUifHxuLm1hcmdpbj09PW51bGx8fG4ubWFyZ2luPDA/NDpuLm1hcmdpbixpPW4ud2lkdGgmJm4ud2lkdGg+PTIxP24ud2lkdGg6dm9pZCAwLGE9bi5zY2FsZXx8NDtyZXR1cm57d2lkdGg6aSxzY2FsZTppPzQ6YSxtYXJnaW46ZSxjb2xvcjp7ZGFyazpIYihuLmNvbG9yLmRhcmt8fCIjMDAwMDAwZmYiKSxsaWdodDpIYihuLmNvbG9yLmxpZ2h0fHwiI2ZmZmZmZmZmIil9LHR5cGU6bi50eXBlLHJlbmRlcmVyT3B0czpuLnJlbmRlcmVyT3B0c3x8e319fTtvci5nZXRTY2FsZT1mdW5jdGlvbihuLGUpe3JldHVybiBlLndpZHRoJiZlLndpZHRoPj1uK2UubWFyZ2luKjI/ZS53aWR0aC8obitlLm1hcmdpbioyKTplLnNjYWxlfTtvci5nZXRJbWFnZVdpZHRoPWZ1bmN0aW9uKG4sZSl7bGV0IGk9b3IuZ2V0U2NhbGUobixlKTtyZXR1cm4gTWF0aC5mbG9vcigobitlLm1hcmdpbioyKSppKX07b3IucXJUb0ltYWdlRGF0YT1mdW5jdGlvbihuLGUsaSl7bGV0IGE9ZS5tb2R1bGVzLnNpemUscj1lLm1vZHVsZXMuZGF0YSxvPW9yLmdldFNjYWxlKGEsaSksZD1NYXRoLmZsb29yKChhK2kubWFyZ2luKjIpKm8pLHA9aS5tYXJnaW4qbyxnPVtpLmNvbG9yLmxpZ2h0LGkuY29sb3IuZGFya107Zm9yKGxldCBfPTA7XzxkO18rKylmb3IobGV0IHk9MDt5PGQ7eSsrKXtsZXQgST0oXypkK3kpKjQsUD1pLmNvbG9yLmxpZ2h0O2lmKF8+PXAmJnk+PXAmJl88ZC1wJiZ5PGQtcCl7bGV0IFY9TWF0aC5mbG9vcigoXy1wKS9vKSxPPU1hdGguZmxvb3IoKHktcCkvbyk7UD1nW3JbViphK09dPzE6MF19bltJKytdPVAucixuW0krK109UC5nLG5bSSsrXT1QLmIsbltJXT1QLmF9fX0pO3ZhciBOYj1UZShTcz0+e3ZhciBJNz1ENygpO2Z1bmN0aW9uIHVCKHQsbixlKXt0LmNsZWFyUmVjdCgwLDAsbi53aWR0aCxuLmhlaWdodCksbi5zdHlsZXx8KG4uc3R5bGU9e30pLG4uaGVpZ2h0PWUsbi53aWR0aD1lLG4uc3R5bGUuaGVpZ2h0PWUrInB4IixuLnN0eWxlLndpZHRoPWUrInB4In1mdW5jdGlvbiBnQigpe3RyeXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIil9Y2F0Y2h7dGhyb3cgbmV3IEVycm9yKCJZb3UgbmVlZCB0byBzcGVjaWZ5IGEgY2FudmFzIGVsZW1lbnQiKX19U3MucmVuZGVyPWZ1bmN0aW9uKG4sZSxpKXtsZXQgYT1pLHI9ZTt0eXBlb2YgYT4idSImJighZXx8IWUuZ2V0Q29udGV4dCkmJihhPWUsZT12b2lkIDApLGV8fChyPWdCKCkpLGE9STcuZ2V0T3B0aW9ucyhhKTtsZXQgbz1JNy5nZXRJbWFnZVdpZHRoKG4ubW9kdWxlcy5zaXplLGEpLGQ9ci5nZXRDb250ZXh0KCIyZCIpLHA9ZC5jcmVhdGVJbWFnZURhdGEobyxvKTtyZXR1cm4gSTcucXJUb0ltYWdlRGF0YShwLmRhdGEsbixhKSx1QihkLHIsbyksZC5wdXRJbWFnZURhdGEocCwwLDApLHJ9O1NzLnJlbmRlclRvRGF0YVVSTD1mdW5jdGlvbihuLGUsaSl7bGV0IGE9aTt0eXBlb2YgYT4idSImJighZXx8IWUuZ2V0Q29udGV4dCkmJihhPWUsZT12b2lkIDApLGF8fChhPXt9KTtsZXQgcj1Tcy5yZW5kZXIobixlLGEpLG89YS50eXBlfHwiaW1hZ2UvcG5nIixkPWEucmVuZGVyZXJPcHRzfHx7fTtyZXR1cm4gci50b0RhdGFVUkwobyxkLnF1YWxpdHkpfX0pO3ZhciBCYj1UZShGYj0+e3ZhciB2Qj1ENygpO2Z1bmN0aW9uIFJiKHQsbil7bGV0IGU9dC5hLzI1NSxpPW4rJz0iJyt0LmhleCsnIic7cmV0dXJuIGU8MT9pKyIgIituKyctb3BhY2l0eT0iJytlLnRvRml4ZWQoMikuc2xpY2UoMSkrJyInOml9ZnVuY3Rpb24gTDcodCxuLGUpe2xldCBpPXQrbjtyZXR1cm4gdHlwZW9mIGU8InUiJiYoaSs9IiAiK2UpLGl9ZnVuY3Rpb24gX0IodCxuLGUpe2xldCBpPSIiLGE9MCxyPSExLG89MDtmb3IobGV0IGQ9MDtkPHQubGVuZ3RoO2QrKyl7bGV0IHA9TWF0aC5mbG9vcihkJW4pLGc9TWF0aC5mbG9vcihkL24pOyFwJiYhciYmKHI9ITApLHRbZF0/KG8rKyxkPjAmJnA+MCYmdFtkLTFdfHwoaSs9cj9MNygiTSIscCtlLC41K2crZSk6TDcoIm0iLGEsMCksYT0wLHI9ITEpLHArMTxuJiZ0W2QrMV18fChpKz1MNygiaCIsbyksbz0wKSk6YSsrfXJldHVybiBpfUZiLnJlbmRlcj1mdW5jdGlvbihuLGUsaSl7bGV0IGE9dkIuZ2V0T3B0aW9ucyhlKSxyPW4ubW9kdWxlcy5zaXplLG89bi5tb2R1bGVzLmRhdGEsZD1yK2EubWFyZ2luKjIscD1hLmNvbG9yLmxpZ2h0LmE/IjxwYXRoICIrUmIoYS5jb2xvci5saWdodCwiZmlsbCIpKycgZD0iTTAgMGgnK2QrInYiK2QrJ0gweiIvPic6IiIsZz0iPHBhdGggIitSYihhLmNvbG9yLmRhcmssInN0cm9rZSIpKycgZD0iJytfQihvLHIsYS5tYXJnaW4pKyciLz4nLF89J3ZpZXdCb3g9IjAgMCAnK2QrIiAiK2QrJyInLEk9JzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAnKyhhLndpZHRoPyd3aWR0aD0iJythLndpZHRoKyciIGhlaWdodD0iJythLndpZHRoKyciICc6IiIpK18rJyBzaGFwZS1yZW5kZXJpbmc9ImNyaXNwRWRnZXMiPicrcCtnK2A8L3N2Zz4KYDtyZXR1cm4gdHlwZW9mIGk9PSJmdW5jdGlvbiImJmkobnVsbCxJKSxJfX0pO3ZhciBqYj1UZShYND0+e3ZhciBiQj1HXygpLFA3PU9iKCksVWI9TmIoKSxDQj1CYigpO2Z1bmN0aW9uIFY3KHQsbixlLGksYSl7bGV0IHI9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSksbz1yLmxlbmd0aCxkPXR5cGVvZiByW28tMV09PSJmdW5jdGlvbiI7aWYoIWQmJiFiQigpKXRocm93IG5ldyBFcnJvcigiQ2FsbGJhY2sgcmVxdWlyZWQgYXMgbGFzdCBhcmd1bWVudCIpO2lmKGQpe2lmKG88Mil0aHJvdyBuZXcgRXJyb3IoIlRvbyBmZXcgYXJndW1lbnRzIHByb3ZpZGVkIik7bz09PTI/KGE9ZSxlPW4sbj1pPXZvaWQgMCk6bz09PTMmJihuLmdldENvbnRleHQmJnR5cGVvZiBhPiJ1Ij8oYT1pLGk9dm9pZCAwKTooYT1pLGk9ZSxlPW4sbj12b2lkIDApKX1lbHNle2lmKG88MSl0aHJvdyBuZXcgRXJyb3IoIlRvbyBmZXcgYXJndW1lbnRzIHByb3ZpZGVkIik7cmV0dXJuIG89PT0xPyhlPW4sbj1pPXZvaWQgMCk6bz09PTImJiFuLmdldENvbnRleHQmJihpPWUsZT1uLG49dm9pZCAwKSxuZXcgUHJvbWlzZShmdW5jdGlvbihwLGcpe3RyeXtsZXQgXz1QNy5jcmVhdGUoZSxpKTtwKHQoXyxuLGkpKX1jYXRjaChfKXtnKF8pfX0pfXRyeXtsZXQgcD1QNy5jcmVhdGUoZSxpKTthKG51bGwsdChwLG4saSkpfWNhdGNoKHApe2EocCl9fVg0LmNyZWF0ZT1QNy5jcmVhdGU7WDQudG9DYW52YXM9VjcuYmluZChudWxsLFViLnJlbmRlcik7WDQudG9EYXRhVVJMPVY3LmJpbmQobnVsbCxVYi5yZW5kZXJUb0RhdGFVUkwpO1g0LnRvU3RyaW5nPVY3LmJpbmQobnVsbCxmdW5jdGlvbih0LG4sZSl7cmV0dXJuIENCLnJlbmRlcih0LGUpfSl9KTtmdW5jdGlvbiB5Qih0LG4pe2lmKHQmMSYmdSgwLCJjYW52YXMiLDEpLHQmMil7bGV0IGU9digpO0R0KGUuc3R5bGVDbGFzcyksZigicXJDb2RlIixlLnZhbHVlKSgicXJDb2RlRXJyb3JDb3JyZWN0aW9uTGV2ZWwiLGUuZXJyb3JDb3JyZWN0aW9uTGV2ZWwpKCJxckNvZGVDZW50ZXJJbWFnZVNyYyIsZS5jZW50ZXJJbWFnZVNyYykoInFyQ29kZUNlbnRlckltYWdlV2lkdGgiLGUuY2VudGVySW1hZ2VTaXplKSgicXJDb2RlQ2VudGVySW1hZ2VIZWlnaHQiLGUuY2VudGVySW1hZ2VTaXplKSgicXJDb2RlTWFyZ2luIixlLm1hcmdpbikoInFyU2NhbGUiLGUuc2NhbGUpKCJxckNvZGVNYXNrUGF0dGVybiIsZS5tYXNrUGF0dGVybikoIndpZHRoIixlLnNpemUpKCJoZWlnaHQiLGUuc2l6ZSkoIm5nU3R5bGUiLGUuc3R5bGUpKCJkYXJrQ29sb3IiLGUuZGFya0NvbG9yKSgibGlnaHRDb2xvciIsZS5saWdodENvbG9yKX19ZnVuY3Rpb24gR2IodCxuKXtyZXR1cm4gdD09PXZvaWQgMHx8dD09PSIiP246dHlwZW9mIHQ9PSJzdHJpbmciP3BhcnNlSW50KHQsMTApOnR9dmFyIFdiLHFiLHhCLGtzLE83PXgoKCk9PnthMSgpO2ExKCk7aygpO2soKTtXYj1kcihqYigpLDEpO3FiPS9eIyg/OlswLTlhLWZBLUZdezMsNH0pezEsMn0kLyx4Qj0oKCk9PntjbGFzcyB0e3N0YXRpY3t0aGlzLkRFRkFVTFRfRVJST1JfQ09SUkVDVElPTl9MRVZFTD0iTSJ9c3RhdGlje3RoaXMuREVGQVVMVF9DRU5URVJfSU1BR0VfU0laRT00MH1jb25zdHJ1Y3RvcihlKXt0aGlzLnZpZXdDb250YWluZXJSZWY9ZSx0aGlzLmVycm9yQ29ycmVjdGlvbkxldmVsPXQuREVGQVVMVF9FUlJPUl9DT1JSRUNUSU9OX0xFVkVMLHRoaXMuZGFya0NvbG9yPSIjMDAwMDAwRkYiLHRoaXMubGlnaHRDb2xvcj0iI0ZGRkZGRkZGIix0aGlzLm1hcmdpbj0xNn1uZ09uQ2hhbmdlcygpe3JldHVybiBQZSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoIXRoaXMudmFsdWUpcmV0dXJuO3RoaXMudmVyc2lvbiYmdGhpcy52ZXJzaW9uPjQwPyhjb25zb2xlLndhcm4oIltxckNvZGVdIG1heCB2ZXJzaW9uIGlzIDQwLCBjbGFtcGluZyIpLHRoaXMudmVyc2lvbj00MCk6dGhpcy52ZXJzaW9uJiZ0aGlzLnZlcnNpb248MT8oY29uc29sZS53YXJuKCJbcXJDb2RlXSBtaW4gdmVyc2lvbiBpcyAxLCBjbGFtcGluZyIpLHRoaXMudmVyc2lvbj0xKTp0aGlzLnZlcnNpb24hPT12b2lkIDAmJmlzTmFOKHRoaXMudmVyc2lvbikmJihjb25zb2xlLndhcm4oIltxckNvZGVdIHZlcnNpb24gc2hvdWxkIGJlIHNldCB0byBhIG51bWJlciwgZGVmYXVsdGluZyB0byBhdXRvIiksdGhpcy52ZXJzaW9uPXZvaWQgMCk7bGV0IGU9dGhpcy52aWV3Q29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudDtpZighZSlyZXR1cm47bGV0IGk9ZS5nZXRDb250ZXh0KCIyZCIpO2kmJmkuY2xlYXJSZWN0KDAsMCxpLmNhbnZhcy53aWR0aCxpLmNhbnZhcy5oZWlnaHQpO2xldCBhPXRoaXMuZXJyb3JDb3JyZWN0aW9uTGV2ZWw/P3QuREVGQVVMVF9FUlJPUl9DT1JSRUNUSU9OX0xFVkVMLHI9cWIudGVzdCh0aGlzLmRhcmtDb2xvcik/dGhpcy5kYXJrQ29sb3I6dm9pZCAwLG89cWIudGVzdCh0aGlzLmxpZ2h0Q29sb3IpP3RoaXMubGlnaHRDb2xvcjp2b2lkIDA7UWQoKSYmKCFyJiZ0aGlzLmRhcmtDb2xvciYmY29uc29sZS5lcnJvcigiW25nLXFyY29kZV0gZGFya0NvbG9yIHNldCB0byBpbnZhbGlkIHZhbHVlLCBtdXN0IGJlIFJHQkEgaGV4IGNvbG9yIHN0cmluZywgZWc6ICMzMDUwQTFGRiIpLCFvJiZ0aGlzLmxpZ2h0Q29sb3ImJmNvbnNvbGUuZXJyb3IoIltuZy1xcmNvZGVdIGxpZ2h0Q29sb3Igc2V0IHRvIGludmFsaWQgdmFsdWUsIG11c3QgYmUgUkdCQSBoZXggY29sb3Igc3RyaW5nLCBlZzogIzMwNTBBMTMwIikpLHlpZWxkIFdiLmRlZmF1bHQudG9DYW52YXMoZSx0aGlzLnZhbHVlLHt2ZXJzaW9uOnRoaXMudmVyc2lvbixlcnJvckNvcnJlY3Rpb25MZXZlbDphLHdpZHRoOnRoaXMud2lkdGgsbWFyZ2luOnRoaXMubWFyZ2luLHNjYWxlOnRoaXMucXJTY2FsZSxtYXNrUGF0dGVybjp0aGlzLnFyQ29kZU1hc2tQYXR0ZXJuLGNvbG9yOntkYXJrOnIsbGlnaHQ6b319KTtsZXQgZD10aGlzLmNlbnRlckltYWdlU3JjLHA9R2IodGhpcy5jZW50ZXJJbWFnZVdpZHRoLHQuREVGQVVMVF9DRU5URVJfSU1BR0VfU0laRSksZz1HYih0aGlzLmNlbnRlckltYWdlSGVpZ2h0LHQuREVGQVVMVF9DRU5URVJfSU1BR0VfU0laRSk7aWYoZCYmaSl7dGhpcy5jZW50ZXJJbWFnZXx8KHRoaXMuY2VudGVySW1hZ2U9bmV3IEltYWdlKHAsZykpO2xldCBfPXRoaXMuY2VudGVySW1hZ2U7ZCE9PXRoaXMuY2VudGVySW1hZ2Uuc3JjJiYoXy5zcmM9ZCkscCE9PXRoaXMuY2VudGVySW1hZ2Uud2lkdGgmJihfLndpZHRoPXApLGchPT10aGlzLmNlbnRlckltYWdlLmhlaWdodCYmKF8uaGVpZ2h0PWcpO2xldCB5PSgpPT57aS5kcmF3SW1hZ2UoXyxlLndpZHRoLzItcC8yLGUuaGVpZ2h0LzItZy8yLHAsZyl9O18ub25sb2FkPXksXy5jb21wbGV0ZSYmeSgpfX0pfXN0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpKGl0KEcxKSl9fXN0YXRpY3t0aGlzLlx1MDI3NWRpcj1YKHt0eXBlOnQsc2VsZWN0b3JzOltbImNhbnZhcyIsInFyQ29kZSIsIiJdXSxpbnB1dHM6e3ZhbHVlOlswLCJxckNvZGUiLCJ2YWx1ZSJdLHZlcnNpb246WzAsInFyQ29kZVZlcnNpb24iLCJ2ZXJzaW9uIl0sZXJyb3JDb3JyZWN0aW9uTGV2ZWw6WzAsInFyQ29kZUVycm9yQ29ycmVjdGlvbkxldmVsIiwiZXJyb3JDb3JyZWN0aW9uTGV2ZWwiXSx3aWR0aDoid2lkdGgiLGhlaWdodDoiaGVpZ2h0IixkYXJrQ29sb3I6ImRhcmtDb2xvciIsbGlnaHRDb2xvcjoibGlnaHRDb2xvciIsY2VudGVySW1hZ2VTcmM6WzAsInFyQ29kZUNlbnRlckltYWdlU3JjIiwiY2VudGVySW1hZ2VTcmMiXSxjZW50ZXJJbWFnZVdpZHRoOlswLCJxckNvZGVDZW50ZXJJbWFnZVdpZHRoIiwiY2VudGVySW1hZ2VXaWR0aCJdLGNlbnRlckltYWdlSGVpZ2h0OlswLCJxckNvZGVDZW50ZXJJbWFnZUhlaWdodCIsImNlbnRlckltYWdlSGVpZ2h0Il0sbWFyZ2luOlswLCJxckNvZGVNYXJnaW4iLCJtYXJnaW4iXSxxclNjYWxlOiJxclNjYWxlIixxckNvZGVNYXNrUGF0dGVybjoicXJDb2RlTWFza1BhdHRlcm4ifSxmZWF0dXJlczpbSGVdfSl9fXJldHVybiB0fSkoKTtrcz0oKCk9PntjbGFzcyB0e3N0YXRpY3t0aGlzLlx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfX1zdGF0aWN7dGhpcy5cdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJxci1jb2RlIl1dLGlucHV0czp7dmFsdWU6InZhbHVlIixzaXplOiJzaXplIixzdHlsZToic3R5bGUiLHN0eWxlQ2xhc3M6InN0eWxlQ2xhc3MiLGRhcmtDb2xvcjoiZGFya0NvbG9yIixsaWdodENvbG9yOiJsaWdodENvbG9yIixlcnJvckNvcnJlY3Rpb25MZXZlbDoiZXJyb3JDb3JyZWN0aW9uTGV2ZWwiLGNlbnRlckltYWdlU3JjOiJjZW50ZXJJbWFnZVNyYyIsY2VudGVySW1hZ2VTaXplOiJjZW50ZXJJbWFnZVNpemUiLG1hcmdpbjoibWFyZ2luIixzY2FsZToic2NhbGUiLG1hc2tQYXR0ZXJuOiJtYXNrUGF0dGVybiJ9LGRlY2xzOjEsdmFyczoxLGNvbnN0czpbWzMsInFyQ29kZSIsInFyQ29kZUVycm9yQ29ycmVjdGlvbkxldmVsIiwicXJDb2RlQ2VudGVySW1hZ2VTcmMiLCJxckNvZGVDZW50ZXJJbWFnZVdpZHRoIiwicXJDb2RlQ2VudGVySW1hZ2VIZWlnaHQiLCJxckNvZGVNYXJnaW4iLCJxclNjYWxlIiwicXJDb2RlTWFza1BhdHRlcm4iLCJ3aWR0aCIsImhlaWdodCIsImNsYXNzIiwibmdTdHlsZSIsImRhcmtDb2xvciIsImxpZ2h0Q29sb3IiXSxbMywicXJDb2RlIiwicXJDb2RlRXJyb3JDb3JyZWN0aW9uTGV2ZWwiLCJxckNvZGVDZW50ZXJJbWFnZVNyYyIsInFyQ29kZUNlbnRlckltYWdlV2lkdGgiLCJxckNvZGVDZW50ZXJJbWFnZUhlaWdodCIsInFyQ29kZU1hcmdpbiIsInFyU2NhbGUiLCJxckNvZGVNYXNrUGF0dGVybiIsIndpZHRoIiwiaGVpZ2h0IiwibmdTdHlsZSIsImRhcmtDb2xvciIsImxpZ2h0Q29sb3IiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJk0oMCx5QiwxLDE1LCJjYW52YXMiLDApLGkmMiYmdyhhLnZhbHVlPzA6LTEpfSxkZXBlbmRlbmNpZXM6W3hCLERpLEMwXSxlbmNhcHN1bGF0aW9uOjJ9KX19cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gTUIodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImRpdiIsNSkoMSwicCIsNyksbSgyLCIyRkFfU1VDQ0VTU0ZVTF9TRVRVUCIpLHMoKSxjKDMsImZvcm0iLDgpLFMoIm5nU3VibWl0IixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpO3JldHVybiBUKGEuZGlzYWJsZSgpKX0pLGMoNCwiaDIiLDkpLG0oNSwiUkVNT1ZFX1RXT19GQUNUT1JfQVVUSCIpLHMoKSxjKDYsImRpdiIsMTApLG0oNywiMkZBX1NFVFVQX0VSUk9SIikscygpLGMoOCwibWF0LWZvcm0tZmllbGQiLDExKSg5LCJtYXQtbGFiZWwiLDcpLG0oMTAsIkxBQkVMX0NVUlJFTlRfUEFTU1dPUkQiKSxzKCksdSgxMSwiaW5wdXQiLDEyKSxiKDEyLCJ0cmFuc2xhdGUiKSxzKCksYygxMywiYnV0dG9uIiwxMykoMTQsIm1hdC1pY29uIiksbSgxNSwicmVtb3ZlX3NlbGVjdGlvbiIpLHMoKSxtKDE2KSxiKDE3LCJ0cmFuc2xhdGUiKSxzKCkoKSgpfWlmKHQmMil7bGV0IGU9digpO2woMyksZigiZm9ybUdyb3VwIixlLnR3b0ZhY3RvckRpc2FibGVGb3JtKSxsKDMpLGYoImhpZGRlbiIsIShlLmVycm9yZWQmJiFlLnR3b0ZhY3RvckRpc2FibGVGb3JtLmRpcnR5KSksbCg1KSxmKCJwbGFjZWhvbGRlciIsVmUoQygxMiw2LCJNQU5EQVRPUllfQ1VSUkVOVF9QQVNTV09SRCIpKSksbCgyKSxmKCJkaXNhYmxlZCIsZS50d29GYWN0b3JEaXNhYmxlRm9ybS5pbnZhbGlkKSxsKDMpLEUoIiAiLEMoMTcsOCwiQlROX1JFTU9WRSIpLCIgIil9fWZ1bmN0aW9uIHdCKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJmb3JtIiwxNCksUygibmdTdWJtaXQiLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5zZXR1cCgpKX0pLGMoMSwic3BhbiIsMTUpLG0oMiwiMkZBX0FVVEhfU0VUVVBfSU5TVFJVQ1RJT05TIikscygpLGMoMywiZGl2IiwxNiksdSg0LCJxci1jb2RlIiwxNykscygpLGMoNSwiZGl2IiwxMCksbSg2LCIyRkFfU0VUVVBfRVJST1IiKSxzKCksYyg3LCJtYXQtZm9ybS1maWVsZCIsMTEpKDgsIm1hdC1sYWJlbCIsNyksbSg5LCJMQUJFTF9DVVJSRU5UX1BBU1NXT1JEIikscygpLHUoMTAsImlucHV0IiwxOCksYigxMSwidHJhbnNsYXRlIikscygpLGMoMTIsIm1hdC1mb3JtLWZpZWxkIiwxMSkoMTMsIm1hdC1sYWJlbCIsNyksbSgxNCwiSU5JVElBTF9DT0RFIikscygpLHUoMTUsImlucHV0IiwxOSwwKSxiKDE3LCJ0cmFuc2xhdGUiKSxjKDE4LCJtYXQtZXJyb3IiLDcpLG0oMTksIklOVkFMSURfVFdPX0ZBQ1RPUl9BVVRIX1RPS0VOIikscygpLGMoMjAsIm1hdC1pY29uIiwyMCksYigyMSwidHJhbnNsYXRlIiksbSgyMiwiIGhlbHBfb3V0bGluZSAiKSxzKCksYygyMywibWF0LWhpbnQiLDIxKSxtKDI0KSxzKCkoKSxjKDI1LCJidXR0b24iLDIyKSgyNiwibWF0LWljb24iKSxtKDI3LCJzYXZlIikscygpLG0oMjgpLGIoMjksInRyYW5zbGF0ZSIpLHMoKSgpfWlmKHQmMil7bGV0IGU9c2UoMTYpLGk9digpO2YoImZvcm1Hcm91cCIsaS50d29GYWN0b3JTZXR1cEZvcm0pLGwoNCksZigidmFsdWUiLGkudG90cFVybCkoInNpemUiLDMwMCkoImVycm9yQ29ycmVjdGlvbkxldmVsIiwiTCIpLGwoKSxmKCJoaWRkZW4iLCEoaS5lcnJvcmVkJiYhaS50d29GYWN0b3JTZXR1cEZvcm0uZGlydHkpKSxsKDUpLGYoInBsYWNlaG9sZGVyIixWZShDKDExLDE1LCJNQU5EQVRPUllfQ1VSUkVOVF9QQVNTV09SRCIpKSksbCg1KSxmKCJwbGFjZWhvbGRlciIsVmUoQygxNywxNywiSU5JVElBTF9DT0RFX1BMQUNFSE9MREVSIikpKSxHKCJkYXRhLXRlc3QtdG90cC1zZWNyZXQiLGkudG90cFNlY3JldCksbCg1KSxmKCJtYXRUb29sdGlwIixWZShDKDIxLDE5LCJJTklUSUFMX1RPS0VOX1RPT0xUSVAiKSkpLGwoNCksRSgiIiwoZS52YWx1ZT09bnVsbD9udWxsOmUudmFsdWUubGVuZ3RoKXx8MCwiLzYiKSxsKCksZigiZGlzYWJsZWQiLGkudHdvRmFjdG9yU2V0dXBGb3JtLmludmFsaWQpLGwoMyksRSgiICIsQygyOSwyMSwiQlROX1NBVkUiKSwiICIpfX12YXIgUWIsWWI9eCgoKT0+e2soKTtXZSgpO2g3KCk7SzEoKTtZdCgpO3IxKCk7WHQoKTtXKCk7TXIoKTtKMSgpO3ZpKCk7dmUoKTtuZSgpO2V0KCk7SmUoKTtoZSgpO083KCk7aygpO2hlKCk7VygpO1dlKCk7SmUoKTtldCgpO25lKCk7dmUoKTtMZS5hZGQoXzMscXIpO1FiPSgoKT0+e2NsYXNzIHR7dHdvRmFjdG9yQXV0aFNlcnZpY2U9aChmcyk7Y29uZmlndXJhdGlvblNlcnZpY2U9aChMdCk7c25hY2tCYXI9aChKMik7dHJhbnNsYXRlU2VydmljZT1oKEl0KTtzbmFja0JhckhlbHBlclNlcnZpY2U9aChWdCk7ZGF0YTt0d29GYWN0b3JTZXR1cEZvcm09bmV3IFZuKHtwYXNzd29yZENvbnRyb2w6bmV3IGtlKCIiLFtKLnJlcXVpcmVkXSksaW5pdGlhbFRva2VuQ29udHJvbDpuZXcga2UoIiIsW0oucmVxdWlyZWQsSi5wYXR0ZXJuKCJeW1xcZF17Nn0kIildKX0pO3R3b0ZhY3RvckRpc2FibGVGb3JtPW5ldyBWbih7cGFzc3dvcmRDb250cm9sOm5ldyBrZSgiIixbSi5yZXF1aXJlZF0pfSk7c2V0dXBTdGF0dXM9bnVsbDtlcnJvcmVkPW51bGw7dG90cFVybDt0b3RwU2VjcmV0O3NldHVwVG9rZW47YXBwTmFtZT0iT1dBU1AgSnVpY2UgU2hvcCI7bmdPbkluaXQoKXt0aGlzLnVwZGF0ZVN0YXR1cygpfXVwZGF0ZVN0YXR1cygpe2xldCBlPXRoaXMudHdvRmFjdG9yQXV0aFNlcnZpY2Uuc3RhdHVzKCksaT10aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbigpO3JldHVybiB6bihbZSxpXSkuc3Vic2NyaWJlKHtuZXh0Oihbe3NldHVwOmEsZW1haWw6cixzZWNyZXQ6byxzZXR1cFRva2VuOmR9LHBdKT0+e2lmKHRoaXMuc2V0dXBTdGF0dXM9YSx0aGlzLmFwcE5hbWU9cC5hcHBsaWNhdGlvbi5uYW1lLCFhKXtsZXQgZz1lbmNvZGVVUklDb21wb25lbnQodGhpcy5hcHBOYW1lKTt0aGlzLnRvdHBVcmw9YG90cGF1dGg6Ly90b3RwLyR7Z306JHtyfT9zZWNyZXQ9JHtvfSZpc3N1ZXI9JHtnfWAsdGhpcy50b3RwU2VjcmV0PW8sdGhpcy5zZXR1cFRva2VuPWR9fSxlcnJvcjooKT0+e2NvbnNvbGUubG9nKCJGYWlsZWQgdG8gZmV0Y2ggMmZhIHN0YXR1cyIpfX0pLGV9c2V0dXAoKXt0aGlzLnR3b0ZhY3RvckF1dGhTZXJ2aWNlLnNldHVwKHRoaXMudHdvRmFjdG9yU2V0dXBGb3JtLmdldCgicGFzc3dvcmRDb250cm9sIik/LnZhbHVlLHRoaXMudHdvRmFjdG9yU2V0dXBGb3JtLmdldCgiaW5pdGlhbFRva2VuQ29udHJvbCIpPy52YWx1ZSx0aGlzLnNldHVwVG9rZW4pLnN1YnNjcmliZSh7bmV4dDooKT0+e3RoaXMuc2V0dXBTdGF0dXM9ITAsdGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbigiQ09ORklSTV8yRkFfU0VUVVAiKX0sZXJyb3I6KCk9Pnt0aGlzLnR3b0ZhY3RvclNldHVwRm9ybS5nZXQoInBhc3N3b3JkQ29udHJvbCIpPy5tYXJrQXNQcmlzdGluZSgpLHRoaXMudHdvRmFjdG9yU2V0dXBGb3JtLmdldCgiaW5pdGlhbFRva2VuQ29udHJvbCIpPy5tYXJrQXNQcmlzdGluZSgpLHRoaXMuZXJyb3JlZD0hMH19KX1kaXNhYmxlKCl7dGhpcy50d29GYWN0b3JBdXRoU2VydmljZS5kaXNhYmxlKHRoaXMudHdvRmFjdG9yRGlzYWJsZUZvcm0uZ2V0KCJwYXNzd29yZENvbnRyb2wiKT8udmFsdWUpLnN1YnNjcmliZSh7bmV4dDooKT0+e3RoaXMudXBkYXRlU3RhdHVzKCkuc3Vic2NyaWJlKCgpPT57dGhpcy5zZXR1cFN0YXR1cz0hMX0pLHRoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oIkNPTkZJUk1fMkZBX0RJU0FCTEUiKX0sZXJyb3I6KCk9Pnt0aGlzLnR3b0ZhY3RvckRpc2FibGVGb3JtLmdldCgicGFzc3dvcmRDb250cm9sIik/Lm1hcmtBc1ByaXN0aW5lKCksdGhpcy5lcnJvcmVkPSEwfX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC10d28tZmFjdG9yLWF1dGgiXV0sZGVjbHM6Nyx2YXJzOjEsY29uc3RzOltbImluaXRUb2tlbiIsIiJdLFsxLCJjZW50ZXItY29udGFpbmVyIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1lbGV2YXRpb24tejYiXSxbMSwibWRjLWNhcmQiXSxbImlkIiwiMmZhLXNldHVwLXRpdGxlIiwidHJhbnNsYXRlIiwiIl0sWyJpZCIsIjJmYS1zZXR1cC1zdWNjZXNzZnVsbHkiXSxbImlkIiwidHdvLWZhY3Rvci1hdXRoLXNldHVwIiwxLCJmb3JtLWNvbnRhaW5lciIsMywiZm9ybUdyb3VwIl0sWyJ0cmFuc2xhdGUiLCIiXSxbImlkIiwidHdvLWZhY3Rvci1hdXRoLWRpc2FibGUiLDEsImZvcm0tY29udGFpbmVyIiwzLCJuZ1N1Ym1pdCIsImZvcm1Hcm91cCJdLFsiaWQiLCJ0d28tZmFjdG9yLWF1dGgtZGlzYWJsZS10aXRsZSIsInRyYW5zbGF0ZSIsIiJdLFsidHJhbnNsYXRlIiwiIiwxLCJlcnJvciIsMywiaGlkZGVuIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZSIsImNvbG9yIiwiYWNjZW50Il0sWyJpZCIsImN1cnJlbnRQYXNzd29yZERpc2FibGUiLCJmb3JtQ29udHJvbE5hbWUiLCJwYXNzd29yZENvbnRyb2wiLCJ0eXBlIiwicGFzc3dvcmQiLCJtYXRJbnB1dCIsIiIsImFyaWEtbGFiZWwiLCJGaWVsZCB0byBlbnRlciB0aGUgY3VycmVudCBwYXNzd29yZCIsImF1dG9jb21wbGV0ZSIsIm9mZiIsMywicGxhY2Vob2xkZXIiXSxbInR5cGUiLCJzdWJtaXQiLCJpZCIsImRpc2FibGVUd29GYWN0b3JBdXRoIiwibWF0LXJhaXNlZC1idXR0b24iLCIiLCJjb2xvciIsIndhcm4iLCJhcmlhLWxhYmVsIiwiQnV0dG9uIHRvIHJlbW92ZSB0aGUgdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbiIsMywiZGlzYWJsZWQiXSxbImlkIiwidHdvLWZhY3Rvci1hdXRoLXNldHVwIiwxLCJmb3JtLWNvbnRhaW5lciIsMywibmdTdWJtaXQiLCJmb3JtR3JvdXAiXSxbImlkIiwiMmZhLXNldHVwLWluc3RydWN0aW9ucyIsInRyYW5zbGF0ZSIsIiJdLFsxLCJ0d28tZmFjdG9yLXFyLWNvZGUiLCJjZW50ZXItY29udGFpbmVyIl0sWzMsInZhbHVlIiwic2l6ZSIsImVycm9yQ29ycmVjdGlvbkxldmVsIl0sWyJpZCIsImN1cnJlbnRQYXNzd29yZFNldHVwIiwiZm9ybUNvbnRyb2xOYW1lIiwicGFzc3dvcmRDb250cm9sIiwidHlwZSIsInBhc3N3b3JkIiwibWF0SW5wdXQiLCIiLCJhcmlhLWxhYmVsIiwiRmllbGQgdG8gZW50ZXIgdGhlIGN1cnJlbnQgcGFzc3dvcmQiLCJhdXRvY29tcGxldGUiLCJvZmYiLDMsInBsYWNlaG9sZGVyIl0sWyJpZCIsImluaXRpYWxUb2tlbiIsImZvcm1Db250cm9sTmFtZSIsImluaXRpYWxUb2tlbkNvbnRyb2wiLCJ0eXBlIiwidGV4dCIsIm1hdElucHV0IiwiIiwiYXJpYS1sYWJlbCIsIkZpZWxkIHRvIGVudGVyIHRoZSBpbml0aWFsIHRva2VuLiBUaGlzIG11c3QgaGF2ZSA2IGRpZ2l0cy4iLCJtaW5sZW5ndGgiLCI2IiwibWF4bGVuZ3RoIiwiNiIsInBhdHRlcm4iLCJeW1xcZF17Nn0kIiwzLCJwbGFjZWhvbGRlciJdLFsibWF0U3VmZml4IiwiIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwicmlnaHQiLCJhcmlhLWxhYmVsIiwiVGhlIHRva2VuIHRvIGJlIGVudGVyZWQgZnJvbSB0aGUgYXV0aGVudGljYXRvciBtdXN0IGhhdmUgNiBkaWdpdHMuIiwzLCJtYXRUb29sdGlwIl0sWyJhbGlnbiIsImVuZCJdLFsidHlwZSIsInN1Ym1pdCIsImlkIiwic2V0dXBUd29GYWN0b3JBdXRoIiwibWF0LXJhaXNlZC1idXR0b24iLCIiLCJjb2xvciIsInByaW1hcnkiLCJhcmlhLWxhYmVsIiwiQnV0dG9uIHRvIGNvbXBsZXRlIHRoZSB0d28tZmFjdG9yIGNvbmZpZ3VyYXRpb24iLDMsImRpc2FibGVkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJkaXYiLDEpKDEsIm1hdC1jYXJkIiwyKSgyLCJkaXYiLDMpKDMsImgxIiw0KSxtKDQsIlRJVExFX1RXT19GQUNUT1JfQVVUSF9DT05GSUciKSxzKCksTSg1LE1CLDE4LDEwLCJkaXYiLDUpKDYsd0IsMzAsMjMsImZvcm0iLDYpLHMoKSgpKCkpLGkmMiYmKGwoNSksdyhhLnNldHVwU3RhdHVzPT09ITA/NTo2KSl9LGRlcGVuZGVuY2llczpbZGUscGUsWSxTZSxhdCxnMixndCxtdCx1MixMMCxNaSx6cix6dCxiYSxTcixRZSxaZSxodCxmMSxRdCx2MiwkZSxudCxvZSxsZSxrcyxnZSxDZSxSdCxLXSxzdHlsZXM6W2BtYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTozcmVtO21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG87bWluLXdpZHRoOjMyMHB4O3dpZHRoOjMwJX1tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy10b3A6LjYyNXJlbX0uZm9ybS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47cG9zaXRpb246cmVsYXRpdmV9I3NldHVwVHdvRmFjdG9yQXV0aFtfbmdjb250ZW50LSVDT01QJV0sICNkaXNhYmxlVHdvRmFjdG9yQXV0aFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MjAlO21hcmdpbi10b3A6MnJlbTt3aWR0aDo2MCV9LnR3by1mYWN0b3ItcXItY29kZVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjEuNXJlbSAwfSN0d28tZmFjdG9yLWF1dGgtZGlzYWJsZVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDoycmVtfSN0d28tZmFjdG9yLWF1dGgtZGlzYWJsZS10aXRsZVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTowfWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouMTI1cmVtfS5jZW50ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpzdHJldGNoO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgenMsSDc9eCgoKT0+e1d0KCk7TnQoKTtrKCk7bHQoKTtrKCk7enM9KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtnZXRDYXB0Y2hhKCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0U2VydmVyKyIvcmVzdC9pbWFnZS1jYXB0Y2hhLyIpLnBpcGUoaihlPT57dGhyb3cgZX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO3ZhciBUcyxONz14KCgpPT57TnQoKTtXdCgpO2soKTtsdCgpO2soKTtUcz0oKCk9PntjbGFzcyB0e2h0dHA9aChBZSk7aG9zdFNlcnZlcj11ZS5ob3N0U2VydmVyO2hvc3Q9dGhpcy5ob3N0U2VydmVyKyIvcmVzdC91c2VyIjtlcmFzZShlKXtyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5ob3N0KyIvZXJhc3VyZS1yZXF1ZXN0IixlKS5waXBlKGooaT0+e3Rocm93IGl9KSl9ZGF0YUV4cG9ydChlKXtyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5ob3N0KyIvZGF0YS1leHBvcnQiLGUpLnBpcGUoaihpPT57dGhyb3cgaX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIGtCKHQsbil7aWYodCYxJiYoYygwLCJkaXYiKSgxLCJwIiwxNCksbSgyKSxzKCkoKSksdCYyKXtsZXQgZT12KCk7bCgyKSxBKGUuZXJyb3IpfX1mdW5jdGlvbiB6Qih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiw0KSxtKDEsIk1BTkRBVE9SWV9DQVBUQ0hBICIpLHMoKSl9ZnVuY3Rpb24gVEIodCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsNCksbSgxLCJNQU5EQVRPUllfQ0FQVENIQSAiKSxzKCkpfWZ1bmN0aW9uIEVCKHQsbil7aWYodCYxJiYoYygwLCJkaXYiKSgxLCJkaXYiKSgyLCJzcGFuIiwxNSksbSgzLCJDQVBUQ0hBICIpLGMoNCwic3BhbiIpLG0oNSwiOiIpLHMoKSgpLHUoNiwiZGl2IiwxNikscygpLGMoNywibWF0LWZvcm0tZmllbGQiLDE3KSg4LCJtYXQtbGFiZWwiLDQpLG0oOSwiRU5URVJfQ0FQVENIQSIpLHMoKSx1KDEwLCJpbnB1dCIsMTgsMCksYigxMiwidHJhbnNsYXRlIiksYygxMywibWF0LWhpbnQiLDE5KSxtKDE0KSxzKCksTSgxNSx6QiwyLDAsIm1hdC1lcnJvciIsNCksTSgxNixUQiwyLDAsIm1hdC1lcnJvciIsNCkscygpKCkpLHQmMil7bGV0IGU9c2UoMTEpLGk9digpO2woNiksZigiaW5uZXJIVE1MIixpLmNhcHRjaGEsdHQpLGwoNCksZigicGxhY2Vob2xkZXIiLFZlKGR0KDEyLDcsIlRZUEVfVEhFU0VfTEVUVEVSUyIsU3QoMTAsU0IpKSkpKCJmb3JtQ29udHJvbCIsaS5jYXB0Y2hhQ29udHJvbCksbCg0KSxFKCIiLChlLnZhbHVlPT1udWxsP251bGw6ZS52YWx1ZS5sZW5ndGgpfHwwLCIvNSIpLGwoKSx3KGkuY2FwdGNoYUNvbnRyb2wuaW52YWxpZCYmaS5jYXB0Y2hhQ29udHJvbC5lcnJvcnMucmVxdWlyZWQ/MTU6LTEpLGwoKSx3KGkuY2FwdGNoYUNvbnRyb2wuaW52YWxpZCYmaS5jYXB0Y2hhQ29udHJvbC5lcnJvcnMubWlubGVuZ3RoPzE2Oi0xKX19dmFyIFNCLFpiLCRiPXgoKCk9PntrKCk7V2UoKTtINygpO043KCk7aGEoKTtuZSgpO2V0KCk7SmUoKTtHbigpO1coKTtoZSgpO3ZlKCk7aygpO2hlKCk7VygpO1dlKCk7SmUoKTtldCgpO25lKCk7dmUoKTtTQj0oKT0+KHtsZW5ndGg6IjUifSk7WmI9KCgpPT57Y2xhc3MgdHtzYW5pdGl6ZXI9aChaMSk7aW1hZ2VDYXB0Y2hhU2VydmljZT1oKHpzKTtkYXRhU3ViamVjdFNlcnZpY2U9aChUcyk7Y2FwdGNoYUNvbnRyb2w9bmV3IGtlKCIiLFtKLnJlcXVpcmVkLEoubWluTGVuZ3RoKDUpXSk7Zm9ybWF0Q29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWRdKTtjYXB0Y2hhO2RhdGFSZXF1ZXN0PXZvaWQgMDtjb25maXJtYXRpb247ZXJyb3I7bGFzdFN1Y2Nlc3NmdWxUcnk7cHJlc2VuY2VPZkNhcHRjaGE9ITE7dXNlckRhdGE7bmdPbkluaXQoKXt0aGlzLm5lZWRDYXB0Y2hhKCksdGhpcy5kYXRhUmVxdWVzdD17fX1uZWVkQ2FwdGNoYSgpe2xldCBlPW5ldyBEYXRlLGk9bG9jYWxTdG9yYWdlLmdldEl0ZW0oImxzdGR0eHBydCIpP25ldyBEYXRlKEpTT04ucGFyc2UoU3RyaW5nKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJsc3RkdHhwcnQiKSkpKTpuZXcgRGF0ZSgwKTtlLmdldFRpbWUoKS1pLmdldFRpbWUoKTwzZTUmJih0aGlzLmdldE5ld0NhcHRjaGEoKSx0aGlzLnByZXNlbmNlT2ZDYXB0Y2hhPSEwKX1nZXROZXdDYXB0Y2hhKCl7dGhpcy5pbWFnZUNhcHRjaGFTZXJ2aWNlLmdldENhcHRjaGEoKS5zdWJzY3JpYmUoZT0+e3RoaXMuY2FwdGNoYT10aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChlLmltYWdlKX0pfXNhdmUoKXt0aGlzLnByZXNlbmNlT2ZDYXB0Y2hhJiYodGhpcy5kYXRhUmVxdWVzdC5hbnN3ZXI9dGhpcy5jYXB0Y2hhQ29udHJvbC52YWx1ZSksdGhpcy5kYXRhUmVxdWVzdC5mb3JtYXQ9dGhpcy5mb3JtYXRDb250cm9sLnZhbHVlLHRoaXMuZGF0YVN1YmplY3RTZXJ2aWNlLmRhdGFFeHBvcnQodGhpcy5kYXRhUmVxdWVzdCkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLmVycm9yPW51bGwsdGhpcy5jb25maXJtYXRpb249ZS5jb25maXJtYXRpb24sdGhpcy51c2VyRGF0YT1lLnVzZXJEYXRhLHdpbmRvdy5vcGVuKCIiLCJfYmxhbmsiLCJ3aWR0aD01MDAiKT8uZG9jdW1lbnQud3JpdGUodGhpcy51c2VyRGF0YSksdGhpcy5sYXN0U3VjY2Vzc2Z1bFRyeT1uZXcgRGF0ZSxsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibHN0ZHR4cHJ0IixKU09OLnN0cmluZ2lmeSh0aGlzLmxhc3RTdWNjZXNzZnVsVHJ5KSksdGhpcy5uZ09uSW5pdCgpLHRoaXMucmVzZXRGb3JtKCl9LGVycm9yOmU9Pnt0aGlzLmVycm9yPWUuZXJyb3IsdGhpcy5jb25maXJtYXRpb249bnVsbCx0aGlzLnJlc2V0Rm9ybUVycm9yKCl9fSl9cmVzZXRGb3JtKCl7dGhpcy5jYXB0Y2hhQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKSx0aGlzLmNhcHRjaGFDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5jYXB0Y2hhQ29udHJvbC5zZXRWYWx1ZSgiIiksdGhpcy5mb3JtYXRDb250cm9sLm1hcmtBc1VudG91Y2hlZCgpLHRoaXMuZm9ybWF0Q29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMuZm9ybWF0Q29udHJvbC5zZXRWYWx1ZSgiIil9cmVzZXRGb3JtRXJyb3IoKXt0aGlzLmNhcHRjaGFDb250cm9sLm1hcmtBc1VudG91Y2hlZCgpLHRoaXMuY2FwdGNoYUNvbnRyb2wubWFya0FzUHJpc3RpbmUoKSx0aGlzLmNhcHRjaGFDb250cm9sLnNldFZhbHVlKCIiKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtZGF0YS1leHBvcnQiXV0sZGVjbHM6MjYsdmFyczo3LGNvbnN0czpbWyJjYXB0Y2hhSW5wdXQiLCIiXSxbMSwiY2VudGVyLWNvbnRhaW5lciJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJtYXQtZWxldmF0aW9uLXo2Il0sWzEsIm1kYy1jYXJkIl0sWyJ0cmFuc2xhdGUiLCIiXSxbImlkIiwiZGF0YS1leHBvcnQtZm9ybSIsMSwiZm9ybS1jb250YWluZXIiXSxbImlkIiwiZm9ybWF0Q29udHJvbCIsImFyaWEtbGFiZWwiLCJTZWxlY3QgYW4gb3B0aW9uIiwzLCJmb3JtQ29udHJvbCJdLFsidHJhbnNsYXRlIiwiIiwxLCJyYWRpby1sYWJlbCJdLFsidmFsdWUiLCIxIiwiYXJpYS1sYWJlbCIsIkV4cG9ydCBPcHRpb24gSlNPTiJdLFsidmFsdWUiLCIyIiwiYXJpYS1sYWJlbCIsIkV4cG9ydCBPcHRpb24gUERGIiwiZGlzYWJsZWQiLCIiXSxbInZhbHVlIiwiMyIsImFyaWEtbGFiZWwiLCJFeHBvcnQgT3B0aW9uIEV4Y2VsIiwiZGlzYWJsZWQiLCIiXSxbInR5cGUiLCJzdWJtaXQiLCJpZCIsInN1Ym1pdEJ1dHRvbiIsImNvbG9yIiwicHJpbWFyeSIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsIkJ1dHRvbiB0byBzZW5kIHRoZSByZXF1ZXN0IiwzLCJjbGljayIsImRpc2FibGVkIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLCJmb250SWNvbiIsImZpbGVfZG93bmxvYWQiXSxbMSwiaGludCJdLFsxLCJlcnJvciJdLFsidHJhbnNsYXRlIiwiIiwxLCJjYXB0Y2hhLWxhYmVsIl0sWzEsImNhcHRjaGEtaW1hZ2UiLDMsImlubmVySFRNTCJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmUiLCJjb2xvciIsImFjY2VudCIsMSwiY2FwdGNoYS1pbnB1dC1maWVsZCJdLFsidHlwZSIsInRleHQiLCJtYXRJbnB1dCIsIiIsIm1heGxlbmd0aCIsIjUiLCJhcmlhLWxhYmVsIiwiSW5wdXQgZm9yIHRoZSBDQVBUQ0hBIiwzLCJmb3JtQ29udHJvbCIsInBsYWNlaG9sZGVyIl0sWyJhbGlnbiIsImVuZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwiZGl2IiwxKSgxLCJtYXQtY2FyZCIsMikoMiwiZGl2IiwzKSgzLCJoMSIsNCksbSg0LCJUSVRMRV9SRVFVRVNUX0RBVEFfRVhQT1JUIikscygpLE0oNSxrQiwzLDEsImRpdiIpLGMoNiwiZGl2Iiw1KSg3LCJtYXQtcmFkaW8tZ3JvdXAiLDYpKDgsIm1hdC1sYWJlbCIsNyksbSg5LCJFWFBPUlRfTEFCRUwgIiksYygxMCwic3BhbiIpLG0oMTEsIjoiKSxzKCkoKSxjKDEyLCJtYXQtcmFkaW8tYnV0dG9uIiw4KSxtKDEzLCJKU09OIikscygpLGMoMTQsIm1hdC1yYWRpby1idXR0b24iLDkpLG0oMTUsIlBERiIpLHMoKSxjKDE2LCJtYXQtcmFkaW8tYnV0dG9uIiwxMCksbSgxNywiRXhjZWwiKSxzKCkoKSxNKDE4LEVCLDE3LDExLCJkaXYiKSxzKCksYygxOSwiYnV0dG9uIiwxMSksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIGEuc2F2ZSgpfSksdSgyMCwibWF0LWljb24iLDEyKSxtKDIxKSxiKDIyLCJ0cmFuc2xhdGUiKSxzKCksYygyMywicCIsMTMpKDI0LCJzcGFuIiw0KSxtKDI1LCJEQVRBX0VYUE9SVF9ISU5UIikscygpKCkoKSgpKCkpLGkmMiYmKGwoNSksdyhhLmVycm9yPzU6LTEpLGwoMiksZigiZm9ybUNvbnRyb2wiLGEuZm9ybWF0Q29udHJvbCksbCgxMSksdyhhLnByZXNlbmNlT2ZDYXB0Y2hhPzE4Oi0xKSxsKCksZigiZGlzYWJsZWQiLGEuZm9ybWF0Q29udHJvbC5pbnZhbGlkfHxhLmNhcHRjaGFDb250cm9sLmludmFsaWQmJmEucHJlc2VuY2VPZkNhcHRjaGEpLGwoMiksRSgiICIsQygyMiw1LCJCVE5fUkVRVUVTVCIpLCIgIikpfSxkZXBlbmRlbmNpZXM6W2RlLHBlLFksU2UsaTgsYXQsZ3QsbXQsTWksenQsZTEsaHQsQzIsUWUsWmUsZjEsUXQsJGUsbnQsb2UsbGUsZ2UsQ2UsS10sc3R5bGVzOltgbWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDphdXRvO21hcmdpbi1ib3R0b206M3JlbTttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvO21pbi13aWR0aDozMjBweDt3aWR0aDoyNSV9I3N1Ym1pdEJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MjAlO21hcmdpbi10b3A6MnJlbTt3aWR0aDo2MCV9LmhpbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTBweDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOi4yNXJlbX0ubWF0LW1kYy1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdIH4gLm1hdC1tZGMtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjFyZW07bWFyZ2luLWxlZnQ6MXJlbX0ucmFkaW8tbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjUwMDttYXJnaW4tcmlnaHQ6LjVyZW19LmNhcHRjaGEtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2Zsb2F0OmxlZnQ7Zm9udC13ZWlnaHQ6NTAwO21hcmdpbi1ib3R0b206MS4yNXJlbTttYXJnaW4tdG9wOjIuNXJlbX0uY2FwdGNoYS1pbWFnZVtfbmdjb250ZW50LSVDT01QJV17ZmxvYXQ6bGVmdDttYXJnaW4tYm90dG9tOi42MjVyZW07bWFyZ2luLWxlZnQ6LjYyNXJlbTttYXJnaW4tdG9wOjEuMjVyZW19LmNhcHRjaGEtaW5wdXQtZmllbGRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjYyNXJlbTt3aWR0aDoxMDAlfS5jZW50ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpzdHJldGNoO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgS2IsWGIsSmI9eCgoKT0+e2soKTtoYSgpO0tiPWRyKEFtKCkpO1coKTtoZSgpO2soKTtoZSgpO1coKTtYYj0oKCk9PntjbGFzcyB0e3Nhbml0aXplcj1oKFoxKTtsYXN0TG9naW5JcD0iPyI7bmdPbkluaXQoKXt0cnl7dGhpcy5wYXJzZUF1dGhUb2tlbigpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX1wYXJzZUF1dGhUb2tlbigpe2xldCBlPXt9LGk9bG9jYWxTdG9yYWdlLmdldEl0ZW0oInRva2VuIik7aSYmKGU9KDAsS2IuZGVmYXVsdCkoaSksZS5kYXRhLmxhc3RMb2dpbklwJiYodGhpcy5sYXN0TG9naW5JcD10aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChgPHNtYWxsPiR7ZS5kYXRhLmxhc3RMb2dpbklwfTwvc21hbGw+YCkpKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtbGFzdC1sb2dpbi1pcCJdXSxkZWNsczo4LHZhcnM6MSxjb25zdHM6W1siYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJpcENhcmQiLCJtYXQtZWxldmF0aW9uLXo2Il0sWyJ0cmFuc2xhdGUiLCIiXSxbMywiaW5uZXJIVE1MIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYWluIikoMSwibWF0LWNhcmQiLDApKDIsImgxIiwxKSxtKDMsIkxBU1RfTE9HSU5fSVAiKSxzKCksYyg0LCJkbCIpKDUsImR0IiwxKSxtKDYsIklQX0FERFJFU1MiKSxzKCksdSg3LCJkZCIsMikscygpKCkoKSksaSYyJiYobCg3KSxmKCJpbm5lckhUTUwiLGEubGFzdExvZ2luSXAsdHQpKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxZLFNlXSxzdHlsZXM6W2AuaXBDYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO21hcmdpbjowIGF1dG8gNSU7bWluLXdpZHRoOjMyMHB4O3BhZGRpbmc6MXJlbTt3aWR0aDoyNSV9ZGxbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6Z3JpZDtnYXA6LjVyZW07Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gMWZyfWRkW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MH0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIGVDLHRDPXgoKCk9PntrKCk7YTEoKTtLMSgpO3FpKCk7VygpO2hlKCk7aygpO2hlKCk7VygpO2VDPSgoKT0+e2NsYXNzIHR7X2RvY3VtZW50PWgoanQpO2NvbmZpZ3VyYXRpb25TZXJ2aWNlPWgoTHQpO2FwcGxpY2F0aW9uTmFtZT0iT1dBU1AgSnVpY2UgU2hvcCI7cHJpdmFjeUNvbnRhY3RFbWFpbDthcHBsaWNhdGlvblVybDtuZ09uSW5pdCgpe3RoaXMuYXBwbGljYXRpb25Vcmw9dGhpcy5fZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wrIi8vIit0aGlzLl9kb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSx0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbigpLnN1YnNjcmliZSh7bmV4dDplPT57ZT8uYXBwbGljYXRpb24/Lm5hbWUmJih0aGlzLmFwcGxpY2F0aW9uTmFtZT1lLmFwcGxpY2F0aW9uLm5hbWUpLGU/LmFwcGxpY2F0aW9uPy5wcml2YWN5Q29udGFjdEVtYWlsP3RoaXMucHJpdmFjeUNvbnRhY3RFbWFpbD1lLmFwcGxpY2F0aW9uLnByaXZhY3lDb250YWN0RW1haWw6dGhpcy5wcml2YWN5Q29udGFjdEVtYWlsPWBkb25vdHJlcGx5QCR7dGhpcy5fZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWV9YH0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1wcml2YWN5LXBvbGljeSJdXSxkZWNsczoxNzEsdmFyczoxMixjb25zdHM6W1siYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJtYXQtZWxldmF0aW9uLXo2Il0sWzEsIm1kYy1jYXJkIl0sWzEsInByaXZhY3ktcG9saWN5Il0sWzEsImhvdCJdLFsiaHJlZiIsImh0dHBzOi8vd3d3LmZyZWVwcml2YWN5cG9saWN5LmNvbS8iLCJhcmlhLWxhYmVsIiwiTGluayB0byB0aGUgcGFnZSB3aGVyZSB0aGUgcHJpdmFjeSBwb2xpY3kgd2FzIGNyZWF0ZWQiXSxbMSwiZGl2aWRlciJdLFsic3JjIiwiYXNzZXRzL3B1YmxpYy9pbWFnZXMvcGFkZGluZy84MXB4LnBuZyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwibWF0LWNhcmQiLDApKDEsImRpdiIsMSkoMiwic2VjdGlvbiIsMikoMywiaDEiKSxtKDQpLGIoNSwidHJhbnNsYXRlIikscygpLGMoNiwicCIpLG0oNywiRWZmZWN0aXZlIGRhdGU6IE1hcmNoIDE1LCAyMDE5IikscygpLGMoOCwicCIpLG0oOSksYygxMCwic3BhbiIsMyksbSgxMSkscygpLG0oMTIsJyB3ZWJzaXRlICh0aGUgIlNlcnZpY2UiKS4nKSxzKCksYygxMywicCIpLG0oMTQpLGMoMTUsImEiLDQpLG0oMTYsIkZyZWUgUHJpdmFjeSBQb2xpY3kgd2Vic2l0ZSIpLHMoKSxtKDE3LCIuIikscygpLGMoMTgsInAiKSxtKDE5KSxzKCksdSgyMCwibWF0LWRpdmlkZXIiLDUpLGMoMjEsImgyIiksbSgyMiwiQS4gSW5mb3JtYXRpb24gQ29sbGVjdGlvbiBBbmQgVXNlIikscygpLGMoMjMsInAiKSxtKDI0LCJXZSBjb2xsZWN0IHNldmVyYWwgZGlmZmVyZW50IHR5cGVzIG9mIGluZm9ybWF0aW9uIGZvciB2YXJpb3VzIHB1cnBvc2VzIHRvIHByb3ZpZGUgYW5kIGltcHJvdmUgb3VyIFNlcnZpY2UgdG8geW91LiIpLHMoKSxjKDI1LCJoMyIpLG0oMjYsIkExLiBUeXBlcyBvZiBEYXRhIENvbGxlY3RlZCIpLHMoKSxjKDI3LCJoNCIpLG0oMjgsIkExLjEgUGVyc29uYWwgRGF0YSIpLHMoKSxjKDI5LCJwIiksbSgzMCwnV2hpbGUgdXNpbmcgb3VyIFNlcnZpY2UsIHdlIG1heSBhc2sgeW91IHRvIHByb3ZpZGUgdXMgd2l0aCBjZXJ0YWluIHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udGFjdCBvciBpZGVudGlmeSB5b3UgKCJQZXJzb25hbCBEYXRhIikuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uIG1heSBpbmNsdWRlLCBidXQgaXMgbm90IGxpbWl0ZWQgdG86JykscygpLGMoMzEsInVsIikoMzIsImxpIiksbSgzMywiRW1haWwgYWRkcmVzcyIpLHMoKSxjKDM0LCJsaSIpLG0oMzUsIkFkZHJlc3MsIFN0YXRlLCBQcm92aW5jZSwgWklQL1Bvc3RhbCBjb2RlLCBDaXR5IikscygpLGMoMzYsImxpIiksbSgzNywiQ29va2llcyBhbmQgVXNhZ2UgRGF0YSIpLHMoKSgpLGMoMzgsImg0IiksbSgzOSwiQTEuMiBVc2FnZSBEYXRhIikscygpLGMoNDAsInAiKSg0MSwic3BhbiIsMyksbSg0MiwiV2UgbWF5IGFsc28iKSxzKCksbSg0MyxgIGNvbGxlY3QgaW5mb3JtYXRpb24gaG93IHRoZSBTZXJ2aWNlIGlzIGFjY2Vzc2VkIGFuZCB1c2VkICgiVXNhZ2UgRGF0YSIpLiBUaGlzIFVzYWdlIERhdGEgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24gc3VjaCBhcyB5b3VyIGNvbXB1dGVyJ3MgSW50ZXJuZXQgUHJvdG9jb2wgYWRkcmVzcyAoZS5nLiBJUCBhZGRyZXNzKSwgYnJvd3NlciB0eXBlLCBicm93c2VyIHZlcnNpb24sIHRoZSBwYWdlcyBvZiBvdXIgU2VydmljZSB0aGF0IHlvdSB2aXNpdCwgdGhlIHRpbWUgYW5kIGRhdGUgb2YgeW91ciB2aXNpdCwgdGhlIHRpbWUgc3BlbnQgb24gdGhvc2UgcGFnZXMsIHVuaXF1ZSBkZXZpY2UgaWRlbnRpZmllcnMgYW5kIG90aGVyIGRpYWdub3N0aWMgZGF0YS5gKSxzKCksYyg0NCwiaDQiKSxtKDQ1LCJBMS4zIFRyYWNraW5nICYgQ29va2llcyBEYXRhIikscygpLGMoNDYsInAiKSxtKDQ3LCJXZSB1c2UgY29va2llcyBhbmQgc2ltaWxhciB0cmFja2luZyB0ZWNobm9sb2dpZXMgdG8gdHJhY2sgdGhlIGFjdGl2aXR5IG9uIG91ciBTZXJ2aWNlIGFuZCBob2xkIGNlcnRhaW4gaW5mb3JtYXRpb24uIikscygpLGMoNDgsInAiKSxtKDQ5LCJDb29raWVzIGFyZSBmaWxlcyB3aXRoIHNtYWxsIGFtb3VudCBvZiBkYXRhIHdoaWNoIG1heSBpbmNsdWRlIGFuIGFub255bW91cyB1bmlxdWUgaWRlbnRpZmllci4gQ29va2llcyBhcmUgc2VudCB0byB5b3VyIGJyb3dzZXIgZnJvbSBhIHdlYnNpdGUgYW5kIHN0b3JlZCBvbiB5b3VyIGRldmljZS4gVHJhY2tpbmcgdGVjaG5vbG9naWVzIGFsc28gdXNlZCBhcmUgYmVhY29ucywgdGFncywgYW5kIHNjcmlwdHMgdG8gY29sbGVjdCBhbmQgdHJhY2sgaW5mb3JtYXRpb24gYW5kIHRvIGltcHJvdmUgYW5kIGFuYWx5emUgb3VyIFNlcnZpY2UuIikscygpLGMoNTAsInAiKSxtKDUxLCJZb3UgY2FuICIpLGMoNTIsInNwYW4iLDMpLG0oNTMsImluc3RydWN0IHlvdSIpLHMoKSxtKDU0LCJyIGJyb3dzZXIgIiksYyg1NSwic3BhbiIsMyksbSg1NiwidG8gcmVmdXNlIGFsbCIpLHMoKSxtKDU3LCIgY29va2llcyBvciB0byBpbmRpY2F0ZSB3aGVuIGEgY29va2llIGlzIGJlaW5nIHNlbnQuIEhvd2V2ZXIsIGlmIHlvdSBkbyBub3QgYWNjZXB0IGNvb2tpZXMsIHlvdSBtYXkgbm90IGJlIGFibGUgdG8gdXNlIHNvbWUgcG9ydGlvbnMgb2Ygb3VyIFNlcnZpY2UuIikscygpLGMoNTgsInAiKSxtKDU5LCJFeGFtcGxlcyBvZiBDb29raWVzIHdlIHVzZToiKSxzKCksYyg2MCwidWwiKSg2MSwibGkiKSg2Miwic3Ryb25nIiksbSg2MywiU2Vzc2lvbiBDb29raWVzOiIpLHMoKSxtKDY0LCIgXHhBMFdlIHVzZSBTZXNzaW9uIENvb2tpZXMgdG8gb3BlcmF0ZSBvdXIgU2VydmljZS4iKSxzKCksYyg2NSwibGkiKSg2Niwic3Ryb25nIiksbSg2NywiUHJlZmVyZW5jZSBDb29raWVzOiIpLHMoKSxtKDY4LCJceEEwV2UgdXNlIFByZWZlcmVuY2UgQ29va2llcyB0byByZW1lbWJlciB5b3VyIHByZWZlcmVuY2VzIGFuZCB2YXJpb3VzIHNldHRpbmdzLiAiKSxzKCksYyg2OSwibGkiKSg3MCwic3Ryb25nIiksbSg3MSwiU2VjdXJpdHkgQ29va2llczoiKSxzKCksbSg3MiwiXHhBMFdlIHVzZSBTZWN1cml0eSBDb29raWVzIGZvciBzZWN1cml0eSBwdXJwb3Nlcy4iKSxzKCkoKSxjKDczLCJoMyIpLG0oNzQsIkEyLiBVc2Ugb2YgRGF0YSIpLHMoKSxjKDc1LCJwIiksbSg3NikscygpLGMoNzcsInVsIikoNzgsImxpIiksbSg3OSwiVG8gcHJvdmlkZSBhbmQgbWFpbnRhaW4gdGhlIFNlcnZpY2UiKSxzKCksYyg4MCwibGkiKSxtKDgxLCJUbyBub3RpZnkgeW91IGFib3V0IGNoYW5nZXMgdG8gb3VyIFNlcnZpY2UiKSxzKCksYyg4MiwibGkiKSxtKDgzLCJUbyBhbGxvdyB5b3UgdG8gcGFydGljaXBhdGUgaW4gaW50ZXJhY3RpdmUgZmVhdHVyZXMgb2Ygb3VyIFNlcnZpY2Ugd2hlbiB5b3UgY2hvb3NlIHRvIGRvIHNvIikscygpLGMoODQsImxpIiksbSg4NSwiVG8gcHJvdmlkZSBjdXN0b21lciBjYXJlIGFuZCBzdXBwb3J0IikscygpLGMoODYsImxpIiksbSg4NywiVG8gcHJvdmlkZSBhbmFseXNpcyBvciB2YWx1YWJsZSBpbmZvcm1hdGlvbiBzbyB0aGF0IHdlIGNhbiBpbXByb3ZlIHRoZSBTZXJ2aWNlIikscygpLGMoODgsImxpIiksbSg4OSwiVG8gbW9uaXRvciB0aGUgdXNhZ2Ugb2YgdGhlIFNlcnZpY2UiKSxzKCksYyg5MCwibGkiKSxtKDkxLCJUbyBkZXRlY3QsIHByZXZlbnQgYW5kIGFkZHJlc3MgdGVjaG5pY2FsIGlzc3VlcyIpLHMoKSgpLHUoOTIsIm1hdC1kaXZpZGVyIiw1KSxjKDkzLCJoMiIpLG0oOTQsIkIuIFRyYW5zZmVyIE9mIERhdGEiKSxzKCksYyg5NSwicCIpLG0oOTYsIllvdXIgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBQZXJzb25hbCBEYXRhLCBtYXkgYmUgdHJhbnNmZXJyZWQgdG8gXHUyMDE0IGFuZCBtYWludGFpbmVkIG9uIFx1MjAxNCBjb21wdXRlcnMgbG9jYXRlZCBvdXRzaWRlIG9mIHlvdXIgc3RhdGUsIHByb3ZpbmNlLCBjb3VudHJ5IG9yIG90aGVyIGdvdmVybm1lbnRhbCBqdXJpc2RpY3Rpb24gd2hlcmUgdGhlIGRhdGEgcHJvdGVjdGlvbiBsYXdzIG1heSBkaWZmZXIgdGhhbiB0aG9zZSBmcm9tIHlvdXIganVyaXNkaWN0aW9uLiIpLHMoKSxjKDk3LCJwIiksbSg5OCwiSWYgeW91IGFyZSBsb2NhdGVkIG91dHNpZGUgR2VybWFueSBhbmQgY2hvb3NlIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gdG8gdXMsIHBsZWFzZSBub3RlIHRoYXQgd2UgdHJhbnNmZXIgdGhlIGRhdGEsIGluY2x1ZGluZyBQZXJzb25hbCBEYXRhLCB0byBHZXJtYW55IGFuZCBwcm9jZXNzIGl0IHRoZXJlLiIpLHMoKSxjKDk5LCJwIiksbSgxMDAsIllvdXIgY29uc2VudCB0byB0aGlzIFByaXZhY3kgUG9saWN5IGZvbGxvd2VkIGJ5IHlvdXIgc3VibWlzc2lvbiBvZiBzdWNoIGluZm9ybWF0aW9uIHJlcHJlc2VudHMgeW91ciBhZ3JlZW1lbnQgdG8gdGhhdCB0cmFuc2Zlci4iKSxzKCksYygxMDEsInAiKSxtKDEwMiksYygxMDMsInNwYW4iLDMpLG0oMTA0LCJyZWFzb25hYmx5IG5lY2Vzc2FyeSIpLHMoKSxtKDEwNSwiIHRvIGVuc3VyZSB0aGF0IHlvdXIgZGF0YSBpcyB0cmVhdGVkIHNlY3VyZWx5IGFuZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBQcml2YWN5IFBvbGljeSBhbmQgbm8gdHJhbnNmZXIgb2YgeW91ciBQZXJzb25hbCBEYXRhIHdpbGwgdGFrZSBwbGFjZSB0byBhbiBvcmdhbml6YXRpb24gb3IgYSBjb3VudHJ5IHVubGVzcyB0aGVyZSBhcmUgYWRlcXVhdGUgY29udHJvbHMgaW4gcGxhY2UgaW5jbHVkaW5nIHRoZSBzZWN1cml0eSBvZiB5b3VyIGRhdGEgYW5kIG90aGVyIHBlcnNvbmFsIGluZm9ybWF0aW9uLiIpLHMoKSx1KDEwNiwibWF0LWRpdmlkZXIiLDUpLGMoMTA3LCJoMiIpLG0oMTA4LCJDLiBEaXNjbG9zdXJlIE9mIERhdGEiKSxzKCksYygxMDksImgzIiksbSgxMTAsIkMxLiBMZWdhbCBSZXF1aXJlbWVudHMiKSxzKCksYygxMTEsInAiKSxtKDExMikscygpLGMoMTEzLCJ1bCIpKDExNCwibGkiKSxtKDExNSwiVG8gY29tcGx5IHdpdGggYSBsZWdhbCBvYmxpZ2F0aW9uIikscygpLGMoMTE2LCJsaSIpLG0oMTE3KSxzKCksYygxMTgsImxpIiksbSgxMTksIlRvIHByZXZlbnQgb3IgaW52ZXN0aWdhdGUgcG9zc2libGUgd3Jvbmdkb2luZyBpbiBjb25uZWN0aW9uIHdpdGggdGhlIFNlcnZpY2UiKSxzKCksYygxMjAsImxpIiksbSgxMjEsIlRvIHByb3RlY3QgdGhlIHBlcnNvbmFsIHNhZmV0eSBvZiB1c2VycyBvZiB0aGUgU2VydmljZSBvciB0aGUgcHVibGljIikscygpLGMoMTIyLCJsaSIpLG0oMTIzLCJUbyBwcm90ZWN0IGFnYWluc3QgbGVnYWwgbGlhYmlsaXR5IikscygpKCksdSgxMjQsIm1hdC1kaXZpZGVyIiw1KSxjKDEyNSwiaDIiKSxtKDEyNiwiRC4gU2VjdXJpdHkgT2YgRGF0YSIpLHMoKSxjKDEyNywicCIpLG0oMTI4LCJUaGUgc2VjdXJpdHkgb2YgeW91ciBkYXRhIGlzIGltcG9ydGFudCB0byB1cywgYnV0IHJlbWVtYmVyIHRoYXQgbm8gbWV0aG9kIG9mIHRyYW5zbWlzc2lvbiBvdmVyIHRoZSBJbnRlcm5ldCwgb3IgbWV0aG9kIG9mIGVsZWN0cm9uaWMgc3RvcmFnZSBpcyAxMDAlIHNlY3VyZS4gV2hpbGUgd2Ugc3RyaXZlIHRvIHVzZSBjb21tZXJjaWFsbHkgYWNjZXB0YWJsZSBtZWFucyB0byBwcm90ZWN0IHlvdXIgUGVyc29uYWwgRGF0YSwgd2UgY2Fubm90IGd1YXJhbnRlZSBpdHMgYWJzb2x1dGUgc2VjdXJpdHkuIikscygpLHUoMTI5LCJtYXQtZGl2aWRlciIsNSksYygxMzAsImgyIiksbSgxMzEsIkUuIFNlcnZpY2UgUHJvdmlkZXJzIikscygpLGMoMTMyLCJwIiksbSgxMzMsJ1dlIG1heSBlbXBsb3kgdGhpcmQgcGFydHkgY29tcGFuaWVzIGFuZCBpbmRpdmlkdWFscyB0byBmYWNpbGl0YXRlIG91ciBTZXJ2aWNlICgiU2VydmljZSBQcm92aWRlcnMiKSwgdG8gcHJvdmlkZSB0aGUgU2VydmljZSBvbiBvdXIgYmVoYWxmLCB0byBwZXJmb3JtIFNlcnZpY2UtcmVsYXRlZCBzZXJ2aWNlcyBvciB0byBhc3Npc3QgdXMgaW4gYW5hbHl6aW5nIGhvdyBvdXIgU2VydmljZSBpcyB1c2VkLicpLHMoKSxjKDEzNCwicCIpLG0oMTM1LCJUaGVzZSB0aGlyZCBwYXJ0aWVzIGhhdmUgYWNjZXNzIHRvIHlvdXIgUGVyc29uYWwgRGF0YSBvbmx5IHRvIHBlcmZvcm0gdGhlc2UgdGFza3Mgb24gb3VyIGJlaGFsZiBhbmQgYXJlIG9ibGlnYXRlZCBub3QgdG8gZGlzY2xvc2Ugb3IgdXNlIGl0IGZvciBhbnkgb3RoZXIgcHVycG9zZS4iKSxzKCksdSgxMzYsIm1hdC1kaXZpZGVyIiw1KSxjKDEzNywiaDIiKSxtKDEzOCwiRi4gTGlua3MgVG8gT3RoZXIgU2l0ZXMiKSxzKCksYygxMzksInAiKSxtKDE0MCwiT3VyIFNlcnZpY2UgbWF5IGNvbnRhaW4gbGlua3MgdG8gb3RoZXIgc2l0ZXMgdGhhdCBhcmUgbm90IG9wZXJhdGVkIGJ5IHVzLiBJZiB5b3UgY2xpY2sgb24gYSB0aGlyZCBwYXJ0eSBsaW5rLCB5b3Ugd2lsbCBiZSBkaXJlY3RlZCB0byB0aGF0IHRoaXJkIHBhcnR5J3Mgc2l0ZS4gV2Ugc3Ryb25nbHkgYWR2aXNlIHlvdSB0byByZXZpZXcgdGhlIFByaXZhY3kgUG9saWN5IG9mIGV2ZXJ5IHNpdGUgeW91IHZpc2l0LiIpLHMoKSxjKDE0MSwicCIpLG0oMTQyLCJXZSBoYXZlIG5vIGNvbnRyb2wgb3ZlciBhbmQgYXNzdW1lIG5vICIpLGMoMTQzLCJzcGFuIiwzKSxtKDE0NCwicmVzcG9uc2liaWxpdHkiKSxzKCksbSgxNDUsIiBmb3IgdGhlIGNvbnRlbnQsIHByaXZhY3kgcG9saWNpZXMgb3IgcHJhY3RpY2VzIG9mIGFueSB0aGlyZCBwYXJ0eSBzaXRlcyBvciBzZXJ2aWNlcy4iKSxzKCksdSgxNDYsIm1hdC1kaXZpZGVyIiw1KSxjKDE0NywiaDIiKSxtKDE0OCwiRy4gQ2hpbGRyZW4ncyBQcml2YWN5IikscygpLGMoMTQ5LCJwIiksbSgxNTAsJ091ciBTZXJ2aWNlIGRvZXMgbm90IGFkZHJlc3MgYW55b25lIHVuZGVyIHRoZSBhZ2Ugb2YgMTggKCJDaGlsZHJlbiIpLicpLHMoKSxjKDE1MSwicCIpLG0oMTUyLCJXZSBkbyBub3Qga25vd2luZ2x5IGNvbGxlY3QgcGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24gZnJvbSBhbnlvbmUgdW5kZXIgdGhlIGFnZSBvZiAxOC4gSWYgeW91IGFyZSBhIHBhcmVudCBvciBndWFyZGlhbiBhbmQgeW91IGFyZSBhd2FyZSB0aGF0IHlvdXIgQ2hpbGRyZW4gaGFzIHByb3ZpZGVkIHVzIHdpdGggUGVyc29uYWwgRGF0YSwgcGxlYXNlIGNvbnRhY3QgdXMuIElmIHdlIGJlY29tZSBhd2FyZSB0aGF0IHdlIGhhdmUgY29sbGVjdGVkIFBlcnNvbmFsIERhdGEgZnJvbSBjaGlsZHJlbiB3aXRob3V0IHZlcmlmaWNhdGlvbiBvZiBwYXJlbnRhbCBjb25zZW50LCB3ZSB0YWtlIHN0ZXBzIHRvIHJlbW92ZSB0aGF0IGluZm9ybWF0aW9uIGZyb20gb3VyIHNlcnZlcnMuIikscygpLHUoMTUzLCJtYXQtZGl2aWRlciIsNSksYygxNTQsImgyIiksbSgxNTUsIkguIENoYW5nZXMgVG8gVGhpcyBQcml2YWN5IFBvbGljeSIpLHMoKSxjKDE1NiwicCIpLG0oMTU3LCJXZSBtYXkgdXBkYXRlIG91ciBQcml2YWN5IFBvbGljeSBmcm9tIHRpbWUgdG8gdGltZS4gV2Ugd2lsbCBub3RpZnkgeW91IG9mIGFueSBjaGFuZ2VzIGJ5IHBvc3RpbmcgdGhlIG5ldyBQcml2YWN5IFBvbGljeSBvbiB0aGlzIHBhZ2UuIikscygpLGMoMTU4LCJwIiksbSgxNTksJ1dlIHdpbGwgbGV0IHlvdSBrbm93IHZpYSBlbWFpbCBhbmQvb3IgYSBwcm9taW5lbnQgbm90aWNlIG9uIG91ciBTZXJ2aWNlLCBwcmlvciB0byB0aGUgY2hhbmdlIGJlY29taW5nIGVmZmVjdGl2ZSBhbmQgdXBkYXRlIHRoZSAiZWZmZWN0aXZlIGRhdGUiIGF0IHRoZSB0b3Agb2YgdGhpcyBQcml2YWN5IFBvbGljeS4nKSxzKCksYygxNjAsInAiKSxtKDE2MSwiWW91IGFyZSBhZHZpc2VkIHRvIHJldmlldyB0aGlzIFByaXZhY3kgUG9saWN5IHBlcmlvZGljYWxseSBmb3IgYW55IGNoYW5nZXMuIENoYW5nZXMgdG8gdGhpcyBQcml2YWN5IFBvbGljeSBhcmUgZWZmZWN0aXZlIHdoZW4gdGhleSBhcmUgcG9zdGVkIG9uIHRoaXMgcGFnZS4iKSxzKCksdSgxNjIsIm1hdC1kaXZpZGVyIiw1KSxjKDE2MywiaDIiKSxtKDE2NCwiQ29udGFjdCBVcyIpLHMoKSxjKDE2NSwicCIpLG0oMTY2LCJJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIGFib3V0IHRoaXMgUHJpdmFjeSBQb2xpY3ksIHBsZWFzZSBjb250YWN0IHVzOiIpLHMoKSxjKDE2NywidWwiKSgxNjgsImxpIiksbSgxNjkpLHMoKSgpKCksdSgxNzAsImltZyIsNikscygpKCkpLGkmMiYmKGwoNCksQShDKDUsMTAsIlRJVExFX1BSSVZBQ1lfUE9MSUNZIikpLGwoNSksRSgiIixhLmFwcGxpY2F0aW9uTmFtZSwnICgidXMiLCAid2UiLCBvciAib3VyIikgb3BlcmF0ZXMgdGhlICcpLGwoMiksQShhLmFwcGxpY2F0aW9uVXJsKSxsKDMpLEUoIlRoaXMgcGFnZSBpbmZvcm1zIHlvdSBvZiBvdXIgcG9saWNpZXMgcmVnYXJkaW5nIHRoZSBjb2xsZWN0aW9uLCB1c2UsIGFuZCBkaXNjbG9zdXJlIG9mIHBlcnNvbmFsIGRhdGEgd2hlbiB5b3UgdXNlIG91ciBTZXJ2aWNlIGFuZCB0aGUgY2hvaWNlcyB5b3UgaGF2ZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBkYXRhLiBPdXIgUHJpdmFjeSBQb2xpY3kgZm9yICIsYS5hcHBsaWNhdGlvbk5hbWUsIiBpcyBjcmVhdGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlICIpLGwoNSksRSgiV2UgdXNlIHlvdXIgZGF0YSB0byBwcm92aWRlIGFuZCBpbXByb3ZlIHRoZSBTZXJ2aWNlLiBCeSB1c2luZyB0aGUgU2VydmljZSwgeW91IGFncmVlIHRvIHRoZSBjb2xsZWN0aW9uIGFuZCB1c2Ugb2YgaW5mb3JtYXRpb24gaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgcG9saWN5LiBVbmxlc3Mgb3RoZXJ3aXNlIGRlZmluZWQgaW4gdGhpcyBQcml2YWN5IFBvbGljeSwgdGVybXMgdXNlZCBpbiB0aGlzIFByaXZhY3kgUG9saWN5IGhhdmUgdGhlIHNhbWUgbWVhbmluZ3MgYXMgaW4gb3VyIFRlcm1zIGFuZCBDb25kaXRpb25zLCBhY2Nlc3NpYmxlIGZyb20gIixhLmFwcGxpY2F0aW9uVXJsLCIgLiIpLGwoNTcpLEUoIiIsYS5hcHBsaWNhdGlvbk5hbWUsIiB1c2VzIHRoZSBjb2xsZWN0ZWQgZGF0YSBmb3IgdmFyaW91cyBwdXJwb3NlczoiKSxsKDI2KSxFKCIiLGEuYXBwbGljYXRpb25OYW1lLCIgd2lsbCB0YWtlIGFsbCBzdGVwcyAiKSxsKDEwKSxFKCIiLGEuYXBwbGljYXRpb25OYW1lLCIgbWF5IGRpc2Nsb3NlIHlvdXIgUGVyc29uYWwgRGF0YSBpbiB0aGUgZ29vZCBmYWl0aCBiZWxpZWYgdGhhdCBzdWNoIGFjdGlvbiBpcyBuZWNlc3NhcnkgdG86IiksbCg1KSxFKCJUbyBwcm90ZWN0IGFuZCBkZWZlbmQgdGhlIHJpZ2h0cyBvciBwcm9wZXJ0eSBvZiAiLGEuYXBwbGljYXRpb25OYW1lKSxsKDUyKSxFKCJCeSBlbWFpbDogIixhLnByaXZhY3lDb250YWN0RW1haWwpKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxZLEExLEtdLHN0eWxlczpbYC5wcml2YWN5LXBvbGljeVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbToxcmVtO21hcmdpbi1sZWZ0OjguMzMzMzMlO3dpZHRoOjgzLjMzMzMlfXBbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206MXJlbTt0ZXh0LWFsaWduOmp1c3RpZnk7dGV4dC1qdXN0aWZ5OmludGVyLXdvcmR9bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206M3JlbTttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvO3dpZHRoOjkwJX1oMltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy10b3A6LjYyNXJlbX1oM1tfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NTUwfXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1zdHlsZTppdGFsaWM7Zm9udC13ZWlnaHQ6NTUwfWg0W19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5ob3RbX25nY29udGVudC0lQ09NUCVdOmhvdmVye3RleHQtc2hhZG93OjAgMCAyMHB4ICNmZWZjYzksMTBweCAtMTBweCAzMHB4ICNmZWVjODUsLTIwcHggLTIwcHggNDBweCAjZmZhZTM0LDIwcHggLTQwcHggNTBweCAjZWM3NjBjLC0yMHB4IC02MHB4IDYwcHggI2NkNDYwNiwwIC04MHB4IDcwcHggIzk3MzcxNiwxMHB4IC05MHB4IDgwcHggIzQ1MWIwZX0uZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC13aWR0aDo0cHghaW1wb3J0YW50O21hcmdpbi1sZWZ0OjEyJSFpbXBvcnRhbnQ7d2lkdGg6ODIlIWltcG9ydGFudH0ubWRjLWNhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowfS5tZGMtY2FyZFtfbmdjb250ZW50LSVDT01QJV0gICBpbWdbX25nY29udGVudC0lQ09NUCVde21heC1oZWlnaHQ6MTBweH0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gSUIodCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIpLG0oMSksYigyLCJ0cmFuc2xhdGUiKSxzKCkpLHQmMiYmKGwoKSxFKCIgIixDKDIsMSwiTUFOREFUT1JZX0NPVU5UUlkiKSwiICIpKX1mdW5jdGlvbiBMQih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYobCgpLEUoIiAiLEMoMiwxLCJNQU5EQVRPUllfTkFNRSIpLCIgIikpfWZ1bmN0aW9uIFBCKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiKSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjImJihsKCksRSgiICIsQygyLDEsIk1BTkRBVE9SWV9OVU1CRVIiKSwiICIpKX1mdW5jdGlvbiBWQih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiw5KSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjImJihmKCJ0cmFuc2xhdGVQYXJhbXMiLFN0KDQsREIpKSxsKCksRSgiICIsQygyLDIsIklOVkFMSURfTU9CSUxFX05VTUJFUiIpLCIgIikpfWZ1bmN0aW9uIE9CKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiKSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjImJihsKCksRSgiICIsQygyLDEsIk1BTkRBVE9SWV9aSVAiKSwiICIpKX1mdW5jdGlvbiBIQih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYobCgpLEUoIiAiLEMoMiwxLCJNQU5EQVRPUllfQUREUkVTUyIpLCIgIikpfWZ1bmN0aW9uIE5CKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiKSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjImJihsKCksRSgiICIsQygyLDEsIk1BTkRBVE9SWV9DSVRZIiksIiAiKSl9dmFyIEFCLERCLFI3LGlDPXgoKCk9PntXZSgpO2soKTtEYSgpO2lyKCk7cDEoKTthMSgpO1coKTtKMSgpO3ZlKCk7bmUoKTtldCgpO0plKCk7aGUoKTtrKCk7aGUoKTtKZSgpO2V0KCk7V2UoKTtuZSgpO3ZlKCk7VygpO0FCPSgpPT4oe2xlbmd0aDoiMTYwIn0pLERCPSgpPT4oe3JhbmdlOiIxMDAwMDAwLTk5OTk5OTk5OTkifSk7Ujc9KCgpPT57Y2xhc3MgdHtsb2NhdGlvbj1oKGdyKTtmb3JtU3VibWl0U2VydmljZT1oKFRpKTthZGRyZXNzU2VydmljZT1oKGsyKTtyb3V0ZXI9aCh5dCk7YWN0aXZhdGVkUm91dGU9aCgkMSk7dHJhbnNsYXRlPWgoSXQpO3NuYWNrQmFySGVscGVyU2VydmljZT1oKFZ0KTtjb3VudHJ5Q29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWRdKTtuYW1lQ29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWRdKTtudW1iZXJDb250cm9sPW5ldyBrZSgiIixbSi5yZXF1aXJlZCxKLm1pbigxMTExMTExKSxKLm1heCg5OTk5OTk5OTk5KV0pO3BpbkNvbnRyb2w9bmV3IGtlKCIiLFtKLnJlcXVpcmVkLEoubWF4TGVuZ3RoKDgpXSk7YWRkcmVzc0NvbnRyb2w9bmV3IGtlKCIiLFtKLnJlcXVpcmVkLEoubWF4TGVuZ3RoKDE2MCldKTtjaXR5Q29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWRdKTtzdGF0ZUNvbnRyb2w9bmV3IGtlO2FkZHJlc3M9dm9pZCAwO21vZGU9ImNyZWF0ZSI7YWRkcmVzc0lkPXZvaWQgMDtuZ09uSW5pdCgpe3RoaXMuYWRkcmVzcz17fSx0aGlzLmFjdGl2YXRlZFJvdXRlLnBhcmFtTWFwLnN1YnNjcmliZShlPT57ZS5oYXMoImFkZHJlc3NJZCIpPyh0aGlzLm1vZGU9ImVkaXQiLHRoaXMuYWRkcmVzc0lkPWUuZ2V0KCJhZGRyZXNzSWQiKSx0aGlzLmFkZHJlc3NTZXJ2aWNlLmdldEJ5SWQodGhpcy5hZGRyZXNzSWQpLnN1YnNjcmliZShpPT57dGhpcy5pbml0aWFsaXplRm9ybShpKX0pKToodGhpcy5tb2RlPSJjcmVhdGUiLHRoaXMuYWRkcmVzc0lkPW51bGwpfSksdGhpcy5mb3JtU3VibWl0U2VydmljZS5hdHRhY2hFbnRlcktleUhhbmRsZXIoImFkZHJlc3MtZm9ybSIsInN1Ym1pdEJ1dHRvbiIsKCk9Pnt0aGlzLnNhdmUoKX0pfXNhdmUoKXt0aGlzLmFkZHJlc3MuY291bnRyeT10aGlzLmNvdW50cnlDb250cm9sLnZhbHVlLHRoaXMuYWRkcmVzcy5mdWxsTmFtZT10aGlzLm5hbWVDb250cm9sLnZhbHVlLHRoaXMuYWRkcmVzcy5tb2JpbGVOdW09dGhpcy5udW1iZXJDb250cm9sLnZhbHVlLHRoaXMuYWRkcmVzcy56aXBDb2RlPXRoaXMucGluQ29udHJvbC52YWx1ZSx0aGlzLmFkZHJlc3Muc3RyZWV0QWRkcmVzcz10aGlzLmFkZHJlc3NDb250cm9sLnZhbHVlLHRoaXMuYWRkcmVzcy5jaXR5PXRoaXMuY2l0eUNvbnRyb2wudmFsdWUsdGhpcy5hZGRyZXNzLnN0YXRlPXRoaXMuc3RhdGVDb250cm9sLnZhbHVlLHRoaXMubW9kZT09PSJlZGl0Ij90aGlzLmFkZHJlc3NTZXJ2aWNlLnB1dCh0aGlzLmFkZHJlc3NJZCx0aGlzLmFkZHJlc3MpLnN1YnNjcmliZSh7bmV4dDplPT57dGhpcy5hZGRyZXNzPXt9LHRoaXMubmdPbkluaXQoKSx0aGlzLnJlc2V0Rm9ybSgpLHRoaXMucm91dGVUb1ByZXZpb3VzVXJsKCksdGhpcy50cmFuc2xhdGUuZ2V0KCJBRERSRVNTX1VQREFURUQiLHtjaXR5OmUuY2l0eX0pLnN1YnNjcmliZSh7bmV4dDppPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihpLCJjb25maXJtQmFyIil9LGVycm9yOmk9Pnt0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKGksImNvbmZpcm1CYXIiKX19KX0sZXJyb3I6ZT0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oZS5lcnJvcj8uZXJyb3IsImVycm9yQmFyIiksdGhpcy5hZGRyZXNzPXt9LHRoaXMucmVzZXRGb3JtKCl9fSk6dGhpcy5hZGRyZXNzU2VydmljZS5zYXZlKHRoaXMuYWRkcmVzcykuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLmFkZHJlc3M9e30sdGhpcy5uZ09uSW5pdCgpLHRoaXMucmVzZXRGb3JtKCksdGhpcy5yb3V0ZVRvUHJldmlvdXNVcmwoKSx0aGlzLnRyYW5zbGF0ZS5nZXQoIkFERFJFU1NfQURERUQiLHtjaXR5OmUuY2l0eX0pLnN1YnNjcmliZSh7bmV4dDppPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihpLCJjb25maXJtQmFyIil9LGVycm9yOmk9Pnt0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKGksImNvbmZpcm1CYXIiKX19KX0sZXJyb3I6ZT0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oZS5lcnJvcj8uZXJyb3IsImVycm9yQmFyIiksdGhpcy5hZGRyZXNzPXt9LHRoaXMucmVzZXRGb3JtKCl9fSl9aW5pdGlhbGl6ZUZvcm0oZSl7dGhpcy5jb3VudHJ5Q29udHJvbC5zZXRWYWx1ZShlLmNvdW50cnkpLHRoaXMubmFtZUNvbnRyb2wuc2V0VmFsdWUoZS5mdWxsTmFtZSksdGhpcy5udW1iZXJDb250cm9sLnNldFZhbHVlKGUubW9iaWxlTnVtKSx0aGlzLnBpbkNvbnRyb2wuc2V0VmFsdWUoZS56aXBDb2RlKSx0aGlzLmFkZHJlc3NDb250cm9sLnNldFZhbHVlKGUuc3RyZWV0QWRkcmVzcyksdGhpcy5jaXR5Q29udHJvbC5zZXRWYWx1ZShlLmNpdHkpLHRoaXMuc3RhdGVDb250cm9sLnNldFZhbHVlKGUuc3RhdGUpfXJvdXRlVG9QcmV2aW91c1VybCgpe3RoaXMubG9jYXRpb24uYmFjaygpfXJlc2V0Rm9ybSgpe3RoaXMuY291bnRyeUNvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5jb3VudHJ5Q29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMuY291bnRyeUNvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMubmFtZUNvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5uYW1lQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMubmFtZUNvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMubnVtYmVyQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKSx0aGlzLm51bWJlckNvbnRyb2wubWFya0FzUHJpc3RpbmUoKSx0aGlzLm51bWJlckNvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMucGluQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKSx0aGlzLnBpbkNvbnRyb2wubWFya0FzUHJpc3RpbmUoKSx0aGlzLnBpbkNvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMuYWRkcmVzc0NvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5hZGRyZXNzQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMuYWRkcmVzc0NvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMuY2l0eUNvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5jaXR5Q29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMuY2l0eUNvbnRyb2wuc2V0VmFsdWUoIiIpLHRoaXMuc3RhdGVDb250cm9sLm1hcmtBc1VudG91Y2hlZCgpLHRoaXMuc3RhdGVDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5zdGF0ZUNvbnRyb2wuc2V0VmFsdWUoIiIpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1hZGRyZXNzLWNyZWF0ZSJdXSxkZWNsczo3OCx2YXJzOjczLGNvbnN0czpbWyJwaW4iLCIiXSxbImFkcmVzcyIsIiJdLFsxLCJwYWdlLWNlbnRlciJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJtYXQtZWxldmF0aW9uLXo2Il0sWzEsIm1kYy1jYXJkIl0sWyJpZCIsImFkZHJlc3MtZm9ybSIsMSwiZm9ybS1jb250YWluZXIiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lIiwiY29sb3IiLCJhY2NlbnQiXSxbInR5cGUiLCJ0ZXh0IiwibWF0SW5wdXQiLCIiLDMsImZvcm1Db250cm9sIiwicGxhY2Vob2xkZXIiXSxbInR5cGUiLCJudW1iZXIiLCJtYXRJbnB1dCIsIiIsMywiZm9ybUNvbnRyb2wiLCJwbGFjZWhvbGRlciJdLFszLCJ0cmFuc2xhdGVQYXJhbXMiXSxbImFsaWduIiwiZW5kIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZSIsImNvbG9yIiwiYWNjZW50IiwxLCJ0ZXh0YXJlYS1maWVsZCJdLFsiaWQiLCJhZGRyZXNzIiwibWF0SW5wdXQiLCIiLCJtYXRBdXRvc2l6ZU1pblJvd3MiLCI0IiwibWF0QXV0b3NpemVNYXhSb3dzIiwiNCIsIm1hdFRleHRhcmVhQXV0b3NpemUiLCIiLCJjb2xzIiwiNTAiLCJtYXhsZW5ndGgiLCIxNjAiLDMsImZvcm1Db250cm9sIiwicGxhY2Vob2xkZXIiXSxbMSwiZmFzIiwiZmEtZXhjbGFtYXRpb24tY2lyY2xlIl0sWzEsImhpbnQtc3BhY2luZyJdLFsxLCJhY3Rpb25zIl0sWyJtYXQtc3Ryb2tlZC1idXR0b24iLCIiLDEsImJ0bi1yZXR1cm4iLDMsImNsaWNrIl0sWyJ0eXBlIiwic3VibWl0IiwiaWQiLCJzdWJtaXRCdXR0b24iLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsImNvbG9yIiwicHJpbWFyeSIsMywiY2xpY2siLCJkaXNhYmxlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSl7bGV0IHI9TCgpO2MoMCwiZGl2IiwyKSgxLCJtYXQtY2FyZCIsMykoMiwiZGl2Iiw0KSgzLCJoMSIpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCksYyg2LCJkaXYiLDUpKDcsIm1hdC1mb3JtLWZpZWxkIiw2KSg4LCJtYXQtbGFiZWwiKSxtKDkpLGIoMTAsInRyYW5zbGF0ZSIpLHMoKSx1KDExLCJpbnB1dCIsNyksYigxMiwidHJhbnNsYXRlIiksTSgxMyxJQiwzLDMsIm1hdC1lcnJvciIpLHMoKSxjKDE0LCJtYXQtZm9ybS1maWVsZCIsNikoMTUsIm1hdC1sYWJlbCIpLG0oMTYpLGIoMTcsInRyYW5zbGF0ZSIpLHMoKSx1KDE4LCJpbnB1dCIsNyksYigxOSwidHJhbnNsYXRlIiksTSgyMCxMQiwzLDMsIm1hdC1lcnJvciIpLHMoKSxjKDIxLCJtYXQtZm9ybS1maWVsZCIsNikoMjIsIm1hdC1sYWJlbCIpLG0oMjMpLGIoMjQsInRyYW5zbGF0ZSIpLHMoKSx1KDI1LCJpbnB1dCIsOCksYigyNiwidHJhbnNsYXRlIiksTSgyNyxQQiwzLDMsIm1hdC1lcnJvciIpLE0oMjgsVkIsMyw1LCJtYXQtZXJyb3IiLDkpLHMoKSxjKDI5LCJtYXQtZm9ybS1maWVsZCIsNikoMzAsIm1hdC1sYWJlbCIpLG0oMzEpLGIoMzIsInRyYW5zbGF0ZSIpLHMoKSx1KDMzLCJpbnB1dCIsNywwKSxiKDM1LCJ0cmFuc2xhdGUiKSxjKDM2LCJtYXQtaGludCIsMTApLG0oMzcpLHMoKSxNKDM4LE9CLDMsMywibWF0LWVycm9yIikscygpLGMoMzksIm1hdC1mb3JtLWZpZWxkIiwxMSkoNDAsIm1hdC1sYWJlbCIpLG0oNDEpLGIoNDIsInRyYW5zbGF0ZSIpLHMoKSx1KDQzLCJ0ZXh0YXJlYSIsMTIsMSksYig0NSwidHJhbnNsYXRlIiksYyg0NiwibWF0LWhpbnQiKSx1KDQ3LCJpIiwxMyksYyg0OCwiZW0iLDE0KSxtKDQ5KSxiKDUwLCJ0cmFuc2xhdGUiKSxzKCkoKSxjKDUxLCJtYXQtaGludCIsMTApLG0oNTIpLHMoKSxNKDUzLEhCLDMsMywibWF0LWVycm9yIikscygpLGMoNTQsIm1hdC1mb3JtLWZpZWxkIiw2KSg1NSwibWF0LWxhYmVsIiksbSg1NiksYig1NywidHJhbnNsYXRlIikscygpLHUoNTgsImlucHV0Iiw3KSxiKDU5LCJ0cmFuc2xhdGUiKSxNKDYwLE5CLDMsMywibWF0LWVycm9yIikscygpLGMoNjEsIm1hdC1mb3JtLWZpZWxkIiw2KSg2MiwibWF0LWxhYmVsIiksbSg2MyksYig2NCwidHJhbnNsYXRlIikscygpLHUoNjUsImlucHV0Iiw3KSxiKDY2LCJ0cmFuc2xhdGUiKSxzKCkoKSxjKDY3LCJkaXYiLDE1KSg2OCwiYnV0dG9uIiwxNiksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHoociksVChhLnJvdXRlVG9QcmV2aW91c1VybCgpKX0pLGMoNjksIm1hdC1pY29uIiksbSg3MCwibmF2aWdhdGVfYmVmb3JlIikscygpLG0oNzEpLGIoNzIsInRyYW5zbGF0ZSIpLHMoKSxjKDczLCJidXR0b24iLDE3KSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuc2F2ZSgpKX0pLGMoNzQsIm1hdC1pY29uIiksbSg3NSwic2VuZCIpLHMoKSxtKDc2KSxiKDc3LCJ0cmFuc2xhdGUiKSxzKCkoKSgpKCkoKX1pZihpJjIpe2xldCByPXNlKDM0KSxvPXNlKDQ0KTtsKDQpLEEoQyg1LDM1LCJBRERfTkVXX0FERFJFU1MiKSksbCg1KSxBKEMoMTAsMzcsIkxBQkVMX0NPVU5UUlkiKSksbCgyKSxmKCJmb3JtQ29udHJvbCIsYS5jb3VudHJ5Q29udHJvbCkoInBsYWNlaG9sZGVyIixDKDEyLDM5LCJNQU5EQVRPUllfQ09VTlRSWSIpKSxsKDIpLHcoYS5jb3VudHJ5Q29udHJvbC5pbnZhbGlkJiZhLmNvdW50cnlDb250cm9sLmVycm9ycy5yZXF1aXJlZD8xMzotMSksbCgzKSxBKEMoMTcsNDEsIkxBQkVMX05BTUUiKSksbCgyKSxmKCJmb3JtQ29udHJvbCIsYS5uYW1lQ29udHJvbCkoInBsYWNlaG9sZGVyIixDKDE5LDQzLCJNQU5EQVRPUllfTkFNRSIpKSxsKDIpLHcoYS5uYW1lQ29udHJvbC5pbnZhbGlkJiZhLm5hbWVDb250cm9sLmVycm9ycy5yZXF1aXJlZD8yMDotMSksbCgzKSxBKEMoMjQsNDUsIkxBQkVMX01PQklMRV9OVU1CRVIiKSksbCgyKSxmKCJmb3JtQ29udHJvbCIsYS5udW1iZXJDb250cm9sKSgicGxhY2Vob2xkZXIiLEMoMjYsNDcsIk1BTkRBVE9SWV9OVU1CRVIiKSksbCgyKSx3KGEubnVtYmVyQ29udHJvbC5pbnZhbGlkJiZhLm51bWJlckNvbnRyb2wuZXJyb3JzLnJlcXVpcmVkPzI3Oi0xKSxsKCksdyhhLm51bWJlckNvbnRyb2wuaW52YWxpZCYmKGEubnVtYmVyQ29udHJvbC5lcnJvcnMubWlufHxhLm51bWJlckNvbnRyb2wuZXJyb3JzLm1heCk/Mjg6LTEpLGwoMyksQShDKDMyLDQ5LCJMQUJFTF9aSVBfQ09ERSIpKSxsKDIpLGYoImZvcm1Db250cm9sIixhLnBpbkNvbnRyb2wpKCJwbGFjZWhvbGRlciIsQygzNSw1MSwiTUFOREFUT1JZX1pJUCIpKSxsKDQpLEUoIiIsKHIudmFsdWU9PW51bGw/bnVsbDpyLnZhbHVlLmxlbmd0aCl8fDAsIi84IiksbCgpLHcoYS5waW5Db250cm9sLmludmFsaWQmJmEucGluQ29udHJvbC5lcnJvcnMucmVxdWlyZWQ/Mzg6LTEpLGwoMyksQShDKDQyLDUzLCJMQUJFTF9BRERSRVNTIikpLGwoMiksZigiZm9ybUNvbnRyb2wiLGEuYWRkcmVzc0NvbnRyb2wpKCJwbGFjZWhvbGRlciIsQyg0NSw1NSwiTUFOREFUT1JZX0FERFJFU1MiKSksbCg2KSxBKGR0KDUwLDU3LCJNQVhfVEVYVEFSRUFfTEVOR1RIIixTdCg3MixBQikpKSxsKDMpLEUoIiIsKG8udmFsdWU9PW51bGw/bnVsbDpvLnZhbHVlLmxlbmd0aCl8fDAsIi8xNjAiKSxsKCksdyhhLmFkZHJlc3NDb250cm9sLmludmFsaWQmJmEuYWRkcmVzc0NvbnRyb2wuZXJyb3JzLnJlcXVpcmVkPzUzOi0xKSxsKDMpLEEoQyg1Nyw2MCwiTEFCRUxfQ0lUWSIpKSxsKDIpLGYoImZvcm1Db250cm9sIixhLmNpdHlDb250cm9sKSgicGxhY2Vob2xkZXIiLEMoNTksNjIsIk1BTkRBVE9SWV9DSVRZIikpLGwoMiksdyhhLmNpdHlDb250cm9sLmludmFsaWQmJmEuY2l0eUNvbnRyb2wuZXJyb3JzLnJlcXVpcmVkPzYwOi0xKSxsKDMpLEEoQyg2NCw2NCwiTEFCRUxfU1RBVEUiKSksbCgyKSxmKCJmb3JtQ29udHJvbCIsYS5zdGF0ZUNvbnRyb2wpKCJwbGFjZWhvbGRlciIsQyg2Niw2NiwiU1RBVEVfUExBQ0VIT0xERVIiKSksbCg2KSxFKCIgIixDKDcyLDY4LCJMQUJFTF9CQUNLIiksIiAiKSxsKDIpLGYoImRpc2FibGVkIixhLmNvdW50cnlDb250cm9sLmludmFsaWR8fGEubmFtZUNvbnRyb2wuaW52YWxpZHx8YS5udW1iZXJDb250cm9sLmludmFsaWR8fGEucGluQ29udHJvbC5pbnZhbGlkfHxhLmFkZHJlc3NDb250cm9sLmludmFsaWR8fGEuY2l0eUNvbnRyb2wuaW52YWxpZCksbCgzKSxFKCIgIixDKDc3LDcwLCJCVE5fU1VCTUlUIiksIiAiKX19LGRlcGVuZGVuY2llczpbZGUscGUsWSxRZSxaZSxodCxmMSxRdCwkZSxudCxhdCxndCxRYSxtdCxNaSx6dCxlMSxvZSxsZSxnZSxDZSxLXSxzdHlsZXM6W2AucGFnZS1jZW50ZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3BhZGRpbmc6MS41cmVtfW1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6YXV0bzttaW4td2lkdGg6MzIwcHg7d2lkdGg6MzAlfSNzdWJtaXRCdXR0b25bX25nY29udGVudC0lQ09NUCVde2Zsb2F0OnJpZ2h0fS5mb3JtLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtwb3NpdGlvbjpyZWxhdGl2ZX0uZm9ybS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdICAgbWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LmJ0bi1yZXR1cm5bX25nY29udGVudC0lQ09NUCVde2Zsb2F0OmxlZnR9LmFjdGlvbnNbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6MS41cmVtfS5hY3Rpb25zW19uZ2NvbnRlbnQtJUNPTVAlXTphZnRlcntjbGVhcjpib3RoO2NvbnRlbnQ6IiI7ZGlzcGxheTp0YWJsZX1pbnB1dFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24sIGlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZTttYXJnaW46MH0ubWF0LW1kYy1mb3JtLWZpZWxkLWhpbnRbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtjb2xvcjp2YXIoLS10aGVtZS10ZXh0LWZhZGUtMzApO2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTFweDttYXJnaW4tbGVmdDotLjYyNXJlbTttYXJnaW4tcmlnaHQ6LS42MjVyZW19Lm1kYy1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MH1tYXQtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMC41cHg7bWFyZ2luLWxlZnQ6LS42MjVyZW07bWFyZ2luLXRvcDotLjEyNXJlbX0uaGludC1zcGFjaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDouMjVyZW19CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO3ZhciBhQyxuQz14KCgpPT57aygpO3AxKCk7cHMoKTtrKCk7YUM9KCgpPT57Y2xhc3MgdHtyb3V0ZXI9aCh5dCk7bmdab25lPWgocmUpO2FkZHJlc3NJZD12b2lkIDA7c2hvd05leHRCdXR0b249ITA7Z2V0TWVzc2FnZShlKXt0aGlzLmFkZHJlc3NJZD1lfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1hZGRyZXNzLXNlbGVjdCJdXSxkZWNsczoyLHZhcnM6MSxjb25zdHM6W1siaWQiLCJjYXJkIl0sWzMsInNob3dOZXh0QnV0dG9uIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJkaXYiLDApLHUoMSwiYXBwLWFkZHJlc3MiLDEpLHMoKSksaSYyJiYobCgpLGYoInNob3dOZXh0QnV0dG9uIixhLnNob3dOZXh0QnV0dG9uKSl9LGRlcGVuZGVuY2llczpbQ29dLHN0eWxlczpbYC5idG4tcGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9Lm1hdC1tZGMtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXJpZ2h0Oi4xMjVyZW07bWFyZ2luLXRvcDouMTI1cmVtfSNjYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tcmlnaHQ6MjAlfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgckMsb0M9eCgoKT0+e3BzKCk7aygpO3JDPSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLXNhdmVkLWFkZHJlc3MiXV0sZGVjbHM6Mix2YXJzOjEsY29uc3RzOltbMSwibWFpbi13cmFwcGVyIl0sWzMsImFsbG93RWRpdCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwiZGl2IiwwKSx1KDEsImFwcC1hZGRyZXNzIiwxKSxzKCkpLGkmMiYmKGwoKSxmKCJhbGxvd0VkaXQiLCEwKSl9LGRlcGVuZGVuY2llczpbQ29dLHN0eWxlczpbYC5tYWluLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWxlZnQ6MjAlO21hcmdpbi1yaWdodDoyMCV9CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO3ZhciBFcyxjQz14KCgpPT57Z2koKTtrKCk7WXQoKTtyMSgpO1coKTtuZSgpO083KCk7cWkoKTtrKCk7bmUoKTtXKCk7TGUuYWRkKEphKTtFcz0oKCk9PntjbGFzcyB0e2RpYWxvZ0RhdGE9aChVaSk7dGl0bGU7dXJsO2FkZHJlc3M7ZGF0YTtuZ09uSW5pdCgpe3RoaXMudGl0bGU9dGhpcy5kaWFsb2dEYXRhLnRpdGxlLHRoaXMudXJsPXRoaXMuZGlhbG9nRGF0YS51cmwsdGhpcy5hZGRyZXNzPXRoaXMuZGlhbG9nRGF0YS5hZGRyZXNzLHRoaXMuZGF0YT10aGlzLmRpYWxvZ0RhdGEuZGF0YX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtcXItY29kZSJdXSxkZWNsczoxNyx2YXJzOjExLGNvbnN0czpbWzEsInFyLWNvZGUiXSxbMSwiY29udGVudC1jb2x1bW4iXSxbMSwiY29udGFpbmVyIl0sWzMsImhyZWYiXSxbMywidmFsdWUiLCJzaXplIiwiZXJyb3JDb3JyZWN0aW9uTGV2ZWwiXSxbIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwibWF0LWRpYWxvZy1jbG9zZSIsIiIsMSwiY2xvc2UtZGlhbG9nIl0sWzEsImZhcyIsImZhLWFycm93LWNpcmNsZS1sZWZ0IiwiZmEtbGciXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsImRpdiIsMCkoMSwiaGVhZGVyIikoMiwiaDMiKSxtKDMpLGIoNCwidHJhbnNsYXRlIikscygpKCksYyg1LCJkaXYiLDEpLHUoNiwibWF0LWRpdmlkZXIiKSxjKDcsImRpdiIsMikoOCwiYSIsMyksdSg5LCJxci1jb2RlIiw0KSxzKCkoKSxjKDEwLCJzbWFsbCIpLG0oMTEpLHMoKSgpLGMoMTIsImZvb3RlciIpKDEzLCJidXR0b24iLDUpLHUoMTQsImkiLDYpLG0oMTUpLGIoMTYsInRyYW5zbGF0ZSIpLHMoKSgpKCkpLGkmMiYmKGwoMyksQShDKDQsNyxhLnRpdGxlKSksbCg1KSxmKCJocmVmIixhLnVybCx3dCksbCgpLGYoInZhbHVlIixhLmRhdGEpKCJzaXplIiwzMDApKCJlcnJvckNvcnJlY3Rpb25MZXZlbCIsIk0iKSxsKDIpLEEoYS5hZGRyZXNzKSxsKDQpLEUoIiAiLEMoMTYsOSwiQlROX0NMT1NFIiksIiAiKSl9LGRlcGVuZGVuY2llczpbQTEsa3Msb2UsbGUsUGksWSxLXSxzdHlsZXM6W2AucXItY29kZVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjFyZW19LmNvbnRlbnQtY29sdW1uW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDouNjI1cmVtfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIga28sQXM9eCgoKT0+e050KCk7aygpO1d0KCk7bHQoKTtrKCk7a289KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtob3N0PXRoaXMuaG9zdFNlcnZlcisiL3Jlc3Qvd2FsbGV0L2JhbGFuY2UiO2dldCgpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaG9zdCkucGlwZShxKGU9PmUuZGF0YSksaihlPT57dGhyb3cgZX0pKX1wdXQoZSl7cmV0dXJuIHRoaXMuaHR0cC5wdXQodGhpcy5ob3N0LGUpLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTt2YXIgZm4sSjQ9eCgoKT0+e050KCk7aygpO1d0KCk7bHQoKTtrKCk7Zm49KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtob3N0PXRoaXMuaG9zdFNlcnZlcisiL2FwaS9EZWxpdmVyeXMiO2dldCgpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaG9zdCkucGlwZShxKGU9PmUuZGF0YSksaihlPT57dGhyb3cgZX0pKX1nZXRCeUlkKGUpe3JldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuaG9zdH0vJHtlfWApLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTt2YXIgem8sRHM9eCgoKT0+e050KCk7aygpO1d0KCk7bHQoKTtrKCk7em89KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtob3N0PXRoaXMuaG9zdFNlcnZlcisiL2FwaS9DYXJkcyI7Z2V0KCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0KS5waXBlKHEoZT0+ZS5kYXRhKSxqKGU9Pnt0aHJvdyBlfSkpfWdldEJ5SWQoZSl7cmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5ob3N0fS8ke2V9YCkucGlwZShxKGk9PmkuZGF0YSksaihpPT57dGhyb3cgaX0pKX1zYXZlKGUpe3JldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLmhvc3QrIi8iLGUpLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9ZGVsKGUpe3JldHVybiB0aGlzLmh0dHAuZGVsZXRlKGAke3RoaXMuaG9zdH0vJHtlfWApLnBpcGUocShpPT5pLmRhdGEpLGooaT0+e3Rocm93IGl9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBSQih0LG4pe3QmMSYmdSgwLCJtYXQtaGVhZGVyLWNlbGwiKX1mdW5jdGlvbiBGQih0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwibWF0LWNlbGwiKSgxLCJtYXQtcmFkaW8tYnV0dG9uIiwyMyksUygiY2xpY2siLGZ1bmN0aW9uKCl7bGV0IGE9eihlKS4kaW1wbGljaXQscj12KDIpO3JldHVybiBUKHIuZW1pdFNlbGVjdGlvblRvUGFyZW50KGEuaWQpKX0pLHMoKSgpfX1mdW5jdGlvbiBCQih0LG4pe3QmMSYmdSgwLCJtYXQtaGVhZGVyLWNlbGwiKX1mdW5jdGlvbiBVQih0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWNlbGwiKSxtKDEpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKCksQShlLmNhcmROdW0pfX1mdW5jdGlvbiBqQih0LG4pe3QmMSYmdSgwLCJtYXQtaGVhZGVyLWNlbGwiKX1mdW5jdGlvbiBxQih0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWNlbGwiKSxtKDEpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKCksQShlLmZ1bGxOYW1lKX19ZnVuY3Rpb24gR0IodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIil9ZnVuY3Rpb24gV0IodCxuKXtpZih0JjEmJihjKDAsIm1hdC1jZWxsIiksbSgxKSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgpLE8xKCIiLGUuZXhwTW9udGgsIi8iLGUuZXhwWWVhcil9fWZ1bmN0aW9uIFFCKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIpfWZ1bmN0aW9uIFlCKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJtYXQtY2VsbCIpKDEsImJ1dHRvbiIsMjQpLFMoImNsaWNrIixmdW5jdGlvbigpe2xldCBhPXooZSkuJGltcGxpY2l0LHI9digyKTtyZXR1cm4gVChyLmRlbGV0ZShhLmlkKSl9KSx1KDIsImkiLDI1KSxzKCkoKX19ZnVuY3Rpb24gWkIodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1yb3ciKX1mdW5jdGlvbiAkQih0LG4pe3QmMSYmdSgwLCJtYXQtcm93Iil9ZnVuY3Rpb24gS0IodCxuKXtpZih0JjEmJihjKDAsImRpdiIpKDEsIm1hdC10YWJsZSIsMTMpLF9lKDIsMTQpLFIoMyxSQiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsMTUpKDQsRkIsMiwwLCJtYXQtY2VsbCIsMTYpLGJlKCksX2UoNSwxNyksUig2LEJCLDEsMCwibWF0LWhlYWRlci1jZWxsIiwxNSkoNyxVQiwyLDEsIm1hdC1jZWxsIiwxNiksYmUoKSxfZSg4LDE4KSxSKDksakIsMSwwLCJtYXQtaGVhZGVyLWNlbGwiLDE1KSgxMCxxQiwyLDEsIm1hdC1jZWxsIiwxNiksYmUoKSxfZSgxMSwxOSksUigxMixHQiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsMTUpKDEzLFdCLDIsMiwibWF0LWNlbGwiLDE2KSxiZSgpLF9lKDE0LDIwKSxSKDE1LFFCLDEsMCwibWF0LWhlYWRlci1jZWxsIiwxNSkoMTYsWUIsMywwLCJtYXQtY2VsbCIsMTYpLGJlKCksUigxNyxaQiwxLDAsIm1hdC1oZWFkZXItcm93IiwyMSkoMTgsJEIsMSwwLCJtYXQtcm93IiwyMikscygpKCkpLHQmMil7bGV0IGU9digpO2woKSxmKCJkYXRhU291cmNlIixlLmRhdGFTb3VyY2UpLGwoMTYpLGYoIm1hdEhlYWRlclJvd0RlZiIsZS5kaXNwbGF5ZWRDb2x1bW5zKSxsKCksZigibWF0Um93RGVmQ29sdW1ucyIsZS5kaXNwbGF5ZWRDb2x1bW5zKX19ZnVuY3Rpb24gWEIodCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIsNSksbSgxLCIgTUFOREFUT1JZX05BTUUgIikscygpKX1mdW5jdGlvbiBKQih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiw1KSxtKDEsIiBNQU5EQVRPUllfQ0FSRF9OVU1CRVIgIikscygpKX1mdW5jdGlvbiBlVSh0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiw1KSxtKDEsIiBWQUxJRF9DQVJEX05VTUJFUiAiKSxzKCkpfWZ1bmN0aW9uIHRVKHQsbil7aWYodCYxJiYoYygwLCJvcHRpb24iLDExKSxtKDEpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtmKCJ2YWx1ZSIsVmUoZSkpLGwoKSxBKGUpfX1mdW5jdGlvbiBpVSh0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiw1KSxtKDEsIiBNQU5EQVRPUllfRVhQSVJZX01PTlRIICIpLHMoKSl9ZnVuY3Rpb24gYVUodCxuKXtpZih0JjEmJihjKDAsIm9wdGlvbiIsMTEpLG0oMSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2YoInZhbHVlIixWZShlKSksbCgpLEEoZSl9fWZ1bmN0aW9uIG5VKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiLDUpLG0oMSwiIE1BTkRBVE9SWV9FWFBJUllfWUVBUiAiKSxzKCkpfXZhciBJcyxGNz14KCgpPT57V2UoKTtrKCk7RHMoKTtNMigpO1l0KCk7cjEoKTtTYSgpO1coKTtKMSgpO2V0KCk7SmUoKTt4NCgpO25lKCk7R24oKTt2ZSgpO2soKTtKZSgpO1coKTtldCgpO1dlKCk7bmUoKTt2ZSgpO0xlLmFkZChuYSxXcik7SXM9KCgpPT57Y2xhc3MgdHtwYXltZW50U2VydmljZT1oKHpvKTt0cmFuc2xhdGU9aChJdCk7c25hY2tCYXJIZWxwZXJTZXJ2aWNlPWgoVnQpO2VtaXRTZWxlY3Rpb249bmV3IE47YWxsb3dEZWxldGU9ITE7ZGlzcGxheWVkQ29sdW1ucz1bIk51bWJlciIsIk5hbWUiLCJFeHBpcnkiXTtuYW1lQ29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWRdKTtudW1iZXJDb250cm9sPW5ldyBrZSgiIixbSi5yZXF1aXJlZCxKLm1pbigxZTE1KSxKLm1heCgxZTE2KV0pO21vbnRoQ29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWRdKTt5ZWFyQ29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWRdKTtjb25maXJtYXRpb247ZXJyb3I7c3RvcmVkQ2FyZHM7Y2FyZD17fTtkYXRhU291cmNlO21vbnRoUmFuZ2U9QXJyYXkuZnJvbShBcnJheSgxMikua2V5cygpKS5tYXAoZT0+ZSsxKTt5ZWFyUmFuZ2U9QXJyYXkuZnJvbShBcnJheSgyMCkua2V5cygpKS5tYXAoZT0+ZSsyMDgwKTtjYXJkc0V4aXN0PSExO3BheW1lbnRJZD12b2lkIDA7bmdPbkluaXQoKXt0aGlzLmFsbG93RGVsZXRlP3RoaXMuZGlzcGxheWVkQ29sdW1ucy5wdXNoKCJSZW1vdmUiKTp0aGlzLmRpc3BsYXllZENvbHVtbnMudW5zaGlmdCgiU2VsZWN0aW9uIiksdGhpcy5sb2FkKCl9bG9hZCgpe3RoaXMucGF5bWVudFNlcnZpY2UuZ2V0KCkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLmNhcmRzRXhpc3Q9ZS5sZW5ndGgsdGhpcy5zdG9yZWRDYXJkcz1lLHRoaXMuZGF0YVNvdXJjZT1uZXcgSTEodGhpcy5zdG9yZWRDYXJkcyl9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KX1zYXZlKCl7dGhpcy5jYXJkLmZ1bGxOYW1lPXRoaXMubmFtZUNvbnRyb2wudmFsdWUsdGhpcy5jYXJkLmNhcmROdW09dGhpcy5udW1iZXJDb250cm9sLnZhbHVlLHRoaXMuY2FyZC5leHBNb250aD10aGlzLm1vbnRoQ29udHJvbC52YWx1ZSx0aGlzLmNhcmQuZXhwWWVhcj10aGlzLnllYXJDb250cm9sLnZhbHVlLHRoaXMucGF5bWVudFNlcnZpY2Uuc2F2ZSh0aGlzLmNhcmQpLnN1YnNjcmliZSh7bmV4dDplPT57dGhpcy5lcnJvcj1udWxsLHRoaXMudHJhbnNsYXRlLmdldCgiQ1JFRElUX0NBUkRfU0FWRUQiLHtjYXJkbnVtYmVyOlN0cmluZyhlLmNhcmROdW0pLnN1YnN0cmluZyhTdHJpbmcoZS5jYXJkTnVtKS5sZW5ndGgtNCl9KS5zdWJzY3JpYmUoe25leHQ6aT0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oaSwiY29uZmlybUJhciIpfSxlcnJvcjppPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihpLCJjb25maXJtQmFyIil9fSksdGhpcy5sb2FkKCksdGhpcy5yZXNldEZvcm0oKX0sZXJyb3I6ZT0+e3RoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oZS5lcnJvcj8uZXJyb3IsImVycm9yQmFyIiksdGhpcy5yZXNldEZvcm0oKX19KX1kZWxldGUoZSl7dGhpcy5wYXltZW50U2VydmljZS5kZWwoZSkuc3Vic2NyaWJlKHtuZXh0OigpPT57dGhpcy5sb2FkKCl9LGVycm9yOmk9Pntjb25zb2xlLmxvZyhpKX19KX1lbWl0U2VsZWN0aW9uVG9QYXJlbnQoZSl7dGhpcy5lbWl0U2VsZWN0aW9uLmVtaXQoZSl9cmVzZXRGb3JtKCl7dGhpcy5uYW1lQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKSx0aGlzLm5hbWVDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5uYW1lQ29udHJvbC5zZXRWYWx1ZSgiIiksdGhpcy5udW1iZXJDb250cm9sLm1hcmtBc1VudG91Y2hlZCgpLHRoaXMubnVtYmVyQ29udHJvbC5tYXJrQXNQcmlzdGluZSgpLHRoaXMubnVtYmVyQ29udHJvbC5zZXRWYWx1ZSgiIiksdGhpcy5tb250aENvbnRyb2wubWFya0FzVW50b3VjaGVkKCksdGhpcy5tb250aENvbnRyb2wubWFya0FzUHJpc3RpbmUoKSx0aGlzLm1vbnRoQ29udHJvbC5zZXRWYWx1ZSgiIiksdGhpcy55ZWFyQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKSx0aGlzLnllYXJDb250cm9sLm1hcmtBc1ByaXN0aW5lKCksdGhpcy55ZWFyQ29udHJvbC5zZXRWYWx1ZSgiIil9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLXBheW1lbnQtbWV0aG9kIl1dLGlucHV0czp7YWxsb3dEZWxldGU6ImFsbG93RGVsZXRlIn0sb3V0cHV0czp7ZW1pdFNlbGVjdGlvbjoiZW1pdFNlbGVjdGlvbiJ9LGRlY2xzOjQ4LHZhcnM6MjQsY29uc3RzOltbImNhcmRJbiIsIiJdLFsxLCJjb250YWluZXIiXSxbMSwibWF0LWVsZXZhdGlvbi16MCJdLFsxLCJwYW5lbC1oZWFkZXItc3BhY2luZyJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmUiLCJjb2xvciIsImFjY2VudCJdLFsidHJhbnNsYXRlIiwiIl0sWyJ0eXBlIiwidGV4dCIsIm1hdElucHV0IiwiIiwzLCJmb3JtQ29udHJvbCJdLFsidHlwZSIsIm51bWJlciIsIm1hdElucHV0IiwiIiwzLCJmb3JtQ29udHJvbCJdLFsiYWxpZ24iLCJlbmQiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lIiwiY29sb3IiLCJhY2NlbnQiLDEsImhhbGYtZmllbGQiXSxbIm1hdE5hdGl2ZUNvbnRyb2wiLCIiLCJyZXF1aXJlZCIsIiIsMywiZm9ybUNvbnRyb2wiXSxbMywidmFsdWUiXSxbInR5cGUiLCJzdWJtaXQiLCJpZCIsInN1Ym1pdEJ1dHRvbiIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiY29sb3IiLCJwcmltYXJ5IiwxLCJzdWJtaXQtYnV0dG9uIiwzLCJjbGljayIsImRpc2FibGVkIl0sWzMsImRhdGFTb3VyY2UiXSxbIm1hdENvbHVtbkRlZiIsIlNlbGVjdGlvbiJdLFs0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWzQsIm1hdENlbGxEZWYiXSxbIm1hdENvbHVtbkRlZiIsIk51bWJlciJdLFsibWF0Q29sdW1uRGVmIiwiTmFtZSJdLFsibWF0Q29sdW1uRGVmIiwiRXhwaXJ5Il0sWyJtYXRDb2x1bW5EZWYiLCJSZW1vdmUiXSxbNCwibWF0SGVhZGVyUm93RGVmIl0sWzQsIm1hdFJvd0RlZiIsIm1hdFJvd0RlZkNvbHVtbnMiXSxbMywiY2xpY2siXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsMywiY2xpY2siXSxbMSwiZmFyIiwiZmEtdHJhc2gtYWx0Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aWYoaSYxKXtsZXQgcj1MKCk7YygwLCJkaXYiLDEpKDEsImgxIiksbSgyKSxiKDMsInRyYW5zbGF0ZSIpLHMoKSxNKDQsS0IsMTksMywiZGl2IiksYyg1LCJkaXYiKSg2LCJtYXQtZXhwYW5zaW9uLXBhbmVsIiwyKSg3LCJtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciIsMykoOCwibWF0LXBhbmVsLXRpdGxlIiksbSg5KSxiKDEwLCJ0cmFuc2xhdGUiKSxzKCksYygxMSwibWF0LXBhbmVsLWRlc2NyaXB0aW9uIiksbSgxMiksYigxMywidHJhbnNsYXRlIikscygpKCksYygxNCwiZGl2IikoMTUsIm1hdC1mb3JtLWZpZWxkIiw0KSgxNiwibWF0LWxhYmVsIiw1KSxtKDE3LCJMQUJFTF9OQU1FIikscygpLHUoMTgsImlucHV0Iiw2KSxNKDE5LFhCLDIsMCwibWF0LWVycm9yIiw1KSxzKCksYygyMCwibWF0LWZvcm0tZmllbGQiLDQpKDIxLCJtYXQtbGFiZWwiLDUpLG0oMjIsIkxBQkVMX0NBUkRfTlVNQkVSIikscygpLHUoMjMsImlucHV0Iiw3LDApLGMoMjUsIm1hdC1oaW50Iiw4KSxtKDI2KSxzKCksTSgyNyxKQiwyLDAsIm1hdC1lcnJvciIsNSksTSgyOCxlVSwyLDAsIm1hdC1lcnJvciIsNSkscygpLGMoMjksIm1hdC1mb3JtLWZpZWxkIiw5KSgzMCwibWF0LWxhYmVsIiw1KSxtKDMxLCJMQUJFTF9FWFBJUllfTU9OVEgiKSxzKCksYygzMiwic2VsZWN0IiwxMCkscWUoMzMsdFUsMiwzLCJvcHRpb24iLDExLEZ0KSxzKCksTSgzNSxpVSwyLDAsIm1hdC1lcnJvciIsNSkscygpLGMoMzYsIm1hdC1mb3JtLWZpZWxkIiw5KSgzNywibWF0LWxhYmVsIiw1KSxtKDM4LCJMQUJFTF9FWFBJUllfWUVBUiIpLHMoKSxjKDM5LCJzZWxlY3QiLDEwKSxxZSg0MCxhVSwyLDMsIm9wdGlvbiIsMTEsRnQpLHMoKSxNKDQyLG5VLDIsMCwibWF0LWVycm9yIiw1KSxzKCkoKSxjKDQzLCJidXR0b24iLDEyKSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEuc2F2ZSgpKX0pLGMoNDQsIm1hdC1pY29uIiksbSg0NSwic2VuZCIpLHMoKSxtKDQ2KSxiKDQ3LCJ0cmFuc2xhdGUiKSxzKCkoKSgpKCl9aWYoaSYyKXtsZXQgcj1zZSgyNCk7bCgyKSxBKEMoMywxNiwiTVlfUEFZTUVOVF9PUFRJT05TIikpLGwoMiksdyhhLmNhcmRzRXhpc3Q/NDotMSksbCg1KSxFKCIgIixDKDEwLDE4LCJBRERfTkVXX0NBUkQiKSwiICIpLGwoMyksRSgiICIsQygxMywyMCwiQUREX05FV19DQVJEX0RFU0NSSVBUSU9OIiksIiAiKSxsKDYpLGYoImZvcm1Db250cm9sIixhLm5hbWVDb250cm9sKSxsKCksdyhhLm5hbWVDb250cm9sLmludmFsaWQmJmEubmFtZUNvbnRyb2wuZXJyb3JzLnJlcXVpcmVkPzE5Oi0xKSxsKDQpLGYoImZvcm1Db250cm9sIixhLm51bWJlckNvbnRyb2wpLGwoMyksRSgiIiwoci52YWx1ZT09bnVsbD9udWxsOnIudmFsdWUubGVuZ3RoKXx8MCwiLzE2IiksbCgpLHcoYS5udW1iZXJDb250cm9sLmludmFsaWQmJmEubnVtYmVyQ29udHJvbC5lcnJvcnMucmVxdWlyZWQ/Mjc6LTEpLGwoKSx3KGEubnVtYmVyQ29udHJvbC5pbnZhbGlkJiYoYS5udW1iZXJDb250cm9sLmVycm9ycy5taW58fGEubnVtYmVyQ29udHJvbC5lcnJvcnMubWF4KT8yODotMSksbCg0KSxmKCJmb3JtQ29udHJvbCIsYS5tb250aENvbnRyb2wpLGwoKSxHZShhLm1vbnRoUmFuZ2UpLGwoMiksdyhhLm1vbnRoQ29udHJvbC5pbnZhbGlkJiZhLm1vbnRoQ29udHJvbC5lcnJvcnMucmVxdWlyZWQ/MzU6LTEpLGwoNCksZigiZm9ybUNvbnRyb2wiLGEueWVhckNvbnRyb2wpLGwoKSxHZShhLnllYXJSYW5nZSksbCgyKSx3KGEueWVhckNvbnRyb2wuaW52YWxpZCYmYS55ZWFyQ29udHJvbC5lcnJvcnMucmVxdWlyZWQ/NDI6LTEpLGwoKSxmKCJkaXNhYmxlZCIsYS5uYW1lQ29udHJvbC5pbnZhbGlkfHxhLm51bWJlckNvbnRyb2wuaW52YWxpZHx8YS5tb250aENvbnRyb2wuaW52YWxpZHx8YS55ZWFyQ29udHJvbC5pbnZhbGlkKSxsKDMpLEUoIiAiLEMoNDcsMjIsIkJUTl9TVUJNSVQiKSwiICIpfX0sZGVwZW5kZW5jaWVzOlt0aSxuaSxhaSxyaSxpaSxvaSxDMixsMSxjaSxsaSxzaSxkaSxZbixubyxybyxXMyxRZSxaZSxodCxmMSxRdCxZLFNlLCRlLG50LGF0LEQwLEkwLGd0LFFhLFZtLG10LGtyLHp0LGUxLG9lLGxlLGdlLENlLEtdLHN0eWxlczpbYC5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjEuMjVyZW19bWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0YWJsZS1sYXlvdXQ6Zml4ZWQ7d2lkdGg6MTAwJX0ubWF0LWNvbHVtbi1TZWxlY3Rpb25bX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE1JX0ubWF0LWNvbHVtbi1OdW1iZXJbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjM1JX0ubWF0LWNvbHVtbi1OYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDozMCV9Lm1hdC1jb2x1bW4tRXhwaXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMCV9Lm1hdC1jb2x1bW4tUmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNSV9LmhhbGYtZmllbGRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1yaWdodDoxMCU7d2lkdGg6NDUlfS5oYWxmLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXTpsYXN0LW9mLXR5cGV7bWFyZ2luLXJpZ2h0OjB9QG1lZGlhIChtYXgtd2lkdGg6IDU5OS45OHB4KXsuaGFsZi1maWVsZFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXJpZ2h0OjA7d2lkdGg6MTAwJX19LmhlYWRpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMDM7Zm9udC1zaXplOngtbGFyZ2U7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOi42MjVyZW0gMS4yNXJlbX1tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZsZXgtYmFzaXM6MH0uZGV0YWlsLWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206LjYyNXJlbTttYXJnaW4tdG9wOi42MjVyZW19bWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVde21pbi1oZWlnaHQ6MCFpbXBvcnRhbnR9aW5wdXRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLCBpbnB1dFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmU7bWFyZ2luOjB9LnBhbmVsLWhlYWRlci1zcGFjaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjFyZW19LnN1Ym1pdC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2Zsb2F0OnJpZ2h0O21hcmdpbi10b3A6LjI1cmVtfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBvVSh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiZGl2Iiw0KSgxLCJkaXYiLDEyKSgyLCJkaXYiLDEzKSgzLCJzcGFuIiwxNCksbSg0LCJMQUJFTF9QQVlfVVNJTkdfV0FMTEVUIikscygpKCksYyg1LCJkaXYiLDE1KSg2LCJiIikoNywic3BhbiIsMTQpLG0oOCwiTEFCRUxfV0FMTEVUX0JBTEFOQ0UiKSxzKCksYyg5LCJzcGFuIiwxNiksbSgxMCkscygpKCkoKSxjKDExLCJkaXYiLDE3KSgxMiwiYnV0dG9uIiwxOCksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS51c2VXYWxsZXQoKSl9KSx1KDEzLCJpIiwxOSksbSgxNCksYigxNSwidHJhbnNsYXRlIikscygpKCkoKSgpfWlmKHQmMil7bGV0IGU9digpO2woMTApLEUoIiAiLGUud2FsbGV0QmFsYW5jZVN0ciksbCgyKSxmKCJkaXNhYmxlZCIsZS53YWxsZXRCYWxhbmNlLWUudG90YWxQcmljZTwwKSxsKDIpLE8xKCIgIixDKDE1LDQsIkxBQkVMX1BBWSIpLCIgIixlLnRvdGFsUHJpY2U9PW51bGw/bnVsbDplLnRvdGFsUHJpY2UudG9GaXhlZCgyKSwiXHhBNCAiKX19ZnVuY3Rpb24gY1UodCxuKXtpZih0JjEmJihjKDAsImRpdiIsMjEpLG0oMSkscygpKSx0JjIpe2xldCBlPXYoMik7bCgpLEUoIiIsZS5jb3Vwb25Db25maXJtYXRpb24sIiAiKX19ZnVuY3Rpb24gc1UodCxuKXtpZih0JjEmJihjKDAsImRpdiIsMjIpLG0oMSkscygpKSx0JjIpe2xldCBlPXYoMik7bCgpLEUoIiIsZS5jb3Vwb25FcnJvcj09bnVsbD9udWxsOmUuY291cG9uRXJyb3IuZXJyb3IsIiAiKX19ZnVuY3Rpb24gbFUodCxuKXt0JjEmJihjKDAsIm1hdC1lcnJvciIpLG0oMSksYigyLCJ0cmFuc2xhdGUiKSxzKCkpLHQmMiYmKGwoKSxFKCIgIixDKDIsMSwiQ09VUE9OX0NPREVfSElOVCIpLCIgIikpfWZ1bmN0aW9uIGRVKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJtYXQtZXhwYW5zaW9uLXBhbmVsIiw1KSgxLCJtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciIsMjApKDIsIm1hdC1wYW5lbC10aXRsZSIpLG0oMyksYig0LCJ0cmFuc2xhdGUiKSxzKCksYyg1LCJtYXQtcGFuZWwtZGVzY3JpcHRpb24iKSxtKDYpLGIoNywidHJhbnNsYXRlIikscygpKCksTSg4LGNVLDIsMSwiZGl2IiwyMSksTSg5LHNVLDIsMSwiZGl2IiwyMiksYygxMCwibWF0LWZvcm0tZmllbGQiLDIzKSgxMSwibWF0LWxhYmVsIiwxMCksbSgxMiwiTEFCRUxfQ09VUE9OIikscygpLHUoMTMsIm1hdC1oaW50IiwyNCksYigxNCwidHJhbnNsYXRlIiksdSgxNSwiaW5wdXQiLDI1LDApLGIoMTcsInRyYW5zbGF0ZSIpLGMoMTgsIm1hdC1oaW50IiwyNiksbSgxOSkscygpLE0oMjAsbFUsMywzLCJtYXQtZXJyb3IiKSxzKCksYygyMSwiYnV0dG9uIiwyNyksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5hcHBseUNvdXBvbigpKX0pLGMoMjIsIm1hdC1pY29uIiksbSgyMywiIHJlZGVlbSAiKSxzKCksbSgyNCksYigyNSwidHJhbnNsYXRlIikscygpKCl9aWYodCYyKXtsZXQgZT1zZSgxNiksaT12KCk7ZigiZXhwYW5kZWQiLGkuY291cG9uUGFuZWxFeHBhbmRlZCksbCgzKSxFKCIgIixDKDQsMTMsIkFERF9BX0NPVVBPTiIpLCIgIiksbCgzKSxFKCIgIixDKDcsMTUsIlZPVUNIRVJTX0FORF9QUk9NT1RJT05BTF9DT0RFIiksIiAiKSxsKDIpLHcoaS5jb3Vwb25Db25maXJtYXRpb24mJiFpLmNvdXBvbkNvbnRyb2wuZGlydHk/ODotMSksbCgpLHcoaS5jb3Vwb25FcnJvciYmIWkuY291cG9uQ29udHJvbC5kaXJ0eT85Oi0xKSxsKDQpLGYoImlubmVySHRtbCIsZHQoMTQsMTcsIkZPTExPV19GT1JfTU9OVEhMWV9DT1VQT05TIix6MSgyNCxyVSxpLmJsdWVTa3lVcmwsaS5yZWRkaXRVcmwpKSx0dCksbCgyKSxmKCJwbGFjZWhvbGRlciIsVmUoQygxNywyMCwiRU5URVJfQ09VUE9OX0NPREUiKSkpKCJmb3JtQ29udHJvbCIsaS5jb3Vwb25Db250cm9sKSxsKDQpLEUoIiIsKGUudmFsdWU9PW51bGw/bnVsbDplLnZhbHVlLmxlbmd0aCl8fDAsIi8xMCIpLGwoKSx3KGkuY291cG9uQ29udHJvbC5pbnZhbGlkJiYoaS5jb3Vwb25Db250cm9sLmVycm9ycy5taW5sZW5ndGh8fGkuY291cG9uQ29udHJvbC5lcnJvcnMubWF4bGVuZ3RoKT8yMDotMSksbCgpLGYoImRpc2FibGVkIixpLmNvdXBvbkNvbnRyb2wuaW52YWxpZCksbCgzKSxFKCIgIixDKDI1LDIyLCJCVE5fUkVERUVNIiksIiAiKX19ZnVuY3Rpb24gbVUodCxuKXt0JjEmJihjKDAsInNwYW4iLDMxKSxtKDEsIlRIQU5LU19GT1JfU1VQUE9SVCIpLHMoKSksdCYyJiZmKCJ0cmFuc2xhdGVQYXJhbXMiLFN0KDEsc0MpKX1mdW5jdGlvbiBoVSh0LG4pe2lmKHQmMSYmKGMoMCwic3BhbiIsMzEpLG0oMSwiVEhBTktTX0ZPUl9TVVBQT1JUX0NVU1RPTUlaRUQiKSxzKCkpLHQmMil7bGV0IGU9digyKTtmKCJ0cmFuc2xhdGVQYXJhbXMiLGJ0KDEsbEMsZS5hcHBsaWNhdGlvbk5hbWUpKX19ZnVuY3Rpb24gcFUodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImJ1dHRvbiIsNDkpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digyKTtyZXR1cm4gVChhLnNob3dCaXRjb2luUXJDb2RlKCkpfSksdSgxLCJpIiw1MCksbSgyLCIgQml0Y29pbiAiKSxzKCl9fWZ1bmN0aW9uIGZVKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJidXR0b24iLDQ5KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoMik7cmV0dXJuIFQoYS5zaG93RGFzaFFyQ29kZSgpKX0pLGMoMSwiaSIsNTEpLG0oMiwiXHhEMCIpLHMoKSxtKDMsIiBEYXNoIikscygpfX1mdW5jdGlvbiB1VSh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYnV0dG9uIiw0OSksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KDIpO3JldHVybiBUKGEuc2hvd0V0aGVyUXJDb2RlKCkpfSksdSgxLCJpIiw1MiksbSgyLCIgRXRoZXIgIikscygpfX1mdW5jdGlvbiBnVSh0LG4pe3QmMSYmKGMoMCwic3BhbiIsMzEpLG0oMSwiT0ZGSUNJQUxfTUVSQ0hBTkRJU0VfU1RPUkVTIikscygpKSx0JjImJmYoInRyYW5zbGF0ZVBhcmFtcyIsU3QoMSxzQykpfWZ1bmN0aW9uIHZVKHQsbil7aWYodCYxJiYoYygwLCJzcGFuIiwzMSksbSgxLCJPRkZJQ0lBTF9NRVJDSEFORElTRV9TVE9SRVNfQ1VTVE9NSVpFRCIpLHMoKSksdCYyKXtsZXQgZT12KDIpO2YoInRyYW5zbGF0ZVBhcmFtcyIsYnQoMSxsQyxlLmFwcGxpY2F0aW9uTmFtZSkpfX1mdW5jdGlvbiBfVSh0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWV4cGFuc2lvbi1wYW5lbCIsNikoMSwibWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIiLDIwKSgyLCJtYXQtcGFuZWwtdGl0bGUiKSxtKDMpLGIoNCwidHJhbnNsYXRlIikscygpKCksYyg1LCJkaXYiLDI4KSg2LCJkaXYiLDI5KSg3LCJkaXYiLDMwKSg4LCJsYWJlbCIsMTApLG0oOSwiTEFCRUxfRE9OQVRJT05TIikscygpKCksYygxMCwic21hbGwiKSxtKDExLCIgKCIpLE0oMTIsbVUsMiwyLCJzcGFuIiwzMSkoMTMsaFUsMiwzLCJzcGFuIiwzMSksdSgxNCwiaSIsMzIpLG0oMTUsIikgIikscygpLGMoMTYsImRpdiIsMzMpKDE3LCJhIiwzNCkoMTgsImJ1dHRvbiIsMzUpLHUoMTksImkiLDM2KSxtKDIwKSxiKDIxLCJ0cmFuc2xhdGUiKSxzKCkoKSxNKDIyLHBVLDMsMCwiYnV0dG9uIiwzNSksTSgyMyxmVSw0LDAsImJ1dHRvbiIsMzUpLE0oMjQsdVUsMywwLCJidXR0b24iLDM1KSxzKCkoKSx1KDI1LCJzcGFuIiwzNyksYygyNiwiZGl2IiwzOCkoMjcsImRpdiIsMzApKDI4LCJsYWJlbCIsMTApLG0oMjksIkxBQkVMX01FUkNIQU5ESVNFIikscygpKCksYygzMCwic21hbGwiKSxtKDMxLCIgKCIpLE0oMzIsZ1UsMiwyLCJzcGFuIiwzMSkoMzMsdlUsMiwzLCJzcGFuIiwzMSksdSgzNCwiaSIsMzkpLG0oMzUsIikgIikscygpLGMoMzYsImRpdiIsMzMpKDM3LCJhIiw0MCkoMzgsImJ1dHRvbiIsMzUpLHUoMzksImkiLDQxKSxtKDQwLCIgU3ByZWFkc2hpcnQgKFVTKSIpLHMoKSgpLGMoNDEsImEiLDQyKSg0MiwiYnV0dG9uIiwzNSksdSg0MywiaSIsNDEpLG0oNDQsIiBTcHJlYWRzaGlydCAoREUpIikscygpKCksYyg0NSwiYSIsNDMpKDQ2LCJidXR0b24iLDM1KSx1KDQ3LCJpIiw0NCksbSg0OCwiIFN0aWNrZXJZb3UiKSxzKCkoKSxjKDQ5LCJhIiw0NSkoNTAsImJ1dHRvbiIsMzUpLHUoNTEsImkiLDQ2KSxtKDUyLCIgTGVhbnB1YiIpLHMoKSgpLGMoNTMsImEiLDQ3KSg1NCwiYnV0dG9uIiwzNSksdSg1NSwiaSIsNDgpLG0oNTYsIiBPcGVuU2VhIikscygpKCkoKSgpKCkoKSksdCYyKXtsZXQgZT12KCk7ZigiZXhwYW5kZWQiLGUucGF5bWVudFBhbmVsRXhwYW5kZWQpLGwoMyksRSgiICIsQyg0LDgsIk9USEVSX1BBWU1FTlRfT1BUSU9OUyIpLCIgIiksbCg5KSx3KGUuYXBwbGljYXRpb25OYW1lPT09Ik9XQVNQIEp1aWNlIFNob3AiPzEyOjEzKSxsKDgpLEUoIiAiLEMoMjEsMTAsIkJUTl9DUkVESVRfQ0FSRCIpKSxsKDIpLHcoLTEpLGwoKSx3KC0xKSxsKCksdygtMSksbCg4KSx3KGUuYXBwbGljYXRpb25OYW1lPT09Ik9XQVNQIEp1aWNlIFNob3AiPzMyOjMzKX19ZnVuY3Rpb24gYlUodCxuKXt0JjEmJihjKDAsInNwYW4iLDEwKSxtKDEsIlJFVklFV19BTEVSVCIpLHMoKSl9ZnVuY3Rpb24gQ1UodCxuKXt0JjEmJihjKDAsInNwYW4iLDEwKSxtKDEsIlJFVklFV19XQUxMRVQiKSxzKCkpfXZhciByVSxzQyxsQyxkQyxtQz14KCgpPT57V2UoKTtrKCk7SzEoKTthYSgpO1coKTtZdCgpO3IxKCk7ZW4oKTtjQygpO2dpKCk7cDEoKTtBcygpO0o0KCk7RjEoKTt3aSgpO2ExKCk7SjEoKTt2ZSgpO2V0KCk7SmUoKTt4NCgpO25lKCk7cWkoKTtGNygpO2hlKCk7aygpO2hlKCk7VygpO25lKCk7SmUoKTtldCgpO1dlKCk7dmUoKTtyVT0odCxuKT0+KHtibHVlU2t5OnQscmVkZGl0Om59KSxzQz0oKT0+KHtqdWljZXNob3A6Ik9XQVNQIEp1aWNlIFNob3AifSksbEM9dD0+KHthcHBuYW1lOnR9KTtMZS5hZGQoaDMsR3AsWnAsSGYsZzMseWYsZGYsUXAsTnAsdmYsQmYsZjMpO2RDPSgoKT0+e2NsYXNzIHR7bG9jYXRpb249aChncik7Y29va2llU2VydmljZT1oKFp0KTt1c2VyU2VydmljZT1oKEF0KTtkZWxpdmVyeVNlcnZpY2U9aChmbik7d2FsbGV0U2VydmljZT1oKGtvKTtyb3V0ZXI9aCh5dCk7ZGlhbG9nPWgoTjEpO2NvbmZpZ3VyYXRpb25TZXJ2aWNlPWgoTHQpO2Jhc2tldFNlcnZpY2U9aChlaSk7dHJhbnNsYXRlPWgoSXQpO2FjdGl2YXRlZFJvdXRlPWgoJDEpO25nWm9uZT1oKHJlKTtzbmFja0JhckhlbHBlclNlcnZpY2U9aChWdCk7Y291cG9uQ29uZmlybWF0aW9uO2NvdXBvbkVycm9yO2NhcmQ9e307Ymx1ZVNreVVybD1udWxsO3JlZGRpdFVybD1udWxsO2FwcGxpY2F0aW9uTmFtZT0iT1dBU1AgSnVpY2UgU2hvcCI7Y2FtcGFpZ25Db3Vwb247Y291cG9uQ29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWQsSi5taW5MZW5ndGgoMTApLEoubWF4TGVuZ3RoKDEwKV0pO2NsaWVudERhdGU7cGF5bWVudElkPXZvaWQgMDtjb3Vwb25QYW5lbEV4cGFuZGVkPSExO3BheW1lbnRQYW5lbEV4cGFuZGVkPSExO21vZGU7d2FsbGV0QmFsYW5jZT0wO3dhbGxldEJhbGFuY2VTdHI7dG90YWxQcmljZT0wO3BheW1lbnRNb2RlPSJjYXJkIjtjYW1wYWlnbnM9e1dNTlNEWTIwMTk6e3ZhbGlkT246MTU1MTk5OTZlNSxkaXNjb3VudDo3NX0sV01OU0RZMjAyMDp7dmFsaWRPbjoxNTgzNjIyZTYsZGlzY291bnQ6NjB9LFdNTlNEWTIwMjE6e3ZhbGlkT246MTYxNTE1OGU2LGRpc2NvdW50OjYwfSxXTU5TRFkyMDIyOnt2YWxpZE9uOjE2NDY2OTRlNixkaXNjb3VudDo2MH0sV01OU0RZMjAyMzp7dmFsaWRPbjoxNjc4MjNlNyxkaXNjb3VudDo2MH0sT1JBTkdFMjAyMDp7dmFsaWRPbjoxNTg4NTQ2OGU1LGRpc2NvdW50OjUwfSxPUkFOR0UyMDIxOnt2YWxpZE9uOjE2MjAwODI4ZTUsZGlzY291bnQ6NDB9LE9SQU5HRTIwMjI6e3ZhbGlkT246MTY1MTYxODhlNSxkaXNjb3VudDo0MH0sT1JBTkdFMjAyMzp7dmFsaWRPbjoxNjgzMTU0OGU1LGRpc2NvdW50OjQwfX07bmdPbkluaXQoKXt0aGlzLmluaXRUb3RhbCgpLHRoaXMud2FsbGV0U2VydmljZS5nZXQoKS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMud2FsbGV0QmFsYW5jZT1lLHRoaXMud2FsbGV0QmFsYW5jZVN0cj1wYXJzZUZsb2F0KGUpLnRvRml4ZWQoMil9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KSx0aGlzLmNvdXBvblBhbmVsRXhwYW5kZWQ9bG9jYWxTdG9yYWdlLmdldEl0ZW0oImNvdXBvblBhbmVsRXhwYW5kZWQiKT9KU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjb3Vwb25QYW5lbEV4cGFuZGVkIikpOiExLHRoaXMucGF5bWVudFBhbmVsRXhwYW5kZWQ9bG9jYWxTdG9yYWdlLmdldEl0ZW0oInBheW1lbnRQYW5lbEV4cGFuZGVkIik/SlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicGF5bWVudFBhbmVsRXhwYW5kZWQiKSk6ITEsdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5nZXRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb24oKS5zdWJzY3JpYmUoe25leHQ6ZT0+e2U/LmFwcGxpY2F0aW9uPy5zb2NpYWwmJihlLmFwcGxpY2F0aW9uLnNvY2lhbC5ibHVlU2t5VXJsJiYodGhpcy5ibHVlU2t5VXJsPWUuYXBwbGljYXRpb24uc29jaWFsLmJsdWVTa3lVcmwpLGUuYXBwbGljYXRpb24uc29jaWFsLnJlZGRpdFVybCYmKHRoaXMucmVkZGl0VXJsPWUuYXBwbGljYXRpb24uc29jaWFsLnJlZGRpdFVybCksZS5hcHBsaWNhdGlvbi5uYW1lJiYodGhpcy5hcHBsaWNhdGlvbk5hbWU9ZS5hcHBsaWNhdGlvbi5uYW1lKSl9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KX1pbml0VG90YWwoKXt0aGlzLmFjdGl2YXRlZFJvdXRlLnBhcmFtTWFwLnN1YnNjcmliZSh7bmV4dDplPT57aWYodGhpcy5tb2RlPWUuZ2V0KCJlbnRpdHkiKSx0aGlzLm1vZGU9PT0id2FsbGV0Iil0aGlzLnRvdGFsUHJpY2U9cGFyc2VGbG9hdChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJ3YWxsZXRUb3RhbCIpKTtlbHNlIGlmKHRoaXMubW9kZT09PSJkZWx1eGUiKXRoaXMudXNlclNlcnZpY2UuZGVsdXhlU3RhdHVzKCkuc3Vic2NyaWJlKHtuZXh0Omk9Pnt0aGlzLnRvdGFsUHJpY2U9aS5tZW1iZXJzaGlwQ29zdH0sZXJyb3I6aT0+e2NvbnNvbGUubG9nKGkpfX0pO2Vsc2V7bGV0IGk9cGFyc2VGbG9hdChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJpdGVtVG90YWwiKSksYT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJjb3Vwb25EaXNjb3VudCIpP3BhcnNlRmxvYXQoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiY291cG9uRGlzY291bnQiKSkvMTAwKmk6MDt0aGlzLmRlbGl2ZXJ5U2VydmljZS5nZXRCeUlkKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImRlbGl2ZXJ5TWV0aG9kSWQiKSkuc3Vic2NyaWJlKHI9PntsZXQgbz1yLnByaWNlO3RoaXMudG90YWxQcmljZT1pK28tYX0pfX0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfWFwcGx5Q291cG9uKCl7dGhpcy5jYW1wYWlnbkNvdXBvbj10aGlzLmNvdXBvbkNvbnRyb2wudmFsdWUsdGhpcy5jbGllbnREYXRlPW5ldyBEYXRlO2xldCBlPSh0aGlzLmNsaWVudERhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSs2MCkqNjAqMWUzO3RoaXMuY2xpZW50RGF0ZS5zZXRIb3VycygwLDAsMCwwKSx0aGlzLmNsaWVudERhdGU9dGhpcy5jbGllbnREYXRlLmdldFRpbWUoKS1lLHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oImNvdXBvbkRldGFpbHMiLGAke3RoaXMuY2FtcGFpZ25Db3Vwb259LSR7dGhpcy5jbGllbnREYXRlfWApO2xldCBpPXRoaXMuY2FtcGFpZ25zW3RoaXMuY291cG9uQ29udHJvbC52YWx1ZV07aT90aGlzLmNsaWVudERhdGU9PT1pLnZhbGlkT24/dGhpcy5zaG93Q29uZmlybWF0aW9uKGkuZGlzY291bnQpOih0aGlzLmNvdXBvbkNvbmZpcm1hdGlvbj12b2lkIDAsdGhpcy50cmFuc2xhdGUuZ2V0KCJJTlZBTElEX0NPVVBPTiIpLnN1YnNjcmliZSh7bmV4dDphPT57dGhpcy5jb3Vwb25FcnJvcj17ZXJyb3I6YX19LGVycm9yOmE9Pnt0aGlzLmNvdXBvbkVycm9yPXtlcnJvcjphfX19KSx0aGlzLnJlc2V0Q291cG9uRm9ybSgpKTp0aGlzLmJhc2tldFNlcnZpY2UuYXBwbHlDb3Vwb24oTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImJpZCIpKSxlbmNvZGVVUklDb21wb25lbnQodGhpcy5jb3Vwb25Db250cm9sLnZhbHVlKSkuc3Vic2NyaWJlKHtuZXh0OmE9Pnt0aGlzLnNob3dDb25maXJtYXRpb24oYSl9LGVycm9yOmE9Pnt0aGlzLmNvdXBvbkNvbmZpcm1hdGlvbj12b2lkIDAsdGhpcy5jb3Vwb25FcnJvcj1hLHRoaXMucmVzZXRDb3Vwb25Gb3JtKCl9fSl9c2hvd0NvbmZpcm1hdGlvbihlKXt0aGlzLnJlc2V0Q291cG9uRm9ybSgpLHRoaXMuY291cG9uRXJyb3I9dm9pZCAwLHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oImNvdXBvbkRpc2NvdW50IixlKSx0aGlzLnRyYW5zbGF0ZS5nZXQoIkRJU0NPVU5UX0FQUExJRUQiLHtkaXNjb3VudDplfSkuc3Vic2NyaWJlKHtuZXh0Omk9Pnt0aGlzLmNvdXBvbkNvbmZpcm1hdGlvbj1pfSxlcnJvcjppPT57dGhpcy5jb3Vwb25Db25maXJtYXRpb249aX19KSx0aGlzLmluaXRUb3RhbCgpfWdldE1lc3NhZ2UoZSl7dGhpcy5wYXltZW50SWQ9ZSx0aGlzLnBheW1lbnRNb2RlPSJjYXJkIn1yb3V0ZVRvUHJldmlvdXNVcmwoKXt0aGlzLmxvY2F0aW9uLmJhY2soKX1jaG9vc2VQYXltZW50KCl7aWYoc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgiaXRlbVRvdGFsIiksdGhpcy5tb2RlPT09IndhbGxldCIpdGhpcy53YWxsZXRTZXJ2aWNlLnB1dCh7YmFsYW5jZTp0aGlzLnRvdGFsUHJpY2UscGF5bWVudElkOnRoaXMucGF5bWVudElkfSkuc3Vic2NyaWJlKHtuZXh0OigpPT57c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgid2FsbGV0VG90YWwiKSx0aGlzLm5nWm9uZS5ydW4oKCk9PlBlKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyIvd2FsbGV0Il0pfSkpLHRoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oIkNIQVJHRURfV0FMTEVUIiwiY29uZmlybUJhciIpfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSksdGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihlLmVycm9yPy5tZXNzYWdlLCJlcnJvckJhciIpfX0pO2Vsc2UgaWYodGhpcy5tb2RlPT09ImRlbHV4ZSIpdGhpcy51c2VyU2VydmljZS51cGdyYWRlVG9EZWx1eGUodGhpcy5wYXltZW50TW9kZSx0aGlzLnBheW1lbnRJZCkuc3Vic2NyaWJlKHtuZXh0OmU9Pntsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgidG9rZW4iLGUudG9rZW4pLHRoaXMuY29va2llU2VydmljZS5wdXQoInRva2VuIixlLnRva2VuKSx0aGlzLm5nWm9uZS5ydW4oKCk9PlBlKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyIvZGVsdXhlLW1lbWJlcnNoaXAiXSl9KSl9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KTtlbHNle2lmKHRoaXMucGF5bWVudE1vZGU9PT0id2FsbGV0Iil7aWYodGhpcy53YWxsZXRCYWxhbmNlPHRoaXMudG90YWxQcmljZSl7dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbigiSU5TVUZGSUNJRU5UX1dBTExFVF9CQUxBTkNFIiwiZXJyb3JCYXIiKTtyZXR1cm59c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgicGF5bWVudElkIiwid2FsbGV0Iil9ZWxzZSBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCJwYXltZW50SWQiLHRoaXMucGF5bWVudElkKTt0aGlzLm5nWm9uZS5ydW4oKCk9PlBlKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyIvb3JkZXItc3VtbWFyeSJdKX0pKX19bm9vcCgpe31zaG93Qml0Y29pblFyQ29kZSgpe3RoaXMuZGlhbG9nLm9wZW4oRXMse2RhdGE6e2RhdGE6ImJpdGNvaW46MUFiS2Zndnc5cHNRNDFOYkxpOGt1ZkRRVGV6d0c4RFJabSIsdXJsOiIuL3JlZGlyZWN0P3RvPWh0dHBzOi8vYmxvY2tjaGFpbi5pbmZvL2FkZHJlc3MvMUFiS2Zndnc5cHNRNDFOYkxpOGt1ZkRRVGV6d0c4RFJabSIsYWRkcmVzczoiMUFiS2Zndnc5cHNRNDFOYkxpOGt1ZkRRVGV6d0c4RFJabSIsdGl0bGU6IlRJVExFX0JJVENPSU5fQUREUkVTUyJ9fSl9c2hvd0Rhc2hRckNvZGUoKXt0aGlzLmRpYWxvZy5vcGVuKEVzLHtkYXRhOntkYXRhOiJkYXNoOlhyNTU2Unp1d1g2aGc1RUdwa3liYnY1UmFuSm9aTjE3a1ciLHVybDoiLi9yZWRpcmVjdD90bz1odHRwczovL2V4cGxvcmVyLmRhc2gub3JnL2FkZHJlc3MvWHI1NTZSenV3WDZoZzVFR3BreWJidjVSYW5Kb1pOMTdrVyIsYWRkcmVzczoiWHI1NTZSenV3WDZoZzVFR3BreWJidjVSYW5Kb1pOMTdrVyIsdGl0bGU6IlRJVExFX0RBU0hfQUREUkVTUyJ9fSl9c2hvd0V0aGVyUXJDb2RlKCl7dGhpcy5kaWFsb2cub3BlbihFcyx7ZGF0YTp7ZGF0YToiMHgwZjkzM2FiOWZDQUFBNzgyRDAyNzlDMzAwRDczNzUwZTEzMTFFQUU2Iix1cmw6Ii4vcmVkaXJlY3Q/dG89aHR0cHM6Ly9ldGhlcnNjYW4uaW8vYWRkcmVzcy8weDBmOTMzYWI5ZmNhYWE3ODJkMDI3OWMzMDBkNzM3NTBlMTMxMWVhZTYiLGFkZHJlc3M6IjB4MGY5MzNhYjlmQ0FBQTc4MkQwMjc5QzMwMEQ3Mzc1MGUxMzExRUFFNiIsdGl0bGU6IlRJVExFX0VUSEVSX0FERFJFU1MifX0pfXVzZVdhbGxldCgpe3RoaXMucGF5bWVudE1vZGU9IndhbGxldCIsdGhpcy5jaG9vc2VQYXltZW50KCl9cmVzZXRDb3Vwb25Gb3JtKCl7dGhpcy5jb3Vwb25Db250cm9sLnNldFZhbHVlKCIiKSx0aGlzLmNvdXBvbkNvbnRyb2wubWFya0FzUHJpc3RpbmUoKSx0aGlzLmNvdXBvbkNvbnRyb2wubWFya0FzVW50b3VjaGVkKCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLXBheW1lbnQiXV0sZGVjbHM6MjQsdmFyczoxMCxjb25zdHM6W1siY291cG9uIiwiIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1vd24tY2FyZCIsIm1hdC1lbGV2YXRpb24tejYiXSxbMSwibWRjLWNhcmQiXSxbMywiZW1pdFNlbGVjdGlvbiIsImFsbG93RGVsZXRlIl0sWzEsIm1hdC1lbGV2YXRpb24tejAiLCJjdXN0b20tY2FyZCJdLFsiaWQiLCJjb2xsYXBzZUNvdXBvbkVsZW1lbnQiLDEsIm1hdC1lbGV2YXRpb24tejAiLDMsImV4cGFuZGVkIl0sWzEsIm1hdC1lbGV2YXRpb24tejAiLDMsImV4cGFuZGVkIl0sWzEsIm5hdi1zZWN0aW9uIl0sWyJtYXQtc3Ryb2tlZC1idXR0b24iLCIiLDEsImJ0biIsImJ0bi1yZXR1cm4iLDMsImNsaWNrIl0sWzEsIm5hdi10ZXh0Il0sWyJ0cmFuc2xhdGUiLCIiXSxbIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwibWF0LWJ1dHRvbiIsIiIsImNvbG9yIiwicHJpbWFyeSIsImFyaWEtbGFiZWwiLCJQcm9jZWVkIHRvIHJldmlldyIsMSwiYnRuIiwibmV4dEJ1dHRvbiIsMywiY2xpY2siLCJkaXNhYmxlZCJdLFsxLCJyb3ciXSxbMSwiY29sIiwiY29sLTQyIl0sWyJ0cmFuc2xhdGUiLCIiLDEsImNhcmQtdGl0bGUiXSxbMSwiY29sIiwiY29sLTM4Il0sWzEsImNvbmZpcm1hdGlvbiIsImNhcmQtdGl0bGUiXSxbMSwiY29sIiwiY29sLTIwIl0sWyJ0eXBlIiwic3VibWl0IiwiY29sb3IiLCJwcmltYXJ5IiwibWF0LXJhaXNlZC1idXR0b24iLCIiLDEsImJ0biIsImJ0bi1mbG9hdC1yaWdodCIsMywiY2xpY2siLCJkaXNhYmxlZCJdLFsxLCJmYXMiLCJmYS1oYW5kLWhvbGRpbmctdXNkIiwiZmEtbGciXSxbMSwiZGV0YWlsLWRpdmlkZXIiXSxbMSwiY29uZmlybWF0aW9uIiwibWVzc2FnZS1zcGFjaW5nIl0sWzEsImVycm9yIiwibWVzc2FnZS1zcGFjaW5nIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZSIsImNvbG9yIiwiYWNjZW50Il0sWzMsImlubmVySHRtbCJdLFsiaWQiLCJjb3Vwb24iLCJtYXRJbnB1dCIsIiIsInR5cGUiLCJ0ZXh0IiwzLCJmb3JtQ29udHJvbCIsInBsYWNlaG9sZGVyIl0sWyJhbGlnbiIsImVuZCJdLFsidHlwZSIsInN1Ym1pdCIsImlkIiwiYXBwbHlDb3Vwb25CdXR0b24iLCJjb2xvciIsImFjY2VudCIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwxLCJidG4tZmxvYXQtcmlnaHQtc3BhY2luZyIsMywiY2xpY2siLCJkaXNhYmxlZCJdLFsxLCJyb3ciLCJyZXNwb25zaXZlLXJvdyJdLFsxLCJjb2wiLCJjb2wtMzQiLCJtYXQtZWxldmF0aW9uLXowIl0sWzEsInBheW1lbnQtbGFiZWwiXSxbInRyYW5zbGF0ZSIsIiIsMywidHJhbnNsYXRlUGFyYW1zIl0sWzEsImZhcyIsImZhLWhlYXJ0IiwiZXJyb3IiLCJpY29uLXNwYWNpbmciXSxbMSwiYnV0dG9uLWNvbnRhaW5lciIsImJ1dHRvbi1jb250YWluZXItc3BhY2luZyJdLFsiaHJlZiIsImh0dHBzOi8vcHduaW5nLm93YXNwLWp1aWNlLnNob3AvY29tcGFuaW9uLWd1aWRlL2xhdGVzdC9wYXJ0My9kb25hdGlvbnMuaHRtbCJdLFsibWF0LXN0cm9rZWQtYnV0dG9uIiwiIl0sWzEsImZhYiIsImZhLXN0cmlwZSIsImZhLWxnIl0sWzEsImZpbGwtcmVtYWluaW5nLXNwYWNlIl0sWzEsImNvbCIsImNvbC02NSIsIm1hdC1lbGV2YXRpb24tejAiXSxbMSwiZmFzIiwiZmEtdGh1bWJzLXVwIiwiY29uZmlybWF0aW9uIiwiaWNvbi1zcGFjaW5nIl0sWyJocmVmIiwiLi9yZWRpcmVjdD90bz1odHRwOi8vc2hvcC5zcHJlYWRzaGlydC5jb20vanVpY2VzaG9wIl0sWzEsImZhcyIsImZhLXRzaGlydCIsImZhLWxnIl0sWyJocmVmIiwiLi9yZWRpcmVjdD90bz1odHRwOi8vc2hvcC5zcHJlYWRzaGlydC5kZS9qdWljZXNob3AiXSxbImhyZWYiLCIuL3JlZGlyZWN0P3RvPWh0dHBzOi8vd3d3LnN0aWNrZXJ5b3UuY29tL3Byb2R1Y3RzL293YXNwLWp1aWNlLXNob3AvNzk0Il0sWzEsImZhcyIsImZhLXN0aWNreS1ub3RlIiwiZmEtbGciXSxbImhyZWYiLCIuL3JlZGlyZWN0P3RvPWh0dHA6Ly9sZWFucHViLmNvbS9qdWljZS1zaG9wIl0sWzEsImZhYiIsImZhLWxlYW5wdWIiLCJmYS1sZyJdLFsiaHJlZiIsImh0dHBzOi8vb3BlbnNlYS5pby9jb2xsZWN0aW9uL2p1aWNlLXNob3AiXSxbMSwiZmFzIiwiZmEtcGFsZXR0ZSIsImZhLWxnIl0sWyJtYXQtc3Ryb2tlZC1idXR0b24iLCIiLDMsImNsaWNrIl0sWzEsImZhYiIsImZhLWJ0YyIsImZhLWxnIl0sWzEsImZhLWxnIl0sWzEsImZhYiIsImZhLWV0aGVyZXVtIiwiZmEtbGciXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsIm1hdC1jYXJkIiwxKSgxLCJkaXYiLDIpKDIsImFwcC1wYXltZW50LW1ldGhvZCIsMyksUygiZW1pdFNlbGVjdGlvbiIsZnVuY3Rpb24obyl7cmV0dXJuIGEuZ2V0TWVzc2FnZShvKX0pLHMoKSx1KDMsIm1hdC1kaXZpZGVyIiksTSg0LG9VLDE2LDYsImRpdiIsNCksdSg1LCJtYXQtZGl2aWRlciIpLE0oNixkVSwyNiwyNywibWF0LWV4cGFuc2lvbi1wYW5lbCIsNSksdSg3LCJtYXQtZGl2aWRlciIpLE0oOCxfVSw1NywxMiwibWF0LWV4cGFuc2lvbi1wYW5lbCIsNiksdSg5LCJtYXQtZGl2aWRlciIpLGMoMTAsInNlY3Rpb24iLDcpKDExLCJidXR0b24iLDgpLFMoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiBhLnJvdXRlVG9QcmV2aW91c1VybCgpfSksYygxMiwibWF0LWljb24iKSxtKDEzLCIgbmF2aWdhdGVfYmVmb3JlICIpLHMoKSxtKDE0KSxiKDE1LCJ0cmFuc2xhdGUiKSxzKCksYygxNiwicCIsOSksTSgxNyxiVSwyLDAsInNwYW4iLDEwKSxNKDE4LENVLDIsMCwic3BhbiIsMTApLHMoKSxjKDE5LCJidXR0b24iLDExKSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4gYS5jaG9vc2VQYXltZW50KCl9KSxjKDIwLCJtYXQtaWNvbiIpLG0oMjEsIiBuYXZpZ2F0ZV9uZXh0ICIpLHMoKSxjKDIyLCJzcGFuIiwxMCksbSgyMywiTEFCRUxfQ09OVElOVUUiKSxzKCkoKSgpKCkoKSksaSYyJiYobCgyKSxmKCJhbGxvd0RlbGV0ZSIsITEpLGwoMiksdyhhLm1vZGUhPT0id2FsbGV0Ij80Oi0xKSxsKDIpLHcoYS5tb2RlIT09IndhbGxldCI/NjotMSksbCgyKSx3KGEubW9kZSE9PSJ3YWxsZXQiPzg6LTEpLGwoNiksRSgiICIsQygxNSw4LCJMQUJFTF9CQUNLIiksIiAiKSxsKDMpLHcoYS5tb2RlIT09ImRlbHV4ZSImJmEubW9kZSE9PSJ3YWxsZXQiPzE3Oi0xKSxsKCksdyhhLm1vZGU9PT0id2FsbGV0Ij8xODotMSksbCgpLGYoImRpc2FibGVkIixhLnBheW1lbnRJZD09PXZvaWQgMCYmYS5wYXltZW50TW9kZSE9PSJ3YWxsZXQiKSl9LGRlcGVuZGVuY2llczpbZGUscGUsSXMsQTEsWSxTZSxvZSxsZSxZbixubyxybyxXMyxRZSxaZSxodCxmMSxRdCwkZSxudCxhdCxndCxtdCx6dCxlMSxnZSxDZSxLXSxzdHlsZXM6W2BtYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0ubWF0LW93bi1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tcmlnaHQ6MjAlfS5uYXYtc2VjdGlvbltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczphdXRvIGF1dG8gYXV0bzttYXJnaW4tYm90dG9tOjEuMjVyZW07bWFyZ2luLXRvcDoxLjI1cmVtfS5uYXYtdGV4dFtfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LmJ0bi1yZXR1cm5bX25nY29udGVudC0lQ09NUCVdLCAubmV4dEJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17d2lkdGg6bWluLWNvbnRlbnR9Lm5leHRCdXR0b25bX25nY29udGVudC0lQ09NUCVde2p1c3RpZnktc2VsZjplbmR9bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDphdXRvfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17ZmxleC1iYXNpczowfS5tYXQtbWRjLXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1yaWdodDouMTI1cmVtfS5jdXN0b20tY2FyZFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxLjI1cmVtIDEuNXJlbX0uY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MzZweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LmZpbGwtcmVtYWluaW5nLXNwYWNlW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjEgMSBhdXRvfS5kZXRhaWwtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTouNjI1cmVtO21hcmdpbi10b3A6LjYyNXJlbX0ubWF0LW1kYy1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGl2aWRlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZSFpbXBvcnRhbnR9LnJvd1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleH0uY29sW19uZ2NvbnRlbnQtJUNPTVAlXXttaW4td2lkdGg6MH0uY29sLTQyW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMCA0MiU7bWF4LXdpZHRoOjQyJX0uY29sLTM4W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMCAzOCU7bWF4LXdpZHRoOjM4JX0uY29sLTIwW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMCAyMCU7bWF4LXdpZHRoOjIwJX0uY29sLTM0W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMCAzNCU7bWF4LXdpZHRoOjM0JX0uY29sLTY1W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMCA2NSU7bWF4LXdpZHRoOjY1JX0ucmVzcG9uc2l2ZS1yb3dbX25nY29udGVudC0lQ09NUCVde2ZsZXgtd3JhcDpub3dyYXB9QG1lZGlhIChtYXgtd2lkdGg6IDEyNzkuOThweCl7LnJlc3BvbnNpdmUtcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LnJlc3BvbnNpdmUtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jb2xbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MCAwIDEwMCU7bWF4LXdpZHRoOjEwMCV9LmZpbGwtcmVtYWluaW5nLXNwYWNlW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9fUBtZWRpYSAobWF4LXdpZHRoOiA5NTkuOThweCl7Lm1hdC1vd24tY2FyZFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MTAlO21hcmdpbi1yaWdodDoxMCV9Lm5hdi10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtncmlkLWNvbHVtbjotMS8xO2dyaWQtcm93OjF9Lm5leHRCdXR0b25bX25nY29udGVudC0lQ09NUCVde2dyaWQtY29sdW1uOjMvLTF9fS5idG4tZmxvYXQtcmlnaHRbX25nY29udGVudC0lQ09NUCVde2Zsb2F0OnJpZ2h0fS5tZXNzYWdlLXNwYWNpbmdbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjI1cmVtfS5idG4tZmxvYXQtcmlnaHQtc3BhY2luZ1tfbmdjb250ZW50LSVDT01QJV17ZmxvYXQ6cmlnaHQ7bWFyZ2luLXRvcDouMjVyZW19Lmljb24tc3BhY2luZ1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6LjEyNXJlbX0uYnV0dG9uLWNvbnRhaW5lci1zcGFjaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41cmVtfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgaEMscEM9eCgoKT0+e0Y3KCk7aGUoKTtrKCk7aGUoKTtoQz0oKCk9PntjbGFzcyB0e3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1zYXZlZC1wYXltZW50LW1ldGhvZHMiXV0sZGVjbHM6Myx2YXJzOjEsY29uc3RzOltbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwibWF0LW93bi1jYXJkIiwibWF0LWVsZXZhdGlvbi16NiJdLFsxLCJtZGMtY2FyZCJdLFszLCJhbGxvd0RlbGV0ZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwibWF0LWNhcmQiLDApKDEsImRpdiIsMSksdSgyLCJhcHAtcGF5bWVudC1tZXRob2QiLDIpLHMoKSgpKSxpJjImJihsKDIpLGYoImFsbG93RGVsZXRlIiwhMCkpfSxkZXBlbmRlbmNpZXM6W2RlLHBlLElzXSxzdHlsZXM6W2AubWF0LW93bi1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tcmlnaHQ6MjAlfUBtZWRpYSAobWF4LXdpZHRoOiA5NTkuOThweCl7Lm1hdC1vd24tY2FyZFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MTAlO21hcmdpbi1yaWdodDoxMCV9fQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgVG8sTHM9eCgoKT0+e050KCk7aygpO1d0KCk7bHQoKTtrKCk7VG89KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtob3N0PXRoaXMuaG9zdFNlcnZlcisiL3Jlc3Qvb3JkZXItaGlzdG9yeSI7Z2V0KCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0KS5waXBlKHEoZT0+ZS5kYXRhKSxqKGU9Pnt0aHJvdyBlfSkpfWdldEFsbCgpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaG9zdCsiL29yZGVycyIpLnBpcGUocShlPT5lLmRhdGEpLGooZT0+e3Rocm93IGV9KSl9dG9nZ2xlRGVsaXZlcnlTdGF0dXMoZSxpKXtyZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLmhvc3R9LyR7ZX0vZGVsaXZlcnktc3RhdHVzYCxpKS5waXBlKHEoYT0+YS5kYXRhKSxqKGE9Pnt0aHJvdyBhfSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjLHByb3ZpZGVkSW46InJvb3QifSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gTVUodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIiwzMCl9ZnVuY3Rpb24gd1UodCxuKXtpZih0JjEmJihjKDAsIm1hdC1jZWxsIiksbSgxKSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgpLEUoIiAiLGUub3JkZXJJZCl9fWZ1bmN0aW9uIFNVKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIsMzEpfWZ1bmN0aW9uIGtVKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIsMzIpLG0oMSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxFKCIgIixlLnRvdGFsUHJpY2U9PW51bGw/bnVsbDplLnRvdGFsUHJpY2UudG9GaXhlZCgyKSwiXHhBNCIpfX1mdW5jdGlvbiB6VSh0LG4pe3QmMSYmdSgwLCJtYXQtaGVhZGVyLWNlbGwiLDMzKX1mdW5jdGlvbiBUVSh0LG4pe3QmMSYmKGMoMCwiZGl2IiwzNCksbSgxLCJMQUJFTF9ERUxJVkVSRUQiKSxzKCkpfWZ1bmN0aW9uIEVVKHQsbil7dCYxJiYoYygwLCJkaXYiLDM1KSxtKDEsIkxBQkVMX0lOX1RSQU5TSVQiKSxzKCkpfWZ1bmN0aW9uIEFVKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIsMzIpLE0oMSxUVSwyLDAsImRpdiIsMzQpKDIsRVUsMiwwLCJkaXYiLDM1KSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgpLHcoZS5kZWxpdmVyZWQ/MToyKX19ZnVuY3Rpb24gRFUodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIiwzMil9ZnVuY3Rpb24gSVUodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImJ1dHRvbiIsMzcpLGIoMSwidHJhbnNsYXRlIiksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCkuJGltcGxpY2l0LHI9digpO3JldHVybiBUKHIuY2hhbmdlRGVsaXZlcnlTdGF0dXMoYS5kZWxpdmVyZWQsYS5pZCkpfSksYygyLCJtYXQtaWNvbiIpLG0oMywiIGNhY2hlZCAiKSxzKCkoKX10JjImJmYoIm1hdFRvb2x0aXAiLFZlKEMoMSwyLCJMQUJFTF9NQVJLX0FTX1RSQU5TSVQiKSkpfWZ1bmN0aW9uIExVKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJidXR0b24iLDM3KSxiKDEsInRyYW5zbGF0ZSIpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpLiRpbXBsaWNpdCxyPXYoKTtyZXR1cm4gVChyLmNoYW5nZURlbGl2ZXJ5U3RhdHVzKGEuZGVsaXZlcmVkLGEuaWQpKX0pLGMoMiwibWF0LWljb24iKSxtKDMsIiBjaGVja19jaXJjbGUgIikscygpKCl9dCYyJiZmKCJtYXRUb29sdGlwIixWZShDKDEsMiwiTEFCRUxfTUFSS19BU19ERUxJVkVSRUQiKSkpfWZ1bmN0aW9uIFBVKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIsMzIpLE0oMSxJVSw0LDQsImJ1dHRvbiIsMzYpKDIsTFUsNCw0LCJidXR0b24iLDM2KSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgpLHcoZS5kZWxpdmVyZWQ/MToyKX19ZnVuY3Rpb24gVlUodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1yb3ciKX1mdW5jdGlvbiBPVSh0LG4pe3QmMSYmdSgwLCJtYXQtcm93Iil9ZnVuY3Rpb24gSFUodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIiwzOCl9ZnVuY3Rpb24gTlUodCxuKXtpZih0JjEmJihjKDAsIm1hdC1jZWxsIiksbSgxKSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgpLEEoZS5uYW1lKX19ZnVuY3Rpb24gUlUodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIiwzOSl9ZnVuY3Rpb24gRlUodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsIm1hdC1jZWxsIikoMSwibWF0LWZvcm0tZmllbGQiLDQwKSx1KDIsImlucHV0Iiw0MSwyKSxjKDQsImJ1dHRvbiIsNDIpLFMoImNsaWNrIixmdW5jdGlvbigpe2xldCBhPXooZSkuJGltcGxpY2l0LHI9c2UoMyksbz12KCk7cmV0dXJuIFQoby5tb2RpZnlQcmljZShhLmlkLHIudmFsdWUpKX0pLHUoNSwiaSIsNDMpLHMoKSgpKCl9aWYodCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKDIpLGYoInZhbHVlIixWZShlLnByaWNlKSl9fWZ1bmN0aW9uIEJVKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIsNDQpfWZ1bmN0aW9uIFVVKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJtYXQtY2VsbCIpKDEsIm1hdC1mb3JtLWZpZWxkIiw0MCksdSgyLCJpbnB1dCIsNDEsMyksYyg0LCJidXR0b24iLDQyKSxTKCJjbGljayIsZnVuY3Rpb24oKXtsZXQgYT16KGUpLiRpbXBsaWNpdCxyPXNlKDMpLG89digpO3JldHVybiBUKG8ubW9kaWZ5UXVhbnRpdHkoby5xdWFudGl0eU1hcFthLmlkXS5pZCxyLnZhbHVlKSl9KSx1KDUsImkiLDQzKSxzKCkoKSgpfWlmKHQmMil7bGV0IGU9bi4kaW1wbGljaXQsaT12KCk7bCgyKSxmKCJ2YWx1ZSIsVmUoaS5xdWFudGl0eU1hcFtlLmlkXS5xdWFudGl0eSkpfX1mdW5jdGlvbiBqVSh0LG4pe3QmMSYmdSgwLCJtYXQtaGVhZGVyLXJvdyIpfWZ1bmN0aW9uIHFVKHQsbil7dCYxJiZ1KDAsIm1hdC1yb3ciKX12YXIgeVUseFUsZkMsdUM9eCgoKT0+e2o0KCk7aygpO1Q0KCk7TTIoKTtjcygpO1l0KCk7cjEoKTtMcygpO0oxKCk7ZXQoKTtKZSgpO3ZlKCk7dmkoKTtuZSgpO1coKTtoZSgpO2soKTtoZSgpO1coKTt2ZSgpO0plKCk7ZXQoKTt5VT1bInBhZ2luYXRvck9yZGVySGlzdG9yeSJdLHhVPVsicGFnaW5hdG9yIl07TGUuYWRkKEhwKTtmQz0oKCk9PntjbGFzcyB0e3Byb2R1Y3RTZXJ2aWNlPWgobG4pO3F1YW50aXR5U2VydmljZT1oKGJvKTtvcmRlckhpc3RvcnlTZXJ2aWNlPWgoVG8pO3NuYWNrQmFySGVscGVyU2VydmljZT1oKFZ0KTtvcmRlckhpc3RvcnlDb2x1bW5zPVsiT3JkZXJJZCIsIlByaWNlIiwiU3RhdHVzIiwiU3RhdHVzQnV0dG9uIl07cGFnaW5hdG9yT3JkZXJIaXN0b3J5O29yZGVyRGF0YTtvcmRlclNvdXJjZTtkaXNwbGF5ZWRDb2x1bW5zPVsiUHJvZHVjdCIsIlByaWNlIiwiUXVhbnRpdHkiXTt0YWJsZURhdGE7ZGF0YVNvdXJjZTtwYWdpbmF0b3I7cHJvZHVjdFN1YnNjcmlwdGlvbjtxdWFudGl0eVN1YnNjcmlwdGlvbjtxdWFudGl0eU1hcDtuZ0FmdGVyVmlld0luaXQoKXt0aGlzLmxvYWRRdWFudGl0eSgpLHRoaXMubG9hZFByb2R1Y3RzKCksdGhpcy5sb2FkT3JkZXJzKCl9bG9hZFF1YW50aXR5KCl7dGhpcy5xdWFudGl0eVN1YnNjcmlwdGlvbj10aGlzLnF1YW50aXR5U2VydmljZS5nZXRBbGwoKS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMucXVhbnRpdHlNYXA9e30sZS5mb3JFYWNoKGk9Pnt0aGlzLnF1YW50aXR5TWFwW2kuUHJvZHVjdElkXT17aWQ6aS5pZCxxdWFudGl0eTppLnF1YW50aXR5fX0pfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSl9bG9hZFByb2R1Y3RzKCl7dGhpcy5wcm9kdWN0U3Vic2NyaXB0aW9uPXRoaXMucHJvZHVjdFNlcnZpY2Uuc2VhcmNoKCIiKS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMudGFibGVEYXRhPWUsdGhpcy5kYXRhU291cmNlPW5ldyBJMSh0aGlzLnRhYmxlRGF0YSksdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvcj10aGlzLnBhZ2luYXRvcn0sZXJyb3I6ZT0+e2NvbnNvbGUubG9nKGUpfX0pfWxvYWRPcmRlcnMoKXt0aGlzLm9yZGVySGlzdG9yeVNlcnZpY2UuZ2V0QWxsKCkuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLm9yZGVyRGF0YT1bXTtmb3IobGV0IGkgb2YgZSl0aGlzLm9yZGVyRGF0YS5wdXNoKHtpZDppLl9pZCxvcmRlcklkOmkub3JkZXJJZCx0b3RhbFByaWNlOmkudG90YWxQcmljZSxkZWxpdmVyZWQ6aS5kZWxpdmVyZWR9KTt0aGlzLm9yZGVyU291cmNlPW5ldyBJMSh0aGlzLm9yZGVyRGF0YSksdGhpcy5vcmRlclNvdXJjZS5wYWdpbmF0b3I9dGhpcy5wYWdpbmF0b3JPcmRlckhpc3Rvcnl9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KX1uZ09uRGVzdHJveSgpe3RoaXMucHJvZHVjdFN1YnNjcmlwdGlvbiYmdGhpcy5wcm9kdWN0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5xdWFudGl0eVN1YnNjcmlwdGlvbiYmdGhpcy5xdWFudGl0eVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfW1vZGlmeVF1YW50aXR5KGUsaSl7dGhpcy5xdWFudGl0eVNlcnZpY2UucHV0KGUse3F1YW50aXR5Omk8MD8wOml9KS5zdWJzY3JpYmUoe25leHQ6YT0+e2xldCByPXRoaXMudGFibGVEYXRhLmZpbmQobz0+by5pZD09PWEuUHJvZHVjdElkKTt0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKGBRdWFudGl0eSBmb3IgJHtyLm5hbWV9IGhhcyBiZWVuIHVwZGF0ZWQuYCwiY29uZmlybUJhciIpLHRoaXMubG9hZFF1YW50aXR5KCl9LGVycm9yOmE9Pnt0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKGEuZXJyb3IsImVycm9yQmFyIiksY29uc29sZS5sb2coYSl9fSl9bW9kaWZ5UHJpY2UoZSxpKXt0aGlzLnByb2R1Y3RTZXJ2aWNlLnB1dChlLHtwcmljZTppPDA/MDppfSkuc3Vic2NyaWJlKHtuZXh0OmE9Pnt0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKGBQcmljZSBmb3IgJHthLm5hbWV9IGhhcyBiZWVuIHVwZGF0ZWQuYCwiY29uZmlybUJhciIpLHRoaXMubG9hZFByb2R1Y3RzKCl9LGVycm9yOmE9Pnt0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKGEuZXJyb3IsImVycm9yQmFyIiksY29uc29sZS5sb2coYSl9fSl9Y2hhbmdlRGVsaXZlcnlTdGF0dXMoZSxpKXt0aGlzLm9yZGVySGlzdG9yeVNlcnZpY2UudG9nZ2xlRGVsaXZlcnlTdGF0dXMoaSx7ZGVsaXZlcnlTdGF0dXM6ZX0pLnN1YnNjcmliZSh7bmV4dDooKT0+e3RoaXMubG9hZE9yZGVycygpfSxlcnJvcjphPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihhLCJlcnJvckJhciIpLGNvbnNvbGUubG9nKGEpfX0pfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1hY2NvdW50aW5nIl1dLHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKHRlKHlVLDcpLHRlKHhVLDcpKSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5wYWdpbmF0b3JPcmRlckhpc3Rvcnk9ci5maXJzdCksRihyPUIoKSkmJihhLnBhZ2luYXRvcj1yLmZpcnN0KX19LGRlY2xzOjQ0LHZhcnM6OCxjb25zdHM6W1sicGFnaW5hdG9yT3JkZXJIaXN0b3J5IiwiIl0sWyJwYWdpbmF0b3IiLCIiXSxbInByaWNlIiwiIl0sWyJxdWFuaXRpdHkiLCIiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwibWF0LWVsZXZhdGlvbi16NiIsIm1hdC1vd24tY2FyZCJdLFsxLCJtZGMtY2FyZCJdLFsidHJhbnNsYXRlIiwiIl0sWzEsImNvbnRhaW5lciJdLFsxLCJvcmRlcnMtdGFibGUiXSxbMSwiaGVhZGluZyJdLFszLCJkYXRhU291cmNlIl0sWyJtYXRDb2x1bW5EZWYiLCJPcmRlcklkIl0sWyJ0cmFuc2xhdGUiLCJMQUJFTF9PUkRFUl9JRCIsNCwibWF0SGVhZGVyQ2VsbERlZiJdLFs0LCJtYXRDZWxsRGVmIl0sWyJtYXRDb2x1bW5EZWYiLCJQcmljZSJdLFsidHJhbnNsYXRlIiwiTEFCRUxfUFJJQ0UiLCJjbGFzcyIsImNlbGwiLDQsIm1hdEhlYWRlckNlbGxEZWYiXSxbImNsYXNzIiwiY2VsbCIsNCwibWF0Q2VsbERlZiJdLFsibWF0Q29sdW1uRGVmIiwiU3RhdHVzIl0sWyJ0cmFuc2xhdGUiLCJMQUJFTF9TVEFUVVMiLCJjbGFzcyIsImNlbGwiLDQsIm1hdEhlYWRlckNlbGxEZWYiXSxbIm1hdENvbHVtbkRlZiIsIlN0YXR1c0J1dHRvbiJdLFsiY2xhc3MiLCJjZWxsIiw0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWzQsIm1hdEhlYWRlclJvd0RlZiJdLFs0LCJtYXRSb3dEZWYiLCJtYXRSb3dEZWZDb2x1bW5zIl0sWyJjb2xvciIsImFjY2VudCIsMSwibWF0LWVsZXZhdGlvbi16MCIsMywicGFnZVNpemUiXSxbMSwiaW52ZW50b3J5LXRhYmxlIl0sWyJtYXRDb2x1bW5EZWYiLCJQcm9kdWN0Il0sWyJ0cmFuc2xhdGUiLCJMQUJFTF9QUk9EVUNUIiw0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWyJ0cmFuc2xhdGUiLCJMQUJFTF9QUklDRSIsNCwibWF0SGVhZGVyQ2VsbERlZiJdLFsibWF0Q29sdW1uRGVmIiwiUXVhbnRpdHkiXSxbInRyYW5zbGF0ZSIsIkxBQkVMX1FVQU5USVRZIiw0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWyJ0cmFuc2xhdGUiLCJMQUJFTF9PUkRFUl9JRCJdLFsidHJhbnNsYXRlIiwiTEFCRUxfUFJJQ0UiLDEsImNlbGwiXSxbMSwiY2VsbCJdLFsidHJhbnNsYXRlIiwiTEFCRUxfU1RBVFVTIiwxLCJjZWxsIl0sWyJ0cmFuc2xhdGUiLCIiLDEsImNvbmZpcm1hdGlvbiJdLFsidHJhbnNsYXRlIiwiIiwxLCJlcnJvciJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsIlByaW50IG9yZGVyIGNvbmZpcm1hdGlvbiIsIm1hdFRvb2x0aXBQb3NpdGlvbiIsImJlbG93IiwzLCJtYXRUb29sdGlwIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIiwiUHJpbnQgb3JkZXIgY29uZmlybWF0aW9uIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiYmVsb3ciLDMsImNsaWNrIiwibWF0VG9vbHRpcCJdLFsidHJhbnNsYXRlIiwiTEFCRUxfUFJPRFVDVCJdLFsidHJhbnNsYXRlIiwiTEFCRUxfUFJJQ0UiXSxbMSwiaW5wdXQtZmllbGQiXSxbIm1hdElucHV0IiwiIiwidHlwZSIsIm51bWJlciIsMywidmFsdWUiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsIm1hdFN1ZmZpeCIsIiIsMywiY2xpY2siXSxbMSwiZmFzIiwiZmEtY2hlY2siXSxbInRyYW5zbGF0ZSIsIkxBQkVMX1FVQU5USVRZIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYXQtY2FyZCIsNCkoMSwiZGl2Iiw1KSgyLCJoMSIsNiksbSgzLCJBQ0NPVU5USU5HIikscygpLGMoNCwiZGl2Iiw3KSg1LCJkaXYiLDgpKDYsImRpdiIsOSkoNywic3BhbiIsNiksbSg4LCJUSVRMRV9UUkFDS19PUkRFUlMiKSxzKCkoKSxjKDksIm1hdC10YWJsZSIsMTApLF9lKDEwLDExKSxSKDExLE1VLDEsMCwibWF0LWhlYWRlci1jZWxsIiwxMikoMTIsd1UsMiwxLCJtYXQtY2VsbCIsMTMpLGJlKCksX2UoMTMsMTQpLFIoMTQsU1UsMSwwLCJtYXQtaGVhZGVyLWNlbGwiLDE1KSgxNSxrVSwyLDEsIm1hdC1jZWxsIiwxNiksYmUoKSxfZSgxNiwxNyksUigxNyx6VSwxLDAsIm1hdC1oZWFkZXItY2VsbCIsMTgpKDE4LEFVLDMsMSwibWF0LWNlbGwiLDE2KSxiZSgpLF9lKDE5LDE5KSxSKDIwLERVLDEsMCwibWF0LWhlYWRlci1jZWxsIiwyMCkoMjEsUFUsMywxLCJtYXQtY2VsbCIsMTYpLGJlKCksUigyMixWVSwxLDAsIm1hdC1oZWFkZXItcm93IiwyMSkoMjMsT1UsMSwwLCJtYXQtcm93IiwyMikscygpLHUoMjQsIm1hdC1wYWdpbmF0b3IiLDIzLDApLHMoKSxjKDI2LCJkaXYiLDI0KSgyNywiZGl2Iiw5KSgyOCwic3BhbiIsNiksbSgyOSwiVElUTEVfQUxMX1BST0RVQ1RTIikscygpKCksYygzMCwibWF0LXRhYmxlIiwxMCksX2UoMzEsMjUpLFIoMzIsSFUsMSwwLCJtYXQtaGVhZGVyLWNlbGwiLDI2KSgzMyxOVSwyLDEsIm1hdC1jZWxsIiwxMyksYmUoKSxfZSgzNCwxNCksUigzNSxSVSwxLDAsIm1hdC1oZWFkZXItY2VsbCIsMjcpKDM2LEZVLDYsMiwibWF0LWNlbGwiLDEzKSxiZSgpLF9lKDM3LDI4KSxSKDM4LEJVLDEsMCwibWF0LWhlYWRlci1jZWxsIiwyOSkoMzksVVUsNiwyLCJtYXQtY2VsbCIsMTMpLGJlKCksUig0MCxqVSwxLDAsIm1hdC1oZWFkZXItcm93IiwyMSkoNDEscVUsMSwwLCJtYXQtcm93IiwyMikscygpLHUoNDIsIm1hdC1wYWdpbmF0b3IiLDIzLDEpLHMoKSgpKCkoKSksaSYyJiYobCg5KSxmKCJkYXRhU291cmNlIixhLm9yZGVyU291cmNlKSxsKDEzKSxmKCJtYXRIZWFkZXJSb3dEZWYiLGEub3JkZXJIaXN0b3J5Q29sdW1ucyksbCgpLGYoIm1hdFJvd0RlZkNvbHVtbnMiLGEub3JkZXJIaXN0b3J5Q29sdW1ucyksbCgpLGYoInBhZ2VTaXplIiwxMCksbCg2KSxmKCJkYXRhU291cmNlIixhLmRhdGFTb3VyY2UpLGwoMTApLGYoIm1hdEhlYWRlclJvd0RlZiIsYS5kaXNwbGF5ZWRDb2x1bW5zKSxsKCksZigibWF0Um93RGVmQ29sdW1ucyIsYS5kaXNwbGF5ZWRDb2x1bW5zKSxsKCksZigicGFnZVNpemUiLDEwKSl9LGRlcGVuZGVuY2llczpbZGUscGUsWSxTZSx0aSxuaSxhaSxyaSxpaSxvaSxsMSxSdCxnZSxDZSxjaSxsaSxzaSxkaSxubixRZSxaZSx2MiwkZSxudCxLXSxzdHlsZXM6W2AuaGVhZGluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwMDAwMjE7Zm9udC1zaXplOmxhcmdlO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luLWJvdHRvbTouNjI1cmVtO3BhZGRpbmc6LjYyNXJlbX0uY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmdyaWQ7Z2FwOjIuNXJlbTtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcn1AbWVkaWEgKG1heC13aWR0aDogMTQwMHB4KXsuY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtnYXA6MS41cmVtO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnJ9fW1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0Ojk2MHB4fW1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXXttaW4taGVpZ2h0OjAhaW1wb3J0YW50fS5vcmRlcnMtdGFibGVbX25nY29udGVudC0lQ09NUCVdLCAuaW52ZW50b3J5LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjEuMjVyZW19bWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbTouNXJlbX1tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleH0uY2VsbFtfbmdjb250ZW50LSVDT01QJV17bWF4LXdpZHRoOjZyZW19bWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtwYWRkaW5nOi41cmVtIDB9Lm1hdC1vd24tY2FyZFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjEuMjVyZW07bWFyZ2luLWxlZnQ6MTAlO21hcmdpbi1yaWdodDoxMCV9LnByb2R1Y3RbX25nY29udGVudC0lQ09NUCVde2N1cnNvcjpwb2ludGVyfS5pbnB1dC1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7d2lkdGg6MTYwcHh9CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIFlVKHQsbil7aWYodCYxJiYoYygwLCJzcGFuIikoMSwiZGl2IiwyNyksbSgyLCJFU1RJTUFURURfVElNRV9PRl9ERUxJVkVSWSIpLHMoKSgpKSx0JjIpe2xldCBlPXYoMik7bCgpLGYoInRyYW5zbGF0ZVBhcmFtcyIsYnQoMSxRVSxlLm9yZGVyRGV0YWlscy5ldGEpKX19ZnVuY3Rpb24gWlUodCxuKXtpZih0JjEmJihjKDAsImRpdiIpLE0oMSxZVSwzLDMsInNwYW4iKSxjKDIsImRpdiIpKDMsImIiLDQpLG0oNCwiTEFCRUxfREVMSVZFUllfQUREUkVTUyIpLHMoKSgpLGMoNSwiZGl2IiksbSg2KSxzKCksYyg3LCJkaXYiKSxtKDgpLHMoKSxjKDksImRpdiIpLG0oMTApLHMoKSxjKDExLCJkaXYiKSgxMiwic3BhbiIsNCksbSgxMywiUEhPTkVfTlVNQkVSIikscygpLG0oMTQpLHMoKSgpKSx0JjIpe2xldCBlPXYoKTtsKCksdyhlLm9yZGVyRGV0YWlscy5ldGEhPT0iPyImJmUub3JkZXJEZXRhaWxzLmV0YSE9PXZvaWQgMD8xOi0xKSxsKDUpLEEoZS5hZGRyZXNzPT1udWxsP251bGw6ZS5hZGRyZXNzLmZ1bGxOYW1lKSxsKDIpLEZhKCIiLGUuYWRkcmVzcz09bnVsbD9udWxsOmUuYWRkcmVzcy5zdHJlZXRBZGRyZXNzLCIsICIsZS5hZGRyZXNzPT1udWxsP251bGw6ZS5hZGRyZXNzLmNpdHksIiwgIixlLmFkZHJlc3M9PW51bGw/bnVsbDplLmFkZHJlc3Muc3RhdGUsIiwgIixlLmFkZHJlc3M9PW51bGw/bnVsbDplLmFkZHJlc3MuemlwQ29kZSksbCgyKSxBKGUuYWRkcmVzcz09bnVsbD9udWxsOmUuYWRkcmVzcy5jb3VudHJ5KSxsKDQpLEUoIiAiLGUuYWRkcmVzcz09bnVsbD9udWxsOmUuYWRkcmVzcy5tb2JpbGVOdW0pfX1mdW5jdGlvbiAkVSh0LG4pe3QmMSYmKGMoMCwibWF0LWhlYWRlci1jZWxsIiw0KSxtKDEsIkxBQkVMX1BST0RVQ1QiKSxzKCkpfWZ1bmN0aW9uIEtVKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIpLG0oMSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxFKCIiLGUubmFtZSwiICIpfX1mdW5jdGlvbiBYVSh0LG4pe3QmMSYmdSgwLCJtYXQtZm9vdGVyLWNlbGwiKX1mdW5jdGlvbiBKVSh0LG4pe3QmMSYmKGMoMCwibWF0LWhlYWRlci1jZWxsIiw0KSxtKDEsIkxBQkVMX1BSSUNFIikscygpKX1mdW5jdGlvbiBlaih0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWNlbGwiKSxtKDEpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKCksRSgiIixlLnByaWNlLCJceEE0Iil9fWZ1bmN0aW9uIHRqKHQsbil7dCYxJiZ1KDAsIm1hdC1mb290ZXItY2VsbCIpfWZ1bmN0aW9uIGlqKHQsbil7dCYxJiYoYygwLCJtYXQtaGVhZGVyLWNlbGwiLDQpLG0oMSwiTEFCRUxfUVVBTlRJVFkiKSxzKCkpfWZ1bmN0aW9uIGFqKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIpKDEsInNwYW4iKSxtKDIpLHMoKSgpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woMiksQShlLnF1YW50aXR5KX19ZnVuY3Rpb24gbmoodCxuKXt0JjEmJihjKDAsIm1hdC1mb290ZXItY2VsbCIpKDEsInRhYmxlIiwyOCkoMiwidHIiLDI5KSgzLCJ0ZCIsNCksbSg0LCJJVEVNUyIpLHMoKSgpLGMoNSwidHIiLDI5KSg2LCJ0ZCIsNCksbSg3LCJERUxJVkVSWSIpLHMoKSgpLGMoOCwidHIiLDI5KSg5LCJ0ZCIsNCksbSgxMCwiUFJPTU9USU9OIikscygpKCksYygxMSwidHIiLDMwKSgxMiwidGQiLDQpLG0oMTMsIkxBQkVMX1RPVEFMX1BSSUNFIikscygpKCkoKSgpKX1mdW5jdGlvbiByaih0LG4pe3QmMSYmKGMoMCwibWF0LWhlYWRlci1jZWxsIiw0KSxtKDEsIkxBQkVMX1RPVEFMX1BSSUNFIikscygpKX1mdW5jdGlvbiBvaih0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWNlbGwiLDMxKSxtKDEpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKCksRSgiIixlLnRvdGFsLnRvRml4ZWQoMiksIlx4QTQiKX19ZnVuY3Rpb24gY2oodCxuKXtpZih0JjEmJihjKDAsIm1hdC1mb290ZXItY2VsbCIpKDEsInRhYmxlIiwzMSkoMiwidHIiLDI5KSgzLCJ0ZCIpLG0oNCkscygpKCksYyg1LCJ0ciIsMjkpKDYsInRkIiksbSg3KSxzKCkoKSxjKDgsInRyIiwyOSkoOSwidGQiKSxtKDEwKSxzKCkoKSxjKDExLCJ0ciIsMzApKDEyLCJ0ZCIpLG0oMTMpLHMoKSgpKCkoKSksdCYyKXtsZXQgZT12KCk7bCg0KSxFKCIiLGUub3JkZXJEZXRhaWxzLml0ZW1Ub3RhbD09bnVsbD9udWxsOmUub3JkZXJEZXRhaWxzLml0ZW1Ub3RhbC50b0ZpeGVkKDIpLCJceEE0IiksbCgzKSxFKCIiLGUuZGVsaXZlcnlQcmljZS50b0ZpeGVkKDIpLCJceEE0IiksbCgzKSxFKCIiLGUucHJvbW90aW9uYWxEaXNjb3VudC50b0ZpeGVkKDIpLCJceEE0IiksbCgzKSxFKCIiLGUub3JkZXJEZXRhaWxzLnRvdGFsUHJpY2U9PW51bGw/bnVsbDplLm9yZGVyRGV0YWlscy50b3RhbFByaWNlLnRvRml4ZWQoMiksIlx4QTQiKX19ZnVuY3Rpb24gc2oodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1yb3ciKX1mdW5jdGlvbiBsaih0LG4pe3QmMSYmdSgwLCJtYXQtcm93Iil9ZnVuY3Rpb24gZGoodCxuKXt0JjEmJnUoMCwibWF0LWZvb3Rlci1yb3ciLDMyKX12YXIgR1UsV1UsUVUsZ0MsdkM9eCgoKT0+e2soKTtYYygpO3AxKCk7TTIoKTthYSgpO2lyKCk7SzEoKTtZdCgpO2VuKCk7dmUoKTt2aSgpO25lKCk7VygpO2hlKCk7aygpO2hlKCk7VygpO3ZlKCk7R1U9dD0+KHtpZDp0fSksV1U9dD0+KHtib251czp0fSksUVU9dD0+KHtudW1iZXJkYXlzOnR9KTtMZS5hZGQoUXIpO2dDPSgoKT0+e2NsYXNzIHR7Y29uZmlndXJhdGlvblNlcnZpY2U9aChMdCk7YWRkcmVzc1NlcnZpY2U9aChrMik7dHJhY2tPcmRlclNlcnZpY2U9aChnbyk7YWN0aXZhdGVkUm91dGU9aCgkMSk7YmFza2V0U2VydmljZT1oKGVpKTt0YWJsZUNvbHVtbnM9WyJwcm9kdWN0IiwicHJpY2UiLCJxdWFudGl0eSIsInRvdGFsIHByaWNlIl07ZGF0YVNvdXJjZTtvcmRlcklkO29yZGVyRGV0YWlscz17dG90YWxQcmljZTowfTtkZWxpdmVyeVByaWNlPTA7cHJvbW90aW9uYWxEaXNjb3VudD0wO2FkZHJlc3M7dHdlZXRUZXh0PSJJIGp1c3QgcHVyY2hhc2VkIjtuZ09uSW5pdCgpe3RoaXMuYWN0aXZhdGVkUm91dGUucGFyYW1NYXAuc3Vic2NyaWJlKHtuZXh0OmU9Pnt0aGlzLm9yZGVySWQ9ZS5nZXQoImlkIiksdGhpcy50cmFja09yZGVyU2VydmljZS5maW5kKHRoaXMub3JkZXJJZCkuc3Vic2NyaWJlKHtuZXh0Omk9Pnt0aGlzLnByb21vdGlvbmFsRGlzY291bnQ9aS5kYXRhWzBdLnByb21vdGlvbmFsQW1vdW50P3BhcnNlRmxvYXQoaS5kYXRhWzBdLnByb21vdGlvbmFsQW1vdW50KTowLHRoaXMuZGVsaXZlcnlQcmljZT1pLmRhdGFbMF0uZGVsaXZlcnlQcmljZT9wYXJzZUZsb2F0KGkuZGF0YVswXS5kZWxpdmVyeVByaWNlKTowLHRoaXMub3JkZXJEZXRhaWxzLmFkZHJlc3NJZD1pLmRhdGFbMF0uYWRkcmVzc0lkLHRoaXMub3JkZXJEZXRhaWxzLnBheW1lbnRJZD1pLmRhdGFbMF0ucGF5bWVudElkLHRoaXMub3JkZXJEZXRhaWxzLnRvdGFsUHJpY2U9aS5kYXRhWzBdLnRvdGFsUHJpY2UsdGhpcy5vcmRlckRldGFpbHMuaXRlbVRvdGFsPWkuZGF0YVswXS50b3RhbFByaWNlK3RoaXMucHJvbW90aW9uYWxEaXNjb3VudC10aGlzLmRlbGl2ZXJ5UHJpY2UsdGhpcy5vcmRlckRldGFpbHMuZXRhPWkuZGF0YVswXS5ldGF8fCI/Iix0aGlzLm9yZGVyRGV0YWlscy5wcm9kdWN0cz1pLmRhdGFbMF0ucHJvZHVjdHMsdGhpcy5vcmRlckRldGFpbHMuYm9udXM9aS5kYXRhWzBdLmJvbnVzLHRoaXMuZGF0YVNvdXJjZT1uZXcgSTEodGhpcy5vcmRlckRldGFpbHMucHJvZHVjdHMpO2ZvcihsZXQgYSBvZiB0aGlzLm9yZGVyRGV0YWlscy5wcm9kdWN0cyl0aGlzLnR3ZWV0VGV4dCs9YCUwYS0gJHthLm5hbWV9YDt0aGlzLnR3ZWV0VGV4dD10aGlzLnRydW5jYXRlVHdlZXQodGhpcy50d2VldFRleHQpLHRoaXMuY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0QXBwbGljYXRpb25Db25maWd1cmF0aW9uKCkuc3Vic2NyaWJlKHtuZXh0OmE9PnthPy5hcHBsaWNhdGlvbj8uc29jaWFsJiYodGhpcy50d2VldFRleHQrPSIlMGFmcm9tICIsYS5hcHBsaWNhdGlvbi5zb2NpYWwudHdpdHRlclVybD90aGlzLnR3ZWV0VGV4dCs9YS5hcHBsaWNhdGlvbi5zb2NpYWwudHdpdHRlclVybC5yZXBsYWNlKCJodHRwczovL3R3aXR0ZXIuY29tLyIsIkAiKTp0aGlzLnR3ZWV0VGV4dCs9YS5hcHBsaWNhdGlvbi5uYW1lKX0sZXJyb3I6YT0+e2NvbnNvbGUubG9nKGEpfX0pLHRoaXMuYWRkcmVzc1NlcnZpY2UuZ2V0QnlJZCh0aGlzLm9yZGVyRGV0YWlscy5hZGRyZXNzSWQpLnN1YnNjcmliZSh7bmV4dDphPT57dGhpcy5hZGRyZXNzPWF9LGVycm9yOmE9Pntjb25zb2xlLmxvZyhhKX19KX0sZXJyb3I6aT0+e2NvbnNvbGUubG9nKGkpfX0pfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSl9b3BlbkNvbmZpcm1hdGlvblBERigpe2xldCBlPWAke3RoaXMuYmFza2V0U2VydmljZS5ob3N0U2VydmVyfS9mdHAvb3JkZXJfJHt0aGlzLm9yZGVySWR9LnBkZmA7d2luZG93Lm9wZW4oZSwiX2JsYW5rIil9dHJ1bmNhdGVUd2VldD0oZSxpPTE0MCk9PntpZighZSlyZXR1cm4gbnVsbDtsZXQgYT1lLmxlbmd0aD5pO3JldHVybmAke2Uuc3Vic3RyaW5nKDAsaSl9JHthPyIuLi4iOiIifWB9O3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1vcmRlci1jb21wbGV0aW9uIl1dLGRlY2xzOjQ3LHZhcnM6MTksY29uc3RzOltbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwibWF0LWVsZXZhdGlvbi16NiIsIm1hdC1vd24tY2FyZCJdLFsxLCJtZGMtY2FyZCJdLFsxLCJvcmRlci1jb21wbGV0aW9uLWhlYWRlciJdLFsidHJhbnNsYXRlIiwiIiwxLCJjb25maXJtYXRpb24iXSxbInRyYW5zbGF0ZSIsIiJdLFsicm91dGVyTGluayIsIi90cmFjay1yZXN1bHQvbmV3IiwidHJhbnNsYXRlIiwiIiwzLCJxdWVyeVBhcmFtcyJdLFsxLCJoZWFkaW5nLWJhbm5lciJdLFsxLCJoZWFkaW5nLXRleHQiXSxbMSwib3JkZXItbGlua3MiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLCJUd2VldCIsMywiaHJlZiJdLFsxLCJmYWIiLCJmYS10d2l0dGVyIiwiZmEtbGciLCJ0d2VldC1sb2dvIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIiwiUHJpbnQgb3JkZXIgY29uZmlybWF0aW9uIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiYmVsb3ciLDMsImNsaWNrIiwibWF0VG9vbHRpcCJdLFsxLCJ0YWJsZS1jb250YWluZXIiXSxbMywiZGF0YVNvdXJjZSJdLFsibWF0Q29sdW1uRGVmIiwicHJvZHVjdCJdLFsidHJhbnNsYXRlIiwiIiw0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWzQsIm1hdENlbGxEZWYiXSxbNCwibWF0Rm9vdGVyQ2VsbERlZiJdLFsibWF0Q29sdW1uRGVmIiwicHJpY2UiXSxbIm1hdENvbHVtbkRlZiIsInF1YW50aXR5Il0sWyJtYXRDb2x1bW5EZWYiLCJ0b3RhbCBwcmljZSJdLFsiY2xhc3MiLCJwcmljZS1hbGlnbiIsNCwibWF0Q2VsbERlZiJdLFs0LCJtYXRIZWFkZXJSb3dEZWYiXSxbNCwibWF0Um93RGVmIiwibWF0Um93RGVmQ29sdW1ucyJdLFsibWF0LWZvb3Rlci1yb3ciLCIiLDQsIm1hdEZvb3RlclJvd0RlZiJdLFsxLCJib251cy1wb2ludC1jb250YWluZXIiXSxbInRyYW5zbGF0ZSIsIiIsMywidHJhbnNsYXRlUGFyYW1zIl0sWyJ0cmFuc2xhdGUiLCIiLDEsImNvbmZpcm1hdGlvbiIsMywidHJhbnNsYXRlUGFyYW1zIl0sWzEsIm1hdC10YWJsZSJdLFsxLCJtYXQtcm93Il0sWzEsIm1hdC1yb3ciLCJ0b3RhbC1yb3ciXSxbMSwicHJpY2UtYWxpZ24iXSxbIm1hdC1mb290ZXItcm93IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYXQtY2FyZCIsMCkoMSwiZGl2IiwxKSgyLCJkaXYiLDIpKDMsImRpdiIpKDQsImgxIiwzKSxtKDUsIlRIQU5LU19GT1JfUFVSQ0hBU0UiKSxzKCksYyg2LCJkaXYiLDQpLG0oNywiUFVSQ0hBU0VfQ09NTUVOVF9QUkVGSVggIiksYyg4LCJhIiw1KSxtKDksIlRJVExFX1RSQUNLX09SREVSUyIpLHMoKSxtKDEwLCIgUFVSQ0hBU0VfQ09NTUVOVF9TVUZGSVgiKSxzKCkoKSxNKDExLFpVLDE1LDgsImRpdiIpLHMoKSxjKDEyLCJkaXYiLDYpKDEzLCJzcGFuIiw3KSxtKDE0KSxiKDE1LCJ0cmFuc2xhdGUiKSxzKCksYygxNiwiZGl2Iiw4KSgxNywiYSIsOSksdSgxOCwiaSIsMTApLHMoKSxjKDE5LCJidXR0b24iLDExKSxiKDIwLCJ0cmFuc2xhdGUiKSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4gYS5vcGVuQ29uZmlybWF0aW9uUERGKCl9KSxjKDIxLCJtYXQtaWNvbiIpLG0oMjIsIm5vdGUiKSxzKCkoKSgpKCksYygyMywiZGl2IiwxMikoMjQsIm1hdC10YWJsZSIsMTMpLF9lKDI1LDE0KSxSKDI2LCRVLDIsMCwibWF0LWhlYWRlci1jZWxsIiwxNSkoMjcsS1UsMiwxLCJtYXQtY2VsbCIsMTYpKDI4LFhVLDEsMCwibWF0LWZvb3Rlci1jZWxsIiwxNyksYmUoKSxfZSgyOSwxOCksUigzMCxKVSwyLDAsIm1hdC1oZWFkZXItY2VsbCIsMTUpKDMxLGVqLDIsMSwibWF0LWNlbGwiLDE2KSgzMix0aiwxLDAsIm1hdC1mb290ZXItY2VsbCIsMTcpLGJlKCksX2UoMzMsMTkpLFIoMzQsaWosMiwwLCJtYXQtaGVhZGVyLWNlbGwiLDE1KSgzNSxhaiwzLDEsIm1hdC1jZWxsIiwxNikoMzYsbmosMTQsMCwibWF0LWZvb3Rlci1jZWxsIiwxNyksYmUoKSxfZSgzNywyMCksUigzOCxyaiwyLDAsIm1hdC1oZWFkZXItY2VsbCIsMTUpKDM5LG9qLDIsMSwibWF0LWNlbGwiLDIxKSg0MCxjaiwxNCw0LCJtYXQtZm9vdGVyLWNlbGwiLDE3KSxiZSgpLFIoNDEsc2osMSwwLCJtYXQtaGVhZGVyLXJvdyIsMjIpKDQyLGxqLDEsMCwibWF0LXJvdyIsMjMpKDQzLGRqLDEsMCwibWF0LWZvb3Rlci1yb3ciLDI0KSxzKCkoKSxjKDQ0LCJkaXYiLDI1KSg0NSwic3BhbiIsMjYpLG0oNDYsIkJPTlVTX1BPSU5UU19DT1VOVCIpLHMoKSgpKCkoKSksaSYyJiYobCg4KSxmKCJxdWVyeVBhcmFtcyIsYnQoMTUsR1UsYS5vcmRlcklkKSksbCgzKSx3KGEuYWRkcmVzcz8xMTotMSksbCgzKSxBKEMoMTUsMTEsIk9SREVSX1NVTU1BUlkiKSksbCgzKSxmKCJocmVmIixXMigiaHR0cHM6Ly90d2l0dGVyLmNvbS9pbnRlbnQvdHdlZXQ/dGV4dD0iLGEudHdlZXRUZXh0LCImaGFzaHRhZ3M9c2VjdXJpdHkiKSx3dCksbCgyKSxmKCJtYXRUb29sdGlwIixDKDIwLDEzLCJQUklOVF9PUkRFUl9DT05GSVJNQVRJT04iKSksbCg1KSxmKCJkYXRhU291cmNlIixhLmRhdGFTb3VyY2UpLGwoMTcpLGYoIm1hdEhlYWRlclJvd0RlZiIsYS50YWJsZUNvbHVtbnMpLGwoKSxmKCJtYXRSb3dEZWZDb2x1bW5zIixhLnRhYmxlQ29sdW1ucyksbCgpLGYoIm1hdEZvb3RlclJvd0RlZiIsYS50YWJsZUNvbHVtbnMpLGwoMiksZigidHJhbnNsYXRlUGFyYW1zIixidCgxNyxXVSxhLm9yZGVyRGV0YWlscy5ib251cykpKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxZLFNlLG0yLGwxLFJ0LGdlLENlLHRpLG5pLGFpLHJpLGlpLG9pLG9jLGNjLGNpLGxpLHNpLGRpLHNjLGxjLEtdLHN0eWxlczpbYC5vcmRlci1jb21wbGV0aW9uLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpncmlkO2dhcDoxLjVyZW07Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gbWlubWF4KDI1MHB4LG1heC1jb250ZW50KTttYXJnaW4tYm90dG9tOjFyZW19QG1lZGlhIChtYXgtd2lkdGg6IDgwMHB4KXsub3JkZXItY29tcGxldGlvbi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2dyaWQtdGVtcGxhdGUtY29sdW1uczphdXRvfX0ub3JkZXItY29tcGxldGlvbi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdID4gZGl2W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41cmVtfS5oZWFkaW5nLWJhbm5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQ6IzAwMDM7ZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZTp4LWxhcmdlO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO3BhZGRpbmc6LjI1cmVtIC41cmVtIC4yNXJlbSAxLjI1cmVtfS5vcmRlci1saW5rc1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleH0uaGVhZGluZy10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5tYXQtb3duLWNhcmRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWxlZnQ6MjAlO21hcmdpbi1yaWdodDoyMCV9bWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctbGVmdDouNjI1cmVtO3BhZGRpbmctcmlnaHQ6LjYyNXJlbX0ucHJpY2UtYWxpZ25bX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246cmlnaHR9LnR3ZWV0LWxvZ29bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoyNHB4fS50YWJsZS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdey0tbWF0LXRhYmxlLWZvb3Rlci1jb250YWluZXItaGVpZ2h0OiBhdXRvfS5ib251cy1wb2ludC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6MXJlbX0udG90YWwtcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo3MDB9CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIGhqKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2FyZCIsMTgpKDEsImRpdiIsNykoMiwiZGl2IikoMywiYiIpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKSxjKDYsImRpdiIpKDcsInNwYW4iKSxtKDgpLGIoOSwidHJhbnNsYXRlIikscygpLG0oMTApLHMoKSxjKDExLCJkaXYiKSgxMiwic3BhbiIpLG0oMTMpLGIoMTQsInRyYW5zbGF0ZSIpLHMoKSxtKDE1KSxzKCkoKSgpKSx0JjIpe2xldCBlPXYoMik7bCg0KSxBKEMoNSw1LCJQQVlNRU5UX01FVEhPRCIpKSxsKDQpLEEoQyg5LDcsIkNBUkRfRU5ESU5HX0lOIikpLGwoMiksRSgiICIsZS5wYXltZW50TWV0aG9kPT1udWxsP251bGw6ZS5wYXltZW50TWV0aG9kLmNhcmROdW0pLGwoMyksRSgiIixDKDE0LDksIkNBUkRfSE9MREVSIiksJyInKSxsKDIpLEUoIiAiLGUucGF5bWVudE1ldGhvZD09bnVsbD9udWxsOmUucGF5bWVudE1ldGhvZC5mdWxsTmFtZSl9fWZ1bmN0aW9uIHBqKHQsbil7dCYxJiYoYygwLCJtYXQtY2FyZCIsMTgpKDEsImRpdiIsNykoMiwiZGl2IikoMywiYiIpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKSxjKDYsImRpdiIpKDcsInNwYW4iKSxtKDgpLGIoOSwidHJhbnNsYXRlIikscygpKCkoKSgpKSx0JjImJihsKDQpLEEoQyg1LDIsIlBBWU1FTlRfTUVUSE9EIikpLGwoNCksQShDKDksNCwiRElHSVRBTF9XQUxMRVQiKSkpfWZ1bmN0aW9uIGZqKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDMpKDEsIm1hdC1jYXJkIiwxNykoMiwiZGl2Iiw3KSgzLCJkaXYiKSg0LCJiIiksbSg1KSxiKDYsInRyYW5zbGF0ZSIpLHMoKSgpLGMoNywiZGl2IiksbSg4KSxzKCksYyg5LCJkaXYiKSxtKDEwKSxzKCksYygxMSwiZGl2IiksbSgxMikscygpLGMoMTMsImRpdiIpKDE0LCJzcGFuIiksbSgxNSksYigxNiwidHJhbnNsYXRlIikscygpLG0oMTcpLHMoKSgpKCksTSgxOCxoaiwxNiwxMSwibWF0LWNhcmQiLDE4KSgxOSxwaiwxMCw2LCJtYXQtY2FyZCIsMTgpLHMoKSksdCYyKXtsZXQgZT12KCk7bCg1KSxBKEMoNiwxMCwiTEFCRUxfREVMSVZFUllfQUREUkVTUyIpKSxsKDMpLEEoZS5hZGRyZXNzPT1udWxsP251bGw6ZS5hZGRyZXNzLmZ1bGxOYW1lKSxsKDIpLEZhKCIiLGUuYWRkcmVzcz09bnVsbD9udWxsOmUuYWRkcmVzcy5zdHJlZXRBZGRyZXNzLCIsICIsZS5hZGRyZXNzPT1udWxsP251bGw6ZS5hZGRyZXNzLmNpdHksIiwgIixlLmFkZHJlc3M9PW51bGw/bnVsbDplLmFkZHJlc3Muc3RhdGUsIiwgIixlLmFkZHJlc3M9PW51bGw/bnVsbDplLmFkZHJlc3MuemlwQ29kZSksbCgyKSxBKGUuYWRkcmVzcz09bnVsbD9udWxsOmUuYWRkcmVzcy5jb3VudHJ5KSxsKDMpLEEoQygxNiwxMiwiUEhPTkVfTlVNQkVSIikpLGwoMiksRSgiICIsZS5hZGRyZXNzPT1udWxsP251bGw6ZS5hZGRyZXNzLm1vYmlsZU51bSksbCgpLHcoZS5wYXltZW50TWV0aG9kIT09IndhbGxldCI/MTg6MTkpfX12YXIgbWosX0MsYkM9eCgoKT0+e2soKTtpcigpO0RzKCk7YWEoKTtwMSgpO0o0KCk7SjEoKTt2ZSgpO25lKCk7aTcoKTtXKCk7aGUoKTtrKCk7aGUoKTtuZSgpO3ZlKCk7VygpO21qPXQ9Pih7Ym9udXM6dH0pO19DPSgoKT0+e2NsYXNzIHR7cm91dGVyPWgoeXQpO2FkZHJlc3NTZXJ2aWNlPWgoazIpO3BheW1lbnRTZXJ2aWNlPWgoem8pO2Jhc2tldFNlcnZpY2U9aChlaSk7ZGVsaXZlcnlTZXJ2aWNlPWgoZm4pO25nWm9uZT1oKHJlKTtzbmFja0JhckhlbHBlclNlcnZpY2U9aChWdCk7Ym9udXM9MDtpdGVtVG90YWw9MDtkZWxpdmVyeVByaWNlPTA7cHJvbW90aW9uYWxEaXNjb3VudD0wO2FkZHJlc3M7cGF5bWVudE1ldGhvZDtuZ09uSW5pdCgpe3RoaXMuZGVsaXZlcnlTZXJ2aWNlLmdldEJ5SWQoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiZGVsaXZlcnlNZXRob2RJZCIpKS5zdWJzY3JpYmUoZT0+e3RoaXMuZGVsaXZlcnlQcmljZT1lLnByaWNlfSksdGhpcy5hZGRyZXNzU2VydmljZS5nZXRCeUlkKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImFkZHJlc3NJZCIpKS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMuYWRkcmVzcz1lfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSksc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgicGF5bWVudElkIikhPT0id2FsbGV0Ij90aGlzLnBheW1lbnRTZXJ2aWNlLmdldEJ5SWQoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgicGF5bWVudElkIikpLnN1YnNjcmliZSh7bmV4dDplPT57ZS5jYXJkTnVtPVN0cmluZyhlLmNhcmROdW0pLnN1YnN0cmluZyhTdHJpbmcoZS5jYXJkTnVtKS5sZW5ndGgtNCksdGhpcy5wYXltZW50TWV0aG9kPWV9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KTpzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJwYXltZW50SWQiKT09PSJ3YWxsZXQiJiYodGhpcy5wYXltZW50TWV0aG9kPSJ3YWxsZXQiKX1nZXRNZXNzYWdlKGUpe3RoaXMuaXRlbVRvdGFsPWVbMF0sdGhpcy5wcm9tb3Rpb25hbERpc2NvdW50PXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImNvdXBvbkRpc2NvdW50Iik/cGFyc2VGbG9hdChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJjb3Vwb25EaXNjb3VudCIpKS8xMDAqdGhpcy5pdGVtVG90YWw6MCx0aGlzLmJvbnVzPWVbMV19cGxhY2VPcmRlcigpe2xldCBlPXtwYXltZW50SWQ6c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgicGF5bWVudElkIiksYWRkcmVzc0lkOnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImFkZHJlc3NJZCIpLGRlbGl2ZXJ5TWV0aG9kSWQ6c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiZGVsaXZlcnlNZXRob2RJZCIpfTt0aGlzLmJhc2tldFNlcnZpY2UuY2hlY2tvdXQoTnVtYmVyKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImJpZCIpKSxidG9hKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImNvdXBvbkRldGFpbHMiKSksZSkuc3Vic2NyaWJlKHtuZXh0Omk9PntzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCJwYXltZW50SWQiKSxzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCJhZGRyZXNzSWQiKSxzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCJkZWxpdmVyeU1ldGhvZElkIiksc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgiY291cG9uRGV0YWlscyIpLHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oImNvdXBvbkRpc2NvdW50IiksdGhpcy5iYXNrZXRTZXJ2aWNlLnVwZGF0ZU51bWJlck9mQ2FydEl0ZW1zKCksdGhpcy5uZ1pvbmUucnVuKCgpPT5QZSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMucm91dGVyLm5hdmlnYXRlKFsiL29yZGVyLWNvbXBsZXRpb24iLGldKX0pKX0sZXJyb3I6aT0+e2NvbnNvbGUubG9nKGkpLHRoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oaS5lcnJvcj8uZXJyb3IubWVzc2FnZSwiZXJyb3JCYXIiKX19KX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtb3JkZXItc3VtbWFyeSJdXSxkZWNsczo0Nix2YXJzOjM0LGNvbnN0czpbWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsImNvbnRhaW5lciIsIm1hdC1lbGV2YXRpb24tejYiLCJtYXQtb3duLWNhcmQiXSxbMSwibWRjLWNhcmQiLCJjb250YWluZXIiXSxbMSwiY29sdW1uIiwiZmxleC01MCJdLFsxLCJjb250YWluZXIiXSxbImlkIiwiYXBwLXB1cmNoYXNlLWJhc2tldCIsMywiZW1pdFRvdGFsIiwiYWxsb3dFZGl0IiwidG90YWxQcmljZSJdLFsxLCJmbGV4LTUwIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1lbGV2YXRpb24tejAiLCJmaWxsIl0sWzEsIm1kYy1jYXJkIl0sWzEsIm9yZGVyLXN1bW1hcnkiXSxbMSwibWF0LXRhYmxlIl0sWzEsIm1hdC1yb3ciXSxbMSwibWF0LWNlbGwiLCJsYWJlbCJdLFsxLCJtYXQtY2VsbCIsInByaWNlIl0sWzEsIm1hdC1mb290ZXItY2VsbCIsImxhYmVsIl0sWzEsIm1hdC1mb290ZXItY2VsbCIsInByaWNlIl0sWyJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsIm1hdC1idXR0b24iLCIiLCJjb2xvciIsInByaW1hcnkiLCJhcmlhLWxhYmVsIiwiQ29tcGxldGUgeW91ciBwdXJjaGFzZSIsImlkIiwiY2hlY2tvdXRCdXR0b24iLDEsImJ0biIsImJ0bi1wYXkiLDMsImNsaWNrIl0sWzEsImJvbnVzLXBvaW50cyJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJtYXQtZWxldmF0aW9uLXowIiwiZmxleC02MCJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJtYXQtZWxldmF0aW9uLXowIiwiZmxleC00MCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwibWF0LWNhcmQiLDApKDEsImRpdiIsMSkoMiwiZGl2IiwyKSxNKDMsZmosMjAsMTQsImRpdiIsMyksYyg0LCJhcHAtcHVyY2hhc2UtYmFza2V0Iiw0KSxTKCJlbWl0VG90YWwiLGZ1bmN0aW9uKG8pe3JldHVybiBhLmdldE1lc3NhZ2Uobyl9KSxzKCkoKSxjKDUsImRpdiIsNSkoNiwibWF0LWNhcmQiLDYpKDcsImRpdiIsNykoOCwiZGl2Iiw4KSxtKDkpLGIoMTAsInRyYW5zbGF0ZSIpLHMoKSxjKDExLCJ0YWJsZSIsOSkoMTIsInRyIiwxMCkoMTMsInRkIiwxMSksbSgxNCksYigxNSwidHJhbnNsYXRlIikscygpLGMoMTYsInRkIiwxMiksbSgxNykscygpKCksYygxOCwidHIiLDEwKSgxOSwidGQiLDExKSxtKDIwKSxiKDIxLCJ0cmFuc2xhdGUiKSxzKCksYygyMiwidGQiLDEyKSxtKDIzKSxzKCkoKSxjKDI0LCJ0ciIsMTApKDI1LCJ0ZCIsMTEpLG0oMjYpLGIoMjcsInRyYW5zbGF0ZSIpLHMoKSxjKDI4LCJ0ZCIsMTIpLG0oMjkpLHMoKSgpLGMoMzAsInRyIiwxMCkoMzEsInRkIiwxMyksbSgzMiksYigzMywidHJhbnNsYXRlIikscygpLGMoMzQsInRkIiwxNCksbSgzNSkscygpKCkoKSxjKDM2LCJidXR0b24iLDE1KSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4gYS5wbGFjZU9yZGVyKCl9KSxjKDM3LCJtYXQtaWNvbiIpLG0oMzgpLGIoMzksInRyYW5zbGF0ZSIpLHMoKSxjKDQwLCJzcGFuIiksbSg0MSksYig0MiwidHJhbnNsYXRlIikscygpKCksYyg0MywiZGl2IiwxNiksbSg0NCksYig0NSwidHJhbnNsYXRlIikscygpKCkoKSgpKCkoKSksaSYyJiYobCgzKSx3KGEuYWRkcmVzcyYmYS5wYXltZW50TWV0aG9kPzM6LTEpLGwoKSxmKCJhbGxvd0VkaXQiLCExKSgidG90YWxQcmljZSIsITEpLGwoNSksQShDKDEwLDE1LCJPUkRFUl9TVU1NQVJZIikpLGwoNSksQShDKDE1LDE3LCJJVEVNUyIpKSxsKDMpLEUoIiIsYS5pdGVtVG90YWw9PW51bGw/bnVsbDphLml0ZW1Ub3RhbC50b0ZpeGVkKDIpLCJceEE0IiksbCgzKSxBKEMoMjEsMTksIkRFTElWRVJZIikpLGwoMyksRSgiIixhLmRlbGl2ZXJ5UHJpY2UudG9GaXhlZCgyKSwiXHhBNCIpLGwoMyksQShDKDI3LDIxLCJQUk9NT1RJT04iKSksbCgzKSxFKCIiLGEucHJvbW90aW9uYWxEaXNjb3VudC50b0ZpeGVkKDIpLCJceEE0IiksbCgzKSxBKEMoMzMsMjMsIkxBQkVMX1RPVEFMX1BSSUNFIikpLGwoMyksRSgiIixhLml0ZW1Ub3RhbCthLmRlbGl2ZXJ5UHJpY2UtYS5wcm9tb3Rpb25hbERpc2NvdW50PT1udWxsP251bGw6KGEuaXRlbVRvdGFsK2EuZGVsaXZlcnlQcmljZS1hLnByb21vdGlvbmFsRGlzY291bnQpLnRvRml4ZWQoMiksIlx4QTQiKSxsKDMpLEEoQygzOSwyNSwibW9uZXRpemF0aW9uX29uIikpLGwoMyksQShDKDQyLDI3LCJQTEFDRV9PUkRFUl9BTkRfUEFZIikpLGwoMyksQShkdCg0NSwyOSwiQ0hFQ0tPVVRfRk9SX0JPTlVTX1BPSU5UUyIsYnQoMzIsbWosYS5ib251cykpKSl9LGRlcGVuZGVuY2llczpbZGUscGUsWSxLYyxvZSxsZSxnZSxDZSxLXSxzdHlsZXM6W2AuYnRuLXBheVtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjEuMjVyZW07cGFkZGluZzouNjI1cmVtO3dpZHRoOjEwMCV9bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2hlaWdodDphdXRvO21hcmdpbi1ib3R0b206LS42MjVyZW0haW1wb3J0YW50O21hcmdpbi10b3A6MS4yNXJlbX1tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1sZWZ0Oi42MjVyZW07cGFkZGluZy1yaWdodDouNjI1cmVtfS5wcmljZVtfbmdjb250ZW50LSVDT01QJV06bGFzdC1vZi10eXBle3BhZGRpbmctcmlnaHQ6LjYyNXJlbTt0ZXh0LWFsaWduOnJpZ2h0fS5sYWJlbFtfbmdjb250ZW50LSVDT01QJV06Zmlyc3Qtb2YtdHlwZXtwYWRkaW5nLWxlZnQ6LjYyNXJlbX10YWJsZVtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0ubWF0LW1kYy1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NzAwfS5vcmRlci1zdW1tYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6eC1sYXJnZTtmb250LXdlaWdodDo1MDA7bWFyZ2luLWJvdHRvbToxcmVtO3BhZGRpbmctYm90dG9tOi42MjVyZW07cGFkZGluZy1sZWZ0Oi42MjVyZW19LmJvbnVzLXBvaW50c1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtdGV4dCk7bWFyZ2luLXRvcDouNjI1cmVtO3RleHQtYWxpZ246Y2VudGVyfS5tZGMtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Ym9yZGVyLWJvdHRvbTowO21hcmdpbi10b3A6LS4yNXJlbTtwYWRkaW5nOi4yNXJlbTt3aWR0aDoxMDAlfS5tYXQtb3duLWNhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dmFyKC0tdGhlbWUtYmFja2dyb3VuZCk7bWFyZ2luOmF1dG87bWF4LXdpZHRoOjEyMDBweDtwYWRkaW5nOjEuMjVyZW07d2lkdGg6NjAlIWltcG9ydGFudH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS10aGVtZS1iYWNrZ3JvdW5kLWxpZ2h0KTtib3JkZXItcmFkaXVzOjVweCFpbXBvcnRhbnQ7cGFkZGluZzouNjI1cmVtIDB9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7d2lkdGg6MTAwJX0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjp2YXIoLS10aGVtZS10ZXh0KTtwYWRkaW5nOi42MjVyZW0gMH0ubWF0LWZvb3Rlci1jZWxsLmxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo3MDA7dGV4dC1hbGlnbjpzdGFydDt0ZXh0LWluZGVudDouNjI1cmVtfS5tYXQtZm9vdGVyLWNlbGwucHJpY2VbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjcwMDtwYWRkaW5nLXJpZ2h0Oi42MjVyZW0haW1wb3J0YW50O3RleHQtYWxpZ246ZW5kfS5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOnN0cmV0Y2g7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztnYXA6MS4yNXJlbX0uY29sdW1uW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoxLjI1cmVtfS5mbGV4LTUwW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMCA1MCU7bWF4LXdpZHRoOjUwJTttaW4td2lkdGg6MH0uZmxleC02MFtfbmdjb250ZW50LSVDT01QJV17ZmxleDowIDAgNjAlO21heC13aWR0aDo2MCU7bWluLXdpZHRoOjB9LmZsZXgtNDBbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MCAwIDQwJTttYXgtd2lkdGg6NDAlO21pbi13aWR0aDowfS5maWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6YXV0bzt3aWR0aDoxMDAlfUBtZWRpYSAobWF4LXdpZHRoOiA5NTkuOThweCl7LmNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5mbGV4LTUwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmZsZXgtNjBbX25nY29udGVudC0lQ09NUCVdLCAuZmxleC00MFtfbmdjb250ZW50LSVDT01QJV17ZmxleDowIDAgMTAwJTttYXgtd2lkdGg6MTAwJX19CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIHVqKHQsbil7dCYxJiYoYygwLCJtYXQtZXJyb3IiKSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjImJihsKCksRSgiICIsQygyLDEsIk1BTkRBVE9SWV9BTU9VTlQiKSwiICIpKX1mdW5jdGlvbiBnaih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYobCgpLEUoIiAiLEMoMiwxLCJBTU9VTlRfTElNSVQiKSwiICIpKX12YXIgQ0MseUM9eCgoKT0+e2soKTtBcygpO1dlKCk7cDEoKTtuZSgpO2V0KCk7SmUoKTtXKCk7aGUoKTt2ZSgpO2soKTtoZSgpO1coKTtKZSgpO1dlKCk7ZXQoKTtuZSgpO3ZlKCk7Q0M9KCgpPT57Y2xhc3MgdHtyb3V0ZXI9aCh5dCk7d2FsbGV0U2VydmljZT1oKGtvKTtuZ1pvbmU9aChyZSk7YmFsYW5jZTtiYWxhbmNlQ29udHJvbD1uZXcga2UoIiIsW0oucmVxdWlyZWQsSi5taW4oMTApLEoubWF4KDFlMyldKTtuZ09uSW5pdCgpe3RoaXMud2FsbGV0U2VydmljZS5nZXQoKS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMuYmFsYW5jZT1wYXJzZUZsb2F0KGUpLnRvRml4ZWQoMil9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KX1jb250aW51ZSgpe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oIndhbGxldFRvdGFsIix0aGlzLmJhbGFuY2VDb250cm9sLnZhbHVlKSx0aGlzLm5nWm9uZS5ydW4oKCk9PlBlKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyIvcGF5bWVudCIsIndhbGxldCJdKX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtd2FsbGV0Il1dLGRlY2xzOjMxLHZhcnM6MjMsY29uc3RzOltbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwibWF0LWVsZXZhdGlvbi16NiJdLFsxLCJtZGMtY2FyZCJdLFsxLCJoZWFkZXJfY29udGFpbmVyIl0sWyJocmVmIiwiLyMvd2FsbGV0LXdlYjMiXSxbInRyYW5zbGF0ZSIsIiJdLFsxLCJjb25maXJtYXRpb24iXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lIiwiY29sb3IiLCJhY2NlbnQiXSxbInR5cGUiLCJudW1iZXIiLCJtYXRJbnB1dCIsIiIsImFyaWEtbGFiZWwiLCJFbnRlciBhbiBhbW91bnQiLDMsImZvcm1Db250cm9sIl0sWyJ0eXBlIiwic3VibWl0IiwiaWQiLCJzdWJtaXRCdXR0b24iLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsImNvbG9yIiwicHJpbWFyeSIsImFyaWEtbGFiZWwiLCJCdXR0b24gdG8gY29udGludWUgdG8gcGF5bWVudCIsMywiY2xpY2siLCJkaXNhYmxlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwibWF0LWNhcmQiLDApKDEsImRpdiIsMSkoMiwiZGl2IiwyKSgzLCJoMSIpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCksYyg2LCJhIiwzKSxtKDcpLGIoOCwidHJhbnNsYXRlIikscygpKCksYyg5LCJoMyIpLG0oMTApLGIoMTEsInRyYW5zbGF0ZSIpLHMoKSxjKDEyLCJwIikoMTMsImIiKSgxNCwic3BhbiIsNCksbSgxNSksYigxNiwidHJhbnNsYXRlIikscygpLGMoMTcsInNwYW4iLDUpLG0oMTgpLHMoKSgpKCksYygxOSwibWF0LWZvcm0tZmllbGQiLDYpKDIwLCJtYXQtbGFiZWwiKSxtKDIxKSxiKDIyLCJ0cmFuc2xhdGUiKSxzKCksdSgyMywiaW5wdXQiLDcpLE0oMjQsdWosMywzLCJtYXQtZXJyb3IiKSxNKDI1LGdqLDMsMywibWF0LWVycm9yIikscygpLGMoMjYsImJ1dHRvbiIsOCksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIGEuY29udGludWUoKX0pLGMoMjcsIm1hdC1pY29uIiksbSgyOCwiIG1vbmV0aXphdGlvbl9vbiAiKSxzKCksbSgyOSksYigzMCwidHJhbnNsYXRlIikscygpKCkoKSksaSYyJiYobCg0KSxBKEMoNSwxMSwiRElHSVRBTF9XQUxMRVQiKSksbCgzKSxBKEMoOCwxMywiTElOS19UUllfT1VUX05FV19DUllQVE9fV0FMTEVUIikpLGwoMyksQShDKDExLDE1LCJMQUJFTF9BRERfTU9ORVkiKSksbCg1KSxBKEMoMTYsMTcsIkxBQkVMX1dBTExFVF9CQUxBTkNFIikpLGwoMyksRSgiICIsYS5iYWxhbmNlKSxsKDMpLEEoQygyMiwxOSwiTEFCRUxfQU1PVU5UIikpLGwoMiksZigiZm9ybUNvbnRyb2wiLGEuYmFsYW5jZUNvbnRyb2wpLGwoKSx3KGEuYmFsYW5jZUNvbnRyb2wuaW52YWxpZCYmYS5iYWxhbmNlQ29udHJvbC5lcnJvcnMucmVxdWlyZWQ/MjQ6LTEpLGwoKSx3KGEuYmFsYW5jZUNvbnRyb2wuaW52YWxpZCYmKGEuYmFsYW5jZUNvbnRyb2wuZXJyb3JzLm1pbnx8YS5iYWxhbmNlQ29udHJvbC5lcnJvcnMubWF4KT8yNTotMSksbCgpLGYoImRpc2FibGVkIixhLmJhbGFuY2VDb250cm9sLmludmFsaWQpLGwoMyksRSgiICIsQygzMCwyMSwiQlROX0RFUE9TSVQiKSwiICIpKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxZLFNlLFFlLFplLGh0LFF0LGF0LGd0LFFhLG10LCRlLG50LHp0LGUxLG9lLGxlLGdlLENlLEtdLHN0eWxlczpbYG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDozMCU7bWFyZ2luLXJpZ2h0OjMwJX1tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy10b3A6LjYyNXJlbTt3aWR0aDoxMDAlfS5mb3JtLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWluLXdpZHRoOjM1MHB4fSNzdWJtaXRCdXR0b25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tdG9wOjJyZW07d2lkdGg6NjAlfS5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDAzO2ZvbnQtc2l6ZTp4LWxhcmdlO2p1c3RpZnktY29udGVudDpjZW50ZXI7cGFkZGluZzouNjI1cmVtIDEuMjVyZW19LmhlYWRlcl9jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0ubWRjLWNhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowfUBtZWRpYSAobWF4LXdpZHRoOiAxMTAwcHgpe21hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDoyMCU7bWFyZ2luLXJpZ2h0OjIwJX19QG1lZGlhIChtYXgtd2lkdGg6IDU4MHB4KXttYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MTAlO21hcmdpbi1yaWdodDoxMCV9LmhlYWRlcl9jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXJnaW4tYm90dG9tOjFyZW19fQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiB2aih0LG4pe3QmMSYmKGMoMCwiZGl2IiwxMCksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYobCgpLEEoQygyLDEsIkxBQkVMX0lOX1RSQU5TSVQiKSkpfWZ1bmN0aW9uIF9qKHQsbil7dCYxJiYoYygwLCJkaXYiLDExKSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjImJihsKCksQShDKDIsMSwiTEFCRUxfREVMSVZFUkVEIikpKX1mdW5jdGlvbiBiaih0LG4pe3QmMSYmKGMoMCwibWF0LWhlYWRlci1jZWxsIiksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYobCgpLEEoQygyLDEsIkxBQkVMX1BST0RVQ1QiKSkpfWZ1bmN0aW9uIENqKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIpLG0oMSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxBKGUubmFtZSl9fWZ1bmN0aW9uIHlqKHQsbil7dCYxJiYoYygwLCJtYXQtaGVhZGVyLWNlbGwiKSxtKDEpLGIoMiwidHJhbnNsYXRlIikscygpKSx0JjImJihsKCksQShDKDIsMSwiTEFCRUxfUFJJQ0UiKSkpfWZ1bmN0aW9uIHhqKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIpLG0oMSkscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxFKCIiLGUucHJpY2UsIlx4QTQiKX19ZnVuY3Rpb24gTWoodCxuKXt0JjEmJihjKDAsIm1hdC1oZWFkZXItY2VsbCIpLG0oMSksYigyLCJ0cmFuc2xhdGUiKSxzKCkpLHQmMiYmKGwoKSxBKEMoMiwxLCJMQUJFTF9RVUFOVElUWSIpKSl9ZnVuY3Rpb24gd2oodCxuKXtpZih0JjEmJihjKDAsIm1hdC1jZWxsIikoMSwic3BhbiIpLG0oMikscygpKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgyKSxBKGUucXVhbnRpdHkpfX1mdW5jdGlvbiBTaih0LG4pe3QmMSYmKGMoMCwibWF0LWhlYWRlci1jZWxsIiksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYobCgpLEEoQygyLDEsIkxBQkVMX1RPVEFMX1BSSUNFIikpKX1mdW5jdGlvbiBraih0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWNlbGwiLDI3KSxtKDEpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKCksRSgiIixlLnRvdGFsLnRvRml4ZWQoMiksIlx4QTQiKX19ZnVuY3Rpb24gemoodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIil9ZnVuY3Rpb24gVGoodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsIm1hdC1jZWxsIikoMSwiYnV0dG9uIiwxNCksYigyLCJ0cmFuc2xhdGUiKSxTKCJjbGljayIsZnVuY3Rpb24oKXtsZXQgYT16KGUpLiRpbXBsaWNpdCxyPXYoMyk7cmV0dXJuIFQoci5zaG93RGV0YWlsKGEuaWQpKX0pLGMoMywibWF0LWljb24iKSxtKDQsInJhdGVfcmV2aWV3IikscygpKCkoKX10JjImJihsKCksZigibWF0VG9vbHRpcCIsVmUoQygyLDIsIldSSVRFX1JFVklFVyIpKSkpfWZ1bmN0aW9uIEVqKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItcm93Iil9ZnVuY3Rpb24gQWoodCxuKXt0JjEmJnUoMCwibWF0LXJvdyIpfWZ1bmN0aW9uIERqKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJkaXYiKSgxLCJkaXYiLDQpKDIsImRpdiIsNSkoMywiZGl2Iiw2KSg0LCJkaXYiLDcpKDUsImRpdiIpLG0oNiksYig3LCJ0cmFuc2xhdGUiKSxzKCksYyg4LCJkaXYiKSxtKDkpLHMoKSgpLGMoMTAsImRpdiIsOCkoMTEsImRpdiIpLG0oMTIpLGIoMTMsInRyYW5zbGF0ZSIpLHMoKSxjKDE0LCJkaXYiKSxtKDE1KSxzKCkoKSxjKDE2LCJkaXYiLDgpKDE3LCJkaXYiKSxtKDE4KSxiKDE5LCJ0cmFuc2xhdGUiKSxzKCksYygyMCwiZGl2IiksbSgyMSkscygpKCksYygyMiwiZGl2Iiw5KSxNKDIzLHZqLDMsMywiZGl2IiwxMCksTSgyNCxfaiwzLDMsImRpdiIsMTEpLHMoKSxjKDI1LCJkaXYiLDEyKSgyNiwiYnV0dG9uIiwxMyksYigyNywidHJhbnNsYXRlIiksUygiY2xpY2siLGZ1bmN0aW9uKCl7bGV0IGE9eihlKS4kaW1wbGljaXQscj12KDIpO3JldHVybiBUKHIudHJhY2tPcmRlcihhLm9yZGVySWQpKX0pLGMoMjgsIm1hdC1pY29uIiksbSgyOSwibG9jYWxfc2hpcHBpbmciKSxzKCkoKSgpLGMoMzAsImRpdiIsMTIpKDMxLCJidXR0b24iLDE0KSxiKDMyLCJ0cmFuc2xhdGUiKSxTKCJjbGljayIsZnVuY3Rpb24oKXtsZXQgYT16KGUpLiRpbXBsaWNpdCxyPXYoMik7cmV0dXJuIFQoci5vcGVuQ29uZmlybWF0aW9uUERGKGEub3JkZXJJZCkpfSksYygzMywibWF0LWljb24iKSxtKDM0LCJub3RlIikscygpKCkoKSgpLHUoMzUsImRpdiIsMTUpLHMoKSxjKDM2LCJtYXQtdGFibGUiLDE2KSxfZSgzNywxNyksUigzOCxiaiwzLDMsIm1hdC1oZWFkZXItY2VsbCIsMTgpKDM5LENqLDIsMSwibWF0LWNlbGwiLDE5KSxiZSgpLF9lKDQwLDIwKSxSKDQxLHlqLDMsMywibWF0LWhlYWRlci1jZWxsIiwxOCkoNDIseGosMiwxLCJtYXQtY2VsbCIsMTkpLGJlKCksX2UoNDMsMjEpLFIoNDQsTWosMywzLCJtYXQtaGVhZGVyLWNlbGwiLDE4KSg0NSx3aiwzLDEsIm1hdC1jZWxsIiwxOSksYmUoKSxfZSg0NiwyMiksUig0NyxTaiwzLDMsIm1hdC1oZWFkZXItY2VsbCIsMTgpKDQ4LGtqLDIsMSwibWF0LWNlbGwiLDIzKSxiZSgpLF9lKDQ5LDI0KSxSKDUwLHpqLDEsMCwibWF0LWhlYWRlci1jZWxsIiwxOCkoNTEsVGosNSw0LCJtYXQtY2VsbCIsMTkpLGJlKCksUig1MixFaiwxLDAsIm1hdC1oZWFkZXItcm93IiwyNSkoNTMsQWosMSwwLCJtYXQtcm93IiwyNikscygpKCkoKX1pZih0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9digyKTtsKDYpLEEoQyg3LDE1LCJMQUJFTF9PUkRFUl9JRCIpKSxsKDMpLEUoIiMiLGUub3JkZXJJZCksbCgzKSxBKEMoMTMsMTcsIkxBQkVMX1RPVEFMX1BSSUNFIikpLGwoMyksRSgiIixlLnRvdGFsUHJpY2UudG9GaXhlZCgyKSwiXHhBNCIpLGwoMyksQShDKDE5LDE5LCJMQUJFTF9CT05VUyIpKSxsKDMpLEEoZS5ib251cyksbCgyKSx3KGUuZGVsaXZlcmVkPy0xOjIzKSxsKCksdyhlLmRlbGl2ZXJlZD8yNDotMSksbCgyKSxmKCJtYXRUb29sdGlwIixWZShDKDI3LDIxLCJMQUJFTF9UUkFDS19PUkRFUiIpKSksbCg1KSxmKCJtYXRUb29sdGlwIixWZShDKDMyLDIzLCJQUklOVF9PUkRFUl9DT05GSVJNQVRJT04iKSkpLGwoNSksZigiZGF0YVNvdXJjZSIsZS5wcm9kdWN0cyksbCgxNiksZigibWF0SGVhZGVyUm93RGVmIixpLnRhYmxlQ29sdW1ucyksbCgpLGYoIm1hdFJvd0RlZkNvbHVtbnMiLGkudGFibGVDb2x1bW5zKX19ZnVuY3Rpb24gSWoodCxuKXtpZih0JjEmJihjKDAsImRpdiIsMikscWUoMSxEaiw1NCwyNSwiZGl2IixudWxsLEZ0KSxzKCkpLHQmMil7bGV0IGU9digpO2woKSxHZShlLm9yZGVycyl9fWZ1bmN0aW9uIExqKHQsbil7dCYxJiYoYygwLCJtYXQtY2FyZCIsMykoMSwiZGl2IiwyOCksdSgyLCJpbWciLDI5KSxjKDMsIm1hdC1jYXJkLXRpdGxlIikoNCwic3BhbiIsMzApLG0oNSksYig2LCJ0cmFuc2xhdGUiKSxzKCkoKSxjKDcsIm1hdC1jYXJkLWNvbnRlbnQiKSg4LCJzcGFuIiwzMSksbSg5KSxiKDEwLCJ0cmFuc2xhdGUiKSxzKCkoKSgpKCkpLHQmMiYmKGwoNSksRSgiICIsQyg2LDIsIk5PX1NFQVJDSF9SRVNVTFQiKSwiICIpLGwoNCksRSgiICIsQygxMCw0LCJOT19PUkRFUlNfUExBQ0VEIiksIiAiKSl9dmFyIHhDLE1DPXgoKCk9PntrKCk7THMoKTtNMigpO2FhKCk7YzcoKTtnaSgpO2o0KCk7cDEoKTt2ZSgpO3ZpKCk7bmUoKTtXKCk7aGUoKTtrKCk7aGUoKTtXKCk7dmUoKTt4Qz0oKCk9PntjbGFzcyB0e3JvdXRlcj1oKHl0KTtkaWFsb2c9aChOMSk7b3JkZXJIaXN0b3J5U2VydmljZT1oKFRvKTtiYXNrZXRTZXJ2aWNlPWgoZWkpO3Byb2R1Y3RTZXJ2aWNlPWgobG4pO25nWm9uZT1oKHJlKTt0YWJsZUNvbHVtbnM9WyJwcm9kdWN0IiwicHJpY2UiLCJxdWFudGl0eSIsInRvdGFsIHByaWNlIiwicmV2aWV3Il07b3JkZXJzPVtdO2VtcHR5U3RhdGU9ITA7bmdPbkluaXQoKXt0aGlzLm9yZGVySGlzdG9yeVNlcnZpY2UuZ2V0KCkuc3Vic2NyaWJlKHtuZXh0OmU9PntlPWUucmV2ZXJzZSgpLGUubGVuZ3RoPT09MD90aGlzLmVtcHR5U3RhdGU9ITA6dGhpcy5lbXB0eVN0YXRlPSExO2ZvcihsZXQgaSBvZiBlKXtsZXQgYT1bXTtmb3IobGV0IHIgb2YgaS5wcm9kdWN0cylhLnB1c2goe2lkOnIuaWQsbmFtZTpyLm5hbWUscHJpY2U6ci5wcmljZSxxdWFudGl0eTpyLnF1YW50aXR5LHRvdGFsOnIudG90YWx9KTt0aGlzLm9yZGVycy5wdXNoKHtvcmRlcklkOmkub3JkZXJJZCx0b3RhbFByaWNlOmkudG90YWxQcmljZSxib251czppLmJvbnVzLHByb2R1Y3RzOm5ldyBJMShhKSxkZWxpdmVyZWQ6aS5kZWxpdmVyZWR9KX19LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KX1zaG93RGV0YWlsKGUpe3RoaXMucHJvZHVjdFNlcnZpY2UuZ2V0KGUpLnN1YnNjcmliZSh7bmV4dDppPT57bGV0IGE9e2lkOmkuaWQsbmFtZTppLm5hbWUsZGVzY3JpcHRpb246aS5kZXNjcmlwdGlvbixpbWFnZTppLmltYWdlLHByaWNlOmkucHJpY2UscG9pbnRzOk1hdGgucm91bmQoaS5wcmljZS8xMCl9O3RoaXMuZGlhbG9nLm9wZW4ob3Mse3dpZHRoOiI1MDBweCIsaGVpZ2h0OiJtYXgtY29udGVudCIsZGF0YTp7cHJvZHVjdERhdGE6YX19KX0sZXJyb3I6aT0+e2NvbnNvbGUubG9nKGkpfX0pfW9wZW5Db25maXJtYXRpb25QREYoZSl7bGV0IGk9YCR7dGhpcy5iYXNrZXRTZXJ2aWNlLmhvc3RTZXJ2ZXJ9L2Z0cC9vcmRlcl8ke2V9LnBkZmA7d2luZG93Lm9wZW4oaSwiX2JsYW5rIil9dHJhY2tPcmRlcihlKXt0aGlzLm5nWm9uZS5ydW4oKCk9PlBlKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyIvdHJhY2stcmVzdWx0Il0se3F1ZXJ5UGFyYW1zOntpZDplfX0pfSkpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1vcmRlci1oaXN0b3J5Il1dLGRlY2xzOjcsdmFyczo0LGNvbnN0czpbWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsImNhcmQxIiwibWF0LWVsZXZhdGlvbi16NiJdLFsxLCJtZGMtY2FyZCIsIm1hdC1jYXJkLWN2ciJdLFsxLCJvcmRlcnMtY29udGFpbmVyIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1lbGV2YXRpb24tejYiLCJlbXB0eVN0YXRlIl0sWzEsInRhYmxlLWNvbnRhaW5lciIsIm1hdC1lbGV2YXRpb24tejQiLCJjdXN0b20tc2xhdGUiXSxbMSwiaGVhZGluZyJdLFsxLCJoZWFkaW5nLXJvdyJdLFsxLCJjb2wiLCJjb2wtNDAiLCJjb2wtdmVydGljYWwiXSxbMSwiY29sIiwiY29sLTE1IiwiY29sLXZlcnRpY2FsIl0sWzEsImNvbCIsImNvbC0yMCJdLFsxLCJlcnJvciJdLFsxLCJjb25maXJtYXRpb24iXSxbMSwiY29sIiwiY29sLTUiLCJhbGlnbi1lbmQiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLCJUcmFjayBZb3VyIE9yZGVyIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiYmVsb3ciLDMsImNsaWNrIiwibWF0VG9vbHRpcCJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsIlByaW50IG9yZGVyIGNvbmZpcm1hdGlvbiIsIm1hdFRvb2x0aXBQb3NpdGlvbiIsImJlbG93IiwzLCJjbGljayIsIm1hdFRvb2x0aXAiXSxbMSwiYm9yZGVyIl0sWzMsImRhdGFTb3VyY2UiXSxbIm1hdENvbHVtbkRlZiIsInByb2R1Y3QiXSxbNCwibWF0SGVhZGVyQ2VsbERlZiJdLFs0LCJtYXRDZWxsRGVmIl0sWyJtYXRDb2x1bW5EZWYiLCJwcmljZSJdLFsibWF0Q29sdW1uRGVmIiwicXVhbnRpdHkiXSxbIm1hdENvbHVtbkRlZiIsInRvdGFsIHByaWNlIl0sWyJjbGFzcyIsInByaWNlLWFsaWduIiw0LCJtYXRDZWxsRGVmIl0sWyJtYXRDb2x1bW5EZWYiLCJyZXZpZXciXSxbNCwibWF0SGVhZGVyUm93RGVmIl0sWzQsIm1hdFJvd0RlZiIsIm1hdFJvd0RlZkNvbHVtbnMiXSxbMSwicHJpY2UtYWxpZ24iXSxbMSwibWRjLWNhcmQiXSxbImFsdCIsIk5vIHJlc3VsdHMgZm91bmQiLCJzcmMiLCJhc3NldHMvcHVibGljL2ltYWdlcy9wcm9kdWN0cy9uby1yZXN1bHRzLnBuZyIsMSwiaW1nLXJlc3BvbnNpdmUiLCJub1Jlc3VsdCJdLFsxLCJub1Jlc3VsdFRleHQiXSxbInRyYW5zbGF0ZSIsIiIsMSwibm9SZXN1bHRUZXh0Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYXQtY2FyZCIsMCkoMSwiZGl2IiwxKSgyLCJtYXQtY2FyZC10aXRsZSIpLG0oMyksYig0LCJ0cmFuc2xhdGUiKSxzKCksTSg1LElqLDMsMCwiZGl2IiwyKSg2LExqLDExLDYsIm1hdC1jYXJkIiwzKSxzKCkoKSksaSYyJiYobCgzKSxFKCIgIixDKDQsMiwiTEFCRUxfT1JERVJfSElTVE9SWSIpLCIgIiksbCgyKSx3KGEuZW1wdHlTdGF0ZT82OjUpKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxwMixYMixZLFNlLGwxLFJ0LGdlLENlLHRpLG5pLGFpLHJpLGlpLG9pLGNpLGxpLHNpLGRpLEtdLHN0eWxlczpbYC5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi42MjVyZW0gMS4yNXJlbX0uaGVhZGluZy10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3BhZGRpbmc6LjYyNXJlbSAxLjI1cmVtfW1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6YXV0bzt3aWR0aDo4MCV9LmNhcmQxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjVweDttYXJnaW46MCBhdXRvO3dpZHRoOjgwJX0ubWFpbi13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDoxMCU7bWFyZ2luLXJpZ2h0OjEwJX1tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1sZWZ0Oi42MjVyZW07cGFkZGluZy1yaWdodDouNjI1cmVtfS5wcmljZS1hbGlnbltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpyaWdodH1tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7bWFyZ2luLWJvdHRvbToxLjVyZW19LmJvcmRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOi41cHggc29saWQgI2YyZjJmMn0uZW1wdHlTdGF0ZVtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9jaztoZWlnaHQ6YXV0byFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbToxLjI1cmVtO21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLXRvcDoxLjI1cmVtO3dpZHRoOjUwJX0uY3VzdG9tLXNsYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjVweH0ubm9SZXN1bHRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzt3aWR0aDo2MCV9Lm5vUmVzdWx0VGV4dFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOi42MjVyZW07dGV4dC1hbGlnbjpjZW50ZXJ9Lm1hdC1tZGMtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdOmZpcnN0LWNoaWxke3BhZGRpbmctbGVmdDoxLjVyZW0haW1wb3J0YW50fS5tYXQtbWRjLWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmZpcnN0LWNoaWxkKXtwYWRkaW5nLWxlZnQ6LjEyNXJlbSFpbXBvcnRhbnR9Lm1hdC1tZGMtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtjb2xvcjp2YXIoLS10aGVtZS10ZXh0LWRhcmtlcikhaW1wb3J0YW50O2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTJweDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0ubWRjLWNhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowfS5vcmRlcnMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoxLjI1cmVtfS5oZWFkaW5nLXJvd1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleH0uY29sW19uZ2NvbnRlbnQtJUNPTVAlXXttaW4td2lkdGg6MH0uY29sLTQwW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMCA0MCU7bWF4LXdpZHRoOjQwJX0uY29sLTIwW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMCAyMCU7bWF4LXdpZHRoOjIwJX0uY29sLTE1W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMCAxNSU7bWF4LXdpZHRoOjE1JX0uY29sLTVbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MCAwIDUlO21heC13aWR0aDo1JX0uY29sLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5hbGlnbi1lbmRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9bWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0YWJsZS1sYXlvdXQ6Zml4ZWQ7d2lkdGg6MTAwJX0ubWF0LWNvbHVtbi1wcm9kdWN0W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDo0MCV9Lm1hdC1jb2x1bW4tcHJpY2VbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNvbHVtbi1xdWFudGl0eVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY29sdW1uLXRvdGFsLXByaWNlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jb2x1bW4tdG90YWxcXCBwcmljZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY29sdW1uLXRvdGFscHJpY2VbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNvbHVtbi10b3RhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY29sdW1uLXJldmlld1tfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTUlfUBtZWRpYSAobWF4LXdpZHRoOiA5NTkuOThweCl7LmVtcHR5U3RhdGVbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7d2lkdGg6MTAwJX19CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIFBqKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDIpKDEsImgxIiw1KSxtKDIsIkxBQkVMX0RFTElWRVJZX0FERFJFU1MiKSxzKCksYygzLCJkaXYiKSxtKDQpLHMoKSxjKDUsImRpdiIpLG0oNikscygpLGMoNywiZGl2IiksbSg4KSxzKCksYyg5LCJkaXYiKSgxMCwic3BhbiIsNSksbSgxMSwiUEhPTkVfTlVNQkVSIikscygpLG0oMTIpLHMoKSgpKSx0JjIpe2xldCBlPXYoKTtsKDQpLEEoZS5hZGRyZXNzPT1udWxsP251bGw6ZS5hZGRyZXNzLmZ1bGxOYW1lKSxsKDIpLEZhKCIiLGUuYWRkcmVzcz09bnVsbD9udWxsOmUuYWRkcmVzcy5zdHJlZXRBZGRyZXNzLCIsICIsZS5hZGRyZXNzPT1udWxsP251bGw6ZS5hZGRyZXNzLmNpdHksIiwgIixlLmFkZHJlc3M9PW51bGw/bnVsbDplLmFkZHJlc3Muc3RhdGUsIiwgIixlLmFkZHJlc3M9PW51bGw/bnVsbDplLmFkZHJlc3MuemlwQ29kZSksbCgyKSxBKGUuYWRkcmVzcz09bnVsbD9udWxsOmUuYWRkcmVzcy5jb3VudHJ5KSxsKDQpLEUoIiAiLGUuYWRkcmVzcz09bnVsbD9udWxsOmUuYWRkcmVzcy5tb2JpbGVOdW0pfX1mdW5jdGlvbiBWaih0LG4pe3QmMSYmdSgwLCJtYXQtZGl2aWRlciIsMyl9ZnVuY3Rpb24gT2oodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIil9ZnVuY3Rpb24gSGoodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsIm1hdC1jZWxsIikoMSwibWF0LXJhZGlvLWJ1dHRvbiIsMjApLFMoImNsaWNrIixmdW5jdGlvbigpe2xldCBhPXooZSkuJGltcGxpY2l0LHI9digpO3JldHVybiBUKHIuc2VsZWN0TWV0aG9kKGEuaWQpKX0pKCJjaGFuZ2UiLGZ1bmN0aW9uKGEpe2xldCByPXooZSkuJGltcGxpY2l0LG89digpO3JldHVybiBUKGE/by5zZWxlY3Rpb24udG9nZ2xlKHIpOm51bGwpfSkscygpKCl9aWYodCYyKXtsZXQgZT1uLiRpbXBsaWNpdCxpPXYoKTtsKCksZigiY2hlY2tlZCIsaS5zZWxlY3Rpb24uaXNTZWxlY3RlZChlKSl9fWZ1bmN0aW9uIE5qKHQsbil7dCYxJiZ1KDAsIm1hdC1oZWFkZXItY2VsbCIpfWZ1bmN0aW9uIFJqKHQsbil7aWYodCYxJiYoYygwLCJtYXQtY2VsbCIpLHUoMSwiaSIsMjEpLG0oMikscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2woKSxmKCJuZ0NsYXNzIixlLmljb24pLGwoKSxFKCJceEEwIixlLm5hbWUpfX1mdW5jdGlvbiBGaih0LG4pe3QmMSYmdSgwLCJtYXQtaGVhZGVyLWNlbGwiLDIyKX1mdW5jdGlvbiBCaih0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWNlbGwiKSxtKDEpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKCksRSgiIixlLnByaWNlLnRvRml4ZWQoMiksIlx4QTQiKX19ZnVuY3Rpb24gVWoodCxuKXt0JjEmJnUoMCwibWF0LWhlYWRlci1jZWxsIiwyMyl9ZnVuY3Rpb24gamoodCxuKXtpZih0JjEmJihjKDAsIm1hdC1jZWxsIiksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdDtsKCksTzEoIiIsZS5ldGEsIiAiLEMoMiwyLCJMQUJFTF9EQVlTIikpfX1mdW5jdGlvbiBxaih0LG4pe3QmMSYmdSgwLCJtYXQtaGVhZGVyLXJvdyIpfWZ1bmN0aW9uIEdqKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJtYXQtcm93IiwyNCksUygiY2xpY2siLGZ1bmN0aW9uKCl7bGV0IGE9eihlKSxyPWEuJGltcGxpY2l0LG89YS4kaW1wbGljaXQsZD12KCk7cmV0dXJuIGQuc2VsZWN0aW9uLnRvZ2dsZShyKSxUKGQuc2VsZWN0TWV0aG9kKG8uaWQpKX0pLHMoKX19dmFyIHdDLFNDPXgoKCk9PntrKCk7SjQoKTtpcigpO00yKCk7cDEoKTthMSgpO1l0KCk7cjEoKTtxbigpO3ZlKCk7bmUoKTtHbigpO3FpKCk7VygpO2hlKCk7aygpO2hlKCk7VygpO25lKCk7dmUoKTtMZS5hZGQobmYsb2YsdjMpO3dDPSgoKT0+e2NsYXNzIHR7bG9jYXRpb249aChncik7ZGVsaXZlcnlTZXJpdmNlPWgoZm4pO2FkZHJlc3NTZXJ2aWNlPWgoazIpO3JvdXRlcj1oKHl0KTtuZ1pvbmU9aChyZSk7ZGlzcGxheWVkQ29sdW1ucz1bIlNlbGVjdGlvbiIsIk5hbWUiLCJQcmljZSIsIkVUQSJdO21ldGhvZHM7YWRkcmVzcztkYXRhU291cmNlO2RlbGl2ZXJ5TWV0aG9kSWQ9dm9pZCAwO3NlbGVjdGlvbj1uZXcga2EoITEsW10pO25nT25Jbml0KCl7dGhpcy5hZGRyZXNzU2VydmljZS5nZXRCeUlkKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImFkZHJlc3NJZCIpKS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMuYWRkcmVzcz1lfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSksdGhpcy5kZWxpdmVyeVNlcml2Y2UuZ2V0KCkuc3Vic2NyaWJlKHtuZXh0OmU9Pntjb25zb2xlLmxvZyhlKSx0aGlzLm1ldGhvZHM9ZSx0aGlzLmRhdGFTb3VyY2U9bmV3IEkxKHRoaXMubWV0aG9kcyl9LGVycm9yOmU9Pntjb25zb2xlLmxvZyhlKX19KX1zZWxlY3RNZXRob2QoZSl7dGhpcy5zZWxlY3Rpb24uaGFzVmFsdWUoKXx8ZT90aGlzLmRlbGl2ZXJ5TWV0aG9kSWQ9ZTp0aGlzLmRlbGl2ZXJ5TWV0aG9kSWQ9dm9pZCAwfXJvdXRlVG9QcmV2aW91c1VybCgpe3RoaXMubG9jYXRpb24uYmFjaygpfWNob29zZURlbGl2ZXJ5TWV0aG9kKCl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgiZGVsaXZlcnlNZXRob2RJZCIsdGhpcy5kZWxpdmVyeU1ldGhvZElkLnRvU3RyaW5nKCkpLHRoaXMubmdab25lLnJ1bigoKT0+UGUodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbIi9wYXltZW50Iiwic2hvcCJdKX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtZGVsaXZlcnktbWV0aG9kIl1dLGRlY2xzOjM0LHZhcnM6OSxjb25zdHM6W1siYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJtYXQtZWxldmF0aW9uLXo2Il0sWzEsIm1kYy1jYXJkIl0sWzEsImFkZHJlc3NDb250Il0sWzEsImRldGFpbC1kaXZpZGVyIl0sWzEsInNwYWNlci1yb3ciXSxbInRyYW5zbGF0ZSIsIiJdLFszLCJkYXRhU291cmNlIl0sWyJtYXRDb2x1bW5EZWYiLCJTZWxlY3Rpb24iXSxbNCwibWF0SGVhZGVyQ2VsbERlZiJdLFs0LCJtYXRDZWxsRGVmIl0sWyJtYXRDb2x1bW5EZWYiLCJOYW1lIl0sWyJtYXRDb2x1bW5EZWYiLCJQcmljZSJdLFsidHJhbnNsYXRlIiwiTEFCRUxfUFJJQ0UiLCJjbGFzcyIsInRhYmxlLWhlYWRlci1sYWJlbCIsNCwibWF0SGVhZGVyQ2VsbERlZiJdLFsibWF0Q29sdW1uRGVmIiwiRVRBIl0sWyJ0cmFuc2xhdGUiLCJMQUJFTF9FWFBFQ1RFRF9ERUxJVkVSWSIsImNsYXNzIiwidGFibGUtaGVhZGVyLWxhYmVsIiw0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWzQsIm1hdEhlYWRlclJvd0RlZiJdLFszLCJjbGljayIsNCwibWF0Um93RGVmIiwibWF0Um93RGVmQ29sdW1ucyJdLFsxLCJhY3Rpb24tcm93Il0sWyJtYXQtc3Ryb2tlZC1idXR0b24iLCIiLDEsImJ0biIsImJ0bi1yZXR1cm4iLDMsImNsaWNrIl0sWyJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsIm1hdC1idXR0b24iLCIiLCJjb2xvciIsInByaW1hcnkiLCJhcmlhLWxhYmVsIiwiUHJvY2VlZCB0byBkZWxpdmVyeSBtZXRob2Qgc2VsZWN0aW9uIiwxLCJidG4iLCJuZXh0QnV0dG9uIiwzLCJjbGljayIsImRpc2FibGVkIl0sWzMsImNsaWNrIiwiY2hhbmdlIiwiY2hlY2tlZCJdLFszLCJuZ0NsYXNzIl0sWyJ0cmFuc2xhdGUiLCJMQUJFTF9QUklDRSIsMSwidGFibGUtaGVhZGVyLWxhYmVsIl0sWyJ0cmFuc2xhdGUiLCJMQUJFTF9FWFBFQ1RFRF9ERUxJVkVSWSIsMSwidGFibGUtaGVhZGVyLWxhYmVsIl0sWzMsImNsaWNrIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYXQtY2FyZCIsMCkoMSwiZGl2IiwxKSxNKDIsUGosMTMsNywiZGl2IiwyKSxNKDMsVmosMSwwLCJtYXQtZGl2aWRlciIsMyksdSg0LCJkaXYiLDQpLGMoNSwiZGl2IikoNiwiaDEiLDUpLG0oNywiTEFCRUxfQ0hPT1NFX0FfREVMSVZFUllfU1BFRUQiKSxzKCksYyg4LCJtYXQtdGFibGUiLDYpLF9lKDksNyksUigxMCxPaiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsOCkoMTEsSGosMiwxLCJtYXQtY2VsbCIsOSksYmUoKSxfZSgxMiwxMCksUigxMyxOaiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsOCkoMTQsUmosMywyLCJtYXQtY2VsbCIsOSksYmUoKSxfZSgxNSwxMSksUigxNixGaiwxLDAsIm1hdC1oZWFkZXItY2VsbCIsMTIpKDE3LEJqLDIsMSwibWF0LWNlbGwiLDkpLGJlKCksX2UoMTgsMTMpLFIoMTksVWosMSwwLCJtYXQtaGVhZGVyLWNlbGwiLDE0KSgyMCxqaiwzLDQsIm1hdC1jZWxsIiw5KSxiZSgpLFIoMjEscWosMSwwLCJtYXQtaGVhZGVyLXJvdyIsMTUpKDIyLEdqLDEsMCwibWF0LXJvdyIsMTYpLHMoKSgpLGMoMjMsImRpdiIsMTcpKDI0LCJidXR0b24iLDE4KSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4gYS5yb3V0ZVRvUHJldmlvdXNVcmwoKX0pLGMoMjUsIm1hdC1pY29uIiksbSgyNiwiIG5hdmlnYXRlX2JlZm9yZSAiKSxzKCksbSgyNyksYigyOCwidHJhbnNsYXRlIikscygpLGMoMjksImJ1dHRvbiIsMTkpLFMoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiBhLmNob29zZURlbGl2ZXJ5TWV0aG9kKCl9KSxjKDMwLCJtYXQtaWNvbiIpLG0oMzEsIiBuYXZpZ2F0ZV9uZXh0ICIpLHMoKSxjKDMyLCJzcGFuIiw1KSxtKDMzLCJMQUJFTF9DT05USU5VRSIpLHMoKSgpKCkoKSgpKSxpJjImJihsKDIpLHcoYS5hZGRyZXNzPzI6LTEpLGwoKSx3KGEuYWRkcmVzcz8zOi0xKSxsKDUpLGYoImRhdGFTb3VyY2UiLGEuZGF0YVNvdXJjZSksbCgxMyksZigibWF0SGVhZGVyUm93RGVmIixhLmRpc3BsYXllZENvbHVtbnMpLGwoKSxmKCJtYXRSb3dEZWZDb2x1bW5zIixhLmRpc3BsYXllZENvbHVtbnMpLGwoNSksRSgiICIsQygyOCw3LCJMQUJFTF9CQUNLIiksIiAiKSxsKDIpLGYoImRpc2FibGVkIixhLmRlbGl2ZXJ5TWV0aG9kSWQ9PT12b2lkIDApKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxZLFNlLEExLHRpLG5pLGFpLHJpLGlpLG9pLEMyLFQxLGNpLGxpLHNpLGRpLG9lLGxlLGdlLENlLEtdLHN0eWxlczpbYG1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDoyMCU7bWFyZ2luLXJpZ2h0OjIwJX0uYWRkcmVzc0NvbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206LjYyNXJlbX0uZGV0YWlsLWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3Atd2lkdGg6NHB4IWltcG9ydGFudDttYXJnaW4tbGVmdDoxJSFpbXBvcnRhbnQ7d2lkdGg6OTglIWltcG9ydGFudH0uYnRuLXJldHVybltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9jazttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDphdXRvfS5uZXh0QnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLXRvcDotMi41cmVtfS50YWJsZS1oZWFkZXItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnZhcigtLXRoZW1lLXRleHQtZmFkZS01MCk7Zm9udC1zaXplOi43NXJlbX1tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde3RhYmxlLWxheW91dDpmaXhlZDt3aWR0aDoxMDAlfS5zcGFjZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTJweH0uYWN0aW9uLXJvd1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDoxLjI1cmVtfS5tYXQtY29sdW1uLVNlbGVjdGlvbltfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjAlfS5tYXQtY29sdW1uLU5hbWVbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjMwJX0ubWF0LWNvbHVtbi1QcmljZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY29sdW1uLUVUQVtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjUlfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIga0MsekM9eCgoKT0+e1h0KCk7a0M9dD0+e2lmKHR5cGVvZiB0LnZhbHVlPT0ic3RyaW5nIilyZXR1cm4gYzEobnVsbCk7bGV0IG49dC52YWx1ZSxlPW5ldyBGaWxlUmVhZGVyO3JldHVybiBuZXcgbWEoYT0+e2UuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVuZCIsKCk9PntsZXQgcj1uZXcgVWludDhBcnJheShlLnJlc3VsdCkuc3ViYXJyYXkoMCw0KSxvPSIiLGQ9ITE7Zm9yKGxldCBwIG9mIHIpbys9cC50b1N0cmluZygxNik7c3dpdGNoKG8pe2Nhc2UiODk1MDRlNDciOmQ9ITA7YnJlYWs7Y2FzZSJmZmQ4ZmZlMCI6Y2FzZSJmZmQ4ZmZlMSI6Y2FzZSJmZmQ4ZmZlMiI6Y2FzZSJmZmQ4ZmZlMyI6Y2FzZSJmZmQ4ZmZlOCI6ZD0hMDticmVhaztkZWZhdWx0OmQ9ITE7YnJlYWt9ZD9hLm5leHQobnVsbCk6YS5uZXh0KHtpbnZhbGlkTWltZVR5cGU6ITB9KSxhLmNvbXBsZXRlKCl9KSxlLnJlYWRBc0FycmF5QnVmZmVyKG4pfSl9fSk7dmFyIFBzLEI3PXgoKCk9PntOdCgpO2soKTtXdCgpO2x0KCk7aygpO1BzPSgoKT0+e2NsYXNzIHR7aHR0cD1oKEFlKTtob3N0U2VydmVyPXVlLmhvc3RTZXJ2ZXI7aG9zdD10aGlzLmhvc3RTZXJ2ZXIrIi9yZXN0L21lbW9yaWVzIjthZGRNZW1vcnkoZSxpKXtsZXQgYT1uZXcgRm9ybURhdGE7cmV0dXJuIGEuYXBwZW5kKCJpbWFnZSIsaSxlKSxhLmFwcGVuZCgiY2FwdGlvbiIsZSksdGhpcy5odHRwLnBvc3QodGhpcy5ob3N0LGEpLnBpcGUocShyPT5yLmRhdGEpLGoocj0+e3Rocm93IHJ9KSl9Z2V0KCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0KyIvIikucGlwZShxKGU9PmUuZGF0YSksaihlPT57dGhyb3cgZX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIFdqKHQsbil7aWYodCYxJiYoYygwLCJhIiw4KSgxLCJidXR0b24iLDkpLHUoMiwiaSIsMTApLHMoKSgpKSx0JjIpe2xldCBlPXYoKS4kaW1wbGljaXQsaT12KDIpO2YoImhyZWYiLEdkKCJodHRwczovL3R3aXR0ZXIuY29tL2ludGVudC90d2VldD90ZXh0PSIsZS5jYXB0aW9uLCIgIixpLnR3aXR0ZXJIYW5kbGUsIiZoYXNodGFncz1hcHBzZWMiKSx3dCl9fWZ1bmN0aW9uIFFqKHQsbil7aWYodCYxJiYoYygwLCJzcGFuIiw1KSx1KDEsImltZyIsNiksYygyLCJkaXYiLDcpKDMsImRpdiIpLG0oNCkscygpLE0oNSxXaiwzLDMsImEiLDgpLHMoKSgpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9digyKTtsKCksZigic3JjIixWZShlLnVybCksd3QpKCJhbHQiLFZlKGUuY2FwdGlvbikpLGwoMyksQShlLmNhcHRpb24pLGwoKSx3KGkudHdpdHRlckhhbmRsZT81Oi0xKX19ZnVuY3Rpb24gWWoodCxuKXtpZih0JjEmJihjKDAsImRpdiIsMykscWUoMSxRaiw2LDYsInNwYW4iLDUsRnQpLHMoKSksdCYyKXtsZXQgZT12KCk7bCgpLEdlKGUuc2xpZGVzaG93RGF0YVNvdXJjZSl9fWZ1bmN0aW9uIFpqKHQsbil7dCYxJiYoYygwLCJtYXQtY2FyZCIsNCkoMSwiZGl2IiwyKSx1KDIsImltZyIsMTEpLGMoMywibWF0LWNhcmQtdGl0bGUiKSg0LCJzcGFuIiwxMiksbSg1LCIgTk9fU0VBUkNIX1JFU1VMVCAiKSxzKCkoKSxjKDYsIm1hdC1jYXJkLWNvbnRlbnQiKSg3LCJzcGFuIiwxMiksbSg4LCIgRU1QVFlfTUVNT1JZX0xJU1QgIikscygpKCkoKSgpKX1mdW5jdGlvbiAkaih0LG4pe2lmKHQmMSYmKGMoMCwiZGl2IiwxOCksdSgxLCJpbWciLDIyKSxzKCkpLHQmMil7bGV0IGU9digyKTtsKCksZigic3JjIixlLmltYWdlUHJldmlldyx3dCkoImFsdCIsZS5mb3JtLnZhbHVlLmNhcHRpb24pfX1mdW5jdGlvbiBLaih0LG4pe3QmMSYmKGMoMCwibWF0LWVycm9yIiwxNCksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSksdCYyJiYobCgpLEEoQygyLDEsIk1BTkRBVE9SWV9DQVBUSU9OIikpKX1mdW5jdGlvbiBYaih0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiZGl2IikoMSwiZGl2IiwxMykoMiwiaDIiLDE0KSxtKDMsIkxBQkVMX1NIQVJFX0FfTUVNT1JZIikscygpLGMoNCwiZm9ybSIsMTUpKDUsImRpdiIpKDYsImJ1dHRvbiIsMTYpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9c2UoMTApO3JldHVybiBUKGEuY2xpY2soKSl9KSxtKDcpLGIoOCwidHJhbnNsYXRlIikscygpLGMoOSwiaW5wdXQiLDE3LDApLFMoImNoYW5nZSIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5vbkltYWdlUGlja2VkKGEpKX0pLHMoKSgpLE0oMTEsJGosMiwyLCJkaXYiLDE4KSxjKDEyLCJtYXQtZm9ybS1maWVsZCIsMTkpKDEzLCJtYXQtbGFiZWwiLDE0KSxtKDE0LCJMQUJFTF9DQVBUSU9OIikscygpLHUoMTUsImlucHV0IiwyMCksTSgxNixLaiwzLDMsIm1hdC1lcnJvciIsMTQpLHMoKSxjKDE3LCJidXR0b24iLDIxKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLnNhdmUoKSl9KSxjKDE4LCJtYXQtaWNvbiIpLG0oMTksInNlbmQiKSxzKCksbSgyMCksYigyMSwidHJhbnNsYXRlIikscygpKCkoKSgpfWlmKHQmMil7bGV0IGU9digpO2woNCksZigiZm9ybUdyb3VwIixlLmZvcm0pLGwoMyksRSgiIixDKDgsNiwiTEFCRUxfUElDS19JTUFHRSIpLCIgIiksbCg0KSx3KGUuaW1hZ2VQcmV2aWV3IT09IiImJmUuaW1hZ2VQcmV2aWV3JiZlLmZvcm0uZ2V0KCJpbWFnZSIpLnZhbGlkPzExOi0xKSxsKDUpLHcoZS5mb3JtLmdldCgiY2FwdGlvbiIpLmludmFsaWQ/MTY6LTEpLGwoKSxmKCJkaXNhYmxlZCIsZS5mb3JtLmdldCgiaW1hZ2UiKS5pbnZhbGlkfHxlLmZvcm0uZ2V0KCJjYXB0aW9uIikuaW52YWxpZCksbCgzKSxFKCIgIixDKDIxLDgsIkJUTl9TVUJNSVQiKSwiICIpfX12YXIgVEMsRUM9eCgoKT0+e2soKTtXZSgpO3pDKCk7QjcoKTtLMSgpO1l0KCk7ZW4oKTtKMSgpO2x0KCk7WHQoKTtldCgpO0plKCk7VygpO25lKCk7dmUoKTtoZSgpO2soKTtoZSgpO3ZlKCk7VygpO1dlKCk7bmUoKTtKZSgpO2V0KCk7TGUuYWRkKFFyKTtUQz0oKCk9PntjbGFzcyB0e3Bob3RvV2FsbFNlcnZpY2U9aChQcyk7Y29uZmlndXJhdGlvblNlcnZpY2U9aChMdCk7c25hY2tCYXJIZWxwZXJTZXJ2aWNlPWgoVnQpO2VtcHR5U3RhdGU9ITA7aW1hZ2VQcmV2aWV3O2Zvcm09bmV3IFZuKHtpbWFnZTpuZXcga2UoIiIse3ZhbGlkYXRvcnM6W0oucmVxdWlyZWRdLGFzeW5jVmFsaWRhdG9yczpba0NdfSksY2FwdGlvbjpuZXcga2UoIiIsW0oucmVxdWlyZWRdKX0pO3NsaWRlc2hvd0RhdGFTb3VyY2U9W107dHdpdHRlckhhbmRsZT1udWxsO25nT25Jbml0KCl7dGhpcy5zbGlkZXNob3dEYXRhU291cmNlPVtdLHRoaXMucGhvdG9XYWxsU2VydmljZS5nZXQoKS5waXBlKGooZT0+KGNvbnNvbGUubG9nKGUpLEhpKSkpLnN1YnNjcmliZShlPT57ZS5sZW5ndGg9PT0wP3RoaXMuZW1wdHlTdGF0ZT0hMDp0aGlzLmVtcHR5U3RhdGU9ITE7Zm9yKGxldCBpIG9mIGUpaS5Vc2VyPy51c2VybmFtZSYmKGkuY2FwdGlvbj1gJHtpLmNhcHRpb259IChceEE5ICR7aS5Vc2VyLnVzZXJuYW1lfSlgKSx0aGlzLnNsaWRlc2hvd0RhdGFTb3VyY2UucHVzaCh7dXJsOmkuaW1hZ2VQYXRoLGNhcHRpb246aS5jYXB0aW9ufSl9KSx0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbigpLnBpcGUoaihlPT4oY29uc29sZS5sb2coZSksSGkpKSkuc3Vic2NyaWJlKGU9PntlPy5hcHBsaWNhdGlvbj8uc29jaWFsJiZlLmFwcGxpY2F0aW9uLnNvY2lhbC50d2l0dGVyVXJsJiYodGhpcy50d2l0dGVySGFuZGxlPWUuYXBwbGljYXRpb24uc29jaWFsLnR3aXR0ZXJVcmwucmVwbGFjZSgiaHR0cHM6Ly90d2l0dGVyLmNvbS8iLCJAIikpfSl9b25JbWFnZVBpY2tlZChlKXtsZXQgaT1lLnRhcmdldC5maWxlc1swXTt0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7aW1hZ2U6aX0pLHRoaXMuZm9ybS5nZXQoImltYWdlIikudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO2xldCBhPW5ldyBGaWxlUmVhZGVyO2Eub25sb2FkPSgpPT57dGhpcy5pbWFnZVByZXZpZXc9YS5yZXN1bHR9LGEucmVhZEFzRGF0YVVSTChpKX1zYXZlKCl7dGhpcy5waG90b1dhbGxTZXJ2aWNlLmFkZE1lbW9yeSh0aGlzLmZvcm0udmFsdWUuY2FwdGlvbix0aGlzLmZvcm0udmFsdWUuaW1hZ2UpLnN1YnNjcmliZSh7bmV4dDooKT0+e3RoaXMucmVzZXRGb3JtKCksdGhpcy5uZ09uSW5pdCgpLHRoaXMuc25hY2tCYXJIZWxwZXJTZXJ2aWNlLm9wZW4oIklNQUdFX1VQTE9BRF9TVUNDRVNTIiwiY29uZmlybUJhciIpfSxlcnJvcjplPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihlLmVycm9yPy5lcnJvciwiZXJyb3JCYXIiKSxjb25zb2xlLmxvZyhlKX19KX1pc0xvZ2dlZEluKCl7cmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ0b2tlbiIpfXJlc2V0Rm9ybSgpe3RoaXMuZm9ybS5nZXQoImltYWdlIikuc2V0VmFsdWUoIiIpLHRoaXMuZm9ybS5nZXQoImltYWdlIikubWFya0FzUHJpc3RpbmUoKSx0aGlzLmZvcm0uZ2V0KCJpbWFnZSIpLm1hcmtBc1VudG91Y2hlZCgpLHRoaXMuZm9ybS5nZXQoImNhcHRpb24iKS5zZXRWYWx1ZSgiIiksdGhpcy5mb3JtLmdldCgiY2FwdGlvbiIpLm1hcmtBc1ByaXN0aW5lKCksdGhpcy5mb3JtLmdldCgiY2FwdGlvbiIpLm1hcmtBc1VudG91Y2hlZCgpLHRoaXMuZm9ybS5nZXQoImNhcHRpb24iKS5zZXRFcnJvcnMobnVsbCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLXBob3RvLXdhbGwiXV0sZGVjbHM6OSx2YXJzOjUsY29uc3RzOltbImZpbGVQaWNrZXIiLCIiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCIsMSwiaGVhZGluZyIsIm1hdC1lbGV2YXRpb24tejYiLCJtYXQtb3duLWNhcmQiLCJwaG90by13YWxsLWNhcmQiXSxbMSwibWRjLWNhcmQiXSxbMSwiZ3JpZCJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJtYXQtZWxldmF0aW9uLXowIiwiZW1wdHlTdGF0ZSJdLFsxLCJjb250YWluZXIiLCJtYXQtZWxldmF0aW9uLXo2Il0sWzEsImltYWdlIiwzLCJzcmMiLCJhbHQiXSxbMSwib3ZlcmxheSJdLFsidGFyZ2V0IiwiX2JsYW5rIiwzLCJocmVmIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIiwiVHdlZXQiXSxbMSwiZmFiIiwiZmEtdHdpdHRlciIsImZhLWxnIl0sWyJhbHQiLCIgTm8gcmVzdWx0cyBmb3VuZCIsInNyYyIsImFzc2V0cy9wdWJsaWMvaW1hZ2VzL3Byb2R1Y3RzL25vLXJlc3VsdHMucG5nIiwxLCJpbWctcmVzcG9uc2l2ZSIsIm5vUmVzdWx0Il0sWyJ0cmFuc2xhdGUiLCIiLDEsIm5vUmVzdWx0VGV4dCJdLFsxLCJzaGFyZS1tZW1vcnktc2VjdGlvbiJdLFsidHJhbnNsYXRlIiwiIl0sWyJlbmN0eXBlIiwibXVsdGlwYXJ0L2Zvcm0tZGF0YSIsMywiZm9ybUdyb3VwIl0sWyJtYXQtc3Ryb2tlZC1idXR0b24iLCIiLCJ0eXBlIiwiYnV0dG9uIiwzLCJjbGljayJdLFsidHlwZSIsImZpbGUiLCJuYW1lIiwiZmlsZSIsMywiY2hhbmdlIl0sWzEsImltYWdlLXByZXZpZXciXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lIiwiY29sb3IiLCJhY2NlbnQiXSxbImZvcm1Db250cm9sTmFtZSIsImNhcHRpb24iLCJ0eXBlIiwidGV4dCIsIm1hdElucHV0IiwiIl0sWyJpZCIsInN1Ym1pdEJ1dHRvbiIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiY29sb3IiLCJwcmltYXJ5IiwzLCJjbGljayIsImRpc2FibGVkIl0sWzMsInNyYyIsImFsdCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwibWF0LWNhcmQiLDEpKDEsImRpdiIsMikoMiwiaDEiKSxtKDMpLGIoNCwidHJhbnNsYXRlIikscygpLGMoNSwiZGl2IiksTSg2LFlqLDMsMCwiZGl2IiwzKSg3LFpqLDksMCwibWF0LWNhcmQiLDQpLHMoKSxNKDgsWGosMjIsMTAsImRpdiIpLHMoKSgpKSxpJjImJihsKDMpLEEoQyg0LDMsIkxBQkVMX1BIT1RPX1dBTEwiKSksbCgzKSx3KGEuZW1wdHlTdGF0ZT83OjYpLGwoMiksdyhhLmlzTG9nZ2VkSW4oKT84Oi0xKSl9LGRlcGVuZGVuY2llczpbZGUscGUscDIsWDIsZ2UsQ2UsbDEsWSxTZSxhdCxnMixndCxtdCx1Mix6dCxiYSxTcixvZSxsZSxRZSxaZSxodCxRdCwkZSxudCxLXSxzdHlsZXM6W2BtYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0ubWF0LW93bi1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO21hcmdpbi1sZWZ0OjEwJTttYXJnaW4tcmlnaHQ6MTAlfSNzdWJtaXRCdXR0b25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1sZWZ0OjIwJTttYXJnaW4tdG9wOi42MjVyZW07d2lkdGg6NjAlfS5waG90by13YWxsLWNhcmRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206LjYyNXJlbX1pbnB1dFt0eXBlPWZpbGVdW19uZ2NvbnRlbnQtJUNPTVAlXXt2aXNpYmlsaXR5OmhpZGRlbn0uaW1hZ2UtcHJldmlld1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjVyZW07bWFyZ2luOjFyZW0gMH0uaW1hZ2UtcHJldmlld1tfbmdjb250ZW50LSVDT01QJV0gICBpbWdbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlfS5oZWFkaW5nLW1haW5bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTp4LWxhcmdlO2p1c3RpZnktY29udGVudDpjZW50ZXJ9Lm1haW4td3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MTAlO21hcmdpbi1yaWdodDoxMCV9LmdyaWRbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmdyaWQ7Z3JpZC1nYXA6MS4yNXJlbTtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZmlsbCxtaW5tYXgoMjU1cHgsMWZyKSl9LnNoYXJlLW1lbW9yeS1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi42MjVyZW19LmdyaWRbX25nY29udGVudC0lQ09NUCVdICAgaW1nW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjRweDtib3gtc2hhZG93OjJweCAycHggNnB4ICMwMDAwMDA0ZDttYXgtd2lkdGg6MTAwJX0uY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0uaW1hZ2VbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2t9Lm92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTowO2ZvbnQtc2l6ZToyMHB4O2xlZnQ6MDtvcGFjaXR5OjA7cGFkZGluZzoxLjI1cmVtO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dGV4dC1hbGlnbjpjZW50ZXI7dHJhbnNpdGlvbjouNXMgZWFzZX0uY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmVtcHR5U3RhdGVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OmF1dG8haW1wb3J0YW50O21hcmdpbjoxLjI1cmVtIGF1dG87d2lkdGg6NTAlfS5ub1Jlc3VsdFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9jazttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvO3dpZHRoOjYwJX0ubm9SZXN1bHRUZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6LjYyNXJlbTt0ZXh0LWFsaWduOmNlbnRlcn0udHdlZXQtbG9nb1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjI0cHh9CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIHRxKHQsbil7aWYodCYxJiYoYygwLCJkaXYiLDApKDEsInNwYW4iLDE0KSxtKDIpLHMoKSgpKSx0JjIpe2xldCBlPXYoKTtsKDIpLEEoZS5lcnJvcil9fWZ1bmN0aW9uIGlxKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJzcGFuIiksbSgxKSxzKCksYygyLCJidXR0b24iLDE1KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLnVwZ3JhZGVUb0RlbHV4ZSgpKX0pLGMoMywic3BhbiIsMTYpLG0oNCwiTEFCRUxfQkVDT01FX01FTUJFUiIpLHMoKSgpfWlmKHQmMil7bGV0IGU9digpO2woKSxFKCIgIixlLm1lbWJlcnNoaXBDb3N0LCJceEE0ICIpfX1mdW5jdGlvbiBhcSh0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWNhcmQiLDEzKSx1KDEsIm1hdC1pY29uIiwxNyksYygyLCJkaXYiLDkpKDMsInN0cm9uZyIsMTgpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCksYyg2LCJzcGFuIiksbSg3KSxiKDgsInRyYW5zbGF0ZSIpLHMoKSgpKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgpLGYoImZvbnRJY29uIixlLmljb24pLGwoMyksQShDKDUsMyxlLm5hbWUpKSxsKDMpLEEoQyg4LDUsZS5kZXNjcmlwdGlvbikpfX12YXIgSmosZXEsQUMsREM9eCgoKT0+e2soKTtGMSgpO3AxKCk7SzEoKTtYYSgpO3ZlKCk7bmUoKTtXKCk7aGUoKTtrKCk7aGUoKTtXKCk7bmUoKTt2ZSgpO0pqPXQ9Pih7YXBwbmFtZTp0fSksZXE9KHQsbik9Pm4ubmFtZTtBQz0oKCk9PntjbGFzcyB0e3JvdXRlcj1oKHl0KTt1c2VyU2VydmljZT1oKEF0KTtjb25maWd1cmF0aW9uU2VydmljZT1oKEx0KTtyb3V0ZT1oKCQxKTtuZ1pvbmU9aChyZSk7aW89aChqaSk7bWVtYmVyc2hpcENvc3Q9MDtlcnJvcj12b2lkIDA7YXBwbGljYXRpb25OYW1lPSJPV0FTUCBKdWljZSBTaG9wIjtsb2dvU3JjPSJhc3NldHMvcHVibGljL2ltYWdlcy9KdWljZVNob3BfTG9nby5wbmciO1NIT1dDQVNFUz1be2ljb246InNsaWRlc2hvdyIsbmFtZToiTEFCRUxfREVBTFNfT0ZGRVJTIixkZXNjcmlwdGlvbjoiREVTQ1JJUFRJT05fREVBTFNfT0ZGRVJTIn0se2ljb246ImRpcmVjdGlvbnNfY2FyIixuYW1lOiJMQUJFTF9GUkVFX0ZBU1RfREVMSVZFUlkiLGRlc2NyaXB0aW9uOiJERVNDUklQVElPTl9GUkVFX0ZBU1RfREVMSVZFUlkifSx7aWNvbjoiYWRkIixuYW1lOiJMQUJFTF9VTkxJTUlURURfUFVSQ0hBU0UiLGRlc2NyaXB0aW9uOiJERVNDUklQVElPTl9VTkxJTUlURURfUFVSQ0hBU0UifV07bmdPbkluaXQoKXt0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbigpLnN1YnNjcmliZSh7bmV4dDplPT57bGV0IGk9dGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy50ZXN0RGVjYWw7aWYoZT8uYXBwbGljYXRpb24mJihlLmFwcGxpY2F0aW9uLm5hbWUmJih0aGlzLmFwcGxpY2F0aW9uTmFtZT1lLmFwcGxpY2F0aW9uLm5hbWUpLGUuYXBwbGljYXRpb24ubG9nbykpe2xldCBhPWUuYXBwbGljYXRpb24ubG9nbzthLnN1YnN0cmluZygwLDQpPT09Imh0dHAiJiYoYT1kZWNvZGVVUklDb21wb25lbnQoYS5zdWJzdHJpbmcoYS5sYXN0SW5kZXhPZigiLyIpKzEpKSksdGhpcy5sb2dvU3JjPWBhc3NldHMvcHVibGljL2ltYWdlcy8ke2l8fGF9YH1pJiZ0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKT0+e3RoaXMuaW8uc29ja2V0KCkuZW1pdCgidmVyaWZ5U3ZnSW5qZWN0aW9uQ2hhbGxlbmdlIixpKX0pfSxlcnJvcjplPT57Y29uc29sZS5sb2coZSl9fSksdGhpcy51c2VyU2VydmljZS5kZWx1eGVTdGF0dXMoKS5zdWJzY3JpYmUoe25leHQ6ZT0+e3RoaXMubWVtYmVyc2hpcENvc3Q9ZS5tZW1iZXJzaGlwQ29zdH0sZXJyb3I6ZT0+e3RoaXMuZXJyb3I9ZS5lcnJvci5lcnJvcn19KX11cGdyYWRlVG9EZWx1eGUoKXt0aGlzLm5nWm9uZS5ydW4oKCk9PlBlKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyIvcGF5bWVudCIsImRlbHV4ZSJdKX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtZGVsdXhlLXVzZXIiXV0sZGVjbHM6MTgsdmFyczoxMCxjb25zdHM6W1sxLCJoZWFkaW5nIiwibWF0LWVsZXZhdGlvbi16NiJdLFsiYXBwZWFyYW5jZSIsIm91dGxpbmVkIiwxLCJtYXQtZWxldmF0aW9uLXo2IiwiZGVsdXhlLW1lbWJlcnNoaXAiXSxbInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0Iiwidmlld0JveCIsIjAgMCA3MjAgNzIwIiwieG1sbnMiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJdLFsiaHJlZiIsImFzc2V0cy9wdWJsaWMvaW1hZ2VzL2RlbHV4ZS9ibGFua0JveGVzLnBuZyIsIngiLCIwIiwieSIsIjAiLCJoZWlnaHQiLCI3MjAiLCJ3aWR0aCIsIjcyMCJdLFsieCIsIjI2MCIsInkiLCIxMzAiLCJoZWlnaHQiLCI1MCJdLFsieCIsIjIzMCIsInkiLCIzMzAiLCJoZWlnaHQiLCI3MCJdLFsieCIsIjcwIiwieSIsIjM1NSIsImhlaWdodCIsIjQwIl0sWyJ4IiwiMTIwIiwieSIsIjQ1MCIsImhlaWdodCIsIjU1Il0sWyJ4IiwiNTAwIiwieSIsIjQxMCIsImhlaWdodCIsIjQ1Il0sWzEsImNhcmQtdGV4dCJdLFsidHJhbnNsYXRlIiwiIiwxLCJpdGVtLW5hbWUiXSxbInRyYW5zbGF0ZSIsIiIsMywidHJhbnNsYXRlUGFyYW1zIl0sWzEsImZlYXR1cmUtY2FyZHMtY29udGFpbmVyIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsIm1hdC1lbGV2YXRpb24tejYiLCJmZWF0dXJlLWNhcmQiXSxbMSwiZXJyb3IiXSxbImFyaWEtbGFiZWwiLCJCZWNvbWUgZGVsdXhlIG1lbWJlciIsImNvbG9yIiwicHJpbWFyeSIsIm1hdC1idXR0b24iLCIiLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsMywiY2xpY2siXSxbInRyYW5zbGF0ZSIsIiJdLFszLCJmb250SWNvbiJdLFsxLCJpdGVtLW5hbWUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihNKDAsdHEsMywxLCJkaXYiLDApLGMoMSwibWF0LWNhcmQiLDEpLE10KCksYygyLCJzdmciLDIpLHUoMywiaW1hZ2UiLDMpKDQsImltYWdlIiw0KSg1LCJpbWFnZSIsNSkoNiwiaW1hZ2UiLDYpKDcsImltYWdlIiw3KSg4LCJpbWFnZSIsOCkscygpLHlpKCksYyg5LCJkaXYiLDkpKDEwLCJzdHJvbmciLDEwKSxtKDExLCJMQUJFTF9ERUxVWEVfTUVNQkVSU0hJUCIpLHMoKSxjKDEyLCJzcGFuIiwxMSksbSgxMywiREVTQ1JJUFRJT05fREVMVVhFX01FTUJFUlNISVAiKSxzKCksTSgxNCxpcSw1LDEpLHMoKSgpLGMoMTUsImRpdiIsMTIpLHFlKDE2LGFxLDksNywibWF0LWNhcmQiLDEzLGVxKSxzKCkpLGkmMiYmKHcoYS5lcnJvcj8wOi0xKSxsKDQpLEcoImhyZWYiLGEubG9nb1NyYyksbCgpLEcoImhyZWYiLGEubG9nb1NyYyksbCgpLEcoImhyZWYiLGEubG9nb1NyYyksbCgpLEcoImhyZWYiLGEubG9nb1NyYyksbCgpLEcoImhyZWYiLGEubG9nb1NyYyksbCg0KSxmKCJ0cmFuc2xhdGVQYXJhbXMiLGJ0KDgsSmosYS5hcHBsaWNhdGlvbk5hbWUpKSxsKDIpLHcoYS5lcnJvcj8tMToxNCksbCgyKSxHZShhLlNIT1dDQVNFUykpfSxkZXBlbmRlbmNpZXM6W2RlLHBlLFksU2Usb2UsbGUsZ2UsQ2UsS10sc3R5bGVzOltgW19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDouNjI1cmVtO21hcmdpbi1sZWZ0OjEwJTttYXJnaW4tcmlnaHQ6MTAlfS5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDAzO2ZvbnQtc2l6ZTp4LWxhcmdlO3BhZGRpbmc6MXJlbSAxLjVyZW19LmRlbHV4ZS1tZW1iZXJzaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpncmlkO2dhcDoxcmVtO2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgobWluLWNvbnRlbnQsNjAwcHgpIGF1dG99LmRlbHV4ZS1tZW1iZXJzaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEuNWVtfS5kZWx1eGUtbWVtYmVyc2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAuY2FyZC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6LjYyNXJlbTtwYWRkaW5nOjFyZW07dGV4dC1hbGlnbjpjZW50ZXJ9QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpey5kZWx1eGUtbWVtYmVyc2hpcFtfbmdjb250ZW50LSVDT01QJV17Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcn19LmZlYXR1cmUtY2FyZHMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmdyaWQ7Z2FwOi42MjVyZW07Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCgzLDFmcil9QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpey5mZWF0dXJlLWNhcmRzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcn19LmZlYXR1cmUtY2FyZFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6Z3JpZDtnYXA6LjYyNXJlbTtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWF4LWNvbnRlbnQgYXV0bztwYWRkaW5nOjFyZW19LmZlYXR1cmUtY2FyZFtfbmdjb250ZW50LSVDT01QJV0gICAuY2FyZC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDouNXJlbTtwYWRkaW5nOjAgMXJlbTt0ZXh0LWFsaWduOmNlbnRlcn0uZmVhdHVyZS1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzJweDtoZWlnaHQ6NzJweDt3aWR0aDo3MnB4fQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBucSh0LG4pe2lmKHQmMSYmKGMoMCwiZGl2IikoMSwiZGl2IikoMiwibWF0LWNhcmQtdGl0bGUiKSxtKDMpLGIoNCwidHJhbnNsYXRlIikscygpKCksYyg1LCJkaXYiLDUpLG0oNiksYig3LCJ0cmFuc2xhdGUiKSxjKDgsImEiLDYpLG0oOSwiODM0M0QyIikscygpKCksdSgxMCwibWF0LWRpdmlkZXIiLDcpLGMoMTEsImRpdiIsOCkoMTIsImRpdiIsOSksbSgxMyksYigxNCwidHJhbnNsYXRlIikscygpLHUoMTUsIm1hdC1kaXZpZGVyIiw3KSxjKDE2LCJwIiwxMCksbSgxNywiMHg4MzQzZDJlYjJCMTNBMjQ5NURlNDM1YTFiMTVlODViOTgxMTVDZTA1IikscygpKCksYygxOCwiZGl2Iiw4KSgxOSwiZGl2Iiw5KSxtKDIwKSxiKDIxLCJ0cmFuc2xhdGUiKSxzKCksdSgyMiwibWF0LWRpdmlkZXIiLDcpKDIzLCJwIiwxMSksYigyNCwidHJhbnNsYXRlIikscygpKCkpLHQmMil7bGV0IGU9digpO2woMyksQShDKDQsNSwiVElUTEVfU0JUIikpLGwoMyksRSgiICIsQyg3LDcsIk9XTkVEX0JZIiksIiAiKSxsKDcpLEEoQygxNCw5LCJMQUJFTF9BQ0NPVU5UX0FERFJFU1MiKSksbCg3KSxBKEMoMjEsMTEsIkxBQkVMX0RFU0NSSVBUSU9OIikpLGwoMyksZigiaW5uZXJIVE1MIixkdCgyNCwxMywiTkZUX1NCVF9CT1hfVEVYVCIsZS5pMThuUGFyYW1zKSx0dCl9fWZ1bmN0aW9uIHJxKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJkaXYiKSgxLCJkaXYiKSgyLCJtYXQtY2FyZC10aXRsZSIsMTIpLG0oMyksYig0LCJ0cmFuc2xhdGUiKSxzKCkoKSxjKDUsImZvcm0iLDEzKSxTKCJuZ1N1Ym1pdCIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLnN1Ym1pdEZvcm0oKSl9KSxjKDYsImRpdiIsMTQpKDcsIm1hdC1mb3JtLWZpZWxkIiwxNSkoOCwibWF0LWxhYmVsIiksbSg5KSxiKDEwLCJ0cmFuc2xhdGUiKSxzKCksYygxMSwiaW5wdXQiLDE2KSxiKDEyLCJ0cmFuc2xhdGUiKSxGaSgibmdNb2RlbENoYW5nZSIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFJpKHIucHJpdmF0ZUtleSxhKXx8KHIucHJpdmF0ZUtleT1hKSxUKGEpfSkscygpKCksYygxMywiaDUiLDE3KSxtKDE0KSxzKCkoKSxjKDE1LCJidXR0b24iLDE4KSxtKDE2KSxiKDE3LCJ0cmFuc2xhdGUiKSxzKCkoKSgpfWlmKHQmMil7bGV0IGU9digpO2woMyksQShDKDQsNiwiVElUTEVfU0JUIikpLGwoNiksQShDKDEwLDgsIkxBQkVMX1BSSVZBVEVfS0VZIikpLGwoMiksTmkoIm5nTW9kZWwiLGUucHJpdmF0ZUtleSksRygiYXJpYS1sYWJlbCIsQygxMiwxMCwiTEFCRUxfUFJJVkFURV9LRVkiKSksbCgzKSxBKGUuZXJyb3JNZXNzYWdlKSxsKDIpLEUoIiAiLEMoMTcsMTIsIkJUTl9BVVRIRU5USUNBVEUiKSwiICIpfX12YXIgSUMsTEM9eCgoKT0+e2soKTtGbSgpO3FpKCk7ZXQoKTtKZSgpO1dlKCk7VygpO25lKCk7aGUoKTtrKCk7aGUoKTtuZSgpO1dlKCk7SmUoKTtldCgpO1coKTtJQz0oKCk9PntjbGFzcyB0e2tleXNTZXJ2aWNlPWgoSDApO3ByaXZhdGVLZXk7Zm9ybVN1Ym1pdHRlZD0hMTtzdWNjZXNzUmVzcG9uc2U9ITE7ZXJyb3JNZXNzYWdlPSIiO2kxOG5QYXJhbXM9e2xpbms6JzxhIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiIGhyZWY9Imh0dHBzOi8vdGVzdG5ldHMub3BlbnNlYS5pby9hc3NldHMvbXVtYmFpLzB4ZjQ4MTc2MzEzNzJkY2E2OGEyNWExOGViN2EwYjM2ZDU0ZjNkYmNmNy8wIj5PcGVuc2VhPC9hPid9O25nT25Jbml0KCl7dGhpcy5jaGVja0NoYWxsZW5nZVN0YXR1cygpfWNoZWNrQ2hhbGxlbmdlU3RhdHVzKCl7dGhpcy5rZXlzU2VydmljZS5uZnRVbmxvY2tlZCgpLnN1YnNjcmliZSh7bmV4dDplPT57dGhpcy5zdWNjZXNzUmVzcG9uc2U9ZS5zdGF0dXN9LGVycm9yOmU9Pntjb25zb2xlLmVycm9yKGUpLHRoaXMuc3VjY2Vzc1Jlc3BvbnNlPSExfX0pfXN1Ym1pdEZvcm0oKXt0aGlzLmZvcm1TdWJtaXR0ZWQ9ITAsdGhpcy5rZXlzU2VydmljZS5zdWJtaXRLZXkodGhpcy5wcml2YXRlS2V5KS5zdWJzY3JpYmUoe25leHQ6ZT0+e2Uuc3VjY2Vzcz8odGhpcy5zdWNjZXNzUmVzcG9uc2U9ITAsdGhpcy5lcnJvck1lc3NhZ2U9ZS5tZXNzYWdlKTp0aGlzLnN1Y2Nlc3NSZXNwb25zZT0hMX0sZXJyb3I6ZT0+e3RoaXMuc3VjY2Vzc1Jlc3BvbnNlPSExLHRoaXMuZXJyb3JNZXNzYWdlPWUuZXJyb3IubWVzc2FnZX19KX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJhcHAtbmZ0LXVubG9jayJdXSxkZWNsczoxMCx2YXJzOjQsY29uc3RzOltbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCJdLFsxLCJtZGMtY2FyZCIsImNvbnRhaW5lciJdLFsibWF0LXJhaXNlZC1idXR0b24iLCIiLCJjb2xvciIsIndhcm4iLDEsImRldGFpbC1jb250YWluZXIiLCJvZmZlci1jb250YWluZXIiLCJ3YXJuaW5nLWNvbnRhaW5lciIsImFsaWduLXNlbGYtY2VudGVyIl0sWzEsImRldGFpbC1jb250YWluZXIiLCJvZmZlci1jb250YWluZXIiLCJhbGlnbi1zZWxmLWNlbnRlciJdLFsic3JjIiwiYXNzZXRzL3B1YmxpYy9pbWFnZXMvcHJvZHVjdHMvanVpY3lfY2hhdGJvdC5qcGciXSxbMSwib3duZXItdGV4dCJdLFsidGFyZ2V0IiwiX2JsYW5rIiwiaHJlZiIsImh0dHBzOi8vdGVzdG5ldHMub3BlbnNlYS5pby8weDgzNDNkMmViMkIxM0EyNDk1RGU0MzVhMWIxNWU4NWI5ODExNUNlMDUiXSxbMSwiZGV0YWlsLWRpdmlkZXIiXSxbMSwiZGV0YWlsLWJveCIsIm1hdC1lbGV2YXRpb24tejYiXSxbMSwiYm94LXRpdGxlIl0sWzEsImJveC10ZXh0Il0sWzEsImJveC10ZXh0IiwzLCJpbm5lckhUTUwiXSxbMSwic2J0LXRpdGxlIl0sWzMsIm5nU3VibWl0Il0sWzEsImZvcm0tZ3JvdXAiXSxbImNvbG9yIiwiYWNjZW50IiwiYXBwZWFyYW5jZSIsIm91dGxpbmUiLDEsInJlc3BvbnNpdmUtZmllbGQiXSxbIm1hdElucHV0IiwiIiwiaWQiLCJwcml2YXRlS2V5IiwibmFtZSIsInByaXZhdGVLZXkiLCJyZXF1aXJlZCIsIiIsInR5cGUiLCJ0ZXh0IiwxLCJ0ZXh0LWVsbGlwc2lzIiwzLCJuZ01vZGVsQ2hhbmdlIiwibmdNb2RlbCJdLFsxLCJlcnJvciJdLFsidHlwZSIsInN1Ym1pdCIsIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiY29sb3IiLCJhY2NlbnQiLDEsImJ0biIsImJ0bi1wcmltYXJ5Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJtYXQtY2FyZCIsMCkoMSwiZGl2IiwxKSgyLCJidXR0b24iLDIpLG0oMyksYig0LCJ0cmFuc2xhdGUiKSxzKCksYyg1LCJkaXYiLDMpKDYsImRpdiIpLHUoNywiaW1nIiw0KSxzKCksTSg4LG5xLDI1LDE2LCJkaXYiKSg5LHJxLDE4LDE0LCJkaXYiKSxzKCkoKSgpKSxpJjImJihsKDMpLEUoIiAiLEMoNCwyLCJCVE5fU0JUX05PVEUiKSwiICIpLGwoNSksdyhhLnN1Y2Nlc3NSZXNwb25zZT84OjkpKX0sZGVwZW5kZW5jaWVzOltkZSxwZSxYMixvZSxsZSxZLGF0LGcyLGd0LG10LHUyLGtyLGVhLF9hLFFlLFplLGh0LCRlLG50LEExLEtdLHN0eWxlczpbYC5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjEuMjVyZW07anVzdGlmeS1jb250ZW50OmNlbnRlcn0uaGVhZGluZ1tfbmdjb250ZW50LSVDT01QJV17anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW4tYm90dG9tOi42MjVyZW07cGFkZGluZzoxcmVtIDEuMjVyZW19LmRldGFpbC1jb250YWluZXIub2ZmZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztnYXA6MXJlbTttYXgtd2lkdGg6NzAwcHg7bWluLXdpZHRoOjMwMHB4O3dpZHRoOjcwJX1AbWVkaWEgKG1heC13aWR0aDogMTI3OS45OHB4KXsuZGV0YWlsLWNvbnRhaW5lci5vZmZlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn19LmFsaWduLXNlbGYtY2VudGVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1zZWxmOmNlbnRlcn0ub3duZXItdGV4dFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTouNjI1cmVtfS5yZXNwb25zaXZlLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfUBtZWRpYSAobWluLXdpZHRoOiA2MDBweCl7LnJlc3BvbnNpdmUtZmllbGRbX25nY29udGVudC0lQ09NUCVde21heC13aWR0aDozNTBweDt3aWR0aDo3NXZ3fX0ucmVzcG9uc2l2ZS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAudGV4dC1lbGxpcHNpc1tfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lndhcm5pbmctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Ym9yZGVyLXJhZGl1czo0cHg7ZGlzcGxheTpmbGV4O2ZvbnQtd2VpZ2h0OjYwMDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21pbi1oZWlnaHQ6NDhweDtwYWRkaW5nOjFyZW07dGV4dC1hbGlnbjpjZW50ZXI7d2hpdGUtc3BhY2U6bm9ybWFsfUBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCl7Lndhcm5pbmctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6LjllbTtsaW5lLWhlaWdodDoxLjQ7bWluLWhlaWdodDo1NnB4O3BhZGRpbmc6MS4yNXJlbSAxcmVtfX0uc2J0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MS41cmVtO21hcmdpbjowIDAgMXJlbX1AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2MDBweCl7LnNidC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEuMjVyZW19fW1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOi42MjVyZW19bWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZCgxKXtib3JkZXItcmFkaXVzOjVweDttYXJnaW46MCBhdXRvO3dpZHRoOjgwJX0uZGV0YWlsLWJveFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbToxcmVtO3BhZGRpbmc6MXJlbX0uYm94LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweDtmb250LXdlaWdodDo1MDB9LmJveC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41cmVtO292ZXJmbG93LXdyYXA6YnJlYWstd29yZH0uZm9ybS1ncm91cFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXJnaW4tdG9wOjFyZW07d2lkdGg6MTAwJX0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIGNyLFZzPXgoKCk9Pntjcj1PYmplY3QuZnJlZXplKHtjYXRlZ29yaWVzOltdLGRpZmZpY3VsdGllczpbXSx0YWdzOltdLHN0YXR1czpudWxsLHNlYXJjaFF1ZXJ5Om51bGwsc2hvd0Rpc2FibGVkQ2hhbGxlbmdlczohMCxyZXN0cmljdFRvVHV0b3JpYWxDaGFsbGVuZ2VzRmlyc3Q6ITF9KX0pO2Z1bmN0aW9uIFBDKHQpe2xldCBuPVhlKHt9LHN0cnVjdHVyZWRDbG9uZShjcikpO3JldHVybiB0LnNlYXJjaFF1ZXJ5JiYobi5zZWFyY2hRdWVyeT10LnNlYXJjaFF1ZXJ5KSx0LmRpZmZpY3VsdGllcyYmKG4uZGlmZmljdWx0aWVzPXQuZGlmZmljdWx0aWVzLnNwbGl0KCIsIikubWFwKGU9PnBhcnNlSW50KGUsMTApKS5maWx0ZXIoZT0+IWlzTmFOKGUpKSksdC50YWdzJiYobi50YWdzPXQudGFncy5zcGxpdCgiLCIpKSx0LnN0YXR1cyYmKG4uc3RhdHVzPXQuc3RhdHVzKSx0LmNhdGVnb3JpZXMmJihuLmNhdGVnb3JpZXM9dC5jYXRlZ29yaWVzLnNwbGl0KCIsIikpLHQuc2hvd0Rpc2FibGVkQ2hhbGxlbmdlcyE9PXZvaWQgMCYmKG4uc2hvd0Rpc2FibGVkQ2hhbGxlbmdlcz10LnNob3dEaXNhYmxlZENoYWxsZW5nZXM9PT0idHJ1ZSIpLG59ZnVuY3Rpb24gVTcodCl7cmV0dXJue3NlYXJjaFF1ZXJ5OnQuc2VhcmNoUXVlcnk/P3ZvaWQgMCxkaWZmaWN1bHRpZXM6dC5kaWZmaWN1bHRpZXMuam9pbigiLCIpfHx2b2lkIDAsc3RhdHVzOnQuc3RhdHVzPz92b2lkIDAsdGFnczp0LnRhZ3Muam9pbigiLCIpfHx2b2lkIDAsY2F0ZWdvcmllczp0LmNhdGVnb3JpZXMuam9pbigiLCIpfHx2b2lkIDAsc2hvd0Rpc2FibGVkQ2hhbGxlbmdlczp0LnNob3dEaXNhYmxlZENoYWxsZW5nZXM/dm9pZCAwOiJmYWxzZSJ9fXZhciBWQz14KCgpPT57VnMoKX0pO3ZhciBPQyxIQz14KCgpPT57TnQoKTtrKCk7V3QoKTtsdCgpO2soKTtPQz0oKCk9PntjbGFzcyB0e2h0dHA9aChBZSk7aG9zdFNlcnZlcj11ZS5ob3N0U2VydmVyO2hvc3Q9dGhpcy5ob3N0U2VydmVyKyIvc25pcHBldHMiO2dldChlKXtyZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLmhvc3R9LyR7ZX1gKS5waXBlKHEoaT0+aSksaihpPT57dGhyb3cgaX0pKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO3ZhciBOQyxSQz14KCgpPT57aygpO050KCk7V3QoKTtsdCgpO2soKTtOQz0oKCk9PntjbGFzcyB0e2h0dHA9aChBZSk7aG9zdFNlcnZlcj11ZS5ob3N0U2VydmVyO2hvc3Q9dGhpcy5ob3N0U2VydmVyKyIvc25pcHBldHMvZml4ZXMiO2dldChlKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmhvc3QrYC8ke2V9YCkucGlwZShxKGk9PmkpLGooaT0+e3Rocm93IGl9KSl9Y2hlY2soZSxpKXtyZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5ob3N0LHtrZXk6ZSxzZWxlY3RlZEZpeDppfSkucGlwZShxKGE9PmEpLGooYT0+e3Rocm93IGF9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTt2YXIgRkMsQkM9eCgoKT0+e2soKTtOdCgpO1d0KCk7bHQoKTtrKCk7RkM9KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtob3N0PXRoaXMuaG9zdFNlcnZlcisiL3NuaXBwZXRzL3ZlcmRpY3QiO2NoZWNrKGUsaSl7cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMuaG9zdCx7a2V5OmUsc2VsZWN0ZWRMaW5lczppfSkucGlwZShxKGE9PmEpLGooYT0+e3Rocm93IGF9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBzcSh0LG4pe2lmKHQmMSYmdSgwLCJ0ZC1uZ3gtdGV4dC1kaWZmIiwxLDApLHQmMil7bGV0IGU9digpLiRpbXBsaWNpdCxpPXYoKTtmKCJsZWZ0IixpLnNuaXBwZXQpKCJyaWdodCIsZT09bnVsbD9udWxsOmUuZml4KSgiZm9ybWF0IixpLmZvcm1hdCl9fWZ1bmN0aW9uIGxxKHQsbil7aWYodCYxJiZNKDAsc3EsMiwzLCJ0ZC1uZ3gtdGV4dC1kaWZmIiwxKSx0JjIpe2xldCBlPW4uJGluZGV4LGk9digpO3coaS5zZWxlY3RlZEZpeD09PWU/MDotMSl9fXZhciBvcSxjcSxVQyxqQz14KCgpPT57aygpO2JjKCk7d2koKTtrKCk7YmMoKTtvcT1bImNvZGVDb21wb25lbnQiXSxjcT0odCxuKT0+bi5pbmRleDtVQz0oKCk9PntjbGFzcyB0e2Nvb2tpZVNlcnZpY2U9aChadCk7ZGlmZmVycz1oKFlkKTtkaWZmZXI7Y29uc3RydWN0b3IoKXtsZXQgZT10aGlzLmNvb2tpZVNlcnZpY2U7dGhpcy5jb29raWVTZXJ2aWNlPWUsdGhpcy5kaWZmZXI9dGhpcy5kaWZmZXJzLmZpbmQoe30pLmNyZWF0ZSgpfXNuaXBwZXQ9IiI7Zml4ZXM9W107c2VsZWN0ZWRGaXg9MDtyYW5kb21GaXhlcz1bXTtmb3JtYXQ9IlNpZGVCeVNpZGUiO2NvZGVDb21wb25lbnQ7bmdPbkluaXQoKXt0aGlzLmNvb2tpZVNlcnZpY2UuaGFzS2V5KCJjb2RlLWZpeGVzLWNvbXBvbmVudC1mb3JtYXQiKT90aGlzLmZvcm1hdD10aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCJjb2RlLWZpeGVzLWNvbXBvbmVudC1mb3JtYXQiKToodGhpcy5mb3JtYXQ9IkxpbmVCeUxpbmUiLHRoaXMuY29va2llU2VydmljZS5wdXQoImNvZGUtZml4ZXMtY29tcG9uZW50LWZvcm1hdCIsIkxpbmVCeUxpbmUiKSl9bmdEb0NoZWNrKCl7aWYodGhpcy5jb2RlQ29tcG9uZW50KXRyeXtsZXQgZT10aGlzLmRpZmZlci5kaWZmKHsiZGlmZi1mb3JtYXQiOnRoaXMuY29kZUNvbXBvbmVudC5mb3JtYXR9KTtlJiZlLmZvckVhY2hDaGFuZ2VkSXRlbShpPT57dGhpcy5mb3JtYXQ9aS5jdXJyZW50VmFsdWUsdGhpcy5jb29raWVTZXJ2aWNlLnB1dCgiY29kZS1maXhlcy1jb21wb25lbnQtZm9ybWF0Iix0aGlzLmZvcm1hdCl9KX1jYXRjaHtjb25zb2xlLndhcm4oIkVycm9yIGR1cmluZyBkaWZmaW5nIil9fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1jb2RlLWZpeGVzIl1dLHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmdGUob3EsNSksaSYyKXtsZXQgcjtGKHI9QigpKSYmKGEuY29kZUNvbXBvbmVudD1yLmZpcnN0KX19LGlucHV0czp7c25pcHBldDoic25pcHBldCIsZml4ZXM6ImZpeGVzIixzZWxlY3RlZEZpeDoic2VsZWN0ZWRGaXgiLHJhbmRvbUZpeGVzOiJyYW5kb21GaXhlcyIsZm9ybWF0OiJmb3JtYXQifSxkZWNsczoyLHZhcnM6MCxjb25zdHM6W1siY29kZUNvbXBvbmVudCIsIiJdLFszLCJsZWZ0IiwicmlnaHQiLCJmb3JtYXQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJnFlKDAsbHEsMSwxLG51bGwsbnVsbCxjcSksaSYyJiZHZShhLnJhbmRvbUZpeGVzKX0sZGVwZW5kZW5jaWVzOltfYyxOZ10sc3R5bGVzOltgW19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO3BhZGRpbmctdG9wOjFyZW19CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIGRxKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJkaXYiLDUpLFMoImNsaWNrIixmdW5jdGlvbigpe2xldCBhPXooZSkuJGltcGxpY2l0LHI9digpO3JldHVybiBUKHIuc2VsZWN0TGluZXMoYS5saW5lTnVtYmVyKSl9KSxtKDEpLHMoKX1pZih0JjIpe2xldCBlPW4uJGltcGxpY2l0O2YoImlkIiwibGluZSIrZS5saW5lTnVtYmVyKSxsKCksQShlLm1hcmtlZD8iXHUyNzA1IjoiXHV7MUY1MzJ9Iil9fXZhciBxQyxHQz14KCgpPT57aygpO0E2KCk7T1MoKTtrKCk7QTYoKTtxQz0oKCk9PntjbGFzcyB0e19jb2RlPSIiO2dldCBjb2RlKCl7cmV0dXJuIHRoaXMuX2NvZGV9c2V0IGNvZGUoZSl7dGhpcy5fY29kZT1lfHwiIn12dWxuTGluZXM7bGluZU1hcmtlcnM7YWRkTGluZT1uZXcgTjtsYW5ncz1bImphdmFzY3JpcHQiLCJ0eXBlc2NyaXB0IiwianNvbiIsInlhbWwiXTtuZ09uSW5pdCgpe3RoaXMubGluZU1hcmtlcnM9dGhpcy5jb2RlLnNwbGl0KGAKYCkubWFwKChlLGkpPT4oe2xpbmVOdW1iZXI6aSsxLG1hcmtlZDohMX0pKX1zZWxlY3RMaW5lcyhlKXtsZXQgaT10aGlzLmxpbmVNYXJrZXJzW2UtMV07aS5tYXJrZWQ9IWkubWFya2VkO2xldCBhPVtdO2ZvcihsZXR7bWFya2VkOnIsbGluZU51bWJlcjpvfW9mIHRoaXMubGluZU1hcmtlcnMpciYmYS5wdXNoKG8pO3RoaXMuYWRkTGluZS5lbWl0KGEpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImFwcC1jb2RlLWFyZWEiXV0saW5wdXRzOntjb2RlOiJjb2RlIix2dWxuTGluZXM6InZ1bG5MaW5lcyJ9LG91dHB1dHM6e2FkZExpbmU6ImFkZExpbmUifSxkZWNsczo2LHZhcnM6Mixjb25zdHM6W1siaWQiLCJjb2RlLWFyZWEiXSxbImlkIiwiY29kZSJdLFsiaWQiLCJlbXBoYXNpemUiXSxbMSwibGluZU1hcmtlciIsMywiaWQiXSxbImxpbmVOdW1iZXJzIiwiIiwzLCJoaWdobGlnaHRBdXRvIiwibGFuZ3VhZ2VzIl0sWzEsImxpbmVNYXJrZXIiLDMsImNsaWNrIiwiaWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsImRpdiIsMCkoMSwicHJlIiwxKSgyLCJkaXYiLDIpLHFlKDMsZHEsMiwyLCJkaXYiLDMsRnQpLHMoKSx1KDUsImNvZGUiLDQpLHMoKSgpKSxpJjImJihsKDMpLEdlKGEubGluZU1hcmtlcnMpLGwoMiksZigiaGlnaGxpZ2h0QXV0byIsYS5jb2RlKSgibGFuZ3VhZ2VzIixhLmxhbmdzKSl9LGRlcGVuZGVuY2llczpbTjAsVW0sam1dLHN0eWxlczpbInByZVtfbmdjb250ZW50LSVDT01QJV0gICBjb2RlLmhsanNbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3cteDphdXRvO3BhZGRpbmc6MWVtfWNvZGUuaGxqc1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzozcHggNXB4fS5obGpzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzAwMH0uaGxqcy1jb21tZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLmhsanMtcXVvdGVbX25nY29udGVudC0lQ09NUCVdLCAuaGxqcy12YXJpYWJsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Z3JlZW59LmhsanMta2V5d29yZFtfbmdjb250ZW50LSVDT01QJV0sIC5obGpzLXNlbGVjdG9yLXRhZ1tfbmdjb250ZW50LSVDT01QJV0sIC5obGpzLWJ1aWx0X2luW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmhsanMtbmFtZVtfbmdjb250ZW50LSVDT01QJV0sIC5obGpzLXRhZ1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzAwZn0uaGxqcy1zdHJpbmdbX25nY29udGVudC0lQ09NUCVdLCAuaGxqcy10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5obGpzLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdLCAuaGxqcy1hdHRyaWJ1dGVbX25nY29udGVudC0lQ09NUCVdLCAuaGxqcy1saXRlcmFsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmhsanMtdGVtcGxhdGUtdGFnW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmhsanMtdGVtcGxhdGUtdmFyaWFibGVbX25nY29udGVudC0lQ09NUCVdLCAuaGxqcy10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmhsanMtYWRkaXRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNhMzE1MTV9LmhsanMtZGVsZXRpb25bX25nY29udGVudC0lQ09NUCVdLCAuaGxqcy1zZWxlY3Rvci1hdHRyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmhsanMtc2VsZWN0b3ItcHNldWRvW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmhsanMtbWV0YVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzJiOTFhZn0uaGxqcy1kb2N0YWdbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmdyYXl9LmhsanMtYXR0cltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmVkfS5obGpzLXN5bWJvbFtfbmdjb250ZW50LSVDT01QJV0sIC5obGpzLWJ1bGxldFtfbmdjb250ZW50LSVDT01QJV0sIC5obGpzLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMwMGIwZTh9LmhsanMtZW1waGFzaXNbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc3R5bGU6aXRhbGljfS5obGpzLXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NzAwfSNlbXBoYXNpemVbX25nY29udGVudC0lQ09NUCVde2Zsb2F0OmxlZnQ7cGFkZGluZzoxZW0gLjVlbX0ubGluZU1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtjdXJzb3I6cG9pbnRlcn0iXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIG1xKHQsbil7aWYodCYxJiYoYygwLCJzcGFuIiwxNCksbSgxKSxiKDIsInRyYW5zbGF0ZSIpLHMoKSxjKDMsIm1hdC1pY29uIiwxNSksbSg0KSxzKCkpLHQmMil7bGV0IGU9digpO2woKSxBKEMoMiwzLCJUQUJfRklORF9JVCIpKSxsKDIpLGYoImNvbG9yIixlLmZpbmRMb2NrQ29sb3IoKSksbCgpLEEoZS5maW5kTG9ja0ljb24oKSl9fWZ1bmN0aW9uIGhxKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJhcHAtY29kZS1hcmVhIiwxNiksUygiYWRkTGluZSIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5hZGRMaW5lKGEpKX0pLHMoKX1pZih0JjIpe2xldCBlPXYoKTtmKCJjb2RlIixlLnNuaXBwZXQ9PW51bGw/bnVsbDplLnNuaXBwZXQuc25pcHBldCkoInZ1bG5MaW5lcyIsZS5zbmlwcGV0PT1udWxsP251bGw6ZS5zbmlwcGV0LnZ1bG5MaW5lcyl9fWZ1bmN0aW9uIHBxKHQsbil7dCYxJiYoYygwLCJwcmUiKSgxLCJjb2RlIiwxNyksbSgyLCJMT0FESU5HX0NPREVfU05JUFBFVCIpLHMoKSgpKX1mdW5jdGlvbiBmcSh0LG4pe2lmKHQmMSYmKGMoMCwic3BhbiIsMTQpLG0oMSksYigyLCJ0cmFuc2xhdGUiKSxzKCksYygzLCJtYXQtaWNvbiIsMTUpLG0oNCkscygpKSx0JjIpe2xldCBlPXYoKTtsKCksQShDKDIsMywiVEFCX0ZJWF9JVCIpKSxsKDIpLGYoImNvbG9yIixlLmZpeExvY2tDb2xvcigpKSxsKCksQShlLmZpeExvY2tJY29uKCkpfX1mdW5jdGlvbiB1cSh0LG4pe2lmKHQmMSYmdSgwLCJhcHAtY29kZS1maXhlcyIsNSksdCYyKXtsZXQgZT12KCk7Zigic25pcHBldCIsZS5zbmlwcGV0PT1udWxsP251bGw6ZS5zbmlwcGV0LnNuaXBwZXQpKCJmaXhlcyIsZS5maXhlcykoInJhbmRvbUZpeGVzIixlLnJhbmRvbUZpeGVzKSgic2VsZWN0ZWRGaXgiLGUuc2VsZWN0ZWRGaXgpfX1mdW5jdGlvbiBncSh0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWNhcmQiLDYpKDEsImRpdiIsMTgpLG0oMikscygpKCkpLHQmMil7bGV0IGU9digpO2woMiksQShlLmhpbnQpfX1mdW5jdGlvbiB2cSh0LG4pe2lmKHQmMSYmKGMoMCwibWF0LWNhcmQiLDE5KSgxLCJkaXYiLDE4KSxtKDIpLHMoKSgpKSx0JjIpe2xldCBlPXYoKTtEdChlLnJlc3VsdENvbG9yKCk9PT0id2FybiI/Indhcm4tbm90aWZpY2F0aW9uIjoiYWNjZW50LW5vdGlmaWNhdGlvbiIpLGwoMiksQShlLmV4cGxhbmF0aW9uKX19ZnVuY3Rpb24gX3EodCxuKXt0JjEmJnUoMCwiZGl2Iiw5KX1mdW5jdGlvbiBicSh0LG4pe2lmKHQmMSYmKGMoMCwib3B0aW9uIiwyMiksbSgxKSxzKCkpLHQmMil7bGV0IGU9bi4kaW5kZXgsaT12KDMpO2YoInZhbHVlIixlKSgic2VsZWN0ZWQiLGkuc2VsZWN0ZWRGaXg9PT1lKSxsKCksRSgiRml4ICIsZSsxLCIgIil9fWZ1bmN0aW9uIENxKHQsbil7aWYodCYxKXtsZXQgZT1MKCk7YygwLCJtYXQtZm9ybS1maWVsZCIsMjApKDEsIm1hdC1sYWJlbCIsMTcpLG0oMiwiTEFCRUxfQ09SUkVDVF9GSVgiKSxzKCksYygzLCJzZWxlY3QiLDIxKSxTKCJjaGFuZ2UiLGZ1bmN0aW9uKGEpe3ooZSk7bGV0IHI9digyKTtyZXR1cm4gVChyLmNoYW5nZUZpeChhKSl9KSxxZSg0LGJxLDIsMywib3B0aW9uIiwyMixGdCkscygpKCl9aWYodCYyKXtsZXQgZT12KDIpO2woNCksR2UoZS5yYW5kb21GaXhlcyl9fWZ1bmN0aW9uIHlxKHQsbil7aWYodCYxJiZNKDAsQ3EsNiwwLCJtYXQtZm9ybS1maWVsZCIsMjApLHQmMil7bGV0IGU9digpO3coZS50YWIudmFsdWU9PT0xPzA6LTEpfX1mdW5jdGlvbiB4cSh0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYnV0dG9uIiwyMyksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5jaGVja0xpbmVzKCkpfSksYygxLCJzcGFuIiksbSgyKSxiKDMsInRyYW5zbGF0ZSIpLHMoKSxjKDQsIm1hdC1pY29uIiwyNCksbSg1KSxzKCkoKX1pZih0JjIpe2xldCBlPXYoKTtmKCJkaXNhYmxlZCIsZS5zb2x2ZWQuZmluZEl0KSxsKDIpLEEoQygzLDQsIkJUTl9TVUJNSVQiKSksbCgyKSxmKCJjb2xvciIsZS5yZXN1bHRDb2xvcigpKSxsKCksRSgiICIsZS5yZXN1bHRJY29uKCksIiAiKX19ZnVuY3Rpb24gTXEodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImJ1dHRvbiIsMjUpLFMoImNsaWNrIixmdW5jdGlvbigpe3ooZSk7bGV0IGE9digpO3JldHVybiBUKGEuY2hlY2tGaXgoKSl9KSxjKDEsInNwYW4iKSxtKDIpLGIoMywidHJhbnNsYXRlIikscygpLGMoNCwibWF0LWljb24iLDI0KSxtKDUpLHMoKSgpfWlmKHQmMil7bGV0IGU9digpO2YoImRpc2FibGVkIixlLnNvbHZlZC5maXhJdCksbCgyKSxBKEMoMyw0LCJCVE5fU1VCTUlUIikpLGwoMiksZigiY29sb3IiLGUucmVzdWx0Q29sb3IoKSksbCgpLEUoIiAiLGUucmVzdWx0SWNvbigpLCIgIil9fXZhciBCMixXQyxRQz14KCgpPT57SEMoKTtSQygpO3dpKCk7d2EoKTtCQygpO2soKTtnaSgpO1dlKCk7bmUoKTtldCgpO0plKCk7aGUoKTtqQygpO3ZlKCk7VygpO0dDKCk7RDgoKTtrKCk7VygpO3ZlKCk7aGUoKTtKZSgpO2V0KCk7V2UoKTtuZSgpO0IyPShmdW5jdGlvbih0KXtyZXR1cm4gdFt0LlVuZGVjaWRlZD0wXT0iVW5kZWNpZGVkIix0W3QuUmlnaHQ9MV09IlJpZ2h0Iix0W3QuV3Jvbmc9Ml09Ildyb25nIix0fSkoQjJ8fHt9KSxXQz0oKCk9PntjbGFzcyB0e2RpYWxvZ0RhdGE9aChVaSk7Y29kZVNuaXBwZXRTZXJ2aWNlPWgoT0MpO3Z1bG5MaW5lc1NlcnZpY2U9aChGQyk7Y29kZUZpeGVzU2VydmljZT1oKE5DKTtjaGFsbGVuZ2VTZXJ2aWNlPWgoU2kpO2Nvb2tpZVNlcnZpY2U9aChadCk7c25pcHBldD1udWxsO2ZpeGVzPW51bGw7c2VsZWN0ZWRMaW5lcztzZWxlY3RlZEZpeD0wO3RhYj1uZXcga2UoMCk7cmVzdWx0PUIyLlVuZGVjaWRlZDtoaW50PW51bGw7ZXhwbGFuYXRpb249bnVsbDtzb2x2ZWQ9e2ZpbmRJdDohMSxmaXhJdDohMX07cmFuZG9tRml4ZXM9W107c25pcHBldExvYWRlZD0hMTtmaXhlc0xvYWRlZD0hMTtpbml0aWFsVGFiU2V0PSExO25nT25Jbml0KCl7dGhpcy5jb2RlU25pcHBldFNlcnZpY2UuZ2V0KHRoaXMuZGlhbG9nRGF0YS5rZXkpLnN1YnNjcmliZSh7bmV4dDplPT57dGhpcy5zbmlwcGV0PWUsdGhpcy5zb2x2ZWQuZmluZEl0PSExLHRoaXMuZGlhbG9nRGF0YS5jb2RpbmdDaGFsbGVuZ2VTdGF0dXM+PTEmJih0aGlzLnJlc3VsdD1CMi5SaWdodCx0aGlzLnNvbHZlZC5maW5kSXQ9ITApLHRoaXMuc25pcHBldExvYWRlZD0hMCx0aGlzLnNldEluaXRpYWxUYWJJZlJlYWR5KCl9LGVycm9yOmU9Pnt0aGlzLnNuaXBwZXQ9e3NuaXBwZXQ6ZS5lcnJvcn0sdGhpcy5zbmlwcGV0TG9hZGVkPSEwLHRoaXMuc2V0SW5pdGlhbFRhYklmUmVhZHkoKX19KSx0aGlzLmNvZGVGaXhlc1NlcnZpY2UuZ2V0KHRoaXMuZGlhbG9nRGF0YS5rZXkpLnN1YnNjcmliZSh7bmV4dDplPT57dGhpcy5maXhlcz1lLmZpeGVzLHRoaXMuZml4ZXMmJnRoaXMuc2h1ZmZsZSgpLHRoaXMuc29sdmVkLmZpeEl0PXRoaXMuZGlhbG9nRGF0YS5jb2RpbmdDaGFsbGVuZ2VTdGF0dXM+PTIsdGhpcy5maXhlc0xvYWRlZD0hMCx0aGlzLnNldEluaXRpYWxUYWJJZlJlYWR5KCl9LGVycm9yOigpPT57dGhpcy5maXhlcz1udWxsLHRoaXMuZml4ZXNMb2FkZWQ9ITAsdGhpcy5zZXRJbml0aWFsVGFiSWZSZWFkeSgpfX0pfWFkZExpbmU9ZT0+e3RoaXMuc2VsZWN0ZWRMaW5lcz1lfTtzZXRGaXg9ZT0+e3RoaXMuc2VsZWN0ZWRGaXg9ZSx0aGlzLmV4cGxhbmF0aW9uPW51bGx9O2NoYW5nZUZpeChlKXt0aGlzLnNldEZpeChwYXJzZUludChlLnRhcmdldC52YWx1ZSwxMCkpfXRvZ2dsZVRhYj1lPT57dGhpcy50YWIuc2V0VmFsdWUoZSksdGhpcy5yZXN1bHQ9QjIuVW5kZWNpZGVkLGU9PT0wJiZ0aGlzLnNvbHZlZC5maW5kSXQmJih0aGlzLnJlc3VsdD1CMi5SaWdodCksZT09PTEmJnRoaXMuc29sdmVkLmZpeEl0JiYodGhpcy5yZXN1bHQ9QjIuUmlnaHQpfTtjaGVja0ZpeD0oKT0+e3RoaXMuY29kZUZpeGVzU2VydmljZS5jaGVjayh0aGlzLmRpYWxvZ0RhdGEua2V5LHRoaXMucmFuZG9tRml4ZXNbdGhpcy5zZWxlY3RlZEZpeF0uaW5kZXgpLnN1YnNjcmliZShlPT57dGhpcy5zZXRWZXJkaWN0KGUudmVyZGljdCksdGhpcy5leHBsYW5hdGlvbj1lLmV4cGxhbmF0aW9ufSl9O2NoZWNrTGluZXM9KCk9Pnt0aGlzLnZ1bG5MaW5lc1NlcnZpY2UuY2hlY2sodGhpcy5kaWFsb2dEYXRhLmtleSx0aGlzLnNlbGVjdGVkTGluZXMpLnN1YnNjcmliZShlPT57dGhpcy5zZXRWZXJkaWN0KGUudmVyZGljdCksdGhpcy5oaW50PWUuaGludH0pfTtmaW5kTG9ja0ljb24oKXtyZXR1cm4gdGhpcy5zb2x2ZWQuZmluZEl0PyJsb2NrX29wZW4iOiJsb2NrIn1maW5kTG9ja0NvbG9yKCl7cmV0dXJuIHRoaXMuc29sdmVkLmZpbmRJdD8iYWNjZW50Ijoid2FybiJ9Zml4TG9ja0ljb24oKXtyZXR1cm4gdGhpcy5maXhlcz09PW51bGw/ImxvY2siOnRoaXMuc29sdmVkLmZpeEl0PyJsb2NrX29wZW4iOiJsb2NrIn1maXhMb2NrQ29sb3IoKXtyZXR1cm4gdGhpcy5maXhlcz09PW51bGw/Indhcm4iOnRoaXMuc29sdmVkLmZpeEl0PyJhY2NlbnQiOiJ3YXJuIn1zaHVmZmxlKCl7dGhpcy5yYW5kb21GaXhlcz10aGlzLmZpeGVzLm1hcCgoZSxpKT0+KHtmaXg6ZSxpbmRleDppLHNvcnQ6TWF0aC5yYW5kb20oKX0pKS5zb3J0KChlLGkpPT5lLnNvcnQtaS5zb3J0KS5tYXAoKHtmaXg6ZSxpbmRleDppfSk9Pih7Zml4OmUsaW5kZXg6aX0pKX1zZXRWZXJkaWN0PWU9Pnt0aGlzLnJlc3VsdCE9PUIyLlJpZ2h0JiYoZT8odGhpcy50YWIudmFsdWU9PT0wPyh0aGlzLnNvbHZlZC5maW5kSXQ9ITAsdGhpcy5jaGFsbGVuZ2VTZXJ2aWNlLmNvbnRpbnVlQ29kZUZpbmRJdCgpLnN1YnNjcmliZSh7bmV4dDppPT57aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJSZWNlaXZlZCBpbnZhbGlkIGNvbnRpbnVlIGNvZGUgZnJvbSB0aGUgc2VydmVyISIpO2xldCBhPW5ldyBEYXRlO2Euc2V0RnVsbFllYXIoYS5nZXRGdWxsWWVhcigpKzEpLHRoaXMuY29va2llU2VydmljZS5wdXQoImNvbnRpbnVlQ29kZUZpbmRJdCIsaSx7ZXhwaXJlczphfSl9LGVycm9yOmk9Pntjb25zb2xlLmxvZyhpKX19KSk6KHRoaXMuc29sdmVkLmZpeEl0PSEwLHRoaXMuY2hhbGxlbmdlU2VydmljZS5jb250aW51ZUNvZGVGaXhJdCgpLnN1YnNjcmliZSh7bmV4dDppPT57aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJSZWNlaXZlZCBpbnZhbGlkIGNvbnRpbnVlIGNvZGUgZnJvbSB0aGUgc2VydmVyISIpO2xldCBhPW5ldyBEYXRlO2Euc2V0RnVsbFllYXIoYS5nZXRGdWxsWWVhcigpKzEpLHRoaXMuY29va2llU2VydmljZS5wdXQoImNvbnRpbnVlQ29kZUZpeEl0IixpLHtleHBpcmVzOmF9KX0sZXJyb3I6aT0+e2NvbnNvbGUubG9nKGkpfX0pKSx0aGlzLnJlc3VsdD1CMi5SaWdodCxpbXBvcnQoIi4vY29uZmV0dGktNU5XNjdVR1kuanMiKS50aGVuKGk9PntpLnNob290Q29uZmV0dGkoKX0pLnRoZW4oKCk9Pnt0aGlzLnRhYi52YWx1ZT09PTAmJnRoaXMuZml4ZXMhPT1udWxsJiZ0aGlzLnRvZ2dsZVRhYigxKX0pKTp0aGlzLnJlc3VsdD1CMi5Xcm9uZyl9O3Jlc3VsdEljb24oKXtzd2l0Y2godGhpcy5yZXN1bHQpe2Nhc2UgQjIuUmlnaHQ6cmV0dXJuImNoZWNrIjtjYXNlIEIyLldyb25nOnJldHVybiJjbGVhciI7ZGVmYXVsdDpyZXR1cm4ic2VuZCJ9fXJlc3VsdENvbG9yKCl7c3dpdGNoKHRoaXMucmVzdWx0SWNvbigpKXtjYXNlImNoZWNrIjpyZXR1cm4iYWNjZW50IjtjYXNlImNsZWFyIjpyZXR1cm4id2FybiJ9fXNldEluaXRpYWxUYWJJZlJlYWR5KCl7aWYodGhpcy5pbml0aWFsVGFiU2V0fHwhdGhpcy5zbmlwcGV0TG9hZGVkfHwhdGhpcy5maXhlc0xvYWRlZClyZXR1cm47bGV0IGU9dGhpcy5kaWFsb2dEYXRhLmNvZGluZ0NoYWxsZW5nZVN0YXR1cyxpPTA7ZT49Mj9pPTA6ZT49MSYmdGhpcy5maXhlcyE9PW51bGw/aT0xOmk9MCx0aGlzLnRhYi5zZXRWYWx1ZShpKSx0aGlzLnRvZ2dsZVRhYihpKSx0aGlzLmluaXRpYWxUYWJTZXQ9ITB9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siY29kZS1zbmlwcGV0Il1dLGhvc3RBdHRyczpbMSwiY29kZS1zbmlwcGV0Il0sZGVjbHM6MjcsdmFyczoxNyxjb25zdHM6W1sibWF0LWRpYWxvZy10aXRsZSIsIiJdLFsibWF0LXN0cmV0Y2gtdGFicyIsIiIsMywic2VsZWN0ZWRJbmRleENoYW5nZSIsInNlbGVjdGVkSW5kZXgiXSxbIm1hdC10YWItbGFiZWwiLCIiXSxbMywiY29kZSIsInZ1bG5MaW5lcyJdLFszLCJkaXNhYmxlZCJdLFszLCJzbmlwcGV0IiwiZml4ZXMiLCJyYW5kb21GaXhlcyIsInNlbGVjdGVkRml4Il0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDEsInByaW1hcnktbm90aWZpY2F0aW9uIl0sWyJhcHBlYXJhbmNlIiwib3V0bGluZWQiLDMsImNsYXNzIl0sWzEsImJ1dHRvbi1yb3ciXSxbMSwidGFiLXBsYWNlaG9sZGVyIl0sWzEsImJ1dHRvbi1ncm91cCJdLFsibWF0LXN0cm9rZWQtYnV0dG9uIiwiIiwibWF0LWRpYWxvZy1jbG9zZSIsIiIsImFyaWEtbGFiZWwiLCJDbG9zZSBEaWFsb2ciLCJpZCIsImZpbmRJdENsb3NlQnV0dG9uIiwxLCJjbG9zZS1kaWFsb2ciLCJidXR0b25zIiwzLCJtYXQtZGlhbG9nLWNsb3NlIl0sWyJtYXQtc3Ryb2tlZC1idXR0b24iLCIiLCJpZCIsImZpbmRJdFN1Ym1pdEJ1dHRvbiIsMywiZGlzYWJsZWQiXSxbIm1hdC1zdHJva2VkLWJ1dHRvbiIsIiIsImlkIiwiZml4SXRTdWJtaXRCdXR0b24iLDMsImRpc2FibGVkIl0sWzEsInRhYi1oZWFkZXItdGV4dCJdLFsxLCJtYXRlcmFpYWwtaWNvbnMtb3V0bGluZWQiLDMsImNvbG9yIl0sWzMsImFkZExpbmUiLCJjb2RlIiwidnVsbkxpbmVzIl0sWyJ0cmFuc2xhdGUiLCIiXSxbMSwibWRjLWNhcmQiXSxbImFwcGVhcmFuY2UiLCJvdXRsaW5lZCJdLFsiYXBwZWFyYW5jZSIsImZpbGwiXSxbIm1hdE5hdGl2ZUNvbnRyb2wiLCIiLDMsImNoYW5nZSJdLFszLCJ2YWx1ZSIsInNlbGVjdGVkIl0sWyJtYXQtc3Ryb2tlZC1idXR0b24iLCIiLCJpZCIsImZpbmRJdFN1Ym1pdEJ1dHRvbiIsMywiY2xpY2siLCJkaXNhYmxlZCJdLFszLCJjb2xvciJdLFsibWF0LXN0cm9rZWQtYnV0dG9uIiwiIiwiaWQiLCJmaXhJdFN1Ym1pdEJ1dHRvbiIsMywiY2xpY2siLCJkaXNhYmxlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwiaDIiLDApLG0oMSksYigyLCJ0cmFuc2xhdGUiKSxzKCksYygzLCJtYXQtZGlhbG9nLWNvbnRlbnQiKSg0LCJtYXQtdGFiLWdyb3VwIiwxKSxTKCJzZWxlY3RlZEluZGV4Q2hhbmdlIixmdW5jdGlvbihvKXtyZXR1cm4gYS50b2dnbGVUYWIobyl9KSxjKDUsIm1hdC10YWIiKSxSKDYsbXEsNSw1LCJuZy10ZW1wbGF0ZSIsMiksTSg3LGhxLDEsMiwiYXBwLWNvZGUtYXJlYSIsMykoOCxwcSwzLDAsInByZSIpLHMoKSxjKDksIm1hdC10YWIiLDQpLFIoMTAsZnEsNSw1LCJuZy10ZW1wbGF0ZSIsMiksTSgxMSx1cSwxLDQsImFwcC1jb2RlLWZpeGVzIiw1KSxzKCkoKSgpLGMoMTIsIm1hdC1kaWFsb2ctYWN0aW9ucyIpLE0oMTMsZ3EsMywxLCJtYXQtY2FyZCIsNiksTSgxNCx2cSwzLDMsIm1hdC1jYXJkIiw3KSxjKDE1LCJkaXYiLDgpLE0oMTYsX3EsMSwwLCJkaXYiLDkpKDE3LHlxLDEsMSksYygxOCwiZGl2IiwxMCkoMTksImJ1dHRvbiIsMTEpKDIwLCJtYXQtaWNvbiIpLG0oMjEsImNsb3NlIikscygpLGMoMjIsInNwYW4iKSxtKDIzKSxiKDI0LCJ0cmFuc2xhdGUiKSxzKCkoKSxNKDI1LHhxLDYsNiwiYnV0dG9uIiwxMiksTSgyNixNcSw2LDYsImJ1dHRvbiIsMTMpLHMoKSgpKCkpLGkmMiYmKGwoKSxPMSgiIixDKDIsMTMsIlRJVExFX0NPRElOR19DSEFMTEVOR0UiKSwiOiAiLGEuZGlhbG9nRGF0YS5uYW1lKSxsKDMpLGYoInNlbGVjdGVkSW5kZXgiLGEudGFiLnZhbHVlKSxsKDMpLHcoYS5zbmlwcGV0IT09bnVsbD83OjgpLGwoMiksZigiZGlzYWJsZWQiLGEuZml4ZXM9PT1udWxsfHwhYS5zb2x2ZWQuZmluZEl0KSxsKDIpLHcoYS5zbmlwcGV0IT09bnVsbCYmYS5maXhlcyE9PW51bGw/MTE6LTEpLGwoMiksdyhhLmhpbnQmJmEudGFiLnZhbHVlPT09MD8xMzotMSksbCgpLHcoYS5leHBsYW5hdGlvbiYmYS50YWIudmFsdWU9PT0xPzE0Oi0xKSxsKDIpLHcoYS50YWIudmFsdWU9PT0wPzE2OjE3KSxsKDMpLGYoIm1hdC1kaWFsb2ctY2xvc2UiLGEuc29sdmVkKSxsKDQpLEEoQygyNCwxNSwiQlROX0NMT1NFIikpLGwoMiksdyhhLnRhYi52YWx1ZT09PTA/MjU6LTEpLGwoKSx3KGEudGFiLnZhbHVlPT09MT8yNjotMSkpfSxkZXBlbmRlbmNpZXM6W280LHQyLER1LEE4LHFDLFksU2UsRTgsZ2UsQ2UsVUMsaTIsZGUscGUsUWUsWmUsaHQsJGUsbnQsYXQsRDAsSTAsb2UsbGUsUGksS10sc3R5bGVzOltgW19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO3dpZHRoOjY1ZW19LnRhYi1oZWFkZXItdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtdGV4dCl9bWF0LWRpYWxvZy1hY3Rpb25zW19uZ2NvbnRlbnQtJUNPTVAlXXstLW1hdC1kaWFsb2ctYWN0aW9ucy1wYWRkaW5nOiAkc3BhY2UtbWwgJHNwYWNlLWw7ZGlzcGxheTpncmlkO2dhcDoxcmVtO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnJ9LmJ1dHRvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmJ1dHRvbi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtnYXA6LjVyZW07anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS50YWItcGxhY2Vob2xkZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDo3OC4yNXB4fQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgWUMsWkM9eCgoKT0+e050KCk7aygpO1d0KCk7bHQoKTtrKCk7WUM9KCgpPT57Y2xhc3MgdHtodHRwPWgoQWUpO2hvc3RTZXJ2ZXI9dWUuaG9zdFNlcnZlcjtob3N0PXRoaXMuaG9zdFNlcnZlcisiL2FwaS9IaW50cyI7Z2V0QWxsKCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5ob3N0KyIvIikucGlwZShxKGU9PmUuZGF0YSksaihlPT57dGhyb3cgZX0pKX1wdXQoZSxpKXtyZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLmhvc3R9LyR7ZX1gLGkpLnBpcGUocShhPT5hLmRhdGEpLGooYT0+e3Rocm93IGF9KSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1cHJvdj0kKHt0b2tlbjp0LGZhY3Rvcnk6dC5cdTAyNzVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiAkQyh0LG4pe3JldHVybiB0LmZpbHRlcihlPT5uLmNhdGVnb3JpZXMubGVuZ3RoPT09MD8hMDpuLmNhdGVnb3JpZXMuaW5jbHVkZXMoZS5jYXRlZ29yeSkpLmZpbHRlcihlPT5uLmRpZmZpY3VsdGllcy5sZW5ndGg9PT0wPyEwOm4uZGlmZmljdWx0aWVzLmluY2x1ZGVzKGUuZGlmZmljdWx0eSkpLmZpbHRlcihlPT5uLnRhZ3MubGVuZ3RoPT09MD8hMDplLnRhZ0xpc3Quc29tZShpPT5uLnRhZ3MuaW5jbHVkZXMoaSkpKS5maWx0ZXIoZT0+bi5zdGF0dXM9PT1udWxsPyEwOm4uc3RhdHVzPT09d3EoZSkpLmZpbHRlcihlPT5lLmRpc2FibGVkRW52PT09bnVsbD8hMDpuLnNob3dEaXNhYmxlZENoYWxsZW5nZXMpLmZpbHRlcihlPT5uLnNlYXJjaFF1ZXJ5PT09bnVsbD8hMDplLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuLnNlYXJjaFF1ZXJ5LnRvTG93ZXJDYXNlKCkpfHxlLm9yaWdpbmFsRGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhuLnNlYXJjaFF1ZXJ5LnRvTG93ZXJDYXNlKCkpKS5maWx0ZXIoZT0+e2lmKCFuLnJlc3RyaWN0VG9UdXRvcmlhbENoYWxsZW5nZXNGaXJzdClyZXR1cm4hMDtsZXQgaT10LmZpbHRlcihkPT5kLnR1dG9yaWFsT3JkZXIhPT1udWxsKSxhPWkuZXZlcnkoZD0+ZC5zb2x2ZWQpO2lmKGEpcmV0dXJuITA7aWYoIWEmJmUudHV0b3JpYWxPcmRlcj09PW51bGwpcmV0dXJuITE7bGV0IHI9aS5maWx0ZXIoZD0+IWQuc29sdmVkKS5tYXAoZD0+ZC5kaWZmaWN1bHR5KSxvPU1hdGgubWluKC4uLnIpO3JldHVybiBlLmRpZmZpY3VsdHk8PW99KX1mdW5jdGlvbiB3cSh0KXtyZXR1cm4gdC5zb2x2ZWQ/dC5oYXNDb2RpbmdDaGFsbGVuZ2U/dC5jb2RpbmdDaGFsbGVuZ2VTdGF0dXM9PT0yPyJzb2x2ZWQiOiJwYXJ0aWFsbHktc29sdmVkIjp0LnNvbHZlZD8ic29sdmVkIjoidW5zb2x2ZWQiOiJ1bnNvbHZlZCJ9dmFyIEtDPXgoKCk9Pnt9KTtmdW5jdGlvbiBTcSh0LG4pe2Zvcih2YXIgZT0tMSxpPW4ubGVuZ3RoLGE9dC5sZW5ndGg7KytlPGk7KXRbYStlXT1uW2VdO3JldHVybiB0fXZhciBPcyxqNz14KCgpPT57T3M9U3F9KTt2YXIga3EsSHMscTc9eCgoKT0+e2txPXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxIcz1rcX0pO3ZhciB6cSxUcSxtaSxkYT14KCgpPT57cTcoKTt6cT10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLFRxPUhzfHx6cXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxtaT1UcX0pO3ZhciBFcSxPaSxFbz14KCgpPT57ZGEoKTtFcT1taS5TeW1ib2wsT2k9RXF9KTtmdW5jdGlvbiBJcSh0KXt2YXIgbj1BcS5jYWxsKHQsZTApLGU9dFtlMF07dHJ5e3RbZTBdPXZvaWQgMDt2YXIgaT0hMH1jYXRjaHt9dmFyIGE9RHEuY2FsbCh0KTtyZXR1cm4gaSYmKG4/dFtlMF09ZTpkZWxldGUgdFtlMF0pLGF9dmFyIFhDLEFxLERxLGUwLEpDLGV5PXgoKCk9PntFbygpO1hDPU9iamVjdC5wcm90b3R5cGUsQXE9WEMuaGFzT3duUHJvcGVydHksRHE9WEMudG9TdHJpbmcsZTA9T2k/T2kudG9TdHJpbmdUYWc6dm9pZCAwO0pDPUlxfSk7ZnVuY3Rpb24gVnEodCl7cmV0dXJuIFBxLmNhbGwodCl9dmFyIExxLFBxLHR5LGl5PXgoKCk9PntMcT1PYmplY3QucHJvdG90eXBlLFBxPUxxLnRvU3RyaW5nO3R5PVZxfSk7ZnVuY3Rpb24gTnEodCl7cmV0dXJuIHQ9PW51bGw/dD09PXZvaWQgMD9IcTpPcTpheSYmYXkgaW4gT2JqZWN0KHQpP0pDKHQpOnR5KHQpfXZhciBPcSxIcSxheSxVMixBbz14KCgpPT57RW8oKTtleSgpO2l5KCk7T3E9IltvYmplY3QgTnVsbF0iLEhxPSJbb2JqZWN0IFVuZGVmaW5lZF0iLGF5PU9pP09pLnRvU3RyaW5nVGFnOnZvaWQgMDtVMj1OcX0pO2Z1bmN0aW9uIFJxKHQpe3JldHVybiB0IT1udWxsJiZ0eXBlb2YgdD09Im9iamVjdCJ9dmFyIGoyLERvPXgoKCk9PntqMj1ScX0pO2Z1bmN0aW9uIEJxKHQpe3JldHVybiBqMih0KSYmVTIodCk9PUZxfXZhciBGcSxHNyxueT14KCgpPT57QW8oKTtEbygpO0ZxPSJbb2JqZWN0IEFyZ3VtZW50c10iO0c3PUJxfSk7dmFyIHJ5LFVxLGpxLHFxLElvLE5zPXgoKCk9PntueSgpO0RvKCk7cnk9T2JqZWN0LnByb3RvdHlwZSxVcT1yeS5oYXNPd25Qcm9wZXJ0eSxqcT1yeS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxxcT1HNygoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSkoKSk/Rzc6ZnVuY3Rpb24odCl7cmV0dXJuIGoyKHQpJiZVcS5jYWxsKHQsImNhbGxlZSIpJiYhanEuY2FsbCh0LCJjYWxsZWUiKX0sSW89cXF9KTt2YXIgR3EsVjEscTI9eCgoKT0+e0dxPUFycmF5LmlzQXJyYXksVjE9R3F9KTtmdW5jdGlvbiBXcSh0KXtyZXR1cm4gVjEodCl8fElvKHQpfHwhIShveSYmdCYmdFtveV0pfXZhciBveSxjeSxzeT14KCgpPT57RW8oKTtOcygpO3EyKCk7b3k9T2k/T2kuaXNDb25jYXRTcHJlYWRhYmxlOnZvaWQgMDtjeT1XcX0pO2Z1bmN0aW9uIGx5KHQsbixlLGksYSl7dmFyIHI9LTEsbz10Lmxlbmd0aDtmb3IoZXx8KGU9Y3kpLGF8fChhPVtdKTsrK3I8bzspe3ZhciBkPXRbcl07bj4wJiZlKGQpP24+MT9seShkLG4tMSxlLGksYSk6T3MoYSxkKTppfHwoYVthLmxlbmd0aF09ZCl9cmV0dXJuIGF9dmFyIGR5LG15PXgoKCk9PntqNygpO3N5KCk7ZHk9bHl9KTtmdW5jdGlvbiBRcSh0LG4pe2Zvcih2YXIgZT0tMSxpPXQ9PW51bGw/MDp0Lmxlbmd0aCxhPUFycmF5KGkpOysrZTxpOylhW2VdPW4odFtlXSxlLHQpO3JldHVybiBhfXZhciBMbyxXNz14KCgpPT57TG89UXF9KTtmdW5jdGlvbiBacSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxqMih0KSYmVTIodCk9PVlxfXZhciBZcSxMYSx0MD14KCgpPT57QW8oKTtEbygpO1lxPSJbb2JqZWN0IFN5bWJvbF0iO0xhPVpxfSk7ZnVuY3Rpb24gWHEodCxuKXtpZihWMSh0KSlyZXR1cm4hMTt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09Im51bWJlciJ8fGU9PSJzeW1ib2wifHxlPT0iYm9vbGVhbiJ8fHQ9PW51bGx8fExhKHQpPyEwOktxLnRlc3QodCl8fCEkcS50ZXN0KHQpfHxuIT1udWxsJiZ0IGluIE9iamVjdChuKX12YXIgJHEsS3EsUG8sUnM9eCgoKT0+e3EyKCk7dDAoKTskcT0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxLcT0vXlx3KiQvO1BvPVhxfSk7ZnVuY3Rpb24gSnEodCl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuIHQhPW51bGwmJihuPT0ib2JqZWN0Inx8bj09ImZ1bmN0aW9uIil9dmFyIHVuLGkwPXgoKCk9Pnt1bj1KcX0pO2Z1bmN0aW9uIG5HKHQpe2lmKCF1bih0KSlyZXR1cm4hMTt2YXIgbj1VMih0KTtyZXR1cm4gbj09dEd8fG49PWlHfHxuPT1lR3x8bj09YUd9dmFyIGVHLHRHLGlHLGFHLEZzLFE3PXgoKCk9PntBbygpO2kwKCk7ZUc9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHRHPSJbb2JqZWN0IEZ1bmN0aW9uXSIsaUc9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixhRz0iW29iamVjdCBQcm94eV0iO0ZzPW5HfSk7dmFyIHJHLEJzLGh5PXgoKCk9PntkYSgpO3JHPW1pWyJfX2NvcmUtanNfc2hhcmVkX18iXSxCcz1yR30pO2Z1bmN0aW9uIG9HKHQpe3JldHVybiEhcHkmJnB5IGluIHR9dmFyIHB5LGZ5LHV5PXgoKCk9PntoeSgpO3B5PShmdW5jdGlvbigpe3ZhciB0PS9bXi5dKyQvLmV4ZWMoQnMmJkJzLmtleXMmJkJzLmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdD8iU3ltYm9sKHNyYylfMS4iK3Q6IiJ9KSgpO2Z5PW9HfSk7ZnVuY3Rpb24gbEcodCl7aWYodCE9bnVsbCl7dHJ5e3JldHVybiBzRy5jYWxsKHQpfWNhdGNoe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2h7fX1yZXR1cm4iIn12YXIgY0csc0csUGEsWTc9eCgoKT0+e2NHPUZ1bmN0aW9uLnByb3RvdHlwZSxzRz1jRy50b1N0cmluZztQYT1sR30pO2Z1bmN0aW9uIHZHKHQpe2lmKCF1bih0KXx8ZnkodCkpcmV0dXJuITE7dmFyIG49RnModCk/Z0c6bUc7cmV0dXJuIG4udGVzdChQYSh0KSl9dmFyIGRHLG1HLGhHLHBHLGZHLHVHLGdHLGd5LHZ5PXgoKCk9PntRNygpO3V5KCk7aTAoKTtZNygpO2RHPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxtRz0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxoRz1GdW5jdGlvbi5wcm90b3R5cGUscEc9T2JqZWN0LnByb3RvdHlwZSxmRz1oRy50b1N0cmluZyx1Rz1wRy5oYXNPd25Qcm9wZXJ0eSxnRz1SZWdFeHAoIl4iK2ZHLmNhbGwodUcpLnJlcGxhY2UoZEcsIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7Z3k9dkd9KTtmdW5jdGlvbiBfRyh0LG4pe3JldHVybiB0Py5bbl19dmFyIF95LGJ5PXgoKCk9PntfeT1fR30pO2Z1bmN0aW9uIGJHKHQsbil7dmFyIGU9X3kodCxuKTtyZXR1cm4gZ3koZSk/ZTp2b2lkIDB9dmFyIFFpLGduPXgoKCk9Pnt2eSgpO2J5KCk7UWk9Ykd9KTt2YXIgQ0csVmEsYTA9eCgoKT0+e2duKCk7Q0c9UWkoT2JqZWN0LCJjcmVhdGUiKSxWYT1DR30pO2Z1bmN0aW9uIHlHKCl7dGhpcy5fX2RhdGFfXz1WYT9WYShudWxsKTp7fSx0aGlzLnNpemU9MH12YXIgQ3kseXk9eCgoKT0+e2EwKCk7Q3k9eUd9KTtmdW5jdGlvbiB4Ryh0KXt2YXIgbj10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09bj8xOjAsbn12YXIgeHksTXk9eCgoKT0+e3h5PXhHfSk7ZnVuY3Rpb24ga0codCl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihWYSl7dmFyIGU9blt0XTtyZXR1cm4gZT09PU1HP3ZvaWQgMDplfXJldHVybiBTRy5jYWxsKG4sdCk/blt0XTp2b2lkIDB9dmFyIE1HLHdHLFNHLHd5LFN5PXgoKCk9PnthMCgpO01HPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIix3Rz1PYmplY3QucHJvdG90eXBlLFNHPXdHLmhhc093blByb3BlcnR5O3d5PWtHfSk7ZnVuY3Rpb24gRUcodCl7dmFyIG49dGhpcy5fX2RhdGFfXztyZXR1cm4gVmE/blt0XSE9PXZvaWQgMDpURy5jYWxsKG4sdCl9dmFyIHpHLFRHLGt5LHp5PXgoKCk9PnthMCgpO3pHPU9iamVjdC5wcm90b3R5cGUsVEc9ekcuaGFzT3duUHJvcGVydHk7a3k9RUd9KTtmdW5jdGlvbiBERyh0LG4pe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLGVbdF09VmEmJm49PT12b2lkIDA/QUc6bix0aGlzfXZhciBBRyxUeSxFeT14KCgpPT57YTAoKTtBRz0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7VHk9REd9KTtmdW5jdGlvbiBWbyh0KXt2YXIgbj0tMSxlPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrbjxlOyl7dmFyIGk9dFtuXTt0aGlzLnNldChpWzBdLGlbMV0pfX12YXIgWjcsQXk9eCgoKT0+e3l5KCk7TXkoKTtTeSgpO3p5KCk7RXkoKTtWby5wcm90b3R5cGUuY2xlYXI9Q3k7Vm8ucHJvdG90eXBlLmRlbGV0ZT14eTtWby5wcm90b3R5cGUuZ2V0PXd5O1ZvLnByb3RvdHlwZS5oYXM9a3k7Vm8ucHJvdG90eXBlLnNldD1UeTtaNz1Wb30pO2Z1bmN0aW9uIElHKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH12YXIgRHksSXk9eCgoKT0+e0R5PUlHfSk7ZnVuY3Rpb24gTEcodCxuKXtyZXR1cm4gdD09PW58fHQhPT10JiZuIT09bn12YXIgT28sVXM9eCgoKT0+e09vPUxHfSk7ZnVuY3Rpb24gUEcodCxuKXtmb3IodmFyIGU9dC5sZW5ndGg7ZS0tOylpZihPbyh0W2VdWzBdLG4pKXJldHVybiBlO3JldHVybi0xfXZhciB2bixuMD14KCgpPT57VXMoKTt2bj1QR30pO2Z1bmN0aW9uIEhHKHQpe3ZhciBuPXRoaXMuX19kYXRhX18sZT12bihuLHQpO2lmKGU8MClyZXR1cm4hMTt2YXIgaT1uLmxlbmd0aC0xO3JldHVybiBlPT1pP24ucG9wKCk6T0cuY2FsbChuLGUsMSksLS10aGlzLnNpemUsITB9dmFyIFZHLE9HLEx5LFB5PXgoKCk9PntuMCgpO1ZHPUFycmF5LnByb3RvdHlwZSxPRz1WRy5zcGxpY2U7THk9SEd9KTtmdW5jdGlvbiBORyh0KXt2YXIgbj10aGlzLl9fZGF0YV9fLGU9dm4obix0KTtyZXR1cm4gZTwwP3ZvaWQgMDpuW2VdWzFdfXZhciBWeSxPeT14KCgpPT57bjAoKTtWeT1OR30pO2Z1bmN0aW9uIFJHKHQpe3JldHVybiB2bih0aGlzLl9fZGF0YV9fLHQpPi0xfXZhciBIeSxOeT14KCgpPT57bjAoKTtIeT1SR30pO2Z1bmN0aW9uIEZHKHQsbil7dmFyIGU9dGhpcy5fX2RhdGFfXyxpPXZuKGUsdCk7cmV0dXJuIGk8MD8oKyt0aGlzLnNpemUsZS5wdXNoKFt0LG5dKSk6ZVtpXVsxXT1uLHRoaXN9dmFyIFJ5LEZ5PXgoKCk9PntuMCgpO1J5PUZHfSk7ZnVuY3Rpb24gSG8odCl7dmFyIG49LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK248ZTspe3ZhciBpPXRbbl07dGhpcy5zZXQoaVswXSxpWzFdKX19dmFyIF9uLHIwPXgoKCk9PntJeSgpO1B5KCk7T3koKTtOeSgpO0Z5KCk7SG8ucHJvdG90eXBlLmNsZWFyPUR5O0hvLnByb3RvdHlwZS5kZWxldGU9THk7SG8ucHJvdG90eXBlLmdldD1WeTtIby5wcm90b3R5cGUuaGFzPUh5O0hvLnByb3RvdHlwZS5zZXQ9Unk7X249SG99KTt2YXIgQkcsYm4sanM9eCgoKT0+e2duKCk7ZGEoKTtCRz1RaShtaSwiTWFwIiksYm49Qkd9KTtmdW5jdGlvbiBVRygpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IFo3LG1hcDpuZXcoYm58fF9uKSxzdHJpbmc6bmV3IFo3fX12YXIgQnksVXk9eCgoKT0+e0F5KCk7cjAoKTtqcygpO0J5PVVHfSk7ZnVuY3Rpb24gakcodCl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuIG49PSJzdHJpbmcifHxuPT0ibnVtYmVyInx8bj09InN5bWJvbCJ8fG49PSJib29sZWFuIj90IT09Il9fcHJvdG9fXyI6dD09PW51bGx9dmFyIGp5LHF5PXgoKCk9PntqeT1qR30pO2Z1bmN0aW9uIHFHKHQsbil7dmFyIGU9dC5fX2RhdGFfXztyZXR1cm4gankobik/ZVt0eXBlb2Ygbj09InN0cmluZyI/InN0cmluZyI6Imhhc2giXTplLm1hcH12YXIgQ24sbzA9eCgoKT0+e3F5KCk7Q249cUd9KTtmdW5jdGlvbiBHRyh0KXt2YXIgbj1Dbih0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1uPzE6MCxufXZhciBHeSxXeT14KCgpPT57bzAoKTtHeT1HR30pO2Z1bmN0aW9uIFdHKHQpe3JldHVybiBDbih0aGlzLHQpLmdldCh0KX12YXIgUXksWXk9eCgoKT0+e28wKCk7UXk9V0d9KTtmdW5jdGlvbiBRRyh0KXtyZXR1cm4gQ24odGhpcyx0KS5oYXModCl9dmFyIFp5LCR5PXgoKCk9PntvMCgpO1p5PVFHfSk7ZnVuY3Rpb24gWUcodCxuKXt2YXIgZT1Dbih0aGlzLHQpLGk9ZS5zaXplO3JldHVybiBlLnNldCh0LG4pLHRoaXMuc2l6ZSs9ZS5zaXplPT1pPzA6MSx0aGlzfXZhciBLeSxYeT14KCgpPT57bzAoKTtLeT1ZR30pO2Z1bmN0aW9uIE5vKHQpe3ZhciBuPS0xLGU9dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytuPGU7KXt2YXIgaT10W25dO3RoaXMuc2V0KGlbMF0saVsxXSl9fXZhciBzcixxcz14KCgpPT57VXkoKTtXeSgpO1l5KCk7JHkoKTtYeSgpO05vLnByb3RvdHlwZS5jbGVhcj1CeTtOby5wcm90b3R5cGUuZGVsZXRlPUd5O05vLnByb3RvdHlwZS5nZXQ9UXk7Tm8ucHJvdG90eXBlLmhhcz1aeTtOby5wcm90b3R5cGUuc2V0PUt5O3NyPU5vfSk7ZnVuY3Rpb24gJDcodCxuKXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uInx8biE9bnVsbCYmdHlwZW9mIG4hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihaRyk7dmFyIGU9ZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHMsYT1uP24uYXBwbHkodGhpcyxpKTppWzBdLHI9ZS5jYWNoZTtpZihyLmhhcyhhKSlyZXR1cm4gci5nZXQoYSk7dmFyIG89dC5hcHBseSh0aGlzLGkpO3JldHVybiBlLmNhY2hlPXIuc2V0KGEsbyl8fHIsb307cmV0dXJuIGUuY2FjaGU9bmV3KCQ3LkNhY2hlfHxzciksZX12YXIgWkcsSnksZXg9eCgoKT0+e3FzKCk7Wkc9IkV4cGVjdGVkIGEgZnVuY3Rpb24iOyQ3LkNhY2hlPXNyO0p5PSQ3fSk7ZnVuY3Rpb24gS0codCl7dmFyIG49SnkodCxmdW5jdGlvbihpKXtyZXR1cm4gZS5zaXplPT09JEcmJmUuY2xlYXIoKSxpfSksZT1uLmNhY2hlO3JldHVybiBufXZhciAkRyx0eCxpeD14KCgpPT57ZXgoKTskRz01MDA7dHg9S0d9KTt2YXIgWEcsSkcsZVcsYXgsbng9eCgoKT0+e2l4KCk7WEc9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csSkc9L1xcKFxcKT8vZyxlVz10eChmdW5jdGlvbih0KXt2YXIgbj1bXTtyZXR1cm4gdC5jaGFyQ29kZUF0KDApPT09NDYmJm4ucHVzaCgiIiksdC5yZXBsYWNlKFhHLGZ1bmN0aW9uKGUsaSxhLHIpe24ucHVzaChhP3IucmVwbGFjZShKRywiJDEiKTppfHxlKX0pLG59KSxheD1lV30pO2Z1bmN0aW9uIGN4KHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdDtpZihWMSh0KSlyZXR1cm4gTG8odCxjeCkrIiI7aWYoTGEodCkpcmV0dXJuIG94P294LmNhbGwodCk6IiI7dmFyIG49dCsiIjtyZXR1cm4gbj09IjAiJiYxL3Q9PS10Vz8iLTAiOm59dmFyIHRXLHJ4LG94LHN4LGx4PXgoKCk9PntFbygpO1c3KCk7cTIoKTt0MCgpO3RXPTEvMCxyeD1PaT9PaS5wcm90b3R5cGU6dm9pZCAwLG94PXJ4P3J4LnRvU3RyaW5nOnZvaWQgMDtzeD1jeH0pO2Z1bmN0aW9uIGlXKHQpe3JldHVybiB0PT1udWxsPyIiOnN4KHQpfXZhciBkeCxteD14KCgpPT57bHgoKTtkeD1pV30pO2Z1bmN0aW9uIGFXKHQsbil7cmV0dXJuIFYxKHQpP3Q6UG8odCxuKT9bdF06YXgoZHgodCkpfXZhciBHcyxLNz14KCgpPT57cTIoKTtScygpO254KCk7bXgoKTtHcz1hV30pO2Z1bmN0aW9uIHJXKHQpe2lmKHR5cGVvZiB0PT0ic3RyaW5nInx8TGEodCkpcmV0dXJuIHQ7dmFyIG49dCsiIjtyZXR1cm4gbj09IjAiJiYxL3Q9PS1uVz8iLTAiOm59dmFyIG5XLHluLGMwPXgoKCk9Pnt0MCgpO25XPTEvMDt5bj1yV30pO2Z1bmN0aW9uIG9XKHQsbil7bj1HcyhuLHQpO2Zvcih2YXIgZT0wLGk9bi5sZW5ndGg7dCE9bnVsbCYmZTxpOyl0PXRbeW4obltlKytdKV07cmV0dXJuIGUmJmU9PWk/dDp2b2lkIDB9dmFyIFJvLFdzPXgoKCk9PntLNygpO2MwKCk7Um89b1d9KTtmdW5jdGlvbiBjVygpe3RoaXMuX19kYXRhX189bmV3IF9uLHRoaXMuc2l6ZT0wfXZhciBoeCxweD14KCgpPT57cjAoKTtoeD1jV30pO2Z1bmN0aW9uIHNXKHQpe3ZhciBuPXRoaXMuX19kYXRhX18sZT1uLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPW4uc2l6ZSxlfXZhciBmeCx1eD14KCgpPT57Zng9c1d9KTtmdW5jdGlvbiBsVyh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9dmFyIGd4LHZ4PXgoKCk9PntneD1sV30pO2Z1bmN0aW9uIGRXKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX12YXIgX3gsYng9eCgoKT0+e194PWRXfSk7ZnVuY3Rpb24gaFcodCxuKXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKGUgaW5zdGFuY2VvZiBfbil7dmFyIGk9ZS5fX2RhdGFfXztpZighYm58fGkubGVuZ3RoPG1XLTEpcmV0dXJuIGkucHVzaChbdCxuXSksdGhpcy5zaXplPSsrZS5zaXplLHRoaXM7ZT10aGlzLl9fZGF0YV9fPW5ldyBzcihpKX1yZXR1cm4gZS5zZXQodCxuKSx0aGlzLnNpemU9ZS5zaXplLHRoaXN9dmFyIG1XLEN4LHl4PXgoKCk9PntyMCgpO2pzKCk7cXMoKTttVz0yMDA7Q3g9aFd9KTtmdW5jdGlvbiBGbyh0KXt2YXIgbj10aGlzLl9fZGF0YV9fPW5ldyBfbih0KTt0aGlzLnNpemU9bi5zaXplfXZhciBCbyxYNz14KCgpPT57cjAoKTtweCgpO3V4KCk7dngoKTtieCgpO3l4KCk7Rm8ucHJvdG90eXBlLmNsZWFyPWh4O0ZvLnByb3RvdHlwZS5kZWxldGU9Zng7Rm8ucHJvdG90eXBlLmdldD1neDtGby5wcm90b3R5cGUuaGFzPV94O0ZvLnByb3RvdHlwZS5zZXQ9Q3g7Qm89Rm99KTtmdW5jdGlvbiBmVyh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQodCxwVyksdGhpc312YXIgcFcseHgsTXg9eCgoKT0+e3BXPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjt4eD1mV30pO2Z1bmN0aW9uIHVXKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX12YXIgd3gsU3g9eCgoKT0+e3d4PXVXfSk7ZnVuY3Rpb24gUXModCl7dmFyIG49LTEsZT10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IHNyOysrbjxlOyl0aGlzLmFkZCh0W25dKX12YXIga3gseng9eCgoKT0+e3FzKCk7TXgoKTtTeCgpO1FzLnByb3RvdHlwZS5hZGQ9UXMucHJvdG90eXBlLnB1c2g9eHg7UXMucHJvdG90eXBlLmhhcz13eDtreD1Rc30pO2Z1bmN0aW9uIGdXKHQsbil7Zm9yKHZhciBlPS0xLGk9dD09bnVsbD8wOnQubGVuZ3RoOysrZTxpOylpZihuKHRbZV0sZSx0KSlyZXR1cm4hMDtyZXR1cm4hMX12YXIgVHgsRXg9eCgoKT0+e1R4PWdXfSk7ZnVuY3Rpb24gdlcodCxuKXtyZXR1cm4gdC5oYXMobil9dmFyIEF4LER4PXgoKCk9PntBeD12V30pO2Z1bmN0aW9uIENXKHQsbixlLGksYSxyKXt2YXIgbz1lJl9XLGQ9dC5sZW5ndGgscD1uLmxlbmd0aDtpZihkIT1wJiYhKG8mJnA+ZCkpcmV0dXJuITE7dmFyIGc9ci5nZXQodCksXz1yLmdldChuKTtpZihnJiZfKXJldHVybiBnPT1uJiZfPT10O3ZhciB5PS0xLEk9ITAsUD1lJmJXP25ldyBreDp2b2lkIDA7Zm9yKHIuc2V0KHQsbiksci5zZXQobix0KTsrK3k8ZDspe3ZhciBWPXRbeV0sTz1uW3ldO2lmKGkpdmFyIFU9bz9pKE8sVix5LG4sdCxyKTppKFYsTyx5LHQsbixyKTtpZihVIT09dm9pZCAwKXtpZihVKWNvbnRpbnVlO0k9ITE7YnJlYWt9aWYoUCl7aWYoIVR4KG4sZnVuY3Rpb24oUSxmZSl7aWYoIUF4KFAsZmUpJiYoVj09PVF8fGEoVixRLGUsaSxyKSkpcmV0dXJuIFAucHVzaChmZSl9KSl7ST0hMTticmVha319ZWxzZSBpZighKFY9PT1PfHxhKFYsTyxlLGkscikpKXtJPSExO2JyZWFrfX1yZXR1cm4gci5kZWxldGUodCksci5kZWxldGUobiksSX12YXIgX1csYlcsWXMsSjc9eCgoKT0+e3p4KCk7RXgoKTtEeCgpO19XPTEsYlc9MjtZcz1DV30pO3ZhciB5VyxlZCxJeD14KCgpPT57ZGEoKTt5Vz1taS5VaW50OEFycmF5LGVkPXlXfSk7ZnVuY3Rpb24geFcodCl7dmFyIG49LTEsZT1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24oaSxhKXtlWysrbl09W2EsaV19KSxlfXZhciBMeCxQeD14KCgpPT57THg9eFd9KTtmdW5jdGlvbiBNVyh0KXt2YXIgbj0tMSxlPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihpKXtlWysrbl09aX0pLGV9dmFyIFZ4LE94PXgoKCk9PntWeD1NV30pO2Z1bmN0aW9uIEhXKHQsbixlLGksYSxyLG8pe3N3aXRjaChlKXtjYXNlIE9XOmlmKHQuYnl0ZUxlbmd0aCE9bi5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPW4uYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLG49bi5idWZmZXI7Y2FzZSBWVzpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9bi5ieXRlTGVuZ3RofHwhcihuZXcgZWQodCksbmV3IGVkKG4pKSk7Y2FzZSBrVzpjYXNlIHpXOmNhc2UgQVc6cmV0dXJuIE9vKCt0LCtuKTtjYXNlIFRXOnJldHVybiB0Lm5hbWU9PW4ubmFtZSYmdC5tZXNzYWdlPT1uLm1lc3NhZ2U7Y2FzZSBEVzpjYXNlIExXOnJldHVybiB0PT1uKyIiO2Nhc2UgRVc6dmFyIGQ9THg7Y2FzZSBJVzp2YXIgcD1pJndXO2lmKGR8fChkPVZ4KSx0LnNpemUhPW4uc2l6ZSYmIXApcmV0dXJuITE7dmFyIGc9by5nZXQodCk7aWYoZylyZXR1cm4gZz09bjtpfD1TVyxvLnNldCh0LG4pO3ZhciBfPVlzKGQodCksZChuKSxpLGEscixvKTtyZXR1cm4gby5kZWxldGUodCksXztjYXNlIFBXOmlmKHRkKXJldHVybiB0ZC5jYWxsKHQpPT10ZC5jYWxsKG4pfXJldHVybiExfXZhciB3VyxTVyxrVyx6VyxUVyxFVyxBVyxEVyxJVyxMVyxQVyxWVyxPVyxIeCx0ZCxOeCxSeD14KCgpPT57RW8oKTtJeCgpO1VzKCk7SjcoKTtQeCgpO094KCk7d1c9MSxTVz0yLGtXPSJbb2JqZWN0IEJvb2xlYW5dIix6Vz0iW29iamVjdCBEYXRlXSIsVFc9IltvYmplY3QgRXJyb3JdIixFVz0iW29iamVjdCBNYXBdIixBVz0iW29iamVjdCBOdW1iZXJdIixEVz0iW29iamVjdCBSZWdFeHBdIixJVz0iW29iamVjdCBTZXRdIixMVz0iW29iamVjdCBTdHJpbmddIixQVz0iW29iamVjdCBTeW1ib2xdIixWVz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLE9XPSJbb2JqZWN0IERhdGFWaWV3XSIsSHg9T2k/T2kucHJvdG90eXBlOnZvaWQgMCx0ZD1IeD9IeC52YWx1ZU9mOnZvaWQgMDtOeD1IV30pO2Z1bmN0aW9uIE5XKHQsbixlKXt2YXIgaT1uKHQpO3JldHVybiBWMSh0KT9pOk9zKGksZSh0KSl9dmFyIEZ4LEJ4PXgoKCk9PntqNygpO3EyKCk7Rng9Tld9KTtmdW5jdGlvbiBSVyh0LG4pe2Zvcih2YXIgZT0tMSxpPXQ9PW51bGw/MDp0Lmxlbmd0aCxhPTAscj1bXTsrK2U8aTspe3ZhciBvPXRbZV07bihvLGUsdCkmJihyW2ErK109byl9cmV0dXJuIHJ9dmFyIFV4LGp4PXgoKCk9PntVeD1SV30pO2Z1bmN0aW9uIEZXKCl7cmV0dXJuW119dmFyIHF4LEd4PXgoKCk9PntxeD1GV30pO3ZhciBCVyxVVyxXeCxqVyxReCxZeD14KCgpPT57angoKTtHeCgpO0JXPU9iamVjdC5wcm90b3R5cGUsVVc9QlcucHJvcGVydHlJc0VudW1lcmFibGUsV3g9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxqVz1XeD9mdW5jdGlvbih0KXtyZXR1cm4gdD09bnVsbD9bXToodD1PYmplY3QodCksVXgoV3godCksZnVuY3Rpb24obil7cmV0dXJuIFVXLmNhbGwodCxuKX0pKX06cXgsUXg9ald9KTtmdW5jdGlvbiBxVyh0LG4pe2Zvcih2YXIgZT0tMSxpPUFycmF5KHQpOysrZTx0OylpW2VdPW4oZSk7cmV0dXJuIGl9dmFyIFp4LCR4PXgoKCk9PntaeD1xV30pO2Z1bmN0aW9uIEdXKCl7cmV0dXJuITF9dmFyIEt4LFh4PXgoKCk9PntLeD1HV30pO3ZhciB0TSxKeCxXVyxlTSxRVyxZVyxzMCxpZD14KCgpPT57ZGEoKTtYeCgpO3RNPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsSng9dE0mJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxXVz1KeCYmSnguZXhwb3J0cz09PXRNLGVNPVdXP21pLkJ1ZmZlcjp2b2lkIDAsUVc9ZU0/ZU0uaXNCdWZmZXI6dm9pZCAwLFlXPVFXfHxLeCxzMD1ZV30pO2Z1bmN0aW9uIEtXKHQsbil7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG49bj8/WlcsISFuJiYoZT09Im51bWJlciJ8fGUhPSJzeW1ib2wiJiYkVy50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PG59dmFyIFpXLCRXLFVvLFpzPXgoKCk9PntaVz05MDA3MTk5MjU0NzQwOTkxLCRXPS9eKD86MHxbMS05XVxkKikkLztVbz1LV30pO2Z1bmN0aW9uIEpXKHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQ+LTEmJnQlMT09MCYmdDw9WFd9dmFyIFhXLGpvLCRzPXgoKCk9PntYVz05MDA3MTk5MjU0NzQwOTkxO2pvPUpXfSk7ZnVuY3Rpb24gd1EodCl7cmV0dXJuIGoyKHQpJiZqbyh0Lmxlbmd0aCkmJiEheDFbVTIodCldfXZhciBlUSx0USxpUSxhUSxuUSxyUSxvUSxjUSxzUSxsUSxkUSxtUSxoUSxwUSxmUSx1USxnUSx2USxfUSxiUSxDUSx5USx4USxNUSx4MSxpTSxhTT14KCgpPT57QW8oKTskcygpO0RvKCk7ZVE9IltvYmplY3QgQXJndW1lbnRzXSIsdFE9IltvYmplY3QgQXJyYXldIixpUT0iW29iamVjdCBCb29sZWFuXSIsYVE9IltvYmplY3QgRGF0ZV0iLG5RPSJbb2JqZWN0IEVycm9yXSIsclE9IltvYmplY3QgRnVuY3Rpb25dIixvUT0iW29iamVjdCBNYXBdIixjUT0iW29iamVjdCBOdW1iZXJdIixzUT0iW29iamVjdCBPYmplY3RdIixsUT0iW29iamVjdCBSZWdFeHBdIixkUT0iW29iamVjdCBTZXRdIixtUT0iW29iamVjdCBTdHJpbmddIixoUT0iW29iamVjdCBXZWFrTWFwXSIscFE9IltvYmplY3QgQXJyYXlCdWZmZXJdIixmUT0iW29iamVjdCBEYXRhVmlld10iLHVRPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLGdRPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLHZRPSJbb2JqZWN0IEludDhBcnJheV0iLF9RPSJbb2JqZWN0IEludDE2QXJyYXldIixiUT0iW29iamVjdCBJbnQzMkFycmF5XSIsQ1E9IltvYmplY3QgVWludDhBcnJheV0iLHlRPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIseFE9IltvYmplY3QgVWludDE2QXJyYXldIixNUT0iW29iamVjdCBVaW50MzJBcnJheV0iLHgxPXt9O3gxW3VRXT14MVtnUV09eDFbdlFdPXgxW19RXT14MVtiUV09eDFbQ1FdPXgxW3lRXT14MVt4UV09eDFbTVFdPSEwO3gxW2VRXT14MVt0UV09eDFbcFFdPXgxW2lRXT14MVtmUV09eDFbYVFdPXgxW25RXT14MVtyUV09eDFbb1FdPXgxW2NRXT14MVtzUV09eDFbbFFdPXgxW2RRXT14MVttUV09eDFbaFFdPSExO2lNPXdRfSk7ZnVuY3Rpb24gU1EodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pfX12YXIgS3MsYWQ9eCgoKT0+e0tzPVNRfSk7dmFyIG5NLGwwLGtRLG5kLHpRLHJkLHJNPXgoKCk9PntxNygpO25NPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsbDA9bk0mJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxrUT1sMCYmbDAuZXhwb3J0cz09PW5NLG5kPWtRJiZIcy5wcm9jZXNzLHpRPShmdW5jdGlvbigpe3RyeXt2YXIgdD1sMCYmbDAucmVxdWlyZSYmbDAucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxuZCYmbmQuYmluZGluZyYmbmQuYmluZGluZygidXRpbCIpfWNhdGNoe319KSgpLHJkPXpRfSk7dmFyIG9NLFRRLFhzLG9kPXgoKCk9PnthTSgpO2FkKCk7ck0oKTtvTT1yZCYmcmQuaXNUeXBlZEFycmF5LFRRPW9NP0tzKG9NKTppTSxYcz1UUX0pO2Z1bmN0aW9uIERRKHQsbil7dmFyIGU9VjEodCksaT0hZSYmSW8odCksYT0hZSYmIWkmJnMwKHQpLHI9IWUmJiFpJiYhYSYmWHModCksbz1lfHxpfHxhfHxyLGQ9bz9aeCh0Lmxlbmd0aCxTdHJpbmcpOltdLHA9ZC5sZW5ndGg7Zm9yKHZhciBnIGluIHQpKG58fEFRLmNhbGwodCxnKSkmJiEobyYmKGc9PSJsZW5ndGgifHxhJiYoZz09Im9mZnNldCJ8fGc9PSJwYXJlbnQiKXx8ciYmKGc9PSJidWZmZXIifHxnPT0iYnl0ZUxlbmd0aCJ8fGc9PSJieXRlT2Zmc2V0Iil8fFVvKGcscCkpKSYmZC5wdXNoKGcpO3JldHVybiBkfXZhciBFUSxBUSxjTSxzTT14KCgpPT57JHgoKTtOcygpO3EyKCk7aWQoKTtacygpO29kKCk7RVE9T2JqZWN0LnByb3RvdHlwZSxBUT1FUS5oYXNPd25Qcm9wZXJ0eTtjTT1EUX0pO2Z1bmN0aW9uIExRKHQpe3ZhciBuPXQmJnQuY29uc3RydWN0b3IsZT10eXBlb2Ygbj09ImZ1bmN0aW9uIiYmbi5wcm90b3R5cGV8fElRO3JldHVybiB0PT09ZX12YXIgSVEsbE0sZE09eCgoKT0+e0lRPU9iamVjdC5wcm90b3R5cGU7bE09TFF9KTtmdW5jdGlvbiBQUSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChuKGUpKX19dmFyIG1NLGhNPXgoKCk9PnttTT1QUX0pO3ZhciBWUSxwTSxmTT14KCgpPT57aE0oKTtWUT1tTShPYmplY3Qua2V5cyxPYmplY3QpLHBNPVZRfSk7ZnVuY3Rpb24gTlEodCl7aWYoIWxNKHQpKXJldHVybiBwTSh0KTt2YXIgbj1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHQpKUhRLmNhbGwodCxlKSYmZSE9ImNvbnN0cnVjdG9yIiYmbi5wdXNoKGUpO3JldHVybiBufXZhciBPUSxIUSx1TSxnTT14KCgpPT57ZE0oKTtmTSgpO09RPU9iamVjdC5wcm90b3R5cGUsSFE9T1EuaGFzT3duUHJvcGVydHk7dU09TlF9KTtmdW5jdGlvbiBSUSh0KXtyZXR1cm4gdCE9bnVsbCYmam8odC5sZW5ndGgpJiYhRnModCl9dmFyIHhuLGQwPXgoKCk9PntRNygpOyRzKCk7eG49UlF9KTtmdW5jdGlvbiBGUSh0KXtyZXR1cm4geG4odCk/Y00odCk6dU0odCl9dmFyIHFvLEpzPXgoKCk9PntzTSgpO2dNKCk7ZDAoKTtxbz1GUX0pO2Z1bmN0aW9uIEJRKHQpe3JldHVybiBGeCh0LHFvLFF4KX12YXIgY2Qsdk09eCgoKT0+e0J4KCk7WXgoKTtKcygpO2NkPUJRfSk7ZnVuY3Rpb24gR1EodCxuLGUsaSxhLHIpe3ZhciBvPWUmVVEsZD1jZCh0KSxwPWQubGVuZ3RoLGc9Y2QobiksXz1nLmxlbmd0aDtpZihwIT1fJiYhbylyZXR1cm4hMTtmb3IodmFyIHk9cDt5LS07KXt2YXIgST1kW3ldO2lmKCEobz9JIGluIG46cVEuY2FsbChuLEkpKSlyZXR1cm4hMX12YXIgUD1yLmdldCh0KSxWPXIuZ2V0KG4pO2lmKFAmJlYpcmV0dXJuIFA9PW4mJlY9PXQ7dmFyIE89ITA7ci5zZXQodCxuKSxyLnNldChuLHQpO2Zvcih2YXIgVT1vOysreTxwOyl7ST1kW3ldO3ZhciBRPXRbSV0sZmU9bltJXTtpZihpKXZhciBPZT1vP2koZmUsUSxJLG4sdCxyKTppKFEsZmUsSSx0LG4scik7aWYoIShPZT09PXZvaWQgMD9RPT09ZmV8fGEoUSxmZSxlLGkscik6T2UpKXtPPSExO2JyZWFrfVV8fChVPUk9PSJjb25zdHJ1Y3RvciIpfWlmKE8mJiFVKXt2YXIgTWU9dC5jb25zdHJ1Y3RvcixydD1uLmNvbnN0cnVjdG9yO01lIT1ydCYmImNvbnN0cnVjdG9yImluIHQmJiJjb25zdHJ1Y3RvciJpbiBuJiYhKHR5cGVvZiBNZT09ImZ1bmN0aW9uIiYmTWUgaW5zdGFuY2VvZiBNZSYmdHlwZW9mIHJ0PT0iZnVuY3Rpb24iJiZydCBpbnN0YW5jZW9mIHJ0KSYmKE89ITEpfXJldHVybiByLmRlbGV0ZSh0KSxyLmRlbGV0ZShuKSxPfXZhciBVUSxqUSxxUSxfTSxiTT14KCgpPT57dk0oKTtVUT0xLGpRPU9iamVjdC5wcm90b3R5cGUscVE9alEuaGFzT3duUHJvcGVydHk7X009R1F9KTt2YXIgV1EsZTYsQ009eCgoKT0+e2duKCk7ZGEoKTtXUT1RaShtaSwiRGF0YVZpZXciKSxlNj1XUX0pO3ZhciBRUSx0Nix5TT14KCgpPT57Z24oKTtkYSgpO1FRPVFpKG1pLCJQcm9taXNlIiksdDY9UVF9KTt2YXIgWVEsaTYseE09eCgoKT0+e2duKCk7ZGEoKTtZUT1RaShtaSwiU2V0IiksaTY9WVF9KTt2YXIgWlEsYTYsTU09eCgoKT0+e2duKCk7ZGEoKTtaUT1RaShtaSwiV2Vha01hcCIpLGE2PVpRfSk7dmFyIHdNLCRRLFNNLGtNLHpNLFRNLEtRLFhRLEpRLGVZLHRZLGxyLHNkLEVNPXgoKCk9PntDTSgpO2pzKCk7eU0oKTt4TSgpO01NKCk7QW8oKTtZNygpO3dNPSJbb2JqZWN0IE1hcF0iLCRRPSJbb2JqZWN0IE9iamVjdF0iLFNNPSJbb2JqZWN0IFByb21pc2VdIixrTT0iW29iamVjdCBTZXRdIix6TT0iW29iamVjdCBXZWFrTWFwXSIsVE09IltvYmplY3QgRGF0YVZpZXddIixLUT1QYShlNiksWFE9UGEoYm4pLEpRPVBhKHQ2KSxlWT1QYShpNiksdFk9UGEoYTYpLGxyPVUyOyhlNiYmbHIobmV3IGU2KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1UTXx8Ym4mJmxyKG5ldyBibikhPXdNfHx0NiYmbHIodDYucmVzb2x2ZSgpKSE9U018fGk2JiZscihuZXcgaTYpIT1rTXx8YTYmJmxyKG5ldyBhNikhPXpNKSYmKGxyPWZ1bmN0aW9uKHQpe3ZhciBuPVUyKHQpLGU9bj09JFE/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAsaT1lP1BhKGUpOiIiO2lmKGkpc3dpdGNoKGkpe2Nhc2UgS1E6cmV0dXJuIFRNO2Nhc2UgWFE6cmV0dXJuIHdNO2Nhc2UgSlE6cmV0dXJuIFNNO2Nhc2UgZVk6cmV0dXJuIGtNO2Nhc2UgdFk6cmV0dXJuIHpNfXJldHVybiBufSk7c2Q9bHJ9KTtmdW5jdGlvbiBuWSh0LG4sZSxpLGEscil7dmFyIG89VjEodCksZD1WMShuKSxwPW8/RE06c2QodCksZz1kP0RNOnNkKG4pO3A9cD09QU0/bjY6cCxnPWc9PUFNP242Omc7dmFyIF89cD09bjYseT1nPT1uNixJPXA9PWc7aWYoSSYmczAodCkpe2lmKCFzMChuKSlyZXR1cm4hMTtvPSEwLF89ITF9aWYoSSYmIV8pcmV0dXJuIHJ8fChyPW5ldyBCbyksb3x8WHModCk/WXModCxuLGUsaSxhLHIpOk54KHQsbixwLGUsaSxhLHIpO2lmKCEoZSZpWSkpe3ZhciBQPV8mJklNLmNhbGwodCwiX193cmFwcGVkX18iKSxWPXkmJklNLmNhbGwobiwiX193cmFwcGVkX18iKTtpZihQfHxWKXt2YXIgTz1QP3QudmFsdWUoKTp0LFU9Vj9uLnZhbHVlKCk6bjtyZXR1cm4gcnx8KHI9bmV3IEJvKSxhKE8sVSxlLGkscil9fXJldHVybiBJPyhyfHwocj1uZXcgQm8pLF9NKHQsbixlLGksYSxyKSk6ITF9dmFyIGlZLEFNLERNLG42LGFZLElNLExNLFBNPXgoKCk9PntYNygpO0o3KCk7UngoKTtiTSgpO0VNKCk7cTIoKTtpZCgpO29kKCk7aVk9MSxBTT0iW29iamVjdCBBcmd1bWVudHNdIixETT0iW29iamVjdCBBcnJheV0iLG42PSJbb2JqZWN0IE9iamVjdF0iLGFZPU9iamVjdC5wcm90b3R5cGUsSU09YVkuaGFzT3duUHJvcGVydHk7TE09bll9KTtmdW5jdGlvbiBWTSh0LG4sZSxpLGEpe3JldHVybiB0PT09bj8hMDp0PT1udWxsfHxuPT1udWxsfHwhajIodCkmJiFqMihuKT90IT09dCYmbiE9PW46TE0odCxuLGUsaSxWTSxhKX12YXIgcjYsbGQ9eCgoKT0+e1BNKCk7RG8oKTtyNj1WTX0pO2Z1bmN0aW9uIGNZKHQsbixlLGkpe3ZhciBhPWUubGVuZ3RoLHI9YSxvPSFpO2lmKHQ9PW51bGwpcmV0dXJuIXI7Zm9yKHQ9T2JqZWN0KHQpO2EtLTspe3ZhciBkPWVbYV07aWYobyYmZFsyXT9kWzFdIT09dFtkWzBdXTohKGRbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrYTxyOyl7ZD1lW2FdO3ZhciBwPWRbMF0sZz10W3BdLF89ZFsxXTtpZihvJiZkWzJdKXtpZihnPT09dm9pZCAwJiYhKHAgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgeT1uZXcgQm87aWYoaSl2YXIgST1pKGcsXyxwLHQsbix5KTtpZighKEk9PT12b2lkIDA/cjYoXyxnLHJZfG9ZLGkseSk6SSkpcmV0dXJuITF9fXJldHVybiEwfXZhciByWSxvWSxPTSxITT14KCgpPT57WDcoKTtsZCgpO3JZPTEsb1k9MjtPTT1jWX0pO2Z1bmN0aW9uIHNZKHQpe3JldHVybiB0PT09dCYmIXVuKHQpfXZhciBvNixkZD14KCgpPT57aTAoKTtvNj1zWX0pO2Z1bmN0aW9uIGxZKHQpe2Zvcih2YXIgbj1xbyh0KSxlPW4ubGVuZ3RoO2UtLTspe3ZhciBpPW5bZV0sYT10W2ldO25bZV09W2ksYSxvNihhKV19cmV0dXJuIG59dmFyIE5NLFJNPXgoKCk9PntkZCgpO0pzKCk7Tk09bFl9KTtmdW5jdGlvbiBkWSh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZT09bnVsbD8hMTplW3RdPT09biYmKG4hPT12b2lkIDB8fHQgaW4gT2JqZWN0KGUpKX19dmFyIGM2LG1kPXgoKCk9PntjNj1kWX0pO2Z1bmN0aW9uIG1ZKHQpe3ZhciBuPU5NKHQpO3JldHVybiBuLmxlbmd0aD09MSYmblswXVsyXT9jNihuWzBdWzBdLG5bMF1bMV0pOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09dHx8T00oZSx0LG4pfX12YXIgRk0sQk09eCgoKT0+e0hNKCk7Uk0oKTttZCgpO0ZNPW1ZfSk7ZnVuY3Rpb24gaFkodCxuLGUpe3ZhciBpPXQ9PW51bGw/dm9pZCAwOlJvKHQsbik7cmV0dXJuIGk9PT12b2lkIDA/ZTppfXZhciBVTSxqTT14KCgpPT57V3MoKTtVTT1oWX0pO2Z1bmN0aW9uIHBZKHQsbil7cmV0dXJuIHQhPW51bGwmJm4gaW4gT2JqZWN0KHQpfXZhciBxTSxHTT14KCgpPT57cU09cFl9KTtmdW5jdGlvbiBmWSh0LG4sZSl7bj1HcyhuLHQpO2Zvcih2YXIgaT0tMSxhPW4ubGVuZ3RoLHI9ITE7KytpPGE7KXt2YXIgbz15bihuW2ldKTtpZighKHI9dCE9bnVsbCYmZSh0LG8pKSlicmVhazt0PXRbb119cmV0dXJuIHJ8fCsraSE9YT9yOihhPXQ9PW51bGw/MDp0Lmxlbmd0aCwhIWEmJmpvKGEpJiZVbyhvLGEpJiYoVjEodCl8fElvKHQpKSl9dmFyIFdNLFFNPXgoKCk9PntLNygpO05zKCk7cTIoKTtacygpOyRzKCk7YzAoKTtXTT1mWX0pO2Z1bmN0aW9uIHVZKHQsbil7cmV0dXJuIHQhPW51bGwmJldNKHQsbixxTSl9dmFyIFlNLFpNPXgoKCk9PntHTSgpO1FNKCk7WU09dVl9KTtmdW5jdGlvbiBfWSh0LG4pe3JldHVybiBQbyh0KSYmbzYobik/YzYoeW4odCksbik6ZnVuY3Rpb24oZSl7dmFyIGk9VU0oZSx0KTtyZXR1cm4gaT09PXZvaWQgMCYmaT09PW4/WU0oZSx0KTpyNihuLGksZ1l8dlkpfX12YXIgZ1ksdlksJE0sS009eCgoKT0+e2xkKCk7ak0oKTtaTSgpO1JzKCk7ZGQoKTttZCgpO2MwKCk7Z1k9MSx2WT0yOyRNPV9ZfSk7ZnVuY3Rpb24gYlkodCl7cmV0dXJuIHR9dmFyIE1uLG0wPXgoKCk9PntNbj1iWX0pO2Z1bmN0aW9uIENZKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbj8uW3RdfX12YXIgWE0sSk09eCgoKT0+e1hNPUNZfSk7ZnVuY3Rpb24geVkodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBSbyhuLHQpfX12YXIgZXcsdHc9eCgoKT0+e1dzKCk7ZXc9eVl9KTtmdW5jdGlvbiB4WSh0KXtyZXR1cm4gUG8odCk/WE0oeW4odCkpOmV3KHQpfXZhciBpdyxhdz14KCgpPT57Sk0oKTt0dygpO1JzKCk7YzAoKTtpdz14WX0pO2Z1bmN0aW9uIE1ZKHQpe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIj90OnQ9PW51bGw/TW46dHlwZW9mIHQ9PSJvYmplY3QiP1YxKHQpPyRNKHRbMF0sdFsxXSk6Rk0odCk6aXcodCl9dmFyIG53LHJ3PXgoKCk9PntCTSgpO0tNKCk7bTAoKTtxMigpO2F3KCk7bnc9TVl9KTtmdW5jdGlvbiB3WSh0KXtyZXR1cm4gZnVuY3Rpb24obixlLGkpe2Zvcih2YXIgYT0tMSxyPU9iamVjdChuKSxvPWkobiksZD1vLmxlbmd0aDtkLS07KXt2YXIgcD1vW3Q/ZDorK2FdO2lmKGUocltwXSxwLHIpPT09ITEpYnJlYWt9cmV0dXJuIG59fXZhciBvdyxjdz14KCgpPT57b3c9d1l9KTt2YXIgU1ksc3csbHc9eCgoKT0+e2N3KCk7U1k9b3coKSxzdz1TWX0pO2Z1bmN0aW9uIGtZKHQsbil7cmV0dXJuIHQmJnN3KHQsbixxbyl9dmFyIGR3LG13PXgoKCk9PntsdygpO0pzKCk7ZHc9a1l9KTtmdW5jdGlvbiB6WSh0LG4pe3JldHVybiBmdW5jdGlvbihlLGkpe2lmKGU9PW51bGwpcmV0dXJuIGU7aWYoIXhuKGUpKXJldHVybiB0KGUsaSk7Zm9yKHZhciBhPWUubGVuZ3RoLHI9bj9hOi0xLG89T2JqZWN0KGUpOyhuP3ItLTorK3I8YSkmJmkob1tyXSxyLG8pIT09ITE7KTtyZXR1cm4gZX19dmFyIGh3LHB3PXgoKCk9PntkMCgpO2h3PXpZfSk7dmFyIFRZLGZ3LHV3PXgoKCk9PnttdygpO3B3KCk7VFk9aHcoZHcpLGZ3PVRZfSk7ZnVuY3Rpb24gRVkodCxuKXt2YXIgZT0tMSxpPXhuKHQpP0FycmF5KHQubGVuZ3RoKTpbXTtyZXR1cm4gZncodCxmdW5jdGlvbihhLHIsbyl7aVsrK2VdPW4oYSxyLG8pfSksaX12YXIgZ3csdnc9eCgoKT0+e3V3KCk7ZDAoKTtndz1FWX0pO2Z1bmN0aW9uIEFZKHQsbil7dmFyIGU9dC5sZW5ndGg7Zm9yKHQuc29ydChuKTtlLS07KXRbZV09dFtlXS52YWx1ZTtyZXR1cm4gdH12YXIgX3csYnc9eCgoKT0+e193PUFZfSk7ZnVuY3Rpb24gRFkodCxuKXtpZih0IT09bil7dmFyIGU9dCE9PXZvaWQgMCxpPXQ9PT1udWxsLGE9dD09PXQscj1MYSh0KSxvPW4hPT12b2lkIDAsZD1uPT09bnVsbCxwPW49PT1uLGc9TGEobik7aWYoIWQmJiFnJiYhciYmdD5ufHxyJiZvJiZwJiYhZCYmIWd8fGkmJm8mJnB8fCFlJiZwfHwhYSlyZXR1cm4gMTtpZighaSYmIXImJiFnJiZ0PG58fGcmJmUmJmEmJiFpJiYhcnx8ZCYmZSYmYXx8IW8mJmF8fCFwKXJldHVybi0xfXJldHVybiAwfXZhciBDdyx5dz14KCgpPT57dDAoKTtDdz1EWX0pO2Z1bmN0aW9uIElZKHQsbixlKXtmb3IodmFyIGk9LTEsYT10LmNyaXRlcmlhLHI9bi5jcml0ZXJpYSxvPWEubGVuZ3RoLGQ9ZS5sZW5ndGg7KytpPG87KXt2YXIgcD1DdyhhW2ldLHJbaV0pO2lmKHApe2lmKGk+PWQpcmV0dXJuIHA7dmFyIGc9ZVtpXTtyZXR1cm4gcCooZz09ImRlc2MiPy0xOjEpfX1yZXR1cm4gdC5pbmRleC1uLmluZGV4fXZhciB4dyxNdz14KCgpPT57eXcoKTt4dz1JWX0pO2Z1bmN0aW9uIExZKHQsbixlKXtuLmxlbmd0aD9uPUxvKG4sZnVuY3Rpb24ocil7cmV0dXJuIFYxKHIpP2Z1bmN0aW9uKG8pe3JldHVybiBSbyhvLHIubGVuZ3RoPT09MT9yWzBdOnIpfTpyfSk6bj1bTW5dO3ZhciBpPS0xO249TG8obixLcyhudykpO3ZhciBhPWd3KHQsZnVuY3Rpb24ocixvLGQpe3ZhciBwPUxvKG4sZnVuY3Rpb24oZyl7cmV0dXJuIGcocil9KTtyZXR1cm57Y3JpdGVyaWE6cCxpbmRleDorK2ksdmFsdWU6cn19KTtyZXR1cm4gX3coYSxmdW5jdGlvbihyLG8pe3JldHVybiB4dyhyLG8sZSl9KX12YXIgd3csU3c9eCgoKT0+e1c3KCk7V3MoKTtydygpO3Z3KCk7YncoKTthZCgpO013KCk7bTAoKTtxMigpO3d3PUxZfSk7ZnVuY3Rpb24gUFkodCxuLGUpe3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiB0LmNhbGwobik7Y2FzZSAxOnJldHVybiB0LmNhbGwobixlWzBdKTtjYXNlIDI6cmV0dXJuIHQuY2FsbChuLGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiB0LmNhbGwobixlWzBdLGVbMV0sZVsyXSl9cmV0dXJuIHQuYXBwbHkobixlKX12YXIga3csenc9eCgoKT0+e2t3PVBZfSk7ZnVuY3Rpb24gVlkodCxuLGUpe3JldHVybiBuPVR3KG49PT12b2lkIDA/dC5sZW5ndGgtMTpuLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciBpPWFyZ3VtZW50cyxhPS0xLHI9VHcoaS5sZW5ndGgtbiwwKSxvPUFycmF5KHIpOysrYTxyOylvW2FdPWlbbithXTthPS0xO2Zvcih2YXIgZD1BcnJheShuKzEpOysrYTxuOylkW2FdPWlbYV07cmV0dXJuIGRbbl09ZShvKSxrdyh0LHRoaXMsZCl9fXZhciBUdyxFdyxBdz14KCgpPT57encoKTtUdz1NYXRoLm1heDtFdz1WWX0pO2Z1bmN0aW9uIE9ZKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgRHcsSXc9eCgoKT0+e0R3PU9ZfSk7dmFyIEhZLGhkLEx3PXgoKCk9PntnbigpO0hZPShmdW5jdGlvbigpe3RyeXt2YXIgdD1RaShPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2h7fX0pKCksaGQ9SFl9KTt2YXIgTlksUHcsVnc9eCgoKT0+e0l3KCk7THcoKTttMCgpO05ZPWhkP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGhkKHQsInRvU3RyaW5nIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6RHcobiksd3JpdGFibGU6ITB9KX06TW4sUHc9Tll9KTtmdW5jdGlvbiBVWSh0KXt2YXIgbj0wLGU9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1CWSgpLGE9RlktKGktZSk7aWYoZT1pLGE+MCl7aWYoKytuPj1SWSlyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2Ugbj0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX12YXIgUlksRlksQlksT3csSHc9eCgoKT0+e1JZPTgwMCxGWT0xNixCWT1EYXRlLm5vdztPdz1VWX0pO3ZhciBqWSxOdyxSdz14KCgpPT57VncoKTtIdygpO2pZPU93KFB3KSxOdz1qWX0pO2Z1bmN0aW9uIHFZKHQsbil7cmV0dXJuIE53KEV3KHQsbixNbiksdCsiIil9dmFyIEZ3LEJ3PXgoKCk9PnttMCgpO0F3KCk7UncoKTtGdz1xWX0pO2Z1bmN0aW9uIEdZKHQsbixlKXtpZighdW4oZSkpcmV0dXJuITE7dmFyIGk9dHlwZW9mIG47cmV0dXJuKGk9PSJudW1iZXIiP3huKGUpJiZVbyhuLGUubGVuZ3RoKTppPT0ic3RyaW5nIiYmbiBpbiBlKT9PbyhlW25dLHQpOiExfXZhciBwZCxVdz14KCgpPT57VXMoKTtkMCgpO1pzKCk7aTAoKTtwZD1HWX0pO3ZhciBXWSxzNixmZD14KCgpPT57bXkoKTtTdygpO0J3KCk7VXcoKTtXWT1GdyhmdW5jdGlvbih0LG4pe2lmKHQ9PW51bGwpcmV0dXJuW107dmFyIGU9bi5sZW5ndGg7cmV0dXJuIGU+MSYmcGQodCxuWzBdLG5bMV0pP249W106ZT4yJiZwZChuWzBdLG5bMV0sblsyXSkmJihuPVtuWzBdXSksd3codCxkeShuLDEpLFtdKX0pLHM2PVdZfSk7ZnVuY3Rpb24gancodCl7cmV0dXJuIHM2KHQsWyJkaWZmaWN1bHR5IiwidHV0b3JpYWxPcmRlciIsIm5hbWUiXSl9dmFyIHF3PXgoKCk9PntmZCgpfSk7ZnVuY3Rpb24gWVkodCxuKXt0JjEmJihNdCgpLEd0KDAsInN2ZyIsMCksWmkoMSwicGF0aCIsMSksSnQoKSl9dmFyIFFZLGw2LHVkPXgoKCk9PntrKCk7UVk9KCk9PltdO2w2PSgoKT0+e2NsYXNzIHR7ZGlmZmljdWx0eTtzdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJkaWZmaWN1bHR5LXN0YXJzIl1dLGlucHV0czp7ZGlmZmljdWx0eToiZGlmZmljdWx0eSJ9LGRlY2xzOjIsdmFyczoxLGNvbnN0czpbWyJ3aWR0aCIsIjE4IiwiaGVpZ2h0IiwiMTgiLCJ2aWV3Qm94IiwiMCAwIDE0IDEzIiwiZmlsbCIsIm5vbmUiLCJ4bWxucyIsImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIl0sWyJkIiwiTTYuNTYzODYgMC41MTE5NjNMOC4xMDMzMiA1LjI0OTkySDEzLjA4NTFMOS4wNTQ3NSA4LjE3ODEzTDEwLjU5NDIgMTIuOTE2MUw2LjU2Mzg2IDkuOTg3ODdMMi41MzM1MiAxMi45MTYxTDQuMDcyOTcgOC4xNzgxM0wwLjA0MjYyODMgNS4yNDk5Mkg1LjAyNDQxTDYuNTYzODYgMC41MTE5NjNaIiwiZmlsbCIsInZhcigtLXRoZW1lLXRleHQpIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiZxZSgwLFlZLDIsMCwiOnN2ZzpzdmciLDAsZnIpLGkmMiYmR2UoU3QoMCxRWSkuY29uc3RydWN0b3IoYS5kaWZmaWN1bHR5KSl9LHN0eWxlczpbIltfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4fSJdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gZVoodCxuKXtpZih0JjEmJihjKDAsInNwYW4iLDEwKSxiKDEsInRyYW5zbGF0ZSIpLG0oMikscygpKSx0JjIpe2xldCBlPW4uJGltcGxpY2l0O2YoIm1hdFRvb2x0aXAiLEMoMSwyLCJUQUdfIisoZT09bnVsbD9udWxsOmUudG9VcHBlckNhc2UoKS5zcGxpdCgiICIpLmpvaW4oIl8iKSkrIl9ERVNDUklQVElPTiIpKSxsKDIpLEEoZSl9fWZ1bmN0aW9uIHRaKHQsbil7aWYodCYxJiYoYygwLCJidXR0b24iLDEyKSxiKDEsInRyYW5zbGF0ZSIpLGMoMiwibWF0LWljb24iKSxtKDMsImluZm9fb3V0bGluZSIpLHMoKSgpKSx0JjIpe2xldCBlPXYoKTtmKCJtYXRUb29sdGlwIixkdCgxLDMsIkNIQUxMRU5HRV9VTkFWQUlMQUJMRSIsYnQoNixHdyxlLmNoYWxsZW5nZS5kaXNhYmxlZEVudikpKSxsKDIpLF90KCJjb2xvciIsInZhcigtLXRoZW1lLXdhcm4pIil9fWZ1bmN0aW9uIGlaKHQsbil7aWYodCYxJiYoYygwLCJidXR0b24iLDEyKSxiKDEsInRyYW5zbGF0ZSIpLGMoMiwibWF0LWljb24iKSxtKDMsImluZm9fb3V0bGluZSIpLHMoKSgpKSx0JjIpe2xldCBlPXYoKTtmKCJtYXRUb29sdGlwIixkdCgxLDMsIkNIQUxMRU5HRV9VTkFWQUlMQUJMRV9TQUZFVFlNT0RFIixidCg2LEd3LGUuY2hhbGxlbmdlLmRpc2FibGVkRW52KSkpLGwoMiksX3QoImNvbG9yIiwidmFyKC0tdGhlbWUtd2FybikiKX19ZnVuY3Rpb24gYVoodCxuKXtpZih0JjEmJihjKDAsInNwYW4iLDE5KSxtKDEpLHMoKSksdCYyKXtsZXQgZT12KDIpO2woKSxFKCIiLGUuY2hhbGxlbmdlLmNvZGluZ0NoYWxsZW5nZVN0YXR1cywiLzIiKX19ZnVuY3Rpb24gbloodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImJ1dHRvbiIsMTgsMCksYigyLCJ0cmFuc2xhdGUiKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLm9wZW5Db2RpbmdDaGFsbGVuZ2VEaWFsb2coYS5jaGFsbGVuZ2Uua2V5KSl9KSxNKDMsYVosMiwxLCJzcGFuIiwxOSksYyg0LCJtYXQtaWNvbiIpLG0oNSwiY29kZSIpLHMoKSgpfWlmKHQmMil7bGV0IGU9digpO2YoImRpc2FibGVkIixlLmNoYWxsZW5nZS5zb2x2ZWQ9PT0hMSYmZS5hcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb24uY2hhbGxlbmdlcy5jb2RpbmdDaGFsbGVuZ2VzRW5hYmxlZCE9PSJhbHdheXMiKSgibmdDbGFzcyIsdjAoNixLWSxlLmNoYWxsZW5nZS5jb2RpbmdDaGFsbGVuZ2VTdGF0dXM9PT0xLGUuY2hhbGxlbmdlLmNvZGluZ0NoYWxsZW5nZVN0YXR1cz09PTIsZS5oaWdobGlnaHRDb2RpbmdCdXR0b24pKSgibWF0VG9vbHRpcCIsQygyLDQsZS5jaGFsbGVuZ2Uuc29sdmVkPyJMQVVOQ0hfQ09ESU5HX0NIQUxMRU5HRSI6IlNPTFZFX0hBQ0tJTkdfQ0hBTExFTkdFIikpLGwoMyksdyhlLmNoYWxsZW5nZS5jb2RpbmdDaGFsbGVuZ2VTdGF0dXMhPT0wPzM6LTEpfX1mdW5jdGlvbiByWih0LG4pe2lmKHQmMSYmKGMoMCwiYSIsMTQpLGIoMSwidHJhbnNsYXRlIiksYygyLCJtYXQtaWNvbiIpLG0oMywicG9saWN5X291dGxpbmUiKSxzKCkoKSksdCYyKXtsZXQgZT12KCk7ZigiaHJlZiIsZS5jaGFsbGVuZ2UubWl0aWdhdGlvblVybCx3dCkoIm1hdFRvb2x0aXAiLEMoMSwyLCJJTkZPX1ZVTE5FUkFCSUxJVFlfTUlUSUdBVElPTl9MSU5LIikpfX1mdW5jdGlvbiBvWih0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYnV0dG9uIiwyMCksYigxLCJ0cmFuc2xhdGUiKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLnJlcGVhdENoYWxsZW5nZU5vdGlmaWNhdGlvbihhLmNoYWxsZW5nZS5rZXkpKX0pLGMoMiwibWF0LWljb24iKSxtKDMsImZsYWdfb3V0bGluZSIpLHMoKSgpfWlmKHQmMil7bGV0IGU9digpO2YoIm5nQ2xhc3MiLGJ0KDQsWFksZS5jaGFsbGVuZ2Uuc29sdmVkKSkoIm1hdFRvb2x0aXAiLEMoMSwyLCJOT1RJRklDQVRJT05fUkVTRU5EX0lOU1RSVUNUSU9OUyIpKX19ZnVuY3Rpb24gY1oodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImJ1dHRvbiIsMjEpLGIoMSwidHJhbnNsYXRlIiksUygiY2xpY2siLGZ1bmN0aW9uKCl7eihlKTtsZXQgYT12KCk7cmV0dXJuIFQoYS5zdGFydEhhY2tpbmdJbnN0cnVjdG9yRm9yKGEuY2hhbGxlbmdlLm5hbWUpKX0pLGMoMiwibWF0LWljb24iKSxtKDMsInNjaG9vbF9vdXRsaW5lIikscygpKCl9dCYyJiZmKCJtYXRUb29sdGlwIixDKDEsMSwiSU5GT19IQUNLSU5HX0lOU1RSVUNUT1IiKSl9ZnVuY3Rpb24gc1oodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImJ1dHRvbiIsMjIsMSksYigyLCJ0cmFuc2xhdGUiKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLnVubG9ja0hpbnQoYS5jaGFsbGVuZ2UubmV4dEhpbnQsYS5jaGFsbGVuZ2Uua2V5KSl9KSxjKDMsIm1hdC1pY29uIiksbSg0KSxzKCksbSg1KSxzKCl9aWYodCYyKXtsZXQgZT12KCk7X3QoInBhZGRpbmciLCIwIDZweCAwIDRweCIpLGYoIm1hdFRvb2x0aXAiLGUuY2hhbGxlbmdlLmhpbnRUZXh0KyhlLmNoYWxsZW5nZS5uZXh0SGludD9gCgpgK2R0KDIsNywiQ0xJQ0tfVE9fVU5MT0NLX05FWFRfSElOVCIsejEoMTAsSlksZS5jaGFsbGVuZ2UuaGludHNVbmxvY2tlZCsxLGUuY2hhbGxlbmdlLmhpbnRzQXZhaWxhYmxlKSk6IiIpKSgiZGlzYWJsZWQiLCFlLmNoYWxsZW5nZS5uZXh0SGludCksbCg0KSxBKGUuY2hhbGxlbmdlLm5leHRIaW50PyJsaWdodGJ1bGJfb3V0bGluZWQiOiJsaWdodGJ1bGIiKSxsKCksTzEoIiAiLGUuY2hhbGxlbmdlLmhpbnRzVW5sb2NrZWQsIi8iLGUuY2hhbGxlbmdlLmhpbnRzQXZhaWxhYmxlLCIgIil9fXZhciBaWSwkWSxHdyxLWSxYWSxKWSxXdyxRdz14KCgpPT57aygpO1coKTt2ZSgpO3ZpKCk7YTEoKTt1ZCgpO0oxKCk7aygpO3ZlKCk7VygpO1pZPVsiaGludFRvb2x0aXAiXSwkWT1bImNvZGluZ0NoYWxsZW5nZVRvb2x0aXAiXSxHdz10PT4oe2Vudjp0fSksS1k9KHQsbixlKT0+KHsicGFydGlhbGx5LWNvbXBsZXRlZCI6dCxjb21wbGV0ZWQ6bixmbGlja2VyaW5nOmV9KSxYWT10PT4oe2NvbXBsZXRlZDp0fSksSlk9KHQsbik9Pih7bmV4dDp0LHRvdGFsOm59KTtXdz0oKCk9PntjbGFzcyB0e3NuYWNrQmFySGVscGVyU2VydmljZT1oKFZ0KTtjaGFsbGVuZ2U7b3BlbkNvZGluZ0NoYWxsZW5nZURpYWxvZztyZXBlYXRDaGFsbGVuZ2VOb3RpZmljYXRpb247dW5sb2NrSGludDthcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb247bGFzdFVubG9ja2VkQ2hhbGxlbmdlS2V5PW51bGw7aGludFRvb2x0aXA7Y29kaW5nQ2hhbGxlbmdlVG9vbHRpcDtoaWdobGlnaHRDb2RpbmdCdXR0b249ITE7Y2hhbGxlbmdlSWQ7cHJldmlvdXNIaW50c1VubG9ja2VkO2hhc0luc3RydWN0aW9ucz0oKT0+ITE7c3RhcnRIYWNraW5nSW5zdHJ1Y3RvckZvcj0oKT0+UGUobnVsbCxudWxsLGZ1bmN0aW9uKigpe30pO25nT25Jbml0KCl7cmV0dXJuIFBlKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtsZXR7aGFzSW5zdHJ1Y3Rpb25zOmUsc3RhcnRIYWNraW5nSW5zdHJ1Y3RvckZvcjppfT15aWVsZCBpbXBvcnQoIi4vaGFja2luZy1pbnN0cnVjdG9yLU9ZVUtDREdHLmpzIik7dGhpcy5oYXNJbnN0cnVjdGlvbnM9ZSx0aGlzLnN0YXJ0SGFja2luZ0luc3RydWN0b3JGb3I9aX0pfW5nT25DaGFuZ2VzKGUpe2lmKGUuY2hhbGxlbmdlPy5jdXJyZW50VmFsdWUpe2xldCBpPXRoaXMuY2hhbGxlbmdlPy5oaW50c1VubG9ja2VkO3RoaXMubGFzdFVubG9ja2VkQ2hhbGxlbmdlS2V5PT09dGhpcy5jaGFsbGVuZ2U/LmtleSYmdGhpcy5wcmV2aW91c0hpbnRzVW5sb2NrZWQhPT12b2lkIDAmJmkhPT10aGlzLnByZXZpb3VzSGludHNVbmxvY2tlZCYmcXVldWVNaWNyb3Rhc2soKCk9PnNldFRpbWVvdXQoKCk9Pnt0aGlzLmhpbnRUb29sdGlwPy5zaG93KCl9LDUwKSksdGhpcy5wcmV2aW91c0hpbnRzVW5sb2NrZWQ9aX1lLmhpZ2hsaWdodENvZGluZ0J1dHRvbiYmKGUuaGlnaGxpZ2h0Q29kaW5nQnV0dG9uLmN1cnJlbnRWYWx1ZT09PSEwP3F1ZXVlTWljcm90YXNrKCgpPT57c2V0VGltZW91dCgoKT0+e3RoaXMuY29kaW5nQ2hhbGxlbmdlVG9vbHRpcD8uc2hvdygpfSwxZTMpfSk6ZS5oaWdobGlnaHRDb2RpbmdCdXR0b24ucHJldmlvdXNWYWx1ZT09PSEwJiZlLmhpZ2hsaWdodENvZGluZ0J1dHRvbi5jdXJyZW50VmFsdWU9PT0hMSYmdGhpcy5jb2RpbmdDaGFsbGVuZ2VUb29sdGlwPy5oaWRlKCkpfWNvcHlQYXlsb2FkKGUpe2xldCBhPWUudGFyZ2V0LmNsb3Nlc3QoImNvZGUiKTtpZihhKXtsZXQgcj1hLmlubmVyVGV4dDtuYXZpZ2F0b3IuY2xpcGJvYXJkJiZuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChyKS50aGVuKCgpPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbigiQ09QWV9TVUNDRVNTIiwiY29uZmlybUJhciIpfSl9fXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImNoYWxsZW5nZS1jYXJkIl1dLHZpZXdRdWVyeTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKHRlKFpZLDUpLHRlKCRZLDUpKSxpJjIpe2xldCByO0Yocj1CKCkpJiYoYS5oaW50VG9vbHRpcD1yLmZpcnN0KSxGKHI9QigpKSYmKGEuY29kaW5nQ2hhbGxlbmdlVG9vbHRpcD1yLmZpcnN0KX19LGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uKGksYSl7aSYyJiZHKCJpZCIsYS5jaGFsbGVuZ2VJZCl9LGlucHV0czp7Y2hhbGxlbmdlOiJjaGFsbGVuZ2UiLG9wZW5Db2RpbmdDaGFsbGVuZ2VEaWFsb2c6Im9wZW5Db2RpbmdDaGFsbGVuZ2VEaWFsb2ciLHJlcGVhdENoYWxsZW5nZU5vdGlmaWNhdGlvbjoicmVwZWF0Q2hhbGxlbmdlTm90aWZpY2F0aW9uIix1bmxvY2tIaW50OiJ1bmxvY2tIaW50IixhcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb246ImFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbiIsbGFzdFVubG9ja2VkQ2hhbGxlbmdlS2V5OiJsYXN0VW5sb2NrZWRDaGFsbGVuZ2VLZXkiLGhpZ2hsaWdodENvZGluZ0J1dHRvbjoiaGlnaGxpZ2h0Q29kaW5nQnV0dG9uIixjaGFsbGVuZ2VJZDoiY2hhbGxlbmdlSWQifSxmZWF0dXJlczpbSGVdLGRlY2xzOjIwLHZhcnM6MTMsY29uc3RzOltbImNvZGluZ0NoYWxsZW5nZVRvb2x0aXAiLCJtYXRUb29sdGlwIl0sWyJoaW50VG9vbHRpcCIsIm1hdFRvb2x0aXAiXSxbMSwiY2F0ZWdvcnktcm93Il0sWzEsIm5hbWUtcm93Il0sWzEsImRvdCJdLFsxLCJuYW1lIl0sWzMsImRpZmZpY3VsdHkiLCJhcmlhLWxhYmVsIl0sWzEsImRlc2NyaXB0aW9uLXJvdyIsMywiY2xpY2siLCJpbm5lckh0bWwiXSxbMSwiYm90dG9tLXJvdyJdLFsxLCJ0YWdzIl0sWzEsInRhZyIsMywibWF0VG9vbHRpcCJdLFsxLCJiYWRnZS1ncm91cCJdLFsxLCJiYWRnZSIsMywibWF0VG9vbHRpcCJdLFsxLCJiYWRnZSIsIm5vdC1jb21wbGV0YWJsZSIsMywiZGlzYWJsZWQiLCJuZ0NsYXNzIiwibWF0VG9vbHRpcCJdLFsidGFyZ2V0IiwiX2JsYW5rIiwicmVsIiwibm9vcGVuZXIgbm9yZWZlcnJlciIsImFyaWEtbGFiZWwiLCJWdWxuZXJhYmlsaXR5IG1pdGlnYXRpb24gbGluayIsMSwiYmFkZ2UiLCJub3QtY29tcGxldGFibGUiLDMsImhyZWYiLCJtYXRUb29sdGlwIl0sWzEsImJhZGdlIiwzLCJuZ0NsYXNzIiwibWF0VG9vbHRpcCJdLFsxLCJiYWRnZSIsIm5vdC1jb21wbGV0YWJsZSIsMywibWF0VG9vbHRpcCJdLFsibWF0VG9vbHRpcENsYXNzIiwibXVsdGlsaW5lLXRvb2x0aXAiLDEsImJhZGdlIiwibm90LWNvbXBsZXRhYmxlIiwzLCJwYWRkaW5nIiwibWF0VG9vbHRpcCIsImRpc2FibGVkIl0sWzEsImJhZGdlIiwibm90LWNvbXBsZXRhYmxlIiwzLCJjbGljayIsImRpc2FibGVkIiwibmdDbGFzcyIsIm1hdFRvb2x0aXAiXSxbMSwiYmFkZ2Utc3RhdHVzIl0sWzEsImJhZGdlIiwzLCJjbGljayIsIm5nQ2xhc3MiLCJtYXRUb29sdGlwIl0sWzEsImJhZGdlIiwibm90LWNvbXBsZXRhYmxlIiwzLCJjbGljayIsIm1hdFRvb2x0aXAiXSxbIm1hdFRvb2x0aXBDbGFzcyIsIm11bHRpbGluZS10b29sdGlwIiwxLCJiYWRnZSIsIm5vdC1jb21wbGV0YWJsZSIsMywiY2xpY2siLCJtYXRUb29sdGlwIiwiZGlzYWJsZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsInNwYW4iLDIpLG0oMSkscygpLGMoMiwiZGl2IiwzKSx1KDMsImRpdiIsNCksYyg0LCJzcGFuIiw1KSxtKDUpLHMoKSx1KDYsImRpZmZpY3VsdHktc3RhcnMiLDYpLHMoKSxjKDcsImRpdiIsNyksUygiY2xpY2siLGZ1bmN0aW9uKG8pe3JldHVybiBhLmNvcHlQYXlsb2FkKG8pfSkscygpLGMoOCwiZGl2Iiw4KSg5LCJkaXYiLDkpLHFlKDEwLGVaLDMsNCwic3BhbiIsMTAsRnQpLHMoKSxjKDEyLCJkaXYiLDExKSxNKDEzLHRaLDQsOCwiYnV0dG9uIiwxMiksTSgxNCxpWiw0LDgsImJ1dHRvbiIsMTIpLE0oMTUsblosNiwxMCwiYnV0dG9uIiwxMyksTSgxNixyWiw0LDQsImEiLDE0KSxNKDE3LG9aLDQsNiwiYnV0dG9uIiwxNSksTSgxOCxjWiw0LDMsImJ1dHRvbiIsMTYpLE0oMTksc1osNiwxMywiYnV0dG9uIiwxNykscygpKCkpLGkmMiYmKGwoKSxBKGEuY2hhbGxlbmdlLmNhdGVnb3J5KSxsKDQpLEEoYS5jaGFsbGVuZ2UubmFtZSksbCgpLFJhKCJhcmlhLWxhYmVsIixXMigiRGlmZmljdWx0eSAiLGEuY2hhbGxlbmdlLmRpZmZpY3VsdHksIiBvZiA2IikpLGYoImRpZmZpY3VsdHkiLGEuY2hhbGxlbmdlLmRpZmZpY3VsdHkpLGwoKSxmKCJpbm5lckh0bWwiLGEuY2hhbGxlbmdlLmRlc2NyaXB0aW9uLHR0KSxsKDMpLEdlKGEuY2hhbGxlbmdlLnRhZ0xpc3QpLGwoMyksdyhhLmNoYWxsZW5nZS5kaXNhYmxlZEVudiE9PW51bGwmJmEuY2hhbGxlbmdlLmRpc2FibGVkRW52IT09InNhZmV0eU1vZGUiPzEzOi0xKSxsKCksdyhhLmNoYWxsZW5nZS5kaXNhYmxlZEVudj09PSJzYWZldHlNb2RlIj8xNDotMSksbCgpLHcoYS5hcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb24uY2hhbGxlbmdlcy5jb2RpbmdDaGFsbGVuZ2VzRW5hYmxlZCE9PSJuZXZlciImJmEuY2hhbGxlbmdlLmhhc0NvZGluZ0NoYWxsZW5nZT8xNTotMSksbCgpLHcoYS5jaGFsbGVuZ2UubWl0aWdhdGlvblVybCYmYS5jaGFsbGVuZ2Uuc29sdmVkPzE2Oi0xKSxsKCksdyhhLmNoYWxsZW5nZS5zb2x2ZWQmJmEuYXBwbGljYXRpb25Db25maWd1cmF0aW9uLmN0Zi5zaG93RmxhZ3NJbk5vdGlmaWNhdGlvbnM/MTc6LTEpLGwoKSx3KGEuYXBwbGljYXRpb25Db25maWd1cmF0aW9uLmhhY2tpbmdJbnN0cnVjdG9yLmlzRW5hYmxlZCYmYS5oYXNJbnN0cnVjdGlvbnMoYS5jaGFsbGVuZ2UubmFtZSk/MTg6LTEpLGwoKSx3KGEuY2hhbGxlbmdlLmhpbnRzQXZhaWxhYmxlPjA/MTk6LTEpKX0sZGVwZW5kZW5jaWVzOltsNixSdCxnZSxDZSxUMSxZLEtdLHN0eWxlczpbYFtfbmdob3N0LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10aGVtZS1iYWNrZ3JvdW5kLWRhcmtlcik7Ym9yZGVyLXJhZGl1czoycHg7Ym94LXNoYWRvdzowIDAgMCAycHggIzUwNTA1MDQwO2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLXJvd3M6bWluLWNvbnRlbnQgbWluLWNvbnRlbnQgYXV0byBtaW4tY29udGVudDttYXgtaGVpZ2h0OjE0NHB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOi42MjVyZW0gMS41cmVtfS5zb2x2ZWRbX25naG9zdC0lQ09NUCVde2JvcmRlci10b3A6NHB4IHNvbGlkIHZhcigtLXRoZW1lLWFjY2VudCl9LnNvbHZlZFtfbmdob3N0LSVDT01QJV0gICAuZG90W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRoZW1lLWFjY2VudCl9LnVuc29sdmVkW19uZ2hvc3QtJUNPTVAlXXtib3JkZXItdG9wOjRweCBzb2xpZCByZ2JhKDgwLDgwLDgwLC4yNSl9LnVuc29sdmVkW19uZ2hvc3QtJUNPTVAlXSAgIC5kb3RbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzVjNWM1Y30uZGlzYWJsZWRbX25naG9zdC0lQ09NUCVde2ZpbHRlcjpvcGFjaXR5KC40KX0uZGlzYWJsZWRbX25naG9zdC0lQ09NUCVdICAgLmRvdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10aGVtZS13YXJuLWZhZGUtNDApfS5jYXRlZ29yeS1yb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnZhcigtLXRoZW1lLXRleHQtZmFkZS01MCk7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NjAwO2xpbmUtaGVpZ2h0OjE0cHh9Lm5hbWUtcm93W19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Y29sdW1uLWdhcDouMjVyZW07ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxMnB4IGF1dG8gbWluLWNvbnRlbnQ7bWFyZ2luLXRvcDouNXJlbX0ubmFtZS1yb3dbX25nY29udGVudC0lQ09NUCVdICAgLmRvdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJhZGl1czo1MCU7aGVpZ2h0OjE0cHg7d2lkdGg6MTRweH0ubmFtZS1yb3dbX25nY29udGVudC0lQ09NUCVdICAgLm5hbWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0OjYwMDtsaW5lLWhlaWdodDoxOHB4fS5kaWZmaWN1bHR5W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXh9LmRlc2NyaXB0aW9uLXJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtdGV4dC1mYWRlLTUwKTtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MTRweDttYXJnaW4tdG9wOi42MjVyZW07b3ZlcmZsb3cteTphdXRvfS5kZXNjcmlwdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LXNjcm9sbGJhcntoZWlnaHQ6MTBweDt3aWR0aDoxMHB4fS5kZXNjcmlwdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kOnZhcigtLXRoZW1lLXByaW1hcnktbGlnaHQpO2JvcmRlci1yYWRpdXM6MTBweH0uZGVzY3JpcHRpb24tcm93W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7YmFja2dyb3VuZDp2YXIoLS10aGVtZS1wcmltYXJ5LWRhcmtlcik7Ym9yZGVyLXJhZGl1czoxMHB4fS5kZXNjcmlwdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LXNjcm9sbGJhci1jb3JuZXJ7ZGlzcGxheTpub25lfS5kZXNjcmlwdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVdICAgICBjb2Rle2N1cnNvcjpjb3B5fS5kZXNjcmlwdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVdICAgICBjb2RlOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tdGhlbWUtYmFja2dyb3VuZC1saWdodCl9QHN1cHBvcnRzIG5vdCBzZWxlY3Rvcig6Oi13ZWJraXQtc2Nyb2xsYmFyKXtodG1sW19uZ2NvbnRlbnQtJUNPTVAlXXtzY3JvbGxiYXItd2lkdGg6dGhpbn19LmJvdHRvbS1yb3dbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmVuZDtjb2x1bW4tZ2FwOi4yNXJlbTtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gbWluLWNvbnRlbnQ7bWFyZ2luLXRvcDoxcmVtfS5ib3R0b20tcm93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50YWdzW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOi4yNXJlbX0uYm90dG9tLXJvd1tfbmdjb250ZW50LSVDT01QJV0gICAudGFnW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMzZDNkM2Q7Ym9yZGVyLXJhZGl1czoxLjgyODQ5cHg7Y29sb3I6IzVmYzA5MTtmb250LXNpemU6MTBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MTRweDtwYWRkaW5nOi4yNXJlbX0uYmFkZ2UtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2NvbHVtbi1nYXA6LjI1cmVtO2Rpc3BsYXk6ZmxleH0uYmFkZ2VbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRoZW1lLWJhY2tncm91bmQtbGlnaHRlcik7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czoxMnB4O2NvbG9yOnZhcigtLXRoZW1lLXRleHQpIWltcG9ydGFudDtjb2xvcjp2YXIoLS10aGVtZS10ZXh0KTtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7aGVpZ2h0OjI0cHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjttaW4td2lkdGg6MjRweDtwYWRkaW5nOjA7cG9zaXRpb246cmVsYXRpdmV9LmJhZGdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweDtoZWlnaHQ6MTZweDt3aWR0aDoxNnB4fS5iYWRnZVtfbmdjb250ZW50LSVDT01QJV0gICAuYmFkZ2Utc3RhdHVzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRoZW1lLWJhY2tncm91bmQtZGFya2VyKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLXRoZW1lLWJhY2tncm91bmQtbGlnaHQpO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmc6MCAuMjVyZW07cG9zaXRpb246YWJzb2x1dGU7dG9wOi0zNSV9LmJhZGdlLmNvbXBsZXRlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10aGVtZS1hY2NlbnQpfS5iYWRnZS5jb21wbGV0ZWRbX25nY29udGVudC0lQ09NUCVdICAgLmJhZGdlLXN0YXR1c1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtYWNjZW50KX0uYmFkZ2UucGFydGlhbGx5LWNvbXBsZXRlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10aGVtZS1hY2NlbnQtZGFyayl9LmJhZGdlLnBhcnRpYWxseS1jb21wbGV0ZWRbX25nY29udGVudC0lQ09NUCVdICAgLmJhZGdlLXN0YXR1c1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtYWNjZW50LWRhcmspfS5iYWRnZS5ub3QtY29tcGxldGFibGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dmFyKC0tdGhlbWUtYWNjZW50KX0uYmFkZ2Uubm90LWNvbXBsZXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5iYWRnZS1zdGF0dXNbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnZhcigtLXRoZW1lLWFjY2VudCl9LmJhZGdlW19uZ2NvbnRlbnQtJUNPTVAlXTpkaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRoZW1lLWJhY2tncm91bmQtbGlnaHQpO2N1cnNvcjpub3QtYWxsb3dlZH0uYmFkZ2VbX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkICAgLmJhZGdlLXN0YXR1c1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtYWNjZW50KX0uYmFkZ2Uubm90LWNvbXBsZXRhYmxlLmZsaWNrZXJpbmdbX25nY29udGVudC0lQ09NUCVde2FuaW1hdGlvbjpfbmdjb250ZW50LSVDT01QJV9jb2RpbmctYnV0dG9uLWZsaWNrZXIgLjdzIGVhc2UtaW4tb3V0IGluZmluaXRlO2JveC1zaGFkb3c6MCAwIGNvbG9yLW1peChpbiBzcmdiLHZhcigtLXRoZW1lLWFjY2VudCkgOTAlLHRyYW5zcGFyZW50KX1Aa2V5ZnJhbWVzIF9uZ2NvbnRlbnQtJUNPTVAlX2NvZGluZy1idXR0b24tZmxpY2tlcnswJSx0b3tib3gtc2hhZG93OjAgMCBjb2xvci1taXgoaW4gc3JnYix2YXIoLS10aGVtZS1hY2NlbnQpIDkwJSx0cmFuc3BhcmVudCk7b3BhY2l0eToxO3RyYW5zZm9ybTpzY2FsZSgxKX01MCV7Ym94LXNoYWRvdzowIDAgMjBweCAxMHB4IGNvbG9yLW1peChpbiBzcmdiLHZhcigtLXRoZW1lLWFjY2VudCkgOTAlLHRyYW5zcGFyZW50KTtvcGFjaXR5Oi44NTt0cmFuc2Zvcm06c2NhbGUoMS4wOCl9fQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTt2YXIgbFosZFosZDYsZ2Q9eCgoKT0+e2soKTtsWj1bW1siIiwid2FybmluZy1pY29uIiwiIl1dLFtbIiIsIndhcm5pbmctdGV4dCIsIiJdXSxbWyIiLCJ3YXJuaW5nLWFjdGlvbiIsIiJdXV0sZFo9WyJbd2FybmluZy1pY29uXSIsIlt3YXJuaW5nLXRleHRdIiwiW3dhcm5pbmctYWN0aW9uXSJdLGQ2PSgoKT0+e2NsYXNzIHR7c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sid2FybmluZy1jYXJkIl1dLG5nQ29udGVudFNlbGVjdG9yczpkWixkZWNsczo3LHZhcnM6MCxjb25zdHM6W1sxLCJ3YXJuaW5nLWNvbnRhaW5lciJdLFsxLCJ3YXJuaW5nLXRleHQtaWNvbi1ncm91cCJdLFsxLCJ3YXJuaW5nLXRleHQiXSxbMSwid2FybmluZy1hY3Rpb24iXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihSZShsWiksR3QoMCwiZGl2IiwwKSgxLCJkaXYiLDEpLG1lKDIpLEd0KDMsInNwYW4iLDIpLG1lKDQsMSksSnQoKSgpLEd0KDUsImRpdiIsMyksbWUoNiwyKSxKdCgpKCkpfSxzdHlsZXM6W2Aud2FybmluZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRoZW1lLWJhY2tncm91bmQtZGFyayk7Ym9yZGVyLXJhZGl1czo0cHg7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczphdXRvIG1pbi1jb250ZW50O21hcmdpbi10b3A6MXJlbTtwYWRkaW5nOi42MjVyZW19QG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KXsud2FybmluZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2dyaWQtdGVtcGxhdGUtY29sdW1uczphdXRvO3Jvdy1nYXA6LjYyNXJlbX19Lndhcm5pbmctdGV4dFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6LjYyNXJlbTtwYWRkaW5nLXJpZ2h0Oi41cmVtfS53YXJuaW5nLXRleHQtaWNvbi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWluLWNvbnRlbnQgYXV0b30KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gaFoodCxuKXtpZih0JjEmJihjKDAsIndhcm5pbmctY2FyZCIpKDEsIm1hdC1pY29uIiwwKSxtKDIsInNjaG9vbCIpLHMoKSxjKDMsInNwYW4iLDEpLG0oNCksYig1LCJ0cmFuc2xhdGUiKSxzKCkoKSksdCYyKXtsZXQgZT12KCk7bCg0KSxFKCIgIixkdCg1LDEsIklORk9fRlVMTF9DSEFMTEVOR0VfTU9ERSIsYnQoNCxtWixlLmFsbENoYWxsZW5nZXMubGVuZ3RoKSksIiAiKX19dmFyIG1aLFl3LFp3PXgoKCk9PntXKCk7dmUoKTtnZCgpO2soKTt2ZSgpO1coKTttWj10PT4oe251bTp0fSk7WXc9KCgpPT57Y2xhc3MgdHthbGxDaGFsbGVuZ2VzO2FwcGxpY2F0aW9uQ29uZmlnPW51bGw7dHV0b3JpYWxNb2RlQWN0aXZlPW51bGw7bmdPbkNoYW5nZXMoKXtpZighdGhpcy5hcHBsaWNhdGlvbkNvbmZpZz8uY2hhbGxlbmdlcz8ucmVzdHJpY3RUb1R1dG9yaWFsc0ZpcnN0KXt0aGlzLnR1dG9yaWFsTW9kZUFjdGl2ZT0hMTtyZXR1cm59bGV0IGU9dGhpcy5hbGxDaGFsbGVuZ2VzLmZpbHRlcihpPT5pLnR1dG9yaWFsT3JkZXIhPT1udWxsKS5ldmVyeShpPT5pLnNvbHZlZCk7dGhpcy50dXRvcmlhbE1vZGVBY3RpdmU9IWV9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1sidHV0b3JpYWwtbW9kZS13YXJuaW5nIl1dLGlucHV0czp7YWxsQ2hhbGxlbmdlczoiYWxsQ2hhbGxlbmdlcyIsYXBwbGljYXRpb25Db25maWc6ImFwcGxpY2F0aW9uQ29uZmlnIn0sZmVhdHVyZXM6W0hlXSxkZWNsczoxLHZhcnM6MSxjb25zdHM6W1sid2FybmluZy1pY29uIiwiIl0sWyJ3YXJuaW5nLXRleHQiLCIiLDEsInR1dG9yaWFsLW1vZGUtd2FybmluZy10ZXh0Il1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiZNKDAsaFosNiw2LCJ3YXJuaW5nLWNhcmQiKSxpJjImJncoYS50dXRvcmlhbE1vZGVBY3RpdmU/MDotMSl9LGRlcGVuZGVuY2llczpbZDYsZ2UsQ2UsWSxLXSxlbmNhcHN1bGF0aW9uOjJ9KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiB1Wih0LG4pe2lmKHQmMSYmdSgwLCJpIiwxKSx0JjIpe2xldCBlPXYoMik7ZigibmdDbGFzcyIsImZhYiBmYS0iK2UuZGlzYWJsZWRCZWNhdXNlT2ZFbnYudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKX19ZnVuY3Rpb24gZ1oodCxuKXtpZih0JjEmJnUoMCwiaSIsMSksdCYyKXtsZXQgZT12KDIpO2YoIm5nQ2xhc3MiLCJpY29uLSIrZS5kaXNhYmxlZEJlY2F1c2VPZkVudi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpfX1mdW5jdGlvbiB2Wih0LG4pe2lmKHQmMSYmKHUoMCwic3BhbiIsMiksYigxLCJ0cmFuc2xhdGUiKSksdCYyKXtsZXQgZT12KDIpO2YoImlubmVySFRNTCIsZHQoMSwxLCJJTkZPX0RJU0FCTEVEX0NIQUxMRU5HRVMiLGJ0KDQscFosZS5udW1iZXJPZkRpc2FibGVkQ2hhbGxlbmdlcykpLHR0KX19ZnVuY3Rpb24gX1oodCxuKXtpZih0JjEmJih1KDAsInNwYW4iLDIpLGIoMSwidHJhbnNsYXRlIikpLHQmMil7bGV0IGU9digyKTtmKCJpbm5lckhUTUwiLGR0KDEsMSwiSU5GT19ESVNBQkxFRF9DSEFMTEVOR0VTIix6MSg0LGZaLGUubnVtYmVyT2ZEaXNhYmxlZENoYWxsZW5nZXMsZS5kaXNhYmxlZEJlY2F1c2VPZkVudikpLHR0KX19ZnVuY3Rpb24gYloodCxuKXt0JjEmJihtKDApLGIoMSwidHJhbnNsYXRlIikpLHQmMiYmRSgiICIsQygxLDEsIkhJREVfRElTQUJMRURfQ0hBTExFTkdFUyIpLCIgIil9ZnVuY3Rpb24gQ1oodCxuKXt0JjEmJihtKDApLGIoMSwidHJhbnNsYXRlIikpLHQmMiYmRSgiICIsQygxLDEsIlNIT1dfRElTQUJMRURfQ0hBTExFTkdFUyIpLCIgIil9ZnVuY3Rpb24geVoodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsIndhcm5pbmctY2FyZCIpLF9lKDEsMCksTSgyLHVaLDEsMSwiaSIsMSkoMyxnWiwxLDEsImkiLDEpLGJlKCksTSg0LHZaLDIsNiwic3BhbiIsMikoNSxfWiwyLDcsInNwYW4iLDIpLGMoNiwiYnV0dG9uIiwzKSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KGUpO2xldCBhPXYoKTtyZXR1cm4gVChhLnRvZ2dsZVNob3dEaXNhYmxlZENoYWxsZW5nZXMoKSl9KSxNKDcsYlosMiwzKSg4LENaLDIsMykscygpKCl9aWYodCYyKXtsZXQgZT12KCk7bCgyKSx3KGUuZGlzYWJsZWRCZWNhdXNlT2ZFbnY9PT0iV2luZG93cyI/MjozKSxsKDIpLHcoZS5kaXNhYmxlZEJlY2F1c2VPZkVudj09PSJTYWZldHkgTW9kZSI/NDo1KSxsKDMpLHcoZS5maWx0ZXJTZXR0aW5nLnNob3dEaXNhYmxlZENoYWxsZW5nZXM9PT0hMD83OjgpfX12YXIgcFosZlosJHcsS3c9eCgoKT0+e2soKTtXKCk7bmUoKTtnZCgpO2ExKCk7aygpO25lKCk7VygpO3BaPXQ9Pih7bnVtOnQsZW52OiJzYWZldHkgbW9kZSBiZWluZyB0dXJuZWQgb24ifSksZlo9KHQsbik9Pih7bnVtOnQsZW52Om59KTskdz0oKCk9PntjbGFzcyB0e2NoYWxsZW5nZXM7ZmlsdGVyU2V0dGluZztmaWx0ZXJTZXR0aW5nQ2hhbmdlPW5ldyBOO251bWJlck9mRGlzYWJsZWRDaGFsbGVuZ2VzPTA7ZGlzYWJsZWRCZWNhdXNlT2ZFbnY9bnVsbDtkaXNhYmxlZE9uV2luZG93cztudW1iZXJPZkRpc2FibGVkQ2hhbGxlbmdlc09uV2luZG93cz0wO25nT25DaGFuZ2VzKCl7bGV0IGU9dGhpcy5jaGFsbGVuZ2VzLmZpbHRlcihhPT5hLmRpc2FibGVkRW52IT09bnVsbCksaT1lLmZpbHRlcihhPT5hLmRpc2FibGVkRW52PT09IldpbmRvd3MiKTt0aGlzLm51bWJlck9mRGlzYWJsZWRDaGFsbGVuZ2VzPWUubGVuZ3RoLHRoaXMubnVtYmVyT2ZEaXNhYmxlZENoYWxsZW5nZXM+MCYmKHRoaXMuZGlzYWJsZWRCZWNhdXNlT2ZFbnY9ZVswXS5kaXNhYmxlZEVudiksaS5sZW5ndGg+MCYmKHRoaXMuZGlzYWJsZWRPbldpbmRvd3M9ITAsdGhpcy5udW1iZXJPZkRpc2FibGVkQ2hhbGxlbmdlc09uV2luZG93cz1pLmxlbmd0aCl9dG9nZ2xlU2hvd0Rpc2FibGVkQ2hhbGxlbmdlcygpe2xldCBlPVUxKFhlKHt9LHN0cnVjdHVyZWRDbG9uZSh0aGlzLmZpbHRlclNldHRpbmcpKSx7c2hvd0Rpc2FibGVkQ2hhbGxlbmdlczohdGhpcy5maWx0ZXJTZXR0aW5nLnNob3dEaXNhYmxlZENoYWxsZW5nZXN9KTt0aGlzLmZpbHRlclNldHRpbmc9ZSx0aGlzLmZpbHRlclNldHRpbmdDaGFuZ2UuZW1pdChlKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJjaGFsbGVuZ2VzLXVuYXZhaWxhYmxlLXdhcm5pbmciXV0saW5wdXRzOntjaGFsbGVuZ2VzOiJjaGFsbGVuZ2VzIixmaWx0ZXJTZXR0aW5nOiJmaWx0ZXJTZXR0aW5nIn0sb3V0cHV0czp7ZmlsdGVyU2V0dGluZ0NoYW5nZToiZmlsdGVyU2V0dGluZ0NoYW5nZSJ9LGZlYXR1cmVzOltIZV0sZGVjbHM6MSx2YXJzOjEsY29uc3RzOltbIndhcm5pbmctaWNvbiIsIiJdLFsxLCJlbnYtaWNvbiIsMywibmdDbGFzcyJdLFsid2FybmluZy10ZXh0IiwiIiwzLCJpbm5lckhUTUwiXSxbIndhcm5pbmctYWN0aW9uIiwiIiwibWF0LWJ1dHRvbiIsIiIsImNvbG9yIiwiYWNjZW50IiwzLCJjbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmTSgwLHlaLDksMywid2FybmluZy1jYXJkIiksaSYyJiZ3KGEubnVtYmVyT2ZEaXNhYmxlZENoYWxsZW5nZXM+MD8wOi0xKX0sZGVwZW5kZW5jaWVzOltkNixUMSxvZSxsZSxZLEtdLHN0eWxlczpbYC5lbnYtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHg7cGFkZGluZzouMTI1cmVtfQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBNWih0LG4pe2lmKHQmMSYmKE10KCksYygwLCJzdmciLDExKSx1KDEsImNpcmNsZSIsMTIpLHMoKSksdCYyKXtsZXQgZT12KCk7Rygidmlld0JveCIsZS5fdmlld0JveCgpKSxsKCksX3QoInN0cm9rZS1kYXNoYXJyYXkiLGUuX3N0cm9rZUNpcmN1bWZlcmVuY2UoKSwicHgiKSgic3Ryb2tlLWRhc2hvZmZzZXQiLGUuX3N0cm9rZUNpcmN1bWZlcmVuY2UoKS8yLCJweCIpKCJzdHJva2Utd2lkdGgiLGUuX2NpcmNsZVN0cm9rZVdpZHRoKCksIiUiKSxHKCJyIixlLl9jaXJjbGVSYWRpdXMoKSl9fWZ1bmN0aW9uIFNaKCl7cmV0dXJue2RpYW1ldGVyOlh3fX12YXIgeFosd1osWHcsa1osSncsZVM9eCgoKT0+e2soKTtrKCk7YTEoKTtmaSgpO3haPVsiZGV0ZXJtaW5hdGVTcGlubmVyIl07d1o9bmV3IGNlKCJtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1kZWZhdWx0LW9wdGlvbnMiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OlNafSk7WHc9MTAwLGtaPTEwLEp3PSgoKT0+e2NsYXNzIHR7X2VsZW1lbnRSZWY9aChhZSk7X25vb3BBbmltYXRpb25zO2dldCBjb2xvcigpe3JldHVybiB0aGlzLl9jb2xvcnx8dGhpcy5fZGVmYXVsdENvbG9yfXNldCBjb2xvcihlKXt0aGlzLl9jb2xvcj1lfV9jb2xvcjtfZGVmYXVsdENvbG9yPSJwcmltYXJ5IjtfZGV0ZXJtaW5hdGVDaXJjbGU7Y29uc3RydWN0b3IoKXtsZXQgZT1oKHdaKSxpPVQwKCksYT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7dGhpcy5fbm9vcEFuaW1hdGlvbnM9aT09PSJkaS1kaXNhYmxlZCImJiEhZSYmIWUuX2ZvcmNlQW5pbWF0aW9ucyx0aGlzLm1vZGU9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Im1hdC1zcGlubmVyIj8iaW5kZXRlcm1pbmF0ZSI6ImRldGVybWluYXRlIiwhdGhpcy5fbm9vcEFuaW1hdGlvbnMmJmk9PT0icmVkdWNlZC1tb3Rpb24iJiZhLmNsYXNzTGlzdC5hZGQoIm1hdC1wcm9ncmVzcy1zcGlubmVyLXJlZHVjZWQtbW90aW9uIiksZSYmKGUuY29sb3ImJih0aGlzLmNvbG9yPXRoaXMuX2RlZmF1bHRDb2xvcj1lLmNvbG9yKSxlLmRpYW1ldGVyJiYodGhpcy5kaWFtZXRlcj1lLmRpYW1ldGVyKSxlLnN0cm9rZVdpZHRoJiYodGhpcy5zdHJva2VXaWR0aD1lLnN0cm9rZVdpZHRoKSl9bW9kZTtnZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5tb2RlPT09ImRldGVybWluYXRlIj90aGlzLl92YWx1ZTowfXNldCB2YWx1ZShlKXt0aGlzLl92YWx1ZT1NYXRoLm1heCgwLE1hdGgubWluKDEwMCxlfHwwKSl9X3ZhbHVlPTA7Z2V0IGRpYW1ldGVyKCl7cmV0dXJuIHRoaXMuX2RpYW1ldGVyfXNldCBkaWFtZXRlcihlKXt0aGlzLl9kaWFtZXRlcj1lfHwwfV9kaWFtZXRlcj1YdztnZXQgc3Ryb2tlV2lkdGgoKXtyZXR1cm4gdGhpcy5fc3Ryb2tlV2lkdGg/P3RoaXMuZGlhbWV0ZXIvMTB9c2V0IHN0cm9rZVdpZHRoKGUpe3RoaXMuX3N0cm9rZVdpZHRoPWV8fDB9X3N0cm9rZVdpZHRoO19jaXJjbGVSYWRpdXMoKXtyZXR1cm4odGhpcy5kaWFtZXRlci1rWikvMn1fdmlld0JveCgpe2xldCBlPXRoaXMuX2NpcmNsZVJhZGl1cygpKjIrdGhpcy5zdHJva2VXaWR0aDtyZXR1cm5gMCAwICR7ZX0gJHtlfWB9X3N0cm9rZUNpcmN1bWZlcmVuY2UoKXtyZXR1cm4gMipNYXRoLlBJKnRoaXMuX2NpcmNsZVJhZGl1cygpfV9zdHJva2VEYXNoT2Zmc2V0KCl7cmV0dXJuIHRoaXMubW9kZT09PSJkZXRlcm1pbmF0ZSI/dGhpcy5fc3Ryb2tlQ2lyY3VtZmVyZW5jZSgpKigxMDAtdGhpcy5fdmFsdWUpLzEwMDpudWxsfV9jaXJjbGVTdHJva2VXaWR0aCgpe3JldHVybiB0aGlzLnN0cm9rZVdpZHRoL3RoaXMuZGlhbWV0ZXIqMTAwfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbIm1hdC1wcm9ncmVzcy1zcGlubmVyIl0sWyJtYXQtc3Bpbm5lciJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24oaSxhKXtpZihpJjEmJnRlKHhaLDUpLGkmMil7bGV0IHI7RihyPUIoKSkmJihhLl9kZXRlcm1pbmF0ZUNpcmNsZT1yLmZpcnN0KX19LGhvc3RBdHRyczpbInJvbGUiLCJwcm9ncmVzc2JhciIsInRhYmluZGV4IiwiLTEiLDEsIm1hdC1tZGMtcHJvZ3Jlc3Mtc3Bpbm5lciIsIm1kYy1jaXJjdWxhci1wcm9ncmVzcyJdLGhvc3RWYXJzOjE4LGhvc3RCaW5kaW5nczpmdW5jdGlvbihpLGEpe2kmMiYmKEcoImFyaWEtdmFsdWVtaW4iLDApKCJhcmlhLXZhbHVlbWF4IiwxMDApKCJhcmlhLXZhbHVlbm93IixhLm1vZGU9PT0iZGV0ZXJtaW5hdGUiP2EudmFsdWU6bnVsbCkoIm1vZGUiLGEubW9kZSksRHQoIm1hdC0iK2EuY29sb3IpLF90KCJ3aWR0aCIsYS5kaWFtZXRlciwicHgiKSgiaGVpZ2h0IixhLmRpYW1ldGVyLCJweCIpKCItLW1hdC1wcm9ncmVzcy1zcGlubmVyLXNpemUiLGEuZGlhbWV0ZXIrInB4IikoIi0tbWF0LXByb2dyZXNzLXNwaW5uZXItYWN0aXZlLWluZGljYXRvci13aWR0aCIsYS5kaWFtZXRlcisicHgiKSxpZSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLGEuX25vb3BBbmltYXRpb25zKSgibWRjLWNpcmN1bGFyLXByb2dyZXNzLS1pbmRldGVybWluYXRlIixhLm1vZGU9PT0iaW5kZXRlcm1pbmF0ZSIpKX0saW5wdXRzOntjb2xvcjoiY29sb3IiLG1vZGU6Im1vZGUiLHZhbHVlOlsyLCJ2YWx1ZSIsInZhbHVlIixvdF0sZGlhbWV0ZXI6WzIsImRpYW1ldGVyIiwiZGlhbWV0ZXIiLG90XSxzdHJva2VXaWR0aDpbMiwic3Ryb2tlV2lkdGgiLCJzdHJva2VXaWR0aCIsb3RdfSxleHBvcnRBczpbIm1hdFByb2dyZXNzU3Bpbm5lciJdLGRlY2xzOjE0LHZhcnM6MTEsY29uc3RzOltbImNpcmNsZSIsIiJdLFsiZGV0ZXJtaW5hdGVTcGlubmVyIiwiIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLDEsIm1kYy1jaXJjdWxhci1wcm9ncmVzc19fZGV0ZXJtaW5hdGUtY29udGFpbmVyIl0sWyJ4bWxucyIsImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZm9jdXNhYmxlIiwiZmFsc2UiLDEsIm1kYy1jaXJjdWxhci1wcm9ncmVzc19fZGV0ZXJtaW5hdGUtY2lyY2xlLWdyYXBoaWMiXSxbImN4IiwiNTAlIiwiY3kiLCI1MCUiLDEsIm1kYy1jaXJjdWxhci1wcm9ncmVzc19fZGV0ZXJtaW5hdGUtY2lyY2xlIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLDEsIm1kYy1jaXJjdWxhci1wcm9ncmVzc19faW5kZXRlcm1pbmF0ZS1jb250YWluZXIiXSxbMSwibWRjLWNpcmN1bGFyLXByb2dyZXNzX19zcGlubmVyLWxheWVyIl0sWzEsIm1kYy1jaXJjdWxhci1wcm9ncmVzc19fY2lyY2xlLWNsaXBwZXIiLCJtZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2NpcmNsZS1sZWZ0Il0sWzMsIm5nVGVtcGxhdGVPdXRsZXQiXSxbMSwibWRjLWNpcmN1bGFyLXByb2dyZXNzX19nYXAtcGF0Y2giXSxbMSwibWRjLWNpcmN1bGFyLXByb2dyZXNzX19jaXJjbGUtY2xpcHBlciIsIm1kYy1jaXJjdWxhci1wcm9ncmVzc19fY2lyY2xlLXJpZ2h0Il0sWyJ4bWxucyIsImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZm9jdXNhYmxlIiwiZmFsc2UiLDEsIm1kYy1jaXJjdWxhci1wcm9ncmVzc19faW5kZXRlcm1pbmF0ZS1jaXJjbGUtZ3JhcGhpYyJdLFsiY3giLCI1MCUiLCJjeSIsIjUwJSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2lmKGkmMSYmKFIoMCxNWiwyLDgsIm5nLXRlbXBsYXRlIixudWxsLDAsUTIpLGMoMiwiZGl2IiwyLDEpLE10KCksYyg0LCJzdmciLDMpLHUoNSwiY2lyY2xlIiw0KSxzKCkoKSx5aSgpLGMoNiwiZGl2Iiw1KSg3LCJkaXYiLDYpKDgsImRpdiIsNyksXzEoOSw4KSxzKCksYygxMCwiZGl2Iiw5KSxfMSgxMSw4KSxzKCksYygxMiwiZGl2IiwxMCksXzEoMTMsOCkscygpKCkoKSksaSYyKXtsZXQgcj1zZSgxKTtsKDQpLEcoInZpZXdCb3giLGEuX3ZpZXdCb3goKSksbCgpLF90KCJzdHJva2UtZGFzaGFycmF5IixhLl9zdHJva2VDaXJjdW1mZXJlbmNlKCksInB4IikoInN0cm9rZS1kYXNob2Zmc2V0IixhLl9zdHJva2VEYXNoT2Zmc2V0KCksInB4IikoInN0cm9rZS13aWR0aCIsYS5fY2lyY2xlU3Ryb2tlV2lkdGgoKSwiJSIpLEcoInIiLGEuX2NpcmNsZVJhZGl1cygpKSxsKDQpLGYoIm5nVGVtcGxhdGVPdXRsZXQiLHIpLGwoMiksZigibmdUZW1wbGF0ZU91dGxldCIsciksbCgyKSxmKCJuZ1RlbXBsYXRlT3V0bGV0IixyKX19LGRlcGVuZGVuY2llczpbdnJdLHN0eWxlczpbYC5tYXQtbWRjLXByb2dyZXNzLXNwaW5uZXJ7LS1tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1hbmltYXRpb24tbXVsdGlwbGllcjogMTtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjtsaW5lLWhlaWdodDowO3Bvc2l0aW9uOnJlbGF0aXZlO2RpcmVjdGlvbjpsdHI7dHJhbnNpdGlvbjpvcGFjaXR5IDI1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuNiwgMSl9Lm1hdC1tZGMtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlLXdpZHRoOnZhcigtLW1hdC1wcm9ncmVzcy1zcGlubmVyLWFjdGl2ZS1pbmRpY2F0b3Itd2lkdGgsIDRweCl9Lm1hdC1tZGMtcHJvZ3Jlc3Mtc3Bpbm5lci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSwubWF0LW1kYy1wcm9ncmVzcy1zcGlubmVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2RldGVybWluYXRlLWNpcmNsZXt0cmFuc2l0aW9uOm5vbmUgIWltcG9ydGFudH0ubWF0LW1kYy1wcm9ncmVzcy1zcGlubmVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2luZGV0ZXJtaW5hdGUtY2lyY2xlLWdyYXBoaWMsLm1hdC1tZGMtcHJvZ3Jlc3Mtc3Bpbm5lci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWRjLWNpcmN1bGFyLXByb2dyZXNzX19zcGlubmVyLWxheWVyLC5tYXQtbWRjLXByb2dyZXNzLXNwaW5uZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1kYy1jaXJjdWxhci1wcm9ncmVzc19faW5kZXRlcm1pbmF0ZS1jb250YWluZXJ7YW5pbWF0aW9uOm5vbmUgIWltcG9ydGFudH0ubWF0LW1kYy1wcm9ncmVzcy1zcGlubmVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2luZGV0ZXJtaW5hdGUtY29udGFpbmVyIGNpcmNsZXtzdHJva2UtZGFzaGFycmF5OjAgIWltcG9ydGFudH1AbWVkaWEoZm9yY2VkLWNvbG9yczogYWN0aXZlKXsubWF0LW1kYy1wcm9ncmVzcy1zcGlubmVyIC5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2luZGV0ZXJtaW5hdGUtY2lyY2xlLWdyYXBoaWMsLm1hdC1tZGMtcHJvZ3Jlc3Mtc3Bpbm5lciAubWRjLWNpcmN1bGFyLXByb2dyZXNzX19kZXRlcm1pbmF0ZS1jaXJjbGV7c3Ryb2tlOmN1cnJlbnRDb2xvcjtzdHJva2U6Q2FudmFzVGV4dH19Lm1hdC1wcm9ncmVzcy1zcGlubmVyLXJlZHVjZWQtbW90aW9uey0tbWF0LXByb2dyZXNzLXNwaW5uZXItYW5pbWF0aW9uLW11bHRpcGxpZXI6IDEuMjV9Lm1kYy1jaXJjdWxhci1wcm9ncmVzc19fZGV0ZXJtaW5hdGUtY29udGFpbmVyLC5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2luZGV0ZXJtaW5hdGUtY2lyY2xlLWdyYXBoaWMsLm1kYy1jaXJjdWxhci1wcm9ncmVzc19faW5kZXRlcm1pbmF0ZS1jb250YWluZXIsLm1kYy1jaXJjdWxhci1wcm9ncmVzc19fc3Bpbm5lci1sYXllcntwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2RldGVybWluYXRlLWNvbnRhaW5lcnt0cmFuc2Zvcm06cm90YXRlKC05MGRlZyl9Lm1kYy1jaXJjdWxhci1wcm9ncmVzcy0taW5kZXRlcm1pbmF0ZSAubWRjLWNpcmN1bGFyLXByb2dyZXNzX19kZXRlcm1pbmF0ZS1jb250YWluZXJ7b3BhY2l0eTowfS5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2luZGV0ZXJtaW5hdGUtY29udGFpbmVye2ZvbnQtc2l6ZTowO2xldHRlci1zcGFjaW5nOjA7d2hpdGUtc3BhY2U6bm93cmFwO29wYWNpdHk6MH0ubWRjLWNpcmN1bGFyLXByb2dyZXNzLS1pbmRldGVybWluYXRlIC5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2luZGV0ZXJtaW5hdGUtY29udGFpbmVye29wYWNpdHk6MTthbmltYXRpb246bWRjLWNpcmN1bGFyLXByb2dyZXNzLWNvbnRhaW5lci1yb3RhdGUgY2FsYygxNTY4LjIzNTI5NDExNzZtcyp2YXIoLS1tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1hbmltYXRpb24tbXVsdGlwbGllcikpIGxpbmVhciBpbmZpbml0ZX0ubWRjLWNpcmN1bGFyLXByb2dyZXNzX19kZXRlcm1pbmF0ZS1jaXJjbGUtZ3JhcGhpYywubWRjLWNpcmN1bGFyLXByb2dyZXNzX19pbmRldGVybWluYXRlLWNpcmNsZS1ncmFwaGlje2ZpbGw6cmdiYSgwLDAsMCwwKX0ubWF0LW1kYy1wcm9ncmVzcy1zcGlubmVyIC5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2RldGVybWluYXRlLWNpcmNsZSwubWF0LW1kYy1wcm9ncmVzcy1zcGlubmVyIC5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2luZGV0ZXJtaW5hdGUtY2lyY2xlLWdyYXBoaWN7c3Ryb2tlOnZhcigtLW1hdC1wcm9ncmVzcy1zcGlubmVyLWFjdGl2ZS1pbmRpY2F0b3ItY29sb3IsIHZhcigtLW1hdC1zeXMtcHJpbWFyeSkpfUBtZWRpYShmb3JjZWQtY29sb3JzOiBhY3RpdmUpey5tYXQtbWRjLXByb2dyZXNzLXNwaW5uZXIgLm1kYy1jaXJjdWxhci1wcm9ncmVzc19fZGV0ZXJtaW5hdGUtY2lyY2xlLC5tYXQtbWRjLXByb2dyZXNzLXNwaW5uZXIgLm1kYy1jaXJjdWxhci1wcm9ncmVzc19faW5kZXRlcm1pbmF0ZS1jaXJjbGUtZ3JhcGhpY3tzdHJva2U6Q2FudmFzVGV4dH19Lm1kYy1jaXJjdWxhci1wcm9ncmVzc19fZGV0ZXJtaW5hdGUtY2lyY2xle3RyYW5zaXRpb246c3Ryb2tlLWRhc2hvZmZzZXQgNTAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSl9Lm1kYy1jaXJjdWxhci1wcm9ncmVzc19fZ2FwLXBhdGNoe3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6NDcuNSU7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjUlO2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0ubWRjLWNpcmN1bGFyLXByb2dyZXNzX19nYXAtcGF0Y2ggLm1kYy1jaXJjdWxhci1wcm9ncmVzc19faW5kZXRlcm1pbmF0ZS1jaXJjbGUtZ3JhcGhpY3tsZWZ0Oi05MDAlO3dpZHRoOjIwMDAlO3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKX0ubWRjLWNpcmN1bGFyLXByb2dyZXNzX19jaXJjbGUtY2xpcHBlciAubWRjLWNpcmN1bGFyLXByb2dyZXNzX19pbmRldGVybWluYXRlLWNpcmNsZS1ncmFwaGlje3dpZHRoOjIwMCV9Lm1kYy1jaXJjdWxhci1wcm9ncmVzc19fY2lyY2xlLXJpZ2h0IC5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2luZGV0ZXJtaW5hdGUtY2lyY2xlLWdyYXBoaWN7bGVmdDotMTAwJX0ubWRjLWNpcmN1bGFyLXByb2dyZXNzLS1pbmRldGVybWluYXRlIC5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2NpcmNsZS1sZWZ0IC5tZGMtY2lyY3VsYXItcHJvZ3Jlc3NfX2luZGV0ZXJtaW5hdGUtY2lyY2xlLWdyYXBoaWN7YW5pbWF0aW9uOm1kYy1jaXJjdWxhci1wcm9ncmVzcy1sZWZ0LXNwaW4gY2FsYygxMzMzbXMqdmFyKC0tbWF0LXByb2dyZXNzLXNwaW5uZXItYW5pbWF0aW9uLW11bHRpcGxpZXIpKSBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpIGluZmluaXRlIGJvdGh9Lm1kYy1jaXJjdWxhci1wcm9ncmVzcy0taW5kZXRlcm1pbmF0ZSAubWRjLWNpcmN1bGFyLXByb2dyZXNzX19jaXJjbGUtcmlnaHQgLm1kYy1jaXJjdWxhci1wcm9ncmVzc19faW5kZXRlcm1pbmF0ZS1jaXJjbGUtZ3JhcGhpY3thbmltYXRpb246bWRjLWNpcmN1bGFyLXByb2dyZXNzLXJpZ2h0LXNwaW4gY2FsYygxMzMzbXMqdmFyKC0tbWF0LXByb2dyZXNzLXNwaW5uZXItYW5pbWF0aW9uLW11bHRpcGxpZXIpKSBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpIGluZmluaXRlIGJvdGh9Lm1kYy1jaXJjdWxhci1wcm9ncmVzc19fY2lyY2xlLWNsaXBwZXJ7ZGlzcGxheTppbmxpbmUtZmxleDtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDo1MCU7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufS5tZGMtY2lyY3VsYXItcHJvZ3Jlc3MtLWluZGV0ZXJtaW5hdGUgLm1kYy1jaXJjdWxhci1wcm9ncmVzc19fc3Bpbm5lci1sYXllcnthbmltYXRpb246bWRjLWNpcmN1bGFyLXByb2dyZXNzLXNwaW5uZXItbGF5ZXItcm90YXRlIGNhbGMoNTMzMm1zKnZhcigtLW1hdC1wcm9ncmVzcy1zcGlubmVyLWFuaW1hdGlvbi1tdWx0aXBsaWVyKSkgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSBpbmZpbml0ZSBib3RofUBrZXlmcmFtZXMgbWRjLWNpcmN1bGFyLXByb2dyZXNzLWNvbnRhaW5lci1yb3RhdGV7dG97dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIG1kYy1jaXJjdWxhci1wcm9ncmVzcy1zcGlubmVyLWxheWVyLXJvdGF0ZXsxMi41JXt0cmFuc2Zvcm06cm90YXRlKDEzNWRlZyl9MjUle3RyYW5zZm9ybTpyb3RhdGUoMjcwZGVnKX0zNy41JXt0cmFuc2Zvcm06cm90YXRlKDQwNWRlZyl9NTAle3RyYW5zZm9ybTpyb3RhdGUoNTQwZGVnKX02Mi41JXt0cmFuc2Zvcm06cm90YXRlKDY3NWRlZyl9NzUle3RyYW5zZm9ybTpyb3RhdGUoODEwZGVnKX04Ny41JXt0cmFuc2Zvcm06cm90YXRlKDk0NWRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDEwODBkZWcpfX1Aa2V5ZnJhbWVzIG1kYy1jaXJjdWxhci1wcm9ncmVzcy1sZWZ0LXNwaW57ZnJvbXt0cmFuc2Zvcm06cm90YXRlKDI2NWRlZyl9NTAle3RyYW5zZm9ybTpyb3RhdGUoMTMwZGVnKX10b3t0cmFuc2Zvcm06cm90YXRlKDI2NWRlZyl9fUBrZXlmcmFtZXMgbWRjLWNpcmN1bGFyLXByb2dyZXNzLXJpZ2h0LXNwaW57ZnJvbXt0cmFuc2Zvcm06cm90YXRlKC0yNjVkZWcpfTUwJXt0cmFuc2Zvcm06cm90YXRlKC0xMzBkZWcpfXRve3RyYW5zZm9ybTpyb3RhdGUoLTI2NWRlZyl9fQpgXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KX1yZXR1cm4gdH0pKCl9KTt2YXIgdFM9VGUoKHZkLF9kKT0+eyhmdW5jdGlvbih0LG4pe3R5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLG4pOnR5cGVvZiB2ZDwidSI/bigpOihuKCksdC5GaWxlU2F2ZXI9e30pfSkodmQsZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdChkLHApe3JldHVybiB0eXBlb2YgcD4idSI/cD17YXV0b0JvbTohMX06dHlwZW9mIHAhPSJvYmplY3QiJiYoY29uc29sZS53YXJuKCJEZXByZWNhdGVkOiBFeHBlY3RlZCB0aGlyZCBhcmd1bWVudCB0byBiZSBhIG9iamVjdCIpLHA9e2F1dG9Cb206IXB9KSxwLmF1dG9Cb20mJi9eXHMqKD86dGV4dFwvXFMqfGFwcGxpY2F0aW9uXC94bWx8XFMqXC9cUypcK3htbClccyo7LipjaGFyc2V0XHMqPVxzKnV0Zi04L2kudGVzdChkLnR5cGUpP25ldyBCbG9iKFsiXHVGRUZGIixkXSx7dHlwZTpkLnR5cGV9KTpkfWZ1bmN0aW9uIG4oZCxwLGcpe3ZhciBfPW5ldyBYTUxIdHRwUmVxdWVzdDtfLm9wZW4oIkdFVCIsZCksXy5yZXNwb25zZVR5cGU9ImJsb2IiLF8ub25sb2FkPWZ1bmN0aW9uKCl7byhfLnJlc3BvbnNlLHAsZyl9LF8ub25lcnJvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoImNvdWxkIG5vdCBkb3dubG9hZCBmaWxlIil9LF8uc2VuZCgpfWZ1bmN0aW9uIGUoZCl7dmFyIHA9bmV3IFhNTEh0dHBSZXF1ZXN0O3Aub3BlbigiSEVBRCIsZCwhMSk7dHJ5e3Auc2VuZCgpfWNhdGNoe31yZXR1cm4gMjAwPD1wLnN0YXR1cyYmMjk5Pj1wLnN0YXR1c31mdW5jdGlvbiBpKGQpe3RyeXtkLmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoImNsaWNrIikpfWNhdGNoe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50cyIpO3AuaW5pdE1vdXNlRXZlbnQoImNsaWNrIiwhMCwhMCx3aW5kb3csMCwwLDAsODAsMjAsITEsITEsITEsITEsMCxudWxsKSxkLmRpc3BhdGNoRXZlbnQocCl9fXZhciBhPXR5cGVvZiB3aW5kb3c9PSJvYmplY3QiJiZ3aW5kb3cud2luZG93PT09d2luZG93P3dpbmRvdzp0eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYuc2VsZj09PXNlbGY/c2VsZjp0eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsLmdsb2JhbD09PWdsb2JhbD9nbG9iYWw6dm9pZCAwLHI9YS5uYXZpZ2F0b3ImJi9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJi9BcHBsZVdlYktpdC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIS9TYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksbz1hLnNhdmVBc3x8KHR5cGVvZiB3aW5kb3chPSJvYmplY3QifHx3aW5kb3chPT1hP2Z1bmN0aW9uKCl7fToiZG93bmxvYWQiaW4gSFRNTEFuY2hvckVsZW1lbnQucHJvdG90eXBlJiYhcj9mdW5jdGlvbihkLHAsZyl7dmFyIF89YS5VUkx8fGEud2Via2l0VVJMLHk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO3A9cHx8ZC5uYW1lfHwiZG93bmxvYWQiLHkuZG93bmxvYWQ9cCx5LnJlbD0ibm9vcGVuZXIiLHR5cGVvZiBkPT0ic3RyaW5nIj8oeS5ocmVmPWQseS5vcmlnaW49PT1sb2NhdGlvbi5vcmlnaW4/aSh5KTplKHkuaHJlZik/bihkLHAsZyk6aSh5LHkudGFyZ2V0PSJfYmxhbmsiKSk6KHkuaHJlZj1fLmNyZWF0ZU9iamVjdFVSTChkKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Xy5yZXZva2VPYmplY3RVUkwoeS5ocmVmKX0sNGU0KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aSh5KX0sMCkpfToibXNTYXZlT3JPcGVuQmxvYiJpbiBuYXZpZ2F0b3I/ZnVuY3Rpb24oZCxwLGcpe2lmKHA9cHx8ZC5uYW1lfHwiZG93bmxvYWQiLHR5cGVvZiBkIT0ic3RyaW5nIiluYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYih0KGQsZykscCk7ZWxzZSBpZihlKGQpKW4oZCxwLGcpO2Vsc2V7dmFyIF89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO18uaHJlZj1kLF8udGFyZ2V0PSJfYmxhbmsiLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpKF8pfSl9fTpmdW5jdGlvbihkLHAsZyxfKXtpZihfPV98fG9wZW4oIiIsIl9ibGFuayIpLF8mJihfLmRvY3VtZW50LnRpdGxlPV8uZG9jdW1lbnQuYm9keS5pbm5lclRleHQ9ImRvd25sb2FkaW5nLi4uIiksdHlwZW9mIGQ9PSJzdHJpbmciKXJldHVybiBuKGQscCxnKTt2YXIgeT1kLnR5cGU9PT0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIixJPS9jb25zdHJ1Y3Rvci9pLnRlc3QoYS5IVE1MRWxlbWVudCl8fGEuc2FmYXJpLFA9L0NyaU9TXC9bXGRdKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigoUHx8eSYmSXx8cikmJnR5cGVvZiBGaWxlUmVhZGVyPCJ1Iil7dmFyIFY9bmV3IEZpbGVSZWFkZXI7Vi5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXt2YXIgUT1WLnJlc3VsdDtRPVA/UTpRLnJlcGxhY2UoL15kYXRhOlteO10qOy8sImRhdGE6YXR0YWNobWVudC9maWxlOyIpLF8/Xy5sb2NhdGlvbi5ocmVmPVE6bG9jYXRpb249USxfPW51bGx9LFYucmVhZEFzRGF0YVVSTChkKX1lbHNle3ZhciBPPWEuVVJMfHxhLndlYmtpdFVSTCxVPU8uY3JlYXRlT2JqZWN0VVJMKGQpO18/Xy5sb2NhdGlvbj1VOmxvY2F0aW9uLmhyZWY9VSxfPW51bGwsc2V0VGltZW91dChmdW5jdGlvbigpe08ucmV2b2tlT2JqZWN0VVJMKFUpfSw0ZTQpfX0pO2Euc2F2ZUFzPW8uc2F2ZUFzPW8sdHlwZW9mIF9kPCJ1IiYmKF9kLmV4cG9ydHM9byl9KX0pO3ZhciBiZCxpUyxhUz14KCgpPT57aygpO3dpKCk7YmQ9ZHIodFMoKSk7SjEoKTtNcigpO1h0KCk7d2EoKTtrKCk7aVM9KCgpPT57Y2xhc3MgdHtjb29raWVTZXJ2aWNlPWgoWnQpO2NoYWxsZW5nZVNlcnZpY2U9aChTaSk7c25hY2tCYXJIZWxwZXJTZXJ2aWNlPWgoVnQpO3NuYWNrQmFyPWgoSjIpO1ZFUlNJT049MTtzYXZlKGU9Im93YXNwX2p1aWNlX3Nob3AiKXtsZXQgaT17dmVyc2lvbjp0aGlzLlZFUlNJT059O2kuYmFubmVycz17d2VsY29tZUJhbm5lclN0YXR1czp0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCJ3ZWxjb21lYmFubmVyX3N0YXR1cyIpP3RoaXMuY29va2llU2VydmljZS5nZXQoIndlbGNvbWViYW5uZXJfc3RhdHVzIik6dm9pZCAwLGNvb2tpZUNvbnNlbnRTdGF0dXM6dGhpcy5jb29raWVTZXJ2aWNlLmdldCgiY29va2llY29uc2VudF9zdGF0dXMiKT90aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCJjb29raWVjb25zZW50X3N0YXR1cyIpOnZvaWQgMH0saS5sYW5ndWFnZT10aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCJsYW5ndWFnZSIpP3RoaXMuY29va2llU2VydmljZS5nZXQoImxhbmd1YWdlIik6dm9pZCAwO2xldCBhPXRoaXMuY2hhbGxlbmdlU2VydmljZS5jb250aW51ZUNvZGUoKSxyPXRoaXMuY2hhbGxlbmdlU2VydmljZS5jb250aW51ZUNvZGVGaW5kSXQoKSxvPXRoaXMuY2hhbGxlbmdlU2VydmljZS5jb250aW51ZUNvZGVGaXhJdCgpO3puKFthLHIsb10pLnN1YnNjcmliZSh7bmV4dDooW2QscCxnXSk9PntpLmNvbnRpbnVlQ29kZT1kLGkuY29udGludWVDb2RlRmluZEl0PXAsaS5jb250aW51ZUNvZGVGaXhJdD1nO2xldCBfPW5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShpKV0se3R5cGU6InRleHQvcGxhaW47Y2hhcnNldD11dGYtOCJ9KTsoMCxiZC5zYXZlQXMpKF8sYCR7ZX0tJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoIlQiKVswXX0uanNvbmApfSxlcnJvcjooKT0+e2NvbnNvbGUubG9nKCJGYWlsZWQgdG8gcmV0cmlldmUgY29udGludWUgY29kZShzKSBmb3IgYmFja3VwIGZyb20gc2VydmVyLiBVc2luZyBjb29raWUgdmFsdWVzIGFzIGZhbGxiYWNrLiIpLGkuY29udGludWVDb2RlPXRoaXMuY29va2llU2VydmljZS5nZXQoImNvbnRpbnVlQ29kZSIpP3RoaXMuY29va2llU2VydmljZS5nZXQoImNvbnRpbnVlQ29kZSIpOnZvaWQgMCxpLmNvbnRpbnVlQ29kZUZpbmRJdD10aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCJjb250aW51ZUNvZGVGaW5kSXQiKT90aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCJjb250aW51ZUNvZGVGaW5kSXQiKTp2b2lkIDAsaS5jb250aW51ZUNvZGVGaXhJdD10aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCJjb250aW51ZUNvZGVGaXhJdCIpP3RoaXMuY29va2llU2VydmljZS5nZXQoImNvbnRpbnVlQ29kZUZpeEl0Iik6dm9pZCAwO2xldCBkPW5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShpKV0se3R5cGU6InRleHQvcGxhaW47Y2hhcnNldD11dGYtOCJ9KTsoMCxiZC5zYXZlQXMpKGQsYCR7ZX0tJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoIlQiKVswXX0uanNvbmApfX0pfXJlc3RvcmUoZSl7cmV0dXJuIGtkKGUudGV4dCgpLnRoZW4oaT0+e2xldCBhPUpTT04ucGFyc2UoaSk7YS52ZXJzaW9uPT09dGhpcy5WRVJTSU9OPyh0aGlzLnJlc3RvcmVDb29raWUoIndlbGNvbWViYW5uZXJfc3RhdHVzIixhLmJhbm5lcnM/LndlbGNvbWVCYW5uZXJTdGF0dXMpLHRoaXMucmVzdG9yZUNvb2tpZSgiY29va2llY29uc2VudF9zdGF0dXMiLGEuYmFubmVycz8uY29va2llQ29uc2VudFN0YXR1cyksdGhpcy5yZXN0b3JlQ29va2llKCJsYW5ndWFnZSIsYS5sYW5ndWFnZSksdGhpcy5yZXN0b3JlQ29va2llKCJjb250aW51ZUNvZGVGaW5kSXQiLGEuY29udGludWVDb2RlRmluZEl0KSx0aGlzLnJlc3RvcmVDb29raWUoImNvbnRpbnVlQ29kZUZpeEl0IixhLmNvbnRpbnVlQ29kZUZpeEl0KSx0aGlzLnJlc3RvcmVDb29raWUoImNvbnRpbnVlQ29kZSIsYS5jb250aW51ZUNvZGUpLHRoaXMuc25hY2tCYXIub3BlbigiQmFja3VwIGhhcyBiZWVuIHJlc3RvcmVkIGZyb20gIitlLm5hbWUsIkFwcGx5IGNoYW5nZXMgbm93Iix7ZHVyYXRpb246MWU0LHBhbmVsQ2xhc3M6WyJtYXQtYm9keSJdfSkub25BY3Rpb24oKS5zdWJzY3JpYmUoKCk9PntsZXQgbz1hLmNvbnRpbnVlQ29kZT90aGlzLmNoYWxsZW5nZVNlcnZpY2UucmVzdG9yZVByb2dyZXNzKGVuY29kZVVSSUNvbXBvbmVudChhLmNvbnRpbnVlQ29kZSkpOmMxKCEwKSxkPWEuY29udGludWVDb2RlRmluZEl0P3RoaXMuY2hhbGxlbmdlU2VydmljZS5yZXN0b3JlUHJvZ3Jlc3NGaW5kSXQoZW5jb2RlVVJJQ29tcG9uZW50KGEuY29udGludWVDb2RlRmluZEl0KSk6YzEoITApLHA9YS5jb250aW51ZUNvZGVGaXhJdD90aGlzLmNoYWxsZW5nZVNlcnZpY2UucmVzdG9yZVByb2dyZXNzRml4SXQoZW5jb2RlVVJJQ29tcG9uZW50KGEuY29udGludWVDb2RlRml4SXQpKTpjMSghMCk7em4oW28sZCxwXSkuc3Vic2NyaWJlKHtuZXh0OigpPT57bG9jYXRpb24ucmVsb2FkKCl9LGVycm9yOmc9Pntjb25zb2xlLmxvZyhnKX19KX0pKTp0aGlzLnNuYWNrQmFySGVscGVyU2VydmljZS5vcGVuKGBWZXJzaW9uICR7YS52ZXJzaW9ufSBpcyBpbmNvbXBhdGlibGUgd2l0aCBleHBlY3RlZCB2ZXJzaW9uICR7dGhpcy5WRVJTSU9OfWAsImVycm9yQmFyIil9KS5jYXRjaChpPT57dGhpcy5zbmFja0JhckhlbHBlclNlcnZpY2Uub3BlbihgQmFja3VwIHJlc3RvcmUgb3BlcmF0aW9uIGZhaWxlZDogJHtpLm1lc3NhZ2V9YCwiZXJyb3JCYXIiKX0pKX1yZXN0b3JlQ29va2llKGUsaSl7aWYoaSl7bGV0IGE9bmV3IERhdGU7YS5zZXRGdWxsWWVhcihhLmdldEZ1bGxZZWFyKCkrMSksdGhpcy5jb29raWVTZXJ2aWNlLnB1dChlLGkse2V4cGlyZXM6YX0pfWVsc2UgdGhpcy5jb29raWVTZXJ2aWNlLnJlbW92ZShlKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwcm92PSQoe3Rva2VuOnQsZmFjdG9yeTp0Llx1MDI3NWZhYyxwcm92aWRlZEluOiJyb290In0pfXJldHVybiB0fSkoKX0pO3ZhciBuUyxyUz14KCgpPT57aygpO2FTKCk7dmUoKTtuZSgpO1coKTtnaSgpO2soKTtXKCk7bmUoKTt2ZSgpO25TPSgoKT0+e2NsYXNzIHR7bG9jYWxCYWNrdXBTZXJ2aWNlPWgoaVMpO3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbInNjb3JlLWJvYXJkLWFkZGl0aW9uYWwtc2V0dGluZ3MtZGlhbG9nIl1dLGRlY2xzOjM1LHZhcnM6MjIsY29uc3RzOltbInJlc3RvcmVCYWNrdXBGaWxlIiwiIl0sWyJtYXQtZGlhbG9nLXRpdGxlIiwiIiwidHJhbnNsYXRlIiwiIl0sWzEsInNldHRpbmdzIl0sWzEsInNldHRpbmctZ3JvdXAiXSxbMSwic2V0dGluZyJdLFsibWF0LWZsYXQtYnV0dG9uIiwiIiwiY29sb3IiLCJwcmltYXJ5IiwzLCJjbGljayJdLFsxLCJ0b29sdGlwIl0sWyJ0eXBlIiwiZmlsZSIsMiwiZGlzcGxheSIsIm5vbmUiLDMsImNoYW5nZSJdLFsibWF0LWZsYXQtYnV0dG9uIiwiIiwiY2RrRm9jdXNJbml0aWFsIiwiIiwxLCJjbG9zZS1idG4iLDMsIm1hdC1kaWFsb2ctY2xvc2UiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpZihpJjEpe2xldCByPUwoKTtjKDAsIm1hdC1kaWFsb2ctY29udGVudCIpKDEsImgxIiwxKSxtKDIpLGIoMywidHJhbnNsYXRlIikscygpLGMoNCwiZGl2IiwyKSg1LCJkaXYiLDMpKDYsImgyIiksbSg3KSxiKDgsInRyYW5zbGF0ZSIpLHMoKSxjKDksImRpdiIsNCkoMTAsInNwYW4iKSxtKDExKSxiKDEyLCJ0cmFuc2xhdGUiKSxzKCksYygxMywiYnV0dG9uIiw1KSxTKCJjbGljayIsZnVuY3Rpb24oKXtyZXR1cm4geihyKSxUKGEubG9jYWxCYWNrdXBTZXJ2aWNlLnNhdmUoKSl9KSxjKDE0LCJtYXQtaWNvbiIpLG0oMTUsInNhdmVfYWx0IikscygpLGMoMTYsInNwYW4iLDYpLG0oMTcpLGIoMTgsInRyYW5zbGF0ZSIpLHMoKSgpKCksYygxOSwiZGl2Iiw0KSgyMCwiaW5wdXQiLDcsMCksUygiY2hhbmdlIixmdW5jdGlvbihkKXtyZXR1cm4geihyKSxUKGEubG9jYWxCYWNrdXBTZXJ2aWNlLnJlc3RvcmUoZC50YXJnZXQuZmlsZXMuaXRlbSgwKSkpfSkscygpLGMoMjIsInNwYW4iKSxtKDIzKSxiKDI0LCJ0cmFuc2xhdGUiKSxzKCksYygyNSwiYnV0dG9uIiw1KSxTKCJjbGljayIsZnVuY3Rpb24oKXt6KHIpO2xldCBkPXNlKDIxKTtyZXR1cm4gVChkLmNsaWNrKCkpfSksYygyNiwibWF0LWljb24iKSxtKDI3LCJzZXR0aW5nc19iYWNrdXBfcmVzdG9yZSIpLHMoKSxjKDI4LCJzcGFuIiw2KSxtKDI5KSxiKDMwLCJ0cmFuc2xhdGUiKSxzKCkoKSgpKCkoKSxjKDMxLCJtYXQtZGlhbG9nLWFjdGlvbnMiKSgzMiwiYnV0dG9uIiw4KSxtKDMzKSxiKDM0LCJ0cmFuc2xhdGUiKSxzKCkoKSgpfWkmMiYmKGwoMiksQShDKDMsOCwiU0NPUkVCT0FSRF9BRERJVElPTkFMX1NFVFRJTkdTIikpLGwoNSksQShDKDgsMTAsIkJBQ0tVUF9IRUFETElORSIpKSxsKDQpLEEoQygxMiwxMiwiU0FWRV9CQUNLVVBfVE9PTFRJUCIpKSxsKDYpLEEoQygxOCwxNCwiQlROX1NBVkVfQkFDS1VQIikpLGwoNiksQShDKDI0LDE2LCJSRVNUT1JFX0JBQ0tVUF9UT09MVElQIikpLGwoNiksQShDKDMwLDE4LCJCVE5fUkVTVE9SRV9CQUNLVVAiKSksbCgzKSxmKCJtYXQtZGlhbG9nLWNsb3NlIixudWxsKSxsKCksRSgiICIsQygzNCwyMCwiQlROX0NMT1NFIiksIiAiKSl9LGRlcGVuZGVuY2llczpbdDIsbzQsWSxTZSxvZSxsZSxnZSxDZSxpMixQaSxLXSxzdHlsZXM6W2AubWF0LW1kYy1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdIH4gLm1hdC1tZGMtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDoxcmVtfW1hdC1kaWFsb2ctYWN0aW9uc1tfbmdjb250ZW50LSVDT01QJV17anVzdGlmeS1jb250ZW50OmVuZH1oMVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHghaW1wb3J0YW50O21hcmdpbi1ib3R0b206MS41cmVtfS5zZXR0aW5nc1tfbmdjb250ZW50LSVDT01QJV17bWluLWhlaWdodDo0MDBweDtvdmVyZmxvdy15OmF1dG99LnNldHRpbmctZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206M3B4IHNvbGlkIHZhcigtLXRoZW1lLWJhY2tncm91bmQtbGlnaHRlcik7bWFyZ2luLWJvdHRvbToxcmVtfS5zZXR0aW5nLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweDttYXJnaW4tYm90dG9tOi41cmVtfS5zZXR0aW5nLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXTpsYXN0LWNoaWxke2JvcmRlci1ib3R0b206dW5zZXQ7bWFyZ2luLWJvdHRvbTowfS5zZXR0aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpncmlkO2dhcDoxcmVtO2dyaWQtdGVtcGxhdGUtY29sdW1uczphdXRvIG1heC1jb250ZW50O21hcmdpbi1ib3R0b206MXJlbX1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1yaWdodDouNXJlbX1oMltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtdGV4dCl9c3Bhbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtdGV4dCk7Zm9udC1zaXplOjE0cHh9bWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4IWltcG9ydGFudDtoZWlnaHQ6MjRweCFpbXBvcnRhbnQ7d2lkdGg6MjRweCFpbXBvcnRhbnR9LnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5jbG9zZS1idG5bX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tdGhlbWUtYmFja2dyb3VuZC1saWdodGVyKSFpbXBvcnRhbnR9CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIHpaKHQpe2xldCBuPVtdLGU9bnVsbDtmb3IobGV0IGkgb2YgdCllPT09bnVsbD9lPXtzdGFydDppLGVuZDppfTppPT09ZS5lbmQrMT9lLmVuZD1pOihuLnB1c2goZSksZT17c3RhcnQ6aSxlbmQ6aX0pO3JldHVybiBuLnB1c2goZSksbn1mdW5jdGlvbiBUWih0KXtyZXR1cm4gdC5tYXAobj0+bi5zdGFydD09PW4uZW5kP24uc3RhcnQudG9TdHJpbmcoKTpgJHtuLnN0YXJ0fSAtICR7bi5lbmR9YCkuam9pbigiLCAiKX12YXIgb1MsY1M9eCgoKT0+e2ZkKCk7aygpO29TPSgoKT0+e2NsYXNzIHR7dHJhbnNmb3JtKGUpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4iIjtsZXQgaT1zNihlKSxhPXpaKGkpO3JldHVybiBUWihhKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVwaXBlPWcwKHtuYW1lOiJkaWZmaWN1bHR5U2VsZWN0aW9uU3VtbWFyeSIsdHlwZTp0LHB1cmU6ITB9KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBFWih0LG4pe2lmKHQmMSl7bGV0IGU9TCgpO2MoMCwiYnV0dG9uIiwyKSxiKDEsInRyYW5zbGF0ZSIpLFMoImNsaWNrIixmdW5jdGlvbigpe2xldCBhPXooZSkuJGltcGxpY2l0LHI9digpO3JldHVybiBUKHIudG9nZ2xlQ2F0ZWdvcnlTZWxlY3RlZChhKSl9KSxtKDIpLHMoKX1pZih0JjIpe2xldCBlPW4uJGltcGxpY2l0LGk9digpO2YoIm5nQ2xhc3MiLGJ0KDUsc1MsaS5pc0NhdGVnb3J5U2VsZWN0ZWQoZSkpKSgibWF0VG9vbHRpcCIsQygxLDMsIkNBVEVHT1JZXyIrZS50b1VwcGVyQ2FzZSgpLnNwbGl0KCIgIikuam9pbigiXyIpKyJfREVTQ1JJUFRJT04iKSksbCgyKSxFKCIgIixlLCIgIil9fXZhciBzUyxsUyxkUz14KCgpPT57aygpO1ZzKCk7VygpO3ZpKCk7YTEoKTtrKCk7VygpO3NTPXQ9Pih7c2VsZWN0ZWQ6dH0pO2xTPSgoKT0+e2NsYXNzIHR7YXZhaWxhYmxlQ2F0ZWdvcmllcz1uZXcgU2V0O2FsbENoYWxsZW5nZXM7Y2F0ZWdvcmllcztjYXRlZ29yaWVzQ2hhbmdlPW5ldyBOO25nT25Jbml0KCl7dGhpcy5hdmFpbGFibGVDYXRlZ29yaWVzPXQuZ2V0QXZhaWxhYmxlQ2F0ZWdvcmllcyh0aGlzLmFsbENoYWxsZW5nZXMpfW5nT25DaGFuZ2VzKCl7dGhpcy5hdmFpbGFibGVDYXRlZ29yaWVzPXQuZ2V0QXZhaWxhYmxlQ2F0ZWdvcmllcyh0aGlzLmFsbENoYWxsZW5nZXMpfXN0YXRpYyBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUpe3JldHVybiBuZXcgU2V0KGUubWFwKGk9PmkuY2F0ZWdvcnkpKX10b2dnbGVDYXRlZ29yeVNlbGVjdGVkKGUpe3RoaXMuaXNDYXRlZ29yeVNlbGVjdGVkKGUpP3RoaXMuY2F0ZWdvcmllcz10aGlzLmNhdGVnb3JpZXMuZmlsdGVyKGk9PmkhPT1lKTp0aGlzLmNhdGVnb3JpZXMucHVzaChlKSx0aGlzLmNhdGVnb3JpZXNDaGFuZ2UuZW1pdCh0aGlzLmNhdGVnb3JpZXMpfWlzQ2F0ZWdvcnlTZWxlY3RlZChlKXtyZXR1cm4gdGhpcy5jYXRlZ29yaWVzLmluY2x1ZGVzKGUpfWlzQWxsQ2F0ZWdvcmllc1NlbGVjdGVkKCl7cmV0dXJuIHRoaXMuY2F0ZWdvcmllcy5sZW5ndGg9PT0wfXJlc2V0Q2F0ZWdvcnlGaWx0ZXIoKXt0aGlzLmNhdGVnb3JpZXM9Y3IuY2F0ZWdvcmllcyx0aGlzLmNhdGVnb3JpZXNDaGFuZ2UuZW1pdCh0aGlzLmNhdGVnb3JpZXMpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImNhdGVnb3J5LWZpbHRlciJdXSxpbnB1dHM6e2FsbENoYWxsZW5nZXM6ImFsbENoYWxsZW5nZXMiLGNhdGVnb3JpZXM6ImNhdGVnb3JpZXMifSxvdXRwdXRzOntjYXRlZ29yaWVzQ2hhbmdlOiJjYXRlZ29yaWVzQ2hhbmdlIn0sZmVhdHVyZXM6W0hlXSxkZWNsczo0LHZhcnM6Myxjb25zdHM6W1sxLCJwaWxsIiwic2VsZWN0ZWQiLDMsImNsaWNrIiwibmdDbGFzcyJdLFsxLCJwaWxsIiwzLCJuZ0NsYXNzIiwibWF0VG9vbHRpcCJdLFsxLCJwaWxsIiwzLCJjbGljayIsIm5nQ2xhc3MiLCJtYXRUb29sdGlwIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJidXR0b24iLDApLFMoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiBhLnJlc2V0Q2F0ZWdvcnlGaWx0ZXIoKX0pLG0oMSxgIEFsbApgKSxzKCkscWUoMixFWiwzLDcsImJ1dHRvbiIsMSxGdCkpLGkmMiYmKGYoIm5nQ2xhc3MiLGJ0KDEsc1MsYS5pc0FsbENhdGVnb3JpZXNTZWxlY3RlZCgpKSksbCgyKSxHZShhLmF2YWlsYWJsZUNhdGVnb3JpZXMpKX0sZGVwZW5kZW5jaWVzOltUMSxSdCxZLEtdLHN0eWxlczpbYFtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LXdyYXA6d3JhcDtnYXA6LjVyZW07bWFyZ2luOjEuNXJlbSAwfS5waWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRoZW1lLXByaW1hcnktZGFya2VyKTtib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MjM0MjM0cHg7Y29sb3I6dmFyKC0tdGhlbWUtdGV4dCk7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NjAwO2xpbmUtaGVpZ2h0OjE5cHg7cGFkZGluZzouNXJlbSAxLjVyZW19LnBpbGwuc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dmFyKC0tdGhlbWUtYWNjZW50LWRhcmspO2JvcmRlcjoxcHggc29saWQgdmFyKC0tdGhlbWUtYWNjZW50KTtjb2xvcjp2YXIoLS10aGVtZS10ZXh0LWludmVydC0xNSl9CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIEFaKHQsbil7dCYxJiYobSgwKSxiKDEsInRyYW5zbGF0ZSIpKSx0JjImJkUoIiAiLEMoMSwxLCJMQUJFTF9ESUZGSUNVTFRZIiksIiAiKX1mdW5jdGlvbiBEWih0LG4pe2lmKHQmMSYmKGMoMCwic3BhbiIpLG0oMSksYigyLCJkaWZmaWN1bHR5U2VsZWN0aW9uU3VtbWFyeSIpLHMoKSksdCYyKXtsZXQgZT12KCk7bCgpLEUoIiAiLEMoMiwxLGUuZmlsdGVyU2V0dGluZy5kaWZmaWN1bHRpZXMpLCIgIil9fWZ1bmN0aW9uIElaKHQsbil7aWYodCYxJiYoYygwLCJtYXQtb3B0aW9uIiwxMCksbSgxKSxzKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7ZigidmFsdWUiLGUpLGwoKSxBKGUpfX12YXIgbVMsaFM9eCgoKT0+e2soKTtnaSgpO3JTKCk7Y1MoKTtkUygpO3ZpKCk7bmUoKTt1ZCgpO180KCk7ZGMoKTtldCgpO1coKTt2ZSgpO0plKCk7aygpO0plKCk7dmUoKTtXKCk7ZXQoKTttUz0oKCk9PntjbGFzcyB0e2RpYWxvZz1oKE4xKTthbGxDaGFsbGVuZ2VzO2ZpbHRlclNldHRpbmc7ZmlsdGVyU2V0dGluZ0NoYW5nZT1uZXcgTjtyZXNldDt0YWdzPW5ldyBTZXQ7bmdPbkNoYW5nZXMoKXt0aGlzLnRhZ3M9bmV3IFNldCh0aGlzLmFsbENoYWxsZW5nZXMuZmxhdE1hcChlPT5lLnRhZ0xpc3QpKX1vbkRpZmZpY3VsdHlGaWx0ZXJDaGFuZ2UoZSl7bGV0IGk9c3RydWN0dXJlZENsb25lKHRoaXMuZmlsdGVyU2V0dGluZyk7aS5kaWZmaWN1bHRpZXM9ZSx0aGlzLmZpbHRlclNldHRpbmdDaGFuZ2UuZW1pdChpKX1vblN0YXR1c0ZpbHRlckNoYW5nZShlKXtsZXQgaT1zdHJ1Y3R1cmVkQ2xvbmUodGhpcy5maWx0ZXJTZXR0aW5nKTtpLnN0YXR1cz1lLHRoaXMuZmlsdGVyU2V0dGluZ0NoYW5nZS5lbWl0KGkpfW9uVGFnRmlsdGVyQ2hhbmdlKGUpe2xldCBpPXN0cnVjdHVyZWRDbG9uZSh0aGlzLmZpbHRlclNldHRpbmcpO2kudGFncz1lLHRoaXMuZmlsdGVyU2V0dGluZ0NoYW5nZS5lbWl0KGkpfW9uQ2F0ZWdvcnlGaWx0ZXJDaGFuZ2UoZSl7bGV0IGk9c3RydWN0dXJlZENsb25lKHRoaXMuZmlsdGVyU2V0dGluZyk7aS5jYXRlZ29yaWVzPWUsdGhpcy5maWx0ZXJTZXR0aW5nQ2hhbmdlLmVtaXQoaSl9b25TZWFyY2hRdWVyeUZpbHRlckNoYW5nZShlKXtsZXQgaT1zdHJ1Y3R1cmVkQ2xvbmUodGhpcy5maWx0ZXJTZXR0aW5nKTtpLnNlYXJjaFF1ZXJ5PWUsdGhpcy5maWx0ZXJTZXR0aW5nQ2hhbmdlLmVtaXQoaSl9Y2FuQmVSZXNldCgpe3JldHVybiB0aGlzLmZpbHRlclNldHRpbmcuZGlmZmljdWx0aWVzLmxlbmd0aD4wfHx0aGlzLmZpbHRlclNldHRpbmcuc3RhdHVzIT09bnVsbHx8dGhpcy5maWx0ZXJTZXR0aW5nLnRhZ3MubGVuZ3RoPjB8fHRoaXMuZmlsdGVyU2V0dGluZy5jYXRlZ29yaWVzLmxlbmd0aD4wfHwhIXRoaXMuZmlsdGVyU2V0dGluZy5zZWFyY2hRdWVyeXx8IXRoaXMuZmlsdGVyU2V0dGluZy5zaG93RGlzYWJsZWRDaGFsbGVuZ2VzfW9wZW5BZGRpdGlvbmFsU2V0dGluZ3NEaWFsb2coKXt0aGlzLmRpYWxvZy5vcGVuKG5TKX1zdGF0aWMgXHUwMjc1ZmFjPWZ1bmN0aW9uKGkpe3JldHVybiBuZXcoaXx8dCl9O3N0YXRpYyBcdTAyNzVjbXA9RCh7dHlwZTp0LHNlbGVjdG9yczpbWyJmaWx0ZXItc2V0dGluZ3MiXV0saW5wdXRzOnthbGxDaGFsbGVuZ2VzOiJhbGxDaGFsbGVuZ2VzIixmaWx0ZXJTZXR0aW5nOiJmaWx0ZXJTZXR0aW5nIixyZXNldDoicmVzZXQifSxvdXRwdXRzOntmaWx0ZXJTZXR0aW5nQ2hhbmdlOiJmaWx0ZXJTZXR0aW5nQ2hhbmdlIn0sZmVhdHVyZXM6W0hlXSxkZWNsczo2Nyx2YXJzOjUwLGNvbnN0czpbWzEsImZpbHRlci1yb3ciXSxbMSwic2VhcmNoLWZvcm0tZmllbGQiXSxbIm1hdFByZWZpeCIsIiIsMSwic2VhcmNoLWljb24iXSxbInR5cGUiLCJzZWFyY2giLCJtYXRJbnB1dCIsIiIsMywiaW5wdXQiLCJ2YWx1ZSJdLFsxLCJvcHRpb25zLWdyb3VwIl0sWyJtdWx0aXBsZSIsIiIsMywic2VsZWN0aW9uQ2hhbmdlIiwidmFsdWUiXSxbMywidmFsdWUiXSxbMywiZGlmZmljdWx0eSJdLFsidHJhbnNsYXRlIiwiIl0sWyJwbGFjZWhvbGRlciIsIkFsbCIsMywic2VsZWN0aW9uQ2hhbmdlIiwidmFsdWUiXSxbMSwibWF0LWJvZHkiLDMsInZhbHVlIl0sWyJ2YWx1ZSIsInVuc29sdmVkIiwxLCJtYXQtYm9keSJdLFsidmFsdWUiLCJwYXJ0aWFsbHktc29sdmVkIiwxLCJtYXQtYm9keSJdLFsidmFsdWUiLCJzb2x2ZWQiLDEsIm1hdC1ib2R5Il0sWzEsImFkZGl0aW9uYWwtc2V0dGluZ3Mtd3JhcHBlciJdLFsxLCJyZXNldC1maWx0ZXJzLXdyYXBwZXIiXSxbImlkIiwicmVzZXQtZmlsdGVycyIsIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLCJyZXNldCBhbGwgZmlsdGVycyIsMywiY2xpY2siLCJtYXRUb29sdGlwIl0sWyJ3aWR0aCIsIjE2IiwiaGVpZ2h0IiwiMTYiLCJ2aWV3Qm94IiwiMCAwIDE2IDE2IiwiZmlsbCIsIm5vbmUiLCJ4bWxucyIsImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIl0sWyJkIiwiTTEyLjI0NDIgMi45NjY3Mkw5LjU2NjcyIDYuMzc5MjJMMTAuNjM5MiA3LjQ1MTcyQzExLjQxMTcgNi40NjkyMiAxNC4zNzQyIDIuNjc0MjIgMTQuMzc0MiAyLjY3NDIyQzE0Ljc1NjcgMi4xNzkyMiAxNC40MDQyIDEuNDY2NzIgMTMuNzgxNyAxLjQ2NjcySDQuNjU0MjJMNi4xNTQyMiAyLjk2NjcySDEyLjI0NDJaIiwiZmlsbCIsImN1cnJlbnRDb2xvciJdLFsiZCIsIk0xLjYzOTIyIDAuNTc0MjE5TDAuNTc0MjE5IDEuNjMxNzJMNy4wMzE3MiA4LjIxNjcyVjEyLjcxNjdDNy4wMzE3MiAxMy4xMjkyIDcuMzY5MjIgMTMuNDY2NyA3Ljc4MTcyIDEzLjQ2NjdIOS4yODE3MkM5LjY5NDIyIDEzLjQ2NjcgMTAuMDMxNyAxMy4xMjkyIDEwLjAzMTcgMTIuNzE2N1YxMS4wODkyTDE0LjM2NjcgMTUuNDI0MkwxNS40MjQyIDE0LjM2NjdMMS42MzkyMiAwLjU3NDIxOVoiLCJmaWxsIiwiY3VycmVudENvbG9yIl0sWyJmb3IiLCJyZXNldC1maWx0ZXJzIiwxLCJyZXNldC1maWx0ZXJzLWxhYmVsIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIiwiT3BlbiBhZGRpdGlvbmFsIHNldHRpbmdzIGRpYWxvZyIsMSwiYWRkaXRpb25hbC1zZXR0aW5ncy1idXR0b24iLDMsImNsaWNrIiwibWF0VG9vbHRpcCJdLFszLCJjYXRlZ29yaWVzQ2hhbmdlIiwiY2F0ZWdvcmllcyIsImFsbENoYWxsZW5nZXMiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsImRpdiIsMCkoMSwiZGl2IiwxKSgyLCJtYXQtZm9ybS1maWVsZCIpKDMsIm1hdC1pY29uIiwyKSxtKDQsInNlYXJjaCIpLHMoKSxjKDUsIm1hdC1sYWJlbCIpLG0oNiksYig3LCJ0cmFuc2xhdGUiKSxzKCksYyg4LCJpbnB1dCIsMyksUygiaW5wdXQiLGZ1bmN0aW9uKG8pe3JldHVybiBhLm9uU2VhcmNoUXVlcnlGaWx0ZXJDaGFuZ2Uoby50YXJnZXQudmFsdWUpfSkscygpKCkoKSxjKDksImRpdiIsNCkoMTAsIm1hdC1mb3JtLWZpZWxkIikoMTEsIm1hdC1sYWJlbCIpLG0oMTIpLGIoMTMsInRyYW5zbGF0ZSIpLHMoKSxjKDE0LCJtYXQtc2VsZWN0Iiw1KSxTKCJzZWxlY3Rpb25DaGFuZ2UiLGZ1bmN0aW9uKG8pe3JldHVybiBhLm9uRGlmZmljdWx0eUZpbHRlckNoYW5nZShvLnZhbHVlKX0pLGMoMTUsIm1hdC1zZWxlY3QtdHJpZ2dlciIpLE0oMTYsQVosMiwzKSgxNyxEWiwzLDMsInNwYW4iKSxzKCksYygxOCwibWF0LW9wdGlvbiIsNiksdSgxOSwiZGlmZmljdWx0eS1zdGFycyIsNykscygpLGMoMjAsIm1hdC1vcHRpb24iLDYpLHUoMjEsImRpZmZpY3VsdHktc3RhcnMiLDcpLHMoKSxjKDIyLCJtYXQtb3B0aW9uIiw2KSx1KDIzLCJkaWZmaWN1bHR5LXN0YXJzIiw3KSxzKCksYygyNCwibWF0LW9wdGlvbiIsNiksdSgyNSwiZGlmZmljdWx0eS1zdGFycyIsNykscygpLGMoMjYsIm1hdC1vcHRpb24iLDYpLHUoMjcsImRpZmZpY3VsdHktc3RhcnMiLDcpLHMoKSxjKDI4LCJtYXQtb3B0aW9uIiw2KSx1KDI5LCJkaWZmaWN1bHR5LXN0YXJzIiw3KSxzKCkoKSgpLGMoMzAsIm1hdC1mb3JtLWZpZWxkIikoMzEsIm1hdC1sYWJlbCIsOCksbSgzMiwiTEFCRUxfU1RBVFVTIikscygpLGMoMzMsIm1hdC1zZWxlY3QiLDkpLFMoInNlbGVjdGlvbkNoYW5nZSIsZnVuY3Rpb24obyl7cmV0dXJuIGEub25TdGF0dXNGaWx0ZXJDaGFuZ2Uoby52YWx1ZSl9KSxjKDM0LCJtYXQtb3B0aW9uIiwxMCksbSgzNSksYigzNiwidHJhbnNsYXRlIikscygpLGMoMzcsIm1hdC1vcHRpb24iLDExKSxtKDM4KSxiKDM5LCJ0cmFuc2xhdGUiKSxzKCksYyg0MCwibWF0LW9wdGlvbiIsMTIpLG0oNDEpLGIoNDIsInRyYW5zbGF0ZSIpLHMoKSxjKDQzLCJtYXQtb3B0aW9uIiwxMyksbSg0NCksYig0NSwidHJhbnNsYXRlIikscygpKCkoKSxjKDQ2LCJtYXQtZm9ybS1maWVsZCIpKDQ3LCJtYXQtbGFiZWwiKSxtKDQ4KSxiKDQ5LCJ0cmFuc2xhdGUiKSxzKCksYyg1MCwibWF0LXNlbGVjdCIsNSksUygic2VsZWN0aW9uQ2hhbmdlIixmdW5jdGlvbihvKXtyZXR1cm4gYS5vblRhZ0ZpbHRlckNoYW5nZShvLnZhbHVlKX0pLHFlKDUxLElaLDIsMiwibWF0LW9wdGlvbiIsMTAsRnQpLHMoKSgpLGMoNTMsImRpdiIsMTQpKDU0LCJkaXYiLDE1KSg1NSwiYnV0dG9uIiwxNiksYig1NiwidHJhbnNsYXRlIiksUygiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIGEucmVzZXQoKX0pLE10KCksYyg1Nywic3ZnIiwxNyksdSg1OCwicGF0aCIsMTgpKDU5LCJwYXRoIiwxOSkscygpKCkseWkoKSxjKDYwLCJsYWJlbCIsMjApLG0oNjEpLGIoNjIsInRyYW5zbGF0ZSIpLHMoKSgpLGMoNjMsImJ1dHRvbiIsMjEpLFMoImNsaWNrIixmdW5jdGlvbigpe3JldHVybiBhLm9wZW5BZGRpdGlvbmFsU2V0dGluZ3NEaWFsb2coKX0pLGMoNjQsIm1hdC1pY29uIiksbSg2NSwic2V0dGluZ3MiKSxzKCkoKSgpKCkoKSxjKDY2LCJjYXRlZ29yeS1maWx0ZXIiLDIyKSxTKCJjYXRlZ29yaWVzQ2hhbmdlIixmdW5jdGlvbihvKXtyZXR1cm4gYS5vbkNhdGVnb3J5RmlsdGVyQ2hhbmdlKG8pfSkscygpKSxpJjImJihsKDYpLEEoQyg3LDMyLCJOQVZfU0VBUkNIIikpLGwoMiksZigidmFsdWUiLGEuZmlsdGVyU2V0dGluZy5zZWFyY2hRdWVyeSksbCg0KSxBKEMoMTMsMzQsIkxBQkVMX0RJRkZJQ1VMVFkiKSksbCgyKSxmKCJ2YWx1ZSIsYS5maWx0ZXJTZXR0aW5nLmRpZmZpY3VsdGllcyksbCgyKSx3KGEuZmlsdGVyU2V0dGluZy5kaWZmaWN1bHRpZXMubGVuZ3RoPT09MD8xNjoxNyksbCgyKSxmKCJ2YWx1ZSIsMSksbCgpLGYoImRpZmZpY3VsdHkiLDEpLGwoKSxmKCJ2YWx1ZSIsMiksbCgpLGYoImRpZmZpY3VsdHkiLDIpLGwoKSxmKCJ2YWx1ZSIsMyksbCgpLGYoImRpZmZpY3VsdHkiLDMpLGwoKSxmKCJ2YWx1ZSIsNCksbCgpLGYoImRpZmZpY3VsdHkiLDQpLGwoKSxmKCJ2YWx1ZSIsNSksbCgpLGYoImRpZmZpY3VsdHkiLDUpLGwoKSxmKCJ2YWx1ZSIsNiksbCgpLGYoImRpZmZpY3VsdHkiLDYpLGwoNCksZigidmFsdWUiLGEuZmlsdGVyU2V0dGluZy5zdGF0dXMpLGwoKSxmKCJ2YWx1ZSIsbnVsbCksbCgpLEEoQygzNiwzNiwiU1RBVFVTX0FMTCIpKSxsKDMpLEEoQygzOSwzOCwiU1RBVFVTX1VOU09MVkVEIikpLGwoMyksQShDKDQyLDQwLCJTVEFUVVNfUEFSVElBTExZX1NPTFZFRCIpKSxsKDMpLEEoQyg0NSw0MiwiU1RBVFVTX1NPTFZFRCIpKSxsKDQpLEEoQyg0OSw0NCwiTEFCRUxfVEFHUyIpKSxsKDIpLGYoInZhbHVlIixhLmZpbHRlclNldHRpbmcudGFncyksbCgpLEdlKGEudGFncyksbCg0KSxmKCJtYXRUb29sdGlwIixDKDU2LDQ2LCJMQUJFTF9SRVNFVF9BTExfRklMVEVSUyIpKSxsKDIpLF90KCJjb2xvciIsYS5jYW5CZVJlc2V0KCk/InZhcigtLXRoZW1lLXdhcm4pIjoidmFyKC0tdGhlbWUtdGV4dC1kYXJrKSIpLGwoNCksQShDKDYyLDQ4LCJMQUJFTF9SRVNFVF9BTExfRklMVEVSUyIpKSxsKDIpLGYoIm1hdFRvb2x0aXAiLCJPcGVuIGFkZGl0aW9uYWwgc2V0dGluZ3MgZGlhbG9nIiksbCgzKSxmKCJjYXRlZ29yaWVzIixhLmZpbHRlclNldHRpbmcuY2F0ZWdvcmllcykoImFsbENoYWxsZW5nZXMiLGEuYWxsQ2hhbGxlbmdlcykpfSxkZXBlbmRlbmNpZXM6W1FlLFplLGh0LFAwLGdlLENlLFksU2UsJGUsbnQsWm4saTUsSDIsbDYsbDEsUnQsbFMsSyxvU10sc3R5bGVzOltgLm9wdGlvbnMtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtjb2x1bW4tZ2FwOjFyZW07ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMywxZnIpIG1pbi1jb250ZW50O3Jvdy1nYXA6LjVyZW07d2lkdGg6bWF4LWNvbnRlbnR9QG1lZGlhIChtYXgtd2lkdGg6IDEyMDBweCl7Lm9wdGlvbnMtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde3dpZHRoOmF1dG99fUBtZWRpYSAobWF4LXdpZHRoOiA4MDBweCl7Lm9wdGlvbnMtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2dyaWQtdGVtcGxhdGUtY29sdW1uczphdXRvO3dpZHRoOjEwMCV9fS5maWx0ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmdyaWQ7Z2FwOjFyZW07Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gbWluLWNvbnRlbnQgbWluLWNvbnRlbnQ7bWFyZ2luLXRvcDoxcmVtfUBtZWRpYSAobWF4LXdpZHRoOiAxMjAwcHgpey5maWx0ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyfX0uc2VhcmNoLWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgbWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LnNlYXJjaC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjp2YXIoLS10aGVtZS10ZXh0LWZhZGUtMzApfVtfbmdob3N0LSVDT01QJV0gICAgIC5tYXQtbWRjLWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1kYy1mbG9hdGluZy1sYWJlbHtjb2xvcjp2YXIoLS10aGVtZS1hY2NlbnQpIWltcG9ydGFudH1bX25naG9zdC0lQ09NUCVdICAgICAubWF0LW1kYy1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tZGMtbGluZS1yaXBwbGU6YWZ0ZXJ7Ym9yZGVyLWJvdHRvbS1jb2xvcjp2YXIoLS10aGVtZS1hY2NlbnQpIWltcG9ydGFudH0ucmVzZXQtZmlsdGVycy13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4fS5yZXNldC1maWx0ZXJzLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjp2YXIoLS10aGVtZS10ZXh0LWZhZGUtMzApfUBtZWRpYSAobWluLXdpZHRoOiA4MDBweCl7LnJlc2V0LWZpbHRlcnMtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX19LmFkZGl0aW9uYWwtc2V0dGluZ3Mtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleH0uYWRkaXRpb25hbC1zZXR0aW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uYWRkaXRpb25hbC1zZXR0aW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnZhcigtLXRoZW1lLXRleHQtZmFkZS0zMCk7Zm9udC1zaXplOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweDt3aWR0aDoxNnB4fQoKCgoKYF19KX1yZXR1cm4gdH0pKCl9KTtmdW5jdGlvbiBWWih0LG4pe2lmKHQmMSYmKG0oMCksYigxLCJudW1iZXIiKSksdCYyKXtsZXQgZT12KCk7RSgiICIsZHQoMSwxLGUuc2NvcmUvZS50b3RhbCoxMDAsIjEuMC0wIiksIiUgIil9fWZ1bmN0aW9uIE9aKHQsbil7aWYodCYxJiYobSgwKSxHdCgxLCJzcGFuIiw1KSxtKDIpLEp0KCkpLHQmMil7bGV0IGU9digpO0UoIiAiLGUuc2NvcmUsIi8iKSxsKDIpLEEoZS50b3RhbCl9fWZ1bmN0aW9uIEhaKHQsbil7aWYodCYxJiYoR3QoMCwiZGl2IiwzKSxaaSgxLCJkaXYiLDYpLEp0KCkpLHQmMil7bGV0IGU9digpO2woKSxfdCgid2lkdGgiLGUuc2NvcmUvZS50b3RhbCoxMDArIiUiKX19dmFyIExaLFBaLEdvLG02PXgoKCk9PnthMSgpO2soKTtMWj1bW1siIiwicmlnaHQtc2lkZSIsIiJdXV0sUFo9WyJbcmlnaHQtc2lkZV0iXTtHbz0oKCk9PntjbGFzcyB0e2Rlc2NyaXB0aW9uO3RvdGFsO3Njb3JlO3Nob3dBc1BlcmNlbnRhZ2U9ITA7c2hvd1Byb2dyZXNzQmFyPSEwO3N0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbInNjb3JlLWNhcmQiXV0saW5wdXRzOntkZXNjcmlwdGlvbjoiZGVzY3JpcHRpb24iLHRvdGFsOiJ0b3RhbCIsc2NvcmU6InNjb3JlIixzaG93QXNQZXJjZW50YWdlOiJzaG93QXNQZXJjZW50YWdlIixzaG93UHJvZ3Jlc3NCYXI6InNob3dQcm9ncmVzc0JhciJ9LG5nQ29udGVudFNlbGVjdG9yczpQWixkZWNsczo5LHZhcnM6Myxjb25zdHM6W1sxLCJzY29yZS1ncm91cCJdLFsxLCJzY29yZSJdLFsxLCJjYXRlZ29yeSJdLFsxLCJwcm9ncmVzcy1iYXItY29udGFpbmVyIl0sWzEsInJpZ2h0LWdyb3VwIl0sWzEsImZyYWN0aW9uLXRvdGFsIl0sWzEsInByb2dyZXNzLWJhciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKFJlKExaKSxHdCgwLCJkaXYiLDApKDEsInAiLDEpLE0oMixWWiwyLDQpKDMsT1osMywyKSxKdCgpLEd0KDQsInAiLDIpLG0oNSksSnQoKSxNKDYsSFosMiwyLCJkaXYiLDMpLEp0KCksR3QoNywiZGl2Iiw0KSxtZSg4KSxKdCgpKSxpJjImJihsKDIpLHcoYS5zaG93QXNQZXJjZW50YWdlPT09ITA/MjozKSxsKDMpLEEoYS5kZXNjcmlwdGlvbiksbCgpLHcoYS5zaG93UHJvZ3Jlc3NCYXI9PT0hMD82Oi0xKSl9LGRlcGVuZGVuY2llczpbSmRdLHN0eWxlczpbYFtfbmdob3N0LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10aGVtZS1iYWNrZ3JvdW5kLWRhcmspO2JvcmRlci1yYWRpdXM6NHB4O2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6YXV0byBtaW4tY29udGVudDtoZWlnaHQ6MTAwJX0uc2NvcmUtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOjFyZW0gMCAxcmVtIDFyZW19LnNjb3JlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5zY29yZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtdGV4dCk7Zm9udC1zaXplOjMycHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NTAwO2xpbmUtaGVpZ2h0OjQycHg7bWFyZ2luLWJvdHRvbTowfS5zY29yZS1ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICAuZnJhY3Rpb24tdG90YWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnZhcigtLXRoZW1lLXRleHQtZGFyayk7Zm9udC1zaXplOjE2cHg7bGluZS1oZWlnaHQ6MjZweH0uc2NvcmUtZ3JvdXBbX25nY29udGVudC0lQ09NUCVdICAgLmNhdGVnb3J5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjp2YXIoLS10aGVtZS10ZXh0KTtmb250LXNpemU6MjBweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo1MDA7bGluZS1oZWlnaHQ6MjNweH0ucHJvZ3Jlc3MtYmFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10aGVtZS1iYWNrZ3JvdW5kLWxpZ2h0ZXIpO2JvcmRlci1yYWRpdXM6M3B4O21heC13aWR0aDoyMDBweDtvdmVyZmxvdzpoaWRkZW59LnByb2dyZXNzLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdICAgLnByb2dyZXNzLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10aGVtZS1hY2NlbnQpO2hlaWdodDo4cHh9CgoKCgpgXX0pfXJldHVybiB0fSkoKX0pO2Z1bmN0aW9uIE5aKHQsbil7dCYxJiYoTXQoKSx1KDAsInN0b3AiLDgpKX1mdW5jdGlvbiBSWih0LG4pe2lmKHQmMSYmKE10KCksdSgwLCJzdG9wIiw3KSksdCYyKXtsZXQgZT12KCkuJGltcGxpY2l0O0coIm9mZnNldCIsZS5zb2x2ZWRDaGFsbGVuZ2VzL2UuYXZhaWxhYmxlQ2hhbGxlbmdlcyoxMDArIiUiKX19ZnVuY3Rpb24gRloodCxuKXtpZih0JjEmJihjKDAsImRpdiIsMikoMSwiZGl2IiwzKSxNdCgpLGMoMiwic3ZnIiw0KSx1KDMsInBhdGgiLDUpLGMoNCwiZGVmcyIpKDUsImxpbmVhckdyYWRpZW50Iiw2KSx1KDYsInN0b3AiLDcpLE0oNyxOWiwxLDAsIjpzdmc6c3RvcCIsOCkoOCxSWiwxLDEsIjpzdmc6c3RvcCIsNyksdSg5LCJzdG9wIiw3KSgxMCwic3RvcCIsOSkscygpKCkoKSx5aSgpLGMoMTEsInNwYW4iLDEwKSxtKDEyKSxzKCkoKSxjKDEzLCJzcGFuIiksbSgxNCksYygxNSwic3BhbiIsMTEpLG0oMTYpLHMoKSgpKCkpLHQmMil7bGV0IGU9bi4kaW1wbGljaXQ7bCgzKSxHKCJmaWxsIiwidXJsKCNzb2x2ZWQtZ3JhZGllbnQtIitlLmRpZmZpY3VsdHkrIikiKSxsKDIpLEcoImlkIiwic29sdmVkLWdyYWRpZW50LSIrZS5kaWZmaWN1bHR5KSxsKDIpLHcoZS5hdmFpbGFibGVDaGFsbGVuZ2VzPT09MD83OjgpLGwoNSksQShlLmRpZmZpY3VsdHkpLGwoMiksRSgiICIsZS5zb2x2ZWRDaGFsbGVuZ2VzLCIvIiksbCgyKSxBKGUuYXZhaWxhYmxlQ2hhbGxlbmdlcyl9fXZhciBCWixwUyxmUz14KCgpPT57VygpO202KCk7aygpO1coKTtCWj1PYmplY3QuZnJlZXplKHsxOntkaWZmaWN1bHR5OjEsYXZhaWxhYmxlQ2hhbGxlbmdlczowLHNvbHZlZENoYWxsZW5nZXM6MH0sMjp7ZGlmZmljdWx0eToyLGF2YWlsYWJsZUNoYWxsZW5nZXM6MCxzb2x2ZWRDaGFsbGVuZ2VzOjB9LDM6e2RpZmZpY3VsdHk6MyxhdmFpbGFibGVDaGFsbGVuZ2VzOjAsc29sdmVkQ2hhbGxlbmdlczowfSw0OntkaWZmaWN1bHR5OjQsYXZhaWxhYmxlQ2hhbGxlbmdlczowLHNvbHZlZENoYWxsZW5nZXM6MH0sNTp7ZGlmZmljdWx0eTo1LGF2YWlsYWJsZUNoYWxsZW5nZXM6MCxzb2x2ZWRDaGFsbGVuZ2VzOjB9LDY6e2RpZmZpY3VsdHk6NixhdmFpbGFibGVDaGFsbGVuZ2VzOjAsc29sdmVkQ2hhbGxlbmdlczowfX0pLHBTPSgoKT0+e2NsYXNzIHR7YWxsQ2hhbGxlbmdlcz1bXTt0b3RhbENoYWxsZW5nZXM7c29sdmVkQ2hhbGxlbmdlcztkaWZmaWN1bHR5U3VtbWFyaWVzPVt7ZGlmZmljdWx0eToxLGF2YWlsYWJsZUNoYWxsZW5nZXM6MCxzb2x2ZWRDaGFsbGVuZ2VzOjB9LHtkaWZmaWN1bHR5OjIsYXZhaWxhYmxlQ2hhbGxlbmdlczowLHNvbHZlZENoYWxsZW5nZXM6MH0se2RpZmZpY3VsdHk6MyxhdmFpbGFibGVDaGFsbGVuZ2VzOjAsc29sdmVkQ2hhbGxlbmdlczowfSx7ZGlmZmljdWx0eTo0LGF2YWlsYWJsZUNoYWxsZW5nZXM6MCxzb2x2ZWRDaGFsbGVuZ2VzOjB9LHtkaWZmaWN1bHR5OjUsYXZhaWxhYmxlQ2hhbGxlbmdlczowLHNvbHZlZENoYWxsZW5nZXM6MH0se2RpZmZpY3VsdHk6NixhdmFpbGFibGVDaGFsbGVuZ2VzOjAsc29sdmVkQ2hhbGxlbmdlczowfV07bmdPbkluaXQoKXt0aGlzLnVwZGF0ZWROdW1iZXJPZlNvbHZlZENoYWxsZW5nZXMoKX1uZ09uQ2hhbmdlcygpe3RoaXMudXBkYXRlZE51bWJlck9mU29sdmVkQ2hhbGxlbmdlcygpfXVwZGF0ZWROdW1iZXJPZlNvbHZlZENoYWxsZW5nZXMoKXtsZXQgZT10aGlzLmFsbENoYWxsZW5nZXMuZmlsdGVyKHI9PnIuc29sdmVkKS5sZW5ndGgsaT10aGlzLmFsbENoYWxsZW5nZXMuZmlsdGVyKHI9PnIuaGFzQ29kaW5nQ2hhbGxlbmdlKSxhPWkubWFwKHI9PnIuY29kaW5nQ2hhbGxlbmdlU3RhdHVzKS5yZWR1Y2UoKHIsbyk9PnIrbywwKTt0aGlzLmRpZmZpY3VsdHlTdW1tYXJpZXM9dC5jYWxjdWxhdGVEaWZmaWN1bHR5U3VtbWFyaWVzKHRoaXMuYWxsQ2hhbGxlbmdlcyksdGhpcy50b3RhbENoYWxsZW5nZXM9dGhpcy5hbGxDaGFsbGVuZ2VzLmxlbmd0aCtpLmxlbmd0aCoyLHRoaXMuc29sdmVkQ2hhbGxlbmdlcz1lK2F9c3RhdGljIGNhbGN1bGF0ZURpZmZpY3VsdHlTdW1tYXJpZXMoZSl7bGV0IGk9c3RydWN0dXJlZENsb25lKEJaKTtmb3IobGV0IGEgb2YgZSlpW2EuZGlmZmljdWx0eV0uYXZhaWxhYmxlQ2hhbGxlbmdlcys9YS5oYXNDb2RpbmdDaGFsbGVuZ2U/MzoxLGEuc29sdmVkJiYoaVthLmRpZmZpY3VsdHldLnNvbHZlZENoYWxsZW5nZXMrKyxpW2EuZGlmZmljdWx0eV0uc29sdmVkQ2hhbGxlbmdlcys9YS5oYXNDb2RpbmdDaGFsbGVuZ2U/YS5jb2RpbmdDaGFsbGVuZ2VTdGF0dXM6MCk7cmV0dXJuIE9iamVjdC52YWx1ZXMoaSkuc29ydCgoYSxyKT0+YS5kaWZmaWN1bHR5LXIuZGlmZmljdWx0eSl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siZGlmZmljdWx0eS1vdmVydmlldy1zY29yZS1jYXJkIl1dLGlucHV0czp7YWxsQ2hhbGxlbmdlczoiYWxsQ2hhbGxlbmdlcyJ9LGZlYXR1cmVzOltIZV0sZGVjbHM6NSx2YXJzOjcsY29uc3RzOltbMywiZGVzY3JpcHRpb24iLCJ0b3RhbCIsInNjb3JlIiwic2hvd0FzUGVyY2VudGFnZSIsInNob3dQcm9ncmVzc0JhciJdLFsicmlnaHQtc2lkZSIsIiIsMSwiZGlmZmljdWx0aWVzLWdyb3VwIl0sWzEsImRpZmZpY3VsdHktY29udGFpbmVyIl0sWzEsInN0YXItY29udGFpbmVyIl0sWyJ3aWR0aCIsIjI4IiwiaGVpZ2h0IiwiMjUiLCJ2aWV3Qm94IiwiMCAwIDI4IDI1IiwiZmlsbCIsIm5vbmUiLCJ4bWxucyIsImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIl0sWyJkIiwiTTEyLjY0OTYgMS4yNTg3NEw5LjU3ODU0IDcuNDg1NDFMMi43MDc1NyA4LjQ4NzEzQzEuNDc1NCA4LjY2NTg0IDAuOTgxNTk2IDEwLjE4NDkgMS44NzUxNSAxMS4wNTQ5TDYuODQ2MTQgMTUuODk4OUw1LjY3MDQxIDIyLjc0MTdDNS40NTg3OCAyMy45Nzg2IDYuNzYxNDkgMjQuOTA1IDcuODUyNTcgMjQuMzI2NkwxMy45OTkzIDIxLjA5NTdMMjAuMTQ2IDI0LjMyNjZDMjEuMjM3MSAyNC45MDAzIDIyLjUzOTggMjMuOTc4NiAyMi4zMjgyIDIyLjc0MTdMMjEuMTUyNCAxNS44OTg5TDI2LjEyMzQgMTEuMDU0OUMyNy4wMTcgMTAuMTg0OSAyNi41MjMyIDguNjY1ODQgMjUuMjkxIDguNDg3MTNMMTguNDIgNy40ODU0MUwxNS4zNDkgMS4yNTg3NEMxNC43OTg4IDAuMTQ4ODQ3IDEzLjIwNDUgMC4xMzQ3MzggMTIuNjQ5NiAxLjI1ODc0WiJdLFsieDEiLCIwIiwieDIiLCIwIiwieTEiLCIxIiwieTIiLCIwIl0sWyJzdG9wLWNvbG9yIiwidmFyKC0tdGhlbWUtYWNjZW50KSJdLFsib2Zmc2V0IiwiMCUiLCJzdG9wLWNvbG9yIiwidmFyKC0tdGhlbWUtYWNjZW50KSJdLFsic3RvcC1jb2xvciIsInZhcigtLXRoZW1lLXByaW1hcnkpIl0sWzEsInN0YXItZGlmZmljdWx0eS1sYWJlbCJdLFsxLCJ0b3RhbC1jaGFsbGVuZ2VzIl1dLHRlbXBsYXRlOmZ1bmN0aW9uKGksYSl7aSYxJiYoYygwLCJzY29yZS1jYXJkIiwwKSxiKDEsInRyYW5zbGF0ZSIpLGMoMiwiZGl2IiwxKSxxZSgzLEZaLDE3LDYsImRpdiIsMixGdCkscygpKCkpLGkmMiYmKGYoImRlc2NyaXB0aW9uIixDKDEsNSwiVElUTEVfQ0hBTExFTkdFU19TT0xWRUQiKSkoInRvdGFsIixhLnRvdGFsQ2hhbGxlbmdlcykoInNjb3JlIixhLnNvbHZlZENoYWxsZW5nZXMpKCJzaG93QXNQZXJjZW50YWdlIiwhMSkoInNob3dQcm9ncmVzc0JhciIsITEpLGwoMyksR2UoYS5kaWZmaWN1bHR5U3VtbWFyaWVzKSl9LGRlcGVuZGVuY2llczpbR28sWSxLXSxzdHlsZXM6W2BAbWVkaWEgKG1heC13aWR0aDogODEwcHgpe1tfbmdob3N0LSVDT01QJV17Z3JpZC1jb2x1bW46c3BhbiAyfX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpe1tfbmdob3N0LSVDT01QJV17Z3JpZC1jb2x1bW46c3BhbiAxfX0uZGlmZmljdWx0aWVzLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRoZW1lLWJhY2tncm91bmQtZGFya2VzdCk7Ym9yZGVyLXJhZGl1czo0cHg7Y29sb3I6dmFyKC0tdGhlbWUtdGV4dCk7Y29sdW1uLWdhcDoxcmVtO2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmciAxZnI7aGVpZ2h0OmNhbGMoMTAwJSAtIDEuNXJlbSk7bWFyZ2luOi4yNXJlbTtwYWRkaW5nOi41cmVtIDFyZW07cm93LWdhcDouMjVyZW19LmRpZmZpY3VsdGllcy1ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICAuZGlmZmljdWx0eS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmRpZmZpY3VsdGllcy1ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICAudG90YWwtY2hhbGxlbmdlc1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6dmFyKC0tdGhlbWUtdGV4dC1pbnZlcnQtMzApfS5zdGFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5zdGFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gICAuc3Rhci1kaWZmaWN1bHR5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtsaW5lLWhlaWdodDoxMXB4O21hcmdpbi10b3A6LjEyNXJlbTtwb3NpdGlvbjphYnNvbHV0ZX0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7dmFyIHVTLGdTPXgoKCk9PntXKCk7bTYoKTtrKCk7VygpO3VTPSgoKT0+e2NsYXNzIHR7YWxsQ2hhbGxlbmdlcz1bXTthdmFpbGFibGVDb2RpbmdDaGFsbGVuZ2VzO3NvbHZlZENvZGluZ0NoYWxsZW5nZXM7bmdPbkluaXQoKXt0aGlzLnVwZGF0ZWROdW1iZXJPZlNvbHZlZENoYWxsZW5nZXMoKX1uZ09uQ2hhbmdlcygpe3RoaXMudXBkYXRlZE51bWJlck9mU29sdmVkQ2hhbGxlbmdlcygpfXVwZGF0ZWROdW1iZXJPZlNvbHZlZENoYWxsZW5nZXMoKXtsZXQgZT10aGlzLmFsbENoYWxsZW5nZXMuZmlsdGVyKGk9PmkuaGFzQ29kaW5nQ2hhbGxlbmdlKTt0aGlzLnNvbHZlZENvZGluZ0NoYWxsZW5nZXM9ZS5tYXAoaT0+aS5jb2RpbmdDaGFsbGVuZ2VTdGF0dXMpLnJlZHVjZSgoaSxhKT0+aSthLDApLHRoaXMuYXZhaWxhYmxlQ29kaW5nQ2hhbGxlbmdlcz1lLmxlbmd0aCoyfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImNvZGluZy1jaGFsbGVuZ2UtcHJvZ3Jlc3Mtc2NvcmUtY2FyZCJdXSxpbnB1dHM6e2FsbENoYWxsZW5nZXM6ImFsbENoYWxsZW5nZXMifSxmZWF0dXJlczpbSGVdLGRlY2xzOjEwLHZhcnM6Nixjb25zdHM6W1szLCJkZXNjcmlwdGlvbiIsInRvdGFsIiwic2NvcmUiLCJzaG93QXNQZXJjZW50YWdlIl0sWyJyaWdodC1zaWRlIiwiIiwxLCJpY29uLWdyb3VwIl0sWyJ3aWR0aCIsIjc0IiwiaGVpZ2h0IiwiODUiLCJ2aWV3Qm94IiwiMCAwIDc0IDg1IiwiZmlsbCIsIm5vbmUiLCJ4bWxucyIsImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIl0sWyJjbGlwLXBhdGgiLCJ1cmwoI2NsaXAwXzJfNjM1KSJdLFsiZCIsIk02OS4yMzcxIDQxLjE3NzhDNjguOTUwNiA0MC44NzAyIDY4LjYwNDkgNDAuNjIzNSA2OC4yMjA5IDQwLjQ1MjRDNjcuODM2OSA0MC4yODEzIDY3LjQyMjQgNDAuMTg5MyA2Ny4wMDIxIDQwLjE4MTlDNjYuNTgxNyA0MC4xNzQ1IDY2LjE2NDIgNDAuMjUxOCA2NS43NzQ0IDQwLjQwOTJDNjUuMzg0NiA0MC41NjY3IDY1LjAzMDUgNDAuODAxIDY0LjczMzIgNDEuMDk4M0M2NC40MzYgNDEuMzk1NiA2NC4yMDE2IDQxLjc0OTcgNjQuMDQ0MiA0Mi4xMzk1QzYzLjg4NjcgNDIuNTI5MyA2My44MDk0IDQyLjk0NjggNjMuODE2OCA0My4zNjcxQzYzLjgyNDIgNDMuNzg3NSA2My45MTYyIDQ0LjIwMiA2NC4wODczIDQ0LjU4NkM2NC4yNTg0IDQ0Ljk3IDY0LjUwNTEgNDUuMzE1NiA2NC44MTI3IDQ1LjYwMjJMNjUuNTI2NSA0Ni4zMjAxQzY4LjM3MzEgNDkuMTY2OCA3MC4yODA2IDUxLjA3ODUgNzEuNTEyIDUyLjY5OEM3Mi42OTMyIDU0LjI0MjQgNzIuOTYwMyA1NS4xNDM5IDcyLjk2MDMgNTUuOTEyQzcyLjk2MDMgNTYuNjggNzIuNjkzMiA1Ny41ODE2IDcxLjUxMiA1OS4xMjU5QzcwLjI4MDYgNjAuNzQxMyA2OC4zNzMxIDYyLjY1NzEgNjUuNTI2NSA2NS41MDM4TDY0LjgxMjcgNjYuMjIxN0M2NC41MDUxIDY2LjUwODMgNjQuMjU4NCA2Ni44NTM5IDY0LjA4NzMgNjcuMjM3OUM2My45MTYyIDY3LjYyMTkgNjMuODI0MiA2OC4wMzY1IDYzLjgxNjggNjguNDU2OEM2My44MDk0IDY4Ljg3NzEgNjMuODg2NyA2OS4yOTQ3IDY0LjA0NDIgNjkuNjg0NUM2NC4yMDE2IDcwLjA3NDMgNjQuNDM2IDcwLjQyODQgNjQuNzMzMiA3MC43MjU2QzY1LjAzMDUgNzEuMDIyOSA2NS4zODQ2IDcxLjI1NzIgNjUuNzc0NCA3MS40MTQ3QzY2LjE2NDIgNzEuNTcyMSA2Ni41ODE3IDcxLjY0OTUgNjcuMDAyMSA3MS42NDJDNjcuNDIyNCA3MS42MzQ2IDY3LjgzNjkgNzEuNTQyNiA2OC4yMjA5IDcxLjM3MTVDNjguNjA0OSA3MS4yMDA0IDY4Ljk1MDYgNzAuOTUzNyA2OS4yMzcxIDcwLjY0NjJMNzAuMTA5NSA2OS43NzhDNzIuNzYgNjcuMTI3NSA3NC45NzIyIDY0LjkxNTMgNzYuNDkxNSA2Mi45MjQzQzc4LjA5NDQgNjAuODIwNiA3OS4yMjEzIDU4LjYgNzkuMjIxMyA1NS45MTJDNzkuMjIxMyA1My4yMjM5IDc4LjA5NDQgNTEuMDAzMyA3Ni40OTE1IDQ4Ljg5OTdDNzQuOTcyMiA0Ni45MDg3IDcyLjc2IDQ0LjY5NjQgNzAuMTA1MyA0Mi4wNDZMNjkuMjM3MSA0MS4xNzc4Wk01OC42MjY5IDMyLjcyOTZDNTkuNDI4IDMyLjk0NDggNjAuMTExMSAzMy40NjkyIDYwLjUyNTkgMzQuMTg3N0M2MC45NDA2IDM0LjkwNjIgNjEuMDUzMyAzNS43NTk5IDYwLjgzOTEgMzYuNTYxM0w1MC4wMzY4IDc2Ljg4MjFDNDkuOTMwMiA3Ny4yNzkyIDQ5Ljc0NjQgNzcuNjUxNSA0OS40OTU5IDc3Ljk3NzZDNDkuMjQ1NCA3OC4zMDM3IDQ4LjkzMzIgNzguNTc3MiA0OC41NzcgNzguNzgyN0M0Ny44NTc2IDc5LjE5NzUgNDcuMDAyOSA3OS4zMDk2IDQ2LjIwMDkgNzkuMDk0M0M0NS4zOTg4IDc4Ljg3OSA0NC43MTUyIDc4LjM1MzkgNDQuMzAwMyA3Ny42MzQ1QzQzLjg4NTUgNzYuOTE1MiA0My43NzMzIDc2LjA2MDUgNDMuOTg4NyA3NS4yNTg0TDU0Ljc5MSAzNC45NDE4QzU0Ljg5NzUgMzQuNTQ0MiA1NS4wODE0IDM0LjE3MTUgNTUuMzMyMSAzMy44NDVDNTUuNTgyOCAzMy41MTg2IDU1Ljg5NTUgMzMuMjQ0NyA1Ni4yNTIyIDMzLjAzOTNDNTYuNjA4OSAzMi44MzM4IDU3LjAwMjYgMzIuNzAwNyA1Ny40MTA4IDMyLjY0NzVDNTcuODE5IDMyLjU5NDQgNTguMjMzNiAzMi42MjIzIDU4LjYzMSAzMi43Mjk2SDU4LjYyNjlaTTQwLjAxOTIgNDEuMTc3OEMzOS40MzIyIDQwLjU5MTUgMzguNjM2NiA0MC4yNjIyIDM3LjgwNyA0MC4yNjIyQzM2Ljk3NzQgNDAuMjYyMiAzNi4xODE3IDQwLjU5MTUgMzUuNTk0OCA0MS4xNzc4TDM0LjcyNjYgNDIuMDQ2QzMyLjA3MTkgNDQuNjk2NCAyOS44NTk3IDQ2LjkwODcgMjguMzQwNCA0OC44OTk3QzI2LjczNzUgNTEuMDAzMyAyNS42MTQ3IDUzLjIyMzkgMjUuNjE0NyA1NS45MTJDMjUuNjE0NyA1OC42IDI2Ljc0MTcgNjAuODIwNiAyOC4zNDA0IDYyLjkyNDNDMjkuODU5NyA2NC45MTUzIDMyLjA3MTkgNjcuMTI3NSAzNC43MjY2IDY5Ljc3OEwzNS41OTQ4IDcwLjY0NjJDMzYuMTg4MiA3MS4xOTkxIDM2Ljk3MzEgNzEuNTAwMiAzNy43ODQxIDcxLjQ4NTlDMzguNTk1MSA3MS40NzE2IDM5LjM2ODkgNzEuMTQzIDM5Ljk0MjUgNzAuNTY5NEM0MC41MTYgNjkuOTk1OSA0MC44NDQ2IDY5LjIyMjEgNDAuODU4OSA2OC40MTExQzQwLjg3MzIgNjcuNjAwMSA0MC41NzIyIDY2LjgxNTIgNDAuMDE5MiA2Ni4yMjE3TDM5LjMwNTQgNjUuNTAzOEMzNi40NTg4IDYyLjY1NzEgMzQuNTU1NCA2MC43NDU0IDMzLjMxOTkgNTkuMTI1OUMzMi4xMzg3IDU3LjU4MTYgMzEuODc1NyA1Ni42OCAzMS44NzU3IDU1LjkxMkMzMS44NzU3IDU1LjE0MzkgMzIuMTM4NyA1NC4yNDI0IDMzLjMxOTkgNTIuNjk4QzM0LjU1NTQgNTEuMDgyNyAzNi40NTg4IDQ5LjE2NjggMzkuMzA1NCA0Ni4zMjAxTDQwLjAyMzQgNDUuNjAyMkM0MC42MDk2IDQ1LjAxNTIgNDAuOTM4OSA0NC4yMTk2IDQwLjkzODkgNDMuMzlDNDAuOTM4OSA0Mi41NjA0IDQwLjYwOTYgNDEuNzY0NyA0MC4wMjM0IDQxLjE3NzhINDAuMDE5MloiLCJmaWxsIiwidmFyKC0tdGhlbWUtdGV4dCkiLCJmaWxsLW9wYWNpdHkiLCIwLjEyIl0sWyJmaWxsLXJ1bGUiLCJldmVub2RkIiwiY2xpcC1ydWxlIiwiZXZlbm9kZCIsImQiLCJNNTIuNDE4OCAxMS4wNDE2QzI3LjYzNzggMTEuMDQxNiA3LjU0ODM0IDMxLjEzMTEgNy41NDgzNCA1NS45MTJDNy41NDgzNCA4MC42OTMgMjcuNjM3OCAxMDAuNzgyIDUyLjQxODggMTAwLjc4MkM3Ny4xOTk4IDEwMC43ODIgOTcuMjg5MiA4MC42OTMgOTcuMjg5MiA1NS45MTJDOTcuMjg5MiAzMS4xMzExIDc3LjE5OTggMTEuMDQxNiA1Mi40MTg4IDExLjA0MTZaTTEzLjgwOTMgNTUuOTEyQzEzLjgwOTMgNDUuNjcyMiAxNy44NzcxIDM1Ljg1MTcgMjUuMTE3OCAyOC42MTExQzMyLjM1ODQgMjEuMzcwNCA0Mi4xNzg5IDE3LjMwMjYgNTIuNDE4OCAxNy4zMDI2QzYyLjY1ODYgMTcuMzAyNiA3Mi40NzkxIDIxLjM3MDQgNzkuNzE5NyAyOC42MTExQzg2Ljk2MDQgMzUuODUxNyA5MS4wMjgyIDQ1LjY3MjIgOTEuMDI4MiA1NS45MTJDOTEuMDI4MiA2Ni4xNTE5IDg2Ljk2MDQgNzUuOTcyNCA3OS43MTk3IDgzLjIxM0M3Mi40NzkxIDkwLjQ1MzcgNjIuNjU4NiA5NC41MjE1IDUyLjQxODggOTQuNTIxNUM0Mi4xNzg5IDk0LjUyMTUgMzIuMzU4NCA5MC40NTM3IDI1LjExNzggODMuMjEzQzE3Ljg3NzEgNzUuOTcyNCAxMy44MDkzIDY2LjE1MTkgMTMuODA5MyA1NS45MTJaIiwiZmlsbCIsInZhcigtLXRoZW1lLXRleHQpIiwiZmlsbC1vcGFjaXR5IiwiMC4xMiJdLFsiaWQiLCJjbGlwMF8yXzYzNSJdLFsid2lkdGgiLCIxMDYiLCJoZWlnaHQiLCIxMDYiLCJmaWxsIiwidmFyKC0tdGhlbWUtdGV4dCkiXV0sdGVtcGxhdGU6ZnVuY3Rpb24oaSxhKXtpJjEmJihjKDAsInNjb3JlLWNhcmQiLDApLGIoMSwidHJhbnNsYXRlIiksYygyLCJkaXYiLDEpLE10KCksYygzLCJzdmciLDIpKDQsImciLDMpLHUoNSwicGF0aCIsNCkoNiwicGF0aCIsNSkscygpLGMoNywiZGVmcyIpKDgsImNsaXBQYXRoIiw2KSx1KDksInJlY3QiLDcpLHMoKSgpKCkoKSgpKSxpJjImJmYoImRlc2NyaXB0aW9uIixDKDEsNCwiVElUTEVfQ09ESU5HX0NIQUxMRU5HRVMiKSkoInRvdGFsIixhLmF2YWlsYWJsZUNvZGluZ0NoYWxsZW5nZXMpKCJzY29yZSIsYS5zb2x2ZWRDb2RpbmdDaGFsbGVuZ2VzKSgic2hvd0FzUGVyY2VudGFnZSIsITApfSxkZXBlbmRlbmNpZXM6W0dvLFksS10sc3R5bGVzOlsiLmljb24tZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmZsZXgtZW5kO2Rpc3BsYXk6ZmxleDtoZWlnaHQ6MTAwJTtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9Il19KX1yZXR1cm4gdH0pKCl9KTt2YXIgdlMsX1M9eCgoKT0+e1coKTttNigpO2soKTtXKCk7dlM9KCgpPT57Y2xhc3MgdHthbGxDaGFsbGVuZ2VzPVtdO3NvbHZlZENoYWxsZW5nZXM7bmdPbkluaXQoKXt0aGlzLnVwZGF0ZWROdW1iZXJPZlNvbHZlZENoYWxsZW5nZXMoKX1uZ09uQ2hhbmdlcygpe3RoaXMudXBkYXRlZE51bWJlck9mU29sdmVkQ2hhbGxlbmdlcygpfXVwZGF0ZWROdW1iZXJPZlNvbHZlZENoYWxsZW5nZXMoKXt0aGlzLnNvbHZlZENoYWxsZW5nZXM9dGhpcy5hbGxDaGFsbGVuZ2VzLmZpbHRlcihlPT5lLnNvbHZlZCkubGVuZ3RofXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NWNtcD1EKHt0eXBlOnQsc2VsZWN0b3JzOltbImhhY2tpbmctY2hhbGxlbmdlLXByb2dyZXNzLXNjb3JlLWNhcmQiXV0saW5wdXRzOnthbGxDaGFsbGVuZ2VzOiJhbGxDaGFsbGVuZ2VzIn0sZmVhdHVyZXM6W0hlXSxkZWNsczo5LHZhcnM6Nixjb25zdHM6W1szLCJkZXNjcmlwdGlvbiIsInRvdGFsIiwic2NvcmUiLCJzaG93QXNQZXJjZW50YWdlIl0sWyJyaWdodC1zaWRlIiwiIiwxLCJpY29uLWdyb3VwIl0sWyJ3aWR0aCIsIjYyIiwiaGVpZ2h0IiwiNjkiLCJ2aWV3Qm94IiwiMCAwIDYyIDY5IiwiZmlsbCIsIm5vbmUiLCJ4bWxucyIsImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIl0sWyJjbGlwLXBhdGgiLCJ1cmwoI2NsaXAwXzJfNjIxKSJdLFsiZCIsIk01MS44NzUgNzIuNjI0OUgyOS4xMjVNNTEuODc1IDcyLjYyNDlWNDAuNzc0OUM1MS44NzUgNDAuMTcxNSA1MS42MzUzIDM5LjU5MjkgNTEuMjA4NyAzOS4xNjYyQzUwLjc4MiAzOC43Mzk2IDUwLjIwMzQgMzguNDk5OSA0OS42IDM4LjQ5OTlIMzEuNEMzMC43OTY2IDM4LjQ5OTkgMzAuMjE4IDM4LjczOTYgMjkuNzkxMyAzOS4xNjYyQzI5LjM2NDcgMzkuNTkyOSAyOS4xMjUgNDAuMTcxNSAyOS4xMjUgNDAuNzc0OVY3Mi42MjQ5TTUxLjg3NSA3Mi42MjQ5SDcyLjM1QzcyLjk1MzQgNzIuNjI0OSA3My41MzIgNzIuMzg1MiA3My45NTg3IDcxLjk1ODZDNzQuMzg1MyA3MS41MzE5IDc0LjYyNSA3MC45NTMzIDc0LjYyNSA3MC4zNDk5VjYxLjYyOTFDNzQuNjI1IDYxLjAyNTcgNzQuMzg1MyA2MC40NDcgNzMuOTU4NyA2MC4wMjA0QzczLjUzMiA1OS41OTM3IDcyLjk1MzQgNTkuMzU0MSA3Mi4zNSA1OS4zNTQxSDU0LjE1QzUzLjU0NjYgNTkuMzU0MSA1Mi45NjggNTkuNTkzNyA1Mi41NDEzIDYwLjAyMDRDNTIuMTE0NyA2MC40NDcgNTEuODc1IDYxLjAyNTcgNTEuODc1IDYxLjYyOTFWNzIuNjI0OVpNMjkuMTI1IDcyLjYyNDlWNTQuMDQ1N0MyOS4xMjUgNTMuNDQyNCAyOC44ODUzIDUyLjg2MzcgMjguNDU4NyA1Mi40MzcxQzI4LjAzMiA1Mi4wMTA0IDI3LjQ1MzQgNTEuNzcwNyAyNi44NSA1MS43NzA3SDguNjVDOC4wNDY2MyA1MS43NzA3IDcuNDY3OTggNTIuMDEwNCA3LjA0MTMzIDUyLjQzNzFDNi42MTQ2OSA1Mi44NjM3IDYuMzc1IDUzLjQ0MjQgNi4zNzUgNTQuMDQ1N1Y3MC4zNDk5QzYuMzc1IDcwLjk1MzMgNi42MTQ2OSA3MS41MzE5IDcuMDQxMzMgNzEuOTU4NkM3LjQ2Nzk4IDcyLjM4NTIgOC4wNDY2MyA3Mi42MjQ5IDguNjUgNzIuNjI0OUgyOS4xMjVaTTM1Ljk3MjcgMTIuMzg2N0wzOS40MTk0IDUuMDgwMTVDMzkuNTEyNCA0Ljg3MTI4IDM5LjY2NCA0LjY5Mzg0IDM5Ljg1NTggNC41NjkzM0M0MC4wNDc2IDQuNDQ0ODEgNDAuMjcxMyA0LjM3ODU0IDQwLjUgNC4zNzg1NEM0MC43Mjg3IDQuMzc4NTQgNDAuOTUyNCA0LjQ0NDgxIDQxLjE0NDIgNC41NjkzM0M0MS4zMzYgNC42OTM4NCA0MS40ODc2IDQuODcxMjggNDEuNTgwNiA1LjA4MDE1TDQ1LjAzMSAxMi4zODY3TDUyLjczNTcgMTMuNTY1OUM1My43MjUzIDEzLjcxNzYgNTQuMTE5NyAxNC45OTE2IDUzLjQwMyAxNS43MTk2TDQ3LjgyOTMgMjEuNDA3MUw0OS4xNDUgMjkuNDM3OEM0OS4zMTE4IDMwLjQ2OTEgNDguMjgwNSAzMS4yNTc4IDQ3LjM5MzMgMzAuNzY4N0w0MC41IDI2Ljk3N0wzMy42MDY4IDMwLjc2ODdDMzIuNzIzMyAzMS4yNTQgMzEuNjg4MiAzMC40NjkxIDMxLjg1NSAyOS40Mzc4TDMzLjE3MDcgMjEuNDA3MUwyNy41OTcgMTUuNzE5NkMyNi44NzY1IDE0Ljk5MTYgMjcuMjc0NyAxMy43MTc2IDI4LjI2MDUgMTMuNTY1OUwzNS45NzI3IDEyLjM4NjdaIiwic3Ryb2tlIiwidmFyKC0tdGhlbWUtdGV4dCkiLCJzdHJva2Utb3BhY2l0eSIsIjAuMTIiLCJzdHJva2Utd2lkdGgiLCI1LjY4NzUiLCJzdHJva2UtbGluZWNhcCIsInJvdW5kIiwic3Ryb2tlLWxpbmVqb2luIiwicm91bmQiXSxbImlkIiwiY2xpcDBfMl82MjEiXSxbIndpZHRoIiwiNjIiLCJoZWlnaHQiLCI2OSIsImZpbGwiLCJ2YXIoLS10aGVtZS10ZXh0KSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwic2NvcmUtY2FyZCIsMCksYigxLCJ0cmFuc2xhdGUiKSxjKDIsImRpdiIsMSksTXQoKSxjKDMsInN2ZyIsMikoNCwiZyIsMyksdSg1LCJwYXRoIiw0KSxzKCksYyg2LCJkZWZzIikoNywiY2xpcFBhdGgiLDUpLHUoOCwicmVjdCIsNikscygpKCkoKSgpKCkpLGkmMiYmZigiZGVzY3JpcHRpb24iLEMoMSw0LCJUSVRMRV9IQUNLSU5HX0NIQUxMRU5HRVMiKSkoInRvdGFsIixhLmFsbENoYWxsZW5nZXMubGVuZ3RoKSgic2NvcmUiLGEuc29sdmVkQ2hhbGxlbmdlcykoInNob3dBc1BlcmNlbnRhZ2UiLCEwKX0sZGVwZW5kZW5jaWVzOltHbyxZLEtdLHN0eWxlczpbIi5pY29uLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpmbGV4LWVuZDtkaXNwbGF5OmZsZXg7aGVpZ2h0OjEwMCU7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfSJdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24galoodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImZpbHRlci1zZXR0aW5ncyIsNCksUygiZmlsdGVyU2V0dGluZ0NoYW5nZSIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5vbkZpbHRlclNldHRpbmdVcGRhdGUoYSkpfSkscygpfWlmKHQmMil7bGV0IGU9digpO2YoImZpbHRlclNldHRpbmciLGUuZmlsdGVyU2V0dGluZykoImFsbENoYWxsZW5nZXMiLGUuYWxsQ2hhbGxlbmdlcykoInJlc2V0IixlLnJlc2V0LmJpbmQoZSkpfX1mdW5jdGlvbiBxWih0LG4pe3QmMSYmKGMoMCwiZGl2IiwzKSx1KDEsIm1hdC1zcGlubmVyIikscygpKX1mdW5jdGlvbiBHWih0LG4pe2lmKHQmMSYmdSgwLCJjaGFsbGVuZ2UtY2FyZCIsOSksdCYyKXtsZXQgZT1uLiRpbXBsaWNpdCxpPXYoMyk7ZigiY2hhbGxlbmdlIixlKSgiYXBwbGljYXRpb25Db25maWd1cmF0aW9uIixpLmFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbikoIm9wZW5Db2RpbmdDaGFsbGVuZ2VEaWFsb2ciLGkub3BlbkNvZGluZ0NoYWxsZW5nZURpYWxvZy5iaW5kKGkpKSgicmVwZWF0Q2hhbGxlbmdlTm90aWZpY2F0aW9uIixpLnJlcGVhdENoYWxsZW5nZU5vdGlmaWNhdGlvbi5iaW5kKGkpKSgidW5sb2NrSGludCIsaS51bmxvY2tIaW50LmJpbmQoaSkpKCJsYXN0VW5sb2NrZWRDaGFsbGVuZ2VLZXkiLGkubGFzdFVubG9ja2VkQ2hhbGxlbmdlS2V5KSgiaGlnaGxpZ2h0Q29kaW5nQnV0dG9uIixpLmhpZ2hsaWdodGVkQ2hhbGxlbmdlS2V5PT09ZS5rZXkpKCJjaGFsbGVuZ2VJZCIsImNoYWxsZW5nZS0iK2Uua2V5KSgibmdDbGFzcyIsdjAoOSxVWixlLnNvbHZlZCwhZS5zb2x2ZWQsZS5kaXNhYmxlZEVudiE9PW51bGwpKX19ZnVuY3Rpb24gV1oodCxuKXtpZih0JjEmJihjKDAsImRpdiIsNykscWUoMSxHWiwxLDEzLCJjaGFsbGVuZ2UtY2FyZCIsOSxVZCgpLmdldENoYWxsZW5nZUtleSwhMCkscygpKSx0JjIpe2xldCBlPXYoMik7bCgpLEdlKGUuZmlsdGVyZWRDaGFsbGVuZ2VzKX19ZnVuY3Rpb24gUVoodCxuKXt0JjEmJihjKDAsImRpdiIsMTApKDEsInAiKSxtKDIpLGIoMywidHJhbnNsYXRlIikscygpKCkpLHQmMiYmKGwoMiksQShDKDMsMSwiTk9fQ0hBTExFTkdFU19GT1VORCIpKSl9ZnVuY3Rpb24gWVoodCxuKXtpZih0JjEmJk0oMCxRWiw0LDMsImRpdiIsMTApLHQmMil7bGV0IGU9digyKTt3KGUuYWxsQ2hhbGxlbmdlcy5sZW5ndGg+MD8wOi0xKX19ZnVuY3Rpb24gWloodCxuKXtpZih0JjEpe2xldCBlPUwoKTtjKDAsImNoYWxsZW5nZXMtdW5hdmFpbGFibGUtd2FybmluZyIsNSksUygiZmlsdGVyU2V0dGluZ0NoYW5nZSIsZnVuY3Rpb24oYSl7eihlKTtsZXQgcj12KCk7cmV0dXJuIFQoci5vbkZpbHRlclNldHRpbmdVcGRhdGUoYSkpfSkscygpLHUoMSwidHV0b3JpYWwtbW9kZS13YXJuaW5nIiw2KSxNKDIsV1osMywwLCJkaXYiLDcpKDMsWVosMSwxKSx1KDQsImltZyIsOCl9aWYodCYyKXtsZXQgZT12KCk7ZigiY2hhbGxlbmdlcyIsZS5hbGxDaGFsbGVuZ2VzKSgiZmlsdGVyU2V0dGluZyIsZS5maWx0ZXJTZXR0aW5nKSxsKCksZigiYWxsQ2hhbGxlbmdlcyIsZS5hbGxDaGFsbGVuZ2VzKSgiYXBwbGljYXRpb25Db25maWciLGUuYXBwbGljYXRpb25Db25maWd1cmF0aW9uKSxsKCksdyhlLmZpbHRlcmVkQ2hhbGxlbmdlcy5sZW5ndGg+MD8yOjMpfX12YXIgVVosYlMsQ1M9eCgoKT0+e2soKTtwMSgpO2hhKCk7Z2koKTtYdCgpO1ZDKCk7VnMoKTtLMSgpO1FDKCk7d2EoKTtaQygpO0tDKCk7WGEoKTtxdygpO1coKTtRdygpO1p3KCk7S3coKTtlUygpO2hTKCk7YTEoKTtmUygpO2dTKCk7X1MoKTtrKCk7VygpO1VaPSh0LG4sZSk9Pih7c29sdmVkOnQsdW5zb2x2ZWQ6bixkaXNhYmxlZDplfSk7YlM9KCgpPT57Y2xhc3MgdHtjaGFsbGVuZ2VTZXJ2aWNlPWgoU2kpO2hpbnRTZXJ2aWNlPWgoWUMpO2NvbmZpZ3VyYXRpb25TZXJ2aWNlPWgoTHQpO3Nhbml0aXplcj1oKFoxKTtuZ1pvbmU9aChyZSk7aW89aChqaSk7ZGlhbG9nPWgoTjEpO3JvdXRlcj1oKHl0KTtyb3V0ZT1oKCQxKTthbGxDaGFsbGVuZ2VzPVtdO2ZpbHRlcmVkQ2hhbGxlbmdlcz1bXTtmaWx0ZXJTZXR0aW5nPXN0cnVjdHVyZWRDbG9uZShjcik7YXBwbGljYXRpb25Db25maWd1cmF0aW9uPW51bGw7bGFzdFVubG9ja2VkQ2hhbGxlbmdlS2V5PW51bGw7aGlnaGxpZ2h0ZWRDaGFsbGVuZ2VLZXk9bnVsbDtpc0luaXRpYWxpemVkPSExO3N1YnNjcmlwdGlvbnM9W107bmdPbkluaXQoKXtsZXQgZT1IYShbdGhpcy5jaGFsbGVuZ2VTZXJ2aWNlLmZpbmQoe3NvcnQ6Im5hbWUifSksdGhpcy5oaW50U2VydmljZS5nZXRBbGwoKSx0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbigpXSkuc3Vic2NyaWJlKChbYSxyLG9dKT0+e3RoaXMuYXBwbGljYXRpb25Db25maWd1cmF0aW9uPW87bGV0IGQ9YS5tYXAocD0+VTEoWGUoe30scCkse2hpbnRUZXh0OnIuZmlsdGVyKGc9PmcuQ2hhbGxlbmdlSWQ9PT1wLmlkJiZnLnVubG9ja2VkKS5tYXAoZz0+Zy5vcmRlcisiLiAiK2cudGV4dCkuam9pbihgCgpgKSxuZXh0SGludDpyLmZpbHRlcihnPT5nLkNoYWxsZW5nZUlkPT09cC5pZCYmIWcudW5sb2NrZWQpLnNvcnQoKGcsXyk9Pmcub3JkZXItXy5vcmRlcikubWFwKGc9PmcuaWQpWzBdLGhpbnRzVW5sb2NrZWQ6ci5maWx0ZXIoZz0+Zy5DaGFsbGVuZ2VJZD09PXAuaWQmJmcudW5sb2NrZWQpLmxlbmd0aCxoaW50c0F2YWlsYWJsZTpyLmZpbHRlcihnPT5nLkNoYWxsZW5nZUlkPT09cC5pZCkubGVuZ3RoLHRhZ0xpc3Q6cC50YWdzP3AudGFncy5zcGxpdCgiLCIpLm1hcChnPT5nLnRyaW0oKSk6W10sb3JpZ2luYWxEZXNjcmlwdGlvbjpwLmRlc2NyaXB0aW9uLGRlc2NyaXB0aW9uOnRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHAuZGVzY3JpcHRpb24pfSkpO3RoaXMuYWxsQ2hhbGxlbmdlcz1kLHRoaXMuZmlsdGVyQW5kVXBkYXRlQ2hhbGxlbmdlcygpLHRoaXMuaXNJbml0aWFsaXplZD0hMH0pO3RoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGUpO2xldCBpPXRoaXMucm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKGE9Pnt0aGlzLmZpbHRlclNldHRpbmc9UEMoYSksdGhpcy5maWx0ZXJBbmRVcGRhdGVDaGFsbGVuZ2VzKCksdGhpcy5oYW5kbGVIaWdobGlnaHRDaGFsbGVuZ2UoYSl9KTt0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChpKSx0aGlzLmlvLnNvY2tldCgpLm9uKCJjaGFsbGVuZ2Ugc29sdmVkIix0aGlzLm9uQ2hhbGxlbmdlU29sdmVkV2Vic29ja2V0LmJpbmQodGhpcykpLHRoaXMuaW8uc29ja2V0KCkub24oImNvZGUgY2hhbGxlbmdlIHNvbHZlZCIsdGhpcy5vbkNvZGVDaGFsbGVuZ2VTb2x2ZWRXZWJzb2NrZXQuYmluZCh0aGlzKSl9bmdBZnRlclZpZXdJbml0KCl7bGV0IGU9dGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtczt0aGlzLmhhbmRsZUhpZ2hsaWdodENoYWxsZW5nZShlKX1uZ09uRGVzdHJveSgpe3RoaXMuaW8uc29ja2V0KCkub2ZmKCJjaGFsbGVuZ2Ugc29sdmVkIix0aGlzLm9uQ2hhbGxlbmdlU29sdmVkV2Vic29ja2V0LmJpbmQodGhpcykpLHRoaXMuaW8uc29ja2V0KCkub2ZmKCJjb2RlIGNoYWxsZW5nZSBzb2x2ZWQiLHRoaXMub25Db2RlQ2hhbGxlbmdlU29sdmVkV2Vic29ja2V0LmJpbmQodGhpcykpO2ZvcihsZXQgZSBvZiB0aGlzLnN1YnNjcmlwdGlvbnMpZS51bnN1YnNjcmliZSgpfW9uRmlsdGVyU2V0dGluZ1VwZGF0ZShlKXt0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSx7cXVlcnlQYXJhbXM6VTcoZSl9KX1vbkNoYWxsZW5nZVNvbHZlZFdlYnNvY2tldChlKXtlJiYodGhpcy5hbGxDaGFsbGVuZ2VzPXRoaXMuYWxsQ2hhbGxlbmdlcy5tYXAoaT0+aS5rZXk9PT1lLmtleT9VMShYZSh7fSxpKSx7c29sdmVkOiEwfSk6WGUoe30saSkpLHRoaXMuZmlsdGVyQW5kVXBkYXRlQ2hhbGxlbmdlcygpLHRoaXMubmdab25lLnJ1bigoKT0+e30pKX1vbkNvZGVDaGFsbGVuZ2VTb2x2ZWRXZWJzb2NrZXQoZSl7ZSYmKHRoaXMuYWxsQ2hhbGxlbmdlcz10aGlzLmFsbENoYWxsZW5nZXMubWFwKGk9Pmkua2V5PT09ZS5rZXk/VTEoWGUoe30saSkse2NvZGluZ0NoYWxsZW5nZVN0YXR1czplLmNvZGluZ0NoYWxsZW5nZVN0YXR1c30pOlhlKHt9LGkpKSx0aGlzLmZpbHRlckFuZFVwZGF0ZUNoYWxsZW5nZXMoKSx0aGlzLm5nWm9uZS5ydW4oKCk9Pnt9KSl9ZmlsdGVyQW5kVXBkYXRlQ2hhbGxlbmdlcygpe3RoaXMuZmlsdGVyZWRDaGFsbGVuZ2VzPWp3KCRDKHRoaXMuYWxsQ2hhbGxlbmdlcyxVMShYZSh7fSx0aGlzLmZpbHRlclNldHRpbmcpLHtyZXN0cmljdFRvVHV0b3JpYWxDaGFsbGVuZ2VzRmlyc3Q6dGhpcy5hcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb24/LmNoYWxsZW5nZXM/LnJlc3RyaWN0VG9UdXRvcmlhbHNGaXJzdD8/ITB9KSkpfWdldENoYWxsZW5nZUtleShlLGkpe3JldHVybiBpLmtleX1yZXNldCgpe3RoaXMucm91dGVyLm5hdmlnYXRlKFtdLHtxdWVyeVBhcmFtczpVNyhjcil9KX1vcGVuQ29kaW5nQ2hhbGxlbmdlRGlhbG9nKGUpe2xldCBpPXRoaXMuYWxsQ2hhbGxlbmdlcy5maW5kKGE9PmEua2V5PT09ZSk7dGhpcy5kaWFsb2cub3BlbihXQyx7ZGlzYWJsZUNsb3NlOiEwLGRhdGE6e2tleTplLG5hbWU6aS5uYW1lLGNvZGluZ0NoYWxsZW5nZVN0YXR1czppLmNvZGluZ0NoYWxsZW5nZVN0YXR1c319KX1yZXBlYXRDaGFsbGVuZ2VOb3RpZmljYXRpb24oZSl7cmV0dXJuIFBlKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtsZXQgaT10aGlzLmFsbENoYWxsZW5nZXMuZmluZChhPT5hLmtleT09PWUpO3lpZWxkIGtuKHRoaXMuY2hhbGxlbmdlU2VydmljZS5yZXBlYXROb3RpZmljYXRpb24oZW5jb2RlVVJJQ29tcG9uZW50KGkubmFtZSkpKX0pfXVubG9ja0hpbnQoZSxpKXt0aGlzLmxhc3RVbmxvY2tlZENoYWxsZW5nZUtleT1pPz9udWxsLHRoaXMuaGludFNlcnZpY2UucHV0KGUse3VubG9ja2VkOiEwfSkuc3Vic2NyaWJlKHtuZXh0OigpPT57dGhpcy5uZ09uSW5pdCgpfSxlcnJvcjphPT57Y29uc29sZS5sb2coYSl9fSl9aGFuZGxlSGlnaGxpZ2h0Q2hhbGxlbmdlKGUpe2xldCBpPWU/LmhpZ2hsaWdodENoYWxsZW5nZTshaXx8aT09PXRoaXMuaGlnaGxpZ2h0ZWRDaGFsbGVuZ2VLZXl8fHNldFRpbWVvdXQoKCk9PntsZXQgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChgY2hhbGxlbmdlLSR7aX1gKTtpZihhKXRoaXMuaGlnaGxpZ2h0ZWRDaGFsbGVuZ2VLZXk9aSxhLnNjcm9sbEludG9WaWV3KHtiZWhhdmlvcjoic21vb3RoIixibG9jazoiY2VudGVyIn0pO2Vsc2UgcmV0dXJuO3NldFRpbWVvdXQoKCk9Pnt0aGlzLmhpZ2hsaWdodGVkQ2hhbGxlbmdlS2V5PW51bGw7bGV0IHI9WGUoe30sdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcyk7ZGVsZXRlIHIuaGlnaGxpZ2h0Q2hhbGxlbmdlLHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLHtyZWxhdGl2ZVRvOnRoaXMucm91dGUscXVlcnlQYXJhbXM6cixyZXBsYWNlVXJsOiEwfSl9LDRlMyl9LDMwMCl9c3RhdGljIFx1MDI3NWZhYz1mdW5jdGlvbihpKXtyZXR1cm4gbmV3KGl8fHQpfTtzdGF0aWMgXHUwMjc1Y21wPUQoe3R5cGU6dCxzZWxlY3RvcnM6W1siYXBwLXNjb3JlLWJvYXJkIl1dLGRlY2xzOjcsdmFyczo2LGNvbnN0czpbWzEsInNjb3JlLXJvdyJdLFszLCJhbGxDaGFsbGVuZ2VzIl0sWzMsImZpbHRlclNldHRpbmciLCJhbGxDaGFsbGVuZ2VzIiwicmVzZXQiXSxbMSwibG9hZGluZy1zcGlubmVyLXdyYXBwZXIiXSxbMywiZmlsdGVyU2V0dGluZ0NoYW5nZSIsImZpbHRlclNldHRpbmciLCJhbGxDaGFsbGVuZ2VzIiwicmVzZXQiXSxbMywiZmlsdGVyU2V0dGluZ0NoYW5nZSIsImNoYWxsZW5nZXMiLCJmaWx0ZXJTZXR0aW5nIl0sWzMsImFsbENoYWxsZW5nZXMiLCJhcHBsaWNhdGlvbkNvbmZpZyJdLFsxLCJjaGFsbGVuZ2VzIl0sWyJzcmMiLCJhc3NldHMvcHVibGljL2ltYWdlcy9wYWRkaW5nLzFweC5wbmciXSxbMywiY2hhbGxlbmdlIiwiYXBwbGljYXRpb25Db25maWd1cmF0aW9uIiwib3BlbkNvZGluZ0NoYWxsZW5nZURpYWxvZyIsInJlcGVhdENoYWxsZW5nZU5vdGlmaWNhdGlvbiIsInVubG9ja0hpbnQiLCJsYXN0VW5sb2NrZWRDaGFsbGVuZ2VLZXkiLCJoaWdobGlnaHRDb2RpbmdCdXR0b24iLCJjaGFsbGVuZ2VJZCIsIm5nQ2xhc3MiXSxbMSwiZW1wdHktY2hhbGxlbmdlcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbihpLGEpe2kmMSYmKGMoMCwiZGl2IiwwKSx1KDEsImhhY2tpbmctY2hhbGxlbmdlLXByb2dyZXNzLXNjb3JlLWNhcmQiLDEpKDIsImNvZGluZy1jaGFsbGVuZ2UtcHJvZ3Jlc3Mtc2NvcmUtY2FyZCIsMSkoMywiZGlmZmljdWx0eS1vdmVydmlldy1zY29yZS1jYXJkIiwxKSxzKCksTSg0LGpaLDEsMywiZmlsdGVyLXNldHRpbmdzIiwyKSxNKDUscVosMiwwLCJkaXYiLDMpLE0oNixaWiw1LDUpKSxpJjImJihsKCksZigiYWxsQ2hhbGxlbmdlcyIsYS5hbGxDaGFsbGVuZ2VzKSxsKCksZigiYWxsQ2hhbGxlbmdlcyIsYS5hbGxDaGFsbGVuZ2VzKSxsKCksZigiYWxsQ2hhbGxlbmdlcyIsYS5hbGxDaGFsbGVuZ2VzKSxsKCksdygoYS5hcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb249PW51bGw/bnVsbDphLmFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbi5jaGFsbGVuZ2VzLnJlc3RyaWN0VG9UdXRvcmlhbHNGaXJzdCk9PT0hMT80Oi0xKSxsKCksdyhhLmlzSW5pdGlhbGl6ZWQ9PT0hMT81Oi0xKSxsKCksdyhhLmlzSW5pdGlhbGl6ZWQ9PT0hMD82Oi0xKSl9LGRlcGVuZGVuY2llczpbdlMsdVMscFMsbVMsSncsJHcsWXcsV3csVDEsWSxLXSxzdHlsZXM6W2BbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjNyZW0gNHJlbX1AbWVkaWEgKG1heC13aWR0aDogMTUwMHB4KXtbX25naG9zdC0lQ09NUCVde21hcmdpbjozcmVtIDRyZW19fUBtZWRpYSAobWF4LXdpZHRoOiA5MDBweCl7W19uZ2hvc3QtJUNPTVAlXXttYXJnaW46M3JlbX19QG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KXtbX25naG9zdC0lQ09NUCVde21hcmdpbjoycmVtIDFyZW19fS5zY29yZS1yb3dbX25nY29udGVudC0lQ09NUCVde2NvbHVtbi1nYXA6MXJlbTtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCgzLDFmcik7bWluLWhlaWdodDoxMjBweDtyb3ctZ2FwOi41cmVtfUBtZWRpYSAobWF4LXdpZHRoOiAxNTAwcHgpey5zY29yZS1yb3dbX25nY29udGVudC0lQ09NUCVde2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMywxZnIpfX1AbWVkaWEgKG1heC13aWR0aDogOTAwcHgpey5zY29yZS1yb3dbX25nY29udGVudC0lQ09NUCVde2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMiwxZnIpfX1AbWVkaWEgKG1heC13aWR0aDogNjAwcHgpey5zY29yZS1yb3dbX25nY29udGVudC0lQ09NUCVde2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMSwxZnIpfX0uY2hhbGxlbmdlc1tfbmdjb250ZW50LSVDT01QJV17Y29sdW1uLWdhcDoxcmVtO2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDQsMWZyKTttYXJnaW4tdG9wOjJyZW07cm93LWdhcDouNjI1cmVtfUBtZWRpYSAobWF4LXdpZHRoOiAxNTAwcHgpey5jaGFsbGVuZ2VzW19uZ2NvbnRlbnQtJUNPTVAlXXtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KDMsMWZyKX19QG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KXsuY2hhbGxlbmdlc1tfbmdjb250ZW50LSVDT01QJV17Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCgyLDFmcil9fUBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCl7LmNoYWxsZW5nZXNbX25nY29udGVudC0lQ09NUCVde2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoMSwxZnIpfX0uZW1wdHktY2hhbGxlbmdlc1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MCAycmVtO21pbi1oZWlnaHQ6MjB2aH0ubG9hZGluZy1zcGlubmVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOjRyZW07d2lkdGg6MTAwJX0KCgoKCmBdfSl9cmV0dXJuIHR9KSgpfSk7ZnVuY3Rpb24gZSQodCl7cmV0dXJuIHQubGVuZ3RoPT09MD9udWxsOndpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCIjYWNjZXNzX3Rva2VuPSIpP3tjb25zdW1lZDp0fTpudWxsfWZ1bmN0aW9uIHQkKHQpe3JldHVybiB0Lmxlbmd0aD09PTA/bnVsbDp0WzBdLnRvU3RyaW5nKCkubWF0Y2goaSQoMjUsMTg0LDE3NCwxNzksMTgyLDE4NikrInNhbCIudG9Mb3dlckNhc2UoKSthJCgxMywxNDQsODcsMTUyLDEzOSwxNDQsODMsMTM4KSsiYSIudG9Mb3dlckNhc2UoKSk/e2NvbnN1bWVkOnR9Om51bGx9ZnVuY3Rpb24gaSQoLi4udCl7bGV0IG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCksZT1uLnNoaWZ0KCk7cmV0dXJuIG4ucmV2ZXJzZSgpLm1hcChmdW5jdGlvbihpLGEpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGktZS00NS1hKX0pLmpvaW4oIiIpfWZ1bmN0aW9uIGEkKC4uLnQpe2xldCBuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksZT1uLnNoaWZ0KCk7cmV0dXJuIG4ucmV2ZXJzZSgpLm1hcChmdW5jdGlvbihpLGEpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGktZS0yNC1hKX0pLmpvaW4oIiIpfXZhciAkWixLWixYWixKWix5Uyx4Uz14KCgpPT57aV8oKTtuXygpO29fKCk7Y18oKTtsXygpO21fKCk7Zl8oKTt2XygpO0NfKCk7eF8oKTtUXygpO0RfKCk7TF8oKTtWXygpO0hfKCk7cDEoKTtSXygpO0JfKCk7al8oKTtZYigpOyRiKCk7SmIoKTt0QygpO2lDKCk7bkMoKTtvQygpO21DKCk7cEMoKTt1QygpO3ZDKCk7YkMoKTt5QygpO01DKCk7U0MoKTtFQygpO0RDKCk7Qm4oKTtMQygpO0NTKCk7JFo9KCk9PlBlKG51bGwsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgaW1wb3J0KCIuL2ZhdWNldC5tb2R1bGUtV0lQNFk1SFQuanMiKSkuRmF1Y2V0TW9kdWxlfSksS1o9KCk9PlBlKG51bGwsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgaW1wb3J0KCIuL3dhbGxldC13ZWIzLm1vZHVsZS1JVEdFVDZBRy5qcyIpKS5XYWxsZXRXZWIzTW9kdWxlfSksWFo9KCk9PlBlKG51bGwsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgaW1wb3J0KCIuL3dlYjMtc2FuZGJveC5tb2R1bGUtTk5PR1BINFguanMiKSkuV2ViM1NhbmRib3hNb2R1bGV9KSxKWj1be3BhdGg6ImFkbWluaXN0cmF0aW9uIixjb21wb25lbnQ6el8sY2FuQWN0aXZhdGU6W3kzXX0se3BhdGg6ImFjY291bnRpbmciLGNvbXBvbmVudDpmQyxjYW5BY3RpdmF0ZTpbeDNdfSx7cGF0aDoiYWJvdXQiLGNvbXBvbmVudDpkX30se3BhdGg6ImFkZHJlc3Mvc2VsZWN0Iixjb21wb25lbnQ6YUMsY2FuQWN0aXZhdGU6W1ZpXX0se3BhdGg6ImFkZHJlc3Mvc2F2ZWQiLGNvbXBvbmVudDpyQyxjYW5BY3RpdmF0ZTpbVmldfSx7cGF0aDoiYWRkcmVzcy9jcmVhdGUiLGNvbXBvbmVudDpSNyxjYW5BY3RpdmF0ZTpbVmldfSx7cGF0aDoiYWRkcmVzcy9lZGl0LzphZGRyZXNzSWQiLGNvbXBvbmVudDpSNyxjYW5BY3RpdmF0ZTpbVmldfSx7cGF0aDoiZGVsaXZlcnktbWV0aG9kIixjb21wb25lbnQ6d0N9LHtwYXRoOiJkZWx1eGUtbWVtYmVyc2hpcCIsY29tcG9uZW50OkFDLGNhbkFjdGl2YXRlOltWaV19LHtwYXRoOiJzYXZlZC1wYXltZW50LW1ldGhvZHMiLGNvbXBvbmVudDpoQ30se3BhdGg6ImJhc2tldCIsY29tcG9uZW50OnJffSx7cGF0aDoib3JkZXItY29tcGxldGlvbi86aWQiLGNvbXBvbmVudDpnQ30se3BhdGg6ImNvbnRhY3QiLGNvbXBvbmVudDpzX30se3BhdGg6InBob3RvLXdhbGwiLGNvbXBvbmVudDpUQ30se3BhdGg6ImNvbXBsYWluIixjb21wb25lbnQ6SV99LHtwYXRoOiJjaGF0Ym90Iixjb21wb25lbnQ6UF99LHtwYXRoOiJvcmRlci1zdW1tYXJ5Iixjb21wb25lbnQ6X0N9LHtwYXRoOiJvcmRlci1oaXN0b3J5Iixjb21wb25lbnQ6eEN9LHtwYXRoOiJwYXltZW50LzplbnRpdHkiLGNvbXBvbmVudDpkQ30se3BhdGg6IndhbGxldCIsY29tcG9uZW50OkNDfSx7cGF0aDoibG9naW4iLGNvbXBvbmVudDp5X30se3BhdGg6ImZvcmdvdC1wYXNzd29yZCIsY29tcG9uZW50OmdffSx7cGF0aDoicmVjeWNsZSIsY29tcG9uZW50Ok9ffSx7cGF0aDoicmVnaXN0ZXIiLGNvbXBvbmVudDpwX30se3BhdGg6InNlYXJjaCIsY29tcG9uZW50OnNzfSx7cGF0aDoiaGFja2luZy1pbnN0cnVjdG9yIixjb21wb25lbnQ6c3N9LHtwYXRoOiJzY29yZS1ib2FyZCIsY29tcG9uZW50OmJTfSx7cGF0aDoidHJhY2stcmVzdWx0Iixjb21wb25lbnQ6YTd9LHtwYXRoOiJ0cmFjay1yZXN1bHQvbmV3Iixjb21wb25lbnQ6YTcsZGF0YTp7dHlwZToibmV3In19LHtwYXRoOiIyZmEvZW50ZXIiLGNvbXBvbmVudDpOX30se3BhdGg6InByaXZhY3ktc2VjdXJpdHkiLGNvbXBvbmVudDpVXyxjaGlsZHJlbjpbe3BhdGg6InByaXZhY3ktcG9saWN5Iixjb21wb25lbnQ6ZUN9LHtwYXRoOiJjaGFuZ2UtcGFzc3dvcmQiLGNvbXBvbmVudDpBX30se3BhdGg6InR3by1mYWN0b3ItYXV0aGVudGljYXRpb24iLGNvbXBvbmVudDpRYn0se3BhdGg6ImRhdGEtZXhwb3J0Iixjb21wb25lbnQ6WmJ9LHtwYXRoOiJsYXN0LWxvZ2luLWlwIixjb21wb25lbnQ6WGJ9XX0se3BhdGg6Imp1aWN5LW5mdCIsY29tcG9uZW50OklDfSx7cGF0aDoid2FsbGV0LXdlYjMiLGxvYWRDaGlsZHJlbjooKT0+UGUobnVsbCxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBLWigpfSl9LHtwYXRoOiJ3ZWIzLXNhbmRib3giLGxvYWRDaGlsZHJlbjooKT0+UGUobnVsbCxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBYWigpfSl9LHtwYXRoOiJiZWUtaGF2ZW4iLGxvYWRDaGlsZHJlbjooKT0+UGUobnVsbCxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCAkWigpfSl9LHttYXRjaGVyOmUkLGRhdGE6e3BhcmFtczp3aW5kb3cubG9jYXRpb24uaHJlZi5zdWJzdHIod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiIyIpKX0sY29tcG9uZW50OmFffSx7bWF0Y2hlcjp0JCxjb21wb25lbnQ6dF99LHtwYXRoOiI0MDMiLGNvbXBvbmVudDpGX30se3BhdGg6IioqIixjb21wb25lbnQ6c3N9XSx5Uz1vbS5mb3JSb290KEpaLHt1c2VIYXNoOiEwfSl9KTt2YXIgTVMsd1M9eCgoKT0+e2soKTtNUz0oKCk9PntjbGFzcyB0e2ludGVyY2VwdChlLGkpe3JldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidG9rZW4iKSYmKGU9ZS5jbG9uZSh7c2V0SGVhZGVyczp7QXV0aG9yaXphdGlvbjpgQmVhcmVyICR7bG9jYWxTdG9yYWdlLmdldEl0ZW0oInRva2VuIil9YH19KSksbG9jYWxTdG9yYWdlLmdldEl0ZW0oImVtYWlsIikmJihlPWUuY2xvbmUoe3NldEhlYWRlcnM6eyJYLVVzZXItRW1haWwiOlN0cmluZyhsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiZW1haWwiKSl9fSkpLGkuaGFuZGxlKGUpfXN0YXRpYyBcdTAyNzVmYWM9ZnVuY3Rpb24oaSl7cmV0dXJuIG5ldyhpfHx0KX07c3RhdGljIFx1MDI3NXByb3Y9JCh7dG9rZW46dCxmYWN0b3J5OnQuXHUwMjc1ZmFjfSl9cmV0dXJuIHR9KSgpfSk7dmFyIHIkPVRlKFdvPT57aygpO050KCk7eXUoKTtKZigpO011KCk7RjMoKTtEOCgpO1UzKCk7TXIoKTtHbigpO0h1KCk7UjgoKTtEUygpO0d1KCk7XzgoKTtyOCgpO3ZpKCk7RzMoKTt4NCgpO1g4KCk7cWkoKTtnaSgpO0szKCk7ZXQoKTtoZSgpO1Q0KCk7TTIoKTtfNCgpO004KCk7bmUoKTtkYygpO0plKCk7dmUoKTtPMygpO3BjKCk7YmMoKTtTNSgpO1h2KCk7V2UoKTtKdigpO1coKTt4UygpO2hhKCk7QjcoKTtKNCgpO0xzKCk7QXMoKTtjcygpO2lyKCk7Rm0oKTtINygpO0RzKCk7Qm4oKTt3aSgpO3dhKCk7YWEoKTttNygpO1hjKCk7ZDcoKTtsNygpO3JzKCk7czcoKTtVNCgpO243KCk7cjcoKTtGMSgpO043KCk7dHMoKTttMygpO0sxKCk7ajQoKTtBNigpO3dTKCk7V3QoKTt1ZS5wcm9kdWN0aW9uJiZ2b2lkIDA7ZnVuY3Rpb24gbiQodCl7cmV0dXJuIG5ldyAkYyh0LCIuL2Fzc2V0cy9pMThuLyIsIi5qc29uIil9dG0oQ3Use3Byb3ZpZGVyczpbT2QoaW0seVMsWS5mb3JSb290KHtsb2FkZXI6e3Byb3ZpZGU6WmQsdXNlRmFjdG9yeTpuJCxkZXBzOltBZV19fSksdGguZm9yUm9vdCgpLHp0LEpnLF9jLGhjLHJ1LGdlLGF0LFFlLHo0LG9lLGJ1LHVpLExnLHdnLGRlLCRlLENnLHNsLE0zLHZnLGl1LHRnLHEzLHM0LFpmLGh1LHF1LGttLGp1LE91LFdmLExtLEIzLEl1LHd1LHh1LFhmLE4wKSx7cHJvdmlkZTphbSx1c2VDbGFzczpNUyxtdWx0aTohMH0se3Byb3ZpZGU6Qm0sdXNlVmFsdWU6e2NvcmVMaWJyYXJ5TG9hZGVyOigpPT5QZShudWxsLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGltcG9ydCgiLi9jb3JlLUMyWEdWRlpLLmpzIil9KSxsaW5lTnVtYmVyc0xvYWRlcjooKT0+UGUobnVsbCxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBpbXBvcnQoIi4vbmd4LWhpZ2hsaWdodGpzLWxpbmUtbnVtYmVycy1URkFUUTNZUC5qcyIpfSksbGFuZ3VhZ2VzOnt0eXBlc2NyaXB0OigpPT5QZShudWxsLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGltcG9ydCgiLi90eXBlc2NyaXB0LVVEVDVTSEVWLmpzIil9KSxqYXZhc2NyaXB0OigpPT5QZShudWxsLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGltcG9ydCgiLi9qYXZhc2NyaXB0LTdDNkRWSUdHLmpzIil9KSx5YW1sOigpPT5QZShudWxsLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGltcG9ydCgiLi95YW1sLVVIUERZWFZaLmpzIil9KX19fSxsbixMdCxCcix2byxUcyxBdCxlcyxKYyxzbixscyxfbyxkcyxtcyxnbyxocyxlaSxTaSxadCx5MyxWaSx6byx4MyxZcix6cyxIMCxrMixibyxrbyxUbyxmbixQcyxubShybSgpKSxLdigpXX0pLmNhdGNoKHQ9PmNvbnNvbGUubG9nKHQpKX0pO2V4cG9ydCBkZWZhdWx0IHIkKCk7Cg==","response_hash":"5bbad0805a1c10476f261b8f62bbe47aa9aa79cfc768956267fafe7534bd24e0","response_time_ms":0,"response_words":25288,"has_response":true,"parameters":[{"name":"1","value":"main.js","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12}],"sent_at":"2026-04-05T05:33:08.389774Z","received_at":"2026-04-05T05:33:08.389774Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"fcda3eaa-07bc-4e3c-86e1-771c3e1f4173","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/metrics","url":"http://localhost:3000/metrics","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9tZXRyaWNzIEhUVFAvMS4xDQpIb3N0OiBsb2NhbGhvc3Q6MzAwMA0KDQo=","request_hash":"956bba8bed32c611c68bdbd1e492e4ae38ad8d5338dd287ffd63179dddf60ef8","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Connection":["keep-alive"],"Content-Length":["25387"],"Content-Type":["text/plain; version=0.0.4; charset=utf-8"],"Date":["Sun, 05 Apr 2026 05:32:41 GMT"],"Keep-Alive":["timeout=5"]},"response_content_type":"text/plain; version=0.0.4; charset=utf-8","response_content_length":25387,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDb250ZW50LUxlbmd0aDogMjUzODcNCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgdmVyc2lvbj0wLjAuNDsgY2hhcnNldD11dGYtOA0KRGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMjo0MSBHTVQNCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KDQojIEhFTFAgZmlsZV91cGxvYWRzX2NvdW50IFRvdGFsIG51bWJlciBvZiBzdWNjZXNzZnVsIGZpbGUgdXBsb2FkcyBncm91cGVkIGJ5IGZpbGUgdHlwZS4KIyBUWVBFIGZpbGVfdXBsb2Fkc19jb3VudCBjb3VudGVyCgojIEhFTFAgZmlsZV91cGxvYWRfZXJyb3JzIFRvdGFsIG51bWJlciBvZiBmYWlsZWQgZmlsZSB1cGxvYWRzIGdyb3VwZWQgYnkgZmlsZSB0eXBlLgojIFRZUEUgZmlsZV91cGxvYWRfZXJyb3JzIGNvdW50ZXIKCiMgSEVMUCBqdWljZXNob3Bfc3RhcnR1cF9kdXJhdGlvbl9zZWNvbmRzIER1cmF0aW9uIGp1aWNlc2hvcCByZXF1aXJlZCB0byBwZXJmb3JtIGEgY2VydGFpbiB0YXNrIGR1cmluZyBzdGFydHVwCiMgVFlQRSBqdWljZXNob3Bfc3RhcnR1cF9kdXJhdGlvbl9zZWNvbmRzIGdhdWdlCmp1aWNlc2hvcF9zdGFydHVwX2R1cmF0aW9uX3NlY29uZHN7dGFzaz0idmFsaWRhdGVDb25maWciLGFwcD0ianVpY2VzaG9wIn0gMC4wMTMxNjMwNDEKanVpY2VzaG9wX3N0YXJ0dXBfZHVyYXRpb25fc2Vjb25kc3t0YXNrPSJjbGVhbnVwRnRwRm9sZGVyIixhcHA9Imp1aWNlc2hvcCJ9IDAuMDIwMjE5NDE3Cmp1aWNlc2hvcF9zdGFydHVwX2R1cmF0aW9uX3NlY29uZHN7dGFzaz0idmFsaWRhdGVQcmVjb25kaXRpb25zIixhcHA9Imp1aWNlc2hvcCJ9IDAuMDU4NzQzNzkxCmp1aWNlc2hvcF9zdGFydHVwX2R1cmF0aW9uX3NlY29uZHN7dGFzaz0iZGF0YWNyZWF0b3IiLGFwcD0ianVpY2VzaG9wIn0gMS41NTIwMzg4NzYwMDAwMDAxCmp1aWNlc2hvcF9zdGFydHVwX2R1cmF0aW9uX3NlY29uZHN7dGFzaz0iY3VzdG9taXplQXBwbGljYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMC4wMDc3NjYxNjYKanVpY2VzaG9wX3N0YXJ0dXBfZHVyYXRpb25fc2Vjb25kc3t0YXNrPSJjdXN0b21pemVFYXN0ZXJFZ2ciLGFwcD0ianVpY2VzaG9wIn0gMC4wMDQ1OTUzNzUKanVpY2VzaG9wX3N0YXJ0dXBfZHVyYXRpb25fc2Vjb25kc3t0YXNrPSJyZWFkeSIsYXBwPSJqdWljZXNob3AifSAxLjU4NQoKIyBIRUxQIHByb2Nlc3NfY3B1X3VzZXJfc2Vjb25kc190b3RhbCBUb3RhbCB1c2VyIENQVSB0aW1lIHNwZW50IGluIHNlY29uZHMuCiMgVFlQRSBwcm9jZXNzX2NwdV91c2VyX3NlY29uZHNfdG90YWwgY291bnRlcgpwcm9jZXNzX2NwdV91c2VyX3NlY29uZHNfdG90YWx7YXBwPSJqdWljZXNob3AifSAxNS4xMzE5MjQKCiMgSEVMUCBwcm9jZXNzX2NwdV9zeXN0ZW1fc2Vjb25kc190b3RhbCBUb3RhbCBzeXN0ZW0gQ1BVIHRpbWUgc3BlbnQgaW4gc2Vjb25kcy4KIyBUWVBFIHByb2Nlc3NfY3B1X3N5c3RlbV9zZWNvbmRzX3RvdGFsIGNvdW50ZXIKcHJvY2Vzc19jcHVfc3lzdGVtX3NlY29uZHNfdG90YWx7YXBwPSJqdWljZXNob3AifSAyLjg1NTc2OQoKIyBIRUxQIHByb2Nlc3NfY3B1X3NlY29uZHNfdG90YWwgVG90YWwgdXNlciBhbmQgc3lzdGVtIENQVSB0aW1lIHNwZW50IGluIHNlY29uZHMuCiMgVFlQRSBwcm9jZXNzX2NwdV9zZWNvbmRzX3RvdGFsIGNvdW50ZXIKcHJvY2Vzc19jcHVfc2Vjb25kc190b3RhbHthcHA9Imp1aWNlc2hvcCJ9IDE3Ljk4NzY5MwoKIyBIRUxQIHByb2Nlc3Nfc3RhcnRfdGltZV9zZWNvbmRzIFN0YXJ0IHRpbWUgb2YgdGhlIHByb2Nlc3Mgc2luY2UgdW5peCBlcG9jaCBpbiBzZWNvbmRzLgojIFRZUEUgcHJvY2Vzc19zdGFydF90aW1lX3NlY29uZHMgZ2F1Z2UKcHJvY2Vzc19zdGFydF90aW1lX3NlY29uZHN7YXBwPSJqdWljZXNob3AifSAxNzc1MzY3MDk3CgojIEhFTFAgcHJvY2Vzc19yZXNpZGVudF9tZW1vcnlfYnl0ZXMgUmVzaWRlbnQgbWVtb3J5IHNpemUgaW4gYnl0ZXMuCiMgVFlQRSBwcm9jZXNzX3Jlc2lkZW50X21lbW9yeV9ieXRlcyBnYXVnZQpwcm9jZXNzX3Jlc2lkZW50X21lbW9yeV9ieXRlc3thcHA9Imp1aWNlc2hvcCJ9IDIxMzg0NDc4NzIKCiMgSEVMUCBwcm9jZXNzX3ZpcnR1YWxfbWVtb3J5X2J5dGVzIFZpcnR1YWwgbWVtb3J5IHNpemUgaW4gYnl0ZXMuCiMgVFlQRSBwcm9jZXNzX3ZpcnR1YWxfbWVtb3J5X2J5dGVzIGdhdWdlCnByb2Nlc3NfdmlydHVhbF9tZW1vcnlfYnl0ZXN7YXBwPSJqdWljZXNob3AifSAzNTEwMjU1NjE2CgojIEhFTFAgcHJvY2Vzc19oZWFwX2J5dGVzIFByb2Nlc3MgaGVhcCBzaXplIGluIGJ5dGVzLgojIFRZUEUgcHJvY2Vzc19oZWFwX2J5dGVzIGdhdWdlCnByb2Nlc3NfaGVhcF9ieXRlc3thcHA9Imp1aWNlc2hvcCJ9IDI0MzM3OTQwNDgKCiMgSEVMUCBwcm9jZXNzX29wZW5fZmRzIE51bWJlciBvZiBvcGVuIGZpbGUgZGVzY3JpcHRvcnMuCiMgVFlQRSBwcm9jZXNzX29wZW5fZmRzIGdhdWdlCnByb2Nlc3Nfb3Blbl9mZHN7YXBwPSJqdWljZXNob3AifSA2NQoKIyBIRUxQIHByb2Nlc3NfbWF4X2ZkcyBNYXhpbXVtIG51bWJlciBvZiBvcGVuIGZpbGUgZGVzY3JpcHRvcnMuCiMgVFlQRSBwcm9jZXNzX21heF9mZHMgZ2F1Z2UKcHJvY2Vzc19tYXhfZmRze2FwcD0ianVpY2VzaG9wIn0gMTA0ODU3NgoKIyBIRUxQIG5vZGVqc19ldmVudGxvb3BfbGFnX3NlY29uZHMgTGFnIG9mIGV2ZW50IGxvb3AgaW4gc2Vjb25kcy4KIyBUWVBFIG5vZGVqc19ldmVudGxvb3BfbGFnX3NlY29uZHMgZ2F1Z2UKbm9kZWpzX2V2ZW50bG9vcF9sYWdfc2Vjb25kc3thcHA9Imp1aWNlc2hvcCJ9IDAKCiMgSEVMUCBub2RlanNfZXZlbnRsb29wX2xhZ19taW5fc2Vjb25kcyBUaGUgbWluaW11bSByZWNvcmRlZCBldmVudCBsb29wIGRlbGF5LgojIFRZUEUgbm9kZWpzX2V2ZW50bG9vcF9sYWdfbWluX3NlY29uZHMgZ2F1Z2UKbm9kZWpzX2V2ZW50bG9vcF9sYWdfbWluX3NlY29uZHN7YXBwPSJqdWljZXNob3AifSAwLjAwMjIwMzY0OAoKIyBIRUxQIG5vZGVqc19ldmVudGxvb3BfbGFnX21heF9zZWNvbmRzIFRoZSBtYXhpbXVtIHJlY29yZGVkIGV2ZW50IGxvb3AgZGVsYXkuCiMgVFlQRSBub2RlanNfZXZlbnRsb29wX2xhZ19tYXhfc2Vjb25kcyBnYXVnZQpub2RlanNfZXZlbnRsb29wX2xhZ19tYXhfc2Vjb25kc3thcHA9Imp1aWNlc2hvcCJ9IDAuMDY0ODQ3ODcxCgojIEhFTFAgbm9kZWpzX2V2ZW50bG9vcF9sYWdfbWVhbl9zZWNvbmRzIFRoZSBtZWFuIG9mIHRoZSByZWNvcmRlZCBldmVudCBsb29wIGRlbGF5cy4KIyBUWVBFIG5vZGVqc19ldmVudGxvb3BfbGFnX21lYW5fc2Vjb25kcyBnYXVnZQpub2RlanNfZXZlbnRsb29wX2xhZ19tZWFuX3NlY29uZHN7YXBwPSJqdWljZXNob3AifSAwLjAxMjY5OTczNDM4MTMxNjY4OQoKIyBIRUxQIG5vZGVqc19ldmVudGxvb3BfbGFnX3N0ZGRldl9zZWNvbmRzIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJlY29yZGVkIGV2ZW50IGxvb3AgZGVsYXlzLgojIFRZUEUgbm9kZWpzX2V2ZW50bG9vcF9sYWdfc3RkZGV2X3NlY29uZHMgZ2F1Z2UKbm9kZWpzX2V2ZW50bG9vcF9sYWdfc3RkZGV2X3NlY29uZHN7YXBwPSJqdWljZXNob3AifSAwLjAwMjcyNTkyMzc2MzA1MDQ5NjQKCiMgSEVMUCBub2RlanNfZXZlbnRsb29wX2xhZ19wNTBfc2Vjb25kcyBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSByZWNvcmRlZCBldmVudCBsb29wIGRlbGF5cy4KIyBUWVBFIG5vZGVqc19ldmVudGxvb3BfbGFnX3A1MF9zZWNvbmRzIGdhdWdlCm5vZGVqc19ldmVudGxvb3BfbGFnX3A1MF9zZWNvbmRze2FwcD0ianVpY2VzaG9wIn0gMC4wMTI1MTczNzUKCiMgSEVMUCBub2RlanNfZXZlbnRsb29wX2xhZ19wOTBfc2Vjb25kcyBUaGUgOTB0aCBwZXJjZW50aWxlIG9mIHRoZSByZWNvcmRlZCBldmVudCBsb29wIGRlbGF5cy4KIyBUWVBFIG5vZGVqc19ldmVudGxvb3BfbGFnX3A5MF9zZWNvbmRzIGdhdWdlCm5vZGVqc19ldmVudGxvb3BfbGFnX3A5MF9zZWNvbmRze2FwcD0ianVpY2VzaG9wIn0gMC4wMTM2OTcwMjMKCiMgSEVMUCBub2RlanNfZXZlbnRsb29wX2xhZ19wOTlfc2Vjb25kcyBUaGUgOTl0aCBwZXJjZW50aWxlIG9mIHRoZSByZWNvcmRlZCBldmVudCBsb29wIGRlbGF5cy4KIyBUWVBFIG5vZGVqc19ldmVudGxvb3BfbGFnX3A5OV9zZWNvbmRzIGdhdWdlCm5vZGVqc19ldmVudGxvb3BfbGFnX3A5OV9zZWNvbmRze2FwcD0ianVpY2VzaG9wIn0gMC4wMjQ5NTI4MzEKCiMgSEVMUCBub2RlanNfYWN0aXZlX3Jlc291cmNlcyBOdW1iZXIgb2YgYWN0aXZlIHJlc291cmNlcyB0aGF0IGFyZSBjdXJyZW50bHkga2VlcGluZyB0aGUgZXZlbnQgbG9vcCBhbGl2ZSwgZ3JvdXBlZCBieSBhc3luYyByZXNvdXJjZSB0eXBlLgojIFRZUEUgbm9kZWpzX2FjdGl2ZV9yZXNvdXJjZXMgZ2F1Z2UKbm9kZWpzX2FjdGl2ZV9yZXNvdXJjZXN7dHlwZT0iRlNSZXFDYWxsYmFjayIsYXBwPSJqdWljZXNob3AifSAyNQpub2RlanNfYWN0aXZlX3Jlc291cmNlc3t0eXBlPSJQaXBlV3JhcCIsYXBwPSJqdWljZXNob3AifSAyCm5vZGVqc19hY3RpdmVfcmVzb3VyY2Vze3R5cGU9IkZTRXZlbnRXcmFwIixhcHA9Imp1aWNlc2hvcCJ9IDEKbm9kZWpzX2FjdGl2ZV9yZXNvdXJjZXN7dHlwZT0iVENQU2VydmVyV3JhcCIsYXBwPSJqdWljZXNob3AifSAxCm5vZGVqc19hY3RpdmVfcmVzb3VyY2Vze3R5cGU9IlRDUFNvY2tldFdyYXAiLGFwcD0ianVpY2VzaG9wIn0gMzAKbm9kZWpzX2FjdGl2ZV9yZXNvdXJjZXN7dHlwZT0iVGltZW91dCIsYXBwPSJqdWljZXNob3AifSAxCm5vZGVqc19hY3RpdmVfcmVzb3VyY2Vze3R5cGU9IkltbWVkaWF0ZSIsYXBwPSJqdWljZXNob3AifSAxCgojIEhFTFAgbm9kZWpzX2FjdGl2ZV9yZXNvdXJjZXNfdG90YWwgVG90YWwgbnVtYmVyIG9mIGFjdGl2ZSByZXNvdXJjZXMuCiMgVFlQRSBub2RlanNfYWN0aXZlX3Jlc291cmNlc190b3RhbCBnYXVnZQpub2RlanNfYWN0aXZlX3Jlc291cmNlc190b3RhbHthcHA9Imp1aWNlc2hvcCJ9IDYxCgojIEhFTFAgbm9kZWpzX2FjdGl2ZV9oYW5kbGVzIE51bWJlciBvZiBhY3RpdmUgbGlidXYgaGFuZGxlcyBncm91cGVkIGJ5IGhhbmRsZSB0eXBlLiBFdmVyeSBoYW5kbGUgdHlwZSBpcyBDKysgY2xhc3MgbmFtZS4KIyBUWVBFIG5vZGVqc19hY3RpdmVfaGFuZGxlcyBnYXVnZQpub2RlanNfYWN0aXZlX2hhbmRsZXN7dHlwZT0iU29ja2V0IixhcHA9Imp1aWNlc2hvcCJ9IDMyCm5vZGVqc19hY3RpdmVfaGFuZGxlc3t0eXBlPSJGU1dhdGNoZXIiLGFwcD0ianVpY2VzaG9wIn0gMQpub2RlanNfYWN0aXZlX2hhbmRsZXN7dHlwZT0iU2VydmVyIixhcHA9Imp1aWNlc2hvcCJ9IDEKCiMgSEVMUCBub2RlanNfYWN0aXZlX2hhbmRsZXNfdG90YWwgVG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBoYW5kbGVzLgojIFRZUEUgbm9kZWpzX2FjdGl2ZV9oYW5kbGVzX3RvdGFsIGdhdWdlCm5vZGVqc19hY3RpdmVfaGFuZGxlc190b3RhbHthcHA9Imp1aWNlc2hvcCJ9IDM0CgojIEhFTFAgbm9kZWpzX2FjdGl2ZV9yZXF1ZXN0cyBOdW1iZXIgb2YgYWN0aXZlIGxpYnV2IHJlcXVlc3RzIGdyb3VwZWQgYnkgcmVxdWVzdCB0eXBlLiBFdmVyeSByZXF1ZXN0IHR5cGUgaXMgQysrIGNsYXNzIG5hbWUuCiMgVFlQRSBub2RlanNfYWN0aXZlX3JlcXVlc3RzIGdhdWdlCm5vZGVqc19hY3RpdmVfcmVxdWVzdHN7dHlwZT0iRlNSZXFDYWxsYmFjayIsYXBwPSJqdWljZXNob3AifSAyNQoKIyBIRUxQIG5vZGVqc19hY3RpdmVfcmVxdWVzdHNfdG90YWwgVG90YWwgbnVtYmVyIG9mIGFjdGl2ZSByZXF1ZXN0cy4KIyBUWVBFIG5vZGVqc19hY3RpdmVfcmVxdWVzdHNfdG90YWwgZ2F1Z2UKbm9kZWpzX2FjdGl2ZV9yZXF1ZXN0c190b3RhbHthcHA9Imp1aWNlc2hvcCJ9IDI1CgojIEhFTFAgbm9kZWpzX2hlYXBfc2l6ZV90b3RhbF9ieXRlcyBQcm9jZXNzIGhlYXAgc2l6ZSBmcm9tIE5vZGUuanMgaW4gYnl0ZXMuCiMgVFlQRSBub2RlanNfaGVhcF9zaXplX3RvdGFsX2J5dGVzIGdhdWdlCm5vZGVqc19oZWFwX3NpemVfdG90YWxfYnl0ZXN7YXBwPSJqdWljZXNob3AifSAxNzUxMDM1OTA0CgojIEhFTFAgbm9kZWpzX2hlYXBfc2l6ZV91c2VkX2J5dGVzIFByb2Nlc3MgaGVhcCBzaXplIHVzZWQgZnJvbSBOb2RlLmpzIGluIGJ5dGVzLgojIFRZUEUgbm9kZWpzX2hlYXBfc2l6ZV91c2VkX2J5dGVzIGdhdWdlCm5vZGVqc19oZWFwX3NpemVfdXNlZF9ieXRlc3thcHA9Imp1aWNlc2hvcCJ9IDE2MjIzNTYwODAKCiMgSEVMUCBub2RlanNfZXh0ZXJuYWxfbWVtb3J5X2J5dGVzIE5vZGUuanMgZXh0ZXJuYWwgbWVtb3J5IHNpemUgaW4gYnl0ZXMuCiMgVFlQRSBub2RlanNfZXh0ZXJuYWxfbWVtb3J5X2J5dGVzIGdhdWdlCm5vZGVqc19leHRlcm5hbF9tZW1vcnlfYnl0ZXN7YXBwPSJqdWljZXNob3AifSAzNzg2NTYyMQoKIyBIRUxQIG5vZGVqc19oZWFwX3NwYWNlX3NpemVfdG90YWxfYnl0ZXMgUHJvY2VzcyBoZWFwIHNwYWNlIHNpemUgdG90YWwgZnJvbSBOb2RlLmpzIGluIGJ5dGVzLgojIFRZUEUgbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV90b3RhbF9ieXRlcyBnYXVnZQpub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJyZWFkX29ubHkiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJuZXciLGFwcD0ianVpY2VzaG9wIn0gMTM0MjE3NzI4Cm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdG90YWxfYnl0ZXN7c3BhY2U9Im9sZCIsYXBwPSJqdWljZXNob3AifSAxNTk2OTg1MzQ0Cm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdG90YWxfYnl0ZXN7c3BhY2U9ImNvZGUiLGFwcD0ianVpY2VzaG9wIn0gNTc2NzE2OApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJzaGFyZWQiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJ0cnVzdGVkIixhcHA9Imp1aWNlc2hvcCJ9IDYxMTk0MjQKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV90b3RhbF9ieXRlc3tzcGFjZT0ic2hhcmVkX3RydXN0ZWQiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJuZXdfbGFyZ2Vfb2JqZWN0IixhcHA9Imp1aWNlc2hvcCJ9IDAKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV90b3RhbF9ieXRlc3tzcGFjZT0ibGFyZ2Vfb2JqZWN0IixhcHA9Imp1aWNlc2hvcCJ9IDc3NjYwMTYKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV90b3RhbF9ieXRlc3tzcGFjZT0iY29kZV9sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gMTgwMjI0Cm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdG90YWxfYnl0ZXN7c3BhY2U9InNoYXJlZF9sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJzaGFyZWRfdHJ1c3RlZF9sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJ0cnVzdGVkX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCgojIEhFTFAgbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV91c2VkX2J5dGVzIFByb2Nlc3MgaGVhcCBzcGFjZSBzaXplIHVzZWQgZnJvbSBOb2RlLmpzIGluIGJ5dGVzLgojIFRZUEUgbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV91c2VkX2J5dGVzIGdhdWdlCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0icmVhZF9vbmx5IixhcHA9Imp1aWNlc2hvcCJ9IDAKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV91c2VkX2J5dGVze3NwYWNlPSJuZXciLGFwcD0ianVpY2VzaG9wIn0gMTAwMTEyNzIKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV91c2VkX2J5dGVze3NwYWNlPSJvbGQiLGFwcD0ianVpY2VzaG9wIn0gMTU5NTMxNTI0OApub2RlanNfaGVhcF9zcGFjZV9zaXplX3VzZWRfYnl0ZXN7c3BhY2U9ImNvZGUiLGFwcD0ianVpY2VzaG9wIn0gNTA3NzY5Ngpub2RlanNfaGVhcF9zcGFjZV9zaXplX3VzZWRfYnl0ZXN7c3BhY2U9InNoYXJlZCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0idHJ1c3RlZCIsYXBwPSJqdWljZXNob3AifSAzOTU4NzUyCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0ic2hhcmVkX3RydXN0ZWQiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3VzZWRfYnl0ZXN7c3BhY2U9Im5ld19sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3VzZWRfYnl0ZXN7c3BhY2U9ImxhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSA3NzE1NDcyCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0iY29kZV9sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gMTc2ODAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0ic2hhcmVkX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0ic2hhcmVkX3RydXN0ZWRfbGFyZ2Vfb2JqZWN0IixhcHA9Imp1aWNlc2hvcCJ9IDAKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV91c2VkX2J5dGVze3NwYWNlPSJ0cnVzdGVkX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCgojIEhFTFAgbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXMgUHJvY2VzcyBoZWFwIHNwYWNlIHNpemUgYXZhaWxhYmxlIGZyb20gTm9kZS5qcyBpbiBieXRlcy4KIyBUWVBFIG5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVzIGdhdWdlCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJyZWFkX29ubHkiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX2F2YWlsYWJsZV9ieXRlc3tzcGFjZT0ibmV3IixhcHA9Imp1aWNlc2hvcCJ9IDU3MDkzNDk2Cm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJvbGQiLGFwcD0ianVpY2VzaG9wIn0gMTA0NzU5Mgpub2RlanNfaGVhcF9zcGFjZV9zaXplX2F2YWlsYWJsZV9ieXRlc3tzcGFjZT0iY29kZSIsYXBwPSJqdWljZXNob3AifSA2ODg3NjgKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXN7c3BhY2U9InNoYXJlZCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJ0cnVzdGVkIixhcHA9Imp1aWNlc2hvcCJ9IDIxNTExMjgKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXN7c3BhY2U9InNoYXJlZF90cnVzdGVkIixhcHA9Imp1aWNlc2hvcCJ9IDAKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXN7c3BhY2U9Im5ld19sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gNjcxMDg4NjQKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXN7c3BhY2U9ImxhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJjb2RlX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJzaGFyZWRfbGFyZ2Vfb2JqZWN0IixhcHA9Imp1aWNlc2hvcCJ9IDAKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXN7c3BhY2U9InNoYXJlZF90cnVzdGVkX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJ0cnVzdGVkX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCgojIEhFTFAgbm9kZWpzX3ZlcnNpb25faW5mbyBOb2RlLmpzIHZlcnNpb24gaW5mby4KIyBUWVBFIG5vZGVqc192ZXJzaW9uX2luZm8gZ2F1Z2UKbm9kZWpzX3ZlcnNpb25faW5mb3t2ZXJzaW9uPSJ2MjQuMTQuMCIsbWFqb3I9IjI0IixtaW5vcj0iMTQiLHBhdGNoPSIwIixhcHA9Imp1aWNlc2hvcCJ9IDEKCiMgSEVMUCBub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kcyBHYXJiYWdlIGNvbGxlY3Rpb24gZHVyYXRpb24gYnkga2luZCwgb25lIG9mIG1ham9yLCBtaW5vciwgaW5jcmVtZW50YWwgb3Igd2Vha2NiLgojIFRZUEUgbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHMgaGlzdG9ncmFtCm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMC4wMDEiLGtpbmQ9ImluY3JlbWVudGFsIixhcHA9Imp1aWNlc2hvcCJ9IDUKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfYnVja2V0e2xlPSIwLjAxIixraW5kPSJpbmNyZW1lbnRhbCIsYXBwPSJqdWljZXNob3AifSA3Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMC4xIixraW5kPSJpbmNyZW1lbnRhbCIsYXBwPSJqdWljZXNob3AifSA3Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMSIsa2luZD0iaW5jcmVtZW50YWwiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjIiLGtpbmQ9ImluY3JlbWVudGFsIixhcHA9Imp1aWNlc2hvcCJ9IDcKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfYnVja2V0e2xlPSI1IixraW5kPSJpbmNyZW1lbnRhbCIsYXBwPSJqdWljZXNob3AifSA3Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iK0luZiIsa2luZD0iaW5jcmVtZW50YWwiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19zdW17a2luZD0iaW5jcmVtZW50YWwiLGFwcD0ianVpY2VzaG9wIn0gMC4wMDc0MjA2MjQyNTYxMzQwMzMKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfY291bnR7a2luZD0iaW5jcmVtZW50YWwiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjAuMDAxIixraW5kPSJtYWpvciIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMC4wMSIsa2luZD0ibWFqb3IiLGFwcD0ianVpY2VzaG9wIn0gNApub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjAuMSIsa2luZD0ibWFqb3IiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjEiLGtpbmQ9Im1ham9yIixhcHA9Imp1aWNlc2hvcCJ9IDcKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfYnVja2V0e2xlPSIyIixraW5kPSJtYWpvciIsYXBwPSJqdWljZXNob3AifSA3Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iNSIsa2luZD0ibWFqb3IiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IitJbmYiLGtpbmQ9Im1ham9yIixhcHA9Imp1aWNlc2hvcCJ9IDcKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfc3Vte2tpbmQ9Im1ham9yIixhcHA9Imp1aWNlc2hvcCJ9IDAuMDgxNjE1MjQ5ODcyMjA3NjQKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfY291bnR7a2luZD0ibWFqb3IiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjAuMDAxIixraW5kPSJtaW5vciIsYXBwPSJqdWljZXNob3AifSAzNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjAuMDEiLGtpbmQ9Im1pbm9yIixhcHA9Imp1aWNlc2hvcCJ9IDIzNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjAuMSIsa2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMSIsa2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMiIsa2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iNSIsa2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iK0luZiIsa2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX3N1bXtraW5kPSJtaW5vciIsYXBwPSJqdWljZXNob3AifSAwLjg1MzUyOTk1MDYxODc0MzUKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfY291bnR7a2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5CgojIEhFTFAganVpY2VzaG9wX3ZlcnNpb25faW5mbyBSZWxlYXNlIHZlcnNpb24gb2YgT1dBU1AgSnVpY2UgU2hvcC4KIyBUWVBFIGp1aWNlc2hvcF92ZXJzaW9uX2luZm8gZ2F1Z2UKanVpY2VzaG9wX3ZlcnNpb25faW5mb3t2ZXJzaW9uPSIxOS4yLjEiLG1ham9yPSIxOSIsbWlub3I9IjIiLHBhdGNoPSIxIixhcHA9Imp1aWNlc2hvcCJ9IDEKCiMgSEVMUCBqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWQgTnVtYmVyIG9mIHNvbHZlZCBjaGFsbGVuZ2VzIGdyb3VwZWQgYnkgZGlmZmljdWx0eSBhbmQgY2F0ZWdvcnkuCiMgVFlQRSBqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWQgZ2F1Z2UKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJTZW5zaXRpdmUgRGF0YSBFeHBvc3VyZSIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIzIixjYXRlZ29yeT0iWFNTIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJPYnNlcnZhYmlsaXR5IEZhaWx1cmVzIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJJbXByb3BlciBJbnB1dCBWYWxpZGF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJCcm9rZW4gQWNjZXNzIENvbnRyb2wiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9IlZ1bG5lcmFibGUgQ29tcG9uZW50cyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIzIixjYXRlZ29yeT0iQnJva2VuIEF1dGhlbnRpY2F0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjUiLGNhdGVnb3J5PSJTZWN1cml0eSB0aHJvdWdoIE9ic2N1cml0eSIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI2IixjYXRlZ29yeT0iTWlzY2VsbGFuZW91cyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIxIixjYXRlZ29yeT0iQnJva2VuIEFjY2VzcyBDb250cm9sIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjUiLGNhdGVnb3J5PSJJbnNlY3VyZSBEZXNlcmlhbGl6YXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9IkJyb2tlbiBBbnRpIEF1dG9tYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IkJyb2tlbiBBdXRoZW50aWNhdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iSW5qZWN0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJYU1MiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9IlNlbnNpdGl2ZSBEYXRhIEV4cG9zdXJlIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJYU1MiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9IkluamVjdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iQnJva2VuIEFjY2VzcyBDb250cm9sIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjUiLGNhdGVnb3J5PSJTZW5zaXRpdmUgRGF0YSBFeHBvc3VyZSIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iSW1wcm9wZXIgSW5wdXQgVmFsaWRhdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIxIixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iSW1wcm9wZXIgSW5wdXQgVmFsaWRhdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iQnJva2VuIEFudGkgQXV0b21hdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI2IixjYXRlZ29yeT0iQ3J5cHRvZ3JhcGhpYyBJc3N1ZXMiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9IkJyb2tlbiBBY2Nlc3MgQ29udHJvbCIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iU2Vuc2l0aXZlIERhdGEgRXhwb3N1cmUiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IlZ1bG5lcmFibGUgQ29tcG9uZW50cyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iT2JzZXJ2YWJpbGl0eSBGYWlsdXJlcyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iVnVsbmVyYWJsZSBDb21wb25lbnRzIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJJbmplY3Rpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9IlNlbnNpdGl2ZSBEYXRhIEV4cG9zdXJlIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJCcm9rZW4gQXV0aGVudGljYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9IlNlY3VyaXR5IE1pc2NvbmZpZ3VyYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9IkJyb2tlbiBBbnRpIEF1dG9tYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNCIsY2F0ZWdvcnk9IkNyeXB0b2dyYXBoaWMgSXNzdWVzIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjUiLGNhdGVnb3J5PSJJbmplY3Rpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9IlVudmFsaWRhdGVkIFJlZGlyZWN0cyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iQnJva2VuIEF1dGhlbnRpY2F0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJNaXNjZWxsYW5lb3VzIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJTZWN1cml0eSB0aHJvdWdoIE9ic2N1cml0eSIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iWFNTIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJJbXByb3BlciBJbnB1dCBWYWxpZGF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjYiLGNhdGVnb3J5PSJCcm9rZW4gQWNjZXNzIENvbnRyb2wiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9IkluamVjdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iTWlzY2VsbGFuZW91cyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iU2VjdXJpdHkgdGhyb3VnaCBPYnNjdXJpdHkiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9Ikluc2VjdXJlIERlc2VyaWFsaXphdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI2IixjYXRlZ29yeT0iWFNTIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJDcnlwdG9ncmFwaGljIElzc3VlcyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iVW52YWxpZGF0ZWQgUmVkaXJlY3RzIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJYWEUiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IlhYRSIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIxIixjYXRlZ29yeT0iT2JzZXJ2YWJpbGl0eSBGYWlsdXJlcyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIzIixjYXRlZ29yeT0iTWlzY2VsbGFuZW91cyIsYXBwPSJqdWljZXNob3AifSAwCgojIEhFTFAganVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWwgVG90YWwgbnVtYmVyIG9mIGNoYWxsZW5nZXMgZ3JvdXBlZCBieSBkaWZmaWN1bHR5IGFuZCBjYXRlZ29yeS4KIyBUWVBFIGp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFsIGdhdWdlCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJTZW5zaXRpdmUgRGF0YSBFeHBvc3VyZSIsYXBwPSJqdWljZXNob3AifSA2Cmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJYU1MiLGFwcD0ianVpY2VzaG9wIn0gMgpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iT2JzZXJ2YWJpbGl0eSBGYWlsdXJlcyIsYXBwPSJqdWljZXNob3AifSAyCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJJbXByb3BlciBJbnB1dCBWYWxpZGF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDYKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMiIsY2F0ZWdvcnk9IkJyb2tlbiBBY2Nlc3MgQ29udHJvbCIsYXBwPSJqdWljZXNob3AifSAzCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjYiLGNhdGVnb3J5PSJWdWxuZXJhYmxlIENvbXBvbmVudHMiLGFwcD0ianVpY2VzaG9wIn0gMgpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIzIixjYXRlZ29yeT0iQnJva2VuIEF1dGhlbnRpY2F0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDMKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IlNlY3VyaXR5IHRocm91Z2ggT2JzY3VyaXR5IixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9Ik1pc2NlbGxhbmVvdXMiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIxIixjYXRlZ29yeT0iQnJva2VuIEFjY2VzcyBDb250cm9sIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9Ikluc2VjdXJlIERlc2VyaWFsaXphdGlvbiIsYXBwPSJqdWljZXNob3AifSAyCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJCcm9rZW4gQW50aSBBdXRvbWF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IkJyb2tlbiBBdXRoZW50aWNhdGlvbiIsYXBwPSJqdWljZXNob3AifSAzCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJJbmplY3Rpb24iLGFwcD0ianVpY2VzaG9wIn0gNQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iWFNTIixhcHA9Imp1aWNlc2hvcCJ9IDMKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9IlNlbnNpdGl2ZSBEYXRhIEV4cG9zdXJlIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9IlhTUyIsYXBwPSJqdWljZXNob3AifSAyCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJJbmplY3Rpb24iLGFwcD0ianVpY2VzaG9wIn0gMwpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJCcm9rZW4gQWNjZXNzIENvbnRyb2wiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iU2Vuc2l0aXZlIERhdGEgRXhwb3N1cmUiLGFwcD0ianVpY2VzaG9wIn0gMwpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iSW1wcm9wZXIgSW5wdXQgVmFsaWRhdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJTZWN1cml0eSBNaXNjb25maWd1cmF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNCIsY2F0ZWdvcnk9IkltcHJvcGVyIElucHV0IFZhbGlkYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMgpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iQnJva2VuIEFudGkgQXV0b21hdGlvbiIsYXBwPSJqdWljZXNob3AifSAyCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjYiLGNhdGVnb3J5PSJDcnlwdG9ncmFwaGljIElzc3VlcyIsYXBwPSJqdWljZXNob3AifSAzCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJCcm9rZW4gQWNjZXNzIENvbnRyb2wiLGFwcD0ianVpY2VzaG9wIn0gNQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iU2Vuc2l0aXZlIERhdGEgRXhwb3N1cmUiLGFwcD0ianVpY2VzaG9wIn0gNQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iVnVsbmVyYWJsZSBDb21wb25lbnRzIixhcHA9Imp1aWNlc2hvcCJ9IDUKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9Ik9ic2VydmFiaWxpdHkgRmFpbHVyZXMiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iVnVsbmVyYWJsZSBDb21wb25lbnRzIixhcHA9Imp1aWNlc2hvcCJ9IDIKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMiIsY2F0ZWdvcnk9IkluamVjdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJTZW5zaXRpdmUgRGF0YSBFeHBvc3VyZSIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJCcm9rZW4gQXV0aGVudGljYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMgpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI2IixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjYiLGNhdGVnb3J5PSJCcm9rZW4gQW50aSBBdXRvbWF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNCIsY2F0ZWdvcnk9IkNyeXB0b2dyYXBoaWMgSXNzdWVzIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IkluamVjdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJVbnZhbGlkYXRlZCBSZWRpcmVjdHMiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iQnJva2VuIEF1dGhlbnRpY2F0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9Ik1pc2NlbGxhbmVvdXMiLGFwcD0ianVpY2VzaG9wIn0gNApqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIzIixjYXRlZ29yeT0iU2VjdXJpdHkgdGhyb3VnaCBPYnNjdXJpdHkiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iWFNTIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9IkltcHJvcGVyIElucHV0IFZhbGlkYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMwpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI2IixjYXRlZ29yeT0iQnJva2VuIEFjY2VzcyBDb250cm9sIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9IkluamVjdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJNaXNjZWxsYW5lb3VzIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNCIsY2F0ZWdvcnk9IlNlY3VyaXR5IHRocm91Z2ggT2JzY3VyaXR5IixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9Ikluc2VjdXJlIERlc2VyaWFsaXphdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjYiLGNhdGVnb3J5PSJYU1MiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iQ3J5cHRvZ3JhcGhpYyBJc3N1ZXMiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iVW52YWxpZGF0ZWQgUmVkaXJlY3RzIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9IlhYRSIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjUiLGNhdGVnb3J5PSJYWEUiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJPYnNlcnZhYmlsaXR5IEZhaWx1cmVzIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9Ik1pc2NlbGxhbmVvdXMiLGFwcD0ianVpY2VzaG9wIn0gMQoKIyBIRUxQIGp1aWNlc2hvcF9jb2RpbmdfY2hhbGxlbmdlc19wcm9ncmVzcyBOdW1iZXIgb2YgY29kaW5nIGNoYWxsZW5nZXMgZ3JvdXBlZCBieSBwcm9ncmVzc2lvbiBwaGFzZS4KIyBUWVBFIGp1aWNlc2hvcF9jb2RpbmdfY2hhbGxlbmdlc19wcm9ncmVzcyBnYXVnZQpqdWljZXNob3BfY29kaW5nX2NoYWxsZW5nZXNfcHJvZ3Jlc3N7cGhhc2U9ImZpbmQgaXQiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY29kaW5nX2NoYWxsZW5nZXNfcHJvZ3Jlc3N7cGhhc2U9ImZpeCBpdCIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jb2RpbmdfY2hhbGxlbmdlc19wcm9ncmVzc3twaGFzZT0idW5zb2x2ZWQiLGFwcD0ianVpY2VzaG9wIn0gMzEKCiMgSEVMUCBqdWljZXNob3BfY2hlYXRfc2NvcmUgT3ZlcmFsbCBwcm9iYWJpbGl0eSB0aGF0IGFueSBoYWNraW5nIG9yIGNvZGluZyBjaGFsbGVuZ2VzIHdlcmUgc29sdmVkIGJ5IGNoZWF0aW5nLgojIFRZUEUganVpY2VzaG9wX2NoZWF0X3Njb3JlIGdhdWdlCmp1aWNlc2hvcF9jaGVhdF9zY29yZXthcHA9Imp1aWNlc2hvcCJ9IDAKCiMgSEVMUCBqdWljZXNob3BfY29kaW5nX2NoYWxsZW5nZXNfYWNjdXJhY3kgT3ZlcmFsbCBhY2N1cmFjeSB3aGlsZSBzb2x2aW5nIGNvZGluZyBjaGFsbGVuZ2VzIGdyb3VwZWQgYnkgcGhhc2UuCiMgVFlQRSBqdWljZXNob3BfY29kaW5nX2NoYWxsZW5nZXNfYWNjdXJhY3kgZ2F1Z2UKanVpY2VzaG9wX2NvZGluZ19jaGFsbGVuZ2VzX2FjY3VyYWN5e3BoYXNlPSJmaW5kIGl0IixhcHA9Imp1aWNlc2hvcCJ9IE5hbgpqdWljZXNob3BfY29kaW5nX2NoYWxsZW5nZXNfYWNjdXJhY3l7cGhhc2U9ImZpeCBpdCIsYXBwPSJqdWljZXNob3AifSBOYW4KCiMgSEVMUCBqdWljZXNob3Bfb3JkZXJzX3BsYWNlZF90b3RhbCBOdW1iZXIgb2Ygb3JkZXJzIHBsYWNlZCBpbiBPV0FTUCBKdWljZSBTaG9wLgojIFRZUEUganVpY2VzaG9wX29yZGVyc19wbGFjZWRfdG90YWwgZ2F1Z2UKanVpY2VzaG9wX29yZGVyc19wbGFjZWRfdG90YWx7YXBwPSJqdWljZXNob3AifSAzCgojIEhFTFAganVpY2VzaG9wX3VzZXJzX3JlZ2lzdGVyZWQgTnVtYmVyIG9mIHJlZ2lzdGVyZWQgdXNlcnMgZ3JvdXBlZCBieSBjdXN0b21lciB0eXBlLgojIFRZUEUganVpY2VzaG9wX3VzZXJzX3JlZ2lzdGVyZWQgZ2F1Z2UKanVpY2VzaG9wX3VzZXJzX3JlZ2lzdGVyZWR7dHlwZT0ic3RhbmRhcmQiLGFwcD0ianVpY2VzaG9wIn0gOQpqdWljZXNob3BfdXNlcnNfcmVnaXN0ZXJlZHt0eXBlPSJkZWx1eGUiLGFwcD0ianVpY2VzaG9wIn0gNAoKIyBIRUxQIGp1aWNlc2hvcF91c2Vyc19yZWdpc3RlcmVkX3RvdGFsIFRvdGFsIG51bWJlciBvZiByZWdpc3RlcmVkIHVzZXJzLgojIFRZUEUganVpY2VzaG9wX3VzZXJzX3JlZ2lzdGVyZWRfdG90YWwgZ2F1Z2UKanVpY2VzaG9wX3VzZXJzX3JlZ2lzdGVyZWRfdG90YWx7YXBwPSJqdWljZXNob3AifSAyMQoKIyBIRUxQIGp1aWNlc2hvcF93YWxsZXRfYmFsYW5jZV90b3RhbCBUb3RhbCBiYWxhbmNlIG9mIGFsbCB1c2VycycgZGlnaXRhbCB3YWxsZXRzLgojIFRZUEUganVpY2VzaG9wX3dhbGxldF9iYWxhbmNlX3RvdGFsIGdhdWdlCmp1aWNlc2hvcF93YWxsZXRfYmFsYW5jZV90b3RhbHthcHA9Imp1aWNlc2hvcCJ9IDEzODg1CgojIEhFTFAganVpY2VzaG9wX3VzZXJfc29jaWFsX2ludGVyYWN0aW9ucyBOdW1iZXIgb2Ygc29jaWFsIGludGVyYWN0aW9ucyB3aXRoIHVzZXJzIGdyb3VwZWQgYnkgdHlwZS4KIyBUWVBFIGp1aWNlc2hvcF91c2VyX3NvY2lhbF9pbnRlcmFjdGlvbnMgZ2F1Z2UKanVpY2VzaG9wX3VzZXJfc29jaWFsX2ludGVyYWN0aW9uc3t0eXBlPSJyZXZpZXciLGFwcD0ianVpY2VzaG9wIn0gMjgKanVpY2VzaG9wX3VzZXJfc29jaWFsX2ludGVyYWN0aW9uc3t0eXBlPSJmZWVkYmFjayIsYXBwPSJqdWljZXNob3AifSA4Cmp1aWNlc2hvcF91c2VyX3NvY2lhbF9pbnRlcmFjdGlvbnN7dHlwZT0iY29tcGxhaW50IixhcHA9Imp1aWNlc2hvcCJ9IDEKCiMgSEVMUCBodHRwX3JlcXVlc3RzX2NvdW50IFRvdGFsIEhUVFAgcmVxdWVzdCBjb3VudCBncm91cGVkIGJ5IHN0YXR1cyBjb2RlLgojIFRZUEUgaHR0cF9yZXF1ZXN0c19jb3VudCBjb3VudGVyCmh0dHBfcmVxdWVzdHNfY291bnR7c3RhdHVzX2NvZGU9IjJYWCIsYXBwPSJqdWljZXNob3AifSAzODc4Cmh0dHBfcmVxdWVzdHNfY291bnR7c3RhdHVzX2NvZGU9IjVYWCIsYXBwPSJqdWljZXNob3AifSAxNDEKaHR0cF9yZXF1ZXN0c19jb3VudHtzdGF0dXNfY29kZT0iM1hYIixhcHA9Imp1aWNlc2hvcCJ9IDMK","response_hash":"5f7062d35081e60c30c7506364189aece2bbad38e0343d043e13dadb8e64cf1c","response_time_ms":0,"response_words":1321,"has_response":true,"parameters":[{"name":"1","value":"metrics","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12}],"sent_at":"2026-04-05T05:33:08.389814Z","received_at":"2026-04-05T05:33:08.389814Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"89abba17-6ad3-4db2-9ada-d4342fceddcf","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/metrics/","url":"http://localhost:3000/metrics/","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9tZXRyaWNzLyBIVFRQLzEuMQ0KSG9zdDogbG9jYWxob3N0OjMwMDANCg0K","request_hash":"929c3286cf1ff043a40ada40edadf0305ab2a02ebdeb0befcd0e05ca1426cf43","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Connection":["keep-alive"],"Content-Length":["25336"],"Content-Type":["text/plain; version=0.0.4; charset=utf-8"],"Date":["Sun, 05 Apr 2026 05:32:41 GMT"],"Keep-Alive":["timeout=5"]},"response_content_type":"text/plain; version=0.0.4; charset=utf-8","response_content_length":25336,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDb250ZW50LUxlbmd0aDogMjUzMzYNCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgdmVyc2lvbj0wLjAuNDsgY2hhcnNldD11dGYtOA0KRGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMjo0MSBHTVQNCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KDQojIEhFTFAgZmlsZV91cGxvYWRzX2NvdW50IFRvdGFsIG51bWJlciBvZiBzdWNjZXNzZnVsIGZpbGUgdXBsb2FkcyBncm91cGVkIGJ5IGZpbGUgdHlwZS4KIyBUWVBFIGZpbGVfdXBsb2Fkc19jb3VudCBjb3VudGVyCgojIEhFTFAgZmlsZV91cGxvYWRfZXJyb3JzIFRvdGFsIG51bWJlciBvZiBmYWlsZWQgZmlsZSB1cGxvYWRzIGdyb3VwZWQgYnkgZmlsZSB0eXBlLgojIFRZUEUgZmlsZV91cGxvYWRfZXJyb3JzIGNvdW50ZXIKCiMgSEVMUCBqdWljZXNob3Bfc3RhcnR1cF9kdXJhdGlvbl9zZWNvbmRzIER1cmF0aW9uIGp1aWNlc2hvcCByZXF1aXJlZCB0byBwZXJmb3JtIGEgY2VydGFpbiB0YXNrIGR1cmluZyBzdGFydHVwCiMgVFlQRSBqdWljZXNob3Bfc3RhcnR1cF9kdXJhdGlvbl9zZWNvbmRzIGdhdWdlCmp1aWNlc2hvcF9zdGFydHVwX2R1cmF0aW9uX3NlY29uZHN7dGFzaz0idmFsaWRhdGVDb25maWciLGFwcD0ianVpY2VzaG9wIn0gMC4wMTMxNjMwNDEKanVpY2VzaG9wX3N0YXJ0dXBfZHVyYXRpb25fc2Vjb25kc3t0YXNrPSJjbGVhbnVwRnRwRm9sZGVyIixhcHA9Imp1aWNlc2hvcCJ9IDAuMDIwMjE5NDE3Cmp1aWNlc2hvcF9zdGFydHVwX2R1cmF0aW9uX3NlY29uZHN7dGFzaz0idmFsaWRhdGVQcmVjb25kaXRpb25zIixhcHA9Imp1aWNlc2hvcCJ9IDAuMDU4NzQzNzkxCmp1aWNlc2hvcF9zdGFydHVwX2R1cmF0aW9uX3NlY29uZHN7dGFzaz0iZGF0YWNyZWF0b3IiLGFwcD0ianVpY2VzaG9wIn0gMS41NTIwMzg4NzYwMDAwMDAxCmp1aWNlc2hvcF9zdGFydHVwX2R1cmF0aW9uX3NlY29uZHN7dGFzaz0iY3VzdG9taXplQXBwbGljYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMC4wMDc3NjYxNjYKanVpY2VzaG9wX3N0YXJ0dXBfZHVyYXRpb25fc2Vjb25kc3t0YXNrPSJjdXN0b21pemVFYXN0ZXJFZ2ciLGFwcD0ianVpY2VzaG9wIn0gMC4wMDQ1OTUzNzUKanVpY2VzaG9wX3N0YXJ0dXBfZHVyYXRpb25fc2Vjb25kc3t0YXNrPSJyZWFkeSIsYXBwPSJqdWljZXNob3AifSAxLjU4NQoKIyBIRUxQIHByb2Nlc3NfY3B1X3VzZXJfc2Vjb25kc190b3RhbCBUb3RhbCB1c2VyIENQVSB0aW1lIHNwZW50IGluIHNlY29uZHMuCiMgVFlQRSBwcm9jZXNzX2NwdV91c2VyX3NlY29uZHNfdG90YWwgY291bnRlcgpwcm9jZXNzX2NwdV91c2VyX3NlY29uZHNfdG90YWx7YXBwPSJqdWljZXNob3AifSAxNS4xMzU0NzkKCiMgSEVMUCBwcm9jZXNzX2NwdV9zeXN0ZW1fc2Vjb25kc190b3RhbCBUb3RhbCBzeXN0ZW0gQ1BVIHRpbWUgc3BlbnQgaW4gc2Vjb25kcy4KIyBUWVBFIHByb2Nlc3NfY3B1X3N5c3RlbV9zZWNvbmRzX3RvdGFsIGNvdW50ZXIKcHJvY2Vzc19jcHVfc3lzdGVtX3NlY29uZHNfdG90YWx7YXBwPSJqdWljZXNob3AifSAyLjg1NTc3OQoKIyBIRUxQIHByb2Nlc3NfY3B1X3NlY29uZHNfdG90YWwgVG90YWwgdXNlciBhbmQgc3lzdGVtIENQVSB0aW1lIHNwZW50IGluIHNlY29uZHMuCiMgVFlQRSBwcm9jZXNzX2NwdV9zZWNvbmRzX3RvdGFsIGNvdW50ZXIKcHJvY2Vzc19jcHVfc2Vjb25kc190b3RhbHthcHA9Imp1aWNlc2hvcCJ9IDE3Ljk5MTI1OAoKIyBIRUxQIHByb2Nlc3Nfc3RhcnRfdGltZV9zZWNvbmRzIFN0YXJ0IHRpbWUgb2YgdGhlIHByb2Nlc3Mgc2luY2UgdW5peCBlcG9jaCBpbiBzZWNvbmRzLgojIFRZUEUgcHJvY2Vzc19zdGFydF90aW1lX3NlY29uZHMgZ2F1Z2UKcHJvY2Vzc19zdGFydF90aW1lX3NlY29uZHN7YXBwPSJqdWljZXNob3AifSAxNzc1MzY3MDk3CgojIEhFTFAgcHJvY2Vzc19yZXNpZGVudF9tZW1vcnlfYnl0ZXMgUmVzaWRlbnQgbWVtb3J5IHNpemUgaW4gYnl0ZXMuCiMgVFlQRSBwcm9jZXNzX3Jlc2lkZW50X21lbW9yeV9ieXRlcyBnYXVnZQpwcm9jZXNzX3Jlc2lkZW50X21lbW9yeV9ieXRlc3thcHA9Imp1aWNlc2hvcCJ9IDIxMzg0OTcwMjQKCiMgSEVMUCBwcm9jZXNzX3ZpcnR1YWxfbWVtb3J5X2J5dGVzIFZpcnR1YWwgbWVtb3J5IHNpemUgaW4gYnl0ZXMuCiMgVFlQRSBwcm9jZXNzX3ZpcnR1YWxfbWVtb3J5X2J5dGVzIGdhdWdlCnByb2Nlc3NfdmlydHVhbF9tZW1vcnlfYnl0ZXN7YXBwPSJqdWljZXNob3AifSAzNTEwMjU1NjE2CgojIEhFTFAgcHJvY2Vzc19oZWFwX2J5dGVzIFByb2Nlc3MgaGVhcCBzaXplIGluIGJ5dGVzLgojIFRZUEUgcHJvY2Vzc19oZWFwX2J5dGVzIGdhdWdlCnByb2Nlc3NfaGVhcF9ieXRlc3thcHA9Imp1aWNlc2hvcCJ9IDI0MzM3OTQwNDgKCiMgSEVMUCBwcm9jZXNzX29wZW5fZmRzIE51bWJlciBvZiBvcGVuIGZpbGUgZGVzY3JpcHRvcnMuCiMgVFlQRSBwcm9jZXNzX29wZW5fZmRzIGdhdWdlCnByb2Nlc3Nfb3Blbl9mZHN7YXBwPSJqdWljZXNob3AifSA2NQoKIyBIRUxQIHByb2Nlc3NfbWF4X2ZkcyBNYXhpbXVtIG51bWJlciBvZiBvcGVuIGZpbGUgZGVzY3JpcHRvcnMuCiMgVFlQRSBwcm9jZXNzX21heF9mZHMgZ2F1Z2UKcHJvY2Vzc19tYXhfZmRze2FwcD0ianVpY2VzaG9wIn0gMTA0ODU3NgoKIyBIRUxQIG5vZGVqc19ldmVudGxvb3BfbGFnX3NlY29uZHMgTGFnIG9mIGV2ZW50IGxvb3AgaW4gc2Vjb25kcy4KIyBUWVBFIG5vZGVqc19ldmVudGxvb3BfbGFnX3NlY29uZHMgZ2F1Z2UKbm9kZWpzX2V2ZW50bG9vcF9sYWdfc2Vjb25kc3thcHA9Imp1aWNlc2hvcCJ9IDAKCiMgSEVMUCBub2RlanNfZXZlbnRsb29wX2xhZ19taW5fc2Vjb25kcyBUaGUgbWluaW11bSByZWNvcmRlZCBldmVudCBsb29wIGRlbGF5LgojIFRZUEUgbm9kZWpzX2V2ZW50bG9vcF9sYWdfbWluX3NlY29uZHMgZ2F1Z2UKbm9kZWpzX2V2ZW50bG9vcF9sYWdfbWluX3NlY29uZHN7YXBwPSJqdWljZXNob3AifSA5MjIzMzcyMDM2Ljg1NDc3NgoKIyBIRUxQIG5vZGVqc19ldmVudGxvb3BfbGFnX21heF9zZWNvbmRzIFRoZSBtYXhpbXVtIHJlY29yZGVkIGV2ZW50IGxvb3AgZGVsYXkuCiMgVFlQRSBub2RlanNfZXZlbnRsb29wX2xhZ19tYXhfc2Vjb25kcyBnYXVnZQpub2RlanNfZXZlbnRsb29wX2xhZ19tYXhfc2Vjb25kc3thcHA9Imp1aWNlc2hvcCJ9IDAKCiMgSEVMUCBub2RlanNfZXZlbnRsb29wX2xhZ19tZWFuX3NlY29uZHMgVGhlIG1lYW4gb2YgdGhlIHJlY29yZGVkIGV2ZW50IGxvb3AgZGVsYXlzLgojIFRZUEUgbm9kZWpzX2V2ZW50bG9vcF9sYWdfbWVhbl9zZWNvbmRzIGdhdWdlCm5vZGVqc19ldmVudGxvb3BfbGFnX21lYW5fc2Vjb25kc3thcHA9Imp1aWNlc2hvcCJ9IE5hbgoKIyBIRUxQIG5vZGVqc19ldmVudGxvb3BfbGFnX3N0ZGRldl9zZWNvbmRzIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJlY29yZGVkIGV2ZW50IGxvb3AgZGVsYXlzLgojIFRZUEUgbm9kZWpzX2V2ZW50bG9vcF9sYWdfc3RkZGV2X3NlY29uZHMgZ2F1Z2UKbm9kZWpzX2V2ZW50bG9vcF9sYWdfc3RkZGV2X3NlY29uZHN7YXBwPSJqdWljZXNob3AifSBOYW4KCiMgSEVMUCBub2RlanNfZXZlbnRsb29wX2xhZ19wNTBfc2Vjb25kcyBUaGUgNTB0aCBwZXJjZW50aWxlIG9mIHRoZSByZWNvcmRlZCBldmVudCBsb29wIGRlbGF5cy4KIyBUWVBFIG5vZGVqc19ldmVudGxvb3BfbGFnX3A1MF9zZWNvbmRzIGdhdWdlCm5vZGVqc19ldmVudGxvb3BfbGFnX3A1MF9zZWNvbmRze2FwcD0ianVpY2VzaG9wIn0gNS4xMWUtNwoKIyBIRUxQIG5vZGVqc19ldmVudGxvb3BfbGFnX3A5MF9zZWNvbmRzIFRoZSA5MHRoIHBlcmNlbnRpbGUgb2YgdGhlIHJlY29yZGVkIGV2ZW50IGxvb3AgZGVsYXlzLgojIFRZUEUgbm9kZWpzX2V2ZW50bG9vcF9sYWdfcDkwX3NlY29uZHMgZ2F1Z2UKbm9kZWpzX2V2ZW50bG9vcF9sYWdfcDkwX3NlY29uZHN7YXBwPSJqdWljZXNob3AifSA1LjExZS03CgojIEhFTFAgbm9kZWpzX2V2ZW50bG9vcF9sYWdfcDk5X3NlY29uZHMgVGhlIDk5dGggcGVyY2VudGlsZSBvZiB0aGUgcmVjb3JkZWQgZXZlbnQgbG9vcCBkZWxheXMuCiMgVFlQRSBub2RlanNfZXZlbnRsb29wX2xhZ19wOTlfc2Vjb25kcyBnYXVnZQpub2RlanNfZXZlbnRsb29wX2xhZ19wOTlfc2Vjb25kc3thcHA9Imp1aWNlc2hvcCJ9IDUuMTFlLTcKCiMgSEVMUCBub2RlanNfYWN0aXZlX3Jlc291cmNlcyBOdW1iZXIgb2YgYWN0aXZlIHJlc291cmNlcyB0aGF0IGFyZSBjdXJyZW50bHkga2VlcGluZyB0aGUgZXZlbnQgbG9vcCBhbGl2ZSwgZ3JvdXBlZCBieSBhc3luYyByZXNvdXJjZSB0eXBlLgojIFRZUEUgbm9kZWpzX2FjdGl2ZV9yZXNvdXJjZXMgZ2F1Z2UKbm9kZWpzX2FjdGl2ZV9yZXNvdXJjZXN7dHlwZT0iRlNSZXFDYWxsYmFjayIsYXBwPSJqdWljZXNob3AifSAyNgpub2RlanNfYWN0aXZlX3Jlc291cmNlc3t0eXBlPSJQaXBlV3JhcCIsYXBwPSJqdWljZXNob3AifSAyCm5vZGVqc19hY3RpdmVfcmVzb3VyY2Vze3R5cGU9IkZTRXZlbnRXcmFwIixhcHA9Imp1aWNlc2hvcCJ9IDEKbm9kZWpzX2FjdGl2ZV9yZXNvdXJjZXN7dHlwZT0iVENQU2VydmVyV3JhcCIsYXBwPSJqdWljZXNob3AifSAxCm5vZGVqc19hY3RpdmVfcmVzb3VyY2Vze3R5cGU9IlRDUFNvY2tldFdyYXAiLGFwcD0ianVpY2VzaG9wIn0gMzAKbm9kZWpzX2FjdGl2ZV9yZXNvdXJjZXN7dHlwZT0iVGltZW91dCIsYXBwPSJqdWljZXNob3AifSAxCm5vZGVqc19hY3RpdmVfcmVzb3VyY2Vze3R5cGU9IkltbWVkaWF0ZSIsYXBwPSJqdWljZXNob3AifSAyCgojIEhFTFAgbm9kZWpzX2FjdGl2ZV9yZXNvdXJjZXNfdG90YWwgVG90YWwgbnVtYmVyIG9mIGFjdGl2ZSByZXNvdXJjZXMuCiMgVFlQRSBub2RlanNfYWN0aXZlX3Jlc291cmNlc190b3RhbCBnYXVnZQpub2RlanNfYWN0aXZlX3Jlc291cmNlc190b3RhbHthcHA9Imp1aWNlc2hvcCJ9IDYzCgojIEhFTFAgbm9kZWpzX2FjdGl2ZV9oYW5kbGVzIE51bWJlciBvZiBhY3RpdmUgbGlidXYgaGFuZGxlcyBncm91cGVkIGJ5IGhhbmRsZSB0eXBlLiBFdmVyeSBoYW5kbGUgdHlwZSBpcyBDKysgY2xhc3MgbmFtZS4KIyBUWVBFIG5vZGVqc19hY3RpdmVfaGFuZGxlcyBnYXVnZQpub2RlanNfYWN0aXZlX2hhbmRsZXN7dHlwZT0iU29ja2V0IixhcHA9Imp1aWNlc2hvcCJ9IDMyCm5vZGVqc19hY3RpdmVfaGFuZGxlc3t0eXBlPSJGU1dhdGNoZXIiLGFwcD0ianVpY2VzaG9wIn0gMQpub2RlanNfYWN0aXZlX2hhbmRsZXN7dHlwZT0iU2VydmVyIixhcHA9Imp1aWNlc2hvcCJ9IDEKCiMgSEVMUCBub2RlanNfYWN0aXZlX2hhbmRsZXNfdG90YWwgVG90YWwgbnVtYmVyIG9mIGFjdGl2ZSBoYW5kbGVzLgojIFRZUEUgbm9kZWpzX2FjdGl2ZV9oYW5kbGVzX3RvdGFsIGdhdWdlCm5vZGVqc19hY3RpdmVfaGFuZGxlc190b3RhbHthcHA9Imp1aWNlc2hvcCJ9IDM0CgojIEhFTFAgbm9kZWpzX2FjdGl2ZV9yZXF1ZXN0cyBOdW1iZXIgb2YgYWN0aXZlIGxpYnV2IHJlcXVlc3RzIGdyb3VwZWQgYnkgcmVxdWVzdCB0eXBlLiBFdmVyeSByZXF1ZXN0IHR5cGUgaXMgQysrIGNsYXNzIG5hbWUuCiMgVFlQRSBub2RlanNfYWN0aXZlX3JlcXVlc3RzIGdhdWdlCm5vZGVqc19hY3RpdmVfcmVxdWVzdHN7dHlwZT0iRlNSZXFDYWxsYmFjayIsYXBwPSJqdWljZXNob3AifSAyNgoKIyBIRUxQIG5vZGVqc19hY3RpdmVfcmVxdWVzdHNfdG90YWwgVG90YWwgbnVtYmVyIG9mIGFjdGl2ZSByZXF1ZXN0cy4KIyBUWVBFIG5vZGVqc19hY3RpdmVfcmVxdWVzdHNfdG90YWwgZ2F1Z2UKbm9kZWpzX2FjdGl2ZV9yZXF1ZXN0c190b3RhbHthcHA9Imp1aWNlc2hvcCJ9IDI2CgojIEhFTFAgbm9kZWpzX2hlYXBfc2l6ZV90b3RhbF9ieXRlcyBQcm9jZXNzIGhlYXAgc2l6ZSBmcm9tIE5vZGUuanMgaW4gYnl0ZXMuCiMgVFlQRSBub2RlanNfaGVhcF9zaXplX3RvdGFsX2J5dGVzIGdhdWdlCm5vZGVqc19oZWFwX3NpemVfdG90YWxfYnl0ZXN7YXBwPSJqdWljZXNob3AifSAxNzUxMDM1OTA0CgojIEhFTFAgbm9kZWpzX2hlYXBfc2l6ZV91c2VkX2J5dGVzIFByb2Nlc3MgaGVhcCBzaXplIHVzZWQgZnJvbSBOb2RlLmpzIGluIGJ5dGVzLgojIFRZUEUgbm9kZWpzX2hlYXBfc2l6ZV91c2VkX2J5dGVzIGdhdWdlCm5vZGVqc19oZWFwX3NpemVfdXNlZF9ieXRlc3thcHA9Imp1aWNlc2hvcCJ9IDE2MjMxODQ3NTIKCiMgSEVMUCBub2RlanNfZXh0ZXJuYWxfbWVtb3J5X2J5dGVzIE5vZGUuanMgZXh0ZXJuYWwgbWVtb3J5IHNpemUgaW4gYnl0ZXMuCiMgVFlQRSBub2RlanNfZXh0ZXJuYWxfbWVtb3J5X2J5dGVzIGdhdWdlCm5vZGVqc19leHRlcm5hbF9tZW1vcnlfYnl0ZXN7YXBwPSJqdWljZXNob3AifSAzNTYyNTA2NwoKIyBIRUxQIG5vZGVqc19oZWFwX3NwYWNlX3NpemVfdG90YWxfYnl0ZXMgUHJvY2VzcyBoZWFwIHNwYWNlIHNpemUgdG90YWwgZnJvbSBOb2RlLmpzIGluIGJ5dGVzLgojIFRZUEUgbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV90b3RhbF9ieXRlcyBnYXVnZQpub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJyZWFkX29ubHkiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJuZXciLGFwcD0ianVpY2VzaG9wIn0gMTM0MjE3NzI4Cm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdG90YWxfYnl0ZXN7c3BhY2U9Im9sZCIsYXBwPSJqdWljZXNob3AifSAxNTk2OTg1MzQ0Cm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdG90YWxfYnl0ZXN7c3BhY2U9ImNvZGUiLGFwcD0ianVpY2VzaG9wIn0gNTc2NzE2OApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJzaGFyZWQiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJ0cnVzdGVkIixhcHA9Imp1aWNlc2hvcCJ9IDYxMTk0MjQKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV90b3RhbF9ieXRlc3tzcGFjZT0ic2hhcmVkX3RydXN0ZWQiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJuZXdfbGFyZ2Vfb2JqZWN0IixhcHA9Imp1aWNlc2hvcCJ9IDAKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV90b3RhbF9ieXRlc3tzcGFjZT0ibGFyZ2Vfb2JqZWN0IixhcHA9Imp1aWNlc2hvcCJ9IDc3NjYwMTYKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV90b3RhbF9ieXRlc3tzcGFjZT0iY29kZV9sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gMTgwMjI0Cm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdG90YWxfYnl0ZXN7c3BhY2U9InNoYXJlZF9sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJzaGFyZWRfdHJ1c3RlZF9sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3RvdGFsX2J5dGVze3NwYWNlPSJ0cnVzdGVkX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCgojIEhFTFAgbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV91c2VkX2J5dGVzIFByb2Nlc3MgaGVhcCBzcGFjZSBzaXplIHVzZWQgZnJvbSBOb2RlLmpzIGluIGJ5dGVzLgojIFRZUEUgbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV91c2VkX2J5dGVzIGdhdWdlCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0icmVhZF9vbmx5IixhcHA9Imp1aWNlc2hvcCJ9IDAKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV91c2VkX2J5dGVze3NwYWNlPSJuZXciLGFwcD0ianVpY2VzaG9wIn0gMTA4ODAxNDQKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV91c2VkX2J5dGVze3NwYWNlPSJvbGQiLGFwcD0ianVpY2VzaG9wIn0gMTU5NTM0NjQ3Mgpub2RlanNfaGVhcF9zcGFjZV9zaXplX3VzZWRfYnl0ZXN7c3BhY2U9ImNvZGUiLGFwcD0ianVpY2VzaG9wIn0gNTEwMDQ0OApub2RlanNfaGVhcF9zcGFjZV9zaXplX3VzZWRfYnl0ZXN7c3BhY2U9InNoYXJlZCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0idHJ1c3RlZCIsYXBwPSJqdWljZXNob3AifSAzOTY5NTg0Cm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0ic2hhcmVkX3RydXN0ZWQiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3VzZWRfYnl0ZXN7c3BhY2U9Im5ld19sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX3VzZWRfYnl0ZXN7c3BhY2U9ImxhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSA3NzE1NDcyCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0iY29kZV9sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gMTc2ODAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0ic2hhcmVkX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfdXNlZF9ieXRlc3tzcGFjZT0ic2hhcmVkX3RydXN0ZWRfbGFyZ2Vfb2JqZWN0IixhcHA9Imp1aWNlc2hvcCJ9IDAKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV91c2VkX2J5dGVze3NwYWNlPSJ0cnVzdGVkX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCgojIEhFTFAgbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXMgUHJvY2VzcyBoZWFwIHNwYWNlIHNpemUgYXZhaWxhYmxlIGZyb20gTm9kZS5qcyBpbiBieXRlcy4KIyBUWVBFIG5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVzIGdhdWdlCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJyZWFkX29ubHkiLGFwcD0ianVpY2VzaG9wIn0gMApub2RlanNfaGVhcF9zcGFjZV9zaXplX2F2YWlsYWJsZV9ieXRlc3tzcGFjZT0ibmV3IixhcHA9Imp1aWNlc2hvcCJ9IDU2MjI0NjI0Cm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJvbGQiLGFwcD0ianVpY2VzaG9wIn0gMTAxNjM2OApub2RlanNfaGVhcF9zcGFjZV9zaXplX2F2YWlsYWJsZV9ieXRlc3tzcGFjZT0iY29kZSIsYXBwPSJqdWljZXNob3AifSA2NjYwMTYKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXN7c3BhY2U9InNoYXJlZCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJ0cnVzdGVkIixhcHA9Imp1aWNlc2hvcCJ9IDIxNDAyOTYKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXN7c3BhY2U9InNoYXJlZF90cnVzdGVkIixhcHA9Imp1aWNlc2hvcCJ9IDAKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXN7c3BhY2U9Im5ld19sYXJnZV9vYmplY3QiLGFwcD0ianVpY2VzaG9wIn0gNjcxMDg4NjQKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXN7c3BhY2U9ImxhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJjb2RlX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJzaGFyZWRfbGFyZ2Vfb2JqZWN0IixhcHA9Imp1aWNlc2hvcCJ9IDAKbm9kZWpzX2hlYXBfc3BhY2Vfc2l6ZV9hdmFpbGFibGVfYnl0ZXN7c3BhY2U9InNoYXJlZF90cnVzdGVkX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19oZWFwX3NwYWNlX3NpemVfYXZhaWxhYmxlX2J5dGVze3NwYWNlPSJ0cnVzdGVkX2xhcmdlX29iamVjdCIsYXBwPSJqdWljZXNob3AifSAwCgojIEhFTFAgbm9kZWpzX3ZlcnNpb25faW5mbyBOb2RlLmpzIHZlcnNpb24gaW5mby4KIyBUWVBFIG5vZGVqc192ZXJzaW9uX2luZm8gZ2F1Z2UKbm9kZWpzX3ZlcnNpb25faW5mb3t2ZXJzaW9uPSJ2MjQuMTQuMCIsbWFqb3I9IjI0IixtaW5vcj0iMTQiLHBhdGNoPSIwIixhcHA9Imp1aWNlc2hvcCJ9IDEKCiMgSEVMUCBub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kcyBHYXJiYWdlIGNvbGxlY3Rpb24gZHVyYXRpb24gYnkga2luZCwgb25lIG9mIG1ham9yLCBtaW5vciwgaW5jcmVtZW50YWwgb3Igd2Vha2NiLgojIFRZUEUgbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHMgaGlzdG9ncmFtCm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMC4wMDEiLGtpbmQ9ImluY3JlbWVudGFsIixhcHA9Imp1aWNlc2hvcCJ9IDUKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfYnVja2V0e2xlPSIwLjAxIixraW5kPSJpbmNyZW1lbnRhbCIsYXBwPSJqdWljZXNob3AifSA3Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMC4xIixraW5kPSJpbmNyZW1lbnRhbCIsYXBwPSJqdWljZXNob3AifSA3Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMSIsa2luZD0iaW5jcmVtZW50YWwiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjIiLGtpbmQ9ImluY3JlbWVudGFsIixhcHA9Imp1aWNlc2hvcCJ9IDcKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfYnVja2V0e2xlPSI1IixraW5kPSJpbmNyZW1lbnRhbCIsYXBwPSJqdWljZXNob3AifSA3Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iK0luZiIsa2luZD0iaW5jcmVtZW50YWwiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19zdW17a2luZD0iaW5jcmVtZW50YWwiLGFwcD0ianVpY2VzaG9wIn0gMC4wMDc0MjA2MjQyNTYxMzQwMzMKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfY291bnR7a2luZD0iaW5jcmVtZW50YWwiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjAuMDAxIixraW5kPSJtYWpvciIsYXBwPSJqdWljZXNob3AifSAwCm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMC4wMSIsa2luZD0ibWFqb3IiLGFwcD0ianVpY2VzaG9wIn0gNApub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjAuMSIsa2luZD0ibWFqb3IiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjEiLGtpbmQ9Im1ham9yIixhcHA9Imp1aWNlc2hvcCJ9IDcKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfYnVja2V0e2xlPSIyIixraW5kPSJtYWpvciIsYXBwPSJqdWljZXNob3AifSA3Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iNSIsa2luZD0ibWFqb3IiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IitJbmYiLGtpbmQ9Im1ham9yIixhcHA9Imp1aWNlc2hvcCJ9IDcKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfc3Vte2tpbmQ9Im1ham9yIixhcHA9Imp1aWNlc2hvcCJ9IDAuMDgxNjE1MjQ5ODcyMjA3NjQKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfY291bnR7a2luZD0ibWFqb3IiLGFwcD0ianVpY2VzaG9wIn0gNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjAuMDAxIixraW5kPSJtaW5vciIsYXBwPSJqdWljZXNob3AifSAzNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjAuMDEiLGtpbmQ9Im1pbm9yIixhcHA9Imp1aWNlc2hvcCJ9IDIzNwpub2RlanNfZ2NfZHVyYXRpb25fc2Vjb25kc19idWNrZXR7bGU9IjAuMSIsa2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMSIsa2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iMiIsa2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iNSIsa2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX2J1Y2tldHtsZT0iK0luZiIsa2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5Cm5vZGVqc19nY19kdXJhdGlvbl9zZWNvbmRzX3N1bXtraW5kPSJtaW5vciIsYXBwPSJqdWljZXNob3AifSAwLjg1MzUyOTk1MDYxODc0MzUKbm9kZWpzX2djX2R1cmF0aW9uX3NlY29uZHNfY291bnR7a2luZD0ibWlub3IiLGFwcD0ianVpY2VzaG9wIn0gMjM5CgojIEhFTFAganVpY2VzaG9wX3ZlcnNpb25faW5mbyBSZWxlYXNlIHZlcnNpb24gb2YgT1dBU1AgSnVpY2UgU2hvcC4KIyBUWVBFIGp1aWNlc2hvcF92ZXJzaW9uX2luZm8gZ2F1Z2UKanVpY2VzaG9wX3ZlcnNpb25faW5mb3t2ZXJzaW9uPSIxOS4yLjEiLG1ham9yPSIxOSIsbWlub3I9IjIiLHBhdGNoPSIxIixhcHA9Imp1aWNlc2hvcCJ9IDEKCiMgSEVMUCBqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWQgTnVtYmVyIG9mIHNvbHZlZCBjaGFsbGVuZ2VzIGdyb3VwZWQgYnkgZGlmZmljdWx0eSBhbmQgY2F0ZWdvcnkuCiMgVFlQRSBqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWQgZ2F1Z2UKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJTZW5zaXRpdmUgRGF0YSBFeHBvc3VyZSIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIzIixjYXRlZ29yeT0iWFNTIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJPYnNlcnZhYmlsaXR5IEZhaWx1cmVzIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJJbXByb3BlciBJbnB1dCBWYWxpZGF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJCcm9rZW4gQWNjZXNzIENvbnRyb2wiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9IlZ1bG5lcmFibGUgQ29tcG9uZW50cyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIzIixjYXRlZ29yeT0iQnJva2VuIEF1dGhlbnRpY2F0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjUiLGNhdGVnb3J5PSJTZWN1cml0eSB0aHJvdWdoIE9ic2N1cml0eSIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI2IixjYXRlZ29yeT0iTWlzY2VsbGFuZW91cyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIxIixjYXRlZ29yeT0iQnJva2VuIEFjY2VzcyBDb250cm9sIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjUiLGNhdGVnb3J5PSJJbnNlY3VyZSBEZXNlcmlhbGl6YXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9IkJyb2tlbiBBbnRpIEF1dG9tYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IkJyb2tlbiBBdXRoZW50aWNhdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iSW5qZWN0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJYU1MiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9IlNlbnNpdGl2ZSBEYXRhIEV4cG9zdXJlIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJYU1MiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9IkluamVjdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iQnJva2VuIEFjY2VzcyBDb250cm9sIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjUiLGNhdGVnb3J5PSJTZW5zaXRpdmUgRGF0YSBFeHBvc3VyZSIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iSW1wcm9wZXIgSW5wdXQgVmFsaWRhdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIxIixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iSW1wcm9wZXIgSW5wdXQgVmFsaWRhdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iQnJva2VuIEFudGkgQXV0b21hdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI2IixjYXRlZ29yeT0iQ3J5cHRvZ3JhcGhpYyBJc3N1ZXMiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9IkJyb2tlbiBBY2Nlc3MgQ29udHJvbCIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iU2Vuc2l0aXZlIERhdGEgRXhwb3N1cmUiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IlZ1bG5lcmFibGUgQ29tcG9uZW50cyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iT2JzZXJ2YWJpbGl0eSBGYWlsdXJlcyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iVnVsbmVyYWJsZSBDb21wb25lbnRzIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJJbmplY3Rpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9IlNlbnNpdGl2ZSBEYXRhIEV4cG9zdXJlIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJCcm9rZW4gQXV0aGVudGljYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9IlNlY3VyaXR5IE1pc2NvbmZpZ3VyYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9IkJyb2tlbiBBbnRpIEF1dG9tYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNCIsY2F0ZWdvcnk9IkNyeXB0b2dyYXBoaWMgSXNzdWVzIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjUiLGNhdGVnb3J5PSJJbmplY3Rpb24iLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9IlVudmFsaWRhdGVkIFJlZGlyZWN0cyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iQnJva2VuIEF1dGhlbnRpY2F0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJNaXNjZWxsYW5lb3VzIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJTZWN1cml0eSB0aHJvdWdoIE9ic2N1cml0eSIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iWFNTIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJJbXByb3BlciBJbnB1dCBWYWxpZGF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjYiLGNhdGVnb3J5PSJCcm9rZW4gQWNjZXNzIENvbnRyb2wiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9IkluamVjdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iTWlzY2VsbGFuZW91cyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iU2VjdXJpdHkgdGhyb3VnaCBPYnNjdXJpdHkiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9Ikluc2VjdXJlIERlc2VyaWFsaXphdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI2IixjYXRlZ29yeT0iWFNTIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJDcnlwdG9ncmFwaGljIElzc3VlcyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iVW52YWxpZGF0ZWQgUmVkaXJlY3RzIixhcHA9Imp1aWNlc2hvcCJ9IDAKanVpY2VzaG9wX2NoYWxsZW5nZXNfc29sdmVke2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJYWEUiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY2hhbGxlbmdlc19zb2x2ZWR7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IlhYRSIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIxIixjYXRlZ29yeT0iT2JzZXJ2YWJpbGl0eSBGYWlsdXJlcyIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3NvbHZlZHtkaWZmaWN1bHR5PSIzIixjYXRlZ29yeT0iTWlzY2VsbGFuZW91cyIsYXBwPSJqdWljZXNob3AifSAwCgojIEhFTFAganVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWwgVG90YWwgbnVtYmVyIG9mIGNoYWxsZW5nZXMgZ3JvdXBlZCBieSBkaWZmaWN1bHR5IGFuZCBjYXRlZ29yeS4KIyBUWVBFIGp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFsIGdhdWdlCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJTZW5zaXRpdmUgRGF0YSBFeHBvc3VyZSIsYXBwPSJqdWljZXNob3AifSA2Cmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJYU1MiLGFwcD0ianVpY2VzaG9wIn0gMgpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iT2JzZXJ2YWJpbGl0eSBGYWlsdXJlcyIsYXBwPSJqdWljZXNob3AifSAyCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJJbXByb3BlciBJbnB1dCBWYWxpZGF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDYKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMiIsY2F0ZWdvcnk9IkJyb2tlbiBBY2Nlc3MgQ29udHJvbCIsYXBwPSJqdWljZXNob3AifSAzCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjYiLGNhdGVnb3J5PSJWdWxuZXJhYmxlIENvbXBvbmVudHMiLGFwcD0ianVpY2VzaG9wIn0gMgpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIzIixjYXRlZ29yeT0iQnJva2VuIEF1dGhlbnRpY2F0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDMKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IlNlY3VyaXR5IHRocm91Z2ggT2JzY3VyaXR5IixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9Ik1pc2NlbGxhbmVvdXMiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIxIixjYXRlZ29yeT0iQnJva2VuIEFjY2VzcyBDb250cm9sIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9Ikluc2VjdXJlIERlc2VyaWFsaXphdGlvbiIsYXBwPSJqdWljZXNob3AifSAyCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJCcm9rZW4gQW50aSBBdXRvbWF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IkJyb2tlbiBBdXRoZW50aWNhdGlvbiIsYXBwPSJqdWljZXNob3AifSAzCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJJbmplY3Rpb24iLGFwcD0ianVpY2VzaG9wIn0gNQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iWFNTIixhcHA9Imp1aWNlc2hvcCJ9IDMKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9IlNlbnNpdGl2ZSBEYXRhIEV4cG9zdXJlIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9IlhTUyIsYXBwPSJqdWljZXNob3AifSAyCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJJbmplY3Rpb24iLGFwcD0ianVpY2VzaG9wIn0gMwpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJCcm9rZW4gQWNjZXNzIENvbnRyb2wiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iU2Vuc2l0aXZlIERhdGEgRXhwb3N1cmUiLGFwcD0ianVpY2VzaG9wIn0gMwpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iSW1wcm9wZXIgSW5wdXQgVmFsaWRhdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJTZWN1cml0eSBNaXNjb25maWd1cmF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNCIsY2F0ZWdvcnk9IkltcHJvcGVyIElucHV0IFZhbGlkYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMgpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iQnJva2VuIEFudGkgQXV0b21hdGlvbiIsYXBwPSJqdWljZXNob3AifSAyCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjYiLGNhdGVnb3J5PSJDcnlwdG9ncmFwaGljIElzc3VlcyIsYXBwPSJqdWljZXNob3AifSAzCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJCcm9rZW4gQWNjZXNzIENvbnRyb2wiLGFwcD0ianVpY2VzaG9wIn0gNQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iU2Vuc2l0aXZlIERhdGEgRXhwb3N1cmUiLGFwcD0ianVpY2VzaG9wIn0gNQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iVnVsbmVyYWJsZSBDb21wb25lbnRzIixhcHA9Imp1aWNlc2hvcCJ9IDUKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9Ik9ic2VydmFiaWxpdHkgRmFpbHVyZXMiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iVnVsbmVyYWJsZSBDb21wb25lbnRzIixhcHA9Imp1aWNlc2hvcCJ9IDIKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMiIsY2F0ZWdvcnk9IkluamVjdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjMiLGNhdGVnb3J5PSJTZW5zaXRpdmUgRGF0YSBFeHBvc3VyZSIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjQiLGNhdGVnb3J5PSJCcm9rZW4gQXV0aGVudGljYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMgpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI2IixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjYiLGNhdGVnb3J5PSJCcm9rZW4gQW50aSBBdXRvbWF0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNCIsY2F0ZWdvcnk9IkNyeXB0b2dyYXBoaWMgSXNzdWVzIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNSIsY2F0ZWdvcnk9IkluamVjdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJVbnZhbGlkYXRlZCBSZWRpcmVjdHMiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iQnJva2VuIEF1dGhlbnRpY2F0aW9uIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9Ik1pc2NlbGxhbmVvdXMiLGFwcD0ianVpY2VzaG9wIn0gNApqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIzIixjYXRlZ29yeT0iU2VjdXJpdHkgdGhyb3VnaCBPYnNjdXJpdHkiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iWFNTIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMSIsY2F0ZWdvcnk9IkltcHJvcGVyIElucHV0IFZhbGlkYXRpb24iLGFwcD0ianVpY2VzaG9wIn0gMwpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI2IixjYXRlZ29yeT0iQnJva2VuIEFjY2VzcyBDb250cm9sIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9IkluamVjdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjIiLGNhdGVnb3J5PSJNaXNjZWxsYW5lb3VzIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNCIsY2F0ZWdvcnk9IlNlY3VyaXR5IHRocm91Z2ggT2JzY3VyaXR5IixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iNiIsY2F0ZWdvcnk9Ikluc2VjdXJlIERlc2VyaWFsaXphdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjYiLGNhdGVnb3J5PSJYU1MiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSIyIixjYXRlZ29yeT0iQ3J5cHRvZ3JhcGhpYyBJc3N1ZXMiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI0IixjYXRlZ29yeT0iVW52YWxpZGF0ZWQgUmVkaXJlY3RzIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9IlhYRSIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjUiLGNhdGVnb3J5PSJYWEUiLGFwcD0ianVpY2VzaG9wIn0gMQpqdWljZXNob3BfY2hhbGxlbmdlc190b3RhbHtkaWZmaWN1bHR5PSI1IixjYXRlZ29yeT0iU2VjdXJpdHkgTWlzY29uZmlndXJhdGlvbiIsYXBwPSJqdWljZXNob3AifSAxCmp1aWNlc2hvcF9jaGFsbGVuZ2VzX3RvdGFse2RpZmZpY3VsdHk9IjEiLGNhdGVnb3J5PSJPYnNlcnZhYmlsaXR5IEZhaWx1cmVzIixhcHA9Imp1aWNlc2hvcCJ9IDEKanVpY2VzaG9wX2NoYWxsZW5nZXNfdG90YWx7ZGlmZmljdWx0eT0iMyIsY2F0ZWdvcnk9Ik1pc2NlbGxhbmVvdXMiLGFwcD0ianVpY2VzaG9wIn0gMQoKIyBIRUxQIGp1aWNlc2hvcF9jb2RpbmdfY2hhbGxlbmdlc19wcm9ncmVzcyBOdW1iZXIgb2YgY29kaW5nIGNoYWxsZW5nZXMgZ3JvdXBlZCBieSBwcm9ncmVzc2lvbiBwaGFzZS4KIyBUWVBFIGp1aWNlc2hvcF9jb2RpbmdfY2hhbGxlbmdlc19wcm9ncmVzcyBnYXVnZQpqdWljZXNob3BfY29kaW5nX2NoYWxsZW5nZXNfcHJvZ3Jlc3N7cGhhc2U9ImZpbmQgaXQiLGFwcD0ianVpY2VzaG9wIn0gMApqdWljZXNob3BfY29kaW5nX2NoYWxsZW5nZXNfcHJvZ3Jlc3N7cGhhc2U9ImZpeCBpdCIsYXBwPSJqdWljZXNob3AifSAwCmp1aWNlc2hvcF9jb2RpbmdfY2hhbGxlbmdlc19wcm9ncmVzc3twaGFzZT0idW5zb2x2ZWQiLGFwcD0ianVpY2VzaG9wIn0gMzEKCiMgSEVMUCBqdWljZXNob3BfY2hlYXRfc2NvcmUgT3ZlcmFsbCBwcm9iYWJpbGl0eSB0aGF0IGFueSBoYWNraW5nIG9yIGNvZGluZyBjaGFsbGVuZ2VzIHdlcmUgc29sdmVkIGJ5IGNoZWF0aW5nLgojIFRZUEUganVpY2VzaG9wX2NoZWF0X3Njb3JlIGdhdWdlCmp1aWNlc2hvcF9jaGVhdF9zY29yZXthcHA9Imp1aWNlc2hvcCJ9IDAKCiMgSEVMUCBqdWljZXNob3BfY29kaW5nX2NoYWxsZW5nZXNfYWNjdXJhY3kgT3ZlcmFsbCBhY2N1cmFjeSB3aGlsZSBzb2x2aW5nIGNvZGluZyBjaGFsbGVuZ2VzIGdyb3VwZWQgYnkgcGhhc2UuCiMgVFlQRSBqdWljZXNob3BfY29kaW5nX2NoYWxsZW5nZXNfYWNjdXJhY3kgZ2F1Z2UKanVpY2VzaG9wX2NvZGluZ19jaGFsbGVuZ2VzX2FjY3VyYWN5e3BoYXNlPSJmaW5kIGl0IixhcHA9Imp1aWNlc2hvcCJ9IE5hbgpqdWljZXNob3BfY29kaW5nX2NoYWxsZW5nZXNfYWNjdXJhY3l7cGhhc2U9ImZpeCBpdCIsYXBwPSJqdWljZXNob3AifSBOYW4KCiMgSEVMUCBqdWljZXNob3Bfb3JkZXJzX3BsYWNlZF90b3RhbCBOdW1iZXIgb2Ygb3JkZXJzIHBsYWNlZCBpbiBPV0FTUCBKdWljZSBTaG9wLgojIFRZUEUganVpY2VzaG9wX29yZGVyc19wbGFjZWRfdG90YWwgZ2F1Z2UKanVpY2VzaG9wX29yZGVyc19wbGFjZWRfdG90YWx7YXBwPSJqdWljZXNob3AifSAzCgojIEhFTFAganVpY2VzaG9wX3VzZXJzX3JlZ2lzdGVyZWQgTnVtYmVyIG9mIHJlZ2lzdGVyZWQgdXNlcnMgZ3JvdXBlZCBieSBjdXN0b21lciB0eXBlLgojIFRZUEUganVpY2VzaG9wX3VzZXJzX3JlZ2lzdGVyZWQgZ2F1Z2UKanVpY2VzaG9wX3VzZXJzX3JlZ2lzdGVyZWR7dHlwZT0ic3RhbmRhcmQiLGFwcD0ianVpY2VzaG9wIn0gOQpqdWljZXNob3BfdXNlcnNfcmVnaXN0ZXJlZHt0eXBlPSJkZWx1eGUiLGFwcD0ianVpY2VzaG9wIn0gNAoKIyBIRUxQIGp1aWNlc2hvcF91c2Vyc19yZWdpc3RlcmVkX3RvdGFsIFRvdGFsIG51bWJlciBvZiByZWdpc3RlcmVkIHVzZXJzLgojIFRZUEUganVpY2VzaG9wX3VzZXJzX3JlZ2lzdGVyZWRfdG90YWwgZ2F1Z2UKanVpY2VzaG9wX3VzZXJzX3JlZ2lzdGVyZWRfdG90YWx7YXBwPSJqdWljZXNob3AifSAyMQoKIyBIRUxQIGp1aWNlc2hvcF93YWxsZXRfYmFsYW5jZV90b3RhbCBUb3RhbCBiYWxhbmNlIG9mIGFsbCB1c2VycycgZGlnaXRhbCB3YWxsZXRzLgojIFRZUEUganVpY2VzaG9wX3dhbGxldF9iYWxhbmNlX3RvdGFsIGdhdWdlCmp1aWNlc2hvcF93YWxsZXRfYmFsYW5jZV90b3RhbHthcHA9Imp1aWNlc2hvcCJ9IDEzODg1CgojIEhFTFAganVpY2VzaG9wX3VzZXJfc29jaWFsX2ludGVyYWN0aW9ucyBOdW1iZXIgb2Ygc29jaWFsIGludGVyYWN0aW9ucyB3aXRoIHVzZXJzIGdyb3VwZWQgYnkgdHlwZS4KIyBUWVBFIGp1aWNlc2hvcF91c2VyX3NvY2lhbF9pbnRlcmFjdGlvbnMgZ2F1Z2UKanVpY2VzaG9wX3VzZXJfc29jaWFsX2ludGVyYWN0aW9uc3t0eXBlPSJyZXZpZXciLGFwcD0ianVpY2VzaG9wIn0gMjgKanVpY2VzaG9wX3VzZXJfc29jaWFsX2ludGVyYWN0aW9uc3t0eXBlPSJmZWVkYmFjayIsYXBwPSJqdWljZXNob3AifSA4Cmp1aWNlc2hvcF91c2VyX3NvY2lhbF9pbnRlcmFjdGlvbnN7dHlwZT0iY29tcGxhaW50IixhcHA9Imp1aWNlc2hvcCJ9IDEKCiMgSEVMUCBodHRwX3JlcXVlc3RzX2NvdW50IFRvdGFsIEhUVFAgcmVxdWVzdCBjb3VudCBncm91cGVkIGJ5IHN0YXR1cyBjb2RlLgojIFRZUEUgaHR0cF9yZXF1ZXN0c19jb3VudCBjb3VudGVyCmh0dHBfcmVxdWVzdHNfY291bnR7c3RhdHVzX2NvZGU9IjJYWCIsYXBwPSJqdWljZXNob3AifSAzODc4Cmh0dHBfcmVxdWVzdHNfY291bnR7c3RhdHVzX2NvZGU9IjVYWCIsYXBwPSJqdWljZXNob3AifSAxNDEKaHR0cF9yZXF1ZXN0c19jb3VudHtzdGF0dXNfY29kZT0iM1hYIixhcHA9Imp1aWNlc2hvcCJ9IDMK","response_hash":"7ae1d6f0bfeb62cbe515a0d353b0468dc2b2000b2e06031b7c32ae6643949cfa","response_time_ms":0,"response_words":1321,"has_response":true,"parameters":[{"name":"1","value":"metrics","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12}],"sent_at":"2026-04-05T05:33:08.389853Z","received_at":"2026-04-05T05:33:08.389853Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"083f28f1-4494-4084-b69f-a73e3ca7418e","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/robots.txt","url":"http://localhost:3000/robots.txt","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9yb2JvdHMudHh0IEhUVFAvMS4xDQpIb3N0OiBsb2NhbGhvc3Q6MzAwMA0KDQo=","request_hash":"88e171037784141977f0a6cf45d3273a293f00435bfda368ec87f8a9eb663324","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Access-Control-Allow-Origin":["*"],"Connection":["keep-alive"],"Content-Length":["28"],"Content-Type":["text/plain; charset=utf-8"],"Date":["Sun, 05 Apr 2026 05:32:42 GMT"],"Etag":["W/\"1c-8HgF6mNyhsSFK0pascC9uB0wjX0\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/plain; charset=utf-8","response_content_length":28,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoNCkNvbnRlbnQtTGVuZ3RoOiAyOA0KRGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMjo0MiBHTVQNCkV0YWc6IFcvIjFjLThIZ0Y2bU55aHNTRkswcGFzY0M5dUIwd2pYMCINClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04DQpGZWF0dXJlLVBvbGljeTogcGF5bWVudCAnc2VsZicNCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KWC1Db250ZW50LVR5cGUtT3B0aW9uczogbm9zbmlmZg0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpYLVJlY3J1aXRpbmc6IC8jL2pvYnMNCg0KVXNlci1hZ2VudDogKgpEaXNhbGxvdzogL2Z0cA==","response_hash":"3b497e350654f5a498cf61ca900a2f9c1dbad8c46f7048c54e7ac043eba0672b","response_time_ms":0,"response_words":35,"has_response":true,"parameters":[{"name":"1","value":"robots.txt","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":15}],"sent_at":"2026-04-05T05:33:08.389858Z","received_at":"2026-04-05T05:33:08.389857Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"4596c2b2-aa83-4648-8601-8b5535b0eeb2","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/api-docs/","url":"http://localhost:3000/api-docs/","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9hcGktZG9jcy8gSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"7c764156f305a42886b5c630ae0d1b2c7c2cf8c5177fe2468ef723152c7f2c5b","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Access-Control-Allow-Origin":["*"],"Connection":["keep-alive"],"Content-Type":["text/html; charset=utf-8"],"Date":["Sun, 05 Apr 2026 05:32:45 GMT"],"Etag":["W/\"c22-H8FH9nKD8DeX/nvIRrte6ZjP2a4\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=utf-8","response_content_length":3106,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoNCkNvbm5lY3Rpb246IGtlZXAtYWxpdmUNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgNCkRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzI6NDUgR01UDQpFdGFnOiBXLyJjMjItSDhGSDluS0Q4RGVYL252SVJydGU2WmpQMmE0Ig0KRmVhdHVyZS1Qb2xpY3k6IHBheW1lbnQgJ3NlbGYnDQpLZWVwLUFsaXZlOiB0aW1lb3V0PTUNClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNClgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTg0KWC1SZWNydWl0aW5nOiAvIy9qb2JzDQoNCgo8IS0tIEhUTUwgZm9yIHN0YXRpYyBkaXN0cmlidXRpb24gYnVuZGxlIGJ1aWxkIC0tPgo8IURPQ1RZUEUgaHRtbD4KPGh0bWwgbGFuZz0iZW4iPgo8aGVhZD4KICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgCiAgPHRpdGxlPlN3YWdnZXIgVUk8L3RpdGxlPgogIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vc3dhZ2dlci11aS5jc3MiID4KICA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3BuZyIgaHJlZj0iLi9mYXZpY29uLTMyeDMyLnBuZyIgc2l6ZXM9IjMyeDMyIiAvPjxsaW5rIHJlbD0iaWNvbiIgdHlwZT0iaW1hZ2UvcG5nIiBocmVmPSIuL2Zhdmljb24tMTZ4MTYucG5nIiBzaXplcz0iMTZ4MTYiIC8+CiAgPHN0eWxlPgogICAgaHRtbAogICAgewogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBvdmVyZmxvdzogLW1vei1zY3JvbGxiYXJzLXZlcnRpY2FsOwogICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICB9CiAgICAqLAogICAgKjpiZWZvcmUsCiAgICAqOmFmdGVyCiAgICB7CiAgICAgIGJveC1zaXppbmc6IGluaGVyaXQ7CiAgICB9CgogICAgYm9keSB7CiAgICAgIG1hcmdpbjowOwogICAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhOwogICAgfQogIDwvc3R5bGU+CjwvaGVhZD4KCjxib2R5PgoKPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MDtoZWlnaHQ6MCI+CiAgPGRlZnM+CiAgICA8c3ltYm9sIHZpZXdCb3g9IjAgMCAyMCAyMCIgaWQ9InVubG9ja2VkIj4KICAgICAgPHBhdGggZD0iTTE1LjggOEgxNFY1LjZDMTQgMi43MDMgMTIuNjY1IDEgMTAgMSA3LjMzNCAxIDYgMi43MDMgNiA1LjZWNmgydi0uODAxQzggMy43NTQgOC43OTcgMyAxMCAzYzEuMjAzIDAgMiAuNzU0IDIgMi4xOTlWOEg0Yy0uNTUzIDAtMSAuNjQ2LTEgMS4xOTlWMTdjMCAuNTQ5LjQyOCAxLjEzOS45NTEgMS4zMDdsMS4xOTcuMzg3QzUuNjcyIDE4Ljg2MSA2LjU1IDE5IDcuMSAxOWg1LjhjLjU0OSAwIDEuNDI4LS4xMzkgMS45NTEtLjMwN2wxLjE5Ni0uMzg3Yy41MjQtLjE2Ny45NTMtLjc1Ny45NTMtMS4zMDZWOS4xOTlDMTcgOC42NDYgMTYuMzUyIDggMTUuOCA4eiI+PC9wYXRoPgogICAgPC9zeW1ib2w+CgogICAgPHN5bWJvbCB2aWV3Qm94PSIwIDAgMjAgMjAiIGlkPSJsb2NrZWQiPgogICAgICA8cGF0aCBkPSJNMTUuOCA4SDE0VjUuNkMxNCAyLjcwMyAxMi42NjUgMSAxMCAxIDcuMzM0IDEgNiAyLjcwMyA2IDUuNlY4SDRjLS41NTMgMC0xIC42NDYtMSAxLjE5OVYxN2MwIC41NDkuNDI4IDEuMTM5Ljk1MSAxLjMwN2wxLjE5Ny4zODdDNS42NzIgMTguODYxIDYuNTUgMTkgNy4xIDE5aDUuOGMuNTQ5IDAgMS40MjgtLjEzOSAxLjk1MS0uMzA3bDEuMTk2LS4zODdjLjUyNC0uMTY3Ljk1My0uNzU3Ljk1My0xLjMwNlY5LjE5OUMxNyA4LjY0NiAxNi4zNTIgOCAxNS44IDh6TTEyIDhIOFY1LjE5OUM4IDMuNzU0IDguNzk3IDMgMTAgM2MxLjIwMyAwIDIgLjc1NCAyIDIuMTk5Vjh6Ii8+CiAgICA8L3N5bWJvbD4KCiAgICA8c3ltYm9sIHZpZXdCb3g9IjAgMCAyMCAyMCIgaWQ9ImNsb3NlIj4KICAgICAgPHBhdGggZD0iTTE0LjM0OCAxNC44NDljLS40NjkuNDY5LTEuMjI5LjQ2OS0xLjY5NyAwTDEwIDExLjgxOWwtMi42NTEgMy4wMjljLS40NjkuNDY5LTEuMjI5LjQ2OS0xLjY5NyAwLS40NjktLjQ2OS0uNDY5LTEuMjI5IDAtMS42OTdsMi43NTgtMy4xNS0yLjc1OS0zLjE1MmMtLjQ2OS0uNDY5LS40NjktMS4yMjggMC0xLjY5Ny40NjktLjQ2OSAxLjIyOC0uNDY5IDEuNjk3IDBMMTAgOC4xODNsMi42NTEtMy4wMzFjLjQ2OS0uNDY5IDEuMjI4LS40NjkgMS42OTcgMCAuNDY5LjQ2OS40NjkgMS4yMjkgMCAxLjY5N2wtMi43NTggMy4xNTIgMi43NTggMy4xNWMuNDY5LjQ2OS40NjkgMS4yMjkgMCAxLjY5OHoiLz4KICAgIDwvc3ltYm9sPgoKICAgIDxzeW1ib2wgdmlld0JveD0iMCAwIDIwIDIwIiBpZD0ibGFyZ2UtYXJyb3ciPgogICAgICA8cGF0aCBkPSJNMTMuMjUgMTBMNi4xMDkgMi41OGMtLjI2OC0uMjctLjI2OC0uNzA3IDAtLjk3OS4yNjgtLjI3LjcwMS0uMjcuOTY5IDBsNy44MyA3LjkwOGMuMjY4LjI3MS4yNjguNzA5IDAgLjk3OWwtNy44MyA3LjkwOGMtLjI2OC4yNzEtLjcwMS4yNy0uOTY5IDAtLjI2OC0uMjY5LS4yNjgtLjcwNyAwLS45NzlMMTMuMjUgMTB6Ii8+CiAgICA8L3N5bWJvbD4KCiAgICA8c3ltYm9sIHZpZXdCb3g9IjAgMCAyMCAyMCIgaWQ9ImxhcmdlLWFycm93LWRvd24iPgogICAgICA8cGF0aCBkPSJNMTcuNDE4IDYuMTA5Yy4yNzItLjI2OC43MDktLjI2OC45NzkgMHMuMjcxLjcwMSAwIC45NjlsLTcuOTA4IDcuODNjLS4yNy4yNjgtLjcwNy4yNjgtLjk3OSAwbC03LjkwOC03LjgzYy0uMjctLjI2OC0uMjctLjcwMSAwLS45NjkuMjcxLS4yNjguNzA5LS4yNjguOTc5IDBMMTAgMTMuMjVsNy40MTgtNy4xNDF6Ii8+CiAgICA8L3N5bWJvbD4KCgogICAgPHN5bWJvbCB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJqdW1wLXRvIj4KICAgICAgPHBhdGggZD0iTTE5IDd2NEg1LjgzbDMuNTgtMy41OUw4IDZsLTYgNiA2IDYgMS40MS0xLjQxTDUuODMgMTNIMjFWN3oiLz4KICAgIDwvc3ltYm9sPgoKICAgIDxzeW1ib2wgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iZXhwYW5kIj4KICAgICAgPHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIvPgogICAgPC9zeW1ib2w+CgogIDwvZGVmcz4KPC9zdmc+Cgo8ZGl2IGlkPSJzd2FnZ2VyLXVpIj48L2Rpdj4KCjxzY3JpcHQgc3JjPSIuL3N3YWdnZXItdWktYnVuZGxlLmpzIj4gPC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuL3N3YWdnZXItdWktc3RhbmRhbG9uZS1wcmVzZXQuanMiPiA8L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4vc3dhZ2dlci11aS1pbml0LmpzIj4gPC9zY3JpcHQ+CgoKCjxzdHlsZT4KICAuc3dhZ2dlci11aSAudG9wYmFyIC5kb3dubG9hZC11cmwtd3JhcHBlciB7IGRpc3BsYXk6IG5vbmUgfSB1bmRlZmluZWQKPC9zdHlsZT4KPC9ib2R5PgoKPC9odG1sPgo=","response_hash":"593d1eab5094a0d9660cb05e62657cc3804755bb975e908f644a9ac85442dcff","response_time_ms":0,"response_words":318,"has_response":true,"response_title":"Swagger UI","parameters":[{"name":"1","value":"api-docs","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":13}],"sent_at":"2026-04-05T05:33:08.389897Z","received_at":"2026-04-05T05:33:08.389897Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"d2c6d6d0-8f20-4337-9f83-a0297762a12e","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/api-docs/swagger-ui-init.js","url":"http://localhost:3000/api-docs/swagger-ui-init.js","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9hcGktZG9jcy9zd2FnZ2VyLXVpLWluaXQuanMgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"dc98c2660cdd8e7f102c26fe945fe5e171b5608581d165d95f4715c9e3af4d61","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Access-Control-Allow-Origin":["*"],"Connection":["keep-alive"],"Content-Type":["application/javascript; charset=utf-8"],"Date":["Sun, 05 Apr 2026 05:32:46 GMT"],"Etag":["W/\"1551-9fDqyGf7xN37NQs+1pPTJ0h2bOE\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"application/javascript; charset=utf-8","response_content_length":5457,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjQ2IEdNVA0KRmVhdHVyZS1Qb2xpY3k6IHBheW1lbnQgJ3NlbGYnDQpYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBub3NuaWZmDQpYLUZyYW1lLU9wdGlvbnM6IFNBTUVPUklHSU4NClgtUmVjcnVpdGluZzogLyMvam9icw0KQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgNCkV0YWc6IFcvIjE1NTEtOWZEcXlHZjd4TjM3TlFzKzFwUFRKMGgyYk9FIg0KS2VlcC1BbGl2ZTogdGltZW91dD01DQpWYXJ5OiBBY2NlcHQtRW5jb2RpbmcNCg0KCndpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAvLyBCdWlsZCBhIHN5c3RlbQogIHZhciB1cmwgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLm1hdGNoKC91cmw9KFteJl0rKS8pOwogIGlmICh1cmwgJiYgdXJsLmxlbmd0aCA+IDEpIHsKICAgIHVybCA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmxbMV0pOwogIH0gZWxzZSB7CiAgICB1cmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luOwogIH0KICB2YXIgb3B0aW9ucyA9IHsKICAic3dhZ2dlckRvYyI6IHsKICAgICJvcGVuYXBpIjogIjMuMC4wIiwKICAgICJzZXJ2ZXJzIjogWwogICAgICB7CiAgICAgICAgInVybCI6ICIvYjJiL3YyIgogICAgICB9CiAgICBdLAogICAgImluZm8iOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKICAgICAgInRpdGxlIjogIk5leHRHZW4gQjJCIEFQSSIsCiAgICAgICJkZXNjcmlwdGlvbiI6ICJOZXcgJiBzZWN1cmUgSlNPTi1iYXNlZCBBUEkgZm9yIG91ciBlbnRlcnByaXNlIGN1c3RvbWVycy4gKERlcHJlY2F0ZXMgcHJldmlvdXNseSBvZmZlcmVkIFhNTC1iYXNlZCBlbmRwb2ludHMpIiwKICAgICAgImxpY2Vuc2UiOiB7CiAgICAgICAgIm5hbWUiOiAiTUlUIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUIgogICAgICB9LAogICAgICAiY29udGFjdCI6IHsKICAgICAgICAibmFtZSI6ICJCMkIgQVBJIFN1cHBvcnQiCiAgICAgIH0KICAgIH0sCiAgICAidGFncyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogIk9yZGVyIiwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiQVBJIGZvciBjdXN0b21lciBvcmRlcnMiCiAgICAgIH0KICAgIF0sCiAgICAicGF0aHMiOiB7CiAgICAgICIvb3JkZXJzIjogewogICAgICAgICJwb3N0IjogewogICAgICAgICAgIm9wZXJhdGlvbklkIjogImNyZWF0ZUN1c3RvbWVyT3JkZXIiLAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgICJPcmRlciIKICAgICAgICAgIF0sCiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ3JlYXRlIG5ldyBjdXN0b21lciBvcmRlciIsCiAgICAgICAgICAicmVzcG9uc2VzIjogewogICAgICAgICAgICAiMjAwIjogewogICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJOZXcgY3VzdG9tZXIgb3JkZXIgaXMgY3JlYXRlZCIsCiAgICAgICAgICAgICAgImNvbnRlbnQiOiB7CiAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiI6IHsKICAgICAgICAgICAgICAgICAgInNjaGVtYSI6IHsKICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9PcmRlckNvbmZpcm1hdGlvbiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJyZXF1ZXN0Qm9keSI6IHsKICAgICAgICAgICAgImNvbnRlbnQiOiB7CiAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL2pzb24iOiB7CiAgICAgICAgICAgICAgICAic2NoZW1hIjogewogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2NvbXBvbmVudHMvc2NoZW1hcy9PcmRlciIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDdXN0b21lciBvcmRlciB0byBiZSBwbGFjZWQiCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgImNvbXBvbmVudHMiOiB7CiAgICAgICJzZWN1cml0eVNjaGVtZXMiOiB7CiAgICAgICAgImJlYXJlckF1dGgiOiB7CiAgICAgICAgICAidHlwZSI6ICJodHRwIiwKICAgICAgICAgICJzY2hlbWUiOiAiYmVhcmVyIiwKICAgICAgICAgICJiZWFyZXJGb3JtYXQiOiAiSldUIgogICAgICAgIH0KICAgICAgfSwKICAgICAgInNjaGVtYXMiOiB7CiAgICAgICAgIk9yZGVyIjogewogICAgICAgICAgInJlcXVpcmVkIjogWwogICAgICAgICAgICAiY2lkIgogICAgICAgICAgXSwKICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAiY2lkIjogewogICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogdHJ1ZSwKICAgICAgICAgICAgICAiZXhhbXBsZSI6ICJKUzA4MTVERSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9yZGVyTGluZXMiOiB7CiAgICAgICAgICAgICAgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvT3JkZXJMaW5lcyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9yZGVyTGluZXNEYXRhIjogewogICAgICAgICAgICAgICIkcmVmIjogIiMvY29tcG9uZW50cy9zY2hlbWFzL09yZGVyTGluZXNEYXRhIgogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiT3JkZXJDb25maXJtYXRpb24iOiB7CiAgICAgICAgICAicmVxdWlyZWQiOiBbCiAgICAgICAgICAgICJjaWQiLAogICAgICAgICAgICAib3JkZXJObyIsCiAgICAgICAgICAgICJwYXltZW50RHVlIgogICAgICAgICAgXSwKICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAiY2lkIjogewogICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogdHJ1ZSwKICAgICAgICAgICAgICAiZXhhbXBsZSI6ICJKUzA4MTVERSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm9yZGVyTm8iOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAidW5pcXVlSXRlbXMiOiB0cnVlLAogICAgICAgICAgICAgICJleGFtcGxlIjogIjNkMDZhYzVlMWJkZjM5ZDI2MzkyZjgxMDBmMTI0NzQyIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicGF5bWVudER1ZSI6IHsKICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWxsIHBheW1lbnRzIGFyZSBkdWUgMTQgZGF5cyBhZnRlciBvcmRlciBwbGFjZW1lbnQiLAogICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgImZvcm1hdCI6ICJkYXRlIiwKICAgICAgICAgICAgICAiZXhhbXBsZSI6ICIyMDE4LTAxLTE5IgogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiT3JkZXJMaW5lIjogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9yZGVyIGxpbmUgaW4gZGVmYXVsdCBKU09OIGZvcm1hdCIsCiAgICAgICAgICAicmVxdWlyZWQiOiBbCiAgICAgICAgICAgICJwcm9kdWN0SWQiLAogICAgICAgICAgICAicXVhbnRpdHkiCiAgICAgICAgICBdLAogICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICJwcm9kdWN0SWQiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgImV4YW1wbGUiOiA4CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJxdWFudGl0eSI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAibWluaW11bSI6IDEsCiAgICAgICAgICAgICAgImV4YW1wbGUiOiA1MDAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImN1c3RvbWVyUmVmZXJlbmNlIjogewogICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgImV4YW1wbGUiOiAiUE8wMDAwMDAxIgogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiT3JkZXJMaW5lcyI6IHsKICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvT3JkZXJMaW5lIgogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgIk9yZGVyTGluZXNEYXRhIjogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9yZGVyIGxpbmUocykgaW4gY3VzdG9tZXIgc3BlY2lmaWMgSlNPTiBmb3JtYXQiLAogICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICJleGFtcGxlIjogIlt7XCJwcm9kdWN0SWRcIjogMTIsXCJxdWFudGl0eVwiOiAxMDAwMCxcImN1c3RvbWVyUmVmZXJlbmNlXCI6IFtcIlBPMDAwMDAwMS4yXCIsIFwiU00yMDE4MDEwNXwwNDJcIl0sXCJjb3Vwb25Db2RlXCI6IFwicGVzW0JoLnUqdFwifSx7XCJwcm9kdWN0SWRcIjogMTMsXCJxdWFudGl0eVwiOiAyMDAwLFwiY3VzdG9tZXJSZWZlcmVuY2VcIjogXCJQTzAwMDAwMDMuNFwifV0iCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgInNlY3VyaXR5IjogWwogICAgICB7CiAgICAgICAgImJlYXJlckF1dGgiOiBbXQogICAgICB9CiAgICBdCiAgfSwKICAiY3VzdG9tT3B0aW9ucyI6IHt9Cn07CiAgdXJsID0gb3B0aW9ucy5zd2FnZ2VyVXJsIHx8IHVybAogIHZhciB1cmxzID0gb3B0aW9ucy5zd2FnZ2VyVXJscwogIHZhciBjdXN0b21PcHRpb25zID0gb3B0aW9ucy5jdXN0b21PcHRpb25zCiAgdmFyIHNwZWMxID0gb3B0aW9ucy5zd2FnZ2VyRG9jCiAgdmFyIHN3YWdnZXJPcHRpb25zID0gewogICAgc3BlYzogc3BlYzEsCiAgICB1cmw6IHVybCwKICAgIHVybHM6IHVybHMsCiAgICBkb21faWQ6ICcjc3dhZ2dlci11aScsCiAgICBkZWVwTGlua2luZzogdHJ1ZSwKICAgIHByZXNldHM6IFsKICAgICAgU3dhZ2dlclVJQnVuZGxlLnByZXNldHMuYXBpcywKICAgICAgU3dhZ2dlclVJU3RhbmRhbG9uZVByZXNldAogICAgXSwKICAgIHBsdWdpbnM6IFsKICAgICAgU3dhZ2dlclVJQnVuZGxlLnBsdWdpbnMuRG93bmxvYWRVcmwKICAgIF0sCiAgICBsYXlvdXQ6ICJTdGFuZGFsb25lTGF5b3V0IgogIH0KICBmb3IgKHZhciBhdHRybmFtZSBpbiBjdXN0b21PcHRpb25zKSB7CiAgICBzd2FnZ2VyT3B0aW9uc1thdHRybmFtZV0gPSBjdXN0b21PcHRpb25zW2F0dHJuYW1lXTsKICB9CiAgdmFyIHVpID0gU3dhZ2dlclVJQnVuZGxlKHN3YWdnZXJPcHRpb25zKQoKICBpZiAoY3VzdG9tT3B0aW9ucy5vYXV0aCkgewogICAgdWkuaW5pdE9BdXRoKGN1c3RvbU9wdGlvbnMub2F1dGgpCiAgfQoKICBpZiAoY3VzdG9tT3B0aW9ucy5wcmVhdXRob3JpemVBcGlLZXkpIHsKICAgIGNvbnN0IGtleSA9IGN1c3RvbU9wdGlvbnMucHJlYXV0aG9yaXplQXBpS2V5LmF1dGhEZWZpbml0aW9uS2V5OwogICAgY29uc3QgdmFsdWUgPSBjdXN0b21PcHRpb25zLnByZWF1dGhvcml6ZUFwaUtleS5hcGlLZXlWYWx1ZTsKICAgIGlmICghIWtleSAmJiAhIXZhbHVlKSB7CiAgICAgIGNvbnN0IHBpZCA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICBjb25zdCBhdXRob3JpemVkID0gdWkucHJlYXV0aG9yaXplQXBpS2V5KGtleSwgdmFsdWUpOwogICAgICAgIGlmKCEhYXV0aG9yaXplZCkgY2xlYXJJbnRlcnZhbChwaWQpOwogICAgICB9LCA1MDApCgogICAgfQogIH0KCiAgaWYgKGN1c3RvbU9wdGlvbnMuYXV0aEFjdGlvbikgewogICAgdWkuYXV0aEFjdGlvbnMuYXV0aG9yaXplKGN1c3RvbU9wdGlvbnMuYXV0aEFjdGlvbikKICB9CgogIHdpbmRvdy51aSA9IHVpCn0K","response_hash":"69ec440566060e19806f4dc3774d9c89af52444e42efd72108b0aa902cb44138","response_time_ms":0,"response_words":471,"has_response":true,"parameters":[{"name":"1","value":"api-docs","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":13},{"name":"2","value":"swagger-ui-init.js","type":"path","name_start":-1,"name_end":-1,"value_start":14,"value_end":32}],"sent_at":"2026-04-05T05:33:08.389913Z","received_at":"2026-04-05T05:33:08.389912Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"1e55544a-3569-4300-b935-75d1f43d73f6","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/api-docs/swagger-ui-standalone-preset.js","url":"http://localhost:3000/api-docs/swagger-ui-standalone-preset.js","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9hcGktZG9jcy9zd2FnZ2VyLXVpLXN0YW5kYWxvbmUtcHJlc2V0LmpzIEhUVFAvMS4xDQpIb3N0OiBsb2NhbGhvc3Q6MzAwMA0KDQo=","request_hash":"5406e2cbc432686a28893b675fc0aefd861b727db0e11ba102886f45e99f2399","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["application/javascript; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:46 GMT"],"Etag":["W/\"3d731-19cc8812200\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sat, 07 Mar 2026 13:33:52 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"application/javascript; charset=UTF-8","response_content_length":251697,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpLZWVwLUFsaXZlOiB0aW1lb3V0PTUNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpYLVJlY3J1aXRpbmc6IC8jL2pvYnMNCkFjY2VwdC1SYW5nZXM6IGJ5dGVzDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9VVRGLTgNCkRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzI6NDYgR01UDQpFdGFnOiBXLyIzZDczMS0xOWNjODgxMjIwMCINCkxhc3QtTW9kaWZpZWQ6IFNhdCwgMDcgTWFyIDIwMjYgMTM6MzM6NTIgR01UDQpYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBub3NuaWZmDQpBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoNCkNhY2hlLUNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0wDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpGZWF0dXJlLVBvbGljeTogcGF5bWVudCAnc2VsZicNCg0KLyohIEZvciBsaWNlbnNlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgc3dhZ2dlci11aS1zdGFuZGFsb25lLXByZXNldC5qcy5MSUNFTlNFLnR4dCAqLwohZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWUoKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSxlKToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5Td2FnZ2VyVUlTdGFuZGFsb25lUHJlc2V0PWUoKTp0LlN3YWdnZXJVSVN0YW5kYWxvbmVQcmVzZXQ9ZSgpfSh0aGlzLCgoKT0+KCgpPT57dmFyIHQ9ezc1MjYodCxlKXsidXNlIHN0cmljdCI7ZS5ieXRlTGVuZ3RoPWZ1bmN0aW9uIGJ5dGVMZW5ndGgodCl7dmFyIGU9Z2V0TGVucyh0KSxyPWVbMF0sbj1lWzFdO3JldHVybiAzKihyK24pLzQtbn0sZS50b0J5dGVBcnJheT1mdW5jdGlvbiB0b0J5dGVBcnJheSh0KXt2YXIgZSxyLGk9Z2V0TGVucyh0KSxhPWlbMF0scz1pWzFdLHU9bmV3IG8oZnVuY3Rpb24gX2J5dGVMZW5ndGgodCxlLHIpe3JldHVybiAzKihlK3IpLzQtcn0oMCxhLHMpKSxjPTAsZj1zPjA/YS00OmE7Zm9yKHI9MDtyPGY7cis9NCllPW5bdC5jaGFyQ29kZUF0KHIpXTw8MTh8blt0LmNoYXJDb2RlQXQocisxKV08PDEyfG5bdC5jaGFyQ29kZUF0KHIrMildPDw2fG5bdC5jaGFyQ29kZUF0KHIrMyldLHVbYysrXT1lPj4xNiYyNTUsdVtjKytdPWU+PjgmMjU1LHVbYysrXT0yNTUmZTsyPT09cyYmKGU9blt0LmNoYXJDb2RlQXQocildPDwyfG5bdC5jaGFyQ29kZUF0KHIrMSldPj40LHVbYysrXT0yNTUmZSk7MT09PXMmJihlPW5bdC5jaGFyQ29kZUF0KHIpXTw8MTB8blt0LmNoYXJDb2RlQXQocisxKV08PDR8blt0LmNoYXJDb2RlQXQocisyKV0+PjIsdVtjKytdPWU+PjgmMjU1LHVbYysrXT0yNTUmZSk7cmV0dXJuIHV9LGUuZnJvbUJ5dGVBcnJheT1mdW5jdGlvbiBmcm9tQnl0ZUFycmF5KHQpe2Zvcih2YXIgZSxuPXQubGVuZ3RoLG89biUzLGk9W10sYT0xNjM4MyxzPTAsdT1uLW87czx1O3MrPWEpaS5wdXNoKGVuY29kZUNodW5rKHQscyxzK2E+dT91OnMrYSkpOzE9PT1vPyhlPXRbbi0xXSxpLnB1c2gocltlPj4yXStyW2U8PDQmNjNdKyI9PSIpKToyPT09byYmKGU9KHRbbi0yXTw8OCkrdFtuLTFdLGkucHVzaChyW2U+PjEwXStyW2U+PjQmNjNdK3JbZTw8MiY2M10rIj0iKSk7cmV0dXJuIGkuam9pbigiIil9O2Zvcih2YXIgcj1bXSxuPVtdLG89InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksaT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsYT0wO2E8NjQ7KythKXJbYV09aVthXSxuW2kuY2hhckNvZGVBdChhKV09YTtmdW5jdGlvbiBnZXRMZW5zKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGUlND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO3ZhciByPXQuaW5kZXhPZigiPSIpO3JldHVybi0xPT09ciYmKHI9ZSksW3Iscj09PWU/MDo0LXIlNF19ZnVuY3Rpb24gZW5jb2RlQ2h1bmsodCxlLG4pe2Zvcih2YXIgbyxpLGE9W10scz1lO3M8bjtzKz0zKW89KHRbc108PDE2JjE2NzExNjgwKSsodFtzKzFdPDw4JjY1MjgwKSsoMjU1JnRbcysyXSksYS5wdXNoKHJbKGk9byk+PjE4JjYzXStyW2k+PjEyJjYzXStyW2k+PjYmNjNdK3JbNjMmaV0pO3JldHVybiBhLmpvaW4oIiIpfW5bIi0iLmNoYXJDb2RlQXQoMCldPTYyLG5bIl8iLmNoYXJDb2RlQXQoMCldPTYzfSw4Mjg3KHQsZSxyKXsidXNlIHN0cmljdCI7Y29uc3Qgbj1yKDc1MjYpLG89cigyNTEpLGk9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbC5mb3I/U3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKTpudWxsO2UuQnVmZmVyPUJ1ZmZlcixlLlNsb3dCdWZmZXI9ZnVuY3Rpb24gU2xvd0J1ZmZlcih0KXsrdCE9dCYmKHQ9MCk7cmV0dXJuIEJ1ZmZlci5hbGxvYygrdCl9LGUuSU5TUEVDVF9NQVhfQllURVM9NTA7Y29uc3QgYT0yMTQ3NDgzNjQ3O2Z1bmN0aW9uIGNyZWF0ZUJ1ZmZlcih0KXtpZih0PmEpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSAiJyt0KyciIGlzIGludmFsaWQgZm9yIG9wdGlvbiAic2l6ZSInKTtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YoZSxCdWZmZXIucHJvdG90eXBlKSxlfWZ1bmN0aW9uIEJ1ZmZlcih0LGUscil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJzdHJpbmciIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJyk7cmV0dXJuIGFsbG9jVW5zYWZlKHQpfXJldHVybiBmcm9tKHQsZSxyKX1mdW5jdGlvbiBmcm9tKHQsZSxyKXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGZ1bmN0aW9uIGZyb21TdHJpbmcodCxlKXsic3RyaW5nIj09dHlwZW9mIGUmJiIiIT09ZXx8KGU9InV0ZjgiKTtpZighQnVmZmVyLmlzRW5jb2RpbmcoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitlKTtjb25zdCByPTB8Ynl0ZUxlbmd0aCh0LGUpO2xldCBuPWNyZWF0ZUJ1ZmZlcihyKTtjb25zdCBvPW4ud3JpdGUodCxlKTtvIT09ciYmKG49bi5zbGljZSgwLG8pKTtyZXR1cm4gbn0odCxlKTtpZihBcnJheUJ1ZmZlci5pc1ZpZXcodCkpcmV0dXJuIGZ1bmN0aW9uIGZyb21BcnJheVZpZXcodCl7aWYoaXNJbnN0YW5jZSh0LFVpbnQ4QXJyYXkpKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KHQpO3JldHVybiBmcm9tQXJyYXlCdWZmZXIoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCl9cmV0dXJuIGZyb21BcnJheUxpa2UodCl9KHQpO2lmKG51bGw9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgIit0eXBlb2YgdCk7aWYoaXNJbnN0YW5jZSh0LEFycmF5QnVmZmVyKXx8dCYmaXNJbnN0YW5jZSh0LmJ1ZmZlcixBcnJheUJ1ZmZlcikpcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0LGUscik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciYmKGlzSW5zdGFuY2UodCxTaGFyZWRBcnJheUJ1ZmZlcil8fHQmJmlzSW5zdGFuY2UodC5idWZmZXIsU2hhcmVkQXJyYXlCdWZmZXIpKSlyZXR1cm4gZnJvbUFycmF5QnVmZmVyKHQsZSxyKTtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJyk7Y29uc3Qgbj10LnZhbHVlT2YmJnQudmFsdWVPZigpO2lmKG51bGwhPW4mJm4hPT10KXJldHVybiBCdWZmZXIuZnJvbShuLGUscik7Y29uc3Qgbz1mdW5jdGlvbiBmcm9tT2JqZWN0KHQpe2lmKEJ1ZmZlci5pc0J1ZmZlcih0KSl7Y29uc3QgZT0wfGNoZWNrZWQodC5sZW5ndGgpLHI9Y3JlYXRlQnVmZmVyKGUpO3JldHVybiAwPT09ci5sZW5ndGh8fHQuY29weShyLDAsMCxlKSxyfWlmKHZvaWQgMCE9PXQubGVuZ3RoKXJldHVybiJudW1iZXIiIT10eXBlb2YgdC5sZW5ndGh8fG51bWJlcklzTmFOKHQubGVuZ3RoKT9jcmVhdGVCdWZmZXIoMCk6ZnJvbUFycmF5TGlrZSh0KTtpZigiQnVmZmVyIj09PXQudHlwZSYmQXJyYXkuaXNBcnJheSh0LmRhdGEpKXJldHVybiBmcm9tQXJyYXlMaWtlKHQuZGF0YSl9KHQpO2lmKG8pcmV0dXJuIG87aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm51bGwhPVN5bWJvbC50b1ByaW1pdGl2ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRbU3ltYm9sLnRvUHJpbWl0aXZlXSlyZXR1cm4gQnVmZmVyLmZyb20odFtTeW1ib2wudG9QcmltaXRpdmVdKCJzdHJpbmciKSxlLHIpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICIrdHlwZW9mIHQpfWZ1bmN0aW9uIGFzc2VydFNpemUodCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJyk7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgIicrdCsnIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gInNpemUiJyl9ZnVuY3Rpb24gYWxsb2NVbnNhZmUodCl7cmV0dXJuIGFzc2VydFNpemUodCksY3JlYXRlQnVmZmVyKHQ8MD8wOjB8Y2hlY2tlZCh0KSl9ZnVuY3Rpb24gZnJvbUFycmF5TGlrZSh0KXtjb25zdCBlPXQubGVuZ3RoPDA/MDowfGNoZWNrZWQodC5sZW5ndGgpLHI9Y3JlYXRlQnVmZmVyKGUpO2ZvcihsZXQgbj0wO248ZTtuKz0xKXJbbl09MjU1JnRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyKHQsZSxyKXtpZihlPDB8fHQuYnl0ZUxlbmd0aDxlKXRocm93IG5ldyBSYW5nZUVycm9yKCcib2Zmc2V0IiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTtpZih0LmJ5dGVMZW5ndGg8ZSsocnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJsZW5ndGgiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO2xldCBuO3JldHVybiBuPXZvaWQgMD09PWUmJnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCk6dm9pZCAwPT09cj9uZXcgVWludDhBcnJheSh0LGUpOm5ldyBVaW50OEFycmF5KHQsZSxyKSxPYmplY3Quc2V0UHJvdG90eXBlT2YobixCdWZmZXIucHJvdG90eXBlKSxufWZ1bmN0aW9uIGNoZWNrZWQodCl7aWYodD49YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrYS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfHR9ZnVuY3Rpb24gYnl0ZUxlbmd0aCh0LGUpe2lmKEJ1ZmZlci5pc0J1ZmZlcih0KSlyZXR1cm4gdC5sZW5ndGg7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHxpc0luc3RhbmNlKHQsQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAic3RyaW5nIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiB0KTtjb25zdCByPXQubGVuZ3RoLG49YXJndW1lbnRzLmxlbmd0aD4yJiYhMD09PWFyZ3VtZW50c1syXTtpZighbiYmMD09PXIpcmV0dXJuIDA7bGV0IG89ITE7Zm9yKDs7KXN3aXRjaChlKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIHV0ZjhUb0J5dGVzKHQpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqcjtjYXNlImhleCI6cmV0dXJuIHI+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gYmFzZTY0VG9CeXRlcyh0KS5sZW5ndGg7ZGVmYXVsdDppZihvKXJldHVybiBuPy0xOnV0ZjhUb0J5dGVzKHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLG89ITB9fWZ1bmN0aW9uIHNsb3dUb1N0cmluZyh0LGUscil7bGV0IG49ITE7aWYoKHZvaWQgMD09PWV8fGU8MCkmJihlPTApLGU+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KGU+Pj49MCkpcmV0dXJuIiI7Zm9yKHR8fCh0PSJ1dGY4Iik7Oylzd2l0Y2godCl7Y2FzZSJoZXgiOnJldHVybiBoZXhTbGljZSh0aGlzLGUscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gdXRmOFNsaWNlKHRoaXMsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4gYXNjaWlTbGljZSh0aGlzLGUscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbGF0aW4xU2xpY2UodGhpcyxlLHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gYmFzZTY0U2xpY2UodGhpcyxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsZSxyKTtkZWZhdWx0OmlmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIHN3YXAodCxlLHIpe2NvbnN0IG49dFtlXTt0W2VdPXRbcl0sdFtyXT1ufWZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mKHQsZSxyLG4sbyl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCk6cj4yMTQ3NDgzNjQ3P3I9MjE0NzQ4MzY0NzpyPC0yMTQ3NDgzNjQ4JiYocj0tMjE0NzQ4MzY0OCksbnVtYmVySXNOYU4ocj0rcikmJihyPW8/MDp0Lmxlbmd0aC0xKSxyPDAmJihyPXQubGVuZ3RoK3IpLHI+PXQubGVuZ3RoKXtpZihvKXJldHVybi0xO3I9dC5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIW8pcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9QnVmZmVyLmZyb20oZSxuKSksQnVmZmVyLmlzQnVmZmVyKGUpKXJldHVybiAwPT09ZS5sZW5ndGg/LTE6YXJyYXlJbmRleE9mKHQsZSxyLG4sbyk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/bz9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodCxlLHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwodCxlLHIpOmFycmF5SW5kZXhPZih0LFtlXSxyLG4sbyk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gYXJyYXlJbmRleE9mKHQsZSxyLG4sbyl7bGV0IGksYT0xLHM9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO2E9MixzLz0yLHUvPTIsci89Mn1mdW5jdGlvbiByZWFkKHQsZSl7cmV0dXJuIDE9PT1hP3RbZV06dC5yZWFkVUludDE2QkUoZSphKX1pZihvKXtsZXQgbj0tMTtmb3IoaT1yO2k8cztpKyspaWYocmVhZCh0LGkpPT09cmVhZChlLC0xPT09bj8wOmktbikpe2lmKC0xPT09biYmKG49aSksaS1uKzE9PT11KXJldHVybiBuKmF9ZWxzZS0xIT09biYmKGktPWktbiksbj0tMX1lbHNlIGZvcihyK3U+cyYmKHI9cy11KSxpPXI7aT49MDtpLS0pe2xldCByPSEwO2ZvcihsZXQgbj0wO248dTtuKyspaWYocmVhZCh0LGkrbikhPT1yZWFkKGUsbikpe3I9ITE7YnJlYWt9aWYocilyZXR1cm4gaX1yZXR1cm4tMX1mdW5jdGlvbiBoZXhXcml0ZSh0LGUscixuKXtyPU51bWJlcihyKXx8MDtjb25zdCBvPXQubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPm8mJihuPW8pOm49bztjb25zdCBpPWUubGVuZ3RoO2xldCBhO2ZvcihuPmkvMiYmKG49aS8yKSxhPTA7YTxuOysrYSl7Y29uc3Qgbj1wYXJzZUludChlLnN1YnN0cigyKmEsMiksMTYpO2lmKG51bWJlcklzTmFOKG4pKXJldHVybiBhO3RbcithXT1ufXJldHVybiBhfWZ1bmN0aW9uIHV0ZjhXcml0ZSh0LGUscixuKXtyZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBhc2NpaVdyaXRlKHQsZSxyLG4pe3JldHVybiBibGl0QnVmZmVyKGZ1bmN0aW9uIGFzY2lpVG9CeXRlcyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX0oZSksdCxyLG4pfWZ1bmN0aW9uIGJhc2U2NFdyaXRlKHQsZSxyLG4pe3JldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoZSksdCxyLG4pfWZ1bmN0aW9uIHVjczJXcml0ZSh0LGUscixuKXtyZXR1cm4gYmxpdEJ1ZmZlcihmdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyh0LGUpe2xldCByLG4sbztjb25zdCBpPVtdO2ZvcihsZXQgYT0wO2E8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrYSlyPXQuY2hhckNvZGVBdChhKSxuPXI+Pjgsbz1yJTI1NixpLnB1c2gobyksaS5wdXNoKG4pO3JldHVybiBpfShlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBiYXNlNjRTbGljZSh0LGUscil7cmV0dXJuIDA9PT1lJiZyPT09dC5sZW5ndGg/bi5mcm9tQnl0ZUFycmF5KHQpOm4uZnJvbUJ5dGVBcnJheSh0LnNsaWNlKGUscikpfWZ1bmN0aW9uIHV0ZjhTbGljZSh0LGUscil7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtjb25zdCBuPVtdO2xldCBvPWU7Zm9yKDtvPHI7KXtjb25zdCBlPXRbb107bGV0IGk9bnVsbCxhPWU+MjM5PzQ6ZT4yMjM/MzplPjE5MT8yOjE7aWYobythPD1yKXtsZXQgcixuLHMsdTtzd2l0Y2goYSl7Y2FzZSAxOmU8MTI4JiYoaT1lKTticmVhaztjYXNlIDI6cj10W28rMV0sMTI4PT0oMTkyJnIpJiYodT0oMzEmZSk8PDZ8NjMmcix1PjEyNyYmKGk9dSkpO2JyZWFrO2Nhc2UgMzpyPXRbbysxXSxuPXRbbysyXSwxMjg9PSgxOTImcikmJjEyOD09KDE5MiZuKSYmKHU9KDE1JmUpPDwxMnwoNjMmcik8PDZ8NjMmbix1PjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGk9dSkpO2JyZWFrO2Nhc2UgNDpyPXRbbysxXSxuPXRbbysyXSxzPXRbbyszXSwxMjg9PSgxOTImcikmJjEyOD09KDE5MiZuKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmZSk8PDE4fCg2MyZyKTw8MTJ8KDYzJm4pPDw2fDYzJnMsdT42NTUzNSYmdTwxMTE0MTEyJiYoaT11KSl9fW51bGw9PT1pPyhpPTY1NTMzLGE9MSk6aT42NTUzNSYmKGktPTY1NTM2LG4ucHVzaChpPj4+MTAmMTAyM3w1NTI5NiksaT01NjMyMHwxMDIzJmkpLG4ucHVzaChpKSxvKz1hfXJldHVybiBmdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkodCl7Y29uc3QgZT10Lmxlbmd0aDtpZihlPD1zKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0KTtsZXQgcj0iIixuPTA7Zm9yKDtuPGU7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQuc2xpY2UobixuKz1zKSk7cmV0dXJuIHJ9KG4pfWUua01heExlbmd0aD1hLEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUPWZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0KCl7dHJ5e2NvbnN0IHQ9bmV3IFVpbnQ4QXJyYXkoMSksZT17Zm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX07cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihlLFVpbnQ4QXJyYXkucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKSw0Mj09PXQuZm9vKCl9Y2F0Y2godCl7cmV0dXJuITF9fSgpLEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUfHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGV8fCJmdW5jdGlvbiIhPXR5cGVvZiBjb25zb2xlLmVycm9yfHxjb25zb2xlLmVycm9yKCJUaGlzIGJyb3dzZXIgbGFja3MgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpIHN1cHBvcnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4iKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwicGFyZW50Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZihCdWZmZXIuaXNCdWZmZXIodGhpcykpcmV0dXJuIHRoaXMuYnVmZmVyfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCJvZmZzZXQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKEJ1ZmZlci5pc0J1ZmZlcih0aGlzKSlyZXR1cm4gdGhpcy5ieXRlT2Zmc2V0fX0pLEJ1ZmZlci5wb29sU2l6ZT04MTkyLEJ1ZmZlci5mcm9tPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZnJvbSh0LGUscil9LE9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIucHJvdG90eXBlLFVpbnQ4QXJyYXkucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLFVpbnQ4QXJyYXkpLEJ1ZmZlci5hbGxvYz1mdW5jdGlvbih0LGUscil7cmV0dXJuIGZ1bmN0aW9uIGFsbG9jKHQsZSxyKXtyZXR1cm4gYXNzZXJ0U2l6ZSh0KSx0PD0wP2NyZWF0ZUJ1ZmZlcih0KTp2b2lkIDAhPT1lPyJzdHJpbmciPT10eXBlb2Ygcj9jcmVhdGVCdWZmZXIodCkuZmlsbChlLHIpOmNyZWF0ZUJ1ZmZlcih0KS5maWxsKGUpOmNyZWF0ZUJ1ZmZlcih0KX0odCxlLHIpfSxCdWZmZXIuYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFsbG9jVW5zYWZlKHQpfSxCdWZmZXIuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe3JldHVybiBhbGxvY1Vuc2FmZSh0KX0sQnVmZmVyLmlzQnVmZmVyPWZ1bmN0aW9uIGlzQnVmZmVyKHQpe3JldHVybiBudWxsIT10JiYhMD09PXQuX2lzQnVmZmVyJiZ0IT09QnVmZmVyLnByb3RvdHlwZX0sQnVmZmVyLmNvbXBhcmU9ZnVuY3Rpb24gY29tcGFyZSh0LGUpe2lmKGlzSW5zdGFuY2UodCxVaW50OEFycmF5KSYmKHQ9QnVmZmVyLmZyb20odCx0Lm9mZnNldCx0LmJ5dGVMZW5ndGgpKSxpc0luc3RhbmNlKGUsVWludDhBcnJheSkmJihlPUJ1ZmZlci5mcm9tKGUsZS5vZmZzZXQsZS5ieXRlTGVuZ3RoKSksIUJ1ZmZlci5pc0J1ZmZlcih0KXx8IUJ1ZmZlci5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImJ1ZjEiLCAiYnVmMiIgYXJndW1lbnRzIG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTtpZih0PT09ZSlyZXR1cm4gMDtsZXQgcj10Lmxlbmd0aCxuPWUubGVuZ3RoO2ZvcihsZXQgbz0wLGk9TWF0aC5taW4ocixuKTtvPGk7KytvKWlmKHRbb10hPT1lW29dKXtyPXRbb10sbj1lW29dO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0sQnVmZmVyLmlzRW5jb2Rpbmc9ZnVuY3Rpb24gaXNFbmNvZGluZyh0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sQnVmZmVyLmNvbmNhdD1mdW5jdGlvbiBjb25jYXQodCxlKXtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiBCdWZmZXIuYWxsb2MoMCk7bGV0IHI7aWYodm9pZCAwPT09ZSlmb3IoZT0wLHI9MDtyPHQubGVuZ3RoOysrcillKz10W3JdLmxlbmd0aDtjb25zdCBuPUJ1ZmZlci5hbGxvY1Vuc2FmZShlKTtsZXQgbz0wO2ZvcihyPTA7cjx0Lmxlbmd0aDsrK3Ipe2xldCBlPXRbcl07aWYoaXNJbnN0YW5jZShlLFVpbnQ4QXJyYXkpKW8rZS5sZW5ndGg+bi5sZW5ndGg/KEJ1ZmZlci5pc0J1ZmZlcihlKXx8KGU9QnVmZmVyLmZyb20oZSkpLGUuY29weShuLG8pKTpVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChuLGUsbyk7ZWxzZXtpZighQnVmZmVyLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtlLmNvcHkobixvKX1vKz1lLmxlbmd0aH1yZXR1cm4gbn0sQnVmZmVyLmJ5dGVMZW5ndGg9Ynl0ZUxlbmd0aCxCdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxCdWZmZXIucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbiBzd2FwMTYoKXtjb25zdCB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IobGV0IGU9MDtlPHQ7ZSs9Milzd2FwKHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSxCdWZmZXIucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbiBzd2FwMzIoKXtjb25zdCB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IobGV0IGU9MDtlPHQ7ZSs9NClzd2FwKHRoaXMsZSxlKzMpLHN3YXAodGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24gc3dhcDY0KCl7Y29uc3QgdD10aGlzLmxlbmd0aDtpZih0JTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKGxldCBlPTA7ZTx0O2UrPTgpc3dhcCh0aGlzLGUsZSs3KSxzd2FwKHRoaXMsZSsxLGUrNiksc3dhcCh0aGlzLGUrMixlKzUpLHN3YXAodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbiB0b1N0cmluZygpe2NvbnN0IHQ9dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10PyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP3V0ZjhTbGljZSh0aGlzLDAsdCk6c2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sQnVmZmVyLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZz1CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nLEJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uIGVxdWFscyh0KXtpZighQnVmZmVyLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1CdWZmZXIuY29tcGFyZSh0aGlzLHQpfSxCdWZmZXIucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24gaW5zcGVjdCgpe2xldCB0PSIiO2NvbnN0IHI9ZS5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gdD10aGlzLnRvU3RyaW5nKCJoZXgiLDAscikucmVwbGFjZSgvKC57Mn0pL2csIiQxICIpLnRyaW0oKSx0aGlzLmxlbmd0aD5yJiYodCs9IiAuLi4gIiksIjxCdWZmZXIgIit0KyI+In0saSYmKEJ1ZmZlci5wcm90b3R5cGVbaV09QnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0KSxCdWZmZXIucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24gY29tcGFyZSh0LGUscixuLG8pe2lmKGlzSW5zdGFuY2UodCxVaW50OEFycmF5KSYmKHQ9QnVmZmVyLmZyb20odCx0Lm9mZnNldCx0LmJ5dGVMZW5ndGgpKSwhQnVmZmVyLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAidGFyZ2V0IiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHQpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PXImJihyPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09byYmKG89dGhpcy5sZW5ndGgpLGU8MHx8cj50Lmxlbmd0aHx8bjwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1vJiZlPj1yKXJldHVybiAwO2lmKG4+PW8pcmV0dXJuLTE7aWYoZT49cilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtsZXQgaT0obz4+Pj0wKS0obj4+Pj0wKSxhPShyPj4+PTApLShlPj4+PTApO2NvbnN0IHM9TWF0aC5taW4oaSxhKSx1PXRoaXMuc2xpY2UobixvKSxjPXQuc2xpY2UoZSxyKTtmb3IobGV0IHQ9MDt0PHM7Kyt0KWlmKHVbdF0hPT1jW3RdKXtpPXVbdF0sYT1jW3RdO2JyZWFrfXJldHVybiBpPGE/LTE6YTxpPzE6MH0sQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbiBpbmNsdWRlcyh0LGUscil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLHIpfSxCdWZmZXIucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24gaW5kZXhPZih0LGUscil7cmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsdCxlLHIsITApfSxCdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uIGxhc3RJbmRleE9mKHQsZSxyKXtyZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcyx0LGUsciwhMSl9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24gd3JpdGUodCxlLHIsbil7aWYodm9pZCAwPT09ZSluPSJ1dGY4IixyPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PXImJiJzdHJpbmciPT10eXBlb2YgZSluPWUscj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2U+Pj49MCxpc0Zpbml0ZShyKT8ocj4+Pj0wLHZvaWQgMD09PW4mJihuPSJ1dGY4IikpOihuPXIscj12b2lkIDApfWNvbnN0IG89dGhpcy5sZW5ndGgtZTtpZigodm9pZCAwPT09cnx8cj5vKSYmKHI9byksdC5sZW5ndGg+MCYmKHI8MHx8ZTwwKXx8ZT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtufHwobj0idXRmOCIpO2xldCBpPSExO2Zvcig7Oylzd2l0Y2gobil7Y2FzZSJoZXgiOnJldHVybiBoZXhXcml0ZSh0aGlzLHQsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiB1dGY4V3JpdGUodGhpcyx0LGUscik7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gYXNjaWlXcml0ZSh0aGlzLHQsZSxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gdWNzMldyaXRlKHRoaXMsdCxlLHIpO2RlZmF1bHQ6aWYoaSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pO249KCIiK24pLnRvTG93ZXJDYXNlKCksaT0hMH19LEJ1ZmZlci5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uIHRvSlNPTigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07Y29uc3Qgcz00MDk2O2Z1bmN0aW9uIGFzY2lpU2xpY2UodCxlLHIpe2xldCBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKGxldCBvPWU7bzxyOysrbyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W29dKTtyZXR1cm4gbn1mdW5jdGlvbiBsYXRpbjFTbGljZSh0LGUscil7bGV0IG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IobGV0IG89ZTtvPHI7KytvKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUodFtvXSk7cmV0dXJuIG59ZnVuY3Rpb24gaGV4U2xpY2UodCxlLHIpe2NvbnN0IG49dC5sZW5ndGg7KCFlfHxlPDApJiYoZT0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7bGV0IG89IiI7Zm9yKGxldCBuPWU7bjxyOysrbilvKz1mW3Rbbl1dO3JldHVybiBvfWZ1bmN0aW9uIHV0ZjE2bGVTbGljZSh0LGUscil7Y29uc3Qgbj10LnNsaWNlKGUscik7bGV0IG89IiI7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aC0xO3QrPTIpbys9U3RyaW5nLmZyb21DaGFyQ29kZShuW3RdKzI1NipuW3QrMV0pO3JldHVybiBvfWZ1bmN0aW9uIGNoZWNrT2Zmc2V0KHQsZSxyKXtpZih0JTEhPTB8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYodCtlPnIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBjaGVja0ludCh0LGUscixuLG8saSl7aWYoIUJ1ZmZlci5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYoZT5vfHxlPGkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKHIrbj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gd3J0QmlnVUludDY0TEUodCxlLHIsbixvKXtjaGVja0ludEJJKGUsbixvLHQsciw3KTtsZXQgaT1OdW1iZXIoZSZCaWdJbnQoNDI5NDk2NzI5NSkpO3RbcisrXT1pLGk+Pj04LHRbcisrXT1pLGk+Pj04LHRbcisrXT1pLGk+Pj04LHRbcisrXT1pO2xldCBhPU51bWJlcihlPj5CaWdJbnQoMzIpJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7cmV0dXJuIHRbcisrXT1hLGE+Pj04LHRbcisrXT1hLGE+Pj04LHRbcisrXT1hLGE+Pj04LHRbcisrXT1hLHJ9ZnVuY3Rpb24gd3J0QmlnVUludDY0QkUodCxlLHIsbixvKXtjaGVja0ludEJJKGUsbixvLHQsciw3KTtsZXQgaT1OdW1iZXIoZSZCaWdJbnQoNDI5NDk2NzI5NSkpO3Rbcis3XT1pLGk+Pj04LHRbcis2XT1pLGk+Pj04LHRbcis1XT1pLGk+Pj04LHRbcis0XT1pO2xldCBhPU51bWJlcihlPj5CaWdJbnQoMzIpJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7cmV0dXJuIHRbciszXT1hLGE+Pj04LHRbcisyXT1hLGE+Pj04LHRbcisxXT1hLGE+Pj04LHRbcl09YSxyKzh9ZnVuY3Rpb24gY2hlY2tJRUVFNzU0KHQsZSxyLG4sbyxpKXtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gd3JpdGVGbG9hdCh0LGUscixuLGkpe3JldHVybiBlPStlLHI+Pj49MCxpfHxjaGVja0lFRUU3NTQodCwwLHIsNCksby53cml0ZSh0LGUscixuLDIzLDQpLHIrNH1mdW5jdGlvbiB3cml0ZURvdWJsZSh0LGUscixuLGkpe3JldHVybiBlPStlLHI+Pj49MCxpfHxjaGVja0lFRUU3NTQodCwwLHIsOCksby53cml0ZSh0LGUscixuLDUyLDgpLHIrOH1CdWZmZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uIHNsaWNlKHQsZSl7Y29uc3Qgcj10aGlzLmxlbmd0aDsodD1+fnQpPDA/KHQrPXIpPDAmJih0PTApOnQ+ciYmKHQ9ciksKGU9dm9pZCAwPT09ZT9yOn5+ZSk8MD8oZSs9cik8MCYmKGU9MCk6ZT5yJiYoZT1yKSxlPHQmJihlPXQpO2NvbnN0IG49dGhpcy5zdWJhcnJheSh0LGUpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YobixCdWZmZXIucHJvdG90eXBlKSxufSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50TEU9QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uIHJlYWRVSW50TEUodCxlLHIpe3Q+Pj49MCxlPj4+PTAscnx8Y2hlY2tPZmZzZXQodCxlLHRoaXMubGVuZ3RoKTtsZXQgbj10aGlzW3RdLG89MSxpPTA7Zm9yKDsrK2k8ZSYmKG8qPTI1Nik7KW4rPXRoaXNbdCtpXSpvO3JldHVybiBufSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50QkU9QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uIHJlYWRVSW50QkUodCxlLHIpe3Q+Pj49MCxlPj4+PTAscnx8Y2hlY2tPZmZzZXQodCxlLHRoaXMubGVuZ3RoKTtsZXQgbj10aGlzW3QrLS1lXSxvPTE7Zm9yKDtlPjAmJihvKj0yNTYpOyluKz10aGlzW3QrLS1lXSpvO3JldHVybiBufSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50OD1CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbiByZWFkVUludDgodCxlKXtyZXR1cm4gdD4+Pj0wLGV8fGNoZWNrT2Zmc2V0KHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2TEU9QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24gcmVhZFVJbnQxNkxFKHQsZSl7cmV0dXJuIHQ+Pj49MCxlfHxjaGVja09mZnNldCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTZCRT1CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbiByZWFkVUludDE2QkUodCxlKXtyZXR1cm4gdD4+Pj0wLGV8fGNoZWNrT2Zmc2V0KHQsMix0aGlzLmxlbmd0aCksdGhpc1t0XTw8OHx0aGlzW3QrMV19LEJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkxFPUJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uIHJlYWRVSW50MzJMRSh0LGUpe3JldHVybiB0Pj4+PTAsZXx8Y2hlY2tPZmZzZXQodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzJCRT1CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbiByZWFkVUludDMyQkUodCxlKXtyZXR1cm4gdD4+Pj0wLGV8fGNoZWNrT2Zmc2V0KHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnVUludDY0TEU9ZGVmaW5lQmlnSW50TWV0aG9kKChmdW5jdGlvbiByZWFkQmlnVUludDY0TEUodCl7dmFsaWRhdGVOdW1iZXIodD4+Pj0wLCJvZmZzZXQiKTtjb25zdCBlPXRoaXNbdF0scj10aGlzW3QrN107dm9pZCAwIT09ZSYmdm9pZCAwIT09cnx8Ym91bmRzRXJyb3IodCx0aGlzLmxlbmd0aC04KTtjb25zdCBuPWUrMjU2KnRoaXNbKyt0XSs2NTUzNip0aGlzWysrdF0rdGhpc1srK3RdKjIqKjI0LG89dGhpc1srK3RdKzI1Nip0aGlzWysrdF0rNjU1MzYqdGhpc1srK3RdK3IqMioqMjQ7cmV0dXJuIEJpZ0ludChuKSsoQmlnSW50KG8pPDxCaWdJbnQoMzIpKX0pKSxCdWZmZXIucHJvdG90eXBlLnJlYWRCaWdVSW50NjRCRT1kZWZpbmVCaWdJbnRNZXRob2QoKGZ1bmN0aW9uIHJlYWRCaWdVSW50NjRCRSh0KXt2YWxpZGF0ZU51bWJlcih0Pj4+PTAsIm9mZnNldCIpO2NvbnN0IGU9dGhpc1t0XSxyPXRoaXNbdCs3XTt2b2lkIDAhPT1lJiZ2b2lkIDAhPT1yfHxib3VuZHNFcnJvcih0LHRoaXMubGVuZ3RoLTgpO2NvbnN0IG49ZSoyKioyNCs2NTUzNip0aGlzWysrdF0rMjU2KnRoaXNbKyt0XSt0aGlzWysrdF0sbz10aGlzWysrdF0qMioqMjQrNjU1MzYqdGhpc1srK3RdKzI1Nip0aGlzWysrdF0rcjtyZXR1cm4oQmlnSW50KG4pPDxCaWdJbnQoMzIpKStCaWdJbnQobyl9KSksQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24gcmVhZEludExFKHQsZSxyKXt0Pj4+PTAsZT4+Pj0wLHJ8fGNoZWNrT2Zmc2V0KHQsZSx0aGlzLmxlbmd0aCk7bGV0IG49dGhpc1t0XSxvPTEsaT0wO2Zvcig7KytpPGUmJihvKj0yNTYpOyluKz10aGlzW3QraV0qbztyZXR1cm4gbyo9MTI4LG4+PW8mJihuLT1NYXRoLnBvdygyLDgqZSkpLG59LEJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uIHJlYWRJbnRCRSh0LGUscil7dD4+Pj0wLGU+Pj49MCxyfHxjaGVja09mZnNldCh0LGUsdGhpcy5sZW5ndGgpO2xldCBuPWUsbz0xLGk9dGhpc1t0Ky0tbl07Zm9yKDtuPjAmJihvKj0yNTYpOylpKz10aGlzW3QrLS1uXSpvO3JldHVybiBvKj0xMjgsaT49byYmKGktPU1hdGgucG93KDIsOCplKSksaX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbiByZWFkSW50OCh0LGUpe3JldHVybiB0Pj4+PTAsZXx8Y2hlY2tPZmZzZXQodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbiByZWFkSW50MTZMRSh0LGUpe3Q+Pj49MCxlfHxjaGVja09mZnNldCh0LDIsdGhpcy5sZW5ndGgpO2NvbnN0IHI9dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24gcmVhZEludDE2QkUodCxlKXt0Pj4+PTAsZXx8Y2hlY2tPZmZzZXQodCwyLHRoaXMubGVuZ3RoKTtjb25zdCByPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uIHJlYWRJbnQzMkxFKHQsZSl7cmV0dXJuIHQ+Pj49MCxlfHxjaGVja09mZnNldCh0LDQsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTZ8dGhpc1t0KzNdPDwyNH0sQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbiByZWFkSW50MzJCRSh0LGUpe3JldHVybiB0Pj4+PTAsZXx8Y2hlY2tPZmZzZXQodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LEJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ0ludDY0TEU9ZGVmaW5lQmlnSW50TWV0aG9kKChmdW5jdGlvbiByZWFkQmlnSW50NjRMRSh0KXt2YWxpZGF0ZU51bWJlcih0Pj4+PTAsIm9mZnNldCIpO2NvbnN0IGU9dGhpc1t0XSxyPXRoaXNbdCs3XTt2b2lkIDAhPT1lJiZ2b2lkIDAhPT1yfHxib3VuZHNFcnJvcih0LHRoaXMubGVuZ3RoLTgpO2NvbnN0IG49dGhpc1t0KzRdKzI1Nip0aGlzW3QrNV0rNjU1MzYqdGhpc1t0KzZdKyhyPDwyNCk7cmV0dXJuKEJpZ0ludChuKTw8QmlnSW50KDMyKSkrQmlnSW50KGUrMjU2KnRoaXNbKyt0XSs2NTUzNip0aGlzWysrdF0rdGhpc1srK3RdKjIqKjI0KX0pKSxCdWZmZXIucHJvdG90eXBlLnJlYWRCaWdJbnQ2NEJFPWRlZmluZUJpZ0ludE1ldGhvZCgoZnVuY3Rpb24gcmVhZEJpZ0ludDY0QkUodCl7dmFsaWRhdGVOdW1iZXIodD4+Pj0wLCJvZmZzZXQiKTtjb25zdCBlPXRoaXNbdF0scj10aGlzW3QrN107dm9pZCAwIT09ZSYmdm9pZCAwIT09cnx8Ym91bmRzRXJyb3IodCx0aGlzLmxlbmd0aC04KTtjb25zdCBuPShlPDwyNCkrNjU1MzYqdGhpc1srK3RdKzI1Nip0aGlzWysrdF0rdGhpc1srK3RdO3JldHVybihCaWdJbnQobik8PEJpZ0ludCgzMikpK0JpZ0ludCh0aGlzWysrdF0qMioqMjQrNjU1MzYqdGhpc1srK3RdKzI1Nip0aGlzWysrdF0rcil9KSksQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbiByZWFkRmxvYXRMRSh0LGUpe3JldHVybiB0Pj4+PTAsZXx8Y2hlY2tPZmZzZXQodCw0LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCEwLDIzLDQpfSxCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uIHJlYWRGbG9hdEJFKHQsZSl7cmV0dXJuIHQ+Pj49MCxlfHxjaGVja09mZnNldCh0LDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITEsMjMsNCl9LEJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uIHJlYWREb3VibGVMRSh0LGUpe3JldHVybiB0Pj4+PTAsZXx8Y2hlY2tPZmZzZXQodCw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCEwLDUyLDgpfSxCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbiByZWFkRG91YmxlQkUodCxlKXtyZXR1cm4gdD4+Pj0wLGV8fGNoZWNrT2Zmc2V0KHQsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMSw1Miw4KX0sQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnRMRT1CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uIHdyaXRlVUludExFKHQsZSxyLG4pe2lmKHQ9K3QsZT4+Pj0wLHI+Pj49MCwhbil7Y2hlY2tJbnQodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKX1sZXQgbz0xLGk9MDtmb3IodGhpc1tlXT0yNTUmdDsrK2k8ciYmKG8qPTI1Nik7KXRoaXNbZStpXT10L28mMjU1O3JldHVybiBlK3J9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50QkU9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbiB3cml0ZVVJbnRCRSh0LGUscixuKXtpZih0PSt0LGU+Pj49MCxyPj4+PTAsIW4pe2NoZWNrSW50KHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCl9bGV0IG89ci0xLGk9MTtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKGkqPTI1Nik7KXRoaXNbZStvXT10L2kmMjU1O3JldHVybiBlK3J9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50OD1CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24gd3JpdGVVSW50OCh0LGUscil7cmV0dXJuIHQ9K3QsZT4+Pj0wLHJ8fGNoZWNrSW50KHRoaXMsdCxlLDEsMjU1LDApLHRoaXNbZV09MjU1JnQsZSsxfSxCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2TEU9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uIHdyaXRlVUludDE2TEUodCxlLHIpe3JldHVybiB0PSt0LGU+Pj49MCxyfHxjaGVja0ludCh0aGlzLHQsZSwyLDY1NTM1LDApLHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44LGUrMn0sQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQxNkJFPUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbiB3cml0ZVVJbnQxNkJFKHQsZSxyKXtyZXR1cm4gdD0rdCxlPj4+PTAscnx8Y2hlY2tJbnQodGhpcyx0LGUsMiw2NTUzNSwwKSx0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCxlKzJ9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzJMRT1CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24gd3JpdGVVSW50MzJMRSh0LGUscil7cmV0dXJuIHQ9K3QsZT4+Pj0wLHJ8fGNoZWNrSW50KHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx0aGlzW2UrM109dD4+PjI0LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZV09MjU1JnQsZSs0fSxCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyQkU9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uIHdyaXRlVUludDMyQkUodCxlLHIpe3JldHVybiB0PSt0LGU+Pj49MCxyfHxjaGVja0ludCh0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksdGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0LGUrNH0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFPWRlZmluZUJpZ0ludE1ldGhvZCgoZnVuY3Rpb24gd3JpdGVCaWdVSW50NjRMRSh0LGU9MCl7cmV0dXJuIHdydEJpZ1VJbnQ2NExFKHRoaXMsdCxlLEJpZ0ludCgwKSxCaWdJbnQoIjB4ZmZmZmZmZmZmZmZmZmZmZiIpKX0pKSxCdWZmZXIucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkU9ZGVmaW5lQmlnSW50TWV0aG9kKChmdW5jdGlvbiB3cml0ZUJpZ1VJbnQ2NEJFKHQsZT0wKXtyZXR1cm4gd3J0QmlnVUludDY0QkUodGhpcyx0LGUsQmlnSW50KDApLEJpZ0ludCgiMHhmZmZmZmZmZmZmZmZmZmZmIikpfSkpLEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbiB3cml0ZUludExFKHQsZSxyLG4pe2lmKHQ9K3QsZT4+Pj0wLCFuKXtjb25zdCBuPU1hdGgucG93KDIsOCpyLTEpO2NoZWNrSW50KHRoaXMsdCxlLHIsbi0xLC1uKX1sZXQgbz0wLGk9MSxhPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytvPHImJihpKj0yNTYpOyl0PDAmJjA9PT1hJiYwIT09dGhpc1tlK28tMV0mJihhPTEpLHRoaXNbZStvXT0odC9pfDApLWEmMjU1O3JldHVybiBlK3J9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbiB3cml0ZUludEJFKHQsZSxyLG4pe2lmKHQ9K3QsZT4+Pj0wLCFuKXtjb25zdCBuPU1hdGgucG93KDIsOCpyLTEpO2NoZWNrSW50KHRoaXMsdCxlLHIsbi0xLC1uKX1sZXQgbz1yLTEsaT0xLGE9MDtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKGkqPTI1Nik7KXQ8MCYmMD09PWEmJjAhPT10aGlzW2UrbysxXSYmKGE9MSksdGhpc1tlK29dPSh0L2l8MCktYSYyNTU7cmV0dXJuIGUrcn0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24gd3JpdGVJbnQ4KHQsZSxyKXtyZXR1cm4gdD0rdCxlPj4+PTAscnx8Y2hlY2tJbnQodGhpcyx0LGUsMSwxMjcsLTEyOCksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24gd3JpdGVJbnQxNkxFKHQsZSxyKXtyZXR1cm4gdD0rdCxlPj4+PTAscnx8Y2hlY2tJbnQodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44LGUrMn0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24gd3JpdGVJbnQxNkJFKHQsZSxyKXtyZXR1cm4gdD0rdCxlPj4+PTAscnx8Y2hlY2tJbnQodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0LGUrMn0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24gd3JpdGVJbnQzMkxFKHQsZSxyKXtyZXR1cm4gdD0rdCxlPj4+PTAscnx8Y2hlY2tJbnQodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQsZSs0fSxCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbiB3cml0ZUludDMyQkUodCxlLHIpe3JldHVybiB0PSt0LGU+Pj49MCxyfHxjaGVja0ludCh0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCxlKzR9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NExFPWRlZmluZUJpZ0ludE1ldGhvZCgoZnVuY3Rpb24gd3JpdGVCaWdJbnQ2NExFKHQsZT0wKXtyZXR1cm4gd3J0QmlnVUludDY0TEUodGhpcyx0LGUsLUJpZ0ludCgiMHg4MDAwMDAwMDAwMDAwMDAwIiksQmlnSW50KCIweDdmZmZmZmZmZmZmZmZmZmYiKSl9KSksQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkU9ZGVmaW5lQmlnSW50TWV0aG9kKChmdW5jdGlvbiB3cml0ZUJpZ0ludDY0QkUodCxlPTApe3JldHVybiB3cnRCaWdVSW50NjRCRSh0aGlzLHQsZSwtQmlnSW50KCIweDgwMDAwMDAwMDAwMDAwMDAiKSxCaWdJbnQoIjB4N2ZmZmZmZmZmZmZmZmZmZiIpKX0pKSxCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbiB3cml0ZUZsb2F0TEUodCxlLHIpe3JldHVybiB3cml0ZUZsb2F0KHRoaXMsdCxlLCEwLHIpfSxCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbiB3cml0ZUZsb2F0QkUodCxlLHIpe3JldHVybiB3cml0ZUZsb2F0KHRoaXMsdCxlLCExLHIpfSxCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24gd3JpdGVEb3VibGVMRSh0LGUscil7cmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsdCxlLCEwLHIpfSxCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24gd3JpdGVEb3VibGVCRSh0LGUscil7cmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsdCxlLCExLHIpfSxCdWZmZXIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24gY29weSh0LGUscixuKXtpZighQnVmZmVyLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImFyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlciIpO2lmKHJ8fChyPTApLG58fDA9PT1ufHwobj10aGlzLmxlbmd0aCksZT49dC5sZW5ndGgmJihlPXQubGVuZ3RoKSxlfHwoZT0wKSxuPjAmJm48ciYmKG49ciksbj09PXIpcmV0dXJuIDA7aWYoMD09PXQubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwfHxyPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPG4tciYmKG49dC5sZW5ndGgtZStyKTtjb25zdCBvPW4tcjtyZXR1cm4gdGhpcz09PXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluP3RoaXMuY29weVdpdGhpbihlLHIsbik6VWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KHIsbiksZSksb30sQnVmZmVyLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uIGZpbGwodCxlLHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KG49ZSxlPTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhQnVmZmVyLmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtpZigxPT09dC5sZW5ndGgpe2NvbnN0IGU9dC5jaGFyQ29kZUF0KDApOygidXRmOCI9PT1uJiZlPDEyOHx8ImxhdGluMSI9PT1uKSYmKHQ9ZSl9fWVsc2UibnVtYmVyIj09dHlwZW9mIHQ/dCY9MjU1OiJib29sZWFuIj09dHlwZW9mIHQmJih0PU51bWJlcih0KSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD1lKXJldHVybiB0aGlzO2xldCBvO2lmKGU+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsdHx8KHQ9MCksIm51bWJlciI9PXR5cGVvZiB0KWZvcihvPWU7bzxyOysrbyl0aGlzW29dPXQ7ZWxzZXtjb25zdCBpPUJ1ZmZlci5pc0J1ZmZlcih0KT90OkJ1ZmZlci5mcm9tKHQsbiksYT1pLmxlbmd0aDtpZigwPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgIicrdCsnIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCAidmFsdWUiJyk7Zm9yKG89MDtvPHItZTsrK28pdGhpc1tvK2VdPWlbbyVhXX1yZXR1cm4gdGhpc307Y29uc3QgdT17fTtmdW5jdGlvbiBFKHQsZSxyKXt1W3RdPWNsYXNzIE5vZGVFcnJvciBleHRlbmRzIHJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJtZXNzYWdlIix7dmFsdWU6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdGhpcy5uYW1lPWAke3RoaXMubmFtZX0gWyR7dH1dYCx0aGlzLnN0YWNrLGRlbGV0ZSB0aGlzLm5hbWV9Z2V0IGNvZGUoKXtyZXR1cm4gdH1zZXQgY29kZSh0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29kZSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnQsd3JpdGFibGU6ITB9KX10b1N0cmluZygpe3JldHVybmAke3RoaXMubmFtZX0gWyR7dH1dOiAke3RoaXMubWVzc2FnZX1gfX19ZnVuY3Rpb24gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKHQpe2xldCBlPSIiLHI9dC5sZW5ndGg7Y29uc3Qgbj0iLSI9PT10WzBdPzE6MDtmb3IoO3I+PW4rNDtyLT0zKWU9YF8ke3Quc2xpY2Uoci0zLHIpfSR7ZX1gO3JldHVybmAke3Quc2xpY2UoMCxyKX0ke2V9YH1mdW5jdGlvbiBjaGVja0ludEJJKHQsZSxyLG4sbyxpKXtpZih0PnJ8fHQ8ZSl7Y29uc3Qgbj0iYmlnaW50Ij09dHlwZW9mIGU/Im4iOiIiO2xldCBvO3Rocm93IG89aT4zPzA9PT1lfHxlPT09QmlnSW50KDApP2A+PSAwJHtufSBhbmQgPCAyJHtufSAqKiAkezgqKGkrMSl9JHtufWA6YD49IC0oMiR7bn0gKiogJHs4KihpKzEpLTF9JHtufSkgYW5kIDwgMiAqKiAkezgqKGkrMSktMX0ke259YDpgPj0gJHtlfSR7bn0gYW5kIDw9ICR7cn0ke259YCxuZXcgdS5FUlJfT1VUX09GX1JBTkdFKCJ2YWx1ZSIsbyx0KX0hZnVuY3Rpb24gY2hlY2tCb3VuZHModCxlLHIpe3ZhbGlkYXRlTnVtYmVyKGUsIm9mZnNldCIpLHZvaWQgMCE9PXRbZV0mJnZvaWQgMCE9PXRbZStyXXx8Ym91bmRzRXJyb3IoZSx0Lmxlbmd0aC0ocisxKSl9KG4sbyxpKX1mdW5jdGlvbiB2YWxpZGF0ZU51bWJlcih0LGUpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgdS5FUlJfSU5WQUxJRF9BUkdfVFlQRShlLCJudW1iZXIiLHQpfWZ1bmN0aW9uIGJvdW5kc0Vycm9yKHQsZSxyKXtpZihNYXRoLmZsb29yKHQpIT09dCl0aHJvdyB2YWxpZGF0ZU51bWJlcih0LHIpLG5ldyB1LkVSUl9PVVRfT0ZfUkFOR0Uocnx8Im9mZnNldCIsImFuIGludGVnZXIiLHQpO2lmKGU8MCl0aHJvdyBuZXcgdS5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFM7dGhyb3cgbmV3IHUuRVJSX09VVF9PRl9SQU5HRShyfHwib2Zmc2V0IixgPj0gJHtyPzE6MH0gYW5kIDw9ICR7ZX1gLHQpfUUoIkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EUyIsKGZ1bmN0aW9uKHQpe3JldHVybiB0P2Ake3R9IGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kc2A6IkF0dGVtcHQgdG8gYWNjZXNzIG1lbW9yeSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMifSksUmFuZ2VFcnJvciksRSgiRVJSX0lOVkFMSURfQVJHX1RZUEUiLChmdW5jdGlvbih0LGUpe3JldHVybmBUaGUgIiR7dH0iIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgZX1gfSksVHlwZUVycm9yKSxFKCJFUlJfT1VUX09GX1JBTkdFIiwoZnVuY3Rpb24odCxlLHIpe2xldCBuPWBUaGUgdmFsdWUgb2YgIiR7dH0iIGlzIG91dCBvZiByYW5nZS5gLG89cjtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihyKSYmTWF0aC5hYnMocik+MioqMzI/bz1hZGROdW1lcmljYWxTZXBhcmF0b3IoU3RyaW5nKHIpKToiYmlnaW50Ij09dHlwZW9mIHImJihvPVN0cmluZyhyKSwocj5CaWdJbnQoMikqKkJpZ0ludCgzMil8fHI8LShCaWdJbnQoMikqKkJpZ0ludCgzMikpKSYmKG89YWRkTnVtZXJpY2FsU2VwYXJhdG9yKG8pKSxvKz0ibiIpLG4rPWAgSXQgbXVzdCBiZSAke2V9LiBSZWNlaXZlZCAke299YCxufSksUmFuZ2VFcnJvcik7Y29uc3QgYz0vW14rLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIHV0ZjhUb0J5dGVzKHQsZSl7bGV0IHI7ZT1lfHwxLzA7Y29uc3Qgbj10Lmxlbmd0aDtsZXQgbz1udWxsO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxuOysrYSl7aWYocj10LmNoYXJDb2RlQXQoYSkscj41NTI5NSYmcjw1NzM0NCl7aWYoIW8pe2lmKHI+NTYzMTkpeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihhKzE9PT1uKXsoZS09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9bz1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyhlLT0zKT4tMSYmaS5wdXNoKDIzOSwxOTEsMTg5KSxvPXI7Y29udGludWV9cj02NTUzNisoby01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBvJiYoZS09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7aWYobz1udWxsLHI8MTI4KXtpZigoZS09MSk8MClicmVhaztpLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO2kucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigoZS09Myk8MClicmVhaztpLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChlLT00KTwwKWJyZWFrO2kucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIGl9ZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyh0KXtyZXR1cm4gbi50b0J5dGVBcnJheShmdW5jdGlvbiBiYXNlNjRjbGVhbih0KXtpZigodD0odD10LnNwbGl0KCI9IilbMF0pLnRyaW0oKS5yZXBsYWNlKGMsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPTA7KXQrPSI9IjtyZXR1cm4gdH0odCkpfWZ1bmN0aW9uIGJsaXRCdWZmZXIodCxlLHIsbil7bGV0IG87Zm9yKG89MDtvPG4mJiEobytyPj1lLmxlbmd0aHx8bz49dC5sZW5ndGgpOysrbyllW28rcl09dFtvXTtyZXR1cm4gb31mdW5jdGlvbiBpc0luc3RhbmNlKHQsZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBlfHxudWxsIT10JiZudWxsIT10LmNvbnN0cnVjdG9yJiZudWxsIT10LmNvbnN0cnVjdG9yLm5hbWUmJnQuY29uc3RydWN0b3IubmFtZT09PWUubmFtZX1mdW5jdGlvbiBudW1iZXJJc05hTih0KXtyZXR1cm4gdCE9dH1jb25zdCBmPWZ1bmN0aW9uKCl7Y29uc3QgdD0iMDEyMzQ1Njc4OWFiY2RlZiIsZT1uZXcgQXJyYXkoMjU2KTtmb3IobGV0IHI9MDtyPDE2Oysrcil7Y29uc3Qgbj0xNipyO2ZvcihsZXQgbz0wO288MTY7KytvKWVbbitvXT10W3JdK3Rbb119cmV0dXJuIGV9KCk7ZnVuY3Rpb24gZGVmaW5lQmlnSW50TWV0aG9kKHQpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgQmlnSW50P0J1ZmZlckJpZ0ludE5vdERlZmluZWQ6dH1mdW5jdGlvbiBCdWZmZXJCaWdJbnROb3REZWZpbmVkKCl7dGhyb3cgbmV3IEVycm9yKCJCaWdJbnQgbm90IHN1cHBvcnRlZCIpfX0sMzE0NCh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNjc0Myksbz1yKDEwMDIpLGk9cig3NiksYT1yKDcxMTkpO3QuZXhwb3J0cz1hfHxuLmNhbGwoaSxvKX0sNDU4Nih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNjc0Myksbz1yKDEwMDIpLGk9cigzMTQ0KTt0LmV4cG9ydHM9ZnVuY3Rpb24gYXBwbHlCaW5kKCl7cmV0dXJuIGkobixvLGFyZ3VtZW50cyl9fSwxMDAyKHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5fSw3Nih0KXsidXNlIHN0cmljdCI7dC5leHBvcnRzPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsfSwzMTI2KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig2NzQzKSxvPXIoOTY3NSksaT1yKDc2KSxhPXIoMzE0NCk7dC5leHBvcnRzPWZ1bmN0aW9uIGNhbGxCaW5kQmFzaWModCl7aWYodC5sZW5ndGg8MXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbMF0pdGhyb3cgbmV3IG8oImEgZnVuY3Rpb24gaXMgcmVxdWlyZWQiKTtyZXR1cm4gYShuLGksdCl9fSw3MTE5KHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0JiZSZWZsZWN0LmFwcGx5fSw0ODcodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDY4OTcpLG89cig2NTUpLGk9cigzMTI2KSxhPXIoNDU4Nik7dC5leHBvcnRzPWZ1bmN0aW9uIGNhbGxCaW5kKHQpe3ZhciBlPWkoYXJndW1lbnRzKSxyPXQubGVuZ3RoLShhcmd1bWVudHMubGVuZ3RoLTEpO3JldHVybiBuKGUsMSsocj4wP3I6MCksITApfSxvP28odC5leHBvcnRzLCJhcHBseSIse3ZhbHVlOmF9KTp0LmV4cG9ydHMuYXBwbHk9YX0sNjU1Nih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNDUzKSxvPXIoMzEyNiksaT1vKFtuKCIlU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mJSIpXSk7dC5leHBvcnRzPWZ1bmN0aW9uIGNhbGxCb3VuZEludHJpbnNpYyh0LGUpe3ZhciByPW4odCwhIWUpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByJiZpKHQsIi5wcm90b3R5cGUuIik+LTE/byhbcl0pOnJ9fSwyMjA1KHQsZSxyKXt2YXIgbjtuPXZvaWQgMCE9PXIuZz9yLmc6dGhpcyx0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodC5DU1MmJnQuQ1NTLmVzY2FwZSlyZXR1cm4gdC5DU1MuZXNjYXBlO3ZhciBjc3NFc2NhcGU9ZnVuY3Rpb24odCl7aWYoMD09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgQ1NTLmVzY2FwZWAgcmVxdWlyZXMgYW4gYXJndW1lbnQuIik7Zm9yKHZhciBlLHI9U3RyaW5nKHQpLG49ci5sZW5ndGgsbz0tMSxpPSIiLGE9ci5jaGFyQ29kZUF0KDApOysrbzxuOykwIT0oZT1yLmNoYXJDb2RlQXQobykpP2krPWU+PTEmJmU8PTMxfHwxMjc9PWV8fDA9PW8mJmU+PTQ4JiZlPD01N3x8MT09byYmZT49NDgmJmU8PTU3JiY0NT09YT8iXFwiK2UudG9TdHJpbmcoMTYpKyIgIjowPT1vJiYxPT1uJiY0NT09ZXx8IShlPj0xMjh8fDQ1PT1lfHw5NT09ZXx8ZT49NDgmJmU8PTU3fHxlPj02NSYmZTw9OTB8fGU+PTk3JiZlPD0xMjIpPyJcXCIrci5jaGFyQXQobyk6ci5jaGFyQXQobyk6aSs9Iu+/vSI7cmV0dXJuIGl9O3JldHVybiB0LkNTU3x8KHQuQ1NTPXt9KSx0LkNTUy5lc2NhcGU9Y3NzRXNjYXBlLGNzc0VzY2FwZX0obil9LDQxKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig2NTUpLG89cig4MDY4KSxpPXIoOTY3NSksYT1yKDU3OTUpO3QuZXhwb3J0cz1mdW5jdGlvbiBkZWZpbmVEYXRhUHJvcGVydHkodCxlLHIpe2lmKCF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBpKCJgb2JqYCBtdXN0IGJlIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uYCIpO2lmKCJzdHJpbmciIT10eXBlb2YgZSYmInN5bWJvbCIhPXR5cGVvZiBlKXRocm93IG5ldyBpKCJgcHJvcGVydHlgIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2xgIik7aWYoYXJndW1lbnRzLmxlbmd0aD4zJiYiYm9vbGVhbiIhPXR5cGVvZiBhcmd1bWVudHNbM10mJm51bGwhPT1hcmd1bWVudHNbM10pdGhyb3cgbmV3IGkoImBub25FbnVtZXJhYmxlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuIG9yIG51bGwiKTtpZihhcmd1bWVudHMubGVuZ3RoPjQmJiJib29sZWFuIiE9dHlwZW9mIGFyZ3VtZW50c1s0XSYmbnVsbCE9PWFyZ3VtZW50c1s0XSl0aHJvdyBuZXcgaSgiYG5vbldyaXRhYmxlYCwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYSBib29sZWFuIG9yIG51bGwiKTtpZihhcmd1bWVudHMubGVuZ3RoPjUmJiJib29sZWFuIiE9dHlwZW9mIGFyZ3VtZW50c1s1XSYmbnVsbCE9PWFyZ3VtZW50c1s1XSl0aHJvdyBuZXcgaSgiYG5vbkNvbmZpZ3VyYWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsIik7aWYoYXJndW1lbnRzLmxlbmd0aD42JiYiYm9vbGVhbiIhPXR5cGVvZiBhcmd1bWVudHNbNl0pdGhyb3cgbmV3IGkoImBsb29zZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiIpO3ZhciBzPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106bnVsbCx1PWFyZ3VtZW50cy5sZW5ndGg+ND9hcmd1bWVudHNbNF06bnVsbCxjPWFyZ3VtZW50cy5sZW5ndGg+NT9hcmd1bWVudHNbNV06bnVsbCxmPWFyZ3VtZW50cy5sZW5ndGg+NiYmYXJndW1lbnRzWzZdLGw9ISFhJiZhKHQsZSk7aWYobiluKHQsZSx7Y29uZmlndXJhYmxlOm51bGw9PT1jJiZsP2wuY29uZmlndXJhYmxlOiFjLGVudW1lcmFibGU6bnVsbD09PXMmJmw/bC5lbnVtZXJhYmxlOiFzLHZhbHVlOnIsd3JpdGFibGU6bnVsbD09PXUmJmw/bC53cml0YWJsZTohdX0pO2Vsc2V7aWYoIWYmJihzfHx1fHxjKSl0aHJvdyBuZXcgbygiVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IGRlZmluaW5nIGEgcHJvcGVydHkgYXMgbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlLCBvciBub24tZW51bWVyYWJsZS4iKTt0W2VdPXJ9fX0sNzE3Nih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuLG89cigzMTI2KSxpPXIoNTc5NSk7dHJ5e249W10uX19wcm90b19fPT09QXJyYXkucHJvdG90eXBlfWNhdGNoKHQpe2lmKCF0fHwib2JqZWN0IiE9dHlwZW9mIHR8fCEoImNvZGUiaW4gdCl8fCJFUlJfUFJPVE9fQUNDRVNTIiE9PXQuY29kZSl0aHJvdyB0fXZhciBhPSEhbiYmaSYmaShPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKSxzPU9iamVjdCx1PXMuZ2V0UHJvdG90eXBlT2Y7dC5leHBvcnRzPWEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldD9vKFthLmdldF0pOiJmdW5jdGlvbiI9PXR5cGVvZiB1JiZmdW5jdGlvbiBnZXREdW5kZXIodCl7cmV0dXJuIHUobnVsbD09dD90OnModCkpfX0sNjU1KHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1PYmplY3QuZGVmaW5lUHJvcGVydHl8fCExO2lmKGUpdHJ5e2Uoe30sImEiLHt2YWx1ZToxfSl9Y2F0Y2godCl7ZT0hMX10LmV4cG9ydHM9ZX0sMTIzNyh0KXsidXNlIHN0cmljdCI7dC5leHBvcnRzPUV2YWxFcnJvcn0sOTM4Myh0KXsidXNlIHN0cmljdCI7dC5leHBvcnRzPUVycm9yfSw5MjkwKHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9UmFuZ2VFcnJvcn0sOTUzOCh0KXsidXNlIHN0cmljdCI7dC5leHBvcnRzPVJlZmVyZW5jZUVycm9yfSw4MDY4KHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9U3ludGF4RXJyb3J9LDk2NzUodCl7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1UeXBlRXJyb3J9LDUzNDUodCl7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1VUklFcnJvcn0sOTYxMih0KXsidXNlIHN0cmljdCI7dC5leHBvcnRzPU9iamVjdH0sMjY4Mih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoOTYwMCksbz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24gZm9yRWFjaCh0LGUscil7aWYoIW4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7dmFyIGE7YXJndW1lbnRzLmxlbmd0aD49MyYmKGE9ciksZnVuY3Rpb24gaXNBcnJheSh0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09by5jYWxsKHQpfSh0KT9mdW5jdGlvbiBmb3JFYWNoQXJyYXkodCxlLHIpe2Zvcih2YXIgbj0wLG89dC5sZW5ndGg7bjxvO24rKylpLmNhbGwodCxuKSYmKG51bGw9PXI/ZSh0W25dLG4sdCk6ZS5jYWxsKHIsdFtuXSxuLHQpKX0odCxlLGEpOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbiBmb3JFYWNoU3RyaW5nKHQsZSxyKXtmb3IodmFyIG49MCxvPXQubGVuZ3RoO248bztuKyspbnVsbD09cj9lKHQuY2hhckF0KG4pLG4sdCk6ZS5jYWxsKHIsdC5jaGFyQXQobiksbix0KX0odCxlLGEpOmZ1bmN0aW9uIGZvckVhY2hPYmplY3QodCxlLHIpe2Zvcih2YXIgbiBpbiB0KWkuY2FsbCh0LG4pJiYobnVsbD09cj9lKHRbbl0sbix0KTplLmNhbGwocix0W25dLG4sdCkpfSh0LGUsYSl9fSw5MzUzKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHI9TWF0aC5tYXgsbj1mdW5jdGlvbiBjb25jYXR0eSh0LGUpe2Zvcih2YXIgcj1bXSxuPTA7bjx0Lmxlbmd0aDtuKz0xKXJbbl09dFtuXTtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rPTEpcltvK3QubGVuZ3RoXT1lW29dO3JldHVybiByfTt0LmV4cG9ydHM9ZnVuY3Rpb24gYmluZCh0KXt2YXIgbz10aGlzO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvfHwiW29iamVjdCBGdW5jdGlvbl0iIT09ZS5hcHBseShvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICIrbyk7Zm9yKHZhciBpLGE9ZnVuY3Rpb24gc2xpY3kodCxlKXtmb3IodmFyIHI9W10sbj1lfHwwLG89MDtuPHQubGVuZ3RoO24rPTEsbys9MSlyW29dPXRbbl07cmV0dXJuIHJ9KGFyZ3VtZW50cywxKSxzPXIoMCxvLmxlbmd0aC1hLmxlbmd0aCksdT1bXSxjPTA7YzxzO2MrKyl1W2NdPSIkIitjO2lmKGk9RnVuY3Rpb24oImJpbmRlciIsInJldHVybiBmdW5jdGlvbiAoIitmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0iIixuPTA7bjx0Lmxlbmd0aDtuKz0xKXIrPXRbbl0sbisxPHQubGVuZ3RoJiYocis9ZSk7cmV0dXJuIHJ9KHUsIiwiKSsiKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0iKSgoZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgaSl7dmFyIGU9by5hcHBseSh0aGlzLG4oYSxhcmd1bWVudHMpKTtyZXR1cm4gT2JqZWN0KGUpPT09ZT9lOnRoaXN9cmV0dXJuIG8uYXBwbHkodCxuKGEsYXJndW1lbnRzKSl9KSksby5wcm90b3R5cGUpe3ZhciBmPWZ1bmN0aW9uIEVtcHR5KCl7fTtmLnByb3RvdHlwZT1vLnByb3RvdHlwZSxpLnByb3RvdHlwZT1uZXcgZixmLnByb3RvdHlwZT1udWxsfXJldHVybiBpfX0sNjc0Myh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoOTM1Myk7dC5leHBvcnRzPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kfHxufSw0NTModCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbixvPXIoOTYxMiksaT1yKDkzODMpLGE9cigxMjM3KSxzPXIoOTI5MCksdT1yKDk1MzgpLGM9cig4MDY4KSxmPXIoOTY3NSksbD1yKDUzNDUpLHA9cigxNTE0KSxoPXIoODk2OCksZD1yKDYxODgpLHk9cig4MDAyKSxfPXIoNTg4MCksZz1yKDQxNCksbT1yKDMwOTMpLHY9RnVuY3Rpb24sZ2V0RXZhbGxlZENvbnN0cnVjdG9yPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdignInVzZSBzdHJpY3QiOyByZXR1cm4gKCcrdCsiKS5jb25zdHJ1Y3RvcjsiKSgpfWNhdGNoKHQpe319LGI9cig1Nzk1KSx3PXIoNjU1KSx0aHJvd1R5cGVFcnJvcj1mdW5jdGlvbigpe3Rocm93IG5ldyBmfSxJPWI/ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHRocm93VHlwZUVycm9yfWNhdGNoKHQpe3RyeXtyZXR1cm4gYihhcmd1bWVudHMsImNhbGxlZSIpLmdldH1jYXRjaCh0KXtyZXR1cm4gdGhyb3dUeXBlRXJyb3J9fX0oKTp0aHJvd1R5cGVFcnJvcix4PXIoNDAzOSkoKSxCPXIoMzYyOCksaz1yKDEwNjQpLEM9cig4NjQ4KSxqPXIoMTAwMikscT1yKDc2KSxMPXt9LFA9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5JiZCP0IoVWludDhBcnJheSk6bixVPXtfX3Byb3RvX186bnVsbCwiJUFnZ3JlZ2F0ZUVycm9yJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBBZ2dyZWdhdGVFcnJvcj9uOkFnZ3JlZ2F0ZUVycm9yLCIlQXJyYXklIjpBcnJheSwiJUFycmF5QnVmZmVyJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBBcnJheUJ1ZmZlcj9uOkFycmF5QnVmZmVyLCIlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUiOngmJkI/QihbXVtTeW1ib2wuaXRlcmF0b3JdKCkpOm4sIiVBc3luY0Zyb21TeW5jSXRlcmF0b3JQcm90b3R5cGUlIjpuLCIlQXN5bmNGdW5jdGlvbiUiOkwsIiVBc3luY0dlbmVyYXRvciUiOkwsIiVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSI6TCwiJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlIjpMLCIlQXRvbWljcyUiOiJ1bmRlZmluZWQiPT10eXBlb2YgQXRvbWljcz9uOkF0b21pY3MsIiVCaWdJbnQlIjoidW5kZWZpbmVkIj09dHlwZW9mIEJpZ0ludD9uOkJpZ0ludCwiJUJpZ0ludDY0QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIEJpZ0ludDY0QXJyYXk/bjpCaWdJbnQ2NEFycmF5LCIlQmlnVWludDY0QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIEJpZ1VpbnQ2NEFycmF5P246QmlnVWludDY0QXJyYXksIiVCb29sZWFuJSI6Qm9vbGVhbiwiJURhdGFWaWV3JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBEYXRhVmlldz9uOkRhdGFWaWV3LCIlRGF0ZSUiOkRhdGUsIiVkZWNvZGVVUkklIjpkZWNvZGVVUkksIiVkZWNvZGVVUklDb21wb25lbnQlIjpkZWNvZGVVUklDb21wb25lbnQsIiVlbmNvZGVVUkklIjplbmNvZGVVUkksIiVlbmNvZGVVUklDb21wb25lbnQlIjplbmNvZGVVUklDb21wb25lbnQsIiVFcnJvciUiOmksIiVldmFsJSI6ZXZhbCwiJUV2YWxFcnJvciUiOmEsIiVGbG9hdDMyQXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIEZsb2F0MzJBcnJheT9uOkZsb2F0MzJBcnJheSwiJUZsb2F0NjRBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgRmxvYXQ2NEFycmF5P246RmxvYXQ2NEFycmF5LCIlRmluYWxpemF0aW9uUmVnaXN0cnklIjoidW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P246RmluYWxpemF0aW9uUmVnaXN0cnksIiVGdW5jdGlvbiUiOnYsIiVHZW5lcmF0b3JGdW5jdGlvbiUiOkwsIiVJbnQ4QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIEludDhBcnJheT9uOkludDhBcnJheSwiJUludDE2QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIEludDE2QXJyYXk/bjpJbnQxNkFycmF5LCIlSW50MzJBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgSW50MzJBcnJheT9uOkludDMyQXJyYXksIiVpc0Zpbml0ZSUiOmlzRmluaXRlLCIlaXNOYU4lIjppc05hTiwiJUl0ZXJhdG9yUHJvdG90eXBlJSI6eCYmQj9CKEIoW11bU3ltYm9sLml0ZXJhdG9yXSgpKSk6biwiJUpTT04lIjoib2JqZWN0Ij09dHlwZW9mIEpTT04/SlNPTjpuLCIlTWFwJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBNYXA/bjpNYXAsIiVNYXBJdGVyYXRvclByb3RvdHlwZSUiOiJ1bmRlZmluZWQiIT10eXBlb2YgTWFwJiZ4JiZCP0IoKG5ldyBNYXApW1N5bWJvbC5pdGVyYXRvcl0oKSk6biwiJU1hdGglIjpNYXRoLCIlTnVtYmVyJSI6TnVtYmVyLCIlT2JqZWN0JSI6bywiJU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IlIjpiLCIlcGFyc2VGbG9hdCUiOnBhcnNlRmxvYXQsIiVwYXJzZUludCUiOnBhcnNlSW50LCIlUHJvbWlzZSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgUHJvbWlzZT9uOlByb21pc2UsIiVQcm94eSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgUHJveHk/bjpQcm94eSwiJVJhbmdlRXJyb3IlIjpzLCIlUmVmZXJlbmNlRXJyb3IlIjp1LCIlUmVmbGVjdCUiOiJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdD9uOlJlZmxlY3QsIiVSZWdFeHAlIjpSZWdFeHAsIiVTZXQlIjoidW5kZWZpbmVkIj09dHlwZW9mIFNldD9uOlNldCwiJVNldEl0ZXJhdG9yUHJvdG90eXBlJSI6InVuZGVmaW5lZCIhPXR5cGVvZiBTZXQmJngmJkI/QigobmV3IFNldClbU3ltYm9sLml0ZXJhdG9yXSgpKTpuLCIlU2hhcmVkQXJyYXlCdWZmZXIlIjoidW5kZWZpbmVkIj09dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyP246U2hhcmVkQXJyYXlCdWZmZXIsIiVTdHJpbmclIjpTdHJpbmcsIiVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUiOngmJkI/QigiIltTeW1ib2wuaXRlcmF0b3JdKCkpOm4sIiVTeW1ib2wlIjp4P1N5bWJvbDpuLCIlU3ludGF4RXJyb3IlIjpjLCIlVGhyb3dUeXBlRXJyb3IlIjpJLCIlVHlwZWRBcnJheSUiOlAsIiVUeXBlRXJyb3IlIjpmLCIlVWludDhBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgVWludDhBcnJheT9uOlVpbnQ4QXJyYXksIiVVaW50OENsYW1wZWRBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXk/bjpVaW50OENsYW1wZWRBcnJheSwiJVVpbnQxNkFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50MTZBcnJheT9uOlVpbnQxNkFycmF5LCIlVWludDMyQXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIFVpbnQzMkFycmF5P246VWludDMyQXJyYXksIiVVUklFcnJvciUiOmwsIiVXZWFrTWFwJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBXZWFrTWFwP246V2Vha01hcCwiJVdlYWtSZWYlIjoidW5kZWZpbmVkIj09dHlwZW9mIFdlYWtSZWY/bjpXZWFrUmVmLCIlV2Vha1NldCUiOiJ1bmRlZmluZWQiPT10eXBlb2YgV2Vha1NldD9uOldlYWtTZXQsIiVGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCUiOnEsIiVGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHklIjpqLCIlT2JqZWN0LmRlZmluZVByb3BlcnR5JSI6dywiJU9iamVjdC5nZXRQcm90b3R5cGVPZiUiOmssIiVNYXRoLmFicyUiOnAsIiVNYXRoLmZsb29yJSI6aCwiJU1hdGgubWF4JSI6ZCwiJU1hdGgubWluJSI6eSwiJU1hdGgucG93JSI6XywiJU1hdGgucm91bmQlIjpnLCIlTWF0aC5zaWduJSI6bSwiJVJlZmxlY3QuZ2V0UHJvdG90eXBlT2YlIjpDfTtpZihCKXRyeXtudWxsLmVycm9yfWNhdGNoKHQpe3ZhciBEPUIoQih0KSk7VVsiJUVycm9yLnByb3RvdHlwZSUiXT1EfXZhciB6PWZ1bmN0aW9uIGRvRXZhbCh0KXt2YXIgZTtpZigiJUFzeW5jRnVuY3Rpb24lIj09PXQpZT1nZXRFdmFsbGVkQ29uc3RydWN0b3IoImFzeW5jIGZ1bmN0aW9uICgpIHt9Iik7ZWxzZSBpZigiJUdlbmVyYXRvckZ1bmN0aW9uJSI9PT10KWU9Z2V0RXZhbGxlZENvbnN0cnVjdG9yKCJmdW5jdGlvbiogKCkge30iKTtlbHNlIGlmKCIlQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUiPT09dCllPWdldEV2YWxsZWRDb25zdHJ1Y3RvcigiYXN5bmMgZnVuY3Rpb24qICgpIHt9Iik7ZWxzZSBpZigiJUFzeW5jR2VuZXJhdG9yJSI9PT10KXt2YXIgcj1kb0V2YWwoIiVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSIpO3ImJihlPXIucHJvdG90eXBlKX1lbHNlIGlmKCIlQXN5bmNJdGVyYXRvclByb3RvdHlwZSUiPT09dCl7dmFyIG49ZG9FdmFsKCIlQXN5bmNHZW5lcmF0b3IlIik7biYmQiYmKGU9QihuLnByb3RvdHlwZSkpfXJldHVybiBVW3RdPWUsZX0sVz17X19wcm90b19fOm51bGwsIiVBcnJheUJ1ZmZlclByb3RvdHlwZSUiOlsiQXJyYXlCdWZmZXIiLCJwcm90b3R5cGUiXSwiJUFycmF5UHJvdG90eXBlJSI6WyJBcnJheSIsInByb3RvdHlwZSJdLCIlQXJyYXlQcm90b19lbnRyaWVzJSI6WyJBcnJheSIsInByb3RvdHlwZSIsImVudHJpZXMiXSwiJUFycmF5UHJvdG9fZm9yRWFjaCUiOlsiQXJyYXkiLCJwcm90b3R5cGUiLCJmb3JFYWNoIl0sIiVBcnJheVByb3RvX2tleXMlIjpbIkFycmF5IiwicHJvdG90eXBlIiwia2V5cyJdLCIlQXJyYXlQcm90b192YWx1ZXMlIjpbIkFycmF5IiwicHJvdG90eXBlIiwidmFsdWVzIl0sIiVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSI6WyJBc3luY0Z1bmN0aW9uIiwicHJvdG90eXBlIl0sIiVBc3luY0dlbmVyYXRvciUiOlsiQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiIsInByb3RvdHlwZSJdLCIlQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlIjpbIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJwcm90b3R5cGUiXSwiJUJvb2xlYW5Qcm90b3R5cGUlIjpbIkJvb2xlYW4iLCJwcm90b3R5cGUiXSwiJURhdGFWaWV3UHJvdG90eXBlJSI6WyJEYXRhVmlldyIsInByb3RvdHlwZSJdLCIlRGF0ZVByb3RvdHlwZSUiOlsiRGF0ZSIsInByb3RvdHlwZSJdLCIlRXJyb3JQcm90b3R5cGUlIjpbIkVycm9yIiwicHJvdG90eXBlIl0sIiVFdmFsRXJyb3JQcm90b3R5cGUlIjpbIkV2YWxFcnJvciIsInByb3RvdHlwZSJdLCIlRmxvYXQzMkFycmF5UHJvdG90eXBlJSI6WyJGbG9hdDMyQXJyYXkiLCJwcm90b3R5cGUiXSwiJUZsb2F0NjRBcnJheVByb3RvdHlwZSUiOlsiRmxvYXQ2NEFycmF5IiwicHJvdG90eXBlIl0sIiVGdW5jdGlvblByb3RvdHlwZSUiOlsiRnVuY3Rpb24iLCJwcm90b3R5cGUiXSwiJUdlbmVyYXRvciUiOlsiR2VuZXJhdG9yRnVuY3Rpb24iLCJwcm90b3R5cGUiXSwiJUdlbmVyYXRvclByb3RvdHlwZSUiOlsiR2VuZXJhdG9yRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJwcm90b3R5cGUiXSwiJUludDhBcnJheVByb3RvdHlwZSUiOlsiSW50OEFycmF5IiwicHJvdG90eXBlIl0sIiVJbnQxNkFycmF5UHJvdG90eXBlJSI6WyJJbnQxNkFycmF5IiwicHJvdG90eXBlIl0sIiVJbnQzMkFycmF5UHJvdG90eXBlJSI6WyJJbnQzMkFycmF5IiwicHJvdG90eXBlIl0sIiVKU09OUGFyc2UlIjpbIkpTT04iLCJwYXJzZSJdLCIlSlNPTlN0cmluZ2lmeSUiOlsiSlNPTiIsInN0cmluZ2lmeSJdLCIlTWFwUHJvdG90eXBlJSI6WyJNYXAiLCJwcm90b3R5cGUiXSwiJU51bWJlclByb3RvdHlwZSUiOlsiTnVtYmVyIiwicHJvdG90eXBlIl0sIiVPYmplY3RQcm90b3R5cGUlIjpbIk9iamVjdCIsInByb3RvdHlwZSJdLCIlT2JqUHJvdG9fdG9TdHJpbmclIjpbIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIl0sIiVPYmpQcm90b192YWx1ZU9mJSI6WyJPYmplY3QiLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIl0sIiVQcm9taXNlUHJvdG90eXBlJSI6WyJQcm9taXNlIiwicHJvdG90eXBlIl0sIiVQcm9taXNlUHJvdG9fdGhlbiUiOlsiUHJvbWlzZSIsInByb3RvdHlwZSIsInRoZW4iXSwiJVByb21pc2VfYWxsJSI6WyJQcm9taXNlIiwiYWxsIl0sIiVQcm9taXNlX3JlamVjdCUiOlsiUHJvbWlzZSIsInJlamVjdCJdLCIlUHJvbWlzZV9yZXNvbHZlJSI6WyJQcm9taXNlIiwicmVzb2x2ZSJdLCIlUmFuZ2VFcnJvclByb3RvdHlwZSUiOlsiUmFuZ2VFcnJvciIsInByb3RvdHlwZSJdLCIlUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlIjpbIlJlZmVyZW5jZUVycm9yIiwicHJvdG90eXBlIl0sIiVSZWdFeHBQcm90b3R5cGUlIjpbIlJlZ0V4cCIsInByb3RvdHlwZSJdLCIlU2V0UHJvdG90eXBlJSI6WyJTZXQiLCJwcm90b3R5cGUiXSwiJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSI6WyJTaGFyZWRBcnJheUJ1ZmZlciIsInByb3RvdHlwZSJdLCIlU3RyaW5nUHJvdG90eXBlJSI6WyJTdHJpbmciLCJwcm90b3R5cGUiXSwiJVN5bWJvbFByb3RvdHlwZSUiOlsiU3ltYm9sIiwicHJvdG90eXBlIl0sIiVTeW50YXhFcnJvclByb3RvdHlwZSUiOlsiU3ludGF4RXJyb3IiLCJwcm90b3R5cGUiXSwiJVR5cGVkQXJyYXlQcm90b3R5cGUlIjpbIlR5cGVkQXJyYXkiLCJwcm90b3R5cGUiXSwiJVR5cGVFcnJvclByb3RvdHlwZSUiOlsiVHlwZUVycm9yIiwicHJvdG90eXBlIl0sIiVVaW50OEFycmF5UHJvdG90eXBlJSI6WyJVaW50OEFycmF5IiwicHJvdG90eXBlIl0sIiVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUiOlsiVWludDhDbGFtcGVkQXJyYXkiLCJwcm90b3R5cGUiXSwiJVVpbnQxNkFycmF5UHJvdG90eXBlJSI6WyJVaW50MTZBcnJheSIsInByb3RvdHlwZSJdLCIlVWludDMyQXJyYXlQcm90b3R5cGUlIjpbIlVpbnQzMkFycmF5IiwicHJvdG90eXBlIl0sIiVVUklFcnJvclByb3RvdHlwZSUiOlsiVVJJRXJyb3IiLCJwcm90b3R5cGUiXSwiJVdlYWtNYXBQcm90b3R5cGUlIjpbIldlYWtNYXAiLCJwcm90b3R5cGUiXSwiJVdlYWtTZXRQcm90b3R5cGUlIjpbIldlYWtTZXQiLCJwcm90b3R5cGUiXX0sVj1yKDY3NDMpLEs9cig5OTU3KSwkPVYuY2FsbChxLEFycmF5LnByb3RvdHlwZS5jb25jYXQpLEg9Vi5jYWxsKGosQXJyYXkucHJvdG90eXBlLnNwbGljZSksWT1WLmNhbGwocSxTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpLFo9Vi5jYWxsKHEsU3RyaW5nLnByb3RvdHlwZS5zbGljZSksSj1WLmNhbGwocSxSZWdFeHAucHJvdG90eXBlLmV4ZWMpLHR0PS9bXiUuW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwlJCkpL2csZXQ9L1xcKFxcKT8vZyxydD1mdW5jdGlvbiBnZXRCYXNlSW50cmluc2ljKHQsZSl7dmFyIHIsbj10O2lmKEsoVyxuKSYmKG49IiUiKyhyPVdbbl0pWzBdKyIlIiksSyhVLG4pKXt2YXIgbz1VW25dO2lmKG89PT1MJiYobz16KG4pKSx2b2lkIDA9PT1vJiYhZSl0aHJvdyBuZXcgZigiaW50cmluc2ljICIrdCsiIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlISIpO3JldHVybnthbGlhczpyLG5hbWU6bix2YWx1ZTpvfX10aHJvdyBuZXcgYygiaW50cmluc2ljICIrdCsiIGRvZXMgbm90IGV4aXN0ISIpfTt0LmV4cG9ydHM9ZnVuY3Rpb24gR2V0SW50cmluc2ljKHQsZSl7aWYoInN0cmluZyIhPXR5cGVvZiB0fHwwPT09dC5sZW5ndGgpdGhyb3cgbmV3IGYoImludHJpbnNpYyBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7aWYoYXJndW1lbnRzLmxlbmd0aD4xJiYiYm9vbGVhbiIhPXR5cGVvZiBlKXRocm93IG5ldyBmKCciYWxsb3dNaXNzaW5nIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO2lmKG51bGw9PT1KKC9eJT9bXiVdKiU/JC8sdCkpdGhyb3cgbmV3IGMoImAlYCBtYXkgbm90IGJlIHByZXNlbnQgYW55d2hlcmUgYnV0IGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgaW50cmluc2ljIG5hbWUiKTt2YXIgcj1mdW5jdGlvbiBzdHJpbmdUb1BhdGgodCl7dmFyIGU9Wih0LDAsMSkscj1aKHQsLTEpO2lmKCIlIj09PWUmJiIlIiE9PXIpdGhyb3cgbmV3IGMoImludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgY2xvc2luZyBgJWAiKTtpZigiJSI9PT1yJiYiJSIhPT1lKXRocm93IG5ldyBjKCJpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIG9wZW5pbmcgYCVgIik7dmFyIG49W107cmV0dXJuIFkodCx0dCwoZnVuY3Rpb24odCxlLHIsbyl7bltuLmxlbmd0aF09cj9ZKG8sZXQsIiQxIik6ZXx8dH0pKSxufSh0KSxuPXIubGVuZ3RoPjA/clswXToiIixvPXJ0KCIlIituKyIlIixlKSxpPW8ubmFtZSxhPW8udmFsdWUscz0hMSx1PW8uYWxpYXM7dSYmKG49dVswXSxIKHIsJChbMCwxXSx1KSkpO2Zvcih2YXIgbD0xLHA9ITA7bDxyLmxlbmd0aDtsKz0xKXt2YXIgaD1yW2xdLGQ9WihoLDAsMSkseT1aKGgsLTEpO2lmKCgnIic9PT1kfHwiJyI9PT1kfHwiYCI9PT1kfHwnIic9PT15fHwiJyI9PT15fHwiYCI9PT15KSYmZCE9PXkpdGhyb3cgbmV3IGMoInByb3BlcnR5IG5hbWVzIHdpdGggcXVvdGVzIG11c3QgaGF2ZSBtYXRjaGluZyBxdW90ZXMiKTtpZigiY29uc3RydWN0b3IiIT09aCYmcHx8KHM9ITApLEsoVSxpPSIlIisobis9Ii4iK2gpKyIlIikpYT1VW2ldO2Vsc2UgaWYobnVsbCE9YSl7aWYoIShoIGluIGEpKXtpZighZSl0aHJvdyBuZXcgZigiYmFzZSBpbnRyaW5zaWMgZm9yICIrdCsiIGV4aXN0cywgYnV0IHRoZSBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLiIpO3JldHVybn1pZihiJiZsKzE+PXIubGVuZ3RoKXt2YXIgXz1iKGEsaCk7YT0ocD0hIV8pJiYiZ2V0ImluIF8mJiEoIm9yaWdpbmFsVmFsdWUiaW4gXy5nZXQpP18uZ2V0OmFbaF19ZWxzZSBwPUsoYSxoKSxhPWFbaF07cCYmIXMmJihVW2ldPWEpfX1yZXR1cm4gYX19LDEwNjQodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDk2MTIpO3QuZXhwb3J0cz1uLmdldFByb3RvdHlwZU9mfHxudWxsfSw4NjQ4KHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LmdldFByb3RvdHlwZU9mfHxudWxsfSwzNjI4KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig4NjQ4KSxvPXIoMTA2NCksaT1yKDcxNzYpO3QuZXhwb3J0cz1uP2Z1bmN0aW9uIGdldFByb3RvKHQpe3JldHVybiBuKHQpfTpvP2Z1bmN0aW9uIGdldFByb3RvKHQpe2lmKCF0fHwib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImdldFByb3RvOiBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIG8odCl9Omk/ZnVuY3Rpb24gZ2V0UHJvdG8odCl7cmV0dXJuIGkodCl9Om51bGx9LDY1NDkodCl7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yfSw1Nzk1KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig2NTQ5KTtpZihuKXRyeXtuKFtdLCJsZW5ndGgiKX1jYXRjaCh0KXtuPW51bGx9dC5leHBvcnRzPW59LDU5Mih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNjU1KSxvPWZ1bmN0aW9uIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnMoKXtyZXR1cm4hIW59O28uaGFzQXJyYXlMZW5ndGhEZWZpbmVCdWc9ZnVuY3Rpb24gaGFzQXJyYXlMZW5ndGhEZWZpbmVCdWcoKXtpZighbilyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIDEhPT1uKFtdLCJsZW5ndGgiLHt2YWx1ZToxfSkubGVuZ3RofWNhdGNoKHQpe3JldHVybiEwfX0sdC5leHBvcnRzPW99LDQwMzkodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLG89cigxMzMzKTt0LmV4cG9ydHM9ZnVuY3Rpb24gaGFzTmF0aXZlU3ltYm9scygpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKCJzeW1ib2wiPT10eXBlb2YgbigiZm9vIikmJigic3ltYm9sIj09dHlwZW9mIFN5bWJvbCgiYmFyIikmJm8oKSkpKX19LDEzMzModCl7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1mdW5jdGlvbiBoYXNTeW1ib2xzKCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIFN5bWJvbHx8ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpcmV0dXJuITE7aWYoInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3IpcmV0dXJuITA7dmFyIHQ9e30sZT1TeW1ib2woInRlc3QiKSxyPU9iamVjdChlKTtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuITE7aWYoIltvYmplY3QgU3ltYm9sXSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpcmV0dXJuITE7aWYoIltvYmplY3QgU3ltYm9sXSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocikpcmV0dXJuITE7Zm9yKHZhciBuIGluIHRbZV09NDIsdClyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmtleXMmJjAhPT1PYmplY3Qua2V5cyh0KS5sZW5ndGgpcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzJiYwIT09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkubGVuZ3RoKXJldHVybiExO3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7aWYoMSE9PW8ubGVuZ3RofHxvWzBdIT09ZSlyZXR1cm4hMTtpZighT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHQsZSkpcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ipe3ZhciBpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKTtpZig0MiE9PWkudmFsdWV8fCEwIT09aS5lbnVtZXJhYmxlKXJldHVybiExfXJldHVybiEwfX0sOTA5Mih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMTMzMyk7dC5leHBvcnRzPWZ1bmN0aW9uIGhhc1RvU3RyaW5nVGFnU2hhbXMoKXtyZXR1cm4gbigpJiYhIVN5bWJvbC50b1N0cmluZ1RhZ319LDk5NTcodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbCxvPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksaT1yKDY3NDMpO3QuZXhwb3J0cz1pLmNhbGwobixvKX0sMjUxKHQsZSl7ZS5yZWFkPWZ1bmN0aW9uKHQsZSxyLG4sbyl7dmFyIGksYSxzPTgqby1uLTEsdT0oMTw8cyktMSxjPXU+PjEsZj0tNyxsPXI/by0xOjAscD1yPy0xOjEsaD10W2UrbF07Zm9yKGwrPXAsaT1oJigxPDwtZiktMSxoPj49LWYsZis9cztmPjA7aT0yNTYqaSt0W2UrbF0sbCs9cCxmLT04KTtmb3IoYT1pJigxPDwtZiktMSxpPj49LWYsZis9bjtmPjA7YT0yNTYqYSt0W2UrbF0sbCs9cCxmLT04KTtpZigwPT09aSlpPTEtYztlbHNle2lmKGk9PT11KXJldHVybiBhP05hTjoxLzAqKGg/LTE6MSk7YSs9TWF0aC5wb3coMixuKSxpLT1jfXJldHVybihoPy0xOjEpKmEqTWF0aC5wb3coMixpLW4pfSxlLndyaXRlPWZ1bmN0aW9uKHQsZSxyLG4sbyxpKXt2YXIgYSxzLHUsYz04Kmktby0xLGY9KDE8PGMpLTEsbD1mPj4xLHA9MjM9PT1vP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxoPW4/MDppLTEsZD1uPzE6LTEseT1lPDB8fDA9PT1lJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KHM9aXNOYU4oZSk/MTowLGE9Zik6KGE9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1hKSk8MSYmKGEtLSx1Kj0yKSwoZSs9YStsPj0xP3AvdTpwKk1hdGgucG93KDIsMS1sKSkqdT49MiYmKGErKyx1Lz0yKSxhK2w+PWY/KHM9MCxhPWYpOmErbD49MT8ocz0oZSp1LTEpKk1hdGgucG93KDIsbyksYSs9bCk6KHM9ZSpNYXRoLnBvdygyLGwtMSkqTWF0aC5wb3coMixvKSxhPTApKTtvPj04O3RbcitoXT0yNTUmcyxoKz1kLHMvPTI1NixvLT04KTtmb3IoYT1hPDxvfHMsYys9bztjPjA7dFtyK2hdPTI1NSZhLGgrPWQsYS89MjU2LGMtPTgpO3RbcitoLWRdfD0xMjgqeX19LDk0MDQodCl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBjcmVhdGVDbGFzcyh0LGUpe2UmJih0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSksdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiBJdGVyYWJsZSh0KXtyZXR1cm4gaXNJdGVyYWJsZSh0KT90OlNlcSh0KX1mdW5jdGlvbiBLZXllZEl0ZXJhYmxlKHQpe3JldHVybiBpc0tleWVkKHQpP3Q6S2V5ZWRTZXEodCl9ZnVuY3Rpb24gSW5kZXhlZEl0ZXJhYmxlKHQpe3JldHVybiBpc0luZGV4ZWQodCk/dDpJbmRleGVkU2VxKHQpfWZ1bmN0aW9uIFNldEl0ZXJhYmxlKHQpe3JldHVybiBpc0l0ZXJhYmxlKHQpJiYhaXNBc3NvY2lhdGl2ZSh0KT90OlNldFNlcSh0KX1mdW5jdGlvbiBpc0l0ZXJhYmxlKHQpe3JldHVybiEoIXR8fCF0W2VdKX1mdW5jdGlvbiBpc0tleWVkKHQpe3JldHVybiEoIXR8fCF0W3JdKX1mdW5jdGlvbiBpc0luZGV4ZWQodCl7cmV0dXJuISghdHx8IXRbbl0pfWZ1bmN0aW9uIGlzQXNzb2NpYXRpdmUodCl7cmV0dXJuIGlzS2V5ZWQodCl8fGlzSW5kZXhlZCh0KX1mdW5jdGlvbiBpc09yZGVyZWQodCl7cmV0dXJuISghdHx8IXRbb10pfWNyZWF0ZUNsYXNzKEtleWVkSXRlcmFibGUsSXRlcmFibGUpLGNyZWF0ZUNsYXNzKEluZGV4ZWRJdGVyYWJsZSxJdGVyYWJsZSksY3JlYXRlQ2xhc3MoU2V0SXRlcmFibGUsSXRlcmFibGUpLEl0ZXJhYmxlLmlzSXRlcmFibGU9aXNJdGVyYWJsZSxJdGVyYWJsZS5pc0tleWVkPWlzS2V5ZWQsSXRlcmFibGUuaXNJbmRleGVkPWlzSW5kZXhlZCxJdGVyYWJsZS5pc0Fzc29jaWF0aXZlPWlzQXNzb2NpYXRpdmUsSXRlcmFibGUuaXNPcmRlcmVkPWlzT3JkZXJlZCxJdGVyYWJsZS5LZXllZD1LZXllZEl0ZXJhYmxlLEl0ZXJhYmxlLkluZGV4ZWQ9SW5kZXhlZEl0ZXJhYmxlLEl0ZXJhYmxlLlNldD1TZXRJdGVyYWJsZTt2YXIgZT0iQEBfX0lNTVVUQUJMRV9JVEVSQUJMRV9fQEAiLHI9IkBAX19JTU1VVEFCTEVfS0VZRURfX0BAIixuPSJAQF9fSU1NVVRBQkxFX0lOREVYRURfX0BAIixvPSJAQF9fSU1NVVRBQkxFX09SREVSRURfX0BAIixpPSJkZWxldGUiLGE9NSxzPTE8PGEsdT1zLTEsYz17fSxmPXt2YWx1ZTohMX0sbD17dmFsdWU6ITF9O2Z1bmN0aW9uIE1ha2VSZWYodCl7cmV0dXJuIHQudmFsdWU9ITEsdH1mdW5jdGlvbiBTZXRSZWYodCl7dCYmKHQudmFsdWU9ITApfWZ1bmN0aW9uIE93bmVySUQoKXt9ZnVuY3Rpb24gYXJyQ29weSh0LGUpe2U9ZXx8MDtmb3IodmFyIHI9TWF0aC5tYXgoMCx0Lmxlbmd0aC1lKSxuPW5ldyBBcnJheShyKSxvPTA7bzxyO28rKyluW29dPXRbbytlXTtyZXR1cm4gbn1mdW5jdGlvbiBlbnN1cmVTaXplKHQpe3JldHVybiB2b2lkIDA9PT10LnNpemUmJih0LnNpemU9dC5fX2l0ZXJhdGUocmV0dXJuVHJ1ZSkpLHQuc2l6ZX1mdW5jdGlvbiB3cmFwSW5kZXgodCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpe3ZhciByPWU+Pj4wO2lmKCIiK3IhPT1lfHw0Mjk0OTY3Mjk1PT09cilyZXR1cm4gTmFOO2U9cn1yZXR1cm4gZTwwP2Vuc3VyZVNpemUodCkrZTplfWZ1bmN0aW9uIHJldHVyblRydWUoKXtyZXR1cm4hMH1mdW5jdGlvbiB3aG9sZVNsaWNlKHQsZSxyKXtyZXR1cm4oMD09PXR8fHZvaWQgMCE9PXImJnQ8PS1yKSYmKHZvaWQgMD09PWV8fHZvaWQgMCE9PXImJmU+PXIpfWZ1bmN0aW9uIHJlc29sdmVCZWdpbih0LGUpe3JldHVybiByZXNvbHZlSW5kZXgodCxlLDApfWZ1bmN0aW9uIHJlc29sdmVFbmQodCxlKXtyZXR1cm4gcmVzb2x2ZUluZGV4KHQsZSxlKX1mdW5jdGlvbiByZXNvbHZlSW5kZXgodCxlLHIpe3JldHVybiB2b2lkIDA9PT10P3I6dDwwP01hdGgubWF4KDAsZSt0KTp2b2lkIDA9PT1lP3Q6TWF0aC5taW4oZSx0KX12YXIgcD0wLGg9MSxkPTIseT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IsXz0iQEBpdGVyYXRvciIsZz15fHxfO2Z1bmN0aW9uIEl0ZXJhdG9yKHQpe3RoaXMubmV4dD10fWZ1bmN0aW9uIGl0ZXJhdG9yVmFsdWUodCxlLHIsbil7dmFyIG89MD09PXQ/ZToxPT09dD9yOltlLHJdO3JldHVybiBuP24udmFsdWU9bzpuPXt2YWx1ZTpvLGRvbmU6ITF9LG59ZnVuY3Rpb24gaXRlcmF0b3JEb25lKCl7cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX1mdW5jdGlvbiBoYXNJdGVyYXRvcih0KXtyZXR1cm4hIWdldEl0ZXJhdG9yRm4odCl9ZnVuY3Rpb24gaXNJdGVyYXRvcih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQubmV4dH1mdW5jdGlvbiBnZXRJdGVyYXRvcih0KXt2YXIgZT1nZXRJdGVyYXRvckZuKHQpO3JldHVybiBlJiZlLmNhbGwodCl9ZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbih0KXt2YXIgZT10JiYoeSYmdFt5XXx8dFtfXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIGV9ZnVuY3Rpb24gaXNBcnJheUxpa2UodCl7cmV0dXJuIHQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGh9ZnVuY3Rpb24gU2VxKHQpe3JldHVybiBudWxsPT10P2VtcHR5U2VxdWVuY2UoKTppc0l0ZXJhYmxlKHQpP3QudG9TZXEoKTpzZXFGcm9tVmFsdWUodCl9ZnVuY3Rpb24gS2V5ZWRTZXEodCl7cmV0dXJuIG51bGw9PXQ/ZW1wdHlTZXF1ZW5jZSgpLnRvS2V5ZWRTZXEoKTppc0l0ZXJhYmxlKHQpP2lzS2V5ZWQodCk/dC50b1NlcSgpOnQuZnJvbUVudHJ5U2VxKCk6a2V5ZWRTZXFGcm9tVmFsdWUodCl9ZnVuY3Rpb24gSW5kZXhlZFNlcSh0KXtyZXR1cm4gbnVsbD09dD9lbXB0eVNlcXVlbmNlKCk6aXNJdGVyYWJsZSh0KT9pc0tleWVkKHQpP3QuZW50cnlTZXEoKTp0LnRvSW5kZXhlZFNlcSgpOmluZGV4ZWRTZXFGcm9tVmFsdWUodCl9ZnVuY3Rpb24gU2V0U2VxKHQpe3JldHVybihudWxsPT10P2VtcHR5U2VxdWVuY2UoKTppc0l0ZXJhYmxlKHQpP2lzS2V5ZWQodCk/dC5lbnRyeVNlcSgpOnQ6aW5kZXhlZFNlcUZyb21WYWx1ZSh0KSkudG9TZXRTZXEoKX1JdGVyYXRvci5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iW0l0ZXJhdG9yXSJ9LEl0ZXJhdG9yLktFWVM9cCxJdGVyYXRvci5WQUxVRVM9aCxJdGVyYXRvci5FTlRSSUVTPWQsSXRlcmF0b3IucHJvdG90eXBlLmluc3BlY3Q9SXRlcmF0b3IucHJvdG90eXBlLnRvU291cmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoKX0sSXRlcmF0b3IucHJvdG90eXBlW2ddPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGNyZWF0ZUNsYXNzKFNlcSxJdGVyYWJsZSksU2VxLm9mPWZ1bmN0aW9uKCl7cmV0dXJuIFNlcShhcmd1bWVudHMpfSxTZXEucHJvdG90eXBlLnRvU2VxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LFNlcS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJTZXEgeyIsIn0iKX0sU2VxLnByb3RvdHlwZS5jYWNoZVJlc3VsdD1mdW5jdGlvbigpe3JldHVybiF0aGlzLl9jYWNoZSYmdGhpcy5fX2l0ZXJhdGVVbmNhY2hlZCYmKHRoaXMuX2NhY2hlPXRoaXMuZW50cnlTZXEoKS50b0FycmF5KCksdGhpcy5zaXplPXRoaXMuX2NhY2hlLmxlbmd0aCksdGhpc30sU2VxLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gc2VxSXRlcmF0ZSh0aGlzLHQsZSwhMCl9LFNlcS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe3JldHVybiBzZXFJdGVyYXRvcih0aGlzLHQsZSwhMCl9LGNyZWF0ZUNsYXNzKEtleWVkU2VxLFNlcSksS2V5ZWRTZXEucHJvdG90eXBlLnRvS2V5ZWRTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sY3JlYXRlQ2xhc3MoSW5kZXhlZFNlcSxTZXEpLEluZGV4ZWRTZXEub2Y9ZnVuY3Rpb24oKXtyZXR1cm4gSW5kZXhlZFNlcShhcmd1bWVudHMpfSxJbmRleGVkU2VxLnByb3RvdHlwZS50b0luZGV4ZWRTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sSW5kZXhlZFNlcS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJTZXEgWyIsIl0iKX0sSW5kZXhlZFNlcS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHNlcUl0ZXJhdGUodGhpcyx0LGUsITEpfSxJbmRleGVkU2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHNlcUl0ZXJhdG9yKHRoaXMsdCxlLCExKX0sY3JlYXRlQ2xhc3MoU2V0U2VxLFNlcSksU2V0U2VxLm9mPWZ1bmN0aW9uKCl7cmV0dXJuIFNldFNlcShhcmd1bWVudHMpfSxTZXRTZXEucHJvdG90eXBlLnRvU2V0U2VxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LFNlcS5pc1NlcT1pc1NlcSxTZXEuS2V5ZWQ9S2V5ZWRTZXEsU2VxLlNldD1TZXRTZXEsU2VxLkluZGV4ZWQ9SW5kZXhlZFNlcTt2YXIgbSx2LGIsdz0iQEBfX0lNTVVUQUJMRV9TRVFfX0BAIjtmdW5jdGlvbiBBcnJheVNlcSh0KXt0aGlzLl9hcnJheT10LHRoaXMuc2l6ZT10Lmxlbmd0aH1mdW5jdGlvbiBPYmplY3RTZXEodCl7dmFyIGU9T2JqZWN0LmtleXModCk7dGhpcy5fb2JqZWN0PXQsdGhpcy5fa2V5cz1lLHRoaXMuc2l6ZT1lLmxlbmd0aH1mdW5jdGlvbiBJdGVyYWJsZVNlcSh0KXt0aGlzLl9pdGVyYWJsZT10LHRoaXMuc2l6ZT10Lmxlbmd0aHx8dC5zaXplfWZ1bmN0aW9uIEl0ZXJhdG9yU2VxKHQpe3RoaXMuX2l0ZXJhdG9yPXQsdGhpcy5faXRlcmF0b3JDYWNoZT1bXX1mdW5jdGlvbiBpc1NlcSh0KXtyZXR1cm4hKCF0fHwhdFt3XSl9ZnVuY3Rpb24gZW1wdHlTZXF1ZW5jZSgpe3JldHVybiBtfHwobT1uZXcgQXJyYXlTZXEoW10pKX1mdW5jdGlvbiBrZXllZFNlcUZyb21WYWx1ZSh0KXt2YXIgZT1BcnJheS5pc0FycmF5KHQpP25ldyBBcnJheVNlcSh0KS5mcm9tRW50cnlTZXEoKTppc0l0ZXJhdG9yKHQpP25ldyBJdGVyYXRvclNlcSh0KS5mcm9tRW50cnlTZXEoKTpoYXNJdGVyYXRvcih0KT9uZXcgSXRlcmFibGVTZXEodCkuZnJvbUVudHJ5U2VxKCk6Im9iamVjdCI9PXR5cGVvZiB0P25ldyBPYmplY3RTZXEodCk6dm9pZCAwO2lmKCFlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIEFycmF5IG9yIGl0ZXJhYmxlIG9iamVjdCBvZiBbaywgdl0gZW50cmllcywgb3Iga2V5ZWQgb2JqZWN0OiAiK3QpO3JldHVybiBlfWZ1bmN0aW9uIGluZGV4ZWRTZXFGcm9tVmFsdWUodCl7dmFyIGU9bWF5YmVJbmRleGVkU2VxRnJvbVZhbHVlKHQpO2lmKCFlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIEFycmF5IG9yIGl0ZXJhYmxlIG9iamVjdCBvZiB2YWx1ZXM6ICIrdCk7cmV0dXJuIGV9ZnVuY3Rpb24gc2VxRnJvbVZhbHVlKHQpe3ZhciBlPW1heWJlSW5kZXhlZFNlcUZyb21WYWx1ZSh0KXx8Im9iamVjdCI9PXR5cGVvZiB0JiZuZXcgT2JqZWN0U2VxKHQpO2lmKCFlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIEFycmF5IG9yIGl0ZXJhYmxlIG9iamVjdCBvZiB2YWx1ZXMsIG9yIGtleWVkIG9iamVjdDogIit0KTtyZXR1cm4gZX1mdW5jdGlvbiBtYXliZUluZGV4ZWRTZXFGcm9tVmFsdWUodCl7cmV0dXJuIGlzQXJyYXlMaWtlKHQpP25ldyBBcnJheVNlcSh0KTppc0l0ZXJhdG9yKHQpP25ldyBJdGVyYXRvclNlcSh0KTpoYXNJdGVyYXRvcih0KT9uZXcgSXRlcmFibGVTZXEodCk6dm9pZCAwfWZ1bmN0aW9uIHNlcUl0ZXJhdGUodCxlLHIsbil7dmFyIG89dC5fY2FjaGU7aWYobyl7Zm9yKHZhciBpPW8ubGVuZ3RoLTEsYT0wO2E8PWk7YSsrKXt2YXIgcz1vW3I/aS1hOmFdO2lmKCExPT09ZShzWzFdLG4/c1swXTphLHQpKXJldHVybiBhKzF9cmV0dXJuIGF9cmV0dXJuIHQuX19pdGVyYXRlVW5jYWNoZWQoZSxyKX1mdW5jdGlvbiBzZXFJdGVyYXRvcih0LGUscixuKXt2YXIgbz10Ll9jYWNoZTtpZihvKXt2YXIgaT1vLmxlbmd0aC0xLGE9MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciB0PW9bcj9pLWE6YV07cmV0dXJuIGErKz5pP2l0ZXJhdG9yRG9uZSgpOml0ZXJhdG9yVmFsdWUoZSxuP3RbMF06YS0xLHRbMV0pfSkpfXJldHVybiB0Ll9faXRlcmF0b3JVbmNhY2hlZChlLHIpfWZ1bmN0aW9uIGZyb21KUyh0LGUpe3JldHVybiBlP2Zyb21KU1dpdGgoZSx0LCIiLHsiIjp0fSk6ZnJvbUpTRGVmYXVsdCh0KX1mdW5jdGlvbiBmcm9tSlNXaXRoKHQsZSxyLG4pe3JldHVybiBBcnJheS5pc0FycmF5KGUpP3QuY2FsbChuLHIsSW5kZXhlZFNlcShlKS5tYXAoKGZ1bmN0aW9uKHIsbil7cmV0dXJuIGZyb21KU1dpdGgodCxyLG4sZSl9KSkpOmlzUGxhaW5PYmooZSk/dC5jYWxsKG4scixLZXllZFNlcShlKS5tYXAoKGZ1bmN0aW9uKHIsbil7cmV0dXJuIGZyb21KU1dpdGgodCxyLG4sZSl9KSkpOmV9ZnVuY3Rpb24gZnJvbUpTRGVmYXVsdCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT9JbmRleGVkU2VxKHQpLm1hcChmcm9tSlNEZWZhdWx0KS50b0xpc3QoKTppc1BsYWluT2JqKHQpP0tleWVkU2VxKHQpLm1hcChmcm9tSlNEZWZhdWx0KS50b01hcCgpOnR9ZnVuY3Rpb24gaXNQbGFpbk9iaih0KXtyZXR1cm4gdCYmKHQuY29uc3RydWN0b3I9PT1PYmplY3R8fHZvaWQgMD09PXQuY29uc3RydWN0b3IpfWZ1bmN0aW9uIGlzKHQsZSl7aWYodD09PWV8fHQhPXQmJmUhPWUpcmV0dXJuITA7aWYoIXR8fCFlKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2YmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnZhbHVlT2Ype2lmKCh0PXQudmFsdWVPZigpKT09PShlPWUudmFsdWVPZigpKXx8dCE9dCYmZSE9ZSlyZXR1cm4hMDtpZighdHx8IWUpcmV0dXJuITF9cmV0dXJuISgiZnVuY3Rpb24iIT10eXBlb2YgdC5lcXVhbHN8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLmVxdWFsc3x8IXQuZXF1YWxzKGUpKX1mdW5jdGlvbiBkZWVwRXF1YWwodCxlKXtpZih0PT09ZSlyZXR1cm4hMDtpZighaXNJdGVyYWJsZShlKXx8dm9pZCAwIT09dC5zaXplJiZ2b2lkIDAhPT1lLnNpemUmJnQuc2l6ZSE9PWUuc2l6ZXx8dm9pZCAwIT09dC5fX2hhc2gmJnZvaWQgMCE9PWUuX19oYXNoJiZ0Ll9faGFzaCE9PWUuX19oYXNofHxpc0tleWVkKHQpIT09aXNLZXllZChlKXx8aXNJbmRleGVkKHQpIT09aXNJbmRleGVkKGUpfHxpc09yZGVyZWQodCkhPT1pc09yZGVyZWQoZSkpcmV0dXJuITE7aWYoMD09PXQuc2l6ZSYmMD09PWUuc2l6ZSlyZXR1cm4hMDt2YXIgcj0haXNBc3NvY2lhdGl2ZSh0KTtpZihpc09yZGVyZWQodCkpe3ZhciBuPXQuZW50cmllcygpO3JldHVybiBlLmV2ZXJ5KChmdW5jdGlvbih0LGUpe3ZhciBvPW4ubmV4dCgpLnZhbHVlO3JldHVybiBvJiZpcyhvWzFdLHQpJiYocnx8aXMob1swXSxlKSl9KSkmJm4ubmV4dCgpLmRvbmV9dmFyIG89ITE7aWYodm9pZCAwPT09dC5zaXplKWlmKHZvaWQgMD09PWUuc2l6ZSkiZnVuY3Rpb24iPT10eXBlb2YgdC5jYWNoZVJlc3VsdCYmdC5jYWNoZVJlc3VsdCgpO2Vsc2V7bz0hMDt2YXIgaT10O3Q9ZSxlPWl9dmFyIGE9ITAscz1lLl9faXRlcmF0ZSgoZnVuY3Rpb24oZSxuKXtpZihyPyF0LmhhcyhlKTpvPyFpcyhlLHQuZ2V0KG4sYykpOiFpcyh0LmdldChuLGMpLGUpKXJldHVybiBhPSExLCExfSkpO3JldHVybiBhJiZ0LnNpemU9PT1zfWZ1bmN0aW9uIFJlcGVhdCh0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFJlcGVhdCkpcmV0dXJuIG5ldyBSZXBlYXQodCxlKTtpZih0aGlzLl92YWx1ZT10LHRoaXMuc2l6ZT12b2lkIDA9PT1lPzEvMDpNYXRoLm1heCgwLGUpLDA9PT10aGlzLnNpemUpe2lmKHYpcmV0dXJuIHY7dj10aGlzfX1mdW5jdGlvbiBpbnZhcmlhbnQodCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoZSl9ZnVuY3Rpb24gUmFuZ2UodCxlLHIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFJhbmdlKSlyZXR1cm4gbmV3IFJhbmdlKHQsZSxyKTtpZihpbnZhcmlhbnQoMCE9PXIsIkNhbm5vdCBzdGVwIGEgUmFuZ2UgYnkgMCIpLHQ9dHx8MCx2b2lkIDA9PT1lJiYoZT0xLzApLHI9dm9pZCAwPT09cj8xOk1hdGguYWJzKHIpLGU8dCYmKHI9LXIpLHRoaXMuX3N0YXJ0PXQsdGhpcy5fZW5kPWUsdGhpcy5fc3RlcD1yLHRoaXMuc2l6ZT1NYXRoLm1heCgwLE1hdGguY2VpbCgoZS10KS9yLTEpKzEpLDA9PT10aGlzLnNpemUpe2lmKGIpcmV0dXJuIGI7Yj10aGlzfX1mdW5jdGlvbiBDb2xsZWN0aW9uKCl7dGhyb3cgVHlwZUVycm9yKCJBYnN0cmFjdCIpfWZ1bmN0aW9uIEtleWVkQ29sbGVjdGlvbigpe31mdW5jdGlvbiBJbmRleGVkQ29sbGVjdGlvbigpe31mdW5jdGlvbiBTZXRDb2xsZWN0aW9uKCl7fVNlcS5wcm90b3R5cGVbd109ITAsY3JlYXRlQ2xhc3MoQXJyYXlTZXEsSW5kZXhlZFNlcSksQXJyYXlTZXEucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmhhcyh0KT90aGlzLl9hcnJheVt3cmFwSW5kZXgodGhpcyx0KV06ZX0sQXJyYXlTZXEucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10aGlzLl9hcnJheSxuPXIubGVuZ3RoLTEsbz0wO288PW47bysrKWlmKCExPT09dChyW2U/bi1vOm9dLG8sdGhpcykpcmV0dXJuIG8rMTtyZXR1cm4gb30sQXJyYXlTZXEucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9hcnJheSxuPXIubGVuZ3RoLTEsbz0wO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7cmV0dXJuIG8+bj9pdGVyYXRvckRvbmUoKTppdGVyYXRvclZhbHVlKHQsbyxyW2U/bi1vKys6bysrXSl9KSl9LGNyZWF0ZUNsYXNzKE9iamVjdFNlcSxLZXllZFNlcSksT2JqZWN0U2VxLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZXx8dGhpcy5oYXModCk/dGhpcy5fb2JqZWN0W3RdOmV9LE9iamVjdFNlcS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vYmplY3QuaGFzT3duUHJvcGVydHkodCl9LE9iamVjdFNlcS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuX29iamVjdCxuPXRoaXMuX2tleXMsbz1uLmxlbmd0aC0xLGk9MDtpPD1vO2krKyl7dmFyIGE9bltlP28taTppXTtpZighMT09PXQoclthXSxhLHRoaXMpKXJldHVybiBpKzF9cmV0dXJuIGl9LE9iamVjdFNlcS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX29iamVjdCxuPXRoaXMuX2tleXMsbz1uLmxlbmd0aC0xLGk9MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciBhPW5bZT9vLWk6aV07cmV0dXJuIGkrKz5vP2l0ZXJhdG9yRG9uZSgpOml0ZXJhdG9yVmFsdWUodCxhLHJbYV0pfSkpfSxPYmplY3RTZXEucHJvdG90eXBlW29dPSEwLGNyZWF0ZUNsYXNzKEl0ZXJhYmxlU2VxLEluZGV4ZWRTZXEpLEl0ZXJhYmxlU2VxLnByb3RvdHlwZS5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbih0LGUpe2lmKGUpcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdGUodCxlKTt2YXIgcj1nZXRJdGVyYXRvcih0aGlzLl9pdGVyYWJsZSksbj0wO2lmKGlzSXRlcmF0b3IocikpZm9yKHZhciBvOyEobz1yLm5leHQoKSkuZG9uZSYmITEhPT10KG8udmFsdWUsbisrLHRoaXMpOyk7cmV0dXJuIG59LEl0ZXJhYmxlU2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24odCxlKXtpZihlKXJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRvcih0LGUpO3ZhciByPWdldEl0ZXJhdG9yKHRoaXMuX2l0ZXJhYmxlKTtpZighaXNJdGVyYXRvcihyKSlyZXR1cm4gbmV3IEl0ZXJhdG9yKGl0ZXJhdG9yRG9uZSk7dmFyIG49MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciBlPXIubmV4dCgpO3JldHVybiBlLmRvbmU/ZTppdGVyYXRvclZhbHVlKHQsbisrLGUudmFsdWUpfSkpfSxjcmVhdGVDbGFzcyhJdGVyYXRvclNlcSxJbmRleGVkU2VxKSxJdGVyYXRvclNlcS5wcm90b3R5cGUuX19pdGVyYXRlVW5jYWNoZWQ9ZnVuY3Rpb24odCxlKXtpZihlKXJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRlKHQsZSk7Zm9yKHZhciByLG49dGhpcy5faXRlcmF0b3Isbz10aGlzLl9pdGVyYXRvckNhY2hlLGk9MDtpPG8ubGVuZ3RoOylpZighMT09PXQob1tpXSxpKyssdGhpcykpcmV0dXJuIGk7Zm9yKDshKHI9bi5uZXh0KCkpLmRvbmU7KXt2YXIgYT1yLnZhbHVlO2lmKG9baV09YSwhMT09PXQoYSxpKyssdGhpcykpYnJlYWt9cmV0dXJuIGl9LEl0ZXJhdG9yU2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24odCxlKXtpZihlKXJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRvcih0LGUpO3ZhciByPXRoaXMuX2l0ZXJhdG9yLG49dGhpcy5faXRlcmF0b3JDYWNoZSxvPTA7cmV0dXJuIG5ldyBJdGVyYXRvcigoZnVuY3Rpb24oKXtpZihvPj1uLmxlbmd0aCl7dmFyIGU9ci5uZXh0KCk7aWYoZS5kb25lKXJldHVybiBlO25bb109ZS52YWx1ZX1yZXR1cm4gaXRlcmF0b3JWYWx1ZSh0LG8sbltvKytdKX0pKX0sY3JlYXRlQ2xhc3MoUmVwZWF0LEluZGV4ZWRTZXEpLFJlcGVhdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuc2l6ZT8iUmVwZWF0IFtdIjoiUmVwZWF0IFsgIit0aGlzLl92YWx1ZSsiICIrdGhpcy5zaXplKyIgdGltZXMgXSJ9LFJlcGVhdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaGFzKHQpP3RoaXMuX3ZhbHVlOmV9LFJlcGVhdC5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGlzKHRoaXMuX3ZhbHVlLHQpfSxSZXBlYXQucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5zaXplO3JldHVybiB3aG9sZVNsaWNlKHQsZSxyKT90aGlzOm5ldyBSZXBlYXQodGhpcy5fdmFsdWUscmVzb2x2ZUVuZChlLHIpLXJlc29sdmVCZWdpbih0LHIpKX0sUmVwZWF0LnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LFJlcGVhdC5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0KXtyZXR1cm4gaXModGhpcy5fdmFsdWUsdCk/MDotMX0sUmVwZWF0LnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0KXtyZXR1cm4gaXModGhpcy5fdmFsdWUsdCk/dGhpcy5zaXplOi0xfSxSZXBlYXQucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wO3I8dGhpcy5zaXplO3IrKylpZighMT09PXQodGhpcy5fdmFsdWUscix0aGlzKSlyZXR1cm4gcisxO3JldHVybiByfSxSZXBlYXQucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3JldHVybiBuPHIuc2l6ZT9pdGVyYXRvclZhbHVlKHQsbisrLHIuX3ZhbHVlKTppdGVyYXRvckRvbmUoKX0pKX0sUmVwZWF0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBSZXBlYXQ/aXModGhpcy5fdmFsdWUsdC5fdmFsdWUpOmRlZXBFcXVhbCh0KX0sY3JlYXRlQ2xhc3MoUmFuZ2UsSW5kZXhlZFNlcSksUmFuZ2UucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemU/IlJhbmdlIFtdIjoiUmFuZ2UgWyAiK3RoaXMuX3N0YXJ0KyIuLi4iK3RoaXMuX2VuZCsoMSE9PXRoaXMuX3N0ZXA/IiBieSAiK3RoaXMuX3N0ZXA6IiIpKyIgXSJ9LFJhbmdlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5oYXModCk/dGhpcy5fc3RhcnQrd3JhcEluZGV4KHRoaXMsdCkqdGhpcy5fc3RlcDplfSxSYW5nZS5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCl7dmFyIGU9KHQtdGhpcy5fc3RhcnQpL3RoaXMuX3N0ZXA7cmV0dXJuIGU+PTAmJmU8dGhpcy5zaXplJiZlPT09TWF0aC5mbG9vcihlKX0sUmFuZ2UucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHdob2xlU2xpY2UodCxlLHRoaXMuc2l6ZSk/dGhpczoodD1yZXNvbHZlQmVnaW4odCx0aGlzLnNpemUpLChlPXJlc29sdmVFbmQoZSx0aGlzLnNpemUpKTw9dD9uZXcgUmFuZ2UoMCwwKTpuZXcgUmFuZ2UodGhpcy5nZXQodCx0aGlzLl9lbmQpLHRoaXMuZ2V0KGUsdGhpcy5fZW5kKSx0aGlzLl9zdGVwKSl9LFJhbmdlLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQpe3ZhciBlPXQtdGhpcy5fc3RhcnQ7aWYoZSV0aGlzLl9zdGVwPT0wKXt2YXIgcj1lL3RoaXMuX3N0ZXA7aWYocj49MCYmcjx0aGlzLnNpemUpcmV0dXJuIHJ9cmV0dXJuLTF9LFJhbmdlLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbmRleE9mKHQpfSxSYW5nZS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuc2l6ZS0xLG49dGhpcy5fc3RlcCxvPWU/dGhpcy5fc3RhcnQrcipuOnRoaXMuX3N0YXJ0LGk9MDtpPD1yO2krKyl7aWYoITE9PT10KG8saSx0aGlzKSlyZXR1cm4gaSsxO28rPWU/LW46bn1yZXR1cm4gaX0sUmFuZ2UucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnNpemUtMSxuPXRoaXMuX3N0ZXAsbz1lP3RoaXMuX3N0YXJ0K3Iqbjp0aGlzLl9zdGFydCxpPTA7cmV0dXJuIG5ldyBJdGVyYXRvcigoZnVuY3Rpb24oKXt2YXIgYT1vO3JldHVybiBvKz1lPy1uOm4saT5yP2l0ZXJhdG9yRG9uZSgpOml0ZXJhdG9yVmFsdWUodCxpKyssYSl9KSl9LFJhbmdlLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBSYW5nZT90aGlzLl9zdGFydD09PXQuX3N0YXJ0JiZ0aGlzLl9lbmQ9PT10Ll9lbmQmJnRoaXMuX3N0ZXA9PT10Ll9zdGVwOmRlZXBFcXVhbCh0aGlzLHQpfSxjcmVhdGVDbGFzcyhDb2xsZWN0aW9uLEl0ZXJhYmxlKSxjcmVhdGVDbGFzcyhLZXllZENvbGxlY3Rpb24sQ29sbGVjdGlvbiksY3JlYXRlQ2xhc3MoSW5kZXhlZENvbGxlY3Rpb24sQ29sbGVjdGlvbiksY3JlYXRlQ2xhc3MoU2V0Q29sbGVjdGlvbixDb2xsZWN0aW9uKSxDb2xsZWN0aW9uLktleWVkPUtleWVkQ29sbGVjdGlvbixDb2xsZWN0aW9uLkluZGV4ZWQ9SW5kZXhlZENvbGxlY3Rpb24sQ29sbGVjdGlvbi5TZXQ9U2V0Q29sbGVjdGlvbjt2YXIgST0iZnVuY3Rpb24iPT10eXBlb2YgTWF0aC5pbXVsJiYtMj09PU1hdGguaW11bCg0Mjk0OTY3Mjk1LDIpP01hdGguaW11bDpmdW5jdGlvbiBpbXVsKHQsZSl7dmFyIHI9NjU1MzUmKHR8PTApLG49NjU1MzUmKGV8PTApO3JldHVybiByKm4rKCh0Pj4+MTYpKm4rciooZT4+PjE2KTw8MTY+Pj4wKXwwfTtmdW5jdGlvbiBzbWkodCl7cmV0dXJuIHQ+Pj4xJjEwNzM3NDE4MjR8MzIyMTIyNTQ3MSZ0fWZ1bmN0aW9uIGhhc2godCl7aWYoITE9PT10fHxudWxsPT10KXJldHVybiAwO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2YmJighMT09PSh0PXQudmFsdWVPZigpKXx8bnVsbD09dCkpcmV0dXJuIDA7aWYoITA9PT10KXJldHVybiAxO3ZhciBlPXR5cGVvZiB0O2lmKCJudW1iZXIiPT09ZSl7aWYodCE9dHx8dD09PTEvMClyZXR1cm4gMDt2YXIgcj0wfHQ7Zm9yKHIhPT10JiYocl49NDI5NDk2NzI5NSp0KTt0PjQyOTQ5NjcyOTU7KXJePXQvPTQyOTQ5NjcyOTU7cmV0dXJuIHNtaShyKX1pZigic3RyaW5nIj09PWUpcmV0dXJuIHQubGVuZ3RoPkw/Y2FjaGVkSGFzaFN0cmluZyh0KTpoYXNoU3RyaW5nKHQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lmhhc2hDb2RlKXJldHVybiB0Lmhhc2hDb2RlKCk7aWYoIm9iamVjdCI9PT1lKXJldHVybiBoYXNoSlNPYmoodCk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQudG9TdHJpbmcpcmV0dXJuIGhhc2hTdHJpbmcodC50b1N0cmluZygpKTt0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIHR5cGUgIitlKyIgY2Fubm90IGJlIGhhc2hlZC4iKX1mdW5jdGlvbiBjYWNoZWRIYXNoU3RyaW5nKHQpe3ZhciBlPURbdF07cmV0dXJuIHZvaWQgMD09PWUmJihlPWhhc2hTdHJpbmcodCksVT09PVAmJihVPTAsRD17fSksVSsrLERbdF09ZSksZX1mdW5jdGlvbiBoYXNoU3RyaW5nKHQpe2Zvcih2YXIgZT0wLHI9MDtyPHQubGVuZ3RoO3IrKyllPTMxKmUrdC5jaGFyQ29kZUF0KHIpfDA7cmV0dXJuIHNtaShlKX1mdW5jdGlvbiBoYXNoSlNPYmoodCl7dmFyIGU7aWYoQyYmdm9pZCAwIT09KGU9ay5nZXQodCkpKXJldHVybiBlO2lmKHZvaWQgMCE9PShlPXRbcV0pKXJldHVybiBlO2lmKCFCKXtpZih2b2lkIDAhPT0oZT10LnByb3BlcnR5SXNFbnVtZXJhYmxlJiZ0LnByb3BlcnR5SXNFbnVtZXJhYmxlW3FdKSlyZXR1cm4gZTtpZih2b2lkIDAhPT0oZT1nZXRJRU5vZGVIYXNoKHQpKSlyZXR1cm4gZX1pZihlPSsraiwxMDczNzQxODI0JmomJihqPTApLEMpay5zZXQodCxlKTtlbHNle2lmKHZvaWQgMCE9PXgmJiExPT09eCh0KSl0aHJvdyBuZXcgRXJyb3IoIk5vbi1leHRlbnNpYmxlIG9iamVjdHMgYXJlIG5vdCBhbGxvd2VkIGFzIGtleXMuIik7aWYoQilPYmplY3QuZGVmaW5lUHJvcGVydHkodCxxLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSx3cml0YWJsZTohMSx2YWx1ZTplfSk7ZWxzZSBpZih2b2lkIDAhPT10LnByb3BlcnR5SXNFbnVtZXJhYmxlJiZ0LnByb3BlcnR5SXNFbnVtZXJhYmxlPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUpdC5wcm9wZXJ0eUlzRW51bWVyYWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHQucHJvcGVydHlJc0VudW1lcmFibGVbcV09ZTtlbHNle2lmKHZvaWQgMD09PXQubm9kZVR5cGUpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gc2V0IGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgb24gb2JqZWN0LiIpO3RbcV09ZX19cmV0dXJuIGV9dmFyIHg9T2JqZWN0LmlzRXh0ZW5zaWJsZSxCPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIkAiLHt9KSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7ZnVuY3Rpb24gZ2V0SUVOb2RlSGFzaCh0KXtpZih0JiZ0Lm5vZGVUeXBlPjApc3dpdGNoKHQubm9kZVR5cGUpe2Nhc2UgMTpyZXR1cm4gdC51bmlxdWVJRDtjYXNlIDk6cmV0dXJuIHQuZG9jdW1lbnRFbGVtZW50JiZ0LmRvY3VtZW50RWxlbWVudC51bmlxdWVJRH19dmFyIGssQz0iZnVuY3Rpb24iPT10eXBlb2YgV2Vha01hcDtDJiYoaz1uZXcgV2Vha01hcCk7dmFyIGo9MCxxPSJfX2ltbXV0YWJsZWhhc2hfXyI7ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKHE9U3ltYm9sKHEpKTt2YXIgTD0xNixQPTI1NSxVPTAsRD17fTtmdW5jdGlvbiBhc3NlcnROb3RJbmZpbml0ZSh0KXtpbnZhcmlhbnQodCE9PTEvMCwiQ2Fubm90IHBlcmZvcm0gdGhpcyBhY3Rpb24gd2l0aCBhbiBpbmZpbml0ZSBzaXplLiIpfWZ1bmN0aW9uIE1hcCh0KXtyZXR1cm4gbnVsbD09dD9lbXB0eU1hcCgpOmlzTWFwKHQpJiYhaXNPcmRlcmVkKHQpP3Q6ZW1wdHlNYXAoKS53aXRoTXV0YXRpb25zKChmdW5jdGlvbihlKXt2YXIgcj1LZXllZEl0ZXJhYmxlKHQpO2Fzc2VydE5vdEluZmluaXRlKHIuc2l6ZSksci5mb3JFYWNoKChmdW5jdGlvbih0LHIpe3JldHVybiBlLnNldChyLHQpfSkpfSkpfWZ1bmN0aW9uIGlzTWFwKHQpe3JldHVybiEoIXR8fCF0W1ddKX1jcmVhdGVDbGFzcyhNYXAsS2V5ZWRDb2xsZWN0aW9uKSxNYXAub2Y9ZnVuY3Rpb24oKXt2YXIgZT10LmNhbGwoYXJndW1lbnRzLDApO3JldHVybiBlbXB0eU1hcCgpLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cis9Mil7aWYocisxPj1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgdmFsdWUgZm9yIGtleTogIitlW3JdKTt0LnNldChlW3JdLGVbcisxXSl9fSkpfSxNYXAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiTWFwIHsiLCJ9Iil9LE1hcC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3Jvb3Q/dGhpcy5fcm9vdC5nZXQoMCx2b2lkIDAsdCxlKTplfSxNYXAucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3JldHVybiB1cGRhdGVNYXAodGhpcyx0LGUpfSxNYXAucHJvdG90eXBlLnNldEluPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudXBkYXRlSW4odCxjLChmdW5jdGlvbigpe3JldHVybiBlfSkpfSxNYXAucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtyZXR1cm4gdXBkYXRlTWFwKHRoaXMsdCxjKX0sTWFwLnByb3RvdHlwZS5kZWxldGVJbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVJbih0LChmdW5jdGlvbigpe3JldHVybiBjfSkpfSxNYXAucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3QodGhpcyk6dGhpcy51cGRhdGVJbihbdF0sZSxyKX0sTWFwLnByb3RvdHlwZS51cGRhdGVJbj1mdW5jdGlvbih0LGUscil7cnx8KHI9ZSxlPXZvaWQgMCk7dmFyIG49dXBkYXRlSW5EZWVwTWFwKHRoaXMsZm9yY2VJdGVyYXRvcih0KSxlLHIpO3JldHVybiBuPT09Yz92b2lkIDA6bn0sTWFwLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5zaXplP3RoaXM6dGhpcy5fX293bmVySUQ/KHRoaXMuc2l6ZT0wLHRoaXMuX3Jvb3Q9bnVsbCx0aGlzLl9faGFzaD12b2lkIDAsdGhpcy5fX2FsdGVyZWQ9ITAsdGhpcyk6ZW1wdHlNYXAoKX0sTWFwLnByb3RvdHlwZS5tZXJnZT1mdW5jdGlvbigpe3JldHVybiBtZXJnZUludG9NYXBXaXRoKHRoaXMsdm9pZCAwLGFyZ3VtZW50cyl9LE1hcC5wcm90b3R5cGUubWVyZ2VXaXRoPWZ1bmN0aW9uKGUpe3JldHVybiBtZXJnZUludG9NYXBXaXRoKHRoaXMsZSx0LmNhbGwoYXJndW1lbnRzLDEpKX0sTWFwLnByb3RvdHlwZS5tZXJnZUluPWZ1bmN0aW9uKGUpe3ZhciByPXQuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIHRoaXMudXBkYXRlSW4oZSxlbXB0eU1hcCgpLChmdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdC5tZXJnZT90Lm1lcmdlLmFwcGx5KHQscik6cltyLmxlbmd0aC0xXX0pKX0sTWFwLnByb3RvdHlwZS5tZXJnZURlZXA9ZnVuY3Rpb24oKXtyZXR1cm4gbWVyZ2VJbnRvTWFwV2l0aCh0aGlzLGRlZXBNZXJnZXIsYXJndW1lbnRzKX0sTWFwLnByb3RvdHlwZS5tZXJnZURlZXBXaXRoPWZ1bmN0aW9uKGUpe3ZhciByPXQuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIG1lcmdlSW50b01hcFdpdGgodGhpcyxkZWVwTWVyZ2VyV2l0aChlKSxyKX0sTWFwLnByb3RvdHlwZS5tZXJnZURlZXBJbj1mdW5jdGlvbihlKXt2YXIgcj10LmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0aGlzLnVwZGF0ZUluKGUsZW1wdHlNYXAoKSwoZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQubWVyZ2VEZWVwP3QubWVyZ2VEZWVwLmFwcGx5KHQscik6cltyLmxlbmd0aC0xXX0pKX0sTWFwLnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBPcmRlcmVkTWFwKHNvcnRGYWN0b3J5KHRoaXMsdCkpfSxNYXAucHJvdG90eXBlLnNvcnRCeT1mdW5jdGlvbih0LGUpe3JldHVybiBPcmRlcmVkTWFwKHNvcnRGYWN0b3J5KHRoaXMsZSx0KSl9LE1hcC5wcm90b3R5cGUud2l0aE11dGF0aW9ucz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmFzTXV0YWJsZSgpO3JldHVybiB0KGUpLGUud2FzQWx0ZXJlZCgpP2UuX19lbnN1cmVPd25lcih0aGlzLl9fb3duZXJJRCk6dGhpc30sTWFwLnByb3RvdHlwZS5hc011dGFibGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX293bmVySUQ/dGhpczp0aGlzLl9fZW5zdXJlT3duZXIobmV3IE93bmVySUQpfSxNYXAucHJvdG90eXBlLmFzSW1tdXRhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19lbnN1cmVPd25lcigpfSxNYXAucHJvdG90eXBlLndhc0FsdGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2FsdGVyZWR9LE1hcC5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcyx0LGUpfSxNYXAucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsbj0wO3JldHVybiB0aGlzLl9yb290JiZ0aGlzLl9yb290Lml0ZXJhdGUoKGZ1bmN0aW9uKGUpe3JldHVybiBuKyssdChlWzFdLGVbMF0scil9KSxlKSxufSxNYXAucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT10aGlzLl9fb3duZXJJRD90aGlzOnQ/bWFrZU1hcCh0aGlzLnNpemUsdGhpcy5fcm9vdCx0LHRoaXMuX19oYXNoKToodGhpcy5fX293bmVySUQ9dCx0aGlzLl9fYWx0ZXJlZD0hMSx0aGlzKX0sTWFwLmlzTWFwPWlzTWFwO3ZhciB6LFc9IkBAX19JTU1VVEFCTEVfTUFQX19AQCIsVj1NYXAucHJvdG90eXBlO2Z1bmN0aW9uIEFycmF5TWFwTm9kZSh0LGUpe3RoaXMub3duZXJJRD10LHRoaXMuZW50cmllcz1lfWZ1bmN0aW9uIEJpdG1hcEluZGV4ZWROb2RlKHQsZSxyKXt0aGlzLm93bmVySUQ9dCx0aGlzLmJpdG1hcD1lLHRoaXMubm9kZXM9cn1mdW5jdGlvbiBIYXNoQXJyYXlNYXBOb2RlKHQsZSxyKXt0aGlzLm93bmVySUQ9dCx0aGlzLmNvdW50PWUsdGhpcy5ub2Rlcz1yfWZ1bmN0aW9uIEhhc2hDb2xsaXNpb25Ob2RlKHQsZSxyKXt0aGlzLm93bmVySUQ9dCx0aGlzLmtleUhhc2g9ZSx0aGlzLmVudHJpZXM9cn1mdW5jdGlvbiBWYWx1ZU5vZGUodCxlLHIpe3RoaXMub3duZXJJRD10LHRoaXMua2V5SGFzaD1lLHRoaXMuZW50cnk9cn1mdW5jdGlvbiBNYXBJdGVyYXRvcih0LGUscil7dGhpcy5fdHlwZT1lLHRoaXMuX3JldmVyc2U9cix0aGlzLl9zdGFjaz10Ll9yb290JiZtYXBJdGVyYXRvckZyYW1lKHQuX3Jvb3QpfWZ1bmN0aW9uIG1hcEl0ZXJhdG9yVmFsdWUodCxlKXtyZXR1cm4gaXRlcmF0b3JWYWx1ZSh0LGVbMF0sZVsxXSl9ZnVuY3Rpb24gbWFwSXRlcmF0b3JGcmFtZSh0LGUpe3JldHVybntub2RlOnQsaW5kZXg6MCxfX3ByZXY6ZX19ZnVuY3Rpb24gbWFrZU1hcCh0LGUscixuKXt2YXIgbz1PYmplY3QuY3JlYXRlKFYpO3JldHVybiBvLnNpemU9dCxvLl9yb290PWUsby5fX293bmVySUQ9cixvLl9faGFzaD1uLG8uX19hbHRlcmVkPSExLG99ZnVuY3Rpb24gZW1wdHlNYXAoKXtyZXR1cm4genx8KHo9bWFrZU1hcCgwKSl9ZnVuY3Rpb24gdXBkYXRlTWFwKHQsZSxyKXt2YXIgbixvO2lmKHQuX3Jvb3Qpe3ZhciBpPU1ha2VSZWYoZiksYT1NYWtlUmVmKGwpO2lmKG49dXBkYXRlTm9kZSh0Ll9yb290LHQuX19vd25lcklELDAsdm9pZCAwLGUscixpLGEpLCFhLnZhbHVlKXJldHVybiB0O289dC5zaXplKyhpLnZhbHVlP3I9PT1jPy0xOjE6MCl9ZWxzZXtpZihyPT09YylyZXR1cm4gdDtvPTEsbj1uZXcgQXJyYXlNYXBOb2RlKHQuX19vd25lcklELFtbZSxyXV0pfXJldHVybiB0Ll9fb3duZXJJRD8odC5zaXplPW8sdC5fcm9vdD1uLHQuX19oYXNoPXZvaWQgMCx0Ll9fYWx0ZXJlZD0hMCx0KTpuP21ha2VNYXAobyxuKTplbXB0eU1hcCgpfWZ1bmN0aW9uIHVwZGF0ZU5vZGUodCxlLHIsbixvLGksYSxzKXtyZXR1cm4gdD90LnVwZGF0ZShlLHIsbixvLGksYSxzKTppPT09Yz90OihTZXRSZWYocyksU2V0UmVmKGEpLG5ldyBWYWx1ZU5vZGUoZSxuLFtvLGldKSl9ZnVuY3Rpb24gaXNMZWFmTm9kZSh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvcj09PVZhbHVlTm9kZXx8dC5jb25zdHJ1Y3Rvcj09PUhhc2hDb2xsaXNpb25Ob2RlfWZ1bmN0aW9uIG1lcmdlSW50b05vZGUodCxlLHIsbixvKXtpZih0LmtleUhhc2g9PT1uKXJldHVybiBuZXcgSGFzaENvbGxpc2lvbk5vZGUoZSxuLFt0LmVudHJ5LG9dKTt2YXIgaSxzPSgwPT09cj90LmtleUhhc2g6dC5rZXlIYXNoPj4+cikmdSxjPSgwPT09cj9uOm4+Pj5yKSZ1O3JldHVybiBuZXcgQml0bWFwSW5kZXhlZE5vZGUoZSwxPDxzfDE8PGMscz09PWM/W21lcmdlSW50b05vZGUodCxlLHIrYSxuLG8pXTooaT1uZXcgVmFsdWVOb2RlKGUsbixvKSxzPGM/W3QsaV06W2ksdF0pKX1mdW5jdGlvbiBjcmVhdGVOb2Rlcyh0LGUscixuKXt0fHwodD1uZXcgT3duZXJJRCk7Zm9yKHZhciBvPW5ldyBWYWx1ZU5vZGUodCxoYXNoKHIpLFtyLG5dKSxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBhPWVbaV07bz1vLnVwZGF0ZSh0LDAsdm9pZCAwLGFbMF0sYVsxXSl9cmV0dXJuIG99ZnVuY3Rpb24gcGFja05vZGVzKHQsZSxyLG4pe2Zvcih2YXIgbz0wLGk9MCxhPW5ldyBBcnJheShyKSxzPTAsdT0xLGM9ZS5sZW5ndGg7czxjO3MrKyx1PDw9MSl7dmFyIGY9ZVtzXTt2b2lkIDAhPT1mJiZzIT09biYmKG98PXUsYVtpKytdPWYpfXJldHVybiBuZXcgQml0bWFwSW5kZXhlZE5vZGUodCxvLGEpfWZ1bmN0aW9uIGV4cGFuZE5vZGVzKHQsZSxyLG4sbyl7Zm9yKHZhciBpPTAsYT1uZXcgQXJyYXkocyksdT0wOzAhPT1yO3UrKyxyPj4+PTEpYVt1XT0xJnI/ZVtpKytdOnZvaWQgMDtyZXR1cm4gYVtuXT1vLG5ldyBIYXNoQXJyYXlNYXBOb2RlKHQsaSsxLGEpfWZ1bmN0aW9uIG1lcmdlSW50b01hcFdpdGgodCxlLHIpe2Zvcih2YXIgbj1bXSxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb10sYT1LZXllZEl0ZXJhYmxlKGkpO2lzSXRlcmFibGUoaSl8fChhPWEubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZnJvbUpTKHQpfSkpKSxuLnB1c2goYSl9cmV0dXJuIG1lcmdlSW50b0NvbGxlY3Rpb25XaXRoKHQsZSxuKX1mdW5jdGlvbiBkZWVwTWVyZ2VyKHQsZSxyKXtyZXR1cm4gdCYmdC5tZXJnZURlZXAmJmlzSXRlcmFibGUoZSk/dC5tZXJnZURlZXAoZSk6aXModCxlKT90OmV9ZnVuY3Rpb24gZGVlcE1lcmdlcldpdGgodCl7cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtpZihlJiZlLm1lcmdlRGVlcFdpdGgmJmlzSXRlcmFibGUocikpcmV0dXJuIGUubWVyZ2VEZWVwV2l0aCh0LHIpO3ZhciBvPXQoZSxyLG4pO3JldHVybiBpcyhlLG8pP2U6b319ZnVuY3Rpb24gbWVyZ2VJbnRvQ29sbGVjdGlvbldpdGgodCxlLHIpe3JldHVybiAwPT09KHI9ci5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiAwIT09dC5zaXplfSkpKS5sZW5ndGg/dDowIT09dC5zaXplfHx0Ll9fb3duZXJJRHx8MSE9PXIubGVuZ3RoP3Qud2l0aE11dGF0aW9ucygoZnVuY3Rpb24odCl7Zm9yKHZhciBuPWU/ZnVuY3Rpb24ocixuKXt0LnVwZGF0ZShuLGMsKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09Yz9yOmUodCxyLG4pfSkpfTpmdW5jdGlvbihlLHIpe3Quc2V0KHIsZSl9LG89MDtvPHIubGVuZ3RoO28rKylyW29dLmZvckVhY2gobil9KSk6dC5jb25zdHJ1Y3RvcihyWzBdKX1mdW5jdGlvbiB1cGRhdGVJbkRlZXBNYXAodCxlLHIsbil7dmFyIG89dD09PWMsaT1lLm5leHQoKTtpZihpLmRvbmUpe3ZhciBhPW8/cjp0LHM9bihhKTtyZXR1cm4gcz09PWE/dDpzfWludmFyaWFudChvfHx0JiZ0LnNldCwiaW52YWxpZCBrZXlQYXRoIik7dmFyIHU9aS52YWx1ZSxmPW8/Yzp0LmdldCh1LGMpLGw9dXBkYXRlSW5EZWVwTWFwKGYsZSxyLG4pO3JldHVybiBsPT09Zj90Omw9PT1jP3QucmVtb3ZlKHUpOihvP2VtcHR5TWFwKCk6dCkuc2V0KHUsbCl9ZnVuY3Rpb24gcG9wQ291bnQodCl7cmV0dXJuIHQ9KHQ9KDg1ODk5MzQ1OSYodC09dD4+MSYxNDMxNjU1NzY1KSkrKHQ+PjImODU4OTkzNDU5KSkrKHQ+PjQpJjI1MjY0NTEzNSx0Kz10Pj44LDEyNyYodCs9dD4+MTYpfWZ1bmN0aW9uIHNldEluKHQsZSxyLG4pe3ZhciBvPW4/dDphcnJDb3B5KHQpO3JldHVybiBvW2VdPXIsb31mdW5jdGlvbiBzcGxpY2VJbih0LGUscixuKXt2YXIgbz10Lmxlbmd0aCsxO2lmKG4mJmUrMT09PW8pcmV0dXJuIHRbZV09cix0O2Zvcih2YXIgaT1uZXcgQXJyYXkobyksYT0wLHM9MDtzPG87cysrKXM9PT1lPyhpW3NdPXIsYT0tMSk6aVtzXT10W3MrYV07cmV0dXJuIGl9ZnVuY3Rpb24gc3BsaWNlT3V0KHQsZSxyKXt2YXIgbj10Lmxlbmd0aC0xO2lmKHImJmU9PT1uKXJldHVybiB0LnBvcCgpLHQ7Zm9yKHZhciBvPW5ldyBBcnJheShuKSxpPTAsYT0wO2E8bjthKyspYT09PWUmJihpPTEpLG9bYV09dFthK2ldO3JldHVybiBvfVZbV109ITAsVltpXT1WLnJlbW92ZSxWLnJlbW92ZUluPVYuZGVsZXRlSW4sQXJyYXlNYXBOb2RlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlLHIsbil7Zm9yKHZhciBvPXRoaXMuZW50cmllcyxpPTAsYT1vLmxlbmd0aDtpPGE7aSsrKWlmKGlzKHIsb1tpXVswXSkpcmV0dXJuIG9baV1bMV07cmV0dXJuIG59LEFycmF5TWFwTm9kZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSxyLG4sbyxpLGEpe2Zvcih2YXIgcz1vPT09Yyx1PXRoaXMuZW50cmllcyxmPTAsbD11Lmxlbmd0aDtmPGwmJiFpcyhuLHVbZl1bMF0pO2YrKyk7dmFyIHA9ZjxsO2lmKHA/dVtmXVsxXT09PW86cylyZXR1cm4gdGhpcztpZihTZXRSZWYoYSksKHN8fCFwKSYmU2V0UmVmKGkpLCFzfHwxIT09dS5sZW5ndGgpe2lmKCFwJiYhcyYmdS5sZW5ndGg+PUspcmV0dXJuIGNyZWF0ZU5vZGVzKHQsdSxuLG8pO3ZhciBoPXQmJnQ9PT10aGlzLm93bmVySUQsZD1oP3U6YXJyQ29weSh1KTtyZXR1cm4gcD9zP2Y9PT1sLTE/ZC5wb3AoKTpkW2ZdPWQucG9wKCk6ZFtmXT1bbixvXTpkLnB1c2goW24sb10pLGg/KHRoaXMuZW50cmllcz1kLHRoaXMpOm5ldyBBcnJheU1hcE5vZGUodCxkKX19LEJpdG1hcEluZGV4ZWROb2RlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlLHIsbil7dm9pZCAwPT09ZSYmKGU9aGFzaChyKSk7dmFyIG89MTw8KCgwPT09dD9lOmU+Pj50KSZ1KSxpPXRoaXMuYml0bWFwO3JldHVybiBpJm8/dGhpcy5ub2Rlc1twb3BDb3VudChpJm8tMSldLmdldCh0K2EsZSxyLG4pOm59LEJpdG1hcEluZGV4ZWROb2RlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlLHIsbixvLGkscyl7dm9pZCAwPT09ciYmKHI9aGFzaChuKSk7dmFyIGY9KDA9PT1lP3I6cj4+PmUpJnUsbD0xPDxmLHA9dGhpcy5iaXRtYXAsaD0hIShwJmwpO2lmKCFoJiZvPT09YylyZXR1cm4gdGhpczt2YXIgZD1wb3BDb3VudChwJmwtMSkseT10aGlzLm5vZGVzLF89aD95W2RdOnZvaWQgMCxnPXVwZGF0ZU5vZGUoXyx0LGUrYSxyLG4sbyxpLHMpO2lmKGc9PT1fKXJldHVybiB0aGlzO2lmKCFoJiZnJiZ5Lmxlbmd0aD49JClyZXR1cm4gZXhwYW5kTm9kZXModCx5LHAsZixnKTtpZihoJiYhZyYmMj09PXkubGVuZ3RoJiZpc0xlYWZOb2RlKHlbMV5kXSkpcmV0dXJuIHlbMV5kXTtpZihoJiZnJiYxPT09eS5sZW5ndGgmJmlzTGVhZk5vZGUoZykpcmV0dXJuIGc7dmFyIG09dCYmdD09PXRoaXMub3duZXJJRCx2PWg/Zz9wOnBebDpwfGwsYj1oP2c/c2V0SW4oeSxkLGcsbSk6c3BsaWNlT3V0KHksZCxtKTpzcGxpY2VJbih5LGQsZyxtKTtyZXR1cm4gbT8odGhpcy5iaXRtYXA9dix0aGlzLm5vZGVzPWIsdGhpcyk6bmV3IEJpdG1hcEluZGV4ZWROb2RlKHQsdixiKX0sSGFzaEFycmF5TWFwTm9kZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSxyLG4pe3ZvaWQgMD09PWUmJihlPWhhc2gocikpO3ZhciBvPSgwPT09dD9lOmU+Pj50KSZ1LGk9dGhpcy5ub2Rlc1tvXTtyZXR1cm4gaT9pLmdldCh0K2EsZSxyLG4pOm59LEhhc2hBcnJheU1hcE5vZGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUscixuLG8saSxzKXt2b2lkIDA9PT1yJiYocj1oYXNoKG4pKTt2YXIgZj0oMD09PWU/cjpyPj4+ZSkmdSxsPW89PT1jLHA9dGhpcy5ub2RlcyxoPXBbZl07aWYobCYmIWgpcmV0dXJuIHRoaXM7dmFyIGQ9dXBkYXRlTm9kZShoLHQsZSthLHIsbixvLGkscyk7aWYoZD09PWgpcmV0dXJuIHRoaXM7dmFyIHk9dGhpcy5jb3VudDtpZihoKXtpZighZCYmLS15PEgpcmV0dXJuIHBhY2tOb2Rlcyh0LHAseSxmKX1lbHNlIHkrKzt2YXIgXz10JiZ0PT09dGhpcy5vd25lcklELGc9c2V0SW4ocCxmLGQsXyk7cmV0dXJuIF8/KHRoaXMuY291bnQ9eSx0aGlzLm5vZGVzPWcsdGhpcyk6bmV3IEhhc2hBcnJheU1hcE5vZGUodCx5LGcpfSxIYXNoQ29sbGlzaW9uTm9kZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSxyLG4pe2Zvcih2YXIgbz10aGlzLmVudHJpZXMsaT0wLGE9by5sZW5ndGg7aTxhO2krKylpZihpcyhyLG9baV1bMF0pKXJldHVybiBvW2ldWzFdO3JldHVybiBufSxIYXNoQ29sbGlzaW9uTm9kZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSxyLG4sbyxpLGEpe3ZvaWQgMD09PXImJihyPWhhc2gobikpO3ZhciBzPW89PT1jO2lmKHIhPT10aGlzLmtleUhhc2gpcmV0dXJuIHM/dGhpczooU2V0UmVmKGEpLFNldFJlZihpKSxtZXJnZUludG9Ob2RlKHRoaXMsdCxlLHIsW24sb10pKTtmb3IodmFyIHU9dGhpcy5lbnRyaWVzLGY9MCxsPXUubGVuZ3RoO2Y8bCYmIWlzKG4sdVtmXVswXSk7ZisrKTt2YXIgcD1mPGw7aWYocD91W2ZdWzFdPT09bzpzKXJldHVybiB0aGlzO2lmKFNldFJlZihhKSwoc3x8IXApJiZTZXRSZWYoaSkscyYmMj09PWwpcmV0dXJuIG5ldyBWYWx1ZU5vZGUodCx0aGlzLmtleUhhc2gsdVsxXmZdKTt2YXIgaD10JiZ0PT09dGhpcy5vd25lcklELGQ9aD91OmFyckNvcHkodSk7cmV0dXJuIHA/cz9mPT09bC0xP2QucG9wKCk6ZFtmXT1kLnBvcCgpOmRbZl09W24sb106ZC5wdXNoKFtuLG9dKSxoPyh0aGlzLmVudHJpZXM9ZCx0aGlzKTpuZXcgSGFzaENvbGxpc2lvbk5vZGUodCx0aGlzLmtleUhhc2gsZCl9LFZhbHVlTm9kZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBpcyhyLHRoaXMuZW50cnlbMF0pP3RoaXMuZW50cnlbMV06bn0sVmFsdWVOb2RlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlLHIsbixvLGksYSl7dmFyIHM9bz09PWMsdT1pcyhuLHRoaXMuZW50cnlbMF0pO3JldHVybih1P289PT10aGlzLmVudHJ5WzFdOnMpP3RoaXM6KFNldFJlZihhKSxzP3ZvaWQgU2V0UmVmKGkpOnU/dCYmdD09PXRoaXMub3duZXJJRD8odGhpcy5lbnRyeVsxXT1vLHRoaXMpOm5ldyBWYWx1ZU5vZGUodCx0aGlzLmtleUhhc2gsW24sb10pOihTZXRSZWYoaSksbWVyZ2VJbnRvTm9kZSh0aGlzLHQsZSxoYXNoKG4pLFtuLG9dKSkpfSxBcnJheU1hcE5vZGUucHJvdG90eXBlLml0ZXJhdGU9SGFzaENvbGxpc2lvbk5vZGUucHJvdG90eXBlLml0ZXJhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dGhpcy5lbnRyaWVzLG49MCxvPXIubGVuZ3RoLTE7bjw9bztuKyspaWYoITE9PT10KHJbZT9vLW46bl0pKXJldHVybiExfSxCaXRtYXBJbmRleGVkTm9kZS5wcm90b3R5cGUuaXRlcmF0ZT1IYXNoQXJyYXlNYXBOb2RlLnByb3RvdHlwZS5pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMubm9kZXMsbj0wLG89ci5sZW5ndGgtMTtuPD1vO24rKyl7dmFyIGk9cltlP28tbjpuXTtpZihpJiYhMT09PWkuaXRlcmF0ZSh0LGUpKXJldHVybiExfX0sVmFsdWVOb2RlLnByb3RvdHlwZS5pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQodGhpcy5lbnRyeSl9LGNyZWF0ZUNsYXNzKE1hcEl0ZXJhdG9yLEl0ZXJhdG9yKSxNYXBJdGVyYXRvci5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl90eXBlLGU9dGhpcy5fc3RhY2s7ZTspe3ZhciByLG49ZS5ub2RlLG89ZS5pbmRleCsrO2lmKG4uZW50cnkpe2lmKDA9PT1vKXJldHVybiBtYXBJdGVyYXRvclZhbHVlKHQsbi5lbnRyeSl9ZWxzZSBpZihuLmVudHJpZXMpe2lmKG88PShyPW4uZW50cmllcy5sZW5ndGgtMSkpcmV0dXJuIG1hcEl0ZXJhdG9yVmFsdWUodCxuLmVudHJpZXNbdGhpcy5fcmV2ZXJzZT9yLW86b10pfWVsc2UgaWYobzw9KHI9bi5ub2Rlcy5sZW5ndGgtMSkpe3ZhciBpPW4ubm9kZXNbdGhpcy5fcmV2ZXJzZT9yLW86b107aWYoaSl7aWYoaS5lbnRyeSlyZXR1cm4gbWFwSXRlcmF0b3JWYWx1ZSh0LGkuZW50cnkpO2U9dGhpcy5fc3RhY2s9bWFwSXRlcmF0b3JGcmFtZShpLGUpfWNvbnRpbnVlfWU9dGhpcy5fc3RhY2s9dGhpcy5fc3RhY2suX19wcmV2fXJldHVybiBpdGVyYXRvckRvbmUoKX07dmFyIEs9cy80LCQ9cy8yLEg9cy80O2Z1bmN0aW9uIExpc3QodCl7dmFyIGU9ZW1wdHlMaXN0KCk7aWYobnVsbD09dClyZXR1cm4gZTtpZihpc0xpc3QodCkpcmV0dXJuIHQ7dmFyIHI9SW5kZXhlZEl0ZXJhYmxlKHQpLG49ci5zaXplO3JldHVybiAwPT09bj9lOihhc3NlcnROb3RJbmZpbml0ZShuKSxuPjAmJm48cz9tYWtlTGlzdCgwLG4sYSxudWxsLG5ldyBWTm9kZShyLnRvQXJyYXkoKSkpOmUud2l0aE11dGF0aW9ucygoZnVuY3Rpb24odCl7dC5zZXRTaXplKG4pLHIuZm9yRWFjaCgoZnVuY3Rpb24oZSxyKXtyZXR1cm4gdC5zZXQocixlKX0pKX0pKSl9ZnVuY3Rpb24gaXNMaXN0KHQpe3JldHVybiEoIXR8fCF0W1ldKX1jcmVhdGVDbGFzcyhMaXN0LEluZGV4ZWRDb2xsZWN0aW9uKSxMaXN0Lm9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMoYXJndW1lbnRzKX0sTGlzdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJMaXN0IFsiLCJdIil9LExpc3QucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUpe2lmKCh0PXdyYXBJbmRleCh0aGlzLHQpKT49MCYmdDx0aGlzLnNpemUpe3ZhciByPWxpc3ROb2RlRm9yKHRoaXMsdCs9dGhpcy5fb3JpZ2luKTtyZXR1cm4gciYmci5hcnJheVt0JnVdfXJldHVybiBlfSxMaXN0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdXBkYXRlTGlzdCh0aGlzLHQsZSl9LExpc3QucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oYXModCk/MD09PXQ/dGhpcy5zaGlmdCgpOnQ9PT10aGlzLnNpemUtMT90aGlzLnBvcCgpOnRoaXMuc3BsaWNlKHQsMSk6dGhpc30sTGlzdC5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc3BsaWNlKHQsMCxlKX0sTGlzdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuc2l6ZT90aGlzOnRoaXMuX19vd25lcklEPyh0aGlzLnNpemU9dGhpcy5fb3JpZ2luPXRoaXMuX2NhcGFjaXR5PTAsdGhpcy5fbGV2ZWw9YSx0aGlzLl9yb290PXRoaXMuX3RhaWw9bnVsbCx0aGlzLl9faGFzaD12b2lkIDAsdGhpcy5fX2FsdGVyZWQ9ITAsdGhpcyk6ZW1wdHlMaXN0KCl9LExpc3QucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMsZT10aGlzLnNpemU7cmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucygoZnVuY3Rpb24ocil7c2V0TGlzdEJvdW5kcyhyLDAsZSt0Lmxlbmd0aCk7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspci5zZXQoZStuLHRbbl0pfSkpfSxMaXN0LnByb3RvdHlwZS5wb3A9ZnVuY3Rpb24oKXtyZXR1cm4gc2V0TGlzdEJvdW5kcyh0aGlzLDAsLTEpfSxMaXN0LnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKGUpe3NldExpc3RCb3VuZHMoZSwtdC5sZW5ndGgpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKWUuc2V0KHIsdFtyXSl9KSl9LExpc3QucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHNldExpc3RCb3VuZHModGhpcywxKX0sTGlzdC5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gbWVyZ2VJbnRvTGlzdFdpdGgodGhpcyx2b2lkIDAsYXJndW1lbnRzKX0sTGlzdC5wcm90b3R5cGUubWVyZ2VXaXRoPWZ1bmN0aW9uKGUpe3JldHVybiBtZXJnZUludG9MaXN0V2l0aCh0aGlzLGUsdC5jYWxsKGFyZ3VtZW50cywxKSl9LExpc3QucHJvdG90eXBlLm1lcmdlRGVlcD1mdW5jdGlvbigpe3JldHVybiBtZXJnZUludG9MaXN0V2l0aCh0aGlzLGRlZXBNZXJnZXIsYXJndW1lbnRzKX0sTGlzdC5wcm90b3R5cGUubWVyZ2VEZWVwV2l0aD1mdW5jdGlvbihlKXt2YXIgcj10LmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBtZXJnZUludG9MaXN0V2l0aCh0aGlzLGRlZXBNZXJnZXJXaXRoKGUpLHIpfSxMaXN0LnByb3RvdHlwZS5zZXRTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBzZXRMaXN0Qm91bmRzKHRoaXMsMCx0KX0sTGlzdC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnNpemU7cmV0dXJuIHdob2xlU2xpY2UodCxlLHIpP3RoaXM6c2V0TGlzdEJvdW5kcyh0aGlzLHJlc29sdmVCZWdpbih0LHIpLHJlc29sdmVFbmQoZSxyKSl9LExpc3QucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24odCxlKXt2YXIgcj0wLG49aXRlcmF0ZUxpc3QodGhpcyxlKTtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciBlPW4oKTtyZXR1cm4gZT09PWV0P2l0ZXJhdG9yRG9uZSgpOml0ZXJhdG9yVmFsdWUodCxyKyssZSl9KSl9LExpc3QucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcixuPTAsbz1pdGVyYXRlTGlzdCh0aGlzLGUpOyhyPW8oKSkhPT1ldCYmITEhPT10KHIsbisrLHRoaXMpOyk7cmV0dXJuIG59LExpc3QucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT10aGlzLl9fb3duZXJJRD90aGlzOnQ/bWFrZUxpc3QodGhpcy5fb3JpZ2luLHRoaXMuX2NhcGFjaXR5LHRoaXMuX2xldmVsLHRoaXMuX3Jvb3QsdGhpcy5fdGFpbCx0LHRoaXMuX19oYXNoKToodGhpcy5fX293bmVySUQ9dCx0aGlzKX0sTGlzdC5pc0xpc3Q9aXNMaXN0O3ZhciBZPSJAQF9fSU1NVVRBQkxFX0xJU1RfX0BAIixaPUxpc3QucHJvdG90eXBlO2Z1bmN0aW9uIFZOb2RlKHQsZSl7dGhpcy5hcnJheT10LHRoaXMub3duZXJJRD1lfVpbWV09ITAsWltpXT1aLnJlbW92ZSxaLnNldEluPVYuc2V0SW4sWi5kZWxldGVJbj1aLnJlbW92ZUluPVYucmVtb3ZlSW4sWi51cGRhdGU9Vi51cGRhdGUsWi51cGRhdGVJbj1WLnVwZGF0ZUluLFoubWVyZ2VJbj1WLm1lcmdlSW4sWi5tZXJnZURlZXBJbj1WLm1lcmdlRGVlcEluLFoud2l0aE11dGF0aW9ucz1WLndpdGhNdXRhdGlvbnMsWi5hc011dGFibGU9Vi5hc011dGFibGUsWi5hc0ltbXV0YWJsZT1WLmFzSW1tdXRhYmxlLFoud2FzQWx0ZXJlZD1WLndhc0FsdGVyZWQsVk5vZGUucHJvdG90eXBlLnJlbW92ZUJlZm9yZT1mdW5jdGlvbih0LGUscil7aWYocj09PWU/MTw8ZTowPT09dGhpcy5hcnJheS5sZW5ndGgpcmV0dXJuIHRoaXM7dmFyIG49cj4+PmUmdTtpZihuPj10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gbmV3IFZOb2RlKFtdLHQpO3ZhciBvLGk9MD09PW47aWYoZT4wKXt2YXIgcz10aGlzLmFycmF5W25dO2lmKChvPXMmJnMucmVtb3ZlQmVmb3JlKHQsZS1hLHIpKT09PXMmJmkpcmV0dXJuIHRoaXN9aWYoaSYmIW8pcmV0dXJuIHRoaXM7dmFyIGM9ZWRpdGFibGVWTm9kZSh0aGlzLHQpO2lmKCFpKWZvcih2YXIgZj0wO2Y8bjtmKyspYy5hcnJheVtmXT12b2lkIDA7cmV0dXJuIG8mJihjLmFycmF5W25dPW8pLGN9LFZOb2RlLnByb3RvdHlwZS5yZW1vdmVBZnRlcj1mdW5jdGlvbih0LGUscil7aWYocj09PShlPzE8PGU6MCl8fDA9PT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gdGhpczt2YXIgbixvPXItMT4+PmUmdTtpZihvPj10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gdGhpcztpZihlPjApe3ZhciBpPXRoaXMuYXJyYXlbb107aWYoKG49aSYmaS5yZW1vdmVBZnRlcih0LGUtYSxyKSk9PT1pJiZvPT09dGhpcy5hcnJheS5sZW5ndGgtMSlyZXR1cm4gdGhpc312YXIgcz1lZGl0YWJsZVZOb2RlKHRoaXMsdCk7cmV0dXJuIHMuYXJyYXkuc3BsaWNlKG8rMSksbiYmKHMuYXJyYXlbb109biksc307dmFyIEosdHQsZXQ9e307ZnVuY3Rpb24gaXRlcmF0ZUxpc3QodCxlKXt2YXIgcj10Ll9vcmlnaW4sbj10Ll9jYXBhY2l0eSxvPWdldFRhaWxPZmZzZXQobiksaT10Ll90YWlsO3JldHVybiBpdGVyYXRlTm9kZU9yTGVhZih0Ll9yb290LHQuX2xldmVsLDApO2Z1bmN0aW9uIGl0ZXJhdGVOb2RlT3JMZWFmKHQsZSxyKXtyZXR1cm4gMD09PWU/aXRlcmF0ZUxlYWYodCxyKTppdGVyYXRlTm9kZSh0LGUscil9ZnVuY3Rpb24gaXRlcmF0ZUxlYWYodCxhKXt2YXIgdT1hPT09bz9pJiZpLmFycmF5OnQmJnQuYXJyYXksYz1hPnI/MDpyLWEsZj1uLWE7cmV0dXJuIGY+cyYmKGY9cyksZnVuY3Rpb24oKXtpZihjPT09ZilyZXR1cm4gZXQ7dmFyIHQ9ZT8tLWY6YysrO3JldHVybiB1JiZ1W3RdfX1mdW5jdGlvbiBpdGVyYXRlTm9kZSh0LG8saSl7dmFyIHUsYz10JiZ0LmFycmF5LGY9aT5yPzA6ci1pPj5vLGw9MSsobi1pPj5vKTtyZXR1cm4gbD5zJiYobD1zKSxmdW5jdGlvbigpe2Zvcig7Oyl7aWYodSl7dmFyIHQ9dSgpO2lmKHQhPT1ldClyZXR1cm4gdDt1PW51bGx9aWYoZj09PWwpcmV0dXJuIGV0O3ZhciByPWU/LS1sOmYrKzt1PWl0ZXJhdGVOb2RlT3JMZWFmKGMmJmNbcl0sby1hLGkrKHI8PG8pKX19fX1mdW5jdGlvbiBtYWtlTGlzdCh0LGUscixuLG8saSxhKXt2YXIgcz1PYmplY3QuY3JlYXRlKFopO3JldHVybiBzLnNpemU9ZS10LHMuX29yaWdpbj10LHMuX2NhcGFjaXR5PWUscy5fbGV2ZWw9cixzLl9yb290PW4scy5fdGFpbD1vLHMuX19vd25lcklEPWkscy5fX2hhc2g9YSxzLl9fYWx0ZXJlZD0hMSxzfWZ1bmN0aW9uIGVtcHR5TGlzdCgpe3JldHVybiBKfHwoSj1tYWtlTGlzdCgwLDAsYSkpfWZ1bmN0aW9uIHVwZGF0ZUxpc3QodCxlLHIpe2lmKChlPXdyYXBJbmRleCh0LGUpKSE9ZSlyZXR1cm4gdDtpZihlPj10LnNpemV8fGU8MClyZXR1cm4gdC53aXRoTXV0YXRpb25zKChmdW5jdGlvbih0KXtlPDA/c2V0TGlzdEJvdW5kcyh0LGUpLnNldCgwLHIpOnNldExpc3RCb3VuZHModCwwLGUrMSkuc2V0KGUscil9KSk7ZSs9dC5fb3JpZ2luO3ZhciBuPXQuX3RhaWwsbz10Ll9yb290LGk9TWFrZVJlZihsKTtyZXR1cm4gZT49Z2V0VGFpbE9mZnNldCh0Ll9jYXBhY2l0eSk/bj11cGRhdGVWTm9kZShuLHQuX19vd25lcklELDAsZSxyLGkpOm89dXBkYXRlVk5vZGUobyx0Ll9fb3duZXJJRCx0Ll9sZXZlbCxlLHIsaSksaS52YWx1ZT90Ll9fb3duZXJJRD8odC5fcm9vdD1vLHQuX3RhaWw9bix0Ll9faGFzaD12b2lkIDAsdC5fX2FsdGVyZWQ9ITAsdCk6bWFrZUxpc3QodC5fb3JpZ2luLHQuX2NhcGFjaXR5LHQuX2xldmVsLG8sbik6dH1mdW5jdGlvbiB1cGRhdGVWTm9kZSh0LGUscixuLG8saSl7dmFyIHMsYz1uPj4+ciZ1LGY9dCYmYzx0LmFycmF5Lmxlbmd0aDtpZighZiYmdm9pZCAwPT09bylyZXR1cm4gdDtpZihyPjApe3ZhciBsPXQmJnQuYXJyYXlbY10scD11cGRhdGVWTm9kZShsLGUsci1hLG4sbyxpKTtyZXR1cm4gcD09PWw/dDooKHM9ZWRpdGFibGVWTm9kZSh0LGUpKS5hcnJheVtjXT1wLHMpfXJldHVybiBmJiZ0LmFycmF5W2NdPT09bz90OihTZXRSZWYoaSkscz1lZGl0YWJsZVZOb2RlKHQsZSksdm9pZCAwPT09byYmYz09PXMuYXJyYXkubGVuZ3RoLTE/cy5hcnJheS5wb3AoKTpzLmFycmF5W2NdPW8scyl9ZnVuY3Rpb24gZWRpdGFibGVWTm9kZSh0LGUpe3JldHVybiBlJiZ0JiZlPT09dC5vd25lcklEP3Q6bmV3IFZOb2RlKHQ/dC5hcnJheS5zbGljZSgpOltdLGUpfWZ1bmN0aW9uIGxpc3ROb2RlRm9yKHQsZSl7aWYoZT49Z2V0VGFpbE9mZnNldCh0Ll9jYXBhY2l0eSkpcmV0dXJuIHQuX3RhaWw7aWYoZTwxPDx0Ll9sZXZlbCthKXtmb3IodmFyIHI9dC5fcm9vdCxuPXQuX2xldmVsO3ImJm4+MDspcj1yLmFycmF5W2U+Pj5uJnVdLG4tPWE7cmV0dXJuIHJ9fWZ1bmN0aW9uIHNldExpc3RCb3VuZHModCxlLHIpe3ZvaWQgMCE9PWUmJihlfD0wKSx2b2lkIDAhPT1yJiYocnw9MCk7dmFyIG49dC5fX293bmVySUR8fG5ldyBPd25lcklELG89dC5fb3JpZ2luLGk9dC5fY2FwYWNpdHkscz1vK2UsYz12b2lkIDA9PT1yP2k6cjwwP2krcjpvK3I7aWYocz09PW8mJmM9PT1pKXJldHVybiB0O2lmKHM+PWMpcmV0dXJuIHQuY2xlYXIoKTtmb3IodmFyIGY9dC5fbGV2ZWwsbD10Ll9yb290LHA9MDtzK3A8MDspbD1uZXcgVk5vZGUobCYmbC5hcnJheS5sZW5ndGg/W3ZvaWQgMCxsXTpbXSxuKSxwKz0xPDwoZis9YSk7cCYmKHMrPXAsbys9cCxjKz1wLGkrPXApO2Zvcih2YXIgaD1nZXRUYWlsT2Zmc2V0KGkpLGQ9Z2V0VGFpbE9mZnNldChjKTtkPj0xPDxmK2E7KWw9bmV3IFZOb2RlKGwmJmwuYXJyYXkubGVuZ3RoP1tsXTpbXSxuKSxmKz1hO3ZhciB5PXQuX3RhaWwsXz1kPGg/bGlzdE5vZGVGb3IodCxjLTEpOmQ+aD9uZXcgVk5vZGUoW10sbik6eTtpZih5JiZkPmgmJnM8aSYmeS5hcnJheS5sZW5ndGgpe2Zvcih2YXIgZz1sPWVkaXRhYmxlVk5vZGUobCxuKSxtPWY7bT5hO20tPWEpe3ZhciB2PWg+Pj5tJnU7Zz1nLmFycmF5W3ZdPWVkaXRhYmxlVk5vZGUoZy5hcnJheVt2XSxuKX1nLmFycmF5W2g+Pj5hJnVdPXl9aWYoYzxpJiYoXz1fJiZfLnJlbW92ZUFmdGVyKG4sMCxjKSkscz49ZClzLT1kLGMtPWQsZj1hLGw9bnVsbCxfPV8mJl8ucmVtb3ZlQmVmb3JlKG4sMCxzKTtlbHNlIGlmKHM+b3x8ZDxoKXtmb3IocD0wO2w7KXt2YXIgYj1zPj4+ZiZ1O2lmKGIhPT1kPj4+ZiZ1KWJyZWFrO2ImJihwKz0oMTw8ZikqYiksZi09YSxsPWwuYXJyYXlbYl19bCYmcz5vJiYobD1sLnJlbW92ZUJlZm9yZShuLGYscy1wKSksbCYmZDxoJiYobD1sLnJlbW92ZUFmdGVyKG4sZixkLXApKSxwJiYocy09cCxjLT1wKX1yZXR1cm4gdC5fX293bmVySUQ/KHQuc2l6ZT1jLXMsdC5fb3JpZ2luPXMsdC5fY2FwYWNpdHk9Yyx0Ll9sZXZlbD1mLHQuX3Jvb3Q9bCx0Ll90YWlsPV8sdC5fX2hhc2g9dm9pZCAwLHQuX19hbHRlcmVkPSEwLHQpOm1ha2VMaXN0KHMsYyxmLGwsXyl9ZnVuY3Rpb24gbWVyZ2VJbnRvTGlzdFdpdGgodCxlLHIpe2Zvcih2YXIgbj1bXSxvPTAsaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgYT1yW2ldLHM9SW5kZXhlZEl0ZXJhYmxlKGEpO3Muc2l6ZT5vJiYobz1zLnNpemUpLGlzSXRlcmFibGUoYSl8fChzPXMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZnJvbUpTKHQpfSkpKSxuLnB1c2gocyl9cmV0dXJuIG8+dC5zaXplJiYodD10LnNldFNpemUobykpLG1lcmdlSW50b0NvbGxlY3Rpb25XaXRoKHQsZSxuKX1mdW5jdGlvbiBnZXRUYWlsT2Zmc2V0KHQpe3JldHVybiB0PHM/MDp0LTE+Pj5hPDxhfWZ1bmN0aW9uIE9yZGVyZWRNYXAodCl7cmV0dXJuIG51bGw9PXQ/ZW1wdHlPcmRlcmVkTWFwKCk6aXNPcmRlcmVkTWFwKHQpP3Q6ZW1wdHlPcmRlcmVkTWFwKCkud2l0aE11dGF0aW9ucygoZnVuY3Rpb24oZSl7dmFyIHI9S2V5ZWRJdGVyYWJsZSh0KTthc3NlcnROb3RJbmZpbml0ZShyLnNpemUpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5zZXQocix0KX0pKX0pKX1mdW5jdGlvbiBpc09yZGVyZWRNYXAodCl7cmV0dXJuIGlzTWFwKHQpJiZpc09yZGVyZWQodCl9ZnVuY3Rpb24gbWFrZU9yZGVyZWRNYXAodCxlLHIsbil7dmFyIG89T2JqZWN0LmNyZWF0ZShPcmRlcmVkTWFwLnByb3RvdHlwZSk7cmV0dXJuIG8uc2l6ZT10P3Quc2l6ZTowLG8uX21hcD10LG8uX2xpc3Q9ZSxvLl9fb3duZXJJRD1yLG8uX19oYXNoPW4sb31mdW5jdGlvbiBlbXB0eU9yZGVyZWRNYXAoKXtyZXR1cm4gdHR8fCh0dD1tYWtlT3JkZXJlZE1hcChlbXB0eU1hcCgpLGVtcHR5TGlzdCgpKSl9ZnVuY3Rpb24gdXBkYXRlT3JkZXJlZE1hcCh0LGUscil7dmFyIG4sbyxpPXQuX21hcCxhPXQuX2xpc3QsdT1pLmdldChlKSxmPXZvaWQgMCE9PXU7aWYocj09PWMpe2lmKCFmKXJldHVybiB0O2Euc2l6ZT49cyYmYS5zaXplPj0yKmkuc2l6ZT8obj0obz1hLmZpbHRlcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwIT09dCYmdSE9PWV9KSkpLnRvS2V5ZWRTZXEoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdfSkpLmZsaXAoKS50b01hcCgpLHQuX19vd25lcklEJiYobi5fX293bmVySUQ9by5fX293bmVySUQ9dC5fX293bmVySUQpKToobj1pLnJlbW92ZShlKSxvPXU9PT1hLnNpemUtMT9hLnBvcCgpOmEuc2V0KHUsdm9pZCAwKSl9ZWxzZSBpZihmKXtpZihyPT09YS5nZXQodSlbMV0pcmV0dXJuIHQ7bj1pLG89YS5zZXQodSxbZSxyXSl9ZWxzZSBuPWkuc2V0KGUsYS5zaXplKSxvPWEuc2V0KGEuc2l6ZSxbZSxyXSk7cmV0dXJuIHQuX19vd25lcklEPyh0LnNpemU9bi5zaXplLHQuX21hcD1uLHQuX2xpc3Q9byx0Ll9faGFzaD12b2lkIDAsdCk6bWFrZU9yZGVyZWRNYXAobixvKX1mdW5jdGlvbiBUb0tleWVkU2VxdWVuY2UodCxlKXt0aGlzLl9pdGVyPXQsdGhpcy5fdXNlS2V5cz1lLHRoaXMuc2l6ZT10LnNpemV9ZnVuY3Rpb24gVG9JbmRleGVkU2VxdWVuY2UodCl7dGhpcy5faXRlcj10LHRoaXMuc2l6ZT10LnNpemV9ZnVuY3Rpb24gVG9TZXRTZXF1ZW5jZSh0KXt0aGlzLl9pdGVyPXQsdGhpcy5zaXplPXQuc2l6ZX1mdW5jdGlvbiBGcm9tRW50cmllc1NlcXVlbmNlKHQpe3RoaXMuX2l0ZXI9dCx0aGlzLnNpemU9dC5zaXplfWZ1bmN0aW9uIGZsaXBGYWN0b3J5KHQpe3ZhciBlPW1ha2VTZXF1ZW5jZSh0KTtyZXR1cm4gZS5faXRlcj10LGUuc2l6ZT10LnNpemUsZS5mbGlwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciBlPXQucmV2ZXJzZS5hcHBseSh0aGlzKTtyZXR1cm4gZS5mbGlwPWZ1bmN0aW9uKCl7cmV0dXJuIHQucmV2ZXJzZSgpfSxlfSxlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4gdC5pbmNsdWRlcyhlKX0sZS5pbmNsdWRlcz1mdW5jdGlvbihlKXtyZXR1cm4gdC5oYXMoZSl9LGUuY2FjaGVSZXN1bHQ9Y2FjaGVSZXN1bHRUaHJvdWdoLGUuX19pdGVyYXRlVW5jYWNoZWQ9ZnVuY3Rpb24oZSxyKXt2YXIgbj10aGlzO3JldHVybiB0Ll9faXRlcmF0ZSgoZnVuY3Rpb24odCxyKXtyZXR1cm4hMSE9PWUocix0LG4pfSkscil9LGUuX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKGUscil7aWYoZT09PWQpe3ZhciBuPXQuX19pdGVyYXRvcihlLHIpO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7aWYoIXQuZG9uZSl7dmFyIGU9dC52YWx1ZVswXTt0LnZhbHVlWzBdPXQudmFsdWVbMV0sdC52YWx1ZVsxXT1lfXJldHVybiB0fSkpfXJldHVybiB0Ll9faXRlcmF0b3IoZT09PWg/cDpoLHIpfSxlfWZ1bmN0aW9uIG1hcEZhY3RvcnkodCxlLHIpe3ZhciBuPW1ha2VTZXF1ZW5jZSh0KTtyZXR1cm4gbi5zaXplPXQuc2l6ZSxuLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4gdC5oYXMoZSl9LG4uZ2V0PWZ1bmN0aW9uKG4sbyl7dmFyIGk9dC5nZXQobixjKTtyZXR1cm4gaT09PWM/bzplLmNhbGwocixpLG4sdCl9LG4uX19pdGVyYXRlVW5jYWNoZWQ9ZnVuY3Rpb24obixvKXt2YXIgaT10aGlzO3JldHVybiB0Ll9faXRlcmF0ZSgoZnVuY3Rpb24odCxvLGEpe3JldHVybiExIT09bihlLmNhbGwocix0LG8sYSksbyxpKX0pLG8pfSxuLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbihuLG8pe3ZhciBpPXQuX19pdGVyYXRvcihkLG8pO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7dmFyIG89aS5uZXh0KCk7aWYoby5kb25lKXJldHVybiBvO3ZhciBhPW8udmFsdWUscz1hWzBdO3JldHVybiBpdGVyYXRvclZhbHVlKG4scyxlLmNhbGwocixhWzFdLHMsdCksbyl9KSl9LG59ZnVuY3Rpb24gcmV2ZXJzZUZhY3RvcnkodCxlKXt2YXIgcj1tYWtlU2VxdWVuY2UodCk7cmV0dXJuIHIuX2l0ZXI9dCxyLnNpemU9dC5zaXplLHIucmV2ZXJzZT1mdW5jdGlvbigpe3JldHVybiB0fSx0LmZsaXAmJihyLmZsaXA9ZnVuY3Rpb24oKXt2YXIgZT1mbGlwRmFjdG9yeSh0KTtyZXR1cm4gZS5yZXZlcnNlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZmxpcCgpfSxlfSksci5nZXQ9ZnVuY3Rpb24ocixuKXtyZXR1cm4gdC5nZXQoZT9yOi0xLXIsbil9LHIuaGFzPWZ1bmN0aW9uKHIpe3JldHVybiB0LmhhcyhlP3I6LTEtcil9LHIuaW5jbHVkZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaW5jbHVkZXMoZSl9LHIuY2FjaGVSZXN1bHQ9Y2FjaGVSZXN1bHRUaHJvdWdoLHIuX19pdGVyYXRlPWZ1bmN0aW9uKGUscil7dmFyIG49dGhpcztyZXR1cm4gdC5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHQscil7cmV0dXJuIGUodCxyLG4pfSksIXIpfSxyLl9faXRlcmF0b3I9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gdC5fX2l0ZXJhdG9yKGUsIXIpfSxyfWZ1bmN0aW9uIGZpbHRlckZhY3RvcnkodCxlLHIsbil7dmFyIG89bWFrZVNlcXVlbmNlKHQpO3JldHVybiBuJiYoby5oYXM9ZnVuY3Rpb24obil7dmFyIG89dC5nZXQobixjKTtyZXR1cm4gbyE9PWMmJiEhZS5jYWxsKHIsbyxuLHQpfSxvLmdldD1mdW5jdGlvbihuLG8pe3ZhciBpPXQuZ2V0KG4sYyk7cmV0dXJuIGkhPT1jJiZlLmNhbGwocixpLG4sdCk/aTpvfSksby5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihvLGkpe3ZhciBhPXRoaXMscz0wO3JldHVybiB0Ll9faXRlcmF0ZSgoZnVuY3Rpb24odCxpLHUpe2lmKGUuY2FsbChyLHQsaSx1KSlyZXR1cm4gcysrLG8odCxuP2k6cy0xLGEpfSksaSksc30sby5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24obyxpKXt2YXIgYT10Ll9faXRlcmF0b3IoZCxpKSxzPTA7cmV0dXJuIG5ldyBJdGVyYXRvcigoZnVuY3Rpb24oKXtmb3IoOzspe3ZhciBpPWEubmV4dCgpO2lmKGkuZG9uZSlyZXR1cm4gaTt2YXIgdT1pLnZhbHVlLGM9dVswXSxmPXVbMV07aWYoZS5jYWxsKHIsZixjLHQpKXJldHVybiBpdGVyYXRvclZhbHVlKG8sbj9jOnMrKyxmLGkpfX0pKX0sb31mdW5jdGlvbiBjb3VudEJ5RmFjdG9yeSh0LGUscil7dmFyIG49TWFwKCkuYXNNdXRhYmxlKCk7cmV0dXJuIHQuX19pdGVyYXRlKChmdW5jdGlvbihvLGkpe24udXBkYXRlKGUuY2FsbChyLG8saSx0KSwwLChmdW5jdGlvbih0KXtyZXR1cm4gdCsxfSkpfSkpLG4uYXNJbW11dGFibGUoKX1mdW5jdGlvbiBncm91cEJ5RmFjdG9yeSh0LGUscil7dmFyIG49aXNLZXllZCh0KSxvPShpc09yZGVyZWQodCk/T3JkZXJlZE1hcCgpOk1hcCgpKS5hc011dGFibGUoKTt0Ll9faXRlcmF0ZSgoZnVuY3Rpb24oaSxhKXtvLnVwZGF0ZShlLmNhbGwocixpLGEsdCksKGZ1bmN0aW9uKHQpe3JldHVybih0PXR8fFtdKS5wdXNoKG4/W2EsaV06aSksdH0pKX0pKTt2YXIgaT1pdGVyYWJsZUNsYXNzKHQpO3JldHVybiBvLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHJlaWZ5KHQsaShlKSl9KSl9ZnVuY3Rpb24gc2xpY2VGYWN0b3J5KHQsZSxyLG4pe3ZhciBvPXQuc2l6ZTtpZih2b2lkIDAhPT1lJiYoZXw9MCksdm9pZCAwIT09ciYmKHI9PT0xLzA/cj1vOnJ8PTApLHdob2xlU2xpY2UoZSxyLG8pKXJldHVybiB0O3ZhciBpPXJlc29sdmVCZWdpbihlLG8pLGE9cmVzb2x2ZUVuZChyLG8pO2lmKGkhPWl8fGEhPWEpcmV0dXJuIHNsaWNlRmFjdG9yeSh0LnRvU2VxKCkuY2FjaGVSZXN1bHQoKSxlLHIsbik7dmFyIHMsdT1hLWk7dT09dSYmKHM9dTwwPzA6dSk7dmFyIGM9bWFrZVNlcXVlbmNlKHQpO3JldHVybiBjLnNpemU9MD09PXM/czp0LnNpemUmJnN8fHZvaWQgMCwhbiYmaXNTZXEodCkmJnM+PTAmJihjLmdldD1mdW5jdGlvbihlLHIpe3JldHVybihlPXdyYXBJbmRleCh0aGlzLGUpKT49MCYmZTxzP3QuZ2V0KGUraSxyKTpyfSksYy5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihlLHIpe3ZhciBvPXRoaXM7aWYoMD09PXMpcmV0dXJuIDA7aWYocilyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShlLHIpO3ZhciBhPTAsdT0hMCxjPTA7cmV0dXJuIHQuX19pdGVyYXRlKChmdW5jdGlvbih0LHIpe2lmKCF1fHwhKHU9YSsrPGkpKXJldHVybiBjKyssITEhPT1lKHQsbj9yOmMtMSxvKSYmYyE9PXN9KSksY30sYy5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24oZSxyKXtpZigwIT09cyYmcilyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IoZSxyKTt2YXIgbz0wIT09cyYmdC5fX2l0ZXJhdG9yKGUsciksYT0wLHU9MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe2Zvcig7YSsrPGk7KW8ubmV4dCgpO2lmKCsrdT5zKXJldHVybiBpdGVyYXRvckRvbmUoKTt2YXIgdD1vLm5leHQoKTtyZXR1cm4gbnx8ZT09PWg/dDppdGVyYXRvclZhbHVlKGUsdS0xLGU9PT1wP3ZvaWQgMDp0LnZhbHVlWzFdLHQpfSkpfSxjfWZ1bmN0aW9uIHRha2VXaGlsZUZhY3RvcnkodCxlLHIpe3ZhciBuPW1ha2VTZXF1ZW5jZSh0KTtyZXR1cm4gbi5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihuLG8pe3ZhciBpPXRoaXM7aWYobylyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShuLG8pO3ZhciBhPTA7cmV0dXJuIHQuX19pdGVyYXRlKChmdW5jdGlvbih0LG8scyl7cmV0dXJuIGUuY2FsbChyLHQsbyxzKSYmKythJiZuKHQsbyxpKX0pKSxhfSxuLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbihuLG8pe3ZhciBpPXRoaXM7aWYobylyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IobixvKTt2YXIgYT10Ll9faXRlcmF0b3IoZCxvKSxzPSEwO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7aWYoIXMpcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO3ZhciB0PWEubmV4dCgpO2lmKHQuZG9uZSlyZXR1cm4gdDt2YXIgbz10LnZhbHVlLHU9b1swXSxjPW9bMV07cmV0dXJuIGUuY2FsbChyLGMsdSxpKT9uPT09ZD90Oml0ZXJhdG9yVmFsdWUobix1LGMsdCk6KHM9ITEsaXRlcmF0b3JEb25lKCkpfSkpfSxufWZ1bmN0aW9uIHNraXBXaGlsZUZhY3RvcnkodCxlLHIsbil7dmFyIG89bWFrZVNlcXVlbmNlKHQpO3JldHVybiBvLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKG8saSl7dmFyIGE9dGhpcztpZihpKXJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRlKG8saSk7dmFyIHM9ITAsdT0wO3JldHVybiB0Ll9faXRlcmF0ZSgoZnVuY3Rpb24odCxpLGMpe2lmKCFzfHwhKHM9ZS5jYWxsKHIsdCxpLGMpKSlyZXR1cm4gdSsrLG8odCxuP2k6dS0xLGEpfSkpLHV9LG8uX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKG8saSl7dmFyIGE9dGhpcztpZihpKXJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRvcihvLGkpO3ZhciBzPXQuX19pdGVyYXRvcihkLGkpLHU9ITAsYz0wO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7dmFyIHQsaSxmO2Rve2lmKCh0PXMubmV4dCgpKS5kb25lKXJldHVybiBufHxvPT09aD90Oml0ZXJhdG9yVmFsdWUobyxjKyssbz09PXA/dm9pZCAwOnQudmFsdWVbMV0sdCk7dmFyIGw9dC52YWx1ZTtpPWxbMF0sZj1sWzFdLHUmJih1PWUuY2FsbChyLGYsaSxhKSl9d2hpbGUodSk7cmV0dXJuIG89PT1kP3Q6aXRlcmF0b3JWYWx1ZShvLGksZix0KX0pKX0sb31mdW5jdGlvbiBjb25jYXRGYWN0b3J5KHQsZSl7dmFyIHI9aXNLZXllZCh0KSxuPVt0XS5jb25jYXQoZSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gaXNJdGVyYWJsZSh0KT9yJiYodD1LZXllZEl0ZXJhYmxlKHQpKTp0PXI/a2V5ZWRTZXFGcm9tVmFsdWUodCk6aW5kZXhlZFNlcUZyb21WYWx1ZShBcnJheS5pc0FycmF5KHQpP3Q6W3RdKSx0fSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10LnNpemV9KSk7aWYoMD09PW4ubGVuZ3RoKXJldHVybiB0O2lmKDE9PT1uLmxlbmd0aCl7dmFyIG89blswXTtpZihvPT09dHx8ciYmaXNLZXllZChvKXx8aXNJbmRleGVkKHQpJiZpc0luZGV4ZWQobykpcmV0dXJuIG99dmFyIGk9bmV3IEFycmF5U2VxKG4pO3JldHVybiByP2k9aS50b0tleWVkU2VxKCk6aXNJbmRleGVkKHQpfHwoaT1pLnRvU2V0U2VxKCkpLChpPWkuZmxhdHRlbighMCkpLnNpemU9bi5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09dCl7dmFyIHI9ZS5zaXplO2lmKHZvaWQgMCE9PXIpcmV0dXJuIHQrcn19KSwwKSxpfWZ1bmN0aW9uIGZsYXR0ZW5GYWN0b3J5KHQsZSxyKXt2YXIgbj1tYWtlU2VxdWVuY2UodCk7cmV0dXJuIG4uX19pdGVyYXRlVW5jYWNoZWQ9ZnVuY3Rpb24obixvKXt2YXIgaT0wLGE9ITE7ZnVuY3Rpb24gZmxhdERlZXAodCxzKXt2YXIgdT10aGlzO3QuX19pdGVyYXRlKChmdW5jdGlvbih0LG8pe3JldHVybighZXx8czxlKSYmaXNJdGVyYWJsZSh0KT9mbGF0RGVlcCh0LHMrMSk6ITE9PT1uKHQscj9vOmkrKyx1KSYmKGE9ITApLCFhfSksbyl9cmV0dXJuIGZsYXREZWVwKHQsMCksaX0sbi5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24obixvKXt2YXIgaT10Ll9faXRlcmF0b3IobixvKSxhPVtdLHM9MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe2Zvcig7aTspe3ZhciB0PWkubmV4dCgpO2lmKCExPT09dC5kb25lKXt2YXIgdT10LnZhbHVlO2lmKG49PT1kJiYodT11WzFdKSxlJiYhKGEubGVuZ3RoPGUpfHwhaXNJdGVyYWJsZSh1KSlyZXR1cm4gcj90Oml0ZXJhdG9yVmFsdWUobixzKyssdSx0KTthLnB1c2goaSksaT11Ll9faXRlcmF0b3IobixvKX1lbHNlIGk9YS5wb3AoKX1yZXR1cm4gaXRlcmF0b3JEb25lKCl9KSl9LG59ZnVuY3Rpb24gZmxhdE1hcEZhY3RvcnkodCxlLHIpe3ZhciBuPWl0ZXJhYmxlQ2xhc3ModCk7cmV0dXJuIHQudG9TZXEoKS5tYXAoKGZ1bmN0aW9uKG8saSl7cmV0dXJuIG4oZS5jYWxsKHIsbyxpLHQpKX0pKS5mbGF0dGVuKCEwKX1mdW5jdGlvbiBpbnRlcnBvc2VGYWN0b3J5KHQsZSl7dmFyIHI9bWFrZVNlcXVlbmNlKHQpO3JldHVybiByLnNpemU9dC5zaXplJiYyKnQuc2l6ZS0xLHIuX19pdGVyYXRlVW5jYWNoZWQ9ZnVuY3Rpb24ocixuKXt2YXIgbz10aGlzLGk9MDtyZXR1cm4gdC5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHQsbil7cmV0dXJuKCFpfHwhMSE9PXIoZSxpKyssbykpJiYhMSE9PXIodCxpKyssbyl9KSxuKSxpfSxyLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbihyLG4pe3ZhciBvLGk9dC5fX2l0ZXJhdG9yKGgsbiksYT0wO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7cmV0dXJuKCFvfHxhJTIpJiYobz1pLm5leHQoKSkuZG9uZT9vOmElMj9pdGVyYXRvclZhbHVlKHIsYSsrLGUpOml0ZXJhdG9yVmFsdWUocixhKyssby52YWx1ZSxvKX0pKX0scn1mdW5jdGlvbiBzb3J0RmFjdG9yeSh0LGUscil7ZXx8KGU9ZGVmYXVsdENvbXBhcmF0b3IpO3ZhciBuPWlzS2V5ZWQodCksbz0wLGk9dC50b1NlcSgpLm1hcCgoZnVuY3Rpb24oZSxuKXtyZXR1cm5bbixlLG8rKyxyP3IoZSxuLHQpOmVdfSkpLnRvQXJyYXkoKTtyZXR1cm4gaS5zb3J0KChmdW5jdGlvbih0LHIpe3JldHVybiBlKHRbM10sclszXSl8fHRbMl0tclsyXX0pKS5mb3JFYWNoKG4/ZnVuY3Rpb24odCxlKXtpW2VdLmxlbmd0aD0yfTpmdW5jdGlvbih0LGUpe2lbZV09dFsxXX0pLG4/S2V5ZWRTZXEoaSk6aXNJbmRleGVkKHQpP0luZGV4ZWRTZXEoaSk6U2V0U2VxKGkpfWZ1bmN0aW9uIG1heEZhY3RvcnkodCxlLHIpe2lmKGV8fChlPWRlZmF1bHRDb21wYXJhdG9yKSxyKXt2YXIgbj10LnRvU2VxKCkubWFwKChmdW5jdGlvbihlLG4pe3JldHVybltlLHIoZSxuLHQpXX0pKS5yZWR1Y2UoKGZ1bmN0aW9uKHQscil7cmV0dXJuIG1heENvbXBhcmUoZSx0WzFdLHJbMV0pP3I6dH0pKTtyZXR1cm4gbiYmblswXX1yZXR1cm4gdC5yZWR1Y2UoKGZ1bmN0aW9uKHQscil7cmV0dXJuIG1heENvbXBhcmUoZSx0LHIpP3I6dH0pKX1mdW5jdGlvbiBtYXhDb21wYXJlKHQsZSxyKXt2YXIgbj10KHIsZSk7cmV0dXJuIDA9PT1uJiZyIT09ZSYmKG51bGw9PXJ8fHIhPXIpfHxuPjB9ZnVuY3Rpb24gemlwV2l0aEZhY3RvcnkodCxlLHIpe3ZhciBuPW1ha2VTZXF1ZW5jZSh0KTtyZXR1cm4gbi5zaXplPW5ldyBBcnJheVNlcShyKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnNpemV9KSkubWluKCksbi5fX2l0ZXJhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHIsbj10aGlzLl9faXRlcmF0b3IoaCxlKSxvPTA7IShyPW4ubmV4dCgpKS5kb25lJiYhMSE9PXQoci52YWx1ZSxvKyssdGhpcyk7KTtyZXR1cm4gb30sbi5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24odCxuKXt2YXIgbz1yLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQ9SXRlcmFibGUodCksZ2V0SXRlcmF0b3Iobj90LnJldmVyc2UoKTp0KX0pKSxpPTAsYT0hMTtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciByO3JldHVybiBhfHwocj1vLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQubmV4dCgpfSkpLGE9ci5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdC5kb25lfSkpKSxhP2l0ZXJhdG9yRG9uZSgpOml0ZXJhdG9yVmFsdWUodCxpKyssZS5hcHBseShudWxsLHIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pKSkpfSkpfSxufWZ1bmN0aW9uIHJlaWZ5KHQsZSl7cmV0dXJuIGlzU2VxKHQpP2U6dC5jb25zdHJ1Y3RvcihlKX1mdW5jdGlvbiB2YWxpZGF0ZUVudHJ5KHQpe2lmKHQhPT1PYmplY3QodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgW0ssIFZdIHR1cGxlOiAiK3QpfWZ1bmN0aW9uIHJlc29sdmVTaXplKHQpe3JldHVybiBhc3NlcnROb3RJbmZpbml0ZSh0LnNpemUpLGVuc3VyZVNpemUodCl9ZnVuY3Rpb24gaXRlcmFibGVDbGFzcyh0KXtyZXR1cm4gaXNLZXllZCh0KT9LZXllZEl0ZXJhYmxlOmlzSW5kZXhlZCh0KT9JbmRleGVkSXRlcmFibGU6U2V0SXRlcmFibGV9ZnVuY3Rpb24gbWFrZVNlcXVlbmNlKHQpe3JldHVybiBPYmplY3QuY3JlYXRlKChpc0tleWVkKHQpP0tleWVkU2VxOmlzSW5kZXhlZCh0KT9JbmRleGVkU2VxOlNldFNlcSkucHJvdG90eXBlKX1mdW5jdGlvbiBjYWNoZVJlc3VsdFRocm91Z2goKXtyZXR1cm4gdGhpcy5faXRlci5jYWNoZVJlc3VsdD8odGhpcy5faXRlci5jYWNoZVJlc3VsdCgpLHRoaXMuc2l6ZT10aGlzLl9pdGVyLnNpemUsdGhpcyk6U2VxLnByb3RvdHlwZS5jYWNoZVJlc3VsdC5jYWxsKHRoaXMpfWZ1bmN0aW9uIGRlZmF1bHRDb21wYXJhdG9yKHQsZSl7cmV0dXJuIHQ+ZT8xOnQ8ZT8tMTowfWZ1bmN0aW9uIGZvcmNlSXRlcmF0b3IodCl7dmFyIGU9Z2V0SXRlcmF0b3IodCk7aWYoIWUpe2lmKCFpc0FycmF5TGlrZSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBpdGVyYWJsZSBvciBhcnJheS1saWtlOiAiK3QpO2U9Z2V0SXRlcmF0b3IoSXRlcmFibGUodCkpfXJldHVybiBlfWZ1bmN0aW9uIFJlY29yZCh0LGUpe3ZhciByLG49ZnVuY3Rpb24gUmVjb3JkKGkpe2lmKGkgaW5zdGFuY2VvZiBuKXJldHVybiBpO2lmKCEodGhpcyBpbnN0YW5jZW9mIG4pKXJldHVybiBuZXcgbihpKTtpZighcil7cj0hMDt2YXIgYT1PYmplY3Qua2V5cyh0KTtzZXRQcm9wcyhvLGEpLG8uc2l6ZT1hLmxlbmd0aCxvLl9uYW1lPWUsby5fa2V5cz1hLG8uX2RlZmF1bHRWYWx1ZXM9dH10aGlzLl9tYXA9TWFwKGkpfSxvPW4ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocnQpO3JldHVybiBvLmNvbnN0cnVjdG9yPW4sbn1jcmVhdGVDbGFzcyhPcmRlcmVkTWFwLE1hcCksT3JkZXJlZE1hcC5vZj1mdW5jdGlvbigpe3JldHVybiB0aGlzKGFyZ3VtZW50cyl9LE9yZGVyZWRNYXAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiT3JkZXJlZE1hcCB7IiwifSIpfSxPcmRlcmVkTWFwLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9tYXAuZ2V0KHQpO3JldHVybiB2b2lkIDAhPT1yP3RoaXMuX2xpc3QuZ2V0KHIpWzFdOmV9LE9yZGVyZWRNYXAucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemU/dGhpczp0aGlzLl9fb3duZXJJRD8odGhpcy5zaXplPTAsdGhpcy5fbWFwLmNsZWFyKCksdGhpcy5fbGlzdC5jbGVhcigpLHRoaXMpOmVtcHR5T3JkZXJlZE1hcCgpfSxPcmRlcmVkTWFwLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdXBkYXRlT3JkZXJlZE1hcCh0aGlzLHQsZSl9LE9yZGVyZWRNYXAucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtyZXR1cm4gdXBkYXRlT3JkZXJlZE1hcCh0aGlzLHQsYyl9LE9yZGVyZWRNYXAucHJvdG90eXBlLndhc0FsdGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwLndhc0FsdGVyZWQoKXx8dGhpcy5fbGlzdC53YXNBbHRlcmVkKCl9LE9yZGVyZWRNYXAucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXM7cmV0dXJuIHRoaXMuX2xpc3QuX19pdGVyYXRlKChmdW5jdGlvbihlKXtyZXR1cm4gZSYmdChlWzFdLGVbMF0scil9KSxlKX0sT3JkZXJlZE1hcC5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9saXN0LmZyb21FbnRyeVNlcSgpLl9faXRlcmF0b3IodCxlKX0sT3JkZXJlZE1hcC5wcm90b3R5cGUuX19lbnN1cmVPd25lcj1mdW5jdGlvbih0KXtpZih0PT09dGhpcy5fX293bmVySUQpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5fbWFwLl9fZW5zdXJlT3duZXIodCkscj10aGlzLl9saXN0Ll9fZW5zdXJlT3duZXIodCk7cmV0dXJuIHQ/bWFrZU9yZGVyZWRNYXAoZSxyLHQsdGhpcy5fX2hhc2gpOih0aGlzLl9fb3duZXJJRD10LHRoaXMuX21hcD1lLHRoaXMuX2xpc3Q9cix0aGlzKX0sT3JkZXJlZE1hcC5pc09yZGVyZWRNYXA9aXNPcmRlcmVkTWFwLE9yZGVyZWRNYXAucHJvdG90eXBlW29dPSEwLE9yZGVyZWRNYXAucHJvdG90eXBlW2ldPU9yZGVyZWRNYXAucHJvdG90eXBlLnJlbW92ZSxjcmVhdGVDbGFzcyhUb0tleWVkU2VxdWVuY2UsS2V5ZWRTZXEpLFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2l0ZXIuZ2V0KHQsZSl9LFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pdGVyLmhhcyh0KX0sVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS52YWx1ZVNlcT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pdGVyLnZhbHVlU2VxKCl9LFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1yZXZlcnNlRmFjdG9yeSh0aGlzLCEwKTtyZXR1cm4gdGhpcy5fdXNlS2V5c3x8KGUudmFsdWVTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5faXRlci50b1NlcSgpLnJldmVyc2UoKX0pLGV9LFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcyxuPW1hcEZhY3RvcnkodGhpcyx0LGUpO3JldHVybiB0aGlzLl91c2VLZXlzfHwobi52YWx1ZVNlcT1mdW5jdGlvbigpe3JldHVybiByLl9pdGVyLnRvU2VxKCkubWFwKHQsZSl9KSxufSxUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbih0LGUpe3ZhciByLG49dGhpcztyZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUodGhpcy5fdXNlS2V5cz9mdW5jdGlvbihlLHIpe3JldHVybiB0KGUscixuKX06KHI9ZT9yZXNvbHZlU2l6ZSh0aGlzKTowLGZ1bmN0aW9uKG8pe3JldHVybiB0KG8sZT8tLXI6cisrLG4pfSksZSl9LFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuX3VzZUtleXMpcmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRvcih0LGUpO3ZhciByPXRoaXMuX2l0ZXIuX19pdGVyYXRvcihoLGUpLG49ZT9yZXNvbHZlU2l6ZSh0aGlzKTowO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7dmFyIG89ci5uZXh0KCk7cmV0dXJuIG8uZG9uZT9vOml0ZXJhdG9yVmFsdWUodCxlPy0tbjpuKyssby52YWx1ZSxvKX0pKX0sVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZVtvXT0hMCxjcmVhdGVDbGFzcyhUb0luZGV4ZWRTZXF1ZW5jZSxJbmRleGVkU2VxKSxUb0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2l0ZXIuaW5jbHVkZXModCl9LFRvSW5kZXhlZFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49MDtyZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUsbisrLHIpfSksZSl9LFRvSW5kZXhlZFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5faXRlci5fX2l0ZXJhdG9yKGgsZSksbj0wO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7dmFyIGU9ci5uZXh0KCk7cmV0dXJuIGUuZG9uZT9lOml0ZXJhdG9yVmFsdWUodCxuKyssZS52YWx1ZSxlKX0pKX0sY3JlYXRlQ2xhc3MoVG9TZXRTZXF1ZW5jZSxTZXRTZXEpLFRvU2V0U2VxdWVuY2UucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXRlci5pbmNsdWRlcyh0KX0sVG9TZXRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcztyZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUsZSxyKX0pLGUpfSxUb1NldFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5faXRlci5fX2l0ZXJhdG9yKGgsZSk7cmV0dXJuIG5ldyBJdGVyYXRvcigoZnVuY3Rpb24oKXt2YXIgZT1yLm5leHQoKTtyZXR1cm4gZS5kb25lP2U6aXRlcmF0b3JWYWx1ZSh0LGUudmFsdWUsZS52YWx1ZSxlKX0pKX0sY3JlYXRlQ2xhc3MoRnJvbUVudHJpZXNTZXF1ZW5jZSxLZXllZFNlcSksRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuZW50cnlTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlci50b1NlcSgpfSxGcm9tRW50cmllc1NlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzO3JldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0ZSgoZnVuY3Rpb24oZSl7aWYoZSl7dmFsaWRhdGVFbnRyeShlKTt2YXIgbj1pc0l0ZXJhYmxlKGUpO3JldHVybiB0KG4/ZS5nZXQoMSk6ZVsxXSxuP2UuZ2V0KDApOmVbMF0scil9fSksZSl9LEZyb21FbnRyaWVzU2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9pdGVyLl9faXRlcmF0b3IoaCxlKTtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe2Zvcig7Oyl7dmFyIGU9ci5uZXh0KCk7aWYoZS5kb25lKXJldHVybiBlO3ZhciBuPWUudmFsdWU7aWYobil7dmFsaWRhdGVFbnRyeShuKTt2YXIgbz1pc0l0ZXJhYmxlKG4pO3JldHVybiBpdGVyYXRvclZhbHVlKHQsbz9uLmdldCgwKTpuWzBdLG8/bi5nZXQoMSk6blsxXSxlKX19fSkpfSxUb0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQ9VG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5jYWNoZVJlc3VsdD1Ub1NldFNlcXVlbmNlLnByb3RvdHlwZS5jYWNoZVJlc3VsdD1Gcm9tRW50cmllc1NlcXVlbmNlLnByb3RvdHlwZS5jYWNoZVJlc3VsdD1jYWNoZVJlc3VsdFRocm91Z2gsY3JlYXRlQ2xhc3MoUmVjb3JkLEtleWVkQ29sbGVjdGlvbiksUmVjb3JkLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fdG9TdHJpbmcocmVjb3JkTmFtZSh0aGlzKSsiIHsiLCJ9Iil9LFJlY29yZC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kZWZhdWx0VmFsdWVzLmhhc093blByb3BlcnR5KHQpfSxSZWNvcmQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLmhhcyh0KSlyZXR1cm4gZTt2YXIgcj10aGlzLl9kZWZhdWx0VmFsdWVzW3RdO3JldHVybiB0aGlzLl9tYXA/dGhpcy5fbWFwLmdldCh0LHIpOnJ9LFJlY29yZC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtpZih0aGlzLl9fb3duZXJJRClyZXR1cm4gdGhpcy5fbWFwJiZ0aGlzLl9tYXAuY2xlYXIoKSx0aGlzO3ZhciB0PXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHQuX2VtcHR5fHwodC5fZW1wdHk9bWFrZVJlY29yZCh0aGlzLGVtcHR5TWFwKCkpKX0sUmVjb3JkLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtpZighdGhpcy5oYXModCkpdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2V0IHVua25vd24ga2V5ICInK3QrJyIgb24gJytyZWNvcmROYW1lKHRoaXMpKTtpZih0aGlzLl9tYXAmJiF0aGlzLl9tYXAuaGFzKHQpJiZlPT09dGhpcy5fZGVmYXVsdFZhbHVlc1t0XSlyZXR1cm4gdGhpczt2YXIgcj10aGlzLl9tYXAmJnRoaXMuX21hcC5zZXQodCxlKTtyZXR1cm4gdGhpcy5fX293bmVySUR8fHI9PT10aGlzLl9tYXA/dGhpczptYWtlUmVjb3JkKHRoaXMscil9LFJlY29yZC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLmhhcyh0KSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl9tYXAmJnRoaXMuX21hcC5yZW1vdmUodCk7cmV0dXJuIHRoaXMuX19vd25lcklEfHxlPT09dGhpcy5fbWFwP3RoaXM6bWFrZVJlY29yZCh0aGlzLGUpfSxSZWNvcmQucHJvdG90eXBlLndhc0FsdGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwLndhc0FsdGVyZWQoKX0sUmVjb3JkLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcztyZXR1cm4gS2V5ZWRJdGVyYWJsZSh0aGlzLl9kZWZhdWx0VmFsdWVzKS5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuZ2V0KGUpfSkpLl9faXRlcmF0b3IodCxlKX0sUmVjb3JkLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzO3JldHVybiBLZXllZEl0ZXJhYmxlKHRoaXMuX2RlZmF1bHRWYWx1ZXMpLm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gci5nZXQoZSl9KSkuX19pdGVyYXRlKHQsZSl9LFJlY29yZC5wcm90b3R5cGUuX19lbnN1cmVPd25lcj1mdW5jdGlvbih0KXtpZih0PT09dGhpcy5fX293bmVySUQpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5fbWFwJiZ0aGlzLl9tYXAuX19lbnN1cmVPd25lcih0KTtyZXR1cm4gdD9tYWtlUmVjb3JkKHRoaXMsZSx0KToodGhpcy5fX293bmVySUQ9dCx0aGlzLl9tYXA9ZSx0aGlzKX07dmFyIHJ0PVJlY29yZC5wcm90b3R5cGU7ZnVuY3Rpb24gbWFrZVJlY29yZCh0LGUscil7dmFyIG49T2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodCkpO3JldHVybiBuLl9tYXA9ZSxuLl9fb3duZXJJRD1yLG59ZnVuY3Rpb24gcmVjb3JkTmFtZSh0KXtyZXR1cm4gdC5fbmFtZXx8dC5jb25zdHJ1Y3Rvci5uYW1lfHwiUmVjb3JkIn1mdW5jdGlvbiBzZXRQcm9wcyh0LGUpe3RyeXtlLmZvckVhY2goc2V0UHJvcC5iaW5kKHZvaWQgMCx0KSl9Y2F0Y2godCl7fX1mdW5jdGlvbiBzZXRQcm9wKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KGUpfSxzZXQ6ZnVuY3Rpb24odCl7aW52YXJpYW50KHRoaXMuX19vd25lcklELCJDYW5ub3Qgc2V0IG9uIGFuIGltbXV0YWJsZSByZWNvcmQuIiksdGhpcy5zZXQoZSx0KX19KX1mdW5jdGlvbiBTZXQodCl7cmV0dXJuIG51bGw9PXQ/ZW1wdHlTZXQoKTppc1NldCh0KSYmIWlzT3JkZXJlZCh0KT90OmVtcHR5U2V0KCkud2l0aE11dGF0aW9ucygoZnVuY3Rpb24oZSl7dmFyIHI9U2V0SXRlcmFibGUodCk7YXNzZXJ0Tm90SW5maW5pdGUoci5zaXplKSxyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLmFkZCh0KX0pKX0pKX1mdW5jdGlvbiBpc1NldCh0KXtyZXR1cm4hKCF0fHwhdFtvdF0pfXJ0W2ldPXJ0LnJlbW92ZSxydC5kZWxldGVJbj1ydC5yZW1vdmVJbj1WLnJlbW92ZUluLHJ0Lm1lcmdlPVYubWVyZ2UscnQubWVyZ2VXaXRoPVYubWVyZ2VXaXRoLHJ0Lm1lcmdlSW49Vi5tZXJnZUluLHJ0Lm1lcmdlRGVlcD1WLm1lcmdlRGVlcCxydC5tZXJnZURlZXBXaXRoPVYubWVyZ2VEZWVwV2l0aCxydC5tZXJnZURlZXBJbj1WLm1lcmdlRGVlcEluLHJ0LnNldEluPVYuc2V0SW4scnQudXBkYXRlPVYudXBkYXRlLHJ0LnVwZGF0ZUluPVYudXBkYXRlSW4scnQud2l0aE11dGF0aW9ucz1WLndpdGhNdXRhdGlvbnMscnQuYXNNdXRhYmxlPVYuYXNNdXRhYmxlLHJ0LmFzSW1tdXRhYmxlPVYuYXNJbW11dGFibGUsY3JlYXRlQ2xhc3MoU2V0LFNldENvbGxlY3Rpb24pLFNldC5vZj1mdW5jdGlvbigpe3JldHVybiB0aGlzKGFyZ3VtZW50cyl9LFNldC5mcm9tS2V5cz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcyhLZXllZEl0ZXJhYmxlKHQpLmtleVNlcSgpKX0sU2V0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fdG9TdHJpbmcoIlNldCB7IiwifSIpfSxTZXQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWFwLmhhcyh0KX0sU2V0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIHVwZGF0ZVNldCh0aGlzLHRoaXMuX21hcC5zZXQodCwhMCkpfSxTZXQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtyZXR1cm4gdXBkYXRlU2V0KHRoaXMsdGhpcy5fbWFwLnJlbW92ZSh0KSl9LFNldC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdXBkYXRlU2V0KHRoaXMsdGhpcy5fbWFwLmNsZWFyKCkpfSxTZXQucHJvdG90eXBlLnVuaW9uPWZ1bmN0aW9uKCl7dmFyIGU9dC5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gMD09PShlPWUuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuc2l6ZX0pKSkubGVuZ3RoP3RoaXM6MCE9PXRoaXMuc2l6ZXx8dGhpcy5fX293bmVySUR8fDEhPT1lLmxlbmd0aD90aGlzLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKVNldEl0ZXJhYmxlKGVbcl0pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFkZChlKX0pKX0pKTp0aGlzLmNvbnN0cnVjdG9yKGVbMF0pfSxTZXQucHJvdG90eXBlLmludGVyc2VjdD1mdW5jdGlvbigpe3ZhciBlPXQuY2FsbChhcmd1bWVudHMsMCk7aWYoMD09PWUubGVuZ3RoKXJldHVybiB0aGlzO2U9ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBTZXRJdGVyYWJsZSh0KX0pKTt2YXIgcj10aGlzO3JldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKHQpe3IuZm9yRWFjaCgoZnVuY3Rpb24ocil7ZS5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5jbHVkZXMocil9KSl8fHQucmVtb3ZlKHIpfSkpfSkpfSxTZXQucHJvdG90eXBlLnN1YnRyYWN0PWZ1bmN0aW9uKCl7dmFyIGU9dC5jYWxsKGFyZ3VtZW50cywwKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHRoaXM7ZT1lLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFNldEl0ZXJhYmxlKHQpfSkpO3ZhciByPXRoaXM7cmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucygoZnVuY3Rpb24odCl7ci5mb3JFYWNoKChmdW5jdGlvbihyKXtlLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmluY2x1ZGVzKHIpfSkpJiZ0LnJlbW92ZShyKX0pKX0pKX0sU2V0LnByb3RvdHlwZS5tZXJnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaW9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sU2V0LnByb3RvdHlwZS5tZXJnZVdpdGg9ZnVuY3Rpb24oZSl7dmFyIHI9dC5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdGhpcy51bmlvbi5hcHBseSh0aGlzLHIpfSxTZXQucHJvdG90eXBlLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIE9yZGVyZWRTZXQoc29ydEZhY3RvcnkodGhpcyx0KSl9LFNldC5wcm90b3R5cGUuc29ydEJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9yZGVyZWRTZXQoc29ydEZhY3RvcnkodGhpcyxlLHQpKX0sU2V0LnByb3RvdHlwZS53YXNBbHRlcmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC53YXNBbHRlcmVkKCl9LFNldC5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcztyZXR1cm4gdGhpcy5fbWFwLl9faXRlcmF0ZSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdChuLG4scil9KSxlKX0sU2V0LnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX21hcC5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9KSkuX19pdGVyYXRvcih0LGUpfSxTZXQucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24odCl7aWYodD09PXRoaXMuX19vd25lcklEKXJldHVybiB0aGlzO3ZhciBlPXRoaXMuX21hcC5fX2Vuc3VyZU93bmVyKHQpO3JldHVybiB0P3RoaXMuX19tYWtlKGUsdCk6KHRoaXMuX19vd25lcklEPXQsdGhpcy5fbWFwPWUsdGhpcyl9LFNldC5pc1NldD1pc1NldDt2YXIgbnQsb3Q9IkBAX19JTU1VVEFCTEVfU0VUX19AQCIsaXQ9U2V0LnByb3RvdHlwZTtmdW5jdGlvbiB1cGRhdGVTZXQodCxlKXtyZXR1cm4gdC5fX293bmVySUQ/KHQuc2l6ZT1lLnNpemUsdC5fbWFwPWUsdCk6ZT09PXQuX21hcD90OjA9PT1lLnNpemU/dC5fX2VtcHR5KCk6dC5fX21ha2UoZSl9ZnVuY3Rpb24gbWFrZVNldCh0LGUpe3ZhciByPU9iamVjdC5jcmVhdGUoaXQpO3JldHVybiByLnNpemU9dD90LnNpemU6MCxyLl9tYXA9dCxyLl9fb3duZXJJRD1lLHJ9ZnVuY3Rpb24gZW1wdHlTZXQoKXtyZXR1cm4gbnR8fChudD1tYWtlU2V0KGVtcHR5TWFwKCkpKX1mdW5jdGlvbiBPcmRlcmVkU2V0KHQpe3JldHVybiBudWxsPT10P2VtcHR5T3JkZXJlZFNldCgpOmlzT3JkZXJlZFNldCh0KT90OmVtcHR5T3JkZXJlZFNldCgpLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKGUpe3ZhciByPVNldEl0ZXJhYmxlKHQpO2Fzc2VydE5vdEluZmluaXRlKHIuc2l6ZSksci5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5hZGQodCl9KSl9KSl9ZnVuY3Rpb24gaXNPcmRlcmVkU2V0KHQpe3JldHVybiBpc1NldCh0KSYmaXNPcmRlcmVkKHQpfWl0W290XT0hMCxpdFtpXT1pdC5yZW1vdmUsaXQubWVyZ2VEZWVwPWl0Lm1lcmdlLGl0Lm1lcmdlRGVlcFdpdGg9aXQubWVyZ2VXaXRoLGl0LndpdGhNdXRhdGlvbnM9Vi53aXRoTXV0YXRpb25zLGl0LmFzTXV0YWJsZT1WLmFzTXV0YWJsZSxpdC5hc0ltbXV0YWJsZT1WLmFzSW1tdXRhYmxlLGl0Ll9fZW1wdHk9ZW1wdHlTZXQsaXQuX19tYWtlPW1ha2VTZXQsY3JlYXRlQ2xhc3MoT3JkZXJlZFNldCxTZXQpLE9yZGVyZWRTZXQub2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyhhcmd1bWVudHMpfSxPcmRlcmVkU2V0LmZyb21LZXlzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzKEtleWVkSXRlcmFibGUodCkua2V5U2VxKCkpfSxPcmRlcmVkU2V0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fdG9TdHJpbmcoIk9yZGVyZWRTZXQgeyIsIn0iKX0sT3JkZXJlZFNldC5pc09yZGVyZWRTZXQ9aXNPcmRlcmVkU2V0O3ZhciBhdCxzdD1PcmRlcmVkU2V0LnByb3RvdHlwZTtmdW5jdGlvbiBtYWtlT3JkZXJlZFNldCh0LGUpe3ZhciByPU9iamVjdC5jcmVhdGUoc3QpO3JldHVybiByLnNpemU9dD90LnNpemU6MCxyLl9tYXA9dCxyLl9fb3duZXJJRD1lLHJ9ZnVuY3Rpb24gZW1wdHlPcmRlcmVkU2V0KCl7cmV0dXJuIGF0fHwoYXQ9bWFrZU9yZGVyZWRTZXQoZW1wdHlPcmRlcmVkTWFwKCkpKX1mdW5jdGlvbiBTdGFjayh0KXtyZXR1cm4gbnVsbD09dD9lbXB0eVN0YWNrKCk6aXNTdGFjayh0KT90OmVtcHR5U3RhY2soKS51bnNoaWZ0QWxsKHQpfWZ1bmN0aW9uIGlzU3RhY2sodCl7cmV0dXJuISghdHx8IXRbY3RdKX1zdFtvXT0hMCxzdC5fX2VtcHR5PWVtcHR5T3JkZXJlZFNldCxzdC5fX21ha2U9bWFrZU9yZGVyZWRTZXQsY3JlYXRlQ2xhc3MoU3RhY2ssSW5kZXhlZENvbGxlY3Rpb24pLFN0YWNrLm9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMoYXJndW1lbnRzKX0sU3RhY2sucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiU3RhY2sgWyIsIl0iKX0sU3RhY2sucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuX2hlYWQ7Zm9yKHQ9d3JhcEluZGV4KHRoaXMsdCk7ciYmdC0tOylyPXIubmV4dDtyZXR1cm4gcj9yLnZhbHVlOmV9LFN0YWNrLnByb3RvdHlwZS5wZWVrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hlYWQmJnRoaXMuX2hlYWQudmFsdWV9LFN0YWNrLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXM7Zm9yKHZhciB0PXRoaXMuc2l6ZSthcmd1bWVudHMubGVuZ3RoLGU9dGhpcy5faGVhZCxyPWFyZ3VtZW50cy5sZW5ndGgtMTtyPj0wO3ItLSllPXt2YWx1ZTphcmd1bWVudHNbcl0sbmV4dDplfTtyZXR1cm4gdGhpcy5fX293bmVySUQ/KHRoaXMuc2l6ZT10LHRoaXMuX2hlYWQ9ZSx0aGlzLl9faGFzaD12b2lkIDAsdGhpcy5fX2FsdGVyZWQ9ITAsdGhpcyk6bWFrZVN0YWNrKHQsZSl9LFN0YWNrLnByb3RvdHlwZS5wdXNoQWxsPWZ1bmN0aW9uKHQpe2lmKDA9PT0odD1JbmRleGVkSXRlcmFibGUodCkpLnNpemUpcmV0dXJuIHRoaXM7YXNzZXJ0Tm90SW5maW5pdGUodC5zaXplKTt2YXIgZT10aGlzLnNpemUscj10aGlzLl9oZWFkO3JldHVybiB0LnJldmVyc2UoKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlKysscj17dmFsdWU6dCxuZXh0OnJ9fSkpLHRoaXMuX19vd25lcklEPyh0aGlzLnNpemU9ZSx0aGlzLl9oZWFkPXIsdGhpcy5fX2hhc2g9dm9pZCAwLHRoaXMuX19hbHRlcmVkPSEwLHRoaXMpOm1ha2VTdGFjayhlLHIpfSxTdGFjay5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpY2UoMSl9LFN0YWNrLnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LFN0YWNrLnByb3RvdHlwZS51bnNoaWZ0QWxsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hBbGwodCl9LFN0YWNrLnByb3RvdHlwZS5zaGlmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBvcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LFN0YWNrLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5zaXplP3RoaXM6dGhpcy5fX293bmVySUQ/KHRoaXMuc2l6ZT0wLHRoaXMuX2hlYWQ9dm9pZCAwLHRoaXMuX19oYXNoPXZvaWQgMCx0aGlzLl9fYWx0ZXJlZD0hMCx0aGlzKTplbXB0eVN0YWNrKCl9LFN0YWNrLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe2lmKHdob2xlU2xpY2UodCxlLHRoaXMuc2l6ZSkpcmV0dXJuIHRoaXM7dmFyIHI9cmVzb2x2ZUJlZ2luKHQsdGhpcy5zaXplKTtpZihyZXNvbHZlRW5kKGUsdGhpcy5zaXplKSE9PXRoaXMuc2l6ZSlyZXR1cm4gSW5kZXhlZENvbGxlY3Rpb24ucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcyx0LGUpO2Zvcih2YXIgbj10aGlzLnNpemUtcixvPXRoaXMuX2hlYWQ7ci0tOylvPW8ubmV4dDtyZXR1cm4gdGhpcy5fX293bmVySUQ/KHRoaXMuc2l6ZT1uLHRoaXMuX2hlYWQ9byx0aGlzLl9faGFzaD12b2lkIDAsdGhpcy5fX2FsdGVyZWQ9ITAsdGhpcyk6bWFrZVN0YWNrKG4sbyl9LFN0YWNrLnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09dGhpcy5fX293bmVySUQ/dGhpczp0P21ha2VTdGFjayh0aGlzLnNpemUsdGhpcy5faGVhZCx0LHRoaXMuX19oYXNoKToodGhpcy5fX293bmVySUQ9dCx0aGlzLl9fYWx0ZXJlZD0hMSx0aGlzKX0sU3RhY2sucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbih0LGUpe2lmKGUpcmV0dXJuIHRoaXMucmV2ZXJzZSgpLl9faXRlcmF0ZSh0KTtmb3IodmFyIHI9MCxuPXRoaXMuX2hlYWQ7biYmITEhPT10KG4udmFsdWUscisrLHRoaXMpOyluPW4ubmV4dDtyZXR1cm4gcn0sU3RhY2sucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24odCxlKXtpZihlKXJldHVybiB0aGlzLnJldmVyc2UoKS5fX2l0ZXJhdG9yKHQpO3ZhciByPTAsbj10aGlzLl9oZWFkO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7aWYobil7dmFyIGU9bi52YWx1ZTtyZXR1cm4gbj1uLm5leHQsaXRlcmF0b3JWYWx1ZSh0LHIrKyxlKX1yZXR1cm4gaXRlcmF0b3JEb25lKCl9KSl9LFN0YWNrLmlzU3RhY2s9aXNTdGFjazt2YXIgdXQsY3Q9IkBAX19JTU1VVEFCTEVfU1RBQ0tfX0BAIixsdD1TdGFjay5wcm90b3R5cGU7ZnVuY3Rpb24gbWFrZVN0YWNrKHQsZSxyLG4pe3ZhciBvPU9iamVjdC5jcmVhdGUobHQpO3JldHVybiBvLnNpemU9dCxvLl9oZWFkPWUsby5fX293bmVySUQ9cixvLl9faGFzaD1uLG8uX19hbHRlcmVkPSExLG99ZnVuY3Rpb24gZW1wdHlTdGFjaygpe3JldHVybiB1dHx8KHV0PW1ha2VTdGFjaygwKSl9ZnVuY3Rpb24gbWl4aW4odCxlKXt2YXIga2V5Q29waWVyPWZ1bmN0aW9uKHIpe3QucHJvdG90eXBlW3JdPWVbcl19O3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGtleUNvcGllciksT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKS5mb3JFYWNoKGtleUNvcGllciksdH1sdFtjdF09ITAsbHQud2l0aE11dGF0aW9ucz1WLndpdGhNdXRhdGlvbnMsbHQuYXNNdXRhYmxlPVYuYXNNdXRhYmxlLGx0LmFzSW1tdXRhYmxlPVYuYXNJbW11dGFibGUsbHQud2FzQWx0ZXJlZD1WLndhc0FsdGVyZWQsSXRlcmFibGUuSXRlcmF0b3I9SXRlcmF0b3IsbWl4aW4oSXRlcmFibGUse3RvQXJyYXk6ZnVuY3Rpb24oKXthc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpO3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemV8fDApO3JldHVybiB0aGlzLnZhbHVlU2VxKCkuX19pdGVyYXRlKChmdW5jdGlvbihlLHIpe3Rbcl09ZX0pKSx0fSx0b0luZGV4ZWRTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRvSW5kZXhlZFNlcXVlbmNlKHRoaXMpfSx0b0pTOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TZXEoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC50b0pTP3QudG9KUygpOnR9KSkuX190b0pTKCl9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU2VxKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQudG9KU09OP3QudG9KU09OKCk6dH0pKS5fX3RvSlMoKX0sdG9LZXllZFNlcTpmdW5jdGlvbigpe3JldHVybiBuZXcgVG9LZXllZFNlcXVlbmNlKHRoaXMsITApfSx0b01hcDpmdW5jdGlvbigpe3JldHVybiBNYXAodGhpcy50b0tleWVkU2VxKCkpfSx0b09iamVjdDpmdW5jdGlvbigpe2Fzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7dmFyIHQ9e307cmV0dXJuIHRoaXMuX19pdGVyYXRlKChmdW5jdGlvbihlLHIpe3Rbcl09ZX0pKSx0fSx0b09yZGVyZWRNYXA6ZnVuY3Rpb24oKXtyZXR1cm4gT3JkZXJlZE1hcCh0aGlzLnRvS2V5ZWRTZXEoKSl9LHRvT3JkZXJlZFNldDpmdW5jdGlvbigpe3JldHVybiBPcmRlcmVkU2V0KGlzS2V5ZWQodGhpcyk/dGhpcy52YWx1ZVNlcSgpOnRoaXMpfSx0b1NldDpmdW5jdGlvbigpe3JldHVybiBTZXQoaXNLZXllZCh0aGlzKT90aGlzLnZhbHVlU2VxKCk6dGhpcyl9LHRvU2V0U2VxOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBUb1NldFNlcXVlbmNlKHRoaXMpfSx0b1NlcTpmdW5jdGlvbigpe3JldHVybiBpc0luZGV4ZWQodGhpcyk/dGhpcy50b0luZGV4ZWRTZXEoKTppc0tleWVkKHRoaXMpP3RoaXMudG9LZXllZFNlcSgpOnRoaXMudG9TZXRTZXEoKX0sdG9TdGFjazpmdW5jdGlvbigpe3JldHVybiBTdGFjayhpc0tleWVkKHRoaXMpP3RoaXMudmFsdWVTZXEoKTp0aGlzKX0sdG9MaXN0OmZ1bmN0aW9uKCl7cmV0dXJuIExpc3QoaXNLZXllZCh0aGlzKT90aGlzLnZhbHVlU2VxKCk6dGhpcyl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIltJdGVyYWJsZV0ifSxfX3RvU3RyaW5nOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PT10aGlzLnNpemU/dCtlOnQrIiAiK3RoaXMudG9TZXEoKS5tYXAodGhpcy5fX3RvU3RyaW5nTWFwcGVyKS5qb2luKCIsICIpKyIgIitlfSxjb25jYXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcmVpZnkodGhpcyxjb25jYXRGYWN0b3J5KHRoaXMsdC5jYWxsKGFyZ3VtZW50cywwKSkpfSxpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gaXMoZSx0KX0pKX0sZW50cmllczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9faXRlcmF0b3IoZCl9LGV2ZXJ5OmZ1bmN0aW9uKHQsZSl7YXNzZXJ0Tm90SW5maW5pdGUodGhpcy5zaXplKTt2YXIgcj0hMDtyZXR1cm4gdGhpcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKG4sbyxpKXtpZighdC5jYWxsKGUsbixvLGkpKXJldHVybiByPSExLCExfSkpLHJ9LGZpbHRlcjpmdW5jdGlvbih0LGUpe3JldHVybiByZWlmeSh0aGlzLGZpbHRlckZhY3RvcnkodGhpcyx0LGUsITApKX0sZmluZDpmdW5jdGlvbih0LGUscil7dmFyIG49dGhpcy5maW5kRW50cnkodCxlKTtyZXR1cm4gbj9uWzFdOnJ9LGZvckVhY2g6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXNzZXJ0Tm90SW5maW5pdGUodGhpcy5zaXplKSx0aGlzLl9faXRlcmF0ZShlP3QuYmluZChlKTp0KX0sam9pbjpmdW5jdGlvbih0KXthc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpLHQ9dm9pZCAwIT09dD8iIit0OiIsIjt2YXIgZT0iIixyPSEwO3JldHVybiB0aGlzLl9faXRlcmF0ZSgoZnVuY3Rpb24obil7cj9yPSExOmUrPXQsZSs9bnVsbCE9bj9uLnRvU3RyaW5nKCk6IiJ9KSksZX0sa2V5czpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9faXRlcmF0b3IocCl9LG1hcDpmdW5jdGlvbih0LGUpe3JldHVybiByZWlmeSh0aGlzLG1hcEZhY3RvcnkodGhpcyx0LGUpKX0scmVkdWNlOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbixvO3JldHVybiBhc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpLGFyZ3VtZW50cy5sZW5ndGg8Mj9vPSEwOm49ZSx0aGlzLl9faXRlcmF0ZSgoZnVuY3Rpb24oZSxpLGEpe28/KG89ITEsbj1lKTpuPXQuY2FsbChyLG4sZSxpLGEpfSkpLG59LHJlZHVjZVJpZ2h0OmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnRvS2V5ZWRTZXEoKS5yZXZlcnNlKCk7cmV0dXJuIG4ucmVkdWNlLmFwcGx5KG4sYXJndW1lbnRzKX0scmV2ZXJzZTpmdW5jdGlvbigpe3JldHVybiByZWlmeSh0aGlzLHJldmVyc2VGYWN0b3J5KHRoaXMsITApKX0sc2xpY2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcmVpZnkodGhpcyxzbGljZUZhY3RvcnkodGhpcyx0LGUsITApKX0sc29tZTpmdW5jdGlvbih0LGUpe3JldHVybiF0aGlzLmV2ZXJ5KG5vdCh0KSxlKX0sc29ydDpmdW5jdGlvbih0KXtyZXR1cm4gcmVpZnkodGhpcyxzb3J0RmFjdG9yeSh0aGlzLHQpKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19pdGVyYXRvcihoKX0sYnV0TGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNsaWNlKDAsLTEpfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuc2l6ZT8wPT09dGhpcy5zaXplOiF0aGlzLnNvbWUoKGZ1bmN0aW9uKCl7cmV0dXJuITB9KSl9LGNvdW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVuc3VyZVNpemUodD90aGlzLnRvU2VxKCkuZmlsdGVyKHQsZSk6dGhpcyl9LGNvdW50Qnk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gY291bnRCeUZhY3RvcnkodGhpcyx0LGUpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuIGRlZXBFcXVhbCh0aGlzLHQpfSxlbnRyeVNlcTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodC5fY2FjaGUpcmV0dXJuIG5ldyBBcnJheVNlcSh0Ll9jYWNoZSk7dmFyIGU9dC50b1NlcSgpLm1hcChlbnRyeU1hcHBlcikudG9JbmRleGVkU2VxKCk7cmV0dXJuIGUuZnJvbUVudHJ5U2VxPWZ1bmN0aW9uKCl7cmV0dXJuIHQudG9TZXEoKX0sZX0sZmlsdGVyTm90OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZmlsdGVyKG5vdCh0KSxlKX0sZmluZEVudHJ5OmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yO3JldHVybiB0aGlzLl9faXRlcmF0ZSgoZnVuY3Rpb24ocixvLGkpe2lmKHQuY2FsbChlLHIsbyxpKSlyZXR1cm4gbj1bbyxyXSwhMX0pKSxufSxmaW5kS2V5OmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5maW5kRW50cnkodCxlKTtyZXR1cm4gciYmclswXX0sZmluZExhc3Q6ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLnRvS2V5ZWRTZXEoKS5yZXZlcnNlKCkuZmluZCh0LGUscil9LGZpbmRMYXN0RW50cnk6ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0aGlzLnRvS2V5ZWRTZXEoKS5yZXZlcnNlKCkuZmluZEVudHJ5KHQsZSxyKX0sZmluZExhc3RLZXk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50b0tleWVkU2VxKCkucmV2ZXJzZSgpLmZpbmRLZXkodCxlKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maW5kKHJldHVyblRydWUpfSxmbGF0TWFwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHJlaWZ5KHRoaXMsZmxhdE1hcEZhY3RvcnkodGhpcyx0LGUpKX0sZmxhdHRlbjpmdW5jdGlvbih0KXtyZXR1cm4gcmVpZnkodGhpcyxmbGF0dGVuRmFjdG9yeSh0aGlzLHQsITApKX0sZnJvbUVudHJ5U2VxOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBGcm9tRW50cmllc1NlcXVlbmNlKHRoaXMpfSxnZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5maW5kKChmdW5jdGlvbihlLHIpe3JldHVybiBpcyhyLHQpfSksdm9pZCAwLGUpfSxnZXRJbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcixuPXRoaXMsbz1mb3JjZUl0ZXJhdG9yKHQpOyEocj1vLm5leHQoKSkuZG9uZTspe3ZhciBpPXIudmFsdWU7aWYoKG49biYmbi5nZXQ/bi5nZXQoaSxjKTpjKT09PWMpcmV0dXJuIGV9cmV0dXJuIG59LGdyb3VwQnk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZ3JvdXBCeUZhY3RvcnkodGhpcyx0LGUpfSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0KHQsYykhPT1jfSxoYXNJbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRJbih0LGMpIT09Y30saXNTdWJzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQuaW5jbHVkZXM/dDpJdGVyYWJsZSh0KSx0aGlzLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gdC5pbmNsdWRlcyhlKX0pKX0saXNTdXBlcnNldDpmdW5jdGlvbih0KXtyZXR1cm4odD0iZnVuY3Rpb24iPT10eXBlb2YgdC5pc1N1YnNldD90Okl0ZXJhYmxlKHQpKS5pc1N1YnNldCh0aGlzKX0sa2V5T2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmluZEtleSgoZnVuY3Rpb24oZSl7cmV0dXJuIGlzKGUsdCl9KSl9LGtleVNlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU2VxKCkubWFwKGtleU1hcHBlcikudG9JbmRleGVkU2VxKCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1NlcSgpLnJldmVyc2UoKS5maXJzdCgpfSxsYXN0S2V5T2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKS5rZXlPZih0KX0sbWF4OmZ1bmN0aW9uKHQpe3JldHVybiBtYXhGYWN0b3J5KHRoaXMsdCl9LG1heEJ5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG1heEZhY3RvcnkodGhpcyxlLHQpfSxtaW46ZnVuY3Rpb24odCl7cmV0dXJuIG1heEZhY3RvcnkodGhpcyx0P25lZyh0KTpkZWZhdWx0TmVnQ29tcGFyYXRvcil9LG1pbkJ5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG1heEZhY3RvcnkodGhpcyxlP25lZyhlKTpkZWZhdWx0TmVnQ29tcGFyYXRvcix0KX0scmVzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNsaWNlKDEpfSxza2lwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNsaWNlKE1hdGgubWF4KDAsdCkpfSxza2lwTGFzdDpmdW5jdGlvbih0KXtyZXR1cm4gcmVpZnkodGhpcyx0aGlzLnRvU2VxKCkucmV2ZXJzZSgpLnNraXAodCkucmV2ZXJzZSgpKX0sc2tpcFdoaWxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHJlaWZ5KHRoaXMsc2tpcFdoaWxlRmFjdG9yeSh0aGlzLHQsZSwhMCkpfSxza2lwVW50aWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5za2lwV2hpbGUobm90KHQpLGUpfSxzb3J0Qnk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcmVpZnkodGhpcyxzb3J0RmFjdG9yeSh0aGlzLGUsdCkpfSx0YWtlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNsaWNlKDAsTWF0aC5tYXgoMCx0KSl9LHRha2VMYXN0OmZ1bmN0aW9uKHQpe3JldHVybiByZWlmeSh0aGlzLHRoaXMudG9TZXEoKS5yZXZlcnNlKCkudGFrZSh0KS5yZXZlcnNlKCkpfSx0YWtlV2hpbGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcmVpZnkodGhpcyx0YWtlV2hpbGVGYWN0b3J5KHRoaXMsdCxlKSl9LHRha2VVbnRpbDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnRha2VXaGlsZShub3QodCksZSl9LHZhbHVlU2VxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9JbmRleGVkU2VxKCl9LGhhc2hDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19oYXNofHwodGhpcy5fX2hhc2g9aGFzaEl0ZXJhYmxlKHRoaXMpKX19KTt2YXIgcHQ9SXRlcmFibGUucHJvdG90eXBlO3B0W2VdPSEwLHB0W2ddPXB0LnZhbHVlcyxwdC5fX3RvSlM9cHQudG9BcnJheSxwdC5fX3RvU3RyaW5nTWFwcGVyPXF1b3RlU3RyaW5nLHB0Lmluc3BlY3Q9cHQudG9Tb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpfSxwdC5jaGFpbj1wdC5mbGF0TWFwLHB0LmNvbnRhaW5zPXB0LmluY2x1ZGVzLG1peGluKEtleWVkSXRlcmFibGUse2ZsaXA6ZnVuY3Rpb24oKXtyZXR1cm4gcmVpZnkodGhpcyxmbGlwRmFjdG9yeSh0aGlzKSl9LG1hcEVudHJpZXM6ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLG49MDtyZXR1cm4gcmVpZnkodGhpcyx0aGlzLnRvU2VxKCkubWFwKChmdW5jdGlvbihvLGkpe3JldHVybiB0LmNhbGwoZSxbaSxvXSxuKysscil9KSkuZnJvbUVudHJ5U2VxKCkpfSxtYXBLZXlzOmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcztyZXR1cm4gcmVpZnkodGhpcyx0aGlzLnRvU2VxKCkuZmxpcCgpLm1hcCgoZnVuY3Rpb24obixvKXtyZXR1cm4gdC5jYWxsKGUsbixvLHIpfSkpLmZsaXAoKSl9fSk7dmFyIGh0PUtleWVkSXRlcmFibGUucHJvdG90eXBlO2Z1bmN0aW9uIGtleU1hcHBlcih0LGUpe3JldHVybiBlfWZ1bmN0aW9uIGVudHJ5TWFwcGVyKHQsZSl7cmV0dXJuW2UsdF19ZnVuY3Rpb24gbm90KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiF0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gbmVnKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybi10LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gcXVvdGVTdHJpbmcodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0pTT04uc3RyaW5naWZ5KHQpOlN0cmluZyh0KX1mdW5jdGlvbiBkZWZhdWx0WmlwcGVyKCl7cmV0dXJuIGFyckNvcHkoYXJndW1lbnRzKX1mdW5jdGlvbiBkZWZhdWx0TmVnQ29tcGFyYXRvcih0LGUpe3JldHVybiB0PGU/MTp0PmU/LTE6MH1mdW5jdGlvbiBoYXNoSXRlcmFibGUodCl7aWYodC5zaXplPT09MS8wKXJldHVybiAwO3ZhciBlPWlzT3JkZXJlZCh0KSxyPWlzS2V5ZWQodCksbj1lPzE6MDtyZXR1cm4gbXVybXVySGFzaE9mU2l6ZSh0Ll9faXRlcmF0ZShyP2U/ZnVuY3Rpb24odCxlKXtuPTMxKm4raGFzaE1lcmdlKGhhc2godCksaGFzaChlKSl8MH06ZnVuY3Rpb24odCxlKXtuPW4raGFzaE1lcmdlKGhhc2godCksaGFzaChlKSl8MH06ZT9mdW5jdGlvbih0KXtuPTMxKm4raGFzaCh0KXwwfTpmdW5jdGlvbih0KXtuPW4raGFzaCh0KXwwfSksbil9ZnVuY3Rpb24gbXVybXVySGFzaE9mU2l6ZSh0LGUpe3JldHVybiBlPUkoZSwzNDMyOTE4MzUzKSxlPUkoZTw8MTV8ZT4+Pi0xNSw0NjE4NDU5MDcpLGU9SShlPDwxM3xlPj4+LTEzLDUpLGU9SSgoZT1lKzM4NjQyOTIxOTZedCleZT4+PjE2LDIyNDY4MjI1MDcpLGU9c21pKChlPUkoZV5lPj4+MTMsMzI2NjQ4OTkwOSkpXmU+Pj4xNil9ZnVuY3Rpb24gaGFzaE1lcmdlKHQsZSl7cmV0dXJuIHReZSsyNjU0NDM1NzY5Kyh0PDw2KSsodD4+Mil9cmV0dXJuIGh0W3JdPSEwLGh0W2ddPXB0LmVudHJpZXMsaHQuX190b0pTPXB0LnRvT2JqZWN0LGh0Ll9fdG9TdHJpbmdNYXBwZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSkrIjogIitxdW90ZVN0cmluZyh0KX0sbWl4aW4oSW5kZXhlZEl0ZXJhYmxlLHt0b0tleWVkU2VxOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBUb0tleWVkU2VxdWVuY2UodGhpcywhMSl9LGZpbHRlcjpmdW5jdGlvbih0LGUpe3JldHVybiByZWlmeSh0aGlzLGZpbHRlckZhY3RvcnkodGhpcyx0LGUsITEpKX0sZmluZEluZGV4OmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5maW5kRW50cnkodCxlKTtyZXR1cm4gcj9yWzBdOi0xfSxpbmRleE9mOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMua2V5T2YodCk7cmV0dXJuIHZvaWQgMD09PWU/LTE6ZX0sbGFzdEluZGV4T2Y6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sYXN0S2V5T2YodCk7cmV0dXJuIHZvaWQgMD09PWU/LTE6ZX0scmV2ZXJzZTpmdW5jdGlvbigpe3JldHVybiByZWlmeSh0aGlzLHJldmVyc2VGYWN0b3J5KHRoaXMsITEpKX0sc2xpY2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcmVpZnkodGhpcyxzbGljZUZhY3RvcnkodGhpcyx0LGUsITEpKX0sc3BsaWNlOmZ1bmN0aW9uKHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtpZihlPU1hdGgubWF4KDB8ZSwwKSwwPT09cnx8Mj09PXImJiFlKXJldHVybiB0aGlzO3Q9cmVzb2x2ZUJlZ2luKHQsdDwwP3RoaXMuY291bnQoKTp0aGlzLnNpemUpO3ZhciBuPXRoaXMuc2xpY2UoMCx0KTtyZXR1cm4gcmVpZnkodGhpcywxPT09cj9uOm4uY29uY2F0KGFyckNvcHkoYXJndW1lbnRzLDIpLHRoaXMuc2xpY2UodCtlKSkpfSxmaW5kTGFzdEluZGV4OmZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5maW5kTGFzdEVudHJ5KHQsZSk7cmV0dXJuIHI/clswXTotMX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoMCl9LGZsYXR0ZW46ZnVuY3Rpb24odCl7cmV0dXJuIHJlaWZ5KHRoaXMsZmxhdHRlbkZhY3RvcnkodGhpcyx0LCExKSl9LGdldDpmdW5jdGlvbih0LGUpe3JldHVybih0PXdyYXBJbmRleCh0aGlzLHQpKTwwfHx0aGlzLnNpemU9PT0xLzB8fHZvaWQgMCE9PXRoaXMuc2l6ZSYmdD50aGlzLnNpemU/ZTp0aGlzLmZpbmQoKGZ1bmN0aW9uKGUscil7cmV0dXJuIHI9PT10fSksdm9pZCAwLGUpfSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9d3JhcEluZGV4KHRoaXMsdCkpPj0wJiYodm9pZCAwIT09dGhpcy5zaXplP3RoaXMuc2l6ZT09PTEvMHx8dDx0aGlzLnNpemU6LTEhPT10aGlzLmluZGV4T2YodCkpfSxpbnRlcnBvc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHJlaWZ5KHRoaXMsaW50ZXJwb3NlRmFjdG9yeSh0aGlzLHQpKX0saW50ZXJsZWF2ZTpmdW5jdGlvbigpe3ZhciB0PVt0aGlzXS5jb25jYXQoYXJyQ29weShhcmd1bWVudHMpKSxlPXppcFdpdGhGYWN0b3J5KHRoaXMudG9TZXEoKSxJbmRleGVkU2VxLm9mLHQpLHI9ZS5mbGF0dGVuKCEwKTtyZXR1cm4gZS5zaXplJiYoci5zaXplPWUuc2l6ZSp0Lmxlbmd0aCkscmVpZnkodGhpcyxyKX0sa2V5U2VxOmZ1bmN0aW9uKCl7cmV0dXJuIFJhbmdlKDAsdGhpcy5zaXplKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldCgtMSl9LHNraXBXaGlsZTpmdW5jdGlvbih0LGUpe3JldHVybiByZWlmeSh0aGlzLHNraXBXaGlsZUZhY3RvcnkodGhpcyx0LGUsITEpKX0semlwOmZ1bmN0aW9uKCl7cmV0dXJuIHJlaWZ5KHRoaXMsemlwV2l0aEZhY3RvcnkodGhpcyxkZWZhdWx0WmlwcGVyLFt0aGlzXS5jb25jYXQoYXJyQ29weShhcmd1bWVudHMpKSkpfSx6aXBXaXRoOmZ1bmN0aW9uKHQpe3ZhciBlPWFyckNvcHkoYXJndW1lbnRzKTtyZXR1cm4gZVswXT10aGlzLHJlaWZ5KHRoaXMsemlwV2l0aEZhY3RvcnkodGhpcyx0LGUpKX19KSxJbmRleGVkSXRlcmFibGUucHJvdG90eXBlW25dPSEwLEluZGV4ZWRJdGVyYWJsZS5wcm90b3R5cGVbb109ITAsbWl4aW4oU2V0SXRlcmFibGUse2dldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmhhcyh0KT90OmV9LGluY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmhhcyh0KX0sa2V5U2VxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVTZXEoKX19KSxTZXRJdGVyYWJsZS5wcm90b3R5cGUuaGFzPXB0LmluY2x1ZGVzLFNldEl0ZXJhYmxlLnByb3RvdHlwZS5jb250YWlucz1TZXRJdGVyYWJsZS5wcm90b3R5cGUuaW5jbHVkZXMsbWl4aW4oS2V5ZWRTZXEsS2V5ZWRJdGVyYWJsZS5wcm90b3R5cGUpLG1peGluKEluZGV4ZWRTZXEsSW5kZXhlZEl0ZXJhYmxlLnByb3RvdHlwZSksbWl4aW4oU2V0U2VxLFNldEl0ZXJhYmxlLnByb3RvdHlwZSksbWl4aW4oS2V5ZWRDb2xsZWN0aW9uLEtleWVkSXRlcmFibGUucHJvdG90eXBlKSxtaXhpbihJbmRleGVkQ29sbGVjdGlvbixJbmRleGVkSXRlcmFibGUucHJvdG90eXBlKSxtaXhpbihTZXRDb2xsZWN0aW9uLFNldEl0ZXJhYmxlLnByb3RvdHlwZSkse0l0ZXJhYmxlLFNlcSxDb2xsZWN0aW9uLE1hcCxPcmRlcmVkTWFwLExpc3QsU3RhY2ssU2V0LE9yZGVyZWRTZXQsUmVjb3JkLFJhbmdlLFJlcGVhdCxpcyxmcm9tSlN9fSgpfSw2Njk4KHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP3QuZXhwb3J0cz1mdW5jdGlvbiBpbmhlcml0cyh0LGUpe2UmJih0LnN1cGVyXz1lLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pKX06dC5leHBvcnRzPWZ1bmN0aW9uIGluaGVyaXRzKHQsZSl7aWYoZSl7dC5zdXBlcl89ZTt2YXIgVGVtcEN0b3I9ZnVuY3Rpb24oKXt9O1RlbXBDdG9yLnByb3RvdHlwZT1lLnByb3RvdHlwZSx0LnByb3RvdHlwZT1uZXcgVGVtcEN0b3IsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH19fSw5NjAwKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZSxyLG49RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLG89Im9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiZudWxsIT09UmVmbGVjdCYmUmVmbGVjdC5hcHBseTtpZigiZnVuY3Rpb24iPT10eXBlb2YgbyYmImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSl0cnl7ZT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImxlbmd0aCIse2dldDpmdW5jdGlvbigpe3Rocm93IHJ9fSkscj17fSxvKChmdW5jdGlvbigpe3Rocm93IDQyfSksbnVsbCxlKX1jYXRjaCh0KXt0IT09ciYmKG89bnVsbCl9ZWxzZSBvPW51bGw7dmFyIGk9L15ccypjbGFzc1xiLyxhPWZ1bmN0aW9uIGlzRVM2Q2xhc3NGdW5jdGlvbih0KXt0cnl7dmFyIGU9bi5jYWxsKHQpO3JldHVybiBpLnRlc3QoZSl9Y2F0Y2godCl7cmV0dXJuITF9fSxzPWZ1bmN0aW9uIHRyeUZ1bmN0aW9uVG9TdHIodCl7dHJ5e3JldHVybiFhKHQpJiYobi5jYWxsKHQpLCEwKX1jYXRjaCh0KXtyZXR1cm4hMX19LHU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxjPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiEhU3ltYm9sLnRvU3RyaW5nVGFnLGY9ISgwIGluWyxdKSxsPWZ1bmN0aW9uIGlzRG9jdW1lbnREb3RBbGwoKXtyZXR1cm4hMX07aWYoIm9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCl7dmFyIHA9ZG9jdW1lbnQuYWxsO3UuY2FsbChwKT09PXUuY2FsbChkb2N1bWVudC5hbGwpJiYobD1mdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKHQpe2lmKChmfHwhdCkmJih2b2lkIDA9PT10fHwib2JqZWN0Ij09dHlwZW9mIHQpKXRyeXt2YXIgZT11LmNhbGwodCk7cmV0dXJuKCJbb2JqZWN0IEhUTUxBbGxDb2xsZWN0aW9uXSI9PT1lfHwiW29iamVjdCBIVE1MIGRvY3VtZW50LmFsbCBjbGFzc10iPT09ZXx8IltvYmplY3QgSFRNTENvbGxlY3Rpb25dIj09PWV8fCJbb2JqZWN0IE9iamVjdF0iPT09ZSkmJm51bGw9PXQoIiIpfWNhdGNoKHQpe31yZXR1cm4hMX0pfXQuZXhwb3J0cz1vP2Z1bmN0aW9uIGlzQ2FsbGFibGUodCl7aWYobCh0KSlyZXR1cm4hMDtpZighdClyZXR1cm4hMTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmIm9iamVjdCIhPXR5cGVvZiB0KXJldHVybiExO3RyeXtvKHQsbnVsbCxlKX1jYXRjaCh0KXtpZih0IT09cilyZXR1cm4hMX1yZXR1cm4hYSh0KSYmcyh0KX06ZnVuY3Rpb24gaXNDYWxsYWJsZSh0KXtpZihsKHQpKXJldHVybiEwO2lmKCF0KXJldHVybiExO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiYib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJuITE7aWYoYylyZXR1cm4gcyh0KTtpZihhKHQpKXJldHVybiExO3ZhciBlPXUuY2FsbCh0KTtyZXR1cm4hKCJbb2JqZWN0IEZ1bmN0aW9uXSIhPT1lJiYiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iIT09ZSYmIS9eXFtvYmplY3QgSFRNTC8udGVzdChlKSkmJnModCl9fSw1NjgwKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig1NzY3KTt0LmV4cG9ydHM9ZnVuY3Rpb24gaXNUeXBlZEFycmF5KHQpe3JldHVybiEhbih0KX19LDQ2MzQodCl7dmFyIGU9e30udG9TdHJpbmc7dC5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PWUuY2FsbCh0KX19LDU1ODAodCxlLHIpe3ZhciBuPXIoNjExMCkocig5MzI1KSwiRGF0YVZpZXciKTt0LmV4cG9ydHM9bn0sMTU0OSh0LGUscil7dmFyIG49cigyMDMyKSxvPXIoMzg2MiksaT1yKDY3MjEpLGE9cigyNzQ5KSxzPXIoNTc0OSk7ZnVuY3Rpb24gSGFzaCh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1IYXNoLnByb3RvdHlwZS5jbGVhcj1uLEhhc2gucHJvdG90eXBlLmRlbGV0ZT1vLEhhc2gucHJvdG90eXBlLmdldD1pLEhhc2gucHJvdG90eXBlLmhhcz1hLEhhc2gucHJvdG90eXBlLnNldD1zLHQuZXhwb3J0cz1IYXNofSw3OSh0LGUscil7dmFyIG49cigzNzAyKSxvPXIoODApLGk9cig0NzM5KSxhPXIoODY1NSkscz1yKDExNzUpO2Z1bmN0aW9uIExpc3RDYWNoZSh0KXt2YXIgZT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxyOyl7dmFyIG49dFtlXTt0aGlzLnNldChuWzBdLG5bMV0pfX1MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyPW4sTGlzdENhY2hlLnByb3RvdHlwZS5kZWxldGU9byxMaXN0Q2FjaGUucHJvdG90eXBlLmdldD1pLExpc3RDYWNoZS5wcm90b3R5cGUuaGFzPWEsTGlzdENhY2hlLnByb3RvdHlwZS5zZXQ9cyx0LmV4cG9ydHM9TGlzdENhY2hlfSw4MjIzKHQsZSxyKXt2YXIgbj1yKDYxMTApKHIoOTMyNSksIk1hcCIpO3QuZXhwb3J0cz1ufSwzNjYxKHQsZSxyKXt2YXIgbj1yKDMwNDApLG89cig3NjcwKSxpPXIoMjg5KSxhPXIoNDUwOSkscz1yKDI5NDkpO2Z1bmN0aW9uIE1hcENhY2hlKHQpe3ZhciBlPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPHI7KXt2YXIgbj10W2VdO3RoaXMuc2V0KG5bMF0sblsxXSl9fU1hcENhY2hlLnByb3RvdHlwZS5jbGVhcj1uLE1hcENhY2hlLnByb3RvdHlwZS5kZWxldGU9byxNYXBDYWNoZS5wcm90b3R5cGUuZ2V0PWksTWFwQ2FjaGUucHJvdG90eXBlLmhhcz1hLE1hcENhY2hlLnByb3RvdHlwZS5zZXQ9cyx0LmV4cG9ydHM9TWFwQ2FjaGV9LDI4MDQodCxlLHIpe3ZhciBuPXIoNjExMCkocig5MzI1KSwiUHJvbWlzZSIpO3QuZXhwb3J0cz1ufSw2NTQ1KHQsZSxyKXt2YXIgbj1yKDYxMTApKHIoOTMyNSksIlNldCIpO3QuZXhwb3J0cz1ufSw4ODU5KHQsZSxyKXt2YXIgbj1yKDM2NjEpLG89cigxMzgwKSxpPXIoMTQ1OSk7ZnVuY3Rpb24gU2V0Q2FjaGUodCl7dmFyIGU9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IG47KytlPHI7KXRoaXMuYWRkKHRbZV0pfVNldENhY2hlLnByb3RvdHlwZS5hZGQ9U2V0Q2FjaGUucHJvdG90eXBlLnB1c2g9byxTZXRDYWNoZS5wcm90b3R5cGUuaGFzPWksdC5leHBvcnRzPVNldENhY2hlfSw3MjE3KHQsZSxyKXt2YXIgbj1yKDc5KSxvPXIoMTQyMCksaT1yKDkzOCksYT1yKDM2MDUpLHM9cig5ODE3KSx1PXIoOTQ1KTtmdW5jdGlvbiBTdGFjayh0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyBuKHQpO3RoaXMuc2l6ZT1lLnNpemV9U3RhY2sucHJvdG90eXBlLmNsZWFyPW8sU3RhY2sucHJvdG90eXBlLmRlbGV0ZT1pLFN0YWNrLnByb3RvdHlwZS5nZXQ9YSxTdGFjay5wcm90b3R5cGUuaGFzPXMsU3RhY2sucHJvdG90eXBlLnNldD11LHQuZXhwb3J0cz1TdGFja30sMTg3Myh0LGUscil7dmFyIG49cig5MzI1KS5TeW1ib2w7dC5leHBvcnRzPW59LDc4MjgodCxlLHIpe3ZhciBuPXIoOTMyNSkuVWludDhBcnJheTt0LmV4cG9ydHM9bn0sODMwMyh0LGUscil7dmFyIG49cig2MTEwKShyKDkzMjUpLCJXZWFrTWFwIik7dC5leHBvcnRzPW59LDk3NzAodCl7dC5leHBvcnRzPWZ1bmN0aW9uIGFycmF5RmlsdGVyKHQsZSl7Zm9yKHZhciByPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLG89MCxpPVtdOysrcjxuOyl7dmFyIGE9dFtyXTtlKGEscix0KSYmKGlbbysrXT1hKX1yZXR1cm4gaX19LDY5NSh0LGUscil7dmFyIG49cig4MDk2KSxvPXIoMjQyOCksaT1yKDY0NDkpLGE9cigzNjU2KSxzPXIoMzYxKSx1PXIoNzE2NyksYz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbiBhcnJheUxpa2VLZXlzKHQsZSl7dmFyIHI9aSh0KSxmPSFyJiZvKHQpLGw9IXImJiFmJiZhKHQpLHA9IXImJiFmJiYhbCYmdSh0KSxoPXJ8fGZ8fGx8fHAsZD1oP24odC5sZW5ndGgsU3RyaW5nKTpbXSx5PWQubGVuZ3RoO2Zvcih2YXIgXyBpbiB0KSFlJiYhYy5jYWxsKHQsXyl8fGgmJigibGVuZ3RoIj09X3x8bCYmKCJvZmZzZXQiPT1ffHwicGFyZW50Ij09Xyl8fHAmJigiYnVmZmVyIj09X3x8ImJ5dGVMZW5ndGgiPT1ffHwiYnl0ZU9mZnNldCI9PV8pfHxzKF8seSkpfHxkLnB1c2goXyk7cmV0dXJuIGR9fSw0OTMyKHQpe3QuZXhwb3J0cz1mdW5jdGlvbiBhcnJheU1hcCh0LGUpe2Zvcih2YXIgcj0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aCxvPUFycmF5KG4pOysrcjxuOylvW3JdPWUodFtyXSxyLHQpO3JldHVybiBvfX0sNDUyOCh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gYXJyYXlQdXNoKHQsZSl7Zm9yKHZhciByPS0xLG49ZS5sZW5ndGgsbz10Lmxlbmd0aDsrK3I8bjspdFtvK3JdPWVbcl07cmV0dXJuIHR9fSw4ODIodCl7dC5leHBvcnRzPWZ1bmN0aW9uIGFycmF5UmVkdWNlKHQsZSxyLG4pe3ZhciBvPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoO2ZvcihuJiZpJiYocj10Wysrb10pOysrbzxpOylyPWUocix0W29dLG8sdCk7cmV0dXJuIHJ9fSw0MjQ4KHQpe3QuZXhwb3J0cz1mdW5jdGlvbiBhcnJheVNvbWUodCxlKXtmb3IodmFyIHI9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7KytyPG47KWlmKGUodFtyXSxyLHQpKXJldHVybiEwO3JldHVybiExfX0sMTA3NCh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gYXNjaWlUb0FycmF5KHQpe3JldHVybiB0LnNwbGl0KCIiKX19LDE3MzModCl7dmFyIGU9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZzt0LmV4cG9ydHM9ZnVuY3Rpb24gYXNjaWlXb3Jkcyh0KXtyZXR1cm4gdC5tYXRjaChlKXx8W119fSw2NTQ3KHQsZSxyKXt2YXIgbj1yKDMzNjApLG89cig1Mjg4KSxpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uIGFzc2lnblZhbHVlKHQsZSxyKXt2YXIgYT10W2VdO2kuY2FsbCh0LGUpJiZvKGEscikmJih2b2lkIDAhPT1yfHxlIGluIHQpfHxuKHQsZSxyKX19LDYwMjUodCxlLHIpe3ZhciBuPXIoNTI4OCk7dC5leHBvcnRzPWZ1bmN0aW9uIGFzc29jSW5kZXhPZih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKG4odFtyXVswXSxlKSlyZXR1cm4gcjtyZXR1cm4tMX19LDMzNjAodCxlLHIpe3ZhciBuPXIoMzI0Myk7dC5leHBvcnRzPWZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZSh0LGUscil7Il9fcHJvdG9fXyI9PWUmJm4/bih0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnIsd3JpdGFibGU6ITB9KTp0W2VdPXJ9fSw5MDkodCxlLHIpe3ZhciBuPXIoNjQxKSxvPXIoODMyOSkobik7dC5leHBvcnRzPW99LDI1MjModCl7dC5leHBvcnRzPWZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgodCxlLHIsbil7Zm9yKHZhciBvPXQubGVuZ3RoLGk9cisobj8xOi0xKTtuP2ktLTorK2k8bzspaWYoZSh0W2ldLGksdCkpcmV0dXJuIGk7cmV0dXJuLTF9fSw2NjQ5KHQsZSxyKXt2YXIgbj1yKDMyMjEpKCk7dC5leHBvcnRzPW59LDY0MSh0LGUscil7dmFyIG49cig2NjQ5KSxvPXIoNTk1MCk7dC5leHBvcnRzPWZ1bmN0aW9uIGJhc2VGb3JPd24odCxlKXtyZXR1cm4gdCYmbih0LGUsbyl9fSw3NDIyKHQsZSxyKXt2YXIgbj1yKDE3NjkpLG89cig3Nzk3KTt0LmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUdldCh0LGUpe2Zvcih2YXIgcj0wLGk9KGU9bihlLHQpKS5sZW5ndGg7bnVsbCE9dCYmcjxpOyl0PXRbbyhlW3IrK10pXTtyZXR1cm4gciYmcj09aT90OnZvaWQgMH19LDIxOTkodCxlLHIpe3ZhciBuPXIoNDUyOCksbz1yKDY0NDkpO3QuZXhwb3J0cz1mdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyh0LGUscil7dmFyIGk9ZSh0KTtyZXR1cm4gbyh0KT9pOm4oaSxyKHQpKX19LDI1NTIodCxlLHIpe3ZhciBuPXIoMTg3Myksbz1yKDY1OSksaT1yKDkzNTApLGE9bj9uLnRvU3RyaW5nVGFnOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUdldFRhZyh0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjphJiZhIGluIE9iamVjdCh0KT9vKHQpOmkodCl9fSw4MDc3KHQpe3QuZXhwb3J0cz1mdW5jdGlvbiBiYXNlSGFzSW4odCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9fSw3NTM0KHQsZSxyKXt2YXIgbj1yKDI1NTIpLG89cigzNDYpO3QuZXhwb3J0cz1mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModCl7cmV0dXJuIG8odCkmJiJbb2JqZWN0IEFyZ3VtZW50c10iPT1uKHQpfX0sMjcwKHQsZSxyKXt2YXIgbj1yKDcwNjgpLG89cigzNDYpO3QuZXhwb3J0cz1mdW5jdGlvbiBiYXNlSXNFcXVhbCh0LGUscixpLGEpe3JldHVybiB0PT09ZXx8KG51bGw9PXR8fG51bGw9PWV8fCFvKHQpJiYhbyhlKT90IT10JiZlIT1lOm4odCxlLHIsaSxiYXNlSXNFcXVhbCxhKSl9fSw3MDY4KHQsZSxyKXt2YXIgbj1yKDcyMTcpLG89cig1OTExKSxpPXIoMTk4NiksYT1yKDY4OSkscz1yKDU4NjEpLHU9cig2NDQ5KSxjPXIoMzY1NiksZj1yKDcxNjcpLGw9IltvYmplY3QgQXJndW1lbnRzXSIscD0iW29iamVjdCBBcnJheV0iLGg9IltvYmplY3QgT2JqZWN0XSIsZD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAodCxlLHIseSxfLGcpe3ZhciBtPXUodCksdj11KGUpLGI9bT9wOnModCksdz12P3A6cyhlKSxJPShiPWI9PWw/aDpiKT09aCx4PSh3PXc9PWw/aDp3KT09aCxCPWI9PXc7aWYoQiYmYyh0KSl7aWYoIWMoZSkpcmV0dXJuITE7bT0hMCxJPSExfWlmKEImJiFJKXJldHVybiBnfHwoZz1uZXcgbiksbXx8Zih0KT9vKHQsZSxyLHksXyxnKTppKHQsZSxiLHIseSxfLGcpO2lmKCEoMSZyKSl7dmFyIGs9SSYmZC5jYWxsKHQsIl9fd3JhcHBlZF9fIiksQz14JiZkLmNhbGwoZSwiX193cmFwcGVkX18iKTtpZihrfHxDKXt2YXIgaj1rP3QudmFsdWUoKTp0LHE9Qz9lLnZhbHVlKCk6ZTtyZXR1cm4gZ3x8KGc9bmV3IG4pLF8oaixxLHIseSxnKX19cmV0dXJuISFCJiYoZ3x8KGc9bmV3IG4pLGEodCxlLHIseSxfLGcpKX19LDE3OTkodCxlLHIpe3ZhciBuPXIoNzIxNyksbz1yKDI3MCk7dC5leHBvcnRzPWZ1bmN0aW9uIGJhc2VJc01hdGNoKHQsZSxyLGkpe3ZhciBhPXIubGVuZ3RoLHM9YSx1PSFpO2lmKG51bGw9PXQpcmV0dXJuIXM7Zm9yKHQ9T2JqZWN0KHQpO2EtLTspe3ZhciBjPXJbYV07aWYodSYmY1syXT9jWzFdIT09dFtjWzBdXTohKGNbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrYTxzOyl7dmFyIGY9KGM9clthXSlbMF0sbD10W2ZdLHA9Y1sxXTtpZih1JiZjWzJdKXtpZih2b2lkIDA9PT1sJiYhKGYgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgaD1uZXcgbjtpZihpKXZhciBkPWkobCxwLGYsdCxlLGgpO2lmKCEodm9pZCAwPT09ZD9vKHAsbCwzLGksaCk6ZCkpcmV0dXJuITF9fXJldHVybiEwfX0sNTA4Myh0LGUscil7dmFyIG49cigxODgyKSxvPXIoNzI5NiksaT1yKDM4MDUpLGE9cig3NDczKSxzPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLHU9RnVuY3Rpb24ucHJvdG90eXBlLGM9T2JqZWN0LnByb3RvdHlwZSxmPXUudG9TdHJpbmcsbD1jLmhhc093blByb3BlcnR5LHA9UmVnRXhwKCJeIitmLmNhbGwobCkucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dC5leHBvcnRzPWZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh0KXtyZXR1cm4hKCFpKHQpfHxvKHQpKSYmKG4odCk/cDpzKS50ZXN0KGEodCkpfX0sNDkwMSh0LGUscil7dmFyIG49cigyNTUyKSxvPXIoMjk0KSxpPXIoMzQ2KSxhPXt9O2FbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPWFbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPWFbIltvYmplY3QgSW50OEFycmF5XSJdPWFbIltvYmplY3QgSW50MTZBcnJheV0iXT1hWyJbb2JqZWN0IEludDMyQXJyYXldIl09YVsiW29iamVjdCBVaW50OEFycmF5XSJdPWFbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09YVsiW29iamVjdCBVaW50MTZBcnJheV0iXT1hWyJbb2JqZWN0IFVpbnQzMkFycmF5XSJdPSEwLGFbIltvYmplY3QgQXJndW1lbnRzXSJdPWFbIltvYmplY3QgQXJyYXldIl09YVsiW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1hWyJbb2JqZWN0IEJvb2xlYW5dIl09YVsiW29iamVjdCBEYXRhVmlld10iXT1hWyJbb2JqZWN0IERhdGVdIl09YVsiW29iamVjdCBFcnJvcl0iXT1hWyJbb2JqZWN0IEZ1bmN0aW9uXSJdPWFbIltvYmplY3QgTWFwXSJdPWFbIltvYmplY3QgTnVtYmVyXSJdPWFbIltvYmplY3QgT2JqZWN0XSJdPWFbIltvYmplY3QgUmVnRXhwXSJdPWFbIltvYmplY3QgU2V0XSJdPWFbIltvYmplY3QgU3RyaW5nXSJdPWFbIltvYmplY3QgV2Vha01hcF0iXT0hMSx0LmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh0KXtyZXR1cm4gaSh0KSYmbyh0Lmxlbmd0aCkmJiEhYVtuKHQpXX19LDUzODkodCxlLHIpe3ZhciBuPXIoMzY2Myksbz1yKDc5NzgpLGk9cigzNDg4KSxhPXIoNjQ0OSkscz1yKDU4Myk7dC5leHBvcnRzPWZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGw9PXQ/aToib2JqZWN0Ij09dHlwZW9mIHQ/YSh0KT9vKHRbMF0sdFsxXSk6bih0KTpzKHQpfX0sODk4NCh0LGUscil7dmFyIG49cig1NTI3KSxvPXIoMzY1MCksaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbiBiYXNlS2V5cyh0KXtpZighbih0KSlyZXR1cm4gbyh0KTt2YXIgZT1bXTtmb3IodmFyIHIgaW4gT2JqZWN0KHQpKWkuY2FsbCh0LHIpJiYiY29uc3RydWN0b3IiIT1yJiZlLnB1c2gocik7cmV0dXJuIGV9fSwzNjYzKHQsZSxyKXt2YXIgbj1yKDE3OTkpLG89cig3NzYpLGk9cig3MTk3KTt0LmV4cG9ydHM9ZnVuY3Rpb24gYmFzZU1hdGNoZXModCl7dmFyIGU9byh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/aShlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKHIpe3JldHVybiByPT09dHx8bihyLHQsZSl9fX0sNzk3OCh0LGUscil7dmFyIG49cigyNzApLG89cig4MTU2KSxpPXIoNjMxKSxhPXIoODU4Nikscz1yKDc1NiksdT1yKDcxOTcpLGM9cig3Nzk3KTt0LmV4cG9ydHM9ZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eSh0LGUpe3JldHVybiBhKHQpJiZzKGUpP3UoYyh0KSxlKTpmdW5jdGlvbihyKXt2YXIgYT1vKHIsdCk7cmV0dXJuIHZvaWQgMD09PWEmJmE9PT1lP2kocix0KTpuKGUsYSwzKX19fSw3MjM3KHQpe3QuZXhwb3J0cz1mdW5jdGlvbiBiYXNlUHJvcGVydHkodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3ZvaWQgMDplW3RdfX19LDcyNTUodCxlLHIpe3ZhciBuPXIoNzQyMik7dC5leHBvcnRzPWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBuKGUsdCl9fX0sNDU1Mih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gYmFzZVByb3BlcnR5T2YodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfX19LDUxNjAodCl7dC5leHBvcnRzPWZ1bmN0aW9uIGJhc2VTbGljZSh0LGUscil7dmFyIG49LTEsbz10Lmxlbmd0aDtlPDAmJihlPS1lPm8/MDpvK2UpLChyPXI+bz9vOnIpPDAmJihyKz1vKSxvPWU+cj8wOnItZT4+PjAsZT4+Pj0wO2Zvcih2YXIgaT1BcnJheShvKTsrK248bzspaVtuXT10W24rZV07cmV0dXJuIGl9fSw5MTYodCxlLHIpe3ZhciBuPXIoOTA5KTt0LmV4cG9ydHM9ZnVuY3Rpb24gYmFzZVNvbWUodCxlKXt2YXIgcjtyZXR1cm4gbih0LChmdW5jdGlvbih0LG4sbyl7cmV0dXJuIShyPWUodCxuLG8pKX0pKSwhIXJ9fSw4MDk2KHQpe3QuZXhwb3J0cz1mdW5jdGlvbiBiYXNlVGltZXModCxlKXtmb3IodmFyIHI9LTEsbj1BcnJheSh0KTsrK3I8dDspbltyXT1lKHIpO3JldHVybiBufX0sNzU1Nih0LGUscil7dmFyIG49cigxODczKSxvPXIoNDkzMiksaT1yKDY0NDkpLGE9cig0Mzk0KSxzPW4/bi5wcm90b3R5cGU6dm9pZCAwLHU9cz9zLnRvU3RyaW5nOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gdDtpZihpKHQpKXJldHVybiBvKHQsYmFzZVRvU3RyaW5nKSsiIjtpZihhKHQpKXJldHVybiB1P3UuY2FsbCh0KToiIjt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tMS8wPyItMCI6ZX19LDQxMjgodCxlLHIpe3ZhciBuPXIoMTgwMCksbz0vXlxzKy87dC5leHBvcnRzPWZ1bmN0aW9uIGJhc2VUcmltKHQpe3JldHVybiB0P3Quc2xpY2UoMCxuKHQpKzEpLnJlcGxhY2UobywiIik6dH19LDczMDEodCl7dC5leHBvcnRzPWZ1bmN0aW9uIGJhc2VVbmFyeSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fX0sMTIzNCh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gYmFzZVppcE9iamVjdCh0LGUscil7Zm9yKHZhciBuPS0xLG89dC5sZW5ndGgsaT1lLmxlbmd0aCxhPXt9OysrbjxvOyl7dmFyIHM9bjxpP2Vbbl06dm9pZCAwO3IoYSx0W25dLHMpfXJldHVybiBhfX0sOTIxOSh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gY2FjaGVIYXModCxlKXtyZXR1cm4gdC5oYXMoZSl9fSwxNzY5KHQsZSxyKXt2YXIgbj1yKDY0NDkpLG89cig4NTg2KSxpPXIoMTgwMiksYT1yKDMyMjIpO3QuZXhwb3J0cz1mdW5jdGlvbiBjYXN0UGF0aCh0LGUpe3JldHVybiBuKHQpP3Q6byh0LGUpP1t0XTppKGEodCkpfX0sODc1NCh0LGUscil7dmFyIG49cig1MTYwKTt0LmV4cG9ydHM9ZnVuY3Rpb24gY2FzdFNsaWNlKHQsZSxyKXt2YXIgbz10Lmxlbmd0aDtyZXR1cm4gcj12b2lkIDA9PT1yP286ciwhZSYmcj49bz90Om4odCxlLHIpfX0sNTQ4MSh0LGUscil7dmFyIG49cig5MzI1KVsiX19jb3JlLWpzX3NoYXJlZF9fIl07dC5leHBvcnRzPW59LDgzMjkodCxlLHIpe3ZhciBuPXIoNDg5NCk7dC5leHBvcnRzPWZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIsbyl7aWYobnVsbD09cilyZXR1cm4gcjtpZighbihyKSlyZXR1cm4gdChyLG8pO2Zvcih2YXIgaT1yLmxlbmd0aCxhPWU/aTotMSxzPU9iamVjdChyKTsoZT9hLS06KythPGkpJiYhMSE9PW8oc1thXSxhLHMpOyk7cmV0dXJuIHJ9fX0sMzIyMSh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlQmFzZUZvcih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLG4pe2Zvcih2YXIgbz0tMSxpPU9iamVjdChlKSxhPW4oZSkscz1hLmxlbmd0aDtzLS07KXt2YXIgdT1hW3Q/czorK29dO2lmKCExPT09cihpW3VdLHUsaSkpYnJlYWt9cmV0dXJuIGV9fX0sMjUwNyh0LGUscil7dmFyIG49cig4NzU0KSxvPXIoOTY5OCksaT1yKDM5MTIpLGE9cigzMjIyKTt0LmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlQ2FzZUZpcnN0KHQpe3JldHVybiBmdW5jdGlvbihlKXtlPWEoZSk7dmFyIHI9byhlKT9pKGUpOnZvaWQgMCxzPXI/clswXTplLmNoYXJBdCgwKSx1PXI/bihyLDEpLmpvaW4oIiIpOmUuc2xpY2UoMSk7cmV0dXJuIHNbdF0oKSt1fX19LDU1MzkodCxlLHIpe3ZhciBuPXIoODgyKSxvPXIoODI4KSxpPXIoNjY0NSksYT1SZWdFeHAoIlsn4oCZXSIsImciKTt0LmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG4oaShvKGUpLnJlcGxhY2UoYSwiIikpLHQsIiIpfX19LDIwMDYodCxlLHIpe3ZhciBuPXIoNTM4OSksbz1yKDQ4OTQpLGk9cig1OTUwKTt0LmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlRmluZCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLGEpe3ZhciBzPU9iamVjdChlKTtpZighbyhlKSl7dmFyIHU9bihyLDMpO2U9aShlKSxyPWZ1bmN0aW9uKHQpe3JldHVybiB1KHNbdF0sdCxzKX19dmFyIGM9dChlLHIsYSk7cmV0dXJuIGM+LTE/c1t1P2VbY106Y106dm9pZCAwfX19LDQ2NDcodCxlLHIpe3ZhciBuPXIoNDU1Mikoe8OAOiJBIizDgToiQSIsw4I6IkEiLMODOiJBIizDhDoiQSIsw4U6IkEiLMOgOiJhIizDoToiYSIsw6I6ImEiLMOjOiJhIizDpDoiYSIsw6U6ImEiLMOHOiJDIizDpzoiYyIsw5A6IkQiLMOwOiJkIizDiDoiRSIsw4k6IkUiLMOKOiJFIizDizoiRSIsw6g6ImUiLMOpOiJlIizDqjoiZSIsw6s6ImUiLMOMOiJJIizDjToiSSIsw446IkkiLMOPOiJJIizDrDoiaSIsw606ImkiLMOuOiJpIizDrzoiaSIsw5E6Ik4iLMOxOiJuIizDkjoiTyIsw5M6Ik8iLMOUOiJPIizDlToiTyIsw5Y6Ik8iLMOYOiJPIizDsjoibyIsw7M6Im8iLMO0OiJvIizDtToibyIsw7Y6Im8iLMO4OiJvIizDmToiVSIsw5o6IlUiLMObOiJVIizDnDoiVSIsw7k6InUiLMO6OiJ1IizDuzoidSIsw7w6InUiLMOdOiJZIizDvToieSIsw786InkiLMOGOiJBZSIsw6Y6ImFlIizDnjoiVGgiLMO+OiJ0aCIsw586InNzIizEgDoiQSIsxII6IkEiLMSEOiJBIizEgToiYSIsxIM6ImEiLMSFOiJhIizEhjoiQyIsxIg6IkMiLMSKOiJDIizEjDoiQyIsxIc6ImMiLMSJOiJjIizEizoiYyIsxI06ImMiLMSOOiJEIizEkDoiRCIsxI86ImQiLMSROiJkIizEkjoiRSIsxJQ6IkUiLMSWOiJFIizEmDoiRSIsxJo6IkUiLMSTOiJlIizElToiZSIsxJc6ImUiLMSZOiJlIizEmzoiZSIsxJw6IkciLMSeOiJHIizEoDoiRyIsxKI6IkciLMSdOiJnIizEnzoiZyIsxKE6ImciLMSjOiJnIizEpDoiSCIsxKY6IkgiLMSlOiJoIizEpzoiaCIsxKg6IkkiLMSqOiJJIizErDoiSSIsxK46IkkiLMSwOiJJIizEqToiaSIsxKs6ImkiLMStOiJpIizErzoiaSIsxLE6ImkiLMS0OiJKIizEtToiaiIsxLY6IksiLMS3OiJrIizEuDoiayIsxLk6IkwiLMS7OiJMIizEvToiTCIsxL86IkwiLMWBOiJMIizEujoibCIsxLw6ImwiLMS+OiJsIizFgDoibCIsxYI6ImwiLMWDOiJOIizFhToiTiIsxYc6Ik4iLMWKOiJOIizFhDoibiIsxYY6Im4iLMWIOiJuIizFizoibiIsxYw6Ik8iLMWOOiJPIizFkDoiTyIsxY06Im8iLMWPOiJvIizFkToibyIsxZQ6IlIiLMWWOiJSIizFmDoiUiIsxZU6InIiLMWXOiJyIizFmToiciIsxZo6IlMiLMWcOiJTIizFnjoiUyIsxaA6IlMiLMWbOiJzIizFnToicyIsxZ86InMiLMWhOiJzIizFojoiVCIsxaQ6IlQiLMWmOiJUIizFozoidCIsxaU6InQiLMWnOiJ0IizFqDoiVSIsxao6IlUiLMWsOiJVIizFrjoiVSIsxbA6IlUiLMWyOiJVIizFqToidSIsxas6InUiLMWtOiJ1IizFrzoidSIsxbE6InUiLMWzOiJ1IizFtDoiVyIsxbU6InciLMW2OiJZIizFtzoieSIsxbg6IlkiLMW5OiJaIizFuzoiWiIsxb06IloiLMW6OiJ6IizFvDoieiIsxb46InoiLMSyOiJJSiIsxLM6ImlqIizFkjoiT2UiLMWTOiJvZSIsxYk6IiduIizFvzoicyJ9KTt0LmV4cG9ydHM9bn0sMzI0Myh0LGUscil7dmFyIG49cig2MTEwKSxvPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW4oT2JqZWN0LCJkZWZpbmVQcm9wZXJ0eSIpO3JldHVybiB0KHt9LCIiLHt9KSx0fWNhdGNoKHQpe319KCk7dC5leHBvcnRzPW99LDU5MTEodCxlLHIpe3ZhciBuPXIoODg1OSksbz1yKDQyNDgpLGk9cig5MjE5KTt0LmV4cG9ydHM9ZnVuY3Rpb24gZXF1YWxBcnJheXModCxlLHIsYSxzLHUpe3ZhciBjPTEmcixmPXQubGVuZ3RoLGw9ZS5sZW5ndGg7aWYoZiE9bCYmIShjJiZsPmYpKXJldHVybiExO3ZhciBwPXUuZ2V0KHQpLGg9dS5nZXQoZSk7aWYocCYmaClyZXR1cm4gcD09ZSYmaD09dDt2YXIgZD0tMSx5PSEwLF89MiZyP25ldyBuOnZvaWQgMDtmb3IodS5zZXQodCxlKSx1LnNldChlLHQpOysrZDxmOyl7dmFyIGc9dFtkXSxtPWVbZF07aWYoYSl2YXIgdj1jP2EobSxnLGQsZSx0LHUpOmEoZyxtLGQsdCxlLHUpO2lmKHZvaWQgMCE9PXYpe2lmKHYpY29udGludWU7eT0hMTticmVha31pZihfKXtpZighbyhlLChmdW5jdGlvbih0LGUpe2lmKCFpKF8sZSkmJihnPT09dHx8cyhnLHQscixhLHUpKSlyZXR1cm4gXy5wdXNoKGUpfSkpKXt5PSExO2JyZWFrfX1lbHNlIGlmKGchPT1tJiYhcyhnLG0scixhLHUpKXt5PSExO2JyZWFrfX1yZXR1cm4gdS5kZWxldGUodCksdS5kZWxldGUoZSkseX19LDE5ODYodCxlLHIpe3ZhciBuPXIoMTg3Myksbz1yKDc4MjgpLGk9cig1Mjg4KSxhPXIoNTkxMSkscz1yKDMxNyksdT1yKDQyNDcpLGM9bj9uLnByb3RvdHlwZTp2b2lkIDAsZj1jP2MudmFsdWVPZjp2b2lkIDA7dC5leHBvcnRzPWZ1bmN0aW9uIGVxdWFsQnlUYWcodCxlLHIsbixjLGwscCl7c3dpdGNoKHIpe2Nhc2UiW29iamVjdCBEYXRhVmlld10iOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSJbb2JqZWN0IEFycmF5QnVmZmVyXSI6cmV0dXJuISh0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8IWwobmV3IG8odCksbmV3IG8oZSkpKTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOmNhc2UiW29iamVjdCBEYXRlXSI6Y2FzZSJbb2JqZWN0IE51bWJlcl0iOnJldHVybiBpKCt0LCtlKTtjYXNlIltvYmplY3QgRXJyb3JdIjpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UiW29iamVjdCBSZWdFeHBdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIHQ9PWUrIiI7Y2FzZSJbb2JqZWN0IE1hcF0iOnZhciBoPXM7Y2FzZSJbb2JqZWN0IFNldF0iOnZhciBkPTEmbjtpZihofHwoaD11KSx0LnNpemUhPWUuc2l6ZSYmIWQpcmV0dXJuITE7dmFyIHk9cC5nZXQodCk7aWYoeSlyZXR1cm4geT09ZTtufD0yLHAuc2V0KHQsZSk7dmFyIF89YShoKHQpLGgoZSksbixjLGwscCk7cmV0dXJuIHAuZGVsZXRlKHQpLF87Y2FzZSJbb2JqZWN0IFN5bWJvbF0iOmlmKGYpcmV0dXJuIGYuY2FsbCh0KT09Zi5jYWxsKGUpfXJldHVybiExfX0sNjg5KHQsZSxyKXt2YXIgbj1yKDIpLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24gZXF1YWxPYmplY3RzKHQsZSxyLGksYSxzKXt2YXIgdT0xJnIsYz1uKHQpLGY9Yy5sZW5ndGg7aWYoZiE9bihlKS5sZW5ndGgmJiF1KXJldHVybiExO2Zvcih2YXIgbD1mO2wtLTspe3ZhciBwPWNbbF07aWYoISh1P3AgaW4gZTpvLmNhbGwoZSxwKSkpcmV0dXJuITF9dmFyIGg9cy5nZXQodCksZD1zLmdldChlKTtpZihoJiZkKXJldHVybiBoPT1lJiZkPT10O3ZhciB5PSEwO3Muc2V0KHQsZSkscy5zZXQoZSx0KTtmb3IodmFyIF89dTsrK2w8Zjspe3ZhciBnPXRbcD1jW2xdXSxtPWVbcF07aWYoaSl2YXIgdj11P2kobSxnLHAsZSx0LHMpOmkoZyxtLHAsdCxlLHMpO2lmKCEodm9pZCAwPT09dj9nPT09bXx8YShnLG0scixpLHMpOnYpKXt5PSExO2JyZWFrfV98fChfPSJjb25zdHJ1Y3RvciI9PXApfWlmKHkmJiFfKXt2YXIgYj10LmNvbnN0cnVjdG9yLHc9ZS5jb25zdHJ1Y3RvcjtiPT13fHwhKCJjb25zdHJ1Y3RvciJpbiB0KXx8ISgiY29uc3RydWN0b3IiaW4gZSl8fCJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiIGluc3RhbmNlb2YgYiYmImZ1bmN0aW9uIj09dHlwZW9mIHcmJncgaW5zdGFuY2VvZiB3fHwoeT0hMSl9cmV0dXJuIHMuZGVsZXRlKHQpLHMuZGVsZXRlKGUpLHl9fSw0ODQwKHQsZSxyKXt2YXIgbj0ib2JqZWN0Ij09dHlwZW9mIHIuZyYmci5nJiZyLmcuT2JqZWN0PT09T2JqZWN0JiZyLmc7dC5leHBvcnRzPW59LDIodCxlLHIpe3ZhciBuPXIoMjE5OSksbz1yKDQ2NjQpLGk9cig1OTUwKTt0LmV4cG9ydHM9ZnVuY3Rpb24gZ2V0QWxsS2V5cyh0KXtyZXR1cm4gbih0LGksbyl9fSwyNjUxKHQsZSxyKXt2YXIgbj1yKDQyMTgpO3QuZXhwb3J0cz1mdW5jdGlvbiBnZXRNYXBEYXRhKHQsZSl7dmFyIHI9dC5fX2RhdGFfXztyZXR1cm4gbihlKT9yWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOnIubWFwfX0sNzc2KHQsZSxyKXt2YXIgbj1yKDc1Niksbz1yKDU5NTApO3QuZXhwb3J0cz1mdW5jdGlvbiBnZXRNYXRjaERhdGEodCl7Zm9yKHZhciBlPW8odCkscj1lLmxlbmd0aDtyLS07KXt2YXIgaT1lW3JdLGE9dFtpXTtlW3JdPVtpLGEsbihhKV19cmV0dXJuIGV9fSw2MTEwKHQsZSxyKXt2YXIgbj1yKDUwODMpLG89cigzOTIpO3QuZXhwb3J0cz1mdW5jdGlvbiBnZXROYXRpdmUodCxlKXt2YXIgcj1vKHQsZSk7cmV0dXJuIG4ocik/cjp2b2lkIDB9fSw2NTkodCxlLHIpe3ZhciBuPXIoMTg3Myksbz1PYmplY3QucHJvdG90eXBlLGk9by5oYXNPd25Qcm9wZXJ0eSxhPW8udG9TdHJpbmcscz1uP24udG9TdHJpbmdUYWc6dm9pZCAwO3QuZXhwb3J0cz1mdW5jdGlvbiBnZXRSYXdUYWcodCl7dmFyIGU9aS5jYWxsKHQscykscj10W3NdO3RyeXt0W3NdPXZvaWQgMDt2YXIgbj0hMH1jYXRjaCh0KXt9dmFyIG89YS5jYWxsKHQpO3JldHVybiBuJiYoZT90W3NdPXI6ZGVsZXRlIHRbc10pLG99fSw0NjY0KHQsZSxyKXt2YXIgbj1yKDk3NzApLG89cigzMzQ1KSxpPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsYT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLHM9YT9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCksbihhKHQpLChmdW5jdGlvbihlKXtyZXR1cm4gaS5jYWxsKHQsZSl9KSkpfTpvO3QuZXhwb3J0cz1zfSw1ODYxKHQsZSxyKXt2YXIgbj1yKDU1ODApLG89cig4MjIzKSxpPXIoMjgwNCksYT1yKDY1NDUpLHM9cig4MzAzKSx1PXIoMjU1MiksYz1yKDc0NzMpLGY9IltvYmplY3QgTWFwXSIsbD0iW29iamVjdCBQcm9taXNlXSIscD0iW29iamVjdCBTZXRdIixoPSJbb2JqZWN0IFdlYWtNYXBdIixkPSJbb2JqZWN0IERhdGFWaWV3XSIseT1jKG4pLF89YyhvKSxnPWMoaSksbT1jKGEpLHY9YyhzKSxiPXU7KG4mJmIobmV3IG4obmV3IEFycmF5QnVmZmVyKDEpKSkhPWR8fG8mJmIobmV3IG8pIT1mfHxpJiZiKGkucmVzb2x2ZSgpKSE9bHx8YSYmYihuZXcgYSkhPXB8fHMmJmIobmV3IHMpIT1oKSYmKGI9ZnVuY3Rpb24odCl7dmFyIGU9dSh0KSxyPSJbb2JqZWN0IE9iamVjdF0iPT1lP3QuY29uc3RydWN0b3I6dm9pZCAwLG49cj9jKHIpOiIiO2lmKG4pc3dpdGNoKG4pe2Nhc2UgeTpyZXR1cm4gZDtjYXNlIF86cmV0dXJuIGY7Y2FzZSBnOnJldHVybiBsO2Nhc2UgbTpyZXR1cm4gcDtjYXNlIHY6cmV0dXJuIGh9cmV0dXJuIGV9KSx0LmV4cG9ydHM9Yn0sMzkyKHQpe3QuZXhwb3J0cz1mdW5jdGlvbiBnZXRWYWx1ZSh0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfX0sOTMyNih0LGUscil7dmFyIG49cigxNzY5KSxvPXIoMjQyOCksaT1yKDY0NDkpLGE9cigzNjEpLHM9cigyOTQpLHU9cig3Nzk3KTt0LmV4cG9ydHM9ZnVuY3Rpb24gaGFzUGF0aCh0LGUscil7Zm9yKHZhciBjPS0xLGY9KGU9bihlLHQpKS5sZW5ndGgsbD0hMTsrK2M8Zjspe3ZhciBwPXUoZVtjXSk7aWYoIShsPW51bGwhPXQmJnIodCxwKSkpYnJlYWs7dD10W3BdfXJldHVybiBsfHwrK2MhPWY/bDohIShmPW51bGw9PXQ/MDp0Lmxlbmd0aCkmJnMoZikmJmEocCxmKSYmKGkodCl8fG8odCkpfX0sOTY5OCh0KXt2YXIgZT1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIik7dC5leHBvcnRzPWZ1bmN0aW9uIGhhc1VuaWNvZGUodCl7cmV0dXJuIGUudGVzdCh0KX19LDU0MzQodCl7dmFyIGU9L1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS87dC5leHBvcnRzPWZ1bmN0aW9uIGhhc1VuaWNvZGVXb3JkKHQpe3JldHVybiBlLnRlc3QodCl9fSwyMDMyKHQsZSxyKXt2YXIgbj1yKDEwNDIpO3QuZXhwb3J0cz1mdW5jdGlvbiBoYXNoQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW4/bihudWxsKTp7fSx0aGlzLnNpemU9MH19LDM4NjIodCl7dC5leHBvcnRzPWZ1bmN0aW9uIGhhc2hEZWxldGUodCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9fSw2NzIxKHQsZSxyKXt2YXIgbj1yKDEwNDIpLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24gaGFzaEdldCh0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKG4pe3ZhciByPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09cj92b2lkIDA6cn1yZXR1cm4gby5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9fSwyNzQ5KHQsZSxyKXt2YXIgbj1yKDEwNDIpLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24gaGFzaEhhcyh0KXt2YXIgZT10aGlzLl9fZGF0YV9fO3JldHVybiBuP3ZvaWQgMCE9PWVbdF06by5jYWxsKGUsdCl9fSw1NzQ5KHQsZSxyKXt2YXIgbj1yKDEwNDIpO3QuZXhwb3J0cz1mdW5jdGlvbiBoYXNoU2V0KHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyh0KT8wOjEsclt0XT1uJiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9fSwzNjEodCl7dmFyIGU9L14oPzowfFsxLTldXGQqKSQvO3QuZXhwb3J0cz1mdW5jdGlvbiBpc0luZGV4KHQscil7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISEocj1udWxsPT1yPzkwMDcxOTkyNTQ3NDA5OTE6cikmJigibnVtYmVyIj09bnx8InN5bWJvbCIhPW4mJmUudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxyfX0sNjgwMCh0LGUscil7dmFyIG49cig1Mjg4KSxvPXIoNDg5NCksaT1yKDM2MSksYT1yKDM4MDUpO3QuZXhwb3J0cz1mdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh0LGUscil7aWYoIWEocikpcmV0dXJuITE7dmFyIHM9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PXM/byhyKSYmaShlLHIubGVuZ3RoKToic3RyaW5nIj09cyYmZSBpbiByKSYmbihyW2VdLHQpfX0sODU4Nih0LGUscil7dmFyIG49cig2NDQ5KSxvPXIoNDM5NCksaT0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxhPS9eXHcqJC87dC5leHBvcnRzPWZ1bmN0aW9uIGlzS2V5KHQsZSl7aWYobih0KSlyZXR1cm4hMTt2YXIgcj10eXBlb2YgdDtyZXR1cm4hKCJudW1iZXIiIT1yJiYic3ltYm9sIiE9ciYmImJvb2xlYW4iIT1yJiZudWxsIT10JiYhbyh0KSl8fChhLnRlc3QodCl8fCFpLnRlc3QodCl8fG51bGwhPWUmJnQgaW4gT2JqZWN0KGUpKX19LDQyMTgodCl7dC5leHBvcnRzPWZ1bmN0aW9uIGlzS2V5YWJsZSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fX0sNzI5Nih0LGUscil7dmFyIG4sbz1yKDU0ODEpLGk9KG49L1teLl0rJC8uZXhlYyhvJiZvLmtleXMmJm8ua2V5cy5JRV9QUk9UT3x8IiIpKT8iU3ltYm9sKHNyYylfMS4iK246IiI7dC5leHBvcnRzPWZ1bmN0aW9uIGlzTWFza2VkKHQpe3JldHVybiEhaSYmaSBpbiB0fX0sNTUyNyh0KXt2YXIgZT1PYmplY3QucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbiBpc1Byb3RvdHlwZSh0KXt2YXIgcj10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiByJiZyLnByb3RvdHlwZXx8ZSl9fSw3NTYodCxlLHIpe3ZhciBuPXIoMzgwNSk7dC5leHBvcnRzPWZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh0KXtyZXR1cm4gdD09dCYmIW4odCl9fSwzNzAyKHQpe3QuZXhwb3J0cz1mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9fSw4MCh0LGUscil7dmFyIG49cig2MDI1KSxvPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dC5leHBvcnRzPWZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9bihlLHQpO3JldHVybiEocjwwKSYmKHI9PWUubGVuZ3RoLTE/ZS5wb3AoKTpvLmNhbGwoZSxyLDEpLC0tdGhpcy5zaXplLCEwKX19LDQ3MzkodCxlLHIpe3ZhciBuPXIoNjAyNSk7dC5leHBvcnRzPWZ1bmN0aW9uIGxpc3RDYWNoZUdldCh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLHI9bihlLHQpO3JldHVybiByPDA/dm9pZCAwOmVbcl1bMV19fSw4NjU1KHQsZSxyKXt2YXIgbj1yKDYwMjUpO3QuZXhwb3J0cz1mdW5jdGlvbiBsaXN0Q2FjaGVIYXModCl7cmV0dXJuIG4odGhpcy5fX2RhdGFfXyx0KT4tMX19LDExNzUodCxlLHIpe3ZhciBuPXIoNjAyNSk7dC5leHBvcnRzPWZ1bmN0aW9uIGxpc3RDYWNoZVNldCh0LGUpe3ZhciByPXRoaXMuX19kYXRhX18sbz1uKHIsdCk7cmV0dXJuIG88MD8oKyt0aGlzLnNpemUsci5wdXNoKFt0LGVdKSk6cltvXVsxXT1lLHRoaXN9fSwzMDQwKHQsZSxyKXt2YXIgbj1yKDE1NDkpLG89cig3OSksaT1yKDgyMjMpO3QuZXhwb3J0cz1mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgbixtYXA6bmV3KGl8fG8pLHN0cmluZzpuZXcgbn19fSw3NjcwKHQsZSxyKXt2YXIgbj1yKDI2NTEpO3QuZXhwb3J0cz1mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZSh0KXt2YXIgZT1uKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9fSwyODkodCxlLHIpe3ZhciBuPXIoMjY1MSk7dC5leHBvcnRzPWZ1bmN0aW9uIG1hcENhY2hlR2V0KHQpe3JldHVybiBuKHRoaXMsdCkuZ2V0KHQpfX0sNDUwOSh0LGUscil7dmFyIG49cigyNjUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24gbWFwQ2FjaGVIYXModCl7cmV0dXJuIG4odGhpcyx0KS5oYXModCl9fSwyOTQ5KHQsZSxyKXt2YXIgbj1yKDI2NTEpO3QuZXhwb3J0cz1mdW5jdGlvbiBtYXBDYWNoZVNldCh0LGUpe3ZhciByPW4odGhpcyx0KSxvPXIuc2l6ZTtyZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemUrPXIuc2l6ZT09bz8wOjEsdGhpc319LDMxNyh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gbWFwVG9BcnJheSh0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxuKXtyWysrZV09W24sdF19KSkscn19LDcxOTcodCl7dC5leHBvcnRzPWZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiYoclt0XT09PWUmJih2b2lkIDAhPT1lfHx0IGluIE9iamVjdChyKSkpfX19LDIyMjQodCxlLHIpe3ZhciBuPXIoMTA0KTt0LmV4cG9ydHM9ZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZCh0KXt2YXIgZT1uKHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1yLnNpemUmJnIuY2xlYXIoKSx0fSkpLHI9ZS5jYWNoZTtyZXR1cm4gZX19LDEwNDIodCxlLHIpe3ZhciBuPXIoNjExMCkoT2JqZWN0LCJjcmVhdGUiKTt0LmV4cG9ydHM9bn0sMzY1MCh0LGUscil7dmFyIG49cig0MzM1KShPYmplY3Qua2V5cyxPYmplY3QpO3QuZXhwb3J0cz1ufSw2MDA5KHQsZSxyKXt0PXIubm1kKHQpO3ZhciBuPXIoNDg0MCksbz1lJiYhZS5ub2RlVHlwZSYmZSxpPW8mJnQmJiF0Lm5vZGVUeXBlJiZ0LGE9aSYmaS5leHBvcnRzPT09byYmbi5wcm9jZXNzLHM9ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9aSYmaS5yZXF1aXJlJiZpLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8YSYmYS5iaW5kaW5nJiZhLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSgpO3QuZXhwb3J0cz1zfSw5MzUwKHQpe3ZhciBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHQpe3JldHVybiBlLmNhbGwodCl9fSw0MzM1KHQpe3QuZXhwb3J0cz1mdW5jdGlvbiBvdmVyQXJnKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0KGUocikpfX19LDkzMjUodCxlLHIpe3ZhciBuPXIoNDg0MCksbz0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGk9bnx8b3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTt0LmV4cG9ydHM9aX0sMTM4MCh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gc2V0Q2FjaGVBZGQodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfX0sMTQ1OSh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gc2V0Q2FjaGVIYXModCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfX0sNDI0Nyh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gc2V0VG9BcnJheSh0KXt2YXIgZT0tMSxyPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7clsrK2VdPXR9KSkscn19LDE0MjAodCxlLHIpe3ZhciBuPXIoNzkpO3QuZXhwb3J0cz1mdW5jdGlvbiBzdGFja0NsZWFyKCl7dGhpcy5fX2RhdGFfXz1uZXcgbix0aGlzLnNpemU9MH19LDkzOCh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gc3RhY2tEZWxldGUodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxyPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLHJ9fSwzNjA1KHQpe3QuZXhwb3J0cz1mdW5jdGlvbiBzdGFja0dldCh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9fSw5ODE3KHQpe3QuZXhwb3J0cz1mdW5jdGlvbiBzdGFja0hhcyh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9fSw5NDUodCxlLHIpe3ZhciBuPXIoNzkpLG89cig4MjIzKSxpPXIoMzY2MSk7dC5leHBvcnRzPWZ1bmN0aW9uIHN0YWNrU2V0KHQsZSl7dmFyIHI9dGhpcy5fX2RhdGFfXztpZihyIGluc3RhbmNlb2Ygbil7dmFyIGE9ci5fX2RhdGFfXztpZighb3x8YS5sZW5ndGg8MTk5KXJldHVybiBhLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK3Iuc2l6ZSx0aGlzO3I9dGhpcy5fX2RhdGFfXz1uZXcgaShhKX1yZXR1cm4gci5zZXQodCxlKSx0aGlzLnNpemU9ci5zaXplLHRoaXN9fSwzOTEyKHQsZSxyKXt2YXIgbj1yKDEwNzQpLG89cig5Njk4KSxpPXIoMjA1NCk7dC5leHBvcnRzPWZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkodCl7cmV0dXJuIG8odCk/aSh0KTpuKHQpfX0sMTgwMih0LGUscil7dmFyIG49cigyMjI0KSxvPS9bXi5bXF1dK3xcWyg/OigtP1xkKyg/OlwuXGQrKT8pfChbIiddKSgoPzooPyFcMilbXlxcXXxcXC4pKj8pXDIpXF18KD89KD86XC58XFtcXSkoPzpcLnxcW1xdfCQpKS9nLGk9L1xcKFxcKT8vZyxhPW4oKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UobywoZnVuY3Rpb24odCxyLG4sbyl7ZS5wdXNoKG4/by5yZXBsYWNlKGksIiQxIik6cnx8dCl9KSksZX0pKTt0LmV4cG9ydHM9YX0sNzc5Nyh0LGUscil7dmFyIG49cig0Mzk0KTt0LmV4cG9ydHM9ZnVuY3Rpb24gdG9LZXkodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxuKHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS0xLzA/Ii0wIjplfX0sNzQ3Myh0KXt2YXIgZT1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dC5leHBvcnRzPWZ1bmN0aW9uIHRvU291cmNlKHQpe2lmKG51bGwhPXQpe3RyeXtyZXR1cm4gZS5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn19LDE4MDAodCl7dmFyIGU9L1xzLzt0LmV4cG9ydHM9ZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHQpe2Zvcih2YXIgcj10Lmxlbmd0aDtyLS0mJmUudGVzdCh0LmNoYXJBdChyKSk7KTtyZXR1cm4gcn19LDIwNTQodCl7dmFyIGU9IlxcdWQ4MDAtXFx1ZGZmZiIscj0iWyIrZSsiXSIsbj0iW1xcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZl0iLG89IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsaT0iW14iK2UrIl0iLGE9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHM9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLHU9Iig/OiIrbisifCIrbysiKSIrIj8iLGM9IltcXHVmZTBlXFx1ZmUwZl0/IixmPWMrdSsoIig/OlxcdTIwMGQoPzoiK1tpLGEsc10uam9pbigifCIpKyIpIitjK3UrIikqIiksbD0iKD86IitbaStuKyI/IixuLGEscyxyXS5qb2luKCJ8IikrIikiLHA9UmVnRXhwKG8rIig/PSIrbysiKXwiK2wrZiwiZyIpO3QuZXhwb3J0cz1mdW5jdGlvbiB1bmljb2RlVG9BcnJheSh0KXtyZXR1cm4gdC5tYXRjaChwKXx8W119fSwyMjI1KHQpe3ZhciBlPSJcXHVkODAwLVxcdWRmZmYiLHI9IlxcdTI3MDAtXFx1MjdiZiIsbj0iYS16XFx4ZGYtXFx4ZjZcXHhmOC1cXHhmZiIsbz0iQS1aXFx4YzAtXFx4ZDZcXHhkOC1cXHhkZSIsaT0iXFx4YWNcXHhiMVxceGQ3XFx4ZjdcXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHhiZlxcdTIwMDAtXFx1MjA2ZiBcXHRcXHgwYlxcZlxceGEwXFx1ZmVmZlxcblxcclxcdTIwMjhcXHUyMDI5XFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMCIsYT0iWyIraSsiXSIscz0iXFxkKyIsdT0iWyIrcisiXSIsYz0iWyIrbisiXSIsZj0iW14iK2UraStzK3IrbitvKyJdIixsPSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9IixwPSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixoPSJbIitvKyJdIixkPSIoPzoiK2MrInwiK2YrIikiLHk9Iig/OiIraCsifCIrZisiKSIsXz0iKD86WyfigJldKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIsZz0iKD86WyfigJldKD86RHxMTHxNfFJFfFN8VHxWRSkpPyIsbT0iKD86W1xcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZl18XFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdKT8iLHY9IltcXHVmZTBlXFx1ZmUwZl0/IixiPXYrbSsoIig/OlxcdTIwMGQoPzoiK1siW14iK2UrIl0iLGwscF0uam9pbigifCIpKyIpIit2K20rIikqIiksdz0iKD86IitbdSxsLHBdLmpvaW4oInwiKSsiKSIrYixJPVJlZ0V4cChbaCsiPyIrYysiKyIrXysiKD89IitbYSxoLCIkIl0uam9pbigifCIpKyIpIix5KyIrIitnKyIoPz0iK1thLGgrZCwiJCJdLmpvaW4oInwiKSsiKSIsaCsiPyIrZCsiKyIrXyxoKyIrIitnLCJcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxkVEgpKD89XFxifFthLXpfXSkiLCJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD89XFxifFtBLVpfXSkiLHMsd10uam9pbigifCIpLCJnIik7dC5leHBvcnRzPWZ1bmN0aW9uIHVuaWNvZGVXb3Jkcyh0KXtyZXR1cm4gdC5tYXRjaChJKXx8W119fSw0MDU4KHQsZSxyKXt2YXIgbj1yKDQ3OTIpLG89cig1NTM5KSgoZnVuY3Rpb24odCxlLHIpe3JldHVybiBlPWUudG9Mb3dlckNhc2UoKSx0KyhyP24oZSk6ZSl9KSk7dC5leHBvcnRzPW99LDQ3OTIodCxlLHIpe3ZhciBuPXIoMzIyMiksbz1yKDU4MDgpO3QuZXhwb3J0cz1mdW5jdGlvbiBjYXBpdGFsaXplKHQpe3JldHVybiBvKG4odCkudG9Mb3dlckNhc2UoKSl9fSw4MjgodCxlLHIpe3ZhciBuPXIoNDY0Nyksbz1yKDMyMjIpLGk9L1tceGMwLVx4ZDZceGQ4LVx4ZjZceGY4LVx4ZmZcdTAxMDAtXHUwMTdmXS9nLGE9UmVnRXhwKCJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsImciKTt0LmV4cG9ydHM9ZnVuY3Rpb24gZGVidXJyKHQpe3JldHVybih0PW8odCkpJiZ0LnJlcGxhY2UoaSxuKS5yZXBsYWNlKGEsIiIpfX0sNTI4OCh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gZXEodCxlKXtyZXR1cm4gdD09PWV8fHQhPXQmJmUhPWV9fSw3MzA5KHQsZSxyKXt2YXIgbj1yKDIwMDYpKHIoNDcxMykpO3QuZXhwb3J0cz1ufSw0NzEzKHQsZSxyKXt2YXIgbj1yKDI1MjMpLG89cig1Mzg5KSxpPXIoMTQ4OSksYT1NYXRoLm1heDt0LmV4cG9ydHM9ZnVuY3Rpb24gZmluZEluZGV4KHQsZSxyKXt2YXIgcz1udWxsPT10PzA6dC5sZW5ndGg7aWYoIXMpcmV0dXJuLTE7dmFyIHU9bnVsbD09cj8wOmkocik7cmV0dXJuIHU8MCYmKHU9YShzK3UsMCkpLG4odCxvKGUsMyksdSl9fSw4MTU2KHQsZSxyKXt2YXIgbj1yKDc0MjIpO3QuZXhwb3J0cz1mdW5jdGlvbiBnZXQodCxlLHIpe3ZhciBvPW51bGw9PXQ/dm9pZCAwOm4odCxlKTtyZXR1cm4gdm9pZCAwPT09bz9yOm99fSw2MzEodCxlLHIpe3ZhciBuPXIoODA3Nyksbz1yKDkzMjYpO3QuZXhwb3J0cz1mdW5jdGlvbiBoYXNJbih0LGUpe3JldHVybiBudWxsIT10JiZvKHQsZSxuKX19LDM0ODgodCl7dC5leHBvcnRzPWZ1bmN0aW9uIGlkZW50aXR5KHQpe3JldHVybiB0fX0sMjQyOCh0LGUscil7dmFyIG49cig3NTM0KSxvPXIoMzQ2KSxpPU9iamVjdC5wcm90b3R5cGUsYT1pLmhhc093blByb3BlcnR5LHM9aS5wcm9wZXJ0eUlzRW51bWVyYWJsZSx1PW4oZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9uOmZ1bmN0aW9uKHQpe3JldHVybiBvKHQpJiZhLmNhbGwodCwiY2FsbGVlIikmJiFzLmNhbGwodCwiY2FsbGVlIil9O3QuZXhwb3J0cz11fSw2NDQ5KHQpe3ZhciBlPUFycmF5LmlzQXJyYXk7dC5leHBvcnRzPWV9LDQ4OTQodCxlLHIpe3ZhciBuPXIoMTg4Miksbz1yKDI5NCk7dC5leHBvcnRzPWZ1bmN0aW9uIGlzQXJyYXlMaWtlKHQpe3JldHVybiBudWxsIT10JiZvKHQubGVuZ3RoKSYmIW4odCl9fSwzNjU2KHQsZSxyKXt0PXIubm1kKHQpO3ZhciBuPXIoOTMyNSksbz1yKDk5MzUpLGk9ZSYmIWUubm9kZVR5cGUmJmUsYT1pJiZ0JiYhdC5ub2RlVHlwZSYmdCxzPWEmJmEuZXhwb3J0cz09PWk/bi5CdWZmZXI6dm9pZCAwLHU9KHM/cy5pc0J1ZmZlcjp2b2lkIDApfHxvO3QuZXhwb3J0cz11fSwxODgyKHQsZSxyKXt2YXIgbj1yKDI1NTIpLG89cigzODA1KTt0LmV4cG9ydHM9ZnVuY3Rpb24gaXNGdW5jdGlvbih0KXtpZighbyh0KSlyZXR1cm4hMTt2YXIgZT1uKHQpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgUHJveHldIj09ZX19LDI5NCh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gaXNMZW5ndGgodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PTkwMDcxOTkyNTQ3NDA5OTF9fSwzODA1KHQpe3QuZXhwb3J0cz1mdW5jdGlvbiBpc09iamVjdCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX19LDM0Nih0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gaXNPYmplY3RMaWtlKHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9fSw0Mzk0KHQsZSxyKXt2YXIgbj1yKDI1NTIpLG89cigzNDYpO3QuZXhwb3J0cz1mdW5jdGlvbiBpc1N5bWJvbCh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fG8odCkmJiJbb2JqZWN0IFN5bWJvbF0iPT1uKHQpfX0sNzE2Nyh0LGUscil7dmFyIG49cig0OTAxKSxvPXIoNzMwMSksaT1yKDYwMDkpLGE9aSYmaS5pc1R5cGVkQXJyYXkscz1hP28oYSk6bjt0LmV4cG9ydHM9c30sNTk1MCh0LGUscil7dmFyIG49cig2OTUpLG89cig4OTg0KSxpPXIoNDg5NCk7dC5leHBvcnRzPWZ1bmN0aW9uIGtleXModCl7cmV0dXJuIGkodCk/bih0KTpvKHQpfX0sMTA0KHQsZSxyKXt2YXIgbj1yKDM2NjEpO2Z1bmN0aW9uIG1lbW9pemUodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciBtZW1vaXplZD1mdW5jdGlvbigpe3ZhciByPWFyZ3VtZW50cyxuPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sbz1tZW1vaXplZC5jYWNoZTtpZihvLmhhcyhuKSlyZXR1cm4gby5nZXQobik7dmFyIGk9dC5hcHBseSh0aGlzLHIpO3JldHVybiBtZW1vaXplZC5jYWNoZT1vLnNldChuLGkpfHxvLGl9O3JldHVybiBtZW1vaXplZC5jYWNoZT1uZXcobWVtb2l6ZS5DYWNoZXx8biksbWVtb2l6ZWR9bWVtb2l6ZS5DYWNoZT1uLHQuZXhwb3J0cz1tZW1vaXplfSw1ODModCxlLHIpe3ZhciBuPXIoNzIzNyksbz1yKDcyNTUpLGk9cig4NTg2KSxhPXIoNzc5Nyk7dC5leHBvcnRzPWZ1bmN0aW9uIHByb3BlcnR5KHQpe3JldHVybiBpKHQpP24oYSh0KSk6byh0KX19LDI0MjYodCxlLHIpe3ZhciBuPXIoNDI0OCksbz1yKDUzODkpLGk9cig5MTYpLGE9cig2NDQ5KSxzPXIoNjgwMCk7dC5leHBvcnRzPWZ1bmN0aW9uIHNvbWUodCxlLHIpe3ZhciB1PWEodCk/bjppO3JldHVybiByJiZzKHQsZSxyKSYmKGU9dm9pZCAwKSx1KHQsbyhlLDMpKX19LDMzNDUodCl7dC5leHBvcnRzPWZ1bmN0aW9uIHN0dWJBcnJheSgpe3JldHVybltdfX0sOTkzNSh0KXt0LmV4cG9ydHM9ZnVuY3Rpb24gc3R1YkZhbHNlKCl7cmV0dXJuITF9fSw3NDAwKHQsZSxyKXt2YXIgbj1yKDkzNzQpLG89MS8wO3QuZXhwb3J0cz1mdW5jdGlvbiB0b0Zpbml0ZSh0KXtyZXR1cm4gdD8odD1uKHQpKT09PW98fHQ9PT0tMS8wPzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MioodDwwPy0xOjEpOnQ9PXQ/dDowOjA9PT10P3Q6MH19LDE0ODkodCxlLHIpe3ZhciBuPXIoNzQwMCk7dC5leHBvcnRzPWZ1bmN0aW9uIHRvSW50ZWdlcih0KXt2YXIgZT1uKHQpLHI9ZSUxO3JldHVybiBlPT1lP3I/ZS1yOmU6MH19LDkzNzQodCxlLHIpe3ZhciBuPXIoNDEyOCksbz1yKDM4MDUpLGk9cig0Mzk0KSxhPS9eWy0rXTB4WzAtOWEtZl0rJC9pLHM9L14wYlswMV0rJC9pLHU9L14wb1swLTddKyQvaSxjPXBhcnNlSW50O3QuZXhwb3J0cz1mdW5jdGlvbiB0b051bWJlcih0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoaSh0KSlyZXR1cm4gTmFOO2lmKG8odCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PW8oZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PW4odCk7dmFyIHI9cy50ZXN0KHQpO3JldHVybiByfHx1LnRlc3QodCk/Yyh0LnNsaWNlKDIpLHI/Mjo4KTphLnRlc3QodCk/TmFOOit0fX0sMzIyMih0LGUscil7dmFyIG49cig3NTU2KTt0LmV4cG9ydHM9ZnVuY3Rpb24gdG9TdHJpbmcodCl7cmV0dXJuIG51bGw9PXQ/IiI6bih0KX19LDU4MDgodCxlLHIpe3ZhciBuPXIoMjUwNykoInRvVXBwZXJDYXNlIik7dC5leHBvcnRzPW59LDY2NDUodCxlLHIpe3ZhciBuPXIoMTczMyksbz1yKDU0MzQpLGk9cigzMjIyKSxhPXIoMjIyNSk7dC5leHBvcnRzPWZ1bmN0aW9uIHdvcmRzKHQsZSxyKXtyZXR1cm4gdD1pKHQpLHZvaWQgMD09PShlPXI/dm9pZCAwOmUpP28odCk/YSh0KTpuKHQpOnQubWF0Y2goZSl8fFtdfX0sNzI0OCh0LGUscil7dmFyIG49cig2NTQ3KSxvPXIoMTIzNCk7dC5leHBvcnRzPWZ1bmN0aW9uIHppcE9iamVjdCh0LGUpe3JldHVybiBvKHR8fFtdLGV8fFtdLG4pfX0sMTUxNCh0KXsidXNlIHN0cmljdCI7dC5leHBvcnRzPU1hdGguYWJzfSw4OTY4KHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9TWF0aC5mbG9vcn0sNDQ1OSh0KXsidXNlIHN0cmljdCI7dC5leHBvcnRzPU51bWJlci5pc05hTnx8ZnVuY3Rpb24gaXNOYU4odCl7cmV0dXJuIHQhPXR9fSw2MTg4KHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9TWF0aC5tYXh9LDgwMDIodCl7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1NYXRoLm1pbn0sNTg4MCh0KXsidXNlIHN0cmljdCI7dC5leHBvcnRzPU1hdGgucG93fSw0MTQodCl7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1NYXRoLnJvdW5kfSwzMDkzKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig0NDU5KTt0LmV4cG9ydHM9ZnVuY3Rpb24gc2lnbih0KXtyZXR1cm4gbih0KXx8MD09PXQ/dDp0PDA/LTE6MX19LDY1NzgodCl7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1bIkZsb2F0MTZBcnJheSIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIkJpZ0ludDY0QXJyYXkiLCJCaWdVaW50NjRBcnJheSJdfSw1NjA2KHQpe3ZhciBlLHIsbj10LmV4cG9ydHM9e307ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHJ1blRpbWVvdXQodCl7aWYoZT09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQodCwwKTtpZigoZT09PWRlZmF1bHRTZXRUaW1vdXR8fCFlKSYmc2V0VGltZW91dClyZXR1cm4gZT1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIGUodCwwKX1jYXRjaChyKXt0cnl7cmV0dXJuIGUuY2FsbChudWxsLHQsMCl9Y2F0Y2gocil7cmV0dXJuIGUuY2FsbCh0aGlzLHQsMCl9fX0hZnVuY3Rpb24oKXt0cnl7ZT0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2godCl7ZT1kZWZhdWx0U2V0VGltb3V0fXRyeXtyPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2godCl7cj1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0oKTt2YXIgbyxpPVtdLGE9ITEscz0tMTtmdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKXthJiZvJiYoYT0hMSxvLmxlbmd0aD9pPW8uY29uY2F0KGkpOnM9LTEsaS5sZW5ndGgmJmRyYWluUXVldWUoKSl9ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpe2lmKCFhKXt2YXIgdD1ydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7YT0hMDtmb3IodmFyIGU9aS5sZW5ndGg7ZTspe2ZvcihvPWksaT1bXTsrK3M8ZTspbyYmb1tzXS5ydW4oKTtzPS0xLGU9aS5sZW5ndGh9bz1udWxsLGE9ITEsZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KHQpe2lmKHI9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dCh0KTtpZigocj09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFyKSYmY2xlYXJUaW1lb3V0KXJldHVybiByPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQodCk7dHJ5e3JldHVybiByKHQpfWNhdGNoKGUpe3RyeXtyZXR1cm4gci5jYWxsKG51bGwsdCl9Y2F0Y2goZSl7cmV0dXJuIHIuY2FsbCh0aGlzLHQpfX19KHQpfX1mdW5jdGlvbiBJdGVtKHQsZSl7dGhpcy5mdW49dCx0aGlzLmFycmF5PWV9ZnVuY3Rpb24gbm9vcCgpe31uLm5leHRUaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWVbci0xXT1hcmd1bWVudHNbcl07aS5wdXNoKG5ldyBJdGVtKHQsZSkpLDEhPT1pLmxlbmd0aHx8YXx8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sbi50aXRsZT0iYnJvd3NlciIsbi5icm93c2VyPSEwLG4uZW52PXt9LG4uYXJndj1bXSxuLnZlcnNpb249IiIsbi52ZXJzaW9ucz17fSxuLm9uPW5vb3Asbi5hZGRMaXN0ZW5lcj1ub29wLG4ub25jZT1ub29wLG4ub2ZmPW5vb3Asbi5yZW1vdmVMaXN0ZW5lcj1ub29wLG4ucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3Asbi5lbWl0PW5vb3Asbi5wcmVwZW5kTGlzdGVuZXI9bm9vcCxuLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxuLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm5bXX0sbi5iaW5kaW5nPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sbi5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LG4uY2hkaXI9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sbi51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0sMzIwOSh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNTYwNiksbz02NTUzNixpPTQyOTQ5NjcyOTU7dmFyIGE9cigyODYxKS5CdWZmZXIscz1yLmcuY3J5cHRvfHxyLmcubXNDcnlwdG87cyYmcy5nZXRSYW5kb21WYWx1ZXM/dC5leHBvcnRzPWZ1bmN0aW9uIHJhbmRvbUJ5dGVzKHQsZSl7aWYodD5pKXRocm93IG5ldyBSYW5nZUVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7dmFyIHI9YS5hbGxvY1Vuc2FmZSh0KTtpZih0PjApaWYodD5vKWZvcih2YXIgdT0wO3U8dDt1Kz1vKXMuZ2V0UmFuZG9tVmFsdWVzKHIuc2xpY2UodSx1K28pKTtlbHNlIHMuZ2V0UmFuZG9tVmFsdWVzKHIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlKXJldHVybiBuLm5leHRUaWNrKChmdW5jdGlvbigpe2UobnVsbCxyKX0pKTtyZXR1cm4gcn06dC5leHBvcnRzPWZ1bmN0aW9uIG9sZEJyb3dzZXIoKXt0aHJvdyBuZXcgRXJyb3IoIlNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXG5Vc2UgQ2hyb21lLCBGaXJlZm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExIil9fSw1Mjg3KHQsZSl7InVzZSBzdHJpY3QiO3ZhciByPVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxuPVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLG89U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxpPVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIiksYT1TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLHM9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSx1PVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxjPVN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksZj1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLGw9U3ltYm9sLmZvcigicmVhY3QubWVtbyIpLHA9U3ltYm9sLmZvcigicmVhY3QubGF6eSIpLGg9U3ltYm9sLml0ZXJhdG9yO3ZhciBkPXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSx5PU9iamVjdC5hc3NpZ24sXz17fTtmdW5jdGlvbiBFKHQsZSxyKXt0aGlzLnByb3BzPXQsdGhpcy5jb250ZXh0PWUsdGhpcy5yZWZzPV8sdGhpcy51cGRhdGVyPXJ8fGR9ZnVuY3Rpb24gRigpe31mdW5jdGlvbiBHKHQsZSxyKXt0aGlzLnByb3BzPXQsdGhpcy5jb250ZXh0PWUsdGhpcy5yZWZzPV8sdGhpcy51cGRhdGVyPXJ8fGR9RS5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fSxFLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbih0LGUpe2lmKCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPXQpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyx0LGUsInNldFN0YXRlIil9LEUucHJvdG90eXBlLmZvcmNlVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcyx0LCJmb3JjZVVwZGF0ZSIpfSxGLnByb3RvdHlwZT1FLnByb3RvdHlwZTt2YXIgZz1HLnByb3RvdHlwZT1uZXcgRjtnLmNvbnN0cnVjdG9yPUcseShnLEUucHJvdG90eXBlKSxnLmlzUHVyZVJlYWN0Q29tcG9uZW50PSEwO3ZhciBtPUFycmF5LmlzQXJyYXksdj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGI9e2N1cnJlbnQ6bnVsbH0sdz17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIE0odCxlLG4pe3ZhciBvLGk9e30sYT1udWxsLHM9bnVsbDtpZihudWxsIT1lKWZvcihvIGluIHZvaWQgMCE9PWUucmVmJiYocz1lLnJlZiksdm9pZCAwIT09ZS5rZXkmJihhPSIiK2Uua2V5KSxlKXYuY2FsbChlLG8pJiYhdy5oYXNPd25Qcm9wZXJ0eShvKSYmKGlbb109ZVtvXSk7dmFyIHU9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT11KWkuY2hpbGRyZW49bjtlbHNlIGlmKDE8dSl7Zm9yKHZhciBjPUFycmF5KHUpLGY9MDtmPHU7ZisrKWNbZl09YXJndW1lbnRzW2YrMl07aS5jaGlsZHJlbj1jfWlmKHQmJnQuZGVmYXVsdFByb3BzKWZvcihvIGluIHU9dC5kZWZhdWx0UHJvcHMpdm9pZCAwPT09aVtvXSYmKGlbb109dVtvXSk7cmV0dXJueyQkdHlwZW9mOnIsdHlwZTp0LGtleTphLHJlZjpzLHByb3BzOmksX293bmVyOmIuY3VycmVudH19ZnVuY3Rpb24gTyh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10JiZ0LiQkdHlwZW9mPT09cn12YXIgST0vXC8rL2c7ZnVuY3Rpb24gUSh0LGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQmJm51bGwhPXQua2V5P2Z1bmN0aW9uIGVzY2FwZSh0KXt2YXIgZT17Ij0iOiI9MCIsIjoiOiI9MiJ9O3JldHVybiIkIit0LnJlcGxhY2UoL1s9Ol0vZywoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19KSl9KCIiK3Qua2V5KTplLnRvU3RyaW5nKDM2KX1mdW5jdGlvbiBSKHQsZSxvLGksYSl7dmFyIHM9dHlwZW9mIHQ7InVuZGVmaW5lZCIhPT1zJiYiYm9vbGVhbiIhPT1zfHwodD1udWxsKTt2YXIgdT0hMTtpZihudWxsPT09dCl1PSEwO2Vsc2Ugc3dpdGNoKHMpe2Nhc2Uic3RyaW5nIjpjYXNlIm51bWJlciI6dT0hMDticmVhaztjYXNlIm9iamVjdCI6c3dpdGNoKHQuJCR0eXBlb2Ype2Nhc2UgcjpjYXNlIG46dT0hMH19aWYodSlyZXR1cm4gYT1hKHU9dCksdD0iIj09PWk/Ii4iK1EodSwwKTppLG0oYSk/KG89IiIsbnVsbCE9dCYmKG89dC5yZXBsYWNlKEksIiQmLyIpKyIvIiksUihhLGUsbywiIiwoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSkpOm51bGwhPWEmJihPKGEpJiYoYT1mdW5jdGlvbiBOKHQsZSl7cmV0dXJueyQkdHlwZW9mOnIsdHlwZTp0LnR5cGUsa2V5OmUscmVmOnQucmVmLHByb3BzOnQucHJvcHMsX293bmVyOnQuX293bmVyfX0oYSxvKyghYS5rZXl8fHUmJnUua2V5PT09YS5rZXk/IiI6KCIiK2Eua2V5KS5yZXBsYWNlKEksIiQmLyIpKyIvIikrdCkpLGUucHVzaChhKSksMTtpZih1PTAsaT0iIj09PWk/Ii4iOmkrIjoiLG0odCkpZm9yKHZhciBjPTA7Yzx0Lmxlbmd0aDtjKyspe3ZhciBmPWkrUShzPXRbY10sYyk7dSs9UihzLGUsbyxmLGEpfWVsc2UgaWYoZj1mdW5jdGlvbiBBKHQpe3JldHVybiBudWxsPT09dHx8Im9iamVjdCIhPXR5cGVvZiB0P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mKHQ9aCYmdFtoXXx8dFsiQEBpdGVyYXRvciJdKT90Om51bGx9KHQpLCJmdW5jdGlvbiI9PXR5cGVvZiBmKWZvcih0PWYuY2FsbCh0KSxjPTA7IShzPXQubmV4dCgpKS5kb25lOyl1Kz1SKHM9cy52YWx1ZSxlLG8sZj1pK1EocyxjKyspLGEpO2Vsc2UgaWYoIm9iamVjdCI9PT1zKXRocm93IGU9U3RyaW5nKHQpLEVycm9yKCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICIrKCJbb2JqZWN0IE9iamVjdF0iPT09ZT8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyh0KS5qb2luKCIsICIpKyJ9IjplKSsiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLiIpO3JldHVybiB1fWZ1bmN0aW9uIFModCxlLHIpe2lmKG51bGw9PXQpcmV0dXJuIHQ7dmFyIG49W10sbz0wO3JldHVybiBSKHQsbiwiIiwiIiwoZnVuY3Rpb24odCl7cmV0dXJuIGUuY2FsbChyLHQsbysrKX0pKSxufWZ1bmN0aW9uIFQodCl7aWYoLTE9PT10Ll9zdGF0dXMpe3ZhciBlPXQuX3Jlc3VsdDsoZT1lKCkpLnRoZW4oKGZ1bmN0aW9uKGUpezAhPT10Ll9zdGF0dXMmJi0xIT09dC5fc3RhdHVzfHwodC5fc3RhdHVzPTEsdC5fcmVzdWx0PWUpfSksKGZ1bmN0aW9uKGUpezAhPT10Ll9zdGF0dXMmJi0xIT09dC5fc3RhdHVzfHwodC5fc3RhdHVzPTIsdC5fcmVzdWx0PWUpfSkpLC0xPT09dC5fc3RhdHVzJiYodC5fc3RhdHVzPTAsdC5fcmVzdWx0PWUpfWlmKDE9PT10Ll9zdGF0dXMpcmV0dXJuIHQuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IHQuX3Jlc3VsdH12YXIgeD17Y3VycmVudDpudWxsfSxCPXt0cmFuc2l0aW9uOm51bGx9LGs9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6eCxSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzpCLFJlYWN0Q3VycmVudE93bmVyOmJ9O2Z1bmN0aW9uIFgoKXt0aHJvdyBFcnJvcigiYWN0KC4uLikgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC4iKX1lLkNoaWxkcmVuPXttYXA6Uyxmb3JFYWNoOmZ1bmN0aW9uKHQsZSxyKXtTKHQsKGZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxyKX0sY291bnQ6ZnVuY3Rpb24odCl7dmFyIGU9MDtyZXR1cm4gUyh0LChmdW5jdGlvbigpe2UrK30pKSxlfSx0b0FycmF5OmZ1bmN0aW9uKHQpe3JldHVybiBTKHQsKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpfHxbXX0sb25seTpmdW5jdGlvbih0KXtpZighTyh0KSl0aHJvdyBFcnJvcigiUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuIik7cmV0dXJuIHR9fSxlLkNvbXBvbmVudD1FLGUuRnJhZ21lbnQ9byxlLlByb2ZpbGVyPWEsZS5QdXJlQ29tcG9uZW50PUcsZS5TdHJpY3RNb2RlPWksZS5TdXNwZW5zZT1mLGUuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9ayxlLmFjdD1YLGUuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT10KXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK3QrIi4iKTt2YXIgbz15KHt9LHQucHJvcHMpLGk9dC5rZXksYT10LnJlZixzPXQuX293bmVyO2lmKG51bGwhPWUpe2lmKHZvaWQgMCE9PWUucmVmJiYoYT1lLnJlZixzPWIuY3VycmVudCksdm9pZCAwIT09ZS5rZXkmJihpPSIiK2Uua2V5KSx0LnR5cGUmJnQudHlwZS5kZWZhdWx0UHJvcHMpdmFyIHU9dC50eXBlLmRlZmF1bHRQcm9wcztmb3IoYyBpbiBlKXYuY2FsbChlLGMpJiYhdy5oYXNPd25Qcm9wZXJ0eShjKSYmKG9bY109dm9pZCAwPT09ZVtjXSYmdm9pZCAwIT09dT91W2NdOmVbY10pfXZhciBjPWFyZ3VtZW50cy5sZW5ndGgtMjtpZigxPT09YylvLmNoaWxkcmVuPW47ZWxzZSBpZigxPGMpe3U9QXJyYXkoYyk7Zm9yKHZhciBmPTA7ZjxjO2YrKyl1W2ZdPWFyZ3VtZW50c1tmKzJdO28uY2hpbGRyZW49dX1yZXR1cm57JCR0eXBlb2Y6cix0eXBlOnQudHlwZSxrZXk6aSxyZWY6YSxwcm9wczpvLF9vd25lcjpzfX0sZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybih0PXskJHR5cGVvZjp1LF9jdXJyZW50VmFsdWU6dCxfY3VycmVudFZhbHVlMjp0LF90aHJlYWRDb3VudDowLFByb3ZpZGVyOm51bGwsQ29uc3VtZXI6bnVsbCxfZGVmYXVsdFZhbHVlOm51bGwsX2dsb2JhbE5hbWU6bnVsbH0pLlByb3ZpZGVyPXskJHR5cGVvZjpzLF9jb250ZXh0OnR9LHQuQ29uc3VtZXI9dH0sZS5jcmVhdGVFbGVtZW50PU0sZS5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKHQpe3ZhciBlPU0uYmluZChudWxsLHQpO3JldHVybiBlLnR5cGU9dCxlfSxlLmNyZWF0ZVJlZj1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGx9fSxlLmZvcndhcmRSZWY9ZnVuY3Rpb24odCl7cmV0dXJueyQkdHlwZW9mOmMscmVuZGVyOnR9fSxlLmlzVmFsaWRFbGVtZW50PU8sZS5sYXp5PWZ1bmN0aW9uKHQpe3JldHVybnskJHR5cGVvZjpwLF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6dH0sX2luaXQ6VH19LGUubWVtbz1mdW5jdGlvbih0LGUpe3JldHVybnskJHR5cGVvZjpsLHR5cGU6dCxjb21wYXJlOnZvaWQgMD09PWU/bnVsbDplfX0sZS5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24odCl7dmFyIGU9Qi50cmFuc2l0aW9uO0IudHJhbnNpdGlvbj17fTt0cnl7dCgpfWZpbmFsbHl7Qi50cmFuc2l0aW9uPWV9fSxlLnVuc3RhYmxlX2FjdD1YLGUudXNlQ2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4geC5jdXJyZW50LnVzZUNhbGxiYWNrKHQsZSl9LGUudXNlQ29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4geC5jdXJyZW50LnVzZUNvbnRleHQodCl9LGUudXNlRGVidWdWYWx1ZT1mdW5jdGlvbigpe30sZS51c2VEZWZlcnJlZFZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB4LmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZSh0KX0sZS51c2VFZmZlY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4geC5jdXJyZW50LnVzZUVmZmVjdCh0LGUpfSxlLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHguY3VycmVudC51c2VJZCgpfSxlLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB4LmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZSh0LGUscil9LGUudXNlSW5zZXJ0aW9uRWZmZWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHguY3VycmVudC51c2VJbnNlcnRpb25FZmZlY3QodCxlKX0sZS51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4geC5jdXJyZW50LnVzZUxheW91dEVmZmVjdCh0LGUpfSxlLnVzZU1lbW89ZnVuY3Rpb24odCxlKXtyZXR1cm4geC5jdXJyZW50LnVzZU1lbW8odCxlKX0sZS51c2VSZWR1Y2VyPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4geC5jdXJyZW50LnVzZVJlZHVjZXIodCxlLHIpfSxlLnVzZVJlZj1mdW5jdGlvbih0KXtyZXR1cm4geC5jdXJyZW50LnVzZVJlZih0KX0sZS51c2VTdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4geC5jdXJyZW50LnVzZVN0YXRlKHQpfSxlLnVzZVN5bmNFeHRlcm5hbFN0b3JlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4geC5jdXJyZW50LnVzZVN5bmNFeHRlcm5hbFN0b3JlKHQsZSxyKX0sZS51c2VUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHguY3VycmVudC51c2VUcmFuc2l0aW9uKCl9LGUudmVyc2lvbj0iMTguMy4xIn0sNjU0MCh0LGUscil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1yKDUyODcpfSwyODYxKHQsZSxyKXt2YXIgbj1yKDgyODcpLG89bi5CdWZmZXI7ZnVuY3Rpb24gY29weVByb3BzKHQsZSl7Zm9yKHZhciByIGluIHQpZVtyXT10W3JdfWZ1bmN0aW9uIFNhZmVCdWZmZXIodCxlLHIpe3JldHVybiBvKHQsZSxyKX1vLmZyb20mJm8uYWxsb2MmJm8uYWxsb2NVbnNhZmUmJm8uYWxsb2NVbnNhZmVTbG93P3QuZXhwb3J0cz1uOihjb3B5UHJvcHMobixlKSxlLkJ1ZmZlcj1TYWZlQnVmZmVyKSxTYWZlQnVmZmVyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSxjb3B5UHJvcHMobyxTYWZlQnVmZmVyKSxTYWZlQnVmZmVyLmZyb209ZnVuY3Rpb24odCxlLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlciIpO3JldHVybiBvKHQsZSxyKX0sU2FmZUJ1ZmZlci5hbGxvYz1mdW5jdGlvbih0LGUscil7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTt2YXIgbj1vKHQpO3JldHVybiB2b2lkIDAhPT1lPyJzdHJpbmciPT10eXBlb2Ygcj9uLmZpbGwoZSxyKTpuLmZpbGwoZSk6bi5maWxsKDApLG59LFNhZmVCdWZmZXIuYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gbyh0KX0sU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gbi5TbG93QnVmZmVyKHQpfX0sNjg5Nyh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNDUzKSxvPXIoNDEpLGk9cig1OTIpKCksYT1yKDU3OTUpLHM9cig5Njc1KSx1PW4oIiVNYXRoLmZsb29yJSIpO3QuZXhwb3J0cz1mdW5jdGlvbiBzZXRGdW5jdGlvbkxlbmd0aCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBzKCJgZm5gIGlzIG5vdCBhIGZ1bmN0aW9uIik7aWYoIm51bWJlciIhPXR5cGVvZiBlfHxlPDB8fGU+NDI5NDk2NzI5NXx8dShlKSE9PWUpdGhyb3cgbmV3IHMoImBsZW5ndGhgIG11c3QgYmUgYSBwb3NpdGl2ZSAzMi1iaXQgaW50ZWdlciIpO3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MiYmISFhcmd1bWVudHNbMl0sbj0hMCxjPSEwO2lmKCJsZW5ndGgiaW4gdCYmYSl7dmFyIGY9YSh0LCJsZW5ndGgiKTtmJiYhZi5jb25maWd1cmFibGUmJihuPSExKSxmJiYhZi53cml0YWJsZSYmKGM9ITEpfXJldHVybihufHxjfHwhcikmJihpP28odCwibGVuZ3RoIixlLCEwLCEwKTpvKHQsImxlbmd0aCIsZSkpLHR9fSw4MDExKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cigyODYxKS5CdWZmZXIsbz1yKDUzNzcpO2Z1bmN0aW9uIEhhc2godCxlKXt0aGlzLl9ibG9jaz1uLmFsbG9jKHQpLHRoaXMuX2ZpbmFsU2l6ZT1lLHRoaXMuX2Jsb2NrU2l6ZT10LHRoaXMuX2xlbj0wfUhhc2gucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3Q9byh0LGV8fCJ1dGY4Iik7Zm9yKHZhciByPXRoaXMuX2Jsb2NrLG49dGhpcy5fYmxvY2tTaXplLGk9dC5sZW5ndGgsYT10aGlzLl9sZW4scz0wO3M8aTspe2Zvcih2YXIgdT1hJW4sYz1NYXRoLm1pbihpLXMsbi11KSxmPTA7ZjxjO2YrKylyW3UrZl09dFtzK2ZdO3MrPWMsKGErPWMpJW49PTAmJnRoaXMuX3VwZGF0ZShyKX1yZXR1cm4gdGhpcy5fbGVuKz1pLHRoaXN9LEhhc2gucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9sZW4ldGhpcy5fYmxvY2tTaXplO3RoaXMuX2Jsb2NrW2VdPTEyOCx0aGlzLl9ibG9jay5maWxsKDAsZSsxKSxlPj10aGlzLl9maW5hbFNpemUmJih0aGlzLl91cGRhdGUodGhpcy5fYmxvY2spLHRoaXMuX2Jsb2NrLmZpbGwoMCkpO3ZhciByPTgqdGhpcy5fbGVuO2lmKHI8PTQyOTQ5NjcyOTUpdGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShyLHRoaXMuX2Jsb2NrU2l6ZS00KTtlbHNle3ZhciBuPSg0Mjk0OTY3Mjk1JnIpPj4+MCxvPShyLW4pLzQyOTQ5NjcyOTY7dGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShvLHRoaXMuX2Jsb2NrU2l6ZS04KSx0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKG4sdGhpcy5fYmxvY2tTaXplLTQpfXRoaXMuX3VwZGF0ZSh0aGlzLl9ibG9jayk7dmFyIGk9dGhpcy5faGFzaCgpO3JldHVybiB0P2kudG9TdHJpbmcodCk6aX0sSGFzaC5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiX3VwZGF0ZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzIil9LHQuZXhwb3J0cz1IYXNofSwyODAyKHQsZSxyKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWZ1bmN0aW9uIFNIQShlKXt2YXIgcj1lLnRvTG93ZXJDYXNlKCksbj10LmV4cG9ydHNbcl07aWYoIW4pdGhyb3cgbmV3IEVycm9yKHIrIiBpcyBub3Qgc3VwcG9ydGVkICh3ZSBhY2NlcHQgcHVsbCByZXF1ZXN0cykiKTtyZXR1cm4gbmV3IG59LHQuZXhwb3J0cy5zaGE9cig3ODE2KSx0LmV4cG9ydHMuc2hhMT1yKDM3MzcpLHQuZXhwb3J0cy5zaGEyMjQ9cig2NzEwKSx0LmV4cG9ydHMuc2hhMjU2PXIoNDEwNyksdC5leHBvcnRzLnNoYTM4ND1yKDI4MjcpLHQuZXhwb3J0cy5zaGE1MTI9cigyODkwKX0sNzgxNih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNjY5OCksbz1yKDgwMTEpLGk9cigyODYxKS5CdWZmZXIsYT1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLC0xODk0MDA3NTg4LC04OTk0OTc1MTRdLHM9bmV3IEFycmF5KDgwKTtmdW5jdGlvbiBTaGEoKXt0aGlzLmluaXQoKSx0aGlzLl93PXMsby5jYWxsKHRoaXMsNjQsNTYpfWZ1bmN0aW9uIHJvdGwzMCh0KXtyZXR1cm4gdDw8MzB8dD4+PjJ9ZnVuY3Rpb24gZnQodCxlLHIsbil7cmV0dXJuIDA9PT10P2Umcnx+ZSZuOjI9PT10P2UmcnxlJm58ciZuOmVecl5ufW4oU2hhLG8pLFNoYS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hPTE3MzI1ODQxOTMsdGhpcy5fYj00MDIzMjMzNDE3LHRoaXMuX2M9MjU2MjM4MzEwMix0aGlzLl9kPTI3MTczMzg3OCx0aGlzLl9lPTMyODUzNzc1MjAsdGhpc30sU2hhLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPXRoaXMuX3csbj0wfHRoaXMuX2Esbz0wfHRoaXMuX2IsaT0wfHRoaXMuX2Mscz0wfHRoaXMuX2QsdT0wfHRoaXMuX2UsYz0wO2M8MTY7KytjKXJbY109dC5yZWFkSW50MzJCRSg0KmMpO2Zvcig7Yzw4MDsrK2MpcltjXT1yW2MtM11ecltjLThdXnJbYy0xNF1ecltjLTE2XTtmb3IodmFyIGY9MDtmPDgwOysrZil7dmFyIGw9fn4oZi8yMCkscD0wfCgoZT1uKTw8NXxlPj4+MjcpK2Z0KGwsbyxpLHMpK3UrcltmXSthW2xdO3U9cyxzPWksaT1yb3RsMzAobyksbz1uLG49cH10aGlzLl9hPW4rdGhpcy5fYXwwLHRoaXMuX2I9byt0aGlzLl9ifDAsdGhpcy5fYz1pK3RoaXMuX2N8MCx0aGlzLl9kPXMrdGhpcy5fZHwwLHRoaXMuX2U9dSt0aGlzLl9lfDB9LFNoYS5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgdD1pLmFsbG9jVW5zYWZlKDIwKTtyZXR1cm4gdC53cml0ZUludDMyQkUoMHx0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKDB8dGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUoMHx0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2UsMTYpLHR9LHQuZXhwb3J0cz1TaGF9LDM3MzcodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDY2OTgpLG89cig4MDExKSxpPXIoMjg2MSkuQnVmZmVyLGE9WzE1MTg1MDAyNDksMTg1OTc3NTM5MywtMTg5NDAwNzU4OCwtODk5NDk3NTE0XSxzPW5ldyBBcnJheSg4MCk7ZnVuY3Rpb24gU2hhMSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9cyxvLmNhbGwodGhpcyw2NCw1Nil9ZnVuY3Rpb24gcm90bDUodCl7cmV0dXJuIHQ8PDV8dD4+PjI3fWZ1bmN0aW9uIHJvdGwzMCh0KXtyZXR1cm4gdDw8MzB8dD4+PjJ9ZnVuY3Rpb24gZnQodCxlLHIsbil7cmV0dXJuIDA9PT10P2Umcnx+ZSZuOjI9PT10P2UmcnxlJm58ciZuOmVecl5ufW4oU2hhMSxvKSxTaGExLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2E9MTczMjU4NDE5Myx0aGlzLl9iPTQwMjMyMzM0MTcsdGhpcy5fYz0yNTYyMzgzMTAyLHRoaXMuX2Q9MjcxNzMzODc4LHRoaXMuX2U9MzI4NTM3NzUyMCx0aGlzfSxTaGExLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPXRoaXMuX3csbj0wfHRoaXMuX2Esbz0wfHRoaXMuX2IsaT0wfHRoaXMuX2Mscz0wfHRoaXMuX2QsdT0wfHRoaXMuX2UsYz0wO2M8MTY7KytjKXJbY109dC5yZWFkSW50MzJCRSg0KmMpO2Zvcig7Yzw4MDsrK2MpcltjXT0oZT1yW2MtM11ecltjLThdXnJbYy0xNF1ecltjLTE2XSk8PDF8ZT4+PjMxO2Zvcih2YXIgZj0wO2Y8ODA7KytmKXt2YXIgbD1+fihmLzIwKSxwPXJvdGw1KG4pK2Z0KGwsbyxpLHMpK3UrcltmXSthW2xdfDA7dT1zLHM9aSxpPXJvdGwzMChvKSxvPW4sbj1wfXRoaXMuX2E9bit0aGlzLl9hfDAsdGhpcy5fYj1vK3RoaXMuX2J8MCx0aGlzLl9jPWkrdGhpcy5fY3wwLHRoaXMuX2Q9cyt0aGlzLl9kfDAsdGhpcy5fZT11K3RoaXMuX2V8MH0sU2hhMS5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgdD1pLmFsbG9jVW5zYWZlKDIwKTtyZXR1cm4gdC53cml0ZUludDMyQkUoMHx0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKDB8dGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUoMHx0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2UsMTYpLHR9LHQuZXhwb3J0cz1TaGExfSw2NzEwKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig2Njk4KSxvPXIoNDEwNyksaT1yKDgwMTEpLGE9cigyODYxKS5CdWZmZXIscz1uZXcgQXJyYXkoNjQpO2Z1bmN0aW9uIFNoYTIyNCgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9cyxpLmNhbGwodGhpcyw2NCw1Nil9bihTaGEyMjQsbyksU2hhMjI0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2E9MzIzODM3MTAzMix0aGlzLl9iPTkxNDE1MDY2Myx0aGlzLl9jPTgxMjcwMjk5OSx0aGlzLl9kPTQxNDQ5MTI2OTcsdGhpcy5fZT00MjkwNzc1ODU3LHRoaXMuX2Y9MTc1MDYwMzAyNSx0aGlzLl9nPTE2OTQwNzY4MzksdGhpcy5faD0zMjA0MDc1NDI4LHRoaXN9LFNoYTIyNC5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgdD1hLmFsbG9jVW5zYWZlKDI4KTtyZXR1cm4gdC53cml0ZUludDMyQkUodGhpcy5fYSwwKSx0LndyaXRlSW50MzJCRSh0aGlzLl9iLDQpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUodGhpcy5fZCwxMiksdC53cml0ZUludDMyQkUodGhpcy5fZSwxNiksdC53cml0ZUludDMyQkUodGhpcy5fZiwyMCksdC53cml0ZUludDMyQkUodGhpcy5fZywyNCksdH0sdC5leHBvcnRzPVNoYTIyNH0sNDEwNyh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNjY5OCksbz1yKDgwMTEpLGk9cigyODYxKS5CdWZmZXIsYT1bMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSxzPW5ldyBBcnJheSg2NCk7ZnVuY3Rpb24gU2hhMjU2KCl7dGhpcy5pbml0KCksdGhpcy5fdz1zLG8uY2FsbCh0aGlzLDY0LDU2KX1mdW5jdGlvbiBjaCh0LGUscil7cmV0dXJuIHJedCYoZV5yKX1mdW5jdGlvbiBtYWoodCxlLHIpe3JldHVybiB0JmV8ciYodHxlKX1mdW5jdGlvbiBzaWdtYTAodCl7cmV0dXJuKHQ+Pj4yfHQ8PDMwKV4odD4+PjEzfHQ8PDE5KV4odD4+PjIyfHQ8PDEwKX1mdW5jdGlvbiBzaWdtYTEodCl7cmV0dXJuKHQ+Pj42fHQ8PDI2KV4odD4+PjExfHQ8PDIxKV4odD4+PjI1fHQ8PDcpfWZ1bmN0aW9uIGdhbW1hMCh0KXtyZXR1cm4odD4+Pjd8dDw8MjUpXih0Pj4+MTh8dDw8MTQpXnQ+Pj4zfW4oU2hhMjU2LG8pLFNoYTI1Ni5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hPTE3NzkwMzM3MDMsdGhpcy5fYj0zMTQ0MTM0Mjc3LHRoaXMuX2M9MTAxMzkwNDI0Mix0aGlzLl9kPTI3NzM0ODA3NjIsdGhpcy5fZT0xMzU5ODkzMTE5LHRoaXMuX2Y9MjYwMDgyMjkyNCx0aGlzLl9nPTUyODczNDYzNSx0aGlzLl9oPTE1NDE0NTkyMjUsdGhpc30sU2hhMjU2LnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPXRoaXMuX3csbj0wfHRoaXMuX2Esbz0wfHRoaXMuX2IsaT0wfHRoaXMuX2Mscz0wfHRoaXMuX2QsdT0wfHRoaXMuX2UsYz0wfHRoaXMuX2YsZj0wfHRoaXMuX2csbD0wfHRoaXMuX2gscD0wO3A8MTY7KytwKXJbcF09dC5yZWFkSW50MzJCRSg0KnApO2Zvcig7cDw2NDsrK3ApcltwXT0wfCgoKGU9cltwLTJdKT4+PjE3fGU8PDE1KV4oZT4+PjE5fGU8PDEzKV5lPj4+MTApK3JbcC03XStnYW1tYTAocltwLTE1XSkrcltwLTE2XTtmb3IodmFyIGg9MDtoPDY0OysraCl7dmFyIGQ9bCtzaWdtYTEodSkrY2godSxjLGYpK2FbaF0rcltoXXwwLHk9c2lnbWEwKG4pK21haihuLG8saSl8MDtsPWYsZj1jLGM9dSx1PXMrZHwwLHM9aSxpPW8sbz1uLG49ZCt5fDB9dGhpcy5fYT1uK3RoaXMuX2F8MCx0aGlzLl9iPW8rdGhpcy5fYnwwLHRoaXMuX2M9aSt0aGlzLl9jfDAsdGhpcy5fZD1zK3RoaXMuX2R8MCx0aGlzLl9lPXUrdGhpcy5fZXwwLHRoaXMuX2Y9Yyt0aGlzLl9mfDAsdGhpcy5fZz1mK3RoaXMuX2d8MCx0aGlzLl9oPWwrdGhpcy5faHwwfSxTaGEyNTYucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9aS5hbGxvY1Vuc2FmZSgzMik7cmV0dXJuIHQud3JpdGVJbnQzMkJFKHRoaXMuX2EsMCksdC53cml0ZUludDMyQkUodGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSh0aGlzLl9jLDgpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2QsMTIpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2UsMTYpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2YsMjApLHQud3JpdGVJbnQzMkJFKHRoaXMuX2csMjQpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2gsMjgpLHR9LHQuZXhwb3J0cz1TaGEyNTZ9LDI4MjcodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDY2OTgpLG89cigyODkwKSxpPXIoODAxMSksYT1yKDI4NjEpLkJ1ZmZlcixzPW5ldyBBcnJheSgxNjApO2Z1bmN0aW9uIFNoYTM4NCgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9cyxpLmNhbGwodGhpcywxMjgsMTEyKX1uKFNoYTM4NCxvKSxTaGEzODQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWg9MzQxODA3MDM2NSx0aGlzLl9iaD0xNjU0MjcwMjUwLHRoaXMuX2NoPTI0Mzg1MjkzNzAsdGhpcy5fZGg9MzU1NDYyMzYwLHRoaXMuX2VoPTE3MzE0MDU0MTUsdGhpcy5fZmg9MjM5NDE4MDIzMSx0aGlzLl9naD0zNjc1MDA4NTI1LHRoaXMuX2hoPTEyMDMwNjI4MTMsdGhpcy5fYWw9MzIzODM3MTAzMix0aGlzLl9ibD05MTQxNTA2NjMsdGhpcy5fY2w9ODEyNzAyOTk5LHRoaXMuX2RsPTQxNDQ5MTI2OTcsdGhpcy5fZWw9NDI5MDc3NTg1Nyx0aGlzLl9mbD0xNzUwNjAzMDI1LHRoaXMuX2dsPTE2OTQwNzY4MzksdGhpcy5faGw9MzIwNDA3NTQyOCx0aGlzfSxTaGEzODQucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9YS5hbGxvY1Vuc2FmZSg0OCk7ZnVuY3Rpb24gd3JpdGVJbnQ2NEJFKGUscixuKXt0LndyaXRlSW50MzJCRShlLG4pLHQud3JpdGVJbnQzMkJFKHIsbis0KX1yZXR1cm4gd3JpdGVJbnQ2NEJFKHRoaXMuX2FoLHRoaXMuX2FsLDApLHdyaXRlSW50NjRCRSh0aGlzLl9iaCx0aGlzLl9ibCw4KSx3cml0ZUludDY0QkUodGhpcy5fY2gsdGhpcy5fY2wsMTYpLHdyaXRlSW50NjRCRSh0aGlzLl9kaCx0aGlzLl9kbCwyNCksd3JpdGVJbnQ2NEJFKHRoaXMuX2VoLHRoaXMuX2VsLDMyKSx3cml0ZUludDY0QkUodGhpcy5fZmgsdGhpcy5fZmwsNDApLHR9LHQuZXhwb3J0cz1TaGEzODR9LDI4OTAodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDY2OTgpLG89cig4MDExKSxpPXIoMjg2MSkuQnVmZmVyLGE9WzExMTYzNTI0MDgsMzYwOTc2NzQ1OCwxODk5NDQ3NDQxLDYwMjg5MTcyNSwzMDQ5MzIzNDcxLDM5NjQ0ODQzOTksMzkyMTAwOTU3MywyMTczMjk1NTQ4LDk2MTk4NzE2Myw0MDgxNjI4NDcyLDE1MDg5NzA5OTMsMzA1MzgzNDI2NSwyNDUzNjM1NzQ4LDI5Mzc2NzE1NzksMjg3MDc2MzIyMSwzNjY0NjA5NTYwLDM2MjQzODEwODAsMjczNDg4MzM5NCwzMTA1OTg0MDEsMTE2NDk5NjU0Miw2MDcyMjUyNzgsMTMyMzYxMDc2NCwxNDI2ODgxOTg3LDM1OTAzMDQ5OTQsMTkyNTA3ODM4OCw0MDY4MTgyMzgzLDIxNjIwNzgyMDYsOTkxMzM2MTEzLDI2MTQ4ODgxMDMsNjMzODAzMzE3LDMyNDgyMjI1ODAsMzQ3OTc3NDg2OCwzODM1MzkwNDAxLDI2NjY2MTM0NTgsNDAyMjIyNDc3NCw5NDQ3MTExMzksMjY0MzQ3MDc4LDIzNDEyNjI3NzMsNjA0ODA3NjI4LDIwMDc4MDA5MzMsNzcwMjU1OTgzLDE0OTU5OTA5MDEsMTI0OTE1MDEyMiwxODU2NDMxMjM1LDE1NTUwODE2OTIsMzE3NTIxODEzMiwxOTk2MDY0OTg2LDIxOTg5NTA4MzcsMjU1NDIyMDg4MiwzOTk5NzE5MzM5LDI4MjE4MzQzNDksNzY2Nzg0MDE2LDI5NTI5OTY4MDgsMjU2NjU5NDg3OSwzMjEwMzEzNjcxLDMyMDMzMzc5NTYsMzMzNjU3MTg5MSwxMDM0NDU3MDI2LDM1ODQ1Mjg3MTEsMjQ2Njk0ODkwMSwxMTM5MjY5OTMsMzc1ODMyNjM4MywzMzgyNDE4OTUsMTY4NzE3OTM2LDY2NjMwNzIwNSwxMTg4MTc5OTY0LDc3MzUyOTkxMiwxNTQ2MDQ1NzM0LDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSwxMzk2MTgyMjkxLDI2NDM4MzM4MjMsMTY5NTE4MzcwMCwyMzQzNTI3MzkwLDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCwyMTc3MDI2MzUwLDEyMDY3NTkxNDIsMjQ1Njk1NjAzNywzNDQwNzc2MjcsMjczMDQ4NTkyMSwxMjkwODYzNDYwLDI4MjAzMDI0MTEsMzE1ODQ1NDI3MywzMjU5NzMwODAwLDM1MDU5NTI2NTcsMzM0NTc2NDc3MSwxMDYyMTcwMDgsMzUxNjA2NTgxNywzNjA2MDA4MzQ0LDM2MDAzNTI4MDQsMTQzMjcyNTc3Niw0MDk0NTcxOTA5LDE0NjcwMzE1OTQsMjc1NDIzMzQ0LDg1MTE2OTcyMCw0MzAyMjc3MzQsMzEwMDgyMzc1Miw1MDY5NDg2MTYsMTM2MzI1ODE5NSw2NTkwNjA1NTYsMzc1MDY4NTU5Myw4ODM5OTc4NzcsMzc4NTA1MDI4MCw5NTgxMzk1NzEsMzMxODMwNzQyNywxMzIyODIyMjE4LDM4MTI3MjM0MDMsMTUzNzAwMjA2MywyMDAzMDM0OTk1LDE3NDc4NzM3NzksMzYwMjAzNjg5OSwxOTU1NTYyMjIyLDE1NzU5OTAwMTIsMjAyNDEwNDgxNSwxMTI1NTkyOTI4LDIyMjc3MzA0NTIsMjcxNjkwNDMwNiwyMzYxODUyNDI0LDQ0Mjc3NjA0NCwyNDI4NDM2NDc0LDU5MzY5ODM0NCwyNzU2NzM0MTg3LDM3MzMxMTAyNDksMzIwNDAzMTQ3OSwyOTk5MzUxNTczLDMzMjkzMjUyOTgsMzgxNTkyMDQyNywzMzkxNTY5NjE0LDM5MjgzODM5MDAsMzUxNTI2NzI3MSw1NjYyODA3MTEsMzk0MDE4NzYwNiwzNDU0MDY5NTM0LDQxMTg2MzAyNzEsNDAwMDIzOTk5MiwxMTY0MTg0NzQsMTkxNDEzODU1NCwxNzQyOTI0MjEsMjczMTA1NTI3MCwyODkzODAzNTYsMzIwMzk5MzAwNiw0NjAzOTMyNjksMzIwNjIwMzE1LDY4NTQ3MTczMyw1ODc0OTY4MzYsODUyMTQyOTcxLDEwODY3OTI4NTEsMTAxNzAzNjI5OCwzNjU1NDMxMDAsMTEyNjAwMDU4MCwyNjE4Mjk3Njc2LDEyODgwMzM0NzAsMzQwOTg1NTE1OCwxNTAxNTA1OTQ4LDQyMzQ1MDk4NjYsMTYwNzE2NzkxNSw5ODcxNjc0NjgsMTgxNjQwMjMxNiwxMjQ2MTg5NTkxXSxzPW5ldyBBcnJheSgxNjApO2Z1bmN0aW9uIFNoYTUxMigpe3RoaXMuaW5pdCgpLHRoaXMuX3c9cyxvLmNhbGwodGhpcywxMjgsMTEyKX1mdW5jdGlvbiBDaCh0LGUscil7cmV0dXJuIHJedCYoZV5yKX1mdW5jdGlvbiBtYWoodCxlLHIpe3JldHVybiB0JmV8ciYodHxlKX1mdW5jdGlvbiBzaWdtYTAodCxlKXtyZXR1cm4odD4+PjI4fGU8PDQpXihlPj4+Mnx0PDwzMCleKGU+Pj43fHQ8PDI1KX1mdW5jdGlvbiBzaWdtYTEodCxlKXtyZXR1cm4odD4+PjE0fGU8PDE4KV4odD4+PjE4fGU8PDE0KV4oZT4+Pjl8dDw8MjMpfWZ1bmN0aW9uIEdhbW1hMCh0LGUpe3JldHVybih0Pj4+MXxlPDwzMSleKHQ+Pj44fGU8PDI0KV50Pj4+N31mdW5jdGlvbiBHYW1tYTBsKHQsZSl7cmV0dXJuKHQ+Pj4xfGU8PDMxKV4odD4+Pjh8ZTw8MjQpXih0Pj4+N3xlPDwyNSl9ZnVuY3Rpb24gR2FtbWExKHQsZSl7cmV0dXJuKHQ+Pj4xOXxlPDwxMyleKGU+Pj4yOXx0PDwzKV50Pj4+Nn1mdW5jdGlvbiBHYW1tYTFsKHQsZSl7cmV0dXJuKHQ+Pj4xOXxlPDwxMyleKGU+Pj4yOXx0PDwzKV4odD4+PjZ8ZTw8MjYpfWZ1bmN0aW9uIGdldENhcnJ5KHQsZSl7cmV0dXJuIHQ+Pj4wPGU+Pj4wPzE6MH1uKFNoYTUxMixvKSxTaGE1MTIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWg9MTc3OTAzMzcwMyx0aGlzLl9iaD0zMTQ0MTM0Mjc3LHRoaXMuX2NoPTEwMTM5MDQyNDIsdGhpcy5fZGg9Mjc3MzQ4MDc2Mix0aGlzLl9laD0xMzU5ODkzMTE5LHRoaXMuX2ZoPTI2MDA4MjI5MjQsdGhpcy5fZ2g9NTI4NzM0NjM1LHRoaXMuX2hoPTE1NDE0NTkyMjUsdGhpcy5fYWw9NDA4OTIzNTcyMCx0aGlzLl9ibD0yMjI3ODczNTk1LHRoaXMuX2NsPTQyNzExNzU3MjMsdGhpcy5fZGw9MTU5NTc1MDEyOSx0aGlzLl9lbD0yOTE3NTY1MTM3LHRoaXMuX2ZsPTcyNTUxMTE5OSx0aGlzLl9nbD00MjE1Mzg5NTQ3LHRoaXMuX2hsPTMyNzAzMzIwOSx0aGlzfSxTaGE1MTIucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX3cscj0wfHRoaXMuX2FoLG49MHx0aGlzLl9iaCxvPTB8dGhpcy5fY2gsaT0wfHRoaXMuX2RoLHM9MHx0aGlzLl9laCx1PTB8dGhpcy5fZmgsYz0wfHRoaXMuX2doLGY9MHx0aGlzLl9oaCxsPTB8dGhpcy5fYWwscD0wfHRoaXMuX2JsLGg9MHx0aGlzLl9jbCxkPTB8dGhpcy5fZGwseT0wfHRoaXMuX2VsLF89MHx0aGlzLl9mbCxnPTB8dGhpcy5fZ2wsbT0wfHRoaXMuX2hsLHY9MDt2PDMyO3YrPTIpZVt2XT10LnJlYWRJbnQzMkJFKDQqdiksZVt2KzFdPXQucmVhZEludDMyQkUoNCp2KzQpO2Zvcig7djwxNjA7dis9Mil7dmFyIGI9ZVt2LTMwXSx3PWVbdi0zMCsxXSxJPUdhbW1hMChiLHcpLHg9R2FtbWEwbCh3LGIpLEI9R2FtbWExKGI9ZVt2LTRdLHc9ZVt2LTQrMV0pLGs9R2FtbWExbCh3LGIpLEM9ZVt2LTE0XSxqPWVbdi0xNCsxXSxxPWVbdi0zMl0sTD1lW3YtMzIrMV0sUD14K2p8MCxVPUkrQytnZXRDYXJyeShQLHgpfDA7VT0oVT1VK0IrZ2V0Q2FycnkoUD1QK2t8MCxrKXwwKStxK2dldENhcnJ5KFA9UCtMfDAsTCl8MCxlW3ZdPVUsZVt2KzFdPVB9Zm9yKHZhciBEPTA7RDwxNjA7RCs9Mil7VT1lW0RdLFA9ZVtEKzFdO3ZhciB6PW1haihyLG4sbyksVz1tYWoobCxwLGgpLFY9c2lnbWEwKHIsbCksSz1zaWdtYTAobCxyKSwkPXNpZ21hMShzLHkpLEg9c2lnbWExKHkscyksWT1hW0RdLFo9YVtEKzFdLEo9Q2gocyx1LGMpLHR0PUNoKHksXyxnKSxldD1tK0h8MCxydD1mKyQrZ2V0Q2FycnkoZXQsbSl8MDtydD0ocnQ9KHJ0PXJ0K0orZ2V0Q2FycnkoZXQ9ZXQrdHR8MCx0dCl8MCkrWStnZXRDYXJyeShldD1ldCtafDAsWil8MCkrVStnZXRDYXJyeShldD1ldCtQfDAsUCl8MDt2YXIgbnQ9SytXfDAsb3Q9Vit6K2dldENhcnJ5KG50LEspfDA7Zj1jLG09ZyxjPXUsZz1fLHU9cyxfPXkscz1pK3J0K2dldENhcnJ5KHk9ZCtldHwwLGQpfDAsaT1vLGQ9aCxvPW4saD1wLG49cixwPWwscj1ydCtvdCtnZXRDYXJyeShsPWV0K250fDAsZXQpfDB9dGhpcy5fYWw9dGhpcy5fYWwrbHwwLHRoaXMuX2JsPXRoaXMuX2JsK3B8MCx0aGlzLl9jbD10aGlzLl9jbCtofDAsdGhpcy5fZGw9dGhpcy5fZGwrZHwwLHRoaXMuX2VsPXRoaXMuX2VsK3l8MCx0aGlzLl9mbD10aGlzLl9mbCtffDAsdGhpcy5fZ2w9dGhpcy5fZ2wrZ3wwLHRoaXMuX2hsPXRoaXMuX2hsK218MCx0aGlzLl9haD10aGlzLl9haCtyK2dldENhcnJ5KHRoaXMuX2FsLGwpfDAsdGhpcy5fYmg9dGhpcy5fYmgrbitnZXRDYXJyeSh0aGlzLl9ibCxwKXwwLHRoaXMuX2NoPXRoaXMuX2NoK28rZ2V0Q2FycnkodGhpcy5fY2wsaCl8MCx0aGlzLl9kaD10aGlzLl9kaCtpK2dldENhcnJ5KHRoaXMuX2RsLGQpfDAsdGhpcy5fZWg9dGhpcy5fZWgrcytnZXRDYXJyeSh0aGlzLl9lbCx5KXwwLHRoaXMuX2ZoPXRoaXMuX2ZoK3UrZ2V0Q2FycnkodGhpcy5fZmwsXyl8MCx0aGlzLl9naD10aGlzLl9naCtjK2dldENhcnJ5KHRoaXMuX2dsLGcpfDAsdGhpcy5faGg9dGhpcy5faGgrZitnZXRDYXJyeSh0aGlzLl9obCxtKXwwfSxTaGE1MTIucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9aS5hbGxvY1Vuc2FmZSg2NCk7ZnVuY3Rpb24gd3JpdGVJbnQ2NEJFKGUscixuKXt0LndyaXRlSW50MzJCRShlLG4pLHQud3JpdGVJbnQzMkJFKHIsbis0KX1yZXR1cm4gd3JpdGVJbnQ2NEJFKHRoaXMuX2FoLHRoaXMuX2FsLDApLHdyaXRlSW50NjRCRSh0aGlzLl9iaCx0aGlzLl9ibCw4KSx3cml0ZUludDY0QkUodGhpcy5fY2gsdGhpcy5fY2wsMTYpLHdyaXRlSW50NjRCRSh0aGlzLl9kaCx0aGlzLl9kbCwyNCksd3JpdGVJbnQ2NEJFKHRoaXMuX2VoLHRoaXMuX2VsLDMyKSx3cml0ZUludDY0QkUodGhpcy5fZmgsdGhpcy5fZmwsNDApLHdyaXRlSW50NjRCRSh0aGlzLl9naCx0aGlzLl9nbCw0OCksd3JpdGVJbnQ2NEJFKHRoaXMuX2hoLHRoaXMuX2hsLDU2KSx0fSx0LmV4cG9ydHM9U2hhNTEyfSw1Mzc3KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cigyODYxKS5CdWZmZXIsbz1yKDQ2MzQpLGk9cig0MzcyKSxhPUFycmF5QnVmZmVyLmlzVmlld3x8ZnVuY3Rpb24gaXNWaWV3KHQpe3RyeXtyZXR1cm4gaSh0KSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19LHM9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5LHU9InVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5LGM9dSYmKG4ucHJvdG90eXBlIGluc3RhbmNlb2YgVWludDhBcnJheXx8bi5UWVBFRF9BUlJBWV9TVVBQT1JUKTt0LmV4cG9ydHM9ZnVuY3Rpb24gdG9CdWZmZXIodCxlKXtpZih0IGluc3RhbmNlb2YgbilyZXR1cm4gdDtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIG4uZnJvbSh0LGUpO2lmKHUmJmEodCkpe2lmKDA9PT10LmJ5dGVMZW5ndGgpcmV0dXJuIG4uYWxsb2MoMCk7aWYoYyl7dmFyIHI9bi5mcm9tKHQuYnVmZmVyLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpO2lmKHIuYnl0ZUxlbmd0aD09PXQuYnl0ZUxlbmd0aClyZXR1cm4gcn12YXIgaT10IGluc3RhbmNlb2YgVWludDhBcnJheT90Om5ldyBVaW50OEFycmF5KHQuYnVmZmVyLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpLGY9bi5mcm9tKGkpO2lmKGYubGVuZ3RoPT09dC5ieXRlTGVuZ3RoKXJldHVybiBmfWlmKHMmJnQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBuLmZyb20odCk7dmFyIGw9byh0KTtpZihsKWZvcih2YXIgcD0wO3A8dC5sZW5ndGg7cCs9MSl7dmFyIGg9dFtwXTtpZigibnVtYmVyIiE9dHlwZW9mIGh8fGg8MHx8aD4yNTV8fH5+aCE9PWgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFycmF5IGl0ZW1zIG11c3QgYmUgbnVtYmVycyBpbiB0aGUgcmFuZ2UgMC0yNTUuIil9aWYobHx8bi5pc0J1ZmZlcih0KSYmdC5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIHQuY29uc3RydWN0b3IuaXNCdWZmZXImJnQuY29uc3RydWN0b3IuaXNCdWZmZXIodCkpcmV0dXJuIG4uZnJvbSh0KTt0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImRhdGEiIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIGFuIEFycmF5LCBhIEJ1ZmZlciwgYSBVaW50OEFycmF5LCBvciBhIERhdGFWaWV3LicpfX0sNDM3Mih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoOTY3NSksbz1yKDY1NTYpKCJUeXBlZEFycmF5LnByb3RvdHlwZS5idWZmZXIiLCEwKSxpPXIoNTY4MCk7dC5leHBvcnRzPW98fGZ1bmN0aW9uIHR5cGVkQXJyYXlCdWZmZXIodCl7aWYoIWkodCkpdGhyb3cgbmV3IG4oIk5vdCBhIFR5cGVkIEFycmF5Iik7cmV0dXJuIHQuYnVmZmVyfX0sNTc2Nyh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMjY4Miksbz1yKDkyMDkpLGk9cig0ODcpLGE9cig2NTU2KSxzPXIoNTc5NSksdT1hKCJPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIiksYz1yKDkwOTIpKCksZj0idW5kZWZpbmVkIj09dHlwZW9mIGdsb2JhbFRoaXM/ci5nOmdsb2JhbFRoaXMsbD1vKCkscD1hKCJTdHJpbmcucHJvdG90eXBlLnNsaWNlIiksaD1PYmplY3QuZ2V0UHJvdG90eXBlT2YsZD1hKCJBcnJheS5wcm90b3R5cGUuaW5kZXhPZiIsITApfHxmdW5jdGlvbiBpbmRleE9mKHQsZSl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKz0xKWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfSx5PXtfX3Byb3RvX186bnVsbH07bihsLGMmJnMmJmg/ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGZbdF07aWYoU3ltYm9sLnRvU3RyaW5nVGFnIGluIGUpe3ZhciByPWgoZSksbj1zKHIsU3ltYm9sLnRvU3RyaW5nVGFnKTtpZighbil7dmFyIG89aChyKTtuPXMobyxTeW1ib2wudG9TdHJpbmdUYWcpfXlbIiQiK3RdPWkobi5nZXQpfX06ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGZbdF0scj1lLnNsaWNlfHxlLnNldDtyJiYoeVsiJCIrdF09aShyKSl9KTt0LmV4cG9ydHM9ZnVuY3Rpb24gd2hpY2hUeXBlZEFycmF5KHQpe2lmKCF0fHwib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJuITE7aWYoIWMpe3ZhciBlPXAodSh0KSw4LC0xKTtyZXR1cm4gZChsLGUpPi0xP2U6Ik9iamVjdCI9PT1lJiZmdW5jdGlvbiB0cnlBbGxTbGljZXModCl7dmFyIGU9ITE7cmV0dXJuIG4oeSwoZnVuY3Rpb24ocixuKXtpZighZSl0cnl7cih0KSxlPXAobiwxKX1jYXRjaCh0KXt9fSkpLGV9KHQpfXJldHVybiBzP2Z1bmN0aW9uIHRyeUFsbFR5cGVkQXJyYXlzKHQpe3ZhciBlPSExO3JldHVybiBuKHksKGZ1bmN0aW9uKHIsbil7aWYoIWUpdHJ5eyIkIityKHQpPT09biYmKGU9cChuLDEpKX1jYXRjaCh0KXt9fSkpLGV9KHQpOm51bGx9fSw3NjY2KHQsZSxyKXt2YXIgbj1yKDQ4NTEpLG89cig5NTMpO2Z1bmN0aW9uIF9leHRlbmRzKCl7dmFyIGU7cmV0dXJuIHQuZXhwb3J0cz1fZXh0ZW5kcz1uP28oZT1uKS5jYWxsKGUpOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciByPWFyZ3VtZW50c1tlXTtmb3IodmFyIG4gaW4gcikoe30pLmhhc093blByb3BlcnR5LmNhbGwocixuKSYmKHRbbl09cltuXSl9cmV0dXJuIHR9LHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwLHQuZXhwb3J0cy5kZWZhdWx0PXQuZXhwb3J0cyxfZXh0ZW5kcy5hcHBseShudWxsLGFyZ3VtZW50cyl9dC5leHBvcnRzPV9leHRlbmRzLHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwLHQuZXhwb3J0cy5kZWZhdWx0PXQuZXhwb3J0c30sOTIwOSh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNjU3OCksbz0idW5kZWZpbmVkIj09dHlwZW9mIGdsb2JhbFRoaXM/ci5nOmdsb2JhbFRoaXM7dC5leHBvcnRzPWZ1bmN0aW9uIGF2YWlsYWJsZVR5cGVkQXJyYXlzKCl7Zm9yKHZhciB0PVtdLGU9MDtlPG4ubGVuZ3RoO2UrKykiZnVuY3Rpb24iPT10eXBlb2Ygb1tuW2VdXSYmKHRbdC5sZW5ndGhdPW5bZV0pO3JldHVybiB0fX0sMzcwMCh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoOTcwOSk7dC5leHBvcnRzPW59LDQ2Mih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoOTc1KTt0LmV4cG9ydHM9bn0sMjU2Nyh0LGUscil7InVzZSBzdHJpY3QiO3IoOTMwNyk7dmFyIG49cigxNzQ3KTt0LmV4cG9ydHM9bigiRnVuY3Rpb24iLCJiaW5kIil9LDMwMzQodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDgyODApLG89cigyNTY3KSxpPUZ1bmN0aW9uLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5iaW5kO3JldHVybiB0PT09aXx8bihpLHQpJiZlPT09aS5iaW5kP286ZX19LDk3NDgodCxlLHIpeyJ1c2Ugc3RyaWN0IjtyKDEzNDApO3ZhciBuPXIoMjA0Nik7dC5leHBvcnRzPW4uT2JqZWN0LmFzc2lnbn0sOTUzKHQsZSxyKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPXIoMzM3NSl9LDQ4NTEodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9cig1NDAxKX0sMzM3NSh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMzcwMCk7dC5leHBvcnRzPW59LDU0MDEodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDQ2Mik7dC5leHBvcnRzPW59LDIxNTkodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDIyNTApLG89cig0NjQwKSxpPVR5cGVFcnJvcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobih0KSlyZXR1cm4gdDt0aHJvdyBuZXcgaShvKHQpKyIgaXMgbm90IGEgZnVuY3Rpb24iKX19LDY2MjQodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDYyODUpLG89U3RyaW5nLGk9VHlwZUVycm9yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihuKHQpKXJldHVybiB0O3Rocm93IG5ldyBpKG8odCkrIiBpcyBub3QgYW4gb2JqZWN0Iil9fSw0NDM2KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig3Mzc0KSxvPXIoNDg0OSksaT1yKDU3NSksY3JlYXRlTWV0aG9kPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsYSl7dmFyIHM9bihlKSx1PWkocyk7aWYoMD09PXUpcmV0dXJuIXQmJi0xO3ZhciBjLGY9byhhLHUpO2lmKHQmJnIhPXIpe2Zvcig7dT5mOylpZigoYz1zW2YrK10pIT1jKXJldHVybiEwfWVsc2UgZm9yKDt1PmY7ZisrKWlmKCh0fHxmIGluIHMpJiZzW2ZdPT09cilyZXR1cm4gdHx8Znx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmNyZWF0ZU1ldGhvZCghMCksaW5kZXhPZjpjcmVhdGVNZXRob2QoITEpfX0sMzQyNyh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMTkwNyk7dC5leHBvcnRzPW4oW10uc2xpY2UpfSw1ODA3KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cigxOTA3KSxvPW4oe30udG9TdHJpbmcpLGk9bigiIi5zbGljZSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpKG8odCksOCwtMSl9fSwxNjI2KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig5NDQ3KSxvPXIoNDI4NCksaT1yKDU4MTcpO3QuZXhwb3J0cz1uP2Z1bmN0aW9uKHQsZSxyKXtyZXR1cm4gby5mKHQsZSxpKDEscikpfTpmdW5jdGlvbih0LGUscil7cmV0dXJuIHRbZV09cix0fX0sNTgxNyh0KXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOmV9fX0sMjUzMih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNTk1MSksbz1PYmplY3QuZGVmaW5lUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dHJ5e28obix0LHt2YWx1ZTplLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pfWNhdGNoKHIpe25bdF09ZX1yZXR1cm4gZX19LDk0NDcodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDg4MjgpO3QuZXhwb3J0cz0hbigoZnVuY3Rpb24oKXtyZXR1cm4gNyE9PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwxLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KVsxXX0pKX0sOTU1Mih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNTk1MSksbz1yKDYyODUpLGk9bi5kb2N1bWVudCxhPW8oaSkmJm8oaS5jcmVhdGVFbGVtZW50KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGE/aS5jcmVhdGVFbGVtZW50KHQpOnt9fX0sMzc2KHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9WyJjb25zdHJ1Y3RvciIsImhhc093blByb3BlcnR5IiwiaXNQcm90b3R5cGVPZiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwidG9Mb2NhbGVTdHJpbmciLCJ0b1N0cmluZyIsInZhbHVlT2YiXX0sNjc5NCh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNTk1MSkubmF2aWdhdG9yLG89biYmbi51c2VyQWdlbnQ7dC5leHBvcnRzPW8/U3RyaW5nKG8pOiIifSw3OTgodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbixvLGk9cig1OTUxKSxhPXIoNjc5NCkscz1pLnByb2Nlc3MsdT1pLkRlbm8sYz1zJiZzLnZlcnNpb25zfHx1JiZ1LnZlcnNpb24sZj1jJiZjLnY4O2YmJihvPShuPWYuc3BsaXQoIi4iKSlbMF0+MCYmblswXTw0PzE6KyhuWzBdK25bMV0pKSwhbyYmYSYmKCEobj1hLm1hdGNoKC9FZGdlXC8oXGQrKS8pKXx8blsxXT49NzQpJiYobj1hLm1hdGNoKC9DaHJvbWVcLyhcZCspLykpJiYobz0rblsxXSksdC5leHBvcnRzPW99LDEwOTEodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDU5NTEpLG89cig2MDI0KSxpPXIoMjM2MSksYT1yKDIyNTApLHM9cigzODQ2KS5mLHU9cig3NDYzKSxjPXIoMjA0NiksZj1yKDgzMTEpLGw9cigxNjI2KSxwPXIoOTcyNCk7cig2MTI4KTt2YXIgd3JhcENvbnN0cnVjdG9yPWZ1bmN0aW9uKHQpe3ZhciBXcmFwcGVyPWZ1bmN0aW9uKGUscixuKXtpZih0aGlzIGluc3RhbmNlb2YgV3JhcHBlcil7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUscil9cmV0dXJuIG5ldyB0KGUscixuKX1yZXR1cm4gbyh0LHRoaXMsYXJndW1lbnRzKX07cmV0dXJuIFdyYXBwZXIucHJvdG90eXBlPXQucHJvdG90eXBlLFdyYXBwZXJ9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciByLG8saCxkLHksXyxnLG0sdixiPXQudGFyZ2V0LHc9dC5nbG9iYWwsST10LnN0YXQseD10LnByb3RvLEI9dz9uOkk/bltiXTpuW2JdJiZuW2JdLnByb3RvdHlwZSxrPXc/YzpjW2JdfHxsKGMsYix7fSlbYl0sQz1rLnByb3RvdHlwZTtmb3IoZCBpbiBlKW89IShyPXUodz9kOmIrKEk/Ii4iOiIjIikrZCx0LmZvcmNlZCkpJiZCJiZwKEIsZCksXz1rW2RdLG8mJihnPXQuZG9udENhbGxHZXRTZXQ/KHY9cyhCLGQpKSYmdi52YWx1ZTpCW2RdKSx5PW8mJmc/ZzplW2RdLChyfHx4fHx0eXBlb2YgXyE9dHlwZW9mIHkpJiYobT10LmJpbmQmJm8/Zih5LG4pOnQud3JhcCYmbz93cmFwQ29uc3RydWN0b3IoeSk6eCYmYSh5KT9pKHkpOnksKHQuc2hhbXx8eSYmeS5zaGFtfHxfJiZfLnNoYW0pJiZsKG0sInNoYW0iLCEwKSxsKGssZCxtKSx4JiYocChjLGg9YisiUHJvdG90eXBlIil8fGwoYyxoLHt9KSxsKGNbaF0sZCx5KSx0LnJlYWwmJkMmJihyfHwhQ1tkXSkmJmwoQyxkLHkpKSl9fSw4ODI4KHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKHQpe3JldHVybiEwfX19LDYwMjQodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDE1MDUpLG89RnVuY3Rpb24ucHJvdG90eXBlLGk9by5hcHBseSxhPW8uY2FsbDt0LmV4cG9ydHM9Im9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LmFwcGx5fHwobj9hLmJpbmQoaSk6ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShpLGFyZ3VtZW50cyl9KX0sODMxMSh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMjM2MSksbz1yKDIxNTkpLGk9cigxNTA1KSxhPW4obi5iaW5kKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbyh0KSx2b2lkIDA9PT1lP3Q6aT9hKHQsZSk6ZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fX0sMTUwNSh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoODgyOCk7dC5leHBvcnRzPSFuKChmdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKCl7fS5iaW5kKCk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHR8fHQuaGFzT3duUHJvcGVydHkoInByb3RvdHlwZSIpfSkpfSw0NjczKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cigxOTA3KSxvPXIoMjE1OSksaT1yKDYyODUpLGE9cig5NzI0KSxzPXIoMzQyNyksdT1yKDE1MDUpLGM9RnVuY3Rpb24sZj1uKFtdLmNvbmNhdCksbD1uKFtdLmpvaW4pLHA9e307dC5leHBvcnRzPXU/Yy5iaW5kOmZ1bmN0aW9uIGJpbmQodCl7dmFyIGU9byh0aGlzKSxyPWUucHJvdG90eXBlLG49cyhhcmd1bWVudHMsMSksdT1mdW5jdGlvbiBib3VuZCgpe3ZhciByPWYobixzKGFyZ3VtZW50cykpO3JldHVybiB0aGlzIGluc3RhbmNlb2YgdT9mdW5jdGlvbih0LGUscil7aWYoIWEocCxlKSl7Zm9yKHZhciBuPVtdLG89MDtvPGU7bysrKW5bb109ImFbIitvKyJdIjtwW2VdPWMoIkMsYSIsInJldHVybiBuZXcgQygiK2wobiwiLCIpKyIpIil9cmV0dXJuIHBbZV0odCxyKX0oZSxyLmxlbmd0aCxyKTplLmFwcGx5KHQscil9O3JldHVybiBpKHIpJiYodS5wcm90b3R5cGU9ciksdX19LDM5MzAodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDE1MDUpLG89RnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7dC5leHBvcnRzPW4/by5iaW5kKG8pOmZ1bmN0aW9uKCl7cmV0dXJuIG8uYXBwbHkobyxhcmd1bWVudHMpfX0sMjM2MSh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNTgwNyksbz1yKDE5MDcpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZigiRnVuY3Rpb24iPT09bih0KSlyZXR1cm4gbyh0KX19LDE5MDcodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDE1MDUpLG89RnVuY3Rpb24ucHJvdG90eXBlLGk9by5jYWxsLGE9biYmby5iaW5kLmJpbmQoaSxpKTt0LmV4cG9ydHM9bj9hOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpLmFwcGx5KHQsYXJndW1lbnRzKX19fSwxNzQ3KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig1OTUxKSxvPXIoMjA0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9b1t0KyJQcm90b3R5cGUiXSxpPXImJnJbZV07aWYoaSlyZXR1cm4gaTt2YXIgYT1uW3RdLHM9YSYmYS5wcm90b3R5cGU7cmV0dXJuIHMmJnNbZV19fSw1NTgyKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cigyMDQ2KSxvPXIoNTk1MSksaT1yKDIyNTApLGFGdW5jdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gaSh0KT90OnZvaWQgMH07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9hRnVuY3Rpb24oblt0XSl8fGFGdW5jdGlvbihvW3RdKTpuW3RdJiZuW3RdW2VdfHxvW3RdJiZvW3RdW2VdfX0sOTM2Nyh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMjE1OSksbz1yKDcxMzYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciByPXRbZV07cmV0dXJuIG8ocik/dm9pZCAwOm4ocil9fSw1OTUxKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIGNoZWNrPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lk1hdGg9PT1NYXRoJiZ0fTt0LmV4cG9ydHM9Y2hlY2soIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzKXx8Y2hlY2soIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyl8fGNoZWNrKCJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZil8fGNoZWNrKCJvYmplY3QiPT10eXBlb2Ygci5nJiZyLmcpfHxjaGVjaygib2JqZWN0Ij09dHlwZW9mIHRoaXMmJnRoaXMpfHxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfSw5NzI0KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cigxOTA3KSxvPXIoOTI5OCksaT1uKHt9Lmhhc093blByb3BlcnR5KTt0LmV4cG9ydHM9T2JqZWN0Lmhhc093bnx8ZnVuY3Rpb24gaGFzT3duKHQsZSl7cmV0dXJuIGkobyh0KSxlKX19LDg1MzAodCl7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz17fX0sMzY0OCh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoOTQ0Nyksbz1yKDg4MjgpLGk9cig5NTUyKTt0LmV4cG9ydHM9IW4mJiFvKChmdW5jdGlvbigpe3JldHVybiA3IT09T2JqZWN0LmRlZmluZVByb3BlcnR5KGkoImRpdiIpLCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pKX0sNjk0Nih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMTkwNyksbz1yKDg4MjgpLGk9cig1ODA3KSxhPU9iamVjdCxzPW4oIiIuc3BsaXQpO3QuZXhwb3J0cz1vKChmdW5jdGlvbigpe3JldHVybiFhKCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KSk/ZnVuY3Rpb24odCl7cmV0dXJuIlN0cmluZyI9PT1pKHQpP3ModCwiIik6YSh0KX06YX0sMjI1MCh0KXsidXNlIHN0cmljdCI7dmFyIGU9Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuYWxsO3QuZXhwb3J0cz12b2lkIDA9PT1lJiZ2b2lkIDAhPT1lP2Z1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fHx0PT09ZX06ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9fSw3NDYzKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig4ODI4KSxvPXIoMjI1MCksaT0vI3xcLnByb3RvdHlwZVwuLyxpc0ZvcmNlZD1mdW5jdGlvbih0LGUpe3ZhciByPXNbYSh0KV07cmV0dXJuIHI9PT1jfHxyIT09dSYmKG8oZSk/bihlKTohIWUpfSxhPWlzRm9yY2VkLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UoaSwiLiIpLnRvTG93ZXJDYXNlKCl9LHM9aXNGb3JjZWQuZGF0YT17fSx1PWlzRm9yY2VkLk5BVElWRT0iTiIsYz1pc0ZvcmNlZC5QT0xZRklMTD0iUCI7dC5leHBvcnRzPWlzRm9yY2VkfSw3MTM2KHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR9fSw2Mjg1KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cigyMjUwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P251bGwhPT10Om4odCl9fSw3Mzc2KHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ITB9LDU1OTQodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDU1ODIpLG89cigyMjUwKSxpPXIoODI4MCksYT1yKDM1NTYpLHM9T2JqZWN0O3QuZXhwb3J0cz1hP2Z1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdH06ZnVuY3Rpb24odCl7dmFyIGU9bigiU3ltYm9sIik7cmV0dXJuIG8oZSkmJmkoZS5wcm90b3R5cGUscyh0KSl9fSw1NzUodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDMxMjEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbih0Lmxlbmd0aCl9fSwxMTc2KHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1NYXRoLmNlaWwscj1NYXRoLmZsb29yO3QuZXhwb3J0cz1NYXRoLnRydW5jfHxmdW5jdGlvbiB0cnVuYyh0KXt2YXIgbj0rdDtyZXR1cm4obj4wP3I6ZSkobil9fSw3MTU3KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig5NDQ3KSxvPXIoMTkwNyksaT1yKDM5MzApLGE9cig4ODI4KSxzPXIoMjg3NSksdT1yKDcxNzApLGM9cigyNTc0KSxmPXIoOTI5OCksbD1yKDY5NDYpLHA9T2JqZWN0LmFzc2lnbixoPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxkPW8oW10uY29uY2F0KTt0LmV4cG9ydHM9IXB8fGEoKGZ1bmN0aW9uKCl7aWYobiYmMSE9PXAoe2I6MX0scChoKHt9LCJhIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtoKHRoaXMsImIiLHt2YWx1ZTozLGVudW1lcmFibGU6ITF9KX19KSx7YjoyfSkpLmIpcmV0dXJuITA7dmFyIHQ9e30sZT17fSxyPVN5bWJvbCgiYXNzaWduIGRldGVjdGlvbiIpLG89ImFiY2RlZmdoaWprbG1ub3BxcnN0IjtyZXR1cm4gdFtyXT03LG8uc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbdF09dH0pKSw3IT09cCh7fSx0KVtyXXx8cyhwKHt9LGUpKS5qb2luKCIiKSE9PW99KSk/ZnVuY3Rpb24gYXNzaWduKHQsZSl7Zm9yKHZhciByPWYodCksbz1hcmd1bWVudHMubGVuZ3RoLGE9MSxwPXUuZixoPWMuZjtvPmE7KWZvcih2YXIgeSxfPWwoYXJndW1lbnRzW2ErK10pLGc9cD9kKHMoXykscChfKSk6cyhfKSxtPWcubGVuZ3RoLHY9MDttPnY7KXk9Z1t2KytdLG4mJiFpKGgsXyx5KXx8KHJbeV09X1t5XSk7cmV0dXJuIHJ9OnB9LDQyODQodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDk0NDcpLG89cigzNjQ4KSxpPXIoODY2MSksYT1yKDY2MjQpLHM9cig0NzApLHU9VHlwZUVycm9yLGM9T2JqZWN0LmRlZmluZVByb3BlcnR5LGY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixsPSJlbnVtZXJhYmxlIixwPSJjb25maWd1cmFibGUiLGg9IndyaXRhYmxlIjtlLmY9bj9pP2Z1bmN0aW9uIGRlZmluZVByb3BlcnR5KHQsZSxyKXtpZihhKHQpLGU9cyhlKSxhKHIpLCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYicHJvdG90eXBlIj09PWUmJiJ2YWx1ZSJpbiByJiZoIGluIHImJiFyW2hdKXt2YXIgbj1mKHQsZSk7biYmbltoXSYmKHRbZV09ci52YWx1ZSxyPXtjb25maWd1cmFibGU6cCBpbiByP3JbcF06bltwXSxlbnVtZXJhYmxlOmwgaW4gcj9yW2xdOm5bbF0sd3JpdGFibGU6ITF9KX1yZXR1cm4gYyh0LGUscil9OmM6ZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodCxlLHIpe2lmKGEodCksZT1zKGUpLGEociksbyl0cnl7cmV0dXJuIGModCxlLHIpfWNhdGNoKHQpe31pZigiZ2V0ImluIHJ8fCJzZXQiaW4gcil0aHJvdyBuZXcgdSgiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4idmFsdWUiaW4gciYmKHRbZV09ci52YWx1ZSksdH19LDM4NDYodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDk0NDcpLG89cigzOTMwKSxpPXIoMjU3NCksYT1yKDU4MTcpLHM9cig3Mzc0KSx1PXIoNDcwKSxjPXIoOTcyNCksZj1yKDM2NDgpLGw9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtlLmY9bj9sOmZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpe2lmKHQ9cyh0KSxlPXUoZSksZil0cnl7cmV0dXJuIGwodCxlKX1jYXRjaCh0KXt9aWYoYyh0LGUpKXJldHVybiBhKCFvKGkuZix0LGUpLHRbZV0pfX0sNzE3MCh0LGUpeyJ1c2Ugc3RyaWN0IjtlLmY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc30sODI4MCh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMTkwNyk7dC5leHBvcnRzPW4oe30uaXNQcm90b3R5cGVPZil9LDMwNDUodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDE5MDcpLG89cig5NzI0KSxpPXIoNzM3NCksYT1yKDQ0MzYpLmluZGV4T2Yscz1yKDg1MzApLHU9bihbXS5wdXNoKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgcixuPWkodCksYz0wLGY9W107Zm9yKHIgaW4gbikhbyhzLHIpJiZvKG4scikmJnUoZixyKTtmb3IoO2UubGVuZ3RoPmM7KW8obixyPWVbYysrXSkmJih+YShmLHIpfHx1KGYscikpO3JldHVybiBmfX0sMjg3NSh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMzA0NSksbz1yKDM3Nik7dC5leHBvcnRzPU9iamVjdC5rZXlzfHxmdW5jdGlvbiBrZXlzKHQpe3JldHVybiBuKHQsbyl9fSwyNTc0KHQsZSl7InVzZSBzdHJpY3QiO3ZhciByPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixvPW4mJiFyLmNhbGwoezE6Mn0sMSk7ZS5mPW8/ZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUodCl7dmFyIGU9bih0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpyfSw1ODEodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDM5MzApLG89cigyMjUwKSxpPXIoNjI4NSksYT1UeXBlRXJyb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIHIscztpZigic3RyaW5nIj09PWUmJm8ocj10LnRvU3RyaW5nKSYmIWkocz1uKHIsdCkpKXJldHVybiBzO2lmKG8ocj10LnZhbHVlT2YpJiYhaShzPW4ocix0KSkpcmV0dXJuIHM7aWYoInN0cmluZyIhPT1lJiZvKHI9dC50b1N0cmluZykmJiFpKHM9bihyLHQpKSlyZXR1cm4gczt0aHJvdyBuZXcgYSgiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSwyMDQ2KHQpeyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9e319LDQyMzkodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDcxMzYpLG89VHlwZUVycm9yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihuKHQpKXRocm93IG5ldyBvKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK3QpO3JldHVybiB0fX0sNjEyOCh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNzM3Niksbz1yKDU5NTEpLGk9cigyNTMyKSxhPSJfX2NvcmUtanNfc2hhcmVkX18iLHM9dC5leHBvcnRzPW9bYV18fGkoYSx7fSk7KHMudmVyc2lvbnN8fChzLnZlcnNpb25zPVtdKSkucHVzaCh7dmVyc2lvbjoiMy40MC4wIixtb2RlOm4/InB1cmUiOiJnbG9iYWwiLGNvcHlyaWdodDoiwqkgMjAxNC0yMDI1IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIixsaWNlbnNlOiJodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9ibG9iL3YzLjQwLjAvTElDRU5TRSIsc291cmNlOiJodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcyJ9KX0sNTgxNih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNjEyOCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF18fChuW3RdPWV8fHt9KX19LDk4NDYodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDc5OCksbz1yKDg4MjgpLGk9cig1OTUxKS5TdHJpbmc7dC5leHBvcnRzPSEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmIW8oKGZ1bmN0aW9uKCl7dmFyIHQ9U3ltYm9sKCJzeW1ib2wgZGV0ZWN0aW9uIik7cmV0dXJuIWkodCl8fCEoT2JqZWN0KHQpaW5zdGFuY2VvZiBTeW1ib2wpfHwhU3ltYm9sLnNoYW0mJm4mJm48NDF9KSl9LDQ4NDkodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDU0ODIpLG89TWF0aC5tYXgsaT1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgcj1uKHQpO3JldHVybiByPDA/byhyK2UsMCk6aShyLGUpfX0sNzM3NCh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNjk0Niksbz1yKDQyMzkpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbihvKHQpKX19LDU0ODIodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDExNzYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0rdDtyZXR1cm4gZSE9ZXx8MD09PWU/MDpuKGUpfX0sMzEyMSh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNTQ4Miksbz1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9bih0KTtyZXR1cm4gZT4wP28oZSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sOTI5OCh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNDIzOSksbz1PYmplY3Q7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvKG4odCkpfX0sNjAyOCh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMzkzMCksbz1yKDYyODUpLGk9cig1NTk0KSxhPXIoOTM2Nykscz1yKDU4MSksdT1yKDYyNjQpLGM9VHlwZUVycm9yLGY9dSgidG9QcmltaXRpdmUiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighbyh0KXx8aSh0KSlyZXR1cm4gdDt2YXIgcix1PWEodCxmKTtpZih1KXtpZih2b2lkIDA9PT1lJiYoZT0iZGVmYXVsdCIpLHI9bih1LHQsZSksIW8ocil8fGkocikpcmV0dXJuIHI7dGhyb3cgbmV3IGMoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfXJldHVybiB2b2lkIDA9PT1lJiYoZT0ibnVtYmVyIikscyh0LGUpfX0sNDcwKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig2MDI4KSxvPXIoNTU5NCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW4odCwic3RyaW5nIik7cmV0dXJuIG8oZSk/ZTplKyIifX0sNDY0MCh0KXsidXNlIHN0cmljdCI7dmFyIGU9U3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIGUodCl9Y2F0Y2godCl7cmV0dXJuIk9iamVjdCJ9fX0sNjQ5OSh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoMTkwNyksbz0wLGk9TWF0aC5yYW5kb20oKSxhPW4oMS4udG9TdHJpbmcpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4iU3ltYm9sKCIrKHZvaWQgMD09PXQ/IiI6dCkrIilfIithKCsrbytpLDM2KX19LDM1NTYodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDk4NDYpO3QuZXhwb3J0cz1uJiYhU3ltYm9sLnNoYW0mJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yfSw4NjYxKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cig5NDQ3KSxvPXIoODgyOCk7dC5leHBvcnRzPW4mJm8oKGZ1bmN0aW9uKCl7cmV0dXJuIDQyIT09T2JqZWN0LmRlZmluZVByb3BlcnR5KChmdW5jdGlvbigpe30pLCJwcm90b3R5cGUiLHt2YWx1ZTo0Mix3cml0YWJsZTohMX0pLnByb3RvdHlwZX0pKX0sNjI2NCh0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXIoNTk1MSksbz1yKDU4MTYpLGk9cig5NzI0KSxhPXIoNjQ5OSkscz1yKDk4NDYpLHU9cigzNTU2KSxjPW4uU3ltYm9sLGY9bygid2tzIiksbD11P2MuZm9yfHxjOmMmJmMud2l0aG91dFNldHRlcnx8YTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkoZix0KXx8KGZbdF09cyYmaShjLHQpP2NbdF06bCgiU3ltYm9sLiIrdCkpLGZbdF19fSw5MzA3KHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49cigxMDkxKSxvPXIoNDY3Myk7bih7dGFyZ2V0OiJGdW5jdGlvbiIscHJvdG86ITAsZm9yY2VkOkZ1bmN0aW9uLmJpbmQhPT1vfSx7YmluZDpvfSl9LDEzNDAodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDEwOTEpLG89cig3MTU3KTtuKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxhcml0eToyLGZvcmNlZDpPYmplY3QuYXNzaWduIT09b30se2Fzc2lnbjpvfSl9LDk3MDkodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDMwMzQpO3QuZXhwb3J0cz1ufSw5NzUodCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1yKDk3NDgpO3QuZXhwb3J0cz1ufX0sZT17fTtmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKHIpe3ZhciBuPWVbcl07aWYodm9pZCAwIT09bilyZXR1cm4gbi5leHBvcnRzO3ZhciBvPWVbcl09e2lkOnIsbG9hZGVkOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLF9fd2VicGFja19yZXF1aXJlX18pLG8ubG9hZGVkPSEwLG8uZXhwb3J0c31fX3dlYnBhY2tfcmVxdWlyZV9fLm49dD0+e3ZhciBlPXQmJnQuX19lc01vZHVsZT8oKT0+dC5kZWZhdWx0OigpPT50O3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZSx7YTplfSksZX0sX193ZWJwYWNrX3JlcXVpcmVfXy5kPSh0LGUpPT57Zm9yKHZhciByIGluIGUpX193ZWJwYWNrX3JlcXVpcmVfXy5vKGUscikmJiFfX3dlYnBhY2tfcmVxdWlyZV9fLm8odCxyKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscix7ZW51bWVyYWJsZTohMCxnZXQ6ZVtyXX0pfSxfX3dlYnBhY2tfcmVxdWlyZV9fLmc9ZnVuY3Rpb24oKXtpZigib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMpcmV0dXJuIGdsb2JhbFRoaXM7dHJ5e3JldHVybiB0aGlzfHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaCh0KXtpZigib2JqZWN0Ij09dHlwZW9mIHdpbmRvdylyZXR1cm4gd2luZG93fX0oKSxfX3dlYnBhY2tfcmVxdWlyZV9fLm89KHQsZSk9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpLF9fd2VicGFja19yZXF1aXJlX18ucj10PT57InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sX193ZWJwYWNrX3JlcXVpcmVfXy5ubWQ9dD0+KHQucGF0aHM9W10sdC5jaGlsZHJlbnx8KHQuY2hpbGRyZW49W10pLHQpO3ZhciByPXt9O3JldHVybigoKT0+eyJ1c2Ugc3RyaWN0IjtfX3dlYnBhY2tfcmVxdWlyZV9fLmQocix7ZGVmYXVsdDooKT0+Y2V9KTt2YXIgdD17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIodCksX193ZWJwYWNrX3JlcXVpcmVfXy5kKHQse1RPR0dMRV9DT05GSUdTOigpPT5lZSxVUERBVEVfQ09ORklHUzooKT0+dGUsZG93bmxvYWRDb25maWc6KCk9PmRvd25sb2FkQ29uZmlnLGdldENvbmZpZ0J5VXJsOigpPT5nZXRDb25maWdCeVVybCxsb2FkZWQ6KCk9PmxvYWRlZCx0b2dnbGU6KCk9PnRvZ2dsZSx1cGRhdGU6KCk9PnVwZGF0ZX0pO3ZhciBlPXt9O19fd2VicGFja19yZXF1aXJlX18ucihlKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZSx7Z2V0OigpPT5nZXR9KTt2YXIgbj1fX3dlYnBhY2tfcmVxdWlyZV9fKDY1NDApO2NsYXNzIFN0YW5kYWxvbmVMYXlvdXQgZXh0ZW5kcyBuLkNvbXBvbmVudHtyZW5kZXIoKXtjb25zdHtnZXRDb21wb25lbnQ6dH09dGhpcy5wcm9wcyxlPXQoIkNvbnRhaW5lciIpLHI9dCgiUm93Iiksbz10KCJDb2wiKSxpPXQoIlRvcGJhciIsITApLGE9dCgiQmFzZUxheW91dCIsITApLHM9dCgib25saW5lVmFsaWRhdG9yQmFkZ2UiLCEwKTtyZXR1cm4gbi5jcmVhdGVFbGVtZW50KGUse2NsYXNzTmFtZToic3dhZ2dlci11aSJ9LGk/bi5jcmVhdGVFbGVtZW50KGksbnVsbCk6bnVsbCxuLmNyZWF0ZUVsZW1lbnQoYSxudWxsKSxuLmNyZWF0ZUVsZW1lbnQocixudWxsLG4uY3JlYXRlRWxlbWVudChvLG51bGwsbi5jcmVhdGVFbGVtZW50KHMsbnVsbCkpKSl9fWNvbnN0IG89U3RhbmRhbG9uZUxheW91dCxzdGFkYWxvbmVfbGF5b3V0PSgpPT4oe2NvbXBvbmVudHM6e1N0YW5kYWxvbmVMYXlvdXQ6b319KTt2YXIgaT1fX3dlYnBhY2tfcmVxdWlyZV9fKDk0MDQpLGE9X193ZWJwYWNrX3JlcXVpcmVfXy5uKGkpO19fd2VicGFja19yZXF1aXJlX18oNDA1OCksX193ZWJwYWNrX3JlcXVpcmVfXyg1ODA4KSxfX3dlYnBhY2tfcmVxdWlyZV9fKDEwNCksX193ZWJwYWNrX3JlcXVpcmVfXyg3MzA5KSxfX3dlYnBhY2tfcmVxdWlyZV9fKDI0MjYpLF9fd2VicGFja19yZXF1aXJlX18oNTI4OCksX193ZWJwYWNrX3JlcXVpcmVfXygxODgyKSxfX3dlYnBhY2tfcmVxdWlyZV9fKDIyMDUpLF9fd2VicGFja19yZXF1aXJlX18oMzIwOSksX193ZWJwYWNrX3JlcXVpcmVfXygyODAyKTtjb25zdCBzPWZ1bmN0aW9uIG1ha2VXaW5kb3coKXt2YXIgdD17bG9jYXRpb246e30saGlzdG9yeTp7fSxvcGVuOigpPT57fSxjbG9zZTooKT0+e30sRmlsZTpmdW5jdGlvbigpe30sRm9ybURhdGE6ZnVuY3Rpb24oKXt9fTtpZigidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdylyZXR1cm4gdDt0cnl7dD13aW5kb3c7Zm9yKHZhciBlIG9mWyJGaWxlIiwiQmxvYiIsIkZvcm1EYXRhIl0pZSBpbiB3aW5kb3cmJih0W2VdPXdpbmRvd1tlXSl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcih0KX1yZXR1cm4gdH0oKTthKCkuU2V0Lm9mKCJ0eXBlIiwiZm9ybWF0IiwiaXRlbXMiLCJkZWZhdWx0IiwibWF4aW11bSIsImV4Y2x1c2l2ZU1heGltdW0iLCJtaW5pbXVtIiwiZXhjbHVzaXZlTWluaW11bSIsIm1heExlbmd0aCIsIm1pbkxlbmd0aCIsInBhdHRlcm4iLCJtYXhJdGVtcyIsIm1pbkl0ZW1zIiwidW5pcXVlSXRlbXMiLCJlbnVtIiwibXVsdGlwbGVPZiIpO19fd2VicGFja19yZXF1aXJlX18oODI4NykuQnVmZmVyO2NvbnN0IHBhcnNlU2VhcmNoPSgpPT57Y29uc3QgdD1uZXcgVVJMU2VhcmNoUGFyYW1zKHMubG9jYXRpb24uc2VhcmNoKTtyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHQpfTtjbGFzcyBUb3BCYXIgZXh0ZW5kcyBuLkNvbXBvbmVudHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5zdGF0ZT17dXJsOnQuc3BlY1NlbGVjdG9ycy51cmwoKSxzZWxlY3RlZEluZGV4OjB9fVVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHQpe3RoaXMuc2V0U3RhdGUoe3VybDp0LnNwZWNTZWxlY3RvcnMudXJsKCl9KX1vblVybENoYW5nZT10PT57bGV0e3RhcmdldDp7dmFsdWU6ZX19PXQ7dGhpcy5zZXRTdGF0ZSh7dXJsOmV9KX07Zmx1c2hBdXRoRGF0YSgpe2NvbnN0e3BlcnNpc3RBdXRob3JpemF0aW9uOnR9PXRoaXMucHJvcHMuZ2V0Q29uZmlncygpO3R8fHRoaXMucHJvcHMuYXV0aEFjdGlvbnMucmVzdG9yZUF1dGhvcml6YXRpb24oe2F1dGhvcml6ZWQ6e319KX1sb2FkU3BlYz10PT57dGhpcy5mbHVzaEF1dGhEYXRhKCksdGhpcy5wcm9wcy5zcGVjQWN0aW9ucy51cGRhdGVVcmwodCksdGhpcy5wcm9wcy5zcGVjQWN0aW9ucy5kb3dubG9hZCh0KX07b25VcmxTZWxlY3Q9dD0+e2xldCBlPXQudGFyZ2V0LnZhbHVlfHx0LnRhcmdldC5ocmVmO3RoaXMubG9hZFNwZWMoZSksdGhpcy5zZXRTZWxlY3RlZFVybChlKSx0LnByZXZlbnREZWZhdWx0KCl9O2Rvd25sb2FkVXJsPXQ9Pnt0aGlzLmxvYWRTcGVjKHRoaXMuc3RhdGUudXJsKSx0LnByZXZlbnREZWZhdWx0KCl9O3NldFNlYXJjaD10PT57bGV0IGU9cGFyc2VTZWFyY2goKTtlWyJ1cmxzLnByaW1hcnlOYW1lIl09dC5uYW1lO2NvbnN0IHI9YCR7d2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0ke3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX1gO3dpbmRvdyYmd2luZG93Lmhpc3RvcnkmJndpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSYmd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIiIsYCR7cn0/JHsodD0+e2NvbnN0IGU9bmV3IFVSTFNlYXJjaFBhcmFtcyhPYmplY3QuZW50cmllcyh0KSk7cmV0dXJuIFN0cmluZyhlKX0pKGUpfWApfTtzZXRTZWxlY3RlZFVybD10PT57Y29uc3QgZT10aGlzLnByb3BzLmdldENvbmZpZ3MoKS51cmxzfHxbXTtlJiZlLmxlbmd0aCYmdCYmZS5mb3JFYWNoKCgoZSxyKT0+e2UudXJsPT09dCYmKHRoaXMuc2V0U3RhdGUoe3NlbGVjdGVkSW5kZXg6cn0pLHRoaXMuc2V0U2VhcmNoKGUpKX0pKX07Y29tcG9uZW50RGlkTW91bnQoKXtjb25zdCB0PXRoaXMucHJvcHMuZ2V0Q29uZmlncygpLGU9dC51cmxzfHxbXTtpZihlJiZlLmxlbmd0aCl7dmFyIHI9dGhpcy5zdGF0ZS5zZWxlY3RlZEluZGV4O2xldCBuPXBhcnNlU2VhcmNoKClbInVybHMucHJpbWFyeU5hbWUiXXx8dC51cmxzLnByaW1hcnlOYW1lO24mJmUuZm9yRWFjaCgoKHQsZSk9Pnt0Lm5hbWU9PT1uJiYodGhpcy5zZXRTdGF0ZSh7c2VsZWN0ZWRJbmRleDplfSkscj1lKX0pKSx0aGlzLmxvYWRTcGVjKGVbcl0udXJsKX19b25GaWx0ZXJDaGFuZ2U9dD0+e2xldHt0YXJnZXQ6e3ZhbHVlOmV9fT10O3RoaXMucHJvcHMubGF5b3V0QWN0aW9ucy51cGRhdGVGaWx0ZXIoZSl9O3JlbmRlcigpe2xldHtnZXRDb21wb25lbnQ6dCxzcGVjU2VsZWN0b3JzOmUsZ2V0Q29uZmlnczpyfT10aGlzLnByb3BzO2NvbnN0IG89dCgiQnV0dG9uIiksaT10KCJMaW5rIiksYT10KCJMb2dvIikscz10KCJEYXJrTW9kZVRvZ2dsZSIpO2xldCB1PSJsb2FkaW5nIj09PWUubG9hZGluZ1N0YXR1cygpO2NvbnN0IGM9WyJkb3dubG9hZC11cmwtaW5wdXQiXTsiZmFpbGVkIj09PWUubG9hZGluZ1N0YXR1cygpJiZjLnB1c2goImZhaWxlZCIpLHUmJmMucHVzaCgibG9hZGluZyIpO2NvbnN0e3VybHM6Zn09cigpO2xldCBsPVtdLHA9bnVsbDtpZihmKXtsZXQgdD1bXTtmLmZvckVhY2goKChlLHIpPT57dC5wdXNoKG4uY3JlYXRlRWxlbWVudCgib3B0aW9uIix7a2V5OnIsdmFsdWU6ZS51cmx9LGUubmFtZSkpfSkpLGwucHVzaChuLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7Y2xhc3NOYW1lOiJzZWxlY3QtbGFiZWwiLGh0bWxGb3I6InNlbGVjdCJ9LG4uY3JlYXRlRWxlbWVudCgic3BhbiIsbnVsbCwiU2VsZWN0IGEgZGVmaW5pdGlvbiIpLG4uY3JlYXRlRWxlbWVudCgic2VsZWN0Iix7aWQ6InNlbGVjdCIsZGlzYWJsZWQ6dSxvbkNoYW5nZTp0aGlzLm9uVXJsU2VsZWN0LHZhbHVlOmZbdGhpcy5zdGF0ZS5zZWxlY3RlZEluZGV4XS51cmx9LHQpKSl9ZWxzZSBwPXRoaXMuZG93bmxvYWRVcmwsbC5wdXNoKG4uY3JlYXRlRWxlbWVudCgiaW5wdXQiLHtjbGFzc05hbWU6Yy5qb2luKCIgIiksdHlwZToidGV4dCIsb25DaGFuZ2U6dGhpcy5vblVybENoYW5nZSx2YWx1ZTp0aGlzLnN0YXRlLnVybCxkaXNhYmxlZDp1LGlkOiJkb3dubG9hZC11cmwtaW5wdXQifSkpLGwucHVzaChuLmNyZWF0ZUVsZW1lbnQobyx7Y2xhc3NOYW1lOiJkb3dubG9hZC11cmwtYnV0dG9uIixvbkNsaWNrOnRoaXMuZG93bmxvYWRVcmx9LCJFeHBsb3JlIikpO3JldHVybiBuLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToidG9wYmFyIn0sbi5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6IndyYXBwZXIifSxuLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToidG9wYmFyLXdyYXBwZXIifSxuLmNyZWF0ZUVsZW1lbnQoaSxudWxsLG4uY3JlYXRlRWxlbWVudChhLG51bGwpKSxuLmNyZWF0ZUVsZW1lbnQoImZvcm0iLHtjbGFzc05hbWU6ImRvd25sb2FkLXVybC13cmFwcGVyIixvblN1Ym1pdDpwfSxsLm1hcCgoKHQsZSk9PigwLG4uY2xvbmVFbGVtZW50KSh0LHtrZXk6ZX0pKSkpLG4uY3JlYXRlRWxlbWVudChzLG51bGwpKSkpfX1jb25zdCB1PVRvcEJhcjt2YXIgYyxmLGwscCxoLGQseSxfLGcsbSx2LGIsdyxJLHgsQixrLEMsaixxLEwsUCxVLEQseixXLFYsSywkLEgsWSxaO2Z1bmN0aW9uIF9leHRlbmRzKCl7cmV0dXJuIF9leHRlbmRzPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIHI9YXJndW1lbnRzW2VdO2Zvcih2YXIgbiBpbiByKSh7fSkuaGFzT3duUHJvcGVydHkuY2FsbChyLG4pJiYodFtuXT1yW25dKX1yZXR1cm4gdH0sX2V4dGVuZHMuYXBwbHkobnVsbCxhcmd1bWVudHMpfWNvbnN0IGxvZ29fc21hbGw9dD0+bi5jcmVhdGVFbGVtZW50KCJzdmciLF9leHRlbmRzKHt4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHZpZXdCb3g6IjAgMCA0MDcgMTE2In0sdCksY3x8KGM9bi5jcmVhdGVFbGVtZW50KCJkZWZzIixudWxsLG4uY3JlYXRlRWxlbWVudCgiY2xpcFBhdGgiLHtpZDoibG9nb19zbWFsbF9zdmdfX2NsaXAtU1dfVE0tbG9nby1vbi1kYXJrIn0sbi5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTAgMGg0MDd2MTE2SDB6In0pKSxuLmNyZWF0ZUVsZW1lbnQoInN0eWxlIixudWxsLCIubG9nb19zbWFsbF9zdmdfX2Nscy0ye2ZpbGw6I2ZmZn0ubG9nb19zbWFsbF9zdmdfX2Nscy0ze2ZpbGw6Izg1ZWEyZH0iKSkpLG4uY3JlYXRlRWxlbWVudCgiZyIse2lkOiJsb2dvX3NtYWxsX3N2Z19fU1dfVE0tbG9nby1vbi1kYXJrIixzdHlsZTp7Y2xpcFBhdGg6InVybCgjbG9nb19zbWFsbF9zdmdfX2NsaXAtU1dfVE0tbG9nby1vbi1kYXJrKSJ9fSxuLmNyZWF0ZUVsZW1lbnQoImciLHtpZDoibG9nb19zbWFsbF9zdmdfX1NXX0luLVByb2R1Y3QiLHRyYW5zZm9ybToidHJhbnNsYXRlKC0uMzAxKSJ9LGZ8fChmPW4uY3JlYXRlRWxlbWVudCgicGF0aCIse2lkOiJsb2dvX3NtYWxsX3N2Z19fUGF0aF8yOTM2IixkOiJNMzU5LjE1IDcwLjY3NGgtLjd2LTMuNjgyaC0xLjI2di0uNmgzLjIxOXYuNmgtMS4yNTlaIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjkzNiJ9KSksbHx8KGw9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5MzciLGQ6Im0zNjMuMjE3IDcwLjY3NC0xLjI0Mi0zLjU3NGgtLjAyM3EuMDUuOC4wNSAxLjQ5NHYyLjA4M2gtLjYzNnYtNC4yODZoLjk4N2wxLjE5IDMuNDA3aC4wMTdsMS4yMjUtMy40MDdoLjk5djQuMjgzaC0uNjc1di0yLjExOGEzMCAzMCAwIDAgMSAuMDQ0LTEuNDUzaC0uMDIzbC0xLjI4NiAzLjU3MVoiLGNsYXNzTmFtZToibG9nb19zbWFsbF9zdmdfX2Nscy0yIiwiZGF0YS1uYW1lIjoiUGF0aCAyOTM3In0pKSxwfHwocD1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtpZDoibG9nb19zbWFsbF9zdmdfX1BhdGhfMjkzOCIsZDoiTTUwLjMyOCA5Ny42NjlhNDcuNjQyIDQ3LjY0MiAwIDEgMSA0Ny42NDMtNDcuNjQyIDQ3LjY0IDQ3LjY0IDAgMCAxLTQ3LjY0MyA0Ny42NDIiLGNsYXNzTmFtZToibG9nb19zbWFsbF9zdmdfX2Nscy0zIiwiZGF0YS1uYW1lIjoiUGF0aCAyOTM4In0pKSxofHwoaD1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtpZDoibG9nb19zbWFsbF9zdmdfX1BhdGhfMjkzOSIsZDoiTTUwLjMyOCA0Ljc2OUE0NS4yNTggNDUuMjU4IDAgMSAxIDUuMDcgNTAuMDI3IDQ1LjI2IDQ1LjI2IDAgMCAxIDUwLjMyOCA0Ljc2OW0wLTQuNzY5YTUwLjAyNyA1MC4wMjcgMCAxIDAgNTAuMDI3IDUwLjAyN0E1MC4wMjcgNTAuMDI3IDAgMCAwIDUwLjMyOCAwIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMyIsImRhdGEtbmFtZSI6IlBhdGggMjkzOSJ9KSksbi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NDAiLGQ6Ik0zMS44IDMzLjg1NGMtLjE1NCAxLjcxMi4wNTggMy40ODItLjA1NyA1LjIxM2E0MyA0MyAwIDAgMS0uNjkzIDUuMTU2IDkuNTMgOS41MyAwIDAgMS00LjEgNS44MjljNC4wNzkgMi42NTQgNC41NCA2Ljc3MSA0LjgxIDEwLjk0Ni4xMzUgMi4yNS4wNzcgNC41Mi4zMDggNi43NTIuMTczIDEuNzMxLjg0NiAyLjE3NCAyLjYzNiAyLjIzMS43My4wMiAxLjQ4IDAgMi4zMjcgMHY1LjM0OWMtNS4yOS45LTkuNjU3LS42LTEwLjczNC01LjA3OWEzMSAzMSAwIDAgMS0uNjU0LTVjLS4xMTctMS43ODkuMDc2LTMuNTc4LS4wNTgtNS4zNjctLjM4Ni00LjkwNi0xLjAyLTYuNTYtNS43MTMtNi43OTF2LTYuMWE5IDkgMCAwIDEgMS4wMjgtLjE3M2MyLjU3Ny0uMTM1IDMuNjc0LS45MjQgNC4yMzEtMy40NjNhMjkgMjkgMCAwIDAgLjQ4MS00LjMyOSA4MiA4MiAwIDAgMSAuNi04LjQwNmMuNjczLTMuOTgyIDMuMTM2LTUuOTA2IDcuMjM0LTYuMTM3IDEuMTU0LS4wNTcgMi4zMjcgMCAzLjY1NSAwdjUuNDY0Yy0uNTU4LjAzOC0xLjAzOS4xMTUtMS41MzkuMTE1LTMuMzM2LS4xMTUtMy41MSAxLjAyLTMuNzYyIDMuNzltNi40MDYgMTIuNjU4aC0uMDc3YTMuNTE1IDMuNTE1IDAgMSAwLS4zNDYgNy4wMjFoLjIzMWEzLjQ2IDMuNDYgMCAwIDAgMy42NTUtMy4yNTF2LS4xOTJhMy41MjMgMy41MjMgMCAwIDAtMy40NjEtMy41NzhabTEyLjA2MiAwYTMuMzczIDMuMzczIDAgMCAwLTMuNDgyIDMuMjUxIDIgMiAwIDAgMCAuMDIuMzI3IDMuMyAzLjMgMCAwIDAgMy41NzggMy40NDMgMy4yNjMgMy4yNjMgMCAwIDAgMy40NDMtMy41NTggMy4zMDggMy4zMDggMCAwIDAtMy41NTctMy40NjNabTEyLjM1MSAwYTMuNTkgMy41OSAwIDAgMC0zLjY1NSAzLjQ4MiAzLjUzIDMuNTMgMCAwIDAgMy41MzYgMy41MzloLjAzOWMxLjc2OS4zMDkgMy41NTktMS40IDMuNjc0LTMuNDYyYTMuNTcgMy41NyAwIDAgMC0zLjYtMy41NTlabTE2Ljk0OC4yODhjLTIuMjMyLS4xLTMuMzQ4LS44NDYtMy45LTIuOTYyYTIxLjUgMjEuNSAwIDAgMS0uNjM1LTQuMTM2Yy0uMTU0LTIuNTc4LS4xMzUtNS4xNzUtLjMwOC03Ljc1My0uNC02LjExNy00LjgyOC04LjI1Mi0xMS4yNTQtNy4xOTV2NS4zMWMxLjAxOSAwIDEuODA4IDAgMi42LjAxOSAxLjM2Ni4wMTkgMi40LjUzOSAyLjUzOSAyLjA1OS4xMzUgMS4zODUuMTM1IDIuNzg5LjI3IDQuMTkzLjI2OSAyLjc5LjQyMiA1LjYxOC45IDguMzY5YTguNzIgOC43MiAwIDAgMCAzLjkyMSA1LjM0OGMtMy40IDIuMjg5LTQuNDA2IDUuNTU5LTQuNTc4IDkuMjM0LS4xIDIuNTItLjE1NCA1LjA1OS0uMjg5IDcuNi0uMTE1IDIuMzA4LS45MjMgMy4wNTgtMy4yNTEgMy4xMTYtLjY1NC4wMTktMS4yODkuMDc3LTIuMDE5LjExNXY1LjQ0NWMxLjM2NSAwIDIuNjE2LjA3NyAzLjg2NiAwIDMuODg2LS4yMzEgNi4yMzMtMi4xMTcgNy01Ljg4N0E0OSA0OSAwIDAgMCA3NSA2My40Yy4xMzUtMS45MjMuMTE2LTMuODY2LjMwOC01Ljc3MS4yODktMi45ODIgMS42NTUtNC4yMTMgNC42MzYtNC40YTQgNCAwIDAgMCAuODI4LS4xOTJ2LTYuMWMtLjUtLjA1OC0uODQzLS4xMTUtMS4yMDgtLjEzNVoiLCJkYXRhLW5hbWUiOiJQYXRoIDI5NDAiLHN0eWxlOntmaWxsOiIjMTczNjQ3In19KSxkfHwoZD1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtpZDoibG9nb19zbWFsbF9zdmdfX1BhdGhfMjk0MSIsZDoiTTE1Mi4yNzMgNTguMTIyYTExLjIzIDExLjIzIDAgMCAxLTQuMzg0IDkuNDI0cS00LjM4MyAzLjM4Mi0xMS45IDMuMzgyLTguMTQgMC0xMi41MjQtMi4xVjYzLjdhMzMgMzMgMCAwIDAgNi4xMzcgMS44NzkgMzIuMyAzMi4zIDAgMCAwIDYuNTc1LjY4OXE1LjMyMiAwIDguMDE1LTIuMDJhNi42MyA2LjYzIDAgMCAwIDIuNjkyLTUuNjIgNy4yIDcuMiAwIDAgMC0uOTU0LTMuOSA4LjkgOC45IDAgMCAwLTMuMTk0LTIuOCA0NC42IDQ0LjYgMCAwIDAtNi44MS0yLjkxMXEtNi4zODctMi4yODYtOS4xMjYtNS40MTdhMTEuOTYgMTEuOTYgMCAwIDEtMi43NC04LjE3MkExMC4xNiAxMC4xNiAwIDAgMSAxMjguMDM5IDI3cTMuOTc3LTMuMTMxIDEwLjUyLTMuMTMxYTMxIDMxIDAgMCAxIDEyLjU1NSAyLjVMMTQ5LjQ1NSAzMWEyOC40IDI4LjQgMCAwIDAtMTEuMDIxLTIuMzggMTAuNjcgMTAuNjcgMCAwIDAtNi42MDYgMS44MTYgNS45OCA1Ljk4IDAgMCAwLTIuMzggNS4wNDEgNy43IDcuNyAwIDAgMCAuODc3IDMuOSA4LjI0IDguMjQgMCAwIDAgMi45NTkgMi43ODYgMzYuNyAzNi43IDAgMCAwIDYuMzcxIDIuOHE3LjIgMi41NjYgOS45MSA1LjUxYTEwLjg0IDEwLjg0IDAgMCAxIDIuNzA4IDcuNjQ5IixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjk0MSJ9KSkseXx8KHk9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NDIiLGQ6Ik0xODUuMjg4IDcwLjMgMTc5IDUwLjE3cS0uNTk0LTEuODQ4LTIuMjIyLTguMzkxaC0uMjUxcS0xLjI1MiA1LjQ3OS0yLjE5MiA4LjQ1M0wxNjcuODQ5IDcwLjNoLTYuMDExbC05LjM2MS0zNC4zMTVoNS40NDdxMy4zMTggMTIuOTMxIDUuMDU3IDE5LjY5M2E4MCA4MCAwIDAgMSAxLjk4OCA5LjExMWguMjVxLjM0NS0xLjc4NSAxLjExMi00LjYxOHQxLjMzLTQuNDkzbDYuMjk0LTE5LjY5M2g1LjYzNWw2LjEzNyAxOS42OTNhNjYgNjYgMCAwIDEgMi4zNzkgOS4wNDhoLjI1MWEzMyAzMyAwIDAgMSAuNjczLTMuNDc1cS41NDgtMi4zNDcgNi41MjgtMjUuMjY2aDUuMzg1TDE5MS40NTYgNzAuM1oiLGNsYXNzTmFtZToibG9nb19zbWFsbF9zdmdfX2Nscy0yIiwiZGF0YS1uYW1lIjoiUGF0aCAyOTQyIn0pKSxffHwoXz1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtpZDoibG9nb19zbWFsbF9zdmdfX1BhdGhfMjk0MyIsZDoibTIyNS4xMTUgNzAuMy0xLjAzMy00Ljg4NWgtLjI1YTE0LjQ1IDE0LjQ1IDAgMCAxLTUuMTE5IDQuMzY4IDE1LjYgMTUuNiAwIDAgMS02LjM3MiAxLjE0M3EtNS4xIDAtOC0yLjYzdC0yLjktNy40ODNxMC0xMC40IDE2LjYyNi0xMC45bDUuODIzLS4xODhWNDcuNnEwLTQuMDM4LTEuNzM4LTUuOTY0dC01LjU1Mi0xLjkyM2EyMi42IDIyLjYgMCAwIDAtOS43MDYgMi42M2wtMS42LTMuOTc3YTI0LjQgMjQuNCAwIDAgMSA1LjU1Ny0yLjE2IDI0IDI0IDAgMCAxIDYuMDU4LS43ODNxNi4xMzYgMCA5LjEgMi43MjR0Mi45NTkgOC43MzVWNzAuM1ptLTExLjc0MS0zLjY2M2ExMC41NSAxMC41NSAwIDAgMCA3LjYyNi0yLjY2IDkuODUgOS44NSAwIDAgMCAyLjc3MS03LjQ1MXYtMy4xbC01LjIuMjE5cS02LjIuMjE5LTguOTM5IDEuOTI2YTUuOCA1LjggMCAwIDAtMi43NCA1LjMwNiA1LjM1IDUuMzUgMCAwIDAgMS43MDcgNC4yOSA3LjA4IDcuMDggMCAwIDAgNC43NzUgMS40NzJaIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjk0MyJ9KSksZ3x8KGc9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NDQiLGQ6Ik0yNjQuNiAzNS45ODd2My4yODdsLTYuMzU2Ljc1MmExMS4xNiAxMS4xNiAwIDAgMSAyLjI1NSA2Ljg1NiAxMC4xNSAxMC4xNSAwIDAgMS0zLjQ0NCA4LjA0N3EtMy40NDQgMy05LjQ1NiAzYTE1LjcgMTUuNyAwIDAgMS0yLjg4LS4yNVEyNDEuNCA1OS40MzggMjQxLjQgNjIuMWEyLjI0IDIuMjQgMCAwIDAgMS4xNTkgMi4wODIgOC40NiA4LjQ2IDAgMCAwIDMuOTc2LjY3M2g2LjA3NHE1LjU3MyAwIDguNTYzIDIuMzQ4YTguMTYgOC4xNiAwIDAgMSAyLjk5IDYuODI1IDkuNzQgOS43NCAwIDAgMS00LjU3MSA4LjY4OHEtNC41NzIgMi45ODktMTMuMzM4IDIuOTktNi43MzIgMC0xMC4zNzktMi41YTguMDkgOC4wOSAwIDAgMS0zLjY0Ny03LjA3NiA3Ljk1IDcuOTUgMCAwIDEgMi01LjQxNyAxMC4yIDEwLjIgMCAwIDEgNS42MzYtMy4xIDUuNDMgNS40MyAwIDAgMS0yLjIwNy0xLjg0NyA0LjkgNC45IDAgMCAxLS44OTMtMi45MTIgNS41MyA1LjUzIDAgMCAxIDEtMy4yODggMTAuNSAxMC41IDAgMCAxIDMuMTYyLTIuNzIzIDkuMjggOS4yOCAwIDAgMS00LjMzNi0zLjcyNiAxMC45NSAxMC45NSAwIDAgMS0xLjY3NS02LjAxMnEwLTUuNjM0IDMuMzgyLTguNjg4dDkuNTgtMy4wNTJhMTcuNCAxNy40IDAgMCAxIDQuODUzLjYyNlptLTI3LjM2NyA0MC4wNzVhNC42NiA0LjY2IDAgMCAwIDIuMzQ4IDQuMjI3IDEyLjk3IDEyLjk3IDAgMCAwIDYuNzMyIDEuNDRxNi41NDMgMCA5LjY5LTEuOTU2YTUuOTkgNS45OSAwIDAgMCAzLjE0Ny01LjMwN3EwLTIuNzg3LTEuNzIzLTMuODY3dC02LjQ4MS0xLjA4aC02LjIzYTguMiA4LjIgMCAwIDAtNS41MSAxLjY5IDYuMDQgNi4wNCAwIDAgMC0xLjk3MyA0Ljg1M20yLjgxOC0yOS4wODZhNi45OCA2Ljk4IDAgMCAwIDIuMDM1IDUuNDQ4IDguMTIgOC4xMiAwIDAgMCA1LjY2NyAxLjg0N3E3LjYwOCAwIDcuNjA4LTcuMzg5IDAtNy43MzMtNy43LTcuNzMzYTcuNjMgNy42MyAwIDAgMC01LjYzNSAxLjk3MnEtMS45NzYgMS45NzMtMS45NzUgNS44NTUiLGNsYXNzTmFtZToibG9nb19zbWFsbF9zdmdfX2Nscy0yIiwiZGF0YS1uYW1lIjoiUGF0aCAyOTQ0In0pKSxtfHwobT1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtpZDoibG9nb19zbWFsbF9zdmdfX1BhdGhfMjk0NSIsZDoiTTI5OS4xMzYgMzUuOTg3djMuMjg3bC02LjM1Ni43NTJhMTEuMTcgMTEuMTcgMCAwIDEgMi4yNTQgNi44NTYgMTAuMTUgMTAuMTUgMCAwIDEtMy40NDQgOC4wNDdxLTMuNDQ0IDMtOS40NTUgM2ExNS43IDE1LjcgMCAwIDEtMi44OC0uMjVxLTMuMzIgMS43NTQtMy4zMTkgNC40MTVhMi4yNCAyLjI0IDAgMCAwIDEuMTU4IDIuMDgyIDguNDYgOC40NiAwIDAgMCAzLjk3Ni42NzNoNi4wNzRxNS41NzQgMCA4LjU2MyAyLjM0OGE4LjE2IDguMTYgMCAwIDEgMi45OSA2LjgyNSA5Ljc0IDkuNzQgMCAwIDEtNC41NzEgOC42ODhxLTQuNTcgMi45ODktMTMuMzM3IDIuOTktNi43MzIgMC0xMC4zNzktMi41YTguMDkgOC4wOSAwIDAgMS0zLjY0OC03LjA3NiA3Ljk1IDcuOTUgMCAwIDEgMi01LjQxNyAxMC4yIDEwLjIgMCAwIDEgNS42MzYtMy4xIDUuNDMgNS40MyAwIDAgMS0yLjIwOC0xLjg0NyA0LjkgNC45IDAgMCAxLS44OTItMi45MTIgNS41MyA1LjUzIDAgMCAxIDEtMy4yODggMTAuNSAxMC41IDAgMCAxIDMuMTYyLTIuNzIzIDkuMjcgOS4yNyAwIDAgMS00LjMzNi0zLjcyNiAxMC45NSAxMC45NSAwIDAgMS0xLjY3NS02LjAxMnEwLTUuNjM0IDMuMzgxLTguNjg4dDkuNTgxLTMuMDUyYTE3LjQgMTcuNCAwIDAgMSA0Ljg1My42MjZabS0yNy4zNjQgNDAuMDc1YTQuNjYgNC42NiAwIDAgMCAyLjM0OCA0LjIyNyAxMi45NyAxMi45NyAwIDAgMCA2LjczMSAxLjQ0cTYuNTQ0IDAgOS42OTEtMS45NTZhNS45OSA1Ljk5IDAgMCAwIDMuMTQ2LTUuMzA3cTAtMi43ODctMS43MjItMy44Njd0LTYuNDgxLTEuMDhoLTYuMjNhOC4yIDguMiAwIDAgMC01LjUxMSAxLjY5IDYuMDQgNi4wNCAwIDAgMC0xLjk3MiA0Ljg1M20yLjgxOC0yOS4wODZhNi45OCA2Ljk4IDAgMCAwIDIuMDM1IDUuNDQ4IDguMTIgOC4xMiAwIDAgMCA1LjY2NyAxLjg0N3E3LjYwNyAwIDcuNjA4LTcuMzg5IDAtNy43MzMtNy43LTcuNzMzYTcuNjMgNy42MyAwIDAgMC01LjYzNSAxLjk3MnEtMS45NzUgMS45NzMtMS45NzUgNS44NTUiLGNsYXNzTmFtZToibG9nb19zbWFsbF9zdmdfX2Nscy0yIiwiZGF0YS1uYW1lIjoiUGF0aCAyOTQ1In0pKSx2fHwodj1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtpZDoibG9nb19zbWFsbF9zdmdfX1BhdGhfMjk0NiIsZDoiTTMxNi43NzggNzAuOTI4cS03LjYwOCAwLTEyLjAwNy00LjYzNHQtNC40LTEyLjg2OHEwLTguMyA0LjA4Ni0xMy4xODFhMTMuNTcgMTMuNTcgMCAwIDEgMTAuOTc0LTQuODg0IDEyLjk0IDEyLjk0IDAgMCAxIDEwLjIwNyA0LjIzOXEzLjc2MiA0LjI0NyAzLjc2MiAxMS4ydjMuMjg3aC0yMy42NDNxLjE1NiA2LjA0NCAzLjA1MyA5LjE3NHQ4LjE1NiAzLjEzMWEyNy42IDI3LjYgMCAwIDAgMTAuOTU4LTIuMzE3djQuNjM0YTI3LjUgMjcuNSAwIDAgMS01LjIxMyAxLjcwNiAyOS4zIDI5LjMgMCAwIDEtNS45MzMuNTEzbS0xLjQwOS0zMS4yMTVhOC40OSA4LjQ5IDAgMCAwLTYuNTkxIDIuNjkyIDEyLjQgMTIuNCAwIDAgMC0yLjkgNy40NTJoMTcuOTRxMC00LjkxNi0yLjE5MS03LjUzYTcuNzEgNy43MSAwIDAgMC02LjI1OC0yLjYxNCIsY2xhc3NOYW1lOiJsb2dvX3NtYWxsX3N2Z19fY2xzLTIiLCJkYXRhLW5hbWUiOiJQYXRoIDI5NDYifSkpLGJ8fChiPW4uY3JlYXRlRWxlbWVudCgicGF0aCIse2lkOiJsb2dvX3NtYWxsX3N2Z19fUGF0aF8yOTQ3IixkOiJNMzUwLjkgMzUuMzYxYTIwLjQgMjAuNCAwIDAgMSA0LjEuMzc1bC0uNzIxIDQuODIyYTE3LjcgMTcuNyAwIDAgMC0zLjc1Ny0uNDcgOS4xNCA5LjE0IDAgMCAwLTcuMTIyIDMuMzgyIDEyLjMzIDEyLjMzIDAgMCAwLTIuOTU5IDguNDIyVjcwLjNoLTUuMlYzNS45ODdoNC4yOWwuNiA2LjM1NmguMjVhMTUuMSAxNS4xIDAgMCAxIDQuNi01LjE2NiAxMC4zNiAxMC4zNiAwIDAgMSA1LjkxOS0xLjgxNiIsY2xhc3NOYW1lOiJsb2dvX3NtYWxsX3N2Z19fY2xzLTIiLCJkYXRhLW5hbWUiOiJQYXRoIDI5NDcifSkpLHd8fCh3PW4uY3JlYXRlRWxlbWVudCgicGF0aCIse2lkOiJsb2dvX3NtYWxsX3N2Z19fUGF0aF8yOTQ4IixkOiJNMjU1Ljg1NyA5Ni42MzhzLTMuNDMtLjM5MS00Ljg1LS4zOTFjLTIuMDU4IDAtMy4xMTEuNzM1LTMuMTExIDIuMTggMCAxLjU2OC44ODIgMS45MzUgMy43NDggMi43MTkgMy41MjcuOTggNC44IDEuOTExIDQuOCA0Ljc3NyAwIDMuNjc1LTIuMyA1LjI2Ny01LjYxIDUuMjY3YTM2IDM2IDAgMCAxLTUuNDg3LS42NjJsLjI3LTIuMThzMy4zMDYuNDQxIDUuMDQ2LjQ0MWMyLjA4MiAwIDMuMDM3LS45MzEgMy4wMzctMi43IDAtMS40MjEtLjc1OS0xLjkxLTMuMzMxLTIuNTIzLTMuNjI2LS45My01LjE5My0yLjAzMy01LjE5My00Ljk0OCAwLTMuMzgxIDIuMjI5LTQuNzc2IDUuNTg1LTQuNzc2YTM3IDM3IDAgMCAxIDUuMzE1LjU4N1oiLGNsYXNzTmFtZToibG9nb19zbWFsbF9zdmdfX2Nscy0yIiwiZGF0YS1uYW1lIjoiUGF0aCAyOTQ4In0pKSxJfHwoST1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtpZDoibG9nb19zbWFsbF9zdmdfX1BhdGhfMjk0OSIsZDoiTTI2Mi45NjcgOTQuMTRoNC43MzNsMy43NDggMTMuMTA2TDI3NS4yIDk0LjE0aDQuNzUydjE2Ljc4SDI3Ny4ydi0xNC41aC0uMTQ1bC00LjE5MSAxMy44MTZoLTIuODQybC00LjE5MS0xMy44MTZoLS4xNDV2MTQuNWgtMi43MTlaIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjk0OSJ9KSkseHx8KHg9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NTAiLGQ6Ik0zMjIuMDU3IDk0LjE0SDMzNC4zdjIuNDI1aC00LjcyOHYxNC4zNTVoLTIuNzQzVjk2LjU2NWgtNC43NzdaIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjk1MCJ9KSksQnx8KEI9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NTEiLGQ6Ik0zNDYuMTM3IDk0LjE0YzMuMzMyIDAgNS4xMiAxLjI0OSA1LjEyIDQuMzYxIDAgMi4wMzMtLjYzNyAzLjAzNy0xLjk4NCAzLjc3MiAxLjQ0NS41NjMgMi40IDEuNTkyIDIuNCAzLjkgMCAzLjQzLTIuMDgxIDQuNzUyLTUuMzM5IDQuNzUyaC02LjU2NlY5NC4xNFptLTMuNjUgMi4zNTJ2NC44aDMuNmMxLjY2NiAwIDIuNC0uODMyIDIuNC0yLjQ3NCAwLTEuNjE3LS44MzMtMi4zMjctMi41LTIuMzI3Wm0wIDcuMXY0Ljk3M2gzLjdjMS42ODkgMCAyLjY5NC0uNTM5IDIuNjk0LTIuNTQ4IDAtMS45MTEtMS40MjEtMi40MjUtMi43NDQtMi40MjVaIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjk1MSJ9KSksa3x8KGs9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NTIiLGQ6Ik0zNTguNDE0IDk0LjE0SDM2OXYyLjM3N2gtNy44NjR2NC43NTFoNi4zOTR2Mi4zMzJoLTYuMzk0djQuOTI0SDM2OXYyLjRoLTEwLjU4NloiLGNsYXNzTmFtZToibG9nb19zbWFsbF9zdmdfX2Nscy0yIiwiZGF0YS1uYW1lIjoiUGF0aCAyOTUyIn0pKSxDfHwoQz1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtpZDoibG9nb19zbWFsbF9zdmdfX1BhdGhfMjk1MyIsZDoiTTM3OC43NDcgOTQuMTRoNS40MTRsNC4xNjQgMTYuNzhoLTIuNzQ0bC0xLjIzOS00LjkyaC01Ljc3N2wtMS4yMzkgNC45MjNoLTIuNzE5Wm0uMzYxIDkuNDU2aDQuNzA4bC0xLjczNy03LjE3OGgtMS4yMjVaIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjk1MyJ9KSksanx8KGo9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NTQiLGQ6Ik0zOTcuMSAxMDUuOTQ3djQuOTczaC0yLjcxOVY5NC4xNGg2LjM3YzMuNyAwIDUuNjgzIDIuMTIgNS42ODMgNS44NDMgMCAyLjM3Ni0uOTU2IDQuNTE5LTIuNzQ0IDUuMzUybDIuNzY5IDUuNTg1aC0yLjk4OWwtMi40MjYtNC45NzNabTMuNjUxLTkuNDU1SDM5Ny4xdjcuMWgzLjdjMi4wNTcgMCAyLjg0MS0xLjg1IDIuODQxLTMuNTg5IDAtMS45LS45MzQtMy41MTEtMi44OTQtMy41MTFaIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjk1NCJ9KSkscXx8KHE9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NTUiLGQ6Ik0yOTAuMDEzIDk0LjE0aDUuNDEzbDQuMTY0IDE2Ljc4aC0yLjc0M2wtMS4yMzktNC45MmgtNS43NzdsLTEuMjM5IDQuOTIzaC0yLjcxOVptLjM2MSA5LjQ1Nmg0LjcwN2wtMS43MzctNy4xNzhoLTEuMjI1WiIsY2xhc3NOYW1lOiJsb2dvX3NtYWxsX3N2Z19fY2xzLTIiLCJkYXRhLW5hbWUiOiJQYXRoIDI5NTUifSkpLEx8fChMPW4uY3JlYXRlRWxlbWVudCgicGF0aCIse2lkOiJsb2dvX3NtYWxsX3N2Z19fUGF0aF8yOTU2IixkOiJNMzA4LjM2MiAxMDUuOTQ3djQuOTczaC0yLjcxOVY5NC4xNGg2LjM2OWMzLjcgMCA1LjY4MyAyLjEyIDUuNjgzIDUuODQzIDAgMi4zNzYtLjk1NSA0LjUxOS0yLjc0MyA1LjM1MmwyLjc2OCA1LjU4NWgtMi45ODlsLTIuNDI1LTQuOTczWm0zLjY1LTkuNDU1aC0zLjY1djcuMWgzLjdjMi4wNTggMCAyLjg0MS0xLjg1IDIuODQxLTMuNTg5LS4wMDMtMS45MDMtLjkzMS0zLjUxMS0yLjg5MS0zLjUxMSIsY2xhc3NOYW1lOiJsb2dvX3NtYWxsX3N2Z19fY2xzLTIiLCJkYXRhLW5hbWUiOiJQYXRoIDI5NTYifSkpLFB8fChQPW4uY3JlYXRlRWxlbWVudCgicGF0aCIse2lkOiJsb2dvX3NtYWxsX3N2Z19fUGF0aF8yOTU3IixkOiJNMTMwLjYwNiAxMDcuNjQzYTMuMDIgMy4wMiAwIDAgMS0xLjE4IDIuNTM3IDUuMSA1LjEgMCAwIDEtMy4yLjkxIDggOCAwIDAgMS0zLjM3MS0uNTY0di0xLjM4M2E5IDkgMCAwIDAgMS42NTIuNTA2IDguNyA4LjcgMCAwIDAgMS43Ny4xODYgMy41NyAzLjU3IDAgMCAwIDIuMTU3LS41NDQgMS43OCAxLjc4IDAgMCAwIC43MjUtMS41MTIgMS45NSAxLjk1IDAgMCAwLS4yNTctMS4wNSAyLjQgMi40IDAgMCAwLS44Ni0uNzU0IDEyIDEyIDAgMCAwLTEuODMzLS43ODQgNS44NCA1Ljg0IDAgMCAxLTIuNDU2LTEuNDU4IDMuMiAzLjIgMCAwIDEtLjczOC0yLjIgMi43NCAyLjc0IDAgMCAxIDEuMDcxLTIuMjY3IDQuNDQgNC40NCAwIDAgMSAyLjgzMS0uODQzIDguMyA4LjMgMCAwIDEgMy4zOC42NzVsLS40NDcgMS4yNDdhNy42IDcuNiAwIDAgMC0yLjk2Ni0uNjQxIDIuODggMi44OCAwIDAgMC0xLjc3OS40ODkgMS42MSAxLjYxIDAgMCAwLS42NCAxLjM1NyAyLjEgMi4xIDAgMCAwIC4yMzYgMS4wNDkgMi4yIDIuMiAwIDAgMCAuOC43NSAxMCAxMCAwIDAgMCAxLjcxNS43NTQgNi44IDYuOCAwIDAgMSAyLjY2NyAxLjQ4MyAyLjkyIDIuOTIgMCAwIDEgLjcyMyAyLjA1NyIsY2xhc3NOYW1lOiJsb2dvX3NtYWxsX3N2Z19fY2xzLTIiLCJkYXRhLW5hbWUiOiJQYXRoIDI5NTcifSkpLFV8fChVPW4uY3JlYXRlRWxlbWVudCgicGF0aCIse2lkOiJsb2dvX3NtYWxsX3N2Z19fUGF0aF8yOTU4IixkOiJNMTM0LjQ0NyAxMDEuNjg2djUuOTkxYTIuNCAyLjQgMCAwIDAgLjUxNSAxLjY4NiAyLjEgMi4xIDAgMCAwIDEuNjA5LjU1NiAyLjYzIDIuNjMgMCAwIDAgMi4xMi0uNzkyIDQgNCAwIDAgMCAuNjctMi41ODd2LTQuODU0aDEuNHY5LjIzNkgxMzkuNmwtLjItMS4yMzloLS4wNzVhMi44IDIuOCAwIDAgMS0xLjE5MyAxLjA0NSA0IDQgMCAwIDEtMS43NC4zNjIgMy41MyAzLjUzIDAgMCAxLTIuNTI0LS44IDMuNCAzLjQgMCAwIDEtLjgzOS0yLjU2MnYtNi4wNDJaIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjk1OCJ9KSksRHx8KEQ9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NTkiLGQ6Ik0xNDguMjA2IDExMS4wOWE0IDQgMCAwIDEtMS42NDctLjMzMyAzLjEgMy4xIDAgMCAxLTEuMjUyLTEuMDIzaC0uMWExMiAxMiAwIDAgMSAuMSAxLjUzM3YzLjhoLTEuNHYtMTMuMzgxaDEuMTM3bC4xOTQgMS4yNjRoLjA2N2EzLjI2IDMuMjYgMCAwIDEgMS4yNTYtMS4xIDMuOCAzLjggMCAwIDEgMS42NDMtLjMzNyAzLjQxIDMuNDEgMCAwIDEgMi44MzYgMS4yNTYgNi42OCA2LjY4IDAgMCAxLS4wMTcgNy4wNTcgMy40MiAzLjQyIDAgMCAxLTIuODE3IDEuMjY0bS0uMi04LjM4NWEyLjQ4IDIuNDggMCAwIDAtMi4wNDguNzg0IDQuMDQgNC4wNCAwIDAgMC0uNjQ5IDIuNDk0di4zMTJhNC42MyA0LjYzIDAgMCAwIC42NDkgMi43ODUgMi40NyAyLjQ3IDAgMCAwIDIuMDgyLjgzOSAyLjE2IDIuMTYgMCAwIDAgMS44NzUtLjk2OSA0LjYgNC42IDAgMCAwIC42NzgtMi42NzEgNC40MyA0LjQzIDAgMCAwLS42NzgtMi42NTEgMi4yMyAyLjIzIDAgMCAwLTEuOTE1LS45MjNaIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjk1OSJ9KSksenx8KHo9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NjAiLGQ6Ik0xNTkuMDM5IDExMS4wOWE0IDQgMCAwIDEtMS42NDctLjMzMyAzLjEgMy4xIDAgMCAxLTEuMjUyLTEuMDIzaC0uMWExMiAxMiAwIDAgMSAuMSAxLjUzM3YzLjhoLTEuNHYtMTMuMzgxaDEuMTM3bC4xOTQgMS4yNjRoLjA2N2EzLjI2IDMuMjYgMCAwIDEgMS4yNTYtMS4xIDMuOCAzLjggMCAwIDEgMS42NDMtLjMzNyAzLjQxIDMuNDEgMCAwIDEgMi44MzYgMS4yNTYgNi42OCA2LjY4IDAgMCAxLS4wMTcgNy4wNTcgMy40MiAzLjQyIDAgMCAxLTIuODE3IDEuMjY0bS0uMi04LjM4NWEyLjQ4IDIuNDggMCAwIDAtMi4wNDguNzg0IDQuMDQgNC4wNCAwIDAgMC0uNjQ5IDIuNDk0di4zMTJhNC42MyA0LjYzIDAgMCAwIC42NDkgMi43ODUgMi40NyAyLjQ3IDAgMCAwIDIuMDgyLjgzOSAyLjE2IDIuMTYgMCAwIDAgMS44NzUtLjk2OSA0LjYgNC42IDAgMCAwIC42NzgtMi42NzEgNC40MyA0LjQzIDAgMCAwLS42NzgtMi42NTEgMi4yMyAyLjIzIDAgMCAwLTEuOTExLS45MjNaIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjk2MCJ9KSksV3x8KFc9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NjEiLGQ6Ik0xNzMuNjEyIDEwNi4zYTUuMSA1LjEgMCAwIDEtMS4xMzcgMy41MjcgNCA0IDAgMCAxLTMuMTQzIDEuMjY4IDQuMTcgNC4xNyAwIDAgMS0yLjItLjU4MSAzLjg0IDMuODQgMCAwIDEtMS40ODMtMS42NjkgNS44IDUuOCAwIDAgMS0uNTIyLTIuNTQ1IDUuMSA1LjEgMCAwIDEgMS4xMjktMy41MTggNCA0IDAgMCAxIDMuMTM1LTEuMjYgMy45IDMuOSAwIDAgMSAzLjA4IDEuMjkgNS4wNyA1LjA3IDAgMCAxIDEuMTQxIDMuNDg4bS03LjAzNiAwYTQuNCA0LjQgMCAwIDAgLjcwOCAyLjcgMi44MSAyLjgxIDAgMCAwIDQuMTY3IDAgNC4zNyA0LjM3IDAgMCAwIC43MTItMi43IDQuMyA0LjMgMCAwIDAtLjcxMi0yLjY3NSAyLjUgMi41IDAgMCAwLTIuMS0uOTE1IDIuNDYgMi40NiAwIDAgMC0yLjA3Mi45IDQuMzMgNC4zMyAwIDAgMC0uNyAyLjY5WiIsY2xhc3NOYW1lOiJsb2dvX3NtYWxsX3N2Z19fY2xzLTIiLCJkYXRhLW5hbWUiOiJQYXRoIDI5NjEifSkpLFZ8fChWPW4uY3JlYXRlRWxlbWVudCgicGF0aCIse2lkOiJsb2dvX3NtYWxsX3N2Z19fUGF0aF8yOTYyIixkOiJNMTgwLjUyNSAxMDEuNTE3YTUuNSA1LjUgMCAwIDEgMS4xLjFsLS4xOTQgMS4zYTQuOCA0LjggMCAwIDAtMS4wMTEtLjEyNyAyLjQ2IDIuNDYgMCAwIDAtMS45MTcuOTExIDMuMzIgMy4zMiAwIDAgMC0uOCAyLjI2N3Y0Ljk1NWgtMS40di05LjIzNmgxLjE1NGwuMTYgMS43MWguMDY4YTQuMDUgNC4wNSAwIDAgMSAxLjIzOC0xLjM5IDIuOCAyLjggMCAwIDEgMS42LS40OVoiLGNsYXNzTmFtZToibG9nb19zbWFsbF9zdmdfX2Nscy0yIiwiZGF0YS1uYW1lIjoiUGF0aCAyOTYyIn0pKSxLfHwoSz1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtpZDoibG9nb19zbWFsbF9zdmdfX1BhdGhfMjk2MyIsZDoiTTE4Ny4zNjMgMTA5LjkzNmE0LjUgNC41IDAgMCAwIC43MTYtLjA1NSA0IDQgMCAwIDAgLjU0OC0uMTE0djEuMDdhMi41IDIuNSAwIDAgMS0uNjcuMTgxIDUgNSAwIDAgMS0uOC4wNzJxLTIuNjggMC0yLjY4LTIuODIzdi01LjQ5NGgtMS4zMjN2LS42NzNsMS4zMjMtLjU4Mi41OS0xLjk3MmguODA5djIuMTQxaDIuNjh2MS4wODdoLTIuNjh2NS40MzVhMS44NyAxLjg3IDAgMCAwIC40IDEuMjgxIDEuMzggMS4zOCAwIDAgMCAxLjA4Ny40NDYiLGNsYXNzTmFtZToibG9nb19zbWFsbF9zdmdfX2Nscy0yIiwiZGF0YS1uYW1lIjoiUGF0aCAyOTYzIn0pKSwkfHwoJD1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtpZDoibG9nb19zbWFsbF9zdmdfX1BhdGhfMjk2NCIsZDoiTTE5NC41MzggMTExLjA5YTQuMjQgNC4yNCAwIDAgMS0zLjIzMS0xLjI0NyA0LjgyIDQuODIgMCAwIDEtMS4xODQtMy40NjMgNS4zNiA1LjM2IDAgMCAxIDEuMS0zLjU0OCAzLjY1IDMuNjUgMCAwIDEgMi45NTQtMS4zMTUgMy40OCAzLjQ4IDAgMCAxIDIuNzQ3IDEuMTQyIDQuMzggNC4zOCAwIDAgMSAxLjAxMSAzLjAxM3YuODg1aC02LjM2MmEzLjY2IDMuNjYgMCAwIDAgLjgyMiAyLjQ2OSAyLjg0IDIuODQgMCAwIDAgMi4yLjg0MyA3LjQgNy40IDAgMCAwIDIuOTQ5LS42MjR2MS4yNDdhNy40IDcuNCAwIDAgMS0xLjQuNDU5IDggOCAwIDAgMS0xLjYuMTM5Wm0tLjM3OS04LjRhMi4yOSAyLjI5IDAgMCAwLTEuNzc0LjcyNSAzLjM0IDMuMzQgMCAwIDAtLjc3OSAyLjAwNmg0LjgyOGEzLjA3IDMuMDcgMCAwIDAtLjU5LTIuMDI3IDIuMDggMi4wOCAwIDAgMC0xLjY4NS0uNzA2WiIsY2xhc3NOYW1lOiJsb2dvX3NtYWxsX3N2Z19fY2xzLTIiLCJkYXRhLW5hbWUiOiJQYXRoIDI5NjQifSkpLEh8fChIPW4uY3JlYXRlRWxlbWVudCgicGF0aCIse2lkOiJsb2dvX3NtYWxsX3N2Z19fUGF0aF8yOTY1IixkOiJNMjA2Ljk1MSAxMDkuNjgzaC0uMDc2YTMuMjkgMy4yOSAwIDAgMS0yLjkgMS40MDcgMy40MyAzLjQzIDAgMCAxLTIuODE5LTEuMjM5IDUuNDUgNS40NSAwIDAgMS0xLjAwNi0zLjUyMiA1LjU0IDUuNTQgMCAwIDEgMS4wMTEtMy41NDggMy40IDMuNCAwIDAgMSAyLjgxNC0xLjI2NCAzLjM2IDMuMzYgMCAwIDEgMi44ODMgMS4zNjVoLjEwOWwtLjA1OS0uNjY1LS4wMzQtLjY0OXYtMy43NTloMS40djEzLjExM2gtMS4xMzhabS0yLjguMjM2YTIuNTUgMi41NSAwIDAgMCAyLjA3OC0uNzc5IDMuOTUgMy45NSAwIDAgMCAuNjQ0LTIuNTE2di0uM2E0LjY0IDQuNjQgMCAwIDAtLjY1My0yLjggMi40OCAyLjQ4IDAgMCAwLTIuMDg2LS44MzkgMi4xNCAyLjE0IDAgMCAwLTEuODgzLjk1NyA0Ljc2IDQuNzYgMCAwIDAtLjY1MyAyLjcgNC41NSA0LjU1IDAgMCAwIC42NDkgMi42NzEgMi4yIDIuMiAwIDAgMCAxLjkwNi45MDZaIixjbGFzc05hbWU6ImxvZ29fc21hbGxfc3ZnX19jbHMtMiIsImRhdGEtbmFtZSI6IlBhdGggMjk2NSJ9KSksWXx8KFk9bi5jcmVhdGVFbGVtZW50KCJwYXRoIix7aWQ6ImxvZ29fc21hbGxfc3ZnX19QYXRoXzI5NjYiLGQ6Ik0yMjAuNzEyIDEwMS41MzRhMy40NCAzLjQ0IDAgMCAxIDIuODI3IDEuMjQzIDYuNjUgNi42NSAwIDAgMS0uMDA5IDcuMDUzIDMuNDIgMy40MiAwIDAgMS0yLjgxOCAxLjI2IDQgNCAwIDAgMS0xLjY0OC0uMzMzIDMuMSAzLjEgMCAwIDEtMS4yNTEtMS4wMjNoLS4xbC0uMjk1IDEuMTg4aC0xVjk3LjgwOWgxLjRWMTAxcTAgMS4wNjktLjA2OCAxLjkyMWguMDY4YTMuMzIgMy4zMiAwIDAgMSAyLjg5NC0xLjM4N20tLjIgMS4xNzFhMi40NCAyLjQ0IDAgMCAwLTIuMDY0LjgyMiA2LjM0IDYuMzQgMCAwIDAgLjAxNyA1LjU1MyAyLjQ2IDIuNDYgMCAwIDAgMi4wODEuODM5IDIuMTYgMi4xNiAwIDAgMCAxLjkyMi0uOTQgNC44MyA0LjgzIDAgMCAwIC42MzItMi43IDQuNjQgNC42NCAwIDAgMC0uNjMyLTIuNjg5IDIuMjQgMi4yNCAwIDAgMC0xLjk1OS0uODg1WiIsY2xhc3NOYW1lOiJsb2dvX3NtYWxsX3N2Z19fY2xzLTIiLCJkYXRhLW5hbWUiOiJQYXRoIDI5NjYifSkpLFp8fChaPW4uY3JlYXRlRWxlbWVudCgicGF0aCIse2lkOiJsb2dvX3NtYWxsX3N2Z19fUGF0aF8yOTY3IixkOiJNMjI1Ljc1OCAxMDEuNjg2aDEuNWwyLjAyMyA1LjI2N2EyMCAyMCAwIDAgMSAuODI2IDIuNmguMDY3cS4xMDktLjQzMS40NTktMS40NzF0Mi4yODgtNi40aDEuNWwtMy45NjkgMTAuNTE4YTUuMjUgNS4yNSAwIDAgMS0xLjM3OCAyLjIxMiAyLjkzIDIuOTMgMCAwIDEtMS45MzQuNjUzIDUuNyA1LjcgMCAwIDEtMS4yNjQtLjE0M1YxMTMuOGE1IDUgMCAwIDAgMS4wMzcuMSAyLjEzNiAyLjEzNiAwIDAgMCAyLjA1Ni0xLjYxOGwuNTE0LTEuMzE0WiIsY2xhc3NOYW1lOiJsb2dvX3NtYWxsX3N2Z19fY2xzLTIiLCJkYXRhLW5hbWUiOiJQYXRoIDI5NjcifSkpKSkpLGNvbXBvbmVudHNfTG9nbz0oKT0+bi5jcmVhdGVFbGVtZW50KGxvZ29fc21hbGwse2hlaWdodDoiNDAifSk7dmFyIEo7ZnVuY3Rpb24gbGlnaHRidWxiX2V4dGVuZHMoKXtyZXR1cm4gbGlnaHRidWxiX2V4dGVuZHM9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgcj1hcmd1bWVudHNbZV07Zm9yKHZhciBuIGluIHIpKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsbikmJih0W25dPXJbbl0pfXJldHVybiB0fSxsaWdodGJ1bGJfZXh0ZW5kcy5hcHBseShudWxsLGFyZ3VtZW50cyl9Y29uc3QgbGlnaHRidWxiPXQ9Pm4uY3JlYXRlRWxlbWVudCgic3ZnIixsaWdodGJ1bGJfZXh0ZW5kcyh7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQifSx0KSxKfHwoSj1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTIgMmE3IDcgMCAwIDAtNyA3YzAgMi4zOCAxLjE5IDQuNDcgMyA1Ljc0VjE3YTEgMSAwIDAgMCAxIDFoNmExIDEgMCAwIDAgMS0xdi0yLjI2YzEuODEtMS4yNyAzLTMuMzYgMy01Ljc0YTcgNyAwIDAgMC03LTdNOSAyMWExIDEgMCAwIDAgMSAxaDRhMSAxIDAgMCAwIDEtMXYtMUg5eiJ9KSkpO3ZhciB0dDtmdW5jdGlvbiBsaWdodGJ1bGJfb2ZmX2V4dGVuZHMoKXtyZXR1cm4gbGlnaHRidWxiX29mZl9leHRlbmRzPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIHI9YXJndW1lbnRzW2VdO2Zvcih2YXIgbiBpbiByKSh7fSkuaGFzT3duUHJvcGVydHkuY2FsbChyLG4pJiYodFtuXT1yW25dKX1yZXR1cm4gdH0sbGlnaHRidWxiX29mZl9leHRlbmRzLmFwcGx5KG51bGwsYXJndW1lbnRzKX1jb25zdCBsaWdodGJ1bGJfb2ZmPXQ9Pm4uY3JlYXRlRWxlbWVudCgic3ZnIixsaWdodGJ1bGJfb2ZmX2V4dGVuZHMoe3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDI0IDI0In0sdCksdHR8fCh0dD1uLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTIgMkM5Ljc2IDIgNy43OCAzLjA1IDYuNSA0LjY4bDkuODEgOS44MkMxNy45NCAxMy4yMSAxOSAxMS4yNCAxOSA5YTcgNyAwIDAgMC03LTdNMy4yOCA0IDIgNS4yNyA1LjA0IDguM0M1IDguNTMgNSA4Ljc2IDUgOWMwIDIuMzggMS4xOSA0LjQ3IDMgNS43NFYxN2ExIDEgMCAwIDAgMSAxaDUuNzNsNCA0TDIwIDIwLjcyek05IDIwdjFhMSAxIDAgMCAwIDEgMWg0YTEgMSAwIDAgMCAxLTF2LTF6In0pKSk7Y2xhc3MgRGFya01vZGVUb2dnbGUgZXh0ZW5kcyBuLkNvbXBvbmVudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnN0YXRlPXtpc0RhcmtNb2RlOiExfSx0aGlzLnRvZ2dsZUlzRGFya01vZGU9dGhpcy50b2dnbGVJc0RhcmtNb2RlLmJpbmQodGhpcyl9Y29tcG9uZW50RGlkTW91bnQoKXt3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpLm1hdGNoZXMmJihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgiZGFyay1tb2RlIiksdGhpcy5zZXRTdGF0ZSh7aXNEYXJrTW9kZTohMH0pKX10b2dnbGVJc0RhcmtNb2RlKCl7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoImRhcmstbW9kZSIpLHRoaXMuc2V0U3RhdGUoKHQ9Pih7aXNEYXJrTW9kZTohdC5pc0RhcmtNb2RlfSkpKX1yZW5kZXIoKXtjb25zdHtpc0RhcmtNb2RlOnR9PXRoaXMuc3RhdGU7cmV0dXJuIG4uY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJkYXJrLW1vZGUtdG9nZ2xlIn0sbi5jcmVhdGVFbGVtZW50KCJidXR0b24iLHtvbkNsaWNrOnRoaXMudG9nZ2xlSXNEYXJrTW9kZX0sdD9uLmNyZWF0ZUVsZW1lbnQobGlnaHRidWxiLHtoZWlnaHQ6IjI0In0pOm4uY3JlYXRlRWxlbWVudChsaWdodGJ1bGJfb2ZmLHtoZWlnaHQ6IjI0In0pKSl9fWNvbnN0IGV0PURhcmtNb2RlVG9nZ2xlLHRvcF9iYXI9KCk9Pih7Y29tcG9uZW50czp7VG9wYmFyOnUsTG9nbzpjb21wb25lbnRzX0xvZ28sRGFya01vZGVUb2dnbGU6ZXR9fSk7ZnVuY3Rpb24gaXNOb3RoaW5nKHQpe3JldHVybiBudWxsPT10fXZhciBydD17aXNOb3RoaW5nLGlzT2JqZWN0OmZ1bmN0aW9uIGpzX3lhbWxfaXNPYmplY3QodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH0sdG9BcnJheTpmdW5jdGlvbiB0b0FycmF5KHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3Q6aXNOb3RoaW5nKHQpP1tdOlt0XX0scmVwZWF0OmZ1bmN0aW9uIHJlcGVhdCh0LGUpe3ZhciByLG49IiI7Zm9yKHI9MDtyPGU7cis9MSluKz10O3JldHVybiBufSxpc05lZ2F0aXZlWmVybzpmdW5jdGlvbiBpc05lZ2F0aXZlWmVybyh0KXtyZXR1cm4gMD09PXQmJk51bWJlci5ORUdBVElWRV9JTkZJTklUWT09PTEvdH0sZXh0ZW5kOmZ1bmN0aW9uIGV4dGVuZCh0LGUpe3ZhciByLG4sbyxpO2lmKGUpZm9yKHI9MCxuPShpPU9iamVjdC5rZXlzKGUpKS5sZW5ndGg7cjxuO3IrPTEpdFtvPWlbcl1dPWVbb107cmV0dXJuIHR9fTtmdW5jdGlvbiBmb3JtYXRFcnJvcih0LGUpe3ZhciByPSIiLG49dC5yZWFzb258fCIodW5rbm93biByZWFzb24pIjtyZXR1cm4gdC5tYXJrPyh0Lm1hcmsubmFtZSYmKHIrPSdpbiAiJyt0Lm1hcmsubmFtZSsnIiAnKSxyKz0iKCIrKHQubWFyay5saW5lKzEpKyI6IisodC5tYXJrLmNvbHVtbisxKSsiKSIsIWUmJnQubWFyay5zbmlwcGV0JiYocis9IlxuXG4iK3QubWFyay5zbmlwcGV0KSxuKyIgIityKTpufWZ1bmN0aW9uIFlBTUxFeGNlcHRpb24kMSh0LGUpe0Vycm9yLmNhbGwodGhpcyksdGhpcy5uYW1lPSJZQU1MRXhjZXB0aW9uIix0aGlzLnJlYXNvbj10LHRoaXMubWFyaz1lLHRoaXMubWVzc2FnZT1mb3JtYXRFcnJvcih0aGlzLCExKSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpOnRoaXMuc3RhY2s9KG5ldyBFcnJvcikuc3RhY2t8fCIifVlBTUxFeGNlcHRpb24kMS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpLFlBTUxFeGNlcHRpb24kMS5wcm90b3R5cGUuY29uc3RydWN0b3I9WUFNTEV4Y2VwdGlvbiQxLFlBTUxFeGNlcHRpb24kMS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24gdG9TdHJpbmcodCl7cmV0dXJuIHRoaXMubmFtZSsiOiAiK2Zvcm1hdEVycm9yKHRoaXMsdCl9O3ZhciBudD1ZQU1MRXhjZXB0aW9uJDE7ZnVuY3Rpb24gZ2V0TGluZSh0LGUscixuLG8pe3ZhciBpPSIiLGE9IiIscz1NYXRoLmZsb29yKG8vMiktMTtyZXR1cm4gbi1lPnMmJihlPW4tcysoaT0iIC4uLiAiKS5sZW5ndGgpLHItbj5zJiYocj1uK3MtKGE9IiAuLi4iKS5sZW5ndGgpLHtzdHI6aSt0LnNsaWNlKGUscikucmVwbGFjZSgvXHQvZywi4oaSIikrYSxwb3M6bi1lK2kubGVuZ3RofX1mdW5jdGlvbiBwYWRTdGFydCh0LGUpe3JldHVybiBydC5yZXBlYXQoIiAiLGUtdC5sZW5ndGgpK3R9dmFyIG90PWZ1bmN0aW9uIG1ha2VTbmlwcGV0KHQsZSl7aWYoZT1PYmplY3QuY3JlYXRlKGV8fG51bGwpLCF0LmJ1ZmZlcilyZXR1cm4gbnVsbDtlLm1heExlbmd0aHx8KGUubWF4TGVuZ3RoPTc5KSwibnVtYmVyIiE9dHlwZW9mIGUuaW5kZW50JiYoZS5pbmRlbnQ9MSksIm51bWJlciIhPXR5cGVvZiBlLmxpbmVzQmVmb3JlJiYoZS5saW5lc0JlZm9yZT0zKSwibnVtYmVyIiE9dHlwZW9mIGUubGluZXNBZnRlciYmKGUubGluZXNBZnRlcj0yKTtmb3IodmFyIHIsbj0vXHI/XG58XHJ8XDAvZyxvPVswXSxpPVtdLGE9LTE7cj1uLmV4ZWModC5idWZmZXIpOylpLnB1c2goci5pbmRleCksby5wdXNoKHIuaW5kZXgrclswXS5sZW5ndGgpLHQucG9zaXRpb248PXIuaW5kZXgmJmE8MCYmKGE9by5sZW5ndGgtMik7YTwwJiYoYT1vLmxlbmd0aC0xKTt2YXIgcyx1LGM9IiIsZj1NYXRoLm1pbih0LmxpbmUrZS5saW5lc0FmdGVyLGkubGVuZ3RoKS50b1N0cmluZygpLmxlbmd0aCxsPWUubWF4TGVuZ3RoLShlLmluZGVudCtmKzMpO2ZvcihzPTE7czw9ZS5saW5lc0JlZm9yZSYmIShhLXM8MCk7cysrKXU9Z2V0TGluZSh0LmJ1ZmZlcixvW2Etc10saVthLXNdLHQucG9zaXRpb24tKG9bYV0tb1thLXNdKSxsKSxjPXJ0LnJlcGVhdCgiICIsZS5pbmRlbnQpK3BhZFN0YXJ0KCh0LmxpbmUtcysxKS50b1N0cmluZygpLGYpKyIgfCAiK3Uuc3RyKyJcbiIrYztmb3IodT1nZXRMaW5lKHQuYnVmZmVyLG9bYV0saVthXSx0LnBvc2l0aW9uLGwpLGMrPXJ0LnJlcGVhdCgiICIsZS5pbmRlbnQpK3BhZFN0YXJ0KCh0LmxpbmUrMSkudG9TdHJpbmcoKSxmKSsiIHwgIit1LnN0cisiXG4iLGMrPXJ0LnJlcGVhdCgiLSIsZS5pbmRlbnQrZiszK3UucG9zKSsiXlxuIixzPTE7czw9ZS5saW5lc0FmdGVyJiYhKGErcz49aS5sZW5ndGgpO3MrKyl1PWdldExpbmUodC5idWZmZXIsb1thK3NdLGlbYStzXSx0LnBvc2l0aW9uLShvW2FdLW9bYStzXSksbCksYys9cnQucmVwZWF0KCIgIixlLmluZGVudCkrcGFkU3RhcnQoKHQubGluZStzKzEpLnRvU3RyaW5nKCksZikrIiB8ICIrdS5zdHIrIlxuIjtyZXR1cm4gYy5yZXBsYWNlKC9cbiQvLCIiKX0saXQ9WyJraW5kIiwibXVsdGkiLCJyZXNvbHZlIiwiY29uc3RydWN0IiwiaW5zdGFuY2VPZiIsInByZWRpY2F0ZSIsInJlcHJlc2VudCIsInJlcHJlc2VudE5hbWUiLCJkZWZhdWx0U3R5bGUiLCJzdHlsZUFsaWFzZXMiXSxhdD1bInNjYWxhciIsInNlcXVlbmNlIiwibWFwcGluZyJdO3ZhciBzdD1mdW5jdGlvbiBUeXBlJDEodCxlKXtpZihlPWV8fHt9LE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKC0xPT09aXQuaW5kZXhPZihlKSl0aHJvdyBuZXcgbnQoJ1Vua25vd24gb3B0aW9uICInK2UrJyIgaXMgbWV0IGluIGRlZmluaXRpb24gb2YgIicrdCsnIiBZQU1MIHR5cGUuJyl9KSksdGhpcy5vcHRpb25zPWUsdGhpcy50YWc9dCx0aGlzLmtpbmQ9ZS5raW5kfHxudWxsLHRoaXMucmVzb2x2ZT1lLnJlc29sdmV8fGZ1bmN0aW9uKCl7cmV0dXJuITB9LHRoaXMuY29uc3RydWN0PWUuY29uc3RydWN0fHxmdW5jdGlvbih0KXtyZXR1cm4gdH0sdGhpcy5pbnN0YW5jZU9mPWUuaW5zdGFuY2VPZnx8bnVsbCx0aGlzLnByZWRpY2F0ZT1lLnByZWRpY2F0ZXx8bnVsbCx0aGlzLnJlcHJlc2VudD1lLnJlcHJlc2VudHx8bnVsbCx0aGlzLnJlcHJlc2VudE5hbWU9ZS5yZXByZXNlbnROYW1lfHxudWxsLHRoaXMuZGVmYXVsdFN0eWxlPWUuZGVmYXVsdFN0eWxlfHxudWxsLHRoaXMubXVsdGk9ZS5tdWx0aXx8ITEsdGhpcy5zdHlsZUFsaWFzZXM9ZnVuY3Rpb24gY29tcGlsZVN0eWxlQWxpYXNlcyh0KXt2YXIgZT17fTtyZXR1cm4gbnVsbCE9PXQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKHIpe3Rbcl0uZm9yRWFjaCgoZnVuY3Rpb24odCl7ZVtTdHJpbmcodCldPXJ9KSl9KSksZX0oZS5zdHlsZUFsaWFzZXN8fG51bGwpLC0xPT09YXQuaW5kZXhPZih0aGlzLmtpbmQpKXRocm93IG5ldyBudCgnVW5rbm93biBraW5kICInK3RoaXMua2luZCsnIiBpcyBzcGVjaWZpZWQgZm9yICInK3QrJyIgWUFNTCB0eXBlLicpfTtmdW5jdGlvbiBjb21waWxlTGlzdCh0LGUpe3ZhciByPVtdO3JldHVybiB0W2VdLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXIubGVuZ3RoO3IuZm9yRWFjaCgoZnVuY3Rpb24ocixuKXtyLnRhZz09PXQudGFnJiZyLmtpbmQ9PT10LmtpbmQmJnIubXVsdGk9PT10Lm11bHRpJiYoZT1uKX0pKSxyW2VdPXR9KSkscn1mdW5jdGlvbiBTY2hlbWEkMSh0KXtyZXR1cm4gdGhpcy5leHRlbmQodCl9U2NoZW1hJDEucHJvdG90eXBlLmV4dGVuZD1mdW5jdGlvbiBleHRlbmQodCl7dmFyIGU9W10scj1bXTtpZih0IGluc3RhbmNlb2Ygc3Qpci5wdXNoKHQpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSlyPXIuY29uY2F0KHQpO2Vsc2V7aWYoIXR8fCFBcnJheS5pc0FycmF5KHQuaW1wbGljaXQpJiYhQXJyYXkuaXNBcnJheSh0LmV4cGxpY2l0KSl0aHJvdyBuZXcgbnQoIlNjaGVtYS5leHRlbmQgYXJndW1lbnQgc2hvdWxkIGJlIGEgVHlwZSwgWyBUeXBlIF0sIG9yIGEgc2NoZW1hIGRlZmluaXRpb24gKHsgaW1wbGljaXQ6IFsuLi5dLCBleHBsaWNpdDogWy4uLl0gfSkiKTt0LmltcGxpY2l0JiYoZT1lLmNvbmNhdCh0LmltcGxpY2l0KSksdC5leHBsaWNpdCYmKHI9ci5jb25jYXQodC5leHBsaWNpdCkpfWUuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2Ygc3QpKXRocm93IG5ldyBudCgiU3BlY2lmaWVkIGxpc3Qgb2YgWUFNTCB0eXBlcyAob3IgYSBzaW5nbGUgVHlwZSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVR5cGUgb2JqZWN0LiIpO2lmKHQubG9hZEtpbmQmJiJzY2FsYXIiIT09dC5sb2FkS2luZCl0aHJvdyBuZXcgbnQoIlRoZXJlIGlzIGEgbm9uLXNjYWxhciB0eXBlIGluIHRoZSBpbXBsaWNpdCBsaXN0IG9mIGEgc2NoZW1hLiBJbXBsaWNpdCByZXNvbHZpbmcgb2Ygc3VjaCB0eXBlcyBpcyBub3Qgc3VwcG9ydGVkLiIpO2lmKHQubXVsdGkpdGhyb3cgbmV3IG50KCJUaGVyZSBpcyBhIG11bHRpIHR5cGUgaW4gdGhlIGltcGxpY2l0IGxpc3Qgb2YgYSBzY2hlbWEuIE11bHRpIHRhZ3MgY2FuIG9ubHkgYmUgbGlzdGVkIGFzIGV4cGxpY2l0LiIpfSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoISh0IGluc3RhbmNlb2Ygc3QpKXRocm93IG5ldyBudCgiU3BlY2lmaWVkIGxpc3Qgb2YgWUFNTCB0eXBlcyAob3IgYSBzaW5nbGUgVHlwZSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVR5cGUgb2JqZWN0LiIpfSkpO3ZhciBuPU9iamVjdC5jcmVhdGUoU2NoZW1hJDEucHJvdG90eXBlKTtyZXR1cm4gbi5pbXBsaWNpdD0odGhpcy5pbXBsaWNpdHx8W10pLmNvbmNhdChlKSxuLmV4cGxpY2l0PSh0aGlzLmV4cGxpY2l0fHxbXSkuY29uY2F0KHIpLG4uY29tcGlsZWRJbXBsaWNpdD1jb21waWxlTGlzdChuLCJpbXBsaWNpdCIpLG4uY29tcGlsZWRFeHBsaWNpdD1jb21waWxlTGlzdChuLCJleHBsaWNpdCIpLG4uY29tcGlsZWRUeXBlTWFwPWZ1bmN0aW9uIGNvbXBpbGVNYXAoKXt2YXIgdCxlLHI9e3NjYWxhcjp7fSxzZXF1ZW5jZTp7fSxtYXBwaW5nOnt9LGZhbGxiYWNrOnt9LG11bHRpOntzY2FsYXI6W10sc2VxdWVuY2U6W10sbWFwcGluZzpbXSxmYWxsYmFjazpbXX19O2Z1bmN0aW9uIGNvbGxlY3RUeXBlKHQpe3QubXVsdGk/KHIubXVsdGlbdC5raW5kXS5wdXNoKHQpLHIubXVsdGkuZmFsbGJhY2sucHVzaCh0KSk6clt0LmtpbmRdW3QudGFnXT1yLmZhbGxiYWNrW3QudGFnXT10fWZvcih0PTAsZT1hcmd1bWVudHMubGVuZ3RoO3Q8ZTt0Kz0xKWFyZ3VtZW50c1t0XS5mb3JFYWNoKGNvbGxlY3RUeXBlKTtyZXR1cm4gcn0obi5jb21waWxlZEltcGxpY2l0LG4uY29tcGlsZWRFeHBsaWNpdCksbn07dmFyIHV0PVNjaGVtYSQxLGN0PW5ldyBzdCgidGFnOnlhbWwub3JnLDIwMDI6c3RyIix7a2luZDoic2NhbGFyIixjb25zdHJ1Y3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10P3Q6IiJ9fSksbHQ9bmV3IHN0KCJ0YWc6eWFtbC5vcmcsMjAwMjpzZXEiLHtraW5kOiJzZXF1ZW5jZSIsY29uc3RydWN0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dD90OltdfX0pLHB0PW5ldyBzdCgidGFnOnlhbWwub3JnLDIwMDI6bWFwIix7a2luZDoibWFwcGluZyIsY29uc3RydWN0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dD90Ont9fX0pLGh0PW5ldyB1dCh7ZXhwbGljaXQ6W2N0LGx0LHB0XX0pO3ZhciBkdD1uZXcgc3QoInRhZzp5YW1sLm9yZywyMDAyOm51bGwiLHtraW5kOiJzY2FsYXIiLHJlc29sdmU6ZnVuY3Rpb24gcmVzb2x2ZVlhbWxOdWxsKHQpe2lmKG51bGw9PT10KXJldHVybiEwO3ZhciBlPXQubGVuZ3RoO3JldHVybiAxPT09ZSYmIn4iPT09dHx8ND09PWUmJigibnVsbCI9PT10fHwiTnVsbCI9PT10fHwiTlVMTCI9PT10KX0sY29uc3RydWN0OmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxOdWxsKCl7cmV0dXJuIG51bGx9LHByZWRpY2F0ZTpmdW5jdGlvbiBpc051bGwodCl7cmV0dXJuIG51bGw9PT10fSxyZXByZXNlbnQ6e2Nhbm9uaWNhbDpmdW5jdGlvbigpe3JldHVybiJ+In0sbG93ZXJjYXNlOmZ1bmN0aW9uKCl7cmV0dXJuIm51bGwifSx1cHBlcmNhc2U6ZnVuY3Rpb24oKXtyZXR1cm4iTlVMTCJ9LGNhbWVsY2FzZTpmdW5jdGlvbigpe3JldHVybiJOdWxsIn0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4iIn19LGRlZmF1bHRTdHlsZToibG93ZXJjYXNlIn0pO3ZhciB5dD1uZXcgc3QoInRhZzp5YW1sLm9yZywyMDAyOmJvb2wiLHtraW5kOiJzY2FsYXIiLHJlc29sdmU6ZnVuY3Rpb24gcmVzb2x2ZVlhbWxCb29sZWFuKHQpe2lmKG51bGw9PT10KXJldHVybiExO3ZhciBlPXQubGVuZ3RoO3JldHVybiA0PT09ZSYmKCJ0cnVlIj09PXR8fCJUcnVlIj09PXR8fCJUUlVFIj09PXQpfHw1PT09ZSYmKCJmYWxzZSI9PT10fHwiRmFsc2UiPT09dHx8IkZBTFNFIj09PXQpfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24gY29uc3RydWN0WWFtbEJvb2xlYW4odCl7cmV0dXJuInRydWUiPT09dHx8IlRydWUiPT09dHx8IlRSVUUiPT09dH0scHJlZGljYXRlOmZ1bmN0aW9uIGlzQm9vbGVhbih0KXtyZXR1cm4iW29iamVjdCBCb29sZWFuXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9LHJlcHJlc2VudDp7bG93ZXJjYXNlOmZ1bmN0aW9uKHQpe3JldHVybiB0PyJ0cnVlIjoiZmFsc2UifSx1cHBlcmNhc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/IlRSVUUiOiJGQUxTRSJ9LGNhbWVsY2FzZTpmdW5jdGlvbih0KXtyZXR1cm4gdD8iVHJ1ZSI6IkZhbHNlIn19LGRlZmF1bHRTdHlsZToibG93ZXJjYXNlIn0pO2Z1bmN0aW9uIGlzT2N0Q29kZSh0KXtyZXR1cm4gNDg8PXQmJnQ8PTU1fWZ1bmN0aW9uIGlzRGVjQ29kZSh0KXtyZXR1cm4gNDg8PXQmJnQ8PTU3fXZhciBfdD1uZXcgc3QoInRhZzp5YW1sLm9yZywyMDAyOmludCIse2tpbmQ6InNjYWxhciIscmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlWWFtbEludGVnZXIodCl7aWYobnVsbD09PXQpcmV0dXJuITE7dmFyIGUscixuPXQubGVuZ3RoLG89MCxpPSExO2lmKCFuKXJldHVybiExO2lmKCItIiE9PShlPXRbb10pJiYiKyIhPT1lfHwoZT10Wysrb10pLCIwIj09PWUpe2lmKG8rMT09PW4pcmV0dXJuITA7aWYoImIiPT09KGU9dFsrK29dKSl7Zm9yKG8rKztvPG47bysrKWlmKCJfIiE9PShlPXRbb10pKXtpZigiMCIhPT1lJiYiMSIhPT1lKXJldHVybiExO2k9ITB9cmV0dXJuIGkmJiJfIiE9PWV9aWYoIngiPT09ZSl7Zm9yKG8rKztvPG47bysrKWlmKCJfIiE9PShlPXRbb10pKXtpZighKDQ4PD0ocj10LmNoYXJDb2RlQXQobykpJiZyPD01N3x8NjU8PXImJnI8PTcwfHw5Nzw9ciYmcjw9MTAyKSlyZXR1cm4hMTtpPSEwfXJldHVybiBpJiYiXyIhPT1lfWlmKCJvIj09PWUpe2ZvcihvKys7bzxuO28rKylpZigiXyIhPT0oZT10W29dKSl7aWYoIWlzT2N0Q29kZSh0LmNoYXJDb2RlQXQobykpKXJldHVybiExO2k9ITB9cmV0dXJuIGkmJiJfIiE9PWV9fWlmKCJfIj09PWUpcmV0dXJuITE7Zm9yKDtvPG47bysrKWlmKCJfIiE9PShlPXRbb10pKXtpZighaXNEZWNDb2RlKHQuY2hhckNvZGVBdChvKSkpcmV0dXJuITE7aT0hMH1yZXR1cm4hKCFpfHwiXyI9PT1lKX0sY29uc3RydWN0OmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxJbnRlZ2VyKHQpe3ZhciBlLHI9dCxuPTE7aWYoLTEhPT1yLmluZGV4T2YoIl8iKSYmKHI9ci5yZXBsYWNlKC9fL2csIiIpKSwiLSIhPT0oZT1yWzBdKSYmIisiIT09ZXx8KCItIj09PWUmJihuPS0xKSxlPShyPXIuc2xpY2UoMSkpWzBdKSwiMCI9PT1yKXJldHVybiAwO2lmKCIwIj09PWUpe2lmKCJiIj09PXJbMV0pcmV0dXJuIG4qcGFyc2VJbnQoci5zbGljZSgyKSwyKTtpZigieCI9PT1yWzFdKXJldHVybiBuKnBhcnNlSW50KHIuc2xpY2UoMiksMTYpO2lmKCJvIj09PXJbMV0pcmV0dXJuIG4qcGFyc2VJbnQoci5zbGljZSgyKSw4KX1yZXR1cm4gbipwYXJzZUludChyLDEwKX0scHJlZGljYXRlOmZ1bmN0aW9uIGlzSW50ZWdlcih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSYmdCUxPT0wJiYhcnQuaXNOZWdhdGl2ZVplcm8odCl9LHJlcHJlc2VudDp7YmluYXJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0Pj0wPyIwYiIrdC50b1N0cmluZygyKToiLTBiIit0LnRvU3RyaW5nKDIpLnNsaWNlKDEpfSxvY3RhbDpmdW5jdGlvbih0KXtyZXR1cm4gdD49MD8iMG8iK3QudG9TdHJpbmcoOCk6Ii0wbyIrdC50b1N0cmluZyg4KS5zbGljZSgxKX0sZGVjaW1hbDpmdW5jdGlvbih0KXtyZXR1cm4gdC50b1N0cmluZygxMCl9LGhleGFkZWNpbWFsOmZ1bmN0aW9uKHQpe3JldHVybiB0Pj0wPyIweCIrdC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKToiLTB4Iit0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnNsaWNlKDEpfX0sZGVmYXVsdFN0eWxlOiJkZWNpbWFsIixzdHlsZUFsaWFzZXM6e2JpbmFyeTpbMiwiYmluIl0sb2N0YWw6WzgsIm9jdCJdLGRlY2ltYWw6WzEwLCJkZWMiXSxoZXhhZGVjaW1hbDpbMTYsImhleCJdfX0pLGd0PW5ldyBSZWdFeHAoIl4oPzpbLStdPyg/OlswLTldWzAtOV9dKikoPzpcXC5bMC05X10qKT8oPzpbZUVdWy0rXT9bMC05XSspP3xcXC5bMC05X10rKD86W2VFXVstK10/WzAtOV0rKT98Wy0rXT9cXC4oPzppbmZ8SW5mfElORil8XFwuKD86bmFufE5hTnxOQU4pKSQiKTt2YXIgbXQ9L15bLStdP1swLTldK2UvO3ZhciB2dD1uZXcgc3QoInRhZzp5YW1sLm9yZywyMDAyOmZsb2F0Iix7a2luZDoic2NhbGFyIixyZXNvbHZlOmZ1bmN0aW9uIHJlc29sdmVZYW1sRmxvYXQodCl7cmV0dXJuIG51bGwhPT10JiYhKCFndC50ZXN0KHQpfHwiXyI9PT10W3QubGVuZ3RoLTFdKX0sY29uc3RydWN0OmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxGbG9hdCh0KXt2YXIgZSxyO3JldHVybiByPSItIj09PShlPXQucmVwbGFjZSgvXy9nLCIiKS50b0xvd2VyQ2FzZSgpKVswXT8tMToxLCIrLSIuaW5kZXhPZihlWzBdKT49MCYmKGU9ZS5zbGljZSgxKSksIi5pbmYiPT09ZT8xPT09cj9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk6TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOiIubmFuIj09PWU/TmFOOnIqcGFyc2VGbG9hdChlLDEwKX0scHJlZGljYXRlOmZ1bmN0aW9uIGlzRmxvYXQodCl7cmV0dXJuIltvYmplY3QgTnVtYmVyXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkmJih0JTEhPTB8fHJ0LmlzTmVnYXRpdmVaZXJvKHQpKX0scmVwcmVzZW50OmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxGbG9hdCh0LGUpe3ZhciByO2lmKGlzTmFOKHQpKXN3aXRjaChlKXtjYXNlImxvd2VyY2FzZSI6cmV0dXJuIi5uYW4iO2Nhc2UidXBwZXJjYXNlIjpyZXR1cm4iLk5BTiI7Y2FzZSJjYW1lbGNhc2UiOnJldHVybiIuTmFOIn1lbHNlIGlmKE51bWJlci5QT1NJVElWRV9JTkZJTklUWT09PXQpc3dpdGNoKGUpe2Nhc2UibG93ZXJjYXNlIjpyZXR1cm4iLmluZiI7Y2FzZSJ1cHBlcmNhc2UiOnJldHVybiIuSU5GIjtjYXNlImNhbWVsY2FzZSI6cmV0dXJuIi5JbmYifWVsc2UgaWYoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZPT09dClzd2l0Y2goZSl7Y2FzZSJsb3dlcmNhc2UiOnJldHVybiItLmluZiI7Y2FzZSJ1cHBlcmNhc2UiOnJldHVybiItLklORiI7Y2FzZSJjYW1lbGNhc2UiOnJldHVybiItLkluZiJ9ZWxzZSBpZihydC5pc05lZ2F0aXZlWmVybyh0KSlyZXR1cm4iLTAuMCI7cmV0dXJuIHI9dC50b1N0cmluZygxMCksbXQudGVzdChyKT9yLnJlcGxhY2UoImUiLCIuZSIpOnJ9LGRlZmF1bHRTdHlsZToibG93ZXJjYXNlIn0pLGJ0PWh0LmV4dGVuZCh7aW1wbGljaXQ6W2R0LHl0LF90LHZ0XX0pLFN0PWJ0LHd0PW5ldyBSZWdFeHAoIl4oWzAtOV1bMC05XVswLTldWzAtOV0pLShbMC05XVswLTldKS0oWzAtOV1bMC05XSkkIiksSXQ9bmV3IFJlZ0V4cCgiXihbMC05XVswLTldWzAtOV1bMC05XSktKFswLTldWzAtOV0/KS0oWzAtOV1bMC05XT8pKD86W1R0XXxbIFxcdF0rKShbMC05XVswLTldPyk6KFswLTldWzAtOV0pOihbMC05XVswLTldKSg/OlxcLihbMC05XSopKT8oPzpbIFxcdF0qKFp8KFstK10pKFswLTldWzAtOV0/KSg/OjooWzAtOV1bMC05XSkpPykpPyQiKTt2YXIgeHQ9bmV3IHN0KCJ0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAiLHtraW5kOiJzY2FsYXIiLHJlc29sdmU6ZnVuY3Rpb24gcmVzb2x2ZVlhbWxUaW1lc3RhbXAodCl7cmV0dXJuIG51bGwhPT10JiYobnVsbCE9PXd0LmV4ZWModCl8fG51bGwhPT1JdC5leGVjKHQpKX0sY29uc3RydWN0OmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAodCl7dmFyIGUscixuLG8saSxhLHMsdSxjPTAsZj1udWxsO2lmKG51bGw9PT0oZT13dC5leGVjKHQpKSYmKGU9SXQuZXhlYyh0KSksbnVsbD09PWUpdGhyb3cgbmV3IEVycm9yKCJEYXRlIHJlc29sdmUgZXJyb3IiKTtpZihyPStlWzFdLG49K2VbMl0tMSxvPStlWzNdLCFlWzRdKXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhyLG4sbykpO2lmKGk9K2VbNF0sYT0rZVs1XSxzPStlWzZdLGVbN10pe2ZvcihjPWVbN10uc2xpY2UoMCwzKTtjLmxlbmd0aDwzOyljKz0iMCI7Yz0rY31yZXR1cm4gZVs5XSYmKGY9NmU0Kig2MCorZVsxMF0rICsoZVsxMV18fDApKSwiLSI9PT1lWzldJiYoZj0tZikpLHU9bmV3IERhdGUoRGF0ZS5VVEMocixuLG8saSxhLHMsYykpLGYmJnUuc2V0VGltZSh1LmdldFRpbWUoKS1mKSx1fSxpbnN0YW5jZU9mOkRhdGUscmVwcmVzZW50OmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxUaW1lc3RhbXAodCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX19KTt2YXIgRXQ9bmV3IHN0KCJ0YWc6eWFtbC5vcmcsMjAwMjptZXJnZSIse2tpbmQ6InNjYWxhciIscmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlWWFtbE1lcmdlKHQpe3JldHVybiI8PCI9PT10fHxudWxsPT09dH19KSxBdD0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cblxyIjt2YXIgT3Q9bmV3IHN0KCJ0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnkiLHtraW5kOiJzY2FsYXIiLHJlc29sdmU6ZnVuY3Rpb24gcmVzb2x2ZVlhbWxCaW5hcnkodCl7aWYobnVsbD09PXQpcmV0dXJuITE7dmFyIGUscixuPTAsbz10Lmxlbmd0aCxpPUF0O2ZvcihyPTA7cjxvO3IrKylpZighKChlPWkuaW5kZXhPZih0LmNoYXJBdChyKSkpPjY0KSl7aWYoZTwwKXJldHVybiExO24rPTZ9cmV0dXJuIG4lOD09MH0sY29uc3RydWN0OmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCaW5hcnkodCl7dmFyIGUscixuPXQucmVwbGFjZSgvW1xyXG49XS9nLCIiKSxvPW4ubGVuZ3RoLGk9QXQsYT0wLHM9W107Zm9yKGU9MDtlPG87ZSsrKWUlND09MCYmZSYmKHMucHVzaChhPj4xNiYyNTUpLHMucHVzaChhPj44JjI1NSkscy5wdXNoKDI1NSZhKSksYT1hPDw2fGkuaW5kZXhPZihuLmNoYXJBdChlKSk7cmV0dXJuIDA9PT0ocj1vJTQqNik/KHMucHVzaChhPj4xNiYyNTUpLHMucHVzaChhPj44JjI1NSkscy5wdXNoKDI1NSZhKSk6MTg9PT1yPyhzLnB1c2goYT4+MTAmMjU1KSxzLnB1c2goYT4+MiYyNTUpKToxMj09PXImJnMucHVzaChhPj40JjI1NSksbmV3IFVpbnQ4QXJyYXkocyl9LHByZWRpY2F0ZTpmdW5jdGlvbiBpc0JpbmFyeSh0KXtyZXR1cm4iW29iamVjdCBVaW50OEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9LHJlcHJlc2VudDpmdW5jdGlvbiByZXByZXNlbnRZYW1sQmluYXJ5KHQpe3ZhciBlLHIsbj0iIixvPTAsaT10Lmxlbmd0aCxhPUF0O2ZvcihlPTA7ZTxpO2UrKyllJTM9PTAmJmUmJihuKz1hW28+PjE4JjYzXSxuKz1hW28+PjEyJjYzXSxuKz1hW28+PjYmNjNdLG4rPWFbNjMmb10pLG89KG88PDgpK3RbZV07cmV0dXJuIDA9PT0ocj1pJTMpPyhuKz1hW28+PjE4JjYzXSxuKz1hW28+PjEyJjYzXSxuKz1hW28+PjYmNjNdLG4rPWFbNjMmb10pOjI9PT1yPyhuKz1hW28+PjEwJjYzXSxuKz1hW28+PjQmNjNdLG4rPWFbbzw8MiY2M10sbis9YVs2NF0pOjE9PT1yJiYobis9YVtvPj4yJjYzXSxuKz1hW288PDQmNjNdLG4rPWFbNjRdLG4rPWFbNjRdKSxufX0pLEJ0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksa3Q9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgTXQ9bmV3IHN0KCJ0YWc6eWFtbC5vcmcsMjAwMjpvbWFwIix7a2luZDoic2VxdWVuY2UiLHJlc29sdmU6ZnVuY3Rpb24gcmVzb2x2ZVlhbWxPbWFwKHQpe2lmKG51bGw9PT10KXJldHVybiEwO3ZhciBlLHIsbixvLGksYT1bXSxzPXQ7Zm9yKGU9MCxyPXMubGVuZ3RoO2U8cjtlKz0xKXtpZihuPXNbZV0saT0hMSwiW29iamVjdCBPYmplY3RdIiE9PWt0LmNhbGwobikpcmV0dXJuITE7Zm9yKG8gaW4gbilpZihCdC5jYWxsKG4sbykpe2lmKGkpcmV0dXJuITE7aT0hMH1pZighaSlyZXR1cm4hMTtpZigtMSE9PWEuaW5kZXhPZihvKSlyZXR1cm4hMTthLnB1c2gobyl9cmV0dXJuITB9LGNvbnN0cnVjdDpmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sT21hcCh0KXtyZXR1cm4gbnVsbCE9PXQ/dDpbXX19KSxDdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBqdD1uZXcgc3QoInRhZzp5YW1sLm9yZywyMDAyOnBhaXJzIix7a2luZDoic2VxdWVuY2UiLHJlc29sdmU6ZnVuY3Rpb24gcmVzb2x2ZVlhbWxQYWlycyh0KXtpZihudWxsPT09dClyZXR1cm4hMDt2YXIgZSxyLG4sbyxpLGE9dDtmb3IoaT1uZXcgQXJyYXkoYS5sZW5ndGgpLGU9MCxyPWEubGVuZ3RoO2U8cjtlKz0xKXtpZihuPWFbZV0sIltvYmplY3QgT2JqZWN0XSIhPT1DdC5jYWxsKG4pKXJldHVybiExO2lmKDEhPT0obz1PYmplY3Qua2V5cyhuKSkubGVuZ3RoKXJldHVybiExO2lbZV09W29bMF0sbltvWzBdXV19cmV0dXJuITB9LGNvbnN0cnVjdDpmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sUGFpcnModCl7aWYobnVsbD09PXQpcmV0dXJuW107dmFyIGUscixuLG8saSxhPXQ7Zm9yKGk9bmV3IEFycmF5KGEubGVuZ3RoKSxlPTAscj1hLmxlbmd0aDtlPHI7ZSs9MSluPWFbZV0sbz1PYmplY3Qua2V5cyhuKSxpW2VdPVtvWzBdLG5bb1swXV1dO3JldHVybiBpfX0pLHF0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEx0PW5ldyBzdCgidGFnOnlhbWwub3JnLDIwMDI6c2V0Iix7a2luZDoibWFwcGluZyIscmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlWWFtbFNldCh0KXtpZihudWxsPT09dClyZXR1cm4hMDt2YXIgZSxyPXQ7Zm9yKGUgaW4gcilpZihxdC5jYWxsKHIsZSkmJm51bGwhPT1yW2VdKXJldHVybiExO3JldHVybiEwfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24gY29uc3RydWN0WWFtbFNldCh0KXtyZXR1cm4gbnVsbCE9PXQ/dDp7fX19KSxOdD1TdC5leHRlbmQoe2ltcGxpY2l0Olt4dCxFdF0sZXhwbGljaXQ6W090LE10LGp0LEx0XX0pLFR0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksUHQ9L1tceDAwLVx4MDhceDBCXHgwQ1x4MEUtXHgxRlx4N0YtXHg4NFx4ODYtXHg5Rlx1RkZGRVx1RkZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdLyxSdD0vW1x4ODVcdTIwMjhcdTIwMjldLyxGdD0vWyxcW1xdXHtcfV0vLFV0PS9eKD86IXwhIXwhW2EtelwtXSshKSQvaSxEdD0vXig/OiF8W14sXFtcXVx7XH1dKSg/OiVbMC05YS1mXXsyfXxbMC05YS16XC0jO1wvXD86QCY9XCtcJCxfXC4hflwqJ1woXClcW1xdXSkqJC9pO2Z1bmN0aW9uIF9jbGFzcyh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGlzX0VPTCh0KXtyZXR1cm4gMTA9PT10fHwxMz09PXR9ZnVuY3Rpb24gaXNfV0hJVEVfU1BBQ0UodCl7cmV0dXJuIDk9PT10fHwzMj09PXR9ZnVuY3Rpb24gaXNfV1NfT1JfRU9MKHQpe3JldHVybiA5PT09dHx8MzI9PT10fHwxMD09PXR8fDEzPT09dH1mdW5jdGlvbiBpc19GTE9XX0lORElDQVRPUih0KXtyZXR1cm4gNDQ9PT10fHw5MT09PXR8fDkzPT09dHx8MTIzPT09dHx8MTI1PT09dH1mdW5jdGlvbiBmcm9tSGV4Q29kZSh0KXt2YXIgZTtyZXR1cm4gNDg8PXQmJnQ8PTU3P3QtNDg6OTc8PShlPTMyfHQpJiZlPD0xMDI/ZS05NysxMDotMX1mdW5jdGlvbiBzaW1wbGVFc2NhcGVTZXF1ZW5jZSh0KXtyZXR1cm4gNDg9PT10PyJcMCI6OTc9PT10PyIHIjo5OD09PXQ/IlxiIjoxMTY9PT10fHw5PT09dD8iXHQiOjExMD09PXQ/IlxuIjoxMTg9PT10PyJcdiI6MTAyPT09dD8iXGYiOjExND09PXQ/IlxyIjoxMDE9PT10PyIbIjozMj09PXQ/IiAiOjM0PT09dD8nIic6NDc9PT10PyIvIjo5Mj09PXQ/IlxcIjo3OD09PXQ/IsKFIjo5NT09PXQ/IsKgIjo3Nj09PXQ/Ilx1MjAyOCI6ODA9PT10PyJcdTIwMjkiOiIifWZ1bmN0aW9uIGNoYXJGcm9tQ29kZXBvaW50KHQpe3JldHVybiB0PD02NTUzNT9TdHJpbmcuZnJvbUNoYXJDb2RlKHQpOlN0cmluZy5mcm9tQ2hhckNvZGUoNTUyOTYrKHQtNjU1MzY+PjEwKSw1NjMyMCsodC02NTUzNiYxMDIzKSl9ZnVuY3Rpb24gc2V0UHJvcGVydHkodCxlLHIpeyJfX3Byb3RvX18iPT09ZT9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpyfSk6dFtlXT1yfWZvcih2YXIgenQ9bmV3IEFycmF5KDI1NiksV3Q9bmV3IEFycmF5KDI1NiksVnQ9MDtWdDwyNTY7VnQrKyl6dFtWdF09c2ltcGxlRXNjYXBlU2VxdWVuY2UoVnQpPzE6MCxXdFtWdF09c2ltcGxlRXNjYXBlU2VxdWVuY2UoVnQpO2Z1bmN0aW9uIFN0YXRlJDEodCxlKXt0aGlzLmlucHV0PXQsdGhpcy5maWxlbmFtZT1lLmZpbGVuYW1lfHxudWxsLHRoaXMuc2NoZW1hPWUuc2NoZW1hfHxOdCx0aGlzLm9uV2FybmluZz1lLm9uV2FybmluZ3x8bnVsbCx0aGlzLmxlZ2FjeT1lLmxlZ2FjeXx8ITEsdGhpcy5qc29uPWUuanNvbnx8ITEsdGhpcy5saXN0ZW5lcj1lLmxpc3RlbmVyfHxudWxsLHRoaXMuaW1wbGljaXRUeXBlcz10aGlzLnNjaGVtYS5jb21waWxlZEltcGxpY2l0LHRoaXMudHlwZU1hcD10aGlzLnNjaGVtYS5jb21waWxlZFR5cGVNYXAsdGhpcy5sZW5ndGg9dC5sZW5ndGgsdGhpcy5wb3NpdGlvbj0wLHRoaXMubGluZT0wLHRoaXMubGluZVN0YXJ0PTAsdGhpcy5saW5lSW5kZW50PTAsdGhpcy5maXJzdFRhYkluTGluZT0tMSx0aGlzLmRvY3VtZW50cz1bXX1mdW5jdGlvbiBnZW5lcmF0ZUVycm9yKHQsZSl7dmFyIHI9e25hbWU6dC5maWxlbmFtZSxidWZmZXI6dC5pbnB1dC5zbGljZSgwLC0xKSxwb3NpdGlvbjp0LnBvc2l0aW9uLGxpbmU6dC5saW5lLGNvbHVtbjp0LnBvc2l0aW9uLXQubGluZVN0YXJ0fTtyZXR1cm4gci5zbmlwcGV0PW90KHIpLG5ldyBudChlLHIpfWZ1bmN0aW9uIHRocm93RXJyb3IodCxlKXt0aHJvdyBnZW5lcmF0ZUVycm9yKHQsZSl9ZnVuY3Rpb24gdGhyb3dXYXJuaW5nKHQsZSl7dC5vbldhcm5pbmcmJnQub25XYXJuaW5nLmNhbGwobnVsbCxnZW5lcmF0ZUVycm9yKHQsZSkpfXZhciBLdD17WUFNTDpmdW5jdGlvbiBoYW5kbGVZYW1sRGlyZWN0aXZlKHQsZSxyKXt2YXIgbixvLGk7bnVsbCE9PXQudmVyc2lvbiYmdGhyb3dFcnJvcih0LCJkdXBsaWNhdGlvbiBvZiAlWUFNTCBkaXJlY3RpdmUiKSwxIT09ci5sZW5ndGgmJnRocm93RXJyb3IodCwiWUFNTCBkaXJlY3RpdmUgYWNjZXB0cyBleGFjdGx5IG9uZSBhcmd1bWVudCIpLG51bGw9PT0obj0vXihbMC05XSspXC4oWzAtOV0rKSQvLmV4ZWMoclswXSkpJiZ0aHJvd0Vycm9yKHQsImlsbC1mb3JtZWQgYXJndW1lbnQgb2YgdGhlIFlBTUwgZGlyZWN0aXZlIiksbz1wYXJzZUludChuWzFdLDEwKSxpPXBhcnNlSW50KG5bMl0sMTApLDEhPT1vJiZ0aHJvd0Vycm9yKHQsInVuYWNjZXB0YWJsZSBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IiksdC52ZXJzaW9uPXJbMF0sdC5jaGVja0xpbmVCcmVha3M9aTwyLDEhPT1pJiYyIT09aSYmdGhyb3dXYXJuaW5nKHQsInVuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQiKX0sVEFHOmZ1bmN0aW9uIGhhbmRsZVRhZ0RpcmVjdGl2ZSh0LGUscil7dmFyIG4sbzsyIT09ci5sZW5ndGgmJnRocm93RXJyb3IodCwiVEFHIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cyIpLG49clswXSxvPXJbMV0sVXQudGVzdChuKXx8dGhyb3dFcnJvcih0LCJpbGwtZm9ybWVkIHRhZyBoYW5kbGUgKGZpcnN0IGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZSIpLFR0LmNhbGwodC50YWdNYXAsbikmJnRocm93RXJyb3IodCwndGhlcmUgaXMgYSBwcmV2aW91c2x5IGRlY2xhcmVkIHN1ZmZpeCBmb3IgIicrbisnIiB0YWcgaGFuZGxlJyksRHQudGVzdChvKXx8dGhyb3dFcnJvcih0LCJpbGwtZm9ybWVkIHRhZyBwcmVmaXggKHNlY29uZCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUiKTt0cnl7bz1kZWNvZGVVUklDb21wb25lbnQobyl9Y2F0Y2goZSl7dGhyb3dFcnJvcih0LCJ0YWcgcHJlZml4IGlzIG1hbGZvcm1lZDogIitvKX10LnRhZ01hcFtuXT1vfX07ZnVuY3Rpb24gY2FwdHVyZVNlZ21lbnQodCxlLHIsbil7dmFyIG8saSxhLHM7aWYoZTxyKXtpZihzPXQuaW5wdXQuc2xpY2UoZSxyKSxuKWZvcihvPTAsaT1zLmxlbmd0aDtvPGk7bys9MSk5PT09KGE9cy5jaGFyQ29kZUF0KG8pKXx8MzI8PWEmJmE8PTExMTQxMTF8fHRocm93RXJyb3IodCwiZXhwZWN0ZWQgdmFsaWQgSlNPTiBjaGFyYWN0ZXIiKTtlbHNlIFB0LnRlc3QocykmJnRocm93RXJyb3IodCwidGhlIHN0cmVhbSBjb250YWlucyBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMiKTt0LnJlc3VsdCs9c319ZnVuY3Rpb24gbWVyZ2VNYXBwaW5ncyh0LGUscixuKXt2YXIgbyxpLGEscztmb3IocnQuaXNPYmplY3Qocil8fHRocm93RXJyb3IodCwiY2Fubm90IG1lcmdlIG1hcHBpbmdzOyB0aGUgcHJvdmlkZWQgc291cmNlIG9iamVjdCBpcyB1bmFjY2VwdGFibGUiKSxhPTAscz0obz1PYmplY3Qua2V5cyhyKSkubGVuZ3RoO2E8czthKz0xKWk9b1thXSxUdC5jYWxsKGUsaSl8fChzZXRQcm9wZXJ0eShlLGkscltpXSksbltpXT0hMCl9ZnVuY3Rpb24gc3RvcmVNYXBwaW5nUGFpcih0LGUscixuLG8saSxhLHMsdSl7dmFyIGMsZjtpZihBcnJheS5pc0FycmF5KG8pKWZvcihjPTAsZj0obz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvKSkubGVuZ3RoO2M8ZjtjKz0xKUFycmF5LmlzQXJyYXkob1tjXSkmJnRocm93RXJyb3IodCwibmVzdGVkIGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCBpbnNpZGUga2V5cyIpLCJvYmplY3QiPT10eXBlb2YgbyYmIltvYmplY3QgT2JqZWN0XSI9PT1fY2xhc3Mob1tjXSkmJihvW2NdPSJbb2JqZWN0IE9iamVjdF0iKTtpZigib2JqZWN0Ij09dHlwZW9mIG8mJiJbb2JqZWN0IE9iamVjdF0iPT09X2NsYXNzKG8pJiYobz0iW29iamVjdCBPYmplY3RdIiksbz1TdHJpbmcobyksbnVsbD09PWUmJihlPXt9KSwidGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UiPT09bilpZihBcnJheS5pc0FycmF5KGkpKWZvcihjPTAsZj1pLmxlbmd0aDtjPGY7Yys9MSltZXJnZU1hcHBpbmdzKHQsZSxpW2NdLHIpO2Vsc2UgbWVyZ2VNYXBwaW5ncyh0LGUsaSxyKTtlbHNlIHQuanNvbnx8VHQuY2FsbChyLG8pfHwhVHQuY2FsbChlLG8pfHwodC5saW5lPWF8fHQubGluZSx0LmxpbmVTdGFydD1zfHx0LmxpbmVTdGFydCx0LnBvc2l0aW9uPXV8fHQucG9zaXRpb24sdGhyb3dFcnJvcih0LCJkdXBsaWNhdGVkIG1hcHBpbmcga2V5IikpLHNldFByb3BlcnR5KGUsbyxpKSxkZWxldGUgcltvXTtyZXR1cm4gZX1mdW5jdGlvbiByZWFkTGluZUJyZWFrKHQpe3ZhciBlOzEwPT09KGU9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKT90LnBvc2l0aW9uKys6MTM9PT1lPyh0LnBvc2l0aW9uKyssMTA9PT10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikmJnQucG9zaXRpb24rKyk6dGhyb3dFcnJvcih0LCJhIGxpbmUgYnJlYWsgaXMgZXhwZWN0ZWQiKSx0LmxpbmUrPTEsdC5saW5lU3RhcnQ9dC5wb3NpdGlvbix0LmZpcnN0VGFiSW5MaW5lPS0xfWZ1bmN0aW9uIHNraXBTZXBhcmF0aW9uU3BhY2UodCxlLHIpe2Zvcih2YXIgbj0wLG89dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pOzAhPT1vOyl7Zm9yKDtpc19XSElURV9TUEFDRShvKTspOT09PW8mJi0xPT09dC5maXJzdFRhYkluTGluZSYmKHQuZmlyc3RUYWJJbkxpbmU9dC5wb3NpdGlvbiksbz10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKTtpZihlJiYzNT09PW8pZG97bz10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKX13aGlsZSgxMCE9PW8mJjEzIT09byYmMCE9PW8pO2lmKCFpc19FT0wobykpYnJlYWs7Zm9yKHJlYWRMaW5lQnJlYWsodCksbz10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbiksbisrLHQubGluZUluZGVudD0wOzMyPT09bzspdC5saW5lSW5kZW50Kyssbz10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKX1yZXR1cm4tMSE9PXImJjAhPT1uJiZ0LmxpbmVJbmRlbnQ8ciYmdGhyb3dXYXJuaW5nKHQsImRlZmljaWVudCBpbmRlbnRhdGlvbiIpLG59ZnVuY3Rpb24gdGVzdERvY3VtZW50U2VwYXJhdG9yKHQpe3ZhciBlLHI9dC5wb3NpdGlvbjtyZXR1cm4hKDQ1IT09KGU9dC5pbnB1dC5jaGFyQ29kZUF0KHIpKSYmNDYhPT1lfHxlIT09dC5pbnB1dC5jaGFyQ29kZUF0KHIrMSl8fGUhPT10LmlucHV0LmNoYXJDb2RlQXQocisyKXx8KHIrPTMsMCE9PShlPXQuaW5wdXQuY2hhckNvZGVBdChyKSkmJiFpc19XU19PUl9FT0woZSkpKX1mdW5jdGlvbiB3cml0ZUZvbGRlZExpbmVzKHQsZSl7MT09PWU/dC5yZXN1bHQrPSIgIjplPjEmJih0LnJlc3VsdCs9cnQucmVwZWF0KCJcbiIsZS0xKSl9ZnVuY3Rpb24gcmVhZEJsb2NrU2VxdWVuY2UodCxlKXt2YXIgcixuLG89dC50YWcsaT10LmFuY2hvcixhPVtdLHM9ITE7aWYoLTEhPT10LmZpcnN0VGFiSW5MaW5lKXJldHVybiExO2ZvcihudWxsIT09dC5hbmNob3ImJih0LmFuY2hvck1hcFt0LmFuY2hvcl09YSksbj10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbik7MCE9PW4mJigtMSE9PXQuZmlyc3RUYWJJbkxpbmUmJih0LnBvc2l0aW9uPXQuZmlyc3RUYWJJbkxpbmUsdGhyb3dFcnJvcih0LCJ0YWIgY2hhcmFjdGVycyBtdXN0IG5vdCBiZSB1c2VkIGluIGluZGVudGF0aW9uIikpLDQ1PT09bikmJmlzX1dTX09SX0VPTCh0LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbisxKSk7KWlmKHM9ITAsdC5wb3NpdGlvbisrLHNraXBTZXBhcmF0aW9uU3BhY2UodCwhMCwtMSkmJnQubGluZUluZGVudDw9ZSlhLnB1c2gobnVsbCksbj10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbik7ZWxzZSBpZihyPXQubGluZSxjb21wb3NlTm9kZSh0LGUsMywhMSwhMCksYS5wdXNoKHQucmVzdWx0KSxza2lwU2VwYXJhdGlvblNwYWNlKHQsITAsLTEpLG49dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pLCh0LmxpbmU9PT1yfHx0LmxpbmVJbmRlbnQ+ZSkmJjAhPT1uKXRocm93RXJyb3IodCwiYmFkIGluZGVudGF0aW9uIG9mIGEgc2VxdWVuY2UgZW50cnkiKTtlbHNlIGlmKHQubGluZUluZGVudDxlKWJyZWFrO3JldHVybiEhcyYmKHQudGFnPW8sdC5hbmNob3I9aSx0LmtpbmQ9InNlcXVlbmNlIix0LnJlc3VsdD1hLCEwKX1mdW5jdGlvbiByZWFkVGFnUHJvcGVydHkodCl7dmFyIGUscixuLG8saT0hMSxhPSExO2lmKDMzIT09KG89dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKSlyZXR1cm4hMTtpZihudWxsIT09dC50YWcmJnRocm93RXJyb3IodCwiZHVwbGljYXRpb24gb2YgYSB0YWcgcHJvcGVydHkiKSw2MD09PShvPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pKT8oaT0hMCxvPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pKTozMz09PW8/KGE9ITAscj0iISEiLG89dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbikpOnI9IiEiLGU9dC5wb3NpdGlvbixpKXtkb3tvPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pfXdoaWxlKDAhPT1vJiY2MiE9PW8pO3QucG9zaXRpb248dC5sZW5ndGg/KG49dC5pbnB1dC5zbGljZShlLHQucG9zaXRpb24pLG89dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbikpOnRocm93RXJyb3IodCwidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSB2ZXJiYXRpbSB0YWciKX1lbHNle2Zvcig7MCE9PW8mJiFpc19XU19PUl9FT0wobyk7KTMzPT09byYmKGE/dGhyb3dFcnJvcih0LCJ0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGV4Y2xhbWF0aW9uIG1hcmtzIik6KHI9dC5pbnB1dC5zbGljZShlLTEsdC5wb3NpdGlvbisxKSxVdC50ZXN0KHIpfHx0aHJvd0Vycm9yKHQsIm5hbWVkIHRhZyBoYW5kbGUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzIiksYT0hMCxlPXQucG9zaXRpb24rMSkpLG89dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbik7bj10LmlucHV0LnNsaWNlKGUsdC5wb3NpdGlvbiksRnQudGVzdChuKSYmdGhyb3dFcnJvcih0LCJ0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGZsb3cgaW5kaWNhdG9yIGNoYXJhY3RlcnMiKX1uJiYhRHQudGVzdChuKSYmdGhyb3dFcnJvcih0LCJ0YWcgbmFtZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnM6ICIrbik7dHJ5e249ZGVjb2RlVVJJQ29tcG9uZW50KG4pfWNhdGNoKGUpe3Rocm93RXJyb3IodCwidGFnIG5hbWUgaXMgbWFsZm9ybWVkOiAiK24pfXJldHVybiBpP3QudGFnPW46VHQuY2FsbCh0LnRhZ01hcCxyKT90LnRhZz10LnRhZ01hcFtyXStuOiIhIj09PXI/dC50YWc9IiEiK246IiEhIj09PXI/dC50YWc9InRhZzp5YW1sLm9yZywyMDAyOiIrbjp0aHJvd0Vycm9yKHQsJ3VuZGVjbGFyZWQgdGFnIGhhbmRsZSAiJytyKyciJyksITB9ZnVuY3Rpb24gcmVhZEFuY2hvclByb3BlcnR5KHQpe3ZhciBlLHI7aWYoMzghPT0ocj10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikpKXJldHVybiExO2ZvcihudWxsIT09dC5hbmNob3ImJnRocm93RXJyb3IodCwiZHVwbGljYXRpb24gb2YgYW4gYW5jaG9yIHByb3BlcnR5Iikscj10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKSxlPXQucG9zaXRpb247MCE9PXImJiFpc19XU19PUl9FT0wocikmJiFpc19GTE9XX0lORElDQVRPUihyKTspcj10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKTtyZXR1cm4gdC5wb3NpdGlvbj09PWUmJnRocm93RXJyb3IodCwibmFtZSBvZiBhbiBhbmNob3Igbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlciIpLHQuYW5jaG9yPXQuaW5wdXQuc2xpY2UoZSx0LnBvc2l0aW9uKSwhMH1mdW5jdGlvbiBjb21wb3NlTm9kZSh0LGUscixuLG8pe3ZhciBpLGEscyx1LGMsZixsLHAsaCxkPTEseT0hMSxfPSExO2lmKG51bGwhPT10Lmxpc3RlbmVyJiZ0Lmxpc3RlbmVyKCJvcGVuIix0KSx0LnRhZz1udWxsLHQuYW5jaG9yPW51bGwsdC5raW5kPW51bGwsdC5yZXN1bHQ9bnVsbCxpPWE9cz00PT09cnx8Mz09PXIsbiYmc2tpcFNlcGFyYXRpb25TcGFjZSh0LCEwLC0xKSYmKHk9ITAsdC5saW5lSW5kZW50PmU/ZD0xOnQubGluZUluZGVudD09PWU/ZD0wOnQubGluZUluZGVudDxlJiYoZD0tMSkpLDE9PT1kKWZvcig7cmVhZFRhZ1Byb3BlcnR5KHQpfHxyZWFkQW5jaG9yUHJvcGVydHkodCk7KXNraXBTZXBhcmF0aW9uU3BhY2UodCwhMCwtMSk/KHk9ITAscz1pLHQubGluZUluZGVudD5lP2Q9MTp0LmxpbmVJbmRlbnQ9PT1lP2Q9MDp0LmxpbmVJbmRlbnQ8ZSYmKGQ9LTEpKTpzPSExO2lmKHMmJihzPXl8fG8pLDEhPT1kJiY0IT09cnx8KHA9MT09PXJ8fDI9PT1yP2U6ZSsxLGg9dC5wb3NpdGlvbi10LmxpbmVTdGFydCwxPT09ZD9zJiYocmVhZEJsb2NrU2VxdWVuY2UodCxoKXx8ZnVuY3Rpb24gcmVhZEJsb2NrTWFwcGluZyh0LGUscil7dmFyIG4sbyxpLGEscyx1LGMsZj10LnRhZyxsPXQuYW5jaG9yLHA9e30saD1PYmplY3QuY3JlYXRlKG51bGwpLGQ9bnVsbCx5PW51bGwsXz1udWxsLGc9ITEsbT0hMTtpZigtMSE9PXQuZmlyc3RUYWJJbkxpbmUpcmV0dXJuITE7Zm9yKG51bGwhPT10LmFuY2hvciYmKHQuYW5jaG9yTWFwW3QuYW5jaG9yXT1wKSxjPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKTswIT09Yzspe2lmKGd8fC0xPT09dC5maXJzdFRhYkluTGluZXx8KHQucG9zaXRpb249dC5maXJzdFRhYkluTGluZSx0aHJvd0Vycm9yKHQsInRhYiBjaGFyYWN0ZXJzIG11c3Qgbm90IGJlIHVzZWQgaW4gaW5kZW50YXRpb24iKSksbj10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbisxKSxpPXQubGluZSw2MyE9PWMmJjU4IT09Y3x8IWlzX1dTX09SX0VPTChuKSl7aWYoYT10LmxpbmUscz10LmxpbmVTdGFydCx1PXQucG9zaXRpb24sIWNvbXBvc2VOb2RlKHQsciwyLCExLCEwKSlicmVhaztpZih0LmxpbmU9PT1pKXtmb3IoYz10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbik7aXNfV0hJVEVfU1BBQ0UoYyk7KWM9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbik7aWYoNTg9PT1jKWlzX1dTX09SX0VPTChjPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pKXx8dGhyb3dFcnJvcih0LCJhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmciKSxnJiYoc3RvcmVNYXBwaW5nUGFpcih0LHAsaCxkLHksbnVsbCxhLHMsdSksZD15PV89bnVsbCksbT0hMCxnPSExLG89ITEsZD10LnRhZyx5PXQucmVzdWx0O2Vsc2V7aWYoIW0pcmV0dXJuIHQudGFnPWYsdC5hbmNob3I9bCwhMDt0aHJvd0Vycm9yKHQsImNhbiBub3QgcmVhZCBhbiBpbXBsaWNpdCBtYXBwaW5nIHBhaXI7IGEgY29sb24gaXMgbWlzc2VkIil9fWVsc2V7aWYoIW0pcmV0dXJuIHQudGFnPWYsdC5hbmNob3I9bCwhMDt0aHJvd0Vycm9yKHQsImNhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleSIpfX1lbHNlIDYzPT09Yz8oZyYmKHN0b3JlTWFwcGluZ1BhaXIodCxwLGgsZCx5LG51bGwsYSxzLHUpLGQ9eT1fPW51bGwpLG09ITAsZz0hMCxvPSEwKTpnPyhnPSExLG89ITApOnRocm93RXJyb3IodCwiaW5jb21wbGV0ZSBleHBsaWNpdCBtYXBwaW5nIHBhaXI7IGEga2V5IG5vZGUgaXMgbWlzc2VkOyBvciBmb2xsb3dlZCBieSBhIG5vbi10YWJ1bGF0ZWQgZW1wdHkgbGluZSIpLHQucG9zaXRpb24rPTEsYz1uO2lmKCh0LmxpbmU9PT1pfHx0LmxpbmVJbmRlbnQ+ZSkmJihnJiYoYT10LmxpbmUscz10LmxpbmVTdGFydCx1PXQucG9zaXRpb24pLGNvbXBvc2VOb2RlKHQsZSw0LCEwLG8pJiYoZz95PXQucmVzdWx0Ol89dC5yZXN1bHQpLGd8fChzdG9yZU1hcHBpbmdQYWlyKHQscCxoLGQseSxfLGEscyx1KSxkPXk9Xz1udWxsKSxza2lwU2VwYXJhdGlvblNwYWNlKHQsITAsLTEpLGM9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKSwodC5saW5lPT09aXx8dC5saW5lSW5kZW50PmUpJiYwIT09Yyl0aHJvd0Vycm9yKHQsImJhZCBpbmRlbnRhdGlvbiBvZiBhIG1hcHBpbmcgZW50cnkiKTtlbHNlIGlmKHQubGluZUluZGVudDxlKWJyZWFrfXJldHVybiBnJiZzdG9yZU1hcHBpbmdQYWlyKHQscCxoLGQseSxudWxsLGEscyx1KSxtJiYodC50YWc9Zix0LmFuY2hvcj1sLHQua2luZD0ibWFwcGluZyIsdC5yZXN1bHQ9cCksbX0odCxoLHApKXx8ZnVuY3Rpb24gcmVhZEZsb3dDb2xsZWN0aW9uKHQsZSl7dmFyIHIsbixvLGksYSxzLHUsYyxmLGwscCxoLGQ9ITAseT10LnRhZyxfPXQuYW5jaG9yLGc9T2JqZWN0LmNyZWF0ZShudWxsKTtpZig5MT09PShoPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKSkpYT05MyxjPSExLGk9W107ZWxzZXtpZigxMjMhPT1oKXJldHVybiExO2E9MTI1LGM9ITAsaT17fX1mb3IobnVsbCE9PXQuYW5jaG9yJiYodC5hbmNob3JNYXBbdC5hbmNob3JdPWkpLGg9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbik7MCE9PWg7KXtpZihza2lwU2VwYXJhdGlvblNwYWNlKHQsITAsZSksKGg9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKT09PWEpcmV0dXJuIHQucG9zaXRpb24rKyx0LnRhZz15LHQuYW5jaG9yPV8sdC5raW5kPWM/Im1hcHBpbmciOiJzZXF1ZW5jZSIsdC5yZXN1bHQ9aSwhMDtkPzQ0PT09aCYmdGhyb3dFcnJvcih0LCJleHBlY3RlZCB0aGUgbm9kZSBjb250ZW50LCBidXQgZm91bmQgJywnIik6dGhyb3dFcnJvcih0LCJtaXNzZWQgY29tbWEgYmV0d2VlbiBmbG93IGNvbGxlY3Rpb24gZW50cmllcyIpLHA9bnVsbCxzPXU9ITEsNjM9PT1oJiZpc19XU19PUl9FT0wodC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24rMSkpJiYocz11PSEwLHQucG9zaXRpb24rKyxza2lwU2VwYXJhdGlvblNwYWNlKHQsITAsZSkpLHI9dC5saW5lLG49dC5saW5lU3RhcnQsbz10LnBvc2l0aW9uLGNvbXBvc2VOb2RlKHQsZSwxLCExLCEwKSxsPXQudGFnLGY9dC5yZXN1bHQsc2tpcFNlcGFyYXRpb25TcGFjZSh0LCEwLGUpLGg9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pLCF1JiZ0LmxpbmUhPT1yfHw1OCE9PWh8fChzPSEwLGg9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbiksc2tpcFNlcGFyYXRpb25TcGFjZSh0LCEwLGUpLGNvbXBvc2VOb2RlKHQsZSwxLCExLCEwKSxwPXQucmVzdWx0KSxjP3N0b3JlTWFwcGluZ1BhaXIodCxpLGcsbCxmLHAscixuLG8pOnM/aS5wdXNoKHN0b3JlTWFwcGluZ1BhaXIodCxudWxsLGcsbCxmLHAscixuLG8pKTppLnB1c2goZiksc2tpcFNlcGFyYXRpb25TcGFjZSh0LCEwLGUpLDQ0PT09KGg9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKT8oZD0hMCxoPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pKTpkPSExfXRocm93RXJyb3IodCwidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24iKX0odCxwKT9fPSEwOihhJiZmdW5jdGlvbiByZWFkQmxvY2tTY2FsYXIodCxlKXt2YXIgcixuLG8saSxhLHM9MSx1PSExLGM9ITEsZj1lLGw9MCxwPSExO2lmKDEyND09PShpPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKSkpbj0hMTtlbHNle2lmKDYyIT09aSlyZXR1cm4hMTtuPSEwfWZvcih0LmtpbmQ9InNjYWxhciIsdC5yZXN1bHQ9IiI7MCE9PWk7KWlmKDQzPT09KGk9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbikpfHw0NT09PWkpMT09PXM/cz00Mz09PWk/MzoyOnRocm93RXJyb3IodCwicmVwZWF0IG9mIGEgY2hvbXBpbmcgbW9kZSBpZGVudGlmaWVyIik7ZWxzZXtpZighKChvPTQ4PD0oYT1pKSYmYTw9NTc/YS00ODotMSk+PTApKWJyZWFrOzA9PT1vP3Rocm93RXJyb3IodCwiYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZSIpOmM/dGhyb3dFcnJvcih0LCJyZXBlYXQgb2YgYW4gaW5kZW50YXRpb24gd2lkdGggaWRlbnRpZmllciIpOihmPWUrby0xLGM9ITApfWlmKGlzX1dISVRFX1NQQUNFKGkpKXtkb3tpPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pfXdoaWxlKGlzX1dISVRFX1NQQUNFKGkpKTtpZigzNT09PWkpZG97aT10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKX13aGlsZSghaXNfRU9MKGkpJiYwIT09aSl9Zm9yKDswIT09aTspe2ZvcihyZWFkTGluZUJyZWFrKHQpLHQubGluZUluZGVudD0wLGk9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pOyghY3x8dC5saW5lSW5kZW50PGYpJiYzMj09PWk7KXQubGluZUluZGVudCsrLGk9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbik7aWYoIWMmJnQubGluZUluZGVudD5mJiYoZj10LmxpbmVJbmRlbnQpLGlzX0VPTChpKSlsKys7ZWxzZXtpZih0LmxpbmVJbmRlbnQ8Zil7Mz09PXM/dC5yZXN1bHQrPXJ0LnJlcGVhdCgiXG4iLHU/MStsOmwpOjE9PT1zJiZ1JiYodC5yZXN1bHQrPSJcbiIpO2JyZWFrfWZvcihuP2lzX1dISVRFX1NQQUNFKGkpPyhwPSEwLHQucmVzdWx0Kz1ydC5yZXBlYXQoIlxuIix1PzErbDpsKSk6cD8ocD0hMSx0LnJlc3VsdCs9cnQucmVwZWF0KCJcbiIsbCsxKSk6MD09PWw/dSYmKHQucmVzdWx0Kz0iICIpOnQucmVzdWx0Kz1ydC5yZXBlYXQoIlxuIixsKTp0LnJlc3VsdCs9cnQucmVwZWF0KCJcbiIsdT8xK2w6bCksdT0hMCxjPSEwLGw9MCxyPXQucG9zaXRpb247IWlzX0VPTChpKSYmMCE9PWk7KWk9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbik7Y2FwdHVyZVNlZ21lbnQodCxyLHQucG9zaXRpb24sITEpfX1yZXR1cm4hMH0odCxwKXx8ZnVuY3Rpb24gcmVhZFNpbmdsZVF1b3RlZFNjYWxhcih0LGUpe3ZhciByLG4sbztpZigzOSE9PShyPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKSkpcmV0dXJuITE7Zm9yKHQua2luZD0ic2NhbGFyIix0LnJlc3VsdD0iIix0LnBvc2l0aW9uKyssbj1vPXQucG9zaXRpb247MCE9PShyPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKSk7KWlmKDM5PT09cil7aWYoY2FwdHVyZVNlZ21lbnQodCxuLHQucG9zaXRpb24sITApLDM5IT09KHI9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbikpKXJldHVybiEwO249dC5wb3NpdGlvbix0LnBvc2l0aW9uKyssbz10LnBvc2l0aW9ufWVsc2UgaXNfRU9MKHIpPyhjYXB0dXJlU2VnbWVudCh0LG4sbywhMCksd3JpdGVGb2xkZWRMaW5lcyh0LHNraXBTZXBhcmF0aW9uU3BhY2UodCwhMSxlKSksbj1vPXQucG9zaXRpb24pOnQucG9zaXRpb249PT10LmxpbmVTdGFydCYmdGVzdERvY3VtZW50U2VwYXJhdG9yKHQpP3Rocm93RXJyb3IodCwidW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyIik6KHQucG9zaXRpb24rKyxvPXQucG9zaXRpb24pO3Rocm93RXJyb3IodCwidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhciIpfSh0LHApfHxmdW5jdGlvbiByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHQsZSl7dmFyIHIsbixvLGksYSxzLHU7aWYoMzQhPT0ocz10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikpKXJldHVybiExO2Zvcih0LmtpbmQ9InNjYWxhciIsdC5yZXN1bHQ9IiIsdC5wb3NpdGlvbisrLHI9bj10LnBvc2l0aW9uOzAhPT0ocz10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikpOyl7aWYoMzQ9PT1zKXJldHVybiBjYXB0dXJlU2VnbWVudCh0LHIsdC5wb3NpdGlvbiwhMCksdC5wb3NpdGlvbisrLCEwO2lmKDkyPT09cyl7aWYoY2FwdHVyZVNlZ21lbnQodCxyLHQucG9zaXRpb24sITApLGlzX0VPTChzPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pKSlza2lwU2VwYXJhdGlvblNwYWNlKHQsITEsZSk7ZWxzZSBpZihzPDI1NiYmenRbc10pdC5yZXN1bHQrPVd0W3NdLHQucG9zaXRpb24rKztlbHNlIGlmKChhPTEyMD09PSh1PXMpPzI6MTE3PT09dT80Ojg1PT09dT84OjApPjApe2ZvcihvPWEsaT0wO28+MDtvLS0pKGE9ZnJvbUhleENvZGUocz10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKSkpPj0wP2k9KGk8PDQpK2E6dGhyb3dFcnJvcih0LCJleHBlY3RlZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIiKTt0LnJlc3VsdCs9Y2hhckZyb21Db2RlcG9pbnQoaSksdC5wb3NpdGlvbisrfWVsc2UgdGhyb3dFcnJvcih0LCJ1bmtub3duIGVzY2FwZSBzZXF1ZW5jZSIpO3I9bj10LnBvc2l0aW9ufWVsc2UgaXNfRU9MKHMpPyhjYXB0dXJlU2VnbWVudCh0LHIsbiwhMCksd3JpdGVGb2xkZWRMaW5lcyh0LHNraXBTZXBhcmF0aW9uU3BhY2UodCwhMSxlKSkscj1uPXQucG9zaXRpb24pOnQucG9zaXRpb249PT10LmxpbmVTdGFydCYmdGVzdERvY3VtZW50U2VwYXJhdG9yKHQpP3Rocm93RXJyb3IodCwidW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyIik6KHQucG9zaXRpb24rKyxuPXQucG9zaXRpb24pfXRocm93RXJyb3IodCwidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhciIpfSh0LHApP189ITA6IWZ1bmN0aW9uIHJlYWRBbGlhcyh0KXt2YXIgZSxyLG47aWYoNDIhPT0obj10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikpKXJldHVybiExO2ZvcihuPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pLGU9dC5wb3NpdGlvbjswIT09biYmIWlzX1dTX09SX0VPTChuKSYmIWlzX0ZMT1dfSU5ESUNBVE9SKG4pOyluPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pO3JldHVybiB0LnBvc2l0aW9uPT09ZSYmdGhyb3dFcnJvcih0LCJuYW1lIG9mIGFuIGFsaWFzIG5vZGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIiKSxyPXQuaW5wdXQuc2xpY2UoZSx0LnBvc2l0aW9uKSxUdC5jYWxsKHQuYW5jaG9yTWFwLHIpfHx0aHJvd0Vycm9yKHQsJ3VuaWRlbnRpZmllZCBhbGlhcyAiJytyKyciJyksdC5yZXN1bHQ9dC5hbmNob3JNYXBbcl0sc2tpcFNlcGFyYXRpb25TcGFjZSh0LCEwLC0xKSwhMH0odCk/ZnVuY3Rpb24gcmVhZFBsYWluU2NhbGFyKHQsZSxyKXt2YXIgbixvLGksYSxzLHUsYyxmLGw9dC5raW5kLHA9dC5yZXN1bHQ7aWYoaXNfV1NfT1JfRU9MKGY9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKXx8aXNfRkxPV19JTkRJQ0FUT1IoZil8fDM1PT09Znx8Mzg9PT1mfHw0Mj09PWZ8fDMzPT09Znx8MTI0PT09Znx8NjI9PT1mfHwzOT09PWZ8fDM0PT09Znx8Mzc9PT1mfHw2ND09PWZ8fDk2PT09ZilyZXR1cm4hMTtpZigoNjM9PT1mfHw0NT09PWYpJiYoaXNfV1NfT1JfRU9MKG49dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24rMSkpfHxyJiZpc19GTE9XX0lORElDQVRPUihuKSkpcmV0dXJuITE7Zm9yKHQua2luZD0ic2NhbGFyIix0LnJlc3VsdD0iIixvPWk9dC5wb3NpdGlvbixhPSExOzAhPT1mOyl7aWYoNTg9PT1mKXtpZihpc19XU19PUl9FT0wobj10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbisxKSl8fHImJmlzX0ZMT1dfSU5ESUNBVE9SKG4pKWJyZWFrfWVsc2UgaWYoMzU9PT1mKXtpZihpc19XU19PUl9FT0wodC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24tMSkpKWJyZWFrfWVsc2V7aWYodC5wb3NpdGlvbj09PXQubGluZVN0YXJ0JiZ0ZXN0RG9jdW1lbnRTZXBhcmF0b3IodCl8fHImJmlzX0ZMT1dfSU5ESUNBVE9SKGYpKWJyZWFrO2lmKGlzX0VPTChmKSl7aWYocz10LmxpbmUsdT10LmxpbmVTdGFydCxjPXQubGluZUluZGVudCxza2lwU2VwYXJhdGlvblNwYWNlKHQsITEsLTEpLHQubGluZUluZGVudD49ZSl7YT0hMCxmPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKTtjb250aW51ZX10LnBvc2l0aW9uPWksdC5saW5lPXMsdC5saW5lU3RhcnQ9dSx0LmxpbmVJbmRlbnQ9YzticmVha319YSYmKGNhcHR1cmVTZWdtZW50KHQsbyxpLCExKSx3cml0ZUZvbGRlZExpbmVzKHQsdC5saW5lLXMpLG89aT10LnBvc2l0aW9uLGE9ITEpLGlzX1dISVRFX1NQQUNFKGYpfHwoaT10LnBvc2l0aW9uKzEpLGY9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbil9cmV0dXJuIGNhcHR1cmVTZWdtZW50KHQsbyxpLCExKSwhIXQucmVzdWx0fHwodC5raW5kPWwsdC5yZXN1bHQ9cCwhMSl9KHQscCwxPT09cikmJihfPSEwLG51bGw9PT10LnRhZyYmKHQudGFnPSI/IikpOihfPSEwLG51bGw9PT10LnRhZyYmbnVsbD09PXQuYW5jaG9yfHx0aHJvd0Vycm9yKHQsImFsaWFzIG5vZGUgc2hvdWxkIG5vdCBoYXZlIGFueSBwcm9wZXJ0aWVzIikpLG51bGwhPT10LmFuY2hvciYmKHQuYW5jaG9yTWFwW3QuYW5jaG9yXT10LnJlc3VsdCkpOjA9PT1kJiYoXz1zJiZyZWFkQmxvY2tTZXF1ZW5jZSh0LGgpKSksbnVsbD09PXQudGFnKW51bGwhPT10LmFuY2hvciYmKHQuYW5jaG9yTWFwW3QuYW5jaG9yXT10LnJlc3VsdCk7ZWxzZSBpZigiPyI9PT10LnRhZyl7Zm9yKG51bGwhPT10LnJlc3VsdCYmInNjYWxhciIhPT10LmtpbmQmJnRocm93RXJyb3IodCwndW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITw/PiB0YWc7IGl0IHNob3VsZCBiZSAic2NhbGFyIiwgbm90ICInK3Qua2luZCsnIicpLHU9MCxjPXQuaW1wbGljaXRUeXBlcy5sZW5ndGg7dTxjO3UrPTEpaWYoKGw9dC5pbXBsaWNpdFR5cGVzW3VdKS5yZXNvbHZlKHQucmVzdWx0KSl7dC5yZXN1bHQ9bC5jb25zdHJ1Y3QodC5yZXN1bHQpLHQudGFnPWwudGFnLG51bGwhPT10LmFuY2hvciYmKHQuYW5jaG9yTWFwW3QuYW5jaG9yXT10LnJlc3VsdCk7YnJlYWt9fWVsc2UgaWYoIiEiIT09dC50YWcpe2lmKFR0LmNhbGwodC50eXBlTWFwW3Qua2luZHx8ImZhbGxiYWNrIl0sdC50YWcpKWw9dC50eXBlTWFwW3Qua2luZHx8ImZhbGxiYWNrIl1bdC50YWddO2Vsc2UgZm9yKGw9bnVsbCx1PTAsYz0oZj10LnR5cGVNYXAubXVsdGlbdC5raW5kfHwiZmFsbGJhY2siXSkubGVuZ3RoO3U8Yzt1Kz0xKWlmKHQudGFnLnNsaWNlKDAsZlt1XS50YWcubGVuZ3RoKT09PWZbdV0udGFnKXtsPWZbdV07YnJlYWt9bHx8dGhyb3dFcnJvcih0LCJ1bmtub3duIHRhZyAhPCIrdC50YWcrIj4iKSxudWxsIT09dC5yZXN1bHQmJmwua2luZCE9PXQua2luZCYmdGhyb3dFcnJvcih0LCJ1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPCIrdC50YWcrJz4gdGFnOyBpdCBzaG91bGQgYmUgIicrbC5raW5kKyciLCBub3QgIicrdC5raW5kKyciJyksbC5yZXNvbHZlKHQucmVzdWx0LHQudGFnKT8odC5yZXN1bHQ9bC5jb25zdHJ1Y3QodC5yZXN1bHQsdC50YWcpLG51bGwhPT10LmFuY2hvciYmKHQuYW5jaG9yTWFwW3QuYW5jaG9yXT10LnJlc3VsdCkpOnRocm93RXJyb3IodCwiY2Fubm90IHJlc29sdmUgYSBub2RlIHdpdGggITwiK3QudGFnKyI+IGV4cGxpY2l0IHRhZyIpfXJldHVybiBudWxsIT09dC5saXN0ZW5lciYmdC5saXN0ZW5lcigiY2xvc2UiLHQpLG51bGwhPT10LnRhZ3x8bnVsbCE9PXQuYW5jaG9yfHxffWZ1bmN0aW9uIHJlYWREb2N1bWVudCh0KXt2YXIgZSxyLG4sbyxpPXQucG9zaXRpb24sYT0hMTtmb3IodC52ZXJzaW9uPW51bGwsdC5jaGVja0xpbmVCcmVha3M9dC5sZWdhY3ksdC50YWdNYXA9T2JqZWN0LmNyZWF0ZShudWxsKSx0LmFuY2hvck1hcD1PYmplY3QuY3JlYXRlKG51bGwpOzAhPT0obz10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikpJiYoc2tpcFNlcGFyYXRpb25TcGFjZSh0LCEwLC0xKSxvPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKSwhKHQubGluZUluZGVudD4wfHwzNyE9PW8pKTspe2ZvcihhPSEwLG89dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbiksZT10LnBvc2l0aW9uOzAhPT1vJiYhaXNfV1NfT1JfRU9MKG8pOylvPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pO2ZvcihuPVtdLChyPXQuaW5wdXQuc2xpY2UoZSx0LnBvc2l0aW9uKSkubGVuZ3RoPDEmJnRocm93RXJyb3IodCwiZGlyZWN0aXZlIG5hbWUgbXVzdCBub3QgYmUgbGVzcyB0aGFuIG9uZSBjaGFyYWN0ZXIgaW4gbGVuZ3RoIik7MCE9PW87KXtmb3IoO2lzX1dISVRFX1NQQUNFKG8pOylvPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pO2lmKDM1PT09byl7ZG97bz10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKX13aGlsZSgwIT09byYmIWlzX0VPTChvKSk7YnJlYWt9aWYoaXNfRU9MKG8pKWJyZWFrO2ZvcihlPXQucG9zaXRpb247MCE9PW8mJiFpc19XU19PUl9FT0wobyk7KW89dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbik7bi5wdXNoKHQuaW5wdXQuc2xpY2UoZSx0LnBvc2l0aW9uKSl9MCE9PW8mJnJlYWRMaW5lQnJlYWsodCksVHQuY2FsbChLdCxyKT9LdFtyXSh0LHIsbik6dGhyb3dXYXJuaW5nKHQsJ3Vua25vd24gZG9jdW1lbnQgZGlyZWN0aXZlICInK3IrJyInKX1za2lwU2VwYXJhdGlvblNwYWNlKHQsITAsLTEpLDA9PT10LmxpbmVJbmRlbnQmJjQ1PT09dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pJiY0NT09PXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKzEpJiY0NT09PXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKzIpPyh0LnBvc2l0aW9uKz0zLHNraXBTZXBhcmF0aW9uU3BhY2UodCwhMCwtMSkpOmEmJnRocm93RXJyb3IodCwiZGlyZWN0aXZlcyBlbmQgbWFyayBpcyBleHBlY3RlZCIpLGNvbXBvc2VOb2RlKHQsdC5saW5lSW5kZW50LTEsNCwhMSwhMCksc2tpcFNlcGFyYXRpb25TcGFjZSh0LCEwLC0xKSx0LmNoZWNrTGluZUJyZWFrcyYmUnQudGVzdCh0LmlucHV0LnNsaWNlKGksdC5wb3NpdGlvbikpJiZ0aHJvd1dhcm5pbmcodCwibm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50IiksdC5kb2N1bWVudHMucHVzaCh0LnJlc3VsdCksdC5wb3NpdGlvbj09PXQubGluZVN0YXJ0JiZ0ZXN0RG9jdW1lbnRTZXBhcmF0b3IodCk/NDY9PT10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikmJih0LnBvc2l0aW9uKz0zLHNraXBTZXBhcmF0aW9uU3BhY2UodCwhMCwtMSkpOnQucG9zaXRpb248dC5sZW5ndGgtMSYmdGhyb3dFcnJvcih0LCJlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCIpfWZ1bmN0aW9uIGxvYWREb2N1bWVudHModCxlKXtlPWV8fHt9LDAhPT0odD1TdHJpbmcodCkpLmxlbmd0aCYmKDEwIT09dC5jaGFyQ29kZUF0KHQubGVuZ3RoLTEpJiYxMyE9PXQuY2hhckNvZGVBdCh0Lmxlbmd0aC0xKSYmKHQrPSJcbiIpLDY1Mjc5PT09dC5jaGFyQ29kZUF0KDApJiYodD10LnNsaWNlKDEpKSk7dmFyIHI9bmV3IFN0YXRlJDEodCxlKSxuPXQuaW5kZXhPZigiXDAiKTtmb3IoLTEhPT1uJiYoci5wb3NpdGlvbj1uLHRocm93RXJyb3IociwibnVsbCBieXRlIGlzIG5vdCBhbGxvd2VkIGluIGlucHV0IikpLHIuaW5wdXQrPSJcMCI7MzI9PT1yLmlucHV0LmNoYXJDb2RlQXQoci5wb3NpdGlvbik7KXIubGluZUluZGVudCs9MSxyLnBvc2l0aW9uKz0xO2Zvcig7ci5wb3NpdGlvbjxyLmxlbmd0aC0xOylyZWFkRG9jdW1lbnQocik7cmV0dXJuIHIuZG9jdW1lbnRzfXZhciAkdD17bG9hZEFsbDpmdW5jdGlvbiBsb2FkQWxsJDEodCxlLHIpe251bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJnZvaWQgMD09PXImJihyPWUsZT1udWxsKTt2YXIgbj1sb2FkRG9jdW1lbnRzKHQscik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpcmV0dXJuIG47Zm9yKHZhciBvPTAsaT1uLmxlbmd0aDtvPGk7bys9MSllKG5bb10pfSxsb2FkOmZ1bmN0aW9uIGxvYWQkMSh0LGUpe3ZhciByPWxvYWREb2N1bWVudHModCxlKTtpZigwIT09ci5sZW5ndGgpe2lmKDE9PT1yLmxlbmd0aClyZXR1cm4gclswXTt0aHJvdyBuZXcgbnQoImV4cGVjdGVkIGEgc2luZ2xlIGRvY3VtZW50IGluIHRoZSBzdHJlYW0sIGJ1dCBmb3VuZCBtb3JlIil9fX0sSHQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxZdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEd0PTY1Mjc5LFp0PXswOiJcXDAiLDc6IlxcYSIsODoiXFxiIiw5OiJcXHQiLDEwOiJcXG4iLDExOiJcXHYiLDEyOiJcXGYiLDEzOiJcXHIiLDI3OiJcXGUiLDM0OidcXCInLDkyOiJcXFxcIiwxMzM6IlxcTiIsMTYwOiJcXF8iLDgyMzI6IlxcTCIsODIzMzoiXFxQIn0sSnQ9WyJ5IiwiWSIsInllcyIsIlllcyIsIllFUyIsIm9uIiwiT24iLCJPTiIsIm4iLCJOIiwibm8iLCJObyIsIk5PIiwib2ZmIiwiT2ZmIiwiT0ZGIl0sUXQ9L15bLStdP1swLTlfXSsoPzo6WzAtOV9dKykrKD86XC5bMC05X10qKT8kLztmdW5jdGlvbiBlbmNvZGVIZXgodCl7dmFyIGUscixuO2lmKGU9dC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSx0PD0yNTUpcj0ieCIsbj0yO2Vsc2UgaWYodDw9NjU1MzUpcj0idSIsbj00O2Vsc2V7aWYoISh0PD00Mjk0OTY3Mjk1KSl0aHJvdyBuZXcgbnQoImNvZGUgcG9pbnQgd2l0aGluIGEgc3RyaW5nIG1heSBub3QgYmUgZ3JlYXRlciB0aGFuIDB4RkZGRkZGRkYiKTtyPSJVIixuPTh9cmV0dXJuIlxcIityK3J0LnJlcGVhdCgiMCIsbi1lLmxlbmd0aCkrZX1mdW5jdGlvbiBTdGF0ZSh0KXt0aGlzLnNjaGVtYT10LnNjaGVtYXx8TnQsdGhpcy5pbmRlbnQ9TWF0aC5tYXgoMSx0LmluZGVudHx8MiksdGhpcy5ub0FycmF5SW5kZW50PXQubm9BcnJheUluZGVudHx8ITEsdGhpcy5za2lwSW52YWxpZD10LnNraXBJbnZhbGlkfHwhMSx0aGlzLmZsb3dMZXZlbD1ydC5pc05vdGhpbmcodC5mbG93TGV2ZWwpPy0xOnQuZmxvd0xldmVsLHRoaXMuc3R5bGVNYXA9ZnVuY3Rpb24gY29tcGlsZVN0eWxlTWFwKHQsZSl7dmFyIHIsbixvLGksYSxzLHU7aWYobnVsbD09PWUpcmV0dXJue307Zm9yKHI9e30sbz0wLGk9KG49T2JqZWN0LmtleXMoZSkpLmxlbmd0aDtvPGk7bys9MSlhPW5bb10scz1TdHJpbmcoZVthXSksIiEhIj09PWEuc2xpY2UoMCwyKSYmKGE9InRhZzp5YW1sLm9yZywyMDAyOiIrYS5zbGljZSgyKSksKHU9dC5jb21waWxlZFR5cGVNYXAuZmFsbGJhY2tbYV0pJiZZdC5jYWxsKHUuc3R5bGVBbGlhc2VzLHMpJiYocz11LnN0eWxlQWxpYXNlc1tzXSksclthXT1zO3JldHVybiByfSh0aGlzLnNjaGVtYSx0LnN0eWxlc3x8bnVsbCksdGhpcy5zb3J0S2V5cz10LnNvcnRLZXlzfHwhMSx0aGlzLmxpbmVXaWR0aD10LmxpbmVXaWR0aHx8ODAsdGhpcy5ub1JlZnM9dC5ub1JlZnN8fCExLHRoaXMubm9Db21wYXRNb2RlPXQubm9Db21wYXRNb2RlfHwhMSx0aGlzLmNvbmRlbnNlRmxvdz10LmNvbmRlbnNlRmxvd3x8ITEsdGhpcy5xdW90aW5nVHlwZT0nIic9PT10LnF1b3RpbmdUeXBlPzI6MSx0aGlzLmZvcmNlUXVvdGVzPXQuZm9yY2VRdW90ZXN8fCExLHRoaXMucmVwbGFjZXI9ImZ1bmN0aW9uIj09dHlwZW9mIHQucmVwbGFjZXI/dC5yZXBsYWNlcjpudWxsLHRoaXMuaW1wbGljaXRUeXBlcz10aGlzLnNjaGVtYS5jb21waWxlZEltcGxpY2l0LHRoaXMuZXhwbGljaXRUeXBlcz10aGlzLnNjaGVtYS5jb21waWxlZEV4cGxpY2l0LHRoaXMudGFnPW51bGwsdGhpcy5yZXN1bHQ9IiIsdGhpcy5kdXBsaWNhdGVzPVtdLHRoaXMudXNlZER1cGxpY2F0ZXM9bnVsbH1mdW5jdGlvbiBpbmRlbnRTdHJpbmcodCxlKXtmb3IodmFyIHIsbj1ydC5yZXBlYXQoIiAiLGUpLG89MCxpPS0xLGE9IiIscz10Lmxlbmd0aDtvPHM7KS0xPT09KGk9dC5pbmRleE9mKCJcbiIsbykpPyhyPXQuc2xpY2Uobyksbz1zKToocj10LnNsaWNlKG8saSsxKSxvPWkrMSksci5sZW5ndGgmJiJcbiIhPT1yJiYoYSs9biksYSs9cjtyZXR1cm4gYX1mdW5jdGlvbiBnZW5lcmF0ZU5leHRMaW5lKHQsZSl7cmV0dXJuIlxuIitydC5yZXBlYXQoIiAiLHQuaW5kZW50KmUpfWZ1bmN0aW9uIGlzV2hpdGVzcGFjZSh0KXtyZXR1cm4gMzI9PT10fHw5PT09dH1mdW5jdGlvbiBpc1ByaW50YWJsZSh0KXtyZXR1cm4gMzI8PXQmJnQ8PTEyNnx8MTYxPD10JiZ0PD01NTI5NSYmODIzMiE9PXQmJjgyMzMhPT10fHw1NzM0NDw9dCYmdDw9NjU1MzMmJnQhPT1HdHx8NjU1MzY8PXQmJnQ8PTExMTQxMTF9ZnVuY3Rpb24gaXNOc0NoYXJPcldoaXRlc3BhY2UodCl7cmV0dXJuIGlzUHJpbnRhYmxlKHQpJiZ0IT09R3QmJjEzIT09dCYmMTAhPT10fWZ1bmN0aW9uIGlzUGxhaW5TYWZlKHQsZSxyKXt2YXIgbj1pc05zQ2hhck9yV2hpdGVzcGFjZSh0KSxvPW4mJiFpc1doaXRlc3BhY2UodCk7cmV0dXJuKHI/bjpuJiY0NCE9PXQmJjkxIT09dCYmOTMhPT10JiYxMjMhPT10JiYxMjUhPT10KSYmMzUhPT10JiYhKDU4PT09ZSYmIW8pfHxpc05zQ2hhck9yV2hpdGVzcGFjZShlKSYmIWlzV2hpdGVzcGFjZShlKSYmMzU9PT10fHw1OD09PWUmJm99ZnVuY3Rpb24gY29kZVBvaW50QXQodCxlKXt2YXIgcixuPXQuY2hhckNvZGVBdChlKTtyZXR1cm4gbj49NTUyOTYmJm48PTU2MzE5JiZlKzE8dC5sZW5ndGgmJihyPXQuY2hhckNvZGVBdChlKzEpKT49NTYzMjAmJnI8PTU3MzQzPzEwMjQqKG4tNTUyOTYpK3ItNTYzMjArNjU1MzY6bn1mdW5jdGlvbiBuZWVkSW5kZW50SW5kaWNhdG9yKHQpe3JldHVybi9eXG4qIC8udGVzdCh0KX1mdW5jdGlvbiBjaG9vc2VTY2FsYXJTdHlsZSh0LGUscixuLG8saSxhLHMpe3ZhciB1LGM9MCxmPW51bGwsbD0hMSxwPSExLGg9LTEhPT1uLGQ9LTEseT1mdW5jdGlvbiBpc1BsYWluU2FmZUZpcnN0KHQpe3JldHVybiBpc1ByaW50YWJsZSh0KSYmdCE9PUd0JiYhaXNXaGl0ZXNwYWNlKHQpJiY0NSE9PXQmJjYzIT09dCYmNTghPT10JiY0NCE9PXQmJjkxIT09dCYmOTMhPT10JiYxMjMhPT10JiYxMjUhPT10JiYzNSE9PXQmJjM4IT09dCYmNDIhPT10JiYzMyE9PXQmJjEyNCE9PXQmJjYxIT09dCYmNjIhPT10JiYzOSE9PXQmJjM0IT09dCYmMzchPT10JiY2NCE9PXQmJjk2IT09dH0oY29kZVBvaW50QXQodCwwKSkmJmZ1bmN0aW9uIGlzUGxhaW5TYWZlTGFzdCh0KXtyZXR1cm4haXNXaGl0ZXNwYWNlKHQpJiY1OCE9PXR9KGNvZGVQb2ludEF0KHQsdC5sZW5ndGgtMSkpO2lmKGV8fGEpZm9yKHU9MDt1PHQubGVuZ3RoO2M+PTY1NTM2P3UrPTI6dSsrKXtpZighaXNQcmludGFibGUoYz1jb2RlUG9pbnRBdCh0LHUpKSlyZXR1cm4gNTt5PXkmJmlzUGxhaW5TYWZlKGMsZixzKSxmPWN9ZWxzZXtmb3IodT0wO3U8dC5sZW5ndGg7Yz49NjU1MzY/dSs9Mjp1Kyspe2lmKDEwPT09KGM9Y29kZVBvaW50QXQodCx1KSkpbD0hMCxoJiYocD1wfHx1LWQtMT5uJiYiICIhPT10W2QrMV0sZD11KTtlbHNlIGlmKCFpc1ByaW50YWJsZShjKSlyZXR1cm4gNTt5PXkmJmlzUGxhaW5TYWZlKGMsZixzKSxmPWN9cD1wfHxoJiZ1LWQtMT5uJiYiICIhPT10W2QrMV19cmV0dXJuIGx8fHA/cj45JiZuZWVkSW5kZW50SW5kaWNhdG9yKHQpPzU6YT8yPT09aT81OjI6cD80OjM6IXl8fGF8fG8odCk/Mj09PWk/NToyOjF9ZnVuY3Rpb24gd3JpdGVTY2FsYXIodCxlLHIsbixvKXt0LmR1bXA9ZnVuY3Rpb24oKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIDI9PT10LnF1b3RpbmdUeXBlPyciIic6IicnIjtpZighdC5ub0NvbXBhdE1vZGUmJigtMSE9PUp0LmluZGV4T2YoZSl8fFF0LnRlc3QoZSkpKXJldHVybiAyPT09dC5xdW90aW5nVHlwZT8nIicrZSsnIic6IiciK2UrIiciO3ZhciBpPXQuaW5kZW50Kk1hdGgubWF4KDEsciksYT0tMT09PXQubGluZVdpZHRoPy0xOk1hdGgubWF4KE1hdGgubWluKHQubGluZVdpZHRoLDQwKSx0LmxpbmVXaWR0aC1pKSxzPW58fHQuZmxvd0xldmVsPi0xJiZyPj10LmZsb3dMZXZlbDtzd2l0Y2goY2hvb3NlU2NhbGFyU3R5bGUoZSxzLHQuaW5kZW50LGEsKGZ1bmN0aW9uIHRlc3RBbWJpZ3VpdHkoZSl7cmV0dXJuIGZ1bmN0aW9uIHRlc3RJbXBsaWNpdFJlc29sdmluZyh0LGUpe3ZhciByLG47Zm9yKHI9MCxuPXQuaW1wbGljaXRUeXBlcy5sZW5ndGg7cjxuO3IrPTEpaWYodC5pbXBsaWNpdFR5cGVzW3JdLnJlc29sdmUoZSkpcmV0dXJuITA7cmV0dXJuITF9KHQsZSl9KSx0LnF1b3RpbmdUeXBlLHQuZm9yY2VRdW90ZXMmJiFuLG8pKXtjYXNlIDE6cmV0dXJuIGU7Y2FzZSAyOnJldHVybiInIitlLnJlcGxhY2UoLycvZywiJyciKSsiJyI7Y2FzZSAzOnJldHVybiJ8IitibG9ja0hlYWRlcihlLHQuaW5kZW50KStkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcoZSxpKSk7Y2FzZSA0OnJldHVybiI+IitibG9ja0hlYWRlcihlLHQuaW5kZW50KStkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcoZnVuY3Rpb24gZm9sZFN0cmluZyh0LGUpe3ZhciByLG4sbz0vKFxuKykoW15cbl0qKS9nLGk9KHM9dC5pbmRleE9mKCJcbiIpLHM9LTEhPT1zP3M6dC5sZW5ndGgsby5sYXN0SW5kZXg9cyxmb2xkTGluZSh0LnNsaWNlKDAscyksZSkpLGE9IlxuIj09PXRbMF18fCIgIj09PXRbMF07dmFyIHM7Zm9yKDtuPW8uZXhlYyh0KTspe3ZhciB1PW5bMV0sYz1uWzJdO3I9IiAiPT09Y1swXSxpKz11KyhhfHxyfHwiIj09PWM/IiI6IlxuIikrZm9sZExpbmUoYyxlKSxhPXJ9cmV0dXJuIGl9KGUsYSksaSkpO2Nhc2UgNTpyZXR1cm4nIicrZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHQpe2Zvcih2YXIgZSxyPSIiLG49MCxvPTA7bzx0Lmxlbmd0aDtuPj02NTUzNj9vKz0yOm8rKyluPWNvZGVQb2ludEF0KHQsbyksIShlPVp0W25dKSYmaXNQcmludGFibGUobik/KHIrPXRbb10sbj49NjU1MzYmJihyKz10W28rMV0pKTpyKz1lfHxlbmNvZGVIZXgobik7cmV0dXJuIHJ9KGUpKyciJztkZWZhdWx0OnRocm93IG5ldyBudCgiaW1wb3NzaWJsZSBlcnJvcjogaW52YWxpZCBzY2FsYXIgc3R5bGUiKX19KCl9ZnVuY3Rpb24gYmxvY2tIZWFkZXIodCxlKXt2YXIgcj1uZWVkSW5kZW50SW5kaWNhdG9yKHQpP1N0cmluZyhlKToiIixuPSJcbiI9PT10W3QubGVuZ3RoLTFdO3JldHVybiByKyhuJiYoIlxuIj09PXRbdC5sZW5ndGgtMl18fCJcbiI9PT10KT8iKyI6bj8iIjoiLSIpKyJcbiJ9ZnVuY3Rpb24gZHJvcEVuZGluZ05ld2xpbmUodCl7cmV0dXJuIlxuIj09PXRbdC5sZW5ndGgtMV0/dC5zbGljZSgwLC0xKTp0fWZ1bmN0aW9uIGZvbGRMaW5lKHQsZSl7aWYoIiI9PT10fHwiICI9PT10WzBdKXJldHVybiB0O2Zvcih2YXIgcixuLG89LyBbXiBdL2csaT0wLGE9MCxzPTAsdT0iIjtyPW8uZXhlYyh0KTspKHM9ci5pbmRleCktaT5lJiYobj1hPmk/YTpzLHUrPSJcbiIrdC5zbGljZShpLG4pLGk9bisxKSxhPXM7cmV0dXJuIHUrPSJcbiIsdC5sZW5ndGgtaT5lJiZhPmk/dSs9dC5zbGljZShpLGEpKyJcbiIrdC5zbGljZShhKzEpOnUrPXQuc2xpY2UoaSksdS5zbGljZSgxKX1mdW5jdGlvbiB3cml0ZUJsb2NrU2VxdWVuY2UodCxlLHIsbil7dmFyIG8saSxhLHM9IiIsdT10LnRhZztmb3Iobz0wLGk9ci5sZW5ndGg7bzxpO28rPTEpYT1yW29dLHQucmVwbGFjZXImJihhPXQucmVwbGFjZXIuY2FsbChyLFN0cmluZyhvKSxhKSksKHdyaXRlTm9kZSh0LGUrMSxhLCEwLCEwLCExLCEwKXx8dm9pZCAwPT09YSYmd3JpdGVOb2RlKHQsZSsxLG51bGwsITAsITAsITEsITApKSYmKG4mJiIiPT09c3x8KHMrPWdlbmVyYXRlTmV4dExpbmUodCxlKSksdC5kdW1wJiYxMD09PXQuZHVtcC5jaGFyQ29kZUF0KDApP3MrPSItIjpzKz0iLSAiLHMrPXQuZHVtcCk7dC50YWc9dSx0LmR1bXA9c3x8IltdIn1mdW5jdGlvbiBkZXRlY3RUeXBlKHQsZSxyKXt2YXIgbixvLGksYSxzLHU7Zm9yKGk9MCxhPShvPXI/dC5leHBsaWNpdFR5cGVzOnQuaW1wbGljaXRUeXBlcykubGVuZ3RoO2k8YTtpKz0xKWlmKCgocz1vW2ldKS5pbnN0YW5jZU9mfHxzLnByZWRpY2F0ZSkmJighcy5pbnN0YW5jZU9mfHwib2JqZWN0Ij09dHlwZW9mIGUmJmUgaW5zdGFuY2VvZiBzLmluc3RhbmNlT2YpJiYoIXMucHJlZGljYXRlfHxzLnByZWRpY2F0ZShlKSkpe2lmKHI/cy5tdWx0aSYmcy5yZXByZXNlbnROYW1lP3QudGFnPXMucmVwcmVzZW50TmFtZShlKTp0LnRhZz1zLnRhZzp0LnRhZz0iPyIscy5yZXByZXNlbnQpe2lmKHU9dC5zdHlsZU1hcFtzLnRhZ118fHMuZGVmYXVsdFN0eWxlLCJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1IdC5jYWxsKHMucmVwcmVzZW50KSluPXMucmVwcmVzZW50KGUsdSk7ZWxzZXtpZighWXQuY2FsbChzLnJlcHJlc2VudCx1KSl0aHJvdyBuZXcgbnQoIiE8IitzLnRhZysnPiB0YWcgcmVzb2x2ZXIgYWNjZXB0cyBub3QgIicrdSsnIiBzdHlsZScpO249cy5yZXByZXNlbnRbdV0oZSx1KX10LmR1bXA9bn1yZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiB3cml0ZU5vZGUodCxlLHIsbixvLGksYSl7dC50YWc9bnVsbCx0LmR1bXA9cixkZXRlY3RUeXBlKHQsciwhMSl8fGRldGVjdFR5cGUodCxyLCEwKTt2YXIgcyx1PUh0LmNhbGwodC5kdW1wKSxjPW47biYmKG49dC5mbG93TGV2ZWw8MHx8dC5mbG93TGV2ZWw+ZSk7dmFyIGYsbCxwPSJbb2JqZWN0IE9iamVjdF0iPT09dXx8IltvYmplY3QgQXJyYXldIj09PXU7aWYocCYmKGw9LTEhPT0oZj10LmR1cGxpY2F0ZXMuaW5kZXhPZihyKSkpLChudWxsIT09dC50YWcmJiI/IiE9PXQudGFnfHxsfHwyIT09dC5pbmRlbnQmJmU+MCkmJihvPSExKSxsJiZ0LnVzZWREdXBsaWNhdGVzW2ZdKXQuZHVtcD0iKnJlZl8iK2Y7ZWxzZXtpZihwJiZsJiYhdC51c2VkRHVwbGljYXRlc1tmXSYmKHQudXNlZER1cGxpY2F0ZXNbZl09ITApLCJbb2JqZWN0IE9iamVjdF0iPT09dSluJiYwIT09T2JqZWN0LmtleXModC5kdW1wKS5sZW5ndGg/KCFmdW5jdGlvbiB3cml0ZUJsb2NrTWFwcGluZyh0LGUscixuKXt2YXIgbyxpLGEscyx1LGMsZj0iIixsPXQudGFnLHA9T2JqZWN0LmtleXMocik7aWYoITA9PT10LnNvcnRLZXlzKXAuc29ydCgpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIHQuc29ydEtleXMpcC5zb3J0KHQuc29ydEtleXMpO2Vsc2UgaWYodC5zb3J0S2V5cyl0aHJvdyBuZXcgbnQoInNvcnRLZXlzIG11c3QgYmUgYSBib29sZWFuIG9yIGEgZnVuY3Rpb24iKTtmb3Iobz0wLGk9cC5sZW5ndGg7bzxpO28rPTEpYz0iIixuJiYiIj09PWZ8fChjKz1nZW5lcmF0ZU5leHRMaW5lKHQsZSkpLHM9clthPXBbb11dLHQucmVwbGFjZXImJihzPXQucmVwbGFjZXIuY2FsbChyLGEscykpLHdyaXRlTm9kZSh0LGUrMSxhLCEwLCEwLCEwKSYmKCh1PW51bGwhPT10LnRhZyYmIj8iIT09dC50YWd8fHQuZHVtcCYmdC5kdW1wLmxlbmd0aD4xMDI0KSYmKHQuZHVtcCYmMTA9PT10LmR1bXAuY2hhckNvZGVBdCgwKT9jKz0iPyI6Yys9Ij8gIiksYys9dC5kdW1wLHUmJihjKz1nZW5lcmF0ZU5leHRMaW5lKHQsZSkpLHdyaXRlTm9kZSh0LGUrMSxzLCEwLHUpJiYodC5kdW1wJiYxMD09PXQuZHVtcC5jaGFyQ29kZUF0KDApP2MrPSI6IjpjKz0iOiAiLGYrPWMrPXQuZHVtcCkpO3QudGFnPWwsdC5kdW1wPWZ8fCJ7fSJ9KHQsZSx0LmR1bXAsbyksbCYmKHQuZHVtcD0iJnJlZl8iK2YrdC5kdW1wKSk6KCFmdW5jdGlvbiB3cml0ZUZsb3dNYXBwaW5nKHQsZSxyKXt2YXIgbixvLGksYSxzLHU9IiIsYz10LnRhZyxmPU9iamVjdC5rZXlzKHIpO2ZvcihuPTAsbz1mLmxlbmd0aDtuPG87bis9MSlzPSIiLCIiIT09dSYmKHMrPSIsICIpLHQuY29uZGVuc2VGbG93JiYocys9JyInKSxhPXJbaT1mW25dXSx0LnJlcGxhY2VyJiYoYT10LnJlcGxhY2VyLmNhbGwocixpLGEpKSx3cml0ZU5vZGUodCxlLGksITEsITEpJiYodC5kdW1wLmxlbmd0aD4xMDI0JiYocys9Ij8gIikscys9dC5kdW1wKyh0LmNvbmRlbnNlRmxvdz8nIic6IiIpKyI6IisodC5jb25kZW5zZUZsb3c/IiI6IiAiKSx3cml0ZU5vZGUodCxlLGEsITEsITEpJiYodSs9cys9dC5kdW1wKSk7dC50YWc9Yyx0LmR1bXA9InsiK3UrIn0ifSh0LGUsdC5kdW1wKSxsJiYodC5kdW1wPSImcmVmXyIrZisiICIrdC5kdW1wKSk7ZWxzZSBpZigiW29iamVjdCBBcnJheV0iPT09dSluJiYwIT09dC5kdW1wLmxlbmd0aD8odC5ub0FycmF5SW5kZW50JiYhYSYmZT4wP3dyaXRlQmxvY2tTZXF1ZW5jZSh0LGUtMSx0LmR1bXAsbyk6d3JpdGVCbG9ja1NlcXVlbmNlKHQsZSx0LmR1bXAsbyksbCYmKHQuZHVtcD0iJnJlZl8iK2YrdC5kdW1wKSk6KCFmdW5jdGlvbiB3cml0ZUZsb3dTZXF1ZW5jZSh0LGUscil7dmFyIG4sbyxpLGE9IiIscz10LnRhZztmb3Iobj0wLG89ci5sZW5ndGg7bjxvO24rPTEpaT1yW25dLHQucmVwbGFjZXImJihpPXQucmVwbGFjZXIuY2FsbChyLFN0cmluZyhuKSxpKSksKHdyaXRlTm9kZSh0LGUsaSwhMSwhMSl8fHZvaWQgMD09PWkmJndyaXRlTm9kZSh0LGUsbnVsbCwhMSwhMSkpJiYoIiIhPT1hJiYoYSs9IiwiKyh0LmNvbmRlbnNlRmxvdz8iIjoiICIpKSxhKz10LmR1bXApO3QudGFnPXMsdC5kdW1wPSJbIithKyJdIn0odCxlLHQuZHVtcCksbCYmKHQuZHVtcD0iJnJlZl8iK2YrIiAiK3QuZHVtcCkpO2Vsc2V7aWYoIltvYmplY3QgU3RyaW5nXSIhPT11KXtpZigiW29iamVjdCBVbmRlZmluZWRdIj09PXUpcmV0dXJuITE7aWYodC5za2lwSW52YWxpZClyZXR1cm4hMTt0aHJvdyBuZXcgbnQoInVuYWNjZXB0YWJsZSBraW5kIG9mIGFuIG9iamVjdCB0byBkdW1wICIrdSl9Ij8iIT09dC50YWcmJndyaXRlU2NhbGFyKHQsdC5kdW1wLGUsaSxjKX1udWxsIT09dC50YWcmJiI/IiE9PXQudGFnJiYocz1lbmNvZGVVUkkoIiEiPT09dC50YWdbMF0/dC50YWcuc2xpY2UoMSk6dC50YWcpLnJlcGxhY2UoLyEvZywiJTIxIikscz0iISI9PT10LnRhZ1swXT8iISIrczoidGFnOnlhbWwub3JnLDIwMDI6Ij09PXMuc2xpY2UoMCwxOCk/IiEhIitzLnNsaWNlKDE4KToiITwiK3MrIj4iLHQuZHVtcD1zKyIgIit0LmR1bXApfXJldHVybiEwfWZ1bmN0aW9uIGdldER1cGxpY2F0ZVJlZmVyZW5jZXModCxlKXt2YXIgcixuLG89W10saT1bXTtmb3IoaW5zcGVjdE5vZGUodCxvLGkpLHI9MCxuPWkubGVuZ3RoO3I8bjtyKz0xKWUuZHVwbGljYXRlcy5wdXNoKG9baVtyXV0pO2UudXNlZER1cGxpY2F0ZXM9bmV3IEFycmF5KG4pfWZ1bmN0aW9uIGluc3BlY3ROb2RlKHQsZSxyKXt2YXIgbixvLGk7aWYobnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdClpZigtMSE9PShvPWUuaW5kZXhPZih0KSkpLTE9PT1yLmluZGV4T2YobykmJnIucHVzaChvKTtlbHNlIGlmKGUucHVzaCh0KSxBcnJheS5pc0FycmF5KHQpKWZvcihvPTAsaT10Lmxlbmd0aDtvPGk7bys9MSlpbnNwZWN0Tm9kZSh0W29dLGUscik7ZWxzZSBmb3Iobz0wLGk9KG49T2JqZWN0LmtleXModCkpLmxlbmd0aDtvPGk7bys9MSlpbnNwZWN0Tm9kZSh0W25bb11dLGUscil9ZnVuY3Rpb24gcmVuYW1lZCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiRnVuY3Rpb24geWFtbC4iK3QrIiBpcyByZW1vdmVkIGluIGpzLXlhbWwgNC4gVXNlIHlhbWwuIitlKyIgaW5zdGVhZCwgd2hpY2ggaXMgbm93IHNhZmUgYnkgZGVmYXVsdC4iKX19dmFyIFh0PXtUeXBlOnN0LFNjaGVtYTp1dCxGQUlMU0FGRV9TQ0hFTUE6aHQsSlNPTl9TQ0hFTUE6YnQsQ09SRV9TQ0hFTUE6U3QsREVGQVVMVF9TQ0hFTUE6TnQsbG9hZDokdC5sb2FkLGxvYWRBbGw6JHQubG9hZEFsbCxkdW1wOntkdW1wOmZ1bmN0aW9uIGR1bXAkMSh0LGUpe3ZhciByPW5ldyBTdGF0ZShlPWV8fHt9KTtyLm5vUmVmc3x8Z2V0RHVwbGljYXRlUmVmZXJlbmNlcyh0LHIpO3ZhciBuPXQ7cmV0dXJuIHIucmVwbGFjZXImJihuPXIucmVwbGFjZXIuY2FsbCh7IiI6bn0sIiIsbikpLHdyaXRlTm9kZShyLDAsbiwhMCwhMCk/ci5kdW1wKyJcbiI6IiJ9fS5kdW1wLFlBTUxFeGNlcHRpb246bnQsdHlwZXM6e2JpbmFyeTpPdCxmbG9hdDp2dCxtYXA6cHQsbnVsbDpkdCxwYWlyczpqdCxzZXQ6THQsdGltZXN0YW1wOnh0LGJvb2w6eXQsaW50Ol90LG1lcmdlOkV0LG9tYXA6TXQsc2VxOmx0LHN0cjpjdH0sc2FmZUxvYWQ6cmVuYW1lZCgic2FmZUxvYWQiLCJsb2FkIiksc2FmZUxvYWRBbGw6cmVuYW1lZCgic2FmZUxvYWRBbGwiLCJsb2FkQWxsIiksc2FmZUR1bXA6cmVuYW1lZCgic2FmZUR1bXAiLCJkdW1wIil9O2NvbnN0IHRlPSJjb25maWdzX3VwZGF0ZSIsZWU9ImNvbmZpZ3NfdG9nZ2xlIjtmdW5jdGlvbiB1cGRhdGUodCxlKXtyZXR1cm57dHlwZTp0ZSxwYXlsb2FkOntbdF06ZX19fWZ1bmN0aW9uIHRvZ2dsZSh0KXtyZXR1cm57dHlwZTplZSxwYXlsb2FkOnR9fWNvbnN0IGxvYWRlZD0oKT0+KCk9Pnt9LGRvd25sb2FkQ29uZmlnPXQ9PmU9Pntjb25zdHtmbjp7ZmV0Y2g6cn19PWU7cmV0dXJuIHIodCl9LGdldENvbmZpZ0J5VXJsPSh0LGUpPT5yPT57Y29uc3R7c3BlY0FjdGlvbnM6bixjb25maWdzQWN0aW9uczpvfT1yO2lmKHQpcmV0dXJuIG8uZG93bmxvYWRDb25maWcodCkudGhlbihuZXh0LG5leHQpO2Z1bmN0aW9uIG5leHQobyl7byBpbnN0YW5jZW9mIEVycm9yfHxvLnN0YXR1cz49NDAwPyhuLnVwZGF0ZUxvYWRpbmdTdGF0dXMoImZhaWxlZENvbmZpZyIpLG4udXBkYXRlTG9hZGluZ1N0YXR1cygiZmFpbGVkQ29uZmlnIiksbi51cGRhdGVVcmwoIiIpLGNvbnNvbGUuZXJyb3Ioby5zdGF0dXNUZXh0KyIgIit0LnVybCksZShudWxsKSk6ZSgoKHQsZSk9Pnt0cnl7cmV0dXJuIFh0LmxvYWQodCl9Y2F0Y2godCl7cmV0dXJuIGUmJmUuZXJyQWN0aW9ucy5uZXdUaHJvd25FcnIobmV3IEVycm9yKHQpKSx7fX19KShvLnRleHQscikpfX0sZ2V0PSh0LGUpPT50LmdldEluKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLHJlPXtbdGVdOih0LGUpPT50Lm1lcmdlKCgwLGkuZnJvbUpTKShlLnBheWxvYWQpKSxbZWVdOih0LGUpPT57Y29uc3Qgcj1lLnBheWxvYWQsbj10LmdldChyKTtyZXR1cm4gdC5zZXQociwhbil9fTt2YXIgbmU9X193ZWJwYWNrX3JlcXVpcmVfXyg3MjQ4KSxvZT1fX3dlYnBhY2tfcmVxdWlyZV9fLm4obmUpLGllPV9fd2VicGFja19yZXF1aXJlX18oNzY2NiksYWU9X193ZWJwYWNrX3JlcXVpcmVfXy5uKGllKTtjb25zdCBzZT1jb25zb2xlLmVycm9yLHdpdGhFcnJvckJvdW5kYXJ5PXQ9PmU9Pntjb25zdHtnZXRDb21wb25lbnQ6cixmbjpvfT10KCksaT1yKCJFcnJvckJvdW5kYXJ5IiksYT1vLmdldERpc3BsYXlOYW1lKGUpO2NsYXNzIFdpdGhFcnJvckJvdW5kYXJ5IGV4dGVuZHMgbi5Db21wb25lbnR7cmVuZGVyKCl7cmV0dXJuIG4uY3JlYXRlRWxlbWVudChpLHt0YXJnZXROYW1lOmEsZ2V0Q29tcG9uZW50OnIsZm46b30sbi5jcmVhdGVFbGVtZW50KGUsYWUoKSh7fSx0aGlzLnByb3BzLHRoaXMuY29udGV4dCkpKX19dmFyIHM7cmV0dXJuIFdpdGhFcnJvckJvdW5kYXJ5LmRpc3BsYXlOYW1lPWBXaXRoRXJyb3JCb3VuZGFyeSgke2F9KWAsKHM9ZSkucHJvdG90eXBlJiZzLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50JiYoV2l0aEVycm9yQm91bmRhcnkucHJvdG90eXBlLm1hcFN0YXRlVG9Qcm9wcz1lLnByb3RvdHlwZS5tYXBTdGF0ZVRvUHJvcHMpLFdpdGhFcnJvckJvdW5kYXJ5fSxmYWxsYmFjaz0oe25hbWU6dH0pPT5uLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZmFsbGJhY2sifSwi8J+YsSAiLG4uY3JlYXRlRWxlbWVudCgiaSIsbnVsbCwiQ291bGQgbm90IHJlbmRlciAiLCJ0Ij09PXQ/InRoaXMgY29tcG9uZW50Ijp0LCIsIHNlZSB0aGUgY29uc29sZS4iKSk7Y2xhc3MgRXJyb3JCb3VuZGFyeSBleHRlbmRzIG4uQ29tcG9uZW50e3N0YXRpYyBkZWZhdWx0UHJvcHM9e3RhcmdldE5hbWU6InRoaXMgY29tcG9uZW50IixnZXRDb21wb25lbnQ6KCk9PmZhbGxiYWNrLGZuOntjb21wb25lbnREaWRDYXRjaDpzZX0sY2hpbGRyZW46bnVsbH07c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcih0KXtyZXR1cm57aGFzRXJyb3I6ITAsZXJyb3I6dH19Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5zdGF0ZT17aGFzRXJyb3I6ITEsZXJyb3I6bnVsbH19Y29tcG9uZW50RGlkQ2F0Y2godCxlKXt0aGlzLnByb3BzLmZuLmNvbXBvbmVudERpZENhdGNoKHQsZSl9cmVuZGVyKCl7Y29uc3R7Z2V0Q29tcG9uZW50OnQsdGFyZ2V0TmFtZTplLGNoaWxkcmVuOnJ9PXRoaXMucHJvcHM7aWYodGhpcy5zdGF0ZS5oYXNFcnJvcil7Y29uc3Qgcj10KCJGYWxsYmFjayIpO3JldHVybiBuLmNyZWF0ZUVsZW1lbnQocix7bmFtZTplfSl9cmV0dXJuIHJ9fWNvbnN0IHVlPUVycm9yQm91bmRhcnksY2U9W3RvcF9iYXIsZnVuY3Rpb24gY29uZmlnc1BsdWdpbigpe3JldHVybntzdGF0ZVBsdWdpbnM6e2NvbmZpZ3M6e3JlZHVjZXJzOnJlLGFjdGlvbnM6dCxzZWxlY3RvcnM6ZX19fX0sc3RhZGFsb25lX2xheW91dCwoKHtjb21wb25lbnRMaXN0OnQ9W10sZnVsbE92ZXJyaWRlOmU9ITF9PXt9KT0+KHtnZXRTeXN0ZW06cn0pPT57Y29uc3Qgbj1lP3Q6WyJBcHAiLCJCYXNlTGF5b3V0IiwiVmVyc2lvblByYWdtYUZpbHRlciIsIkluZm9Db250YWluZXIiLCJTZXJ2ZXJzQ29udGFpbmVyIiwiU2NoZW1lc0NvbnRhaW5lciIsIkF1dGhvcml6ZUJ0bkNvbnRhaW5lciIsIkZpbHRlckNvbnRhaW5lciIsIk9wZXJhdGlvbnMiLCJPcGVyYXRpb25Db250YWluZXIiLCJwYXJhbWV0ZXJzIiwicmVzcG9uc2VzIiwiT3BlcmF0aW9uU2VydmVycyIsIk1vZGVscyIsIk1vZGVsV3JhcHBlciIsLi4udF0sbz1vZSgpKG4sQXJyYXkobi5sZW5ndGgpLmZpbGwoKCh0LHtmbjplfSk9PmUud2l0aEVycm9yQm91bmRhcnkodCkpKSk7cmV0dXJue2ZuOntjb21wb25lbnREaWRDYXRjaDpzZSx3aXRoRXJyb3JCb3VuZGFyeTp3aXRoRXJyb3JCb3VuZGFyeShyKX0sY29tcG9uZW50czp7RXJyb3JCb3VuZGFyeTp1ZSxGYWxsYmFjazpmYWxsYmFja30sd3JhcENvbXBvbmVudHM6b319KSh7ZnVsbE92ZXJyaWRlOiEwLGNvbXBvbmVudExpc3Q6WyJUb3BiYXIiLCJTdGFuZGFsb25lTGF5b3V0Iiwib25saW5lVmFsaWRhdG9yQmFkZ2UiXX0pXX0pKCkscj1yLmRlZmF1bHR9KSgpKSk7","response_hash":"dc0ee8d0df64cd8b50366102a98ab00e51a0a9cf4e138cb718d523bd36da2b1b","response_time_ms":0,"response_words":7632,"has_response":true,"parameters":[{"name":"1","value":"api-docs","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":13},{"name":"2","value":"swagger-ui-standalone-preset.js","type":"path","name_start":-1,"name_end":-1,"value_start":14,"value_end":45}],"sent_at":"2026-04-05T05:33:08.390265Z","received_at":"2026-04-05T05:33:08.390264Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"56bef762-796b-44fe-86e8-a024e8674d9a","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/api-docs/swagger-ui-bundle.js","url":"http://localhost:3000/api-docs/swagger-ui-bundle.js","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9hcGktZG9jcy9zd2FnZ2VyLXVpLWJ1bmRsZS5qcyBIVFRQLzEuMQ0KSG9zdDogbG9jYWxob3N0OjMwMDANCg0K","request_hash":"bb0d851e141b86d04a7d16fe334d239ec4bf900c7fd7be9f7a8e4dfbddca22d6","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["application/javascript; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:32:46 GMT"],"Etag":["W/\"1745d8-19cc8810e78\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sat, 07 Mar 2026 13:33:47 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Recruiting":["/#/jobs"]},"response_content_type":"application/javascript; charset=UTF-8","response_content_length":1525208,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoNCkNhY2hlLUNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0wDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpFdGFnOiBXLyIxNzQ1ZDgtMTljYzg4MTBlNzgiDQpGZWF0dXJlLVBvbGljeTogcGF5bWVudCAnc2VsZicNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KWC1Db250ZW50LVR5cGUtT3B0aW9uczogbm9zbmlmZg0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpBY2NlcHQtUmFuZ2VzOiBieXRlcw0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0OyBjaGFyc2V0PVVURi04DQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjQ2IEdNVA0KS2VlcC1BbGl2ZTogdGltZW91dD01DQpMYXN0LU1vZGlmaWVkOiBTYXQsIDA3IE1hciAyMDI2IDEzOjMzOjQ3IEdNVA0KWC1SZWNydWl0aW5nOiAvIy9qb2JzDQoNCi8qISBGb3IgbGljZW5zZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIHN3YWdnZXItdWktYnVuZGxlLmpzLkxJQ0VOU0UudHh0ICovCiFmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihzLG8peyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9bygpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLG8pOiJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlN3YWdnZXJVSUJ1bmRsZT1vKCk6cy5Td2FnZ2VyVUlCdW5kbGU9bygpfSh0aGlzLCgoKT0+KCgpPT57dmFyIHM9ezY3NTI2KHMsbyl7InVzZSBzdHJpY3QiO28uYnl0ZUxlbmd0aD1mdW5jdGlvbiBieXRlTGVuZ3RoKHMpe3ZhciBvPWdldExlbnMocyksaT1vWzBdLGE9b1sxXTtyZXR1cm4gMyooaSthKS80LWF9LG8udG9CeXRlQXJyYXk9ZnVuY3Rpb24gdG9CeXRlQXJyYXkocyl7dmFyIG8saSxfPWdldExlbnMocyksdz1fWzBdLHg9X1sxXSxDPW5ldyB1KGZ1bmN0aW9uIF9ieXRlTGVuZ3RoKHMsbyxpKXtyZXR1cm4gMyoobytpKS80LWl9KDAsdyx4KSksaj0wLEw9eD4wP3ctNDp3O2ZvcihpPTA7aTxMO2krPTQpbz1hW3MuY2hhckNvZGVBdChpKV08PDE4fGFbcy5jaGFyQ29kZUF0KGkrMSldPDwxMnxhW3MuY2hhckNvZGVBdChpKzIpXTw8NnxhW3MuY2hhckNvZGVBdChpKzMpXSxDW2orK109bz4+MTYmMjU1LENbaisrXT1vPj44JjI1NSxDW2orK109MjU1Jm87Mj09PXgmJihvPWFbcy5jaGFyQ29kZUF0KGkpXTw8MnxhW3MuY2hhckNvZGVBdChpKzEpXT4+NCxDW2orK109MjU1Jm8pOzE9PT14JiYobz1hW3MuY2hhckNvZGVBdChpKV08PDEwfGFbcy5jaGFyQ29kZUF0KGkrMSldPDw0fGFbcy5jaGFyQ29kZUF0KGkrMildPj4yLENbaisrXT1vPj44JjI1NSxDW2orK109MjU1Jm8pO3JldHVybiBDfSxvLmZyb21CeXRlQXJyYXk9ZnVuY3Rpb24gZnJvbUJ5dGVBcnJheShzKXtmb3IodmFyIG8sYT1zLmxlbmd0aCx1PWElMyxfPVtdLHc9MTYzODMseD0wLEM9YS11O3g8Qzt4Kz13KV8ucHVzaChlbmNvZGVDaHVuayhzLHgseCt3PkM/Qzp4K3cpKTsxPT09dT8obz1zW2EtMV0sXy5wdXNoKGlbbz4+Ml0raVtvPDw0JjYzXSsiPT0iKSk6Mj09PXUmJihvPShzW2EtMl08PDgpK3NbYS0xXSxfLnB1c2goaVtvPj4xMF0raVtvPj40JjYzXStpW288PDImNjNdKyI9IikpO3JldHVybiBfLmpvaW4oIiIpfTtmb3IodmFyIGk9W10sYT1bXSx1PSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LF89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHc9MDt3PDY0OysrdylpW3ddPV9bd10sYVtfLmNoYXJDb2RlQXQodyldPXc7ZnVuY3Rpb24gZ2V0TGVucyhzKXt2YXIgbz1zLmxlbmd0aDtpZihvJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTt2YXIgaT1zLmluZGV4T2YoIj0iKTtyZXR1cm4tMT09PWkmJihpPW8pLFtpLGk9PT1vPzA6NC1pJTRdfWZ1bmN0aW9uIGVuY29kZUNodW5rKHMsbyxhKXtmb3IodmFyIHUsXyx3PVtdLHg9bzt4PGE7eCs9Myl1PShzW3hdPDwxNiYxNjcxMTY4MCkrKHNbeCsxXTw8OCY2NTI4MCkrKDI1NSZzW3grMl0pLHcucHVzaChpWyhfPXUpPj4xOCY2M10raVtfPj4xMiY2M10raVtfPj42JjYzXStpWzYzJl9dKTtyZXR1cm4gdy5qb2luKCIiKX1hWyItIi5jaGFyQ29kZUF0KDApXT02MixhWyJfIi5jaGFyQ29kZUF0KDApXT02M30sNDgyODcocyxvLGkpeyJ1c2Ugc3RyaWN0Ijtjb25zdCBhPWkoNjc1MjYpLHU9aSgyNTEpLF89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbC5mb3I/U3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKTpudWxsO28uQnVmZmVyPUJ1ZmZlcixvLlNsb3dCdWZmZXI9ZnVuY3Rpb24gU2xvd0J1ZmZlcihzKXsrcyE9cyYmKHM9MCk7cmV0dXJuIEJ1ZmZlci5hbGxvYygrcyl9LG8uSU5TUEVDVF9NQVhfQllURVM9NTA7Y29uc3Qgdz0yMTQ3NDgzNjQ3O2Z1bmN0aW9uIGNyZWF0ZUJ1ZmZlcihzKXtpZihzPncpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSAiJytzKyciIGlzIGludmFsaWQgZm9yIG9wdGlvbiAic2l6ZSInKTtjb25zdCBvPW5ldyBVaW50OEFycmF5KHMpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YobyxCdWZmZXIucHJvdG90eXBlKSxvfWZ1bmN0aW9uIEJ1ZmZlcihzLG8saSl7aWYoIm51bWJlciI9PXR5cGVvZiBzKXtpZigic3RyaW5nIj09dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJzdHJpbmciIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJyk7cmV0dXJuIGFsbG9jVW5zYWZlKHMpfXJldHVybiBmcm9tKHMsbyxpKX1mdW5jdGlvbiBmcm9tKHMsbyxpKXtpZigic3RyaW5nIj09dHlwZW9mIHMpcmV0dXJuIGZ1bmN0aW9uIGZyb21TdHJpbmcocyxvKXsic3RyaW5nIj09dHlwZW9mIG8mJiIiIT09b3x8KG89InV0ZjgiKTtpZighQnVmZmVyLmlzRW5jb2RpbmcobykpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitvKTtjb25zdCBpPTB8Ynl0ZUxlbmd0aChzLG8pO2xldCBhPWNyZWF0ZUJ1ZmZlcihpKTtjb25zdCB1PWEud3JpdGUocyxvKTt1IT09aSYmKGE9YS5zbGljZSgwLHUpKTtyZXR1cm4gYX0ocyxvKTtpZihBcnJheUJ1ZmZlci5pc1ZpZXcocykpcmV0dXJuIGZ1bmN0aW9uIGZyb21BcnJheVZpZXcocyl7aWYoaXNJbnN0YW5jZShzLFVpbnQ4QXJyYXkpKXtjb25zdCBvPW5ldyBVaW50OEFycmF5KHMpO3JldHVybiBmcm9tQXJyYXlCdWZmZXIoby5idWZmZXIsby5ieXRlT2Zmc2V0LG8uYnl0ZUxlbmd0aCl9cmV0dXJuIGZyb21BcnJheUxpa2Uocyl9KHMpO2lmKG51bGw9PXMpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgIit0eXBlb2Ygcyk7aWYoaXNJbnN0YW5jZShzLEFycmF5QnVmZmVyKXx8cyYmaXNJbnN0YW5jZShzLmJ1ZmZlcixBcnJheUJ1ZmZlcikpcmV0dXJuIGZyb21BcnJheUJ1ZmZlcihzLG8saSk7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciYmKGlzSW5zdGFuY2UocyxTaGFyZWRBcnJheUJ1ZmZlcil8fHMmJmlzSW5zdGFuY2Uocy5idWZmZXIsU2hhcmVkQXJyYXlCdWZmZXIpKSlyZXR1cm4gZnJvbUFycmF5QnVmZmVyKHMsbyxpKTtpZigibnVtYmVyIj09dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJyk7Y29uc3QgYT1zLnZhbHVlT2YmJnMudmFsdWVPZigpO2lmKG51bGwhPWEmJmEhPT1zKXJldHVybiBCdWZmZXIuZnJvbShhLG8saSk7Y29uc3QgdT1mdW5jdGlvbiBmcm9tT2JqZWN0KHMpe2lmKEJ1ZmZlci5pc0J1ZmZlcihzKSl7Y29uc3Qgbz0wfGNoZWNrZWQocy5sZW5ndGgpLGk9Y3JlYXRlQnVmZmVyKG8pO3JldHVybiAwPT09aS5sZW5ndGh8fHMuY29weShpLDAsMCxvKSxpfWlmKHZvaWQgMCE9PXMubGVuZ3RoKXJldHVybiJudW1iZXIiIT10eXBlb2Ygcy5sZW5ndGh8fG51bWJlcklzTmFOKHMubGVuZ3RoKT9jcmVhdGVCdWZmZXIoMCk6ZnJvbUFycmF5TGlrZShzKTtpZigiQnVmZmVyIj09PXMudHlwZSYmQXJyYXkuaXNBcnJheShzLmRhdGEpKXJldHVybiBmcm9tQXJyYXlMaWtlKHMuZGF0YSl9KHMpO2lmKHUpcmV0dXJuIHU7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm51bGwhPVN5bWJvbC50b1ByaW1pdGl2ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHNbU3ltYm9sLnRvUHJpbWl0aXZlXSlyZXR1cm4gQnVmZmVyLmZyb20oc1tTeW1ib2wudG9QcmltaXRpdmVdKCJzdHJpbmciKSxvLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICIrdHlwZW9mIHMpfWZ1bmN0aW9uIGFzc2VydFNpemUocyl7aWYoIm51bWJlciIhPXR5cGVvZiBzKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJyk7aWYoczwwKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgIicrcysnIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gInNpemUiJyl9ZnVuY3Rpb24gYWxsb2NVbnNhZmUocyl7cmV0dXJuIGFzc2VydFNpemUocyksY3JlYXRlQnVmZmVyKHM8MD8wOjB8Y2hlY2tlZChzKSl9ZnVuY3Rpb24gZnJvbUFycmF5TGlrZShzKXtjb25zdCBvPXMubGVuZ3RoPDA/MDowfGNoZWNrZWQocy5sZW5ndGgpLGk9Y3JlYXRlQnVmZmVyKG8pO2ZvcihsZXQgYT0wO2E8bzthKz0xKWlbYV09MjU1JnNbYV07cmV0dXJuIGl9ZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyKHMsbyxpKXtpZihvPDB8fHMuYnl0ZUxlbmd0aDxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcib2Zmc2V0IiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTtpZihzLmJ5dGVMZW5ndGg8bysoaXx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJsZW5ndGgiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO2xldCBhO3JldHVybiBhPXZvaWQgMD09PW8mJnZvaWQgMD09PWk/bmV3IFVpbnQ4QXJyYXkocyk6dm9pZCAwPT09aT9uZXcgVWludDhBcnJheShzLG8pOm5ldyBVaW50OEFycmF5KHMsbyxpKSxPYmplY3Quc2V0UHJvdG90eXBlT2YoYSxCdWZmZXIucHJvdG90eXBlKSxhfWZ1bmN0aW9uIGNoZWNrZWQocyl7aWYocz49dyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrdy50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfHN9ZnVuY3Rpb24gYnl0ZUxlbmd0aChzLG8pe2lmKEJ1ZmZlci5pc0J1ZmZlcihzKSlyZXR1cm4gcy5sZW5ndGg7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KHMpfHxpc0luc3RhbmNlKHMsQXJyYXlCdWZmZXIpKXJldHVybiBzLmJ5dGVMZW5ndGg7aWYoInN0cmluZyIhPXR5cGVvZiBzKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAic3RyaW5nIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiBzKTtjb25zdCBpPXMubGVuZ3RoLGE9YXJndW1lbnRzLmxlbmd0aD4yJiYhMD09PWFyZ3VtZW50c1syXTtpZighYSYmMD09PWkpcmV0dXJuIDA7bGV0IHU9ITE7Zm9yKDs7KXN3aXRjaChvKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIHV0ZjhUb0J5dGVzKHMpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqaTtjYXNlImhleCI6cmV0dXJuIGk+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gYmFzZTY0VG9CeXRlcyhzKS5sZW5ndGg7ZGVmYXVsdDppZih1KXJldHVybiBhPy0xOnV0ZjhUb0J5dGVzKHMpLmxlbmd0aDtvPSgiIitvKS50b0xvd2VyQ2FzZSgpLHU9ITB9fWZ1bmN0aW9uIHNsb3dUb1N0cmluZyhzLG8saSl7bGV0IGE9ITE7aWYoKHZvaWQgMD09PW98fG88MCkmJihvPTApLG8+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PWl8fGk+dGhpcy5sZW5ndGgpJiYoaT10aGlzLmxlbmd0aCksaTw9MClyZXR1cm4iIjtpZigoaT4+Pj0wKTw9KG8+Pj49MCkpcmV0dXJuIiI7Zm9yKHN8fChzPSJ1dGY4Iik7Oylzd2l0Y2gocyl7Y2FzZSJoZXgiOnJldHVybiBoZXhTbGljZSh0aGlzLG8saSk7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gdXRmOFNsaWNlKHRoaXMsbyxpKTtjYXNlImFzY2lpIjpyZXR1cm4gYXNjaWlTbGljZSh0aGlzLG8saSk7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbGF0aW4xU2xpY2UodGhpcyxvLGkpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gYmFzZTY0U2xpY2UodGhpcyxvLGkpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsbyxpKTtkZWZhdWx0OmlmKGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitzKTtzPShzKyIiKS50b0xvd2VyQ2FzZSgpLGE9ITB9fWZ1bmN0aW9uIHN3YXAocyxvLGkpe2NvbnN0IGE9c1tvXTtzW29dPXNbaV0sc1tpXT1hfWZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mKHMsbyxpLGEsdSl7aWYoMD09PXMubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2YgaT8oYT1pLGk9MCk6aT4yMTQ3NDgzNjQ3P2k9MjE0NzQ4MzY0NzppPC0yMTQ3NDgzNjQ4JiYoaT0tMjE0NzQ4MzY0OCksbnVtYmVySXNOYU4oaT0raSkmJihpPXU/MDpzLmxlbmd0aC0xKSxpPDAmJihpPXMubGVuZ3RoK2kpLGk+PXMubGVuZ3RoKXtpZih1KXJldHVybi0xO2k9cy5sZW5ndGgtMX1lbHNlIGlmKGk8MCl7aWYoIXUpcmV0dXJuLTE7aT0wfWlmKCJzdHJpbmciPT10eXBlb2YgbyYmKG89QnVmZmVyLmZyb20obyxhKSksQnVmZmVyLmlzQnVmZmVyKG8pKXJldHVybiAwPT09by5sZW5ndGg/LTE6YXJyYXlJbmRleE9mKHMsbyxpLGEsdSk7aWYoIm51bWJlciI9PXR5cGVvZiBvKXJldHVybiBvJj0yNTUsImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/dT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwocyxvLGkpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwocyxvLGkpOmFycmF5SW5kZXhPZihzLFtvXSxpLGEsdSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gYXJyYXlJbmRleE9mKHMsbyxpLGEsdSl7bGV0IF8sdz0xLHg9cy5sZW5ndGgsQz1vLmxlbmd0aDtpZih2b2lkIDAhPT1hJiYoInVjczIiPT09KGE9U3RyaW5nKGEpLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09YXx8InV0ZjE2bGUiPT09YXx8InV0Zi0xNmxlIj09PWEpKXtpZihzLmxlbmd0aDwyfHxvLmxlbmd0aDwyKXJldHVybi0xO3c9Mix4Lz0yLEMvPTIsaS89Mn1mdW5jdGlvbiByZWFkKHMsbyl7cmV0dXJuIDE9PT13P3Nbb106cy5yZWFkVUludDE2QkUobyp3KX1pZih1KXtsZXQgYT0tMTtmb3IoXz1pO188eDtfKyspaWYocmVhZChzLF8pPT09cmVhZChvLC0xPT09YT8wOl8tYSkpe2lmKC0xPT09YSYmKGE9XyksXy1hKzE9PT1DKXJldHVybiBhKnd9ZWxzZS0xIT09YSYmKF8tPV8tYSksYT0tMX1lbHNlIGZvcihpK0M+eCYmKGk9eC1DKSxfPWk7Xz49MDtfLS0pe2xldCBpPSEwO2ZvcihsZXQgYT0wO2E8QzthKyspaWYocmVhZChzLF8rYSkhPT1yZWFkKG8sYSkpe2k9ITE7YnJlYWt9aWYoaSlyZXR1cm4gX31yZXR1cm4tMX1mdW5jdGlvbiBoZXhXcml0ZShzLG8saSxhKXtpPU51bWJlcihpKXx8MDtjb25zdCB1PXMubGVuZ3RoLWk7YT8oYT1OdW1iZXIoYSkpPnUmJihhPXUpOmE9dTtjb25zdCBfPW8ubGVuZ3RoO2xldCB3O2ZvcihhPl8vMiYmKGE9Xy8yKSx3PTA7dzxhOysrdyl7Y29uc3QgYT1wYXJzZUludChvLnN1YnN0cigyKncsMiksMTYpO2lmKG51bWJlcklzTmFOKGEpKXJldHVybiB3O3NbaSt3XT1hfXJldHVybiB3fWZ1bmN0aW9uIHV0ZjhXcml0ZShzLG8saSxhKXtyZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhvLHMubGVuZ3RoLWkpLHMsaSxhKX1mdW5jdGlvbiBhc2NpaVdyaXRlKHMsbyxpLGEpe3JldHVybiBibGl0QnVmZmVyKGZ1bmN0aW9uIGFzY2lpVG9CeXRlcyhzKXtjb25zdCBvPVtdO2ZvcihsZXQgaT0wO2k8cy5sZW5ndGg7KytpKW8ucHVzaCgyNTUmcy5jaGFyQ29kZUF0KGkpKTtyZXR1cm4gb30obykscyxpLGEpfWZ1bmN0aW9uIGJhc2U2NFdyaXRlKHMsbyxpLGEpe3JldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMobykscyxpLGEpfWZ1bmN0aW9uIHVjczJXcml0ZShzLG8saSxhKXtyZXR1cm4gYmxpdEJ1ZmZlcihmdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyhzLG8pe2xldCBpLGEsdTtjb25zdCBfPVtdO2ZvcihsZXQgdz0wO3c8cy5sZW5ndGgmJiEoKG8tPTIpPDApOysrdylpPXMuY2hhckNvZGVBdCh3KSxhPWk+PjgsdT1pJTI1NixfLnB1c2godSksXy5wdXNoKGEpO3JldHVybiBffShvLHMubGVuZ3RoLWkpLHMsaSxhKX1mdW5jdGlvbiBiYXNlNjRTbGljZShzLG8saSl7cmV0dXJuIDA9PT1vJiZpPT09cy5sZW5ndGg/YS5mcm9tQnl0ZUFycmF5KHMpOmEuZnJvbUJ5dGVBcnJheShzLnNsaWNlKG8saSkpfWZ1bmN0aW9uIHV0ZjhTbGljZShzLG8saSl7aT1NYXRoLm1pbihzLmxlbmd0aCxpKTtjb25zdCBhPVtdO2xldCB1PW87Zm9yKDt1PGk7KXtjb25zdCBvPXNbdV07bGV0IF89bnVsbCx3PW8+MjM5PzQ6bz4yMjM/MzpvPjE5MT8yOjE7aWYodSt3PD1pKXtsZXQgaSxhLHgsQztzd2l0Y2godyl7Y2FzZSAxOm88MTI4JiYoXz1vKTticmVhaztjYXNlIDI6aT1zW3UrMV0sMTI4PT0oMTkyJmkpJiYoQz0oMzEmbyk8PDZ8NjMmaSxDPjEyNyYmKF89QykpO2JyZWFrO2Nhc2UgMzppPXNbdSsxXSxhPXNbdSsyXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZhKSYmKEM9KDE1Jm8pPDwxMnwoNjMmaSk8PDZ8NjMmYSxDPjIwNDcmJihDPDU1Mjk2fHxDPjU3MzQzKSYmKF89QykpO2JyZWFrO2Nhc2UgNDppPXNbdSsxXSxhPXNbdSsyXSx4PXNbdSszXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZhKSYmMTI4PT0oMTkyJngpJiYoQz0oMTUmbyk8PDE4fCg2MyZpKTw8MTJ8KDYzJmEpPDw2fDYzJngsQz42NTUzNSYmQzwxMTE0MTEyJiYoXz1DKSl9fW51bGw9PT1fPyhfPTY1NTMzLHc9MSk6Xz42NTUzNSYmKF8tPTY1NTM2LGEucHVzaChfPj4+MTAmMTAyM3w1NTI5NiksXz01NjMyMHwxMDIzJl8pLGEucHVzaChfKSx1Kz13fXJldHVybiBmdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkocyl7Y29uc3Qgbz1zLmxlbmd0aDtpZihvPD14KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxzKTtsZXQgaT0iIixhPTA7Zm9yKDthPG87KWkrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHMuc2xpY2UoYSxhKz14KSk7cmV0dXJuIGl9KGEpfW8ua01heExlbmd0aD13LEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUPWZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0KCl7dHJ5e2NvbnN0IHM9bmV3IFVpbnQ4QXJyYXkoMSksbz17Zm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX07cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihvLFVpbnQ4QXJyYXkucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YocyxvKSw0Mj09PXMuZm9vKCl9Y2F0Y2gocyl7cmV0dXJuITF9fSgpLEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUfHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGV8fCJmdW5jdGlvbiIhPXR5cGVvZiBjb25zb2xlLmVycm9yfHxjb25zb2xlLmVycm9yKCJUaGlzIGJyb3dzZXIgbGFja3MgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpIHN1cHBvcnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4iKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwicGFyZW50Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZihCdWZmZXIuaXNCdWZmZXIodGhpcykpcmV0dXJuIHRoaXMuYnVmZmVyfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCJvZmZzZXQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKEJ1ZmZlci5pc0J1ZmZlcih0aGlzKSlyZXR1cm4gdGhpcy5ieXRlT2Zmc2V0fX0pLEJ1ZmZlci5wb29sU2l6ZT04MTkyLEJ1ZmZlci5mcm9tPWZ1bmN0aW9uKHMsbyxpKXtyZXR1cm4gZnJvbShzLG8saSl9LE9iamVjdC5zZXRQcm90b3R5cGVPZihCdWZmZXIucHJvdG90eXBlLFVpbnQ4QXJyYXkucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2YoQnVmZmVyLFVpbnQ4QXJyYXkpLEJ1ZmZlci5hbGxvYz1mdW5jdGlvbihzLG8saSl7cmV0dXJuIGZ1bmN0aW9uIGFsbG9jKHMsbyxpKXtyZXR1cm4gYXNzZXJ0U2l6ZShzKSxzPD0wP2NyZWF0ZUJ1ZmZlcihzKTp2b2lkIDAhPT1vPyJzdHJpbmciPT10eXBlb2YgaT9jcmVhdGVCdWZmZXIocykuZmlsbChvLGkpOmNyZWF0ZUJ1ZmZlcihzKS5maWxsKG8pOmNyZWF0ZUJ1ZmZlcihzKX0ocyxvLGkpfSxCdWZmZXIuYWxsb2NVbnNhZmU9ZnVuY3Rpb24ocyl7cmV0dXJuIGFsbG9jVW5zYWZlKHMpfSxCdWZmZXIuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHMpe3JldHVybiBhbGxvY1Vuc2FmZShzKX0sQnVmZmVyLmlzQnVmZmVyPWZ1bmN0aW9uIGlzQnVmZmVyKHMpe3JldHVybiBudWxsIT1zJiYhMD09PXMuX2lzQnVmZmVyJiZzIT09QnVmZmVyLnByb3RvdHlwZX0sQnVmZmVyLmNvbXBhcmU9ZnVuY3Rpb24gY29tcGFyZShzLG8pe2lmKGlzSW5zdGFuY2UocyxVaW50OEFycmF5KSYmKHM9QnVmZmVyLmZyb20ocyxzLm9mZnNldCxzLmJ5dGVMZW5ndGgpKSxpc0luc3RhbmNlKG8sVWludDhBcnJheSkmJihvPUJ1ZmZlci5mcm9tKG8sby5vZmZzZXQsby5ieXRlTGVuZ3RoKSksIUJ1ZmZlci5pc0J1ZmZlcihzKXx8IUJ1ZmZlci5pc0J1ZmZlcihvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgImJ1ZjEiLCAiYnVmMiIgYXJndW1lbnRzIG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXknKTtpZihzPT09bylyZXR1cm4gMDtsZXQgaT1zLmxlbmd0aCxhPW8ubGVuZ3RoO2ZvcihsZXQgdT0wLF89TWF0aC5taW4oaSxhKTt1PF87Kyt1KWlmKHNbdV0hPT1vW3VdKXtpPXNbdV0sYT1vW3VdO2JyZWFrfXJldHVybiBpPGE/LTE6YTxpPzE6MH0sQnVmZmVyLmlzRW5jb2Rpbmc9ZnVuY3Rpb24gaXNFbmNvZGluZyhzKXtzd2l0Y2goU3RyaW5nKHMpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sQnVmZmVyLmNvbmNhdD1mdW5jdGlvbiBjb25jYXQocyxvKXtpZighQXJyYXkuaXNBcnJheShzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXMubGVuZ3RoKXJldHVybiBCdWZmZXIuYWxsb2MoMCk7bGV0IGk7aWYodm9pZCAwPT09bylmb3Iobz0wLGk9MDtpPHMubGVuZ3RoOysraSlvKz1zW2ldLmxlbmd0aDtjb25zdCBhPUJ1ZmZlci5hbGxvY1Vuc2FmZShvKTtsZXQgdT0wO2ZvcihpPTA7aTxzLmxlbmd0aDsrK2kpe2xldCBvPXNbaV07aWYoaXNJbnN0YW5jZShvLFVpbnQ4QXJyYXkpKXUrby5sZW5ndGg+YS5sZW5ndGg/KEJ1ZmZlci5pc0J1ZmZlcihvKXx8KG89QnVmZmVyLmZyb20obykpLG8uY29weShhLHUpKTpVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChhLG8sdSk7ZWxzZXtpZighQnVmZmVyLmlzQnVmZmVyKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkoYSx1KX11Kz1vLmxlbmd0aH1yZXR1cm4gYX0sQnVmZmVyLmJ5dGVMZW5ndGg9Ynl0ZUxlbmd0aCxCdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxCdWZmZXIucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbiBzd2FwMTYoKXtjb25zdCBzPXRoaXMubGVuZ3RoO2lmKHMlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IobGV0IG89MDtvPHM7bys9Milzd2FwKHRoaXMsbyxvKzEpO3JldHVybiB0aGlzfSxCdWZmZXIucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbiBzd2FwMzIoKXtjb25zdCBzPXRoaXMubGVuZ3RoO2lmKHMlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IobGV0IG89MDtvPHM7bys9NClzd2FwKHRoaXMsbyxvKzMpLHN3YXAodGhpcyxvKzEsbysyKTtyZXR1cm4gdGhpc30sQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24gc3dhcDY0KCl7Y29uc3Qgcz10aGlzLmxlbmd0aDtpZihzJTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKGxldCBvPTA7bzxzO28rPTgpc3dhcCh0aGlzLG8sbys3KSxzd2FwKHRoaXMsbysxLG8rNiksc3dhcCh0aGlzLG8rMixvKzUpLHN3YXAodGhpcyxvKzMsbys0KTtyZXR1cm4gdGhpc30sQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbiB0b1N0cmluZygpe2NvbnN0IHM9dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT1zPyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP3V0ZjhTbGljZSh0aGlzLDAscyk6c2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sQnVmZmVyLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZz1CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nLEJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uIGVxdWFscyhzKXtpZighQnVmZmVyLmlzQnVmZmVyKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXN8fDA9PT1CdWZmZXIuY29tcGFyZSh0aGlzLHMpfSxCdWZmZXIucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24gaW5zcGVjdCgpe2xldCBzPSIiO2NvbnN0IGk9by5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gcz10aGlzLnRvU3RyaW5nKCJoZXgiLDAsaSkucmVwbGFjZSgvKC57Mn0pL2csIiQxICIpLnRyaW0oKSx0aGlzLmxlbmd0aD5pJiYocys9IiAuLi4gIiksIjxCdWZmZXIgIitzKyI+In0sXyYmKEJ1ZmZlci5wcm90b3R5cGVbX109QnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0KSxCdWZmZXIucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24gY29tcGFyZShzLG8saSxhLHUpe2lmKGlzSW5zdGFuY2UocyxVaW50OEFycmF5KSYmKHM9QnVmZmVyLmZyb20ocyxzLm9mZnNldCxzLmJ5dGVMZW5ndGgpKSwhQnVmZmVyLmlzQnVmZmVyKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAidGFyZ2V0IiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHMpO2lmKHZvaWQgMD09PW8mJihvPTApLHZvaWQgMD09PWkmJihpPXM/cy5sZW5ndGg6MCksdm9pZCAwPT09YSYmKGE9MCksdm9pZCAwPT09dSYmKHU9dGhpcy5sZW5ndGgpLG88MHx8aT5zLmxlbmd0aHx8YTwwfHx1PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihhPj11JiZvPj1pKXJldHVybiAwO2lmKGE+PXUpcmV0dXJuLTE7aWYobz49aSlyZXR1cm4gMTtpZih0aGlzPT09cylyZXR1cm4gMDtsZXQgXz0odT4+Pj0wKS0oYT4+Pj0wKSx3PShpPj4+PTApLShvPj4+PTApO2NvbnN0IHg9TWF0aC5taW4oXyx3KSxDPXRoaXMuc2xpY2UoYSx1KSxqPXMuc2xpY2UobyxpKTtmb3IobGV0IHM9MDtzPHg7KytzKWlmKENbc10hPT1qW3NdKXtfPUNbc10sdz1qW3NdO2JyZWFrfXJldHVybiBfPHc/LTE6dzxfPzE6MH0sQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbiBpbmNsdWRlcyhzLG8saSl7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YocyxvLGkpfSxCdWZmZXIucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24gaW5kZXhPZihzLG8saSl7cmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMscyxvLGksITApfSxCdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uIGxhc3RJbmRleE9mKHMsbyxpKXtyZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcyxzLG8saSwhMSl9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24gd3JpdGUocyxvLGksYSl7aWYodm9pZCAwPT09bylhPSJ1dGY4IixpPXRoaXMubGVuZ3RoLG89MDtlbHNlIGlmKHZvaWQgMD09PWkmJiJzdHJpbmciPT10eXBlb2YgbylhPW8saT10aGlzLmxlbmd0aCxvPTA7ZWxzZXtpZighaXNGaW5pdGUobykpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO28+Pj49MCxpc0Zpbml0ZShpKT8oaT4+Pj0wLHZvaWQgMD09PWEmJihhPSJ1dGY4IikpOihhPWksaT12b2lkIDApfWNvbnN0IHU9dGhpcy5sZW5ndGgtbztpZigodm9pZCAwPT09aXx8aT51KSYmKGk9dSkscy5sZW5ndGg+MCYmKGk8MHx8bzwwKXx8bz50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTthfHwoYT0idXRmOCIpO2xldCBfPSExO2Zvcig7Oylzd2l0Y2goYSl7Y2FzZSJoZXgiOnJldHVybiBoZXhXcml0ZSh0aGlzLHMsbyxpKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiB1dGY4V3JpdGUodGhpcyxzLG8saSk7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gYXNjaWlXcml0ZSh0aGlzLHMsbyxpKTtjYXNlImJhc2U2NCI6cmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMscyxvLGkpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gdWNzMldyaXRlKHRoaXMscyxvLGkpO2RlZmF1bHQ6aWYoXyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2EpO2E9KCIiK2EpLnRvTG93ZXJDYXNlKCksXz0hMH19LEJ1ZmZlci5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uIHRvSlNPTigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07Y29uc3QgeD00MDk2O2Z1bmN0aW9uIGFzY2lpU2xpY2UocyxvLGkpe2xldCBhPSIiO2k9TWF0aC5taW4ocy5sZW5ndGgsaSk7Zm9yKGxldCB1PW87dTxpOysrdSlhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZzW3VdKTtyZXR1cm4gYX1mdW5jdGlvbiBsYXRpbjFTbGljZShzLG8saSl7bGV0IGE9IiI7aT1NYXRoLm1pbihzLmxlbmd0aCxpKTtmb3IobGV0IHU9bzt1PGk7Kyt1KWErPVN0cmluZy5mcm9tQ2hhckNvZGUoc1t1XSk7cmV0dXJuIGF9ZnVuY3Rpb24gaGV4U2xpY2UocyxvLGkpe2NvbnN0IGE9cy5sZW5ndGg7KCFvfHxvPDApJiYobz0wKSwoIWl8fGk8MHx8aT5hKSYmKGk9YSk7bGV0IHU9IiI7Zm9yKGxldCBhPW87YTxpOysrYSl1Kz1MW3NbYV1dO3JldHVybiB1fWZ1bmN0aW9uIHV0ZjE2bGVTbGljZShzLG8saSl7Y29uc3QgYT1zLnNsaWNlKG8saSk7bGV0IHU9IiI7Zm9yKGxldCBzPTA7czxhLmxlbmd0aC0xO3MrPTIpdSs9U3RyaW5nLmZyb21DaGFyQ29kZShhW3NdKzI1NiphW3MrMV0pO3JldHVybiB1fWZ1bmN0aW9uIGNoZWNrT2Zmc2V0KHMsbyxpKXtpZihzJTEhPTB8fHM8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYocytvPmkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBjaGVja0ludChzLG8saSxhLHUsXyl7aWYoIUJ1ZmZlci5pc0J1ZmZlcihzKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYobz51fHxvPF8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKGkrYT5zLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gd3J0QmlnVUludDY0TEUocyxvLGksYSx1KXtjaGVja0ludEJJKG8sYSx1LHMsaSw3KTtsZXQgXz1OdW1iZXIobyZCaWdJbnQoNDI5NDk2NzI5NSkpO3NbaSsrXT1fLF8+Pj04LHNbaSsrXT1fLF8+Pj04LHNbaSsrXT1fLF8+Pj04LHNbaSsrXT1fO2xldCB3PU51bWJlcihvPj5CaWdJbnQoMzIpJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7cmV0dXJuIHNbaSsrXT13LHc+Pj04LHNbaSsrXT13LHc+Pj04LHNbaSsrXT13LHc+Pj04LHNbaSsrXT13LGl9ZnVuY3Rpb24gd3J0QmlnVUludDY0QkUocyxvLGksYSx1KXtjaGVja0ludEJJKG8sYSx1LHMsaSw3KTtsZXQgXz1OdW1iZXIobyZCaWdJbnQoNDI5NDk2NzI5NSkpO3NbaSs3XT1fLF8+Pj04LHNbaSs2XT1fLF8+Pj04LHNbaSs1XT1fLF8+Pj04LHNbaSs0XT1fO2xldCB3PU51bWJlcihvPj5CaWdJbnQoMzIpJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7cmV0dXJuIHNbaSszXT13LHc+Pj04LHNbaSsyXT13LHc+Pj04LHNbaSsxXT13LHc+Pj04LHNbaV09dyxpKzh9ZnVuY3Rpb24gY2hlY2tJRUVFNzU0KHMsbyxpLGEsdSxfKXtpZihpK2E+cy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKGk8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gd3JpdGVGbG9hdChzLG8saSxhLF8pe3JldHVybiBvPStvLGk+Pj49MCxffHxjaGVja0lFRUU3NTQocywwLGksNCksdS53cml0ZShzLG8saSxhLDIzLDQpLGkrNH1mdW5jdGlvbiB3cml0ZURvdWJsZShzLG8saSxhLF8pe3JldHVybiBvPStvLGk+Pj49MCxffHxjaGVja0lFRUU3NTQocywwLGksOCksdS53cml0ZShzLG8saSxhLDUyLDgpLGkrOH1CdWZmZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uIHNsaWNlKHMsbyl7Y29uc3QgaT10aGlzLmxlbmd0aDsocz1+fnMpPDA/KHMrPWkpPDAmJihzPTApOnM+aSYmKHM9aSksKG89dm9pZCAwPT09bz9pOn5+byk8MD8obys9aSk8MCYmKG89MCk6bz5pJiYobz1pKSxvPHMmJihvPXMpO2NvbnN0IGE9dGhpcy5zdWJhcnJheShzLG8pO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YoYSxCdWZmZXIucHJvdG90eXBlKSxhfSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50TEU9QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uIHJlYWRVSW50TEUocyxvLGkpe3M+Pj49MCxvPj4+PTAsaXx8Y2hlY2tPZmZzZXQocyxvLHRoaXMubGVuZ3RoKTtsZXQgYT10aGlzW3NdLHU9MSxfPTA7Zm9yKDsrK188byYmKHUqPTI1Nik7KWErPXRoaXNbcytfXSp1O3JldHVybiBhfSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50QkU9QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uIHJlYWRVSW50QkUocyxvLGkpe3M+Pj49MCxvPj4+PTAsaXx8Y2hlY2tPZmZzZXQocyxvLHRoaXMubGVuZ3RoKTtsZXQgYT10aGlzW3MrLS1vXSx1PTE7Zm9yKDtvPjAmJih1Kj0yNTYpOylhKz10aGlzW3MrLS1vXSp1O3JldHVybiBhfSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50OD1CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbiByZWFkVUludDgocyxvKXtyZXR1cm4gcz4+Pj0wLG98fGNoZWNrT2Zmc2V0KHMsMSx0aGlzLmxlbmd0aCksdGhpc1tzXX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2TEU9QnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24gcmVhZFVJbnQxNkxFKHMsbyl7cmV0dXJuIHM+Pj49MCxvfHxjaGVja09mZnNldChzLDIsdGhpcy5sZW5ndGgpLHRoaXNbc118dGhpc1tzKzFdPDw4fSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MTZCRT1CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbiByZWFkVUludDE2QkUocyxvKXtyZXR1cm4gcz4+Pj0wLG98fGNoZWNrT2Zmc2V0KHMsMix0aGlzLmxlbmd0aCksdGhpc1tzXTw8OHx0aGlzW3MrMV19LEJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkxFPUJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uIHJlYWRVSW50MzJMRShzLG8pe3JldHVybiBzPj4+PTAsb3x8Y2hlY2tPZmZzZXQocyw0LHRoaXMubGVuZ3RoKSwodGhpc1tzXXx0aGlzW3MrMV08PDh8dGhpc1tzKzJdPDwxNikrMTY3NzcyMTYqdGhpc1tzKzNdfSxCdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzJCRT1CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbiByZWFkVUludDMyQkUocyxvKXtyZXR1cm4gcz4+Pj0wLG98fGNoZWNrT2Zmc2V0KHMsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1tzXSsodGhpc1tzKzFdPDwxNnx0aGlzW3MrMl08PDh8dGhpc1tzKzNdKX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnVUludDY0TEU9ZGVmaW5lQmlnSW50TWV0aG9kKChmdW5jdGlvbiByZWFkQmlnVUludDY0TEUocyl7dmFsaWRhdGVOdW1iZXIocz4+Pj0wLCJvZmZzZXQiKTtjb25zdCBvPXRoaXNbc10saT10aGlzW3MrN107dm9pZCAwIT09byYmdm9pZCAwIT09aXx8Ym91bmRzRXJyb3Iocyx0aGlzLmxlbmd0aC04KTtjb25zdCBhPW8rMjU2KnRoaXNbKytzXSs2NTUzNip0aGlzWysrc10rdGhpc1srK3NdKjIqKjI0LHU9dGhpc1srK3NdKzI1Nip0aGlzWysrc10rNjU1MzYqdGhpc1srK3NdK2kqMioqMjQ7cmV0dXJuIEJpZ0ludChhKSsoQmlnSW50KHUpPDxCaWdJbnQoMzIpKX0pKSxCdWZmZXIucHJvdG90eXBlLnJlYWRCaWdVSW50NjRCRT1kZWZpbmVCaWdJbnRNZXRob2QoKGZ1bmN0aW9uIHJlYWRCaWdVSW50NjRCRShzKXt2YWxpZGF0ZU51bWJlcihzPj4+PTAsIm9mZnNldCIpO2NvbnN0IG89dGhpc1tzXSxpPXRoaXNbcys3XTt2b2lkIDAhPT1vJiZ2b2lkIDAhPT1pfHxib3VuZHNFcnJvcihzLHRoaXMubGVuZ3RoLTgpO2NvbnN0IGE9byoyKioyNCs2NTUzNip0aGlzWysrc10rMjU2KnRoaXNbKytzXSt0aGlzWysrc10sdT10aGlzWysrc10qMioqMjQrNjU1MzYqdGhpc1srK3NdKzI1Nip0aGlzWysrc10raTtyZXR1cm4oQmlnSW50KGEpPDxCaWdJbnQoMzIpKStCaWdJbnQodSl9KSksQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24gcmVhZEludExFKHMsbyxpKXtzPj4+PTAsbz4+Pj0wLGl8fGNoZWNrT2Zmc2V0KHMsbyx0aGlzLmxlbmd0aCk7bGV0IGE9dGhpc1tzXSx1PTEsXz0wO2Zvcig7KytfPG8mJih1Kj0yNTYpOylhKz10aGlzW3MrX10qdTtyZXR1cm4gdSo9MTI4LGE+PXUmJihhLT1NYXRoLnBvdygyLDgqbykpLGF9LEJ1ZmZlci5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uIHJlYWRJbnRCRShzLG8saSl7cz4+Pj0wLG8+Pj49MCxpfHxjaGVja09mZnNldChzLG8sdGhpcy5sZW5ndGgpO2xldCBhPW8sdT0xLF89dGhpc1tzKy0tYV07Zm9yKDthPjAmJih1Kj0yNTYpOylfKz10aGlzW3MrLS1hXSp1O3JldHVybiB1Kj0xMjgsXz49dSYmKF8tPU1hdGgucG93KDIsOCpvKSksX30sQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbiByZWFkSW50OChzLG8pe3JldHVybiBzPj4+PTAsb3x8Y2hlY2tPZmZzZXQocywxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tzXT8tMSooMjU1LXRoaXNbc10rMSk6dGhpc1tzXX0sQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbiByZWFkSW50MTZMRShzLG8pe3M+Pj49MCxvfHxjaGVja09mZnNldChzLDIsdGhpcy5sZW5ndGgpO2NvbnN0IGk9dGhpc1tzXXx0aGlzW3MrMV08PDg7cmV0dXJuIDMyNzY4Jmk/NDI5NDkwMTc2MHxpOml9LEJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24gcmVhZEludDE2QkUocyxvKXtzPj4+PTAsb3x8Y2hlY2tPZmZzZXQocywyLHRoaXMubGVuZ3RoKTtjb25zdCBpPXRoaXNbcysxXXx0aGlzW3NdPDw4O3JldHVybiAzMjc2OCZpPzQyOTQ5MDE3NjB8aTppfSxCdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uIHJlYWRJbnQzMkxFKHMsbyl7cmV0dXJuIHM+Pj49MCxvfHxjaGVja09mZnNldChzLDQsdGhpcy5sZW5ndGgpLHRoaXNbc118dGhpc1tzKzFdPDw4fHRoaXNbcysyXTw8MTZ8dGhpc1tzKzNdPDwyNH0sQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbiByZWFkSW50MzJCRShzLG8pe3JldHVybiBzPj4+PTAsb3x8Y2hlY2tPZmZzZXQocyw0LHRoaXMubGVuZ3RoKSx0aGlzW3NdPDwyNHx0aGlzW3MrMV08PDE2fHRoaXNbcysyXTw8OHx0aGlzW3MrM119LEJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ0ludDY0TEU9ZGVmaW5lQmlnSW50TWV0aG9kKChmdW5jdGlvbiByZWFkQmlnSW50NjRMRShzKXt2YWxpZGF0ZU51bWJlcihzPj4+PTAsIm9mZnNldCIpO2NvbnN0IG89dGhpc1tzXSxpPXRoaXNbcys3XTt2b2lkIDAhPT1vJiZ2b2lkIDAhPT1pfHxib3VuZHNFcnJvcihzLHRoaXMubGVuZ3RoLTgpO2NvbnN0IGE9dGhpc1tzKzRdKzI1Nip0aGlzW3MrNV0rNjU1MzYqdGhpc1tzKzZdKyhpPDwyNCk7cmV0dXJuKEJpZ0ludChhKTw8QmlnSW50KDMyKSkrQmlnSW50KG8rMjU2KnRoaXNbKytzXSs2NTUzNip0aGlzWysrc10rdGhpc1srK3NdKjIqKjI0KX0pKSxCdWZmZXIucHJvdG90eXBlLnJlYWRCaWdJbnQ2NEJFPWRlZmluZUJpZ0ludE1ldGhvZCgoZnVuY3Rpb24gcmVhZEJpZ0ludDY0QkUocyl7dmFsaWRhdGVOdW1iZXIocz4+Pj0wLCJvZmZzZXQiKTtjb25zdCBvPXRoaXNbc10saT10aGlzW3MrN107dm9pZCAwIT09byYmdm9pZCAwIT09aXx8Ym91bmRzRXJyb3Iocyx0aGlzLmxlbmd0aC04KTtjb25zdCBhPShvPDwyNCkrNjU1MzYqdGhpc1srK3NdKzI1Nip0aGlzWysrc10rdGhpc1srK3NdO3JldHVybihCaWdJbnQoYSk8PEJpZ0ludCgzMikpK0JpZ0ludCh0aGlzWysrc10qMioqMjQrNjU1MzYqdGhpc1srK3NdKzI1Nip0aGlzWysrc10raSl9KSksQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbiByZWFkRmxvYXRMRShzLG8pe3JldHVybiBzPj4+PTAsb3x8Y2hlY2tPZmZzZXQocyw0LHRoaXMubGVuZ3RoKSx1LnJlYWQodGhpcyxzLCEwLDIzLDQpfSxCdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uIHJlYWRGbG9hdEJFKHMsbyl7cmV0dXJuIHM+Pj49MCxvfHxjaGVja09mZnNldChzLDQsdGhpcy5sZW5ndGgpLHUucmVhZCh0aGlzLHMsITEsMjMsNCl9LEJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uIHJlYWREb3VibGVMRShzLG8pe3JldHVybiBzPj4+PTAsb3x8Y2hlY2tPZmZzZXQocyw4LHRoaXMubGVuZ3RoKSx1LnJlYWQodGhpcyxzLCEwLDUyLDgpfSxCdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbiByZWFkRG91YmxlQkUocyxvKXtyZXR1cm4gcz4+Pj0wLG98fGNoZWNrT2Zmc2V0KHMsOCx0aGlzLmxlbmd0aCksdS5yZWFkKHRoaXMscywhMSw1Miw4KX0sQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnRMRT1CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uIHdyaXRlVUludExFKHMsbyxpLGEpe2lmKHM9K3Msbz4+Pj0wLGk+Pj49MCwhYSl7Y2hlY2tJbnQodGhpcyxzLG8saSxNYXRoLnBvdygyLDgqaSktMSwwKX1sZXQgdT0xLF89MDtmb3IodGhpc1tvXT0yNTUmczsrK188aSYmKHUqPTI1Nik7KXRoaXNbbytfXT1zL3UmMjU1O3JldHVybiBvK2l9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50QkU9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbiB3cml0ZVVJbnRCRShzLG8saSxhKXtpZihzPStzLG8+Pj49MCxpPj4+PTAsIWEpe2NoZWNrSW50KHRoaXMscyxvLGksTWF0aC5wb3coMiw4KmkpLTEsMCl9bGV0IHU9aS0xLF89MTtmb3IodGhpc1tvK3VdPTI1NSZzOy0tdT49MCYmKF8qPTI1Nik7KXRoaXNbbyt1XT1zL18mMjU1O3JldHVybiBvK2l9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50OD1CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24gd3JpdGVVSW50OChzLG8saSl7cmV0dXJuIHM9K3Msbz4+Pj0wLGl8fGNoZWNrSW50KHRoaXMscyxvLDEsMjU1LDApLHRoaXNbb109MjU1JnMsbysxfSxCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2TEU9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uIHdyaXRlVUludDE2TEUocyxvLGkpe3JldHVybiBzPStzLG8+Pj49MCxpfHxjaGVja0ludCh0aGlzLHMsbywyLDY1NTM1LDApLHRoaXNbb109MjU1JnMsdGhpc1tvKzFdPXM+Pj44LG8rMn0sQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQxNkJFPUJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbiB3cml0ZVVJbnQxNkJFKHMsbyxpKXtyZXR1cm4gcz0rcyxvPj4+PTAsaXx8Y2hlY2tJbnQodGhpcyxzLG8sMiw2NTUzNSwwKSx0aGlzW29dPXM+Pj44LHRoaXNbbysxXT0yNTUmcyxvKzJ9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzJMRT1CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24gd3JpdGVVSW50MzJMRShzLG8saSl7cmV0dXJuIHM9K3Msbz4+Pj0wLGl8fGNoZWNrSW50KHRoaXMscyxvLDQsNDI5NDk2NzI5NSwwKSx0aGlzW28rM109cz4+PjI0LHRoaXNbbysyXT1zPj4+MTYsdGhpc1tvKzFdPXM+Pj44LHRoaXNbb109MjU1JnMsbys0fSxCdWZmZXIucHJvdG90eXBlLndyaXRlVWludDMyQkU9QnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uIHdyaXRlVUludDMyQkUocyxvLGkpe3JldHVybiBzPStzLG8+Pj49MCxpfHxjaGVja0ludCh0aGlzLHMsbyw0LDQyOTQ5NjcyOTUsMCksdGhpc1tvXT1zPj4+MjQsdGhpc1tvKzFdPXM+Pj4xNix0aGlzW28rMl09cz4+PjgsdGhpc1tvKzNdPTI1NSZzLG8rNH0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFPWRlZmluZUJpZ0ludE1ldGhvZCgoZnVuY3Rpb24gd3JpdGVCaWdVSW50NjRMRShzLG89MCl7cmV0dXJuIHdydEJpZ1VJbnQ2NExFKHRoaXMscyxvLEJpZ0ludCgwKSxCaWdJbnQoIjB4ZmZmZmZmZmZmZmZmZmZmZiIpKX0pKSxCdWZmZXIucHJvdG90eXBlLndyaXRlQmlnVUludDY0QkU9ZGVmaW5lQmlnSW50TWV0aG9kKChmdW5jdGlvbiB3cml0ZUJpZ1VJbnQ2NEJFKHMsbz0wKXtyZXR1cm4gd3J0QmlnVUludDY0QkUodGhpcyxzLG8sQmlnSW50KDApLEJpZ0ludCgiMHhmZmZmZmZmZmZmZmZmZmZmIikpfSkpLEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbiB3cml0ZUludExFKHMsbyxpLGEpe2lmKHM9K3Msbz4+Pj0wLCFhKXtjb25zdCBhPU1hdGgucG93KDIsOCppLTEpO2NoZWNrSW50KHRoaXMscyxvLGksYS0xLC1hKX1sZXQgdT0wLF89MSx3PTA7Zm9yKHRoaXNbb109MjU1JnM7Kyt1PGkmJihfKj0yNTYpOylzPDAmJjA9PT13JiYwIT09dGhpc1tvK3UtMV0mJih3PTEpLHRoaXNbbyt1XT0ocy9ffDApLXcmMjU1O3JldHVybiBvK2l9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbiB3cml0ZUludEJFKHMsbyxpLGEpe2lmKHM9K3Msbz4+Pj0wLCFhKXtjb25zdCBhPU1hdGgucG93KDIsOCppLTEpO2NoZWNrSW50KHRoaXMscyxvLGksYS0xLC1hKX1sZXQgdT1pLTEsXz0xLHc9MDtmb3IodGhpc1tvK3VdPTI1NSZzOy0tdT49MCYmKF8qPTI1Nik7KXM8MCYmMD09PXcmJjAhPT10aGlzW28rdSsxXSYmKHc9MSksdGhpc1tvK3VdPShzL198MCktdyYyNTU7cmV0dXJuIG8raX0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24gd3JpdGVJbnQ4KHMsbyxpKXtyZXR1cm4gcz0rcyxvPj4+PTAsaXx8Y2hlY2tJbnQodGhpcyxzLG8sMSwxMjcsLTEyOCksczwwJiYocz0yNTUrcysxKSx0aGlzW29dPTI1NSZzLG8rMX0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24gd3JpdGVJbnQxNkxFKHMsbyxpKXtyZXR1cm4gcz0rcyxvPj4+PTAsaXx8Y2hlY2tJbnQodGhpcyxzLG8sMiwzMjc2NywtMzI3NjgpLHRoaXNbb109MjU1JnMsdGhpc1tvKzFdPXM+Pj44LG8rMn0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24gd3JpdGVJbnQxNkJFKHMsbyxpKXtyZXR1cm4gcz0rcyxvPj4+PTAsaXx8Y2hlY2tJbnQodGhpcyxzLG8sMiwzMjc2NywtMzI3NjgpLHRoaXNbb109cz4+PjgsdGhpc1tvKzFdPTI1NSZzLG8rMn0sQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24gd3JpdGVJbnQzMkxFKHMsbyxpKXtyZXR1cm4gcz0rcyxvPj4+PTAsaXx8Y2hlY2tJbnQodGhpcyxzLG8sNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0aGlzW29dPTI1NSZzLHRoaXNbbysxXT1zPj4+OCx0aGlzW28rMl09cz4+PjE2LHRoaXNbbyszXT1zPj4+MjQsbys0fSxCdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbiB3cml0ZUludDMyQkUocyxvLGkpe3JldHVybiBzPStzLG8+Pj49MCxpfHxjaGVja0ludCh0aGlzLHMsbyw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHM8MCYmKHM9NDI5NDk2NzI5NStzKzEpLHRoaXNbb109cz4+PjI0LHRoaXNbbysxXT1zPj4+MTYsdGhpc1tvKzJdPXM+Pj44LHRoaXNbbyszXT0yNTUmcyxvKzR9LEJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NExFPWRlZmluZUJpZ0ludE1ldGhvZCgoZnVuY3Rpb24gd3JpdGVCaWdJbnQ2NExFKHMsbz0wKXtyZXR1cm4gd3J0QmlnVUludDY0TEUodGhpcyxzLG8sLUJpZ0ludCgiMHg4MDAwMDAwMDAwMDAwMDAwIiksQmlnSW50KCIweDdmZmZmZmZmZmZmZmZmZmYiKSl9KSksQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkU9ZGVmaW5lQmlnSW50TWV0aG9kKChmdW5jdGlvbiB3cml0ZUJpZ0ludDY0QkUocyxvPTApe3JldHVybiB3cnRCaWdVSW50NjRCRSh0aGlzLHMsbywtQmlnSW50KCIweDgwMDAwMDAwMDAwMDAwMDAiKSxCaWdJbnQoIjB4N2ZmZmZmZmZmZmZmZmZmZiIpKX0pKSxCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbiB3cml0ZUZsb2F0TEUocyxvLGkpe3JldHVybiB3cml0ZUZsb2F0KHRoaXMscyxvLCEwLGkpfSxCdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbiB3cml0ZUZsb2F0QkUocyxvLGkpe3JldHVybiB3cml0ZUZsb2F0KHRoaXMscyxvLCExLGkpfSxCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24gd3JpdGVEb3VibGVMRShzLG8saSl7cmV0dXJuIHdyaXRlRG91YmxlKHRoaXMscyxvLCEwLGkpfSxCdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24gd3JpdGVEb3VibGVCRShzLG8saSl7cmV0dXJuIHdyaXRlRG91YmxlKHRoaXMscyxvLCExLGkpfSxCdWZmZXIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24gY29weShzLG8saSxhKXtpZighQnVmZmVyLmlzQnVmZmVyKHMpKXRocm93IG5ldyBUeXBlRXJyb3IoImFyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlciIpO2lmKGl8fChpPTApLGF8fDA9PT1hfHwoYT10aGlzLmxlbmd0aCksbz49cy5sZW5ndGgmJihvPXMubGVuZ3RoKSxvfHwobz0wKSxhPjAmJmE8aSYmKGE9aSksYT09PWkpcmV0dXJuIDA7aWYoMD09PXMubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYobzwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYoaTwwfHxpPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYoYTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO2E+dGhpcy5sZW5ndGgmJihhPXRoaXMubGVuZ3RoKSxzLmxlbmd0aC1vPGEtaSYmKGE9cy5sZW5ndGgtbytpKTtjb25zdCB1PWEtaTtyZXR1cm4gdGhpcz09PXMmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluP3RoaXMuY29weVdpdGhpbihvLGksYSk6VWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwocyx0aGlzLnN1YmFycmF5KGksYSksbyksdX0sQnVmZmVyLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uIGZpbGwocyxvLGksYSl7aWYoInN0cmluZyI9PXR5cGVvZiBzKXtpZigic3RyaW5nIj09dHlwZW9mIG8/KGE9byxvPTAsaT10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBpJiYoYT1pLGk9dGhpcy5sZW5ndGgpLHZvaWQgMCE9PWEmJiJzdHJpbmciIT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYhQnVmZmVyLmlzRW5jb2RpbmcoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIithKTtpZigxPT09cy5sZW5ndGgpe2NvbnN0IG89cy5jaGFyQ29kZUF0KDApOygidXRmOCI9PT1hJiZvPDEyOHx8ImxhdGluMSI9PT1hKSYmKHM9byl9fWVsc2UibnVtYmVyIj09dHlwZW9mIHM/cyY9MjU1OiJib29sZWFuIj09dHlwZW9mIHMmJihzPU51bWJlcihzKSk7aWYobzwwfHx0aGlzLmxlbmd0aDxvfHx0aGlzLmxlbmd0aDxpKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihpPD1vKXJldHVybiB0aGlzO2xldCB1O2lmKG8+Pj49MCxpPXZvaWQgMD09PWk/dGhpcy5sZW5ndGg6aT4+PjAsc3x8KHM9MCksIm51bWJlciI9PXR5cGVvZiBzKWZvcih1PW87dTxpOysrdSl0aGlzW3VdPXM7ZWxzZXtjb25zdCBfPUJ1ZmZlci5pc0J1ZmZlcihzKT9zOkJ1ZmZlci5mcm9tKHMsYSksdz1fLmxlbmd0aDtpZigwPT09dyl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgIicrcysnIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCAidmFsdWUiJyk7Zm9yKHU9MDt1PGktbzsrK3UpdGhpc1t1K29dPV9bdSV3XX1yZXR1cm4gdGhpc307Y29uc3QgQz17fTtmdW5jdGlvbiBFKHMsbyxpKXtDW3NdPWNsYXNzIE5vZGVFcnJvciBleHRlbmRzIGl7Y29uc3RydWN0b3IoKXtzdXBlcigpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJtZXNzYWdlIix7dmFsdWU6by5hcHBseSh0aGlzLGFyZ3VtZW50cyksd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdGhpcy5uYW1lPWAke3RoaXMubmFtZX0gWyR7c31dYCx0aGlzLnN0YWNrLGRlbGV0ZSB0aGlzLm5hbWV9Z2V0IGNvZGUoKXtyZXR1cm4gc31zZXQgY29kZShzKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29kZSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnMsd3JpdGFibGU6ITB9KX10b1N0cmluZygpe3JldHVybmAke3RoaXMubmFtZX0gWyR7c31dOiAke3RoaXMubWVzc2FnZX1gfX19ZnVuY3Rpb24gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKHMpe2xldCBvPSIiLGk9cy5sZW5ndGg7Y29uc3QgYT0iLSI9PT1zWzBdPzE6MDtmb3IoO2k+PWErNDtpLT0zKW89YF8ke3Muc2xpY2UoaS0zLGkpfSR7b31gO3JldHVybmAke3Muc2xpY2UoMCxpKX0ke299YH1mdW5jdGlvbiBjaGVja0ludEJJKHMsbyxpLGEsdSxfKXtpZihzPml8fHM8byl7Y29uc3QgYT0iYmlnaW50Ij09dHlwZW9mIG8/Im4iOiIiO2xldCB1O3Rocm93IHU9Xz4zPzA9PT1vfHxvPT09QmlnSW50KDApP2A+PSAwJHthfSBhbmQgPCAyJHthfSAqKiAkezgqKF8rMSl9JHthfWA6YD49IC0oMiR7YX0gKiogJHs4KihfKzEpLTF9JHthfSkgYW5kIDwgMiAqKiAkezgqKF8rMSktMX0ke2F9YDpgPj0gJHtvfSR7YX0gYW5kIDw9ICR7aX0ke2F9YCxuZXcgQy5FUlJfT1VUX09GX1JBTkdFKCJ2YWx1ZSIsdSxzKX0hZnVuY3Rpb24gY2hlY2tCb3VuZHMocyxvLGkpe3ZhbGlkYXRlTnVtYmVyKG8sIm9mZnNldCIpLHZvaWQgMCE9PXNbb10mJnZvaWQgMCE9PXNbbytpXXx8Ym91bmRzRXJyb3IobyxzLmxlbmd0aC0oaSsxKSl9KGEsdSxfKX1mdW5jdGlvbiB2YWxpZGF0ZU51bWJlcihzLG8pe2lmKCJudW1iZXIiIT10eXBlb2Ygcyl0aHJvdyBuZXcgQy5FUlJfSU5WQUxJRF9BUkdfVFlQRShvLCJudW1iZXIiLHMpfWZ1bmN0aW9uIGJvdW5kc0Vycm9yKHMsbyxpKXtpZihNYXRoLmZsb29yKHMpIT09cyl0aHJvdyB2YWxpZGF0ZU51bWJlcihzLGkpLG5ldyBDLkVSUl9PVVRfT0ZfUkFOR0UoaXx8Im9mZnNldCIsImFuIGludGVnZXIiLHMpO2lmKG88MCl0aHJvdyBuZXcgQy5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFM7dGhyb3cgbmV3IEMuRVJSX09VVF9PRl9SQU5HRShpfHwib2Zmc2V0IixgPj0gJHtpPzE6MH0gYW5kIDw9ICR7b31gLHMpfUUoIkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EUyIsKGZ1bmN0aW9uKHMpe3JldHVybiBzP2Ake3N9IGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kc2A6IkF0dGVtcHQgdG8gYWNjZXNzIG1lbW9yeSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMifSksUmFuZ2VFcnJvciksRSgiRVJSX0lOVkFMSURfQVJHX1RZUEUiLChmdW5jdGlvbihzLG8pe3JldHVybmBUaGUgIiR7c30iIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2Ygb31gfSksVHlwZUVycm9yKSxFKCJFUlJfT1VUX09GX1JBTkdFIiwoZnVuY3Rpb24ocyxvLGkpe2xldCBhPWBUaGUgdmFsdWUgb2YgIiR7c30iIGlzIG91dCBvZiByYW5nZS5gLHU9aTtyZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihpKSYmTWF0aC5hYnMoaSk+MioqMzI/dT1hZGROdW1lcmljYWxTZXBhcmF0b3IoU3RyaW5nKGkpKToiYmlnaW50Ij09dHlwZW9mIGkmJih1PVN0cmluZyhpKSwoaT5CaWdJbnQoMikqKkJpZ0ludCgzMil8fGk8LShCaWdJbnQoMikqKkJpZ0ludCgzMikpKSYmKHU9YWRkTnVtZXJpY2FsU2VwYXJhdG9yKHUpKSx1Kz0ibiIpLGErPWAgSXQgbXVzdCBiZSAke299LiBSZWNlaXZlZCAke3V9YCxhfSksUmFuZ2VFcnJvcik7Y29uc3Qgaj0vW14rLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIHV0ZjhUb0J5dGVzKHMsbyl7bGV0IGk7bz1vfHwxLzA7Y29uc3QgYT1zLmxlbmd0aDtsZXQgdT1udWxsO2NvbnN0IF89W107Zm9yKGxldCB3PTA7dzxhOysrdyl7aWYoaT1zLmNoYXJDb2RlQXQodyksaT41NTI5NSYmaTw1NzM0NCl7aWYoIXUpe2lmKGk+NTYzMTkpeyhvLT0zKT4tMSYmXy5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZih3KzE9PT1hKXsoby09Myk+LTEmJl8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9dT1pO2NvbnRpbnVlfWlmKGk8NTYzMjApeyhvLT0zKT4tMSYmXy5wdXNoKDIzOSwxOTEsMTg5KSx1PWk7Y29udGludWV9aT02NTUzNisodS01NTI5Njw8MTB8aS01NjMyMCl9ZWxzZSB1JiYoby09Myk+LTEmJl8ucHVzaCgyMzksMTkxLDE4OSk7aWYodT1udWxsLGk8MTI4KXtpZigoby09MSk8MClicmVhaztfLnB1c2goaSl9ZWxzZSBpZihpPDIwNDgpe2lmKChvLT0yKTwwKWJyZWFrO18ucHVzaChpPj42fDE5Miw2MyZpfDEyOCl9ZWxzZSBpZihpPDY1NTM2KXtpZigoby09Myk8MClicmVhaztfLnB1c2goaT4+MTJ8MjI0LGk+PjYmNjN8MTI4LDYzJml8MTI4KX1lbHNle2lmKCEoaTwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChvLT00KTwwKWJyZWFrO18ucHVzaChpPj4xOHwyNDAsaT4+MTImNjN8MTI4LGk+PjYmNjN8MTI4LDYzJml8MTI4KX19cmV0dXJuIF99ZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyhzKXtyZXR1cm4gYS50b0J5dGVBcnJheShmdW5jdGlvbiBiYXNlNjRjbGVhbihzKXtpZigocz0ocz1zLnNwbGl0KCI9IilbMF0pLnRyaW0oKS5yZXBsYWNlKGosIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3MubGVuZ3RoJTQhPTA7KXMrPSI9IjtyZXR1cm4gc30ocykpfWZ1bmN0aW9uIGJsaXRCdWZmZXIocyxvLGksYSl7bGV0IHU7Zm9yKHU9MDt1PGEmJiEodStpPj1vLmxlbmd0aHx8dT49cy5sZW5ndGgpOysrdSlvW3UraV09c1t1XTtyZXR1cm4gdX1mdW5jdGlvbiBpc0luc3RhbmNlKHMsbyl7cmV0dXJuIHMgaW5zdGFuY2VvZiBvfHxudWxsIT1zJiZudWxsIT1zLmNvbnN0cnVjdG9yJiZudWxsIT1zLmNvbnN0cnVjdG9yLm5hbWUmJnMuY29uc3RydWN0b3IubmFtZT09PW8ubmFtZX1mdW5jdGlvbiBudW1iZXJJc05hTihzKXtyZXR1cm4gcyE9c31jb25zdCBMPWZ1bmN0aW9uKCl7Y29uc3Qgcz0iMDEyMzQ1Njc4OWFiY2RlZiIsbz1uZXcgQXJyYXkoMjU2KTtmb3IobGV0IGk9MDtpPDE2OysraSl7Y29uc3QgYT0xNippO2ZvcihsZXQgdT0wO3U8MTY7Kyt1KW9bYSt1XT1zW2ldK3NbdV19cmV0dXJuIG99KCk7ZnVuY3Rpb24gZGVmaW5lQmlnSW50TWV0aG9kKHMpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgQmlnSW50P0J1ZmZlckJpZ0ludE5vdERlZmluZWQ6c31mdW5jdGlvbiBCdWZmZXJCaWdJbnROb3REZWZpbmVkKCl7dGhyb3cgbmV3IEVycm9yKCJCaWdJbnQgbm90IHN1cHBvcnRlZCIpfX0sMTMxNDQocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDY2NzQzKSx1PWkoMTEwMDIpLF89aSgxMDA3Niksdz1pKDQ3MTE5KTtzLmV4cG9ydHM9d3x8YS5jYWxsKF8sdSl9LDEyMjA1KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg2Njc0MyksdT1pKDExMDAyKSxfPWkoMTMxNDQpO3MuZXhwb3J0cz1mdW5jdGlvbiBhcHBseUJpbmQoKXtyZXR1cm4gXyhhLHUsYXJndW1lbnRzKX19LDExMDAyKHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5fSwxMDA3NihzKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsfSw3MzEyNihzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNjY3NDMpLHU9aSg2OTY3NSksXz1pKDEwMDc2KSx3PWkoMTMxNDQpO3MuZXhwb3J0cz1mdW5jdGlvbiBjYWxsQmluZEJhc2ljKHMpe2lmKHMubGVuZ3RoPDF8fCJmdW5jdGlvbiIhPXR5cGVvZiBzWzBdKXRocm93IG5ldyB1KCJhIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIik7cmV0dXJuIHcoYSxfLHMpfX0sNDcxMTkocyl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QmJlJlZmxlY3QuYXBwbHl9LDEwNDg3KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg5Njg5NyksdT1pKDMwNjU1KSxfPWkoNzMxMjYpLHc9aSgxMjIwNSk7cy5leHBvcnRzPWZ1bmN0aW9uIGNhbGxCaW5kKHMpe3ZhciBvPV8oYXJndW1lbnRzKSxpPXMubGVuZ3RoLShhcmd1bWVudHMubGVuZ3RoLTEpO3JldHVybiBhKG8sMSsoaT4wP2k6MCksITApfSx1P3Uocy5leHBvcnRzLCJhcHBseSIse3ZhbHVlOnd9KTpzLmV4cG9ydHMuYXBwbHk9d30sMzY1NTYocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDcwNDUzKSx1PWkoNzMxMjYpLF89dShbYSgiJVN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiUiKV0pO3MuZXhwb3J0cz1mdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMocyxvKXt2YXIgaT1hKHMsISFvKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaSYmXyhzLCIucHJvdG90eXBlLiIpPi0xP3UoW2ldKTppfX0sMTc5NjUocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDE2NDI2KSx1PXsidGV4dC9wbGFpbiI6IlRleHQiLCJ0ZXh0L2h0bWwiOiJVcmwiLGRlZmF1bHQ6IlRleHQifTtzLmV4cG9ydHM9ZnVuY3Rpb24gY29weShzLG8pe3ZhciBpLF8sdyx4LEMsaixMPSExO298fChvPXt9KSxpPW8uZGVidWd8fCExO3RyeXtpZih3PWEoKSx4PWRvY3VtZW50LmNyZWF0ZVJhbmdlKCksQz1kb2N1bWVudC5nZXRTZWxlY3Rpb24oKSwoaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIikpLnRleHRDb250ZW50PXMsai5hcmlhSGlkZGVuPSJ0cnVlIixqLnN0eWxlLmFsbD0idW5zZXQiLGouc3R5bGUucG9zaXRpb249ImZpeGVkIixqLnN0eWxlLnRvcD0wLGouc3R5bGUuY2xpcD0icmVjdCgwLCAwLCAwLCAwKSIsai5zdHlsZS53aGl0ZVNwYWNlPSJwcmUiLGouc3R5bGUud2Via2l0VXNlclNlbGVjdD0idGV4dCIsai5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJ0ZXh0IixqLnN0eWxlLm1zVXNlclNlbGVjdD0idGV4dCIsai5zdHlsZS51c2VyU2VsZWN0PSJ0ZXh0IixqLmFkZEV2ZW50TGlzdGVuZXIoImNvcHkiLChmdW5jdGlvbihhKXtpZihhLnN0b3BQcm9wYWdhdGlvbigpLG8uZm9ybWF0KWlmKGEucHJldmVudERlZmF1bHQoKSx2b2lkIDA9PT1hLmNsaXBib2FyZERhdGEpe2kmJmNvbnNvbGUud2FybigidW5hYmxlIHRvIHVzZSBlLmNsaXBib2FyZERhdGEiKSxpJiZjb25zb2xlLndhcm4oInRyeWluZyBJRSBzcGVjaWZpYyBzdHVmZiIpLHdpbmRvdy5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpO3ZhciBfPXVbby5mb3JtYXRdfHx1LmRlZmF1bHQ7d2luZG93LmNsaXBib2FyZERhdGEuc2V0RGF0YShfLHMpfWVsc2UgYS5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpLGEuY2xpcGJvYXJkRGF0YS5zZXREYXRhKG8uZm9ybWF0LHMpO28ub25Db3B5JiYoYS5wcmV2ZW50RGVmYXVsdCgpLG8ub25Db3B5KGEuY2xpcGJvYXJkRGF0YSkpfSkpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaikseC5zZWxlY3ROb2RlQ29udGVudHMoaiksQy5hZGRSYW5nZSh4KSwhZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKSl0aHJvdyBuZXcgRXJyb3IoImNvcHkgY29tbWFuZCB3YXMgdW5zdWNjZXNzZnVsIik7TD0hMH1jYXRjaChhKXtpJiZjb25zb2xlLmVycm9yKCJ1bmFibGUgdG8gY29weSB1c2luZyBleGVjQ29tbWFuZDogIixhKSxpJiZjb25zb2xlLndhcm4oInRyeWluZyBJRSBzcGVjaWZpYyBzdHVmZiIpO3RyeXt3aW5kb3cuY2xpcGJvYXJkRGF0YS5zZXREYXRhKG8uZm9ybWF0fHwidGV4dCIscyksby5vbkNvcHkmJm8ub25Db3B5KHdpbmRvdy5jbGlwYm9hcmREYXRhKSxMPSEwfWNhdGNoKGEpe2kmJmNvbnNvbGUuZXJyb3IoInVuYWJsZSB0byBjb3B5IHVzaW5nIGNsaXBib2FyZERhdGE6ICIsYSksaSYmY29uc29sZS5lcnJvcigiZmFsbGluZyBiYWNrIHRvIHByb21wdCIpLF89ZnVuY3Rpb24gZm9ybWF0KHMpe3ZhciBvPSgvbWFjIG9zIHgvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpPyLijJgiOiJDdHJsIikrIitDIjtyZXR1cm4gcy5yZXBsYWNlKC8je1xzKmtleVxzKn0vZyxvKX0oIm1lc3NhZ2UiaW4gbz9vLm1lc3NhZ2U6IkNvcHkgdG8gY2xpcGJvYXJkOiAje2tleX0sIEVudGVyIiksd2luZG93LnByb21wdChfLHMpfX1maW5hbGx5e0MmJigiZnVuY3Rpb24iPT10eXBlb2YgQy5yZW1vdmVSYW5nZT9DLnJlbW92ZVJhbmdlKHgpOkMucmVtb3ZlQWxsUmFuZ2VzKCkpLGomJmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaiksdygpfXJldHVybiBMfX0sMjIwNShzLG8saSl7dmFyIGE7YT12b2lkIDAhPT1pLmc/aS5nOnRoaXMscy5leHBvcnRzPWZ1bmN0aW9uKHMpe2lmKHMuQ1NTJiZzLkNTUy5lc2NhcGUpcmV0dXJuIHMuQ1NTLmVzY2FwZTt2YXIgY3NzRXNjYXBlPWZ1bmN0aW9uKHMpe2lmKDA9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiYENTUy5lc2NhcGVgIHJlcXVpcmVzIGFuIGFyZ3VtZW50LiIpO2Zvcih2YXIgbyxpPVN0cmluZyhzKSxhPWkubGVuZ3RoLHU9LTEsXz0iIix3PWkuY2hhckNvZGVBdCgwKTsrK3U8YTspMCE9KG89aS5jaGFyQ29kZUF0KHUpKT9fKz1vPj0xJiZvPD0zMXx8MTI3PT1vfHwwPT11JiZvPj00OCYmbzw9NTd8fDE9PXUmJm8+PTQ4JiZvPD01NyYmNDU9PXc/IlxcIitvLnRvU3RyaW5nKDE2KSsiICI6MD09dSYmMT09YSYmNDU9PW98fCEobz49MTI4fHw0NT09b3x8OTU9PW98fG8+PTQ4JiZvPD01N3x8bz49NjUmJm88PTkwfHxvPj05NyYmbzw9MTIyKT8iXFwiK2kuY2hhckF0KHUpOmkuY2hhckF0KHUpOl8rPSLvv70iO3JldHVybiBffTtyZXR1cm4gcy5DU1N8fChzLkNTUz17fSkscy5DU1MuZXNjYXBlPWNzc0VzY2FwZSxjc3NFc2NhcGV9KGEpfSw4MTkxOShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNDgyODcpLkJ1ZmZlcjtmdW5jdGlvbiBpc1NwZWNpZmljVmFsdWUocyl7cmV0dXJuIHMgaW5zdGFuY2VvZiBhfHxzIGluc3RhbmNlb2YgRGF0ZXx8cyBpbnN0YW5jZW9mIFJlZ0V4cH1mdW5jdGlvbiBjbG9uZVNwZWNpZmljVmFsdWUocyl7aWYocyBpbnN0YW5jZW9mIGEpe3ZhciBvPWEuYWxsb2M/YS5hbGxvYyhzLmxlbmd0aCk6bmV3IGEocy5sZW5ndGgpO3JldHVybiBzLmNvcHkobyksb31pZihzIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gbmV3IERhdGUocy5nZXRUaW1lKCkpO2lmKHMgaW5zdGFuY2VvZiBSZWdFeHApcmV0dXJuIG5ldyBSZWdFeHAocyk7dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHNpdHVhdGlvbiIpfWZ1bmN0aW9uIGRlZXBDbG9uZUFycmF5KHMpe3ZhciBvPVtdO3JldHVybiBzLmZvckVhY2goKGZ1bmN0aW9uKHMsaSl7Im9iamVjdCI9PXR5cGVvZiBzJiZudWxsIT09cz9BcnJheS5pc0FycmF5KHMpP29baV09ZGVlcENsb25lQXJyYXkocyk6aXNTcGVjaWZpY1ZhbHVlKHMpP29baV09Y2xvbmVTcGVjaWZpY1ZhbHVlKHMpOm9baV09dSh7fSxzKTpvW2ldPXN9KSksb31mdW5jdGlvbiBzYWZlR2V0UHJvcGVydHkocyxvKXtyZXR1cm4iX19wcm90b19fIj09PW8/dm9pZCAwOnNbb119dmFyIHU9cy5leHBvcnRzPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzLmxlbmd0aDwxfHwib2JqZWN0IiE9dHlwZW9mIGFyZ3VtZW50c1swXSlyZXR1cm4hMTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuIGFyZ3VtZW50c1swXTt2YXIgcyxvLGk9YXJndW1lbnRzWzBdO3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkuZm9yRWFjaCgoZnVuY3Rpb24oYSl7Im9iamVjdCIhPXR5cGVvZiBhfHxudWxsPT09YXx8QXJyYXkuaXNBcnJheShhKXx8T2JqZWN0LmtleXMoYSkuZm9yRWFjaCgoZnVuY3Rpb24oXyl7cmV0dXJuIG89c2FmZUdldFByb3BlcnR5KGksXyksKHM9c2FmZUdldFByb3BlcnR5KGEsXykpPT09aT92b2lkIDA6Im9iamVjdCIhPXR5cGVvZiBzfHxudWxsPT09cz92b2lkKGlbX109cyk6QXJyYXkuaXNBcnJheShzKT92b2lkKGlbX109ZGVlcENsb25lQXJyYXkocykpOmlzU3BlY2lmaWNWYWx1ZShzKT92b2lkKGlbX109Y2xvbmVTcGVjaWZpY1ZhbHVlKHMpKToib2JqZWN0IiE9dHlwZW9mIG98fG51bGw9PT1vfHxBcnJheS5pc0FycmF5KG8pP3ZvaWQoaVtfXT11KHt9LHMpKTp2b2lkKGlbX109dShvLHMpKX0pKX0pKSxpfX0sMTQ3NDQocyl7InVzZSBzdHJpY3QiO3ZhciBvPWZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHMpe3JldHVybiBmdW5jdGlvbiBpc05vbk51bGxPYmplY3Qocyl7cmV0dXJuISFzJiYib2JqZWN0Ij09dHlwZW9mIHN9KHMpJiYhZnVuY3Rpb24gaXNTcGVjaWFsKHMpe3ZhciBvPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKTtyZXR1cm4iW29iamVjdCBSZWdFeHBdIj09PW98fCJbb2JqZWN0IERhdGVdIj09PW98fGZ1bmN0aW9uIGlzUmVhY3RFbGVtZW50KHMpe3JldHVybiBzLiQkdHlwZW9mPT09aX0ocyl9KHMpfTt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yP1N5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKTo2MDEwMztmdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChzLG8pe3JldHVybiExIT09by5jbG9uZSYmby5pc01lcmdlYWJsZU9iamVjdChzKT9kZWVwbWVyZ2UoZnVuY3Rpb24gZW1wdHlUYXJnZXQocyl7cmV0dXJuIEFycmF5LmlzQXJyYXkocyk/W106e319KHMpLHMsbyk6c31mdW5jdGlvbiBkZWZhdWx0QXJyYXlNZXJnZShzLG8saSl7cmV0dXJuIHMuY29uY2F0KG8pLm1hcCgoZnVuY3Rpb24ocyl7cmV0dXJuIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHMsaSl9KSl9ZnVuY3Rpb24gZ2V0S2V5cyhzKXtyZXR1cm4gT2JqZWN0LmtleXMocykuY29uY2F0KGZ1bmN0aW9uIGdldEVudW1lcmFibGVPd25Qcm9wZXJ0eVN5bWJvbHMocyl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM/T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKS5maWx0ZXIoKGZ1bmN0aW9uKG8pe3JldHVybiBPYmplY3QucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLG8pfSkpOltdfShzKSl9ZnVuY3Rpb24gcHJvcGVydHlJc09uT2JqZWN0KHMsbyl7dHJ5e3JldHVybiBvIGluIHN9Y2F0Y2gocyl7cmV0dXJuITF9fWZ1bmN0aW9uIG1lcmdlT2JqZWN0KHMsbyxpKXt2YXIgYT17fTtyZXR1cm4gaS5pc01lcmdlYWJsZU9iamVjdChzKSYmZ2V0S2V5cyhzKS5mb3JFYWNoKChmdW5jdGlvbihvKXthW29dPWNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHNbb10saSl9KSksZ2V0S2V5cyhvKS5mb3JFYWNoKChmdW5jdGlvbih1KXsoZnVuY3Rpb24gcHJvcGVydHlJc1Vuc2FmZShzLG8pe3JldHVybiBwcm9wZXJ0eUlzT25PYmplY3QocyxvKSYmIShPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChzLG8pJiZPYmplY3QucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLG8pKX0pKHMsdSl8fChwcm9wZXJ0eUlzT25PYmplY3Qocyx1KSYmaS5pc01lcmdlYWJsZU9iamVjdChvW3VdKT9hW3VdPWZ1bmN0aW9uIGdldE1lcmdlRnVuY3Rpb24ocyxvKXtpZighby5jdXN0b21NZXJnZSlyZXR1cm4gZGVlcG1lcmdlO3ZhciBpPW8uY3VzdG9tTWVyZ2Uocyk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGk/aTpkZWVwbWVyZ2V9KHUsaSkoc1t1XSxvW3VdLGkpOmFbdV09Y2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQob1t1XSxpKSl9KSksYX1mdW5jdGlvbiBkZWVwbWVyZ2UocyxpLGEpeyhhPWF8fHt9KS5hcnJheU1lcmdlPWEuYXJyYXlNZXJnZXx8ZGVmYXVsdEFycmF5TWVyZ2UsYS5pc01lcmdlYWJsZU9iamVjdD1hLmlzTWVyZ2VhYmxlT2JqZWN0fHxvLGEuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQ9Y2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQ7dmFyIHU9QXJyYXkuaXNBcnJheShpKTtyZXR1cm4gdT09PUFycmF5LmlzQXJyYXkocyk/dT9hLmFycmF5TWVyZ2UocyxpLGEpOm1lcmdlT2JqZWN0KHMsaSxhKTpjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpLGEpfWRlZXBtZXJnZS5hbGw9ZnVuY3Rpb24gZGVlcG1lcmdlQWxsKHMsbyl7aWYoIUFycmF5LmlzQXJyYXkocykpdGhyb3cgbmV3IEVycm9yKCJmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXkiKTtyZXR1cm4gcy5yZWR1Y2UoKGZ1bmN0aW9uKHMsaSl7cmV0dXJuIGRlZXBtZXJnZShzLGksbyl9KSx7fSl9O3ZhciBhPWRlZXBtZXJnZTtzLmV4cG9ydHM9YX0sMzAwNDEocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDMwNjU1KSx1PWkoNTgwNjgpLF89aSg2OTY3NSksdz1pKDc1Nzk1KTtzLmV4cG9ydHM9ZnVuY3Rpb24gZGVmaW5lRGF0YVByb3BlcnR5KHMsbyxpKXtpZighc3x8Im9iamVjdCIhPXR5cGVvZiBzJiYiZnVuY3Rpb24iIT10eXBlb2Ygcyl0aHJvdyBuZXcgXygiYG9iamAgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbmAiKTtpZigic3RyaW5nIiE9dHlwZW9mIG8mJiJzeW1ib2wiIT10eXBlb2Ygbyl0aHJvdyBuZXcgXygiYHByb3BlcnR5YCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sYCIpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MyYmImJvb2xlYW4iIT10eXBlb2YgYXJndW1lbnRzWzNdJiZudWxsIT09YXJndW1lbnRzWzNdKXRocm93IG5ldyBfKCJgbm9uRW51bWVyYWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsIik7aWYoYXJndW1lbnRzLmxlbmd0aD40JiYiYm9vbGVhbiIhPXR5cGVvZiBhcmd1bWVudHNbNF0mJm51bGwhPT1hcmd1bWVudHNbNF0pdGhyb3cgbmV3IF8oImBub25Xcml0YWJsZWAsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgYm9vbGVhbiBvciBudWxsIik7aWYoYXJndW1lbnRzLmxlbmd0aD41JiYiYm9vbGVhbiIhPXR5cGVvZiBhcmd1bWVudHNbNV0mJm51bGwhPT1hcmd1bWVudHNbNV0pdGhyb3cgbmV3IF8oImBub25Db25maWd1cmFibGVgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4gb3IgbnVsbCIpO2lmKGFyZ3VtZW50cy5sZW5ndGg+NiYmImJvb2xlYW4iIT10eXBlb2YgYXJndW1lbnRzWzZdKXRocm93IG5ldyBfKCJgbG9vc2VgLCBpZiBwcm92aWRlZCwgbXVzdCBiZSBhIGJvb2xlYW4iKTt2YXIgeD1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOm51bGwsQz1hcmd1bWVudHMubGVuZ3RoPjQ/YXJndW1lbnRzWzRdOm51bGwsaj1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOm51bGwsTD1hcmd1bWVudHMubGVuZ3RoPjYmJmFyZ3VtZW50c1s2XSxCPSEhdyYmdyhzLG8pO2lmKGEpYShzLG8se2NvbmZpZ3VyYWJsZTpudWxsPT09aiYmQj9CLmNvbmZpZ3VyYWJsZTohaixlbnVtZXJhYmxlOm51bGw9PT14JiZCP0IuZW51bWVyYWJsZToheCx2YWx1ZTppLHdyaXRhYmxlOm51bGw9PT1DJiZCP0Iud3JpdGFibGU6IUN9KTtlbHNle2lmKCFMJiYoeHx8Q3x8aikpdGhyb3cgbmV3IHUoIlRoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBkZWZpbmluZyBhIHByb3BlcnR5IGFzIG5vbi1jb25maWd1cmFibGUsIG5vbi13cml0YWJsZSwgb3Igbm9uLWVudW1lcmFibGUuIik7c1tvXT1pfX19LDc4MDA0KHMpeyJ1c2Ugc3RyaWN0IjtjbGFzcyBTdWJSYW5nZXtjb25zdHJ1Y3RvcihzLG8pe3RoaXMubG93PXMsdGhpcy5oaWdoPW8sdGhpcy5sZW5ndGg9MStvLXN9b3ZlcmxhcHMocyl7cmV0dXJuISh0aGlzLmhpZ2g8cy5sb3d8fHRoaXMubG93PnMuaGlnaCl9dG91Y2hlcyhzKXtyZXR1cm4hKHRoaXMuaGlnaCsxPHMubG93fHx0aGlzLmxvdy0xPnMuaGlnaCl9YWRkKHMpe3JldHVybiBuZXcgU3ViUmFuZ2UoTWF0aC5taW4odGhpcy5sb3cscy5sb3cpLE1hdGgubWF4KHRoaXMuaGlnaCxzLmhpZ2gpKX1zdWJ0cmFjdChzKXtyZXR1cm4gcy5sb3c8PXRoaXMubG93JiZzLmhpZ2g+PXRoaXMuaGlnaD9bXTpzLmxvdz50aGlzLmxvdyYmcy5oaWdoPHRoaXMuaGlnaD9bbmV3IFN1YlJhbmdlKHRoaXMubG93LHMubG93LTEpLG5ldyBTdWJSYW5nZShzLmhpZ2grMSx0aGlzLmhpZ2gpXTpzLmxvdzw9dGhpcy5sb3c/W25ldyBTdWJSYW5nZShzLmhpZ2grMSx0aGlzLmhpZ2gpXTpbbmV3IFN1YlJhbmdlKHRoaXMubG93LHMubG93LTEpXX10b1N0cmluZygpe3JldHVybiB0aGlzLmxvdz09dGhpcy5oaWdoP3RoaXMubG93LnRvU3RyaW5nKCk6dGhpcy5sb3crIi0iK3RoaXMuaGlnaH19Y2xhc3MgRFJhbmdle2NvbnN0cnVjdG9yKHMsbyl7dGhpcy5yYW5nZXM9W10sdGhpcy5sZW5ndGg9MCxudWxsIT1zJiZ0aGlzLmFkZChzLG8pfV91cGRhdGVfbGVuZ3RoKCl7dGhpcy5sZW5ndGg9dGhpcy5yYW5nZXMucmVkdWNlKCgocyxvKT0+cytvLmxlbmd0aCksMCl9YWRkKHMsbyl7dmFyIF9hZGQ9cz0+e2Zvcih2YXIgbz0wO288dGhpcy5yYW5nZXMubGVuZ3RoJiYhcy50b3VjaGVzKHRoaXMucmFuZ2VzW29dKTspbysrO2Zvcih2YXIgaT10aGlzLnJhbmdlcy5zbGljZSgwLG8pO288dGhpcy5yYW5nZXMubGVuZ3RoJiZzLnRvdWNoZXModGhpcy5yYW5nZXNbb10pOylzPXMuYWRkKHRoaXMucmFuZ2VzW29dKSxvKys7aS5wdXNoKHMpLHRoaXMucmFuZ2VzPWkuY29uY2F0KHRoaXMucmFuZ2VzLnNsaWNlKG8pKSx0aGlzLl91cGRhdGVfbGVuZ3RoKCl9O3JldHVybiBzIGluc3RhbmNlb2YgRFJhbmdlP3MucmFuZ2VzLmZvckVhY2goX2FkZCk6KG51bGw9PW8mJihvPXMpLF9hZGQobmV3IFN1YlJhbmdlKHMsbykpKSx0aGlzfXN1YnRyYWN0KHMsbyl7dmFyIF9zdWJ0cmFjdD1zPT57Zm9yKHZhciBvPTA7bzx0aGlzLnJhbmdlcy5sZW5ndGgmJiFzLm92ZXJsYXBzKHRoaXMucmFuZ2VzW29dKTspbysrO2Zvcih2YXIgaT10aGlzLnJhbmdlcy5zbGljZSgwLG8pO288dGhpcy5yYW5nZXMubGVuZ3RoJiZzLm92ZXJsYXBzKHRoaXMucmFuZ2VzW29dKTspaT1pLmNvbmNhdCh0aGlzLnJhbmdlc1tvXS5zdWJ0cmFjdChzKSksbysrO3RoaXMucmFuZ2VzPWkuY29uY2F0KHRoaXMucmFuZ2VzLnNsaWNlKG8pKSx0aGlzLl91cGRhdGVfbGVuZ3RoKCl9O3JldHVybiBzIGluc3RhbmNlb2YgRFJhbmdlP3MucmFuZ2VzLmZvckVhY2goX3N1YnRyYWN0KToobnVsbD09byYmKG89cyksX3N1YnRyYWN0KG5ldyBTdWJSYW5nZShzLG8pKSksdGhpc31pbnRlcnNlY3QocyxvKXt2YXIgaT1bXSxfaW50ZXJzZWN0PXM9Pntmb3IodmFyIG89MDtvPHRoaXMucmFuZ2VzLmxlbmd0aCYmIXMub3ZlcmxhcHModGhpcy5yYW5nZXNbb10pOylvKys7Zm9yKDtvPHRoaXMucmFuZ2VzLmxlbmd0aCYmcy5vdmVybGFwcyh0aGlzLnJhbmdlc1tvXSk7KXt2YXIgYT1NYXRoLm1heCh0aGlzLnJhbmdlc1tvXS5sb3cscy5sb3cpLHU9TWF0aC5taW4odGhpcy5yYW5nZXNbb10uaGlnaCxzLmhpZ2gpO2kucHVzaChuZXcgU3ViUmFuZ2UoYSx1KSksbysrfX07cmV0dXJuIHMgaW5zdGFuY2VvZiBEUmFuZ2U/cy5yYW5nZXMuZm9yRWFjaChfaW50ZXJzZWN0KToobnVsbD09byYmKG89cyksX2ludGVyc2VjdChuZXcgU3ViUmFuZ2UocyxvKSkpLHRoaXMucmFuZ2VzPWksdGhpcy5fdXBkYXRlX2xlbmd0aCgpLHRoaXN9aW5kZXgocyl7Zm9yKHZhciBvPTA7bzx0aGlzLnJhbmdlcy5sZW5ndGgmJnRoaXMucmFuZ2VzW29dLmxlbmd0aDw9czspcy09dGhpcy5yYW5nZXNbb10ubGVuZ3RoLG8rKztyZXR1cm4gdGhpcy5yYW5nZXNbb10ubG93K3N9dG9TdHJpbmcoKXtyZXR1cm4iWyAiK3RoaXMucmFuZ2VzLmpvaW4oIiwgIikrIiBdIn1jbG9uZSgpe3JldHVybiBuZXcgRFJhbmdlKHRoaXMpfW51bWJlcnMoKXtyZXR1cm4gdGhpcy5yYW5nZXMucmVkdWNlKCgocyxvKT0+e2Zvcih2YXIgaT1vLmxvdztpPD1vLmhpZ2g7KXMucHVzaChpKSxpKys7cmV0dXJuIHN9KSxbXSl9c3VicmFuZ2VzKCl7cmV0dXJuIHRoaXMucmFuZ2VzLm1hcCgocz0+KHtsb3c6cy5sb3csaGlnaDpzLmhpZ2gsbGVuZ3RoOjErcy5oaWdoLXMubG93fSkpKX19cy5leHBvcnRzPURSYW5nZX0sNzE3NihzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhLHU9aSg3MzEyNiksXz1pKDc1Nzk1KTt0cnl7YT1bXS5fX3Byb3RvX189PT1BcnJheS5wcm90b3R5cGV9Y2F0Y2gocyl7aWYoIXN8fCJvYmplY3QiIT10eXBlb2Ygc3x8ISgiY29kZSJpbiBzKXx8IkVSUl9QUk9UT19BQ0NFU1MiIT09cy5jb2RlKXRocm93IHN9dmFyIHc9ISFhJiZfJiZfKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIpLHg9T2JqZWN0LEM9eC5nZXRQcm90b3R5cGVPZjtzLmV4cG9ydHM9dyYmImZ1bmN0aW9uIj09dHlwZW9mIHcuZ2V0P3UoW3cuZ2V0XSk6ImZ1bmN0aW9uIj09dHlwZW9mIEMmJmZ1bmN0aW9uIGdldER1bmRlcihzKXtyZXR1cm4gQyhudWxsPT1zP3M6eChzKSl9fSwzMDY1NShzKXsidXNlIHN0cmljdCI7dmFyIG89T2JqZWN0LmRlZmluZVByb3BlcnR5fHwhMTtpZihvKXRyeXtvKHt9LCJhIix7dmFsdWU6MX0pfWNhdGNoKHMpe289ITF9cy5leHBvcnRzPW99LDQxMjM3KHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9RXZhbEVycm9yfSw2OTM4MyhzKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPUVycm9yfSw3OTI5MChzKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPVJhbmdlRXJyb3J9LDc5NTM4KHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9UmVmZXJlbmNlRXJyb3J9LDU4MDY4KHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9U3ludGF4RXJyb3J9LDY5Njc1KHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9VHlwZUVycm9yfSwzNTM0NShzKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPVVSSUVycm9yfSw3OTYxMihzKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPU9iamVjdH0sMzcwMDcocyl7InVzZSBzdHJpY3QiO3ZhciBvLGk9Im9iamVjdCI9PXR5cGVvZiBSZWZsZWN0P1JlZmxlY3Q6bnVsbCxhPWkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpLmFwcGx5P2kuYXBwbHk6ZnVuY3Rpb24gUmVmbGVjdEFwcGx5KHMsbyxpKXtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwocyxvLGkpfTtvPWkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpLm93bktleXM/aS5vd25LZXlzOk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM/ZnVuY3Rpb24gUmVmbGVjdE93bktleXMocyl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHMpLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpKX06ZnVuY3Rpb24gUmVmbGVjdE93bktleXMocyl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHMpfTt2YXIgdT1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uIE51bWJlcklzTmFOKHMpe3JldHVybiBzIT1zfTtmdW5jdGlvbiBFdmVudEVtaXR0ZXIoKXtFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpfXMuZXhwb3J0cz1FdmVudEVtaXR0ZXIscy5leHBvcnRzLm9uY2U9ZnVuY3Rpb24gb25jZShzLG8pe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxhKXtmdW5jdGlvbiBlcnJvckxpc3RlbmVyKGkpe3MucmVtb3ZlTGlzdGVuZXIobyxyZXNvbHZlciksYShpKX1mdW5jdGlvbiByZXNvbHZlcigpeyJmdW5jdGlvbiI9PXR5cGVvZiBzLnJlbW92ZUxpc3RlbmVyJiZzLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsZXJyb3JMaXN0ZW5lciksaShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfWV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihzLG8scmVzb2x2ZXIse29uY2U6ITB9KSwiZXJyb3IiIT09byYmZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIocyxvLGkpeyJmdW5jdGlvbiI9PXR5cGVvZiBzLm9uJiZldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIocywiZXJyb3IiLG8saSl9KHMsZXJyb3JMaXN0ZW5lcix7b25jZTohMH0pfSkpfSxFdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyPUV2ZW50RW1pdHRlcixFdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLEV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50c0NvdW50PTAsRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgXz0xMDtmdW5jdGlvbiBjaGVja0xpc3RlbmVyKHMpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBzKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiBzKX1mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHMpe3JldHVybiB2b2lkIDA9PT1zLl9tYXhMaXN0ZW5lcnM/RXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM6cy5fbWF4TGlzdGVuZXJzfWZ1bmN0aW9uIF9hZGRMaXN0ZW5lcihzLG8saSxhKXt2YXIgdSxfLHc7aWYoY2hlY2tMaXN0ZW5lcihpKSx2b2lkIDA9PT0oXz1zLl9ldmVudHMpPyhfPXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHMuX2V2ZW50c0NvdW50PTApOih2b2lkIDAhPT1fLm5ld0xpc3RlbmVyJiYocy5lbWl0KCJuZXdMaXN0ZW5lciIsbyxpLmxpc3RlbmVyP2kubGlzdGVuZXI6aSksXz1zLl9ldmVudHMpLHc9X1tvXSksdm9pZCAwPT09dyl3PV9bb109aSwrK3MuX2V2ZW50c0NvdW50O2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIHc/dz1fW29dPWE/W2ksd106W3csaV06YT93LnVuc2hpZnQoaSk6dy5wdXNoKGkpLCh1PV9nZXRNYXhMaXN0ZW5lcnMocykpPjAmJncubGVuZ3RoPnUmJiF3Lndhcm5lZCl7dy53YXJuZWQ9ITA7dmFyIHg9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrdy5sZW5ndGgrIiAiK1N0cmluZyhvKSsiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTt4Lm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIseC5lbWl0dGVyPXMseC50eXBlPW8seC5jb3VudD13Lmxlbmd0aCxmdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcocyl7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4ocyl9KHgpfXJldHVybiBzfWZ1bmN0aW9uIG9uY2VXcmFwcGVyKCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCwwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiBfb25jZVdyYXAocyxvLGkpe3ZhciBhPXtmaXJlZDohMSx3cmFwRm46dm9pZCAwLHRhcmdldDpzLHR5cGU6byxsaXN0ZW5lcjppfSx1PW9uY2VXcmFwcGVyLmJpbmQoYSk7cmV0dXJuIHUubGlzdGVuZXI9aSxhLndyYXBGbj11LHV9ZnVuY3Rpb24gX2xpc3RlbmVycyhzLG8saSl7dmFyIGE9cy5fZXZlbnRzO2lmKHZvaWQgMD09PWEpcmV0dXJuW107dmFyIHU9YVtvXTtyZXR1cm4gdm9pZCAwPT09dT9bXToiZnVuY3Rpb24iPT10eXBlb2YgdT9pP1t1Lmxpc3RlbmVyfHx1XTpbdV06aT9mdW5jdGlvbiB1bndyYXBMaXN0ZW5lcnMocyl7Zm9yKHZhciBvPW5ldyBBcnJheShzLmxlbmd0aCksaT0wO2k8by5sZW5ndGg7KytpKW9baV09c1tpXS5saXN0ZW5lcnx8c1tpXTtyZXR1cm4gb30odSk6YXJyYXlDbG9uZSh1LHUubGVuZ3RoKX1mdW5jdGlvbiBsaXN0ZW5lckNvdW50KHMpe3ZhciBvPXRoaXMuX2V2ZW50cztpZih2b2lkIDAhPT1vKXt2YXIgaT1vW3NdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpKXJldHVybiAxO2lmKHZvaWQgMCE9PWkpcmV0dXJuIGkubGVuZ3RofXJldHVybiAwfWZ1bmN0aW9uIGFycmF5Q2xvbmUocyxvKXtmb3IodmFyIGk9bmV3IEFycmF5KG8pLGE9MDthPG87KythKWlbYV09c1thXTtyZXR1cm4gaX1mdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIocyxvLGksYSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHMub24pYS5vbmNlP3Mub25jZShvLGkpOnMub24obyxpKTtlbHNle2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBzLmFkZEV2ZW50TGlzdGVuZXIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJlbWl0dGVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHMpO3MuYWRkRXZlbnRMaXN0ZW5lcihvLChmdW5jdGlvbiB3cmFwTGlzdGVuZXIodSl7YS5vbmNlJiZzLnJlbW92ZUV2ZW50TGlzdGVuZXIobyx3cmFwTGlzdGVuZXIpLGkodSl9KSl9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBffSxzZXQ6ZnVuY3Rpb24ocyl7aWYoIm51bWJlciIhPXR5cGVvZiBzfHxzPDB8fHUocykpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytzKyIuIik7Xz1zfX0pLEV2ZW50RW1pdHRlci5pbml0PWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHMhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0sRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24gc2V0TWF4TGlzdGVuZXJzKHMpe2lmKCJudW1iZXIiIT10eXBlb2Ygc3x8czwwfHx1KHMpKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrcysiLiIpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9cyx0aGlzfSxFdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKXtyZXR1cm4gX2dldE1heExpc3RlbmVycyh0aGlzKX0sRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uIGVtaXQocyl7Zm9yKHZhciBvPVtdLGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKW8ucHVzaChhcmd1bWVudHNbaV0pO3ZhciB1PSJlcnJvciI9PT1zLF89dGhpcy5fZXZlbnRzO2lmKHZvaWQgMCE9PV8pdT11JiZ2b2lkIDA9PT1fLmVycm9yO2Vsc2UgaWYoIXUpcmV0dXJuITE7aWYodSl7dmFyIHc7aWYoby5sZW5ndGg+MCYmKHc9b1swXSksdyBpbnN0YW5jZW9mIEVycm9yKXRocm93IHc7dmFyIHg9bmV3IEVycm9yKCJVbmhhbmRsZWQgZXJyb3IuIisodz8iICgiK3cubWVzc2FnZSsiKSI6IiIpKTt0aHJvdyB4LmNvbnRleHQ9dyx4fXZhciBDPV9bc107aWYodm9pZCAwPT09QylyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgQylhKEMsdGhpcyxvKTtlbHNle3ZhciBqPUMubGVuZ3RoLEw9YXJyYXlDbG9uZShDLGopO2ZvcihpPTA7aTxqOysraSlhKExbaV0sdGhpcyxvKX1yZXR1cm4hMH0sRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbiBhZGRMaXN0ZW5lcihzLG8pe3JldHVybiBfYWRkTGlzdGVuZXIodGhpcyxzLG8sITEpfSxFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uPUV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIsRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXI9ZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKHMsbyl7cmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLHMsbywhMCl9LEV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZT1mdW5jdGlvbiBvbmNlKHMsbyl7cmV0dXJuIGNoZWNrTGlzdGVuZXIobyksdGhpcy5vbihzLF9vbmNlV3JhcCh0aGlzLHMsbykpLHRoaXN9LEV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHMsbyl7cmV0dXJuIGNoZWNrTGlzdGVuZXIobyksdGhpcy5wcmVwZW5kTGlzdGVuZXIocyxfb25jZVdyYXAodGhpcyxzLG8pKSx0aGlzfSxFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHMsbyl7dmFyIGksYSx1LF8sdztpZihjaGVja0xpc3RlbmVyKG8pLHZvaWQgMD09PShhPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYodm9pZCAwPT09KGk9YVtzXSkpcmV0dXJuIHRoaXM7aWYoaT09PW98fGkubGlzdGVuZXI9PT1vKTA9PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6KGRlbGV0ZSBhW3NdLGEucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHMsaS5saXN0ZW5lcnx8bykpO2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpe2Zvcih1PS0xLF89aS5sZW5ndGgtMTtfPj0wO18tLSlpZihpW19dPT09b3x8aVtfXS5saXN0ZW5lcj09PW8pe3c9aVtfXS5saXN0ZW5lcix1PV87YnJlYWt9aWYodTwwKXJldHVybiB0aGlzOzA9PT11P2kuc2hpZnQoKTpmdW5jdGlvbiBzcGxpY2VPbmUocyxvKXtmb3IoO28rMTxzLmxlbmd0aDtvKyspc1tvXT1zW28rMV07cy5wb3AoKX0oaSx1KSwxPT09aS5sZW5ndGgmJihhW3NdPWlbMF0pLHZvaWQgMCE9PWEucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHMsd3x8byl9cmV0dXJuIHRoaXN9LEV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmPUV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHMpe3ZhciBvLGksYTtpZih2b2lkIDA9PT0oaT10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKHZvaWQgMD09PWkucmVtb3ZlTGlzdGVuZXIpcmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTp2b2lkIDAhPT1pW3NdJiYoMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgaVtzXSksdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIHUsXz1PYmplY3Qua2V5cyhpKTtmb3IoYT0wO2E8Xy5sZW5ndGg7KythKSJyZW1vdmVMaXN0ZW5lciIhPT0odT1fW2FdKSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnModSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZigiZnVuY3Rpb24iPT10eXBlb2Yobz1pW3NdKSl0aGlzLnJlbW92ZUxpc3RlbmVyKHMsbyk7ZWxzZSBpZih2b2lkIDAhPT1vKWZvcihhPW8ubGVuZ3RoLTE7YT49MDthLS0pdGhpcy5yZW1vdmVMaXN0ZW5lcihzLG9bYV0pO3JldHVybiB0aGlzfSxFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbiBsaXN0ZW5lcnMocyl7cmV0dXJuIF9saXN0ZW5lcnModGhpcyxzLCEwKX0sRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHMpe3JldHVybiBfbGlzdGVuZXJzKHRoaXMscywhMSl9LEV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHMsbyl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHMubGlzdGVuZXJDb3VudD9zLmxpc3RlbmVyQ291bnQobyk6bGlzdGVuZXJDb3VudC5jYWxsKHMsbyl9LEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1saXN0ZW5lckNvdW50LEV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbiBldmVudE5hbWVzKCl7cmV0dXJuIHRoaXMuX2V2ZW50c0NvdW50PjA/byh0aGlzLl9ldmVudHMpOltdfX0sODU1ODcocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDI2MzExKSx1PWNyZWF0ZShFcnJvcik7ZnVuY3Rpb24gY3JlYXRlKHMpe3JldHVybiBGb3JtYXR0ZWRFcnJvci5kaXNwbGF5TmFtZT1zLmRpc3BsYXlOYW1lfHxzLm5hbWUsRm9ybWF0dGVkRXJyb3I7ZnVuY3Rpb24gRm9ybWF0dGVkRXJyb3Iobyl7cmV0dXJuIG8mJihvPWEuYXBwbHkobnVsbCxhcmd1bWVudHMpKSxuZXcgcyhvKX19cy5leHBvcnRzPXUsdS5ldmFsPWNyZWF0ZShFdmFsRXJyb3IpLHUucmFuZ2U9Y3JlYXRlKFJhbmdlRXJyb3IpLHUucmVmZXJlbmNlPWNyZWF0ZShSZWZlcmVuY2VFcnJvciksdS5zeW50YXg9Y3JlYXRlKFN5bnRheEVycm9yKSx1LnR5cGU9Y3JlYXRlKFR5cGVFcnJvciksdS51cmk9Y3JlYXRlKFVSSUVycm9yKSx1LmNyZWF0ZT1jcmVhdGV9LDgyNjgyKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg2OTYwMCksdT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLF89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtzLmV4cG9ydHM9ZnVuY3Rpb24gZm9yRWFjaChzLG8saSl7aWYoIWEobykpdGhyb3cgbmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uIik7dmFyIHc7YXJndW1lbnRzLmxlbmd0aD49MyYmKHc9aSksZnVuY3Rpb24gaXNBcnJheShzKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09dS5jYWxsKHMpfShzKT9mdW5jdGlvbiBmb3JFYWNoQXJyYXkocyxvLGkpe2Zvcih2YXIgYT0wLHU9cy5sZW5ndGg7YTx1O2ErKylfLmNhbGwocyxhKSYmKG51bGw9PWk/byhzW2FdLGEscyk6by5jYWxsKGksc1thXSxhLHMpKX0ocyxvLHcpOiJzdHJpbmciPT10eXBlb2Ygcz9mdW5jdGlvbiBmb3JFYWNoU3RyaW5nKHMsbyxpKXtmb3IodmFyIGE9MCx1PXMubGVuZ3RoO2E8dTthKyspbnVsbD09aT9vKHMuY2hhckF0KGEpLGEscyk6by5jYWxsKGkscy5jaGFyQXQoYSksYSxzKX0ocyxvLHcpOmZ1bmN0aW9uIGZvckVhY2hPYmplY3QocyxvLGkpe2Zvcih2YXIgYSBpbiBzKV8uY2FsbChzLGEpJiYobnVsbD09aT9vKHNbYV0sYSxzKTpvLmNhbGwoaSxzW2FdLGEscykpfShzLG8sdyl9fSwyNjMxMShzKXshZnVuY3Rpb24oKXt2YXIgbztmdW5jdGlvbiBmb3JtYXQocyl7Zm9yKHZhciBvLGksYSx1LF89MSx3PVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSx4PTAsQz1zLmxlbmd0aCxqPSIiLEw9ITEsQj0hMSxuZXh0QXJnPWZ1bmN0aW9uKCl7cmV0dXJuIHdbXysrXX0sc2x1cnBOdW1iZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGk9IiI7L1xkLy50ZXN0KHNbeF0pOylpKz1zW3grK10sbz1zW3hdO3JldHVybiBpLmxlbmd0aD4wP3BhcnNlSW50KGkpOm51bGx9O3g8QzsrK3gpaWYobz1zW3hdLEwpc3dpdGNoKEw9ITEsIi4iPT1vPyhCPSExLG89c1srK3hdKToiMCI9PW8mJiIuIj09c1t4KzFdPyhCPSEwLG89c1t4Kz0yXSk6Qj0hMCx1PXNsdXJwTnVtYmVyKCksbyl7Y2FzZSJiIjpqKz1wYXJzZUludChuZXh0QXJnKCksMTApLnRvU3RyaW5nKDIpO2JyZWFrO2Nhc2UiYyI6ais9InN0cmluZyI9PXR5cGVvZihpPW5leHRBcmcoKSl8fGkgaW5zdGFuY2VvZiBTdHJpbmc/aTpTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGksMTApKTticmVhaztjYXNlImQiOmorPXBhcnNlSW50KG5leHRBcmcoKSwxMCk7YnJlYWs7Y2FzZSJmIjphPVN0cmluZyhwYXJzZUZsb2F0KG5leHRBcmcoKSkudG9GaXhlZCh1fHw2KSksais9Qj9hOmEucmVwbGFjZSgvXjAvLCIiKTticmVhaztjYXNlImoiOmorPUpTT04uc3RyaW5naWZ5KG5leHRBcmcoKSk7YnJlYWs7Y2FzZSJvIjpqKz0iMCIrcGFyc2VJbnQobmV4dEFyZygpLDEwKS50b1N0cmluZyg4KTticmVhaztjYXNlInMiOmorPW5leHRBcmcoKTticmVhaztjYXNlIngiOmorPSIweCIrcGFyc2VJbnQobmV4dEFyZygpLDEwKS50b1N0cmluZygxNik7YnJlYWs7Y2FzZSJYIjpqKz0iMHgiK3BhcnNlSW50KG5leHRBcmcoKSwxMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7YnJlYWs7ZGVmYXVsdDpqKz1vfWVsc2UiJSI9PT1vP0w9ITA6ais9bztyZXR1cm4gan0obz1zLmV4cG9ydHM9Zm9ybWF0KS5mb3JtYXQ9Zm9ybWF0LG8udnNwcmludGY9ZnVuY3Rpb24gdnNwcmludGYocyxvKXtyZXR1cm4gZm9ybWF0LmFwcGx5KG51bGwsW3NdLmNvbmNhdChvKSl9LCJ1bmRlZmluZWQiIT10eXBlb2YgY29uc29sZSYmImZ1bmN0aW9uIj09dHlwZW9mIGNvbnNvbGUubG9nJiYoby5wcmludGY9ZnVuY3Rpb24gcHJpbnRmKCl7Y29uc29sZS5sb2coZm9ybWF0LmFwcGx5KG51bGwsYXJndW1lbnRzKSl9KX0oKX0sODkzNTMocyl7InVzZSBzdHJpY3QiO3ZhciBvPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsaT1NYXRoLm1heCxhPWZ1bmN0aW9uIGNvbmNhdHR5KHMsbyl7Zm9yKHZhciBpPVtdLGE9MDthPHMubGVuZ3RoO2ErPTEpaVthXT1zW2FdO2Zvcih2YXIgdT0wO3U8by5sZW5ndGg7dSs9MSlpW3Urcy5sZW5ndGhdPW9bdV07cmV0dXJuIGl9O3MuZXhwb3J0cz1mdW5jdGlvbiBiaW5kKHMpe3ZhciB1PXRoaXM7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHV8fCJbb2JqZWN0IEZ1bmN0aW9uXSIhPT1vLmFwcGx5KHUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgIit1KTtmb3IodmFyIF8sdz1mdW5jdGlvbiBzbGljeShzLG8pe2Zvcih2YXIgaT1bXSxhPW98fDAsdT0wO2E8cy5sZW5ndGg7YSs9MSx1Kz0xKWlbdV09c1thXTtyZXR1cm4gaX0oYXJndW1lbnRzLDEpLHg9aSgwLHUubGVuZ3RoLXcubGVuZ3RoKSxDPVtdLGo9MDtqPHg7aisrKUNbal09IiQiK2o7aWYoXz1GdW5jdGlvbigiYmluZGVyIiwicmV0dXJuIGZ1bmN0aW9uICgiK2Z1bmN0aW9uKHMsbyl7Zm9yKHZhciBpPSIiLGE9MDthPHMubGVuZ3RoO2ErPTEpaSs9c1thXSxhKzE8cy5sZW5ndGgmJihpKz1vKTtyZXR1cm4gaX0oQywiLCIpKyIpeyByZXR1cm4gYmluZGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsgfSIpKChmdW5jdGlvbigpe2lmKHRoaXMgaW5zdGFuY2VvZiBfKXt2YXIgbz11LmFwcGx5KHRoaXMsYSh3LGFyZ3VtZW50cykpO3JldHVybiBPYmplY3Qobyk9PT1vP286dGhpc31yZXR1cm4gdS5hcHBseShzLGEodyxhcmd1bWVudHMpKX0pKSx1LnByb3RvdHlwZSl7dmFyIEw9ZnVuY3Rpb24gRW1wdHkoKXt9O0wucHJvdG90eXBlPXUucHJvdG90eXBlLF8ucHJvdG90eXBlPW5ldyBMLEwucHJvdG90eXBlPW51bGx9cmV0dXJuIF99fSw2Njc0MyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoODkzNTMpO3MuZXhwb3J0cz1GdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8YX0sNzA0NTMocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYSx1PWkoNzk2MTIpLF89aSg2OTM4Myksdz1pKDQxMjM3KSx4PWkoNzkyOTApLEM9aSg3OTUzOCksaj1pKDU4MDY4KSxMPWkoNjk2NzUpLEI9aSgzNTM0NSksJD1pKDcxNTE0KSxVPWkoNTg5NjgpLFY9aSg2MTg4KSx6PWkoNjgwMDIpLFk9aSg3NTg4MCksWj1pKDcwNDE0KSxlZT1pKDczMDkzKSxpZT1GdW5jdGlvbixnZXRFdmFsbGVkQ29uc3RydWN0b3I9ZnVuY3Rpb24ocyl7dHJ5e3JldHVybiBpZSgnInVzZSBzdHJpY3QiOyByZXR1cm4gKCcrcysiKS5jb25zdHJ1Y3RvcjsiKSgpfWNhdGNoKHMpe319LGFlPWkoNzU3OTUpLGNlPWkoMzA2NTUpLHRocm93VHlwZUVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEx9LGxlPWFlP2Z1bmN0aW9uKCl7dHJ5e3JldHVybiB0aHJvd1R5cGVFcnJvcn1jYXRjaChzKXt0cnl7cmV0dXJuIGFlKGFyZ3VtZW50cywiY2FsbGVlIikuZ2V0fWNhdGNoKHMpe3JldHVybiB0aHJvd1R5cGVFcnJvcn19fSgpOnRocm93VHlwZUVycm9yLHBlPWkoNjQwMzkpKCksZGU9aSg5MzYyOCksZmU9aSg3MTA2NCkseWU9aSg0ODY0OCksYmU9aSgxMTAwMiksU2U9aSgxMDA3NiksX2U9e30sd2U9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5JiZkZT9kZShVaW50OEFycmF5KTphLHhlPXtfX3Byb3RvX186bnVsbCwiJUFnZ3JlZ2F0ZUVycm9yJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBBZ2dyZWdhdGVFcnJvcj9hOkFnZ3JlZ2F0ZUVycm9yLCIlQXJyYXklIjpBcnJheSwiJUFycmF5QnVmZmVyJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBBcnJheUJ1ZmZlcj9hOkFycmF5QnVmZmVyLCIlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUiOnBlJiZkZT9kZShbXVtTeW1ib2wuaXRlcmF0b3JdKCkpOmEsIiVBc3luY0Zyb21TeW5jSXRlcmF0b3JQcm90b3R5cGUlIjphLCIlQXN5bmNGdW5jdGlvbiUiOl9lLCIlQXN5bmNHZW5lcmF0b3IlIjpfZSwiJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lIjpfZSwiJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlIjpfZSwiJUF0b21pY3MlIjoidW5kZWZpbmVkIj09dHlwZW9mIEF0b21pY3M/YTpBdG9taWNzLCIlQmlnSW50JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBCaWdJbnQ/YTpCaWdJbnQsIiVCaWdJbnQ2NEFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBCaWdJbnQ2NEFycmF5P2E6QmlnSW50NjRBcnJheSwiJUJpZ1VpbnQ2NEFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBCaWdVaW50NjRBcnJheT9hOkJpZ1VpbnQ2NEFycmF5LCIlQm9vbGVhbiUiOkJvb2xlYW4sIiVEYXRhVmlldyUiOiJ1bmRlZmluZWQiPT10eXBlb2YgRGF0YVZpZXc/YTpEYXRhVmlldywiJURhdGUlIjpEYXRlLCIlZGVjb2RlVVJJJSI6ZGVjb2RlVVJJLCIlZGVjb2RlVVJJQ29tcG9uZW50JSI6ZGVjb2RlVVJJQ29tcG9uZW50LCIlZW5jb2RlVVJJJSI6ZW5jb2RlVVJJLCIlZW5jb2RlVVJJQ29tcG9uZW50JSI6ZW5jb2RlVVJJQ29tcG9uZW50LCIlRXJyb3IlIjpfLCIlZXZhbCUiOmV2YWwsIiVFdmFsRXJyb3IlIjp3LCIlRmxvYXQzMkFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBGbG9hdDMyQXJyYXk/YTpGbG9hdDMyQXJyYXksIiVGbG9hdDY0QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIEZsb2F0NjRBcnJheT9hOkZsb2F0NjRBcnJheSwiJUZpbmFsaXphdGlvblJlZ2lzdHJ5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT9hOkZpbmFsaXphdGlvblJlZ2lzdHJ5LCIlRnVuY3Rpb24lIjppZSwiJUdlbmVyYXRvckZ1bmN0aW9uJSI6X2UsIiVJbnQ4QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIEludDhBcnJheT9hOkludDhBcnJheSwiJUludDE2QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIEludDE2QXJyYXk/YTpJbnQxNkFycmF5LCIlSW50MzJBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgSW50MzJBcnJheT9hOkludDMyQXJyYXksIiVpc0Zpbml0ZSUiOmlzRmluaXRlLCIlaXNOYU4lIjppc05hTiwiJUl0ZXJhdG9yUHJvdG90eXBlJSI6cGUmJmRlP2RlKGRlKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpOmEsIiVKU09OJSI6Im9iamVjdCI9PXR5cGVvZiBKU09OP0pTT046YSwiJU1hcCUiOiJ1bmRlZmluZWQiPT10eXBlb2YgTWFwP2E6TWFwLCIlTWFwSXRlcmF0b3JQcm90b3R5cGUlIjoidW5kZWZpbmVkIiE9dHlwZW9mIE1hcCYmcGUmJmRlP2RlKChuZXcgTWFwKVtTeW1ib2wuaXRlcmF0b3JdKCkpOmEsIiVNYXRoJSI6TWF0aCwiJU51bWJlciUiOk51bWJlciwiJU9iamVjdCUiOnUsIiVPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJSI6YWUsIiVwYXJzZUZsb2F0JSI6cGFyc2VGbG9hdCwiJXBhcnNlSW50JSI6cGFyc2VJbnQsIiVQcm9taXNlJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBQcm9taXNlP2E6UHJvbWlzZSwiJVByb3h5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBQcm94eT9hOlByb3h5LCIlUmFuZ2VFcnJvciUiOngsIiVSZWZlcmVuY2VFcnJvciUiOkMsIiVSZWZsZWN0JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0P2E6UmVmbGVjdCwiJVJlZ0V4cCUiOlJlZ0V4cCwiJVNldCUiOiJ1bmRlZmluZWQiPT10eXBlb2YgU2V0P2E6U2V0LCIlU2V0SXRlcmF0b3JQcm90b3R5cGUlIjoidW5kZWZpbmVkIiE9dHlwZW9mIFNldCYmcGUmJmRlP2RlKChuZXcgU2V0KVtTeW1ib2wuaXRlcmF0b3JdKCkpOmEsIiVTaGFyZWRBcnJheUJ1ZmZlciUiOiJ1bmRlZmluZWQiPT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXI/YTpTaGFyZWRBcnJheUJ1ZmZlciwiJVN0cmluZyUiOlN0cmluZywiJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSI6cGUmJmRlP2RlKCIiW1N5bWJvbC5pdGVyYXRvcl0oKSk6YSwiJVN5bWJvbCUiOnBlP1N5bWJvbDphLCIlU3ludGF4RXJyb3IlIjpqLCIlVGhyb3dUeXBlRXJyb3IlIjpsZSwiJVR5cGVkQXJyYXklIjp3ZSwiJVR5cGVFcnJvciUiOkwsIiVVaW50OEFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50OEFycmF5P2E6VWludDhBcnJheSwiJVVpbnQ4Q2xhbXBlZEFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50OENsYW1wZWRBcnJheT9hOlVpbnQ4Q2xhbXBlZEFycmF5LCIlVWludDE2QXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIFVpbnQxNkFycmF5P2E6VWludDE2QXJyYXksIiVVaW50MzJBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgVWludDMyQXJyYXk/YTpVaW50MzJBcnJheSwiJVVSSUVycm9yJSI6QiwiJVdlYWtNYXAlIjoidW5kZWZpbmVkIj09dHlwZW9mIFdlYWtNYXA/YTpXZWFrTWFwLCIlV2Vha1JlZiUiOiJ1bmRlZmluZWQiPT10eXBlb2YgV2Vha1JlZj9hOldlYWtSZWYsIiVXZWFrU2V0JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBXZWFrU2V0P2E6V2Vha1NldCwiJUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsJSI6U2UsIiVGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHklIjpiZSwiJU9iamVjdC5kZWZpbmVQcm9wZXJ0eSUiOmNlLCIlT2JqZWN0LmdldFByb3RvdHlwZU9mJSI6ZmUsIiVNYXRoLmFicyUiOiQsIiVNYXRoLmZsb29yJSI6VSwiJU1hdGgubWF4JSI6ViwiJU1hdGgubWluJSI6eiwiJU1hdGgucG93JSI6WSwiJU1hdGgucm91bmQlIjpaLCIlTWF0aC5zaWduJSI6ZWUsIiVSZWZsZWN0LmdldFByb3RvdHlwZU9mJSI6eWV9O2lmKGRlKXRyeXtudWxsLmVycm9yfWNhdGNoKHMpe3ZhciBQZT1kZShkZShzKSk7eGVbIiVFcnJvci5wcm90b3R5cGUlIl09UGV9dmFyIFRlPWZ1bmN0aW9uIGRvRXZhbChzKXt2YXIgbztpZigiJUFzeW5jRnVuY3Rpb24lIj09PXMpbz1nZXRFdmFsbGVkQ29uc3RydWN0b3IoImFzeW5jIGZ1bmN0aW9uICgpIHt9Iik7ZWxzZSBpZigiJUdlbmVyYXRvckZ1bmN0aW9uJSI9PT1zKW89Z2V0RXZhbGxlZENvbnN0cnVjdG9yKCJmdW5jdGlvbiogKCkge30iKTtlbHNlIGlmKCIlQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUiPT09cylvPWdldEV2YWxsZWRDb25zdHJ1Y3RvcigiYXN5bmMgZnVuY3Rpb24qICgpIHt9Iik7ZWxzZSBpZigiJUFzeW5jR2VuZXJhdG9yJSI9PT1zKXt2YXIgaT1kb0V2YWwoIiVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSIpO2kmJihvPWkucHJvdG90eXBlKX1lbHNlIGlmKCIlQXN5bmNJdGVyYXRvclByb3RvdHlwZSUiPT09cyl7dmFyIGE9ZG9FdmFsKCIlQXN5bmNHZW5lcmF0b3IlIik7YSYmZGUmJihvPWRlKGEucHJvdG90eXBlKSl9cmV0dXJuIHhlW3NdPW8sb30sUmU9e19fcHJvdG9fXzpudWxsLCIlQXJyYXlCdWZmZXJQcm90b3R5cGUlIjpbIkFycmF5QnVmZmVyIiwicHJvdG90eXBlIl0sIiVBcnJheVByb3RvdHlwZSUiOlsiQXJyYXkiLCJwcm90b3R5cGUiXSwiJUFycmF5UHJvdG9fZW50cmllcyUiOlsiQXJyYXkiLCJwcm90b3R5cGUiLCJlbnRyaWVzIl0sIiVBcnJheVByb3RvX2ZvckVhY2glIjpbIkFycmF5IiwicHJvdG90eXBlIiwiZm9yRWFjaCJdLCIlQXJyYXlQcm90b19rZXlzJSI6WyJBcnJheSIsInByb3RvdHlwZSIsImtleXMiXSwiJUFycmF5UHJvdG9fdmFsdWVzJSI6WyJBcnJheSIsInByb3RvdHlwZSIsInZhbHVlcyJdLCIlQXN5bmNGdW5jdGlvblByb3RvdHlwZSUiOlsiQXN5bmNGdW5jdGlvbiIsInByb3RvdHlwZSJdLCIlQXN5bmNHZW5lcmF0b3IlIjpbIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb24iLCJwcm90b3R5cGUiXSwiJUFzeW5jR2VuZXJhdG9yUHJvdG90eXBlJSI6WyJBc3luY0dlbmVyYXRvckZ1bmN0aW9uIiwicHJvdG90eXBlIiwicHJvdG90eXBlIl0sIiVCb29sZWFuUHJvdG90eXBlJSI6WyJCb29sZWFuIiwicHJvdG90eXBlIl0sIiVEYXRhVmlld1Byb3RvdHlwZSUiOlsiRGF0YVZpZXciLCJwcm90b3R5cGUiXSwiJURhdGVQcm90b3R5cGUlIjpbIkRhdGUiLCJwcm90b3R5cGUiXSwiJUVycm9yUHJvdG90eXBlJSI6WyJFcnJvciIsInByb3RvdHlwZSJdLCIlRXZhbEVycm9yUHJvdG90eXBlJSI6WyJFdmFsRXJyb3IiLCJwcm90b3R5cGUiXSwiJUZsb2F0MzJBcnJheVByb3RvdHlwZSUiOlsiRmxvYXQzMkFycmF5IiwicHJvdG90eXBlIl0sIiVGbG9hdDY0QXJyYXlQcm90b3R5cGUlIjpbIkZsb2F0NjRBcnJheSIsInByb3RvdHlwZSJdLCIlRnVuY3Rpb25Qcm90b3R5cGUlIjpbIkZ1bmN0aW9uIiwicHJvdG90eXBlIl0sIiVHZW5lcmF0b3IlIjpbIkdlbmVyYXRvckZ1bmN0aW9uIiwicHJvdG90eXBlIl0sIiVHZW5lcmF0b3JQcm90b3R5cGUlIjpbIkdlbmVyYXRvckZ1bmN0aW9uIiwicHJvdG90eXBlIiwicHJvdG90eXBlIl0sIiVJbnQ4QXJyYXlQcm90b3R5cGUlIjpbIkludDhBcnJheSIsInByb3RvdHlwZSJdLCIlSW50MTZBcnJheVByb3RvdHlwZSUiOlsiSW50MTZBcnJheSIsInByb3RvdHlwZSJdLCIlSW50MzJBcnJheVByb3RvdHlwZSUiOlsiSW50MzJBcnJheSIsInByb3RvdHlwZSJdLCIlSlNPTlBhcnNlJSI6WyJKU09OIiwicGFyc2UiXSwiJUpTT05TdHJpbmdpZnklIjpbIkpTT04iLCJzdHJpbmdpZnkiXSwiJU1hcFByb3RvdHlwZSUiOlsiTWFwIiwicHJvdG90eXBlIl0sIiVOdW1iZXJQcm90b3R5cGUlIjpbIk51bWJlciIsInByb3RvdHlwZSJdLCIlT2JqZWN0UHJvdG90eXBlJSI6WyJPYmplY3QiLCJwcm90b3R5cGUiXSwiJU9ialByb3RvX3RvU3RyaW5nJSI6WyJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyJdLCIlT2JqUHJvdG9fdmFsdWVPZiUiOlsiT2JqZWN0IiwicHJvdG90eXBlIiwidmFsdWVPZiJdLCIlUHJvbWlzZVByb3RvdHlwZSUiOlsiUHJvbWlzZSIsInByb3RvdHlwZSJdLCIlUHJvbWlzZVByb3RvX3RoZW4lIjpbIlByb21pc2UiLCJwcm90b3R5cGUiLCJ0aGVuIl0sIiVQcm9taXNlX2FsbCUiOlsiUHJvbWlzZSIsImFsbCJdLCIlUHJvbWlzZV9yZWplY3QlIjpbIlByb21pc2UiLCJyZWplY3QiXSwiJVByb21pc2VfcmVzb2x2ZSUiOlsiUHJvbWlzZSIsInJlc29sdmUiXSwiJVJhbmdlRXJyb3JQcm90b3R5cGUlIjpbIlJhbmdlRXJyb3IiLCJwcm90b3R5cGUiXSwiJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSI6WyJSZWZlcmVuY2VFcnJvciIsInByb3RvdHlwZSJdLCIlUmVnRXhwUHJvdG90eXBlJSI6WyJSZWdFeHAiLCJwcm90b3R5cGUiXSwiJVNldFByb3RvdHlwZSUiOlsiU2V0IiwicHJvdG90eXBlIl0sIiVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUiOlsiU2hhcmVkQXJyYXlCdWZmZXIiLCJwcm90b3R5cGUiXSwiJVN0cmluZ1Byb3RvdHlwZSUiOlsiU3RyaW5nIiwicHJvdG90eXBlIl0sIiVTeW1ib2xQcm90b3R5cGUlIjpbIlN5bWJvbCIsInByb3RvdHlwZSJdLCIlU3ludGF4RXJyb3JQcm90b3R5cGUlIjpbIlN5bnRheEVycm9yIiwicHJvdG90eXBlIl0sIiVUeXBlZEFycmF5UHJvdG90eXBlJSI6WyJUeXBlZEFycmF5IiwicHJvdG90eXBlIl0sIiVUeXBlRXJyb3JQcm90b3R5cGUlIjpbIlR5cGVFcnJvciIsInByb3RvdHlwZSJdLCIlVWludDhBcnJheVByb3RvdHlwZSUiOlsiVWludDhBcnJheSIsInByb3RvdHlwZSJdLCIlVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlIjpbIlVpbnQ4Q2xhbXBlZEFycmF5IiwicHJvdG90eXBlIl0sIiVVaW50MTZBcnJheVByb3RvdHlwZSUiOlsiVWludDE2QXJyYXkiLCJwcm90b3R5cGUiXSwiJVVpbnQzMkFycmF5UHJvdG90eXBlJSI6WyJVaW50MzJBcnJheSIsInByb3RvdHlwZSJdLCIlVVJJRXJyb3JQcm90b3R5cGUlIjpbIlVSSUVycm9yIiwicHJvdG90eXBlIl0sIiVXZWFrTWFwUHJvdG90eXBlJSI6WyJXZWFrTWFwIiwicHJvdG90eXBlIl0sIiVXZWFrU2V0UHJvdG90eXBlJSI6WyJXZWFrU2V0IiwicHJvdG90eXBlIl19LCRlPWkoNjY3NDMpLHFlPWkoOTk1NyksemU9JGUuY2FsbChTZSxBcnJheS5wcm90b3R5cGUuY29uY2F0KSxXZT0kZS5jYWxsKGJlLEFycmF5LnByb3RvdHlwZS5zcGxpY2UpLEhlPSRlLmNhbGwoU2UsU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKSxZZT0kZS5jYWxsKFNlLFN0cmluZy5wcm90b3R5cGUuc2xpY2UpLFhlPSRlLmNhbGwoU2UsUmVnRXhwLnByb3RvdHlwZS5leGVjKSxRZT0vW14lLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JSQpKS9nLGV0PS9cXChcXCk/L2csdHQ9ZnVuY3Rpb24gZ2V0QmFzZUludHJpbnNpYyhzLG8pe3ZhciBpLGE9cztpZihxZShSZSxhKSYmKGE9IiUiKyhpPVJlW2FdKVswXSsiJSIpLHFlKHhlLGEpKXt2YXIgdT14ZVthXTtpZih1PT09X2UmJih1PVRlKGEpKSx2b2lkIDA9PT11JiYhbyl0aHJvdyBuZXcgTCgiaW50cmluc2ljICIrcysiIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlISIpO3JldHVybnthbGlhczppLG5hbWU6YSx2YWx1ZTp1fX10aHJvdyBuZXcgaigiaW50cmluc2ljICIrcysiIGRvZXMgbm90IGV4aXN0ISIpfTtzLmV4cG9ydHM9ZnVuY3Rpb24gR2V0SW50cmluc2ljKHMsbyl7aWYoInN0cmluZyIhPXR5cGVvZiBzfHwwPT09cy5sZW5ndGgpdGhyb3cgbmV3IEwoImludHJpbnNpYyBuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7aWYoYXJndW1lbnRzLmxlbmd0aD4xJiYiYm9vbGVhbiIhPXR5cGVvZiBvKXRocm93IG5ldyBMKCciYWxsb3dNaXNzaW5nIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO2lmKG51bGw9PT1YZSgvXiU/W14lXSolPyQvLHMpKXRocm93IG5ldyBqKCJgJWAgbWF5IG5vdCBiZSBwcmVzZW50IGFueXdoZXJlIGJ1dCBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGludHJpbnNpYyBuYW1lIik7dmFyIGk9ZnVuY3Rpb24gc3RyaW5nVG9QYXRoKHMpe3ZhciBvPVllKHMsMCwxKSxpPVllKHMsLTEpO2lmKCIlIj09PW8mJiIlIiE9PWkpdGhyb3cgbmV3IGooImludmFsaWQgaW50cmluc2ljIHN5bnRheCwgZXhwZWN0ZWQgY2xvc2luZyBgJWAiKTtpZigiJSI9PT1pJiYiJSIhPT1vKXRocm93IG5ldyBqKCJpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIG9wZW5pbmcgYCVgIik7dmFyIGE9W107cmV0dXJuIEhlKHMsUWUsKGZ1bmN0aW9uKHMsbyxpLHUpe2FbYS5sZW5ndGhdPWk/SGUodSxldCwiJDEiKTpvfHxzfSkpLGF9KHMpLGE9aS5sZW5ndGg+MD9pWzBdOiIiLHU9dHQoIiUiK2ErIiUiLG8pLF89dS5uYW1lLHc9dS52YWx1ZSx4PSExLEM9dS5hbGlhcztDJiYoYT1DWzBdLFdlKGksemUoWzAsMV0sQykpKTtmb3IodmFyIEI9MSwkPSEwO0I8aS5sZW5ndGg7Qis9MSl7dmFyIFU9aVtCXSxWPVllKFUsMCwxKSx6PVllKFUsLTEpO2lmKCgnIic9PT1WfHwiJyI9PT1WfHwiYCI9PT1WfHwnIic9PT16fHwiJyI9PT16fHwiYCI9PT16KSYmViE9PXopdGhyb3cgbmV3IGooInByb3BlcnR5IG5hbWVzIHdpdGggcXVvdGVzIG11c3QgaGF2ZSBtYXRjaGluZyBxdW90ZXMiKTtpZigiY29uc3RydWN0b3IiIT09VSYmJHx8KHg9ITApLHFlKHhlLF89IiUiKyhhKz0iLiIrVSkrIiUiKSl3PXhlW19dO2Vsc2UgaWYobnVsbCE9dyl7aWYoIShVIGluIHcpKXtpZighbyl0aHJvdyBuZXcgTCgiYmFzZSBpbnRyaW5zaWMgZm9yICIrcysiIGV4aXN0cywgYnV0IHRoZSBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLiIpO3JldHVybn1pZihhZSYmQisxPj1pLmxlbmd0aCl7dmFyIFk9YWUodyxVKTt3PSgkPSEhWSkmJiJnZXQiaW4gWSYmISgib3JpZ2luYWxWYWx1ZSJpbiBZLmdldCk/WS5nZXQ6d1tVXX1lbHNlICQ9cWUodyxVKSx3PXdbVV07JCYmIXgmJih4ZVtfXT13KX19cmV0dXJuIHd9fSw3MTA2NChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNzk2MTIpO3MuZXhwb3J0cz1hLmdldFByb3RvdHlwZU9mfHxudWxsfSw0ODY0OChzKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdC5nZXRQcm90b3R5cGVPZnx8bnVsbH0sOTM2MjgocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQ4NjQ4KSx1PWkoNzEwNjQpLF89aSg3MTc2KTtzLmV4cG9ydHM9YT9mdW5jdGlvbiBnZXRQcm90byhzKXtyZXR1cm4gYShzKX06dT9mdW5jdGlvbiBnZXRQcm90byhzKXtpZighc3x8Im9iamVjdCIhPXR5cGVvZiBzJiYiZnVuY3Rpb24iIT10eXBlb2Ygcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJnZXRQcm90bzogbm90IGFuIG9iamVjdCIpO3JldHVybiB1KHMpfTpfP2Z1bmN0aW9uIGdldFByb3RvKHMpe3JldHVybiBfKHMpfTpudWxsfSw2NTQ5KHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcn0sNzU3OTUocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDY1NDkpO2lmKGEpdHJ5e2EoW10sImxlbmd0aCIpfWNhdGNoKHMpe2E9bnVsbH1zLmV4cG9ydHM9YX0sMzA1OTIocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDMwNjU1KSx1PWZ1bmN0aW9uIGhhc1Byb3BlcnR5RGVzY3JpcHRvcnMoKXtyZXR1cm4hIWF9O3UuaGFzQXJyYXlMZW5ndGhEZWZpbmVCdWc9ZnVuY3Rpb24gaGFzQXJyYXlMZW5ndGhEZWZpbmVCdWcoKXtpZighYSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIDEhPT1hKFtdLCJsZW5ndGgiLHt2YWx1ZToxfSkubGVuZ3RofWNhdGNoKHMpe3JldHVybiEwfX0scy5leHBvcnRzPXV9LDY0MDM5KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbCx1PWkoNDEzMzMpO3MuZXhwb3J0cz1mdW5jdGlvbiBoYXNOYXRpdmVTeW1ib2xzKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGEmJigiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoInN5bWJvbCI9PXR5cGVvZiBhKCJmb28iKSYmKCJzeW1ib2wiPT10eXBlb2YgU3ltYm9sKCJiYXIiKSYmdSgpKSkpfX0sNDEzMzMocyl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz1mdW5jdGlvbiBoYXNTeW1ib2xzKCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIFN5bWJvbHx8ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpcmV0dXJuITE7aWYoInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3IpcmV0dXJuITA7dmFyIHM9e30sbz1TeW1ib2woInRlc3QiKSxpPU9iamVjdChvKTtpZigic3RyaW5nIj09dHlwZW9mIG8pcmV0dXJuITE7aWYoIltvYmplY3QgU3ltYm9sXSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykpcmV0dXJuITE7aWYoIltvYmplY3QgU3ltYm9sXSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaSkpcmV0dXJuITE7Zm9yKHZhciBhIGluIHNbb109NDIscylyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmtleXMmJjAhPT1PYmplY3Qua2V5cyhzKS5sZW5ndGgpcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzJiYwIT09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocykubGVuZ3RoKXJldHVybiExO3ZhciB1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7aWYoMSE9PXUubGVuZ3RofHx1WzBdIT09bylyZXR1cm4hMTtpZighT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsbykpcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ipe3ZhciBfPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocyxvKTtpZig0MiE9PV8udmFsdWV8fCEwIT09Xy5lbnVtZXJhYmxlKXJldHVybiExfXJldHVybiEwfX0sNDkwOTIocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQxMzMzKTtzLmV4cG9ydHM9ZnVuY3Rpb24gaGFzVG9TdHJpbmdUYWdTaGFtcygpe3JldHVybiBhKCkmJiEhU3ltYm9sLnRvU3RyaW5nVGFnfX0sOTk1NyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLHU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxfPWkoNjY3NDMpO3MuZXhwb3J0cz1fLmNhbGwoYSx1KX0sNDU5ODEocyl7ZnVuY3Rpb24gZGVlcEZyZWV6ZShzKXtyZXR1cm4gcyBpbnN0YW5jZW9mIE1hcD9zLmNsZWFyPXMuZGVsZXRlPXMuc2V0PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtYXAgaXMgcmVhZC1vbmx5Iil9OnMgaW5zdGFuY2VvZiBTZXQmJihzLmFkZD1zLmNsZWFyPXMuZGVsZXRlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJzZXQgaXMgcmVhZC1vbmx5Iil9KSxPYmplY3QuZnJlZXplKHMpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHMpLmZvckVhY2goKGZ1bmN0aW9uKG8pe3ZhciBpPXNbb107Im9iamVjdCIhPXR5cGVvZiBpfHxPYmplY3QuaXNGcm96ZW4oaSl8fGRlZXBGcmVlemUoaSl9KSksc312YXIgbz1kZWVwRnJlZXplLGk9ZGVlcEZyZWV6ZTtvLmRlZmF1bHQ9aTtjbGFzcyBSZXNwb25zZXtjb25zdHJ1Y3RvcihzKXt2b2lkIDA9PT1zLmRhdGEmJihzLmRhdGE9e30pLHRoaXMuZGF0YT1zLmRhdGEsdGhpcy5pc01hdGNoSWdub3JlZD0hMX1pZ25vcmVNYXRjaCgpe3RoaXMuaXNNYXRjaElnbm9yZWQ9ITB9fWZ1bmN0aW9uIGVzY2FwZUhUTUwocyl7cmV0dXJuIHMucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7IikucmVwbGFjZSgvJy9nLCImI3gyNzsiKX1mdW5jdGlvbiBpbmhlcml0KHMsLi4ubyl7Y29uc3QgaT1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdCBvIGluIHMpaVtvXT1zW29dO3JldHVybiBvLmZvckVhY2goKGZ1bmN0aW9uKHMpe2Zvcihjb25zdCBvIGluIHMpaVtvXT1zW29dfSkpLGl9Y29uc3QgZW1pdHNXcmFwcGluZ1RhZ3M9cz0+ISFzLmtpbmQ7Y2xhc3MgSFRNTFJlbmRlcmVye2NvbnN0cnVjdG9yKHMsbyl7dGhpcy5idWZmZXI9IiIsdGhpcy5jbGFzc1ByZWZpeD1vLmNsYXNzUHJlZml4LHMud2Fsayh0aGlzKX1hZGRUZXh0KHMpe3RoaXMuYnVmZmVyKz1lc2NhcGVIVE1MKHMpfW9wZW5Ob2RlKHMpe2lmKCFlbWl0c1dyYXBwaW5nVGFncyhzKSlyZXR1cm47bGV0IG89cy5raW5kO3Muc3VibGFuZ3VhZ2V8fChvPWAke3RoaXMuY2xhc3NQcmVmaXh9JHtvfWApLHRoaXMuc3BhbihvKX1jbG9zZU5vZGUocyl7ZW1pdHNXcmFwcGluZ1RhZ3MocykmJih0aGlzLmJ1ZmZlcis9Ijwvc3Bhbj4iKX12YWx1ZSgpe3JldHVybiB0aGlzLmJ1ZmZlcn1zcGFuKHMpe3RoaXMuYnVmZmVyKz1gPHNwYW4gY2xhc3M9IiR7c30iPmB9fWNsYXNzIFRva2VuVHJlZXtjb25zdHJ1Y3Rvcigpe3RoaXMucm9vdE5vZGU9e2NoaWxkcmVuOltdfSx0aGlzLnN0YWNrPVt0aGlzLnJvb3ROb2RlXX1nZXQgdG9wKCl7cmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV19Z2V0IHJvb3QoKXtyZXR1cm4gdGhpcy5yb290Tm9kZX1hZGQocyl7dGhpcy50b3AuY2hpbGRyZW4ucHVzaChzKX1vcGVuTm9kZShzKXtjb25zdCBvPXtraW5kOnMsY2hpbGRyZW46W119O3RoaXMuYWRkKG8pLHRoaXMuc3RhY2sucHVzaChvKX1jbG9zZU5vZGUoKXtpZih0aGlzLnN0YWNrLmxlbmd0aD4xKXJldHVybiB0aGlzLnN0YWNrLnBvcCgpfWNsb3NlQWxsTm9kZXMoKXtmb3IoO3RoaXMuY2xvc2VOb2RlKCk7KTt9dG9KU09OKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMucm9vdE5vZGUsbnVsbCw0KX13YWxrKHMpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLl93YWxrKHMsdGhpcy5yb290Tm9kZSl9c3RhdGljIF93YWxrKHMsbyl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBvP3MuYWRkVGV4dChvKTpvLmNoaWxkcmVuJiYocy5vcGVuTm9kZShvKSxvLmNoaWxkcmVuLmZvckVhY2goKG89PnRoaXMuX3dhbGsocyxvKSkpLHMuY2xvc2VOb2RlKG8pKSxzfXN0YXRpYyBfY29sbGFwc2Uocyl7InN0cmluZyIhPXR5cGVvZiBzJiZzLmNoaWxkcmVuJiYocy5jaGlsZHJlbi5ldmVyeSgocz0+InN0cmluZyI9PXR5cGVvZiBzKSk/cy5jaGlsZHJlbj1bcy5jaGlsZHJlbi5qb2luKCIiKV06cy5jaGlsZHJlbi5mb3JFYWNoKChzPT57VG9rZW5UcmVlLl9jb2xsYXBzZShzKX0pKSl9fWNsYXNzIFRva2VuVHJlZUVtaXR0ZXIgZXh0ZW5kcyBUb2tlblRyZWV7Y29uc3RydWN0b3Iocyl7c3VwZXIoKSx0aGlzLm9wdGlvbnM9c31hZGRLZXl3b3JkKHMsbyl7IiIhPT1zJiYodGhpcy5vcGVuTm9kZShvKSx0aGlzLmFkZFRleHQocyksdGhpcy5jbG9zZU5vZGUoKSl9YWRkVGV4dChzKXsiIiE9PXMmJnRoaXMuYWRkKHMpfWFkZFN1Ymxhbmd1YWdlKHMsbyl7Y29uc3QgaT1zLnJvb3Q7aS5raW5kPW8saS5zdWJsYW5ndWFnZT0hMCx0aGlzLmFkZChpKX10b0hUTUwoKXtyZXR1cm4gbmV3IEhUTUxSZW5kZXJlcih0aGlzLHRoaXMub3B0aW9ucykudmFsdWUoKX1maW5hbGl6ZSgpe3JldHVybiEwfX1mdW5jdGlvbiBzb3VyY2Uocyl7cmV0dXJuIHM/InN0cmluZyI9PXR5cGVvZiBzP3M6cy5zb3VyY2U6bnVsbH1jb25zdCBhPS9cWyg/OlteXFxcXV18XFwuKSpcXXxcKFw/P3xcXChbMS05XVswLTldKil8XFwuLztjb25zdCB1PSJbYS16QS1aXVxcdyoiLF89IlthLXpBLVpfXVxcdyoiLHc9IlxcYlxcZCsoXFwuXFxkKyk/Iix4PSIoLT8pKFxcYjBbeFhdW2EtZkEtRjAtOV0rfChcXGJcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWy0rXT9cXGQrKT8pIixDPSJcXGIoMGJbMDFdKykiLGo9e2JlZ2luOiJcXFxcW1xcc1xcU10iLHJlbGV2YW5jZTowfSxMPXtjbGFzc05hbWU6InN0cmluZyIsYmVnaW46IiciLGVuZDoiJyIsaWxsZWdhbDoiXFxuIixjb250YWluczpbal19LEI9e2NsYXNzTmFtZToic3RyaW5nIixiZWdpbjonIicsZW5kOiciJyxpbGxlZ2FsOiJcXG4iLGNvbnRhaW5zOltqXX0sJD17YmVnaW46L1xiKGF8YW58dGhlfGFyZXxJJ218aXNuJ3R8ZG9uJ3R8ZG9lc24ndHx3b24ndHxidXR8anVzdHxzaG91bGR8cHJldHR5fHNpbXBseXxlbm91Z2h8Z29ubmF8Z29pbmd8d3RmfHNvfHN1Y2h8d2lsbHx5b3V8eW91cnx0aGV5fGxpa2V8bW9yZSlcYi99LENPTU1FTlQ9ZnVuY3Rpb24ocyxvLGk9e30pe2NvbnN0IGE9aW5oZXJpdCh7Y2xhc3NOYW1lOiJjb21tZW50IixiZWdpbjpzLGVuZDpvLGNvbnRhaW5zOltdfSxpKTtyZXR1cm4gYS5jb250YWlucy5wdXNoKCQpLGEuY29udGFpbnMucHVzaCh7Y2xhc3NOYW1lOiJkb2N0YWciLGJlZ2luOiIoPzpUT0RPfEZJWE1FfE5PVEV8QlVHfE9QVElNSVpFfEhBQ0t8WFhYKToiLHJlbGV2YW5jZTowfSksYX0sVT1DT01NRU5UKCIvLyIsIiQiKSxWPUNPTU1FTlQoIi9cXCoiLCJcXCovIiksej1DT01NRU5UKCIjIiwiJCIpLFk9e2NsYXNzTmFtZToibnVtYmVyIixiZWdpbjp3LHJlbGV2YW5jZTowfSxaPXtjbGFzc05hbWU6Im51bWJlciIsYmVnaW46eCxyZWxldmFuY2U6MH0sZWU9e2NsYXNzTmFtZToibnVtYmVyIixiZWdpbjpDLHJlbGV2YW5jZTowfSxpZT17Y2xhc3NOYW1lOiJudW1iZXIiLGJlZ2luOncrIiglfGVtfGV4fGNofHJlbXx2d3x2aHx2bWlufHZtYXh8Y218bW18aW58cHR8cGN8cHh8ZGVnfGdyYWR8cmFkfHR1cm58c3xtc3xIenxrSHp8ZHBpfGRwY218ZHBweCk/IixyZWxldmFuY2U6MH0sYWU9e2JlZ2luOi8oPz1cL1teL1xuXSpcLykvLGNvbnRhaW5zOlt7Y2xhc3NOYW1lOiJyZWdleHAiLGJlZ2luOi9cLy8sZW5kOi9cL1tnaW11eV0qLyxpbGxlZ2FsOi9cbi8sY29udGFpbnM6W2ose2JlZ2luOi9cWy8sZW5kOi9cXS8scmVsZXZhbmNlOjAsY29udGFpbnM6W2pdfV19XX0sY2U9e2NsYXNzTmFtZToidGl0bGUiLGJlZ2luOnUscmVsZXZhbmNlOjB9LGxlPXtjbGFzc05hbWU6InRpdGxlIixiZWdpbjpfLHJlbGV2YW5jZTowfSxwZT17YmVnaW46IlxcLlxccyoiK18scmVsZXZhbmNlOjB9O3ZhciBkZT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxNQVRDSF9OT1RISU5HX1JFOi9cYlxCLyxJREVOVF9SRTp1LFVOREVSU0NPUkVfSURFTlRfUkU6XyxOVU1CRVJfUkU6dyxDX05VTUJFUl9SRTp4LEJJTkFSWV9OVU1CRVJfUkU6QyxSRV9TVEFSVEVSU19SRToiIXwhPXwhPT18JXwlPXwmfCYmfCY9fFxcKnxcXCo9fFxcK3xcXCs9fCx8LXwtPXwvPXwvfDp8O3w8PHw8PD18PD18PHw9PT18PT18PXw+Pj49fD4+PXw+PXw+Pj58Pj58PnxcXD98XFxbfFxce3xcXCh8XFxefFxcXj18XFx8fFxcfD18XFx8XFx8fH4iLFNIRUJBTkc6KHM9e30pPT57Y29uc3Qgbz0vXiMhWyBdKlwvLztyZXR1cm4gcy5iaW5hcnkmJihzLmJlZ2luPWZ1bmN0aW9uIGNvbmNhdCguLi5zKXtyZXR1cm4gcy5tYXAoKHM9PnNvdXJjZShzKSkpLmpvaW4oIiIpfShvLC8uKlxiLyxzLmJpbmFyeSwvXGIuKi8pKSxpbmhlcml0KHtjbGFzc05hbWU6Im1ldGEiLGJlZ2luOm8sZW5kOi8kLyxyZWxldmFuY2U6MCwib246YmVnaW4iOihzLG8pPT57MCE9PXMuaW5kZXgmJm8uaWdub3JlTWF0Y2goKX19LHMpfSxCQUNLU0xBU0hfRVNDQVBFOmosQVBPU19TVFJJTkdfTU9ERTpMLFFVT1RFX1NUUklOR19NT0RFOkIsUEhSQVNBTF9XT1JEU19NT0RFOiQsQ09NTUVOVCxDX0xJTkVfQ09NTUVOVF9NT0RFOlUsQ19CTE9DS19DT01NRU5UX01PREU6VixIQVNIX0NPTU1FTlRfTU9ERTp6LE5VTUJFUl9NT0RFOlksQ19OVU1CRVJfTU9ERTpaLEJJTkFSWV9OVU1CRVJfTU9ERTplZSxDU1NfTlVNQkVSX01PREU6aWUsUkVHRVhQX01PREU6YWUsVElUTEVfTU9ERTpjZSxVTkRFUlNDT1JFX1RJVExFX01PREU6bGUsTUVUSE9EX0dVQVJEOnBlLEVORF9TQU1FX0FTX0JFR0lOOmZ1bmN0aW9uKHMpe3JldHVybiBPYmplY3QuYXNzaWduKHMseyJvbjpiZWdpbiI6KHMsbyk9PntvLmRhdGEuX2JlZ2luTWF0Y2g9c1sxXX0sIm9uOmVuZCI6KHMsbyk9PntvLmRhdGEuX2JlZ2luTWF0Y2ghPT1zWzFdJiZvLmlnbm9yZU1hdGNoKCl9fSl9fSk7ZnVuY3Rpb24gc2tpcElmaGFzUHJlY2VkaW5nRG90KHMsbyl7Ii4iPT09cy5pbnB1dFtzLmluZGV4LTFdJiZvLmlnbm9yZU1hdGNoKCl9ZnVuY3Rpb24gYmVnaW5LZXl3b3JkcyhzLG8pe28mJnMuYmVnaW5LZXl3b3JkcyYmKHMuYmVnaW49IlxcYigiK3MuYmVnaW5LZXl3b3Jkcy5zcGxpdCgiICIpLmpvaW4oInwiKSsiKSg/IVxcLikoPz1cXGJ8XFxzKSIscy5fX2JlZm9yZUJlZ2luPXNraXBJZmhhc1ByZWNlZGluZ0RvdCxzLmtleXdvcmRzPXMua2V5d29yZHN8fHMuYmVnaW5LZXl3b3JkcyxkZWxldGUgcy5iZWdpbktleXdvcmRzLHZvaWQgMD09PXMucmVsZXZhbmNlJiYocy5yZWxldmFuY2U9MCkpfWZ1bmN0aW9uIGNvbXBpbGVJbGxlZ2FsKHMsbyl7QXJyYXkuaXNBcnJheShzLmlsbGVnYWwpJiYocy5pbGxlZ2FsPWZ1bmN0aW9uIGVpdGhlciguLi5zKXtyZXR1cm4iKCIrcy5tYXAoKHM9PnNvdXJjZShzKSkpLmpvaW4oInwiKSsiKSJ9KC4uLnMuaWxsZWdhbCkpfWZ1bmN0aW9uIGNvbXBpbGVNYXRjaChzLG8pe2lmKHMubWF0Y2gpe2lmKHMuYmVnaW58fHMuZW5kKXRocm93IG5ldyBFcnJvcigiYmVnaW4gJiBlbmQgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBtYXRjaCIpO3MuYmVnaW49cy5tYXRjaCxkZWxldGUgcy5tYXRjaH19ZnVuY3Rpb24gY29tcGlsZVJlbGV2YW5jZShzLG8pe3ZvaWQgMD09PXMucmVsZXZhbmNlJiYocy5yZWxldmFuY2U9MSl9Y29uc3QgZmU9WyJvZiIsImFuZCIsImZvciIsImluIiwibm90Iiwib3IiLCJpZiIsInRoZW4iLCJwYXJlbnQiLCJsaXN0IiwidmFsdWUiXTtmdW5jdGlvbiBjb21waWxlS2V5d29yZHMocyxvLGk9ImtleXdvcmQiKXtjb25zdCBhPXt9O3JldHVybiJzdHJpbmciPT10eXBlb2Ygcz9jb21waWxlTGlzdChpLHMuc3BsaXQoIiAiKSk6QXJyYXkuaXNBcnJheShzKT9jb21waWxlTGlzdChpLHMpOk9iamVjdC5rZXlzKHMpLmZvckVhY2goKGZ1bmN0aW9uKGkpe09iamVjdC5hc3NpZ24oYSxjb21waWxlS2V5d29yZHMoc1tpXSxvLGkpKX0pKSxhO2Z1bmN0aW9uIGNvbXBpbGVMaXN0KHMsaSl7byYmKGk9aS5tYXAoKHM9PnMudG9Mb3dlckNhc2UoKSkpKSxpLmZvckVhY2goKGZ1bmN0aW9uKG8pe2NvbnN0IGk9by5zcGxpdCgifCIpO2FbaVswXV09W3Msc2NvcmVGb3JLZXl3b3JkKGlbMF0saVsxXSldfSkpfX1mdW5jdGlvbiBzY29yZUZvcktleXdvcmQocyxvKXtyZXR1cm4gbz9OdW1iZXIobyk6ZnVuY3Rpb24gY29tbW9uS2V5d29yZChzKXtyZXR1cm4gZmUuaW5jbHVkZXMocy50b0xvd2VyQ2FzZSgpKX0ocyk/MDoxfWZ1bmN0aW9uIGNvbXBpbGVMYW5ndWFnZShzLHtwbHVnaW5zOm99KXtmdW5jdGlvbiBsYW5nUmUobyxpKXtyZXR1cm4gbmV3IFJlZ0V4cChzb3VyY2UobyksIm0iKyhzLmNhc2VfaW5zZW5zaXRpdmU/ImkiOiIiKSsoaT8iZyI6IiIpKX1jbGFzcyBNdWx0aVJlZ2V4e2NvbnN0cnVjdG9yKCl7dGhpcy5tYXRjaEluZGV4ZXM9e30sdGhpcy5yZWdleGVzPVtdLHRoaXMubWF0Y2hBdD0xLHRoaXMucG9zaXRpb249MH1hZGRSdWxlKHMsbyl7by5wb3NpdGlvbj10aGlzLnBvc2l0aW9uKyssdGhpcy5tYXRjaEluZGV4ZXNbdGhpcy5tYXRjaEF0XT1vLHRoaXMucmVnZXhlcy5wdXNoKFtvLHNdKSx0aGlzLm1hdGNoQXQrPWZ1bmN0aW9uIGNvdW50TWF0Y2hHcm91cHMocyl7cmV0dXJuIG5ldyBSZWdFeHAocy50b1N0cmluZygpKyJ8IikuZXhlYygiIikubGVuZ3RoLTF9KHMpKzF9Y29tcGlsZSgpezA9PT10aGlzLnJlZ2V4ZXMubGVuZ3RoJiYodGhpcy5leGVjPSgpPT5udWxsKTtjb25zdCBzPXRoaXMucmVnZXhlcy5tYXAoKHM9PnNbMV0pKTt0aGlzLm1hdGNoZXJSZT1sYW5nUmUoZnVuY3Rpb24gam9pbihzLG89InwiKXtsZXQgaT0wO3JldHVybiBzLm1hcCgocz0+e2krPTE7Y29uc3Qgbz1pO2xldCB1PXNvdXJjZShzKSxfPSIiO2Zvcig7dS5sZW5ndGg+MDspe2NvbnN0IHM9YS5leGVjKHUpO2lmKCFzKXtfKz11O2JyZWFrfV8rPXUuc3Vic3RyaW5nKDAscy5pbmRleCksdT11LnN1YnN0cmluZyhzLmluZGV4K3NbMF0ubGVuZ3RoKSwiXFwiPT09c1swXVswXSYmc1sxXT9fKz0iXFwiK1N0cmluZyhOdW1iZXIoc1sxXSkrbyk6KF8rPXNbMF0sIigiPT09c1swXSYmaSsrKX1yZXR1cm4gX30pKS5tYXAoKHM9PmAoJHtzfSlgKSkuam9pbihvKX0ocyksITApLHRoaXMubGFzdEluZGV4PTB9ZXhlYyhzKXt0aGlzLm1hdGNoZXJSZS5sYXN0SW5kZXg9dGhpcy5sYXN0SW5kZXg7Y29uc3Qgbz10aGlzLm1hdGNoZXJSZS5leGVjKHMpO2lmKCFvKXJldHVybiBudWxsO2NvbnN0IGk9by5maW5kSW5kZXgoKChzLG8pPT5vPjAmJnZvaWQgMCE9PXMpKSxhPXRoaXMubWF0Y2hJbmRleGVzW2ldO3JldHVybiBvLnNwbGljZSgwLGkpLE9iamVjdC5hc3NpZ24obyxhKX19Y2xhc3MgUmVzdW1hYmxlTXVsdGlSZWdleHtjb25zdHJ1Y3Rvcigpe3RoaXMucnVsZXM9W10sdGhpcy5tdWx0aVJlZ2V4ZXM9W10sdGhpcy5jb3VudD0wLHRoaXMubGFzdEluZGV4PTAsdGhpcy5yZWdleEluZGV4PTB9Z2V0TWF0Y2hlcihzKXtpZih0aGlzLm11bHRpUmVnZXhlc1tzXSlyZXR1cm4gdGhpcy5tdWx0aVJlZ2V4ZXNbc107Y29uc3Qgbz1uZXcgTXVsdGlSZWdleDtyZXR1cm4gdGhpcy5ydWxlcy5zbGljZShzKS5mb3JFYWNoKCgoW3MsaV0pPT5vLmFkZFJ1bGUocyxpKSkpLG8uY29tcGlsZSgpLHRoaXMubXVsdGlSZWdleGVzW3NdPW8sb31yZXN1bWluZ1NjYW5BdFNhbWVQb3NpdGlvbigpe3JldHVybiAwIT09dGhpcy5yZWdleEluZGV4fWNvbnNpZGVyQWxsKCl7dGhpcy5yZWdleEluZGV4PTB9YWRkUnVsZShzLG8pe3RoaXMucnVsZXMucHVzaChbcyxvXSksImJlZ2luIj09PW8udHlwZSYmdGhpcy5jb3VudCsrfWV4ZWMocyl7Y29uc3Qgbz10aGlzLmdldE1hdGNoZXIodGhpcy5yZWdleEluZGV4KTtvLmxhc3RJbmRleD10aGlzLmxhc3RJbmRleDtsZXQgaT1vLmV4ZWMocyk7aWYodGhpcy5yZXN1bWluZ1NjYW5BdFNhbWVQb3NpdGlvbigpKWlmKGkmJmkuaW5kZXg9PT10aGlzLmxhc3RJbmRleCk7ZWxzZXtjb25zdCBvPXRoaXMuZ2V0TWF0Y2hlcigwKTtvLmxhc3RJbmRleD10aGlzLmxhc3RJbmRleCsxLGk9by5leGVjKHMpfXJldHVybiBpJiYodGhpcy5yZWdleEluZGV4Kz1pLnBvc2l0aW9uKzEsdGhpcy5yZWdleEluZGV4PT09dGhpcy5jb3VudCYmdGhpcy5jb25zaWRlckFsbCgpKSxpfX1pZihzLmNvbXBpbGVyRXh0ZW5zaW9uc3x8KHMuY29tcGlsZXJFeHRlbnNpb25zPVtdKSxzLmNvbnRhaW5zJiZzLmNvbnRhaW5zLmluY2x1ZGVzKCJzZWxmIikpdGhyb3cgbmV3IEVycm9yKCJFUlI6IGNvbnRhaW5zIGBzZWxmYCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgYSBsYW5ndWFnZS4gIFNlZSBkb2N1bWVudGF0aW9uLiIpO3JldHVybiBzLmNsYXNzTmFtZUFsaWFzZXM9aW5oZXJpdChzLmNsYXNzTmFtZUFsaWFzZXN8fHt9KSxmdW5jdGlvbiBjb21waWxlTW9kZShvLGkpe2NvbnN0IGE9bztpZihvLmlzQ29tcGlsZWQpcmV0dXJuIGE7W2NvbXBpbGVNYXRjaF0uZm9yRWFjaCgocz0+cyhvLGkpKSkscy5jb21waWxlckV4dGVuc2lvbnMuZm9yRWFjaCgocz0+cyhvLGkpKSksby5fX2JlZm9yZUJlZ2luPW51bGwsW2JlZ2luS2V5d29yZHMsY29tcGlsZUlsbGVnYWwsY29tcGlsZVJlbGV2YW5jZV0uZm9yRWFjaCgocz0+cyhvLGkpKSksby5pc0NvbXBpbGVkPSEwO2xldCB1PW51bGw7aWYoIm9iamVjdCI9PXR5cGVvZiBvLmtleXdvcmRzJiYodT1vLmtleXdvcmRzLiRwYXR0ZXJuLGRlbGV0ZSBvLmtleXdvcmRzLiRwYXR0ZXJuKSxvLmtleXdvcmRzJiYoby5rZXl3b3Jkcz1jb21waWxlS2V5d29yZHMoby5rZXl3b3JkcyxzLmNhc2VfaW5zZW5zaXRpdmUpKSxvLmxleGVtZXMmJnUpdGhyb3cgbmV3IEVycm9yKCJFUlI6IFByZWZlciBga2V5d29yZHMuJHBhdHRlcm5gIHRvIGBtb2RlLmxleGVtZXNgLCBCT1RIIGFyZSBub3QgYWxsb3dlZC4gKHNlZSBtb2RlIHJlZmVyZW5jZSkgIik7cmV0dXJuIHU9dXx8by5sZXhlbWVzfHwvXHcrLyxhLmtleXdvcmRQYXR0ZXJuUmU9bGFuZ1JlKHUsITApLGkmJihvLmJlZ2lufHwoby5iZWdpbj0vXEJ8XGIvKSxhLmJlZ2luUmU9bGFuZ1JlKG8uYmVnaW4pLG8uZW5kU2FtZUFzQmVnaW4mJihvLmVuZD1vLmJlZ2luKSxvLmVuZHx8by5lbmRzV2l0aFBhcmVudHx8KG8uZW5kPS9cQnxcYi8pLG8uZW5kJiYoYS5lbmRSZT1sYW5nUmUoby5lbmQpKSxhLnRlcm1pbmF0b3JFbmQ9c291cmNlKG8uZW5kKXx8IiIsby5lbmRzV2l0aFBhcmVudCYmaS50ZXJtaW5hdG9yRW5kJiYoYS50ZXJtaW5hdG9yRW5kKz0oby5lbmQ/InwiOiIiKStpLnRlcm1pbmF0b3JFbmQpKSxvLmlsbGVnYWwmJihhLmlsbGVnYWxSZT1sYW5nUmUoby5pbGxlZ2FsKSksby5jb250YWluc3x8KG8uY29udGFpbnM9W10pLG8uY29udGFpbnM9W10uY29uY2F0KC4uLm8uY29udGFpbnMubWFwKChmdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24gZXhwYW5kT3JDbG9uZU1vZGUocyl7cy52YXJpYW50cyYmIXMuY2FjaGVkVmFyaWFudHMmJihzLmNhY2hlZFZhcmlhbnRzPXMudmFyaWFudHMubWFwKChmdW5jdGlvbihvKXtyZXR1cm4gaW5oZXJpdChzLHt2YXJpYW50czpudWxsfSxvKX0pKSk7aWYocy5jYWNoZWRWYXJpYW50cylyZXR1cm4gcy5jYWNoZWRWYXJpYW50cztpZihkZXBlbmRlbmN5T25QYXJlbnQocykpcmV0dXJuIGluaGVyaXQocyx7c3RhcnRzOnMuc3RhcnRzP2luaGVyaXQocy5zdGFydHMpOm51bGx9KTtpZihPYmplY3QuaXNGcm96ZW4ocykpcmV0dXJuIGluaGVyaXQocyk7cmV0dXJuIHN9KCJzZWxmIj09PXM/bzpzKX0pKSksby5jb250YWlucy5mb3JFYWNoKChmdW5jdGlvbihzKXtjb21waWxlTW9kZShzLGEpfSkpLG8uc3RhcnRzJiZjb21waWxlTW9kZShvLnN0YXJ0cyxpKSxhLm1hdGNoZXI9ZnVuY3Rpb24gYnVpbGRNb2RlUmVnZXgocyl7Y29uc3Qgbz1uZXcgUmVzdW1hYmxlTXVsdGlSZWdleDtyZXR1cm4gcy5jb250YWlucy5mb3JFYWNoKChzPT5vLmFkZFJ1bGUocy5iZWdpbix7cnVsZTpzLHR5cGU6ImJlZ2luIn0pKSkscy50ZXJtaW5hdG9yRW5kJiZvLmFkZFJ1bGUocy50ZXJtaW5hdG9yRW5kLHt0eXBlOiJlbmQifSkscy5pbGxlZ2FsJiZvLmFkZFJ1bGUocy5pbGxlZ2FsLHt0eXBlOiJpbGxlZ2FsIn0pLG99KGEpLGF9KHMpfWZ1bmN0aW9uIGRlcGVuZGVuY3lPblBhcmVudChzKXtyZXR1cm4hIXMmJihzLmVuZHNXaXRoUGFyZW50fHxkZXBlbmRlbmN5T25QYXJlbnQocy5zdGFydHMpKX1mdW5jdGlvbiBCdWlsZFZ1ZVBsdWdpbihzKXtjb25zdCBvPXtwcm9wczpbImxhbmd1YWdlIiwiY29kZSIsImF1dG9kZXRlY3QiXSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2RldGVjdGVkTGFuZ3VhZ2U6IiIsdW5rbm93bkxhbmd1YWdlOiExfX0sY29tcHV0ZWQ6e2NsYXNzTmFtZSgpe3JldHVybiB0aGlzLnVua25vd25MYW5ndWFnZT8iIjoiaGxqcyAiK3RoaXMuZGV0ZWN0ZWRMYW5ndWFnZX0saGlnaGxpZ2h0ZWQoKXtpZighdGhpcy5hdXRvRGV0ZWN0JiYhcy5nZXRMYW5ndWFnZSh0aGlzLmxhbmd1YWdlKSlyZXR1cm4gY29uc29sZS53YXJuKGBUaGUgbGFuZ3VhZ2UgIiR7dGhpcy5sYW5ndWFnZX0iIHlvdSBzcGVjaWZpZWQgY291bGQgbm90IGJlIGZvdW5kLmApLHRoaXMudW5rbm93bkxhbmd1YWdlPSEwLGVzY2FwZUhUTUwodGhpcy5jb2RlKTtsZXQgbz17fTtyZXR1cm4gdGhpcy5hdXRvRGV0ZWN0PyhvPXMuaGlnaGxpZ2h0QXV0byh0aGlzLmNvZGUpLHRoaXMuZGV0ZWN0ZWRMYW5ndWFnZT1vLmxhbmd1YWdlKToobz1zLmhpZ2hsaWdodCh0aGlzLmxhbmd1YWdlLHRoaXMuY29kZSx0aGlzLmlnbm9yZUlsbGVnYWxzKSx0aGlzLmRldGVjdGVkTGFuZ3VhZ2U9dGhpcy5sYW5ndWFnZSksby52YWx1ZX0sYXV0b0RldGVjdCgpe3JldHVybiF0aGlzLmxhbmd1YWdlfHxmdW5jdGlvbiBoYXNWYWx1ZU9yRW1wdHlBdHRyaWJ1dGUocyl7cmV0dXJuIEJvb2xlYW4oc3x8IiI9PT1zKX0odGhpcy5hdXRvZGV0ZWN0KX0saWdub3JlSWxsZWdhbHM6KCk9PiEwfSxyZW5kZXIocyl7cmV0dXJuIHMoInByZSIse30sW3MoImNvZGUiLHtjbGFzczp0aGlzLmNsYXNzTmFtZSxkb21Qcm9wczp7aW5uZXJIVE1MOnRoaXMuaGlnaGxpZ2h0ZWR9fSldKX19O3JldHVybntDb21wb25lbnQ6byxWdWVQbHVnaW46e2luc3RhbGwocyl7cy5jb21wb25lbnQoImhpZ2hsaWdodGpzIixvKX19fX1jb25zdCB5ZT17ImFmdGVyOmhpZ2hsaWdodEVsZW1lbnQiOih7ZWw6cyxyZXN1bHQ6byx0ZXh0Oml9KT0+e2NvbnN0IGE9bm9kZVN0cmVhbShzKTtpZighYS5sZW5ndGgpcmV0dXJuO2NvbnN0IHU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dS5pbm5lckhUTUw9by52YWx1ZSxvLnZhbHVlPWZ1bmN0aW9uIG1lcmdlU3RyZWFtcyhzLG8saSl7bGV0IGE9MCx1PSIiO2NvbnN0IF89W107ZnVuY3Rpb24gc2VsZWN0U3RyZWFtKCl7cmV0dXJuIHMubGVuZ3RoJiZvLmxlbmd0aD9zWzBdLm9mZnNldCE9PW9bMF0ub2Zmc2V0P3NbMF0ub2Zmc2V0PG9bMF0ub2Zmc2V0P3M6bzoic3RhcnQiPT09b1swXS5ldmVudD9zOm86cy5sZW5ndGg/czpvfWZ1bmN0aW9uIG9wZW4ocyl7ZnVuY3Rpb24gYXR0cmlidXRlU3RyaW5nKHMpe3JldHVybiIgIitzLm5vZGVOYW1lKyc9IicrZXNjYXBlSFRNTChzLnZhbHVlKSsnIid9dSs9IjwiK3RhZyhzKStbXS5tYXAuY2FsbChzLmF0dHJpYnV0ZXMsYXR0cmlidXRlU3RyaW5nKS5qb2luKCIiKSsiPiJ9ZnVuY3Rpb24gY2xvc2Uocyl7dSs9IjwvIit0YWcocykrIj4ifWZ1bmN0aW9uIHJlbmRlcihzKXsoInN0YXJ0Ij09PXMuZXZlbnQ/b3BlbjpjbG9zZSkocy5ub2RlKX1mb3IoO3MubGVuZ3RofHxvLmxlbmd0aDspe2xldCBvPXNlbGVjdFN0cmVhbSgpO2lmKHUrPWVzY2FwZUhUTUwoaS5zdWJzdHJpbmcoYSxvWzBdLm9mZnNldCkpLGE9b1swXS5vZmZzZXQsbz09PXMpe18ucmV2ZXJzZSgpLmZvckVhY2goY2xvc2UpO2Rve3JlbmRlcihvLnNwbGljZSgwLDEpWzBdKSxvPXNlbGVjdFN0cmVhbSgpfXdoaWxlKG89PT1zJiZvLmxlbmd0aCYmb1swXS5vZmZzZXQ9PT1hKTtfLnJldmVyc2UoKS5mb3JFYWNoKG9wZW4pfWVsc2Uic3RhcnQiPT09b1swXS5ldmVudD9fLnB1c2gob1swXS5ub2RlKTpfLnBvcCgpLHJlbmRlcihvLnNwbGljZSgwLDEpWzBdKX1yZXR1cm4gdStlc2NhcGVIVE1MKGkuc3Vic3RyKGEpKX0oYSxub2RlU3RyZWFtKHUpLGkpfX07ZnVuY3Rpb24gdGFnKHMpe3JldHVybiBzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gbm9kZVN0cmVhbShzKXtjb25zdCBvPVtdO3JldHVybiBmdW5jdGlvbiBfbm9kZVN0cmVhbShzLGkpe2ZvcihsZXQgYT1zLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpMz09PWEubm9kZVR5cGU/aSs9YS5ub2RlVmFsdWUubGVuZ3RoOjE9PT1hLm5vZGVUeXBlJiYoby5wdXNoKHtldmVudDoic3RhcnQiLG9mZnNldDppLG5vZGU6YX0pLGk9X25vZGVTdHJlYW0oYSxpKSx0YWcoYSkubWF0Y2goL2JyfGhyfGltZ3xpbnB1dC8pfHxvLnB1c2goe2V2ZW50OiJzdG9wIixvZmZzZXQ6aSxub2RlOmF9KSk7cmV0dXJuIGl9KHMsMCksb31jb25zdCBiZT17fSxlcnJvcj1zPT57Y29uc29sZS5lcnJvcihzKX0sd2Fybj0ocywuLi5vKT0+e2NvbnNvbGUubG9nKGBXQVJOOiAke3N9YCwuLi5vKX0sZGVwcmVjYXRlZD0ocyxvKT0+e2JlW2Ake3N9LyR7b31gXXx8KGNvbnNvbGUubG9nKGBEZXByZWNhdGVkIGFzIG9mICR7c30uICR7b31gKSxiZVtgJHtzfS8ke299YF09ITApfSxTZT1lc2NhcGVIVE1MLF9lPWluaGVyaXQsd2U9U3ltYm9sKCJub21hdGNoIik7dmFyIHhlPWZ1bmN0aW9uKHMpe2NvbnN0IGk9T2JqZWN0LmNyZWF0ZShudWxsKSxhPU9iamVjdC5jcmVhdGUobnVsbCksdT1bXTtsZXQgXz0hMDtjb25zdCB3PS8oXig8W14+XSs+fFx0fCkrfFxuKS9nbSx4PSJDb3VsZCBub3QgZmluZCB0aGUgbGFuZ3VhZ2UgJ3t9JywgZGlkIHlvdSBmb3JnZXQgdG8gbG9hZC9pbmNsdWRlIGEgbGFuZ3VhZ2UgbW9kdWxlPyIsQz17ZGlzYWJsZUF1dG9kZXRlY3Q6ITAsbmFtZToiUGxhaW4gdGV4dCIsY29udGFpbnM6W119O2xldCBqPXtub0hpZ2hsaWdodFJlOi9eKG5vLT9oaWdobGlnaHQpJC9pLGxhbmd1YWdlRGV0ZWN0UmU6L1xibGFuZyg/OnVhZ2UpPy0oW1x3LV0rKVxiL2ksY2xhc3NQcmVmaXg6ImhsanMtIix0YWJSZXBsYWNlOm51bGwsdXNlQlI6ITEsbGFuZ3VhZ2VzOm51bGwsX19lbWl0dGVyOlRva2VuVHJlZUVtaXR0ZXJ9O2Z1bmN0aW9uIHNob3VsZE5vdEhpZ2hsaWdodChzKXtyZXR1cm4gai5ub0hpZ2hsaWdodFJlLnRlc3Qocyl9ZnVuY3Rpb24gaGlnaGxpZ2h0KHMsbyxpLGEpe2xldCB1PSIiLF89IiI7Im9iamVjdCI9PXR5cGVvZiBvPyh1PXMsaT1vLmlnbm9yZUlsbGVnYWxzLF89by5sYW5ndWFnZSxhPXZvaWQgMCk6KGRlcHJlY2F0ZWQoIjEwLjcuMCIsImhpZ2hsaWdodChsYW5nLCBjb2RlLCAuLi5hcmdzKSBoYXMgYmVlbiBkZXByZWNhdGVkLiIpLGRlcHJlY2F0ZWQoIjEwLjcuMCIsIlBsZWFzZSB1c2UgaGlnaGxpZ2h0KGNvZGUsIG9wdGlvbnMpIGluc3RlYWQuXG5odHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8yMjc3IiksXz1zLHU9byk7Y29uc3Qgdz17Y29kZTp1LGxhbmd1YWdlOl99O2ZpcmUoImJlZm9yZTpoaWdobGlnaHQiLHcpO2NvbnN0IHg9dy5yZXN1bHQ/dy5yZXN1bHQ6X2hpZ2hsaWdodCh3Lmxhbmd1YWdlLHcuY29kZSxpLGEpO3JldHVybiB4LmNvZGU9dy5jb2RlLGZpcmUoImFmdGVyOmhpZ2hsaWdodCIseCkseH1mdW5jdGlvbiBfaGlnaGxpZ2h0KHMsbyxhLHcpe2Z1bmN0aW9uIGtleXdvcmREYXRhKHMsbyl7Y29uc3QgaT1MLmNhc2VfaW5zZW5zaXRpdmU/b1swXS50b0xvd2VyQ2FzZSgpOm9bMF07cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLmtleXdvcmRzLGkpJiZzLmtleXdvcmRzW2ldfWZ1bmN0aW9uIHByb2Nlc3NCdWZmZXIoKXtudWxsIT1VLnN1Ykxhbmd1YWdlP2Z1bmN0aW9uIHByb2Nlc3NTdWJMYW5ndWFnZSgpe2lmKCIiPT09WSlyZXR1cm47bGV0IHM9bnVsbDtpZigic3RyaW5nIj09dHlwZW9mIFUuc3ViTGFuZ3VhZ2Upe2lmKCFpW1Uuc3ViTGFuZ3VhZ2VdKXJldHVybiB2b2lkIHouYWRkVGV4dChZKTtzPV9oaWdobGlnaHQoVS5zdWJMYW5ndWFnZSxZLCEwLFZbVS5zdWJMYW5ndWFnZV0pLFZbVS5zdWJMYW5ndWFnZV09cy50b3B9ZWxzZSBzPWhpZ2hsaWdodEF1dG8oWSxVLnN1Ykxhbmd1YWdlLmxlbmd0aD9VLnN1Ykxhbmd1YWdlOm51bGwpO1UucmVsZXZhbmNlPjAmJihaKz1zLnJlbGV2YW5jZSksei5hZGRTdWJsYW5ndWFnZShzLmVtaXR0ZXIscy5sYW5ndWFnZSl9KCk6ZnVuY3Rpb24gcHJvY2Vzc0tleXdvcmRzKCl7aWYoIVUua2V5d29yZHMpcmV0dXJuIHZvaWQgei5hZGRUZXh0KFkpO2xldCBzPTA7VS5rZXl3b3JkUGF0dGVyblJlLmxhc3RJbmRleD0wO2xldCBvPVUua2V5d29yZFBhdHRlcm5SZS5leGVjKFkpLGk9IiI7Zm9yKDtvOyl7aSs9WS5zdWJzdHJpbmcocyxvLmluZGV4KTtjb25zdCBhPWtleXdvcmREYXRhKFUsbyk7aWYoYSl7Y29uc3Rbcyx1XT1hO2lmKHouYWRkVGV4dChpKSxpPSIiLForPXUscy5zdGFydHNXaXRoKCJfIikpaSs9b1swXTtlbHNle2NvbnN0IGk9TC5jbGFzc05hbWVBbGlhc2VzW3NdfHxzO3ouYWRkS2V5d29yZChvWzBdLGkpfX1lbHNlIGkrPW9bMF07cz1VLmtleXdvcmRQYXR0ZXJuUmUubGFzdEluZGV4LG89VS5rZXl3b3JkUGF0dGVyblJlLmV4ZWMoWSl9aSs9WS5zdWJzdHIocyksei5hZGRUZXh0KGkpfSgpLFk9IiJ9ZnVuY3Rpb24gc3RhcnROZXdNb2RlKHMpe3JldHVybiBzLmNsYXNzTmFtZSYmei5vcGVuTm9kZShMLmNsYXNzTmFtZUFsaWFzZXNbcy5jbGFzc05hbWVdfHxzLmNsYXNzTmFtZSksVT1PYmplY3QuY3JlYXRlKHMse3BhcmVudDp7dmFsdWU6VX19KSxVfWZ1bmN0aW9uIGVuZE9mTW9kZShzLG8saSl7bGV0IGE9ZnVuY3Rpb24gc3RhcnRzV2l0aChzLG8pe2NvbnN0IGk9cyYmcy5leGVjKG8pO3JldHVybiBpJiYwPT09aS5pbmRleH0ocy5lbmRSZSxpKTtpZihhKXtpZihzWyJvbjplbmQiXSl7Y29uc3QgaT1uZXcgUmVzcG9uc2Uocyk7c1sib246ZW5kIl0obyxpKSxpLmlzTWF0Y2hJZ25vcmVkJiYoYT0hMSl9aWYoYSl7Zm9yKDtzLmVuZHNQYXJlbnQmJnMucGFyZW50OylzPXMucGFyZW50O3JldHVybiBzfX1pZihzLmVuZHNXaXRoUGFyZW50KXJldHVybiBlbmRPZk1vZGUocy5wYXJlbnQsbyxpKX1mdW5jdGlvbiBkb0lnbm9yZShzKXtyZXR1cm4gMD09PVUubWF0Y2hlci5yZWdleEluZGV4PyhZKz1zWzBdLDEpOihhZT0hMCwwKX1mdW5jdGlvbiBkb0JlZ2luTWF0Y2gocyl7Y29uc3Qgbz1zWzBdLGk9cy5ydWxlLGE9bmV3IFJlc3BvbnNlKGkpLHU9W2kuX19iZWZvcmVCZWdpbixpWyJvbjpiZWdpbiJdXTtmb3IoY29uc3QgaSBvZiB1KWlmKGkmJihpKHMsYSksYS5pc01hdGNoSWdub3JlZCkpcmV0dXJuIGRvSWdub3JlKG8pO3JldHVybiBpJiZpLmVuZFNhbWVBc0JlZ2luJiYoaS5lbmRSZT1mdW5jdGlvbiBlc2NhcGUocyl7cmV0dXJuIG5ldyBSZWdFeHAocy5yZXBsYWNlKC9bLS9cXF4kKis/LigpfFtcXXt9XS9nLCJcXCQmIiksIm0iKX0obykpLGkuc2tpcD9ZKz1vOihpLmV4Y2x1ZGVCZWdpbiYmKFkrPW8pLHByb2Nlc3NCdWZmZXIoKSxpLnJldHVybkJlZ2lufHxpLmV4Y2x1ZGVCZWdpbnx8KFk9bykpLHN0YXJ0TmV3TW9kZShpKSxpLnJldHVybkJlZ2luPzA6by5sZW5ndGh9ZnVuY3Rpb24gZG9FbmRNYXRjaChzKXtjb25zdCBpPXNbMF0sYT1vLnN1YnN0cihzLmluZGV4KSx1PWVuZE9mTW9kZShVLHMsYSk7aWYoIXUpcmV0dXJuIHdlO2NvbnN0IF89VTtfLnNraXA/WSs9aTooXy5yZXR1cm5FbmR8fF8uZXhjbHVkZUVuZHx8KFkrPWkpLHByb2Nlc3NCdWZmZXIoKSxfLmV4Y2x1ZGVFbmQmJihZPWkpKTtkb3tVLmNsYXNzTmFtZSYmei5jbG9zZU5vZGUoKSxVLnNraXB8fFUuc3ViTGFuZ3VhZ2V8fChaKz1VLnJlbGV2YW5jZSksVT1VLnBhcmVudH13aGlsZShVIT09dS5wYXJlbnQpO3JldHVybiB1LnN0YXJ0cyYmKHUuZW5kU2FtZUFzQmVnaW4mJih1LnN0YXJ0cy5lbmRSZT11LmVuZFJlKSxzdGFydE5ld01vZGUodS5zdGFydHMpKSxfLnJldHVybkVuZD8wOmkubGVuZ3RofWxldCBDPXt9O2Z1bmN0aW9uIHByb2Nlc3NMZXhlbWUoaSx1KXtjb25zdCB3PXUmJnVbMF07aWYoWSs9aSxudWxsPT13KXJldHVybiBwcm9jZXNzQnVmZmVyKCksMDtpZigiYmVnaW4iPT09Qy50eXBlJiYiZW5kIj09PXUudHlwZSYmQy5pbmRleD09PXUuaW5kZXgmJiIiPT09dyl7aWYoWSs9by5zbGljZSh1LmluZGV4LHUuaW5kZXgrMSksIV8pe2NvbnN0IG89bmV3IEVycm9yKCIwIHdpZHRoIG1hdGNoIHJlZ2V4Iik7dGhyb3cgby5sYW5ndWFnZU5hbWU9cyxvLmJhZFJ1bGU9Qy5ydWxlLG99cmV0dXJuIDF9aWYoQz11LCJiZWdpbiI9PT11LnR5cGUpcmV0dXJuIGRvQmVnaW5NYXRjaCh1KTtpZigiaWxsZWdhbCI9PT11LnR5cGUmJiFhKXtjb25zdCBzPW5ldyBFcnJvcignSWxsZWdhbCBsZXhlbWUgIicrdysnIiBmb3IgbW9kZSAiJysoVS5jbGFzc05hbWV8fCI8dW5uYW1lZD4iKSsnIicpO3Rocm93IHMubW9kZT1VLHN9aWYoImVuZCI9PT11LnR5cGUpe2NvbnN0IHM9ZG9FbmRNYXRjaCh1KTtpZihzIT09d2UpcmV0dXJuIHN9aWYoImlsbGVnYWwiPT09dS50eXBlJiYiIj09PXcpcmV0dXJuIDE7aWYoaWU+MWU1JiZpZT4zKnUuaW5kZXgpe3Rocm93IG5ldyBFcnJvcigicG90ZW50aWFsIGluZmluaXRlIGxvb3AsIHdheSBtb3JlIGl0ZXJhdGlvbnMgdGhhbiBtYXRjaGVzIil9cmV0dXJuIFkrPXcsdy5sZW5ndGh9Y29uc3QgTD1nZXRMYW5ndWFnZShzKTtpZighTCl0aHJvdyBlcnJvcih4LnJlcGxhY2UoInt9IixzKSksbmV3IEVycm9yKCdVbmtub3duIGxhbmd1YWdlOiAiJytzKyciJyk7Y29uc3QgQj1jb21waWxlTGFuZ3VhZ2UoTCx7cGx1Z2luczp1fSk7bGV0ICQ9IiIsVT13fHxCO2NvbnN0IFY9e30sej1uZXcgai5fX2VtaXR0ZXIoaik7IWZ1bmN0aW9uIHByb2Nlc3NDb250aW51YXRpb25zKCl7Y29uc3Qgcz1bXTtmb3IobGV0IG89VTtvIT09TDtvPW8ucGFyZW50KW8uY2xhc3NOYW1lJiZzLnVuc2hpZnQoby5jbGFzc05hbWUpO3MuZm9yRWFjaCgocz0+ei5vcGVuTm9kZShzKSkpfSgpO2xldCBZPSIiLFo9MCxlZT0wLGllPTAsYWU9ITE7dHJ5e2ZvcihVLm1hdGNoZXIuY29uc2lkZXJBbGwoKTs7KXtpZSsrLGFlP2FlPSExOlUubWF0Y2hlci5jb25zaWRlckFsbCgpLFUubWF0Y2hlci5sYXN0SW5kZXg9ZWU7Y29uc3Qgcz1VLm1hdGNoZXIuZXhlYyhvKTtpZighcylicmVhaztjb25zdCBpPXByb2Nlc3NMZXhlbWUoby5zdWJzdHJpbmcoZWUscy5pbmRleCkscyk7ZWU9cy5pbmRleCtpfXJldHVybiBwcm9jZXNzTGV4ZW1lKG8uc3Vic3RyKGVlKSksei5jbG9zZUFsbE5vZGVzKCksei5maW5hbGl6ZSgpLCQ9ei50b0hUTUwoKSx7cmVsZXZhbmNlOk1hdGguZmxvb3IoWiksdmFsdWU6JCxsYW5ndWFnZTpzLGlsbGVnYWw6ITEsZW1pdHRlcjp6LHRvcDpVfX1jYXRjaChpKXtpZihpLm1lc3NhZ2UmJmkubWVzc2FnZS5pbmNsdWRlcygiSWxsZWdhbCIpKXJldHVybntpbGxlZ2FsOiEwLGlsbGVnYWxCeTp7bXNnOmkubWVzc2FnZSxjb250ZXh0Om8uc2xpY2UoZWUtMTAwLGVlKzEwMCksbW9kZTppLm1vZGV9LHNvZmFyOiQscmVsZXZhbmNlOjAsdmFsdWU6U2UobyksZW1pdHRlcjp6fTtpZihfKXJldHVybntpbGxlZ2FsOiExLHJlbGV2YW5jZTowLHZhbHVlOlNlKG8pLGVtaXR0ZXI6eixsYW5ndWFnZTpzLHRvcDpVLGVycm9yUmFpc2VkOml9O3Rocm93IGl9fWZ1bmN0aW9uIGhpZ2hsaWdodEF1dG8ocyxvKXtvPW98fGoubGFuZ3VhZ2VzfHxPYmplY3Qua2V5cyhpKTtjb25zdCBhPWZ1bmN0aW9uIGp1c3RUZXh0SGlnaGxpZ2h0UmVzdWx0KHMpe2NvbnN0IG89e3JlbGV2YW5jZTowLGVtaXR0ZXI6bmV3IGouX19lbWl0dGVyKGopLHZhbHVlOlNlKHMpLGlsbGVnYWw6ITEsdG9wOkN9O3JldHVybiBvLmVtaXR0ZXIuYWRkVGV4dChzKSxvfShzKSx1PW8uZmlsdGVyKGdldExhbmd1YWdlKS5maWx0ZXIoYXV0b0RldGVjdGlvbikubWFwKChvPT5faGlnaGxpZ2h0KG8scywhMSkpKTt1LnVuc2hpZnQoYSk7Y29uc3QgXz11LnNvcnQoKChzLG8pPT57aWYocy5yZWxldmFuY2UhPT1vLnJlbGV2YW5jZSlyZXR1cm4gby5yZWxldmFuY2Utcy5yZWxldmFuY2U7aWYocy5sYW5ndWFnZSYmby5sYW5ndWFnZSl7aWYoZ2V0TGFuZ3VhZ2Uocy5sYW5ndWFnZSkuc3VwZXJzZXRPZj09PW8ubGFuZ3VhZ2UpcmV0dXJuIDE7aWYoZ2V0TGFuZ3VhZ2Uoby5sYW5ndWFnZSkuc3VwZXJzZXRPZj09PXMubGFuZ3VhZ2UpcmV0dXJuLTF9cmV0dXJuIDB9KSksW3cseF09XyxMPXc7cmV0dXJuIEwuc2Vjb25kX2Jlc3Q9eCxMfWNvbnN0IEw9eyJiZWZvcmU6aGlnaGxpZ2h0RWxlbWVudCI6KHtlbDpzfSk9PntqLnVzZUJSJiYocy5pbm5lckhUTUw9cy5pbm5lckhUTUwucmVwbGFjZSgvXG4vZywiIikucmVwbGFjZSgvPGJyWyAvXSo+L2csIlxuIikpfSwiYWZ0ZXI6aGlnaGxpZ2h0RWxlbWVudCI6KHtyZXN1bHQ6c30pPT57ai51c2VCUiYmKHMudmFsdWU9cy52YWx1ZS5yZXBsYWNlKC9cbi9nLCI8YnI+IikpfX0sQj0vXig8W14+XSs+fFx0KSsvZ20sJD17ImFmdGVyOmhpZ2hsaWdodEVsZW1lbnQiOih7cmVzdWx0OnN9KT0+e2oudGFiUmVwbGFjZSYmKHMudmFsdWU9cy52YWx1ZS5yZXBsYWNlKEIsKHM9PnMucmVwbGFjZSgvXHQvZyxqLnRhYlJlcGxhY2UpKSkpfX07ZnVuY3Rpb24gaGlnaGxpZ2h0RWxlbWVudChzKXtsZXQgbz1udWxsO2NvbnN0IGk9ZnVuY3Rpb24gYmxvY2tMYW5ndWFnZShzKXtsZXQgbz1zLmNsYXNzTmFtZSsiICI7bys9cy5wYXJlbnROb2RlP3MucGFyZW50Tm9kZS5jbGFzc05hbWU6IiI7Y29uc3QgaT1qLmxhbmd1YWdlRGV0ZWN0UmUuZXhlYyhvKTtpZihpKXtjb25zdCBvPWdldExhbmd1YWdlKGlbMV0pO3JldHVybiBvfHwod2Fybih4LnJlcGxhY2UoInt9IixpWzFdKSksd2FybigiRmFsbGluZyBiYWNrIHRvIG5vLWhpZ2hsaWdodCBtb2RlIGZvciB0aGlzIGJsb2NrLiIscykpLG8/aVsxXToibm8taGlnaGxpZ2h0In1yZXR1cm4gby5zcGxpdCgvXHMrLykuZmluZCgocz0+c2hvdWxkTm90SGlnaGxpZ2h0KHMpfHxnZXRMYW5ndWFnZShzKSkpfShzKTtpZihzaG91bGROb3RIaWdobGlnaHQoaSkpcmV0dXJuO2ZpcmUoImJlZm9yZTpoaWdobGlnaHRFbGVtZW50Iix7ZWw6cyxsYW5ndWFnZTppfSksbz1zO2NvbnN0IHU9by50ZXh0Q29udGVudCxfPWk/aGlnaGxpZ2h0KHUse2xhbmd1YWdlOmksaWdub3JlSWxsZWdhbHM6ITB9KTpoaWdobGlnaHRBdXRvKHUpO2ZpcmUoImFmdGVyOmhpZ2hsaWdodEVsZW1lbnQiLHtlbDpzLHJlc3VsdDpfLHRleHQ6dX0pLHMuaW5uZXJIVE1MPV8udmFsdWUsZnVuY3Rpb24gdXBkYXRlQ2xhc3NOYW1lKHMsbyxpKXtjb25zdCB1PW8/YVtvXTppO3MuY2xhc3NMaXN0LmFkZCgiaGxqcyIpLHUmJnMuY2xhc3NMaXN0LmFkZCh1KX0ocyxpLF8ubGFuZ3VhZ2UpLHMucmVzdWx0PXtsYW5ndWFnZTpfLmxhbmd1YWdlLHJlOl8ucmVsZXZhbmNlLHJlbGF2YW5jZTpfLnJlbGV2YW5jZX0sXy5zZWNvbmRfYmVzdCYmKHMuc2Vjb25kX2Jlc3Q9e2xhbmd1YWdlOl8uc2Vjb25kX2Jlc3QubGFuZ3VhZ2UscmU6Xy5zZWNvbmRfYmVzdC5yZWxldmFuY2UscmVsYXZhbmNlOl8uc2Vjb25kX2Jlc3QucmVsZXZhbmNlfSl9Y29uc3QgaW5pdEhpZ2hsaWdodGluZz0oKT0+e2lmKGluaXRIaWdobGlnaHRpbmcuY2FsbGVkKXJldHVybjtpbml0SGlnaGxpZ2h0aW5nLmNhbGxlZD0hMCxkZXByZWNhdGVkKCIxMC42LjAiLCJpbml0SGlnaGxpZ2h0aW5nKCkgaXMgZGVwcmVjYXRlZC4gIFVzZSBoaWdobGlnaHRBbGwoKSBpbnN0ZWFkLiIpO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInByZSBjb2RlIikuZm9yRWFjaChoaWdobGlnaHRFbGVtZW50KX07bGV0IFU9ITE7ZnVuY3Rpb24gaGlnaGxpZ2h0QWxsKCl7aWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSlyZXR1cm4gdm9pZChVPSEwKTtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJwcmUgY29kZSIpLmZvckVhY2goaGlnaGxpZ2h0RWxlbWVudCl9ZnVuY3Rpb24gZ2V0TGFuZ3VhZ2Uocyl7cmV0dXJuIHM9KHN8fCIiKS50b0xvd2VyQ2FzZSgpLGlbc118fGlbYVtzXV19ZnVuY3Rpb24gcmVnaXN0ZXJBbGlhc2VzKHMse2xhbmd1YWdlTmFtZTpvfSl7InN0cmluZyI9PXR5cGVvZiBzJiYocz1bc10pLHMuZm9yRWFjaCgocz0+e2Fbcy50b0xvd2VyQ2FzZSgpXT1vfSkpfWZ1bmN0aW9uIGF1dG9EZXRlY3Rpb24ocyl7Y29uc3Qgbz1nZXRMYW5ndWFnZShzKTtyZXR1cm4gbyYmIW8uZGlzYWJsZUF1dG9kZXRlY3R9ZnVuY3Rpb24gZmlyZShzLG8pe2NvbnN0IGk9czt1LmZvckVhY2goKGZ1bmN0aW9uKHMpe3NbaV0mJnNbaV0obyl9KSl9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyJiZ3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsKGZ1bmN0aW9uIGJvb3QoKXtVJiZoaWdobGlnaHRBbGwoKX0pLCExKSxPYmplY3QuYXNzaWduKHMse2hpZ2hsaWdodCxoaWdobGlnaHRBdXRvLGhpZ2hsaWdodEFsbCxmaXhNYXJrdXA6ZnVuY3Rpb24gZGVwcmVjYXRlRml4TWFya3VwKHMpe3JldHVybiBkZXByZWNhdGVkKCIxMC4yLjAiLCJmaXhNYXJrdXAgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGluIHYxMS4wIiksZGVwcmVjYXRlZCgiMTAuMi4wIiwiUGxlYXNlIHNlZSBodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8yNTM0IiksZnVuY3Rpb24gZml4TWFya3VwKHMpe3JldHVybiBqLnRhYlJlcGxhY2V8fGoudXNlQlI/cy5yZXBsYWNlKHcsKHM9PiJcbiI9PT1zP2oudXNlQlI/Ijxicj4iOnM6ai50YWJSZXBsYWNlP3MucmVwbGFjZSgvXHQvZyxqLnRhYlJlcGxhY2UpOnMpKTpzfShzKX0saGlnaGxpZ2h0RWxlbWVudCxoaWdobGlnaHRCbG9jazpmdW5jdGlvbiBkZXByZWNhdGVIaWdobGlnaHRCbG9jayhzKXtyZXR1cm4gZGVwcmVjYXRlZCgiMTAuNy4wIiwiaGlnaGxpZ2h0QmxvY2sgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGluIHYxMi4wIiksZGVwcmVjYXRlZCgiMTAuNy4wIiwiUGxlYXNlIHVzZSBoaWdobGlnaHRFbGVtZW50IG5vdy4iKSxoaWdobGlnaHRFbGVtZW50KHMpfSxjb25maWd1cmU6ZnVuY3Rpb24gY29uZmlndXJlKHMpe3MudXNlQlImJihkZXByZWNhdGVkKCIxMC4zLjAiLCIndXNlQlInIHdpbGwgYmUgcmVtb3ZlZCBlbnRpcmVseSBpbiB2MTEuMCIpLGRlcHJlY2F0ZWQoIjEwLjMuMCIsIlBsZWFzZSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMjU1OSIpKSxqPV9lKGoscyl9LGluaXRIaWdobGlnaHRpbmcsaW5pdEhpZ2hsaWdodGluZ09uTG9hZDpmdW5jdGlvbiBpbml0SGlnaGxpZ2h0aW5nT25Mb2FkKCl7ZGVwcmVjYXRlZCgiMTAuNi4wIiwiaW5pdEhpZ2hsaWdodGluZ09uTG9hZCgpIGlzIGRlcHJlY2F0ZWQuICBVc2UgaGlnaGxpZ2h0QWxsKCkgaW5zdGVhZC4iKSxVPSEwfSxyZWdpc3Rlckxhbmd1YWdlOmZ1bmN0aW9uIHJlZ2lzdGVyTGFuZ3VhZ2UobyxhKXtsZXQgdT1udWxsO3RyeXt1PWEocyl9Y2F0Y2gocyl7aWYoZXJyb3IoIkxhbmd1YWdlIGRlZmluaXRpb24gZm9yICd7fScgY291bGQgbm90IGJlIHJlZ2lzdGVyZWQuIi5yZXBsYWNlKCJ7fSIsbykpLCFfKXRocm93IHM7ZXJyb3IocyksdT1DfXUubmFtZXx8KHUubmFtZT1vKSxpW29dPXUsdS5yYXdEZWZpbml0aW9uPWEuYmluZChudWxsLHMpLHUuYWxpYXNlcyYmcmVnaXN0ZXJBbGlhc2VzKHUuYWxpYXNlcyx7bGFuZ3VhZ2VOYW1lOm99KX0sdW5yZWdpc3Rlckxhbmd1YWdlOmZ1bmN0aW9uIHVucmVnaXN0ZXJMYW5ndWFnZShzKXtkZWxldGUgaVtzXTtmb3IoY29uc3QgbyBvZiBPYmplY3Qua2V5cyhhKSlhW29dPT09cyYmZGVsZXRlIGFbb119LGxpc3RMYW5ndWFnZXM6ZnVuY3Rpb24gbGlzdExhbmd1YWdlcygpe3JldHVybiBPYmplY3Qua2V5cyhpKX0sZ2V0TGFuZ3VhZ2UscmVnaXN0ZXJBbGlhc2VzLHJlcXVpcmVMYW5ndWFnZTpmdW5jdGlvbiByZXF1aXJlTGFuZ3VhZ2Uocyl7ZGVwcmVjYXRlZCgiMTAuNC4wIiwicmVxdWlyZUxhbmd1YWdlIHdpbGwgYmUgcmVtb3ZlZCBlbnRpcmVseSBpbiB2MTEuIiksZGVwcmVjYXRlZCgiMTAuNC4wIiwiUGxlYXNlIHNlZSBodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL3B1bGwvMjg0NCIpO2NvbnN0IG89Z2V0TGFuZ3VhZ2Uocyk7aWYobylyZXR1cm4gbzt0aHJvdyBuZXcgRXJyb3IoIlRoZSAne30nIGxhbmd1YWdlIGlzIHJlcXVpcmVkLCBidXQgbm90IGxvYWRlZC4iLnJlcGxhY2UoInt9IixzKSl9LGF1dG9EZXRlY3Rpb24saW5oZXJpdDpfZSxhZGRQbHVnaW46ZnVuY3Rpb24gYWRkUGx1Z2luKHMpeyFmdW5jdGlvbiB1cGdyYWRlUGx1Z2luQVBJKHMpe3NbImJlZm9yZTpoaWdobGlnaHRCbG9jayJdJiYhc1siYmVmb3JlOmhpZ2hsaWdodEVsZW1lbnQiXSYmKHNbImJlZm9yZTpoaWdobGlnaHRFbGVtZW50Il09bz0+e3NbImJlZm9yZTpoaWdobGlnaHRCbG9jayJdKE9iamVjdC5hc3NpZ24oe2Jsb2NrOm8uZWx9LG8pKX0pLHNbImFmdGVyOmhpZ2hsaWdodEJsb2NrIl0mJiFzWyJhZnRlcjpoaWdobGlnaHRFbGVtZW50Il0mJihzWyJhZnRlcjpoaWdobGlnaHRFbGVtZW50Il09bz0+e3NbImFmdGVyOmhpZ2hsaWdodEJsb2NrIl0oT2JqZWN0LmFzc2lnbih7YmxvY2s6by5lbH0sbykpfSl9KHMpLHUucHVzaChzKX0sdnVlUGx1Z2luOkJ1aWxkVnVlUGx1Z2luKHMpLlZ1ZVBsdWdpbn0pLHMuZGVidWdNb2RlPWZ1bmN0aW9uKCl7Xz0hMX0scy5zYWZlTW9kZT1mdW5jdGlvbigpe189ITB9LHMudmVyc2lvblN0cmluZz0iMTAuNy4zIjtmb3IoY29uc3QgcyBpbiBkZSkib2JqZWN0Ij09dHlwZW9mIGRlW3NdJiZvKGRlW3NdKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihzLGRlKSxzLmFkZFBsdWdpbihMKSxzLmFkZFBsdWdpbih5ZSkscy5hZGRQbHVnaW4oJCksc30oe30pO3MuZXhwb3J0cz14ZX0sMzUzNDQocyl7ZnVuY3Rpb24gY29uY2F0KC4uLnMpe3JldHVybiBzLm1hcCgocz0+ZnVuY3Rpb24gc291cmNlKHMpe3JldHVybiBzPyJzdHJpbmciPT10eXBlb2Ygcz9zOnMuc291cmNlOm51bGx9KHMpKSkuam9pbigiIil9cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2gocyl7Y29uc3Qgbz17fSxpPXtiZWdpbjovXCRcey8sZW5kOi9cfS8sY29udGFpbnM6WyJzZWxmIix7YmVnaW46LzotLyxjb250YWluczpbb119XX07T2JqZWN0LmFzc2lnbihvLHtjbGFzc05hbWU6InZhcmlhYmxlIix2YXJpYW50czpbe2JlZ2luOmNvbmNhdCgvXCRbXHdcZCNAXVtcd1xkX10qLywiKD8hW1xcd1xcZF0pKD8hWyRdKSIpfSxpXX0pO2NvbnN0IGE9e2NsYXNzTmFtZToic3Vic3QiLGJlZ2luOi9cJFwoLyxlbmQ6L1wpLyxjb250YWluczpbcy5CQUNLU0xBU0hfRVNDQVBFXX0sdT17YmVnaW46Lzw8LT9ccyooPz1cdyspLyxzdGFydHM6e2NvbnRhaW5zOltzLkVORF9TQU1FX0FTX0JFR0lOKHtiZWdpbjovKFx3KykvLGVuZDovKFx3KykvLGNsYXNzTmFtZToic3RyaW5nIn0pXX19LF89e2NsYXNzTmFtZToic3RyaW5nIixiZWdpbjovIi8sZW5kOi8iLyxjb250YWluczpbcy5CQUNLU0xBU0hfRVNDQVBFLG8sYV19O2EuY29udGFpbnMucHVzaChfKTtjb25zdCB3PXtiZWdpbjovXCRcKFwoLyxlbmQ6L1wpXCkvLGNvbnRhaW5zOlt7YmVnaW46L1xkKyNbMC05YS1mXSsvLGNsYXNzTmFtZToibnVtYmVyIn0scy5OVU1CRVJfTU9ERSxvXX0seD1zLlNIRUJBTkcoe2JpbmFyeTpgKCR7WyJmaXNoIiwiYmFzaCIsInpzaCIsInNoIiwiY3NoIiwia3NoIiwidGNzaCIsImRhc2giLCJzY3NoIl0uam9pbigifCIpfSlgLHJlbGV2YW5jZToxMH0pLEM9e2NsYXNzTmFtZToiZnVuY3Rpb24iLGJlZ2luOi9cd1tcd1xkX10qXHMqXChccypcKVxzKlx7LyxyZXR1cm5CZWdpbjohMCxjb250YWluczpbcy5pbmhlcml0KHMuVElUTEVfTU9ERSx7YmVnaW46L1x3W1x3XGRfXSovfSldLHJlbGV2YW5jZTowfTtyZXR1cm57bmFtZToiQmFzaCIsYWxpYXNlczpbInNoIiwienNoIl0sa2V5d29yZHM6eyRwYXR0ZXJuOi9cYlthLXouXy1dK1xiLyxrZXl3b3JkOiJpZiB0aGVuIGVsc2UgZWxpZiBmaSBmb3Igd2hpbGUgaW4gZG8gZG9uZSBjYXNlIGVzYWMgZnVuY3Rpb24iLGxpdGVyYWw6InRydWUgZmFsc2UiLGJ1aWx0X2luOiJicmVhayBjZCBjb250aW51ZSBldmFsIGV4ZWMgZXhpdCBleHBvcnQgZ2V0b3B0cyBoYXNoIHB3ZCByZWFkb25seSByZXR1cm4gc2hpZnQgdGVzdCB0aW1lcyB0cmFwIHVtYXNrIHVuc2V0IGFsaWFzIGJpbmQgYnVpbHRpbiBjYWxsZXIgY29tbWFuZCBkZWNsYXJlIGVjaG8gZW5hYmxlIGhlbHAgbGV0IGxvY2FsIGxvZ291dCBtYXBmaWxlIHByaW50ZiByZWFkIHJlYWRhcnJheSBzb3VyY2UgdHlwZSB0eXBlc2V0IHVsaW1pdCB1bmFsaWFzIHNldCBzaG9wdCBhdXRvbG9hZCBiZyBiaW5ka2V5IGJ5ZSBjYXAgY2hkaXIgY2xvbmUgY29tcGFyZ3VtZW50cyBjb21wY2FsbCBjb21wY3RsIGNvbXBkZXNjcmliZSBjb21wZmlsZXMgY29tcGdyb3VwcyBjb21wcXVvdGUgY29tcHRhZ3MgY29tcHRyeSBjb21wdmFsdWVzIGRpcnMgZGlzYWJsZSBkaXNvd24gZWNob3RjIGVjaG90aSBlbXVsYXRlIGZjIGZnIGZsb2F0IGZ1bmN0aW9ucyBnZXRjYXAgZ2V0bG4gaGlzdG9yeSBpbnRlZ2VyIGpvYnMga2lsbCBsaW1pdCBsb2cgbm9nbG9iIHBvcGQgcHJpbnQgcHVzaGQgcHVzaGxuIHJlaGFzaCBzY2hlZCBzZXRjYXAgc2V0b3B0IHN0YXQgc3VzcGVuZCB0dHljdGwgdW5mdW5jdGlvbiB1bmhhc2ggdW5saW1pdCB1bnNldG9wdCB2YXJlZCB3YWl0IHdoZW5jZSB3aGVyZSB3aGljaCB6Y29tcGlsZSB6Zm9ybWF0IHpmdHAgemxlIHptb2Rsb2FkIHpwYXJzZW9wdHMgenByb2YgenB0eSB6cmVnZXhwYXJzZSB6c29ja2V0IHpzdHlsZSB6dGNwIn0sY29udGFpbnM6W3gscy5TSEVCQU5HKCksQyx3LHMuSEFTSF9DT01NRU5UX01PREUsdSxfLHtjbGFzc05hbWU6IiIsYmVnaW46L1xcIi99LHtjbGFzc05hbWU6InN0cmluZyIsYmVnaW46LycvLGVuZDovJy99LG9dfX19LDczNDAyKHMpe2Z1bmN0aW9uIGNvbmNhdCguLi5zKXtyZXR1cm4gcy5tYXAoKHM9PmZ1bmN0aW9uIHNvdXJjZShzKXtyZXR1cm4gcz8ic3RyaW5nIj09dHlwZW9mIHM/czpzLnNvdXJjZTpudWxsfShzKSkpLmpvaW4oIiIpfXMuZXhwb3J0cz1mdW5jdGlvbiBodHRwKHMpe2NvbnN0IG89IkhUVFAvKDJ8MVxcLlswMV0pIixpPXtjbGFzc05hbWU6ImF0dHJpYnV0ZSIsYmVnaW46Y29uY2F0KCJeIiwvW0EtWmEtel1bQS1aYS16MC05LV0qLywiKD89XFw6XFxzKSIpLHN0YXJ0czp7Y29udGFpbnM6W3tjbGFzc05hbWU6InB1bmN0dWF0aW9uIixiZWdpbjovOiAvLHJlbGV2YW5jZTowLHN0YXJ0czp7ZW5kOiIkIixyZWxldmFuY2U6MH19XX19LGE9W2kse2JlZ2luOiJcXG5cXG4iLHN0YXJ0czp7c3ViTGFuZ3VhZ2U6W10sZW5kc1dpdGhQYXJlbnQ6ITB9fV07cmV0dXJue25hbWU6IkhUVFAiLGFsaWFzZXM6WyJodHRwcyJdLGlsbGVnYWw6L1xTLyxjb250YWluczpbe2JlZ2luOiJeKD89IitvKyIgXFxkezN9KSIsZW5kOi8kLyxjb250YWluczpbe2NsYXNzTmFtZToibWV0YSIsYmVnaW46b30se2NsYXNzTmFtZToibnVtYmVyIixiZWdpbjoiXFxiXFxkezN9XFxiIn1dLHN0YXJ0czp7ZW5kOi9cYlxCLyxpbGxlZ2FsOi9cUy8sY29udGFpbnM6YX19LHtiZWdpbjoiKD89XltBLVpdKyAoLio/KSAiK28rIiQpIixlbmQ6LyQvLGNvbnRhaW5zOlt7Y2xhc3NOYW1lOiJzdHJpbmciLGJlZ2luOiIgIixlbmQ6IiAiLGV4Y2x1ZGVCZWdpbjohMCxleGNsdWRlRW5kOiEwfSx7Y2xhc3NOYW1lOiJtZXRhIixiZWdpbjpvfSx7Y2xhc3NOYW1lOiJrZXl3b3JkIixiZWdpbjoiW0EtWl0rIn1dLHN0YXJ0czp7ZW5kOi9cYlxCLyxpbGxlZ2FsOi9cUy8sY29udGFpbnM6YX19LHMuaW5oZXJpdChpLHtyZWxldmFuY2U6MH0pXX19fSw5NTA4OShzKXtjb25zdCBvPSJbQS1aYS16JF9dWzAtOUEtWmEteiRfXSoiLGk9WyJhcyIsImluIiwib2YiLCJpZiIsImZvciIsIndoaWxlIiwiZmluYWxseSIsInZhciIsIm5ldyIsImZ1bmN0aW9uIiwiZG8iLCJyZXR1cm4iLCJ2b2lkIiwiZWxzZSIsImJyZWFrIiwiY2F0Y2giLCJpbnN0YW5jZW9mIiwid2l0aCIsInRocm93IiwiY2FzZSIsImRlZmF1bHQiLCJ0cnkiLCJzd2l0Y2giLCJjb250aW51ZSIsInR5cGVvZiIsImRlbGV0ZSIsImxldCIsInlpZWxkIiwiY29uc3QiLCJjbGFzcyIsImRlYnVnZ2VyIiwiYXN5bmMiLCJhd2FpdCIsInN0YXRpYyIsImltcG9ydCIsImZyb20iLCJleHBvcnQiLCJleHRlbmRzIl0sYT1bInRydWUiLCJmYWxzZSIsIm51bGwiLCJ1bmRlZmluZWQiLCJOYU4iLCJJbmZpbml0eSJdLHU9W10uY29uY2F0KFsic2V0SW50ZXJ2YWwiLCJzZXRUaW1lb3V0IiwiY2xlYXJJbnRlcnZhbCIsImNsZWFyVGltZW91dCIsInJlcXVpcmUiLCJleHBvcnRzIiwiZXZhbCIsImlzRmluaXRlIiwiaXNOYU4iLCJwYXJzZUZsb2F0IiwicGFyc2VJbnQiLCJkZWNvZGVVUkkiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlbmNvZGVVUkkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJ1bmVzY2FwZSJdLFsiYXJndW1lbnRzIiwidGhpcyIsInN1cGVyIiwiY29uc29sZSIsIndpbmRvdyIsImRvY3VtZW50IiwibG9jYWxTdG9yYWdlIiwibW9kdWxlIiwiZ2xvYmFsIl0sWyJJbnRsIiwiRGF0YVZpZXciLCJOdW1iZXIiLCJNYXRoIiwiRGF0ZSIsIlN0cmluZyIsIlJlZ0V4cCIsIk9iamVjdCIsIkZ1bmN0aW9uIiwiQm9vbGVhbiIsIkVycm9yIiwiU3ltYm9sIiwiU2V0IiwiTWFwIiwiV2Vha1NldCIsIldlYWtNYXAiLCJQcm94eSIsIlJlZmxlY3QiLCJKU09OIiwiUHJvbWlzZSIsIkZsb2F0NjRBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiSW50OEFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0MzJBcnJheSIsIkFycmF5IiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiQXJyYXlCdWZmZXIiLCJCaWdJbnQ2NEFycmF5IiwiQmlnVWludDY0QXJyYXkiLCJCaWdJbnQiXSxbIkV2YWxFcnJvciIsIkludGVybmFsRXJyb3IiLCJSYW5nZUVycm9yIiwiUmVmZXJlbmNlRXJyb3IiLCJTeW50YXhFcnJvciIsIlR5cGVFcnJvciIsIlVSSUVycm9yIl0pO2Z1bmN0aW9uIGxvb2thaGVhZChzKXtyZXR1cm4gY29uY2F0KCIoPz0iLHMsIikiKX1mdW5jdGlvbiBjb25jYXQoLi4ucyl7cmV0dXJuIHMubWFwKChzPT5mdW5jdGlvbiBzb3VyY2Uocyl7cmV0dXJuIHM/InN0cmluZyI9PXR5cGVvZiBzP3M6cy5zb3VyY2U6bnVsbH0ocykpKS5qb2luKCIiKX1zLmV4cG9ydHM9ZnVuY3Rpb24gamF2YXNjcmlwdChzKXtjb25zdCBfPW8sdz0iPD4iLHg9IjwvPiIsQz17YmVnaW46LzxbQS1aYS16MC05XFwuXzotXSsvLGVuZDovXC9bQS1aYS16MC05XFwuXzotXSs+fFwvPi8saXNUcnVseU9wZW5pbmdUYWc6KHMsbyk9Pntjb25zdCBpPXNbMF0ubGVuZ3RoK3MuaW5kZXgsYT1zLmlucHV0W2ldOyI8IiE9PWE/Ij4iPT09YSYmKCgocyx7YWZ0ZXI6b30pPT57Y29uc3QgaT0iPC8iK3NbMF0uc2xpY2UoMSk7cmV0dXJuLTEhPT1zLmlucHV0LmluZGV4T2YoaSxvKX0pKHMse2FmdGVyOml9KXx8by5pZ25vcmVNYXRjaCgpKTpvLmlnbm9yZU1hdGNoKCl9fSxqPXskcGF0dGVybjpvLGtleXdvcmQ6aSxsaXRlcmFsOmEsYnVpbHRfaW46dX0sTD0iWzAtOV0oXz9bMC05XSkqIixCPWBcXC4oJHtMfSlgLCQ9IjB8WzEtOV0oXz9bMC05XSkqfDBbMC03XSpbODldWzAtOV0qIixVPXtjbGFzc05hbWU6Im51bWJlciIsdmFyaWFudHM6W3tiZWdpbjpgKFxcYigkeyR9KSgoJHtCfSl8XFwuKT98KCR7Qn0pKVtlRV1bKy1dPygke0x9KVxcYmB9LHtiZWdpbjpgXFxiKCR7JH0pXFxiKCgke0J9KVxcYnxcXC4pP3woJHtCfSlcXGJgfSx7YmVnaW46IlxcYigwfFsxLTldKF8/WzAtOV0pKiluXFxiIn0se2JlZ2luOiJcXGIwW3hYXVswLTlhLWZBLUZdKF8/WzAtOWEtZkEtRl0pKm4/XFxiIn0se2JlZ2luOiJcXGIwW2JCXVswLTFdKF8/WzAtMV0pKm4/XFxiIn0se2JlZ2luOiJcXGIwW29PXVswLTddKF8/WzAtN10pKm4/XFxiIn0se2JlZ2luOiJcXGIwWzAtN10rbj9cXGIifV0scmVsZXZhbmNlOjB9LFY9e2NsYXNzTmFtZToic3Vic3QiLGJlZ2luOiJcXCRcXHsiLGVuZDoiXFx9IixrZXl3b3JkczpqLGNvbnRhaW5zOltdfSx6PXtiZWdpbjoiaHRtbGAiLGVuZDoiIixzdGFydHM6e2VuZDoiYCIscmV0dXJuRW5kOiExLGNvbnRhaW5zOltzLkJBQ0tTTEFTSF9FU0NBUEUsVl0sc3ViTGFuZ3VhZ2U6InhtbCJ9fSxZPXtiZWdpbjoiY3NzYCIsZW5kOiIiLHN0YXJ0czp7ZW5kOiJgIixyZXR1cm5FbmQ6ITEsY29udGFpbnM6W3MuQkFDS1NMQVNIX0VTQ0FQRSxWXSxzdWJMYW5ndWFnZToiY3NzIn19LFo9e2NsYXNzTmFtZToic3RyaW5nIixiZWdpbjoiYCIsZW5kOiJgIixjb250YWluczpbcy5CQUNLU0xBU0hfRVNDQVBFLFZdfSxlZT17Y2xhc3NOYW1lOiJjb21tZW50Iix2YXJpYW50czpbcy5DT01NRU5UKC9cL1wqXCooPyFcLykvLCJcXCovIix7cmVsZXZhbmNlOjAsY29udGFpbnM6W3tjbGFzc05hbWU6ImRvY3RhZyIsYmVnaW46IkBbQS1aYS16XSsiLGNvbnRhaW5zOlt7Y2xhc3NOYW1lOiJ0eXBlIixiZWdpbjoiXFx7IixlbmQ6IlxcfSIscmVsZXZhbmNlOjB9LHtjbGFzc05hbWU6InZhcmlhYmxlIixiZWdpbjpfKyIoPz1cXHMqKC0pfCQpIixlbmRzUGFyZW50OiEwLHJlbGV2YW5jZTowfSx7YmVnaW46Lyg/PVteXG5dKVxzLyxyZWxldmFuY2U6MH1dfV19KSxzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLHMuQ19MSU5FX0NPTU1FTlRfTU9ERV19LGllPVtzLkFQT1NfU1RSSU5HX01PREUscy5RVU9URV9TVFJJTkdfTU9ERSx6LFksWixVLHMuUkVHRVhQX01PREVdO1YuY29udGFpbnM9aWUuY29uY2F0KHtiZWdpbjovXHsvLGVuZDovXH0vLGtleXdvcmRzOmosY29udGFpbnM6WyJzZWxmIl0uY29uY2F0KGllKX0pO2NvbnN0IGFlPVtdLmNvbmNhdChlZSxWLmNvbnRhaW5zKSxjZT1hZS5jb25jYXQoW3tiZWdpbjovXCgvLGVuZDovXCkvLGtleXdvcmRzOmosY29udGFpbnM6WyJzZWxmIl0uY29uY2F0KGFlKX1dKSxsZT17Y2xhc3NOYW1lOiJwYXJhbXMiLGJlZ2luOi9cKC8sZW5kOi9cKS8sZXhjbHVkZUJlZ2luOiEwLGV4Y2x1ZGVFbmQ6ITAsa2V5d29yZHM6aixjb250YWluczpjZX07cmV0dXJue25hbWU6IkphdmFzY3JpcHQiLGFsaWFzZXM6WyJqcyIsImpzeCIsIm1qcyIsImNqcyJdLGtleXdvcmRzOmosZXhwb3J0czp7UEFSQU1TX0NPTlRBSU5TOmNlfSxpbGxlZ2FsOi8jKD8hWyRfQS16XSkvLGNvbnRhaW5zOltzLlNIRUJBTkcoe2xhYmVsOiJzaGViYW5nIixiaW5hcnk6Im5vZGUiLHJlbGV2YW5jZTo1fSkse2xhYmVsOiJ1c2Vfc3RyaWN0IixjbGFzc05hbWU6Im1ldGEiLHJlbGV2YW5jZToxMCxiZWdpbjovXlxzKlsnIl11c2UgKHN0cmljdHxhc20pWyciXS99LHMuQVBPU19TVFJJTkdfTU9ERSxzLlFVT1RFX1NUUklOR19NT0RFLHosWSxaLGVlLFUse2JlZ2luOmNvbmNhdCgvW3ssXG5dXHMqLyxsb29rYWhlYWQoY29uY2F0KC8oKChcL1wvLiokKXwoXC9cKihcKlteL118W14qXSkqXCpcLykpXHMqKSovLF8rIlxccyo6IikpKSxyZWxldmFuY2U6MCxjb250YWluczpbe2NsYXNzTmFtZToiYXR0ciIsYmVnaW46Xytsb29rYWhlYWQoIlxccyo6IikscmVsZXZhbmNlOjB9XX0se2JlZ2luOiIoIitzLlJFX1NUQVJURVJTX1JFKyJ8XFxiKGNhc2V8cmV0dXJufHRocm93KVxcYilcXHMqIixrZXl3b3JkczoicmV0dXJuIHRocm93IGNhc2UiLGNvbnRhaW5zOltlZSxzLlJFR0VYUF9NT0RFLHtjbGFzc05hbWU6ImZ1bmN0aW9uIixiZWdpbjoiKFxcKFteKCldKihcXChbXigpXSooXFwoW14oKV0qXFwpW14oKV0qKSpcXClbXigpXSopKlxcKXwiK3MuVU5ERVJTQ09SRV9JREVOVF9SRSsiKVxccyo9PiIscmV0dXJuQmVnaW46ITAsZW5kOiJcXHMqPT4iLGNvbnRhaW5zOlt7Y2xhc3NOYW1lOiJwYXJhbXMiLHZhcmlhbnRzOlt7YmVnaW46cy5VTkRFUlNDT1JFX0lERU5UX1JFLHJlbGV2YW5jZTowfSx7Y2xhc3NOYW1lOm51bGwsYmVnaW46L1woXHMqXCkvLHNraXA6ITB9LHtiZWdpbjovXCgvLGVuZDovXCkvLGV4Y2x1ZGVCZWdpbjohMCxleGNsdWRlRW5kOiEwLGtleXdvcmRzOmosY29udGFpbnM6Y2V9XX1dfSx7YmVnaW46LywvLHJlbGV2YW5jZTowfSx7Y2xhc3NOYW1lOiIiLGJlZ2luOi9ccy8sZW5kOi9ccyovLHNraXA6ITB9LHt2YXJpYW50czpbe2JlZ2luOncsZW5kOnh9LHtiZWdpbjpDLmJlZ2luLCJvbjpiZWdpbiI6Qy5pc1RydWx5T3BlbmluZ1RhZyxlbmQ6Qy5lbmR9XSxzdWJMYW5ndWFnZToieG1sIixjb250YWluczpbe2JlZ2luOkMuYmVnaW4sZW5kOkMuZW5kLHNraXA6ITAsY29udGFpbnM6WyJzZWxmIl19XX1dLHJlbGV2YW5jZTowfSx7Y2xhc3NOYW1lOiJmdW5jdGlvbiIsYmVnaW5LZXl3b3JkczoiZnVuY3Rpb24iLGVuZDovW3s7XS8sZXhjbHVkZUVuZDohMCxrZXl3b3JkczpqLGNvbnRhaW5zOlsic2VsZiIscy5pbmhlcml0KHMuVElUTEVfTU9ERSx7YmVnaW46X30pLGxlXSxpbGxlZ2FsOi8lL30se2JlZ2luS2V5d29yZHM6IndoaWxlIGlmIHN3aXRjaCBjYXRjaCBmb3IifSx7Y2xhc3NOYW1lOiJmdW5jdGlvbiIsYmVnaW46cy5VTkRFUlNDT1JFX0lERU5UX1JFKyJcXChbXigpXSooXFwoW14oKV0qKFxcKFteKCldKlxcKVteKCldKikqXFwpW14oKV0qKSpcXClcXHMqXFx7IixyZXR1cm5CZWdpbjohMCxjb250YWluczpbbGUscy5pbmhlcml0KHMuVElUTEVfTU9ERSx7YmVnaW46X30pXX0se3ZhcmlhbnRzOlt7YmVnaW46IlxcLiIrX30se2JlZ2luOiJcXCQiK199XSxyZWxldmFuY2U6MH0se2NsYXNzTmFtZToiY2xhc3MiLGJlZ2luS2V5d29yZHM6ImNsYXNzIixlbmQ6L1t7Oz1dLyxleGNsdWRlRW5kOiEwLGlsbGVnYWw6L1s6IltcXV0vLGNvbnRhaW5zOlt7YmVnaW5LZXl3b3JkczoiZXh0ZW5kcyJ9LHMuVU5ERVJTQ09SRV9USVRMRV9NT0RFXX0se2JlZ2luOi9cYig/PWNvbnN0cnVjdG9yKS8sZW5kOi9beztdLyxleGNsdWRlRW5kOiEwLGNvbnRhaW5zOltzLmluaGVyaXQocy5USVRMRV9NT0RFLHtiZWdpbjpffSksInNlbGYiLGxlXX0se2JlZ2luOiIoZ2V0fHNldClcXHMrKD89IitfKyJcXCgpIixlbmQ6L1x7LyxrZXl3b3JkczoiZ2V0IHNldCIsY29udGFpbnM6W3MuaW5oZXJpdChzLlRJVExFX01PREUse2JlZ2luOl99KSx7YmVnaW46L1woXCkvfSxsZV19LHtiZWdpbjovXCRbKC5dL31dfX19LDY1NzcyKHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBqc29uKHMpe2NvbnN0IG89e2xpdGVyYWw6InRydWUgZmFsc2UgbnVsbCJ9LGk9W3MuQ19MSU5FX0NPTU1FTlRfTU9ERSxzLkNfQkxPQ0tfQ09NTUVOVF9NT0RFXSxhPVtzLlFVT1RFX1NUUklOR19NT0RFLHMuQ19OVU1CRVJfTU9ERV0sdT17ZW5kOiIsIixlbmRzV2l0aFBhcmVudDohMCxleGNsdWRlRW5kOiEwLGNvbnRhaW5zOmEsa2V5d29yZHM6b30sXz17YmVnaW46L1x7LyxlbmQ6L1x9Lyxjb250YWluczpbe2NsYXNzTmFtZToiYXR0ciIsYmVnaW46LyIvLGVuZDovIi8sY29udGFpbnM6W3MuQkFDS1NMQVNIX0VTQ0FQRV0saWxsZWdhbDoiXFxuIn0scy5pbmhlcml0KHUse2JlZ2luOi86L30pXS5jb25jYXQoaSksaWxsZWdhbDoiXFxTIn0sdz17YmVnaW46IlxcWyIsZW5kOiJcXF0iLGNvbnRhaW5zOltzLmluaGVyaXQodSldLGlsbGVnYWw6IlxcUyJ9O3JldHVybiBhLnB1c2goXyx3KSxpLmZvckVhY2goKGZ1bmN0aW9uKHMpe2EucHVzaChzKX0pKSx7bmFtZToiSlNPTiIsY29udGFpbnM6YSxrZXl3b3JkczpvLGlsbGVnYWw6IlxcUyJ9fX0sMjY1NzEocyl7cy5leHBvcnRzPWZ1bmN0aW9uIHBvd2Vyc2hlbGwocyl7Y29uc3Qgbz17JHBhdHRlcm46Ly0/W0EtelwuXC1dK1xiLyxrZXl3b3JkOiJpZiBlbHNlIGZvcmVhY2ggcmV0dXJuIGRvIHdoaWxlIHVudGlsIGVsc2VpZiBiZWdpbiBmb3IgdHJhcCBkYXRhIGR5bmFtaWNwYXJhbSBlbmQgYnJlYWsgdGhyb3cgcGFyYW0gY29udGludWUgZmluYWxseSBpbiBzd2l0Y2ggZXhpdCBmaWx0ZXIgdHJ5IHByb2Nlc3MgY2F0Y2ggaGlkZGVuIHN0YXRpYyBwYXJhbWV0ZXIiLGJ1aWx0X2luOiJhYyBhc25wIGNhdCBjZCBDRlMgY2hkaXIgY2xjIGNsZWFyIGNsaHkgY2xpIGNscCBjbHMgY2x2IGNuc24gY29tcGFyZSBjb3B5IGNwIGNwaSBjcHAgY3VybCBjdnBhIGRicCBkZWwgZGlmZiBkaXIgZG5zbiBlYnAgZWNob3wwIGVwYWwgZXBjc3YgZXBzbiBlcmFzZSBldHNuIGV4c24gZmMgZmh4IGZsIGZ0IGZ3IGdhbCBnYnAgZ2MgZ2NiIGdjaSBnY20gZ2NzIGdkciBnZXJyIGdoeSBnaSBnaW4gZ2piIGdsIGdtIGdtbyBncCBncHMgZ3B2IGdyb3VwIGdzbiBnc25wIGdzdiBndHogZ3UgZ3YgZ3dtaSBoIGhpc3RvcnkgaWNtIGlleCBpaHkgaWkgaXBhbCBpcGNzdiBpcG1vIGlwc24gaXJtIGlzZSBpd21pIGl3ciBraWxsIGxwIGxzIG1hbiBtZCBtZWFzdXJlIG1pIG1vdW50IG1vdmUgbXAgbXYgbmFsIG5kciBuaSBubW8gbnBzc2MgbnNuIG52IG9ndiBvaCBwb3BkIHBzIHB1c2hkIHB3ZCByIHJicCByY2piIHJjc24gcmQgcmRyIHJlbiByaSByamIgcm0gcm1kaXIgcm1vIHJuaSBybnAgcnAgcnNuIHJzbnAgcnVqYiBydiBydnBhIHJ3bWkgc2FqYiBzYWwgc2FwcyBzYXN2IHNicCBzYyBzY2Igc2VsZWN0IHNldCBzaGNtIHNpIHNsIHNsZWVwIHNscyBzb3J0IHNwIHNwamIgc3BwcyBzcHN2IHN0YXJ0IHN0eiBzdWpiIHN2IHN3bWkgdGVlIHRyY20gdHlwZSB3Z2V0IHdoZXJlIHdqYiB3cml0ZSJ9LGk9e2JlZ2luOiJgW1xcc1xcU10iLHJlbGV2YW5jZTowfSxhPXtjbGFzc05hbWU6InZhcmlhYmxlIix2YXJpYW50czpbe2JlZ2luOi9cJFxCL30se2NsYXNzTmFtZToia2V5d29yZCIsYmVnaW46L1wkdGhpcy99LHtiZWdpbjovXCRbXHdcZF1bXHdcZF86XSovfV19LHU9e2NsYXNzTmFtZToic3RyaW5nIix2YXJpYW50czpbe2JlZ2luOi8iLyxlbmQ6LyIvfSx7YmVnaW46L0AiLyxlbmQ6L14iQC99XSxjb250YWluczpbaSxhLHtjbGFzc05hbWU6InZhcmlhYmxlIixiZWdpbjovXCRbQS16XS8sZW5kOi9bXkEtel0vfV19LF89e2NsYXNzTmFtZToic3RyaW5nIix2YXJpYW50czpbe2JlZ2luOi8nLyxlbmQ6LycvfSx7YmVnaW46L0AnLyxlbmQ6L14nQC99XX0sdz1zLmluaGVyaXQocy5DT01NRU5UKG51bGwsbnVsbCkse3ZhcmlhbnRzOlt7YmVnaW46LyMvLGVuZDovJC99LHtiZWdpbjovPCMvLGVuZDovIz4vfV0sY29udGFpbnM6W3tjbGFzc05hbWU6ImRvY3RhZyIsdmFyaWFudHM6W3tiZWdpbjovXC4oc3lub3BzaXN8ZGVzY3JpcHRpb258ZXhhbXBsZXxpbnB1dHN8b3V0cHV0c3xub3Rlc3xsaW5rfGNvbXBvbmVudHxyb2xlfGZ1bmN0aW9uYWxpdHkpL30se2JlZ2luOi9cLihwYXJhbWV0ZXJ8Zm9yd2FyZGhlbHB0YXJnZXRuYW1lfGZvcndhcmRoZWxwY2F0ZWdvcnl8cmVtb3RlaGVscHJ1bnNwYWNlfGV4dGVybmFsaGVscClccytcUysvfV19XX0pLHg9e2NsYXNzTmFtZToiYnVpbHRfaW4iLHZhcmlhbnRzOlt7YmVnaW46IigiLmNvbmNhdCgiQWRkfENsZWFyfENsb3NlfENvcHl8RW50ZXJ8RXhpdHxGaW5kfEZvcm1hdHxHZXR8SGlkZXxKb2lufExvY2t8TW92ZXxOZXd8T3BlbnxPcHRpbWl6ZXxQb3B8UHVzaHxSZWRvfFJlbW92ZXxSZW5hbWV8UmVzZXR8UmVzaXplfFNlYXJjaHxTZWxlY3R8U2V0fFNob3d8U2tpcHxTcGxpdHxTdGVwfFN3aXRjaHxVbmRvfFVubG9ja3xXYXRjaHxCYWNrdXB8Q2hlY2twb2ludHxDb21wYXJlfENvbXByZXNzfENvbnZlcnR8Q29udmVydEZyb218Q29udmVydFRvfERpc21vdW50fEVkaXR8RXhwYW5kfEV4cG9ydHxHcm91cHxJbXBvcnR8SW5pdGlhbGl6ZXxMaW1pdHxNZXJnZXxNb3VudHxPdXR8UHVibGlzaHxSZXN0b3JlfFNhdmV8U3luY3xVbnB1Ymxpc2h8VXBkYXRlfEFwcHJvdmV8QXNzZXJ0fEJ1aWxkfENvbXBsZXRlfENvbmZpcm18RGVueXxEZXBsb3l8RGlzYWJsZXxFbmFibGV8SW5zdGFsbHxJbnZva2V8UmVnaXN0ZXJ8UmVxdWVzdHxSZXN0YXJ0fFJlc3VtZXxTdGFydHxTdG9wfFN1Ym1pdHxTdXNwZW5kfFVuaW5zdGFsbHxVbnJlZ2lzdGVyfFdhaXR8RGVidWd8TWVhc3VyZXxQaW5nfFJlcGFpcnxSZXNvbHZlfFRlc3R8VHJhY2V8Q29ubmVjdHxEaXNjb25uZWN0fFJlYWR8UmVjZWl2ZXxTZW5kfFdyaXRlfEJsb2NrfEdyYW50fFByb3RlY3R8UmV2b2tlfFVuYmxvY2t8VW5wcm90ZWN0fFVzZXxGb3JFYWNofFNvcnR8VGVlfFdoZXJlIiwiKSsoLSlbXFx3XFxkXSsiKX1dfSxDPXtjbGFzc05hbWU6ImNsYXNzIixiZWdpbktleXdvcmRzOiJjbGFzcyBlbnVtIixlbmQ6L1xzKlt7XS8sZXhjbHVkZUVuZDohMCxyZWxldmFuY2U6MCxjb250YWluczpbcy5USVRMRV9NT0RFXX0saj17Y2xhc3NOYW1lOiJmdW5jdGlvbiIsYmVnaW46L2Z1bmN0aW9uXHMrLyxlbmQ6L1xzKlx7fCQvLGV4Y2x1ZGVFbmQ6ITAscmV0dXJuQmVnaW46ITAscmVsZXZhbmNlOjAsY29udGFpbnM6W3tiZWdpbjoiZnVuY3Rpb24iLHJlbGV2YW5jZTowLGNsYXNzTmFtZToia2V5d29yZCJ9LHtjbGFzc05hbWU6InRpdGxlIixiZWdpbjovXHdbXHdcZF0qKCgtKVtcd1xkXSspKi8scmVsZXZhbmNlOjB9LHtiZWdpbjovXCgvLGVuZDovXCkvLGNsYXNzTmFtZToicGFyYW1zIixyZWxldmFuY2U6MCxjb250YWluczpbYV19XX0sTD17YmVnaW46L3VzaW5nXHMvLGVuZDovJC8scmV0dXJuQmVnaW46ITAsY29udGFpbnM6W3UsXyx7Y2xhc3NOYW1lOiJrZXl3b3JkIixiZWdpbjovKHVzaW5nfGFzc2VtYmx5fGNvbW1hbmR8bW9kdWxlfG5hbWVzcGFjZXx0eXBlKS99XX0sQj17dmFyaWFudHM6W3tjbGFzc05hbWU6Im9wZXJhdG9yIixiZWdpbjoiKCIuY29uY2F0KCItYW5kfC1hc3wtYmFuZHwtYm5vdHwtYm9yfC1ieG9yfC1jYXNlc2Vuc2l0aXZlfC1jY29udGFpbnN8LWNlcXwtY2dlfC1jZ3R8LWNsZXwtY2xpa2V8LWNsdHwtY21hdGNofC1jbmV8LWNub3Rjb250YWluc3wtY25vdGxpa2V8LWNub3RtYXRjaHwtY29udGFpbnN8LWNyZXBsYWNlfC1jc3BsaXR8LWVxfC1leGFjdHwtZnwtZmlsZXwtZ2V8LWd0fC1pY29udGFpbnN8LWllcXwtaWdlfC1pZ3R8LWlsZXwtaWxpa2V8LWlsdHwtaW1hdGNofC1pbnwtaW5lfC1pbm90Y29udGFpbnN8LWlub3RsaWtlfC1pbm90bWF0Y2h8LWlyZXBsYWNlfC1pc3wtaXNub3R8LWlzcGxpdHwtam9pbnwtbGV8LWxpa2V8LWx0fC1tYXRjaHwtbmV8LW5vdHwtbm90Y29udGFpbnN8LW5vdGlufC1ub3RsaWtlfC1ub3RtYXRjaHwtb3J8LXJlZ2V4fC1yZXBsYWNlfC1zaGx8LXNocnwtc3BsaXR8LXdpbGRjYXJkfC14b3IiLCIpXFxiIil9LHtjbGFzc05hbWU6ImxpdGVyYWwiLGJlZ2luOi8oLSlbXHdcZF0rLyxyZWxldmFuY2U6MH1dfSwkPXtjbGFzc05hbWU6ImZ1bmN0aW9uIixiZWdpbjovXFsuKlxdXHMqW1x3XStbIF0/P1woLyxlbmQ6LyQvLHJldHVybkJlZ2luOiEwLHJlbGV2YW5jZTowLGNvbnRhaW5zOlt7Y2xhc3NOYW1lOiJrZXl3b3JkIixiZWdpbjoiKCIuY29uY2F0KG8ua2V5d29yZC50b1N0cmluZygpLnJlcGxhY2UoL1xzL2csInwiKSwiKVxcYiIpLGVuZHNQYXJlbnQ6ITAscmVsZXZhbmNlOjB9LHMuaW5oZXJpdChzLlRJVExFX01PREUse2VuZHNQYXJlbnQ6ITB9KV19LFU9WyQsdyxpLHMuTlVNQkVSX01PREUsdSxfLHgsYSx7Y2xhc3NOYW1lOiJsaXRlcmFsIixiZWdpbjovXCQobnVsbHx0cnVlfGZhbHNlKVxiL30se2NsYXNzTmFtZToic2VsZWN0b3ItdGFnIixiZWdpbjovQFxCLyxyZWxldmFuY2U6MH1dLFY9e2JlZ2luOi9cWy8sZW5kOi9cXS8sZXhjbHVkZUJlZ2luOiEwLGV4Y2x1ZGVFbmQ6ITAscmVsZXZhbmNlOjAsY29udGFpbnM6W10uY29uY2F0KCJzZWxmIixVLHtiZWdpbjoiKCIrWyJzdHJpbmciLCJjaGFyIiwiYnl0ZSIsImludCIsImxvbmciLCJib29sIiwiZGVjaW1hbCIsInNpbmdsZSIsImRvdWJsZSIsIkRhdGVUaW1lIiwieG1sIiwiYXJyYXkiLCJoYXNodGFibGUiLCJ2b2lkIl0uam9pbigifCIpKyIpIixjbGFzc05hbWU6ImJ1aWx0X2luIixyZWxldmFuY2U6MH0se2NsYXNzTmFtZToidHlwZSIsYmVnaW46L1tcLlx3XGRdKy8scmVsZXZhbmNlOjB9KX07cmV0dXJuICQuY29udGFpbnMudW5zaGlmdChWKSx7bmFtZToiUG93ZXJTaGVsbCIsYWxpYXNlczpbInBzIiwicHMxIl0sY2FzZV9pbnNlbnNpdGl2ZTohMCxrZXl3b3JkczpvLGNvbnRhaW5zOlUuY29uY2F0KEMsaixMLEIsVil9fX0sMTcyODUocyl7ZnVuY3Rpb24gc291cmNlKHMpe3JldHVybiBzPyJzdHJpbmciPT10eXBlb2Ygcz9zOnMuc291cmNlOm51bGx9ZnVuY3Rpb24gbG9va2FoZWFkKHMpe3JldHVybiBjb25jYXQoIig/PSIscywiKSIpfWZ1bmN0aW9uIGNvbmNhdCguLi5zKXtyZXR1cm4gcy5tYXAoKHM9PnNvdXJjZShzKSkpLmpvaW4oIiIpfWZ1bmN0aW9uIGVpdGhlciguLi5zKXtyZXR1cm4iKCIrcy5tYXAoKHM9PnNvdXJjZShzKSkpLmpvaW4oInwiKSsiKSJ9cy5leHBvcnRzPWZ1bmN0aW9uIHhtbChzKXtjb25zdCBvPWNvbmNhdCgvW0EtWl9dLyxmdW5jdGlvbiBvcHRpb25hbChzKXtyZXR1cm4gY29uY2F0KCIoIixzLCIpPyIpfSgvW0EtWjAtOV8uLV0qOi8pLC9bQS1aMC05Xy4tXSovKSxpPXtjbGFzc05hbWU6InN5bWJvbCIsYmVnaW46LyZbYS16XSs7fCYjWzAtOV0rO3wmI3hbYS1mMC05XSs7L30sYT17YmVnaW46L1xzLyxjb250YWluczpbe2NsYXNzTmFtZToibWV0YS1rZXl3b3JkIixiZWdpbjovIz9bYS16X11bYS16MS05Xy1dKy8saWxsZWdhbDovXG4vfV19LHU9cy5pbmhlcml0KGEse2JlZ2luOi9cKC8sZW5kOi9cKS99KSxfPXMuaW5oZXJpdChzLkFQT1NfU1RSSU5HX01PREUse2NsYXNzTmFtZToibWV0YS1zdHJpbmcifSksdz1zLmluaGVyaXQocy5RVU9URV9TVFJJTkdfTU9ERSx7Y2xhc3NOYW1lOiJtZXRhLXN0cmluZyJ9KSx4PXtlbmRzV2l0aFBhcmVudDohMCxpbGxlZ2FsOi88LyxyZWxldmFuY2U6MCxjb250YWluczpbe2NsYXNzTmFtZToiYXR0ciIsYmVnaW46L1tBLVphLXowLTkuXzotXSsvLHJlbGV2YW5jZTowfSx7YmVnaW46Lz1ccyovLHJlbGV2YW5jZTowLGNvbnRhaW5zOlt7Y2xhc3NOYW1lOiJzdHJpbmciLGVuZHNQYXJlbnQ6ITAsdmFyaWFudHM6W3tiZWdpbjovIi8sZW5kOi8iLyxjb250YWluczpbaV19LHtiZWdpbjovJy8sZW5kOi8nLyxjb250YWluczpbaV19LHtiZWdpbjovW15ccyInPTw+YF0rL31dfV19XX07cmV0dXJue25hbWU6IkhUTUwsIFhNTCIsYWxpYXNlczpbImh0bWwiLCJ4aHRtbCIsInJzcyIsImF0b20iLCJ4amIiLCJ4c2QiLCJ4c2wiLCJwbGlzdCIsIndzZiIsInN2ZyJdLGNhc2VfaW5zZW5zaXRpdmU6ITAsY29udGFpbnM6W3tjbGFzc05hbWU6Im1ldGEiLGJlZ2luOi88IVthLXpdLyxlbmQ6Lz4vLHJlbGV2YW5jZToxMCxjb250YWluczpbYSx3LF8sdSx7YmVnaW46L1xbLyxlbmQ6L1xdLyxjb250YWluczpbe2NsYXNzTmFtZToibWV0YSIsYmVnaW46LzwhW2Etel0vLGVuZDovPi8sY29udGFpbnM6W2EsdSx3LF9dfV19XX0scy5DT01NRU5UKC88IS0tLywvLS0+Lyx7cmVsZXZhbmNlOjEwfSkse2JlZ2luOi88IVxbQ0RBVEFcWy8sZW5kOi9cXVxdPi8scmVsZXZhbmNlOjEwfSxpLHtjbGFzc05hbWU6Im1ldGEiLGJlZ2luOi88XD94bWwvLGVuZDovXD8+LyxyZWxldmFuY2U6MTB9LHtjbGFzc05hbWU6InRhZyIsYmVnaW46LzxzdHlsZSg/PVxzfD4pLyxlbmQ6Lz4vLGtleXdvcmRzOntuYW1lOiJzdHlsZSJ9LGNvbnRhaW5zOlt4XSxzdGFydHM6e2VuZDovPFwvc3R5bGU+LyxyZXR1cm5FbmQ6ITAsc3ViTGFuZ3VhZ2U6WyJjc3MiLCJ4bWwiXX19LHtjbGFzc05hbWU6InRhZyIsYmVnaW46LzxzY3JpcHQoPz1cc3w+KS8sZW5kOi8+LyxrZXl3b3Jkczp7bmFtZToic2NyaXB0In0sY29udGFpbnM6W3hdLHN0YXJ0czp7ZW5kOi88XC9zY3JpcHQ+LyxyZXR1cm5FbmQ6ITAsc3ViTGFuZ3VhZ2U6WyJqYXZhc2NyaXB0IiwiaGFuZGxlYmFycyIsInhtbCJdfX0se2NsYXNzTmFtZToidGFnIixiZWdpbjovPD58PFwvPi99LHtjbGFzc05hbWU6InRhZyIsYmVnaW46Y29uY2F0KC88Lyxsb29rYWhlYWQoY29uY2F0KG8sZWl0aGVyKC9cLz4vLC8+LywvXHMvKSkpKSxlbmQ6L1wvPz4vLGNvbnRhaW5zOlt7Y2xhc3NOYW1lOiJuYW1lIixiZWdpbjpvLHJlbGV2YW5jZTowLHN0YXJ0czp4fV19LHtjbGFzc05hbWU6InRhZyIsYmVnaW46Y29uY2F0KC88XC8vLGxvb2thaGVhZChjb25jYXQobywvPi8pKSksY29udGFpbnM6W3tjbGFzc05hbWU6Im5hbWUiLGJlZ2luOm8scmVsZXZhbmNlOjB9LHtiZWdpbjovPi8scmVsZXZhbmNlOjAsZW5kc1BhcmVudDohMH1dfV19fX0sMTc1MzMocyl7cy5leHBvcnRzPWZ1bmN0aW9uIHlhbWwocyl7dmFyIG89InRydWUgZmFsc2UgeWVzIG5vIG51bGwiLGk9IltcXHcjOy8/OkAmPSskLC5+KicoKVtcXF1dKyIsYT17Y2xhc3NOYW1lOiJzdHJpbmciLHJlbGV2YW5jZTowLHZhcmlhbnRzOlt7YmVnaW46LycvLGVuZDovJy99LHtiZWdpbjovIi8sZW5kOi8iL30se2JlZ2luOi9cUysvfV0sY29udGFpbnM6W3MuQkFDS1NMQVNIX0VTQ0FQRSx7Y2xhc3NOYW1lOiJ0ZW1wbGF0ZS12YXJpYWJsZSIsdmFyaWFudHM6W3tiZWdpbjovXHtcey8sZW5kOi9cfVx9L30se2JlZ2luOi8lXHsvLGVuZDovXH0vfV19XX0sdT1zLmluaGVyaXQoYSx7dmFyaWFudHM6W3tiZWdpbjovJy8sZW5kOi8nL30se2JlZ2luOi8iLyxlbmQ6LyIvfSx7YmVnaW46L1teXHMse31bXF1dKy99XX0pLF89e2NsYXNzTmFtZToibnVtYmVyIixiZWdpbjoiXFxiWzAtOV17NH0oLVswLTldWzAtOV0pezAsMn0oW1R0IFxcdF1bMC05XVswLTldPyg6WzAtOV1bMC05XSl7Mn0pPyhcXC5bMC05XSopPyhbIFxcdF0pKihafFstK11bMC05XVswLTldPyg6WzAtOV1bMC05XSk/KT9cXGIifSx3PXtlbmQ6IiwiLGVuZHNXaXRoUGFyZW50OiEwLGV4Y2x1ZGVFbmQ6ITAsa2V5d29yZHM6byxyZWxldmFuY2U6MH0seD17YmVnaW46L1x7LyxlbmQ6L1x9Lyxjb250YWluczpbd10saWxsZWdhbDoiXFxuIixyZWxldmFuY2U6MH0sQz17YmVnaW46IlxcWyIsZW5kOiJcXF0iLGNvbnRhaW5zOlt3XSxpbGxlZ2FsOiJcXG4iLHJlbGV2YW5jZTowfSxqPVt7Y2xhc3NOYW1lOiJhdHRyIix2YXJpYW50czpbe2JlZ2luOiJcXHdbXFx3IDpcXC8uLV0qOig/PVsgXHRdfCQpIn0se2JlZ2luOiciXFx3W1xcdyA6XFwvLi1dKiI6KD89WyBcdF18JCknfSx7YmVnaW46IidcXHdbXFx3IDpcXC8uLV0qJzooPz1bIFx0XXwkKSJ9XX0se2NsYXNzTmFtZToibWV0YSIsYmVnaW46Il4tLS1cXHMqJCIscmVsZXZhbmNlOjEwfSx7Y2xhc3NOYW1lOiJzdHJpbmciLGJlZ2luOiJbXFx8Pl0oWzEtOV0/WystXSk/WyBdKlxcbiggKylbXiBdW15cXG5dKlxcbihcXDJbXlxcbl0rXFxuPykqIn0se2JlZ2luOiI8JVslPS1dPyIsZW5kOiJbJS1dPyU+IixzdWJMYW5ndWFnZToicnVieSIsZXhjbHVkZUJlZ2luOiEwLGV4Y2x1ZGVFbmQ6ITAscmVsZXZhbmNlOjB9LHtjbGFzc05hbWU6InR5cGUiLGJlZ2luOiIhXFx3KyEiK2l9LHtjbGFzc05hbWU6InR5cGUiLGJlZ2luOiIhPCIraSsiPiJ9LHtjbGFzc05hbWU6InR5cGUiLGJlZ2luOiIhIitpfSx7Y2xhc3NOYW1lOiJ0eXBlIixiZWdpbjoiISEiK2l9LHtjbGFzc05hbWU6Im1ldGEiLGJlZ2luOiImIitzLlVOREVSU0NPUkVfSURFTlRfUkUrIiQifSx7Y2xhc3NOYW1lOiJtZXRhIixiZWdpbjoiXFwqIitzLlVOREVSU0NPUkVfSURFTlRfUkUrIiQifSx7Y2xhc3NOYW1lOiJidWxsZXQiLGJlZ2luOiItKD89WyBdfCQpIixyZWxldmFuY2U6MH0scy5IQVNIX0NPTU1FTlRfTU9ERSx7YmVnaW5LZXl3b3JkczpvLGtleXdvcmRzOntsaXRlcmFsOm99fSxfLHtjbGFzc05hbWU6Im51bWJlciIsYmVnaW46cy5DX05VTUJFUl9SRSsiXFxiIixyZWxldmFuY2U6MH0seCxDLGFdLEw9Wy4uLmpdO3JldHVybiBMLnBvcCgpLEwucHVzaCh1KSx3LmNvbnRhaW5zPUwse25hbWU6IllBTUwiLGNhc2VfaW5zZW5zaXRpdmU6ITAsYWxpYXNlczpbInltbCJdLGNvbnRhaW5zOmp9fX0sMjUxKHMsbyl7by5yZWFkPWZ1bmN0aW9uKHMsbyxpLGEsdSl7dmFyIF8sdyx4PTgqdS1hLTEsQz0oMTw8eCktMSxqPUM+PjEsTD0tNyxCPWk/dS0xOjAsJD1pPy0xOjEsVT1zW28rQl07Zm9yKEIrPSQsXz1VJigxPDwtTCktMSxVPj49LUwsTCs9eDtMPjA7Xz0yNTYqXytzW28rQl0sQis9JCxMLT04KTtmb3Iodz1fJigxPDwtTCktMSxfPj49LUwsTCs9YTtMPjA7dz0yNTYqdytzW28rQl0sQis9JCxMLT04KTtpZigwPT09XylfPTEtajtlbHNle2lmKF89PT1DKXJldHVybiB3P05hTjoxLzAqKFU/LTE6MSk7dys9TWF0aC5wb3coMixhKSxfLT1qfXJldHVybihVPy0xOjEpKncqTWF0aC5wb3coMixfLWEpfSxvLndyaXRlPWZ1bmN0aW9uKHMsbyxpLGEsdSxfKXt2YXIgdyx4LEMsaj04Kl8tdS0xLEw9KDE8PGopLTEsQj1MPj4xLCQ9MjM9PT11P01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxVPWE/MDpfLTEsVj1hPzE6LTEsej1vPDB8fDA9PT1vJiYxL288MD8xOjA7Zm9yKG89TWF0aC5hYnMobyksaXNOYU4obyl8fG89PT0xLzA/KHg9aXNOYU4obyk/MTowLHc9TCk6KHc9TWF0aC5mbG9vcihNYXRoLmxvZyhvKS9NYXRoLkxOMiksbyooQz1NYXRoLnBvdygyLC13KSk8MSYmKHctLSxDKj0yKSwobys9dytCPj0xPyQvQzokKk1hdGgucG93KDIsMS1CKSkqQz49MiYmKHcrKyxDLz0yKSx3K0I+PUw/KHg9MCx3PUwpOncrQj49MT8oeD0obypDLTEpKk1hdGgucG93KDIsdSksdys9Qik6KHg9bypNYXRoLnBvdygyLEItMSkqTWF0aC5wb3coMix1KSx3PTApKTt1Pj04O3NbaStVXT0yNTUmeCxVKz1WLHgvPTI1Nix1LT04KTtmb3Iodz13PDx1fHgsais9dTtqPjA7c1tpK1VdPTI1NSZ3LFUrPVYsdy89MjU2LGotPTgpO3NbaStVLVZdfD0xMjgqen19LDk0MDQocyl7cy5leHBvcnRzPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBzPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBjcmVhdGVDbGFzcyhzLG8pe28mJihzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkscy5wcm90b3R5cGUuY29uc3RydWN0b3I9c31mdW5jdGlvbiBJdGVyYWJsZShzKXtyZXR1cm4gaXNJdGVyYWJsZShzKT9zOlNlcShzKX1mdW5jdGlvbiBLZXllZEl0ZXJhYmxlKHMpe3JldHVybiBpc0tleWVkKHMpP3M6S2V5ZWRTZXEocyl9ZnVuY3Rpb24gSW5kZXhlZEl0ZXJhYmxlKHMpe3JldHVybiBpc0luZGV4ZWQocyk/czpJbmRleGVkU2VxKHMpfWZ1bmN0aW9uIFNldEl0ZXJhYmxlKHMpe3JldHVybiBpc0l0ZXJhYmxlKHMpJiYhaXNBc3NvY2lhdGl2ZShzKT9zOlNldFNlcShzKX1mdW5jdGlvbiBpc0l0ZXJhYmxlKHMpe3JldHVybiEoIXN8fCFzW29dKX1mdW5jdGlvbiBpc0tleWVkKHMpe3JldHVybiEoIXN8fCFzW2ldKX1mdW5jdGlvbiBpc0luZGV4ZWQocyl7cmV0dXJuISghc3x8IXNbYV0pfWZ1bmN0aW9uIGlzQXNzb2NpYXRpdmUocyl7cmV0dXJuIGlzS2V5ZWQocyl8fGlzSW5kZXhlZChzKX1mdW5jdGlvbiBpc09yZGVyZWQocyl7cmV0dXJuISghc3x8IXNbdV0pfWNyZWF0ZUNsYXNzKEtleWVkSXRlcmFibGUsSXRlcmFibGUpLGNyZWF0ZUNsYXNzKEluZGV4ZWRJdGVyYWJsZSxJdGVyYWJsZSksY3JlYXRlQ2xhc3MoU2V0SXRlcmFibGUsSXRlcmFibGUpLEl0ZXJhYmxlLmlzSXRlcmFibGU9aXNJdGVyYWJsZSxJdGVyYWJsZS5pc0tleWVkPWlzS2V5ZWQsSXRlcmFibGUuaXNJbmRleGVkPWlzSW5kZXhlZCxJdGVyYWJsZS5pc0Fzc29jaWF0aXZlPWlzQXNzb2NpYXRpdmUsSXRlcmFibGUuaXNPcmRlcmVkPWlzT3JkZXJlZCxJdGVyYWJsZS5LZXllZD1LZXllZEl0ZXJhYmxlLEl0ZXJhYmxlLkluZGV4ZWQ9SW5kZXhlZEl0ZXJhYmxlLEl0ZXJhYmxlLlNldD1TZXRJdGVyYWJsZTt2YXIgbz0iQEBfX0lNTVVUQUJMRV9JVEVSQUJMRV9fQEAiLGk9IkBAX19JTU1VVEFCTEVfS0VZRURfX0BAIixhPSJAQF9fSU1NVVRBQkxFX0lOREVYRURfX0BAIix1PSJAQF9fSU1NVVRBQkxFX09SREVSRURfX0BAIixfPSJkZWxldGUiLHc9NSx4PTE8PHcsQz14LTEsaj17fSxMPXt2YWx1ZTohMX0sQj17dmFsdWU6ITF9O2Z1bmN0aW9uIE1ha2VSZWYocyl7cmV0dXJuIHMudmFsdWU9ITEsc31mdW5jdGlvbiBTZXRSZWYocyl7cyYmKHMudmFsdWU9ITApfWZ1bmN0aW9uIE93bmVySUQoKXt9ZnVuY3Rpb24gYXJyQ29weShzLG8pe289b3x8MDtmb3IodmFyIGk9TWF0aC5tYXgoMCxzLmxlbmd0aC1vKSxhPW5ldyBBcnJheShpKSx1PTA7dTxpO3UrKylhW3VdPXNbdStvXTtyZXR1cm4gYX1mdW5jdGlvbiBlbnN1cmVTaXplKHMpe3JldHVybiB2b2lkIDA9PT1zLnNpemUmJihzLnNpemU9cy5fX2l0ZXJhdGUocmV0dXJuVHJ1ZSkpLHMuc2l6ZX1mdW5jdGlvbiB3cmFwSW5kZXgocyxvKXtpZigibnVtYmVyIiE9dHlwZW9mIG8pe3ZhciBpPW8+Pj4wO2lmKCIiK2khPT1vfHw0Mjk0OTY3Mjk1PT09aSlyZXR1cm4gTmFOO289aX1yZXR1cm4gbzwwP2Vuc3VyZVNpemUocykrbzpvfWZ1bmN0aW9uIHJldHVyblRydWUoKXtyZXR1cm4hMH1mdW5jdGlvbiB3aG9sZVNsaWNlKHMsbyxpKXtyZXR1cm4oMD09PXN8fHZvaWQgMCE9PWkmJnM8PS1pKSYmKHZvaWQgMD09PW98fHZvaWQgMCE9PWkmJm8+PWkpfWZ1bmN0aW9uIHJlc29sdmVCZWdpbihzLG8pe3JldHVybiByZXNvbHZlSW5kZXgocyxvLDApfWZ1bmN0aW9uIHJlc29sdmVFbmQocyxvKXtyZXR1cm4gcmVzb2x2ZUluZGV4KHMsbyxvKX1mdW5jdGlvbiByZXNvbHZlSW5kZXgocyxvLGkpe3JldHVybiB2b2lkIDA9PT1zP2k6czwwP01hdGgubWF4KDAsbytzKTp2b2lkIDA9PT1vP3M6TWF0aC5taW4obyxzKX12YXIgJD0wLFU9MSxWPTIsej0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3IsWT0iQEBpdGVyYXRvciIsWj16fHxZO2Z1bmN0aW9uIEl0ZXJhdG9yKHMpe3RoaXMubmV4dD1zfWZ1bmN0aW9uIGl0ZXJhdG9yVmFsdWUocyxvLGksYSl7dmFyIHU9MD09PXM/bzoxPT09cz9pOltvLGldO3JldHVybiBhP2EudmFsdWU9dTphPXt2YWx1ZTp1LGRvbmU6ITF9LGF9ZnVuY3Rpb24gaXRlcmF0b3JEb25lKCl7cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX1mdW5jdGlvbiBoYXNJdGVyYXRvcihzKXtyZXR1cm4hIWdldEl0ZXJhdG9yRm4ocyl9ZnVuY3Rpb24gaXNJdGVyYXRvcihzKXtyZXR1cm4gcyYmImZ1bmN0aW9uIj09dHlwZW9mIHMubmV4dH1mdW5jdGlvbiBnZXRJdGVyYXRvcihzKXt2YXIgbz1nZXRJdGVyYXRvckZuKHMpO3JldHVybiBvJiZvLmNhbGwocyl9ZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihzKXt2YXIgbz1zJiYoeiYmc1t6XXx8c1tZXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8pcmV0dXJuIG99ZnVuY3Rpb24gaXNBcnJheUxpa2Uocyl7cmV0dXJuIHMmJiJudW1iZXIiPT10eXBlb2Ygcy5sZW5ndGh9ZnVuY3Rpb24gU2VxKHMpe3JldHVybiBudWxsPT1zP2VtcHR5U2VxdWVuY2UoKTppc0l0ZXJhYmxlKHMpP3MudG9TZXEoKTpzZXFGcm9tVmFsdWUocyl9ZnVuY3Rpb24gS2V5ZWRTZXEocyl7cmV0dXJuIG51bGw9PXM/ZW1wdHlTZXF1ZW5jZSgpLnRvS2V5ZWRTZXEoKTppc0l0ZXJhYmxlKHMpP2lzS2V5ZWQocyk/cy50b1NlcSgpOnMuZnJvbUVudHJ5U2VxKCk6a2V5ZWRTZXFGcm9tVmFsdWUocyl9ZnVuY3Rpb24gSW5kZXhlZFNlcShzKXtyZXR1cm4gbnVsbD09cz9lbXB0eVNlcXVlbmNlKCk6aXNJdGVyYWJsZShzKT9pc0tleWVkKHMpP3MuZW50cnlTZXEoKTpzLnRvSW5kZXhlZFNlcSgpOmluZGV4ZWRTZXFGcm9tVmFsdWUocyl9ZnVuY3Rpb24gU2V0U2VxKHMpe3JldHVybihudWxsPT1zP2VtcHR5U2VxdWVuY2UoKTppc0l0ZXJhYmxlKHMpP2lzS2V5ZWQocyk/cy5lbnRyeVNlcSgpOnM6aW5kZXhlZFNlcUZyb21WYWx1ZShzKSkudG9TZXRTZXEoKX1JdGVyYXRvci5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iW0l0ZXJhdG9yXSJ9LEl0ZXJhdG9yLktFWVM9JCxJdGVyYXRvci5WQUxVRVM9VSxJdGVyYXRvci5FTlRSSUVTPVYsSXRlcmF0b3IucHJvdG90eXBlLmluc3BlY3Q9SXRlcmF0b3IucHJvdG90eXBlLnRvU291cmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoKX0sSXRlcmF0b3IucHJvdG90eXBlW1pdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGNyZWF0ZUNsYXNzKFNlcSxJdGVyYWJsZSksU2VxLm9mPWZ1bmN0aW9uKCl7cmV0dXJuIFNlcShhcmd1bWVudHMpfSxTZXEucHJvdG90eXBlLnRvU2VxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LFNlcS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJTZXEgeyIsIn0iKX0sU2VxLnByb3RvdHlwZS5jYWNoZVJlc3VsdD1mdW5jdGlvbigpe3JldHVybiF0aGlzLl9jYWNoZSYmdGhpcy5fX2l0ZXJhdGVVbmNhY2hlZCYmKHRoaXMuX2NhY2hlPXRoaXMuZW50cnlTZXEoKS50b0FycmF5KCksdGhpcy5zaXplPXRoaXMuX2NhY2hlLmxlbmd0aCksdGhpc30sU2VxLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gc2VxSXRlcmF0ZSh0aGlzLHMsbywhMCl9LFNlcS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihzLG8pe3JldHVybiBzZXFJdGVyYXRvcih0aGlzLHMsbywhMCl9LGNyZWF0ZUNsYXNzKEtleWVkU2VxLFNlcSksS2V5ZWRTZXEucHJvdG90eXBlLnRvS2V5ZWRTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sY3JlYXRlQ2xhc3MoSW5kZXhlZFNlcSxTZXEpLEluZGV4ZWRTZXEub2Y9ZnVuY3Rpb24oKXtyZXR1cm4gSW5kZXhlZFNlcShhcmd1bWVudHMpfSxJbmRleGVkU2VxLnByb3RvdHlwZS50b0luZGV4ZWRTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sSW5kZXhlZFNlcS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJTZXEgWyIsIl0iKX0sSW5kZXhlZFNlcS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHNlcUl0ZXJhdGUodGhpcyxzLG8sITEpfSxJbmRleGVkU2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHNlcUl0ZXJhdG9yKHRoaXMscyxvLCExKX0sY3JlYXRlQ2xhc3MoU2V0U2VxLFNlcSksU2V0U2VxLm9mPWZ1bmN0aW9uKCl7cmV0dXJuIFNldFNlcShhcmd1bWVudHMpfSxTZXRTZXEucHJvdG90eXBlLnRvU2V0U2VxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LFNlcS5pc1NlcT1pc1NlcSxTZXEuS2V5ZWQ9S2V5ZWRTZXEsU2VxLlNldD1TZXRTZXEsU2VxLkluZGV4ZWQ9SW5kZXhlZFNlcTt2YXIgZWUsaWUsYWUsY2U9IkBAX19JTU1VVEFCTEVfU0VRX19AQCI7ZnVuY3Rpb24gQXJyYXlTZXEocyl7dGhpcy5fYXJyYXk9cyx0aGlzLnNpemU9cy5sZW5ndGh9ZnVuY3Rpb24gT2JqZWN0U2VxKHMpe3ZhciBvPU9iamVjdC5rZXlzKHMpO3RoaXMuX29iamVjdD1zLHRoaXMuX2tleXM9byx0aGlzLnNpemU9by5sZW5ndGh9ZnVuY3Rpb24gSXRlcmFibGVTZXEocyl7dGhpcy5faXRlcmFibGU9cyx0aGlzLnNpemU9cy5sZW5ndGh8fHMuc2l6ZX1mdW5jdGlvbiBJdGVyYXRvclNlcShzKXt0aGlzLl9pdGVyYXRvcj1zLHRoaXMuX2l0ZXJhdG9yQ2FjaGU9W119ZnVuY3Rpb24gaXNTZXEocyl7cmV0dXJuISghc3x8IXNbY2VdKX1mdW5jdGlvbiBlbXB0eVNlcXVlbmNlKCl7cmV0dXJuIGVlfHwoZWU9bmV3IEFycmF5U2VxKFtdKSl9ZnVuY3Rpb24ga2V5ZWRTZXFGcm9tVmFsdWUocyl7dmFyIG89QXJyYXkuaXNBcnJheShzKT9uZXcgQXJyYXlTZXEocykuZnJvbUVudHJ5U2VxKCk6aXNJdGVyYXRvcihzKT9uZXcgSXRlcmF0b3JTZXEocykuZnJvbUVudHJ5U2VxKCk6aGFzSXRlcmF0b3Iocyk/bmV3IEl0ZXJhYmxlU2VxKHMpLmZyb21FbnRyeVNlcSgpOiJvYmplY3QiPT10eXBlb2Ygcz9uZXcgT2JqZWN0U2VxKHMpOnZvaWQgMDtpZighbyl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBBcnJheSBvciBpdGVyYWJsZSBvYmplY3Qgb2YgW2ssIHZdIGVudHJpZXMsIG9yIGtleWVkIG9iamVjdDogIitzKTtyZXR1cm4gb31mdW5jdGlvbiBpbmRleGVkU2VxRnJvbVZhbHVlKHMpe3ZhciBvPW1heWJlSW5kZXhlZFNlcUZyb21WYWx1ZShzKTtpZighbyl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBBcnJheSBvciBpdGVyYWJsZSBvYmplY3Qgb2YgdmFsdWVzOiAiK3MpO3JldHVybiBvfWZ1bmN0aW9uIHNlcUZyb21WYWx1ZShzKXt2YXIgbz1tYXliZUluZGV4ZWRTZXFGcm9tVmFsdWUocyl8fCJvYmplY3QiPT10eXBlb2YgcyYmbmV3IE9iamVjdFNlcShzKTtpZighbyl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBBcnJheSBvciBpdGVyYWJsZSBvYmplY3Qgb2YgdmFsdWVzLCBvciBrZXllZCBvYmplY3Q6ICIrcyk7cmV0dXJuIG99ZnVuY3Rpb24gbWF5YmVJbmRleGVkU2VxRnJvbVZhbHVlKHMpe3JldHVybiBpc0FycmF5TGlrZShzKT9uZXcgQXJyYXlTZXEocyk6aXNJdGVyYXRvcihzKT9uZXcgSXRlcmF0b3JTZXEocyk6aGFzSXRlcmF0b3Iocyk/bmV3IEl0ZXJhYmxlU2VxKHMpOnZvaWQgMH1mdW5jdGlvbiBzZXFJdGVyYXRlKHMsbyxpLGEpe3ZhciB1PXMuX2NhY2hlO2lmKHUpe2Zvcih2YXIgXz11Lmxlbmd0aC0xLHc9MDt3PD1fO3crKyl7dmFyIHg9dVtpP18tdzp3XTtpZighMT09PW8oeFsxXSxhP3hbMF06dyxzKSlyZXR1cm4gdysxfXJldHVybiB3fXJldHVybiBzLl9faXRlcmF0ZVVuY2FjaGVkKG8saSl9ZnVuY3Rpb24gc2VxSXRlcmF0b3IocyxvLGksYSl7dmFyIHU9cy5fY2FjaGU7aWYodSl7dmFyIF89dS5sZW5ndGgtMSx3PTA7cmV0dXJuIG5ldyBJdGVyYXRvcigoZnVuY3Rpb24oKXt2YXIgcz11W2k/Xy13OnddO3JldHVybiB3Kys+Xz9pdGVyYXRvckRvbmUoKTppdGVyYXRvclZhbHVlKG8sYT9zWzBdOnctMSxzWzFdKX0pKX1yZXR1cm4gcy5fX2l0ZXJhdG9yVW5jYWNoZWQobyxpKX1mdW5jdGlvbiBmcm9tSlMocyxvKXtyZXR1cm4gbz9mcm9tSlNXaXRoKG8scywiIix7IiI6c30pOmZyb21KU0RlZmF1bHQocyl9ZnVuY3Rpb24gZnJvbUpTV2l0aChzLG8saSxhKXtyZXR1cm4gQXJyYXkuaXNBcnJheShvKT9zLmNhbGwoYSxpLEluZGV4ZWRTZXEobykubWFwKChmdW5jdGlvbihpLGEpe3JldHVybiBmcm9tSlNXaXRoKHMsaSxhLG8pfSkpKTppc1BsYWluT2JqKG8pP3MuY2FsbChhLGksS2V5ZWRTZXEobykubWFwKChmdW5jdGlvbihpLGEpe3JldHVybiBmcm9tSlNXaXRoKHMsaSxhLG8pfSkpKTpvfWZ1bmN0aW9uIGZyb21KU0RlZmF1bHQocyl7cmV0dXJuIEFycmF5LmlzQXJyYXkocyk/SW5kZXhlZFNlcShzKS5tYXAoZnJvbUpTRGVmYXVsdCkudG9MaXN0KCk6aXNQbGFpbk9iaihzKT9LZXllZFNlcShzKS5tYXAoZnJvbUpTRGVmYXVsdCkudG9NYXAoKTpzfWZ1bmN0aW9uIGlzUGxhaW5PYmoocyl7cmV0dXJuIHMmJihzLmNvbnN0cnVjdG9yPT09T2JqZWN0fHx2b2lkIDA9PT1zLmNvbnN0cnVjdG9yKX1mdW5jdGlvbiBpcyhzLG8pe2lmKHM9PT1vfHxzIT1zJiZvIT1vKXJldHVybiEwO2lmKCFzfHwhbylyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygcy52YWx1ZU9mJiYiZnVuY3Rpb24iPT10eXBlb2Ygby52YWx1ZU9mKXtpZigocz1zLnZhbHVlT2YoKSk9PT0obz1vLnZhbHVlT2YoKSl8fHMhPXMmJm8hPW8pcmV0dXJuITA7aWYoIXN8fCFvKXJldHVybiExfXJldHVybiEoImZ1bmN0aW9uIiE9dHlwZW9mIHMuZXF1YWxzfHwiZnVuY3Rpb24iIT10eXBlb2Ygby5lcXVhbHN8fCFzLmVxdWFscyhvKSl9ZnVuY3Rpb24gZGVlcEVxdWFsKHMsbyl7aWYocz09PW8pcmV0dXJuITA7aWYoIWlzSXRlcmFibGUobyl8fHZvaWQgMCE9PXMuc2l6ZSYmdm9pZCAwIT09by5zaXplJiZzLnNpemUhPT1vLnNpemV8fHZvaWQgMCE9PXMuX19oYXNoJiZ2b2lkIDAhPT1vLl9faGFzaCYmcy5fX2hhc2ghPT1vLl9faGFzaHx8aXNLZXllZChzKSE9PWlzS2V5ZWQobyl8fGlzSW5kZXhlZChzKSE9PWlzSW5kZXhlZChvKXx8aXNPcmRlcmVkKHMpIT09aXNPcmRlcmVkKG8pKXJldHVybiExO2lmKDA9PT1zLnNpemUmJjA9PT1vLnNpemUpcmV0dXJuITA7dmFyIGk9IWlzQXNzb2NpYXRpdmUocyk7aWYoaXNPcmRlcmVkKHMpKXt2YXIgYT1zLmVudHJpZXMoKTtyZXR1cm4gby5ldmVyeSgoZnVuY3Rpb24ocyxvKXt2YXIgdT1hLm5leHQoKS52YWx1ZTtyZXR1cm4gdSYmaXModVsxXSxzKSYmKGl8fGlzKHVbMF0sbykpfSkpJiZhLm5leHQoKS5kb25lfXZhciB1PSExO2lmKHZvaWQgMD09PXMuc2l6ZSlpZih2b2lkIDA9PT1vLnNpemUpImZ1bmN0aW9uIj09dHlwZW9mIHMuY2FjaGVSZXN1bHQmJnMuY2FjaGVSZXN1bHQoKTtlbHNle3U9ITA7dmFyIF89cztzPW8sbz1ffXZhciB3PSEwLHg9by5fX2l0ZXJhdGUoKGZ1bmN0aW9uKG8sYSl7aWYoaT8hcy5oYXMobyk6dT8haXMobyxzLmdldChhLGopKTohaXMocy5nZXQoYSxqKSxvKSlyZXR1cm4gdz0hMSwhMX0pKTtyZXR1cm4gdyYmcy5zaXplPT09eH1mdW5jdGlvbiBSZXBlYXQocyxvKXtpZighKHRoaXMgaW5zdGFuY2VvZiBSZXBlYXQpKXJldHVybiBuZXcgUmVwZWF0KHMsbyk7aWYodGhpcy5fdmFsdWU9cyx0aGlzLnNpemU9dm9pZCAwPT09bz8xLzA6TWF0aC5tYXgoMCxvKSwwPT09dGhpcy5zaXplKXtpZihpZSlyZXR1cm4gaWU7aWU9dGhpc319ZnVuY3Rpb24gaW52YXJpYW50KHMsbyl7aWYoIXMpdGhyb3cgbmV3IEVycm9yKG8pfWZ1bmN0aW9uIFJhbmdlKHMsbyxpKXtpZighKHRoaXMgaW5zdGFuY2VvZiBSYW5nZSkpcmV0dXJuIG5ldyBSYW5nZShzLG8saSk7aWYoaW52YXJpYW50KDAhPT1pLCJDYW5ub3Qgc3RlcCBhIFJhbmdlIGJ5IDAiKSxzPXN8fDAsdm9pZCAwPT09byYmKG89MS8wKSxpPXZvaWQgMD09PWk/MTpNYXRoLmFicyhpKSxvPHMmJihpPS1pKSx0aGlzLl9zdGFydD1zLHRoaXMuX2VuZD1vLHRoaXMuX3N0ZXA9aSx0aGlzLnNpemU9TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG8tcykvaS0xKSsxKSwwPT09dGhpcy5zaXplKXtpZihhZSlyZXR1cm4gYWU7YWU9dGhpc319ZnVuY3Rpb24gQ29sbGVjdGlvbigpe3Rocm93IFR5cGVFcnJvcigiQWJzdHJhY3QiKX1mdW5jdGlvbiBLZXllZENvbGxlY3Rpb24oKXt9ZnVuY3Rpb24gSW5kZXhlZENvbGxlY3Rpb24oKXt9ZnVuY3Rpb24gU2V0Q29sbGVjdGlvbigpe31TZXEucHJvdG90eXBlW2NlXT0hMCxjcmVhdGVDbGFzcyhBcnJheVNlcSxJbmRleGVkU2VxKSxBcnJheVNlcS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHRoaXMuaGFzKHMpP3RoaXMuX2FycmF5W3dyYXBJbmRleCh0aGlzLHMpXTpvfSxBcnJheVNlcS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHMsbyl7Zm9yKHZhciBpPXRoaXMuX2FycmF5LGE9aS5sZW5ndGgtMSx1PTA7dTw9YTt1KyspaWYoITE9PT1zKGlbbz9hLXU6dV0sdSx0aGlzKSlyZXR1cm4gdSsxO3JldHVybiB1fSxBcnJheVNlcS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihzLG8pe3ZhciBpPXRoaXMuX2FycmF5LGE9aS5sZW5ndGgtMSx1PTA7cmV0dXJuIG5ldyBJdGVyYXRvcigoZnVuY3Rpb24oKXtyZXR1cm4gdT5hP2l0ZXJhdG9yRG9uZSgpOml0ZXJhdG9yVmFsdWUocyx1LGlbbz9hLXUrKzp1KytdKX0pKX0sY3JlYXRlQ2xhc3MoT2JqZWN0U2VxLEtleWVkU2VxKSxPYmplY3RTZXEucHJvdG90eXBlLmdldD1mdW5jdGlvbihzLG8pe3JldHVybiB2b2lkIDA9PT1vfHx0aGlzLmhhcyhzKT90aGlzLl9vYmplY3Rbc106b30sT2JqZWN0U2VxLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuX29iamVjdC5oYXNPd25Qcm9wZXJ0eShzKX0sT2JqZWN0U2VxLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24ocyxvKXtmb3IodmFyIGk9dGhpcy5fb2JqZWN0LGE9dGhpcy5fa2V5cyx1PWEubGVuZ3RoLTEsXz0wO188PXU7XysrKXt2YXIgdz1hW28/dS1fOl9dO2lmKCExPT09cyhpW3ddLHcsdGhpcykpcmV0dXJuIF8rMX1yZXR1cm4gX30sT2JqZWN0U2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHMsbyl7dmFyIGk9dGhpcy5fb2JqZWN0LGE9dGhpcy5fa2V5cyx1PWEubGVuZ3RoLTEsXz0wO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7dmFyIHc9YVtvP3UtXzpfXTtyZXR1cm4gXysrPnU/aXRlcmF0b3JEb25lKCk6aXRlcmF0b3JWYWx1ZShzLHcsaVt3XSl9KSl9LE9iamVjdFNlcS5wcm90b3R5cGVbdV09ITAsY3JlYXRlQ2xhc3MoSXRlcmFibGVTZXEsSW5kZXhlZFNlcSksSXRlcmFibGVTZXEucHJvdG90eXBlLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKHMsbyl7aWYobylyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShzLG8pO3ZhciBpPWdldEl0ZXJhdG9yKHRoaXMuX2l0ZXJhYmxlKSxhPTA7aWYoaXNJdGVyYXRvcihpKSlmb3IodmFyIHU7ISh1PWkubmV4dCgpKS5kb25lJiYhMSE9PXModS52YWx1ZSxhKyssdGhpcyk7KTtyZXR1cm4gYX0sSXRlcmFibGVTZXEucHJvdG90eXBlLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbihzLG8pe2lmKG8pcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKHMsbyk7dmFyIGk9Z2V0SXRlcmF0b3IodGhpcy5faXRlcmFibGUpO2lmKCFpc0l0ZXJhdG9yKGkpKXJldHVybiBuZXcgSXRlcmF0b3IoaXRlcmF0b3JEb25lKTt2YXIgYT0wO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7dmFyIG89aS5uZXh0KCk7cmV0dXJuIG8uZG9uZT9vOml0ZXJhdG9yVmFsdWUocyxhKyssby52YWx1ZSl9KSl9LGNyZWF0ZUNsYXNzKEl0ZXJhdG9yU2VxLEluZGV4ZWRTZXEpLEl0ZXJhdG9yU2VxLnByb3RvdHlwZS5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihzLG8pe2lmKG8pcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdGUocyxvKTtmb3IodmFyIGksYT10aGlzLl9pdGVyYXRvcix1PXRoaXMuX2l0ZXJhdG9yQ2FjaGUsXz0wO188dS5sZW5ndGg7KWlmKCExPT09cyh1W19dLF8rKyx0aGlzKSlyZXR1cm4gXztmb3IoOyEoaT1hLm5leHQoKSkuZG9uZTspe3ZhciB3PWkudmFsdWU7aWYodVtfXT13LCExPT09cyh3LF8rKyx0aGlzKSlicmVha31yZXR1cm4gX30sSXRlcmF0b3JTZXEucHJvdG90eXBlLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbihzLG8pe2lmKG8pcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKHMsbyk7dmFyIGk9dGhpcy5faXRlcmF0b3IsYT10aGlzLl9pdGVyYXRvckNhY2hlLHU9MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe2lmKHU+PWEubGVuZ3RoKXt2YXIgbz1pLm5leHQoKTtpZihvLmRvbmUpcmV0dXJuIG87YVt1XT1vLnZhbHVlfXJldHVybiBpdGVyYXRvclZhbHVlKHMsdSxhW3UrK10pfSkpfSxjcmVhdGVDbGFzcyhSZXBlYXQsSW5kZXhlZFNlcSksUmVwZWF0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5zaXplPyJSZXBlYXQgW10iOiJSZXBlYXQgWyAiK3RoaXMuX3ZhbHVlKyIgIit0aGlzLnNpemUrIiB0aW1lcyBdIn0sUmVwZWF0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdGhpcy5oYXMocyk/dGhpcy5fdmFsdWU6b30sUmVwZWF0LnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihzKXtyZXR1cm4gaXModGhpcy5fdmFsdWUscyl9LFJlcGVhdC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24ocyxvKXt2YXIgaT10aGlzLnNpemU7cmV0dXJuIHdob2xlU2xpY2UocyxvLGkpP3RoaXM6bmV3IFJlcGVhdCh0aGlzLl92YWx1ZSxyZXNvbHZlRW5kKG8saSktcmVzb2x2ZUJlZ2luKHMsaSkpfSxSZXBlYXQucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sUmVwZWF0LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHMpe3JldHVybiBpcyh0aGlzLl92YWx1ZSxzKT8wOi0xfSxSZXBlYXQucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHMpe3JldHVybiBpcyh0aGlzLl92YWx1ZSxzKT90aGlzLnNpemU6LTF9LFJlcGVhdC5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHMsbyl7Zm9yKHZhciBpPTA7aTx0aGlzLnNpemU7aSsrKWlmKCExPT09cyh0aGlzLl92YWx1ZSxpLHRoaXMpKXJldHVybiBpKzE7cmV0dXJuIGl9LFJlcGVhdC5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihzLG8pe3ZhciBpPXRoaXMsYT0wO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7cmV0dXJuIGE8aS5zaXplP2l0ZXJhdG9yVmFsdWUocyxhKyssaS5fdmFsdWUpOml0ZXJhdG9yRG9uZSgpfSkpfSxSZXBlYXQucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihzKXtyZXR1cm4gcyBpbnN0YW5jZW9mIFJlcGVhdD9pcyh0aGlzLl92YWx1ZSxzLl92YWx1ZSk6ZGVlcEVxdWFsKHMpfSxjcmVhdGVDbGFzcyhSYW5nZSxJbmRleGVkU2VxKSxSYW5nZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuc2l6ZT8iUmFuZ2UgW10iOiJSYW5nZSBbICIrdGhpcy5fc3RhcnQrIi4uLiIrdGhpcy5fZW5kKygxIT09dGhpcy5fc3RlcD8iIGJ5ICIrdGhpcy5fc3RlcDoiIikrIiBdIn0sUmFuZ2UucHJvdG90eXBlLmdldD1mdW5jdGlvbihzLG8pe3JldHVybiB0aGlzLmhhcyhzKT90aGlzLl9zdGFydCt3cmFwSW5kZXgodGhpcyxzKSp0aGlzLl9zdGVwOm99LFJhbmdlLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihzKXt2YXIgbz0ocy10aGlzLl9zdGFydCkvdGhpcy5fc3RlcDtyZXR1cm4gbz49MCYmbzx0aGlzLnNpemUmJm89PT1NYXRoLmZsb29yKG8pfSxSYW5nZS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gd2hvbGVTbGljZShzLG8sdGhpcy5zaXplKT90aGlzOihzPXJlc29sdmVCZWdpbihzLHRoaXMuc2l6ZSksKG89cmVzb2x2ZUVuZChvLHRoaXMuc2l6ZSkpPD1zP25ldyBSYW5nZSgwLDApOm5ldyBSYW5nZSh0aGlzLmdldChzLHRoaXMuX2VuZCksdGhpcy5nZXQobyx0aGlzLl9lbmQpLHRoaXMuX3N0ZXApKX0sUmFuZ2UucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24ocyl7dmFyIG89cy10aGlzLl9zdGFydDtpZihvJXRoaXMuX3N0ZXA9PTApe3ZhciBpPW8vdGhpcy5fc3RlcDtpZihpPj0wJiZpPHRoaXMuc2l6ZSlyZXR1cm4gaX1yZXR1cm4tMX0sUmFuZ2UucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLmluZGV4T2Yocyl9LFJhbmdlLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24ocyxvKXtmb3IodmFyIGk9dGhpcy5zaXplLTEsYT10aGlzLl9zdGVwLHU9bz90aGlzLl9zdGFydCtpKmE6dGhpcy5fc3RhcnQsXz0wO188PWk7XysrKXtpZighMT09PXModSxfLHRoaXMpKXJldHVybiBfKzE7dSs9bz8tYTphfXJldHVybiBffSxSYW5nZS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihzLG8pe3ZhciBpPXRoaXMuc2l6ZS0xLGE9dGhpcy5fc3RlcCx1PW8/dGhpcy5fc3RhcnQraSphOnRoaXMuX3N0YXJ0LF89MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciB3PXU7cmV0dXJuIHUrPW8/LWE6YSxfPmk/aXRlcmF0b3JEb25lKCk6aXRlcmF0b3JWYWx1ZShzLF8rKyx3KX0pKX0sUmFuZ2UucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihzKXtyZXR1cm4gcyBpbnN0YW5jZW9mIFJhbmdlP3RoaXMuX3N0YXJ0PT09cy5fc3RhcnQmJnRoaXMuX2VuZD09PXMuX2VuZCYmdGhpcy5fc3RlcD09PXMuX3N0ZXA6ZGVlcEVxdWFsKHRoaXMscyl9LGNyZWF0ZUNsYXNzKENvbGxlY3Rpb24sSXRlcmFibGUpLGNyZWF0ZUNsYXNzKEtleWVkQ29sbGVjdGlvbixDb2xsZWN0aW9uKSxjcmVhdGVDbGFzcyhJbmRleGVkQ29sbGVjdGlvbixDb2xsZWN0aW9uKSxjcmVhdGVDbGFzcyhTZXRDb2xsZWN0aW9uLENvbGxlY3Rpb24pLENvbGxlY3Rpb24uS2V5ZWQ9S2V5ZWRDb2xsZWN0aW9uLENvbGxlY3Rpb24uSW5kZXhlZD1JbmRleGVkQ29sbGVjdGlvbixDb2xsZWN0aW9uLlNldD1TZXRDb2xsZWN0aW9uO3ZhciBsZT0iZnVuY3Rpb24iPT10eXBlb2YgTWF0aC5pbXVsJiYtMj09PU1hdGguaW11bCg0Mjk0OTY3Mjk1LDIpP01hdGguaW11bDpmdW5jdGlvbiBpbXVsKHMsbyl7dmFyIGk9NjU1MzUmKHN8PTApLGE9NjU1MzUmKG98PTApO3JldHVybiBpKmErKChzPj4+MTYpKmEraSoobz4+PjE2KTw8MTY+Pj4wKXwwfTtmdW5jdGlvbiBzbWkocyl7cmV0dXJuIHM+Pj4xJjEwNzM3NDE4MjR8MzIyMTIyNTQ3MSZzfWZ1bmN0aW9uIGhhc2gocyl7aWYoITE9PT1zfHxudWxsPT1zKXJldHVybiAwO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBzLnZhbHVlT2YmJighMT09PShzPXMudmFsdWVPZigpKXx8bnVsbD09cykpcmV0dXJuIDA7aWYoITA9PT1zKXJldHVybiAxO3ZhciBvPXR5cGVvZiBzO2lmKCJudW1iZXIiPT09byl7aWYocyE9c3x8cz09PTEvMClyZXR1cm4gMDt2YXIgaT0wfHM7Zm9yKGkhPT1zJiYoaV49NDI5NDk2NzI5NSpzKTtzPjQyOTQ5NjcyOTU7KWlePXMvPTQyOTQ5NjcyOTU7cmV0dXJuIHNtaShpKX1pZigic3RyaW5nIj09PW8pcmV0dXJuIHMubGVuZ3RoPl9lP2NhY2hlZEhhc2hTdHJpbmcocyk6aGFzaFN0cmluZyhzKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygcy5oYXNoQ29kZSlyZXR1cm4gcy5oYXNoQ29kZSgpO2lmKCJvYmplY3QiPT09bylyZXR1cm4gaGFzaEpTT2JqKHMpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBzLnRvU3RyaW5nKXJldHVybiBoYXNoU3RyaW5nKHMudG9TdHJpbmcoKSk7dGhyb3cgbmV3IEVycm9yKCJWYWx1ZSB0eXBlICIrbysiIGNhbm5vdCBiZSBoYXNoZWQuIil9ZnVuY3Rpb24gY2FjaGVkSGFzaFN0cmluZyhzKXt2YXIgbz1QZVtzXTtyZXR1cm4gdm9pZCAwPT09byYmKG89aGFzaFN0cmluZyhzKSx4ZT09PXdlJiYoeGU9MCxQZT17fSkseGUrKyxQZVtzXT1vKSxvfWZ1bmN0aW9uIGhhc2hTdHJpbmcocyl7Zm9yKHZhciBvPTAsaT0wO2k8cy5sZW5ndGg7aSsrKW89MzEqbytzLmNoYXJDb2RlQXQoaSl8MDtyZXR1cm4gc21pKG8pfWZ1bmN0aW9uIGhhc2hKU09iaihzKXt2YXIgbztpZih5ZSYmdm9pZCAwIT09KG89ZmUuZ2V0KHMpKSlyZXR1cm4gbztpZih2b2lkIDAhPT0obz1zW1NlXSkpcmV0dXJuIG87aWYoIWRlKXtpZih2b2lkIDAhPT0obz1zLnByb3BlcnR5SXNFbnVtZXJhYmxlJiZzLnByb3BlcnR5SXNFbnVtZXJhYmxlW1NlXSkpcmV0dXJuIG87aWYodm9pZCAwIT09KG89Z2V0SUVOb2RlSGFzaChzKSkpcmV0dXJuIG99aWYobz0rK2JlLDEwNzM3NDE4MjQmYmUmJihiZT0wKSx5ZSlmZS5zZXQocyxvKTtlbHNle2lmKHZvaWQgMCE9PXBlJiYhMT09PXBlKHMpKXRocm93IG5ldyBFcnJvcigiTm9uLWV4dGVuc2libGUgb2JqZWN0cyBhcmUgbm90IGFsbG93ZWQgYXMga2V5cy4iKTtpZihkZSlPYmplY3QuZGVmaW5lUHJvcGVydHkocyxTZSx7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITEsd3JpdGFibGU6ITEsdmFsdWU6b30pO2Vsc2UgaWYodm9pZCAwIT09cy5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmcy5wcm9wZXJ0eUlzRW51bWVyYWJsZT09PXMuY29uc3RydWN0b3IucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlKXMucHJvcGVydHlJc0VudW1lcmFibGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzLnByb3BlcnR5SXNFbnVtZXJhYmxlW1NlXT1vO2Vsc2V7aWYodm9pZCAwPT09cy5ub2RlVHlwZSl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBzZXQgYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSBvbiBvYmplY3QuIik7c1tTZV09b319cmV0dXJuIG99dmFyIHBlPU9iamVjdC5pc0V4dGVuc2libGUsZGU9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiQCIse30pLCEwfWNhdGNoKHMpe3JldHVybiExfX0oKTtmdW5jdGlvbiBnZXRJRU5vZGVIYXNoKHMpe2lmKHMmJnMubm9kZVR5cGU+MClzd2l0Y2gocy5ub2RlVHlwZSl7Y2FzZSAxOnJldHVybiBzLnVuaXF1ZUlEO2Nhc2UgOTpyZXR1cm4gcy5kb2N1bWVudEVsZW1lbnQmJnMuZG9jdW1lbnRFbGVtZW50LnVuaXF1ZUlEfX12YXIgZmUseWU9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtNYXA7eWUmJihmZT1uZXcgV2Vha01hcCk7dmFyIGJlPTAsU2U9Il9faW1tdXRhYmxlaGFzaF9fIjsiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoU2U9U3ltYm9sKFNlKSk7dmFyIF9lPTE2LHdlPTI1NSx4ZT0wLFBlPXt9O2Z1bmN0aW9uIGFzc2VydE5vdEluZmluaXRlKHMpe2ludmFyaWFudChzIT09MS8wLCJDYW5ub3QgcGVyZm9ybSB0aGlzIGFjdGlvbiB3aXRoIGFuIGluZmluaXRlIHNpemUuIil9ZnVuY3Rpb24gTWFwKHMpe3JldHVybiBudWxsPT1zP2VtcHR5TWFwKCk6aXNNYXAocykmJiFpc09yZGVyZWQocyk/czplbXB0eU1hcCgpLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKG8pe3ZhciBpPUtleWVkSXRlcmFibGUocyk7YXNzZXJ0Tm90SW5maW5pdGUoaS5zaXplKSxpLmZvckVhY2goKGZ1bmN0aW9uKHMsaSl7cmV0dXJuIG8uc2V0KGkscyl9KSl9KSl9ZnVuY3Rpb24gaXNNYXAocyl7cmV0dXJuISghc3x8IXNbUmVdKX1jcmVhdGVDbGFzcyhNYXAsS2V5ZWRDb2xsZWN0aW9uKSxNYXAub2Y9ZnVuY3Rpb24oKXt2YXIgbz1zLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiBlbXB0eU1hcCgpLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKHMpe2Zvcih2YXIgaT0wO2k8by5sZW5ndGg7aSs9Mil7aWYoaSsxPj1vLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgdmFsdWUgZm9yIGtleTogIitvW2ldKTtzLnNldChvW2ldLG9baSsxXSl9fSkpfSxNYXAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiTWFwIHsiLCJ9Iil9LE1hcC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHRoaXMuX3Jvb3Q/dGhpcy5fcm9vdC5nZXQoMCx2b2lkIDAscyxvKTpvfSxNYXAucHJvdG90eXBlLnNldD1mdW5jdGlvbihzLG8pe3JldHVybiB1cGRhdGVNYXAodGhpcyxzLG8pfSxNYXAucHJvdG90eXBlLnNldEluPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHRoaXMudXBkYXRlSW4ocyxqLChmdW5jdGlvbigpe3JldHVybiBvfSkpfSxNYXAucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihzKXtyZXR1cm4gdXBkYXRlTWFwKHRoaXMscyxqKX0sTWFwLnByb3RvdHlwZS5kZWxldGVJbj1mdW5jdGlvbihzKXtyZXR1cm4gdGhpcy51cGRhdGVJbihzLChmdW5jdGlvbigpe3JldHVybiBqfSkpfSxNYXAucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihzLG8saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3ModGhpcyk6dGhpcy51cGRhdGVJbihbc10sbyxpKX0sTWFwLnByb3RvdHlwZS51cGRhdGVJbj1mdW5jdGlvbihzLG8saSl7aXx8KGk9byxvPXZvaWQgMCk7dmFyIGE9dXBkYXRlSW5EZWVwTWFwKHRoaXMsZm9yY2VJdGVyYXRvcihzKSxvLGkpO3JldHVybiBhPT09aj92b2lkIDA6YX0sTWFwLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5zaXplP3RoaXM6dGhpcy5fX293bmVySUQ/KHRoaXMuc2l6ZT0wLHRoaXMuX3Jvb3Q9bnVsbCx0aGlzLl9faGFzaD12b2lkIDAsdGhpcy5fX2FsdGVyZWQ9ITAsdGhpcyk6ZW1wdHlNYXAoKX0sTWFwLnByb3RvdHlwZS5tZXJnZT1mdW5jdGlvbigpe3JldHVybiBtZXJnZUludG9NYXBXaXRoKHRoaXMsdm9pZCAwLGFyZ3VtZW50cyl9LE1hcC5wcm90b3R5cGUubWVyZ2VXaXRoPWZ1bmN0aW9uKG8pe3JldHVybiBtZXJnZUludG9NYXBXaXRoKHRoaXMsbyxzLmNhbGwoYXJndW1lbnRzLDEpKX0sTWFwLnByb3RvdHlwZS5tZXJnZUluPWZ1bmN0aW9uKG8pe3ZhciBpPXMuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIHRoaXMudXBkYXRlSW4obyxlbXB0eU1hcCgpLChmdW5jdGlvbihzKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygcy5tZXJnZT9zLm1lcmdlLmFwcGx5KHMsaSk6aVtpLmxlbmd0aC0xXX0pKX0sTWFwLnByb3RvdHlwZS5tZXJnZURlZXA9ZnVuY3Rpb24oKXtyZXR1cm4gbWVyZ2VJbnRvTWFwV2l0aCh0aGlzLGRlZXBNZXJnZXIsYXJndW1lbnRzKX0sTWFwLnByb3RvdHlwZS5tZXJnZURlZXBXaXRoPWZ1bmN0aW9uKG8pe3ZhciBpPXMuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIG1lcmdlSW50b01hcFdpdGgodGhpcyxkZWVwTWVyZ2VyV2l0aChvKSxpKX0sTWFwLnByb3RvdHlwZS5tZXJnZURlZXBJbj1mdW5jdGlvbihvKXt2YXIgaT1zLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0aGlzLnVwZGF0ZUluKG8sZW1wdHlNYXAoKSwoZnVuY3Rpb24ocyl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHMubWVyZ2VEZWVwP3MubWVyZ2VEZWVwLmFwcGx5KHMsaSk6aVtpLmxlbmd0aC0xXX0pKX0sTWFwLnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKHMpe3JldHVybiBPcmRlcmVkTWFwKHNvcnRGYWN0b3J5KHRoaXMscykpfSxNYXAucHJvdG90eXBlLnNvcnRCeT1mdW5jdGlvbihzLG8pe3JldHVybiBPcmRlcmVkTWFwKHNvcnRGYWN0b3J5KHRoaXMsbyxzKSl9LE1hcC5wcm90b3R5cGUud2l0aE11dGF0aW9ucz1mdW5jdGlvbihzKXt2YXIgbz10aGlzLmFzTXV0YWJsZSgpO3JldHVybiBzKG8pLG8ud2FzQWx0ZXJlZCgpP28uX19lbnN1cmVPd25lcih0aGlzLl9fb3duZXJJRCk6dGhpc30sTWFwLnByb3RvdHlwZS5hc011dGFibGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX293bmVySUQ/dGhpczp0aGlzLl9fZW5zdXJlT3duZXIobmV3IE93bmVySUQpfSxNYXAucHJvdG90eXBlLmFzSW1tdXRhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19lbnN1cmVPd25lcigpfSxNYXAucHJvdG90eXBlLndhc0FsdGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2FsdGVyZWR9LE1hcC5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihzLG8pe3JldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcyxzLG8pfSxNYXAucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbihzLG8pe3ZhciBpPXRoaXMsYT0wO3JldHVybiB0aGlzLl9yb290JiZ0aGlzLl9yb290Lml0ZXJhdGUoKGZ1bmN0aW9uKG8pe3JldHVybiBhKysscyhvWzFdLG9bMF0saSl9KSxvKSxhfSxNYXAucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24ocyl7cmV0dXJuIHM9PT10aGlzLl9fb3duZXJJRD90aGlzOnM/bWFrZU1hcCh0aGlzLnNpemUsdGhpcy5fcm9vdCxzLHRoaXMuX19oYXNoKToodGhpcy5fX293bmVySUQ9cyx0aGlzLl9fYWx0ZXJlZD0hMSx0aGlzKX0sTWFwLmlzTWFwPWlzTWFwO3ZhciBUZSxSZT0iQEBfX0lNTVVUQUJMRV9NQVBfX0BAIiwkZT1NYXAucHJvdG90eXBlO2Z1bmN0aW9uIEFycmF5TWFwTm9kZShzLG8pe3RoaXMub3duZXJJRD1zLHRoaXMuZW50cmllcz1vfWZ1bmN0aW9uIEJpdG1hcEluZGV4ZWROb2RlKHMsbyxpKXt0aGlzLm93bmVySUQ9cyx0aGlzLmJpdG1hcD1vLHRoaXMubm9kZXM9aX1mdW5jdGlvbiBIYXNoQXJyYXlNYXBOb2RlKHMsbyxpKXt0aGlzLm93bmVySUQ9cyx0aGlzLmNvdW50PW8sdGhpcy5ub2Rlcz1pfWZ1bmN0aW9uIEhhc2hDb2xsaXNpb25Ob2RlKHMsbyxpKXt0aGlzLm93bmVySUQ9cyx0aGlzLmtleUhhc2g9byx0aGlzLmVudHJpZXM9aX1mdW5jdGlvbiBWYWx1ZU5vZGUocyxvLGkpe3RoaXMub3duZXJJRD1zLHRoaXMua2V5SGFzaD1vLHRoaXMuZW50cnk9aX1mdW5jdGlvbiBNYXBJdGVyYXRvcihzLG8saSl7dGhpcy5fdHlwZT1vLHRoaXMuX3JldmVyc2U9aSx0aGlzLl9zdGFjaz1zLl9yb290JiZtYXBJdGVyYXRvckZyYW1lKHMuX3Jvb3QpfWZ1bmN0aW9uIG1hcEl0ZXJhdG9yVmFsdWUocyxvKXtyZXR1cm4gaXRlcmF0b3JWYWx1ZShzLG9bMF0sb1sxXSl9ZnVuY3Rpb24gbWFwSXRlcmF0b3JGcmFtZShzLG8pe3JldHVybntub2RlOnMsaW5kZXg6MCxfX3ByZXY6b319ZnVuY3Rpb24gbWFrZU1hcChzLG8saSxhKXt2YXIgdT1PYmplY3QuY3JlYXRlKCRlKTtyZXR1cm4gdS5zaXplPXMsdS5fcm9vdD1vLHUuX19vd25lcklEPWksdS5fX2hhc2g9YSx1Ll9fYWx0ZXJlZD0hMSx1fWZ1bmN0aW9uIGVtcHR5TWFwKCl7cmV0dXJuIFRlfHwoVGU9bWFrZU1hcCgwKSl9ZnVuY3Rpb24gdXBkYXRlTWFwKHMsbyxpKXt2YXIgYSx1O2lmKHMuX3Jvb3Qpe3ZhciBfPU1ha2VSZWYoTCksdz1NYWtlUmVmKEIpO2lmKGE9dXBkYXRlTm9kZShzLl9yb290LHMuX19vd25lcklELDAsdm9pZCAwLG8saSxfLHcpLCF3LnZhbHVlKXJldHVybiBzO3U9cy5zaXplKyhfLnZhbHVlP2k9PT1qPy0xOjE6MCl9ZWxzZXtpZihpPT09ailyZXR1cm4gczt1PTEsYT1uZXcgQXJyYXlNYXBOb2RlKHMuX19vd25lcklELFtbbyxpXV0pfXJldHVybiBzLl9fb3duZXJJRD8ocy5zaXplPXUscy5fcm9vdD1hLHMuX19oYXNoPXZvaWQgMCxzLl9fYWx0ZXJlZD0hMCxzKTphP21ha2VNYXAodSxhKTplbXB0eU1hcCgpfWZ1bmN0aW9uIHVwZGF0ZU5vZGUocyxvLGksYSx1LF8sdyx4KXtyZXR1cm4gcz9zLnVwZGF0ZShvLGksYSx1LF8sdyx4KTpfPT09aj9zOihTZXRSZWYoeCksU2V0UmVmKHcpLG5ldyBWYWx1ZU5vZGUobyxhLFt1LF9dKSl9ZnVuY3Rpb24gaXNMZWFmTm9kZShzKXtyZXR1cm4gcy5jb25zdHJ1Y3Rvcj09PVZhbHVlTm9kZXx8cy5jb25zdHJ1Y3Rvcj09PUhhc2hDb2xsaXNpb25Ob2RlfWZ1bmN0aW9uIG1lcmdlSW50b05vZGUocyxvLGksYSx1KXtpZihzLmtleUhhc2g9PT1hKXJldHVybiBuZXcgSGFzaENvbGxpc2lvbk5vZGUobyxhLFtzLmVudHJ5LHVdKTt2YXIgXyx4PSgwPT09aT9zLmtleUhhc2g6cy5rZXlIYXNoPj4+aSkmQyxqPSgwPT09aT9hOmE+Pj5pKSZDO3JldHVybiBuZXcgQml0bWFwSW5kZXhlZE5vZGUobywxPDx4fDE8PGoseD09PWo/W21lcmdlSW50b05vZGUocyxvLGkrdyxhLHUpXTooXz1uZXcgVmFsdWVOb2RlKG8sYSx1KSx4PGo/W3MsX106W18sc10pKX1mdW5jdGlvbiBjcmVhdGVOb2RlcyhzLG8saSxhKXtzfHwocz1uZXcgT3duZXJJRCk7Zm9yKHZhciB1PW5ldyBWYWx1ZU5vZGUocyxoYXNoKGkpLFtpLGFdKSxfPTA7XzxvLmxlbmd0aDtfKyspe3ZhciB3PW9bX107dT11LnVwZGF0ZShzLDAsdm9pZCAwLHdbMF0sd1sxXSl9cmV0dXJuIHV9ZnVuY3Rpb24gcGFja05vZGVzKHMsbyxpLGEpe2Zvcih2YXIgdT0wLF89MCx3PW5ldyBBcnJheShpKSx4PTAsQz0xLGo9by5sZW5ndGg7eDxqO3grKyxDPDw9MSl7dmFyIEw9b1t4XTt2b2lkIDAhPT1MJiZ4IT09YSYmKHV8PUMsd1tfKytdPUwpfXJldHVybiBuZXcgQml0bWFwSW5kZXhlZE5vZGUocyx1LHcpfWZ1bmN0aW9uIGV4cGFuZE5vZGVzKHMsbyxpLGEsdSl7Zm9yKHZhciBfPTAsdz1uZXcgQXJyYXkoeCksQz0wOzAhPT1pO0MrKyxpPj4+PTEpd1tDXT0xJmk/b1tfKytdOnZvaWQgMDtyZXR1cm4gd1thXT11LG5ldyBIYXNoQXJyYXlNYXBOb2RlKHMsXysxLHcpfWZ1bmN0aW9uIG1lcmdlSW50b01hcFdpdGgocyxvLGkpe2Zvcih2YXIgYT1bXSx1PTA7dTxpLmxlbmd0aDt1Kyspe3ZhciBfPWlbdV0sdz1LZXllZEl0ZXJhYmxlKF8pO2lzSXRlcmFibGUoXyl8fCh3PXcubWFwKChmdW5jdGlvbihzKXtyZXR1cm4gZnJvbUpTKHMpfSkpKSxhLnB1c2godyl9cmV0dXJuIG1lcmdlSW50b0NvbGxlY3Rpb25XaXRoKHMsbyxhKX1mdW5jdGlvbiBkZWVwTWVyZ2VyKHMsbyxpKXtyZXR1cm4gcyYmcy5tZXJnZURlZXAmJmlzSXRlcmFibGUobyk/cy5tZXJnZURlZXAobyk6aXMocyxvKT9zOm99ZnVuY3Rpb24gZGVlcE1lcmdlcldpdGgocyl7cmV0dXJuIGZ1bmN0aW9uKG8saSxhKXtpZihvJiZvLm1lcmdlRGVlcFdpdGgmJmlzSXRlcmFibGUoaSkpcmV0dXJuIG8ubWVyZ2VEZWVwV2l0aChzLGkpO3ZhciB1PXMobyxpLGEpO3JldHVybiBpcyhvLHUpP286dX19ZnVuY3Rpb24gbWVyZ2VJbnRvQ29sbGVjdGlvbldpdGgocyxvLGkpe3JldHVybiAwPT09KGk9aS5maWx0ZXIoKGZ1bmN0aW9uKHMpe3JldHVybiAwIT09cy5zaXplfSkpKS5sZW5ndGg/czowIT09cy5zaXplfHxzLl9fb3duZXJJRHx8MSE9PWkubGVuZ3RoP3Mud2l0aE11dGF0aW9ucygoZnVuY3Rpb24ocyl7Zm9yKHZhciBhPW8/ZnVuY3Rpb24oaSxhKXtzLnVwZGF0ZShhLGosKGZ1bmN0aW9uKHMpe3JldHVybiBzPT09aj9pOm8ocyxpLGEpfSkpfTpmdW5jdGlvbihvLGkpe3Muc2V0KGksbyl9LHU9MDt1PGkubGVuZ3RoO3UrKylpW3VdLmZvckVhY2goYSl9KSk6cy5jb25zdHJ1Y3RvcihpWzBdKX1mdW5jdGlvbiB1cGRhdGVJbkRlZXBNYXAocyxvLGksYSl7dmFyIHU9cz09PWosXz1vLm5leHQoKTtpZihfLmRvbmUpe3ZhciB3PXU/aTpzLHg9YSh3KTtyZXR1cm4geD09PXc/czp4fWludmFyaWFudCh1fHxzJiZzLnNldCwiaW52YWxpZCBrZXlQYXRoIik7dmFyIEM9Xy52YWx1ZSxMPXU/ajpzLmdldChDLGopLEI9dXBkYXRlSW5EZWVwTWFwKEwsbyxpLGEpO3JldHVybiBCPT09TD9zOkI9PT1qP3MucmVtb3ZlKEMpOih1P2VtcHR5TWFwKCk6cykuc2V0KEMsQil9ZnVuY3Rpb24gcG9wQ291bnQocyl7cmV0dXJuIHM9KHM9KDg1ODk5MzQ1OSYocy09cz4+MSYxNDMxNjU1NzY1KSkrKHM+PjImODU4OTkzNDU5KSkrKHM+PjQpJjI1MjY0NTEzNSxzKz1zPj44LDEyNyYocys9cz4+MTYpfWZ1bmN0aW9uIHNldEluKHMsbyxpLGEpe3ZhciB1PWE/czphcnJDb3B5KHMpO3JldHVybiB1W29dPWksdX1mdW5jdGlvbiBzcGxpY2VJbihzLG8saSxhKXt2YXIgdT1zLmxlbmd0aCsxO2lmKGEmJm8rMT09PXUpcmV0dXJuIHNbb109aSxzO2Zvcih2YXIgXz1uZXcgQXJyYXkodSksdz0wLHg9MDt4PHU7eCsrKXg9PT1vPyhfW3hdPWksdz0tMSk6X1t4XT1zW3grd107cmV0dXJuIF99ZnVuY3Rpb24gc3BsaWNlT3V0KHMsbyxpKXt2YXIgYT1zLmxlbmd0aC0xO2lmKGkmJm89PT1hKXJldHVybiBzLnBvcCgpLHM7Zm9yKHZhciB1PW5ldyBBcnJheShhKSxfPTAsdz0wO3c8YTt3Kyspdz09PW8mJihfPTEpLHVbd109c1t3K19dO3JldHVybiB1fSRlW1JlXT0hMCwkZVtfXT0kZS5yZW1vdmUsJGUucmVtb3ZlSW49JGUuZGVsZXRlSW4sQXJyYXlNYXBOb2RlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24ocyxvLGksYSl7Zm9yKHZhciB1PXRoaXMuZW50cmllcyxfPTAsdz11Lmxlbmd0aDtfPHc7XysrKWlmKGlzKGksdVtfXVswXSkpcmV0dXJuIHVbX11bMV07cmV0dXJuIGF9LEFycmF5TWFwTm9kZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHMsbyxpLGEsdSxfLHcpe2Zvcih2YXIgeD11PT09aixDPXRoaXMuZW50cmllcyxMPTAsQj1DLmxlbmd0aDtMPEImJiFpcyhhLENbTF1bMF0pO0wrKyk7dmFyICQ9TDxCO2lmKCQ/Q1tMXVsxXT09PXU6eClyZXR1cm4gdGhpcztpZihTZXRSZWYodyksKHh8fCEkKSYmU2V0UmVmKF8pLCF4fHwxIT09Qy5sZW5ndGgpe2lmKCEkJiYheCYmQy5sZW5ndGg+PXFlKXJldHVybiBjcmVhdGVOb2RlcyhzLEMsYSx1KTt2YXIgVT1zJiZzPT09dGhpcy5vd25lcklELFY9VT9DOmFyckNvcHkoQyk7cmV0dXJuICQ/eD9MPT09Qi0xP1YucG9wKCk6VltMXT1WLnBvcCgpOlZbTF09W2EsdV06Vi5wdXNoKFthLHVdKSxVPyh0aGlzLmVudHJpZXM9Vix0aGlzKTpuZXcgQXJyYXlNYXBOb2RlKHMsVil9fSxCaXRtYXBJbmRleGVkTm9kZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHMsbyxpLGEpe3ZvaWQgMD09PW8mJihvPWhhc2goaSkpO3ZhciB1PTE8PCgoMD09PXM/bzpvPj4+cykmQyksXz10aGlzLmJpdG1hcDtyZXR1cm4gXyZ1P3RoaXMubm9kZXNbcG9wQ291bnQoXyZ1LTEpXS5nZXQocyt3LG8saSxhKTphfSxCaXRtYXBJbmRleGVkTm9kZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHMsbyxpLGEsdSxfLHgpe3ZvaWQgMD09PWkmJihpPWhhc2goYSkpO3ZhciBMPSgwPT09bz9pOmk+Pj5vKSZDLEI9MTw8TCwkPXRoaXMuYml0bWFwLFU9ISEoJCZCKTtpZighVSYmdT09PWopcmV0dXJuIHRoaXM7dmFyIFY9cG9wQ291bnQoJCZCLTEpLHo9dGhpcy5ub2RlcyxZPVU/eltWXTp2b2lkIDAsWj11cGRhdGVOb2RlKFkscyxvK3csaSxhLHUsXyx4KTtpZihaPT09WSlyZXR1cm4gdGhpcztpZighVSYmWiYmei5sZW5ndGg+PXplKXJldHVybiBleHBhbmROb2RlcyhzLHosJCxMLFopO2lmKFUmJiFaJiYyPT09ei5sZW5ndGgmJmlzTGVhZk5vZGUoelsxXlZdKSlyZXR1cm4gelsxXlZdO2lmKFUmJlomJjE9PT16Lmxlbmd0aCYmaXNMZWFmTm9kZShaKSlyZXR1cm4gWjt2YXIgZWU9cyYmcz09PXRoaXMub3duZXJJRCxpZT1VP1o/JDokXkI6JHxCLGFlPVU/Wj9zZXRJbih6LFYsWixlZSk6c3BsaWNlT3V0KHosVixlZSk6c3BsaWNlSW4oeixWLFosZWUpO3JldHVybiBlZT8odGhpcy5iaXRtYXA9aWUsdGhpcy5ub2Rlcz1hZSx0aGlzKTpuZXcgQml0bWFwSW5kZXhlZE5vZGUocyxpZSxhZSl9LEhhc2hBcnJheU1hcE5vZGUucHJvdG90eXBlLmdldD1mdW5jdGlvbihzLG8saSxhKXt2b2lkIDA9PT1vJiYobz1oYXNoKGkpKTt2YXIgdT0oMD09PXM/bzpvPj4+cykmQyxfPXRoaXMubm9kZXNbdV07cmV0dXJuIF8/Xy5nZXQocyt3LG8saSxhKTphfSxIYXNoQXJyYXlNYXBOb2RlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24ocyxvLGksYSx1LF8seCl7dm9pZCAwPT09aSYmKGk9aGFzaChhKSk7dmFyIEw9KDA9PT1vP2k6aT4+Pm8pJkMsQj11PT09aiwkPXRoaXMubm9kZXMsVT0kW0xdO2lmKEImJiFVKXJldHVybiB0aGlzO3ZhciBWPXVwZGF0ZU5vZGUoVSxzLG8rdyxpLGEsdSxfLHgpO2lmKFY9PT1VKXJldHVybiB0aGlzO3ZhciB6PXRoaXMuY291bnQ7aWYoVSl7aWYoIVYmJi0tejxXZSlyZXR1cm4gcGFja05vZGVzKHMsJCx6LEwpfWVsc2UgeisrO3ZhciBZPXMmJnM9PT10aGlzLm93bmVySUQsWj1zZXRJbigkLEwsVixZKTtyZXR1cm4gWT8odGhpcy5jb3VudD16LHRoaXMubm9kZXM9Wix0aGlzKTpuZXcgSGFzaEFycmF5TWFwTm9kZShzLHosWil9LEhhc2hDb2xsaXNpb25Ob2RlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24ocyxvLGksYSl7Zm9yKHZhciB1PXRoaXMuZW50cmllcyxfPTAsdz11Lmxlbmd0aDtfPHc7XysrKWlmKGlzKGksdVtfXVswXSkpcmV0dXJuIHVbX11bMV07cmV0dXJuIGF9LEhhc2hDb2xsaXNpb25Ob2RlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24ocyxvLGksYSx1LF8sdyl7dm9pZCAwPT09aSYmKGk9aGFzaChhKSk7dmFyIHg9dT09PWo7aWYoaSE9PXRoaXMua2V5SGFzaClyZXR1cm4geD90aGlzOihTZXRSZWYodyksU2V0UmVmKF8pLG1lcmdlSW50b05vZGUodGhpcyxzLG8saSxbYSx1XSkpO2Zvcih2YXIgQz10aGlzLmVudHJpZXMsTD0wLEI9Qy5sZW5ndGg7TDxCJiYhaXMoYSxDW0xdWzBdKTtMKyspO3ZhciAkPUw8QjtpZigkP0NbTF1bMV09PT11OngpcmV0dXJuIHRoaXM7aWYoU2V0UmVmKHcpLCh4fHwhJCkmJlNldFJlZihfKSx4JiYyPT09QilyZXR1cm4gbmV3IFZhbHVlTm9kZShzLHRoaXMua2V5SGFzaCxDWzFeTF0pO3ZhciBVPXMmJnM9PT10aGlzLm93bmVySUQsVj1VP0M6YXJyQ29weShDKTtyZXR1cm4gJD94P0w9PT1CLTE/Vi5wb3AoKTpWW0xdPVYucG9wKCk6VltMXT1bYSx1XTpWLnB1c2goW2EsdV0pLFU/KHRoaXMuZW50cmllcz1WLHRoaXMpOm5ldyBIYXNoQ29sbGlzaW9uTm9kZShzLHRoaXMua2V5SGFzaCxWKX0sVmFsdWVOb2RlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24ocyxvLGksYSl7cmV0dXJuIGlzKGksdGhpcy5lbnRyeVswXSk/dGhpcy5lbnRyeVsxXTphfSxWYWx1ZU5vZGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihzLG8saSxhLHUsXyx3KXt2YXIgeD11PT09aixDPWlzKGEsdGhpcy5lbnRyeVswXSk7cmV0dXJuKEM/dT09PXRoaXMuZW50cnlbMV06eCk/dGhpczooU2V0UmVmKHcpLHg/dm9pZCBTZXRSZWYoXyk6Qz9zJiZzPT09dGhpcy5vd25lcklEPyh0aGlzLmVudHJ5WzFdPXUsdGhpcyk6bmV3IFZhbHVlTm9kZShzLHRoaXMua2V5SGFzaCxbYSx1XSk6KFNldFJlZihfKSxtZXJnZUludG9Ob2RlKHRoaXMscyxvLGhhc2goYSksW2EsdV0pKSl9LEFycmF5TWFwTm9kZS5wcm90b3R5cGUuaXRlcmF0ZT1IYXNoQ29sbGlzaW9uTm9kZS5wcm90b3R5cGUuaXRlcmF0ZT1mdW5jdGlvbihzLG8pe2Zvcih2YXIgaT10aGlzLmVudHJpZXMsYT0wLHU9aS5sZW5ndGgtMTthPD11O2ErKylpZighMT09PXMoaVtvP3UtYTphXSkpcmV0dXJuITF9LEJpdG1hcEluZGV4ZWROb2RlLnByb3RvdHlwZS5pdGVyYXRlPUhhc2hBcnJheU1hcE5vZGUucHJvdG90eXBlLml0ZXJhdGU9ZnVuY3Rpb24ocyxvKXtmb3IodmFyIGk9dGhpcy5ub2RlcyxhPTAsdT1pLmxlbmd0aC0xO2E8PXU7YSsrKXt2YXIgXz1pW28/dS1hOmFdO2lmKF8mJiExPT09Xy5pdGVyYXRlKHMsbykpcmV0dXJuITF9fSxWYWx1ZU5vZGUucHJvdG90eXBlLml0ZXJhdGU9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gcyh0aGlzLmVudHJ5KX0sY3JlYXRlQ2xhc3MoTWFwSXRlcmF0b3IsSXRlcmF0b3IpLE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7Zm9yKHZhciBzPXRoaXMuX3R5cGUsbz10aGlzLl9zdGFjaztvOyl7dmFyIGksYT1vLm5vZGUsdT1vLmluZGV4Kys7aWYoYS5lbnRyeSl7aWYoMD09PXUpcmV0dXJuIG1hcEl0ZXJhdG9yVmFsdWUocyxhLmVudHJ5KX1lbHNlIGlmKGEuZW50cmllcyl7aWYodTw9KGk9YS5lbnRyaWVzLmxlbmd0aC0xKSlyZXR1cm4gbWFwSXRlcmF0b3JWYWx1ZShzLGEuZW50cmllc1t0aGlzLl9yZXZlcnNlP2ktdTp1XSl9ZWxzZSBpZih1PD0oaT1hLm5vZGVzLmxlbmd0aC0xKSl7dmFyIF89YS5ub2Rlc1t0aGlzLl9yZXZlcnNlP2ktdTp1XTtpZihfKXtpZihfLmVudHJ5KXJldHVybiBtYXBJdGVyYXRvclZhbHVlKHMsXy5lbnRyeSk7bz10aGlzLl9zdGFjaz1tYXBJdGVyYXRvckZyYW1lKF8sbyl9Y29udGludWV9bz10aGlzLl9zdGFjaz10aGlzLl9zdGFjay5fX3ByZXZ9cmV0dXJuIGl0ZXJhdG9yRG9uZSgpfTt2YXIgcWU9eC80LHplPXgvMixXZT14LzQ7ZnVuY3Rpb24gTGlzdChzKXt2YXIgbz1lbXB0eUxpc3QoKTtpZihudWxsPT1zKXJldHVybiBvO2lmKGlzTGlzdChzKSlyZXR1cm4gczt2YXIgaT1JbmRleGVkSXRlcmFibGUocyksYT1pLnNpemU7cmV0dXJuIDA9PT1hP286KGFzc2VydE5vdEluZmluaXRlKGEpLGE+MCYmYTx4P21ha2VMaXN0KDAsYSx3LG51bGwsbmV3IFZOb2RlKGkudG9BcnJheSgpKSk6by53aXRoTXV0YXRpb25zKChmdW5jdGlvbihzKXtzLnNldFNpemUoYSksaS5mb3JFYWNoKChmdW5jdGlvbihvLGkpe3JldHVybiBzLnNldChpLG8pfSkpfSkpKX1mdW5jdGlvbiBpc0xpc3Qocyl7cmV0dXJuISghc3x8IXNbSGVdKX1jcmVhdGVDbGFzcyhMaXN0LEluZGV4ZWRDb2xsZWN0aW9uKSxMaXN0Lm9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMoYXJndW1lbnRzKX0sTGlzdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJMaXN0IFsiLCJdIil9LExpc3QucHJvdG90eXBlLmdldD1mdW5jdGlvbihzLG8pe2lmKChzPXdyYXBJbmRleCh0aGlzLHMpKT49MCYmczx0aGlzLnNpemUpe3ZhciBpPWxpc3ROb2RlRm9yKHRoaXMscys9dGhpcy5fb3JpZ2luKTtyZXR1cm4gaSYmaS5hcnJheVtzJkNdfXJldHVybiBvfSxMaXN0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdXBkYXRlTGlzdCh0aGlzLHMsbyl9LExpc3QucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihzKXtyZXR1cm4gdGhpcy5oYXMocyk/MD09PXM/dGhpcy5zaGlmdCgpOnM9PT10aGlzLnNpemUtMT90aGlzLnBvcCgpOnRoaXMuc3BsaWNlKHMsMSk6dGhpc30sTGlzdC5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHRoaXMuc3BsaWNlKHMsMCxvKX0sTGlzdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuc2l6ZT90aGlzOnRoaXMuX19vd25lcklEPyh0aGlzLnNpemU9dGhpcy5fb3JpZ2luPXRoaXMuX2NhcGFjaXR5PTAsdGhpcy5fbGV2ZWw9dyx0aGlzLl9yb290PXRoaXMuX3RhaWw9bnVsbCx0aGlzLl9faGFzaD12b2lkIDAsdGhpcy5fX2FsdGVyZWQ9ITAsdGhpcyk6ZW1wdHlMaXN0KCl9LExpc3QucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oKXt2YXIgcz1hcmd1bWVudHMsbz10aGlzLnNpemU7cmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucygoZnVuY3Rpb24oaSl7c2V0TGlzdEJvdW5kcyhpLDAsbytzLmxlbmd0aCk7Zm9yKHZhciBhPTA7YTxzLmxlbmd0aDthKyspaS5zZXQobythLHNbYV0pfSkpfSxMaXN0LnByb3RvdHlwZS5wb3A9ZnVuY3Rpb24oKXtyZXR1cm4gc2V0TGlzdEJvdW5kcyh0aGlzLDAsLTEpfSxMaXN0LnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKCl7dmFyIHM9YXJndW1lbnRzO3JldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKG8pe3NldExpc3RCb3VuZHMobywtcy5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8cy5sZW5ndGg7aSsrKW8uc2V0KGksc1tpXSl9KSl9LExpc3QucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHNldExpc3RCb3VuZHModGhpcywxKX0sTGlzdC5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gbWVyZ2VJbnRvTGlzdFdpdGgodGhpcyx2b2lkIDAsYXJndW1lbnRzKX0sTGlzdC5wcm90b3R5cGUubWVyZ2VXaXRoPWZ1bmN0aW9uKG8pe3JldHVybiBtZXJnZUludG9MaXN0V2l0aCh0aGlzLG8scy5jYWxsKGFyZ3VtZW50cywxKSl9LExpc3QucHJvdG90eXBlLm1lcmdlRGVlcD1mdW5jdGlvbigpe3JldHVybiBtZXJnZUludG9MaXN0V2l0aCh0aGlzLGRlZXBNZXJnZXIsYXJndW1lbnRzKX0sTGlzdC5wcm90b3R5cGUubWVyZ2VEZWVwV2l0aD1mdW5jdGlvbihvKXt2YXIgaT1zLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBtZXJnZUludG9MaXN0V2l0aCh0aGlzLGRlZXBNZXJnZXJXaXRoKG8pLGkpfSxMaXN0LnByb3RvdHlwZS5zZXRTaXplPWZ1bmN0aW9uKHMpe3JldHVybiBzZXRMaXN0Qm91bmRzKHRoaXMsMCxzKX0sTGlzdC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24ocyxvKXt2YXIgaT10aGlzLnNpemU7cmV0dXJuIHdob2xlU2xpY2UocyxvLGkpP3RoaXM6c2V0TGlzdEJvdW5kcyh0aGlzLHJlc29sdmVCZWdpbihzLGkpLHJlc29sdmVFbmQobyxpKSl9LExpc3QucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24ocyxvKXt2YXIgaT0wLGE9aXRlcmF0ZUxpc3QodGhpcyxvKTtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciBvPWEoKTtyZXR1cm4gbz09PWV0P2l0ZXJhdG9yRG9uZSgpOml0ZXJhdG9yVmFsdWUocyxpKyssbyl9KSl9LExpc3QucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbihzLG8pe2Zvcih2YXIgaSxhPTAsdT1pdGVyYXRlTGlzdCh0aGlzLG8pOyhpPXUoKSkhPT1ldCYmITEhPT1zKGksYSsrLHRoaXMpOyk7cmV0dXJuIGF9LExpc3QucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24ocyl7cmV0dXJuIHM9PT10aGlzLl9fb3duZXJJRD90aGlzOnM/bWFrZUxpc3QodGhpcy5fb3JpZ2luLHRoaXMuX2NhcGFjaXR5LHRoaXMuX2xldmVsLHRoaXMuX3Jvb3QsdGhpcy5fdGFpbCxzLHRoaXMuX19oYXNoKToodGhpcy5fX293bmVySUQ9cyx0aGlzKX0sTGlzdC5pc0xpc3Q9aXNMaXN0O3ZhciBIZT0iQEBfX0lNTVVUQUJMRV9MSVNUX19AQCIsWWU9TGlzdC5wcm90b3R5cGU7ZnVuY3Rpb24gVk5vZGUocyxvKXt0aGlzLmFycmF5PXMsdGhpcy5vd25lcklEPW99WWVbSGVdPSEwLFllW19dPVllLnJlbW92ZSxZZS5zZXRJbj0kZS5zZXRJbixZZS5kZWxldGVJbj1ZZS5yZW1vdmVJbj0kZS5yZW1vdmVJbixZZS51cGRhdGU9JGUudXBkYXRlLFllLnVwZGF0ZUluPSRlLnVwZGF0ZUluLFllLm1lcmdlSW49JGUubWVyZ2VJbixZZS5tZXJnZURlZXBJbj0kZS5tZXJnZURlZXBJbixZZS53aXRoTXV0YXRpb25zPSRlLndpdGhNdXRhdGlvbnMsWWUuYXNNdXRhYmxlPSRlLmFzTXV0YWJsZSxZZS5hc0ltbXV0YWJsZT0kZS5hc0ltbXV0YWJsZSxZZS53YXNBbHRlcmVkPSRlLndhc0FsdGVyZWQsVk5vZGUucHJvdG90eXBlLnJlbW92ZUJlZm9yZT1mdW5jdGlvbihzLG8saSl7aWYoaT09PW8/MTw8bzowPT09dGhpcy5hcnJheS5sZW5ndGgpcmV0dXJuIHRoaXM7dmFyIGE9aT4+Pm8mQztpZihhPj10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gbmV3IFZOb2RlKFtdLHMpO3ZhciB1LF89MD09PWE7aWYobz4wKXt2YXIgeD10aGlzLmFycmF5W2FdO2lmKCh1PXgmJngucmVtb3ZlQmVmb3JlKHMsby13LGkpKT09PXgmJl8pcmV0dXJuIHRoaXN9aWYoXyYmIXUpcmV0dXJuIHRoaXM7dmFyIGo9ZWRpdGFibGVWTm9kZSh0aGlzLHMpO2lmKCFfKWZvcih2YXIgTD0wO0w8YTtMKyspai5hcnJheVtMXT12b2lkIDA7cmV0dXJuIHUmJihqLmFycmF5W2FdPXUpLGp9LFZOb2RlLnByb3RvdHlwZS5yZW1vdmVBZnRlcj1mdW5jdGlvbihzLG8saSl7aWYoaT09PShvPzE8PG86MCl8fDA9PT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gdGhpczt2YXIgYSx1PWktMT4+Pm8mQztpZih1Pj10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gdGhpcztpZihvPjApe3ZhciBfPXRoaXMuYXJyYXlbdV07aWYoKGE9XyYmXy5yZW1vdmVBZnRlcihzLG8tdyxpKSk9PT1fJiZ1PT09dGhpcy5hcnJheS5sZW5ndGgtMSlyZXR1cm4gdGhpc312YXIgeD1lZGl0YWJsZVZOb2RlKHRoaXMscyk7cmV0dXJuIHguYXJyYXkuc3BsaWNlKHUrMSksYSYmKHguYXJyYXlbdV09YSkseH07dmFyIFhlLFFlLGV0PXt9O2Z1bmN0aW9uIGl0ZXJhdGVMaXN0KHMsbyl7dmFyIGk9cy5fb3JpZ2luLGE9cy5fY2FwYWNpdHksdT1nZXRUYWlsT2Zmc2V0KGEpLF89cy5fdGFpbDtyZXR1cm4gaXRlcmF0ZU5vZGVPckxlYWYocy5fcm9vdCxzLl9sZXZlbCwwKTtmdW5jdGlvbiBpdGVyYXRlTm9kZU9yTGVhZihzLG8saSl7cmV0dXJuIDA9PT1vP2l0ZXJhdGVMZWFmKHMsaSk6aXRlcmF0ZU5vZGUocyxvLGkpfWZ1bmN0aW9uIGl0ZXJhdGVMZWFmKHMsdyl7dmFyIEM9dz09PXU/XyYmXy5hcnJheTpzJiZzLmFycmF5LGo9dz5pPzA6aS13LEw9YS13O3JldHVybiBMPngmJihMPXgpLGZ1bmN0aW9uKCl7aWYoaj09PUwpcmV0dXJuIGV0O3ZhciBzPW8/LS1MOmorKztyZXR1cm4gQyYmQ1tzXX19ZnVuY3Rpb24gaXRlcmF0ZU5vZGUocyx1LF8pe3ZhciBDLGo9cyYmcy5hcnJheSxMPV8+aT8wOmktXz4+dSxCPTErKGEtXz4+dSk7cmV0dXJuIEI+eCYmKEI9eCksZnVuY3Rpb24oKXtmb3IoOzspe2lmKEMpe3ZhciBzPUMoKTtpZihzIT09ZXQpcmV0dXJuIHM7Qz1udWxsfWlmKEw9PT1CKXJldHVybiBldDt2YXIgaT1vPy0tQjpMKys7Qz1pdGVyYXRlTm9kZU9yTGVhZihqJiZqW2ldLHUtdyxfKyhpPDx1KSl9fX19ZnVuY3Rpb24gbWFrZUxpc3QocyxvLGksYSx1LF8sdyl7dmFyIHg9T2JqZWN0LmNyZWF0ZShZZSk7cmV0dXJuIHguc2l6ZT1vLXMseC5fb3JpZ2luPXMseC5fY2FwYWNpdHk9byx4Ll9sZXZlbD1pLHguX3Jvb3Q9YSx4Ll90YWlsPXUseC5fX293bmVySUQ9Xyx4Ll9faGFzaD13LHguX19hbHRlcmVkPSExLHh9ZnVuY3Rpb24gZW1wdHlMaXN0KCl7cmV0dXJuIFhlfHwoWGU9bWFrZUxpc3QoMCwwLHcpKX1mdW5jdGlvbiB1cGRhdGVMaXN0KHMsbyxpKXtpZigobz13cmFwSW5kZXgocyxvKSkhPW8pcmV0dXJuIHM7aWYobz49cy5zaXplfHxvPDApcmV0dXJuIHMud2l0aE11dGF0aW9ucygoZnVuY3Rpb24ocyl7bzwwP3NldExpc3RCb3VuZHMocyxvKS5zZXQoMCxpKTpzZXRMaXN0Qm91bmRzKHMsMCxvKzEpLnNldChvLGkpfSkpO28rPXMuX29yaWdpbjt2YXIgYT1zLl90YWlsLHU9cy5fcm9vdCxfPU1ha2VSZWYoQik7cmV0dXJuIG8+PWdldFRhaWxPZmZzZXQocy5fY2FwYWNpdHkpP2E9dXBkYXRlVk5vZGUoYSxzLl9fb3duZXJJRCwwLG8saSxfKTp1PXVwZGF0ZVZOb2RlKHUscy5fX293bmVySUQscy5fbGV2ZWwsbyxpLF8pLF8udmFsdWU/cy5fX293bmVySUQ/KHMuX3Jvb3Q9dSxzLl90YWlsPWEscy5fX2hhc2g9dm9pZCAwLHMuX19hbHRlcmVkPSEwLHMpOm1ha2VMaXN0KHMuX29yaWdpbixzLl9jYXBhY2l0eSxzLl9sZXZlbCx1LGEpOnN9ZnVuY3Rpb24gdXBkYXRlVk5vZGUocyxvLGksYSx1LF8pe3ZhciB4LGo9YT4+PmkmQyxMPXMmJmo8cy5hcnJheS5sZW5ndGg7aWYoIUwmJnZvaWQgMD09PXUpcmV0dXJuIHM7aWYoaT4wKXt2YXIgQj1zJiZzLmFycmF5W2pdLCQ9dXBkYXRlVk5vZGUoQixvLGktdyxhLHUsXyk7cmV0dXJuICQ9PT1CP3M6KCh4PWVkaXRhYmxlVk5vZGUocyxvKSkuYXJyYXlbal09JCx4KX1yZXR1cm4gTCYmcy5hcnJheVtqXT09PXU/czooU2V0UmVmKF8pLHg9ZWRpdGFibGVWTm9kZShzLG8pLHZvaWQgMD09PXUmJmo9PT14LmFycmF5Lmxlbmd0aC0xP3guYXJyYXkucG9wKCk6eC5hcnJheVtqXT11LHgpfWZ1bmN0aW9uIGVkaXRhYmxlVk5vZGUocyxvKXtyZXR1cm4gbyYmcyYmbz09PXMub3duZXJJRD9zOm5ldyBWTm9kZShzP3MuYXJyYXkuc2xpY2UoKTpbXSxvKX1mdW5jdGlvbiBsaXN0Tm9kZUZvcihzLG8pe2lmKG8+PWdldFRhaWxPZmZzZXQocy5fY2FwYWNpdHkpKXJldHVybiBzLl90YWlsO2lmKG88MTw8cy5fbGV2ZWwrdyl7Zm9yKHZhciBpPXMuX3Jvb3QsYT1zLl9sZXZlbDtpJiZhPjA7KWk9aS5hcnJheVtvPj4+YSZDXSxhLT13O3JldHVybiBpfX1mdW5jdGlvbiBzZXRMaXN0Qm91bmRzKHMsbyxpKXt2b2lkIDAhPT1vJiYob3w9MCksdm9pZCAwIT09aSYmKGl8PTApO3ZhciBhPXMuX19vd25lcklEfHxuZXcgT3duZXJJRCx1PXMuX29yaWdpbixfPXMuX2NhcGFjaXR5LHg9dStvLGo9dm9pZCAwPT09aT9fOmk8MD9fK2k6dStpO2lmKHg9PT11JiZqPT09XylyZXR1cm4gcztpZih4Pj1qKXJldHVybiBzLmNsZWFyKCk7Zm9yKHZhciBMPXMuX2xldmVsLEI9cy5fcm9vdCwkPTA7eCskPDA7KUI9bmV3IFZOb2RlKEImJkIuYXJyYXkubGVuZ3RoP1t2b2lkIDAsQl06W10sYSksJCs9MTw8KEwrPXcpOyQmJih4Kz0kLHUrPSQsais9JCxfKz0kKTtmb3IodmFyIFU9Z2V0VGFpbE9mZnNldChfKSxWPWdldFRhaWxPZmZzZXQoaik7Vj49MTw8TCt3OylCPW5ldyBWTm9kZShCJiZCLmFycmF5Lmxlbmd0aD9bQl06W10sYSksTCs9dzt2YXIgej1zLl90YWlsLFk9VjxVP2xpc3ROb2RlRm9yKHMsai0xKTpWPlU/bmV3IFZOb2RlKFtdLGEpOno7aWYoeiYmVj5VJiZ4PF8mJnouYXJyYXkubGVuZ3RoKXtmb3IodmFyIFo9Qj1lZGl0YWJsZVZOb2RlKEIsYSksZWU9TDtlZT53O2VlLT13KXt2YXIgaWU9VT4+PmVlJkM7Wj1aLmFycmF5W2llXT1lZGl0YWJsZVZOb2RlKFouYXJyYXlbaWVdLGEpfVouYXJyYXlbVT4+PncmQ109en1pZihqPF8mJihZPVkmJlkucmVtb3ZlQWZ0ZXIoYSwwLGopKSx4Pj1WKXgtPVYsai09VixMPXcsQj1udWxsLFk9WSYmWS5yZW1vdmVCZWZvcmUoYSwwLHgpO2Vsc2UgaWYoeD51fHxWPFUpe2ZvcigkPTA7Qjspe3ZhciBhZT14Pj4+TCZDO2lmKGFlIT09Vj4+PkwmQylicmVhazthZSYmKCQrPSgxPDxMKSphZSksTC09dyxCPUIuYXJyYXlbYWVdfUImJng+dSYmKEI9Qi5yZW1vdmVCZWZvcmUoYSxMLHgtJCkpLEImJlY8VSYmKEI9Qi5yZW1vdmVBZnRlcihhLEwsVi0kKSksJCYmKHgtPSQsai09JCl9cmV0dXJuIHMuX19vd25lcklEPyhzLnNpemU9ai14LHMuX29yaWdpbj14LHMuX2NhcGFjaXR5PWoscy5fbGV2ZWw9TCxzLl9yb290PUIscy5fdGFpbD1ZLHMuX19oYXNoPXZvaWQgMCxzLl9fYWx0ZXJlZD0hMCxzKTptYWtlTGlzdCh4LGosTCxCLFkpfWZ1bmN0aW9uIG1lcmdlSW50b0xpc3RXaXRoKHMsbyxpKXtmb3IodmFyIGE9W10sdT0wLF89MDtfPGkubGVuZ3RoO18rKyl7dmFyIHc9aVtfXSx4PUluZGV4ZWRJdGVyYWJsZSh3KTt4LnNpemU+dSYmKHU9eC5zaXplKSxpc0l0ZXJhYmxlKHcpfHwoeD14Lm1hcCgoZnVuY3Rpb24ocyl7cmV0dXJuIGZyb21KUyhzKX0pKSksYS5wdXNoKHgpfXJldHVybiB1PnMuc2l6ZSYmKHM9cy5zZXRTaXplKHUpKSxtZXJnZUludG9Db2xsZWN0aW9uV2l0aChzLG8sYSl9ZnVuY3Rpb24gZ2V0VGFpbE9mZnNldChzKXtyZXR1cm4gczx4PzA6cy0xPj4+dzw8d31mdW5jdGlvbiBPcmRlcmVkTWFwKHMpe3JldHVybiBudWxsPT1zP2VtcHR5T3JkZXJlZE1hcCgpOmlzT3JkZXJlZE1hcChzKT9zOmVtcHR5T3JkZXJlZE1hcCgpLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKG8pe3ZhciBpPUtleWVkSXRlcmFibGUocyk7YXNzZXJ0Tm90SW5maW5pdGUoaS5zaXplKSxpLmZvckVhY2goKGZ1bmN0aW9uKHMsaSl7cmV0dXJuIG8uc2V0KGkscyl9KSl9KSl9ZnVuY3Rpb24gaXNPcmRlcmVkTWFwKHMpe3JldHVybiBpc01hcChzKSYmaXNPcmRlcmVkKHMpfWZ1bmN0aW9uIG1ha2VPcmRlcmVkTWFwKHMsbyxpLGEpe3ZhciB1PU9iamVjdC5jcmVhdGUoT3JkZXJlZE1hcC5wcm90b3R5cGUpO3JldHVybiB1LnNpemU9cz9zLnNpemU6MCx1Ll9tYXA9cyx1Ll9saXN0PW8sdS5fX293bmVySUQ9aSx1Ll9faGFzaD1hLHV9ZnVuY3Rpb24gZW1wdHlPcmRlcmVkTWFwKCl7cmV0dXJuIFFlfHwoUWU9bWFrZU9yZGVyZWRNYXAoZW1wdHlNYXAoKSxlbXB0eUxpc3QoKSkpfWZ1bmN0aW9uIHVwZGF0ZU9yZGVyZWRNYXAocyxvLGkpe3ZhciBhLHUsXz1zLl9tYXAsdz1zLl9saXN0LEM9Xy5nZXQobyksTD12b2lkIDAhPT1DO2lmKGk9PT1qKXtpZighTClyZXR1cm4gczt3LnNpemU+PXgmJncuc2l6ZT49MipfLnNpemU/KGE9KHU9dy5maWx0ZXIoKGZ1bmN0aW9uKHMsbyl7cmV0dXJuIHZvaWQgMCE9PXMmJkMhPT1vfSkpKS50b0tleWVkU2VxKCkubWFwKChmdW5jdGlvbihzKXtyZXR1cm4gc1swXX0pKS5mbGlwKCkudG9NYXAoKSxzLl9fb3duZXJJRCYmKGEuX19vd25lcklEPXUuX19vd25lcklEPXMuX19vd25lcklEKSk6KGE9Xy5yZW1vdmUobyksdT1DPT09dy5zaXplLTE/dy5wb3AoKTp3LnNldChDLHZvaWQgMCkpfWVsc2UgaWYoTCl7aWYoaT09PXcuZ2V0KEMpWzFdKXJldHVybiBzO2E9Xyx1PXcuc2V0KEMsW28saV0pfWVsc2UgYT1fLnNldChvLHcuc2l6ZSksdT13LnNldCh3LnNpemUsW28saV0pO3JldHVybiBzLl9fb3duZXJJRD8ocy5zaXplPWEuc2l6ZSxzLl9tYXA9YSxzLl9saXN0PXUscy5fX2hhc2g9dm9pZCAwLHMpOm1ha2VPcmRlcmVkTWFwKGEsdSl9ZnVuY3Rpb24gVG9LZXllZFNlcXVlbmNlKHMsbyl7dGhpcy5faXRlcj1zLHRoaXMuX3VzZUtleXM9byx0aGlzLnNpemU9cy5zaXplfWZ1bmN0aW9uIFRvSW5kZXhlZFNlcXVlbmNlKHMpe3RoaXMuX2l0ZXI9cyx0aGlzLnNpemU9cy5zaXplfWZ1bmN0aW9uIFRvU2V0U2VxdWVuY2Uocyl7dGhpcy5faXRlcj1zLHRoaXMuc2l6ZT1zLnNpemV9ZnVuY3Rpb24gRnJvbUVudHJpZXNTZXF1ZW5jZShzKXt0aGlzLl9pdGVyPXMsdGhpcy5zaXplPXMuc2l6ZX1mdW5jdGlvbiBmbGlwRmFjdG9yeShzKXt2YXIgbz1tYWtlU2VxdWVuY2Uocyk7cmV0dXJuIG8uX2l0ZXI9cyxvLnNpemU9cy5zaXplLG8uZmxpcD1mdW5jdGlvbigpe3JldHVybiBzfSxvLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgbz1zLnJldmVyc2UuYXBwbHkodGhpcyk7cmV0dXJuIG8uZmxpcD1mdW5jdGlvbigpe3JldHVybiBzLnJldmVyc2UoKX0sb30sby5oYXM9ZnVuY3Rpb24obyl7cmV0dXJuIHMuaW5jbHVkZXMobyl9LG8uaW5jbHVkZXM9ZnVuY3Rpb24obyl7cmV0dXJuIHMuaGFzKG8pfSxvLmNhY2hlUmVzdWx0PWNhY2hlUmVzdWx0VGhyb3VnaCxvLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKG8saSl7dmFyIGE9dGhpcztyZXR1cm4gcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHMsaSl7cmV0dXJuITEhPT1vKGkscyxhKX0pLGkpfSxvLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbihvLGkpe2lmKG89PT1WKXt2YXIgYT1zLl9faXRlcmF0b3IobyxpKTtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciBzPWEubmV4dCgpO2lmKCFzLmRvbmUpe3ZhciBvPXMudmFsdWVbMF07cy52YWx1ZVswXT1zLnZhbHVlWzFdLHMudmFsdWVbMV09b31yZXR1cm4gc30pKX1yZXR1cm4gcy5fX2l0ZXJhdG9yKG89PT1VPyQ6VSxpKX0sb31mdW5jdGlvbiBtYXBGYWN0b3J5KHMsbyxpKXt2YXIgYT1tYWtlU2VxdWVuY2Uocyk7cmV0dXJuIGEuc2l6ZT1zLnNpemUsYS5oYXM9ZnVuY3Rpb24obyl7cmV0dXJuIHMuaGFzKG8pfSxhLmdldD1mdW5jdGlvbihhLHUpe3ZhciBfPXMuZ2V0KGEsaik7cmV0dXJuIF89PT1qP3U6by5jYWxsKGksXyxhLHMpfSxhLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKGEsdSl7dmFyIF89dGhpcztyZXR1cm4gcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHMsdSx3KXtyZXR1cm4hMSE9PWEoby5jYWxsKGkscyx1LHcpLHUsXyl9KSx1KX0sYS5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24oYSx1KXt2YXIgXz1zLl9faXRlcmF0b3IoVix1KTtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciB1PV8ubmV4dCgpO2lmKHUuZG9uZSlyZXR1cm4gdTt2YXIgdz11LnZhbHVlLHg9d1swXTtyZXR1cm4gaXRlcmF0b3JWYWx1ZShhLHgsby5jYWxsKGksd1sxXSx4LHMpLHUpfSkpfSxhfWZ1bmN0aW9uIHJldmVyc2VGYWN0b3J5KHMsbyl7dmFyIGk9bWFrZVNlcXVlbmNlKHMpO3JldHVybiBpLl9pdGVyPXMsaS5zaXplPXMuc2l6ZSxpLnJldmVyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gc30scy5mbGlwJiYoaS5mbGlwPWZ1bmN0aW9uKCl7dmFyIG89ZmxpcEZhY3Rvcnkocyk7cmV0dXJuIG8ucmV2ZXJzZT1mdW5jdGlvbigpe3JldHVybiBzLmZsaXAoKX0sb30pLGkuZ2V0PWZ1bmN0aW9uKGksYSl7cmV0dXJuIHMuZ2V0KG8/aTotMS1pLGEpfSxpLmhhcz1mdW5jdGlvbihpKXtyZXR1cm4gcy5oYXMobz9pOi0xLWkpfSxpLmluY2x1ZGVzPWZ1bmN0aW9uKG8pe3JldHVybiBzLmluY2x1ZGVzKG8pfSxpLmNhY2hlUmVzdWx0PWNhY2hlUmVzdWx0VGhyb3VnaCxpLl9faXRlcmF0ZT1mdW5jdGlvbihvLGkpe3ZhciBhPXRoaXM7cmV0dXJuIHMuX19pdGVyYXRlKChmdW5jdGlvbihzLGkpe3JldHVybiBvKHMsaSxhKX0pLCFpKX0saS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKG8saSl7cmV0dXJuIHMuX19pdGVyYXRvcihvLCFpKX0saX1mdW5jdGlvbiBmaWx0ZXJGYWN0b3J5KHMsbyxpLGEpe3ZhciB1PW1ha2VTZXF1ZW5jZShzKTtyZXR1cm4gYSYmKHUuaGFzPWZ1bmN0aW9uKGEpe3ZhciB1PXMuZ2V0KGEsaik7cmV0dXJuIHUhPT1qJiYhIW8uY2FsbChpLHUsYSxzKX0sdS5nZXQ9ZnVuY3Rpb24oYSx1KXt2YXIgXz1zLmdldChhLGopO3JldHVybiBfIT09aiYmby5jYWxsKGksXyxhLHMpP186dX0pLHUuX19pdGVyYXRlVW5jYWNoZWQ9ZnVuY3Rpb24odSxfKXt2YXIgdz10aGlzLHg9MDtyZXR1cm4gcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHMsXyxDKXtpZihvLmNhbGwoaSxzLF8sQykpcmV0dXJuIHgrKyx1KHMsYT9fOngtMSx3KX0pLF8pLHh9LHUuX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKHUsXyl7dmFyIHc9cy5fX2l0ZXJhdG9yKFYsXykseD0wO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7Zm9yKDs7KXt2YXIgXz13Lm5leHQoKTtpZihfLmRvbmUpcmV0dXJuIF87dmFyIEM9Xy52YWx1ZSxqPUNbMF0sTD1DWzFdO2lmKG8uY2FsbChpLEwsaixzKSlyZXR1cm4gaXRlcmF0b3JWYWx1ZSh1LGE/ajp4KyssTCxfKX19KSl9LHV9ZnVuY3Rpb24gY291bnRCeUZhY3RvcnkocyxvLGkpe3ZhciBhPU1hcCgpLmFzTXV0YWJsZSgpO3JldHVybiBzLl9faXRlcmF0ZSgoZnVuY3Rpb24odSxfKXthLnVwZGF0ZShvLmNhbGwoaSx1LF8scyksMCwoZnVuY3Rpb24ocyl7cmV0dXJuIHMrMX0pKX0pKSxhLmFzSW1tdXRhYmxlKCl9ZnVuY3Rpb24gZ3JvdXBCeUZhY3RvcnkocyxvLGkpe3ZhciBhPWlzS2V5ZWQocyksdT0oaXNPcmRlcmVkKHMpP09yZGVyZWRNYXAoKTpNYXAoKSkuYXNNdXRhYmxlKCk7cy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKF8sdyl7dS51cGRhdGUoby5jYWxsKGksXyx3LHMpLChmdW5jdGlvbihzKXtyZXR1cm4ocz1zfHxbXSkucHVzaChhP1t3LF9dOl8pLHN9KSl9KSk7dmFyIF89aXRlcmFibGVDbGFzcyhzKTtyZXR1cm4gdS5tYXAoKGZ1bmN0aW9uKG8pe3JldHVybiByZWlmeShzLF8obykpfSkpfWZ1bmN0aW9uIHNsaWNlRmFjdG9yeShzLG8saSxhKXt2YXIgdT1zLnNpemU7aWYodm9pZCAwIT09byYmKG98PTApLHZvaWQgMCE9PWkmJihpPT09MS8wP2k9dTppfD0wKSx3aG9sZVNsaWNlKG8saSx1KSlyZXR1cm4gczt2YXIgXz1yZXNvbHZlQmVnaW4obyx1KSx3PXJlc29sdmVFbmQoaSx1KTtpZihfIT1ffHx3IT13KXJldHVybiBzbGljZUZhY3Rvcnkocy50b1NlcSgpLmNhY2hlUmVzdWx0KCksbyxpLGEpO3ZhciB4LEM9dy1fO0M9PUMmJih4PUM8MD8wOkMpO3ZhciBqPW1ha2VTZXF1ZW5jZShzKTtyZXR1cm4gai5zaXplPTA9PT14P3g6cy5zaXplJiZ4fHx2b2lkIDAsIWEmJmlzU2VxKHMpJiZ4Pj0wJiYoai5nZXQ9ZnVuY3Rpb24obyxpKXtyZXR1cm4obz13cmFwSW5kZXgodGhpcyxvKSk+PTAmJm88eD9zLmdldChvK18saSk6aX0pLGouX19pdGVyYXRlVW5jYWNoZWQ9ZnVuY3Rpb24obyxpKXt2YXIgdT10aGlzO2lmKDA9PT14KXJldHVybiAwO2lmKGkpcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdGUobyxpKTt2YXIgdz0wLEM9ITAsaj0wO3JldHVybiBzLl9faXRlcmF0ZSgoZnVuY3Rpb24ocyxpKXtpZighQ3x8IShDPXcrKzxfKSlyZXR1cm4gaisrLCExIT09byhzLGE/aTpqLTEsdSkmJmohPT14fSkpLGp9LGouX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKG8saSl7aWYoMCE9PXgmJmkpcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKG8saSk7dmFyIHU9MCE9PXgmJnMuX19pdGVyYXRvcihvLGkpLHc9MCxDPTA7cmV0dXJuIG5ldyBJdGVyYXRvcigoZnVuY3Rpb24oKXtmb3IoO3crKzxfOyl1Lm5leHQoKTtpZigrK0M+eClyZXR1cm4gaXRlcmF0b3JEb25lKCk7dmFyIHM9dS5uZXh0KCk7cmV0dXJuIGF8fG89PT1VP3M6aXRlcmF0b3JWYWx1ZShvLEMtMSxvPT09JD92b2lkIDA6cy52YWx1ZVsxXSxzKX0pKX0san1mdW5jdGlvbiB0YWtlV2hpbGVGYWN0b3J5KHMsbyxpKXt2YXIgYT1tYWtlU2VxdWVuY2Uocyk7cmV0dXJuIGEuX19pdGVyYXRlVW5jYWNoZWQ9ZnVuY3Rpb24oYSx1KXt2YXIgXz10aGlzO2lmKHUpcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdGUoYSx1KTt2YXIgdz0wO3JldHVybiBzLl9faXRlcmF0ZSgoZnVuY3Rpb24ocyx1LHgpe3JldHVybiBvLmNhbGwoaSxzLHUseCkmJisrdyYmYShzLHUsXyl9KSksd30sYS5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24oYSx1KXt2YXIgXz10aGlzO2lmKHUpcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKGEsdSk7dmFyIHc9cy5fX2l0ZXJhdG9yKFYsdSkseD0hMDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe2lmKCF4KXJldHVybiBpdGVyYXRvckRvbmUoKTt2YXIgcz13Lm5leHQoKTtpZihzLmRvbmUpcmV0dXJuIHM7dmFyIHU9cy52YWx1ZSxDPXVbMF0saj11WzFdO3JldHVybiBvLmNhbGwoaSxqLEMsXyk/YT09PVY/czppdGVyYXRvclZhbHVlKGEsQyxqLHMpOih4PSExLGl0ZXJhdG9yRG9uZSgpKX0pKX0sYX1mdW5jdGlvbiBza2lwV2hpbGVGYWN0b3J5KHMsbyxpLGEpe3ZhciB1PW1ha2VTZXF1ZW5jZShzKTtyZXR1cm4gdS5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbih1LF8pe3ZhciB3PXRoaXM7aWYoXylyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZSh1LF8pO3ZhciB4PSEwLEM9MDtyZXR1cm4gcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHMsXyxqKXtpZigheHx8ISh4PW8uY2FsbChpLHMsXyxqKSkpcmV0dXJuIEMrKyx1KHMsYT9fOkMtMSx3KX0pKSxDfSx1Ll9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbih1LF8pe3ZhciB3PXRoaXM7aWYoXylyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodSxfKTt2YXIgeD1zLl9faXRlcmF0b3IoVixfKSxDPSEwLGo9MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciBzLF8sTDtkb3tpZigocz14Lm5leHQoKSkuZG9uZSlyZXR1cm4gYXx8dT09PVU/czppdGVyYXRvclZhbHVlKHUsaisrLHU9PT0kP3ZvaWQgMDpzLnZhbHVlWzFdLHMpO3ZhciBCPXMudmFsdWU7Xz1CWzBdLEw9QlsxXSxDJiYoQz1vLmNhbGwoaSxMLF8sdykpfXdoaWxlKEMpO3JldHVybiB1PT09Vj9zOml0ZXJhdG9yVmFsdWUodSxfLEwscyl9KSl9LHV9ZnVuY3Rpb24gY29uY2F0RmFjdG9yeShzLG8pe3ZhciBpPWlzS2V5ZWQocyksYT1bc10uY29uY2F0KG8pLm1hcCgoZnVuY3Rpb24ocyl7cmV0dXJuIGlzSXRlcmFibGUocyk/aSYmKHM9S2V5ZWRJdGVyYWJsZShzKSk6cz1pP2tleWVkU2VxRnJvbVZhbHVlKHMpOmluZGV4ZWRTZXFGcm9tVmFsdWUoQXJyYXkuaXNBcnJheShzKT9zOltzXSksc30pKS5maWx0ZXIoKGZ1bmN0aW9uKHMpe3JldHVybiAwIT09cy5zaXplfSkpO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gcztpZigxPT09YS5sZW5ndGgpe3ZhciB1PWFbMF07aWYodT09PXN8fGkmJmlzS2V5ZWQodSl8fGlzSW5kZXhlZChzKSYmaXNJbmRleGVkKHUpKXJldHVybiB1fXZhciBfPW5ldyBBcnJheVNlcShhKTtyZXR1cm4gaT9fPV8udG9LZXllZFNlcSgpOmlzSW5kZXhlZChzKXx8KF89Xy50b1NldFNlcSgpKSwoXz1fLmZsYXR0ZW4oITApKS5zaXplPWEucmVkdWNlKChmdW5jdGlvbihzLG8pe2lmKHZvaWQgMCE9PXMpe3ZhciBpPW8uc2l6ZTtpZih2b2lkIDAhPT1pKXJldHVybiBzK2l9fSksMCksX31mdW5jdGlvbiBmbGF0dGVuRmFjdG9yeShzLG8saSl7dmFyIGE9bWFrZVNlcXVlbmNlKHMpO3JldHVybiBhLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKGEsdSl7dmFyIF89MCx3PSExO2Z1bmN0aW9uIGZsYXREZWVwKHMseCl7dmFyIEM9dGhpcztzLl9faXRlcmF0ZSgoZnVuY3Rpb24ocyx1KXtyZXR1cm4oIW98fHg8bykmJmlzSXRlcmFibGUocyk/ZmxhdERlZXAocyx4KzEpOiExPT09YShzLGk/dTpfKyssQykmJih3PSEwKSwhd30pLHUpfXJldHVybiBmbGF0RGVlcChzLDApLF99LGEuX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKGEsdSl7dmFyIF89cy5fX2l0ZXJhdG9yKGEsdSksdz1bXSx4PTA7cmV0dXJuIG5ldyBJdGVyYXRvcigoZnVuY3Rpb24oKXtmb3IoO187KXt2YXIgcz1fLm5leHQoKTtpZighMT09PXMuZG9uZSl7dmFyIEM9cy52YWx1ZTtpZihhPT09ViYmKEM9Q1sxXSksbyYmISh3Lmxlbmd0aDxvKXx8IWlzSXRlcmFibGUoQykpcmV0dXJuIGk/czppdGVyYXRvclZhbHVlKGEseCsrLEMscyk7dy5wdXNoKF8pLF89Qy5fX2l0ZXJhdG9yKGEsdSl9ZWxzZSBfPXcucG9wKCl9cmV0dXJuIGl0ZXJhdG9yRG9uZSgpfSkpfSxhfWZ1bmN0aW9uIGZsYXRNYXBGYWN0b3J5KHMsbyxpKXt2YXIgYT1pdGVyYWJsZUNsYXNzKHMpO3JldHVybiBzLnRvU2VxKCkubWFwKChmdW5jdGlvbih1LF8pe3JldHVybiBhKG8uY2FsbChpLHUsXyxzKSl9KSkuZmxhdHRlbighMCl9ZnVuY3Rpb24gaW50ZXJwb3NlRmFjdG9yeShzLG8pe3ZhciBpPW1ha2VTZXF1ZW5jZShzKTtyZXR1cm4gaS5zaXplPXMuc2l6ZSYmMipzLnNpemUtMSxpLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKGksYSl7dmFyIHU9dGhpcyxfPTA7cmV0dXJuIHMuX19pdGVyYXRlKChmdW5jdGlvbihzLGEpe3JldHVybighX3x8ITEhPT1pKG8sXysrLHUpKSYmITEhPT1pKHMsXysrLHUpfSksYSksX30saS5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24oaSxhKXt2YXIgdSxfPXMuX19pdGVyYXRvcihVLGEpLHc9MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3JldHVybighdXx8dyUyKSYmKHU9Xy5uZXh0KCkpLmRvbmU/dTp3JTI/aXRlcmF0b3JWYWx1ZShpLHcrKyxvKTppdGVyYXRvclZhbHVlKGksdysrLHUudmFsdWUsdSl9KSl9LGl9ZnVuY3Rpb24gc29ydEZhY3RvcnkocyxvLGkpe298fChvPWRlZmF1bHRDb21wYXJhdG9yKTt2YXIgYT1pc0tleWVkKHMpLHU9MCxfPXMudG9TZXEoKS5tYXAoKGZ1bmN0aW9uKG8sYSl7cmV0dXJuW2Esbyx1KyssaT9pKG8sYSxzKTpvXX0pKS50b0FycmF5KCk7cmV0dXJuIF8uc29ydCgoZnVuY3Rpb24ocyxpKXtyZXR1cm4gbyhzWzNdLGlbM10pfHxzWzJdLWlbMl19KSkuZm9yRWFjaChhP2Z1bmN0aW9uKHMsbyl7X1tvXS5sZW5ndGg9Mn06ZnVuY3Rpb24ocyxvKXtfW29dPXNbMV19KSxhP0tleWVkU2VxKF8pOmlzSW5kZXhlZChzKT9JbmRleGVkU2VxKF8pOlNldFNlcShfKX1mdW5jdGlvbiBtYXhGYWN0b3J5KHMsbyxpKXtpZihvfHwobz1kZWZhdWx0Q29tcGFyYXRvciksaSl7dmFyIGE9cy50b1NlcSgpLm1hcCgoZnVuY3Rpb24obyxhKXtyZXR1cm5bbyxpKG8sYSxzKV19KSkucmVkdWNlKChmdW5jdGlvbihzLGkpe3JldHVybiBtYXhDb21wYXJlKG8sc1sxXSxpWzFdKT9pOnN9KSk7cmV0dXJuIGEmJmFbMF19cmV0dXJuIHMucmVkdWNlKChmdW5jdGlvbihzLGkpe3JldHVybiBtYXhDb21wYXJlKG8scyxpKT9pOnN9KSl9ZnVuY3Rpb24gbWF4Q29tcGFyZShzLG8saSl7dmFyIGE9cyhpLG8pO3JldHVybiAwPT09YSYmaSE9PW8mJihudWxsPT1pfHxpIT1pKXx8YT4wfWZ1bmN0aW9uIHppcFdpdGhGYWN0b3J5KHMsbyxpKXt2YXIgYT1tYWtlU2VxdWVuY2Uocyk7cmV0dXJuIGEuc2l6ZT1uZXcgQXJyYXlTZXEoaSkubWFwKChmdW5jdGlvbihzKXtyZXR1cm4gcy5zaXplfSkpLm1pbigpLGEuX19pdGVyYXRlPWZ1bmN0aW9uKHMsbyl7Zm9yKHZhciBpLGE9dGhpcy5fX2l0ZXJhdG9yKFUsbyksdT0wOyEoaT1hLm5leHQoKSkuZG9uZSYmITEhPT1zKGkudmFsdWUsdSsrLHRoaXMpOyk7cmV0dXJuIHV9LGEuX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKHMsYSl7dmFyIHU9aS5tYXAoKGZ1bmN0aW9uKHMpe3JldHVybiBzPUl0ZXJhYmxlKHMpLGdldEl0ZXJhdG9yKGE/cy5yZXZlcnNlKCk6cyl9KSksXz0wLHc9ITE7cmV0dXJuIG5ldyBJdGVyYXRvcigoZnVuY3Rpb24oKXt2YXIgaTtyZXR1cm4gd3x8KGk9dS5tYXAoKGZ1bmN0aW9uKHMpe3JldHVybiBzLm5leHQoKX0pKSx3PWkuc29tZSgoZnVuY3Rpb24ocyl7cmV0dXJuIHMuZG9uZX0pKSksdz9pdGVyYXRvckRvbmUoKTppdGVyYXRvclZhbHVlKHMsXysrLG8uYXBwbHkobnVsbCxpLm1hcCgoZnVuY3Rpb24ocyl7cmV0dXJuIHMudmFsdWV9KSkpKX0pKX0sYX1mdW5jdGlvbiByZWlmeShzLG8pe3JldHVybiBpc1NlcShzKT9vOnMuY29uc3RydWN0b3Iobyl9ZnVuY3Rpb24gdmFsaWRhdGVFbnRyeShzKXtpZihzIT09T2JqZWN0KHMpKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIFtLLCBWXSB0dXBsZTogIitzKX1mdW5jdGlvbiByZXNvbHZlU2l6ZShzKXtyZXR1cm4gYXNzZXJ0Tm90SW5maW5pdGUocy5zaXplKSxlbnN1cmVTaXplKHMpfWZ1bmN0aW9uIGl0ZXJhYmxlQ2xhc3Mocyl7cmV0dXJuIGlzS2V5ZWQocyk/S2V5ZWRJdGVyYWJsZTppc0luZGV4ZWQocyk/SW5kZXhlZEl0ZXJhYmxlOlNldEl0ZXJhYmxlfWZ1bmN0aW9uIG1ha2VTZXF1ZW5jZShzKXtyZXR1cm4gT2JqZWN0LmNyZWF0ZSgoaXNLZXllZChzKT9LZXllZFNlcTppc0luZGV4ZWQocyk/SW5kZXhlZFNlcTpTZXRTZXEpLnByb3RvdHlwZSl9ZnVuY3Rpb24gY2FjaGVSZXN1bHRUaHJvdWdoKCl7cmV0dXJuIHRoaXMuX2l0ZXIuY2FjaGVSZXN1bHQ/KHRoaXMuX2l0ZXIuY2FjaGVSZXN1bHQoKSx0aGlzLnNpemU9dGhpcy5faXRlci5zaXplLHRoaXMpOlNlcS5wcm90b3R5cGUuY2FjaGVSZXN1bHQuY2FsbCh0aGlzKX1mdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihzLG8pe3JldHVybiBzPm8/MTpzPG8/LTE6MH1mdW5jdGlvbiBmb3JjZUl0ZXJhdG9yKHMpe3ZhciBvPWdldEl0ZXJhdG9yKHMpO2lmKCFvKXtpZighaXNBcnJheUxpa2UocykpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgaXRlcmFibGUgb3IgYXJyYXktbGlrZTogIitzKTtvPWdldEl0ZXJhdG9yKEl0ZXJhYmxlKHMpKX1yZXR1cm4gb31mdW5jdGlvbiBSZWNvcmQocyxvKXt2YXIgaSxhPWZ1bmN0aW9uIFJlY29yZChfKXtpZihfIGluc3RhbmNlb2YgYSlyZXR1cm4gXztpZighKHRoaXMgaW5zdGFuY2VvZiBhKSlyZXR1cm4gbmV3IGEoXyk7aWYoIWkpe2k9ITA7dmFyIHc9T2JqZWN0LmtleXMocyk7c2V0UHJvcHModSx3KSx1LnNpemU9dy5sZW5ndGgsdS5fbmFtZT1vLHUuX2tleXM9dyx1Ll9kZWZhdWx0VmFsdWVzPXN9dGhpcy5fbWFwPU1hcChfKX0sdT1hLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHR0KTtyZXR1cm4gdS5jb25zdHJ1Y3Rvcj1hLGF9Y3JlYXRlQ2xhc3MoT3JkZXJlZE1hcCxNYXApLE9yZGVyZWRNYXAub2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyhhcmd1bWVudHMpfSxPcmRlcmVkTWFwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fdG9TdHJpbmcoIk9yZGVyZWRNYXAgeyIsIn0iKX0sT3JkZXJlZE1hcC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHMsbyl7dmFyIGk9dGhpcy5fbWFwLmdldChzKTtyZXR1cm4gdm9pZCAwIT09aT90aGlzLl9saXN0LmdldChpKVsxXTpvfSxPcmRlcmVkTWFwLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5zaXplP3RoaXM6dGhpcy5fX293bmVySUQ/KHRoaXMuc2l6ZT0wLHRoaXMuX21hcC5jbGVhcigpLHRoaXMuX2xpc3QuY2xlYXIoKSx0aGlzKTplbXB0eU9yZGVyZWRNYXAoKX0sT3JkZXJlZE1hcC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHVwZGF0ZU9yZGVyZWRNYXAodGhpcyxzLG8pfSxPcmRlcmVkTWFwLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24ocyl7cmV0dXJuIHVwZGF0ZU9yZGVyZWRNYXAodGhpcyxzLGopfSxPcmRlcmVkTWFwLnByb3RvdHlwZS53YXNBbHRlcmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC53YXNBbHRlcmVkKCl8fHRoaXMuX2xpc3Qud2FzQWx0ZXJlZCgpfSxPcmRlcmVkTWFwLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24ocyxvKXt2YXIgaT10aGlzO3JldHVybiB0aGlzLl9saXN0Ll9faXRlcmF0ZSgoZnVuY3Rpb24obyl7cmV0dXJuIG8mJnMob1sxXSxvWzBdLGkpfSksbyl9LE9yZGVyZWRNYXAucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdGhpcy5fbGlzdC5mcm9tRW50cnlTZXEoKS5fX2l0ZXJhdG9yKHMsbyl9LE9yZGVyZWRNYXAucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24ocyl7aWYocz09PXRoaXMuX19vd25lcklEKXJldHVybiB0aGlzO3ZhciBvPXRoaXMuX21hcC5fX2Vuc3VyZU93bmVyKHMpLGk9dGhpcy5fbGlzdC5fX2Vuc3VyZU93bmVyKHMpO3JldHVybiBzP21ha2VPcmRlcmVkTWFwKG8saSxzLHRoaXMuX19oYXNoKToodGhpcy5fX293bmVySUQ9cyx0aGlzLl9tYXA9byx0aGlzLl9saXN0PWksdGhpcyl9LE9yZGVyZWRNYXAuaXNPcmRlcmVkTWFwPWlzT3JkZXJlZE1hcCxPcmRlcmVkTWFwLnByb3RvdHlwZVt1XT0hMCxPcmRlcmVkTWFwLnByb3RvdHlwZVtfXT1PcmRlcmVkTWFwLnByb3RvdHlwZS5yZW1vdmUsY3JlYXRlQ2xhc3MoVG9LZXllZFNlcXVlbmNlLEtleWVkU2VxKSxUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLmdldD1mdW5jdGlvbihzLG8pe3JldHVybiB0aGlzLl9pdGVyLmdldChzLG8pfSxUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLmhhcz1mdW5jdGlvbihzKXtyZXR1cm4gdGhpcy5faXRlci5oYXMocyl9LFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUudmFsdWVTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlci52YWx1ZVNlcSgpfSxUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXt2YXIgcz10aGlzLG89cmV2ZXJzZUZhY3RvcnkodGhpcywhMCk7cmV0dXJuIHRoaXMuX3VzZUtleXN8fChvLnZhbHVlU2VxPWZ1bmN0aW9uKCl7cmV0dXJuIHMuX2l0ZXIudG9TZXEoKS5yZXZlcnNlKCl9KSxvfSxUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLm1hcD1mdW5jdGlvbihzLG8pe3ZhciBpPXRoaXMsYT1tYXBGYWN0b3J5KHRoaXMscyxvKTtyZXR1cm4gdGhpcy5fdXNlS2V5c3x8KGEudmFsdWVTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gaS5faXRlci50b1NlcSgpLm1hcChzLG8pfSksYX0sVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24ocyxvKXt2YXIgaSxhPXRoaXM7cmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRlKHRoaXMuX3VzZUtleXM/ZnVuY3Rpb24obyxpKXtyZXR1cm4gcyhvLGksYSl9OihpPW8/cmVzb2x2ZVNpemUodGhpcyk6MCxmdW5jdGlvbih1KXtyZXR1cm4gcyh1LG8/LS1pOmkrKyxhKX0pLG8pfSxUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24ocyxvKXtpZih0aGlzLl91c2VLZXlzKXJldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0b3IocyxvKTt2YXIgaT10aGlzLl9pdGVyLl9faXRlcmF0b3IoVSxvKSxhPW8/cmVzb2x2ZVNpemUodGhpcyk6MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciB1PWkubmV4dCgpO3JldHVybiB1LmRvbmU/dTppdGVyYXRvclZhbHVlKHMsbz8tLWE6YSsrLHUudmFsdWUsdSl9KSl9LFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGVbdV09ITAsY3JlYXRlQ2xhc3MoVG9JbmRleGVkU2VxdWVuY2UsSW5kZXhlZFNlcSksVG9JbmRleGVkU2VxdWVuY2UucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLl9pdGVyLmluY2x1ZGVzKHMpfSxUb0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHMsbyl7dmFyIGk9dGhpcyxhPTA7cmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRlKChmdW5jdGlvbihvKXtyZXR1cm4gcyhvLGErKyxpKX0pLG8pfSxUb0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihzLG8pe3ZhciBpPXRoaXMuX2l0ZXIuX19pdGVyYXRvcihVLG8pLGE9MDtyZXR1cm4gbmV3IEl0ZXJhdG9yKChmdW5jdGlvbigpe3ZhciBvPWkubmV4dCgpO3JldHVybiBvLmRvbmU/bzppdGVyYXRvclZhbHVlKHMsYSsrLG8udmFsdWUsbyl9KSl9LGNyZWF0ZUNsYXNzKFRvU2V0U2VxdWVuY2UsU2V0U2VxKSxUb1NldFNlcXVlbmNlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuX2l0ZXIuaW5jbHVkZXMocyl9LFRvU2V0U2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbihzLG8pe3ZhciBpPXRoaXM7cmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRlKChmdW5jdGlvbihvKXtyZXR1cm4gcyhvLG8saSl9KSxvKX0sVG9TZXRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihzLG8pe3ZhciBpPXRoaXMuX2l0ZXIuX19pdGVyYXRvcihVLG8pO3JldHVybiBuZXcgSXRlcmF0b3IoKGZ1bmN0aW9uKCl7dmFyIG89aS5uZXh0KCk7cmV0dXJuIG8uZG9uZT9vOml0ZXJhdG9yVmFsdWUocyxvLnZhbHVlLG8udmFsdWUsbyl9KSl9LGNyZWF0ZUNsYXNzKEZyb21FbnRyaWVzU2VxdWVuY2UsS2V5ZWRTZXEpLEZyb21FbnRyaWVzU2VxdWVuY2UucHJvdG90eXBlLmVudHJ5U2VxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2l0ZXIudG9TZXEoKX0sRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHMsbyl7dmFyIGk9dGhpcztyZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoKGZ1bmN0aW9uKG8pe2lmKG8pe3ZhbGlkYXRlRW50cnkobyk7dmFyIGE9aXNJdGVyYWJsZShvKTtyZXR1cm4gcyhhP28uZ2V0KDEpOm9bMV0sYT9vLmdldCgwKTpvWzBdLGkpfX0pLG8pfSxGcm9tRW50cmllc1NlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHMsbyl7dmFyIGk9dGhpcy5faXRlci5fX2l0ZXJhdG9yKFUsbyk7cmV0dXJuIG5ldyBJdGVyYXRvcigoZnVuY3Rpb24oKXtmb3IoOzspe3ZhciBvPWkubmV4dCgpO2lmKG8uZG9uZSlyZXR1cm4gbzt2YXIgYT1vLnZhbHVlO2lmKGEpe3ZhbGlkYXRlRW50cnkoYSk7dmFyIHU9aXNJdGVyYWJsZShhKTtyZXR1cm4gaXRlcmF0b3JWYWx1ZShzLHU/YS5nZXQoMCk6YVswXSx1P2EuZ2V0KDEpOmFbMV0sbyl9fX0pKX0sVG9JbmRleGVkU2VxdWVuY2UucHJvdG90eXBlLmNhY2hlUmVzdWx0PVRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQ9VG9TZXRTZXF1ZW5jZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQ9RnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQ9Y2FjaGVSZXN1bHRUaHJvdWdoLGNyZWF0ZUNsYXNzKFJlY29yZCxLZXllZENvbGxlY3Rpb24pLFJlY29yZC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKHJlY29yZE5hbWUodGhpcykrIiB7IiwifSIpfSxSZWNvcmQucHJvdG90eXBlLmhhcz1mdW5jdGlvbihzKXtyZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzKX0sUmVjb3JkLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24ocyxvKXtpZighdGhpcy5oYXMocykpcmV0dXJuIG87dmFyIGk9dGhpcy5fZGVmYXVsdFZhbHVlc1tzXTtyZXR1cm4gdGhpcy5fbWFwP3RoaXMuX21hcC5nZXQocyxpKTppfSxSZWNvcmQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7aWYodGhpcy5fX293bmVySUQpcmV0dXJuIHRoaXMuX21hcCYmdGhpcy5fbWFwLmNsZWFyKCksdGhpczt2YXIgcz10aGlzLmNvbnN0cnVjdG9yO3JldHVybiBzLl9lbXB0eXx8KHMuX2VtcHR5PW1ha2VSZWNvcmQodGhpcyxlbXB0eU1hcCgpKSl9LFJlY29yZC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHMsbyl7aWYoIXRoaXMuaGFzKHMpKXRocm93IG5ldyBFcnJvcignQ2Fubm90IHNldCB1bmtub3duIGtleSAiJytzKyciIG9uICcrcmVjb3JkTmFtZSh0aGlzKSk7aWYodGhpcy5fbWFwJiYhdGhpcy5fbWFwLmhhcyhzKSYmbz09PXRoaXMuX2RlZmF1bHRWYWx1ZXNbc10pcmV0dXJuIHRoaXM7dmFyIGk9dGhpcy5fbWFwJiZ0aGlzLl9tYXAuc2V0KHMsbyk7cmV0dXJuIHRoaXMuX19vd25lcklEfHxpPT09dGhpcy5fbWFwP3RoaXM6bWFrZVJlY29yZCh0aGlzLGkpfSxSZWNvcmQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihzKXtpZighdGhpcy5oYXMocykpcmV0dXJuIHRoaXM7dmFyIG89dGhpcy5fbWFwJiZ0aGlzLl9tYXAucmVtb3ZlKHMpO3JldHVybiB0aGlzLl9fb3duZXJJRHx8bz09PXRoaXMuX21hcD90aGlzOm1ha2VSZWNvcmQodGhpcyxvKX0sUmVjb3JkLnByb3RvdHlwZS53YXNBbHRlcmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC53YXNBbHRlcmVkKCl9LFJlY29yZC5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihzLG8pe3ZhciBpPXRoaXM7cmV0dXJuIEtleWVkSXRlcmFibGUodGhpcy5fZGVmYXVsdFZhbHVlcykubWFwKChmdW5jdGlvbihzLG8pe3JldHVybiBpLmdldChvKX0pKS5fX2l0ZXJhdG9yKHMsbyl9LFJlY29yZC5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHMsbyl7dmFyIGk9dGhpcztyZXR1cm4gS2V5ZWRJdGVyYWJsZSh0aGlzLl9kZWZhdWx0VmFsdWVzKS5tYXAoKGZ1bmN0aW9uKHMsbyl7cmV0dXJuIGkuZ2V0KG8pfSkpLl9faXRlcmF0ZShzLG8pfSxSZWNvcmQucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24ocyl7aWYocz09PXRoaXMuX19vd25lcklEKXJldHVybiB0aGlzO3ZhciBvPXRoaXMuX21hcCYmdGhpcy5fbWFwLl9fZW5zdXJlT3duZXIocyk7cmV0dXJuIHM/bWFrZVJlY29yZCh0aGlzLG8scyk6KHRoaXMuX19vd25lcklEPXMsdGhpcy5fbWFwPW8sdGhpcyl9O3ZhciB0dD1SZWNvcmQucHJvdG90eXBlO2Z1bmN0aW9uIG1ha2VSZWNvcmQocyxvLGkpe3ZhciBhPU9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHMpKTtyZXR1cm4gYS5fbWFwPW8sYS5fX293bmVySUQ9aSxhfWZ1bmN0aW9uIHJlY29yZE5hbWUocyl7cmV0dXJuIHMuX25hbWV8fHMuY29uc3RydWN0b3IubmFtZXx8IlJlY29yZCJ9ZnVuY3Rpb24gc2V0UHJvcHMocyxvKXt0cnl7by5mb3JFYWNoKHNldFByb3AuYmluZCh2b2lkIDAscykpfWNhdGNoKHMpe319ZnVuY3Rpb24gc2V0UHJvcChzLG8pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShzLG8se2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldChvKX0sc2V0OmZ1bmN0aW9uKHMpe2ludmFyaWFudCh0aGlzLl9fb3duZXJJRCwiQ2Fubm90IHNldCBvbiBhbiBpbW11dGFibGUgcmVjb3JkLiIpLHRoaXMuc2V0KG8scyl9fSl9ZnVuY3Rpb24gU2V0KHMpe3JldHVybiBudWxsPT1zP2VtcHR5U2V0KCk6aXNTZXQocykmJiFpc09yZGVyZWQocyk/czplbXB0eVNldCgpLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKG8pe3ZhciBpPVNldEl0ZXJhYmxlKHMpO2Fzc2VydE5vdEluZmluaXRlKGkuc2l6ZSksaS5mb3JFYWNoKChmdW5jdGlvbihzKXtyZXR1cm4gby5hZGQocyl9KSl9KSl9ZnVuY3Rpb24gaXNTZXQocyl7cmV0dXJuISghc3x8IXNbbnRdKX10dFtfXT10dC5yZW1vdmUsdHQuZGVsZXRlSW49dHQucmVtb3ZlSW49JGUucmVtb3ZlSW4sdHQubWVyZ2U9JGUubWVyZ2UsdHQubWVyZ2VXaXRoPSRlLm1lcmdlV2l0aCx0dC5tZXJnZUluPSRlLm1lcmdlSW4sdHQubWVyZ2VEZWVwPSRlLm1lcmdlRGVlcCx0dC5tZXJnZURlZXBXaXRoPSRlLm1lcmdlRGVlcFdpdGgsdHQubWVyZ2VEZWVwSW49JGUubWVyZ2VEZWVwSW4sdHQuc2V0SW49JGUuc2V0SW4sdHQudXBkYXRlPSRlLnVwZGF0ZSx0dC51cGRhdGVJbj0kZS51cGRhdGVJbix0dC53aXRoTXV0YXRpb25zPSRlLndpdGhNdXRhdGlvbnMsdHQuYXNNdXRhYmxlPSRlLmFzTXV0YWJsZSx0dC5hc0ltbXV0YWJsZT0kZS5hc0ltbXV0YWJsZSxjcmVhdGVDbGFzcyhTZXQsU2V0Q29sbGVjdGlvbiksU2V0Lm9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMoYXJndW1lbnRzKX0sU2V0LmZyb21LZXlzPWZ1bmN0aW9uKHMpe3JldHVybiB0aGlzKEtleWVkSXRlcmFibGUocykua2V5U2VxKCkpfSxTZXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiU2V0IHsiLCJ9Iil9LFNldC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLl9tYXAuaGFzKHMpfSxTZXQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihzKXtyZXR1cm4gdXBkYXRlU2V0KHRoaXMsdGhpcy5fbWFwLnNldChzLCEwKSl9LFNldC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHMpe3JldHVybiB1cGRhdGVTZXQodGhpcyx0aGlzLl9tYXAucmVtb3ZlKHMpKX0sU2V0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3JldHVybiB1cGRhdGVTZXQodGhpcyx0aGlzLl9tYXAuY2xlYXIoKSl9LFNldC5wcm90b3R5cGUudW5pb249ZnVuY3Rpb24oKXt2YXIgbz1zLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiAwPT09KG89by5maWx0ZXIoKGZ1bmN0aW9uKHMpe3JldHVybiAwIT09cy5zaXplfSkpKS5sZW5ndGg/dGhpczowIT09dGhpcy5zaXplfHx0aGlzLl9fb3duZXJJRHx8MSE9PW8ubGVuZ3RoP3RoaXMud2l0aE11dGF0aW9ucygoZnVuY3Rpb24ocyl7Zm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspU2V0SXRlcmFibGUob1tpXSkuZm9yRWFjaCgoZnVuY3Rpb24obyl7cmV0dXJuIHMuYWRkKG8pfSkpfSkpOnRoaXMuY29uc3RydWN0b3Iob1swXSl9LFNldC5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKCl7dmFyIG89cy5jYWxsKGFyZ3VtZW50cywwKTtpZigwPT09by5sZW5ndGgpcmV0dXJuIHRoaXM7bz1vLm1hcCgoZnVuY3Rpb24ocyl7cmV0dXJuIFNldEl0ZXJhYmxlKHMpfSkpO3ZhciBpPXRoaXM7cmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucygoZnVuY3Rpb24ocyl7aS5mb3JFYWNoKChmdW5jdGlvbihpKXtvLmV2ZXJ5KChmdW5jdGlvbihzKXtyZXR1cm4gcy5pbmNsdWRlcyhpKX0pKXx8cy5yZW1vdmUoaSl9KSl9KSl9LFNldC5wcm90b3R5cGUuc3VidHJhY3Q9ZnVuY3Rpb24oKXt2YXIgbz1zLmNhbGwoYXJndW1lbnRzLDApO2lmKDA9PT1vLmxlbmd0aClyZXR1cm4gdGhpcztvPW8ubWFwKChmdW5jdGlvbihzKXtyZXR1cm4gU2V0SXRlcmFibGUocyl9KSk7dmFyIGk9dGhpcztyZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKChmdW5jdGlvbihzKXtpLmZvckVhY2goKGZ1bmN0aW9uKGkpe28uc29tZSgoZnVuY3Rpb24ocyl7cmV0dXJuIHMuaW5jbHVkZXMoaSl9KSkmJnMucmVtb3ZlKGkpfSkpfSkpfSxTZXQucHJvdG90eXBlLm1lcmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxTZXQucHJvdG90eXBlLm1lcmdlV2l0aD1mdW5jdGlvbihvKXt2YXIgaT1zLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0aGlzLnVuaW9uLmFwcGx5KHRoaXMsaSl9LFNldC5wcm90b3R5cGUuc29ydD1mdW5jdGlvbihzKXtyZXR1cm4gT3JkZXJlZFNldChzb3J0RmFjdG9yeSh0aGlzLHMpKX0sU2V0LnByb3RvdHlwZS5zb3J0Qnk9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gT3JkZXJlZFNldChzb3J0RmFjdG9yeSh0aGlzLG8scykpfSxTZXQucHJvdG90eXBlLndhc0FsdGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwLndhc0FsdGVyZWQoKX0sU2V0LnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24ocyxvKXt2YXIgaT10aGlzO3JldHVybiB0aGlzLl9tYXAuX19pdGVyYXRlKChmdW5jdGlvbihvLGEpe3JldHVybiBzKGEsYSxpKX0pLG8pfSxTZXQucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdGhpcy5fbWFwLm1hcCgoZnVuY3Rpb24ocyxvKXtyZXR1cm4gb30pKS5fX2l0ZXJhdG9yKHMsbyl9LFNldC5wcm90b3R5cGUuX19lbnN1cmVPd25lcj1mdW5jdGlvbihzKXtpZihzPT09dGhpcy5fX293bmVySUQpcmV0dXJuIHRoaXM7dmFyIG89dGhpcy5fbWFwLl9fZW5zdXJlT3duZXIocyk7cmV0dXJuIHM/dGhpcy5fX21ha2UobyxzKToodGhpcy5fX293bmVySUQ9cyx0aGlzLl9tYXA9byx0aGlzKX0sU2V0LmlzU2V0PWlzU2V0O3ZhciBydCxudD0iQEBfX0lNTVVUQUJMRV9TRVRfX0BAIixzdD1TZXQucHJvdG90eXBlO2Z1bmN0aW9uIHVwZGF0ZVNldChzLG8pe3JldHVybiBzLl9fb3duZXJJRD8ocy5zaXplPW8uc2l6ZSxzLl9tYXA9byxzKTpvPT09cy5fbWFwP3M6MD09PW8uc2l6ZT9zLl9fZW1wdHkoKTpzLl9fbWFrZShvKX1mdW5jdGlvbiBtYWtlU2V0KHMsbyl7dmFyIGk9T2JqZWN0LmNyZWF0ZShzdCk7cmV0dXJuIGkuc2l6ZT1zP3Muc2l6ZTowLGkuX21hcD1zLGkuX19vd25lcklEPW8saX1mdW5jdGlvbiBlbXB0eVNldCgpe3JldHVybiBydHx8KHJ0PW1ha2VTZXQoZW1wdHlNYXAoKSkpfWZ1bmN0aW9uIE9yZGVyZWRTZXQocyl7cmV0dXJuIG51bGw9PXM/ZW1wdHlPcmRlcmVkU2V0KCk6aXNPcmRlcmVkU2V0KHMpP3M6ZW1wdHlPcmRlcmVkU2V0KCkud2l0aE11dGF0aW9ucygoZnVuY3Rpb24obyl7dmFyIGk9U2V0SXRlcmFibGUocyk7YXNzZXJ0Tm90SW5maW5pdGUoaS5zaXplKSxpLmZvckVhY2goKGZ1bmN0aW9uKHMpe3JldHVybiBvLmFkZChzKX0pKX0pKX1mdW5jdGlvbiBpc09yZGVyZWRTZXQocyl7cmV0dXJuIGlzU2V0KHMpJiZpc09yZGVyZWQocyl9c3RbbnRdPSEwLHN0W19dPXN0LnJlbW92ZSxzdC5tZXJnZURlZXA9c3QubWVyZ2Usc3QubWVyZ2VEZWVwV2l0aD1zdC5tZXJnZVdpdGgsc3Qud2l0aE11dGF0aW9ucz0kZS53aXRoTXV0YXRpb25zLHN0LmFzTXV0YWJsZT0kZS5hc011dGFibGUsc3QuYXNJbW11dGFibGU9JGUuYXNJbW11dGFibGUsc3QuX19lbXB0eT1lbXB0eVNldCxzdC5fX21ha2U9bWFrZVNldCxjcmVhdGVDbGFzcyhPcmRlcmVkU2V0LFNldCksT3JkZXJlZFNldC5vZj1mdW5jdGlvbigpe3JldHVybiB0aGlzKGFyZ3VtZW50cyl9LE9yZGVyZWRTZXQuZnJvbUtleXM9ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMoS2V5ZWRJdGVyYWJsZShzKS5rZXlTZXEoKSl9LE9yZGVyZWRTZXQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiT3JkZXJlZFNldCB7IiwifSIpfSxPcmRlcmVkU2V0LmlzT3JkZXJlZFNldD1pc09yZGVyZWRTZXQ7dmFyIG90LGl0PU9yZGVyZWRTZXQucHJvdG90eXBlO2Z1bmN0aW9uIG1ha2VPcmRlcmVkU2V0KHMsbyl7dmFyIGk9T2JqZWN0LmNyZWF0ZShpdCk7cmV0dXJuIGkuc2l6ZT1zP3Muc2l6ZTowLGkuX21hcD1zLGkuX19vd25lcklEPW8saX1mdW5jdGlvbiBlbXB0eU9yZGVyZWRTZXQoKXtyZXR1cm4gb3R8fChvdD1tYWtlT3JkZXJlZFNldChlbXB0eU9yZGVyZWRNYXAoKSkpfWZ1bmN0aW9uIFN0YWNrKHMpe3JldHVybiBudWxsPT1zP2VtcHR5U3RhY2soKTppc1N0YWNrKHMpP3M6ZW1wdHlTdGFjaygpLnVuc2hpZnRBbGwocyl9ZnVuY3Rpb24gaXNTdGFjayhzKXtyZXR1cm4hKCFzfHwhc1tjdF0pfWl0W3VdPSEwLGl0Ll9fZW1wdHk9ZW1wdHlPcmRlcmVkU2V0LGl0Ll9fbWFrZT1tYWtlT3JkZXJlZFNldCxjcmVhdGVDbGFzcyhTdGFjayxJbmRleGVkQ29sbGVjdGlvbiksU3RhY2sub2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyhhcmd1bWVudHMpfSxTdGFjay5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJTdGFjayBbIiwiXSIpfSxTdGFjay5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHMsbyl7dmFyIGk9dGhpcy5faGVhZDtmb3Iocz13cmFwSW5kZXgodGhpcyxzKTtpJiZzLS07KWk9aS5uZXh0O3JldHVybiBpP2kudmFsdWU6b30sU3RhY2sucHJvdG90eXBlLnBlZWs9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGVhZCYmdGhpcy5faGVhZC52YWx1ZX0sU3RhY2sucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcztmb3IodmFyIHM9dGhpcy5zaXplK2FyZ3VtZW50cy5sZW5ndGgsbz10aGlzLl9oZWFkLGk9YXJndW1lbnRzLmxlbmd0aC0xO2k+PTA7aS0tKW89e3ZhbHVlOmFyZ3VtZW50c1tpXSxuZXh0Om99O3JldHVybiB0aGlzLl9fb3duZXJJRD8odGhpcy5zaXplPXMsdGhpcy5faGVhZD1vLHRoaXMuX19oYXNoPXZvaWQgMCx0aGlzLl9fYWx0ZXJlZD0hMCx0aGlzKTptYWtlU3RhY2socyxvKX0sU3RhY2sucHJvdG90eXBlLnB1c2hBbGw9ZnVuY3Rpb24ocyl7aWYoMD09PShzPUluZGV4ZWRJdGVyYWJsZShzKSkuc2l6ZSlyZXR1cm4gdGhpczthc3NlcnROb3RJbmZpbml0ZShzLnNpemUpO3ZhciBvPXRoaXMuc2l6ZSxpPXRoaXMuX2hlYWQ7cmV0dXJuIHMucmV2ZXJzZSgpLmZvckVhY2goKGZ1bmN0aW9uKHMpe28rKyxpPXt2YWx1ZTpzLG5leHQ6aX19KSksdGhpcy5fX293bmVySUQ/KHRoaXMuc2l6ZT1vLHRoaXMuX2hlYWQ9aSx0aGlzLl9faGFzaD12b2lkIDAsdGhpcy5fX2FsdGVyZWQ9ITAsdGhpcyk6bWFrZVN0YWNrKG8saSl9LFN0YWNrLnByb3RvdHlwZS5wb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zbGljZSgxKX0sU3RhY2sucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sU3RhY2sucHJvdG90eXBlLnVuc2hpZnRBbGw9ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMucHVzaEFsbChzKX0sU3RhY2sucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9wLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sU3RhY2sucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemU/dGhpczp0aGlzLl9fb3duZXJJRD8odGhpcy5zaXplPTAsdGhpcy5faGVhZD12b2lkIDAsdGhpcy5fX2hhc2g9dm9pZCAwLHRoaXMuX19hbHRlcmVkPSEwLHRoaXMpOmVtcHR5U3RhY2soKX0sU3RhY2sucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHMsbyl7aWYod2hvbGVTbGljZShzLG8sdGhpcy5zaXplKSlyZXR1cm4gdGhpczt2YXIgaT1yZXNvbHZlQmVnaW4ocyx0aGlzLnNpemUpO2lmKHJlc29sdmVFbmQobyx0aGlzLnNpemUpIT09dGhpcy5zaXplKXJldHVybiBJbmRleGVkQ29sbGVjdGlvbi5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLHMsbyk7Zm9yKHZhciBhPXRoaXMuc2l6ZS1pLHU9dGhpcy5faGVhZDtpLS07KXU9dS5uZXh0O3JldHVybiB0aGlzLl9fb3duZXJJRD8odGhpcy5zaXplPWEsdGhpcy5faGVhZD11LHRoaXMuX19oYXNoPXZvaWQgMCx0aGlzLl9fYWx0ZXJlZD0hMCx0aGlzKTptYWtlU3RhY2soYSx1KX0sU3RhY2sucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24ocyl7cmV0dXJuIHM9PT10aGlzLl9fb3duZXJJRD90aGlzOnM/bWFrZVN0YWNrKHRoaXMuc2l6ZSx0aGlzLl9oZWFkLHMsdGhpcy5fX2hhc2gpOih0aGlzLl9fb3duZXJJRD1zLHRoaXMuX19hbHRlcmVkPSExLHRoaXMpfSxTdGFjay5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHMsbyl7aWYobylyZXR1cm4gdGhpcy5yZXZlcnNlKCkuX19pdGVyYXRlKHMpO2Zvcih2YXIgaT0wLGE9dGhpcy5faGVhZDthJiYhMSE9PXMoYS52YWx1ZSxpKyssdGhpcyk7KWE9YS5uZXh0O3JldHVybiBpfSxTdGFjay5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihzLG8pe2lmKG8pcmV0dXJuIHRoaXMucmV2ZXJzZSgpLl9faXRlcmF0b3Iocyk7dmFyIGk9MCxhPXRoaXMuX2hlYWQ7cmV0dXJuIG5ldyBJdGVyYXRvcigoZnVuY3Rpb24oKXtpZihhKXt2YXIgbz1hLnZhbHVlO3JldHVybiBhPWEubmV4dCxpdGVyYXRvclZhbHVlKHMsaSsrLG8pfXJldHVybiBpdGVyYXRvckRvbmUoKX0pKX0sU3RhY2suaXNTdGFjaz1pc1N0YWNrO3ZhciBhdCxjdD0iQEBfX0lNTVVUQUJMRV9TVEFDS19fQEAiLGx0PVN0YWNrLnByb3RvdHlwZTtmdW5jdGlvbiBtYWtlU3RhY2socyxvLGksYSl7dmFyIHU9T2JqZWN0LmNyZWF0ZShsdCk7cmV0dXJuIHUuc2l6ZT1zLHUuX2hlYWQ9byx1Ll9fb3duZXJJRD1pLHUuX19oYXNoPWEsdS5fX2FsdGVyZWQ9ITEsdX1mdW5jdGlvbiBlbXB0eVN0YWNrKCl7cmV0dXJuIGF0fHwoYXQ9bWFrZVN0YWNrKDApKX1mdW5jdGlvbiBtaXhpbihzLG8pe3ZhciBrZXlDb3BpZXI9ZnVuY3Rpb24oaSl7cy5wcm90b3R5cGVbaV09b1tpXX07cmV0dXJuIE9iamVjdC5rZXlzKG8pLmZvckVhY2goa2V5Q29waWVyKSxPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiZPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG8pLmZvckVhY2goa2V5Q29waWVyKSxzfWx0W2N0XT0hMCxsdC53aXRoTXV0YXRpb25zPSRlLndpdGhNdXRhdGlvbnMsbHQuYXNNdXRhYmxlPSRlLmFzTXV0YWJsZSxsdC5hc0ltbXV0YWJsZT0kZS5hc0ltbXV0YWJsZSxsdC53YXNBbHRlcmVkPSRlLndhc0FsdGVyZWQsSXRlcmFibGUuSXRlcmF0b3I9SXRlcmF0b3IsbWl4aW4oSXRlcmFibGUse3RvQXJyYXk6ZnVuY3Rpb24oKXthc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpO3ZhciBzPW5ldyBBcnJheSh0aGlzLnNpemV8fDApO3JldHVybiB0aGlzLnZhbHVlU2VxKCkuX19pdGVyYXRlKChmdW5jdGlvbihvLGkpe3NbaV09b30pKSxzfSx0b0luZGV4ZWRTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRvSW5kZXhlZFNlcXVlbmNlKHRoaXMpfSx0b0pTOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TZXEoKS5tYXAoKGZ1bmN0aW9uKHMpe3JldHVybiBzJiYiZnVuY3Rpb24iPT10eXBlb2Ygcy50b0pTP3MudG9KUygpOnN9KSkuX190b0pTKCl9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU2VxKCkubWFwKChmdW5jdGlvbihzKXtyZXR1cm4gcyYmImZ1bmN0aW9uIj09dHlwZW9mIHMudG9KU09OP3MudG9KU09OKCk6c30pKS5fX3RvSlMoKX0sdG9LZXllZFNlcTpmdW5jdGlvbigpe3JldHVybiBuZXcgVG9LZXllZFNlcXVlbmNlKHRoaXMsITApfSx0b01hcDpmdW5jdGlvbigpe3JldHVybiBNYXAodGhpcy50b0tleWVkU2VxKCkpfSx0b09iamVjdDpmdW5jdGlvbigpe2Fzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7dmFyIHM9e307cmV0dXJuIHRoaXMuX19pdGVyYXRlKChmdW5jdGlvbihvLGkpe3NbaV09b30pKSxzfSx0b09yZGVyZWRNYXA6ZnVuY3Rpb24oKXtyZXR1cm4gT3JkZXJlZE1hcCh0aGlzLnRvS2V5ZWRTZXEoKSl9LHRvT3JkZXJlZFNldDpmdW5jdGlvbigpe3JldHVybiBPcmRlcmVkU2V0KGlzS2V5ZWQodGhpcyk/dGhpcy52YWx1ZVNlcSgpOnRoaXMpfSx0b1NldDpmdW5jdGlvbigpe3JldHVybiBTZXQoaXNLZXllZCh0aGlzKT90aGlzLnZhbHVlU2VxKCk6dGhpcyl9LHRvU2V0U2VxOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBUb1NldFNlcXVlbmNlKHRoaXMpfSx0b1NlcTpmdW5jdGlvbigpe3JldHVybiBpc0luZGV4ZWQodGhpcyk/dGhpcy50b0luZGV4ZWRTZXEoKTppc0tleWVkKHRoaXMpP3RoaXMudG9LZXllZFNlcSgpOnRoaXMudG9TZXRTZXEoKX0sdG9TdGFjazpmdW5jdGlvbigpe3JldHVybiBTdGFjayhpc0tleWVkKHRoaXMpP3RoaXMudmFsdWVTZXEoKTp0aGlzKX0sdG9MaXN0OmZ1bmN0aW9uKCl7cmV0dXJuIExpc3QoaXNLZXllZCh0aGlzKT90aGlzLnZhbHVlU2VxKCk6dGhpcyl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIltJdGVyYWJsZV0ifSxfX3RvU3RyaW5nOmZ1bmN0aW9uKHMsbyl7cmV0dXJuIDA9PT10aGlzLnNpemU/cytvOnMrIiAiK3RoaXMudG9TZXEoKS5tYXAodGhpcy5fX3RvU3RyaW5nTWFwcGVyKS5qb2luKCIsICIpKyIgIitvfSxjb25jYXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcmVpZnkodGhpcyxjb25jYXRGYWN0b3J5KHRoaXMscy5jYWxsKGFyZ3VtZW50cywwKSkpfSxpbmNsdWRlczpmdW5jdGlvbihzKXtyZXR1cm4gdGhpcy5zb21lKChmdW5jdGlvbihvKXtyZXR1cm4gaXMobyxzKX0pKX0sZW50cmllczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9faXRlcmF0b3IoVil9LGV2ZXJ5OmZ1bmN0aW9uKHMsbyl7YXNzZXJ0Tm90SW5maW5pdGUodGhpcy5zaXplKTt2YXIgaT0hMDtyZXR1cm4gdGhpcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGEsdSxfKXtpZighcy5jYWxsKG8sYSx1LF8pKXJldHVybiBpPSExLCExfSkpLGl9LGZpbHRlcjpmdW5jdGlvbihzLG8pe3JldHVybiByZWlmeSh0aGlzLGZpbHRlckZhY3RvcnkodGhpcyxzLG8sITApKX0sZmluZDpmdW5jdGlvbihzLG8saSl7dmFyIGE9dGhpcy5maW5kRW50cnkocyxvKTtyZXR1cm4gYT9hWzFdOml9LGZvckVhY2g6ZnVuY3Rpb24ocyxvKXtyZXR1cm4gYXNzZXJ0Tm90SW5maW5pdGUodGhpcy5zaXplKSx0aGlzLl9faXRlcmF0ZShvP3MuYmluZChvKTpzKX0sam9pbjpmdW5jdGlvbihzKXthc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpLHM9dm9pZCAwIT09cz8iIitzOiIsIjt2YXIgbz0iIixpPSEwO3JldHVybiB0aGlzLl9faXRlcmF0ZSgoZnVuY3Rpb24oYSl7aT9pPSExOm8rPXMsbys9bnVsbCE9YT9hLnRvU3RyaW5nKCk6IiJ9KSksb30sa2V5czpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9faXRlcmF0b3IoJCl9LG1hcDpmdW5jdGlvbihzLG8pe3JldHVybiByZWlmeSh0aGlzLG1hcEZhY3RvcnkodGhpcyxzLG8pKX0scmVkdWNlOmZ1bmN0aW9uKHMsbyxpKXt2YXIgYSx1O3JldHVybiBhc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpLGFyZ3VtZW50cy5sZW5ndGg8Mj91PSEwOmE9byx0aGlzLl9faXRlcmF0ZSgoZnVuY3Rpb24obyxfLHcpe3U/KHU9ITEsYT1vKTphPXMuY2FsbChpLGEsbyxfLHcpfSkpLGF9LHJlZHVjZVJpZ2h0OmZ1bmN0aW9uKHMsbyxpKXt2YXIgYT10aGlzLnRvS2V5ZWRTZXEoKS5yZXZlcnNlKCk7cmV0dXJuIGEucmVkdWNlLmFwcGx5KGEsYXJndW1lbnRzKX0scmV2ZXJzZTpmdW5jdGlvbigpe3JldHVybiByZWlmeSh0aGlzLHJldmVyc2VGYWN0b3J5KHRoaXMsITApKX0sc2xpY2U6ZnVuY3Rpb24ocyxvKXtyZXR1cm4gcmVpZnkodGhpcyxzbGljZUZhY3RvcnkodGhpcyxzLG8sITApKX0sc29tZTpmdW5jdGlvbihzLG8pe3JldHVybiF0aGlzLmV2ZXJ5KG5vdChzKSxvKX0sc29ydDpmdW5jdGlvbihzKXtyZXR1cm4gcmVpZnkodGhpcyxzb3J0RmFjdG9yeSh0aGlzLHMpKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19pdGVyYXRvcihVKX0sYnV0TGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNsaWNlKDAsLTEpfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuc2l6ZT8wPT09dGhpcy5zaXplOiF0aGlzLnNvbWUoKGZ1bmN0aW9uKCl7cmV0dXJuITB9KSl9LGNvdW50OmZ1bmN0aW9uKHMsbyl7cmV0dXJuIGVuc3VyZVNpemUocz90aGlzLnRvU2VxKCkuZmlsdGVyKHMsbyk6dGhpcyl9LGNvdW50Qnk6ZnVuY3Rpb24ocyxvKXtyZXR1cm4gY291bnRCeUZhY3RvcnkodGhpcyxzLG8pfSxlcXVhbHM6ZnVuY3Rpb24ocyl7cmV0dXJuIGRlZXBFcXVhbCh0aGlzLHMpfSxlbnRyeVNlcTpmdW5jdGlvbigpe3ZhciBzPXRoaXM7aWYocy5fY2FjaGUpcmV0dXJuIG5ldyBBcnJheVNlcShzLl9jYWNoZSk7dmFyIG89cy50b1NlcSgpLm1hcChlbnRyeU1hcHBlcikudG9JbmRleGVkU2VxKCk7cmV0dXJuIG8uZnJvbUVudHJ5U2VxPWZ1bmN0aW9uKCl7cmV0dXJuIHMudG9TZXEoKX0sb30sZmlsdGVyTm90OmZ1bmN0aW9uKHMsbyl7cmV0dXJuIHRoaXMuZmlsdGVyKG5vdChzKSxvKX0sZmluZEVudHJ5OmZ1bmN0aW9uKHMsbyxpKXt2YXIgYT1pO3JldHVybiB0aGlzLl9faXRlcmF0ZSgoZnVuY3Rpb24oaSx1LF8pe2lmKHMuY2FsbChvLGksdSxfKSlyZXR1cm4gYT1bdSxpXSwhMX0pKSxhfSxmaW5kS2V5OmZ1bmN0aW9uKHMsbyl7dmFyIGk9dGhpcy5maW5kRW50cnkocyxvKTtyZXR1cm4gaSYmaVswXX0sZmluZExhc3Q6ZnVuY3Rpb24ocyxvLGkpe3JldHVybiB0aGlzLnRvS2V5ZWRTZXEoKS5yZXZlcnNlKCkuZmluZChzLG8saSl9LGZpbmRMYXN0RW50cnk6ZnVuY3Rpb24ocyxvLGkpe3JldHVybiB0aGlzLnRvS2V5ZWRTZXEoKS5yZXZlcnNlKCkuZmluZEVudHJ5KHMsbyxpKX0sZmluZExhc3RLZXk6ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdGhpcy50b0tleWVkU2VxKCkucmV2ZXJzZSgpLmZpbmRLZXkocyxvKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maW5kKHJldHVyblRydWUpfSxmbGF0TWFwOmZ1bmN0aW9uKHMsbyl7cmV0dXJuIHJlaWZ5KHRoaXMsZmxhdE1hcEZhY3RvcnkodGhpcyxzLG8pKX0sZmxhdHRlbjpmdW5jdGlvbihzKXtyZXR1cm4gcmVpZnkodGhpcyxmbGF0dGVuRmFjdG9yeSh0aGlzLHMsITApKX0sZnJvbUVudHJ5U2VxOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBGcm9tRW50cmllc1NlcXVlbmNlKHRoaXMpfSxnZXQ6ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdGhpcy5maW5kKChmdW5jdGlvbihvLGkpe3JldHVybiBpcyhpLHMpfSksdm9pZCAwLG8pfSxnZXRJbjpmdW5jdGlvbihzLG8pe2Zvcih2YXIgaSxhPXRoaXMsdT1mb3JjZUl0ZXJhdG9yKHMpOyEoaT11Lm5leHQoKSkuZG9uZTspe3ZhciBfPWkudmFsdWU7aWYoKGE9YSYmYS5nZXQ/YS5nZXQoXyxqKTpqKT09PWopcmV0dXJuIG99cmV0dXJuIGF9LGdyb3VwQnk6ZnVuY3Rpb24ocyxvKXtyZXR1cm4gZ3JvdXBCeUZhY3RvcnkodGhpcyxzLG8pfSxoYXM6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuZ2V0KHMsaikhPT1qfSxoYXNJbjpmdW5jdGlvbihzKXtyZXR1cm4gdGhpcy5nZXRJbihzLGopIT09an0saXNTdWJzZXQ6ZnVuY3Rpb24ocyl7cmV0dXJuIHM9ImZ1bmN0aW9uIj09dHlwZW9mIHMuaW5jbHVkZXM/czpJdGVyYWJsZShzKSx0aGlzLmV2ZXJ5KChmdW5jdGlvbihvKXtyZXR1cm4gcy5pbmNsdWRlcyhvKX0pKX0saXNTdXBlcnNldDpmdW5jdGlvbihzKXtyZXR1cm4ocz0iZnVuY3Rpb24iPT10eXBlb2Ygcy5pc1N1YnNldD9zOkl0ZXJhYmxlKHMpKS5pc1N1YnNldCh0aGlzKX0sa2V5T2Y6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuZmluZEtleSgoZnVuY3Rpb24obyl7cmV0dXJuIGlzKG8scyl9KSl9LGtleVNlcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU2VxKCkubWFwKGtleU1hcHBlcikudG9JbmRleGVkU2VxKCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1NlcSgpLnJldmVyc2UoKS5maXJzdCgpfSxsYXN0S2V5T2Y6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKS5rZXlPZihzKX0sbWF4OmZ1bmN0aW9uKHMpe3JldHVybiBtYXhGYWN0b3J5KHRoaXMscyl9LG1heEJ5OmZ1bmN0aW9uKHMsbyl7cmV0dXJuIG1heEZhY3RvcnkodGhpcyxvLHMpfSxtaW46ZnVuY3Rpb24ocyl7cmV0dXJuIG1heEZhY3RvcnkodGhpcyxzP25lZyhzKTpkZWZhdWx0TmVnQ29tcGFyYXRvcil9LG1pbkJ5OmZ1bmN0aW9uKHMsbyl7cmV0dXJuIG1heEZhY3RvcnkodGhpcyxvP25lZyhvKTpkZWZhdWx0TmVnQ29tcGFyYXRvcixzKX0scmVzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNsaWNlKDEpfSxza2lwOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNsaWNlKE1hdGgubWF4KDAscykpfSxza2lwTGFzdDpmdW5jdGlvbihzKXtyZXR1cm4gcmVpZnkodGhpcyx0aGlzLnRvU2VxKCkucmV2ZXJzZSgpLnNraXAocykucmV2ZXJzZSgpKX0sc2tpcFdoaWxlOmZ1bmN0aW9uKHMsbyl7cmV0dXJuIHJlaWZ5KHRoaXMsc2tpcFdoaWxlRmFjdG9yeSh0aGlzLHMsbywhMCkpfSxza2lwVW50aWw6ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdGhpcy5za2lwV2hpbGUobm90KHMpLG8pfSxzb3J0Qnk6ZnVuY3Rpb24ocyxvKXtyZXR1cm4gcmVpZnkodGhpcyxzb3J0RmFjdG9yeSh0aGlzLG8scykpfSx0YWtlOmZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnNsaWNlKDAsTWF0aC5tYXgoMCxzKSl9LHRha2VMYXN0OmZ1bmN0aW9uKHMpe3JldHVybiByZWlmeSh0aGlzLHRoaXMudG9TZXEoKS5yZXZlcnNlKCkudGFrZShzKS5yZXZlcnNlKCkpfSx0YWtlV2hpbGU6ZnVuY3Rpb24ocyxvKXtyZXR1cm4gcmVpZnkodGhpcyx0YWtlV2hpbGVGYWN0b3J5KHRoaXMscyxvKSl9LHRha2VVbnRpbDpmdW5jdGlvbihzLG8pe3JldHVybiB0aGlzLnRha2VXaGlsZShub3Qocyksbyl9LHZhbHVlU2VxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9JbmRleGVkU2VxKCl9LGhhc2hDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19oYXNofHwodGhpcy5fX2hhc2g9aGFzaEl0ZXJhYmxlKHRoaXMpKX19KTt2YXIgdXQ9SXRlcmFibGUucHJvdG90eXBlO3V0W29dPSEwLHV0W1pdPXV0LnZhbHVlcyx1dC5fX3RvSlM9dXQudG9BcnJheSx1dC5fX3RvU3RyaW5nTWFwcGVyPXF1b3RlU3RyaW5nLHV0Lmluc3BlY3Q9dXQudG9Tb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpfSx1dC5jaGFpbj11dC5mbGF0TWFwLHV0LmNvbnRhaW5zPXV0LmluY2x1ZGVzLG1peGluKEtleWVkSXRlcmFibGUse2ZsaXA6ZnVuY3Rpb24oKXtyZXR1cm4gcmVpZnkodGhpcyxmbGlwRmFjdG9yeSh0aGlzKSl9LG1hcEVudHJpZXM6ZnVuY3Rpb24ocyxvKXt2YXIgaT10aGlzLGE9MDtyZXR1cm4gcmVpZnkodGhpcyx0aGlzLnRvU2VxKCkubWFwKChmdW5jdGlvbih1LF8pe3JldHVybiBzLmNhbGwobyxbXyx1XSxhKyssaSl9KSkuZnJvbUVudHJ5U2VxKCkpfSxtYXBLZXlzOmZ1bmN0aW9uKHMsbyl7dmFyIGk9dGhpcztyZXR1cm4gcmVpZnkodGhpcyx0aGlzLnRvU2VxKCkuZmxpcCgpLm1hcCgoZnVuY3Rpb24oYSx1KXtyZXR1cm4gcy5jYWxsKG8sYSx1LGkpfSkpLmZsaXAoKSl9fSk7dmFyIHB0PUtleWVkSXRlcmFibGUucHJvdG90eXBlO2Z1bmN0aW9uIGtleU1hcHBlcihzLG8pe3JldHVybiBvfWZ1bmN0aW9uIGVudHJ5TWFwcGVyKHMsbyl7cmV0dXJuW28sc119ZnVuY3Rpb24gbm90KHMpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiFzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gbmVnKHMpe3JldHVybiBmdW5jdGlvbigpe3JldHVybi1zLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gcXVvdGVTdHJpbmcocyl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBzP0pTT04uc3RyaW5naWZ5KHMpOlN0cmluZyhzKX1mdW5jdGlvbiBkZWZhdWx0WmlwcGVyKCl7cmV0dXJuIGFyckNvcHkoYXJndW1lbnRzKX1mdW5jdGlvbiBkZWZhdWx0TmVnQ29tcGFyYXRvcihzLG8pe3JldHVybiBzPG8/MTpzPm8/LTE6MH1mdW5jdGlvbiBoYXNoSXRlcmFibGUocyl7aWYocy5zaXplPT09MS8wKXJldHVybiAwO3ZhciBvPWlzT3JkZXJlZChzKSxpPWlzS2V5ZWQocyksYT1vPzE6MDtyZXR1cm4gbXVybXVySGFzaE9mU2l6ZShzLl9faXRlcmF0ZShpP28/ZnVuY3Rpb24ocyxvKXthPTMxKmEraGFzaE1lcmdlKGhhc2gocyksaGFzaChvKSl8MH06ZnVuY3Rpb24ocyxvKXthPWEraGFzaE1lcmdlKGhhc2gocyksaGFzaChvKSl8MH06bz9mdW5jdGlvbihzKXthPTMxKmEraGFzaChzKXwwfTpmdW5jdGlvbihzKXthPWEraGFzaChzKXwwfSksYSl9ZnVuY3Rpb24gbXVybXVySGFzaE9mU2l6ZShzLG8pe3JldHVybiBvPWxlKG8sMzQzMjkxODM1Myksbz1sZShvPDwxNXxvPj4+LTE1LDQ2MTg0NTkwNyksbz1sZShvPDwxM3xvPj4+LTEzLDUpLG89bGUoKG89byszODY0MjkyMTk2XnMpXm8+Pj4xNiwyMjQ2ODIyNTA3KSxvPXNtaSgobz1sZShvXm8+Pj4xMywzMjY2NDg5OTA5KSlebz4+PjE2KX1mdW5jdGlvbiBoYXNoTWVyZ2UocyxvKXtyZXR1cm4gc15vKzI2NTQ0MzU3NjkrKHM8PDYpKyhzPj4yKX1yZXR1cm4gcHRbaV09ITAscHRbWl09dXQuZW50cmllcyxwdC5fX3RvSlM9dXQudG9PYmplY3QscHQuX190b1N0cmluZ01hcHBlcj1mdW5jdGlvbihzLG8pe3JldHVybiBKU09OLnN0cmluZ2lmeShvKSsiOiAiK3F1b3RlU3RyaW5nKHMpfSxtaXhpbihJbmRleGVkSXRlcmFibGUse3RvS2V5ZWRTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFRvS2V5ZWRTZXF1ZW5jZSh0aGlzLCExKX0sZmlsdGVyOmZ1bmN0aW9uKHMsbyl7cmV0dXJuIHJlaWZ5KHRoaXMsZmlsdGVyRmFjdG9yeSh0aGlzLHMsbywhMSkpfSxmaW5kSW5kZXg6ZnVuY3Rpb24ocyxvKXt2YXIgaT10aGlzLmZpbmRFbnRyeShzLG8pO3JldHVybiBpP2lbMF06LTF9LGluZGV4T2Y6ZnVuY3Rpb24ocyl7dmFyIG89dGhpcy5rZXlPZihzKTtyZXR1cm4gdm9pZCAwPT09bz8tMTpvfSxsYXN0SW5kZXhPZjpmdW5jdGlvbihzKXt2YXIgbz10aGlzLmxhc3RLZXlPZihzKTtyZXR1cm4gdm9pZCAwPT09bz8tMTpvfSxyZXZlcnNlOmZ1bmN0aW9uKCl7cmV0dXJuIHJlaWZ5KHRoaXMscmV2ZXJzZUZhY3RvcnkodGhpcywhMSkpfSxzbGljZTpmdW5jdGlvbihzLG8pe3JldHVybiByZWlmeSh0aGlzLHNsaWNlRmFjdG9yeSh0aGlzLHMsbywhMSkpfSxzcGxpY2U6ZnVuY3Rpb24ocyxvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoO2lmKG89TWF0aC5tYXgoMHxvLDApLDA9PT1pfHwyPT09aSYmIW8pcmV0dXJuIHRoaXM7cz1yZXNvbHZlQmVnaW4ocyxzPDA/dGhpcy5jb3VudCgpOnRoaXMuc2l6ZSk7dmFyIGE9dGhpcy5zbGljZSgwLHMpO3JldHVybiByZWlmeSh0aGlzLDE9PT1pP2E6YS5jb25jYXQoYXJyQ29weShhcmd1bWVudHMsMiksdGhpcy5zbGljZShzK28pKSl9LGZpbmRMYXN0SW5kZXg6ZnVuY3Rpb24ocyxvKXt2YXIgaT10aGlzLmZpbmRMYXN0RW50cnkocyxvKTtyZXR1cm4gaT9pWzBdOi0xfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldCgwKX0sZmxhdHRlbjpmdW5jdGlvbihzKXtyZXR1cm4gcmVpZnkodGhpcyxmbGF0dGVuRmFjdG9yeSh0aGlzLHMsITEpKX0sZ2V0OmZ1bmN0aW9uKHMsbyl7cmV0dXJuKHM9d3JhcEluZGV4KHRoaXMscykpPDB8fHRoaXMuc2l6ZT09PTEvMHx8dm9pZCAwIT09dGhpcy5zaXplJiZzPnRoaXMuc2l6ZT9vOnRoaXMuZmluZCgoZnVuY3Rpb24obyxpKXtyZXR1cm4gaT09PXN9KSx2b2lkIDAsbyl9LGhhczpmdW5jdGlvbihzKXtyZXR1cm4ocz13cmFwSW5kZXgodGhpcyxzKSk+PTAmJih2b2lkIDAhPT10aGlzLnNpemU/dGhpcy5zaXplPT09MS8wfHxzPHRoaXMuc2l6ZTotMSE9PXRoaXMuaW5kZXhPZihzKSl9LGludGVycG9zZTpmdW5jdGlvbihzKXtyZXR1cm4gcmVpZnkodGhpcyxpbnRlcnBvc2VGYWN0b3J5KHRoaXMscykpfSxpbnRlcmxlYXZlOmZ1bmN0aW9uKCl7dmFyIHM9W3RoaXNdLmNvbmNhdChhcnJDb3B5KGFyZ3VtZW50cykpLG89emlwV2l0aEZhY3RvcnkodGhpcy50b1NlcSgpLEluZGV4ZWRTZXEub2YscyksaT1vLmZsYXR0ZW4oITApO3JldHVybiBvLnNpemUmJihpLnNpemU9by5zaXplKnMubGVuZ3RoKSxyZWlmeSh0aGlzLGkpfSxrZXlTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gUmFuZ2UoMCx0aGlzLnNpemUpfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KC0xKX0sc2tpcFdoaWxlOmZ1bmN0aW9uKHMsbyl7cmV0dXJuIHJlaWZ5KHRoaXMsc2tpcFdoaWxlRmFjdG9yeSh0aGlzLHMsbywhMSkpfSx6aXA6ZnVuY3Rpb24oKXtyZXR1cm4gcmVpZnkodGhpcyx6aXBXaXRoRmFjdG9yeSh0aGlzLGRlZmF1bHRaaXBwZXIsW3RoaXNdLmNvbmNhdChhcnJDb3B5KGFyZ3VtZW50cykpKSl9LHppcFdpdGg6ZnVuY3Rpb24ocyl7dmFyIG89YXJyQ29weShhcmd1bWVudHMpO3JldHVybiBvWzBdPXRoaXMscmVpZnkodGhpcyx6aXBXaXRoRmFjdG9yeSh0aGlzLHMsbykpfX0pLEluZGV4ZWRJdGVyYWJsZS5wcm90b3R5cGVbYV09ITAsSW5kZXhlZEl0ZXJhYmxlLnByb3RvdHlwZVt1XT0hMCxtaXhpbihTZXRJdGVyYWJsZSx7Z2V0OmZ1bmN0aW9uKHMsbyl7cmV0dXJuIHRoaXMuaGFzKHMpP3M6b30saW5jbHVkZXM6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuaGFzKHMpfSxrZXlTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZVNlcSgpfX0pLFNldEl0ZXJhYmxlLnByb3RvdHlwZS5oYXM9dXQuaW5jbHVkZXMsU2V0SXRlcmFibGUucHJvdG90eXBlLmNvbnRhaW5zPVNldEl0ZXJhYmxlLnByb3RvdHlwZS5pbmNsdWRlcyxtaXhpbihLZXllZFNlcSxLZXllZEl0ZXJhYmxlLnByb3RvdHlwZSksbWl4aW4oSW5kZXhlZFNlcSxJbmRleGVkSXRlcmFibGUucHJvdG90eXBlKSxtaXhpbihTZXRTZXEsU2V0SXRlcmFibGUucHJvdG90eXBlKSxtaXhpbihLZXllZENvbGxlY3Rpb24sS2V5ZWRJdGVyYWJsZS5wcm90b3R5cGUpLG1peGluKEluZGV4ZWRDb2xsZWN0aW9uLEluZGV4ZWRJdGVyYWJsZS5wcm90b3R5cGUpLG1peGluKFNldENvbGxlY3Rpb24sU2V0SXRlcmFibGUucHJvdG90eXBlKSx7SXRlcmFibGUsU2VxLENvbGxlY3Rpb24sTWFwLE9yZGVyZWRNYXAsTGlzdCxTdGFjayxTZXQsT3JkZXJlZFNldCxSZWNvcmQsUmFuZ2UsUmVwZWF0LGlzLGZyb21KU319KCl9LDU2Njk4KHMpeyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuY3JlYXRlP3MuZXhwb3J0cz1mdW5jdGlvbiBpbmhlcml0cyhzLG8pe28mJihzLnN1cGVyXz1vLHMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pKX06cy5leHBvcnRzPWZ1bmN0aW9uIGluaGVyaXRzKHMsbyl7aWYobyl7cy5zdXBlcl89bzt2YXIgVGVtcEN0b3I9ZnVuY3Rpb24oKXt9O1RlbXBDdG9yLnByb3RvdHlwZT1vLnByb3RvdHlwZSxzLnByb3RvdHlwZT1uZXcgVGVtcEN0b3Iscy5wcm90b3R5cGUuY29uc3RydWN0b3I9c319fSw2OTYwMChzKXsidXNlIHN0cmljdCI7dmFyIG8saSxhPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyx1PSJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmbnVsbCE9PVJlZmxlY3QmJlJlZmxlY3QuYXBwbHk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHUmJiJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkpdHJ5e289T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJsZW5ndGgiLHtnZXQ6ZnVuY3Rpb24oKXt0aHJvdyBpfX0pLGk9e30sdSgoZnVuY3Rpb24oKXt0aHJvdyA0Mn0pLG51bGwsbyl9Y2F0Y2gocyl7cyE9PWkmJih1PW51bGwpfWVsc2UgdT1udWxsO3ZhciBfPS9eXHMqY2xhc3NcYi8sdz1mdW5jdGlvbiBpc0VTNkNsYXNzRnVuY3Rpb24ocyl7dHJ5e3ZhciBvPWEuY2FsbChzKTtyZXR1cm4gXy50ZXN0KG8pfWNhdGNoKHMpe3JldHVybiExfX0seD1mdW5jdGlvbiB0cnlGdW5jdGlvblRvU3RyKHMpe3RyeXtyZXR1cm4hdyhzKSYmKGEuY2FsbChzKSwhMCl9Y2F0Y2gocyl7cmV0dXJuITF9fSxDPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsaj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYhIVN5bWJvbC50b1N0cmluZ1RhZyxMPSEoMCBpblssXSksQj1mdW5jdGlvbiBpc0RvY3VtZW50RG90QWxsKCl7cmV0dXJuITF9O2lmKCJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnQpe3ZhciAkPWRvY3VtZW50LmFsbDtDLmNhbGwoJCk9PT1DLmNhbGwoZG9jdW1lbnQuYWxsKSYmKEI9ZnVuY3Rpb24gaXNEb2N1bWVudERvdEFsbChzKXtpZigoTHx8IXMpJiYodm9pZCAwPT09c3x8Im9iamVjdCI9PXR5cGVvZiBzKSl0cnl7dmFyIG89Qy5jYWxsKHMpO3JldHVybigiW29iamVjdCBIVE1MQWxsQ29sbGVjdGlvbl0iPT09b3x8IltvYmplY3QgSFRNTCBkb2N1bWVudC5hbGwgY2xhc3NdIj09PW98fCJbb2JqZWN0IEhUTUxDb2xsZWN0aW9uXSI9PT1vfHwiW29iamVjdCBPYmplY3RdIj09PW8pJiZudWxsPT1zKCIiKX1jYXRjaChzKXt9cmV0dXJuITF9KX1zLmV4cG9ydHM9dT9mdW5jdGlvbiBpc0NhbGxhYmxlKHMpe2lmKEIocykpcmV0dXJuITA7aWYoIXMpcmV0dXJuITE7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHMmJiJvYmplY3QiIT10eXBlb2YgcylyZXR1cm4hMTt0cnl7dShzLG51bGwsbyl9Y2F0Y2gocyl7aWYocyE9PWkpcmV0dXJuITF9cmV0dXJuIXcocykmJngocyl9OmZ1bmN0aW9uIGlzQ2FsbGFibGUocyl7aWYoQihzKSlyZXR1cm4hMDtpZighcylyZXR1cm4hMTtpZigiZnVuY3Rpb24iIT10eXBlb2YgcyYmIm9iamVjdCIhPXR5cGVvZiBzKXJldHVybiExO2lmKGopcmV0dXJuIHgocyk7aWYodyhzKSlyZXR1cm4hMTt2YXIgbz1DLmNhbGwocyk7cmV0dXJuISgiW29iamVjdCBGdW5jdGlvbl0iIT09byYmIltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIiE9PW8mJiEvXlxbb2JqZWN0IEhUTUwvLnRlc3QobykpJiZ4KHMpfX0sMzU2ODAocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDI1NzY3KTtzLmV4cG9ydHM9ZnVuY3Rpb24gaXNUeXBlZEFycmF5KHMpe3JldHVybiEhYShzKX19LDY0NjM0KHMpe3ZhciBvPXt9LnRvU3RyaW5nO3MuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihzKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1vLmNhbGwocyl9fSw1NDE5KHMpe3MuZXhwb3J0cz1mdW5jdGlvbihzLG8saSxhKXt2YXIgdT1uZXcgQmxvYih2b2lkIDAhPT1hP1thLHNdOltzXSx7dHlwZTppfHwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIn0pO2lmKHZvaWQgMCE9PXdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYil3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2IodSxvKTtlbHNle3ZhciBfPXdpbmRvdy5VUkwmJndpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMP3dpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHUpOndpbmRvdy53ZWJraXRVUkwuY3JlYXRlT2JqZWN0VVJMKHUpLHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO3cuc3R5bGUuZGlzcGxheT0ibm9uZSIsdy5ocmVmPV8sdy5zZXRBdHRyaWJ1dGUoImRvd25sb2FkIixvKSx2b2lkIDA9PT13LmRvd25sb2FkJiZ3LnNldEF0dHJpYnV0ZSgidGFyZ2V0IiwiX2JsYW5rIiksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh3KSx3LmNsaWNrKCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHcpLHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKF8pfSksMjAwKX19fSwyMDE4MShzLG8saSl7dmFyIGE9L15ccyt8XHMrJC9nLHU9L15bLStdMHhbMC05YS1mXSskL2ksXz0vXjBiWzAxXSskL2ksdz0vXjBvWzAtN10rJC9pLHg9cGFyc2VJbnQsQz0ib2JqZWN0Ij09dHlwZW9mIGkuZyYmaS5nJiZpLmcuT2JqZWN0PT09T2JqZWN0JiZpLmcsaj0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLEw9Q3x8anx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxCPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsJD1NYXRoLm1heCxVPU1hdGgubWluLG5vdz1mdW5jdGlvbigpe3JldHVybiBMLkRhdGUubm93KCl9O2Z1bmN0aW9uIGlzT2JqZWN0KHMpe3ZhciBvPXR5cGVvZiBzO3JldHVybiEhcyYmKCJvYmplY3QiPT1vfHwiZnVuY3Rpb24iPT1vKX1mdW5jdGlvbiB0b051bWJlcihzKXtpZigibnVtYmVyIj09dHlwZW9mIHMpcmV0dXJuIHM7aWYoZnVuY3Rpb24gaXNTeW1ib2wocyl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiBzfHxmdW5jdGlvbiBpc09iamVjdExpa2Uocyl7cmV0dXJuISFzJiYib2JqZWN0Ij09dHlwZW9mIHN9KHMpJiYiW29iamVjdCBTeW1ib2xdIj09Qi5jYWxsKHMpfShzKSlyZXR1cm4gTmFOO2lmKGlzT2JqZWN0KHMpKXt2YXIgbz0iZnVuY3Rpb24iPT10eXBlb2Ygcy52YWx1ZU9mP3MudmFsdWVPZigpOnM7cz1pc09iamVjdChvKT9vKyIiOm99aWYoInN0cmluZyIhPXR5cGVvZiBzKXJldHVybiAwPT09cz9zOitzO3M9cy5yZXBsYWNlKGEsIiIpO3ZhciBpPV8udGVzdChzKTtyZXR1cm4gaXx8dy50ZXN0KHMpP3gocy5zbGljZSgyKSxpPzI6OCk6dS50ZXN0KHMpP05hTjorc31zLmV4cG9ydHM9ZnVuY3Rpb24gZGVib3VuY2UocyxvLGkpe3ZhciBhLHUsXyx3LHgsQyxqPTAsTD0hMSxCPSExLFY9ITA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO2Z1bmN0aW9uIGludm9rZUZ1bmMobyl7dmFyIGk9YSxfPXU7cmV0dXJuIGE9dT12b2lkIDAsaj1vLHc9cy5hcHBseShfLGkpfWZ1bmN0aW9uIHNob3VsZEludm9rZShzKXt2YXIgaT1zLUM7cmV0dXJuIHZvaWQgMD09PUN8fGk+PW98fGk8MHx8QiYmcy1qPj1ffWZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpe3ZhciBzPW5vdygpO2lmKHNob3VsZEludm9rZShzKSlyZXR1cm4gdHJhaWxpbmdFZGdlKHMpO3g9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsZnVuY3Rpb24gcmVtYWluaW5nV2FpdChzKXt2YXIgaT1vLShzLUMpO3JldHVybiBCP1UoaSxfLShzLWopKTppfShzKSl9ZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHMpe3JldHVybiB4PXZvaWQgMCxWJiZhP2ludm9rZUZ1bmMocyk6KGE9dT12b2lkIDAsdyl9ZnVuY3Rpb24gZGVib3VuY2VkKCl7dmFyIHM9bm93KCksaT1zaG91bGRJbnZva2Uocyk7aWYoYT1hcmd1bWVudHMsdT10aGlzLEM9cyxpKXtpZih2b2lkIDA9PT14KXJldHVybiBmdW5jdGlvbiBsZWFkaW5nRWRnZShzKXtyZXR1cm4gaj1zLHg9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsbyksTD9pbnZva2VGdW5jKHMpOnd9KEMpO2lmKEIpcmV0dXJuIHg9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsbyksaW52b2tlRnVuYyhDKX1yZXR1cm4gdm9pZCAwPT09eCYmKHg9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsbykpLHd9cmV0dXJuIG89dG9OdW1iZXIobyl8fDAsaXNPYmplY3QoaSkmJihMPSEhaS5sZWFkaW5nLF89KEI9Im1heFdhaXQiaW4gaSk/JCh0b051bWJlcihpLm1heFdhaXQpfHwwLG8pOl8sVj0idHJhaWxpbmciaW4gaT8hIWkudHJhaWxpbmc6ViksZGVib3VuY2VkLmNhbmNlbD1mdW5jdGlvbiBjYW5jZWwoKXt2b2lkIDAhPT14JiZjbGVhclRpbWVvdXQoeCksaj0wLGE9Qz11PXg9dm9pZCAwfSxkZWJvdW5jZWQuZmx1c2g9ZnVuY3Rpb24gZmx1c2goKXtyZXR1cm4gdm9pZCAwPT09eD93OnRyYWlsaW5nRWRnZShub3coKSl9LGRlYm91bmNlZH19LDU1NTgwKHMsbyxpKXt2YXIgYT1pKDU2MTEwKShpKDkzMjUpLCJEYXRhVmlldyIpO3MuZXhwb3J0cz1hfSwyMTU0OShzLG8saSl7dmFyIGE9aSgyMjAzMiksdT1pKDYzODYyKSxfPWkoNjY3MjEpLHc9aSgxMjc0OSkseD1pKDM1NzQ5KTtmdW5jdGlvbiBIYXNoKHMpe3ZhciBvPS0xLGk9bnVsbD09cz8wOnMubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytvPGk7KXt2YXIgYT1zW29dO3RoaXMuc2V0KGFbMF0sYVsxXSl9fUhhc2gucHJvdG90eXBlLmNsZWFyPWEsSGFzaC5wcm90b3R5cGUuZGVsZXRlPXUsSGFzaC5wcm90b3R5cGUuZ2V0PV8sSGFzaC5wcm90b3R5cGUuaGFzPXcsSGFzaC5wcm90b3R5cGUuc2V0PXgscy5leHBvcnRzPUhhc2h9LDMwOTgwKHMsbyxpKXt2YXIgYT1pKDM5MzQ0KSx1PWkoOTQwMzMpO2Z1bmN0aW9uIExhenlXcmFwcGVyKHMpe3RoaXMuX193cmFwcGVkX189cyx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19kaXJfXz0xLHRoaXMuX19maWx0ZXJlZF9fPSExLHRoaXMuX19pdGVyYXRlZXNfXz1bXSx0aGlzLl9fdGFrZUNvdW50X189NDI5NDk2NzI5NSx0aGlzLl9fdmlld3NfXz1bXX1MYXp5V3JhcHBlci5wcm90b3R5cGU9YSh1LnByb3RvdHlwZSksTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxhenlXcmFwcGVyLHMuZXhwb3J0cz1MYXp5V3JhcHBlcn0sODAwNzkocyxvLGkpe3ZhciBhPWkoNjM3MDIpLHU9aSg3MDA4MCksXz1pKDI0NzM5KSx3PWkoNDg2NTUpLHg9aSgzMTE3NSk7ZnVuY3Rpb24gTGlzdENhY2hlKHMpe3ZhciBvPS0xLGk9bnVsbD09cz8wOnMubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytvPGk7KXt2YXIgYT1zW29dO3RoaXMuc2V0KGFbMF0sYVsxXSl9fUxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXI9YSxMaXN0Q2FjaGUucHJvdG90eXBlLmRlbGV0ZT11LExpc3RDYWNoZS5wcm90b3R5cGUuZ2V0PV8sTGlzdENhY2hlLnByb3RvdHlwZS5oYXM9dyxMaXN0Q2FjaGUucHJvdG90eXBlLnNldD14LHMuZXhwb3J0cz1MaXN0Q2FjaGV9LDU2MDE3KHMsbyxpKXt2YXIgYT1pKDM5MzQ0KSx1PWkoOTQwMzMpO2Z1bmN0aW9uIExvZGFzaFdyYXBwZXIocyxvKXt0aGlzLl9fd3JhcHBlZF9fPXMsdGhpcy5fX2FjdGlvbnNfXz1bXSx0aGlzLl9fY2hhaW5fXz0hIW8sdGhpcy5fX2luZGV4X189MCx0aGlzLl9fdmFsdWVzX189dm9pZCAwfUxvZGFzaFdyYXBwZXIucHJvdG90eXBlPWEodS5wcm90b3R5cGUpLExvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxvZGFzaFdyYXBwZXIscy5leHBvcnRzPUxvZGFzaFdyYXBwZXJ9LDY4MjIzKHMsbyxpKXt2YXIgYT1pKDU2MTEwKShpKDkzMjUpLCJNYXAiKTtzLmV4cG9ydHM9YX0sNTM2NjEocyxvLGkpe3ZhciBhPWkoNjMwNDApLHU9aSgxNzY3MCksXz1pKDkwMjg5KSx3PWkoNDUwOSkseD1pKDcyOTQ5KTtmdW5jdGlvbiBNYXBDYWNoZShzKXt2YXIgbz0tMSxpPW51bGw9PXM/MDpzLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrbzxpOyl7dmFyIGE9c1tvXTt0aGlzLnNldChhWzBdLGFbMV0pfX1NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9YSxNYXBDYWNoZS5wcm90b3R5cGUuZGVsZXRlPXUsTWFwQ2FjaGUucHJvdG90eXBlLmdldD1fLE1hcENhY2hlLnByb3RvdHlwZS5oYXM9dyxNYXBDYWNoZS5wcm90b3R5cGUuc2V0PXgscy5leHBvcnRzPU1hcENhY2hlfSwzMjgwNChzLG8saSl7dmFyIGE9aSg1NjExMCkoaSg5MzI1KSwiUHJvbWlzZSIpO3MuZXhwb3J0cz1hfSw3NjU0NShzLG8saSl7dmFyIGE9aSg1NjExMCkoaSg5MzI1KSwiU2V0Iik7cy5leHBvcnRzPWF9LDM4ODU5KHMsbyxpKXt2YXIgYT1pKDUzNjYxKSx1PWkoMzEzODApLF89aSg1MTQ1OSk7ZnVuY3Rpb24gU2V0Q2FjaGUocyl7dmFyIG89LTEsaT1udWxsPT1zPzA6cy5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IGE7KytvPGk7KXRoaXMuYWRkKHNbb10pfVNldENhY2hlLnByb3RvdHlwZS5hZGQ9U2V0Q2FjaGUucHJvdG90eXBlLnB1c2g9dSxTZXRDYWNoZS5wcm90b3R5cGUuaGFzPV8scy5leHBvcnRzPVNldENhY2hlfSwzNzIxNyhzLG8saSl7dmFyIGE9aSg4MDA3OSksdT1pKDUxNDIwKSxfPWkoOTA5MzgpLHc9aSg2MzYwNSkseD1pKDI5ODE3KSxDPWkoODA5NDUpO2Z1bmN0aW9uIFN0YWNrKHMpe3ZhciBvPXRoaXMuX19kYXRhX189bmV3IGEocyk7dGhpcy5zaXplPW8uc2l6ZX1TdGFjay5wcm90b3R5cGUuY2xlYXI9dSxTdGFjay5wcm90b3R5cGUuZGVsZXRlPV8sU3RhY2sucHJvdG90eXBlLmdldD13LFN0YWNrLnByb3RvdHlwZS5oYXM9eCxTdGFjay5wcm90b3R5cGUuc2V0PUMscy5leHBvcnRzPVN0YWNrfSw1MTg3MyhzLG8saSl7dmFyIGE9aSg5MzI1KS5TeW1ib2w7cy5leHBvcnRzPWF9LDM3ODI4KHMsbyxpKXt2YXIgYT1pKDkzMjUpLlVpbnQ4QXJyYXk7cy5leHBvcnRzPWF9LDI4MzAzKHMsbyxpKXt2YXIgYT1pKDU2MTEwKShpKDkzMjUpLCJXZWFrTWFwIik7cy5leHBvcnRzPWF9LDkxMDMzKHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBhcHBseShzLG8saSl7c3dpdGNoKGkubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHMuY2FsbChvKTtjYXNlIDE6cmV0dXJuIHMuY2FsbChvLGlbMF0pO2Nhc2UgMjpyZXR1cm4gcy5jYWxsKG8saVswXSxpWzFdKTtjYXNlIDM6cmV0dXJuIHMuY2FsbChvLGlbMF0saVsxXSxpWzJdKX1yZXR1cm4gcy5hcHBseShvLGkpfX0sODM3Mjkocyl7cy5leHBvcnRzPWZ1bmN0aW9uIGFycmF5RWFjaChzLG8pe2Zvcih2YXIgaT0tMSxhPW51bGw9PXM/MDpzLmxlbmd0aDsrK2k8YSYmITEhPT1vKHNbaV0saSxzKTspO3JldHVybiBzfX0sNzk3NzAocyl7cy5leHBvcnRzPWZ1bmN0aW9uIGFycmF5RmlsdGVyKHMsbyl7Zm9yKHZhciBpPS0xLGE9bnVsbD09cz8wOnMubGVuZ3RoLHU9MCxfPVtdOysraTxhOyl7dmFyIHc9c1tpXTtvKHcsaSxzKSYmKF9bdSsrXT13KX1yZXR1cm4gX319LDE1MzI1KHMsbyxpKXt2YXIgYT1pKDk2MTMxKTtzLmV4cG9ydHM9ZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhzLG8pe3JldHVybiEhKG51bGw9PXM/MDpzLmxlbmd0aCkmJmEocyxvLDApPi0xfX0sNzA2OTUocyxvLGkpe3ZhciBhPWkoNzgwOTYpLHU9aSg3MjQyOCksXz1pKDU2NDQ5KSx3PWkoMzY1NikseD1pKDMwMzYxKSxDPWkoMzcxNjcpLGo9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtzLmV4cG9ydHM9ZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyhzLG8pe3ZhciBpPV8ocyksTD0haSYmdShzKSxCPSFpJiYhTCYmdyhzKSwkPSFpJiYhTCYmIUImJkMocyksVT1pfHxMfHxCfHwkLFY9VT9hKHMubGVuZ3RoLFN0cmluZyk6W10sej1WLmxlbmd0aDtmb3IodmFyIFkgaW4gcykhbyYmIWouY2FsbChzLFkpfHxVJiYoImxlbmd0aCI9PVl8fEImJigib2Zmc2V0Ij09WXx8InBhcmVudCI9PVkpfHwkJiYoImJ1ZmZlciI9PVl8fCJieXRlTGVuZ3RoIj09WXx8ImJ5dGVPZmZzZXQiPT1ZKXx8eChZLHopKXx8Vi5wdXNoKFkpO3JldHVybiBWfX0sMzQ5MzIocyl7cy5leHBvcnRzPWZ1bmN0aW9uIGFycmF5TWFwKHMsbyl7Zm9yKHZhciBpPS0xLGE9bnVsbD09cz8wOnMubGVuZ3RoLHU9QXJyYXkoYSk7KytpPGE7KXVbaV09byhzW2ldLGkscyk7cmV0dXJuIHV9fSwxNDUyOChzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gYXJyYXlQdXNoKHMsbyl7Zm9yKHZhciBpPS0xLGE9by5sZW5ndGgsdT1zLmxlbmd0aDsrK2k8YTspc1t1K2ldPW9baV07cmV0dXJuIHN9fSw0MDg4MihzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gYXJyYXlSZWR1Y2UocyxvLGksYSl7dmFyIHU9LTEsXz1udWxsPT1zPzA6cy5sZW5ndGg7Zm9yKGEmJl8mJihpPXNbKyt1XSk7Kyt1PF87KWk9byhpLHNbdV0sdSxzKTtyZXR1cm4gaX19LDE0MjQ4KHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBhcnJheVNvbWUocyxvKXtmb3IodmFyIGk9LTEsYT1udWxsPT1zPzA6cy5sZW5ndGg7KytpPGE7KWlmKG8oc1tpXSxpLHMpKXJldHVybiEwO3JldHVybiExfX0sNjEwNzQocyl7cy5leHBvcnRzPWZ1bmN0aW9uIGFzY2lpVG9BcnJheShzKXtyZXR1cm4gcy5zcGxpdCgiIil9fSwxNzMzKHMpe3ZhciBvPS9bXlx4MDAtXHgyZlx4M2EtXHg0MFx4NWItXHg2MFx4N2ItXHg3Zl0rL2c7cy5leHBvcnRzPWZ1bmN0aW9uIGFzY2lpV29yZHMocyl7cmV0dXJuIHMubWF0Y2gobyl8fFtdfX0sODc4MDUocyxvLGkpe3ZhciBhPWkoNDMzNjApLHU9aSg3NTI4OCk7cy5leHBvcnRzPWZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUocyxvLGkpeyh2b2lkIDAhPT1pJiYhdShzW29dLGkpfHx2b2lkIDA9PT1pJiYhKG8gaW4gcykpJiZhKHMsbyxpKX19LDE2NTQ3KHMsbyxpKXt2YXIgYT1pKDQzMzYwKSx1PWkoNzUyODgpLF89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtzLmV4cG9ydHM9ZnVuY3Rpb24gYXNzaWduVmFsdWUocyxvLGkpe3ZhciB3PXNbb107Xy5jYWxsKHMsbykmJnUodyxpKSYmKHZvaWQgMCE9PWl8fG8gaW4gcyl8fGEocyxvLGkpfX0sMjYwMjUocyxvLGkpe3ZhciBhPWkoNzUyODgpO3MuZXhwb3J0cz1mdW5jdGlvbiBhc3NvY0luZGV4T2YocyxvKXtmb3IodmFyIGk9cy5sZW5ndGg7aS0tOylpZihhKHNbaV1bMF0sbykpcmV0dXJuIGk7cmV0dXJuLTF9fSw3NDczMyhzLG8saSl7dmFyIGE9aSgyMTc5MSksdT1pKDk1OTUwKTtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUFzc2lnbihzLG8pe3JldHVybiBzJiZhKG8sdShvKSxzKX19LDQzODM4KHMsbyxpKXt2YXIgYT1pKDIxNzkxKSx1PWkoMzcyNDEpO3MuZXhwb3J0cz1mdW5jdGlvbiBiYXNlQXNzaWduSW4ocyxvKXtyZXR1cm4gcyYmYShvLHUobykscyl9fSw0MzM2MChzLG8saSl7dmFyIGE9aSg5MzI0Myk7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShzLG8saSl7Il9fcHJvdG9fXyI9PW8mJmE/YShzLG8se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmksd3JpdGFibGU6ITB9KTpzW29dPWl9fSw5OTk5KHMsbyxpKXt2YXIgYT1pKDM3MjE3KSx1PWkoODM3MjkpLF89aSgxNjU0Nyksdz1pKDc0NzMzKSx4PWkoNDM4MzgpLEM9aSg5MzI5MCksaj1pKDIzMDA3KSxMPWkoOTIyNzEpLEI9aSg0ODk0OCksJD1pKDUwMDAyKSxVPWkoODMzNDkpLFY9aSg1ODYxKSx6PWkoNzYxODkpLFk9aSg3NzE5OSksWj1pKDM1NTI5KSxlZT1pKDU2NDQ5KSxpZT1pKDM2NTYpLGFlPWkoODc3MzApLGNlPWkoMjM4MDUpLGxlPWkoMzg0NDApLHBlPWkoOTU5NTApLGRlPWkoMzcyNDEpLGZlPSJbb2JqZWN0IEFyZ3VtZW50c10iLHllPSJbb2JqZWN0IEZ1bmN0aW9uXSIsYmU9IltvYmplY3QgT2JqZWN0XSIsU2U9e307U2VbZmVdPVNlWyJbb2JqZWN0IEFycmF5XSJdPVNlWyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPVNlWyJbb2JqZWN0IERhdGFWaWV3XSJdPVNlWyJbb2JqZWN0IEJvb2xlYW5dIl09U2VbIltvYmplY3QgRGF0ZV0iXT1TZVsiW29iamVjdCBGbG9hdDMyQXJyYXldIl09U2VbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPVNlWyJbb2JqZWN0IEludDhBcnJheV0iXT1TZVsiW29iamVjdCBJbnQxNkFycmF5XSJdPVNlWyJbb2JqZWN0IEludDMyQXJyYXldIl09U2VbIltvYmplY3QgTWFwXSJdPVNlWyJbb2JqZWN0IE51bWJlcl0iXT1TZVtiZV09U2VbIltvYmplY3QgUmVnRXhwXSJdPVNlWyJbb2JqZWN0IFNldF0iXT1TZVsiW29iamVjdCBTdHJpbmddIl09U2VbIltvYmplY3QgU3ltYm9sXSJdPVNlWyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09U2VbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09U2VbIltvYmplY3QgVWludDE2QXJyYXldIl09U2VbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsU2VbIltvYmplY3QgRXJyb3JdIl09U2VbeWVdPVNlWyJbb2JqZWN0IFdlYWtNYXBdIl09ITEscy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VDbG9uZShzLG8saSxfZSx3ZSx4ZSl7dmFyIFBlLFRlPTEmbyxSZT0yJm8sJGU9NCZvO2lmKGkmJihQZT13ZT9pKHMsX2Usd2UseGUpOmkocykpLHZvaWQgMCE9PVBlKXJldHVybiBQZTtpZighY2UocykpcmV0dXJuIHM7dmFyIHFlPWVlKHMpO2lmKHFlKXtpZihQZT16KHMpLCFUZSlyZXR1cm4gaihzLFBlKX1lbHNle3ZhciB6ZT1WKHMpLFdlPXplPT15ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09emU7aWYoaWUocykpcmV0dXJuIEMocyxUZSk7aWYoemU9PWJlfHx6ZT09ZmV8fFdlJiYhd2Upe2lmKFBlPVJlfHxXZT97fTpaKHMpLCFUZSlyZXR1cm4gUmU/QihzLHgoUGUscykpOkwocyx3KFBlLHMpKX1lbHNle2lmKCFTZVt6ZV0pcmV0dXJuIHdlP3M6e307UGU9WShzLHplLFRlKX19eGV8fCh4ZT1uZXcgYSk7dmFyIEhlPXhlLmdldChzKTtpZihIZSlyZXR1cm4gSGU7eGUuc2V0KHMsUGUpLGxlKHMpP3MuZm9yRWFjaCgoZnVuY3Rpb24oYSl7UGUuYWRkKGJhc2VDbG9uZShhLG8saSxhLHMseGUpKX0pKTphZShzKSYmcy5mb3JFYWNoKChmdW5jdGlvbihhLHUpe1BlLnNldCh1LGJhc2VDbG9uZShhLG8saSx1LHMseGUpKX0pKTt2YXIgWWU9cWU/dm9pZCAwOigkZT9SZT9VOiQ6UmU/ZGU6cGUpKHMpO3JldHVybiB1KFllfHxzLChmdW5jdGlvbihhLHUpe1llJiYoYT1zW3U9YV0pLF8oUGUsdSxiYXNlQ2xvbmUoYSxvLGksdSxzLHhlKSl9KSksUGV9fSwzOTM0NChzLG8saSl7dmFyIGE9aSgyMzgwNSksdT1PYmplY3QuY3JlYXRlLF89ZnVuY3Rpb24oKXtmdW5jdGlvbiBvYmplY3QoKXt9cmV0dXJuIGZ1bmN0aW9uKHMpe2lmKCFhKHMpKXJldHVybnt9O2lmKHUpcmV0dXJuIHUocyk7b2JqZWN0LnByb3RvdHlwZT1zO3ZhciBvPW5ldyBvYmplY3Q7cmV0dXJuIG9iamVjdC5wcm90b3R5cGU9dm9pZCAwLG99fSgpO3MuZXhwb3J0cz1ffSw4MDkwOShzLG8saSl7dmFyIGE9aSgzMDY0MSksdT1pKDM4MzI5KShhKTtzLmV4cG9ydHM9dX0sMjUyMyhzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUZpbmRJbmRleChzLG8saSxhKXtmb3IodmFyIHU9cy5sZW5ndGgsXz1pKyhhPzE6LTEpO2E/Xy0tOisrXzx1OylpZihvKHNbX10sXyxzKSlyZXR1cm4gXztyZXR1cm4tMX19LDgzMTIwKHMsbyxpKXt2YXIgYT1pKDE0NTI4KSx1PWkoNDU4OTEpO3MuZXhwb3J0cz1mdW5jdGlvbiBiYXNlRmxhdHRlbihzLG8saSxfLHcpe3ZhciB4PS0xLEM9cy5sZW5ndGg7Zm9yKGl8fChpPXUpLHd8fCh3PVtdKTsrK3g8Qzspe3ZhciBqPXNbeF07bz4wJiZpKGopP28+MT9iYXNlRmxhdHRlbihqLG8tMSxpLF8sdyk6YSh3LGopOl98fCh3W3cubGVuZ3RoXT1qKX1yZXR1cm4gd319LDg2NjQ5KHMsbyxpKXt2YXIgYT1pKDgzMjIxKSgpO3MuZXhwb3J0cz1hfSwzMDY0MShzLG8saSl7dmFyIGE9aSg4NjY0OSksdT1pKDk1OTUwKTtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUZvck93bihzLG8pe3JldHVybiBzJiZhKHMsbyx1KX19LDQ3NDIyKHMsbyxpKXt2YXIgYT1pKDMxNzY5KSx1PWkoNzc3OTcpO3MuZXhwb3J0cz1mdW5jdGlvbiBiYXNlR2V0KHMsbyl7Zm9yKHZhciBpPTAsXz0obz1hKG8scykpLmxlbmd0aDtudWxsIT1zJiZpPF87KXM9c1t1KG9baSsrXSldO3JldHVybiBpJiZpPT1fP3M6dm9pZCAwfX0sODIxOTkocyxvLGkpe3ZhciBhPWkoMTQ1MjgpLHU9aSg1NjQ0OSk7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKHMsbyxpKXt2YXIgXz1vKHMpO3JldHVybiB1KHMpP186YShfLGkocykpfX0sNzI1NTIocyxvLGkpe3ZhciBhPWkoNTE4NzMpLHU9aSg2NTkpLF89aSg1OTM1MCksdz1hP2EudG9TdHJpbmdUYWc6dm9pZCAwO3MuZXhwb3J0cz1mdW5jdGlvbiBiYXNlR2V0VGFnKHMpe3JldHVybiBudWxsPT1zP3ZvaWQgMD09PXM/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOncmJncgaW4gT2JqZWN0KHMpP3Uocyk6XyhzKX19LDIwNDI2KHMpe3ZhciBvPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VIYXMocyxpKXtyZXR1cm4gbnVsbCE9cyYmby5jYWxsKHMsaSl9fSwyODA3NyhzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUhhc0luKHMsbyl7cmV0dXJuIG51bGwhPXMmJm8gaW4gT2JqZWN0KHMpfX0sOTYxMzEocyxvLGkpe3ZhciBhPWkoMjUyMyksdT1pKDg1NDYzKSxfPWkoNzY5NTkpO3MuZXhwb3J0cz1mdW5jdGlvbiBiYXNlSW5kZXhPZihzLG8saSl7cmV0dXJuIG89PW8/XyhzLG8saSk6YShzLHUsaSl9fSwyNzUzNChzLG8saSl7dmFyIGE9aSg3MjU1MiksdT1pKDQwMzQ2KTtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHMpe3JldHVybiB1KHMpJiYiW29iamVjdCBBcmd1bWVudHNdIj09YShzKX19LDYwMjcwKHMsbyxpKXt2YXIgYT1pKDg3MDY4KSx1PWkoNDAzNDYpO3MuZXhwb3J0cz1mdW5jdGlvbiBiYXNlSXNFcXVhbChzLG8saSxfLHcpe3JldHVybiBzPT09b3x8KG51bGw9PXN8fG51bGw9PW98fCF1KHMpJiYhdShvKT9zIT1zJiZvIT1vOmEocyxvLGksXyxiYXNlSXNFcXVhbCx3KSl9fSw4NzA2OChzLG8saSl7dmFyIGE9aSgzNzIxNyksdT1pKDI1OTExKSxfPWkoMjE5ODYpLHc9aSg1MDY4OSkseD1pKDU4NjEpLEM9aSg1NjQ0OSksaj1pKDM2NTYpLEw9aSgzNzE2NyksQj0iW29iamVjdCBBcmd1bWVudHNdIiwkPSJbb2JqZWN0IEFycmF5XSIsVT0iW29iamVjdCBPYmplY3RdIixWPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChzLG8saSx6LFksWil7dmFyIGVlPUMocyksaWU9QyhvKSxhZT1lZT8kOngocyksY2U9aWU/JDp4KG8pLGxlPShhZT1hZT09Qj9VOmFlKT09VSxwZT0oY2U9Y2U9PUI/VTpjZSk9PVUsZGU9YWU9PWNlO2lmKGRlJiZqKHMpKXtpZighaihvKSlyZXR1cm4hMTtlZT0hMCxsZT0hMX1pZihkZSYmIWxlKXJldHVybiBafHwoWj1uZXcgYSksZWV8fEwocyk/dShzLG8saSx6LFksWik6XyhzLG8sYWUsaSx6LFksWik7aWYoISgxJmkpKXt2YXIgZmU9bGUmJlYuY2FsbChzLCJfX3dyYXBwZWRfXyIpLHllPXBlJiZWLmNhbGwobywiX193cmFwcGVkX18iKTtpZihmZXx8eWUpe3ZhciBiZT1mZT9zLnZhbHVlKCk6cyxTZT15ZT9vLnZhbHVlKCk6bztyZXR1cm4gWnx8KFo9bmV3IGEpLFkoYmUsU2UsaSx6LFopfX1yZXR1cm4hIWRlJiYoWnx8KFo9bmV3IGEpLHcocyxvLGkseixZLFopKX19LDI5MTcyKHMsbyxpKXt2YXIgYT1pKDU4NjEpLHU9aSg0MDM0Nik7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VJc01hcChzKXtyZXR1cm4gdShzKSYmIltvYmplY3QgTWFwXSI9PWEocyl9fSw0MTc5OShzLG8saSl7dmFyIGE9aSgzNzIxNyksdT1pKDYwMjcwKTtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUlzTWF0Y2gocyxvLGksXyl7dmFyIHc9aS5sZW5ndGgseD13LEM9IV87aWYobnVsbD09cylyZXR1cm4heDtmb3Iocz1PYmplY3Qocyk7dy0tOyl7dmFyIGo9aVt3XTtpZihDJiZqWzJdP2pbMV0hPT1zW2pbMF1dOiEoalswXWluIHMpKXJldHVybiExfWZvcig7Kyt3PHg7KXt2YXIgTD0oaj1pW3ddKVswXSxCPXNbTF0sJD1qWzFdO2lmKEMmJmpbMl0pe2lmKHZvaWQgMD09PUImJiEoTCBpbiBzKSlyZXR1cm4hMX1lbHNle3ZhciBVPW5ldyBhO2lmKF8pdmFyIFY9XyhCLCQsTCxzLG8sVSk7aWYoISh2b2lkIDA9PT1WP3UoJCxCLDMsXyxVKTpWKSlyZXR1cm4hMX19cmV0dXJuITB9fSw4NTQ2MyhzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUlzTmFOKHMpe3JldHVybiBzIT1zfX0sNDUwODMocyxvLGkpe3ZhciBhPWkoMTg4MiksdT1pKDg3Mjk2KSxfPWkoMjM4MDUpLHc9aSg0NzQ3MykseD0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxDPUZ1bmN0aW9uLnByb3RvdHlwZSxqPU9iamVjdC5wcm90b3R5cGUsTD1DLnRvU3RyaW5nLEI9ai5oYXNPd25Qcm9wZXJ0eSwkPVJlZ0V4cCgiXiIrTC5jYWxsKEIpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3MuZXhwb3J0cz1mdW5jdGlvbiBiYXNlSXNOYXRpdmUocyl7cmV0dXJuISghXyhzKXx8dShzKSkmJihhKHMpPyQ6eCkudGVzdCh3KHMpKX19LDE2MDM4KHMsbyxpKXt2YXIgYT1pKDU4NjEpLHU9aSg0MDM0Nik7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VJc1NldChzKXtyZXR1cm4gdShzKSYmIltvYmplY3QgU2V0XSI9PWEocyl9fSw0OTAxKHMsbyxpKXt2YXIgYT1pKDcyNTUyKSx1PWkoMzAyOTQpLF89aSg0MDM0Niksdz17fTt3WyJbb2JqZWN0IEZsb2F0MzJBcnJheV0iXT13WyJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXT13WyJbb2JqZWN0IEludDhBcnJheV0iXT13WyJbb2JqZWN0IEludDE2QXJyYXldIl09d1siW29iamVjdCBJbnQzMkFycmF5XSJdPXdbIltvYmplY3QgVWludDhBcnJheV0iXT13WyJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSJdPXdbIltvYmplY3QgVWludDE2QXJyYXldIl09d1siW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCx3WyJbb2JqZWN0IEFyZ3VtZW50c10iXT13WyJbb2JqZWN0IEFycmF5XSJdPXdbIltvYmplY3QgQXJyYXlCdWZmZXJdIl09d1siW29iamVjdCBCb29sZWFuXSJdPXdbIltvYmplY3QgRGF0YVZpZXddIl09d1siW29iamVjdCBEYXRlXSJdPXdbIltvYmplY3QgRXJyb3JdIl09d1siW29iamVjdCBGdW5jdGlvbl0iXT13WyJbb2JqZWN0IE1hcF0iXT13WyJbb2JqZWN0IE51bWJlcl0iXT13WyJbb2JqZWN0IE9iamVjdF0iXT13WyJbb2JqZWN0IFJlZ0V4cF0iXT13WyJbb2JqZWN0IFNldF0iXT13WyJbb2JqZWN0IFN0cmluZ10iXT13WyJbb2JqZWN0IFdlYWtNYXBdIl09ITEscy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkocyl7cmV0dXJuIF8ocykmJnUocy5sZW5ndGgpJiYhIXdbYShzKV19fSwxNTM4OShzLG8saSl7dmFyIGE9aSg5MzY2MyksdT1pKDg3OTc4KSxfPWkoODM0ODgpLHc9aSg1NjQ0OSkseD1pKDUwNTgzKTtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUl0ZXJhdGVlKHMpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBzP3M6bnVsbD09cz9fOiJvYmplY3QiPT10eXBlb2Ygcz93KHMpP3Uoc1swXSxzWzFdKTphKHMpOngocyl9fSw4ODk4NChzLG8saSl7dmFyIGE9aSg1NTUyNyksdT1pKDM2NTApLF89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUtleXMocyl7aWYoIWEocykpcmV0dXJuIHUocyk7dmFyIG89W107Zm9yKHZhciBpIGluIE9iamVjdChzKSlfLmNhbGwocyxpKSYmImNvbnN0cnVjdG9yIiE9aSYmby5wdXNoKGkpO3JldHVybiBvfX0sNzI5MDMocyxvLGkpe3ZhciBhPWkoMjM4MDUpLHU9aSg1NTUyNyksXz1pKDkwMTgxKSx3PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VLZXlzSW4ocyl7aWYoIWEocykpcmV0dXJuIF8ocyk7dmFyIG89dShzKSxpPVtdO2Zvcih2YXIgeCBpbiBzKSgiY29uc3RydWN0b3IiIT14fHwhbyYmdy5jYWxsKHMseCkpJiZpLnB1c2goeCk7cmV0dXJuIGl9fSw5NDAzMyhzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUxvZGFzaCgpe319LDkzNjYzKHMsbyxpKXt2YXIgYT1pKDQxNzk5KSx1PWkoMTA3NzYpLF89aSg2NzE5Nyk7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VNYXRjaGVzKHMpe3ZhciBvPXUocyk7cmV0dXJuIDE9PW8ubGVuZ3RoJiZvWzBdWzJdP18ob1swXVswXSxvWzBdWzFdKTpmdW5jdGlvbihpKXtyZXR1cm4gaT09PXN8fGEoaSxzLG8pfX19LDg3OTc4KHMsbyxpKXt2YXIgYT1pKDYwMjcwKSx1PWkoNTgxNTYpLF89aSg4MDYzMSksdz1pKDI4NTg2KSx4PWkoMzA3NTYpLEM9aSg2NzE5Nyksaj1pKDc3Nzk3KTtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShzLG8pe3JldHVybiB3KHMpJiZ4KG8pP0MoaihzKSxvKTpmdW5jdGlvbihpKXt2YXIgdz11KGkscyk7cmV0dXJuIHZvaWQgMD09PXcmJnc9PT1vP18oaSxzKTphKG8sdywzKX19fSw4NTI1MChzLG8saSl7dmFyIGE9aSgzNzIxNyksdT1pKDg3ODA1KSxfPWkoODY2NDkpLHc9aSg0MjgyNCkseD1pKDIzODA1KSxDPWkoMzcyNDEpLGo9aSgxNDk3NCk7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VNZXJnZShzLG8saSxMLEIpe3MhPT1vJiZfKG8sKGZ1bmN0aW9uKF8sQyl7aWYoQnx8KEI9bmV3IGEpLHgoXykpdyhzLG8sQyxpLGJhc2VNZXJnZSxMLEIpO2Vsc2V7dmFyICQ9TD9MKGoocyxDKSxfLEMrIiIscyxvLEIpOnZvaWQgMDt2b2lkIDA9PT0kJiYoJD1fKSx1KHMsQywkKX19KSxDKX19LDQyODI0KHMsbyxpKXt2YXIgYT1pKDg3ODA1KSx1PWkoOTMyOTApLF89aSg3MTk2MSksdz1pKDIzMDA3KSx4PWkoMzU1MjkpLEM9aSg3MjQyOCksaj1pKDU2NDQ5KSxMPWkoODM2OTMpLEI9aSgzNjU2KSwkPWkoMTg4MiksVT1pKDIzODA1KSxWPWkoMTEzMzEpLHo9aSgzNzE2NyksWT1pKDE0OTc0KSxaPWkoNjk4ODQpO3MuZXhwb3J0cz1mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKHMsbyxpLGVlLGllLGFlLGNlKXt2YXIgbGU9WShzLGkpLHBlPVkobyxpKSxkZT1jZS5nZXQocGUpO2lmKGRlKWEocyxpLGRlKTtlbHNle3ZhciBmZT1hZT9hZShsZSxwZSxpKyIiLHMsbyxjZSk6dm9pZCAwLHllPXZvaWQgMD09PWZlO2lmKHllKXt2YXIgYmU9aihwZSksU2U9IWJlJiZCKHBlKSxfZT0hYmUmJiFTZSYmeihwZSk7ZmU9cGUsYmV8fFNlfHxfZT9qKGxlKT9mZT1sZTpMKGxlKT9mZT13KGxlKTpTZT8oeWU9ITEsZmU9dShwZSwhMCkpOl9lPyh5ZT0hMSxmZT1fKHBlLCEwKSk6ZmU9W106VihwZSl8fEMocGUpPyhmZT1sZSxDKGxlKT9mZT1aKGxlKTpVKGxlKSYmISQobGUpfHwoZmU9eChwZSkpKTp5ZT0hMX15ZSYmKGNlLnNldChwZSxmZSksaWUoZmUscGUsZWUsYWUsY2UpLGNlLmRlbGV0ZShwZSkpLGEocyxpLGZlKX19fSw0NzIzNyhzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZVByb3BlcnR5KHMpe3JldHVybiBmdW5jdGlvbihvKXtyZXR1cm4gbnVsbD09bz92b2lkIDA6b1tzXX19fSwxNzI1NShzLG8saSl7dmFyIGE9aSg0NzQyMik7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eURlZXAocyl7cmV0dXJuIGZ1bmN0aW9uKG8pe3JldHVybiBhKG8scyl9fX0sNTQ1NTIocyl7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eU9mKHMpe3JldHVybiBmdW5jdGlvbihvKXtyZXR1cm4gbnVsbD09cz92b2lkIDA6c1tvXX19fSw4NTU1OChzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZVJlZHVjZShzLG8saSxhLHUpe3JldHVybiB1KHMsKGZ1bmN0aW9uKHMsdSxfKXtpPWE/KGE9ITEscyk6byhpLHMsdSxfKX0pKSxpfX0sNjkzMDIocyxvLGkpe3ZhciBhPWkoODM0ODgpLHU9aSg1Njc1NyksXz1pKDMyODY1KTtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZVJlc3QocyxvKXtyZXR1cm4gXyh1KHMsbyxhKSxzKyIiKX19LDczMTcwKHMsbyxpKXt2YXIgYT1pKDE2NTQ3KSx1PWkoMzE3NjkpLF89aSgzMDM2MSksdz1pKDIzODA1KSx4PWkoNzc3OTcpO3MuZXhwb3J0cz1mdW5jdGlvbiBiYXNlU2V0KHMsbyxpLEMpe2lmKCF3KHMpKXJldHVybiBzO2Zvcih2YXIgaj0tMSxMPShvPXUobyxzKSkubGVuZ3RoLEI9TC0xLCQ9cztudWxsIT0kJiYrK2o8TDspe3ZhciBVPXgob1tqXSksVj1pO2lmKCJfX3Byb3RvX18iPT09VXx8ImNvbnN0cnVjdG9yIj09PVV8fCJwcm90b3R5cGUiPT09VSlyZXR1cm4gcztpZihqIT1CKXt2YXIgej0kW1VdO3ZvaWQgMD09PShWPUM/Qyh6LFUsJCk6dm9pZCAwKSYmKFY9dyh6KT96Ol8ob1tqKzFdKT9bXTp7fSl9YSgkLFUsViksJD0kW1VdfXJldHVybiBzfX0sNjg4ODIocyxvLGkpe3ZhciBhPWkoODM0ODgpLHU9aSg0ODE1MiksXz11P2Z1bmN0aW9uKHMsbyl7cmV0dXJuIHUuc2V0KHMsbyksc306YTtzLmV4cG9ydHM9X30sMTk1NzAocyxvLGkpe3ZhciBhPWkoMzczMzQpLHU9aSg5MzI0MyksXz1pKDgzNDg4KSx3PXU/ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdShzLCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOmEobyksd3JpdGFibGU6ITB9KX06XztzLmV4cG9ydHM9d30sMjUxNjAocyl7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VTbGljZShzLG8saSl7dmFyIGE9LTEsdT1zLmxlbmd0aDtvPDAmJihvPS1vPnU/MDp1K28pLChpPWk+dT91OmkpPDAmJihpKz11KSx1PW8+aT8wOmktbz4+PjAsbz4+Pj0wO2Zvcih2YXIgXz1BcnJheSh1KTsrK2E8dTspX1thXT1zW2Erb107cmV0dXJuIF99fSw5MDkxNihzLG8saSl7dmFyIGE9aSg4MDkwOSk7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VTb21lKHMsbyl7dmFyIGk7cmV0dXJuIGEocywoZnVuY3Rpb24ocyxhLHUpe3JldHVybiEoaT1vKHMsYSx1KSl9KSksISFpfX0sNzgwOTYocyl7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VUaW1lcyhzLG8pe2Zvcih2YXIgaT0tMSxhPUFycmF5KHMpOysraTxzOylhW2ldPW8oaSk7cmV0dXJuIGF9fSw3NzU1NihzLG8saSl7dmFyIGE9aSg1MTg3MyksdT1pKDM0OTMyKSxfPWkoNTY0NDkpLHc9aSg0NDM5NCkseD1hP2EucHJvdG90eXBlOnZvaWQgMCxDPXg/eC50b1N0cmluZzp2b2lkIDA7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VUb1N0cmluZyhzKXtpZigic3RyaW5nIj09dHlwZW9mIHMpcmV0dXJuIHM7aWYoXyhzKSlyZXR1cm4gdShzLGJhc2VUb1N0cmluZykrIiI7aWYodyhzKSlyZXR1cm4gQz9DLmNhbGwocyk6IiI7dmFyIG89cysiIjtyZXR1cm4iMCI9PW8mJjEvcz09LTEvMD8iLTAiOm99fSw1NDEyOChzLG8saSl7dmFyIGE9aSgzMTgwMCksdT0vXlxzKy87cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VUcmltKHMpe3JldHVybiBzP3Muc2xpY2UoMCxhKHMpKzEpLnJlcGxhY2UodSwiIik6c319LDI3MzAxKHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBiYXNlVW5hcnkocyl7cmV0dXJuIGZ1bmN0aW9uKG8pe3JldHVybiBzKG8pfX19LDE5OTMxKHMsbyxpKXt2YXIgYT1pKDMxNzY5KSx1PWkoNjgwOTApLF89aSg2ODk2OSksdz1pKDc3Nzk3KSx4PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7cy5leHBvcnRzPWZ1bmN0aW9uIGJhc2VVbnNldChzLG8pe3ZhciBpPS0xLEM9KG89YShvLHMpKS5sZW5ndGg7aWYoIUMpcmV0dXJuITA7Zm9yKHZhciBqPW51bGw9PXN8fCJvYmplY3QiIT10eXBlb2YgcyYmImZ1bmN0aW9uIiE9dHlwZW9mIHM7KytpPEM7KXt2YXIgTD1vW2ldO2lmKCJzdHJpbmciPT10eXBlb2YgTCl7aWYoIl9fcHJvdG9fXyI9PT1MJiYheC5jYWxsKHMsIl9fcHJvdG9fXyIpKXJldHVybiExO2lmKCJjb25zdHJ1Y3RvciI9PT1MJiZpKzE8QyYmInN0cmluZyI9PXR5cGVvZiBvW2krMV0mJiJwcm90b3R5cGUiPT09b1tpKzFdKXtpZihqJiYwPT09aSljb250aW51ZTtyZXR1cm4hMX19fXZhciBCPV8ocyxvKTtyZXR1cm4gbnVsbD09Qnx8ZGVsZXRlIEJbdyh1KG8pKV19fSw1MTIzNChzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZVppcE9iamVjdChzLG8saSl7Zm9yKHZhciBhPS0xLHU9cy5sZW5ndGgsXz1vLmxlbmd0aCx3PXt9OysrYTx1Oyl7dmFyIHg9YTxfP29bYV06dm9pZCAwO2kodyxzW2FdLHgpfXJldHVybiB3fX0sMTkyMTkocyl7cy5leHBvcnRzPWZ1bmN0aW9uIGNhY2hlSGFzKHMsbyl7cmV0dXJuIHMuaGFzKG8pfX0sMzE3NjkocyxvLGkpe3ZhciBhPWkoNTY0NDkpLHU9aSgyODU4NiksXz1pKDYxODAyKSx3PWkoMTMyMjIpO3MuZXhwb3J0cz1mdW5jdGlvbiBjYXN0UGF0aChzLG8pe3JldHVybiBhKHMpP3M6dShzLG8pP1tzXTpfKHcocykpfX0sMjg3NTQocyxvLGkpe3ZhciBhPWkoMjUxNjApO3MuZXhwb3J0cz1mdW5jdGlvbiBjYXN0U2xpY2UocyxvLGkpe3ZhciB1PXMubGVuZ3RoO3JldHVybiBpPXZvaWQgMD09PWk/dTppLCFvJiZpPj11P3M6YShzLG8saSl9fSw0OTY1MyhzLG8saSl7dmFyIGE9aSgzNzgyOCk7cy5leHBvcnRzPWZ1bmN0aW9uIGNsb25lQXJyYXlCdWZmZXIocyl7dmFyIG89bmV3IHMuY29uc3RydWN0b3Iocy5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IGEobykuc2V0KG5ldyBhKHMpKSxvfX0sOTMyOTAocyxvLGkpe3M9aS5ubWQocyk7dmFyIGE9aSg5MzI1KSx1PW8mJiFvLm5vZGVUeXBlJiZvLF89dSYmcyYmIXMubm9kZVR5cGUmJnMsdz1fJiZfLmV4cG9ydHM9PT11P2EuQnVmZmVyOnZvaWQgMCx4PXc/dy5hbGxvY1Vuc2FmZTp2b2lkIDA7cy5leHBvcnRzPWZ1bmN0aW9uIGNsb25lQnVmZmVyKHMsbyl7aWYobylyZXR1cm4gcy5zbGljZSgpO3ZhciBpPXMubGVuZ3RoLGE9eD94KGkpOm5ldyBzLmNvbnN0cnVjdG9yKGkpO3JldHVybiBzLmNvcHkoYSksYX19LDc2MTY5KHMsbyxpKXt2YXIgYT1pKDQ5NjUzKTtzLmV4cG9ydHM9ZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhzLG8pe3ZhciBpPW8/YShzLmJ1ZmZlcik6cy5idWZmZXI7cmV0dXJuIG5ldyBzLmNvbnN0cnVjdG9yKGkscy5ieXRlT2Zmc2V0LHMuYnl0ZUxlbmd0aCl9fSw3MzIwMShzKXt2YXIgbz0vXHcqJC87cy5leHBvcnRzPWZ1bmN0aW9uIGNsb25lUmVnRXhwKHMpe3ZhciBpPW5ldyBzLmNvbnN0cnVjdG9yKHMuc291cmNlLG8uZXhlYyhzKSk7cmV0dXJuIGkubGFzdEluZGV4PXMubGFzdEluZGV4LGl9fSw5MzczNihzLG8saSl7dmFyIGE9aSg1MTg3MyksdT1hP2EucHJvdG90eXBlOnZvaWQgMCxfPXU/dS52YWx1ZU9mOnZvaWQgMDtzLmV4cG9ydHM9ZnVuY3Rpb24gY2xvbmVTeW1ib2wocyl7cmV0dXJuIF8/T2JqZWN0KF8uY2FsbChzKSk6e319fSw3MTk2MShzLG8saSl7dmFyIGE9aSg0OTY1Myk7cy5leHBvcnRzPWZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheShzLG8pe3ZhciBpPW8/YShzLmJ1ZmZlcik6cy5idWZmZXI7cmV0dXJuIG5ldyBzLmNvbnN0cnVjdG9yKGkscy5ieXRlT2Zmc2V0LHMubGVuZ3RoKX19LDkxNTk2KHMpe3ZhciBvPU1hdGgubWF4O3MuZXhwb3J0cz1mdW5jdGlvbiBjb21wb3NlQXJncyhzLGksYSx1KXtmb3IodmFyIF89LTEsdz1zLmxlbmd0aCx4PWEubGVuZ3RoLEM9LTEsaj1pLmxlbmd0aCxMPW8ody14LDApLEI9QXJyYXkoaitMKSwkPSF1OysrQzxqOylCW0NdPWlbQ107Zm9yKDsrK188eDspKCR8fF88dykmJihCW2FbX11dPXNbX10pO2Zvcig7TC0tOylCW0MrK109c1tfKytdO3JldHVybiBCfX0sNTMzMjAocyl7dmFyIG89TWF0aC5tYXg7cy5leHBvcnRzPWZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQocyxpLGEsdSl7Zm9yKHZhciBfPS0xLHc9cy5sZW5ndGgseD0tMSxDPWEubGVuZ3RoLGo9LTEsTD1pLmxlbmd0aCxCPW8ody1DLDApLCQ9QXJyYXkoQitMKSxVPSF1OysrXzxCOykkW19dPXNbX107Zm9yKHZhciBWPV87KytqPEw7KSRbVitqXT1pW2pdO2Zvcig7Kyt4PEM7KShVfHxfPHcpJiYoJFtWK2FbeF1dPXNbXysrXSk7cmV0dXJuICR9fSwyMzAwNyhzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gY29weUFycmF5KHMsbyl7dmFyIGk9LTEsYT1zLmxlbmd0aDtmb3Iob3x8KG89QXJyYXkoYSkpOysraTxhOylvW2ldPXNbaV07cmV0dXJuIG99fSwyMTc5MShzLG8saSl7dmFyIGE9aSgxNjU0NyksdT1pKDQzMzYwKTtzLmV4cG9ydHM9ZnVuY3Rpb24gY29weU9iamVjdChzLG8saSxfKXt2YXIgdz0haTtpfHwoaT17fSk7Zm9yKHZhciB4PS0xLEM9by5sZW5ndGg7Kyt4PEM7KXt2YXIgaj1vW3hdLEw9Xz9fKGlbal0sc1tqXSxqLGkscyk6dm9pZCAwO3ZvaWQgMD09PUwmJihMPXNbal0pLHc/dShpLGosTCk6YShpLGosTCl9cmV0dXJuIGl9fSw5MjI3MShzLG8saSl7dmFyIGE9aSgyMTc5MSksdT1pKDQ2NjQpO3MuZXhwb3J0cz1mdW5jdGlvbiBjb3B5U3ltYm9scyhzLG8pe3JldHVybiBhKHMsdShzKSxvKX19LDQ4OTQ4KHMsbyxpKXt2YXIgYT1pKDIxNzkxKSx1PWkoODYzNzUpO3MuZXhwb3J0cz1mdW5jdGlvbiBjb3B5U3ltYm9sc0luKHMsbyl7cmV0dXJuIGEocyx1KHMpLG8pfX0sNTU0ODEocyxvLGkpe3ZhciBhPWkoOTMyNSlbIl9fY29yZS1qc19zaGFyZWRfXyJdO3MuZXhwb3J0cz1hfSw1ODUyMyhzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gY291bnRIb2xkZXJzKHMsbyl7Zm9yKHZhciBpPXMubGVuZ3RoLGE9MDtpLS07KXNbaV09PT1vJiYrK2E7cmV0dXJuIGF9fSwyMDk5OShzLG8saSl7dmFyIGE9aSg2OTMwMiksdT1pKDM2ODAwKTtzLmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIocyl7cmV0dXJuIGEoKGZ1bmN0aW9uKG8saSl7dmFyIGE9LTEsXz1pLmxlbmd0aCx3PV8+MT9pW18tMV06dm9pZCAwLHg9Xz4yP2lbMl06dm9pZCAwO2Zvcih3PXMubGVuZ3RoPjMmJiJmdW5jdGlvbiI9PXR5cGVvZiB3PyhfLS0sdyk6dm9pZCAwLHgmJnUoaVswXSxpWzFdLHgpJiYodz1fPDM/dm9pZCAwOncsXz0xKSxvPU9iamVjdChvKTsrK2E8Xzspe3ZhciBDPWlbYV07QyYmcyhvLEMsYSx3KX1yZXR1cm4gb30pKX19LDM4MzI5KHMsbyxpKXt2YXIgYT1pKDY0ODk0KTtzLmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2gocyxvKXtyZXR1cm4gZnVuY3Rpb24oaSx1KXtpZihudWxsPT1pKXJldHVybiBpO2lmKCFhKGkpKXJldHVybiBzKGksdSk7Zm9yKHZhciBfPWkubGVuZ3RoLHc9bz9fOi0xLHg9T2JqZWN0KGkpOyhvP3ctLTorK3c8XykmJiExIT09dSh4W3ddLHcseCk7KTtyZXR1cm4gaX19fSw4MzIyMShzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihzKXtyZXR1cm4gZnVuY3Rpb24obyxpLGEpe2Zvcih2YXIgdT0tMSxfPU9iamVjdChvKSx3PWEobykseD13Lmxlbmd0aDt4LS07KXt2YXIgQz13W3M/eDorK3VdO2lmKCExPT09aShfW0NdLEMsXykpYnJlYWt9cmV0dXJuIG99fX0sMTE4NDIocyxvLGkpe3ZhciBhPWkoODI4MTkpLHU9aSg5MzI1KTtzLmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlQmluZChzLG8saSl7dmFyIF89MSZvLHc9YShzKTtyZXR1cm4gZnVuY3Rpb24gd3JhcHBlcigpe3JldHVybih0aGlzJiZ0aGlzIT09dSYmdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXI/dzpzKS5hcHBseShfP2k6dGhpcyxhcmd1bWVudHMpfX19LDEyNTA3KHMsbyxpKXt2YXIgYT1pKDI4NzU0KSx1PWkoNDk2OTgpLF89aSg2MzkxMiksdz1pKDEzMjIyKTtzLmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlQ2FzZUZpcnN0KHMpe3JldHVybiBmdW5jdGlvbihvKXtvPXcobyk7dmFyIGk9dShvKT9fKG8pOnZvaWQgMCx4PWk/aVswXTpvLmNoYXJBdCgwKSxDPWk/YShpLDEpLmpvaW4oIiIpOm8uc2xpY2UoMSk7cmV0dXJuIHhbc10oKStDfX19LDQ1NTM5KHMsbyxpKXt2YXIgYT1pKDQwODgyKSx1PWkoNTA4MjgpLF89aSg2NjY0NSksdz1SZWdFeHAoIlsn4oCZXSIsImciKTtzLmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihzKXtyZXR1cm4gZnVuY3Rpb24obyl7cmV0dXJuIGEoXyh1KG8pLnJlcGxhY2UodywiIikpLHMsIiIpfX19LDgyODE5KHMsbyxpKXt2YXIgYT1pKDM5MzQ0KSx1PWkoMjM4MDUpO3MuZXhwb3J0cz1mdW5jdGlvbiBjcmVhdGVDdG9yKHMpe3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWFyZ3VtZW50cztzd2l0Y2goby5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHM7Y2FzZSAxOnJldHVybiBuZXcgcyhvWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyBzKG9bMF0sb1sxXSk7Y2FzZSAzOnJldHVybiBuZXcgcyhvWzBdLG9bMV0sb1syXSk7Y2FzZSA0OnJldHVybiBuZXcgcyhvWzBdLG9bMV0sb1syXSxvWzNdKTtjYXNlIDU6cmV0dXJuIG5ldyBzKG9bMF0sb1sxXSxvWzJdLG9bM10sb1s0XSk7Y2FzZSA2OnJldHVybiBuZXcgcyhvWzBdLG9bMV0sb1syXSxvWzNdLG9bNF0sb1s1XSk7Y2FzZSA3OnJldHVybiBuZXcgcyhvWzBdLG9bMV0sb1syXSxvWzNdLG9bNF0sb1s1XSxvWzZdKX12YXIgaT1hKHMucHJvdG90eXBlKSxfPXMuYXBwbHkoaSxvKTtyZXR1cm4gdShfKT9fOml9fX0sNzcwNzgocyxvLGkpe3ZhciBhPWkoOTEwMzMpLHU9aSg4MjgxOSksXz1pKDM3NDcxKSx3PWkoMTgwNzMpLHg9aSgxMTI4NyksQz1pKDM2MzA2KSxqPWkoOTMyNSk7cy5leHBvcnRzPWZ1bmN0aW9uIGNyZWF0ZUN1cnJ5KHMsbyxpKXt2YXIgTD11KHMpO3JldHVybiBmdW5jdGlvbiB3cmFwcGVyKCl7Zm9yKHZhciB1PWFyZ3VtZW50cy5sZW5ndGgsQj1BcnJheSh1KSwkPXUsVT14KHdyYXBwZXIpOyQtLTspQlskXT1hcmd1bWVudHNbJF07dmFyIFY9dTwzJiZCWzBdIT09VSYmQlt1LTFdIT09VT9bXTpDKEIsVSk7cmV0dXJuKHUtPVYubGVuZ3RoKTxpP3cocyxvLF8sd3JhcHBlci5wbGFjZWhvbGRlcix2b2lkIDAsQixWLHZvaWQgMCx2b2lkIDAsaS11KTphKHRoaXMmJnRoaXMhPT1qJiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9MOnMsdGhpcyxCKX19fSw2MjAwNihzLG8saSl7dmFyIGE9aSgxNTM4OSksdT1pKDY0ODk0KSxfPWkoOTU5NTApO3MuZXhwb3J0cz1mdW5jdGlvbiBjcmVhdGVGaW5kKHMpe3JldHVybiBmdW5jdGlvbihvLGksdyl7dmFyIHg9T2JqZWN0KG8pO2lmKCF1KG8pKXt2YXIgQz1hKGksMyk7bz1fKG8pLGk9ZnVuY3Rpb24ocyl7cmV0dXJuIEMoeFtzXSxzLHgpfX12YXIgaj1zKG8saSx3KTtyZXR1cm4gaj4tMT94W0M/b1tqXTpqXTp2b2lkIDB9fX0sMzc0NzEocyxvLGkpe3ZhciBhPWkoOTE1OTYpLHU9aSg1MzMyMCksXz1pKDU4NTIzKSx3PWkoODI4MTkpLHg9aSgxODA3MyksQz1pKDExMjg3KSxqPWkoNjgyOTQpLEw9aSgzNjMwNiksQj1pKDkzMjUpO3MuZXhwb3J0cz1mdW5jdGlvbiBjcmVhdGVIeWJyaWQocyxvLGksJCxVLFYseixZLFosZWUpe3ZhciBpZT0xMjgmbyxhZT0xJm8sY2U9MiZvLGxlPTI0Jm8scGU9NTEyJm8sZGU9Y2U/dm9pZCAwOncocyk7cmV0dXJuIGZ1bmN0aW9uIHdyYXBwZXIoKXtmb3IodmFyIGZlPWFyZ3VtZW50cy5sZW5ndGgseWU9QXJyYXkoZmUpLGJlPWZlO2JlLS07KXllW2JlXT1hcmd1bWVudHNbYmVdO2lmKGxlKXZhciBTZT1DKHdyYXBwZXIpLF9lPV8oeWUsU2UpO2lmKCQmJih5ZT1hKHllLCQsVSxsZSkpLFYmJih5ZT11KHllLFYseixsZSkpLGZlLT1fZSxsZSYmZmU8ZWUpe3ZhciB3ZT1MKHllLFNlKTtyZXR1cm4geChzLG8sY3JlYXRlSHlicmlkLHdyYXBwZXIucGxhY2Vob2xkZXIsaSx5ZSx3ZSxZLFosZWUtZmUpfXZhciB4ZT1hZT9pOnRoaXMsUGU9Y2U/eGVbc106cztyZXR1cm4gZmU9eWUubGVuZ3RoLFk/eWU9aih5ZSxZKTpwZSYmZmU+MSYmeWUucmV2ZXJzZSgpLGllJiZaPGZlJiYoeWUubGVuZ3RoPVopLHRoaXMmJnRoaXMhPT1CJiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlciYmKFBlPWRlfHx3KFBlKSksUGUuYXBwbHkoeGUseWUpfX19LDI0MTY4KHMsbyxpKXt2YXIgYT1pKDkxMDMzKSx1PWkoODI4MTkpLF89aSg5MzI1KTtzLmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlUGFydGlhbChzLG8saSx3KXt2YXIgeD0xJm8sQz11KHMpO3JldHVybiBmdW5jdGlvbiB3cmFwcGVyKCl7Zm9yKHZhciBvPS0xLHU9YXJndW1lbnRzLmxlbmd0aCxqPS0xLEw9dy5sZW5ndGgsQj1BcnJheShMK3UpLCQ9dGhpcyYmdGhpcyE9PV8mJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyP0M6czsrK2o8TDspQltqXT13W2pdO2Zvcig7dS0tOylCW2orK109YXJndW1lbnRzWysrb107cmV0dXJuIGEoJCx4P2k6dGhpcyxCKX19fSwxODA3MyhzLG8saSl7dmFyIGE9aSg4NTA4NyksdT1pKDU0NjQxKSxfPWkoNzA5ODEpO3MuZXhwb3J0cz1mdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KHMsbyxpLHcseCxDLGosTCxCLCQpe3ZhciBVPTgmbztvfD1VPzMyOjY0LDQmKG8mPX4oVT82NDozMikpfHwobyY9LTQpO3ZhciBWPVtzLG8seCxVP0M6dm9pZCAwLFU/ajp2b2lkIDAsVT92b2lkIDA6QyxVP3ZvaWQgMDpqLEwsQiwkXSx6PWkuYXBwbHkodm9pZCAwLFYpO3JldHVybiBhKHMpJiZ1KHosViksei5wbGFjZWhvbGRlcj13LF8oeixzLG8pfX0sNjY5NzcocyxvLGkpe3ZhciBhPWkoNjg4ODIpLHU9aSgxMTg0MiksXz1pKDc3MDc4KSx3PWkoMzc0NzEpLHg9aSgyNDE2OCksQz1pKDM3MzgxKSxqPWkoMzIwOSksTD1pKDU0NjQxKSxCPWkoNzA5ODEpLCQ9aSg2MTQ4OSksVT1NYXRoLm1heDtzLmV4cG9ydHM9ZnVuY3Rpb24gY3JlYXRlV3JhcChzLG8saSxWLHosWSxaLGVlKXt2YXIgaWU9MiZvO2lmKCFpZSYmImZ1bmN0aW9uIiE9dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciBhZT1WP1YubGVuZ3RoOjA7aWYoYWV8fChvJj0tOTcsVj16PXZvaWQgMCksWj12b2lkIDA9PT1aP1o6VSgkKFopLDApLGVlPXZvaWQgMD09PWVlP2VlOiQoZWUpLGFlLT16P3oubGVuZ3RoOjAsNjQmbyl7dmFyIGNlPVYsbGU9ejtWPXo9dm9pZCAwfXZhciBwZT1pZT92b2lkIDA6QyhzKSxkZT1bcyxvLGksVix6LGNlLGxlLFksWixlZV07aWYocGUmJmooZGUscGUpLHM9ZGVbMF0sbz1kZVsxXSxpPWRlWzJdLFY9ZGVbM10sej1kZVs0XSwhKGVlPWRlWzldPXZvaWQgMD09PWRlWzldP2llPzA6cy5sZW5ndGg6VShkZVs5XS1hZSwwKSkmJjI0Jm8mJihvJj0tMjUpLG8mJjEhPW8pZmU9OD09b3x8MTY9PW8/XyhzLG8sZWUpOjMyIT1vJiYzMyE9b3x8ei5sZW5ndGg/dy5hcHBseSh2b2lkIDAsZGUpOngocyxvLGksVik7ZWxzZSB2YXIgZmU9dShzLG8saSk7cmV0dXJuIEIoKHBlP2E6TCkoZmUsZGUpLHMsbyl9fSw1MzEzOChzLG8saSl7dmFyIGE9aSgxMTMzMSk7cy5leHBvcnRzPWZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZShzKXtyZXR1cm4gYShzKT92b2lkIDA6c319LDI0NjQ3KHMsbyxpKXt2YXIgYT1pKDU0NTUyKSh7w4A6IkEiLMOBOiJBIizDgjoiQSIsw4M6IkEiLMOEOiJBIizDhToiQSIsw6A6ImEiLMOhOiJhIizDojoiYSIsw6M6ImEiLMOkOiJhIizDpToiYSIsw4c6IkMiLMOnOiJjIizDkDoiRCIsw7A6ImQiLMOIOiJFIizDiToiRSIsw4o6IkUiLMOLOiJFIizDqDoiZSIsw6k6ImUiLMOqOiJlIizDqzoiZSIsw4w6IkkiLMONOiJJIizDjjoiSSIsw486IkkiLMOsOiJpIizDrToiaSIsw646ImkiLMOvOiJpIizDkToiTiIsw7E6Im4iLMOSOiJPIizDkzoiTyIsw5Q6Ik8iLMOVOiJPIizDljoiTyIsw5g6Ik8iLMOyOiJvIizDszoibyIsw7Q6Im8iLMO1OiJvIizDtjoibyIsw7g6Im8iLMOZOiJVIizDmjoiVSIsw5s6IlUiLMOcOiJVIizDuToidSIsw7o6InUiLMO7OiJ1IizDvDoidSIsw506IlkiLMO9OiJ5IizDvzoieSIsw4Y6IkFlIizDpjoiYWUiLMOeOiJUaCIsw746InRoIizDnzoic3MiLMSAOiJBIizEgjoiQSIsxIQ6IkEiLMSBOiJhIizEgzoiYSIsxIU6ImEiLMSGOiJDIizEiDoiQyIsxIo6IkMiLMSMOiJDIizEhzoiYyIsxIk6ImMiLMSLOiJjIizEjToiYyIsxI46IkQiLMSQOiJEIizEjzoiZCIsxJE6ImQiLMSSOiJFIizElDoiRSIsxJY6IkUiLMSYOiJFIizEmjoiRSIsxJM6ImUiLMSVOiJlIizElzoiZSIsxJk6ImUiLMSbOiJlIizEnDoiRyIsxJ46IkciLMSgOiJHIizEojoiRyIsxJ06ImciLMSfOiJnIizEoToiZyIsxKM6ImciLMSkOiJIIizEpjoiSCIsxKU6ImgiLMSnOiJoIizEqDoiSSIsxKo6IkkiLMSsOiJJIizErjoiSSIsxLA6IkkiLMSpOiJpIizEqzoiaSIsxK06ImkiLMSvOiJpIizEsToiaSIsxLQ6IkoiLMS1OiJqIizEtjoiSyIsxLc6ImsiLMS4OiJrIizEuToiTCIsxLs6IkwiLMS9OiJMIizEvzoiTCIsxYE6IkwiLMS6OiJsIizEvDoibCIsxL46ImwiLMWAOiJsIizFgjoibCIsxYM6Ik4iLMWFOiJOIizFhzoiTiIsxYo6Ik4iLMWEOiJuIizFhjoibiIsxYg6Im4iLMWLOiJuIizFjDoiTyIsxY46Ik8iLMWQOiJPIizFjToibyIsxY86Im8iLMWROiJvIizFlDoiUiIsxZY6IlIiLMWYOiJSIizFlToiciIsxZc6InIiLMWZOiJyIizFmjoiUyIsxZw6IlMiLMWeOiJTIizFoDoiUyIsxZs6InMiLMWdOiJzIizFnzoicyIsxaE6InMiLMWiOiJUIizFpDoiVCIsxaY6IlQiLMWjOiJ0IizFpToidCIsxac6InQiLMWoOiJVIizFqjoiVSIsxaw6IlUiLMWuOiJVIizFsDoiVSIsxbI6IlUiLMWpOiJ1IizFqzoidSIsxa06InUiLMWvOiJ1IizFsToidSIsxbM6InUiLMW0OiJXIizFtToidyIsxbY6IlkiLMW3OiJ5IizFuDoiWSIsxbk6IloiLMW7OiJaIizFvToiWiIsxbo6InoiLMW8OiJ6IizFvjoieiIsxLI6IklKIizEszoiaWoiLMWSOiJPZSIsxZM6Im9lIizFiToiJ24iLMW/OiJzIn0pO3MuZXhwb3J0cz1hfSw5MzI0MyhzLG8saSl7dmFyIGE9aSg1NjExMCksdT1mdW5jdGlvbigpe3RyeXt2YXIgcz1hKE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gcyh7fSwiIix7fSksc31jYXRjaChzKXt9fSgpO3MuZXhwb3J0cz11fSwyNTkxMShzLG8saSl7dmFyIGE9aSgzODg1OSksdT1pKDE0MjQ4KSxfPWkoMTkyMTkpO3MuZXhwb3J0cz1mdW5jdGlvbiBlcXVhbEFycmF5cyhzLG8saSx3LHgsQyl7dmFyIGo9MSZpLEw9cy5sZW5ndGgsQj1vLmxlbmd0aDtpZihMIT1CJiYhKGomJkI+TCkpcmV0dXJuITE7dmFyICQ9Qy5nZXQocyksVT1DLmdldChvKTtpZigkJiZVKXJldHVybiAkPT1vJiZVPT1zO3ZhciBWPS0xLHo9ITAsWT0yJmk/bmV3IGE6dm9pZCAwO2ZvcihDLnNldChzLG8pLEMuc2V0KG8scyk7KytWPEw7KXt2YXIgWj1zW1ZdLGVlPW9bVl07aWYodyl2YXIgaWU9aj93KGVlLFosVixvLHMsQyk6dyhaLGVlLFYscyxvLEMpO2lmKHZvaWQgMCE9PWllKXtpZihpZSljb250aW51ZTt6PSExO2JyZWFrfWlmKFkpe2lmKCF1KG8sKGZ1bmN0aW9uKHMsbyl7aWYoIV8oWSxvKSYmKFo9PT1zfHx4KFoscyxpLHcsQykpKXJldHVybiBZLnB1c2gobyl9KSkpe3o9ITE7YnJlYWt9fWVsc2UgaWYoWiE9PWVlJiYheChaLGVlLGksdyxDKSl7ej0hMTticmVha319cmV0dXJuIEMuZGVsZXRlKHMpLEMuZGVsZXRlKG8pLHp9fSwyMTk4NihzLG8saSl7dmFyIGE9aSg1MTg3MyksdT1pKDM3ODI4KSxfPWkoNzUyODgpLHc9aSgyNTkxMSkseD1pKDIwMzE3KSxDPWkoODQyNDcpLGo9YT9hLnByb3RvdHlwZTp2b2lkIDAsTD1qP2oudmFsdWVPZjp2b2lkIDA7cy5leHBvcnRzPWZ1bmN0aW9uIGVxdWFsQnlUYWcocyxvLGksYSxqLEIsJCl7c3dpdGNoKGkpe2Nhc2UiW29iamVjdCBEYXRhVmlld10iOmlmKHMuYnl0ZUxlbmd0aCE9by5ieXRlTGVuZ3RofHxzLmJ5dGVPZmZzZXQhPW8uYnl0ZU9mZnNldClyZXR1cm4hMTtzPXMuYnVmZmVyLG89by5idWZmZXI7Y2FzZSJbb2JqZWN0IEFycmF5QnVmZmVyXSI6cmV0dXJuIShzLmJ5dGVMZW5ndGghPW8uYnl0ZUxlbmd0aHx8IUIobmV3IHUocyksbmV3IHUobykpKTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOmNhc2UiW29iamVjdCBEYXRlXSI6Y2FzZSJbb2JqZWN0IE51bWJlcl0iOnJldHVybiBfKCtzLCtvKTtjYXNlIltvYmplY3QgRXJyb3JdIjpyZXR1cm4gcy5uYW1lPT1vLm5hbWUmJnMubWVzc2FnZT09by5tZXNzYWdlO2Nhc2UiW29iamVjdCBSZWdFeHBdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIHM9PW8rIiI7Y2FzZSJbb2JqZWN0IE1hcF0iOnZhciBVPXg7Y2FzZSJbb2JqZWN0IFNldF0iOnZhciBWPTEmYTtpZihVfHwoVT1DKSxzLnNpemUhPW8uc2l6ZSYmIVYpcmV0dXJuITE7dmFyIHo9JC5nZXQocyk7aWYoeilyZXR1cm4gej09bzthfD0yLCQuc2V0KHMsbyk7dmFyIFk9dyhVKHMpLFUobyksYSxqLEIsJCk7cmV0dXJuICQuZGVsZXRlKHMpLFk7Y2FzZSJbb2JqZWN0IFN5bWJvbF0iOmlmKEwpcmV0dXJuIEwuY2FsbChzKT09TC5jYWxsKG8pfXJldHVybiExfX0sNTA2ODkocyxvLGkpe3ZhciBhPWkoNTAwMDIpLHU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtzLmV4cG9ydHM9ZnVuY3Rpb24gZXF1YWxPYmplY3RzKHMsbyxpLF8sdyx4KXt2YXIgQz0xJmksaj1hKHMpLEw9ai5sZW5ndGg7aWYoTCE9YShvKS5sZW5ndGgmJiFDKXJldHVybiExO2Zvcih2YXIgQj1MO0ItLTspe3ZhciAkPWpbQl07aWYoIShDPyQgaW4gbzp1LmNhbGwobywkKSkpcmV0dXJuITF9dmFyIFU9eC5nZXQocyksVj14LmdldChvKTtpZihVJiZWKXJldHVybiBVPT1vJiZWPT1zO3ZhciB6PSEwO3guc2V0KHMsbykseC5zZXQobyxzKTtmb3IodmFyIFk9QzsrK0I8TDspe3ZhciBaPXNbJD1qW0JdXSxlZT1vWyRdO2lmKF8pdmFyIGllPUM/XyhlZSxaLCQsbyxzLHgpOl8oWixlZSwkLHMsbyx4KTtpZighKHZvaWQgMD09PWllP1o9PT1lZXx8dyhaLGVlLGksXyx4KTppZSkpe3o9ITE7YnJlYWt9WXx8KFk9ImNvbnN0cnVjdG9yIj09JCl9aWYoeiYmIVkpe3ZhciBhZT1zLmNvbnN0cnVjdG9yLGNlPW8uY29uc3RydWN0b3I7YWU9PWNlfHwhKCJjb25zdHJ1Y3RvciJpbiBzKXx8ISgiY29uc3RydWN0b3IiaW4gbyl8fCJmdW5jdGlvbiI9PXR5cGVvZiBhZSYmYWUgaW5zdGFuY2VvZiBhZSYmImZ1bmN0aW9uIj09dHlwZW9mIGNlJiZjZSBpbnN0YW5jZW9mIGNlfHwoej0hMSl9cmV0dXJuIHguZGVsZXRlKHMpLHguZGVsZXRlKG8pLHp9fSwzODgxNihzLG8saSl7dmFyIGE9aSgzNTk3MCksdT1pKDU2NzU3KSxfPWkoMzI4NjUpO3MuZXhwb3J0cz1mdW5jdGlvbiBmbGF0UmVzdChzKXtyZXR1cm4gXyh1KHMsdm9pZCAwLGEpLHMrIiIpfX0sMzQ4NDAocyxvLGkpe3ZhciBhPSJvYmplY3QiPT10eXBlb2YgaS5nJiZpLmcmJmkuZy5PYmplY3Q9PT1PYmplY3QmJmkuZztzLmV4cG9ydHM9YX0sNTAwMDIocyxvLGkpe3ZhciBhPWkoODIxOTkpLHU9aSg0NjY0KSxfPWkoOTU5NTApO3MuZXhwb3J0cz1mdW5jdGlvbiBnZXRBbGxLZXlzKHMpe3JldHVybiBhKHMsXyx1KX19LDgzMzQ5KHMsbyxpKXt2YXIgYT1pKDgyMTk5KSx1PWkoODYzNzUpLF89aSgzNzI0MSk7cy5leHBvcnRzPWZ1bmN0aW9uIGdldEFsbEtleXNJbihzKXtyZXR1cm4gYShzLF8sdSl9fSwzNzM4MShzLG8saSl7dmFyIGE9aSg0ODE1MiksdT1pKDYzOTUwKSxfPWE/ZnVuY3Rpb24ocyl7cmV0dXJuIGEuZ2V0KHMpfTp1O3MuZXhwb3J0cz1ffSw2MjI4NChzLG8saSl7dmFyIGE9aSg4NDYyOSksdT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3MuZXhwb3J0cz1mdW5jdGlvbiBnZXRGdW5jTmFtZShzKXtmb3IodmFyIG89cy5uYW1lKyIiLGk9YVtvXSxfPXUuY2FsbChhLG8pP2kubGVuZ3RoOjA7Xy0tOyl7dmFyIHc9aVtfXSx4PXcuZnVuYztpZihudWxsPT14fHx4PT1zKXJldHVybiB3Lm5hbWV9cmV0dXJuIG99fSwxMTI4NyhzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gZ2V0SG9sZGVyKHMpe3JldHVybiBzLnBsYWNlaG9sZGVyfX0sMTI2NTEocyxvLGkpe3ZhciBhPWkoNzQyMTgpO3MuZXhwb3J0cz1mdW5jdGlvbiBnZXRNYXBEYXRhKHMsbyl7dmFyIGk9cy5fX2RhdGFfXztyZXR1cm4gYShvKT9pWyJzdHJpbmciPT10eXBlb2Ygbz8ic3RyaW5nIjoiaGFzaCJdOmkubWFwfX0sMTA3NzYocyxvLGkpe3ZhciBhPWkoMzA3NTYpLHU9aSg5NTk1MCk7cy5leHBvcnRzPWZ1bmN0aW9uIGdldE1hdGNoRGF0YShzKXtmb3IodmFyIG89dShzKSxpPW8ubGVuZ3RoO2ktLTspe3ZhciBfPW9baV0sdz1zW19dO29baV09W18sdyxhKHcpXX1yZXR1cm4gb319LDU2MTEwKHMsbyxpKXt2YXIgYT1pKDQ1MDgzKSx1PWkoMTAzOTIpO3MuZXhwb3J0cz1mdW5jdGlvbiBnZXROYXRpdmUocyxvKXt2YXIgaT11KHMsbyk7cmV0dXJuIGEoaSk/aTp2b2lkIDB9fSwyODg3OShzLG8saSl7dmFyIGE9aSg3NDMzNSkoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCk7cy5leHBvcnRzPWF9LDY1OShzLG8saSl7dmFyIGE9aSg1MTg3MyksdT1PYmplY3QucHJvdG90eXBlLF89dS5oYXNPd25Qcm9wZXJ0eSx3PXUudG9TdHJpbmcseD1hP2EudG9TdHJpbmdUYWc6dm9pZCAwO3MuZXhwb3J0cz1mdW5jdGlvbiBnZXRSYXdUYWcocyl7dmFyIG89Xy5jYWxsKHMseCksaT1zW3hdO3RyeXtzW3hdPXZvaWQgMDt2YXIgYT0hMH1jYXRjaChzKXt9dmFyIHU9dy5jYWxsKHMpO3JldHVybiBhJiYobz9zW3hdPWk6ZGVsZXRlIHNbeF0pLHV9fSw0NjY0KHMsbyxpKXt2YXIgYT1pKDc5NzcwKSx1PWkoNjMzNDUpLF89T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSx3PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMseD13P2Z1bmN0aW9uKHMpe3JldHVybiBudWxsPT1zP1tdOihzPU9iamVjdChzKSxhKHcocyksKGZ1bmN0aW9uKG8pe3JldHVybiBfLmNhbGwocyxvKX0pKSl9OnU7cy5leHBvcnRzPXh9LDg2Mzc1KHMsbyxpKXt2YXIgYT1pKDE0NTI4KSx1PWkoMjg4NzkpLF89aSg0NjY0KSx3PWkoNjMzNDUpLHg9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9mdW5jdGlvbihzKXtmb3IodmFyIG89W107czspYShvLF8ocykpLHM9dShzKTtyZXR1cm4gb306dztzLmV4cG9ydHM9eH0sNTg2MShzLG8saSl7dmFyIGE9aSg1NTU4MCksdT1pKDY4MjIzKSxfPWkoMzI4MDQpLHc9aSg3NjU0NSkseD1pKDI4MzAzKSxDPWkoNzI1NTIpLGo9aSg0NzQ3MyksTD0iW29iamVjdCBNYXBdIixCPSJbb2JqZWN0IFByb21pc2VdIiwkPSJbb2JqZWN0IFNldF0iLFU9IltvYmplY3QgV2Vha01hcF0iLFY9IltvYmplY3QgRGF0YVZpZXddIix6PWooYSksWT1qKHUpLFo9aihfKSxlZT1qKHcpLGllPWooeCksYWU9QzsoYSYmYWUobmV3IGEobmV3IEFycmF5QnVmZmVyKDEpKSkhPVZ8fHUmJmFlKG5ldyB1KSE9THx8XyYmYWUoXy5yZXNvbHZlKCkpIT1CfHx3JiZhZShuZXcgdykhPSR8fHgmJmFlKG5ldyB4KSE9VSkmJihhZT1mdW5jdGlvbihzKXt2YXIgbz1DKHMpLGk9IltvYmplY3QgT2JqZWN0XSI9PW8/cy5jb25zdHJ1Y3Rvcjp2b2lkIDAsYT1pP2ooaSk6IiI7aWYoYSlzd2l0Y2goYSl7Y2FzZSB6OnJldHVybiBWO2Nhc2UgWTpyZXR1cm4gTDtjYXNlIFo6cmV0dXJuIEI7Y2FzZSBlZTpyZXR1cm4gJDtjYXNlIGllOnJldHVybiBVfXJldHVybiBvfSkscy5leHBvcnRzPWFlfSwxMDM5MihzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gZ2V0VmFsdWUocyxvKXtyZXR1cm4gbnVsbD09cz92b2lkIDA6c1tvXX19LDc1MjUxKHMpe3ZhciBvPS9ce1xuXC9cKiBcW3dyYXBwZWQgd2l0aCAoLispXF0gXCovLGk9Lyw/ICYgLztzLmV4cG9ydHM9ZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMocyl7dmFyIGE9cy5tYXRjaChvKTtyZXR1cm4gYT9hWzFdLnNwbGl0KGkpOltdfX0sNDkzMjYocyxvLGkpe3ZhciBhPWkoMzE3NjkpLHU9aSg3MjQyOCksXz1pKDU2NDQ5KSx3PWkoMzAzNjEpLHg9aSgzMDI5NCksQz1pKDc3Nzk3KTtzLmV4cG9ydHM9ZnVuY3Rpb24gaGFzUGF0aChzLG8saSl7Zm9yKHZhciBqPS0xLEw9KG89YShvLHMpKS5sZW5ndGgsQj0hMTsrK2o8TDspe3ZhciAkPUMob1tqXSk7aWYoIShCPW51bGwhPXMmJmkocywkKSkpYnJlYWs7cz1zWyRdfXJldHVybiBCfHwrK2ohPUw/QjohIShMPW51bGw9PXM/MDpzLmxlbmd0aCkmJngoTCkmJncoJCxMKSYmKF8ocyl8fHUocykpfX0sNDk2OTgocyl7dmFyIG89UmVnRXhwKCJbXFx1MjAwZFxcdWQ4MDAtXFx1ZGZmZlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZlxcdWZlMGVcXHVmZTBmXSIpO3MuZXhwb3J0cz1mdW5jdGlvbiBoYXNVbmljb2RlKHMpe3JldHVybiBvLnRlc3Qocyl9fSw0NTQzNChzKXt2YXIgbz0vW2Etel1bQS1aXXxbQS1aXXsyfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLztzLmV4cG9ydHM9ZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQocyl7cmV0dXJuIG8udGVzdChzKX19LDIyMDMyKHMsbyxpKXt2YXIgYT1pKDgxMDQyKTtzLmV4cG9ydHM9ZnVuY3Rpb24gaGFzaENsZWFyKCl7dGhpcy5fX2RhdGFfXz1hP2EobnVsbCk6e30sdGhpcy5zaXplPTB9fSw2Mzg2MihzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gaGFzaERlbGV0ZShzKXt2YXIgbz10aGlzLmhhcyhzKSYmZGVsZXRlIHRoaXMuX19kYXRhX19bc107cmV0dXJuIHRoaXMuc2l6ZS09bz8xOjAsb319LDY2NzIxKHMsbyxpKXt2YXIgYT1pKDgxMDQyKSx1PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7cy5leHBvcnRzPWZ1bmN0aW9uIGhhc2hHZXQocyl7dmFyIG89dGhpcy5fX2RhdGFfXztpZihhKXt2YXIgaT1vW3NdO3JldHVybiJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIj09PWk/dm9pZCAwOml9cmV0dXJuIHUuY2FsbChvLHMpP29bc106dm9pZCAwfX0sMTI3NDkocyxvLGkpe3ZhciBhPWkoODEwNDIpLHU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtzLmV4cG9ydHM9ZnVuY3Rpb24gaGFzaEhhcyhzKXt2YXIgbz10aGlzLl9fZGF0YV9fO3JldHVybiBhP3ZvaWQgMCE9PW9bc106dS5jYWxsKG8scyl9fSwzNTc0OShzLG8saSl7dmFyIGE9aSg4MTA0Mik7cy5leHBvcnRzPWZ1bmN0aW9uIGhhc2hTZXQocyxvKXt2YXIgaT10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHMpPzA6MSxpW3NdPWEmJnZvaWQgMD09PW8/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOm8sdGhpc319LDc2MTg5KHMpe3ZhciBvPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7cy5leHBvcnRzPWZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KHMpe3ZhciBpPXMubGVuZ3RoLGE9bmV3IHMuY29uc3RydWN0b3IoaSk7cmV0dXJuIGkmJiJzdHJpbmciPT10eXBlb2Ygc1swXSYmby5jYWxsKHMsImluZGV4IikmJihhLmluZGV4PXMuaW5kZXgsYS5pbnB1dD1zLmlucHV0KSxhfX0sNzcxOTkocyxvLGkpe3ZhciBhPWkoNDk2NTMpLHU9aSg3NjE2OSksXz1pKDczMjAxKSx3PWkoOTM3MzYpLHg9aSg3MTk2MSk7cy5leHBvcnRzPWZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKHMsbyxpKXt2YXIgQz1zLmNvbnN0cnVjdG9yO3N3aXRjaChvKXtjYXNlIltvYmplY3QgQXJyYXlCdWZmZXJdIjpyZXR1cm4gYShzKTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOmNhc2UiW29iamVjdCBEYXRlXSI6cmV0dXJuIG5ldyBDKCtzKTtjYXNlIltvYmplY3QgRGF0YVZpZXddIjpyZXR1cm4gdShzLGkpO2Nhc2UiW29iamVjdCBGbG9hdDMyQXJyYXldIjpjYXNlIltvYmplY3QgRmxvYXQ2NEFycmF5XSI6Y2FzZSJbb2JqZWN0IEludDhBcnJheV0iOmNhc2UiW29iamVjdCBJbnQxNkFycmF5XSI6Y2FzZSJbb2JqZWN0IEludDMyQXJyYXldIjpjYXNlIltvYmplY3QgVWludDhBcnJheV0iOmNhc2UiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iOmNhc2UiW29iamVjdCBVaW50MTZBcnJheV0iOmNhc2UiW29iamVjdCBVaW50MzJBcnJheV0iOnJldHVybiB4KHMsaSk7Y2FzZSJbb2JqZWN0IE1hcF0iOmNhc2UiW29iamVjdCBTZXRdIjpyZXR1cm4gbmV3IEM7Y2FzZSJbb2JqZWN0IE51bWJlcl0iOmNhc2UiW29iamVjdCBTdHJpbmddIjpyZXR1cm4gbmV3IEMocyk7Y2FzZSJbb2JqZWN0IFJlZ0V4cF0iOnJldHVybiBfKHMpO2Nhc2UiW29iamVjdCBTeW1ib2xdIjpyZXR1cm4gdyhzKX19fSwzNTUyOShzLG8saSl7dmFyIGE9aSgzOTM0NCksdT1pKDI4ODc5KSxfPWkoNTU1MjcpO3MuZXhwb3J0cz1mdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qocyl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHMuY29uc3RydWN0b3J8fF8ocyk/e306YSh1KHMpKX19LDYyMDYwKHMpe3ZhciBvPS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy87cy5leHBvcnRzPWZ1bmN0aW9uIGluc2VydFdyYXBEZXRhaWxzKHMsaSl7dmFyIGE9aS5sZW5ndGg7aWYoIWEpcmV0dXJuIHM7dmFyIHU9YS0xO3JldHVybiBpW3VdPShhPjE/IiYgIjoiIikraVt1XSxpPWkuam9pbihhPjI/IiwgIjoiICIpLHMucmVwbGFjZShvLCJ7XG4vKiBbd3JhcHBlZCB3aXRoICIraSsiXSAqL1xuIil9fSw0NTg5MShzLG8saSl7dmFyIGE9aSg1MTg3MyksdT1pKDcyNDI4KSxfPWkoNTY0NDkpLHc9YT9hLmlzQ29uY2F0U3ByZWFkYWJsZTp2b2lkIDA7cy5leHBvcnRzPWZ1bmN0aW9uIGlzRmxhdHRlbmFibGUocyl7cmV0dXJuIF8ocyl8fHUocyl8fCEhKHcmJnMmJnNbd10pfX0sMzAzNjEocyl7dmFyIG89L14oPzowfFsxLTldXGQqKSQvO3MuZXhwb3J0cz1mdW5jdGlvbiBpc0luZGV4KHMsaSl7dmFyIGE9dHlwZW9mIHM7cmV0dXJuISEoaT1udWxsPT1pPzkwMDcxOTkyNTQ3NDA5OTE6aSkmJigibnVtYmVyIj09YXx8InN5bWJvbCIhPWEmJm8udGVzdChzKSkmJnM+LTEmJnMlMT09MCYmczxpfX0sMzY4MDAocyxvLGkpe3ZhciBhPWkoNzUyODgpLHU9aSg2NDg5NCksXz1pKDMwMzYxKSx3PWkoMjM4MDUpO3MuZXhwb3J0cz1mdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbChzLG8saSl7aWYoIXcoaSkpcmV0dXJuITE7dmFyIHg9dHlwZW9mIG87cmV0dXJuISEoIm51bWJlciI9PXg/dShpKSYmXyhvLGkubGVuZ3RoKToic3RyaW5nIj09eCYmbyBpbiBpKSYmYShpW29dLHMpfX0sMjg1ODYocyxvLGkpe3ZhciBhPWkoNTY0NDkpLHU9aSg0NDM5NCksXz0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyx3PS9eXHcqJC87cy5leHBvcnRzPWZ1bmN0aW9uIGlzS2V5KHMsbyl7aWYoYShzKSlyZXR1cm4hMTt2YXIgaT10eXBlb2YgcztyZXR1cm4hKCJudW1iZXIiIT1pJiYic3ltYm9sIiE9aSYmImJvb2xlYW4iIT1pJiZudWxsIT1zJiYhdShzKSl8fCh3LnRlc3Qocyl8fCFfLnRlc3Qocyl8fG51bGwhPW8mJnMgaW4gT2JqZWN0KG8pKX19LDc0MjE4KHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBpc0tleWFibGUocyl7dmFyIG89dHlwZW9mIHM7cmV0dXJuInN0cmluZyI9PW98fCJudW1iZXIiPT1vfHwic3ltYm9sIj09b3x8ImJvb2xlYW4iPT1vPyJfX3Byb3RvX18iIT09czpudWxsPT09c319LDg1MDg3KHMsbyxpKXt2YXIgYT1pKDMwOTgwKSx1PWkoMzczODEpLF89aSg2MjI4NCksdz1pKDUzNzU4KTtzLmV4cG9ydHM9ZnVuY3Rpb24gaXNMYXppYWJsZShzKXt2YXIgbz1fKHMpLGk9d1tvXTtpZigiZnVuY3Rpb24iIT10eXBlb2YgaXx8IShvIGluIGEucHJvdG90eXBlKSlyZXR1cm4hMTtpZihzPT09aSlyZXR1cm4hMDt2YXIgeD11KGkpO3JldHVybiEheCYmcz09PXhbMF19fSw4NzI5NihzLG8saSl7dmFyIGEsdT1pKDU1NDgxKSxfPShhPS9bXi5dKyQvLmV4ZWModSYmdS5rZXlzJiZ1LmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIithOiIiO3MuZXhwb3J0cz1mdW5jdGlvbiBpc01hc2tlZChzKXtyZXR1cm4hIV8mJl8gaW4gc319LDU1NTI3KHMpe3ZhciBvPU9iamVjdC5wcm90b3R5cGU7cy5leHBvcnRzPWZ1bmN0aW9uIGlzUHJvdG90eXBlKHMpe3ZhciBpPXMmJnMuY29uc3RydWN0b3I7cmV0dXJuIHM9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGkmJmkucHJvdG90eXBlfHxvKX19LDMwNzU2KHMsbyxpKXt2YXIgYT1pKDIzODA1KTtzLmV4cG9ydHM9ZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHMpe3JldHVybiBzPT1zJiYhYShzKX19LDYzNzAyKHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9fSw3MDA4MChzLG8saSl7dmFyIGE9aSgyNjAyNSksdT1BcnJheS5wcm90b3R5cGUuc3BsaWNlO3MuZXhwb3J0cz1mdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUocyl7dmFyIG89dGhpcy5fX2RhdGFfXyxpPWEobyxzKTtyZXR1cm4hKGk8MCkmJihpPT1vLmxlbmd0aC0xP28ucG9wKCk6dS5jYWxsKG8saSwxKSwtLXRoaXMuc2l6ZSwhMCl9fSwyNDczOShzLG8saSl7dmFyIGE9aSgyNjAyNSk7cy5leHBvcnRzPWZ1bmN0aW9uIGxpc3RDYWNoZUdldChzKXt2YXIgbz10aGlzLl9fZGF0YV9fLGk9YShvLHMpO3JldHVybiBpPDA/dm9pZCAwOm9baV1bMV19fSw0ODY1NShzLG8saSl7dmFyIGE9aSgyNjAyNSk7cy5leHBvcnRzPWZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhzKXtyZXR1cm4gYSh0aGlzLl9fZGF0YV9fLHMpPi0xfX0sMzExNzUocyxvLGkpe3ZhciBhPWkoMjYwMjUpO3MuZXhwb3J0cz1mdW5jdGlvbiBsaXN0Q2FjaGVTZXQocyxvKXt2YXIgaT10aGlzLl9fZGF0YV9fLHU9YShpLHMpO3JldHVybiB1PDA/KCsrdGhpcy5zaXplLGkucHVzaChbcyxvXSkpOmlbdV1bMV09byx0aGlzfX0sNjMwNDAocyxvLGkpe3ZhciBhPWkoMjE1NDkpLHU9aSg4MDA3OSksXz1pKDY4MjIzKTtzLmV4cG9ydHM9ZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGEsbWFwOm5ldyhffHx1KSxzdHJpbmc6bmV3IGF9fX0sMTc2NzAocyxvLGkpe3ZhciBhPWkoMTI2NTEpO3MuZXhwb3J0cz1mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShzKXt2YXIgbz1hKHRoaXMscykuZGVsZXRlKHMpO3JldHVybiB0aGlzLnNpemUtPW8/MTowLG99fSw5MDI4OShzLG8saSl7dmFyIGE9aSgxMjY1MSk7cy5leHBvcnRzPWZ1bmN0aW9uIG1hcENhY2hlR2V0KHMpe3JldHVybiBhKHRoaXMscykuZ2V0KHMpfX0sNDUwOShzLG8saSl7dmFyIGE9aSgxMjY1MSk7cy5leHBvcnRzPWZ1bmN0aW9uIG1hcENhY2hlSGFzKHMpe3JldHVybiBhKHRoaXMscykuaGFzKHMpfX0sNzI5NDkocyxvLGkpe3ZhciBhPWkoMTI2NTEpO3MuZXhwb3J0cz1mdW5jdGlvbiBtYXBDYWNoZVNldChzLG8pe3ZhciBpPWEodGhpcyxzKSx1PWkuc2l6ZTtyZXR1cm4gaS5zZXQocyxvKSx0aGlzLnNpemUrPWkuc2l6ZT09dT8wOjEsdGhpc319LDIwMzE3KHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBtYXBUb0FycmF5KHMpe3ZhciBvPS0xLGk9QXJyYXkocy5zaXplKTtyZXR1cm4gcy5mb3JFYWNoKChmdW5jdGlvbihzLGEpe2lbKytvXT1bYSxzXX0pKSxpfX0sNjcxOTcocyl7cy5leHBvcnRzPWZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHMsbyl7cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiBudWxsIT1pJiYoaVtzXT09PW8mJih2b2lkIDAhPT1vfHxzIGluIE9iamVjdChpKSkpfX19LDYyMjI0KHMsbyxpKXt2YXIgYT1pKDUwMTA0KTtzLmV4cG9ydHM9ZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChzKXt2YXIgbz1hKHMsKGZ1bmN0aW9uKHMpe3JldHVybiA1MDA9PT1pLnNpemUmJmkuY2xlYXIoKSxzfSkpLGk9by5jYWNoZTtyZXR1cm4gb319LDMyMDkocyxvLGkpe3ZhciBhPWkoOTE1OTYpLHU9aSg1MzMyMCksXz1pKDM2MzA2KSx3PSJfX2xvZGFzaF9wbGFjZWhvbGRlcl9fIix4PTEyOCxDPU1hdGgubWluO3MuZXhwb3J0cz1mdW5jdGlvbiBtZXJnZURhdGEocyxvKXt2YXIgaT1zWzFdLGo9b1sxXSxMPWl8aixCPUw8MTMxLCQ9aj09eCYmOD09aXx8aj09eCYmMjU2PT1pJiZzWzddLmxlbmd0aDw9b1s4XXx8Mzg0PT1qJiZvWzddLmxlbmd0aDw9b1s4XSYmOD09aTtpZighQiYmISQpcmV0dXJuIHM7MSZqJiYoc1syXT1vWzJdLEx8PTEmaT8wOjQpO3ZhciBVPW9bM107aWYoVSl7dmFyIFY9c1szXTtzWzNdPVY/YShWLFUsb1s0XSk6VSxzWzRdPVY/XyhzWzNdLHcpOm9bNF19cmV0dXJuKFU9b1s1XSkmJihWPXNbNV0sc1s1XT1WP3UoVixVLG9bNl0pOlUsc1s2XT1WP18oc1s1XSx3KTpvWzZdKSwoVT1vWzddKSYmKHNbN109VSksaiZ4JiYoc1s4XT1udWxsPT1zWzhdP29bOF06QyhzWzhdLG9bOF0pKSxudWxsPT1zWzldJiYoc1s5XT1vWzldKSxzWzBdPW9bMF0sc1sxXT1MLHN9fSw0ODE1MihzLG8saSl7dmFyIGE9aSgyODMwMyksdT1hJiZuZXcgYTtzLmV4cG9ydHM9dX0sODEwNDIocyxvLGkpe3ZhciBhPWkoNTYxMTApKE9iamVjdCwiY3JlYXRlIik7cy5leHBvcnRzPWF9LDM2NTAocyxvLGkpe3ZhciBhPWkoNzQzMzUpKE9iamVjdC5rZXlzLE9iamVjdCk7cy5leHBvcnRzPWF9LDkwMTgxKHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBuYXRpdmVLZXlzSW4ocyl7dmFyIG89W107aWYobnVsbCE9cylmb3IodmFyIGkgaW4gT2JqZWN0KHMpKW8ucHVzaChpKTtyZXR1cm4gb319LDg2MDA5KHMsbyxpKXtzPWkubm1kKHMpO3ZhciBhPWkoMzQ4NDApLHU9byYmIW8ubm9kZVR5cGUmJm8sXz11JiZzJiYhcy5ub2RlVHlwZSYmcyx3PV8mJl8uZXhwb3J0cz09PXUmJmEucHJvY2Vzcyx4PWZ1bmN0aW9uKCl7dHJ5e3ZhciBzPV8mJl8ucmVxdWlyZSYmXy5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHN8fHcmJncuYmluZGluZyYmdy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2gocyl7fX0oKTtzLmV4cG9ydHM9eH0sNTkzNTAocyl7dmFyIG89T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztzLmV4cG9ydHM9ZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcocyl7cmV0dXJuIG8uY2FsbChzKX19LDc0MzM1KHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBvdmVyQXJnKHMsbyl7cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiBzKG8oaSkpfX19LDU2NzU3KHMsbyxpKXt2YXIgYT1pKDkxMDMzKSx1PU1hdGgubWF4O3MuZXhwb3J0cz1mdW5jdGlvbiBvdmVyUmVzdChzLG8saSl7cmV0dXJuIG89dSh2b2lkIDA9PT1vP3MubGVuZ3RoLTE6bywwKSxmdW5jdGlvbigpe2Zvcih2YXIgXz1hcmd1bWVudHMsdz0tMSx4PXUoXy5sZW5ndGgtbywwKSxDPUFycmF5KHgpOysrdzx4OylDW3ddPV9bbyt3XTt3PS0xO2Zvcih2YXIgaj1BcnJheShvKzEpOysrdzxvOylqW3ddPV9bd107cmV0dXJuIGpbb109aShDKSxhKHMsdGhpcyxqKX19fSw2ODk2OShzLG8saSl7dmFyIGE9aSg0NzQyMiksdT1pKDI1MTYwKTtzLmV4cG9ydHM9ZnVuY3Rpb24gcGFyZW50KHMsbyl7cmV0dXJuIG8ubGVuZ3RoPDI/czphKHMsdShvLDAsLTEpKX19LDg0NjI5KHMpe3MuZXhwb3J0cz17fX0sNjgyOTQocyxvLGkpe3ZhciBhPWkoMjMwMDcpLHU9aSgzMDM2MSksXz1NYXRoLm1pbjtzLmV4cG9ydHM9ZnVuY3Rpb24gcmVvcmRlcihzLG8pe2Zvcih2YXIgaT1zLmxlbmd0aCx3PV8oby5sZW5ndGgsaSkseD1hKHMpO3ctLTspe3ZhciBDPW9bd107c1t3XT11KEMsaSk/eFtDXTp2b2lkIDB9cmV0dXJuIHN9fSwzNjMwNihzKXt2YXIgbz0iX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyI7cy5leHBvcnRzPWZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKHMsaSl7Zm9yKHZhciBhPS0xLHU9cy5sZW5ndGgsXz0wLHc9W107KythPHU7KXt2YXIgeD1zW2FdO3ghPT1pJiZ4IT09b3x8KHNbYV09byx3W18rK109YSl9cmV0dXJuIHd9fSw5MzI1KHMsbyxpKXt2YXIgYT1pKDM0ODQwKSx1PSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsXz1hfHx1fHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO3MuZXhwb3J0cz1ffSwxNDk3NChzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gc2FmZUdldChzLG8pe2lmKCgiY29uc3RydWN0b3IiIT09b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIHNbb10pJiYiX19wcm90b19fIiE9bylyZXR1cm4gc1tvXX19LDMxMzgwKHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBzZXRDYWNoZUFkZChzKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQocywiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIpLHRoaXN9fSw1MTQ1OShzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gc2V0Q2FjaGVIYXMocyl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHMpfX0sNTQ2NDEocyxvLGkpe3ZhciBhPWkoNjg4ODIpLHU9aSg1MTgxMSkoYSk7cy5leHBvcnRzPXV9LDg0MjQ3KHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBzZXRUb0FycmF5KHMpe3ZhciBvPS0xLGk9QXJyYXkocy5zaXplKTtyZXR1cm4gcy5mb3JFYWNoKChmdW5jdGlvbihzKXtpWysrb109c30pKSxpfX0sMzI4NjUocyxvLGkpe3ZhciBhPWkoMTk1NzApLHU9aSg1MTgxMSkoYSk7cy5leHBvcnRzPXV9LDcwOTgxKHMsbyxpKXt2YXIgYT1pKDc1MjUxKSx1PWkoNjIwNjApLF89aSgzMjg2NSksdz1pKDc1OTQ4KTtzLmV4cG9ydHM9ZnVuY3Rpb24gc2V0V3JhcFRvU3RyaW5nKHMsbyxpKXt2YXIgeD1vKyIiO3JldHVybiBfKHMsdSh4LHcoYSh4KSxpKSkpfX0sNTE4MTEocyl7dmFyIG89RGF0ZS5ub3c7cy5leHBvcnRzPWZ1bmN0aW9uIHNob3J0T3V0KHMpe3ZhciBpPTAsYT0wO3JldHVybiBmdW5jdGlvbigpe3ZhciB1PW8oKSxfPTE2LSh1LWEpO2lmKGE9dSxfPjApe2lmKCsraT49ODAwKXJldHVybiBhcmd1bWVudHNbMF19ZWxzZSBpPTA7cmV0dXJuIHMuYXBwbHkodm9pZCAwLGFyZ3VtZW50cyl9fX0sNTE0MjAocyxvLGkpe3ZhciBhPWkoODAwNzkpO3MuZXhwb3J0cz1mdW5jdGlvbiBzdGFja0NsZWFyKCl7dGhpcy5fX2RhdGFfXz1uZXcgYSx0aGlzLnNpemU9MH19LDkwOTM4KHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBzdGFja0RlbGV0ZShzKXt2YXIgbz10aGlzLl9fZGF0YV9fLGk9by5kZWxldGUocyk7cmV0dXJuIHRoaXMuc2l6ZT1vLnNpemUsaX19LDYzNjA1KHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBzdGFja0dldChzKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQocyl9fSwyOTgxNyhzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gc3RhY2tIYXMocyl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHMpfX0sODA5NDUocyxvLGkpe3ZhciBhPWkoODAwNzkpLHU9aSg2ODIyMyksXz1pKDUzNjYxKTtzLmV4cG9ydHM9ZnVuY3Rpb24gc3RhY2tTZXQocyxvKXt2YXIgaT10aGlzLl9fZGF0YV9fO2lmKGkgaW5zdGFuY2VvZiBhKXt2YXIgdz1pLl9fZGF0YV9fO2lmKCF1fHx3Lmxlbmd0aDwxOTkpcmV0dXJuIHcucHVzaChbcyxvXSksdGhpcy5zaXplPSsraS5zaXplLHRoaXM7aT10aGlzLl9fZGF0YV9fPW5ldyBfKHcpfXJldHVybiBpLnNldChzLG8pLHRoaXMuc2l6ZT1pLnNpemUsdGhpc319LDc2OTU5KHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBzdHJpY3RJbmRleE9mKHMsbyxpKXtmb3IodmFyIGE9aS0xLHU9cy5sZW5ndGg7KythPHU7KWlmKHNbYV09PT1vKXJldHVybiBhO3JldHVybi0xfX0sNjM5MTIocyxvLGkpe3ZhciBhPWkoNjEwNzQpLHU9aSg0OTY5OCksXz1pKDQyMDU0KTtzLmV4cG9ydHM9ZnVuY3Rpb24gc3RyaW5nVG9BcnJheShzKXtyZXR1cm4gdShzKT9fKHMpOmEocyl9fSw2MTgwMihzLG8saSl7dmFyIGE9aSg2MjIyNCksdT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxfPS9cXChcXCk/L2csdz1hKChmdW5jdGlvbihzKXt2YXIgbz1bXTtyZXR1cm4gNDY9PT1zLmNoYXJDb2RlQXQoMCkmJm8ucHVzaCgiIikscy5yZXBsYWNlKHUsKGZ1bmN0aW9uKHMsaSxhLHUpe28ucHVzaChhP3UucmVwbGFjZShfLCIkMSIpOml8fHMpfSkpLG99KSk7cy5leHBvcnRzPXd9LDc3Nzk3KHMsbyxpKXt2YXIgYT1pKDQ0Mzk0KTtzLmV4cG9ydHM9ZnVuY3Rpb24gdG9LZXkocyl7aWYoInN0cmluZyI9PXR5cGVvZiBzfHxhKHMpKXJldHVybiBzO3ZhciBvPXMrIiI7cmV0dXJuIjAiPT1vJiYxL3M9PS0xLzA/Ii0wIjpvfX0sNDc0NzMocyl7dmFyIG89RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3MuZXhwb3J0cz1mdW5jdGlvbiB0b1NvdXJjZShzKXtpZihudWxsIT1zKXt0cnl7cmV0dXJuIG8uY2FsbChzKX1jYXRjaChzKXt9dHJ5e3JldHVybiBzKyIifWNhdGNoKHMpe319cmV0dXJuIiJ9fSwzMTgwMChzKXt2YXIgbz0vXHMvO3MuZXhwb3J0cz1mdW5jdGlvbiB0cmltbWVkRW5kSW5kZXgocyl7Zm9yKHZhciBpPXMubGVuZ3RoO2ktLSYmby50ZXN0KHMuY2hhckF0KGkpKTspO3JldHVybiBpfX0sNDIwNTQocyl7dmFyIG89IlxcdWQ4MDAtXFx1ZGZmZiIsaT0iWyIrbysiXSIsYT0iW1xcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZl0iLHU9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsXz0iW14iK28rIl0iLHc9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHg9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLEM9Iig/OiIrYSsifCIrdSsiKSIrIj8iLGo9IltcXHVmZTBlXFx1ZmUwZl0/IixMPWorQysoIig/OlxcdTIwMGQoPzoiK1tfLHcseF0uam9pbigifCIpKyIpIitqK0MrIikqIiksQj0iKD86IitbXythKyI/IixhLHcseCxpXS5qb2luKCJ8IikrIikiLCQ9UmVnRXhwKHUrIig/PSIrdSsiKXwiK0IrTCwiZyIpO3MuZXhwb3J0cz1mdW5jdGlvbiB1bmljb2RlVG9BcnJheShzKXtyZXR1cm4gcy5tYXRjaCgkKXx8W119fSwyMjIyNShzKXt2YXIgbz0iXFx1ZDgwMC1cXHVkZmZmIixpPSJcXHUyNzAwLVxcdTI3YmYiLGE9ImEtelxceGRmLVxceGY2XFx4ZjgtXFx4ZmYiLHU9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLF89IlxceGFjXFx4YjFcXHhkN1xceGY3XFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4YmZcXHUyMDAwLVxcdTIwNmYgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLHc9IlsiK18rIl0iLHg9IlxcZCsiLEM9IlsiK2krIl0iLGo9IlsiK2ErIl0iLEw9IlteIitvK18reCtpK2ErdSsiXSIsQj0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIsJD0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsVT0iWyIrdSsiXSIsVj0iKD86IitqKyJ8IitMKyIpIix6PSIoPzoiK1UrInwiK0wrIikiLFk9Iig/Olsn4oCZXSg/OmR8bGx8bXxyZXxzfHR8dmUpKT8iLFo9Iig/Olsn4oCZXSg/OkR8TEx8TXxSRXxTfFR8VkUpKT8iLGVlPSIoPzpbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXXxcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0pPyIsaWU9IltcXHVmZTBlXFx1ZmUwZl0/IixhZT1pZStlZSsoIig/OlxcdTIwMGQoPzoiK1siW14iK28rIl0iLEIsJF0uam9pbigifCIpKyIpIitpZStlZSsiKSoiKSxjZT0iKD86IitbQyxCLCRdLmpvaW4oInwiKSsiKSIrYWUsbGU9UmVnRXhwKFtVKyI/IitqKyIrIitZKyIoPz0iK1t3LFUsIiQiXS5qb2luKCJ8IikrIikiLHorIisiK1orIig/PSIrW3csVStWLCIkIl0uam9pbigifCIpKyIpIixVKyI/IitWKyIrIitZLFUrIisiK1osIlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoPz1cXGJ8W2Etel9dKSIsIlxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXGR0aCkoPz1cXGJ8W0EtWl9dKSIseCxjZV0uam9pbigifCIpLCJnIik7cy5leHBvcnRzPWZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzKXtyZXR1cm4gcy5tYXRjaChsZSl8fFtdfX0sNzU5NDgocyxvLGkpe3ZhciBhPWkoODM3MjkpLHU9aSgxNTMyNSksXz1bWyJhcnkiLDEyOF0sWyJiaW5kIiwxXSxbImJpbmRLZXkiLDJdLFsiY3VycnkiLDhdLFsiY3VycnlSaWdodCIsMTZdLFsiZmxpcCIsNTEyXSxbInBhcnRpYWwiLDMyXSxbInBhcnRpYWxSaWdodCIsNjRdLFsicmVhcmciLDI1Nl1dO3MuZXhwb3J0cz1mdW5jdGlvbiB1cGRhdGVXcmFwRGV0YWlscyhzLG8pe3JldHVybiBhKF8sKGZ1bmN0aW9uKGkpe3ZhciBhPSJfLiIraVswXTtvJmlbMV0mJiF1KHMsYSkmJnMucHVzaChhKX0pKSxzLnNvcnQoKX19LDgwMjU3KHMsbyxpKXt2YXIgYT1pKDMwOTgwKSx1PWkoNTYwMTcpLF89aSgyMzAwNyk7cy5leHBvcnRzPWZ1bmN0aW9uIHdyYXBwZXJDbG9uZShzKXtpZihzIGluc3RhbmNlb2YgYSlyZXR1cm4gcy5jbG9uZSgpO3ZhciBvPW5ldyB1KHMuX193cmFwcGVkX18scy5fX2NoYWluX18pO3JldHVybiBvLl9fYWN0aW9uc19fPV8ocy5fX2FjdGlvbnNfXyksby5fX2luZGV4X189cy5fX2luZGV4X18sby5fX3ZhbHVlc19fPXMuX192YWx1ZXNfXyxvfX0sNjQ2MjYocyxvLGkpe3ZhciBhPWkoNjY5NzcpO3MuZXhwb3J0cz1mdW5jdGlvbiBhcnkocyxvLGkpe3JldHVybiBvPWk/dm9pZCAwOm8sbz1zJiZudWxsPT1vP3MubGVuZ3RoOm8sYShzLDEyOCx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbyl9fSw4NDA1OChzLG8saSl7dmFyIGE9aSgxNDc5MiksdT1pKDQ1NTM5KSgoZnVuY3Rpb24ocyxvLGkpe3JldHVybiBvPW8udG9Mb3dlckNhc2UoKSxzKyhpP2Eobyk6byl9KSk7cy5leHBvcnRzPXV9LDE0NzkyKHMsbyxpKXt2YXIgYT1pKDEzMjIyKSx1PWkoNTU4MDgpO3MuZXhwb3J0cz1mdW5jdGlvbiBjYXBpdGFsaXplKHMpe3JldHVybiB1KGEocykudG9Mb3dlckNhc2UoKSl9fSwzMjYyOShzLG8saSl7dmFyIGE9aSg5OTk5KTtzLmV4cG9ydHM9ZnVuY3Rpb24gY2xvbmUocyl7cmV0dXJuIGEocyw0KX19LDM3MzM0KHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBjb25zdGFudChzKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gc319fSw0OTc0NyhzLG8saSl7dmFyIGE9aSg2Njk3Nyk7ZnVuY3Rpb24gY3VycnkocyxvLGkpe3ZhciB1PWEocyw4LHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbz1pP3ZvaWQgMDpvKTtyZXR1cm4gdS5wbGFjZWhvbGRlcj1jdXJyeS5wbGFjZWhvbGRlcix1fWN1cnJ5LnBsYWNlaG9sZGVyPXt9LHMuZXhwb3J0cz1jdXJyeX0sMzgyMjEocyxvLGkpe3ZhciBhPWkoMjM4MDUpLHU9aSgxMDEyNCksXz1pKDk5Mzc0KSx3PU1hdGgubWF4LHg9TWF0aC5taW47cy5leHBvcnRzPWZ1bmN0aW9uIGRlYm91bmNlKHMsbyxpKXt2YXIgQyxqLEwsQiwkLFUsVj0wLHo9ITEsWT0hMSxaPSEwO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBzKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTtmdW5jdGlvbiBpbnZva2VGdW5jKG8pe3ZhciBpPUMsYT1qO3JldHVybiBDPWo9dm9pZCAwLFY9byxCPXMuYXBwbHkoYSxpKX1mdW5jdGlvbiBzaG91bGRJbnZva2Uocyl7dmFyIGk9cy1VO3JldHVybiB2b2lkIDA9PT1VfHxpPj1vfHxpPDB8fFkmJnMtVj49TH1mdW5jdGlvbiB0aW1lckV4cGlyZWQoKXt2YXIgcz11KCk7aWYoc2hvdWxkSW52b2tlKHMpKXJldHVybiB0cmFpbGluZ0VkZ2Uocyk7JD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCxmdW5jdGlvbiByZW1haW5pbmdXYWl0KHMpe3ZhciBpPW8tKHMtVSk7cmV0dXJuIFk/eChpLEwtKHMtVikpOml9KHMpKX1mdW5jdGlvbiB0cmFpbGluZ0VkZ2Uocyl7cmV0dXJuICQ9dm9pZCAwLFomJkM/aW52b2tlRnVuYyhzKTooQz1qPXZvaWQgMCxCKX1mdW5jdGlvbiBkZWJvdW5jZWQoKXt2YXIgcz11KCksaT1zaG91bGRJbnZva2Uocyk7aWYoQz1hcmd1bWVudHMsaj10aGlzLFU9cyxpKXtpZih2b2lkIDA9PT0kKXJldHVybiBmdW5jdGlvbiBsZWFkaW5nRWRnZShzKXtyZXR1cm4gVj1zLCQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsbyksej9pbnZva2VGdW5jKHMpOkJ9KFUpO2lmKFkpcmV0dXJuIGNsZWFyVGltZW91dCgkKSwkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLG8pLGludm9rZUZ1bmMoVSl9cmV0dXJuIHZvaWQgMD09PSQmJigkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLG8pKSxCfXJldHVybiBvPV8obyl8fDAsYShpKSYmKHo9ISFpLmxlYWRpbmcsTD0oWT0ibWF4V2FpdCJpbiBpKT93KF8oaS5tYXhXYWl0KXx8MCxvKTpMLFo9InRyYWlsaW5nImluIGk/ISFpLnRyYWlsaW5nOlopLGRlYm91bmNlZC5jYW5jZWw9ZnVuY3Rpb24gY2FuY2VsKCl7dm9pZCAwIT09JCYmY2xlYXJUaW1lb3V0KCQpLFY9MCxDPVU9aj0kPXZvaWQgMH0sZGVib3VuY2VkLmZsdXNoPWZ1bmN0aW9uIGZsdXNoKCl7cmV0dXJuIHZvaWQgMD09PSQ/Qjp0cmFpbGluZ0VkZ2UodSgpKX0sZGVib3VuY2VkfX0sNTA4MjgocyxvLGkpe3ZhciBhPWkoMjQ2NDcpLHU9aSgxMzIyMiksXz0vW1x4YzAtXHhkNlx4ZDgtXHhmNlx4ZjgtXHhmZlx1MDEwMC1cdTAxN2ZdL2csdz1SZWdFeHAoIltcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZdIiwiZyIpO3MuZXhwb3J0cz1mdW5jdGlvbiBkZWJ1cnIocyl7cmV0dXJuKHM9dShzKSkmJnMucmVwbGFjZShfLGEpLnJlcGxhY2UodywiIil9fSw3NTI4OChzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gZXEocyxvKXtyZXR1cm4gcz09PW98fHMhPXMmJm8hPW99fSw2MDY4MChzLG8saSl7dmFyIGE9aSgxMzIyMiksdT0vW1xcXiQuKis/KClbXF17fXxdL2csXz1SZWdFeHAodS5zb3VyY2UpO3MuZXhwb3J0cz1mdW5jdGlvbiBlc2NhcGVSZWdFeHAocyl7cmV0dXJuKHM9YShzKSkmJl8udGVzdChzKT9zLnJlcGxhY2UodSwiXFwkJiIpOnN9fSw3MzA5KHMsbyxpKXt2YXIgYT1pKDYyMDA2KShpKDI0NzEzKSk7cy5leHBvcnRzPWF9LDI0NzEzKHMsbyxpKXt2YXIgYT1pKDI1MjMpLHU9aSgxNTM4OSksXz1pKDYxNDg5KSx3PU1hdGgubWF4O3MuZXhwb3J0cz1mdW5jdGlvbiBmaW5kSW5kZXgocyxvLGkpe3ZhciB4PW51bGw9PXM/MDpzLmxlbmd0aDtpZigheClyZXR1cm4tMTt2YXIgQz1udWxsPT1pPzA6XyhpKTtyZXR1cm4gQzwwJiYoQz13KHgrQywwKSksYShzLHUobywzKSxDKX19LDM1OTcwKHMsbyxpKXt2YXIgYT1pKDgzMTIwKTtzLmV4cG9ydHM9ZnVuY3Rpb24gZmxhdHRlbihzKXtyZXR1cm4obnVsbD09cz8wOnMubGVuZ3RoKT9hKHMsMSk6W119fSw3MzQyNChzLG8saSl7dmFyIGE9aSgxNjk2MiksdT1pKDI4NzQpLF89QXJyYXkucHJvdG90eXBlLnB1c2g7ZnVuY3Rpb24gYmFzZUFyeShzLG8pe3JldHVybiAyPT1vP2Z1bmN0aW9uKG8saSl7cmV0dXJuIHMobyxpKX06ZnVuY3Rpb24obyl7cmV0dXJuIHMobyl9fWZ1bmN0aW9uIGNsb25lQXJyYXkocyl7Zm9yKHZhciBvPXM/cy5sZW5ndGg6MCxpPUFycmF5KG8pO28tLTspaVtvXT1zW29dO3JldHVybiBpfWZ1bmN0aW9uIHdyYXBJbW11dGFibGUocyxvKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoO2lmKGkpe2Zvcih2YXIgYT1BcnJheShpKTtpLS07KWFbaV09YXJndW1lbnRzW2ldO3ZhciB1PWFbMF09by5hcHBseSh2b2lkIDAsYSk7cmV0dXJuIHMuYXBwbHkodm9pZCAwLGEpLHV9fX1zLmV4cG9ydHM9ZnVuY3Rpb24gYmFzZUNvbnZlcnQocyxvLGksdyl7dmFyIHg9ImZ1bmN0aW9uIj09dHlwZW9mIG8sQz1vPT09T2JqZWN0KG8pO2lmKEMmJih3PWksaT1vLG89dm9pZCAwKSxudWxsPT1pKXRocm93IG5ldyBUeXBlRXJyb3I7d3x8KHc9e30pO3ZhciBqPSEoImNhcCJpbiB3KXx8dy5jYXAsTD0hKCJjdXJyeSJpbiB3KXx8dy5jdXJyeSxCPSEoImZpeGVkImluIHcpfHx3LmZpeGVkLCQ9ISgiaW1tdXRhYmxlImluIHcpfHx3LmltbXV0YWJsZSxVPSEoInJlYXJnImluIHcpfHx3LnJlYXJnLFY9eD9pOnUsej0iY3VycnkiaW4gdyYmdy5jdXJyeSxZPSJmaXhlZCJpbiB3JiZ3LmZpeGVkLFo9InJlYXJnImluIHcmJncucmVhcmcsZWU9eD9pLnJ1bkluQ29udGV4dCgpOnZvaWQgMCxpZT14P2k6e2FyeTpzLmFyeSxhc3NpZ246cy5hc3NpZ24sY2xvbmU6cy5jbG9uZSxjdXJyeTpzLmN1cnJ5LGZvckVhY2g6cy5mb3JFYWNoLGlzQXJyYXk6cy5pc0FycmF5LGlzRXJyb3I6cy5pc0Vycm9yLGlzRnVuY3Rpb246cy5pc0Z1bmN0aW9uLGlzV2Vha01hcDpzLmlzV2Vha01hcCxpdGVyYXRlZTpzLml0ZXJhdGVlLGtleXM6cy5rZXlzLHJlYXJnOnMucmVhcmcsdG9JbnRlZ2VyOnMudG9JbnRlZ2VyLHRvUGF0aDpzLnRvUGF0aH0sYWU9aWUuYXJ5LGNlPWllLmFzc2lnbixsZT1pZS5jbG9uZSxwZT1pZS5jdXJyeSxkZT1pZS5mb3JFYWNoLGZlPWllLmlzQXJyYXkseWU9aWUuaXNFcnJvcixiZT1pZS5pc0Z1bmN0aW9uLFNlPWllLmlzV2Vha01hcCxfZT1pZS5rZXlzLHdlPWllLnJlYXJnLHhlPWllLnRvSW50ZWdlcixQZT1pZS50b1BhdGgsVGU9X2UoYS5hcnlNZXRob2QpLFJlPXtjYXN0QXJyYXk6ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89YXJndW1lbnRzWzBdO3JldHVybiBmZShvKT9zKGNsb25lQXJyYXkobykpOnMuYXBwbHkodm9pZCAwLGFyZ3VtZW50cyl9fSxpdGVyYXRlZTpmdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1hcmd1bWVudHNbMV0saT1zKGFyZ3VtZW50c1swXSxvKSxhPWkubGVuZ3RoO3JldHVybiBqJiYibnVtYmVyIj09dHlwZW9mIG8/KG89bz4yP28tMjoxLGEmJmE8PW8/aTpiYXNlQXJ5KGksbykpOml9fSxtaXhpbjpmdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24obyl7dmFyIGk9dGhpcztpZighYmUoaSkpcmV0dXJuIHMoaSxPYmplY3QobykpO3ZhciBhPVtdO3JldHVybiBkZShfZShvKSwoZnVuY3Rpb24ocyl7YmUob1tzXSkmJmEucHVzaChbcyxpLnByb3RvdHlwZVtzXV0pfSkpLHMoaSxPYmplY3QobykpLGRlKGEsKGZ1bmN0aW9uKHMpe3ZhciBvPXNbMV07YmUobyk/aS5wcm90b3R5cGVbc1swXV09bzpkZWxldGUgaS5wcm90b3R5cGVbc1swXV19KSksaX19LG50aEFyZzpmdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24obyl7dmFyIGk9bzwwPzE6eGUobykrMTtyZXR1cm4gcGUocyhvKSxpKX19LHJlYXJnOmZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbihvLGkpe3ZhciBhPWk/aS5sZW5ndGg6MDtyZXR1cm4gcGUocyhvLGkpLGEpfX0scnVuSW5Db250ZXh0OmZ1bmN0aW9uKG8pe3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gYmFzZUNvbnZlcnQocyxvKGkpLHcpfX19O2Z1bmN0aW9uIGNhc3RDYXAocyxvKXtpZihqKXt2YXIgaT1hLml0ZXJhdGVlUmVhcmdbc107aWYoaSlyZXR1cm4gZnVuY3Rpb24gaXRlcmF0ZWVSZWFyZyhzLG8pe3JldHVybiBvdmVyQXJnKHMsKGZ1bmN0aW9uKHMpe3ZhciBpPW8ubGVuZ3RoO3JldHVybiBmdW5jdGlvbiBiYXNlQXJpdHkocyxvKXtyZXR1cm4gMj09bz9mdW5jdGlvbihvLGkpe3JldHVybiBzLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfTpmdW5jdGlvbihvKXtyZXR1cm4gcy5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX19KHdlKGJhc2VBcnkocyxpKSxvKSxpKX0pKX0obyxpKTt2YXIgdT0heCYmYS5pdGVyYXRlZUFyeVtzXTtpZih1KXJldHVybiBmdW5jdGlvbiBpdGVyYXRlZUFyeShzLG8pe3JldHVybiBvdmVyQXJnKHMsKGZ1bmN0aW9uKHMpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBzP2Jhc2VBcnkocyxvKTpzfSkpfShvLHUpfXJldHVybiBvfWZ1bmN0aW9uIGNhc3RGaXhlZChzLG8saSl7aWYoQiYmKFl8fCFhLnNraXBGaXhlZFtzXSkpe3ZhciB1PWEubWV0aG9kU3ByZWFkW3NdLHc9dSYmdS5zdGFydDtyZXR1cm4gdm9pZCAwPT09dz9hZShvLGkpOmZ1bmN0aW9uIGZsYXRTcHJlYWQocyxvKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGk9YXJndW1lbnRzLmxlbmd0aCxhPWktMSx1PUFycmF5KGkpO2ktLTspdVtpXT1hcmd1bWVudHNbaV07dmFyIHc9dVtvXSx4PXUuc2xpY2UoMCxvKTtyZXR1cm4gdyYmXy5hcHBseSh4LHcpLG8hPWEmJl8uYXBwbHkoeCx1LnNsaWNlKG8rMSkpLHMuYXBwbHkodGhpcyx4KX19KG8sdyl9cmV0dXJuIG99ZnVuY3Rpb24gY2FzdFJlYXJnKHMsbyxpKXtyZXR1cm4gVSYmaT4xJiYoWnx8IWEuc2tpcFJlYXJnW3NdKT93ZShvLGEubWV0aG9kUmVhcmdbc118fGEuYXJ5UmVhcmdbaV0pOm99ZnVuY3Rpb24gY2xvbmVCeVBhdGgocyxvKXtmb3IodmFyIGk9LTEsYT0obz1QZShvKSkubGVuZ3RoLHU9YS0xLF89bGUoT2JqZWN0KHMpKSx3PV87bnVsbCE9dyYmKytpPGE7KXt2YXIgeD1vW2ldLEM9d1t4XTtudWxsPT1DfHxiZShDKXx8eWUoQyl8fFNlKEMpfHwod1t4XT1sZShpPT11P0M6T2JqZWN0KEMpKSksdz13W3hdfXJldHVybiBffWZ1bmN0aW9uIGNyZWF0ZUNvbnZlcnRlcihzLG8pe3ZhciBpPWEuYWxpYXNUb1JlYWxbc118fHMsdT1hLnJlbWFwW2ldfHxpLF89dztyZXR1cm4gZnVuY3Rpb24ocyl7dmFyIGE9eD9lZTppZSx3PXg/ZWVbdV06byxDPWNlKGNlKHt9LF8pLHMpO3JldHVybiBiYXNlQ29udmVydChhLGksdyxDKX19ZnVuY3Rpb24gb3ZlckFyZyhzLG8pe3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg7aWYoIWkpcmV0dXJuIHMoKTtmb3IodmFyIGE9QXJyYXkoaSk7aS0tOylhW2ldPWFyZ3VtZW50c1tpXTt2YXIgdT1VPzA6aS0xO3JldHVybiBhW3VdPW8oYVt1XSkscy5hcHBseSh2b2lkIDAsYSl9fWZ1bmN0aW9uIHdyYXAocyxvLGkpe3ZhciB1LF89YS5hbGlhc1RvUmVhbFtzXXx8cyx3PW8seD1SZVtfXTtyZXR1cm4geD93PXgobyk6JCYmKGEubXV0YXRlLmFycmF5W19dP3c9d3JhcEltbXV0YWJsZShvLGNsb25lQXJyYXkpOmEubXV0YXRlLm9iamVjdFtfXT93PXdyYXBJbW11dGFibGUobyxmdW5jdGlvbiBjcmVhdGVDbG9uZXIocyl7cmV0dXJuIGZ1bmN0aW9uKG8pe3JldHVybiBzKHt9LG8pfX0obykpOmEubXV0YXRlLnNldFtfXSYmKHc9d3JhcEltbXV0YWJsZShvLGNsb25lQnlQYXRoKSkpLGRlKFRlLChmdW5jdGlvbihzKXtyZXR1cm4gZGUoYS5hcnlNZXRob2Rbc10sKGZ1bmN0aW9uKG8pe2lmKF89PW8pe3ZhciBpPWEubWV0aG9kU3ByZWFkW19dLHg9aSYmaS5hZnRlclJlYXJnO3JldHVybiB1PXg/Y2FzdEZpeGVkKF8sY2FzdFJlYXJnKF8sdyxzKSxzKTpjYXN0UmVhcmcoXyxjYXN0Rml4ZWQoXyx3LHMpLHMpLHU9ZnVuY3Rpb24gY2FzdEN1cnJ5KHMsbyxpKXtyZXR1cm4genx8TCYmaT4xP3BlKG8saSk6b30oMCx1PWNhc3RDYXAoXyx1KSxzKSwhMX19KSksIXV9KSksdXx8KHU9dyksdT09byYmKHU9ej9wZSh1LDEpOmZ1bmN0aW9uKCl7cmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfSksdS5jb252ZXJ0PWNyZWF0ZUNvbnZlcnRlcihfLG8pLHUucGxhY2Vob2xkZXI9by5wbGFjZWhvbGRlcj1pLHV9aWYoIUMpcmV0dXJuIHdyYXAobyxpLFYpO3ZhciAkZT1pLHFlPVtdO3JldHVybiBkZShUZSwoZnVuY3Rpb24ocyl7ZGUoYS5hcnlNZXRob2Rbc10sKGZ1bmN0aW9uKHMpe3ZhciBvPSRlW2EucmVtYXBbc118fHNdO28mJnFlLnB1c2goW3Msd3JhcChzLG8sJGUpXSl9KSl9KSksZGUoX2UoJGUpLChmdW5jdGlvbihzKXt2YXIgbz0kZVtzXTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbyl7Zm9yKHZhciBpPXFlLmxlbmd0aDtpLS07KWlmKHFlW2ldWzBdPT1zKXJldHVybjtvLmNvbnZlcnQ9Y3JlYXRlQ29udmVydGVyKHMsbykscWUucHVzaChbcyxvXSl9fSkpLGRlKHFlLChmdW5jdGlvbihzKXskZVtzWzBdXT1zWzFdfSkpLCRlLmNvbnZlcnQ9ZnVuY3Rpb24gY29udmVydExpYihzKXtyZXR1cm4gJGUucnVuSW5Db250ZXh0LmNvbnZlcnQocykodm9pZCAwKX0sJGUucGxhY2Vob2xkZXI9JGUsZGUoX2UoJGUpLChmdW5jdGlvbihzKXtkZShhLnJlYWxUb0FsaWFzW3NdfHxbXSwoZnVuY3Rpb24obyl7JGVbb109JGVbc119KSl9KSksJGV9fSwxNjk2MihzLG8pe28uYWxpYXNUb1JlYWw9e2VhY2g6ImZvckVhY2giLGVhY2hSaWdodDoiZm9yRWFjaFJpZ2h0IixlbnRyaWVzOiJ0b1BhaXJzIixlbnRyaWVzSW46InRvUGFpcnNJbiIsZXh0ZW5kOiJhc3NpZ25JbiIsZXh0ZW5kQWxsOiJhc3NpZ25JbkFsbCIsZXh0ZW5kQWxsV2l0aDoiYXNzaWduSW5BbGxXaXRoIixleHRlbmRXaXRoOiJhc3NpZ25JbldpdGgiLGZpcnN0OiJoZWFkIixjb25mb3JtczoiY29uZm9ybXNUbyIsbWF0Y2hlczoiaXNNYXRjaCIscHJvcGVydHk6ImdldCIsX186InBsYWNlaG9sZGVyIixGOiJzdHViRmFsc2UiLFQ6InN0dWJUcnVlIixhbGw6ImV2ZXJ5IixhbGxQYXNzOiJvdmVyRXZlcnkiLGFsd2F5czoiY29uc3RhbnQiLGFueToic29tZSIsYW55UGFzczoib3ZlclNvbWUiLGFwcGx5OiJzcHJlYWQiLGFzc29jOiJzZXQiLGFzc29jUGF0aDoic2V0Iixjb21wbGVtZW50OiJuZWdhdGUiLGNvbXBvc2U6ImZsb3dSaWdodCIsY29udGFpbnM6ImluY2x1ZGVzIixkaXNzb2M6InVuc2V0IixkaXNzb2NQYXRoOiJ1bnNldCIsZHJvcExhc3Q6ImRyb3BSaWdodCIsZHJvcExhc3RXaGlsZToiZHJvcFJpZ2h0V2hpbGUiLGVxdWFsczoiaXNFcXVhbCIsaWRlbnRpY2FsOiJlcSIsaW5kZXhCeToia2V5QnkiLGluaXQ6ImluaXRpYWwiLGludmVydE9iajoiaW52ZXJ0IixqdXh0OiJvdmVyIixvbWl0QWxsOiJvbWl0IixuQXJ5OiJhcnkiLHBhdGg6ImdldCIscGF0aEVxOiJtYXRjaGVzUHJvcGVydHkiLHBhdGhPcjoiZ2V0T3IiLHBhdGhzOiJhdCIscGlja0FsbDoicGljayIscGlwZToiZmxvdyIscGx1Y2s6Im1hcCIscHJvcDoiZ2V0Iixwcm9wRXE6Im1hdGNoZXNQcm9wZXJ0eSIscHJvcE9yOiJnZXRPciIscHJvcHM6ImF0IixzeW1tZXRyaWNEaWZmZXJlbmNlOiJ4b3IiLHN5bW1ldHJpY0RpZmZlcmVuY2VCeToieG9yQnkiLHN5bW1ldHJpY0RpZmZlcmVuY2VXaXRoOiJ4b3JXaXRoIix0YWtlTGFzdDoidGFrZVJpZ2h0Iix0YWtlTGFzdFdoaWxlOiJ0YWtlUmlnaHRXaGlsZSIsdW5hcHBseToicmVzdCIsdW5uZXN0OiJmbGF0dGVuIix1c2VXaXRoOiJvdmVyQXJncyIsd2hlcmU6ImNvbmZvcm1zVG8iLHdoZXJlRXE6ImlzTWF0Y2giLHppcE9iajoiemlwT2JqZWN0In0sby5hcnlNZXRob2Q9ezE6WyJhc3NpZ25BbGwiLCJhc3NpZ25JbkFsbCIsImF0dGVtcHQiLCJjYXN0QXJyYXkiLCJjZWlsIiwiY3JlYXRlIiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwiZGVmYXVsdHNBbGwiLCJkZWZhdWx0c0RlZXBBbGwiLCJmbG9vciIsImZsb3ciLCJmbG93UmlnaHQiLCJmcm9tUGFpcnMiLCJpbnZlcnQiLCJpdGVyYXRlZSIsIm1lbW9pemUiLCJtZXRob2QiLCJtZXJnZUFsbCIsIm1ldGhvZE9mIiwibWl4aW4iLCJudGhBcmciLCJvdmVyIiwib3ZlckV2ZXJ5Iiwib3ZlclNvbWUiLCJyZXN0IiwicmV2ZXJzZSIsInJvdW5kIiwicnVuSW5Db250ZXh0Iiwic3ByZWFkIiwidGVtcGxhdGUiLCJ0cmltIiwidHJpbUVuZCIsInRyaW1TdGFydCIsInVuaXF1ZUlkIiwid29yZHMiLCJ6aXBBbGwiXSwyOlsiYWRkIiwiYWZ0ZXIiLCJhcnkiLCJhc3NpZ24iLCJhc3NpZ25BbGxXaXRoIiwiYXNzaWduSW4iLCJhc3NpZ25JbkFsbFdpdGgiLCJhdCIsImJlZm9yZSIsImJpbmQiLCJiaW5kQWxsIiwiYmluZEtleSIsImNodW5rIiwiY2xvbmVEZWVwV2l0aCIsImNsb25lV2l0aCIsImNvbmNhdCIsImNvbmZvcm1zVG8iLCJjb3VudEJ5IiwiY3VycnlOIiwiY3VycnlSaWdodE4iLCJkZWJvdW5jZSIsImRlZmF1bHRzIiwiZGVmYXVsdHNEZWVwIiwiZGVmYXVsdFRvIiwiZGVsYXkiLCJkaWZmZXJlbmNlIiwiZGl2aWRlIiwiZHJvcCIsImRyb3BSaWdodCIsImRyb3BSaWdodFdoaWxlIiwiZHJvcFdoaWxlIiwiZW5kc1dpdGgiLCJlcSIsImV2ZXJ5IiwiZmlsdGVyIiwiZmluZCIsImZpbmRJbmRleCIsImZpbmRLZXkiLCJmaW5kTGFzdCIsImZpbmRMYXN0SW5kZXgiLCJmaW5kTGFzdEtleSIsImZsYXRNYXAiLCJmbGF0TWFwRGVlcCIsImZsYXR0ZW5EZXB0aCIsImZvckVhY2giLCJmb3JFYWNoUmlnaHQiLCJmb3JJbiIsImZvckluUmlnaHQiLCJmb3JPd24iLCJmb3JPd25SaWdodCIsImdldCIsImdyb3VwQnkiLCJndCIsImd0ZSIsImhhcyIsImhhc0luIiwiaW5jbHVkZXMiLCJpbmRleE9mIiwiaW50ZXJzZWN0aW9uIiwiaW52ZXJ0QnkiLCJpbnZva2UiLCJpbnZva2VNYXAiLCJpc0VxdWFsIiwiaXNNYXRjaCIsImpvaW4iLCJrZXlCeSIsImxhc3RJbmRleE9mIiwibHQiLCJsdGUiLCJtYXAiLCJtYXBLZXlzIiwibWFwVmFsdWVzIiwibWF0Y2hlc1Byb3BlcnR5IiwibWF4QnkiLCJtZWFuQnkiLCJtZXJnZSIsIm1lcmdlQWxsV2l0aCIsIm1pbkJ5IiwibXVsdGlwbHkiLCJudGgiLCJvbWl0Iiwib21pdEJ5Iiwib3ZlckFyZ3MiLCJwYWQiLCJwYWRFbmQiLCJwYWRTdGFydCIsInBhcnNlSW50IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCIsInBhcnRpdGlvbiIsInBpY2siLCJwaWNrQnkiLCJwcm9wZXJ0eU9mIiwicHVsbCIsInB1bGxBbGwiLCJwdWxsQXQiLCJyYW5kb20iLCJyYW5nZSIsInJhbmdlUmlnaHQiLCJyZWFyZyIsInJlamVjdCIsInJlbW92ZSIsInJlcGVhdCIsInJlc3RGcm9tIiwicmVzdWx0Iiwic2FtcGxlU2l6ZSIsInNvbWUiLCJzb3J0QnkiLCJzb3J0ZWRJbmRleCIsInNvcnRlZEluZGV4T2YiLCJzb3J0ZWRMYXN0SW5kZXgiLCJzb3J0ZWRMYXN0SW5kZXhPZiIsInNvcnRlZFVuaXFCeSIsInNwbGl0Iiwic3ByZWFkRnJvbSIsInN0YXJ0c1dpdGgiLCJzdWJ0cmFjdCIsInN1bUJ5IiwidGFrZSIsInRha2VSaWdodCIsInRha2VSaWdodFdoaWxlIiwidGFrZVdoaWxlIiwidGFwIiwidGhyb3R0bGUiLCJ0aHJ1IiwidGltZXMiLCJ0cmltQ2hhcnMiLCJ0cmltQ2hhcnNFbmQiLCJ0cmltQ2hhcnNTdGFydCIsInRydW5jYXRlIiwidW5pb24iLCJ1bmlxQnkiLCJ1bmlxV2l0aCIsInVuc2V0IiwidW56aXBXaXRoIiwid2l0aG91dCIsIndyYXAiLCJ4b3IiLCJ6aXAiLCJ6aXBPYmplY3QiLCJ6aXBPYmplY3REZWVwIl0sMzpbImFzc2lnbkluV2l0aCIsImFzc2lnbldpdGgiLCJjbGFtcCIsImRpZmZlcmVuY2VCeSIsImRpZmZlcmVuY2VXaXRoIiwiZmluZEZyb20iLCJmaW5kSW5kZXhGcm9tIiwiZmluZExhc3RGcm9tIiwiZmluZExhc3RJbmRleEZyb20iLCJnZXRPciIsImluY2x1ZGVzRnJvbSIsImluZGV4T2ZGcm9tIiwiaW5SYW5nZSIsImludGVyc2VjdGlvbkJ5IiwiaW50ZXJzZWN0aW9uV2l0aCIsImludm9rZUFyZ3MiLCJpbnZva2VBcmdzTWFwIiwiaXNFcXVhbFdpdGgiLCJpc01hdGNoV2l0aCIsImZsYXRNYXBEZXB0aCIsImxhc3RJbmRleE9mRnJvbSIsIm1lcmdlV2l0aCIsIm9yZGVyQnkiLCJwYWRDaGFycyIsInBhZENoYXJzRW5kIiwicGFkQ2hhcnNTdGFydCIsInB1bGxBbGxCeSIsInB1bGxBbGxXaXRoIiwicmFuZ2VTdGVwIiwicmFuZ2VTdGVwUmlnaHQiLCJyZWR1Y2UiLCJyZWR1Y2VSaWdodCIsInJlcGxhY2UiLCJzZXQiLCJzbGljZSIsInNvcnRlZEluZGV4QnkiLCJzb3J0ZWRMYXN0SW5kZXhCeSIsInRyYW5zZm9ybSIsInVuaW9uQnkiLCJ1bmlvbldpdGgiLCJ1cGRhdGUiLCJ4b3JCeSIsInhvcldpdGgiLCJ6aXBXaXRoIl0sNDpbImZpbGwiLCJzZXRXaXRoIiwidXBkYXRlV2l0aCJdfSxvLmFyeVJlYXJnPXsyOlsxLDBdLDM6WzIsMCwxXSw0OlszLDIsMCwxXX0sby5pdGVyYXRlZUFyeT17ZHJvcFJpZ2h0V2hpbGU6MSxkcm9wV2hpbGU6MSxldmVyeToxLGZpbHRlcjoxLGZpbmQ6MSxmaW5kRnJvbToxLGZpbmRJbmRleDoxLGZpbmRJbmRleEZyb206MSxmaW5kS2V5OjEsZmluZExhc3Q6MSxmaW5kTGFzdEZyb206MSxmaW5kTGFzdEluZGV4OjEsZmluZExhc3RJbmRleEZyb206MSxmaW5kTGFzdEtleToxLGZsYXRNYXA6MSxmbGF0TWFwRGVlcDoxLGZsYXRNYXBEZXB0aDoxLGZvckVhY2g6MSxmb3JFYWNoUmlnaHQ6MSxmb3JJbjoxLGZvckluUmlnaHQ6MSxmb3JPd246MSxmb3JPd25SaWdodDoxLG1hcDoxLG1hcEtleXM6MSxtYXBWYWx1ZXM6MSxwYXJ0aXRpb246MSxyZWR1Y2U6MixyZWR1Y2VSaWdodDoyLHJlamVjdDoxLHJlbW92ZToxLHNvbWU6MSx0YWtlUmlnaHRXaGlsZToxLHRha2VXaGlsZToxLHRpbWVzOjEsdHJhbnNmb3JtOjJ9LG8uaXRlcmF0ZWVSZWFyZz17bWFwS2V5czpbMV0scmVkdWNlUmlnaHQ6WzEsMF19LG8ubWV0aG9kUmVhcmc9e2Fzc2lnbkluQWxsV2l0aDpbMSwwXSxhc3NpZ25JbldpdGg6WzEsMiwwXSxhc3NpZ25BbGxXaXRoOlsxLDBdLGFzc2lnbldpdGg6WzEsMiwwXSxkaWZmZXJlbmNlQnk6WzEsMiwwXSxkaWZmZXJlbmNlV2l0aDpbMSwyLDBdLGdldE9yOlsyLDEsMF0saW50ZXJzZWN0aW9uQnk6WzEsMiwwXSxpbnRlcnNlY3Rpb25XaXRoOlsxLDIsMF0saXNFcXVhbFdpdGg6WzEsMiwwXSxpc01hdGNoV2l0aDpbMiwxLDBdLG1lcmdlQWxsV2l0aDpbMSwwXSxtZXJnZVdpdGg6WzEsMiwwXSxwYWRDaGFyczpbMiwxLDBdLHBhZENoYXJzRW5kOlsyLDEsMF0scGFkQ2hhcnNTdGFydDpbMiwxLDBdLHB1bGxBbGxCeTpbMiwxLDBdLHB1bGxBbGxXaXRoOlsyLDEsMF0scmFuZ2VTdGVwOlsxLDIsMF0scmFuZ2VTdGVwUmlnaHQ6WzEsMiwwXSxzZXRXaXRoOlszLDEsMiwwXSxzb3J0ZWRJbmRleEJ5OlsyLDEsMF0sc29ydGVkTGFzdEluZGV4Qnk6WzIsMSwwXSx1bmlvbkJ5OlsxLDIsMF0sdW5pb25XaXRoOlsxLDIsMF0sdXBkYXRlV2l0aDpbMywxLDIsMF0seG9yQnk6WzEsMiwwXSx4b3JXaXRoOlsxLDIsMF0semlwV2l0aDpbMSwyLDBdfSxvLm1ldGhvZFNwcmVhZD17YXNzaWduQWxsOntzdGFydDowfSxhc3NpZ25BbGxXaXRoOntzdGFydDowfSxhc3NpZ25JbkFsbDp7c3RhcnQ6MH0sYXNzaWduSW5BbGxXaXRoOntzdGFydDowfSxkZWZhdWx0c0FsbDp7c3RhcnQ6MH0sZGVmYXVsdHNEZWVwQWxsOntzdGFydDowfSxpbnZva2VBcmdzOntzdGFydDoyfSxpbnZva2VBcmdzTWFwOntzdGFydDoyfSxtZXJnZUFsbDp7c3RhcnQ6MH0sbWVyZ2VBbGxXaXRoOntzdGFydDowfSxwYXJ0aWFsOntzdGFydDoxfSxwYXJ0aWFsUmlnaHQ6e3N0YXJ0OjF9LHdpdGhvdXQ6e3N0YXJ0OjF9LHppcEFsbDp7c3RhcnQ6MH19LG8ubXV0YXRlPXthcnJheTp7ZmlsbDohMCxwdWxsOiEwLHB1bGxBbGw6ITAscHVsbEFsbEJ5OiEwLHB1bGxBbGxXaXRoOiEwLHB1bGxBdDohMCxyZW1vdmU6ITAscmV2ZXJzZTohMH0sb2JqZWN0Onthc3NpZ246ITAsYXNzaWduQWxsOiEwLGFzc2lnbkFsbFdpdGg6ITAsYXNzaWduSW46ITAsYXNzaWduSW5BbGw6ITAsYXNzaWduSW5BbGxXaXRoOiEwLGFzc2lnbkluV2l0aDohMCxhc3NpZ25XaXRoOiEwLGRlZmF1bHRzOiEwLGRlZmF1bHRzQWxsOiEwLGRlZmF1bHRzRGVlcDohMCxkZWZhdWx0c0RlZXBBbGw6ITAsbWVyZ2U6ITAsbWVyZ2VBbGw6ITAsbWVyZ2VBbGxXaXRoOiEwLG1lcmdlV2l0aDohMH0sc2V0OntzZXQ6ITAsc2V0V2l0aDohMCx1bnNldDohMCx1cGRhdGU6ITAsdXBkYXRlV2l0aDohMH19LG8ucmVhbFRvQWxpYXM9ZnVuY3Rpb24oKXt2YXIgcz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGk9by5hbGlhc1RvUmVhbCxhPXt9O2Zvcih2YXIgdSBpbiBpKXt2YXIgXz1pW3VdO3MuY2FsbChhLF8pP2FbX10ucHVzaCh1KTphW19dPVt1XX1yZXR1cm4gYX0oKSxvLnJlbWFwPXthc3NpZ25BbGw6ImFzc2lnbiIsYXNzaWduQWxsV2l0aDoiYXNzaWduV2l0aCIsYXNzaWduSW5BbGw6ImFzc2lnbkluIixhc3NpZ25JbkFsbFdpdGg6ImFzc2lnbkluV2l0aCIsY3VycnlOOiJjdXJyeSIsY3VycnlSaWdodE46ImN1cnJ5UmlnaHQiLGRlZmF1bHRzQWxsOiJkZWZhdWx0cyIsZGVmYXVsdHNEZWVwQWxsOiJkZWZhdWx0c0RlZXAiLGZpbmRGcm9tOiJmaW5kIixmaW5kSW5kZXhGcm9tOiJmaW5kSW5kZXgiLGZpbmRMYXN0RnJvbToiZmluZExhc3QiLGZpbmRMYXN0SW5kZXhGcm9tOiJmaW5kTGFzdEluZGV4IixnZXRPcjoiZ2V0IixpbmNsdWRlc0Zyb206ImluY2x1ZGVzIixpbmRleE9mRnJvbToiaW5kZXhPZiIsaW52b2tlQXJnczoiaW52b2tlIixpbnZva2VBcmdzTWFwOiJpbnZva2VNYXAiLGxhc3RJbmRleE9mRnJvbToibGFzdEluZGV4T2YiLG1lcmdlQWxsOiJtZXJnZSIsbWVyZ2VBbGxXaXRoOiJtZXJnZVdpdGgiLHBhZENoYXJzOiJwYWQiLHBhZENoYXJzRW5kOiJwYWRFbmQiLHBhZENoYXJzU3RhcnQ6InBhZFN0YXJ0Iixwcm9wZXJ0eU9mOiJnZXQiLHJhbmdlU3RlcDoicmFuZ2UiLHJhbmdlU3RlcFJpZ2h0OiJyYW5nZVJpZ2h0IixyZXN0RnJvbToicmVzdCIsc3ByZWFkRnJvbToic3ByZWFkIix0cmltQ2hhcnM6InRyaW0iLHRyaW1DaGFyc0VuZDoidHJpbUVuZCIsdHJpbUNoYXJzU3RhcnQ6InRyaW1TdGFydCIsemlwQWxsOiJ6aXAifSxvLnNraXBGaXhlZD17Y2FzdEFycmF5OiEwLGZsb3c6ITAsZmxvd1JpZ2h0OiEwLGl0ZXJhdGVlOiEwLG1peGluOiEwLHJlYXJnOiEwLHJ1bkluQ29udGV4dDohMH0sby5za2lwUmVhcmc9e2FkZDohMCxhc3NpZ246ITAsYXNzaWduSW46ITAsYmluZDohMCxiaW5kS2V5OiEwLGNvbmNhdDohMCxkaWZmZXJlbmNlOiEwLGRpdmlkZTohMCxlcTohMCxndDohMCxndGU6ITAsaXNFcXVhbDohMCxsdDohMCxsdGU6ITAsbWF0Y2hlc1Byb3BlcnR5OiEwLG1lcmdlOiEwLG11bHRpcGx5OiEwLG92ZXJBcmdzOiEwLHBhcnRpYWw6ITAscGFydGlhbFJpZ2h0OiEwLHByb3BlcnR5T2Y6ITAscmFuZG9tOiEwLHJhbmdlOiEwLHJhbmdlUmlnaHQ6ITAsc3VidHJhY3Q6ITAsemlwOiEwLHppcE9iamVjdDohMCx6aXBPYmplY3REZWVwOiEwfX0sNDc5MzQocyxvLGkpe3MuZXhwb3J0cz17YXJ5OmkoNjQ2MjYpLGFzc2lnbjppKDc0NzMzKSxjbG9uZTppKDMyNjI5KSxjdXJyeTppKDQ5NzQ3KSxmb3JFYWNoOmkoODM3MjkpLGlzQXJyYXk6aSg1NjQ0OSksaXNFcnJvcjppKDIzNTQ2KSxpc0Z1bmN0aW9uOmkoMTg4MiksaXNXZWFrTWFwOmkoNDc4ODYpLGl0ZXJhdGVlOmkoMzM4NTUpLGtleXM6aSg4ODk4NCkscmVhcmc6aSg4NDE5NSksdG9JbnRlZ2VyOmkoNjE0ODkpLHRvUGF0aDppKDQyMDcyKX19LDU2MzY3KHMsbyxpKXtzLmV4cG9ydHM9aSg3NzczMSl9LDc5OTIwKHMsbyxpKXt2YXIgYT1pKDczNDI0KSx1PWkoNDc5MzQpO3MuZXhwb3J0cz1mdW5jdGlvbiBjb252ZXJ0KHMsbyxpKXtyZXR1cm4gYSh1LHMsbyxpKX19LDI4NzQocyl7cy5leHBvcnRzPXt9fSw3NzczMShzLG8saSl7dmFyIGE9aSg3OTkyMCkoInNldCIsaSg2MzU2MCkpO2EucGxhY2Vob2xkZXI9aSgyODc0KSxzLmV4cG9ydHM9YX0sNTgxNTYocyxvLGkpe3ZhciBhPWkoNDc0MjIpO3MuZXhwb3J0cz1mdW5jdGlvbiBnZXQocyxvLGkpe3ZhciB1PW51bGw9PXM/dm9pZCAwOmEocyxvKTtyZXR1cm4gdm9pZCAwPT09dT9pOnV9fSw2MTQ0OChzLG8saSl7dmFyIGE9aSgyMDQyNiksdT1pKDQ5MzI2KTtzLmV4cG9ydHM9ZnVuY3Rpb24gaGFzKHMsbyl7cmV0dXJuIG51bGwhPXMmJnUocyxvLGEpfX0sODA2MzEocyxvLGkpe3ZhciBhPWkoMjgwNzcpLHU9aSg0OTMyNik7cy5leHBvcnRzPWZ1bmN0aW9uIGhhc0luKHMsbyl7cmV0dXJuIG51bGwhPXMmJnUocyxvLGEpfX0sODM0ODgocyl7cy5leHBvcnRzPWZ1bmN0aW9uIGlkZW50aXR5KHMpe3JldHVybiBzfX0sNzI0MjgocyxvLGkpe3ZhciBhPWkoMjc1MzQpLHU9aSg0MDM0NiksXz1PYmplY3QucHJvdG90eXBlLHc9Xy5oYXNPd25Qcm9wZXJ0eSx4PV8ucHJvcGVydHlJc0VudW1lcmFibGUsQz1hKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/YTpmdW5jdGlvbihzKXtyZXR1cm4gdShzKSYmdy5jYWxsKHMsImNhbGxlZSIpJiYheC5jYWxsKHMsImNhbGxlZSIpfTtzLmV4cG9ydHM9Q30sNTY0NDkocyl7dmFyIG89QXJyYXkuaXNBcnJheTtzLmV4cG9ydHM9b30sNjQ4OTQocyxvLGkpe3ZhciBhPWkoMTg4MiksdT1pKDMwMjk0KTtzLmV4cG9ydHM9ZnVuY3Rpb24gaXNBcnJheUxpa2Uocyl7cmV0dXJuIG51bGwhPXMmJnUocy5sZW5ndGgpJiYhYShzKX19LDgzNjkzKHMsbyxpKXt2YXIgYT1pKDY0ODk0KSx1PWkoNDAzNDYpO3MuZXhwb3J0cz1mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdChzKXtyZXR1cm4gdShzKSYmYShzKX19LDUzODEyKHMsbyxpKXt2YXIgYT1pKDcyNTUyKSx1PWkoNDAzNDYpO3MuZXhwb3J0cz1mdW5jdGlvbiBpc0Jvb2xlYW4ocyl7cmV0dXJuITA9PT1zfHwhMT09PXN8fHUocykmJiJbb2JqZWN0IEJvb2xlYW5dIj09YShzKX19LDM2NTYocyxvLGkpe3M9aS5ubWQocyk7dmFyIGE9aSg5MzI1KSx1PWkoODk5MzUpLF89byYmIW8ubm9kZVR5cGUmJm8sdz1fJiZzJiYhcy5ub2RlVHlwZSYmcyx4PXcmJncuZXhwb3J0cz09PV8/YS5CdWZmZXI6dm9pZCAwLEM9KHg/eC5pc0J1ZmZlcjp2b2lkIDApfHx1O3MuZXhwb3J0cz1DfSw2MjE5MyhzLG8saSl7dmFyIGE9aSg4ODk4NCksdT1pKDU4NjEpLF89aSg3MjQyOCksdz1pKDU2NDQ5KSx4PWkoNjQ4OTQpLEM9aSgzNjU2KSxqPWkoNTU1MjcpLEw9aSgzNzE2NyksQj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3MuZXhwb3J0cz1mdW5jdGlvbiBpc0VtcHR5KHMpe2lmKG51bGw9PXMpcmV0dXJuITA7aWYoeChzKSYmKHcocyl8fCJzdHJpbmciPT10eXBlb2Ygc3x8ImZ1bmN0aW9uIj09dHlwZW9mIHMuc3BsaWNlfHxDKHMpfHxMKHMpfHxfKHMpKSlyZXR1cm4hcy5sZW5ndGg7dmFyIG89dShzKTtpZigiW29iamVjdCBNYXBdIj09b3x8IltvYmplY3QgU2V0XSI9PW8pcmV0dXJuIXMuc2l6ZTtpZihqKHMpKXJldHVybiFhKHMpLmxlbmd0aDtmb3IodmFyIGkgaW4gcylpZihCLmNhbGwocyxpKSlyZXR1cm4hMTtyZXR1cm4hMH19LDI0MDQocyxvLGkpe3ZhciBhPWkoNjAyNzApO3MuZXhwb3J0cz1mdW5jdGlvbiBpc0VxdWFsKHMsbyl7cmV0dXJuIGEocyxvKX19LDIzNTQ2KHMsbyxpKXt2YXIgYT1pKDcyNTUyKSx1PWkoNDAzNDYpLF89aSgxMTMzMSk7cy5leHBvcnRzPWZ1bmN0aW9uIGlzRXJyb3Iocyl7aWYoIXUocykpcmV0dXJuITE7dmFyIG89YShzKTtyZXR1cm4iW29iamVjdCBFcnJvcl0iPT1vfHwiW29iamVjdCBET01FeGNlcHRpb25dIj09b3x8InN0cmluZyI9PXR5cGVvZiBzLm1lc3NhZ2UmJiJzdHJpbmciPT10eXBlb2Ygcy5uYW1lJiYhXyhzKX19LDE4ODIocyxvLGkpe3ZhciBhPWkoNzI1NTIpLHU9aSgyMzgwNSk7cy5leHBvcnRzPWZ1bmN0aW9uIGlzRnVuY3Rpb24ocyl7aWYoIXUocykpcmV0dXJuITE7dmFyIG89YShzKTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1vfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1vfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PW98fCJbb2JqZWN0IFByb3h5XSI9PW99fSwzMDI5NChzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gaXNMZW5ndGgocyl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBzJiZzPi0xJiZzJTE9PTAmJnM8PTkwMDcxOTkyNTQ3NDA5OTF9fSw4NzczMChzLG8saSl7dmFyIGE9aSgyOTE3MiksdT1pKDI3MzAxKSxfPWkoODYwMDkpLHc9XyYmXy5pc01hcCx4PXc/dSh3KTphO3MuZXhwb3J0cz14fSw1MTg3KHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBpc051bGwocyl7cmV0dXJuIG51bGw9PT1zfX0sOTgwMjMocyxvLGkpe3ZhciBhPWkoNzI1NTIpLHU9aSg0MDM0Nik7cy5leHBvcnRzPWZ1bmN0aW9uIGlzTnVtYmVyKHMpe3JldHVybiJudW1iZXIiPT10eXBlb2Ygc3x8dShzKSYmIltvYmplY3QgTnVtYmVyXSI9PWEocyl9fSwyMzgwNShzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gaXNPYmplY3Qocyl7dmFyIG89dHlwZW9mIHM7cmV0dXJuIG51bGwhPXMmJigib2JqZWN0Ij09b3x8ImZ1bmN0aW9uIj09byl9fSw0MDM0NihzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gaXNPYmplY3RMaWtlKHMpe3JldHVybiBudWxsIT1zJiYib2JqZWN0Ij09dHlwZW9mIHN9fSwxMTMzMShzLG8saSl7dmFyIGE9aSg3MjU1MiksdT1pKDI4ODc5KSxfPWkoNDAzNDYpLHc9RnVuY3Rpb24ucHJvdG90eXBlLHg9T2JqZWN0LnByb3RvdHlwZSxDPXcudG9TdHJpbmcsaj14Lmhhc093blByb3BlcnR5LEw9Qy5jYWxsKE9iamVjdCk7cy5leHBvcnRzPWZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qocyl7aWYoIV8ocyl8fCJbb2JqZWN0IE9iamVjdF0iIT1hKHMpKXJldHVybiExO3ZhciBvPXUocyk7aWYobnVsbD09PW8pcmV0dXJuITA7dmFyIGk9ai5jYWxsKG8sImNvbnN0cnVjdG9yIikmJm8uY29uc3RydWN0b3I7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGkmJmkgaW5zdGFuY2VvZiBpJiZDLmNhbGwoaSk9PUx9fSwzODQ0MChzLG8saSl7dmFyIGE9aSgxNjAzOCksdT1pKDI3MzAxKSxfPWkoODYwMDkpLHc9XyYmXy5pc1NldCx4PXc/dSh3KTphO3MuZXhwb3J0cz14fSw4NTAxNShzLG8saSl7dmFyIGE9aSg3MjU1MiksdT1pKDU2NDQ5KSxfPWkoNDAzNDYpO3MuZXhwb3J0cz1mdW5jdGlvbiBpc1N0cmluZyhzKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHN8fCF1KHMpJiZfKHMpJiYiW29iamVjdCBTdHJpbmddIj09YShzKX19LDQ0Mzk0KHMsbyxpKXt2YXIgYT1pKDcyNTUyKSx1PWkoNDAzNDYpO3MuZXhwb3J0cz1mdW5jdGlvbiBpc1N5bWJvbChzKXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHN8fHUocykmJiJbb2JqZWN0IFN5bWJvbF0iPT1hKHMpfX0sMzcxNjcocyxvLGkpe3ZhciBhPWkoNDkwMSksdT1pKDI3MzAxKSxfPWkoODYwMDkpLHc9XyYmXy5pc1R5cGVkQXJyYXkseD13P3Uodyk6YTtzLmV4cG9ydHM9eH0sNDc4ODYocyxvLGkpe3ZhciBhPWkoNTg2MSksdT1pKDQwMzQ2KTtzLmV4cG9ydHM9ZnVuY3Rpb24gaXNXZWFrTWFwKHMpe3JldHVybiB1KHMpJiYiW29iamVjdCBXZWFrTWFwXSI9PWEocyl9fSwzMzg1NShzLG8saSl7dmFyIGE9aSg5OTk5KSx1PWkoMTUzODkpO3MuZXhwb3J0cz1mdW5jdGlvbiBpdGVyYXRlZShzKXtyZXR1cm4gdSgiZnVuY3Rpb24iPT10eXBlb2Ygcz9zOmEocywxKSl9fSw5NTk1MChzLG8saSl7dmFyIGE9aSg3MDY5NSksdT1pKDg4OTg0KSxfPWkoNjQ4OTQpO3MuZXhwb3J0cz1mdW5jdGlvbiBrZXlzKHMpe3JldHVybiBfKHMpP2Eocyk6dShzKX19LDM3MjQxKHMsbyxpKXt2YXIgYT1pKDcwNjk1KSx1PWkoNzI5MDMpLF89aSg2NDg5NCk7cy5leHBvcnRzPWZ1bmN0aW9uIGtleXNJbihzKXtyZXR1cm4gXyhzKT9hKHMsITApOnUocyl9fSw2ODA5MChzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gbGFzdChzKXt2YXIgbz1udWxsPT1zPzA6cy5sZW5ndGg7cmV0dXJuIG8/c1tvLTFdOnZvaWQgMH19LDUwMTA0KHMsbyxpKXt2YXIgYT1pKDUzNjYxKTtmdW5jdGlvbiBtZW1vaXplKHMsbyl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHN8fG51bGwhPW8mJiJmdW5jdGlvbiIhPXR5cGVvZiBvKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgbWVtb2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHMsYT1vP28uYXBwbHkodGhpcyxpKTppWzBdLHU9bWVtb2l6ZWQuY2FjaGU7aWYodS5oYXMoYSkpcmV0dXJuIHUuZ2V0KGEpO3ZhciBfPXMuYXBwbHkodGhpcyxpKTtyZXR1cm4gbWVtb2l6ZWQuY2FjaGU9dS5zZXQoYSxfKXx8dSxffTtyZXR1cm4gbWVtb2l6ZWQuY2FjaGU9bmV3KG1lbW9pemUuQ2FjaGV8fGEpLG1lbW9pemVkfW1lbW9pemUuQ2FjaGU9YSxzLmV4cG9ydHM9bWVtb2l6ZX0sNTUzNjQocyxvLGkpe3ZhciBhPWkoODUyNTApLHU9aSgyMDk5OSkoKGZ1bmN0aW9uKHMsbyxpKXthKHMsbyxpKX0pKTtzLmV4cG9ydHM9dX0sNjA0OChzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gbmVnYXRlKHMpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBzKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1hcmd1bWVudHM7c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIXMuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXMuY2FsbCh0aGlzLG9bMF0pO2Nhc2UgMjpyZXR1cm4hcy5jYWxsKHRoaXMsb1swXSxvWzFdKTtjYXNlIDM6cmV0dXJuIXMuY2FsbCh0aGlzLG9bMF0sb1sxXSxvWzJdKX1yZXR1cm4hcy5hcHBseSh0aGlzLG8pfX19LDYzOTUwKHMpe3MuZXhwb3J0cz1mdW5jdGlvbiBub29wKCl7fX0sMTAxMjQocyxvLGkpe3ZhciBhPWkoOTMyNSk7cy5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJuIGEuRGF0ZS5ub3coKX19LDkwMTc5KHMsbyxpKXt2YXIgYT1pKDM0OTMyKSx1PWkoOTk5OSksXz1pKDE5OTMxKSx3PWkoMzE3NjkpLHg9aSgyMTc5MSksQz1pKDUzMTM4KSxqPWkoMzg4MTYpLEw9aSg4MzM0OSksQj1qKChmdW5jdGlvbihzLG8pe3ZhciBpPXt9O2lmKG51bGw9PXMpcmV0dXJuIGk7dmFyIGo9ITE7bz1hKG8sKGZ1bmN0aW9uKG8pe3JldHVybiBvPXcobyxzKSxqfHwoaj1vLmxlbmd0aD4xKSxvfSkpLHgocyxMKHMpLGkpLGomJihpPXUoaSw3LEMpKTtmb3IodmFyIEI9by5sZW5ndGg7Qi0tOylfKGksb1tCXSk7cmV0dXJuIGl9KSk7cy5leHBvcnRzPUJ9LDUwNTgzKHMsbyxpKXt2YXIgYT1pKDQ3MjM3KSx1PWkoMTcyNTUpLF89aSgyODU4Niksdz1pKDc3Nzk3KTtzLmV4cG9ydHM9ZnVuY3Rpb24gcHJvcGVydHkocyl7cmV0dXJuIF8ocyk/YSh3KHMpKTp1KHMpfX0sODQxOTUocyxvLGkpe3ZhciBhPWkoNjY5NzcpLHU9aSgzODgxNiksXz11KChmdW5jdGlvbihzLG8pe3JldHVybiBhKHMsMjU2LHZvaWQgMCx2b2lkIDAsdm9pZCAwLG8pfSkpO3MuZXhwb3J0cz1ffSw0MDg2MChzLG8saSl7dmFyIGE9aSg0MDg4MiksdT1pKDgwOTA5KSxfPWkoMTUzODkpLHc9aSg4NTU1OCkseD1pKDU2NDQ5KTtzLmV4cG9ydHM9ZnVuY3Rpb24gcmVkdWNlKHMsbyxpKXt2YXIgQz14KHMpP2E6dyxqPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gQyhzLF8obyw0KSxpLGosdSl9fSw2MzU2MChzLG8saSl7dmFyIGE9aSg3MzE3MCk7cy5leHBvcnRzPWZ1bmN0aW9uIHNldChzLG8saSl7cmV0dXJuIG51bGw9PXM/czphKHMsbyxpKX19LDQyNDI2KHMsbyxpKXt2YXIgYT1pKDE0MjQ4KSx1PWkoMTUzODkpLF89aSg5MDkxNiksdz1pKDU2NDQ5KSx4PWkoMzY4MDApO3MuZXhwb3J0cz1mdW5jdGlvbiBzb21lKHMsbyxpKXt2YXIgQz13KHMpP2E6XztyZXR1cm4gaSYmeChzLG8saSkmJihvPXZvaWQgMCksQyhzLHUobywzKSl9fSw2MzM0NShzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gc3R1YkFycmF5KCl7cmV0dXJuW119fSw4OTkzNShzKXtzLmV4cG9ydHM9ZnVuY3Rpb24gc3R1YkZhbHNlKCl7cmV0dXJuITF9fSwxNzQwMChzLG8saSl7dmFyIGE9aSg5OTM3NCksdT0xLzA7cy5leHBvcnRzPWZ1bmN0aW9uIHRvRmluaXRlKHMpe3JldHVybiBzPyhzPWEocykpPT09dXx8cz09PS0xLzA/MTc5NzY5MzEzNDg2MjMxNTdlMjkyKihzPDA/LTE6MSk6cz09cz9zOjA6MD09PXM/czowfX0sNjE0ODkocyxvLGkpe3ZhciBhPWkoMTc0MDApO3MuZXhwb3J0cz1mdW5jdGlvbiB0b0ludGVnZXIocyl7dmFyIG89YShzKSxpPW8lMTtyZXR1cm4gbz09bz9pP28taTpvOjB9fSw4MDIxOChzLG8saSl7dmFyIGE9aSgxMzIyMik7cy5leHBvcnRzPWZ1bmN0aW9uIHRvTG93ZXIocyl7cmV0dXJuIGEocykudG9Mb3dlckNhc2UoKX19LDk5Mzc0KHMsbyxpKXt2YXIgYT1pKDU0MTI4KSx1PWkoMjM4MDUpLF89aSg0NDM5NCksdz0vXlstK10weFswLTlhLWZdKyQvaSx4PS9eMGJbMDFdKyQvaSxDPS9eMG9bMC03XSskL2ksaj1wYXJzZUludDtzLmV4cG9ydHM9ZnVuY3Rpb24gdG9OdW1iZXIocyl7aWYoIm51bWJlciI9PXR5cGVvZiBzKXJldHVybiBzO2lmKF8ocykpcmV0dXJuIE5hTjtpZih1KHMpKXt2YXIgbz0iZnVuY3Rpb24iPT10eXBlb2Ygcy52YWx1ZU9mP3MudmFsdWVPZigpOnM7cz11KG8pP28rIiI6b31pZigic3RyaW5nIiE9dHlwZW9mIHMpcmV0dXJuIDA9PT1zP3M6K3M7cz1hKHMpO3ZhciBpPXgudGVzdChzKTtyZXR1cm4gaXx8Qy50ZXN0KHMpP2oocy5zbGljZSgyKSxpPzI6OCk6dy50ZXN0KHMpP05hTjorc319LDQyMDcyKHMsbyxpKXt2YXIgYT1pKDM0OTMyKSx1PWkoMjMwMDcpLF89aSg1NjQ0OSksdz1pKDQ0Mzk0KSx4PWkoNjE4MDIpLEM9aSg3Nzc5Nyksaj1pKDEzMjIyKTtzLmV4cG9ydHM9ZnVuY3Rpb24gdG9QYXRoKHMpe3JldHVybiBfKHMpP2EocyxDKTp3KHMpP1tzXTp1KHgoaihzKSkpfX0sNjk4ODQocyxvLGkpe3ZhciBhPWkoMjE3OTEpLHU9aSgzNzI0MSk7cy5leHBvcnRzPWZ1bmN0aW9uIHRvUGxhaW5PYmplY3Qocyl7cmV0dXJuIGEocyx1KHMpKX19LDEzMjIyKHMsbyxpKXt2YXIgYT1pKDc3NTU2KTtzLmV4cG9ydHM9ZnVuY3Rpb24gdG9TdHJpbmcocyl7cmV0dXJuIG51bGw9PXM/IiI6YShzKX19LDU1ODA4KHMsbyxpKXt2YXIgYT1pKDEyNTA3KSgidG9VcHBlckNhc2UiKTtzLmV4cG9ydHM9YX0sNjY2NDUocyxvLGkpe3ZhciBhPWkoMTczMyksdT1pKDQ1NDM0KSxfPWkoMTMyMjIpLHc9aSgyMjIyNSk7cy5leHBvcnRzPWZ1bmN0aW9uIHdvcmRzKHMsbyxpKXtyZXR1cm4gcz1fKHMpLHZvaWQgMD09PShvPWk/dm9pZCAwOm8pP3Uocyk/dyhzKTphKHMpOnMubWF0Y2gobyl8fFtdfX0sNTM3NTgocyxvLGkpe3ZhciBhPWkoMzA5ODApLHU9aSg1NjAxNyksXz1pKDk0MDMzKSx3PWkoNTY0NDkpLHg9aSg0MDM0NiksQz1pKDgwMjU3KSxqPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gbG9kYXNoKHMpe2lmKHgocykmJiF3KHMpJiYhKHMgaW5zdGFuY2VvZiBhKSl7aWYocyBpbnN0YW5jZW9mIHUpcmV0dXJuIHM7aWYoai5jYWxsKHMsIl9fd3JhcHBlZF9fIikpcmV0dXJuIEMocyl9cmV0dXJuIG5ldyB1KHMpfWxvZGFzaC5wcm90b3R5cGU9Xy5wcm90b3R5cGUsbG9kYXNoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1sb2Rhc2gscy5leHBvcnRzPWxvZGFzaH0sNDcyNDgocyxvLGkpe3ZhciBhPWkoMTY1NDcpLHU9aSg1MTIzNCk7cy5leHBvcnRzPWZ1bmN0aW9uIHppcE9iamVjdChzLG8pe3JldHVybiB1KHN8fFtdLG98fFtdLGEpfX0sNDM3NjgocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQ1OTgxKSx1PWkoODU1ODcpO28uaGlnaGxpZ2h0PWhpZ2hsaWdodCxvLmhpZ2hsaWdodEF1dG89ZnVuY3Rpb24gaGlnaGxpZ2h0QXV0byhzLG8pe3ZhciBpLHcseCxDLGo9b3x8e30sTD1qLnN1YnNldHx8YS5saXN0TGFuZ3VhZ2VzKCksQj1qLnByZWZpeCwkPUwubGVuZ3RoLFU9LTE7bnVsbD09QiYmKEI9Xyk7aWYoInN0cmluZyIhPXR5cGVvZiBzKXRocm93IHUoIkV4cGVjdGVkIGBzdHJpbmdgIGZvciB2YWx1ZSwgZ290IGAlc2AiLHMpO3c9e3JlbGV2YW5jZTowLGxhbmd1YWdlOm51bGwsdmFsdWU6W119LGk9e3JlbGV2YW5jZTowLGxhbmd1YWdlOm51bGwsdmFsdWU6W119O2Zvcig7KytVPCQ7KUM9TFtVXSxhLmdldExhbmd1YWdlKEMpJiYoKHg9aGlnaGxpZ2h0KEMscyxvKSkubGFuZ3VhZ2U9Qyx4LnJlbGV2YW5jZT53LnJlbGV2YW5jZSYmKHc9eCkseC5yZWxldmFuY2U+aS5yZWxldmFuY2UmJih3PWksaT14KSk7dy5sYW5ndWFnZSYmKGkuc2Vjb25kQmVzdD13KTtyZXR1cm4gaX0sby5yZWdpc3Rlckxhbmd1YWdlPWZ1bmN0aW9uIHJlZ2lzdGVyTGFuZ3VhZ2UocyxvKXthLnJlZ2lzdGVyTGFuZ3VhZ2UocyxvKX0sby5saXN0TGFuZ3VhZ2VzPWZ1bmN0aW9uIGxpc3RMYW5ndWFnZXMoKXtyZXR1cm4gYS5saXN0TGFuZ3VhZ2VzKCl9LG8ucmVnaXN0ZXJBbGlhcz1mdW5jdGlvbiByZWdpc3RlckFsaWFzKHMsbyl7dmFyIGksdT1zO28mJigodT17fSlbc109byk7Zm9yKGkgaW4gdSlhLnJlZ2lzdGVyQWxpYXNlcyh1W2ldLHtsYW5ndWFnZU5hbWU6aX0pfSxFbWl0dGVyLnByb3RvdHlwZS5hZGRUZXh0PWZ1bmN0aW9uIHRleHQocyl7dmFyIG8saSxhPXRoaXMuc3RhY2s7aWYoIiI9PT1zKXJldHVybjtvPWFbYS5sZW5ndGgtMV0sKGk9by5jaGlsZHJlbltvLmNoaWxkcmVuLmxlbmd0aC0xXSkmJiJ0ZXh0Ij09PWkudHlwZT9pLnZhbHVlKz1zOm8uY2hpbGRyZW4ucHVzaCh7dHlwZToidGV4dCIsdmFsdWU6c30pfSxFbWl0dGVyLnByb3RvdHlwZS5hZGRLZXl3b3JkPWZ1bmN0aW9uIGFkZEtleXdvcmQocyxvKXt0aGlzLm9wZW5Ob2RlKG8pLHRoaXMuYWRkVGV4dChzKSx0aGlzLmNsb3NlTm9kZSgpfSxFbWl0dGVyLnByb3RvdHlwZS5hZGRTdWJsYW5ndWFnZT1mdW5jdGlvbiBhZGRTdWJsYW5ndWFnZShzLG8pe3ZhciBpPXRoaXMuc3RhY2ssYT1pW2kubGVuZ3RoLTFdLHU9cy5yb290Tm9kZS5jaGlsZHJlbixfPW8/e3R5cGU6ImVsZW1lbnQiLHRhZ05hbWU6InNwYW4iLHByb3BlcnRpZXM6e2NsYXNzTmFtZTpbb119LGNoaWxkcmVuOnV9OnU7YS5jaGlsZHJlbj1hLmNoaWxkcmVuLmNvbmNhdChfKX0sRW1pdHRlci5wcm90b3R5cGUub3Blbk5vZGU9ZnVuY3Rpb24gb3BlbihzKXt2YXIgbz10aGlzLnN0YWNrLGk9dGhpcy5vcHRpb25zLmNsYXNzUHJlZml4K3MsYT1vW28ubGVuZ3RoLTFdLHU9e3R5cGU6ImVsZW1lbnQiLHRhZ05hbWU6InNwYW4iLHByb3BlcnRpZXM6e2NsYXNzTmFtZTpbaV19LGNoaWxkcmVuOltdfTthLmNoaWxkcmVuLnB1c2godSksby5wdXNoKHUpfSxFbWl0dGVyLnByb3RvdHlwZS5jbG9zZU5vZGU9ZnVuY3Rpb24gY2xvc2UoKXt0aGlzLnN0YWNrLnBvcCgpfSxFbWl0dGVyLnByb3RvdHlwZS5jbG9zZUFsbE5vZGVzPW5vb3AsRW1pdHRlci5wcm90b3R5cGUuZmluYWxpemU9bm9vcCxFbWl0dGVyLnByb3RvdHlwZS50b0hUTUw9ZnVuY3Rpb24gdG9IdG1sTm9vcCgpe3JldHVybiIifTt2YXIgXz0iaGxqcy0iO2Z1bmN0aW9uIGhpZ2hsaWdodChzLG8saSl7dmFyIHcseD1hLmNvbmZpZ3VyZSh7fSksQz0oaXx8e30pLnByZWZpeDtpZigic3RyaW5nIiE9dHlwZW9mIHMpdGhyb3cgdSgiRXhwZWN0ZWQgYHN0cmluZ2AgZm9yIG5hbWUsIGdvdCBgJXNgIixzKTtpZighYS5nZXRMYW5ndWFnZShzKSl0aHJvdyB1KCJVbmtub3duIGxhbmd1YWdlOiBgJXNgIGlzIG5vdCByZWdpc3RlcmVkIixzKTtpZigic3RyaW5nIiE9dHlwZW9mIG8pdGhyb3cgdSgiRXhwZWN0ZWQgYHN0cmluZ2AgZm9yIHZhbHVlLCBnb3QgYCVzYCIsbyk7aWYobnVsbD09QyYmKEM9XyksYS5jb25maWd1cmUoe19fZW1pdHRlcjpFbWl0dGVyLGNsYXNzUHJlZml4OkN9KSx3PWEuaGlnaGxpZ2h0KG8se2xhbmd1YWdlOnMsaWdub3JlSWxsZWdhbHM6ITB9KSxhLmNvbmZpZ3VyZSh4fHx7fSksdy5lcnJvclJhaXNlZCl0aHJvdyB3LmVycm9yUmFpc2VkO3JldHVybntyZWxldmFuY2U6dy5yZWxldmFuY2UsbGFuZ3VhZ2U6dy5sYW5ndWFnZSx2YWx1ZTp3LmVtaXR0ZXIucm9vdE5vZGUuY2hpbGRyZW59fWZ1bmN0aW9uIEVtaXR0ZXIocyl7dGhpcy5vcHRpb25zPXMsdGhpcy5yb290Tm9kZT17Y2hpbGRyZW46W119LHRoaXMuc3RhY2s9W3RoaXMucm9vdE5vZGVdfWZ1bmN0aW9uIG5vb3AoKXt9fSw3MTUxNChzKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPU1hdGguYWJzfSw1ODk2OChzKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPU1hdGguZmxvb3J9LDk0NDU5KHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9TnVtYmVyLmlzTmFOfHxmdW5jdGlvbiBpc05hTihzKXtyZXR1cm4gcyE9c319LDYxODgocyl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz1NYXRoLm1heH0sNjgwMDIocyl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz1NYXRoLm1pbn0sNzU4ODAocyl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz1NYXRoLnBvd30sNzA0MTQocyl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz1NYXRoLnJvdW5kfSw3MzA5MyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoOTQ0NTkpO3MuZXhwb3J0cz1mdW5jdGlvbiBzaWduKHMpe3JldHVybiBhKHMpfHwwPT09cz9zOnM8MD8tMToxfX0sOTIzNDAocyxvLGkpe2NvbnN0IGE9aSg2MDQ4KTtmdW5jdGlvbiBjb2VyY2VFbGVtZW50TWF0Y2hpbmdDYWxsYmFjayhzKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHM/bz0+by5lbGVtZW50PT09czpzLmNvbnN0cnVjdG9yJiZzLmV4dGVuZD9vPT5vIGluc3RhbmNlb2YgczpzfWNsYXNzIEFycmF5U2xpY2V7Y29uc3RydWN0b3Iocyl7dGhpcy5lbGVtZW50cz1zfHxbXX10b1ZhbHVlKCl7cmV0dXJuIHRoaXMuZWxlbWVudHMubWFwKChzPT5zLnRvVmFsdWUoKSkpfW1hcChzLG8pe3JldHVybiB0aGlzLmVsZW1lbnRzLm1hcChzLG8pfWZsYXRNYXAocyxvKXtyZXR1cm4gdGhpcy5tYXAocyxvKS5yZWR1Y2UoKChzLG8pPT5zLmNvbmNhdChvKSksW10pfWNvbXBhY3RNYXAocyxvKXtjb25zdCBpPVtdO3JldHVybiB0aGlzLmZvckVhY2goKGE9Pntjb25zdCB1PXMuYmluZChvKShhKTt1JiZpLnB1c2godSl9KSksaX1maWx0ZXIocyxvKXtyZXR1cm4gcz1jb2VyY2VFbGVtZW50TWF0Y2hpbmdDYWxsYmFjayhzKSxuZXcgQXJyYXlTbGljZSh0aGlzLmVsZW1lbnRzLmZpbHRlcihzLG8pKX1yZWplY3QocyxvKXtyZXR1cm4gcz1jb2VyY2VFbGVtZW50TWF0Y2hpbmdDYWxsYmFjayhzKSxuZXcgQXJyYXlTbGljZSh0aGlzLmVsZW1lbnRzLmZpbHRlcihhKHMpLG8pKX1maW5kKHMsbyl7cmV0dXJuIHM9Y29lcmNlRWxlbWVudE1hdGNoaW5nQ2FsbGJhY2socyksdGhpcy5lbGVtZW50cy5maW5kKHMsbyl9Zm9yRWFjaChzLG8pe3RoaXMuZWxlbWVudHMuZm9yRWFjaChzLG8pfXJlZHVjZShzLG8pe3JldHVybiB0aGlzLmVsZW1lbnRzLnJlZHVjZShzLG8pfWluY2x1ZGVzKHMpe3JldHVybiB0aGlzLmVsZW1lbnRzLnNvbWUoKG89Pm8uZXF1YWxzKHMpKSl9c2hpZnQoKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5zaGlmdCgpfXVuc2hpZnQocyl7dGhpcy5lbGVtZW50cy51bnNoaWZ0KHRoaXMucmVmcmFjdChzKSl9cHVzaChzKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5wdXNoKHRoaXMucmVmcmFjdChzKSksdGhpc31hZGQocyl7dGhpcy5wdXNoKHMpfWdldChzKXtyZXR1cm4gdGhpcy5lbGVtZW50c1tzXX1nZXRWYWx1ZShzKXtjb25zdCBvPXRoaXMuZWxlbWVudHNbc107aWYobylyZXR1cm4gby50b1ZhbHVlKCl9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmVsZW1lbnRzLmxlbmd0aH1nZXQgaXNFbXB0eSgpe3JldHVybiAwPT09dGhpcy5lbGVtZW50cy5sZW5ndGh9Z2V0IGZpcnN0KCl7cmV0dXJuIHRoaXMuZWxlbWVudHNbMF19fSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiYoQXJyYXlTbGljZS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbiBzeW1ib2woKXtyZXR1cm4gdGhpcy5lbGVtZW50c1tTeW1ib2wuaXRlcmF0b3JdKCl9KSxzLmV4cG9ydHM9QXJyYXlTbGljZX0sNTU5NzMocyl7Y2xhc3MgS2V5VmFsdWVQYWlye2NvbnN0cnVjdG9yKHMsbyl7dGhpcy5rZXk9cyx0aGlzLnZhbHVlPW99Y2xvbmUoKXtjb25zdCBzPW5ldyBLZXlWYWx1ZVBhaXI7cmV0dXJuIHRoaXMua2V5JiYocy5rZXk9dGhpcy5rZXkuY2xvbmUoKSksdGhpcy52YWx1ZSYmKHMudmFsdWU9dGhpcy52YWx1ZS5jbG9uZSgpKSxzfX1zLmV4cG9ydHM9S2V5VmFsdWVQYWlyfSwzMTEwKHMsbyxpKXtjb25zdCBhPWkoNTE4NyksdT1pKDg1MDE1KSxfPWkoOTgwMjMpLHc9aSg1MzgxMikseD1pKDIzODA1KSxDPWkoODUxMDUpLGo9aSg4NjgwNCk7Y2xhc3MgTmFtZXNwYWNle2NvbnN0cnVjdG9yKHMpe3RoaXMuZWxlbWVudE1hcD17fSx0aGlzLmVsZW1lbnREZXRlY3Rpb249W10sdGhpcy5FbGVtZW50PWouRWxlbWVudCx0aGlzLktleVZhbHVlUGFpcj1qLktleVZhbHVlUGFpcixzJiZzLm5vRGVmYXVsdHx8dGhpcy51c2VEZWZhdWx0KCksdGhpcy5fYXR0cmlidXRlRWxlbWVudEtleXM9W10sdGhpcy5fYXR0cmlidXRlRWxlbWVudEFycmF5S2V5cz1bXX11c2Uocyl7cmV0dXJuIHMubmFtZXNwYWNlJiZzLm5hbWVzcGFjZSh7YmFzZTp0aGlzfSkscy5sb2FkJiZzLmxvYWQoe2Jhc2U6dGhpc30pLHRoaXN9dXNlRGVmYXVsdCgpe3JldHVybiB0aGlzLnJlZ2lzdGVyKCJudWxsIixqLk51bGxFbGVtZW50KS5yZWdpc3Rlcigic3RyaW5nIixqLlN0cmluZ0VsZW1lbnQpLnJlZ2lzdGVyKCJudW1iZXIiLGouTnVtYmVyRWxlbWVudCkucmVnaXN0ZXIoImJvb2xlYW4iLGouQm9vbGVhbkVsZW1lbnQpLnJlZ2lzdGVyKCJhcnJheSIsai5BcnJheUVsZW1lbnQpLnJlZ2lzdGVyKCJvYmplY3QiLGouT2JqZWN0RWxlbWVudCkucmVnaXN0ZXIoIm1lbWJlciIsai5NZW1iZXJFbGVtZW50KS5yZWdpc3RlcigicmVmIixqLlJlZkVsZW1lbnQpLnJlZ2lzdGVyKCJsaW5rIixqLkxpbmtFbGVtZW50KSx0aGlzLmRldGVjdChhLGouTnVsbEVsZW1lbnQsITEpLmRldGVjdCh1LGouU3RyaW5nRWxlbWVudCwhMSkuZGV0ZWN0KF8sai5OdW1iZXJFbGVtZW50LCExKS5kZXRlY3QodyxqLkJvb2xlYW5FbGVtZW50LCExKS5kZXRlY3QoQXJyYXkuaXNBcnJheSxqLkFycmF5RWxlbWVudCwhMSkuZGV0ZWN0KHgsai5PYmplY3RFbGVtZW50LCExKSx0aGlzfXJlZ2lzdGVyKHMsbyl7cmV0dXJuIHRoaXMuX2VsZW1lbnRzPXZvaWQgMCx0aGlzLmVsZW1lbnRNYXBbc109byx0aGlzfXVucmVnaXN0ZXIocyl7cmV0dXJuIHRoaXMuX2VsZW1lbnRzPXZvaWQgMCxkZWxldGUgdGhpcy5lbGVtZW50TWFwW3NdLHRoaXN9ZGV0ZWN0KHMsbyxpKXtyZXR1cm4gdm9pZCAwPT09aXx8aT90aGlzLmVsZW1lbnREZXRlY3Rpb24udW5zaGlmdChbcyxvXSk6dGhpcy5lbGVtZW50RGV0ZWN0aW9uLnB1c2goW3Msb10pLHRoaXN9dG9FbGVtZW50KHMpe2lmKHMgaW5zdGFuY2VvZiB0aGlzLkVsZW1lbnQpcmV0dXJuIHM7bGV0IG87Zm9yKGxldCBpPTA7aTx0aGlzLmVsZW1lbnREZXRlY3Rpb24ubGVuZ3RoO2krPTEpe2NvbnN0IGE9dGhpcy5lbGVtZW50RGV0ZWN0aW9uW2ldWzBdLHU9dGhpcy5lbGVtZW50RGV0ZWN0aW9uW2ldWzFdO2lmKGEocykpe289bmV3IHUocyk7YnJlYWt9fXJldHVybiBvfWdldEVsZW1lbnRDbGFzcyhzKXtjb25zdCBvPXRoaXMuZWxlbWVudE1hcFtzXTtyZXR1cm4gdm9pZCAwPT09bz90aGlzLkVsZW1lbnQ6b31mcm9tUmVmcmFjdChzKXtyZXR1cm4gdGhpcy5zZXJpYWxpc2VyLmRlc2VyaWFsaXNlKHMpfXRvUmVmcmFjdChzKXtyZXR1cm4gdGhpcy5zZXJpYWxpc2VyLnNlcmlhbGlzZShzKX1nZXQgZWxlbWVudHMoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5fZWxlbWVudHMmJih0aGlzLl9lbGVtZW50cz17RWxlbWVudDp0aGlzLkVsZW1lbnR9LE9iamVjdC5rZXlzKHRoaXMuZWxlbWVudE1hcCkuZm9yRWFjaCgocz0+e2NvbnN0IG89c1swXS50b1VwcGVyQ2FzZSgpK3Muc3Vic3RyKDEpO3RoaXMuX2VsZW1lbnRzW29dPXRoaXMuZWxlbWVudE1hcFtzXX0pKSksdGhpcy5fZWxlbWVudHN9Z2V0IHNlcmlhbGlzZXIoKXtyZXR1cm4gbmV3IEModGhpcyl9fUMucHJvdG90eXBlLk5hbWVzcGFjZT1OYW1lc3BhY2Uscy5leHBvcnRzPU5hbWVzcGFjZX0sMTA4NjYocyxvLGkpe2NvbnN0IGE9aSg2MDQ4KSx1PWkoOTIzNDApO2NsYXNzIE9iamVjdFNsaWNlIGV4dGVuZHMgdXttYXAocyxvKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5tYXAoKGk9PnMuYmluZChvKShpLnZhbHVlLGkua2V5LGkpKSl9ZmlsdGVyKHMsbyl7cmV0dXJuIG5ldyBPYmplY3RTbGljZSh0aGlzLmVsZW1lbnRzLmZpbHRlcigoaT0+cy5iaW5kKG8pKGkudmFsdWUsaS5rZXksaSkpKSl9cmVqZWN0KHMsbyl7cmV0dXJuIHRoaXMuZmlsdGVyKGEocy5iaW5kKG8pKSl9Zm9yRWFjaChzLG8pe3JldHVybiB0aGlzLmVsZW1lbnRzLmZvckVhY2goKChpLGEpPT57cy5iaW5kKG8pKGkudmFsdWUsaS5rZXksaSxhKX0pKX1rZXlzKCl7cmV0dXJuIHRoaXMubWFwKCgocyxvKT0+by50b1ZhbHVlKCkpKX12YWx1ZXMoKXtyZXR1cm4gdGhpcy5tYXAoKHM9PnMudG9WYWx1ZSgpKSl9fXMuZXhwb3J0cz1PYmplY3RTbGljZX0sODY4MDQocyxvLGkpe2NvbnN0IGE9aSgxMDMxNiksdT1pKDQxMDY3KSxfPWkoNzExNjcpLHc9aSg0MDIzOSkseD1pKDEyMjQyKSxDPWkoNjIzMyksaj1pKDg3NzI2KSxMPWkoNjEwNDUpLEI9aSg4NjMwMyksJD1pKDE0NTQwKSxVPWkoOTIzNDApLFY9aSgxMDg2Niksej1pKDU1OTczKTtmdW5jdGlvbiByZWZyYWN0KHMpe2lmKHMgaW5zdGFuY2VvZiBhKXJldHVybiBzO2lmKCJzdHJpbmciPT10eXBlb2YgcylyZXR1cm4gbmV3IF8ocyk7aWYoIm51bWJlciI9PXR5cGVvZiBzKXJldHVybiBuZXcgdyhzKTtpZigiYm9vbGVhbiI9PXR5cGVvZiBzKXJldHVybiBuZXcgeChzKTtpZihudWxsPT09cylyZXR1cm4gbmV3IHU7aWYoQXJyYXkuaXNBcnJheShzKSlyZXR1cm4gbmV3IEMocy5tYXAocmVmcmFjdCkpO2lmKCJvYmplY3QiPT10eXBlb2Ygcyl7cmV0dXJuIG5ldyBMKHMpfXJldHVybiBzfWEucHJvdG90eXBlLk9iamVjdEVsZW1lbnQ9TCxhLnByb3RvdHlwZS5SZWZFbGVtZW50PSQsYS5wcm90b3R5cGUuTWVtYmVyRWxlbWVudD1qLGEucHJvdG90eXBlLnJlZnJhY3Q9cmVmcmFjdCxVLnByb3RvdHlwZS5yZWZyYWN0PXJlZnJhY3Qscy5leHBvcnRzPXtFbGVtZW50OmEsTnVsbEVsZW1lbnQ6dSxTdHJpbmdFbGVtZW50Ol8sTnVtYmVyRWxlbWVudDp3LEJvb2xlYW5FbGVtZW50OngsQXJyYXlFbGVtZW50OkMsTWVtYmVyRWxlbWVudDpqLE9iamVjdEVsZW1lbnQ6TCxMaW5rRWxlbWVudDpCLFJlZkVsZW1lbnQ6JCxyZWZyYWN0LEFycmF5U2xpY2U6VSxPYmplY3RTbGljZTpWLEtleVZhbHVlUGFpcjp6fX0sODYzMDMocyxvLGkpe2NvbnN0IGE9aSgxMDMxNik7cy5leHBvcnRzPWNsYXNzIExpbmtFbGVtZW50IGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIoc3x8W10sbyxpKSx0aGlzLmVsZW1lbnQ9ImxpbmsifWdldCByZWxhdGlvbigpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuZ2V0KCJyZWxhdGlvbiIpfXNldCByZWxhdGlvbihzKXt0aGlzLmF0dHJpYnV0ZXMuc2V0KCJyZWxhdGlvbiIscyl9Z2V0IGhyZWYoKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmdldCgiaHJlZiIpfXNldCBocmVmKHMpe3RoaXMuYXR0cmlidXRlcy5zZXQoImhyZWYiLHMpfX19LDE0NTQwKHMsbyxpKXtjb25zdCBhPWkoMTAzMTYpO3MuZXhwb3J0cz1jbGFzcyBSZWZFbGVtZW50IGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIoc3x8W10sbyxpKSx0aGlzLmVsZW1lbnQ9InJlZiIsdGhpcy5wYXRofHwodGhpcy5wYXRoPSJlbGVtZW50Iil9Z2V0IHBhdGgoKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmdldCgicGF0aCIpfXNldCBwYXRoKHMpe3RoaXMuYXR0cmlidXRlcy5zZXQoInBhdGgiLHMpfX19LDM0MDM1KHMsbyxpKXtjb25zdCBhPWkoMzExMCksdT1pKDg2ODA0KTtvLmckPWEsby5LZXlWYWx1ZVBhaXI9aSg1NTk3Myksby5HNj11LkFycmF5U2xpY2Usby5vdD11Lk9iamVjdFNsaWNlLG8uSGc9dS5FbGVtZW50LG8uT209dS5TdHJpbmdFbGVtZW50LG8ua1Q9dS5OdW1iZXJFbGVtZW50LG8uYmQ9dS5Cb29sZWFuRWxlbWVudCxvLk9zPXUuTnVsbEVsZW1lbnQsby53RT11LkFycmF5RWxlbWVudCxvLlNoPXUuT2JqZWN0RWxlbWVudCxvLlByPXUuTWVtYmVyRWxlbWVudCxvLnNJPXUuUmVmRWxlbWVudCxvLkZ0PXUuTGlua0VsZW1lbnQsby5lPXUucmVmcmFjdCxpKDg1MTA1KSxpKDc1MTQ3KX0sNjIzMyhzLG8saSl7Y29uc3QgYT1pKDYwNDgpLHU9aSgxMDMxNiksXz1pKDkyMzQwKTtjbGFzcyBBcnJheUVsZW1lbnQgZXh0ZW5kcyB1e2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzfHxbXSxvLGkpLHRoaXMuZWxlbWVudD0iYXJyYXkifXByaW1pdGl2ZSgpe3JldHVybiJhcnJheSJ9Z2V0KHMpe3JldHVybiB0aGlzLmNvbnRlbnRbc119Z2V0VmFsdWUocyl7Y29uc3Qgbz10aGlzLmdldChzKTtpZihvKXJldHVybiBvLnRvVmFsdWUoKX1nZXRJbmRleChzKXtyZXR1cm4gdGhpcy5jb250ZW50W3NdfXNldChzLG8pe3JldHVybiB0aGlzLmNvbnRlbnRbc109dGhpcy5yZWZyYWN0KG8pLHRoaXN9cmVtb3ZlKHMpe2NvbnN0IG89dGhpcy5jb250ZW50LnNwbGljZShzLDEpO3JldHVybiBvLmxlbmd0aD9vWzBdOm51bGx9bWFwKHMsbyl7cmV0dXJuIHRoaXMuY29udGVudC5tYXAocyxvKX1mbGF0TWFwKHMsbyl7cmV0dXJuIHRoaXMubWFwKHMsbykucmVkdWNlKCgocyxvKT0+cy5jb25jYXQobykpLFtdKX1jb21wYWN0TWFwKHMsbyl7Y29uc3QgaT1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKChhPT57Y29uc3QgdT1zLmJpbmQobykoYSk7dSYmaS5wdXNoKHUpfSkpLGl9ZmlsdGVyKHMsbyl7cmV0dXJuIG5ldyBfKHRoaXMuY29udGVudC5maWx0ZXIocyxvKSl9cmVqZWN0KHMsbyl7cmV0dXJuIHRoaXMuZmlsdGVyKGEocyksbyl9cmVkdWNlKHMsbyl7bGV0IGksYTt2b2lkIDAhPT1vPyhpPTAsYT10aGlzLnJlZnJhY3QobykpOihpPTEsYT0ib2JqZWN0Ij09PXRoaXMucHJpbWl0aXZlKCk/dGhpcy5maXJzdC52YWx1ZTp0aGlzLmZpcnN0KTtmb3IobGV0IG89aTtvPHRoaXMubGVuZ3RoO28rPTEpe2NvbnN0IGk9dGhpcy5jb250ZW50W29dO2E9Im9iamVjdCI9PT10aGlzLnByaW1pdGl2ZSgpP3RoaXMucmVmcmFjdChzKGEsaS52YWx1ZSxpLmtleSxpLHRoaXMpKTp0aGlzLnJlZnJhY3QocyhhLGksbyx0aGlzKSl9cmV0dXJuIGF9Zm9yRWFjaChzLG8pe3RoaXMuY29udGVudC5mb3JFYWNoKCgoaSxhKT0+e3MuYmluZChvKShpLHRoaXMucmVmcmFjdChhKSl9KSl9c2hpZnQoKXtyZXR1cm4gdGhpcy5jb250ZW50LnNoaWZ0KCl9dW5zaGlmdChzKXt0aGlzLmNvbnRlbnQudW5zaGlmdCh0aGlzLnJlZnJhY3QocykpfXB1c2gocyl7cmV0dXJuIHRoaXMuY29udGVudC5wdXNoKHRoaXMucmVmcmFjdChzKSksdGhpc31hZGQocyl7dGhpcy5wdXNoKHMpfWZpbmRFbGVtZW50cyhzLG8pe2NvbnN0IGk9b3x8e30sYT0hIWkucmVjdXJzaXZlLHU9dm9pZCAwPT09aS5yZXN1bHRzP1tdOmkucmVzdWx0cztyZXR1cm4gdGhpcy5mb3JFYWNoKCgobyxpLF8pPT57YSYmdm9pZCAwIT09by5maW5kRWxlbWVudHMmJm8uZmluZEVsZW1lbnRzKHMse3Jlc3VsdHM6dSxyZWN1cnNpdmU6YX0pLHMobyxpLF8pJiZ1LnB1c2gobyl9KSksdX1maW5kKHMpe3JldHVybiBuZXcgXyh0aGlzLmZpbmRFbGVtZW50cyhzLHtyZWN1cnNpdmU6ITB9KSl9ZmluZEJ5RWxlbWVudChzKXtyZXR1cm4gdGhpcy5maW5kKChvPT5vLmVsZW1lbnQ9PT1zKSl9ZmluZEJ5Q2xhc3Mocyl7cmV0dXJuIHRoaXMuZmluZCgobz0+by5jbGFzc2VzLmluY2x1ZGVzKHMpKSl9Z2V0QnlJZChzKXtyZXR1cm4gdGhpcy5maW5kKChvPT5vLmlkLnRvVmFsdWUoKT09PXMpKS5maXJzdH1pbmNsdWRlcyhzKXtyZXR1cm4gdGhpcy5jb250ZW50LnNvbWUoKG89Pm8uZXF1YWxzKHMpKSl9Y29udGFpbnMocyl7cmV0dXJuIHRoaXMuaW5jbHVkZXMocyl9ZW1wdHkoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoW10pfSJmYW50YXN5LWxhbmQvZW1wdHkiKCl7cmV0dXJuIHRoaXMuZW1wdHkoKX1jb25jYXQocyl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuY29udGVudC5jb25jYXQocy5jb250ZW50KSl9ImZhbnRhc3ktbGFuZC9jb25jYXQiKHMpe3JldHVybiB0aGlzLmNvbmNhdChzKX0iZmFudGFzeS1sYW5kL21hcCIocyl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubWFwKHMpKX0iZmFudGFzeS1sYW5kL2NoYWluIihzKXtyZXR1cm4gdGhpcy5tYXAoKG89PnMobykpLHRoaXMpLnJlZHVjZSgoKHMsbyk9PnMuY29uY2F0KG8pKSx0aGlzLmVtcHR5KCkpfSJmYW50YXN5LWxhbmQvZmlsdGVyIihzKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5jb250ZW50LmZpbHRlcihzKSl9ImZhbnRhc3ktbGFuZC9yZWR1Y2UiKHMsbyl7cmV0dXJuIHRoaXMuY29udGVudC5yZWR1Y2UocyxvKX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGh9Z2V0IGlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMuY29udGVudC5sZW5ndGh9Z2V0IGZpcnN0KCl7cmV0dXJuIHRoaXMuZ2V0SW5kZXgoMCl9Z2V0IHNlY29uZCgpe3JldHVybiB0aGlzLmdldEluZGV4KDEpfWdldCBsYXN0KCl7cmV0dXJuIHRoaXMuZ2V0SW5kZXgodGhpcy5sZW5ndGgtMSl9fUFycmF5RWxlbWVudC5lbXB0eT1mdW5jdGlvbiBlbXB0eSgpe3JldHVybiBuZXcgdGhpc30sQXJyYXlFbGVtZW50WyJmYW50YXN5LWxhbmQvZW1wdHkiXT1BcnJheUVsZW1lbnQuZW1wdHksInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJihBcnJheUVsZW1lbnQucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24gc3ltYm9sKCl7cmV0dXJuIHRoaXMuY29udGVudFtTeW1ib2wuaXRlcmF0b3JdKCl9KSxzLmV4cG9ydHM9QXJyYXlFbGVtZW50fSwxMjI0MihzLG8saSl7Y29uc3QgYT1pKDEwMzE2KTtzLmV4cG9ydHM9Y2xhc3MgQm9vbGVhbkVsZW1lbnQgZXh0ZW5kcyBhe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJib29sZWFuIn1wcmltaXRpdmUoKXtyZXR1cm4iYm9vbGVhbiJ9fX0sMTAzMTYocyxvLGkpe2NvbnN0IGE9aSgyNDA0KSx1PWkoNTU5NzMpLF89aSg5MjM0MCk7Y2xhc3MgRWxlbWVudHtjb25zdHJ1Y3RvcihzLG8saSl7byYmKHRoaXMubWV0YT1vKSxpJiYodGhpcy5hdHRyaWJ1dGVzPWkpLHRoaXMuY29udGVudD1zfWZyZWV6ZSgpe09iamVjdC5pc0Zyb3plbih0aGlzKXx8KHRoaXMuX21ldGEmJih0aGlzLm1ldGEucGFyZW50PXRoaXMsdGhpcy5tZXRhLmZyZWV6ZSgpKSx0aGlzLl9hdHRyaWJ1dGVzJiYodGhpcy5hdHRyaWJ1dGVzLnBhcmVudD10aGlzLHRoaXMuYXR0cmlidXRlcy5mcmVlemUoKSksdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChzPT57cy5wYXJlbnQ9dGhpcyxzLmZyZWV6ZSgpfSksdGhpcyksdGhpcy5jb250ZW50JiZBcnJheS5pc0FycmF5KHRoaXMuY29udGVudCkmJk9iamVjdC5mcmVlemUodGhpcy5jb250ZW50KSxPYmplY3QuZnJlZXplKHRoaXMpKX1wcmltaXRpdmUoKXt9Y2xvbmUoKXtjb25zdCBzPW5ldyB0aGlzLmNvbnN0cnVjdG9yO3JldHVybiBzLmVsZW1lbnQ9dGhpcy5lbGVtZW50LHRoaXMubWV0YS5sZW5ndGgmJihzLl9tZXRhPXRoaXMubWV0YS5jbG9uZSgpKSx0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoJiYocy5fYXR0cmlidXRlcz10aGlzLmF0dHJpYnV0ZXMuY2xvbmUoKSksdGhpcy5jb250ZW50P3RoaXMuY29udGVudC5jbG9uZT9zLmNvbnRlbnQ9dGhpcy5jb250ZW50LmNsb25lKCk6QXJyYXkuaXNBcnJheSh0aGlzLmNvbnRlbnQpP3MuY29udGVudD10aGlzLmNvbnRlbnQubWFwKChzPT5zLmNsb25lKCkpKTpzLmNvbnRlbnQ9dGhpcy5jb250ZW50OnMuY29udGVudD10aGlzLmNvbnRlbnQsc310b1ZhbHVlKCl7cmV0dXJuIHRoaXMuY29udGVudCBpbnN0YW5jZW9mIEVsZW1lbnQ/dGhpcy5jb250ZW50LnRvVmFsdWUoKTp0aGlzLmNvbnRlbnQgaW5zdGFuY2VvZiB1P3trZXk6dGhpcy5jb250ZW50LmtleS50b1ZhbHVlKCksdmFsdWU6dGhpcy5jb250ZW50LnZhbHVlP3RoaXMuY29udGVudC52YWx1ZS50b1ZhbHVlKCk6dm9pZCAwfTp0aGlzLmNvbnRlbnQmJnRoaXMuY29udGVudC5tYXA/dGhpcy5jb250ZW50Lm1hcCgocz0+cy50b1ZhbHVlKCkpLHRoaXMpOnRoaXMuY29udGVudH10b1JlZihzKXtpZigiIj09PXRoaXMuaWQudG9WYWx1ZSgpKXRocm93IEVycm9yKCJDYW5ub3QgY3JlYXRlIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50IHRoYXQgZG9lcyBub3QgY29udGFpbiBhbiBJRCIpO2NvbnN0IG89bmV3IHRoaXMuUmVmRWxlbWVudCh0aGlzLmlkLnRvVmFsdWUoKSk7cmV0dXJuIHMmJihvLnBhdGg9cyksb31maW5kUmVjdXJzaXZlKC4uLnMpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSYmIXRoaXMuaXNGcm96ZW4pdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZmluZCByZWN1cnNpdmUgd2l0aCBtdWx0aXBsZSBlbGVtZW50IG5hbWVzIHdpdGhvdXQgZmlyc3QgZnJlZXppbmcgdGhlIGVsZW1lbnQuIENhbGwgYGVsZW1lbnQuZnJlZXplKClgIik7Y29uc3Qgbz1zLnBvcCgpO2xldCBpPW5ldyBfO2NvbnN0IGFwcGVuZD0ocyxvKT0+KHMucHVzaChvKSxzKSxjaGVja0VsZW1lbnQ9KHMsaSk9PntpLmVsZW1lbnQ9PT1vJiZzLnB1c2goaSk7Y29uc3QgYT1pLmZpbmRSZWN1cnNpdmUobyk7cmV0dXJuIGEmJmEucmVkdWNlKGFwcGVuZCxzKSxpLmNvbnRlbnQgaW5zdGFuY2VvZiB1JiYoaS5jb250ZW50LmtleSYmY2hlY2tFbGVtZW50KHMsaS5jb250ZW50LmtleSksaS5jb250ZW50LnZhbHVlJiZjaGVja0VsZW1lbnQocyxpLmNvbnRlbnQudmFsdWUpKSxzfTtyZXR1cm4gdGhpcy5jb250ZW50JiYodGhpcy5jb250ZW50LmVsZW1lbnQmJmNoZWNrRWxlbWVudChpLHRoaXMuY29udGVudCksQXJyYXkuaXNBcnJheSh0aGlzLmNvbnRlbnQpJiZ0aGlzLmNvbnRlbnQucmVkdWNlKGNoZWNrRWxlbWVudCxpKSkscy5pc0VtcHR5fHwoaT1pLmZpbHRlcigobz0+e2xldCBpPW8ucGFyZW50cy5tYXAoKHM9PnMuZWxlbWVudCkpO2Zvcihjb25zdCBvIGluIHMpe2NvbnN0IGE9c1tvXSx1PWkuaW5kZXhPZihhKTtpZigtMT09PXUpcmV0dXJuITE7aT1pLnNwbGljZSgwLHUpfXJldHVybiEwfSkpKSxpfXNldChzKXtyZXR1cm4gdGhpcy5jb250ZW50PXMsdGhpc31lcXVhbHMocyl7cmV0dXJuIGEodGhpcy50b1ZhbHVlKCkscyl9Z2V0TWV0YVByb3BlcnR5KHMsbyl7aWYoIXRoaXMubWV0YS5oYXNLZXkocykpe2lmKHRoaXMuaXNGcm96ZW4pe2NvbnN0IHM9dGhpcy5yZWZyYWN0KG8pO3JldHVybiBzLmZyZWV6ZSgpLHN9dGhpcy5tZXRhLnNldChzLG8pfXJldHVybiB0aGlzLm1ldGEuZ2V0KHMpfXNldE1ldGFQcm9wZXJ0eShzLG8pe3RoaXMubWV0YS5zZXQocyxvKX1nZXQgZWxlbWVudCgpe3JldHVybiB0aGlzLl9zdG9yZWRFbGVtZW50fHwiZWxlbWVudCJ9c2V0IGVsZW1lbnQocyl7dGhpcy5fc3RvcmVkRWxlbWVudD1zfWdldCBjb250ZW50KCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9c2V0IGNvbnRlbnQocyl7aWYocyBpbnN0YW5jZW9mIEVsZW1lbnQpdGhpcy5fY29udGVudD1zO2Vsc2UgaWYocyBpbnN0YW5jZW9mIF8pdGhpcy5jb250ZW50PXMuZWxlbWVudHM7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIHN8fCJudW1iZXIiPT10eXBlb2Ygc3x8ImJvb2xlYW4iPT10eXBlb2Ygc3x8Im51bGwiPT09c3x8bnVsbD09cyl0aGlzLl9jb250ZW50PXM7ZWxzZSBpZihzIGluc3RhbmNlb2YgdSl0aGlzLl9jb250ZW50PXM7ZWxzZSBpZihBcnJheS5pc0FycmF5KHMpKXRoaXMuX2NvbnRlbnQ9cy5tYXAodGhpcy5yZWZyYWN0KTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2Ygcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgY29udGVudCB0byBnaXZlbiB2YWx1ZSIpO3RoaXMuX2NvbnRlbnQ9T2JqZWN0LmtleXMocykubWFwKChvPT5uZXcgdGhpcy5NZW1iZXJFbGVtZW50KG8sc1tvXSkpKX19Z2V0IG1ldGEoKXtpZighdGhpcy5fbWV0YSl7aWYodGhpcy5pc0Zyb3plbil7Y29uc3Qgcz1uZXcgdGhpcy5PYmplY3RFbGVtZW50O3JldHVybiBzLmZyZWV6ZSgpLHN9dGhpcy5fbWV0YT1uZXcgdGhpcy5PYmplY3RFbGVtZW50fXJldHVybiB0aGlzLl9tZXRhfXNldCBtZXRhKHMpe3MgaW5zdGFuY2VvZiB0aGlzLk9iamVjdEVsZW1lbnQ/dGhpcy5fbWV0YT1zOnRoaXMubWV0YS5zZXQoc3x8e30pfWdldCBhdHRyaWJ1dGVzKCl7aWYoIXRoaXMuX2F0dHJpYnV0ZXMpe2lmKHRoaXMuaXNGcm96ZW4pe2NvbnN0IHM9bmV3IHRoaXMuT2JqZWN0RWxlbWVudDtyZXR1cm4gcy5mcmVlemUoKSxzfXRoaXMuX2F0dHJpYnV0ZXM9bmV3IHRoaXMuT2JqZWN0RWxlbWVudH1yZXR1cm4gdGhpcy5fYXR0cmlidXRlc31zZXQgYXR0cmlidXRlcyhzKXtzIGluc3RhbmNlb2YgdGhpcy5PYmplY3RFbGVtZW50P3RoaXMuX2F0dHJpYnV0ZXM9czp0aGlzLmF0dHJpYnV0ZXMuc2V0KHN8fHt9KX1nZXQgaWQoKXtyZXR1cm4gdGhpcy5nZXRNZXRhUHJvcGVydHkoImlkIiwiIil9c2V0IGlkKHMpe3RoaXMuc2V0TWV0YVByb3BlcnR5KCJpZCIscyl9Z2V0IGNsYXNzZXMoKXtyZXR1cm4gdGhpcy5nZXRNZXRhUHJvcGVydHkoImNsYXNzZXMiLFtdKX1zZXQgY2xhc3NlcyhzKXt0aGlzLnNldE1ldGFQcm9wZXJ0eSgiY2xhc3NlcyIscyl9Z2V0IHRpdGxlKCl7cmV0dXJuIHRoaXMuZ2V0TWV0YVByb3BlcnR5KCJ0aXRsZSIsIiIpfXNldCB0aXRsZShzKXt0aGlzLnNldE1ldGFQcm9wZXJ0eSgidGl0bGUiLHMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLmdldE1ldGFQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCIiKX1zZXQgZGVzY3JpcHRpb24ocyl7dGhpcy5zZXRNZXRhUHJvcGVydHkoImRlc2NyaXB0aW9uIixzKX1nZXQgbGlua3MoKXtyZXR1cm4gdGhpcy5nZXRNZXRhUHJvcGVydHkoImxpbmtzIixbXSl9c2V0IGxpbmtzKHMpe3RoaXMuc2V0TWV0YVByb3BlcnR5KCJsaW5rcyIscyl9Z2V0IGlzRnJvemVuKCl7cmV0dXJuIE9iamVjdC5pc0Zyb3plbih0aGlzKX1nZXQgcGFyZW50cygpe2xldHtwYXJlbnQ6c309dGhpcztjb25zdCBvPW5ldyBfO2Zvcig7czspby5wdXNoKHMpLHM9cy5wYXJlbnQ7cmV0dXJuIG99Z2V0IGNoaWxkcmVuKCl7aWYoQXJyYXkuaXNBcnJheSh0aGlzLmNvbnRlbnQpKXJldHVybiBuZXcgXyh0aGlzLmNvbnRlbnQpO2lmKHRoaXMuY29udGVudCBpbnN0YW5jZW9mIHUpe2NvbnN0IHM9bmV3IF8oW3RoaXMuY29udGVudC5rZXldKTtyZXR1cm4gdGhpcy5jb250ZW50LnZhbHVlJiZzLnB1c2godGhpcy5jb250ZW50LnZhbHVlKSxzfXJldHVybiB0aGlzLmNvbnRlbnQgaW5zdGFuY2VvZiBFbGVtZW50P25ldyBfKFt0aGlzLmNvbnRlbnRdKTpuZXcgX31nZXQgcmVjdXJzaXZlQ2hpbGRyZW4oKXtjb25zdCBzPW5ldyBfO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goKG89PntzLnB1c2gobyksby5yZWN1cnNpdmVDaGlsZHJlbi5mb3JFYWNoKChvPT57cy5wdXNoKG8pfSkpfSkpLHN9fXMuZXhwb3J0cz1FbGVtZW50fSw4NzcyNihzLG8saSl7Y29uc3QgYT1pKDU1OTczKSx1PWkoMTAzMTYpO3MuZXhwb3J0cz1jbGFzcyBNZW1iZXJFbGVtZW50IGV4dGVuZHMgdXtjb25zdHJ1Y3RvcihzLG8saSx1KXtzdXBlcihuZXcgYSxpLHUpLHRoaXMuZWxlbWVudD0ibWVtYmVyIix0aGlzLmtleT1zLHRoaXMudmFsdWU9b31nZXQga2V5KCl7cmV0dXJuIHRoaXMuY29udGVudC5rZXl9c2V0IGtleShzKXt0aGlzLmNvbnRlbnQua2V5PXRoaXMucmVmcmFjdChzKX1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5jb250ZW50LnZhbHVlfXNldCB2YWx1ZShzKXt0aGlzLmNvbnRlbnQudmFsdWU9dGhpcy5yZWZyYWN0KHMpfX19LDQxMDY3KHMsbyxpKXtjb25zdCBhPWkoMTAzMTYpO3MuZXhwb3J0cz1jbGFzcyBOdWxsRWxlbWVudCBleHRlbmRzIGF7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHN8fG51bGwsbyxpKSx0aGlzLmVsZW1lbnQ9Im51bGwifXByaW1pdGl2ZSgpe3JldHVybiJudWxsIn1zZXQoKXtyZXR1cm4gbmV3IEVycm9yKCJDYW5ub3Qgc2V0IHRoZSB2YWx1ZSBvZiBudWxsIil9fX0sNDAyMzkocyxvLGkpe2NvbnN0IGE9aSgxMDMxNik7cy5leHBvcnRzPWNsYXNzIE51bWJlckVsZW1lbnQgZXh0ZW5kcyBhe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJudW1iZXIifXByaW1pdGl2ZSgpe3JldHVybiJudW1iZXIifX19LDYxMDQ1KHMsbyxpKXtjb25zdCBhPWkoNjA0OCksdT1pKDIzODA1KSxfPWkoNjIzMyksdz1pKDg3NzI2KSx4PWkoMTA4NjYpO3MuZXhwb3J0cz1jbGFzcyBPYmplY3RFbGVtZW50IGV4dGVuZHMgX3tjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIoc3x8W10sbyxpKSx0aGlzLmVsZW1lbnQ9Im9iamVjdCJ9cHJpbWl0aXZlKCl7cmV0dXJuIm9iamVjdCJ9dG9WYWx1ZSgpe3JldHVybiB0aGlzLmNvbnRlbnQucmVkdWNlKCgocyxvKT0+KHNbby5rZXkudG9WYWx1ZSgpXT1vLnZhbHVlP28udmFsdWUudG9WYWx1ZSgpOnZvaWQgMCxzKSkse30pfWdldChzKXtjb25zdCBvPXRoaXMuZ2V0TWVtYmVyKHMpO2lmKG8pcmV0dXJuIG8udmFsdWV9Z2V0TWVtYmVyKHMpe2lmKHZvaWQgMCE9PXMpcmV0dXJuIHRoaXMuY29udGVudC5maW5kKChvPT5vLmtleS50b1ZhbHVlKCk9PT1zKSl9cmVtb3ZlKHMpe2xldCBvPW51bGw7cmV0dXJuIHRoaXMuY29udGVudD10aGlzLmNvbnRlbnQuZmlsdGVyKChpPT5pLmtleS50b1ZhbHVlKCkhPT1zfHwobz1pLCExKSkpLG99Z2V0S2V5KHMpe2NvbnN0IG89dGhpcy5nZXRNZW1iZXIocyk7aWYobylyZXR1cm4gby5rZXl9c2V0KHMsbyl7aWYodShzKSlyZXR1cm4gT2JqZWN0LmtleXMocykuZm9yRWFjaCgobz0+e3RoaXMuc2V0KG8sc1tvXSl9KSksdGhpcztjb25zdCBpPXMsYT10aGlzLmdldE1lbWJlcihpKTtyZXR1cm4gYT9hLnZhbHVlPW86dGhpcy5jb250ZW50LnB1c2gobmV3IHcoaSxvKSksdGhpc31rZXlzKCl7cmV0dXJuIHRoaXMuY29udGVudC5tYXAoKHM9PnMua2V5LnRvVmFsdWUoKSkpfXZhbHVlcygpe3JldHVybiB0aGlzLmNvbnRlbnQubWFwKChzPT5zLnZhbHVlLnRvVmFsdWUoKSkpfWhhc0tleShzKXtyZXR1cm4gdGhpcy5jb250ZW50LnNvbWUoKG89Pm8ua2V5LmVxdWFscyhzKSkpfWl0ZW1zKCl7cmV0dXJuIHRoaXMuY29udGVudC5tYXAoKHM9PltzLmtleS50b1ZhbHVlKCkscy52YWx1ZS50b1ZhbHVlKCldKSl9bWFwKHMsbyl7cmV0dXJuIHRoaXMuY29udGVudC5tYXAoKGk9PnMuYmluZChvKShpLnZhbHVlLGkua2V5LGkpKSl9Y29tcGFjdE1hcChzLG8pe2NvbnN0IGk9W107cmV0dXJuIHRoaXMuZm9yRWFjaCgoKGEsdSxfKT0+e2NvbnN0IHc9cy5iaW5kKG8pKGEsdSxfKTt3JiZpLnB1c2godyl9KSksaX1maWx0ZXIocyxvKXtyZXR1cm4gbmV3IHgodGhpcy5jb250ZW50KS5maWx0ZXIocyxvKX1yZWplY3QocyxvKXtyZXR1cm4gdGhpcy5maWx0ZXIoYShzKSxvKX1mb3JFYWNoKHMsbyl7cmV0dXJuIHRoaXMuY29udGVudC5mb3JFYWNoKChpPT5zLmJpbmQobykoaS52YWx1ZSxpLmtleSxpKSkpfX19LDcxMTY3KHMsbyxpKXtjb25zdCBhPWkoMTAzMTYpO3MuZXhwb3J0cz1jbGFzcyBTdHJpbmdFbGVtZW50IGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ic3RyaW5nIn1wcmltaXRpdmUoKXtyZXR1cm4ic3RyaW5nIn1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuY29udGVudC5sZW5ndGh9fX0sNzUxNDcocyxvLGkpe2NvbnN0IGE9aSg4NTEwNSk7cy5leHBvcnRzPWNsYXNzIEpTT04wNlNlcmlhbGlzZXIgZXh0ZW5kcyBhe3NlcmlhbGlzZShzKXtpZighKHMgaW5zdGFuY2VvZiB0aGlzLm5hbWVzcGFjZS5lbGVtZW50cy5FbGVtZW50KSl0aHJvdyBuZXcgVHlwZUVycm9yKGBHaXZlbiBlbGVtZW50IFxgJHtzfVxgIGlzIG5vdCBhbiBFbGVtZW50IGluc3RhbmNlYCk7bGV0IG87cy5fYXR0cmlidXRlcyYmcy5hdHRyaWJ1dGVzLmdldCgidmFyaWFibGUiKSYmKG89cy5hdHRyaWJ1dGVzLmdldCgidmFyaWFibGUiKSk7Y29uc3QgaT17ZWxlbWVudDpzLmVsZW1lbnR9O3MuX21ldGEmJnMuX21ldGEubGVuZ3RoPjAmJihpLm1ldGE9dGhpcy5zZXJpYWxpc2VPYmplY3Qocy5tZXRhKSk7Y29uc3QgYT0iZW51bSI9PT1zLmVsZW1lbnR8fC0xIT09cy5hdHRyaWJ1dGVzLmtleXMoKS5pbmRleE9mKCJlbnVtZXJhdGlvbnMiKTtpZihhKXtjb25zdCBvPXRoaXMuZW51bVNlcmlhbGlzZUF0dHJpYnV0ZXMocyk7byYmKGkuYXR0cmlidXRlcz1vKX1lbHNlIGlmKHMuX2F0dHJpYnV0ZXMmJnMuX2F0dHJpYnV0ZXMubGVuZ3RoPjApe2xldHthdHRyaWJ1dGVzOmF9PXM7YS5nZXQoIm1ldGFkYXRhIikmJihhPWEuY2xvbmUoKSxhLnNldCgibWV0YSIsYS5nZXQoIm1ldGFkYXRhIikpLGEucmVtb3ZlKCJtZXRhZGF0YSIpKSwibWVtYmVyIj09PXMuZWxlbWVudCYmbyYmKGE9YS5jbG9uZSgpLGEucmVtb3ZlKCJ2YXJpYWJsZSIpKSxhLmxlbmd0aD4wJiYoaS5hdHRyaWJ1dGVzPXRoaXMuc2VyaWFsaXNlT2JqZWN0KGEpKX1pZihhKWkuY29udGVudD10aGlzLmVudW1TZXJpYWxpc2VDb250ZW50KHMsaSk7ZWxzZSBpZih0aGlzW2Ake3MuZWxlbWVudH1TZXJpYWxpc2VDb250ZW50YF0paS5jb250ZW50PXRoaXNbYCR7cy5lbGVtZW50fVNlcmlhbGlzZUNvbnRlbnRgXShzLGkpO2Vsc2UgaWYodm9pZCAwIT09cy5jb250ZW50KXtsZXQgYTtvJiZzLmNvbnRlbnQua2V5PyhhPXMuY29udGVudC5jbG9uZSgpLGEua2V5LmF0dHJpYnV0ZXMuc2V0KCJ2YXJpYWJsZSIsbyksYT10aGlzLnNlcmlhbGlzZUNvbnRlbnQoYSkpOmE9dGhpcy5zZXJpYWxpc2VDb250ZW50KHMuY29udGVudCksdGhpcy5zaG91bGRTZXJpYWxpc2VDb250ZW50KHMsYSkmJihpLmNvbnRlbnQ9YSl9ZWxzZSB0aGlzLnNob3VsZFNlcmlhbGlzZUNvbnRlbnQocyxzLmNvbnRlbnQpJiZzIGluc3RhbmNlb2YgdGhpcy5uYW1lc3BhY2UuZWxlbWVudHMuQXJyYXkmJihpLmNvbnRlbnQ9W10pO3JldHVybiBpfXNob3VsZFNlcmlhbGlzZUNvbnRlbnQocyxvKXtyZXR1cm4icGFyc2VSZXN1bHQiPT09cy5lbGVtZW50fHwiaHR0cFJlcXVlc3QiPT09cy5lbGVtZW50fHwiaHR0cFJlc3BvbnNlIj09PXMuZWxlbWVudHx8ImNhdGVnb3J5Ij09PXMuZWxlbWVudHx8ImxpbmsiPT09cy5lbGVtZW50fHx2b2lkIDAhPT1vJiYoIUFycmF5LmlzQXJyYXkobyl8fDAhPT1vLmxlbmd0aCl9cmVmU2VyaWFsaXNlQ29udGVudChzLG8pe3JldHVybiBkZWxldGUgby5hdHRyaWJ1dGVzLHtocmVmOnMudG9WYWx1ZSgpLHBhdGg6cy5wYXRoLnRvVmFsdWUoKX19c291cmNlTWFwU2VyaWFsaXNlQ29udGVudChzKXtyZXR1cm4gcy50b1ZhbHVlKCl9ZGF0YVN0cnVjdHVyZVNlcmlhbGlzZUNvbnRlbnQocyl7cmV0dXJuW3RoaXMuc2VyaWFsaXNlQ29udGVudChzLmNvbnRlbnQpXX1lbnVtU2VyaWFsaXNlQXR0cmlidXRlcyhzKXtjb25zdCBvPXMuYXR0cmlidXRlcy5jbG9uZSgpLGk9by5yZW1vdmUoImVudW1lcmF0aW9ucyIpfHxuZXcgdGhpcy5uYW1lc3BhY2UuZWxlbWVudHMuQXJyYXkoW10pLGE9by5nZXQoImRlZmF1bHQiKTtsZXQgdT1vLmdldCgic2FtcGxlcyIpfHxuZXcgdGhpcy5uYW1lc3BhY2UuZWxlbWVudHMuQXJyYXkoW10pO2lmKGEmJmEuY29udGVudCYmKGEuY29udGVudC5hdHRyaWJ1dGVzJiZhLmNvbnRlbnQuYXR0cmlidXRlcy5yZW1vdmUoInR5cGVBdHRyaWJ1dGVzIiksby5zZXQoImRlZmF1bHQiLG5ldyB0aGlzLm5hbWVzcGFjZS5lbGVtZW50cy5BcnJheShbYS5jb250ZW50XSkpKSx1LmZvckVhY2goKHM9PntzLmNvbnRlbnQmJnMuY29udGVudC5lbGVtZW50JiZzLmNvbnRlbnQuYXR0cmlidXRlcy5yZW1vdmUoInR5cGVBdHRyaWJ1dGVzIil9KSkscy5jb250ZW50JiYwIT09aS5sZW5ndGgmJnUudW5zaGlmdChzLmNvbnRlbnQpLHU9dS5tYXAoKHM9PnMgaW5zdGFuY2VvZiB0aGlzLm5hbWVzcGFjZS5lbGVtZW50cy5BcnJheT9bc106bmV3IHRoaXMubmFtZXNwYWNlLmVsZW1lbnRzLkFycmF5KFtzLmNvbnRlbnRdKSkpLHUubGVuZ3RoJiZvLnNldCgic2FtcGxlcyIsdSksby5sZW5ndGg+MClyZXR1cm4gdGhpcy5zZXJpYWxpc2VPYmplY3Qobyl9ZW51bVNlcmlhbGlzZUNvbnRlbnQocyl7aWYocy5fYXR0cmlidXRlcyl7Y29uc3Qgbz1zLmF0dHJpYnV0ZXMuZ2V0KCJlbnVtZXJhdGlvbnMiKTtpZihvJiZvLmxlbmd0aD4wKXJldHVybiBvLmNvbnRlbnQubWFwKChzPT57Y29uc3Qgbz1zLmNsb25lKCk7cmV0dXJuIG8uYXR0cmlidXRlcy5yZW1vdmUoInR5cGVBdHRyaWJ1dGVzIiksdGhpcy5zZXJpYWxpc2Uobyl9KSl9aWYocy5jb250ZW50KXtjb25zdCBvPXMuY29udGVudC5jbG9uZSgpO3JldHVybiBvLmF0dHJpYnV0ZXMucmVtb3ZlKCJ0eXBlQXR0cmlidXRlcyIpLFt0aGlzLnNlcmlhbGlzZShvKV19cmV0dXJuW119ZGVzZXJpYWxpc2Uocyl7aWYoInN0cmluZyI9PXR5cGVvZiBzKXJldHVybiBuZXcgdGhpcy5uYW1lc3BhY2UuZWxlbWVudHMuU3RyaW5nKHMpO2lmKCJudW1iZXIiPT10eXBlb2YgcylyZXR1cm4gbmV3IHRoaXMubmFtZXNwYWNlLmVsZW1lbnRzLk51bWJlcihzKTtpZigiYm9vbGVhbiI9PXR5cGVvZiBzKXJldHVybiBuZXcgdGhpcy5uYW1lc3BhY2UuZWxlbWVudHMuQm9vbGVhbihzKTtpZihudWxsPT09cylyZXR1cm4gbmV3IHRoaXMubmFtZXNwYWNlLmVsZW1lbnRzLk51bGw7aWYoQXJyYXkuaXNBcnJheShzKSlyZXR1cm4gbmV3IHRoaXMubmFtZXNwYWNlLmVsZW1lbnRzLkFycmF5KHMubWFwKHRoaXMuZGVzZXJpYWxpc2UsdGhpcykpO2NvbnN0IG89dGhpcy5uYW1lc3BhY2UuZ2V0RWxlbWVudENsYXNzKHMuZWxlbWVudCksaT1uZXcgbztpLmVsZW1lbnQhPT1zLmVsZW1lbnQmJihpLmVsZW1lbnQ9cy5lbGVtZW50KSxzLm1ldGEmJnRoaXMuZGVzZXJpYWxpc2VPYmplY3Qocy5tZXRhLGkubWV0YSkscy5hdHRyaWJ1dGVzJiZ0aGlzLmRlc2VyaWFsaXNlT2JqZWN0KHMuYXR0cmlidXRlcyxpLmF0dHJpYnV0ZXMpO2NvbnN0IGE9dGhpcy5kZXNlcmlhbGlzZUNvbnRlbnQocy5jb250ZW50KTtpZih2b2lkIDA9PT1hJiZudWxsIT09aS5jb250ZW50fHwoaS5jb250ZW50PWEpLCJlbnVtIj09PWkuZWxlbWVudCl7aS5jb250ZW50JiZpLmF0dHJpYnV0ZXMuc2V0KCJlbnVtZXJhdGlvbnMiLGkuY29udGVudCk7bGV0IHM9aS5hdHRyaWJ1dGVzLmdldCgic2FtcGxlcyIpO2lmKGkuYXR0cmlidXRlcy5yZW1vdmUoInNhbXBsZXMiKSxzKXtjb25zdCBhPXM7cz1uZXcgdGhpcy5uYW1lc3BhY2UuZWxlbWVudHMuQXJyYXksYS5mb3JFYWNoKChhPT57YS5mb3JFYWNoKChhPT57Y29uc3QgdT1uZXcgbyhhKTt1LmVsZW1lbnQ9aS5lbGVtZW50LHMucHVzaCh1KX0pKX0pKTtjb25zdCB1PXMuc2hpZnQoKTtpLmNvbnRlbnQ9dT91LmNvbnRlbnQ6dm9pZCAwLGkuYXR0cmlidXRlcy5zZXQoInNhbXBsZXMiLHMpfWVsc2UgaS5jb250ZW50PXZvaWQgMDtsZXQgYT1pLmF0dHJpYnV0ZXMuZ2V0KCJkZWZhdWx0Iik7aWYoYSYmYS5sZW5ndGg+MCl7YT1hLmdldCgwKTtjb25zdCBzPW5ldyBvKGEpO3MuZWxlbWVudD1pLmVsZW1lbnQsaS5hdHRyaWJ1dGVzLnNldCgiZGVmYXVsdCIscyl9fWVsc2UgaWYoImRhdGFTdHJ1Y3R1cmUiPT09aS5lbGVtZW50JiZBcnJheS5pc0FycmF5KGkuY29udGVudCkpW2kuY29udGVudF09aS5jb250ZW50O2Vsc2UgaWYoImNhdGVnb3J5Ij09PWkuZWxlbWVudCl7Y29uc3Qgcz1pLmF0dHJpYnV0ZXMuZ2V0KCJtZXRhIik7cyYmKGkuYXR0cmlidXRlcy5zZXQoIm1ldGFkYXRhIixzKSxpLmF0dHJpYnV0ZXMucmVtb3ZlKCJtZXRhIikpfWVsc2UibWVtYmVyIj09PWkuZWxlbWVudCYmaS5rZXkmJmkua2V5Ll9hdHRyaWJ1dGVzJiZpLmtleS5fYXR0cmlidXRlcy5nZXRWYWx1ZSgidmFyaWFibGUiKSYmKGkuYXR0cmlidXRlcy5zZXQoInZhcmlhYmxlIixpLmtleS5hdHRyaWJ1dGVzLmdldCgidmFyaWFibGUiKSksaS5rZXkuYXR0cmlidXRlcy5yZW1vdmUoInZhcmlhYmxlIikpO3JldHVybiBpfXNlcmlhbGlzZUNvbnRlbnQocyl7aWYocyBpbnN0YW5jZW9mIHRoaXMubmFtZXNwYWNlLmVsZW1lbnRzLkVsZW1lbnQpcmV0dXJuIHRoaXMuc2VyaWFsaXNlKHMpO2lmKHMgaW5zdGFuY2VvZiB0aGlzLm5hbWVzcGFjZS5LZXlWYWx1ZVBhaXIpe2NvbnN0IG89e2tleTp0aGlzLnNlcmlhbGlzZShzLmtleSl9O3JldHVybiBzLnZhbHVlJiYoby52YWx1ZT10aGlzLnNlcmlhbGlzZShzLnZhbHVlKSksb31yZXR1cm4gcyYmcy5tYXA/cy5tYXAodGhpcy5zZXJpYWxpc2UsdGhpcyk6c31kZXNlcmlhbGlzZUNvbnRlbnQocyl7aWYocyl7aWYocy5lbGVtZW50KXJldHVybiB0aGlzLmRlc2VyaWFsaXNlKHMpO2lmKHMua2V5KXtjb25zdCBvPW5ldyB0aGlzLm5hbWVzcGFjZS5LZXlWYWx1ZVBhaXIodGhpcy5kZXNlcmlhbGlzZShzLmtleSkpO3JldHVybiBzLnZhbHVlJiYoby52YWx1ZT10aGlzLmRlc2VyaWFsaXNlKHMudmFsdWUpKSxvfWlmKHMubWFwKXJldHVybiBzLm1hcCh0aGlzLmRlc2VyaWFsaXNlLHRoaXMpfXJldHVybiBzfXNob3VsZFJlZnJhY3Qocyl7cmV0dXJuISEocy5fYXR0cmlidXRlcyYmcy5hdHRyaWJ1dGVzLmtleXMoKS5sZW5ndGh8fHMuX21ldGEmJnMubWV0YS5rZXlzKCkubGVuZ3RoKXx8ImVudW0iIT09cy5lbGVtZW50JiYocy5lbGVtZW50IT09cy5wcmltaXRpdmUoKXx8Im1lbWJlciI9PT1zLmVsZW1lbnQpfWNvbnZlcnRLZXlUb1JlZnJhY3QocyxvKXtyZXR1cm4gdGhpcy5zaG91bGRSZWZyYWN0KG8pP3RoaXMuc2VyaWFsaXNlKG8pOiJlbnVtIj09PW8uZWxlbWVudD90aGlzLnNlcmlhbGlzZUVudW0obyk6ImFycmF5Ij09PW8uZWxlbWVudD9vLm1hcCgobz0+dGhpcy5zaG91bGRSZWZyYWN0KG8pfHwiZGVmYXVsdCI9PT1zP3RoaXMuc2VyaWFsaXNlKG8pOiJhcnJheSI9PT1vLmVsZW1lbnR8fCJvYmplY3QiPT09by5lbGVtZW50fHwiZW51bSI9PT1vLmVsZW1lbnQ/by5jaGlsZHJlbi5tYXAoKHM9PnRoaXMuc2VyaWFsaXNlKHMpKSk6by50b1ZhbHVlKCkpKToib2JqZWN0Ij09PW8uZWxlbWVudD8oby5jb250ZW50fHxbXSkubWFwKHRoaXMuc2VyaWFsaXNlLHRoaXMpOm8udG9WYWx1ZSgpfXNlcmlhbGlzZUVudW0ocyl7cmV0dXJuIHMuY2hpbGRyZW4ubWFwKChzPT50aGlzLnNlcmlhbGlzZShzKSkpfXNlcmlhbGlzZU9iamVjdChzKXtjb25zdCBvPXt9O3JldHVybiBzLmZvckVhY2goKChzLGkpPT57aWYocyl7Y29uc3QgYT1pLnRvVmFsdWUoKTtvW2FdPXRoaXMuY29udmVydEtleVRvUmVmcmFjdChhLHMpfX0pKSxvfWRlc2VyaWFsaXNlT2JqZWN0KHMsbyl7T2JqZWN0LmtleXMocykuZm9yRWFjaCgoaT0+e28uc2V0KGksdGhpcy5kZXNlcmlhbGlzZShzW2ldKSl9KSl9fX0sODUxMDUocyl7cy5leHBvcnRzPWNsYXNzIEpTT05TZXJpYWxpc2Vye2NvbnN0cnVjdG9yKHMpe3RoaXMubmFtZXNwYWNlPXN8fG5ldyB0aGlzLk5hbWVzcGFjZX1zZXJpYWxpc2Uocyl7aWYoIShzIGluc3RhbmNlb2YgdGhpcy5uYW1lc3BhY2UuZWxlbWVudHMuRWxlbWVudCkpdGhyb3cgbmV3IFR5cGVFcnJvcihgR2l2ZW4gZWxlbWVudCBcYCR7c31cYCBpcyBub3QgYW4gRWxlbWVudCBpbnN0YW5jZWApO2NvbnN0IG89e2VsZW1lbnQ6cy5lbGVtZW50fTtzLl9tZXRhJiZzLl9tZXRhLmxlbmd0aD4wJiYoby5tZXRhPXRoaXMuc2VyaWFsaXNlT2JqZWN0KHMubWV0YSkpLHMuX2F0dHJpYnV0ZXMmJnMuX2F0dHJpYnV0ZXMubGVuZ3RoPjAmJihvLmF0dHJpYnV0ZXM9dGhpcy5zZXJpYWxpc2VPYmplY3Qocy5hdHRyaWJ1dGVzKSk7Y29uc3QgaT10aGlzLnNlcmlhbGlzZUNvbnRlbnQocy5jb250ZW50KTtyZXR1cm4gdm9pZCAwIT09aSYmKG8uY29udGVudD1pKSxvfWRlc2VyaWFsaXNlKHMpe2lmKCFzLmVsZW1lbnQpdGhyb3cgbmV3IEVycm9yKCJHaXZlbiB2YWx1ZSBpcyBub3QgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYW4gZWxlbWVudCBuYW1lIik7Y29uc3Qgbz1uZXcodGhpcy5uYW1lc3BhY2UuZ2V0RWxlbWVudENsYXNzKHMuZWxlbWVudCkpO28uZWxlbWVudCE9PXMuZWxlbWVudCYmKG8uZWxlbWVudD1zLmVsZW1lbnQpLHMubWV0YSYmdGhpcy5kZXNlcmlhbGlzZU9iamVjdChzLm1ldGEsby5tZXRhKSxzLmF0dHJpYnV0ZXMmJnRoaXMuZGVzZXJpYWxpc2VPYmplY3Qocy5hdHRyaWJ1dGVzLG8uYXR0cmlidXRlcyk7Y29uc3QgaT10aGlzLmRlc2VyaWFsaXNlQ29udGVudChzLmNvbnRlbnQpO3JldHVybiB2b2lkIDA9PT1pJiZudWxsIT09by5jb250ZW50fHwoby5jb250ZW50PWkpLG99c2VyaWFsaXNlQ29udGVudChzKXtpZihzIGluc3RhbmNlb2YgdGhpcy5uYW1lc3BhY2UuZWxlbWVudHMuRWxlbWVudClyZXR1cm4gdGhpcy5zZXJpYWxpc2Uocyk7aWYocyBpbnN0YW5jZW9mIHRoaXMubmFtZXNwYWNlLktleVZhbHVlUGFpcil7Y29uc3Qgbz17a2V5OnRoaXMuc2VyaWFsaXNlKHMua2V5KX07cmV0dXJuIHMudmFsdWUmJihvLnZhbHVlPXRoaXMuc2VyaWFsaXNlKHMudmFsdWUpKSxvfWlmKHMmJnMubWFwKXtpZigwPT09cy5sZW5ndGgpcmV0dXJuO3JldHVybiBzLm1hcCh0aGlzLnNlcmlhbGlzZSx0aGlzKX1yZXR1cm4gc31kZXNlcmlhbGlzZUNvbnRlbnQocyl7aWYocyl7aWYocy5lbGVtZW50KXJldHVybiB0aGlzLmRlc2VyaWFsaXNlKHMpO2lmKHMua2V5KXtjb25zdCBvPW5ldyB0aGlzLm5hbWVzcGFjZS5LZXlWYWx1ZVBhaXIodGhpcy5kZXNlcmlhbGlzZShzLmtleSkpO3JldHVybiBzLnZhbHVlJiYoby52YWx1ZT10aGlzLmRlc2VyaWFsaXNlKHMudmFsdWUpKSxvfWlmKHMubWFwKXJldHVybiBzLm1hcCh0aGlzLmRlc2VyaWFsaXNlLHRoaXMpfXJldHVybiBzfXNlcmlhbGlzZU9iamVjdChzKXtjb25zdCBvPXt9O2lmKHMuZm9yRWFjaCgoKHMsaSk9PntzJiYob1tpLnRvVmFsdWUoKV09dGhpcy5zZXJpYWxpc2UocykpfSkpLDAhPT1PYmplY3Qua2V5cyhvKS5sZW5ndGgpcmV0dXJuIG99ZGVzZXJpYWxpc2VPYmplY3QocyxvKXtPYmplY3Qua2V5cyhzKS5mb3JFYWNoKChpPT57by5zZXQoaSx0aGlzLmRlc2VyaWFsaXNlKHNbaV0pKX0pKX19fSw3NjU3OChzKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPVsiRmxvYXQxNkFycmF5IiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiQmlnSW50NjRBcnJheSIsIkJpZ1VpbnQ2NEFycmF5Il19LDY1NjA2KHMpe3ZhciBvLGksYT1zLmV4cG9ydHM9e307ZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHJ1blRpbWVvdXQocyl7aWYobz09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQocywwKTtpZigobz09PWRlZmF1bHRTZXRUaW1vdXR8fCFvKSYmc2V0VGltZW91dClyZXR1cm4gbz1zZXRUaW1lb3V0LHNldFRpbWVvdXQocywwKTt0cnl7cmV0dXJuIG8ocywwKX1jYXRjaChpKXt0cnl7cmV0dXJuIG8uY2FsbChudWxsLHMsMCl9Y2F0Y2goaSl7cmV0dXJuIG8uY2FsbCh0aGlzLHMsMCl9fX0hZnVuY3Rpb24oKXt0cnl7bz0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmRlZmF1bHRTZXRUaW1vdXR9Y2F0Y2gocyl7bz1kZWZhdWx0U2V0VGltb3V0fXRyeXtpPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OmRlZmF1bHRDbGVhclRpbWVvdXR9Y2F0Y2gocyl7aT1kZWZhdWx0Q2xlYXJUaW1lb3V0fX0oKTt2YXIgdSxfPVtdLHc9ITEseD0tMTtmdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKXt3JiZ1JiYodz0hMSx1Lmxlbmd0aD9fPXUuY29uY2F0KF8pOng9LTEsXy5sZW5ndGgmJmRyYWluUXVldWUoKSl9ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpe2lmKCF3KXt2YXIgcz1ydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7dz0hMDtmb3IodmFyIG89Xy5sZW5ndGg7bzspe2Zvcih1PV8sXz1bXTsrK3g8bzspdSYmdVt4XS5ydW4oKTt4PS0xLG89Xy5sZW5ndGh9dT1udWxsLHc9ITEsZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KHMpe2lmKGk9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChzKTtpZigoaT09PWRlZmF1bHRDbGVhclRpbWVvdXR8fCFpKSYmY2xlYXJUaW1lb3V0KXJldHVybiBpPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQocyk7dHJ5e3JldHVybiBpKHMpfWNhdGNoKG8pe3RyeXtyZXR1cm4gaS5jYWxsKG51bGwscyl9Y2F0Y2gobyl7cmV0dXJuIGkuY2FsbCh0aGlzLHMpfX19KHMpfX1mdW5jdGlvbiBJdGVtKHMsbyl7dGhpcy5mdW49cyx0aGlzLmFycmF5PW99ZnVuY3Rpb24gbm9vcCgpe31hLm5leHRUaWNrPWZ1bmN0aW9uKHMpe3ZhciBvPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKW9baS0xXT1hcmd1bWVudHNbaV07Xy5wdXNoKG5ldyBJdGVtKHMsbykpLDEhPT1fLmxlbmd0aHx8d3x8cnVuVGltZW91dChkcmFpblF1ZXVlKX0sSXRlbS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sYS50aXRsZT0iYnJvd3NlciIsYS5icm93c2VyPSEwLGEuZW52PXt9LGEuYXJndj1bXSxhLnZlcnNpb249IiIsYS52ZXJzaW9ucz17fSxhLm9uPW5vb3AsYS5hZGRMaXN0ZW5lcj1ub29wLGEub25jZT1ub29wLGEub2ZmPW5vb3AsYS5yZW1vdmVMaXN0ZW5lcj1ub29wLGEucmVtb3ZlQWxsTGlzdGVuZXJzPW5vb3AsYS5lbWl0PW5vb3AsYS5wcmVwZW5kTGlzdGVuZXI9bm9vcCxhLnByZXBlbmRPbmNlTGlzdGVuZXI9bm9vcCxhLmxpc3RlbmVycz1mdW5jdGlvbihzKXtyZXR1cm5bXX0sYS5iaW5kaW5nPWZ1bmN0aW9uKHMpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sYS5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGEuY2hkaXI9ZnVuY3Rpb24ocyl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sYS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0sMjY5NChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNjkyNSk7ZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpe31mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uV2l0aFJlc2V0KCl7fWVtcHR5RnVuY3Rpb25XaXRoUmVzZXQucmVzZXRXYXJuaW5nQ2FjaGU9ZW1wdHlGdW5jdGlvbixzLmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBzaGltKHMsbyxpLHUsXyx3KXtpZih3IT09YSl7dmFyIHg9bmV3IEVycm9yKCJDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiBVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiBSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzIik7dGhyb3cgeC5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIix4fX1mdW5jdGlvbiBnZXRTaGltKCl7cmV0dXJuIHNoaW19c2hpbS5pc1JlcXVpcmVkPXNoaW07dmFyIHM9e2FycmF5OnNoaW0sYmlnaW50OnNoaW0sYm9vbDpzaGltLGZ1bmM6c2hpbSxudW1iZXI6c2hpbSxvYmplY3Q6c2hpbSxzdHJpbmc6c2hpbSxzeW1ib2w6c2hpbSxhbnk6c2hpbSxhcnJheU9mOmdldFNoaW0sZWxlbWVudDpzaGltLGVsZW1lbnRUeXBlOnNoaW0saW5zdGFuY2VPZjpnZXRTaGltLG5vZGU6c2hpbSxvYmplY3RPZjpnZXRTaGltLG9uZU9mOmdldFNoaW0sb25lT2ZUeXBlOmdldFNoaW0sc2hhcGU6Z2V0U2hpbSxleGFjdDpnZXRTaGltLGNoZWNrUHJvcFR5cGVzOmVtcHR5RnVuY3Rpb25XaXRoUmVzZXQscmVzZXRXYXJuaW5nQ2FjaGU6ZW1wdHlGdW5jdGlvbn07cmV0dXJuIHMuUHJvcFR5cGVzPXMsc319LDU1NTYocyxvLGkpe3MuZXhwb3J0cz1pKDI2OTQpKCl9LDY5MjUocyl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz0iU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQifSw3Mzk5MihzLG8peyJ1c2Ugc3RyaWN0Ijt2YXIgaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGRlY29kZShzKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzLnJlcGxhY2UoL1wrL2csIiAiKSl9Y2F0Y2gocyl7cmV0dXJuIG51bGx9fWZ1bmN0aW9uIGVuY29kZShzKXt0cnl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzKX1jYXRjaChzKXtyZXR1cm4gbnVsbH19by5zdHJpbmdpZnk9ZnVuY3Rpb24gcXVlcnlzdHJpbmdpZnkocyxvKXtvPW98fCIiO3ZhciBhLHUsXz1bXTtmb3IodSBpbiJzdHJpbmciIT10eXBlb2YgbyYmKG89Ij8iKSxzKWlmKGkuY2FsbChzLHUpKXtpZigoYT1zW3VdKXx8bnVsbCE9YSYmIWlzTmFOKGEpfHwoYT0iIiksdT1lbmNvZGUodSksYT1lbmNvZGUoYSksbnVsbD09PXV8fG51bGw9PT1hKWNvbnRpbnVlO18ucHVzaCh1KyI9IithKX1yZXR1cm4gXy5sZW5ndGg/bytfLmpvaW4oIiYiKToiIn0sby5wYXJzZT1mdW5jdGlvbiBxdWVyeXN0cmluZyhzKXtmb3IodmFyIG8saT0vKFtePT8jJl0rKT0/KFteJl0qKS9nLGE9e307bz1pLmV4ZWMocyk7KXt2YXIgdT1kZWNvZGUob1sxXSksXz1kZWNvZGUob1syXSk7bnVsbD09PXV8fG51bGw9PT1ffHx1IGluIGF8fChhW3VdPV8pfXJldHVybiBhfX0sNDE4NTkocyxvLGkpe2NvbnN0IGE9aSgyNzA5NiksdT1pKDc4MDA0KSxfPWEudHlwZXM7cy5leHBvcnRzPWNsYXNzIFJhbmRFeHB7Y29uc3RydWN0b3IocyxvKXtpZih0aGlzLl9zZXREZWZhdWx0cyhzKSxzIGluc3RhbmNlb2YgUmVnRXhwKXRoaXMuaWdub3JlQ2FzZT1zLmlnbm9yZUNhc2UsdGhpcy5tdWx0aWxpbmU9cy5tdWx0aWxpbmUscz1zLnNvdXJjZTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2Ygcyl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGEgcmVnZXhwIG9yIHN0cmluZyIpO3RoaXMuaWdub3JlQ2FzZT1vJiYtMSE9PW8uaW5kZXhPZigiaSIpLHRoaXMubXVsdGlsaW5lPW8mJi0xIT09by5pbmRleE9mKCJtIil9dGhpcy50b2tlbnM9YShzKX1fc2V0RGVmYXVsdHMocyl7dGhpcy5tYXg9bnVsbCE9cy5tYXg/cy5tYXg6bnVsbCE9UmFuZEV4cC5wcm90b3R5cGUubWF4P1JhbmRFeHAucHJvdG90eXBlLm1heDoxMDAsdGhpcy5kZWZhdWx0UmFuZ2U9cy5kZWZhdWx0UmFuZ2U/cy5kZWZhdWx0UmFuZ2U6dGhpcy5kZWZhdWx0UmFuZ2UuY2xvbmUoKSxzLnJhbmRJbnQmJih0aGlzLnJhbmRJbnQ9cy5yYW5kSW50KX1nZW4oKXtyZXR1cm4gdGhpcy5fZ2VuKHRoaXMudG9rZW5zLFtdKX1fZ2VuKHMsbyl7dmFyIGksYSx1LHcseDtzd2l0Y2gocy50eXBlKXtjYXNlIF8uUk9PVDpjYXNlIF8uR1JPVVA6aWYocy5mb2xsb3dlZEJ5fHxzLm5vdEZvbGxvd2VkQnkpcmV0dXJuIiI7Zm9yKHMucmVtZW1iZXImJnZvaWQgMD09PXMuZ3JvdXBOdW1iZXImJihzLmdyb3VwTnVtYmVyPW8ucHVzaChudWxsKS0xKSxhPSIiLHc9MCx4PShpPXMub3B0aW9ucz90aGlzLl9yYW5kU2VsZWN0KHMub3B0aW9ucyk6cy5zdGFjaykubGVuZ3RoO3c8eDt3KyspYSs9dGhpcy5fZ2VuKGlbd10sbyk7cmV0dXJuIHMucmVtZW1iZXImJihvW3MuZ3JvdXBOdW1iZXJdPWEpLGE7Y2FzZSBfLlBPU0lUSU9OOnJldHVybiIiO2Nhc2UgXy5TRVQ6dmFyIEM9dGhpcy5fZXhwYW5kKHMpO3JldHVybiBDLmxlbmd0aD9TdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuX3JhbmRTZWxlY3QoQykpOiIiO2Nhc2UgXy5SRVBFVElUSU9OOmZvcih1PXRoaXMucmFuZEludChzLm1pbixzLm1heD09PTEvMD9zLm1pbit0aGlzLm1heDpzLm1heCksYT0iIix3PTA7dzx1O3crKylhKz10aGlzLl9nZW4ocy52YWx1ZSxvKTtyZXR1cm4gYTtjYXNlIF8uUkVGRVJFTkNFOnJldHVybiBvW3MudmFsdWUtMV18fCIiO2Nhc2UgXy5DSEFSOnZhciBqPXRoaXMuaWdub3JlQ2FzZSYmdGhpcy5fcmFuZEJvb2woKT90aGlzLl90b090aGVyQ2FzZShzLnZhbHVlKTpzLnZhbHVlO3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGopfX1fdG9PdGhlckNhc2Uocyl7cmV0dXJuIHMrKDk3PD1zJiZzPD0xMjI/LTMyOjY1PD1zJiZzPD05MD8zMjowKX1fcmFuZEJvb2woKXtyZXR1cm4hdGhpcy5yYW5kSW50KDAsMSl9X3JhbmRTZWxlY3Qocyl7cmV0dXJuIHMgaW5zdGFuY2VvZiB1P3MuaW5kZXgodGhpcy5yYW5kSW50KDAscy5sZW5ndGgtMSkpOnNbdGhpcy5yYW5kSW50KDAscy5sZW5ndGgtMSldfV9leHBhbmQocyl7aWYocy50eXBlPT09YS50eXBlcy5DSEFSKXJldHVybiBuZXcgdShzLnZhbHVlKTtpZihzLnR5cGU9PT1hLnR5cGVzLlJBTkdFKXJldHVybiBuZXcgdShzLmZyb20scy50byk7e2xldCBvPW5ldyB1O2ZvcihsZXQgaT0wO2k8cy5zZXQubGVuZ3RoO2krKyl7bGV0IGE9dGhpcy5fZXhwYW5kKHMuc2V0W2ldKTtpZihvLmFkZChhKSx0aGlzLmlnbm9yZUNhc2UpZm9yKGxldCBzPTA7czxhLmxlbmd0aDtzKyspe2xldCBpPWEuaW5kZXgocyksdT10aGlzLl90b090aGVyQ2FzZShpKTtpIT09dSYmby5hZGQodSl9fXJldHVybiBzLm5vdD90aGlzLmRlZmF1bHRSYW5nZS5jbG9uZSgpLnN1YnRyYWN0KG8pOnRoaXMuZGVmYXVsdFJhbmdlLmNsb25lKCkuaW50ZXJzZWN0KG8pfX1yYW5kSW50KHMsbyl7cmV0dXJuIHMrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKigxK28tcykpfWdldCBkZWZhdWx0UmFuZ2UoKXtyZXR1cm4gdGhpcy5fcmFuZ2U9dGhpcy5fcmFuZ2V8fG5ldyB1KDMyLDEyNil9c2V0IGRlZmF1bHRSYW5nZShzKXt0aGlzLl9yYW5nZT1zfXN0YXRpYyByYW5kZXhwKHMsbyl7dmFyIGk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBzJiYocz1uZXcgUmVnRXhwKHMsbykpLHZvaWQgMD09PXMuX3JhbmRleHA/KGk9bmV3IFJhbmRFeHAocyxvKSxzLl9yYW5kZXhwPWkpOihpPXMuX3JhbmRleHApLl9zZXREZWZhdWx0cyhzKSxpLmdlbigpfXN0YXRpYyBzdWdhcigpe1JlZ0V4cC5wcm90b3R5cGUuZ2VuPWZ1bmN0aW9uKCl7cmV0dXJuIFJhbmRFeHAucmFuZGV4cCh0aGlzKX19fX0sNTMyMDkocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDY1NjA2KSx1PTY1NTM2LF89NDI5NDk2NzI5NTt2YXIgdz1pKDkyODYxKS5CdWZmZXIseD1pLmcuY3J5cHRvfHxpLmcubXNDcnlwdG87eCYmeC5nZXRSYW5kb21WYWx1ZXM/cy5leHBvcnRzPWZ1bmN0aW9uIHJhbmRvbUJ5dGVzKHMsbyl7aWYocz5fKXRocm93IG5ldyBSYW5nZUVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7dmFyIGk9dy5hbGxvY1Vuc2FmZShzKTtpZihzPjApaWYocz51KWZvcih2YXIgQz0wO0M8cztDKz11KXguZ2V0UmFuZG9tVmFsdWVzKGkuc2xpY2UoQyxDK3UpKTtlbHNlIHguZ2V0UmFuZG9tVmFsdWVzKGkpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvKXJldHVybiBhLm5leHRUaWNrKChmdW5jdGlvbigpe28obnVsbCxpKX0pKTtyZXR1cm4gaX06cy5leHBvcnRzPWZ1bmN0aW9uIG9sZEJyb3dzZXIoKXt0aHJvdyBuZXcgRXJyb3IoIlNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXG5Vc2UgQ2hyb21lLCBGaXJlZm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExIil9fSwyNTI2NChzLG8saSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIF90eXBlb2Yocyl7cmV0dXJuIF90eXBlb2Y9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24ocyl7cmV0dXJuIHR5cGVvZiBzfTpmdW5jdGlvbihzKXtyZXR1cm4gcyYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmcy5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmcyE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHN9LF90eXBlb2Yocyl9T2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG8uQ29weVRvQ2xpcGJvYXJkPXZvaWQgMDt2YXIgYT1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KGkoOTY1NDApKSx1PV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoaSgxNzk2NSkpLF89WyJ0ZXh0Iiwib25Db3B5Iiwib3B0aW9ucyIsImNoaWxkcmVuIl07ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChzKXtyZXR1cm4gcyYmcy5fX2VzTW9kdWxlP3M6e2RlZmF1bHQ6c319ZnVuY3Rpb24gb3duS2V5cyhzLG8pe3ZhciBpPU9iamVjdC5rZXlzKHMpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7byYmKGE9YS5maWx0ZXIoKGZ1bmN0aW9uKG8pe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHMsbykuZW51bWVyYWJsZX0pKSksaS5wdXNoLmFwcGx5KGksYSl9cmV0dXJuIGl9ZnVuY3Rpb24gX29iamVjdFNwcmVhZChzKXtmb3IodmFyIG89MTtvPGFyZ3VtZW50cy5sZW5ndGg7bysrKXt2YXIgaT1udWxsIT1hcmd1bWVudHNbb10/YXJndW1lbnRzW29dOnt9O28lMj9vd25LZXlzKE9iamVjdChpKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24obyl7X2RlZmluZVByb3BlcnR5KHMsbyxpW29dKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhzLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGkpKTpvd25LZXlzKE9iamVjdChpKSkuZm9yRWFjaCgoZnVuY3Rpb24obyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHMsbyxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksbykpfSkpfXJldHVybiBzfWZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzLG8pe2lmKG51bGw9PXMpcmV0dXJue307dmFyIGksYSx1PWZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHMsbyl7aWYobnVsbD09cylyZXR1cm57fTt2YXIgaSxhLHU9e30sXz1PYmplY3Qua2V5cyhzKTtmb3IoYT0wO2E8Xy5sZW5ndGg7YSsrKWk9X1thXSxvLmluZGV4T2YoaSk+PTB8fCh1W2ldPXNbaV0pO3JldHVybiB1fShzLG8pO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBfPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7Zm9yKGE9MDthPF8ubGVuZ3RoO2ErKylpPV9bYV0sby5pbmRleE9mKGkpPj0wfHxPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocyxpKSYmKHVbaV09c1tpXSl9cmV0dXJuIHV9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMocyxvKXtmb3IodmFyIGk9MDtpPG8ubGVuZ3RoO2krKyl7dmFyIGE9b1tpXTthLmVudW1lcmFibGU9YS5lbnVtZXJhYmxlfHwhMSxhLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gYSYmKGEud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLGEua2V5LGEpfX1mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YocyxvKXtyZXR1cm4gX3NldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHMsbyl7cmV0dXJuIHMuX19wcm90b19fPW8sc30sX3NldFByb3RvdHlwZU9mKHMsbyl9ZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKHMpe3ZhciBvPWZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2gocyl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpe3ZhciBpLGE9X2dldFByb3RvdHlwZU9mKHMpO2lmKG8pe3ZhciB1PV9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjtpPVJlZmxlY3QuY29uc3RydWN0KGEsYXJndW1lbnRzLHUpfWVsc2UgaT1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4ocyxvKXtpZihvJiYoIm9iamVjdCI9PT1fdHlwZW9mKG8pfHwiZnVuY3Rpb24iPT10eXBlb2YgbykpcmV0dXJuIG87aWYodm9pZCAwIT09byl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpO3JldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHMpfSh0aGlzLGkpfX1mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHMpe2lmKHZvaWQgMD09PXMpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gc31mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yocyl7cmV0dXJuIF9nZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihzKXtyZXR1cm4gcy5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihzKX0sX2dldFByb3RvdHlwZU9mKHMpfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShzLG8saSl7cmV0dXJuIG8gaW4gcz9PYmplY3QuZGVmaW5lUHJvcGVydHkocyxvLHt2YWx1ZTppLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6c1tvXT1pLHN9dmFyIHc9ZnVuY3Rpb24ocyl7IWZ1bmN0aW9uIF9pbmhlcml0cyhzLG8pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvJiZudWxsIT09byl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobyYmby5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkocywicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxvJiZfc2V0UHJvdG90eXBlT2YocyxvKX0oQ29weVRvQ2xpcGJvYXJkLHMpO3ZhciBvPV9jcmVhdGVTdXBlcihDb3B5VG9DbGlwYm9hcmQpO2Z1bmN0aW9uIENvcHlUb0NsaXBib2FyZCgpe3ZhciBzOyFmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2socyxvKXtpZighKHMgaW5zdGFuY2VvZiBvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxDb3B5VG9DbGlwYm9hcmQpO2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLF89bmV3IEFycmF5KGkpLHc9MDt3PGk7dysrKV9bd109YXJndW1lbnRzW3ddO3JldHVybiBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChzPW8uY2FsbC5hcHBseShvLFt0aGlzXS5jb25jYXQoXykpKSwib25DbGljayIsKGZ1bmN0aW9uKG8pe3ZhciBpPXMucHJvcHMsXz1pLnRleHQsdz1pLm9uQ29weSx4PWkuY2hpbGRyZW4sQz1pLm9wdGlvbnMsaj1hLmRlZmF1bHQuQ2hpbGRyZW4ub25seSh4KSxMPSgwLHUuZGVmYXVsdCkoXyxDKTt3JiZ3KF8sTCksaiYmai5wcm9wcyYmImZ1bmN0aW9uIj09dHlwZW9mIGoucHJvcHMub25DbGljayYmai5wcm9wcy5vbkNsaWNrKG8pfSkpLHN9cmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhzLG8saSl7cmV0dXJuIG8mJl9kZWZpbmVQcm9wZXJ0aWVzKHMucHJvdG90eXBlLG8pLGkmJl9kZWZpbmVQcm9wZXJ0aWVzKHMsaSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksc30oQ29weVRvQ2xpcGJvYXJkLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBzPXRoaXMucHJvcHMsbz0ocy50ZXh0LHMub25Db3B5LHMub3B0aW9ucyxzLmNoaWxkcmVuKSxpPV9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzLF8pLHU9YS5kZWZhdWx0LkNoaWxkcmVuLm9ubHkobyk7cmV0dXJuIGEuZGVmYXVsdC5jbG9uZUVsZW1lbnQodSxfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30saSkse30se29uQ2xpY2s6dGhpcy5vbkNsaWNrfSkpfX1dKSxDb3B5VG9DbGlwYm9hcmR9KGEuZGVmYXVsdC5QdXJlQ29tcG9uZW50KTtvLkNvcHlUb0NsaXBib2FyZD13LF9kZWZpbmVQcm9wZXJ0eSh3LCJkZWZhdWx0UHJvcHMiLHtvbkNvcHk6dm9pZCAwLG9wdGlvbnM6dm9pZCAwfSl9LDU5Mzk5KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgyNTI2NCkuQ29weVRvQ2xpcGJvYXJkO2EuQ29weVRvQ2xpcGJvYXJkPWEscy5leHBvcnRzPWF9LDgxMjE0KHMsbyxpKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gX3R5cGVvZihzKXtyZXR1cm4gX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihzKXtyZXR1cm4gdHlwZW9mIHN9OmZ1bmN0aW9uKHMpe3JldHVybiBzJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZzLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZzIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2Ygc30sX3R5cGVvZihzKX1PYmplY3QuZGVmaW5lUHJvcGVydHkobywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksby5EZWJvdW5jZUlucHV0PXZvaWQgMDt2YXIgYT1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KGkoOTY1NDApKSx1PV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoaSgyMDE4MSkpLF89WyJlbGVtZW50Iiwib25DaGFuZ2UiLCJ2YWx1ZSIsIm1pbkxlbmd0aCIsImRlYm91bmNlVGltZW91dCIsImZvcmNlTm90aWZ5QnlFbnRlciIsImZvcmNlTm90aWZ5T25CbHVyIiwib25LZXlEb3duIiwib25CbHVyIiwiaW5wdXRSZWYiXTtmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHMpe3JldHVybiBzJiZzLl9fZXNNb2R1bGU/czp7ZGVmYXVsdDpzfX1mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocyxvKXtpZihudWxsPT1zKXJldHVybnt9O3ZhciBpLGEsdT1mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzLG8pe2lmKG51bGw9PXMpcmV0dXJue307dmFyIGksYSx1PXt9LF89T2JqZWN0LmtleXMocyk7Zm9yKGE9MDthPF8ubGVuZ3RoO2ErKylpPV9bYV0sby5pbmRleE9mKGkpPj0wfHwodVtpXT1zW2ldKTtyZXR1cm4gdX0ocyxvKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgXz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpO2ZvcihhPTA7YTxfLmxlbmd0aDthKyspaT1fW2FdLG8uaW5kZXhPZihpKT49MHx8T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsaSkmJih1W2ldPXNbaV0pfXJldHVybiB1fWZ1bmN0aW9uIG93bktleXMocyxvKXt2YXIgaT1PYmplY3Qua2V5cyhzKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpO28mJihhPWEuZmlsdGVyKChmdW5jdGlvbihvKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzLG8pLmVudW1lcmFibGV9KSkpLGkucHVzaC5hcHBseShpLGEpfXJldHVybiBpfWZ1bmN0aW9uIF9vYmplY3RTcHJlYWQocyl7Zm9yKHZhciBvPTE7bzxhcmd1bWVudHMubGVuZ3RoO28rKyl7dmFyIGk9bnVsbCE9YXJndW1lbnRzW29dP2FyZ3VtZW50c1tvXTp7fTtvJTI/b3duS2V5cyhPYmplY3QoaSksITApLmZvckVhY2goKGZ1bmN0aW9uKG8pe19kZWZpbmVQcm9wZXJ0eShzLG8saVtvXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocyxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhpKSk6b3duS2V5cyhPYmplY3QoaSkpLmZvckVhY2goKGZ1bmN0aW9uKG8pe09iamVjdC5kZWZpbmVQcm9wZXJ0eShzLG8sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLG8pKX0pKX1yZXR1cm4gc31mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyhzLG8pe2Zvcih2YXIgaT0wO2k8by5sZW5ndGg7aSsrKXt2YXIgYT1vW2ldO2EuZW51bWVyYWJsZT1hLmVudW1lcmFibGV8fCExLGEuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBhJiYoYS53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsYS5rZXksYSl9fWZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihzLG8pe3JldHVybiBfc2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YocyxvKXtyZXR1cm4gcy5fX3Byb3RvX189byxzfSxfc2V0UHJvdG90eXBlT2YocyxvKX1mdW5jdGlvbiBfY3JlYXRlU3VwZXIocyl7dmFyIG89ZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaChzKXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCl7dmFyIGksYT1fZ2V0UHJvdG90eXBlT2Yocyk7aWYobyl7dmFyIHU9X2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yO2k9UmVmbGVjdC5jb25zdHJ1Y3QoYSxhcmd1bWVudHMsdSl9ZWxzZSBpPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzLG8pe2lmKG8mJigib2JqZWN0Ij09PV90eXBlb2Yobyl8fCJmdW5jdGlvbiI9PXR5cGVvZiBvKSlyZXR1cm4gbztpZih2b2lkIDAhPT1vKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQocyl9KHRoaXMsaSl9fWZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQocyl7aWYodm9pZCAwPT09cyl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBzfWZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihzKXtyZXR1cm4gX2dldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKHMpe3JldHVybiBzLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHMpfSxfZ2V0UHJvdG90eXBlT2Yocyl9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KHMsbyxpKXtyZXR1cm4gbyBpbiBzP09iamVjdC5kZWZpbmVQcm9wZXJ0eShzLG8se3ZhbHVlOmksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpzW29dPWksc312YXIgdz1mdW5jdGlvbihzKXshZnVuY3Rpb24gX2luaGVyaXRzKHMsbyl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG8mJm51bGwhPT1vKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7cy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvJiZvLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnMsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLG8mJl9zZXRQcm90b3R5cGVPZihzLG8pfShEZWJvdW5jZUlucHV0LHMpO3ZhciBvPV9jcmVhdGVTdXBlcihEZWJvdW5jZUlucHV0KTtmdW5jdGlvbiBEZWJvdW5jZUlucHV0KHMpe3ZhciBpOyFmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2socyxvKXtpZighKHMgaW5zdGFuY2VvZiBvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxEZWJvdW5jZUlucHV0KSxfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChpPW8uY2FsbCh0aGlzLHMpKSwib25DaGFuZ2UiLChmdW5jdGlvbihzKXtzLnBlcnNpc3QoKTt2YXIgbz1pLnN0YXRlLnZhbHVlLGE9aS5wcm9wcy5taW5MZW5ndGg7aS5zZXRTdGF0ZSh7dmFsdWU6cy50YXJnZXQudmFsdWV9LChmdW5jdGlvbigpe3ZhciB1PWkuc3RhdGUudmFsdWU7dS5sZW5ndGg+PWE/aS5ub3RpZnkocyk6by5sZW5ndGg+dS5sZW5ndGgmJmkubm90aWZ5KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSxzKSx7fSx7dGFyZ2V0Ol9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSxzLnRhcmdldCkse30se3ZhbHVlOiIifSl9KSl9KSl9KSksX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoaSksIm9uS2V5RG93biIsKGZ1bmN0aW9uKHMpeyJFbnRlciI9PT1zLmtleSYmaS5mb3JjZU5vdGlmeShzKTt2YXIgbz1pLnByb3BzLm9uS2V5RG93bjtvJiYocy5wZXJzaXN0KCksbyhzKSl9KSksX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoaSksIm9uQmx1ciIsKGZ1bmN0aW9uKHMpe2kuZm9yY2VOb3RpZnkocyk7dmFyIG89aS5wcm9wcy5vbkJsdXI7byYmKHMucGVyc2lzdCgpLG8ocykpfSkpLF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKGkpLCJjcmVhdGVOb3RpZmllciIsKGZ1bmN0aW9uKHMpe2lmKHM8MClpLm5vdGlmeT1mdW5jdGlvbigpe3JldHVybiBudWxsfTtlbHNlIGlmKDA9PT1zKWkubm90aWZ5PWkuZG9Ob3RpZnk7ZWxzZXt2YXIgbz0oMCx1LmRlZmF1bHQpKChmdW5jdGlvbihzKXtpLmlzRGVib3VuY2luZz0hMSxpLmRvTm90aWZ5KHMpfSkscyk7aS5ub3RpZnk9ZnVuY3Rpb24ocyl7aS5pc0RlYm91bmNpbmc9ITAsbyhzKX0saS5mbHVzaD1mdW5jdGlvbigpe3JldHVybiBvLmZsdXNoKCl9LGkuY2FuY2VsPWZ1bmN0aW9uKCl7aS5pc0RlYm91bmNpbmc9ITEsby5jYW5jZWwoKX19fSkpLF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKGkpLCJkb05vdGlmeSIsKGZ1bmN0aW9uKCl7aS5wcm9wcy5vbkNoYW5nZS5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX0pKSxfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChpKSwiZm9yY2VOb3RpZnkiLChmdW5jdGlvbihzKXt2YXIgbz1pLnByb3BzLmRlYm91bmNlVGltZW91dDtpZihpLmlzRGVib3VuY2luZ3x8IShvPjApKXtpLmNhbmNlbCYmaS5jYW5jZWwoKTt2YXIgYT1pLnN0YXRlLnZhbHVlLHU9aS5wcm9wcy5taW5MZW5ndGg7YS5sZW5ndGg+PXU/aS5kb05vdGlmeShzKTppLmRvTm90aWZ5KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSxzKSx7fSx7dGFyZ2V0Ol9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSxzLnRhcmdldCkse30se3ZhbHVlOmF9KX0pKX19KSksaS5pc0RlYm91bmNpbmc9ITEsaS5zdGF0ZT17dmFsdWU6dm9pZCAwPT09cy52YWx1ZXx8bnVsbD09PXMudmFsdWU/IiI6cy52YWx1ZX07dmFyIGE9aS5wcm9wcy5kZWJvdW5jZVRpbWVvdXQ7cmV0dXJuIGkuY3JlYXRlTm90aWZpZXIoYSksaX1yZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKHMsbyxpKXtyZXR1cm4gbyYmX2RlZmluZVByb3BlcnRpZXMocy5wcm90b3R5cGUsbyksaSYmX2RlZmluZVByb3BlcnRpZXMocyxpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocywicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxzfShEZWJvdW5jZUlucHV0LFt7a2V5OiJjb21wb25lbnREaWRVcGRhdGUiLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShzKXtpZighdGhpcy5pc0RlYm91bmNpbmcpe3ZhciBvPXRoaXMucHJvcHMsaT1vLnZhbHVlLGE9by5kZWJvdW5jZVRpbWVvdXQsdT1zLmRlYm91bmNlVGltZW91dCxfPXMudmFsdWUsdz10aGlzLnN0YXRlLnZhbHVlO3ZvaWQgMCE9PWkmJl8hPT1pJiZ3IT09aSYmdGhpcy5zZXRTdGF0ZSh7dmFsdWU6aX0pLGEhPT11JiZ0aGlzLmNyZWF0ZU5vdGlmaWVyKGEpfX19LHtrZXk6ImNvbXBvbmVudFdpbGxVbm1vdW50Iix2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpe3RoaXMuZmx1c2gmJnRoaXMuZmx1c2goKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dmFyIHMsbyxpPXRoaXMucHJvcHMsdT1pLmVsZW1lbnQsdz0oaS5vbkNoYW5nZSxpLnZhbHVlLGkubWluTGVuZ3RoLGkuZGVib3VuY2VUaW1lb3V0LGkuZm9yY2VOb3RpZnlCeUVudGVyKSx4PWkuZm9yY2VOb3RpZnlPbkJsdXIsQz1pLm9uS2V5RG93bixqPWkub25CbHVyLEw9aS5pbnB1dFJlZixCPV9vYmplY3RXaXRob3V0UHJvcGVydGllcyhpLF8pLCQ9dGhpcy5zdGF0ZS52YWx1ZTtzPXc/e29uS2V5RG93bjp0aGlzLm9uS2V5RG93bn06Qz97b25LZXlEb3duOkN9Ont9LG89eD97b25CbHVyOnRoaXMub25CbHVyfTpqP3tvbkJsdXI6an06e307dmFyIFU9TD97cmVmOkx9Ont9O3JldHVybiBhLmRlZmF1bHQuY3JlYXRlRWxlbWVudCh1LF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sQikse30se29uQ2hhbmdlOnRoaXMub25DaGFuZ2UsdmFsdWU6JH0scyksbyksVSkpfX1dKSxEZWJvdW5jZUlucHV0fShhLmRlZmF1bHQuUHVyZUNvbXBvbmVudCk7by5EZWJvdW5jZUlucHV0PXcsX2RlZmluZVByb3BlcnR5KHcsImRlZmF1bHRQcm9wcyIse2VsZW1lbnQ6ImlucHV0Iix0eXBlOiJ0ZXh0IixvbktleURvd246dm9pZCAwLG9uQmx1cjp2b2lkIDAsdmFsdWU6dm9pZCAwLG1pbkxlbmd0aDowLGRlYm91bmNlVGltZW91dDoxMDAsZm9yY2VOb3RpZnlCeUVudGVyOiEwLGZvcmNlTm90aWZ5T25CbHVyOiEwLGlucHV0UmVmOnZvaWQgMH0pfSwyNDY3NyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoODEyMTQpLkRlYm91bmNlSW5wdXQ7YS5EZWJvdW5jZUlucHV0PWEscy5leHBvcnRzPWF9LDIyNTUxKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg5NjU0MCksdT1pKDY5OTgyKTtmdW5jdGlvbiBwKHMpe2Zvcih2YXIgbz0iaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9IitzLGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKW8rPSImYXJnc1tdPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tpXSk7cmV0dXJuIk1pbmlmaWVkIFJlYWN0IGVycm9yICMiK3MrIjsgdmlzaXQgIitvKyIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiJ9dmFyIF89bmV3IFNldCx3PXt9O2Z1bmN0aW9uIGZhKHMsbyl7aGEocyxvKSxoYShzKyJDYXB0dXJlIixvKX1mdW5jdGlvbiBoYShzLG8pe2Zvcih3W3NdPW8scz0wO3M8by5sZW5ndGg7cysrKV8uYWRkKG9bc10pfXZhciB4PSEoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fHZvaWQgMD09PXdpbmRvdy5kb2N1bWVudHx8dm9pZCAwPT09d2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpLEM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxqPS9eWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRdWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRcLS4wLTlcdTAwQjdcdTAzMDAtXHUwMzZGXHUyMDNGLVx1MjA0MF0qJC8sTD17fSxCPXt9O2Z1bmN0aW9uIHYocyxvLGksYSx1LF8sdyl7dGhpcy5hY2NlcHRzQm9vbGVhbnM9Mj09PW98fDM9PT1vfHw0PT09byx0aGlzLmF0dHJpYnV0ZU5hbWU9YSx0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT11LHRoaXMubXVzdFVzZVByb3BlcnR5PWksdGhpcy5wcm9wZXJ0eU5hbWU9cyx0aGlzLnR5cGU9byx0aGlzLnNhbml0aXplVVJMPV8sdGhpcy5yZW1vdmVFbXB0eVN0cmluZz13fXZhciAkPXt9OyJjaGlsZHJlbiBkYW5nZXJvdXNseVNldElubmVySFRNTCBkZWZhdWx0VmFsdWUgZGVmYXVsdENoZWNrZWQgaW5uZXJIVE1MIHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgc3R5bGUiLnNwbGl0KCIgIikuZm9yRWFjaCgoZnVuY3Rpb24ocyl7JFtzXT1uZXcgdihzLDAsITEscyxudWxsLCExLCExKX0pKSxbWyJhY2NlcHRDaGFyc2V0IiwiYWNjZXB0LWNoYXJzZXQiXSxbImNsYXNzTmFtZSIsImNsYXNzIl0sWyJodG1sRm9yIiwiZm9yIl0sWyJodHRwRXF1aXYiLCJodHRwLWVxdWl2Il1dLmZvckVhY2goKGZ1bmN0aW9uKHMpe3ZhciBvPXNbMF07JFtvXT1uZXcgdihvLDEsITEsc1sxXSxudWxsLCExLCExKX0pKSxbImNvbnRlbnRFZGl0YWJsZSIsImRyYWdnYWJsZSIsInNwZWxsQ2hlY2siLCJ2YWx1ZSJdLmZvckVhY2goKGZ1bmN0aW9uKHMpeyRbc109bmV3IHYocywyLCExLHMudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pKSxbImF1dG9SZXZlcnNlIiwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCIsImZvY3VzYWJsZSIsInByZXNlcnZlQWxwaGEiXS5mb3JFYWNoKChmdW5jdGlvbihzKXskW3NdPW5ldyB2KHMsMiwhMSxzLG51bGwsITEsITEpfSkpLCJhbGxvd0Z1bGxTY3JlZW4gYXN5bmMgYXV0b0ZvY3VzIGF1dG9QbGF5IGNvbnRyb2xzIGRlZmF1bHQgZGVmZXIgZGlzYWJsZWQgZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgZGlzYWJsZVJlbW90ZVBsYXliYWNrIGZvcm1Ob1ZhbGlkYXRlIGhpZGRlbiBsb29wIG5vTW9kdWxlIG5vVmFsaWRhdGUgb3BlbiBwbGF5c0lubGluZSByZWFkT25seSByZXF1aXJlZCByZXZlcnNlZCBzY29wZWQgc2VhbWxlc3MgaXRlbVNjb3BlIi5zcGxpdCgiICIpLmZvckVhY2goKGZ1bmN0aW9uKHMpeyRbc109bmV3IHYocywzLCExLHMudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pKSxbImNoZWNrZWQiLCJtdWx0aXBsZSIsIm11dGVkIiwic2VsZWN0ZWQiXS5mb3JFYWNoKChmdW5jdGlvbihzKXskW3NdPW5ldyB2KHMsMywhMCxzLG51bGwsITEsITEpfSkpLFsiY2FwdHVyZSIsImRvd25sb2FkIl0uZm9yRWFjaCgoZnVuY3Rpb24ocyl7JFtzXT1uZXcgdihzLDQsITEscyxudWxsLCExLCExKX0pKSxbImNvbHMiLCJyb3dzIiwic2l6ZSIsInNwYW4iXS5mb3JFYWNoKChmdW5jdGlvbihzKXskW3NdPW5ldyB2KHMsNiwhMSxzLG51bGwsITEsITEpfSkpLFsicm93U3BhbiIsInN0YXJ0Il0uZm9yRWFjaCgoZnVuY3Rpb24ocyl7JFtzXT1uZXcgdihzLDUsITEscy50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSkpO3ZhciBVPS9bXC06XShbYS16XSkvZztmdW5jdGlvbiBzYShzKXtyZXR1cm4gc1sxXS50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIHRhKHMsbyxpLGEpe3ZhciB1PSQuaGFzT3duUHJvcGVydHkobyk/JFtvXTpudWxsOyhudWxsIT09dT8wIT09dS50eXBlOmF8fCEoMjxvLmxlbmd0aCl8fCJvIiE9PW9bMF0mJiJPIiE9PW9bMF18fCJuIiE9PW9bMV0mJiJOIiE9PW9bMV0pJiYoZnVuY3Rpb24gcWEocyxvLGksYSl7aWYobnVsbD09b3x8ZnVuY3Rpb24gcGEocyxvLGksYSl7aWYobnVsbCE9PWkmJjA9PT1pLnR5cGUpcmV0dXJuITE7c3dpdGNoKHR5cGVvZiBvKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6cmV0dXJuITA7Y2FzZSJib29sZWFuIjpyZXR1cm4hYSYmKG51bGwhPT1pPyFpLmFjY2VwdHNCb29sZWFuczoiZGF0YS0iIT09KHM9cy50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSkpJiYiYXJpYS0iIT09cyk7ZGVmYXVsdDpyZXR1cm4hMX19KHMsbyxpLGEpKXJldHVybiEwO2lmKGEpcmV0dXJuITE7aWYobnVsbCE9PWkpc3dpdGNoKGkudHlwZSl7Y2FzZSAzOnJldHVybiFvO2Nhc2UgNDpyZXR1cm4hMT09PW87Y2FzZSA1OnJldHVybiBpc05hTihvKTtjYXNlIDY6cmV0dXJuIGlzTmFOKG8pfHwxPm99cmV0dXJuITF9KG8saSx1LGEpJiYoaT1udWxsKSxhfHxudWxsPT09dT9mdW5jdGlvbiBvYShzKXtyZXR1cm4hIUMuY2FsbChCLHMpfHwhQy5jYWxsKEwscykmJihqLnRlc3Qocyk/QltzXT0hMDooTFtzXT0hMCwhMSkpfShvKSYmKG51bGw9PT1pP3MucmVtb3ZlQXR0cmlidXRlKG8pOnMuc2V0QXR0cmlidXRlKG8sIiIraSkpOnUubXVzdFVzZVByb3BlcnR5P3NbdS5wcm9wZXJ0eU5hbWVdPW51bGw9PT1pPzMhPT11LnR5cGUmJiIiOmk6KG89dS5hdHRyaWJ1dGVOYW1lLGE9dS5hdHRyaWJ1dGVOYW1lc3BhY2UsbnVsbD09PWk/cy5yZW1vdmVBdHRyaWJ1dGUobyk6KGk9Mz09PSh1PXUudHlwZSl8fDQ9PT11JiYhMD09PWk/IiI6IiIraSxhP3Muc2V0QXR0cmlidXRlTlMoYSxvLGkpOnMuc2V0QXR0cmlidXRlKG8saSkpKSl9ImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0Ii5zcGxpdCgiICIpLmZvckVhY2goKGZ1bmN0aW9uKHMpe3ZhciBvPXMucmVwbGFjZShVLHNhKTskW29dPW5ldyB2KG8sMSwhMSxzLG51bGwsITEsITEpfSkpLCJ4bGluazphY3R1YXRlIHhsaW5rOmFyY3JvbGUgeGxpbms6cm9sZSB4bGluazpzaG93IHhsaW5rOnRpdGxlIHhsaW5rOnR5cGUiLnNwbGl0KCIgIikuZm9yRWFjaCgoZnVuY3Rpb24ocyl7dmFyIG89cy5yZXBsYWNlKFUsc2EpOyRbb109bmV3IHYobywxLCExLHMsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCExLCExKX0pKSxbInhtbDpiYXNlIiwieG1sOmxhbmciLCJ4bWw6c3BhY2UiXS5mb3JFYWNoKChmdW5jdGlvbihzKXt2YXIgbz1zLnJlcGxhY2UoVSxzYSk7JFtvXT1uZXcgdihvLDEsITEscywiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwhMSwhMSl9KSksWyJ0YWJJbmRleCIsImNyb3NzT3JpZ2luIl0uZm9yRWFjaCgoZnVuY3Rpb24ocyl7JFtzXT1uZXcgdihzLDEsITEscy50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSkpLCQueGxpbmtIcmVmPW5ldyB2KCJ4bGlua0hyZWYiLDEsITEsInhsaW5rOmhyZWYiLCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwhMCwhMSksWyJzcmMiLCJocmVmIiwiYWN0aW9uIiwiZm9ybUFjdGlvbiJdLmZvckVhY2goKGZ1bmN0aW9uKHMpeyRbc109bmV3IHYocywxLCExLHMudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pKTt2YXIgVj1hLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELHo9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLFk9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksWj1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLGVlPVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIiksaWU9U3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSxhZT1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLGNlPVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxsZT1TeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLHBlPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksZGU9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLGZlPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSx5ZT1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5Iik7U3ltYm9sLmZvcigicmVhY3Quc2NvcGUiKSxTeW1ib2wuZm9yKCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlIik7dmFyIGJlPVN5bWJvbC5mb3IoInJlYWN0Lm9mZnNjcmVlbiIpO1N5bWJvbC5mb3IoInJlYWN0LmxlZ2FjeV9oaWRkZW4iKSxTeW1ib2wuZm9yKCJyZWFjdC5jYWNoZSIpLFN5bWJvbC5mb3IoInJlYWN0LnRyYWNpbmdfbWFya2VyIik7dmFyIFNlPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBLYShzKXtyZXR1cm4gbnVsbD09PXN8fCJvYmplY3QiIT10eXBlb2Ygcz9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZihzPVNlJiZzW1NlXXx8c1siQEBpdGVyYXRvciJdKT9zOm51bGx9dmFyIF9lLHdlPU9iamVjdC5hc3NpZ247ZnVuY3Rpb24gTWEocyl7aWYodm9pZCAwPT09X2UpdHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2gocyl7dmFyIG89cy5zdGFjay50cmltKCkubWF0Y2goL1xuKCAqKGF0ICk/KS8pO19lPW8mJm9bMV18fCIifXJldHVybiJcbiIrX2Urc312YXIgeGU9ITE7ZnVuY3Rpb24gT2EocyxvKXtpZighc3x8eGUpcmV0dXJuIiI7eGU9ITA7dmFyIGk9RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9dm9pZCAwO3RyeXtpZihvKWlmKG89ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoby5wcm90b3R5cGUsInByb3BzIix7c2V0OmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX19KSwib2JqZWN0Ij09dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3QuY29uc3RydWN0KXt0cnl7UmVmbGVjdC5jb25zdHJ1Y3QobyxbXSl9Y2F0Y2gocyl7dmFyIGE9c31SZWZsZWN0LmNvbnN0cnVjdChzLFtdLG8pfWVsc2V7dHJ5e28uY2FsbCgpfWNhdGNoKHMpe2E9c31zLmNhbGwoby5wcm90b3R5cGUpfWVsc2V7dHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2gocyl7YT1zfXMoKX19Y2F0Y2gobyl7aWYobyYmYSYmInN0cmluZyI9PXR5cGVvZiBvLnN0YWNrKXtmb3IodmFyIHU9by5zdGFjay5zcGxpdCgiXG4iKSxfPWEuc3RhY2suc3BsaXQoIlxuIiksdz11Lmxlbmd0aC0xLHg9Xy5sZW5ndGgtMTsxPD13JiYwPD14JiZ1W3ddIT09X1t4XTspeC0tO2Zvcig7MTw9dyYmMDw9eDt3LS0seC0tKWlmKHVbd10hPT1fW3hdKXtpZigxIT09d3x8MSE9PXgpZG97aWYody0tLDA+LS14fHx1W3ddIT09X1t4XSl7dmFyIEM9IlxuIit1W3ddLnJlcGxhY2UoIiBhdCBuZXcgIiwiIGF0ICIpO3JldHVybiBzLmRpc3BsYXlOYW1lJiZDLmluY2x1ZGVzKCI8YW5vbnltb3VzPiIpJiYoQz1DLnJlcGxhY2UoIjxhbm9ueW1vdXM+IixzLmRpc3BsYXlOYW1lKSksQ319d2hpbGUoMTw9dyYmMDw9eCk7YnJlYWt9fX1maW5hbGx5e3hlPSExLEVycm9yLnByZXBhcmVTdGFja1RyYWNlPWl9cmV0dXJuKHM9cz9zLmRpc3BsYXlOYW1lfHxzLm5hbWU6IiIpP01hKHMpOiIifWZ1bmN0aW9uIFBhKHMpe3N3aXRjaChzLnRhZyl7Y2FzZSA1OnJldHVybiBNYShzLnR5cGUpO2Nhc2UgMTY6cmV0dXJuIE1hKCJMYXp5Iik7Y2FzZSAxMzpyZXR1cm4gTWEoIlN1c3BlbnNlIik7Y2FzZSAxOTpyZXR1cm4gTWEoIlN1c3BlbnNlTGlzdCIpO2Nhc2UgMDpjYXNlIDI6Y2FzZSAxNTpyZXR1cm4gcz1PYShzLnR5cGUsITEpO2Nhc2UgMTE6cmV0dXJuIHM9T2Eocy50eXBlLnJlbmRlciwhMSk7Y2FzZSAxOnJldHVybiBzPU9hKHMudHlwZSwhMCk7ZGVmYXVsdDpyZXR1cm4iIn19ZnVuY3Rpb24gUWEocyl7aWYobnVsbD09cylyZXR1cm4gbnVsbDtpZigiZnVuY3Rpb24iPT10eXBlb2YgcylyZXR1cm4gcy5kaXNwbGF5TmFtZXx8cy5uYW1lfHxudWxsO2lmKCJzdHJpbmciPT10eXBlb2YgcylyZXR1cm4gcztzd2l0Y2gocyl7Y2FzZSBaOnJldHVybiJGcmFnbWVudCI7Y2FzZSBZOnJldHVybiJQb3J0YWwiO2Nhc2UgaWU6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIGVlOnJldHVybiJTdHJpY3RNb2RlIjtjYXNlIHBlOnJldHVybiJTdXNwZW5zZSI7Y2FzZSBkZTpyZXR1cm4iU3VzcGVuc2VMaXN0In1pZigib2JqZWN0Ij09dHlwZW9mIHMpc3dpdGNoKHMuJCR0eXBlb2Ype2Nhc2UgY2U6cmV0dXJuKHMuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Db25zdW1lciI7Y2FzZSBhZTpyZXR1cm4ocy5fY29udGV4dC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLlByb3ZpZGVyIjtjYXNlIGxlOnZhciBvPXMucmVuZGVyO3JldHVybihzPXMuZGlzcGxheU5hbWUpfHwocz0iIiE9PShzPW8uZGlzcGxheU5hbWV8fG8ubmFtZXx8IiIpPyJGb3J3YXJkUmVmKCIrcysiKSI6IkZvcndhcmRSZWYiKSxzO2Nhc2UgZmU6cmV0dXJuIG51bGwhPT0obz1zLmRpc3BsYXlOYW1lfHxudWxsKT9vOlFhKHMudHlwZSl8fCJNZW1vIjtjYXNlIHllOm89cy5fcGF5bG9hZCxzPXMuX2luaXQ7dHJ5e3JldHVybiBRYShzKG8pKX1jYXRjaChzKXt9fXJldHVybiBudWxsfWZ1bmN0aW9uIFJhKHMpe3ZhciBvPXMudHlwZTtzd2l0Y2gocy50YWcpe2Nhc2UgMjQ6cmV0dXJuIkNhY2hlIjtjYXNlIDk6cmV0dXJuKG8uZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Db25zdW1lciI7Y2FzZSAxMDpyZXR1cm4oby5fY29udGV4dC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLlByb3ZpZGVyIjtjYXNlIDE4OnJldHVybiJEZWh5ZHJhdGVkRnJhZ21lbnQiO2Nhc2UgMTE6cmV0dXJuIHM9KHM9by5yZW5kZXIpLmRpc3BsYXlOYW1lfHxzLm5hbWV8fCIiLG8uZGlzcGxheU5hbWV8fCgiIiE9PXM/IkZvcndhcmRSZWYoIitzKyIpIjoiRm9yd2FyZFJlZiIpO2Nhc2UgNzpyZXR1cm4iRnJhZ21lbnQiO2Nhc2UgNTpyZXR1cm4gbztjYXNlIDQ6cmV0dXJuIlBvcnRhbCI7Y2FzZSAzOnJldHVybiJSb290IjtjYXNlIDY6cmV0dXJuIlRleHQiO2Nhc2UgMTY6cmV0dXJuIFFhKG8pO2Nhc2UgODpyZXR1cm4gbz09PWVlPyJTdHJpY3RNb2RlIjoiTW9kZSI7Y2FzZSAyMjpyZXR1cm4iT2Zmc2NyZWVuIjtjYXNlIDEyOnJldHVybiJQcm9maWxlciI7Y2FzZSAyMTpyZXR1cm4iU2NvcGUiO2Nhc2UgMTM6cmV0dXJuIlN1c3BlbnNlIjtjYXNlIDE5OnJldHVybiJTdXNwZW5zZUxpc3QiO2Nhc2UgMjU6cmV0dXJuIlRyYWNpbmdNYXJrZXIiO2Nhc2UgMTpjYXNlIDA6Y2FzZSAxNzpjYXNlIDI6Y2FzZSAxNDpjYXNlIDE1OmlmKCJmdW5jdGlvbiI9PXR5cGVvZiBvKXJldHVybiBvLmRpc3BsYXlOYW1lfHxvLm5hbWV8fG51bGw7aWYoInN0cmluZyI9PXR5cGVvZiBvKXJldHVybiBvfXJldHVybiBudWxsfWZ1bmN0aW9uIFNhKHMpe3N3aXRjaCh0eXBlb2Ygcyl7Y2FzZSJib29sZWFuIjpjYXNlIm51bWJlciI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpjYXNlIm9iamVjdCI6cmV0dXJuIHM7ZGVmYXVsdDpyZXR1cm4iIn19ZnVuY3Rpb24gVGEocyl7dmFyIG89cy50eXBlO3JldHVybihzPXMubm9kZU5hbWUpJiYiaW5wdXQiPT09cy50b0xvd2VyQ2FzZSgpJiYoImNoZWNrYm94Ij09PW98fCJyYWRpbyI9PT1vKX1mdW5jdGlvbiBWYShzKXtzLl92YWx1ZVRyYWNrZXJ8fChzLl92YWx1ZVRyYWNrZXI9ZnVuY3Rpb24gVWEocyl7dmFyIG89VGEocyk/ImNoZWNrZWQiOiJ2YWx1ZSIsaT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHMuY29uc3RydWN0b3IucHJvdG90eXBlLG8pLGE9IiIrc1tvXTtpZighcy5oYXNPd25Qcm9wZXJ0eShvKSYmdm9pZCAwIT09aSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuZ2V0JiYiZnVuY3Rpb24iPT10eXBlb2YgaS5zZXQpe3ZhciB1PWkuZ2V0LF89aS5zZXQ7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLG8se2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdS5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24ocyl7YT0iIitzLF8uY2FsbCh0aGlzLHMpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLG8se2VudW1lcmFibGU6aS5lbnVtZXJhYmxlfSkse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldFZhbHVlOmZ1bmN0aW9uKHMpe2E9IiIrc30sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7cy5fdmFsdWVUcmFja2VyPW51bGwsZGVsZXRlIHNbb119fX19KHMpKX1mdW5jdGlvbiBXYShzKXtpZighcylyZXR1cm4hMTt2YXIgbz1zLl92YWx1ZVRyYWNrZXI7aWYoIW8pcmV0dXJuITA7dmFyIGk9by5nZXRWYWx1ZSgpLGE9IiI7cmV0dXJuIHMmJihhPVRhKHMpP3MuY2hlY2tlZD8idHJ1ZSI6ImZhbHNlIjpzLnZhbHVlKSwocz1hKSE9PWkmJihvLnNldFZhbHVlKHMpLCEwKX1mdW5jdGlvbiBYYShzKXtpZih2b2lkIDA9PT0ocz1zfHwoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudDp2b2lkIDApKSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIHMuYWN0aXZlRWxlbWVudHx8cy5ib2R5fWNhdGNoKG8pe3JldHVybiBzLmJvZHl9fWZ1bmN0aW9uIFlhKHMsbyl7dmFyIGk9by5jaGVja2VkO3JldHVybiB3ZSh7fSxvLHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTp2b2lkIDAsY2hlY2tlZDpudWxsIT1pP2k6cy5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gWmEocyxvKXt2YXIgaT1udWxsPT1vLmRlZmF1bHRWYWx1ZT8iIjpvLmRlZmF1bHRWYWx1ZSxhPW51bGwhPW8uY2hlY2tlZD9vLmNoZWNrZWQ6by5kZWZhdWx0Q2hlY2tlZDtpPVNhKG51bGwhPW8udmFsdWU/by52YWx1ZTppKSxzLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOmEsaW5pdGlhbFZhbHVlOmksY29udHJvbGxlZDoiY2hlY2tib3giPT09by50eXBlfHwicmFkaW8iPT09by50eXBlP251bGwhPW8uY2hlY2tlZDpudWxsIT1vLnZhbHVlfX1mdW5jdGlvbiBhYihzLG8pe251bGwhPShvPW8uY2hlY2tlZCkmJnRhKHMsImNoZWNrZWQiLG8sITEpfWZ1bmN0aW9uIGJiKHMsbyl7YWIocyxvKTt2YXIgaT1TYShvLnZhbHVlKSxhPW8udHlwZTtpZihudWxsIT1pKSJudW1iZXIiPT09YT8oMD09PWkmJiIiPT09cy52YWx1ZXx8cy52YWx1ZSE9aSkmJihzLnZhbHVlPSIiK2kpOnMudmFsdWUhPT0iIitpJiYocy52YWx1ZT0iIitpKTtlbHNlIGlmKCJzdWJtaXQiPT09YXx8InJlc2V0Ij09PWEpcmV0dXJuIHZvaWQgcy5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik7by5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKT9jYihzLG8udHlwZSxpKTpvLmhhc093blByb3BlcnR5KCJkZWZhdWx0VmFsdWUiKSYmY2IocyxvLnR5cGUsU2Eoby5kZWZhdWx0VmFsdWUpKSxudWxsPT1vLmNoZWNrZWQmJm51bGwhPW8uZGVmYXVsdENoZWNrZWQmJihzLmRlZmF1bHRDaGVja2VkPSEhby5kZWZhdWx0Q2hlY2tlZCl9ZnVuY3Rpb24gZGIocyxvLGkpe2lmKG8uaGFzT3duUHJvcGVydHkoInZhbHVlIil8fG8uaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpKXt2YXIgYT1vLnR5cGU7aWYoISgic3VibWl0IiE9PWEmJiJyZXNldCIhPT1hfHx2b2lkIDAhPT1vLnZhbHVlJiZudWxsIT09by52YWx1ZSkpcmV0dXJuO289IiIrcy5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSxpfHxvPT09cy52YWx1ZXx8KHMudmFsdWU9bykscy5kZWZhdWx0VmFsdWU9b30iIiE9PShpPXMubmFtZSkmJihzLm5hbWU9IiIpLHMuZGVmYXVsdENoZWNrZWQ9ISFzLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQsIiIhPT1pJiYocy5uYW1lPWkpfWZ1bmN0aW9uIGNiKHMsbyxpKXsibnVtYmVyIj09PW8mJlhhKHMub3duZXJEb2N1bWVudCk9PT1zfHwobnVsbD09aT9zLmRlZmF1bHRWYWx1ZT0iIitzLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlOnMuZGVmYXVsdFZhbHVlIT09IiIraSYmKHMuZGVmYXVsdFZhbHVlPSIiK2kpKX12YXIgUGU9QXJyYXkuaXNBcnJheTtmdW5jdGlvbiBmYihzLG8saSxhKXtpZihzPXMub3B0aW9ucyxvKXtvPXt9O2Zvcih2YXIgdT0wO3U8aS5sZW5ndGg7dSsrKW9bIiQiK2lbdV1dPSEwO2ZvcihpPTA7aTxzLmxlbmd0aDtpKyspdT1vLmhhc093blByb3BlcnR5KCIkIitzW2ldLnZhbHVlKSxzW2ldLnNlbGVjdGVkIT09dSYmKHNbaV0uc2VsZWN0ZWQ9dSksdSYmYSYmKHNbaV0uZGVmYXVsdFNlbGVjdGVkPSEwKX1lbHNle2ZvcihpPSIiK1NhKGkpLG89bnVsbCx1PTA7dTxzLmxlbmd0aDt1Kyspe2lmKHNbdV0udmFsdWU9PT1pKXJldHVybiBzW3VdLnNlbGVjdGVkPSEwLHZvaWQoYSYmKHNbdV0uZGVmYXVsdFNlbGVjdGVkPSEwKSk7bnVsbCE9PW98fHNbdV0uZGlzYWJsZWR8fChvPXNbdV0pfW51bGwhPT1vJiYoby5zZWxlY3RlZD0hMCl9fWZ1bmN0aW9uIGdiKHMsbyl7aWYobnVsbCE9by5kYW5nZXJvdXNseVNldElubmVySFRNTCl0aHJvdyBFcnJvcihwKDkxKSk7cmV0dXJuIHdlKHt9LG8se3ZhbHVlOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOiIiK3MuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWV9KX1mdW5jdGlvbiBoYihzLG8pe3ZhciBpPW8udmFsdWU7aWYobnVsbD09aSl7aWYoaT1vLmNoaWxkcmVuLG89by5kZWZhdWx0VmFsdWUsbnVsbCE9aSl7aWYobnVsbCE9byl0aHJvdyBFcnJvcihwKDkyKSk7aWYoUGUoaSkpe2lmKDE8aS5sZW5ndGgpdGhyb3cgRXJyb3IocCg5MykpO2k9aVswXX1vPWl9bnVsbD09byYmKG89IiIpLGk9b31zLl93cmFwcGVyU3RhdGU9e2luaXRpYWxWYWx1ZTpTYShpKX19ZnVuY3Rpb24gaWIocyxvKXt2YXIgaT1TYShvLnZhbHVlKSxhPVNhKG8uZGVmYXVsdFZhbHVlKTtudWxsIT1pJiYoKGk9IiIraSkhPT1zLnZhbHVlJiYocy52YWx1ZT1pKSxudWxsPT1vLmRlZmF1bHRWYWx1ZSYmcy5kZWZhdWx0VmFsdWUhPT1pJiYocy5kZWZhdWx0VmFsdWU9aSkpLG51bGwhPWEmJihzLmRlZmF1bHRWYWx1ZT0iIithKX1mdW5jdGlvbiBqYihzKXt2YXIgbz1zLnRleHRDb250ZW50O289PT1zLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlJiYiIiE9PW8mJm51bGwhPT1vJiYocy52YWx1ZT1vKX1mdW5jdGlvbiBrYihzKXtzd2l0Y2gocyl7Y2FzZSJzdmciOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7Y2FzZSJtYXRoIjpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI7ZGVmYXVsdDpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCJ9fWZ1bmN0aW9uIGxiKHMsbyl7cmV0dXJuIG51bGw9PXN8fCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PXM/a2Iobyk6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj09PXMmJiJmb3JlaWduT2JqZWN0Ij09PW8/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOnN9dmFyIFRlLFJlLCRlPShSZT1mdW5jdGlvbihzLG8pe2lmKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIhPT1zLm5hbWVzcGFjZVVSSXx8ImlubmVySFRNTCJpbiBzKXMuaW5uZXJIVE1MPW87ZWxzZXtmb3IoKFRlPVRlfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPSI8c3ZnPiIrby52YWx1ZU9mKCkudG9TdHJpbmcoKSsiPC9zdmc+IixvPVRlLmZpcnN0Q2hpbGQ7cy5maXJzdENoaWxkOylzLnJlbW92ZUNoaWxkKHMuZmlyc3RDaGlsZCk7Zm9yKDtvLmZpcnN0Q2hpbGQ7KXMuYXBwZW5kQ2hpbGQoby5maXJzdENoaWxkKX19LCJ1bmRlZmluZWQiIT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHMsbyxpLGEpe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKChmdW5jdGlvbigpe3JldHVybiBSZShzLG8pfSkpfTpSZSk7ZnVuY3Rpb24gb2IocyxvKXtpZihvKXt2YXIgaT1zLmZpcnN0Q2hpbGQ7aWYoaSYmaT09PXMubGFzdENoaWxkJiYzPT09aS5ub2RlVHlwZSlyZXR1cm4gdm9pZChpLm5vZGVWYWx1ZT1vKX1zLnRleHRDb250ZW50PW99dmFyIHFlPXthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZU91dHNldDohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGJvcmRlckltYWdlV2lkdGg6ITAsYm94RmxleDohMCxib3hGbGV4R3JvdXA6ITAsYm94T3JkaW5hbEdyb3VwOiEwLGNvbHVtbkNvdW50OiEwLGNvbHVtbnM6ITAsZmxleDohMCxmbGV4R3JvdzohMCxmbGV4UG9zaXRpdmU6ITAsZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVyOiEwLGdyaWRBcmVhOiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3BhbjohMCxncmlkUm93U3RhcnQ6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TcGFuOiEwLGdyaWRDb2x1bW5TdGFydDohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSx6ZT1bIldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO2Z1bmN0aW9uIHJiKHMsbyxpKXtyZXR1cm4gbnVsbD09b3x8ImJvb2xlYW4iPT10eXBlb2Ygb3x8IiI9PT1vPyIiOml8fCJudW1iZXIiIT10eXBlb2Ygb3x8MD09PW98fHFlLmhhc093blByb3BlcnR5KHMpJiZxZVtzXT8oIiIrbykudHJpbSgpOm8rInB4In1mdW5jdGlvbiBzYihzLG8pe2Zvcih2YXIgaSBpbiBzPXMuc3R5bGUsbylpZihvLmhhc093blByb3BlcnR5KGkpKXt2YXIgYT0wPT09aS5pbmRleE9mKCItLSIpLHU9cmIoaSxvW2ldLGEpOyJmbG9hdCI9PT1pJiYoaT0iY3NzRmxvYXQiKSxhP3Muc2V0UHJvcGVydHkoaSx1KTpzW2ldPXV9fU9iamVjdC5rZXlzKHFlKS5mb3JFYWNoKChmdW5jdGlvbihzKXt6ZS5mb3JFYWNoKChmdW5jdGlvbihvKXtvPW8rcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStzLnN1YnN0cmluZygxKSxxZVtvXT1xZVtzXX0pKX0pKTt2YXIgV2U9d2Uoe21lbnVpdGVtOiEwfSx7YXJlYTohMCxiYXNlOiEwLGJyOiEwLGNvbDohMCxlbWJlZDohMCxocjohMCxpbWc6ITAsaW5wdXQ6ITAsa2V5Z2VuOiEwLGxpbms6ITAsbWV0YTohMCxwYXJhbTohMCxzb3VyY2U6ITAsdHJhY2s6ITAsd2JyOiEwfSk7ZnVuY3Rpb24gdWIocyxvKXtpZihvKXtpZihXZVtzXSYmKG51bGwhPW8uY2hpbGRyZW58fG51bGwhPW8uZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKHAoMTM3LHMpKTtpZihudWxsIT1vLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKXtpZihudWxsIT1vLmNoaWxkcmVuKXRocm93IEVycm9yKHAoNjApKTtpZigib2JqZWN0IiE9dHlwZW9mIG8uZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUx8fCEoIl9faHRtbCJpbiBvLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcihwKDYxKSl9aWYobnVsbCE9by5zdHlsZSYmIm9iamVjdCIhPXR5cGVvZiBvLnN0eWxlKXRocm93IEVycm9yKHAoNjIpKX19ZnVuY3Rpb24gdmIocyxvKXtpZigtMT09PXMuaW5kZXhPZigiLSIpKXJldHVybiJzdHJpbmciPT10eXBlb2Ygby5pcztzd2l0Y2gocyl7Y2FzZSJhbm5vdGF0aW9uLXhtbCI6Y2FzZSJjb2xvci1wcm9maWxlIjpjYXNlImZvbnQtZmFjZSI6Y2FzZSJmb250LWZhY2Utc3JjIjpjYXNlImZvbnQtZmFjZS11cmkiOmNhc2UiZm9udC1mYWNlLWZvcm1hdCI6Y2FzZSJmb250LWZhY2UtbmFtZSI6Y2FzZSJtaXNzaW5nLWdseXBoIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgSGU9bnVsbDtmdW5jdGlvbiB4YihzKXtyZXR1cm4ocz1zLnRhcmdldHx8cy5zcmNFbGVtZW50fHx3aW5kb3cpLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYocz1zLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSwzPT09cy5ub2RlVHlwZT9zLnBhcmVudE5vZGU6c312YXIgWWU9bnVsbCxYZT1udWxsLFFlPW51bGw7ZnVuY3Rpb24gQmIocyl7aWYocz1DYihzKSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIFllKXRocm93IEVycm9yKHAoMjgwKSk7dmFyIG89cy5zdGF0ZU5vZGU7byYmKG89RGIobyksWWUocy5zdGF0ZU5vZGUscy50eXBlLG8pKX19ZnVuY3Rpb24gRWIocyl7WGU/UWU/UWUucHVzaChzKTpRZT1bc106WGU9c31mdW5jdGlvbiBGYigpe2lmKFhlKXt2YXIgcz1YZSxvPVFlO2lmKFFlPVhlPW51bGwsQmIocyksbylmb3Iocz0wO3M8by5sZW5ndGg7cysrKUJiKG9bc10pfX1mdW5jdGlvbiBHYihzLG8pe3JldHVybiBzKG8pfWZ1bmN0aW9uIEhiKCl7fXZhciBldD0hMTtmdW5jdGlvbiBKYihzLG8saSl7aWYoZXQpcmV0dXJuIHMobyxpKTtldD0hMDt0cnl7cmV0dXJuIEdiKHMsbyxpKX1maW5hbGx5e2V0PSExLChudWxsIT09WGV8fG51bGwhPT1RZSkmJihIYigpLEZiKCkpfX1mdW5jdGlvbiBLYihzLG8pe3ZhciBpPXMuc3RhdGVOb2RlO2lmKG51bGw9PT1pKXJldHVybiBudWxsO3ZhciBhPURiKGkpO2lmKG51bGw9PT1hKXJldHVybiBudWxsO2k9YVtvXTtlOnN3aXRjaChvKXtjYXNlIm9uQ2xpY2siOmNhc2Uib25DbGlja0NhcHR1cmUiOmNhc2Uib25Eb3VibGVDbGljayI6Y2FzZSJvbkRvdWJsZUNsaWNrQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRG93biI6Y2FzZSJvbk1vdXNlRG93bkNhcHR1cmUiOmNhc2Uib25Nb3VzZU1vdmUiOmNhc2Uib25Nb3VzZU1vdmVDYXB0dXJlIjpjYXNlIm9uTW91c2VVcCI6Y2FzZSJvbk1vdXNlVXBDYXB0dXJlIjpjYXNlIm9uTW91c2VFbnRlciI6KGE9IWEuZGlzYWJsZWQpfHwoYT0hKCJidXR0b24iPT09KHM9cy50eXBlKXx8ImlucHV0Ij09PXN8fCJzZWxlY3QiPT09c3x8InRleHRhcmVhIj09PXMpKSxzPSFhO2JyZWFrIGU7ZGVmYXVsdDpzPSExfWlmKHMpcmV0dXJuIG51bGw7aWYoaSYmImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhyb3cgRXJyb3IocCgyMzEsbyx0eXBlb2YgaSkpO3JldHVybiBpfXZhciB0dD0hMTtpZih4KXRyeXt2YXIgcnQ9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHJ0LCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7dHQ9ITB9fSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLHJ0LHJ0KSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIscnQscnQpfWNhdGNoKFJlKXt0dD0hMX1mdW5jdGlvbiBOYihzLG8saSxhLHUsXyx3LHgsQyl7dmFyIGo9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO3RyeXtvLmFwcGx5KGksail9Y2F0Y2gocyl7dGhpcy5vbkVycm9yKHMpfX12YXIgbnQ9ITEsc3Q9bnVsbCxvdD0hMSxpdD1udWxsLGF0PXtvbkVycm9yOmZ1bmN0aW9uKHMpe250PSEwLHN0PXN9fTtmdW5jdGlvbiBUYihzLG8saSxhLHUsXyx3LHgsQyl7bnQ9ITEsc3Q9bnVsbCxOYi5hcHBseShhdCxhcmd1bWVudHMpfWZ1bmN0aW9uIFZiKHMpe3ZhciBvPXMsaT1zO2lmKHMuYWx0ZXJuYXRlKWZvcig7by5yZXR1cm47KW89by5yZXR1cm47ZWxzZXtzPW87ZG97ISEoNDA5OCYobz1zKS5mbGFncykmJihpPW8ucmV0dXJuKSxzPW8ucmV0dXJufXdoaWxlKHMpfXJldHVybiAzPT09by50YWc/aTpudWxsfWZ1bmN0aW9uIFdiKHMpe2lmKDEzPT09cy50YWcpe3ZhciBvPXMubWVtb2l6ZWRTdGF0ZTtpZihudWxsPT09byYmKG51bGwhPT0ocz1zLmFsdGVybmF0ZSkmJihvPXMubWVtb2l6ZWRTdGF0ZSkpLG51bGwhPT1vKXJldHVybiBvLmRlaHlkcmF0ZWR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gWGIocyl7aWYoVmIocykhPT1zKXRocm93IEVycm9yKHAoMTg4KSl9ZnVuY3Rpb24gWmIocyl7cmV0dXJuIG51bGwhPT0ocz1mdW5jdGlvbiBZYihzKXt2YXIgbz1zLmFsdGVybmF0ZTtpZighbyl7aWYobnVsbD09PShvPVZiKHMpKSl0aHJvdyBFcnJvcihwKDE4OCkpO3JldHVybiBvIT09cz9udWxsOnN9Zm9yKHZhciBpPXMsYT1vOzspe3ZhciB1PWkucmV0dXJuO2lmKG51bGw9PT11KWJyZWFrO3ZhciBfPXUuYWx0ZXJuYXRlO2lmKG51bGw9PT1fKXtpZihudWxsIT09KGE9dS5yZXR1cm4pKXtpPWE7Y29udGludWV9YnJlYWt9aWYodS5jaGlsZD09PV8uY2hpbGQpe2ZvcihfPXUuY2hpbGQ7Xzspe2lmKF89PT1pKXJldHVybiBYYih1KSxzO2lmKF89PT1hKXJldHVybiBYYih1KSxvO189Xy5zaWJsaW5nfXRocm93IEVycm9yKHAoMTg4KSl9aWYoaS5yZXR1cm4hPT1hLnJldHVybilpPXUsYT1fO2Vsc2V7Zm9yKHZhciB3PSExLHg9dS5jaGlsZDt4Oyl7aWYoeD09PWkpe3c9ITAsaT11LGE9XzticmVha31pZih4PT09YSl7dz0hMCxhPXUsaT1fO2JyZWFrfXg9eC5zaWJsaW5nfWlmKCF3KXtmb3IoeD1fLmNoaWxkO3g7KXtpZih4PT09aSl7dz0hMCxpPV8sYT11O2JyZWFrfWlmKHg9PT1hKXt3PSEwLGE9XyxpPXU7YnJlYWt9eD14LnNpYmxpbmd9aWYoIXcpdGhyb3cgRXJyb3IocCgxODkpKX19aWYoaS5hbHRlcm5hdGUhPT1hKXRocm93IEVycm9yKHAoMTkwKSl9aWYoMyE9PWkudGFnKXRocm93IEVycm9yKHAoMTg4KSk7cmV0dXJuIGkuc3RhdGVOb2RlLmN1cnJlbnQ9PT1pP3M6b30ocykpPyRiKHMpOm51bGx9ZnVuY3Rpb24gJGIocyl7aWYoNT09PXMudGFnfHw2PT09cy50YWcpcmV0dXJuIHM7Zm9yKHM9cy5jaGlsZDtudWxsIT09czspe3ZhciBvPSRiKHMpO2lmKG51bGwhPT1vKXJldHVybiBvO3M9cy5zaWJsaW5nfXJldHVybiBudWxsfXZhciBjdD11LnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssbHQ9dS51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayx1dD11LnVuc3RhYmxlX3Nob3VsZFlpZWxkLHB0PXUudW5zdGFibGVfcmVxdWVzdFBhaW50LGh0PXUudW5zdGFibGVfbm93LGR0PXUudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsbXQ9dS51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSxndD11LnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LHl0PXUudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksdnQ9dS51bnN0YWJsZV9Mb3dQcmlvcml0eSxidD11LnVuc3RhYmxlX0lkbGVQcmlvcml0eSxTdD1udWxsLF90PW51bGw7dmFyIEV0PU1hdGguY2x6MzI/TWF0aC5jbHozMjpmdW5jdGlvbiBuYyhzKXtyZXR1cm4gcz4+Pj0wLDA9PT1zPzMyOjMxLSh3dChzKS94dHwwKXwwfSx3dD1NYXRoLmxvZyx4dD1NYXRoLkxOMjt2YXIga3Q9NjQsT3Q9NDE5NDMwNDtmdW5jdGlvbiB0YyhzKXtzd2l0Y2gocyYtcyl7Y2FzZSAxOnJldHVybiAxO2Nhc2UgMjpyZXR1cm4gMjtjYXNlIDQ6cmV0dXJuIDQ7Y2FzZSA4OnJldHVybiA4O2Nhc2UgMTY6cmV0dXJuIDE2O2Nhc2UgMzI6cmV0dXJuIDMyO2Nhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6cmV0dXJuIDQxOTQyNDAmcztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybiAxMzAwMjM0MjQmcztjYXNlIDEzNDIxNzcyODpyZXR1cm4gMTM0MjE3NzI4O2Nhc2UgMjY4NDM1NDU2OnJldHVybiAyNjg0MzU0NTY7Y2FzZSA1MzY4NzA5MTI6cmV0dXJuIDUzNjg3MDkxMjtjYXNlIDEwNzM3NDE4MjQ6cmV0dXJuIDEwNzM3NDE4MjQ7ZGVmYXVsdDpyZXR1cm4gc319ZnVuY3Rpb24gdWMocyxvKXt2YXIgaT1zLnBlbmRpbmdMYW5lcztpZigwPT09aSlyZXR1cm4gMDt2YXIgYT0wLHU9cy5zdXNwZW5kZWRMYW5lcyxfPXMucGluZ2VkTGFuZXMsdz0yNjg0MzU0NTUmaTtpZigwIT09dyl7dmFyIHg9dyZ+dTswIT09eD9hPXRjKHgpOjAhPT0oXyY9dykmJihhPXRjKF8pKX1lbHNlIDAhPT0odz1pJn51KT9hPXRjKHcpOjAhPT1fJiYoYT10YyhfKSk7aWYoMD09PWEpcmV0dXJuIDA7aWYoMCE9PW8mJm8hPT1hJiYhKG8mdSkmJigodT1hJi1hKT49KF89byYtbyl8fDE2PT09dSYmNDE5NDI0MCZfKSlyZXR1cm4gbztpZig0JmEmJihhfD0xNiZpKSwwIT09KG89cy5lbnRhbmdsZWRMYW5lcykpZm9yKHM9cy5lbnRhbmdsZW1lbnRzLG8mPWE7MDxvOyl1PTE8PChpPTMxLUV0KG8pKSxhfD1zW2ldLG8mPX51O3JldHVybiBhfWZ1bmN0aW9uIHZjKHMsbyl7c3dpdGNoKHMpe2Nhc2UgMTpjYXNlIDI6Y2FzZSA0OnJldHVybiBvKzI1MDtjYXNlIDg6Y2FzZSAxNjpjYXNlIDMyOmNhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6cmV0dXJuIG8rNWUzO2RlZmF1bHQ6cmV0dXJuLTF9fWZ1bmN0aW9uIHhjKHMpe3JldHVybiAwIT09KHM9LTEwNzM3NDE4MjUmcy5wZW5kaW5nTGFuZXMpP3M6MTA3Mzc0MTgyNCZzPzEwNzM3NDE4MjQ6MH1mdW5jdGlvbiB5Yygpe3ZhciBzPWt0O3JldHVybiEoNDE5NDI0MCYoa3Q8PD0xKSkmJihrdD02NCksc31mdW5jdGlvbiB6YyhzKXtmb3IodmFyIG89W10saT0wOzMxPmk7aSsrKW8ucHVzaChzKTtyZXR1cm4gb31mdW5jdGlvbiBBYyhzLG8saSl7cy5wZW5kaW5nTGFuZXN8PW8sNTM2ODcwOTEyIT09byYmKHMuc3VzcGVuZGVkTGFuZXM9MCxzLnBpbmdlZExhbmVzPTApLChzPXMuZXZlbnRUaW1lcylbbz0zMS1FdChvKV09aX1mdW5jdGlvbiBDYyhzLG8pe3ZhciBpPXMuZW50YW5nbGVkTGFuZXN8PW87Zm9yKHM9cy5lbnRhbmdsZW1lbnRzO2k7KXt2YXIgYT0zMS1FdChpKSx1PTE8PGE7dSZvfHNbYV0mbyYmKHNbYV18PW8pLGkmPX51fX12YXIgQXQ9MDtmdW5jdGlvbiBEYyhzKXtyZXR1cm4gMTwocyY9LXMpPzQ8cz8yNjg0MzU0NTUmcz8xNjo1MzY4NzA5MTI6NDoxfXZhciBDdCxqdCxQdCxJdCxUdCxOdD0hMSxNdD1bXSxSdD1udWxsLER0PW51bGwsTHQ9bnVsbCxGdD1uZXcgTWFwLEJ0PW5ldyBNYXAsJHQ9W10scXQ9Im1vdXNlZG93biBtb3VzZXVwIHRvdWNoY2FuY2VsIHRvdWNoZW5kIHRvdWNoc3RhcnQgYXV4Y2xpY2sgZGJsY2xpY2sgcG9pbnRlcmNhbmNlbCBwb2ludGVyZG93biBwb2ludGVydXAgZHJhZ2VuZCBkcmFnc3RhcnQgZHJvcCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgaW5wdXQgdGV4dElucHV0IGNvcHkgY3V0IHBhc3RlIGNsaWNrIGNoYW5nZSBjb250ZXh0bWVudSByZXNldCBzdWJtaXQiLnNwbGl0KCIgIik7ZnVuY3Rpb24gU2MocyxvKXtzd2l0Y2gocyl7Y2FzZSJmb2N1c2luIjpjYXNlImZvY3Vzb3V0IjpSdD1udWxsO2JyZWFrO2Nhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdsZWF2ZSI6RHQ9bnVsbDticmVhaztjYXNlIm1vdXNlb3ZlciI6Y2FzZSJtb3VzZW91dCI6THQ9bnVsbDticmVhaztjYXNlInBvaW50ZXJvdmVyIjpjYXNlInBvaW50ZXJvdXQiOkZ0LmRlbGV0ZShvLnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJsb3N0cG9pbnRlcmNhcHR1cmUiOkJ0LmRlbGV0ZShvLnBvaW50ZXJJZCl9fWZ1bmN0aW9uIFRjKHMsbyxpLGEsdSxfKXtyZXR1cm4gbnVsbD09PXN8fHMubmF0aXZlRXZlbnQhPT1fPyhzPXtibG9ja2VkT246byxkb21FdmVudE5hbWU6aSxldmVudFN5c3RlbUZsYWdzOmEsbmF0aXZlRXZlbnQ6Xyx0YXJnZXRDb250YWluZXJzOlt1XX0sbnVsbCE9PW8mJihudWxsIT09KG89Q2IobykpJiZqdChvKSkscyk6KHMuZXZlbnRTeXN0ZW1GbGFnc3w9YSxvPXMudGFyZ2V0Q29udGFpbmVycyxudWxsIT09dSYmLTE9PT1vLmluZGV4T2YodSkmJm8ucHVzaCh1KSxzKX1mdW5jdGlvbiBWYyhzKXt2YXIgbz1XYyhzLnRhcmdldCk7aWYobnVsbCE9PW8pe3ZhciBpPVZiKG8pO2lmKG51bGwhPT1pKWlmKDEzPT09KG89aS50YWcpKXtpZihudWxsIT09KG89V2IoaSkpKXJldHVybiBzLmJsb2NrZWRPbj1vLHZvaWQgVHQocy5wcmlvcml0eSwoZnVuY3Rpb24oKXtQdChpKX0pKX1lbHNlIGlmKDM9PT1vJiZpLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiB2b2lkKHMuYmxvY2tlZE9uPTM9PT1pLnRhZz9pLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGwpfXMuYmxvY2tlZE9uPW51bGx9ZnVuY3Rpb24gWGMocyl7aWYobnVsbCE9PXMuYmxvY2tlZE9uKXJldHVybiExO2Zvcih2YXIgbz1zLnRhcmdldENvbnRhaW5lcnM7MDxvLmxlbmd0aDspe3ZhciBpPVljKHMuZG9tRXZlbnROYW1lLHMuZXZlbnRTeXN0ZW1GbGFncyxvWzBdLHMubmF0aXZlRXZlbnQpO2lmKG51bGwhPT1pKXJldHVybiBudWxsIT09KG89Q2IoaSkpJiZqdChvKSxzLmJsb2NrZWRPbj1pLCExO3ZhciBhPW5ldyhpPXMubmF0aXZlRXZlbnQpLmNvbnN0cnVjdG9yKGkudHlwZSxpKTtIZT1hLGkudGFyZ2V0LmRpc3BhdGNoRXZlbnQoYSksSGU9bnVsbCxvLnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gWmMocyxvLGkpe1hjKHMpJiZpLmRlbGV0ZShvKX1mdW5jdGlvbiAkYygpe050PSExLG51bGwhPT1SdCYmWGMoUnQpJiYoUnQ9bnVsbCksbnVsbCE9PUR0JiZYYyhEdCkmJihEdD1udWxsKSxudWxsIT09THQmJlhjKEx0KSYmKEx0PW51bGwpLEZ0LmZvckVhY2goWmMpLEJ0LmZvckVhY2goWmMpfWZ1bmN0aW9uIGFkKHMsbyl7cy5ibG9ja2VkT249PT1vJiYocy5ibG9ja2VkT249bnVsbCxOdHx8KE50PSEwLHUudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayh1LnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCRjKSkpfWZ1bmN0aW9uIGJkKHMpe2Z1bmN0aW9uIGIobyl7cmV0dXJuIGFkKG8scyl9aWYoMDxNdC5sZW5ndGgpe2FkKE10WzBdLHMpO2Zvcih2YXIgbz0xO288TXQubGVuZ3RoO28rKyl7dmFyIGk9TXRbb107aS5ibG9ja2VkT249PT1zJiYoaS5ibG9ja2VkT249bnVsbCl9fWZvcihudWxsIT09UnQmJmFkKFJ0LHMpLG51bGwhPT1EdCYmYWQoRHQscyksbnVsbCE9PUx0JiZhZChMdCxzKSxGdC5mb3JFYWNoKGIpLEJ0LmZvckVhY2goYiksbz0wO288JHQubGVuZ3RoO28rKykoaT0kdFtvXSkuYmxvY2tlZE9uPT09cyYmKGkuYmxvY2tlZE9uPW51bGwpO2Zvcig7MDwkdC5sZW5ndGgmJm51bGw9PT0obz0kdFswXSkuYmxvY2tlZE9uOylWYyhvKSxudWxsPT09by5ibG9ja2VkT24mJiR0LnNoaWZ0KCl9dmFyIFV0PVYuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsVnQ9ITA7ZnVuY3Rpb24gZWQocyxvLGksYSl7dmFyIHU9QXQsXz1VdC50cmFuc2l0aW9uO1V0LnRyYW5zaXRpb249bnVsbDt0cnl7QXQ9MSxmZChzLG8saSxhKX1maW5hbGx5e0F0PXUsVXQudHJhbnNpdGlvbj1ffX1mdW5jdGlvbiBnZChzLG8saSxhKXt2YXIgdT1BdCxfPVV0LnRyYW5zaXRpb247VXQudHJhbnNpdGlvbj1udWxsO3RyeXtBdD00LGZkKHMsbyxpLGEpfWZpbmFsbHl7QXQ9dSxVdC50cmFuc2l0aW9uPV99fWZ1bmN0aW9uIGZkKHMsbyxpLGEpe2lmKFZ0KXt2YXIgdT1ZYyhzLG8saSxhKTtpZihudWxsPT09dSloZChzLG8sYSx6dCxpKSxTYyhzLGEpO2Vsc2UgaWYoZnVuY3Rpb24gVWMocyxvLGksYSx1KXtzd2l0Y2gobyl7Y2FzZSJmb2N1c2luIjpyZXR1cm4gUnQ9VGMoUnQscyxvLGksYSx1KSwhMDtjYXNlImRyYWdlbnRlciI6cmV0dXJuIER0PVRjKER0LHMsbyxpLGEsdSksITA7Y2FzZSJtb3VzZW92ZXIiOnJldHVybiBMdD1UYyhMdCxzLG8saSxhLHUpLCEwO2Nhc2UicG9pbnRlcm92ZXIiOnZhciBfPXUucG9pbnRlcklkO3JldHVybiBGdC5zZXQoXyxUYyhGdC5nZXQoXyl8fG51bGwscyxvLGksYSx1KSksITA7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6cmV0dXJuIF89dS5wb2ludGVySWQsQnQuc2V0KF8sVGMoQnQuZ2V0KF8pfHxudWxsLHMsbyxpLGEsdSkpLCEwfXJldHVybiExfSh1LHMsbyxpLGEpKWEuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihTYyhzLGEpLDQmbyYmLTE8cXQuaW5kZXhPZihzKSl7Zm9yKDtudWxsIT09dTspe3ZhciBfPUNiKHUpO2lmKG51bGwhPT1fJiZDdChfKSxudWxsPT09KF89WWMocyxvLGksYSkpJiZoZChzLG8sYSx6dCxpKSxfPT09dSlicmVhazt1PV99bnVsbCE9PXUmJmEuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZSBoZChzLG8sYSxudWxsLGkpfX12YXIgenQ9bnVsbDtmdW5jdGlvbiBZYyhzLG8saSxhKXtpZih6dD1udWxsLG51bGwhPT0ocz1XYyhzPXhiKGEpKSkpaWYobnVsbD09PShvPVZiKHMpKSlzPW51bGw7ZWxzZSBpZigxMz09PShpPW8udGFnKSl7aWYobnVsbCE9PShzPVdiKG8pKSlyZXR1cm4gcztzPW51bGx9ZWxzZSBpZigzPT09aSl7aWYoby5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZClyZXR1cm4gMz09PW8udGFnP28uc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtzPW51bGx9ZWxzZSBvIT09cyYmKHM9bnVsbCk7cmV0dXJuIHp0PXMsbnVsbH1mdW5jdGlvbiBqZChzKXtzd2l0Y2gocyl7Y2FzZSJjYW5jZWwiOmNhc2UiY2xpY2siOmNhc2UiY2xvc2UiOmNhc2UiY29udGV4dG1lbnUiOmNhc2UiY29weSI6Y2FzZSJjdXQiOmNhc2UiYXV4Y2xpY2siOmNhc2UiZGJsY2xpY2siOmNhc2UiZHJhZ2VuZCI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6Y2FzZSJmb2N1c2luIjpjYXNlImZvY3Vzb3V0IjpjYXNlImlucHV0IjpjYXNlImludmFsaWQiOmNhc2Uia2V5ZG93biI6Y2FzZSJrZXlwcmVzcyI6Y2FzZSJrZXl1cCI6Y2FzZSJtb3VzZWRvd24iOmNhc2UibW91c2V1cCI6Y2FzZSJwYXN0ZSI6Y2FzZSJwYXVzZSI6Y2FzZSJwbGF5IjpjYXNlInBvaW50ZXJjYW5jZWwiOmNhc2UicG9pbnRlcmRvd24iOmNhc2UicG9pbnRlcnVwIjpjYXNlInJhdGVjaGFuZ2UiOmNhc2UicmVzZXQiOmNhc2UicmVzaXplIjpjYXNlInNlZWtlZCI6Y2FzZSJzdWJtaXQiOmNhc2UidG91Y2hjYW5jZWwiOmNhc2UidG91Y2hlbmQiOmNhc2UidG91Y2hzdGFydCI6Y2FzZSJ2b2x1bWVjaGFuZ2UiOmNhc2UiY2hhbmdlIjpjYXNlInNlbGVjdGlvbmNoYW5nZSI6Y2FzZSJ0ZXh0SW5wdXQiOmNhc2UiY29tcG9zaXRpb25zdGFydCI6Y2FzZSJjb21wb3NpdGlvbmVuZCI6Y2FzZSJjb21wb3NpdGlvbnVwZGF0ZSI6Y2FzZSJiZWZvcmVibHVyIjpjYXNlImFmdGVyYmx1ciI6Y2FzZSJiZWZvcmVpbnB1dCI6Y2FzZSJibHVyIjpjYXNlImZ1bGxzY3JlZW5jaGFuZ2UiOmNhc2UiZm9jdXMiOmNhc2UiaGFzaGNoYW5nZSI6Y2FzZSJwb3BzdGF0ZSI6Y2FzZSJzZWxlY3QiOmNhc2Uic2VsZWN0c3RhcnQiOnJldHVybiAxO2Nhc2UiZHJhZyI6Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2V4aXQiOmNhc2UiZHJhZ2xlYXZlIjpjYXNlImRyYWdvdmVyIjpjYXNlIm1vdXNlbW92ZSI6Y2FzZSJtb3VzZW91dCI6Y2FzZSJtb3VzZW92ZXIiOmNhc2UicG9pbnRlcm1vdmUiOmNhc2UicG9pbnRlcm91dCI6Y2FzZSJwb2ludGVyb3ZlciI6Y2FzZSJzY3JvbGwiOmNhc2UidG9nZ2xlIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ3aGVlbCI6Y2FzZSJtb3VzZWVudGVyIjpjYXNlIm1vdXNlbGVhdmUiOmNhc2UicG9pbnRlcmVudGVyIjpjYXNlInBvaW50ZXJsZWF2ZSI6cmV0dXJuIDQ7Y2FzZSJtZXNzYWdlIjpzd2l0Y2goZHQoKSl7Y2FzZSBtdDpyZXR1cm4gMTtjYXNlIGd0OnJldHVybiA0O2Nhc2UgeXQ6Y2FzZSB2dDpyZXR1cm4gMTY7Y2FzZSBidDpyZXR1cm4gNTM2ODcwOTEyO2RlZmF1bHQ6cmV0dXJuIDE2fWRlZmF1bHQ6cmV0dXJuIDE2fX12YXIgV3Q9bnVsbCxKdD1udWxsLEh0PW51bGw7ZnVuY3Rpb24gbmQoKXtpZihIdClyZXR1cm4gSHQ7dmFyIHMsbyxpPUp0LGE9aS5sZW5ndGgsdT0idmFsdWUiaW4gV3Q/V3QudmFsdWU6V3QudGV4dENvbnRlbnQsXz11Lmxlbmd0aDtmb3Iocz0wO3M8YSYmaVtzXT09PXVbc107cysrKTt2YXIgdz1hLXM7Zm9yKG89MTtvPD13JiZpW2Etb109PT11W18tb107bysrKTtyZXR1cm4gSHQ9dS5zbGljZShzLDE8bz8xLW86dm9pZCAwKX1mdW5jdGlvbiBvZChzKXt2YXIgbz1zLmtleUNvZGU7cmV0dXJuImNoYXJDb2RlImluIHM/MD09PShzPXMuY2hhckNvZGUpJiYxMz09PW8mJihzPTEzKTpzPW8sMTA9PT1zJiYocz0xMyksMzI8PXN8fDEzPT09cz9zOjB9ZnVuY3Rpb24gcGQoKXtyZXR1cm4hMH1mdW5jdGlvbiBxZCgpe3JldHVybiExfWZ1bmN0aW9uIHJkKHMpe2Z1bmN0aW9uIGIobyxpLGEsdSxfKXtmb3IodmFyIHcgaW4gdGhpcy5fcmVhY3ROYW1lPW8sdGhpcy5fdGFyZ2V0SW5zdD1hLHRoaXMudHlwZT1pLHRoaXMubmF0aXZlRXZlbnQ9dSx0aGlzLnRhcmdldD1fLHRoaXMuY3VycmVudFRhcmdldD1udWxsLHMpcy5oYXNPd25Qcm9wZXJ0eSh3KSYmKG89c1t3XSx0aGlzW3ddPW8/byh1KTp1W3ddKTtyZXR1cm4gdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9KG51bGwhPXUuZGVmYXVsdFByZXZlbnRlZD91LmRlZmF1bHRQcmV2ZW50ZWQ6ITE9PT11LnJldHVyblZhbHVlKT9wZDpxZCx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXFkLHRoaXN9cmV0dXJuIHdlKGIucHJvdG90eXBlLHtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMDt2YXIgcz10aGlzLm5hdGl2ZUV2ZW50O3MmJihzLnByZXZlbnREZWZhdWx0P3MucHJldmVudERlZmF1bHQoKToidW5rbm93biIhPXR5cGVvZiBzLnJldHVyblZhbHVlJiYocy5yZXR1cm5WYWx1ZT0hMSksdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cGQpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgcz10aGlzLm5hdGl2ZUV2ZW50O3MmJihzLnN0b3BQcm9wYWdhdGlvbj9zLnN0b3BQcm9wYWdhdGlvbigpOiJ1bmtub3duIiE9dHlwZW9mIHMuY2FuY2VsQnViYmxlJiYocy5jYW5jZWxCdWJibGU9ITApLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cGQpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7fSxpc1BlcnNpc3RlbnQ6cGR9KSxifXZhciBLdCxHdCxZdCxYdD17ZXZlbnRQaGFzZTowLGJ1YmJsZXM6MCxjYW5jZWxhYmxlOjAsdGltZVN0YW1wOmZ1bmN0aW9uKHMpe3JldHVybiBzLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDowLGlzVHJ1c3RlZDowfSxRdD1yZChYdCksWnQ9d2Uoe30sWHQse3ZpZXc6MCxkZXRhaWw6MH0pLGVyPXJkKFp0KSx0cj13ZSh7fSxadCx7c2NyZWVuWDowLHNjcmVlblk6MCxjbGllbnRYOjAsY2xpZW50WTowLHBhZ2VYOjAscGFnZVk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTp6ZCxidXR0b246MCxidXR0b25zOjAscmVsYXRlZFRhcmdldDpmdW5jdGlvbihzKXtyZXR1cm4gdm9pZCAwPT09cy5yZWxhdGVkVGFyZ2V0P3MuZnJvbUVsZW1lbnQ9PT1zLnNyY0VsZW1lbnQ/cy50b0VsZW1lbnQ6cy5mcm9tRWxlbWVudDpzLnJlbGF0ZWRUYXJnZXR9LG1vdmVtZW50WDpmdW5jdGlvbihzKXtyZXR1cm4ibW92ZW1lbnRYImluIHM/cy5tb3ZlbWVudFg6KHMhPT1ZdCYmKFl0JiYibW91c2Vtb3ZlIj09PXMudHlwZT8oS3Q9cy5zY3JlZW5YLVl0LnNjcmVlblgsR3Q9cy5zY3JlZW5ZLVl0LnNjcmVlblkpOkd0PUt0PTAsWXQ9cyksS3QpfSxtb3ZlbWVudFk6ZnVuY3Rpb24ocyl7cmV0dXJuIm1vdmVtZW50WSJpbiBzP3MubW92ZW1lbnRZOkd0fX0pLHJyPXJkKHRyKSxucj1yZCh3ZSh7fSx0cix7ZGF0YVRyYW5zZmVyOjB9KSksc3I9cmQod2Uoe30sWnQse3JlbGF0ZWRUYXJnZXQ6MH0pKSxpcj1yZCh3ZSh7fSxYdCx7YW5pbWF0aW9uTmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSkpLGFyPXdlKHt9LFh0LHtjbGlwYm9hcmREYXRhOmZ1bmN0aW9uKHMpe3JldHVybiJjbGlwYm9hcmREYXRhImluIHM/cy5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX0pLGNyPXJkKGFyKSxscj1yZCh3ZSh7fSxYdCx7ZGF0YTowfSkpLHVyPXtFc2M6IkVzY2FwZSIsU3BhY2ViYXI6IiAiLExlZnQ6IkFycm93TGVmdCIsVXA6IkFycm93VXAiLFJpZ2h0OiJBcnJvd1JpZ2h0IixEb3duOiJBcnJvd0Rvd24iLERlbDoiRGVsZXRlIixXaW46Ik9TIixNZW51OiJDb250ZXh0TWVudSIsQXBwczoiQ29udGV4dE1lbnUiLFNjcm9sbDoiU2Nyb2xsTG9jayIsTW96UHJpbnRhYmxlS2V5OiJVbmlkZW50aWZpZWQifSxwcj17ODoiQmFja3NwYWNlIiw5OiJUYWIiLDEyOiJDbGVhciIsMTM6IkVudGVyIiwxNjoiU2hpZnQiLDE3OiJDb250cm9sIiwxODoiQWx0IiwxOToiUGF1c2UiLDIwOiJDYXBzTG9jayIsMjc6IkVzY2FwZSIsMzI6IiAiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVuZCIsMzY6IkhvbWUiLDM3OiJBcnJvd0xlZnQiLDM4OiJBcnJvd1VwIiwzOToiQXJyb3dSaWdodCIsNDA6IkFycm93RG93biIsNDU6Ikluc2VydCIsNDY6IkRlbGV0ZSIsMTEyOiJGMSIsMTEzOiJGMiIsMTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIwOiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTQ0OiJOdW1Mb2NrIiwxNDU6IlNjcm9sbExvY2siLDIyNDoiTWV0YSJ9LGRyPXtBbHQ6ImFsdEtleSIsQ29udHJvbDoiY3RybEtleSIsTWV0YToibWV0YUtleSIsU2hpZnQ6InNoaWZ0S2V5In07ZnVuY3Rpb24gUGQocyl7dmFyIG89dGhpcy5uYXRpdmVFdmVudDtyZXR1cm4gby5nZXRNb2RpZmllclN0YXRlP28uZ2V0TW9kaWZpZXJTdGF0ZShzKTohIShzPWRyW3NdKSYmISFvW3NdfWZ1bmN0aW9uIHpkKCl7cmV0dXJuIFBkfXZhciBmcj13ZSh7fSxadCx7a2V5OmZ1bmN0aW9uKHMpe2lmKHMua2V5KXt2YXIgbz11cltzLmtleV18fHMua2V5O2lmKCJVbmlkZW50aWZpZWQiIT09bylyZXR1cm4gb31yZXR1cm4ia2V5cHJlc3MiPT09cy50eXBlPzEzPT09KHM9b2QocykpPyJFbnRlciI6U3RyaW5nLmZyb21DaGFyQ29kZShzKToia2V5ZG93biI9PT1zLnR5cGV8fCJrZXl1cCI9PT1zLnR5cGU/cHJbcy5rZXlDb2RlXXx8IlVuaWRlbnRpZmllZCI6IiJ9LGNvZGU6MCxsb2NhdGlvbjowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxyZXBlYXQ6MCxsb2NhbGU6MCxnZXRNb2RpZmllclN0YXRlOnpkLGNoYXJDb2RlOmZ1bmN0aW9uKHMpe3JldHVybiJrZXlwcmVzcyI9PT1zLnR5cGU/b2Qocyk6MH0sa2V5Q29kZTpmdW5jdGlvbihzKXtyZXR1cm4ia2V5ZG93biI9PT1zLnR5cGV8fCJrZXl1cCI9PT1zLnR5cGU/cy5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKHMpe3JldHVybiJrZXlwcmVzcyI9PT1zLnR5cGU/b2Qocyk6ImtleWRvd24iPT09cy50eXBlfHwia2V5dXAiPT09cy50eXBlP3Mua2V5Q29kZTowfX0pLG1yPXJkKGZyKSxncj1yZCh3ZSh7fSx0cix7cG9pbnRlcklkOjAsd2lkdGg6MCxoZWlnaHQ6MCxwcmVzc3VyZTowLHRhbmdlbnRpYWxQcmVzc3VyZTowLHRpbHRYOjAsdGlsdFk6MCx0d2lzdDowLHBvaW50ZXJUeXBlOjAsaXNQcmltYXJ5OjB9KSkseXI9cmQod2Uoe30sWnQse3RvdWNoZXM6MCx0YXJnZXRUb3VjaGVzOjAsY2hhbmdlZFRvdWNoZXM6MCxhbHRLZXk6MCxtZXRhS2V5OjAsY3RybEtleTowLHNoaWZ0S2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTp6ZH0pKSx2cj1yZCh3ZSh7fSxYdCx7cHJvcGVydHlOYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSksYnI9d2Uoe30sdHIse2RlbHRhWDpmdW5jdGlvbihzKXtyZXR1cm4iZGVsdGFYImluIHM/cy5kZWx0YVg6IndoZWVsRGVsdGFYImluIHM/LXMud2hlZWxEZWx0YVg6MH0sZGVsdGFZOmZ1bmN0aW9uKHMpe3JldHVybiJkZWx0YVkiaW4gcz9zLmRlbHRhWToid2hlZWxEZWx0YVkiaW4gcz8tcy53aGVlbERlbHRhWToid2hlZWxEZWx0YSJpbiBzPy1zLndoZWVsRGVsdGE6MH0sZGVsdGFaOjAsZGVsdGFNb2RlOjB9KSxTcj1yZChiciksX3I9WzksMTMsMjcsMzJdLEVyPXgmJiJDb21wb3NpdGlvbkV2ZW50ImluIHdpbmRvdyx3cj1udWxsO3gmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJih3cj1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciB4cj14JiYiVGV4dEV2ZW50ImluIHdpbmRvdyYmIXdyLGtyPXgmJighRXJ8fHdyJiY4PHdyJiYxMT49d3IpLE9yPVN0cmluZy5mcm9tQ2hhckNvZGUoMzIpLEFyPSExO2Z1bmN0aW9uIGdlKHMsbyl7c3dpdGNoKHMpe2Nhc2Uia2V5dXAiOnJldHVybi0xIT09X3IuaW5kZXhPZihvLmtleUNvZGUpO2Nhc2Uia2V5ZG93biI6cmV0dXJuIDIyOSE9PW8ua2V5Q29kZTtjYXNlImtleXByZXNzIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJmb2N1c291dCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gaGUocyl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZihzPXMuZGV0YWlsKSYmImRhdGEiaW4gcz9zLmRhdGE6bnVsbH12YXIgQ3I9ITE7dmFyIGpyPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLCJkYXRldGltZS1sb2NhbCI6ITAsZW1haWw6ITAsbW9udGg6ITAsbnVtYmVyOiEwLHBhc3N3b3JkOiEwLHJhbmdlOiEwLHNlYXJjaDohMCx0ZWw6ITAsdGV4dDohMCx0aW1lOiEwLHVybDohMCx3ZWVrOiEwfTtmdW5jdGlvbiBtZShzKXt2YXIgbz1zJiZzLm5vZGVOYW1lJiZzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PW8/ISFqcltzLnR5cGVdOiJ0ZXh0YXJlYSI9PT1vfWZ1bmN0aW9uIG5lKHMsbyxpLGEpe0ViKGEpLDA8KG89b2Uobywib25DaGFuZ2UiKSkubGVuZ3RoJiYoaT1uZXcgUXQoIm9uQ2hhbmdlIiwiY2hhbmdlIixudWxsLGksYSkscy5wdXNoKHtldmVudDppLGxpc3RlbmVyczpvfSkpfXZhciBQcj1udWxsLElyPW51bGw7ZnVuY3Rpb24gcmUocyl7c2UocywwKX1mdW5jdGlvbiB0ZShzKXtpZihXYSh1ZShzKSkpcmV0dXJuIHN9ZnVuY3Rpb24gdmUocyxvKXtpZigiY2hhbmdlIj09PXMpcmV0dXJuIG99dmFyIFRyPSExO2lmKHgpe3ZhciBOcjtpZih4KXt2YXIgTXI9Im9uaW5wdXQiaW4gZG9jdW1lbnQ7aWYoIU1yKXt2YXIgUnI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7UnIuc2V0QXR0cmlidXRlKCJvbmlucHV0IiwicmV0dXJuOyIpLE1yPSJmdW5jdGlvbiI9PXR5cGVvZiBSci5vbmlucHV0fU5yPU1yfWVsc2UgTnI9ITE7VHI9TnImJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSl9ZnVuY3Rpb24gQWUoKXtQciYmKFByLmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixCZSksSXI9UHI9bnVsbCl9ZnVuY3Rpb24gQmUocyl7aWYoInZhbHVlIj09PXMucHJvcGVydHlOYW1lJiZ0ZShJcikpe3ZhciBvPVtdO25lKG8sSXIscyx4YihzKSksSmIocmUsbyl9fWZ1bmN0aW9uIENlKHMsbyxpKXsiZm9jdXNpbiI9PT1zPyhBZSgpLElyPWksKFByPW8pLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixCZSkpOiJmb2N1c291dCI9PT1zJiZBZSgpfWZ1bmN0aW9uIERlKHMpe2lmKCJzZWxlY3Rpb25jaGFuZ2UiPT09c3x8ImtleXVwIj09PXN8fCJrZXlkb3duIj09PXMpcmV0dXJuIHRlKElyKX1mdW5jdGlvbiBFZShzLG8pe2lmKCJjbGljayI9PT1zKXJldHVybiB0ZShvKX1mdW5jdGlvbiBGZShzLG8pe2lmKCJpbnB1dCI9PT1zfHwiY2hhbmdlIj09PXMpcmV0dXJuIHRlKG8pfXZhciBEcj0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmlzP09iamVjdC5pczpmdW5jdGlvbiBHZShzLG8pe3JldHVybiBzPT09byYmKDAhPT1zfHwxL3M9PTEvbyl8fHMhPXMmJm8hPW99O2Z1bmN0aW9uIEllKHMsbyl7aWYoRHIocyxvKSlyZXR1cm4hMDtpZigib2JqZWN0IiE9dHlwZW9mIHN8fG51bGw9PT1zfHwib2JqZWN0IiE9dHlwZW9mIG98fG51bGw9PT1vKXJldHVybiExO3ZhciBpPU9iamVjdC5rZXlzKHMpLGE9T2JqZWN0LmtleXMobyk7aWYoaS5sZW5ndGghPT1hLmxlbmd0aClyZXR1cm4hMTtmb3IoYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgdT1pW2FdO2lmKCFDLmNhbGwobyx1KXx8IURyKHNbdV0sb1t1XSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gSmUocyl7Zm9yKDtzJiZzLmZpcnN0Q2hpbGQ7KXM9cy5maXJzdENoaWxkO3JldHVybiBzfWZ1bmN0aW9uIEtlKHMsbyl7dmFyIGksYT1KZShzKTtmb3Iocz0wO2E7KXtpZigzPT09YS5ub2RlVHlwZSl7aWYoaT1zK2EudGV4dENvbnRlbnQubGVuZ3RoLHM8PW8mJmk+PW8pcmV0dXJue25vZGU6YSxvZmZzZXQ6by1zfTtzPWl9ZTp7Zm9yKDthOyl7aWYoYS5uZXh0U2libGluZyl7YT1hLm5leHRTaWJsaW5nO2JyZWFrIGV9YT1hLnBhcmVudE5vZGV9YT12b2lkIDB9YT1KZShhKX19ZnVuY3Rpb24gTGUocyxvKXtyZXR1cm4hKCFzfHwhbykmJihzPT09b3x8KCFzfHwzIT09cy5ub2RlVHlwZSkmJihvJiYzPT09by5ub2RlVHlwZT9MZShzLG8ucGFyZW50Tm9kZSk6ImNvbnRhaW5zImluIHM/cy5jb250YWlucyhvKTohIXMuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJiEhKDE2JnMuY29tcGFyZURvY3VtZW50UG9zaXRpb24obykpKSl9ZnVuY3Rpb24gTWUoKXtmb3IodmFyIHM9d2luZG93LG89WGEoKTtvIGluc3RhbmNlb2Ygcy5IVE1MSUZyYW1lRWxlbWVudDspe3RyeXt2YXIgaT0ic3RyaW5nIj09dHlwZW9mIG8uY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmfWNhdGNoKHMpe2k9ITF9aWYoIWkpYnJlYWs7bz1YYSgocz1vLmNvbnRlbnRXaW5kb3cpLmRvY3VtZW50KX1yZXR1cm4gb31mdW5jdGlvbiBOZShzKXt2YXIgbz1zJiZzLm5vZGVOYW1lJiZzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIG8mJigiaW5wdXQiPT09byYmKCJ0ZXh0Ij09PXMudHlwZXx8InNlYXJjaCI9PT1zLnR5cGV8fCJ0ZWwiPT09cy50eXBlfHwidXJsIj09PXMudHlwZXx8InBhc3N3b3JkIj09PXMudHlwZSl8fCJ0ZXh0YXJlYSI9PT1vfHwidHJ1ZSI9PT1zLmNvbnRlbnRFZGl0YWJsZSl9ZnVuY3Rpb24gT2Uocyl7dmFyIG89TWUoKSxpPXMuZm9jdXNlZEVsZW0sYT1zLnNlbGVjdGlvblJhbmdlO2lmKG8hPT1pJiZpJiZpLm93bmVyRG9jdW1lbnQmJkxlKGkub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsaSkpe2lmKG51bGwhPT1hJiZOZShpKSlpZihvPWEuc3RhcnQsdm9pZCAwPT09KHM9YS5lbmQpJiYocz1vKSwic2VsZWN0aW9uU3RhcnQiaW4gaSlpLnNlbGVjdGlvblN0YXJ0PW8saS5zZWxlY3Rpb25FbmQ9TWF0aC5taW4ocyxpLnZhbHVlLmxlbmd0aCk7ZWxzZSBpZigocz0obz1pLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmby5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24pe3M9cy5nZXRTZWxlY3Rpb24oKTt2YXIgdT1pLnRleHRDb250ZW50Lmxlbmd0aCxfPU1hdGgubWluKGEuc3RhcnQsdSk7YT12b2lkIDA9PT1hLmVuZD9fOk1hdGgubWluKGEuZW5kLHUpLCFzLmV4dGVuZCYmXz5hJiYodT1hLGE9XyxfPXUpLHU9S2UoaSxfKTt2YXIgdz1LZShpLGEpO3UmJncmJigxIT09cy5yYW5nZUNvdW50fHxzLmFuY2hvck5vZGUhPT11Lm5vZGV8fHMuYW5jaG9yT2Zmc2V0IT09dS5vZmZzZXR8fHMuZm9jdXNOb2RlIT09dy5ub2RlfHxzLmZvY3VzT2Zmc2V0IT09dy5vZmZzZXQpJiYoKG89by5jcmVhdGVSYW5nZSgpKS5zZXRTdGFydCh1Lm5vZGUsdS5vZmZzZXQpLHMucmVtb3ZlQWxsUmFuZ2VzKCksXz5hPyhzLmFkZFJhbmdlKG8pLHMuZXh0ZW5kKHcubm9kZSx3Lm9mZnNldCkpOihvLnNldEVuZCh3Lm5vZGUsdy5vZmZzZXQpLHMuYWRkUmFuZ2UobykpKX1mb3Iobz1bXSxzPWk7cz1zLnBhcmVudE5vZGU7KTE9PT1zLm5vZGVUeXBlJiZvLnB1c2goe2VsZW1lbnQ6cyxsZWZ0OnMuc2Nyb2xsTGVmdCx0b3A6cy5zY3JvbGxUb3B9KTtmb3IoImZ1bmN0aW9uIj09dHlwZW9mIGkuZm9jdXMmJmkuZm9jdXMoKSxpPTA7aTxvLmxlbmd0aDtpKyspKHM9b1tpXSkuZWxlbWVudC5zY3JvbGxMZWZ0PXMubGVmdCxzLmVsZW1lbnQuc2Nyb2xsVG9wPXMudG9wfX12YXIgTHI9eCYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSxGcj1udWxsLEJyPW51bGwsJHI9bnVsbCxxcj0hMTtmdW5jdGlvbiBVZShzLG8saSl7dmFyIGE9aS53aW5kb3c9PT1pP2kuZG9jdW1lbnQ6OT09PWkubm9kZVR5cGU/aTppLm93bmVyRG9jdW1lbnQ7cXJ8fG51bGw9PUZyfHxGciE9PVhhKGEpfHwoInNlbGVjdGlvblN0YXJ0ImluKGE9RnIpJiZOZShhKT9hPXtzdGFydDphLnNlbGVjdGlvblN0YXJ0LGVuZDphLnNlbGVjdGlvbkVuZH06YT17YW5jaG9yTm9kZTooYT0oYS5vd25lckRvY3VtZW50JiZhLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCkpLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OmEuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTphLmZvY3VzTm9kZSxmb2N1c09mZnNldDphLmZvY3VzT2Zmc2V0fSwkciYmSWUoJHIsYSl8fCgkcj1hLDA8KGE9b2UoQnIsIm9uU2VsZWN0IikpLmxlbmd0aCYmKG89bmV3IFF0KCJvblNlbGVjdCIsInNlbGVjdCIsbnVsbCxvLGkpLHMucHVzaCh7ZXZlbnQ6byxsaXN0ZW5lcnM6YX0pLG8udGFyZ2V0PUZyKSkpfWZ1bmN0aW9uIFZlKHMsbyl7dmFyIGk9e307cmV0dXJuIGlbcy50b0xvd2VyQ2FzZSgpXT1vLnRvTG93ZXJDYXNlKCksaVsiV2Via2l0IitzXT0id2Via2l0IitvLGlbIk1veiIrc109Im1veiIrbyxpfXZhciBVcj17YW5pbWF0aW9uZW5kOlZlKCJBbmltYXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246VmUoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0OlZlKCJBbmltYXRpb24iLCJBbmltYXRpb25TdGFydCIpLHRyYW5zaXRpb25lbmQ6VmUoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uRW5kIil9LFZyPXt9LHpyPXt9O2Z1bmN0aW9uIFplKHMpe2lmKFZyW3NdKXJldHVybiBWcltzXTtpZighVXJbc10pcmV0dXJuIHM7dmFyIG8saT1VcltzXTtmb3IobyBpbiBpKWlmKGkuaGFzT3duUHJvcGVydHkobykmJm8gaW4genIpcmV0dXJuIFZyW3NdPWlbb107cmV0dXJuIHN9eCYmKHpyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgVXIuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgVXIuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgVXIuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8ZGVsZXRlIFVyLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7dmFyIFdyPVplKCJhbmltYXRpb25lbmQiKSxKcj1aZSgiYW5pbWF0aW9uaXRlcmF0aW9uIiksSHI9WmUoImFuaW1hdGlvbnN0YXJ0IiksS3I9WmUoInRyYW5zaXRpb25lbmQiKSxHcj1uZXcgTWFwLFlyPSJhYm9ydCBhdXhDbGljayBjYW5jZWwgY2FuUGxheSBjYW5QbGF5VGhyb3VnaCBjbGljayBjbG9zZSBjb250ZXh0TWVudSBjb3B5IGN1dCBkcmFnIGRyYWdFbmQgZHJhZ0VudGVyIGRyYWdFeGl0IGRyYWdMZWF2ZSBkcmFnT3ZlciBkcmFnU3RhcnQgZHJvcCBkdXJhdGlvbkNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBnb3RQb2ludGVyQ2FwdHVyZSBpbnB1dCBpbnZhbGlkIGtleURvd24ga2V5UHJlc3Mga2V5VXAgbG9hZCBsb2FkZWREYXRhIGxvYWRlZE1ldGFkYXRhIGxvYWRTdGFydCBsb3N0UG9pbnRlckNhcHR1cmUgbW91c2VEb3duIG1vdXNlTW92ZSBtb3VzZU91dCBtb3VzZU92ZXIgbW91c2VVcCBwYXN0ZSBwYXVzZSBwbGF5IHBsYXlpbmcgcG9pbnRlckNhbmNlbCBwb2ludGVyRG93biBwb2ludGVyTW92ZSBwb2ludGVyT3V0IHBvaW50ZXJPdmVyIHBvaW50ZXJVcCBwcm9ncmVzcyByYXRlQ2hhbmdlIHJlc2V0IHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1Ym1pdCBzdXNwZW5kIHRpbWVVcGRhdGUgdG91Y2hDYW5jZWwgdG91Y2hFbmQgdG91Y2hTdGFydCB2b2x1bWVDaGFuZ2Ugc2Nyb2xsIHRvZ2dsZSB0b3VjaE1vdmUgd2FpdGluZyB3aGVlbCIuc3BsaXQoIiAiKTtmdW5jdGlvbiBmZihzLG8pe0dyLnNldChzLG8pLGZhKG8sW3NdKX1mb3IodmFyIFhyPTA7WHI8WXIubGVuZ3RoO1hyKyspe3ZhciBRcj1ZcltYcl07ZmYoUXIudG9Mb3dlckNhc2UoKSwib24iKyhRclswXS50b1VwcGVyQ2FzZSgpK1FyLnNsaWNlKDEpKSl9ZmYoV3IsIm9uQW5pbWF0aW9uRW5kIiksZmYoSnIsIm9uQW5pbWF0aW9uSXRlcmF0aW9uIiksZmYoSHIsIm9uQW5pbWF0aW9uU3RhcnQiKSxmZigiZGJsY2xpY2siLCJvbkRvdWJsZUNsaWNrIiksZmYoImZvY3VzaW4iLCJvbkZvY3VzIiksZmYoImZvY3Vzb3V0Iiwib25CbHVyIiksZmYoS3IsIm9uVHJhbnNpdGlvbkVuZCIpLGhhKCJvbk1vdXNlRW50ZXIiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSksaGEoIm9uTW91c2VMZWF2ZSIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKSxoYSgib25Qb2ludGVyRW50ZXIiLFsicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIl0pLGhhKCJvblBvaW50ZXJMZWF2ZSIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSksZmEoIm9uQ2hhbmdlIiwiY2hhbmdlIGNsaWNrIGZvY3VzaW4gZm9jdXNvdXQgaW5wdXQga2V5ZG93biBrZXl1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpLGZhKCJvblNlbGVjdCIsImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSksZmEoIm9uQmVmb3JlSW5wdXQiLFsiY29tcG9zaXRpb25lbmQiLCJrZXlwcmVzcyIsInRleHRJbnB1dCIsInBhc3RlIl0pLGZhKCJvbkNvbXBvc2l0aW9uRW5kIiwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpLGZhKCJvbkNvbXBvc2l0aW9uU3RhcnQiLCJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKSxmYSgib25Db21wb3NpdGlvblVwZGF0ZSIsImNvbXBvc2l0aW9udXBkYXRlIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt2YXIgWnI9ImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nIi5zcGxpdCgiICIpLGVuPW5ldyBTZXQoImNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHRvZ2dsZSIuc3BsaXQoIiAiKS5jb25jYXQoWnIpKTtmdW5jdGlvbiBuZihzLG8saSl7dmFyIGE9cy50eXBlfHwidW5rbm93bi1ldmVudCI7cy5jdXJyZW50VGFyZ2V0PWksZnVuY3Rpb24gVWIocyxvLGksYSx1LF8sdyx4LEMpe2lmKFRiLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxudCl7aWYoIW50KXRocm93IEVycm9yKHAoMTk4KSk7dmFyIGo9c3Q7bnQ9ITEsc3Q9bnVsbCxvdHx8KG90PSEwLGl0PWopfX0oYSxvLHZvaWQgMCxzKSxzLmN1cnJlbnRUYXJnZXQ9bnVsbH1mdW5jdGlvbiBzZShzLG8pe289ISEoNCZvKTtmb3IodmFyIGk9MDtpPHMubGVuZ3RoO2krKyl7dmFyIGE9c1tpXSx1PWEuZXZlbnQ7YT1hLmxpc3RlbmVycztlOnt2YXIgXz12b2lkIDA7aWYobylmb3IodmFyIHc9YS5sZW5ndGgtMTswPD13O3ctLSl7dmFyIHg9YVt3XSxDPXguaW5zdGFuY2Usaj14LmN1cnJlbnRUYXJnZXQ7aWYoeD14Lmxpc3RlbmVyLEMhPT1fJiZ1LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgZTtuZih1LHgsaiksXz1DfWVsc2UgZm9yKHc9MDt3PGEubGVuZ3RoO3crKyl7aWYoQz0oeD1hW3ddKS5pbnN0YW5jZSxqPXguY3VycmVudFRhcmdldCx4PXgubGlzdGVuZXIsQyE9PV8mJnUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBlO25mKHUseCxqKSxfPUN9fX1pZihvdCl0aHJvdyBzPWl0LG90PSExLGl0PW51bGwsc31mdW5jdGlvbiBEKHMsbyl7dmFyIGk9b1ttbl07dm9pZCAwPT09aSYmKGk9b1ttbl09bmV3IFNldCk7dmFyIGE9cysiX19idWJibGUiO2kuaGFzKGEpfHwocGYobyxzLDIsITEpLGkuYWRkKGEpKX1mdW5jdGlvbiBxZihzLG8saSl7dmFyIGE9MDtvJiYoYXw9NCkscGYoaSxzLGEsbyl9dmFyIHRuPSJfcmVhY3RMaXN0ZW5pbmciK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO2Z1bmN0aW9uIHNmKHMpe2lmKCFzW3RuXSl7c1t0bl09ITAsXy5mb3JFYWNoKChmdW5jdGlvbihvKXsic2VsZWN0aW9uY2hhbmdlIiE9PW8mJihlbi5oYXMobyl8fHFmKG8sITEscykscWYobywhMCxzKSl9KSk7dmFyIG89OT09PXMubm9kZVR5cGU/czpzLm93bmVyRG9jdW1lbnQ7bnVsbD09PW98fG9bdG5dfHwob1t0bl09ITAscWYoInNlbGVjdGlvbmNoYW5nZSIsITEsbykpfX1mdW5jdGlvbiBwZihzLG8saSxhKXtzd2l0Y2goamQobykpe2Nhc2UgMTp2YXIgdT1lZDticmVhaztjYXNlIDQ6dT1nZDticmVhaztkZWZhdWx0OnU9ZmR9aT11LmJpbmQobnVsbCxvLGkscyksdT12b2lkIDAsIXR0fHwidG91Y2hzdGFydCIhPT1vJiYidG91Y2htb3ZlIiE9PW8mJiJ3aGVlbCIhPT1vfHwodT0hMCksYT92b2lkIDAhPT11P3MuYWRkRXZlbnRMaXN0ZW5lcihvLGkse2NhcHR1cmU6ITAscGFzc2l2ZTp1fSk6cy5hZGRFdmVudExpc3RlbmVyKG8saSwhMCk6dm9pZCAwIT09dT9zLmFkZEV2ZW50TGlzdGVuZXIobyxpLHtwYXNzaXZlOnV9KTpzLmFkZEV2ZW50TGlzdGVuZXIobyxpLCExKX1mdW5jdGlvbiBoZChzLG8saSxhLHUpe3ZhciBfPWE7aWYoISgxJm98fDImb3x8bnVsbD09PWEpKWU6Zm9yKDs7KXtpZihudWxsPT09YSlyZXR1cm47dmFyIHc9YS50YWc7aWYoMz09PXd8fDQ9PT13KXt2YXIgeD1hLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2lmKHg9PT11fHw4PT09eC5ub2RlVHlwZSYmeC5wYXJlbnROb2RlPT09dSlicmVhaztpZig0PT09dylmb3Iodz1hLnJldHVybjtudWxsIT09dzspe3ZhciBDPXcudGFnO2lmKCgzPT09Q3x8ND09PUMpJiYoKEM9dy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk9PT11fHw4PT09Qy5ub2RlVHlwZSYmQy5wYXJlbnROb2RlPT09dSkpcmV0dXJuO3c9dy5yZXR1cm59Zm9yKDtudWxsIT09eDspe2lmKG51bGw9PT0odz1XYyh4KSkpcmV0dXJuO2lmKDU9PT0oQz13LnRhZyl8fDY9PT1DKXthPV89dztjb250aW51ZSBlfXg9eC5wYXJlbnROb2RlfX1hPWEucmV0dXJufUpiKChmdW5jdGlvbigpe3ZhciBhPV8sdT14YihpKSx3PVtdO2U6e3ZhciB4PUdyLmdldChzKTtpZih2b2lkIDAhPT14KXt2YXIgQz1RdCxqPXM7c3dpdGNoKHMpe2Nhc2Uia2V5cHJlc3MiOmlmKDA9PT1vZChpKSlicmVhayBlO2Nhc2Uia2V5ZG93biI6Y2FzZSJrZXl1cCI6Qz1tcjticmVhaztjYXNlImZvY3VzaW4iOmo9ImZvY3VzIixDPXNyO2JyZWFrO2Nhc2UiZm9jdXNvdXQiOmo9ImJsdXIiLEM9c3I7YnJlYWs7Y2FzZSJiZWZvcmVibHVyIjpjYXNlImFmdGVyYmx1ciI6Qz1zcjticmVhaztjYXNlImNsaWNrIjppZigyPT09aS5idXR0b24pYnJlYWsgZTtjYXNlImF1eGNsaWNrIjpjYXNlImRibGNsaWNrIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZW1vdmUiOmNhc2UibW91c2V1cCI6Y2FzZSJtb3VzZW91dCI6Y2FzZSJtb3VzZW92ZXIiOmNhc2UiY29udGV4dG1lbnUiOkM9cnI7YnJlYWs7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbmQiOmNhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdleGl0IjpjYXNlImRyYWdsZWF2ZSI6Y2FzZSJkcmFnb3ZlciI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6Qz1ucjticmVhaztjYXNlInRvdWNoY2FuY2VsIjpjYXNlInRvdWNoZW5kIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ0b3VjaHN0YXJ0IjpDPXlyO2JyZWFrO2Nhc2UgV3I6Y2FzZSBKcjpjYXNlIEhyOkM9aXI7YnJlYWs7Y2FzZSBLcjpDPXZyO2JyZWFrO2Nhc2Uic2Nyb2xsIjpDPWVyO2JyZWFrO2Nhc2Uid2hlZWwiOkM9U3I7YnJlYWs7Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJwYXN0ZSI6Qz1jcjticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJwb2ludGVyY2FuY2VsIjpjYXNlInBvaW50ZXJkb3duIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcnVwIjpDPWdyfXZhciBMPSEhKDQmbyksQj0hTCYmInNjcm9sbCI9PT1zLCQ9TD9udWxsIT09eD94KyJDYXB0dXJlIjpudWxsOng7TD1bXTtmb3IodmFyIFUsVj1hO251bGwhPT1WOyl7dmFyIHo9KFU9Vikuc3RhdGVOb2RlO2lmKDU9PT1VLnRhZyYmbnVsbCE9PXomJihVPXosbnVsbCE9PSQmJihudWxsIT0oej1LYihWLCQpKSYmTC5wdXNoKHRmKFYseixVKSkpKSxCKWJyZWFrO1Y9Vi5yZXR1cm59MDxMLmxlbmd0aCYmKHg9bmV3IEMoeCxqLG51bGwsaSx1KSx3LnB1c2goe2V2ZW50OngsbGlzdGVuZXJzOkx9KSl9fWlmKCEoNyZvKSl7aWYoQz0ibW91c2VvdXQiPT09c3x8InBvaW50ZXJvdXQiPT09cywoISh4PSJtb3VzZW92ZXIiPT09c3x8InBvaW50ZXJvdmVyIj09PXMpfHxpPT09SGV8fCEoaj1pLnJlbGF0ZWRUYXJnZXR8fGkuZnJvbUVsZW1lbnQpfHwhV2MoaikmJiFqW2ZuXSkmJihDfHx4KSYmKHg9dS53aW5kb3c9PT11P3U6KHg9dS5vd25lckRvY3VtZW50KT94LmRlZmF1bHRWaWV3fHx4LnBhcmVudFdpbmRvdzp3aW5kb3csQz8oQz1hLG51bGwhPT0oaj0oaj1pLnJlbGF0ZWRUYXJnZXR8fGkudG9FbGVtZW50KT9XYyhqKTpudWxsKSYmKGohPT0oQj1WYihqKSl8fDUhPT1qLnRhZyYmNiE9PWoudGFnKSYmKGo9bnVsbCkpOihDPW51bGwsaj1hKSxDIT09aikpe2lmKEw9cnIsej0ib25Nb3VzZUxlYXZlIiwkPSJvbk1vdXNlRW50ZXIiLFY9Im1vdXNlIiwicG9pbnRlcm91dCIhPT1zJiYicG9pbnRlcm92ZXIiIT09c3x8KEw9Z3Isej0ib25Qb2ludGVyTGVhdmUiLCQ9Im9uUG9pbnRlckVudGVyIixWPSJwb2ludGVyIiksQj1udWxsPT1DP3g6dWUoQyksVT1udWxsPT1qP3g6dWUoaiksKHg9bmV3IEwoeixWKyJsZWF2ZSIsQyxpLHUpKS50YXJnZXQ9Qix4LnJlbGF0ZWRUYXJnZXQ9VSx6PW51bGwsV2ModSk9PT1hJiYoKEw9bmV3IEwoJCxWKyJlbnRlciIsaixpLHUpKS50YXJnZXQ9VSxMLnJlbGF0ZWRUYXJnZXQ9Qix6PUwpLEI9eixDJiZqKWU6e2ZvcigkPWosVj0wLFU9TD1DO1U7VT12ZihVKSlWKys7Zm9yKFU9MCx6PSQ7ejt6PXZmKHopKVUrKztmb3IoOzA8Vi1VOylMPXZmKEwpLFYtLTtmb3IoOzA8VS1WOykkPXZmKCQpLFUtLTtmb3IoO1YtLTspe2lmKEw9PT0kfHxudWxsIT09JCYmTD09PSQuYWx0ZXJuYXRlKWJyZWFrIGU7TD12ZihMKSwkPXZmKCQpfUw9bnVsbH1lbHNlIEw9bnVsbDtudWxsIT09QyYmd2Yodyx4LEMsTCwhMSksbnVsbCE9PWomJm51bGwhPT1CJiZ3Zih3LEIsaixMLCEwKX1pZigic2VsZWN0Ij09PShDPSh4PWE/dWUoYSk6d2luZG93KS5ub2RlTmFtZSYmeC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXx8ImlucHV0Ij09PUMmJiJmaWxlIj09PXgudHlwZSl2YXIgWT12ZTtlbHNlIGlmKG1lKHgpKWlmKFRyKVk9RmU7ZWxzZXtZPURlO3ZhciBaPUNlfWVsc2UoQz14Lm5vZGVOYW1lKSYmImlucHV0Ij09PUMudG9Mb3dlckNhc2UoKSYmKCJjaGVja2JveCI9PT14LnR5cGV8fCJyYWRpbyI9PT14LnR5cGUpJiYoWT1FZSk7c3dpdGNoKFkmJihZPVkocyxhKSk/bmUodyxZLGksdSk6KFomJloocyx4LGEpLCJmb2N1c291dCI9PT1zJiYoWj14Ll93cmFwcGVyU3RhdGUpJiZaLmNvbnRyb2xsZWQmJiJudW1iZXIiPT09eC50eXBlJiZjYih4LCJudW1iZXIiLHgudmFsdWUpKSxaPWE/dWUoYSk6d2luZG93LHMpe2Nhc2UiZm9jdXNpbiI6KG1lKFopfHwidHJ1ZSI9PT1aLmNvbnRlbnRFZGl0YWJsZSkmJihGcj1aLEJyPWEsJHI9bnVsbCk7YnJlYWs7Y2FzZSJmb2N1c291dCI6JHI9QnI9RnI9bnVsbDticmVhaztjYXNlIm1vdXNlZG93biI6cXI9ITA7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJtb3VzZXVwIjpjYXNlImRyYWdlbmQiOnFyPSExLFVlKHcsaSx1KTticmVhaztjYXNlInNlbGVjdGlvbmNoYW5nZSI6aWYoTHIpYnJlYWs7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpVZSh3LGksdSl9dmFyIGVlO2lmKEVyKWU6e3N3aXRjaChzKXtjYXNlImNvbXBvc2l0aW9uc3RhcnQiOnZhciBpZT0ib25Db21wb3NpdGlvblN0YXJ0IjticmVhayBlO2Nhc2UiY29tcG9zaXRpb25lbmQiOmllPSJvbkNvbXBvc2l0aW9uRW5kIjticmVhayBlO2Nhc2UiY29tcG9zaXRpb251cGRhdGUiOmllPSJvbkNvbXBvc2l0aW9uVXBkYXRlIjticmVhayBlfWllPXZvaWQgMH1lbHNlIENyP2dlKHMsaSkmJihpZT0ib25Db21wb3NpdGlvbkVuZCIpOiJrZXlkb3duIj09PXMmJjIyOT09PWkua2V5Q29kZSYmKGllPSJvbkNvbXBvc2l0aW9uU3RhcnQiKTtpZSYmKGtyJiYia28iIT09aS5sb2NhbGUmJihDcnx8Im9uQ29tcG9zaXRpb25TdGFydCIhPT1pZT8ib25Db21wb3NpdGlvbkVuZCI9PT1pZSYmQ3ImJihlZT1uZCgpKTooSnQ9InZhbHVlImluKFd0PXUpP1d0LnZhbHVlOld0LnRleHRDb250ZW50LENyPSEwKSksMDwoWj1vZShhLGllKSkubGVuZ3RoJiYoaWU9bmV3IGxyKGllLHMsbnVsbCxpLHUpLHcucHVzaCh7ZXZlbnQ6aWUsbGlzdGVuZXJzOlp9KSxlZT9pZS5kYXRhPWVlOm51bGwhPT0oZWU9aGUoaSkpJiYoaWUuZGF0YT1lZSkpKSwoZWU9eHI/ZnVuY3Rpb24gamUocyxvKXtzd2l0Y2gocyl7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIGhlKG8pO2Nhc2Uia2V5cHJlc3MiOnJldHVybiAzMiE9PW8ud2hpY2g/bnVsbDooQXI9ITAsT3IpO2Nhc2UidGV4dElucHV0IjpyZXR1cm4ocz1vLmRhdGEpPT09T3ImJkFyP251bGw6cztkZWZhdWx0OnJldHVybiBudWxsfX0ocyxpKTpmdW5jdGlvbiBrZShzLG8pe2lmKENyKXJldHVybiJjb21wb3NpdGlvbmVuZCI9PT1zfHwhRXImJmdlKHMsbyk/KHM9bmQoKSxIdD1KdD1XdD1udWxsLENyPSExLHMpOm51bGw7c3dpdGNoKHMpe2Nhc2UicGFzdGUiOmRlZmF1bHQ6cmV0dXJuIG51bGw7Y2FzZSJrZXlwcmVzcyI6aWYoIShvLmN0cmxLZXl8fG8uYWx0S2V5fHxvLm1ldGFLZXkpfHxvLmN0cmxLZXkmJm8uYWx0S2V5KXtpZihvLmNoYXImJjE8by5jaGFyLmxlbmd0aClyZXR1cm4gby5jaGFyO2lmKG8ud2hpY2gpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoby53aGljaCl9cmV0dXJuIG51bGw7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIGtyJiYia28iIT09by5sb2NhbGU/bnVsbDpvLmRhdGF9fShzLGkpKSYmKDA8KGE9b2UoYSwib25CZWZvcmVJbnB1dCIpKS5sZW5ndGgmJih1PW5ldyBscigib25CZWZvcmVJbnB1dCIsImJlZm9yZWlucHV0IixudWxsLGksdSksdy5wdXNoKHtldmVudDp1LGxpc3RlbmVyczphfSksdS5kYXRhPWVlKSl9c2UodyxvKX0pKX1mdW5jdGlvbiB0ZihzLG8saSl7cmV0dXJue2luc3RhbmNlOnMsbGlzdGVuZXI6byxjdXJyZW50VGFyZ2V0Oml9fWZ1bmN0aW9uIG9lKHMsbyl7Zm9yKHZhciBpPW8rIkNhcHR1cmUiLGE9W107bnVsbCE9PXM7KXt2YXIgdT1zLF89dS5zdGF0ZU5vZGU7NT09PXUudGFnJiZudWxsIT09XyYmKHU9XyxudWxsIT0oXz1LYihzLGkpKSYmYS51bnNoaWZ0KHRmKHMsXyx1KSksbnVsbCE9KF89S2IocyxvKSkmJmEucHVzaCh0ZihzLF8sdSkpKSxzPXMucmV0dXJufXJldHVybiBhfWZ1bmN0aW9uIHZmKHMpe2lmKG51bGw9PT1zKXJldHVybiBudWxsO2Rve3M9cy5yZXR1cm59d2hpbGUocyYmNSE9PXMudGFnKTtyZXR1cm4gc3x8bnVsbH1mdW5jdGlvbiB3ZihzLG8saSxhLHUpe2Zvcih2YXIgXz1vLl9yZWFjdE5hbWUsdz1bXTtudWxsIT09aSYmaSE9PWE7KXt2YXIgeD1pLEM9eC5hbHRlcm5hdGUsaj14LnN0YXRlTm9kZTtpZihudWxsIT09QyYmQz09PWEpYnJlYWs7NT09PXgudGFnJiZudWxsIT09aiYmKHg9aix1P251bGwhPShDPUtiKGksXykpJiZ3LnVuc2hpZnQodGYoaSxDLHgpKTp1fHxudWxsIT0oQz1LYihpLF8pKSYmdy5wdXNoKHRmKGksQyx4KSkpLGk9aS5yZXR1cm59MCE9PXcubGVuZ3RoJiZzLnB1c2goe2V2ZW50Om8sbGlzdGVuZXJzOnd9KX12YXIgcm49L1xyXG4/L2csbm49L1x1MDAwMHxcdUZGRkQvZztmdW5jdGlvbiB6ZihzKXtyZXR1cm4oInN0cmluZyI9PXR5cGVvZiBzP3M6IiIrcykucmVwbGFjZShybiwiXG4iKS5yZXBsYWNlKG5uLCIiKX1mdW5jdGlvbiBBZihzLG8saSl7aWYobz16ZihvKSx6ZihzKSE9PW8mJmkpdGhyb3cgRXJyb3IocCg0MjUpKX1mdW5jdGlvbiBCZigpe312YXIgc249bnVsbCxvbj1udWxsO2Z1bmN0aW9uIEVmKHMsbyl7cmV0dXJuInRleHRhcmVhIj09PXN8fCJub3NjcmlwdCI9PT1zfHwic3RyaW5nIj09dHlwZW9mIG8uY2hpbGRyZW58fCJudW1iZXIiPT10eXBlb2Ygby5jaGlsZHJlbnx8Im9iamVjdCI9PXR5cGVvZiBvLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZudWxsIT09by5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9by5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWx9dmFyIGFuPSJmdW5jdGlvbiI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6dm9pZCAwLGNuPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OnZvaWQgMCxsbj0iZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZT9Qcm9taXNlOnZvaWQgMCx1bj0iZnVuY3Rpb24iPT10eXBlb2YgcXVldWVNaWNyb3Rhc2s/cXVldWVNaWNyb3Rhc2s6dm9pZCAwIT09bG4/ZnVuY3Rpb24ocyl7cmV0dXJuIGxuLnJlc29sdmUobnVsbCkudGhlbihzKS5jYXRjaChJZil9OmFuO2Z1bmN0aW9uIElmKHMpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dGhyb3cgc30pKX1mdW5jdGlvbiBLZihzLG8pe3ZhciBpPW8sYT0wO2Rve3ZhciB1PWkubmV4dFNpYmxpbmc7aWYocy5yZW1vdmVDaGlsZChpKSx1JiY4PT09dS5ub2RlVHlwZSlpZigiLyQiPT09KGk9dS5kYXRhKSl7aWYoMD09PWEpcmV0dXJuIHMucmVtb3ZlQ2hpbGQodSksdm9pZCBiZChvKTthLS19ZWxzZSIkIiE9PWkmJiIkPyIhPT1pJiYiJCEiIT09aXx8YSsrO2k9dX13aGlsZShpKTtiZChvKX1mdW5jdGlvbiBMZihzKXtmb3IoO251bGwhPXM7cz1zLm5leHRTaWJsaW5nKXt2YXIgbz1zLm5vZGVUeXBlO2lmKDE9PT1vfHwzPT09bylicmVhaztpZig4PT09byl7aWYoIiQiPT09KG89cy5kYXRhKXx8IiQhIj09PW98fCIkPyI9PT1vKWJyZWFrO2lmKCIvJCI9PT1vKXJldHVybiBudWxsfX1yZXR1cm4gc31mdW5jdGlvbiBNZihzKXtzPXMucHJldmlvdXNTaWJsaW5nO2Zvcih2YXIgbz0wO3M7KXtpZig4PT09cy5ub2RlVHlwZSl7dmFyIGk9cy5kYXRhO2lmKCIkIj09PWl8fCIkISI9PT1pfHwiJD8iPT09aSl7aWYoMD09PW8pcmV0dXJuIHM7by0tfWVsc2UiLyQiPT09aSYmbysrfXM9cy5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIHBuPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLGhuPSJfX3JlYWN0RmliZXIkIitwbixkbj0iX19yZWFjdFByb3BzJCIrcG4sZm49Il9fcmVhY3RDb250YWluZXIkIitwbixtbj0iX19yZWFjdEV2ZW50cyQiK3BuLGduPSJfX3JlYWN0TGlzdGVuZXJzJCIrcG4seW49Il9fcmVhY3RIYW5kbGVzJCIrcG47ZnVuY3Rpb24gV2Mocyl7dmFyIG89c1tobl07aWYobylyZXR1cm4gbztmb3IodmFyIGk9cy5wYXJlbnROb2RlO2k7KXtpZihvPWlbZm5dfHxpW2huXSl7aWYoaT1vLmFsdGVybmF0ZSxudWxsIT09by5jaGlsZHx8bnVsbCE9PWkmJm51bGwhPT1pLmNoaWxkKWZvcihzPU1mKHMpO251bGwhPT1zOyl7aWYoaT1zW2huXSlyZXR1cm4gaTtzPU1mKHMpfXJldHVybiBvfWk9KHM9aSkucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBDYihzKXtyZXR1cm4hKHM9c1tobl18fHNbZm5dKXx8NSE9PXMudGFnJiY2IT09cy50YWcmJjEzIT09cy50YWcmJjMhPT1zLnRhZz9udWxsOnN9ZnVuY3Rpb24gdWUocyl7aWYoNT09PXMudGFnfHw2PT09cy50YWcpcmV0dXJuIHMuc3RhdGVOb2RlO3Rocm93IEVycm9yKHAoMzMpKX1mdW5jdGlvbiBEYihzKXtyZXR1cm4gc1tkbl18fG51bGx9dmFyIHZuPVtdLGJuPS0xO2Z1bmN0aW9uIFVmKHMpe3JldHVybntjdXJyZW50OnN9fWZ1bmN0aW9uIEUocyl7MD5ibnx8KHMuY3VycmVudD12bltibl0sdm5bYm5dPW51bGwsYm4tLSl9ZnVuY3Rpb24gRyhzLG8pe2JuKyssdm5bYm5dPXMuY3VycmVudCxzLmN1cnJlbnQ9b312YXIgU249e30sX249VWYoU24pLEVuPVVmKCExKSx3bj1TbjtmdW5jdGlvbiBZZihzLG8pe3ZhciBpPXMudHlwZS5jb250ZXh0VHlwZXM7aWYoIWkpcmV0dXJuIFNuO3ZhciBhPXMuc3RhdGVOb2RlO2lmKGEmJmEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD09PW8pcmV0dXJuIGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7dmFyIHUsXz17fTtmb3IodSBpbiBpKV9bdV09b1t1XTtyZXR1cm4gYSYmKChzPXMuc3RhdGVOb2RlKS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PW8scy5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1fKSxffWZ1bmN0aW9uIFpmKHMpe3JldHVybiBudWxsIT0ocz1zLmNoaWxkQ29udGV4dFR5cGVzKX1mdW5jdGlvbiAkZigpe0UoRW4pLEUoX24pfWZ1bmN0aW9uIGFnKHMsbyxpKXtpZihfbi5jdXJyZW50IT09U24pdGhyb3cgRXJyb3IocCgxNjgpKTtHKF9uLG8pLEcoRW4saSl9ZnVuY3Rpb24gYmcocyxvLGkpe3ZhciBhPXMuc3RhdGVOb2RlO2lmKG89by5jaGlsZENvbnRleHRUeXBlcywiZnVuY3Rpb24iIT10eXBlb2YgYS5nZXRDaGlsZENvbnRleHQpcmV0dXJuIGk7Zm9yKHZhciB1IGluIGE9YS5nZXRDaGlsZENvbnRleHQoKSlpZighKHUgaW4gbykpdGhyb3cgRXJyb3IocCgxMDgsUmEocyl8fCJVbmtub3duIix1KSk7cmV0dXJuIHdlKHt9LGksYSl9ZnVuY3Rpb24gY2cocyl7cmV0dXJuIHM9KHM9cy5zdGF0ZU5vZGUpJiZzLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0fHxTbix3bj1fbi5jdXJyZW50LEcoX24scyksRyhFbixFbi5jdXJyZW50KSwhMH1mdW5jdGlvbiBkZyhzLG8saSl7dmFyIGE9cy5zdGF0ZU5vZGU7aWYoIWEpdGhyb3cgRXJyb3IocCgxNjkpKTtpPyhzPWJnKHMsbyx3biksYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1zLEUoRW4pLEUoX24pLEcoX24scykpOkUoRW4pLEcoRW4saSl9dmFyIHhuPW51bGwsa249ITEsT249ITE7ZnVuY3Rpb24gaGcocyl7bnVsbD09PXhuP3huPVtzXTp4bi5wdXNoKHMpfWZ1bmN0aW9uIGpnKCl7aWYoIU9uJiZudWxsIT09eG4pe09uPSEwO3ZhciBzPTAsbz1BdDt0cnl7dmFyIGk9eG47Zm9yKEF0PTE7czxpLmxlbmd0aDtzKyspe3ZhciBhPWlbc107ZG97YT1hKCEwKX13aGlsZShudWxsIT09YSl9eG49bnVsbCxrbj0hMX1jYXRjaChvKXt0aHJvdyBudWxsIT09eG4mJih4bj14bi5zbGljZShzKzEpKSxjdChtdCxqZyksb31maW5hbGx5e0F0PW8sT249ITF9fXJldHVybiBudWxsfXZhciBBbj1bXSxDbj0wLGpuPW51bGwsUG49MCxJbj1bXSxUbj0wLE5uPW51bGwsTW49MSxSbj0iIjtmdW5jdGlvbiB0ZyhzLG8pe0FuW0NuKytdPVBuLEFuW0NuKytdPWpuLGpuPXMsUG49b31mdW5jdGlvbiB1ZyhzLG8saSl7SW5bVG4rK109TW4sSW5bVG4rK109Um4sSW5bVG4rK109Tm4sTm49czt2YXIgYT1NbjtzPVJuO3ZhciB1PTMyLUV0KGEpLTE7YSY9figxPDx1KSxpKz0xO3ZhciBfPTMyLUV0KG8pK3U7aWYoMzA8Xyl7dmFyIHc9dS11JTU7Xz0oYSYoMTw8dyktMSkudG9TdHJpbmcoMzIpLGE+Pj13LHUtPXcsTW49MTw8MzItRXQobykrdXxpPDx1fGEsUm49XytzfWVsc2UgTW49MTw8X3xpPDx1fGEsUm49c31mdW5jdGlvbiB2ZyhzKXtudWxsIT09cy5yZXR1cm4mJih0ZyhzLDEpLHVnKHMsMSwwKSl9ZnVuY3Rpb24gd2cocyl7Zm9yKDtzPT09am47KWpuPUFuWy0tQ25dLEFuW0NuXT1udWxsLFBuPUFuWy0tQ25dLEFuW0NuXT1udWxsO2Zvcig7cz09PU5uOylObj1JblstLVRuXSxJbltUbl09bnVsbCxSbj1JblstLVRuXSxJbltUbl09bnVsbCxNbj1JblstLVRuXSxJbltUbl09bnVsbH12YXIgRG49bnVsbCxMbj1udWxsLEZuPSExLEJuPW51bGw7ZnVuY3Rpb24gQWcocyxvKXt2YXIgaT1CZyg1LG51bGwsbnVsbCwwKTtpLmVsZW1lbnRUeXBlPSJERUxFVEVEIixpLnN0YXRlTm9kZT1vLGkucmV0dXJuPXMsbnVsbD09PShvPXMuZGVsZXRpb25zKT8ocy5kZWxldGlvbnM9W2ldLHMuZmxhZ3N8PTE2KTpvLnB1c2goaSl9ZnVuY3Rpb24gQ2cocyxvKXtzd2l0Y2gocy50YWcpe2Nhc2UgNTp2YXIgaT1zLnR5cGU7cmV0dXJuIG51bGwhPT0obz0xIT09by5ub2RlVHlwZXx8aS50b0xvd2VyQ2FzZSgpIT09by5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6bykmJihzLnN0YXRlTm9kZT1vLERuPXMsTG49TGYoby5maXJzdENoaWxkKSwhMCk7Y2FzZSA2OnJldHVybiBudWxsIT09KG89IiI9PT1zLnBlbmRpbmdQcm9wc3x8MyE9PW8ubm9kZVR5cGU/bnVsbDpvKSYmKHMuc3RhdGVOb2RlPW8sRG49cyxMbj1udWxsLCEwKTtjYXNlIDEzOnJldHVybiBudWxsIT09KG89OCE9PW8ubm9kZVR5cGU/bnVsbDpvKSYmKGk9bnVsbCE9PU5uP3tpZDpNbixvdmVyZmxvdzpSbn06bnVsbCxzLm1lbW9pemVkU3RhdGU9e2RlaHlkcmF0ZWQ6byx0cmVlQ29udGV4dDppLHJldHJ5TGFuZToxMDczNzQxODI0fSwoaT1CZygxOCxudWxsLG51bGwsMCkpLnN0YXRlTm9kZT1vLGkucmV0dXJuPXMscy5jaGlsZD1pLERuPXMsTG49bnVsbCwhMCk7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gRGcocyl7cmV0dXJuISghKDEmcy5tb2RlKXx8MTI4JnMuZmxhZ3MpfWZ1bmN0aW9uIEVnKHMpe2lmKEZuKXt2YXIgbz1MbjtpZihvKXt2YXIgaT1vO2lmKCFDZyhzLG8pKXtpZihEZyhzKSl0aHJvdyBFcnJvcihwKDQxOCkpO289TGYoaS5uZXh0U2libGluZyk7dmFyIGE9RG47byYmQ2cocyxvKT9BZyhhLGkpOihzLmZsYWdzPS00MDk3JnMuZmxhZ3N8MixGbj0hMSxEbj1zKX19ZWxzZXtpZihEZyhzKSl0aHJvdyBFcnJvcihwKDQxOCkpO3MuZmxhZ3M9LTQwOTcmcy5mbGFnc3wyLEZuPSExLERuPXN9fX1mdW5jdGlvbiBGZyhzKXtmb3Iocz1zLnJldHVybjtudWxsIT09cyYmNSE9PXMudGFnJiYzIT09cy50YWcmJjEzIT09cy50YWc7KXM9cy5yZXR1cm47RG49c31mdW5jdGlvbiBHZyhzKXtpZihzIT09RG4pcmV0dXJuITE7aWYoIUZuKXJldHVybiBGZyhzKSxGbj0hMCwhMTt2YXIgbztpZigobz0zIT09cy50YWcpJiYhKG89NSE9PXMudGFnKSYmKG89ImhlYWQiIT09KG89cy50eXBlKSYmImJvZHkiIT09byYmIUVmKHMudHlwZSxzLm1lbW9pemVkUHJvcHMpKSxvJiYobz1Mbikpe2lmKERnKHMpKXRocm93IEhnKCksRXJyb3IocCg0MTgpKTtmb3IoO287KUFnKHMsbyksbz1MZihvLm5leHRTaWJsaW5nKX1pZihGZyhzKSwxMz09PXMudGFnKXtpZighKHM9bnVsbCE9PShzPXMubWVtb2l6ZWRTdGF0ZSk/cy5kZWh5ZHJhdGVkOm51bGwpKXRocm93IEVycm9yKHAoMzE3KSk7ZTp7Zm9yKHM9cy5uZXh0U2libGluZyxvPTA7czspe2lmKDg9PT1zLm5vZGVUeXBlKXt2YXIgaT1zLmRhdGE7aWYoIi8kIj09PWkpe2lmKDA9PT1vKXtMbj1MZihzLm5leHRTaWJsaW5nKTticmVhayBlfW8tLX1lbHNlIiQiIT09aSYmIiQhIiE9PWkmJiIkPyIhPT1pfHxvKyt9cz1zLm5leHRTaWJsaW5nfUxuPW51bGx9fWVsc2UgTG49RG4/TGYocy5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9ZnVuY3Rpb24gSGcoKXtmb3IodmFyIHM9TG47czspcz1MZihzLm5leHRTaWJsaW5nKX1mdW5jdGlvbiBJZygpe0xuPURuPW51bGwsRm49ITF9ZnVuY3Rpb24gSmcocyl7bnVsbD09PUJuP0JuPVtzXTpCbi5wdXNoKHMpfXZhciAkbj1WLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO2Z1bmN0aW9uIExnKHMsbyxpKXtpZihudWxsIT09KHM9aS5yZWYpJiYiZnVuY3Rpb24iIT10eXBlb2YgcyYmIm9iamVjdCIhPXR5cGVvZiBzKXtpZihpLl9vd25lcil7aWYoaT1pLl9vd25lcil7aWYoMSE9PWkudGFnKXRocm93IEVycm9yKHAoMzA5KSk7dmFyIGE9aS5zdGF0ZU5vZGV9aWYoIWEpdGhyb3cgRXJyb3IocCgxNDcscykpO3ZhciB1PWEsXz0iIitzO3JldHVybiBudWxsIT09byYmbnVsbCE9PW8ucmVmJiYiZnVuY3Rpb24iPT10eXBlb2Ygby5yZWYmJm8ucmVmLl9zdHJpbmdSZWY9PT1fP28ucmVmOihvPWZ1bmN0aW9uKHMpe3ZhciBvPXUucmVmcztudWxsPT09cz9kZWxldGUgb1tfXTpvW19dPXN9LG8uX3N0cmluZ1JlZj1fLG8pfWlmKCJzdHJpbmciIT10eXBlb2Ygcyl0aHJvdyBFcnJvcihwKDI4NCkpO2lmKCFpLl9vd25lcil0aHJvdyBFcnJvcihwKDI5MCxzKSl9cmV0dXJuIHN9ZnVuY3Rpb24gTWcocyxvKXt0aHJvdyBzPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSxFcnJvcihwKDMxLCJbb2JqZWN0IE9iamVjdF0iPT09cz8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyhvKS5qb2luKCIsICIpKyJ9IjpzKSl9ZnVuY3Rpb24gTmcocyl7cmV0dXJuKDAscy5faW5pdCkocy5fcGF5bG9hZCl9ZnVuY3Rpb24gT2cocyl7ZnVuY3Rpb24gYihvLGkpe2lmKHMpe3ZhciBhPW8uZGVsZXRpb25zO251bGw9PT1hPyhvLmRlbGV0aW9ucz1baV0sby5mbGFnc3w9MTYpOmEucHVzaChpKX19ZnVuY3Rpb24gYyhvLGkpe2lmKCFzKXJldHVybiBudWxsO2Zvcig7bnVsbCE9PWk7KWIobyxpKSxpPWkuc2libGluZztyZXR1cm4gbnVsbH1mdW5jdGlvbiBkKHMsbyl7Zm9yKHM9bmV3IE1hcDtudWxsIT09bzspbnVsbCE9PW8ua2V5P3Muc2V0KG8ua2V5LG8pOnMuc2V0KG8uaW5kZXgsbyksbz1vLnNpYmxpbmc7cmV0dXJuIHN9ZnVuY3Rpb24gZShzLG8pe3JldHVybihzPVBnKHMsbykpLmluZGV4PTAscy5zaWJsaW5nPW51bGwsc31mdW5jdGlvbiBmKG8saSxhKXtyZXR1cm4gby5pbmRleD1hLHM/bnVsbCE9PShhPW8uYWx0ZXJuYXRlKT8oYT1hLmluZGV4KTxpPyhvLmZsYWdzfD0yLGkpOmE6KG8uZmxhZ3N8PTIsaSk6KG8uZmxhZ3N8PTEwNDg1NzYsaSl9ZnVuY3Rpb24gZyhvKXtyZXR1cm4gcyYmbnVsbD09PW8uYWx0ZXJuYXRlJiYoby5mbGFnc3w9Miksb31mdW5jdGlvbiBoKHMsbyxpLGEpe3JldHVybiBudWxsPT09b3x8NiE9PW8udGFnPygobz1RZyhpLHMubW9kZSxhKSkucmV0dXJuPXMsbyk6KChvPWUobyxpKSkucmV0dXJuPXMsbyl9ZnVuY3Rpb24gayhzLG8saSxhKXt2YXIgdT1pLnR5cGU7cmV0dXJuIHU9PT1aP20ocyxvLGkucHJvcHMuY2hpbGRyZW4sYSxpLmtleSk6bnVsbCE9PW8mJihvLmVsZW1lbnRUeXBlPT09dXx8Im9iamVjdCI9PXR5cGVvZiB1JiZudWxsIT09dSYmdS4kJHR5cGVvZj09PXllJiZOZyh1KT09PW8udHlwZSk/KChhPWUobyxpLnByb3BzKSkucmVmPUxnKHMsbyxpKSxhLnJldHVybj1zLGEpOigoYT1SZyhpLnR5cGUsaS5rZXksaS5wcm9wcyxudWxsLHMubW9kZSxhKSkucmVmPUxnKHMsbyxpKSxhLnJldHVybj1zLGEpfWZ1bmN0aW9uIGwocyxvLGksYSl7cmV0dXJuIG51bGw9PT1vfHw0IT09by50YWd8fG8uc3RhdGVOb2RlLmNvbnRhaW5lckluZm8hPT1pLmNvbnRhaW5lckluZm98fG8uc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uIT09aS5pbXBsZW1lbnRhdGlvbj8oKG89U2coaSxzLm1vZGUsYSkpLnJldHVybj1zLG8pOigobz1lKG8saS5jaGlsZHJlbnx8W10pKS5yZXR1cm49cyxvKX1mdW5jdGlvbiBtKHMsbyxpLGEsdSl7cmV0dXJuIG51bGw9PT1vfHw3IT09by50YWc/KChvPVRnKGkscy5tb2RlLGEsdSkpLnJldHVybj1zLG8pOigobz1lKG8saSkpLnJldHVybj1zLG8pfWZ1bmN0aW9uIHEocyxvLGkpe2lmKCJzdHJpbmciPT10eXBlb2YgbyYmIiIhPT1vfHwibnVtYmVyIj09dHlwZW9mIG8pcmV0dXJuKG89UWcoIiIrbyxzLm1vZGUsaSkpLnJldHVybj1zLG87aWYoIm9iamVjdCI9PXR5cGVvZiBvJiZudWxsIT09byl7c3dpdGNoKG8uJCR0eXBlb2Ype2Nhc2UgejpyZXR1cm4oaT1SZyhvLnR5cGUsby5rZXksby5wcm9wcyxudWxsLHMubW9kZSxpKSkucmVmPUxnKHMsbnVsbCxvKSxpLnJldHVybj1zLGk7Y2FzZSBZOnJldHVybihvPVNnKG8scy5tb2RlLGkpKS5yZXR1cm49cyxvO2Nhc2UgeWU6cmV0dXJuIHEocywoMCxvLl9pbml0KShvLl9wYXlsb2FkKSxpKX1pZihQZShvKXx8S2EobykpcmV0dXJuKG89VGcobyxzLm1vZGUsaSxudWxsKSkucmV0dXJuPXMsbztNZyhzLG8pfXJldHVybiBudWxsfWZ1bmN0aW9uIHIocyxvLGksYSl7dmFyIHU9bnVsbCE9PW8/by5rZXk6bnVsbDtpZigic3RyaW5nIj09dHlwZW9mIGkmJiIiIT09aXx8Im51bWJlciI9PXR5cGVvZiBpKXJldHVybiBudWxsIT09dT9udWxsOmgocyxvLCIiK2ksYSk7aWYoIm9iamVjdCI9PXR5cGVvZiBpJiZudWxsIT09aSl7c3dpdGNoKGkuJCR0eXBlb2Ype2Nhc2UgejpyZXR1cm4gaS5rZXk9PT11P2socyxvLGksYSk6bnVsbDtjYXNlIFk6cmV0dXJuIGkua2V5PT09dT9sKHMsbyxpLGEpOm51bGw7Y2FzZSB5ZTpyZXR1cm4gcihzLG8sKHU9aS5faW5pdCkoaS5fcGF5bG9hZCksYSl9aWYoUGUoaSl8fEthKGkpKXJldHVybiBudWxsIT09dT9udWxsOm0ocyxvLGksYSxudWxsKTtNZyhzLGkpfXJldHVybiBudWxsfWZ1bmN0aW9uIHkocyxvLGksYSx1KXtpZigic3RyaW5nIj09dHlwZW9mIGEmJiIiIT09YXx8Im51bWJlciI9PXR5cGVvZiBhKXJldHVybiBoKG8scz1zLmdldChpKXx8bnVsbCwiIithLHUpO2lmKCJvYmplY3QiPT10eXBlb2YgYSYmbnVsbCE9PWEpe3N3aXRjaChhLiQkdHlwZW9mKXtjYXNlIHo6cmV0dXJuIGsobyxzPXMuZ2V0KG51bGw9PT1hLmtleT9pOmEua2V5KXx8bnVsbCxhLHUpO2Nhc2UgWTpyZXR1cm4gbChvLHM9cy5nZXQobnVsbD09PWEua2V5P2k6YS5rZXkpfHxudWxsLGEsdSk7Y2FzZSB5ZTpyZXR1cm4geShzLG8saSwoMCxhLl9pbml0KShhLl9wYXlsb2FkKSx1KX1pZihQZShhKXx8S2EoYSkpcmV0dXJuIG0obyxzPXMuZ2V0KGkpfHxudWxsLGEsdSxudWxsKTtNZyhvLGEpfXJldHVybiBudWxsfWZ1bmN0aW9uIG4obyxpLGEsdSl7Zm9yKHZhciBfPW51bGwsdz1udWxsLHg9aSxDPWk9MCxqPW51bGw7bnVsbCE9PXgmJkM8YS5sZW5ndGg7QysrKXt4LmluZGV4PkM/KGo9eCx4PW51bGwpOmo9eC5zaWJsaW5nO3ZhciBMPXIobyx4LGFbQ10sdSk7aWYobnVsbD09PUwpe251bGw9PT14JiYoeD1qKTticmVha31zJiZ4JiZudWxsPT09TC5hbHRlcm5hdGUmJmIobyx4KSxpPWYoTCxpLEMpLG51bGw9PT13P189TDp3LnNpYmxpbmc9TCx3PUwseD1qfWlmKEM9PT1hLmxlbmd0aClyZXR1cm4gYyhvLHgpLEZuJiZ0ZyhvLEMpLF87aWYobnVsbD09PXgpe2Zvcig7QzxhLmxlbmd0aDtDKyspbnVsbCE9PSh4PXEobyxhW0NdLHUpKSYmKGk9Zih4LGksQyksbnVsbD09PXc/Xz14Oncuc2libGluZz14LHc9eCk7cmV0dXJuIEZuJiZ0ZyhvLEMpLF99Zm9yKHg9ZChvLHgpO0M8YS5sZW5ndGg7QysrKW51bGwhPT0oaj15KHgsbyxDLGFbQ10sdSkpJiYocyYmbnVsbCE9PWouYWx0ZXJuYXRlJiZ4LmRlbGV0ZShudWxsPT09ai5rZXk/QzpqLmtleSksaT1mKGosaSxDKSxudWxsPT09dz9fPWo6dy5zaWJsaW5nPWosdz1qKTtyZXR1cm4gcyYmeC5mb3JFYWNoKChmdW5jdGlvbihzKXtyZXR1cm4gYihvLHMpfSkpLEZuJiZ0ZyhvLEMpLF99ZnVuY3Rpb24gdChvLGksYSx1KXt2YXIgXz1LYShhKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgXyl0aHJvdyBFcnJvcihwKDE1MCkpO2lmKG51bGw9PShhPV8uY2FsbChhKSkpdGhyb3cgRXJyb3IocCgxNTEpKTtmb3IodmFyIHc9Xz1udWxsLHg9aSxDPWk9MCxqPW51bGwsTD1hLm5leHQoKTtudWxsIT09eCYmIUwuZG9uZTtDKyssTD1hLm5leHQoKSl7eC5pbmRleD5DPyhqPXgseD1udWxsKTpqPXguc2libGluZzt2YXIgQj1yKG8seCxMLnZhbHVlLHUpO2lmKG51bGw9PT1CKXtudWxsPT09eCYmKHg9aik7YnJlYWt9cyYmeCYmbnVsbD09PUIuYWx0ZXJuYXRlJiZiKG8seCksaT1mKEIsaSxDKSxudWxsPT09dz9fPUI6dy5zaWJsaW5nPUIsdz1CLHg9an1pZihMLmRvbmUpcmV0dXJuIGMobyx4KSxGbiYmdGcobyxDKSxfO2lmKG51bGw9PT14KXtmb3IoOyFMLmRvbmU7QysrLEw9YS5uZXh0KCkpbnVsbCE9PShMPXEobyxMLnZhbHVlLHUpKSYmKGk9ZihMLGksQyksbnVsbD09PXc/Xz1MOncuc2libGluZz1MLHc9TCk7cmV0dXJuIEZuJiZ0ZyhvLEMpLF99Zm9yKHg9ZChvLHgpOyFMLmRvbmU7QysrLEw9YS5uZXh0KCkpbnVsbCE9PShMPXkoeCxvLEMsTC52YWx1ZSx1KSkmJihzJiZudWxsIT09TC5hbHRlcm5hdGUmJnguZGVsZXRlKG51bGw9PT1MLmtleT9DOkwua2V5KSxpPWYoTCxpLEMpLG51bGw9PT13P189TDp3LnNpYmxpbmc9TCx3PUwpO3JldHVybiBzJiZ4LmZvckVhY2goKGZ1bmN0aW9uKHMpe3JldHVybiBiKG8scyl9KSksRm4mJnRnKG8sQyksX31yZXR1cm4gZnVuY3Rpb24gSihzLG8saSxhKXtpZigib2JqZWN0Ij09dHlwZW9mIGkmJm51bGwhPT1pJiZpLnR5cGU9PT1aJiZudWxsPT09aS5rZXkmJihpPWkucHJvcHMuY2hpbGRyZW4pLCJvYmplY3QiPT10eXBlb2YgaSYmbnVsbCE9PWkpe3N3aXRjaChpLiQkdHlwZW9mKXtjYXNlIHo6ZTp7Zm9yKHZhciB1PWkua2V5LF89bztudWxsIT09Xzspe2lmKF8ua2V5PT09dSl7aWYoKHU9aS50eXBlKT09PVope2lmKDc9PT1fLnRhZyl7YyhzLF8uc2libGluZyksKG89ZShfLGkucHJvcHMuY2hpbGRyZW4pKS5yZXR1cm49cyxzPW87YnJlYWsgZX19ZWxzZSBpZihfLmVsZW1lbnRUeXBlPT09dXx8Im9iamVjdCI9PXR5cGVvZiB1JiZudWxsIT09dSYmdS4kJHR5cGVvZj09PXllJiZOZyh1KT09PV8udHlwZSl7YyhzLF8uc2libGluZyksKG89ZShfLGkucHJvcHMpKS5yZWY9TGcocyxfLGkpLG8ucmV0dXJuPXMscz1vO2JyZWFrIGV9YyhzLF8pO2JyZWFrfWIocyxfKSxfPV8uc2libGluZ31pLnR5cGU9PT1aPygobz1UZyhpLnByb3BzLmNoaWxkcmVuLHMubW9kZSxhLGkua2V5KSkucmV0dXJuPXMscz1vKTooKGE9UmcoaS50eXBlLGkua2V5LGkucHJvcHMsbnVsbCxzLm1vZGUsYSkpLnJlZj1MZyhzLG8saSksYS5yZXR1cm49cyxzPWEpfXJldHVybiBnKHMpO2Nhc2UgWTplOntmb3IoXz1pLmtleTtudWxsIT09bzspe2lmKG8ua2V5PT09Xyl7aWYoND09PW8udGFnJiZvLnN0YXRlTm9kZS5jb250YWluZXJJbmZvPT09aS5jb250YWluZXJJbmZvJiZvLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbj09PWkuaW1wbGVtZW50YXRpb24pe2MocyxvLnNpYmxpbmcpLChvPWUobyxpLmNoaWxkcmVufHxbXSkpLnJldHVybj1zLHM9bzticmVhayBlfWMocyxvKTticmVha31iKHMsbyksbz1vLnNpYmxpbmd9KG89U2coaSxzLm1vZGUsYSkpLnJldHVybj1zLHM9b31yZXR1cm4gZyhzKTtjYXNlIHllOnJldHVybiBKKHMsbywoXz1pLl9pbml0KShpLl9wYXlsb2FkKSxhKX1pZihQZShpKSlyZXR1cm4gbihzLG8saSxhKTtpZihLYShpKSlyZXR1cm4gdChzLG8saSxhKTtNZyhzLGkpfXJldHVybiJzdHJpbmciPT10eXBlb2YgaSYmIiIhPT1pfHwibnVtYmVyIj09dHlwZW9mIGk/KGk9IiIraSxudWxsIT09byYmNj09PW8udGFnPyhjKHMsby5zaWJsaW5nKSwobz1lKG8saSkpLnJldHVybj1zLHM9byk6KGMocyxvKSwobz1RZyhpLHMubW9kZSxhKSkucmV0dXJuPXMscz1vKSxnKHMpKTpjKHMsbyl9fXZhciBxbj1PZyghMCksVW49T2coITEpLFZuPVVmKG51bGwpLHpuPW51bGwsV249bnVsbCxKbj1udWxsO2Z1bmN0aW9uICRnKCl7Sm49V249em49bnVsbH1mdW5jdGlvbiBhaChzKXt2YXIgbz1Wbi5jdXJyZW50O0UoVm4pLHMuX2N1cnJlbnRWYWx1ZT1vfWZ1bmN0aW9uIGJoKHMsbyxpKXtmb3IoO251bGwhPT1zOyl7dmFyIGE9cy5hbHRlcm5hdGU7aWYoKHMuY2hpbGRMYW5lcyZvKSE9PW8/KHMuY2hpbGRMYW5lc3w9byxudWxsIT09YSYmKGEuY2hpbGRMYW5lc3w9bykpOm51bGwhPT1hJiYoYS5jaGlsZExhbmVzJm8pIT09byYmKGEuY2hpbGRMYW5lc3w9bykscz09PWkpYnJlYWs7cz1zLnJldHVybn19ZnVuY3Rpb24gY2gocyxvKXt6bj1zLEpuPVduPW51bGwsbnVsbCE9PShzPXMuZGVwZW5kZW5jaWVzKSYmbnVsbCE9PXMuZmlyc3RDb250ZXh0JiYoISEocy5sYW5lcyZvKSYmKGJzPSEwKSxzLmZpcnN0Q29udGV4dD1udWxsKX1mdW5jdGlvbiBlaChzKXt2YXIgbz1zLl9jdXJyZW50VmFsdWU7aWYoSm4hPT1zKWlmKHM9e2NvbnRleHQ6cyxtZW1vaXplZFZhbHVlOm8sbmV4dDpudWxsfSxudWxsPT09V24pe2lmKG51bGw9PT16bil0aHJvdyBFcnJvcihwKDMwOCkpO1duPXMsem4uZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDpzfX1lbHNlIFduPVduLm5leHQ9cztyZXR1cm4gb312YXIgSG49bnVsbDtmdW5jdGlvbiBnaChzKXtudWxsPT09SG4/SG49W3NdOkhuLnB1c2gocyl9ZnVuY3Rpb24gaGgocyxvLGksYSl7dmFyIHU9by5pbnRlcmxlYXZlZDtyZXR1cm4gbnVsbD09PXU/KGkubmV4dD1pLGdoKG8pKTooaS5uZXh0PXUubmV4dCx1Lm5leHQ9aSksby5pbnRlcmxlYXZlZD1pLGloKHMsYSl9ZnVuY3Rpb24gaWgocyxvKXtzLmxhbmVzfD1vO3ZhciBpPXMuYWx0ZXJuYXRlO2ZvcihudWxsIT09aSYmKGkubGFuZXN8PW8pLGk9cyxzPXMucmV0dXJuO251bGwhPT1zOylzLmNoaWxkTGFuZXN8PW8sbnVsbCE9PShpPXMuYWx0ZXJuYXRlKSYmKGkuY2hpbGRMYW5lc3w9byksaT1zLHM9cy5yZXR1cm47cmV0dXJuIDM9PT1pLnRhZz9pLnN0YXRlTm9kZTpudWxsfXZhciBLbj0hMTtmdW5jdGlvbiBraChzKXtzLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6cy5tZW1vaXplZFN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpudWxsLGxhc3RCYXNlVXBkYXRlOm51bGwsc2hhcmVkOntwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowfSxlZmZlY3RzOm51bGx9fWZ1bmN0aW9uIGxoKHMsbyl7cz1zLnVwZGF0ZVF1ZXVlLG8udXBkYXRlUXVldWU9PT1zJiYoby51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOnMuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpzLmZpcnN0QmFzZVVwZGF0ZSxsYXN0QmFzZVVwZGF0ZTpzLmxhc3RCYXNlVXBkYXRlLHNoYXJlZDpzLnNoYXJlZCxlZmZlY3RzOnMuZWZmZWN0c30pfWZ1bmN0aW9uIG1oKHMsbyl7cmV0dXJue2V2ZW50VGltZTpzLGxhbmU6byx0YWc6MCxwYXlsb2FkOm51bGwsY2FsbGJhY2s6bnVsbCxuZXh0Om51bGx9fWZ1bmN0aW9uIG5oKHMsbyxpKXt2YXIgYT1zLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT1hKXJldHVybiBudWxsO2lmKGE9YS5zaGFyZWQsMiZEcyl7dmFyIHU9YS5wZW5kaW5nO3JldHVybiBudWxsPT09dT9vLm5leHQ9bzooby5uZXh0PXUubmV4dCx1Lm5leHQ9byksYS5wZW5kaW5nPW8saWgocyxpKX1yZXR1cm4gbnVsbD09PSh1PWEuaW50ZXJsZWF2ZWQpPyhvLm5leHQ9byxnaChhKSk6KG8ubmV4dD11Lm5leHQsdS5uZXh0PW8pLGEuaW50ZXJsZWF2ZWQ9byxpaChzLGkpfWZ1bmN0aW9uIG9oKHMsbyxpKXtpZihudWxsIT09KG89by51cGRhdGVRdWV1ZSkmJihvPW8uc2hhcmVkLDQxOTQyNDAmaSkpe3ZhciBhPW8ubGFuZXM7aXw9YSY9cy5wZW5kaW5nTGFuZXMsby5sYW5lcz1pLENjKHMsaSl9fWZ1bmN0aW9uIHBoKHMsbyl7dmFyIGk9cy51cGRhdGVRdWV1ZSxhPXMuYWx0ZXJuYXRlO2lmKG51bGwhPT1hJiZpPT09KGE9YS51cGRhdGVRdWV1ZSkpe3ZhciB1PW51bGwsXz1udWxsO2lmKG51bGwhPT0oaT1pLmZpcnN0QmFzZVVwZGF0ZSkpe2Rve3ZhciB3PXtldmVudFRpbWU6aS5ldmVudFRpbWUsbGFuZTppLmxhbmUsdGFnOmkudGFnLHBheWxvYWQ6aS5wYXlsb2FkLGNhbGxiYWNrOmkuY2FsbGJhY2ssbmV4dDpudWxsfTtudWxsPT09Xz91PV89dzpfPV8ubmV4dD13LGk9aS5uZXh0fXdoaWxlKG51bGwhPT1pKTtudWxsPT09Xz91PV89bzpfPV8ubmV4dD1vfWVsc2UgdT1fPW87cmV0dXJuIGk9e2Jhc2VTdGF0ZTphLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6dSxsYXN0QmFzZVVwZGF0ZTpfLHNoYXJlZDphLnNoYXJlZCxlZmZlY3RzOmEuZWZmZWN0c30sdm9pZChzLnVwZGF0ZVF1ZXVlPWkpfW51bGw9PT0ocz1pLmxhc3RCYXNlVXBkYXRlKT9pLmZpcnN0QmFzZVVwZGF0ZT1vOnMubmV4dD1vLGkubGFzdEJhc2VVcGRhdGU9b31mdW5jdGlvbiBxaChzLG8saSxhKXt2YXIgdT1zLnVwZGF0ZVF1ZXVlO0tuPSExO3ZhciBfPXUuZmlyc3RCYXNlVXBkYXRlLHc9dS5sYXN0QmFzZVVwZGF0ZSx4PXUuc2hhcmVkLnBlbmRpbmc7aWYobnVsbCE9PXgpe3Uuc2hhcmVkLnBlbmRpbmc9bnVsbDt2YXIgQz14LGo9Qy5uZXh0O0MubmV4dD1udWxsLG51bGw9PT13P189ajp3Lm5leHQ9aix3PUM7dmFyIEw9cy5hbHRlcm5hdGU7bnVsbCE9PUwmJigoeD0oTD1MLnVwZGF0ZVF1ZXVlKS5sYXN0QmFzZVVwZGF0ZSkhPT13JiYobnVsbD09PXg/TC5maXJzdEJhc2VVcGRhdGU9ajp4Lm5leHQ9aixMLmxhc3RCYXNlVXBkYXRlPUMpKX1pZihudWxsIT09Xyl7dmFyIEI9dS5iYXNlU3RhdGU7Zm9yKHc9MCxMPWo9Qz1udWxsLHg9Xzs7KXt2YXIgJD14LmxhbmUsVT14LmV2ZW50VGltZTtpZigoYSYkKT09PSQpe251bGwhPT1MJiYoTD1MLm5leHQ9e2V2ZW50VGltZTpVLGxhbmU6MCx0YWc6eC50YWcscGF5bG9hZDp4LnBheWxvYWQsY2FsbGJhY2s6eC5jYWxsYmFjayxuZXh0Om51bGx9KTtlOnt2YXIgVj1zLHo9eDtzd2l0Y2goJD1vLFU9aSx6LnRhZyl7Y2FzZSAxOmlmKCJmdW5jdGlvbiI9PXR5cGVvZihWPXoucGF5bG9hZCkpe0I9Vi5jYWxsKFUsQiwkKTticmVhayBlfUI9VjticmVhayBlO2Nhc2UgMzpWLmZsYWdzPS02NTUzNyZWLmZsYWdzfDEyODtjYXNlIDA6aWYobnVsbD09KCQ9ImZ1bmN0aW9uIj09dHlwZW9mKFY9ei5wYXlsb2FkKT9WLmNhbGwoVSxCLCQpOlYpKWJyZWFrIGU7Qj13ZSh7fSxCLCQpO2JyZWFrIGU7Y2FzZSAyOktuPSEwfX1udWxsIT09eC5jYWxsYmFjayYmMCE9PXgubGFuZSYmKHMuZmxhZ3N8PTY0LG51bGw9PT0oJD11LmVmZmVjdHMpP3UuZWZmZWN0cz1beF06JC5wdXNoKHgpKX1lbHNlIFU9e2V2ZW50VGltZTpVLGxhbmU6JCx0YWc6eC50YWcscGF5bG9hZDp4LnBheWxvYWQsY2FsbGJhY2s6eC5jYWxsYmFjayxuZXh0Om51bGx9LG51bGw9PT1MPyhqPUw9VSxDPUIpOkw9TC5uZXh0PVUsd3w9JDtpZihudWxsPT09KHg9eC5uZXh0KSl7aWYobnVsbD09PSh4PXUuc2hhcmVkLnBlbmRpbmcpKWJyZWFrO3g9KCQ9eCkubmV4dCwkLm5leHQ9bnVsbCx1Lmxhc3RCYXNlVXBkYXRlPSQsdS5zaGFyZWQucGVuZGluZz1udWxsfX1pZihudWxsPT09TCYmKEM9QiksdS5iYXNlU3RhdGU9Qyx1LmZpcnN0QmFzZVVwZGF0ZT1qLHUubGFzdEJhc2VVcGRhdGU9TCxudWxsIT09KG89dS5zaGFyZWQuaW50ZXJsZWF2ZWQpKXt1PW87ZG97d3w9dS5sYW5lLHU9dS5uZXh0fXdoaWxlKHUhPT1vKX1lbHNlIG51bGw9PT1fJiYodS5zaGFyZWQubGFuZXM9MCk7enN8PXcscy5sYW5lcz13LHMubWVtb2l6ZWRTdGF0ZT1CfX1mdW5jdGlvbiBzaChzLG8saSl7aWYocz1vLmVmZmVjdHMsby5lZmZlY3RzPW51bGwsbnVsbCE9PXMpZm9yKG89MDtvPHMubGVuZ3RoO28rKyl7dmFyIGE9c1tvXSx1PWEuY2FsbGJhY2s7aWYobnVsbCE9PXUpe2lmKGEuY2FsbGJhY2s9bnVsbCxhPWksImZ1bmN0aW9uIiE9dHlwZW9mIHUpdGhyb3cgRXJyb3IocCgxOTEsdSkpO3UuY2FsbChhKX19fXZhciBHbj17fSxZbj1VZihHbiksWG49VWYoR24pLFFuPVVmKEduKTtmdW5jdGlvbiB4aChzKXtpZihzPT09R24pdGhyb3cgRXJyb3IocCgxNzQpKTtyZXR1cm4gc31mdW5jdGlvbiB5aChzLG8pe3N3aXRjaChHKFFuLG8pLEcoWG4scyksRyhZbixHbikscz1vLm5vZGVUeXBlKXtjYXNlIDk6Y2FzZSAxMTpvPShvPW8uZG9jdW1lbnRFbGVtZW50KT9vLm5hbWVzcGFjZVVSSTpsYihudWxsLCIiKTticmVhaztkZWZhdWx0Om89bGIobz0ocz04PT09cz9vLnBhcmVudE5vZGU6bykubmFtZXNwYWNlVVJJfHxudWxsLHM9cy50YWdOYW1lKX1FKFluKSxHKFluLG8pfWZ1bmN0aW9uIHpoKCl7RShZbiksRShYbiksRShRbil9ZnVuY3Rpb24gQWgocyl7eGgoUW4uY3VycmVudCk7dmFyIG89eGgoWW4uY3VycmVudCksaT1sYihvLHMudHlwZSk7byE9PWkmJihHKFhuLHMpLEcoWW4saSkpfWZ1bmN0aW9uIEJoKHMpe1huLmN1cnJlbnQ9PT1zJiYoRShZbiksRShYbikpfXZhciBabj1VZigwKTtmdW5jdGlvbiBDaChzKXtmb3IodmFyIG89cztudWxsIT09bzspe2lmKDEzPT09by50YWcpe3ZhciBpPW8ubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09aSYmKG51bGw9PT0oaT1pLmRlaHlkcmF0ZWQpfHwiJD8iPT09aS5kYXRhfHwiJCEiPT09aS5kYXRhKSlyZXR1cm4gb31lbHNlIGlmKDE5PT09by50YWcmJnZvaWQgMCE9PW8ubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlcil7aWYoMTI4Jm8uZmxhZ3MpcmV0dXJuIG99ZWxzZSBpZihudWxsIT09by5jaGlsZCl7by5jaGlsZC5yZXR1cm49byxvPW8uY2hpbGQ7Y29udGludWV9aWYobz09PXMpYnJlYWs7Zm9yKDtudWxsPT09by5zaWJsaW5nOyl7aWYobnVsbD09PW8ucmV0dXJufHxvLnJldHVybj09PXMpcmV0dXJuIG51bGw7bz1vLnJldHVybn1vLnNpYmxpbmcucmV0dXJuPW8ucmV0dXJuLG89by5zaWJsaW5nfXJldHVybiBudWxsfXZhciBlcz1bXTtmdW5jdGlvbiBFaCgpe2Zvcih2YXIgcz0wO3M8ZXMubGVuZ3RoO3MrKyllc1tzXS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeT1udWxsO2VzLmxlbmd0aD0wfXZhciB0cz1WLlJlYWN0Q3VycmVudERpc3BhdGNoZXIscnM9Vi5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxucz0wLHNzPW51bGwsb3M9bnVsbCxhcz1udWxsLGNzPSExLGxzPSExLHVzPTAscHM9MDtmdW5jdGlvbiBQKCl7dGhyb3cgRXJyb3IocCgzMjEpKX1mdW5jdGlvbiBNaChzLG8pe2lmKG51bGw9PT1vKXJldHVybiExO2Zvcih2YXIgaT0wO2k8by5sZW5ndGgmJmk8cy5sZW5ndGg7aSsrKWlmKCFEcihzW2ldLG9baV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIE5oKHMsbyxpLGEsdSxfKXtpZihucz1fLHNzPW8sby5tZW1vaXplZFN0YXRlPW51bGwsby51cGRhdGVRdWV1ZT1udWxsLG8ubGFuZXM9MCx0cy5jdXJyZW50PW51bGw9PT1zfHxudWxsPT09cy5tZW1vaXplZFN0YXRlP2RzOmZzLHM9aShhLHUpLGxzKXtfPTA7ZG97aWYobHM9ITEsdXM9MCwyNTw9Xyl0aHJvdyBFcnJvcihwKDMwMSkpO18rPTEsYXM9b3M9bnVsbCxvLnVwZGF0ZVF1ZXVlPW51bGwsdHMuY3VycmVudD1tcyxzPWkoYSx1KX13aGlsZShscyl9aWYodHMuY3VycmVudD1ocyxvPW51bGwhPT1vcyYmbnVsbCE9PW9zLm5leHQsbnM9MCxhcz1vcz1zcz1udWxsLGNzPSExLG8pdGhyb3cgRXJyb3IocCgzMDApKTtyZXR1cm4gc31mdW5jdGlvbiBTaCgpe3ZhciBzPTAhPT11cztyZXR1cm4gdXM9MCxzfWZ1bmN0aW9uIFRoKCl7dmFyIHM9e21lbW9pemVkU3RhdGU6bnVsbCxiYXNlU3RhdGU6bnVsbCxiYXNlUXVldWU6bnVsbCxxdWV1ZTpudWxsLG5leHQ6bnVsbH07cmV0dXJuIG51bGw9PT1hcz9zcy5tZW1vaXplZFN0YXRlPWFzPXM6YXM9YXMubmV4dD1zLGFzfWZ1bmN0aW9uIFVoKCl7aWYobnVsbD09PW9zKXt2YXIgcz1zcy5hbHRlcm5hdGU7cz1udWxsIT09cz9zLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIHM9b3MubmV4dDt2YXIgbz1udWxsPT09YXM/c3MubWVtb2l6ZWRTdGF0ZTphcy5uZXh0O2lmKG51bGwhPT1vKWFzPW8sb3M9cztlbHNle2lmKG51bGw9PT1zKXRocm93IEVycm9yKHAoMzEwKSk7cz17bWVtb2l6ZWRTdGF0ZToob3M9cykubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6b3MuYmFzZVN0YXRlLGJhc2VRdWV1ZTpvcy5iYXNlUXVldWUscXVldWU6b3MucXVldWUsbmV4dDpudWxsfSxudWxsPT09YXM/c3MubWVtb2l6ZWRTdGF0ZT1hcz1zOmFzPWFzLm5leHQ9c31yZXR1cm4gYXN9ZnVuY3Rpb24gVmgocyxvKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbz9vKHMpOm99ZnVuY3Rpb24gV2gocyl7dmFyIG89VWgoKSxpPW8ucXVldWU7aWYobnVsbD09PWkpdGhyb3cgRXJyb3IocCgzMTEpKTtpLmxhc3RSZW5kZXJlZFJlZHVjZXI9czt2YXIgYT1vcyx1PWEuYmFzZVF1ZXVlLF89aS5wZW5kaW5nO2lmKG51bGwhPT1fKXtpZihudWxsIT09dSl7dmFyIHc9dS5uZXh0O3UubmV4dD1fLm5leHQsXy5uZXh0PXd9YS5iYXNlUXVldWU9dT1fLGkucGVuZGluZz1udWxsfWlmKG51bGwhPT11KXtfPXUubmV4dCxhPWEuYmFzZVN0YXRlO3ZhciB4PXc9bnVsbCxDPW51bGwsaj1fO2Rve3ZhciBMPWoubGFuZTtpZigobnMmTCk9PT1MKW51bGwhPT1DJiYoQz1DLm5leHQ9e2xhbmU6MCxhY3Rpb246ai5hY3Rpb24saGFzRWFnZXJTdGF0ZTpqLmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTpqLmVhZ2VyU3RhdGUsbmV4dDpudWxsfSksYT1qLmhhc0VhZ2VyU3RhdGU/ai5lYWdlclN0YXRlOnMoYSxqLmFjdGlvbik7ZWxzZXt2YXIgQj17bGFuZTpMLGFjdGlvbjpqLmFjdGlvbixoYXNFYWdlclN0YXRlOmouaGFzRWFnZXJTdGF0ZSxlYWdlclN0YXRlOmouZWFnZXJTdGF0ZSxuZXh0Om51bGx9O251bGw9PT1DPyh4PUM9Qix3PWEpOkM9Qy5uZXh0PUIsc3MubGFuZXN8PUwsenN8PUx9aj1qLm5leHR9d2hpbGUobnVsbCE9PWomJmohPT1fKTtudWxsPT09Qz93PWE6Qy5uZXh0PXgsRHIoYSxvLm1lbW9pemVkU3RhdGUpfHwoYnM9ITApLG8ubWVtb2l6ZWRTdGF0ZT1hLG8uYmFzZVN0YXRlPXcsby5iYXNlUXVldWU9QyxpLmxhc3RSZW5kZXJlZFN0YXRlPWF9aWYobnVsbCE9PShzPWkuaW50ZXJsZWF2ZWQpKXt1PXM7ZG97Xz11LmxhbmUsc3MubGFuZXN8PV8senN8PV8sdT11Lm5leHR9d2hpbGUodSE9PXMpfWVsc2UgbnVsbD09PXUmJihpLmxhbmVzPTApO3JldHVybltvLm1lbW9pemVkU3RhdGUsaS5kaXNwYXRjaF19ZnVuY3Rpb24gWGgocyl7dmFyIG89VWgoKSxpPW8ucXVldWU7aWYobnVsbD09PWkpdGhyb3cgRXJyb3IocCgzMTEpKTtpLmxhc3RSZW5kZXJlZFJlZHVjZXI9czt2YXIgYT1pLmRpc3BhdGNoLHU9aS5wZW5kaW5nLF89by5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT11KXtpLnBlbmRpbmc9bnVsbDt2YXIgdz11PXUubmV4dDtkb3tfPXMoXyx3LmFjdGlvbiksdz13Lm5leHR9d2hpbGUodyE9PXUpO0RyKF8sby5tZW1vaXplZFN0YXRlKXx8KGJzPSEwKSxvLm1lbW9pemVkU3RhdGU9XyxudWxsPT09by5iYXNlUXVldWUmJihvLmJhc2VTdGF0ZT1fKSxpLmxhc3RSZW5kZXJlZFN0YXRlPV99cmV0dXJuW18sYV19ZnVuY3Rpb24gWWgoKXt9ZnVuY3Rpb24gWmgocyxvKXt2YXIgaT1zcyxhPVVoKCksdT1vKCksXz0hRHIoYS5tZW1vaXplZFN0YXRlLHUpO2lmKF8mJihhLm1lbW9pemVkU3RhdGU9dSxicz0hMCksYT1hLnF1ZXVlLCRoKGFpLmJpbmQobnVsbCxpLGEscyksW3NdKSxhLmdldFNuYXBzaG90IT09b3x8X3x8bnVsbCE9PWFzJiYxJmFzLm1lbW9pemVkU3RhdGUudGFnKXtpZihpLmZsYWdzfD0yMDQ4LGJpKDksY2kuYmluZChudWxsLGksYSx1LG8pLHZvaWQgMCxudWxsKSxudWxsPT09THMpdGhyb3cgRXJyb3IocCgzNDkpKTszMCZuc3x8ZGkoaSxvLHUpfXJldHVybiB1fWZ1bmN0aW9uIGRpKHMsbyxpKXtzLmZsYWdzfD0xNjM4NCxzPXtnZXRTbmFwc2hvdDpvLHZhbHVlOml9LG51bGw9PT0obz1zcy51cGRhdGVRdWV1ZSk/KG89e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0sc3MudXBkYXRlUXVldWU9byxvLnN0b3Jlcz1bc10pOm51bGw9PT0oaT1vLnN0b3Jlcyk/by5zdG9yZXM9W3NdOmkucHVzaChzKX1mdW5jdGlvbiBjaShzLG8saSxhKXtvLnZhbHVlPWksby5nZXRTbmFwc2hvdD1hLGVpKG8pJiZmaShzKX1mdW5jdGlvbiBhaShzLG8saSl7cmV0dXJuIGkoKGZ1bmN0aW9uKCl7ZWkobykmJmZpKHMpfSkpfWZ1bmN0aW9uIGVpKHMpe3ZhciBvPXMuZ2V0U25hcHNob3Q7cz1zLnZhbHVlO3RyeXt2YXIgaT1vKCk7cmV0dXJuIURyKHMsaSl9Y2F0Y2gocyl7cmV0dXJuITB9fWZ1bmN0aW9uIGZpKHMpe3ZhciBvPWloKHMsMSk7bnVsbCE9PW8mJmdpKG8scywxLC0xKX1mdW5jdGlvbiBoaShzKXt2YXIgbz1UaCgpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBzJiYocz1zKCkpLG8ubWVtb2l6ZWRTdGF0ZT1vLmJhc2VTdGF0ZT1zLHM9e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjAsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOlZoLGxhc3RSZW5kZXJlZFN0YXRlOnN9LG8ucXVldWU9cyxzPXMuZGlzcGF0Y2g9aWkuYmluZChudWxsLHNzLHMpLFtvLm1lbW9pemVkU3RhdGUsc119ZnVuY3Rpb24gYmkocyxvLGksYSl7cmV0dXJuIHM9e3RhZzpzLGNyZWF0ZTpvLGRlc3Ryb3k6aSxkZXBzOmEsbmV4dDpudWxsfSxudWxsPT09KG89c3MudXBkYXRlUXVldWUpPyhvPXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LHNzLnVwZGF0ZVF1ZXVlPW8sby5sYXN0RWZmZWN0PXMubmV4dD1zKTpudWxsPT09KGk9by5sYXN0RWZmZWN0KT9vLmxhc3RFZmZlY3Q9cy5uZXh0PXM6KGE9aS5uZXh0LGkubmV4dD1zLHMubmV4dD1hLG8ubGFzdEVmZmVjdD1zKSxzfWZ1bmN0aW9uIGppKCl7cmV0dXJuIFVoKCkubWVtb2l6ZWRTdGF0ZX1mdW5jdGlvbiBraShzLG8saSxhKXt2YXIgdT1UaCgpO3NzLmZsYWdzfD1zLHUubWVtb2l6ZWRTdGF0ZT1iaSgxfG8saSx2b2lkIDAsdm9pZCAwPT09YT9udWxsOmEpfWZ1bmN0aW9uIGxpKHMsbyxpLGEpe3ZhciB1PVVoKCk7YT12b2lkIDA9PT1hP251bGw6YTt2YXIgXz12b2lkIDA7aWYobnVsbCE9PW9zKXt2YXIgdz1vcy5tZW1vaXplZFN0YXRlO2lmKF89dy5kZXN0cm95LG51bGwhPT1hJiZNaChhLHcuZGVwcykpcmV0dXJuIHZvaWQodS5tZW1vaXplZFN0YXRlPWJpKG8saSxfLGEpKX1zcy5mbGFnc3w9cyx1Lm1lbW9pemVkU3RhdGU9YmkoMXxvLGksXyxhKX1mdW5jdGlvbiBtaShzLG8pe3JldHVybiBraSg4MzkwNjU2LDgscyxvKX1mdW5jdGlvbiAkaChzLG8pe3JldHVybiBsaSgyMDQ4LDgscyxvKX1mdW5jdGlvbiBuaShzLG8pe3JldHVybiBsaSg0LDIscyxvKX1mdW5jdGlvbiBvaShzLG8pe3JldHVybiBsaSg0LDQscyxvKX1mdW5jdGlvbiBwaShzLG8pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBvPyhzPXMoKSxvKHMpLGZ1bmN0aW9uKCl7byhudWxsKX0pOm51bGwhPW8/KHM9cygpLG8uY3VycmVudD1zLGZ1bmN0aW9uKCl7by5jdXJyZW50PW51bGx9KTp2b2lkIDB9ZnVuY3Rpb24gcWkocyxvLGkpe3JldHVybiBpPW51bGwhPWk/aS5jb25jYXQoW3NdKTpudWxsLGxpKDQsNCxwaS5iaW5kKG51bGwsbyxzKSxpKX1mdW5jdGlvbiByaSgpe31mdW5jdGlvbiBzaShzLG8pe3ZhciBpPVVoKCk7bz12b2lkIDA9PT1vP251bGw6bzt2YXIgYT1pLm1lbW9pemVkU3RhdGU7cmV0dXJuIG51bGwhPT1hJiZudWxsIT09byYmTWgobyxhWzFdKT9hWzBdOihpLm1lbW9pemVkU3RhdGU9W3Msb10scyl9ZnVuY3Rpb24gdGkocyxvKXt2YXIgaT1VaCgpO289dm9pZCAwPT09bz9udWxsOm87dmFyIGE9aS5tZW1vaXplZFN0YXRlO3JldHVybiBudWxsIT09YSYmbnVsbCE9PW8mJk1oKG8sYVsxXSk/YVswXToocz1zKCksaS5tZW1vaXplZFN0YXRlPVtzLG9dLHMpfWZ1bmN0aW9uIHVpKHMsbyxpKXtyZXR1cm4gMjEmbnM/KERyKGksbyl8fChpPXljKCksc3MubGFuZXN8PWksenN8PWkscy5iYXNlU3RhdGU9ITApLG8pOihzLmJhc2VTdGF0ZSYmKHMuYmFzZVN0YXRlPSExLGJzPSEwKSxzLm1lbW9pemVkU3RhdGU9aSl9ZnVuY3Rpb24gdmkocyxvKXt2YXIgaT1BdDtBdD0wIT09aSYmND5pP2k6NCxzKCEwKTt2YXIgYT1ycy50cmFuc2l0aW9uO3JzLnRyYW5zaXRpb249e307dHJ5e3MoITEpLG8oKX1maW5hbGx5e0F0PWkscnMudHJhbnNpdGlvbj1hfX1mdW5jdGlvbiB3aSgpe3JldHVybiBVaCgpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24geGkocyxvLGkpe3ZhciBhPXlpKHMpO2lmKGk9e2xhbmU6YSxhY3Rpb246aSxoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LHppKHMpKUFpKG8saSk7ZWxzZSBpZihudWxsIT09KGk9aGgocyxvLGksYSkpKXtnaShpLHMsYSxSKCkpLEJpKGksbyxhKX19ZnVuY3Rpb24gaWkocyxvLGkpe3ZhciBhPXlpKHMpLHU9e2xhbmU6YSxhY3Rpb246aSxoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKHppKHMpKUFpKG8sdSk7ZWxzZXt2YXIgXz1zLmFsdGVybmF0ZTtpZigwPT09cy5sYW5lcyYmKG51bGw9PT1ffHwwPT09Xy5sYW5lcykmJm51bGwhPT0oXz1vLmxhc3RSZW5kZXJlZFJlZHVjZXIpKXRyeXt2YXIgdz1vLmxhc3RSZW5kZXJlZFN0YXRlLHg9Xyh3LGkpO2lmKHUuaGFzRWFnZXJTdGF0ZT0hMCx1LmVhZ2VyU3RhdGU9eCxEcih4LHcpKXt2YXIgQz1vLmludGVybGVhdmVkO3JldHVybiBudWxsPT09Qz8odS5uZXh0PXUsZ2gobykpOih1Lm5leHQ9Qy5uZXh0LEMubmV4dD11KSx2b2lkKG8uaW50ZXJsZWF2ZWQ9dSl9fWNhdGNoKHMpe31udWxsIT09KGk9aGgocyxvLHUsYSkpJiYoZ2koaSxzLGEsdT1SKCkpLEJpKGksbyxhKSl9fWZ1bmN0aW9uIHppKHMpe3ZhciBvPXMuYWx0ZXJuYXRlO3JldHVybiBzPT09c3N8fG51bGwhPT1vJiZvPT09c3N9ZnVuY3Rpb24gQWkocyxvKXtscz1jcz0hMDt2YXIgaT1zLnBlbmRpbmc7bnVsbD09PWk/by5uZXh0PW86KG8ubmV4dD1pLm5leHQsaS5uZXh0PW8pLHMucGVuZGluZz1vfWZ1bmN0aW9uIEJpKHMsbyxpKXtpZig0MTk0MjQwJmkpe3ZhciBhPW8ubGFuZXM7aXw9YSY9cy5wZW5kaW5nTGFuZXMsby5sYW5lcz1pLENjKHMsaSl9fXZhciBocz17cmVhZENvbnRleHQ6ZWgsdXNlQ2FsbGJhY2s6UCx1c2VDb250ZXh0OlAsdXNlRWZmZWN0OlAsdXNlSW1wZXJhdGl2ZUhhbmRsZTpQLHVzZUluc2VydGlvbkVmZmVjdDpQLHVzZUxheW91dEVmZmVjdDpQLHVzZU1lbW86UCx1c2VSZWR1Y2VyOlAsdXNlUmVmOlAsdXNlU3RhdGU6UCx1c2VEZWJ1Z1ZhbHVlOlAsdXNlRGVmZXJyZWRWYWx1ZTpQLHVzZVRyYW5zaXRpb246UCx1c2VNdXRhYmxlU291cmNlOlAsdXNlU3luY0V4dGVybmFsU3RvcmU6UCx1c2VJZDpQLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sZHM9e3JlYWRDb250ZXh0OmVoLHVzZUNhbGxiYWNrOmZ1bmN0aW9uKHMsbyl7cmV0dXJuIFRoKCkubWVtb2l6ZWRTdGF0ZT1bcyx2b2lkIDA9PT1vP251bGw6b10sc30sdXNlQ29udGV4dDplaCx1c2VFZmZlY3Q6bWksdXNlSW1wZXJhdGl2ZUhhbmRsZTpmdW5jdGlvbihzLG8saSl7cmV0dXJuIGk9bnVsbCE9aT9pLmNvbmNhdChbc10pOm51bGwsa2koNDE5NDMwOCw0LHBpLmJpbmQobnVsbCxvLHMpLGkpfSx1c2VMYXlvdXRFZmZlY3Q6ZnVuY3Rpb24ocyxvKXtyZXR1cm4ga2koNDE5NDMwOCw0LHMsbyl9LHVzZUluc2VydGlvbkVmZmVjdDpmdW5jdGlvbihzLG8pe3JldHVybiBraSg0LDIscyxvKX0sdXNlTWVtbzpmdW5jdGlvbihzLG8pe3ZhciBpPVRoKCk7cmV0dXJuIG89dm9pZCAwPT09bz9udWxsOm8scz1zKCksaS5tZW1vaXplZFN0YXRlPVtzLG9dLHN9LHVzZVJlZHVjZXI6ZnVuY3Rpb24ocyxvLGkpe3ZhciBhPVRoKCk7cmV0dXJuIG89dm9pZCAwIT09aT9pKG8pOm8sYS5tZW1vaXplZFN0YXRlPWEuYmFzZVN0YXRlPW8scz17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6cyxsYXN0UmVuZGVyZWRTdGF0ZTpvfSxhLnF1ZXVlPXMscz1zLmRpc3BhdGNoPXhpLmJpbmQobnVsbCxzcyxzKSxbYS5tZW1vaXplZFN0YXRlLHNdfSx1c2VSZWY6ZnVuY3Rpb24ocyl7cmV0dXJuIHM9e2N1cnJlbnQ6c30sVGgoKS5tZW1vaXplZFN0YXRlPXN9LHVzZVN0YXRlOmhpLHVzZURlYnVnVmFsdWU6cmksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihzKXtyZXR1cm4gVGgoKS5tZW1vaXplZFN0YXRlPXN9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgcz1oaSghMSksbz1zWzBdO3JldHVybiBzPXZpLmJpbmQobnVsbCxzWzFdKSxUaCgpLm1lbW9pemVkU3RhdGU9cyxbbyxzXX0sdXNlTXV0YWJsZVNvdXJjZTpmdW5jdGlvbigpe30sdXNlU3luY0V4dGVybmFsU3RvcmU6ZnVuY3Rpb24ocyxvLGkpe3ZhciBhPXNzLHU9VGgoKTtpZihGbil7aWYodm9pZCAwPT09aSl0aHJvdyBFcnJvcihwKDQwNykpO2k9aSgpfWVsc2V7aWYoaT1vKCksbnVsbD09PUxzKXRocm93IEVycm9yKHAoMzQ5KSk7MzAmbnN8fGRpKGEsbyxpKX11Lm1lbW9pemVkU3RhdGU9aTt2YXIgXz17dmFsdWU6aSxnZXRTbmFwc2hvdDpvfTtyZXR1cm4gdS5xdWV1ZT1fLG1pKGFpLmJpbmQobnVsbCxhLF8scyksW3NdKSxhLmZsYWdzfD0yMDQ4LGJpKDksY2kuYmluZChudWxsLGEsXyxpLG8pLHZvaWQgMCxudWxsKSxpfSx1c2VJZDpmdW5jdGlvbigpe3ZhciBzPVRoKCksbz1Mcy5pZGVudGlmaWVyUHJlZml4O2lmKEZuKXt2YXIgaT1SbjtvPSI6IitvKyJSIisoaT0oTW4mfigxPDwzMi1FdChNbiktMSkpLnRvU3RyaW5nKDMyKStpKSwwPChpPXVzKyspJiYobys9IkgiK2kudG9TdHJpbmcoMzIpKSxvKz0iOiJ9ZWxzZSBvPSI6IitvKyJyIisoaT1wcysrKS50b1N0cmluZygzMikrIjoiO3JldHVybiBzLm1lbW9pemVkU3RhdGU9b30sdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxmcz17cmVhZENvbnRleHQ6ZWgsdXNlQ2FsbGJhY2s6c2ksdXNlQ29udGV4dDplaCx1c2VFZmZlY3Q6JGgsdXNlSW1wZXJhdGl2ZUhhbmRsZTpxaSx1c2VJbnNlcnRpb25FZmZlY3Q6bmksdXNlTGF5b3V0RWZmZWN0Om9pLHVzZU1lbW86dGksdXNlUmVkdWNlcjpXaCx1c2VSZWY6amksdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gV2goVmgpfSx1c2VEZWJ1Z1ZhbHVlOnJpLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24ocyl7cmV0dXJuIHVpKFVoKCksb3MubWVtb2l6ZWRTdGF0ZSxzKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3JldHVybltXaChWaClbMF0sVWgoKS5tZW1vaXplZFN0YXRlXX0sdXNlTXV0YWJsZVNvdXJjZTpZaCx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpaaCx1c2VJZDp3aSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LG1zPXtyZWFkQ29udGV4dDplaCx1c2VDYWxsYmFjazpzaSx1c2VDb250ZXh0OmVoLHVzZUVmZmVjdDokaCx1c2VJbXBlcmF0aXZlSGFuZGxlOnFpLHVzZUluc2VydGlvbkVmZmVjdDpuaSx1c2VMYXlvdXRFZmZlY3Q6b2ksdXNlTWVtbzp0aSx1c2VSZWR1Y2VyOlhoLHVzZVJlZjpqaSx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBYaChWaCl9LHVzZURlYnVnVmFsdWU6cmksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihzKXt2YXIgbz1VaCgpO3JldHVybiBudWxsPT09b3M/by5tZW1vaXplZFN0YXRlPXM6dWkobyxvcy5tZW1vaXplZFN0YXRlLHMpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW1hoKFZoKVswXSxVaCgpLm1lbW9pemVkU3RhdGVdfSx1c2VNdXRhYmxlU291cmNlOlloLHVzZVN5bmNFeHRlcm5hbFN0b3JlOlpoLHVzZUlkOndpLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gQ2kocyxvKXtpZihzJiZzLmRlZmF1bHRQcm9wcyl7Zm9yKHZhciBpIGluIG89d2Uoe30sbykscz1zLmRlZmF1bHRQcm9wcyl2b2lkIDA9PT1vW2ldJiYob1tpXT1zW2ldKTtyZXR1cm4gb31yZXR1cm4gb31mdW5jdGlvbiBEaShzLG8saSxhKXtpPW51bGw9PShpPWkoYSxvPXMubWVtb2l6ZWRTdGF0ZSkpP286d2Uoe30sbyxpKSxzLm1lbW9pemVkU3RhdGU9aSwwPT09cy5sYW5lcyYmKHMudXBkYXRlUXVldWUuYmFzZVN0YXRlPWkpfXZhciBncz17aXNNb3VudGVkOmZ1bmN0aW9uKHMpe3JldHVybiEhKHM9cy5fcmVhY3RJbnRlcm5hbHMpJiZWYihzKT09PXN9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihzLG8saSl7cz1zLl9yZWFjdEludGVybmFsczt2YXIgYT1SKCksdT15aShzKSxfPW1oKGEsdSk7Xy5wYXlsb2FkPW8sbnVsbCE9aSYmKF8uY2FsbGJhY2s9aSksbnVsbCE9PShvPW5oKHMsXyx1KSkmJihnaShvLHMsdSxhKSxvaChvLHMsdSkpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKHMsbyxpKXtzPXMuX3JlYWN0SW50ZXJuYWxzO3ZhciBhPVIoKSx1PXlpKHMpLF89bWgoYSx1KTtfLnRhZz0xLF8ucGF5bG9hZD1vLG51bGwhPWkmJihfLmNhbGxiYWNrPWkpLG51bGwhPT0obz1uaChzLF8sdSkpJiYoZ2kobyxzLHUsYSksb2gobyxzLHUpKX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKHMsbyl7cz1zLl9yZWFjdEludGVybmFsczt2YXIgaT1SKCksYT15aShzKSx1PW1oKGksYSk7dS50YWc9MixudWxsIT1vJiYodS5jYWxsYmFjaz1vKSxudWxsIT09KG89bmgocyx1LGEpKSYmKGdpKG8scyxhLGkpLG9oKG8scyxhKSl9fTtmdW5jdGlvbiBGaShzLG8saSxhLHUsXyx3KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Yocz1zLnN0YXRlTm9kZSkuc2hvdWxkQ29tcG9uZW50VXBkYXRlP3Muc2hvdWxkQ29tcG9uZW50VXBkYXRlKGEsXyx3KTohby5wcm90b3R5cGV8fCFvLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudHx8KCFJZShpLGEpfHwhSWUodSxfKSl9ZnVuY3Rpb24gR2kocyxvLGkpe3ZhciBhPSExLHU9U24sXz1vLmNvbnRleHRUeXBlO3JldHVybiJvYmplY3QiPT10eXBlb2YgXyYmbnVsbCE9PV8/Xz1laChfKToodT1aZihvKT93bjpfbi5jdXJyZW50LF89KGE9bnVsbCE9KGE9by5jb250ZXh0VHlwZXMpKT9ZZihzLHUpOlNuKSxvPW5ldyBvKGksXykscy5tZW1vaXplZFN0YXRlPW51bGwhPT1vLnN0YXRlJiZ2b2lkIDAhPT1vLnN0YXRlP28uc3RhdGU6bnVsbCxvLnVwZGF0ZXI9Z3Mscy5zdGF0ZU5vZGU9byxvLl9yZWFjdEludGVybmFscz1zLGEmJigocz1zLnN0YXRlTm9kZSkuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD11LHMuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9Xyksb31mdW5jdGlvbiBIaShzLG8saSxhKXtzPW8uc3RhdGUsImZ1bmN0aW9uIj09dHlwZW9mIG8uY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmby5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGksYSksImZ1bmN0aW9uIj09dHlwZW9mIG8uVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJm8uVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoaSxhKSxvLnN0YXRlIT09cyYmZ3MuZW5xdWV1ZVJlcGxhY2VTdGF0ZShvLG8uc3RhdGUsbnVsbCl9ZnVuY3Rpb24gSWkocyxvLGksYSl7dmFyIHU9cy5zdGF0ZU5vZGU7dS5wcm9wcz1pLHUuc3RhdGU9cy5tZW1vaXplZFN0YXRlLHUucmVmcz17fSxraChzKTt2YXIgXz1vLmNvbnRleHRUeXBlOyJvYmplY3QiPT10eXBlb2YgXyYmbnVsbCE9PV8/dS5jb250ZXh0PWVoKF8pOihfPVpmKG8pP3duOl9uLmN1cnJlbnQsdS5jb250ZXh0PVlmKHMsXykpLHUuc3RhdGU9cy5tZW1vaXplZFN0YXRlLCJmdW5jdGlvbiI9PXR5cGVvZihfPW8uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKSYmKERpKHMsbyxfLGkpLHUuc3RhdGU9cy5tZW1vaXplZFN0YXRlKSwiZnVuY3Rpb24iPT10eXBlb2Ygby5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHN8fCJmdW5jdGlvbiI9PXR5cGVvZiB1LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHwiZnVuY3Rpb24iIT10eXBlb2YgdS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiYiZnVuY3Rpb24iIT10eXBlb2YgdS5jb21wb25lbnRXaWxsTW91bnR8fChvPXUuc3RhdGUsImZ1bmN0aW9uIj09dHlwZW9mIHUuY29tcG9uZW50V2lsbE1vdW50JiZ1LmNvbXBvbmVudFdpbGxNb3VudCgpLCJmdW5jdGlvbiI9PXR5cGVvZiB1LlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJnUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpLG8hPT11LnN0YXRlJiZncy5lbnF1ZXVlUmVwbGFjZVN0YXRlKHUsdS5zdGF0ZSxudWxsKSxxaChzLGksdSxhKSx1LnN0YXRlPXMubWVtb2l6ZWRTdGF0ZSksImZ1bmN0aW9uIj09dHlwZW9mIHUuY29tcG9uZW50RGlkTW91bnQmJihzLmZsYWdzfD00MTk0MzA4KX1mdW5jdGlvbiBKaShzLG8pe3RyeXt2YXIgaT0iIixhPW87ZG97aSs9UGEoYSksYT1hLnJldHVybn13aGlsZShhKTt2YXIgdT1pfWNhdGNoKHMpe3U9IlxuRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogIitzLm1lc3NhZ2UrIlxuIitzLnN0YWNrfXJldHVybnt2YWx1ZTpzLHNvdXJjZTpvLHN0YWNrOnUsZGlnZXN0Om51bGx9fWZ1bmN0aW9uIEtpKHMsbyxpKXtyZXR1cm57dmFsdWU6cyxzb3VyY2U6bnVsbCxzdGFjazpudWxsIT1pP2k6bnVsbCxkaWdlc3Q6bnVsbCE9bz9vOm51bGx9fWZ1bmN0aW9uIExpKHMsbyl7dHJ5e2NvbnNvbGUuZXJyb3Ioby52YWx1ZSl9Y2F0Y2gocyl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0aHJvdyBzfSkpfX12YXIgeXM9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtNYXA/V2Vha01hcDpNYXA7ZnVuY3Rpb24gTmkocyxvLGkpeyhpPW1oKC0xLGkpKS50YWc9MyxpLnBheWxvYWQ9e2VsZW1lbnQ6bnVsbH07dmFyIGE9by52YWx1ZTtyZXR1cm4gaS5jYWxsYmFjaz1mdW5jdGlvbigpe1FzfHwoUXM9ITAsWnM9YSksTGkoMCxvKX0saX1mdW5jdGlvbiBRaShzLG8saSl7KGk9bWgoLTEsaSkpLnRhZz0zO3ZhciBhPXMudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpe3ZhciB1PW8udmFsdWU7aS5wYXlsb2FkPWZ1bmN0aW9uKCl7cmV0dXJuIGEodSl9LGkuY2FsbGJhY2s9ZnVuY3Rpb24oKXtMaSgwLG8pfX12YXIgXz1zLnN0YXRlTm9kZTtyZXR1cm4gbnVsbCE9PV8mJiJmdW5jdGlvbiI9PXR5cGVvZiBfLmNvbXBvbmVudERpZENhdGNoJiYoaS5jYWxsYmFjaz1mdW5jdGlvbigpe0xpKDAsbyksImZ1bmN0aW9uIiE9dHlwZW9mIGEmJihudWxsPT09ZW8/ZW89bmV3IFNldChbdGhpc10pOmVvLmFkZCh0aGlzKSk7dmFyIHM9by5zdGFjazt0aGlzLmNvbXBvbmVudERpZENhdGNoKG8udmFsdWUse2NvbXBvbmVudFN0YWNrOm51bGwhPT1zP3M6IiJ9KX0pLGl9ZnVuY3Rpb24gU2kocyxvLGkpe3ZhciBhPXMucGluZ0NhY2hlO2lmKG51bGw9PT1hKXthPXMucGluZ0NhY2hlPW5ldyB5czt2YXIgdT1uZXcgU2V0O2Euc2V0KG8sdSl9ZWxzZSB2b2lkIDA9PT0odT1hLmdldChvKSkmJih1PW5ldyBTZXQsYS5zZXQobyx1KSk7dS5oYXMoaSl8fCh1LmFkZChpKSxzPVRpLmJpbmQobnVsbCxzLG8saSksby50aGVuKHMscykpfWZ1bmN0aW9uIFVpKHMpe2Rve3ZhciBvO2lmKChvPTEzPT09cy50YWcpJiYobz1udWxsPT09KG89cy5tZW1vaXplZFN0YXRlKXx8bnVsbCE9PW8uZGVoeWRyYXRlZCksbylyZXR1cm4gcztzPXMucmV0dXJufXdoaWxlKG51bGwhPT1zKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBWaShzLG8saSxhLHUpe3JldHVybiAxJnMubW9kZT8ocy5mbGFnc3w9NjU1MzYscy5sYW5lcz11LHMpOihzPT09bz9zLmZsYWdzfD02NTUzNjoocy5mbGFnc3w9MTI4LGkuZmxhZ3N8PTEzMTA3MixpLmZsYWdzJj0tNTI4MDUsMT09PWkudGFnJiYobnVsbD09PWkuYWx0ZXJuYXRlP2kudGFnPTE3Oigobz1taCgtMSwxKSkudGFnPTIsbmgoaSxvLDEpKSksaS5sYW5lc3w9MSkscyl9dmFyIHZzPVYuUmVhY3RDdXJyZW50T3duZXIsYnM9ITE7ZnVuY3Rpb24gWGkocyxvLGksYSl7by5jaGlsZD1udWxsPT09cz9VbihvLG51bGwsaSxhKTpxbihvLHMuY2hpbGQsaSxhKX1mdW5jdGlvbiBZaShzLG8saSxhLHUpe2k9aS5yZW5kZXI7dmFyIF89by5yZWY7cmV0dXJuIGNoKG8sdSksYT1OaChzLG8saSxhLF8sdSksaT1TaCgpLG51bGw9PT1zfHxicz8oRm4mJmkmJnZnKG8pLG8uZmxhZ3N8PTEsWGkocyxvLGEsdSksby5jaGlsZCk6KG8udXBkYXRlUXVldWU9cy51cGRhdGVRdWV1ZSxvLmZsYWdzJj0tMjA1MyxzLmxhbmVzJj1+dSxaaShzLG8sdSkpfWZ1bmN0aW9uICRpKHMsbyxpLGEsdSl7aWYobnVsbD09PXMpe3ZhciBfPWkudHlwZTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgX3x8YWooXyl8fHZvaWQgMCE9PV8uZGVmYXVsdFByb3BzfHxudWxsIT09aS5jb21wYXJlfHx2b2lkIDAhPT1pLmRlZmF1bHRQcm9wcz8oKHM9UmcoaS50eXBlLG51bGwsYSxvLG8ubW9kZSx1KSkucmVmPW8ucmVmLHMucmV0dXJuPW8sby5jaGlsZD1zKTooby50YWc9MTUsby50eXBlPV8sYmoocyxvLF8sYSx1KSl9aWYoXz1zLmNoaWxkLCEocy5sYW5lcyZ1KSl7dmFyIHc9Xy5tZW1vaXplZFByb3BzO2lmKChpPW51bGwhPT0oaT1pLmNvbXBhcmUpP2k6SWUpKHcsYSkmJnMucmVmPT09by5yZWYpcmV0dXJuIFppKHMsbyx1KX1yZXR1cm4gby5mbGFnc3w9MSwocz1QZyhfLGEpKS5yZWY9by5yZWYscy5yZXR1cm49byxvLmNoaWxkPXN9ZnVuY3Rpb24gYmoocyxvLGksYSx1KXtpZihudWxsIT09cyl7dmFyIF89cy5tZW1vaXplZFByb3BzO2lmKEllKF8sYSkmJnMucmVmPT09by5yZWYpe2lmKGJzPSExLG8ucGVuZGluZ1Byb3BzPWE9XywhKHMubGFuZXMmdSkpcmV0dXJuIG8ubGFuZXM9cy5sYW5lcyxaaShzLG8sdSk7MTMxMDcyJnMuZmxhZ3MmJihicz0hMCl9fXJldHVybiBjaihzLG8saSxhLHUpfWZ1bmN0aW9uIGRqKHMsbyxpKXt2YXIgYT1vLnBlbmRpbmdQcm9wcyx1PWEuY2hpbGRyZW4sXz1udWxsIT09cz9zLm1lbW9pemVkU3RhdGU6bnVsbDtpZigiaGlkZGVuIj09PWEubW9kZSlpZigxJm8ubW9kZSl7aWYoISgxMDczNzQxODI0JmkpKXJldHVybiBzPW51bGwhPT1fP18uYmFzZUxhbmVzfGk6aSxvLmxhbmVzPW8uY2hpbGRMYW5lcz0xMDczNzQxODI0LG8ubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOnMsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH0sby51cGRhdGVRdWV1ZT1udWxsLEcocXMsJHMpLCRzfD1zLG51bGw7by5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxhPW51bGwhPT1fP18uYmFzZUxhbmVzOmksRyhxcywkcyksJHN8PWF9ZWxzZSBvLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LEcocXMsJHMpLCRzfD1pO2Vsc2UgbnVsbCE9PV8/KGE9Xy5iYXNlTGFuZXN8aSxvLm1lbW9pemVkU3RhdGU9bnVsbCk6YT1pLEcocXMsJHMpLCRzfD1hO3JldHVybiBYaShzLG8sdSxpKSxvLmNoaWxkfWZ1bmN0aW9uIGdqKHMsbyl7dmFyIGk9by5yZWY7KG51bGw9PT1zJiZudWxsIT09aXx8bnVsbCE9PXMmJnMucmVmIT09aSkmJihvLmZsYWdzfD01MTIsby5mbGFnc3w9MjA5NzE1Mil9ZnVuY3Rpb24gY2oocyxvLGksYSx1KXt2YXIgXz1aZihpKT93bjpfbi5jdXJyZW50O3JldHVybiBfPVlmKG8sXyksY2gobyx1KSxpPU5oKHMsbyxpLGEsXyx1KSxhPVNoKCksbnVsbD09PXN8fGJzPyhGbiYmYSYmdmcobyksby5mbGFnc3w9MSxYaShzLG8saSx1KSxvLmNoaWxkKTooby51cGRhdGVRdWV1ZT1zLnVwZGF0ZVF1ZXVlLG8uZmxhZ3MmPS0yMDUzLHMubGFuZXMmPX51LFppKHMsbyx1KSl9ZnVuY3Rpb24gaGoocyxvLGksYSx1KXtpZihaZihpKSl7dmFyIF89ITA7Y2cobyl9ZWxzZSBfPSExO2lmKGNoKG8sdSksbnVsbD09PW8uc3RhdGVOb2RlKWlqKHMsbyksR2kobyxpLGEpLElpKG8saSxhLHUpLGE9ITA7ZWxzZSBpZihudWxsPT09cyl7dmFyIHc9by5zdGF0ZU5vZGUseD1vLm1lbW9pemVkUHJvcHM7dy5wcm9wcz14O3ZhciBDPXcuY29udGV4dCxqPWkuY29udGV4dFR5cGU7Im9iamVjdCI9PXR5cGVvZiBqJiZudWxsIT09aj9qPWVoKGopOmo9WWYobyxqPVpmKGkpP3duOl9uLmN1cnJlbnQpO3ZhciBMPWkuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLEI9ImZ1bmN0aW9uIj09dHlwZW9mIEx8fCJmdW5jdGlvbiI9PXR5cGVvZiB3LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlO0J8fCJmdW5jdGlvbiIhPXR5cGVvZiB3LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiYiZnVuY3Rpb24iIT10eXBlb2Ygdy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzfHwoeCE9PWF8fEMhPT1qKSYmSGkobyx3LGEsaiksS249ITE7dmFyICQ9by5tZW1vaXplZFN0YXRlO3cuc3RhdGU9JCxxaChvLGEsdyx1KSxDPW8ubWVtb2l6ZWRTdGF0ZSx4IT09YXx8JCE9PUN8fEVuLmN1cnJlbnR8fEtuPygiZnVuY3Rpb24iPT10eXBlb2YgTCYmKERpKG8saSxMLGEpLEM9by5tZW1vaXplZFN0YXRlKSwoeD1Lbnx8RmkobyxpLHgsYSwkLEMsaikpPyhCfHwiZnVuY3Rpb24iIT10eXBlb2Ygdy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiYiZnVuY3Rpb24iIT10eXBlb2Ygdy5jb21wb25lbnRXaWxsTW91bnR8fCgiZnVuY3Rpb24iPT10eXBlb2Ygdy5jb21wb25lbnRXaWxsTW91bnQmJncuY29tcG9uZW50V2lsbE1vdW50KCksImZ1bmN0aW9uIj09dHlwZW9mIHcuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmdy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLCJmdW5jdGlvbiI9PXR5cGVvZiB3LmNvbXBvbmVudERpZE1vdW50JiYoby5mbGFnc3w9NDE5NDMwOCkpOigiZnVuY3Rpb24iPT10eXBlb2Ygdy5jb21wb25lbnREaWRNb3VudCYmKG8uZmxhZ3N8PTQxOTQzMDgpLG8ubWVtb2l6ZWRQcm9wcz1hLG8ubWVtb2l6ZWRTdGF0ZT1DKSx3LnByb3BzPWEsdy5zdGF0ZT1DLHcuY29udGV4dD1qLGE9eCk6KCJmdW5jdGlvbiI9PXR5cGVvZiB3LmNvbXBvbmVudERpZE1vdW50JiYoby5mbGFnc3w9NDE5NDMwOCksYT0hMSl9ZWxzZXt3PW8uc3RhdGVOb2RlLGxoKHMsbykseD1vLm1lbW9pemVkUHJvcHMsaj1vLnR5cGU9PT1vLmVsZW1lbnRUeXBlP3g6Q2koby50eXBlLHgpLHcucHJvcHM9aixCPW8ucGVuZGluZ1Byb3BzLCQ9dy5jb250ZXh0LCJvYmplY3QiPT10eXBlb2YoQz1pLmNvbnRleHRUeXBlKSYmbnVsbCE9PUM/Qz1laChDKTpDPVlmKG8sQz1aZihpKT93bjpfbi5jdXJyZW50KTt2YXIgVT1pLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczsoTD0iZnVuY3Rpb24iPT10eXBlb2YgVXx8ImZ1bmN0aW9uIj09dHlwZW9mIHcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUpfHwiZnVuY3Rpb24iIT10eXBlb2Ygdy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmImZ1bmN0aW9uIiE9dHlwZW9mIHcuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc3x8KHghPT1CfHwkIT09QykmJkhpKG8sdyxhLEMpLEtuPSExLCQ9by5tZW1vaXplZFN0YXRlLHcuc3RhdGU9JCxxaChvLGEsdyx1KTt2YXIgVj1vLm1lbW9pemVkU3RhdGU7eCE9PUJ8fCQhPT1WfHxFbi5jdXJyZW50fHxLbj8oImZ1bmN0aW9uIj09dHlwZW9mIFUmJihEaShvLGksVSxhKSxWPW8ubWVtb2l6ZWRTdGF0ZSksKGo9S258fEZpKG8saSxqLGEsJCxWLEMpfHwhMSk/KEx8fCJmdW5jdGlvbiIhPXR5cGVvZiB3LlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlJiYiZnVuY3Rpb24iIT10eXBlb2Ygdy5jb21wb25lbnRXaWxsVXBkYXRlfHwoImZ1bmN0aW9uIj09dHlwZW9mIHcuY29tcG9uZW50V2lsbFVwZGF0ZSYmdy5jb21wb25lbnRXaWxsVXBkYXRlKGEsVixDKSwiZnVuY3Rpb24iPT10eXBlb2Ygdy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmdy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShhLFYsQykpLCJmdW5jdGlvbiI9PXR5cGVvZiB3LmNvbXBvbmVudERpZFVwZGF0ZSYmKG8uZmxhZ3N8PTQpLCJmdW5jdGlvbiI9PXR5cGVvZiB3LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlJiYoby5mbGFnc3w9MTAyNCkpOigiZnVuY3Rpb24iIT10eXBlb2Ygdy5jb21wb25lbnREaWRVcGRhdGV8fHg9PT1zLm1lbW9pemVkUHJvcHMmJiQ9PT1zLm1lbW9pemVkU3RhdGV8fChvLmZsYWdzfD00KSwiZnVuY3Rpb24iIT10eXBlb2Ygdy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8eD09PXMubWVtb2l6ZWRQcm9wcyYmJD09PXMubWVtb2l6ZWRTdGF0ZXx8KG8uZmxhZ3N8PTEwMjQpLG8ubWVtb2l6ZWRQcm9wcz1hLG8ubWVtb2l6ZWRTdGF0ZT1WKSx3LnByb3BzPWEsdy5zdGF0ZT1WLHcuY29udGV4dD1DLGE9aik6KCJmdW5jdGlvbiIhPXR5cGVvZiB3LmNvbXBvbmVudERpZFVwZGF0ZXx8eD09PXMubWVtb2l6ZWRQcm9wcyYmJD09PXMubWVtb2l6ZWRTdGF0ZXx8KG8uZmxhZ3N8PTQpLCJmdW5jdGlvbiIhPXR5cGVvZiB3LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHx4PT09cy5tZW1vaXplZFByb3BzJiYkPT09cy5tZW1vaXplZFN0YXRlfHwoby5mbGFnc3w9MTAyNCksYT0hMSl9cmV0dXJuIGpqKHMsbyxpLGEsXyx1KX1mdW5jdGlvbiBqaihzLG8saSxhLHUsXyl7Z2oocyxvKTt2YXIgdz0hISgxMjgmby5mbGFncyk7aWYoIWEmJiF3KXJldHVybiB1JiZkZyhvLGksITEpLFppKHMsbyxfKTthPW8uc3RhdGVOb2RlLHZzLmN1cnJlbnQ9bzt2YXIgeD13JiYiZnVuY3Rpb24iIT10eXBlb2YgaS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I/bnVsbDphLnJlbmRlcigpO3JldHVybiBvLmZsYWdzfD0xLG51bGwhPT1zJiZ3PyhvLmNoaWxkPXFuKG8scy5jaGlsZCxudWxsLF8pLG8uY2hpbGQ9cW4obyxudWxsLHgsXykpOlhpKHMsbyx4LF8pLG8ubWVtb2l6ZWRTdGF0ZT1hLnN0YXRlLHUmJmRnKG8saSwhMCksby5jaGlsZH1mdW5jdGlvbiBraihzKXt2YXIgbz1zLnN0YXRlTm9kZTtvLnBlbmRpbmdDb250ZXh0P2FnKDAsby5wZW5kaW5nQ29udGV4dCxvLnBlbmRpbmdDb250ZXh0IT09by5jb250ZXh0KTpvLmNvbnRleHQmJmFnKDAsby5jb250ZXh0LCExKSx5aChzLG8uY29udGFpbmVySW5mbyl9ZnVuY3Rpb24gbGoocyxvLGksYSx1KXtyZXR1cm4gSWcoKSxKZyh1KSxvLmZsYWdzfD0yNTYsWGkocyxvLGksYSksby5jaGlsZH12YXIgU3MsX3MsRXMsd3M9e2RlaHlkcmF0ZWQ6bnVsbCx0cmVlQ29udGV4dDpudWxsLHJldHJ5TGFuZTowfTtmdW5jdGlvbiBuaihzKXtyZXR1cm57YmFzZUxhbmVzOnMsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH19ZnVuY3Rpb24gb2oocyxvLGkpe3ZhciBhLHU9by5wZW5kaW5nUHJvcHMsXz1abi5jdXJyZW50LHc9ITEseD0hISgxMjgmby5mbGFncyk7aWYoKGE9eCl8fChhPShudWxsPT09c3x8bnVsbCE9PXMubWVtb2l6ZWRTdGF0ZSkmJiEhKDImXykpLGE/KHc9ITAsby5mbGFncyY9LTEyOSk6bnVsbCE9PXMmJm51bGw9PT1zLm1lbW9pemVkU3RhdGV8fChffD0xKSxHKFpuLDEmXyksbnVsbD09PXMpcmV0dXJuIEVnKG8pLG51bGwhPT0ocz1vLm1lbW9pemVkU3RhdGUpJiZudWxsIT09KHM9cy5kZWh5ZHJhdGVkKT8oMSZvLm1vZGU/IiQhIj09PXMuZGF0YT9vLmxhbmVzPTg6by5sYW5lcz0xMDczNzQxODI0Om8ubGFuZXM9MSxudWxsKTooeD11LmNoaWxkcmVuLHM9dS5mYWxsYmFjayx3Pyh1PW8ubW9kZSx3PW8uY2hpbGQseD17bW9kZToiaGlkZGVuIixjaGlsZHJlbjp4fSwxJnV8fG51bGw9PT13P3c9cGooeCx1LDAsbnVsbCk6KHcuY2hpbGRMYW5lcz0wLHcucGVuZGluZ1Byb3BzPXgpLHM9VGcocyx1LGksbnVsbCksdy5yZXR1cm49byxzLnJldHVybj1vLHcuc2libGluZz1zLG8uY2hpbGQ9dyxvLmNoaWxkLm1lbW9pemVkU3RhdGU9bmooaSksby5tZW1vaXplZFN0YXRlPXdzLHMpOnFqKG8seCkpO2lmKG51bGwhPT0oXz1zLm1lbW9pemVkU3RhdGUpJiZudWxsIT09KGE9Xy5kZWh5ZHJhdGVkKSlyZXR1cm4gZnVuY3Rpb24gcmoocyxvLGksYSx1LF8sdyl7aWYoaSlyZXR1cm4gMjU2Jm8uZmxhZ3M/KG8uZmxhZ3MmPS0yNTcsc2oocyxvLHcsYT1LaShFcnJvcihwKDQyMikpKSkpOm51bGwhPT1vLm1lbW9pemVkU3RhdGU/KG8uY2hpbGQ9cy5jaGlsZCxvLmZsYWdzfD0xMjgsbnVsbCk6KF89YS5mYWxsYmFjayx1PW8ubW9kZSxhPXBqKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjphLmNoaWxkcmVufSx1LDAsbnVsbCksKF89VGcoXyx1LHcsbnVsbCkpLmZsYWdzfD0yLGEucmV0dXJuPW8sXy5yZXR1cm49byxhLnNpYmxpbmc9XyxvLmNoaWxkPWEsMSZvLm1vZGUmJnFuKG8scy5jaGlsZCxudWxsLHcpLG8uY2hpbGQubWVtb2l6ZWRTdGF0ZT1uaih3KSxvLm1lbW9pemVkU3RhdGU9d3MsXyk7aWYoISgxJm8ubW9kZSkpcmV0dXJuIHNqKHMsbyx3LG51bGwpO2lmKCIkISI9PT11LmRhdGEpe2lmKGE9dS5uZXh0U2libGluZyYmdS5uZXh0U2libGluZy5kYXRhc2V0KXZhciB4PWEuZGdzdDtyZXR1cm4gYT14LHNqKHMsbyx3LGE9S2koXz1FcnJvcihwKDQxOSkpLGEsdm9pZCAwKSl9aWYoeD0hISh3JnMuY2hpbGRMYW5lcyksYnN8fHgpe2lmKG51bGwhPT0oYT1Mcykpe3N3aXRjaCh3Ji13KXtjYXNlIDQ6dT0yO2JyZWFrO2Nhc2UgMTY6dT04O2JyZWFrO2Nhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDp1PTMyO2JyZWFrO2Nhc2UgNTM2ODcwOTEyOnU9MjY4NDM1NDU2O2JyZWFrO2RlZmF1bHQ6dT0wfTAhPT0odT11JihhLnN1c3BlbmRlZExhbmVzfHcpPzA6dSkmJnUhPT1fLnJldHJ5TGFuZSYmKF8ucmV0cnlMYW5lPXUsaWgocyx1KSxnaShhLHMsdSwtMSkpfXJldHVybiB0aigpLHNqKHMsbyx3LGE9S2koRXJyb3IocCg0MjEpKSkpfXJldHVybiIkPyI9PT11LmRhdGE/KG8uZmxhZ3N8PTEyOCxvLmNoaWxkPXMuY2hpbGQsbz11ai5iaW5kKG51bGwscyksdS5fcmVhY3RSZXRyeT1vLG51bGwpOihzPV8udHJlZUNvbnRleHQsTG49TGYodS5uZXh0U2libGluZyksRG49byxGbj0hMCxCbj1udWxsLG51bGwhPT1zJiYoSW5bVG4rK109TW4sSW5bVG4rK109Um4sSW5bVG4rK109Tm4sTW49cy5pZCxSbj1zLm92ZXJmbG93LE5uPW8pLG89cWoobyxhLmNoaWxkcmVuKSxvLmZsYWdzfD00MDk2LG8pfShzLG8seCx1LGEsXyxpKTtpZih3KXt3PXUuZmFsbGJhY2sseD1vLm1vZGUsYT0oXz1zLmNoaWxkKS5zaWJsaW5nO3ZhciBDPXttb2RlOiJoaWRkZW4iLGNoaWxkcmVuOnUuY2hpbGRyZW59O3JldHVybiAxJnh8fG8uY2hpbGQ9PT1fPyh1PVBnKF8sQykpLnN1YnRyZWVGbGFncz0xNDY4MDA2NCZfLnN1YnRyZWVGbGFnczooKHU9by5jaGlsZCkuY2hpbGRMYW5lcz0wLHUucGVuZGluZ1Byb3BzPUMsby5kZWxldGlvbnM9bnVsbCksbnVsbCE9PWE/dz1QZyhhLHcpOih3PVRnKHcseCxpLG51bGwpKS5mbGFnc3w9Mix3LnJldHVybj1vLHUucmV0dXJuPW8sdS5zaWJsaW5nPXcsby5jaGlsZD11LHU9dyx3PW8uY2hpbGQseD1udWxsPT09KHg9cy5jaGlsZC5tZW1vaXplZFN0YXRlKT9uaihpKTp7YmFzZUxhbmVzOnguYmFzZUxhbmVzfGksY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6eC50cmFuc2l0aW9uc30sdy5tZW1vaXplZFN0YXRlPXgsdy5jaGlsZExhbmVzPXMuY2hpbGRMYW5lcyZ+aSxvLm1lbW9pemVkU3RhdGU9d3MsdX1yZXR1cm4gcz0odz1zLmNoaWxkKS5zaWJsaW5nLHU9UGcodyx7bW9kZToidmlzaWJsZSIsY2hpbGRyZW46dS5jaGlsZHJlbn0pLCEoMSZvLm1vZGUpJiYodS5sYW5lcz1pKSx1LnJldHVybj1vLHUuc2libGluZz1udWxsLG51bGwhPT1zJiYobnVsbD09PShpPW8uZGVsZXRpb25zKT8oby5kZWxldGlvbnM9W3NdLG8uZmxhZ3N8PTE2KTppLnB1c2gocykpLG8uY2hpbGQ9dSxvLm1lbW9pemVkU3RhdGU9bnVsbCx1fWZ1bmN0aW9uIHFqKHMsbyl7cmV0dXJuKG89cGooe21vZGU6InZpc2libGUiLGNoaWxkcmVuOm99LHMubW9kZSwwLG51bGwpKS5yZXR1cm49cyxzLmNoaWxkPW99ZnVuY3Rpb24gc2oocyxvLGksYSl7cmV0dXJuIG51bGwhPT1hJiZKZyhhKSxxbihvLHMuY2hpbGQsbnVsbCxpKSwocz1xaihvLG8ucGVuZGluZ1Byb3BzLmNoaWxkcmVuKSkuZmxhZ3N8PTIsby5tZW1vaXplZFN0YXRlPW51bGwsc31mdW5jdGlvbiB2aihzLG8saSl7cy5sYW5lc3w9bzt2YXIgYT1zLmFsdGVybmF0ZTtudWxsIT09YSYmKGEubGFuZXN8PW8pLGJoKHMucmV0dXJuLG8saSl9ZnVuY3Rpb24gd2oocyxvLGksYSx1KXt2YXIgXz1zLm1lbW9pemVkU3RhdGU7bnVsbD09PV8/cy5tZW1vaXplZFN0YXRlPXtpc0JhY2t3YXJkczpvLHJlbmRlcmluZzpudWxsLHJlbmRlcmluZ1N0YXJ0VGltZTowLGxhc3Q6YSx0YWlsOmksdGFpbE1vZGU6dX06KF8uaXNCYWNrd2FyZHM9byxfLnJlbmRlcmluZz1udWxsLF8ucmVuZGVyaW5nU3RhcnRUaW1lPTAsXy5sYXN0PWEsXy50YWlsPWksXy50YWlsTW9kZT11KX1mdW5jdGlvbiB4aihzLG8saSl7dmFyIGE9by5wZW5kaW5nUHJvcHMsdT1hLnJldmVhbE9yZGVyLF89YS50YWlsO2lmKFhpKHMsbyxhLmNoaWxkcmVuLGkpLDImKGE9Wm4uY3VycmVudCkpYT0xJmF8MixvLmZsYWdzfD0xMjg7ZWxzZXtpZihudWxsIT09cyYmMTI4JnMuZmxhZ3MpZTpmb3Iocz1vLmNoaWxkO251bGwhPT1zOyl7aWYoMTM9PT1zLnRhZyludWxsIT09cy5tZW1vaXplZFN0YXRlJiZ2aihzLGksbyk7ZWxzZSBpZigxOT09PXMudGFnKXZqKHMsaSxvKTtlbHNlIGlmKG51bGwhPT1zLmNoaWxkKXtzLmNoaWxkLnJldHVybj1zLHM9cy5jaGlsZDtjb250aW51ZX1pZihzPT09bylicmVhayBlO2Zvcig7bnVsbD09PXMuc2libGluZzspe2lmKG51bGw9PT1zLnJldHVybnx8cy5yZXR1cm49PT1vKWJyZWFrIGU7cz1zLnJldHVybn1zLnNpYmxpbmcucmV0dXJuPXMucmV0dXJuLHM9cy5zaWJsaW5nfWEmPTF9aWYoRyhabixhKSwxJm8ubW9kZSlzd2l0Y2godSl7Y2FzZSJmb3J3YXJkcyI6Zm9yKGk9by5jaGlsZCx1PW51bGw7bnVsbCE9PWk7KW51bGwhPT0ocz1pLmFsdGVybmF0ZSkmJm51bGw9PT1DaChzKSYmKHU9aSksaT1pLnNpYmxpbmc7bnVsbD09PShpPXUpPyh1PW8uY2hpbGQsby5jaGlsZD1udWxsKToodT1pLnNpYmxpbmcsaS5zaWJsaW5nPW51bGwpLHdqKG8sITEsdSxpLF8pO2JyZWFrO2Nhc2UiYmFja3dhcmRzIjpmb3IoaT1udWxsLHU9by5jaGlsZCxvLmNoaWxkPW51bGw7bnVsbCE9PXU7KXtpZihudWxsIT09KHM9dS5hbHRlcm5hdGUpJiZudWxsPT09Q2gocykpe28uY2hpbGQ9dTticmVha31zPXUuc2libGluZyx1LnNpYmxpbmc9aSxpPXUsdT1zfXdqKG8sITAsaSxudWxsLF8pO2JyZWFrO2Nhc2UidG9nZXRoZXIiOndqKG8sITEsbnVsbCxudWxsLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDpvLm1lbW9pemVkU3RhdGU9bnVsbH1lbHNlIG8ubWVtb2l6ZWRTdGF0ZT1udWxsO3JldHVybiBvLmNoaWxkfWZ1bmN0aW9uIGlqKHMsbyl7ISgxJm8ubW9kZSkmJm51bGwhPT1zJiYocy5hbHRlcm5hdGU9bnVsbCxvLmFsdGVybmF0ZT1udWxsLG8uZmxhZ3N8PTIpfWZ1bmN0aW9uIFppKHMsbyxpKXtpZihudWxsIT09cyYmKG8uZGVwZW5kZW5jaWVzPXMuZGVwZW5kZW5jaWVzKSx6c3w9by5sYW5lcywhKGkmby5jaGlsZExhbmVzKSlyZXR1cm4gbnVsbDtpZihudWxsIT09cyYmby5jaGlsZCE9PXMuY2hpbGQpdGhyb3cgRXJyb3IocCgxNTMpKTtpZihudWxsIT09by5jaGlsZCl7Zm9yKGk9UGcocz1vLmNoaWxkLHMucGVuZGluZ1Byb3BzKSxvLmNoaWxkPWksaS5yZXR1cm49bztudWxsIT09cy5zaWJsaW5nOylzPXMuc2libGluZywoaT1pLnNpYmxpbmc9UGcocyxzLnBlbmRpbmdQcm9wcykpLnJldHVybj1vO2kuc2libGluZz1udWxsfXJldHVybiBvLmNoaWxkfWZ1bmN0aW9uIERqKHMsbyl7aWYoIUZuKXN3aXRjaChzLnRhaWxNb2RlKXtjYXNlImhpZGRlbiI6bz1zLnRhaWw7Zm9yKHZhciBpPW51bGw7bnVsbCE9PW87KW51bGwhPT1vLmFsdGVybmF0ZSYmKGk9byksbz1vLnNpYmxpbmc7bnVsbD09PWk/cy50YWlsPW51bGw6aS5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSJjb2xsYXBzZWQiOmk9cy50YWlsO2Zvcih2YXIgYT1udWxsO251bGwhPT1pOyludWxsIT09aS5hbHRlcm5hdGUmJihhPWkpLGk9aS5zaWJsaW5nO251bGw9PT1hP298fG51bGw9PT1zLnRhaWw/cy50YWlsPW51bGw6cy50YWlsLnNpYmxpbmc9bnVsbDphLnNpYmxpbmc9bnVsbH19ZnVuY3Rpb24gUyhzKXt2YXIgbz1udWxsIT09cy5hbHRlcm5hdGUmJnMuYWx0ZXJuYXRlLmNoaWxkPT09cy5jaGlsZCxpPTAsYT0wO2lmKG8pZm9yKHZhciB1PXMuY2hpbGQ7bnVsbCE9PXU7KWl8PXUubGFuZXN8dS5jaGlsZExhbmVzLGF8PTE0NjgwMDY0JnUuc3VidHJlZUZsYWdzLGF8PTE0NjgwMDY0JnUuZmxhZ3MsdS5yZXR1cm49cyx1PXUuc2libGluZztlbHNlIGZvcih1PXMuY2hpbGQ7bnVsbCE9PXU7KWl8PXUubGFuZXN8dS5jaGlsZExhbmVzLGF8PXUuc3VidHJlZUZsYWdzLGF8PXUuZmxhZ3MsdS5yZXR1cm49cyx1PXUuc2libGluZztyZXR1cm4gcy5zdWJ0cmVlRmxhZ3N8PWEscy5jaGlsZExhbmVzPWksb31mdW5jdGlvbiBFaihzLG8saSl7dmFyIGE9by5wZW5kaW5nUHJvcHM7c3dpdGNoKHdnKG8pLG8udGFnKXtjYXNlIDI6Y2FzZSAxNjpjYXNlIDE1OmNhc2UgMDpjYXNlIDExOmNhc2UgNzpjYXNlIDg6Y2FzZSAxMjpjYXNlIDk6Y2FzZSAxNDpyZXR1cm4gUyhvKSxudWxsO2Nhc2UgMTpjYXNlIDE3OnJldHVybiBaZihvLnR5cGUpJiYkZigpLFMobyksbnVsbDtjYXNlIDM6cmV0dXJuIGE9by5zdGF0ZU5vZGUsemgoKSxFKEVuKSxFKF9uKSxFaCgpLGEucGVuZGluZ0NvbnRleHQmJihhLmNvbnRleHQ9YS5wZW5kaW5nQ29udGV4dCxhLnBlbmRpbmdDb250ZXh0PW51bGwpLG51bGwhPT1zJiZudWxsIT09cy5jaGlsZHx8KEdnKG8pP28uZmxhZ3N8PTQ6bnVsbD09PXN8fHMubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQmJiEoMjU2Jm8uZmxhZ3MpfHwoby5mbGFnc3w9MTAyNCxudWxsIT09Qm4mJihGaihCbiksQm49bnVsbCkpKSxTKG8pLG51bGw7Y2FzZSA1OkJoKG8pO3ZhciB1PXhoKFFuLmN1cnJlbnQpO2lmKGk9by50eXBlLG51bGwhPT1zJiZudWxsIT1vLnN0YXRlTm9kZSlfcyhzLG8saSxhKSxzLnJlZiE9PW8ucmVmJiYoby5mbGFnc3w9NTEyLG8uZmxhZ3N8PTIwOTcxNTIpO2Vsc2V7aWYoIWEpe2lmKG51bGw9PT1vLnN0YXRlTm9kZSl0aHJvdyBFcnJvcihwKDE2NikpO3JldHVybiBTKG8pLG51bGx9aWYocz14aChZbi5jdXJyZW50KSxHZyhvKSl7YT1vLnN0YXRlTm9kZSxpPW8udHlwZTt2YXIgXz1vLm1lbW9pemVkUHJvcHM7c3dpdGNoKGFbaG5dPW8sYVtkbl09XyxzPSEhKDEmby5tb2RlKSxpKXtjYXNlImRpYWxvZyI6RCgiY2FuY2VsIixhKSxEKCJjbG9zZSIsYSk7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpEKCJsb2FkIixhKTticmVhaztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjpmb3IodT0wO3U8WnIubGVuZ3RoO3UrKylEKFpyW3VdLGEpO2JyZWFrO2Nhc2Uic291cmNlIjpEKCJlcnJvciIsYSk7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6RCgiZXJyb3IiLGEpLEQoImxvYWQiLGEpO2JyZWFrO2Nhc2UiZGV0YWlscyI6RCgidG9nZ2xlIixhKTticmVhaztjYXNlImlucHV0IjpaYShhLF8pLEQoImludmFsaWQiLGEpO2JyZWFrO2Nhc2Uic2VsZWN0IjphLl93cmFwcGVyU3RhdGU9e3dhc011bHRpcGxlOiEhXy5tdWx0aXBsZX0sRCgiaW52YWxpZCIsYSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6aGIoYSxfKSxEKCJpbnZhbGlkIixhKX1mb3IodmFyIHggaW4gdWIoaSxfKSx1PW51bGwsXylpZihfLmhhc093blByb3BlcnR5KHgpKXt2YXIgQz1fW3hdOyJjaGlsZHJlbiI9PT14PyJzdHJpbmciPT10eXBlb2YgQz9hLnRleHRDb250ZW50IT09QyYmKCEwIT09Xy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcmJkFmKGEudGV4dENvbnRlbnQsQyxzKSx1PVsiY2hpbGRyZW4iLENdKToibnVtYmVyIj09dHlwZW9mIEMmJmEudGV4dENvbnRlbnQhPT0iIitDJiYoITAhPT1fLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyYmQWYoYS50ZXh0Q29udGVudCxDLHMpLHU9WyJjaGlsZHJlbiIsIiIrQ10pOncuaGFzT3duUHJvcGVydHkoeCkmJm51bGwhPUMmJiJvblNjcm9sbCI9PT14JiZEKCJzY3JvbGwiLGEpfXN3aXRjaChpKXtjYXNlImlucHV0IjpWYShhKSxkYihhLF8sITApO2JyZWFrO2Nhc2UidGV4dGFyZWEiOlZhKGEpLGpiKGEpO2JyZWFrO2Nhc2Uic2VsZWN0IjpjYXNlIm9wdGlvbiI6YnJlYWs7ZGVmYXVsdDoiZnVuY3Rpb24iPT10eXBlb2YgXy5vbkNsaWNrJiYoYS5vbmNsaWNrPUJmKX1hPXUsby51cGRhdGVRdWV1ZT1hLG51bGwhPT1hJiYoby5mbGFnc3w9NCl9ZWxzZXt4PTk9PT11Lm5vZGVUeXBlP3U6dS5vd25lckRvY3VtZW50LCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PXMmJihzPWtiKGkpKSwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI9PT1zPyJzY3JpcHQiPT09aT8oKHM9eC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPSI8c2NyaXB0PjxcL3NjcmlwdD4iLHM9cy5yZW1vdmVDaGlsZChzLmZpcnN0Q2hpbGQpKToic3RyaW5nIj09dHlwZW9mIGEuaXM/cz14LmNyZWF0ZUVsZW1lbnQoaSx7aXM6YS5pc30pOihzPXguY3JlYXRlRWxlbWVudChpKSwic2VsZWN0Ij09PWkmJih4PXMsYS5tdWx0aXBsZT94Lm11bHRpcGxlPSEwOmEuc2l6ZSYmKHguc2l6ZT1hLnNpemUpKSk6cz14LmNyZWF0ZUVsZW1lbnROUyhzLGkpLHNbaG5dPW8sc1tkbl09YSxTcyhzLG8pLG8uc3RhdGVOb2RlPXM7ZTp7c3dpdGNoKHg9dmIoaSxhKSxpKXtjYXNlImRpYWxvZyI6RCgiY2FuY2VsIixzKSxEKCJjbG9zZSIscyksdT1hO2JyZWFrO2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6Y2FzZSJlbWJlZCI6RCgibG9hZCIscyksdT1hO2JyZWFrO2Nhc2UidmlkZW8iOmNhc2UiYXVkaW8iOmZvcih1PTA7dTxaci5sZW5ndGg7dSsrKUQoWnJbdV0scyk7dT1hO2JyZWFrO2Nhc2Uic291cmNlIjpEKCJlcnJvciIscyksdT1hO2JyZWFrO2Nhc2UiaW1nIjpjYXNlImltYWdlIjpjYXNlImxpbmsiOkQoImVycm9yIixzKSxEKCJsb2FkIixzKSx1PWE7YnJlYWs7Y2FzZSJkZXRhaWxzIjpEKCJ0b2dnbGUiLHMpLHU9YTticmVhaztjYXNlImlucHV0IjpaYShzLGEpLHU9WWEocyxhKSxEKCJpbnZhbGlkIixzKTticmVhaztjYXNlIm9wdGlvbiI6ZGVmYXVsdDp1PWE7YnJlYWs7Y2FzZSJzZWxlY3QiOnMuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFhLm11bHRpcGxlfSx1PXdlKHt9LGEse3ZhbHVlOnZvaWQgMH0pLEQoImludmFsaWQiLHMpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOmhiKHMsYSksdT1nYihzLGEpLEQoImludmFsaWQiLHMpfWZvcihfIGluIHViKGksdSksQz11KWlmKEMuaGFzT3duUHJvcGVydHkoXykpe3ZhciBqPUNbX107InN0eWxlIj09PV8/c2IocyxqKToiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPT09Xz9udWxsIT0oaj1qP2ouX19odG1sOnZvaWQgMCkmJiRlKHMsaik6ImNoaWxkcmVuIj09PV8/InN0cmluZyI9PXR5cGVvZiBqPygidGV4dGFyZWEiIT09aXx8IiIhPT1qKSYmb2IocyxqKToibnVtYmVyIj09dHlwZW9mIGomJm9iKHMsIiIraik6InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyIhPT1fJiYic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiE9PV8mJiJhdXRvRm9jdXMiIT09XyYmKHcuaGFzT3duUHJvcGVydHkoXyk/bnVsbCE9aiYmIm9uU2Nyb2xsIj09PV8mJkQoInNjcm9sbCIscyk6bnVsbCE9aiYmdGEocyxfLGoseCkpfXN3aXRjaChpKXtjYXNlImlucHV0IjpWYShzKSxkYihzLGEsITEpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOlZhKHMpLGpiKHMpO2JyZWFrO2Nhc2Uib3B0aW9uIjpudWxsIT1hLnZhbHVlJiZzLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiK1NhKGEudmFsdWUpKTticmVhaztjYXNlInNlbGVjdCI6cy5tdWx0aXBsZT0hIWEubXVsdGlwbGUsbnVsbCE9KF89YS52YWx1ZSk/ZmIocywhIWEubXVsdGlwbGUsXywhMSk6bnVsbCE9YS5kZWZhdWx0VmFsdWUmJmZiKHMsISFhLm11bHRpcGxlLGEuZGVmYXVsdFZhbHVlLCEwKTticmVhaztkZWZhdWx0OiJmdW5jdGlvbiI9PXR5cGVvZiB1Lm9uQ2xpY2smJihzLm9uY2xpY2s9QmYpfXN3aXRjaChpKXtjYXNlImJ1dHRvbiI6Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmE9ISFhLmF1dG9Gb2N1czticmVhayBlO2Nhc2UiaW1nIjphPSEwO2JyZWFrIGU7ZGVmYXVsdDphPSExfX1hJiYoby5mbGFnc3w9NCl9bnVsbCE9PW8ucmVmJiYoby5mbGFnc3w9NTEyLG8uZmxhZ3N8PTIwOTcxNTIpfXJldHVybiBTKG8pLG51bGw7Y2FzZSA2OmlmKHMmJm51bGwhPW8uc3RhdGVOb2RlKUVzKDAsbyxzLm1lbW9pemVkUHJvcHMsYSk7ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIGEmJm51bGw9PT1vLnN0YXRlTm9kZSl0aHJvdyBFcnJvcihwKDE2NikpO2lmKGk9eGgoUW4uY3VycmVudCkseGgoWW4uY3VycmVudCksR2cobykpe2lmKGE9by5zdGF0ZU5vZGUsaT1vLm1lbW9pemVkUHJvcHMsYVtobl09bywoXz1hLm5vZGVWYWx1ZSE9PWkpJiZudWxsIT09KHM9RG4pKXN3aXRjaChzLnRhZyl7Y2FzZSAzOkFmKGEubm9kZVZhbHVlLGksISEoMSZzLm1vZGUpKTticmVhaztjYXNlIDU6ITAhPT1zLm1lbW9pemVkUHJvcHMuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJiZBZihhLm5vZGVWYWx1ZSxpLCEhKDEmcy5tb2RlKSl9XyYmKG8uZmxhZ3N8PTQpfWVsc2UoYT0oOT09PWkubm9kZVR5cGU/aTppLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKGEpKVtobl09byxvLnN0YXRlTm9kZT1hfXJldHVybiBTKG8pLG51bGw7Y2FzZSAxMzppZihFKFpuKSxhPW8ubWVtb2l6ZWRTdGF0ZSxudWxsPT09c3x8bnVsbCE9PXMubWVtb2l6ZWRTdGF0ZSYmbnVsbCE9PXMubWVtb2l6ZWRTdGF0ZS5kZWh5ZHJhdGVkKXtpZihGbiYmbnVsbCE9PUxuJiYxJm8ubW9kZSYmISgxMjgmby5mbGFncykpSGcoKSxJZygpLG8uZmxhZ3N8PTk4NTYwLF89ITE7ZWxzZSBpZihfPUdnKG8pLG51bGwhPT1hJiZudWxsIT09YS5kZWh5ZHJhdGVkKXtpZihudWxsPT09cyl7aWYoIV8pdGhyb3cgRXJyb3IocCgzMTgpKTtpZighKF89bnVsbCE9PShfPW8ubWVtb2l6ZWRTdGF0ZSk/Xy5kZWh5ZHJhdGVkOm51bGwpKXRocm93IEVycm9yKHAoMzE3KSk7X1tobl09b31lbHNlIElnKCksISgxMjgmby5mbGFncykmJihvLm1lbW9pemVkU3RhdGU9bnVsbCksby5mbGFnc3w9NDtTKG8pLF89ITF9ZWxzZSBudWxsIT09Qm4mJihGaihCbiksQm49bnVsbCksXz0hMDtpZighXylyZXR1cm4gNjU1MzYmby5mbGFncz9vOm51bGx9cmV0dXJuIDEyOCZvLmZsYWdzPyhvLmxhbmVzPWksbyk6KChhPW51bGwhPT1hKSE9PShudWxsIT09cyYmbnVsbCE9PXMubWVtb2l6ZWRTdGF0ZSkmJmEmJihvLmNoaWxkLmZsYWdzfD04MTkyLDEmby5tb2RlJiYobnVsbD09PXN8fDEmWm4uY3VycmVudD8wPT09VXMmJihVcz0zKTp0aigpKSksbnVsbCE9PW8udXBkYXRlUXVldWUmJihvLmZsYWdzfD00KSxTKG8pLG51bGwpO2Nhc2UgNDpyZXR1cm4gemgoKSxudWxsPT09cyYmc2Yoby5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksUyhvKSxudWxsO2Nhc2UgMTA6cmV0dXJuIGFoKG8udHlwZS5fY29udGV4dCksUyhvKSxudWxsO2Nhc2UgMTk6aWYoRShabiksbnVsbD09PShfPW8ubWVtb2l6ZWRTdGF0ZSkpcmV0dXJuIFMobyksbnVsbDtpZihhPSEhKDEyOCZvLmZsYWdzKSxudWxsPT09KHg9Xy5yZW5kZXJpbmcpKWlmKGEpRGooXywhMSk7ZWxzZXtpZigwIT09VXN8fG51bGwhPT1zJiYxMjgmcy5mbGFncylmb3Iocz1vLmNoaWxkO251bGwhPT1zOyl7aWYobnVsbCE9PSh4PUNoKHMpKSl7Zm9yKG8uZmxhZ3N8PTEyOCxEaihfLCExKSxudWxsIT09KGE9eC51cGRhdGVRdWV1ZSkmJihvLnVwZGF0ZVF1ZXVlPWEsby5mbGFnc3w9NCksby5zdWJ0cmVlRmxhZ3M9MCxhPWksaT1vLmNoaWxkO251bGwhPT1pOylzPWEsKF89aSkuZmxhZ3MmPTE0NjgwMDY2LG51bGw9PT0oeD1fLmFsdGVybmF0ZSk/KF8uY2hpbGRMYW5lcz0wLF8ubGFuZXM9cyxfLmNoaWxkPW51bGwsXy5zdWJ0cmVlRmxhZ3M9MCxfLm1lbW9pemVkUHJvcHM9bnVsbCxfLm1lbW9pemVkU3RhdGU9bnVsbCxfLnVwZGF0ZVF1ZXVlPW51bGwsXy5kZXBlbmRlbmNpZXM9bnVsbCxfLnN0YXRlTm9kZT1udWxsKTooXy5jaGlsZExhbmVzPXguY2hpbGRMYW5lcyxfLmxhbmVzPXgubGFuZXMsXy5jaGlsZD14LmNoaWxkLF8uc3VidHJlZUZsYWdzPTAsXy5kZWxldGlvbnM9bnVsbCxfLm1lbW9pemVkUHJvcHM9eC5tZW1vaXplZFByb3BzLF8ubWVtb2l6ZWRTdGF0ZT14Lm1lbW9pemVkU3RhdGUsXy51cGRhdGVRdWV1ZT14LnVwZGF0ZVF1ZXVlLF8udHlwZT14LnR5cGUscz14LmRlcGVuZGVuY2llcyxfLmRlcGVuZGVuY2llcz1udWxsPT09cz9udWxsOntsYW5lczpzLmxhbmVzLGZpcnN0Q29udGV4dDpzLmZpcnN0Q29udGV4dH0pLGk9aS5zaWJsaW5nO3JldHVybiBHKFpuLDEmWm4uY3VycmVudHwyKSxvLmNoaWxkfXM9cy5zaWJsaW5nfW51bGwhPT1fLnRhaWwmJmh0KCk+WXMmJihvLmZsYWdzfD0xMjgsYT0hMCxEaihfLCExKSxvLmxhbmVzPTQxOTQzMDQpfWVsc2V7aWYoIWEpaWYobnVsbCE9PShzPUNoKHgpKSl7aWYoby5mbGFnc3w9MTI4LGE9ITAsbnVsbCE9PShpPXMudXBkYXRlUXVldWUpJiYoby51cGRhdGVRdWV1ZT1pLG8uZmxhZ3N8PTQpLERqKF8sITApLG51bGw9PT1fLnRhaWwmJiJoaWRkZW4iPT09Xy50YWlsTW9kZSYmIXguYWx0ZXJuYXRlJiYhRm4pcmV0dXJuIFMobyksbnVsbH1lbHNlIDIqaHQoKS1fLnJlbmRlcmluZ1N0YXJ0VGltZT5ZcyYmMTA3Mzc0MTgyNCE9PWkmJihvLmZsYWdzfD0xMjgsYT0hMCxEaihfLCExKSxvLmxhbmVzPTQxOTQzMDQpO18uaXNCYWNrd2FyZHM/KHguc2libGluZz1vLmNoaWxkLG8uY2hpbGQ9eCk6KG51bGwhPT0oaT1fLmxhc3QpP2kuc2libGluZz14Om8uY2hpbGQ9eCxfLmxhc3Q9eCl9cmV0dXJuIG51bGwhPT1fLnRhaWw/KG89Xy50YWlsLF8ucmVuZGVyaW5nPW8sXy50YWlsPW8uc2libGluZyxfLnJlbmRlcmluZ1N0YXJ0VGltZT1odCgpLG8uc2libGluZz1udWxsLGk9Wm4uY3VycmVudCxHKFpuLGE/MSZpfDI6MSZpKSxvKTooUyhvKSxudWxsKTtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIEhqKCksYT1udWxsIT09by5tZW1vaXplZFN0YXRlLG51bGwhPT1zJiZudWxsIT09cy5tZW1vaXplZFN0YXRlIT09YSYmKG8uZmxhZ3N8PTgxOTIpLGEmJjEmby5tb2RlPyEhKDEwNzM3NDE4MjQmJHMpJiYoUyhvKSw2Jm8uc3VidHJlZUZsYWdzJiYoby5mbGFnc3w9ODE5MikpOlMobyksbnVsbDtjYXNlIDI0OmNhc2UgMjU6cmV0dXJuIG51bGx9dGhyb3cgRXJyb3IocCgxNTYsby50YWcpKX1mdW5jdGlvbiBJaihzLG8pe3N3aXRjaCh3ZyhvKSxvLnRhZyl7Y2FzZSAxOnJldHVybiBaZihvLnR5cGUpJiYkZigpLDY1NTM2JihzPW8uZmxhZ3MpPyhvLmZsYWdzPS02NTUzNyZzfDEyOCxvKTpudWxsO2Nhc2UgMzpyZXR1cm4gemgoKSxFKEVuKSxFKF9uKSxFaCgpLDY1NTM2JihzPW8uZmxhZ3MpJiYhKDEyOCZzKT8oby5mbGFncz0tNjU1Mzcmc3wxMjgsbyk6bnVsbDtjYXNlIDU6cmV0dXJuIEJoKG8pLG51bGw7Y2FzZSAxMzppZihFKFpuKSxudWxsIT09KHM9by5tZW1vaXplZFN0YXRlKSYmbnVsbCE9PXMuZGVoeWRyYXRlZCl7aWYobnVsbD09PW8uYWx0ZXJuYXRlKXRocm93IEVycm9yKHAoMzQwKSk7SWcoKX1yZXR1cm4gNjU1MzYmKHM9by5mbGFncyk/KG8uZmxhZ3M9LTY1NTM3JnN8MTI4LG8pOm51bGw7Y2FzZSAxOTpyZXR1cm4gRShabiksbnVsbDtjYXNlIDQ6cmV0dXJuIHpoKCksbnVsbDtjYXNlIDEwOnJldHVybiBhaChvLnR5cGUuX2NvbnRleHQpLG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBIaigpLG51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH19U3M9ZnVuY3Rpb24ocyxvKXtmb3IodmFyIGk9by5jaGlsZDtudWxsIT09aTspe2lmKDU9PT1pLnRhZ3x8Nj09PWkudGFnKXMuYXBwZW5kQ2hpbGQoaS5zdGF0ZU5vZGUpO2Vsc2UgaWYoNCE9PWkudGFnJiZudWxsIT09aS5jaGlsZCl7aS5jaGlsZC5yZXR1cm49aSxpPWkuY2hpbGQ7Y29udGludWV9aWYoaT09PW8pYnJlYWs7Zm9yKDtudWxsPT09aS5zaWJsaW5nOyl7aWYobnVsbD09PWkucmV0dXJufHxpLnJldHVybj09PW8pcmV0dXJuO2k9aS5yZXR1cm59aS5zaWJsaW5nLnJldHVybj1pLnJldHVybixpPWkuc2libGluZ319LF9zPWZ1bmN0aW9uKHMsbyxpLGEpe3ZhciB1PXMubWVtb2l6ZWRQcm9wcztpZih1IT09YSl7cz1vLnN0YXRlTm9kZSx4aChZbi5jdXJyZW50KTt2YXIgXyx4PW51bGw7c3dpdGNoKGkpe2Nhc2UiaW5wdXQiOnU9WWEocyx1KSxhPVlhKHMsYSkseD1bXTticmVhaztjYXNlInNlbGVjdCI6dT13ZSh7fSx1LHt2YWx1ZTp2b2lkIDB9KSxhPXdlKHt9LGEse3ZhbHVlOnZvaWQgMH0pLHg9W107YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6dT1nYihzLHUpLGE9Z2IocyxhKSx4PVtdO2JyZWFrO2RlZmF1bHQ6ImZ1bmN0aW9uIiE9dHlwZW9mIHUub25DbGljayYmImZ1bmN0aW9uIj09dHlwZW9mIGEub25DbGljayYmKHMub25jbGljaz1CZil9Zm9yKEwgaW4gdWIoaSxhKSxpPW51bGwsdSlpZighYS5oYXNPd25Qcm9wZXJ0eShMKSYmdS5oYXNPd25Qcm9wZXJ0eShMKSYmbnVsbCE9dVtMXSlpZigic3R5bGUiPT09TCl7dmFyIEM9dVtMXTtmb3IoXyBpbiBDKUMuaGFzT3duUHJvcGVydHkoXykmJihpfHwoaT17fSksaVtfXT0iIil9ZWxzZSJkYW5nZXJvdXNseVNldElubmVySFRNTCIhPT1MJiYiY2hpbGRyZW4iIT09TCYmInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyIhPT1MJiYic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiE9PUwmJiJhdXRvRm9jdXMiIT09TCYmKHcuaGFzT3duUHJvcGVydHkoTCk/eHx8KHg9W10pOih4PXh8fFtdKS5wdXNoKEwsbnVsbCkpO2ZvcihMIGluIGEpe3ZhciBqPWFbTF07aWYoQz1udWxsIT11P3VbTF06dm9pZCAwLGEuaGFzT3duUHJvcGVydHkoTCkmJmohPT1DJiYobnVsbCE9anx8bnVsbCE9QykpaWYoInN0eWxlIj09PUwpaWYoQyl7Zm9yKF8gaW4gQykhQy5oYXNPd25Qcm9wZXJ0eShfKXx8aiYmai5oYXNPd25Qcm9wZXJ0eShfKXx8KGl8fChpPXt9KSxpW19dPSIiKTtmb3IoXyBpbiBqKWouaGFzT3duUHJvcGVydHkoXykmJkNbX10hPT1qW19dJiYoaXx8KGk9e30pLGlbX109altfXSl9ZWxzZSBpfHwoeHx8KHg9W10pLHgucHVzaChMLGkpKSxpPWo7ZWxzZSJkYW5nZXJvdXNseVNldElubmVySFRNTCI9PT1MPyhqPWo/ai5fX2h0bWw6dm9pZCAwLEM9Qz9DLl9faHRtbDp2b2lkIDAsbnVsbCE9aiYmQyE9PWomJih4PXh8fFtdKS5wdXNoKEwsaikpOiJjaGlsZHJlbiI9PT1MPyJzdHJpbmciIT10eXBlb2YgaiYmIm51bWJlciIhPXR5cGVvZiBqfHwoeD14fHxbXSkucHVzaChMLCIiK2opOiJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciIT09TCYmInN1cHByZXNzSHlkcmF0aW9uV2FybmluZyIhPT1MJiYody5oYXNPd25Qcm9wZXJ0eShMKT8obnVsbCE9aiYmIm9uU2Nyb2xsIj09PUwmJkQoInNjcm9sbCIscykseHx8Qz09PWp8fCh4PVtdKSk6KHg9eHx8W10pLnB1c2goTCxqKSl9aSYmKHg9eHx8W10pLnB1c2goInN0eWxlIixpKTt2YXIgTD14OyhvLnVwZGF0ZVF1ZXVlPUwpJiYoby5mbGFnc3w9NCl9fSxFcz1mdW5jdGlvbihzLG8saSxhKXtpIT09YSYmKG8uZmxhZ3N8PTQpfTt2YXIgeHM9ITEsa3M9ITEsT3M9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtTZXQ/V2Vha1NldDpTZXQsQXM9bnVsbDtmdW5jdGlvbiBMaihzLG8pe3ZhciBpPXMucmVmO2lmKG51bGwhPT1pKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBpKXRyeXtpKG51bGwpfWNhdGNoKGkpe1cocyxvLGkpfWVsc2UgaS5jdXJyZW50PW51bGx9ZnVuY3Rpb24gTWoocyxvLGkpe3RyeXtpKCl9Y2F0Y2goaSl7VyhzLG8saSl9fXZhciBDcz0hMTtmdW5jdGlvbiBQaihzLG8saSl7dmFyIGE9by51cGRhdGVRdWV1ZTtpZihudWxsIT09KGE9bnVsbCE9PWE/YS5sYXN0RWZmZWN0Om51bGwpKXt2YXIgdT1hPWEubmV4dDtkb3tpZigodS50YWcmcyk9PT1zKXt2YXIgXz11LmRlc3Ryb3k7dS5kZXN0cm95PXZvaWQgMCx2b2lkIDAhPT1fJiZNaihvLGksXyl9dT11Lm5leHR9d2hpbGUodSE9PWEpfX1mdW5jdGlvbiBRaihzLG8pe2lmKG51bGwhPT0obz1udWxsIT09KG89by51cGRhdGVRdWV1ZSk/by5sYXN0RWZmZWN0Om51bGwpKXt2YXIgaT1vPW8ubmV4dDtkb3tpZigoaS50YWcmcyk9PT1zKXt2YXIgYT1pLmNyZWF0ZTtpLmRlc3Ryb3k9YSgpfWk9aS5uZXh0fXdoaWxlKGkhPT1vKX19ZnVuY3Rpb24gUmoocyl7dmFyIG89cy5yZWY7aWYobnVsbCE9PW8pe3ZhciBpPXMuc3RhdGVOb2RlO3MudGFnLHM9aSwiZnVuY3Rpb24iPT10eXBlb2Ygbz9vKHMpOm8uY3VycmVudD1zfX1mdW5jdGlvbiBTaihzKXt2YXIgbz1zLmFsdGVybmF0ZTtudWxsIT09byYmKHMuYWx0ZXJuYXRlPW51bGwsU2oobykpLHMuY2hpbGQ9bnVsbCxzLmRlbGV0aW9ucz1udWxsLHMuc2libGluZz1udWxsLDU9PT1zLnRhZyYmKG51bGwhPT0obz1zLnN0YXRlTm9kZSkmJihkZWxldGUgb1tobl0sZGVsZXRlIG9bZG5dLGRlbGV0ZSBvW21uXSxkZWxldGUgb1tnbl0sZGVsZXRlIG9beW5dKSkscy5zdGF0ZU5vZGU9bnVsbCxzLnJldHVybj1udWxsLHMuZGVwZW5kZW5jaWVzPW51bGwscy5tZW1vaXplZFByb3BzPW51bGwscy5tZW1vaXplZFN0YXRlPW51bGwscy5wZW5kaW5nUHJvcHM9bnVsbCxzLnN0YXRlTm9kZT1udWxsLHMudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBUaihzKXtyZXR1cm4gNT09PXMudGFnfHwzPT09cy50YWd8fDQ9PT1zLnRhZ31mdW5jdGlvbiBVaihzKXtlOmZvcig7Oyl7Zm9yKDtudWxsPT09cy5zaWJsaW5nOyl7aWYobnVsbD09PXMucmV0dXJufHxUaihzLnJldHVybikpcmV0dXJuIG51bGw7cz1zLnJldHVybn1mb3Iocy5zaWJsaW5nLnJldHVybj1zLnJldHVybixzPXMuc2libGluZzs1IT09cy50YWcmJjYhPT1zLnRhZyYmMTghPT1zLnRhZzspe2lmKDImcy5mbGFncyljb250aW51ZSBlO2lmKG51bGw9PT1zLmNoaWxkfHw0PT09cy50YWcpY29udGludWUgZTtzLmNoaWxkLnJldHVybj1zLHM9cy5jaGlsZH1pZighKDImcy5mbGFncykpcmV0dXJuIHMuc3RhdGVOb2RlfX1mdW5jdGlvbiBWaihzLG8saSl7dmFyIGE9cy50YWc7aWYoNT09PWF8fDY9PT1hKXM9cy5zdGF0ZU5vZGUsbz84PT09aS5ub2RlVHlwZT9pLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHMsbyk6aS5pbnNlcnRCZWZvcmUocyxvKTooOD09PWkubm9kZVR5cGU/KG89aS5wYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUocyxpKToobz1pKS5hcHBlbmRDaGlsZChzKSxudWxsIT0oaT1pLl9yZWFjdFJvb3RDb250YWluZXIpfHxudWxsIT09by5vbmNsaWNrfHwoby5vbmNsaWNrPUJmKSk7ZWxzZSBpZig0IT09YSYmbnVsbCE9PShzPXMuY2hpbGQpKWZvcihWaihzLG8saSkscz1zLnNpYmxpbmc7bnVsbCE9PXM7KVZqKHMsbyxpKSxzPXMuc2libGluZ31mdW5jdGlvbiBXaihzLG8saSl7dmFyIGE9cy50YWc7aWYoNT09PWF8fDY9PT1hKXM9cy5zdGF0ZU5vZGUsbz9pLmluc2VydEJlZm9yZShzLG8pOmkuYXBwZW5kQ2hpbGQocyk7ZWxzZSBpZig0IT09YSYmbnVsbCE9PShzPXMuY2hpbGQpKWZvcihXaihzLG8saSkscz1zLnNpYmxpbmc7bnVsbCE9PXM7KVdqKHMsbyxpKSxzPXMuc2libGluZ312YXIganM9bnVsbCxQcz0hMTtmdW5jdGlvbiBZaihzLG8saSl7Zm9yKGk9aS5jaGlsZDtudWxsIT09aTspWmoocyxvLGkpLGk9aS5zaWJsaW5nfWZ1bmN0aW9uIFpqKHMsbyxpKXtpZihfdCYmImZ1bmN0aW9uIj09dHlwZW9mIF90Lm9uQ29tbWl0RmliZXJVbm1vdW50KXRyeXtfdC5vbkNvbW1pdEZpYmVyVW5tb3VudChTdCxpKX1jYXRjaChzKXt9c3dpdGNoKGkudGFnKXtjYXNlIDU6a3N8fExqKGksbyk7Y2FzZSA2OnZhciBhPWpzLHU9UHM7anM9bnVsbCxZaihzLG8saSksUHM9dSxudWxsIT09KGpzPWEpJiYoUHM/KHM9anMsaT1pLnN0YXRlTm9kZSw4PT09cy5ub2RlVHlwZT9zLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSk6cy5yZW1vdmVDaGlsZChpKSk6anMucmVtb3ZlQ2hpbGQoaS5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDE4Om51bGwhPT1qcyYmKFBzPyhzPWpzLGk9aS5zdGF0ZU5vZGUsOD09PXMubm9kZVR5cGU/S2Yocy5wYXJlbnROb2RlLGkpOjE9PT1zLm5vZGVUeXBlJiZLZihzLGkpLGJkKHMpKTpLZihqcyxpLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgNDphPWpzLHU9UHMsanM9aS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxQcz0hMCxZaihzLG8saSksanM9YSxQcz11O2JyZWFrO2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTppZigha3MmJihudWxsIT09KGE9aS51cGRhdGVRdWV1ZSkmJm51bGwhPT0oYT1hLmxhc3RFZmZlY3QpKSl7dT1hPWEubmV4dDtkb3t2YXIgXz11LHc9Xy5kZXN0cm95O189Xy50YWcsdm9pZCAwIT09dyYmKDImX3x8NCZfKSYmTWooaSxvLHcpLHU9dS5uZXh0fXdoaWxlKHUhPT1hKX1ZaihzLG8saSk7YnJlYWs7Y2FzZSAxOmlmKCFrcyYmKExqKGksbyksImZ1bmN0aW9uIj09dHlwZW9mKGE9aS5zdGF0ZU5vZGUpLmNvbXBvbmVudFdpbGxVbm1vdW50KSl0cnl7YS5wcm9wcz1pLm1lbW9pemVkUHJvcHMsYS5zdGF0ZT1pLm1lbW9pemVkU3RhdGUsYS5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKHMpe1coaSxvLHMpfVlqKHMsbyxpKTticmVhaztjYXNlIDIxOllqKHMsbyxpKTticmVhaztjYXNlIDIyOjEmaS5tb2RlPyhrcz0oYT1rcyl8fG51bGwhPT1pLm1lbW9pemVkU3RhdGUsWWoocyxvLGkpLGtzPWEpOllqKHMsbyxpKTticmVhaztkZWZhdWx0OllqKHMsbyxpKX19ZnVuY3Rpb24gYWsocyl7dmFyIG89cy51cGRhdGVRdWV1ZTtpZihudWxsIT09byl7cy51cGRhdGVRdWV1ZT1udWxsO3ZhciBpPXMuc3RhdGVOb2RlO251bGw9PT1pJiYoaT1zLnN0YXRlTm9kZT1uZXcgT3MpLG8uZm9yRWFjaCgoZnVuY3Rpb24obyl7dmFyIGE9YmsuYmluZChudWxsLHMsbyk7aS5oYXMobyl8fChpLmFkZChvKSxvLnRoZW4oYSxhKSl9KSl9fWZ1bmN0aW9uIGNrKHMsbyl7dmFyIGk9by5kZWxldGlvbnM7aWYobnVsbCE9PWkpZm9yKHZhciBhPTA7YTxpLmxlbmd0aDthKyspe3ZhciB1PWlbYV07dHJ5e3ZhciBfPXMsdz1vLHg9dztlOmZvcig7bnVsbCE9PXg7KXtzd2l0Y2goeC50YWcpe2Nhc2UgNTpqcz14LnN0YXRlTm9kZSxQcz0hMTticmVhayBlO2Nhc2UgMzpjYXNlIDQ6anM9eC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxQcz0hMDticmVhayBlfXg9eC5yZXR1cm59aWYobnVsbD09PWpzKXRocm93IEVycm9yKHAoMTYwKSk7WmooXyx3LHUpLGpzPW51bGwsUHM9ITE7dmFyIEM9dS5hbHRlcm5hdGU7bnVsbCE9PUMmJihDLnJldHVybj1udWxsKSx1LnJldHVybj1udWxsfWNhdGNoKHMpe1codSxvLHMpfX1pZigxMjg1NCZvLnN1YnRyZWVGbGFncylmb3Iobz1vLmNoaWxkO251bGwhPT1vOylkayhvLHMpLG89by5zaWJsaW5nfWZ1bmN0aW9uIGRrKHMsbyl7dmFyIGk9cy5hbHRlcm5hdGUsYT1zLmZsYWdzO3N3aXRjaChzLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKGNrKG8scyksZWsocyksNCZhKXt0cnl7UGooMyxzLHMucmV0dXJuKSxRaigzLHMpfWNhdGNoKG8pe1cocyxzLnJldHVybixvKX10cnl7UGooNSxzLHMucmV0dXJuKX1jYXRjaChvKXtXKHMscy5yZXR1cm4sbyl9fWJyZWFrO2Nhc2UgMTpjayhvLHMpLGVrKHMpLDUxMiZhJiZudWxsIT09aSYmTGooaSxpLnJldHVybik7YnJlYWs7Y2FzZSA1OmlmKGNrKG8scyksZWsocyksNTEyJmEmJm51bGwhPT1pJiZMaihpLGkucmV0dXJuKSwzMiZzLmZsYWdzKXt2YXIgdT1zLnN0YXRlTm9kZTt0cnl7b2IodSwiIil9Y2F0Y2gobyl7VyhzLHMucmV0dXJuLG8pfX1pZig0JmEmJm51bGwhPSh1PXMuc3RhdGVOb2RlKSl7dmFyIF89cy5tZW1vaXplZFByb3BzLHc9bnVsbCE9PWk/aS5tZW1vaXplZFByb3BzOl8seD1zLnR5cGUsQz1zLnVwZGF0ZVF1ZXVlO2lmKHMudXBkYXRlUXVldWU9bnVsbCxudWxsIT09Qyl0cnl7ImlucHV0Ij09PXgmJiJyYWRpbyI9PT1fLnR5cGUmJm51bGwhPV8ubmFtZSYmYWIodSxfKSx2Yih4LHcpO3ZhciBqPXZiKHgsXyk7Zm9yKHc9MDt3PEMubGVuZ3RoO3crPTIpe3ZhciBMPUNbd10sQj1DW3crMV07InN0eWxlIj09PUw/c2IodSxCKToiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPT09TD8kZSh1LEIpOiJjaGlsZHJlbiI9PT1MP29iKHUsQik6dGEodSxMLEIsail9c3dpdGNoKHgpe2Nhc2UiaW5wdXQiOmJiKHUsXyk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6aWIodSxfKTticmVhaztjYXNlInNlbGVjdCI6dmFyICQ9dS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO3UuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZT0hIV8ubXVsdGlwbGU7dmFyIFU9Xy52YWx1ZTtudWxsIT1VP2ZiKHUsISFfLm11bHRpcGxlLFUsITEpOiQhPT0hIV8ubXVsdGlwbGUmJihudWxsIT1fLmRlZmF1bHRWYWx1ZT9mYih1LCEhXy5tdWx0aXBsZSxfLmRlZmF1bHRWYWx1ZSwhMCk6ZmIodSwhIV8ubXVsdGlwbGUsXy5tdWx0aXBsZT9bXToiIiwhMSkpfXVbZG5dPV99Y2F0Y2gobyl7VyhzLHMucmV0dXJuLG8pfX1icmVhaztjYXNlIDY6aWYoY2sobyxzKSxlayhzKSw0JmEpe2lmKG51bGw9PT1zLnN0YXRlTm9kZSl0aHJvdyBFcnJvcihwKDE2MikpO3U9cy5zdGF0ZU5vZGUsXz1zLm1lbW9pemVkUHJvcHM7dHJ5e3Uubm9kZVZhbHVlPV99Y2F0Y2gobyl7VyhzLHMucmV0dXJuLG8pfX1icmVhaztjYXNlIDM6aWYoY2sobyxzKSxlayhzKSw0JmEmJm51bGwhPT1pJiZpLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXRyeXtiZChvLmNvbnRhaW5lckluZm8pfWNhdGNoKG8pe1cocyxzLnJldHVybixvKX1icmVhaztjYXNlIDQ6ZGVmYXVsdDpjayhvLHMpLGVrKHMpO2JyZWFrO2Nhc2UgMTM6Y2sobyxzKSxlayhzKSw4MTkyJih1PXMuY2hpbGQpLmZsYWdzJiYoXz1udWxsIT09dS5tZW1vaXplZFN0YXRlLHUuc3RhdGVOb2RlLmlzSGlkZGVuPV8sIV98fG51bGwhPT11LmFsdGVybmF0ZSYmbnVsbCE9PXUuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGV8fChHcz1odCgpKSksNCZhJiZhayhzKTticmVhaztjYXNlIDIyOmlmKEw9bnVsbCE9PWkmJm51bGwhPT1pLm1lbW9pemVkU3RhdGUsMSZzLm1vZGU/KGtzPShqPWtzKXx8TCxjayhvLHMpLGtzPWopOmNrKG8scyksZWsocyksODE5MiZhKXtpZihqPW51bGwhPT1zLm1lbW9pemVkU3RhdGUsKHMuc3RhdGVOb2RlLmlzSGlkZGVuPWopJiYhTCYmMSZzLm1vZGUpZm9yKEFzPXMsTD1zLmNoaWxkO251bGwhPT1MOyl7Zm9yKEI9QXM9TDtudWxsIT09QXM7KXtzd2l0Y2goVT0oJD1BcykuY2hpbGQsJC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTpQaig0LCQsJC5yZXR1cm4pO2JyZWFrO2Nhc2UgMTpMaigkLCQucmV0dXJuKTt2YXIgVj0kLnN0YXRlTm9kZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgVi5jb21wb25lbnRXaWxsVW5tb3VudCl7YT0kLGk9JC5yZXR1cm47dHJ5e289YSxWLnByb3BzPW8ubWVtb2l6ZWRQcm9wcyxWLnN0YXRlPW8ubWVtb2l6ZWRTdGF0ZSxWLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2gocyl7VyhhLGkscyl9fWJyZWFrO2Nhc2UgNTpMaigkLCQucmV0dXJuKTticmVhaztjYXNlIDIyOmlmKG51bGwhPT0kLm1lbW9pemVkU3RhdGUpe2drKEIpO2NvbnRpbnVlfX1udWxsIT09VT8oVS5yZXR1cm49JCxBcz1VKTpnayhCKX1MPUwuc2libGluZ31lOmZvcihMPW51bGwsQj1zOzspe2lmKDU9PT1CLnRhZyl7aWYobnVsbD09PUwpe0w9Qjt0cnl7dT1CLnN0YXRlTm9kZSxqPyJmdW5jdGlvbiI9PXR5cGVvZihfPXUuc3R5bGUpLnNldFByb3BlcnR5P18uc2V0UHJvcGVydHkoImRpc3BsYXkiLCJub25lIiwiaW1wb3J0YW50Iik6Xy5kaXNwbGF5PSJub25lIjooeD1CLnN0YXRlTm9kZSx3PW51bGwhPShDPUIubWVtb2l6ZWRQcm9wcy5zdHlsZSkmJkMuaGFzT3duUHJvcGVydHkoImRpc3BsYXkiKT9DLmRpc3BsYXk6bnVsbCx4LnN0eWxlLmRpc3BsYXk9cmIoImRpc3BsYXkiLHcpKX1jYXRjaChvKXtXKHMscy5yZXR1cm4sbyl9fX1lbHNlIGlmKDY9PT1CLnRhZyl7aWYobnVsbD09PUwpdHJ5e0Iuc3RhdGVOb2RlLm5vZGVWYWx1ZT1qPyIiOkIubWVtb2l6ZWRQcm9wc31jYXRjaChvKXtXKHMscy5yZXR1cm4sbyl9fWVsc2UgaWYoKDIyIT09Qi50YWcmJjIzIT09Qi50YWd8fG51bGw9PT1CLm1lbW9pemVkU3RhdGV8fEI9PT1zKSYmbnVsbCE9PUIuY2hpbGQpe0IuY2hpbGQucmV0dXJuPUIsQj1CLmNoaWxkO2NvbnRpbnVlfWlmKEI9PT1zKWJyZWFrIGU7Zm9yKDtudWxsPT09Qi5zaWJsaW5nOyl7aWYobnVsbD09PUIucmV0dXJufHxCLnJldHVybj09PXMpYnJlYWsgZTtMPT09QiYmKEw9bnVsbCksQj1CLnJldHVybn1MPT09QiYmKEw9bnVsbCksQi5zaWJsaW5nLnJldHVybj1CLnJldHVybixCPUIuc2libGluZ319YnJlYWs7Y2FzZSAxOTpjayhvLHMpLGVrKHMpLDQmYSYmYWsocyk7Y2FzZSAyMTp9fWZ1bmN0aW9uIGVrKHMpe3ZhciBvPXMuZmxhZ3M7aWYoMiZvKXt0cnl7ZTp7Zm9yKHZhciBpPXMucmV0dXJuO251bGwhPT1pOyl7aWYoVGooaSkpe3ZhciBhPWk7YnJlYWsgZX1pPWkucmV0dXJufXRocm93IEVycm9yKHAoMTYwKSl9c3dpdGNoKGEudGFnKXtjYXNlIDU6dmFyIHU9YS5zdGF0ZU5vZGU7MzImYS5mbGFncyYmKG9iKHUsIiIpLGEuZmxhZ3MmPS0zMyksV2oocyxVaihzKSx1KTticmVhaztjYXNlIDM6Y2FzZSA0OnZhciBfPWEuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87VmoocyxVaihzKSxfKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHAoMTYxKSl9fWNhdGNoKG8pe1cocyxzLnJldHVybixvKX1zLmZsYWdzJj0tM300MDk2Jm8mJihzLmZsYWdzJj0tNDA5Nyl9ZnVuY3Rpb24gaGsocyxvLGkpe0FzPXMsaWsocyxvLGkpfWZ1bmN0aW9uIGlrKHMsbyxpKXtmb3IodmFyIGE9ISEoMSZzLm1vZGUpO251bGwhPT1Bczspe3ZhciB1PUFzLF89dS5jaGlsZDtpZigyMj09PXUudGFnJiZhKXt2YXIgdz1udWxsIT09dS5tZW1vaXplZFN0YXRlfHx4cztpZighdyl7dmFyIHg9dS5hbHRlcm5hdGUsQz1udWxsIT09eCYmbnVsbCE9PXgubWVtb2l6ZWRTdGF0ZXx8a3M7eD14czt2YXIgaj1rcztpZih4cz13LChrcz1DKSYmIWopZm9yKEFzPXU7bnVsbCE9PUFzOylDPSh3PUFzKS5jaGlsZCwyMj09PXcudGFnJiZudWxsIT09dy5tZW1vaXplZFN0YXRlP2prKHUpOm51bGwhPT1DPyhDLnJldHVybj13LEFzPUMpOmprKHUpO2Zvcig7bnVsbCE9PV87KUFzPV8saWsoXyxvLGkpLF89Xy5zaWJsaW5nO0FzPXUseHM9eCxrcz1qfWtrKHMpfWVsc2UgODc3MiZ1LnN1YnRyZWVGbGFncyYmbnVsbCE9PV8/KF8ucmV0dXJuPXUsQXM9Xyk6a2socyl9fWZ1bmN0aW9uIGtrKHMpe2Zvcig7bnVsbCE9PUFzOyl7dmFyIG89QXM7aWYoODc3MiZvLmZsYWdzKXt2YXIgaT1vLmFsdGVybmF0ZTt0cnl7aWYoODc3MiZvLmZsYWdzKXN3aXRjaChvLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTprc3x8UWooNSxvKTticmVhaztjYXNlIDE6dmFyIGE9by5zdGF0ZU5vZGU7aWYoNCZvLmZsYWdzJiYha3MpaWYobnVsbD09PWkpYS5jb21wb25lbnREaWRNb3VudCgpO2Vsc2V7dmFyIHU9by5lbGVtZW50VHlwZT09PW8udHlwZT9pLm1lbW9pemVkUHJvcHM6Q2koby50eXBlLGkubWVtb2l6ZWRQcm9wcyk7YS5jb21wb25lbnREaWRVcGRhdGUodSxpLm1lbW9pemVkU3RhdGUsYS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSl9dmFyIF89by51cGRhdGVRdWV1ZTtudWxsIT09XyYmc2gobyxfLGEpO2JyZWFrO2Nhc2UgMzp2YXIgdz1vLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT13KXtpZihpPW51bGwsbnVsbCE9PW8uY2hpbGQpc3dpdGNoKG8uY2hpbGQudGFnKXtjYXNlIDU6Y2FzZSAxOmk9by5jaGlsZC5zdGF0ZU5vZGV9c2gobyx3LGkpfWJyZWFrO2Nhc2UgNTp2YXIgeD1vLnN0YXRlTm9kZTtpZihudWxsPT09aSYmNCZvLmZsYWdzKXtpPXg7dmFyIEM9by5tZW1vaXplZFByb3BzO3N3aXRjaChvLnR5cGUpe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6Qy5hdXRvRm9jdXMmJmkuZm9jdXMoKTticmVhaztjYXNlImltZyI6Qy5zcmMmJihpLnNyYz1DLnNyYyl9fWJyZWFrO2Nhc2UgNjpjYXNlIDQ6Y2FzZSAxMjpjYXNlIDE5OmNhc2UgMTc6Y2FzZSAyMTpjYXNlIDIyOmNhc2UgMjM6Y2FzZSAyNTpicmVhaztjYXNlIDEzOmlmKG51bGw9PT1vLm1lbW9pemVkU3RhdGUpe3ZhciBqPW8uYWx0ZXJuYXRlO2lmKG51bGwhPT1qKXt2YXIgTD1qLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PUwpe3ZhciBCPUwuZGVoeWRyYXRlZDtudWxsIT09QiYmYmQoQil9fX1icmVhaztkZWZhdWx0OnRocm93IEVycm9yKHAoMTYzKSl9a3N8fDUxMiZvLmZsYWdzJiZSaihvKX1jYXRjaChzKXtXKG8sby5yZXR1cm4scyl9fWlmKG89PT1zKXtBcz1udWxsO2JyZWFrfWlmKG51bGwhPT0oaT1vLnNpYmxpbmcpKXtpLnJldHVybj1vLnJldHVybixBcz1pO2JyZWFrfUFzPW8ucmV0dXJufX1mdW5jdGlvbiBnayhzKXtmb3IoO251bGwhPT1Bczspe3ZhciBvPUFzO2lmKG89PT1zKXtBcz1udWxsO2JyZWFrfXZhciBpPW8uc2libGluZztpZihudWxsIT09aSl7aS5yZXR1cm49by5yZXR1cm4sQXM9aTticmVha31Bcz1vLnJldHVybn19ZnVuY3Rpb24gamsocyl7Zm9yKDtudWxsIT09QXM7KXt2YXIgbz1Bczt0cnl7c3dpdGNoKG8udGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnZhciBpPW8ucmV0dXJuO3RyeXtRaig0LG8pfWNhdGNoKHMpe1cobyxpLHMpfWJyZWFrO2Nhc2UgMTp2YXIgYT1vLnN0YXRlTm9kZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgYS5jb21wb25lbnREaWRNb3VudCl7dmFyIHU9by5yZXR1cm47dHJ5e2EuY29tcG9uZW50RGlkTW91bnQoKX1jYXRjaChzKXtXKG8sdSxzKX19dmFyIF89by5yZXR1cm47dHJ5e1JqKG8pfWNhdGNoKHMpe1cobyxfLHMpfWJyZWFrO2Nhc2UgNTp2YXIgdz1vLnJldHVybjt0cnl7Umoobyl9Y2F0Y2gocyl7VyhvLHcscyl9fX1jYXRjaChzKXtXKG8sby5yZXR1cm4scyl9aWYobz09PXMpe0FzPW51bGw7YnJlYWt9dmFyIHg9by5zaWJsaW5nO2lmKG51bGwhPT14KXt4LnJldHVybj1vLnJldHVybixBcz14O2JyZWFrfUFzPW8ucmV0dXJufX12YXIgSXMsVHM9TWF0aC5jZWlsLE5zPVYuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixNcz1WLlJlYWN0Q3VycmVudE93bmVyLFJzPVYuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsRHM9MCxMcz1udWxsLEZzPW51bGwsQnM9MCwkcz0wLHFzPVVmKDApLFVzPTAsVnM9bnVsbCx6cz0wLFdzPTAsSnM9MCxIcz1udWxsLEtzPW51bGwsR3M9MCxZcz0xLzAsWHM9bnVsbCxRcz0hMSxacz1udWxsLGVvPW51bGwsdG89ITEscm89bnVsbCxubz0wLHNvPTAsb289bnVsbCxpbz0tMSxhbz0wO2Z1bmN0aW9uIFIoKXtyZXR1cm4gNiZEcz9odCgpOi0xIT09aW8/aW86aW89aHQoKX1mdW5jdGlvbiB5aShzKXtyZXR1cm4gMSZzLm1vZGU/MiZEcyYmMCE9PUJzP0JzJi1CczpudWxsIT09JG4udHJhbnNpdGlvbj8oMD09PWFvJiYoYW89eWMoKSksYW8pOjAhPT0ocz1BdCk/czpzPXZvaWQgMD09PShzPXdpbmRvdy5ldmVudCk/MTY6amQocy50eXBlKToxfWZ1bmN0aW9uIGdpKHMsbyxpLGEpe2lmKDUwPHNvKXRocm93IHNvPTAsb289bnVsbCxFcnJvcihwKDE4NSkpO0FjKHMsaSxhKSwyJkRzJiZzPT09THN8fChzPT09THMmJighKDImRHMpJiYoV3N8PWkpLDQ9PT1VcyYmQ2socyxCcykpLERrKHMsYSksMT09PWkmJjA9PT1EcyYmISgxJm8ubW9kZSkmJihZcz1odCgpKzUwMCxrbiYmamcoKSkpfWZ1bmN0aW9uIERrKHMsbyl7dmFyIGk9cy5jYWxsYmFja05vZGU7IWZ1bmN0aW9uIHdjKHMsbyl7Zm9yKHZhciBpPXMuc3VzcGVuZGVkTGFuZXMsYT1zLnBpbmdlZExhbmVzLHU9cy5leHBpcmF0aW9uVGltZXMsXz1zLnBlbmRpbmdMYW5lczswPF87KXt2YXIgdz0zMS1FdChfKSx4PTE8PHcsQz11W3ddOy0xPT09Qz94JmkmJiEoeCZhKXx8KHVbd109dmMoeCxvKSk6Qzw9byYmKHMuZXhwaXJlZExhbmVzfD14KSxfJj1+eH19KHMsbyk7dmFyIGE9dWMocyxzPT09THM/QnM6MCk7aWYoMD09PWEpbnVsbCE9PWkmJmx0KGkpLHMuY2FsbGJhY2tOb2RlPW51bGwscy5jYWxsYmFja1ByaW9yaXR5PTA7ZWxzZSBpZihvPWEmLWEscy5jYWxsYmFja1ByaW9yaXR5IT09byl7aWYobnVsbCE9aSYmbHQoaSksMT09PW8pMD09PXMudGFnP2Z1bmN0aW9uIGlnKHMpe2tuPSEwLGhnKHMpfShFay5iaW5kKG51bGwscykpOmhnKEVrLmJpbmQobnVsbCxzKSksdW4oKGZ1bmN0aW9uKCl7ISg2JkRzKSYmamcoKX0pKSxpPW51bGw7ZWxzZXtzd2l0Y2goRGMoYSkpe2Nhc2UgMTppPW10O2JyZWFrO2Nhc2UgNDppPWd0O2JyZWFrO2Nhc2UgMTY6ZGVmYXVsdDppPXl0O2JyZWFrO2Nhc2UgNTM2ODcwOTEyOmk9YnR9aT1GayhpLEdrLmJpbmQobnVsbCxzKSl9cy5jYWxsYmFja1ByaW9yaXR5PW8scy5jYWxsYmFja05vZGU9aX19ZnVuY3Rpb24gR2socyxvKXtpZihpbz0tMSxhbz0wLDYmRHMpdGhyb3cgRXJyb3IocCgzMjcpKTt2YXIgaT1zLmNhbGxiYWNrTm9kZTtpZihIaygpJiZzLmNhbGxiYWNrTm9kZSE9PWkpcmV0dXJuIG51bGw7dmFyIGE9dWMocyxzPT09THM/QnM6MCk7aWYoMD09PWEpcmV0dXJuIG51bGw7aWYoMzAmYXx8YSZzLmV4cGlyZWRMYW5lc3x8bylvPUlrKHMsYSk7ZWxzZXtvPWE7dmFyIHU9RHM7RHN8PTI7dmFyIF89SmsoKTtmb3IoTHM9PT1zJiZCcz09PW98fChYcz1udWxsLFlzPWh0KCkrNTAwLEtrKHMsbykpOzspdHJ5e0xrKCk7YnJlYWt9Y2F0Y2gobyl7TWsocyxvKX0kZygpLE5zLmN1cnJlbnQ9XyxEcz11LG51bGwhPT1Gcz9vPTA6KExzPW51bGwsQnM9MCxvPVVzKX1pZigwIT09byl7aWYoMj09PW8mJigwIT09KHU9eGMocykpJiYoYT11LG89Tmsocyx1KSkpLDE9PT1vKXRocm93IGk9VnMsS2socywwKSxDayhzLGEpLERrKHMsaHQoKSksaTtpZig2PT09bylDayhzLGEpO2Vsc2V7aWYodT1zLmN1cnJlbnQuYWx0ZXJuYXRlLCEoMzAmYXx8ZnVuY3Rpb24gT2socyl7Zm9yKHZhciBvPXM7Oyl7aWYoMTYzODQmby5mbGFncyl7dmFyIGk9by51cGRhdGVRdWV1ZTtpZihudWxsIT09aSYmbnVsbCE9PShpPWkuc3RvcmVzKSlmb3IodmFyIGE9MDthPGkubGVuZ3RoO2ErKyl7dmFyIHU9aVthXSxfPXUuZ2V0U25hcHNob3Q7dT11LnZhbHVlO3RyeXtpZighRHIoXygpLHUpKXJldHVybiExfWNhdGNoKHMpe3JldHVybiExfX19aWYoaT1vLmNoaWxkLDE2Mzg0Jm8uc3VidHJlZUZsYWdzJiZudWxsIT09aSlpLnJldHVybj1vLG89aTtlbHNle2lmKG89PT1zKWJyZWFrO2Zvcig7bnVsbD09PW8uc2libGluZzspe2lmKG51bGw9PT1vLnJldHVybnx8by5yZXR1cm49PT1zKXJldHVybiEwO289by5yZXR1cm59by5zaWJsaW5nLnJldHVybj1vLnJldHVybixvPW8uc2libGluZ319cmV0dXJuITB9KHUpfHwobz1JayhzLGEpLDI9PT1vJiYoXz14YyhzKSwwIT09XyYmKGE9XyxvPU5rKHMsXykpKSwxIT09bykpKXRocm93IGk9VnMsS2socywwKSxDayhzLGEpLERrKHMsaHQoKSksaTtzd2l0Y2gocy5maW5pc2hlZFdvcms9dSxzLmZpbmlzaGVkTGFuZXM9YSxvKXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKHAoMzQ1KSk7Y2FzZSAyOmNhc2UgNTpQayhzLEtzLFhzKTticmVhaztjYXNlIDM6aWYoQ2socyxhKSwoMTMwMDIzNDI0JmEpPT09YSYmMTA8KG89R3MrNTAwLWh0KCkpKXtpZigwIT09dWMocywwKSlicmVhaztpZigoKHU9cy5zdXNwZW5kZWRMYW5lcykmYSkhPT1hKXtSKCkscy5waW5nZWRMYW5lc3w9cy5zdXNwZW5kZWRMYW5lcyZ1O2JyZWFrfXMudGltZW91dEhhbmRsZT1hbihQay5iaW5kKG51bGwscyxLcyxYcyksbyk7YnJlYWt9UGsocyxLcyxYcyk7YnJlYWs7Y2FzZSA0OmlmKENrKHMsYSksKDQxOTQyNDAmYSk9PT1hKWJyZWFrO2ZvcihvPXMuZXZlbnRUaW1lcyx1PS0xOzA8YTspe3ZhciB3PTMxLUV0KGEpO189MTw8dywodz1vW3ddKT51JiYodT13KSxhJj1+X31pZihhPXUsMTA8KGE9KDEyMD4oYT1odCgpLWEpPzEyMDo0ODA+YT80ODA6MTA4MD5hPzEwODA6MTkyMD5hPzE5MjA6M2UzPmE/M2UzOjQzMjA+YT80MzIwOjE5NjAqVHMoYS8xOTYwKSktYSkpe3MudGltZW91dEhhbmRsZT1hbihQay5iaW5kKG51bGwscyxLcyxYcyksYSk7YnJlYWt9UGsocyxLcyxYcyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihwKDMyOSkpfX19cmV0dXJuIERrKHMsaHQoKSkscy5jYWxsYmFja05vZGU9PT1pP0drLmJpbmQobnVsbCxzKTpudWxsfWZ1bmN0aW9uIE5rKHMsbyl7dmFyIGk9SHM7cmV0dXJuIHMuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKEtrKHMsbykuZmxhZ3N8PTI1NiksMiE9PShzPUlrKHMsbykpJiYobz1LcyxLcz1pLG51bGwhPT1vJiZGaihvKSksc31mdW5jdGlvbiBGaihzKXtudWxsPT09S3M/S3M9czpLcy5wdXNoLmFwcGx5KEtzLHMpfWZ1bmN0aW9uIENrKHMsbyl7Zm9yKG8mPX5KcyxvJj1+V3Mscy5zdXNwZW5kZWRMYW5lc3w9byxzLnBpbmdlZExhbmVzJj1+byxzPXMuZXhwaXJhdGlvblRpbWVzOzA8bzspe3ZhciBpPTMxLUV0KG8pLGE9MTw8aTtzW2ldPS0xLG8mPX5hfX1mdW5jdGlvbiBFayhzKXtpZig2JkRzKXRocm93IEVycm9yKHAoMzI3KSk7SGsoKTt2YXIgbz11YyhzLDApO2lmKCEoMSZvKSlyZXR1cm4gRGsocyxodCgpKSxudWxsO3ZhciBpPUlrKHMsbyk7aWYoMCE9PXMudGFnJiYyPT09aSl7dmFyIGE9eGMocyk7MCE9PWEmJihvPWEsaT1OayhzLGEpKX1pZigxPT09aSl0aHJvdyBpPVZzLEtrKHMsMCksQ2socyxvKSxEayhzLGh0KCkpLGk7aWYoNj09PWkpdGhyb3cgRXJyb3IocCgzNDUpKTtyZXR1cm4gcy5maW5pc2hlZFdvcms9cy5jdXJyZW50LmFsdGVybmF0ZSxzLmZpbmlzaGVkTGFuZXM9byxQayhzLEtzLFhzKSxEayhzLGh0KCkpLG51bGx9ZnVuY3Rpb24gUWsocyxvKXt2YXIgaT1EcztEc3w9MTt0cnl7cmV0dXJuIHMobyl9ZmluYWxseXswPT09KERzPWkpJiYoWXM9aHQoKSs1MDAsa24mJmpnKCkpfX1mdW5jdGlvbiBSayhzKXtudWxsIT09cm8mJjA9PT1yby50YWcmJiEoNiZEcykmJkhrKCk7dmFyIG89RHM7RHN8PTE7dmFyIGk9UnMudHJhbnNpdGlvbixhPUF0O3RyeXtpZihScy50cmFuc2l0aW9uPW51bGwsQXQ9MSxzKXJldHVybiBzKCl9ZmluYWxseXtBdD1hLFJzLnRyYW5zaXRpb249aSwhKDYmKERzPW8pKSYmamcoKX19ZnVuY3Rpb24gSGooKXskcz1xcy5jdXJyZW50LEUocXMpfWZ1bmN0aW9uIEtrKHMsbyl7cy5maW5pc2hlZFdvcms9bnVsbCxzLmZpbmlzaGVkTGFuZXM9MDt2YXIgaT1zLnRpbWVvdXRIYW5kbGU7aWYoLTEhPT1pJiYocy50aW1lb3V0SGFuZGxlPS0xLGNuKGkpKSxudWxsIT09RnMpZm9yKGk9RnMucmV0dXJuO251bGwhPT1pOyl7dmFyIGE9aTtzd2l0Y2god2coYSksYS50YWcpe2Nhc2UgMTpudWxsIT0oYT1hLnR5cGUuY2hpbGRDb250ZXh0VHlwZXMpJiYkZigpO2JyZWFrO2Nhc2UgMzp6aCgpLEUoRW4pLEUoX24pLEVoKCk7YnJlYWs7Y2FzZSA1OkJoKGEpO2JyZWFrO2Nhc2UgNDp6aCgpO2JyZWFrO2Nhc2UgMTM6Y2FzZSAxOTpFKFpuKTticmVhaztjYXNlIDEwOmFoKGEudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOkhqKCl9aT1pLnJldHVybn1pZihMcz1zLEZzPXM9UGcocy5jdXJyZW50LG51bGwpLEJzPSRzPW8sVXM9MCxWcz1udWxsLEpzPVdzPXpzPTAsS3M9SHM9bnVsbCxudWxsIT09SG4pe2ZvcihvPTA7bzxIbi5sZW5ndGg7bysrKWlmKG51bGwhPT0oYT0oaT1IbltvXSkuaW50ZXJsZWF2ZWQpKXtpLmludGVybGVhdmVkPW51bGw7dmFyIHU9YS5uZXh0LF89aS5wZW5kaW5nO2lmKG51bGwhPT1fKXt2YXIgdz1fLm5leHQ7Xy5uZXh0PXUsYS5uZXh0PXd9aS5wZW5kaW5nPWF9SG49bnVsbH1yZXR1cm4gc31mdW5jdGlvbiBNayhzLG8pe2Zvcig7Oyl7dmFyIGk9RnM7dHJ5e2lmKCRnKCksdHMuY3VycmVudD1ocyxjcyl7Zm9yKHZhciBhPXNzLm1lbW9pemVkU3RhdGU7bnVsbCE9PWE7KXt2YXIgdT1hLnF1ZXVlO251bGwhPT11JiYodS5wZW5kaW5nPW51bGwpLGE9YS5uZXh0fWNzPSExfWlmKG5zPTAsYXM9b3M9c3M9bnVsbCxscz0hMSx1cz0wLE1zLmN1cnJlbnQ9bnVsbCxudWxsPT09aXx8bnVsbD09PWkucmV0dXJuKXtVcz0xLFZzPW8sRnM9bnVsbDticmVha31lOnt2YXIgXz1zLHc9aS5yZXR1cm4seD1pLEM9bztpZihvPUJzLHguZmxhZ3N8PTMyNzY4LG51bGwhPT1DJiYib2JqZWN0Ij09dHlwZW9mIEMmJiJmdW5jdGlvbiI9PXR5cGVvZiBDLnRoZW4pe3ZhciBqPUMsTD14LEI9TC50YWc7aWYoISgxJkwubW9kZXx8MCE9PUImJjExIT09QiYmMTUhPT1CKSl7dmFyICQ9TC5hbHRlcm5hdGU7JD8oTC51cGRhdGVRdWV1ZT0kLnVwZGF0ZVF1ZXVlLEwubWVtb2l6ZWRTdGF0ZT0kLm1lbW9pemVkU3RhdGUsTC5sYW5lcz0kLmxhbmVzKTooTC51cGRhdGVRdWV1ZT1udWxsLEwubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgVT1VaSh3KTtpZihudWxsIT09VSl7VS5mbGFncyY9LTI1NyxWaShVLHcseCwwLG8pLDEmVS5tb2RlJiZTaShfLGosbyksQz1qO3ZhciBWPShvPVUpLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT1WKXt2YXIgej1uZXcgU2V0O3ouYWRkKEMpLG8udXBkYXRlUXVldWU9en1lbHNlIFYuYWRkKEMpO2JyZWFrIGV9aWYoISgxJm8pKXtTaShfLGosbyksdGooKTticmVhayBlfUM9RXJyb3IocCg0MjYpKX1lbHNlIGlmKEZuJiYxJngubW9kZSl7dmFyIFk9VWkodyk7aWYobnVsbCE9PVkpeyEoNjU1MzYmWS5mbGFncykmJihZLmZsYWdzfD0yNTYpLFZpKFksdyx4LDAsbyksSmcoSmkoQyx4KSk7YnJlYWsgZX19Xz1DPUppKEMseCksNCE9PVVzJiYoVXM9MiksbnVsbD09PUhzP0hzPVtfXTpIcy5wdXNoKF8pLF89dztkb3tzd2l0Y2goXy50YWcpe2Nhc2UgMzpfLmZsYWdzfD02NTUzNixvJj0tbyxfLmxhbmVzfD1vLHBoKF8sTmkoMCxDLG8pKTticmVhayBlO2Nhc2UgMTp4PUM7dmFyIFo9Xy50eXBlLGVlPV8uc3RhdGVOb2RlO2lmKCEoMTI4Jl8uZmxhZ3N8fCJmdW5jdGlvbiIhPXR5cGVvZiBaLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciYmKG51bGw9PT1lZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGVlLmNvbXBvbmVudERpZENhdGNofHxudWxsIT09ZW8mJmVvLmhhcyhlZSkpKSl7Xy5mbGFnc3w9NjU1MzYsbyY9LW8sXy5sYW5lc3w9byxwaChfLFFpKF8seCxvKSk7YnJlYWsgZX19Xz1fLnJldHVybn13aGlsZShudWxsIT09Xyl9U2soaSl9Y2F0Y2gocyl7bz1zLEZzPT09aSYmbnVsbCE9PWkmJihGcz1pPWkucmV0dXJuKTtjb250aW51ZX1icmVha319ZnVuY3Rpb24gSmsoKXt2YXIgcz1Ocy5jdXJyZW50O3JldHVybiBOcy5jdXJyZW50PWhzLG51bGw9PT1zP2hzOnN9ZnVuY3Rpb24gdGooKXswIT09VXMmJjMhPT1VcyYmMiE9PVVzfHwoVXM9NCksbnVsbD09PUxzfHwhKDI2ODQzNTQ1NSZ6cykmJiEoMjY4NDM1NDU1JldzKXx8Q2soTHMsQnMpfWZ1bmN0aW9uIElrKHMsbyl7dmFyIGk9RHM7RHN8PTI7dmFyIGE9SmsoKTtmb3IoTHM9PT1zJiZCcz09PW98fChYcz1udWxsLEtrKHMsbykpOzspdHJ5e1RrKCk7YnJlYWt9Y2F0Y2gobyl7TWsocyxvKX1pZigkZygpLERzPWksTnMuY3VycmVudD1hLG51bGwhPT1Gcyl0aHJvdyBFcnJvcihwKDI2MSkpO3JldHVybiBMcz1udWxsLEJzPTAsVXN9ZnVuY3Rpb24gVGsoKXtmb3IoO251bGwhPT1GczspVWsoRnMpfWZ1bmN0aW9uIExrKCl7Zm9yKDtudWxsIT09RnMmJiF1dCgpOylVayhGcyl9ZnVuY3Rpb24gVWsocyl7dmFyIG89SXMocy5hbHRlcm5hdGUscywkcyk7cy5tZW1vaXplZFByb3BzPXMucGVuZGluZ1Byb3BzLG51bGw9PT1vP1NrKHMpOkZzPW8sTXMuY3VycmVudD1udWxsfWZ1bmN0aW9uIFNrKHMpe3ZhciBvPXM7ZG97dmFyIGk9by5hbHRlcm5hdGU7aWYocz1vLnJldHVybiwzMjc2OCZvLmZsYWdzKXtpZihudWxsIT09KGk9SWooaSxvKSkpcmV0dXJuIGkuZmxhZ3MmPTMyNzY3LHZvaWQoRnM9aSk7aWYobnVsbD09PXMpcmV0dXJuIFVzPTYsdm9pZChGcz1udWxsKTtzLmZsYWdzfD0zMjc2OCxzLnN1YnRyZWVGbGFncz0wLHMuZGVsZXRpb25zPW51bGx9ZWxzZSBpZihudWxsIT09KGk9RWooaSxvLCRzKSkpcmV0dXJuIHZvaWQoRnM9aSk7aWYobnVsbCE9PShvPW8uc2libGluZykpcmV0dXJuIHZvaWQoRnM9byk7RnM9bz1zfXdoaWxlKG51bGwhPT1vKTswPT09VXMmJihVcz01KX1mdW5jdGlvbiBQayhzLG8saSl7dmFyIGE9QXQsdT1Scy50cmFuc2l0aW9uO3RyeXtScy50cmFuc2l0aW9uPW51bGwsQXQ9MSxmdW5jdGlvbiBXayhzLG8saSxhKXtkb3tIaygpfXdoaWxlKG51bGwhPT1ybyk7aWYoNiZEcyl0aHJvdyBFcnJvcihwKDMyNykpO2k9cy5maW5pc2hlZFdvcms7dmFyIHU9cy5maW5pc2hlZExhbmVzO2lmKG51bGw9PT1pKXJldHVybiBudWxsO2lmKHMuZmluaXNoZWRXb3JrPW51bGwscy5maW5pc2hlZExhbmVzPTAsaT09PXMuY3VycmVudCl0aHJvdyBFcnJvcihwKDE3NykpO3MuY2FsbGJhY2tOb2RlPW51bGwscy5jYWxsYmFja1ByaW9yaXR5PTA7dmFyIF89aS5sYW5lc3xpLmNoaWxkTGFuZXM7aWYoZnVuY3Rpb24gQmMocyxvKXt2YXIgaT1zLnBlbmRpbmdMYW5lcyZ+bztzLnBlbmRpbmdMYW5lcz1vLHMuc3VzcGVuZGVkTGFuZXM9MCxzLnBpbmdlZExhbmVzPTAscy5leHBpcmVkTGFuZXMmPW8scy5tdXRhYmxlUmVhZExhbmVzJj1vLHMuZW50YW5nbGVkTGFuZXMmPW8sbz1zLmVudGFuZ2xlbWVudHM7dmFyIGE9cy5ldmVudFRpbWVzO2ZvcihzPXMuZXhwaXJhdGlvblRpbWVzOzA8aTspe3ZhciB1PTMxLUV0KGkpLF89MTw8dTtvW3VdPTAsYVt1XT0tMSxzW3VdPS0xLGkmPX5ffX0ocyxfKSxzPT09THMmJihGcz1Mcz1udWxsLEJzPTApLCEoMjA2NCZpLnN1YnRyZWVGbGFncykmJiEoMjA2NCZpLmZsYWdzKXx8dG98fCh0bz0hMCxGayh5dCwoZnVuY3Rpb24oKXtyZXR1cm4gSGsoKSxudWxsfSkpKSxfPSEhKDE1OTkwJmkuZmxhZ3MpLCEhKDE1OTkwJmkuc3VidHJlZUZsYWdzKXx8Xyl7Xz1Scy50cmFuc2l0aW9uLFJzLnRyYW5zaXRpb249bnVsbDt2YXIgdz1BdDtBdD0xO3ZhciB4PURzO0RzfD00LE1zLmN1cnJlbnQ9bnVsbCxmdW5jdGlvbiBPaihzLG8pe2lmKHNuPVZ0LE5lKHM9TWUoKSkpe2lmKCJzZWxlY3Rpb25TdGFydCJpbiBzKXZhciBpPXtzdGFydDpzLnNlbGVjdGlvblN0YXJ0LGVuZDpzLnNlbGVjdGlvbkVuZH07ZWxzZSBlOnt2YXIgYT0oaT0oaT1zLm93bmVyRG9jdW1lbnQpJiZpLmRlZmF1bHRWaWV3fHx3aW5kb3cpLmdldFNlbGVjdGlvbiYmaS5nZXRTZWxlY3Rpb24oKTtpZihhJiYwIT09YS5yYW5nZUNvdW50KXtpPWEuYW5jaG9yTm9kZTt2YXIgdT1hLmFuY2hvck9mZnNldCxfPWEuZm9jdXNOb2RlO2E9YS5mb2N1c09mZnNldDt0cnl7aS5ub2RlVHlwZSxfLm5vZGVUeXBlfWNhdGNoKHMpe2k9bnVsbDticmVhayBlfXZhciB3PTAseD0tMSxDPS0xLGo9MCxMPTAsQj1zLCQ9bnVsbDt0OmZvcig7Oyl7Zm9yKHZhciBVO0IhPT1pfHwwIT09dSYmMyE9PUIubm9kZVR5cGV8fCh4PXcrdSksQiE9PV98fDAhPT1hJiYzIT09Qi5ub2RlVHlwZXx8KEM9dythKSwzPT09Qi5ub2RlVHlwZSYmKHcrPUIubm9kZVZhbHVlLmxlbmd0aCksbnVsbCE9PShVPUIuZmlyc3RDaGlsZCk7KSQ9QixCPVU7Zm9yKDs7KXtpZihCPT09cylicmVhayB0O2lmKCQ9PT1pJiYrK2o9PT11JiYoeD13KSwkPT09XyYmKytMPT09YSYmKEM9dyksbnVsbCE9PShVPUIubmV4dFNpYmxpbmcpKWJyZWFrOyQ9KEI9JCkucGFyZW50Tm9kZX1CPVV9aT0tMT09PXh8fC0xPT09Qz9udWxsOntzdGFydDp4LGVuZDpDfX1lbHNlIGk9bnVsbH1pPWl8fHtzdGFydDowLGVuZDowfX1lbHNlIGk9bnVsbDtmb3Iob249e2ZvY3VzZWRFbGVtOnMsc2VsZWN0aW9uUmFuZ2U6aX0sVnQ9ITEsQXM9bztudWxsIT09QXM7KWlmKHM9KG89QXMpLmNoaWxkLDEwMjgmby5zdWJ0cmVlRmxhZ3MmJm51bGwhPT1zKXMucmV0dXJuPW8sQXM9cztlbHNlIGZvcig7bnVsbCE9PUFzOyl7bz1Bczt0cnl7dmFyIFY9by5hbHRlcm5hdGU7aWYoMTAyNCZvLmZsYWdzKXN3aXRjaChvLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpjYXNlIDU6Y2FzZSA2OmNhc2UgNDpjYXNlIDE3OmJyZWFrO2Nhc2UgMTppZihudWxsIT09Vil7dmFyIHo9Vi5tZW1vaXplZFByb3BzLFk9Vi5tZW1vaXplZFN0YXRlLFo9by5zdGF0ZU5vZGUsZWU9Wi5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShvLmVsZW1lbnRUeXBlPT09by50eXBlP3o6Q2koby50eXBlLHopLFkpO1ouX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9ZWV9YnJlYWs7Y2FzZSAzOnZhciBpZT1vLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOzE9PT1pZS5ub2RlVHlwZT9pZS50ZXh0Q29udGVudD0iIjo5PT09aWUubm9kZVR5cGUmJmllLmRvY3VtZW50RWxlbWVudCYmaWUucmVtb3ZlQ2hpbGQoaWUuZG9jdW1lbnRFbGVtZW50KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHAoMTYzKSl9fWNhdGNoKHMpe1cobyxvLnJldHVybixzKX1pZihudWxsIT09KHM9by5zaWJsaW5nKSl7cy5yZXR1cm49by5yZXR1cm4sQXM9czticmVha31Bcz1vLnJldHVybn1yZXR1cm4gVj1DcyxDcz0hMSxWfShzLGkpLGRrKGkscyksT2Uob24pLFZ0PSEhc24sb249c249bnVsbCxzLmN1cnJlbnQ9aSxoayhpLHMsdSkscHQoKSxEcz14LEF0PXcsUnMudHJhbnNpdGlvbj1ffWVsc2Ugcy5jdXJyZW50PWk7aWYodG8mJih0bz0hMSxybz1zLG5vPXUpLF89cy5wZW5kaW5nTGFuZXMsMD09PV8mJihlbz1udWxsKSxmdW5jdGlvbiBtYyhzKXtpZihfdCYmImZ1bmN0aW9uIj09dHlwZW9mIF90Lm9uQ29tbWl0RmliZXJSb290KXRyeXtfdC5vbkNvbW1pdEZpYmVyUm9vdChTdCxzLHZvaWQgMCwhKDEyOCZ+cy5jdXJyZW50LmZsYWdzKSl9Y2F0Y2gocyl7fX0oaS5zdGF0ZU5vZGUpLERrKHMsaHQoKSksbnVsbCE9PW8pZm9yKGE9cy5vblJlY292ZXJhYmxlRXJyb3IsaT0wO2k8by5sZW5ndGg7aSsrKXU9b1tpXSxhKHUudmFsdWUse2NvbXBvbmVudFN0YWNrOnUuc3RhY2ssZGlnZXN0OnUuZGlnZXN0fSk7aWYoUXMpdGhyb3cgUXM9ITEscz1acyxacz1udWxsLHM7cmV0dXJuISEoMSZubykmJjAhPT1zLnRhZyYmSGsoKSxfPXMucGVuZGluZ0xhbmVzLDEmXz9zPT09b28/c28rKzooc289MCxvbz1zKTpzbz0wLGpnKCksbnVsbH0ocyxvLGksYSl9ZmluYWxseXtScy50cmFuc2l0aW9uPXUsQXQ9YX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBIaygpe2lmKG51bGwhPT1ybyl7dmFyIHM9RGMobm8pLG89UnMudHJhbnNpdGlvbixpPUF0O3RyeXtpZihScy50cmFuc2l0aW9uPW51bGwsQXQ9MTY+cz8xNjpzLG51bGw9PT1ybyl2YXIgYT0hMTtlbHNle2lmKHM9cm8scm89bnVsbCxubz0wLDYmRHMpdGhyb3cgRXJyb3IocCgzMzEpKTt2YXIgdT1Ecztmb3IoRHN8PTQsQXM9cy5jdXJyZW50O251bGwhPT1Bczspe3ZhciBfPUFzLHc9Xy5jaGlsZDtpZigxNiZBcy5mbGFncyl7dmFyIHg9Xy5kZWxldGlvbnM7aWYobnVsbCE9PXgpe2Zvcih2YXIgQz0wO0M8eC5sZW5ndGg7QysrKXt2YXIgaj14W0NdO2ZvcihBcz1qO251bGwhPT1Bczspe3ZhciBMPUFzO3N3aXRjaChMLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpQaig4LEwsXyl9dmFyIEI9TC5jaGlsZDtpZihudWxsIT09QilCLnJldHVybj1MLEFzPUI7ZWxzZSBmb3IoO251bGwhPT1Bczspe3ZhciAkPShMPUFzKS5zaWJsaW5nLFU9TC5yZXR1cm47aWYoU2ooTCksTD09PWope0FzPW51bGw7YnJlYWt9aWYobnVsbCE9PSQpeyQucmV0dXJuPVUsQXM9JDticmVha31Bcz1VfX19dmFyIFY9Xy5hbHRlcm5hdGU7aWYobnVsbCE9PVYpe3ZhciB6PVYuY2hpbGQ7aWYobnVsbCE9PXope1YuY2hpbGQ9bnVsbDtkb3t2YXIgWT16LnNpYmxpbmc7ei5zaWJsaW5nPW51bGwsej1ZfXdoaWxlKG51bGwhPT16KX19QXM9X319aWYoMjA2NCZfLnN1YnRyZWVGbGFncyYmbnVsbCE9PXcpdy5yZXR1cm49XyxBcz13O2Vsc2UgZTpmb3IoO251bGwhPT1Bczspe2lmKDIwNDgmKF89QXMpLmZsYWdzKXN3aXRjaChfLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpQaig5LF8sXy5yZXR1cm4pfXZhciBaPV8uc2libGluZztpZihudWxsIT09Wil7Wi5yZXR1cm49Xy5yZXR1cm4sQXM9WjticmVhayBlfUFzPV8ucmV0dXJufX12YXIgZWU9cy5jdXJyZW50O2ZvcihBcz1lZTtudWxsIT09QXM7KXt2YXIgaWU9KHc9QXMpLmNoaWxkO2lmKDIwNjQmdy5zdWJ0cmVlRmxhZ3MmJm51bGwhPT1pZSlpZS5yZXR1cm49dyxBcz1pZTtlbHNlIGU6Zm9yKHc9ZWU7bnVsbCE9PUFzOyl7aWYoMjA0OCYoeD1BcykuZmxhZ3MpdHJ5e3N3aXRjaCh4LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpRaig5LHgpfX1jYXRjaChzKXtXKHgseC5yZXR1cm4scyl9aWYoeD09PXcpe0FzPW51bGw7YnJlYWsgZX12YXIgYWU9eC5zaWJsaW5nO2lmKG51bGwhPT1hZSl7YWUucmV0dXJuPXgucmV0dXJuLEFzPWFlO2JyZWFrIGV9QXM9eC5yZXR1cm59fWlmKERzPXUsamcoKSxfdCYmImZ1bmN0aW9uIj09dHlwZW9mIF90Lm9uUG9zdENvbW1pdEZpYmVyUm9vdCl0cnl7X3Qub25Qb3N0Q29tbWl0RmliZXJSb290KFN0LHMpfWNhdGNoKHMpe31hPSEwfXJldHVybiBhfWZpbmFsbHl7QXQ9aSxScy50cmFuc2l0aW9uPW99fXJldHVybiExfWZ1bmN0aW9uIFhrKHMsbyxpKXtzPW5oKHMsbz1OaSgwLG89SmkoaSxvKSwxKSwxKSxvPVIoKSxudWxsIT09cyYmKEFjKHMsMSxvKSxEayhzLG8pKX1mdW5jdGlvbiBXKHMsbyxpKXtpZigzPT09cy50YWcpWGsocyxzLGkpO2Vsc2UgZm9yKDtudWxsIT09bzspe2lmKDM9PT1vLnRhZyl7WGsobyxzLGkpO2JyZWFrfWlmKDE9PT1vLnRhZyl7dmFyIGE9by5zdGF0ZU5vZGU7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8udHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3J8fCJmdW5jdGlvbiI9PXR5cGVvZiBhLmNvbXBvbmVudERpZENhdGNoJiYobnVsbD09PWVvfHwhZW8uaGFzKGEpKSl7bz1uaChvLHM9UWkobyxzPUppKGkscyksMSksMSkscz1SKCksbnVsbCE9PW8mJihBYyhvLDEscyksRGsobyxzKSk7YnJlYWt9fW89by5yZXR1cm59fWZ1bmN0aW9uIFRpKHMsbyxpKXt2YXIgYT1zLnBpbmdDYWNoZTtudWxsIT09YSYmYS5kZWxldGUobyksbz1SKCkscy5waW5nZWRMYW5lc3w9cy5zdXNwZW5kZWRMYW5lcyZpLExzPT09cyYmKEJzJmkpPT09aSYmKDQ9PT1Vc3x8Mz09PVVzJiYoMTMwMDIzNDI0JkJzKT09PUJzJiY1MDA+aHQoKS1Hcz9LayhzLDApOkpzfD1pKSxEayhzLG8pfWZ1bmN0aW9uIFlrKHMsbyl7MD09PW8mJigxJnMubW9kZT8obz1PdCwhKDEzMDAyMzQyNCYoT3Q8PD0xKSkmJihPdD00MTk0MzA0KSk6bz0xKTt2YXIgaT1SKCk7bnVsbCE9PShzPWloKHMsbykpJiYoQWMocyxvLGkpLERrKHMsaSkpfWZ1bmN0aW9uIHVqKHMpe3ZhciBvPXMubWVtb2l6ZWRTdGF0ZSxpPTA7bnVsbCE9PW8mJihpPW8ucmV0cnlMYW5lKSxZayhzLGkpfWZ1bmN0aW9uIGJrKHMsbyl7dmFyIGk9MDtzd2l0Y2gocy50YWcpe2Nhc2UgMTM6dmFyIGE9cy5zdGF0ZU5vZGUsdT1zLm1lbW9pemVkU3RhdGU7bnVsbCE9PXUmJihpPXUucmV0cnlMYW5lKTticmVhaztjYXNlIDE5OmE9cy5zdGF0ZU5vZGU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihwKDMxNCkpfW51bGwhPT1hJiZhLmRlbGV0ZShvKSxZayhzLGkpfWZ1bmN0aW9uIEZrKHMsbyl7cmV0dXJuIGN0KHMsbyl9ZnVuY3Rpb24gJGsocyxvLGksYSl7dGhpcy50YWc9cyx0aGlzLmtleT1pLHRoaXMuc2libGluZz10aGlzLmNoaWxkPXRoaXMucmV0dXJuPXRoaXMuc3RhdGVOb2RlPXRoaXMudHlwZT10aGlzLmVsZW1lbnRUeXBlPW51bGwsdGhpcy5pbmRleD0wLHRoaXMucmVmPW51bGwsdGhpcy5wZW5kaW5nUHJvcHM9byx0aGlzLmRlcGVuZGVuY2llcz10aGlzLm1lbW9pemVkU3RhdGU9dGhpcy51cGRhdGVRdWV1ZT10aGlzLm1lbW9pemVkUHJvcHM9bnVsbCx0aGlzLm1vZGU9YSx0aGlzLnN1YnRyZWVGbGFncz10aGlzLmZsYWdzPTAsdGhpcy5kZWxldGlvbnM9bnVsbCx0aGlzLmNoaWxkTGFuZXM9dGhpcy5sYW5lcz0wLHRoaXMuYWx0ZXJuYXRlPW51bGx9ZnVuY3Rpb24gQmcocyxvLGksYSl7cmV0dXJuIG5ldyAkayhzLG8saSxhKX1mdW5jdGlvbiBhaihzKXtyZXR1cm4hKCEocz1zLnByb3RvdHlwZSl8fCFzLmlzUmVhY3RDb21wb25lbnQpfWZ1bmN0aW9uIFBnKHMsbyl7dmFyIGk9cy5hbHRlcm5hdGU7cmV0dXJuIG51bGw9PT1pPygoaT1CZyhzLnRhZyxvLHMua2V5LHMubW9kZSkpLmVsZW1lbnRUeXBlPXMuZWxlbWVudFR5cGUsaS50eXBlPXMudHlwZSxpLnN0YXRlTm9kZT1zLnN0YXRlTm9kZSxpLmFsdGVybmF0ZT1zLHMuYWx0ZXJuYXRlPWkpOihpLnBlbmRpbmdQcm9wcz1vLGkudHlwZT1zLnR5cGUsaS5mbGFncz0wLGkuc3VidHJlZUZsYWdzPTAsaS5kZWxldGlvbnM9bnVsbCksaS5mbGFncz0xNDY4MDA2NCZzLmZsYWdzLGkuY2hpbGRMYW5lcz1zLmNoaWxkTGFuZXMsaS5sYW5lcz1zLmxhbmVzLGkuY2hpbGQ9cy5jaGlsZCxpLm1lbW9pemVkUHJvcHM9cy5tZW1vaXplZFByb3BzLGkubWVtb2l6ZWRTdGF0ZT1zLm1lbW9pemVkU3RhdGUsaS51cGRhdGVRdWV1ZT1zLnVwZGF0ZVF1ZXVlLG89cy5kZXBlbmRlbmNpZXMsaS5kZXBlbmRlbmNpZXM9bnVsbD09PW8/bnVsbDp7bGFuZXM6by5sYW5lcyxmaXJzdENvbnRleHQ6by5maXJzdENvbnRleHR9LGkuc2libGluZz1zLnNpYmxpbmcsaS5pbmRleD1zLmluZGV4LGkucmVmPXMucmVmLGl9ZnVuY3Rpb24gUmcocyxvLGksYSx1LF8pe3ZhciB3PTI7aWYoYT1zLCJmdW5jdGlvbiI9PXR5cGVvZiBzKWFqKHMpJiYodz0xKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2Ygcyl3PTU7ZWxzZSBlOnN3aXRjaChzKXtjYXNlIFo6cmV0dXJuIFRnKGkuY2hpbGRyZW4sdSxfLG8pO2Nhc2UgZWU6dz04LHV8PTg7YnJlYWs7Y2FzZSBpZTpyZXR1cm4ocz1CZygxMixpLG8sMnx1KSkuZWxlbWVudFR5cGU9aWUscy5sYW5lcz1fLHM7Y2FzZSBwZTpyZXR1cm4ocz1CZygxMyxpLG8sdSkpLmVsZW1lbnRUeXBlPXBlLHMubGFuZXM9XyxzO2Nhc2UgZGU6cmV0dXJuKHM9QmcoMTksaSxvLHUpKS5lbGVtZW50VHlwZT1kZSxzLmxhbmVzPV8scztjYXNlIGJlOnJldHVybiBwaihpLHUsXyxvKTtkZWZhdWx0OmlmKCJvYmplY3QiPT10eXBlb2YgcyYmbnVsbCE9PXMpc3dpdGNoKHMuJCR0eXBlb2Ype2Nhc2UgYWU6dz0xMDticmVhayBlO2Nhc2UgY2U6dz05O2JyZWFrIGU7Y2FzZSBsZTp3PTExO2JyZWFrIGU7Y2FzZSBmZTp3PTE0O2JyZWFrIGU7Y2FzZSB5ZTp3PTE2LGE9bnVsbDticmVhayBlfXRocm93IEVycm9yKHAoMTMwLG51bGw9PXM/czp0eXBlb2YgcywiIikpfXJldHVybihvPUJnKHcsaSxvLHUpKS5lbGVtZW50VHlwZT1zLG8udHlwZT1hLG8ubGFuZXM9XyxvfWZ1bmN0aW9uIFRnKHMsbyxpLGEpe3JldHVybihzPUJnKDcscyxhLG8pKS5sYW5lcz1pLHN9ZnVuY3Rpb24gcGoocyxvLGksYSl7cmV0dXJuKHM9QmcoMjIscyxhLG8pKS5lbGVtZW50VHlwZT1iZSxzLmxhbmVzPWkscy5zdGF0ZU5vZGU9e2lzSGlkZGVuOiExfSxzfWZ1bmN0aW9uIFFnKHMsbyxpKXtyZXR1cm4ocz1CZyg2LHMsbnVsbCxvKSkubGFuZXM9aSxzfWZ1bmN0aW9uIFNnKHMsbyxpKXtyZXR1cm4obz1CZyg0LG51bGwhPT1zLmNoaWxkcmVuP3MuY2hpbGRyZW46W10scy5rZXksbykpLmxhbmVzPWksby5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86cy5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOnMuaW1wbGVtZW50YXRpb259LG99ZnVuY3Rpb24gYWwocyxvLGksYSx1KXt0aGlzLnRhZz1vLHRoaXMuY29udGFpbmVySW5mbz1zLHRoaXMuZmluaXNoZWRXb3JrPXRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsLHRoaXMudGltZW91dEhhbmRsZT0tMSx0aGlzLmNhbGxiYWNrTm9kZT10aGlzLnBlbmRpbmdDb250ZXh0PXRoaXMuY29udGV4dD1udWxsLHRoaXMuY2FsbGJhY2tQcmlvcml0eT0wLHRoaXMuZXZlbnRUaW1lcz16YygwKSx0aGlzLmV4cGlyYXRpb25UaW1lcz16YygtMSksdGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wLHRoaXMuZW50YW5nbGVtZW50cz16YygwKSx0aGlzLmlkZW50aWZpZXJQcmVmaXg9YSx0aGlzLm9uUmVjb3ZlcmFibGVFcnJvcj11LHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1udWxsfWZ1bmN0aW9uIGJsKHMsbyxpLGEsdSxfLHcseCxDKXtyZXR1cm4gcz1uZXcgYWwocyxvLGkseCxDKSwxPT09bz8obz0xLCEwPT09XyYmKG98PTgpKTpvPTAsXz1CZygzLG51bGwsbnVsbCxvKSxzLmN1cnJlbnQ9XyxfLnN0YXRlTm9kZT1zLF8ubWVtb2l6ZWRTdGF0ZT17ZWxlbWVudDphLGlzRGVoeWRyYXRlZDppLGNhY2hlOm51bGwsdHJhbnNpdGlvbnM6bnVsbCxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOm51bGx9LGtoKF8pLHN9ZnVuY3Rpb24gZGwocyl7aWYoIXMpcmV0dXJuIFNuO2U6e2lmKFZiKHM9cy5fcmVhY3RJbnRlcm5hbHMpIT09c3x8MSE9PXMudGFnKXRocm93IEVycm9yKHAoMTcwKSk7dmFyIG89cztkb3tzd2l0Y2goby50YWcpe2Nhc2UgMzpvPW8uc3RhdGVOb2RlLmNvbnRleHQ7YnJlYWsgZTtjYXNlIDE6aWYoWmYoby50eXBlKSl7bz1vLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDticmVhayBlfX1vPW8ucmV0dXJufXdoaWxlKG51bGwhPT1vKTt0aHJvdyBFcnJvcihwKDE3MSkpfWlmKDE9PT1zLnRhZyl7dmFyIGk9cy50eXBlO2lmKFpmKGkpKXJldHVybiBiZyhzLGksbyl9cmV0dXJuIG99ZnVuY3Rpb24gZWwocyxvLGksYSx1LF8sdyx4LEMpe3JldHVybihzPWJsKGksYSwhMCxzLDAsXywwLHgsQykpLmNvbnRleHQ9ZGwobnVsbCksaT1zLmN1cnJlbnQsKF89bWgoYT1SKCksdT15aShpKSkpLmNhbGxiYWNrPW51bGwhPW8/bzpudWxsLG5oKGksXyx1KSxzLmN1cnJlbnQubGFuZXM9dSxBYyhzLHUsYSksRGsocyxhKSxzfWZ1bmN0aW9uIGZsKHMsbyxpLGEpe3ZhciB1PW8uY3VycmVudCxfPVIoKSx3PXlpKHUpO3JldHVybiBpPWRsKGkpLG51bGw9PT1vLmNvbnRleHQ/by5jb250ZXh0PWk6by5wZW5kaW5nQ29udGV4dD1pLChvPW1oKF8sdykpLnBheWxvYWQ9e2VsZW1lbnQ6c30sbnVsbCE9PShhPXZvaWQgMD09PWE/bnVsbDphKSYmKG8uY2FsbGJhY2s9YSksbnVsbCE9PShzPW5oKHUsbyx3KSkmJihnaShzLHUsdyxfKSxvaChzLHUsdykpLHd9ZnVuY3Rpb24gZ2wocyl7cmV0dXJuKHM9cy5jdXJyZW50KS5jaGlsZD8ocy5jaGlsZC50YWcscy5jaGlsZC5zdGF0ZU5vZGUpOm51bGx9ZnVuY3Rpb24gaGwocyxvKXtpZihudWxsIT09KHM9cy5tZW1vaXplZFN0YXRlKSYmbnVsbCE9PXMuZGVoeWRyYXRlZCl7dmFyIGk9cy5yZXRyeUxhbmU7cy5yZXRyeUxhbmU9MCE9PWkmJmk8bz9pOm99fWZ1bmN0aW9uIGlsKHMsbyl7aGwocyxvKSwocz1zLmFsdGVybmF0ZSkmJmhsKHMsbyl9SXM9ZnVuY3Rpb24ocyxvLGkpe2lmKG51bGwhPT1zKWlmKHMubWVtb2l6ZWRQcm9wcyE9PW8ucGVuZGluZ1Byb3BzfHxFbi5jdXJyZW50KWJzPSEwO2Vsc2V7aWYoIShzLmxhbmVzJml8fDEyOCZvLmZsYWdzKSlyZXR1cm4gYnM9ITEsZnVuY3Rpb24geWoocyxvLGkpe3N3aXRjaChvLnRhZyl7Y2FzZSAzOmtqKG8pLElnKCk7YnJlYWs7Y2FzZSA1OkFoKG8pO2JyZWFrO2Nhc2UgMTpaZihvLnR5cGUpJiZjZyhvKTticmVhaztjYXNlIDQ6eWgobyxvLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTticmVhaztjYXNlIDEwOnZhciBhPW8udHlwZS5fY29udGV4dCx1PW8ubWVtb2l6ZWRQcm9wcy52YWx1ZTtHKFZuLGEuX2N1cnJlbnRWYWx1ZSksYS5fY3VycmVudFZhbHVlPXU7YnJlYWs7Y2FzZSAxMzppZihudWxsIT09KGE9by5tZW1vaXplZFN0YXRlKSlyZXR1cm4gbnVsbCE9PWEuZGVoeWRyYXRlZD8oRyhabiwxJlpuLmN1cnJlbnQpLG8uZmxhZ3N8PTEyOCxudWxsKTppJm8uY2hpbGQuY2hpbGRMYW5lcz9vaihzLG8saSk6KEcoWm4sMSZabi5jdXJyZW50KSxudWxsIT09KHM9WmkocyxvLGkpKT9zLnNpYmxpbmc6bnVsbCk7RyhabiwxJlpuLmN1cnJlbnQpO2JyZWFrO2Nhc2UgMTk6aWYoYT0hIShpJm8uY2hpbGRMYW5lcyksMTI4JnMuZmxhZ3Mpe2lmKGEpcmV0dXJuIHhqKHMsbyxpKTtvLmZsYWdzfD0xMjh9aWYobnVsbCE9PSh1PW8ubWVtb2l6ZWRTdGF0ZSkmJih1LnJlbmRlcmluZz1udWxsLHUudGFpbD1udWxsLHUubGFzdEVmZmVjdD1udWxsKSxHKFpuLFpuLmN1cnJlbnQpLGEpYnJlYWs7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBvLmxhbmVzPTAsZGoocyxvLGkpfXJldHVybiBaaShzLG8saSl9KHMsbyxpKTticz0hISgxMzEwNzImcy5mbGFncyl9ZWxzZSBicz0hMSxGbiYmMTA0ODU3NiZvLmZsYWdzJiZ1ZyhvLFBuLG8uaW5kZXgpO3N3aXRjaChvLmxhbmVzPTAsby50YWcpe2Nhc2UgMjp2YXIgYT1vLnR5cGU7aWoocyxvKSxzPW8ucGVuZGluZ1Byb3BzO3ZhciB1PVlmKG8sX24uY3VycmVudCk7Y2gobyxpKSx1PU5oKG51bGwsbyxhLHMsdSxpKTt2YXIgXz1TaCgpO3JldHVybiBvLmZsYWdzfD0xLCJvYmplY3QiPT10eXBlb2YgdSYmbnVsbCE9PXUmJiJmdW5jdGlvbiI9PXR5cGVvZiB1LnJlbmRlciYmdm9pZCAwPT09dS4kJHR5cGVvZj8oby50YWc9MSxvLm1lbW9pemVkU3RhdGU9bnVsbCxvLnVwZGF0ZVF1ZXVlPW51bGwsWmYoYSk/KF89ITAsY2cobykpOl89ITEsby5tZW1vaXplZFN0YXRlPW51bGwhPT11LnN0YXRlJiZ2b2lkIDAhPT11LnN0YXRlP3Uuc3RhdGU6bnVsbCxraChvKSx1LnVwZGF0ZXI9Z3Msby5zdGF0ZU5vZGU9dSx1Ll9yZWFjdEludGVybmFscz1vLElpKG8sYSxzLGkpLG89amoobnVsbCxvLGEsITAsXyxpKSk6KG8udGFnPTAsRm4mJl8mJnZnKG8pLFhpKG51bGwsbyx1LGkpLG89by5jaGlsZCksbztjYXNlIDE2OmE9by5lbGVtZW50VHlwZTtlOntzd2l0Y2goaWoocyxvKSxzPW8ucGVuZGluZ1Byb3BzLGE9KHU9YS5faW5pdCkoYS5fcGF5bG9hZCksby50eXBlPWEsdT1vLnRhZz1mdW5jdGlvbiBaayhzKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgcylyZXR1cm4gYWoocyk/MTowO2lmKG51bGwhPXMpe2lmKChzPXMuJCR0eXBlb2YpPT09bGUpcmV0dXJuIDExO2lmKHM9PT1mZSlyZXR1cm4gMTR9cmV0dXJuIDJ9KGEpLHM9Q2koYSxzKSx1KXtjYXNlIDA6bz1jaihudWxsLG8sYSxzLGkpO2JyZWFrIGU7Y2FzZSAxOm89aGoobnVsbCxvLGEscyxpKTticmVhayBlO2Nhc2UgMTE6bz1ZaShudWxsLG8sYSxzLGkpO2JyZWFrIGU7Y2FzZSAxNDpvPSRpKG51bGwsbyxhLENpKGEudHlwZSxzKSxpKTticmVhayBlfXRocm93IEVycm9yKHAoMzA2LGEsIiIpKX1yZXR1cm4gbztjYXNlIDA6cmV0dXJuIGE9by50eXBlLHU9by5wZW5kaW5nUHJvcHMsY2oocyxvLGEsdT1vLmVsZW1lbnRUeXBlPT09YT91OkNpKGEsdSksaSk7Y2FzZSAxOnJldHVybiBhPW8udHlwZSx1PW8ucGVuZGluZ1Byb3BzLGhqKHMsbyxhLHU9by5lbGVtZW50VHlwZT09PWE/dTpDaShhLHUpLGkpO2Nhc2UgMzplOntpZihraihvKSxudWxsPT09cyl0aHJvdyBFcnJvcihwKDM4NykpO2E9by5wZW5kaW5nUHJvcHMsdT0oXz1vLm1lbW9pemVkU3RhdGUpLmVsZW1lbnQsbGgocyxvKSxxaChvLGEsbnVsbCxpKTt2YXIgdz1vLm1lbW9pemVkU3RhdGU7aWYoYT13LmVsZW1lbnQsXy5pc0RlaHlkcmF0ZWQpe2lmKF89e2VsZW1lbnQ6YSxpc0RlaHlkcmF0ZWQ6ITEsY2FjaGU6dy5jYWNoZSxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOncucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyx0cmFuc2l0aW9uczp3LnRyYW5zaXRpb25zfSxvLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1fLG8ubWVtb2l6ZWRTdGF0ZT1fLDI1NiZvLmZsYWdzKXtvPWxqKHMsbyxhLGksdT1KaShFcnJvcihwKDQyMykpLG8pKTticmVhayBlfWlmKGEhPT11KXtvPWxqKHMsbyxhLGksdT1KaShFcnJvcihwKDQyNCkpLG8pKTticmVhayBlfWZvcihMbj1MZihvLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLmZpcnN0Q2hpbGQpLERuPW8sRm49ITAsQm49bnVsbCxpPVVuKG8sbnVsbCxhLGkpLG8uY2hpbGQ9aTtpOylpLmZsYWdzPS0zJmkuZmxhZ3N8NDA5NixpPWkuc2libGluZ31lbHNle2lmKElnKCksYT09PXUpe289WmkocyxvLGkpO2JyZWFrIGV9WGkocyxvLGEsaSl9bz1vLmNoaWxkfXJldHVybiBvO2Nhc2UgNTpyZXR1cm4gQWgobyksbnVsbD09PXMmJkVnKG8pLGE9by50eXBlLHU9by5wZW5kaW5nUHJvcHMsXz1udWxsIT09cz9zLm1lbW9pemVkUHJvcHM6bnVsbCx3PXUuY2hpbGRyZW4sRWYoYSx1KT93PW51bGw6bnVsbCE9PV8mJkVmKGEsXykmJihvLmZsYWdzfD0zMiksZ2oocyxvKSxYaShzLG8sdyxpKSxvLmNoaWxkO2Nhc2UgNjpyZXR1cm4gbnVsbD09PXMmJkVnKG8pLG51bGw7Y2FzZSAxMzpyZXR1cm4gb2oocyxvLGkpO2Nhc2UgNDpyZXR1cm4geWgobyxvLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxhPW8ucGVuZGluZ1Byb3BzLG51bGw9PT1zP28uY2hpbGQ9cW4obyxudWxsLGEsaSk6WGkocyxvLGEsaSksby5jaGlsZDtjYXNlIDExOnJldHVybiBhPW8udHlwZSx1PW8ucGVuZGluZ1Byb3BzLFlpKHMsbyxhLHU9by5lbGVtZW50VHlwZT09PWE/dTpDaShhLHUpLGkpO2Nhc2UgNzpyZXR1cm4gWGkocyxvLG8ucGVuZGluZ1Byb3BzLGkpLG8uY2hpbGQ7Y2FzZSA4OmNhc2UgMTI6cmV0dXJuIFhpKHMsbyxvLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixpKSxvLmNoaWxkO2Nhc2UgMTA6ZTp7aWYoYT1vLnR5cGUuX2NvbnRleHQsdT1vLnBlbmRpbmdQcm9wcyxfPW8ubWVtb2l6ZWRQcm9wcyx3PXUudmFsdWUsRyhWbixhLl9jdXJyZW50VmFsdWUpLGEuX2N1cnJlbnRWYWx1ZT13LG51bGwhPT1fKWlmKERyKF8udmFsdWUsdykpe2lmKF8uY2hpbGRyZW49PT11LmNoaWxkcmVuJiYhRW4uY3VycmVudCl7bz1aaShzLG8saSk7YnJlYWsgZX19ZWxzZSBmb3IobnVsbCE9PShfPW8uY2hpbGQpJiYoXy5yZXR1cm49byk7bnVsbCE9PV87KXt2YXIgeD1fLmRlcGVuZGVuY2llcztpZihudWxsIT09eCl7dz1fLmNoaWxkO2Zvcih2YXIgQz14LmZpcnN0Q29udGV4dDtudWxsIT09Qzspe2lmKEMuY29udGV4dD09PWEpe2lmKDE9PT1fLnRhZyl7KEM9bWgoLTEsaSYtaSkpLnRhZz0yO3ZhciBqPV8udXBkYXRlUXVldWU7aWYobnVsbCE9PWope3ZhciBMPShqPWouc2hhcmVkKS5wZW5kaW5nO251bGw9PT1MP0MubmV4dD1DOihDLm5leHQ9TC5uZXh0LEwubmV4dD1DKSxqLnBlbmRpbmc9Q319Xy5sYW5lc3w9aSxudWxsIT09KEM9Xy5hbHRlcm5hdGUpJiYoQy5sYW5lc3w9aSksYmgoXy5yZXR1cm4saSxvKSx4LmxhbmVzfD1pO2JyZWFrfUM9Qy5uZXh0fX1lbHNlIGlmKDEwPT09Xy50YWcpdz1fLnR5cGU9PT1vLnR5cGU/bnVsbDpfLmNoaWxkO2Vsc2UgaWYoMTg9PT1fLnRhZyl7aWYobnVsbD09PSh3PV8ucmV0dXJuKSl0aHJvdyBFcnJvcihwKDM0MSkpO3cubGFuZXN8PWksbnVsbCE9PSh4PXcuYWx0ZXJuYXRlKSYmKHgubGFuZXN8PWkpLGJoKHcsaSxvKSx3PV8uc2libGluZ31lbHNlIHc9Xy5jaGlsZDtpZihudWxsIT09dyl3LnJldHVybj1fO2Vsc2UgZm9yKHc9XztudWxsIT09dzspe2lmKHc9PT1vKXt3PW51bGw7YnJlYWt9aWYobnVsbCE9PShfPXcuc2libGluZykpe18ucmV0dXJuPXcucmV0dXJuLHc9XzticmVha313PXcucmV0dXJufV89d31YaShzLG8sdS5jaGlsZHJlbixpKSxvPW8uY2hpbGR9cmV0dXJuIG87Y2FzZSA5OnJldHVybiB1PW8udHlwZSxhPW8ucGVuZGluZ1Byb3BzLmNoaWxkcmVuLGNoKG8saSksYT1hKHU9ZWgodSkpLG8uZmxhZ3N8PTEsWGkocyxvLGEsaSksby5jaGlsZDtjYXNlIDE0OnJldHVybiB1PUNpKGE9by50eXBlLG8ucGVuZGluZ1Byb3BzKSwkaShzLG8sYSx1PUNpKGEudHlwZSx1KSxpKTtjYXNlIDE1OnJldHVybiBiaihzLG8sby50eXBlLG8ucGVuZGluZ1Byb3BzLGkpO2Nhc2UgMTc6cmV0dXJuIGE9by50eXBlLHU9by5wZW5kaW5nUHJvcHMsdT1vLmVsZW1lbnRUeXBlPT09YT91OkNpKGEsdSksaWoocyxvKSxvLnRhZz0xLFpmKGEpPyhzPSEwLGNnKG8pKTpzPSExLGNoKG8saSksR2kobyxhLHUpLElpKG8sYSx1LGkpLGpqKG51bGwsbyxhLCEwLHMsaSk7Y2FzZSAxOTpyZXR1cm4geGoocyxvLGkpO2Nhc2UgMjI6cmV0dXJuIGRqKHMsbyxpKX10aHJvdyBFcnJvcihwKDE1NixvLnRhZykpfTt2YXIgY289ImZ1bmN0aW9uIj09dHlwZW9mIHJlcG9ydEVycm9yP3JlcG9ydEVycm9yOmZ1bmN0aW9uKHMpe2NvbnNvbGUuZXJyb3Iocyl9O2Z1bmN0aW9uIGxsKHMpe3RoaXMuX2ludGVybmFsUm9vdD1zfWZ1bmN0aW9uIG1sKHMpe3RoaXMuX2ludGVybmFsUm9vdD1zfWZ1bmN0aW9uIG5sKHMpe3JldHVybiEoIXN8fDEhPT1zLm5vZGVUeXBlJiY5IT09cy5ub2RlVHlwZSYmMTEhPT1zLm5vZGVUeXBlKX1mdW5jdGlvbiBvbChzKXtyZXR1cm4hKCFzfHwxIT09cy5ub2RlVHlwZSYmOSE9PXMubm9kZVR5cGUmJjExIT09cy5ub2RlVHlwZSYmKDghPT1zLm5vZGVUeXBlfHwiIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlICIhPT1zLm5vZGVWYWx1ZSkpfWZ1bmN0aW9uIHBsKCl7fWZ1bmN0aW9uIHJsKHMsbyxpLGEsdSl7dmFyIF89aS5fcmVhY3RSb290Q29udGFpbmVyO2lmKF8pe3ZhciB3PV87aWYoImZ1bmN0aW9uIj09dHlwZW9mIHUpe3ZhciB4PXU7dT1mdW5jdGlvbigpe3ZhciBzPWdsKHcpO3guY2FsbChzKX19Zmwobyx3LHMsdSl9ZWxzZSB3PWZ1bmN0aW9uIHFsKHMsbyxpLGEsdSl7aWYodSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpe3ZhciBfPWE7YT1mdW5jdGlvbigpe3ZhciBzPWdsKHcpO18uY2FsbChzKX19dmFyIHc9ZWwobyxhLHMsMCxudWxsLCExLDAsIiIscGwpO3JldHVybiBzLl9yZWFjdFJvb3RDb250YWluZXI9dyxzW2ZuXT13LmN1cnJlbnQsc2YoOD09PXMubm9kZVR5cGU/cy5wYXJlbnROb2RlOnMpLFJrKCksd31mb3IoO3U9cy5sYXN0Q2hpbGQ7KXMucmVtb3ZlQ2hpbGQodSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpe3ZhciB4PWE7YT1mdW5jdGlvbigpe3ZhciBzPWdsKEMpO3guY2FsbChzKX19dmFyIEM9YmwocywwLCExLG51bGwsMCwhMSwwLCIiLHBsKTtyZXR1cm4gcy5fcmVhY3RSb290Q29udGFpbmVyPUMsc1tmbl09Qy5jdXJyZW50LHNmKDg9PT1zLm5vZGVUeXBlP3MucGFyZW50Tm9kZTpzKSxSaygoZnVuY3Rpb24oKXtmbChvLEMsaSxhKX0pKSxDfShpLG8scyx1LGEpO3JldHVybiBnbCh3KX1tbC5wcm90b3R5cGUucmVuZGVyPWxsLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24ocyl7dmFyIG89dGhpcy5faW50ZXJuYWxSb290O2lmKG51bGw9PT1vKXRocm93IEVycm9yKHAoNDA5KSk7ZmwocyxvLG51bGwsbnVsbCl9LG1sLnByb3RvdHlwZS51bm1vdW50PWxsLnByb3RvdHlwZS51bm1vdW50PWZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5faW50ZXJuYWxSb290O2lmKG51bGwhPT1zKXt0aGlzLl9pbnRlcm5hbFJvb3Q9bnVsbDt2YXIgbz1zLmNvbnRhaW5lckluZm87UmsoKGZ1bmN0aW9uKCl7ZmwobnVsbCxzLG51bGwsbnVsbCl9KSksb1tmbl09bnVsbH19LG1sLnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbj1mdW5jdGlvbihzKXtpZihzKXt2YXIgbz1JdCgpO3M9e2Jsb2NrZWRPbjpudWxsLHRhcmdldDpzLHByaW9yaXR5Om99O2Zvcih2YXIgaT0wO2k8JHQubGVuZ3RoJiYwIT09byYmbzwkdFtpXS5wcmlvcml0eTtpKyspOyR0LnNwbGljZShpLDAscyksMD09PWkmJlZjKHMpfX0sQ3Q9ZnVuY3Rpb24ocyl7c3dpdGNoKHMudGFnKXtjYXNlIDM6dmFyIG89cy5zdGF0ZU5vZGU7aWYoby5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXt2YXIgaT10YyhvLnBlbmRpbmdMYW5lcyk7MCE9PWkmJihDYyhvLDF8aSksRGsobyxodCgpKSwhKDYmRHMpJiYoWXM9aHQoKSs1MDAsamcoKSkpfWJyZWFrO2Nhc2UgMTM6UmsoKGZ1bmN0aW9uKCl7dmFyIG89aWgocywxKTtpZihudWxsIT09byl7dmFyIGk9UigpO2dpKG8scywxLGkpfX0pKSxpbChzLDEpfX0sanQ9ZnVuY3Rpb24ocyl7aWYoMTM9PT1zLnRhZyl7dmFyIG89aWgocywxMzQyMTc3MjgpO2lmKG51bGwhPT1vKWdpKG8scywxMzQyMTc3MjgsUigpKTtpbChzLDEzNDIxNzcyOCl9fSxQdD1mdW5jdGlvbihzKXtpZigxMz09PXMudGFnKXt2YXIgbz15aShzKSxpPWloKHMsbyk7aWYobnVsbCE9PWkpZ2koaSxzLG8sUigpKTtpbChzLG8pfX0sSXQ9ZnVuY3Rpb24oKXtyZXR1cm4gQXR9LFR0PWZ1bmN0aW9uKHMsbyl7dmFyIGk9QXQ7dHJ5e3JldHVybiBBdD1zLG8oKX1maW5hbGx5e0F0PWl9fSxZZT1mdW5jdGlvbihzLG8saSl7c3dpdGNoKG8pe2Nhc2UiaW5wdXQiOmlmKGJiKHMsaSksbz1pLm5hbWUsInJhZGlvIj09PWkudHlwZSYmbnVsbCE9byl7Zm9yKGk9cztpLnBhcmVudE5vZGU7KWk9aS5wYXJlbnROb2RlO2ZvcihpPWkucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZT0iK0pTT04uc3RyaW5naWZ5KCIiK28pKyddW3R5cGU9InJhZGlvIl0nKSxvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBhPWlbb107aWYoYSE9PXMmJmEuZm9ybT09PXMuZm9ybSl7dmFyIHU9RGIoYSk7aWYoIXUpdGhyb3cgRXJyb3IocCg5MCkpO1dhKGEpLGJiKGEsdSl9fX1icmVhaztjYXNlInRleHRhcmVhIjppYihzLGkpO2JyZWFrO2Nhc2Uic2VsZWN0IjpudWxsIT0obz1pLnZhbHVlKSYmZmIocywhIWkubXVsdGlwbGUsbywhMSl9fSxHYj1RayxIYj1Sazt2YXIgbG89e3VzaW5nQ2xpZW50RW50cnlQb2ludDohMSxFdmVudHM6W0NiLHVlLERiLEViLEZiLFFrXX0sdW89e2ZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOldjLGJ1bmRsZVR5cGU6MCx2ZXJzaW9uOiIxOC4zLjEiLHJlbmRlcmVyUGFja2FnZU5hbWU6InJlYWN0LWRvbSJ9LHBvPXtidW5kbGVUeXBlOnVvLmJ1bmRsZVR5cGUsdmVyc2lvbjp1by52ZXJzaW9uLHJlbmRlcmVyUGFja2FnZU5hbWU6dW8ucmVuZGVyZXJQYWNrYWdlTmFtZSxyZW5kZXJlckNvbmZpZzp1by5yZW5kZXJlckNvbmZpZyxvdmVycmlkZUhvb2tTdGF0ZTpudWxsLG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aDpudWxsLG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aDpudWxsLG92ZXJyaWRlUHJvcHM6bnVsbCxvdmVycmlkZVByb3BzRGVsZXRlUGF0aDpudWxsLG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoOm51bGwsc2V0RXJyb3JIYW5kbGVyOm51bGwsc2V0U3VzcGVuc2VIYW5kbGVyOm51bGwsc2NoZWR1bGVVcGRhdGU6bnVsbCxjdXJyZW50RGlzcGF0Y2hlclJlZjpWLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24ocyl7cmV0dXJuIG51bGw9PT0ocz1aYihzKSk/bnVsbDpzLnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6dW8uZmluZEZpYmVyQnlIb3N0SW5zdGFuY2V8fGZ1bmN0aW9uIGpsKCl7cmV0dXJuIG51bGx9LGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDpudWxsLHNjaGVkdWxlUmVmcmVzaDpudWxsLHNjaGVkdWxlUm9vdDpudWxsLHNldFJlZnJlc2hIYW5kbGVyOm51bGwsZ2V0Q3VycmVudEZpYmVyOm51bGwscmVjb25jaWxlclZlcnNpb246IjE4LjMuMS1uZXh0LWYxMzM4ZjgwODAtMjAyNDA0MjYifTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyl7dmFyIGhvPV9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztpZighaG8uaXNEaXNhYmxlZCYmaG8uc3VwcG9ydHNGaWJlcil0cnl7U3Q9aG8uaW5qZWN0KHBvKSxfdD1ob31jYXRjaChSZSl7fX1vLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPWxvLG8uY3JlYXRlUG9ydGFsPWZ1bmN0aW9uKHMsbyl7dmFyIGk9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7aWYoIW5sKG8pKXRocm93IEVycm9yKHAoMjAwKSk7cmV0dXJuIGZ1bmN0aW9uIGNsKHMsbyxpKXt2YXIgYT0zPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbDtyZXR1cm57JCR0eXBlb2Y6WSxrZXk6bnVsbD09YT9udWxsOiIiK2EsY2hpbGRyZW46cyxjb250YWluZXJJbmZvOm8saW1wbGVtZW50YXRpb246aX19KHMsbyxudWxsLGkpfSxvLmNyZWF0ZVJvb3Q9ZnVuY3Rpb24ocyxvKXtpZighbmwocykpdGhyb3cgRXJyb3IocCgyOTkpKTt2YXIgaT0hMSxhPSIiLHU9Y287cmV0dXJuIG51bGwhPW8mJighMD09PW8udW5zdGFibGVfc3RyaWN0TW9kZSYmKGk9ITApLHZvaWQgMCE9PW8uaWRlbnRpZmllclByZWZpeCYmKGE9by5pZGVudGlmaWVyUHJlZml4KSx2b2lkIDAhPT1vLm9uUmVjb3ZlcmFibGVFcnJvciYmKHU9by5vblJlY292ZXJhYmxlRXJyb3IpKSxvPWJsKHMsMSwhMSxudWxsLDAsaSwwLGEsdSksc1tmbl09by5jdXJyZW50LHNmKDg9PT1zLm5vZGVUeXBlP3MucGFyZW50Tm9kZTpzKSxuZXcgbGwobyl9LG8uZmluZERPTU5vZGU9ZnVuY3Rpb24ocyl7aWYobnVsbD09cylyZXR1cm4gbnVsbDtpZigxPT09cy5ub2RlVHlwZSlyZXR1cm4gczt2YXIgbz1zLl9yZWFjdEludGVybmFscztpZih2b2lkIDA9PT1vKXtpZigiZnVuY3Rpb24iPT10eXBlb2Ygcy5yZW5kZXIpdGhyb3cgRXJyb3IocCgxODgpKTt0aHJvdyBzPU9iamVjdC5rZXlzKHMpLmpvaW4oIiwiKSxFcnJvcihwKDI2OCxzKSl9cmV0dXJuIHM9bnVsbD09PShzPVpiKG8pKT9udWxsOnMuc3RhdGVOb2RlfSxvLmZsdXNoU3luYz1mdW5jdGlvbihzKXtyZXR1cm4gUmsocyl9LG8uaHlkcmF0ZT1mdW5jdGlvbihzLG8saSl7aWYoIW9sKG8pKXRocm93IEVycm9yKHAoMjAwKSk7cmV0dXJuIHJsKG51bGwscyxvLCEwLGkpfSxvLmh5ZHJhdGVSb290PWZ1bmN0aW9uKHMsbyxpKXtpZighbmwocykpdGhyb3cgRXJyb3IocCg0MDUpKTt2YXIgYT1udWxsIT1pJiZpLmh5ZHJhdGVkU291cmNlc3x8bnVsbCx1PSExLF89IiIsdz1jbztpZihudWxsIT1pJiYoITA9PT1pLnVuc3RhYmxlX3N0cmljdE1vZGUmJih1PSEwKSx2b2lkIDAhPT1pLmlkZW50aWZpZXJQcmVmaXgmJihfPWkuaWRlbnRpZmllclByZWZpeCksdm9pZCAwIT09aS5vblJlY292ZXJhYmxlRXJyb3ImJih3PWkub25SZWNvdmVyYWJsZUVycm9yKSksbz1lbChvLG51bGwscywxLG51bGwhPWk/aTpudWxsLHUsMCxfLHcpLHNbZm5dPW8uY3VycmVudCxzZihzKSxhKWZvcihzPTA7czxhLmxlbmd0aDtzKyspdT0odT0oaT1hW3NdKS5fZ2V0VmVyc2lvbikoaS5fc291cmNlKSxudWxsPT1vLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE/by5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtpLHVdOm8ubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKGksdSk7cmV0dXJuIG5ldyBtbChvKX0sby5yZW5kZXI9ZnVuY3Rpb24ocyxvLGkpe2lmKCFvbChvKSl0aHJvdyBFcnJvcihwKDIwMCkpO3JldHVybiBybChudWxsLHMsbywhMSxpKX0sby51bm1vdW50Q29tcG9uZW50QXROb2RlPWZ1bmN0aW9uKHMpe2lmKCFvbChzKSl0aHJvdyBFcnJvcihwKDQwKSk7cmV0dXJuISFzLl9yZWFjdFJvb3RDb250YWluZXImJihSaygoZnVuY3Rpb24oKXtybChudWxsLG51bGwscywhMSwoZnVuY3Rpb24oKXtzLl9yZWFjdFJvb3RDb250YWluZXI9bnVsbCxzW2ZuXT1udWxsfSkpfSkpLCEwKX0sby51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1RayxvLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyPWZ1bmN0aW9uKHMsbyxpLGEpe2lmKCFvbChpKSl0aHJvdyBFcnJvcihwKDIwMCkpO2lmKG51bGw9PXN8fHZvaWQgMD09PXMuX3JlYWN0SW50ZXJuYWxzKXRocm93IEVycm9yKHAoMzgpKTtyZXR1cm4gcmwocyxvLGksITEsYSl9LG8udmVyc2lvbj0iMTguMy4xLW5leHQtZjEzMzhmODA4MC0yMDI0MDQyNiJ9LDQwOTYxKHMsbyxpKXsidXNlIHN0cmljdCI7IWZ1bmN0aW9uIGNoZWNrRENFKCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18mJiJmdW5jdGlvbiI9PXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UpdHJ5e19fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShjaGVja0RDRSl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcihzKX19KCkscy5leHBvcnRzPWkoMjI1NTEpfSwyMjA5KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGEsdT1pKDk0MDQpLF89ZnVuY3Rpb24gcHJvZHVjdGlvblR5cGVDaGVja2VyKCl7aW52YXJpYW50KCExLCJJbW11dGFibGVQcm9wVHlwZXMgdHlwZSBjaGVja2luZyBjb2RlIGlzIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24uIil9O18uaXNSZXF1aXJlZD1fO3ZhciB3PWZ1bmN0aW9uIGdldFByb2R1Y3Rpb25UeXBlQ2hlY2tlcigpe3JldHVybiBffTtmdW5jdGlvbiBnZXRQcm9wVHlwZShzKXt2YXIgbz10eXBlb2YgcztyZXR1cm4gQXJyYXkuaXNBcnJheShzKT8iYXJyYXkiOnMgaW5zdGFuY2VvZiBSZWdFeHA/Im9iamVjdCI6cyBpbnN0YW5jZW9mIHUuSXRlcmFibGU/IkltbXV0YWJsZS4iK3MudG9Tb3VyY2UoKS5zcGxpdCgiICIpWzBdOm99ZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIocyl7ZnVuY3Rpb24gY2hlY2tUeXBlKG8saSxhLHUsXyx3KXtmb3IodmFyIHg9YXJndW1lbnRzLmxlbmd0aCxDPUFycmF5KHg+Nj94LTY6MCksaj02O2o8eDtqKyspQ1tqLTZdPWFyZ3VtZW50c1tqXTtyZXR1cm4gdz13fHxhLHU9dXx8Ijw8YW5vbnltb3VzPj4iLG51bGwhPWlbYV0/cy5hcHBseSh2b2lkIDAsW2ksYSx1LF8sd10uY29uY2F0KEMpKTpvP25ldyBFcnJvcigiUmVxdWlyZWQgIitfKyIgYCIrdysiYCB3YXMgbm90IHNwZWNpZmllZCBpbiBgIit1KyJgLiIpOnZvaWQgMH12YXIgbz1jaGVja1R5cGUuYmluZChudWxsLCExKTtyZXR1cm4gby5pc1JlcXVpcmVkPWNoZWNrVHlwZS5iaW5kKG51bGwsITApLG99ZnVuY3Rpb24gY3JlYXRlSXRlcmFibGVTdWJjbGFzc1R5cGVDaGVja2VyKHMsbyl7cmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZUltbXV0YWJsZVR5cGVDaGVja2VyKHMsbyl7cmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKChmdW5jdGlvbiB2YWxpZGF0ZShpLGEsdSxfLHcpe3ZhciB4PWlbYV07aWYoIW8oeCkpe3ZhciBDPWdldFByb3BUeXBlKHgpO3JldHVybiBuZXcgRXJyb3IoIkludmFsaWQgIitfKyIgYCIrdysiYCBvZiB0eXBlIGAiK0MrImAgc3VwcGxpZWQgdG8gYCIrdSsiYCwgZXhwZWN0ZWQgYCIrcysiYC4iKX1yZXR1cm4gbnVsbH0pKX0oIkl0ZXJhYmxlLiIrcywoZnVuY3Rpb24ocyl7cmV0dXJuIHUuSXRlcmFibGUuaXNJdGVyYWJsZShzKSYmbyhzKX0pKX0oYT17bGlzdE9mOncsbWFwT2Y6dyxvcmRlcmVkTWFwT2Y6dyxzZXRPZjp3LG9yZGVyZWRTZXRPZjp3LHN0YWNrT2Y6dyxpdGVyYWJsZU9mOncscmVjb3JkT2Y6dyxzaGFwZTp3LGNvbnRhaW5zOncsbWFwQ29udGFpbnM6dyxvcmRlcmVkTWFwQ29udGFpbnM6dyxsaXN0Ol8sbWFwOl8sb3JkZXJlZE1hcDpfLHNldDpfLG9yZGVyZWRTZXQ6XyxzdGFjazpfLHNlcTpfLHJlY29yZDpfLGl0ZXJhYmxlOl99KS5pdGVyYWJsZS5pbmRleGVkPWNyZWF0ZUl0ZXJhYmxlU3ViY2xhc3NUeXBlQ2hlY2tlcigiSW5kZXhlZCIsdS5JdGVyYWJsZS5pc0luZGV4ZWQpLGEuaXRlcmFibGUua2V5ZWQ9Y3JlYXRlSXRlcmFibGVTdWJjbGFzc1R5cGVDaGVja2VyKCJLZXllZCIsdS5JdGVyYWJsZS5pc0tleWVkKSxzLmV4cG9ydHM9YX0sMTUyODcocyxvKXsidXNlIHN0cmljdCI7dmFyIGk9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLGE9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksdT1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLF89U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSx3PVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIikseD1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLEM9U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLGo9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxMPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksQj1TeW1ib2wuZm9yKCJyZWFjdC5tZW1vIiksJD1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksVT1TeW1ib2wuaXRlcmF0b3I7dmFyIFY9e2lzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiExfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbigpe319LHo9T2JqZWN0LmFzc2lnbixZPXt9O2Z1bmN0aW9uIEUocyxvLGkpe3RoaXMucHJvcHM9cyx0aGlzLmNvbnRleHQ9byx0aGlzLnJlZnM9WSx0aGlzLnVwZGF0ZXI9aXx8Vn1mdW5jdGlvbiBGKCl7fWZ1bmN0aW9uIEcocyxvLGkpe3RoaXMucHJvcHM9cyx0aGlzLmNvbnRleHQ9byx0aGlzLnJlZnM9WSx0aGlzLnVwZGF0ZXI9aXx8Vn1FLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9LEUucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKHMsbyl7aWYoIm9iamVjdCIhPXR5cGVvZiBzJiYiZnVuY3Rpb24iIT10eXBlb2YgcyYmbnVsbCE9cyl0aHJvdyBFcnJvcigic2V0U3RhdGUoLi4uKTogdGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3IgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuIik7dGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLHMsbywic2V0U3RhdGUiKX0sRS5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24ocyl7dGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLHMsImZvcmNlVXBkYXRlIil9LEYucHJvdG90eXBlPUUucHJvdG90eXBlO3ZhciBaPUcucHJvdG90eXBlPW5ldyBGO1ouY29uc3RydWN0b3I9Ryx6KFosRS5wcm90b3R5cGUpLFouaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIGVlPUFycmF5LmlzQXJyYXksaWU9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxhZT17Y3VycmVudDpudWxsfSxjZT17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIE0ocyxvLGEpe3ZhciB1LF89e30sdz1udWxsLHg9bnVsbDtpZihudWxsIT1vKWZvcih1IGluIHZvaWQgMCE9PW8ucmVmJiYoeD1vLnJlZiksdm9pZCAwIT09by5rZXkmJih3PSIiK28ua2V5KSxvKWllLmNhbGwobyx1KSYmIWNlLmhhc093blByb3BlcnR5KHUpJiYoX1t1XT1vW3VdKTt2YXIgQz1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PUMpXy5jaGlsZHJlbj1hO2Vsc2UgaWYoMTxDKXtmb3IodmFyIGo9QXJyYXkoQyksTD0wO0w8QztMKyspaltMXT1hcmd1bWVudHNbTCsyXTtfLmNoaWxkcmVuPWp9aWYocyYmcy5kZWZhdWx0UHJvcHMpZm9yKHUgaW4gQz1zLmRlZmF1bHRQcm9wcyl2b2lkIDA9PT1fW3VdJiYoX1t1XT1DW3VdKTtyZXR1cm57JCR0eXBlb2Y6aSx0eXBlOnMsa2V5OncscmVmOngscHJvcHM6Xyxfb3duZXI6YWUuY3VycmVudH19ZnVuY3Rpb24gTyhzKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHMmJm51bGwhPT1zJiZzLiQkdHlwZW9mPT09aX12YXIgbGU9L1wvKy9nO2Z1bmN0aW9uIFEocyxvKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHMmJm51bGwhPT1zJiZudWxsIT1zLmtleT9mdW5jdGlvbiBlc2NhcGUocyl7dmFyIG89eyI9IjoiPTAiLCI6IjoiPTIifTtyZXR1cm4iJCIrcy5yZXBsYWNlKC9bPTpdL2csKGZ1bmN0aW9uKHMpe3JldHVybiBvW3NdfSkpfSgiIitzLmtleSk6by50b1N0cmluZygzNil9ZnVuY3Rpb24gUihzLG8sdSxfLHcpe3ZhciB4PXR5cGVvZiBzOyJ1bmRlZmluZWQiIT09eCYmImJvb2xlYW4iIT09eHx8KHM9bnVsbCk7dmFyIEM9ITE7aWYobnVsbD09PXMpQz0hMDtlbHNlIHN3aXRjaCh4KXtjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOkM9ITA7YnJlYWs7Y2FzZSJvYmplY3QiOnN3aXRjaChzLiQkdHlwZW9mKXtjYXNlIGk6Y2FzZSBhOkM9ITB9fWlmKEMpcmV0dXJuIHc9dyhDPXMpLHM9IiI9PT1fPyIuIitRKEMsMCk6XyxlZSh3KT8odT0iIixudWxsIT1zJiYodT1zLnJlcGxhY2UobGUsIiQmLyIpKyIvIiksUih3LG8sdSwiIiwoZnVuY3Rpb24ocyl7cmV0dXJuIHN9KSkpOm51bGwhPXcmJihPKHcpJiYodz1mdW5jdGlvbiBOKHMsbyl7cmV0dXJueyQkdHlwZW9mOmksdHlwZTpzLnR5cGUsa2V5Om8scmVmOnMucmVmLHByb3BzOnMucHJvcHMsX293bmVyOnMuX293bmVyfX0odyx1Kyghdy5rZXl8fEMmJkMua2V5PT09dy5rZXk/IiI6KCIiK3cua2V5KS5yZXBsYWNlKGxlLCIkJi8iKSsiLyIpK3MpKSxvLnB1c2godykpLDE7aWYoQz0wLF89IiI9PT1fPyIuIjpfKyI6IixlZShzKSlmb3IodmFyIGo9MDtqPHMubGVuZ3RoO2orKyl7dmFyIEw9XytRKHg9c1tqXSxqKTtDKz1SKHgsbyx1LEwsdyl9ZWxzZSBpZihMPWZ1bmN0aW9uIEEocyl7cmV0dXJuIG51bGw9PT1zfHwib2JqZWN0IiE9dHlwZW9mIHM/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2Yocz1VJiZzW1VdfHxzWyJAQGl0ZXJhdG9yIl0pP3M6bnVsbH0ocyksImZ1bmN0aW9uIj09dHlwZW9mIEwpZm9yKHM9TC5jYWxsKHMpLGo9MDshKHg9cy5uZXh0KCkpLmRvbmU7KUMrPVIoeD14LnZhbHVlLG8sdSxMPV8rUSh4LGorKyksdyk7ZWxzZSBpZigib2JqZWN0Ij09PXgpdGhyb3cgbz1TdHJpbmcocyksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisoIltvYmplY3QgT2JqZWN0XSI9PT1vPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKHMpLmpvaW4oIiwgIikrIn0iOm8pKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7cmV0dXJuIEN9ZnVuY3Rpb24gUyhzLG8saSl7aWYobnVsbD09cylyZXR1cm4gczt2YXIgYT1bXSx1PTA7cmV0dXJuIFIocyxhLCIiLCIiLChmdW5jdGlvbihzKXtyZXR1cm4gby5jYWxsKGkscyx1KyspfSkpLGF9ZnVuY3Rpb24gVChzKXtpZigtMT09PXMuX3N0YXR1cyl7dmFyIG89cy5fcmVzdWx0OyhvPW8oKSkudGhlbigoZnVuY3Rpb24obyl7MCE9PXMuX3N0YXR1cyYmLTEhPT1zLl9zdGF0dXN8fChzLl9zdGF0dXM9MSxzLl9yZXN1bHQ9byl9KSwoZnVuY3Rpb24obyl7MCE9PXMuX3N0YXR1cyYmLTEhPT1zLl9zdGF0dXN8fChzLl9zdGF0dXM9MixzLl9yZXN1bHQ9byl9KSksLTE9PT1zLl9zdGF0dXMmJihzLl9zdGF0dXM9MCxzLl9yZXN1bHQ9byl9aWYoMT09PXMuX3N0YXR1cylyZXR1cm4gcy5fcmVzdWx0LmRlZmF1bHQ7dGhyb3cgcy5fcmVzdWx0fXZhciBwZT17Y3VycmVudDpudWxsfSxkZT17dHJhbnNpdGlvbjpudWxsfSxmZT17UmVhY3RDdXJyZW50RGlzcGF0Y2hlcjpwZSxSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzpkZSxSZWFjdEN1cnJlbnRPd25lcjphZX07ZnVuY3Rpb24gWCgpe3Rocm93IEVycm9yKCJhY3QoLi4uKSBpcyBub3Qgc3VwcG9ydGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzIG9mIFJlYWN0LiIpfW8uQ2hpbGRyZW49e21hcDpTLGZvckVhY2g6ZnVuY3Rpb24ocyxvLGkpe1MocywoZnVuY3Rpb24oKXtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGkpfSxjb3VudDpmdW5jdGlvbihzKXt2YXIgbz0wO3JldHVybiBTKHMsKGZ1bmN0aW9uKCl7bysrfSkpLG99LHRvQXJyYXk6ZnVuY3Rpb24ocyl7cmV0dXJuIFMocywoZnVuY3Rpb24ocyl7cmV0dXJuIHN9KSl8fFtdfSxvbmx5OmZ1bmN0aW9uKHMpe2lmKCFPKHMpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gc319LG8uQ29tcG9uZW50PUUsby5GcmFnbWVudD11LG8uUHJvZmlsZXI9dyxvLlB1cmVDb21wb25lbnQ9RyxvLlN0cmljdE1vZGU9XyxvLlN1c3BlbnNlPUwsby5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRD1mZSxvLmFjdD1YLG8uY2xvbmVFbGVtZW50PWZ1bmN0aW9uKHMsbyxhKXtpZihudWxsPT1zKXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK3MrIi4iKTt2YXIgdT16KHt9LHMucHJvcHMpLF89cy5rZXksdz1zLnJlZix4PXMuX293bmVyO2lmKG51bGwhPW8pe2lmKHZvaWQgMCE9PW8ucmVmJiYodz1vLnJlZix4PWFlLmN1cnJlbnQpLHZvaWQgMCE9PW8ua2V5JiYoXz0iIitvLmtleSkscy50eXBlJiZzLnR5cGUuZGVmYXVsdFByb3BzKXZhciBDPXMudHlwZS5kZWZhdWx0UHJvcHM7Zm9yKGogaW4gbylpZS5jYWxsKG8saikmJiFjZS5oYXNPd25Qcm9wZXJ0eShqKSYmKHVbal09dm9pZCAwPT09b1tqXSYmdm9pZCAwIT09Qz9DW2pdOm9bal0pfXZhciBqPWFyZ3VtZW50cy5sZW5ndGgtMjtpZigxPT09ail1LmNoaWxkcmVuPWE7ZWxzZSBpZigxPGope0M9QXJyYXkoaik7Zm9yKHZhciBMPTA7TDxqO0wrKylDW0xdPWFyZ3VtZW50c1tMKzJdO3UuY2hpbGRyZW49Q31yZXR1cm57JCR0eXBlb2Y6aSx0eXBlOnMudHlwZSxrZXk6XyxyZWY6dyxwcm9wczp1LF9vd25lcjp4fX0sby5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKHMpe3JldHVybihzPXskJHR5cGVvZjpDLF9jdXJyZW50VmFsdWU6cyxfY3VycmVudFZhbHVlMjpzLF90aHJlYWRDb3VudDowLFByb3ZpZGVyOm51bGwsQ29uc3VtZXI6bnVsbCxfZGVmYXVsdFZhbHVlOm51bGwsX2dsb2JhbE5hbWU6bnVsbH0pLlByb3ZpZGVyPXskJHR5cGVvZjp4LF9jb250ZXh0OnN9LHMuQ29uc3VtZXI9c30sby5jcmVhdGVFbGVtZW50PU0sby5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKHMpe3ZhciBvPU0uYmluZChudWxsLHMpO3JldHVybiBvLnR5cGU9cyxvfSxvLmNyZWF0ZVJlZj1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGx9fSxvLmZvcndhcmRSZWY9ZnVuY3Rpb24ocyl7cmV0dXJueyQkdHlwZW9mOmoscmVuZGVyOnN9fSxvLmlzVmFsaWRFbGVtZW50PU8sby5sYXp5PWZ1bmN0aW9uKHMpe3JldHVybnskJHR5cGVvZjokLF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6c30sX2luaXQ6VH19LG8ubWVtbz1mdW5jdGlvbihzLG8pe3JldHVybnskJHR5cGVvZjpCLHR5cGU6cyxjb21wYXJlOnZvaWQgMD09PW8/bnVsbDpvfX0sby5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24ocyl7dmFyIG89ZGUudHJhbnNpdGlvbjtkZS50cmFuc2l0aW9uPXt9O3RyeXtzKCl9ZmluYWxseXtkZS50cmFuc2l0aW9uPW99fSxvLnVuc3RhYmxlX2FjdD1YLG8udXNlQ2FsbGJhY2s9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gcGUuY3VycmVudC51c2VDYWxsYmFjayhzLG8pfSxvLnVzZUNvbnRleHQ9ZnVuY3Rpb24ocyl7cmV0dXJuIHBlLmN1cnJlbnQudXNlQ29udGV4dChzKX0sby51c2VEZWJ1Z1ZhbHVlPWZ1bmN0aW9uKCl7fSxvLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24ocyl7cmV0dXJuIHBlLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShzKX0sby51c2VFZmZlY3Q9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gcGUuY3VycmVudC51c2VFZmZlY3QocyxvKX0sby51c2VJZD1mdW5jdGlvbigpe3JldHVybiBwZS5jdXJyZW50LnVzZUlkKCl9LG8udXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihzLG8saSl7cmV0dXJuIHBlLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShzLG8saSl9LG8udXNlSW5zZXJ0aW9uRWZmZWN0PWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHBlLmN1cnJlbnQudXNlSW5zZXJ0aW9uRWZmZWN0KHMsbyl9LG8udXNlTGF5b3V0RWZmZWN0PWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHBlLmN1cnJlbnQudXNlTGF5b3V0RWZmZWN0KHMsbyl9LG8udXNlTWVtbz1mdW5jdGlvbihzLG8pe3JldHVybiBwZS5jdXJyZW50LnVzZU1lbW8ocyxvKX0sby51c2VSZWR1Y2VyPWZ1bmN0aW9uKHMsbyxpKXtyZXR1cm4gcGUuY3VycmVudC51c2VSZWR1Y2VyKHMsbyxpKX0sby51c2VSZWY9ZnVuY3Rpb24ocyl7cmV0dXJuIHBlLmN1cnJlbnQudXNlUmVmKHMpfSxvLnVzZVN0YXRlPWZ1bmN0aW9uKHMpe3JldHVybiBwZS5jdXJyZW50LnVzZVN0YXRlKHMpfSxvLnVzZVN5bmNFeHRlcm5hbFN0b3JlPWZ1bmN0aW9uKHMsbyxpKXtyZXR1cm4gcGUuY3VycmVudC51c2VTeW5jRXh0ZXJuYWxTdG9yZShzLG8saSl9LG8udXNlVHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiBwZS5jdXJyZW50LnVzZVRyYW5zaXRpb24oKX0sby52ZXJzaW9uPSIxOC4zLjEifSw5NjU0MChzLG8saSl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz1pKDE1Mjg3KX0sODYwNDgocyl7InVzZSBzdHJpY3QiO3ZhciBvPXt9O2Z1bmN0aW9uIGNyZWF0ZUVycm9yVHlwZShzLGksYSl7YXx8KGE9RXJyb3IpO3ZhciB1PWZ1bmN0aW9uKHMpe2Z1bmN0aW9uIE5vZGVFcnJvcihvLGEsdSl7cmV0dXJuIHMuY2FsbCh0aGlzLGZ1bmN0aW9uIGdldE1lc3NhZ2UocyxvLGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgaT9pOmkocyxvLGEpfShvLGEsdSkpfHx0aGlzfXJldHVybiBmdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzLG8pe3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLHMucHJvdG90eXBlLmNvbnN0cnVjdG9yPXMscy5fX3Byb3RvX189b30oTm9kZUVycm9yLHMpLE5vZGVFcnJvcn0oYSk7dS5wcm90b3R5cGUubmFtZT1hLm5hbWUsdS5wcm90b3R5cGUuY29kZT1zLG9bc109dX1mdW5jdGlvbiBvbmVPZihzLG8pe2lmKEFycmF5LmlzQXJyYXkocykpe3ZhciBpPXMubGVuZ3RoO3JldHVybiBzPXMubWFwKChmdW5jdGlvbihzKXtyZXR1cm4gU3RyaW5nKHMpfSkpLGk+Mj8ib25lIG9mICIuY29uY2F0KG8sIiAiKS5jb25jYXQocy5zbGljZSgwLGktMSkuam9pbigiLCAiKSwiLCBvciAiKStzW2ktMV06Mj09PWk/Im9uZSBvZiAiLmNvbmNhdChvLCIgIikuY29uY2F0KHNbMF0sIiBvciAiKS5jb25jYXQoc1sxXSk6Im9mICIuY29uY2F0KG8sIiAiKS5jb25jYXQoc1swXSl9cmV0dXJuIm9mICIuY29uY2F0KG8sIiAiKS5jb25jYXQoU3RyaW5nKHMpKX1jcmVhdGVFcnJvclR5cGUoIkVSUl9JTlZBTElEX09QVF9WQUxVRSIsKGZ1bmN0aW9uKHMsbyl7cmV0dXJuJ1RoZSB2YWx1ZSAiJytvKyciIGlzIGludmFsaWQgZm9yIG9wdGlvbiAiJytzKyciJ30pLFR5cGVFcnJvciksY3JlYXRlRXJyb3JUeXBlKCJFUlJfSU5WQUxJRF9BUkdfVFlQRSIsKGZ1bmN0aW9uKHMsbyxpKXt2YXIgYSx1O2lmKCJzdHJpbmciPT10eXBlb2YgbyYmZnVuY3Rpb24gc3RhcnRzV2l0aChzLG8saSl7cmV0dXJuIHMuc3Vic3RyKCFpfHxpPDA/MDoraSxvLmxlbmd0aCk9PT1vfShvLCJub3QgIik/KGE9Im11c3Qgbm90IGJlIixvPW8ucmVwbGFjZSgvXm5vdCAvLCIiKSk6YT0ibXVzdCBiZSIsZnVuY3Rpb24gZW5kc1dpdGgocyxvLGkpe3JldHVybih2b2lkIDA9PT1pfHxpPnMubGVuZ3RoKSYmKGk9cy5sZW5ndGgpLHMuc3Vic3RyaW5nKGktby5sZW5ndGgsaSk9PT1vfShzLCIgYXJndW1lbnQiKSl1PSJUaGUgIi5jb25jYXQocywiICIpLmNvbmNhdChhLCIgIikuY29uY2F0KG9uZU9mKG8sInR5cGUiKSk7ZWxzZXt2YXIgXz1mdW5jdGlvbiBpbmNsdWRlcyhzLG8saSl7cmV0dXJuIm51bWJlciIhPXR5cGVvZiBpJiYoaT0wKSwhKGkrby5sZW5ndGg+cy5sZW5ndGgpJiYtMSE9PXMuaW5kZXhPZihvLGkpfShzLCIuIik/InByb3BlcnR5IjoiYXJndW1lbnQiO3U9J1RoZSAiJy5jb25jYXQocywnIiAnKS5jb25jYXQoXywiICIpLmNvbmNhdChhLCIgIikuY29uY2F0KG9uZU9mKG8sInR5cGUiKSl9cmV0dXJuIHUrPSIuIFJlY2VpdmVkIHR5cGUgIi5jb25jYXQodHlwZW9mIGkpfSksVHlwZUVycm9yKSxjcmVhdGVFcnJvclR5cGUoIkVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YiLCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQiLChmdW5jdGlvbihzKXtyZXR1cm4iVGhlICIrcysiIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQifSkpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UiLCJQcmVtYXR1cmUgY2xvc2UiKSxjcmVhdGVFcnJvclR5cGUoIkVSUl9TVFJFQU1fREVTVFJPWUVEIiwoZnVuY3Rpb24ocyl7cmV0dXJuIkNhbm5vdCBjYWxsICIrcysiIGFmdGVyIGEgc3RyZWFtIHdhcyBkZXN0cm95ZWQifSkpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX01VTFRJUExFX0NBTExCQUNLIiwiQ2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzIiksY3JlYXRlRXJyb3JUeXBlKCJFUlJfU1RSRUFNX0NBTk5PVF9QSVBFIiwiQ2Fubm90IHBpcGUsIG5vdCByZWFkYWJsZSIpLGNyZWF0ZUVycm9yVHlwZSgiRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQiLCJ3cml0ZSBhZnRlciBlbmQiKSxjcmVhdGVFcnJvclR5cGUoIkVSUl9TVFJFQU1fTlVMTF9WQUxVRVMiLCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbSIsVHlwZUVycm9yKSxjcmVhdGVFcnJvclR5cGUoIkVSUl9VTktOT1dOX0VOQ09ESU5HIiwoZnVuY3Rpb24ocyl7cmV0dXJuIlVua25vd24gZW5jb2Rpbmc6ICIrc30pLFR5cGVFcnJvciksY3JlYXRlRXJyb3JUeXBlKCJFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UIiwic3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQiKSxzLmV4cG9ydHMuRj1vfSwyNTM4MihzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNjU2MDYpLHU9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHMpe3ZhciBvPVtdO2Zvcih2YXIgaSBpbiBzKW8ucHVzaChpKTtyZXR1cm4gb307cy5leHBvcnRzPUR1cGxleDt2YXIgXz1pKDQ1NDEyKSx3PWkoMTY3MDgpO2koNTY2OTgpKER1cGxleCxfKTtmb3IodmFyIHg9dSh3LnByb3RvdHlwZSksQz0wO0M8eC5sZW5ndGg7QysrKXt2YXIgaj14W0NdO0R1cGxleC5wcm90b3R5cGVbal18fChEdXBsZXgucHJvdG90eXBlW2pdPXcucHJvdG90eXBlW2pdKX1mdW5jdGlvbiBEdXBsZXgocyl7aWYoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSlyZXR1cm4gbmV3IER1cGxleChzKTtfLmNhbGwodGhpcyxzKSx3LmNhbGwodGhpcyxzKSx0aGlzLmFsbG93SGFsZk9wZW49ITAscyYmKCExPT09cy5yZWFkYWJsZSYmKHRoaXMucmVhZGFibGU9ITEpLCExPT09cy53cml0YWJsZSYmKHRoaXMud3JpdGFibGU9ITEpLCExPT09cy5hbGxvd0hhbGZPcGVuJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExLHRoaXMub25jZSgiZW5kIixvbmVuZCkpKX1mdW5jdGlvbiBvbmVuZCgpe3RoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fGEubmV4dFRpY2sob25FbmROVCx0aGlzKX1mdW5jdGlvbiBvbkVuZE5UKHMpe3MuZW5kKCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsIndyaXRhYmxlQnVmZmVyIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KER1cGxleC5wcm90b3R5cGUsIndyaXRhYmxlTGVuZ3RoIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RofX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdXBsZXgucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCl9LHNldDpmdW5jdGlvbiBzZXQocyl7dm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPXMsdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9cyl9fSl9LDYzNjAwKHMsbyxpKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPVBhc3NUaHJvdWdoO3ZhciBhPWkoNzQ2MTApO2Z1bmN0aW9uIFBhc3NUaHJvdWdoKHMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSlyZXR1cm4gbmV3IFBhc3NUaHJvdWdoKHMpO2EuY2FsbCh0aGlzLHMpfWkoNTY2OTgpKFBhc3NUaHJvdWdoLGEpLFBhc3NUaHJvdWdoLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHMsbyxpKXtpKG51bGwscyl9fSw0NTQxMihzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhLHU9aSg2NTYwNik7cy5leHBvcnRzPVJlYWRhYmxlLFJlYWRhYmxlLlJlYWRhYmxlU3RhdGU9UmVhZGFibGVTdGF0ZTtpKDM3MDA3KS5FdmVudEVtaXR0ZXI7dmFyIF89ZnVuY3Rpb24gRUVsaXN0ZW5lckNvdW50KHMsbyl7cmV0dXJuIHMubGlzdGVuZXJzKG8pLmxlbmd0aH0sdz1pKDQwMzQ1KSx4PWkoNDgyODcpLkJ1ZmZlcixDPSh2b2lkIDAhPT1pLmc/aS5nOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fSkuVWludDhBcnJheXx8ZnVuY3Rpb24oKXt9O3ZhciBqLEw9aSg3OTgzOCk7aj1MJiZMLmRlYnVnbG9nP0wuZGVidWdsb2coInN0cmVhbSIpOmZ1bmN0aW9uIGRlYnVnKCl7fTt2YXIgQiwkLFUsVj1pKDgwMzQ1KSx6PWkoNzU4OTYpLFk9aSg2NTI5MSkuZ2V0SGlnaFdhdGVyTWFyayxaPWkoODYwNDgpLkYsZWU9Wi5FUlJfSU5WQUxJRF9BUkdfVFlQRSxpZT1aLkVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YsYWU9Wi5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxjZT1aLkVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlQ7aSg1NjY5OCkoUmVhZGFibGUsdyk7dmFyIGxlPXouZXJyb3JPckRlc3Ryb3kscGU9WyJlcnJvciIsImNsb3NlIiwiZGVzdHJveSIsInBhdXNlIiwicmVzdW1lIl07ZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShzLG8sdSl7YT1hfHxpKDI1MzgyKSxzPXN8fHt9LCJib29sZWFuIiE9dHlwZW9mIHUmJih1PW8gaW5zdGFuY2VvZiBhKSx0aGlzLm9iamVjdE1vZGU9ISFzLm9iamVjdE1vZGUsdSYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhcy5yZWFkYWJsZU9iamVjdE1vZGUpLHRoaXMuaGlnaFdhdGVyTWFyaz1ZKHRoaXMscywicmVhZGFibGVIaWdoV2F0ZXJNYXJrIix1KSx0aGlzLmJ1ZmZlcj1uZXcgVix0aGlzLmxlbmd0aD0wLHRoaXMucGlwZXM9bnVsbCx0aGlzLnBpcGVzQ291bnQ9MCx0aGlzLmZsb3dpbmc9bnVsbCx0aGlzLmVuZGVkPSExLHRoaXMuZW5kRW1pdHRlZD0hMSx0aGlzLnJlYWRpbmc9ITEsdGhpcy5zeW5jPSEwLHRoaXMubmVlZFJlYWRhYmxlPSExLHRoaXMuZW1pdHRlZFJlYWRhYmxlPSExLHRoaXMucmVhZGFibGVMaXN0ZW5pbmc9ITEsdGhpcy5yZXN1bWVTY2hlZHVsZWQ9ITEsdGhpcy5wYXVzZWQ9ITAsdGhpcy5lbWl0Q2xvc2U9ITEhPT1zLmVtaXRDbG9zZSx0aGlzLmF1dG9EZXN0cm95PSEhcy5hdXRvRGVzdHJveSx0aGlzLmRlc3Ryb3llZD0hMSx0aGlzLmRlZmF1bHRFbmNvZGluZz1zLmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMuYXdhaXREcmFpbj0wLHRoaXMucmVhZGluZ01vcmU9ITEsdGhpcy5kZWNvZGVyPW51bGwsdGhpcy5lbmNvZGluZz1udWxsLHMuZW5jb2RpbmcmJihCfHwoQj1pKDgzMTQxKS5JKSx0aGlzLmRlY29kZXI9bmV3IEIocy5lbmNvZGluZyksdGhpcy5lbmNvZGluZz1zLmVuY29kaW5nKX1mdW5jdGlvbiBSZWFkYWJsZShzKXtpZihhPWF8fGkoMjUzODIpLCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSlyZXR1cm4gbmV3IFJlYWRhYmxlKHMpO3ZhciBvPXRoaXMgaW5zdGFuY2VvZiBhO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IFJlYWRhYmxlU3RhdGUocyx0aGlzLG8pLHRoaXMucmVhZGFibGU9ITAscyYmKCJmdW5jdGlvbiI9PXR5cGVvZiBzLnJlYWQmJih0aGlzLl9yZWFkPXMucmVhZCksImZ1bmN0aW9uIj09dHlwZW9mIHMuZGVzdHJveSYmKHRoaXMuX2Rlc3Ryb3k9cy5kZXN0cm95KSksdy5jYWxsKHRoaXMpfWZ1bmN0aW9uIHJlYWRhYmxlQWRkQ2h1bmsocyxvLGksYSx1KXtqKCJyZWFkYWJsZUFkZENodW5rIixvKTt2YXIgXyx3PXMuX3JlYWRhYmxlU3RhdGU7aWYobnVsbD09PW8pdy5yZWFkaW5nPSExLGZ1bmN0aW9uIG9uRW9mQ2h1bmsocyxvKXtpZihqKCJvbkVvZkNodW5rIiksby5lbmRlZClyZXR1cm47aWYoby5kZWNvZGVyKXt2YXIgaT1vLmRlY29kZXIuZW5kKCk7aSYmaS5sZW5ndGgmJihvLmJ1ZmZlci5wdXNoKGkpLG8ubGVuZ3RoKz1vLm9iamVjdE1vZGU/MTppLmxlbmd0aCl9by5lbmRlZD0hMCxvLnN5bmM/ZW1pdFJlYWRhYmxlKHMpOihvLm5lZWRSZWFkYWJsZT0hMSxvLmVtaXR0ZWRSZWFkYWJsZXx8KG8uZW1pdHRlZFJlYWRhYmxlPSEwLGVtaXRSZWFkYWJsZV8ocykpKX0ocyx3KTtlbHNlIGlmKHV8fChfPWZ1bmN0aW9uIGNodW5rSW52YWxpZChzLG8pe3ZhciBpOyhmdW5jdGlvbiBfaXNVaW50OEFycmF5KHMpe3JldHVybiB4LmlzQnVmZmVyKHMpfHxzIGluc3RhbmNlb2YgQ30pKG8pfHwic3RyaW5nIj09dHlwZW9mIG98fHZvaWQgMD09PW98fHMub2JqZWN0TW9kZXx8KGk9bmV3IGVlKCJjaHVuayIsWyJzdHJpbmciLCJCdWZmZXIiLCJVaW50OEFycmF5Il0sbykpO3JldHVybiBpfSh3LG8pKSxfKWxlKHMsXyk7ZWxzZSBpZih3Lm9iamVjdE1vZGV8fG8mJm8ubGVuZ3RoPjApaWYoInN0cmluZyI9PXR5cGVvZiBvfHx3Lm9iamVjdE1vZGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZihvKT09PXgucHJvdG90eXBlfHwobz1mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKHMpe3JldHVybiB4LmZyb20ocyl9KG8pKSxhKXcuZW5kRW1pdHRlZD9sZShzLG5ldyBjZSk6YWRkQ2h1bmsocyx3LG8sITApO2Vsc2UgaWYody5lbmRlZClsZShzLG5ldyBpZSk7ZWxzZXtpZih3LmRlc3Ryb3llZClyZXR1cm4hMTt3LnJlYWRpbmc9ITEsdy5kZWNvZGVyJiYhaT8obz13LmRlY29kZXIud3JpdGUobyksdy5vYmplY3RNb2RlfHwwIT09by5sZW5ndGg/YWRkQ2h1bmsocyx3LG8sITEpOm1heWJlUmVhZE1vcmUocyx3KSk6YWRkQ2h1bmsocyx3LG8sITEpfWVsc2UgYXx8KHcucmVhZGluZz0hMSxtYXliZVJlYWRNb3JlKHMsdykpO3JldHVybiF3LmVuZGVkJiYody5sZW5ndGg8dy5oaWdoV2F0ZXJNYXJrfHwwPT09dy5sZW5ndGgpfWZ1bmN0aW9uIGFkZENodW5rKHMsbyxpLGEpe28uZmxvd2luZyYmMD09PW8ubGVuZ3RoJiYhby5zeW5jPyhvLmF3YWl0RHJhaW49MCxzLmVtaXQoImRhdGEiLGkpKTooby5sZW5ndGgrPW8ub2JqZWN0TW9kZT8xOmkubGVuZ3RoLGE/by5idWZmZXIudW5zaGlmdChpKTpvLmJ1ZmZlci5wdXNoKGkpLG8ubmVlZFJlYWRhYmxlJiZlbWl0UmVhZGFibGUocykpLG1heWJlUmVhZE1vcmUocyxvKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbiBzZXQocyl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPXMpfX0pLFJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95PXouZGVzdHJveSxSZWFkYWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveT16LnVuZGVzdHJveSxSZWFkYWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24ocyxvKXtvKHMpfSxSZWFkYWJsZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihzLG8pe3ZhciBpLGE9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gYS5vYmplY3RNb2RlP2k9ITA6InN0cmluZyI9PXR5cGVvZiBzJiYoKG89b3x8YS5kZWZhdWx0RW5jb2RpbmcpIT09YS5lbmNvZGluZyYmKHM9eC5mcm9tKHMsbyksbz0iIiksaT0hMCkscmVhZGFibGVBZGRDaHVuayh0aGlzLHMsbywhMSxpKX0sUmVhZGFibGUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24ocyl7cmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcyxzLG51bGwsITAsITEpfSxSZWFkYWJsZS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30sUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nPWZ1bmN0aW9uKHMpe0J8fChCPWkoODMxNDEpLkkpO3ZhciBvPW5ldyBCKHMpO3RoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlcj1vLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2Rpbmc9dGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyLmVuY29kaW5nO2Zvcih2YXIgYT10aGlzLl9yZWFkYWJsZVN0YXRlLmJ1ZmZlci5oZWFkLHU9IiI7bnVsbCE9PWE7KXUrPW8ud3JpdGUoYS5kYXRhKSxhPWEubmV4dDtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuY2xlYXIoKSwiIiE9PXUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyLnB1c2godSksdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGg9dS5sZW5ndGgsdGhpc307dmFyIGRlPTEwNzM3NDE4MjQ7ZnVuY3Rpb24gaG93TXVjaFRvUmVhZChzLG8pe3JldHVybiBzPD0wfHwwPT09by5sZW5ndGgmJm8uZW5kZWQ/MDpvLm9iamVjdE1vZGU/MTpzIT1zP28uZmxvd2luZyYmby5sZW5ndGg/by5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDpvLmxlbmd0aDoocz5vLmhpZ2hXYXRlck1hcmsmJihvLmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsocyl7cmV0dXJuIHM+PWRlP3M9ZGU6KHMtLSxzfD1zPj4+MSxzfD1zPj4+MixzfD1zPj4+NCxzfD1zPj4+OCxzfD1zPj4+MTYscysrKSxzfShzKSksczw9by5sZW5ndGg/czpvLmVuZGVkP28ubGVuZ3RoOihvLm5lZWRSZWFkYWJsZT0hMCwwKSl9ZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHMpe3ZhciBvPXMuX3JlYWRhYmxlU3RhdGU7aigiZW1pdFJlYWRhYmxlIixvLm5lZWRSZWFkYWJsZSxvLmVtaXR0ZWRSZWFkYWJsZSksby5uZWVkUmVhZGFibGU9ITEsby5lbWl0dGVkUmVhZGFibGV8fChqKCJlbWl0UmVhZGFibGUiLG8uZmxvd2luZyksby5lbWl0dGVkUmVhZGFibGU9ITAsdS5uZXh0VGljayhlbWl0UmVhZGFibGVfLHMpKX1mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHMpe3ZhciBvPXMuX3JlYWRhYmxlU3RhdGU7aigiZW1pdFJlYWRhYmxlXyIsby5kZXN0cm95ZWQsby5sZW5ndGgsby5lbmRlZCksby5kZXN0cm95ZWR8fCFvLmxlbmd0aCYmIW8uZW5kZWR8fChzLmVtaXQoInJlYWRhYmxlIiksby5lbWl0dGVkUmVhZGFibGU9ITEpLG8ubmVlZFJlYWRhYmxlPSFvLmZsb3dpbmcmJiFvLmVuZGVkJiZvLmxlbmd0aDw9by5oaWdoV2F0ZXJNYXJrLGZsb3cocyl9ZnVuY3Rpb24gbWF5YmVSZWFkTW9yZShzLG8pe28ucmVhZGluZ01vcmV8fChvLnJlYWRpbmdNb3JlPSEwLHUubmV4dFRpY2sobWF5YmVSZWFkTW9yZV8scyxvKSl9ZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8ocyxvKXtmb3IoOyFvLnJlYWRpbmcmJiFvLmVuZGVkJiYoby5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrfHxvLmZsb3dpbmcmJjA9PT1vLmxlbmd0aCk7KXt2YXIgaT1vLmxlbmd0aDtpZihqKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHMucmVhZCgwKSxpPT09by5sZW5ndGgpYnJlYWt9by5yZWFkaW5nTW9yZT0hMX1mdW5jdGlvbiB1cGRhdGVSZWFkYWJsZUxpc3RlbmluZyhzKXt2YXIgbz1zLl9yZWFkYWJsZVN0YXRlO28ucmVhZGFibGVMaXN0ZW5pbmc9cy5saXN0ZW5lckNvdW50KCJyZWFkYWJsZSIpPjAsby5yZXN1bWVTY2hlZHVsZWQmJiFvLnBhdXNlZD9vLmZsb3dpbmc9ITA6cy5saXN0ZW5lckNvdW50KCJkYXRhIik+MCYmcy5yZXN1bWUoKX1mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHMpe2ooInJlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCIpLHMucmVhZCgwKX1mdW5jdGlvbiByZXN1bWVfKHMsbyl7aigicmVzdW1lIixvLnJlYWRpbmcpLG8ucmVhZGluZ3x8cy5yZWFkKDApLG8ucmVzdW1lU2NoZWR1bGVkPSExLHMuZW1pdCgicmVzdW1lIiksZmxvdyhzKSxvLmZsb3dpbmcmJiFvLnJlYWRpbmcmJnMucmVhZCgwKX1mdW5jdGlvbiBmbG93KHMpe3ZhciBvPXMuX3JlYWRhYmxlU3RhdGU7Zm9yKGooImZsb3ciLG8uZmxvd2luZyk7by5mbG93aW5nJiZudWxsIT09cy5yZWFkKCk7KTt9ZnVuY3Rpb24gZnJvbUxpc3QocyxvKXtyZXR1cm4gMD09PW8ubGVuZ3RoP251bGw6KG8ub2JqZWN0TW9kZT9pPW8uYnVmZmVyLnNoaWZ0KCk6IXN8fHM+PW8ubGVuZ3RoPyhpPW8uZGVjb2Rlcj9vLmJ1ZmZlci5qb2luKCIiKToxPT09by5idWZmZXIubGVuZ3RoP28uYnVmZmVyLmZpcnN0KCk6by5idWZmZXIuY29uY2F0KG8ubGVuZ3RoKSxvLmJ1ZmZlci5jbGVhcigpKTppPW8uYnVmZmVyLmNvbnN1bWUocyxvLmRlY29kZXIpLGkpO3ZhciBpfWZ1bmN0aW9uIGVuZFJlYWRhYmxlKHMpe3ZhciBvPXMuX3JlYWRhYmxlU3RhdGU7aigiZW5kUmVhZGFibGUiLG8uZW5kRW1pdHRlZCksby5lbmRFbWl0dGVkfHwoby5lbmRlZD0hMCx1Lm5leHRUaWNrKGVuZFJlYWRhYmxlTlQsbyxzKSl9ZnVuY3Rpb24gZW5kUmVhZGFibGVOVChzLG8pe2lmKGooImVuZFJlYWRhYmxlTlQiLHMuZW5kRW1pdHRlZCxzLmxlbmd0aCksIXMuZW5kRW1pdHRlZCYmMD09PXMubGVuZ3RoJiYocy5lbmRFbWl0dGVkPSEwLG8ucmVhZGFibGU9ITEsby5lbWl0KCJlbmQiKSxzLmF1dG9EZXN0cm95KSl7dmFyIGk9by5fd3JpdGFibGVTdGF0ZTsoIWl8fGkuYXV0b0Rlc3Ryb3kmJmkuZmluaXNoZWQpJiZvLmRlc3Ryb3koKX19ZnVuY3Rpb24gaW5kZXhPZihzLG8pe2Zvcih2YXIgaT0wLGE9cy5sZW5ndGg7aTxhO2krKylpZihzW2ldPT09bylyZXR1cm4gaTtyZXR1cm4tMX1SZWFkYWJsZS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbihzKXtqKCJyZWFkIixzKSxzPXBhcnNlSW50KHMsMTApO3ZhciBvPXRoaXMuX3JlYWRhYmxlU3RhdGUsaT1zO2lmKDAhPT1zJiYoby5lbWl0dGVkUmVhZGFibGU9ITEpLDA9PT1zJiZvLm5lZWRSZWFkYWJsZSYmKCgwIT09by5oaWdoV2F0ZXJNYXJrP28ubGVuZ3RoPj1vLmhpZ2hXYXRlck1hcms6by5sZW5ndGg+MCl8fG8uZW5kZWQpKXJldHVybiBqKCJyZWFkOiBlbWl0UmVhZGFibGUiLG8ubGVuZ3RoLG8uZW5kZWQpLDA9PT1vLmxlbmd0aCYmby5lbmRlZD9lbmRSZWFkYWJsZSh0aGlzKTplbWl0UmVhZGFibGUodGhpcyksbnVsbDtpZigwPT09KHM9aG93TXVjaFRvUmVhZChzLG8pKSYmby5lbmRlZClyZXR1cm4gMD09PW8ubGVuZ3RoJiZlbmRSZWFkYWJsZSh0aGlzKSxudWxsO3ZhciBhLHU9by5uZWVkUmVhZGFibGU7cmV0dXJuIGooIm5lZWQgcmVhZGFibGUiLHUpLCgwPT09by5sZW5ndGh8fG8ubGVuZ3RoLXM8by5oaWdoV2F0ZXJNYXJrKSYmaigibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLHU9ITApLG8uZW5kZWR8fG8ucmVhZGluZz9qKCJyZWFkaW5nIG9yIGVuZGVkIix1PSExKTp1JiYoaigiZG8gcmVhZCIpLG8ucmVhZGluZz0hMCxvLnN5bmM9ITAsMD09PW8ubGVuZ3RoJiYoby5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoby5oaWdoV2F0ZXJNYXJrKSxvLnN5bmM9ITEsby5yZWFkaW5nfHwocz1ob3dNdWNoVG9SZWFkKGksbykpKSxudWxsPT09KGE9cz4wP2Zyb21MaXN0KHMsbyk6bnVsbCk/KG8ubmVlZFJlYWRhYmxlPW8ubGVuZ3RoPD1vLmhpZ2hXYXRlck1hcmsscz0wKTooby5sZW5ndGgtPXMsby5hd2FpdERyYWluPTApLDA9PT1vLmxlbmd0aCYmKG8uZW5kZWR8fChvLm5lZWRSZWFkYWJsZT0hMCksaSE9PXMmJm8uZW5kZWQmJmVuZFJlYWRhYmxlKHRoaXMpKSxudWxsIT09YSYmdGhpcy5lbWl0KCJkYXRhIixhKSxhfSxSZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24ocyl7bGUodGhpcyxuZXcgYWUoIl9yZWFkKCkiKSl9LFJlYWRhYmxlLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHMsbyl7dmFyIGk9dGhpcyxhPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKGEucGlwZXNDb3VudCl7Y2FzZSAwOmEucGlwZXM9czticmVhaztjYXNlIDE6YS5waXBlcz1bYS5waXBlcyxzXTticmVhaztkZWZhdWx0OmEucGlwZXMucHVzaChzKX1hLnBpcGVzQ291bnQrPTEsaigicGlwZSBjb3VudD0lZCBvcHRzPSVqIixhLnBpcGVzQ291bnQsbyk7dmFyIHc9KCFvfHwhMSE9PW8uZW5kKSYmcyE9PXUuc3Rkb3V0JiZzIT09dS5zdGRlcnI/b25lbmQ6dW5waXBlO2Z1bmN0aW9uIG9udW5waXBlKG8sdSl7aigib251bnBpcGUiKSxvPT09aSYmdSYmITE9PT11Lmhhc1VucGlwZWQmJih1Lmhhc1VucGlwZWQ9ITAsZnVuY3Rpb24gY2xlYW51cCgpe2ooImNsZWFudXAiKSxzLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsb25jbG9zZSkscy5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixvbmZpbmlzaCkscy5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLHgpLHMucmVtb3ZlTGlzdGVuZXIoImVycm9yIixvbmVycm9yKSxzLnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLG9udW5waXBlKSxpLnJlbW92ZUxpc3RlbmVyKCJlbmQiLG9uZW5kKSxpLnJlbW92ZUxpc3RlbmVyKCJlbmQiLHVucGlwZSksaS5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsb25kYXRhKSxDPSEwLCFhLmF3YWl0RHJhaW58fHMuX3dyaXRhYmxlU3RhdGUmJiFzLl93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8eCgpfSgpKX1mdW5jdGlvbiBvbmVuZCgpe2ooIm9uZW5kIikscy5lbmQoKX1hLmVuZEVtaXR0ZWQ/dS5uZXh0VGljayh3KTppLm9uY2UoImVuZCIsdykscy5vbigidW5waXBlIixvbnVucGlwZSk7dmFyIHg9ZnVuY3Rpb24gcGlwZU9uRHJhaW4ocyl7cmV0dXJuIGZ1bmN0aW9uIHBpcGVPbkRyYWluRnVuY3Rpb25SZXN1bHQoKXt2YXIgbz1zLl9yZWFkYWJsZVN0YXRlO2ooInBpcGVPbkRyYWluIixvLmF3YWl0RHJhaW4pLG8uYXdhaXREcmFpbiYmby5hd2FpdERyYWluLS0sMD09PW8uYXdhaXREcmFpbiYmXyhzLCJkYXRhIikmJihvLmZsb3dpbmc9ITAsZmxvdyhzKSl9fShpKTtzLm9uKCJkcmFpbiIseCk7dmFyIEM9ITE7ZnVuY3Rpb24gb25kYXRhKG8pe2ooIm9uZGF0YSIpO3ZhciB1PXMud3JpdGUobyk7aigiZGVzdC53cml0ZSIsdSksITE9PT11JiYoKDE9PT1hLnBpcGVzQ291bnQmJmEucGlwZXM9PT1zfHxhLnBpcGVzQ291bnQ+MSYmLTEhPT1pbmRleE9mKGEucGlwZXMscykpJiYhQyYmKGooImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsYS5hd2FpdERyYWluKSxhLmF3YWl0RHJhaW4rKyksaS5wYXVzZSgpKX1mdW5jdGlvbiBvbmVycm9yKG8pe2ooIm9uZXJyb3IiLG8pLHVucGlwZSgpLHMucmVtb3ZlTGlzdGVuZXIoImVycm9yIixvbmVycm9yKSwwPT09XyhzLCJlcnJvciIpJiZsZShzLG8pfWZ1bmN0aW9uIG9uY2xvc2UoKXtzLnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLG9uZmluaXNoKSx1bnBpcGUoKX1mdW5jdGlvbiBvbmZpbmlzaCgpe2ooIm9uZmluaXNoIikscy5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLG9uY2xvc2UpLHVucGlwZSgpfWZ1bmN0aW9uIHVucGlwZSgpe2ooInVucGlwZSIpLGkudW5waXBlKHMpfXJldHVybiBpLm9uKCJkYXRhIixvbmRhdGEpLGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcihzLG8saSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHMucHJlcGVuZExpc3RlbmVyKXJldHVybiBzLnByZXBlbmRMaXN0ZW5lcihvLGkpO3MuX2V2ZW50cyYmcy5fZXZlbnRzW29dP0FycmF5LmlzQXJyYXkocy5fZXZlbnRzW29dKT9zLl9ldmVudHNbb10udW5zaGlmdChpKTpzLl9ldmVudHNbb109W2kscy5fZXZlbnRzW29dXTpzLm9uKG8saSl9KHMsImVycm9yIixvbmVycm9yKSxzLm9uY2UoImNsb3NlIixvbmNsb3NlKSxzLm9uY2UoImZpbmlzaCIsb25maW5pc2gpLHMuZW1pdCgicGlwZSIsaSksYS5mbG93aW5nfHwoaigicGlwZSByZXN1bWUiKSxpLnJlc3VtZSgpKSxzfSxSZWFkYWJsZS5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHMpe3ZhciBvPXRoaXMuX3JlYWRhYmxlU3RhdGUsaT17aGFzVW5waXBlZDohMX07aWYoMD09PW8ucGlwZXNDb3VudClyZXR1cm4gdGhpcztpZigxPT09by5waXBlc0NvdW50KXJldHVybiBzJiZzIT09by5waXBlc3x8KHN8fChzPW8ucGlwZXMpLG8ucGlwZXM9bnVsbCxvLnBpcGVzQ291bnQ9MCxvLmZsb3dpbmc9ITEscyYmcy5lbWl0KCJ1bnBpcGUiLHRoaXMsaSkpLHRoaXM7aWYoIXMpe3ZhciBhPW8ucGlwZXMsdT1vLnBpcGVzQ291bnQ7by5waXBlcz1udWxsLG8ucGlwZXNDb3VudD0wLG8uZmxvd2luZz0hMTtmb3IodmFyIF89MDtfPHU7XysrKWFbX10uZW1pdCgidW5waXBlIix0aGlzLHtoYXNVbnBpcGVkOiExfSk7cmV0dXJuIHRoaXN9dmFyIHc9aW5kZXhPZihvLnBpcGVzLHMpO3JldHVybi0xPT09d3x8KG8ucGlwZXMuc3BsaWNlKHcsMSksby5waXBlc0NvdW50LT0xLDE9PT1vLnBpcGVzQ291bnQmJihvLnBpcGVzPW8ucGlwZXNbMF0pLHMuZW1pdCgidW5waXBlIix0aGlzLGkpKSx0aGlzfSxSZWFkYWJsZS5wcm90b3R5cGUub249ZnVuY3Rpb24ocyxvKXt2YXIgaT13LnByb3RvdHlwZS5vbi5jYWxsKHRoaXMscyxvKSxhPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuImRhdGEiPT09cz8oYS5yZWFkYWJsZUxpc3RlbmluZz10aGlzLmxpc3RlbmVyQ291bnQoInJlYWRhYmxlIik+MCwhMSE9PWEuZmxvd2luZyYmdGhpcy5yZXN1bWUoKSk6InJlYWRhYmxlIj09PXMmJihhLmVuZEVtaXR0ZWR8fGEucmVhZGFibGVMaXN0ZW5pbmd8fChhLnJlYWRhYmxlTGlzdGVuaW5nPWEubmVlZFJlYWRhYmxlPSEwLGEuZmxvd2luZz0hMSxhLmVtaXR0ZWRSZWFkYWJsZT0hMSxqKCJvbiByZWFkYWJsZSIsYS5sZW5ndGgsYS5yZWFkaW5nKSxhLmxlbmd0aD9lbWl0UmVhZGFibGUodGhpcyk6YS5yZWFkaW5nfHx1Lm5leHRUaWNrKG5SZWFkaW5nTmV4dFRpY2ssdGhpcykpKSxpfSxSZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9UmVhZGFibGUucHJvdG90eXBlLm9uLFJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihzLG8pe3ZhciBpPXcucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyLmNhbGwodGhpcyxzLG8pO3JldHVybiJyZWFkYWJsZSI9PT1zJiZ1Lm5leHRUaWNrKHVwZGF0ZVJlYWRhYmxlTGlzdGVuaW5nLHRoaXMpLGl9LFJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocyl7dmFyIG89dy5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4icmVhZGFibGUiIT09cyYmdm9pZCAwIT09c3x8dS5uZXh0VGljayh1cGRhdGVSZWFkYWJsZUxpc3RlbmluZyx0aGlzKSxvfSxSZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHM9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gcy5mbG93aW5nfHwoaigicmVzdW1lIikscy5mbG93aW5nPSFzLnJlYWRhYmxlTGlzdGVuaW5nLGZ1bmN0aW9uIHJlc3VtZShzLG8pe28ucmVzdW1lU2NoZWR1bGVkfHwoby5yZXN1bWVTY2hlZHVsZWQ9ITAsdS5uZXh0VGljayhyZXN1bWVfLHMsbykpfSh0aGlzLHMpKSxzLnBhdXNlZD0hMSx0aGlzfSxSZWFkYWJsZS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4gaigiY2FsbCBwYXVzZSBmbG93aW5nPSVqIix0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpLCExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiYoaigicGF1c2UiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KCJwYXVzZSIpKSx0aGlzLl9yZWFkYWJsZVN0YXRlLnBhdXNlZD0hMCx0aGlzfSxSZWFkYWJsZS5wcm90b3R5cGUud3JhcD1mdW5jdGlvbihzKXt2YXIgbz10aGlzLGk9dGhpcy5fcmVhZGFibGVTdGF0ZSxhPSExO2Zvcih2YXIgdSBpbiBzLm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKGooIndyYXBwZWQgZW5kIiksaS5kZWNvZGVyJiYhaS5lbmRlZCl7dmFyIHM9aS5kZWNvZGVyLmVuZCgpO3MmJnMubGVuZ3RoJiZvLnB1c2gocyl9by5wdXNoKG51bGwpfSkpLHMub24oImRhdGEiLChmdW5jdGlvbih1KXsoaigid3JhcHBlZCBkYXRhIiksaS5kZWNvZGVyJiYodT1pLmRlY29kZXIud3JpdGUodSkpLGkub2JqZWN0TW9kZSYmbnVsbD09dSl8fChpLm9iamVjdE1vZGV8fHUmJnUubGVuZ3RoKSYmKG8ucHVzaCh1KXx8KGE9ITAscy5wYXVzZSgpKSl9KSkscyl2b2lkIDA9PT10aGlzW3VdJiYiZnVuY3Rpb24iPT10eXBlb2Ygc1t1XSYmKHRoaXNbdV09ZnVuY3Rpb24gbWV0aG9kV3JhcChvKXtyZXR1cm4gZnVuY3Rpb24gbWV0aG9kV3JhcFJldHVybkZ1bmN0aW9uKCl7cmV0dXJuIHNbb10uYXBwbHkocyxhcmd1bWVudHMpfX0odSkpO2Zvcih2YXIgXz0wO188cGUubGVuZ3RoO18rKylzLm9uKHBlW19dLHRoaXMuZW1pdC5iaW5kKHRoaXMscGVbX10pKTtyZXR1cm4gdGhpcy5fcmVhZD1mdW5jdGlvbihvKXtqKCJ3cmFwcGVkIF9yZWFkIixvKSxhJiYoYT0hMSxzLnJlc3VtZSgpKX0sdGhpc30sImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKFJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09JCYmKCQ9aSgyOTU1KSksJCh0aGlzKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsInJlYWRhYmxlSGlnaFdhdGVyTWFyayIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwicmVhZGFibGVCdWZmZXIiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXJ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWRhYmxlLnByb3RvdHlwZSwicmVhZGFibGVGbG93aW5nIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30sc2V0OmZ1bmN0aW9uIHNldChzKXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPXMpfX0pLFJlYWRhYmxlLl9mcm9tTGlzdD1mcm9tTGlzdCxPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVhZGFibGUucHJvdG90eXBlLCJyZWFkYWJsZUxlbmd0aCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uIGdldCgpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aH19KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoUmVhZGFibGUuZnJvbT1mdW5jdGlvbihzLG8pe3JldHVybiB2b2lkIDA9PT1VJiYoVT1pKDU1MTU3KSksVShSZWFkYWJsZSxzLG8pfSl9LDc0NjEwKHMsbyxpKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPVRyYW5zZm9ybTt2YXIgYT1pKDg2MDQ4KS5GLHU9YS5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxfPWEuRVJSX01VTFRJUExFX0NBTExCQUNLLHc9YS5FUlJfVFJBTlNGT1JNX0FMUkVBRFlfVFJBTlNGT1JNSU5HLHg9YS5FUlJfVFJBTlNGT1JNX1dJVEhfTEVOR1RIXzAsQz1pKDI1MzgyKTtmdW5jdGlvbiBhZnRlclRyYW5zZm9ybShzLG8pe3ZhciBpPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2kudHJhbnNmb3JtaW5nPSExO3ZhciBhPWkud3JpdGVjYjtpZihudWxsPT09YSlyZXR1cm4gdGhpcy5lbWl0KCJlcnJvciIsbmV3IF8pO2kud3JpdGVjaHVuaz1udWxsLGkud3JpdGVjYj1udWxsLG51bGwhPW8mJnRoaXMucHVzaChvKSxhKHMpO3ZhciB1PXRoaXMuX3JlYWRhYmxlU3RhdGU7dS5yZWFkaW5nPSExLCh1Lm5lZWRSZWFkYWJsZXx8dS5sZW5ndGg8dS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZCh1LmhpZ2hXYXRlck1hcmspfWZ1bmN0aW9uIFRyYW5zZm9ybShzKXtpZighKHRoaXMgaW5zdGFuY2VvZiBUcmFuc2Zvcm0pKXJldHVybiBuZXcgVHJhbnNmb3JtKHMpO0MuY2FsbCh0aGlzLHMpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPXthZnRlclRyYW5zZm9ybTphZnRlclRyYW5zZm9ybS5iaW5kKHRoaXMpLG5lZWRUcmFuc2Zvcm06ITEsdHJhbnNmb3JtaW5nOiExLHdyaXRlY2I6bnVsbCx3cml0ZWNodW5rOm51bGwsd3JpdGVlbmNvZGluZzpudWxsfSx0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEscyYmKCJmdW5jdGlvbiI9PXR5cGVvZiBzLnRyYW5zZm9ybSYmKHRoaXMuX3RyYW5zZm9ybT1zLnRyYW5zZm9ybSksImZ1bmN0aW9uIj09dHlwZW9mIHMuZmx1c2gmJih0aGlzLl9mbHVzaD1zLmZsdXNoKSksdGhpcy5vbigicHJlZmluaXNoIixwcmVmaW5pc2gpfWZ1bmN0aW9uIHByZWZpbmlzaCgpe3ZhciBzPXRoaXM7ImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXMuX2ZsdXNofHx0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD9kb25lKHRoaXMsbnVsbCxudWxsKTp0aGlzLl9mbHVzaCgoZnVuY3Rpb24obyxpKXtkb25lKHMsbyxpKX0pKX1mdW5jdGlvbiBkb25lKHMsbyxpKXtpZihvKXJldHVybiBzLmVtaXQoImVycm9yIixvKTtpZihudWxsIT1pJiZzLnB1c2goaSkscy5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpdGhyb3cgbmV3IHg7aWYocy5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKXRocm93IG5ldyB3O3JldHVybiBzLnB1c2gobnVsbCl9aSg1NjY5OCkoVHJhbnNmb3JtLEMpLFRyYW5zZm9ybS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihzLG8pe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLEMucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHMsbyl9LFRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihzLG8saSl7aShuZXcgdSgiX3RyYW5zZm9ybSgpIikpfSxUcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbihzLG8saSl7dmFyIGE9dGhpcy5fdHJhbnNmb3JtU3RhdGU7aWYoYS53cml0ZWNiPWksYS53cml0ZWNodW5rPXMsYS53cml0ZWVuY29kaW5nPW8sIWEudHJhbnNmb3JtaW5nKXt2YXIgdT10aGlzLl9yZWFkYWJsZVN0YXRlOyhhLm5lZWRUcmFuc2Zvcm18fHUubmVlZFJlYWRhYmxlfHx1Lmxlbmd0aDx1LmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKHUuaGlnaFdhdGVyTWFyayl9fSxUcmFuc2Zvcm0ucHJvdG90eXBlLl9yZWFkPWZ1bmN0aW9uKHMpe3ZhciBvPXRoaXMuX3RyYW5zZm9ybVN0YXRlO251bGw9PT1vLndyaXRlY2h1bmt8fG8udHJhbnNmb3JtaW5nP28ubmVlZFRyYW5zZm9ybT0hMDooby50cmFuc2Zvcm1pbmc9ITAsdGhpcy5fdHJhbnNmb3JtKG8ud3JpdGVjaHVuayxvLndyaXRlZW5jb2Rpbmcsby5hZnRlclRyYW5zZm9ybSkpfSxUcmFuc2Zvcm0ucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHMsbyl7Qy5wcm90b3R5cGUuX2Rlc3Ryb3kuY2FsbCh0aGlzLHMsKGZ1bmN0aW9uKHMpe28ocyl9KSl9fSwxNjcwOChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhLHU9aSg2NTYwNik7ZnVuY3Rpb24gQ29ya2VkUmVxdWVzdChzKXt2YXIgbz10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbigpeyFmdW5jdGlvbiBvbkNvcmtlZEZpbmlzaChzLG8saSl7dmFyIGE9cy5lbnRyeTtzLmVudHJ5PW51bGw7Zm9yKDthOyl7dmFyIHU9YS5jYWxsYmFjaztvLnBlbmRpbmdjYi0tLHUoaSksYT1hLm5leHR9by5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1zfShvLHMpfX1zLmV4cG9ydHM9V3JpdGFibGUsV3JpdGFibGUuV3JpdGFibGVTdGF0ZT1Xcml0YWJsZVN0YXRlO3ZhciBfPXtkZXByZWNhdGU6aSg5NDY0Myl9LHc9aSg0MDM0NSkseD1pKDQ4Mjg3KS5CdWZmZXIsQz0odm9pZCAwIT09aS5nP2kuZzoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e30pLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTt2YXIgaixMPWkoNzU4OTYpLEI9aSg2NTI5MSkuZ2V0SGlnaFdhdGVyTWFyaywkPWkoODYwNDgpLkYsVT0kLkVSUl9JTlZBTElEX0FSR19UWVBFLFY9JC5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCx6PSQuRVJSX01VTFRJUExFX0NBTExCQUNLLFk9JC5FUlJfU1RSRUFNX0NBTk5PVF9QSVBFLFo9JC5FUlJfU1RSRUFNX0RFU1RST1lFRCxlZT0kLkVSUl9TVFJFQU1fTlVMTF9WQUxVRVMsaWU9JC5FUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCxhZT0kLkVSUl9VTktOT1dOX0VOQ09ESU5HLGNlPUwuZXJyb3JPckRlc3Ryb3k7ZnVuY3Rpb24gbm9wKCl7fWZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUocyxvLF8pe2E9YXx8aSgyNTM4Mikscz1zfHx7fSwiYm9vbGVhbiIhPXR5cGVvZiBfJiYoXz1vIGluc3RhbmNlb2YgYSksdGhpcy5vYmplY3RNb2RlPSEhcy5vYmplY3RNb2RlLF8mJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIXMud3JpdGFibGVPYmplY3RNb2RlKSx0aGlzLmhpZ2hXYXRlck1hcms9Qih0aGlzLHMsIndyaXRhYmxlSGlnaFdhdGVyTWFyayIsXyksdGhpcy5maW5hbENhbGxlZD0hMSx0aGlzLm5lZWREcmFpbj0hMSx0aGlzLmVuZGluZz0hMSx0aGlzLmVuZGVkPSExLHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5kZXN0cm95ZWQ9ITE7dmFyIHc9ITE9PT1zLmRlY29kZVN0cmluZ3M7dGhpcy5kZWNvZGVTdHJpbmdzPSF3LHRoaXMuZGVmYXVsdEVuY29kaW5nPXMuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5sZW5ndGg9MCx0aGlzLndyaXRpbmc9ITEsdGhpcy5jb3JrZWQ9MCx0aGlzLnN5bmM9ITAsdGhpcy5idWZmZXJQcm9jZXNzaW5nPSExLHRoaXMub253cml0ZT1mdW5jdGlvbihzKXshZnVuY3Rpb24gb253cml0ZShzLG8pe3ZhciBpPXMuX3dyaXRhYmxlU3RhdGUsYT1pLnN5bmMsXz1pLndyaXRlY2I7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIF8pdGhyb3cgbmV3IHo7aWYoZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHMpe3Mud3JpdGluZz0hMSxzLndyaXRlY2I9bnVsbCxzLmxlbmd0aC09cy53cml0ZWxlbixzLndyaXRlbGVuPTB9KGkpLG8pIWZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzLG8saSxhLF8pey0tby5wZW5kaW5nY2IsaT8odS5uZXh0VGljayhfLGEpLHUubmV4dFRpY2soZmluaXNoTWF5YmUscyxvKSxzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCxjZShzLGEpKTooXyhhKSxzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCxjZShzLGEpLGZpbmlzaE1heWJlKHMsbykpfShzLGksYSxvLF8pO2Vsc2V7dmFyIHc9bmVlZEZpbmlzaChpKXx8cy5kZXN0cm95ZWQ7d3x8aS5jb3JrZWR8fGkuYnVmZmVyUHJvY2Vzc2luZ3x8IWkuYnVmZmVyZWRSZXF1ZXN0fHxjbGVhckJ1ZmZlcihzLGkpLGE/dS5uZXh0VGljayhhZnRlcldyaXRlLHMsaSx3LF8pOmFmdGVyV3JpdGUocyxpLHcsXyl9fShvLHMpfSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlbGVuPTAsdGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLnBlbmRpbmdjYj0wLHRoaXMucHJlZmluaXNoZWQ9ITEsdGhpcy5lcnJvckVtaXR0ZWQ9ITEsdGhpcy5lbWl0Q2xvc2U9ITEhPT1zLmVtaXRDbG9zZSx0aGlzLmF1dG9EZXN0cm95PSEhcy5hdXRvRGVzdHJveSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IENvcmtlZFJlcXVlc3QodGhpcyl9ZnVuY3Rpb24gV3JpdGFibGUocyl7dmFyIG89dGhpcyBpbnN0YW5jZW9mKGE9YXx8aSgyNTM4MikpO2lmKCFvJiYhai5jYWxsKFdyaXRhYmxlLHRoaXMpKXJldHVybiBuZXcgV3JpdGFibGUocyk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgV3JpdGFibGVTdGF0ZShzLHRoaXMsbyksdGhpcy53cml0YWJsZT0hMCxzJiYoImZ1bmN0aW9uIj09dHlwZW9mIHMud3JpdGUmJih0aGlzLl93cml0ZT1zLndyaXRlKSwiZnVuY3Rpb24iPT10eXBlb2Ygcy53cml0ZXYmJih0aGlzLl93cml0ZXY9cy53cml0ZXYpLCJmdW5jdGlvbiI9PXR5cGVvZiBzLmRlc3Ryb3kmJih0aGlzLl9kZXN0cm95PXMuZGVzdHJveSksImZ1bmN0aW9uIj09dHlwZW9mIHMuZmluYWwmJih0aGlzLl9maW5hbD1zLmZpbmFsKSksdy5jYWxsKHRoaXMpfWZ1bmN0aW9uIGRvV3JpdGUocyxvLGksYSx1LF8sdyl7by53cml0ZWxlbj1hLG8ud3JpdGVjYj13LG8ud3JpdGluZz0hMCxvLnN5bmM9ITAsby5kZXN0cm95ZWQ/by5vbndyaXRlKG5ldyBaKCJ3cml0ZSIpKTppP3MuX3dyaXRldih1LG8ub253cml0ZSk6cy5fd3JpdGUodSxfLG8ub253cml0ZSksby5zeW5jPSExfWZ1bmN0aW9uIGFmdGVyV3JpdGUocyxvLGksYSl7aXx8ZnVuY3Rpb24gb253cml0ZURyYWluKHMsbyl7MD09PW8ubGVuZ3RoJiZvLm5lZWREcmFpbiYmKG8ubmVlZERyYWluPSExLHMuZW1pdCgiZHJhaW4iKSl9KHMsbyksby5wZW5kaW5nY2ItLSxhKCksZmluaXNoTWF5YmUocyxvKX1mdW5jdGlvbiBjbGVhckJ1ZmZlcihzLG8pe28uYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgaT1vLmJ1ZmZlcmVkUmVxdWVzdDtpZihzLl93cml0ZXYmJmkmJmkubmV4dCl7dmFyIGE9by5idWZmZXJlZFJlcXVlc3RDb3VudCx1PW5ldyBBcnJheShhKSxfPW8uY29ya2VkUmVxdWVzdHNGcmVlO18uZW50cnk9aTtmb3IodmFyIHc9MCx4PSEwO2k7KXVbd109aSxpLmlzQnVmfHwoeD0hMSksaT1pLm5leHQsdys9MTt1LmFsbEJ1ZmZlcnM9eCxkb1dyaXRlKHMsbywhMCxvLmxlbmd0aCx1LCIiLF8uZmluaXNoKSxvLnBlbmRpbmdjYisrLG8ubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLF8ubmV4dD8oby5jb3JrZWRSZXF1ZXN0c0ZyZWU9Xy5uZXh0LF8ubmV4dD1udWxsKTpvLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgQ29ya2VkUmVxdWVzdChvKSxvLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTB9ZWxzZXtmb3IoO2k7KXt2YXIgQz1pLmNodW5rLGo9aS5lbmNvZGluZyxMPWkuY2FsbGJhY2s7aWYoZG9Xcml0ZShzLG8sITEsby5vYmplY3RNb2RlPzE6Qy5sZW5ndGgsQyxqLEwpLGk9aS5uZXh0LG8uYnVmZmVyZWRSZXF1ZXN0Q291bnQtLSxvLndyaXRpbmcpYnJlYWt9bnVsbD09PWkmJihvLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCl9by5idWZmZXJlZFJlcXVlc3Q9aSxvLmJ1ZmZlclByb2Nlc3Npbmc9ITF9ZnVuY3Rpb24gbmVlZEZpbmlzaChzKXtyZXR1cm4gcy5lbmRpbmcmJjA9PT1zLmxlbmd0aCYmbnVsbD09PXMuYnVmZmVyZWRSZXF1ZXN0JiYhcy5maW5pc2hlZCYmIXMud3JpdGluZ31mdW5jdGlvbiBjYWxsRmluYWwocyxvKXtzLl9maW5hbCgoZnVuY3Rpb24oaSl7by5wZW5kaW5nY2ItLSxpJiZjZShzLGkpLG8ucHJlZmluaXNoZWQ9ITAscy5lbWl0KCJwcmVmaW5pc2giKSxmaW5pc2hNYXliZShzLG8pfSkpfWZ1bmN0aW9uIGZpbmlzaE1heWJlKHMsbyl7dmFyIGk9bmVlZEZpbmlzaChvKTtpZihpJiYoZnVuY3Rpb24gcHJlZmluaXNoKHMsbyl7by5wcmVmaW5pc2hlZHx8by5maW5hbENhbGxlZHx8KCJmdW5jdGlvbiIhPXR5cGVvZiBzLl9maW5hbHx8by5kZXN0cm95ZWQ/KG8ucHJlZmluaXNoZWQ9ITAscy5lbWl0KCJwcmVmaW5pc2giKSk6KG8ucGVuZGluZ2NiKyssby5maW5hbENhbGxlZD0hMCx1Lm5leHRUaWNrKGNhbGxGaW5hbCxzLG8pKSl9KHMsbyksMD09PW8ucGVuZGluZ2NiJiYoby5maW5pc2hlZD0hMCxzLmVtaXQoImZpbmlzaCIpLG8uYXV0b0Rlc3Ryb3kpKSl7dmFyIGE9cy5fcmVhZGFibGVTdGF0ZTsoIWF8fGEuYXV0b0Rlc3Ryb3kmJmEuZW5kRW1pdHRlZCkmJnMuZGVzdHJveSgpfXJldHVybiBpfWkoNTY2OTgpKFdyaXRhYmxlLHcpLFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlcj1mdW5jdGlvbiBnZXRCdWZmZXIoKXtmb3IodmFyIHM9dGhpcy5idWZmZXJlZFJlcXVlc3Qsbz1bXTtzOylvLnB1c2gocykscz1zLm5leHQ7cmV0dXJuIG99LGZ1bmN0aW9uKCl7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwiYnVmZmVyIix7Z2V0Ol8uZGVwcmVjYXRlKChmdW5jdGlvbiB3cml0YWJsZVN0YXRlQnVmZmVyR2V0dGVyKCl7cmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCl9KSwiX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgaW5zdGVhZC4iLCJERVAwMDAzIil9KX1jYXRjaChzKXt9fSgpLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5oYXNJbnN0YW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdPyhqPUZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSxTeW1ib2wuaGFzSW5zdGFuY2Use3ZhbHVlOmZ1bmN0aW9uIHZhbHVlKHMpe3JldHVybiEhai5jYWxsKHRoaXMscyl8fHRoaXM9PT1Xcml0YWJsZSYmKHMmJnMuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBXcml0YWJsZVN0YXRlKX19KSk6aj1mdW5jdGlvbiByZWFsSGFzSW5zdGFuY2Uocyl7cmV0dXJuIHMgaW5zdGFuY2VvZiB0aGlzfSxXcml0YWJsZS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe2NlKHRoaXMsbmV3IFkpfSxXcml0YWJsZS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24ocyxvLGkpe3ZhciBhPXRoaXMuX3dyaXRhYmxlU3RhdGUsXz0hMSx3PSFhLm9iamVjdE1vZGUmJmZ1bmN0aW9uIF9pc1VpbnQ4QXJyYXkocyl7cmV0dXJuIHguaXNCdWZmZXIocyl8fHMgaW5zdGFuY2VvZiBDfShzKTtyZXR1cm4gdyYmIXguaXNCdWZmZXIocykmJihzPWZ1bmN0aW9uIF91aW50OEFycmF5VG9CdWZmZXIocyl7cmV0dXJuIHguZnJvbShzKX0ocykpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiYoaT1vLG89bnVsbCksdz9vPSJidWZmZXIiOm98fChvPWEuZGVmYXVsdEVuY29kaW5nKSwiZnVuY3Rpb24iIT10eXBlb2YgaSYmKGk9bm9wKSxhLmVuZGluZz9mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHMsbyl7dmFyIGk9bmV3IGllO2NlKHMsaSksdS5uZXh0VGljayhvLGkpfSh0aGlzLGkpOih3fHxmdW5jdGlvbiB2YWxpZENodW5rKHMsbyxpLGEpe3ZhciBfO3JldHVybiBudWxsPT09aT9fPW5ldyBlZToic3RyaW5nIj09dHlwZW9mIGl8fG8ub2JqZWN0TW9kZXx8KF89bmV3IFUoImNodW5rIixbInN0cmluZyIsIkJ1ZmZlciJdLGkpKSwhX3x8KGNlKHMsXyksdS5uZXh0VGljayhhLF8pLCExKX0odGhpcyxhLHMsaSkpJiYoYS5wZW5kaW5nY2IrKyxfPWZ1bmN0aW9uIHdyaXRlT3JCdWZmZXIocyxvLGksYSx1LF8pe2lmKCFpKXt2YXIgdz1mdW5jdGlvbiBkZWNvZGVDaHVuayhzLG8saSl7cy5vYmplY3RNb2RlfHwhMT09PXMuZGVjb2RlU3RyaW5nc3x8InN0cmluZyIhPXR5cGVvZiBvfHwobz14LmZyb20obyxpKSk7cmV0dXJuIG99KG8sYSx1KTthIT09dyYmKGk9ITAsdT0iYnVmZmVyIixhPXcpfXZhciBDPW8ub2JqZWN0TW9kZT8xOmEubGVuZ3RoO28ubGVuZ3RoKz1DO3ZhciBqPW8ubGVuZ3RoPG8uaGlnaFdhdGVyTWFyaztqfHwoby5uZWVkRHJhaW49ITApO2lmKG8ud3JpdGluZ3x8by5jb3JrZWQpe3ZhciBMPW8ubGFzdEJ1ZmZlcmVkUmVxdWVzdDtvLmxhc3RCdWZmZXJlZFJlcXVlc3Q9e2NodW5rOmEsZW5jb2Rpbmc6dSxpc0J1ZjppLGNhbGxiYWNrOl8sbmV4dDpudWxsfSxMP0wubmV4dD1vLmxhc3RCdWZmZXJlZFJlcXVlc3Q6by5idWZmZXJlZFJlcXVlc3Q9by5sYXN0QnVmZmVyZWRSZXF1ZXN0LG8uYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBkb1dyaXRlKHMsbywhMSxDLGEsdSxfKTtyZXR1cm4gan0odGhpcyxhLHcscyxvLGkpKSxffSxXcml0YWJsZS5wcm90b3R5cGUuY29yaz1mdW5jdGlvbigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKyt9LFdyaXRhYmxlLnByb3RvdHlwZS51bmNvcms9ZnVuY3Rpb24oKXt2YXIgcz10aGlzLl93cml0YWJsZVN0YXRlO3MuY29ya2VkJiYocy5jb3JrZWQtLSxzLndyaXRpbmd8fHMuY29ya2VkfHxzLmJ1ZmZlclByb2Nlc3Npbmd8fCFzLmJ1ZmZlcmVkUmVxdWVzdHx8Y2xlYXJCdWZmZXIodGhpcyxzKSl9LFdyaXRhYmxlLnByb3RvdHlwZS5zZXREZWZhdWx0RW5jb2Rpbmc9ZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKHMpe2lmKCJzdHJpbmciPT10eXBlb2YgcyYmKHM9cy50b0xvd2VyQ2FzZSgpKSwhKFsiaGV4IiwidXRmOCIsInV0Zi04IiwiYXNjaWkiLCJiaW5hcnkiLCJiYXNlNjQiLCJ1Y3MyIiwidWNzLTIiLCJ1dGYxNmxlIiwidXRmLTE2bGUiLCJyYXciXS5pbmRleE9mKChzKyIiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IGFlKHMpO3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz1zLHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZS5wcm90b3R5cGUsIndyaXRhYmxlQnVmZmVyIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwid3JpdGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya319KSxXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHMsbyxpKXtpKG5ldyBWKCJfd3JpdGUoKSIpKX0sV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXY9bnVsbCxXcml0YWJsZS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHMsbyxpKXt2YXIgYT10aGlzLl93cml0YWJsZVN0YXRlO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBzPyhpPXMscz1udWxsLG89bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIG8mJihpPW8sbz1udWxsKSxudWxsIT1zJiZ0aGlzLndyaXRlKHMsbyksYS5jb3JrZWQmJihhLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLGEuZW5kaW5nfHxmdW5jdGlvbiBlbmRXcml0YWJsZShzLG8saSl7by5lbmRpbmc9ITAsZmluaXNoTWF5YmUocyxvKSxpJiYoby5maW5pc2hlZD91Lm5leHRUaWNrKGkpOnMub25jZSgiZmluaXNoIixpKSk7by5lbmRlZD0hMCxzLndyaXRhYmxlPSExfSh0aGlzLGEsaSksdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwid3JpdGFibGVMZW5ndGgiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbiBnZXQoKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGh9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwiZGVzdHJveWVkIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24gZ2V0KCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24gc2V0KHMpe3RoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD1zKX19KSxXcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveT1MLmRlc3Ryb3ksV3JpdGFibGUucHJvdG90eXBlLl91bmRlc3Ryb3k9TC51bmRlc3Ryb3ksV3JpdGFibGUucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHMsbyl7byhzKX19LDI5NTUocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYSx1PWkoNjU2MDYpO2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShzLG8saSl7cmV0dXJuKG89ZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkocyl7dmFyIG89ZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHMsbyl7aWYoIm9iamVjdCIhPXR5cGVvZiBzfHxudWxsPT09cylyZXR1cm4gczt2YXIgaT1zW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09aSl7dmFyIGE9aS5jYWxsKHMsb3x8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9dHlwZW9mIGEpcmV0dXJuIGE7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT1vP1N0cmluZzpOdW1iZXIpKHMpfShzLCJzdHJpbmciKTtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIG8/bzpTdHJpbmcobyl9KG8pKWluIHM/T2JqZWN0LmRlZmluZVByb3BlcnR5KHMsbyx7dmFsdWU6aSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnNbb109aSxzfXZhciBfPWkoODYyMzgpLHc9U3ltYm9sKCJsYXN0UmVzb2x2ZSIpLHg9U3ltYm9sKCJsYXN0UmVqZWN0IiksQz1TeW1ib2woImVycm9yIiksaj1TeW1ib2woImVuZGVkIiksTD1TeW1ib2woImxhc3RQcm9taXNlIiksQj1TeW1ib2woImhhbmRsZVByb21pc2UiKSwkPVN5bWJvbCgic3RyZWFtIik7ZnVuY3Rpb24gY3JlYXRlSXRlclJlc3VsdChzLG8pe3JldHVybnt2YWx1ZTpzLGRvbmU6b319ZnVuY3Rpb24gcmVhZEFuZFJlc29sdmUocyl7dmFyIG89c1t3XTtpZihudWxsIT09byl7dmFyIGk9c1skXS5yZWFkKCk7bnVsbCE9PWkmJihzW0xdPW51bGwsc1t3XT1udWxsLHNbeF09bnVsbCxvKGNyZWF0ZUl0ZXJSZXN1bHQoaSwhMSkpKX19ZnVuY3Rpb24gb25SZWFkYWJsZShzKXt1Lm5leHRUaWNrKHJlYWRBbmRSZXNvbHZlLHMpfXZhciBVPU9iamVjdC5nZXRQcm90b3R5cGVPZigoZnVuY3Rpb24oKXt9KSksVj1PYmplY3Quc2V0UHJvdG90eXBlT2YoKF9kZWZpbmVQcm9wZXJ0eShhPXtnZXQgc3RyZWFtKCl7cmV0dXJuIHRoaXNbJF19LG5leHQ6ZnVuY3Rpb24gbmV4dCgpe3ZhciBzPXRoaXMsbz10aGlzW0NdO2lmKG51bGwhPT1vKXJldHVybiBQcm9taXNlLnJlamVjdChvKTtpZih0aGlzW2pdKXJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlYXRlSXRlclJlc3VsdCh2b2lkIDAsITApKTtpZih0aGlzWyRdLmRlc3Ryb3llZClyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8saSl7dS5uZXh0VGljaygoZnVuY3Rpb24oKXtzW0NdP2koc1tDXSk6byhjcmVhdGVJdGVyUmVzdWx0KHZvaWQgMCwhMCkpfSkpfSkpO3ZhciBpLGE9dGhpc1tMXTtpZihhKWk9bmV3IFByb21pc2UoZnVuY3Rpb24gd3JhcEZvck5leHQocyxvKXtyZXR1cm4gZnVuY3Rpb24oaSxhKXtzLnRoZW4oKGZ1bmN0aW9uKCl7b1tqXT9pKGNyZWF0ZUl0ZXJSZXN1bHQodm9pZCAwLCEwKSk6b1tCXShpLGEpfSksYSl9fShhLHRoaXMpKTtlbHNle3ZhciBfPXRoaXNbJF0ucmVhZCgpO2lmKG51bGwhPT1fKXJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlYXRlSXRlclJlc3VsdChfLCExKSk7aT1uZXcgUHJvbWlzZSh0aGlzW0JdKX1yZXR1cm4gdGhpc1tMXT1pLGl9fSxTeW1ib2wuYXN5bmNJdGVyYXRvciwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKSxfZGVmaW5lUHJvcGVydHkoYSwicmV0dXJuIiwoZnVuY3Rpb24gX3JldHVybigpe3ZhciBzPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe3NbJF0uZGVzdHJveShudWxsLChmdW5jdGlvbihzKXtzP2kocyk6byhjcmVhdGVJdGVyUmVzdWx0KHZvaWQgMCwhMCkpfSkpfSkpfSkpLGEpLFUpO3MuZXhwb3J0cz1mdW5jdGlvbiBjcmVhdGVSZWFkYWJsZVN0cmVhbUFzeW5jSXRlcmF0b3Iocyl7dmFyIG8saT1PYmplY3QuY3JlYXRlKFYsKF9kZWZpbmVQcm9wZXJ0eShvPXt9LCQse3ZhbHVlOnMsd3JpdGFibGU6ITB9KSxfZGVmaW5lUHJvcGVydHkobyx3LHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksX2RlZmluZVByb3BlcnR5KG8seCx7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLF9kZWZpbmVQcm9wZXJ0eShvLEMse3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KSxfZGVmaW5lUHJvcGVydHkobyxqLHt2YWx1ZTpzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsd3JpdGFibGU6ITB9KSxfZGVmaW5lUHJvcGVydHkobyxCLHt2YWx1ZTpmdW5jdGlvbiB2YWx1ZShzLG8pe3ZhciBhPWlbJF0ucmVhZCgpO2E/KGlbTF09bnVsbCxpW3ddPW51bGwsaVt4XT1udWxsLHMoY3JlYXRlSXRlclJlc3VsdChhLCExKSkpOihpW3ddPXMsaVt4XT1vKX0sd3JpdGFibGU6ITB9KSxvKSk7cmV0dXJuIGlbTF09bnVsbCxfKHMsKGZ1bmN0aW9uKHMpe2lmKHMmJiJFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSIhPT1zLmNvZGUpe3ZhciBvPWlbeF07cmV0dXJuIG51bGwhPT1vJiYoaVtMXT1udWxsLGlbd109bnVsbCxpW3hdPW51bGwsbyhzKSksdm9pZChpW0NdPXMpfXZhciBhPWlbd107bnVsbCE9PWEmJihpW0xdPW51bGwsaVt3XT1udWxsLGlbeF09bnVsbCxhKGNyZWF0ZUl0ZXJSZXN1bHQodm9pZCAwLCEwKSkpLGlbal09ITB9KSkscy5vbigicmVhZGFibGUiLG9uUmVhZGFibGUuYmluZChudWxsLGkpKSxpfX0sODAzNDUocyxvLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvd25LZXlzKHMsbyl7dmFyIGk9T2JqZWN0LmtleXMocyk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTtvJiYoYT1hLmZpbHRlcigoZnVuY3Rpb24obyl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocyxvKS5lbnVtZXJhYmxlfSkpKSxpLnB1c2guYXBwbHkoaSxhKX1yZXR1cm4gaX1mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHMpe2Zvcih2YXIgbz0xO288YXJndW1lbnRzLmxlbmd0aDtvKyspe3ZhciBpPW51bGwhPWFyZ3VtZW50c1tvXT9hcmd1bWVudHNbb106e307byUyP293bktleXMoT2JqZWN0KGkpLCEwKS5mb3JFYWNoKChmdW5jdGlvbihvKXtfZGVmaW5lUHJvcGVydHkocyxvLGlbb10pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHMsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoaSkpOm93bktleXMoT2JqZWN0KGkpKS5mb3JFYWNoKChmdW5jdGlvbihvKXtPYmplY3QuZGVmaW5lUHJvcGVydHkocyxvLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxvKSl9KSl9cmV0dXJuIHN9ZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KHMsbyxpKXtyZXR1cm4obz1fdG9Qcm9wZXJ0eUtleShvKSlpbiBzP09iamVjdC5kZWZpbmVQcm9wZXJ0eShzLG8se3ZhbHVlOmksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpzW29dPWksc31mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyhzLG8pe2Zvcih2YXIgaT0wO2k8by5sZW5ndGg7aSsrKXt2YXIgYT1vW2ldO2EuZW51bWVyYWJsZT1hLmVudW1lcmFibGV8fCExLGEuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBhJiYoYS53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsX3RvUHJvcGVydHlLZXkoYS5rZXkpLGEpfX1mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShzKXt2YXIgbz1mdW5jdGlvbiBfdG9QcmltaXRpdmUocyxvKXtpZigib2JqZWN0IiE9dHlwZW9mIHN8fG51bGw9PT1zKXJldHVybiBzO3ZhciBpPXNbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1pKXt2YXIgYT1pLmNhbGwocyxvfHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT10eXBlb2YgYSlyZXR1cm4gYTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW8/U3RyaW5nOk51bWJlcikocyl9KHMsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT10eXBlb2Ygbz9vOlN0cmluZyhvKX12YXIgYT1pKDQ4Mjg3KS5CdWZmZXIsdT1pKDE1MzQwKS5pbnNwZWN0LF89dSYmdS5jdXN0b218fCJpbnNwZWN0IjtzLmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBCdWZmZXJMaXN0KCl7IWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhzLG8pe2lmKCEocyBpbnN0YW5jZW9mIG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLEJ1ZmZlckxpc3QpLHRoaXMuaGVhZD1udWxsLHRoaXMudGFpbD1udWxsLHRoaXMubGVuZ3RoPTB9cmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhzLG8saSl7cmV0dXJuIG8mJl9kZWZpbmVQcm9wZXJ0aWVzKHMucHJvdG90eXBlLG8pLGkmJl9kZWZpbmVQcm9wZXJ0aWVzKHMsaSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksc30oQnVmZmVyTGlzdCxbe2tleToicHVzaCIsdmFsdWU6ZnVuY3Rpb24gcHVzaChzKXt2YXIgbz17ZGF0YTpzLG5leHQ6bnVsbH07dGhpcy5sZW5ndGg+MD90aGlzLnRhaWwubmV4dD1vOnRoaXMuaGVhZD1vLHRoaXMudGFpbD1vLCsrdGhpcy5sZW5ndGh9fSx7a2V5OiJ1bnNoaWZ0Iix2YWx1ZTpmdW5jdGlvbiB1bnNoaWZ0KHMpe3ZhciBvPXtkYXRhOnMsbmV4dDp0aGlzLmhlYWR9OzA9PT10aGlzLmxlbmd0aCYmKHRoaXMudGFpbD1vKSx0aGlzLmhlYWQ9bywrK3RoaXMubGVuZ3RofX0se2tleToic2hpZnQiLHZhbHVlOmZ1bmN0aW9uIHNoaWZ0KCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgcz10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCxzfX19LHtrZXk6ImNsZWFyIix2YWx1ZTpmdW5jdGlvbiBjbGVhcigpe3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCx0aGlzLmxlbmd0aD0wfX0se2tleToiam9pbiIsdmFsdWU6ZnVuY3Rpb24gam9pbihzKXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBvPXRoaXMuaGVhZCxpPSIiK28uZGF0YTtvPW8ubmV4dDspaSs9cytvLmRhdGE7cmV0dXJuIGl9fSx7a2V5OiJjb25jYXQiLHZhbHVlOmZ1bmN0aW9uIGNvbmNhdChzKXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIGEuYWxsb2MoMCk7Zm9yKHZhciBvLGksdSxfPWEuYWxsb2NVbnNhZmUocz4+PjApLHc9dGhpcy5oZWFkLHg9MDt3OylvPXcuZGF0YSxpPV8sdT14LGEucHJvdG90eXBlLmNvcHkuY2FsbChvLGksdSkseCs9dy5kYXRhLmxlbmd0aCx3PXcubmV4dDtyZXR1cm4gX319LHtrZXk6ImNvbnN1bWUiLHZhbHVlOmZ1bmN0aW9uIGNvbnN1bWUocyxvKXt2YXIgaTtyZXR1cm4gczx0aGlzLmhlYWQuZGF0YS5sZW5ndGg/KGk9dGhpcy5oZWFkLmRhdGEuc2xpY2UoMCxzKSx0aGlzLmhlYWQuZGF0YT10aGlzLmhlYWQuZGF0YS5zbGljZShzKSk6aT1zPT09dGhpcy5oZWFkLmRhdGEubGVuZ3RoP3RoaXMuc2hpZnQoKTpvP3RoaXMuX2dldFN0cmluZyhzKTp0aGlzLl9nZXRCdWZmZXIocyksaX19LHtrZXk6ImZpcnN0Iix2YWx1ZTpmdW5jdGlvbiBmaXJzdCgpe3JldHVybiB0aGlzLmhlYWQuZGF0YX19LHtrZXk6Il9nZXRTdHJpbmciLHZhbHVlOmZ1bmN0aW9uIF9nZXRTdHJpbmcocyl7dmFyIG89dGhpcy5oZWFkLGk9MSxhPW8uZGF0YTtmb3Iocy09YS5sZW5ndGg7bz1vLm5leHQ7KXt2YXIgdT1vLmRhdGEsXz1zPnUubGVuZ3RoP3UubGVuZ3RoOnM7aWYoXz09PXUubGVuZ3RoP2ErPXU6YSs9dS5zbGljZSgwLHMpLDA9PT0ocy09Xykpe189PT11Lmxlbmd0aD8oKytpLG8ubmV4dD90aGlzLmhlYWQ9by5uZXh0OnRoaXMuaGVhZD10aGlzLnRhaWw9bnVsbCk6KHRoaXMuaGVhZD1vLG8uZGF0YT11LnNsaWNlKF8pKTticmVha30rK2l9cmV0dXJuIHRoaXMubGVuZ3RoLT1pLGF9fSx7a2V5OiJfZ2V0QnVmZmVyIix2YWx1ZTpmdW5jdGlvbiBfZ2V0QnVmZmVyKHMpe3ZhciBvPWEuYWxsb2NVbnNhZmUocyksaT10aGlzLmhlYWQsdT0xO2ZvcihpLmRhdGEuY29weShvKSxzLT1pLmRhdGEubGVuZ3RoO2k9aS5uZXh0Oyl7dmFyIF89aS5kYXRhLHc9cz5fLmxlbmd0aD9fLmxlbmd0aDpzO2lmKF8uY29weShvLG8ubGVuZ3RoLXMsMCx3KSwwPT09KHMtPXcpKXt3PT09Xy5sZW5ndGg/KCsrdSxpLm5leHQ/dGhpcy5oZWFkPWkubmV4dDp0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwpOih0aGlzLmhlYWQ9aSxpLmRhdGE9Xy5zbGljZSh3KSk7YnJlYWt9Kyt1fXJldHVybiB0aGlzLmxlbmd0aC09dSxvfX0se2tleTpfLHZhbHVlOmZ1bmN0aW9uIHZhbHVlKHMsbyl7cmV0dXJuIHUodGhpcyxfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sbykse30se2RlcHRoOjAsY3VzdG9tSW5zcGVjdDohMX0pKX19XSksQnVmZmVyTGlzdH0oKX0sNzU4OTYocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDY1NjA2KTtmdW5jdGlvbiBlbWl0RXJyb3JBbmRDbG9zZU5UKHMsbyl7ZW1pdEVycm9yTlQocyxvKSxlbWl0Q2xvc2VOVChzKX1mdW5jdGlvbiBlbWl0Q2xvc2VOVChzKXtzLl93cml0YWJsZVN0YXRlJiYhcy5fd3JpdGFibGVTdGF0ZS5lbWl0Q2xvc2V8fHMuX3JlYWRhYmxlU3RhdGUmJiFzLl9yZWFkYWJsZVN0YXRlLmVtaXRDbG9zZXx8cy5lbWl0KCJjbG9zZSIpfWZ1bmN0aW9uIGVtaXRFcnJvck5UKHMsbyl7cy5lbWl0KCJlcnJvciIsbyl9cy5leHBvcnRzPXtkZXN0cm95OmZ1bmN0aW9uIGRlc3Ryb3kocyxvKXt2YXIgaT10aGlzLHU9dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQsXz10aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtyZXR1cm4gdXx8Xz8obz9vKHMpOnMmJih0aGlzLl93cml0YWJsZVN0YXRlP3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkfHwodGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsYS5uZXh0VGljayhlbWl0RXJyb3JOVCx0aGlzLHMpKTphLm5leHRUaWNrKGVtaXRFcnJvck5ULHRoaXMscykpLHRoaXMpOih0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fZGVzdHJveShzfHxudWxsLChmdW5jdGlvbihzKXshbyYmcz9pLl93cml0YWJsZVN0YXRlP2kuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkP2EubmV4dFRpY2soZW1pdENsb3NlTlQsaSk6KGkuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLGEubmV4dFRpY2soZW1pdEVycm9yQW5kQ2xvc2VOVCxpLHMpKTphLm5leHRUaWNrKGVtaXRFcnJvckFuZENsb3NlTlQsaSxzKTpvPyhhLm5leHRUaWNrKGVtaXRDbG9zZU5ULGkpLG8ocykpOmEubmV4dFRpY2soZW1pdENsb3NlTlQsaSl9KSksdGhpcyl9LHVuZGVzdHJveTpmdW5jdGlvbiB1bmRlc3Ryb3koKXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkaW5nPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkPSExKSx0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZz0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmZpbmFsQ2FsbGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUucHJlZmluaXNoZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMSl9LGVycm9yT3JEZXN0cm95OmZ1bmN0aW9uIGVycm9yT3JEZXN0cm95KHMsbyl7dmFyIGk9cy5fcmVhZGFibGVTdGF0ZSxhPXMuX3dyaXRhYmxlU3RhdGU7aSYmaS5hdXRvRGVzdHJveXx8YSYmYS5hdXRvRGVzdHJveT9zLmRlc3Ryb3kobyk6cy5lbWl0KCJlcnJvciIsbyl9fX0sODYyMzgocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDg2MDQ4KS5GLkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFO2Z1bmN0aW9uIG5vb3AoKXt9cy5leHBvcnRzPWZ1bmN0aW9uIGVvcyhzLG8saSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8pcmV0dXJuIGVvcyhzLG51bGwsbyk7b3x8KG89e30pLGk9ZnVuY3Rpb24gb25jZShzKXt2YXIgbz0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighbyl7bz0hMDtmb3IodmFyIGk9YXJndW1lbnRzLmxlbmd0aCxhPW5ldyBBcnJheShpKSx1PTA7dTxpO3UrKylhW3VdPWFyZ3VtZW50c1t1XTtzLmFwcGx5KHRoaXMsYSl9fX0oaXx8bm9vcCk7dmFyIHU9by5yZWFkYWJsZXx8ITEhPT1vLnJlYWRhYmxlJiZzLnJlYWRhYmxlLF89by53cml0YWJsZXx8ITEhPT1vLndyaXRhYmxlJiZzLndyaXRhYmxlLHc9ZnVuY3Rpb24gb25sZWdhY3lmaW5pc2goKXtzLndyaXRhYmxlfHxDKCl9LHg9cy5fd3JpdGFibGVTdGF0ZSYmcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCxDPWZ1bmN0aW9uIG9uZmluaXNoKCl7Xz0hMSx4PSEwLHV8fGkuY2FsbChzKX0saj1zLl9yZWFkYWJsZVN0YXRlJiZzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQsTD1mdW5jdGlvbiBvbmVuZCgpe3U9ITEsaj0hMCxffHxpLmNhbGwocyl9LEI9ZnVuY3Rpb24gb25lcnJvcihvKXtpLmNhbGwocyxvKX0sJD1mdW5jdGlvbiBvbmNsb3NlKCl7dmFyIG87cmV0dXJuIHUmJiFqPyhzLl9yZWFkYWJsZVN0YXRlJiZzLl9yZWFkYWJsZVN0YXRlLmVuZGVkfHwobz1uZXcgYSksaS5jYWxsKHMsbykpOl8mJiF4PyhzLl93cml0YWJsZVN0YXRlJiZzLl93cml0YWJsZVN0YXRlLmVuZGVkfHwobz1uZXcgYSksaS5jYWxsKHMsbykpOnZvaWQgMH0sVT1mdW5jdGlvbiBvbnJlcXVlc3QoKXtzLnJlcS5vbigiZmluaXNoIixDKX07cmV0dXJuIWZ1bmN0aW9uIGlzUmVxdWVzdChzKXtyZXR1cm4gcy5zZXRIZWFkZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBzLmFib3J0fShzKT9fJiYhcy5fd3JpdGFibGVTdGF0ZSYmKHMub24oImVuZCIsdykscy5vbigiY2xvc2UiLHcpKToocy5vbigiY29tcGxldGUiLEMpLHMub24oImFib3J0IiwkKSxzLnJlcT9VKCk6cy5vbigicmVxdWVzdCIsVSkpLHMub24oImVuZCIsTCkscy5vbigiZmluaXNoIixDKSwhMSE9PW8uZXJyb3ImJnMub24oImVycm9yIixCKSxzLm9uKCJjbG9zZSIsJCksZnVuY3Rpb24oKXtzLnJlbW92ZUxpc3RlbmVyKCJjb21wbGV0ZSIsQykscy5yZW1vdmVMaXN0ZW5lcigiYWJvcnQiLCQpLHMucmVtb3ZlTGlzdGVuZXIoInJlcXVlc3QiLFUpLHMucmVxJiZzLnJlcS5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIixDKSxzLnJlbW92ZUxpc3RlbmVyKCJlbmQiLHcpLHMucmVtb3ZlTGlzdGVuZXIoImNsb3NlIix3KSxzLnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLEMpLHMucmVtb3ZlTGlzdGVuZXIoImVuZCIsTCkscy5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLEIpLHMucmVtb3ZlTGlzdGVuZXIoImNsb3NlIiwkKX19fSw1NTE1NyhzKXtzLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlJlYWRhYmxlLmZyb20gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnJvd3NlciIpfX0sNTc3NTgocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYTt2YXIgdT1pKDg2MDQ4KS5GLF89dS5FUlJfTUlTU0lOR19BUkdTLHc9dS5FUlJfU1RSRUFNX0RFU1RST1lFRDtmdW5jdGlvbiBub29wKHMpe2lmKHMpdGhyb3cgc31mdW5jdGlvbiBjYWxsKHMpe3MoKX1mdW5jdGlvbiBwaXBlKHMsbyl7cmV0dXJuIHMucGlwZShvKX1zLmV4cG9ydHM9ZnVuY3Rpb24gcGlwZWxpbmUoKXtmb3IodmFyIHM9YXJndW1lbnRzLmxlbmd0aCxvPW5ldyBBcnJheShzKSx1PTA7dTxzO3UrKylvW3VdPWFyZ3VtZW50c1t1XTt2YXIgeCxDPWZ1bmN0aW9uIHBvcENhbGxiYWNrKHMpe3JldHVybiBzLmxlbmd0aD8iZnVuY3Rpb24iIT10eXBlb2Ygc1tzLmxlbmd0aC0xXT9ub29wOnMucG9wKCk6bm9vcH0obyk7aWYoQXJyYXkuaXNBcnJheShvWzBdKSYmKG89b1swXSksby5sZW5ndGg8Mil0aHJvdyBuZXcgXygic3RyZWFtcyIpO3ZhciBqPW8ubWFwKChmdW5jdGlvbihzLHUpe3ZhciBfPXU8by5sZW5ndGgtMTtyZXR1cm4gZnVuY3Rpb24gZGVzdHJveWVyKHMsbyx1LF8pe189ZnVuY3Rpb24gb25jZShzKXt2YXIgbz0hMTtyZXR1cm4gZnVuY3Rpb24oKXtvfHwobz0hMCxzLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpKX19KF8pO3ZhciB4PSExO3Mub24oImNsb3NlIiwoZnVuY3Rpb24oKXt4PSEwfSkpLHZvaWQgMD09PWEmJihhPWkoODYyMzgpKSxhKHMse3JlYWRhYmxlOm8sd3JpdGFibGU6dX0sKGZ1bmN0aW9uKHMpe2lmKHMpcmV0dXJuIF8ocyk7eD0hMCxfKCl9KSk7dmFyIEM9ITE7cmV0dXJuIGZ1bmN0aW9uKG8pe2lmKCF4JiYhQylyZXR1cm4gQz0hMCxmdW5jdGlvbiBpc1JlcXVlc3Qocyl7cmV0dXJuIHMuc2V0SGVhZGVyJiYiZnVuY3Rpb24iPT10eXBlb2Ygcy5hYm9ydH0ocyk/cy5hYm9ydCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBzLmRlc3Ryb3k/cy5kZXN0cm95KCk6dm9pZCBfKG98fG5ldyB3KCJwaXBlIikpfX0ocyxfLHU+MCwoZnVuY3Rpb24ocyl7eHx8KHg9cykscyYmai5mb3JFYWNoKGNhbGwpLF98fChqLmZvckVhY2goY2FsbCksQyh4KSl9KSl9KSk7cmV0dXJuIG8ucmVkdWNlKHBpcGUpfX0sNjUyOTEocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDg2MDQ4KS5GLkVSUl9JTlZBTElEX09QVF9WQUxVRTtzLmV4cG9ydHM9e2dldEhpZ2hXYXRlck1hcms6ZnVuY3Rpb24gZ2V0SGlnaFdhdGVyTWFyayhzLG8saSx1KXt2YXIgXz1mdW5jdGlvbiBoaWdoV2F0ZXJNYXJrRnJvbShzLG8saSl7cmV0dXJuIG51bGwhPXMuaGlnaFdhdGVyTWFyaz9zLmhpZ2hXYXRlck1hcms6bz9zW2ldOm51bGx9KG8sdSxpKTtpZihudWxsIT1fKXtpZighaXNGaW5pdGUoXyl8fE1hdGguZmxvb3IoXykhPT1ffHxfPDApdGhyb3cgbmV3IGEodT9pOiJoaWdoV2F0ZXJNYXJrIixfKTtyZXR1cm4gTWF0aC5mbG9vcihfKX1yZXR1cm4gcy5vYmplY3RNb2RlPzE2OjE2Mzg0fX19LDQwMzQ1KHMsbyxpKXtzLmV4cG9ydHM9aSgzNzAwNykuRXZlbnRFbWl0dGVyfSw4NDk3NyhzLG8saSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgYT1mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHMpe3JldHVybiBzJiZzLl9fZXNNb2R1bGU/czp7ZGVmYXVsdDpzfX0oaSg5NDA0KSksdT1pKDU1Njc0KTtvLmRlZmF1bHQ9ZnVuY3Rpb24ocyl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmEuZGVmYXVsdC5NYXAsaT1PYmplY3Qua2V5cyhzKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bygpLF89YXJndW1lbnRzWzFdO3JldHVybiBhLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKG8pe2kuZm9yRWFjaCgoZnVuY3Rpb24oaSl7dmFyIGE9KDAsc1tpXSkoby5nZXQoaSksXyk7KDAsdS52YWxpZGF0ZU5leHRTdGF0ZSkoYSxpLF8pLG8uc2V0KGksYSl9KSl9KSl9fSxzLmV4cG9ydHM9by5kZWZhdWx0fSw4OTU5MyhzLG8saSl7InVzZSBzdHJpY3QiO28uSD12b2lkIDA7dmFyIGE9ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChzKXtyZXR1cm4gcyYmcy5fX2VzTW9kdWxlP3M6e2RlZmF1bHQ6c319KGkoODQ5NzcpKTtvLkg9YS5kZWZhdWx0fSw0ODU5MChzLG8peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksby5kZWZhdWx0PWZ1bmN0aW9uKHMpe3JldHVybiBzJiYiQEByZWR1eC9JTklUIj09PXMudHlwZT8iaW5pdGlhbFN0YXRlIGFyZ3VtZW50IHBhc3NlZCB0byBjcmVhdGVTdG9yZSI6InByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyIn0scy5leHBvcnRzPW8uZGVmYXVsdH0sODIyNjEocyxvLGkpeyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGE9X2ludGVyb3BSZXF1aXJlRGVmYXVsdChpKDk0MDQpKSx1PV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoaSg0ODU5MCkpO2Z1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocyl7cmV0dXJuIHMmJnMuX19lc01vZHVsZT9zOntkZWZhdWx0OnN9fW8uZGVmYXVsdD1mdW5jdGlvbihzLG8saSl7dmFyIF89T2JqZWN0LmtleXMobyk7aWYoIV8ubGVuZ3RoKXJldHVybiJTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLiI7dmFyIHc9KDAsdS5kZWZhdWx0KShpKTtpZihhLmRlZmF1bHQuaXNJbW11dGFibGU/IWEuZGVmYXVsdC5pc0ltbXV0YWJsZShzKTohYS5kZWZhdWx0Lkl0ZXJhYmxlLmlzSXRlcmFibGUocykpcmV0dXJuIlRoZSAiK3crJyBpcyBvZiB1bmV4cGVjdGVkIHR5cGUuIEV4cGVjdGVkIGFyZ3VtZW50IHRvIGJlIGFuIGluc3RhbmNlIG9mIEltbXV0YWJsZS5Db2xsZWN0aW9uIG9yIEltbXV0YWJsZS5SZWNvcmQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6ICInK18uam9pbignIiwgIicpKyciLic7dmFyIHg9cy50b1NlcSgpLmtleVNlcSgpLnRvQXJyYXkoKS5maWx0ZXIoKGZ1bmN0aW9uKHMpe3JldHVybiFvLmhhc093blByb3BlcnR5KHMpfSkpO3JldHVybiB4Lmxlbmd0aD4wPyJVbmV4cGVjdGVkICIrKDE9PT14Lmxlbmd0aD8icHJvcGVydHkiOiJwcm9wZXJ0aWVzIikrJyAiJyt4LmpvaW4oJyIsICInKSsnIiBmb3VuZCBpbiAnK3crJy4gRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIgcHJvcGVydHkgbmFtZXMgaW5zdGVhZDogIicrXy5qb2luKCciLCAiJykrJyIuIFVuZXhwZWN0ZWQgcHJvcGVydGllcyB3aWxsIGJlIGlnbm9yZWQuJzpudWxsfSxzLmV4cG9ydHM9by5kZWZhdWx0fSw1NTY3NChzLG8saSl7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxvLnZhbGlkYXRlTmV4dFN0YXRlPW8uZ2V0VW5leHBlY3RlZEludm9jYXRpb25QYXJhbWV0ZXJNZXNzYWdlPW8uZ2V0U3RhdGVOYW1lPXZvaWQgMDt2YXIgYT1faW50ZXJvcFJlcXVpcmVEZWZhdWx0KGkoNDg1OTApKSx1PV9pbnRlcm9wUmVxdWlyZURlZmF1bHQoaSg4MjI2MSkpLF89X2ludGVyb3BSZXF1aXJlRGVmYXVsdChpKDI3Mzc0KSk7ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChzKXtyZXR1cm4gcyYmcy5fX2VzTW9kdWxlP3M6e2RlZmF1bHQ6c319by5nZXRTdGF0ZU5hbWU9YS5kZWZhdWx0LG8uZ2V0VW5leHBlY3RlZEludm9jYXRpb25QYXJhbWV0ZXJNZXNzYWdlPXUuZGVmYXVsdCxvLnZhbGlkYXRlTmV4dFN0YXRlPV8uZGVmYXVsdH0sMjczNzQocyxvKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLG8uZGVmYXVsdD1mdW5jdGlvbihzLG8saSl7aWYodm9pZCAwPT09cyl0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXIgIicrbysnIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBoYW5kbGluZyAiJytpLnR5cGUrJyIgYWN0aW9uLiBUbyBpZ25vcmUgYW4gYWN0aW9uLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgcHJldmlvdXMgc3RhdGUuJyl9LHMuZXhwb3J0cz1vLmRlZmF1bHR9LDc1MjA4KHMpeyJ1c2Ugc3RyaWN0Ijt2YXIgbyxpPSIiO3MuZXhwb3J0cz1mdW5jdGlvbiByZXBlYXQocyxhKXtpZigic3RyaW5nIiE9dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhwZWN0ZWQgYSBzdHJpbmciKTtpZigxPT09YSlyZXR1cm4gcztpZigyPT09YSlyZXR1cm4gcytzO3ZhciB1PXMubGVuZ3RoKmE7aWYobyE9PXN8fHZvaWQgMD09PW8pbz1zLGk9IiI7ZWxzZSBpZihpLmxlbmd0aD49dSlyZXR1cm4gaS5zdWJzdHIoMCx1KTtmb3IoO3U+aS5sZW5ndGgmJmE+MTspMSZhJiYoaSs9cyksYT4+PTEscys9cztyZXR1cm4gaT0oaSs9cykuc3Vic3RyKDAsdSl9fSw5MjA2MyhzKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPWZ1bmN0aW9uIHJlcXVpcmVkKHMsbyl7aWYobz1vLnNwbGl0KCI6IilbMF0sIShzPStzKSlyZXR1cm4hMTtzd2l0Y2gobyl7Y2FzZSJodHRwIjpjYXNlIndzIjpyZXR1cm4gODAhPT1zO2Nhc2UiaHR0cHMiOmNhc2Uid3NzIjpyZXR1cm4gNDQzIT09cztjYXNlImZ0cCI6cmV0dXJuIDIxIT09cztjYXNlImdvcGhlciI6cmV0dXJuIDcwIT09cztjYXNlImZpbGUiOnJldHVybiExfXJldHVybiAwIT09c319LDI3MDk2KHMsbyxpKXtjb25zdCBhPWkoODc1ODYpLHU9aSg2MjA1KSxfPWkoMTAwMjMpLHc9aSg4MDQ4KTtzLmV4cG9ydHM9cz0+e3ZhciBvLGkseD0wLEM9e3R5cGU6dS5ST09ULHN0YWNrOltdfSxqPUMsTD1DLnN0YWNrLEI9W10scmVwZWF0RXJyPW89PnthLmVycm9yKHMsIk5vdGhpbmcgdG8gcmVwZWF0IGF0IGNvbHVtbiAiKyhvLTEpKX0sJD1hLnN0clRvQ2hhcnMocyk7Zm9yKG89JC5sZW5ndGg7eDxvOylzd2l0Y2goaT0kW3grK10pe2Nhc2UiXFwiOnN3aXRjaChpPSRbeCsrXSl7Y2FzZSJiIjpMLnB1c2gody53b3JkQm91bmRhcnkoKSk7YnJlYWs7Y2FzZSJCIjpMLnB1c2gody5ub25Xb3JkQm91bmRhcnkoKSk7YnJlYWs7Y2FzZSJ3IjpMLnB1c2goXy53b3JkcygpKTticmVhaztjYXNlIlciOkwucHVzaChfLm5vdFdvcmRzKCkpO2JyZWFrO2Nhc2UiZCI6TC5wdXNoKF8uaW50cygpKTticmVhaztjYXNlIkQiOkwucHVzaChfLm5vdEludHMoKSk7YnJlYWs7Y2FzZSJzIjpMLnB1c2goXy53aGl0ZXNwYWNlKCkpO2JyZWFrO2Nhc2UiUyI6TC5wdXNoKF8ubm90V2hpdGVzcGFjZSgpKTticmVhaztkZWZhdWx0Oi9cZC8udGVzdChpKT9MLnB1c2goe3R5cGU6dS5SRUZFUkVOQ0UsdmFsdWU6cGFyc2VJbnQoaSwxMCl9KTpMLnB1c2goe3R5cGU6dS5DSEFSLHZhbHVlOmkuY2hhckNvZGVBdCgwKX0pfWJyZWFrO2Nhc2UiXiI6TC5wdXNoKHcuYmVnaW4oKSk7YnJlYWs7Y2FzZSIkIjpMLnB1c2gody5lbmQoKSk7YnJlYWs7Y2FzZSJbIjp2YXIgVTsiXiI9PT0kW3hdPyhVPSEwLHgrKyk6VT0hMTt2YXIgVj1hLnRva2VuaXplQ2xhc3MoJC5zbGljZSh4KSxzKTt4Kz1WWzFdLEwucHVzaCh7dHlwZTp1LlNFVCxzZXQ6VlswXSxub3Q6VX0pO2JyZWFrO2Nhc2UiLiI6TC5wdXNoKF8uYW55Q2hhcigpKTticmVhaztjYXNlIigiOnZhciB6PXt0eXBlOnUuR1JPVVAsc3RhY2s6W10scmVtZW1iZXI6ITB9OyI/Ij09PShpPSRbeF0pJiYoaT0kW3grMV0seCs9MiwiPSI9PT1pP3ouZm9sbG93ZWRCeT0hMDoiISI9PT1pP3oubm90Rm9sbG93ZWRCeT0hMDoiOiIhPT1pJiZhLmVycm9yKHMsYEludmFsaWQgZ3JvdXAsIGNoYXJhY3RlciAnJHtpfScgYWZ0ZXIgJz8nIGF0IGNvbHVtbiBgKyh4LTEpKSx6LnJlbWVtYmVyPSExKSxMLnB1c2goeiksQi5wdXNoKGopLGo9eixMPXouc3RhY2s7YnJlYWs7Y2FzZSIpIjowPT09Qi5sZW5ndGgmJmEuZXJyb3IocywiVW5tYXRjaGVkICkgYXQgY29sdW1uICIrKHgtMSkpLEw9KGo9Qi5wb3AoKSkub3B0aW9ucz9qLm9wdGlvbnNbai5vcHRpb25zLmxlbmd0aC0xXTpqLnN0YWNrO2JyZWFrO2Nhc2UifCI6ai5vcHRpb25zfHwoai5vcHRpb25zPVtqLnN0YWNrXSxkZWxldGUgai5zdGFjayk7dmFyIFk9W107ai5vcHRpb25zLnB1c2goWSksTD1ZO2JyZWFrO2Nhc2UieyI6dmFyIFosZWUsaWU9L14oXGQrKSgsKFxkKyk/KT9cfS8uZXhlYygkLnNsaWNlKHgpKTtudWxsIT09aWU/KDA9PT1MLmxlbmd0aCYmcmVwZWF0RXJyKHgpLFo9cGFyc2VJbnQoaWVbMV0sMTApLGVlPWllWzJdP2llWzNdP3BhcnNlSW50KGllWzNdLDEwKToxLzA6Wix4Kz1pZVswXS5sZW5ndGgsTC5wdXNoKHt0eXBlOnUuUkVQRVRJVElPTixtaW46WixtYXg6ZWUsdmFsdWU6TC5wb3AoKX0pKTpMLnB1c2goe3R5cGU6dS5DSEFSLHZhbHVlOjEyM30pO2JyZWFrO2Nhc2UiPyI6MD09PUwubGVuZ3RoJiZyZXBlYXRFcnIoeCksTC5wdXNoKHt0eXBlOnUuUkVQRVRJVElPTixtaW46MCxtYXg6MSx2YWx1ZTpMLnBvcCgpfSk7YnJlYWs7Y2FzZSIrIjowPT09TC5sZW5ndGgmJnJlcGVhdEVycih4KSxMLnB1c2goe3R5cGU6dS5SRVBFVElUSU9OLG1pbjoxLG1heDoxLzAsdmFsdWU6TC5wb3AoKX0pO2JyZWFrO2Nhc2UiKiI6MD09PUwubGVuZ3RoJiZyZXBlYXRFcnIoeCksTC5wdXNoKHt0eXBlOnUuUkVQRVRJVElPTixtaW46MCxtYXg6MS8wLHZhbHVlOkwucG9wKCl9KTticmVhaztkZWZhdWx0OkwucHVzaCh7dHlwZTp1LkNIQVIsdmFsdWU6aS5jaGFyQ29kZUF0KDApfSl9cmV0dXJuIDAhPT1CLmxlbmd0aCYmYS5lcnJvcihzLCJVbnRlcm1pbmF0ZWQgZ3JvdXAiKSxDfSxzLmV4cG9ydHMudHlwZXM9dX0sODA0OChzLG8saSl7Y29uc3QgYT1pKDYyMDUpO28ud29yZEJvdW5kYXJ5PSgpPT4oe3R5cGU6YS5QT1NJVElPTix2YWx1ZToiYiJ9KSxvLm5vbldvcmRCb3VuZGFyeT0oKT0+KHt0eXBlOmEuUE9TSVRJT04sdmFsdWU6IkIifSksby5iZWdpbj0oKT0+KHt0eXBlOmEuUE9TSVRJT04sdmFsdWU6Il4ifSksby5lbmQ9KCk9Pih7dHlwZTphLlBPU0lUSU9OLHZhbHVlOiIkIn0pfSwxMDAyMyhzLG8saSl7Y29uc3QgYT1pKDYyMDUpLElOVFM9KCk9Plt7dHlwZTphLlJBTkdFLGZyb206NDgsdG86NTd9XSxXT1JEUz0oKT0+W3t0eXBlOmEuQ0hBUix2YWx1ZTo5NX0se3R5cGU6YS5SQU5HRSxmcm9tOjk3LHRvOjEyMn0se3R5cGU6YS5SQU5HRSxmcm9tOjY1LHRvOjkwfV0uY29uY2F0KElOVFMoKSksV0hJVEVTUEFDRT0oKT0+W3t0eXBlOmEuQ0hBUix2YWx1ZTo5fSx7dHlwZTphLkNIQVIsdmFsdWU6MTB9LHt0eXBlOmEuQ0hBUix2YWx1ZToxMX0se3R5cGU6YS5DSEFSLHZhbHVlOjEyfSx7dHlwZTphLkNIQVIsdmFsdWU6MTN9LHt0eXBlOmEuQ0hBUix2YWx1ZTozMn0se3R5cGU6YS5DSEFSLHZhbHVlOjE2MH0se3R5cGU6YS5DSEFSLHZhbHVlOjU3NjB9LHt0eXBlOmEuUkFOR0UsZnJvbTo4MTkyLHRvOjgyMDJ9LHt0eXBlOmEuQ0hBUix2YWx1ZTo4MjMyfSx7dHlwZTphLkNIQVIsdmFsdWU6ODIzM30se3R5cGU6YS5DSEFSLHZhbHVlOjgyMzl9LHt0eXBlOmEuQ0hBUix2YWx1ZTo4Mjg3fSx7dHlwZTphLkNIQVIsdmFsdWU6MTIyODh9LHt0eXBlOmEuQ0hBUix2YWx1ZTo2NTI3OX1dO28ud29yZHM9KCk9Pih7dHlwZTphLlNFVCxzZXQ6V09SRFMoKSxub3Q6ITF9KSxvLm5vdFdvcmRzPSgpPT4oe3R5cGU6YS5TRVQsc2V0OldPUkRTKCksbm90OiEwfSksby5pbnRzPSgpPT4oe3R5cGU6YS5TRVQsc2V0OklOVFMoKSxub3Q6ITF9KSxvLm5vdEludHM9KCk9Pih7dHlwZTphLlNFVCxzZXQ6SU5UUygpLG5vdDohMH0pLG8ud2hpdGVzcGFjZT0oKT0+KHt0eXBlOmEuU0VULHNldDpXSElURVNQQUNFKCksbm90OiExfSksby5ub3RXaGl0ZXNwYWNlPSgpPT4oe3R5cGU6YS5TRVQsc2V0OldISVRFU1BBQ0UoKSxub3Q6ITB9KSxvLmFueUNoYXI9KCk9Pih7dHlwZTphLlNFVCxzZXQ6W3t0eXBlOmEuQ0hBUix2YWx1ZToxMH0se3R5cGU6YS5DSEFSLHZhbHVlOjEzfSx7dHlwZTphLkNIQVIsdmFsdWU6ODIzMn0se3R5cGU6YS5DSEFSLHZhbHVlOjgyMzN9XSxub3Q6ITB9KX0sNjIwNShzKXtzLmV4cG9ydHM9e1JPT1Q6MCxHUk9VUDoxLFBPU0lUSU9OOjIsU0VUOjMsUkFOR0U6NCxSRVBFVElUSU9OOjUsUkVGRVJFTkNFOjYsQ0hBUjo3fX0sODc1ODYocyxvLGkpe2NvbnN0IGE9aSg2MjA1KSx1PWkoMTAwMjMpLF89ezA6MCx0OjksbjoxMCx2OjExLGY6MTIscjoxM307by5zdHJUb0NoYXJzPWZ1bmN0aW9uKHMpe3JldHVybiBzPXMucmVwbGFjZSgvKFxbXFxiXF0pfChcXCk/XFwoPzp1KFtBLUYwLTldezR9KXx4KFtBLUYwLTldezJ9KXwoMD9bMC03XXsyfSl8YyhbQEEtWltcXFxdXj9dKXwoWzB0bnZmcl0pKS9nLChmdW5jdGlvbihzLG8saSxhLHUsdyx4LEMpe2lmKGkpcmV0dXJuIHM7dmFyIGo9bz84OmE/cGFyc2VJbnQoYSwxNik6dT9wYXJzZUludCh1LDE2KTp3P3BhcnNlSW50KHcsOCk6eD8iQEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXV4gPyIuaW5kZXhPZih4KTpfW0NdLEw9U3RyaW5nLmZyb21DaGFyQ29kZShqKTtyZXR1cm4vW1tcXXt9XiQufD8qKygpXS8udGVzdChMKSYmKEw9IlxcIitMKSxMfSkpfSxvLnRva2VuaXplQ2xhc3M9KHMsaSk9Pntmb3IodmFyIF8sdyx4PVtdLEM9L1xcKD86KHcpfChkKXwocyl8KFcpfChEKXwoUykpfCgoPzooPzpcXCkoLil8KFteXF1cXF0pKS0oPzpcXCk/KFteXF1dKSl8KFxdKXwoPzpcXCk/KFteXSkvZztudWxsIT0oXz1DLmV4ZWMocykpOylpZihfWzFdKXgucHVzaCh1LndvcmRzKCkpO2Vsc2UgaWYoX1syXSl4LnB1c2godS5pbnRzKCkpO2Vsc2UgaWYoX1szXSl4LnB1c2godS53aGl0ZXNwYWNlKCkpO2Vsc2UgaWYoX1s0XSl4LnB1c2godS5ub3RXb3JkcygpKTtlbHNlIGlmKF9bNV0peC5wdXNoKHUubm90SW50cygpKTtlbHNlIGlmKF9bNl0peC5wdXNoKHUubm90V2hpdGVzcGFjZSgpKTtlbHNlIGlmKF9bN10peC5wdXNoKHt0eXBlOmEuUkFOR0UsZnJvbTooX1s4XXx8X1s5XSkuY2hhckNvZGVBdCgwKSx0bzpfWzEwXS5jaGFyQ29kZUF0KDApfSk7ZWxzZXtpZighKHc9X1sxMl0pKXJldHVyblt4LEMubGFzdEluZGV4XTt4LnB1c2goe3R5cGU6YS5DSEFSLHZhbHVlOncuY2hhckNvZGVBdCgwKX0pfW8uZXJyb3IoaSwiVW50ZXJtaW5hdGVkIGNoYXJhY3RlciBjbGFzcyIpfSxvLmVycm9yPShzLG8pPT57dGhyb3cgbmV3IFN5bnRheEVycm9yKCJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbjogLyIrcysiLzogIitvKX19LDkyODYxKHMsbyxpKXt2YXIgYT1pKDQ4Mjg3KSx1PWEuQnVmZmVyO2Z1bmN0aW9uIGNvcHlQcm9wcyhzLG8pe2Zvcih2YXIgaSBpbiBzKW9baV09c1tpXX1mdW5jdGlvbiBTYWZlQnVmZmVyKHMsbyxpKXtyZXR1cm4gdShzLG8saSl9dS5mcm9tJiZ1LmFsbG9jJiZ1LmFsbG9jVW5zYWZlJiZ1LmFsbG9jVW5zYWZlU2xvdz9zLmV4cG9ydHM9YTooY29weVByb3BzKGEsbyksby5CdWZmZXI9U2FmZUJ1ZmZlciksU2FmZUJ1ZmZlci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh1LnByb3RvdHlwZSksY29weVByb3BzKHUsU2FmZUJ1ZmZlciksU2FmZUJ1ZmZlci5mcm9tPWZ1bmN0aW9uKHMsbyxpKXtpZigibnVtYmVyIj09dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gdShzLG8saSl9LFNhZmVCdWZmZXIuYWxsb2M9ZnVuY3Rpb24ocyxvLGkpe2lmKCJudW1iZXIiIT10eXBlb2Ygcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIGE9dShzKTtyZXR1cm4gdm9pZCAwIT09bz8ic3RyaW5nIj09dHlwZW9mIGk/YS5maWxsKG8saSk6YS5maWxsKG8pOmEuZmlsbCgwKSxhfSxTYWZlQnVmZmVyLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHMpe2lmKCJudW1iZXIiIT10eXBlb2Ygcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIHUocyl9LFNhZmVCdWZmZXIuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHMpe2lmKCJudW1iZXIiIT10eXBlb2Ygcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIGEuU2xvd0J1ZmZlcihzKX19LDI5ODQ0KHMsbyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGYocyxvKXt2YXIgaT1zLmxlbmd0aDtzLnB1c2gobyk7ZTpmb3IoOzA8aTspe3ZhciBhPWktMT4+PjEsdT1zW2FdO2lmKCEoMDxnKHUsbykpKWJyZWFrIGU7c1thXT1vLHNbaV09dSxpPWF9fWZ1bmN0aW9uIGgocyl7cmV0dXJuIDA9PT1zLmxlbmd0aD9udWxsOnNbMF19ZnVuY3Rpb24gayhzKXtpZigwPT09cy5sZW5ndGgpcmV0dXJuIG51bGw7dmFyIG89c1swXSxpPXMucG9wKCk7aWYoaSE9PW8pe3NbMF09aTtlOmZvcih2YXIgYT0wLHU9cy5sZW5ndGgsXz11Pj4+MTthPF87KXt2YXIgdz0yKihhKzEpLTEseD1zW3ddLEM9dysxLGo9c1tDXTtpZigwPmcoeCxpKSlDPHUmJjA+ZyhqLHgpPyhzW2FdPWosc1tDXT1pLGE9Qyk6KHNbYV09eCxzW3ddPWksYT13KTtlbHNle2lmKCEoQzx1JiYwPmcoaixpKSkpYnJlYWsgZTtzW2FdPWosc1tDXT1pLGE9Q319fXJldHVybiBvfWZ1bmN0aW9uIGcocyxvKXt2YXIgaT1zLnNvcnRJbmRleC1vLnNvcnRJbmRleDtyZXR1cm4gMCE9PWk/aTpzLmlkLW8uaWR9aWYoIm9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHBlcmZvcm1hbmNlLm5vdyl7dmFyIGk9cGVyZm9ybWFuY2U7by51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gaS5ub3coKX19ZWxzZXt2YXIgYT1EYXRlLHU9YS5ub3coKTtvLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBhLm5vdygpLXV9fXZhciBfPVtdLHc9W10seD0xLEM9bnVsbCxqPTMsTD0hMSxCPSExLCQ9ITEsVT0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0Om51bGwsVj0iZnVuY3Rpb24iPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDpudWxsLHo9InVuZGVmaW5lZCIhPXR5cGVvZiBzZXRJbW1lZGlhdGU/c2V0SW1tZWRpYXRlOm51bGw7ZnVuY3Rpb24gRyhzKXtmb3IodmFyIG89aCh3KTtudWxsIT09bzspe2lmKG51bGw9PT1vLmNhbGxiYWNrKWsodyk7ZWxzZXtpZighKG8uc3RhcnRUaW1lPD1zKSlicmVhaztrKHcpLG8uc29ydEluZGV4PW8uZXhwaXJhdGlvblRpbWUsZihfLG8pfW89aCh3KX19ZnVuY3Rpb24gSChzKXtpZigkPSExLEcocyksIUIpaWYobnVsbCE9PWgoXykpQj0hMCxJKEopO2Vsc2V7dmFyIG89aCh3KTtudWxsIT09byYmSyhILG8uc3RhcnRUaW1lLXMpfX1mdW5jdGlvbiBKKHMsaSl7Qj0hMSwkJiYoJD0hMSxWKGllKSxpZT0tMSksTD0hMDt2YXIgYT1qO3RyeXtmb3IoRyhpKSxDPWgoXyk7bnVsbCE9PUMmJighKEMuZXhwaXJhdGlvblRpbWU+aSl8fHMmJiFNKCkpOyl7dmFyIHU9Qy5jYWxsYmFjaztpZigiZnVuY3Rpb24iPT10eXBlb2YgdSl7Qy5jYWxsYmFjaz1udWxsLGo9Qy5wcmlvcml0eUxldmVsO3ZhciB4PXUoQy5leHBpcmF0aW9uVGltZTw9aSk7aT1vLnVuc3RhYmxlX25vdygpLCJmdW5jdGlvbiI9PXR5cGVvZiB4P0MuY2FsbGJhY2s9eDpDPT09aChfKSYmayhfKSxHKGkpfWVsc2UgayhfKTtDPWgoXyl9aWYobnVsbCE9PUMpdmFyIFU9ITA7ZWxzZXt2YXIgej1oKHcpO251bGwhPT16JiZLKEgsei5zdGFydFRpbWUtaSksVT0hMX1yZXR1cm4gVX1maW5hbGx5e0M9bnVsbCxqPWEsTD0hMX19InVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3ImJnZvaWQgMCE9PW5hdmlnYXRvci5zY2hlZHVsaW5nJiZ2b2lkIDAhPT1uYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZyk7dmFyIFksWj0hMSxlZT1udWxsLGllPS0xLGFlPTUsY2U9LTE7ZnVuY3Rpb24gTSgpe3JldHVybiEoby51bnN0YWJsZV9ub3coKS1jZTxhZSl9ZnVuY3Rpb24gUigpe2lmKG51bGwhPT1lZSl7dmFyIHM9by51bnN0YWJsZV9ub3coKTtjZT1zO3ZhciBpPSEwO3RyeXtpPWVlKCEwLHMpfWZpbmFsbHl7aT9ZKCk6KFo9ITEsZWU9bnVsbCl9fWVsc2UgWj0hMX1pZigiZnVuY3Rpb24iPT10eXBlb2YgeilZPWZ1bmN0aW9uKCl7eihSKX07ZWxzZSBpZigidW5kZWZpbmVkIiE9dHlwZW9mIE1lc3NhZ2VDaGFubmVsKXt2YXIgbGU9bmV3IE1lc3NhZ2VDaGFubmVsLHBlPWxlLnBvcnQyO2xlLnBvcnQxLm9ubWVzc2FnZT1SLFk9ZnVuY3Rpb24oKXtwZS5wb3N0TWVzc2FnZShudWxsKX19ZWxzZSBZPWZ1bmN0aW9uKCl7VShSLDApfTtmdW5jdGlvbiBJKHMpe2VlPXMsWnx8KFo9ITAsWSgpKX1mdW5jdGlvbiBLKHMsaSl7aWU9VSgoZnVuY3Rpb24oKXtzKG8udW5zdGFibGVfbm93KCkpfSksaSl9by51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NSxvLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTEsby51bnN0YWJsZV9Mb3dQcmlvcml0eT00LG8udW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9MyxvLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsLG8udW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MixvLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKHMpe3MuY2FsbGJhY2s9bnVsbH0sby51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe0J8fEx8fChCPSEwLEkoSikpfSxvLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKHMpezA+c3x8MTI1PHM/Y29uc29sZS5lcnJvcigiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkIik6YWU9MDxzP01hdGguZmxvb3IoMWUzL3MpOjV9LG8udW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gan0sby51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZT1mdW5jdGlvbigpe3JldHVybiBoKF8pfSxvLnVuc3RhYmxlX25leHQ9ZnVuY3Rpb24ocyl7c3dpdGNoKGope2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOnZhciBvPTM7YnJlYWs7ZGVmYXVsdDpvPWp9dmFyIGk9ajtqPW87dHJ5e3JldHVybiBzKCl9ZmluYWxseXtqPWl9fSxvLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7fSxvLnVuc3RhYmxlX3JlcXVlc3RQYWludD1mdW5jdGlvbigpe30sby51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk9ZnVuY3Rpb24ocyxvKXtzd2l0Y2gocyl7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpicmVhaztkZWZhdWx0OnM9M312YXIgaT1qO2o9czt0cnl7cmV0dXJuIG8oKX1maW5hbGx5e2o9aX19LG8udW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaz1mdW5jdGlvbihzLGksYSl7dmFyIHU9by51bnN0YWJsZV9ub3coKTtzd2l0Y2goIm9iamVjdCI9PXR5cGVvZiBhJiZudWxsIT09YT9hPSJudW1iZXIiPT10eXBlb2YoYT1hLmRlbGF5KSYmMDxhP3UrYTp1OmE9dSxzKXtjYXNlIDE6dmFyIEM9LTE7YnJlYWs7Y2FzZSAyOkM9MjUwO2JyZWFrO2Nhc2UgNTpDPTEwNzM3NDE4MjM7YnJlYWs7Y2FzZSA0OkM9MWU0O2JyZWFrO2RlZmF1bHQ6Qz01ZTN9cmV0dXJuIHM9e2lkOngrKyxjYWxsYmFjazppLHByaW9yaXR5TGV2ZWw6cyxzdGFydFRpbWU6YSxleHBpcmF0aW9uVGltZTpDPWErQyxzb3J0SW5kZXg6LTF9LGE+dT8ocy5zb3J0SW5kZXg9YSxmKHcscyksbnVsbD09PWgoXykmJnM9PT1oKHcpJiYoJD8oVihpZSksaWU9LTEpOiQ9ITAsSyhILGEtdSkpKToocy5zb3J0SW5kZXg9QyxmKF8scyksQnx8THx8KEI9ITAsSShKKSkpLHN9LG8udW5zdGFibGVfc2hvdWxkWWllbGQ9TSxvLnVuc3RhYmxlX3dyYXBDYWxsYmFjaz1mdW5jdGlvbihzKXt2YXIgbz1qO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWo7aj1vO3RyeXtyZXR1cm4gcy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtqPWl9fX19LDY5OTgyKHMsbyxpKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPWkoMjk4NDQpfSwyMDMzNChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNDgyODcpLkJ1ZmZlcjtjbGFzcyBOb25FcnJvciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHMpe3N1cGVyKE5vbkVycm9yLl9wcmVwYXJlU3VwZXJNZXNzYWdlKHMpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibmFtZSIse3ZhbHVlOiJOb25FcnJvciIsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsTm9uRXJyb3IpfXN0YXRpYyBfcHJlcGFyZVN1cGVyTWVzc2FnZShzKXt0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHMpfWNhdGNoe3JldHVybiBTdHJpbmcocyl9fX1jb25zdCB1PVt7cHJvcGVydHk6Im5hbWUiLGVudW1lcmFibGU6ITF9LHtwcm9wZXJ0eToibWVzc2FnZSIsZW51bWVyYWJsZTohMX0se3Byb3BlcnR5OiJzdGFjayIsZW51bWVyYWJsZTohMX0se3Byb3BlcnR5OiJjb2RlIixlbnVtZXJhYmxlOiEwfV0sXz1TeW1ib2woIi50b0pTT04gY2FsbGVkIiksZGVzdHJveUNpcmN1bGFyPSh7ZnJvbTpzLHNlZW46byx0b186aSxmb3JjZUVudW1lcmFibGU6dyxtYXhEZXB0aDp4LGRlcHRoOkN9KT0+e2NvbnN0IGo9aXx8KEFycmF5LmlzQXJyYXkocyk/W106e30pO2lmKG8ucHVzaChzKSxDPj14KXJldHVybiBqO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBzLnRvSlNPTiYmITAhPT1zW19dKXJldHVybihzPT57c1tfXT0hMDtjb25zdCBvPXMudG9KU09OKCk7cmV0dXJuIGRlbGV0ZSBzW19dLG99KShzKTtmb3IoY29uc3RbaSx1XW9mIE9iamVjdC5lbnRyaWVzKHMpKSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLmlzQnVmZmVyKHUpP2pbaV09IltvYmplY3QgQnVmZmVyXSI6ImZ1bmN0aW9uIiE9dHlwZW9mIHUmJih1JiYib2JqZWN0Ij09dHlwZW9mIHU/by5pbmNsdWRlcyhzW2ldKT9qW2ldPSJbQ2lyY3VsYXJdIjooQysrLGpbaV09ZGVzdHJveUNpcmN1bGFyKHtmcm9tOnNbaV0sc2VlbjpvLnNsaWNlKCksZm9yY2VFbnVtZXJhYmxlOncsbWF4RGVwdGg6eCxkZXB0aDpDfSkpOmpbaV09dSk7Zm9yKGNvbnN0e3Byb3BlcnR5Om8sZW51bWVyYWJsZTppfW9mIHUpInN0cmluZyI9PXR5cGVvZiBzW29dJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoaixvLHt2YWx1ZTpzW29dLGVudW1lcmFibGU6ISF3fHxpLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pO3JldHVybiBqfTtzLmV4cG9ydHM9e3NlcmlhbGl6ZUVycm9yOihzLG89e30pPT57Y29uc3R7bWF4RGVwdGg6aT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFl9PW87cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBzJiZudWxsIT09cz9kZXN0cm95Q2lyY3VsYXIoe2Zyb206cyxzZWVuOltdLGZvcmNlRW51bWVyYWJsZTohMCxtYXhEZXB0aDppLGRlcHRoOjB9KToiZnVuY3Rpb24iPT10eXBlb2Ygcz9gW0Z1bmN0aW9uOiAke3MubmFtZXx8ImFub255bW91cyJ9XWA6c30sZGVzZXJpYWxpemVFcnJvcjoocyxvPXt9KT0+e2NvbnN0e21heERlcHRoOmk9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfT1vO2lmKHMgaW5zdGFuY2VvZiBFcnJvcilyZXR1cm4gcztpZigib2JqZWN0Ij09dHlwZW9mIHMmJm51bGwhPT1zJiYhQXJyYXkuaXNBcnJheShzKSl7Y29uc3Qgbz1uZXcgRXJyb3I7cmV0dXJuIGRlc3Ryb3lDaXJjdWxhcih7ZnJvbTpzLHNlZW46W10sdG9fOm8sbWF4RGVwdGg6aSxkZXB0aDowfSksb31yZXR1cm4gbmV3IE5vbkVycm9yKHMpfX19LDk2ODk3KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg3MDQ1MyksdT1pKDMwMDQxKSxfPWkoMzA1OTIpKCksdz1pKDc1Nzk1KSx4PWkoNjk2NzUpLEM9YSgiJU1hdGguZmxvb3IlIik7cy5leHBvcnRzPWZ1bmN0aW9uIHNldEZ1bmN0aW9uTGVuZ3RoKHMsbyl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHMpdGhyb3cgbmV3IHgoImBmbmAgaXMgbm90IGEgZnVuY3Rpb24iKTtpZigibnVtYmVyIiE9dHlwZW9mIG98fG88MHx8bz40Mjk0OTY3Mjk1fHxDKG8pIT09byl0aHJvdyBuZXcgeCgiYGxlbmd0aGAgbXVzdCBiZSBhIHBvc2l0aXZlIDMyLWJpdCBpbnRlZ2VyIik7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiYhIWFyZ3VtZW50c1syXSxhPSEwLGo9ITA7aWYoImxlbmd0aCJpbiBzJiZ3KXt2YXIgTD13KHMsImxlbmd0aCIpO0wmJiFMLmNvbmZpZ3VyYWJsZSYmKGE9ITEpLEwmJiFMLndyaXRhYmxlJiYoaj0hMSl9cmV0dXJuKGF8fGp8fCFpKSYmKF8/dShzLCJsZW5ndGgiLG8sITAsITApOnUocywibGVuZ3RoIixvKSksc319LDkwMzkyKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg5Mjg2MSkuQnVmZmVyLHU9aSgxNTM3Nyk7ZnVuY3Rpb24gSGFzaChzLG8pe3RoaXMuX2Jsb2NrPWEuYWxsb2MocyksdGhpcy5fZmluYWxTaXplPW8sdGhpcy5fYmxvY2tTaXplPXMsdGhpcy5fbGVuPTB9SGFzaC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHMsbyl7cz11KHMsb3x8InV0ZjgiKTtmb3IodmFyIGk9dGhpcy5fYmxvY2ssYT10aGlzLl9ibG9ja1NpemUsXz1zLmxlbmd0aCx3PXRoaXMuX2xlbix4PTA7eDxfOyl7Zm9yKHZhciBDPXclYSxqPU1hdGgubWluKF8teCxhLUMpLEw9MDtMPGo7TCsrKWlbQytMXT1zW3grTF07eCs9aiwodys9aiklYT09MCYmdGhpcy5fdXBkYXRlKGkpfXJldHVybiB0aGlzLl9sZW4rPV8sdGhpc30sSGFzaC5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKHMpe3ZhciBvPXRoaXMuX2xlbiV0aGlzLl9ibG9ja1NpemU7dGhpcy5fYmxvY2tbb109MTI4LHRoaXMuX2Jsb2NrLmZpbGwoMCxvKzEpLG8+PXRoaXMuX2ZpbmFsU2l6ZSYmKHRoaXMuX3VwZGF0ZSh0aGlzLl9ibG9jayksdGhpcy5fYmxvY2suZmlsbCgwKSk7dmFyIGk9OCp0aGlzLl9sZW47aWYoaTw9NDI5NDk2NzI5NSl0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKGksdGhpcy5fYmxvY2tTaXplLTQpO2Vsc2V7dmFyIGE9KDQyOTQ5NjcyOTUmaSk+Pj4wLHU9KGktYSkvNDI5NDk2NzI5Njt0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKHUsdGhpcy5fYmxvY2tTaXplLTgpLHRoaXMuX2Jsb2NrLndyaXRlVUludDMyQkUoYSx0aGlzLl9ibG9ja1NpemUtNCl9dGhpcy5fdXBkYXRlKHRoaXMuX2Jsb2NrKTt2YXIgXz10aGlzLl9oYXNoKCk7cmV0dXJuIHM/Xy50b1N0cmluZyhzKTpffSxIYXNoLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJfdXBkYXRlIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MiKX0scy5leHBvcnRzPUhhc2h9LDYyODAyKHMsbyxpKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPWZ1bmN0aW9uIFNIQShvKXt2YXIgaT1vLnRvTG93ZXJDYXNlKCksYT1zLmV4cG9ydHNbaV07aWYoIWEpdGhyb3cgbmV3IEVycm9yKGkrIiBpcyBub3Qgc3VwcG9ydGVkICh3ZSBhY2NlcHQgcHVsbCByZXF1ZXN0cykiKTtyZXR1cm4gbmV3IGF9LHMuZXhwb3J0cy5zaGE9aSgyNzgxNikscy5leHBvcnRzLnNoYTE9aSg2MzczNykscy5leHBvcnRzLnNoYTIyND1pKDI2NzEwKSxzLmV4cG9ydHMuc2hhMjU2PWkoMjQxMDcpLHMuZXhwb3J0cy5zaGEzODQ9aSgzMjgyNykscy5leHBvcnRzLnNoYTUxMj1pKDgyODkwKX0sMjc4MTYocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDU2Njk4KSx1PWkoOTAzOTIpLF89aSg5Mjg2MSkuQnVmZmVyLHc9WzE1MTg1MDAyNDksMTg1OTc3NTM5MywtMTg5NDAwNzU4OCwtODk5NDk3NTE0XSx4PW5ldyBBcnJheSg4MCk7ZnVuY3Rpb24gU2hhKCl7dGhpcy5pbml0KCksdGhpcy5fdz14LHUuY2FsbCh0aGlzLDY0LDU2KX1mdW5jdGlvbiByb3RsMzAocyl7cmV0dXJuIHM8PDMwfHM+Pj4yfWZ1bmN0aW9uIGZ0KHMsbyxpLGEpe3JldHVybiAwPT09cz9vJml8fm8mYToyPT09cz9vJml8byZhfGkmYTpvXmleYX1hKFNoYSx1KSxTaGEucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0xNzMyNTg0MTkzLHRoaXMuX2I9NDAyMzIzMzQxNyx0aGlzLl9jPTI1NjIzODMxMDIsdGhpcy5fZD0yNzE3MzM4NzgsdGhpcy5fZT0zMjg1Mzc3NTIwLHRoaXN9LFNoYS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihzKXtmb3IodmFyIG8saT10aGlzLl93LGE9MHx0aGlzLl9hLHU9MHx0aGlzLl9iLF89MHx0aGlzLl9jLHg9MHx0aGlzLl9kLEM9MHx0aGlzLl9lLGo9MDtqPDE2OysrailpW2pdPXMucmVhZEludDMyQkUoNCpqKTtmb3IoO2o8ODA7KytqKWlbal09aVtqLTNdXmlbai04XV5pW2otMTRdXmlbai0xNl07Zm9yKHZhciBMPTA7TDw4MDsrK0wpe3ZhciBCPX5+KEwvMjApLCQ9MHwoKG89YSk8PDV8bz4+PjI3KStmdChCLHUsXyx4KStDK2lbTF0rd1tCXTtDPXgseD1fLF89cm90bDMwKHUpLHU9YSxhPSR9dGhpcy5fYT1hK3RoaXMuX2F8MCx0aGlzLl9iPXUrdGhpcy5fYnwwLHRoaXMuX2M9Xyt0aGlzLl9jfDAsdGhpcy5fZD14K3RoaXMuX2R8MCx0aGlzLl9lPUMrdGhpcy5fZXwwfSxTaGEucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHM9Xy5hbGxvY1Vuc2FmZSgyMCk7cmV0dXJuIHMud3JpdGVJbnQzMkJFKDB8dGhpcy5fYSwwKSxzLndyaXRlSW50MzJCRSgwfHRoaXMuX2IsNCkscy53cml0ZUludDMyQkUoMHx0aGlzLl9jLDgpLHMud3JpdGVJbnQzMkJFKDB8dGhpcy5fZCwxMikscy53cml0ZUludDMyQkUoMHx0aGlzLl9lLDE2KSxzfSxzLmV4cG9ydHM9U2hhfSw2MzczNyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNTY2OTgpLHU9aSg5MDM5MiksXz1pKDkyODYxKS5CdWZmZXIsdz1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLC0xODk0MDA3NTg4LC04OTk0OTc1MTRdLHg9bmV3IEFycmF5KDgwKTtmdW5jdGlvbiBTaGExKCl7dGhpcy5pbml0KCksdGhpcy5fdz14LHUuY2FsbCh0aGlzLDY0LDU2KX1mdW5jdGlvbiByb3RsNShzKXtyZXR1cm4gczw8NXxzPj4+Mjd9ZnVuY3Rpb24gcm90bDMwKHMpe3JldHVybiBzPDwzMHxzPj4+Mn1mdW5jdGlvbiBmdChzLG8saSxhKXtyZXR1cm4gMD09PXM/byZpfH5vJmE6Mj09PXM/byZpfG8mYXxpJmE6b15pXmF9YShTaGExLHUpLFNoYTEucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0xNzMyNTg0MTkzLHRoaXMuX2I9NDAyMzIzMzQxNyx0aGlzLl9jPTI1NjIzODMxMDIsdGhpcy5fZD0yNzE3MzM4NzgsdGhpcy5fZT0zMjg1Mzc3NTIwLHRoaXN9LFNoYTEucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24ocyl7Zm9yKHZhciBvLGk9dGhpcy5fdyxhPTB8dGhpcy5fYSx1PTB8dGhpcy5fYixfPTB8dGhpcy5fYyx4PTB8dGhpcy5fZCxDPTB8dGhpcy5fZSxqPTA7ajwxNjsrK2opaVtqXT1zLnJlYWRJbnQzMkJFKDQqaik7Zm9yKDtqPDgwOysrailpW2pdPShvPWlbai0zXV5pW2otOF1eaVtqLTE0XV5pW2otMTZdKTw8MXxvPj4+MzE7Zm9yKHZhciBMPTA7TDw4MDsrK0wpe3ZhciBCPX5+KEwvMjApLCQ9cm90bDUoYSkrZnQoQix1LF8seCkrQytpW0xdK3dbQl18MDtDPXgseD1fLF89cm90bDMwKHUpLHU9YSxhPSR9dGhpcy5fYT1hK3RoaXMuX2F8MCx0aGlzLl9iPXUrdGhpcy5fYnwwLHRoaXMuX2M9Xyt0aGlzLl9jfDAsdGhpcy5fZD14K3RoaXMuX2R8MCx0aGlzLl9lPUMrdGhpcy5fZXwwfSxTaGExLnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciBzPV8uYWxsb2NVbnNhZmUoMjApO3JldHVybiBzLndyaXRlSW50MzJCRSgwfHRoaXMuX2EsMCkscy53cml0ZUludDMyQkUoMHx0aGlzLl9iLDQpLHMud3JpdGVJbnQzMkJFKDB8dGhpcy5fYyw4KSxzLndyaXRlSW50MzJCRSgwfHRoaXMuX2QsMTIpLHMud3JpdGVJbnQzMkJFKDB8dGhpcy5fZSwxNiksc30scy5leHBvcnRzPVNoYTF9LDI2NzEwKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg1NjY5OCksdT1pKDI0MTA3KSxfPWkoOTAzOTIpLHc9aSg5Mjg2MSkuQnVmZmVyLHg9bmV3IEFycmF5KDY0KTtmdW5jdGlvbiBTaGEyMjQoKXt0aGlzLmluaXQoKSx0aGlzLl93PXgsXy5jYWxsKHRoaXMsNjQsNTYpfWEoU2hhMjI0LHUpLFNoYTIyNC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hPTMyMzgzNzEwMzIsdGhpcy5fYj05MTQxNTA2NjMsdGhpcy5fYz04MTI3MDI5OTksdGhpcy5fZD00MTQ0OTEyNjk3LHRoaXMuX2U9NDI5MDc3NTg1Nyx0aGlzLl9mPTE3NTA2MDMwMjUsdGhpcy5fZz0xNjk0MDc2ODM5LHRoaXMuX2g9MzIwNDA3NTQyOCx0aGlzfSxTaGEyMjQucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHM9dy5hbGxvY1Vuc2FmZSgyOCk7cmV0dXJuIHMud3JpdGVJbnQzMkJFKHRoaXMuX2EsMCkscy53cml0ZUludDMyQkUodGhpcy5fYiw0KSxzLndyaXRlSW50MzJCRSh0aGlzLl9jLDgpLHMud3JpdGVJbnQzMkJFKHRoaXMuX2QsMTIpLHMud3JpdGVJbnQzMkJFKHRoaXMuX2UsMTYpLHMud3JpdGVJbnQzMkJFKHRoaXMuX2YsMjApLHMud3JpdGVJbnQzMkJFKHRoaXMuX2csMjQpLHN9LHMuZXhwb3J0cz1TaGEyMjR9LDI0MTA3KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg1NjY5OCksdT1pKDkwMzkyKSxfPWkoOTI4NjEpLkJ1ZmZlcix3PVsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdLHg9bmV3IEFycmF5KDY0KTtmdW5jdGlvbiBTaGEyNTYoKXt0aGlzLmluaXQoKSx0aGlzLl93PXgsdS5jYWxsKHRoaXMsNjQsNTYpfWZ1bmN0aW9uIGNoKHMsbyxpKXtyZXR1cm4gaV5zJihvXmkpfWZ1bmN0aW9uIG1haihzLG8saSl7cmV0dXJuIHMmb3xpJihzfG8pfWZ1bmN0aW9uIHNpZ21hMChzKXtyZXR1cm4ocz4+PjJ8czw8MzApXihzPj4+MTN8czw8MTkpXihzPj4+MjJ8czw8MTApfWZ1bmN0aW9uIHNpZ21hMShzKXtyZXR1cm4ocz4+PjZ8czw8MjYpXihzPj4+MTF8czw8MjEpXihzPj4+MjV8czw8Nyl9ZnVuY3Rpb24gZ2FtbWEwKHMpe3JldHVybihzPj4+N3xzPDwyNSleKHM+Pj4xOHxzPDwxNClecz4+PjN9YShTaGEyNTYsdSksU2hhMjU2LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2E9MTc3OTAzMzcwMyx0aGlzLl9iPTMxNDQxMzQyNzcsdGhpcy5fYz0xMDEzOTA0MjQyLHRoaXMuX2Q9Mjc3MzQ4MDc2Mix0aGlzLl9lPTEzNTk4OTMxMTksdGhpcy5fZj0yNjAwODIyOTI0LHRoaXMuX2c9NTI4NzM0NjM1LHRoaXMuX2g9MTU0MTQ1OTIyNSx0aGlzfSxTaGEyNTYucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24ocyl7Zm9yKHZhciBvLGk9dGhpcy5fdyxhPTB8dGhpcy5fYSx1PTB8dGhpcy5fYixfPTB8dGhpcy5fYyx4PTB8dGhpcy5fZCxDPTB8dGhpcy5fZSxqPTB8dGhpcy5fZixMPTB8dGhpcy5fZyxCPTB8dGhpcy5faCwkPTA7JDwxNjsrKyQpaVskXT1zLnJlYWRJbnQzMkJFKDQqJCk7Zm9yKDskPDY0OysrJClpWyRdPTB8KCgobz1pWyQtMl0pPj4+MTd8bzw8MTUpXihvPj4+MTl8bzw8MTMpXm8+Pj4xMCkraVskLTddK2dhbW1hMChpWyQtMTVdKStpWyQtMTZdO2Zvcih2YXIgVT0wO1U8NjQ7KytVKXt2YXIgVj1CK3NpZ21hMShDKStjaChDLGosTCkrd1tVXStpW1VdfDAsej1zaWdtYTAoYSkrbWFqKGEsdSxfKXwwO0I9TCxMPWosaj1DLEM9eCtWfDAseD1fLF89dSx1PWEsYT1WK3p8MH10aGlzLl9hPWErdGhpcy5fYXwwLHRoaXMuX2I9dSt0aGlzLl9ifDAsdGhpcy5fYz1fK3RoaXMuX2N8MCx0aGlzLl9kPXgrdGhpcy5fZHwwLHRoaXMuX2U9Qyt0aGlzLl9lfDAsdGhpcy5fZj1qK3RoaXMuX2Z8MCx0aGlzLl9nPUwrdGhpcy5fZ3wwLHRoaXMuX2g9Qit0aGlzLl9ofDB9LFNoYTI1Ni5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgcz1fLmFsbG9jVW5zYWZlKDMyKTtyZXR1cm4gcy53cml0ZUludDMyQkUodGhpcy5fYSwwKSxzLndyaXRlSW50MzJCRSh0aGlzLl9iLDQpLHMud3JpdGVJbnQzMkJFKHRoaXMuX2MsOCkscy53cml0ZUludDMyQkUodGhpcy5fZCwxMikscy53cml0ZUludDMyQkUodGhpcy5fZSwxNikscy53cml0ZUludDMyQkUodGhpcy5fZiwyMCkscy53cml0ZUludDMyQkUodGhpcy5fZywyNCkscy53cml0ZUludDMyQkUodGhpcy5faCwyOCksc30scy5leHBvcnRzPVNoYTI1Nn0sMzI4MjcocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDU2Njk4KSx1PWkoODI4OTApLF89aSg5MDM5Miksdz1pKDkyODYxKS5CdWZmZXIseD1uZXcgQXJyYXkoMTYwKTtmdW5jdGlvbiBTaGEzODQoKXt0aGlzLmluaXQoKSx0aGlzLl93PXgsXy5jYWxsKHRoaXMsMTI4LDExMil9YShTaGEzODQsdSksU2hhMzg0LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FoPTM0MTgwNzAzNjUsdGhpcy5fYmg9MTY1NDI3MDI1MCx0aGlzLl9jaD0yNDM4NTI5MzcwLHRoaXMuX2RoPTM1NTQ2MjM2MCx0aGlzLl9laD0xNzMxNDA1NDE1LHRoaXMuX2ZoPTIzOTQxODAyMzEsdGhpcy5fZ2g9MzY3NTAwODUyNSx0aGlzLl9oaD0xMjAzMDYyODEzLHRoaXMuX2FsPTMyMzgzNzEwMzIsdGhpcy5fYmw9OTE0MTUwNjYzLHRoaXMuX2NsPTgxMjcwMjk5OSx0aGlzLl9kbD00MTQ0OTEyNjk3LHRoaXMuX2VsPTQyOTA3NzU4NTcsdGhpcy5fZmw9MTc1MDYwMzAyNSx0aGlzLl9nbD0xNjk0MDc2ODM5LHRoaXMuX2hsPTMyMDQwNzU0MjgsdGhpc30sU2hhMzg0LnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciBzPXcuYWxsb2NVbnNhZmUoNDgpO2Z1bmN0aW9uIHdyaXRlSW50NjRCRShvLGksYSl7cy53cml0ZUludDMyQkUobyxhKSxzLndyaXRlSW50MzJCRShpLGErNCl9cmV0dXJuIHdyaXRlSW50NjRCRSh0aGlzLl9haCx0aGlzLl9hbCwwKSx3cml0ZUludDY0QkUodGhpcy5fYmgsdGhpcy5fYmwsOCksd3JpdGVJbnQ2NEJFKHRoaXMuX2NoLHRoaXMuX2NsLDE2KSx3cml0ZUludDY0QkUodGhpcy5fZGgsdGhpcy5fZGwsMjQpLHdyaXRlSW50NjRCRSh0aGlzLl9laCx0aGlzLl9lbCwzMiksd3JpdGVJbnQ2NEJFKHRoaXMuX2ZoLHRoaXMuX2ZsLDQwKSxzfSxzLmV4cG9ydHM9U2hhMzg0fSw4Mjg5MChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNTY2OTgpLHU9aSg5MDM5MiksXz1pKDkyODYxKS5CdWZmZXIsdz1bMTExNjM1MjQwOCwzNjA5NzY3NDU4LDE4OTk0NDc0NDEsNjAyODkxNzI1LDMwNDkzMjM0NzEsMzk2NDQ4NDM5OSwzOTIxMDA5NTczLDIxNzMyOTU1NDgsOTYxOTg3MTYzLDQwODE2Mjg0NzIsMTUwODk3MDk5MywzMDUzODM0MjY1LDI0NTM2MzU3NDgsMjkzNzY3MTU3OSwyODcwNzYzMjIxLDM2NjQ2MDk1NjAsMzYyNDM4MTA4MCwyNzM0ODgzMzk0LDMxMDU5ODQwMSwxMTY0OTk2NTQyLDYwNzIyNTI3OCwxMzIzNjEwNzY0LDE0MjY4ODE5ODcsMzU5MDMwNDk5NCwxOTI1MDc4Mzg4LDQwNjgxODIzODMsMjE2MjA3ODIwNiw5OTEzMzYxMTMsMjYxNDg4ODEwMyw2MzM4MDMzMTcsMzI0ODIyMjU4MCwzNDc5Nzc0ODY4LDM4MzUzOTA0MDEsMjY2NjYxMzQ1OCw0MDIyMjI0Nzc0LDk0NDcxMTEzOSwyNjQzNDcwNzgsMjM0MTI2Mjc3Myw2MDQ4MDc2MjgsMjAwNzgwMDkzMyw3NzAyNTU5ODMsMTQ5NTk5MDkwMSwxMjQ5MTUwMTIyLDE4NTY0MzEyMzUsMTU1NTA4MTY5MiwzMTc1MjE4MTMyLDE5OTYwNjQ5ODYsMjE5ODk1MDgzNywyNTU0MjIwODgyLDM5OTk3MTkzMzksMjgyMTgzNDM0OSw3NjY3ODQwMTYsMjk1Mjk5NjgwOCwyNTY2NTk0ODc5LDMyMTAzMTM2NzEsMzIwMzMzNzk1NiwzMzM2NTcxODkxLDEwMzQ0NTcwMjYsMzU4NDUyODcxMSwyNDY2OTQ4OTAxLDExMzkyNjk5MywzNzU4MzI2MzgzLDMzODI0MTg5NSwxNjg3MTc5MzYsNjY2MzA3MjA1LDExODgxNzk5NjQsNzczNTI5OTEyLDE1NDYwNDU3MzQsMTI5NDc1NzM3MiwxNTIyODA1NDg1LDEzOTYxODIyOTEsMjY0MzgzMzgyMywxNjk1MTgzNzAwLDIzNDM1MjczOTAsMTk4NjY2MTA1MSwxMDE0NDc3NDgwLDIxNzcwMjYzNTAsMTIwNjc1OTE0MiwyNDU2OTU2MDM3LDM0NDA3NzYyNywyNzMwNDg1OTIxLDEyOTA4NjM0NjAsMjgyMDMwMjQxMSwzMTU4NDU0MjczLDMyNTk3MzA4MDAsMzUwNTk1MjY1NywzMzQ1NzY0NzcxLDEwNjIxNzAwOCwzNTE2MDY1ODE3LDM2MDYwMDgzNDQsMzYwMDM1MjgwNCwxNDMyNzI1Nzc2LDQwOTQ1NzE5MDksMTQ2NzAzMTU5NCwyNzU0MjMzNDQsODUxMTY5NzIwLDQzMDIyNzczNCwzMTAwODIzNzUyLDUwNjk0ODYxNiwxMzYzMjU4MTk1LDY1OTA2MDU1NiwzNzUwNjg1NTkzLDg4Mzk5Nzg3NywzNzg1MDUwMjgwLDk1ODEzOTU3MSwzMzE4MzA3NDI3LDEzMjI4MjIyMTgsMzgxMjcyMzQwMywxNTM3MDAyMDYzLDIwMDMwMzQ5OTUsMTc0Nzg3Mzc3OSwzNjAyMDM2ODk5LDE5NTU1NjIyMjIsMTU3NTk5MDAxMiwyMDI0MTA0ODE1LDExMjU1OTI5MjgsMjIyNzczMDQ1MiwyNzE2OTA0MzA2LDIzNjE4NTI0MjQsNDQyNzc2MDQ0LDI0Mjg0MzY0NzQsNTkzNjk4MzQ0LDI3NTY3MzQxODcsMzczMzExMDI0OSwzMjA0MDMxNDc5LDI5OTkzNTE1NzMsMzMyOTMyNTI5OCwzODE1OTIwNDI3LDMzOTE1Njk2MTQsMzkyODM4MzkwMCwzNTE1MjY3MjcxLDU2NjI4MDcxMSwzOTQwMTg3NjA2LDM0NTQwNjk1MzQsNDExODYzMDI3MSw0MDAwMjM5OTkyLDExNjQxODQ3NCwxOTE0MTM4NTU0LDE3NDI5MjQyMSwyNzMxMDU1MjcwLDI4OTM4MDM1NiwzMjAzOTkzMDA2LDQ2MDM5MzI2OSwzMjA2MjAzMTUsNjg1NDcxNzMzLDU4NzQ5NjgzNiw4NTIxNDI5NzEsMTA4Njc5Mjg1MSwxMDE3MDM2Mjk4LDM2NTU0MzEwMCwxMTI2MDAwNTgwLDI2MTgyOTc2NzYsMTI4ODAzMzQ3MCwzNDA5ODU1MTU4LDE1MDE1MDU5NDgsNDIzNDUwOTg2NiwxNjA3MTY3OTE1LDk4NzE2NzQ2OCwxODE2NDAyMzE2LDEyNDYxODk1OTFdLHg9bmV3IEFycmF5KDE2MCk7ZnVuY3Rpb24gU2hhNTEyKCl7dGhpcy5pbml0KCksdGhpcy5fdz14LHUuY2FsbCh0aGlzLDEyOCwxMTIpfWZ1bmN0aW9uIENoKHMsbyxpKXtyZXR1cm4gaV5zJihvXmkpfWZ1bmN0aW9uIG1haihzLG8saSl7cmV0dXJuIHMmb3xpJihzfG8pfWZ1bmN0aW9uIHNpZ21hMChzLG8pe3JldHVybihzPj4+Mjh8bzw8NCleKG8+Pj4yfHM8PDMwKV4obz4+Pjd8czw8MjUpfWZ1bmN0aW9uIHNpZ21hMShzLG8pe3JldHVybihzPj4+MTR8bzw8MTgpXihzPj4+MTh8bzw8MTQpXihvPj4+OXxzPDwyMyl9ZnVuY3Rpb24gR2FtbWEwKHMsbyl7cmV0dXJuKHM+Pj4xfG88PDMxKV4ocz4+Pjh8bzw8MjQpXnM+Pj43fWZ1bmN0aW9uIEdhbW1hMGwocyxvKXtyZXR1cm4ocz4+PjF8bzw8MzEpXihzPj4+OHxvPDwyNCleKHM+Pj43fG88PDI1KX1mdW5jdGlvbiBHYW1tYTEocyxvKXtyZXR1cm4ocz4+PjE5fG88PDEzKV4obz4+PjI5fHM8PDMpXnM+Pj42fWZ1bmN0aW9uIEdhbW1hMWwocyxvKXtyZXR1cm4ocz4+PjE5fG88PDEzKV4obz4+PjI5fHM8PDMpXihzPj4+NnxvPDwyNil9ZnVuY3Rpb24gZ2V0Q2FycnkocyxvKXtyZXR1cm4gcz4+PjA8bz4+PjA/MTowfWEoU2hhNTEyLHUpLFNoYTUxMi5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9haD0xNzc5MDMzNzAzLHRoaXMuX2JoPTMxNDQxMzQyNzcsdGhpcy5fY2g9MTAxMzkwNDI0Mix0aGlzLl9kaD0yNzczNDgwNzYyLHRoaXMuX2VoPTEzNTk4OTMxMTksdGhpcy5fZmg9MjYwMDgyMjkyNCx0aGlzLl9naD01Mjg3MzQ2MzUsdGhpcy5faGg9MTU0MTQ1OTIyNSx0aGlzLl9hbD00MDg5MjM1NzIwLHRoaXMuX2JsPTIyMjc4NzM1OTUsdGhpcy5fY2w9NDI3MTE3NTcyMyx0aGlzLl9kbD0xNTk1NzUwMTI5LHRoaXMuX2VsPTI5MTc1NjUxMzcsdGhpcy5fZmw9NzI1NTExMTk5LHRoaXMuX2dsPTQyMTUzODk1NDcsdGhpcy5faGw9MzI3MDMzMjA5LHRoaXN9LFNoYTUxMi5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihzKXtmb3IodmFyIG89dGhpcy5fdyxpPTB8dGhpcy5fYWgsYT0wfHRoaXMuX2JoLHU9MHx0aGlzLl9jaCxfPTB8dGhpcy5fZGgseD0wfHRoaXMuX2VoLEM9MHx0aGlzLl9maCxqPTB8dGhpcy5fZ2gsTD0wfHRoaXMuX2hoLEI9MHx0aGlzLl9hbCwkPTB8dGhpcy5fYmwsVT0wfHRoaXMuX2NsLFY9MHx0aGlzLl9kbCx6PTB8dGhpcy5fZWwsWT0wfHRoaXMuX2ZsLFo9MHx0aGlzLl9nbCxlZT0wfHRoaXMuX2hsLGllPTA7aWU8MzI7aWUrPTIpb1tpZV09cy5yZWFkSW50MzJCRSg0KmllKSxvW2llKzFdPXMucmVhZEludDMyQkUoNCppZSs0KTtmb3IoO2llPDE2MDtpZSs9Mil7dmFyIGFlPW9baWUtMzBdLGNlPW9baWUtMzArMV0sbGU9R2FtbWEwKGFlLGNlKSxwZT1HYW1tYTBsKGNlLGFlKSxkZT1HYW1tYTEoYWU9b1tpZS00XSxjZT1vW2llLTQrMV0pLGZlPUdhbW1hMWwoY2UsYWUpLHllPW9baWUtMTRdLGJlPW9baWUtMTQrMV0sU2U9b1tpZS0zMl0sX2U9b1tpZS0zMisxXSx3ZT1wZStiZXwwLHhlPWxlK3llK2dldENhcnJ5KHdlLHBlKXwwO3hlPSh4ZT14ZStkZStnZXRDYXJyeSh3ZT13ZStmZXwwLGZlKXwwKStTZStnZXRDYXJyeSh3ZT13ZStfZXwwLF9lKXwwLG9baWVdPXhlLG9baWUrMV09d2V9Zm9yKHZhciBQZT0wO1BlPDE2MDtQZSs9Mil7eGU9b1tQZV0sd2U9b1tQZSsxXTt2YXIgVGU9bWFqKGksYSx1KSxSZT1tYWooQiwkLFUpLCRlPXNpZ21hMChpLEIpLHFlPXNpZ21hMChCLGkpLHplPXNpZ21hMSh4LHopLFdlPXNpZ21hMSh6LHgpLEhlPXdbUGVdLFllPXdbUGUrMV0sWGU9Q2goeCxDLGopLFFlPUNoKHosWSxaKSxldD1lZStXZXwwLHR0PUwremUrZ2V0Q2FycnkoZXQsZWUpfDA7dHQ9KHR0PSh0dD10dCtYZStnZXRDYXJyeShldD1ldCtRZXwwLFFlKXwwKStIZStnZXRDYXJyeShldD1ldCtZZXwwLFllKXwwKSt4ZStnZXRDYXJyeShldD1ldCt3ZXwwLHdlKXwwO3ZhciBydD1xZStSZXwwLG50PSRlK1RlK2dldENhcnJ5KHJ0LHFlKXwwO0w9aixlZT1aLGo9QyxaPVksQz14LFk9eix4PV8rdHQrZ2V0Q2Fycnkoej1WK2V0fDAsVil8MCxfPXUsVj1VLHU9YSxVPSQsYT1pLCQ9QixpPXR0K250K2dldENhcnJ5KEI9ZXQrcnR8MCxldCl8MH10aGlzLl9hbD10aGlzLl9hbCtCfDAsdGhpcy5fYmw9dGhpcy5fYmwrJHwwLHRoaXMuX2NsPXRoaXMuX2NsK1V8MCx0aGlzLl9kbD10aGlzLl9kbCtWfDAsdGhpcy5fZWw9dGhpcy5fZWwrenwwLHRoaXMuX2ZsPXRoaXMuX2ZsK1l8MCx0aGlzLl9nbD10aGlzLl9nbCtafDAsdGhpcy5faGw9dGhpcy5faGwrZWV8MCx0aGlzLl9haD10aGlzLl9haCtpK2dldENhcnJ5KHRoaXMuX2FsLEIpfDAsdGhpcy5fYmg9dGhpcy5fYmgrYStnZXRDYXJyeSh0aGlzLl9ibCwkKXwwLHRoaXMuX2NoPXRoaXMuX2NoK3UrZ2V0Q2FycnkodGhpcy5fY2wsVSl8MCx0aGlzLl9kaD10aGlzLl9kaCtfK2dldENhcnJ5KHRoaXMuX2RsLFYpfDAsdGhpcy5fZWg9dGhpcy5fZWgreCtnZXRDYXJyeSh0aGlzLl9lbCx6KXwwLHRoaXMuX2ZoPXRoaXMuX2ZoK0MrZ2V0Q2FycnkodGhpcy5fZmwsWSl8MCx0aGlzLl9naD10aGlzLl9naCtqK2dldENhcnJ5KHRoaXMuX2dsLFopfDAsdGhpcy5faGg9dGhpcy5faGgrTCtnZXRDYXJyeSh0aGlzLl9obCxlZSl8MH0sU2hhNTEyLnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciBzPV8uYWxsb2NVbnNhZmUoNjQpO2Z1bmN0aW9uIHdyaXRlSW50NjRCRShvLGksYSl7cy53cml0ZUludDMyQkUobyxhKSxzLndyaXRlSW50MzJCRShpLGErNCl9cmV0dXJuIHdyaXRlSW50NjRCRSh0aGlzLl9haCx0aGlzLl9hbCwwKSx3cml0ZUludDY0QkUodGhpcy5fYmgsdGhpcy5fYmwsOCksd3JpdGVJbnQ2NEJFKHRoaXMuX2NoLHRoaXMuX2NsLDE2KSx3cml0ZUludDY0QkUodGhpcy5fZGgsdGhpcy5fZGwsMjQpLHdyaXRlSW50NjRCRSh0aGlzLl9laCx0aGlzLl9lbCwzMiksd3JpdGVJbnQ2NEJFKHRoaXMuX2ZoLHRoaXMuX2ZsLDQwKSx3cml0ZUludDY0QkUodGhpcy5fZ2gsdGhpcy5fZ2wsNDgpLHdyaXRlSW50NjRCRSh0aGlzLl9oaCx0aGlzLl9obCw1Niksc30scy5leHBvcnRzPVNoYTUxMn0sODA2OChzKXsidXNlIHN0cmljdCI7dmFyIG89KCgpPT57dmFyIHM9T2JqZWN0LmRlZmluZVByb3BlcnR5LG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLGE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyx1PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksXz1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLF9fZGVmTm9ybWFsUHJvcD0obyxpLGEpPT5pIGluIG8/cyhvLGkse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmF9KTpvW2ldPWEsX19zcHJlYWRWYWx1ZXM9KHMsbyk9Pntmb3IodmFyIGkgaW4gb3x8KG89e30pKXUuY2FsbChvLGkpJiZfX2RlZk5vcm1hbFByb3AocyxpLG9baV0pO2lmKGEpZm9yKHZhciBpIG9mIGEobykpXy5jYWxsKG8saSkmJl9fZGVmTm9ybWFsUHJvcChzLGksb1tpXSk7cmV0dXJuIHN9LF9fcHVibGljRmllbGQ9KHMsbyxpKT0+X19kZWZOb3JtYWxQcm9wKHMsInN5bWJvbCIhPXR5cGVvZiBvP28rIiI6byxpKSx3PXt9OygobyxpKT0+e2Zvcih2YXIgYSBpbiBpKXMobyxhLHtnZXQ6aVthXSxlbnVtZXJhYmxlOiEwfSl9KSh3LHtERUZBVUxUX09QVElPTlM6KCk9PkMsREVGQVVMVF9VVUlEX0xFTkdUSDooKT0+eCxkZWZhdWx0OigpPT5CfSk7dmFyIHg9NixDPXtkaWN0aW9uYXJ5OiJhbHBoYW51bSIsc2h1ZmZsZTohMCxkZWJ1ZzohMSxsZW5ndGg6eCxjb3VudGVyOjB9LGo9Y2xhc3MgX1Nob3J0VW5pcXVlSWR7Y29uc3RydWN0b3Iocz17fSl7X19wdWJsaWNGaWVsZCh0aGlzLCJjb3VudGVyIiksX19wdWJsaWNGaWVsZCh0aGlzLCJkZWJ1ZyIpLF9fcHVibGljRmllbGQodGhpcywiZGljdCIpLF9fcHVibGljRmllbGQodGhpcywidmVyc2lvbiIpLF9fcHVibGljRmllbGQodGhpcywiZGljdEluZGV4IiwwKSxfX3B1YmxpY0ZpZWxkKHRoaXMsImRpY3RSYW5nZSIsW10pLF9fcHVibGljRmllbGQodGhpcywibG93ZXJCb3VuZCIsMCksX19wdWJsaWNGaWVsZCh0aGlzLCJ1cHBlckJvdW5kIiwwKSxfX3B1YmxpY0ZpZWxkKHRoaXMsImRpY3RMZW5ndGgiLDApLF9fcHVibGljRmllbGQodGhpcywidXVpZExlbmd0aCIpLF9fcHVibGljRmllbGQodGhpcywiX2RpZ2l0X2ZpcnN0X2FzY2lpIiw0OCksX19wdWJsaWNGaWVsZCh0aGlzLCJfZGlnaXRfbGFzdF9hc2NpaSIsNTgpLF9fcHVibGljRmllbGQodGhpcywiX2FscGhhX2xvd2VyX2ZpcnN0X2FzY2lpIiw5NyksX19wdWJsaWNGaWVsZCh0aGlzLCJfYWxwaGFfbG93ZXJfbGFzdF9hc2NpaSIsMTIzKSxfX3B1YmxpY0ZpZWxkKHRoaXMsIl9oZXhfbGFzdF9hc2NpaSIsMTAzKSxfX3B1YmxpY0ZpZWxkKHRoaXMsIl9hbHBoYV91cHBlcl9maXJzdF9hc2NpaSIsNjUpLF9fcHVibGljRmllbGQodGhpcywiX2FscGhhX3VwcGVyX2xhc3RfYXNjaWkiLDkxKSxfX3B1YmxpY0ZpZWxkKHRoaXMsIl9udW1iZXJfZGljdF9yYW5nZXMiLHtkaWdpdHM6W3RoaXMuX2RpZ2l0X2ZpcnN0X2FzY2lpLHRoaXMuX2RpZ2l0X2xhc3RfYXNjaWldfSksX19wdWJsaWNGaWVsZCh0aGlzLCJfYWxwaGFfZGljdF9yYW5nZXMiLHtsb3dlckNhc2U6W3RoaXMuX2FscGhhX2xvd2VyX2ZpcnN0X2FzY2lpLHRoaXMuX2FscGhhX2xvd2VyX2xhc3RfYXNjaWldLHVwcGVyQ2FzZTpbdGhpcy5fYWxwaGFfdXBwZXJfZmlyc3RfYXNjaWksdGhpcy5fYWxwaGFfdXBwZXJfbGFzdF9hc2NpaV19KSxfX3B1YmxpY0ZpZWxkKHRoaXMsIl9hbHBoYV9sb3dlcl9kaWN0X3JhbmdlcyIse2xvd2VyQ2FzZTpbdGhpcy5fYWxwaGFfbG93ZXJfZmlyc3RfYXNjaWksdGhpcy5fYWxwaGFfbG93ZXJfbGFzdF9hc2NpaV19KSxfX3B1YmxpY0ZpZWxkKHRoaXMsIl9hbHBoYV91cHBlcl9kaWN0X3JhbmdlcyIse3VwcGVyQ2FzZTpbdGhpcy5fYWxwaGFfdXBwZXJfZmlyc3RfYXNjaWksdGhpcy5fYWxwaGFfdXBwZXJfbGFzdF9hc2NpaV19KSxfX3B1YmxpY0ZpZWxkKHRoaXMsIl9hbHBoYW51bV9kaWN0X3JhbmdlcyIse2RpZ2l0czpbdGhpcy5fZGlnaXRfZmlyc3RfYXNjaWksdGhpcy5fZGlnaXRfbGFzdF9hc2NpaV0sbG93ZXJDYXNlOlt0aGlzLl9hbHBoYV9sb3dlcl9maXJzdF9hc2NpaSx0aGlzLl9hbHBoYV9sb3dlcl9sYXN0X2FzY2lpXSx1cHBlckNhc2U6W3RoaXMuX2FscGhhX3VwcGVyX2ZpcnN0X2FzY2lpLHRoaXMuX2FscGhhX3VwcGVyX2xhc3RfYXNjaWldfSksX19wdWJsaWNGaWVsZCh0aGlzLCJfYWxwaGFudW1fbG93ZXJfZGljdF9yYW5nZXMiLHtkaWdpdHM6W3RoaXMuX2RpZ2l0X2ZpcnN0X2FzY2lpLHRoaXMuX2RpZ2l0X2xhc3RfYXNjaWldLGxvd2VyQ2FzZTpbdGhpcy5fYWxwaGFfbG93ZXJfZmlyc3RfYXNjaWksdGhpcy5fYWxwaGFfbG93ZXJfbGFzdF9hc2NpaV19KSxfX3B1YmxpY0ZpZWxkKHRoaXMsIl9hbHBoYW51bV91cHBlcl9kaWN0X3JhbmdlcyIse2RpZ2l0czpbdGhpcy5fZGlnaXRfZmlyc3RfYXNjaWksdGhpcy5fZGlnaXRfbGFzdF9hc2NpaV0sdXBwZXJDYXNlOlt0aGlzLl9hbHBoYV91cHBlcl9maXJzdF9hc2NpaSx0aGlzLl9hbHBoYV91cHBlcl9sYXN0X2FzY2lpXX0pLF9fcHVibGljRmllbGQodGhpcywiX2hleF9kaWN0X3JhbmdlcyIse2RlY0RpZ2l0czpbdGhpcy5fZGlnaXRfZmlyc3RfYXNjaWksdGhpcy5fZGlnaXRfbGFzdF9hc2NpaV0sYWxwaGFEaWdpdHM6W3RoaXMuX2FscGhhX2xvd2VyX2ZpcnN0X2FzY2lpLHRoaXMuX2hleF9sYXN0X2FzY2lpXX0pLF9fcHVibGljRmllbGQodGhpcywiX2RpY3RfcmFuZ2VzIix7X251bWJlcl9kaWN0X3Jhbmdlczp0aGlzLl9udW1iZXJfZGljdF9yYW5nZXMsX2FscGhhX2RpY3RfcmFuZ2VzOnRoaXMuX2FscGhhX2RpY3RfcmFuZ2VzLF9hbHBoYV9sb3dlcl9kaWN0X3Jhbmdlczp0aGlzLl9hbHBoYV9sb3dlcl9kaWN0X3JhbmdlcyxfYWxwaGFfdXBwZXJfZGljdF9yYW5nZXM6dGhpcy5fYWxwaGFfdXBwZXJfZGljdF9yYW5nZXMsX2FscGhhbnVtX2RpY3RfcmFuZ2VzOnRoaXMuX2FscGhhbnVtX2RpY3RfcmFuZ2VzLF9hbHBoYW51bV9sb3dlcl9kaWN0X3Jhbmdlczp0aGlzLl9hbHBoYW51bV9sb3dlcl9kaWN0X3JhbmdlcyxfYWxwaGFudW1fdXBwZXJfZGljdF9yYW5nZXM6dGhpcy5fYWxwaGFudW1fdXBwZXJfZGljdF9yYW5nZXMsX2hleF9kaWN0X3Jhbmdlczp0aGlzLl9oZXhfZGljdF9yYW5nZXN9KSxfX3B1YmxpY0ZpZWxkKHRoaXMsImxvZyIsKCguLi5zKT0+e2NvbnN0IG89Wy4uLnNdO29bMF09IltzaG9ydC11bmlxdWUtaWRdICIuY29uY2F0KHNbMF0pLCEwIT09dGhpcy5kZWJ1Z3x8InVuZGVmaW5lZCI9PXR5cGVvZiBjb25zb2xlfHxudWxsPT09Y29uc29sZXx8Y29uc29sZS5sb2coLi4ubyl9KSksX19wdWJsaWNGaWVsZCh0aGlzLCJfbm9ybWFsaXplRGljdGlvbmFyeSIsKChzLG8pPT57bGV0IGk7aWYocyYmQXJyYXkuaXNBcnJheShzKSYmcy5sZW5ndGg+MSlpPXM7ZWxzZXtpPVtdLHRoaXMuZGljdEluZGV4PTA7Y29uc3Qgbz0iXyIuY29uY2F0KHMsIl9kaWN0X3JhbmdlcyIpLGE9dGhpcy5fZGljdF9yYW5nZXNbb107bGV0IHU9MDtmb3IoY29uc3RbLHNdb2YgT2JqZWN0LmVudHJpZXMoYSkpe2NvbnN0W28saV09czt1Kz1NYXRoLmFicyhpLW8pfWk9bmV3IEFycmF5KHUpO2xldCBfPTA7Zm9yKGNvbnN0WyxzXW9mIE9iamVjdC5lbnRyaWVzKGEpKXt0aGlzLmRpY3RSYW5nZT1zLHRoaXMubG93ZXJCb3VuZD10aGlzLmRpY3RSYW5nZVswXSx0aGlzLnVwcGVyQm91bmQ9dGhpcy5kaWN0UmFuZ2VbMV07Y29uc3Qgbz10aGlzLmxvd2VyQm91bmQ8PXRoaXMudXBwZXJCb3VuZCxhPXRoaXMubG93ZXJCb3VuZCx1PXRoaXMudXBwZXJCb3VuZDtpZihvKWZvcihsZXQgcz1hO3M8dTtzKyspaVtfKytdPVN0cmluZy5mcm9tQ2hhckNvZGUocyksdGhpcy5kaWN0SW5kZXg9cztlbHNlIGZvcihsZXQgcz1hO3M+dTtzLS0paVtfKytdPVN0cmluZy5mcm9tQ2hhckNvZGUocyksdGhpcy5kaWN0SW5kZXg9c31pLmxlbmd0aD1ffWlmKG8pe2ZvcihsZXQgcz1pLmxlbmd0aC0xO3M+MDtzLS0pe2NvbnN0IG89TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihzKzEpKTtbaVtzXSxpW29dXT1baVtvXSxpW3NdXX19cmV0dXJuIGl9KSksX19wdWJsaWNGaWVsZCh0aGlzLCJzZXREaWN0aW9uYXJ5IiwoKHMsbyk9Pnt0aGlzLmRpY3Q9dGhpcy5fbm9ybWFsaXplRGljdGlvbmFyeShzLG8pLHRoaXMuZGljdExlbmd0aD10aGlzLmRpY3QubGVuZ3RoLHRoaXMuc2V0Q291bnRlcigwKX0pKSxfX3B1YmxpY0ZpZWxkKHRoaXMsInNlcSIsKCgpPT50aGlzLnNlcXVlbnRpYWxVVUlEKCkpKSxfX3B1YmxpY0ZpZWxkKHRoaXMsInNlcXVlbnRpYWxVVUlEIiwoKCk9Pntjb25zdCBzPXRoaXMuZGljdExlbmd0aCxvPXRoaXMuZGljdDtsZXQgaT10aGlzLmNvdW50ZXI7Y29uc3QgYT1bXTtkb3tjb25zdCB1PWklcztpPU1hdGgudHJ1bmMoaS9zKSxhLnB1c2gob1t1XSl9d2hpbGUoMCE9PWkpO2NvbnN0IHU9YS5qb2luKCIiKTtyZXR1cm4gdGhpcy5jb3VudGVyKz0xLHV9KSksX19wdWJsaWNGaWVsZCh0aGlzLCJybmQiLCgocz10aGlzLnV1aWRMZW5ndGh8fHgpPT50aGlzLnJhbmRvbVVVSUQocykpKSxfX3B1YmxpY0ZpZWxkKHRoaXMsInJhbmRvbVVVSUQiLCgocz10aGlzLnV1aWRMZW5ndGh8fHgpPT57aWYobnVsbD09c3x8czwxKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBVVUlEIExlbmd0aCBQcm92aWRlZCIpO2NvbnN0IG89bmV3IEFycmF5KHMpLGk9dGhpcy5kaWN0TGVuZ3RoLGE9dGhpcy5kaWN0O2ZvcihsZXQgdT0wO3U8czt1Kyspe2NvbnN0IHM9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmkpO29bdV09YVtzXX1yZXR1cm4gby5qb2luKCIiKX0pKSxfX3B1YmxpY0ZpZWxkKHRoaXMsImZtdCIsKChzLG8pPT50aGlzLmZvcm1hdHRlZFVVSUQocyxvKSkpLF9fcHVibGljRmllbGQodGhpcywiZm9ybWF0dGVkVVVJRCIsKChzLG8pPT57Y29uc3QgaT17JHI6dGhpcy5yYW5kb21VVUlELCRzOnRoaXMuc2VxdWVudGlhbFVVSUQsJHQ6dGhpcy5zdGFtcH07cmV0dXJuIHMucmVwbGFjZSgvXCRbcnNdXGR7MCx9fFwkdDB8XCR0WzEtOV1cZHsxLH0vZywocz0+e2NvbnN0IGE9cy5zbGljZSgwLDIpLHU9TnVtYmVyLnBhcnNlSW50KHMuc2xpY2UoMiksMTApO3JldHVybiIkcyI9PT1hP2lbYV0oKS5wYWRTdGFydCh1LCIwIik6IiR0Ij09PWEmJm8/aVthXSh1LG8pOmlbYV0odSl9KSl9KSksX19wdWJsaWNGaWVsZCh0aGlzLCJhdmFpbGFibGVVVUlEcyIsKChzPXRoaXMudXVpZExlbmd0aCk9Pk51bWJlci5wYXJzZUZsb2F0KChbLi4ubmV3IFNldCh0aGlzLmRpY3QpXS5sZW5ndGgqKnMpLnRvRml4ZWQoMCkpKSksX19wdWJsaWNGaWVsZCh0aGlzLCJfY29sbGlzaW9uQ2FjaGUiLG5ldyBNYXApLF9fcHVibGljRmllbGQodGhpcywiYXBwcm94TWF4QmVmb3JlQ29sbGlzaW9uIiwoKHM9dGhpcy5hdmFpbGFibGVVVUlEcyh0aGlzLnV1aWRMZW5ndGgpKT0+e2NvbnN0IG89cyxpPXRoaXMuX2NvbGxpc2lvbkNhY2hlLmdldChvKTtpZih2b2lkIDAhPT1pKXJldHVybiBpO2NvbnN0IGE9TnVtYmVyLnBhcnNlRmxvYXQoTWF0aC5zcXJ0KE1hdGguUEkvMipzKS50b0ZpeGVkKDIwKSk7cmV0dXJuIHRoaXMuX2NvbGxpc2lvbkNhY2hlLnNldChvLGEpLGF9KSksX19wdWJsaWNGaWVsZCh0aGlzLCJjb2xsaXNpb25Qcm9iYWJpbGl0eSIsKChzPXRoaXMuYXZhaWxhYmxlVVVJRHModGhpcy51dWlkTGVuZ3RoKSxvPXRoaXMudXVpZExlbmd0aCk9Pk51bWJlci5wYXJzZUZsb2F0KCh0aGlzLmFwcHJveE1heEJlZm9yZUNvbGxpc2lvbihzKS90aGlzLmF2YWlsYWJsZVVVSURzKG8pKS50b0ZpeGVkKDIwKSkpKSxfX3B1YmxpY0ZpZWxkKHRoaXMsInVuaXF1ZW5lc3MiLCgocz10aGlzLmF2YWlsYWJsZVVVSURzKHRoaXMudXVpZExlbmd0aCkpPT57Y29uc3Qgbz1OdW1iZXIucGFyc2VGbG9hdCgoMS10aGlzLmFwcHJveE1heEJlZm9yZUNvbGxpc2lvbihzKS9zKS50b0ZpeGVkKDIwKSk7cmV0dXJuIG8+MT8xOm88MD8wOm99KSksX19wdWJsaWNGaWVsZCh0aGlzLCJnZXRWZXJzaW9uIiwoKCk9PnRoaXMudmVyc2lvbikpLF9fcHVibGljRmllbGQodGhpcywic3RhbXAiLCgocyxvKT0+e2NvbnN0IGk9TWF0aC5mbG9vcigrKG98fG5ldyBEYXRlKS8xZTMpLnRvU3RyaW5nKDE2KTtpZigibnVtYmVyIj09dHlwZW9mIHMmJjA9PT1zKXJldHVybiBpO2lmKCJudW1iZXIiIT10eXBlb2Ygc3x8czwxMCl0aHJvdyBuZXcgRXJyb3IoWyJQYXJhbSBmaW5hbExlbmd0aCBtdXN0IGJlIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxMCwiLCJvciAwIGlmIHlvdSB3YW50IHRoZSByYXcgaGV4YWRlY2ltYWwgdGltZXN0YW1wIl0uam9pbigiXG4iKSk7Y29uc3QgYT1zLTksdT1NYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqKGE+MTU/MTU6YSkpLF89dGhpcy5yYW5kb21VVUlEKGEpO3JldHVybiIiLmNvbmNhdChfLnN1YnN0cmluZygwLHUpKS5jb25jYXQoaSkuY29uY2F0KF8uc3Vic3RyaW5nKHUpKS5jb25jYXQodS50b1N0cmluZygxNikpfSkpLF9fcHVibGljRmllbGQodGhpcywicGFyc2VTdGFtcCIsKChzLG8pPT57aWYobyYmIS90MHx0WzEtOV1cZHsxLH0vLnRlc3QobykpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZXh0cmFjdCBkYXRlIGZyb20gYSBmb3JtYXRlZCBVVUlEIHdpdGggbm8gdGltZXN0YW1wIGluIHRoZSBmb3JtYXQiKTtjb25zdCBpPW8/by5yZXBsYWNlKC9cJFtyc11cZHswLH18XCR0MHxcJHRbMS05XVxkezEsfS9nLChzPT57Y29uc3Qgbz17JHI6cz0+Wy4uLkFycmF5KHMpXS5tYXAoKCgpPT4iciIpKS5qb2luKCIiKSwkczpzPT5bLi4uQXJyYXkocyldLm1hcCgoKCk9PiJzIikpLmpvaW4oIiIpLCR0OnM9PlsuLi5BcnJheShzKV0ubWFwKCgoKT0+InQiKSkuam9pbigiIil9LGk9cy5zbGljZSgwLDIpLGE9TnVtYmVyLnBhcnNlSW50KHMuc2xpY2UoMiksMTApO3JldHVybiBvW2ldKGEpfSkpLnJlcGxhY2UoL14oLio/KSh0ezgsfSkoLiopJC9nLCgobyxpLGEpPT5zLnN1YnN0cmluZyhpLmxlbmd0aCxpLmxlbmd0aCthLmxlbmd0aCkpKTpzO2lmKDg9PT1pLmxlbmd0aClyZXR1cm4gbmV3IERhdGUoMWUzKk51bWJlci5wYXJzZUludChpLDE2KSk7aWYoaS5sZW5ndGg8MTApdGhyb3cgbmV3IEVycm9yKCJTdGFtcCBsZW5ndGggaW52YWxpZCIpO2NvbnN0IGE9TnVtYmVyLnBhcnNlSW50KGkuc3Vic3RyaW5nKGkubGVuZ3RoLTEpLDE2KTtyZXR1cm4gbmV3IERhdGUoMWUzKk51bWJlci5wYXJzZUludChpLnN1YnN0cmluZyhhLGErOCksMTYpKX0pKSxfX3B1YmxpY0ZpZWxkKHRoaXMsInNldENvdW50ZXIiLChzPT57dGhpcy5jb3VudGVyPXN9KSksX19wdWJsaWNGaWVsZCh0aGlzLCJ2YWxpZGF0ZSIsKChzLG8pPT57Y29uc3QgaT1vP3RoaXMuX25vcm1hbGl6ZURpY3Rpb25hcnkobyk6dGhpcy5kaWN0O3JldHVybiBzLnNwbGl0KCIiKS5ldmVyeSgocz0+aS5pbmNsdWRlcyhzKSkpfSkpO2NvbnN0IG89X19zcHJlYWRWYWx1ZXMoX19zcHJlYWRWYWx1ZXMoe30sQykscyk7dGhpcy5jb3VudGVyPTAsdGhpcy5kZWJ1Zz0hMSx0aGlzLmRpY3Q9W10sdGhpcy52ZXJzaW9uPSI1LjMuMiI7Y29uc3R7ZGljdGlvbmFyeTppLHNodWZmbGU6YSxsZW5ndGg6dSxjb3VudGVyOl99PW87dGhpcy51dWlkTGVuZ3RoPXUsdGhpcy5zZXREaWN0aW9uYXJ5KGksYSksdGhpcy5zZXRDb3VudGVyKF8pLHRoaXMuZGVidWc9by5kZWJ1Zyx0aGlzLmxvZyh0aGlzLmRpY3QpLHRoaXMubG9nKCJHZW5lcmF0b3IgaW5zdGFudGlhdGVkIHdpdGggRGljdGlvbmFyeSBTaXplICIuY29uY2F0KHRoaXMuZGljdExlbmd0aCwiIGFuZCBjb3VudGVyIHNldCB0byAiKS5jb25jYXQodGhpcy5jb3VudGVyKSksdGhpcy5sb2c9dGhpcy5sb2cuYmluZCh0aGlzKSx0aGlzLnNldERpY3Rpb25hcnk9dGhpcy5zZXREaWN0aW9uYXJ5LmJpbmQodGhpcyksdGhpcy5zZXRDb3VudGVyPXRoaXMuc2V0Q291bnRlci5iaW5kKHRoaXMpLHRoaXMuc2VxPXRoaXMuc2VxLmJpbmQodGhpcyksdGhpcy5zZXF1ZW50aWFsVVVJRD10aGlzLnNlcXVlbnRpYWxVVUlELmJpbmQodGhpcyksdGhpcy5ybmQ9dGhpcy5ybmQuYmluZCh0aGlzKSx0aGlzLnJhbmRvbVVVSUQ9dGhpcy5yYW5kb21VVUlELmJpbmQodGhpcyksdGhpcy5mbXQ9dGhpcy5mbXQuYmluZCh0aGlzKSx0aGlzLmZvcm1hdHRlZFVVSUQ9dGhpcy5mb3JtYXR0ZWRVVUlELmJpbmQodGhpcyksdGhpcy5hdmFpbGFibGVVVUlEcz10aGlzLmF2YWlsYWJsZVVVSURzLmJpbmQodGhpcyksdGhpcy5hcHByb3hNYXhCZWZvcmVDb2xsaXNpb249dGhpcy5hcHByb3hNYXhCZWZvcmVDb2xsaXNpb24uYmluZCh0aGlzKSx0aGlzLmNvbGxpc2lvblByb2JhYmlsaXR5PXRoaXMuY29sbGlzaW9uUHJvYmFiaWxpdHkuYmluZCh0aGlzKSx0aGlzLnVuaXF1ZW5lc3M9dGhpcy51bmlxdWVuZXNzLmJpbmQodGhpcyksdGhpcy5nZXRWZXJzaW9uPXRoaXMuZ2V0VmVyc2lvbi5iaW5kKHRoaXMpLHRoaXMuc3RhbXA9dGhpcy5zdGFtcC5iaW5kKHRoaXMpLHRoaXMucGFyc2VTdGFtcD10aGlzLnBhcnNlU3RhbXAuYmluZCh0aGlzKX19O19fcHVibGljRmllbGQoaiwiZGVmYXVsdCIsaik7dmFyIEwsQj1qO3JldHVybiBMPXcsKChhLF8sdyx4KT0+e2lmKF8mJiJvYmplY3QiPT10eXBlb2YgX3x8ImZ1bmN0aW9uIj09dHlwZW9mIF8pZm9yKGxldCBDIG9mIGkoXykpdS5jYWxsKGEsQyl8fEM9PT13fHxzKGEsQyx7Z2V0OigpPT5fW0NdLGVudW1lcmFibGU6ISh4PW8oXyxDKSl8fHguZW51bWVyYWJsZX0pO3JldHVybiBhfSkocyh7fSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksTCl9KSgpO3MuZXhwb3J0cz1vLmRlZmF1bHQsInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJihvPW8uZGVmYXVsdCl9LDg4MzEwKHMsbyxpKXtzLmV4cG9ydHM9U3RyZWFtO3ZhciBhPWkoMzcwMDcpLkV2ZW50RW1pdHRlcjtmdW5jdGlvbiBTdHJlYW0oKXthLmNhbGwodGhpcyl9aSg1NjY5OCkoU3RyZWFtLGEpLFN0cmVhbS5SZWFkYWJsZT1pKDQ1NDEyKSxTdHJlYW0uV3JpdGFibGU9aSgxNjcwOCksU3RyZWFtLkR1cGxleD1pKDI1MzgyKSxTdHJlYW0uVHJhbnNmb3JtPWkoNzQ2MTApLFN0cmVhbS5QYXNzVGhyb3VnaD1pKDYzNjAwKSxTdHJlYW0uZmluaXNoZWQ9aSg4NjIzOCksU3RyZWFtLnBpcGVsaW5lPWkoNTc3NTgpLFN0cmVhbS5TdHJlYW09U3RyZWFtLFN0cmVhbS5wcm90b3R5cGUucGlwZT1mdW5jdGlvbihzLG8pe3ZhciBpPXRoaXM7ZnVuY3Rpb24gb25kYXRhKG8pe3Mud3JpdGFibGUmJiExPT09cy53cml0ZShvKSYmaS5wYXVzZSYmaS5wYXVzZSgpfWZ1bmN0aW9uIG9uZHJhaW4oKXtpLnJlYWRhYmxlJiZpLnJlc3VtZSYmaS5yZXN1bWUoKX1pLm9uKCJkYXRhIixvbmRhdGEpLHMub24oImRyYWluIixvbmRyYWluKSxzLl9pc1N0ZGlvfHxvJiYhMT09PW8uZW5kfHwoaS5vbigiZW5kIixvbmVuZCksaS5vbigiY2xvc2UiLG9uY2xvc2UpKTt2YXIgdT0hMTtmdW5jdGlvbiBvbmVuZCgpe3V8fCh1PSEwLHMuZW5kKCkpfWZ1bmN0aW9uIG9uY2xvc2UoKXt1fHwodT0hMCwiZnVuY3Rpb24iPT10eXBlb2Ygcy5kZXN0cm95JiZzLmRlc3Ryb3koKSl9ZnVuY3Rpb24gb25lcnJvcihzKXtpZihjbGVhbnVwKCksMD09PWEubGlzdGVuZXJDb3VudCh0aGlzLCJlcnJvciIpKXRocm93IHN9ZnVuY3Rpb24gY2xlYW51cCgpe2kucmVtb3ZlTGlzdGVuZXIoImRhdGEiLG9uZGF0YSkscy5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLG9uZHJhaW4pLGkucmVtb3ZlTGlzdGVuZXIoImVuZCIsb25lbmQpLGkucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixvbmNsb3NlKSxpLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsb25lcnJvcikscy5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLG9uZXJyb3IpLGkucmVtb3ZlTGlzdGVuZXIoImVuZCIsY2xlYW51cCksaS5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGNsZWFudXApLHMucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixjbGVhbnVwKX1yZXR1cm4gaS5vbigiZXJyb3IiLG9uZXJyb3IpLHMub24oImVycm9yIixvbmVycm9yKSxpLm9uKCJlbmQiLGNsZWFudXApLGkub24oImNsb3NlIixjbGVhbnVwKSxzLm9uKCJjbG9zZSIsY2xlYW51cCkscy5lbWl0KCJwaXBlIixpKSxzfX0sODMxNDEocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDkyODYxKS5CdWZmZXIsdT1hLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHMpe3N3aXRjaCgocz0iIitzKSYmcy50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpjYXNlInJhdyI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19O2Z1bmN0aW9uIFN0cmluZ0RlY29kZXIocyl7dmFyIG87c3dpdGNoKHRoaXMuZW5jb2Rpbmc9ZnVuY3Rpb24gbm9ybWFsaXplRW5jb2Rpbmcocyl7dmFyIG89ZnVuY3Rpb24gX25vcm1hbGl6ZUVuY29kaW5nKHMpe2lmKCFzKXJldHVybiJ1dGY4Ijtmb3IodmFyIG87Oylzd2l0Y2gocyl7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4idXRmOCI7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiJ1dGYxNmxlIjtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiJsYXRpbjEiO2Nhc2UiYmFzZTY0IjpjYXNlImFzY2lpIjpjYXNlImhleCI6cmV0dXJuIHM7ZGVmYXVsdDppZihvKXJldHVybjtzPSgiIitzKS50b0xvd2VyQ2FzZSgpLG89ITB9fShzKTtpZigic3RyaW5nIiE9dHlwZW9mIG8mJihhLmlzRW5jb2Rpbmc9PT11fHwhdShzKSkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3MpO3JldHVybiBvfHxzfShzKSx0aGlzLmVuY29kaW5nKXtjYXNlInV0ZjE2bGUiOnRoaXMudGV4dD11dGYxNlRleHQsdGhpcy5lbmQ9dXRmMTZFbmQsbz00O2JyZWFrO2Nhc2UidXRmOCI6dGhpcy5maWxsTGFzdD11dGY4RmlsbExhc3Qsbz00O2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnRleHQ9YmFzZTY0VGV4dCx0aGlzLmVuZD1iYXNlNjRFbmQsbz0zO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHRoaXMud3JpdGU9c2ltcGxlV3JpdGUsdm9pZCh0aGlzLmVuZD1zaW1wbGVFbmQpfXRoaXMubGFzdE5lZWQ9MCx0aGlzLmxhc3RUb3RhbD0wLHRoaXMubGFzdENoYXI9YS5hbGxvY1Vuc2FmZShvKX1mdW5jdGlvbiB1dGY4Q2hlY2tCeXRlKHMpe3JldHVybiBzPD0xMjc/MDpzPj41PT02PzI6cz4+ND09MTQ/MzpzPj4zPT0zMD80OnM+PjY9PTI/LTE6LTJ9ZnVuY3Rpb24gdXRmOEZpbGxMYXN0KHMpe3ZhciBvPXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsaT1mdW5jdGlvbiB1dGY4Q2hlY2tFeHRyYUJ5dGVzKHMsbyxpKXtpZigxMjghPSgxOTImb1swXSkpcmV0dXJuIHMubGFzdE5lZWQ9MCwi77+9IjtpZihzLmxhc3ROZWVkPjEmJm8ubGVuZ3RoPjEpe2lmKDEyOCE9KDE5MiZvWzFdKSlyZXR1cm4gcy5sYXN0TmVlZD0xLCLvv70iO2lmKHMubGFzdE5lZWQ+MiYmby5sZW5ndGg+MiYmMTI4IT0oMTkyJm9bMl0pKXJldHVybiBzLmxhc3ROZWVkPTIsIu+/vSJ9fSh0aGlzLHMpO3JldHVybiB2b2lkIDAhPT1pP2k6dGhpcy5sYXN0TmVlZDw9cy5sZW5ndGg/KHMuY29weSh0aGlzLmxhc3RDaGFyLG8sMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCkpOihzLmNvcHkodGhpcy5sYXN0Q2hhcixvLDAscy5sZW5ndGgpLHZvaWQodGhpcy5sYXN0TmVlZC09cy5sZW5ndGgpKX1mdW5jdGlvbiB1dGYxNlRleHQocyxvKXtpZigocy5sZW5ndGgtbyklMj09MCl7dmFyIGk9cy50b1N0cmluZygidXRmMTZsZSIsbyk7aWYoaSl7dmFyIGE9aS5jaGFyQ29kZUF0KGkubGVuZ3RoLTEpO2lmKGE+PTU1Mjk2JiZhPD01NjMxOSlyZXR1cm4gdGhpcy5sYXN0TmVlZD0yLHRoaXMubGFzdFRvdGFsPTQsdGhpcy5sYXN0Q2hhclswXT1zW3MubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09c1tzLmxlbmd0aC0xXSxpLnNsaWNlKDAsLTEpfXJldHVybiBpfXJldHVybiB0aGlzLmxhc3ROZWVkPTEsdGhpcy5sYXN0VG90YWw9Mix0aGlzLmxhc3RDaGFyWzBdPXNbcy5sZW5ndGgtMV0scy50b1N0cmluZygidXRmMTZsZSIsbyxzLmxlbmd0aC0xKX1mdW5jdGlvbiB1dGYxNkVuZChzKXt2YXIgbz1zJiZzLmxlbmd0aD90aGlzLndyaXRlKHMpOiIiO2lmKHRoaXMubGFzdE5lZWQpe3ZhciBpPXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQ7cmV0dXJuIG8rdGhpcy5sYXN0Q2hhci50b1N0cmluZygidXRmMTZsZSIsMCxpKX1yZXR1cm4gb31mdW5jdGlvbiBiYXNlNjRUZXh0KHMsbyl7dmFyIGk9KHMubGVuZ3RoLW8pJTM7cmV0dXJuIDA9PT1pP3MudG9TdHJpbmcoImJhc2U2NCIsbyk6KHRoaXMubGFzdE5lZWQ9My1pLHRoaXMubGFzdFRvdGFsPTMsMT09PWk/dGhpcy5sYXN0Q2hhclswXT1zW3MubGVuZ3RoLTFdOih0aGlzLmxhc3RDaGFyWzBdPXNbcy5sZW5ndGgtMl0sdGhpcy5sYXN0Q2hhclsxXT1zW3MubGVuZ3RoLTFdKSxzLnRvU3RyaW5nKCJiYXNlNjQiLG8scy5sZW5ndGgtaSkpfWZ1bmN0aW9uIGJhc2U2NEVuZChzKXt2YXIgbz1zJiZzLmxlbmd0aD90aGlzLndyaXRlKHMpOiIiO3JldHVybiB0aGlzLmxhc3ROZWVkP28rdGhpcy5sYXN0Q2hhci50b1N0cmluZygiYmFzZTY0IiwwLDMtdGhpcy5sYXN0TmVlZCk6b31mdW5jdGlvbiBzaW1wbGVXcml0ZShzKXtyZXR1cm4gcy50b1N0cmluZyh0aGlzLmVuY29kaW5nKX1mdW5jdGlvbiBzaW1wbGVFbmQocyl7cmV0dXJuIHMmJnMubGVuZ3RoP3RoaXMud3JpdGUocyk6IiJ9by5JPVN0cmluZ0RlY29kZXIsU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24ocyl7aWYoMD09PXMubGVuZ3RoKXJldHVybiIiO3ZhciBvLGk7aWYodGhpcy5sYXN0TmVlZCl7aWYodm9pZCAwPT09KG89dGhpcy5maWxsTGFzdChzKSkpcmV0dXJuIiI7aT10aGlzLmxhc3ROZWVkLHRoaXMubGFzdE5lZWQ9MH1lbHNlIGk9MDtyZXR1cm4gaTxzLmxlbmd0aD9vP28rdGhpcy50ZXh0KHMsaSk6dGhpcy50ZXh0KHMsaSk6b3x8IiJ9LFN0cmluZ0RlY29kZXIucHJvdG90eXBlLmVuZD1mdW5jdGlvbiB1dGY4RW5kKHMpe3ZhciBvPXMmJnMubGVuZ3RoP3RoaXMud3JpdGUocyk6IiI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/bysi77+9IjpvfSxTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uIHV0ZjhUZXh0KHMsbyl7dmFyIGk9ZnVuY3Rpb24gdXRmOENoZWNrSW5jb21wbGV0ZShzLG8saSl7dmFyIGE9by5sZW5ndGgtMTtpZihhPGkpcmV0dXJuIDA7dmFyIHU9dXRmOENoZWNrQnl0ZShvW2FdKTtpZih1Pj0wKXJldHVybiB1PjAmJihzLmxhc3ROZWVkPXUtMSksdTtpZigtLWE8aXx8LTI9PT11KXJldHVybiAwO2lmKHU9dXRmOENoZWNrQnl0ZShvW2FdKSx1Pj0wKXJldHVybiB1PjAmJihzLmxhc3ROZWVkPXUtMiksdTtpZigtLWE8aXx8LTI9PT11KXJldHVybiAwO2lmKHU9dXRmOENoZWNrQnl0ZShvW2FdKSx1Pj0wKXJldHVybiB1PjAmJigyPT09dT91PTA6cy5sYXN0TmVlZD11LTMpLHU7cmV0dXJuIDB9KHRoaXMscyxvKTtpZighdGhpcy5sYXN0TmVlZClyZXR1cm4gcy50b1N0cmluZygidXRmOCIsbyk7dGhpcy5sYXN0VG90YWw9aTt2YXIgYT1zLmxlbmd0aC0oaS10aGlzLmxhc3ROZWVkKTtyZXR1cm4gcy5jb3B5KHRoaXMubGFzdENoYXIsMCxhKSxzLnRvU3RyaW5nKCJ1dGY4IixvLGEpfSxTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5maWxsTGFzdD1mdW5jdGlvbihzKXtpZih0aGlzLmxhc3ROZWVkPD1zLmxlbmd0aClyZXR1cm4gcy5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHRoaXMubGFzdE5lZWQpLHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLHRoaXMubGFzdFRvdGFsKTtzLmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAscy5sZW5ndGgpLHRoaXMubGFzdE5lZWQtPXMubGVuZ3RofX0sMTUzNzcocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDkyODYxKS5CdWZmZXIsdT1pKDY0NjM0KSxfPWkoNzQzNzIpLHc9QXJyYXlCdWZmZXIuaXNWaWV3fHxmdW5jdGlvbiBpc1ZpZXcocyl7dHJ5e3JldHVybiBfKHMpLCEwfWNhdGNoKHMpe3JldHVybiExfX0seD0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXksQz0idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXksaj1DJiYoYS5wcm90b3R5cGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxhLlRZUEVEX0FSUkFZX1NVUFBPUlQpO3MuZXhwb3J0cz1mdW5jdGlvbiB0b0J1ZmZlcihzLG8pe2lmKHMgaW5zdGFuY2VvZiBhKXJldHVybiBzO2lmKCJzdHJpbmciPT10eXBlb2YgcylyZXR1cm4gYS5mcm9tKHMsbyk7aWYoQyYmdyhzKSl7aWYoMD09PXMuYnl0ZUxlbmd0aClyZXR1cm4gYS5hbGxvYygwKTtpZihqKXt2YXIgaT1hLmZyb20ocy5idWZmZXIscy5ieXRlT2Zmc2V0LHMuYnl0ZUxlbmd0aCk7aWYoaS5ieXRlTGVuZ3RoPT09cy5ieXRlTGVuZ3RoKXJldHVybiBpfXZhciBfPXMgaW5zdGFuY2VvZiBVaW50OEFycmF5P3M6bmV3IFVpbnQ4QXJyYXkocy5idWZmZXIscy5ieXRlT2Zmc2V0LHMuYnl0ZUxlbmd0aCksTD1hLmZyb20oXyk7aWYoTC5sZW5ndGg9PT1zLmJ5dGVMZW5ndGgpcmV0dXJuIEx9aWYoeCYmcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuIGEuZnJvbShzKTt2YXIgQj11KHMpO2lmKEIpZm9yKHZhciAkPTA7JDxzLmxlbmd0aDskKz0xKXt2YXIgVT1zWyRdO2lmKCJudW1iZXIiIT10eXBlb2YgVXx8VTwwfHxVPjI1NXx8fn5VIT09VSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJyYXkgaXRlbXMgbXVzdCBiZSBudW1iZXJzIGluIHRoZSByYW5nZSAwLTI1NS4iKX1pZihCfHxhLmlzQnVmZmVyKHMpJiZzLmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2Ygcy5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmcy5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihzKSlyZXR1cm4gYS5mcm9tKHMpO3Rocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAiZGF0YSIgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgYW4gQXJyYXksIGEgQnVmZmVyLCBhIFVpbnQ4QXJyYXksIG9yIGEgRGF0YVZpZXcuJyl9fSwxNjQyNihzKXtzLmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgcz1kb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtpZighcy5yYW5nZUNvdW50KXJldHVybiBmdW5jdGlvbigpe307Zm9yKHZhciBvPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsaT1bXSxhPTA7YTxzLnJhbmdlQ291bnQ7YSsrKWkucHVzaChzLmdldFJhbmdlQXQoYSkpO3N3aXRjaChvLnRhZ05hbWUudG9VcHBlckNhc2UoKSl7Y2FzZSJJTlBVVCI6Y2FzZSJURVhUQVJFQSI6by5ibHVyKCk7YnJlYWs7ZGVmYXVsdDpvPW51bGx9cmV0dXJuIHMucmVtb3ZlQWxsUmFuZ2VzKCksZnVuY3Rpb24oKXsiQ2FyZXQiPT09cy50eXBlJiZzLnJlbW92ZUFsbFJhbmdlcygpLHMucmFuZ2VDb3VudHx8aS5mb3JFYWNoKChmdW5jdGlvbihvKXtzLmFkZFJhbmdlKG8pfSkpLG8mJm8uZm9jdXMoKX19fSw3NDM3MihzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNjk2NzUpLHU9aSgzNjU1NikoIlR5cGVkQXJyYXkucHJvdG90eXBlLmJ1ZmZlciIsITApLF89aSgzNTY4MCk7cy5leHBvcnRzPXV8fGZ1bmN0aW9uIHR5cGVkQXJyYXlCdWZmZXIocyl7aWYoIV8ocykpdGhyb3cgbmV3IGEoIk5vdCBhIFR5cGVkIEFycmF5Iik7cmV0dXJuIHMuYnVmZmVyfX0sNjExNjAocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDkyMDYzKSx1PWkoNzM5OTIpLF89L15bXHgwMC1ceDIwXHUwMGEwXHUxNjgwXHUyMDAwLVx1MjAwYVx1MjAyOFx1MjAyOVx1MjAyZlx1MjA1Zlx1MzAwMFx1ZmVmZl0rLyx3PS9bXG5cclx0XS9nLHg9L15bQS1aYS16XVtBLVphLXowLTkrLS5dKjpcL1wvLyxDPS86XGQrJC8saj0vXihbYS16XVthLXowLTkuKy1dKjopPyhcL1wvKT8oW1xcL10rKT8oW1xTXHNdKikvaSxMPS9eW2EtekEtWl06LztmdW5jdGlvbiB0cmltTGVmdChzKXtyZXR1cm4oc3x8IiIpLnRvU3RyaW5nKCkucmVwbGFjZShfLCIiKX12YXIgQj1bWyIjIiwiaGFzaCJdLFsiPyIsInF1ZXJ5Il0sZnVuY3Rpb24gc2FuaXRpemUocyxvKXtyZXR1cm4gaXNTcGVjaWFsKG8ucHJvdG9jb2wpP3MucmVwbGFjZSgvXFwvZywiLyIpOnN9LFsiLyIsInBhdGhuYW1lIl0sWyJAIiwiYXV0aCIsMV0sW05hTiwiaG9zdCIsdm9pZCAwLDEsMV0sWy86KFxkKikkLywicG9ydCIsdm9pZCAwLDFdLFtOYU4sImhvc3RuYW1lIix2b2lkIDAsMSwxXV0sJD17aGFzaDoxLHF1ZXJ5OjF9O2Z1bmN0aW9uIGxvbGNhdGlvbihzKXt2YXIgbyxhPSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dm9pZCAwIT09aS5nP2kuZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fSkubG9jYXRpb258fHt9LHU9e30sXz10eXBlb2Yocz1zfHxhKTtpZigiYmxvYjoiPT09cy5wcm90b2NvbCl1PW5ldyBVcmwodW5lc2NhcGUocy5wYXRobmFtZSkse30pO2Vsc2UgaWYoInN0cmluZyI9PT1fKWZvcihvIGluIHU9bmV3IFVybChzLHt9KSwkKWRlbGV0ZSB1W29dO2Vsc2UgaWYoIm9iamVjdCI9PT1fKXtmb3IobyBpbiBzKW8gaW4gJHx8KHVbb109c1tvXSk7dm9pZCAwPT09dS5zbGFzaGVzJiYodS5zbGFzaGVzPXgudGVzdChzLmhyZWYpKX1yZXR1cm4gdX1mdW5jdGlvbiBpc1NwZWNpYWwocyl7cmV0dXJuImZpbGU6Ij09PXN8fCJmdHA6Ij09PXN8fCJodHRwOiI9PT1zfHwiaHR0cHM6Ij09PXN8fCJ3czoiPT09c3x8IndzczoiPT09c31mdW5jdGlvbiBleHRyYWN0UHJvdG9jb2wocyxvKXtzPShzPXRyaW1MZWZ0KHMpKS5yZXBsYWNlKHcsIiIpLG89b3x8e307dmFyIGksYT1qLmV4ZWMocyksdT1hWzFdP2FbMV0udG9Mb3dlckNhc2UoKToiIixfPSEhYVsyXSx4PSEhYVszXSxDPTA7cmV0dXJuIF8/eD8oaT1hWzJdK2FbM10rYVs0XSxDPWFbMl0ubGVuZ3RoK2FbM10ubGVuZ3RoKTooaT1hWzJdK2FbNF0sQz1hWzJdLmxlbmd0aCk6eD8oaT1hWzNdK2FbNF0sQz1hWzNdLmxlbmd0aCk6aT1hWzRdLCJmaWxlOiI9PT11P0M+PTImJihpPWkuc2xpY2UoMikpOmlzU3BlY2lhbCh1KT9pPWFbNF06dT9fJiYoaT1pLnNsaWNlKDIpKTpDPj0yJiZpc1NwZWNpYWwoby5wcm90b2NvbCkmJihpPWFbNF0pLHtwcm90b2NvbDp1LHNsYXNoZXM6X3x8aXNTcGVjaWFsKHUpLHNsYXNoZXNDb3VudDpDLHJlc3Q6aX19ZnVuY3Rpb24gVXJsKHMsbyxpKXtpZihzPShzPXRyaW1MZWZ0KHMpKS5yZXBsYWNlKHcsIiIpLCEodGhpcyBpbnN0YW5jZW9mIFVybCkpcmV0dXJuIG5ldyBVcmwocyxvLGkpO3ZhciBfLHgsQyxqLCQsVSxWPUIuc2xpY2UoKSx6PXR5cGVvZiBvLFk9dGhpcyxaPTA7Zm9yKCJvYmplY3QiIT09eiYmInN0cmluZyIhPT16JiYoaT1vLG89bnVsbCksaSYmImZ1bmN0aW9uIiE9dHlwZW9mIGkmJihpPXUucGFyc2UpLF89ISh4PWV4dHJhY3RQcm90b2NvbChzfHwiIixvPWxvbGNhdGlvbihvKSkpLnByb3RvY29sJiYheC5zbGFzaGVzLFkuc2xhc2hlcz14LnNsYXNoZXN8fF8mJm8uc2xhc2hlcyxZLnByb3RvY29sPXgucHJvdG9jb2x8fG8ucHJvdG9jb2x8fCIiLHM9eC5yZXN0LCgiZmlsZToiPT09eC5wcm90b2NvbCYmKDIhPT14LnNsYXNoZXNDb3VudHx8TC50ZXN0KHMpKXx8IXguc2xhc2hlcyYmKHgucHJvdG9jb2x8fHguc2xhc2hlc0NvdW50PDJ8fCFpc1NwZWNpYWwoWS5wcm90b2NvbCkpKSYmKFZbM109Wy8oLiopLywicGF0aG5hbWUiXSk7WjxWLmxlbmd0aDtaKyspImZ1bmN0aW9uIiE9dHlwZW9mKGo9VltaXSk/KEM9alswXSxVPWpbMV0sQyE9Qz9ZW1VdPXM6InN0cmluZyI9PXR5cGVvZiBDP34oJD0iQCI9PT1DP3MubGFzdEluZGV4T2YoQyk6cy5pbmRleE9mKEMpKSYmKCJudW1iZXIiPT10eXBlb2YgalsyXT8oWVtVXT1zLnNsaWNlKDAsJCkscz1zLnNsaWNlKCQralsyXSkpOihZW1VdPXMuc2xpY2UoJCkscz1zLnNsaWNlKDAsJCkpKTooJD1DLmV4ZWMocykpJiYoWVtVXT0kWzFdLHM9cy5zbGljZSgwLCQuaW5kZXgpKSxZW1VdPVlbVV18fF8mJmpbM10mJm9bVV18fCIiLGpbNF0mJihZW1VdPVlbVV0udG9Mb3dlckNhc2UoKSkpOnM9aihzLFkpO2kmJihZLnF1ZXJ5PWkoWS5xdWVyeSkpLF8mJm8uc2xhc2hlcyYmIi8iIT09WS5wYXRobmFtZS5jaGFyQXQoMCkmJigiIiE9PVkucGF0aG5hbWV8fCIiIT09by5wYXRobmFtZSkmJihZLnBhdGhuYW1lPWZ1bmN0aW9uIHJlc29sdmUocyxvKXtpZigiIj09PXMpcmV0dXJuIG87Zm9yKHZhciBpPShvfHwiLyIpLnNwbGl0KCIvIikuc2xpY2UoMCwtMSkuY29uY2F0KHMuc3BsaXQoIi8iKSksYT1pLmxlbmd0aCx1PWlbYS0xXSxfPSExLHc9MDthLS07KSIuIj09PWlbYV0/aS5zcGxpY2UoYSwxKToiLi4iPT09aVthXT8oaS5zcGxpY2UoYSwxKSx3KyspOncmJigwPT09YSYmKF89ITApLGkuc3BsaWNlKGEsMSksdy0tKTtyZXR1cm4gXyYmaS51bnNoaWZ0KCIiKSwiLiIhPT11JiYiLi4iIT09dXx8aS5wdXNoKCIiKSxpLmpvaW4oIi8iKX0oWS5wYXRobmFtZSxvLnBhdGhuYW1lKSksIi8iIT09WS5wYXRobmFtZS5jaGFyQXQoMCkmJmlzU3BlY2lhbChZLnByb3RvY29sKSYmKFkucGF0aG5hbWU9Ii8iK1kucGF0aG5hbWUpLGEoWS5wb3J0LFkucHJvdG9jb2wpfHwoWS5ob3N0PVkuaG9zdG5hbWUsWS5wb3J0PSIiKSxZLnVzZXJuYW1lPVkucGFzc3dvcmQ9IiIsWS5hdXRoJiYofigkPVkuYXV0aC5pbmRleE9mKCI6IikpPyhZLnVzZXJuYW1lPVkuYXV0aC5zbGljZSgwLCQpLFkudXNlcm5hbWU9ZW5jb2RlVVJJQ29tcG9uZW50KGRlY29kZVVSSUNvbXBvbmVudChZLnVzZXJuYW1lKSksWS5wYXNzd29yZD1ZLmF1dGguc2xpY2UoJCsxKSxZLnBhc3N3b3JkPWVuY29kZVVSSUNvbXBvbmVudChkZWNvZGVVUklDb21wb25lbnQoWS5wYXNzd29yZCkpKTpZLnVzZXJuYW1lPWVuY29kZVVSSUNvbXBvbmVudChkZWNvZGVVUklDb21wb25lbnQoWS5hdXRoKSksWS5hdXRoPVkucGFzc3dvcmQ/WS51c2VybmFtZSsiOiIrWS5wYXNzd29yZDpZLnVzZXJuYW1lKSxZLm9yaWdpbj0iZmlsZToiIT09WS5wcm90b2NvbCYmaXNTcGVjaWFsKFkucHJvdG9jb2wpJiZZLmhvc3Q/WS5wcm90b2NvbCsiLy8iK1kuaG9zdDoibnVsbCIsWS5ocmVmPVkudG9TdHJpbmcoKX1VcmwucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24gc2V0KHMsbyxpKXt2YXIgXz10aGlzO3N3aXRjaChzKXtjYXNlInF1ZXJ5Ijoic3RyaW5nIj09dHlwZW9mIG8mJm8ubGVuZ3RoJiYobz0oaXx8dS5wYXJzZSkobykpLF9bc109bzticmVhaztjYXNlInBvcnQiOl9bc109byxhKG8sXy5wcm90b2NvbCk/byYmKF8uaG9zdD1fLmhvc3RuYW1lKyI6IitvKTooXy5ob3N0PV8uaG9zdG5hbWUsX1tzXT0iIik7YnJlYWs7Y2FzZSJob3N0bmFtZSI6X1tzXT1vLF8ucG9ydCYmKG8rPSI6IitfLnBvcnQpLF8uaG9zdD1vO2JyZWFrO2Nhc2UiaG9zdCI6X1tzXT1vLEMudGVzdChvKT8obz1vLnNwbGl0KCI6IiksXy5wb3J0PW8ucG9wKCksXy5ob3N0bmFtZT1vLmpvaW4oIjoiKSk6KF8uaG9zdG5hbWU9byxfLnBvcnQ9IiIpO2JyZWFrO2Nhc2UicHJvdG9jb2wiOl8ucHJvdG9jb2w9by50b0xvd2VyQ2FzZSgpLF8uc2xhc2hlcz0haTticmVhaztjYXNlInBhdGhuYW1lIjpjYXNlImhhc2giOmlmKG8pe3ZhciB3PSJwYXRobmFtZSI9PT1zPyIvIjoiIyI7X1tzXT1vLmNoYXJBdCgwKSE9PXc/dytvOm99ZWxzZSBfW3NdPW87YnJlYWs7Y2FzZSJ1c2VybmFtZSI6Y2FzZSJwYXNzd29yZCI6X1tzXT1lbmNvZGVVUklDb21wb25lbnQobyk7YnJlYWs7Y2FzZSJhdXRoIjp2YXIgeD1vLmluZGV4T2YoIjoiKTt+eD8oXy51c2VybmFtZT1vLnNsaWNlKDAseCksXy51c2VybmFtZT1lbmNvZGVVUklDb21wb25lbnQoZGVjb2RlVVJJQ29tcG9uZW50KF8udXNlcm5hbWUpKSxfLnBhc3N3b3JkPW8uc2xpY2UoeCsxKSxfLnBhc3N3b3JkPWVuY29kZVVSSUNvbXBvbmVudChkZWNvZGVVUklDb21wb25lbnQoXy5wYXNzd29yZCkpKTpfLnVzZXJuYW1lPWVuY29kZVVSSUNvbXBvbmVudChkZWNvZGVVUklDb21wb25lbnQobykpfWZvcih2YXIgaj0wO2o8Qi5sZW5ndGg7aisrKXt2YXIgTD1CW2pdO0xbNF0mJihfW0xbMV1dPV9bTFsxXV0udG9Mb3dlckNhc2UoKSl9cmV0dXJuIF8uYXV0aD1fLnBhc3N3b3JkP18udXNlcm5hbWUrIjoiK18ucGFzc3dvcmQ6Xy51c2VybmFtZSxfLm9yaWdpbj0iZmlsZToiIT09Xy5wcm90b2NvbCYmaXNTcGVjaWFsKF8ucHJvdG9jb2wpJiZfLmhvc3Q/Xy5wcm90b2NvbCsiLy8iK18uaG9zdDoibnVsbCIsXy5ocmVmPV8udG9TdHJpbmcoKSxffSx0b1N0cmluZzpmdW5jdGlvbiB0b1N0cmluZyhzKXtzJiYiZnVuY3Rpb24iPT10eXBlb2Ygc3x8KHM9dS5zdHJpbmdpZnkpO3ZhciBvLGk9dGhpcyxhPWkuaG9zdCxfPWkucHJvdG9jb2w7XyYmIjoiIT09Xy5jaGFyQXQoXy5sZW5ndGgtMSkmJihfKz0iOiIpO3ZhciB3PV8rKGkucHJvdG9jb2wmJmkuc2xhc2hlc3x8aXNTcGVjaWFsKGkucHJvdG9jb2wpPyIvLyI6IiIpO3JldHVybiBpLnVzZXJuYW1lPyh3Kz1pLnVzZXJuYW1lLGkucGFzc3dvcmQmJih3Kz0iOiIraS5wYXNzd29yZCksdys9IkAiKTppLnBhc3N3b3JkPyh3Kz0iOiIraS5wYXNzd29yZCx3Kz0iQCIpOiJmaWxlOiIhPT1pLnByb3RvY29sJiZpc1NwZWNpYWwoaS5wcm90b2NvbCkmJiFhJiYiLyIhPT1pLnBhdGhuYW1lJiYodys9IkAiKSwoIjoiPT09YVthLmxlbmd0aC0xXXx8Qy50ZXN0KGkuaG9zdG5hbWUpJiYhaS5wb3J0KSYmKGErPSI6Iiksdys9YStpLnBhdGhuYW1lLChvPSJvYmplY3QiPT10eXBlb2YgaS5xdWVyeT9zKGkucXVlcnkpOmkucXVlcnkpJiYodys9Ij8iIT09by5jaGFyQXQoMCk/Ij8iK286byksaS5oYXNoJiYodys9aS5oYXNoKSx3fX0sVXJsLmV4dHJhY3RQcm90b2NvbD1leHRyYWN0UHJvdG9jb2wsVXJsLmxvY2F0aW9uPWxvbGNhdGlvbixVcmwudHJpbUxlZnQ9dHJpbUxlZnQsVXJsLnFzPXUscy5leHBvcnRzPVVybH0sODUxNjAocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDk2NTQwKTt2YXIgdT0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmlzP09iamVjdC5pczpmdW5jdGlvbiBpcyhzLG8pe3JldHVybiBzPT09byYmKDAhPT1zfHwxL3M9PTEvbyl8fHMhPXMmJm8hPW99LF89YS51c2VTeW5jRXh0ZXJuYWxTdG9yZSx3PWEudXNlUmVmLHg9YS51c2VFZmZlY3QsQz1hLnVzZU1lbW8saj1hLnVzZURlYnVnVmFsdWV9LDc4NDE4KHMsbyxpKXsidXNlIHN0cmljdCI7aSg4NTE2MCl9LDk0NjQzKHMsbyxpKXtmdW5jdGlvbiBjb25maWcocyl7dHJ5e2lmKCFpLmcubG9jYWxTdG9yYWdlKXJldHVybiExfWNhdGNoKHMpe3JldHVybiExfXZhciBvPWkuZy5sb2NhbFN0b3JhZ2Vbc107cmV0dXJuIG51bGwhPW8mJiJ0cnVlIj09PVN0cmluZyhvKS50b0xvd2VyQ2FzZSgpfXMuZXhwb3J0cz1mdW5jdGlvbiBkZXByZWNhdGUocyxvKXtpZihjb25maWcoIm5vRGVwcmVjYXRpb24iKSlyZXR1cm4gczt2YXIgaT0hMTtyZXR1cm4gZnVuY3Rpb24gZGVwcmVjYXRlZCgpe2lmKCFpKXtpZihjb25maWcoInRocm93RGVwcmVjYXRpb24iKSl0aHJvdyBuZXcgRXJyb3Iobyk7Y29uZmlnKCJ0cmFjZURlcHJlY2F0aW9uIik/Y29uc29sZS50cmFjZShvKTpjb25zb2xlLndhcm4obyksaT0hMH1yZXR1cm4gcy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0sMjU3NjcocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDgyNjgyKSx1PWkoMzkyMDkpLF89aSgxMDQ4Nyksdz1pKDM2NTU2KSx4PWkoNzU3OTUpLEM9dygiT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyIpLGo9aSg0OTA5MikoKSxMPSJ1bmRlZmluZWQiPT10eXBlb2YgZ2xvYmFsVGhpcz9pLmc6Z2xvYmFsVGhpcyxCPXUoKSwkPXcoIlN0cmluZy5wcm90b3R5cGUuc2xpY2UiKSxVPU9iamVjdC5nZXRQcm90b3R5cGVPZixWPXcoIkFycmF5LnByb3RvdHlwZS5pbmRleE9mIiwhMCl8fGZ1bmN0aW9uIGluZGV4T2YocyxvKXtmb3IodmFyIGk9MDtpPHMubGVuZ3RoO2krPTEpaWYoc1tpXT09PW8pcmV0dXJuIGk7cmV0dXJuLTF9LHo9e19fcHJvdG9fXzpudWxsfTthKEIsaiYmeCYmVT9mdW5jdGlvbihzKXt2YXIgbz1uZXcgTFtzXTtpZihTeW1ib2wudG9TdHJpbmdUYWcgaW4gbyl7dmFyIGk9VShvKSxhPXgoaSxTeW1ib2wudG9TdHJpbmdUYWcpO2lmKCFhKXt2YXIgdT1VKGkpO2E9eCh1LFN5bWJvbC50b1N0cmluZ1RhZyl9elsiJCIrc109XyhhLmdldCl9fTpmdW5jdGlvbihzKXt2YXIgbz1uZXcgTFtzXSxpPW8uc2xpY2V8fG8uc2V0O2kmJih6WyIkIitzXT1fKGkpKX0pO3MuZXhwb3J0cz1mdW5jdGlvbiB3aGljaFR5cGVkQXJyYXkocyl7aWYoIXN8fCJvYmplY3QiIT10eXBlb2YgcylyZXR1cm4hMTtpZighail7dmFyIG89JChDKHMpLDgsLTEpO3JldHVybiBWKEIsbyk+LTE/bzoiT2JqZWN0Ij09PW8mJmZ1bmN0aW9uIHRyeUFsbFNsaWNlcyhzKXt2YXIgbz0hMTtyZXR1cm4gYSh6LChmdW5jdGlvbihpLGEpe2lmKCFvKXRyeXtpKHMpLG89JChhLDEpfWNhdGNoKHMpe319KSksb30ocyl9cmV0dXJuIHg/ZnVuY3Rpb24gdHJ5QWxsVHlwZWRBcnJheXMocyl7dmFyIG89ITE7cmV0dXJuIGEoeiwoZnVuY3Rpb24oaSxhKXtpZighbyl0cnl7IiQiK2kocyk9PT1hJiYobz0kKGEsMSkpfWNhdGNoKHMpe319KSksb30ocyk6bnVsbH19LDI2NjU3KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg3NTIwOCksdT1mdW5jdGlvbiBpc0Nsb3NpbmdUYWcocyl7cmV0dXJuLzxcLytbXj5dKz4vLnRlc3Qocyl9LF89ZnVuY3Rpb24gaXNTZWxmQ2xvc2luZ1RhZyhzKXtyZXR1cm4vPFtePl0rXC8+Ly50ZXN0KHMpfTtmdW5jdGlvbiBnZXRUeXBlKHMpe3JldHVybiB1KHMpPyJDbG9zaW5nVGFnIjpmdW5jdGlvbiBpc09wZW5pbmdUYWcocyl7cmV0dXJuIGZ1bmN0aW9uIGlzVGFnKHMpe3JldHVybi88W14+IV0rPi8udGVzdChzKX0ocykmJiF1KHMpJiYhXyhzKX0ocyk/Ik9wZW5pbmdUYWciOl8ocyk/IlNlbGZDbG9zaW5nVGFnIjoiVGV4dCJ9cy5leHBvcnRzPWZ1bmN0aW9uKHMpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxpPW8uaW5kZW50b3IsdT1vLnRleHROb2Rlc09uU2FtZUxpbmUsXz0wLHc9W107aT1pfHwiICAgICI7dmFyIHg9ZnVuY3Rpb24gbGV4ZXIocyl7cmV0dXJuIGZ1bmN0aW9uIHNwbGl0T25UYWdzKHMpe3JldHVybiBzLnNwbGl0KC8oPFwvP1tePl0rPikvZykuZmlsdGVyKChmdW5jdGlvbihzKXtyZXR1cm4iIiE9PXMudHJpbSgpfSkpfShzKS5tYXAoKGZ1bmN0aW9uKHMpe3JldHVybnt2YWx1ZTpzLHR5cGU6Z2V0VHlwZShzKX19KSl9KHMpLm1hcCgoZnVuY3Rpb24ocyxvLHgpe3ZhciBDPXMudmFsdWUsaj1zLnR5cGU7IkNsb3NpbmdUYWciPT09aiYmXy0tO3ZhciBMPWEoaSxfKSxCPUwrQztpZigiT3BlbmluZ1RhZyI9PT1qJiZfKyssdSl7dmFyICQ9eFtvLTFdLFU9eFtvLTJdOyJDbG9zaW5nVGFnIj09PWomJiJUZXh0Ij09PSQudHlwZSYmIk9wZW5pbmdUYWciPT09VS50eXBlJiYoQj0iIitMK1UudmFsdWUrJC52YWx1ZStDLHcucHVzaChvLTIsby0xKSl9cmV0dXJuIEJ9KSk7cmV0dXJuIHcuZm9yRWFjaCgoZnVuY3Rpb24ocyl7cmV0dXJuIHhbc109bnVsbH0pKSx4LmZpbHRlcigoZnVuY3Rpb24ocyl7cmV0dXJuISFzfSkpLmpvaW4oIlxuIil9fSwzMTQ5OShzKXt2YXIgbz17IiYiOiImYW1wOyIsJyInOiImcXVvdDsiLCInIjoiJmFwb3M7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyJ9O3MuZXhwb3J0cz1mdW5jdGlvbiBlc2NhcGVGb3JYTUwocyl7cmV0dXJuIHMmJnMucmVwbGFjZT9zLnJlcGxhY2UoLyhbJiI8PiddKS9nLChmdW5jdGlvbihzLGkpe3JldHVybiBvW2ldfSkpOnN9fSwxOTEyMyhzLG8saSl7dmFyIGE9aSg2NTYwNiksdT1pKDMxNDk5KSxfPWkoODgzMTApLlN0cmVhbTtmdW5jdGlvbiByZXNvbHZlKHMsbyxpKXt2YXIgYSxfPWZ1bmN0aW9uIGNyZWF0ZV9pbmRlbnQocyxvKXtyZXR1cm4gbmV3IEFycmF5KG98fDApLmpvaW4oc3x8IiIpfShvLGk9aXx8MCksdz1zO2lmKCJvYmplY3QiPT10eXBlb2YgcyYmKCh3PXNbYT1PYmplY3Qua2V5cyhzKVswXV0pJiZ3Ll9lbGVtKSlyZXR1cm4gdy5fZWxlbS5uYW1lPWEsdy5fZWxlbS5pY291bnQ9aSx3Ll9lbGVtLmluZGVudD1vLHcuX2VsZW0uaW5kZW50cz1fLHcuX2VsZW0uaW50ZXJydXB0PXcsdy5fZWxlbTt2YXIgeCxDPVtdLGo9W107ZnVuY3Rpb24gZ2V0X2F0dHJpYnV0ZXMocyl7T2JqZWN0LmtleXMocykuZm9yRWFjaCgoZnVuY3Rpb24obyl7Qy5wdXNoKGZ1bmN0aW9uIGF0dHJpYnV0ZShzLG8pe3JldHVybiBzKyc9IicrdShvKSsnIid9KG8sc1tvXSkpfSkpfXN3aXRjaCh0eXBlb2Ygdyl7Y2FzZSJvYmplY3QiOmlmKG51bGw9PT13KWJyZWFrO3cuX2F0dHImJmdldF9hdHRyaWJ1dGVzKHcuX2F0dHIpLHcuX2NkYXRhJiZqLnB1c2goKCI8IVtDREFUQVsiK3cuX2NkYXRhKS5yZXBsYWNlKC9cXVxdPi9nLCJdXV1dPjwhW0NEQVRBWz4iKSsiXV0+Iiksdy5mb3JFYWNoJiYoeD0hMSxqLnB1c2goIiIpLHcuZm9yRWFjaCgoZnVuY3Rpb24ocyl7Im9iamVjdCI9PXR5cGVvZiBzPyJfYXR0ciI9PU9iamVjdC5rZXlzKHMpWzBdP2dldF9hdHRyaWJ1dGVzKHMuX2F0dHIpOmoucHVzaChyZXNvbHZlKHMsbyxpKzEpKTooai5wb3AoKSx4PSEwLGoucHVzaCh1KHMpKSl9KSkseHx8ai5wdXNoKCIiKSk7YnJlYWs7ZGVmYXVsdDpqLnB1c2godSh3KSl9cmV0dXJue25hbWU6YSxpbnRlcnJ1cHQ6ITEsYXR0cmlidXRlczpDLGNvbnRlbnQ6aixpY291bnQ6aSxpbmRlbnRzOl8saW5kZW50Om99fWZ1bmN0aW9uIGZvcm1hdChzLG8saSl7aWYoIm9iamVjdCIhPXR5cGVvZiBvKXJldHVybiBzKCExLG8pO3ZhciBhPW8uaW50ZXJydXB0PzE6by5jb250ZW50Lmxlbmd0aDtmdW5jdGlvbiBwcm9jZWVkKCl7Zm9yKDtvLmNvbnRlbnQubGVuZ3RoOyl7dmFyIHU9by5jb250ZW50LnNoaWZ0KCk7aWYodm9pZCAwIT09dSl7aWYoaW50ZXJydXB0KHUpKXJldHVybjtmb3JtYXQocyx1KX19cyghMSwoYT4xP28uaW5kZW50czoiIikrKG8ubmFtZT8iPC8iK28ubmFtZSsiPiI6IiIpKyhvLmluZGVudCYmIWk/IlxuIjoiIikpLGkmJmkoKX1mdW5jdGlvbiBpbnRlcnJ1cHQobyl7cmV0dXJuISFvLmludGVycnVwdCYmKG8uaW50ZXJydXB0LmFwcGVuZD1zLG8uaW50ZXJydXB0LmVuZD1wcm9jZWVkLG8uaW50ZXJydXB0PSExLHMoITApLCEwKX1pZihzKCExLG8uaW5kZW50cysoby5uYW1lPyI8IitvLm5hbWU6IiIpKyhvLmF0dHJpYnV0ZXMubGVuZ3RoPyIgIitvLmF0dHJpYnV0ZXMuam9pbigiICIpOiIiKSsoYT9vLm5hbWU/Ij4iOiIiOm8ubmFtZT8iLz4iOiIiKSsoby5pbmRlbnQmJmE+MT8iXG4iOiIiKSksIWEpcmV0dXJuIHMoITEsby5pbmRlbnQ/IlxuIjoiIik7aW50ZXJydXB0KG8pfHxwcm9jZWVkKCl9cy5leHBvcnRzPWZ1bmN0aW9uIHhtbChzLG8peyJvYmplY3QiIT10eXBlb2YgbyYmKG89e2luZGVudDpvfSk7dmFyIGk9by5zdHJlYW0/bmV3IF86bnVsbCx1PSIiLHc9ITEseD1vLmluZGVudD8hMD09PW8uaW5kZW50PyIgICAgIjpvLmluZGVudDoiIixDPSEwO2Z1bmN0aW9uIGRlbGF5KHMpe0M/YS5uZXh0VGljayhzKTpzKCl9ZnVuY3Rpb24gYXBwZW5kKHMsbyl7aWYodm9pZCAwIT09byYmKHUrPW8pLHMmJiF3JiYoaT1pfHxuZXcgXyx3PSEwKSxzJiZ3KXt2YXIgYT11O2RlbGF5KChmdW5jdGlvbigpe2kuZW1pdCgiZGF0YSIsYSl9KSksdT0iIn19ZnVuY3Rpb24gYWRkKHMsbyl7Zm9ybWF0KGFwcGVuZCxyZXNvbHZlKHMseCx4PzE6MCksbyl9ZnVuY3Rpb24gZW5kKCl7aWYoaSl7dmFyIHM9dTtkZWxheSgoZnVuY3Rpb24oKXtpLmVtaXQoImRhdGEiLHMpLGkuZW1pdCgiZW5kIiksaS5yZWFkYWJsZT0hMSxpLmVtaXQoImNsb3NlIil9KSl9fXJldHVybiBkZWxheSgoZnVuY3Rpb24oKXtDPSExfSkpLG8uZGVjbGFyYXRpb24mJmZ1bmN0aW9uIGFkZFhtbERlY2xhcmF0aW9uKHMpe3ZhciBvPXt2ZXJzaW9uOiIxLjAiLGVuY29kaW5nOnMuZW5jb2Rpbmd8fCJVVEYtOCJ9O3Muc3RhbmRhbG9uZSYmKG8uc3RhbmRhbG9uZT1zLnN0YW5kYWxvbmUpLGFkZCh7Ij94bWwiOntfYXR0cjpvfX0pLHU9dS5yZXBsYWNlKCIvPiIsIj8+Iil9KG8uZGVjbGFyYXRpb24pLHMmJnMuZm9yRWFjaD9zLmZvckVhY2goKGZ1bmN0aW9uKG8saSl7dmFyIGE7aSsxPT09cy5sZW5ndGgmJihhPWVuZCksYWRkKG8sYSl9KSk6YWRkKHMsZW5kKSxpPyhpLnJlYWRhYmxlPSEwLGkpOnV9LHMuZXhwb3J0cy5lbGVtZW50PXMuZXhwb3J0cy5FbGVtZW50PWZ1bmN0aW9uIGVsZW1lbnQoKXt2YXIgcz17X2VsZW06cmVzb2x2ZShBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSxwdXNoOmZ1bmN0aW9uKHMpe2lmKCF0aGlzLmFwcGVuZCl0aHJvdyBuZXcgRXJyb3IoIm5vdCBhc3NpZ25lZCB0byBhIHBhcmVudCEiKTt2YXIgbz10aGlzLGk9dGhpcy5fZWxlbS5pbmRlbnQ7Zm9ybWF0KHRoaXMuYXBwZW5kLHJlc29sdmUocyxpLHRoaXMuX2VsZW0uaWNvdW50KyhpPzE6MCkpLChmdW5jdGlvbigpe28uYXBwZW5kKCEwKX0pKX0sY2xvc2U6ZnVuY3Rpb24ocyl7dm9pZCAwIT09cyYmdGhpcy5wdXNoKHMpLHRoaXMuZW5kJiZ0aGlzLmVuZCgpfX07cmV0dXJuIHN9fSw4NjIxNShzLG8pe3ZhciBpLGEsdTthPVtdLGk9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGlzTmF0aXZlU21vb3RoU2Nyb2xsRW5hYmxlZE9uPWZ1bmN0aW9uKHMpe3JldHVybiBzJiYiZ2V0Q29tcHV0ZWRTdHlsZSJpbiB3aW5kb3cmJiJzbW9vdGgiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUocylbInNjcm9sbC1iZWhhdmlvciJdfTtpZigidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvd3x8ISgiZG9jdW1lbnQiaW4gd2luZG93KSlyZXR1cm57fTt2YXIgbWFrZVNjcm9sbGVyPWZ1bmN0aW9uKHMsbyxpKXt2YXIgYTtvPW98fDk5OSxpfHwwPT09aXx8KGk9OSk7dmFyIHNldFNjcm9sbFRpbWVvdXRJZD1mdW5jdGlvbihzKXthPXN9LHN0b3BTY3JvbGw9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoYSksc2V0U2Nyb2xsVGltZW91dElkKDApfSxnZXRUb3BXaXRoRWRnZU9mZnNldD1mdW5jdGlvbihvKXtyZXR1cm4gTWF0aC5tYXgoMCxzLmdldFRvcE9mKG8pLWkpfSxzY3JvbGxUb1k9ZnVuY3Rpb24oaSxhLHUpe2lmKHN0b3BTY3JvbGwoKSwwPT09YXx8YSYmYTwwfHxpc05hdGl2ZVNtb290aFNjcm9sbEVuYWJsZWRPbihzLmJvZHkpKXMudG9ZKGkpLHUmJnUoKTtlbHNle3ZhciBfPXMuZ2V0WSgpLHc9TWF0aC5tYXgoMCxpKS1fLHg9KG5ldyBEYXRlKS5nZXRUaW1lKCk7YT1hfHxNYXRoLm1pbihNYXRoLmFicyh3KSxvKSxmdW5jdGlvbiBsb29wU2Nyb2xsKCl7c2V0U2Nyb2xsVGltZW91dElkKHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIG89TWF0aC5taW4oMSwoKG5ldyBEYXRlKS5nZXRUaW1lKCkteCkvYSksaT1NYXRoLm1heCgwLE1hdGguZmxvb3IoXyt3KihvPC41PzIqbypvOm8qKDQtMipvKS0xKSkpO3MudG9ZKGkpLG88MSYmcy5nZXRIZWlnaHQoKStpPHMuYm9keS5zY3JvbGxIZWlnaHQ/bG9vcFNjcm9sbCgpOihzZXRUaW1lb3V0KHN0b3BTY3JvbGwsOTkpLHUmJnUoKSl9KSw5KSl9KCl9fSxzY3JvbGxUb0VsZW09ZnVuY3Rpb24ocyxvLGkpe3Njcm9sbFRvWShnZXRUb3BXaXRoRWRnZU9mZnNldChzKSxvLGkpfSxzY3JvbGxJbnRvVmlldz1mdW5jdGlvbihvLGEsdSl7dmFyIF89by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQsdz1zLmdldFRvcE9mKG8pK18seD1zLmdldEhlaWdodCgpLEM9cy5nZXRZKCksaj1DK3g7Z2V0VG9wV2l0aEVkZ2VPZmZzZXQobyk8Q3x8XytpPng/c2Nyb2xsVG9FbGVtKG8sYSx1KTp3K2k+aj9zY3JvbGxUb1kody14K2ksYSx1KTp1JiZ1KCl9LHNjcm9sbFRvQ2VudGVyT2Y9ZnVuY3Rpb24obyxpLGEsdSl7c2Nyb2xsVG9ZKE1hdGgubWF4KDAscy5nZXRUb3BPZihvKS1zLmdldEhlaWdodCgpLzIrKGF8fG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LzIpKSxpLHUpfTtyZXR1cm57c2V0dXA6ZnVuY3Rpb24ocyxhKXtyZXR1cm4oMD09PXN8fHMpJiYobz1zKSwoMD09PWF8fGEpJiYoaT1hKSx7ZGVmYXVsdER1cmF0aW9uOm8sZWRnZU9mZnNldDppfX0sdG86c2Nyb2xsVG9FbGVtLHRvWTpzY3JvbGxUb1ksaW50b1ZpZXc6c2Nyb2xsSW50b1ZpZXcsY2VudGVyOnNjcm9sbFRvQ2VudGVyT2Ysc3RvcDpzdG9wU2Nyb2xsLG1vdmluZzpmdW5jdGlvbigpe3JldHVybiEhYX0sZ2V0WTpzLmdldFksZ2V0VG9wT2Y6cy5nZXRUb3BPZn19LHM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGdldERvY1k9ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LnNjcm9sbFl8fHMuc2Nyb2xsVG9wfSxvPW1ha2VTY3JvbGxlcih7Ym9keTpkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50fHxkb2N1bWVudC5ib2R5LHRvWTpmdW5jdGlvbihzKXt3aW5kb3cuc2Nyb2xsVG8oMCxzKX0sZ2V0WTpnZXREb2NZLGdldEhlaWdodDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW5uZXJIZWlnaHR8fHMuY2xpZW50SGVpZ2h0fSxnZXRUb3BPZjpmdW5jdGlvbihvKXtyZXR1cm4gby5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3ArZ2V0RG9jWSgpLXMub2Zmc2V0VG9wfX0pO2lmKG8uY3JlYXRlU2Nyb2xsZXI9ZnVuY3Rpb24obyxpLGEpe3JldHVybiBtYWtlU2Nyb2xsZXIoe2JvZHk6byx0b1k6ZnVuY3Rpb24ocyl7by5zY3JvbGxUb3A9c30sZ2V0WTpmdW5jdGlvbigpe3JldHVybiBvLnNjcm9sbFRvcH0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKG8uY2xpZW50SGVpZ2h0LHdpbmRvdy5pbm5lckhlaWdodHx8cy5jbGllbnRIZWlnaHQpfSxnZXRUb3BPZjpmdW5jdGlvbihzKXtyZXR1cm4gcy5vZmZzZXRUb3B9fSxpLGEpfSwiYWRkRXZlbnRMaXN0ZW5lciJpbiB3aW5kb3cmJiF3aW5kb3cubm9aZW5zbW9vdGgmJiFpc05hdGl2ZVNtb290aFNjcm9sbEVuYWJsZWRPbihkb2N1bWVudC5ib2R5KSl7dmFyIGk9Imhpc3RvcnkiaW4gd2luZG93JiYicHVzaFN0YXRlImluIGhpc3RvcnksYT1pJiYic2Nyb2xsUmVzdG9yYXRpb24iaW4gaGlzdG9yeTthJiYoaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbj0iYXV0byIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXthJiYoc2V0VGltZW91dCgoZnVuY3Rpb24oKXtoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uPSJtYW51YWwifSksOSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIiwoZnVuY3Rpb24ocyl7cy5zdGF0ZSYmInplbnNjcm9sbFkiaW4gcy5zdGF0ZSYmby50b1kocy5zdGF0ZS56ZW5zY3JvbGxZKX0pLCExKSksd2luZG93LmxvY2F0aW9uLmhhc2gmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHM9by5zZXR1cCgpLmVkZ2VPZmZzZXQ7aWYocyl7dmFyIGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIiMiKVsxXSk7aWYoaSl7dmFyIGE9TWF0aC5tYXgoMCxvLmdldFRvcE9mKGkpLXMpLHU9by5nZXRZKCktYTswPD11JiZ1PDkmJndpbmRvdy5zY3JvbGxUbygwLGEpfX19KSw5KX0pLCExKTt2YXIgdT1uZXcgUmVnRXhwKCIoXnxcXHMpbm9aZW5zbW9vdGgoXFxzfCQpIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoZnVuY3Rpb24ocyl7Zm9yKHZhciBfPXMudGFyZ2V0O18mJiJBIiE9PV8udGFnTmFtZTspXz1fLnBhcmVudE5vZGU7aWYoISghX3x8MSE9PXMud2hpY2h8fHMuc2hpZnRLZXl8fHMubWV0YUtleXx8cy5jdHJsS2V5fHxzLmFsdEtleSkpe2lmKGEpe3ZhciB3PWhpc3Rvcnkuc3RhdGUmJiJvYmplY3QiPT10eXBlb2YgaGlzdG9yeS5zdGF0ZT9oaXN0b3J5LnN0YXRlOnt9O3cuemVuc2Nyb2xsWT1vLmdldFkoKTt0cnl7aGlzdG9yeS5yZXBsYWNlU3RhdGUodywiIil9Y2F0Y2gocyl7fX12YXIgeD1fLmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIjtpZigwPT09eC5pbmRleE9mKCIjIikmJiF1LnRlc3QoXy5jbGFzc05hbWUpKXt2YXIgQz0wLGo9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoeC5zdWJzdHJpbmcoMSkpO2lmKCIjIiE9PXgpe2lmKCFqKXJldHVybjtDPW8uZ2V0VG9wT2Yoail9cy5wcmV2ZW50RGVmYXVsdCgpO3ZhciBvbkRvbmU9ZnVuY3Rpb24oKXt3aW5kb3cubG9jYXRpb249eH0sTD1vLnNldHVwKCkuZWRnZU9mZnNldDtMJiYoQz1NYXRoLm1heCgwLEMtTCksaSYmKG9uRG9uZT1mdW5jdGlvbigpe2hpc3RvcnkucHVzaFN0YXRlKHt9LCIiLHgpfSkpLG8udG9ZKEMsbnVsbCxvbkRvbmUpfX19KSwhMSl9cmV0dXJuIG99KCksdm9pZCAwPT09KHU9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5hcHBseShvLGEpOmkpfHwocy5leHBvcnRzPXUpfSwxNTM0MCgpe30sNzk4MzgoKXt9LDQ4Njc1KHMsbyxpKXtzLmV4cG9ydHM9aSgyMDg1MCl9LDc2NjYocyxvLGkpe3ZhciBhPWkoODQ4NTEpLHU9aSg5NTMpO2Z1bmN0aW9uIF9leHRlbmRzKCl7dmFyIG87cmV0dXJuIHMuZXhwb3J0cz1fZXh0ZW5kcz1hP3Uobz1hKS5jYWxsKG8pOmZ1bmN0aW9uKHMpe2Zvcih2YXIgbz0xO288YXJndW1lbnRzLmxlbmd0aDtvKyspe3ZhciBpPWFyZ3VtZW50c1tvXTtmb3IodmFyIGEgaW4gaSkoe30pLmhhc093blByb3BlcnR5LmNhbGwoaSxhKSYmKHNbYV09aVthXSl9cmV0dXJuIHN9LHMuZXhwb3J0cy5fX2VzTW9kdWxlPSEwLHMuZXhwb3J0cy5kZWZhdWx0PXMuZXhwb3J0cyxfZXh0ZW5kcy5hcHBseShudWxsLGFyZ3VtZW50cyl9cy5leHBvcnRzPV9leHRlbmRzLHMuZXhwb3J0cy5fX2VzTW9kdWxlPSEwLHMuZXhwb3J0cy5kZWZhdWx0PXMuZXhwb3J0c30sMzkyMDkocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDc2NTc4KSx1PSJ1bmRlZmluZWQiPT10eXBlb2YgZ2xvYmFsVGhpcz9pLmc6Z2xvYmFsVGhpcztzLmV4cG9ydHM9ZnVuY3Rpb24gYXZhaWxhYmxlVHlwZWRBcnJheXMoKXtmb3IodmFyIHM9W10sbz0wO288YS5sZW5ndGg7bysrKSJmdW5jdGlvbiI9PXR5cGVvZiB1W2Fbb11dJiYoc1tzLmxlbmd0aF09YVtvXSk7cmV0dXJuIHN9fSw0Njk0MihzLG8pe3ZhciBpOyFmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT17fS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBjbGFzc05hbWVzKCl7Zm9yKHZhciBzPSIiLG89MDtvPGFyZ3VtZW50cy5sZW5ndGg7bysrKXt2YXIgaT1hcmd1bWVudHNbb107aSYmKHM9YXBwZW5kQ2xhc3MocyxwYXJzZVZhbHVlKGkpKSl9cmV0dXJuIHN9ZnVuY3Rpb24gcGFyc2VWYWx1ZShzKXtpZigic3RyaW5nIj09dHlwZW9mIHN8fCJudW1iZXIiPT10eXBlb2YgcylyZXR1cm4gcztpZigib2JqZWN0IiE9dHlwZW9mIHMpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheShzKSlyZXR1cm4gY2xhc3NOYW1lcy5hcHBseShudWxsLHMpO2lmKHMudG9TdHJpbmchPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJiYhcy50b1N0cmluZy50b1N0cmluZygpLmluY2x1ZGVzKCJbbmF0aXZlIGNvZGVdIikpcmV0dXJuIHMudG9TdHJpbmcoKTt2YXIgbz0iIjtmb3IodmFyIGkgaW4gcylhLmNhbGwocyxpKSYmc1tpXSYmKG89YXBwZW5kQ2xhc3MobyxpKSk7cmV0dXJuIG99ZnVuY3Rpb24gYXBwZW5kQ2xhc3MocyxvKXtyZXR1cm4gbz9zP3MrIiAiK286cytvOnN9cy5leHBvcnRzPyhjbGFzc05hbWVzLmRlZmF1bHQ9Y2xhc3NOYW1lcyxzLmV4cG9ydHM9Y2xhc3NOYW1lcyk6dm9pZCAwPT09KGk9ZnVuY3Rpb24oKXtyZXR1cm4gY2xhc3NOYW1lc30uYXBwbHkobyxbXSkpfHwocy5leHBvcnRzPWkpfSgpfSw2ODYyMyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNjk0KTtzLmV4cG9ydHM9YX0sOTM3MDAocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDE5NzA5KTtzLmV4cG9ydHM9YX0sNDYyKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg0MDk3NSk7cy5leHBvcnRzPWF9LDM3MjU3KHMsbyxpKXsidXNlIHN0cmljdCI7aSg5NjYwNSksaSg2NDUwMiksaSgzNjM3MSksaSg5OTM2MyksaSg3MDU3KTt2YXIgYT1pKDkyMDQ2KTtzLmV4cG9ydHM9YS5BZ2dyZWdhdGVFcnJvcn0sMzI1NjcocyxvLGkpeyJ1c2Ugc3RyaWN0IjtpKDc5MzA3KTt2YXIgYT1pKDYxNzQ3KTtzLmV4cG9ydHM9YSgiRnVuY3Rpb24iLCJiaW5kIil9LDIzMDM0KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg4ODI4MCksdT1pKDMyNTY3KSxfPUZ1bmN0aW9uLnByb3RvdHlwZTtzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7dmFyIG89cy5iaW5kO3JldHVybiBzPT09X3x8YShfLHMpJiZvPT09Xy5iaW5kP3U6b319LDk3NDgocyxvLGkpeyJ1c2Ugc3RyaWN0IjtpKDcxMzQwKTt2YXIgYT1pKDkyMDQ2KTtzLmV4cG9ydHM9YS5PYmplY3QuYXNzaWdufSwyMDg1MChzLG8saSl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz1pKDQ2MDc2KX0sOTUzKHMsbyxpKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPWkoNTMzNzUpfSw4NDg1MShzLG8saSl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz1pKDg1NDAxKX0sNDYwNzYocyxvLGkpeyJ1c2Ugc3RyaWN0IjtpKDkxNTk5KTt2YXIgYT1pKDY4NjIzKTtzLmV4cG9ydHM9YX0sNTMzNzUocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDkzNzAwKTtzLmV4cG9ydHM9YX0sODU0MDEocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQ2Mik7cy5leHBvcnRzPWF9LDgyMTU5KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg2MjI1MCksdT1pKDQ2NDApLF89VHlwZUVycm9yO3MuZXhwb3J0cz1mdW5jdGlvbihzKXtpZihhKHMpKXJldHVybiBzO3Rocm93IG5ldyBfKHUocykrIiBpcyBub3QgYSBmdW5jdGlvbiIpfX0sMTAwNDMocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDU0MDE4KSx1PVN0cmluZyxfPVR5cGVFcnJvcjtzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7aWYoYShzKSlyZXR1cm4gczt0aHJvdyBuZXcgXygiQ2FuJ3Qgc2V0ICIrdShzKSsiIGFzIGEgcHJvdG90eXBlIil9fSw0MjE1NihzKXsidXNlIHN0cmljdCI7cy5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sMzY2MjQocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQ2Mjg1KSx1PVN0cmluZyxfPVR5cGVFcnJvcjtzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7aWYoYShzKSlyZXR1cm4gczt0aHJvdyBuZXcgXyh1KHMpKyIgaXMgbm90IGFuIG9iamVjdCIpfX0sNzQ0MzYocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQ5OTMpLHU9aSgzNDg0OSksXz1pKDIwNTc1KSxjcmVhdGVNZXRob2Q9ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKG8saSx3KXt2YXIgeD1hKG8pLEM9Xyh4KTtpZigwPT09QylyZXR1cm4hcyYmLTE7dmFyIGosTD11KHcsQyk7aWYocyYmaSE9aSl7Zm9yKDtDPkw7KWlmKChqPXhbTCsrXSkhPWopcmV0dXJuITB9ZWxzZSBmb3IoO0M+TDtMKyspaWYoKHN8fEwgaW4geCkmJnhbTF09PT1pKXJldHVybiBzfHxMfHwwO3JldHVybiFzJiYtMX19O3MuZXhwb3J0cz17aW5jbHVkZXM6Y3JlYXRlTWV0aG9kKCEwKSxpbmRleE9mOmNyZWF0ZU1ldGhvZCghMSl9fSw5MzQyNyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMTkwNyk7cy5leHBvcnRzPWEoW10uc2xpY2UpfSw0NTgwNyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMTkwNyksdT1hKHt9LnRvU3RyaW5nKSxfPWEoIiIuc2xpY2UpO3MuZXhwb3J0cz1mdW5jdGlvbihzKXtyZXR1cm4gXyh1KHMpLDgsLTEpfX0sNzM5NDgocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDUyNjIzKSx1PWkoNjIyNTApLF89aSg0NTgwNyksdz1pKDc2MjY0KSgidG9TdHJpbmdUYWciKSx4PU9iamVjdCxDPSJBcmd1bWVudHMiPT09XyhmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpO3MuZXhwb3J0cz1hP186ZnVuY3Rpb24ocyl7dmFyIG8saSxhO3JldHVybiB2b2lkIDA9PT1zPyJVbmRlZmluZWQiOm51bGw9PT1zPyJOdWxsIjoic3RyaW5nIj09dHlwZW9mKGk9ZnVuY3Rpb24ocyxvKXt0cnl7cmV0dXJuIHNbb119Y2F0Y2gocyl7fX0obz14KHMpLHcpKT9pOkM/XyhvKToiT2JqZWN0Ij09PShhPV8obykpJiZ1KG8uY2FsbGVlKT8iQXJndW1lbnRzIjphfX0sMTk1OTUocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQ5NzI0KSx1PWkoMTEwNDIpLF89aSgxMzg0Niksdz1pKDc0Mjg0KTtzLmV4cG9ydHM9ZnVuY3Rpb24ocyxvLGkpe2Zvcih2YXIgeD11KG8pLEM9dy5mLGo9Xy5mLEw9MDtMPHgubGVuZ3RoO0wrKyl7dmFyIEI9eFtMXTthKHMsQil8fGkmJmEoaSxCKXx8QyhzLEIsaihvLEIpKX19fSw1NzM4MihzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoOTg4MjgpO3MuZXhwb3J0cz0hYSgoZnVuY3Rpb24oKXtmdW5jdGlvbiBGKCl7fXJldHVybiBGLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsLE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRikhPT1GLnByb3RvdHlwZX0pKX0sNTk1NTAocyl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz1mdW5jdGlvbihzLG8pe3JldHVybnt2YWx1ZTpzLGRvbmU6b319fSw2MTYyNihzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMzk0NDcpLHU9aSg3NDI4NCksXz1pKDc1ODE3KTtzLmV4cG9ydHM9YT9mdW5jdGlvbihzLG8saSl7cmV0dXJuIHUuZihzLG8sXygxLGkpKX06ZnVuY3Rpb24ocyxvLGkpe3JldHVybiBzW29dPWksc319LDc1ODE3KHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9ZnVuY3Rpb24ocyxvKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmcyksY29uZmlndXJhYmxlOiEoMiZzKSx3cml0YWJsZTohKDQmcyksdmFsdWU6b319fSw2ODA1NShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNjE2MjYpO3MuZXhwb3J0cz1mdW5jdGlvbihzLG8saSx1KXtyZXR1cm4gdSYmdS5lbnVtZXJhYmxlP3Nbb109aTphKHMsbyxpKSxzfX0sMjUzMihzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNDU5NTEpLHU9T2JqZWN0LmRlZmluZVByb3BlcnR5O3MuZXhwb3J0cz1mdW5jdGlvbihzLG8pe3RyeXt1KGEscyx7dmFsdWU6byxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KX1jYXRjaChpKXthW3NdPW99cmV0dXJuIG99fSwzOTQ0NyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoOTg4MjgpO3MuZXhwb3J0cz0hYSgoZnVuY3Rpb24oKXtyZXR1cm4gNyE9PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwxLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KVsxXX0pKX0sNDk1NTIocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQ1OTUxKSx1PWkoNDYyODUpLF89YS5kb2N1bWVudCx3PXUoXykmJnUoXy5jcmVhdGVFbGVtZW50KTtzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7cmV0dXJuIHc/Xy5jcmVhdGVFbGVtZW50KHMpOnt9fX0sMTkyODcocyl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz17Q1NTUnVsZUxpc3Q6MCxDU1NTdHlsZURlY2xhcmF0aW9uOjAsQ1NTVmFsdWVMaXN0OjAsQ2xpZW50UmVjdExpc3Q6MCxET01SZWN0TGlzdDowLERPTVN0cmluZ0xpc3Q6MCxET01Ub2tlbkxpc3Q6MSxEYXRhVHJhbnNmZXJJdGVtTGlzdDowLEZpbGVMaXN0OjAsSFRNTEFsbENvbGxlY3Rpb246MCxIVE1MQ29sbGVjdGlvbjowLEhUTUxGb3JtRWxlbWVudDowLEhUTUxTZWxlY3RFbGVtZW50OjAsTWVkaWFMaXN0OjAsTWltZVR5cGVBcnJheTowLE5hbWVkTm9kZU1hcDowLE5vZGVMaXN0OjEsUGFpbnRSZXF1ZXN0TGlzdDowLFBsdWdpbjowLFBsdWdpbkFycmF5OjAsU1ZHTGVuZ3RoTGlzdDowLFNWR051bWJlckxpc3Q6MCxTVkdQYXRoU2VnTGlzdDowLFNWR1BvaW50TGlzdDowLFNWR1N0cmluZ0xpc3Q6MCxTVkdUcmFuc2Zvcm1MaXN0OjAsU291cmNlQnVmZmVyTGlzdDowLFN0eWxlU2hlZXRMaXN0OjAsVGV4dFRyYWNrQ3VlTGlzdDowLFRleHRUcmFja0xpc3Q6MCxUb3VjaExpc3Q6MH19LDgwMzc2KHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9WyJjb25zdHJ1Y3RvciIsImhhc093blByb3BlcnR5IiwiaXNQcm90b3R5cGVPZiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwidG9Mb2NhbGVTdHJpbmciLCJ0b1N0cmluZyIsInZhbHVlT2YiXX0sOTY3OTQocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQ1OTUxKS5uYXZpZ2F0b3IsdT1hJiZhLnVzZXJBZ2VudDtzLmV4cG9ydHM9dT9TdHJpbmcodSk6IiJ9LDIwNzk4KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGEsdSxfPWkoNDU5NTEpLHc9aSg5Njc5NCkseD1fLnByb2Nlc3MsQz1fLkRlbm8saj14JiZ4LnZlcnNpb25zfHxDJiZDLnZlcnNpb24sTD1qJiZqLnY4O0wmJih1PShhPUwuc3BsaXQoIi4iKSlbMF0+MCYmYVswXTw0PzE6KyhhWzBdK2FbMV0pKSwhdSYmdyYmKCEoYT13Lm1hdGNoKC9FZGdlXC8oXGQrKS8pKXx8YVsxXT49NzQpJiYoYT13Lm1hdGNoKC9DaHJvbWVcLyhcZCspLykpJiYodT0rYVsxXSkscy5leHBvcnRzPXV9LDg1NzYyKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgxOTA3KSx1PUVycm9yLF89YSgiIi5yZXBsYWNlKSx3PVN0cmluZyhuZXcgdSgienhjYXNkIikuc3RhY2spLHg9L1xuXHMqYXQgW146XSo6W15cbl0qLyxDPXgudGVzdCh3KTtzLmV4cG9ydHM9ZnVuY3Rpb24ocyxvKXtpZihDJiYic3RyaW5nIj09dHlwZW9mIHMmJiF1LnByZXBhcmVTdGFja1RyYWNlKWZvcig7by0tOylzPV8ocyx4LCIiKTtyZXR1cm4gc319LDg1ODg0KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg2MTYyNiksdT1pKDg1NzYyKSxfPWkoMjM4ODgpLHc9RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U7cy5leHBvcnRzPWZ1bmN0aW9uKHMsbyxpLHgpe18mJih3P3cocyxvKTphKHMsInN0YWNrIix1KGkseCkpKX19LDIzODg4KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg5ODgyOCksdT1pKDc1ODE3KTtzLmV4cG9ydHM9IWEoKGZ1bmN0aW9uKCl7dmFyIHM9bmV3IEVycm9yKCJhIik7cmV0dXJuISgic3RhY2siaW4gcyl8fChPYmplY3QuZGVmaW5lUHJvcGVydHkocywic3RhY2siLHUoMSw3KSksNyE9PXMuc3RhY2spfSkpfSwxMTA5MShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNDU5NTEpLHU9aSg3NjAyNCksXz1pKDkyMzYxKSx3PWkoNjIyNTApLHg9aSgxMzg0NikuZixDPWkoNzQ2Myksaj1pKDkyMDQ2KSxMPWkoMjgzMTEpLEI9aSg2MTYyNiksJD1pKDQ5NzI0KTtpKDM2MTI4KTt2YXIgd3JhcENvbnN0cnVjdG9yPWZ1bmN0aW9uKHMpe3ZhciBXcmFwcGVyPWZ1bmN0aW9uKG8saSxhKXtpZih0aGlzIGluc3RhbmNlb2YgV3JhcHBlcil7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHM7Y2FzZSAxOnJldHVybiBuZXcgcyhvKTtjYXNlIDI6cmV0dXJuIG5ldyBzKG8saSl9cmV0dXJuIG5ldyBzKG8saSxhKX1yZXR1cm4gdShzLHRoaXMsYXJndW1lbnRzKX07cmV0dXJuIFdyYXBwZXIucHJvdG90eXBlPXMucHJvdG90eXBlLFdyYXBwZXJ9O3MuZXhwb3J0cz1mdW5jdGlvbihzLG8pe3ZhciBpLHUsVSxWLHosWSxaLGVlLGllLGFlPXMudGFyZ2V0LGNlPXMuZ2xvYmFsLGxlPXMuc3RhdCxwZT1zLnByb3RvLGRlPWNlP2E6bGU/YVthZV06YVthZV0mJmFbYWVdLnByb3RvdHlwZSxmZT1jZT9qOmpbYWVdfHxCKGosYWUse30pW2FlXSx5ZT1mZS5wcm90b3R5cGU7Zm9yKFYgaW4gbyl1PSEoaT1DKGNlP1Y6YWUrKGxlPyIuIjoiIyIpK1Yscy5mb3JjZWQpKSYmZGUmJiQoZGUsViksWT1mZVtWXSx1JiYoWj1zLmRvbnRDYWxsR2V0U2V0PyhpZT14KGRlLFYpKSYmaWUudmFsdWU6ZGVbVl0pLHo9dSYmWj9aOm9bVl0sKGl8fHBlfHx0eXBlb2YgWSE9dHlwZW9mIHopJiYoZWU9cy5iaW5kJiZ1P0woeixhKTpzLndyYXAmJnU/d3JhcENvbnN0cnVjdG9yKHopOnBlJiZ3KHopP18oeik6eiwocy5zaGFtfHx6JiZ6LnNoYW18fFkmJlkuc2hhbSkmJkIoZWUsInNoYW0iLCEwKSxCKGZlLFYsZWUpLHBlJiYoJChqLFU9YWUrIlByb3RvdHlwZSIpfHxCKGosVSx7fSksQihqW1VdLFYseikscy5yZWFsJiZ5ZSYmKGl8fCF5ZVtWXSkmJkIoeWUsVix6KSkpfX0sOTg4Mjgocyl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz1mdW5jdGlvbihzKXt0cnl7cmV0dXJuISFzKCl9Y2F0Y2gocyl7cmV0dXJuITB9fX0sNzYwMjQocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQxNTA1KSx1PUZ1bmN0aW9uLnByb3RvdHlwZSxfPXUuYXBwbHksdz11LmNhbGw7cy5leHBvcnRzPSJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdC5hcHBseXx8KGE/dy5iaW5kKF8pOmZ1bmN0aW9uKCl7cmV0dXJuIHcuYXBwbHkoXyxhcmd1bWVudHMpfSl9LDI4MzExKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg5MjM2MSksdT1pKDgyMTU5KSxfPWkoNDE1MDUpLHc9YShhLmJpbmQpO3MuZXhwb3J0cz1mdW5jdGlvbihzLG8pe3JldHVybiB1KHMpLHZvaWQgMD09PW8/czpfP3cocyxvKTpmdW5jdGlvbigpe3JldHVybiBzLmFwcGx5KG8sYXJndW1lbnRzKX19fSw0MTUwNShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoOTg4MjgpO3MuZXhwb3J0cz0hYSgoZnVuY3Rpb24oKXt2YXIgcz1mdW5jdGlvbigpe30uYmluZCgpO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBzfHxzLmhhc093blByb3BlcnR5KCJwcm90b3R5cGUiKX0pKX0sNDQ2NzMocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDE5MDcpLHU9aSg4MjE1OSksXz1pKDQ2Mjg1KSx3PWkoNDk3MjQpLHg9aSg5MzQyNyksQz1pKDQxNTA1KSxqPUZ1bmN0aW9uLEw9YShbXS5jb25jYXQpLEI9YShbXS5qb2luKSwkPXt9O3MuZXhwb3J0cz1DP2ouYmluZDpmdW5jdGlvbiBiaW5kKHMpe3ZhciBvPXUodGhpcyksaT1vLnByb3RvdHlwZSxhPXgoYXJndW1lbnRzLDEpLEM9ZnVuY3Rpb24gYm91bmQoKXt2YXIgaT1MKGEseChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIEM/ZnVuY3Rpb24ocyxvLGkpe2lmKCF3KCQsbykpe2Zvcih2YXIgYT1bXSx1PTA7dTxvO3UrKylhW3VdPSJhWyIrdSsiXSI7JFtvXT1qKCJDLGEiLCJyZXR1cm4gbmV3IEMoIitCKGEsIiwiKSsiKSIpfXJldHVybiAkW29dKHMsaSl9KG8saS5sZW5ndGgsaSk6by5hcHBseShzLGkpfTtyZXR1cm4gXyhpKSYmKEMucHJvdG90eXBlPWkpLEN9fSwxMzkzMChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNDE1MDUpLHU9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7cy5leHBvcnRzPWE/dS5iaW5kKHUpOmZ1bmN0aW9uKCl7cmV0dXJuIHUuYXBwbHkodSxhcmd1bWVudHMpfX0sMzY4MzMocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDM5NDQ3KSx1PWkoNDk3MjQpLF89RnVuY3Rpb24ucHJvdG90eXBlLHc9YSYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcix4PXUoXywibmFtZSIpLEM9eCYmInNvbWV0aGluZyI9PT1mdW5jdGlvbiBzb21ldGhpbmcoKXt9Lm5hbWUsaj14JiYoIWF8fGEmJncoXywibmFtZSIpLmNvbmZpZ3VyYWJsZSk7cy5leHBvcnRzPXtFWElTVFM6eCxQUk9QRVI6QyxDT05GSUdVUkFCTEU6an19LDUxODcxKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgxOTA3KSx1PWkoODIxNTkpO3MuZXhwb3J0cz1mdW5jdGlvbihzLG8saSl7dHJ5e3JldHVybiBhKHUoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzLG8pW2ldKSl9Y2F0Y2gocyl7fX19LDkyMzYxKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg0NTgwNyksdT1pKDE5MDcpO3MuZXhwb3J0cz1mdW5jdGlvbihzKXtpZigiRnVuY3Rpb24iPT09YShzKSlyZXR1cm4gdShzKX19LDE5MDcocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQxNTA1KSx1PUZ1bmN0aW9uLnByb3RvdHlwZSxfPXUuY2FsbCx3PWEmJnUuYmluZC5iaW5kKF8sXyk7cy5leHBvcnRzPWE/dzpmdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gXy5hcHBseShzLGFyZ3VtZW50cyl9fX0sNjE3NDcocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQ1OTUxKSx1PWkoOTIwNDYpO3MuZXhwb3J0cz1mdW5jdGlvbihzLG8pe3ZhciBpPXVbcysiUHJvdG90eXBlIl0sXz1pJiZpW29dO2lmKF8pcmV0dXJuIF87dmFyIHc9YVtzXSx4PXcmJncucHJvdG90eXBlO3JldHVybiB4JiZ4W29dfX0sODU1ODIocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDkyMDQ2KSx1PWkoNDU5NTEpLF89aSg2MjI1MCksYUZ1bmN0aW9uPWZ1bmN0aW9uKHMpe3JldHVybiBfKHMpP3M6dm9pZCAwfTtzLmV4cG9ydHM9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2FGdW5jdGlvbihhW3NdKXx8YUZ1bmN0aW9uKHVbc10pOmFbc10mJmFbc11bb118fHVbc10mJnVbc11bb119fSw3MzQ0OChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNzM5NDgpLHU9aSgyOTM2NyksXz1pKDg3MTM2KSx3PWkoOTM3NDIpLHg9aSg3NjI2NCkoIml0ZXJhdG9yIik7cy5leHBvcnRzPWZ1bmN0aW9uKHMpe2lmKCFfKHMpKXJldHVybiB1KHMseCl8fHUocywiQEBpdGVyYXRvciIpfHx3W2EocyldfX0sMTAzMDAocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDEzOTMwKSx1PWkoODIxNTkpLF89aSgzNjYyNCksdz1pKDQ2NDApLHg9aSg3MzQ0OCksQz1UeXBlRXJyb3I7cy5leHBvcnRzPWZ1bmN0aW9uKHMsbyl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aDwyP3gocyk6bztpZih1KGkpKXJldHVybiBfKGEoaSxzKSk7dGhyb3cgbmV3IEModyhzKSsiIGlzIG5vdCBpdGVyYWJsZSIpfX0sMjkzNjcocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDgyMTU5KSx1PWkoODcxMzYpO3MuZXhwb3J0cz1mdW5jdGlvbihzLG8pe3ZhciBpPXNbb107cmV0dXJuIHUoaSk/dm9pZCAwOmEoaSl9fSw0NTk1MShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBjaGVjaz1mdW5jdGlvbihzKXtyZXR1cm4gcyYmcy5NYXRoPT09TWF0aCYmc307cy5leHBvcnRzPWNoZWNrKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpcyl8fGNoZWNrKCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cpfHxjaGVjaygib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYpfHxjaGVjaygib2JqZWN0Ij09dHlwZW9mIGkuZyYmaS5nKXx8Y2hlY2soIm9iamVjdCI9PXR5cGVvZiB0aGlzJiZ0aGlzKXx8ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKX0sNDk3MjQocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDE5MDcpLHU9aSgzOTI5OCksXz1hKHt9Lmhhc093blByb3BlcnR5KTtzLmV4cG9ydHM9T2JqZWN0Lmhhc093bnx8ZnVuY3Rpb24gaGFzT3duKHMsbyl7cmV0dXJuIF8odShzKSxvKX19LDM4NTMwKHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9e319LDYyNDE2KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg4NTU4Mik7cy5leHBvcnRzPWEoImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iil9LDczNjQ4KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgzOTQ0NyksdT1pKDk4ODI4KSxfPWkoNDk1NTIpO3MuZXhwb3J0cz0hYSYmIXUoKGZ1bmN0aW9uKCl7cmV0dXJuIDchPT1PYmplY3QuZGVmaW5lUHJvcGVydHkoXygiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpfSwxNjk0NihzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMTkwNyksdT1pKDk4ODI4KSxfPWkoNDU4MDcpLHc9T2JqZWN0LHg9YSgiIi5zcGxpdCk7cy5leHBvcnRzPXUoKGZ1bmN0aW9uKCl7cmV0dXJuIXcoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKX0pKT9mdW5jdGlvbihzKXtyZXR1cm4iU3RyaW5nIj09PV8ocyk/eChzLCIiKTp3KHMpfTp3fSwzNDA4NChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNjIyNTApLHU9aSg0NjI4NSksXz1pKDc5MTkyKTtzLmV4cG9ydHM9ZnVuY3Rpb24ocyxvLGkpe3ZhciB3LHg7cmV0dXJuIF8mJmEodz1vLmNvbnN0cnVjdG9yKSYmdyE9PWkmJnUoeD13LnByb3RvdHlwZSkmJnghPT1pLnByb3RvdHlwZSYmXyhzLHgpLHN9fSwzOTI1OShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNDYyODUpLHU9aSg2MTYyNik7cy5leHBvcnRzPWZ1bmN0aW9uKHMsbyl7YShvKSYmImNhdXNlImluIG8mJnUocywiY2F1c2UiLG8uY2F1c2UpfX0sNjQ5MzIocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYSx1LF8sdz1pKDQwNTUxKSx4PWkoNDU5NTEpLEM9aSg0NjI4NSksaj1pKDYxNjI2KSxMPWkoNDk3MjQpLEI9aSgzNjEyOCksJD1pKDkyNTIyKSxVPWkoMzg1MzApLFY9Ik9iamVjdCBhbHJlYWR5IGluaXRpYWxpemVkIix6PXguVHlwZUVycm9yLFk9eC5XZWFrTWFwO2lmKHd8fEIuc3RhdGUpe3ZhciBaPUIuc3RhdGV8fChCLnN0YXRlPW5ldyBZKTtaLmdldD1aLmdldCxaLmhhcz1aLmhhcyxaLnNldD1aLnNldCxhPWZ1bmN0aW9uKHMsbyl7aWYoWi5oYXMocykpdGhyb3cgbmV3IHooVik7cmV0dXJuIG8uZmFjYWRlPXMsWi5zZXQocyxvKSxvfSx1PWZ1bmN0aW9uKHMpe3JldHVybiBaLmdldChzKXx8e319LF89ZnVuY3Rpb24ocyl7cmV0dXJuIFouaGFzKHMpfX1lbHNle3ZhciBlZT0kKCJzdGF0ZSIpO1VbZWVdPSEwLGE9ZnVuY3Rpb24ocyxvKXtpZihMKHMsZWUpKXRocm93IG5ldyB6KFYpO3JldHVybiBvLmZhY2FkZT1zLGoocyxlZSxvKSxvfSx1PWZ1bmN0aW9uKHMpe3JldHVybiBMKHMsZWUpP3NbZWVdOnt9fSxfPWZ1bmN0aW9uKHMpe3JldHVybiBMKHMsZWUpfX1zLmV4cG9ydHM9e3NldDphLGdldDp1LGhhczpfLGVuZm9yY2U6ZnVuY3Rpb24ocyl7cmV0dXJuIF8ocyk/dShzKTphKHMse30pfSxnZXR0ZXJGb3I6ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKG8pe3ZhciBpO2lmKCFDKG8pfHwoaT11KG8pKS50eXBlIT09cyl0aHJvdyBuZXcgeigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK3MrIiByZXF1aXJlZCIpO3JldHVybiBpfX19fSwzNzgxMihzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNzYyNjQpLHU9aSg5Mzc0MiksXz1hKCJpdGVyYXRvciIpLHc9QXJyYXkucHJvdG90eXBlO3MuZXhwb3J0cz1mdW5jdGlvbihzKXtyZXR1cm4gdm9pZCAwIT09cyYmKHUuQXJyYXk9PT1zfHx3W19dPT09cyl9fSw2MjI1MChzKXsidXNlIHN0cmljdCI7dmFyIG89Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuYWxsO3MuZXhwb3J0cz12b2lkIDA9PT1vJiZ2b2lkIDAhPT1vP2Z1bmN0aW9uKHMpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBzfHxzPT09b306ZnVuY3Rpb24ocyl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHN9fSw3NDYzKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg5ODgyOCksdT1pKDYyMjUwKSxfPS8jfFwucHJvdG90eXBlXC4vLGlzRm9yY2VkPWZ1bmN0aW9uKHMsbyl7dmFyIGk9eFt3KHMpXTtyZXR1cm4gaT09PWp8fGkhPT1DJiYodShvKT9hKG8pOiEhbyl9LHc9aXNGb3JjZWQubm9ybWFsaXplPWZ1bmN0aW9uKHMpe3JldHVybiBTdHJpbmcocykucmVwbGFjZShfLCIuIikudG9Mb3dlckNhc2UoKX0seD1pc0ZvcmNlZC5kYXRhPXt9LEM9aXNGb3JjZWQuTkFUSVZFPSJOIixqPWlzRm9yY2VkLlBPTFlGSUxMPSJQIjtzLmV4cG9ydHM9aXNGb3JjZWR9LDg3MTM2KHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7cmV0dXJuIG51bGw9PXN9fSw0NjI4NShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNjIyNTApO3MuZXhwb3J0cz1mdW5jdGlvbihzKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHM/bnVsbCE9PXM6YShzKX19LDU0MDE4KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg0NjI4NSk7cy5leHBvcnRzPWZ1bmN0aW9uKHMpe3JldHVybiBhKHMpfHxudWxsPT09c319LDczNzYocyl7InVzZSBzdHJpY3QiO3MuZXhwb3J0cz0hMH0sMjU1OTQocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDg1NTgyKSx1PWkoNjIyNTApLF89aSg4ODI4MCksdz1pKDUxMTc1KSx4PU9iamVjdDtzLmV4cG9ydHM9dz9mdW5jdGlvbihzKXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHN9OmZ1bmN0aW9uKHMpe3ZhciBvPWEoIlN5bWJvbCIpO3JldHVybiB1KG8pJiZfKG8ucHJvdG90eXBlLHgocykpfX0sMjQ4MjMocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDI4MzExKSx1PWkoMTM5MzApLF89aSgzNjYyNCksdz1pKDQ2NDApLHg9aSgzNzgxMiksQz1pKDIwNTc1KSxqPWkoODgyODApLEw9aSgxMDMwMCksQj1pKDczNDQ4KSwkPWkoNDAxNTQpLFU9VHlwZUVycm9yLFJlc3VsdD1mdW5jdGlvbihzLG8pe3RoaXMuc3RvcHBlZD1zLHRoaXMucmVzdWx0PW99LFY9UmVzdWx0LnByb3RvdHlwZTtzLmV4cG9ydHM9ZnVuY3Rpb24ocyxvLGkpe3ZhciB6LFksWixlZSxpZSxhZSxjZSxsZT1pJiZpLnRoYXQscGU9ISghaXx8IWkuQVNfRU5UUklFUyksZGU9ISghaXx8IWkuSVNfUkVDT1JEKSxmZT0hKCFpfHwhaS5JU19JVEVSQVRPUikseWU9ISghaXx8IWkuSU5URVJSVVBURUQpLGJlPWEobyxsZSksc3RvcD1mdW5jdGlvbihzKXtyZXR1cm4geiYmJCh6LCJub3JtYWwiLHMpLG5ldyBSZXN1bHQoITAscyl9LGNhbGxGbj1mdW5jdGlvbihzKXtyZXR1cm4gcGU/KF8ocykseWU/YmUoc1swXSxzWzFdLHN0b3ApOmJlKHNbMF0sc1sxXSkpOnllP2JlKHMsc3RvcCk6YmUocyl9O2lmKGRlKXo9cy5pdGVyYXRvcjtlbHNlIGlmKGZlKXo9cztlbHNle2lmKCEoWT1CKHMpKSl0aHJvdyBuZXcgVSh3KHMpKyIgaXMgbm90IGl0ZXJhYmxlIik7aWYoeChZKSl7Zm9yKFo9MCxlZT1DKHMpO2VlPlo7WisrKWlmKChpZT1jYWxsRm4oc1taXSkpJiZqKFYsaWUpKXJldHVybiBpZTtyZXR1cm4gbmV3IFJlc3VsdCghMSl9ej1MKHMsWSl9Zm9yKGFlPWRlP3MubmV4dDp6Lm5leHQ7IShjZT11KGFlLHopKS5kb25lOyl7dHJ5e2llPWNhbGxGbihjZS52YWx1ZSl9Y2F0Y2gocyl7JCh6LCJ0aHJvdyIscyl9aWYoIm9iamVjdCI9PXR5cGVvZiBpZSYmaWUmJmooVixpZSkpcmV0dXJuIGllfXJldHVybiBuZXcgUmVzdWx0KCExKX19LDQwMTU0KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgxMzkzMCksdT1pKDM2NjI0KSxfPWkoMjkzNjcpO3MuZXhwb3J0cz1mdW5jdGlvbihzLG8saSl7dmFyIHcseDt1KHMpO3RyeXtpZighKHc9XyhzLCJyZXR1cm4iKSkpe2lmKCJ0aHJvdyI9PT1vKXRocm93IGk7cmV0dXJuIGl9dz1hKHcscyl9Y2F0Y2gocyl7eD0hMCx3PXN9aWYoInRocm93Ij09PW8pdGhyb3cgaTtpZih4KXRocm93IHc7cmV0dXJuIHUodyksaX19LDQ3MTgxKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg5NTExNikuSXRlcmF0b3JQcm90b3R5cGUsdT1pKDU4MDc1KSxfPWkoNzU4MTcpLHc9aSgxNDg0MCkseD1pKDkzNzQyKSxyZXR1cm5UaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3MuZXhwb3J0cz1mdW5jdGlvbihzLG8saSxDKXt2YXIgaj1vKyIgSXRlcmF0b3IiO3JldHVybiBzLnByb3RvdHlwZT11KGEse25leHQ6XygrIUMsaSl9KSx3KHMsaiwhMSwhMCkseFtqXT1yZXR1cm5UaGlzLHN9fSw2MDE4MyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMTEwOTEpLHU9aSgxMzkzMCksXz1pKDczNzYpLHc9aSgzNjgzMykseD1pKDYyMjUwKSxDPWkoNDcxODEpLGo9aSgxNTk3MiksTD1pKDc5MTkyKSxCPWkoMTQ4NDApLCQ9aSg2MTYyNiksVT1pKDY4MDU1KSxWPWkoNzYyNjQpLHo9aSg5Mzc0MiksWT1pKDk1MTE2KSxaPXcuUFJPUEVSLGVlPXcuQ09ORklHVVJBQkxFLGllPVkuSXRlcmF0b3JQcm90b3R5cGUsYWU9WS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLGNlPVYoIml0ZXJhdG9yIiksbGU9ImtleXMiLHBlPSJ2YWx1ZXMiLGRlPSJlbnRyaWVzIixyZXR1cm5UaGlzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3MuZXhwb3J0cz1mdW5jdGlvbihzLG8saSx3LFYsWSxmZSl7QyhpLG8sdyk7dmFyIHllLGJlLFNlLGdldEl0ZXJhdGlvbk1ldGhvZD1mdW5jdGlvbihzKXtpZihzPT09ViYmVGUpcmV0dXJuIFRlO2lmKCFhZSYmcyYmcyBpbiB4ZSlyZXR1cm4geGVbc107c3dpdGNoKHMpe2Nhc2UgbGU6cmV0dXJuIGZ1bmN0aW9uIGtleXMoKXtyZXR1cm4gbmV3IGkodGhpcyxzKX07Y2FzZSBwZTpyZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCl7cmV0dXJuIG5ldyBpKHRoaXMscyl9O2Nhc2UgZGU6cmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXtyZXR1cm4gbmV3IGkodGhpcyxzKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBpKHRoaXMpfX0sX2U9bysiIEl0ZXJhdG9yIix3ZT0hMSx4ZT1zLnByb3RvdHlwZSxQZT14ZVtjZV18fHhlWyJAQGl0ZXJhdG9yIl18fFYmJnhlW1ZdLFRlPSFhZSYmUGV8fGdldEl0ZXJhdGlvbk1ldGhvZChWKSxSZT0iQXJyYXkiPT09byYmeGUuZW50cmllc3x8UGU7aWYoUmUmJih5ZT1qKFJlLmNhbGwobmV3IHMpKSkhPT1PYmplY3QucHJvdG90eXBlJiZ5ZS5uZXh0JiYoX3x8aih5ZSk9PT1pZXx8KEw/TCh5ZSxpZSk6eCh5ZVtjZV0pfHxVKHllLGNlLHJldHVyblRoaXMpKSxCKHllLF9lLCEwLCEwKSxfJiYoeltfZV09cmV0dXJuVGhpcykpLFomJlY9PT1wZSYmUGUmJlBlLm5hbWUhPT1wZSYmKCFfJiZlZT8kKHhlLCJuYW1lIixwZSk6KHdlPSEwLFRlPWZ1bmN0aW9uIHZhbHVlcygpe3JldHVybiB1KFBlLHRoaXMpfSkpLFYpaWYoYmU9e3ZhbHVlczpnZXRJdGVyYXRpb25NZXRob2QocGUpLGtleXM6WT9UZTpnZXRJdGVyYXRpb25NZXRob2QobGUpLGVudHJpZXM6Z2V0SXRlcmF0aW9uTWV0aG9kKGRlKX0sZmUpZm9yKFNlIGluIGJlKShhZXx8d2V8fCEoU2UgaW4geGUpKSYmVSh4ZSxTZSxiZVtTZV0pO2Vsc2UgYSh7dGFyZ2V0Om8scHJvdG86ITAsZm9yY2VkOmFlfHx3ZX0sYmUpO3JldHVybiBfJiYhZmV8fHhlW2NlXT09PVRlfHxVKHhlLGNlLFRlLHtuYW1lOlZ9KSx6W29dPVRlLGJlfX0sOTUxMTYocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYSx1LF8sdz1pKDk4ODI4KSx4PWkoNjIyNTApLEM9aSg0NjI4NSksaj1pKDU4MDc1KSxMPWkoMTU5NzIpLEI9aSg2ODA1NSksJD1pKDc2MjY0KSxVPWkoNzM3NiksVj0kKCJpdGVyYXRvciIpLHo9ITE7W10ua2V5cyYmKCJuZXh0ImluKF89W10ua2V5cygpKT8odT1MKEwoXykpKSE9PU9iamVjdC5wcm90b3R5cGUmJihhPXUpOno9ITApLCFDKGEpfHx3KChmdW5jdGlvbigpe3ZhciBzPXt9O3JldHVybiBhW1ZdLmNhbGwocykhPT1zfSkpP2E9e306VSYmKGE9aihhKSkseChhW1ZdKXx8QihhLFYsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSkscy5leHBvcnRzPXtJdGVyYXRvclByb3RvdHlwZTphLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6en19LDkzNzQyKHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9e319LDIwNTc1KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgzMTIxKTtzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7cmV0dXJuIGEocy5sZW5ndGgpfX0sNDExNzYocyl7InVzZSBzdHJpY3QiO3ZhciBvPU1hdGguY2VpbCxpPU1hdGguZmxvb3I7cy5leHBvcnRzPU1hdGgudHJ1bmN8fGZ1bmN0aW9uIHRydW5jKHMpe3ZhciBhPStzO3JldHVybihhPjA/aTpvKShhKX19LDMyMDk2KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg5MDE2MCk7cy5leHBvcnRzPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHZvaWQgMD09PXM/YXJndW1lbnRzLmxlbmd0aDwyPyIiOm86YShzKX19LDI5NTM4KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgzOTQ0NyksdT1pKDE5MDcpLF89aSgxMzkzMCksdz1pKDk4ODI4KSx4PWkoMjg3NSksQz1pKDg3MTcwKSxqPWkoMjI1NzQpLEw9aSgzOTI5OCksQj1pKDE2OTQ2KSwkPU9iamVjdC5hc3NpZ24sVT1PYmplY3QuZGVmaW5lUHJvcGVydHksVj11KFtdLmNvbmNhdCk7cy5leHBvcnRzPSEkfHx3KChmdW5jdGlvbigpe2lmKGEmJjEhPT0kKHtiOjF9LCQoVSh7fSwiYSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7VSh0aGlzLCJiIix7dmFsdWU6MyxlbnVtZXJhYmxlOiExfSl9fSkse2I6Mn0pKS5iKXJldHVybiEwO3ZhciBzPXt9LG89e30saT1TeW1ib2woImFzc2lnbiBkZXRlY3Rpb24iKSx1PSJhYmNkZWZnaGlqa2xtbm9wcXJzdCI7cmV0dXJuIHNbaV09Nyx1LnNwbGl0KCIiKS5mb3JFYWNoKChmdW5jdGlvbihzKXtvW3NdPXN9KSksNyE9PSQoe30scylbaV18fHgoJCh7fSxvKSkuam9pbigiIikhPT11fSkpP2Z1bmN0aW9uIGFzc2lnbihzLG8pe2Zvcih2YXIgaT1MKHMpLHU9YXJndW1lbnRzLmxlbmd0aCx3PTEsJD1DLmYsVT1qLmY7dT53Oylmb3IodmFyIHosWT1CKGFyZ3VtZW50c1t3KytdKSxaPSQ/Vih4KFkpLCQoWSkpOngoWSksZWU9Wi5sZW5ndGgsaWU9MDtlZT5pZTspej1aW2llKytdLGEmJiFfKFUsWSx6KXx8KGlbel09WVt6XSk7cmV0dXJuIGl9OiR9LDU4MDc1KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGEsdT1pKDM2NjI0KSxfPWkoNDIyMjApLHc9aSg4MDM3NikseD1pKDM4NTMwKSxDPWkoNjI0MTYpLGo9aSg0OTU1MiksTD1pKDkyNTIyKSxCPSJwcm90b3R5cGUiLCQ9InNjcmlwdCIsVT1MKCJJRV9QUk9UTyIpLEVtcHR5Q29uc3RydWN0b3I9ZnVuY3Rpb24oKXt9LHNjcmlwdFRhZz1mdW5jdGlvbihzKXtyZXR1cm4iPCIrJCsiPiIrcysiPC8iKyQrIj4ifSxOdWxsUHJvdG9PYmplY3RWaWFBY3RpdmVYPWZ1bmN0aW9uKHMpe3Mud3JpdGUoc2NyaXB0VGFnKCIiKSkscy5jbG9zZSgpO3ZhciBvPXMucGFyZW50V2luZG93Lk9iamVjdDtyZXR1cm4gcz1udWxsLG99LE51bGxQcm90b09iamVjdD1mdW5jdGlvbigpe3RyeXthPW5ldyBBY3RpdmVYT2JqZWN0KCJodG1sZmlsZSIpfWNhdGNoKHMpe312YXIgcyxvLGk7TnVsbFByb3RvT2JqZWN0PSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQuZG9tYWluJiZhP051bGxQcm90b09iamVjdFZpYUFjdGl2ZVgoYSk6KG89aigiaWZyYW1lIiksaT0iamF2YSIrJCsiOiIsby5zdHlsZS5kaXNwbGF5PSJub25lIixDLmFwcGVuZENoaWxkKG8pLG8uc3JjPVN0cmluZyhpKSwocz1vLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSxzLndyaXRlKHNjcmlwdFRhZygiZG9jdW1lbnQuRj1PYmplY3QiKSkscy5jbG9zZSgpLHMuRik6TnVsbFByb3RvT2JqZWN0VmlhQWN0aXZlWChhKTtmb3IodmFyIHU9dy5sZW5ndGg7dS0tOylkZWxldGUgTnVsbFByb3RvT2JqZWN0W0JdW3dbdV1dO3JldHVybiBOdWxsUHJvdG9PYmplY3QoKX07eFtVXT0hMCxzLmV4cG9ydHM9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24gY3JlYXRlKHMsbyl7dmFyIGk7cmV0dXJuIG51bGwhPT1zPyhFbXB0eUNvbnN0cnVjdG9yW0JdPXUocyksaT1uZXcgRW1wdHlDb25zdHJ1Y3RvcixFbXB0eUNvbnN0cnVjdG9yW0JdPW51bGwsaVtVXT1zKTppPU51bGxQcm90b09iamVjdCgpLHZvaWQgMD09PW8/aTpfLmYoaSxvKX19LDQyMjIwKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgzOTQ0NyksdT1pKDU4NjYxKSxfPWkoNzQyODQpLHc9aSgzNjYyNCkseD1pKDQ5OTMpLEM9aSgyODc1KTtvLmY9YSYmIXU/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhzLG8pe3cocyk7Zm9yKHZhciBpLGE9eChvKSx1PUMobyksaj11Lmxlbmd0aCxMPTA7aj5MOylfLmYocyxpPXVbTCsrXSxhW2ldKTtyZXR1cm4gc319LDc0Mjg0KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgzOTQ0NyksdT1pKDczNjQ4KSxfPWkoNTg2NjEpLHc9aSgzNjYyNCkseD1pKDcwNDcwKSxDPVR5cGVFcnJvcixqPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxMPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsQj0iZW51bWVyYWJsZSIsJD0iY29uZmlndXJhYmxlIixVPSJ3cml0YWJsZSI7by5mPWE/Xz9mdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShzLG8saSl7aWYodyhzKSxvPXgobyksdyhpKSwiZnVuY3Rpb24iPT10eXBlb2YgcyYmInByb3RvdHlwZSI9PT1vJiYidmFsdWUiaW4gaSYmVSBpbiBpJiYhaVtVXSl7dmFyIGE9TChzLG8pO2EmJmFbVV0mJihzW29dPWkudmFsdWUsaT17Y29uZmlndXJhYmxlOiQgaW4gaT9pWyRdOmFbJF0sZW51bWVyYWJsZTpCIGluIGk/aVtCXTphW0JdLHdyaXRhYmxlOiExfSl9cmV0dXJuIGoocyxvLGkpfTpqOmZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHMsbyxpKXtpZih3KHMpLG89eChvKSx3KGkpLHUpdHJ5e3JldHVybiBqKHMsbyxpKX1jYXRjaChzKXt9aWYoImdldCJpbiBpfHwic2V0ImluIGkpdGhyb3cgbmV3IEMoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIGkmJihzW29dPWkudmFsdWUpLHN9fSwxMzg0NihzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMzk0NDcpLHU9aSgxMzkzMCksXz1pKDIyNTc0KSx3PWkoNzU4MTcpLHg9aSg0OTkzKSxDPWkoNzA0NzApLGo9aSg0OTcyNCksTD1pKDczNjQ4KSxCPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7by5mPWE/QjpmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocyxvKXtpZihzPXgocyksbz1DKG8pLEwpdHJ5e3JldHVybiBCKHMsbyl9Y2F0Y2gocyl7fWlmKGoocyxvKSlyZXR1cm4gdyghdShfLmYscyxvKSxzW29dKX19LDI0NDQzKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgyMzA0NSksdT1pKDgwMzc2KS5jb25jYXQoImxlbmd0aCIsInByb3RvdHlwZSIpO28uZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhzKXtyZXR1cm4gYShzLHUpfX0sODcxNzAocyxvKXsidXNlIHN0cmljdCI7by5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHN9LDE1OTcyKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg0OTcyNCksdT1pKDYyMjUwKSxfPWkoMzkyOTgpLHc9aSg5MjUyMikseD1pKDU3MzgyKSxDPXcoIklFX1BST1RPIiksaj1PYmplY3QsTD1qLnByb3RvdHlwZTtzLmV4cG9ydHM9eD9qLmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHMpe3ZhciBvPV8ocyk7aWYoYShvLEMpKXJldHVybiBvW0NdO3ZhciBpPW8uY29uc3RydWN0b3I7cmV0dXJuIHUoaSkmJm8gaW5zdGFuY2VvZiBpP2kucHJvdG90eXBlOm8gaW5zdGFuY2VvZiBqP0w6bnVsbH19LDg4MjgwKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgxOTA3KTtzLmV4cG9ydHM9YSh7fS5pc1Byb3RvdHlwZU9mKX0sMjMwNDUocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDE5MDcpLHU9aSg0OTcyNCksXz1pKDQ5OTMpLHc9aSg3NDQzNikuaW5kZXhPZix4PWkoMzg1MzApLEM9YShbXS5wdXNoKTtzLmV4cG9ydHM9ZnVuY3Rpb24ocyxvKXt2YXIgaSxhPV8ocyksaj0wLEw9W107Zm9yKGkgaW4gYSkhdSh4LGkpJiZ1KGEsaSkmJkMoTCxpKTtmb3IoO28ubGVuZ3RoPmo7KXUoYSxpPW9baisrXSkmJih+dyhMLGkpfHxDKEwsaSkpO3JldHVybiBMfX0sMjg3NShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMjMwNDUpLHU9aSg4MDM3Nik7cy5leHBvcnRzPU9iamVjdC5rZXlzfHxmdW5jdGlvbiBrZXlzKHMpe3JldHVybiBhKHMsdSl9fSwyMjU3NChzLG8peyJ1c2Ugc3RyaWN0Ijt2YXIgaT17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsdT1hJiYhaS5jYWxsKHsxOjJ9LDEpO28uZj11P2Z1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKHMpe3ZhciBvPWEodGhpcyxzKTtyZXR1cm4hIW8mJm8uZW51bWVyYWJsZX06aX0sNzkxOTIocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDUxODcxKSx1PWkoNDYyODUpLF89aSg3NDIzOSksdz1pKDEwMDQzKTtzLmV4cG9ydHM9T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoIl9fcHJvdG9fXyJpbnt9P2Z1bmN0aW9uKCl7dmFyIHMsbz0hMSxpPXt9O3RyeXsocz1hKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIsInNldCIpKShpLFtdKSxvPWkgaW5zdGFuY2VvZiBBcnJheX1jYXRjaChzKXt9cmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKGksYSl7cmV0dXJuIF8oaSksdyhhKSx1KGkpPyhvP3MoaSxhKTppLl9fcHJvdG9fXz1hLGkpOml9fSgpOnZvaWQgMCl9LDU0ODc4KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg1MjYyMyksdT1pKDczOTQ4KTtzLmV4cG9ydHM9YT97fS50b1N0cmluZzpmdW5jdGlvbiB0b1N0cmluZygpe3JldHVybiJbb2JqZWN0ICIrdSh0aGlzKSsiXSJ9fSw2MDU4MShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMTM5MzApLHU9aSg2MjI1MCksXz1pKDQ2Mjg1KSx3PVR5cGVFcnJvcjtzLmV4cG9ydHM9ZnVuY3Rpb24ocyxvKXt2YXIgaSx4O2lmKCJzdHJpbmciPT09byYmdShpPXMudG9TdHJpbmcpJiYhXyh4PWEoaSxzKSkpcmV0dXJuIHg7aWYodShpPXMudmFsdWVPZikmJiFfKHg9YShpLHMpKSlyZXR1cm4geDtpZigic3RyaW5nIiE9PW8mJnUoaT1zLnRvU3RyaW5nKSYmIV8oeD1hKGkscykpKXJldHVybiB4O3Rocm93IG5ldyB3KCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX19LDExMDQyKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg4NTU4MiksdT1pKDE5MDcpLF89aSgyNDQ0Myksdz1pKDg3MTcwKSx4PWkoMzY2MjQpLEM9dShbXS5jb25jYXQpO3MuZXhwb3J0cz1hKCJSZWZsZWN0Iiwib3duS2V5cyIpfHxmdW5jdGlvbiBvd25LZXlzKHMpe3ZhciBvPV8uZih4KHMpKSxpPXcuZjtyZXR1cm4gaT9DKG8saShzKSk6b319LDkyMDQ2KHMpeyJ1c2Ugc3RyaWN0IjtzLmV4cG9ydHM9e319LDU0ODI5KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg3NDI4NCkuZjtzLmV4cG9ydHM9ZnVuY3Rpb24ocyxvLGkpe2kgaW4gc3x8YShzLGkse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb1tpXX0sc2V0OmZ1bmN0aW9uKHMpe29baV09c319KX19LDc0MjM5KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg4NzEzNiksdT1UeXBlRXJyb3I7cy5leHBvcnRzPWZ1bmN0aW9uKHMpe2lmKGEocykpdGhyb3cgbmV3IHUoIkNhbid0IGNhbGwgbWV0aG9kIG9uICIrcyk7cmV0dXJuIHN9fSwxNDg0MChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNTI2MjMpLHU9aSg3NDI4NCkuZixfPWkoNjE2MjYpLHc9aSg0OTcyNCkseD1pKDU0ODc4KSxDPWkoNzYyNjQpKCJ0b1N0cmluZ1RhZyIpO3MuZXhwb3J0cz1mdW5jdGlvbihzLG8saSxqKXt2YXIgTD1pP3M6cyYmcy5wcm90b3R5cGU7TCYmKHcoTCxDKXx8dShMLEMse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTpvfSksaiYmIWEmJl8oTCwidG9TdHJpbmciLHgpKX19LDkyNTIyKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg4NTgxNiksdT1pKDY0OTkpLF89YSgia2V5cyIpO3MuZXhwb3J0cz1mdW5jdGlvbihzKXtyZXR1cm4gX1tzXXx8KF9bc109dShzKSl9fSwzNjEyOChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNzM3NiksdT1pKDQ1OTUxKSxfPWkoMjUzMiksdz0iX19jb3JlLWpzX3NoYXJlZF9fIix4PXMuZXhwb3J0cz11W3ddfHxfKHcse30pOyh4LnZlcnNpb25zfHwoeC52ZXJzaW9ucz1bXSkpLnB1c2goe3ZlcnNpb246IjMuNDAuMCIsbW9kZTphPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMTQtMjAyNSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSIsbGljZW5zZToiaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvYmxvYi92My40MC4wL0xJQ0VOU0UiLHNvdXJjZToiaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMifSl9LDg1ODE2KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgzNjEyOCk7cy5leHBvcnRzPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIGFbc118fChhW3NdPW98fHt9KX19LDExNDcwKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgxOTA3KSx1PWkoNjU0ODIpLF89aSg5MDE2MCksdz1pKDc0MjM5KSx4PWEoIiIuY2hhckF0KSxDPWEoIiIuY2hhckNvZGVBdCksaj1hKCIiLnNsaWNlKSxjcmVhdGVNZXRob2Q9ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKG8saSl7dmFyIGEsTCxCPV8odyhvKSksJD11KGkpLFU9Qi5sZW5ndGg7cmV0dXJuICQ8MHx8JD49VT9zPyIiOnZvaWQgMDooYT1DKEIsJCkpPDU1Mjk2fHxhPjU2MzE5fHwkKzE9PT1VfHwoTD1DKEIsJCsxKSk8NTYzMjB8fEw+NTczNDM/cz94KEIsJCk6YTpzP2ooQiwkLCQrMik6TC01NjMyMCsoYS01NTI5Njw8MTApKzY1NTM2fX07cy5leHBvcnRzPXtjb2RlQXQ6Y3JlYXRlTWV0aG9kKCExKSxjaGFyQXQ6Y3JlYXRlTWV0aG9kKCEwKX19LDE5ODQ2KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgyMDc5OCksdT1pKDk4ODI4KSxfPWkoNDU5NTEpLlN0cmluZztzLmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhdSgoZnVuY3Rpb24oKXt2YXIgcz1TeW1ib2woInN5bWJvbCBkZXRlY3Rpb24iKTtyZXR1cm4hXyhzKXx8IShPYmplY3QocylpbnN0YW5jZW9mIFN5bWJvbCl8fCFTeW1ib2wuc2hhbSYmYSYmYTw0MX0pKX0sMzQ4NDkocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDY1NDgyKSx1PU1hdGgubWF4LF89TWF0aC5taW47cy5leHBvcnRzPWZ1bmN0aW9uKHMsbyl7dmFyIGk9YShzKTtyZXR1cm4gaTwwP3UoaStvLDApOl8oaSxvKX19LDQ5OTMocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDE2OTQ2KSx1PWkoNzQyMzkpO3MuZXhwb3J0cz1mdW5jdGlvbihzKXtyZXR1cm4gYSh1KHMpKX19LDY1NDgyKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg0MTE3Nik7cy5leHBvcnRzPWZ1bmN0aW9uKHMpe3ZhciBvPStzO3JldHVybiBvIT1vfHwwPT09bz8wOmEobyl9fSwzMTIxKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg2NTQ4MiksdT1NYXRoLm1pbjtzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7dmFyIG89YShzKTtyZXR1cm4gbz4wP3Uobyw5MDA3MTk5MjU0NzQwOTkxKTowfX0sMzkyOTgocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDc0MjM5KSx1PU9iamVjdDtzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7cmV0dXJuIHUoYShzKSl9fSw0NjAyOChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMTM5MzApLHU9aSg0NjI4NSksXz1pKDI1NTk0KSx3PWkoMjkzNjcpLHg9aSg2MDU4MSksQz1pKDc2MjY0KSxqPVR5cGVFcnJvcixMPUMoInRvUHJpbWl0aXZlIik7cy5leHBvcnRzPWZ1bmN0aW9uKHMsbyl7aWYoIXUocyl8fF8ocykpcmV0dXJuIHM7dmFyIGksQz13KHMsTCk7aWYoQyl7aWYodm9pZCAwPT09byYmKG89ImRlZmF1bHQiKSxpPWEoQyxzLG8pLCF1KGkpfHxfKGkpKXJldHVybiBpO3Rocm93IG5ldyBqKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX1yZXR1cm4gdm9pZCAwPT09byYmKG89Im51bWJlciIpLHgocyxvKX19LDcwNDcwKHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSg0NjAyOCksdT1pKDI1NTk0KTtzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7dmFyIG89YShzLCJzdHJpbmciKTtyZXR1cm4gdShvKT9vOm8rIiJ9fSw1MjYyMyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPXt9O2FbaSg3NjI2NCkoInRvU3RyaW5nVGFnIildPSJ6IixzLmV4cG9ydHM9IltvYmplY3Qgel0iPT09U3RyaW5nKGEpfSw5MDE2MChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNzM5NDgpLHU9U3RyaW5nO3MuZXhwb3J0cz1mdW5jdGlvbihzKXtpZigiU3ltYm9sIj09PWEocykpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmciKTtyZXR1cm4gdShzKX19LDQ2NDAocyl7InVzZSBzdHJpY3QiO3ZhciBvPVN0cmluZztzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7dHJ5e3JldHVybiBvKHMpfWNhdGNoKHMpe3JldHVybiJPYmplY3QifX19LDY0OTkocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDE5MDcpLHU9MCxfPU1hdGgucmFuZG9tKCksdz1hKDEuLnRvU3RyaW5nKTtzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7cmV0dXJuIlN5bWJvbCgiKyh2b2lkIDA9PT1zPyIiOnMpKyIpXyIrdygrK3UrXywzNil9fSw1MTE3NShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMTk4NDYpO3MuZXhwb3J0cz1hJiYhU3ltYm9sLnNoYW0mJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yfSw1ODY2MShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMzk0NDcpLHU9aSg5ODgyOCk7cy5leHBvcnRzPWEmJnUoKGZ1bmN0aW9uKCl7cmV0dXJuIDQyIT09T2JqZWN0LmRlZmluZVByb3BlcnR5KChmdW5jdGlvbigpe30pLCJwcm90b3R5cGUiLHt2YWx1ZTo0Mix3cml0YWJsZTohMX0pLnByb3RvdHlwZX0pKX0sNDA1NTEocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQ1OTUxKSx1PWkoNjIyNTApLF89YS5XZWFrTWFwO3MuZXhwb3J0cz11KF8pJiYvbmF0aXZlIGNvZGUvLnRlc3QoU3RyaW5nKF8pKX0sNzYyNjQocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDQ1OTUxKSx1PWkoODU4MTYpLF89aSg0OTcyNCksdz1pKDY0OTkpLHg9aSgxOTg0NiksQz1pKDUxMTc1KSxqPWEuU3ltYm9sLEw9dSgid2tzIiksQj1DP2ouZm9yfHxqOmomJmoud2l0aG91dFNldHRlcnx8dztzLmV4cG9ydHM9ZnVuY3Rpb24ocyl7cmV0dXJuIF8oTCxzKXx8KExbc109eCYmXyhqLHMpP2pbc106QigiU3ltYm9sLiIrcykpLExbc119fSwxOTM1OChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoODU1ODIpLHU9aSg0OTcyNCksXz1pKDYxNjI2KSx3PWkoODgyODApLHg9aSg3OTE5MiksQz1pKDE5NTk1KSxqPWkoNTQ4MjkpLEw9aSgzNDA4NCksQj1pKDMyMDk2KSwkPWkoMzkyNTkpLFU9aSg4NTg4NCksVj1pKDM5NDQ3KSx6PWkoNzM3Nik7cy5leHBvcnRzPWZ1bmN0aW9uKHMsbyxpLFkpe3ZhciBaPSJzdGFja1RyYWNlTGltaXQiLGVlPVk/MjoxLGllPXMuc3BsaXQoIi4iKSxhZT1pZVtpZS5sZW5ndGgtMV0sY2U9YS5hcHBseShudWxsLGllKTtpZihjZSl7dmFyIGxlPWNlLnByb3RvdHlwZTtpZigheiYmdShsZSwiY2F1c2UiKSYmZGVsZXRlIGxlLmNhdXNlLCFpKXJldHVybiBjZTt2YXIgcGU9YSgiRXJyb3IiKSxkZT1vKChmdW5jdGlvbihzLG8pe3ZhciBpPUIoWT9vOnMsdm9pZCAwKSxhPVk/bmV3IGNlKHMpOm5ldyBjZTtyZXR1cm4gdm9pZCAwIT09aSYmXyhhLCJtZXNzYWdlIixpKSxVKGEsZGUsYS5zdGFjaywyKSx0aGlzJiZ3KGxlLHRoaXMpJiZMKGEsdGhpcyxkZSksYXJndW1lbnRzLmxlbmd0aD5lZSYmJChhLGFyZ3VtZW50c1tlZV0pLGF9KSk7aWYoZGUucHJvdG90eXBlPWxlLCJFcnJvciIhPT1hZT94P3goZGUscGUpOkMoZGUscGUse25hbWU6ITB9KTpWJiZaIGluIGNlJiYoaihkZSxjZSxaKSxqKGRlLGNlLCJwcmVwYXJlU3RhY2tUcmFjZSIpKSxDKGRlLGNlKSwheil0cnl7bGUubmFtZSE9PWFlJiZfKGxlLCJuYW1lIixhZSksbGUuY29uc3RydWN0b3I9ZGV9Y2F0Y2gocyl7fXJldHVybiBkZX19fSwzNjM3MShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMTEwOTEpLHU9aSg4NTU4MiksXz1pKDc2MDI0KSx3PWkoOTg4MjgpLHg9aSgxOTM1OCksQz0iQWdncmVnYXRlRXJyb3IiLGo9dShDKSxMPSF3KChmdW5jdGlvbigpe3JldHVybiAxIT09aihbMV0pLmVycm9yc1swXX0pKSYmdygoZnVuY3Rpb24oKXtyZXR1cm4gNyE9PWooWzFdLEMse2NhdXNlOjd9KS5jYXVzZX0pKTthKHtnbG9iYWw6ITAsY29uc3RydWN0b3I6ITAsYXJpdHk6Mixmb3JjZWQ6TH0se0FnZ3JlZ2F0ZUVycm9yOngoQywoZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uIEFnZ3JlZ2F0ZUVycm9yKG8saSl7cmV0dXJuIF8ocyx0aGlzLGFyZ3VtZW50cyl9fSksTCwhMCl9KX0sODIwNDgocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDExMDkxKSx1PWkoODgyODApLF89aSgxNTk3Miksdz1pKDc5MTkyKSx4PWkoMTk1OTUpLEM9aSg1ODA3NSksaj1pKDYxNjI2KSxMPWkoNzU4MTcpLEI9aSgzOTI1OSksJD1pKDg1ODg0KSxVPWkoMjQ4MjMpLFY9aSgzMjA5Niksej1pKDc2MjY0KSgidG9TdHJpbmdUYWciKSxZPUVycm9yLFo9W10ucHVzaCxlZT1mdW5jdGlvbiBBZ2dyZWdhdGVFcnJvcihzLG8pe3ZhciBpLGE9dShpZSx0aGlzKTt3P2k9dyhuZXcgWSxhP18odGhpcyk6aWUpOihpPWE/dGhpczpDKGllKSxqKGkseiwiRXJyb3IiKSksdm9pZCAwIT09byYmaihpLCJtZXNzYWdlIixWKG8pKSwkKGksZWUsaS5zdGFjaywxKSxhcmd1bWVudHMubGVuZ3RoPjImJkIoaSxhcmd1bWVudHNbMl0pO3ZhciB4PVtdO3JldHVybiBVKHMsWix7dGhhdDp4fSksaihpLCJlcnJvcnMiLHgpLGl9O3c/dyhlZSxZKTp4KGVlLFkse25hbWU6ITB9KTt2YXIgaWU9ZWUucHJvdG90eXBlPUMoWS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOkwoMSxlZSksbWVzc2FnZTpMKDEsIiIpLG5hbWU6TCgxLCJBZ2dyZWdhdGVFcnJvciIpfSk7YSh7Z2xvYmFsOiEwLGNvbnN0cnVjdG9yOiEwLGFyaXR5OjJ9LHtBZ2dyZWdhdGVFcnJvcjplZX0pfSw2NDUwMihzLG8saSl7InVzZSBzdHJpY3QiO2koODIwNDgpfSw5OTM2MyhzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoNDk5MyksdT1pKDQyMTU2KSxfPWkoOTM3NDIpLHc9aSg2NDkzMikseD1pKDc0Mjg0KS5mLEM9aSg2MDE4Myksaj1pKDU5NTUwKSxMPWkoNzM3NiksQj1pKDM5NDQ3KSwkPSJBcnJheSBJdGVyYXRvciIsVT13LnNldCxWPXcuZ2V0dGVyRm9yKCQpO3MuZXhwb3J0cz1DKEFycmF5LCJBcnJheSIsKGZ1bmN0aW9uKHMsbyl7VSh0aGlzLHt0eXBlOiQsdGFyZ2V0OmEocyksaW5kZXg6MCxraW5kOm99KX0pLChmdW5jdGlvbigpe3ZhciBzPVYodGhpcyksbz1zLnRhcmdldCxpPXMuaW5kZXgrKztpZighb3x8aT49by5sZW5ndGgpcmV0dXJuIHMudGFyZ2V0PW51bGwsaih2b2lkIDAsITApO3N3aXRjaChzLmtpbmQpe2Nhc2Uia2V5cyI6cmV0dXJuIGooaSwhMSk7Y2FzZSJ2YWx1ZXMiOnJldHVybiBqKG9baV0sITEpfXJldHVybiBqKFtpLG9baV1dLCExKX0pLCJ2YWx1ZXMiKTt2YXIgej1fLkFyZ3VtZW50cz1fLkFycmF5O2lmKHUoImtleXMiKSx1KCJ2YWx1ZXMiKSx1KCJlbnRyaWVzIiksIUwmJkImJiJ2YWx1ZXMiIT09ei5uYW1lKXRyeXt4KHosIm5hbWUiLHt2YWx1ZToidmFsdWVzIn0pfWNhdGNoKHMpe319LDk2NjA1KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgxMTA5MSksdT1pKDQ1OTUxKSxfPWkoNzYwMjQpLHc9aSgxOTM1OCkseD0iV2ViQXNzZW1ibHkiLEM9dVt4XSxqPTchPT1uZXcgRXJyb3IoImUiLHtjYXVzZTo3fSkuY2F1c2UsZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXI9ZnVuY3Rpb24ocyxvKXt2YXIgaT17fTtpW3NdPXcocyxvLGopLGEoe2dsb2JhbDohMCxjb25zdHJ1Y3RvcjohMCxhcml0eToxLGZvcmNlZDpqfSxpKX0sZXhwb3J0V2ViQXNzZW1ibHlFcnJvckNhdXNlV3JhcHBlcj1mdW5jdGlvbihzLG8pe2lmKEMmJkNbc10pe3ZhciBpPXt9O2lbc109dyh4KyIuIitzLG8saiksYSh7dGFyZ2V0Ongsc3RhdDohMCxjb25zdHJ1Y3RvcjohMCxhcml0eToxLGZvcmNlZDpqfSxpKX19O2V4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCJFcnJvciIsKGZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbiBFcnJvcihvKXtyZXR1cm4gXyhzLHRoaXMsYXJndW1lbnRzKX19KSksZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoIkV2YWxFcnJvciIsKGZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbiBFdmFsRXJyb3Iobyl7cmV0dXJuIF8ocyx0aGlzLGFyZ3VtZW50cyl9fSkpLGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCJSYW5nZUVycm9yIiwoZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uIFJhbmdlRXJyb3Iobyl7cmV0dXJuIF8ocyx0aGlzLGFyZ3VtZW50cyl9fSkpLGV4cG9ydEdsb2JhbEVycm9yQ2F1c2VXcmFwcGVyKCJSZWZlcmVuY2VFcnJvciIsKGZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbiBSZWZlcmVuY2VFcnJvcihvKXtyZXR1cm4gXyhzLHRoaXMsYXJndW1lbnRzKX19KSksZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoIlN5bnRheEVycm9yIiwoZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uIFN5bnRheEVycm9yKG8pe3JldHVybiBfKHMsdGhpcyxhcmd1bWVudHMpfX0pKSxleHBvcnRHbG9iYWxFcnJvckNhdXNlV3JhcHBlcigiVHlwZUVycm9yIiwoZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uIFR5cGVFcnJvcihvKXtyZXR1cm4gXyhzLHRoaXMsYXJndW1lbnRzKX19KSksZXhwb3J0R2xvYmFsRXJyb3JDYXVzZVdyYXBwZXIoIlVSSUVycm9yIiwoZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uIFVSSUVycm9yKG8pe3JldHVybiBfKHMsdGhpcyxhcmd1bWVudHMpfX0pKSxleHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKCJDb21waWxlRXJyb3IiLChmdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24gQ29tcGlsZUVycm9yKG8pe3JldHVybiBfKHMsdGhpcyxhcmd1bWVudHMpfX0pKSxleHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKCJMaW5rRXJyb3IiLChmdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24gTGlua0Vycm9yKG8pe3JldHVybiBfKHMsdGhpcyxhcmd1bWVudHMpfX0pKSxleHBvcnRXZWJBc3NlbWJseUVycm9yQ2F1c2VXcmFwcGVyKCJSdW50aW1lRXJyb3IiLChmdW5jdGlvbihzKXtyZXR1cm4gZnVuY3Rpb24gUnVudGltZUVycm9yKG8pe3JldHVybiBfKHMsdGhpcyxhcmd1bWVudHMpfX0pKX0sNzkzMDcocyxvLGkpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1pKDExMDkxKSx1PWkoNDQ2NzMpO2Eoe3RhcmdldDoiRnVuY3Rpb24iLHByb3RvOiEwLGZvcmNlZDpGdW5jdGlvbi5iaW5kIT09dX0se2JpbmQ6dX0pfSw3MTM0MChzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMTEwOTEpLHU9aSgyOTUzOCk7YSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsYXJpdHk6Mixmb3JjZWQ6T2JqZWN0LmFzc2lnbiE9PXV9LHthc3NpZ246dX0pfSw3MDU3KHMsbyxpKXsidXNlIHN0cmljdCI7dmFyIGE9aSgxMTQ3MCkuY2hhckF0LHU9aSg5MDE2MCksXz1pKDY0OTMyKSx3PWkoNjAxODMpLHg9aSg1OTU1MCksQz0iU3RyaW5nIEl0ZXJhdG9yIixqPV8uc2V0LEw9Xy5nZXR0ZXJGb3IoQyk7dyhTdHJpbmcsIlN0cmluZyIsKGZ1bmN0aW9uKHMpe2oodGhpcyx7dHlwZTpDLHN0cmluZzp1KHMpLGluZGV4OjB9KX0pLChmdW5jdGlvbiBuZXh0KCl7dmFyIHMsbz1MKHRoaXMpLGk9by5zdHJpbmcsdT1vLmluZGV4O3JldHVybiB1Pj1pLmxlbmd0aD94KHZvaWQgMCwhMCk6KHM9YShpLHUpLG8uaW5kZXgrPXMubGVuZ3RoLHgocywhMSkpfSkpfSw5MTU5OShzLG8saSl7InVzZSBzdHJpY3QiO2koNjQ1MDIpfSwxMjU2MChzLG8saSl7InVzZSBzdHJpY3QiO2koOTkzNjMpO3ZhciBhPWkoMTkyODcpLHU9aSg0NTk1MSksXz1pKDE0ODQwKSx3PWkoOTM3NDIpO2Zvcih2YXIgeCBpbiBhKV8odVt4XSx4KSx3W3hdPXcuQXJyYXl9LDY5NChzLG8saSl7InVzZSBzdHJpY3QiO2koOTE1OTkpO3ZhciBhPWkoMzcyNTcpO2koMTI1NjApLHMuZXhwb3J0cz1hfSwxOTcwOShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoMjMwMzQpO3MuZXhwb3J0cz1hfSw0MDk3NShzLG8saSl7InVzZSBzdHJpY3QiO3ZhciBhPWkoOTc0OCk7cy5leHBvcnRzPWF9fSxvPXt9O2Z1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18oaSl7dmFyIGE9b1tpXTtpZih2b2lkIDAhPT1hKXJldHVybiBhLmV4cG9ydHM7dmFyIHU9b1tpXT17aWQ6aSxsb2FkZWQ6ITEsZXhwb3J0czp7fX07cmV0dXJuIHNbaV0uY2FsbCh1LmV4cG9ydHMsdSx1LmV4cG9ydHMsX193ZWJwYWNrX3JlcXVpcmVfXyksdS5sb2FkZWQ9ITAsdS5leHBvcnRzfV9fd2VicGFja19yZXF1aXJlX18ubj1zPT57dmFyIG89cyYmcy5fX2VzTW9kdWxlPygpPT5zLmRlZmF1bHQ6KCk9PnM7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uZChvLHthOm99KSxvfSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQ9KHMsbyk9Pntmb3IodmFyIGkgaW4gbylfX3dlYnBhY2tfcmVxdWlyZV9fLm8obyxpKSYmIV9fd2VicGFja19yZXF1aXJlX18ubyhzLGkpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkocyxpLHtlbnVtZXJhYmxlOiEwLGdldDpvW2ldfSl9LF9fd2VicGFja19yZXF1aXJlX18uZz1mdW5jdGlvbigpe2lmKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcylyZXR1cm4gZ2xvYmFsVGhpczt0cnl7cmV0dXJuIHRoaXN8fG5ldyBGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfWNhdGNoKHMpe2lmKCJvYmplY3QiPT10eXBlb2Ygd2luZG93KXJldHVybiB3aW5kb3d9fSgpLF9fd2VicGFja19yZXF1aXJlX18ubz0ocyxvKT0+T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsbyksX193ZWJwYWNrX3JlcXVpcmVfXy5yPXM9PnsidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkocyxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSxfX3dlYnBhY2tfcmVxdWlyZV9fLm5tZD1zPT4ocy5wYXRocz1bXSxzLmNoaWxkcmVufHwocy5jaGlsZHJlbj1bXSkscyk7dmFyIGk9e307cmV0dXJuKCgpPT57InVzZSBzdHJpY3QiO19fd2VicGFja19yZXF1aXJlX18uZChpLHtkZWZhdWx0OigpPT5hTn0pO3ZhciBzPXt9O19fd2VicGFja19yZXF1aXJlX18ucihzKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQocyx7Q0xFQVI6KCk9PmF0LENMRUFSX0JZOigpPT5jdCxORVdfQVVUSF9FUlI6KCk9Pml0LE5FV19TUEVDX0VSUjooKT0+c3QsTkVXX1NQRUNfRVJSX0JBVENIOigpPT5vdCxORVdfVEhST1dOX0VSUjooKT0+cnQsTkVXX1RIUk9XTl9FUlJfQkFUQ0g6KCk9Pm50LGNsZWFyOigpPT5jbGVhcixjbGVhckJ5OigpPT5jbGVhckJ5LG5ld0F1dGhFcnI6KCk9Pm5ld0F1dGhFcnIsbmV3U3BlY0VycjooKT0+bmV3U3BlY0VycixuZXdTcGVjRXJyQmF0Y2g6KCk9Pm5ld1NwZWNFcnJCYXRjaCxuZXdUaHJvd25FcnI6KCk9Pm5ld1Rocm93bkVycixuZXdUaHJvd25FcnJCYXRjaDooKT0+bmV3VGhyb3duRXJyQmF0Y2h9KTt2YXIgbz17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIobyksX193ZWJwYWNrX3JlcXVpcmVfXy5kKG8se0FVVEhPUklaRTooKT0+UnQsQVVUSE9SSVpFX09BVVRIMjooKT0+THQsQ09ORklHVVJFX0FVVEg6KCk9PkZ0LExPR09VVDooKT0+RHQsUkVTVE9SRV9BVVRIT1JJWkFUSU9OOigpPT5CdCxTSE9XX0FVVEhfUE9QVVA6KCk9Pk10LGF1dGhQb3B1cDooKT0+YXV0aFBvcHVwLGF1dGhvcml6ZTooKT0+YXV0aG9yaXplLGF1dGhvcml6ZUFjY2Vzc0NvZGVXaXRoQmFzaWNBdXRoZW50aWNhdGlvbjooKT0+YXV0aG9yaXplQWNjZXNzQ29kZVdpdGhCYXNpY0F1dGhlbnRpY2F0aW9uLGF1dGhvcml6ZUFjY2Vzc0NvZGVXaXRoRm9ybVBhcmFtczooKT0+YXV0aG9yaXplQWNjZXNzQ29kZVdpdGhGb3JtUGFyYW1zLGF1dGhvcml6ZUFwcGxpY2F0aW9uOigpPT5hdXRob3JpemVBcHBsaWNhdGlvbixhdXRob3JpemVPYXV0aDI6KCk9PmF1dGhvcml6ZU9hdXRoMixhdXRob3JpemVPYXV0aDJXaXRoUGVyc2lzdE9wdGlvbjooKT0+YXV0aG9yaXplT2F1dGgyV2l0aFBlcnNpc3RPcHRpb24sYXV0aG9yaXplUGFzc3dvcmQ6KCk9PmF1dGhvcml6ZVBhc3N3b3JkLGF1dGhvcml6ZVJlcXVlc3Q6KCk9PmF1dGhvcml6ZVJlcXVlc3QsYXV0aG9yaXplV2l0aFBlcnNpc3RPcHRpb246KCk9PmF1dGhvcml6ZVdpdGhQZXJzaXN0T3B0aW9uLGNvbmZpZ3VyZUF1dGg6KCk9PmNvbmZpZ3VyZUF1dGgsbG9nb3V0OigpPT5sb2dvdXQsbG9nb3V0V2l0aFBlcnNpc3RPcHRpb246KCk9PmxvZ291dFdpdGhQZXJzaXN0T3B0aW9uLHBlcnNpc3RBdXRob3JpemF0aW9uSWZOZWVkZWQ6KCk9PnBlcnNpc3RBdXRob3JpemF0aW9uSWZOZWVkZWQscHJlQXV0aG9yaXplSW1wbGljaXQ6KCk9PnByZUF1dGhvcml6ZUltcGxpY2l0LHJlc3RvcmVBdXRob3JpemF0aW9uOigpPT5yZXN0b3JlQXV0aG9yaXphdGlvbixzaG93RGVmaW5pdGlvbnM6KCk9PnNob3dEZWZpbml0aW9uc30pO3ZhciBhPXt9O19fd2VicGFja19yZXF1aXJlX18ucihhKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoYSx7YXV0aG9yaXplZDooKT0+SnQsZGVmaW5pdGlvbnNGb3JSZXF1aXJlbWVudHM6KCk9PmRlZmluaXRpb25zRm9yUmVxdWlyZW1lbnRzLGRlZmluaXRpb25zVG9BdXRob3JpemU6KCk9Pld0LGdldENvbmZpZ3M6KCk9Pkh0LGdldERlZmluaXRpb25zQnlOYW1lczooKT0+Z2V0RGVmaW5pdGlvbnNCeU5hbWVzLGlzQXV0aG9yaXplZDooKT0+aXNBdXRob3JpemVkLHNlbGVjdEF1dGhQYXRoOigpPT5zZWxlY3RBdXRoUGF0aCxzaG93bkRlZmluaXRpb25zOigpPT56dH0pO3ZhciB1PXt9O19fd2VicGFja19yZXF1aXJlX18ucih1KSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQodSx7VE9HR0xFX0NPTkZJR1M6KCk9PmduLFVQREFURV9DT05GSUdTOigpPT5tbixkb3dubG9hZENvbmZpZzooKT0+ZG93bmxvYWRDb25maWcsZ2V0Q29uZmlnQnlVcmw6KCk9PmdldENvbmZpZ0J5VXJsLGxvYWRlZDooKT0+YWN0aW9uc19sb2FkZWQsdG9nZ2xlOigpPT50b2dnbGUsdXBkYXRlOigpPT51cGRhdGV9KTt2YXIgXz17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoXyksX193ZWJwYWNrX3JlcXVpcmVfXy5kKF8se2dldDooKT0+Z2V0fSk7dmFyIHc9e307X193ZWJwYWNrX3JlcXVpcmVfXy5yKHcpLF9fd2VicGFja19yZXF1aXJlX18uZCh3LHt0cmFuc2Zvcm06KCk9PnRyYW5zZm9ybX0pO3ZhciB4PXt9O19fd2VicGFja19yZXF1aXJlX18ucih4KSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoeCx7dHJhbnNmb3JtOigpPT5wYXJhbWV0ZXJfb25lb2ZfdHJhbnNmb3JtfSk7dmFyIEM9e307X193ZWJwYWNrX3JlcXVpcmVfXy5yKEMpLF9fd2VicGFja19yZXF1aXJlX18uZChDLHthbGxFcnJvcnM6KCk9PkluLGxhc3RFcnJvcjooKT0+VG59KTt2YXIgaj17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoaiksX193ZWJwYWNrX3JlcXVpcmVfXy5kKGose1NIT1c6KCk9PkZuLFVQREFURV9GSUxURVI6KCk9PkRuLFVQREFURV9MQVlPVVQ6KCk9PlJuLFVQREFURV9NT0RFOigpPT5MbixjaGFuZ2VNb2RlOigpPT5jaGFuZ2VNb2RlLHNob3c6KCk9PmFjdGlvbnNfc2hvdyx1cGRhdGVGaWx0ZXI6KCk9PnVwZGF0ZUZpbHRlcix1cGRhdGVMYXlvdXQ6KCk9PnVwZGF0ZUxheW91dH0pO3ZhciBMPXt9O19fd2VicGFja19yZXF1aXJlX18ucihMKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoTCx7Y3VycmVudDooKT0+Y3VycmVudCxjdXJyZW50RmlsdGVyOigpPT5jdXJyZW50RmlsdGVyLGlzU2hvd246KCk9PmlzU2hvd24sc2hvd1N1bW1hcnk6KCk9PiRuLHdoYXRNb2RlOigpPT53aGF0TW9kZX0pO3ZhciBCPXt9O19fd2VicGFja19yZXF1aXJlX18ucihCKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoQix7dGFnZ2VkT3BlcmF0aW9uczooKT0+dGFnZ2VkT3BlcmF0aW9uc30pO3ZhciAkPXt9O19fd2VicGFja19yZXF1aXJlX18ucigkKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoJCx7Z2V0QWN0aXZlTGFuZ3VhZ2U6KCk9PlZuLGdldERlZmF1bHRFeHBhbmRlZDooKT0+em4sZ2V0R2VuZXJhdG9yczooKT0+VW4sZ2V0U25pcHBldEdlbmVyYXRvcnM6KCk9PmdldFNuaXBwZXRHZW5lcmF0b3JzfSk7dmFyIFU9e307X193ZWJwYWNrX3JlcXVpcmVfXy5yKFUpLF9fd2VicGFja19yZXF1aXJlX18uZChVLHtKc29uU2NoZW1hQXJyYXlJdGVtRmlsZTooKT0+SnNvblNjaGVtYUFycmF5SXRlbUZpbGUsSnNvblNjaGVtYUFycmF5SXRlbVRleHQ6KCk9Pkpzb25TY2hlbWFBcnJheUl0ZW1UZXh0LEpzb25TY2hlbWFGb3JtOigpPT5Kc29uU2NoZW1hRm9ybSxKc29uU2NoZW1hX2FycmF5OigpPT5Kc29uU2NoZW1hX2FycmF5LEpzb25TY2hlbWFfYm9vbGVhbjooKT0+SnNvblNjaGVtYV9ib29sZWFuLEpzb25TY2hlbWFfb2JqZWN0OigpPT5Kc29uU2NoZW1hX29iamVjdCxKc29uU2NoZW1hX3N0cmluZzooKT0+SnNvblNjaGVtYV9zdHJpbmd9KTt2YXIgVj17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoViksX193ZWJwYWNrX3JlcXVpcmVfXy5kKFYse2FsbG93VHJ5SXRPdXRGb3I6KCk9PmFsbG93VHJ5SXRPdXRGb3IsYmFzZVBhdGg6KCk9PkhzLGNhbkV4ZWN1dGVTY2hlbWU6KCk9PmNhbkV4ZWN1dGVTY2hlbWUsY29uc3VtZXM6KCk9PlVzLGNvbnN1bWVzT3B0aW9uc0ZvcjooKT0+Y29uc3VtZXNPcHRpb25zRm9yLGNvbnRlbnRUeXBlVmFsdWVzOigpPT5jb250ZW50VHlwZVZhbHVlcyxjdXJyZW50UHJvZHVjZXNGb3I6KCk9PmN1cnJlbnRQcm9kdWNlc0ZvcixkZWZpbml0aW9uczooKT0+SnMsZXh0ZXJuYWxEb2NzOigpPT5EcyxmaW5kRGVmaW5pdGlvbjooKT0+ZmluZERlZmluaXRpb24sZ2V0T0FTM1JlcXVpcmVkUmVxdWVzdEJvZHlDb250ZW50VHlwZTooKT0+Z2V0T0FTM1JlcXVpcmVkUmVxdWVzdEJvZHlDb250ZW50VHlwZSxnZXRQYXJhbWV0ZXI6KCk9PmdldFBhcmFtZXRlcixoYXNIb3N0OigpPT5ybyxob3N0OigpPT5LcyxpbmZvOigpPT5Scyxpc01lZGlhVHlwZVNjaGVtYVByb3BlcnRpZXNFcXVhbDooKT0+aXNNZWRpYVR5cGVTY2hlbWFQcm9wZXJ0aWVzRXF1YWwsaXNPQVMzOigpPT5NcyxsYXN0RXJyb3I6KCk9Pk9zLG11dGF0ZWRSZXF1ZXN0Rm9yOigpPT5tdXRhdGVkUmVxdWVzdEZvcixtdXRhdGVkUmVxdWVzdHM6KCk9PnRvLG9wZXJhdGlvblNjaGVtZTooKT0+b3BlcmF0aW9uU2NoZW1lLG9wZXJhdGlvbldpdGhNZXRhOigpPT5vcGVyYXRpb25XaXRoTWV0YSxvcGVyYXRpb25zOigpPT5xcyxvcGVyYXRpb25zV2l0aFJvb3RJbmhlcml0ZWQ6KCk9PllzLG9wZXJhdGlvbnNXaXRoVGFnczooKT0+UXMscGFyYW1ldGVySW5jbHVzaW9uU2V0dGluZ0ZvcjooKT0+cGFyYW1ldGVySW5jbHVzaW9uU2V0dGluZ0ZvcixwYXJhbWV0ZXJWYWx1ZXM6KCk9PnBhcmFtZXRlclZhbHVlcyxwYXJhbWV0ZXJXaXRoTWV0YTooKT0+cGFyYW1ldGVyV2l0aE1ldGEscGFyYW1ldGVyV2l0aE1ldGFCeUlkZW50aXR5OigpPT5wYXJhbWV0ZXJXaXRoTWV0YUJ5SWRlbnRpdHkscGFyYW1ldGVyc0luY2x1ZGVJbjooKT0+cGFyYW1ldGVyc0luY2x1ZGVJbixwYXJhbWV0ZXJzSW5jbHVkZVR5cGU6KCk9PnBhcmFtZXRlcnNJbmNsdWRlVHlwZSxwYXRoczooKT0+QnMscHJvZHVjZXM6KCk9PlZzLHByb2R1Y2VzT3B0aW9uc0ZvcjooKT0+cHJvZHVjZXNPcHRpb25zRm9yLHJlcXVlc3RGb3I6KCk9PnJlcXVlc3RGb3IscmVxdWVzdHM6KCk9PmVvLHJlc3BvbnNlRm9yOigpPT5yZXNwb25zZUZvcixyZXNwb25zZXM6KCk9PlpzLHNjaGVtZXM6KCk9PkdzLHNlY3VyaXR5OigpPT56cyxzZWN1cml0eURlZmluaXRpb25zOigpPT5XcyxzZW12ZXI6KCk9PkZzLHNwZWM6KCk9PnNwZWMsc3BlY0pTOigpPT5JcyxzcGVjSnNvbjooKT0+UHMsc3BlY0pzb25XaXRoUmVzb2x2ZWRTdWJ0cmVlczooKT0+TnMsc3BlY1Jlc29sdmVkOigpPT5UcyxzcGVjUmVzb2x2ZWRTdWJ0cmVlOigpPT5zcGVjUmVzb2x2ZWRTdWJ0cmVlLHNwZWNTb3VyY2U6KCk9PmpzLHNwZWNTdHI6KCk9PkNzLHRhZ0RldGFpbHM6KCk9PnRhZ0RldGFpbHMsdGFnZ2VkT3BlcmF0aW9uczooKT0+c2VsZWN0b3JzX3RhZ2dlZE9wZXJhdGlvbnMsdGFnczooKT0+WHMsdXJsOigpPT5Bcyx2YWxpZE9wZXJhdGlvbk1ldGhvZHM6KCk9PiRzLHZhbGlkYXRlQmVmb3JlRXhlY3V0ZTooKT0+dmFsaWRhdGVCZWZvcmVFeGVjdXRlLHZhbGlkYXRpb25FcnJvcnM6KCk9PnZhbGlkYXRpb25FcnJvcnMsdmVyc2lvbjooKT0+THN9KTt2YXIgej17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoeiksX193ZWJwYWNrX3JlcXVpcmVfXy5kKHose0NMRUFSX1JFUVVFU1Q6KCk9PndvLENMRUFSX1JFU1BPTlNFOigpPT5FbyxDTEVBUl9WQUxJREFURV9QQVJBTVM6KCk9PnhvLExPR19SRVFVRVNUOigpPT5fbyxTRVRfTVVUQVRFRF9SRVFVRVNUOigpPT5TbyxTRVRfUkVRVUVTVDooKT0+Ym8sU0VUX1JFU1BPTlNFOigpPT52byxTRVRfU0NIRU1FOigpPT5DbyxVUERBVEVfRU1QVFlfUEFSQU1fSU5DTFVTSU9OOigpPT5nbyxVUERBVEVfSlNPTjooKT0+Zm8sVVBEQVRFX09QRVJBVElPTl9NRVRBX1ZBTFVFOigpPT5rbyxVUERBVEVfUEFSQU06KCk9Pm1vLFVQREFURV9SRVNPTFZFRDooKT0+T28sVVBEQVRFX1JFU09MVkVEX1NVQlRSRUU6KCk9PkFvLFVQREFURV9TUEVDOigpPT5wbyxVUERBVEVfVVJMOigpPT5obyxWQUxJREFURV9QQVJBTVM6KCk9PnlvLGNoYW5nZUNvbnN1bWVzVmFsdWU6KCk9PmNoYW5nZUNvbnN1bWVzVmFsdWUsY2hhbmdlUGFyYW06KCk9PmNoYW5nZVBhcmFtLGNoYW5nZVBhcmFtQnlJZGVudGl0eTooKT0+Y2hhbmdlUGFyYW1CeUlkZW50aXR5LGNoYW5nZVByb2R1Y2VzVmFsdWU6KCk9PmNoYW5nZVByb2R1Y2VzVmFsdWUsY2xlYXJSZXF1ZXN0OigpPT5jbGVhclJlcXVlc3QsY2xlYXJSZXNwb25zZTooKT0+Y2xlYXJSZXNwb25zZSxjbGVhclZhbGlkYXRlUGFyYW1zOigpPT5jbGVhclZhbGlkYXRlUGFyYW1zLGV4ZWN1dGU6KCk9PmFjdGlvbnNfZXhlY3V0ZSxleGVjdXRlUmVxdWVzdDooKT0+ZXhlY3V0ZVJlcXVlc3QsaW52YWxpZGF0ZVJlc29sdmVkU3VidHJlZUNhY2hlOigpPT5pbnZhbGlkYXRlUmVzb2x2ZWRTdWJ0cmVlQ2FjaGUsbG9nUmVxdWVzdDooKT0+bG9nUmVxdWVzdCxwYXJzZVRvSnNvbjooKT0+cGFyc2VUb0pzb24scmVxdWVzdFJlc29sdmVkU3VidHJlZTooKT0+cmVxdWVzdFJlc29sdmVkU3VidHJlZSxyZXNvbHZlU3BlYzooKT0+cmVzb2x2ZVNwZWMsc2V0TXV0YXRlZFJlcXVlc3Q6KCk9PnNldE11dGF0ZWRSZXF1ZXN0LHNldFJlcXVlc3Q6KCk9PnNldFJlcXVlc3Qsc2V0UmVzcG9uc2U6KCk9PnNldFJlc3BvbnNlLHNldFNjaGVtZTooKT0+c2V0U2NoZW1lLHVwZGF0ZUVtcHR5UGFyYW1JbmNsdXNpb246KCk9PnVwZGF0ZUVtcHR5UGFyYW1JbmNsdXNpb24sdXBkYXRlSnNvblNwZWM6KCk9PnVwZGF0ZUpzb25TcGVjLHVwZGF0ZVJlc29sdmVkOigpPT51cGRhdGVSZXNvbHZlZCx1cGRhdGVSZXNvbHZlZFN1YnRyZWU6KCk9PnVwZGF0ZVJlc29sdmVkU3VidHJlZSx1cGRhdGVTcGVjOigpPT51cGRhdGVTcGVjLHVwZGF0ZVVybDooKT0+dXBkYXRlVXJsLHZhbGlkYXRlUGFyYW1zOigpPT52YWxpZGF0ZVBhcmFtc30pO3ZhciBZPXt9O19fd2VicGFja19yZXF1aXJlX18ucihZKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoWSx7ZXhlY3V0ZVJlcXVlc3Q6KCk9PndyYXBfYWN0aW9uc19leGVjdXRlUmVxdWVzdCx1cGRhdGVKc29uU3BlYzooKT0+d3JhcF9hY3Rpb25zX3VwZGF0ZUpzb25TcGVjLHVwZGF0ZVNwZWM6KCk9PndyYXBfYWN0aW9uc191cGRhdGVTcGVjLHZhbGlkYXRlUGFyYW1zOigpPT53cmFwX2FjdGlvbnNfdmFsaWRhdGVQYXJhbXN9KTt2YXIgWj17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoWiksX193ZWJwYWNrX3JlcXVpcmVfXy5kKFose0pzb25QYXRjaEVycm9yOigpPT5EbyxfYXJlRXF1YWxzOigpPT5fYXJlRXF1YWxzLGFwcGx5T3BlcmF0aW9uOigpPT5hcHBseU9wZXJhdGlvbixhcHBseVBhdGNoOigpPT5hcHBseVBhdGNoLGFwcGx5UmVkdWNlcjooKT0+YXBwbHlSZWR1Y2VyLGRlZXBDbG9uZTooKT0+TG8sZ2V0VmFsdWVCeVBvaW50ZXI6KCk9PmdldFZhbHVlQnlQb2ludGVyLHZhbGlkYXRlOigpPT52YWxpZGF0ZSx2YWxpZGF0b3I6KCk9PnZhbGlkYXRvcn0pO3ZhciBlZT17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoZWUpLF9fd2VicGFja19yZXF1aXJlX18uZChlZSx7Y29tcGFyZTooKT0+Y29tcGFyZSxnZW5lcmF0ZTooKT0+Z2VuZXJhdGUsb2JzZXJ2ZTooKT0+b2JzZXJ2ZSx1bm9ic2VydmU6KCk9PnVub2JzZXJ2ZX0pO3ZhciBpZT17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoaWUpLF9fd2VicGFja19yZXF1aXJlX18uZChpZSx7aGFzRWxlbWVudFNvdXJjZU1hcDooKT0+aGFzRWxlbWVudFNvdXJjZU1hcCxpbmNsdWRlc0NsYXNzZXM6KCk9PmluY2x1ZGVzQ2xhc3NlcyxpbmNsdWRlc1N5bWJvbHM6KCk9PmluY2x1ZGVzU3ltYm9scyxpc0Fubm90YXRpb25FbGVtZW50OigpPT5SdSxpc0FycmF5RWxlbWVudDooKT0+SXUsaXNCb29sZWFuRWxlbWVudDooKT0+anUsaXNDb21tZW50RWxlbWVudDooKT0+RHUsaXNFbGVtZW50OigpPT5rdSxpc0xpbmtFbGVtZW50OigpPT5OdSxpc01lbWJlckVsZW1lbnQ6KCk9PlR1LGlzTnVsbEVsZW1lbnQ6KCk9PkN1LGlzTnVtYmVyRWxlbWVudDooKT0+QXUsaXNPYmplY3RFbGVtZW50OigpPT5QdSxpc1BhcnNlUmVzdWx0RWxlbWVudDooKT0+THUsaXNQcmltaXRpdmVFbGVtZW50OigpPT5pc1ByaW1pdGl2ZUVsZW1lbnQsaXNSZWZFbGVtZW50OigpPT5NdSxpc1N0cmluZ0VsZW1lbnQ6KCk9Pk91fSk7dmFyIGFlPXt9O19fd2VicGFja19yZXF1aXJlX18ucihhZSksX193ZWJwYWNrX3JlcXVpcmVfXy5kKGFlLHtpc0pTT05SZWZlcmVuY2VFbGVtZW50OigpPT5NZCxpc0pTT05TY2hlbWFFbGVtZW50OigpPT5OZCxpc0xpbmtEZXNjcmlwdGlvbkVsZW1lbnQ6KCk9PkRkLGlzTWVkaWFFbGVtZW50OigpPT5SZH0pO3ZhciBjZT17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoY2UpLF9fd2VicGFja19yZXF1aXJlX18uZChjZSx7aXNCb29sZWFuSnNvblNjaGVtYUVsZW1lbnQ6KCk9PmlzQm9vbGVhbkpzb25TY2hlbWFFbGVtZW50LGlzQ2FsbGJhY2tFbGVtZW50OigpPT5qbSxpc0NvbXBvbmVudHNFbGVtZW50OigpPT5QbSxpc0NvbnRhY3RFbGVtZW50OigpPT5JbSxpc0Rpc2NyaW1pbmF0b3JFbGVtZW50OigpPT5yZyxpc0V4YW1wbGVFbGVtZW50OigpPT5UbSxpc0V4dGVybmFsRG9jdW1lbnRhdGlvbkVsZW1lbnQ6KCk9Pk5tLGlzSGVhZGVyRWxlbWVudDooKT0+TW0saXNJbmZvRWxlbWVudDooKT0+Um0saXNMaWNlbnNlRWxlbWVudDooKT0+RG0saXNMaW5rRWxlbWVudDooKT0+TG0saXNNZWRpYVR5cGVFbGVtZW50OigpPT5abSxpc09wZW5BcGkzXzBFbGVtZW50OigpPT5CbSxpc09wZW5hcGlFbGVtZW50OigpPT5GbSxpc09wZXJhdGlvbkVsZW1lbnQ6KCk9PiRtLGlzUGFyYW1ldGVyRWxlbWVudDooKT0+cW0saXNQYXRoSXRlbUVsZW1lbnQ6KCk9PlVtLGlzUGF0aHNFbGVtZW50OigpPT5WbSxpc1JlZmVyZW5jZUVsZW1lbnQ6KCk9PnptLGlzUmVxdWVzdEJvZHlFbGVtZW50OigpPT5XbSxpc1Jlc3BvbnNlRWxlbWVudDooKT0+Sm0saXNSZXNwb25zZXNFbGVtZW50OigpPT5IbSxpc1NjaGVtYUVsZW1lbnQ6KCk9PkttLGlzU2VjdXJpdHlSZXF1aXJlbWVudEVsZW1lbnQ6KCk9PkdtLGlzU2VjdXJpdHlTY2hlbWVFbGVtZW50OigpPT5ZbSxpc1NlcnZlckVsZW1lbnQ6KCk9PlhtLGlzU2VydmVyVmFyaWFibGVFbGVtZW50OigpPT5RbSxpc1NlcnZlcnNFbGVtZW50OigpPT5lZ30pO3ZhciBsZT17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIobGUpLF9fd2VicGFja19yZXF1aXJlX18uZChsZSx7aXNKU09OUmVmZXJlbmNlRWxlbWVudDooKT0+TWQsaXNKU09OU2NoZW1hRWxlbWVudDooKT0+ZFMsaXNMaW5rRGVzY3JpcHRpb25FbGVtZW50OigpPT5mUyxpc01lZGlhRWxlbWVudDooKT0+UmR9KTt2YXIgcGU9e307X193ZWJwYWNrX3JlcXVpcmVfXy5yKHBlKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQocGUse2lzSlNPTlJlZmVyZW5jZUVsZW1lbnQ6KCk9Pk1kLGlzSlNPTlNjaGVtYUVsZW1lbnQ6KCk9PndTLGlzTGlua0Rlc2NyaXB0aW9uRWxlbWVudDooKT0+eFN9KTt2YXIgZGU9e307X193ZWJwYWNrX3JlcXVpcmVfXy5yKGRlKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZGUse2lzSlNPTlNjaGVtYUVsZW1lbnQ6KCk9PnpTLGlzTGlua0Rlc2NyaXB0aW9uRWxlbWVudDooKT0+V1N9KTt2YXIgZmU9e307X193ZWJwYWNrX3JlcXVpcmVfXy5yKGZlKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZmUse2lzSlNPTlNjaGVtYUVsZW1lbnQ6KCk9PnRfLGlzTGlua0Rlc2NyaXB0aW9uRWxlbWVudDooKT0+cl99KTt2YXIgeWU9e307X193ZWJwYWNrX3JlcXVpcmVfXy5yKHllKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoeWUse2lzQm9vbGVhbkpzb25TY2hlbWFFbGVtZW50OigpPT5wcmVkaWNhdGVzX2lzQm9vbGVhbkpzb25TY2hlbWFFbGVtZW50LGlzQ2FsbGJhY2tFbGVtZW50OigpPT5xXyxpc0NvbXBvbmVudHNFbGVtZW50OigpPT5VXyxpc0NvbnRhY3RFbGVtZW50OigpPT5WXyxpc0V4YW1wbGVFbGVtZW50OigpPT56Xyxpc0V4dGVybmFsRG9jdW1lbnRhdGlvbkVsZW1lbnQ6KCk9PldfLGlzSGVhZGVyRWxlbWVudDooKT0+Sl8saXNJbmZvRWxlbWVudDooKT0+SF8saXNKc29uU2NoZW1hRGlhbGVjdEVsZW1lbnQ6KCk9PktfLGlzTGljZW5zZUVsZW1lbnQ6KCk9PkdfLGlzTGlua0VsZW1lbnQ6KCk9PllfLGlzTWVkaWFUeXBlRWxlbWVudDooKT0+aEUsaXNPcGVuQXBpM18xRWxlbWVudDooKT0+UV8saXNPcGVuYXBpRWxlbWVudDooKT0+WF8saXNPcGVyYXRpb25FbGVtZW50OigpPT5aXyxpc1BhcmFtZXRlckVsZW1lbnQ6KCk9PmVFLGlzUGF0aEl0ZW1FbGVtZW50OigpPT50RSxpc1BhdGhJdGVtRWxlbWVudEV4dGVybmFsOigpPT5pc1BhdGhJdGVtRWxlbWVudEV4dGVybmFsLGlzUGF0aHNFbGVtZW50OigpPT5yRSxpc1JlZmVyZW5jZUVsZW1lbnQ6KCk9Pm5FLGlzUmVmZXJlbmNlRWxlbWVudEV4dGVybmFsOigpPT5pc1JlZmVyZW5jZUVsZW1lbnRFeHRlcm5hbCxpc1JlcXVlc3RCb2R5RWxlbWVudDooKT0+c0UsaXNSZXNwb25zZUVsZW1lbnQ6KCk9Pm9FLGlzUmVzcG9uc2VzRWxlbWVudDooKT0+aUUsaXNTY2hlbWFFbGVtZW50OigpPT5hRSxpc1NlY3VyaXR5UmVxdWlyZW1lbnRFbGVtZW50OigpPT5jRSxpc1NlY3VyaXR5U2NoZW1lRWxlbWVudDooKT0+bEUsaXNTZXJ2ZXJFbGVtZW50OigpPT51RSxpc1NlcnZlclZhcmlhYmxlRWxlbWVudDooKT0+cEV9KTt2YXIgYmU9e307X193ZWJwYWNrX3JlcXVpcmVfXy5yKGJlKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoYmUse2Nvb2tpZTooKT0+Y29va2llLGhlYWRlcjooKT0+cGFyYW1ldGVyX2J1aWxkZXJzX2hlYWRlcixwYXRoOigpPT5wYXJhbWV0ZXJfYnVpbGRlcnNfcGF0aCxxdWVyeTooKT0+cXVlcnl9KTt2YXIgU2U9e307X193ZWJwYWNrX3JlcXVpcmVfXy5yKFNlKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoU2Use0J1dHRvbjooKT0+QnV0dG9uLENvbDooKT0+Q29sLENvbGxhcHNlOigpPT5Db2xsYXBzZSxDb250YWluZXI6KCk9PkNvbnRhaW5lcixJbnB1dDooKT0+SW5wdXQsTGluazooKT0+bGF5b3V0X3V0aWxzX0xpbmssUm93OigpPT5Sb3csU2VsZWN0OigpPT5TZWxlY3QsVGV4dEFyZWE6KCk9PlRleHRBcmVhfSk7dmFyIF9lPXt9O19fd2VicGFja19yZXF1aXJlX18ucihfZSksX193ZWJwYWNrX3JlcXVpcmVfXy5kKF9lLHtiYXNlUGF0aDooKT0+UFAsY29uc3VtZXM6KCk9PklQLGRlZmluaXRpb25zOigpPT5PUCxmaW5kRGVmaW5pdGlvbjooKT0+a1AsaGFzSG9zdDooKT0+QVAsaG9zdDooKT0+alAscHJvZHVjZXM6KCk9PlRQLHNjaGVtZXM6KCk9Pk5QLHNlY3VyaXR5RGVmaW5pdGlvbnM6KCk9PkNQLHZhbGlkT3BlcmF0aW9uTWV0aG9kczooKT0+d3JhcF9zZWxlY3RvcnNfdmFsaWRPcGVyYXRpb25NZXRob2RzfSk7dmFyIHdlPXt9O19fd2VicGFja19yZXF1aXJlX18ucih3ZSksX193ZWJwYWNrX3JlcXVpcmVfXy5kKHdlLHtkZWZpbml0aW9uc1RvQXV0aG9yaXplOigpPT5NUH0pO3ZhciB4ZT17fTtfX3dlYnBhY2tfcmVxdWlyZV9fLnIoeGUpLF9fd2VicGFja19yZXF1aXJlX18uZCh4ZSx7Y2FsbGJhY2tzT3BlcmF0aW9uczooKT0+TFAsZmluZFNjaGVtYTooKT0+ZmluZFNjaGVtYSxpc09BUzM6KCk9PnNlbGVjdG9yc19pc09BUzMsaXNPQVMzMDooKT0+c2VsZWN0b3JzX2lzT0FTMzAsaXNTd2FnZ2VyMjooKT0+c2VsZWN0b3JzX2lzU3dhZ2dlcjIsc2VydmVyczooKT0+RFB9KTt2YXIgUGU9e307X193ZWJwYWNrX3JlcXVpcmVfXy5yKFBlKSxfX3dlYnBhY2tfcmVxdWlyZV9fLmQoUGUse0NMRUFSX1JFUVVFU1RfQk9EWV9WQUxJREFURV9FUlJPUjooKT0+bkksQ0xFQVJfUkVRVUVTVF9CT0RZX1ZBTFVFOigpPT5zSSxTRVRfUkVRVUVTVF9CT0RZX1ZBTElEQVRFX0VSUk9SOigpPT5ySSxVUERBVEVfQUNUSVZFX0VYQU1QTEVTX01FTUJFUjooKT0+UVAsVVBEQVRFX1JFUVVFU1RfQk9EWV9JTkNMVVNJT046KCk9PlhQLFVQREFURV9SRVFVRVNUX0JPRFlfVkFMVUU6KCk9PkdQLFVQREFURV9SRVFVRVNUX0JPRFlfVkFMVUVfUkVUQUlOX0ZMQUc6KCk9PllQLFVQREFURV9SRVFVRVNUX0NPTlRFTlRfVFlQRTooKT0+WlAsVVBEQVRFX1JFU1BPTlNFX0NPTlRFTlRfVFlQRTooKT0+ZUksVVBEQVRFX1NFTEVDVEVEX1NFUlZFUjooKT0+S1AsVVBEQVRFX1NFUlZFUl9WQVJJQUJMRV9WQUxVRTooKT0+dEksY2xlYXJSZXF1ZXN0Qm9keVZhbGlkYXRlRXJyb3I6KCk9PmNsZWFyUmVxdWVzdEJvZHlWYWxpZGF0ZUVycm9yLGNsZWFyUmVxdWVzdEJvZHlWYWx1ZTooKT0+Y2xlYXJSZXF1ZXN0Qm9keVZhbHVlLGluaXRSZXF1ZXN0Qm9keVZhbGlkYXRlRXJyb3I6KCk9PmluaXRSZXF1ZXN0Qm9keVZhbGlkYXRlRXJyb3Isc2V0QWN0aXZlRXhhbXBsZXNNZW1iZXI6KCk9PnNldEFjdGl2ZUV4YW1wbGVzTWVtYmVyLHNldFJlcXVlc3RCb2R5SW5jbHVzaW9uOigpPT5zZXRSZXF1ZXN0Qm9keUluY2x1c2lvbixzZXRSZXF1ZXN0Qm9keVZhbGlkYXRlRXJyb3I6KCk9PnNldFJlcXVlc3RCb2R5VmFsaWRhdGVFcnJvcixzZXRSZXF1ZXN0Qm9keVZhbHVlOigpPT5zZXRSZXF1ZXN0Qm9keVZhbHVlLHNldFJlcXVlc3RDb250ZW50VHlwZTooKT0+c2V0UmVxdWVzdENvbnRlbnRUeXBlLHNldFJlc3BvbnNlQ29udGVudFR5cGU6KCk9PnNldFJlc3BvbnNlQ29udGVudFR5cGUsc2V0UmV0YWluUmVxdWVzdEJvZHlWYWx1ZUZsYWc6KCk9PnNldFJldGFpblJlcXVlc3RCb2R5VmFsdWVGbGFnLHNldFNlbGVjdGVkU2VydmVyOigpPT5zZXRTZWxlY3RlZFNlcnZlcixzZXRTZXJ2ZXJWYXJpYWJsZVZhbHVlOigpPT5zZXRTZXJ2ZXJWYXJpYWJsZVZhbHVlfSk7dmFyIFRlPXt9O19fd2VicGFja19yZXF1aXJlX18ucihUZSksX193ZWJwYWNrX3JlcXVpcmVfXy5kKFRlLHthY3RpdmVFeGFtcGxlc01lbWJlcjooKT0+ZEksaGFzVXNlckVkaXRlZEJvZHk6KCk9PnVJLHJlcXVlc3RCb2R5RXJyb3JzOigpPT5oSSxyZXF1ZXN0Qm9keUluY2x1c2lvblNldHRpbmc6KCk9PnBJLHJlcXVlc3RCb2R5VmFsdWU6KCk9PmNJLHJlcXVlc3RDb250ZW50VHlwZTooKT0+ZkkscmVzcG9uc2VDb250ZW50VHlwZTooKT0+bUksc2VsZWN0RGVmYXVsdFJlcXVlc3RCb2R5VmFsdWU6KCk9PnNlbGVjdERlZmF1bHRSZXF1ZXN0Qm9keVZhbHVlLHNlbGVjdGVkU2VydmVyOigpPT5hSSxzZXJ2ZXJFZmZlY3RpdmVWYWx1ZTooKT0+dkksc2VydmVyVmFyaWFibGVWYWx1ZTooKT0+Z0ksc2VydmVyVmFyaWFibGVzOigpPT55SSxzaG91bGRSZXRhaW5SZXF1ZXN0Qm9keVZhbHVlOigpPT5sSSx2YWxpZE9wZXJhdGlvbk1ldGhvZHM6KCk9PlNJLHZhbGlkYXRlQmVmb3JlRXhlY3V0ZTooKT0+YkksdmFsaWRhdGVTaGFsbG93UmVxdWlyZWQ6KCk9PnZhbGlkYXRlU2hhbGxvd1JlcXVpcmVkfSk7dmFyIFJlPV9fd2VicGFja19yZXF1aXJlX18oOTY1NDApO2Z1bmN0aW9uIGZvcm1hdFByb2RFcnJvck1lc3NhZ2Uocyl7cmV0dXJuYE1pbmlmaWVkIFJlZHV4IGVycm9yICMke3N9OyB2aXNpdCBodHRwczovL3JlZHV4LmpzLm9yZy9FcnJvcnM/Y29kZT0ke3N9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMuIGB9dmFyICRlPSgoKT0+ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLm9ic2VydmFibGV8fCJAQG9ic2VydmFibGUiKSgpLHJhbmRvbVN0cmluZz0oKT0+TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCIiKS5qb2luKCIuIikscWU9e0lOSVQ6YEBAcmVkdXgvSU5JVCR7cmFuZG9tU3RyaW5nKCl9YCxSRVBMQUNFOmBAQHJlZHV4L1JFUExBQ0Uke3JhbmRvbVN0cmluZygpfWAsUFJPQkVfVU5LTk9XTl9BQ1RJT046KCk9PmBAQHJlZHV4L1BST0JFX1VOS05PV05fQUNUSU9OJHtyYW5kb21TdHJpbmcoKX1gfTtmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHMpe2lmKCJvYmplY3QiIT10eXBlb2Ygc3x8bnVsbD09PXMpcmV0dXJuITE7bGV0IG89cztmb3IoO251bGwhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7KW89T2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yocyk9PT1vfHxudWxsPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHMpfWZ1bmN0aW9uIGNyZWF0ZVN0b3JlKHMsbyxpKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcyl0aHJvdyBuZXcgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgyKSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBpfHwiZnVuY3Rpb24iPT10eXBlb2YgaSYmImZ1bmN0aW9uIj09dHlwZW9mIGFyZ3VtZW50c1szXSl0aHJvdyBuZXcgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgwKSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8mJnZvaWQgMD09PWkmJihpPW8sbz12b2lkIDApLHZvaWQgMCE9PWkpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBpKXRocm93IG5ldyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDEpKTtyZXR1cm4gaShjcmVhdGVTdG9yZSkocyxvKX1sZXQgYT1zLHU9byxfPW5ldyBNYXAsdz1fLHg9MCxDPSExO2Z1bmN0aW9uIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKXt3PT09XyYmKHc9bmV3IE1hcCxfLmZvckVhY2goKChzLG8pPT57dy5zZXQobyxzKX0pKSl9ZnVuY3Rpb24gZ2V0U3RhdGUoKXtpZihDKXRocm93IG5ldyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDMpKTtyZXR1cm4gdX1mdW5jdGlvbiBzdWJzY3JpYmUocyl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHMpdGhyb3cgbmV3IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNCkpO2lmKEMpdGhyb3cgbmV3IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNSkpO2xldCBvPSEwO2Vuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtjb25zdCBpPXgrKztyZXR1cm4gdy5zZXQoaSxzKSxmdW5jdGlvbiB1bnN1YnNjcmliZSgpe2lmKG8pe2lmKEMpdGhyb3cgbmV3IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoNikpO289ITEsZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpLHcuZGVsZXRlKGkpLF89bnVsbH19fWZ1bmN0aW9uIGRpc3BhdGNoKHMpe2lmKCFpc1BsYWluT2JqZWN0KHMpKXRocm93IG5ldyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDcpKTtpZih2b2lkIDA9PT1zLnR5cGUpdGhyb3cgbmV3IEVycm9yKGZvcm1hdFByb2RFcnJvck1lc3NhZ2UoOCkpO2lmKCJzdHJpbmciIT10eXBlb2Ygcy50eXBlKXRocm93IG5ldyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE3KSk7aWYoQyl0aHJvdyBuZXcgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSg5KSk7dHJ5e0M9ITAsdT1hKHUscyl9ZmluYWxseXtDPSExfXJldHVybihfPXcpLmZvckVhY2goKHM9PntzKCl9KSksc31kaXNwYXRjaCh7dHlwZTpxZS5JTklUfSk7cmV0dXJue2Rpc3BhdGNoLHN1YnNjcmliZSxnZXRTdGF0ZSxyZXBsYWNlUmVkdWNlcjpmdW5jdGlvbiByZXBsYWNlUmVkdWNlcihzKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcyl0aHJvdyBuZXcgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMCkpO2E9cyxkaXNwYXRjaCh7dHlwZTpxZS5SRVBMQUNFfSl9LFskZV06ZnVuY3Rpb24gb2JzZXJ2YWJsZSgpe2NvbnN0IHM9c3Vic2NyaWJlO3JldHVybntzdWJzY3JpYmUobyl7aWYoIm9iamVjdCIhPXR5cGVvZiBvfHxudWxsPT09byl0aHJvdyBuZXcgRXJyb3IoZm9ybWF0UHJvZEVycm9yTWVzc2FnZSgxMSkpO2Z1bmN0aW9uIG9ic2VydmVTdGF0ZSgpe2NvbnN0IHM9bztzLm5leHQmJnMubmV4dChnZXRTdGF0ZSgpKX1vYnNlcnZlU3RhdGUoKTtyZXR1cm57dW5zdWJzY3JpYmU6cyhvYnNlcnZlU3RhdGUpfX0sWyRlXSgpe3JldHVybiB0aGlzfX19fX1mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcihzLG8pe3JldHVybiBmdW5jdGlvbiguLi5pKXtyZXR1cm4gbyhzLmFwcGx5KHRoaXMsaSkpfX1mdW5jdGlvbiBjb21wb3NlKC4uLnMpe3JldHVybiAwPT09cy5sZW5ndGg/cz0+czoxPT09cy5sZW5ndGg/c1swXTpzLnJlZHVjZSgoKHMsbyk9PiguLi5pKT0+cyhvKC4uLmkpKSkpfXZhciB6ZT1fX3dlYnBhY2tfcmVxdWlyZV9fKDk0MDQpLFdlPV9fd2VicGFja19yZXF1aXJlX18ubih6ZSksSGU9X193ZWJwYWNrX3JlcXVpcmVfXyg4MTkxOSksWWU9X193ZWJwYWNrX3JlcXVpcmVfXy5uKEhlKSxYZT1fX3dlYnBhY2tfcmVxdWlyZV9fKDg5NTkzKSxRZT1fX3dlYnBhY2tfcmVxdWlyZV9fKDIwMzM0KSxldD1fX3dlYnBhY2tfcmVxdWlyZV9fKDU1MzY0KSx0dD1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oZXQpO2NvbnN0IHJ0PSJlcnJfbmV3X3Rocm93bl9lcnIiLG50PSJlcnJfbmV3X3Rocm93bl9lcnJfYmF0Y2giLHN0PSJlcnJfbmV3X3NwZWNfZXJyIixvdD0iZXJyX25ld19zcGVjX2Vycl9iYXRjaCIsaXQ9ImVycl9uZXdfYXV0aF9lcnIiLGF0PSJlcnJfY2xlYXIiLGN0PSJlcnJfY2xlYXJfYnkiO2Z1bmN0aW9uIG5ld1Rocm93bkVycihzKXtyZXR1cm57dHlwZTpydCxwYXlsb2FkOigwLFFlLnNlcmlhbGl6ZUVycm9yKShzKX19ZnVuY3Rpb24gbmV3VGhyb3duRXJyQmF0Y2gocyl7cmV0dXJue3R5cGU6bnQscGF5bG9hZDpzfX1mdW5jdGlvbiBuZXdTcGVjRXJyKHMpe3JldHVybnt0eXBlOnN0LHBheWxvYWQ6c319ZnVuY3Rpb24gbmV3U3BlY0VyckJhdGNoKHMpe3JldHVybnt0eXBlOm90LHBheWxvYWQ6c319ZnVuY3Rpb24gbmV3QXV0aEVycihzKXtyZXR1cm57dHlwZTppdCxwYXlsb2FkOnN9fWZ1bmN0aW9uIGNsZWFyKHM9e30pe3JldHVybnt0eXBlOmF0LHBheWxvYWQ6c319ZnVuY3Rpb24gY2xlYXJCeShzPSgpPT4hMCl7cmV0dXJue3R5cGU6Y3QscGF5bG9hZDpzfX1jb25zdCBsdD1mdW5jdGlvbiBtYWtlV2luZG93KCl7dmFyIHM9e2xvY2F0aW9uOnt9LGhpc3Rvcnk6e30sb3BlbjooKT0+e30sY2xvc2U6KCk9Pnt9LEZpbGU6ZnVuY3Rpb24oKXt9LEZvcm1EYXRhOmZ1bmN0aW9uKCl7fX07aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cpcmV0dXJuIHM7dHJ5e3M9d2luZG93O2Zvcih2YXIgbyBvZlsiRmlsZSIsIkJsb2IiLCJGb3JtRGF0YSJdKW8gaW4gd2luZG93JiYoc1tvXT13aW5kb3dbb10pfWNhdGNoKHMpe2NvbnNvbGUuZXJyb3Iocyl9cmV0dXJuIHN9KCk7X193ZWJwYWNrX3JlcXVpcmVfXyg4NDA1OCksX193ZWJwYWNrX3JlcXVpcmVfXyg1NTgwOCk7dmFyIHV0PV9fd2VicGFja19yZXF1aXJlX18oNTAxMDQpLHB0PV9fd2VicGFja19yZXF1aXJlX18ubih1dCksaHQ9X193ZWJwYWNrX3JlcXVpcmVfXyg3MzA5KSxkdD1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oaHQpLG10PV9fd2VicGFja19yZXF1aXJlX18oNDI0MjYpLGd0PV9fd2VicGFja19yZXF1aXJlX18ubihtdCkseXQ9X193ZWJwYWNrX3JlcXVpcmVfXyg3NTI4OCksdnQ9X193ZWJwYWNrX3JlcXVpcmVfXy5uKHl0KSxidD1fX3dlYnBhY2tfcmVxdWlyZV9fKDE4ODIpLFN0PV9fd2VicGFja19yZXF1aXJlX18ubihidCksX3Q9X193ZWJwYWNrX3JlcXVpcmVfXygyMjA1KSxFdD1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oX3QpLHd0PV9fd2VicGFja19yZXF1aXJlX18oNTMyMDkpLHh0PV9fd2VicGFja19yZXF1aXJlX18ubih3dCksa3Q9X193ZWJwYWNrX3JlcXVpcmVfXyg2MjgwMiksT3Q9X193ZWJwYWNrX3JlcXVpcmVfXy5uKGt0KTtjb25zdCBBdD1XZSgpLlNldC5vZigidHlwZSIsImZvcm1hdCIsIml0ZW1zIiwiZGVmYXVsdCIsIm1heGltdW0iLCJleGNsdXNpdmVNYXhpbXVtIiwibWluaW11bSIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhMZW5ndGgiLCJtaW5MZW5ndGgiLCJwYXR0ZXJuIiwibWF4SXRlbXMiLCJtaW5JdGVtcyIsInVuaXF1ZUl0ZW1zIiwiZW51bSIsIm11bHRpcGxlT2YiKTtmdW5jdGlvbiBnZXRQYXJhbWV0ZXJTY2hlbWEocyx7aXNPQVMzOm99PXt9KXtpZighV2UoKS5NYXAuaXNNYXAocykpcmV0dXJue3NjaGVtYTpXZSgpLk1hcCgpLHBhcmFtZXRlckNvbnRlbnRNZWRpYVR5cGU6bnVsbH07aWYoIW8pcmV0dXJuImJvZHkiPT09cy5nZXQoImluIik/e3NjaGVtYTpzLmdldCgic2NoZW1hIixXZSgpLk1hcCgpKSxwYXJhbWV0ZXJDb250ZW50TWVkaWFUeXBlOm51bGx9OntzY2hlbWE6cy5maWx0ZXIoKChzLG8pPT5BdC5pbmNsdWRlcyhvKSkpLHBhcmFtZXRlckNvbnRlbnRNZWRpYVR5cGU6bnVsbH07aWYocy5nZXQoImNvbnRlbnQiKSl7Y29uc3Qgbz1zLmdldCgiY29udGVudCIsV2UoKS5NYXAoe30pKS5rZXlTZXEoKS5maXJzdCgpO3JldHVybntzY2hlbWE6cy5nZXRJbihbImNvbnRlbnQiLG8sInNjaGVtYSJdLFdlKCkuTWFwKCkpLHBhcmFtZXRlckNvbnRlbnRNZWRpYVR5cGU6b319cmV0dXJue3NjaGVtYTpzLmdldCgic2NoZW1hIik/cy5nZXQoInNjaGVtYSIsV2UoKS5NYXAoKSk6V2UoKS5NYXAoKSxwYXJhbWV0ZXJDb250ZW50TWVkaWFUeXBlOm51bGx9fXZhciBDdD1fX3dlYnBhY2tfcmVxdWlyZV9fKDQ4Mjg3KS5CdWZmZXI7Y29uc3QganQ9ImRlZmF1bHQiLGlzSW1tdXRhYmxlPXM9PldlKCkuSXRlcmFibGUuaXNJdGVyYWJsZShzKSxpbW11dGFibGVUb0pTPXM9PmlzSW1tdXRhYmxlKHMpP3MudG9KUygpOnM7ZnVuY3Rpb24gb2JqZWN0aWZ5KHMpe3JldHVybiBpc09iamVjdChzKT9pbW11dGFibGVUb0pTKHMpOnt9fWZ1bmN0aW9uIGZyb21KU09yZGVyZWQocyl7aWYoaXNJbW11dGFibGUocykpcmV0dXJuIHM7aWYocyBpbnN0YW5jZW9mIGx0LkZpbGUpcmV0dXJuIHM7aWYoIWlzT2JqZWN0KHMpKXJldHVybiBzO2lmKEFycmF5LmlzQXJyYXkocykpcmV0dXJuIFdlKCkuU2VxKHMpLm1hcChmcm9tSlNPcmRlcmVkKS50b0xpc3QoKTtpZihTdCgpKHMuZW50cmllcykpe2NvbnN0IG89ZnVuY3Rpb24gY3JlYXRlT2JqV2l0aEhhc2hlZEtleXMocyl7aWYoIVN0KCkocy5lbnRyaWVzKSlyZXR1cm4gcztjb25zdCBvPXt9LGk9Il8qKltdIixhPXt9O2ZvcihsZXQgdSBvZiBzLmVudHJpZXMoKSlpZihvW3VbMF1dfHxhW3VbMF1dJiZhW3VbMF1dLmNvbnRhaW5zTXVsdGlwbGUpe2lmKCFhW3VbMF1dKXthW3VbMF1dPXtjb250YWluc011bHRpcGxlOiEwLGxlbmd0aDoxfSxvW2Ake3VbMF19JHtpfSR7YVt1WzBdXS5sZW5ndGh9YF09b1t1WzBdXSxkZWxldGUgb1t1WzBdXX1hW3VbMF1dLmxlbmd0aCs9MSxvW2Ake3VbMF19JHtpfSR7YVt1WzBdXS5sZW5ndGh9YF09dVsxXX1lbHNlIG9bdVswXV09dVsxXTtyZXR1cm4gb30ocyk7cmV0dXJuIFdlKCkuT3JkZXJlZE1hcChvKS5tYXAoZnJvbUpTT3JkZXJlZCl9cmV0dXJuIFdlKCkuT3JkZXJlZE1hcChzKS5tYXAoZnJvbUpTT3JkZXJlZCl9ZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocyl7cmV0dXJuIEFycmF5LmlzQXJyYXkocyk/czpbc119ZnVuY3Rpb24gaXNGbihzKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygc31mdW5jdGlvbiBpc09iamVjdChzKXtyZXR1cm4hIXMmJiJvYmplY3QiPT10eXBlb2Ygc31mdW5jdGlvbiBpc0Z1bmMocyl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHN9ZnVuY3Rpb24gaXNBcnJheShzKXtyZXR1cm4gQXJyYXkuaXNBcnJheShzKX1jb25zdCBQdD1wdCgpO2Z1bmN0aW9uIG9iak1hcChzLG8pe3JldHVybiBPYmplY3Qua2V5cyhzKS5yZWR1Y2UoKChpLGEpPT4oaVthXT1vKHNbYV0sYSksaSkpLHt9KX1mdW5jdGlvbiBvYmpSZWR1Y2UocyxvKXtyZXR1cm4gT2JqZWN0LmtleXMocykucmVkdWNlKCgoaSxhKT0+e2xldCB1PW8oc1thXSxhKTtyZXR1cm4gdSYmIm9iamVjdCI9PXR5cGVvZiB1JiZPYmplY3QuYXNzaWduKGksdSksaX0pLHt9KX1mdW5jdGlvbiBzeXN0ZW1UaHVua01pZGRsZXdhcmUocyl7cmV0dXJuKHtkaXNwYXRjaDpvLGdldFN0YXRlOml9KT0+bz0+aT0+ImZ1bmN0aW9uIj09dHlwZW9mIGk/aShzKCkpOm8oaSl9ZnVuY3Rpb24gdmFsaWRhdGVWYWx1ZUJ5U2NoZW1hKHMsbyxpLGEsdSxfKXtpZighbylyZXR1cm5bXTtsZXQgdz1bXSx4PW8uZ2V0KCJudWxsYWJsZSIpLEM9by5nZXQoInJlcXVpcmVkIiksaj1vLmdldCgibWF4aW11bSIpLEw9by5nZXQoIm1pbmltdW0iKSxCPW8uZ2V0KCJ0eXBlIiksJD1vLmdldCgiZm9ybWF0IiksVT1vLmdldCgibWF4TGVuZ3RoIiksVj1vLmdldCgibWluTGVuZ3RoIiksej1vLmdldCgidW5pcXVlSXRlbXMiKSxZPW8uZ2V0KCJtYXhJdGVtcyIpLFo9by5nZXQoIm1pbkl0ZW1zIiksZWU9by5nZXQoInBhdHRlcm4iKTtjb25zdCBpZT1pfHwhMD09PUMsYWU9bnVsbCE9cyxjZT1pZXx8YWUmJiJhcnJheSI9PT1CfHwhKCFpZSYmIWFlKSxsZT14JiZudWxsPT09cztpZihpZSYmIWFlJiYhbGUmJiFhJiYhQilyZXR1cm4gdy5wdXNoKCJSZXF1aXJlZCBmaWVsZCBpcyBub3QgcHJvdmlkZWQiKSx3O2lmKGxlfHwhQnx8IWNlKXJldHVybltdO2xldCBwZT0ic3RyaW5nIj09PUImJnMsZGU9ImFycmF5Ij09PUImJkFycmF5LmlzQXJyYXkocykmJnMubGVuZ3RoLGZlPSJhcnJheSI9PT1CJiZXZSgpLkxpc3QuaXNMaXN0KHMpJiZzLmNvdW50KCkseWU9ImFycmF5Ij09PUImJiJzdHJpbmciPT10eXBlb2YgcyYmcztjb25zdCBiZT1bcGUsZGUsZmUsImZpbGUiPT09QiYmcyBpbnN0YW5jZW9mIGx0LkZpbGUsImJvb2xlYW4iPT09QiYmKHN8fCExPT09cyksIm51bWJlciI9PT1CJiYoc3x8MD09PXMpLCJpbnRlZ2VyIj09PUImJihzfHwwPT09cyksIm9iamVjdCI9PT1CJiYib2JqZWN0Ij09dHlwZW9mIHMmJm51bGwhPT1zLCJvYmplY3QiPT09QiYmInN0cmluZyI9PXR5cGVvZiBzJiZzXSxTZT0oXz9iZTpiZS5jb25jYXQoeWUpKS5zb21lKChzPT4hIXMpKTtpZihpZSYmIVNlJiYhYSlyZXR1cm4gdy5wdXNoKCJSZXF1aXJlZCBmaWVsZCBpcyBub3QgcHJvdmlkZWQiKSx3O2lmKCJvYmplY3QiPT09QiYmKG51bGw9PT11fHwiYXBwbGljYXRpb24vanNvbiI9PT11KSl7bGV0IGk9cztpZigic3RyaW5nIj09dHlwZW9mIHMpdHJ5e2k9SlNPTi5wYXJzZShzKX1jYXRjaChzKXtyZXR1cm4gdy5wdXNoKCJQYXJhbWV0ZXIgc3RyaW5nIHZhbHVlIG11c3QgYmUgdmFsaWQgSlNPTiIpLHd9byYmby5oYXMoInJlcXVpcmVkIikmJmlzRnVuYyhDLmlzTGlzdCkmJkMuaXNMaXN0KCkmJkMuZm9yRWFjaCgocz0+e3ZvaWQgMD09PWlbc10mJncucHVzaCh7cHJvcEtleTpzLGVycm9yOiJSZXF1aXJlZCBwcm9wZXJ0eSBub3QgZm91bmQifSl9KSksbyYmby5oYXMoInByb3BlcnRpZXMiKSYmby5nZXQoInByb3BlcnRpZXMiKS5mb3JFYWNoKCgocyxvKT0+e2NvbnN0IHg9dmFsaWRhdGVWYWx1ZUJ5U2NoZW1hKGlbb10scywhMSxhLHUsXyk7dy5wdXNoKC4uLngubWFwKChzPT4oe3Byb3BLZXk6byxlcnJvcjpzfSkpKSl9KSl9aWYoZWUpe2xldCBvPSgocyxvKT0+e2lmKCFuZXcgUmVnRXhwKG8pLnRlc3QocykpcmV0dXJuIlZhbHVlIG11c3QgZm9sbG93IHBhdHRlcm4gIitvfSkocyxlZSk7byYmdy5wdXNoKG8pfWlmKFomJiJhcnJheSI9PT1CKXtsZXQgbz0oKHMsbyk9PntpZighcyYmbz49MXx8cyYmcy5sZW5ndGg8bylyZXR1cm5gQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0ICR7b30gaXRlbSR7MT09PW8/IiI6InMifWB9KShzLFopO28mJncucHVzaChvKX1pZihZJiYiYXJyYXkiPT09Qil7bGV0IG89KChzLG8pPT57aWYocyYmcy5sZW5ndGg+bylyZXR1cm5gQXJyYXkgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoZW4gJHtvfSBpdGVtJHsxPT09bz8iIjoicyJ9YH0pKHMsWSk7byYmdy5wdXNoKHtuZWVkUmVtb3ZlOiEwLGVycm9yOm99KX1pZih6JiYiYXJyYXkiPT09Qil7bGV0IG89KChzLG8pPT57aWYocyYmKCJ0cnVlIj09PW98fCEwPT09bykpe2NvbnN0IG89KDAsemUuZnJvbUpTKShzKSxpPW8udG9TZXQoKTtpZihzLmxlbmd0aD5pLnNpemUpe2xldCBzPSgwLHplLlNldCkoKTtpZihvLmZvckVhY2goKChpLGEpPT57by5maWx0ZXIoKHM9PmlzRnVuYyhzLmVxdWFscyk/cy5lcXVhbHMoaSk6cz09PWkpKS5zaXplPjEmJihzPXMuYWRkKGEpKX0pKSwwIT09cy5zaXplKXJldHVybiBzLm1hcCgocz0+KHtpbmRleDpzLGVycm9yOiJObyBkdXBsaWNhdGVzIGFsbG93ZWQuIn0pKSkudG9BcnJheSgpfX19KShzLHopO28mJncucHVzaCguLi5vKX1pZihVfHwwPT09VSl7bGV0IG89KChzLG8pPT57aWYocy5sZW5ndGg+bylyZXR1cm5gVmFsdWUgbXVzdCBiZSBubyBsb25nZXIgdGhhbiAke299IGNoYXJhY3RlciR7MSE9PW8/InMiOiIifWB9KShzLFUpO28mJncucHVzaChvKX1pZihWKXtsZXQgbz0oKHMsbyk9PntpZihzLmxlbmd0aDxvKXJldHVybmBWYWx1ZSBtdXN0IGJlIGF0IGxlYXN0ICR7b30gY2hhcmFjdGVyJHsxIT09bz8icyI6IiJ9YH0pKHMsVik7byYmdy5wdXNoKG8pfWlmKGp8fDA9PT1qKXtsZXQgbz0oKHMsbyk9PntpZihzPm8pcmV0dXJuYFZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7b31gfSkocyxqKTtvJiZ3LnB1c2gobyl9aWYoTHx8MD09PUwpe2xldCBvPSgocyxvKT0+e2lmKHM8bylyZXR1cm5gVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtvfWB9KShzLEwpO28mJncucHVzaChvKX1pZigic3RyaW5nIj09PUIpe2xldCBvO2lmKG89ImRhdGUtdGltZSI9PT0kPyhzPT57aWYoaXNOYU4oRGF0ZS5wYXJzZShzKSkpcmV0dXJuIlZhbHVlIG11c3QgYmUgYSBEYXRlVGltZSJ9KShzKToidXVpZCI9PT0kPyhzPT57aWYocz1zLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSwhL15beyhdP1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfVspfV0/JC8udGVzdChzKSlyZXR1cm4iVmFsdWUgbXVzdCBiZSBhIEd1aWQifSkocyk6KHM9PntpZihzJiYic3RyaW5nIiE9dHlwZW9mIHMpcmV0dXJuIlZhbHVlIG11c3QgYmUgYSBzdHJpbmcifSkocyksIW8pcmV0dXJuIHc7dy5wdXNoKG8pfWVsc2UgaWYoImJvb2xlYW4iPT09Qil7bGV0IG89KHM9PntpZigidHJ1ZSIhPT1zJiYiZmFsc2UiIT09cyYmITAhPT1zJiYhMSE9PXMpcmV0dXJuIlZhbHVlIG11c3QgYmUgYSBib29sZWFuIn0pKHMpO2lmKCFvKXJldHVybiB3O3cucHVzaChvKX1lbHNlIGlmKCJudW1iZXIiPT09Qil7bGV0IG89KHM9PntpZighL14tP1xkKyhcLj9cZCspPyQvLnRlc3QocykpcmV0dXJuIlZhbHVlIG11c3QgYmUgYSBudW1iZXIifSkocyk7aWYoIW8pcmV0dXJuIHc7dy5wdXNoKG8pfWVsc2UgaWYoImludGVnZXIiPT09Qil7bGV0IG89KHM9PntpZighL14tP1xkKyQvLnRlc3QocykpcmV0dXJuIlZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciJ9KShzKTtpZighbylyZXR1cm4gdzt3LnB1c2gobyl9ZWxzZSBpZigiYXJyYXkiPT09Qil7aWYoIWRlJiYhZmUpcmV0dXJuIHc7cyYmcy5mb3JFYWNoKCgocyxpKT0+e2NvbnN0IHg9dmFsaWRhdGVWYWx1ZUJ5U2NoZW1hKHMsby5nZXQoIml0ZW1zIiksITEsYSx1LF8pO3cucHVzaCguLi54Lm1hcCgocz0+KHtpbmRleDppLGVycm9yOnN9KSkpKX0pKX1lbHNlIGlmKCJmaWxlIj09PUIpe2xldCBvPShzPT57aWYocyYmIShzIGluc3RhbmNlb2YgbHQuRmlsZSkpcmV0dXJuIlZhbHVlIG11c3QgYmUgYSBmaWxlIn0pKHMpO2lmKCFvKXJldHVybiB3O3cucHVzaChvKX1yZXR1cm4gd31jb25zdCB1dGlsc19idG9hPXM9PntsZXQgbztyZXR1cm4gbz1zIGluc3RhbmNlb2YgQ3Q/czpDdC5mcm9tKHMudG9TdHJpbmcoKSwidXRmLTgiKSxvLnRvU3RyaW5nKCJiYXNlNjQiKX0sSXQ9e29wZXJhdGlvbnNTb3J0ZXI6e2FscGhhOihzLG8pPT5zLmdldCgicGF0aCIpLmxvY2FsZUNvbXBhcmUoby5nZXQoInBhdGgiKSksbWV0aG9kOihzLG8pPT5zLmdldCgibWV0aG9kIikubG9jYWxlQ29tcGFyZShvLmdldCgibWV0aG9kIikpfSx0YWdzU29ydGVyOnthbHBoYToocyxvKT0+cy5sb2NhbGVDb21wYXJlKG8pfX0sYnVpbGRGb3JtRGF0YT1zPT57bGV0IG89W107Zm9yKGxldCBpIGluIHMpe2xldCBhPXNbaV07dm9pZCAwIT09YSYmIiIhPT1hJiZvLnB1c2goW2ksIj0iLGVuY29kZVVSSUNvbXBvbmVudChhKS5yZXBsYWNlKC8lMjAvZywiKyIpXS5qb2luKCIiKSl9cmV0dXJuIG8uam9pbigiJiIpfSxzaGFsbG93RXF1YWxLZXlzPShzLG8saSk9PiEhZHQoKShpLChpPT52dCgpKHNbaV0sb1tpXSkpKTtmdW5jdGlvbiByZXF1aXJlc1ZhbGlkYXRpb25VUkwocyl7cmV0dXJuISghc3x8cy5pbmRleE9mKCJsb2NhbGhvc3QiKT49MHx8cy5pbmRleE9mKCIxMjcuMC4wLjEiKT49MHx8Im5vbmUiPT09cyl9Y29uc3QgY3JlYXRlRGVlcExpbmtQYXRoPXM9PiJzdHJpbmciPT10eXBlb2Ygc3x8cyBpbnN0YW5jZW9mIFN0cmluZz9zLnRyaW0oKS5yZXBsYWNlKC9ccy9nLCIlMjAiKToiIixlc2NhcGVEZWVwTGlua1BhdGg9cz0+RXQoKShjcmVhdGVEZWVwTGlua1BhdGgocykucmVwbGFjZSgvJTIwL2csIl8iKSksaXNFeHRlbnNpb249cz0+L154LS8udGVzdChzKSxnZXRFeHRlbnNpb25zPXM9PnplLk1hcC5pc01hcChzKT9zLmZpbHRlcigoKHMsbyk9PmlzRXh0ZW5zaW9uKG8pKSk6T2JqZWN0LmtleXMocykuZmlsdGVyKChzPT5pc0V4dGVuc2lvbihzKSkpLGdldENvbW1vbkV4dGVuc2lvbnM9cz0+cy5maWx0ZXIoKChzLG8pPT4vXnBhdHRlcm58bWF4TGVuZ3RofG1pbkxlbmd0aHxtYXhpbXVtfG1pbmltdW0vLnRlc3QobykpKTtmdW5jdGlvbiBkZWVwbHlTdHJpcEtleShzLG8saT0oKT0+ITApe2lmKCJvYmplY3QiIT10eXBlb2Ygc3x8QXJyYXkuaXNBcnJheShzKXx8bnVsbD09PXN8fCFvKXJldHVybiBzO2NvbnN0IGE9T2JqZWN0LmFzc2lnbih7fSxzKTtyZXR1cm4gT2JqZWN0LmtleXMoYSkuZm9yRWFjaCgocz0+e3M9PT1vJiZpKGFbc10scyk/ZGVsZXRlIGFbc106YVtzXT1kZWVwbHlTdHJpcEtleShhW3NdLG8saSl9KSksYX1mdW5jdGlvbiBzdHJpbmdpZnkocyl7aWYoInN0cmluZyI9PXR5cGVvZiBzKXJldHVybiBzO2lmKHMmJnMudG9KUyYmKHM9cy50b0pTKCkpLCJvYmplY3QiPT10eXBlb2YgcyYmbnVsbCE9PXMpdHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeShzLG51bGwsMil9Y2F0Y2gobyl7cmV0dXJuIFN0cmluZyhzKX1yZXR1cm4gbnVsbD09cz8iIjpzLnRvU3RyaW5nKCl9ZnVuY3Rpb24gcGFyYW1Ub0lkZW50aWZpZXIocyx7cmV0dXJuQWxsOm89ITEsYWxsb3dIYXNoZXM6aT0hMH09e30pe2lmKCFXZSgpLk1hcC5pc01hcChzKSl0aHJvdyBuZXcgRXJyb3IoInBhcmFtVG9JZGVudGlmaWVyOiByZWNlaXZlZCBhIG5vbi1JbS5NYXAgcGFyYW1ldGVyIGFzIGlucHV0Iik7Y29uc3QgYT1zLmdldCgibmFtZSIpLHU9cy5nZXQoImluIik7bGV0IF89W107cmV0dXJuIHMmJnMuaGFzaENvZGUmJnUmJmEmJmkmJl8ucHVzaChgJHt1fS4ke2F9Lmhhc2gtJHtzLmhhc2hDb2RlKCl9YCksdSYmYSYmXy5wdXNoKGAke3V9LiR7YX1gKSxfLnB1c2goYSksbz9fOl9bMF18fCIifWZ1bmN0aW9uIHBhcmFtVG9WYWx1ZShzLG8pe3JldHVybiBwYXJhbVRvSWRlbnRpZmllcihzLHtyZXR1cm5BbGw6ITB9KS5tYXAoKHM9Pm9bc10pKS5maWx0ZXIoKHM9PnZvaWQgMCE9PXMpKVswXX1mdW5jdGlvbiBiNjR0b0I2NFVybEVuY29kZWQocyl7cmV0dXJuIHMucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKS5yZXBsYWNlKC89L2csIiIpfWNvbnN0IGlzRW1wdHlWYWx1ZT1zPT4hc3x8ISghaXNJbW11dGFibGUocyl8fCFzLmlzRW1wdHkoKSksaWRGbj1zPT5zO2Z1bmN0aW9uIGNyZWF0ZVN0b3JlV2l0aE1pZGRsZXdhcmUocyxvLGkpe2xldCBhPVtzeXN0ZW1UaHVua01pZGRsZXdhcmUoaSldO3JldHVybiBjcmVhdGVTdG9yZShzLG8sKGx0Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX0NPTVBPU0VfX3x8Y29tcG9zZSkoZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKC4uLnMpe3JldHVybiBvPT4oaSxhKT0+e2NvbnN0IHU9byhpLGEpO2xldCBkaXNwYXRjaD0oKT0+e3Rocm93IG5ldyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE1KSl9O2NvbnN0IF89e2dldFN0YXRlOnUuZ2V0U3RhdGUsZGlzcGF0Y2g6KHMsLi4ubyk9PmRpc3BhdGNoKHMsLi4ubyl9LHc9cy5tYXAoKHM9PnMoXykpKTtyZXR1cm4gZGlzcGF0Y2g9Y29tcG9zZSguLi53KSh1LmRpc3BhdGNoKSx7Li4udSxkaXNwYXRjaH19fSguLi5hKSkpfWNsYXNzIFN0b3Jle2NvbnN0cnVjdG9yKHM9e30pe1llKCkodGhpcyx7c3RhdGU6e30scGx1Z2luczpbXSxzeXN0ZW06e2NvbmZpZ3M6e30sZm46e30sY29tcG9uZW50czp7fSxyb290SW5qZWN0czp7fSxzdGF0ZVBsdWdpbnM6e319LGJvdW5kU3lzdGVtOnt9LHRvb2xib3g6e319LHMpLHRoaXMuZ2V0U3lzdGVtPXRoaXMuX2dldFN5c3RlbS5iaW5kKHRoaXMpLHRoaXMuc3RvcmU9ZnVuY3Rpb24gY29uZmlndXJlU3RvcmUocyxvLGkpe3JldHVybiBjcmVhdGVTdG9yZVdpdGhNaWRkbGV3YXJlKHMsbyxpKX0oaWRGbiwoMCx6ZS5mcm9tSlMpKHRoaXMuc3RhdGUpLHRoaXMuZ2V0U3lzdGVtKSx0aGlzLmJ1aWxkU3lzdGVtKCExKSx0aGlzLnJlZ2lzdGVyKHRoaXMucGx1Z2lucyl9Z2V0U3RvcmUoKXtyZXR1cm4gdGhpcy5zdG9yZX1yZWdpc3RlcihzLG89ITApe3ZhciBpPWNvbWJpbmVQbHVnaW5zKHMsdGhpcy5nZXRTeXN0ZW0oKSk7c3lzdGVtRXh0ZW5kKHRoaXMuc3lzdGVtLGkpLG8mJnRoaXMuYnVpbGRTeXN0ZW0oKTtjYWxsQWZ0ZXJMb2FkLmNhbGwodGhpcy5zeXN0ZW0scyx0aGlzLmdldFN5c3RlbSgpKSYmdGhpcy5idWlsZFN5c3RlbSgpfWJ1aWxkU3lzdGVtKHM9ITApe2xldCBvPXRoaXMuZ2V0U3RvcmUoKS5kaXNwYXRjaCxpPXRoaXMuZ2V0U3RvcmUoKS5nZXRTdGF0ZTt0aGlzLmJvdW5kU3lzdGVtPU9iamVjdC5hc3NpZ24oe30sdGhpcy5nZXRSb290SW5qZWN0cygpLHRoaXMuZ2V0V3JhcHBlZEFuZEJvdW5kQWN0aW9ucyhvKSx0aGlzLmdldFdyYXBwZWRBbmRCb3VuZFNlbGVjdG9ycyhpLHRoaXMuZ2V0U3lzdGVtKSx0aGlzLmdldFN0YXRlVGh1bmtzKGkpLHRoaXMuZ2V0Rm4oKSx0aGlzLmdldENvbmZpZ3MoKSkscyYmdGhpcy5yZWJ1aWxkUmVkdWNlcigpfV9nZXRTeXN0ZW0oKXtyZXR1cm4gdGhpcy5ib3VuZFN5c3RlbX1nZXRSb290SW5qZWN0cygpe3JldHVybiBPYmplY3QuYXNzaWduKHtnZXRTeXN0ZW06dGhpcy5nZXRTeXN0ZW0sZ2V0U3RvcmU6dGhpcy5nZXRTdG9yZS5iaW5kKHRoaXMpLGdldENvbXBvbmVudHM6dGhpcy5nZXRDb21wb25lbnRzLmJpbmQodGhpcyksZ2V0U3RhdGU6dGhpcy5nZXRTdG9yZSgpLmdldFN0YXRlLGdldENvbmZpZ3M6dGhpcy5fZ2V0Q29uZmlncy5iaW5kKHRoaXMpLEltOldlKCksUmVhY3Q6UmV9LHRoaXMuc3lzdGVtLnJvb3RJbmplY3RzfHx7fSl9X2dldENvbmZpZ3MoKXtyZXR1cm4gdGhpcy5zeXN0ZW0uY29uZmlnc31nZXRDb25maWdzKCl7cmV0dXJue2NvbmZpZ3M6dGhpcy5zeXN0ZW0uY29uZmlnc319c2V0Q29uZmlncyhzKXt0aGlzLnN5c3RlbS5jb25maWdzPXN9cmVidWlsZFJlZHVjZXIoKXt0aGlzLnN0b3JlLnJlcGxhY2VSZWR1Y2VyKGZ1bmN0aW9uIGJ1aWxkUmVkdWNlcihzLG8pe3JldHVybiBmdW5jdGlvbiBhbGxSZWR1Y2VycyhzLG8pe2xldCBpPU9iamVjdC5rZXlzKHMpLnJlZHVjZSgoKGksYSk9PihpW2FdPWZ1bmN0aW9uIG1ha2VSZWR1Y2VyKHMsbyl7cmV0dXJuKGk9bmV3IHplLk1hcCxhKT0+e2lmKCFzKXJldHVybiBpO2xldCB1PXNbYS50eXBlXTtpZih1KXtjb25zdCBzPXdyYXBXaXRoVHJ5Q2F0Y2godSxvKShpLGEpO3JldHVybiBudWxsPT09cz9pOnN9cmV0dXJuIGl9fShzW2FdLG8pLGkpKSx7fSk7aWYoIU9iamVjdC5rZXlzKGkpLmxlbmd0aClyZXR1cm4gaWRGbjtyZXR1cm4oMCxYZS5IKShpKX0ob2JqTWFwKHMsKHM9PnMucmVkdWNlcnMpKSxvKX0odGhpcy5zeXN0ZW0uc3RhdGVQbHVnaW5zLHRoaXMuZ2V0U3lzdGVtKSl9Z2V0VHlwZShzKXtsZXQgbz1zWzBdLnRvVXBwZXJDYXNlKCkrcy5zbGljZSgxKTtyZXR1cm4gb2JqUmVkdWNlKHRoaXMuc3lzdGVtLnN0YXRlUGx1Z2lucywoKGksYSk9PntsZXQgdT1pW3NdO2lmKHUpcmV0dXJue1thK29dOnV9fSkpfWdldFNlbGVjdG9ycygpe3JldHVybiB0aGlzLmdldFR5cGUoInNlbGVjdG9ycyIpfWdldEFjdGlvbnMoKXtyZXR1cm4gb2JqTWFwKHRoaXMuZ2V0VHlwZSgiYWN0aW9ucyIpLChzPT5vYmpSZWR1Y2UocywoKHMsbyk9PntpZihpc0ZuKHMpKXJldHVybntbb106c319KSkpKX1nZXRXcmFwcGVkQW5kQm91bmRBY3Rpb25zKHMpe3JldHVybiBvYmpNYXAodGhpcy5nZXRCb3VuZEFjdGlvbnMocyksKChzLG8pPT57bGV0IGk9dGhpcy5zeXN0ZW0uc3RhdGVQbHVnaW5zW28uc2xpY2UoMCwtNyldLndyYXBBY3Rpb25zO3JldHVybiBpP29iak1hcChzLCgocyxvKT0+e2xldCBhPWlbb107cmV0dXJuIGE/KEFycmF5LmlzQXJyYXkoYSl8fChhPVthXSksYS5yZWR1Y2UoKChzLG8pPT57bGV0IG5ld0FjdGlvbj0oLi4uaSk9Pm8ocyx0aGlzLmdldFN5c3RlbSgpKSguLi5pKTtpZighaXNGbihuZXdBY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoIndyYXBBY3Rpb25zIG5lZWRzIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBmdW5jdGlvbiAoaWUgdGhlIHdyYXBwZWQgYWN0aW9uKSIpO3JldHVybiB3cmFwV2l0aFRyeUNhdGNoKG5ld0FjdGlvbix0aGlzLmdldFN5c3RlbSl9KSxzfHxGdW5jdGlvbi5wcm90b3R5cGUpKTpzfSkpOnN9KSl9Z2V0V3JhcHBlZEFuZEJvdW5kU2VsZWN0b3JzKHMsbyl7cmV0dXJuIG9iak1hcCh0aGlzLmdldEJvdW5kU2VsZWN0b3JzKHMsbyksKChvLGkpPT57bGV0IGE9W2kuc2xpY2UoMCwtOSldLHU9dGhpcy5zeXN0ZW0uc3RhdGVQbHVnaW5zW2FdLndyYXBTZWxlY3RvcnM7cmV0dXJuIHU/b2JqTWFwKG8sKChvLGkpPT57bGV0IF89dVtpXTtyZXR1cm4gXz8oQXJyYXkuaXNBcnJheShfKXx8KF89W19dKSxfLnJlZHVjZSgoKG8saSk9PntsZXQgd3JhcHBlZFNlbGVjdG9yPSguLi51KT0+aShvLHRoaXMuZ2V0U3lzdGVtKCkpKHMoKS5nZXRJbihhKSwuLi51KTtpZighaXNGbih3cmFwcGVkU2VsZWN0b3IpKXRocm93IG5ldyBUeXBlRXJyb3IoIndyYXBTZWxlY3RvciBuZWVkcyB0byByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgZnVuY3Rpb24gKGllIHRoZSB3cmFwcGVkIGFjdGlvbikiKTtyZXR1cm4gd3JhcHBlZFNlbGVjdG9yfSksb3x8RnVuY3Rpb24ucHJvdG90eXBlKSk6b30pKTpvfSkpfWdldFN0YXRlcyhzKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5zeXN0ZW0uc3RhdGVQbHVnaW5zKS5yZWR1Y2UoKChvLGkpPT4ob1tpXT1zLmdldChpKSxvKSkse30pfWdldFN0YXRlVGh1bmtzKHMpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLnN5c3RlbS5zdGF0ZVBsdWdpbnMpLnJlZHVjZSgoKG8saSk9PihvW2ldPSgpPT5zKCkuZ2V0KGkpLG8pKSx7fSl9Z2V0Rm4oKXtyZXR1cm57Zm46dGhpcy5zeXN0ZW0uZm59fWdldENvbXBvbmVudHMocyl7Y29uc3Qgbz10aGlzLnN5c3RlbS5jb21wb25lbnRzW3NdO3JldHVybiBBcnJheS5pc0FycmF5KG8pP28ucmVkdWNlKCgocyxvKT0+byhzLHRoaXMuZ2V0U3lzdGVtKCkpKSk6dm9pZCAwIT09cz90aGlzLnN5c3RlbS5jb21wb25lbnRzW3NdOnRoaXMuc3lzdGVtLmNvbXBvbmVudHN9Z2V0Qm91bmRTZWxlY3RvcnMocyxvKXtyZXR1cm4gb2JqTWFwKHRoaXMuZ2V0U2VsZWN0b3JzKCksKChpLGEpPT57bGV0IHU9W2Euc2xpY2UoMCwtOSldO3JldHVybiBvYmpNYXAoaSwoaT0+KC4uLmEpPT57bGV0IF89d3JhcFdpdGhUcnlDYXRjaChpLHRoaXMuZ2V0U3lzdGVtKS5hcHBseShudWxsLFtzKCkuZ2V0SW4odSksLi4uYV0pO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBfJiYoXz13cmFwV2l0aFRyeUNhdGNoKF8sdGhpcy5nZXRTeXN0ZW0pKG8oKSkpLF99KSl9KSl9Z2V0Qm91bmRBY3Rpb25zKHMpe3M9c3x8dGhpcy5nZXRTdG9yZSgpLmRpc3BhdGNoO2NvbnN0IG89dGhpcy5nZXRBY3Rpb25zKCkscHJvY2Vzcz1zPT4iZnVuY3Rpb24iIT10eXBlb2Ygcz9vYmpNYXAocywocz0+cHJvY2VzcyhzKSkpOiguLi5vKT0+e3ZhciBpPW51bGw7dHJ5e2k9cyguLi5vKX1jYXRjaChzKXtpPXt0eXBlOnJ0LGVycm9yOiEwLHBheWxvYWQ6KDAsUWUuc2VyaWFsaXplRXJyb3IpKHMpfX1maW5hbGx5e3JldHVybiBpfX07cmV0dXJuIG9iak1hcChvLChvPT5mdW5jdGlvbiBiaW5kQWN0aW9uQ3JlYXRvcnMocyxvKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgcylyZXR1cm4gYmluZEFjdGlvbkNyZWF0b3IocyxvKTtpZigib2JqZWN0IiE9dHlwZW9mIHN8fG51bGw9PT1zKXRocm93IG5ldyBFcnJvcihmb3JtYXRQcm9kRXJyb3JNZXNzYWdlKDE2KSk7Y29uc3QgaT17fTtmb3IoY29uc3QgYSBpbiBzKXtjb25zdCB1PXNbYV07ImZ1bmN0aW9uIj09dHlwZW9mIHUmJihpW2FdPWJpbmRBY3Rpb25DcmVhdG9yKHUsbykpfXJldHVybiBpfShwcm9jZXNzKG8pLHMpKSl9Z2V0TWFwU3RhdGVUb1Byb3BzKCl7cmV0dXJuKCk9Pk9iamVjdC5hc3NpZ24oe30sdGhpcy5nZXRTeXN0ZW0oKSl9Z2V0TWFwRGlzcGF0Y2hUb1Byb3BzKHMpe3JldHVybiBvPT5ZZSgpKHt9LHRoaXMuZ2V0V3JhcHBlZEFuZEJvdW5kQWN0aW9ucyhvKSx0aGlzLmdldEZuKCkscyl9fWZ1bmN0aW9uIGNvbWJpbmVQbHVnaW5zKHMsbyl7cmV0dXJuIGlzT2JqZWN0KHMpJiYhaXNBcnJheShzKT90dCgpKHt9LHMpOmlzRnVuYyhzKT9jb21iaW5lUGx1Z2lucyhzKG8pLG8pOmlzQXJyYXkocyk/cy5tYXAoKHM9PmNvbWJpbmVQbHVnaW5zKHMsbykpKS5yZWR1Y2Uoc3lzdGVtRXh0ZW5kLHtjb21wb25lbnRzOm8uZ2V0Q29tcG9uZW50cygpfSk6e319ZnVuY3Rpb24gY2FsbEFmdGVyTG9hZChzLG8se2hhc0xvYWRlZDppfT17fSl7bGV0IGE9aTtyZXR1cm4gaXNPYmplY3QocykmJiFpc0FycmF5KHMpJiYiZnVuY3Rpb24iPT10eXBlb2Ygcy5hZnRlckxvYWQmJihhPSEwLHdyYXBXaXRoVHJ5Q2F0Y2gocy5hZnRlckxvYWQsby5nZXRTeXN0ZW0pLmNhbGwodGhpcyxvKSksaXNGdW5jKHMpP2NhbGxBZnRlckxvYWQuY2FsbCh0aGlzLHMobyksbyx7aGFzTG9hZGVkOmF9KTppc0FycmF5KHMpP3MubWFwKChzPT5jYWxsQWZ0ZXJMb2FkLmNhbGwodGhpcyxzLG8se2hhc0xvYWRlZDphfSkpKTphfWZ1bmN0aW9uIHN5c3RlbUV4dGVuZChzPXt9LG89e30pe2lmKCFpc09iamVjdChzKSlyZXR1cm57fTtpZighaXNPYmplY3QobykpcmV0dXJuIHM7by53cmFwQ29tcG9uZW50cyYmKG9iak1hcChvLndyYXBDb21wb25lbnRzLCgoaSxhKT0+e2NvbnN0IHU9cy5jb21wb25lbnRzJiZzLmNvbXBvbmVudHNbYV07dSYmQXJyYXkuaXNBcnJheSh1KT8ocy5jb21wb25lbnRzW2FdPXUuY29uY2F0KFtpXSksZGVsZXRlIG8ud3JhcENvbXBvbmVudHNbYV0pOnUmJihzLmNvbXBvbmVudHNbYV09W3UsaV0sZGVsZXRlIG8ud3JhcENvbXBvbmVudHNbYV0pfSkpLE9iamVjdC5rZXlzKG8ud3JhcENvbXBvbmVudHMpLmxlbmd0aHx8ZGVsZXRlIG8ud3JhcENvbXBvbmVudHMpO2NvbnN0e3N0YXRlUGx1Z2luczppfT1zO2lmKGlzT2JqZWN0KGkpKWZvcihsZXQgcyBpbiBpKXtjb25zdCBhPWlbc107aWYoIWlzT2JqZWN0KGEpKWNvbnRpbnVlO2NvbnN0e3dyYXBBY3Rpb25zOnUsd3JhcFNlbGVjdG9yczpffT1hO2lmKGlzT2JqZWN0KHUpKWZvcihsZXQgaSBpbiB1KXtsZXQgYT11W2ldO0FycmF5LmlzQXJyYXkoYSl8fChhPVthXSx1W2ldPWEpLG8mJm8uc3RhdGVQbHVnaW5zJiZvLnN0YXRlUGx1Z2luc1tzXSYmby5zdGF0ZVBsdWdpbnNbc10ud3JhcEFjdGlvbnMmJm8uc3RhdGVQbHVnaW5zW3NdLndyYXBBY3Rpb25zW2ldJiYoby5zdGF0ZVBsdWdpbnNbc10ud3JhcEFjdGlvbnNbaV09dVtpXS5jb25jYXQoby5zdGF0ZVBsdWdpbnNbc10ud3JhcEFjdGlvbnNbaV0pKX1pZihpc09iamVjdChfKSlmb3IobGV0IGkgaW4gXyl7bGV0IGE9X1tpXTtBcnJheS5pc0FycmF5KGEpfHwoYT1bYV0sX1tpXT1hKSxvJiZvLnN0YXRlUGx1Z2lucyYmby5zdGF0ZVBsdWdpbnNbc10mJm8uc3RhdGVQbHVnaW5zW3NdLndyYXBTZWxlY3RvcnMmJm8uc3RhdGVQbHVnaW5zW3NdLndyYXBTZWxlY3RvcnNbaV0mJihvLnN0YXRlUGx1Z2luc1tzXS53cmFwU2VsZWN0b3JzW2ldPV9baV0uY29uY2F0KG8uc3RhdGVQbHVnaW5zW3NdLndyYXBTZWxlY3RvcnNbaV0pKX19cmV0dXJuIFllKCkocyxvKX1mdW5jdGlvbiB3cmFwV2l0aFRyeUNhdGNoKHMsbyx7bG9nRXJyb3JzOmk9ITB9PXt9KXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2Ygcz9zOmZ1bmN0aW9uKC4uLmEpe3RyeXtyZXR1cm4gcy5jYWxsKHRoaXMsLi4uYSl9Y2F0Y2gocyl7aWYoaSl7Y29uc3R7dW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOml9PW8oKS5nZXRDb25maWdzKCk7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aShzKTpjb25zb2xlLmVycm9yKHMpfXJldHVybiBudWxsfX19dmFyIFR0PV9fd2VicGFja19yZXF1aXJlX18oNjExNjApLE50PV9fd2VicGFja19yZXF1aXJlX18ubihUdCk7Y29uc3QgTXQ9InNob3dfcG9wdXAiLFJ0PSJhdXRob3JpemUiLER0PSJsb2dvdXQiLEx0PSJhdXRob3JpemVfb2F1dGgyIixGdD0iY29uZmlndXJlX2F1dGgiLEJ0PSJyZXN0b3JlX2F1dGhvcml6YXRpb24iO2Z1bmN0aW9uIHNob3dEZWZpbml0aW9ucyhzKXtyZXR1cm57dHlwZTpNdCxwYXlsb2FkOnN9fWZ1bmN0aW9uIGF1dGhvcml6ZShzKXtyZXR1cm57dHlwZTpSdCxwYXlsb2FkOnN9fWNvbnN0IGF1dGhvcml6ZVdpdGhQZXJzaXN0T3B0aW9uPXM9Pih7YXV0aEFjdGlvbnM6b30pPT57by5hdXRob3JpemUocyksby5wZXJzaXN0QXV0aG9yaXphdGlvbklmTmVlZGVkKCl9O2Z1bmN0aW9uIGxvZ291dChzKXtyZXR1cm57dHlwZTpEdCxwYXlsb2FkOnN9fWNvbnN0IGxvZ291dFdpdGhQZXJzaXN0T3B0aW9uPXM9Pih7YXV0aEFjdGlvbnM6b30pPT57by5sb2dvdXQocyksby5wZXJzaXN0QXV0aG9yaXphdGlvbklmTmVlZGVkKCl9LHByZUF1dGhvcml6ZUltcGxpY2l0PXM9Pih7YXV0aEFjdGlvbnM6byxlcnJBY3Rpb25zOml9KT0+e2xldHthdXRoOmEsdG9rZW46dSxpc1ZhbGlkOl99PXMse3NjaGVtYTp3LG5hbWU6eH09YSxDPXcuZ2V0KCJmbG93Iik7ZGVsZXRlIGx0LnN3YWdnZXJVSVJlZGlyZWN0T2F1dGgyLCJhY2Nlc3NDb2RlIj09PUN8fF98fGkubmV3QXV0aEVycih7YXV0aElkOngsc291cmNlOiJhdXRoIixsZXZlbDoid2FybmluZyIsbWVzc2FnZToiQXV0aG9yaXphdGlvbiBtYXkgYmUgdW5zYWZlLCBwYXNzZWQgc3RhdGUgd2FzIGNoYW5nZWQgaW4gc2VydmVyIFBhc3NlZCBzdGF0ZSB3YXNuJ3QgcmV0dXJuZWQgZnJvbSBhdXRoIHNlcnZlciJ9KSx1LmVycm9yP2kubmV3QXV0aEVycih7YXV0aElkOngsc291cmNlOiJhdXRoIixsZXZlbDoiZXJyb3IiLG1lc3NhZ2U6SlNPTi5zdHJpbmdpZnkodSl9KTpvLmF1dGhvcml6ZU9hdXRoMldpdGhQZXJzaXN0T3B0aW9uKHthdXRoOmEsdG9rZW46dX0pfTtmdW5jdGlvbiBhdXRob3JpemVPYXV0aDIocyl7cmV0dXJue3R5cGU6THQscGF5bG9hZDpzfX1jb25zdCBhdXRob3JpemVPYXV0aDJXaXRoUGVyc2lzdE9wdGlvbj1zPT4oe2F1dGhBY3Rpb25zOm99KT0+e28uYXV0aG9yaXplT2F1dGgyKHMpLG8ucGVyc2lzdEF1dGhvcml6YXRpb25JZk5lZWRlZCgpfSxhdXRob3JpemVQYXNzd29yZD1zPT4oe2F1dGhBY3Rpb25zOm99KT0+e2xldHtzY2hlbWE6aSxuYW1lOmEsdXNlcm5hbWU6dSxwYXNzd29yZDpfLHBhc3N3b3JkVHlwZTp3LGNsaWVudElkOngsY2xpZW50U2VjcmV0OkN9PXMsaj17Z3JhbnRfdHlwZToicGFzc3dvcmQiLHNjb3BlOnMuc2NvcGVzLmpvaW4oIiAiKSx1c2VybmFtZTp1LHBhc3N3b3JkOl99LEw9e307c3dpdGNoKHcpe2Nhc2UicmVxdWVzdC1ib2R5IjohZnVuY3Rpb24gc2V0Q2xpZW50SWRBbmRTZWNyZXQocyxvLGkpe28mJk9iamVjdC5hc3NpZ24ocyx7Y2xpZW50X2lkOm99KTtpJiZPYmplY3QuYXNzaWduKHMse2NsaWVudF9zZWNyZXQ6aX0pfShqLHgsQyk7YnJlYWs7Y2FzZSJiYXNpYyI6TC5BdXRob3JpemF0aW9uPSJCYXNpYyAiK3V0aWxzX2J0b2EoeCsiOiIrQyk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oYFdhcm5pbmc6IGludmFsaWQgcGFzc3dvcmRUeXBlICR7d30gd2FzIHBhc3NlZCwgbm90IGluY2x1ZGluZyBjbGllbnQgaWQgYW5kIHNlY3JldGApfXJldHVybiBvLmF1dGhvcml6ZVJlcXVlc3Qoe2JvZHk6YnVpbGRGb3JtRGF0YShqKSx1cmw6aS5nZXQoInRva2VuVXJsIiksbmFtZTphLGhlYWRlcnM6TCxxdWVyeTp7fSxhdXRoOnN9KX07Y29uc3QgYXV0aG9yaXplQXBwbGljYXRpb249cz0+KHthdXRoQWN0aW9uczpvfSk9PntsZXR7c2NoZW1hOmksc2NvcGVzOmEsbmFtZTp1LGNsaWVudElkOl8sY2xpZW50U2VjcmV0Ond9PXMseD17QXV0aG9yaXphdGlvbjoiQmFzaWMgIit1dGlsc19idG9hKF8rIjoiK3cpfSxDPXtncmFudF90eXBlOiJjbGllbnRfY3JlZGVudGlhbHMiLHNjb3BlOmEuam9pbigiICIpfTtyZXR1cm4gby5hdXRob3JpemVSZXF1ZXN0KHtib2R5OmJ1aWxkRm9ybURhdGEoQyksbmFtZTp1LHVybDppLmdldCgidG9rZW5VcmwiKSxhdXRoOnMsaGVhZGVyczp4fSl9LGF1dGhvcml6ZUFjY2Vzc0NvZGVXaXRoRm9ybVBhcmFtcz0oe2F1dGg6cyxyZWRpcmVjdFVybDpvfSk9Pih7YXV0aEFjdGlvbnM6aX0pPT57bGV0e3NjaGVtYTphLG5hbWU6dSxjbGllbnRJZDpfLGNsaWVudFNlY3JldDp3LGNvZGVWZXJpZmllcjp4fT1zLEM9e2dyYW50X3R5cGU6ImF1dGhvcml6YXRpb25fY29kZSIsY29kZTpzLmNvZGUsY2xpZW50X2lkOl8sY2xpZW50X3NlY3JldDp3LHJlZGlyZWN0X3VyaTpvLGNvZGVfdmVyaWZpZXI6eH07cmV0dXJuIGkuYXV0aG9yaXplUmVxdWVzdCh7Ym9keTpidWlsZEZvcm1EYXRhKEMpLG5hbWU6dSx1cmw6YS5nZXQoInRva2VuVXJsIiksYXV0aDpzfSl9LGF1dGhvcml6ZUFjY2Vzc0NvZGVXaXRoQmFzaWNBdXRoZW50aWNhdGlvbj0oe2F1dGg6cyxyZWRpcmVjdFVybDpvfSk9Pih7YXV0aEFjdGlvbnM6aX0pPT57bGV0e3NjaGVtYTphLG5hbWU6dSxjbGllbnRJZDpfLGNsaWVudFNlY3JldDp3LGNvZGVWZXJpZmllcjp4fT1zLEM9e0F1dGhvcml6YXRpb246IkJhc2ljICIrdXRpbHNfYnRvYShfKyI6Iit3KX0saj17Z3JhbnRfdHlwZToiYXV0aG9yaXphdGlvbl9jb2RlIixjb2RlOnMuY29kZSxjbGllbnRfaWQ6XyxyZWRpcmVjdF91cmk6byxjb2RlX3ZlcmlmaWVyOnh9O3JldHVybiBpLmF1dGhvcml6ZVJlcXVlc3Qoe2JvZHk6YnVpbGRGb3JtRGF0YShqKSxuYW1lOnUsdXJsOmEuZ2V0KCJ0b2tlblVybCIpLGF1dGg6cyxoZWFkZXJzOkN9KX0sYXV0aG9yaXplUmVxdWVzdD1zPT4oe2ZuOm8sZ2V0Q29uZmlnczppLGF1dGhBY3Rpb25zOmEsZXJyQWN0aW9uczp1LG9hczNTZWxlY3RvcnM6XyxzcGVjU2VsZWN0b3JzOncsYXV0aFNlbGVjdG9yczp4fSk9PntsZXQgQyx7Ym9keTpqLHF1ZXJ5Okw9e30saGVhZGVyczpCPXt9LG5hbWU6JCx1cmw6VSxhdXRoOlZ9PXMse2FkZGl0aW9uYWxRdWVyeVN0cmluZ1BhcmFtczp6fT14LmdldENvbmZpZ3MoKXx8e307aWYody5pc09BUzMoKSl7bGV0IHM9Xy5zZXJ2ZXJFZmZlY3RpdmVWYWx1ZShfLnNlbGVjdGVkU2VydmVyKCkpO0M9TnQoKShVLHMsITApfWVsc2UgQz1OdCgpKFUsdy51cmwoKSwhMCk7Im9iamVjdCI9PXR5cGVvZiB6JiYoQy5xdWVyeT1PYmplY3QuYXNzaWduKHt9LEMucXVlcnkseikpO2NvbnN0IFk9Qy50b1N0cmluZygpO2xldCBaPU9iamVjdC5hc3NpZ24oe0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwiWC1SZXF1ZXN0ZWQtV2l0aCI6IlhNTEh0dHBSZXF1ZXN0In0sQik7by5mZXRjaCh7dXJsOlksbWV0aG9kOiJwb3N0IixoZWFkZXJzOloscXVlcnk6TCxib2R5OmoscmVxdWVzdEludGVyY2VwdG9yOmkoKS5yZXF1ZXN0SW50ZXJjZXB0b3IscmVzcG9uc2VJbnRlcmNlcHRvcjppKCkucmVzcG9uc2VJbnRlcmNlcHRvcn0pLnRoZW4oKGZ1bmN0aW9uKHMpe2xldCBvPUpTT04ucGFyc2Uocy5kYXRhKSxpPW8mJihvLmVycm9yfHwiIiksXz1vJiYoby5wYXJzZUVycm9yfHwiIik7cy5vaz9pfHxfP3UubmV3QXV0aEVycih7YXV0aElkOiQsbGV2ZWw6ImVycm9yIixzb3VyY2U6ImF1dGgiLG1lc3NhZ2U6SlNPTi5zdHJpbmdpZnkobyl9KTphLmF1dGhvcml6ZU9hdXRoMldpdGhQZXJzaXN0T3B0aW9uKHthdXRoOlYsdG9rZW46b30pOnUubmV3QXV0aEVycih7YXV0aElkOiQsbGV2ZWw6ImVycm9yIixzb3VyY2U6ImF1dGgiLG1lc3NhZ2U6cy5zdGF0dXNUZXh0fSl9KSkuY2F0Y2goKHM9PntsZXQgbz1uZXcgRXJyb3IocykubWVzc2FnZTtpZihzLnJlc3BvbnNlJiZzLnJlc3BvbnNlLmRhdGEpe2NvbnN0IGk9cy5yZXNwb25zZS5kYXRhO3RyeXtjb25zdCBzPSJzdHJpbmciPT10eXBlb2YgaT9KU09OLnBhcnNlKGkpOmk7cy5lcnJvciYmKG8rPWAsIGVycm9yOiAke3MuZXJyb3J9YCkscy5lcnJvcl9kZXNjcmlwdGlvbiYmKG8rPWAsIGRlc2NyaXB0aW9uOiAke3MuZXJyb3JfZGVzY3JpcHRpb259YCl9Y2F0Y2gocyl7fX11Lm5ld0F1dGhFcnIoe2F1dGhJZDokLGxldmVsOiJlcnJvciIsc291cmNlOiJhdXRoIixtZXNzYWdlOm99KX0pKX07ZnVuY3Rpb24gY29uZmlndXJlQXV0aChzKXtyZXR1cm57dHlwZTpGdCxwYXlsb2FkOnN9fWZ1bmN0aW9uIHJlc3RvcmVBdXRob3JpemF0aW9uKHMpe3JldHVybnt0eXBlOkJ0LHBheWxvYWQ6c319Y29uc3QgcGVyc2lzdEF1dGhvcml6YXRpb25JZk5lZWRlZD0oKT0+KHthdXRoU2VsZWN0b3JzOnMsZ2V0Q29uZmlnczpvfSk9PntpZighbygpLnBlcnNpc3RBdXRob3JpemF0aW9uKXJldHVybjtjb25zdCBpPXMuYXV0aG9yaXplZCgpLnRvSlMoKTtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0aG9yaXplZCIsSlNPTi5zdHJpbmdpZnkoaSkpfSxhdXRoUG9wdXA9KHMsbyk9PigpPT57bHQuc3dhZ2dlclVJUmVkaXJlY3RPYXV0aDI9byxsdC5vcGVuKHMpfSwkdD17W010XToocyx7cGF5bG9hZDpvfSk9PnMuc2V0KCJzaG93RGVmaW5pdGlvbnMiLG8pLFtSdF06KHMse3BheWxvYWQ6b30pPT57bGV0IGk9KDAsemUuZnJvbUpTKShvKSxhPXMuZ2V0KCJhdXRob3JpemVkIil8fCgwLHplLk1hcCkoKTtyZXR1cm4gaS5lbnRyeVNlcSgpLmZvckVhY2goKChbbyxpXSk9PntpZighaXNGdW5jKGkuZ2V0SW4pKXJldHVybiBzLnNldCgiYXV0aG9yaXplZCIsYSk7bGV0IHU9aS5nZXRJbihbInNjaGVtYSIsInR5cGUiXSk7aWYoImFwaUtleSI9PT11fHwiaHR0cCI9PT11KWE9YS5zZXQobyxpKTtlbHNlIGlmKCJiYXNpYyI9PT11KXtsZXQgcz1pLmdldEluKFsidmFsdWUiLCJ1c2VybmFtZSJdKSx1PWkuZ2V0SW4oWyJ2YWx1ZSIsInBhc3N3b3JkIl0pO2E9YS5zZXRJbihbbywidmFsdWUiXSx7dXNlcm5hbWU6cyxoZWFkZXI6IkJhc2ljICIrdXRpbHNfYnRvYShzKyI6Iit1KX0pLGE9YS5zZXRJbihbbywic2NoZW1hIl0saS5nZXQoInNjaGVtYSIpKX19KSkscy5zZXQoImF1dGhvcml6ZWQiLGEpfSxbTHRdOihzLHtwYXlsb2FkOm99KT0+e2xldCBpLHthdXRoOmEsdG9rZW46dX09bzthLnRva2VuPU9iamVjdC5hc3NpZ24oe30sdSksaT0oMCx6ZS5mcm9tSlMpKGEpO2xldCBfPXMuZ2V0KCJhdXRob3JpemVkIil8fCgwLHplLk1hcCkoKTtyZXR1cm4gXz1fLnNldChpLmdldCgibmFtZSIpLGkpLHMuc2V0KCJhdXRob3JpemVkIixfKX0sW0R0XToocyx7cGF5bG9hZDpvfSk9PntsZXQgaT1zLmdldCgiYXV0aG9yaXplZCIpLndpdGhNdXRhdGlvbnMoKHM9PntvLmZvckVhY2goKG89PntzLmRlbGV0ZShvKX0pKX0pKTtyZXR1cm4gcy5zZXQoImF1dGhvcml6ZWQiLGkpfSxbRnRdOihzLHtwYXlsb2FkOm99KT0+cy5zZXQoImNvbmZpZ3MiLG8pLFtCdF06KHMse3BheWxvYWQ6b30pPT5zLnNldCgiYXV0aG9yaXplZCIsKDAsemUuZnJvbUpTKShvLmF1dGhvcml6ZWQpKX07ZnVuY3Rpb24gYXNzZXJ0SXNGdW5jdGlvbihzLG89ImV4cGVjdGVkIGEgZnVuY3Rpb24sIGluc3RlYWQgcmVjZWl2ZWQgIit0eXBlb2Ygcyl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcihvKX12YXIgZW5zdXJlSXNBcnJheT1zPT5BcnJheS5pc0FycmF5KHMpP3M6W3NdO2Z1bmN0aW9uIGdldERlcGVuZGVuY2llcyhzKXtjb25zdCBvPUFycmF5LmlzQXJyYXkoc1swXSk/c1swXTpzO3JldHVybiBmdW5jdGlvbiBhc3NlcnRJc0FycmF5T2ZGdW5jdGlvbnMocyxvPSJleHBlY3RlZCBhbGwgaXRlbXMgdG8gYmUgZnVuY3Rpb25zLCBpbnN0ZWFkIHJlY2VpdmVkIHRoZSBmb2xsb3dpbmcgdHlwZXM6ICIpe2lmKCFzLmV2ZXJ5KChzPT4iZnVuY3Rpb24iPT10eXBlb2YgcykpKXtjb25zdCBpPXMubWFwKChzPT4iZnVuY3Rpb24iPT10eXBlb2Ygcz9gZnVuY3Rpb24gJHtzLm5hbWV8fCJ1bm5hbWVkIn0oKWA6dHlwZW9mIHMpKS5qb2luKCIsICIpO3Rocm93IG5ldyBUeXBlRXJyb3IoYCR7b31bJHtpfV1gKX19KG8sImNyZWF0ZVNlbGVjdG9yIGV4cGVjdHMgYWxsIGlucHV0LXNlbGVjdG9ycyB0byBiZSBmdW5jdGlvbnMsIGJ1dCByZWNlaXZlZCB0aGUgZm9sbG93aW5nIHR5cGVzOiAiKSxvfVN5bWJvbCgpLE9iamVjdC5nZXRQcm90b3R5cGVPZih7fSk7dmFyIHF0PSJ1bmRlZmluZWQiIT10eXBlb2YgV2Vha1JlZj9XZWFrUmVmOmNsYXNze2NvbnN0cnVjdG9yKHMpe3RoaXMudmFsdWU9c31kZXJlZigpe3JldHVybiB0aGlzLnZhbHVlfX07ZnVuY3Rpb24gd2Vha01hcE1lbW9pemUocyxvPXt9KXtsZXQgaT17czowLHY6dm9pZCAwLG86bnVsbCxwOm51bGx9O2NvbnN0e3Jlc3VsdEVxdWFsaXR5Q2hlY2s6YX09bztsZXQgdSxfPTA7ZnVuY3Rpb24gbWVtb2l6ZWQoKXtsZXQgbz1pO2NvbnN0e2xlbmd0aDp3fT1hcmd1bWVudHM7Zm9yKGxldCBzPTAsaT13O3M8aTtzKyspe2NvbnN0IGk9YXJndW1lbnRzW3NdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpfHwib2JqZWN0Ij09dHlwZW9mIGkmJm51bGwhPT1pKXtsZXQgcz1vLm87bnVsbD09PXMmJihvLm89cz1uZXcgV2Vha01hcCk7Y29uc3QgYT1zLmdldChpKTt2b2lkIDA9PT1hPyhvPXtzOjAsdjp2b2lkIDAsbzpudWxsLHA6bnVsbH0scy5zZXQoaSxvKSk6bz1hfWVsc2V7bGV0IHM9by5wO251bGw9PT1zJiYoby5wPXM9bmV3IE1hcCk7Y29uc3QgYT1zLmdldChpKTt2b2lkIDA9PT1hPyhvPXtzOjAsdjp2b2lkIDAsbzpudWxsLHA6bnVsbH0scy5zZXQoaSxvKSk6bz1hfX1jb25zdCB4PW87bGV0IEM7aWYoMT09PW8ucylDPW8udjtlbHNlIGlmKEM9cy5hcHBseShudWxsLGFyZ3VtZW50cyksXysrLGEpe2NvbnN0IHM9dT8uZGVyZWY/LigpPz91O251bGwhPXMmJmEocyxDKSYmKEM9cywwIT09XyYmXy0tKTt1PSJvYmplY3QiPT10eXBlb2YgQyYmbnVsbCE9PUN8fCJmdW5jdGlvbiI9PXR5cGVvZiBDP25ldyBxdChDKTpDfXJldHVybiB4LnM9MSx4LnY9QyxDfXJldHVybiBtZW1vaXplZC5jbGVhckNhY2hlPSgpPT57aT17czowLHY6dm9pZCAwLG86bnVsbCxwOm51bGx9LG1lbW9pemVkLnJlc2V0UmVzdWx0c0NvdW50KCl9LG1lbW9pemVkLnJlc3VsdHNDb3VudD0oKT0+XyxtZW1vaXplZC5yZXNldFJlc3VsdHNDb3VudD0oKT0+e189MH0sbWVtb2l6ZWR9ZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3JDcmVhdG9yKHMsLi4ubyl7Y29uc3QgaT0iZnVuY3Rpb24iPT10eXBlb2Ygcz97bWVtb2l6ZTpzLG1lbW9pemVPcHRpb25zOm99OnMsY3JlYXRlU2VsZWN0b3IyPSguLi5zKT0+e2xldCBvLGE9MCx1PTAsXz17fSx3PXMucG9wKCk7Im9iamVjdCI9PXR5cGVvZiB3JiYoXz13LHc9cy5wb3AoKSksYXNzZXJ0SXNGdW5jdGlvbih3LGBjcmVhdGVTZWxlY3RvciBleHBlY3RzIGFuIG91dHB1dCBmdW5jdGlvbiBhZnRlciB0aGUgaW5wdXRzLCBidXQgcmVjZWl2ZWQ6IFske3R5cGVvZiB3fV1gKTtjb25zdCB4PXsuLi5pLC4uLl99LHttZW1vaXplOkMsbWVtb2l6ZU9wdGlvbnM6aj1bXSxhcmdzTWVtb2l6ZTpMPXdlYWtNYXBNZW1vaXplLGFyZ3NNZW1vaXplT3B0aW9uczpCPVtdLGRldk1vZGVDaGVja3M6JD17fX09eCxVPWVuc3VyZUlzQXJyYXkoaiksVj1lbnN1cmVJc0FycmF5KEIpLHo9Z2V0RGVwZW5kZW5jaWVzKHMpLFk9QygoZnVuY3Rpb24gcmVjb21wdXRhdGlvbldyYXBwZXIoKXtyZXR1cm4gYSsrLHcuYXBwbHkobnVsbCxhcmd1bWVudHMpfSksLi4uVSk7Y29uc3QgWj1MKChmdW5jdGlvbiBkZXBlbmRlbmNpZXNDaGVja2VyKCl7dSsrO2NvbnN0IHM9ZnVuY3Rpb24gY29sbGVjdElucHV0U2VsZWN0b3JSZXN1bHRzKHMsbyl7Y29uc3QgaT1bXSx7bGVuZ3RoOmF9PXM7Zm9yKGxldCB1PTA7dTxhO3UrKylpLnB1c2goc1t1XS5hcHBseShudWxsLG8pKTtyZXR1cm4gaX0oeixhcmd1bWVudHMpO3JldHVybiBvPVkuYXBwbHkobnVsbCxzKSxvfSksLi4uVik7cmV0dXJuIE9iamVjdC5hc3NpZ24oWix7cmVzdWx0RnVuYzp3LG1lbW9pemVkUmVzdWx0RnVuYzpZLGRlcGVuZGVuY2llczp6LGRlcGVuZGVuY3lSZWNvbXB1dGF0aW9uczooKT0+dSxyZXNldERlcGVuZGVuY3lSZWNvbXB1dGF0aW9uczooKT0+e3U9MH0sbGFzdFJlc3VsdDooKT0+byxyZWNvbXB1dGF0aW9uczooKT0+YSxyZXNldFJlY29tcHV0YXRpb25zOigpPT57YT0wfSxtZW1vaXplOkMsYXJnc01lbW9pemU6TH0pfTtyZXR1cm4gT2JqZWN0LmFzc2lnbihjcmVhdGVTZWxlY3RvcjIse3dpdGhUeXBlczooKT0+Y3JlYXRlU2VsZWN0b3IyfSksY3JlYXRlU2VsZWN0b3IyfXZhciBVdD1jcmVhdGVTZWxlY3RvckNyZWF0b3Iod2Vha01hcE1lbW9pemUpLFZ0PU9iamVjdC5hc3NpZ24oKChzLG89VXQpPT57IWZ1bmN0aW9uIGFzc2VydElzT2JqZWN0KHMsbz0iZXhwZWN0ZWQgYW4gb2JqZWN0LCBpbnN0ZWFkIHJlY2VpdmVkICIrdHlwZW9mIHMpe2lmKCJvYmplY3QiIT10eXBlb2Ygcyl0aHJvdyBuZXcgVHlwZUVycm9yKG8pfShzLCJjcmVhdGVTdHJ1Y3R1cmVkU2VsZWN0b3IgZXhwZWN0cyBmaXJzdCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2hlcmUgZWFjaCBwcm9wZXJ0eSBpcyBhIHNlbGVjdG9yLCBpbnN0ZWFkIHJlY2VpdmVkIGEgIit0eXBlb2Ygcyk7Y29uc3QgaT1PYmplY3Qua2V5cyhzKTtyZXR1cm4gbyhpLm1hcCgobz0+c1tvXSkpLCgoLi4ucyk9PnMucmVkdWNlKCgocyxvLGEpPT4oc1tpW2FdXT1vLHMpKSx7fSkpKX0pLHt3aXRoVHlwZXM6KCk9PlZ0fSk7Y29uc3Qgc3RhdGU9cz0+cyx6dD1VdChzdGF0ZSwocz0+cy5nZXQoInNob3dEZWZpbml0aW9ucyIpKSksV3Q9VXQoc3RhdGUsKCgpPT4oe3NwZWNTZWxlY3RvcnM6c30pPT57bGV0IG89cy5zZWN1cml0eURlZmluaXRpb25zKCl8fCgwLHplLk1hcCkoe30pLGk9KDAsemUuTGlzdCkoKTtyZXR1cm4gby5lbnRyeVNlcSgpLmZvckVhY2goKChbcyxvXSk9PntsZXQgYT0oMCx6ZS5NYXApKCk7YT1hLnNldChzLG8pLGk9aS5wdXNoKGEpfSkpLGl9KSksc2VsZWN0QXV0aFBhdGg9KHMsbyk9Pih7c3BlY1NlbGVjdG9yczpzfSk9PigwLHplLkxpc3QpKHMuaXNPQVMzKCk/WyJjb21wb25lbnRzIiwic2VjdXJpdHlTY2hlbWVzIixvXTpbInNlY3VyaXR5RGVmaW5pdGlvbnMiLG9dKSxnZXREZWZpbml0aW9uc0J5TmFtZXM9KHMsbyk9Pih7c3BlY1NlbGVjdG9yczpzfSk9Pntjb25zb2xlLndhcm4oIldBUk5JTkc6IGdldERlZmluaXRpb25zQnlOYW1lcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbi4iKTtsZXQgaT1zLnNlY3VyaXR5RGVmaW5pdGlvbnMoKSxhPSgwLHplLkxpc3QpKCk7cmV0dXJuIG8udmFsdWVTZXEoKS5mb3JFYWNoKChzPT57bGV0IG89KDAsemUuTWFwKSgpO3MuZW50cnlTZXEoKS5mb3JFYWNoKCgoW3MsYV0pPT57bGV0IHUsXz1pLmdldChzKTsib2F1dGgyIj09PV8uZ2V0KCJ0eXBlIikmJmEuc2l6ZSYmKHU9Xy5nZXQoInNjb3BlcyIpLHUua2V5U2VxKCkuZm9yRWFjaCgocz0+e2EuY29udGFpbnMocyl8fCh1PXUuZGVsZXRlKHMpKX0pKSxfPV8uc2V0KCJhbGxvd2VkU2NvcGVzIix1KSksbz1vLnNldChzLF8pfSkpLGE9YS5wdXNoKG8pfSkpLGF9LGRlZmluaXRpb25zRm9yUmVxdWlyZW1lbnRzPShzLG89KDAsemUuTGlzdCkoKSk9Pih7YXV0aFNlbGVjdG9yczpzfSk9Pntjb25zdCBpPXMuZGVmaW5pdGlvbnNUb0F1dGhvcml6ZSgpfHwoMCx6ZS5MaXN0KSgpO2xldCBhPSgwLHplLkxpc3QpKCk7cmV0dXJuIGkuZm9yRWFjaCgocz0+e2xldCBpPW8uZmluZCgobz0+by5nZXQocy5rZXlTZXEoKS5maXJzdCgpKSkpO2kmJihzLmZvckVhY2goKChvLGEpPT57aWYoIm9hdXRoMiI9PT1vLmdldCgidHlwZSIpKXtjb25zdCB1PWkuZ2V0KGEpO2xldCBfPW8uZ2V0KCJzY29wZXMiKTt6ZS5MaXN0LmlzTGlzdCh1KSYmemUuTWFwLmlzTWFwKF8pJiYoXy5rZXlTZXEoKS5mb3JFYWNoKChzPT57dS5jb250YWlucyhzKXx8KF89Xy5kZWxldGUocykpfSkpLHM9cy5zZXQoYSxvLnNldCgic2NvcGVzIixfKSkpfX0pKSxhPWEucHVzaChzKSl9KSksYX0sSnQ9VXQoc3RhdGUsKHM9PnMuZ2V0KCJhdXRob3JpemVkIil8fCgwLHplLk1hcCkoKSkpLGlzQXV0aG9yaXplZD0ocyxvKT0+KHthdXRoU2VsZWN0b3JzOnN9KT0+e2xldCBpPXMuYXV0aG9yaXplZCgpO3JldHVybiB6ZS5MaXN0LmlzTGlzdChvKT8hIW8udG9KUygpLmZpbHRlcigocz0+LTE9PT1PYmplY3Qua2V5cyhzKS5tYXAoKHM9PiEhaS5nZXQocykpKS5pbmRleE9mKCExKSkpLmxlbmd0aDpudWxsfSxIdD1VdChzdGF0ZSwocz0+cy5nZXQoImNvbmZpZ3MiKSkpLGV4ZWN1dGU9KHMse2F1dGhTZWxlY3RvcnM6byxzcGVjU2VsZWN0b3JzOml9KT0+KHtwYXRoOmEsbWV0aG9kOnUsb3BlcmF0aW9uOl8sZXh0cmFzOnd9KT0+e2xldCB4PXthdXRob3JpemVkOm8uYXV0aG9yaXplZCgpJiZvLmF1dGhvcml6ZWQoKS50b0pTKCksZGVmaW5pdGlvbnM6aS5zZWN1cml0eURlZmluaXRpb25zKCkmJmkuc2VjdXJpdHlEZWZpbml0aW9ucygpLnRvSlMoKSxzcGVjU2VjdXJpdHk6aS5zZWN1cml0eSgpJiZpLnNlY3VyaXR5KCkudG9KUygpfTtyZXR1cm4gcyh7cGF0aDphLG1ldGhvZDp1LG9wZXJhdGlvbjpfLHNlY3VyaXRpZXM6eCwuLi53fSl9LGxvYWRlZD0ocyxvKT0+aT0+e2NvbnN0e2dldENvbmZpZ3M6YSxhdXRoQWN0aW9uczp1fT1vLF89YSgpO2lmKHMoaSksXy5wZXJzaXN0QXV0aG9yaXphdGlvbil7Y29uc3Qgcz1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiYXV0aG9yaXplZCIpO3MmJnUucmVzdG9yZUF1dGhvcml6YXRpb24oe2F1dGhvcml6ZWQ6SlNPTi5wYXJzZShzKX0pfX0sd3JhcF9hY3Rpb25zX2F1dGhvcml6ZT0ocyxvKT0+aT0+e3MoaSk7aWYoby5nZXRDb25maWdzKCkucGVyc2lzdEF1dGhvcml6YXRpb24pdHJ5e2NvbnN0W3tzY2hlbWE6cyx2YWx1ZTpvfV09T2JqZWN0LnZhbHVlcyhpKSxhPSgwLHplLmZyb21KUykocyksdT0iYXBpS2V5Ij09PWEuZ2V0KCJ0eXBlIiksXz0iY29va2llIj09PWEuZ2V0KCJpbiIpO3UmJl8mJihkb2N1bWVudC5jb29raWU9YCR7YS5nZXQoIm5hbWUiKX09JHtvfTsgU2FtZVNpdGU9Tm9uZTsgU2VjdXJlYCl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcigiRXJyb3IgcGVyc2lzdGluZyBjb29raWUgYmFzZWQgYXBpS2V5IGluIGRvY3VtZW50LmNvb2tpZS4iLHMpfX0sd3JhcF9hY3Rpb25zX2xvZ291dD0ocyxvKT0+aT0+e2NvbnN0IGE9by5nZXRDb25maWdzKCksdT1vLmF1dGhTZWxlY3RvcnMuYXV0aG9yaXplZCgpO3RyeXthLnBlcnNpc3RBdXRob3JpemF0aW9uJiZBcnJheS5pc0FycmF5KGkpJiZpLmZvckVhY2goKHM9Pntjb25zdCBvPXUuZ2V0KHMse30pLGk9ImFwaUtleSI9PT1vLmdldEluKFsic2NoZW1hIiwidHlwZSJdKSxhPSJjb29raWUiPT09by5nZXRJbihbInNjaGVtYSIsImluIl0pO2lmKGkmJmEpe2NvbnN0IHM9by5nZXRJbihbInNjaGVtYSIsIm5hbWUiXSk7ZG9jdW1lbnQuY29va2llPWAke3N9PTsgTWF4LUFnZT0tOTk5OTk5OTlgfX0pKX1jYXRjaChzKXtjb25zb2xlLmVycm9yKCJFcnJvciBkZWxldGluZyBjb29raWUgYmFzZWQgYXBpS2V5IGZyb20gZG9jdW1lbnQuY29va2llLiIscyl9cyhpKX07dmFyIEt0PV9fd2VicGFja19yZXF1aXJlX18oOTAxNzkpLEd0PV9fd2VicGFja19yZXF1aXJlX18ubihLdCk7Y2xhc3MgTG9ja0F1dGhJY29uIGV4dGVuZHMgUmUuQ29tcG9uZW50e21hcFN0YXRlVG9Qcm9wcyhzLG8pe3JldHVybntzdGF0ZTpzLG93blByb3BzOkd0KCkobyxPYmplY3Qua2V5cyhvLmdldFN5c3RlbSgpKSl9fXJlbmRlcigpe2NvbnN0e2dldENvbXBvbmVudDpzLG93blByb3BzOm99PXRoaXMucHJvcHMsaT1zKCJMb2NrSWNvbiIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KGksbyl9fWNvbnN0IFl0PUxvY2tBdXRoSWNvbjtjbGFzcyBVbmxvY2tBdXRoSWNvbiBleHRlbmRzIFJlLkNvbXBvbmVudHttYXBTdGF0ZVRvUHJvcHMocyxvKXtyZXR1cm57c3RhdGU6cyxvd25Qcm9wczpHdCgpKG8sT2JqZWN0LmtleXMoby5nZXRTeXN0ZW0oKSkpfX1yZW5kZXIoKXtjb25zdHtnZXRDb21wb25lbnQ6cyxvd25Qcm9wczpvfT10aGlzLnByb3BzLGk9cygiVW5sb2NrSWNvbiIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KGksbyl9fWNvbnN0IFh0PVVubG9ja0F1dGhJY29uO2Z1bmN0aW9uIGF1dGgoKXtyZXR1cm57YWZ0ZXJMb2FkKHMpe3RoaXMucm9vdEluamVjdHM9dGhpcy5yb290SW5qZWN0c3x8e30sdGhpcy5yb290SW5qZWN0cy5pbml0T0F1dGg9cy5hdXRoQWN0aW9ucy5jb25maWd1cmVBdXRoLHRoaXMucm9vdEluamVjdHMucHJlYXV0aG9yaXplQXBpS2V5PXByZWF1dGhvcml6ZUFwaUtleS5iaW5kKG51bGwscyksdGhpcy5yb290SW5qZWN0cy5wcmVhdXRob3JpemVCYXNpYz1wcmVhdXRob3JpemVCYXNpYy5iaW5kKG51bGwscyl9LGNvbXBvbmVudHM6e0xvY2tBdXRoSWNvbjpZdCxVbmxvY2tBdXRoSWNvbjpYdCxMb2NrQXV0aE9wZXJhdGlvbkljb246WXQsVW5sb2NrQXV0aE9wZXJhdGlvbkljb246WHR9LHN0YXRlUGx1Z2luczp7YXV0aDp7cmVkdWNlcnM6JHQsYWN0aW9uczpvLHNlbGVjdG9yczphLHdyYXBBY3Rpb25zOnthdXRob3JpemU6d3JhcF9hY3Rpb25zX2F1dGhvcml6ZSxsb2dvdXQ6d3JhcF9hY3Rpb25zX2xvZ291dH19LGNvbmZpZ3M6e3dyYXBBY3Rpb25zOntsb2FkZWR9fSxzcGVjOnt3cmFwQWN0aW9uczp7ZXhlY3V0ZX19fX19ZnVuY3Rpb24gcHJlYXV0aG9yaXplQmFzaWMocyxvLGksYSl7Y29uc3R7YXV0aEFjdGlvbnM6e2F1dGhvcml6ZTp1fSxzcGVjU2VsZWN0b3JzOntzcGVjSnNvbjpfLGlzT0FTMzp3fX09cyx4PXcoKT9bImNvbXBvbmVudHMiLCJzZWN1cml0eVNjaGVtZXMiXTpbInNlY3VyaXR5RGVmaW5pdGlvbnMiXSxDPV8oKS5nZXRJbihbLi4ueCxvXSk7cmV0dXJuIEM/dSh7W29dOnt2YWx1ZTp7dXNlcm5hbWU6aSxwYXNzd29yZDphfSxzY2hlbWE6Qy50b0pTKCl9fSk6bnVsbH1mdW5jdGlvbiBwcmVhdXRob3JpemVBcGlLZXkocyxvLGkpe2NvbnN0e2F1dGhBY3Rpb25zOnthdXRob3JpemU6YX0sc3BlY1NlbGVjdG9yczp7c3BlY0pzb246dSxpc09BUzM6X319PXMsdz1fKCk/WyJjb21wb25lbnRzIiwic2VjdXJpdHlTY2hlbWVzIl06WyJzZWN1cml0eURlZmluaXRpb25zIl0seD11KCkuZ2V0SW4oWy4uLncsb10pO3JldHVybiB4P2Eoe1tvXTp7dmFsdWU6aSxzY2hlbWE6eC50b0pTKCl9fSk6bnVsbH1mdW5jdGlvbiBpc05vdGhpbmcocyl7cmV0dXJuIG51bGw9PXN9dmFyIFF0PWZ1bmN0aW9uIHJlcGVhdChzLG8pe3ZhciBpLGE9IiI7Zm9yKGk9MDtpPG87aSs9MSlhKz1zO3JldHVybiBhfSxadD1mdW5jdGlvbiBpc05lZ2F0aXZlWmVybyhzKXtyZXR1cm4gMD09PXMmJk51bWJlci5ORUdBVElWRV9JTkZJTklUWT09PTEvc30sZXI9e2lzTm90aGluZyxpc09iamVjdDpmdW5jdGlvbiBqc195YW1sX2lzT2JqZWN0KHMpe3JldHVybiJvYmplY3QiPT10eXBlb2YgcyYmbnVsbCE9PXN9LHRvQXJyYXk6ZnVuY3Rpb24gdG9BcnJheShzKXtyZXR1cm4gQXJyYXkuaXNBcnJheShzKT9zOmlzTm90aGluZyhzKT9bXTpbc119LHJlcGVhdDpRdCxpc05lZ2F0aXZlWmVybzpadCxleHRlbmQ6ZnVuY3Rpb24gZXh0ZW5kKHMsbyl7dmFyIGksYSx1LF87aWYobylmb3IoaT0wLGE9KF89T2JqZWN0LmtleXMobykpLmxlbmd0aDtpPGE7aSs9MSlzW3U9X1tpXV09b1t1XTtyZXR1cm4gc319O2Z1bmN0aW9uIGZvcm1hdEVycm9yKHMsbyl7dmFyIGk9IiIsYT1zLnJlYXNvbnx8Iih1bmtub3duIHJlYXNvbikiO3JldHVybiBzLm1hcms/KHMubWFyay5uYW1lJiYoaSs9J2luICInK3MubWFyay5uYW1lKyciICcpLGkrPSIoIisocy5tYXJrLmxpbmUrMSkrIjoiKyhzLm1hcmsuY29sdW1uKzEpKyIpIiwhbyYmcy5tYXJrLnNuaXBwZXQmJihpKz0iXG5cbiIrcy5tYXJrLnNuaXBwZXQpLGErIiAiK2kpOmF9ZnVuY3Rpb24gWUFNTEV4Y2VwdGlvbiQxKHMsbyl7RXJyb3IuY2FsbCh0aGlzKSx0aGlzLm5hbWU9IllBTUxFeGNlcHRpb24iLHRoaXMucmVhc29uPXMsdGhpcy5tYXJrPW8sdGhpcy5tZXNzYWdlPWZvcm1hdEVycm9yKHRoaXMsITEpLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcik6dGhpcy5zdGFjaz0obmV3IEVycm9yKS5zdGFja3x8IiJ9WUFNTEV4Y2VwdGlvbiQxLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksWUFNTEV4Y2VwdGlvbiQxLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZQU1MRXhjZXB0aW9uJDEsWUFNTEV4Y2VwdGlvbiQxLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbiB0b1N0cmluZyhzKXtyZXR1cm4gdGhpcy5uYW1lKyI6ICIrZm9ybWF0RXJyb3IodGhpcyxzKX07dmFyIHRyPVlBTUxFeGNlcHRpb24kMTtmdW5jdGlvbiBnZXRMaW5lKHMsbyxpLGEsdSl7dmFyIF89IiIsdz0iIix4PU1hdGguZmxvb3IodS8yKS0xO3JldHVybiBhLW8+eCYmKG89YS14KyhfPSIgLi4uICIpLmxlbmd0aCksaS1hPngmJihpPWEreC0odz0iIC4uLiIpLmxlbmd0aCkse3N0cjpfK3Muc2xpY2UobyxpKS5yZXBsYWNlKC9cdC9nLCLihpIiKSt3LHBvczphLW8rXy5sZW5ndGh9fWZ1bmN0aW9uIHBhZFN0YXJ0KHMsbyl7cmV0dXJuIGVyLnJlcGVhdCgiICIsby1zLmxlbmd0aCkrc312YXIgcnI9ZnVuY3Rpb24gbWFrZVNuaXBwZXQocyxvKXtpZihvPU9iamVjdC5jcmVhdGUob3x8bnVsbCksIXMuYnVmZmVyKXJldHVybiBudWxsO28ubWF4TGVuZ3RofHwoby5tYXhMZW5ndGg9NzkpLCJudW1iZXIiIT10eXBlb2Ygby5pbmRlbnQmJihvLmluZGVudD0xKSwibnVtYmVyIiE9dHlwZW9mIG8ubGluZXNCZWZvcmUmJihvLmxpbmVzQmVmb3JlPTMpLCJudW1iZXIiIT10eXBlb2Ygby5saW5lc0FmdGVyJiYoby5saW5lc0FmdGVyPTIpO2Zvcih2YXIgaSxhPS9ccj9cbnxccnxcMC9nLHU9WzBdLF89W10sdz0tMTtpPWEuZXhlYyhzLmJ1ZmZlcik7KV8ucHVzaChpLmluZGV4KSx1LnB1c2goaS5pbmRleCtpWzBdLmxlbmd0aCkscy5wb3NpdGlvbjw9aS5pbmRleCYmdzwwJiYodz11Lmxlbmd0aC0yKTt3PDAmJih3PXUubGVuZ3RoLTEpO3ZhciB4LEMsaj0iIixMPU1hdGgubWluKHMubGluZStvLmxpbmVzQWZ0ZXIsXy5sZW5ndGgpLnRvU3RyaW5nKCkubGVuZ3RoLEI9by5tYXhMZW5ndGgtKG8uaW5kZW50K0wrMyk7Zm9yKHg9MTt4PD1vLmxpbmVzQmVmb3JlJiYhKHcteDwwKTt4KyspQz1nZXRMaW5lKHMuYnVmZmVyLHVbdy14XSxfW3cteF0scy5wb3NpdGlvbi0odVt3XS11W3cteF0pLEIpLGo9ZXIucmVwZWF0KCIgIixvLmluZGVudCkrcGFkU3RhcnQoKHMubGluZS14KzEpLnRvU3RyaW5nKCksTCkrIiB8ICIrQy5zdHIrIlxuIitqO2ZvcihDPWdldExpbmUocy5idWZmZXIsdVt3XSxfW3ddLHMucG9zaXRpb24sQiksais9ZXIucmVwZWF0KCIgIixvLmluZGVudCkrcGFkU3RhcnQoKHMubGluZSsxKS50b1N0cmluZygpLEwpKyIgfCAiK0Muc3RyKyJcbiIsais9ZXIucmVwZWF0KCItIixvLmluZGVudCtMKzMrQy5wb3MpKyJeXG4iLHg9MTt4PD1vLmxpbmVzQWZ0ZXImJiEodyt4Pj1fLmxlbmd0aCk7eCsrKUM9Z2V0TGluZShzLmJ1ZmZlcix1W3creF0sX1t3K3hdLHMucG9zaXRpb24tKHVbd10tdVt3K3hdKSxCKSxqKz1lci5yZXBlYXQoIiAiLG8uaW5kZW50KStwYWRTdGFydCgocy5saW5lK3grMSkudG9TdHJpbmcoKSxMKSsiIHwgIitDLnN0cisiXG4iO3JldHVybiBqLnJlcGxhY2UoL1xuJC8sIiIpfSxucj1bImtpbmQiLCJtdWx0aSIsInJlc29sdmUiLCJjb25zdHJ1Y3QiLCJpbnN0YW5jZU9mIiwicHJlZGljYXRlIiwicmVwcmVzZW50IiwicmVwcmVzZW50TmFtZSIsImRlZmF1bHRTdHlsZSIsInN0eWxlQWxpYXNlcyJdLHNyPVsic2NhbGFyIiwic2VxdWVuY2UiLCJtYXBwaW5nIl07dmFyIGlyPWZ1bmN0aW9uIFR5cGUkMShzLG8pe2lmKG89b3x8e30sT2JqZWN0LmtleXMobykuZm9yRWFjaCgoZnVuY3Rpb24obyl7aWYoLTE9PT1uci5pbmRleE9mKG8pKXRocm93IG5ldyB0cignVW5rbm93biBvcHRpb24gIicrbysnIiBpcyBtZXQgaW4gZGVmaW5pdGlvbiBvZiAiJytzKyciIFlBTUwgdHlwZS4nKX0pKSx0aGlzLm9wdGlvbnM9byx0aGlzLnRhZz1zLHRoaXMua2luZD1vLmtpbmR8fG51bGwsdGhpcy5yZXNvbHZlPW8ucmVzb2x2ZXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdGhpcy5jb25zdHJ1Y3Q9by5jb25zdHJ1Y3R8fGZ1bmN0aW9uKHMpe3JldHVybiBzfSx0aGlzLmluc3RhbmNlT2Y9by5pbnN0YW5jZU9mfHxudWxsLHRoaXMucHJlZGljYXRlPW8ucHJlZGljYXRlfHxudWxsLHRoaXMucmVwcmVzZW50PW8ucmVwcmVzZW50fHxudWxsLHRoaXMucmVwcmVzZW50TmFtZT1vLnJlcHJlc2VudE5hbWV8fG51bGwsdGhpcy5kZWZhdWx0U3R5bGU9by5kZWZhdWx0U3R5bGV8fG51bGwsdGhpcy5tdWx0aT1vLm11bHRpfHwhMSx0aGlzLnN0eWxlQWxpYXNlcz1mdW5jdGlvbiBjb21waWxlU3R5bGVBbGlhc2VzKHMpe3ZhciBvPXt9O3JldHVybiBudWxsIT09cyYmT2JqZWN0LmtleXMocykuZm9yRWFjaCgoZnVuY3Rpb24oaSl7c1tpXS5mb3JFYWNoKChmdW5jdGlvbihzKXtvW1N0cmluZyhzKV09aX0pKX0pKSxvfShvLnN0eWxlQWxpYXNlc3x8bnVsbCksLTE9PT1zci5pbmRleE9mKHRoaXMua2luZCkpdGhyb3cgbmV3IHRyKCdVbmtub3duIGtpbmQgIicrdGhpcy5raW5kKyciIGlzIHNwZWNpZmllZCBmb3IgIicrcysnIiBZQU1MIHR5cGUuJyl9O2Z1bmN0aW9uIGNvbXBpbGVMaXN0KHMsbyl7dmFyIGk9W107cmV0dXJuIHNbb10uZm9yRWFjaCgoZnVuY3Rpb24ocyl7dmFyIG89aS5sZW5ndGg7aS5mb3JFYWNoKChmdW5jdGlvbihpLGEpe2kudGFnPT09cy50YWcmJmkua2luZD09PXMua2luZCYmaS5tdWx0aT09PXMubXVsdGkmJihvPWEpfSkpLGlbb109c30pKSxpfWZ1bmN0aW9uIFNjaGVtYSQxKHMpe3JldHVybiB0aGlzLmV4dGVuZChzKX1TY2hlbWEkMS5wcm90b3R5cGUuZXh0ZW5kPWZ1bmN0aW9uIGV4dGVuZChzKXt2YXIgbz1bXSxpPVtdO2lmKHMgaW5zdGFuY2VvZiBpcilpLnB1c2gocyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHMpKWk9aS5jb25jYXQocyk7ZWxzZXtpZighc3x8IUFycmF5LmlzQXJyYXkocy5pbXBsaWNpdCkmJiFBcnJheS5pc0FycmF5KHMuZXhwbGljaXQpKXRocm93IG5ldyB0cigiU2NoZW1hLmV4dGVuZCBhcmd1bWVudCBzaG91bGQgYmUgYSBUeXBlLCBbIFR5cGUgXSwgb3IgYSBzY2hlbWEgZGVmaW5pdGlvbiAoeyBpbXBsaWNpdDogWy4uLl0sIGV4cGxpY2l0OiBbLi4uXSB9KSIpO3MuaW1wbGljaXQmJihvPW8uY29uY2F0KHMuaW1wbGljaXQpKSxzLmV4cGxpY2l0JiYoaT1pLmNvbmNhdChzLmV4cGxpY2l0KSl9by5mb3JFYWNoKChmdW5jdGlvbihzKXtpZighKHMgaW5zdGFuY2VvZiBpcikpdGhyb3cgbmV3IHRyKCJTcGVjaWZpZWQgbGlzdCBvZiBZQU1MIHR5cGVzIChvciBhIHNpbmdsZSBUeXBlIG9iamVjdCkgY29udGFpbnMgYSBub24tVHlwZSBvYmplY3QuIik7aWYocy5sb2FkS2luZCYmInNjYWxhciIhPT1zLmxvYWRLaW5kKXRocm93IG5ldyB0cigiVGhlcmUgaXMgYSBub24tc2NhbGFyIHR5cGUgaW4gdGhlIGltcGxpY2l0IGxpc3Qgb2YgYSBzY2hlbWEuIEltcGxpY2l0IHJlc29sdmluZyBvZiBzdWNoIHR5cGVzIGlzIG5vdCBzdXBwb3J0ZWQuIik7aWYocy5tdWx0aSl0aHJvdyBuZXcgdHIoIlRoZXJlIGlzIGEgbXVsdGkgdHlwZSBpbiB0aGUgaW1wbGljaXQgbGlzdCBvZiBhIHNjaGVtYS4gTXVsdGkgdGFncyBjYW4gb25seSBiZSBsaXN0ZWQgYXMgZXhwbGljaXQuIil9KSksaS5mb3JFYWNoKChmdW5jdGlvbihzKXtpZighKHMgaW5zdGFuY2VvZiBpcikpdGhyb3cgbmV3IHRyKCJTcGVjaWZpZWQgbGlzdCBvZiBZQU1MIHR5cGVzIChvciBhIHNpbmdsZSBUeXBlIG9iamVjdCkgY29udGFpbnMgYSBub24tVHlwZSBvYmplY3QuIil9KSk7dmFyIGE9T2JqZWN0LmNyZWF0ZShTY2hlbWEkMS5wcm90b3R5cGUpO3JldHVybiBhLmltcGxpY2l0PSh0aGlzLmltcGxpY2l0fHxbXSkuY29uY2F0KG8pLGEuZXhwbGljaXQ9KHRoaXMuZXhwbGljaXR8fFtdKS5jb25jYXQoaSksYS5jb21waWxlZEltcGxpY2l0PWNvbXBpbGVMaXN0KGEsImltcGxpY2l0IiksYS5jb21waWxlZEV4cGxpY2l0PWNvbXBpbGVMaXN0KGEsImV4cGxpY2l0IiksYS5jb21waWxlZFR5cGVNYXA9ZnVuY3Rpb24gY29tcGlsZU1hcCgpe3ZhciBzLG8saT17c2NhbGFyOnt9LHNlcXVlbmNlOnt9LG1hcHBpbmc6e30sZmFsbGJhY2s6e30sbXVsdGk6e3NjYWxhcjpbXSxzZXF1ZW5jZTpbXSxtYXBwaW5nOltdLGZhbGxiYWNrOltdfX07ZnVuY3Rpb24gY29sbGVjdFR5cGUocyl7cy5tdWx0aT8oaS5tdWx0aVtzLmtpbmRdLnB1c2gocyksaS5tdWx0aS5mYWxsYmFjay5wdXNoKHMpKTppW3Mua2luZF1bcy50YWddPWkuZmFsbGJhY2tbcy50YWddPXN9Zm9yKHM9MCxvPWFyZ3VtZW50cy5sZW5ndGg7czxvO3MrPTEpYXJndW1lbnRzW3NdLmZvckVhY2goY29sbGVjdFR5cGUpO3JldHVybiBpfShhLmNvbXBpbGVkSW1wbGljaXQsYS5jb21waWxlZEV4cGxpY2l0KSxhfTt2YXIgYXI9U2NoZW1hJDEsY3I9bmV3IGlyKCJ0YWc6eWFtbC5vcmcsMjAwMjpzdHIiLHtraW5kOiJzY2FsYXIiLGNvbnN0cnVjdDpmdW5jdGlvbihzKXtyZXR1cm4gbnVsbCE9PXM/czoiIn19KSxscj1uZXcgaXIoInRhZzp5YW1sLm9yZywyMDAyOnNlcSIse2tpbmQ6InNlcXVlbmNlIixjb25zdHJ1Y3Q6ZnVuY3Rpb24ocyl7cmV0dXJuIG51bGwhPT1zP3M6W119fSksdXI9bmV3IGlyKCJ0YWc6eWFtbC5vcmcsMjAwMjptYXAiLHtraW5kOiJtYXBwaW5nIixjb25zdHJ1Y3Q6ZnVuY3Rpb24ocyl7cmV0dXJuIG51bGwhPT1zP3M6e319fSkscHI9bmV3IGFyKHtleHBsaWNpdDpbY3IsbHIsdXJdfSk7dmFyIGRyPW5ldyBpcigidGFnOnlhbWwub3JnLDIwMDI6bnVsbCIse2tpbmQ6InNjYWxhciIscmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlWWFtbE51bGwocyl7aWYobnVsbD09PXMpcmV0dXJuITA7dmFyIG89cy5sZW5ndGg7cmV0dXJuIDE9PT1vJiYifiI9PT1zfHw0PT09byYmKCJudWxsIj09PXN8fCJOdWxsIj09PXN8fCJOVUxMIj09PXMpfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24gY29uc3RydWN0WWFtbE51bGwoKXtyZXR1cm4gbnVsbH0scHJlZGljYXRlOmZ1bmN0aW9uIGlzTnVsbChzKXtyZXR1cm4gbnVsbD09PXN9LHJlcHJlc2VudDp7Y2Fub25pY2FsOmZ1bmN0aW9uKCl7cmV0dXJuIn4ifSxsb3dlcmNhc2U6ZnVuY3Rpb24oKXtyZXR1cm4ibnVsbCJ9LHVwcGVyY2FzZTpmdW5jdGlvbigpe3JldHVybiJOVUxMIn0sY2FtZWxjYXNlOmZ1bmN0aW9uKCl7cmV0dXJuIk51bGwifSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiIifX0sZGVmYXVsdFN0eWxlOiJsb3dlcmNhc2UifSk7dmFyIGZyPW5ldyBpcigidGFnOnlhbWwub3JnLDIwMDI6Ym9vbCIse2tpbmQ6InNjYWxhciIscmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlWWFtbEJvb2xlYW4ocyl7aWYobnVsbD09PXMpcmV0dXJuITE7dmFyIG89cy5sZW5ndGg7cmV0dXJuIDQ9PT1vJiYoInRydWUiPT09c3x8IlRydWUiPT09c3x8IlRSVUUiPT09cyl8fDU9PT1vJiYoImZhbHNlIj09PXN8fCJGYWxzZSI9PT1zfHwiRkFMU0UiPT09cyl9LGNvbnN0cnVjdDpmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQm9vbGVhbihzKXtyZXR1cm4idHJ1ZSI9PT1zfHwiVHJ1ZSI9PT1zfHwiVFJVRSI9PT1zfSxwcmVkaWNhdGU6ZnVuY3Rpb24gaXNCb29sZWFuKHMpe3JldHVybiJbb2JqZWN0IEJvb2xlYW5dIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKX0scmVwcmVzZW50Ontsb3dlcmNhc2U6ZnVuY3Rpb24ocyl7cmV0dXJuIHM/InRydWUiOiJmYWxzZSJ9LHVwcGVyY2FzZTpmdW5jdGlvbihzKXtyZXR1cm4gcz8iVFJVRSI6IkZBTFNFIn0sY2FtZWxjYXNlOmZ1bmN0aW9uKHMpe3JldHVybiBzPyJUcnVlIjoiRmFsc2UifX0sZGVmYXVsdFN0eWxlOiJsb3dlcmNhc2UifSk7ZnVuY3Rpb24gaXNPY3RDb2RlKHMpe3JldHVybiA0ODw9cyYmczw9NTV9ZnVuY3Rpb24gaXNEZWNDb2RlKHMpe3JldHVybiA0ODw9cyYmczw9NTd9dmFyIG1yPW5ldyBpcigidGFnOnlhbWwub3JnLDIwMDI6aW50Iix7a2luZDoic2NhbGFyIixyZXNvbHZlOmZ1bmN0aW9uIHJlc29sdmVZYW1sSW50ZWdlcihzKXtpZihudWxsPT09cylyZXR1cm4hMTt2YXIgbyxpLGE9cy5sZW5ndGgsdT0wLF89ITE7aWYoIWEpcmV0dXJuITE7aWYoIi0iIT09KG89c1t1XSkmJiIrIiE9PW98fChvPXNbKyt1XSksIjAiPT09byl7aWYodSsxPT09YSlyZXR1cm4hMDtpZigiYiI9PT0obz1zWysrdV0pKXtmb3IodSsrO3U8YTt1KyspaWYoIl8iIT09KG89c1t1XSkpe2lmKCIwIiE9PW8mJiIxIiE9PW8pcmV0dXJuITE7Xz0hMH1yZXR1cm4gXyYmIl8iIT09b31pZigieCI9PT1vKXtmb3IodSsrO3U8YTt1KyspaWYoIl8iIT09KG89c1t1XSkpe2lmKCEoNDg8PShpPXMuY2hhckNvZGVBdCh1KSkmJmk8PTU3fHw2NTw9aSYmaTw9NzB8fDk3PD1pJiZpPD0xMDIpKXJldHVybiExO189ITB9cmV0dXJuIF8mJiJfIiE9PW99aWYoIm8iPT09byl7Zm9yKHUrKzt1PGE7dSsrKWlmKCJfIiE9PShvPXNbdV0pKXtpZighaXNPY3RDb2RlKHMuY2hhckNvZGVBdCh1KSkpcmV0dXJuITE7Xz0hMH1yZXR1cm4gXyYmIl8iIT09b319aWYoIl8iPT09bylyZXR1cm4hMTtmb3IoO3U8YTt1KyspaWYoIl8iIT09KG89c1t1XSkpe2lmKCFpc0RlY0NvZGUocy5jaGFyQ29kZUF0KHUpKSlyZXR1cm4hMTtfPSEwfXJldHVybiEoIV98fCJfIj09PW8pfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24gY29uc3RydWN0WWFtbEludGVnZXIocyl7dmFyIG8saT1zLGE9MTtpZigtMSE9PWkuaW5kZXhPZigiXyIpJiYoaT1pLnJlcGxhY2UoL18vZywiIikpLCItIiE9PShvPWlbMF0pJiYiKyIhPT1vfHwoIi0iPT09byYmKGE9LTEpLG89KGk9aS5zbGljZSgxKSlbMF0pLCIwIj09PWkpcmV0dXJuIDA7aWYoIjAiPT09byl7aWYoImIiPT09aVsxXSlyZXR1cm4gYSpwYXJzZUludChpLnNsaWNlKDIpLDIpO2lmKCJ4Ij09PWlbMV0pcmV0dXJuIGEqcGFyc2VJbnQoaS5zbGljZSgyKSwxNik7aWYoIm8iPT09aVsxXSlyZXR1cm4gYSpwYXJzZUludChpLnNsaWNlKDIpLDgpfXJldHVybiBhKnBhcnNlSW50KGksMTApfSxwcmVkaWNhdGU6ZnVuY3Rpb24gaXNJbnRlZ2VyKHMpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHMpJiZzJTE9PTAmJiFlci5pc05lZ2F0aXZlWmVybyhzKX0scmVwcmVzZW50OntiaW5hcnk6ZnVuY3Rpb24ocyl7cmV0dXJuIHM+PTA/IjBiIitzLnRvU3RyaW5nKDIpOiItMGIiK3MudG9TdHJpbmcoMikuc2xpY2UoMSl9LG9jdGFsOmZ1bmN0aW9uKHMpe3JldHVybiBzPj0wPyIwbyIrcy50b1N0cmluZyg4KToiLTBvIitzLnRvU3RyaW5nKDgpLnNsaWNlKDEpfSxkZWNpbWFsOmZ1bmN0aW9uKHMpe3JldHVybiBzLnRvU3RyaW5nKDEwKX0saGV4YWRlY2ltYWw6ZnVuY3Rpb24ocyl7cmV0dXJuIHM+PTA/IjB4IitzLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOiItMHgiK3MudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkuc2xpY2UoMSl9fSxkZWZhdWx0U3R5bGU6ImRlY2ltYWwiLHN0eWxlQWxpYXNlczp7YmluYXJ5OlsyLCJiaW4iXSxvY3RhbDpbOCwib2N0Il0sZGVjaW1hbDpbMTAsImRlYyJdLGhleGFkZWNpbWFsOlsxNiwiaGV4Il19fSksZ3I9bmV3IFJlZ0V4cCgiXig/OlstK10/KD86WzAtOV1bMC05X10qKSg/OlxcLlswLTlfXSopPyg/OltlRV1bLStdP1swLTldKyk/fFxcLlswLTlfXSsoPzpbZUVdWy0rXT9bMC05XSspP3xbLStdP1xcLig/OmluZnxJbmZ8SU5GKXxcXC4oPzpuYW58TmFOfE5BTikpJCIpO3ZhciB5cj0vXlstK10/WzAtOV0rZS87dmFyIHZyPW5ldyBpcigidGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQiLHtraW5kOiJzY2FsYXIiLHJlc29sdmU6ZnVuY3Rpb24gcmVzb2x2ZVlhbWxGbG9hdChzKXtyZXR1cm4gbnVsbCE9PXMmJiEoIWdyLnRlc3Qocyl8fCJfIj09PXNbcy5sZW5ndGgtMV0pfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24gY29uc3RydWN0WWFtbEZsb2F0KHMpe3ZhciBvLGk7cmV0dXJuIGk9Ii0iPT09KG89cy5yZXBsYWNlKC9fL2csIiIpLnRvTG93ZXJDYXNlKCkpWzBdPy0xOjEsIistIi5pbmRleE9mKG9bMF0pPj0wJiYobz1vLnNsaWNlKDEpKSwiLmluZiI9PT1vPzE9PT1pP051bWJlci5QT1NJVElWRV9JTkZJTklUWTpOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk6Ii5uYW4iPT09bz9OYU46aSpwYXJzZUZsb2F0KG8sMTApfSxwcmVkaWNhdGU6ZnVuY3Rpb24gaXNGbG9hdChzKXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKSYmKHMlMSE9MHx8ZXIuaXNOZWdhdGl2ZVplcm8ocykpfSxyZXByZXNlbnQ6ZnVuY3Rpb24gcmVwcmVzZW50WWFtbEZsb2F0KHMsbyl7dmFyIGk7aWYoaXNOYU4ocykpc3dpdGNoKG8pe2Nhc2UibG93ZXJjYXNlIjpyZXR1cm4iLm5hbiI7Y2FzZSJ1cHBlcmNhc2UiOnJldHVybiIuTkFOIjtjYXNlImNhbWVsY2FzZSI6cmV0dXJuIi5OYU4ifWVsc2UgaWYoTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZPT09cylzd2l0Y2gobyl7Y2FzZSJsb3dlcmNhc2UiOnJldHVybiIuaW5mIjtjYXNlInVwcGVyY2FzZSI6cmV0dXJuIi5JTkYiO2Nhc2UiY2FtZWxjYXNlIjpyZXR1cm4iLkluZiJ9ZWxzZSBpZihOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk9PT1zKXN3aXRjaChvKXtjYXNlImxvd2VyY2FzZSI6cmV0dXJuIi0uaW5mIjtjYXNlInVwcGVyY2FzZSI6cmV0dXJuIi0uSU5GIjtjYXNlImNhbWVsY2FzZSI6cmV0dXJuIi0uSW5mIn1lbHNlIGlmKGVyLmlzTmVnYXRpdmVaZXJvKHMpKXJldHVybiItMC4wIjtyZXR1cm4gaT1zLnRvU3RyaW5nKDEwKSx5ci50ZXN0KGkpP2kucmVwbGFjZSgiZSIsIi5lIik6aX0sZGVmYXVsdFN0eWxlOiJsb3dlcmNhc2UifSksYnI9cHIuZXh0ZW5kKHtpbXBsaWNpdDpbZHIsZnIsbXIsdnJdfSksU3I9YnIsX3I9bmV3IFJlZ0V4cCgiXihbMC05XVswLTldWzAtOV1bMC05XSktKFswLTldWzAtOV0pLShbMC05XVswLTldKSQiKSxFcj1uZXcgUmVnRXhwKCJeKFswLTldWzAtOV1bMC05XVswLTldKS0oWzAtOV1bMC05XT8pLShbMC05XVswLTldPykoPzpbVHRdfFsgXFx0XSspKFswLTldWzAtOV0/KTooWzAtOV1bMC05XSk6KFswLTldWzAtOV0pKD86XFwuKFswLTldKikpPyg/OlsgXFx0XSooWnwoWy0rXSkoWzAtOV1bMC05XT8pKD86OihbMC05XVswLTldKSk/KSk/JCIpO3ZhciB3cj1uZXcgaXIoInRhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCIse2tpbmQ6InNjYWxhciIscmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlWWFtbFRpbWVzdGFtcChzKXtyZXR1cm4gbnVsbCE9PXMmJihudWxsIT09X3IuZXhlYyhzKXx8bnVsbCE9PUVyLmV4ZWMocykpfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24gY29uc3RydWN0WWFtbFRpbWVzdGFtcChzKXt2YXIgbyxpLGEsdSxfLHcseCxDLGo9MCxMPW51bGw7aWYobnVsbD09PShvPV9yLmV4ZWMocykpJiYobz1Fci5leGVjKHMpKSxudWxsPT09byl0aHJvdyBuZXcgRXJyb3IoIkRhdGUgcmVzb2x2ZSBlcnJvciIpO2lmKGk9K29bMV0sYT0rb1syXS0xLHU9K29bM10sIW9bNF0pcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGksYSx1KSk7aWYoXz0rb1s0XSx3PStvWzVdLHg9K29bNl0sb1s3XSl7Zm9yKGo9b1s3XS5zbGljZSgwLDMpO2oubGVuZ3RoPDM7KWorPSIwIjtqPStqfXJldHVybiBvWzldJiYoTD02ZTQqKDYwKitvWzEwXSsgKyhvWzExXXx8MCkpLCItIj09PW9bOV0mJihMPS1MKSksQz1uZXcgRGF0ZShEYXRlLlVUQyhpLGEsdSxfLHcseCxqKSksTCYmQy5zZXRUaW1lKEMuZ2V0VGltZSgpLUwpLEN9LGluc3RhbmNlT2Y6RGF0ZSxyZXByZXNlbnQ6ZnVuY3Rpb24gcmVwcmVzZW50WWFtbFRpbWVzdGFtcChzKXtyZXR1cm4gcy50b0lTT1N0cmluZygpfX0pO3ZhciB4cj1uZXcgaXIoInRhZzp5YW1sLm9yZywyMDAyOm1lcmdlIix7a2luZDoic2NhbGFyIixyZXNvbHZlOmZ1bmN0aW9uIHJlc29sdmVZYW1sTWVyZ2Uocyl7cmV0dXJuIjw8Ij09PXN8fG51bGw9PT1zfX0pLGtyPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVxuXHIiO3ZhciBPcj1uZXcgaXIoInRhZzp5YW1sLm9yZywyMDAyOmJpbmFyeSIse2tpbmQ6InNjYWxhciIscmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlWWFtbEJpbmFyeShzKXtpZihudWxsPT09cylyZXR1cm4hMTt2YXIgbyxpLGE9MCx1PXMubGVuZ3RoLF89a3I7Zm9yKGk9MDtpPHU7aSsrKWlmKCEoKG89Xy5pbmRleE9mKHMuY2hhckF0KGkpKSk+NjQpKXtpZihvPDApcmV0dXJuITE7YSs9Nn1yZXR1cm4gYSU4PT0wfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24gY29uc3RydWN0WWFtbEJpbmFyeShzKXt2YXIgbyxpLGE9cy5yZXBsYWNlKC9bXHJcbj1dL2csIiIpLHU9YS5sZW5ndGgsXz1rcix3PTAseD1bXTtmb3Iobz0wO288dTtvKyspbyU0PT0wJiZvJiYoeC5wdXNoKHc+PjE2JjI1NSkseC5wdXNoKHc+PjgmMjU1KSx4LnB1c2goMjU1JncpKSx3PXc8PDZ8Xy5pbmRleE9mKGEuY2hhckF0KG8pKTtyZXR1cm4gMD09PShpPXUlNCo2KT8oeC5wdXNoKHc+PjE2JjI1NSkseC5wdXNoKHc+PjgmMjU1KSx4LnB1c2goMjU1JncpKToxOD09PWk/KHgucHVzaCh3Pj4xMCYyNTUpLHgucHVzaCh3Pj4yJjI1NSkpOjEyPT09aSYmeC5wdXNoKHc+PjQmMjU1KSxuZXcgVWludDhBcnJheSh4KX0scHJlZGljYXRlOmZ1bmN0aW9uIGlzQmluYXJ5KHMpe3JldHVybiJbb2JqZWN0IFVpbnQ4QXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKX0scmVwcmVzZW50OmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxCaW5hcnkocyl7dmFyIG8saSxhPSIiLHU9MCxfPXMubGVuZ3RoLHc9a3I7Zm9yKG89MDtvPF87bysrKW8lMz09MCYmbyYmKGErPXdbdT4+MTgmNjNdLGErPXdbdT4+MTImNjNdLGErPXdbdT4+NiY2M10sYSs9d1s2MyZ1XSksdT0odTw8OCkrc1tvXTtyZXR1cm4gMD09PShpPV8lMyk/KGErPXdbdT4+MTgmNjNdLGErPXdbdT4+MTImNjNdLGErPXdbdT4+NiY2M10sYSs9d1s2MyZ1XSk6Mj09PWk/KGErPXdbdT4+MTAmNjNdLGErPXdbdT4+NCY2M10sYSs9d1t1PDwyJjYzXSxhKz13WzY0XSk6MT09PWkmJihhKz13W3U+PjImNjNdLGErPXdbdTw8NCY2M10sYSs9d1s2NF0sYSs9d1s2NF0pLGF9fSksQXI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxDcj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3ZhciBqcj1uZXcgaXIoInRhZzp5YW1sLm9yZywyMDAyOm9tYXAiLHtraW5kOiJzZXF1ZW5jZSIscmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlWWFtbE9tYXAocyl7aWYobnVsbD09PXMpcmV0dXJuITA7dmFyIG8saSxhLHUsXyx3PVtdLHg9cztmb3Iobz0wLGk9eC5sZW5ndGg7bzxpO28rPTEpe2lmKGE9eFtvXSxfPSExLCJbb2JqZWN0IE9iamVjdF0iIT09Q3IuY2FsbChhKSlyZXR1cm4hMTtmb3IodSBpbiBhKWlmKEFyLmNhbGwoYSx1KSl7aWYoXylyZXR1cm4hMTtfPSEwfWlmKCFfKXJldHVybiExO2lmKC0xIT09dy5pbmRleE9mKHUpKXJldHVybiExO3cucHVzaCh1KX1yZXR1cm4hMH0sY29uc3RydWN0OmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxPbWFwKHMpe3JldHVybiBudWxsIT09cz9zOltdfX0pLFByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIElyPW5ldyBpcigidGFnOnlhbWwub3JnLDIwMDI6cGFpcnMiLHtraW5kOiJzZXF1ZW5jZSIscmVzb2x2ZTpmdW5jdGlvbiByZXNvbHZlWWFtbFBhaXJzKHMpe2lmKG51bGw9PT1zKXJldHVybiEwO3ZhciBvLGksYSx1LF8sdz1zO2ZvcihfPW5ldyBBcnJheSh3Lmxlbmd0aCksbz0wLGk9dy5sZW5ndGg7bzxpO28rPTEpe2lmKGE9d1tvXSwiW29iamVjdCBPYmplY3RdIiE9PVByLmNhbGwoYSkpcmV0dXJuITE7aWYoMSE9PSh1PU9iamVjdC5rZXlzKGEpKS5sZW5ndGgpcmV0dXJuITE7X1tvXT1bdVswXSxhW3VbMF1dXX1yZXR1cm4hMH0sY29uc3RydWN0OmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxQYWlycyhzKXtpZihudWxsPT09cylyZXR1cm5bXTt2YXIgbyxpLGEsdSxfLHc9cztmb3IoXz1uZXcgQXJyYXkody5sZW5ndGgpLG89MCxpPXcubGVuZ3RoO288aTtvKz0xKWE9d1tvXSx1PU9iamVjdC5rZXlzKGEpLF9bb109W3VbMF0sYVt1WzBdXV07cmV0dXJuIF99fSksVHI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgTnI9bmV3IGlyKCJ0YWc6eWFtbC5vcmcsMjAwMjpzZXQiLHtraW5kOiJtYXBwaW5nIixyZXNvbHZlOmZ1bmN0aW9uIHJlc29sdmVZYW1sU2V0KHMpe2lmKG51bGw9PT1zKXJldHVybiEwO3ZhciBvLGk9cztmb3IobyBpbiBpKWlmKFRyLmNhbGwoaSxvKSYmbnVsbCE9PWlbb10pcmV0dXJuITE7cmV0dXJuITB9LGNvbnN0cnVjdDpmdW5jdGlvbiBjb25zdHJ1Y3RZYW1sU2V0KHMpe3JldHVybiBudWxsIT09cz9zOnt9fX0pLE1yPVNyLmV4dGVuZCh7aW1wbGljaXQ6W3dyLHhyXSxleHBsaWNpdDpbT3IsanIsSXIsTnJdfSksUnI9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxEcj0vW1x4MDAtXHgwOFx4MEJceDBDXHgwRS1ceDFGXHg3Ri1ceDg0XHg4Ni1ceDlGXHVGRkZFXHVGRkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0vLExyPS9bXHg4NVx1MjAyOFx1MjAyOV0vLEZyPS9bLFxbXF1ce1x9XS8sQnI9L14oPzohfCEhfCFbYS16XC1dKyEpJC9pLCRyPS9eKD86IXxbXixcW1xdXHtcfV0pKD86JVswLTlhLWZdezJ9fFswLTlhLXpcLSM7XC9cPzpAJj1cK1wkLF9cLiF+XConXChcKVxbXF1dKSokL2k7ZnVuY3Rpb24gX2NsYXNzKHMpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocyl9ZnVuY3Rpb24gaXNfRU9MKHMpe3JldHVybiAxMD09PXN8fDEzPT09c31mdW5jdGlvbiBpc19XSElURV9TUEFDRShzKXtyZXR1cm4gOT09PXN8fDMyPT09c31mdW5jdGlvbiBpc19XU19PUl9FT0wocyl7cmV0dXJuIDk9PT1zfHwzMj09PXN8fDEwPT09c3x8MTM9PT1zfWZ1bmN0aW9uIGlzX0ZMT1dfSU5ESUNBVE9SKHMpe3JldHVybiA0ND09PXN8fDkxPT09c3x8OTM9PT1zfHwxMjM9PT1zfHwxMjU9PT1zfWZ1bmN0aW9uIGZyb21IZXhDb2RlKHMpe3ZhciBvO3JldHVybiA0ODw9cyYmczw9NTc/cy00ODo5Nzw9KG89MzJ8cykmJm88PTEwMj9vLTk3KzEwOi0xfWZ1bmN0aW9uIHNpbXBsZUVzY2FwZVNlcXVlbmNlKHMpe3JldHVybiA0OD09PXM/IlwwIjo5Nz09PXM/IgciOjk4PT09cz8iXGIiOjExNj09PXN8fDk9PT1zPyJcdCI6MTEwPT09cz8iXG4iOjExOD09PXM/Ilx2IjoxMDI9PT1zPyJcZiI6MTE0PT09cz8iXHIiOjEwMT09PXM/IhsiOjMyPT09cz8iICI6MzQ9PT1zPyciJzo0Nz09PXM/Ii8iOjkyPT09cz8iXFwiOjc4PT09cz8iwoUiOjk1PT09cz8iwqAiOjc2PT09cz8iXHUyMDI4Ijo4MD09PXM/Ilx1MjAyOSI6IiJ9ZnVuY3Rpb24gY2hhckZyb21Db2RlcG9pbnQocyl7cmV0dXJuIHM8PTY1NTM1P1N0cmluZy5mcm9tQ2hhckNvZGUocyk6U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5Nisocy02NTUzNj4+MTApLDU2MzIwKyhzLTY1NTM2JjEwMjMpKX1mdW5jdGlvbiBzZXRQcm9wZXJ0eShzLG8saSl7Il9fcHJvdG9fXyI9PT1vP09iamVjdC5kZWZpbmVQcm9wZXJ0eShzLG8se2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOml9KTpzW29dPWl9Zm9yKHZhciBxcj1uZXcgQXJyYXkoMjU2KSxVcj1uZXcgQXJyYXkoMjU2KSxWcj0wO1ZyPDI1NjtWcisrKXFyW1ZyXT1zaW1wbGVFc2NhcGVTZXF1ZW5jZShWcik/MTowLFVyW1ZyXT1zaW1wbGVFc2NhcGVTZXF1ZW5jZShWcik7ZnVuY3Rpb24gU3RhdGUkMShzLG8pe3RoaXMuaW5wdXQ9cyx0aGlzLmZpbGVuYW1lPW8uZmlsZW5hbWV8fG51bGwsdGhpcy5zY2hlbWE9by5zY2hlbWF8fE1yLHRoaXMub25XYXJuaW5nPW8ub25XYXJuaW5nfHxudWxsLHRoaXMubGVnYWN5PW8ubGVnYWN5fHwhMSx0aGlzLmpzb249by5qc29ufHwhMSx0aGlzLmxpc3RlbmVyPW8ubGlzdGVuZXJ8fG51bGwsdGhpcy5pbXBsaWNpdFR5cGVzPXRoaXMuc2NoZW1hLmNvbXBpbGVkSW1wbGljaXQsdGhpcy50eXBlTWFwPXRoaXMuc2NoZW1hLmNvbXBpbGVkVHlwZU1hcCx0aGlzLmxlbmd0aD1zLmxlbmd0aCx0aGlzLnBvc2l0aW9uPTAsdGhpcy5saW5lPTAsdGhpcy5saW5lU3RhcnQ9MCx0aGlzLmxpbmVJbmRlbnQ9MCx0aGlzLmZpcnN0VGFiSW5MaW5lPS0xLHRoaXMuZG9jdW1lbnRzPVtdfWZ1bmN0aW9uIGdlbmVyYXRlRXJyb3IocyxvKXt2YXIgaT17bmFtZTpzLmZpbGVuYW1lLGJ1ZmZlcjpzLmlucHV0LnNsaWNlKDAsLTEpLHBvc2l0aW9uOnMucG9zaXRpb24sbGluZTpzLmxpbmUsY29sdW1uOnMucG9zaXRpb24tcy5saW5lU3RhcnR9O3JldHVybiBpLnNuaXBwZXQ9cnIoaSksbmV3IHRyKG8saSl9ZnVuY3Rpb24gdGhyb3dFcnJvcihzLG8pe3Rocm93IGdlbmVyYXRlRXJyb3IocyxvKX1mdW5jdGlvbiB0aHJvd1dhcm5pbmcocyxvKXtzLm9uV2FybmluZyYmcy5vbldhcm5pbmcuY2FsbChudWxsLGdlbmVyYXRlRXJyb3IocyxvKSl9dmFyIHpyPXtZQU1MOmZ1bmN0aW9uIGhhbmRsZVlhbWxEaXJlY3RpdmUocyxvLGkpe3ZhciBhLHUsXztudWxsIT09cy52ZXJzaW9uJiZ0aHJvd0Vycm9yKHMsImR1cGxpY2F0aW9uIG9mICVZQU1MIGRpcmVjdGl2ZSIpLDEhPT1pLmxlbmd0aCYmdGhyb3dFcnJvcihzLCJZQU1MIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgb25lIGFyZ3VtZW50IiksbnVsbD09PShhPS9eKFswLTldKylcLihbMC05XSspJC8uZXhlYyhpWzBdKSkmJnRocm93RXJyb3IocywiaWxsLWZvcm1lZCBhcmd1bWVudCBvZiB0aGUgWUFNTCBkaXJlY3RpdmUiKSx1PXBhcnNlSW50KGFbMV0sMTApLF89cGFyc2VJbnQoYVsyXSwxMCksMSE9PXUmJnRocm93RXJyb3IocywidW5hY2NlcHRhYmxlIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQiKSxzLnZlcnNpb249aVswXSxzLmNoZWNrTGluZUJyZWFrcz1fPDIsMSE9PV8mJjIhPT1fJiZ0aHJvd1dhcm5pbmcocywidW5zdXBwb3J0ZWQgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCIpfSxUQUc6ZnVuY3Rpb24gaGFuZGxlVGFnRGlyZWN0aXZlKHMsbyxpKXt2YXIgYSx1OzIhPT1pLmxlbmd0aCYmdGhyb3dFcnJvcihzLCJUQUcgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSB0d28gYXJndW1lbnRzIiksYT1pWzBdLHU9aVsxXSxCci50ZXN0KGEpfHx0aHJvd0Vycm9yKHMsImlsbC1mb3JtZWQgdGFnIGhhbmRsZSAoZmlyc3QgYXJndW1lbnQpIG9mIHRoZSBUQUcgZGlyZWN0aXZlIiksUnIuY2FsbChzLnRhZ01hcCxhKSYmdGhyb3dFcnJvcihzLCd0aGVyZSBpcyBhIHByZXZpb3VzbHkgZGVjbGFyZWQgc3VmZml4IGZvciAiJythKyciIHRhZyBoYW5kbGUnKSwkci50ZXN0KHUpfHx0aHJvd0Vycm9yKHMsImlsbC1mb3JtZWQgdGFnIHByZWZpeCAoc2Vjb25kIGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZSIpO3RyeXt1PWRlY29kZVVSSUNvbXBvbmVudCh1KX1jYXRjaChvKXt0aHJvd0Vycm9yKHMsInRhZyBwcmVmaXggaXMgbWFsZm9ybWVkOiAiK3UpfXMudGFnTWFwW2FdPXV9fTtmdW5jdGlvbiBjYXB0dXJlU2VnbWVudChzLG8saSxhKXt2YXIgdSxfLHcseDtpZihvPGkpe2lmKHg9cy5pbnB1dC5zbGljZShvLGkpLGEpZm9yKHU9MCxfPXgubGVuZ3RoO3U8Xzt1Kz0xKTk9PT0odz14LmNoYXJDb2RlQXQodSkpfHwzMjw9dyYmdzw9MTExNDExMXx8dGhyb3dFcnJvcihzLCJleHBlY3RlZCB2YWxpZCBKU09OIGNoYXJhY3RlciIpO2Vsc2UgRHIudGVzdCh4KSYmdGhyb3dFcnJvcihzLCJ0aGUgc3RyZWFtIGNvbnRhaW5zIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyIpO3MucmVzdWx0Kz14fX1mdW5jdGlvbiBtZXJnZU1hcHBpbmdzKHMsbyxpLGEpe3ZhciB1LF8sdyx4O2Zvcihlci5pc09iamVjdChpKXx8dGhyb3dFcnJvcihzLCJjYW5ub3QgbWVyZ2UgbWFwcGluZ3M7IHRoZSBwcm92aWRlZCBzb3VyY2Ugb2JqZWN0IGlzIHVuYWNjZXB0YWJsZSIpLHc9MCx4PSh1PU9iamVjdC5rZXlzKGkpKS5sZW5ndGg7dzx4O3crPTEpXz11W3ddLFJyLmNhbGwobyxfKXx8KHNldFByb3BlcnR5KG8sXyxpW19dKSxhW19dPSEwKX1mdW5jdGlvbiBzdG9yZU1hcHBpbmdQYWlyKHMsbyxpLGEsdSxfLHcseCxDKXt2YXIgaixMO2lmKEFycmF5LmlzQXJyYXkodSkpZm9yKGo9MCxMPSh1PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHUpKS5sZW5ndGg7ajxMO2orPTEpQXJyYXkuaXNBcnJheSh1W2pdKSYmdGhyb3dFcnJvcihzLCJuZXN0ZWQgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBrZXlzIiksIm9iamVjdCI9PXR5cGVvZiB1JiYiW29iamVjdCBPYmplY3RdIj09PV9jbGFzcyh1W2pdKSYmKHVbal09IltvYmplY3QgT2JqZWN0XSIpO2lmKCJvYmplY3QiPT10eXBlb2YgdSYmIltvYmplY3QgT2JqZWN0XSI9PT1fY2xhc3ModSkmJih1PSJbb2JqZWN0IE9iamVjdF0iKSx1PVN0cmluZyh1KSxudWxsPT09byYmKG89e30pLCJ0YWc6eWFtbC5vcmcsMjAwMjptZXJnZSI9PT1hKWlmKEFycmF5LmlzQXJyYXkoXykpZm9yKGo9MCxMPV8ubGVuZ3RoO2o8TDtqKz0xKW1lcmdlTWFwcGluZ3MocyxvLF9bal0saSk7ZWxzZSBtZXJnZU1hcHBpbmdzKHMsbyxfLGkpO2Vsc2Ugcy5qc29ufHxSci5jYWxsKGksdSl8fCFSci5jYWxsKG8sdSl8fChzLmxpbmU9d3x8cy5saW5lLHMubGluZVN0YXJ0PXh8fHMubGluZVN0YXJ0LHMucG9zaXRpb249Q3x8cy5wb3NpdGlvbix0aHJvd0Vycm9yKHMsImR1cGxpY2F0ZWQgbWFwcGluZyBrZXkiKSksc2V0UHJvcGVydHkobyx1LF8pLGRlbGV0ZSBpW3VdO3JldHVybiBvfWZ1bmN0aW9uIHJlYWRMaW5lQnJlYWsocyl7dmFyIG87MTA9PT0obz1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbikpP3MucG9zaXRpb24rKzoxMz09PW8/KHMucG9zaXRpb24rKywxMD09PXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKSYmcy5wb3NpdGlvbisrKTp0aHJvd0Vycm9yKHMsImEgbGluZSBicmVhayBpcyBleHBlY3RlZCIpLHMubGluZSs9MSxzLmxpbmVTdGFydD1zLnBvc2l0aW9uLHMuZmlyc3RUYWJJbkxpbmU9LTF9ZnVuY3Rpb24gc2tpcFNlcGFyYXRpb25TcGFjZShzLG8saSl7Zm9yKHZhciBhPTAsdT1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbik7MCE9PXU7KXtmb3IoO2lzX1dISVRFX1NQQUNFKHUpOyk5PT09dSYmLTE9PT1zLmZpcnN0VGFiSW5MaW5lJiYocy5maXJzdFRhYkluTGluZT1zLnBvc2l0aW9uKSx1PXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pO2lmKG8mJjM1PT09dSlkb3t1PXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pfXdoaWxlKDEwIT09dSYmMTMhPT11JiYwIT09dSk7aWYoIWlzX0VPTCh1KSlicmVhaztmb3IocmVhZExpbmVCcmVhayhzKSx1PXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKSxhKysscy5saW5lSW5kZW50PTA7MzI9PT11OylzLmxpbmVJbmRlbnQrKyx1PXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pfXJldHVybi0xIT09aSYmMCE9PWEmJnMubGluZUluZGVudDxpJiZ0aHJvd1dhcm5pbmcocywiZGVmaWNpZW50IGluZGVudGF0aW9uIiksYX1mdW5jdGlvbiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Iocyl7dmFyIG8saT1zLnBvc2l0aW9uO3JldHVybiEoNDUhPT0obz1zLmlucHV0LmNoYXJDb2RlQXQoaSkpJiY0NiE9PW98fG8hPT1zLmlucHV0LmNoYXJDb2RlQXQoaSsxKXx8byE9PXMuaW5wdXQuY2hhckNvZGVBdChpKzIpfHwoaSs9MywwIT09KG89cy5pbnB1dC5jaGFyQ29kZUF0KGkpKSYmIWlzX1dTX09SX0VPTChvKSkpfWZ1bmN0aW9uIHdyaXRlRm9sZGVkTGluZXMocyxvKXsxPT09bz9zLnJlc3VsdCs9IiAiOm8+MSYmKHMucmVzdWx0Kz1lci5yZXBlYXQoIlxuIixvLTEpKX1mdW5jdGlvbiByZWFkQmxvY2tTZXF1ZW5jZShzLG8pe3ZhciBpLGEsdT1zLnRhZyxfPXMuYW5jaG9yLHc9W10seD0hMTtpZigtMSE9PXMuZmlyc3RUYWJJbkxpbmUpcmV0dXJuITE7Zm9yKG51bGwhPT1zLmFuY2hvciYmKHMuYW5jaG9yTWFwW3MuYW5jaG9yXT13KSxhPXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKTswIT09YSYmKC0xIT09cy5maXJzdFRhYkluTGluZSYmKHMucG9zaXRpb249cy5maXJzdFRhYkluTGluZSx0aHJvd0Vycm9yKHMsInRhYiBjaGFyYWN0ZXJzIG11c3Qgbm90IGJlIHVzZWQgaW4gaW5kZW50YXRpb24iKSksNDU9PT1hKSYmaXNfV1NfT1JfRU9MKHMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKzEpKTspaWYoeD0hMCxzLnBvc2l0aW9uKyssc2tpcFNlcGFyYXRpb25TcGFjZShzLCEwLC0xKSYmcy5saW5lSW5kZW50PD1vKXcucHVzaChudWxsKSxhPXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKTtlbHNlIGlmKGk9cy5saW5lLGNvbXBvc2VOb2RlKHMsbywzLCExLCEwKSx3LnB1c2gocy5yZXN1bHQpLHNraXBTZXBhcmF0aW9uU3BhY2UocywhMCwtMSksYT1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbiksKHMubGluZT09PWl8fHMubGluZUluZGVudD5vKSYmMCE9PWEpdGhyb3dFcnJvcihzLCJiYWQgaW5kZW50YXRpb24gb2YgYSBzZXF1ZW5jZSBlbnRyeSIpO2Vsc2UgaWYocy5saW5lSW5kZW50PG8pYnJlYWs7cmV0dXJuISF4JiYocy50YWc9dSxzLmFuY2hvcj1fLHMua2luZD0ic2VxdWVuY2UiLHMucmVzdWx0PXcsITApfWZ1bmN0aW9uIHJlYWRUYWdQcm9wZXJ0eShzKXt2YXIgbyxpLGEsdSxfPSExLHc9ITE7aWYoMzMhPT0odT1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbikpKXJldHVybiExO2lmKG51bGwhPT1zLnRhZyYmdGhyb3dFcnJvcihzLCJkdXBsaWNhdGlvbiBvZiBhIHRhZyBwcm9wZXJ0eSIpLDYwPT09KHU9cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbikpPyhfPSEwLHU9cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbikpOjMzPT09dT8odz0hMCxpPSIhISIsdT1zLmlucHV0LmNoYXJDb2RlQXQoKytzLnBvc2l0aW9uKSk6aT0iISIsbz1zLnBvc2l0aW9uLF8pe2Rve3U9cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbil9d2hpbGUoMCE9PXUmJjYyIT09dSk7cy5wb3NpdGlvbjxzLmxlbmd0aD8oYT1zLmlucHV0LnNsaWNlKG8scy5wb3NpdGlvbiksdT1zLmlucHV0LmNoYXJDb2RlQXQoKytzLnBvc2l0aW9uKSk6dGhyb3dFcnJvcihzLCJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHZlcmJhdGltIHRhZyIpfWVsc2V7Zm9yKDswIT09dSYmIWlzX1dTX09SX0VPTCh1KTspMzM9PT11JiYodz90aHJvd0Vycm9yKHMsInRhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZXhjbGFtYXRpb24gbWFya3MiKTooaT1zLmlucHV0LnNsaWNlKG8tMSxzLnBvc2l0aW9uKzEpLEJyLnRlc3QoaSl8fHRocm93RXJyb3IocywibmFtZWQgdGFnIGhhbmRsZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnMiKSx3PSEwLG89cy5wb3NpdGlvbisxKSksdT1zLmlucHV0LmNoYXJDb2RlQXQoKytzLnBvc2l0aW9uKTthPXMuaW5wdXQuc2xpY2UobyxzLnBvc2l0aW9uKSxGci50ZXN0KGEpJiZ0aHJvd0Vycm9yKHMsInRhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVycyIpfWEmJiEkci50ZXN0KGEpJiZ0aHJvd0Vycm9yKHMsInRhZyBuYW1lIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVyczogIithKTt0cnl7YT1kZWNvZGVVUklDb21wb25lbnQoYSl9Y2F0Y2gobyl7dGhyb3dFcnJvcihzLCJ0YWcgbmFtZSBpcyBtYWxmb3JtZWQ6ICIrYSl9cmV0dXJuIF8/cy50YWc9YTpSci5jYWxsKHMudGFnTWFwLGkpP3MudGFnPXMudGFnTWFwW2ldK2E6IiEiPT09aT9zLnRhZz0iISIrYToiISEiPT09aT9zLnRhZz0idGFnOnlhbWwub3JnLDIwMDI6IithOnRocm93RXJyb3IocywndW5kZWNsYXJlZCB0YWcgaGFuZGxlICInK2krJyInKSwhMH1mdW5jdGlvbiByZWFkQW5jaG9yUHJvcGVydHkocyl7dmFyIG8saTtpZigzOCE9PShpPXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKSkpcmV0dXJuITE7Zm9yKG51bGwhPT1zLmFuY2hvciYmdGhyb3dFcnJvcihzLCJkdXBsaWNhdGlvbiBvZiBhbiBhbmNob3IgcHJvcGVydHkiKSxpPXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pLG89cy5wb3NpdGlvbjswIT09aSYmIWlzX1dTX09SX0VPTChpKSYmIWlzX0ZMT1dfSU5ESUNBVE9SKGkpOylpPXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pO3JldHVybiBzLnBvc2l0aW9uPT09byYmdGhyb3dFcnJvcihzLCJuYW1lIG9mIGFuIGFuY2hvciBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIikscy5hbmNob3I9cy5pbnB1dC5zbGljZShvLHMucG9zaXRpb24pLCEwfWZ1bmN0aW9uIGNvbXBvc2VOb2RlKHMsbyxpLGEsdSl7dmFyIF8sdyx4LEMsaixMLEIsJCxVLFY9MSx6PSExLFk9ITE7aWYobnVsbCE9PXMubGlzdGVuZXImJnMubGlzdGVuZXIoIm9wZW4iLHMpLHMudGFnPW51bGwscy5hbmNob3I9bnVsbCxzLmtpbmQ9bnVsbCxzLnJlc3VsdD1udWxsLF89dz14PTQ9PT1pfHwzPT09aSxhJiZza2lwU2VwYXJhdGlvblNwYWNlKHMsITAsLTEpJiYoej0hMCxzLmxpbmVJbmRlbnQ+bz9WPTE6cy5saW5lSW5kZW50PT09bz9WPTA6cy5saW5lSW5kZW50PG8mJihWPS0xKSksMT09PVYpZm9yKDtyZWFkVGFnUHJvcGVydHkocyl8fHJlYWRBbmNob3JQcm9wZXJ0eShzKTspc2tpcFNlcGFyYXRpb25TcGFjZShzLCEwLC0xKT8oej0hMCx4PV8scy5saW5lSW5kZW50Pm8/Vj0xOnMubGluZUluZGVudD09PW8/Vj0wOnMubGluZUluZGVudDxvJiYoVj0tMSkpOng9ITE7aWYoeCYmKHg9enx8dSksMSE9PVYmJjQhPT1pfHwoJD0xPT09aXx8Mj09PWk/bzpvKzEsVT1zLnBvc2l0aW9uLXMubGluZVN0YXJ0LDE9PT1WP3gmJihyZWFkQmxvY2tTZXF1ZW5jZShzLFUpfHxmdW5jdGlvbiByZWFkQmxvY2tNYXBwaW5nKHMsbyxpKXt2YXIgYSx1LF8sdyx4LEMsaixMPXMudGFnLEI9cy5hbmNob3IsJD17fSxVPU9iamVjdC5jcmVhdGUobnVsbCksVj1udWxsLHo9bnVsbCxZPW51bGwsWj0hMSxlZT0hMTtpZigtMSE9PXMuZmlyc3RUYWJJbkxpbmUpcmV0dXJuITE7Zm9yKG51bGwhPT1zLmFuY2hvciYmKHMuYW5jaG9yTWFwW3MuYW5jaG9yXT0kKSxqPXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKTswIT09ajspe2lmKFp8fC0xPT09cy5maXJzdFRhYkluTGluZXx8KHMucG9zaXRpb249cy5maXJzdFRhYkluTGluZSx0aHJvd0Vycm9yKHMsInRhYiBjaGFyYWN0ZXJzIG11c3Qgbm90IGJlIHVzZWQgaW4gaW5kZW50YXRpb24iKSksYT1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbisxKSxfPXMubGluZSw2MyE9PWomJjU4IT09anx8IWlzX1dTX09SX0VPTChhKSl7aWYodz1zLmxpbmUseD1zLmxpbmVTdGFydCxDPXMucG9zaXRpb24sIWNvbXBvc2VOb2RlKHMsaSwyLCExLCEwKSlicmVhaztpZihzLmxpbmU9PT1fKXtmb3Ioaj1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbik7aXNfV0hJVEVfU1BBQ0Uoaik7KWo9cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbik7aWYoNTg9PT1qKWlzX1dTX09SX0VPTChqPXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pKXx8dGhyb3dFcnJvcihzLCJhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmciKSxaJiYoc3RvcmVNYXBwaW5nUGFpcihzLCQsVSxWLHosbnVsbCx3LHgsQyksVj16PVk9bnVsbCksZWU9ITAsWj0hMSx1PSExLFY9cy50YWcsej1zLnJlc3VsdDtlbHNle2lmKCFlZSlyZXR1cm4gcy50YWc9TCxzLmFuY2hvcj1CLCEwO3Rocm93RXJyb3IocywiY2FuIG5vdCByZWFkIGFuIGltcGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBjb2xvbiBpcyBtaXNzZWQiKX19ZWxzZXtpZighZWUpcmV0dXJuIHMudGFnPUwscy5hbmNob3I9QiwhMDt0aHJvd0Vycm9yKHMsImNhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleSIpfX1lbHNlIDYzPT09aj8oWiYmKHN0b3JlTWFwcGluZ1BhaXIocywkLFUsVix6LG51bGwsdyx4LEMpLFY9ej1ZPW51bGwpLGVlPSEwLFo9ITAsdT0hMCk6Wj8oWj0hMSx1PSEwKTp0aHJvd0Vycm9yKHMsImluY29tcGxldGUgZXhwbGljaXQgbWFwcGluZyBwYWlyOyBhIGtleSBub2RlIGlzIG1pc3NlZDsgb3IgZm9sbG93ZWQgYnkgYSBub24tdGFidWxhdGVkIGVtcHR5IGxpbmUiKSxzLnBvc2l0aW9uKz0xLGo9YTtpZigocy5saW5lPT09X3x8cy5saW5lSW5kZW50Pm8pJiYoWiYmKHc9cy5saW5lLHg9cy5saW5lU3RhcnQsQz1zLnBvc2l0aW9uKSxjb21wb3NlTm9kZShzLG8sNCwhMCx1KSYmKFo/ej1zLnJlc3VsdDpZPXMucmVzdWx0KSxafHwoc3RvcmVNYXBwaW5nUGFpcihzLCQsVSxWLHosWSx3LHgsQyksVj16PVk9bnVsbCksc2tpcFNlcGFyYXRpb25TcGFjZShzLCEwLC0xKSxqPXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKSksKHMubGluZT09PV98fHMubGluZUluZGVudD5vKSYmMCE9PWopdGhyb3dFcnJvcihzLCJiYWQgaW5kZW50YXRpb24gb2YgYSBtYXBwaW5nIGVudHJ5Iik7ZWxzZSBpZihzLmxpbmVJbmRlbnQ8bylicmVha31yZXR1cm4gWiYmc3RvcmVNYXBwaW5nUGFpcihzLCQsVSxWLHosbnVsbCx3LHgsQyksZWUmJihzLnRhZz1MLHMuYW5jaG9yPUIscy5raW5kPSJtYXBwaW5nIixzLnJlc3VsdD0kKSxlZX0ocyxVLCQpKXx8ZnVuY3Rpb24gcmVhZEZsb3dDb2xsZWN0aW9uKHMsbyl7dmFyIGksYSx1LF8sdyx4LEMsaixMLEIsJCxVLFY9ITAsej1zLnRhZyxZPXMuYW5jaG9yLFo9T2JqZWN0LmNyZWF0ZShudWxsKTtpZig5MT09PShVPXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKSkpdz05MyxqPSExLF89W107ZWxzZXtpZigxMjMhPT1VKXJldHVybiExO3c9MTI1LGo9ITAsXz17fX1mb3IobnVsbCE9PXMuYW5jaG9yJiYocy5hbmNob3JNYXBbcy5hbmNob3JdPV8pLFU9cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbik7MCE9PVU7KXtpZihza2lwU2VwYXJhdGlvblNwYWNlKHMsITAsbyksKFU9cy5pbnB1dC5jaGFyQ29kZUF0KHMucG9zaXRpb24pKT09PXcpcmV0dXJuIHMucG9zaXRpb24rKyxzLnRhZz16LHMuYW5jaG9yPVkscy5raW5kPWo/Im1hcHBpbmciOiJzZXF1ZW5jZSIscy5yZXN1bHQ9XywhMDtWPzQ0PT09VSYmdGhyb3dFcnJvcihzLCJleHBlY3RlZCB0aGUgbm9kZSBjb250ZW50LCBidXQgZm91bmQgJywnIik6dGhyb3dFcnJvcihzLCJtaXNzZWQgY29tbWEgYmV0d2VlbiBmbG93IGNvbGxlY3Rpb24gZW50cmllcyIpLCQ9bnVsbCx4PUM9ITEsNjM9PT1VJiZpc19XU19PUl9FT0wocy5pbnB1dC5jaGFyQ29kZUF0KHMucG9zaXRpb24rMSkpJiYoeD1DPSEwLHMucG9zaXRpb24rKyxza2lwU2VwYXJhdGlvblNwYWNlKHMsITAsbykpLGk9cy5saW5lLGE9cy5saW5lU3RhcnQsdT1zLnBvc2l0aW9uLGNvbXBvc2VOb2RlKHMsbywxLCExLCEwKSxCPXMudGFnLEw9cy5yZXN1bHQsc2tpcFNlcGFyYXRpb25TcGFjZShzLCEwLG8pLFU9cy5pbnB1dC5jaGFyQ29kZUF0KHMucG9zaXRpb24pLCFDJiZzLmxpbmUhPT1pfHw1OCE9PVV8fCh4PSEwLFU9cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbiksc2tpcFNlcGFyYXRpb25TcGFjZShzLCEwLG8pLGNvbXBvc2VOb2RlKHMsbywxLCExLCEwKSwkPXMucmVzdWx0KSxqP3N0b3JlTWFwcGluZ1BhaXIocyxfLFosQixMLCQsaSxhLHUpOng/Xy5wdXNoKHN0b3JlTWFwcGluZ1BhaXIocyxudWxsLFosQixMLCQsaSxhLHUpKTpfLnB1c2goTCksc2tpcFNlcGFyYXRpb25TcGFjZShzLCEwLG8pLDQ0PT09KFU9cy5pbnB1dC5jaGFyQ29kZUF0KHMucG9zaXRpb24pKT8oVj0hMCxVPXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pKTpWPSExfXRocm93RXJyb3IocywidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24iKX0ocywkKT9ZPSEwOih3JiZmdW5jdGlvbiByZWFkQmxvY2tTY2FsYXIocyxvKXt2YXIgaSxhLHUsXyx3LHg9MSxDPSExLGo9ITEsTD1vLEI9MCwkPSExO2lmKDEyND09PShfPXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKSkpYT0hMTtlbHNle2lmKDYyIT09XylyZXR1cm4hMTthPSEwfWZvcihzLmtpbmQ9InNjYWxhciIscy5yZXN1bHQ9IiI7MCE9PV87KWlmKDQzPT09KF89cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbikpfHw0NT09PV8pMT09PXg/eD00Mz09PV8/MzoyOnRocm93RXJyb3IocywicmVwZWF0IG9mIGEgY2hvbXBpbmcgbW9kZSBpZGVudGlmaWVyIik7ZWxzZXtpZighKCh1PTQ4PD0odz1fKSYmdzw9NTc/dy00ODotMSk+PTApKWJyZWFrOzA9PT11P3Rocm93RXJyb3IocywiYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZSIpOmo/dGhyb3dFcnJvcihzLCJyZXBlYXQgb2YgYW4gaW5kZW50YXRpb24gd2lkdGggaWRlbnRpZmllciIpOihMPW8rdS0xLGo9ITApfWlmKGlzX1dISVRFX1NQQUNFKF8pKXtkb3tfPXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pfXdoaWxlKGlzX1dISVRFX1NQQUNFKF8pKTtpZigzNT09PV8pZG97Xz1zLmlucHV0LmNoYXJDb2RlQXQoKytzLnBvc2l0aW9uKX13aGlsZSghaXNfRU9MKF8pJiYwIT09Xyl9Zm9yKDswIT09Xzspe2ZvcihyZWFkTGluZUJyZWFrKHMpLHMubGluZUluZGVudD0wLF89cy5pbnB1dC5jaGFyQ29kZUF0KHMucG9zaXRpb24pOyghanx8cy5saW5lSW5kZW50PEwpJiYzMj09PV87KXMubGluZUluZGVudCsrLF89cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbik7aWYoIWomJnMubGluZUluZGVudD5MJiYoTD1zLmxpbmVJbmRlbnQpLGlzX0VPTChfKSlCKys7ZWxzZXtpZihzLmxpbmVJbmRlbnQ8TCl7Mz09PXg/cy5yZXN1bHQrPWVyLnJlcGVhdCgiXG4iLEM/MStCOkIpOjE9PT14JiZDJiYocy5yZXN1bHQrPSJcbiIpO2JyZWFrfWZvcihhP2lzX1dISVRFX1NQQUNFKF8pPygkPSEwLHMucmVzdWx0Kz1lci5yZXBlYXQoIlxuIixDPzErQjpCKSk6JD8oJD0hMSxzLnJlc3VsdCs9ZXIucmVwZWF0KCJcbiIsQisxKSk6MD09PUI/QyYmKHMucmVzdWx0Kz0iICIpOnMucmVzdWx0Kz1lci5yZXBlYXQoIlxuIixCKTpzLnJlc3VsdCs9ZXIucmVwZWF0KCJcbiIsQz8xK0I6QiksQz0hMCxqPSEwLEI9MCxpPXMucG9zaXRpb247IWlzX0VPTChfKSYmMCE9PV87KV89cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbik7Y2FwdHVyZVNlZ21lbnQocyxpLHMucG9zaXRpb24sITEpfX1yZXR1cm4hMH0ocywkKXx8ZnVuY3Rpb24gcmVhZFNpbmdsZVF1b3RlZFNjYWxhcihzLG8pe3ZhciBpLGEsdTtpZigzOSE9PShpPXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKSkpcmV0dXJuITE7Zm9yKHMua2luZD0ic2NhbGFyIixzLnJlc3VsdD0iIixzLnBvc2l0aW9uKyssYT11PXMucG9zaXRpb247MCE9PShpPXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKSk7KWlmKDM5PT09aSl7aWYoY2FwdHVyZVNlZ21lbnQocyxhLHMucG9zaXRpb24sITApLDM5IT09KGk9cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbikpKXJldHVybiEwO2E9cy5wb3NpdGlvbixzLnBvc2l0aW9uKyssdT1zLnBvc2l0aW9ufWVsc2UgaXNfRU9MKGkpPyhjYXB0dXJlU2VnbWVudChzLGEsdSwhMCksd3JpdGVGb2xkZWRMaW5lcyhzLHNraXBTZXBhcmF0aW9uU3BhY2UocywhMSxvKSksYT11PXMucG9zaXRpb24pOnMucG9zaXRpb249PT1zLmxpbmVTdGFydCYmdGVzdERvY3VtZW50U2VwYXJhdG9yKHMpP3Rocm93RXJyb3IocywidW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyIik6KHMucG9zaXRpb24rKyx1PXMucG9zaXRpb24pO3Rocm93RXJyb3IocywidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhciIpfShzLCQpfHxmdW5jdGlvbiByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHMsbyl7dmFyIGksYSx1LF8sdyx4LEM7aWYoMzQhPT0oeD1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbikpKXJldHVybiExO2ZvcihzLmtpbmQ9InNjYWxhciIscy5yZXN1bHQ9IiIscy5wb3NpdGlvbisrLGk9YT1zLnBvc2l0aW9uOzAhPT0oeD1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbikpOyl7aWYoMzQ9PT14KXJldHVybiBjYXB0dXJlU2VnbWVudChzLGkscy5wb3NpdGlvbiwhMCkscy5wb3NpdGlvbisrLCEwO2lmKDkyPT09eCl7aWYoY2FwdHVyZVNlZ21lbnQocyxpLHMucG9zaXRpb24sITApLGlzX0VPTCh4PXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pKSlza2lwU2VwYXJhdGlvblNwYWNlKHMsITEsbyk7ZWxzZSBpZih4PDI1NiYmcXJbeF0pcy5yZXN1bHQrPVVyW3hdLHMucG9zaXRpb24rKztlbHNlIGlmKCh3PTEyMD09PShDPXgpPzI6MTE3PT09Qz80Ojg1PT09Qz84OjApPjApe2Zvcih1PXcsXz0wO3U+MDt1LS0pKHc9ZnJvbUhleENvZGUoeD1zLmlucHV0LmNoYXJDb2RlQXQoKytzLnBvc2l0aW9uKSkpPj0wP189KF88PDQpK3c6dGhyb3dFcnJvcihzLCJleHBlY3RlZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIiKTtzLnJlc3VsdCs9Y2hhckZyb21Db2RlcG9pbnQoXykscy5wb3NpdGlvbisrfWVsc2UgdGhyb3dFcnJvcihzLCJ1bmtub3duIGVzY2FwZSBzZXF1ZW5jZSIpO2k9YT1zLnBvc2l0aW9ufWVsc2UgaXNfRU9MKHgpPyhjYXB0dXJlU2VnbWVudChzLGksYSwhMCksd3JpdGVGb2xkZWRMaW5lcyhzLHNraXBTZXBhcmF0aW9uU3BhY2UocywhMSxvKSksaT1hPXMucG9zaXRpb24pOnMucG9zaXRpb249PT1zLmxpbmVTdGFydCYmdGVzdERvY3VtZW50U2VwYXJhdG9yKHMpP3Rocm93RXJyb3IocywidW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyIik6KHMucG9zaXRpb24rKyxhPXMucG9zaXRpb24pfXRocm93RXJyb3IocywidW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhciIpfShzLCQpP1k9ITA6IWZ1bmN0aW9uIHJlYWRBbGlhcyhzKXt2YXIgbyxpLGE7aWYoNDIhPT0oYT1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbikpKXJldHVybiExO2ZvcihhPXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pLG89cy5wb3NpdGlvbjswIT09YSYmIWlzX1dTX09SX0VPTChhKSYmIWlzX0ZMT1dfSU5ESUNBVE9SKGEpOylhPXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pO3JldHVybiBzLnBvc2l0aW9uPT09byYmdGhyb3dFcnJvcihzLCJuYW1lIG9mIGFuIGFsaWFzIG5vZGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIiKSxpPXMuaW5wdXQuc2xpY2UobyxzLnBvc2l0aW9uKSxSci5jYWxsKHMuYW5jaG9yTWFwLGkpfHx0aHJvd0Vycm9yKHMsJ3VuaWRlbnRpZmllZCBhbGlhcyAiJytpKyciJykscy5yZXN1bHQ9cy5hbmNob3JNYXBbaV0sc2tpcFNlcGFyYXRpb25TcGFjZShzLCEwLC0xKSwhMH0ocyk/ZnVuY3Rpb24gcmVhZFBsYWluU2NhbGFyKHMsbyxpKXt2YXIgYSx1LF8sdyx4LEMsaixMLEI9cy5raW5kLCQ9cy5yZXN1bHQ7aWYoaXNfV1NfT1JfRU9MKEw9cy5pbnB1dC5jaGFyQ29kZUF0KHMucG9zaXRpb24pKXx8aXNfRkxPV19JTkRJQ0FUT1IoTCl8fDM1PT09THx8Mzg9PT1MfHw0Mj09PUx8fDMzPT09THx8MTI0PT09THx8NjI9PT1MfHwzOT09PUx8fDM0PT09THx8Mzc9PT1MfHw2ND09PUx8fDk2PT09TClyZXR1cm4hMTtpZigoNjM9PT1MfHw0NT09PUwpJiYoaXNfV1NfT1JfRU9MKGE9cy5pbnB1dC5jaGFyQ29kZUF0KHMucG9zaXRpb24rMSkpfHxpJiZpc19GTE9XX0lORElDQVRPUihhKSkpcmV0dXJuITE7Zm9yKHMua2luZD0ic2NhbGFyIixzLnJlc3VsdD0iIix1PV89cy5wb3NpdGlvbix3PSExOzAhPT1MOyl7aWYoNTg9PT1MKXtpZihpc19XU19PUl9FT0woYT1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbisxKSl8fGkmJmlzX0ZMT1dfSU5ESUNBVE9SKGEpKWJyZWFrfWVsc2UgaWYoMzU9PT1MKXtpZihpc19XU19PUl9FT0wocy5pbnB1dC5jaGFyQ29kZUF0KHMucG9zaXRpb24tMSkpKWJyZWFrfWVsc2V7aWYocy5wb3NpdGlvbj09PXMubGluZVN0YXJ0JiZ0ZXN0RG9jdW1lbnRTZXBhcmF0b3Iocyl8fGkmJmlzX0ZMT1dfSU5ESUNBVE9SKEwpKWJyZWFrO2lmKGlzX0VPTChMKSl7aWYoeD1zLmxpbmUsQz1zLmxpbmVTdGFydCxqPXMubGluZUluZGVudCxza2lwU2VwYXJhdGlvblNwYWNlKHMsITEsLTEpLHMubGluZUluZGVudD49byl7dz0hMCxMPXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKTtjb250aW51ZX1zLnBvc2l0aW9uPV8scy5saW5lPXgscy5saW5lU3RhcnQ9QyxzLmxpbmVJbmRlbnQ9ajticmVha319dyYmKGNhcHR1cmVTZWdtZW50KHMsdSxfLCExKSx3cml0ZUZvbGRlZExpbmVzKHMscy5saW5lLXgpLHU9Xz1zLnBvc2l0aW9uLHc9ITEpLGlzX1dISVRFX1NQQUNFKEwpfHwoXz1zLnBvc2l0aW9uKzEpLEw9cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbil9cmV0dXJuIGNhcHR1cmVTZWdtZW50KHMsdSxfLCExKSwhIXMucmVzdWx0fHwocy5raW5kPUIscy5yZXN1bHQ9JCwhMSl9KHMsJCwxPT09aSkmJihZPSEwLG51bGw9PT1zLnRhZyYmKHMudGFnPSI/IikpOihZPSEwLG51bGw9PT1zLnRhZyYmbnVsbD09PXMuYW5jaG9yfHx0aHJvd0Vycm9yKHMsImFsaWFzIG5vZGUgc2hvdWxkIG5vdCBoYXZlIGFueSBwcm9wZXJ0aWVzIikpLG51bGwhPT1zLmFuY2hvciYmKHMuYW5jaG9yTWFwW3MuYW5jaG9yXT1zLnJlc3VsdCkpOjA9PT1WJiYoWT14JiZyZWFkQmxvY2tTZXF1ZW5jZShzLFUpKSksbnVsbD09PXMudGFnKW51bGwhPT1zLmFuY2hvciYmKHMuYW5jaG9yTWFwW3MuYW5jaG9yXT1zLnJlc3VsdCk7ZWxzZSBpZigiPyI9PT1zLnRhZyl7Zm9yKG51bGwhPT1zLnJlc3VsdCYmInNjYWxhciIhPT1zLmtpbmQmJnRocm93RXJyb3IocywndW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITw/PiB0YWc7IGl0IHNob3VsZCBiZSAic2NhbGFyIiwgbm90ICInK3Mua2luZCsnIicpLEM9MCxqPXMuaW1wbGljaXRUeXBlcy5sZW5ndGg7QzxqO0MrPTEpaWYoKEI9cy5pbXBsaWNpdFR5cGVzW0NdKS5yZXNvbHZlKHMucmVzdWx0KSl7cy5yZXN1bHQ9Qi5jb25zdHJ1Y3Qocy5yZXN1bHQpLHMudGFnPUIudGFnLG51bGwhPT1zLmFuY2hvciYmKHMuYW5jaG9yTWFwW3MuYW5jaG9yXT1zLnJlc3VsdCk7YnJlYWt9fWVsc2UgaWYoIiEiIT09cy50YWcpe2lmKFJyLmNhbGwocy50eXBlTWFwW3Mua2luZHx8ImZhbGxiYWNrIl0scy50YWcpKUI9cy50eXBlTWFwW3Mua2luZHx8ImZhbGxiYWNrIl1bcy50YWddO2Vsc2UgZm9yKEI9bnVsbCxDPTAsaj0oTD1zLnR5cGVNYXAubXVsdGlbcy5raW5kfHwiZmFsbGJhY2siXSkubGVuZ3RoO0M8ajtDKz0xKWlmKHMudGFnLnNsaWNlKDAsTFtDXS50YWcubGVuZ3RoKT09PUxbQ10udGFnKXtCPUxbQ107YnJlYWt9Qnx8dGhyb3dFcnJvcihzLCJ1bmtub3duIHRhZyAhPCIrcy50YWcrIj4iKSxudWxsIT09cy5yZXN1bHQmJkIua2luZCE9PXMua2luZCYmdGhyb3dFcnJvcihzLCJ1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPCIrcy50YWcrJz4gdGFnOyBpdCBzaG91bGQgYmUgIicrQi5raW5kKyciLCBub3QgIicrcy5raW5kKyciJyksQi5yZXNvbHZlKHMucmVzdWx0LHMudGFnKT8ocy5yZXN1bHQ9Qi5jb25zdHJ1Y3Qocy5yZXN1bHQscy50YWcpLG51bGwhPT1zLmFuY2hvciYmKHMuYW5jaG9yTWFwW3MuYW5jaG9yXT1zLnJlc3VsdCkpOnRocm93RXJyb3IocywiY2Fubm90IHJlc29sdmUgYSBub2RlIHdpdGggITwiK3MudGFnKyI+IGV4cGxpY2l0IHRhZyIpfXJldHVybiBudWxsIT09cy5saXN0ZW5lciYmcy5saXN0ZW5lcigiY2xvc2UiLHMpLG51bGwhPT1zLnRhZ3x8bnVsbCE9PXMuYW5jaG9yfHxZfWZ1bmN0aW9uIHJlYWREb2N1bWVudChzKXt2YXIgbyxpLGEsdSxfPXMucG9zaXRpb24sdz0hMTtmb3Iocy52ZXJzaW9uPW51bGwscy5jaGVja0xpbmVCcmVha3M9cy5sZWdhY3kscy50YWdNYXA9T2JqZWN0LmNyZWF0ZShudWxsKSxzLmFuY2hvck1hcD1PYmplY3QuY3JlYXRlKG51bGwpOzAhPT0odT1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbikpJiYoc2tpcFNlcGFyYXRpb25TcGFjZShzLCEwLC0xKSx1PXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKSwhKHMubGluZUluZGVudD4wfHwzNyE9PXUpKTspe2Zvcih3PSEwLHU9cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbiksbz1zLnBvc2l0aW9uOzAhPT11JiYhaXNfV1NfT1JfRU9MKHUpOyl1PXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pO2ZvcihhPVtdLChpPXMuaW5wdXQuc2xpY2UobyxzLnBvc2l0aW9uKSkubGVuZ3RoPDEmJnRocm93RXJyb3IocywiZGlyZWN0aXZlIG5hbWUgbXVzdCBub3QgYmUgbGVzcyB0aGFuIG9uZSBjaGFyYWN0ZXIgaW4gbGVuZ3RoIik7MCE9PXU7KXtmb3IoO2lzX1dISVRFX1NQQUNFKHUpOyl1PXMuaW5wdXQuY2hhckNvZGVBdCgrK3MucG9zaXRpb24pO2lmKDM1PT09dSl7ZG97dT1zLmlucHV0LmNoYXJDb2RlQXQoKytzLnBvc2l0aW9uKX13aGlsZSgwIT09dSYmIWlzX0VPTCh1KSk7YnJlYWt9aWYoaXNfRU9MKHUpKWJyZWFrO2ZvcihvPXMucG9zaXRpb247MCE9PXUmJiFpc19XU19PUl9FT0wodSk7KXU9cy5pbnB1dC5jaGFyQ29kZUF0KCsrcy5wb3NpdGlvbik7YS5wdXNoKHMuaW5wdXQuc2xpY2UobyxzLnBvc2l0aW9uKSl9MCE9PXUmJnJlYWRMaW5lQnJlYWsocyksUnIuY2FsbCh6cixpKT96cltpXShzLGksYSk6dGhyb3dXYXJuaW5nKHMsJ3Vua25vd24gZG9jdW1lbnQgZGlyZWN0aXZlICInK2krJyInKX1za2lwU2VwYXJhdGlvblNwYWNlKHMsITAsLTEpLDA9PT1zLmxpbmVJbmRlbnQmJjQ1PT09cy5pbnB1dC5jaGFyQ29kZUF0KHMucG9zaXRpb24pJiY0NT09PXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKzEpJiY0NT09PXMuaW5wdXQuY2hhckNvZGVBdChzLnBvc2l0aW9uKzIpPyhzLnBvc2l0aW9uKz0zLHNraXBTZXBhcmF0aW9uU3BhY2UocywhMCwtMSkpOncmJnRocm93RXJyb3IocywiZGlyZWN0aXZlcyBlbmQgbWFyayBpcyBleHBlY3RlZCIpLGNvbXBvc2VOb2RlKHMscy5saW5lSW5kZW50LTEsNCwhMSwhMCksc2tpcFNlcGFyYXRpb25TcGFjZShzLCEwLC0xKSxzLmNoZWNrTGluZUJyZWFrcyYmTHIudGVzdChzLmlucHV0LnNsaWNlKF8scy5wb3NpdGlvbikpJiZ0aHJvd1dhcm5pbmcocywibm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50Iikscy5kb2N1bWVudHMucHVzaChzLnJlc3VsdCkscy5wb3NpdGlvbj09PXMubGluZVN0YXJ0JiZ0ZXN0RG9jdW1lbnRTZXBhcmF0b3Iocyk/NDY9PT1zLmlucHV0LmNoYXJDb2RlQXQocy5wb3NpdGlvbikmJihzLnBvc2l0aW9uKz0zLHNraXBTZXBhcmF0aW9uU3BhY2UocywhMCwtMSkpOnMucG9zaXRpb248cy5sZW5ndGgtMSYmdGhyb3dFcnJvcihzLCJlbmQgb2YgdGhlIHN0cmVhbSBvciBhIGRvY3VtZW50IHNlcGFyYXRvciBpcyBleHBlY3RlZCIpfWZ1bmN0aW9uIGxvYWREb2N1bWVudHMocyxvKXtvPW98fHt9LDAhPT0ocz1TdHJpbmcocykpLmxlbmd0aCYmKDEwIT09cy5jaGFyQ29kZUF0KHMubGVuZ3RoLTEpJiYxMyE9PXMuY2hhckNvZGVBdChzLmxlbmd0aC0xKSYmKHMrPSJcbiIpLDY1Mjc5PT09cy5jaGFyQ29kZUF0KDApJiYocz1zLnNsaWNlKDEpKSk7dmFyIGk9bmV3IFN0YXRlJDEocyxvKSxhPXMuaW5kZXhPZigiXDAiKTtmb3IoLTEhPT1hJiYoaS5wb3NpdGlvbj1hLHRocm93RXJyb3IoaSwibnVsbCBieXRlIGlzIG5vdCBhbGxvd2VkIGluIGlucHV0IikpLGkuaW5wdXQrPSJcMCI7MzI9PT1pLmlucHV0LmNoYXJDb2RlQXQoaS5wb3NpdGlvbik7KWkubGluZUluZGVudCs9MSxpLnBvc2l0aW9uKz0xO2Zvcig7aS5wb3NpdGlvbjxpLmxlbmd0aC0xOylyZWFkRG9jdW1lbnQoaSk7cmV0dXJuIGkuZG9jdW1lbnRzfXZhciBXcj17bG9hZEFsbDpmdW5jdGlvbiBsb2FkQWxsJDEocyxvLGkpe251bGwhPT1vJiYib2JqZWN0Ij09dHlwZW9mIG8mJnZvaWQgMD09PWkmJihpPW8sbz1udWxsKTt2YXIgYT1sb2FkRG9jdW1lbnRzKHMsaSk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG8pcmV0dXJuIGE7Zm9yKHZhciB1PTAsXz1hLmxlbmd0aDt1PF87dSs9MSlvKGFbdV0pfSxsb2FkOmZ1bmN0aW9uIGxvYWQkMShzLG8pe3ZhciBpPWxvYWREb2N1bWVudHMocyxvKTtpZigwIT09aS5sZW5ndGgpe2lmKDE9PT1pLmxlbmd0aClyZXR1cm4gaVswXTt0aHJvdyBuZXcgdHIoImV4cGVjdGVkIGEgc2luZ2xlIGRvY3VtZW50IGluIHRoZSBzdHJlYW0sIGJ1dCBmb3VuZCBtb3JlIil9fX0sSnI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxIcj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEtyPTY1Mjc5LEdyPXswOiJcXDAiLDc6IlxcYSIsODoiXFxiIiw5OiJcXHQiLDEwOiJcXG4iLDExOiJcXHYiLDEyOiJcXGYiLDEzOiJcXHIiLDI3OiJcXGUiLDM0OidcXCInLDkyOiJcXFxcIiwxMzM6IlxcTiIsMTYwOiJcXF8iLDgyMzI6IlxcTCIsODIzMzoiXFxQIn0sWXI9WyJ5IiwiWSIsInllcyIsIlllcyIsIllFUyIsIm9uIiwiT24iLCJPTiIsIm4iLCJOIiwibm8iLCJObyIsIk5PIiwib2ZmIiwiT2ZmIiwiT0ZGIl0sWHI9L15bLStdP1swLTlfXSsoPzo6WzAtOV9dKykrKD86XC5bMC05X10qKT8kLztmdW5jdGlvbiBlbmNvZGVIZXgocyl7dmFyIG8saSxhO2lmKG89cy50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSxzPD0yNTUpaT0ieCIsYT0yO2Vsc2UgaWYoczw9NjU1MzUpaT0idSIsYT00O2Vsc2V7aWYoIShzPD00Mjk0OTY3Mjk1KSl0aHJvdyBuZXcgdHIoImNvZGUgcG9pbnQgd2l0aGluIGEgc3RyaW5nIG1heSBub3QgYmUgZ3JlYXRlciB0aGFuIDB4RkZGRkZGRkYiKTtpPSJVIixhPTh9cmV0dXJuIlxcIitpK2VyLnJlcGVhdCgiMCIsYS1vLmxlbmd0aCkrb31mdW5jdGlvbiBTdGF0ZShzKXt0aGlzLnNjaGVtYT1zLnNjaGVtYXx8TXIsdGhpcy5pbmRlbnQ9TWF0aC5tYXgoMSxzLmluZGVudHx8MiksdGhpcy5ub0FycmF5SW5kZW50PXMubm9BcnJheUluZGVudHx8ITEsdGhpcy5za2lwSW52YWxpZD1zLnNraXBJbnZhbGlkfHwhMSx0aGlzLmZsb3dMZXZlbD1lci5pc05vdGhpbmcocy5mbG93TGV2ZWwpPy0xOnMuZmxvd0xldmVsLHRoaXMuc3R5bGVNYXA9ZnVuY3Rpb24gY29tcGlsZVN0eWxlTWFwKHMsbyl7dmFyIGksYSx1LF8sdyx4LEM7aWYobnVsbD09PW8pcmV0dXJue307Zm9yKGk9e30sdT0wLF89KGE9T2JqZWN0LmtleXMobykpLmxlbmd0aDt1PF87dSs9MSl3PWFbdV0seD1TdHJpbmcob1t3XSksIiEhIj09PXcuc2xpY2UoMCwyKSYmKHc9InRhZzp5YW1sLm9yZywyMDAyOiIrdy5zbGljZSgyKSksKEM9cy5jb21waWxlZFR5cGVNYXAuZmFsbGJhY2tbd10pJiZIci5jYWxsKEMuc3R5bGVBbGlhc2VzLHgpJiYoeD1DLnN0eWxlQWxpYXNlc1t4XSksaVt3XT14O3JldHVybiBpfSh0aGlzLnNjaGVtYSxzLnN0eWxlc3x8bnVsbCksdGhpcy5zb3J0S2V5cz1zLnNvcnRLZXlzfHwhMSx0aGlzLmxpbmVXaWR0aD1zLmxpbmVXaWR0aHx8ODAsdGhpcy5ub1JlZnM9cy5ub1JlZnN8fCExLHRoaXMubm9Db21wYXRNb2RlPXMubm9Db21wYXRNb2RlfHwhMSx0aGlzLmNvbmRlbnNlRmxvdz1zLmNvbmRlbnNlRmxvd3x8ITEsdGhpcy5xdW90aW5nVHlwZT0nIic9PT1zLnF1b3RpbmdUeXBlPzI6MSx0aGlzLmZvcmNlUXVvdGVzPXMuZm9yY2VRdW90ZXN8fCExLHRoaXMucmVwbGFjZXI9ImZ1bmN0aW9uIj09dHlwZW9mIHMucmVwbGFjZXI/cy5yZXBsYWNlcjpudWxsLHRoaXMuaW1wbGljaXRUeXBlcz10aGlzLnNjaGVtYS5jb21waWxlZEltcGxpY2l0LHRoaXMuZXhwbGljaXRUeXBlcz10aGlzLnNjaGVtYS5jb21waWxlZEV4cGxpY2l0LHRoaXMudGFnPW51bGwsdGhpcy5yZXN1bHQ9IiIsdGhpcy5kdXBsaWNhdGVzPVtdLHRoaXMudXNlZER1cGxpY2F0ZXM9bnVsbH1mdW5jdGlvbiBpbmRlbnRTdHJpbmcocyxvKXtmb3IodmFyIGksYT1lci5yZXBlYXQoIiAiLG8pLHU9MCxfPS0xLHc9IiIseD1zLmxlbmd0aDt1PHg7KS0xPT09KF89cy5pbmRleE9mKCJcbiIsdSkpPyhpPXMuc2xpY2UodSksdT14KTooaT1zLnNsaWNlKHUsXysxKSx1PV8rMSksaS5sZW5ndGgmJiJcbiIhPT1pJiYodys9YSksdys9aTtyZXR1cm4gd31mdW5jdGlvbiBnZW5lcmF0ZU5leHRMaW5lKHMsbyl7cmV0dXJuIlxuIitlci5yZXBlYXQoIiAiLHMuaW5kZW50Km8pfWZ1bmN0aW9uIGlzV2hpdGVzcGFjZShzKXtyZXR1cm4gMzI9PT1zfHw5PT09c31mdW5jdGlvbiBpc1ByaW50YWJsZShzKXtyZXR1cm4gMzI8PXMmJnM8PTEyNnx8MTYxPD1zJiZzPD01NTI5NSYmODIzMiE9PXMmJjgyMzMhPT1zfHw1NzM0NDw9cyYmczw9NjU1MzMmJnMhPT1Lcnx8NjU1MzY8PXMmJnM8PTExMTQxMTF9ZnVuY3Rpb24gaXNOc0NoYXJPcldoaXRlc3BhY2Uocyl7cmV0dXJuIGlzUHJpbnRhYmxlKHMpJiZzIT09S3ImJjEzIT09cyYmMTAhPT1zfWZ1bmN0aW9uIGlzUGxhaW5TYWZlKHMsbyxpKXt2YXIgYT1pc05zQ2hhck9yV2hpdGVzcGFjZShzKSx1PWEmJiFpc1doaXRlc3BhY2Uocyk7cmV0dXJuKGk/YTphJiY0NCE9PXMmJjkxIT09cyYmOTMhPT1zJiYxMjMhPT1zJiYxMjUhPT1zKSYmMzUhPT1zJiYhKDU4PT09byYmIXUpfHxpc05zQ2hhck9yV2hpdGVzcGFjZShvKSYmIWlzV2hpdGVzcGFjZShvKSYmMzU9PT1zfHw1OD09PW8mJnV9ZnVuY3Rpb24gY29kZVBvaW50QXQocyxvKXt2YXIgaSxhPXMuY2hhckNvZGVBdChvKTtyZXR1cm4gYT49NTUyOTYmJmE8PTU2MzE5JiZvKzE8cy5sZW5ndGgmJihpPXMuY2hhckNvZGVBdChvKzEpKT49NTYzMjAmJmk8PTU3MzQzPzEwMjQqKGEtNTUyOTYpK2ktNTYzMjArNjU1MzY6YX1mdW5jdGlvbiBuZWVkSW5kZW50SW5kaWNhdG9yKHMpe3JldHVybi9eXG4qIC8udGVzdChzKX1mdW5jdGlvbiBjaG9vc2VTY2FsYXJTdHlsZShzLG8saSxhLHUsXyx3LHgpe3ZhciBDLGo9MCxMPW51bGwsQj0hMSwkPSExLFU9LTEhPT1hLFY9LTEsej1mdW5jdGlvbiBpc1BsYWluU2FmZUZpcnN0KHMpe3JldHVybiBpc1ByaW50YWJsZShzKSYmcyE9PUtyJiYhaXNXaGl0ZXNwYWNlKHMpJiY0NSE9PXMmJjYzIT09cyYmNTghPT1zJiY0NCE9PXMmJjkxIT09cyYmOTMhPT1zJiYxMjMhPT1zJiYxMjUhPT1zJiYzNSE9PXMmJjM4IT09cyYmNDIhPT1zJiYzMyE9PXMmJjEyNCE9PXMmJjYxIT09cyYmNjIhPT1zJiYzOSE9PXMmJjM0IT09cyYmMzchPT1zJiY2NCE9PXMmJjk2IT09c30oY29kZVBvaW50QXQocywwKSkmJmZ1bmN0aW9uIGlzUGxhaW5TYWZlTGFzdChzKXtyZXR1cm4haXNXaGl0ZXNwYWNlKHMpJiY1OCE9PXN9KGNvZGVQb2ludEF0KHMscy5sZW5ndGgtMSkpO2lmKG98fHcpZm9yKEM9MDtDPHMubGVuZ3RoO2o+PTY1NTM2P0MrPTI6QysrKXtpZighaXNQcmludGFibGUoaj1jb2RlUG9pbnRBdChzLEMpKSlyZXR1cm4gNTt6PXomJmlzUGxhaW5TYWZlKGosTCx4KSxMPWp9ZWxzZXtmb3IoQz0wO0M8cy5sZW5ndGg7aj49NjU1MzY/Qys9MjpDKyspe2lmKDEwPT09KGo9Y29kZVBvaW50QXQocyxDKSkpQj0hMCxVJiYoJD0kfHxDLVYtMT5hJiYiICIhPT1zW1YrMV0sVj1DKTtlbHNlIGlmKCFpc1ByaW50YWJsZShqKSlyZXR1cm4gNTt6PXomJmlzUGxhaW5TYWZlKGosTCx4KSxMPWp9JD0kfHxVJiZDLVYtMT5hJiYiICIhPT1zW1YrMV19cmV0dXJuIEJ8fCQ/aT45JiZuZWVkSW5kZW50SW5kaWNhdG9yKHMpPzU6dz8yPT09Xz81OjI6JD80OjM6IXp8fHd8fHUocyk/Mj09PV8/NToyOjF9ZnVuY3Rpb24gd3JpdGVTY2FsYXIocyxvLGksYSx1KXtzLmR1bXA9ZnVuY3Rpb24oKXtpZigwPT09by5sZW5ndGgpcmV0dXJuIDI9PT1zLnF1b3RpbmdUeXBlPyciIic6IicnIjtpZighcy5ub0NvbXBhdE1vZGUmJigtMSE9PVlyLmluZGV4T2Yobyl8fFhyLnRlc3QobykpKXJldHVybiAyPT09cy5xdW90aW5nVHlwZT8nIicrbysnIic6IiciK28rIiciO3ZhciBfPXMuaW5kZW50Kk1hdGgubWF4KDEsaSksdz0tMT09PXMubGluZVdpZHRoPy0xOk1hdGgubWF4KE1hdGgubWluKHMubGluZVdpZHRoLDQwKSxzLmxpbmVXaWR0aC1fKSx4PWF8fHMuZmxvd0xldmVsPi0xJiZpPj1zLmZsb3dMZXZlbDtzd2l0Y2goY2hvb3NlU2NhbGFyU3R5bGUobyx4LHMuaW5kZW50LHcsKGZ1bmN0aW9uIHRlc3RBbWJpZ3VpdHkobyl7cmV0dXJuIGZ1bmN0aW9uIHRlc3RJbXBsaWNpdFJlc29sdmluZyhzLG8pe3ZhciBpLGE7Zm9yKGk9MCxhPXMuaW1wbGljaXRUeXBlcy5sZW5ndGg7aTxhO2krPTEpaWYocy5pbXBsaWNpdFR5cGVzW2ldLnJlc29sdmUobykpcmV0dXJuITA7cmV0dXJuITF9KHMsbyl9KSxzLnF1b3RpbmdUeXBlLHMuZm9yY2VRdW90ZXMmJiFhLHUpKXtjYXNlIDE6cmV0dXJuIG87Y2FzZSAyOnJldHVybiInIitvLnJlcGxhY2UoLycvZywiJyciKSsiJyI7Y2FzZSAzOnJldHVybiJ8IitibG9ja0hlYWRlcihvLHMuaW5kZW50KStkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcobyxfKSk7Y2FzZSA0OnJldHVybiI+IitibG9ja0hlYWRlcihvLHMuaW5kZW50KStkcm9wRW5kaW5nTmV3bGluZShpbmRlbnRTdHJpbmcoZnVuY3Rpb24gZm9sZFN0cmluZyhzLG8pe3ZhciBpLGEsdT0vKFxuKykoW15cbl0qKS9nLF89KHg9cy5pbmRleE9mKCJcbiIpLHg9LTEhPT14P3g6cy5sZW5ndGgsdS5sYXN0SW5kZXg9eCxmb2xkTGluZShzLnNsaWNlKDAseCksbykpLHc9IlxuIj09PXNbMF18fCIgIj09PXNbMF07dmFyIHg7Zm9yKDthPXUuZXhlYyhzKTspe3ZhciBDPWFbMV0saj1hWzJdO2k9IiAiPT09alswXSxfKz1DKyh3fHxpfHwiIj09PWo/IiI6IlxuIikrZm9sZExpbmUoaixvKSx3PWl9cmV0dXJuIF99KG8sdyksXykpO2Nhc2UgNTpyZXR1cm4nIicrZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHMpe2Zvcih2YXIgbyxpPSIiLGE9MCx1PTA7dTxzLmxlbmd0aDthPj02NTUzNj91Kz0yOnUrKylhPWNvZGVQb2ludEF0KHMsdSksIShvPUdyW2FdKSYmaXNQcmludGFibGUoYSk/KGkrPXNbdV0sYT49NjU1MzYmJihpKz1zW3UrMV0pKTppKz1vfHxlbmNvZGVIZXgoYSk7cmV0dXJuIGl9KG8pKyciJztkZWZhdWx0OnRocm93IG5ldyB0cigiaW1wb3NzaWJsZSBlcnJvcjogaW52YWxpZCBzY2FsYXIgc3R5bGUiKX19KCl9ZnVuY3Rpb24gYmxvY2tIZWFkZXIocyxvKXt2YXIgaT1uZWVkSW5kZW50SW5kaWNhdG9yKHMpP1N0cmluZyhvKToiIixhPSJcbiI9PT1zW3MubGVuZ3RoLTFdO3JldHVybiBpKyhhJiYoIlxuIj09PXNbcy5sZW5ndGgtMl18fCJcbiI9PT1zKT8iKyI6YT8iIjoiLSIpKyJcbiJ9ZnVuY3Rpb24gZHJvcEVuZGluZ05ld2xpbmUocyl7cmV0dXJuIlxuIj09PXNbcy5sZW5ndGgtMV0/cy5zbGljZSgwLC0xKTpzfWZ1bmN0aW9uIGZvbGRMaW5lKHMsbyl7aWYoIiI9PT1zfHwiICI9PT1zWzBdKXJldHVybiBzO2Zvcih2YXIgaSxhLHU9LyBbXiBdL2csXz0wLHc9MCx4PTAsQz0iIjtpPXUuZXhlYyhzKTspKHg9aS5pbmRleCktXz5vJiYoYT13Pl8/dzp4LEMrPSJcbiIrcy5zbGljZShfLGEpLF89YSsxKSx3PXg7cmV0dXJuIEMrPSJcbiIscy5sZW5ndGgtXz5vJiZ3Pl8/Qys9cy5zbGljZShfLHcpKyJcbiIrcy5zbGljZSh3KzEpOkMrPXMuc2xpY2UoXyksQy5zbGljZSgxKX1mdW5jdGlvbiB3cml0ZUJsb2NrU2VxdWVuY2UocyxvLGksYSl7dmFyIHUsXyx3LHg9IiIsQz1zLnRhZztmb3IodT0wLF89aS5sZW5ndGg7dTxfO3UrPTEpdz1pW3VdLHMucmVwbGFjZXImJih3PXMucmVwbGFjZXIuY2FsbChpLFN0cmluZyh1KSx3KSksKHdyaXRlTm9kZShzLG8rMSx3LCEwLCEwLCExLCEwKXx8dm9pZCAwPT09dyYmd3JpdGVOb2RlKHMsbysxLG51bGwsITAsITAsITEsITApKSYmKGEmJiIiPT09eHx8KHgrPWdlbmVyYXRlTmV4dExpbmUocyxvKSkscy5kdW1wJiYxMD09PXMuZHVtcC5jaGFyQ29kZUF0KDApP3grPSItIjp4Kz0iLSAiLHgrPXMuZHVtcCk7cy50YWc9QyxzLmR1bXA9eHx8IltdIn1mdW5jdGlvbiBkZXRlY3RUeXBlKHMsbyxpKXt2YXIgYSx1LF8sdyx4LEM7Zm9yKF89MCx3PSh1PWk/cy5leHBsaWNpdFR5cGVzOnMuaW1wbGljaXRUeXBlcykubGVuZ3RoO188dztfKz0xKWlmKCgoeD11W19dKS5pbnN0YW5jZU9mfHx4LnByZWRpY2F0ZSkmJigheC5pbnN0YW5jZU9mfHwib2JqZWN0Ij09dHlwZW9mIG8mJm8gaW5zdGFuY2VvZiB4Lmluc3RhbmNlT2YpJiYoIXgucHJlZGljYXRlfHx4LnByZWRpY2F0ZShvKSkpe2lmKGk/eC5tdWx0aSYmeC5yZXByZXNlbnROYW1lP3MudGFnPXgucmVwcmVzZW50TmFtZShvKTpzLnRhZz14LnRhZzpzLnRhZz0iPyIseC5yZXByZXNlbnQpe2lmKEM9cy5zdHlsZU1hcFt4LnRhZ118fHguZGVmYXVsdFN0eWxlLCJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1Kci5jYWxsKHgucmVwcmVzZW50KSlhPXgucmVwcmVzZW50KG8sQyk7ZWxzZXtpZighSHIuY2FsbCh4LnJlcHJlc2VudCxDKSl0aHJvdyBuZXcgdHIoIiE8Iit4LnRhZysnPiB0YWcgcmVzb2x2ZXIgYWNjZXB0cyBub3QgIicrQysnIiBzdHlsZScpO2E9eC5yZXByZXNlbnRbQ10obyxDKX1zLmR1bXA9YX1yZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiB3cml0ZU5vZGUocyxvLGksYSx1LF8sdyl7cy50YWc9bnVsbCxzLmR1bXA9aSxkZXRlY3RUeXBlKHMsaSwhMSl8fGRldGVjdFR5cGUocyxpLCEwKTt2YXIgeCxDPUpyLmNhbGwocy5kdW1wKSxqPWE7YSYmKGE9cy5mbG93TGV2ZWw8MHx8cy5mbG93TGV2ZWw+byk7dmFyIEwsQiwkPSJbb2JqZWN0IE9iamVjdF0iPT09Q3x8IltvYmplY3QgQXJyYXldIj09PUM7aWYoJCYmKEI9LTEhPT0oTD1zLmR1cGxpY2F0ZXMuaW5kZXhPZihpKSkpLChudWxsIT09cy50YWcmJiI/IiE9PXMudGFnfHxCfHwyIT09cy5pbmRlbnQmJm8+MCkmJih1PSExKSxCJiZzLnVzZWREdXBsaWNhdGVzW0xdKXMuZHVtcD0iKnJlZl8iK0w7ZWxzZXtpZigkJiZCJiYhcy51c2VkRHVwbGljYXRlc1tMXSYmKHMudXNlZER1cGxpY2F0ZXNbTF09ITApLCJbb2JqZWN0IE9iamVjdF0iPT09QylhJiYwIT09T2JqZWN0LmtleXMocy5kdW1wKS5sZW5ndGg/KCFmdW5jdGlvbiB3cml0ZUJsb2NrTWFwcGluZyhzLG8saSxhKXt2YXIgdSxfLHcseCxDLGosTD0iIixCPXMudGFnLCQ9T2JqZWN0LmtleXMoaSk7aWYoITA9PT1zLnNvcnRLZXlzKSQuc29ydCgpO2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIHMuc29ydEtleXMpJC5zb3J0KHMuc29ydEtleXMpO2Vsc2UgaWYocy5zb3J0S2V5cyl0aHJvdyBuZXcgdHIoInNvcnRLZXlzIG11c3QgYmUgYSBib29sZWFuIG9yIGEgZnVuY3Rpb24iKTtmb3IodT0wLF89JC5sZW5ndGg7dTxfO3UrPTEpaj0iIixhJiYiIj09PUx8fChqKz1nZW5lcmF0ZU5leHRMaW5lKHMsbykpLHg9aVt3PSRbdV1dLHMucmVwbGFjZXImJih4PXMucmVwbGFjZXIuY2FsbChpLHcseCkpLHdyaXRlTm9kZShzLG8rMSx3LCEwLCEwLCEwKSYmKChDPW51bGwhPT1zLnRhZyYmIj8iIT09cy50YWd8fHMuZHVtcCYmcy5kdW1wLmxlbmd0aD4xMDI0KSYmKHMuZHVtcCYmMTA9PT1zLmR1bXAuY2hhckNvZGVBdCgwKT9qKz0iPyI6ais9Ij8gIiksais9cy5kdW1wLEMmJihqKz1nZW5lcmF0ZU5leHRMaW5lKHMsbykpLHdyaXRlTm9kZShzLG8rMSx4LCEwLEMpJiYocy5kdW1wJiYxMD09PXMuZHVtcC5jaGFyQ29kZUF0KDApP2orPSI6IjpqKz0iOiAiLEwrPWorPXMuZHVtcCkpO3MudGFnPUIscy5kdW1wPUx8fCJ7fSJ9KHMsbyxzLmR1bXAsdSksQiYmKHMuZHVtcD0iJnJlZl8iK0wrcy5kdW1wKSk6KCFmdW5jdGlvbiB3cml0ZUZsb3dNYXBwaW5nKHMsbyxpKXt2YXIgYSx1LF8sdyx4LEM9IiIsaj1zLnRhZyxMPU9iamVjdC5rZXlzKGkpO2ZvcihhPTAsdT1MLmxlbmd0aDthPHU7YSs9MSl4PSIiLCIiIT09QyYmKHgrPSIsICIpLHMuY29uZGVuc2VGbG93JiYoeCs9JyInKSx3PWlbXz1MW2FdXSxzLnJlcGxhY2VyJiYodz1zLnJlcGxhY2VyLmNhbGwoaSxfLHcpKSx3cml0ZU5vZGUocyxvLF8sITEsITEpJiYocy5kdW1wLmxlbmd0aD4xMDI0JiYoeCs9Ij8gIikseCs9cy5kdW1wKyhzLmNvbmRlbnNlRmxvdz8nIic6IiIpKyI6Iisocy5jb25kZW5zZUZsb3c/IiI6IiAiKSx3cml0ZU5vZGUocyxvLHcsITEsITEpJiYoQys9eCs9cy5kdW1wKSk7cy50YWc9aixzLmR1bXA9InsiK0MrIn0ifShzLG8scy5kdW1wKSxCJiYocy5kdW1wPSImcmVmXyIrTCsiICIrcy5kdW1wKSk7ZWxzZSBpZigiW29iamVjdCBBcnJheV0iPT09QylhJiYwIT09cy5kdW1wLmxlbmd0aD8ocy5ub0FycmF5SW5kZW50JiYhdyYmbz4wP3dyaXRlQmxvY2tTZXF1ZW5jZShzLG8tMSxzLmR1bXAsdSk6d3JpdGVCbG9ja1NlcXVlbmNlKHMsbyxzLmR1bXAsdSksQiYmKHMuZHVtcD0iJnJlZl8iK0wrcy5kdW1wKSk6KCFmdW5jdGlvbiB3cml0ZUZsb3dTZXF1ZW5jZShzLG8saSl7dmFyIGEsdSxfLHc9IiIseD1zLnRhZztmb3IoYT0wLHU9aS5sZW5ndGg7YTx1O2ErPTEpXz1pW2FdLHMucmVwbGFjZXImJihfPXMucmVwbGFjZXIuY2FsbChpLFN0cmluZyhhKSxfKSksKHdyaXRlTm9kZShzLG8sXywhMSwhMSl8fHZvaWQgMD09PV8mJndyaXRlTm9kZShzLG8sbnVsbCwhMSwhMSkpJiYoIiIhPT13JiYodys9IiwiKyhzLmNvbmRlbnNlRmxvdz8iIjoiICIpKSx3Kz1zLmR1bXApO3MudGFnPXgscy5kdW1wPSJbIit3KyJdIn0ocyxvLHMuZHVtcCksQiYmKHMuZHVtcD0iJnJlZl8iK0wrIiAiK3MuZHVtcCkpO2Vsc2V7aWYoIltvYmplY3QgU3RyaW5nXSIhPT1DKXtpZigiW29iamVjdCBVbmRlZmluZWRdIj09PUMpcmV0dXJuITE7aWYocy5za2lwSW52YWxpZClyZXR1cm4hMTt0aHJvdyBuZXcgdHIoInVuYWNjZXB0YWJsZSBraW5kIG9mIGFuIG9iamVjdCB0byBkdW1wICIrQyl9Ij8iIT09cy50YWcmJndyaXRlU2NhbGFyKHMscy5kdW1wLG8sXyxqKX1udWxsIT09cy50YWcmJiI/IiE9PXMudGFnJiYoeD1lbmNvZGVVUkkoIiEiPT09cy50YWdbMF0/cy50YWcuc2xpY2UoMSk6cy50YWcpLnJlcGxhY2UoLyEvZywiJTIxIikseD0iISI9PT1zLnRhZ1swXT8iISIreDoidGFnOnlhbWwub3JnLDIwMDI6Ij09PXguc2xpY2UoMCwxOCk/IiEhIit4LnNsaWNlKDE4KToiITwiK3grIj4iLHMuZHVtcD14KyIgIitzLmR1bXApfXJldHVybiEwfWZ1bmN0aW9uIGdldER1cGxpY2F0ZVJlZmVyZW5jZXMocyxvKXt2YXIgaSxhLHU9W10sXz1bXTtmb3IoaW5zcGVjdE5vZGUocyx1LF8pLGk9MCxhPV8ubGVuZ3RoO2k8YTtpKz0xKW8uZHVwbGljYXRlcy5wdXNoKHVbX1tpXV0pO28udXNlZER1cGxpY2F0ZXM9bmV3IEFycmF5KGEpfWZ1bmN0aW9uIGluc3BlY3ROb2RlKHMsbyxpKXt2YXIgYSx1LF87aWYobnVsbCE9PXMmJiJvYmplY3QiPT10eXBlb2YgcylpZigtMSE9PSh1PW8uaW5kZXhPZihzKSkpLTE9PT1pLmluZGV4T2YodSkmJmkucHVzaCh1KTtlbHNlIGlmKG8ucHVzaChzKSxBcnJheS5pc0FycmF5KHMpKWZvcih1PTAsXz1zLmxlbmd0aDt1PF87dSs9MSlpbnNwZWN0Tm9kZShzW3VdLG8saSk7ZWxzZSBmb3IodT0wLF89KGE9T2JqZWN0LmtleXMocykpLmxlbmd0aDt1PF87dSs9MSlpbnNwZWN0Tm9kZShzW2FbdV1dLG8saSl9dmFyIFFyPWZ1bmN0aW9uIGR1bXAkMShzLG8pe3ZhciBpPW5ldyBTdGF0ZShvPW98fHt9KTtpLm5vUmVmc3x8Z2V0RHVwbGljYXRlUmVmZXJlbmNlcyhzLGkpO3ZhciBhPXM7cmV0dXJuIGkucmVwbGFjZXImJihhPWkucmVwbGFjZXIuY2FsbCh7IiI6YX0sIiIsYSkpLHdyaXRlTm9kZShpLDAsYSwhMCwhMCk/aS5kdW1wKyJcbiI6IiJ9O2Z1bmN0aW9uIHJlbmFtZWQocyxvKXtyZXR1cm4gZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIkZ1bmN0aW9uIHlhbWwuIitzKyIgaXMgcmVtb3ZlZCBpbiBqcy15YW1sIDQuIFVzZSB5YW1sLiIrbysiIGluc3RlYWQsIHdoaWNoIGlzIG5vdyBzYWZlIGJ5IGRlZmF1bHQuIil9fXZhciBacj1pcixlbj1hcix0bj1wcixybj1icixubj1Tcixzbj1Ncixvbj1Xci5sb2FkLGFuPVdyLmxvYWRBbGwsY249e2R1bXA6UXJ9LmR1bXAsbG49dHIsdW49e2JpbmFyeTpPcixmbG9hdDp2cixtYXA6dXIsbnVsbDpkcixwYWlyczpJcixzZXQ6TnIsdGltZXN0YW1wOndyLGJvb2w6ZnIsaW50Om1yLG1lcmdlOnhyLG9tYXA6anIsc2VxOmxyLHN0cjpjcn0scG49cmVuYW1lZCgic2FmZUxvYWQiLCJsb2FkIiksaG49cmVuYW1lZCgic2FmZUxvYWRBbGwiLCJsb2FkQWxsIiksZG49cmVuYW1lZCgic2FmZUR1bXAiLCJkdW1wIiksZm49e1R5cGU6WnIsU2NoZW1hOmVuLEZBSUxTQUZFX1NDSEVNQTp0bixKU09OX1NDSEVNQTpybixDT1JFX1NDSEVNQTpubixERUZBVUxUX1NDSEVNQTpzbixsb2FkOm9uLGxvYWRBbGw6YW4sZHVtcDpjbixZQU1MRXhjZXB0aW9uOmxuLHR5cGVzOnVuLHNhZmVMb2FkOnBuLHNhZmVMb2FkQWxsOmhuLHNhZmVEdW1wOmRufTtjb25zdCBtbj0iY29uZmlnc191cGRhdGUiLGduPSJjb25maWdzX3RvZ2dsZSI7ZnVuY3Rpb24gdXBkYXRlKHMsbyl7cmV0dXJue3R5cGU6bW4scGF5bG9hZDp7W3NdOm99fX1mdW5jdGlvbiB0b2dnbGUocyl7cmV0dXJue3R5cGU6Z24scGF5bG9hZDpzfX1jb25zdCBhY3Rpb25zX2xvYWRlZD0oKT0+KCk9Pnt9LGRvd25sb2FkQ29uZmlnPXM9Pm89Pntjb25zdHtmbjp7ZmV0Y2g6aX19PW87cmV0dXJuIGkocyl9LGdldENvbmZpZ0J5VXJsPShzLG8pPT5pPT57Y29uc3R7c3BlY0FjdGlvbnM6YSxjb25maWdzQWN0aW9uczp1fT1pO2lmKHMpcmV0dXJuIHUuZG93bmxvYWRDb25maWcocykudGhlbihuZXh0LG5leHQpO2Z1bmN0aW9uIG5leHQodSl7dSBpbnN0YW5jZW9mIEVycm9yfHx1LnN0YXR1cz49NDAwPyhhLnVwZGF0ZUxvYWRpbmdTdGF0dXMoImZhaWxlZENvbmZpZyIpLGEudXBkYXRlTG9hZGluZ1N0YXR1cygiZmFpbGVkQ29uZmlnIiksYS51cGRhdGVVcmwoIiIpLGNvbnNvbGUuZXJyb3IodS5zdGF0dXNUZXh0KyIgIitzLnVybCksbyhudWxsKSk6bygoKHMsbyk9Pnt0cnl7cmV0dXJuIGZuLmxvYWQocyl9Y2F0Y2gocyl7cmV0dXJuIG8mJm8uZXJyQWN0aW9ucy5uZXdUaHJvd25FcnIobmV3IEVycm9yKHMpKSx7fX19KSh1LnRleHQsaSkpfX0sZ2V0PShzLG8pPT5zLmdldEluKEFycmF5LmlzQXJyYXkobyk/bzpbb10pLHluPXtbbW5dOihzLG8pPT5zLm1lcmdlKCgwLHplLmZyb21KUykoby5wYXlsb2FkKSksW2duXToocyxvKT0+e2NvbnN0IGk9by5wYXlsb2FkLGE9cy5nZXQoaSk7cmV0dXJuIHMuc2V0KGksIWEpfX07ZnVuY3Rpb24gY29uZmlnc1BsdWdpbigpe3JldHVybntzdGF0ZVBsdWdpbnM6e2NvbmZpZ3M6e3JlZHVjZXJzOnluLGFjdGlvbnM6dSxzZWxlY3RvcnM6X319fX1jb25zdCBzZXRIYXNoPXM9PnM/aGlzdG9yeS5wdXNoU3RhdGUobnVsbCxudWxsLGAjJHtzfWApOndpbmRvdy5sb2NhdGlvbi5oYXNoPSIiO3ZhciB2bj1fX3dlYnBhY2tfcmVxdWlyZV9fKDg2MjE1KSxibj1fX3dlYnBhY2tfcmVxdWlyZV9fLm4odm4pO2NvbnN0IFNuPSJsYXlvdXRfc2Nyb2xsX3RvIixfbj0ibGF5b3V0X2NsZWFyX3Njcm9sbCI7Y29uc3QgRW49e2ZuOntnZXRTY3JvbGxQYXJlbnQ6ZnVuY3Rpb24gZ2V0U2Nyb2xsUGFyZW50KHMsbyl7Y29uc3QgaT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7bGV0IGE9Z2V0Q29tcHV0ZWRTdHlsZShzKTtjb25zdCB1PSJhYnNvbHV0ZSI9PT1hLnBvc2l0aW9uLF89bz8vKGF1dG98c2Nyb2xsfGhpZGRlbikvOi8oYXV0b3xzY3JvbGwpLztpZigiZml4ZWQiPT09YS5wb3NpdGlvbilyZXR1cm4gaTtmb3IobGV0IG89cztvPW8ucGFyZW50RWxlbWVudDspaWYoYT1nZXRDb21wdXRlZFN0eWxlKG8pLCghdXx8InN0YXRpYyIhPT1hLnBvc2l0aW9uKSYmXy50ZXN0KGEub3ZlcmZsb3crYS5vdmVyZmxvd1krYS5vdmVyZmxvd1gpKXJldHVybiBvO3JldHVybiBpfX0sc3RhdGVQbHVnaW5zOntsYXlvdXQ6e2FjdGlvbnM6e3Njcm9sbFRvRWxlbWVudDoocyxvKT0+aT0+e3RyeXtvPW98fGkuZm4uZ2V0U2Nyb2xsUGFyZW50KHMpLGJuKCkuY3JlYXRlU2Nyb2xsZXIobykudG8ocyl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcihzKX19LHNjcm9sbFRvOnM9Pih7dHlwZTpTbixwYXlsb2FkOkFycmF5LmlzQXJyYXkocyk/czpbc119KSxjbGVhclNjcm9sbFRvOigpPT4oe3R5cGU6X259KSxyZWFkeVRvU2Nyb2xsOihzLG8pPT5pPT57Y29uc3QgYT1pLmxheW91dFNlbGVjdG9ycy5nZXRTY3JvbGxUb0tleSgpO1dlKCkuaXMoYSwoMCx6ZS5mcm9tSlMpKHMpKSYmKGkubGF5b3V0QWN0aW9ucy5zY3JvbGxUb0VsZW1lbnQobyksaS5sYXlvdXRBY3Rpb25zLmNsZWFyU2Nyb2xsVG8oKSl9LHBhcnNlRGVlcExpbmtIYXNoOnM9Pih7bGF5b3V0QWN0aW9uczpvLGxheW91dFNlbGVjdG9yczppLGdldENvbmZpZ3M6YX0pPT57aWYoYSgpLmRlZXBMaW5raW5nJiZzKXtsZXQgYT1zLnNsaWNlKDEpOyIhIj09PWFbMF0mJihhPWEuc2xpY2UoMSkpLCIvIj09PWFbMF0mJihhPWEuc2xpY2UoMSkpO2NvbnN0IHU9YS5zcGxpdCgiLyIpLm1hcCgocz0+c3x8IiIpKSxfPWkuaXNTaG93bktleUZyb21VcmxIYXNoQXJyYXkodSksW3cseD0iIixDPSIiXT1fO2lmKCJvcGVyYXRpb25zIj09PXcpe2NvbnN0IHM9aS5pc1Nob3duS2V5RnJvbVVybEhhc2hBcnJheShbeF0pO3guaW5kZXhPZigiXyIpPi0xJiYoY29uc29sZS53YXJuKCJXYXJuaW5nOiBlc2NhcGluZyBkZWVwIGxpbmsgd2hpdGVzcGFjZSB3aXRoIGBfYCB3aWxsIGJlIHVuc3VwcG9ydGVkIGluIHY0LjAsIHVzZSBgJTIwYCBpbnN0ZWFkLiIpLG8uc2hvdyhzLm1hcCgocz0+cy5yZXBsYWNlKC9fL2csIiAiKSkpLCEwKSksby5zaG93KHMsITApfSh4LmluZGV4T2YoIl8iKT4tMXx8Qy5pbmRleE9mKCJfIik+LTEpJiYoY29uc29sZS53YXJuKCJXYXJuaW5nOiBlc2NhcGluZyBkZWVwIGxpbmsgd2hpdGVzcGFjZSB3aXRoIGBfYCB3aWxsIGJlIHVuc3VwcG9ydGVkIGluIHY0LjAsIHVzZSBgJTIwYCBpbnN0ZWFkLiIpLG8uc2hvdyhfLm1hcCgocz0+cy5yZXBsYWNlKC9fL2csIiAiKSkpLCEwKSksby5zaG93KF8sITApLG8uc2Nyb2xsVG8oXyl9fX0sc2VsZWN0b3JzOntnZXRTY3JvbGxUb0tleTpzPT5zLmdldCgic2Nyb2xsVG9LZXkiKSxpc1Nob3duS2V5RnJvbVVybEhhc2hBcnJheShzLG8pe2NvbnN0W2ksYV09bztyZXR1cm4gYT9bIm9wZXJhdGlvbnMiLGksYV06aT9bIm9wZXJhdGlvbnMtdGFnIixpXTpbXX0sdXJsSGFzaEFycmF5RnJvbUlzU2hvd25LZXkocyxvKXtsZXRbaSxhLHVdPW87cmV0dXJuIm9wZXJhdGlvbnMiPT1pP1thLHVdOiJvcGVyYXRpb25zLXRhZyI9PWk/W2FdOltdfX0scmVkdWNlcnM6e1tTbl06KHMsbyk9PnMuc2V0KCJzY3JvbGxUb0tleSIsV2UoKS5mcm9tSlMoby5wYXlsb2FkKSksW19uXTpzPT5zLmRlbGV0ZSgic2Nyb2xsVG9LZXkiKX0sd3JhcEFjdGlvbnM6e3Nob3c6KHMse2dldENvbmZpZ3M6byxsYXlvdXRTZWxlY3RvcnM6aX0pPT4oLi4uYSk9PntpZihzKC4uLmEpLG8oKS5kZWVwTGlua2luZyl0cnl7bGV0W3Msb109YTtzPUFycmF5LmlzQXJyYXkocyk/czpbc107Y29uc3QgdT1pLnVybEhhc2hBcnJheUZyb21Jc1Nob3duS2V5KHMpO2lmKCF1Lmxlbmd0aClyZXR1cm47Y29uc3RbXyx3XT11O2lmKCFvKXJldHVybiBzZXRIYXNoKCIvIik7Mj09PXUubGVuZ3RoP3NldEhhc2goY3JlYXRlRGVlcExpbmtQYXRoKGAvJHtlbmNvZGVVUklDb21wb25lbnQoXyl9LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHcpfWApKToxPT09dS5sZW5ndGgmJnNldEhhc2goY3JlYXRlRGVlcExpbmtQYXRoKGAvJHtlbmNvZGVVUklDb21wb25lbnQoXyl9YCkpfWNhdGNoKHMpe2NvbnNvbGUuZXJyb3Iocyl9fX19fX07dmFyIHduPV9fd2VicGFja19yZXF1aXJlX18oMjIwOSkseG49X193ZWJwYWNrX3JlcXVpcmVfXy5uKHduKTtjb25zdCBvcGVyYXRpb25fd3JhcHBlcj0ocyxvKT0+Y2xhc3MgT3BlcmF0aW9uV3JhcHBlciBleHRlbmRzIFJlLkNvbXBvbmVudHtvbkxvYWQ9cz0+e2NvbnN0e29wZXJhdGlvbjppfT10aGlzLnByb3BzLHt0YWc6YSxvcGVyYXRpb25JZDp1fT1pLnRvT2JqZWN0KCk7bGV0e2lzU2hvd25LZXk6X309aS50b09iamVjdCgpO189X3x8WyJvcGVyYXRpb25zIixhLHVdLG8ubGF5b3V0QWN0aW9ucy5yZWFkeVRvU2Nyb2xsKF8scyl9O3JlbmRlcigpe3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7cmVmOnRoaXMub25Mb2FkfSxSZS5jcmVhdGVFbGVtZW50KHMsdGhpcy5wcm9wcykpfX0sb3BlcmF0aW9uX3RhZ193cmFwcGVyPShzLG8pPT5jbGFzcyBPcGVyYXRpb25UYWdXcmFwcGVyIGV4dGVuZHMgUmUuQ29tcG9uZW50e29uTG9hZD1zPT57Y29uc3R7dGFnOml9PXRoaXMucHJvcHMsYT1bIm9wZXJhdGlvbnMtdGFnIixpXTtvLmxheW91dEFjdGlvbnMucmVhZHlUb1Njcm9sbChhLHMpfTtyZW5kZXIoKXtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse3JlZjp0aGlzLm9uTG9hZH0sUmUuY3JlYXRlRWxlbWVudChzLHRoaXMucHJvcHMpKX19O2Z1bmN0aW9uIGRlZXBfbGlua2luZygpe3JldHVybltFbix7c3RhdGVQbHVnaW5zOntjb25maWdzOnt3cmFwQWN0aW9uczp7bG9hZGVkOihzLG8pPT4oLi4uaSk9PntzKC4uLmkpO2NvbnN0IGE9ZGVjb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5oYXNoKTtvLmxheW91dEFjdGlvbnMucGFyc2VEZWVwTGlua0hhc2goYSl9fX19LHdyYXBDb21wb25lbnRzOntvcGVyYXRpb246b3BlcmF0aW9uX3dyYXBwZXIsT3BlcmF0aW9uVGFnOm9wZXJhdGlvbl90YWdfd3JhcHBlcn19XX12YXIga249X193ZWJwYWNrX3JlcXVpcmVfXyg0MDg2MCksT249X193ZWJwYWNrX3JlcXVpcmVfXy5uKGtuKTtmdW5jdGlvbiB0cmFuc2Zvcm0ocyl7cmV0dXJuIHMubWFwKChzPT57bGV0IG89ImlzIG5vdCBvZiBhIHR5cGUocykiLGk9cy5nZXQoIm1lc3NhZ2UiKS5pbmRleE9mKG8pO2lmKGk+LTEpe2xldCBvPXMuZ2V0KCJtZXNzYWdlIikuc2xpY2UoaSsxOSkuc3BsaXQoIiwiKTtyZXR1cm4gcy5zZXQoIm1lc3NhZ2UiLHMuZ2V0KCJtZXNzYWdlIikuc2xpY2UoMCxpKStmdW5jdGlvbiBtYWtlTmV3TWVzc2FnZShzKXtyZXR1cm4gcy5yZWR1Y2UoKChzLG8saSxhKT0+aT09PWEubGVuZ3RoLTEmJmEubGVuZ3RoPjE/cysib3IgIitvOmFbaSsxXSYmYS5sZW5ndGg+Mj9zK28rIiwgIjphW2krMV0/cytvKyIgIjpzK28pLCJzaG91bGQgYmUgYSIpfShvKSl9cmV0dXJuIHN9KSl9dmFyIEFuPV9fd2VicGFja19yZXF1aXJlX18oNTgxNTYpLENuPV9fd2VicGFja19yZXF1aXJlX18ubihBbik7ZnVuY3Rpb24gcGFyYW1ldGVyX29uZW9mX3RyYW5zZm9ybShzLHtqc1NwZWM6b30pe3JldHVybiBzfWNvbnN0IGpuPVt3LHhdO2Z1bmN0aW9uIHRyYW5zZm9ybUVycm9ycyhzKXtsZXQgbz17anNTcGVjOnt9fSxpPU9uKCkoam4sKChzLGkpPT57dHJ5e3JldHVybiBpLnRyYW5zZm9ybShzLG8pLmZpbHRlcigocz0+ISFzKSl9Y2F0Y2gobyl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRyYW5zZm9ybWVyIGVycm9yOiIsbyksc319KSxzKTtyZXR1cm4gaS5maWx0ZXIoKHM9PiEhcykpLm1hcCgocz0+KCFzLmdldCgibGluZSIpJiZzLmdldCgicGF0aCIpLHMpKSl9bGV0IFBuPXtsaW5lOjAsbGV2ZWw6ImVycm9yIixtZXNzYWdlOiJVbmtub3duIGVycm9yIn07Y29uc3QgSW49VXQoKHM9PnMpLChzPT5zLmdldCgiZXJyb3JzIiwoMCx6ZS5MaXN0KSgpKSkpLFRuPVV0KEluLChzPT5zLmxhc3QoKSkpO2Z1bmN0aW9uIGVycihvKXtyZXR1cm57c3RhdGVQbHVnaW5zOntlcnI6e3JlZHVjZXJzOntbcnRdOihzLHtwYXlsb2FkOm99KT0+e2xldCBpPU9iamVjdC5hc3NpZ24oUG4sbyx7dHlwZToidGhyb3duIn0pO3JldHVybiBzLnVwZGF0ZSgiZXJyb3JzIiwocz0+KHN8fCgwLHplLkxpc3QpKCkpLnB1c2goKDAsemUuZnJvbUpTKShpKSkpKS51cGRhdGUoImVycm9ycyIsKHM9PnRyYW5zZm9ybUVycm9ycyhzKSkpfSxbbnRdOihzLHtwYXlsb2FkOm99KT0+KG89by5tYXAoKHM9PigwLHplLmZyb21KUykoT2JqZWN0LmFzc2lnbihQbixzLHt0eXBlOiJ0aHJvd24ifSkpKSkscy51cGRhdGUoImVycm9ycyIsKHM9PihzfHwoMCx6ZS5MaXN0KSgpKS5jb25jYXQoKDAsemUuZnJvbUpTKShvKSkpKS51cGRhdGUoImVycm9ycyIsKHM9PnRyYW5zZm9ybUVycm9ycyhzKSkpKSxbc3RdOihzLHtwYXlsb2FkOm99KT0+e2xldCBpPSgwLHplLmZyb21KUykobyk7cmV0dXJuIGk9aS5zZXQoInR5cGUiLCJzcGVjIikscy51cGRhdGUoImVycm9ycyIsKHM9PihzfHwoMCx6ZS5MaXN0KSgpKS5wdXNoKCgwLHplLmZyb21KUykoaSkpLnNvcnRCeSgocz0+cy5nZXQoImxpbmUiKSkpKSkudXBkYXRlKCJlcnJvcnMiLChzPT50cmFuc2Zvcm1FcnJvcnMocykpKX0sW290XToocyx7cGF5bG9hZDpvfSk9PihvPW8ubWFwKChzPT4oMCx6ZS5mcm9tSlMpKE9iamVjdC5hc3NpZ24oUG4scyx7dHlwZToic3BlYyJ9KSkpKSxzLnVwZGF0ZSgiZXJyb3JzIiwocz0+KHN8fCgwLHplLkxpc3QpKCkpLmNvbmNhdCgoMCx6ZS5mcm9tSlMpKG8pKSkpLnVwZGF0ZSgiZXJyb3JzIiwocz0+dHJhbnNmb3JtRXJyb3JzKHMpKSkpLFtpdF06KHMse3BheWxvYWQ6b30pPT57bGV0IGk9KDAsemUuZnJvbUpTKShPYmplY3QuYXNzaWduKHt9LG8pKTtyZXR1cm4gaT1pLnNldCgidHlwZSIsImF1dGgiKSxzLnVwZGF0ZSgiZXJyb3JzIiwocz0+KHN8fCgwLHplLkxpc3QpKCkpLnB1c2goKDAsemUuZnJvbUpTKShpKSkpKS51cGRhdGUoImVycm9ycyIsKHM9PnRyYW5zZm9ybUVycm9ycyhzKSkpfSxbYXRdOihzLHtwYXlsb2FkOm99KT0+e2lmKCFvfHwhcy5nZXQoImVycm9ycyIpKXJldHVybiBzO2xldCBpPXMuZ2V0KCJlcnJvcnMiKS5maWx0ZXIoKHM9PnMua2V5U2VxKCkuZXZlcnkoKGk9Pntjb25zdCBhPXMuZ2V0KGkpLHU9b1tpXTtyZXR1cm4hdXx8YSE9PXV9KSkpKTtyZXR1cm4gcy5tZXJnZSh7ZXJyb3JzOml9KX0sW2N0XToocyx7cGF5bG9hZDpvfSk9PntpZighb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIG8pcmV0dXJuIHM7bGV0IGk9cy5nZXQoImVycm9ycyIpLmZpbHRlcigocz0+byhzKSkpO3JldHVybiBzLm1lcmdlKHtlcnJvcnM6aX0pfX0sYWN0aW9uczpzLHNlbGVjdG9yczpDfX19fWZ1bmN0aW9uIG9wc0ZpbHRlcihzLG8pe3JldHVybiBzLmZpbHRlcigoKHMsaSk9Pi0xIT09aS5pbmRleE9mKG8pKSl9ZnVuY3Rpb24gZmlsdGVyKCl7cmV0dXJue2ZuOntvcHNGaWx0ZXJ9fX12YXIgTm49X193ZWJwYWNrX3JlcXVpcmVfXyg3NjY2KSxNbj1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oTm4pO2NvbnN0IGFycm93X3VwPSh7Y2xhc3NOYW1lOnM9bnVsbCx3aWR0aDpvPTIwLGhlaWdodDppPTIwLC4uLmF9KT0+UmUuY3JlYXRlRWxlbWVudCgic3ZnIixNbigpKHt4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHZpZXdCb3g6IjAgMCAyMCAyMCIsY2xhc3NOYW1lOnMsd2lkdGg6byxoZWlnaHQ6aSwiYXJpYS1oaWRkZW4iOiJ0cnVlIixmb2N1c2FibGU6ImZhbHNlIn0sYSksUmUuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0gMTcuNDE4IDE0LjkwOCBDIDE3LjY5IDE1LjE3NiAxOC4xMjcgMTUuMTc2IDE4LjM5NyAxNC45MDggQyAxOC42NjcgMTQuNjQgMTguNjY4IDE0LjIwNyAxOC4zOTcgMTMuOTM5IEwgMTAuNDg5IDYuMTA5IEMgMTAuMjE5IDUuODQxIDkuNzgyIDUuODQxIDkuNTEgNi4xMDkgTCAxLjYwMiAxMy45MzkgQyAxLjMzMiAxNC4yMDcgMS4zMzIgMTQuNjQgMS42MDIgMTQuOTA4IEMgMS44NzMgMTUuMTc2IDIuMzExIDE1LjE3NiAyLjU4MSAxNC45MDggTCAxMCA3Ljc2NyBMIDE3LjQxOCAxNC45MDggWiJ9KSksYXJyb3dfZG93bj0oe2NsYXNzTmFtZTpzPW51bGwsd2lkdGg6bz0yMCxoZWlnaHQ6aT0yMCwuLi5hfSk9PlJlLmNyZWF0ZUVsZW1lbnQoInN2ZyIsTW4oKSh7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjAgMjAiLGNsYXNzTmFtZTpzLHdpZHRoOm8saGVpZ2h0OmksImFyaWEtaGlkZGVuIjoidHJ1ZSIsZm9jdXNhYmxlOiJmYWxzZSJ9LGEpLFJlLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTcuNDE4IDYuMTA5Yy4yNzItLjI2OC43MDktLjI2OC45NzkgMHMuMjcxLjcwMSAwIC45NjlsLTcuOTA4IDcuODNjLS4yNy4yNjgtLjcwNy4yNjgtLjk3OSAwbC03LjkwOC03LjgzYy0uMjctLjI2OC0uMjctLjcwMSAwLS45NjkuMjcxLS4yNjguNzA5LS4yNjguOTc5IDBMMTAgMTMuMjVsNy40MTgtNy4xNDF6In0pKSxhcnJvdz0oe2NsYXNzTmFtZTpzPW51bGwsd2lkdGg6bz0yMCxoZWlnaHQ6aT0yMCwuLi5hfSk9PlJlLmNyZWF0ZUVsZW1lbnQoInN2ZyIsTW4oKSh7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjAgMjAiLGNsYXNzTmFtZTpzLHdpZHRoOm8saGVpZ2h0OmksImFyaWEtaGlkZGVuIjoidHJ1ZSIsZm9jdXNhYmxlOiJmYWxzZSJ9LGEpLFJlLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTMuMjUgMTBMNi4xMDkgMi41OGMtLjI2OC0uMjctLjI2OC0uNzA3IDAtLjk3OS4yNjgtLjI3LjcwMS0uMjcuOTY5IDBsNy44MyA3LjkwOGMuMjY4LjI3MS4yNjguNzA5IDAgLjk3OWwtNy44MyA3LjkwOGMtLjI2OC4yNzEtLjcwMS4yNy0uOTY5IDAtLjI2OC0uMjY5LS4yNjgtLjcwNyAwLS45NzlMMTMuMjUgMTB6In0pKSxjb21wb25lbnRzX2Nsb3NlPSh7Y2xhc3NOYW1lOnM9bnVsbCx3aWR0aDpvPTIwLGhlaWdodDppPTIwLC4uLmF9KT0+UmUuY3JlYXRlRWxlbWVudCgic3ZnIixNbigpKHt4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHZpZXdCb3g6IjAgMCAyMCAyMCIsY2xhc3NOYW1lOnMsd2lkdGg6byxoZWlnaHQ6aSwiYXJpYS1oaWRkZW4iOiJ0cnVlIixmb2N1c2FibGU6ImZhbHNlIn0sYSksUmUuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xNC4zNDggMTQuODQ5Yy0uNDY5LjQ2OS0xLjIyOS40NjktMS42OTcgMEwxMCAxMS44MTlsLTIuNjUxIDMuMDI5Yy0uNDY5LjQ2OS0xLjIyOS40NjktMS42OTcgMC0uNDY5LS40NjktLjQ2OS0xLjIyOSAwLTEuNjk3bDIuNzU4LTMuMTUtMi43NTktMy4xNTJjLS40NjktLjQ2OS0uNDY5LTEuMjI4IDAtMS42OTcuNDY5LS40NjkgMS4yMjgtLjQ2OSAxLjY5NyAwTDEwIDguMTgzbDIuNjUxLTMuMDMxYy40NjktLjQ2OSAxLjIyOC0uNDY5IDEuNjk3IDAgLjQ2OS40NjkuNDY5IDEuMjI5IDAgMS42OTdsLTIuNzU4IDMuMTUyIDIuNzU4IDMuMTVjLjQ2OS40NjkuNDY5IDEuMjI5IDAgMS42OTh6In0pKSxjb3B5PSh7Y2xhc3NOYW1lOnM9bnVsbCx3aWR0aDpvPTE1LGhlaWdodDppPTE2LC4uLmF9KT0+UmUuY3JlYXRlRWxlbWVudCgic3ZnIixNbigpKHt4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHZpZXdCb3g6IjAgMCAxNSAxNiIsY2xhc3NOYW1lOnMsd2lkdGg6byxoZWlnaHQ6aSwiYXJpYS1oaWRkZW4iOiJ0cnVlIixmb2N1c2FibGU6ImZhbHNlIn0sYSksUmUuY3JlYXRlRWxlbWVudCgiZyIse3RyYW5zZm9ybToidHJhbnNsYXRlKDIsIC0xKSJ9LFJlLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtmaWxsOiIjZmZmZmZmIixmaWxsUnVsZToiZXZlbm9kZCIsZDoiTTIgMTNoNHYxSDJ2LTF6bTUtNkgydjFoNVY3em0yIDNWOGwtMyAzIDMgM3YtMmg1di0ySDl6TTQuNSA5SDJ2MWgyLjVWOXpNMiAxMmgyLjV2LTFIMnYxem05IDFoMXYyYy0uMDIuMjgtLjExLjUyLS4zLjctLjE5LjE4LS40Mi4yOC0uNy4zSDFjLS41NSAwLTEtLjQ1LTEtMVY0YzAtLjU1LjQ1LTEgMS0xaDNjMC0xLjExLjg5LTIgMi0yIDEuMTEgMCAyIC44OSAyIDJoM2MuNTUgMCAxIC40NSAxIDF2NWgtMVY2SDF2OWgxMHYtMnpNMiA1aDhjMC0uNTUtLjQ1LTEtMS0xSDhjLS41NSAwLTEtLjQ1LTEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMS0uNDUgMS0xIDFIM2MtLjU1IDAtMSAuNDUtMSAxeiJ9KSkpLGxvY2s9KHtjbGFzc05hbWU6cz1udWxsLHdpZHRoOm89MjAsaGVpZ2h0Omk9MjAsLi4uYX0pPT5SZS5jcmVhdGVFbGVtZW50KCJzdmciLE1uKCkoe3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDIwIDIwIixjbGFzc05hbWU6cyx3aWR0aDpvLGhlaWdodDppLCJhcmlhLWhpZGRlbiI6InRydWUiLGZvY3VzYWJsZToiZmFsc2UifSxhKSxSZS5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTE1LjggOEgxNFY1LjZDMTQgMi43MDMgMTIuNjY1IDEgMTAgMSA3LjMzNCAxIDYgMi43MDMgNiA1LjZWOEg0Yy0uNTUzIDAtMSAuNjQ2LTEgMS4xOTlWMTdjMCAuNTQ5LjQyOCAxLjEzOS45NTEgMS4zMDdsMS4xOTcuMzg3QzUuNjcyIDE4Ljg2MSA2LjU1IDE5IDcuMSAxOWg1LjhjLjU0OSAwIDEuNDI4LS4xMzkgMS45NTEtLjMwN2wxLjE5Ni0uMzg3Yy41MjQtLjE2Ny45NTMtLjc1Ny45NTMtMS4zMDZWOS4xOTlDMTcgOC42NDYgMTYuMzUyIDggMTUuOCA4ek0xMiA4SDhWNS4xOTlDOCAzLjc1NCA4Ljc5NyAzIDEwIDNjMS4yMDMgMCAyIC43NTQgMiAyLjE5OVY4eiJ9KSksdW5sb2NrPSh7Y2xhc3NOYW1lOnM9bnVsbCx3aWR0aDpvPTIwLGhlaWdodDppPTIwLC4uLmF9KT0+UmUuY3JlYXRlRWxlbWVudCgic3ZnIixNbigpKHt4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHZpZXdCb3g6IjAgMCAyMCAyMCIsY2xhc3NOYW1lOnMsd2lkdGg6byxoZWlnaHQ6aSwiYXJpYS1oaWRkZW4iOiJ0cnVlIixmb2N1c2FibGU6ImZhbHNlIn0sYSksUmUuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xNS44IDhIMTRWNS42QzE0IDIuNzAzIDEyLjY2NSAxIDEwIDEgNy4zMzQgMSA2IDIuNzAzIDYgNS42VjZoMnYtLjgwMUM4IDMuNzU0IDguNzk3IDMgMTAgM2MxLjIwMyAwIDIgLjc1NCAyIDIuMTk5VjhINGMtLjU1MyAwLTEgLjY0Ni0xIDEuMTk5VjE3YzAgLjU0OS40MjggMS4xMzkuOTUxIDEuMzA3bDEuMTk3LjM4N0M1LjY3MiAxOC44NjEgNi41NSAxOSA3LjEgMTloNS44Yy41NDkgMCAxLjQyOC0uMTM5IDEuOTUxLS4zMDdsMS4xOTYtLjM4N2MuNTI0LS4xNjcuOTUzLS43NTcuOTUzLTEuMzA2VjkuMTk5QzE3IDguNjQ2IDE2LjM1MiA4IDE1LjggOHoifSkpLGljb25zPSgpPT4oe2NvbXBvbmVudHM6e0Fycm93VXBJY29uOmFycm93X3VwLEFycm93RG93bkljb246YXJyb3dfZG93bixBcnJvd0ljb246YXJyb3csQ2xvc2VJY29uOmNvbXBvbmVudHNfY2xvc2UsQ29weUljb246Y29weSxMb2NrSWNvbjpsb2NrLFVubG9ja0ljb246dW5sb2NrfX0pLFJuPSJsYXlvdXRfdXBkYXRlX2xheW91dCIsRG49ImxheW91dF91cGRhdGVfZmlsdGVyIixMbj0ibGF5b3V0X3VwZGF0ZV9tb2RlIixGbj0ibGF5b3V0X3Nob3ciO2Z1bmN0aW9uIHVwZGF0ZUxheW91dChzKXtyZXR1cm57dHlwZTpSbixwYXlsb2FkOnN9fWZ1bmN0aW9uIHVwZGF0ZUZpbHRlcihzKXtyZXR1cm57dHlwZTpEbixwYXlsb2FkOnN9fWZ1bmN0aW9uIGFjdGlvbnNfc2hvdyhzLG89ITApe3JldHVybiBzPW5vcm1hbGl6ZUFycmF5KHMpLHt0eXBlOkZuLHBheWxvYWQ6e3RoaW5nOnMsc2hvd246b319fWZ1bmN0aW9uIGNoYW5nZU1vZGUocyxvPSIiKXtyZXR1cm4gcz1ub3JtYWxpemVBcnJheShzKSx7dHlwZTpMbixwYXlsb2FkOnt0aGluZzpzLG1vZGU6b319fWNvbnN0IEJuPXtbUm5dOihzLG8pPT5zLnNldCgibGF5b3V0IixvLnBheWxvYWQpLFtEbl06KHMsbyk9PnMuc2V0KCJmaWx0ZXIiLG8ucGF5bG9hZCksW0ZuXToocyxvKT0+e2NvbnN0IGk9by5wYXlsb2FkLnNob3duLGE9KDAsemUuZnJvbUpTKShvLnBheWxvYWQudGhpbmcpO3JldHVybiBzLnVwZGF0ZSgic2hvd24iLCgwLHplLmZyb21KUykoe30pLChzPT5zLnNldChhLGkpKSl9LFtMbl06KHMsbyk9PntsZXQgaT1vLnBheWxvYWQudGhpbmcsYT1vLnBheWxvYWQubW9kZTtyZXR1cm4gcy5zZXRJbihbIm1vZGVzIl0uY29uY2F0KGkpLChhfHwiIikrIiIpfX0sY3VycmVudD1zPT5zLmdldCgibGF5b3V0IiksY3VycmVudEZpbHRlcj1zPT5zLmdldCgiZmlsdGVyIiksaXNTaG93bj0ocyxvLGkpPT4obz1ub3JtYWxpemVBcnJheShvKSxzLmdldCgic2hvd24iLCgwLHplLmZyb21KUykoe30pKS5nZXQoKDAsemUuZnJvbUpTKShvKSxpKSksd2hhdE1vZGU9KHMsbyxpPSIiKT0+KG89bm9ybWFsaXplQXJyYXkobykscy5nZXRJbihbIm1vZGVzIiwuLi5vXSxpKSksJG49VXQoKHM9PnMpLChzPT4haXNTaG93bihzLCJlZGl0b3IiKSkpLHRhZ2dlZE9wZXJhdGlvbnM9KHMsbyk9PihpLC4uLmEpPT57bGV0IHU9cyhpLC4uLmEpO2NvbnN0e2ZuOl8sbGF5b3V0U2VsZWN0b3JzOncsZ2V0Q29uZmlnczp4fT1vLmdldFN5c3RlbSgpLEM9eCgpLHttYXhEaXNwbGF5ZWRUYWdzOmp9PUM7bGV0IEw9dy5jdXJyZW50RmlsdGVyKCk7cmV0dXJuIEwmJiEwIT09TCYmKHU9Xy5vcHNGaWx0ZXIodSxMKSksaj49MCYmKHU9dS5zbGljZSgwLGopKSx1fTtmdW5jdGlvbiBwbHVnaW5zX2xheW91dCgpe3JldHVybntzdGF0ZVBsdWdpbnM6e2xheW91dDp7cmVkdWNlcnM6Qm4sYWN0aW9uczpqLHNlbGVjdG9yczpMfSxzcGVjOnt3cmFwU2VsZWN0b3JzOkJ9fX19ZnVuY3Rpb24gbG9ncyh7Y29uZmlnczpzfSl7Y29uc3Qgbz17ZGVidWc6MCxpbmZvOjEsbG9nOjIsd2FybjozLGVycm9yOjR9LGdldExldmVsPXM9Pm9bc118fC0xO2xldHtsb2dMZXZlbDppfT1zLGE9Z2V0TGV2ZWwoaSk7ZnVuY3Rpb24gbG9nKHMsLi4ubyl7Z2V0TGV2ZWwocyk+PWEmJmNvbnNvbGVbc10oLi4ubyl9cmV0dXJuIGxvZy53YXJuPWxvZy5iaW5kKG51bGwsIndhcm4iKSxsb2cuZXJyb3I9bG9nLmJpbmQobnVsbCwiZXJyb3IiKSxsb2cuaW5mbz1sb2cuYmluZChudWxsLCJpbmZvIiksbG9nLmRlYnVnPWxvZy5iaW5kKG51bGwsImRlYnVnIikse3Jvb3RJbmplY3RzOntsb2d9fX1sZXQgcW49ITE7ZnVuY3Rpb24gb25fY29tcGxldGUoKXtyZXR1cm57c3RhdGVQbHVnaW5zOntzcGVjOnt3cmFwQWN0aW9uczp7dXBkYXRlU3BlYzpzPT4oLi4ubyk9Pihxbj0hMCxzKC4uLm8pKSx1cGRhdGVKc29uU3BlYzoocyxvKT0+KC4uLmkpPT57Y29uc3QgYT1vLmdldENvbmZpZ3MoKS5vbkNvbXBsZXRlO3JldHVybiBxbiYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJihzZXRUaW1lb3V0KGEsMCkscW49ITEpLHMoLi4uaSl9fX19fX1jb25zdCBleHRyYWN0S2V5PXM9Pntjb25zdCBvPSJfKipbXSI7cmV0dXJuIHMuaW5kZXhPZihvKTwwP3M6cy5zcGxpdChvKVswXS50cmltKCl9LGVzY2FwZVNoZWxsPXM9PiItZCAiPT09c3x8L15bX1wvLV0vZy50ZXN0KHMpP3M6IiciK3MucmVwbGFjZSgvJy9nLCInXFwnJyIpKyInIixlc2NhcGVDTUQ9cz0+Ii1kICI9PT0ocz1zLnJlcGxhY2UoL1xeL2csIl5eIikucmVwbGFjZSgvXFwiL2csJ1xcXFwiJykucmVwbGFjZSgvIi9nLCciIicpLnJlcGxhY2UoL1xuL2csIl5cbiIpKT9zLnJlcGxhY2UoLy1kIC9nLCItZCBeXG4iKTovXltfXC8tXS9nLnRlc3Qocyk/czonIicrcysnIicsZXNjYXBlUG93ZXJzaGVsbD1zPT57aWYoIi1kICI9PT1zKXJldHVybiBzO2lmKC9cbi8udGVzdChzKSl7cmV0dXJuYEAiXG4ke3MucmVwbGFjZSgvYC9nLCJgYCIpLnJlcGxhY2UoL1wkL2csImAkIil9XG4iQGB9aWYoIS9eW19cLy1dLy50ZXN0KHMpKXtyZXR1cm5gJyR7cy5yZXBsYWNlKC8nL2csIicnIil9J2B9cmV0dXJuIHN9O2NvbnN0IGN1cmxpZnk9KHMsbyxpLGE9IiIpPT57bGV0IHU9ITEsXz0iIjtjb25zdCBhZGRXb3Jkcz0oLi4ucyk9Pl8rPSIgIitzLm1hcChvKS5qb2luKCIgIiksYWRkV29yZHNXaXRob3V0TGVhZGluZ1NwYWNlPSguLi5zKT0+Xys9cy5tYXAobykuam9pbigiICIpLGFkZE5ld0xpbmU9KCk9Pl8rPWAgJHtpfWAsYWRkSW5kZW50PShzPTEpPT5fKz0iICAiLnJlcGVhdChzKTtsZXQgdz1zLmdldCgiaGVhZGVycyIpO18rPSJjdXJsIithO2NvbnN0IHg9cy5nZXQoImN1cmxPcHRpb25zIik7aWYoemUuTGlzdC5pc0xpc3QoeCkmJiF4LmlzRW1wdHkoKSYmYWRkV29yZHMoLi4ucy5nZXQoImN1cmxPcHRpb25zIikpLGFkZFdvcmRzKCItWCIscy5nZXQoIm1ldGhvZCIpKSxhZGROZXdMaW5lKCksYWRkSW5kZW50KCksYWRkV29yZHNXaXRob3V0TGVhZGluZ1NwYWNlKGAke3MuZ2V0KCJ1cmwiKX1gKSx3JiZ3LnNpemUpZm9yKGxldCBvIG9mIHMuZ2V0KCJoZWFkZXJzIikuZW50cmllcygpKXthZGROZXdMaW5lKCksYWRkSW5kZW50KCk7bGV0W3MsaV09bzthZGRXb3Jkc1dpdGhvdXRMZWFkaW5nU3BhY2UoIi1IIixgJHtzfTogJHtpfWApLHU9dXx8L15jb250ZW50LXR5cGUkL2kudGVzdChzKSYmL15tdWx0aXBhcnRcL2Zvcm0tZGF0YSQvaS50ZXN0KGkpfWNvbnN0IEM9cy5nZXQoImJvZHkiKTtpZihDKWlmKHUmJlsiUE9TVCIsIlBVVCIsIlBBVENIIl0uaW5jbHVkZXMocy5nZXQoIm1ldGhvZCIpKSlmb3IobGV0W3Msb11vZiBDLmVudHJ5U2VxKCkpe2xldCBpPWV4dHJhY3RLZXkocyk7YWRkTmV3TGluZSgpLGFkZEluZGVudCgpLGFkZFdvcmRzV2l0aG91dExlYWRpbmdTcGFjZSgiLUYiKSxvIGluc3RhbmNlb2YgbHQuRmlsZSYmInN0cmluZyI9PXR5cGVvZiBvLnZhbHVlT2YoKT9hZGRXb3JkcyhgJHtpfT0ke28uZGF0YX0ke28udHlwZT9gO3R5cGU9JHtvLnR5cGV9YDoiIn1gKTpvIGluc3RhbmNlb2YgbHQuRmlsZT9hZGRXb3JkcyhgJHtpfT1AJHtvLm5hbWV9JHtvLnR5cGU/YDt0eXBlPSR7by50eXBlfWA6IiJ9YCk6YWRkV29yZHMoYCR7aX09JHtvfWApfWVsc2UgaWYoQyBpbnN0YW5jZW9mIGx0LkZpbGUpYWRkTmV3TGluZSgpLGFkZEluZGVudCgpLGFkZFdvcmRzV2l0aG91dExlYWRpbmdTcGFjZShgLS1kYXRhLWJpbmFyeSAnQCR7Qy5uYW1lfSdgKTtlbHNle2FkZE5ld0xpbmUoKSxhZGRJbmRlbnQoKSxhZGRXb3Jkc1dpdGhvdXRMZWFkaW5nU3BhY2UoIi1kICIpO2xldCBvPUM7emUuTWFwLmlzTWFwKG8pP2FkZFdvcmRzV2l0aG91dExlYWRpbmdTcGFjZShmdW5jdGlvbiBnZXRTdHJpbmdCb2R5T2ZNYXAocyl7bGV0IG89W107Zm9yKGxldFtpLGFdb2Ygcy5nZXQoImJvZHkiKS5lbnRyeVNlcSgpKXtsZXQgcz1leHRyYWN0S2V5KGkpO2EgaW5zdGFuY2VvZiBsdC5GaWxlP28ucHVzaChgICAiJHtzfSI6IHtcbiAgICAibmFtZSI6ICIke2EubmFtZX0iJHthLnR5cGU/YCxcbiAgICAidHlwZSI6ICIke2EudHlwZX0iYDoiIn1cbiAgfWApOm8ucHVzaChgICAiJHtzfSI6ICR7SlNPTi5zdHJpbmdpZnkoYSxudWxsLDIpLnJlcGxhY2UoLyhcclxufFxyfFxuKS9nLCJcbiAgIil9YCl9cmV0dXJuYHtcbiR7by5qb2luKCIsXG4iKX1cbn1gfShzKSk6KCJzdHJpbmciIT10eXBlb2YgbyYmKG89SlNPTi5zdHJpbmdpZnkobykpLGFkZFdvcmRzV2l0aG91dExlYWRpbmdTcGFjZShvKSl9ZWxzZSBDfHwiUE9TVCIhPT1zLmdldCgibWV0aG9kIil8fChhZGROZXdMaW5lKCksYWRkSW5kZW50KCksYWRkV29yZHNXaXRob3V0TGVhZGluZ1NwYWNlKCItZCAnJyIpKTtyZXR1cm4gX30scmVxdWVzdFNuaXBwZXRHZW5lcmF0b3JfY3VybF9wb3dlcnNoZWxsPXM9PmN1cmxpZnkocyxlc2NhcGVQb3dlcnNoZWxsLCJgXG4iLCIuZXhlIikscmVxdWVzdFNuaXBwZXRHZW5lcmF0b3JfY3VybF9iYXNoPXM9PmN1cmxpZnkocyxlc2NhcGVTaGVsbCwiXFxcbiIpLHJlcXVlc3RTbmlwcGV0R2VuZXJhdG9yX2N1cmxfY21kPXM9PmN1cmxpZnkocyxlc2NhcGVDTUQsIl5cbiIpLHJlcXVlc3Rfc25pcHBldHNfc2VsZWN0b3JzX3N0YXRlPXM9PnN8fCgwLHplLk1hcCkoKSxVbj1VdChyZXF1ZXN0X3NuaXBwZXRzX3NlbGVjdG9yc19zdGF0ZSwocz0+e2NvbnN0IG89cy5nZXQoImxhbmd1YWdlcyIpLGk9cy5nZXQoImdlbmVyYXRvcnMiLCgwLHplLk1hcCkoKSk7cmV0dXJuIW98fG8uaXNFbXB0eSgpP2k6aS5maWx0ZXIoKChzLGkpPT5vLmluY2x1ZGVzKGkpKSl9KSksZ2V0U25pcHBldEdlbmVyYXRvcnM9cz0+KHtmbjpvfSk9PlVuKHMpLm1hcCgoKHMsaSk9Pntjb25zdCBhPShzPT5vW2ByZXF1ZXN0U25pcHBldEdlbmVyYXRvcl8ke3N9YF0pKGkpO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBhP251bGw6cy5zZXQoImZuIixhKX0pKS5maWx0ZXIoKHM9PnMpKSxWbj1VdChyZXF1ZXN0X3NuaXBwZXRzX3NlbGVjdG9yc19zdGF0ZSwocz0+cy5nZXQoImFjdGl2ZUxhbmd1YWdlIikpKSx6bj1VdChyZXF1ZXN0X3NuaXBwZXRzX3NlbGVjdG9yc19zdGF0ZSwocz0+cy5nZXQoImRlZmF1bHRFeHBhbmRlZCIpKSk7dmFyIFduPV9fd2VicGFja19yZXF1aXJlX18oNDY5NDIpLEpuPV9fd2VicGFja19yZXF1aXJlX18ubihXbiksSG49X193ZWJwYWNrX3JlcXVpcmVfXyg1OTM5OSk7Y29uc3QgS249e2N1cnNvcjoicG9pbnRlciIsbGluZUhlaWdodDoxLGRpc3BsYXk6ImlubGluZS1mbGV4IixiYWNrZ3JvdW5kQ29sb3I6InJnYigyNTAsIDI1MCwgMjUwKSIscGFkZGluZ0JvdHRvbToiMCIscGFkZGluZ1RvcDoiMCIsYm9yZGVyOiIxcHggc29saWQgcmdiKDUxLCA1MSwgNTEpIixib3JkZXJSYWRpdXM6IjRweCA0cHggMCAwIixib3hTaGFkb3c6Im5vbmUiLGJvcmRlckJvdHRvbToibm9uZSJ9LEduPXtjdXJzb3I6InBvaW50ZXIiLGxpbmVIZWlnaHQ6MSxkaXNwbGF5OiJpbmxpbmUtZmxleCIsYmFja2dyb3VuZENvbG9yOiJyZ2IoNTEsIDUxLCA1MSkiLGJveFNoYWRvdzoibm9uZSIsYm9yZGVyOiIxcHggc29saWQgcmdiKDUxLCA1MSwgNTEpIixwYWRkaW5nQm90dG9tOiIwIixwYWRkaW5nVG9wOiIwIixib3JkZXJSYWRpdXM6IjRweCA0cHggMCAwIixtYXJnaW5Ub3A6Ii01cHgiLG1hcmdpblJpZ2h0OiItNXB4IixtYXJnaW5MZWZ0OiItNXB4Iix6SW5kZXg6Ijk5OTkiLGJvcmRlckJvdHRvbToibm9uZSJ9LHJlcXVlc3Rfc25pcHBldHM9KHtyZXF1ZXN0OnMscmVxdWVzdFNuaXBwZXRzU2VsZWN0b3JzOm8sZ2V0Q29tcG9uZW50Oml9KT0+e2NvbnN0IGE9KDAsUmUudXNlUmVmKShudWxsKSx1PWkoIkFycm93VXBJY29uIiksXz1pKCJBcnJvd0Rvd25JY29uIiksdz1pKCJTeW50YXhIaWdobGlnaHRlciIsITApLFt4LENdPSgwLFJlLnVzZVN0YXRlKShvLmdldFNuaXBwZXRHZW5lcmF0b3JzKCk/LmtleVNlcSgpLmZpcnN0KCkpLFtqLExdPSgwLFJlLnVzZVN0YXRlKShvPy5nZXREZWZhdWx0RXhwYW5kZWQoKSksQj1vLmdldFNuaXBwZXRHZW5lcmF0b3JzKCksJD1CLmdldCh4KSxVPSQuZ2V0KCJmbiIpKHMpLGhhbmRsZVNldElzRXhwYW5kZWQ9KCk9PntMKCFqKX0saGFuZGxlR2V0QnRuU3R5bGU9cz0+cz09PXg/R246S24saGFuZGxlUHJldmVudFlTY3JvbGxpbmdCZXlvbmRFbGVtZW50PXM9Pntjb25zdHt0YXJnZXQ6byxkZWx0YVk6aX09cyx7c2Nyb2xsSGVpZ2h0OmEsb2Zmc2V0SGVpZ2h0OnUsc2Nyb2xsVG9wOl99PW87YT51JiYoMD09PV8mJmk8MHx8dStfPj1hJiZpPjApJiZzLnByZXZlbnREZWZhdWx0KCl9O3JldHVybigwLFJlLnVzZUVmZmVjdCkoKCgpPT57fSksW10pLCgwLFJlLnVzZUVmZmVjdCkoKCgpPT57Y29uc3Qgcz1BcnJheS5mcm9tKGEuY3VycmVudC5jaGlsZE5vZGVzKS5maWx0ZXIoKHM9PiEhcy5ub2RlVHlwZSYmcy5jbGFzc0xpc3Q/LmNvbnRhaW5zKCJjdXJsLWNvbW1hbmQiKSkpO3JldHVybiBzLmZvckVhY2goKHM9PnMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsaGFuZGxlUHJldmVudFlTY3JvbGxpbmdCZXlvbmRFbGVtZW50LHtwYXNzaXZlOiExfSkpKSwoKT0+e3MuZm9yRWFjaCgocz0+cy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIixoYW5kbGVQcmV2ZW50WVNjcm9sbGluZ0JleW9uZEVsZW1lbnQpKSl9fSksW3NdKSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InJlcXVlc3Qtc25pcHBldHMiLHJlZjphfSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtzdHlsZTp7d2lkdGg6IjEwMCUiLGRpc3BsYXk6ImZsZXgiLGp1c3RpZnlDb250ZW50OiJmbGV4LXN0YXJ0IixhbGlnbkl0ZW1zOiJjZW50ZXIiLG1hcmdpbkJvdHRvbToiMTVweCJ9fSxSZS5jcmVhdGVFbGVtZW50KCJoNCIse29uQ2xpY2s6KCk9PmhhbmRsZVNldElzRXhwYW5kZWQoKSxzdHlsZTp7Y3Vyc29yOiJwb2ludGVyIn19LCJTbmlwcGV0cyIpLFJlLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse29uQ2xpY2s6KCk9PmhhbmRsZVNldElzRXhwYW5kZWQoKSxzdHlsZTp7Ym9yZGVyOiJub25lIixiYWNrZ3JvdW5kOiJub25lIn0sdGl0bGU6aj8iQ29sbGFwc2Ugb3BlcmF0aW9uIjoiRXhwYW5kIG9wZXJhdGlvbiJ9LGo/UmUuY3JlYXRlRWxlbWVudChfLHtjbGFzc05hbWU6ImFycm93Iix3aWR0aDoiMTAiLGhlaWdodDoiMTAifSk6UmUuY3JlYXRlRWxlbWVudCh1LHtjbGFzc05hbWU6ImFycm93Iix3aWR0aDoiMTAiLGhlaWdodDoiMTAifSkpKSxqJiZSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImN1cmwtY29tbWFuZCJ9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse3N0eWxlOntwYWRkaW5nTGVmdDoiMTVweCIscGFkZGluZ1JpZ2h0OiIxMHB4Iix3aWR0aDoiMTAwJSIsZGlzcGxheToiZmxleCJ9fSxCLmVudHJ5U2VxKCkubWFwKCgoW3Msb10pPT5SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Sm4oKSgiYnRuIix7YWN0aXZlOnM9PT14fSksc3R5bGU6aGFuZGxlR2V0QnRuU3R5bGUocyksa2V5OnMsb25DbGljazooKT0+KHM9Pnt4IT09cyYmQyhzKX0pKHMpfSxSZS5jcmVhdGVFbGVtZW50KCJoNCIse3N0eWxlOnM9PT14P3tjb2xvcjoid2hpdGUifTp7fX0sby5nZXQoInRpdGxlIikpKSkpKSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImNvcHktdG8tY2xpcGJvYXJkIn0sUmUuY3JlYXRlRWxlbWVudChIbi5Db3B5VG9DbGlwYm9hcmQse3RleHQ6VX0sUmUuY3JlYXRlRWxlbWVudCgiYnV0dG9uIixudWxsKSkpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KHcse2xhbmd1YWdlOiQuZ2V0KCJzeW50YXgiKSxjbGFzc05hbWU6ImN1cmwgbWljcm9saWdodCIscmVuZGVyUGxhaW5UZXh0Oih7Y2hpbGRyZW46cyxQbGFpblRleHRWaWV3ZXI6b30pPT5SZS5jcmVhdGVFbGVtZW50KG8se2NsYXNzTmFtZToiY3VybCJ9LHMpfSxVKSkpKX0scGx1Z2luc19yZXF1ZXN0X3NuaXBwZXRzPSgpPT4oe2NvbXBvbmVudHM6e1JlcXVlc3RTbmlwcGV0czpyZXF1ZXN0X3NuaXBwZXRzfSxmbjp7cmVxdWVzdFNuaXBwZXRHZW5lcmF0b3JfY3VybF9iYXNoLHJlcXVlc3RTbmlwcGV0R2VuZXJhdG9yX2N1cmxfY21kLHJlcXVlc3RTbmlwcGV0R2VuZXJhdG9yX2N1cmxfcG93ZXJzaGVsbH0sc3RhdGVQbHVnaW5zOntyZXF1ZXN0U25pcHBldHM6e3NlbGVjdG9yczokfX19KTtjbGFzcyBNb2RlbENvbGxhcHNlIGV4dGVuZHMgUmUuQ29tcG9uZW50e3N0YXRpYyBkZWZhdWx0UHJvcHM9e2NvbGxhcHNlZENvbnRlbnQ6InsuLi59IixleHBhbmRlZDohMSx0aXRsZTpudWxsLG9uVG9nZ2xlOigpPT57fSxoaWRlU2VsZk9uRXhwYW5kOiExLHNwZWNQYXRoOldlKCkuTGlzdChbXSl9O2NvbnN0cnVjdG9yKHMsbyl7c3VwZXIocyxvKTtsZXR7ZXhwYW5kZWQ6aSxjb2xsYXBzZWRDb250ZW50OmF9PXRoaXMucHJvcHM7dGhpcy5zdGF0ZT17ZXhwYW5kZWQ6aSxjb2xsYXBzZWRDb250ZW50OmF8fE1vZGVsQ29sbGFwc2UuZGVmYXVsdFByb3BzLmNvbGxhcHNlZENvbnRlbnR9fWNvbXBvbmVudERpZE1vdW50KCl7Y29uc3R7aGlkZVNlbGZPbkV4cGFuZDpzLGV4cGFuZGVkOm8sbW9kZWxOYW1lOml9PXRoaXMucHJvcHM7cyYmbyYmdGhpcy5wcm9wcy5vblRvZ2dsZShpLG8pfVVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHMpe3RoaXMucHJvcHMuZXhwYW5kZWQhPT1zLmV4cGFuZGVkJiZ0aGlzLnNldFN0YXRlKHtleHBhbmRlZDpzLmV4cGFuZGVkfSl9dG9nZ2xlQ29sbGFwc2VkPSgpPT57dGhpcy5wcm9wcy5vblRvZ2dsZSYmdGhpcy5wcm9wcy5vblRvZ2dsZSh0aGlzLnByb3BzLm1vZGVsTmFtZSwhdGhpcy5zdGF0ZS5leHBhbmRlZCksdGhpcy5zZXRTdGF0ZSh7ZXhwYW5kZWQ6IXRoaXMuc3RhdGUuZXhwYW5kZWR9KX07b25Mb2FkPXM9PntpZihzJiZ0aGlzLnByb3BzLmxheW91dFNlbGVjdG9ycyl7Y29uc3Qgbz10aGlzLnByb3BzLmxheW91dFNlbGVjdG9ycy5nZXRTY3JvbGxUb0tleSgpO1dlKCkuaXMobyx0aGlzLnByb3BzLnNwZWNQYXRoKSYmdGhpcy50b2dnbGVDb2xsYXBzZWQoKSx0aGlzLnByb3BzLmxheW91dEFjdGlvbnMucmVhZHlUb1Njcm9sbCh0aGlzLnByb3BzLnNwZWNQYXRoLHMucGFyZW50RWxlbWVudCl9fTtyZW5kZXIoKXtjb25zdHt0aXRsZTpzLGNsYXNzZXM6b309dGhpcy5wcm9wcztyZXR1cm4gdGhpcy5zdGF0ZS5leHBhbmRlZCYmdGhpcy5wcm9wcy5oaWRlU2VsZk9uRXhwYW5kP1JlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6b3x8IiJ9LHRoaXMucHJvcHMuY2hpbGRyZW4pOlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6b3x8IiIscmVmOnRoaXMub25Mb2FkfSxSZS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHsiYXJpYS1leHBhbmRlZCI6dGhpcy5zdGF0ZS5leHBhbmRlZCxjbGFzc05hbWU6Im1vZGVsLWJveC1jb250cm9sIixvbkNsaWNrOnRoaXMudG9nZ2xlQ29sbGFwc2VkfSxzJiZSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwb2ludGVyIn0scyksUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWwtdG9nZ2xlIisodGhpcy5zdGF0ZS5leHBhbmRlZD8iIjoiIGNvbGxhcHNlZCIpfSksIXRoaXMuc3RhdGUuZXhwYW5kZWQmJlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsdGhpcy5zdGF0ZS5jb2xsYXBzZWRDb250ZW50KSksdGhpcy5zdGF0ZS5leHBhbmRlZCYmdGhpcy5wcm9wcy5jaGlsZHJlbil9fWNvbnN0IHVzZVRhYnM9KHtpbml0aWFsVGFiOnMsaXNFeGVjdXRlOm8sc2NoZW1hOmksZXhhbXBsZTphfSk9Pntjb25zdCB1PSgwLFJlLnVzZU1lbW8pKCgoKT0+KHtleGFtcGxlOiJleGFtcGxlIixtb2RlbDoibW9kZWwifSkpLFtdKSxfPSgwLFJlLnVzZU1lbW8pKCgoKT0+T2JqZWN0LmtleXModSkpLFt1XSkuaW5jbHVkZXMocykmJmkmJiFvP3M6dS5leGFtcGxlLHc9KHM9Pntjb25zdCBvPSgwLFJlLnVzZVJlZikoKTtyZXR1cm4oMCxSZS51c2VFZmZlY3QpKCgoKT0+e28uY3VycmVudD1zfSkpLG8uY3VycmVudH0pKG8pLFt4LENdPSgwLFJlLnVzZVN0YXRlKShfKSxqPSgwLFJlLnVzZUNhbGxiYWNrKSgocz0+e0Mocy50YXJnZXQuZGF0YXNldC5uYW1lKX0pLFtdKTtyZXR1cm4oMCxSZS51c2VFZmZlY3QpKCgoKT0+e3cmJiFvJiZhJiZDKHUuZXhhbXBsZSl9KSxbdyxvLGFdKSx7YWN0aXZlVGFiOngsb25UYWJDaGFuZ2U6aix0YWJzOnV9fSxtb2RlbF9leGFtcGxlPSh7c2NoZW1hOnMsZXhhbXBsZTpvLGlzRXhlY3V0ZTppPSExLHNwZWNQYXRoOmEsaW5jbHVkZVdyaXRlT25seTp1PSExLGluY2x1ZGVSZWFkT25seTpfPSExLGdldENvbXBvbmVudDp3LGdldENvbmZpZ3M6eCxzcGVjU2VsZWN0b3JzOkN9KT0+e2NvbnN0e2RlZmF1bHRNb2RlbFJlbmRlcmluZzpqLGRlZmF1bHRNb2RlbEV4cGFuZERlcHRoOkx9PXgoKSxCPXcoIk1vZGVsV3JhcHBlciIpLCQ9dygiSGlnaGxpZ2h0Q29kZSIsITApLFU9eHQoKSg1KS50b1N0cmluZygiYmFzZTY0IiksVj14dCgpKDUpLnRvU3RyaW5nKCJiYXNlNjQiKSx6PXh0KCkoNSkudG9TdHJpbmcoImJhc2U2NCIpLFk9eHQoKSg1KS50b1N0cmluZygiYmFzZTY0IiksWj1DLmlzT0FTMygpLHthY3RpdmVUYWI6ZWUsdGFiczppZSxvblRhYkNoYW5nZTphZX09dXNlVGFicyh7aW5pdGlhbFRhYjpqLGlzRXhlY3V0ZTppLHNjaGVtYTpzLGV4YW1wbGU6b30pO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im1vZGVsLWV4YW1wbGUifSxSZS5jcmVhdGVFbGVtZW50KCJ1bCIse2NsYXNzTmFtZToidGFiIixyb2xlOiJ0YWJsaXN0In0sUmUuY3JlYXRlRWxlbWVudCgibGkiLHtjbGFzc05hbWU6Sm4oKSgidGFiaXRlbSIse2FjdGl2ZTplZT09PWllLmV4YW1wbGV9KSxyb2xlOiJwcmVzZW50YXRpb24ifSxSZS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHsiYXJpYS1jb250cm9scyI6ViwiYXJpYS1zZWxlY3RlZCI6ZWU9PT1pZS5leGFtcGxlLGNsYXNzTmFtZToidGFibGlua3MiLCJkYXRhLW5hbWUiOiJleGFtcGxlIixpZDpVLG9uQ2xpY2s6YWUscm9sZToidGFiIn0saT8iRWRpdCBWYWx1ZSI6IkV4YW1wbGUgVmFsdWUiKSkscyYmUmUuY3JlYXRlRWxlbWVudCgibGkiLHtjbGFzc05hbWU6Sm4oKSgidGFiaXRlbSIse2FjdGl2ZTplZT09PWllLm1vZGVsfSkscm9sZToicHJlc2VudGF0aW9uIn0sUmUuY3JlYXRlRWxlbWVudCgiYnV0dG9uIix7ImFyaWEtY29udHJvbHMiOlksImFyaWEtc2VsZWN0ZWQiOmVlPT09aWUubW9kZWwsY2xhc3NOYW1lOkpuKCkoInRhYmxpbmtzIix7aW5hY3RpdmU6aX0pLCJkYXRhLW5hbWUiOiJtb2RlbCIsaWQ6eixvbkNsaWNrOmFlLHJvbGU6InRhYiJ9LFo/IlNjaGVtYSI6Ik1vZGVsIikpKSxlZT09PWllLmV4YW1wbGUmJlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIseyJhcmlhLWhpZGRlbiI6ZWUhPT1pZS5leGFtcGxlLCJhcmlhLWxhYmVsbGVkYnkiOlUsImRhdGEtbmFtZSI6ImV4YW1wbGVQYW5lbCIsaWQ6Vixyb2xlOiJ0YWJwYW5lbCIsdGFiSW5kZXg6IjAifSxvfHxSZS5jcmVhdGVFbGVtZW50KCQsbnVsbCwiKG5vIGV4YW1wbGUgYXZhaWxhYmxlIikpLGVlPT09aWUubW9kZWwmJlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibW9kZWwtY29udGFpbmVyIiwiYXJpYS1oaWRkZW4iOmVlPT09aWUuZXhhbXBsZSwiYXJpYS1sYWJlbGxlZGJ5Ijp6LCJkYXRhLW5hbWUiOiJtb2RlbFBhbmVsIixpZDpZLHJvbGU6InRhYnBhbmVsIix0YWJJbmRleDoiMCJ9LFJlLmNyZWF0ZUVsZW1lbnQoQix7c2NoZW1hOnMsZ2V0Q29tcG9uZW50OncsZ2V0Q29uZmlnczp4LHNwZWNTZWxlY3RvcnM6QyxleHBhbmREZXB0aDpMLHNwZWNQYXRoOmEsaW5jbHVkZVJlYWRPbmx5Ol8saW5jbHVkZVdyaXRlT25seTp1fSkpKX07Y2xhc3MgTW9kZWxXcmFwcGVyIGV4dGVuZHMgUmUuQ29tcG9uZW50e29uVG9nZ2xlPShzLG8pPT57dGhpcy5wcm9wcy5sYXlvdXRBY3Rpb25zJiZ0aGlzLnByb3BzLmxheW91dEFjdGlvbnMuc2hvdyh0aGlzLnByb3BzLmZ1bGxQYXRoLG8pfTtyZW5kZXIoKXtsZXR7Z2V0Q29tcG9uZW50OnMsZ2V0Q29uZmlnczpvfT10aGlzLnByb3BzO2NvbnN0IGk9cygiTW9kZWwiKTtsZXQgYTtyZXR1cm4gdGhpcy5wcm9wcy5sYXlvdXRTZWxlY3RvcnMmJihhPXRoaXMucHJvcHMubGF5b3V0U2VsZWN0b3JzLmlzU2hvd24odGhpcy5wcm9wcy5mdWxsUGF0aCkpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibW9kZWwtYm94In0sUmUuY3JlYXRlRWxlbWVudChpLE1uKCkoe30sdGhpcy5wcm9wcyx7Z2V0Q29uZmlnczpvLGV4cGFuZGVkOmEsZGVwdGg6MSxvblRvZ2dsZTp0aGlzLm9uVG9nZ2xlLGV4cGFuZERlcHRoOnRoaXMucHJvcHMuZXhwYW5kRGVwdGh8fDB9KSkpfX1mdW5jdGlvbiBfdHlwZW9mKHMpe3JldHVybiBfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHMpe3JldHVybiB0eXBlb2Ygc306ZnVuY3Rpb24ocyl7cmV0dXJuIHMmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnMuY29uc3RydWN0b3I9PT1TeW1ib2wmJnMhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBzfSxfdHlwZW9mKHMpfWZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHMsbyl7Zm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspe3ZhciBhPW9baV07YS5lbnVtZXJhYmxlPWEuZW51bWVyYWJsZXx8ITEsYS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGEmJihhLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocyxhLmtleSxhKX19ZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KHMsbyxpKXtyZXR1cm4gbyBpbiBzP09iamVjdC5kZWZpbmVQcm9wZXJ0eShzLG8se3ZhbHVlOmksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpzW29dPWksc31mdW5jdGlvbiBvd25LZXlzKHMsbyl7dmFyIGk9T2JqZWN0LmtleXMocyk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTtvJiYoYT1hLmZpbHRlcigoZnVuY3Rpb24obyl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocyxvKS5lbnVtZXJhYmxlfSkpKSxpLnB1c2guYXBwbHkoaSxhKX1yZXR1cm4gaX1mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yocyl7cmV0dXJuIF9nZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihzKXtyZXR1cm4gcy5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihzKX0sX2dldFByb3RvdHlwZU9mKHMpfWZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihzLG8pe3JldHVybiBfc2V0UHJvdG90eXBlT2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YocyxvKXtyZXR1cm4gcy5fX3Byb3RvX189byxzfSxfc2V0UHJvdG90eXBlT2YocyxvKX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzLG8pe3JldHVybiFvfHwib2JqZWN0IiE9dHlwZW9mIG8mJiJmdW5jdGlvbiIhPXR5cGVvZiBvP2Z1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQocyl7aWYodm9pZCAwPT09cyl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBzfShzKTpvfXZhciBZbj17fTtmdW5jdGlvbiByZWFjdF9pbW11dGFibGVfcHVyZV9jb21wb25lbnRfZXNfZ2V0KHMsbyxpKXtyZXR1cm4gZnVuY3Rpb24gaXNJbnZhbGlkKHMpe3JldHVybiBudWxsPT1zfShzKT9pOmZ1bmN0aW9uIGlzTWFwTGlrZShzKXtyZXR1cm4gbnVsbCE9PXMmJiJvYmplY3QiPT09X3R5cGVvZihzKSYmImZ1bmN0aW9uIj09dHlwZW9mIHMuZ2V0JiYiZnVuY3Rpb24iPT10eXBlb2Ygcy5oYXN9KHMpP3MuaGFzKG8pP3MuZ2V0KG8pOmk6aGFzT3duUHJvcGVydHkuY2FsbChzLG8pP3Nbb106aX1mdW5jdGlvbiBnZXRJbihzLG8saSl7Zm9yKHZhciBhPTA7YSE9PW8ubGVuZ3RoOylpZigocz1yZWFjdF9pbW11dGFibGVfcHVyZV9jb21wb25lbnRfZXNfZ2V0KHMsb1thKytdLFluKSk9PT1ZbilyZXR1cm4gaTtyZXR1cm4gc31mdW5jdGlvbiBjaGVjayhzKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30saT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30sYT1mdW5jdGlvbiBjcmVhdGVDaGVja2VyKHMsbyl7cmV0dXJuIGZ1bmN0aW9uKGkpe2lmKCJzdHJpbmciPT10eXBlb2YgaSlyZXR1cm4oMCx6ZS5pcykob1tpXSxzW2ldKTtpZihBcnJheS5pc0FycmF5KGkpKXJldHVybigwLHplLmlzKShnZXRJbihvLGkpLGdldEluKHMsaSkpO3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQga2V5OiBleHBlY3RlZCBBcnJheSBvciBzdHJpbmc6ICIraSl9fShvLGkpLHU9c3x8T2JqZWN0LmtleXMoZnVuY3Rpb24gX29iamVjdFNwcmVhZDIocyl7Zm9yKHZhciBvPTE7bzxhcmd1bWVudHMubGVuZ3RoO28rKyl7dmFyIGk9bnVsbCE9YXJndW1lbnRzW29dP2FyZ3VtZW50c1tvXTp7fTtvJTI/b3duS2V5cyhpLCEwKS5mb3JFYWNoKChmdW5jdGlvbihvKXtfZGVmaW5lUHJvcGVydHkocyxvLGlbb10pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHMsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoaSkpOm93bktleXMoaSkuZm9yRWFjaCgoZnVuY3Rpb24obyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHMsbyxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksbykpfSkpfXJldHVybiBzfSh7fSxpLHt9LG8pKTtyZXR1cm4gdS5ldmVyeShhKX1jb25zdCBYbj1mdW5jdGlvbihzKXtmdW5jdGlvbiBJbW11dGFibGVQdXJlQ29tcG9uZW50KCl7cmV0dXJuIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhzLG8pe2lmKCEocyBpbnN0YW5jZW9mIG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLEltbXV0YWJsZVB1cmVDb21wb25lbnQpLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsX2dldFByb3RvdHlwZU9mKEltbXV0YWJsZVB1cmVDb21wb25lbnQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9cmV0dXJuIGZ1bmN0aW9uIF9pbmhlcml0cyhzLG8pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBvJiZudWxsIT09byl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobyYmby5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxvJiZfc2V0UHJvdG90eXBlT2YocyxvKX0oSW1tdXRhYmxlUHVyZUNvbXBvbmVudCxzKSxmdW5jdGlvbiBfY3JlYXRlQ2xhc3MocyxvLGkpe3JldHVybiBvJiZfZGVmaW5lUHJvcGVydGllcyhzLnByb3RvdHlwZSxvKSxpJiZfZGVmaW5lUHJvcGVydGllcyhzLGkpLHN9KEltbXV0YWJsZVB1cmVDb21wb25lbnQsW3trZXk6InNob3VsZENvbXBvbmVudFVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKHMpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtyZXR1cm4hY2hlY2sodGhpcy51cGRhdGVPblByb3BzLHRoaXMucHJvcHMscywidXBkYXRlT25Qcm9wcyIpfHwhY2hlY2sodGhpcy51cGRhdGVPblN0YXRlcyx0aGlzLnN0YXRlLG8sInVwZGF0ZU9uU3RhdGVzIil9fV0pLEltbXV0YWJsZVB1cmVDb21wb25lbnR9KFJlLkNvbXBvbmVudCk7dmFyIFFuLFpuPV9fd2VicGFja19yZXF1aXJlX18oNTU1NiksZXM9X193ZWJwYWNrX3JlcXVpcmVfXy5uKFpuKTtmdW5jdGlvbiBfZXh0ZW5kcygpe3JldHVybiBfZXh0ZW5kcz1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKHMpe2Zvcih2YXIgbz0xO288YXJndW1lbnRzLmxlbmd0aDtvKyspe3ZhciBpPWFyZ3VtZW50c1tvXTtmb3IodmFyIGEgaW4gaSkoe30pLmhhc093blByb3BlcnR5LmNhbGwoaSxhKSYmKHNbYV09aVthXSl9cmV0dXJuIHN9LF9leHRlbmRzLmFwcGx5KG51bGwsYXJndW1lbnRzKX1jb25zdCByb2xsaW5nX2xvYWQ9cz0+UmUuY3JlYXRlRWxlbWVudCgic3ZnIixfZXh0ZW5kcyh7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDoyMDAsaGVpZ2h0OjIwMCxjbGFzc05hbWU6InJvbGxpbmctbG9hZF9zdmdfX2xkcy1yb2xsaW5nIixwcmVzZXJ2ZUFzcGVjdFJhdGlvOiJ4TWlkWU1pZCIsc3R5bGU6e2JhY2tncm91bmRJbWFnZToibm9uZSIsYmFja2dyb3VuZFBvc2l0aW9uOiJpbml0aWFsIGluaXRpYWwiLGJhY2tncm91bmRSZXBlYXQ6ImluaXRpYWwgaW5pdGlhbCJ9LHZpZXdCb3g6IjAgMCAxMDAgMTAwIn0scyksUW58fChRbj1SZS5jcmVhdGVFbGVtZW50KCJjaXJjbGUiLHtjeDo1MCxjeTo1MCxyOjM1LGZpbGw6Im5vbmUiLHN0cm9rZToiIzU1NSIsc3Ryb2tlRGFzaGFycmF5OiIxNjQuOTMzNjE0MzEzNDY0MTUgNTYuOTc3ODcxNDM3ODIxMzgiLHN0cm9rZVdpZHRoOjEwfSxSZS5jcmVhdGVFbGVtZW50KCJhbmltYXRlVHJhbnNmb3JtIix7YXR0cmlidXRlTmFtZToidHJhbnNmb3JtIixiZWdpbjoiMHMiLGNhbGNNb2RlOiJsaW5lYXIiLGR1cjoiMXMiLGtleVRpbWVzOiIwOzEiLHJlcGVhdENvdW50OiJpbmRlZmluaXRlIix0eXBlOiJyb3RhdGUiLHZhbHVlczoiMCA1MCA1MDszNjAgNTAgNTAifSkpKSksZGVjb2RlUmVmTmFtZT1zPT57Y29uc3Qgbz1zLnJlcGxhY2UoL34xL2csIi8iKS5yZXBsYWNlKC9+MC9nLCJ+Iik7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQobyl9Y2F0Y2h7cmV0dXJuIG99fTtjbGFzcyBNb2RlbCBleHRlbmRzIFhue3N0YXRpYyBwcm9wVHlwZXM9e3NjaGVtYTp4bigpLm1hcC5pc1JlcXVpcmVkLGdldENvbXBvbmVudDplcygpLmZ1bmMuaXNSZXF1aXJlZCxnZXRDb25maWdzOmVzKCkuZnVuYy5pc1JlcXVpcmVkLHNwZWNTZWxlY3RvcnM6ZXMoKS5vYmplY3QuaXNSZXF1aXJlZCxuYW1lOmVzKCkuc3RyaW5nLGRpc3BsYXlOYW1lOmVzKCkuc3RyaW5nLGlzUmVmOmVzKCkuYm9vbCxyZXF1aXJlZDplcygpLmJvb2wsZXhwYW5kRGVwdGg6ZXMoKS5udW1iZXIsZGVwdGg6ZXMoKS5udW1iZXIsc3BlY1BhdGg6eG4oKS5saXN0LmlzUmVxdWlyZWQsaW5jbHVkZVJlYWRPbmx5OmVzKCkuYm9vbCxpbmNsdWRlV3JpdGVPbmx5OmVzKCkuYm9vbH07Z2V0TW9kZWxOYW1lPXM9Pi0xIT09cy5pbmRleE9mKCIjL2RlZmluaXRpb25zLyIpP2RlY29kZVJlZk5hbWUocy5yZXBsYWNlKC9eLiojXC9kZWZpbml0aW9uc1wvLywiIikpOi0xIT09cy5pbmRleE9mKCIjL2NvbXBvbmVudHMvc2NoZW1hcy8iKT9kZWNvZGVSZWZOYW1lKHMucmVwbGFjZSgvXi4qI1wvY29tcG9uZW50c1wvc2NoZW1hc1wvLywiIikpOnZvaWQgMDtnZXRSZWZTY2hlbWE9cz0+e2xldHtzcGVjU2VsZWN0b3JzOm99PXRoaXMucHJvcHM7cmV0dXJuIG8uZmluZERlZmluaXRpb24ocyl9O3JlbmRlcigpe2xldHtnZXRDb21wb25lbnQ6cyxnZXRDb25maWdzOm8sc3BlY1NlbGVjdG9yczppLHNjaGVtYTphLHJlcXVpcmVkOnUsbmFtZTpfLGlzUmVmOncsc3BlY1BhdGg6eCxkaXNwbGF5TmFtZTpDLGluY2x1ZGVSZWFkT25seTpqLGluY2x1ZGVXcml0ZU9ubHk6TH09dGhpcy5wcm9wcztjb25zdCBCPXMoIk9iamVjdE1vZGVsIiksJD1zKCJBcnJheU1vZGVsIiksVT1zKCJQcmltaXRpdmVNb2RlbCIpO2xldCBWPSJvYmplY3QiLHo9YSYmYS5nZXQoIiQkcmVmIiksWT1hJiZhLmdldCgiJHJlZiIpO2lmKCFfJiZ6JiYoXz10aGlzLmdldE1vZGVsTmFtZSh6KSksWSl7Y29uc3Qgcz10aGlzLmdldE1vZGVsTmFtZShZKSxvPXRoaXMuZ2V0UmVmU2NoZW1hKHMpO3plLk1hcC5pc01hcChvKT8oYT1vLm1lcmdlRGVlcChhKSx6fHwoYT1hLnNldCgiJCRyZWYiLFkpLHo9WSkpOnplLk1hcC5pc01hcChhKSYmMT09PWEuc2l6ZSYmKGE9bnVsbCxfPVkpfWlmKCFhKXJldHVybiBSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtb2RlbCBtb2RlbC10aXRsZSJ9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1vZGVsLXRpdGxlX190ZXh0In0sQ3x8XyksIVkmJlJlLmNyZWF0ZUVsZW1lbnQocm9sbGluZ19sb2FkLHtoZWlnaHQ6IjIwcHgiLHdpZHRoOiIyMHB4In0pKTtjb25zdCBaPWkuaXNPQVMzKCkmJmEuZ2V0KCJkZXByZWNhdGVkIik7c3dpdGNoKHc9dm9pZCAwIT09dz93OiEheixWPWEmJmEuZ2V0KCJ0eXBlIil8fFYsVil7Y2FzZSJvYmplY3QiOnJldHVybiBSZS5jcmVhdGVFbGVtZW50KEIsTW4oKSh7Y2xhc3NOYW1lOiJvYmplY3QifSx0aGlzLnByb3BzLHtzcGVjUGF0aDp4LGdldENvbmZpZ3M6byxzY2hlbWE6YSxuYW1lOl8sZGVwcmVjYXRlZDpaLGlzUmVmOncsaW5jbHVkZVJlYWRPbmx5OmosaW5jbHVkZVdyaXRlT25seTpMfSkpO2Nhc2UiYXJyYXkiOnJldHVybiBSZS5jcmVhdGVFbGVtZW50KCQsTW4oKSh7Y2xhc3NOYW1lOiJhcnJheSJ9LHRoaXMucHJvcHMse2dldENvbmZpZ3M6byxzY2hlbWE6YSxuYW1lOl8sZGVwcmVjYXRlZDpaLHJlcXVpcmVkOnUsaW5jbHVkZVJlYWRPbmx5OmosaW5jbHVkZVdyaXRlT25seTpMfSkpO2RlZmF1bHQ6cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoVSxNbigpKHt9LHRoaXMucHJvcHMse2dldENvbXBvbmVudDpzLGdldENvbmZpZ3M6byxzY2hlbWE6YSxuYW1lOl8sZGVwcmVjYXRlZDpaLHJlcXVpcmVkOnV9KSl9fX1jbGFzcyBNb2RlbHMgZXh0ZW5kcyBSZS5Db21wb25lbnR7Z2V0U2NoZW1hQmFzZVBhdGg9KCk9PnRoaXMucHJvcHMuc3BlY1NlbGVjdG9ycy5pc09BUzMoKT9bImNvbXBvbmVudHMiLCJzY2hlbWFzIl06WyJkZWZpbml0aW9ucyJdO2dldENvbGxhcHNlZENvbnRlbnQ9KCk9PiIgIjtoYW5kbGVUb2dnbGU9KHMsbyk9Pntjb25zdHtsYXlvdXRBY3Rpb25zOml9PXRoaXMucHJvcHM7aS5zaG93KFsuLi50aGlzLmdldFNjaGVtYUJhc2VQYXRoKCksc10sbyksbyYmdGhpcy5wcm9wcy5zcGVjQWN0aW9ucy5yZXF1ZXN0UmVzb2x2ZWRTdWJ0cmVlKFsuLi50aGlzLmdldFNjaGVtYUJhc2VQYXRoKCksc10pfTtvbkxvYWRNb2RlbHM9cz0+e3MmJnRoaXMucHJvcHMubGF5b3V0QWN0aW9ucy5yZWFkeVRvU2Nyb2xsKHRoaXMuZ2V0U2NoZW1hQmFzZVBhdGgoKSxzKX07b25Mb2FkTW9kZWw9cz0+e2lmKHMpe2NvbnN0IG89cy5nZXRBdHRyaWJ1dGUoImRhdGEtbmFtZSIpO3RoaXMucHJvcHMubGF5b3V0QWN0aW9ucy5yZWFkeVRvU2Nyb2xsKFsuLi50aGlzLmdldFNjaGVtYUJhc2VQYXRoKCksb10scyl9fTtyZW5kZXIoKXtsZXR7c3BlY1NlbGVjdG9yczpzLGdldENvbXBvbmVudDpvLGxheW91dFNlbGVjdG9yczppLGxheW91dEFjdGlvbnM6YSxnZXRDb25maWdzOnV9PXRoaXMucHJvcHMsXz1zLmRlZmluaXRpb25zKCkse2RvY0V4cGFuc2lvbjp3LGRlZmF1bHRNb2RlbHNFeHBhbmREZXB0aDp4fT11KCk7aWYoIV8uc2l6ZXx8eDwwKXJldHVybiBudWxsO2NvbnN0IEM9dGhpcy5nZXRTY2hlbWFCYXNlUGF0aCgpO2xldCBqPWkuaXNTaG93bihDLHg+MCYmIm5vbmUiIT09dyk7Y29uc3QgTD1zLmlzT0FTMygpLEI9bygiTW9kZWxXcmFwcGVyIiksJD1vKCJDb2xsYXBzZSIpLFU9bygiTW9kZWxDb2xsYXBzZSIpLFY9bygiSnVtcFRvUGF0aCIsITApLHo9bygiQXJyb3dVcEljb24iKSxZPW8oIkFycm93RG93bkljb24iKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIse2NsYXNzTmFtZTpqPyJtb2RlbHMgaXMtb3BlbiI6Im1vZGVscyIscmVmOnRoaXMub25Mb2FkTW9kZWxzfSxSZS5jcmVhdGVFbGVtZW50KCJoNCIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHsiYXJpYS1leHBhbmRlZCI6aixjbGFzc05hbWU6Im1vZGVscy1jb250cm9sIixvbkNsaWNrOigpPT5hLnNob3coQywhail9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsTD8iU2NoZW1hcyI6Ik1vZGVscyIpLGo/UmUuY3JlYXRlRWxlbWVudCh6LG51bGwpOlJlLmNyZWF0ZUVsZW1lbnQoWSxudWxsKSkpLFJlLmNyZWF0ZUVsZW1lbnQoJCx7aXNPcGVuZWQ6an0sXy5lbnRyeVNlcSgpLm1hcCgoKFtfXSk9Pntjb25zdCB3PVsuLi5DLF9dLGo9V2UoKS5MaXN0KHcpLEw9cy5zcGVjUmVzb2x2ZWRTdWJ0cmVlKHcpLCQ9cy5zcGVjSnNvbigpLmdldEluKHcpLHo9emUuTWFwLmlzTWFwKEwpP0w6V2UoKS5NYXAoKSxZPXplLk1hcC5pc01hcCgkKT8kOldlKCkuTWFwKCksWj16LmdldCgidGl0bGUiKXx8WS5nZXQoInRpdGxlIil8fF8sZWU9aS5pc1Nob3duKHcsITEpO2VlJiYwPT09ei5zaXplJiZZLnNpemU+MCYmdGhpcy5wcm9wcy5zcGVjQWN0aW9ucy5yZXF1ZXN0UmVzb2x2ZWRTdWJ0cmVlKHcpO2NvbnN0IGllPVJlLmNyZWF0ZUVsZW1lbnQoQix7bmFtZTpfLGV4cGFuZERlcHRoOngsc2NoZW1hOnp8fFdlKCkuTWFwKCksZGlzcGxheU5hbWU6WixmdWxsUGF0aDp3LHNwZWNQYXRoOmosZ2V0Q29tcG9uZW50Om8sc3BlY1NlbGVjdG9yczpzLGdldENvbmZpZ3M6dSxsYXlvdXRTZWxlY3RvcnM6aSxsYXlvdXRBY3Rpb25zOmEsaW5jbHVkZVJlYWRPbmx5OiEwLGluY2x1ZGVXcml0ZU9ubHk6ITB9KSxhZT1SZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtb2RlbC1ib3gifSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtb2RlbCBtb2RlbC10aXRsZSJ9LFopKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7aWQ6YG1vZGVsLSR7X31gLGNsYXNzTmFtZToibW9kZWwtY29udGFpbmVyIixrZXk6YG1vZGVscy1zZWN0aW9uLSR7X31gLCJkYXRhLW5hbWUiOl8scmVmOnRoaXMub25Mb2FkTW9kZWx9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1vZGVscy1qdW1wLXRvLXBhdGgifSxSZS5jcmVhdGVFbGVtZW50KFYse3BhdGg6an0pKSxSZS5jcmVhdGVFbGVtZW50KFUse2NsYXNzZXM6Im1vZGVsLWJveCIsY29sbGFwc2VkQ29udGVudDp0aGlzLmdldENvbGxhcHNlZENvbnRlbnQoXyksb25Ub2dnbGU6dGhpcy5oYW5kbGVUb2dnbGUsdGl0bGU6YWUsZGlzcGxheU5hbWU6Wixtb2RlbE5hbWU6XyxzcGVjUGF0aDpqLGxheW91dFNlbGVjdG9yczppLGxheW91dEFjdGlvbnM6YSxoaWRlU2VsZk9uRXhwYW5kOiEwLGV4cGFuZGVkOng+MCYmZWV9LGllKSl9KSkudG9BcnJheSgpKSl9fWNvbnN0IGVudW1fbW9kZWw9KHt2YWx1ZTpzLGdldENvbXBvbmVudDpvfSk9PntsZXQgaT1vKCJNb2RlbENvbGxhcHNlIiksYT1SZS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLCJBcnJheSBbICIscy5jb3VudCgpLCIgXSIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcm9wLWVudW0ifSwiRW51bToiLFJlLmNyZWF0ZUVsZW1lbnQoImJyIixudWxsKSxSZS5jcmVhdGVFbGVtZW50KGkse2NvbGxhcHNlZENvbnRlbnQ6YX0sIlsgIixzLm1hcChTdHJpbmcpLmpvaW4oIiwgIiksIiBdIikpfTtmdW5jdGlvbiBpc0Fic29sdXRlVXJsKHMpe3JldHVybiBzLm1hdGNoKC9eKD86W2Etel0rOik/XC9cLy9pKX1mdW5jdGlvbiBidWlsZEJhc2VVcmwocyxvKXtyZXR1cm4gcz9pc0Fic29sdXRlVXJsKHMpP2Z1bmN0aW9uIGFkZFByb3RvY29sKHMpe3JldHVybiBzLm1hdGNoKC9eXC9cLy9pKT9gJHt3aW5kb3cubG9jYXRpb24ucHJvdG9jb2x9JHtzfWA6c30ocyk6bmV3IFVSTChzLG8pLmhyZWY6b31mdW5jdGlvbiBzYWZlQnVpbGRVcmwocyxvLHtzZWxlY3RlZFNlcnZlcjppPSIifT17fSl7dHJ5e3JldHVybiBmdW5jdGlvbiBidWlsZFVybChzLG8se3NlbGVjdGVkU2VydmVyOmk9IiJ9PXt9KXtpZighcylyZXR1cm47aWYoaXNBYnNvbHV0ZVVybChzKSlyZXR1cm4gcztjb25zdCBhPWJ1aWxkQmFzZVVybChpLG8pO3JldHVybiBpc0Fic29sdXRlVXJsKGEpP25ldyBVUkwocyxhKS5ocmVmOm5ldyBVUkwocyx3aW5kb3cubG9jYXRpb24uaHJlZikuaHJlZn0ocyxvLHtzZWxlY3RlZFNlcnZlcjppfSl9Y2F0Y2h7cmV0dXJufX1mdW5jdGlvbiBzYW5pdGl6ZVVybChzKXtpZigic3RyaW5nIiE9dHlwZW9mIHN8fCIiPT09cy50cmltKCkpcmV0dXJuIiI7Y29uc3Qgbz1zLnRyaW0oKSxpPSJhYm91dDpibGFuayI7dHJ5e2NvbnN0IHM9YGh0dHBzOi8vYmFzZSR7U3RyaW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKDIpfWAsYT1uZXcgVVJMKG8scyksdT1hLnByb3RvY29sLnNsaWNlKDAsLTEpO2lmKFsiamF2YXNjcmlwdCIsImRhdGEiLCJ2YnNjcmlwdCJdLmluY2x1ZGVzKHUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIGk7aWYoYS5vcmlnaW49PT1zKXtpZihvLnN0YXJ0c1dpdGgoIi8iKSlyZXR1cm5gJHthLnBhdGhuYW1lfSR7YS5zZWFyY2h9JHthLmhhc2h9YDtpZihvLnN0YXJ0c1dpdGgoIi4vIil8fG8uc3RhcnRzV2l0aCgiLi4vIikpe2NvbnN0IHM9by5tYXRjaCgvXihcLlwuP1wvKSsvKVswXTtyZXR1cm5gJHtzfSR7YS5wYXRobmFtZS5zdWJzdHJpbmcoMSl9JHthLnNlYXJjaH0ke2EuaGFzaH1gfXJldHVybmAke2EucGF0aG5hbWUuc3Vic3RyaW5nKDEpfSR7YS5zZWFyY2h9JHthLmhhc2h9YH1yZXR1cm4gU3RyaW5nKGEpfWNhdGNoe3JldHVybiBpfX1jbGFzcyBPYmplY3RNb2RlbCBleHRlbmRzIFJlLkNvbXBvbmVudHtyZW5kZXIoKXtsZXR7c2NoZW1hOnMsbmFtZTpvLGRpc3BsYXlOYW1lOmksaXNSZWY6YSxnZXRDb21wb25lbnQ6dSxnZXRDb25maWdzOl8sZGVwdGg6dyxvblRvZ2dsZTp4LGV4cGFuZGVkOkMsc3BlY1BhdGg6aiwuLi5MfT10aGlzLnByb3BzLHtzcGVjU2VsZWN0b3JzOkIsZXhwYW5kRGVwdGg6JCxpbmNsdWRlUmVhZE9ubHk6VSxpbmNsdWRlV3JpdGVPbmx5OlZ9PUw7Y29uc3R7aXNPQVMzOnp9PUIsWT13PjJ8fDI9PT13JiYiaXRlbXMiIT09ai5sYXN0KCk7aWYoIXMpcmV0dXJuIG51bGw7Y29uc3R7c2hvd0V4dGVuc2lvbnM6Wn09XygpLGVlPVo/Z2V0RXh0ZW5zaW9ucyhzKTooMCx6ZS5MaXN0KSgpO2xldCBpZT1zLmdldCgiZGVzY3JpcHRpb24iKSxhZT1zLmdldCgicHJvcGVydGllcyIpLGNlPXMuZ2V0KCJhZGRpdGlvbmFsUHJvcGVydGllcyIpLGxlPXMuZ2V0KCJ0aXRsZSIpfHxpfHxvLHBlPXMuZ2V0KCJyZXF1aXJlZCIpLGRlPXMuZmlsdGVyKCgocyxvKT0+LTEhPT1bIm1heFByb3BlcnRpZXMiLCJtaW5Qcm9wZXJ0aWVzIiwibnVsbGFibGUiLCJleGFtcGxlIl0uaW5kZXhPZihvKSkpLGZlPXMuZ2V0KCJkZXByZWNhdGVkIikseWU9cy5nZXRJbihbImV4dGVybmFsRG9jcyIsInVybCJdKSxiZT1zLmdldEluKFsiZXh0ZXJuYWxEb2NzIiwiZGVzY3JpcHRpb24iXSk7Y29uc3QgU2U9dSgiSnVtcFRvUGF0aCIsITApLF9lPXUoIk1hcmtkb3duIiwhMCksd2U9dSgiTW9kZWwiKSx4ZT11KCJNb2RlbENvbGxhcHNlIiksUGU9dSgiUHJvcGVydHkiKSxUZT11KCJMaW5rIiksJGU9dSgiTW9kZWxFeHRlbnNpb25zIiksSnVtcFRvUGF0aFNlY3Rpb249KCk9PlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1vZGVsLWp1bXAtdG8tcGF0aCJ9LFJlLmNyZWF0ZUVsZW1lbnQoU2Use3BhdGg6an0pKSxxZT1SZS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsInsiKSwiLi4uIixSZS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLCJ9IiksYT9SZS5jcmVhdGVFbGVtZW50KEp1bXBUb1BhdGhTZWN0aW9uLG51bGwpOiIiKSxXZT1CLmlzT0FTMygpP3MuZ2V0KCJhbGxPZiIpOm51bGwsSGU9Qi5pc09BUzMoKT9zLmdldCgiYW55T2YiKTpudWxsLFllPUIuaXNPQVMzKCk/cy5nZXQoIm9uZU9mIik6bnVsbCxYZT1CLmlzT0FTMygpP3MuZ2V0KCJub3QiKTpudWxsLFFlPWxlJiZSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtb2RlbC10aXRsZSJ9LGEmJnMuZ2V0KCIkJHJlZiIpJiZSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOkpuKCkoIm1vZGVsLWhpbnQiLHsibW9kZWwtaGludC0tZW1iZWRkZWQiOll9KX0scy5nZXQoIiQkcmVmIikpLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1vZGVsLXRpdGxlX190ZXh0In0sbGUpKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWwifSxSZS5jcmVhdGVFbGVtZW50KHhlLHttb2RlbE5hbWU6byx0aXRsZTpRZSxvblRvZ2dsZTp4LGV4cGFuZGVkOiEhQ3x8dzw9JCxjb2xsYXBzZWRDb250ZW50OnFlfSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJicmFjZS1vcGVuIG9iamVjdCJ9LCJ7IiksYT9SZS5jcmVhdGVFbGVtZW50KEp1bXBUb1BhdGhTZWN0aW9uLG51bGwpOm51bGwsUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToiaW5uZXItb2JqZWN0In0sUmUuY3JlYXRlRWxlbWVudCgidGFibGUiLHtjbGFzc05hbWU6Im1vZGVsIn0sUmUuY3JlYXRlRWxlbWVudCgidGJvZHkiLG51bGwsaWU/UmUuY3JlYXRlRWxlbWVudCgidHIiLHtjbGFzc05hbWU6ImRlc2NyaXB0aW9uIn0sUmUuY3JlYXRlRWxlbWVudCgidGQiLG51bGwsImRlc2NyaXB0aW9uOiIpLFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoX2Use3NvdXJjZTppZX0pKSk6bnVsbCx5ZSYmUmUuY3JlYXRlRWxlbWVudCgidHIiLHtjbGFzc05hbWU6ImV4dGVybmFsLWRvY3MifSxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIsbnVsbCwiZXh0ZXJuYWxEb2NzOiIpLFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoVGUse3RhcmdldDoiX2JsYW5rIixocmVmOnNhbml0aXplVXJsKHllKX0sYmV8fHllKSkpLGZlP1JlLmNyZWF0ZUVsZW1lbnQoInRyIix7Y2xhc3NOYW1lOiJwcm9wZXJ0eSJ9LFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLCJkZXByZWNhdGVkOiIpLFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLCJ0cnVlIikpOm51bGwsYWUmJmFlLnNpemU/YWUuZW50cnlTZXEoKS5maWx0ZXIoKChbLHNdKT0+KCFzLmdldCgicmVhZE9ubHkiKXx8VSkmJighcy5nZXQoIndyaXRlT25seSIpfHxWKSkpLm1hcCgoKFtzLGldKT0+e2xldCBhPXooKSYmaS5nZXQoImRlcHJlY2F0ZWQiKSx4PXplLkxpc3QuaXNMaXN0KHBlKSYmcGUuY29udGFpbnMocyksQz1bInByb3BlcnR5LXJvdyJdO3JldHVybiBhJiZDLnB1c2goImRlcHJlY2F0ZWQiKSx4JiZDLnB1c2goInJlcXVpcmVkIiksUmUuY3JlYXRlRWxlbWVudCgidHIiLHtrZXk6cyxjbGFzc05hbWU6Qy5qb2luKCIgIil9LFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLHMseCYmUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToic3RhciJ9LCIqIikpLFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQod2UsTW4oKSh7a2V5OmBvYmplY3QtJHtvfS0ke3N9XyR7aX1gfSxMLHtyZXF1aXJlZDp4LGdldENvbXBvbmVudDp1LHNwZWNQYXRoOmoucHVzaCgicHJvcGVydGllcyIscyksZ2V0Q29uZmlnczpfLHNjaGVtYTppLGRlcHRoOncrMX0pKSkpfSkpLnRvQXJyYXkoKTpudWxsLDA9PT1lZS5zaXplP251bGw6UmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInRyIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLCLCoCIpKSxSZS5jcmVhdGVFbGVtZW50KCRlLHtleHRlbnNpb25zOmVlLHByb3BDbGFzczoiZXh0ZW5zaW9uIn0pKSxjZSYmY2Uuc2l6ZT9SZS5jcmVhdGVFbGVtZW50KCJ0ciIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIsbnVsbCwiPCAqID46IiksUmUuY3JlYXRlRWxlbWVudCgidGQiLG51bGwsUmUuY3JlYXRlRWxlbWVudCh3ZSxNbigpKHt9LEwse3JlcXVpcmVkOiExLGdldENvbXBvbmVudDp1LHNwZWNQYXRoOmoucHVzaCgiYWRkaXRpb25hbFByb3BlcnRpZXMiKSxnZXRDb25maWdzOl8sc2NoZW1hOmNlLGRlcHRoOncrMX0pKSkpOm51bGwsV2U/UmUuY3JlYXRlRWxlbWVudCgidHIiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgidGQiLG51bGwsImFsbE9mIC0+IiksUmUuY3JlYXRlRWxlbWVudCgidGQiLG51bGwsV2UubWFwKCgocyxvKT0+UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7a2V5Om99LFJlLmNyZWF0ZUVsZW1lbnQod2UsTW4oKSh7fSxMLHtyZXF1aXJlZDohMSxnZXRDb21wb25lbnQ6dSxzcGVjUGF0aDpqLnB1c2goImFsbE9mIixvKSxnZXRDb25maWdzOl8sc2NoZW1hOnMsZGVwdGg6dysxfSkpKSkpKSk6bnVsbCxIZT9SZS5jcmVhdGVFbGVtZW50KCJ0ciIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIsbnVsbCwiYW55T2YgLT4iKSxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIsbnVsbCxIZS5tYXAoKChzLG8pPT5SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtrZXk6b30sUmUuY3JlYXRlRWxlbWVudCh3ZSxNbigpKHt9LEwse3JlcXVpcmVkOiExLGdldENvbXBvbmVudDp1LHNwZWNQYXRoOmoucHVzaCgiYW55T2YiLG8pLGdldENvbmZpZ3M6XyxzY2hlbWE6cyxkZXB0aDp3KzF9KSkpKSkpKTpudWxsLFllP1JlLmNyZWF0ZUVsZW1lbnQoInRyIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLCJvbmVPZiAtPiIpLFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLFllLm1hcCgoKHMsbyk9PlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2tleTpvfSxSZS5jcmVhdGVFbGVtZW50KHdlLE1uKCkoe30sTCx7cmVxdWlyZWQ6ITEsZ2V0Q29tcG9uZW50OnUsc3BlY1BhdGg6ai5wdXNoKCJvbmVPZiIsbyksZ2V0Q29uZmlnczpfLHNjaGVtYTpzLGRlcHRoOncrMX0pKSkpKSkpOm51bGwsWGU/UmUuY3JlYXRlRWxlbWVudCgidHIiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgidGQiLG51bGwsIm5vdCAtPiIpLFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KHdlLE1uKCkoe30sTCx7cmVxdWlyZWQ6ITEsZ2V0Q29tcG9uZW50OnUsc3BlY1BhdGg6ai5wdXNoKCJub3QiKSxnZXRDb25maWdzOl8sc2NoZW1hOlhlLGRlcHRoOncrMX0pKSkpKTpudWxsKSkpLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ImJyYWNlLWNsb3NlIn0sIn0iKSksZGUuc2l6ZT9kZS5lbnRyeVNlcSgpLm1hcCgoKFtzLG9dKT0+UmUuY3JlYXRlRWxlbWVudChQZSx7a2V5OmAke3N9LSR7b31gLHByb3BLZXk6cyxwcm9wVmFsOm8scHJvcENsYXNzOiJwcm9wZXJ0eSJ9KSkpOm51bGwpfX1jbGFzcyBBcnJheU1vZGVsIGV4dGVuZHMgUmUuQ29tcG9uZW50e3JlbmRlcigpe2xldHtnZXRDb21wb25lbnQ6cyxnZXRDb25maWdzOm8sc2NoZW1hOmksZGVwdGg6YSxleHBhbmREZXB0aDp1LG5hbWU6XyxkaXNwbGF5TmFtZTp3LHNwZWNQYXRoOnh9PXRoaXMucHJvcHMsQz1pLmdldCgiZGVzY3JpcHRpb24iKSxqPWkuZ2V0KCJpdGVtcyIpLEw9aS5nZXQoInRpdGxlIil8fHd8fF8sQj1pLmZpbHRlcigoKHMsbyk9Pi0xPT09WyJ0eXBlIiwiaXRlbXMiLCJkZXNjcmlwdGlvbiIsIiQkcmVmIiwiZXh0ZXJuYWxEb2NzIl0uaW5kZXhPZihvKSkpLCQ9aS5nZXRJbihbImV4dGVybmFsRG9jcyIsInVybCJdKSxVPWkuZ2V0SW4oWyJleHRlcm5hbERvY3MiLCJkZXNjcmlwdGlvbiJdKTtjb25zdCBWPXMoIk1hcmtkb3duIiwhMCksej1zKCJNb2RlbENvbGxhcHNlIiksWT1zKCJNb2RlbCIpLFo9cygiUHJvcGVydHkiKSxlZT1zKCJMaW5rIiksaWU9TCYmUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWwtdGl0bGUifSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtb2RlbC10aXRsZV9fdGV4dCJ9LEwpKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWwifSxSZS5jcmVhdGVFbGVtZW50KHose3RpdGxlOmllLGV4cGFuZGVkOmE8PXUsY29sbGFwc2VkQ29udGVudDoiWy4uLl0ifSwiWyIsQi5zaXplP0IuZW50cnlTZXEoKS5tYXAoKChbcyxvXSk9PlJlLmNyZWF0ZUVsZW1lbnQoWix7a2V5OmAke3N9LSR7b31gLHByb3BLZXk6cyxwcm9wVmFsOm8scHJvcENsYXNzOiJwcm9wZXJ0eSJ9KSkpOm51bGwsQz9SZS5jcmVhdGVFbGVtZW50KFYse3NvdXJjZTpDfSk6Qi5zaXplP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibWFya2Rvd24ifSk6bnVsbCwkJiZSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImV4dGVybmFsLWRvY3MifSxSZS5jcmVhdGVFbGVtZW50KGVlLHt0YXJnZXQ6Il9ibGFuayIsaHJlZjpzYW5pdGl6ZVVybCgkKX0sVXx8JCkpLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsUmUuY3JlYXRlRWxlbWVudChZLE1uKCkoe30sdGhpcy5wcm9wcyx7Z2V0Q29uZmlnczpvLHNwZWNQYXRoOngucHVzaCgiaXRlbXMiKSxuYW1lOm51bGwsc2NoZW1hOmoscmVxdWlyZWQ6ITEsZGVwdGg6YSsxfSkpKSwiXSIpKX19Y29uc3QgdHM9InByb3BlcnR5IHByaW1pdGl2ZSI7Y2xhc3MgUHJpbWl0aXZlIGV4dGVuZHMgUmUuQ29tcG9uZW50e3JlbmRlcigpe2xldHtzY2hlbWE6cyxnZXRDb21wb25lbnQ6byxnZXRDb25maWdzOmksbmFtZTphLGRpc3BsYXlOYW1lOnUsZGVwdGg6XyxleHBhbmREZXB0aDp3fT10aGlzLnByb3BzO2NvbnN0e3Nob3dFeHRlbnNpb25zOnh9PWkoKTtpZighc3x8IXMuZ2V0KXJldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwpO2xldCBDPXMuZ2V0KCJ0eXBlIiksaj1zLmdldCgiZm9ybWF0IiksTD1zLmdldCgieG1sIiksQj1zLmdldCgiZW51bSIpLCQ9cy5nZXQoInRpdGxlIil8fHV8fGEsVT1zLmdldCgiZGVzY3JpcHRpb24iKTtjb25zdCBWPWdldEV4dGVuc2lvbnMocyk7bGV0IHo9cy5maWx0ZXIoKChzLG8pPT4tMT09PVsiZW51bSIsInR5cGUiLCJmb3JtYXQiLCJkZXNjcmlwdGlvbiIsIiQkcmVmIiwiZXh0ZXJuYWxEb2NzIl0uaW5kZXhPZihvKSkpLmZpbHRlck5vdCgoKHMsbyk9PlYuaGFzKG8pKSksWT1zLmdldEluKFsiZXh0ZXJuYWxEb2NzIiwidXJsIl0pLFo9cy5nZXRJbihbImV4dGVybmFsRG9jcyIsImRlc2NyaXB0aW9uIl0pO2NvbnN0IGVlPW8oIk1hcmtkb3duIiwhMCksaWU9bygiRW51bU1vZGVsIiksYWU9bygiUHJvcGVydHkiKSxjZT1vKCJNb2RlbENvbGxhcHNlIiksbGU9bygiTGluayIpLHBlPW8oIk1vZGVsRXh0ZW5zaW9ucyIpLGRlPSQmJlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1vZGVsLXRpdGxlIn0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWwtdGl0bGVfX3RleHQifSwkKSk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1vZGVsIn0sUmUuY3JlYXRlRWxlbWVudChjZSx7dGl0bGU6ZGUsZXhwYW5kZWQ6Xzw9dyxjb2xsYXBzZWRDb250ZW50OiJbLi4uXSJ9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByb3AifSxhJiZfPjEmJlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByb3AtbmFtZSJ9LCQpLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByb3AtdHlwZSJ9LEMpLGomJlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByb3AtZm9ybWF0In0sIigkIixqLCIpIiksei5zaXplP3ouZW50cnlTZXEoKS5tYXAoKChbcyxvXSk9PlJlLmNyZWF0ZUVsZW1lbnQoYWUse2tleTpgJHtzfS0ke299YCxwcm9wS2V5OnMscHJvcFZhbDpvLHByb3BDbGFzczp0c30pKSk6bnVsbCx4JiZWLnNpemU+MD9SZS5jcmVhdGVFbGVtZW50KHBlLHtleHRlbnNpb25zOlYscHJvcENsYXNzOmAke3RzfSBleHRlbnNpb25gfSk6bnVsbCxVP1JlLmNyZWF0ZUVsZW1lbnQoZWUse3NvdXJjZTpVfSk6bnVsbCxZJiZSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImV4dGVybmFsLWRvY3MifSxSZS5jcmVhdGVFbGVtZW50KGxlLHt0YXJnZXQ6Il9ibGFuayIsaHJlZjpzYW5pdGl6ZVVybChZKX0sWnx8WSkpLEwmJkwuc2l6ZT9SZS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImJyIixudWxsKSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOnRzfSwieG1sOiIpLEwuZW50cnlTZXEoKS5tYXAoKChbcyxvXSk9PlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtrZXk6YCR7c30tJHtvfWAsY2xhc3NOYW1lOnRzfSxSZS5jcmVhdGVFbGVtZW50KCJiciIsbnVsbCksIsKgwqDCoCIscywiOiAiLFN0cmluZyhvKSkpKS50b0FycmF5KCkpOm51bGwsQiYmUmUuY3JlYXRlRWxlbWVudChpZSx7dmFsdWU6QixnZXRDb21wb25lbnQ6b30pKSkpfX1jbGFzcyBTY2hlbWVzIGV4dGVuZHMgUmUuQ29tcG9uZW50e1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKXtsZXR7c2NoZW1lczpzfT10aGlzLnByb3BzO3RoaXMuc2V0U2NoZW1lKHMuZmlyc3QoKSl9VU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMocyl7dGhpcy5wcm9wcy5jdXJyZW50U2NoZW1lJiZzLnNjaGVtZXMuaW5jbHVkZXModGhpcy5wcm9wcy5jdXJyZW50U2NoZW1lKXx8dGhpcy5zZXRTY2hlbWUocy5zY2hlbWVzLmZpcnN0KCkpfW9uQ2hhbmdlPXM9Pnt0aGlzLnNldFNjaGVtZShzLnRhcmdldC52YWx1ZSl9O3NldFNjaGVtZT1zPT57bGV0e3BhdGg6byxtZXRob2Q6aSxzcGVjQWN0aW9uczphfT10aGlzLnByb3BzO2Euc2V0U2NoZW1lKHMsbyxpKX07cmVuZGVyKCl7bGV0e3NjaGVtZXM6cyxjdXJyZW50U2NoZW1lOm99PXRoaXMucHJvcHM7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7aHRtbEZvcjoic2NoZW1lcyJ9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InNjaGVtZXMtdGl0bGUifSwiU2NoZW1lcyIpLFJlLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIse29uQ2hhbmdlOnRoaXMub25DaGFuZ2UsdmFsdWU6byxpZDoic2NoZW1lcyJ9LHMudmFsdWVTZXEoKS5tYXAoKHM9PlJlLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIse3ZhbHVlOnMsa2V5OnN9LHMpKSkudG9BcnJheSgpKSl9fWNsYXNzIFNjaGVtZXNDb250YWluZXIgZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7Y29uc3R7c3BlY0FjdGlvbnM6cyxzcGVjU2VsZWN0b3JzOm8sZ2V0Q29tcG9uZW50Oml9PXRoaXMucHJvcHMsYT1vLm9wZXJhdGlvblNjaGVtZSgpLHU9by5zY2hlbWVzKCksXz1pKCJzY2hlbWVzIik7cmV0dXJuIHUmJnUuc2l6ZT9SZS5jcmVhdGVFbGVtZW50KF8se2N1cnJlbnRTY2hlbWU6YSxzY2hlbWVzOnUsc3BlY0FjdGlvbnM6c30pOm51bGx9fXZhciBycz1fX3dlYnBhY2tfcmVxdWlyZV9fKDI0Njc3KSxucz1fX3dlYnBhY2tfcmVxdWlyZV9fLm4ocnMpO2NvbnN0IHNzPXt2YWx1ZToiIixvbkNoYW5nZTooKT0+e30sc2NoZW1hOnt9LGtleU5hbWU6IiIscmVxdWlyZWQ6ITEsZXJyb3JzOigwLHplLkxpc3QpKCl9O2NsYXNzIEpzb25TY2hlbWFGb3JtIGV4dGVuZHMgUmUuQ29tcG9uZW50e3N0YXRpYyBkZWZhdWx0UHJvcHM9c3M7Y29tcG9uZW50RGlkTW91bnQoKXtjb25zdHtkaXNwYXRjaEluaXRpYWxWYWx1ZTpzLHZhbHVlOm8sb25DaGFuZ2U6aX09dGhpcy5wcm9wcztzP2kobyk6ITE9PT1zJiZpKCIiKX1yZW5kZXIoKXtsZXR7c2NoZW1hOnMsZXJyb3JzOm8sdmFsdWU6aSxvbkNoYW5nZTphLGdldENvbXBvbmVudDp1LGZuOl8sZGlzYWJsZWQ6d309dGhpcy5wcm9wcztjb25zdCB4PXMmJnMuZ2V0P3MuZ2V0KCJmb3JtYXQiKTpudWxsLEM9cyYmcy5nZXQ/cy5nZXQoInR5cGUiKTpudWxsLGo9Xy5nZXRTY2hlbWFPYmplY3RUeXBlKHMpLEw9Xy5pc0ZpbGVVcGxvYWRJbnRlbmRlZChzKTtsZXQgZ2V0Q29tcG9uZW50U2lsZW50bHk9cz0+dShzLCExLHtmYWlsU2lsZW50bHk6ITB9KSxCPUM/Z2V0Q29tcG9uZW50U2lsZW50bHkoeD9gSnNvblNjaGVtYV8ke0N9XyR7eH1gOmBKc29uU2NoZW1hXyR7Q31gKTp1KCJKc29uU2NoZW1hX3N0cmluZyIpO3JldHVybiBMfHwhemUuTGlzdC5pc0xpc3QoQyl8fCJhcnJheSIhPT1qJiYib2JqZWN0IiE9PWp8fChCPXUoIkpzb25TY2hlbWFfb2JqZWN0IikpLEJ8fChCPXUoIkpzb25TY2hlbWFfc3RyaW5nIikpLFJlLmNyZWF0ZUVsZW1lbnQoQixNbigpKHt9LHRoaXMucHJvcHMse2Vycm9yczpvLGZuOl8sZ2V0Q29tcG9uZW50OnUsdmFsdWU6aSxvbkNoYW5nZTphLHNjaGVtYTpzLGRpc2FibGVkOnd9KSl9fWNsYXNzIEpzb25TY2hlbWFfc3RyaW5nIGV4dGVuZHMgUmUuQ29tcG9uZW50e3N0YXRpYyBkZWZhdWx0UHJvcHM9c3M7b25DaGFuZ2U9cz0+e2NvbnN0IG89dGhpcy5wcm9wcy5zY2hlbWEmJiJmaWxlIj09PXRoaXMucHJvcHMuc2NoZW1hLmdldCgidHlwZSIpP3MudGFyZ2V0LmZpbGVzWzBdOnMudGFyZ2V0LnZhbHVlO3RoaXMucHJvcHMub25DaGFuZ2Uobyx0aGlzLnByb3BzLmtleU5hbWUpfTtvbkVudW1DaGFuZ2U9cz0+dGhpcy5wcm9wcy5vbkNoYW5nZShzKTtyZW5kZXIoKXtsZXR7Z2V0Q29tcG9uZW50OnMsdmFsdWU6byxzY2hlbWE6aSxlcnJvcnM6YSxyZXF1aXJlZDp1LGRlc2NyaXB0aW9uOl8sZGlzYWJsZWQ6d309dGhpcy5wcm9wcztjb25zdCB4PWkmJmkuZ2V0P2kuZ2V0KCJlbnVtIik6bnVsbCxDPWkmJmkuZ2V0P2kuZ2V0KCJmb3JtYXQiKTpudWxsLGo9aSYmaS5nZXQ/aS5nZXQoInR5cGUiKTpudWxsLEw9aSYmaS5nZXQ/aS5nZXQoImluIik6bnVsbDtpZihvPyhpc0ltbXV0YWJsZShvKXx8Im9iamVjdCI9PXR5cGVvZiBvKSYmKG89c3RyaW5naWZ5KG8pKTpvPSIiLGE9YS50b0pTP2EudG9KUygpOltdLHgpe2NvbnN0IGk9cygiU2VsZWN0Iik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoaSx7Y2xhc3NOYW1lOmEubGVuZ3RoPyJpbnZhbGlkIjoiIix0aXRsZTphLmxlbmd0aD9hOiIiLGFsbG93ZWRWYWx1ZXM6Wy4uLnhdLHZhbHVlOm8sYWxsb3dFbXB0eVZhbHVlOiF1LGRpc2FibGVkOncsb25DaGFuZ2U6dGhpcy5vbkVudW1DaGFuZ2V9KX1jb25zdCBCPXd8fEwmJiJmb3JtRGF0YSI9PT1MJiYhKCJGb3JtRGF0YSJpbiB3aW5kb3cpLCQ9cygiSW5wdXQiKTtyZXR1cm4gaiYmImZpbGUiPT09aj9SZS5jcmVhdGVFbGVtZW50KCQse3R5cGU6ImZpbGUiLGNsYXNzTmFtZTphLmxlbmd0aD8iaW52YWxpZCI6IiIsdGl0bGU6YS5sZW5ndGg/YToiIixvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlLGRpc2FibGVkOkJ9KTpSZS5jcmVhdGVFbGVtZW50KG5zKCkse3R5cGU6QyYmInBhc3N3b3JkIj09PUM/InBhc3N3b3JkIjoidGV4dCIsY2xhc3NOYW1lOmEubGVuZ3RoPyJpbnZhbGlkIjoiIix0aXRsZTphLmxlbmd0aD9hOiIiLHZhbHVlOm8sbWluTGVuZ3RoOjAsZGVib3VuY2VUaW1lb3V0OjM1MCxwbGFjZWhvbGRlcjpfLG9uQ2hhbmdlOnRoaXMub25DaGFuZ2UsZGlzYWJsZWQ6Qn0pfX1jbGFzcyBKc29uU2NoZW1hX2FycmF5IGV4dGVuZHMgUmUuUHVyZUNvbXBvbmVudHtzdGF0aWMgZGVmYXVsdFByb3BzPXNzO2NvbnN0cnVjdG9yKHMsbyl7c3VwZXIocyxvKSx0aGlzLnN0YXRlPXt2YWx1ZTp2YWx1ZU9yRW1wdHlMaXN0KHMudmFsdWUpLHNjaGVtYTpzLnNjaGVtYX19VU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMocyl7Y29uc3Qgbz12YWx1ZU9yRW1wdHlMaXN0KHMudmFsdWUpO28hPT10aGlzLnN0YXRlLnZhbHVlJiZ0aGlzLnNldFN0YXRlKHt2YWx1ZTpvfSkscy5zY2hlbWEhPT10aGlzLnN0YXRlLnNjaGVtYSYmdGhpcy5zZXRTdGF0ZSh7c2NoZW1hOnMuc2NoZW1hfSl9b25DaGFuZ2U9KCk9Pnt0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMuc3RhdGUudmFsdWUpfTtvbkl0ZW1DaGFuZ2U9KHMsbyk9Pnt0aGlzLnNldFN0YXRlKCgoe3ZhbHVlOml9KT0+KHt2YWx1ZTppLnNldChvLHMpfSkpLHRoaXMub25DaGFuZ2UpfTtyZW1vdmVJdGVtPXM9Pnt0aGlzLnNldFN0YXRlKCgoe3ZhbHVlOm99KT0+KHt2YWx1ZTpvLmRlbGV0ZShzKX0pKSx0aGlzLm9uQ2hhbmdlKX07YWRkSXRlbT0oKT0+e2NvbnN0e2ZuOnN9PXRoaXMucHJvcHM7bGV0IG89dmFsdWVPckVtcHR5TGlzdCh0aGlzLnN0YXRlLnZhbHVlKTt0aGlzLnNldFN0YXRlKCgoKT0+KHt2YWx1ZTpvLnB1c2gocy5nZXRTYW1wbGVTY2hlbWEodGhpcy5zdGF0ZS5zY2hlbWEuZ2V0KCJpdGVtcyIpLCExLHtpbmNsdWRlV3JpdGVPbmx5OiEwfSkpfSkpLHRoaXMub25DaGFuZ2UpfTtvbkVudW1DaGFuZ2U9cz0+e3RoaXMuc2V0U3RhdGUoKCgpPT4oe3ZhbHVlOnN9KSksdGhpcy5vbkNoYW5nZSl9O3JlbmRlcigpe2xldHtnZXRDb21wb25lbnQ6cyxyZXF1aXJlZDpvLHNjaGVtYTppLGVycm9yczphLGZuOnUsZGlzYWJsZWQ6X309dGhpcy5wcm9wczthPWEudG9KUz9hLnRvSlMoKTpBcnJheS5pc0FycmF5KGEpP2E6W107Y29uc3Qgdz1hLmZpbHRlcigocz0+InN0cmluZyI9PXR5cGVvZiBzKSkseD1hLmZpbHRlcigocz0+dm9pZCAwIT09cy5uZWVkUmVtb3ZlKSkubWFwKChzPT5zLmVycm9yKSksQz10aGlzLnN0YXRlLnZhbHVlLGo9ISEoQyYmQy5jb3VudCYmQy5jb3VudCgpPjApLEw9aS5nZXRJbihbIml0ZW1zIiwiZW51bSJdKSxCPWkuZ2V0KCJpdGVtcyIpLCQ9dS5nZXRTY2hlbWFPYmplY3RUeXBlKEIpLFU9dS5nZXRTY2hlbWFPYmplY3RUeXBlTGFiZWwoQiksVj1pLmdldEluKFsiaXRlbXMiLCJmb3JtYXQiXSksej1pLmdldCgiaXRlbXMiKTtsZXQgWSxaPSExLGVlPSJmaWxlIj09PSR8fCJzdHJpbmciPT09JCYmImJpbmFyeSI9PT1WO2lmKCQmJlY/WT1zKGBKc29uU2NoZW1hXyR7JH1fJHtWfWApOiJib29sZWFuIiE9PSQmJiJhcnJheSIhPT0kJiYib2JqZWN0IiE9PSR8fChZPXMoYEpzb25TY2hlbWFfJHskfWApKSwhemUuTGlzdC5pc0xpc3QoQj8uZ2V0KCJ0eXBlIikpfHwiYXJyYXkiIT09JCYmIm9iamVjdCIhPT0kfHwoWT1zKCJKc29uU2NoZW1hX29iamVjdCIpKSxZfHxlZXx8KFo9ITApLEwpe2NvbnN0IGk9cygiU2VsZWN0Iik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoaSx7Y2xhc3NOYW1lOmEubGVuZ3RoPyJpbnZhbGlkIjoiIix0aXRsZTphLmxlbmd0aD9hOiIiLG11bHRpcGxlOiEwLHZhbHVlOkMsZGlzYWJsZWQ6XyxhbGxvd2VkVmFsdWVzOkwsYWxsb3dFbXB0eVZhbHVlOiFvLG9uQ2hhbmdlOnRoaXMub25FbnVtQ2hhbmdlfSl9Y29uc3QgaWU9cygiQnV0dG9uIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtYXJyYXkifSxqP0MubWFwKCgobyxpKT0+e2NvbnN0IHc9KDAsemUuZnJvbUpTKShbLi4uYS5maWx0ZXIoKHM9PnMuaW5kZXg9PT1pKSkubWFwKChzPT5zLmVycm9yKSldKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7a2V5OmksY2xhc3NOYW1lOiJqc29uLXNjaGVtYS1mb3JtLWl0ZW0ifSxlZT9SZS5jcmVhdGVFbGVtZW50KEpzb25TY2hlbWFBcnJheUl0ZW1GaWxlLHt2YWx1ZTpvLG9uQ2hhbmdlOnM9PnRoaXMub25JdGVtQ2hhbmdlKHMsaSksZGlzYWJsZWQ6XyxlcnJvcnM6dyxnZXRDb21wb25lbnQ6c30pOlo/UmUuY3JlYXRlRWxlbWVudChKc29uU2NoZW1hQXJyYXlJdGVtVGV4dCx7dmFsdWU6byxvbkNoYW5nZTpzPT50aGlzLm9uSXRlbUNoYW5nZShzLGkpLGRpc2FibGVkOl8sZXJyb3JzOnd9KTpSZS5jcmVhdGVFbGVtZW50KFksTW4oKSh7fSx0aGlzLnByb3BzLHt2YWx1ZTpvLG9uQ2hhbmdlOnM9PnRoaXMub25JdGVtQ2hhbmdlKHMsaSksZGlzYWJsZWQ6XyxlcnJvcnM6dyxzY2hlbWE6eixnZXRDb21wb25lbnQ6cyxmbjp1fSkpLF8/bnVsbDpSZS5jcmVhdGVFbGVtZW50KGllLHtjbGFzc05hbWU6YGJ0biBidG4tc20ganNvbi1zY2hlbWEtZm9ybS1pdGVtLXJlbW92ZSAke3gubGVuZ3RoPyJpbnZhbGlkIjpudWxsfWAsdGl0bGU6eC5sZW5ndGg/eDoiIixvbkNsaWNrOigpPT50aGlzLnJlbW92ZUl0ZW0oaSl9LCIgLSAiKSl9KSk6bnVsbCxfP251bGw6UmUuY3JlYXRlRWxlbWVudChpZSx7Y2xhc3NOYW1lOmBidG4gYnRuLXNtIGpzb24tc2NoZW1hLWZvcm0taXRlbS1hZGQgJHt3Lmxlbmd0aD8iaW52YWxpZCI6bnVsbH1gLHRpdGxlOncubGVuZ3RoP3c6IiIsb25DbGljazp0aGlzLmFkZEl0ZW19LCJBZGQgIixVLCIgaXRlbSIpKX19Y2xhc3MgSnNvblNjaGVtYUFycmF5SXRlbVRleHQgZXh0ZW5kcyBSZS5Db21wb25lbnR7c3RhdGljIGRlZmF1bHRQcm9wcz1zcztvbkNoYW5nZT1zPT57Y29uc3Qgbz1zLnRhcmdldC52YWx1ZTt0aGlzLnByb3BzLm9uQ2hhbmdlKG8sdGhpcy5wcm9wcy5rZXlOYW1lKX07cmVuZGVyKCl7bGV0e3ZhbHVlOnMsZXJyb3JzOm8sZGVzY3JpcHRpb246aSxkaXNhYmxlZDphfT10aGlzLnByb3BzO3JldHVybiBzPyhpc0ltbXV0YWJsZShzKXx8Im9iamVjdCI9PXR5cGVvZiBzKSYmKHM9c3RyaW5naWZ5KHMpKTpzPSIiLG89by50b0pTP28udG9KUygpOltdLFJlLmNyZWF0ZUVsZW1lbnQobnMoKSx7dHlwZToidGV4dCIsY2xhc3NOYW1lOm8ubGVuZ3RoPyJpbnZhbGlkIjoiIix0aXRsZTpvLmxlbmd0aD9vOiIiLHZhbHVlOnMsbWluTGVuZ3RoOjAsZGVib3VuY2VUaW1lb3V0OjM1MCxwbGFjZWhvbGRlcjppLG9uQ2hhbmdlOnRoaXMub25DaGFuZ2UsZGlzYWJsZWQ6YX0pfX1jbGFzcyBKc29uU2NoZW1hQXJyYXlJdGVtRmlsZSBleHRlbmRzIFJlLkNvbXBvbmVudHtzdGF0aWMgZGVmYXVsdFByb3BzPXNzO29uRmlsZUNoYW5nZT1zPT57Y29uc3Qgbz1zLnRhcmdldC5maWxlc1swXTt0aGlzLnByb3BzLm9uQ2hhbmdlKG8sdGhpcy5wcm9wcy5rZXlOYW1lKX07cmVuZGVyKCl7bGV0e2dldENvbXBvbmVudDpzLGVycm9yczpvLGRpc2FibGVkOml9PXRoaXMucHJvcHM7Y29uc3QgYT1zKCJJbnB1dCIpLHU9aXx8ISgiRm9ybURhdGEiaW4gd2luZG93KTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudChhLHt0eXBlOiJmaWxlIixjbGFzc05hbWU6by5sZW5ndGg/ImludmFsaWQiOiIiLHRpdGxlOm8ubGVuZ3RoP286IiIsb25DaGFuZ2U6dGhpcy5vbkZpbGVDaGFuZ2UsZGlzYWJsZWQ6dX0pfX1jbGFzcyBKc29uU2NoZW1hX2Jvb2xlYW4gZXh0ZW5kcyBSZS5Db21wb25lbnR7c3RhdGljIGRlZmF1bHRQcm9wcz1zcztvbkVudW1DaGFuZ2U9cz0+dGhpcy5wcm9wcy5vbkNoYW5nZShzKTtyZW5kZXIoKXtsZXR7Z2V0Q29tcG9uZW50OnMsdmFsdWU6byxlcnJvcnM6aSxzY2hlbWE6YSxyZXF1aXJlZDp1LGRpc2FibGVkOl99PXRoaXMucHJvcHM7aT1pLnRvSlM/aS50b0pTKCk6W107bGV0IHc9YSYmYS5nZXQ/YS5nZXQoImVudW0iKTpudWxsLHg9IXd8fCF1LEM9IXcmJlsidHJ1ZSIsImZhbHNlIl07Y29uc3Qgaj1zKCJTZWxlY3QiKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudChqLHtjbGFzc05hbWU6aS5sZW5ndGg/ImludmFsaWQiOiIiLHRpdGxlOmkubGVuZ3RoP2k6IiIsdmFsdWU6U3RyaW5nKG8pLGRpc2FibGVkOl8sYWxsb3dlZFZhbHVlczp3P1suLi53XTpDLGFsbG93RW1wdHlWYWx1ZTp4LG9uQ2hhbmdlOnRoaXMub25FbnVtQ2hhbmdlfSl9fWNvbnN0IHN0cmluZ2lmeU9iamVjdEVycm9ycz1zPT5zLm1hcCgocz0+e2NvbnN0IG89dm9pZCAwIT09cy5wcm9wS2V5P3MucHJvcEtleTpzLmluZGV4O2xldCBpPSJzdHJpbmciPT10eXBlb2Ygcz9zOiJzdHJpbmciPT10eXBlb2Ygcy5lcnJvcj9zLmVycm9yOm51bGw7aWYoIW8mJmkpcmV0dXJuIGk7bGV0IGE9cy5lcnJvcix1PWAvJHtzLnByb3BLZXl9YDtmb3IoOyJvYmplY3QiPT10eXBlb2YgYTspe2NvbnN0IHM9dm9pZCAwIT09YS5wcm9wS2V5P2EucHJvcEtleTphLmluZGV4O2lmKHZvaWQgMD09PXMpYnJlYWs7aWYodSs9YC8ke3N9YCwhYS5lcnJvcilicmVhazthPWEuZXJyb3J9cmV0dXJuYCR7dX06ICR7YX1gfSkpO2NsYXNzIEpzb25TY2hlbWFfb2JqZWN0IGV4dGVuZHMgUmUuUHVyZUNvbXBvbmVudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCl9c3RhdGljIGRlZmF1bHRQcm9wcz1zcztvbkNoYW5nZT1zPT57dGhpcy5wcm9wcy5vbkNoYW5nZShzKX07aGFuZGxlT25DaGFuZ2U9cz0+e2NvbnN0IG89cy50YXJnZXQudmFsdWU7dGhpcy5vbkNoYW5nZShvKX07cmVuZGVyKCl7bGV0e2dldENvbXBvbmVudDpzLHZhbHVlOm8sZXJyb3JzOmksZGlzYWJsZWQ6YX09dGhpcy5wcm9wcztjb25zdCB1PXMoIlRleHRBcmVhIik7cmV0dXJuIGk9aS50b0pTP2kudG9KUygpOkFycmF5LmlzQXJyYXkoaSk/aTpbXSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsUmUuY3JlYXRlRWxlbWVudCh1LHtjbGFzc05hbWU6Sm4oKSh7aW52YWxpZDppLmxlbmd0aH0pLHRpdGxlOmkubGVuZ3RoP3N0cmluZ2lmeU9iamVjdEVycm9ycyhpKS5qb2luKCIsICIpOiIiLHZhbHVlOnN0cmluZ2lmeShvKSxkaXNhYmxlZDphLG9uQ2hhbmdlOnRoaXMuaGFuZGxlT25DaGFuZ2V9KSl9fWZ1bmN0aW9uIHZhbHVlT3JFbXB0eUxpc3Qocyl7cmV0dXJuIHplLkxpc3QuaXNMaXN0KHMpP3M6QXJyYXkuaXNBcnJheShzKT8oMCx6ZS5mcm9tSlMpKHMpOigwLHplLkxpc3QpKCl9Y29uc3QgTW9kZWxFeHRlbnNpb25zPSh7ZXh0ZW5zaW9uczpzLHByb3BDbGFzczpvPSIifSk9PnMuZW50cnlTZXEoKS5tYXAoKChbcyxpXSk9Pntjb25zdCBhPWltbXV0YWJsZVRvSlMoaSk/P251bGw7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoInRyIix7a2V5OnMsY2xhc3NOYW1lOm99LFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLHMpLFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLEpTT04uc3RyaW5naWZ5KGEpKSl9KSkudG9BcnJheSgpO3ZhciBvcz1fX3dlYnBhY2tfcmVxdWlyZV9fKDExMzMxKSxhcz1fX3dlYnBhY2tfcmVxdWlyZV9fLm4ob3MpO2NvbnN0IGhhc1NjaGVtYVR5cGU9KHMsbyk9Pntjb25zdCBpPXplLk1hcC5pc01hcChzKTtpZighaSYmIWFzKCkocykpcmV0dXJuITE7Y29uc3QgYT1pP3MuZ2V0KCJ0eXBlIik6cy50eXBlO3JldHVybiBvPT09YXx8QXJyYXkuaXNBcnJheShvKSYmby5pbmNsdWRlcyhhKX0sZ2V0VHlwZT0ocyxvPW5ldyBXZWFrU2V0KT0+e2lmKG51bGw9PXMpcmV0dXJuImFueSI7aWYoby5oYXMocykpcmV0dXJuImFueSI7by5hZGQocyk7Y29uc3R7dHlwZTppLGl0ZW1zOmF9PXM7cmV0dXJuIE9iamVjdC5oYXNPd24ocywiaXRlbXMiKT8oKCk9PntpZihhKXJldHVybmBhcnJheTwke2dldFR5cGUoYSxvKX0+YDtyZXR1cm4iYXJyYXk8YW55PiJ9KSgpOml9LGdldFNjaGVtYU9iamVjdFR5cGVMYWJlbD1zPT5nZXRUeXBlKGltbXV0YWJsZVRvSlMocykpLGpzb25fc2NoZW1hXzU9KCk9Pih7Y29tcG9uZW50czp7bW9kZWxFeGFtcGxlOm1vZGVsX2V4YW1wbGUsTW9kZWxXcmFwcGVyLE1vZGVsQ29sbGFwc2UsTW9kZWwsTW9kZWxzLEVudW1Nb2RlbDplbnVtX21vZGVsLE9iamVjdE1vZGVsLEFycmF5TW9kZWwsUHJpbWl0aXZlTW9kZWw6UHJpbWl0aXZlLE1vZGVsRXh0ZW5zaW9ucyxzY2hlbWVzOlNjaGVtZXMsU2NoZW1lc0NvbnRhaW5lciwuLi5VfSxmbjp7aGFzU2NoZW1hVHlwZSxnZXRTY2hlbWFPYmplY3RUeXBlTGFiZWx9fSk7dmFyIGNzPV9fd2VicGFja19yZXF1aXJlX18oMTkxMjMpLGxzPV9fd2VicGFja19yZXF1aXJlX18ubihjcyksdXM9X193ZWJwYWNrX3JlcXVpcmVfXyg0MTg1OSkscHM9X193ZWJwYWNrX3JlcXVpcmVfXy5uKHVzKSxocz1fX3dlYnBhY2tfcmVxdWlyZV9fKDYyMTkzKSxkcz1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oaHMpO2NvbnN0IHNoYWxsb3dBcnJheUVxdWFscz1zPT5vPT5BcnJheS5pc0FycmF5KHMpJiZBcnJheS5pc0FycmF5KG8pJiZzLmxlbmd0aD09PW8ubGVuZ3RoJiZzLmV2ZXJ5KCgocyxpKT0+cz09PW9baV0pKSxsaXN0PSguLi5zKT0+cztjbGFzcyBDYWNoZSBleHRlbmRzIE1hcHtkZWxldGUocyl7Y29uc3Qgbz1BcnJheS5mcm9tKHRoaXMua2V5cygpKS5maW5kKHNoYWxsb3dBcnJheUVxdWFscyhzKSk7cmV0dXJuIHN1cGVyLmRlbGV0ZShvKX1nZXQocyl7Y29uc3Qgbz1BcnJheS5mcm9tKHRoaXMua2V5cygpKS5maW5kKHNoYWxsb3dBcnJheUVxdWFscyhzKSk7cmV0dXJuIHN1cGVyLmdldChvKX1oYXMocyl7cmV0dXJuLTEhPT1BcnJheS5mcm9tKHRoaXMua2V5cygpKS5maW5kSW5kZXgoc2hhbGxvd0FycmF5RXF1YWxzKHMpKX19Y29uc3QgdXRpbHNfbWVtb2l6ZU49KHMsbz1saXN0KT0+e2NvbnN0e0NhY2hlOml9PXB0KCk7cHQoKS5DYWNoZT1DYWNoZTtjb25zdCBhPXB0KCkocyxvKTtyZXR1cm4gcHQoKS5DYWNoZT1pLGF9LGZzPXtzdHJpbmc6cz0+cy5wYXR0ZXJuPyhzPT57dHJ5e2NvbnN0IG89Lyg/PD0oPzwhXFwpXHspKFxkezMsfSkoPz1cfSl8KD88PSg/PCFcXClce1xkKiwpKFxkezMsfSkoPz1cfSl8KD88PSg/PCFcXClceykoXGR7Myx9KSg/PSxcZCpcfSkvZyxpPXMucmVwbGFjZShvLCIxMDAiKSxhPW5ldyhwcygpKShpKTtyZXR1cm4gYS5tYXg9MTAwLGEuZ2VuKCl9Y2F0Y2gocyl7cmV0dXJuInN0cmluZyJ9fSkocy5wYXR0ZXJuKToic3RyaW5nIixzdHJpbmdfZW1haWw6KCk9PiJ1c2VyQGV4YW1wbGUuY29tIiwic3RyaW5nX2RhdGUtdGltZSI6KCk9PihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKSxzdHJpbmdfZGF0ZTooKT0+KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLDEwKSxzdHJpbmdfdGltZTooKT0+KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygxMSksc3RyaW5nX3V1aWQ6KCk9PiIzZmE4NWY2NC01NzE3LTQ1NjItYjNmYy0yYzk2M2Y2NmFmYTYiLHN0cmluZ19ob3N0bmFtZTooKT0+ImV4YW1wbGUuY29tIixzdHJpbmdfaXB2NDooKT0+IjE5OC41MS4xMDAuNDIiLHN0cmluZ19pcHY2OigpPT4iMjAwMTowZGI4OjViOTY6MDAwMDowMDAwOjQyNmY6OGUxNzo2NDJhIixudW1iZXI6KCk9PjAsbnVtYmVyX2Zsb2F0OigpPT4wLGludGVnZXI6KCk9PjAsYm9vbGVhbjpzPT4iYm9vbGVhbiIhPXR5cGVvZiBzLmRlZmF1bHR8fHMuZGVmYXVsdH0scHJpbWl0aXZlPXM9PntzPW9iamVjdGlmeShzKTtsZXR7dHlwZTpvLGZvcm1hdDppfT1zLGE9ZnNbYCR7b31fJHtpfWBdfHxmc1tvXTtyZXR1cm4gaXNGdW5jKGEpP2Eocyk6IlVua25vd24gVHlwZTogIitzLnR5cGV9LHNhbml0aXplUmVmPXM9PmRlZXBseVN0cmlwS2V5KHMsIiQkcmVmIiwocz0+InN0cmluZyI9PXR5cGVvZiBzJiZzLmluZGV4T2YoIiMiKT4tMSkpLG1zPVsibWF4UHJvcGVydGllcyIsIm1pblByb3BlcnRpZXMiXSxncz1bIm1pbkl0ZW1zIiwibWF4SXRlbXMiXSx5cz1bIm1pbmltdW0iLCJtYXhpbXVtIiwiZXhjbHVzaXZlTWluaW11bSIsImV4Y2x1c2l2ZU1heGltdW0iXSx2cz1bIm1pbkxlbmd0aCIsIm1heExlbmd0aCJdLG1lcmdlSnNvblNjaGVtYT0ocyxvLGk9e30pPT57Y29uc3QgYT17Li4uc307aWYoWyJleGFtcGxlIiwiZGVmYXVsdCIsImVudW0iLCJ4bWwiLCJ0eXBlIiwuLi5tcywuLi5ncywuLi55cywuLi52c10uZm9yRWFjaCgocz0+KHM9Pnt2b2lkIDA9PT1hW3NdJiZ2b2lkIDAhPT1vW3NdJiYoYVtzXT1vW3NdKX0pKHMpKSksdm9pZCAwIT09by5yZXF1aXJlZCYmQXJyYXkuaXNBcnJheShvLnJlcXVpcmVkKSYmKHZvaWQgMCE9PWEucmVxdWlyZWQmJmEucmVxdWlyZWQubGVuZ3RofHwoYS5yZXF1aXJlZD1bXSksby5yZXF1aXJlZC5mb3JFYWNoKChzPT57YS5yZXF1aXJlZC5pbmNsdWRlcyhzKXx8YS5yZXF1aXJlZC5wdXNoKHMpfSkpKSxvLnByb3BlcnRpZXMpe2EucHJvcGVydGllc3x8KGEucHJvcGVydGllcz17fSk7bGV0IHM9b2JqZWN0aWZ5KG8ucHJvcGVydGllcyk7Zm9yKGxldCB1IGluIHMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsdSkmJihzW3VdJiZzW3VdLmRlcHJlY2F0ZWR8fHNbdV0mJnNbdV0ucmVhZE9ubHkmJiFpLmluY2x1ZGVSZWFkT25seXx8c1t1XSYmc1t1XS53cml0ZU9ubHkmJiFpLmluY2x1ZGVXcml0ZU9ubHl8fGEucHJvcGVydGllc1t1XXx8KGEucHJvcGVydGllc1t1XT1zW3VdLCFvLnJlcXVpcmVkJiZBcnJheS5pc0FycmF5KG8ucmVxdWlyZWQpJiYtMSE9PW8ucmVxdWlyZWQuaW5kZXhPZih1KSYmKGEucmVxdWlyZWQ/YS5yZXF1aXJlZC5wdXNoKHUpOmEucmVxdWlyZWQ9W3VdKSkpfXJldHVybiBvLml0ZW1zJiYoYS5pdGVtc3x8KGEuaXRlbXM9e30pLGEuaXRlbXM9bWVyZ2VKc29uU2NoZW1hKGEuaXRlbXMsby5pdGVtcyxpKSksYX0sc2FtcGxlRnJvbVNjaGVtYUdlbmVyaWM9KHMsbz17fSxpPXZvaWQgMCxhPSExKT0+e3MmJmlzRnVuYyhzLnRvSlMpJiYocz1zLnRvSlMoKSk7bGV0IHU9dm9pZCAwIT09aXx8cyYmdm9pZCAwIT09cy5leGFtcGxlfHxzJiZ2b2lkIDAhPT1zLmRlZmF1bHQ7Y29uc3QgXz0hdSYmcyYmcy5vbmVPZiYmcy5vbmVPZi5sZW5ndGg+MCx3PSF1JiZzJiZzLmFueU9mJiZzLmFueU9mLmxlbmd0aD4wO2lmKCF1JiYoX3x8dykpe2NvbnN0IGk9b2JqZWN0aWZ5KF8/cy5vbmVPZlswXTpzLmFueU9mWzBdKTtpZighKHM9bWVyZ2VKc29uU2NoZW1hKHMsaSxvKSkueG1sJiZpLnhtbCYmKHMueG1sPWkueG1sKSx2b2lkIDAhPT1zLmV4YW1wbGUmJnZvaWQgMCE9PWkuZXhhbXBsZSl1PSEwO2Vsc2UgaWYoaS5wcm9wZXJ0aWVzKXtzLnByb3BlcnRpZXN8fChzLnByb3BlcnRpZXM9e30pO2xldCBhPW9iamVjdGlmeShpLnByb3BlcnRpZXMpO2ZvcihsZXQgdSBpbiBhKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLHUpJiYoYVt1XSYmYVt1XS5kZXByZWNhdGVkfHxhW3VdJiZhW3VdLnJlYWRPbmx5JiYhby5pbmNsdWRlUmVhZE9ubHl8fGFbdV0mJmFbdV0ud3JpdGVPbmx5JiYhby5pbmNsdWRlV3JpdGVPbmx5fHxzLnByb3BlcnRpZXNbdV18fChzLnByb3BlcnRpZXNbdV09YVt1XSwhaS5yZXF1aXJlZCYmQXJyYXkuaXNBcnJheShpLnJlcXVpcmVkKSYmLTEhPT1pLnJlcXVpcmVkLmluZGV4T2YodSkmJihzLnJlcXVpcmVkP3MucmVxdWlyZWQucHVzaCh1KTpzLnJlcXVpcmVkPVt1XSkpKX19Y29uc3QgeD17fTtsZXR7eG1sOkMsdHlwZTpqLGV4YW1wbGU6TCxwcm9wZXJ0aWVzOkIsYWRkaXRpb25hbFByb3BlcnRpZXM6JCxpdGVtczpVfT1zfHx7fSx7aW5jbHVkZVJlYWRPbmx5OlYsaW5jbHVkZVdyaXRlT25seTp6fT1vO0M9Q3x8e307bGV0IFkse25hbWU6WixwcmVmaXg6ZWUsbmFtZXNwYWNlOmllfT1DLGFlPXt9O2lmKGEmJihaPVp8fCJub3RhZ25hbWUiLFk9KGVlP2VlKyI6IjoiIikrWixpZSkpe3hbZWU/InhtbG5zOiIrZWU6InhtbG5zIl09aWV9YSYmKGFlW1ldPVtdKTtjb25zdCBzY2hlbWFIYXNBbnk9bz0+by5zb21lKChvPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyxvKSkpO3MmJiFqJiYoQnx8JHx8c2NoZW1hSGFzQW55KG1zKT9qPSJvYmplY3QiOlV8fHNjaGVtYUhhc0FueShncyk/aj0iYXJyYXkiOnNjaGVtYUhhc0FueSh5cyk/KGo9Im51bWJlciIscy50eXBlPSJudW1iZXIiKTp1fHxzLmVudW18fChqPSJzdHJpbmciLHMudHlwZT0ic3RyaW5nIikpO2NvbnN0IGhhbmRsZU1pbk1heEl0ZW1zPW89PntpZihudWxsIT1zPy5tYXhJdGVtcyYmKG89by5zbGljZSgwLHM/Lm1heEl0ZW1zKSksbnVsbCE9cz8ubWluSXRlbXMpe2xldCBpPTA7Zm9yKDtvLmxlbmd0aDxzPy5taW5JdGVtczspby5wdXNoKG9baSsrJW8ubGVuZ3RoXSl9cmV0dXJuIG99LGNlPW9iamVjdGlmeShCKTtsZXQgbGUscGU9MDtjb25zdCBoYXNFeGNlZWRlZE1heFByb3BlcnRpZXM9KCk9PnMmJm51bGwhPT1zLm1heFByb3BlcnRpZXMmJnZvaWQgMCE9PXMubWF4UHJvcGVydGllcyYmcGU+PXMubWF4UHJvcGVydGllcyxjYW5BZGRQcm9wZXJ0eT1vPT4hc3x8bnVsbD09PXMubWF4UHJvcGVydGllc3x8dm9pZCAwPT09cy5tYXhQcm9wZXJ0aWVzfHwhaGFzRXhjZWVkZWRNYXhQcm9wZXJ0aWVzKCkmJighKG89PiEocyYmcy5yZXF1aXJlZCYmcy5yZXF1aXJlZC5sZW5ndGgmJnMucmVxdWlyZWQuaW5jbHVkZXMobykpKShvKXx8cy5tYXhQcm9wZXJ0aWVzLXBlLSgoKT0+e2lmKCFzfHwhcy5yZXF1aXJlZClyZXR1cm4gMDtsZXQgbz0wO3JldHVybiBhP3MucmVxdWlyZWQuZm9yRWFjaCgocz0+bys9dm9pZCAwPT09YWVbc10/MDoxKSk6cy5yZXF1aXJlZC5mb3JFYWNoKChzPT5vKz12b2lkIDA9PT1hZVtZXT8uZmluZCgobz0+dm9pZCAwIT09b1tzXSkpPzA6MSkpLHMucmVxdWlyZWQubGVuZ3RoLW99KSgpPjApO2lmKGxlPWE/KGksdT12b2lkIDApPT57aWYocyYmY2VbaV0pe2lmKGNlW2ldLnhtbD1jZVtpXS54bWx8fHt9LGNlW2ldLnhtbC5hdHRyaWJ1dGUpe2NvbnN0IHM9QXJyYXkuaXNBcnJheShjZVtpXS5lbnVtKT9jZVtpXS5lbnVtWzBdOnZvaWQgMCxvPWNlW2ldLmV4YW1wbGUsYT1jZVtpXS5kZWZhdWx0O3JldHVybiB2b2lkKHhbY2VbaV0ueG1sLm5hbWV8fGldPXZvaWQgMCE9PW8/bzp2b2lkIDAhPT1hP2E6dm9pZCAwIT09cz9zOnByaW1pdGl2ZShjZVtpXSkpfWNlW2ldLnhtbC5uYW1lPWNlW2ldLnhtbC5uYW1lfHxpfWVsc2UgY2VbaV18fCExPT09JHx8KGNlW2ldPXt4bWw6e25hbWU6aX19KTtsZXQgXz1zYW1wbGVGcm9tU2NoZW1hR2VuZXJpYyhzJiZjZVtpXXx8dm9pZCAwLG8sdSxhKTtjYW5BZGRQcm9wZXJ0eShpKSYmKHBlKyssQXJyYXkuaXNBcnJheShfKT9hZVtZXT1hZVtZXS5jb25jYXQoXyk6YWVbWV0ucHVzaChfKSl9OihpLHUpPT57aWYoY2FuQWRkUHJvcGVydHkoaSkpe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCJkaXNjcmltaW5hdG9yIikmJnMuZGlzY3JpbWluYXRvciYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMuZGlzY3JpbWluYXRvciwibWFwcGluZyIpJiZzLmRpc2NyaW1pbmF0b3IubWFwcGluZyYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIiQkcmVmIikmJnMuJCRyZWYmJnMuZGlzY3JpbWluYXRvci5wcm9wZXJ0eU5hbWU9PT1pKXtmb3IobGV0IG8gaW4gcy5kaXNjcmltaW5hdG9yLm1hcHBpbmcpaWYoLTEhPT1zLiQkcmVmLnNlYXJjaChzLmRpc2NyaW1pbmF0b3IubWFwcGluZ1tvXSkpe2FlW2ldPW87YnJlYWt9fWVsc2UgYWVbaV09c2FtcGxlRnJvbVNjaGVtYUdlbmVyaWMoY2VbaV0sbyx1LGEpO3BlKyt9fSx1KXtsZXQgdTtpZih1PXNhbml0aXplUmVmKHZvaWQgMCE9PWk/aTp2b2lkIDAhPT1MP0w6cy5kZWZhdWx0KSwhYSl7aWYoIm51bWJlciI9PXR5cGVvZiB1JiYic3RyaW5nIj09PWopcmV0dXJuYCR7dX1gO2lmKCJzdHJpbmciIT10eXBlb2YgdXx8InN0cmluZyI9PT1qKXJldHVybiB1O3RyeXtyZXR1cm4gSlNPTi5wYXJzZSh1KX1jYXRjaChzKXtyZXR1cm4gdX19aWYoc3x8KGo9QXJyYXkuaXNBcnJheSh1KT8iYXJyYXkiOnR5cGVvZiB1KSwiYXJyYXkiPT09ail7aWYoIUFycmF5LmlzQXJyYXkodSkpe2lmKCJzdHJpbmciPT10eXBlb2YgdSlyZXR1cm4gdTt1PVt1XX1jb25zdCBpPXM/cy5pdGVtczp2b2lkIDA7aSYmKGkueG1sPWkueG1sfHxDfHx7fSxpLnhtbC5uYW1lPWkueG1sLm5hbWV8fEMubmFtZSk7bGV0IF89dS5tYXAoKHM9PnNhbXBsZUZyb21TY2hlbWFHZW5lcmljKGksbyxzLGEpKSk7cmV0dXJuIF89aGFuZGxlTWluTWF4SXRlbXMoXyksQy53cmFwcGVkPyhhZVtZXT1fLGRzKCkoeCl8fGFlW1ldLnB1c2goe19hdHRyOnh9KSk6YWU9XyxhZX1pZigib2JqZWN0Ij09PWope2lmKCJzdHJpbmciPT10eXBlb2YgdSlyZXR1cm4gdTtmb3IobGV0IG8gaW4gdSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodSxvKSYmKHMmJmNlW29dJiZjZVtvXS5yZWFkT25seSYmIVZ8fHMmJmNlW29dJiZjZVtvXS53cml0ZU9ubHkmJiF6fHwocyYmY2Vbb10mJmNlW29dLnhtbCYmY2Vbb10ueG1sLmF0dHJpYnV0ZT94W2NlW29dLnhtbC5uYW1lfHxvXT11W29dOmxlKG8sdVtvXSkpKTtyZXR1cm4gZHMoKSh4KXx8YWVbWV0ucHVzaCh7X2F0dHI6eH0pLGFlfXJldHVybiBhZVtZXT1kcygpKHgpP3U6W3tfYXR0cjp4fSx1XSxhZX1pZigib2JqZWN0Ij09PWope2ZvcihsZXQgcyBpbiBjZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2UscykmJihjZVtzXSYmY2Vbc10uZGVwcmVjYXRlZHx8Y2Vbc10mJmNlW3NdLnJlYWRPbmx5JiYhVnx8Y2Vbc10mJmNlW3NdLndyaXRlT25seSYmIXp8fGxlKHMpKTtpZihhJiZ4JiZhZVtZXS5wdXNoKHtfYXR0cjp4fSksaGFzRXhjZWVkZWRNYXhQcm9wZXJ0aWVzKCkpcmV0dXJuIGFlO2lmKCEwPT09JClhP2FlW1ldLnB1c2goe2FkZGl0aW9uYWxQcm9wOiJBbnl0aGluZyBjYW4gYmUgaGVyZSJ9KTphZS5hZGRpdGlvbmFsUHJvcDE9e30scGUrKztlbHNlIGlmKCQpe2NvbnN0IGk9b2JqZWN0aWZ5KCQpLHU9c2FtcGxlRnJvbVNjaGVtYUdlbmVyaWMoaSxvLHZvaWQgMCxhKTtpZihhJiZpLnhtbCYmaS54bWwubmFtZSYmIm5vdGFnbmFtZSIhPT1pLnhtbC5uYW1lKWFlW1ldLnB1c2godSk7ZWxzZXtjb25zdCBvPWlbIngtYWRkaXRpb25hbFByb3BlcnRpZXNOYW1lIl18fCJhZGRpdGlvbmFsUHJvcCIsXz1udWxsIT09cy5taW5Qcm9wZXJ0aWVzJiZ2b2lkIDAhPT1zLm1pblByb3BlcnRpZXMmJnBlPHMubWluUHJvcGVydGllcz9zLm1pblByb3BlcnRpZXMtcGU6Mztmb3IobGV0IHM9MTtzPD1fO3MrKyl7aWYoaGFzRXhjZWVkZWRNYXhQcm9wZXJ0aWVzKCkpcmV0dXJuIGFlO2lmKGEpe2NvbnN0IGk9e307aVtvK3NdPXUubm90YWduYW1lLGFlW1ldLnB1c2goaSl9ZWxzZSBhZVtvK3NdPXU7cGUrK319fXJldHVybiBhZX1pZigiYXJyYXkiPT09ail7aWYoIVUpcmV0dXJuO2xldCBpO2lmKGEmJihVLnhtbD1VLnhtbHx8cz8ueG1sfHx7fSxVLnhtbC5uYW1lPVUueG1sLm5hbWV8fEMubmFtZSksQXJyYXkuaXNBcnJheShVLmFueU9mKSlpPVUuYW55T2YubWFwKChzPT5zYW1wbGVGcm9tU2NoZW1hR2VuZXJpYyhtZXJnZUpzb25TY2hlbWEocyxVLG8pLG8sdm9pZCAwLGEpKSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KFUub25lT2YpKWk9VS5vbmVPZi5tYXAoKHM9PnNhbXBsZUZyb21TY2hlbWFHZW5lcmljKG1lcmdlSnNvblNjaGVtYShzLFUsbyksbyx2b2lkIDAsYSkpKTtlbHNle2lmKCEoIWF8fGEmJkMud3JhcHBlZCkpcmV0dXJuIHNhbXBsZUZyb21TY2hlbWFHZW5lcmljKFUsbyx2b2lkIDAsYSk7aT1bc2FtcGxlRnJvbVNjaGVtYUdlbmVyaWMoVSxvLHZvaWQgMCxhKV19cmV0dXJuIGk9aGFuZGxlTWluTWF4SXRlbXMoaSksYSYmQy53cmFwcGVkPyhhZVtZXT1pLGRzKCkoeCl8fGFlW1ldLnB1c2goe19hdHRyOnh9KSxhZSk6aX1sZXQgZGU7aWYocyYmQXJyYXkuaXNBcnJheShzLmVudW0pKWRlPW5vcm1hbGl6ZUFycmF5KHMuZW51bSlbMF07ZWxzZXtpZighcylyZXR1cm47aWYoZGU9cHJpbWl0aXZlKHMpLCJudW1iZXIiPT10eXBlb2YgZGUpe2xldCBvPXMubWluaW11bTtudWxsIT1vJiYocy5leGNsdXNpdmVNaW5pbXVtJiZvKyssZGU9byk7bGV0IGk9cy5tYXhpbXVtO251bGwhPWkmJihzLmV4Y2x1c2l2ZU1heGltdW0mJmktLSxkZT1pKX1pZigic3RyaW5nIj09dHlwZW9mIGRlJiYobnVsbCE9PXMubWF4TGVuZ3RoJiZ2b2lkIDAhPT1zLm1heExlbmd0aCYmKGRlPWRlLnNsaWNlKDAscy5tYXhMZW5ndGgpKSxudWxsIT09cy5taW5MZW5ndGgmJnZvaWQgMCE9PXMubWluTGVuZ3RoKSl7bGV0IG89MDtmb3IoO2RlLmxlbmd0aDxzLm1pbkxlbmd0aDspZGUrPWRlW28rKyVkZS5sZW5ndGhdfX1pZigiZmlsZSIhPT1qKXJldHVybiBhPyhhZVtZXT1kcygpKHgpP2RlOlt7X2F0dHI6eH0sZGVdLGFlKTpkZX0saW5mZXJTY2hlbWE9cz0+KHMuc2NoZW1hJiYocz1zLnNjaGVtYSkscy5wcm9wZXJ0aWVzJiYocy50eXBlPSJvYmplY3QiKSxzKSxjcmVhdGVYTUxFeGFtcGxlPShzLG8saSk9Pntjb25zdCBhPXNhbXBsZUZyb21TY2hlbWFHZW5lcmljKHMsbyxpLCEwKTtpZihhKXJldHVybiJzdHJpbmciPT10eXBlb2YgYT9hOmxzKCkoYSx7ZGVjbGFyYXRpb246ITAsaW5kZW50OiJcdCJ9KX0sc2FtcGxlRnJvbVNjaGVtYT0ocyxvLGkpPT5zYW1wbGVGcm9tU2NoZW1hR2VuZXJpYyhzLG8saSwhMSkscmVzb2x2ZXI9KHMsbyxpKT0+W3MsSlNPTi5zdHJpbmdpZnkobyksSlNPTi5zdHJpbmdpZnkoaSldLGJzPXV0aWxzX21lbW9pemVOKGNyZWF0ZVhNTEV4YW1wbGUscmVzb2x2ZXIpLFNzPXV0aWxzX21lbW9pemVOKHNhbXBsZUZyb21TY2hlbWEscmVzb2x2ZXIpLGdldFNjaGVtYU9iamVjdFR5cGU9cz0+aW1tdXRhYmxlVG9KUyhzKT8udHlwZT8/InN0cmluZyIsX3M9W3t3aGVuOi9qc29uLyxzaG91bGRTdHJpbmdpZnlUeXBlczpbInN0cmluZyJdfV0sRXM9WyJvYmplY3QiXSxnZXRfanNvbl9zYW1wbGVfc2NoZW1hPXM9PihvLGksYSx1KT0+e2NvbnN0e2ZuOl99PXMoKSx3PV8ubWVtb2l6ZWRTYW1wbGVGcm9tU2NoZW1hKG8saSx1KSx4PXR5cGVvZiB3LEM9X3MucmVkdWNlKCgocyxvKT0+by53aGVuLnRlc3QoYSk/Wy4uLnMsLi4uby5zaG91bGRTdHJpbmdpZnlUeXBlc106cyksRXMpO3JldHVybiBndCgpKEMsKHM9PnM9PT14KSk/SlNPTi5zdHJpbmdpZnkodyxudWxsLDIpOnd9LGdldF95YW1sX3NhbXBsZV9zY2hlbWE9cz0+KG8saSxhLHUpPT57Y29uc3R7Zm46X309cygpLHc9Xy5nZXRKc29uU2FtcGxlU2NoZW1hKG8saSxhLHUpO2xldCB4O3RyeXt4PWZuLmR1bXAoZm4ubG9hZCh3KSx7bGluZVdpZHRoOi0xfSx7c2NoZW1hOnJufSksIlxuIj09PXhbeC5sZW5ndGgtMV0mJih4PXguc2xpY2UoMCx4Lmxlbmd0aC0xKSl9Y2F0Y2gocyl7cmV0dXJuIGNvbnNvbGUuZXJyb3IocyksImVycm9yOiBjb3VsZCBub3QgZ2VuZXJhdGUgeWFtbCBleGFtcGxlIn1yZXR1cm4geC5yZXBsYWNlKC9cdC9nLCIgICIpfSxnZXRfeG1sX3NhbXBsZV9zY2hlbWE9cz0+KG8saSxhKT0+e2NvbnN0e2ZuOnV9PXMoKTtpZihvJiYhby54bWwmJihvLnhtbD17fSksbyYmIW8ueG1sLm5hbWUpe2lmKCFvLiQkcmVmJiYoby50eXBlfHxvLml0ZW1zfHxvLnByb3BlcnRpZXN8fG8uYWRkaXRpb25hbFByb3BlcnRpZXMpKXJldHVybic8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PlxuXHgzYyEtLSBYTUwgZXhhbXBsZSBjYW5ub3QgYmUgZ2VuZXJhdGVkOyByb290IGVsZW1lbnQgbmFtZSBpcyB1bmRlZmluZWQgLS1ceDNlJztpZihvLiQkcmVmKXtsZXQgcz1vLiQkcmVmLm1hdGNoKC9cUypcLyhcUyspJC8pO28ueG1sLm5hbWU9c1sxXX19cmV0dXJuIHUubWVtb2l6ZWRDcmVhdGVYTUxFeGFtcGxlKG8saSxhKX0sZ2V0X3NhbXBsZV9zY2hlbWE9cz0+KG8saT0iIixhPXt9LHU9dm9pZCAwKT0+e2NvbnN0e2ZuOl99PXMoKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdT8udG9KUyYmKHU9dS50b0pTKCkpLC94bWwvLnRlc3QoaSk/KCJmdW5jdGlvbiI9PXR5cGVvZiBvPy50b0pTJiYobz1vLnRvSlMoKSksXy5nZXRYbWxTYW1wbGVTY2hlbWEobyxhLHUpKTovKHlhbWx8eW1sKS8udGVzdChpKT9fLmdldFlhbWxTYW1wbGVTY2hlbWEobyxhLGksdSk6Xy5nZXRKc29uU2FtcGxlU2NoZW1hKG8sYSxpLHUpfSxqc29uX3NjaGVtYV81X3NhbXBsZXM9KHtnZXRTeXN0ZW06c30pPT57Y29uc3Qgbz1nZXRfanNvbl9zYW1wbGVfc2NoZW1hKHMpLGk9Z2V0X3lhbWxfc2FtcGxlX3NjaGVtYShzKSxhPWdldF94bWxfc2FtcGxlX3NjaGVtYShzKSx1PWdldF9zYW1wbGVfc2NoZW1hKHMpO3JldHVybntmbjp7anNvblNjaGVtYTU6e2luZmVyU2NoZW1hLHNhbXBsZUZyb21TY2hlbWEsc2FtcGxlRnJvbVNjaGVtYUdlbmVyaWMsY3JlYXRlWE1MRXhhbXBsZSxtZW1vaXplZFNhbXBsZUZyb21TY2hlbWE6U3MsbWVtb2l6ZWRDcmVhdGVYTUxFeGFtcGxlOmJzLGdldEpzb25TYW1wbGVTY2hlbWE6byxnZXRZYW1sU2FtcGxlU2NoZW1hOmksZ2V0WG1sU2FtcGxlU2NoZW1hOmEsZ2V0U2FtcGxlU2NoZW1hOnUsbWVyZ2VKc29uU2NoZW1hfSxpbmZlclNjaGVtYSxzYW1wbGVGcm9tU2NoZW1hLHNhbXBsZUZyb21TY2hlbWFHZW5lcmljLGNyZWF0ZVhNTEV4YW1wbGUsbWVtb2l6ZWRTYW1wbGVGcm9tU2NoZW1hOlNzLG1lbW9pemVkQ3JlYXRlWE1MRXhhbXBsZTpicyxnZXRKc29uU2FtcGxlU2NoZW1hOm8sZ2V0WWFtbFNhbXBsZVNjaGVtYTppLGdldFhtbFNhbXBsZVNjaGVtYTphLGdldFNhbXBsZVNjaGVtYTp1LG1lcmdlSnNvblNjaGVtYSxnZXRTY2hlbWFPYmplY3RUeXBlfX19O3ZhciB3cz1fX3dlYnBhY2tfcmVxdWlyZV9fKDM3MzM0KSx4cz1fX3dlYnBhY2tfcmVxdWlyZV9fLm4od3MpO2NvbnN0IGtzPVsiZ2V0IiwicHV0IiwicG9zdCIsImRlbGV0ZSIsIm9wdGlvbnMiLCJoZWFkIiwicGF0Y2giLCJ0cmFjZSIsInF1ZXJ5Il0sc3BlY19zZWxlY3RvcnNfc3RhdGU9cz0+c3x8KDAsemUuTWFwKSgpLE9zPVV0KHNwZWNfc2VsZWN0b3JzX3N0YXRlLChzPT5zLmdldCgibGFzdEVycm9yIikpKSxBcz1VdChzcGVjX3NlbGVjdG9yc19zdGF0ZSwocz0+cy5nZXQoInVybCIpKSksQ3M9VXQoc3BlY19zZWxlY3RvcnNfc3RhdGUsKHM9PnMuZ2V0KCJzcGVjIil8fCIiKSksanM9VXQoc3BlY19zZWxlY3RvcnNfc3RhdGUsKHM9PnMuZ2V0KCJzcGVjU291cmNlIil8fCJub3QtZWRpdG9yIikpLFBzPVV0KHNwZWNfc2VsZWN0b3JzX3N0YXRlLChzPT5zLmdldCgianNvbiIsKDAsemUuTWFwKSgpKSkpLElzPVV0KFBzLChzPT5zLnRvSlMoKSkpLFRzPVV0KHNwZWNfc2VsZWN0b3JzX3N0YXRlLChzPT5zLmdldCgicmVzb2x2ZWQiLCgwLHplLk1hcCkoKSkpKSxzcGVjUmVzb2x2ZWRTdWJ0cmVlPShzLG8pPT5zLmdldEluKFsicmVzb2x2ZWRTdWJ0cmVlcyIsLi4ub10sdm9pZCAwKSxtZXJnZXJGbj0ocyxvKT0+emUuTWFwLmlzTWFwKHMpJiZ6ZS5NYXAuaXNNYXAobyk/by5nZXQoIiQkcmVmIik/bzooMCx6ZS5PcmRlcmVkTWFwKSgpLm1lcmdlV2l0aChtZXJnZXJGbixzLG8pOm8sTnM9VXQoc3BlY19zZWxlY3RvcnNfc3RhdGUsKHM9PigwLHplLk9yZGVyZWRNYXApKCkubWVyZ2VXaXRoKG1lcmdlckZuLHMuZ2V0KCJqc29uIikscy5nZXQoInJlc29sdmVkU3VidHJlZXMiKSkpKSxzcGVjPXM9PlBzKHMpLE1zPVV0KHNwZWMsKCgpPT4hMSkpLFJzPVV0KHNwZWMsKHM9PnJldHVyblNlbGZPck5ld01hcChzJiZzLmdldCgiaW5mbyIpKSkpLERzPVV0KHNwZWMsKHM9PnJldHVyblNlbGZPck5ld01hcChzJiZzLmdldCgiZXh0ZXJuYWxEb2NzIikpKSksTHM9VXQoUnMsKHM9PnMmJnMuZ2V0KCJ2ZXJzaW9uIikpKSxGcz1VdChMcywocz0+L3Y/KFswLTldKilcLihbMC05XSopXC4oWzAtOV0qKS9pLmV4ZWMocykuc2xpY2UoMSkpKSxCcz1VdChOcywocz0+cy5nZXQoInBhdGhzIikpKSwkcz14cygpKFsiZ2V0IiwicHV0IiwicG9zdCIsImRlbGV0ZSIsIm9wdGlvbnMiLCJoZWFkIiwicGF0Y2giXSkscXM9VXQoQnMsKHM9PntsZXQgbz0oMCx6ZS5MaXN0KSgpO3JldHVybiF6ZS5NYXAuaXNNYXAocyl8fHMuaXNFbXB0eSgpfHxzLmZvckVhY2goKChzLGkpPT57aWYoIXN8fCFzLmZvckVhY2gpcmV0dXJue307cy5mb3JFYWNoKCgocyxhKT0+e2tzLmluZGV4T2YoYSk8MHx8KG89by5wdXNoKCgwLHplLmZyb21KUykoe3BhdGg6aSxtZXRob2Q6YSxvcGVyYXRpb246cyxpZDpgJHthfS0ke2l9YH0pKSl9KSl9KSksb30pKSxVcz1VdChzcGVjLChzPT4oMCx6ZS5TZXQpKHMuZ2V0KCJjb25zdW1lcyIpKSkpLFZzPVV0KHNwZWMsKHM9PigwLHplLlNldCkocy5nZXQoInByb2R1Y2VzIikpKSksenM9VXQoc3BlYywocz0+cy5nZXQoInNlY3VyaXR5IiwoMCx6ZS5MaXN0KSgpKSkpLFdzPVV0KHNwZWMsKHM9PnMuZ2V0KCJzZWN1cml0eURlZmluaXRpb25zIikpKSxmaW5kRGVmaW5pdGlvbj0ocyxvKT0+e2NvbnN0IGk9cy5nZXRJbihbInJlc29sdmVkU3VidHJlZXMiLCJkZWZpbml0aW9ucyIsb10sbnVsbCksYT1zLmdldEluKFsianNvbiIsImRlZmluaXRpb25zIixvXSxudWxsKTtyZXR1cm4gaXx8YXx8bnVsbH0sSnM9VXQoc3BlYywocz0+e2NvbnN0IG89cy5nZXQoImRlZmluaXRpb25zIik7cmV0dXJuIHplLk1hcC5pc01hcChvKT9vOigwLHplLk1hcCkoKX0pKSxIcz1VdChzcGVjLChzPT5zLmdldCgiYmFzZVBhdGgiKSkpLEtzPVV0KHNwZWMsKHM9PnMuZ2V0KCJob3N0IikpKSxHcz1VdChzcGVjLChzPT5zLmdldCgic2NoZW1lcyIsKDAsemUuTWFwKSgpKSkpLFlzPVV0KFtxcyxVcyxWc10sKChzLG8saSk9PnMubWFwKChzPT5zLnVwZGF0ZSgib3BlcmF0aW9uIiwocz0+emUuTWFwLmlzTWFwKHMpP3Mud2l0aE11dGF0aW9ucygocz0+KHMuZ2V0KCJjb25zdW1lcyIpfHxzLnVwZGF0ZSgiY29uc3VtZXMiLChzPT4oMCx6ZS5TZXQpKHMpLm1lcmdlKG8pKSkscy5nZXQoInByb2R1Y2VzIil8fHMudXBkYXRlKCJwcm9kdWNlcyIsKHM9PigwLHplLlNldCkocykubWVyZ2UoaSkpKSxzKSkpOigwLHplLk1hcCkoKSkpKSkpKSxYcz1VdChzcGVjLChzPT57Y29uc3Qgbz1zLmdldCgidGFncyIsKDAsemUuTGlzdCkoKSk7cmV0dXJuIHplLkxpc3QuaXNMaXN0KG8pP28uZmlsdGVyKChzPT56ZS5NYXAuaXNNYXAocykpKTooMCx6ZS5MaXN0KSgpfSkpLHRhZ0RldGFpbHM9KHMsbyk9PihYcyhzKXx8KDAsemUuTGlzdCkoKSkuZmlsdGVyKHplLk1hcC5pc01hcCkuZmluZCgocz0+cy5nZXQoIm5hbWUiKT09PW8pLCgwLHplLk1hcCkoKSksUXM9VXQoWXMsWHMsKChzLG8pPT5zLnJlZHVjZSgoKHMsbyk9PntsZXQgaT0oMCx6ZS5TZXQpKG8uZ2V0SW4oWyJvcGVyYXRpb24iLCJ0YWdzIl0pKTtyZXR1cm4gaS5jb3VudCgpPDE/cy51cGRhdGUoImRlZmF1bHQiLCgwLHplLkxpc3QpKCksKHM9PnMucHVzaChvKSkpOmkucmVkdWNlKCgocyxpKT0+cy51cGRhdGUoaSwoMCx6ZS5MaXN0KSgpLChzPT5zLnB1c2gobykpKSkscyl9KSxvLnJlZHVjZSgoKHMsbyk9PnMuc2V0KG8uZ2V0KCJuYW1lIiksKDAsemUuTGlzdCkoKSkpLCgwLHplLk9yZGVyZWRNYXApKCkpKSkpLHNlbGVjdG9yc190YWdnZWRPcGVyYXRpb25zPXM9Pih7Z2V0Q29uZmlnczpvfSk9PntsZXR7dGFnc1NvcnRlcjppLG9wZXJhdGlvbnNTb3J0ZXI6YX09bygpO3JldHVybiBRcyhzKS5zb3J0QnkoKChzLG8pPT5vKSwoKHMsbyk9PntsZXQgYT0iZnVuY3Rpb24iPT10eXBlb2YgaT9pOkl0LnRhZ3NTb3J0ZXJbaV07cmV0dXJuIGE/YShzLG8pOm51bGx9KSkubWFwKCgobyxpKT0+e2xldCB1PSJmdW5jdGlvbiI9PXR5cGVvZiBhP2E6SXQub3BlcmF0aW9uc1NvcnRlclthXSxfPXU/by5zb3J0KHUpOm87cmV0dXJuKDAsemUuTWFwKSh7dGFnRGV0YWlsczp0YWdEZXRhaWxzKHMsaSksb3BlcmF0aW9uczpffSl9KSl9LFpzPVV0KHNwZWNfc2VsZWN0b3JzX3N0YXRlLChzPT5zLmdldCgicmVzcG9uc2VzIiwoMCx6ZS5NYXApKCkpKSksZW89VXQoc3BlY19zZWxlY3RvcnNfc3RhdGUsKHM9PnMuZ2V0KCJyZXF1ZXN0cyIsKDAsemUuTWFwKSgpKSkpLHRvPVV0KHNwZWNfc2VsZWN0b3JzX3N0YXRlLChzPT5zLmdldCgibXV0YXRlZFJlcXVlc3RzIiwoMCx6ZS5NYXApKCkpKSkscmVzcG9uc2VGb3I9KHMsbyxpKT0+WnMocykuZ2V0SW4oW28saV0sbnVsbCkscmVxdWVzdEZvcj0ocyxvLGkpPT5lbyhzKS5nZXRJbihbbyxpXSxudWxsKSxtdXRhdGVkUmVxdWVzdEZvcj0ocyxvLGkpPT50byhzKS5nZXRJbihbbyxpXSxudWxsKSxhbGxvd1RyeUl0T3V0Rm9yPSgpPT4hMCxwYXJhbWV0ZXJXaXRoTWV0YUJ5SWRlbnRpdHk9KHMsbyxpKT0+e2NvbnN0IGE9TnMocykuZ2V0SW4oWyJwYXRocyIsLi4ubywicGFyYW1ldGVycyJdLCgwLHplLk9yZGVyZWRNYXApKCkpLHU9cy5nZXRJbihbIm1ldGEiLCJwYXRocyIsLi4ubywicGFyYW1ldGVycyJdLCgwLHplLk9yZGVyZWRNYXApKCkpO3JldHVybiBhLm1hcCgocz0+e2NvbnN0IG89dS5nZXQoYCR7aS5nZXQoImluIil9LiR7aS5nZXQoIm5hbWUiKX1gKSxhPXUuZ2V0KGAke2kuZ2V0KCJpbiIpfS4ke2kuZ2V0KCJuYW1lIil9Lmhhc2gtJHtpLmhhc2hDb2RlKCl9YCk7cmV0dXJuKDAsemUuT3JkZXJlZE1hcCkoKS5tZXJnZShzLG8sYSl9KSkuZmluZCgocz0+cy5nZXQoImluIik9PT1pLmdldCgiaW4iKSYmcy5nZXQoIm5hbWUiKT09PWkuZ2V0KCJuYW1lIikpLCgwLHplLk9yZGVyZWRNYXApKCkpfSxwYXJhbWV0ZXJJbmNsdXNpb25TZXR0aW5nRm9yPShzLG8saSxhKT0+e2NvbnN0IHU9YCR7YX0uJHtpfWA7cmV0dXJuIHMuZ2V0SW4oWyJtZXRhIiwicGF0aHMiLC4uLm8sInBhcmFtZXRlcl9pbmNsdXNpb25zIix1XSwhMSl9LHBhcmFtZXRlcldpdGhNZXRhPShzLG8saSxhKT0+e2NvbnN0IHU9TnMocykuZ2V0SW4oWyJwYXRocyIsLi4ubywicGFyYW1ldGVycyJdLCgwLHplLk9yZGVyZWRNYXApKCkpLmZpbmQoKHM9PnMuZ2V0KCJpbiIpPT09YSYmcy5nZXQoIm5hbWUiKT09PWkpLCgwLHplLk9yZGVyZWRNYXApKCkpO3JldHVybiBwYXJhbWV0ZXJXaXRoTWV0YUJ5SWRlbnRpdHkocyxvLHUpfSxvcGVyYXRpb25XaXRoTWV0YT0ocyxvLGkpPT57Y29uc3QgYT1OcyhzKS5nZXRJbihbInBhdGhzIixvLGldLCgwLHplLk9yZGVyZWRNYXApKCkpLHU9cy5nZXRJbihbIm1ldGEiLCJwYXRocyIsbyxpXSwoMCx6ZS5PcmRlcmVkTWFwKSgpKSxfPWEuZ2V0KCJwYXJhbWV0ZXJzIiwoMCx6ZS5MaXN0KSgpKS5tYXAoKGE9PnBhcmFtZXRlcldpdGhNZXRhQnlJZGVudGl0eShzLFtvLGldLGEpKSk7cmV0dXJuKDAsemUuT3JkZXJlZE1hcCkoKS5tZXJnZShhLHUpLnNldCgicGFyYW1ldGVycyIsXyl9O2Z1bmN0aW9uIGdldFBhcmFtZXRlcihzLG8saSxhKXtyZXR1cm4gbz1vfHxbXSxzLmdldEluKFsibWV0YSIsInBhdGhzIiwuLi5vLCJwYXJhbWV0ZXJzIl0sKDAsemUuZnJvbUpTKShbXSkpLmZpbmQoKHM9PnplLk1hcC5pc01hcChzKSYmcy5nZXQoIm5hbWUiKT09PWkmJnMuZ2V0KCJpbiIpPT09YSkpfHwoMCx6ZS5NYXApKCl9Y29uc3Qgcm89VXQoc3BlYywocz0+e2NvbnN0IG89cy5nZXQoImhvc3QiKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJm8ubGVuZ3RoPjAmJiIvIiE9PW9bMF19KSk7ZnVuY3Rpb24gcGFyYW1ldGVyVmFsdWVzKHMsbyxpKXtyZXR1cm4gbz1vfHxbXSxvcGVyYXRpb25XaXRoTWV0YShzLC4uLm8pLmdldCgicGFyYW1ldGVycyIsKDAsemUuTGlzdCkoKSkucmVkdWNlKCgocyxvKT0+e2xldCBhPWkmJiJib2R5Ij09PW8uZ2V0KCJpbiIpP28uZ2V0KCJ2YWx1ZV94bWwiKTpvLmdldCgidmFsdWUiKTtyZXR1cm4gemUuTGlzdC5pc0xpc3QoYSkmJihhPWEuZmlsdGVyKChzPT4iIiE9PXMpKSkscy5zZXQocGFyYW1Ub0lkZW50aWZpZXIobyx7YWxsb3dIYXNoZXM6ITF9KSxhKX0pLCgwLHplLmZyb21KUykoe30pKX1mdW5jdGlvbiBwYXJhbWV0ZXJzSW5jbHVkZUluKHMsbz0iIil7aWYoemUuTGlzdC5pc0xpc3QocykpcmV0dXJuIHMuc29tZSgocz0+emUuTWFwLmlzTWFwKHMpJiZzLmdldCgiaW4iKT09PW8pKX1mdW5jdGlvbiBwYXJhbWV0ZXJzSW5jbHVkZVR5cGUocyxvPSIiKXtpZih6ZS5MaXN0LmlzTGlzdChzKSlyZXR1cm4gcy5zb21lKChzPT56ZS5NYXAuaXNNYXAocykmJnMuZ2V0KCJ0eXBlIik9PT1vKSl9ZnVuY3Rpb24gY29udGVudFR5cGVWYWx1ZXMocyxvKXtvPW98fFtdO2xldCBpPU5zKHMpLmdldEluKFsicGF0aHMiLC4uLm9dLCgwLHplLmZyb21KUykoe30pKSxhPXMuZ2V0SW4oWyJtZXRhIiwicGF0aHMiLC4uLm9dLCgwLHplLmZyb21KUykoe30pKSx1PWN1cnJlbnRQcm9kdWNlc0ZvcihzLG8pO2NvbnN0IF89aS5nZXQoInBhcmFtZXRlcnMiKXx8bmV3IHplLkxpc3Qsdz1hLmdldCgiY29uc3VtZXNfdmFsdWUiKT9hLmdldCgiY29uc3VtZXNfdmFsdWUiKTpwYXJhbWV0ZXJzSW5jbHVkZVR5cGUoXywiZmlsZSIpPyJtdWx0aXBhcnQvZm9ybS1kYXRhIjpwYXJhbWV0ZXJzSW5jbHVkZVR5cGUoXywiZm9ybURhdGEiKT8iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjp2b2lkIDA7cmV0dXJuKDAsemUuZnJvbUpTKSh7cmVxdWVzdENvbnRlbnRUeXBlOncscmVzcG9uc2VDb250ZW50VHlwZTp1fSl9ZnVuY3Rpb24gY3VycmVudFByb2R1Y2VzRm9yKHMsbyl7bz1vfHxbXTtjb25zdCBpPU5zKHMpLmdldEluKFsicGF0aHMiLC4uLm9dLG51bGwpO2lmKG51bGw9PT1pKXJldHVybjtjb25zdCBhPXMuZ2V0SW4oWyJtZXRhIiwicGF0aHMiLC4uLm8sInByb2R1Y2VzX3ZhbHVlIl0sbnVsbCksdT1pLmdldEluKFsicHJvZHVjZXMiLDBdLG51bGwpO3JldHVybiBhfHx1fHwiYXBwbGljYXRpb24vanNvbiJ9ZnVuY3Rpb24gcHJvZHVjZXNPcHRpb25zRm9yKHMsbyl7bz1vfHxbXTtjb25zdCBpPU5zKHMpLGE9aS5nZXRJbihbInBhdGhzIiwuLi5vXSxudWxsKTtpZihudWxsPT09YSlyZXR1cm47Y29uc3RbdV09byxfPWEuZ2V0KCJwcm9kdWNlcyIsbnVsbCksdz1pLmdldEluKFsicGF0aHMiLHUsInByb2R1Y2VzIl0sbnVsbCkseD1pLmdldEluKFsicHJvZHVjZXMiXSxudWxsKTtyZXR1cm4gX3x8d3x8eH1mdW5jdGlvbiBjb25zdW1lc09wdGlvbnNGb3IocyxvKXtvPW98fFtdO2NvbnN0IGk9TnMocyksYT1pLmdldEluKFsicGF0aHMiLC4uLm9dLG51bGwpO2lmKG51bGw9PT1hKXJldHVybjtjb25zdFt1XT1vLF89YS5nZXQoImNvbnN1bWVzIixudWxsKSx3PWkuZ2V0SW4oWyJwYXRocyIsdSwiY29uc3VtZXMiXSxudWxsKSx4PWkuZ2V0SW4oWyJjb25zdW1lcyJdLG51bGwpO3JldHVybiBffHx3fHx4fWNvbnN0IG9wZXJhdGlvblNjaGVtZT0ocyxvLGkpPT57bGV0IGE9cy5nZXQoInVybCIpLm1hdGNoKC9eKFthLXpdW2EtejAtOStcLS5dKik6LyksdT1BcnJheS5pc0FycmF5KGEpP2FbMV06bnVsbDtyZXR1cm4gcy5nZXRJbihbInNjaGVtZSIsbyxpXSl8fHMuZ2V0SW4oWyJzY2hlbWUiLCJfZGVmYXVsdFNjaGVtZSJdKXx8dXx8IiJ9LGNhbkV4ZWN1dGVTY2hlbWU9KHMsbyxpKT0+WyJodHRwIiwiaHR0cHMiXS5pbmRleE9mKG9wZXJhdGlvblNjaGVtZShzLG8saSkpPi0xLHZhbGlkYXRpb25FcnJvcnM9KHMsbyk9PntvPW98fFtdO2NvbnN0IGk9cy5nZXRJbihbIm1ldGEiLCJwYXRocyIsLi4ubywicGFyYW1ldGVycyJdLCgwLHplLmZyb21KUykoW10pKSxhPVtdO2lmKDA9PT1pLmxlbmd0aClyZXR1cm4gYTtjb25zdCBnZXRFcnJvcnNXaXRoUGF0aHM9KHMsbz1bXSk9Pntjb25zdCBnZXROZXN0ZWRFcnJvcnNXaXRoUGF0aHM9KHMsbyk9Pntjb25zdCBpPVsuLi5vLHMuZ2V0KCJwcm9wS2V5Iil8fHMuZ2V0KCJpbmRleCIpXTtyZXR1cm4gemUuTWFwLmlzTWFwKHMuZ2V0KCJlcnJvciIpKT9nZXRFcnJvcnNXaXRoUGF0aHMocy5nZXQoImVycm9yIiksaSk6e2Vycm9yOnMuZ2V0KCJlcnJvciIpLHBhdGg6aX19O3JldHVybiB6ZS5MaXN0LmlzTGlzdChzKT9zLm1hcCgocz0+emUuTWFwLmlzTWFwKHMpP2dldE5lc3RlZEVycm9yc1dpdGhQYXRocyhzLG8pOntlcnJvcjpzLHBhdGg6b30pKTpnZXROZXN0ZWRFcnJvcnNXaXRoUGF0aHMocyxvKX07cmV0dXJuIGkuZm9yRWFjaCgoKHMsbyk9Pntjb25zdCBpPW8uc3BsaXQoIi4iKS5zbGljZSgxLC0xKS5qb2luKCIuIiksdT1zLmdldCgiZXJyb3JzIik7aWYodSYmdS5jb3VudCgpKXtnZXRFcnJvcnNXaXRoUGF0aHModSkuZm9yRWFjaCgoKHtlcnJvcjpzLHBhdGg6b30pPT57YS5wdXNoKCgocyxvLGkpPT5gRm9yICcke2l9JyR7KG89by5yZWR1Y2UoKChzLG8pPT4ibnVtYmVyIj09dHlwZW9mIG8/YCR7c31bJHtvfV1gOnM/YCR7c30uJHtvfWA6byksIiIpKT9gIGF0IHBhdGggJyR7b30nYDoiIn06ICR7c30uYCkocyxvLGkpKX0pKX19KSksYX0sdmFsaWRhdGVCZWZvcmVFeGVjdXRlPShzLG8pPT4wPT09dmFsaWRhdGlvbkVycm9ycyhzLG8pLmxlbmd0aCxnZXRPQVMzUmVxdWlyZWRSZXF1ZXN0Qm9keUNvbnRlbnRUeXBlPShzLG8pPT57bGV0IGk9e3JlcXVlc3RCb2R5OiExLHJlcXVlc3RDb250ZW50VHlwZTp7fX0sYT1zLmdldEluKFsicmVzb2x2ZWRTdWJ0cmVlcyIsInBhdGhzIiwuLi5vLCJyZXF1ZXN0Qm9keSJdLCgwLHplLmZyb21KUykoW10pKTtyZXR1cm4gYS5zaXplPDF8fChhLmdldEluKFsicmVxdWlyZWQiXSkmJihpLnJlcXVlc3RCb2R5PWEuZ2V0SW4oWyJyZXF1aXJlZCJdKSksYS5nZXRJbihbImNvbnRlbnQiXSkuZW50cnlTZXEoKS5mb3JFYWNoKChzPT57Y29uc3Qgbz1zWzBdO2lmKHNbMV0uZ2V0SW4oWyJzY2hlbWEiLCJyZXF1aXJlZCJdKSl7Y29uc3QgYT1zWzFdLmdldEluKFsic2NoZW1hIiwicmVxdWlyZWQiXSkudG9KUygpO2kucmVxdWVzdENvbnRlbnRUeXBlW29dPWF9fSkpKSxpfSxpc01lZGlhVHlwZVNjaGVtYVByb3BlcnRpZXNFcXVhbD0ocyxvLGksYSk9PntpZigoaXx8YSkmJmk9PT1hKXJldHVybiEwO2xldCB1PXMuZ2V0SW4oWyJyZXNvbHZlZFN1YnRyZWVzIiwicGF0aHMiLC4uLm8sInJlcXVlc3RCb2R5IiwiY29udGVudCJdLCgwLHplLmZyb21KUykoW10pKTtpZih1LnNpemU8Mnx8IWl8fCFhKXJldHVybiExO2xldCBfPXUuZ2V0SW4oW2ksInNjaGVtYSIsInByb3BlcnRpZXMiXSwoMCx6ZS5mcm9tSlMpKFtdKSksdz11LmdldEluKFthLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIl0sKDAsemUuZnJvbUpTKShbXSkpO3JldHVybiEhXy5lcXVhbHModyl9O2Z1bmN0aW9uIHJldHVyblNlbGZPck5ld01hcChzKXtyZXR1cm4gemUuTWFwLmlzTWFwKHMpP3M6bmV3IHplLk1hcH12YXIgbm89X193ZWJwYWNrX3JlcXVpcmVfXyg4NTAxNSksc289X193ZWJwYWNrX3JlcXVpcmVfXy5uKG5vKSxvbz1fX3dlYnBhY2tfcmVxdWlyZV9fKDM4MjIxKSxpbz1fX3dlYnBhY2tfcmVxdWlyZV9fLm4ob28pLGFvPV9fd2VicGFja19yZXF1aXJlX18oNjM1NjApLGNvPV9fd2VicGFja19yZXF1aXJlX18ubihhbyksbG89X193ZWJwYWNrX3JlcXVpcmVfXyg1NjM2NyksdW89X193ZWJwYWNrX3JlcXVpcmVfXy5uKGxvKTtjb25zdCBwbz0ic3BlY191cGRhdGVfc3BlYyIsaG89InNwZWNfdXBkYXRlX3VybCIsZm89InNwZWNfdXBkYXRlX2pzb24iLG1vPSJzcGVjX3VwZGF0ZV9wYXJhbSIsZ289InNwZWNfdXBkYXRlX2VtcHR5X3BhcmFtX2luY2x1c2lvbiIseW89InNwZWNfdmFsaWRhdGVfcGFyYW0iLHZvPSJzcGVjX3NldF9yZXNwb25zZSIsYm89InNwZWNfc2V0X3JlcXVlc3QiLFNvPSJzcGVjX3NldF9tdXRhdGVkX3JlcXVlc3QiLF9vPSJzcGVjX2xvZ19yZXF1ZXN0IixFbz0ic3BlY19jbGVhcl9yZXNwb25zZSIsd289InNwZWNfY2xlYXJfcmVxdWVzdCIseG89InNwZWNfY2xlYXJfdmFsaWRhdGVfcGFyYW0iLGtvPSJzcGVjX3VwZGF0ZV9vcGVyYXRpb25fbWV0YV92YWx1ZSIsT289InNwZWNfdXBkYXRlX3Jlc29sdmVkIixBbz0ic3BlY191cGRhdGVfcmVzb2x2ZWRfc3VidHJlZSIsQ289InNldF9zY2hlbWUiLHRvU3RyPXM9PnNvKCkocyk/czoiIjtmdW5jdGlvbiB1cGRhdGVTcGVjKHMpe2NvbnN0IG89dG9TdHIocykucmVwbGFjZSgvXHQvZywiICAiKTtpZigic3RyaW5nIj09dHlwZW9mIHMpcmV0dXJue3R5cGU6cG8scGF5bG9hZDpvfX1mdW5jdGlvbiB1cGRhdGVSZXNvbHZlZChzKXtyZXR1cm57dHlwZTpPbyxwYXlsb2FkOnN9fWZ1bmN0aW9uIHVwZGF0ZVVybChzKXtyZXR1cm57dHlwZTpobyxwYXlsb2FkOnN9fWZ1bmN0aW9uIHVwZGF0ZUpzb25TcGVjKHMpe3JldHVybnt0eXBlOmZvLHBheWxvYWQ6c319Y29uc3QgcGFyc2VUb0pzb249cz0+KHtzcGVjQWN0aW9uczpvLHNwZWNTZWxlY3RvcnM6aSxlcnJBY3Rpb25zOmF9KT0+e2xldHtzcGVjU3RyOnV9PWksXz1udWxsO3RyeXtzPXN8fHUoKSxhLmNsZWFyKHtzb3VyY2U6InBhcnNlciJ9KSxfPWZuLmxvYWQocyx7c2NoZW1hOnJufSl9Y2F0Y2gocyl7cmV0dXJuIGNvbnNvbGUuZXJyb3IocyksYS5uZXdTcGVjRXJyKHtzb3VyY2U6InBhcnNlciIsbGV2ZWw6ImVycm9yIixtZXNzYWdlOnMucmVhc29uLGxpbmU6cy5tYXJrJiZzLm1hcmsubGluZT9zLm1hcmsubGluZSsxOnZvaWQgMH0pfXJldHVybiBfJiYib2JqZWN0Ij09dHlwZW9mIF8/by51cGRhdGVKc29uU3BlYyhfKTpvLnVwZGF0ZUpzb25TcGVjKHt9KX07bGV0IGpvPSExO2NvbnN0IHJlc29sdmVTcGVjPShzLG8pPT4oe3NwZWNBY3Rpb25zOmksc3BlY1NlbGVjdG9yczphLGVyckFjdGlvbnM6dSxmbjp7ZmV0Y2g6XyxyZXNvbHZlOncsQVNUOng9e319LGdldENvbmZpZ3M6Q30pPT57am98fChjb25zb2xlLndhcm4oInNwZWNBY3Rpb25zLnJlc29sdmVTcGVjIGlzIGRlcHJlY2F0ZWQgc2luY2UgdjMuMTAuMCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHY0LjAuMDsgdXNlIHJlcXVlc3RSZXNvbHZlZFN1YnRyZWUgaW5zdGVhZCEiKSxqbz0hMCk7Y29uc3R7bW9kZWxQcm9wZXJ0eU1hY3JvOmoscGFyYW1ldGVyTWFjcm86TCxyZXF1ZXN0SW50ZXJjZXB0b3I6QixyZXNwb25zZUludGVyY2VwdG9yOiR9PUMoKTt2b2lkIDA9PT1zJiYocz1hLnNwZWNKc29uKCkpLHZvaWQgMD09PW8mJihvPWEudXJsKCkpO2xldCBVPXguZ2V0TGluZU51bWJlckZvclBhdGg/eC5nZXRMaW5lTnVtYmVyRm9yUGF0aDooKT0+e30sVj1hLnNwZWNTdHIoKTtyZXR1cm4gdyh7ZmV0Y2g6XyxzcGVjOnMsYmFzZURvYzpTdHJpbmcobmV3IFVSTChvLGRvY3VtZW50LmJhc2VVUkkpKSxtb2RlbFByb3BlcnR5TWFjcm86aixwYXJhbWV0ZXJNYWNybzpMLHJlcXVlc3RJbnRlcmNlcHRvcjpCLHJlc3BvbnNlSW50ZXJjZXB0b3I6JH0pLnRoZW4oKCh7c3BlYzpzLGVycm9yczpvfSk9PntpZih1LmNsZWFyKHt0eXBlOiJ0aHJvd24ifSksQXJyYXkuaXNBcnJheShvKSYmby5sZW5ndGg+MCl7bGV0IHM9by5tYXAoKHM9Pihjb25zb2xlLmVycm9yKHMpLHMubGluZT1zLmZ1bGxQYXRoP1UoVixzLmZ1bGxQYXRoKTpudWxsLHMucGF0aD1zLmZ1bGxQYXRoP3MuZnVsbFBhdGguam9pbigiLiIpOm51bGwscy5sZXZlbD0iZXJyb3IiLHMudHlwZT0idGhyb3duIixzLnNvdXJjZT0icmVzb2x2ZXIiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCJtZXNzYWdlIix7ZW51bWVyYWJsZTohMCx2YWx1ZTpzLm1lc3NhZ2V9KSxzKSkpO3UubmV3VGhyb3duRXJyQmF0Y2gocyl9cmV0dXJuIGkudXBkYXRlUmVzb2x2ZWQocyl9KSl9O2xldCBQbz1bXTtjb25zdCBJbz1pbygpKCgoKT0+e2NvbnN0IHM9UG8ucmVkdWNlKCgocyx7cGF0aDpvLHN5c3RlbTppfSk9PihzLmhhcyhpKXx8cy5zZXQoaSxbXSkscy5nZXQoaSkucHVzaChvKSxzKSksbmV3IE1hcCk7UG89W10scy5mb3JFYWNoKChhc3luYyhzLG8pPT57aWYoIW8pcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiZGViUmVzb2x2ZVN1YnRyZWVzOiBkb24ndCBoYXZlIGEgc3lzdGVtIHRvIG9wZXJhdGUgb24sIGFib3J0aW5nLiIpO2lmKCFvLmZuLnJlc29sdmVTdWJ0cmVlKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIkVycm9yOiBTd2FnZ2VyLUNsaWVudCBkaWQgbm90IHByb3ZpZGUgYSBgcmVzb2x2ZVN1YnRyZWVgIG1ldGhvZCwgZG9pbmcgbm90aGluZy4iKTtjb25zdHtlcnJBY3Rpb25zOmksZXJyU2VsZWN0b3JzOmEsZm46e3Jlc29sdmVTdWJ0cmVlOnUsZmV0Y2g6XyxBU1Q6dz17fX0sc3BlY1NlbGVjdG9yczp4LHNwZWNBY3Rpb25zOkN9PW8saj13LmdldExpbmVOdW1iZXJGb3JQYXRoPz94cygpKHZvaWQgMCksTD14LnNwZWNTdHIoKSx7bW9kZWxQcm9wZXJ0eU1hY3JvOkIscGFyYW1ldGVyTWFjcm86JCxyZXF1ZXN0SW50ZXJjZXB0b3I6VSxyZXNwb25zZUludGVyY2VwdG9yOlZ9PW8uZ2V0Q29uZmlncygpO3RyeXtjb25zdCBvPWF3YWl0IHMucmVkdWNlKChhc3luYyhzLG8pPT57bGV0e3Jlc3VsdE1hcDp3LHNwZWNXaXRoQ3VycmVudFN1YnRyZWVzOkN9PWF3YWl0IHM7Y29uc3R7ZXJyb3JzOnosc3BlYzpZfT1hd2FpdCB1KEMsbyx7YmFzZURvYzpTdHJpbmcobmV3IFVSTCh4LnVybCgpLGRvY3VtZW50LmJhc2VVUkkpKSxtb2RlbFByb3BlcnR5TWFjcm86QixwYXJhbWV0ZXJNYWNybzokLHJlcXVlc3RJbnRlcmNlcHRvcjpVLHJlc3BvbnNlSW50ZXJjZXB0b3I6Vn0pO2lmKGEuYWxsRXJyb3JzKCkuc2l6ZSYmaS5jbGVhckJ5KChzPT4idGhyb3duIiE9PXMuZ2V0KCJ0eXBlIil8fCJyZXNvbHZlciIhPT1zLmdldCgic291cmNlIil8fCFzLmdldCgiZnVsbFBhdGgiKT8uZXZlcnkoKChzLGkpPT5zPT09b1tpXXx8dm9pZCAwPT09b1tpXSkpKSksQXJyYXkuaXNBcnJheSh6KSYmei5sZW5ndGg+MCl7bGV0IHM9ei5tYXAoKHM9PihzLmxpbmU9cy5mdWxsUGF0aD9qKEwscy5mdWxsUGF0aCk6bnVsbCxzLnBhdGg9cy5mdWxsUGF0aD9zLmZ1bGxQYXRoLmpvaW4oIi4iKTpudWxsLHMubGV2ZWw9ImVycm9yIixzLnR5cGU9InRocm93biIscy5zb3VyY2U9InJlc29sdmVyIixPYmplY3QuZGVmaW5lUHJvcGVydHkocywibWVzc2FnZSIse2VudW1lcmFibGU6ITAsdmFsdWU6cy5tZXNzYWdlfSkscykpKTtpLm5ld1Rocm93bkVyckJhdGNoKHMpfXJldHVybiBZJiZ4LmlzT0FTMygpJiYiY29tcG9uZW50cyI9PT1vWzBdJiYic2VjdXJpdHlTY2hlbWVzIj09PW9bMV0mJmF3YWl0IFByb21pc2UuYWxsKE9iamVjdC52YWx1ZXMoWSkuZmlsdGVyKChzPT4ib3BlbklkQ29ubmVjdCI9PT1zPy50eXBlKSkubWFwKChhc3luYyBzPT57Y29uc3Qgbz17dXJsOnMub3BlbklkQ29ubmVjdFVybCxyZXF1ZXN0SW50ZXJjZXB0b3I6VSxyZXNwb25zZUludGVyY2VwdG9yOlZ9O3RyeXtjb25zdCBpPWF3YWl0IF8obyk7aSBpbnN0YW5jZW9mIEVycm9yfHxpLnN0YXR1cz49NDAwP2NvbnNvbGUuZXJyb3IoaS5zdGF0dXNUZXh0KyIgIitvLnVybCk6cy5vcGVuSWRDb25uZWN0RGF0YT1KU09OLnBhcnNlKGkudGV4dCl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcihzKX19KSkpLGNvKCkodyxvLFkpLEM9dW8oKShvLFksQykse3Jlc3VsdE1hcDp3LHNwZWNXaXRoQ3VycmVudFN1YnRyZWVzOkN9fSksUHJvbWlzZS5yZXNvbHZlKHtyZXN1bHRNYXA6KHguc3BlY1Jlc29sdmVkU3VidHJlZShbXSl8fCgwLHplLk1hcCkoKSkudG9KUygpLHNwZWNXaXRoQ3VycmVudFN1YnRyZWVzOnguc3BlY0pTKCl9KSk7Qy51cGRhdGVSZXNvbHZlZFN1YnRyZWUoW10sby5yZXN1bHRNYXApfWNhdGNoKHMpe2NvbnNvbGUuZXJyb3Iocyl9fSkpfSksMzUpLHJlcXVlc3RSZXNvbHZlZFN1YnRyZWU9cz0+bz0+e1BvLmZpbmQoKCh7cGF0aDppLHN5c3RlbTphfSk9PmE9PT1vJiZpLnRvU3RyaW5nKCk9PT1zLnRvU3RyaW5nKCkpKXx8KFBvLnB1c2goe3BhdGg6cyxzeXN0ZW06b30pLElvKCkpfTtmdW5jdGlvbiBjaGFuZ2VQYXJhbShzLG8saSxhLHUpe3JldHVybnt0eXBlOm1vLHBheWxvYWQ6e3BhdGg6cyx2YWx1ZTphLHBhcmFtTmFtZTpvLHBhcmFtSW46aSxpc1htbDp1fX19ZnVuY3Rpb24gY2hhbmdlUGFyYW1CeUlkZW50aXR5KHMsbyxpLGEpe3JldHVybnt0eXBlOm1vLHBheWxvYWQ6e3BhdGg6cyxwYXJhbTpvLHZhbHVlOmksaXNYbWw6YX19fWNvbnN0IHVwZGF0ZVJlc29sdmVkU3VidHJlZT0ocyxvKT0+KHt0eXBlOkFvLHBheWxvYWQ6e3BhdGg6cyx2YWx1ZTpvfX0pLGludmFsaWRhdGVSZXNvbHZlZFN1YnRyZWVDYWNoZT0oKT0+KHt0eXBlOkFvLHBheWxvYWQ6e3BhdGg6W10sdmFsdWU6KDAsemUuTWFwKSgpfX0pLHZhbGlkYXRlUGFyYW1zPShzLG8pPT4oe3R5cGU6eW8scGF5bG9hZDp7cGF0aE1ldGhvZDpzLGlzT0FTMzpvfX0pLHVwZGF0ZUVtcHR5UGFyYW1JbmNsdXNpb249KHMsbyxpLGEpPT4oe3R5cGU6Z28scGF5bG9hZDp7cGF0aE1ldGhvZDpzLHBhcmFtTmFtZTpvLHBhcmFtSW46aSxpbmNsdWRlRW1wdHlWYWx1ZTphfX0pO2Z1bmN0aW9uIGNsZWFyVmFsaWRhdGVQYXJhbXMocyl7cmV0dXJue3R5cGU6eG8scGF5bG9hZDp7cGF0aE1ldGhvZDpzfX19ZnVuY3Rpb24gY2hhbmdlQ29uc3VtZXNWYWx1ZShzLG8pe3JldHVybnt0eXBlOmtvLHBheWxvYWQ6e3BhdGg6cyx2YWx1ZTpvLGtleToiY29uc3VtZXNfdmFsdWUifX19ZnVuY3Rpb24gY2hhbmdlUHJvZHVjZXNWYWx1ZShzLG8pe3JldHVybnt0eXBlOmtvLHBheWxvYWQ6e3BhdGg6cyx2YWx1ZTpvLGtleToicHJvZHVjZXNfdmFsdWUifX19Y29uc3Qgc2V0UmVzcG9uc2U9KHMsbyxpKT0+KHtwYXlsb2FkOntwYXRoOnMsbWV0aG9kOm8scmVzOml9LHR5cGU6dm99KSxzZXRSZXF1ZXN0PShzLG8saSk9Pih7cGF5bG9hZDp7cGF0aDpzLG1ldGhvZDpvLHJlcTppfSx0eXBlOmJvfSksc2V0TXV0YXRlZFJlcXVlc3Q9KHMsbyxpKT0+KHtwYXlsb2FkOntwYXRoOnMsbWV0aG9kOm8scmVxOml9LHR5cGU6U299KSxsb2dSZXF1ZXN0PXM9Pih7cGF5bG9hZDpzLHR5cGU6X299KSxleGVjdXRlUmVxdWVzdD1zPT4oe2ZuOm8sc3BlY0FjdGlvbnM6aSxzcGVjU2VsZWN0b3JzOmEsZ2V0Q29uZmlnczp1LG9hczNTZWxlY3RvcnM6X30pPT57bGV0e3BhdGhOYW1lOncsbWV0aG9kOngsb3BlcmF0aW9uOkN9PXMse3JlcXVlc3RJbnRlcmNlcHRvcjpqLHJlc3BvbnNlSW50ZXJjZXB0b3I6TH09dSgpLEI9Qy50b0pTKCk7aWYoQyYmQy5nZXQoInBhcmFtZXRlcnMiKSYmQy5nZXQoInBhcmFtZXRlcnMiKS5maWx0ZXIoKHM9PnMmJiEwPT09cy5nZXQoImFsbG93RW1wdHlWYWx1ZSIpKSkuZm9yRWFjaCgobz0+e2lmKGEucGFyYW1ldGVySW5jbHVzaW9uU2V0dGluZ0Zvcihbdyx4XSxvLmdldCgibmFtZSIpLG8uZ2V0KCJpbiIpKSl7cy5wYXJhbWV0ZXJzPXMucGFyYW1ldGVyc3x8e307Y29uc3QgaT1wYXJhbVRvVmFsdWUobyxzLnBhcmFtZXRlcnMpOyghaXx8aSYmMD09PWkuc2l6ZSkmJihzLnBhcmFtZXRlcnNbby5nZXQoIm5hbWUiKV09IiIpfX0pKSxzLmNvbnRleHRVcmw9TnQoKShhLnVybCgpKS50b1N0cmluZygpLEImJkIub3BlcmF0aW9uSWQ/cy5vcGVyYXRpb25JZD1CLm9wZXJhdGlvbklkOkImJncmJngmJihzLm9wZXJhdGlvbklkPW8ub3BJZChCLHcseCkpLGEuaXNPQVMzKCkpe2NvbnN0IG89YCR7d306JHt4fWA7cy5zZXJ2ZXI9Xy5zZWxlY3RlZFNlcnZlcihvKXx8Xy5zZWxlY3RlZFNlcnZlcigpO2NvbnN0IGk9Xy5zZXJ2ZXJWYXJpYWJsZXMoe3NlcnZlcjpzLnNlcnZlcixuYW1lc3BhY2U6b30pLnRvSlMoKSxhPV8uc2VydmVyVmFyaWFibGVzKHtzZXJ2ZXI6cy5zZXJ2ZXJ9KS50b0pTKCk7cy5zZXJ2ZXJWYXJpYWJsZXM9T2JqZWN0LmtleXMoaSkubGVuZ3RoP2k6YSxzLnJlcXVlc3RDb250ZW50VHlwZT1fLnJlcXVlc3RDb250ZW50VHlwZSh3LHgpLHMucmVzcG9uc2VDb250ZW50VHlwZT1fLnJlc3BvbnNlQ29udGVudFR5cGUodyx4KXx8IiovKiI7Y29uc3QgdT1fLnJlcXVlc3RCb2R5VmFsdWUodyx4KSxDPV8ucmVxdWVzdEJvZHlJbmNsdXNpb25TZXR0aW5nKHcseCk7dSYmdS50b0pTP3MucmVxdWVzdEJvZHk9dS5tYXAoKHM9PnplLk1hcC5pc01hcChzKT9zLmdldCgidmFsdWUiKTpzKSkuZmlsdGVyKCgocyxvKT0+KEFycmF5LmlzQXJyYXkocyk/MCE9PXMubGVuZ3RoOiFpc0VtcHR5VmFsdWUocykpfHxDLmdldChvKSkpLnRvSlMoKTpzLnJlcXVlc3RCb2R5PXV9bGV0ICQ9T2JqZWN0LmFzc2lnbih7fSxzKTskPW8uYnVpbGRSZXF1ZXN0KCQpLGkuc2V0UmVxdWVzdChzLnBhdGhOYW1lLHMubWV0aG9kLCQpO3MucmVxdWVzdEludGVyY2VwdG9yPWFzeW5jIG89PntsZXQgYT1hd2FpdCBqLmFwcGx5KHZvaWQgMCxbb10pLHU9T2JqZWN0LmFzc2lnbih7fSxhKTtyZXR1cm4gaS5zZXRNdXRhdGVkUmVxdWVzdChzLnBhdGhOYW1lLHMubWV0aG9kLHUpLGF9LHMucmVzcG9uc2VJbnRlcmNlcHRvcj1MO2NvbnN0IFU9RGF0ZS5ub3coKTtyZXR1cm4gby5leGVjdXRlKHMpLnRoZW4oKG89PntvLmR1cmF0aW9uPURhdGUubm93KCktVSxpLnNldFJlc3BvbnNlKHMucGF0aE5hbWUscy5tZXRob2Qsbyl9KSkuY2F0Y2goKG89PnsiRmFpbGVkIHRvIGZldGNoIj09PW8ubWVzc2FnZSYmKG8ubmFtZT0iIixvLm1lc3NhZ2U9JyoqRmFpbGVkIHRvIGZldGNoLioqICBcbioqUG9zc2libGUgUmVhc29uczoqKiBcbiAgLSBDT1JTIFxuICAtIE5ldHdvcmsgRmFpbHVyZSBcbiAgLSBVUkwgc2NoZW1lIG11c3QgYmUgImh0dHAiIG9yICJodHRwcyIgZm9yIENPUlMgcmVxdWVzdC4nKSxpLnNldFJlc3BvbnNlKHMucGF0aE5hbWUscy5tZXRob2Qse2Vycm9yOiEwLGVycjpvfSl9KSl9LGFjdGlvbnNfZXhlY3V0ZT0oe3BhdGg6cyxtZXRob2Q6bywuLi5pfT17fSk9PmE9PntsZXR7Zm46e2ZldGNoOnV9LHNwZWNTZWxlY3RvcnM6XyxzcGVjQWN0aW9uczp3fT1hLHg9Xy5zcGVjSnNvbldpdGhSZXNvbHZlZFN1YnRyZWVzKCkudG9KUygpLEM9Xy5vcGVyYXRpb25TY2hlbWUocyxvKSx7cmVxdWVzdENvbnRlbnRUeXBlOmoscmVzcG9uc2VDb250ZW50VHlwZTpMfT1fLmNvbnRlbnRUeXBlVmFsdWVzKFtzLG9dKS50b0pTKCksQj0veG1sL2kudGVzdChqKSwkPV8ucGFyYW1ldGVyVmFsdWVzKFtzLG9dLEIpLnRvSlMoKTtyZXR1cm4gdy5leGVjdXRlUmVxdWVzdCh7Li4uaSxmZXRjaDp1LHNwZWM6eCxwYXRoTmFtZTpzLG1ldGhvZDpvLHBhcmFtZXRlcnM6JCxyZXF1ZXN0Q29udGVudFR5cGU6aixzY2hlbWU6QyxyZXNwb25zZUNvbnRlbnRUeXBlOkx9KX07ZnVuY3Rpb24gY2xlYXJSZXNwb25zZShzLG8pe3JldHVybnt0eXBlOkVvLHBheWxvYWQ6e3BhdGg6cyxtZXRob2Q6b319fWZ1bmN0aW9uIGNsZWFyUmVxdWVzdChzLG8pe3JldHVybnt0eXBlOndvLHBheWxvYWQ6e3BhdGg6cyxtZXRob2Q6b319fWZ1bmN0aW9uIHNldFNjaGVtZShzLG8saSl7cmV0dXJue3R5cGU6Q28scGF5bG9hZDp7c2NoZW1lOnMscGF0aDpvLG1ldGhvZDppfX19Y29uc3QgVG89e1twb106KHMsbyk9PiJzdHJpbmciPT10eXBlb2Ygby5wYXlsb2FkP3Muc2V0KCJzcGVjIixvLnBheWxvYWQpOnMsW2hvXToocyxvKT0+cy5zZXQoInVybCIsby5wYXlsb2FkKyIiKSxbZm9dOihzLG8pPT5zLnNldCgianNvbiIsZnJvbUpTT3JkZXJlZChvLnBheWxvYWQpKSxbT29dOihzLG8pPT5zLnNldEluKFsicmVzb2x2ZWQiXSxmcm9tSlNPcmRlcmVkKG8ucGF5bG9hZCkpLFtBb106KHMsbyk9Pntjb25zdHt2YWx1ZTppLHBhdGg6YX09by5wYXlsb2FkO3JldHVybiBzLnNldEluKFsicmVzb2x2ZWRTdWJ0cmVlcyIsLi4uYV0sZnJvbUpTT3JkZXJlZChpKSl9LFttb106KHMse3BheWxvYWQ6b30pPT57bGV0e3BhdGg6aSxwYXJhbU5hbWU6YSxwYXJhbUluOnUscGFyYW06Xyx2YWx1ZTp3LGlzWG1sOnh9PW8sQz1fP3BhcmFtVG9JZGVudGlmaWVyKF8pOmAke3V9LiR7YX1gO2NvbnN0IGo9eD8idmFsdWVfeG1sIjoidmFsdWUiO3JldHVybiBzLnNldEluKFsibWV0YSIsInBhdGhzIiwuLi5pLCJwYXJhbWV0ZXJzIixDLGpdLCgwLHplLmZyb21KUykodykpfSxbZ29dOihzLHtwYXlsb2FkOm99KT0+e2xldHtwYXRoTWV0aG9kOmkscGFyYW1OYW1lOmEscGFyYW1Jbjp1LGluY2x1ZGVFbXB0eVZhbHVlOl99PW87aWYoIWF8fCF1KXJldHVybiBjb25zb2xlLndhcm4oIldhcm5pbmc6IFVQREFURV9FTVBUWV9QQVJBTV9JTkNMVVNJT04gY291bGQgbm90IGdlbmVyYXRlIGEgcGFyYW1LZXkuIikscztjb25zdCB3PWAke3V9LiR7YX1gO3JldHVybiBzLnNldEluKFsibWV0YSIsInBhdGhzIiwuLi5pLCJwYXJhbWV0ZXJfaW5jbHVzaW9ucyIsd10sXyl9LFt5b106KHMse3BheWxvYWQ6e3BhdGhNZXRob2Q6byxpc09BUzM6aX19KT0+e2NvbnN0IGE9TnMocykuZ2V0SW4oWyJwYXRocyIsLi4ub10pLHU9cGFyYW1ldGVyVmFsdWVzKHMsbykudG9KUygpO3JldHVybiBzLnVwZGF0ZUluKFsibWV0YSIsInBhdGhzIiwuLi5vLCJwYXJhbWV0ZXJzIl0sKDAsemUuZnJvbUpTKSh7fSksKF89PmEuZ2V0KCJwYXJhbWV0ZXJzIiwoMCx6ZS5MaXN0KSgpKS5yZWR1Y2UoKChhLF8pPT57Y29uc3Qgdz1wYXJhbVRvVmFsdWUoXyx1KSx4PXBhcmFtZXRlckluY2x1c2lvblNldHRpbmdGb3IocyxvLF8uZ2V0KCJuYW1lIiksXy5nZXQoImluIikpLEM9KChzLG8se2lzT0FTMzppPSExLGJ5cGFzc1JlcXVpcmVkQ2hlY2s6YT0hMX09e30pPT57bGV0IHU9cy5nZXQoInJlcXVpcmVkIikse3NjaGVtYTpfLHBhcmFtZXRlckNvbnRlbnRNZWRpYVR5cGU6d309Z2V0UGFyYW1ldGVyU2NoZW1hKHMse2lzT0FTMzppfSk7cmV0dXJuIHZhbGlkYXRlVmFsdWVCeVNjaGVtYShvLF8sdSxhLHcsaSl9KShfLHcse2J5cGFzc1JlcXVpcmVkQ2hlY2s6eCxpc09BUzM6aX0pO3JldHVybiBhLnNldEluKFtwYXJhbVRvSWRlbnRpZmllcihfKSwiZXJyb3JzIl0sKDAsemUuZnJvbUpTKShDKSl9KSxfKSkpfSxbeG9dOihzLHtwYXlsb2FkOntwYXRoTWV0aG9kOm99fSk9PnMudXBkYXRlSW4oWyJtZXRhIiwicGF0aHMiLC4uLm8sInBhcmFtZXRlcnMiXSwoMCx6ZS5mcm9tSlMpKFtdKSwocz0+cy5tYXAoKHM9PnMuc2V0KCJlcnJvcnMiLCgwLHplLmZyb21KUykoW10pKSkpKSksW3ZvXToocyx7cGF5bG9hZDp7cmVzOm8scGF0aDppLG1ldGhvZDphfX0pPT57bGV0IHU7dT1vLmVycm9yP09iamVjdC5hc3NpZ24oe2Vycm9yOiEwLG5hbWU6by5lcnIubmFtZSxtZXNzYWdlOm8uZXJyLm1lc3NhZ2Usc3RhdHVzQ29kZTpvLmVyci5zdGF0dXNDb2RlfSxvLmVyci5yZXNwb25zZSk6byx1LmhlYWRlcnM9dS5oZWFkZXJzfHx7fTtsZXQgXz1zLnNldEluKFsicmVzcG9uc2VzIixpLGFdLGZyb21KU09yZGVyZWQodSkpO3JldHVybiBsdC5CbG9iJiZ1LmRhdGEgaW5zdGFuY2VvZiBsdC5CbG9iJiYoXz1fLnNldEluKFsicmVzcG9uc2VzIixpLGEsInRleHQiXSx1LmRhdGEpKSxffSxbYm9dOihzLHtwYXlsb2FkOntyZXE6byxwYXRoOmksbWV0aG9kOmF9fSk9PnMuc2V0SW4oWyJyZXF1ZXN0cyIsaSxhXSxmcm9tSlNPcmRlcmVkKG8pKSxbU29dOihzLHtwYXlsb2FkOntyZXE6byxwYXRoOmksbWV0aG9kOmF9fSk9PnMuc2V0SW4oWyJtdXRhdGVkUmVxdWVzdHMiLGksYV0sZnJvbUpTT3JkZXJlZChvKSksW2tvXToocyx7cGF5bG9hZDp7cGF0aDpvLHZhbHVlOmksa2V5OmF9fSk9PntsZXQgdT1bInBhdGhzIiwuLi5vXSxfPVsibWV0YSIsInBhdGhzIiwuLi5vXTtyZXR1cm4gcy5nZXRJbihbImpzb24iLC4uLnVdKXx8cy5nZXRJbihbInJlc29sdmVkIiwuLi51XSl8fHMuZ2V0SW4oWyJyZXNvbHZlZFN1YnRyZWVzIiwuLi51XSk/cy5zZXRJbihbLi4uXyxhXSwoMCx6ZS5mcm9tSlMpKGkpKTpzfSxbRW9dOihzLHtwYXlsb2FkOntwYXRoOm8sbWV0aG9kOml9fSk9PnMuZGVsZXRlSW4oWyJyZXNwb25zZXMiLG8saV0pLFt3b106KHMse3BheWxvYWQ6e3BhdGg6byxtZXRob2Q6aX19KT0+cy5kZWxldGVJbihbInJlcXVlc3RzIixvLGldKSxbQ29dOihzLHtwYXlsb2FkOntzY2hlbWU6byxwYXRoOmksbWV0aG9kOmF9fSk9PmkmJmE/cy5zZXRJbihbInNjaGVtZSIsaSxhXSxvKTppfHxhP3ZvaWQgMDpzLnNldEluKFsic2NoZW1lIiwiX2RlZmF1bHRTY2hlbWUiXSxvKX0sd3JhcF9hY3Rpb25zX3VwZGF0ZVNwZWM9KHMse3NwZWNBY3Rpb25zOm99KT0+KC4uLmkpPT57cyguLi5pKSxvLnBhcnNlVG9Kc29uKC4uLmkpfSx3cmFwX2FjdGlvbnNfdXBkYXRlSnNvblNwZWM9KHMse3NwZWNBY3Rpb25zOm99KT0+KC4uLmkpPT57cyguLi5pKSxvLmludmFsaWRhdGVSZXNvbHZlZFN1YnRyZWVDYWNoZSgpO2NvbnN0W2FdPWksdT1DbigpKGEsWyJwYXRocyJdKXx8e307T2JqZWN0LmtleXModSkuZm9yRWFjaCgocz0+e2NvbnN0IGk9Q24oKSh1LFtzXSk7YXMoKShpKSYmaS4kcmVmJiZvLnJlcXVlc3RSZXNvbHZlZFN1YnRyZWUoWyJwYXRocyIsc10pfSkpLG8ucmVxdWVzdFJlc29sdmVkU3VidHJlZShbImNvbXBvbmVudHMiLCJzZWN1cml0eVNjaGVtZXMiXSl9LHdyYXBfYWN0aW9uc19leGVjdXRlUmVxdWVzdD0ocyx7c3BlY0FjdGlvbnM6b30pPT5pPT4oby5sb2dSZXF1ZXN0KGkpLHMoaSkpLHdyYXBfYWN0aW9uc192YWxpZGF0ZVBhcmFtcz0ocyx7c3BlY1NlbGVjdG9yczpvfSk9Pmk9PnMoaSxvLmlzT0FTMygpKSxwbHVnaW5zX3NwZWM9KCk9Pih7c3RhdGVQbHVnaW5zOntzcGVjOnt3cmFwQWN0aW9uczp7Li4uWX0scmVkdWNlcnM6ey4uLlRvfSxhY3Rpb25zOnsuLi56fSxzZWxlY3RvcnM6ey4uLlZ9fX19KTt2YXIgTm89ZnVuY3Rpb24oKXt2YXIgZXh0ZW5kU3RhdGljcz1mdW5jdGlvbihzLG8pe3JldHVybiBleHRlbmRTdGF0aWNzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihzLG8pe3MuX19wcm90b19fPW99fHxmdW5jdGlvbihzLG8pe2Zvcih2YXIgaSBpbiBvKW8uaGFzT3duUHJvcGVydHkoaSkmJihzW2ldPW9baV0pfSxleHRlbmRTdGF0aWNzKHMsbyl9O3JldHVybiBmdW5jdGlvbihzLG8pe2Z1bmN0aW9uIF9fKCl7dGhpcy5jb25zdHJ1Y3Rvcj1zfWV4dGVuZFN0YXRpY3MocyxvKSxzLnByb3RvdHlwZT1udWxsPT09bz9PYmplY3QuY3JlYXRlKG8pOihfXy5wcm90b3R5cGU9by5wcm90b3R5cGUsbmV3IF9fKX19KCksTW89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBtb2R1bGVfaGVscGVyc19oYXNPd25Qcm9wZXJ0eShzLG8pe3JldHVybiBNby5jYWxsKHMsbyl9ZnVuY3Rpb24gX29iamVjdEtleXMocyl7aWYoQXJyYXkuaXNBcnJheShzKSl7Zm9yKHZhciBvPW5ldyBBcnJheShzLmxlbmd0aCksaT0wO2k8by5sZW5ndGg7aSsrKW9baV09IiIraTtyZXR1cm4gb31pZihPYmplY3Qua2V5cylyZXR1cm4gT2JqZWN0LmtleXMocyk7dmFyIGE9W107Zm9yKHZhciB1IGluIHMpbW9kdWxlX2hlbHBlcnNfaGFzT3duUHJvcGVydHkocyx1KSYmYS5wdXNoKHUpO3JldHVybiBhfWZ1bmN0aW9uIF9kZWVwQ2xvbmUocyl7c3dpdGNoKHR5cGVvZiBzKXtjYXNlIm9iamVjdCI6cmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocykpO2Nhc2UidW5kZWZpbmVkIjpyZXR1cm4gbnVsbDtkZWZhdWx0OnJldHVybiBzfX1mdW5jdGlvbiBoZWxwZXJzX2lzSW50ZWdlcihzKXtmb3IodmFyIG8saT0wLGE9cy5sZW5ndGg7aTxhOyl7aWYoISgobz1zLmNoYXJDb2RlQXQoaSkpPj00OCYmbzw9NTcpKXJldHVybiExO2krK31yZXR1cm4hMH1mdW5jdGlvbiBlc2NhcGVQYXRoQ29tcG9uZW50KHMpe3JldHVybi0xPT09cy5pbmRleE9mKCIvIikmJi0xPT09cy5pbmRleE9mKCJ+Iik/czpzLnJlcGxhY2UoL34vZywifjAiKS5yZXBsYWNlKC9cLy9nLCJ+MSIpfWZ1bmN0aW9uIHVuZXNjYXBlUGF0aENvbXBvbmVudChzKXtyZXR1cm4gcy5yZXBsYWNlKC9+MS9nLCIvIikucmVwbGFjZSgvfjAvZywifiIpfWZ1bmN0aW9uIGhhc1VuZGVmaW5lZChzKXtpZih2b2lkIDA9PT1zKXJldHVybiEwO2lmKHMpaWYoQXJyYXkuaXNBcnJheShzKSl7Zm9yKHZhciBvPTAsaT1zLmxlbmd0aDtvPGk7bysrKWlmKGhhc1VuZGVmaW5lZChzW29dKSlyZXR1cm4hMH1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2Ygcylmb3IodmFyIGE9X29iamVjdEtleXMocyksdT1hLmxlbmd0aCxfPTA7Xzx1O18rKylpZihoYXNVbmRlZmluZWQoc1thW19dXSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gcGF0Y2hFcnJvck1lc3NhZ2VGb3JtYXR0ZXIocyxvKXt2YXIgaT1bc107Zm9yKHZhciBhIGluIG8pe3ZhciB1PSJvYmplY3QiPT10eXBlb2Ygb1thXT9KU09OLnN0cmluZ2lmeShvW2FdLG51bGwsMik6b1thXTt2b2lkIDAhPT11JiZpLnB1c2goYSsiOiAiK3UpfXJldHVybiBpLmpvaW4oIlxuIil9dmFyIFJvPWZ1bmN0aW9uKHMpe2Z1bmN0aW9uIFBhdGNoRXJyb3IobyxpLGEsdSxfKXt2YXIgdz10aGlzLmNvbnN0cnVjdG9yLHg9cy5jYWxsKHRoaXMscGF0Y2hFcnJvck1lc3NhZ2VGb3JtYXR0ZXIobyx7bmFtZTppLGluZGV4OmEsb3BlcmF0aW9uOnUsdHJlZTpffSkpfHx0aGlzO3JldHVybiB4Lm5hbWU9aSx4LmluZGV4PWEseC5vcGVyYXRpb249dSx4LnRyZWU9XyxPYmplY3Quc2V0UHJvdG90eXBlT2YoeCx3LnByb3RvdHlwZSkseC5tZXNzYWdlPXBhdGNoRXJyb3JNZXNzYWdlRm9ybWF0dGVyKG8se25hbWU6aSxpbmRleDphLG9wZXJhdGlvbjp1LHRyZWU6X30pLHh9cmV0dXJuIE5vKFBhdGNoRXJyb3IscyksUGF0Y2hFcnJvcn0oRXJyb3IpLERvPVJvLExvPV9kZWVwQ2xvbmUsRm89e2FkZDpmdW5jdGlvbihzLG8saSl7cmV0dXJuIHNbb109dGhpcy52YWx1ZSx7bmV3RG9jdW1lbnQ6aX19LHJlbW92ZTpmdW5jdGlvbihzLG8saSl7dmFyIGE9c1tvXTtyZXR1cm4gZGVsZXRlIHNbb10se25ld0RvY3VtZW50OmkscmVtb3ZlZDphfX0scmVwbGFjZTpmdW5jdGlvbihzLG8saSl7dmFyIGE9c1tvXTtyZXR1cm4gc1tvXT10aGlzLnZhbHVlLHtuZXdEb2N1bWVudDppLHJlbW92ZWQ6YX19LG1vdmU6ZnVuY3Rpb24ocyxvLGkpe3ZhciBhPWdldFZhbHVlQnlQb2ludGVyKGksdGhpcy5wYXRoKTthJiYoYT1fZGVlcENsb25lKGEpKTt2YXIgdT1hcHBseU9wZXJhdGlvbihpLHtvcDoicmVtb3ZlIixwYXRoOnRoaXMuZnJvbX0pLnJlbW92ZWQ7cmV0dXJuIGFwcGx5T3BlcmF0aW9uKGkse29wOiJhZGQiLHBhdGg6dGhpcy5wYXRoLHZhbHVlOnV9KSx7bmV3RG9jdW1lbnQ6aSxyZW1vdmVkOmF9fSxjb3B5OmZ1bmN0aW9uKHMsbyxpKXt2YXIgYT1nZXRWYWx1ZUJ5UG9pbnRlcihpLHRoaXMuZnJvbSk7cmV0dXJuIGFwcGx5T3BlcmF0aW9uKGkse29wOiJhZGQiLHBhdGg6dGhpcy5wYXRoLHZhbHVlOl9kZWVwQ2xvbmUoYSl9KSx7bmV3RG9jdW1lbnQ6aX19LHRlc3Q6ZnVuY3Rpb24ocyxvLGkpe3JldHVybntuZXdEb2N1bWVudDppLHRlc3Q6X2FyZUVxdWFscyhzW29dLHRoaXMudmFsdWUpfX0sX2dldDpmdW5jdGlvbihzLG8saSl7cmV0dXJuIHRoaXMudmFsdWU9c1tvXSx7bmV3RG9jdW1lbnQ6aX19fSxCbz17YWRkOmZ1bmN0aW9uKHMsbyxpKXtyZXR1cm4gaGVscGVyc19pc0ludGVnZXIobyk/cy5zcGxpY2UobywwLHRoaXMudmFsdWUpOnNbb109dGhpcy52YWx1ZSx7bmV3RG9jdW1lbnQ6aSxpbmRleDpvfX0scmVtb3ZlOmZ1bmN0aW9uKHMsbyxpKXtyZXR1cm57bmV3RG9jdW1lbnQ6aSxyZW1vdmVkOnMuc3BsaWNlKG8sMSlbMF19fSxyZXBsYWNlOmZ1bmN0aW9uKHMsbyxpKXt2YXIgYT1zW29dO3JldHVybiBzW29dPXRoaXMudmFsdWUse25ld0RvY3VtZW50OmkscmVtb3ZlZDphfX0sbW92ZTpGby5tb3ZlLGNvcHk6Rm8uY29weSx0ZXN0OkZvLnRlc3QsX2dldDpGby5fZ2V0fTtmdW5jdGlvbiBnZXRWYWx1ZUJ5UG9pbnRlcihzLG8pe2lmKCIiPT1vKXJldHVybiBzO3ZhciBpPXtvcDoiX2dldCIscGF0aDpvfTtyZXR1cm4gYXBwbHlPcGVyYXRpb24ocyxpKSxpLnZhbHVlfWZ1bmN0aW9uIGFwcGx5T3BlcmF0aW9uKHMsbyxpLGEsdSxfKXtpZih2b2lkIDA9PT1pJiYoaT0hMSksdm9pZCAwPT09YSYmKGE9ITApLHZvaWQgMD09PXUmJih1PSEwKSx2b2lkIDA9PT1fJiYoXz0wKSxpJiYoImZ1bmN0aW9uIj09dHlwZW9mIGk/aShvLDAscyxvLnBhdGgpOnZhbGlkYXRvcihvLDApKSwiIj09PW8ucGF0aCl7dmFyIHc9e25ld0RvY3VtZW50OnN9O2lmKCJhZGQiPT09by5vcClyZXR1cm4gdy5uZXdEb2N1bWVudD1vLnZhbHVlLHc7aWYoInJlcGxhY2UiPT09by5vcClyZXR1cm4gdy5uZXdEb2N1bWVudD1vLnZhbHVlLHcucmVtb3ZlZD1zLHc7aWYoIm1vdmUiPT09by5vcHx8ImNvcHkiPT09by5vcClyZXR1cm4gdy5uZXdEb2N1bWVudD1nZXRWYWx1ZUJ5UG9pbnRlcihzLG8uZnJvbSksIm1vdmUiPT09by5vcCYmKHcucmVtb3ZlZD1zKSx3O2lmKCJ0ZXN0Ij09PW8ub3Ape2lmKHcudGVzdD1fYXJlRXF1YWxzKHMsby52YWx1ZSksITE9PT13LnRlc3QpdGhyb3cgbmV3IERvKCJUZXN0IG9wZXJhdGlvbiBmYWlsZWQiLCJURVNUX09QRVJBVElPTl9GQUlMRUQiLF8sbyxzKTtyZXR1cm4gdy5uZXdEb2N1bWVudD1zLHd9aWYoInJlbW92ZSI9PT1vLm9wKXJldHVybiB3LnJlbW92ZWQ9cyx3Lm5ld0RvY3VtZW50PW51bGwsdztpZigiX2dldCI9PT1vLm9wKXJldHVybiBvLnZhbHVlPXMsdztpZihpKXRocm93IG5ldyBEbygiT3BlcmF0aW9uIGBvcGAgcHJvcGVydHkgaXMgbm90IG9uZSBvZiBvcGVyYXRpb25zIGRlZmluZWQgaW4gUkZDLTY5MDIiLCJPUEVSQVRJT05fT1BfSU5WQUxJRCIsXyxvLHMpO3JldHVybiB3fWF8fChzPV9kZWVwQ2xvbmUocykpO3ZhciB4PShvLnBhdGh8fCIiKS5zcGxpdCgiLyIpLEM9cyxqPTEsTD14Lmxlbmd0aCxCPXZvaWQgMCwkPXZvaWQgMCxVPXZvaWQgMDtmb3IoVT0iZnVuY3Rpb24iPT10eXBlb2YgaT9pOnZhbGlkYXRvcjs7KXtpZigoJD14W2pdKSYmLTEhPSQuaW5kZXhPZigifiIpJiYoJD11bmVzY2FwZVBhdGhDb21wb25lbnQoJCkpLHUmJigiX19wcm90b19fIj09JHx8InByb3RvdHlwZSI9PSQmJmo+MCYmImNvbnN0cnVjdG9yIj09eFtqLTFdKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJKU09OLVBhdGNoOiBtb2RpZnlpbmcgYF9fcHJvdG9fX2Agb3IgYGNvbnN0cnVjdG9yL3Byb3RvdHlwZWAgcHJvcCBpcyBiYW5uZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMsIGlmIHRoaXMgd2FzIG9uIHB1cnBvc2UsIHBsZWFzZSBzZXQgYGJhblByb3RvdHlwZU1vZGlmaWNhdGlvbnNgIGZsYWcgZmFsc2UgYW5kIHBhc3MgaXQgdG8gdGhpcyBmdW5jdGlvbi4gTW9yZSBpbmZvIGluIGZhc3QtanNvbi1wYXRjaCBSRUFETUUiKTtpZihpJiZ2b2lkIDA9PT1CJiYodm9pZCAwPT09Q1skXT9CPXguc2xpY2UoMCxqKS5qb2luKCIvIik6aj09TC0xJiYoQj1vLnBhdGgpLHZvaWQgMCE9PUImJlUobywwLHMsQikpLGorKyxBcnJheS5pc0FycmF5KEMpKXtpZigiLSI9PT0kKSQ9Qy5sZW5ndGg7ZWxzZXtpZihpJiYhaGVscGVyc19pc0ludGVnZXIoJCkpdGhyb3cgbmV3IERvKCJFeHBlY3RlZCBhbiB1bnNpZ25lZCBiYXNlLTEwIGludGVnZXIgdmFsdWUsIG1ha2luZyB0aGUgbmV3IHJlZmVyZW5jZWQgdmFsdWUgdGhlIGFycmF5IGVsZW1lbnQgd2l0aCB0aGUgemVyby1iYXNlZCBpbmRleCIsIk9QRVJBVElPTl9QQVRIX0lMTEVHQUxfQVJSQVlfSU5ERVgiLF8sbyxzKTtoZWxwZXJzX2lzSW50ZWdlcigkKSYmKCQ9fn4kKX1pZihqPj1MKXtpZihpJiYiYWRkIj09PW8ub3AmJiQ+Qy5sZW5ndGgpdGhyb3cgbmV3IERvKCJUaGUgc3BlY2lmaWVkIGluZGV4IE1VU1QgTk9UIGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSIsIk9QRVJBVElPTl9WQUxVRV9PVVRfT0ZfQk9VTkRTIixfLG8scyk7aWYoITE9PT0odz1Cb1tvLm9wXS5jYWxsKG8sQywkLHMpKS50ZXN0KXRocm93IG5ldyBEbygiVGVzdCBvcGVyYXRpb24gZmFpbGVkIiwiVEVTVF9PUEVSQVRJT05fRkFJTEVEIixfLG8scyk7cmV0dXJuIHd9fWVsc2UgaWYoaj49TCl7aWYoITE9PT0odz1Gb1tvLm9wXS5jYWxsKG8sQywkLHMpKS50ZXN0KXRocm93IG5ldyBEbygiVGVzdCBvcGVyYXRpb24gZmFpbGVkIiwiVEVTVF9PUEVSQVRJT05fRkFJTEVEIixfLG8scyk7cmV0dXJuIHd9aWYoQz1DWyRdLGkmJmo8TCYmKCFDfHwib2JqZWN0IiE9dHlwZW9mIEMpKXRocm93IG5ldyBEbygiQ2Fubm90IHBlcmZvcm0gb3BlcmF0aW9uIGF0IHRoZSBkZXNpcmVkIHBhdGgiLCJPUEVSQVRJT05fUEFUSF9VTlJFU09MVkFCTEUiLF8sbyxzKX19ZnVuY3Rpb24gYXBwbHlQYXRjaChzLG8saSxhLHUpe2lmKHZvaWQgMD09PWEmJihhPSEwKSx2b2lkIDA9PT11JiYodT0hMCksaSYmIUFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IERvKCJQYXRjaCBzZXF1ZW5jZSBtdXN0IGJlIGFuIGFycmF5IiwiU0VRVUVOQ0VfTk9UX0FOX0FSUkFZIik7YXx8KHM9X2RlZXBDbG9uZShzKSk7Zm9yKHZhciBfPW5ldyBBcnJheShvLmxlbmd0aCksdz0wLHg9by5sZW5ndGg7dzx4O3crKylfW3ddPWFwcGx5T3BlcmF0aW9uKHMsb1t3XSxpLCEwLHUsdykscz1fW3ddLm5ld0RvY3VtZW50O3JldHVybiBfLm5ld0RvY3VtZW50PXMsX31mdW5jdGlvbiBhcHBseVJlZHVjZXIocyxvLGkpe3ZhciBhPWFwcGx5T3BlcmF0aW9uKHMsbyk7aWYoITE9PT1hLnRlc3QpdGhyb3cgbmV3IERvKCJUZXN0IG9wZXJhdGlvbiBmYWlsZWQiLCJURVNUX09QRVJBVElPTl9GQUlMRUQiLGksbyxzKTtyZXR1cm4gYS5uZXdEb2N1bWVudH1mdW5jdGlvbiB2YWxpZGF0b3IocyxvLGksYSl7aWYoIm9iamVjdCIhPXR5cGVvZiBzfHxudWxsPT09c3x8QXJyYXkuaXNBcnJheShzKSl0aHJvdyBuZXcgRG8oIk9wZXJhdGlvbiBpcyBub3QgYW4gb2JqZWN0IiwiT1BFUkFUSU9OX05PVF9BTl9PQkpFQ1QiLG8scyxpKTtpZighRm9bcy5vcF0pdGhyb3cgbmV3IERvKCJPcGVyYXRpb24gYG9wYCBwcm9wZXJ0eSBpcyBub3Qgb25lIG9mIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiBSRkMtNjkwMiIsIk9QRVJBVElPTl9PUF9JTlZBTElEIixvLHMsaSk7aWYoInN0cmluZyIhPXR5cGVvZiBzLnBhdGgpdGhyb3cgbmV3IERvKCJPcGVyYXRpb24gYHBhdGhgIHByb3BlcnR5IGlzIG5vdCBhIHN0cmluZyIsIk9QRVJBVElPTl9QQVRIX0lOVkFMSUQiLG8scyxpKTtpZigwIT09cy5wYXRoLmluZGV4T2YoIi8iKSYmcy5wYXRoLmxlbmd0aD4wKXRocm93IG5ldyBEbygnT3BlcmF0aW9uIGBwYXRoYCBwcm9wZXJ0eSBtdXN0IHN0YXJ0IHdpdGggIi8iJywiT1BFUkFUSU9OX1BBVEhfSU5WQUxJRCIsbyxzLGkpO2lmKCgibW92ZSI9PT1zLm9wfHwiY29weSI9PT1zLm9wKSYmInN0cmluZyIhPXR5cGVvZiBzLmZyb20pdGhyb3cgbmV3IERvKCJPcGVyYXRpb24gYGZyb21gIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50IChhcHBsaWNhYmxlIGluIGBtb3ZlYCBhbmQgYGNvcHlgIG9wZXJhdGlvbnMpIiwiT1BFUkFUSU9OX0ZST01fUkVRVUlSRUQiLG8scyxpKTtpZigoImFkZCI9PT1zLm9wfHwicmVwbGFjZSI9PT1zLm9wfHwidGVzdCI9PT1zLm9wKSYmdm9pZCAwPT09cy52YWx1ZSl0aHJvdyBuZXcgRG8oIk9wZXJhdGlvbiBgdmFsdWVgIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50IChhcHBsaWNhYmxlIGluIGBhZGRgLCBgcmVwbGFjZWAgYW5kIGB0ZXN0YCBvcGVyYXRpb25zKSIsIk9QRVJBVElPTl9WQUxVRV9SRVFVSVJFRCIsbyxzLGkpO2lmKCgiYWRkIj09PXMub3B8fCJyZXBsYWNlIj09PXMub3B8fCJ0ZXN0Ij09PXMub3ApJiZoYXNVbmRlZmluZWQocy52YWx1ZSkpdGhyb3cgbmV3IERvKCJPcGVyYXRpb24gYHZhbHVlYCBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudCAoYXBwbGljYWJsZSBpbiBgYWRkYCwgYHJlcGxhY2VgIGFuZCBgdGVzdGAgb3BlcmF0aW9ucykiLCJPUEVSQVRJT05fVkFMVUVfQ0FOTk9UX0NPTlRBSU5fVU5ERUZJTkVEIixvLHMsaSk7aWYoaSlpZigiYWRkIj09cy5vcCl7dmFyIHU9cy5wYXRoLnNwbGl0KCIvIikubGVuZ3RoLF89YS5zcGxpdCgiLyIpLmxlbmd0aDtpZih1IT09XysxJiZ1IT09Xyl0aHJvdyBuZXcgRG8oIkNhbm5vdCBwZXJmb3JtIGFuIGBhZGRgIG9wZXJhdGlvbiBhdCB0aGUgZGVzaXJlZCBwYXRoIiwiT1BFUkFUSU9OX1BBVEhfQ0FOTk9UX0FERCIsbyxzLGkpfWVsc2UgaWYoInJlcGxhY2UiPT09cy5vcHx8InJlbW92ZSI9PT1zLm9wfHwiX2dldCI9PT1zLm9wKXtpZihzLnBhdGghPT1hKXRocm93IG5ldyBEbygiQ2Fubm90IHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBhdCBhIHBhdGggdGhhdCBkb2VzIG5vdCBleGlzdCIsIk9QRVJBVElPTl9QQVRIX1VOUkVTT0xWQUJMRSIsbyxzLGkpfWVsc2UgaWYoIm1vdmUiPT09cy5vcHx8ImNvcHkiPT09cy5vcCl7dmFyIHc9dmFsaWRhdGUoW3tvcDoiX2dldCIscGF0aDpzLmZyb20sdmFsdWU6dm9pZCAwfV0saSk7aWYodyYmIk9QRVJBVElPTl9QQVRIX1VOUkVTT0xWQUJMRSI9PT13Lm5hbWUpdGhyb3cgbmV3IERvKCJDYW5ub3QgcGVyZm9ybSB0aGUgb3BlcmF0aW9uIGZyb20gYSBwYXRoIHRoYXQgZG9lcyBub3QgZXhpc3QiLCJPUEVSQVRJT05fRlJPTV9VTlJFU09MVkFCTEUiLG8scyxpKX19ZnVuY3Rpb24gdmFsaWRhdGUocyxvLGkpe3RyeXtpZighQXJyYXkuaXNBcnJheShzKSl0aHJvdyBuZXcgRG8oIlBhdGNoIHNlcXVlbmNlIG11c3QgYmUgYW4gYXJyYXkiLCJTRVFVRU5DRV9OT1RfQU5fQVJSQVkiKTtpZihvKWFwcGx5UGF0Y2goX2RlZXBDbG9uZShvKSxfZGVlcENsb25lKHMpLGl8fCEwKTtlbHNle2k9aXx8dmFsaWRhdG9yO2Zvcih2YXIgYT0wO2E8cy5sZW5ndGg7YSsrKWkoc1thXSxhLG8sdm9pZCAwKX19Y2F0Y2gocyl7aWYocyBpbnN0YW5jZW9mIERvKXJldHVybiBzO3Rocm93IHN9fWZ1bmN0aW9uIF9hcmVFcXVhbHMocyxvKXtpZihzPT09bylyZXR1cm4hMDtpZihzJiZvJiYib2JqZWN0Ij09dHlwZW9mIHMmJiJvYmplY3QiPT10eXBlb2Ygbyl7dmFyIGksYSx1LF89QXJyYXkuaXNBcnJheShzKSx3PUFycmF5LmlzQXJyYXkobyk7aWYoXyYmdyl7aWYoKGE9cy5sZW5ndGgpIT1vLmxlbmd0aClyZXR1cm4hMTtmb3IoaT1hOzAhPWktLTspaWYoIV9hcmVFcXVhbHMoc1tpXSxvW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1pZihfIT13KXJldHVybiExO3ZhciB4PU9iamVjdC5rZXlzKHMpO2lmKChhPXgubGVuZ3RoKSE9PU9iamVjdC5rZXlzKG8pLmxlbmd0aClyZXR1cm4hMTtmb3IoaT1hOzAhPWktLTspaWYoIW8uaGFzT3duUHJvcGVydHkoeFtpXSkpcmV0dXJuITE7Zm9yKGk9YTswIT1pLS07KWlmKCFfYXJlRXF1YWxzKHNbdT14W2ldXSxvW3VdKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gcyE9cyYmbyE9b312YXIgJG89bmV3IFdlYWtNYXAscW89ZnVuY3Rpb24gcW8ocyl7dGhpcy5vYnNlcnZlcnM9bmV3IE1hcCx0aGlzLm9iaj1zfSxVbz1mdW5jdGlvbiBVbyhzLG8pe3RoaXMuY2FsbGJhY2s9cyx0aGlzLm9ic2VydmVyPW99O2Z1bmN0aW9uIHVub2JzZXJ2ZShzLG8pe28udW5vYnNlcnZlKCl9ZnVuY3Rpb24gb2JzZXJ2ZShzLG8pe3ZhciBpLGE9ZnVuY3Rpb24gZ2V0TWlycm9yKHMpe3JldHVybiAkby5nZXQocyl9KHMpO2lmKGEpe3ZhciB1PWZ1bmN0aW9uIGdldE9ic2VydmVyRnJvbU1pcnJvcihzLG8pe3JldHVybiBzLm9ic2VydmVycy5nZXQobyl9KGEsbyk7aT11JiZ1Lm9ic2VydmVyfWVsc2UgYT1uZXcgcW8ocyksJG8uc2V0KHMsYSk7aWYoaSlyZXR1cm4gaTtpZihpPXt9LGEudmFsdWU9X2RlZXBDbG9uZShzKSxvKXtpLmNhbGxiYWNrPW8saS5uZXh0PW51bGw7dmFyIGRpcnR5Q2hlY2s9ZnVuY3Rpb24oKXtnZW5lcmF0ZShpKX0sZmFzdENoZWNrPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGkubmV4dCksaS5uZXh0PXNldFRpbWVvdXQoZGlydHlDaGVjayl9OyJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGZhc3RDaGVjayksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixmYXN0Q2hlY2spLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGZhc3RDaGVjayksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZhc3RDaGVjayksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsZmFzdENoZWNrKSl9cmV0dXJuIGkucGF0Y2hlcz1bXSxpLm9iamVjdD1zLGkudW5vYnNlcnZlPWZ1bmN0aW9uKCl7Z2VuZXJhdGUoaSksY2xlYXJUaW1lb3V0KGkubmV4dCksZnVuY3Rpb24gcmVtb3ZlT2JzZXJ2ZXJGcm9tTWlycm9yKHMsbyl7cy5vYnNlcnZlcnMuZGVsZXRlKG8uY2FsbGJhY2spfShhLGkpLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGZhc3RDaGVjayksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleXVwIixmYXN0Q2hlY2spLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGZhc3RDaGVjayksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZhc3RDaGVjayksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsZmFzdENoZWNrKSl9LGEub2JzZXJ2ZXJzLnNldChvLG5ldyBVbyhvLGkpKSxpfWZ1bmN0aW9uIGdlbmVyYXRlKHMsbyl7dm9pZCAwPT09byYmKG89ITEpO3ZhciBpPSRvLmdldChzLm9iamVjdCk7X2dlbmVyYXRlKGkudmFsdWUscy5vYmplY3Qscy5wYXRjaGVzLCIiLG8pLHMucGF0Y2hlcy5sZW5ndGgmJmFwcGx5UGF0Y2goaS52YWx1ZSxzLnBhdGNoZXMpO3ZhciBhPXMucGF0Y2hlcztyZXR1cm4gYS5sZW5ndGg+MCYmKHMucGF0Y2hlcz1bXSxzLmNhbGxiYWNrJiZzLmNhbGxiYWNrKGEpKSxhfWZ1bmN0aW9uIF9nZW5lcmF0ZShzLG8saSxhLHUpe2lmKG8hPT1zKXsiZnVuY3Rpb24iPT10eXBlb2Ygby50b0pTT04mJihvPW8udG9KU09OKCkpO2Zvcih2YXIgXz1fb2JqZWN0S2V5cyhvKSx3PV9vYmplY3RLZXlzKHMpLHg9ITEsQz13Lmxlbmd0aC0xO0M+PTA7Qy0tKXt2YXIgaj1zW0I9d1tDXV07aWYoIW1vZHVsZV9oZWxwZXJzX2hhc093blByb3BlcnR5KG8sQil8fHZvaWQgMD09PW9bQl0mJnZvaWQgMCE9PWomJiExPT09QXJyYXkuaXNBcnJheShvKSlBcnJheS5pc0FycmF5KHMpPT09QXJyYXkuaXNBcnJheShvKT8odSYmaS5wdXNoKHtvcDoidGVzdCIscGF0aDphKyIvIitlc2NhcGVQYXRoQ29tcG9uZW50KEIpLHZhbHVlOl9kZWVwQ2xvbmUoail9KSxpLnB1c2goe29wOiJyZW1vdmUiLHBhdGg6YSsiLyIrZXNjYXBlUGF0aENvbXBvbmVudChCKX0pLHg9ITApOih1JiZpLnB1c2goe29wOiJ0ZXN0IixwYXRoOmEsdmFsdWU6c30pLGkucHVzaCh7b3A6InJlcGxhY2UiLHBhdGg6YSx2YWx1ZTpvfSksITApO2Vsc2V7dmFyIEw9b1tCXTsib2JqZWN0Ij09dHlwZW9mIGomJm51bGwhPWomJiJvYmplY3QiPT10eXBlb2YgTCYmbnVsbCE9TCYmQXJyYXkuaXNBcnJheShqKT09PUFycmF5LmlzQXJyYXkoTCk/X2dlbmVyYXRlKGosTCxpLGErIi8iK2VzY2FwZVBhdGhDb21wb25lbnQoQiksdSk6aiE9PUwmJih1JiZpLnB1c2goe29wOiJ0ZXN0IixwYXRoOmErIi8iK2VzY2FwZVBhdGhDb21wb25lbnQoQiksdmFsdWU6X2RlZXBDbG9uZShqKX0pLGkucHVzaCh7b3A6InJlcGxhY2UiLHBhdGg6YSsiLyIrZXNjYXBlUGF0aENvbXBvbmVudChCKSx2YWx1ZTpfZGVlcENsb25lKEwpfSkpfX1pZih4fHxfLmxlbmd0aCE9dy5sZW5ndGgpZm9yKEM9MDtDPF8ubGVuZ3RoO0MrKyl7dmFyIEI7bW9kdWxlX2hlbHBlcnNfaGFzT3duUHJvcGVydHkocyxCPV9bQ10pfHx2b2lkIDA9PT1vW0JdfHxpLnB1c2goe29wOiJhZGQiLHBhdGg6YSsiLyIrZXNjYXBlUGF0aENvbXBvbmVudChCKSx2YWx1ZTpfZGVlcENsb25lKG9bQl0pfSl9fX1mdW5jdGlvbiBjb21wYXJlKHMsbyxpKXt2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIGE9W107cmV0dXJuIF9nZW5lcmF0ZShzLG8sYSwiIixpKSxhfU9iamVjdC5hc3NpZ24oe30sWixlZSx7SnNvblBhdGNoRXJyb3I6Um8sZGVlcENsb25lOl9kZWVwQ2xvbmUsZXNjYXBlUGF0aENvbXBvbmVudCx1bmVzY2FwZVBhdGhDb21wb25lbnR9KTt2YXIgVm89X193ZWJwYWNrX3JlcXVpcmVfXygxNDc0NCksem89X193ZWJwYWNrX3JlcXVpcmVfXy5uKFZvKTtjb25zdCBXbz17YWRkOmZ1bmN0aW9uIGFkZChzLG8pe3JldHVybntvcDoiYWRkIixwYXRoOnMsdmFsdWU6b319LHJlcGxhY2UscmVtb3ZlOmZ1bmN0aW9uIHJlbW92ZShzKXtyZXR1cm57b3A6InJlbW92ZSIscGF0aDpzfX0sbWVyZ2U6ZnVuY3Rpb24gbGliX21lcmdlKHMsbyl7cmV0dXJue3R5cGU6Im11dGF0aW9uIixvcDoibWVyZ2UiLHBhdGg6cyx2YWx1ZTpvfX0sbWVyZ2VEZWVwOmZ1bmN0aW9uIG1lcmdlRGVlcChzLG8pe3JldHVybnt0eXBlOiJtdXRhdGlvbiIsb3A6Im1lcmdlRGVlcCIscGF0aDpzLHZhbHVlOm99fSxjb250ZXh0OmZ1bmN0aW9uIGNvbnRleHQocyxvKXtyZXR1cm57dHlwZToiY29udGV4dCIscGF0aDpzLHZhbHVlOm99fSxnZXRJbjpmdW5jdGlvbiBsaWJfZ2V0SW4ocyxvKXtyZXR1cm4gby5yZWR1Y2UoKChzLG8pPT52b2lkIDAhPT1vJiZzP3Nbb106cykscyl9LGFwcGx5UGF0Y2g6ZnVuY3Rpb24gbGliX2FwcGx5UGF0Y2gocyxvLGkpe2lmKGk9aXx8e30sIm1lcmdlIj09PShvPXsuLi5vLHBhdGg6by5wYXRoJiZub3JtYWxpemVKU09OUGF0aChvLnBhdGgpfSkub3Ape2NvbnN0IGk9Z2V0SW5CeUpzb25QYXRoKHMsby5wYXRoKTtPYmplY3QuYXNzaWduKGksby52YWx1ZSksYXBwbHlQYXRjaChzLFtyZXBsYWNlKG8ucGF0aCxpKV0pfWVsc2UgaWYoIm1lcmdlRGVlcCI9PT1vLm9wKXtjb25zdCBpPWdldEluQnlKc29uUGF0aChzLG8ucGF0aCksYT16bygpKGksby52YWx1ZSx7Y3VzdG9tTWVyZ2U6cz0+e2lmKCJlbnVtIj09PXMpcmV0dXJuKHMsbyk9PkFycmF5LmlzQXJyYXkocykmJkFycmF5LmlzQXJyYXkobyk/Wy4uLm5ldyBTZXQoWy4uLnMsLi4ub10pXTp6bygpKHMsbyl9fSk7cz1hcHBseVBhdGNoKHMsW3JlcGxhY2Uoby5wYXRoLGEpXSkubmV3RG9jdW1lbnR9ZWxzZSBpZigiYWRkIj09PW8ub3AmJiIiPT09by5wYXRoJiZsaWJfaXNPYmplY3Qoby52YWx1ZSkpe2FwcGx5UGF0Y2gocyxPYmplY3Qua2V5cyhvLnZhbHVlKS5yZWR1Y2UoKChzLGkpPT4ocy5wdXNoKHtvcDoiYWRkIixwYXRoOmAvJHtub3JtYWxpemVKU09OUGF0aChpKX1gLHZhbHVlOm8udmFsdWVbaV19KSxzKSksW10pKX1lbHNlIGlmKCJyZXBsYWNlIj09PW8ub3AmJiIiPT09by5wYXRoKXtsZXR7dmFsdWU6YX09bztpLmFsbG93TWV0YVBhdGNoZXMmJm8ubWV0YSYmaXNBZGRpdGl2ZU11dGF0aW9uKG8pJiYoQXJyYXkuaXNBcnJheShvLnZhbHVlKXx8bGliX2lzT2JqZWN0KG8udmFsdWUpKSYmKGE9ey4uLmEsLi4uby5tZXRhfSkscz1hfWVsc2UgaWYoYXBwbHlQYXRjaChzLFtvXSksaS5hbGxvd01ldGFQYXRjaGVzJiZvLm1ldGEmJmlzQWRkaXRpdmVNdXRhdGlvbihvKSYmKEFycmF5LmlzQXJyYXkoby52YWx1ZSl8fGxpYl9pc09iamVjdChvLnZhbHVlKSkpe2NvbnN0IGk9ey4uLmdldEluQnlKc29uUGF0aChzLG8ucGF0aCksLi4uby5tZXRhfTthcHBseVBhdGNoKHMsW3JlcGxhY2Uoby5wYXRoLGkpXSl9cmV0dXJuIHN9LHBhcmVudFBhdGhNYXRjaDpmdW5jdGlvbiBwYXJlbnRQYXRoTWF0Y2gocyxvKXtpZighQXJyYXkuaXNBcnJheShvKSlyZXR1cm4hMTtmb3IobGV0IGk9MCxhPW8ubGVuZ3RoO2k8YTtpKz0xKWlmKG9baV0hPT1zW2ldKXJldHVybiExO3JldHVybiEwfSxmbGF0dGVuLGZ1bGx5Tm9ybWFsaXplQXJyYXk6ZnVuY3Rpb24gZnVsbHlOb3JtYWxpemVBcnJheShzKXtyZXR1cm4gY2xlYW5BcnJheShmbGF0dGVuKGxpYl9ub3JtYWxpemVBcnJheShzKSkpfSxub3JtYWxpemVBcnJheTpsaWJfbm9ybWFsaXplQXJyYXksaXNQcm9taXNlOmZ1bmN0aW9uIGlzUHJvbWlzZShzKXtyZXR1cm4gbGliX2lzT2JqZWN0KHMpJiZsaWJfaXNGdW5jdGlvbihzLnRoZW4pfSxmb3JFYWNoTmV3OmZ1bmN0aW9uIGZvckVhY2hOZXcocyxvKXt0cnl7cmV0dXJuIGZvckVhY2hOZXdQYXRjaChzLGZvckVhY2gsbyl9Y2F0Y2gocyl7cmV0dXJuIHN9fSxmb3JFYWNoTmV3UHJpbWl0aXZlOmZ1bmN0aW9uIGZvckVhY2hOZXdQcmltaXRpdmUocyxvKXt0cnl7cmV0dXJuIGZvckVhY2hOZXdQYXRjaChzLGZvckVhY2hQcmltaXRpdmUsbyl9Y2F0Y2gocyl7cmV0dXJuIHN9fSxpc0pzb25QYXRjaCxpc0NvbnRleHRQYXRjaDpmdW5jdGlvbiBpc0NvbnRleHRQYXRjaChzKXtyZXR1cm4gaXNQYXRjaChzKSYmImNvbnRleHQiPT09cy50eXBlfSxpc1BhdGNoLGlzTXV0YXRpb24saXNBZGRpdGl2ZU11dGF0aW9uLGlzR2VuZXJhdG9yOmZ1bmN0aW9uIGlzR2VuZXJhdG9yKHMpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocyl9LGlzRnVuY3Rpb246bGliX2lzRnVuY3Rpb24saXNPYmplY3Q6bGliX2lzT2JqZWN0LGlzRXJyb3I6ZnVuY3Rpb24gbGliX2lzRXJyb3Iocyl7cmV0dXJuIHMgaW5zdGFuY2VvZiBFcnJvcn19O2Z1bmN0aW9uIG5vcm1hbGl6ZUpTT05QYXRoKHMpe3JldHVybiBBcnJheS5pc0FycmF5KHMpP3MubGVuZ3RoPDE/IiI6YC8ke3MubWFwKChzPT4ocysiIikucmVwbGFjZSgvfi9nLCJ+MCIpLnJlcGxhY2UoL1wvL2csIn4xIikpKS5qb2luKCIvIil9YDpzfWZ1bmN0aW9uIHJlcGxhY2UocyxvLGkpe3JldHVybntvcDoicmVwbGFjZSIscGF0aDpzLHZhbHVlOm8sbWV0YTppfX1mdW5jdGlvbiBmb3JFYWNoTmV3UGF0Y2gocyxvLGkpe3JldHVybiBjbGVhbkFycmF5KGZsYXR0ZW4ocy5maWx0ZXIoaXNBZGRpdGl2ZU11dGF0aW9uKS5tYXAoKHM9Pm8ocy52YWx1ZSxpLHMucGF0aCkpKXx8W10pKX1mdW5jdGlvbiBmb3JFYWNoUHJpbWl0aXZlKHMsbyxpKXtyZXR1cm4gaT1pfHxbXSxBcnJheS5pc0FycmF5KHMpP3MubWFwKCgocyxhKT0+Zm9yRWFjaFByaW1pdGl2ZShzLG8saS5jb25jYXQoYSkpKSk6bGliX2lzT2JqZWN0KHMpP09iamVjdC5rZXlzKHMpLm1hcCgoYT0+Zm9yRWFjaFByaW1pdGl2ZShzW2FdLG8saS5jb25jYXQoYSkpKSk6byhzLGlbaS5sZW5ndGgtMV0saSl9ZnVuY3Rpb24gZm9yRWFjaChzLG8saSl7bGV0IGE9W107aWYoKGk9aXx8W10pLmxlbmd0aD4wKXtjb25zdCB1PW8ocyxpW2kubGVuZ3RoLTFdLGkpO3UmJihhPWEuY29uY2F0KHUpKX1pZihBcnJheS5pc0FycmF5KHMpKXtjb25zdCB1PXMubWFwKCgocyxhKT0+Zm9yRWFjaChzLG8saS5jb25jYXQoYSkpKSk7dSYmKGE9YS5jb25jYXQodSkpfWVsc2UgaWYobGliX2lzT2JqZWN0KHMpKXtjb25zdCB1PU9iamVjdC5rZXlzKHMpLm1hcCgoYT0+Zm9yRWFjaChzW2FdLG8saS5jb25jYXQoYSkpKSk7dSYmKGE9YS5jb25jYXQodSkpfXJldHVybiBhPWZsYXR0ZW4oYSksYX1mdW5jdGlvbiBsaWJfbm9ybWFsaXplQXJyYXkocyl7cmV0dXJuIEFycmF5LmlzQXJyYXkocyk/czpbc119ZnVuY3Rpb24gZmxhdHRlbihzKXtyZXR1cm5bXS5jb25jYXQoLi4ucy5tYXAoKHM9PkFycmF5LmlzQXJyYXkocyk/ZmxhdHRlbihzKTpzKSkpfWZ1bmN0aW9uIGNsZWFuQXJyYXkocyl7cmV0dXJuIHMuZmlsdGVyKChzPT52b2lkIDAhPT1zKSl9ZnVuY3Rpb24gbGliX2lzT2JqZWN0KHMpe3JldHVybiBzJiYib2JqZWN0Ij09dHlwZW9mIHN9ZnVuY3Rpb24gbGliX2lzRnVuY3Rpb24ocyl7cmV0dXJuIHMmJiJmdW5jdGlvbiI9PXR5cGVvZiBzfWZ1bmN0aW9uIGlzSnNvblBhdGNoKHMpe2lmKGlzUGF0Y2gocykpe2NvbnN0e29wOm99PXM7cmV0dXJuImFkZCI9PT1vfHwicmVtb3ZlIj09PW98fCJyZXBsYWNlIj09PW99cmV0dXJuITF9ZnVuY3Rpb24gaXNNdXRhdGlvbihzKXtyZXR1cm4gaXNKc29uUGF0Y2gocyl8fGlzUGF0Y2gocykmJiJtdXRhdGlvbiI9PT1zLnR5cGV9ZnVuY3Rpb24gaXNBZGRpdGl2ZU11dGF0aW9uKHMpe3JldHVybiBpc011dGF0aW9uKHMpJiYoImFkZCI9PT1zLm9wfHwicmVwbGFjZSI9PT1zLm9wfHwibWVyZ2UiPT09cy5vcHx8Im1lcmdlRGVlcCI9PT1zLm9wKX1mdW5jdGlvbiBpc1BhdGNoKHMpe3JldHVybiBzJiYib2JqZWN0Ij09dHlwZW9mIHN9ZnVuY3Rpb24gZ2V0SW5CeUpzb25QYXRoKHMsbyl7dHJ5e3JldHVybiBnZXRWYWx1ZUJ5UG9pbnRlcihzLG8pfWNhdGNoKHMpe3JldHVybiBjb25zb2xlLmVycm9yKHMpLHt9fX12YXIgSm89X193ZWJwYWNrX3JlcXVpcmVfXyg0ODY3NSk7Y29uc3QgSG89Y2xhc3MgQXBpRE9NQWdncmVnYXRlRXJyb3IgZXh0ZW5kcyBKb3tjb25zdHJ1Y3RvcihzLG8saSl7aWYoc3VwZXIocyxvLGkpLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsInN0cmluZyI9PXR5cGVvZiBvJiYodGhpcy5tZXNzYWdlPW8pLCJmdW5jdGlvbiI9PXR5cGVvZiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpOnRoaXMuc3RhY2s9bmV3IEVycm9yKG8pLnN0YWNrLG51bGwhPWkmJiJvYmplY3QiPT10eXBlb2YgaSYmT2JqZWN0Lmhhc093bihpLCJjYXVzZSIpJiYhKCJjYXVzZSJpbiB0aGlzKSl7Y29uc3R7Y2F1c2U6c309aTt0aGlzLmNhdXNlPXMscyBpbnN0YW5jZW9mIEVycm9yJiYic3RhY2siaW4gcyYmKHRoaXMuc3RhY2s9YCR7dGhpcy5zdGFja31cbkNBVVNFOiAke3Muc3RhY2t9YCl9fX07Y2xhc3MgQXBpRE9NRXJyb3IgZXh0ZW5kcyBFcnJvcntzdGF0aWNbU3ltYm9sLmhhc0luc3RhbmNlXShzKXtyZXR1cm4gc3VwZXJbU3ltYm9sLmhhc0luc3RhbmNlXShzKXx8RnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0uY2FsbChIbyxzKX1jb25zdHJ1Y3RvcihzLG8pe2lmKHN1cGVyKHMsbyksdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSwic3RyaW5nIj09dHlwZW9mIHMmJih0aGlzLm1lc3NhZ2U9cyksImZ1bmN0aW9uIj09dHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcik6dGhpcy5zdGFjaz1uZXcgRXJyb3Iocykuc3RhY2ssbnVsbCE9byYmIm9iamVjdCI9PXR5cGVvZiBvJiZPYmplY3QuaGFzT3duKG8sImNhdXNlIikmJiEoImNhdXNlImluIHRoaXMpKXtjb25zdHtjYXVzZTpzfT1vO3RoaXMuY2F1c2U9cyxzIGluc3RhbmNlb2YgRXJyb3ImJiJzdGFjayJpbiBzJiYodGhpcy5zdGFjaz1gJHt0aGlzLnN0YWNrfVxuQ0FVU0U6ICR7cy5zdGFja31gKX19fWNvbnN0IEtvPUFwaURPTUVycm9yO2NvbnN0IEdvPWNsYXNzIEFwaURPTVN0cnVjdHVyZWRFcnJvciBleHRlbmRzIEtve2NvbnN0cnVjdG9yKHMsbyl7aWYoc3VwZXIocyxvKSxudWxsIT1vJiYib2JqZWN0Ij09dHlwZW9mIG8pe2NvbnN0e2NhdXNlOnMsLi4uaX09bztPYmplY3QuYXNzaWduKHRoaXMsaSl9fX07ZnVuY3Rpb24gX2FyaXR5KHMsbyl7c3dpdGNoKHMpe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKHMsaSl7cmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHMsaSxhKXtyZXR1cm4gby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Nhc2UgNDpyZXR1cm4gZnVuY3Rpb24ocyxpLGEsdSl7cmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjYXNlIDU6cmV0dXJuIGZ1bmN0aW9uKHMsaSxhLHUsXyl7cmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjYXNlIDY6cmV0dXJuIGZ1bmN0aW9uKHMsaSxhLHUsXyx3KXtyZXR1cm4gby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Nhc2UgNzpyZXR1cm4gZnVuY3Rpb24ocyxpLGEsdSxfLHcseCl7cmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjYXNlIDg6cmV0dXJuIGZ1bmN0aW9uKHMsaSxhLHUsXyx3LHgsQyl7cmV0dXJuIG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfTtjYXNlIDk6cmV0dXJuIGZ1bmN0aW9uKHMsaSxhLHUsXyx3LHgsQyxqKXtyZXR1cm4gby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Nhc2UgMTA6cmV0dXJuIGZ1bmN0aW9uKHMsaSxhLHUsXyx3LHgsQyxqLEwpe3JldHVybiBvLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkZpcnN0IGFyZ3VtZW50IHRvIF9hcml0eSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgbm8gZ3JlYXRlciB0aGFuIHRlbiIpfX1mdW5jdGlvbiBfcGlwZShzLG8pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBvLmNhbGwodGhpcyxzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fWZ1bmN0aW9uIF9pc1BsYWNlaG9sZGVyKHMpe3JldHVybiBudWxsIT1zJiYib2JqZWN0Ij09dHlwZW9mIHMmJiEwPT09c1siQEBmdW5jdGlvbmFsL3BsYWNlaG9sZGVyIl19ZnVuY3Rpb24gX2N1cnJ5MShzKXtyZXR1cm4gZnVuY3Rpb24gZjEobyl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RofHxfaXNQbGFjZWhvbGRlcihvKT9mMTpzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gX2N1cnJ5MihzKXtyZXR1cm4gZnVuY3Rpb24gZjIobyxpKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBmMjtjYXNlIDE6cmV0dXJuIF9pc1BsYWNlaG9sZGVyKG8pP2YyOl9jdXJyeTEoKGZ1bmN0aW9uKGkpe3JldHVybiBzKG8saSl9KSk7ZGVmYXVsdDpyZXR1cm4gX2lzUGxhY2Vob2xkZXIobykmJl9pc1BsYWNlaG9sZGVyKGkpP2YyOl9pc1BsYWNlaG9sZGVyKG8pP19jdXJyeTEoKGZ1bmN0aW9uKG8pe3JldHVybiBzKG8saSl9KSk6X2lzUGxhY2Vob2xkZXIoaSk/X2N1cnJ5MSgoZnVuY3Rpb24oaSl7cmV0dXJuIHMobyxpKX0pKTpzKG8saSl9fX1mdW5jdGlvbiBfY3VycnkzKHMpe3JldHVybiBmdW5jdGlvbiBmMyhvLGksYSl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gZjM7Y2FzZSAxOnJldHVybiBfaXNQbGFjZWhvbGRlcihvKT9mMzpfY3VycnkyKChmdW5jdGlvbihpLGEpe3JldHVybiBzKG8saSxhKX0pKTtjYXNlIDI6cmV0dXJuIF9pc1BsYWNlaG9sZGVyKG8pJiZfaXNQbGFjZWhvbGRlcihpKT9mMzpfaXNQbGFjZWhvbGRlcihvKT9fY3VycnkyKChmdW5jdGlvbihvLGEpe3JldHVybiBzKG8saSxhKX0pKTpfaXNQbGFjZWhvbGRlcihpKT9fY3VycnkyKChmdW5jdGlvbihpLGEpe3JldHVybiBzKG8saSxhKX0pKTpfY3VycnkxKChmdW5jdGlvbihhKXtyZXR1cm4gcyhvLGksYSl9KSk7ZGVmYXVsdDpyZXR1cm4gX2lzUGxhY2Vob2xkZXIobykmJl9pc1BsYWNlaG9sZGVyKGkpJiZfaXNQbGFjZWhvbGRlcihhKT9mMzpfaXNQbGFjZWhvbGRlcihvKSYmX2lzUGxhY2Vob2xkZXIoaSk/X2N1cnJ5MigoZnVuY3Rpb24obyxpKXtyZXR1cm4gcyhvLGksYSl9KSk6X2lzUGxhY2Vob2xkZXIobykmJl9pc1BsYWNlaG9sZGVyKGEpP19jdXJyeTIoKGZ1bmN0aW9uKG8sYSl7cmV0dXJuIHMobyxpLGEpfSkpOl9pc1BsYWNlaG9sZGVyKGkpJiZfaXNQbGFjZWhvbGRlcihhKT9fY3VycnkyKChmdW5jdGlvbihpLGEpe3JldHVybiBzKG8saSxhKX0pKTpfaXNQbGFjZWhvbGRlcihvKT9fY3VycnkxKChmdW5jdGlvbihvKXtyZXR1cm4gcyhvLGksYSl9KSk6X2lzUGxhY2Vob2xkZXIoaSk/X2N1cnJ5MSgoZnVuY3Rpb24oaSl7cmV0dXJuIHMobyxpLGEpfSkpOl9pc1BsYWNlaG9sZGVyKGEpP19jdXJyeTEoKGZ1bmN0aW9uKGEpe3JldHVybiBzKG8saSxhKX0pKTpzKG8saSxhKX19fWNvbnN0IFlvPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uIF9pc0FycmF5KHMpe3JldHVybiBudWxsIT1zJiZzLmxlbmd0aD49MCYmIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKX07ZnVuY3Rpb24gX2lzU3RyaW5nKHMpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHMpfWNvbnN0IFhvPV9jdXJyeTEoKGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHMpe3JldHVybiEhWW8ocyl8fCEhcyYmKCJvYmplY3QiPT10eXBlb2YgcyYmKCFfaXNTdHJpbmcocykmJigwPT09cy5sZW5ndGh8fHMubGVuZ3RoPjAmJihzLmhhc093blByb3BlcnR5KDApJiZzLmhhc093blByb3BlcnR5KHMubGVuZ3RoLTEpKSkpKX0pKTt2YXIgUW89InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2w/U3ltYm9sLml0ZXJhdG9yOiJAQGl0ZXJhdG9yIjtmdW5jdGlvbiBfY3JlYXRlUmVkdWNlKHMsbyxpKXtyZXR1cm4gZnVuY3Rpb24gX3JlZHVjZShhLHUsXyl7aWYoWG8oXykpcmV0dXJuIHMoYSx1LF8pO2lmKG51bGw9PV8pcmV0dXJuIHU7aWYoImZ1bmN0aW9uIj09dHlwZW9mIF9bImZhbnRhc3ktbGFuZC9yZWR1Y2UiXSlyZXR1cm4gbyhhLHUsXywiZmFudGFzeS1sYW5kL3JlZHVjZSIpO2lmKG51bGwhPV9bUW9dKXJldHVybiBpKGEsdSxfW1FvXSgpKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgXy5uZXh0KXJldHVybiBpKGEsdSxfKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgXy5yZWR1Y2UpcmV0dXJuIG8oYSx1LF8sInJlZHVjZSIpO3Rocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZTogbGlzdCBtdXN0IGJlIGFycmF5IG9yIGl0ZXJhYmxlIil9fWZ1bmN0aW9uIF94QXJyYXlSZWR1Y2UocyxvLGkpe2Zvcih2YXIgYT0wLHU9aS5sZW5ndGg7YTx1Oyl7aWYoKG89c1siQEB0cmFuc2R1Y2VyL3N0ZXAiXShvLGlbYV0pKSYmb1siQEB0cmFuc2R1Y2VyL3JlZHVjZWQiXSl7bz1vWyJAQHRyYW5zZHVjZXIvdmFsdWUiXTticmVha31hKz0xfXJldHVybiBzWyJAQHRyYW5zZHVjZXIvcmVzdWx0Il0obyl9Y29uc3QgWm89X2N1cnJ5MigoZnVuY3Rpb24gYmluZChzLG8pe3JldHVybiBfYXJpdHkocy5sZW5ndGgsKGZ1bmN0aW9uKCl7cmV0dXJuIHMuYXBwbHkobyxhcmd1bWVudHMpfSkpfSkpO2Z1bmN0aW9uIF94SXRlcmFibGVSZWR1Y2UocyxvLGkpe2Zvcih2YXIgYT1pLm5leHQoKTshYS5kb25lOyl7aWYoKG89c1siQEB0cmFuc2R1Y2VyL3N0ZXAiXShvLGEudmFsdWUpKSYmb1siQEB0cmFuc2R1Y2VyL3JlZHVjZWQiXSl7bz1vWyJAQHRyYW5zZHVjZXIvdmFsdWUiXTticmVha31hPWkubmV4dCgpfXJldHVybiBzWyJAQHRyYW5zZHVjZXIvcmVzdWx0Il0obyl9ZnVuY3Rpb24gX3hNZXRob2RSZWR1Y2UocyxvLGksYSl7cmV0dXJuIHNbIkBAdHJhbnNkdWNlci9yZXN1bHQiXShpW2FdKFpvKHNbIkBAdHJhbnNkdWNlci9zdGVwIl0scyksbykpfWNvbnN0IF9pPV9jcmVhdGVSZWR1Y2UoX3hBcnJheVJlZHVjZSxfeE1ldGhvZFJlZHVjZSxfeEl0ZXJhYmxlUmVkdWNlKTt2YXIgRWk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBYV3JhcChzKXt0aGlzLmY9c31yZXR1cm4gWFdyYXAucHJvdG90eXBlWyJAQHRyYW5zZHVjZXIvaW5pdCJdPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJpbml0IG5vdCBpbXBsZW1lbnRlZCBvbiBYV3JhcCIpfSxYV3JhcC5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9yZXN1bHQiXT1mdW5jdGlvbihzKXtyZXR1cm4gc30sWFdyYXAucHJvdG90eXBlWyJAQHRyYW5zZHVjZXIvc3RlcCJdPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHRoaXMuZihzLG8pfSxYV3JhcH0oKTtmdW5jdGlvbiBfeHdyYXAocyl7cmV0dXJuIG5ldyBFaShzKX12YXIgT2k9X2N1cnJ5MygoZnVuY3Rpb24ocyxvLGkpe3JldHVybiBfaSgiZnVuY3Rpb24iPT10eXBlb2Ygcz9feHdyYXAocyk6cyxvLGkpfSkpO2NvbnN0IFBpPU9pO2Z1bmN0aW9uIF9jaGVja0Zvck1ldGhvZChzLG8pe3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg7aWYoMD09PWkpcmV0dXJuIG8oKTt2YXIgYT1hcmd1bWVudHNbaS0xXTtyZXR1cm4gWW8oYSl8fCJmdW5jdGlvbiIhPXR5cGVvZiBhW3NdP28uYXBwbHkodGhpcyxhcmd1bWVudHMpOmFbc10uYXBwbHkoYSxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCxpLTEpKX19dmFyIE1pPV9jdXJyeTMoX2NoZWNrRm9yTWV0aG9kKCJzbGljZSIsKGZ1bmN0aW9uIHNsaWNlKHMsbyxpKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaSxzLG8pfSkpKTtjb25zdCBSaT1NaTtjb25zdCBXaT1fY3VycnkxKF9jaGVja0Zvck1ldGhvZCgidGFpbCIsUmkoMSwxLzApKSk7ZnVuY3Rpb24gcGlwZSgpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigicGlwZSByZXF1aXJlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQiKTtyZXR1cm4gX2FyaXR5KGFyZ3VtZW50c1swXS5sZW5ndGgsUGkoX3BpcGUsYXJndW1lbnRzWzBdLFdpKGFyZ3VtZW50cykpKX1jb25zdCBlYT1fY3VycnkyKChmdW5jdGlvbiBkZWZhdWx0VG8ocyxvKXtyZXR1cm4gbnVsbD09b3x8byE9bz9zOm99KSkscmE9TnVtYmVyLmlzSW50ZWdlcnx8ZnVuY3Rpb24gX2lzSW50ZWdlcihzKXtyZXR1cm4oc3wwKT09PXN9O2Z1bmN0aW9uIF9udGgocyxvKXt2YXIgaT1zPDA/by5sZW5ndGgrczpzO3JldHVybiBfaXNTdHJpbmcobyk/by5jaGFyQXQoaSk6b1tpXX1jb25zdCBuYT1fY3VycnkyKChmdW5jdGlvbiBwcm9wKHMsbyl7aWYobnVsbCE9bylyZXR1cm4gcmEocyk/X250aChzLG8pOm9bc119KSk7Y29uc3QgaWE9X2N1cnJ5MygoZnVuY3Rpb24gcHJvcE9yKHMsbyxpKXtyZXR1cm4gZWEocyxuYShvLGkpKX0pKTt2YXIgYWE9X2N1cnJ5MSgoZnVuY3Rpb24ocyl7cmV0dXJuIF9udGgoLTEscyl9KSk7Y29uc3QgY2E9YWE7ZnVuY3Rpb24gX2N1cnJ5TihzLG8saSl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLHU9MCxfPXMsdz0wLHg9ITE7dzxvLmxlbmd0aHx8dTxhcmd1bWVudHMubGVuZ3RoOyl7dmFyIEM7dzxvLmxlbmd0aCYmKCFfaXNQbGFjZWhvbGRlcihvW3ddKXx8dT49YXJndW1lbnRzLmxlbmd0aCk/Qz1vW3ddOihDPWFyZ3VtZW50c1t1XSx1Kz0xKSxhW3ddPUMsX2lzUGxhY2Vob2xkZXIoQyk/eD0hMDpfLT0xLHcrPTF9cmV0dXJuIXgmJl88PTA/aS5hcHBseSh0aGlzLGEpOl9hcml0eShNYXRoLm1heCgwLF8pLF9jdXJyeU4ocyxhLGkpKX19Y29uc3QgbGE9X2N1cnJ5MigoZnVuY3Rpb24gY3VycnlOKHMsbyl7cmV0dXJuIDE9PT1zP19jdXJyeTEobyk6X2FyaXR5KHMsX2N1cnJ5TihzLFtdLG8pKX0pKTtjb25zdCB1YT1fY3VycnkxKChmdW5jdGlvbiBjdXJyeShzKXtyZXR1cm4gbGEocy5sZW5ndGgscyl9KSk7ZnVuY3Rpb24gX2lzRnVuY3Rpb24ocyl7dmFyIG89T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHMpO3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1vfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PT1vfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT09b3x8IltvYmplY3QgQXN5bmNHZW5lcmF0b3JGdW5jdGlvbl0iPT09b31mdW5jdGlvbiBfYXJyYXlGcm9tSXRlcmF0b3Iocyl7Zm9yKHZhciBvLGk9W107IShvPXMubmV4dCgpKS5kb25lOylpLnB1c2goby52YWx1ZSk7cmV0dXJuIGl9ZnVuY3Rpb24gX2luY2x1ZGVzV2l0aChzLG8saSl7Zm9yKHZhciBhPTAsdT1pLmxlbmd0aDthPHU7KXtpZihzKG8saVthXSkpcmV0dXJuITA7YSs9MX1yZXR1cm4hMX1mdW5jdGlvbiBfaGFzKHMsbyl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLHMpfWNvbnN0IGRhPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuaXM/T2JqZWN0LmlzOmZ1bmN0aW9uIF9vYmplY3RJcyhzLG8pe3JldHVybiBzPT09bz8wIT09c3x8MS9zPT0xL286cyE9cyYmbyE9b307dmFyIG1hPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7Y29uc3QgZ2E9ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBBcmd1bWVudHNdIj09PW1hLmNhbGwoYXJndW1lbnRzKT9mdW5jdGlvbiBfaXNBcmd1bWVudHMocyl7cmV0dXJuIltvYmplY3QgQXJndW1lbnRzXSI9PT1tYS5jYWxsKHMpfTpmdW5jdGlvbiBfaXNBcmd1bWVudHMocyl7cmV0dXJuIF9oYXMoImNhbGxlZSIscyl9fSgpO3ZhciB5YT0he3RvU3RyaW5nOm51bGx9LnByb3BlcnR5SXNFbnVtZXJhYmxlKCJ0b1N0cmluZyIpLHZhPVsiY29uc3RydWN0b3IiLCJ2YWx1ZU9mIiwiaXNQcm90b3R5cGVPZiIsInRvU3RyaW5nIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJoYXNPd25Qcm9wZXJ0eSIsInRvTG9jYWxlU3RyaW5nIl0sYmE9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKCJsZW5ndGgiKX0oKSxfYT1mdW5jdGlvbiBjb250YWlucyhzLG8pe2Zvcih2YXIgaT0wO2k8cy5sZW5ndGg7KXtpZihzW2ldPT09bylyZXR1cm4hMDtpKz0xfXJldHVybiExfSxFYT0iZnVuY3Rpb24iIT10eXBlb2YgT2JqZWN0LmtleXN8fGJhP19jdXJyeTEoKGZ1bmN0aW9uIGtleXMocyl7aWYoT2JqZWN0KHMpIT09cylyZXR1cm5bXTt2YXIgbyxpLGE9W10sdT1iYSYmZ2Eocyk7Zm9yKG8gaW4gcykhX2hhcyhvLHMpfHx1JiYibGVuZ3RoIj09PW98fChhW2EubGVuZ3RoXT1vKTtpZih5YSlmb3IoaT12YS5sZW5ndGgtMTtpPj0wOylfaGFzKG89dmFbaV0scykmJiFfYShhLG8pJiYoYVthLmxlbmd0aF09byksaS09MTtyZXR1cm4gYX0pKTpfY3VycnkxKChmdW5jdGlvbiBrZXlzKHMpe3JldHVybiBPYmplY3QocykhPT1zP1tdOk9iamVjdC5rZXlzKHMpfSkpO2NvbnN0IHdhPUVhO2NvbnN0IHhhPV9jdXJyeTEoKGZ1bmN0aW9uIHR5cGUocyl7cmV0dXJuIG51bGw9PT1zPyJOdWxsIjp2b2lkIDA9PT1zPyJVbmRlZmluZWQiOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKS5zbGljZSg4LC0xKX0pKTtmdW5jdGlvbiBfdW5pcUNvbnRlbnRFcXVhbHMocyxvLGksYSl7dmFyIHU9X2FycmF5RnJvbUl0ZXJhdG9yKHMpO2Z1bmN0aW9uIGVxKHMsbyl7cmV0dXJuIF9lcXVhbHMocyxvLGkuc2xpY2UoKSxhLnNsaWNlKCkpfXJldHVybiFfaW5jbHVkZXNXaXRoKChmdW5jdGlvbihzLG8pe3JldHVybiFfaW5jbHVkZXNXaXRoKGVxLG8scyl9KSxfYXJyYXlGcm9tSXRlcmF0b3IobyksdSl9ZnVuY3Rpb24gX2VxdWFscyhzLG8saSxhKXtpZihkYShzLG8pKXJldHVybiEwO3ZhciB1PXhhKHMpO2lmKHUhPT14YShvKSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygc1siZmFudGFzeS1sYW5kL2VxdWFscyJdfHwiZnVuY3Rpb24iPT10eXBlb2Ygb1siZmFudGFzeS1sYW5kL2VxdWFscyJdKXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBzWyJmYW50YXN5LWxhbmQvZXF1YWxzIl0mJnNbImZhbnRhc3ktbGFuZC9lcXVhbHMiXShvKSYmImZ1bmN0aW9uIj09dHlwZW9mIG9bImZhbnRhc3ktbGFuZC9lcXVhbHMiXSYmb1siZmFudGFzeS1sYW5kL2VxdWFscyJdKHMpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBzLmVxdWFsc3x8ImZ1bmN0aW9uIj09dHlwZW9mIG8uZXF1YWxzKXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBzLmVxdWFscyYmcy5lcXVhbHMobykmJiJmdW5jdGlvbiI9PXR5cGVvZiBvLmVxdWFscyYmby5lcXVhbHMocyk7c3dpdGNoKHUpe2Nhc2UiQXJndW1lbnRzIjpjYXNlIkFycmF5IjpjYXNlIk9iamVjdCI6aWYoImZ1bmN0aW9uIj09dHlwZW9mIHMuY29uc3RydWN0b3ImJiJQcm9taXNlIj09PWZ1bmN0aW9uIF9mdW5jdGlvbk5hbWUocyl7dmFyIG89U3RyaW5nKHMpLm1hdGNoKC9eZnVuY3Rpb24gKFx3KikvKTtyZXR1cm4gbnVsbD09bz8iIjpvWzFdfShzLmNvbnN0cnVjdG9yKSlyZXR1cm4gcz09PW87YnJlYWs7Y2FzZSJCb29sZWFuIjpjYXNlIk51bWJlciI6Y2FzZSJTdHJpbmciOmlmKHR5cGVvZiBzIT10eXBlb2Ygb3x8IWRhKHMudmFsdWVPZigpLG8udmFsdWVPZigpKSlyZXR1cm4hMTticmVhaztjYXNlIkRhdGUiOmlmKCFkYShzLnZhbHVlT2YoKSxvLnZhbHVlT2YoKSkpcmV0dXJuITE7YnJlYWs7Y2FzZSJFcnJvciI6cmV0dXJuIHMubmFtZT09PW8ubmFtZSYmcy5tZXNzYWdlPT09by5tZXNzYWdlO2Nhc2UiUmVnRXhwIjppZihzLnNvdXJjZSE9PW8uc291cmNlfHxzLmdsb2JhbCE9PW8uZ2xvYmFsfHxzLmlnbm9yZUNhc2UhPT1vLmlnbm9yZUNhc2V8fHMubXVsdGlsaW5lIT09by5tdWx0aWxpbmV8fHMuc3RpY2t5IT09by5zdGlja3l8fHMudW5pY29kZSE9PW8udW5pY29kZSlyZXR1cm4hMX1mb3IodmFyIF89aS5sZW5ndGgtMTtfPj0wOyl7aWYoaVtfXT09PXMpcmV0dXJuIGFbX109PT1vO18tPTF9c3dpdGNoKHUpe2Nhc2UiTWFwIjpyZXR1cm4gcy5zaXplPT09by5zaXplJiZfdW5pcUNvbnRlbnRFcXVhbHMocy5lbnRyaWVzKCksby5lbnRyaWVzKCksaS5jb25jYXQoW3NdKSxhLmNvbmNhdChbb10pKTtjYXNlIlNldCI6cmV0dXJuIHMuc2l6ZT09PW8uc2l6ZSYmX3VuaXFDb250ZW50RXF1YWxzKHMudmFsdWVzKCksby52YWx1ZXMoKSxpLmNvbmNhdChbc10pLGEuY29uY2F0KFtvXSkpO2Nhc2UiQXJndW1lbnRzIjpjYXNlIkFycmF5IjpjYXNlIk9iamVjdCI6Y2FzZSJCb29sZWFuIjpjYXNlIk51bWJlciI6Y2FzZSJTdHJpbmciOmNhc2UiRGF0ZSI6Y2FzZSJFcnJvciI6Y2FzZSJSZWdFeHAiOmNhc2UiSW50OEFycmF5IjpjYXNlIlVpbnQ4QXJyYXkiOmNhc2UiVWludDhDbGFtcGVkQXJyYXkiOmNhc2UiSW50MTZBcnJheSI6Y2FzZSJVaW50MTZBcnJheSI6Y2FzZSJJbnQzMkFycmF5IjpjYXNlIlVpbnQzMkFycmF5IjpjYXNlIkZsb2F0MzJBcnJheSI6Y2FzZSJGbG9hdDY0QXJyYXkiOmNhc2UiQXJyYXlCdWZmZXIiOmJyZWFrO2RlZmF1bHQ6cmV0dXJuITF9dmFyIHc9d2Eocyk7aWYody5sZW5ndGghPT13YShvKS5sZW5ndGgpcmV0dXJuITE7dmFyIHg9aS5jb25jYXQoW3NdKSxDPWEuY29uY2F0KFtvXSk7Zm9yKF89dy5sZW5ndGgtMTtfPj0wOyl7dmFyIGo9d1tfXTtpZighX2hhcyhqLG8pfHwhX2VxdWFscyhvW2pdLHNbal0seCxDKSlyZXR1cm4hMTtfLT0xfXJldHVybiEwfWNvbnN0IGthPV9jdXJyeTIoKGZ1bmN0aW9uIGVxdWFscyhzLG8pe3JldHVybiBfZXF1YWxzKHMsbyxbXSxbXSl9KSk7ZnVuY3Rpb24gX2luY2x1ZGVzKHMsbyl7cmV0dXJuIGZ1bmN0aW9uIF9pbmRleE9mKHMsbyxpKXt2YXIgYSx1O2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBzLmluZGV4T2Ypc3dpdGNoKHR5cGVvZiBvKXtjYXNlIm51bWJlciI6aWYoMD09PW8pe2ZvcihhPTEvbztpPHMubGVuZ3RoOyl7aWYoMD09PSh1PXNbaV0pJiYxL3U9PT1hKXJldHVybiBpO2krPTF9cmV0dXJuLTF9aWYobyE9byl7Zm9yKDtpPHMubGVuZ3RoOyl7aWYoIm51bWJlciI9PXR5cGVvZih1PXNbaV0pJiZ1IT11KXJldHVybiBpO2krPTF9cmV0dXJuLTF9cmV0dXJuIHMuaW5kZXhPZihvLGkpO2Nhc2Uic3RyaW5nIjpjYXNlImJvb2xlYW4iOmNhc2UiZnVuY3Rpb24iOmNhc2UidW5kZWZpbmVkIjpyZXR1cm4gcy5pbmRleE9mKG8saSk7Y2FzZSJvYmplY3QiOmlmKG51bGw9PT1vKXJldHVybiBzLmluZGV4T2YobyxpKX1mb3IoO2k8cy5sZW5ndGg7KXtpZihrYShzW2ldLG8pKXJldHVybiBpO2krPTF9cmV0dXJuLTF9KG8scywwKT49MH1mdW5jdGlvbiBfbWFwKHMsbyl7Zm9yKHZhciBpPTAsYT1vLmxlbmd0aCx1PUFycmF5KGEpO2k8YTspdVtpXT1zKG9baV0pLGkrPTE7cmV0dXJuIHV9ZnVuY3Rpb24gX3F1b3RlKHMpe3JldHVybiciJytzLnJlcGxhY2UoL1xcL2csIlxcXFwiKS5yZXBsYWNlKC9bXGJdL2csIlxcYiIpLnJlcGxhY2UoL1xmL2csIlxcZiIpLnJlcGxhY2UoL1xuL2csIlxcbiIpLnJlcGxhY2UoL1xyL2csIlxcciIpLnJlcGxhY2UoL1x0L2csIlxcdCIpLnJlcGxhY2UoL1x2L2csIlxcdiIpLnJlcGxhY2UoL1wwL2csIlxcMCIpLnJlcGxhY2UoLyIvZywnXFwiJykrJyInfXZhciBBYT1mdW5jdGlvbiBwYWQocyl7cmV0dXJuKHM8MTA/IjAiOiIiKStzfTtjb25zdCBDYT0iZnVuY3Rpb24iPT10eXBlb2YgRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24gX3RvSVNPU3RyaW5nKHMpe3JldHVybiBzLnRvSVNPU3RyaW5nKCl9OmZ1bmN0aW9uIF90b0lTT1N0cmluZyhzKXtyZXR1cm4gcy5nZXRVVENGdWxsWWVhcigpKyItIitBYShzLmdldFVUQ01vbnRoKCkrMSkrIi0iK0FhKHMuZ2V0VVRDRGF0ZSgpKSsiVCIrQWEocy5nZXRVVENIb3VycygpKSsiOiIrQWEocy5nZXRVVENNaW51dGVzKCkpKyI6IitBYShzLmdldFVUQ1NlY29uZHMoKSkrIi4iKyhzLmdldFVUQ01pbGxpc2Vjb25kcygpLzFlMykudG9GaXhlZCgzKS5zbGljZSgyLDUpKyJaIn07ZnVuY3Rpb24gX2NvbXBsZW1lbnQocyl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIXMuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBfYXJyYXlSZWR1Y2UocyxvLGkpe2Zvcih2YXIgYT0wLHU9aS5sZW5ndGg7YTx1OylvPXMobyxpW2FdKSxhKz0xO3JldHVybiBvfWZ1bmN0aW9uIF9kaXNwYXRjaGFibGUocyxvLGkpe3JldHVybiBmdW5jdGlvbigpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBpKCk7dmFyIGE9YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV07aWYoIVlvKGEpKXtmb3IodmFyIHU9MDt1PHMubGVuZ3RoOyl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGFbc1t1XV0pcmV0dXJuIGFbc1t1XV0uYXBwbHkoYSxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCwtMSkpO3UrPTF9aWYoZnVuY3Rpb24gX2lzVHJhbnNmb3JtZXIocyl7cmV0dXJuIG51bGwhPXMmJiJmdW5jdGlvbiI9PXR5cGVvZiBzWyJAQHRyYW5zZHVjZXIvc3RlcCJdfShhKSlyZXR1cm4gby5hcHBseShudWxsLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwLC0xKSkoYSl9cmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBfaXNPYmplY3Qocyl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocyl9Y29uc3QgX3hmQmFzZV9pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueGZbIkBAdHJhbnNkdWNlci9pbml0Il0oKX0sX3hmQmFzZV9yZXN1bHQ9ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMueGZbIkBAdHJhbnNkdWNlci9yZXN1bHQiXShzKX07dmFyIGphPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gWEZpbHRlcihzLG8pe3RoaXMueGY9byx0aGlzLmY9c31yZXR1cm4gWEZpbHRlci5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9pbml0Il09X3hmQmFzZV9pbml0LFhGaWx0ZXIucHJvdG90eXBlWyJAQHRyYW5zZHVjZXIvcmVzdWx0Il09X3hmQmFzZV9yZXN1bHQsWEZpbHRlci5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9zdGVwIl09ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdGhpcy5mKG8pP3RoaXMueGZbIkBAdHJhbnNkdWNlci9zdGVwIl0ocyxvKTpzfSxYRmlsdGVyfSgpO2Z1bmN0aW9uIF94ZmlsdGVyKHMpe3JldHVybiBmdW5jdGlvbihvKXtyZXR1cm4gbmV3IGphKHMsbyl9fXZhciBJYT1fY3VycnkyKF9kaXNwYXRjaGFibGUoWyJmYW50YXN5LWxhbmQvZmlsdGVyIiwiZmlsdGVyIl0sX3hmaWx0ZXIsKGZ1bmN0aW9uKHMsbyl7cmV0dXJuIF9pc09iamVjdChvKT9fYXJyYXlSZWR1Y2UoKGZ1bmN0aW9uKGksYSl7cmV0dXJuIHMob1thXSkmJihpW2FdPW9bYV0pLGl9KSx7fSx3YShvKSk6ZnVuY3Rpb24gX2ZpbHRlcihzLG8pe2Zvcih2YXIgaT0wLGE9by5sZW5ndGgsdT1bXTtpPGE7KXMob1tpXSkmJih1W3UubGVuZ3RoXT1vW2ldKSxpKz0xO3JldHVybiB1fShzLG8pfSkpKTtjb25zdCBOYT1JYTtjb25zdCBEYT1fY3VycnkyKChmdW5jdGlvbiByZWplY3QocyxvKXtyZXR1cm4gTmEoX2NvbXBsZW1lbnQocyksbyl9KSk7ZnVuY3Rpb24gX3RvU3RyaW5nX3RvU3RyaW5nKHMsbyl7dmFyIGk9ZnVuY3Rpb24gcmVjdXIoaSl7dmFyIGE9by5jb25jYXQoW3NdKTtyZXR1cm4gX2luY2x1ZGVzKGksYSk/IjxDaXJjdWxhcj4iOl90b1N0cmluZ190b1N0cmluZyhpLGEpfSxtYXBQYWlycz1mdW5jdGlvbihzLG8pe3JldHVybiBfbWFwKChmdW5jdGlvbihvKXtyZXR1cm4gX3F1b3RlKG8pKyI6ICIraShzW29dKX0pLG8uc2xpY2UoKS5zb3J0KCkpfTtzd2l0Y2goT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHMpKXtjYXNlIltvYmplY3QgQXJndW1lbnRzXSI6cmV0dXJuIihmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgiK19tYXAoaSxzKS5qb2luKCIsICIpKyIpKSI7Y2FzZSJbb2JqZWN0IEFycmF5XSI6cmV0dXJuIlsiK19tYXAoaSxzKS5jb25jYXQobWFwUGFpcnMocyxEYSgoZnVuY3Rpb24ocyl7cmV0dXJuL15cZCskLy50ZXN0KHMpfSksd2EocykpKSkuam9pbigiLCAiKSsiXSI7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHM/Im5ldyBCb29sZWFuKCIraShzLnZhbHVlT2YoKSkrIikiOnMudG9TdHJpbmcoKTtjYXNlIltvYmplY3QgRGF0ZV0iOnJldHVybiJuZXcgRGF0ZSgiKyhpc05hTihzLnZhbHVlT2YoKSk/aShOYU4pOl9xdW90ZShDYShzKSkpKyIpIjtjYXNlIltvYmplY3QgTWFwXSI6cmV0dXJuIm5ldyBNYXAoIitpKEFycmF5LmZyb20ocykpKyIpIjtjYXNlIltvYmplY3QgTnVsbF0iOnJldHVybiJudWxsIjtjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBzPyJuZXcgTnVtYmVyKCIraShzLnZhbHVlT2YoKSkrIikiOjEvcz09LTEvMD8iLTAiOnMudG9TdHJpbmcoMTApO2Nhc2UiW29iamVjdCBTZXRdIjpyZXR1cm4ibmV3IFNldCgiK2koQXJyYXkuZnJvbShzKS5zb3J0KCkpKyIpIjtjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBzPyJuZXcgU3RyaW5nKCIraShzLnZhbHVlT2YoKSkrIikiOl9xdW90ZShzKTtjYXNlIltvYmplY3QgVW5kZWZpbmVkXSI6cmV0dXJuInVuZGVmaW5lZCI7ZGVmYXVsdDppZigiZnVuY3Rpb24iPT10eXBlb2Ygcy50b1N0cmluZyl7dmFyIGE9cy50b1N0cmluZygpO2lmKCJbb2JqZWN0IE9iamVjdF0iIT09YSlyZXR1cm4gYX1yZXR1cm4ieyIrbWFwUGFpcnMocyx3YShzKSkuam9pbigiLCAiKSsifSJ9fWNvbnN0IExhPV9jdXJyeTEoKGZ1bmN0aW9uIHRvU3RyaW5nKHMpe3JldHVybiBfdG9TdHJpbmdfdG9TdHJpbmcocyxbXSl9KSk7Y29uc3QgRmE9X2N1cnJ5MigoZnVuY3Rpb24gaW52b2tlcihzLG8pe3JldHVybiBsYShzKzEsKGZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzW3NdO2lmKG51bGwhPWkmJl9pc0Z1bmN0aW9uKGlbb10pKXJldHVybiBpW29dLmFwcGx5KGksQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDAscykpO3Rocm93IG5ldyBUeXBlRXJyb3IoTGEoaSkrJyBkb2VzIG5vdCBoYXZlIGEgbWV0aG9kIG5hbWVkICInK28rJyInKX0pKX0pKTtjb25zdCBCYT1GYSgxLCJzcGxpdCIpO2Z1bmN0aW9uIGRyb3BMYXN0V2hpbGUocyxvKXtmb3IodmFyIGk9by5sZW5ndGgtMTtpPj0wJiZzKG9baV0pOylpLT0xO3JldHVybiBSaSgwLGkrMSxvKX12YXIgJGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBYRHJvcExhc3RXaGlsZShzLG8pe3RoaXMuZj1zLHRoaXMucmV0YWluZWQ9W10sdGhpcy54Zj1vfXJldHVybiBYRHJvcExhc3RXaGlsZS5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9pbml0Il09X3hmQmFzZV9pbml0LFhEcm9wTGFzdFdoaWxlLnByb3RvdHlwZVsiQEB0cmFuc2R1Y2VyL3Jlc3VsdCJdPWZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLnJldGFpbmVkPW51bGwsdGhpcy54ZlsiQEB0cmFuc2R1Y2VyL3Jlc3VsdCJdKHMpfSxYRHJvcExhc3RXaGlsZS5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9zdGVwIl09ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdGhpcy5mKG8pP3RoaXMucmV0YWluKHMsbyk6dGhpcy5mbHVzaChzLG8pfSxYRHJvcExhc3RXaGlsZS5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gcz1faSh0aGlzLnhmLHMsdGhpcy5yZXRhaW5lZCksdGhpcy5yZXRhaW5lZD1bXSx0aGlzLnhmWyJAQHRyYW5zZHVjZXIvc3RlcCJdKHMsbyl9LFhEcm9wTGFzdFdoaWxlLnByb3RvdHlwZS5yZXRhaW49ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdGhpcy5yZXRhaW5lZC5wdXNoKG8pLHN9LFhEcm9wTGFzdFdoaWxlfSgpO2Z1bmN0aW9uIF94ZHJvcExhc3RXaGlsZShzKXtyZXR1cm4gZnVuY3Rpb24obyl7cmV0dXJuIG5ldyAkYShzLG8pfX1jb25zdCB6YT1fY3VycnkyKF9kaXNwYXRjaGFibGUoW10sX3hkcm9wTGFzdFdoaWxlLGRyb3BMYXN0V2hpbGUpKTtjb25zdCBKYT1GYSgxLCJqb2luIik7Y29uc3QgSGE9X2N1cnJ5MSgoZnVuY3Rpb24gZmxpcChzKXtyZXR1cm4gbGEocy5sZW5ndGgsKGZ1bmN0aW9uKG8saSl7dmFyIGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiBhWzBdPWksYVsxXT1vLHMuYXBwbHkodGhpcyxhKX0pKX0pKShfY3VycnkyKF9pbmNsdWRlcykpO2NvbnN0IEdhPXVhKChmdW5jdGlvbihzLG8pe3JldHVybiBwaXBlKEJhKCIiKSx6YShIYShzKSksSmEoIiIpKShvKX0pKTtmdW5jdGlvbiBfaXRlcmFibGVSZWR1Y2UocyxvLGkpe2Zvcih2YXIgYT1pLm5leHQoKTshYS5kb25lOylvPXMobyxhLnZhbHVlKSxhPWkubmV4dCgpO3JldHVybiBvfWZ1bmN0aW9uIF9tZXRob2RSZWR1Y2UocyxvLGksYSl7cmV0dXJuIGlbYV0ocyxvKX1jb25zdCBlYz1fY3JlYXRlUmVkdWNlKF9hcnJheVJlZHVjZSxfbWV0aG9kUmVkdWNlLF9pdGVyYWJsZVJlZHVjZSk7dmFyIHJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gWE1hcChzLG8pe3RoaXMueGY9byx0aGlzLmY9c31yZXR1cm4gWE1hcC5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9pbml0Il09X3hmQmFzZV9pbml0LFhNYXAucHJvdG90eXBlWyJAQHRyYW5zZHVjZXIvcmVzdWx0Il09X3hmQmFzZV9yZXN1bHQsWE1hcC5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9zdGVwIl09ZnVuY3Rpb24ocyxvKXtyZXR1cm4gdGhpcy54ZlsiQEB0cmFuc2R1Y2VyL3N0ZXAiXShzLHRoaXMuZihvKSl9LFhNYXB9KCk7Y29uc3Qgc2M9X2N1cnJ5MihfZGlzcGF0Y2hhYmxlKFsiZmFudGFzeS1sYW5kL21hcCIsIm1hcCJdLChmdW5jdGlvbiBfeG1hcChzKXtyZXR1cm4gZnVuY3Rpb24obyl7cmV0dXJuIG5ldyByYyhzLG8pfX0pLChmdW5jdGlvbiBtYXAocyxvKXtzd2l0Y2goT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pKXtjYXNlIltvYmplY3QgRnVuY3Rpb25dIjpyZXR1cm4gbGEoby5sZW5ndGgsKGZ1bmN0aW9uKCl7cmV0dXJuIHMuY2FsbCh0aGlzLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pKTtjYXNlIltvYmplY3QgT2JqZWN0XSI6cmV0dXJuIF9hcnJheVJlZHVjZSgoZnVuY3Rpb24oaSxhKXtyZXR1cm4gaVthXT1zKG9bYV0pLGl9KSx7fSx3YShvKSk7ZGVmYXVsdDpyZXR1cm4gX21hcChzLG8pfX0pKSk7Y29uc3Qgb2M9X2N1cnJ5MigoZnVuY3Rpb24gYXAocyxvKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygb1siZmFudGFzeS1sYW5kL2FwIl0/b1siZmFudGFzeS1sYW5kL2FwIl0ocyk6ImZ1bmN0aW9uIj09dHlwZW9mIHMuYXA/cy5hcChvKToiZnVuY3Rpb24iPT10eXBlb2Ygcz9mdW5jdGlvbihpKXtyZXR1cm4gcyhpKShvKGkpKX06ZWMoKGZ1bmN0aW9uKHMsaSl7cmV0dXJuIGZ1bmN0aW9uIF9jb25jYXQocyxvKXt2YXIgaTtvPW98fFtdO3ZhciBhPShzPXN8fFtdKS5sZW5ndGgsdT1vLmxlbmd0aCxfPVtdO2ZvcihpPTA7aTxhOylfW18ubGVuZ3RoXT1zW2ldLGkrPTE7Zm9yKGk9MDtpPHU7KV9bXy5sZW5ndGhdPW9baV0saSs9MTtyZXR1cm4gX30ocyxzYyhpLG8pKX0pLFtdLHMpfSkpO2NvbnN0IGljPV9jdXJyeTIoKGZ1bmN0aW9uIGxpZnROKHMsbyl7dmFyIGk9bGEocyxvKTtyZXR1cm4gbGEocywoZnVuY3Rpb24oKXtyZXR1cm4gX2FycmF5UmVkdWNlKG9jLHNjKGksYXJndW1lbnRzWzBdKSxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpfSkpfSkpO2NvbnN0IGFjPV9jdXJyeTEoKGZ1bmN0aW9uIGxpZnQocyl7cmV0dXJuIGljKHMubGVuZ3RoLHMpfSkpO2NvbnN0IGNjPWFjKF9jdXJyeTEoKGZ1bmN0aW9uIG5vdChzKXtyZXR1cm4hc30pKSk7Y29uc3QgbGM9X2N1cnJ5MSgoZnVuY3Rpb24gYWx3YXlzKHMpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBzfX0pKTtjb25zdCBwYz1sYyh2b2lkIDApO2NvbnN0IGhjPWthKHBjKCkpO2NvbnN0IGRjPWNjKGhjKTtjb25zdCBmYz1fY3VycnkyKChmdW5jdGlvbiBtYXgocyxvKXtpZihzPT09bylyZXR1cm4gbztmdW5jdGlvbiBzYWZlTWF4KHMsbyl7aWYocz5vIT1vPnMpcmV0dXJuIG8+cz9vOnN9dmFyIGk9c2FmZU1heChzLG8pO2lmKHZvaWQgMCE9PWkpcmV0dXJuIGk7dmFyIGE9c2FmZU1heCh0eXBlb2Ygcyx0eXBlb2Ygbyk7aWYodm9pZCAwIT09YSlyZXR1cm4gYT09PXR5cGVvZiBzP3M6bzt2YXIgdT1MYShzKSxfPXNhZmVNYXgodSxMYShvKSk7cmV0dXJuIHZvaWQgMCE9PV8mJl89PT11P3M6b30pKTt2YXIgZ2M9X2N1cnJ5MigoZnVuY3Rpb24gcGx1Y2socyxvKXtyZXR1cm4gc2MobmEocyksbyl9KSk7Y29uc3QgYmM9Z2M7Y29uc3QgX2M9X2N1cnJ5MSgoZnVuY3Rpb24gYW55UGFzcyhzKXtyZXR1cm4gbGEoUGkoZmMsMCxiYygibGVuZ3RoIixzKSksKGZ1bmN0aW9uKCl7Zm9yKHZhciBvPTAsaT1zLmxlbmd0aDtvPGk7KXtpZihzW29dLmFwcGx5KHRoaXMsYXJndW1lbnRzKSlyZXR1cm4hMDtvKz0xfXJldHVybiExfSkpfSkpO3ZhciBpZGVudGljYWw9ZnVuY3Rpb24ocyxvKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBpZGVudGljYWw7Y2FzZSAxOnJldHVybiBmdW5jdGlvbiB1bmFyeUlkZW50aWNhbChvKXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dW5hcnlJZGVudGljYWw6ZGEocyxvKX07ZGVmYXVsdDpyZXR1cm4gZGEocyxvKX19O2NvbnN0IEVjPWlkZW50aWNhbDtjb25zdCBrYz1sYSgxLHBpcGUoeGEsRWMoIkdlbmVyYXRvckZ1bmN0aW9uIikpKTtjb25zdCBPYz1sYSgxLHBpcGUoeGEsRWMoIkFzeW5jRnVuY3Rpb24iKSkpO2NvbnN0IGpjPV9jKFtwaXBlKHhhLEVjKCJGdW5jdGlvbiIpKSxrYyxPY10pO3ZhciBQYz1fY3VycnkzKChmdW5jdGlvbiByZXBsYWNlKHMsbyxpKXtyZXR1cm4gaS5yZXBsYWNlKHMsbyl9KSk7Y29uc3QgSWM9UGM7Y29uc3QgTmM9bGEoMSxwaXBlKHhhLEVjKCJSZWdFeHAiKSkpO2NvbnN0IE1jPV9jdXJyeTMoKGZ1bmN0aW9uIHdoZW4ocyxvLGkpe3JldHVybiBzKGkpP28oaSk6aX0pKTtjb25zdCBSYz1sYSgxLHBpcGUoeGEsRWMoIlN0cmluZyIpKSk7Y29uc3QgTGM9TWMoUmMsSWMoL1suKis/XiR7fSgpfFtcXVxcLV0vZywiXFwkJiIpKTt2YXIgRmM9ZnVuY3Rpb24gY2hlY2tWYWx1ZShzLG8pe2lmKCJzdHJpbmciIT10eXBlb2YgcyYmIShzIGluc3RhbmNlb2YgU3RyaW5nKSl0aHJvdyBUeXBlRXJyb3IoImAiLmNvbmNhdChvLCJgIG11c3QgYmUgYSBzdHJpbmciKSl9O2NvbnN0IHFjPWZ1bmN0aW9uIHJlcGxhY2VBbGwocyxvLGkpeyFmdW5jdGlvbiBjaGVja0FyZ3VtZW50cyhzLG8saSl7aWYobnVsbD09aXx8bnVsbD09c3x8bnVsbD09byl0aHJvdyBUeXBlRXJyb3IoIklucHV0IHZhbHVlcyBtdXN0IG5vdCBiZSBgbnVsbGAgb3IgYHVuZGVmaW5lZGAiKX0ocyxvLGkpLEZjKGksInN0ciIpLEZjKG8sInJlcGxhY2VWYWx1ZSIpLGZ1bmN0aW9uIGNoZWNrU2VhcmNoVmFsdWUocyl7aWYoISgic3RyaW5nIj09dHlwZW9mIHN8fHMgaW5zdGFuY2VvZiBTdHJpbmd8fHMgaW5zdGFuY2VvZiBSZWdFeHApKXRocm93IFR5cGVFcnJvcigiYHNlYXJjaFZhbHVlYCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIHJlZ2V4cCIpfShzKTt2YXIgYT1uZXcgUmVnRXhwKE5jKHMpP3M6TGMocyksImciKTtyZXR1cm4gSWMoYSxvLGkpfTt2YXIgSmM9bGEoMyxxYyksSGM9RmEoMiwicmVwbGFjZUFsbCIpO2NvbnN0IEtjPWpjKFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCk/SGM6SmMsaXNXaW5kb3dzPSgpPT57dmFyIHMsbztyZXR1cm4vXndpbi8udGVzdChudWxsIT09KHM9bnVsbD09PShvPWdsb2JhbFRoaXMucHJvY2Vzcyl8fHZvaWQgMD09PW8/dm9pZCAwOm8ucGxhdGZvcm0pJiZ2b2lkIDAhPT1zP3M6IiIpfSxnZXRQcm90b2NvbD1zPT57dHJ5e2NvbnN0IG89bmV3IFVSTChzKTtyZXR1cm4gR2EoIjoiLG8ucHJvdG9jb2wpfWNhdGNoe3JldHVybn19LEdjPShwaXBlKGdldFByb3RvY29sLGRjKSxzPT57aWYodm9pZCAwIT09Z2xvYmFsVGhpcy53aW5kb3cpcmV0dXJuITE7Y29uc3Qgbz1nZXRQcm90b2NvbChzKTtyZXR1cm4gaGMobyl8fCJmaWxlIj09PW98fC9eW2EtekEtWl0kLy50ZXN0KG8pfSksaXNIdHRwVXJsPXM9Pntjb25zdCBvPWdldFByb3RvY29sKHMpO3JldHVybiJodHRwIj09PW98fCJodHRwcyI9PT1vfSx0b0ZpbGVTeXN0ZW1QYXRoPShzLG8pPT57Y29uc3QgaT1bLyUyMy9nLCIjIiwvJTI0L2csIiQiLC8lMjYvZywiJiIsLyUyQy9nLCIsIiwvJTQwL2csIkAiXSxhPWlhKCExLCJrZWVwRmlsZVByb3RvY29sIixvKSx1PWlhKGlzV2luZG93cywiaXNXaW5kb3dzIixvKTtsZXQgXz1kZWNvZGVVUkkocyk7Zm9yKGxldCBzPTA7czxpLmxlbmd0aDtzKz0yKV89Xy5yZXBsYWNlKGlbc10saVtzKzFdKTtsZXQgdz0iZmlsZTovLyI9PT1fLnN1YnN0cmluZygwLDcpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHcmJihfPSIvIj09PV9bN10/Xy5zdWJzdHJpbmcoOCk6Xy5zdWJzdHJpbmcoNyksdSgpJiYiLyI9PT1fWzFdJiYoXz1gJHtfWzBdfToke18uc3Vic3RyaW5nKDEpfWApLGE/Xz1gZmlsZTovLy8ke199YDoodz0hMSxfPXUoKT9fOmAvJHtffWApKSx1KCkmJiF3JiYoXz1LYygiLyIsIlxcIixfKSwiOlxcIj09PV8uc3Vic3RyaW5nKDEsMykmJihfPV9bMF0udG9VcHBlckNhc2UoKStfLnN1YnN0cmluZygxKSkpLF99LGdldEhhc2g9cz0+e2NvbnN0IG89cy5pbmRleE9mKCIjIik7cmV0dXJuLTEhPT1vP3Muc3Vic3RyaW5nKG8pOiIjIn0sc3RyaXBIYXNoPXM9Pntjb25zdCBvPXMuaW5kZXhPZigiIyIpO2xldCBpPXM7cmV0dXJuIG8+PTAmJihpPXMuc3Vic3RyaW5nKDAsbykpLGl9LHVybF9jd2Q9KCk9Pnt2YXIgcyxvO2lmKHZvaWQgMCE9PWdsb2JhbFRoaXMud2luZG93KXJldHVybiBzdHJpcEhhc2goZ2xvYmFsVGhpcy5sb2NhdGlvbi5ocmVmKTtjb25zdCBpPW51bGwhPT0ocz1udWxsPT09KG89Z2xvYmFsVGhpcy5wcm9jZXNzKXx8dm9pZCAwPT09bz92b2lkIDA6by5jd2QoKSkmJnZvaWQgMCE9PXM/czoiLyIsYT1jYShpKTtyZXR1cm5bIi8iLCJcXCJdLmluY2x1ZGVzKGEpP2k6aSsoaXNXaW5kb3dzKCk/IlxcIjoiLyIpfSxyZXNvbHZlPShzLG8pPT57Y29uc3QgaT1uZXcgVVJMKG8sbmV3IFVSTChzLCJyZXNvbHZlOi8vIikpO2lmKCJyZXNvbHZlOiI9PT1pLnByb3RvY29sKXtjb25zdHtwYXRobmFtZTpzLHNlYXJjaDpvLGhhc2g6YX09aTtyZXR1cm4gcytvK2F9cmV0dXJuIGkudG9TdHJpbmcoKX0sc2FuaXRpemU9cz0+e2lmKEdjKHMpKXJldHVybihzPT57Y29uc3Qgbz1bL1w/L2csIiUzRiIsLyMvZywiJTIzIl07bGV0IGk9cztpc1dpbmRvd3MoKSYmKGk9aS5yZXBsYWNlKC9cXC9nLCIvIikpLGk9ZW5jb2RlVVJJKGkpO2ZvcihsZXQgcz0wO3M8by5sZW5ndGg7cys9MilpPWkucmVwbGFjZShvW3NdLG9bcysxXSk7cmV0dXJuIGl9KSh0b0ZpbGVTeXN0ZW1QYXRoKHMpKTt0cnl7cmV0dXJuIG5ldyBVUkwocykudG9TdHJpbmcoKX1jYXRjaHtyZXR1cm4gZW5jb2RlVVJJKGRlY29kZVVSSShzKSkucmVwbGFjZSgvJTVCL2csIlsiKS5yZXBsYWNlKC8lNUQvZywiXSIpfX0sdW5zYW5pdGl6ZT1zPT5HYyhzKT90b0ZpbGVTeXN0ZW1QYXRoKHMpOmRlY29kZVVSSShzKSx7ZmV0Y2g6UWMsUmVzcG9uc2U6dGwsSGVhZGVyczpzbCxSZXF1ZXN0OnVsLEZvcm1EYXRhOnlsLEZpbGU6dmwsQmxvYjpTbH09Z2xvYmFsVGhpcztmdW5jdGlvbiBfYXJyYXlfbGlrZV90b19hcnJheShzLG8peyhudWxsPT1vfHxvPnMubGVuZ3RoKSYmKG89cy5sZW5ndGgpO2Zvcih2YXIgaT0wLGE9bmV3IEFycmF5KG8pO2k8bztpKyspYVtpXT1zW2ldO3JldHVybiBhfWZ1bmN0aW9uIGxlZ2FjeV9kZWZpbmVQcm9wZXJ0aWVzKHMsbyl7Zm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspe3ZhciBhPW9baV07YS5lbnVtZXJhYmxlPWEuZW51bWVyYWJsZXx8ITEsYS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGEmJihhLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkocyxhLmtleSxhKX19ZnVuY3Rpb24gX2luc3RhbmNlb2YocyxvKXtyZXR1cm4gbnVsbCE9byYmInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJm9bU3ltYm9sLmhhc0luc3RhbmNlXT8hIW9bU3ltYm9sLmhhc0luc3RhbmNlXShzKTpzIGluc3RhbmNlb2Ygb31mdW5jdGlvbiBfc2xpY2VkX3RvX2FycmF5KHMsbyl7cmV0dXJuIGZ1bmN0aW9uIF9hcnJheV93aXRoX2hvbGVzKHMpe2lmKEFycmF5LmlzQXJyYXkocykpcmV0dXJuIHN9KHMpfHxmdW5jdGlvbiBfaXRlcmFibGVfdG9fYXJyYXlfbGltaXQocyxvKXt2YXIgaT1udWxsPT1zP251bGw6InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJnNbU3ltYm9sLml0ZXJhdG9yXXx8c1siQEBpdGVyYXRvciJdO2lmKG51bGwhPWkpe3ZhciBhLHUsXz1bXSx3PSEwLHg9ITE7dHJ5e2ZvcihpPWkuY2FsbChzKTshKHc9KGE9aS5uZXh0KCkpLmRvbmUpJiYoXy5wdXNoKGEudmFsdWUpLCFvfHxfLmxlbmd0aCE9PW8pO3c9ITApO31jYXRjaChzKXt4PSEwLHU9c31maW5hbGx5e3RyeXt3fHxudWxsPT1pLnJldHVybnx8aS5yZXR1cm4oKX1maW5hbGx5e2lmKHgpdGhyb3cgdX19cmV0dXJuIF99fShzLG8pfHxmdW5jdGlvbiBfdW5zdXBwb3J0ZWRfaXRlcmFibGVfdG9fYXJyYXkocyxvKXtpZighcylyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiBzKXJldHVybiBfYXJyYXlfbGlrZV90b19hcnJheShzLG8pO3ZhciBpPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKS5zbGljZSg4LC0xKTsiT2JqZWN0Ij09PWkmJnMuY29uc3RydWN0b3ImJihpPXMuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1pfHwiU2V0Ij09PWkpcmV0dXJuIEFycmF5LmZyb20oaSk7aWYoIkFyZ3VtZW50cyI9PT1pfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChpKSlyZXR1cm4gX2FycmF5X2xpa2VfdG9fYXJyYXkocyxvKX0ocyxvKXx8ZnVuY3Rpb24gX25vbl9pdGVyYWJsZV9yZXN0KCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gX3R5cGVfb2Yocyl7cmV0dXJuIHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZzLmNvbnN0cnVjdG9yPT09U3ltYm9sPyJzeW1ib2wiOnR5cGVvZiBzfXZvaWQgMD09PWdsb2JhbFRoaXMuZmV0Y2gmJihnbG9iYWxUaGlzLmZldGNoPVFjKSx2b2lkIDA9PT1nbG9iYWxUaGlzLkhlYWRlcnMmJihnbG9iYWxUaGlzLkhlYWRlcnM9c2wpLHZvaWQgMD09PWdsb2JhbFRoaXMuUmVxdWVzdCYmKGdsb2JhbFRoaXMuUmVxdWVzdD11bCksdm9pZCAwPT09Z2xvYmFsVGhpcy5SZXNwb25zZSYmKGdsb2JhbFRoaXMuUmVzcG9uc2U9dGwpLHZvaWQgMD09PWdsb2JhbFRoaXMuRm9ybURhdGEmJihnbG9iYWxUaGlzLkZvcm1EYXRhPXlsKSx2b2lkIDA9PT1nbG9iYWxUaGlzLkZpbGUmJihnbG9iYWxUaGlzLkZpbGU9dmwpLHZvaWQgMD09PWdsb2JhbFRoaXMuQmxvYiYmKGdsb2JhbFRoaXMuQmxvYj1TbCk7dmFyIF9fdHlwZUVycm9yPWZ1bmN0aW9uKHMpe3Rocm93IFR5cGVFcnJvcihzKX0sX19hY2Nlc3NDaGVjaz1mdW5jdGlvbihzLG8saSl7cmV0dXJuIG8uaGFzKHMpfHxfX3R5cGVFcnJvcigiQ2Fubm90ICIraSl9LF9fcHJpdmF0ZUdldD1mdW5jdGlvbihzLG8saSl7cmV0dXJuIF9fYWNjZXNzQ2hlY2socyxvLCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZCIpLGk/aS5jYWxsKHMpOm8uZ2V0KHMpfSxfX3ByaXZhdGVBZGQ9ZnVuY3Rpb24ocyxvLGkpe3JldHVybiBvLmhhcyhzKT9fX3R5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpOl9pbnN0YW5jZW9mKG8sV2Vha1NldCk/by5hZGQocyk6by5zZXQocyxpKX0sX19wcml2YXRlU2V0PWZ1bmN0aW9uKHMsbyxpLGEpe3JldHVybiBfX2FjY2Vzc0NoZWNrKHMsbywid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZCIpLGE/YS5jYWxsKHMsaSk6by5zZXQocyxpKSxpfSx0b19zdHJpbmc9ZnVuY3Rpb24ocyl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKX0saXNfdHlwZWRfYXJyYXk9ZnVuY3Rpb24ocyl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhzKSYmIV9pbnN0YW5jZW9mKHMsRGF0YVZpZXcpfSxfbD1BcnJheS5pc0FycmF5LEVsPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isd2w9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSx4bD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGtsPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gb3duX2VudW1lcmFibGVfa2V5cyhzKXtmb3IodmFyIG89T2JqZWN0LmtleXMocyksaT14bChzKSxhPTA7YTxpLmxlbmd0aDthKyspd2wuY2FsbChzLGlbYV0pJiZvLnB1c2goaVthXSk7cmV0dXJuIG99ZnVuY3Rpb24gaXNfd3JpdGFibGUocyxvKXt2YXIgaTtyZXR1cm4hKG51bGw9PT0oaT1FbChzLG8pKXx8dm9pZCAwPT09aT92b2lkIDA6aS53cml0YWJsZSl9ZnVuY3Rpb24gbGVnYWN5X2NvcHkocyxvKXtpZigib2JqZWN0Ij09PSh2b2lkIDA9PT1zPyJ1bmRlZmluZWQiOl90eXBlX29mKHMpKSYmbnVsbCE9PXMpe3ZhciBpO2lmKF9sKHMpKWk9W107ZWxzZSBpZigiW29iamVjdCBEYXRlXSI9PT10b19zdHJpbmcocykpaT1uZXcgRGF0ZShzLmdldFRpbWU/cy5nZXRUaW1lKCk6cyk7ZWxzZSBpZihmdW5jdGlvbihzKXtyZXR1cm4iW29iamVjdCBSZWdFeHBdIj09PXRvX3N0cmluZyhzKX0ocykpaT1uZXcgUmVnRXhwKHMpO2Vsc2UgaWYoZnVuY3Rpb24ocyl7cmV0dXJuIltvYmplY3QgRXJyb3JdIj09PXRvX3N0cmluZyhzKX0ocykpaT17bWVzc2FnZTpzLm1lc3NhZ2V9O2Vsc2UgaWYoZnVuY3Rpb24ocyl7cmV0dXJuIltvYmplY3QgQm9vbGVhbl0iPT09dG9fc3RyaW5nKHMpfShzKXx8ZnVuY3Rpb24ocyl7cmV0dXJuIltvYmplY3QgTnVtYmVyXSI9PT10b19zdHJpbmcocyl9KHMpfHxmdW5jdGlvbihzKXtyZXR1cm4iW29iamVjdCBTdHJpbmddIj09PXRvX3N0cmluZyhzKX0ocykpaT1PYmplY3Qocyk7ZWxzZXtpZihpc190eXBlZF9hcnJheShzKSlyZXR1cm4gcy5zbGljZSgpO2k9T2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YocykpfXZhciBhPW8uaW5jbHVkZVN5bWJvbHM/b3duX2VudW1lcmFibGVfa2V5czpPYmplY3Qua2V5cyx1PSEwLF89ITEsdz12b2lkIDA7dHJ5e2Zvcih2YXIgeCxDPWEocylbU3ltYm9sLml0ZXJhdG9yXSgpOyEodT0oeD1DLm5leHQoKSkuZG9uZSk7dT0hMCl7dmFyIGo9eC52YWx1ZTtpW2pdPXNbal19fWNhdGNoKHMpe189ITAsdz1zfWZpbmFsbHl7dHJ5e3V8fG51bGw9PUMucmV0dXJufHxDLnJldHVybigpfWZpbmFsbHl7aWYoXyl0aHJvdyB3fX1yZXR1cm4gaX1yZXR1cm4gc312YXIgT2wsQWwsQ2w9e2luY2x1ZGVTeW1ib2xzOiExLGltbXV0YWJsZTohMX07ZnVuY3Rpb24gd2FsayhzLG8pe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpDbCxhPVtdLHU9W10sXz0hMCx3PWkuaW5jbHVkZVN5bWJvbHM/b3duX2VudW1lcmFibGVfa2V5czpPYmplY3Qua2V5cyx4PSEhaS5pbW11dGFibGU7cmV0dXJuIGZ1bmN0aW9uIHdhbGtlcihzKXt2YXIgQz14P2xlZ2FjeV9jb3B5KHMsaSk6cyxqPXt9LEw9ITAsQj17bm9kZTpDLG5vZGVfOnMscGF0aDpbXS5jb25jYXQoYSkscGFyZW50OnVbdS5sZW5ndGgtMV0scGFyZW50czp1LGtleTphW2EubGVuZ3RoLTFdLGlzUm9vdDowPT09YS5sZW5ndGgsbGV2ZWw6YS5sZW5ndGgsY2lyY3VsYXI6dm9pZCAwLGlzTGVhZjohMSxub3RMZWFmOiEwLG5vdFJvb3Q6ITAsaXNGaXJzdDohMSxpc0xhc3Q6ITEsdXBkYXRlOmZ1bmN0aW9uIHVwZGF0ZShzKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO0IuaXNSb290fHwoQi5wYXJlbnQubm9kZVtCLmtleV09cyksQi5ub2RlPXMsbyYmKEw9ITEpfSxkZWxldGU6ZnVuY3Rpb24gX2RlbGV0ZShzKXtkZWxldGUgQi5wYXJlbnQubm9kZVtCLmtleV0scyYmKEw9ITEpfSxyZW1vdmU6ZnVuY3Rpb24gcmVtb3ZlKHMpe19sKEIucGFyZW50Lm5vZGUpP0IucGFyZW50Lm5vZGUuc3BsaWNlKEIua2V5LDEpOmRlbGV0ZSBCLnBhcmVudC5ub2RlW0Iua2V5XSxzJiYoTD0hMSl9LGtleXM6bnVsbCxiZWZvcmU6ZnVuY3Rpb24gYmVmb3JlKHMpe2ouYmVmb3JlPXN9LGFmdGVyOmZ1bmN0aW9uIGFmdGVyKHMpe2ouYWZ0ZXI9c30scHJlOmZ1bmN0aW9uIHByZShzKXtqLnByZT1zfSxwb3N0OmZ1bmN0aW9uIHBvc3Qocyl7ai5wb3N0PXN9LHN0b3A6ZnVuY3Rpb24gc3RvcCgpe189ITF9LGJsb2NrOmZ1bmN0aW9uIGJsb2NrKCl7TD0hMX19O2lmKCFfKXJldHVybiBCO2Z1bmN0aW9uIHVwZGF0ZV9zdGF0ZSgpe2lmKCJvYmplY3QiPT09X3R5cGVfb2YoQi5ub2RlKSYmbnVsbCE9PUIubm9kZSl7Qi5rZXlzJiZCLm5vZGVfPT09Qi5ub2RlfHwoQi5rZXlzPXcoQi5ub2RlKSksQi5pc0xlYWY9MD09PUIua2V5cy5sZW5ndGg7Zm9yKHZhciBvPTA7bzx1Lmxlbmd0aDtvKyspaWYodVtvXS5ub2RlXz09PXMpe0IuY2lyY3VsYXI9dVtvXTticmVha319ZWxzZSBCLmlzTGVhZj0hMCxCLmtleXM9bnVsbDtCLm5vdExlYWY9IUIuaXNMZWFmLEIubm90Um9vdD0hQi5pc1Jvb3R9dXBkYXRlX3N0YXRlKCk7dmFyICQ9by5jYWxsKEIsQi5ub2RlKTtpZih2b2lkIDAhPT0kJiZCLnVwZGF0ZSYmQi51cGRhdGUoJCksai5iZWZvcmUmJmouYmVmb3JlLmNhbGwoQixCLm5vZGUpLCFMKXJldHVybiBCO2lmKCJvYmplY3QiPT09X3R5cGVfb2YoQi5ub2RlKSYmbnVsbCE9PUIubm9kZSYmIUIuY2lyY3VsYXIpe3ZhciBVO3UucHVzaChCKSx1cGRhdGVfc3RhdGUoKTt2YXIgVj0hMCx6PSExLFk9dm9pZCAwO3RyeXtmb3IodmFyIFosZWU9T2JqZWN0LmVudHJpZXMobnVsbCE9PShVPUIua2V5cykmJnZvaWQgMCE9PVU/VTpbXSlbU3ltYm9sLml0ZXJhdG9yXSgpOyEoVj0oWj1lZS5uZXh0KCkpLmRvbmUpO1Y9ITApe3ZhciBpZSxhZT1fc2xpY2VkX3RvX2FycmF5KFoudmFsdWUsMiksY2U9YWVbMF0sbGU9YWVbMV07YS5wdXNoKGxlKSxqLnByZSYmai5wcmUuY2FsbChCLEIubm9kZVtsZV0sbGUpO3ZhciBwZT13YWxrZXIoQi5ub2RlW2xlXSk7eCYma2wuY2FsbChCLm5vZGUsbGUpJiYhaXNfd3JpdGFibGUoQi5ub2RlLGxlKSYmKEIubm9kZVtsZV09cGUubm9kZSkscGUuaXNMYXN0PSEhKG51bGw9PT0oaWU9Qi5rZXlzKXx8dm9pZCAwPT09aWU/dm9pZCAwOmllLmxlbmd0aCkmJitjZT09Qi5rZXlzLmxlbmd0aC0xLHBlLmlzRmlyc3Q9MD09K2NlLGoucG9zdCYmai5wb3N0LmNhbGwoQixwZSksYS5wb3AoKX19Y2F0Y2gocyl7ej0hMCxZPXN9ZmluYWxseXt0cnl7Vnx8bnVsbD09ZWUucmV0dXJufHxlZS5yZXR1cm4oKX1maW5hbGx5e2lmKHopdGhyb3cgWX19dS5wb3AoKX1yZXR1cm4gai5hZnRlciYmai5hZnRlci5jYWxsKEIsQi5ub2RlKSxCfShzKS5ub2RlfXZhciBQbD1mdW5jdGlvbigpe2Z1bmN0aW9uIFRyYXZlcnNlKHMpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpDbDshZnVuY3Rpb24gX2NsYXNzX2NhbGxfY2hlY2socyxvKXtpZighKHMgaW5zdGFuY2VvZiBvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxUcmF2ZXJzZSksX19wcml2YXRlQWRkKHRoaXMsT2wpLF9fcHJpdmF0ZUFkZCh0aGlzLEFsKSxfX3ByaXZhdGVTZXQodGhpcyxPbCxzKSxfX3ByaXZhdGVTZXQodGhpcyxBbCxvKX1yZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZV9jbGFzcyhzLG8saSl7cmV0dXJuIG8mJmxlZ2FjeV9kZWZpbmVQcm9wZXJ0aWVzKHMucHJvdG90eXBlLG8pLGkmJmxlZ2FjeV9kZWZpbmVQcm9wZXJ0aWVzKHMsaSksc30oVHJhdmVyc2UsW3trZXk6ImdldCIsdmFsdWU6ZnVuY3Rpb24gZ2V0KHMpe2Zvcih2YXIgbz1fX3ByaXZhdGVHZXQodGhpcyxPbCksaT0wO28mJmk8cy5sZW5ndGg7aSsrKXt2YXIgYT1zW2ldO2lmKCFrbC5jYWxsKG8sYSl8fCFfX3ByaXZhdGVHZXQodGhpcyxBbCkuaW5jbHVkZVN5bWJvbHMmJiJzeW1ib2wiPT09KHZvaWQgMD09PWE/InVuZGVmaW5lZCI6X3R5cGVfb2YoYSkpKXJldHVybjtvPW9bYV19cmV0dXJuIG99fSx7a2V5OiJoYXMiLHZhbHVlOmZ1bmN0aW9uIGhhcyhzKXtmb3IodmFyIG89X19wcml2YXRlR2V0KHRoaXMsT2wpLGk9MDtvJiZpPHMubGVuZ3RoO2krKyl7dmFyIGE9c1tpXTtpZigha2wuY2FsbChvLGEpfHwhX19wcml2YXRlR2V0KHRoaXMsQWwpLmluY2x1ZGVTeW1ib2xzJiYic3ltYm9sIj09PSh2b2lkIDA9PT1hPyJ1bmRlZmluZWQiOl90eXBlX29mKGEpKSlyZXR1cm4hMTtvPW9bYV19cmV0dXJuITB9fSx7a2V5OiJzZXQiLHZhbHVlOmZ1bmN0aW9uIHNldChzLG8pe3ZhciBpPV9fcHJpdmF0ZUdldCh0aGlzLE9sKSxhPTA7Zm9yKGE9MDthPHMubGVuZ3RoLTE7YSsrKXt2YXIgdT1zW2FdO2tsLmNhbGwoaSx1KXx8KGlbdV09e30pLGk9aVt1XX1yZXR1cm4gaVtzW2FdXT1vLG99fSx7a2V5OiJtYXAiLHZhbHVlOmZ1bmN0aW9uIG1hcChzKXtyZXR1cm4gd2FsayhfX3ByaXZhdGVHZXQodGhpcyxPbCkscyx7aW1tdXRhYmxlOiEwLGluY2x1ZGVTeW1ib2xzOiEhX19wcml2YXRlR2V0KHRoaXMsQWwpLmluY2x1ZGVTeW1ib2xzfSl9fSx7a2V5OiJmb3JFYWNoIix2YWx1ZTpmdW5jdGlvbiBmb3JFYWNoKHMpe3JldHVybiBfX3ByaXZhdGVTZXQodGhpcyxPbCx3YWxrKF9fcHJpdmF0ZUdldCh0aGlzLE9sKSxzLF9fcHJpdmF0ZUdldCh0aGlzLEFsKSkpLF9fcHJpdmF0ZUdldCh0aGlzLE9sKX19LHtrZXk6InJlZHVjZSIsdmFsdWU6ZnVuY3Rpb24gcmVkdWNlKHMsbyl7dmFyIGk9MT09PWFyZ3VtZW50cy5sZW5ndGgsYT1pP19fcHJpdmF0ZUdldCh0aGlzLE9sKTpvO3JldHVybiB0aGlzLmZvckVhY2goKGZ1bmN0aW9uKG8pe3RoaXMuaXNSb290JiZpfHwoYT1zLmNhbGwodGhpcyxhLG8pKX0pKSxhfX0se2tleToicGF0aHMiLHZhbHVlOmZ1bmN0aW9uIHBhdGhzKCl7dmFyIHM9W107cmV0dXJuIHRoaXMuZm9yRWFjaCgoZnVuY3Rpb24oKXtzLnB1c2godGhpcy5wYXRoKX0pKSxzfX0se2tleToibm9kZXMiLHZhbHVlOmZ1bmN0aW9uIG5vZGVzKCl7dmFyIHM9W107cmV0dXJuIHRoaXMuZm9yRWFjaCgoZnVuY3Rpb24oKXtzLnB1c2godGhpcy5ub2RlKX0pKSxzfX0se2tleToiY2xvbmUiLHZhbHVlOmZ1bmN0aW9uIGNsb25lKCl7dmFyIHM9W10sbz1bXSxpPV9fcHJpdmF0ZUdldCh0aGlzLEFsKTtyZXR1cm4gaXNfdHlwZWRfYXJyYXkoX19wcml2YXRlR2V0KHRoaXMsT2wpKT9fX3ByaXZhdGVHZXQodGhpcyxPbCkuc2xpY2UoKTpmdW5jdGlvbiBjbG9uZShhKXtmb3IodmFyIHU9MDt1PHMubGVuZ3RoO3UrKylpZihzW3VdPT09YSlyZXR1cm4gb1t1XTtpZigib2JqZWN0Ij09PSh2b2lkIDA9PT1hPyJ1bmRlZmluZWQiOl90eXBlX29mKGEpKSYmbnVsbCE9PWEpe3ZhciBfPWxlZ2FjeV9jb3B5KGEsaSk7cy5wdXNoKGEpLG8ucHVzaChfKTt2YXIgdz1pLmluY2x1ZGVTeW1ib2xzP293bl9lbnVtZXJhYmxlX2tleXM6T2JqZWN0LmtleXMseD0hMCxDPSExLGo9dm9pZCAwO3RyeXtmb3IodmFyIEwsQj13KGEpW1N5bWJvbC5pdGVyYXRvcl0oKTshKHg9KEw9Qi5uZXh0KCkpLmRvbmUpO3g9ITApe3ZhciAkPUwudmFsdWU7X1skXT1jbG9uZShhWyRdKX19Y2F0Y2gocyl7Qz0hMCxqPXN9ZmluYWxseXt0cnl7eHx8bnVsbD09Qi5yZXR1cm58fEIucmV0dXJuKCl9ZmluYWxseXtpZihDKXRocm93IGp9fXJldHVybiBzLnBvcCgpLG8ucG9wKCksX31yZXR1cm4gYX0oX19wcml2YXRlR2V0KHRoaXMsT2wpKX19XSksVHJhdmVyc2V9KCk7T2w9bmV3IFdlYWtNYXAsQWw9bmV3IFdlYWtNYXA7dmFyIHRyYXZlcnNlPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIG5ldyBQbChzLG8pfTt0cmF2ZXJzZS5nZXQ9ZnVuY3Rpb24ocyxvLGkpe3JldHVybiBuZXcgUGwocyxpKS5nZXQobyl9LHRyYXZlcnNlLnNldD1mdW5jdGlvbihzLG8saSxhKXtyZXR1cm4gbmV3IFBsKHMsYSkuc2V0KG8saSl9LHRyYXZlcnNlLmhhcz1mdW5jdGlvbihzLG8saSl7cmV0dXJuIG5ldyBQbChzLGkpLmhhcyhvKX0sdHJhdmVyc2UubWFwPWZ1bmN0aW9uKHMsbyxpKXtyZXR1cm4gbmV3IFBsKHMsaSkubWFwKG8pfSx0cmF2ZXJzZS5mb3JFYWNoPWZ1bmN0aW9uKHMsbyxpKXtyZXR1cm4gbmV3IFBsKHMsaSkuZm9yRWFjaChvKX0sdHJhdmVyc2UucmVkdWNlPWZ1bmN0aW9uKHMsbyxpLGEpe3JldHVybiBuZXcgUGwocyxhKS5yZWR1Y2UobyxpKX0sdHJhdmVyc2UucGF0aHM9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gbmV3IFBsKHMsbykucGF0aHMoKX0sdHJhdmVyc2Uubm9kZXM9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gbmV3IFBsKHMsbykubm9kZXMoKX0sdHJhdmVyc2UuY2xvbmU9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gbmV3IFBsKHMsbykuY2xvbmUoKX07dmFyIElsPXRyYXZlcnNlO2NvbnN0IFRsPSJhcHBsaWNhdGlvbi9qc29uLCBhcHBsaWNhdGlvbi95YW1sIixObD0iaHR0cHM6Ly9zd2FnZ2VyLmlvIixNbD1PYmplY3QuZnJlZXplKHt1cmw6Ii8ifSksUmw9M2UzLERsPVsicHJvcGVydGllcyJdLExsPVsicHJvcGVydGllcyJdLEZsPVsiZGVmaW5pdGlvbnMiLCJwYXJhbWV0ZXJzIiwicmVzcG9uc2VzIiwic2VjdXJpdHlEZWZpbml0aW9ucyIsImNvbXBvbmVudHMvc2NoZW1hcyIsImNvbXBvbmVudHMvcmVzcG9uc2VzIiwiY29tcG9uZW50cy9wYXJhbWV0ZXJzIiwiY29tcG9uZW50cy9zZWN1cml0eVNjaGVtZXMiXSxCbD1bInNjaGVtYS9leGFtcGxlIiwiaXRlbXMvZXhhbXBsZSJdO2Z1bmN0aW9uIGlzRnJlZWx5TmFtZWQocyl7Y29uc3Qgbz1zW3MubGVuZ3RoLTFdLGk9c1tzLmxlbmd0aC0yXSxhPXMuam9pbigiLyIpO3JldHVybiBEbC5pbmRleE9mKG8pPi0xJiYtMT09PUxsLmluZGV4T2YoaSl8fEZsLmluZGV4T2YoYSk+LTF8fEJsLnNvbWUoKHM9PmEuaW5kZXhPZihzKT4tMSkpfWZ1bmN0aW9uIGFic29sdXRpZnlQb2ludGVyKHMsbyl7Y29uc3RbaSxhXT1zLnNwbGl0KCIjIiksdT1udWxsIT1vP286IiIsXz1udWxsIT1pP2k6IiI7bGV0IHc7aWYoaXNIdHRwVXJsKHUpKXc9cmVzb2x2ZSh1LF8pO2Vsc2V7Y29uc3Qgcz1yZXNvbHZlKE5sLHUpLG89cmVzb2x2ZShzLF8pLnJlcGxhY2UoTmwsIiIpO3c9Xy5zdGFydHNXaXRoKCIvIik/bzpvLnN1YnN0cmluZygxKX1yZXR1cm4gYT9gJHt3fSMke2F9YDp3fWNvbnN0ICRsPS9eKFthLXpdKzpcL1wvfFwvXC8pL2k7Y2xhc3MgSlNPTlJlZkVycm9yIGV4dGVuZHMgR297fWNvbnN0IFVsPXt9LFZsPW5ldyBXZWFrTWFwLHpsPVtzPT4icGF0aHMiPT09c1swXSYmInJlc3BvbnNlcyI9PT1zWzNdJiYiZXhhbXBsZXMiPT09c1s1XSxzPT4icGF0aHMiPT09c1swXSYmInJlc3BvbnNlcyI9PT1zWzNdJiYiY29udGVudCI9PT1zWzVdJiYiZXhhbXBsZSI9PT1zWzddLHM9PiJwYXRocyI9PT1zWzBdJiYicmVzcG9uc2VzIj09PXNbM10mJiJjb250ZW50Ij09PXNbNV0mJiJleGFtcGxlcyI9PT1zWzddJiYidmFsdWUiPT09c1s5XSxzPT4icGF0aHMiPT09c1swXSYmInJlcXVlc3RCb2R5Ij09PXNbM10mJiJjb250ZW50Ij09PXNbNF0mJiJleGFtcGxlIj09PXNbNl0scz0+InBhdGhzIj09PXNbMF0mJiJyZXF1ZXN0Qm9keSI9PT1zWzNdJiYiY29udGVudCI9PT1zWzRdJiYiZXhhbXBsZXMiPT09c1s2XSYmInZhbHVlIj09PXNbOF0scz0+InBhdGhzIj09PXNbMF0mJiJwYXJhbWV0ZXJzIj09PXNbMl0mJiJleGFtcGxlIj09PXNbNF0scz0+InBhdGhzIj09PXNbMF0mJiJwYXJhbWV0ZXJzIj09PXNbM10mJiJleGFtcGxlIj09PXNbNV0scz0+InBhdGhzIj09PXNbMF0mJiJwYXJhbWV0ZXJzIj09PXNbMl0mJiJleGFtcGxlcyI9PT1zWzRdJiYidmFsdWUiPT09c1s2XSxzPT4icGF0aHMiPT09c1swXSYmInBhcmFtZXRlcnMiPT09c1szXSYmImV4YW1wbGVzIj09PXNbNV0mJiJ2YWx1ZSI9PT1zWzddLHM9PiJwYXRocyI9PT1zWzBdJiYicGFyYW1ldGVycyI9PT1zWzJdJiYiY29udGVudCI9PT1zWzRdJiYiZXhhbXBsZSI9PT1zWzZdLHM9PiJwYXRocyI9PT1zWzBdJiYicGFyYW1ldGVycyI9PT1zWzJdJiYiY29udGVudCI9PT1zWzRdJiYiZXhhbXBsZXMiPT09c1s2XSYmInZhbHVlIj09PXNbOF0scz0+InBhdGhzIj09PXNbMF0mJiJwYXJhbWV0ZXJzIj09PXNbM10mJiJjb250ZW50Ij09PXNbNF0mJiJleGFtcGxlIj09PXNbN10scz0+InBhdGhzIj09PXNbMF0mJiJwYXJhbWV0ZXJzIj09PXNbM10mJiJjb250ZW50Ij09PXNbNV0mJiJleGFtcGxlcyI9PT1zWzddJiYidmFsdWUiPT09c1s5XV0sV2w9e2tleToiJHJlZiIscGx1Z2luOihzLG8saSxhKT0+e2NvbnN0IHU9YS5nZXRJbnN0YW5jZSgpLF89aS5zbGljZSgwLC0xKTtpZihpc0ZyZWVseU5hbWVkKF8pfHwocz0+emwuc29tZSgobz0+byhzKSkpKShfKSlyZXR1cm47Y29uc3R7YmFzZURvYzp3fT1hLmdldENvbnRleHQoaSk7aWYoInN0cmluZyIhPXR5cGVvZiBzKXJldHVybiBuZXcgSlNPTlJlZkVycm9yKCIkcmVmOiBtdXN0IGJlIGEgc3RyaW5nIChKU09OLVJlZikiLHskcmVmOnMsYmFzZURvYzp3LGZ1bGxQYXRoOml9KTtjb25zdCB4PXJlZnNfc3BsaXQocyksQz14WzBdLGo9eFsxXXx8IiI7bGV0IEwsQiwkO3RyeXtMPXd8fEM/YWJzb2x1dGVpZnkoQyx3KTpudWxsfWNhdGNoKG8pe3JldHVybiB3cmFwRXJyb3Iobyx7cG9pbnRlcjpqLCRyZWY6cyxiYXNlUGF0aDpMLGZ1bGxQYXRoOml9KX1pZihmdW5jdGlvbiBwb2ludGVyQWxyZWFkeUluUGF0aChzLG8saSxhKXtsZXQgdT1WbC5nZXQoYSk7dXx8KHU9e30sVmwuc2V0KGEsdSkpO2NvbnN0IF89ZnVuY3Rpb24gYXJyYXlUb0pzb25Qb2ludGVyKHMpe2lmKDA9PT1zLmxlbmd0aClyZXR1cm4iIjtyZXR1cm5gLyR7cy5tYXAoZXNjYXBlSnNvblBvaW50ZXJUb2tlbikuam9pbigiLyIpfWB9KGkpLHc9YCR7b3x8IjxzcGVjbWFwLWJhc2U+In0jJHtzfWAseD1fLnJlcGxhY2UoL2FsbE9mXC9cZCtcLz8vZywiIiksQz1hLmNvbnRleHRUcmVlLmdldChbXSkuYmFzZURvYztpZihvPT09QyYmcG9pbnRlcklzQVBhcmVudCh4LHMpKXJldHVybiEwO2xldCBqPSIiO2NvbnN0IEw9aS5zb21lKChzPT4oaj1gJHtqfS8ke2VzY2FwZUpzb25Qb2ludGVyVG9rZW4ocyl9YCx1W2pdJiZ1W2pdLnNvbWUoKHM9PnBvaW50ZXJJc0FQYXJlbnQocyx3KXx8cG9pbnRlcklzQVBhcmVudCh3LHMpKSkpKSk7aWYoTClyZXR1cm4hMDtyZXR1cm4gdm9pZCh1W3hdPSh1W3hdfHxbXSkuY29uY2F0KHcpKX0oaixMLF8sYSkmJiF1LnVzZUNpcmN1bGFyU3RydWN0dXJlcyl7Y29uc3Qgbz1hYnNvbHV0aWZ5UG9pbnRlcihzLEwpO3JldHVybiBzPT09bz9udWxsOldvLnJlcGxhY2UoaSxvKX1pZihudWxsPT1MPygkPWpzb25Qb2ludGVyVG9BcnJheShqKSxCPWEuZ2V0KCQpLHZvaWQgMD09PUImJihCPW5ldyBKU09OUmVmRXJyb3IoYENvdWxkIG5vdCByZXNvbHZlIHJlZmVyZW5jZTogJHtzfWAse3BvaW50ZXI6aiwkcmVmOnMsYmFzZURvYzp3LGZ1bGxQYXRoOml9KSkpOihCPWV4dHJhY3RGcm9tRG9jKEwsaiksQj1udWxsIT1CLl9fdmFsdWU/Qi5fX3ZhbHVlOkIuY2F0Y2goKG89Pnt0aHJvdyB3cmFwRXJyb3Iobyx7cG9pbnRlcjpqLCRyZWY6cyxiYXNlRG9jOncsZnVsbFBhdGg6aX0pfSkpKSxCIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuW1dvLnJlbW92ZShpKSxCXTtjb25zdCBVPWFic29sdXRpZnlQb2ludGVyKHMsTCksVj1Xby5yZXBsYWNlKF8sQix7JCRyZWY6VX0pO2lmKEwmJkwhPT13KXJldHVybltWLFdvLmNvbnRleHQoXyx7YmFzZURvYzpMfSldO3RyeXtpZighZnVuY3Rpb24gcGF0Y2hWYWx1ZUFscmVhZHlJblBhdGgocyxvKXtjb25zdCBpPVtzXTtyZXR1cm4gby5wYXRoLnJlZHVjZSgoKHMsbyk9PihpLnB1c2goc1tvXSksc1tvXSkpLHMpLHBvaW50VG9BbmNlc3RvcihvLnZhbHVlKTtmdW5jdGlvbiBwb2ludFRvQW5jZXN0b3Iocyl7cmV0dXJuIFdvLmlzT2JqZWN0KHMpJiYoaS5pbmRleE9mKHMpPj0wfHxPYmplY3Qua2V5cyhzKS5zb21lKChvPT5wb2ludFRvQW5jZXN0b3Ioc1tvXSkpKSl9fShhLnN0YXRlLFYpfHx1LnVzZUNpcmN1bGFyU3RydWN0dXJlcylyZXR1cm4gVn1jYXRjaChzKXtyZXR1cm4gbnVsbH19fSxKbD1PYmplY3QuYXNzaWduKFdsLHtkb2NDYWNoZTpVbCxhYnNvbHV0ZWlmeSxjbGVhckNhY2hlOmZ1bmN0aW9uIGNsZWFyQ2FjaGUocyl7dm9pZCAwIT09cz9kZWxldGUgVWxbc106T2JqZWN0LmtleXMoVWwpLmZvckVhY2goKHM9PntkZWxldGUgVWxbc119KSl9LEpTT05SZWZFcnJvcix3cmFwRXJyb3IsZ2V0RG9jLHNwbGl0OnJlZnNfc3BsaXQsZXh0cmFjdEZyb21Eb2MsZmV0Y2hKU09OOmZ1bmN0aW9uIGZldGNoSlNPTihzKXtyZXR1cm4gZmV0Y2gocyx7aGVhZGVyczp7QWNjZXB0OlRsfSxsb2FkU3BlYzohMH0pLnRoZW4oKHM9PnMudGV4dCgpKSkudGhlbigocz0+Zm4ubG9hZChzKSkpfSxleHRyYWN0LGpzb25Qb2ludGVyVG9BcnJheSx1bmVzY2FwZUpzb25Qb2ludGVyVG9rZW59KSxIbD1KbDtmdW5jdGlvbiBhYnNvbHV0ZWlmeShzLG8pe2lmKCEkbC50ZXN0KHMpKXtpZighbyl0aHJvdyBuZXcgSlNPTlJlZkVycm9yKGBUcmllZCB0byByZXNvbHZlIGEgcmVsYXRpdmUgVVJMLCB3aXRob3V0IGhhdmluZyBhIGJhc2VQYXRoLiBwYXRoOiAnJHtzfScgYmFzZVBhdGg6ICcke299J2ApO3JldHVybiByZXNvbHZlKG8scyl9cmV0dXJuIHN9ZnVuY3Rpb24gd3JhcEVycm9yKHMsbyl7bGV0IGk7cmV0dXJuIGk9cyYmcy5yZXNwb25zZSYmcy5yZXNwb25zZS5ib2R5P2Ake3MucmVzcG9uc2UuYm9keS5jb2RlfSAke3MucmVzcG9uc2UuYm9keS5tZXNzYWdlfWA6cy5tZXNzYWdlLG5ldyBKU09OUmVmRXJyb3IoYENvdWxkIG5vdCByZXNvbHZlIHJlZmVyZW5jZTogJHtpfWAsey4uLm8sY2F1c2U6c30pfWZ1bmN0aW9uIHJlZnNfc3BsaXQocyl7cmV0dXJuKHMrIiIpLnNwbGl0KCIjIil9ZnVuY3Rpb24gZXh0cmFjdEZyb21Eb2MocyxvKXtjb25zdCBpPVVsW3NdO2lmKGkmJiFXby5pc1Byb21pc2UoaSkpdHJ5e2NvbnN0IHM9ZXh0cmFjdChvLGkpO3JldHVybiBPYmplY3QuYXNzaWduKFByb21pc2UucmVzb2x2ZShzKSx7X192YWx1ZTpzfSl9Y2F0Y2gocyl7cmV0dXJuIFByb21pc2UucmVqZWN0KHMpfXJldHVybiBnZXREb2MocykudGhlbigocz0+ZXh0cmFjdChvLHMpKSl9ZnVuY3Rpb24gZ2V0RG9jKHMpe2NvbnN0IG89VWxbc107cmV0dXJuIG8/V28uaXNQcm9taXNlKG8pP286UHJvbWlzZS5yZXNvbHZlKG8pOihVbFtzXT1KbC5mZXRjaEpTT04ocykudGhlbigobz0+KFVsW3NdPW8sbykpKSxVbFtzXSl9ZnVuY3Rpb24gZXh0cmFjdChzLG8pe2NvbnN0IGk9anNvblBvaW50ZXJUb0FycmF5KHMpO2lmKGkubGVuZ3RoPDEpcmV0dXJuIG87Y29uc3QgYT1Xby5nZXRJbihvLGkpO2lmKHZvaWQgMD09PWEpdGhyb3cgbmV3IEpTT05SZWZFcnJvcihgQ291bGQgbm90IHJlc29sdmUgcG9pbnRlcjogJHtzfSBkb2VzIG5vdCBleGlzdCBpbiBkb2N1bWVudGAse3BvaW50ZXI6c30pO3JldHVybiBhfWZ1bmN0aW9uIGpzb25Qb2ludGVyVG9BcnJheShzKXtpZigic3RyaW5nIiE9dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBzdHJpbmcsIGdvdCBhICIrdHlwZW9mIHMpO3JldHVybiIvIj09PXNbMF0mJihzPXMuc3Vic3RyKDEpKSwiIj09PXM/W106cy5zcGxpdCgiLyIpLm1hcCh1bmVzY2FwZUpzb25Qb2ludGVyVG9rZW4pfWZ1bmN0aW9uIHVuZXNjYXBlSnNvblBvaW50ZXJUb2tlbihzKXtpZigic3RyaW5nIiE9dHlwZW9mIHMpcmV0dXJuIHM7cmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoYD0ke3MucmVwbGFjZSgvfjEvZywiLyIpLnJlcGxhY2UoL34wL2csIn4iKX1gKS5nZXQoIiIpfWZ1bmN0aW9uIGVzY2FwZUpzb25Qb2ludGVyVG9rZW4ocyl7cmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoW1siIixzLnJlcGxhY2UoL34vZywifjAiKS5yZXBsYWNlKC9cLy9nLCJ+MSIpXV0pLnRvU3RyaW5nKCkuc2xpY2UoMSl9Y29uc3QgcG9pbnRlckJvdW5kYXJ5Q2hhcj1zPT4hc3x8Ii8iPT09c3x8IiMiPT09cztmdW5jdGlvbiBwb2ludGVySXNBUGFyZW50KHMsbyl7aWYocG9pbnRlckJvdW5kYXJ5Q2hhcihvKSlyZXR1cm4hMDtjb25zdCBpPXMuY2hhckF0KG8ubGVuZ3RoKSxhPW8uc2xpY2UoLTEpO3JldHVybiAwPT09cy5pbmRleE9mKG8pJiYoIWl8fCIvIj09PWl8fCIjIj09PWkpJiYiIyIhPT1hfWNvbnN0IEtsPXtrZXk6ImFsbE9mIixwbHVnaW46KHMsbyxpLGEsdSk9PntpZih1Lm1ldGEmJnUubWV0YS4kJHJlZilyZXR1cm47Y29uc3QgXz1pLnNsaWNlKDAsLTEpO2lmKGlzRnJlZWx5TmFtZWQoXykpcmV0dXJuO2lmKCFBcnJheS5pc0FycmF5KHMpKXtjb25zdCBzPW5ldyBUeXBlRXJyb3IoImFsbE9mIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4gcy5mdWxsUGF0aD1pLHN9bGV0IHc9ITEseD11LnZhbHVlO2lmKF8uZm9yRWFjaCgocz0+e3gmJih4PXhbc10pfSkpLHg9ey4uLnh9LDA9PT1PYmplY3Qua2V5cyh4KS5sZW5ndGgpcmV0dXJuO2RlbGV0ZSB4LmFsbE9mO2NvbnN0IEM9W107cmV0dXJuIEMucHVzaChhLnJlcGxhY2UoXyx7fSkpLHMuZm9yRWFjaCgoKHMsbyk9PntpZighYS5pc09iamVjdChzKSl7aWYodylyZXR1cm4gbnVsbDt3PSEwO2NvbnN0IHM9bmV3IFR5cGVFcnJvcigiRWxlbWVudHMgaW4gYWxsT2YgbXVzdCBiZSBvYmplY3RzIik7cmV0dXJuIHMuZnVsbFBhdGg9aSxDLnB1c2gocyl9Qy5wdXNoKGEubWVyZ2VEZWVwKF8scykpO2NvbnN0IHU9ZnVuY3Rpb24gZ2VuZXJhdGVBYnNvbHV0ZVJlZlBhdGNoZXMocyxvLHtzcGVjbWFwOmksZ2V0QmFzZVVybEZvck5vZGVQYXRoOmE9cz0+aS5nZXRDb250ZXh0KFsuLi5vLC4uLnNdKS5iYXNlRG9jLHRhcmdldEtleXM6dT1bIiRyZWYiLCIkJHJlZiJdfT17fSl7Y29uc3QgXz1bXTtyZXR1cm4gSWwocykuZm9yRWFjaCgoZnVuY3Rpb24gY2FsbGJhY2soKXtpZih1LmluY2x1ZGVzKHRoaXMua2V5KSYmInN0cmluZyI9PXR5cGVvZiB0aGlzLm5vZGUpe2NvbnN0IHM9dGhpcy5wYXRoLHU9by5jb25jYXQodGhpcy5wYXRoKSx3PWFic29sdXRpZnlQb2ludGVyKHRoaXMubm9kZSxhKHMpKTtfLnB1c2goaS5yZXBsYWNlKHUsdykpfX0pKSxffShzLGkuc2xpY2UoMCwtMSkse2dldEJhc2VVcmxGb3JOb2RlUGF0aDpzPT5hLmdldENvbnRleHQoWy4uLmksbywuLi5zXSkuYmFzZURvYyxzcGVjbWFwOmF9KTtDLnB1c2goLi4udSl9KSkseC5leGFtcGxlJiZDLnB1c2goYS5yZW1vdmUoW10uY29uY2F0KF8sImV4YW1wbGUiKSkpLEMucHVzaChhLm1lcmdlRGVlcChfLHgpKSx4LiQkcmVmfHxDLnB1c2goYS5yZW1vdmUoW10uY29uY2F0KF8sIiQkcmVmIikpKSxDfX0sR2w9e2tleToicGFyYW1ldGVycyIscGx1Z2luOihzLG8saSxhKT0+e2lmKEFycmF5LmlzQXJyYXkocykmJnMubGVuZ3RoKXtjb25zdCBvPU9iamVjdC5hc3NpZ24oW10scyksdT1pLnNsaWNlKDAsLTEpLF89ey4uLldvLmdldEluKGEuc3BlYyx1KX07Zm9yKGxldCB1PTA7dTxzLmxlbmd0aDt1Kz0xKXtjb25zdCB3PXNbdV07dHJ5e29bdV0uZGVmYXVsdD1hLnBhcmFtZXRlck1hY3JvKF8sdyl9Y2F0Y2gocyl7Y29uc3Qgbz1uZXcgRXJyb3Iocyk7cmV0dXJuIG8uZnVsbFBhdGg9aSxvfX1yZXR1cm4gV28ucmVwbGFjZShpLG8pfXJldHVybiBXby5yZXBsYWNlKGkscyl9fSxZbD17a2V5OiJwcm9wZXJ0aWVzIixwbHVnaW46KHMsbyxpLGEpPT57Y29uc3QgdT17Li4uc307Zm9yKGNvbnN0IG8gaW4gcyl0cnl7dVtvXS5kZWZhdWx0PWEubW9kZWxQcm9wZXJ0eU1hY3JvKHVbb10pfWNhdGNoKHMpe2NvbnN0IG89bmV3IEVycm9yKHMpO3JldHVybiBvLmZ1bGxQYXRoPWksb31yZXR1cm4gV28ucmVwbGFjZShpLHUpfX07Y2xhc3MgQ29udGV4dFRyZWV7Y29uc3RydWN0b3Iocyl7dGhpcy5yb290PWNvbnRleHRfdHJlZV9jcmVhdGVOb2RlKHN8fHt9KX1zZXQocyxvKXtjb25zdCBpPXRoaXMuZ2V0UGFyZW50KHMsITApO2lmKCFpKXJldHVybiB2b2lkIGNvbnRleHRfdHJlZV91cGRhdGVOb2RlKHRoaXMucm9vdCxvLG51bGwpO2NvbnN0IGE9c1tzLmxlbmd0aC0xXSx7Y2hpbGRyZW46dX09aTt1W2FdP2NvbnRleHRfdHJlZV91cGRhdGVOb2RlKHVbYV0sbyxpKTp1W2FdPWNvbnRleHRfdHJlZV9jcmVhdGVOb2RlKG8saSl9Z2V0KHMpe2lmKChzPXN8fFtdKS5sZW5ndGg8MSlyZXR1cm4gdGhpcy5yb290LnZhbHVlO2xldCBvLGksYT10aGlzLnJvb3Q7Zm9yKGxldCB1PTA7dTxzLmxlbmd0aCYmKGk9c1t1XSxvPWEuY2hpbGRyZW4sb1tpXSk7dSs9MSlhPW9baV07cmV0dXJuIGEmJmEucHJvdG9WYWx1ZX1nZXRQYXJlbnQocyxvKXtyZXR1cm4hc3x8cy5sZW5ndGg8MT9udWxsOnMubGVuZ3RoPDI/dGhpcy5yb290OnMuc2xpY2UoMCwtMSkucmVkdWNlKCgocyxpKT0+e2lmKCFzKXJldHVybiBzO2NvbnN0e2NoaWxkcmVuOmF9PXM7cmV0dXJuIWFbaV0mJm8mJihhW2ldPWNvbnRleHRfdHJlZV9jcmVhdGVOb2RlKG51bGwscykpLGFbaV19KSx0aGlzLnJvb3QpfX1mdW5jdGlvbiBjb250ZXh0X3RyZWVfY3JlYXRlTm9kZShzLG8pe3JldHVybiBjb250ZXh0X3RyZWVfdXBkYXRlTm9kZSh7Y2hpbGRyZW46e319LHMsbyl9ZnVuY3Rpb24gY29udGV4dF90cmVlX3VwZGF0ZU5vZGUocyxvLGkpe3JldHVybiBzLnZhbHVlPW98fHt9LHMucHJvdG9WYWx1ZT1pP3suLi5pLnByb3RvVmFsdWUsLi4ucy52YWx1ZX06cy52YWx1ZSxPYmplY3Qua2V5cyhzLmNoaWxkcmVuKS5mb3JFYWNoKChvPT57Y29uc3QgaT1zLmNoaWxkcmVuW29dO3MuY2hpbGRyZW5bb109Y29udGV4dF90cmVlX3VwZGF0ZU5vZGUoaSxpLnZhbHVlLHMpfSkpLHN9Y29uc3Qgc3BlY21hcF9ub29wPSgpPT57fTtjbGFzcyBTcGVjTWFwe3N0YXRpYyBnZXRQbHVnaW5OYW1lKHMpe3JldHVybiBzLnBsdWdpbk5hbWV9c3RhdGljIGdldFBhdGNoZXNPZlR5cGUocyxvKXtyZXR1cm4gcy5maWx0ZXIobyl9Y29uc3RydWN0b3Iocyl7T2JqZWN0LmFzc2lnbih0aGlzLHtzcGVjOiIiLGRlYnVnTGV2ZWw6ImluZm8iLHBsdWdpbnM6W10scGx1Z2luSGlzdG9yeTp7fSxlcnJvcnM6W10sbXV0YXRpb25zOltdLHByb21pc2VkUGF0Y2hlczpbXSxzdGF0ZTp7fSxwYXRjaGVzOltdLGNvbnRleHQ6e30sY29udGV4dFRyZWU6bmV3IENvbnRleHRUcmVlLHNob3dEZWJ1ZzohMSxhbGxQYXRjaGVzOltdLHBsdWdpblByb3A6InNwZWNNYXAiLGxpYk1ldGhvZHM6T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHRoaXMpLFdvLHtnZXRJbnN0YW5jZTooKT0+dGhpc30pLGFsbG93TWV0YVBhdGNoZXM6ITF9LHMpLHRoaXMuZ2V0PXRoaXMuX2dldC5iaW5kKHRoaXMpLHRoaXMuZ2V0Q29udGV4dD10aGlzLl9nZXRDb250ZXh0LmJpbmQodGhpcyksdGhpcy5oYXNSdW49dGhpcy5faGFzUnVuLmJpbmQodGhpcyksdGhpcy53cmFwcGVkUGx1Z2lucz10aGlzLnBsdWdpbnMubWFwKHRoaXMud3JhcFBsdWdpbi5iaW5kKHRoaXMpKS5maWx0ZXIoV28uaXNGdW5jdGlvbiksdGhpcy5wYXRjaGVzLnB1c2goV28uYWRkKFtdLHRoaXMuc3BlYykpLHRoaXMucGF0Y2hlcy5wdXNoKFdvLmNvbnRleHQoW10sdGhpcy5jb250ZXh0KSksdGhpcy51cGRhdGVQYXRjaGVzKHRoaXMucGF0Y2hlcyl9ZGVidWcocywuLi5vKXt0aGlzLmRlYnVnTGV2ZWw9PT1zJiZjb25zb2xlLmxvZyguLi5vKX12ZXJib3NlKHMsLi4ubyl7InZlcmJvc2UiPT09dGhpcy5kZWJ1Z0xldmVsJiZjb25zb2xlLmxvZyhgWyR7c31dICAgYCwuLi5vKX13cmFwUGx1Z2luKHMsbyl7Y29uc3R7cGF0aERpc2NyaW1pbmF0b3I6aX09dGhpcztsZXQgYSx1PW51bGw7cmV0dXJuIHNbdGhpcy5wbHVnaW5Qcm9wXT8odT1zLGE9c1t0aGlzLnBsdWdpblByb3BdKTpXby5pc0Z1bmN0aW9uKHMpP2E9czpXby5pc09iamVjdChzKSYmKGE9ZnVuY3Rpb24gY3JlYXRlS2V5QmFzZWRQbHVnaW4ocyl7Y29uc3QgaXNTdWJQYXRoPShzLG8pPT4hQXJyYXkuaXNBcnJheShzKXx8cy5ldmVyeSgoKHMsaSk9PnM9PT1vW2ldKSk7cmV0dXJuIGZ1bmN0aW9uKmdlbmVyYXRvcihvLGEpe2NvbnN0IHU9e307Zm9yKGNvbnN0W3MsaV1vZiBvLmZpbHRlcihXby5pc0FkZGl0aXZlTXV0YXRpb24pLmVudHJpZXMoKSl7aWYoIShzPFJsKSlyZXR1cm47eWllbGQqdHJhdmVyc2UoaS52YWx1ZSxpLnBhdGgsaSl9ZnVuY3Rpb24qdHJhdmVyc2UobyxfLHcpe2lmKFdvLmlzT2JqZWN0KG8pKXtjb25zdCB4PV8ubGVuZ3RoLTEsQz1fW3hdLGo9Xy5pbmRleE9mKCJwcm9wZXJ0aWVzIiksTD0icHJvcGVydGllcyI9PT1DJiZ4PT09aixCPWEuYWxsb3dNZXRhUGF0Y2hlcyYmdVtvLiQkcmVmXTtmb3IoY29uc3QgeCBvZiBPYmplY3Qua2V5cyhvKSl7Y29uc3QgQz1vW3hdLGo9Xy5jb25jYXQoeCksJD1Xby5pc09iamVjdChDKSxVPW8uJCRyZWY7aWYoQnx8JCYmKGEuYWxsb3dNZXRhUGF0Y2hlcyYmVSYmaXNTdWJQYXRoKGksaikmJih1W1VdPSEwKSx5aWVsZCp0cmF2ZXJzZShDLGosdykpLCFMJiZ4PT09cy5rZXkpe2NvbnN0IG89aXNTdWJQYXRoKGksXyk7aSYmIW98fCh5aWVsZCBzLnBsdWdpbihDLHgsaixhLHcpKX19fWVsc2Ugcy5rZXk9PT1fW18ubGVuZ3RoLTFdJiYoeWllbGQgcy5wbHVnaW4obyxzLmtleSxfLGEpKX19fShzKSksT2JqZWN0LmFzc2lnbihhLmJpbmQodSkse3BsdWdpbk5hbWU6cy5uYW1lfHxvLGlzR2VuZXJhdG9yOldvLmlzR2VuZXJhdG9yKGEpfSl9bmV4dFBsdWdpbigpe3JldHVybiB0aGlzLndyYXBwZWRQbHVnaW5zLmZpbmQoKHM9PnRoaXMuZ2V0TXV0YXRpb25zRm9yUGx1Z2luKHMpLmxlbmd0aD4wKSl9bmV4dFByb21pc2VkUGF0Y2goKXtpZih0aGlzLnByb21pc2VkUGF0Y2hlcy5sZW5ndGg+MClyZXR1cm4gUHJvbWlzZS5yYWNlKHRoaXMucHJvbWlzZWRQYXRjaGVzLm1hcCgocz0+cy52YWx1ZSkpKX1nZXRQbHVnaW5IaXN0b3J5KHMpe2NvbnN0IG89dGhpcy5jb25zdHJ1Y3Rvci5nZXRQbHVnaW5OYW1lKHMpO3JldHVybiB0aGlzLnBsdWdpbkhpc3Rvcnlbb118fFtdfWdldFBsdWdpblJ1bkNvdW50KHMpe3JldHVybiB0aGlzLmdldFBsdWdpbkhpc3RvcnkocykubGVuZ3RofWdldFBsdWdpbkhpc3RvcnlUaXAocyl7Y29uc3Qgbz10aGlzLmdldFBsdWdpbkhpc3Rvcnkocyk7cmV0dXJuIG8mJm9bby5sZW5ndGgtMV18fHt9fWdldFBsdWdpbk11dGF0aW9uSW5kZXgocyl7Y29uc3Qgbz10aGlzLmdldFBsdWdpbkhpc3RvcnlUaXAocykubXV0YXRpb25JbmRleDtyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIG8/LTE6b311cGRhdGVQbHVnaW5IaXN0b3J5KHMsbyl7Y29uc3QgaT10aGlzLmNvbnN0cnVjdG9yLmdldFBsdWdpbk5hbWUocyk7dGhpcy5wbHVnaW5IaXN0b3J5W2ldPXRoaXMucGx1Z2luSGlzdG9yeVtpXXx8W10sdGhpcy5wbHVnaW5IaXN0b3J5W2ldLnB1c2gobyl9dXBkYXRlUGF0Y2hlcyhzKXtXby5ub3JtYWxpemVBcnJheShzKS5mb3JFYWNoKChzPT57aWYocyBpbnN0YW5jZW9mIEVycm9yKXRoaXMuZXJyb3JzLnB1c2gocyk7ZWxzZSB0cnl7aWYoIVdvLmlzT2JqZWN0KHMpKXJldHVybiB2b2lkIHRoaXMuZGVidWcoInVwZGF0ZVBhdGNoZXMiLCJHb3QgYSBub24tb2JqZWN0IHBhdGNoIixzKTtpZih0aGlzLnNob3dEZWJ1ZyYmdGhpcy5hbGxQYXRjaGVzLnB1c2gocyksV28uaXNQcm9taXNlKHMudmFsdWUpKXJldHVybiB0aGlzLnByb21pc2VkUGF0Y2hlcy5wdXNoKHMpLHZvaWQgdGhpcy5wcm9taXNlZFBhdGNoVGhlbihzKTtpZihXby5pc0NvbnRleHRQYXRjaChzKSlyZXR1cm4gdm9pZCB0aGlzLnNldENvbnRleHQocy5wYXRoLHMudmFsdWUpO1dvLmlzTXV0YXRpb24ocykmJnRoaXMudXBkYXRlTXV0YXRpb25zKHMpfWNhdGNoKHMpe2NvbnNvbGUuZXJyb3IocyksdGhpcy5lcnJvcnMucHVzaChzKX19KSl9dXBkYXRlTXV0YXRpb25zKHMpeyJvYmplY3QiPT10eXBlb2Ygcy52YWx1ZSYmIUFycmF5LmlzQXJyYXkocy52YWx1ZSkmJnRoaXMuYWxsb3dNZXRhUGF0Y2hlcyYmKHMudmFsdWU9ey4uLnMudmFsdWV9KTtjb25zdCBvPVdvLmFwcGx5UGF0Y2godGhpcy5zdGF0ZSxzLHthbGxvd01ldGFQYXRjaGVzOnRoaXMuYWxsb3dNZXRhUGF0Y2hlc30pO28mJih0aGlzLm11dGF0aW9ucy5wdXNoKHMpLHRoaXMuc3RhdGU9byl9cmVtb3ZlUHJvbWlzZWRQYXRjaChzKXtjb25zdCBvPXRoaXMucHJvbWlzZWRQYXRjaGVzLmluZGV4T2Yocyk7bzwwP3RoaXMuZGVidWcoIlRyaWVkIHRvIHJlbW92ZSBhIHByb21pc2VkUGF0Y2ggdGhhdCBpc24ndCB0aGVyZSEiKTp0aGlzLnByb21pc2VkUGF0Y2hlcy5zcGxpY2UobywxKX1wcm9taXNlZFBhdGNoVGhlbihzKXtyZXR1cm4gcy52YWx1ZT1zLnZhbHVlLnRoZW4oKG89Pntjb25zdCBpPXsuLi5zLHZhbHVlOm99O3RoaXMucmVtb3ZlUHJvbWlzZWRQYXRjaChzKSx0aGlzLnVwZGF0ZVBhdGNoZXMoaSl9KSkuY2F0Y2goKG89Pnt0aGlzLnJlbW92ZVByb21pc2VkUGF0Y2gocyksdGhpcy51cGRhdGVQYXRjaGVzKG8pfSkpLHMudmFsdWV9Z2V0TXV0YXRpb25zKHMsbyl7cmV0dXJuIHM9c3x8MCwibnVtYmVyIiE9dHlwZW9mIG8mJihvPXRoaXMubXV0YXRpb25zLmxlbmd0aCksdGhpcy5tdXRhdGlvbnMuc2xpY2UocyxvKX1nZXRDdXJyZW50TXV0YXRpb25zKCl7cmV0dXJuIHRoaXMuZ2V0TXV0YXRpb25zRm9yUGx1Z2luKHRoaXMuZ2V0Q3VycmVudFBsdWdpbigpKX1nZXRNdXRhdGlvbnNGb3JQbHVnaW4ocyl7Y29uc3Qgbz10aGlzLmdldFBsdWdpbk11dGF0aW9uSW5kZXgocyk7cmV0dXJuIHRoaXMuZ2V0TXV0YXRpb25zKG8rMSl9Z2V0Q3VycmVudFBsdWdpbigpe3JldHVybiB0aGlzLmN1cnJlbnRQbHVnaW59Z2V0TGliKCl7cmV0dXJuIHRoaXMubGliTWV0aG9kc31fZ2V0KHMpe3JldHVybiBXby5nZXRJbih0aGlzLnN0YXRlLHMpfV9nZXRDb250ZXh0KHMpe3JldHVybiB0aGlzLmNvbnRleHRUcmVlLmdldChzKX1zZXRDb250ZXh0KHMsbyl7cmV0dXJuIHRoaXMuY29udGV4dFRyZWUuc2V0KHMsbyl9X2hhc1J1bihzKXtyZXR1cm4gdGhpcy5nZXRQbHVnaW5SdW5Db3VudCh0aGlzLmdldEN1cnJlbnRQbHVnaW4oKSk+KHN8fDApfWRpc3BhdGNoKCl7Y29uc3Qgcz10aGlzLG89dGhpcy5uZXh0UGx1Z2luKCk7aWYoIW8pe2NvbnN0IHM9dGhpcy5uZXh0UHJvbWlzZWRQYXRjaCgpO2lmKHMpcmV0dXJuIHMudGhlbigoKCk9PnRoaXMuZGlzcGF0Y2goKSkpLmNhdGNoKCgoKT0+dGhpcy5kaXNwYXRjaCgpKSk7Y29uc3Qgbz17c3BlYzp0aGlzLnN0YXRlLGVycm9yczp0aGlzLmVycm9yc307cmV0dXJuIHRoaXMuc2hvd0RlYnVnJiYoby5wYXRjaGVzPXRoaXMuYWxsUGF0Y2hlcyksUHJvbWlzZS5yZXNvbHZlKG8pfWlmKHMucGx1Z2luQ291bnQ9cy5wbHVnaW5Db3VudHx8bmV3IFdlYWtNYXAscy5wbHVnaW5Db3VudC5zZXQobywocy5wbHVnaW5Db3VudC5nZXQobyl8fDApKzEpLHMucGx1Z2luQ291bnRbb10+MTAwKXJldHVybiBQcm9taXNlLnJlc29sdmUoe3NwZWM6cy5zdGF0ZSxlcnJvcnM6cy5lcnJvcnMuY29uY2F0KG5ldyBFcnJvcigiV2UndmUgcmVhY2hlZCBhIGhhcmQgbGltaXQgb2YgMTAwIHBsdWdpbiBydW5zIikpfSk7aWYobyE9PXRoaXMuY3VycmVudFBsdWdpbiYmdGhpcy5wcm9taXNlZFBhdGNoZXMubGVuZ3RoKXtjb25zdCBzPXRoaXMucHJvbWlzZWRQYXRjaGVzLm1hcCgocz0+cy52YWx1ZSkpO3JldHVybiBQcm9taXNlLmFsbChzLm1hcCgocz0+cy50aGVuKHNwZWNtYXBfbm9vcCxzcGVjbWFwX25vb3ApKSkpLnRoZW4oKCgpPT50aGlzLmRpc3BhdGNoKCkpKX1yZXR1cm4gZnVuY3Rpb24gZXhlY3V0ZVBsdWdpbigpe3MuY3VycmVudFBsdWdpbj1vO2NvbnN0IGk9cy5nZXRDdXJyZW50TXV0YXRpb25zKCksYT1zLm11dGF0aW9ucy5sZW5ndGgtMTt0cnl7aWYoby5pc0dlbmVyYXRvcilmb3IoY29uc3QgYSBvZiBvKGkscy5nZXRMaWIoKSkpdXBkYXRlUGF0Y2hlcyhhKTtlbHNle3VwZGF0ZVBhdGNoZXMobyhpLHMuZ2V0TGliKCkpKX19Y2F0Y2gocyl7Y29uc29sZS5lcnJvcihzKSx1cGRhdGVQYXRjaGVzKFtPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUocykse3BsdWdpbjpvfSldKX1maW5hbGx5e3MudXBkYXRlUGx1Z2luSGlzdG9yeShvLHttdXRhdGlvbkluZGV4OmF9KX1yZXR1cm4gcy5kaXNwYXRjaCgpfSgpO2Z1bmN0aW9uIHVwZGF0ZVBhdGNoZXMoaSl7aSYmKGk9V28uZnVsbHlOb3JtYWxpemVBcnJheShpKSxzLnVwZGF0ZVBhdGNoZXMoaSxvKSl9fX1jb25zdCBYbD17cmVmczpIbCxhbGxPZjpLbCxwYXJhbWV0ZXJzOkdsLHByb3BlcnRpZXM6WWx9O2Z1bmN0aW9uIG1ha2VGZXRjaEpTT04ocyxvPXt9KXtjb25zdHtyZXF1ZXN0SW50ZXJjZXB0b3I6aSxyZXNwb25zZUludGVyY2VwdG9yOmF9PW8sdT1zLndpdGhDcmVkZW50aWFscz8iaW5jbHVkZSI6InNhbWUtb3JpZ2luIjtyZXR1cm4gbz0+cyh7dXJsOm8sbG9hZFNwZWM6ITAscmVxdWVzdEludGVyY2VwdG9yOmkscmVzcG9uc2VJbnRlcmNlcHRvcjphLGhlYWRlcnM6e0FjY2VwdDpUbH0sY3JlZGVudGlhbHM6dX0pLnRoZW4oKHM9PnMuYm9keSkpfWZ1bmN0aW9uIGlzRmlsZShzLG8pe3JldHVybiBvfHwidW5kZWZpbmVkIj09dHlwZW9mIG5hdmlnYXRvcnx8KG89bmF2aWdhdG9yKSxvJiYiUmVhY3ROYXRpdmUiPT09by5wcm9kdWN0PyEoIXN8fCJvYmplY3QiIT10eXBlb2Ygc3x8InN0cmluZyIhPXR5cGVvZiBzLnVyaSk6InVuZGVmaW5lZCIhPXR5cGVvZiBGaWxlJiZzIGluc3RhbmNlb2YgRmlsZXx8KCJ1bmRlZmluZWQiIT10eXBlb2YgQmxvYiYmcyBpbnN0YW5jZW9mIEJsb2J8fCghIUFycmF5QnVmZmVyLmlzVmlldyhzKXx8bnVsbCE9PXMmJiJvYmplY3QiPT10eXBlb2YgcyYmImZ1bmN0aW9uIj09dHlwZW9mIHMucGlwZSkpfWZ1bmN0aW9uIGlzQXJyYXlPZkZpbGUocyxvKXtyZXR1cm4gQXJyYXkuaXNBcnJheShzKSYmcy5zb21lKChzPT5pc0ZpbGUocyxvKSkpfWNsYXNzIEZpbGVXaXRoRGF0YSBleHRlbmRzIEZpbGV7Y29uc3RydWN0b3IocyxvPSIiLGk9e30pe3N1cGVyKFtzXSxvLGkpLHRoaXMuZGF0YT1zfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy5kYXRhfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudmFsdWVPZigpfX1jb25zdCBpc1JmYzM5ODZSZXNlcnZlZD1zPT4iOi8/I1tdQCEkJicoKSorLDs9Ii5pbmRleE9mKHMpPi0xLGlzUmZjMzk4NlVucmVzZXJ2ZWQ9cz0+L15bYS16MC05XC0uX35dKyQvaS50ZXN0KHMpO2Z1bmN0aW9uIGVuY29kZUNoYXJhY3RlcnMocyxvPSJyZXNlcnZlZCIpe3JldHVyblsuLi5zXS5tYXAoKHM9PntpZihpc1JmYzM5ODZVbnJlc2VydmVkKHMpKXJldHVybiBzO2lmKGlzUmZjMzk4NlJlc2VydmVkKHMpJiYidW5zYWZlIj09PW8pcmV0dXJuIHM7Y29uc3QgaT1uZXcgVGV4dEVuY29kZXI7cmV0dXJuIEFycmF5LmZyb20oaS5lbmNvZGUocykpLm1hcCgocz0+YDAke3MudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9YC5zbGljZSgtMikpKS5tYXAoKHM9PmAlJHtzfWApKS5qb2luKCIiKX0pKS5qb2luKCIiKX1mdW5jdGlvbiBzdHlsaXplKHMpe2NvbnN0e3ZhbHVlOm99PXM7cmV0dXJuIEFycmF5LmlzQXJyYXkobyk/ZnVuY3Rpb24gZW5jb2RlQXJyYXkoe2tleTpzLHZhbHVlOm8sc3R5bGU6aSxleHBsb2RlOmEsZXNjYXBlOnV9KXtpZigic2ltcGxlIj09PWkpcmV0dXJuIG8ubWFwKChzPT52YWx1ZUVuY29kZXIocyx1KSkpLmpvaW4oIiwiKTtpZigibGFiZWwiPT09aSlyZXR1cm5gLiR7by5tYXAoKHM9PnZhbHVlRW5jb2RlcihzLHUpKSkuam9pbigiLiIpfWA7aWYoIm1hdHJpeCI9PT1pKXJldHVybiBvLm1hcCgocz0+dmFsdWVFbmNvZGVyKHMsdSkpKS5yZWR1Y2UoKChvLGkpPT4hb3x8YT9gJHtvfHwiIn07JHtzfT0ke2l9YDpgJHtvfSwke2l9YCksIiIpO2lmKCJmb3JtIj09PWkpe2NvbnN0IGk9YT9gJiR7c309YDoiLCI7cmV0dXJuIG8ubWFwKChzPT52YWx1ZUVuY29kZXIocyx1KSkpLmpvaW4oaSl9aWYoInNwYWNlRGVsaW1pdGVkIj09PWkpe2NvbnN0IGk9YT9gJHtzfT1gOiIiO3JldHVybiBvLm1hcCgocz0+dmFsdWVFbmNvZGVyKHMsdSkpKS5qb2luKGAgJHtpfWApfWlmKCJwaXBlRGVsaW1pdGVkIj09PWkpe2NvbnN0IGk9YT9gJHtzfT1gOiIiO3JldHVybiBvLm1hcCgocz0+dmFsdWVFbmNvZGVyKHMsdSkpKS5qb2luKGB8JHtpfWApfXJldHVybn0ocyk6Im9iamVjdCI9PXR5cGVvZiBvP2Z1bmN0aW9uIGVuY29kZU9iamVjdCh7a2V5OnMsdmFsdWU6byxzdHlsZTppLGV4cGxvZGU6YSxlc2NhcGU6dX0pe2NvbnN0IF89T2JqZWN0LmtleXMobyk7aWYoInNpbXBsZSI9PT1pKXJldHVybiBfLnJlZHVjZSgoKHMsaSk9Pntjb25zdCBfPXZhbHVlRW5jb2RlcihvW2ldLHUpO3JldHVybmAke3M/YCR7c30sYDoiIn0ke2l9JHthPyI9IjoiLCJ9JHtffWB9KSwiIik7aWYoImxhYmVsIj09PWkpcmV0dXJuIF8ucmVkdWNlKCgocyxpKT0+e2NvbnN0IF89dmFsdWVFbmNvZGVyKG9baV0sdSk7cmV0dXJuYCR7cz9gJHtzfS5gOiIuIn0ke2l9JHthPyI9IjoiLiJ9JHtffWB9KSwiIik7aWYoIm1hdHJpeCI9PT1pJiZhKXJldHVybiBfLnJlZHVjZSgoKHMsaSk9PmAke3M/YCR7c307YDoiOyJ9JHtpfT0ke3ZhbHVlRW5jb2RlcihvW2ldLHUpfWApLCIiKTtpZigibWF0cml4Ij09PWkpcmV0dXJuIF8ucmVkdWNlKCgoaSxhKT0+e2NvbnN0IF89dmFsdWVFbmNvZGVyKG9bYV0sdSk7cmV0dXJuYCR7aT9gJHtpfSxgOmA7JHtzfT1gfSR7YX0sJHtffWB9KSwiIik7aWYoImZvcm0iPT09aSlyZXR1cm4gXy5yZWR1Y2UoKChzLGkpPT57Y29uc3QgXz12YWx1ZUVuY29kZXIob1tpXSx1KTtyZXR1cm5gJHtzP2Ake3N9JHthPyImIjoiLCJ9YDoiIn0ke2l9JHthPyI9IjoiLCJ9JHtffWB9KSwiIik7cmV0dXJufShzKTpmdW5jdGlvbiBlbmNvZGVQcmltaXRpdmUoe2tleTpzLHZhbHVlOm8sc3R5bGU6aSxlc2NhcGU6YX0pe2lmKCJzaW1wbGUiPT09aSlyZXR1cm4gdmFsdWVFbmNvZGVyKG8sYSk7aWYoImxhYmVsIj09PWkpcmV0dXJuYC4ke3ZhbHVlRW5jb2RlcihvLGEpfWA7aWYoIm1hdHJpeCI9PT1pKXJldHVybmA7JHtzfT0ke3ZhbHVlRW5jb2RlcihvLGEpfWA7aWYoImZvcm0iPT09aSlyZXR1cm4gdmFsdWVFbmNvZGVyKG8sYSk7aWYoImRlZXBPYmplY3QiPT09aSlyZXR1cm4gdmFsdWVFbmNvZGVyKG8sYSk7cmV0dXJufShzKX1mdW5jdGlvbiB2YWx1ZUVuY29kZXIocyxvPSExKXtyZXR1cm4gQXJyYXkuaXNBcnJheShzKXx8bnVsbCE9PXMmJiJvYmplY3QiPT10eXBlb2Ygcz9zPUpTT04uc3RyaW5naWZ5KHMpOiJudW1iZXIiIT10eXBlb2YgcyYmImJvb2xlYW4iIT10eXBlb2Ygc3x8KHM9U3RyaW5nKHMpKSxvJiYic3RyaW5nIj09dHlwZW9mIHMmJnMubGVuZ3RoPjA/ZW5jb2RlQ2hhcmFjdGVycyhzLG8pOm51bGwhPXM/czoiIn1jb25zdCBRbD17Zm9ybToiLCIsc3BhY2VEZWxpbWl0ZWQ6IiUyMCIscGlwZURlbGltaXRlZDoifCJ9LFpsPXtjc3Y6IiwiLHNzdjoiJTIwIix0c3Y6IiUwOSIscGlwZXM6InwifTtmdW5jdGlvbiBmb3JtYXRLZXlWYWx1ZShzLG8saT0hMSl7Y29uc3R7Y29sbGVjdGlvbkZvcm1hdDphLGFsbG93RW1wdHlWYWx1ZTp1LHNlcmlhbGl6YXRpb25PcHRpb246XyxlbmNvZGluZzp3fT1vLHg9Im9iamVjdCIhPXR5cGVvZiBvfHxBcnJheS5pc0FycmF5KG8pP286by52YWx1ZSxDPWk/cz0+cy50b1N0cmluZygpOnM9PmVuY29kZVVSSUNvbXBvbmVudChzKSxqPUMocyk7aWYodm9pZCAwPT09eCYmdSlyZXR1cm5bW2osIiJdXTtpZihpc0ZpbGUoeCl8fGlzQXJyYXlPZkZpbGUoeCkpcmV0dXJuW1tqLHhdXTtpZihfKXJldHVybiBmb3JtYXRLZXlWYWx1ZUJ5U2VyaWFsaXphdGlvbk9wdGlvbihzLHgsaSxfKTtpZih3KXtpZihbdHlwZW9mIHcuc3R5bGUsdHlwZW9mIHcuZXhwbG9kZSx0eXBlb2Ygdy5hbGxvd1Jlc2VydmVkXS5zb21lKChzPT4idW5kZWZpbmVkIiE9PXMpKSl7Y29uc3R7c3R5bGU6byxleHBsb2RlOmEsYWxsb3dSZXNlcnZlZDp1fT13O3JldHVybiBmb3JtYXRLZXlWYWx1ZUJ5U2VyaWFsaXphdGlvbk9wdGlvbihzLHgsaSx7c3R5bGU6byxleHBsb2RlOmEsYWxsb3dSZXNlcnZlZDp1fSl9aWYoInN0cmluZyI9PXR5cGVvZiB3LmNvbnRlbnRUeXBlKXtpZih3LmNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoImFwcGxpY2F0aW9uL2pzb24iKSl7Y29uc3Qgcz1DKCJzdHJpbmciPT10eXBlb2YgeD94OkpTT04uc3RyaW5naWZ5KHgpKTtyZXR1cm5bW2osbmV3IEZpbGVXaXRoRGF0YShzLCJibG9iIix7dHlwZTp3LmNvbnRlbnRUeXBlfSldXX1jb25zdCBzPUMoU3RyaW5nKHgpKTtyZXR1cm5bW2osbmV3IEZpbGVXaXRoRGF0YShzLCJibG9iIix7dHlwZTp3LmNvbnRlbnRUeXBlfSldXX1yZXR1cm4ib2JqZWN0IiE9dHlwZW9mIHg/W1tqLEMoeCldXTpBcnJheS5pc0FycmF5KHgpJiZ4LmV2ZXJ5KChzPT4ib2JqZWN0IiE9dHlwZW9mIHMpKT9bW2oseC5tYXAoQykuam9pbigiLCIpXV06W1tqLEMoSlNPTi5zdHJpbmdpZnkoeCkpXV19cmV0dXJuIm9iamVjdCIhPXR5cGVvZiB4P1tbaixDKHgpXV06QXJyYXkuaXNBcnJheSh4KT8ibXVsdGkiPT09YT9bW2oseC5tYXAoQyldXTpbW2oseC5tYXAoQykuam9pbihabFthfHwiY3N2Il0pXV06W1tqLCIiXV19ZnVuY3Rpb24gZm9ybWF0S2V5VmFsdWVCeVNlcmlhbGl6YXRpb25PcHRpb24ocyxvLGksYSl7Y29uc3QgdT1hLnN0eWxlfHwiZm9ybSIsXz12b2lkIDA9PT1hLmV4cGxvZGU/ImZvcm0iPT09dTphLmV4cGxvZGUsdz0haSYmKGEmJmEuYWxsb3dSZXNlcnZlZD8idW5zYWZlIjoicmVzZXJ2ZWQiKSxlbmNvZGVGbj1zPT52YWx1ZUVuY29kZXIocyx3KSx4PWk/cz0+czpzPT5lbmNvZGVGbihzKTtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIG8/W1t4KHMpLGVuY29kZUZuKG8pXV06QXJyYXkuaXNBcnJheShvKT9fP1tbeChzKSxvLm1hcChlbmNvZGVGbildXTpbW3gocyksby5tYXAoZW5jb2RlRm4pLmpvaW4oUWxbdV0pXV06ImRlZXBPYmplY3QiPT09dT9PYmplY3Qua2V5cyhvKS5tYXAoKGk9Plt4KGAke3N9WyR7aX1dYCksZW5jb2RlRm4ob1tpXSldKSk6Xz9PYmplY3Qua2V5cyhvKS5tYXAoKHM9Plt4KHMpLGVuY29kZUZuKG9bc10pXSkpOltbeChzKSxPYmplY3Qua2V5cyhvKS5tYXAoKHM9PltgJHt4KHMpfSwke2VuY29kZUZuKG9bc10pfWBdKSkuam9pbigiLCIpXV19ZnVuY3Rpb24gZW5jb2RlRm9ybU9yUXVlcnkocyl7cmV0dXJuKChzLHtlbmNvZGU6bz0hMH09e30pPT57Y29uc3QgYnVpbGROZXN0ZWRQYXJhbXM9KHMsbyxpKT0+KEFycmF5LmlzQXJyYXkoaSk/aS5yZWR1Y2UoKChpLGEpPT5idWlsZE5lc3RlZFBhcmFtcyhzLG8sYSkpLHMpOmkgaW5zdGFuY2VvZiBEYXRlP3MuYXBwZW5kKG8saS50b0lTT1N0cmluZygpKToib2JqZWN0Ij09dHlwZW9mIGk/T2JqZWN0LmVudHJpZXMoaSkucmVkdWNlKCgoaSxbYSx1XSk9PmJ1aWxkTmVzdGVkUGFyYW1zKHMsYCR7b31bJHthfV1gLHUpKSxzKTpzLmFwcGVuZChvLGkpLHMpLGk9T2JqZWN0LmVudHJpZXMocykucmVkdWNlKCgocyxbbyxpXSk9PmJ1aWxkTmVzdGVkUGFyYW1zKHMsbyxpKSksbmV3IFVSTFNlYXJjaFBhcmFtcyksYT1TdHJpbmcoaSk7cmV0dXJuIG8/YTpkZWNvZGVVUklDb21wb25lbnQoYSl9KShPYmplY3Qua2V5cyhzKS5yZWR1Y2UoKChvLGkpPT57Zm9yKGNvbnN0W2EsdV1vZiBmb3JtYXRLZXlWYWx1ZShpLHNbaV0pKW9bYV09dSBpbnN0YW5jZW9mIEZpbGVXaXRoRGF0YT91LnZhbHVlT2YoKTp1O3JldHVybiBvfSkse30pLHtlbmNvZGU6ITF9KX1mdW5jdGlvbiBzZXJpYWxpemVSZXF1ZXN0KHM9e30pe2NvbnN0e3VybDpvPSIiLHF1ZXJ5OmksZm9ybTphfT1zO2lmKGEpe2NvbnN0IG89T2JqZWN0LmtleXMoYSkuc29tZSgocz0+e2NvbnN0e3ZhbHVlOm99PWFbc107cmV0dXJuIGlzRmlsZShvKXx8aXNBcnJheU9mRmlsZShvKX0pKSxpPXMuaGVhZGVyc1siY29udGVudC10eXBlIl18fHMuaGVhZGVyc1siQ29udGVudC1UeXBlIl07aWYob3x8L211bHRpcGFydFwvZm9ybS1kYXRhL2kudGVzdChpKSl7Y29uc3Qgbz1mdW5jdGlvbiByZXF1ZXN0X2J1aWxkRm9ybURhdGEocyl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHMpLnJlZHVjZSgoKHMsW28saV0pPT57Zm9yKGNvbnN0W2EsdV1vZiBmb3JtYXRLZXlWYWx1ZShvLGksITApKWlmKEFycmF5LmlzQXJyYXkodSkpZm9yKGNvbnN0IG8gb2YgdSlpZihBcnJheUJ1ZmZlci5pc1ZpZXcobykpe2NvbnN0IGk9bmV3IEJsb2IoW29dKTtzLmFwcGVuZChhLGkpfWVsc2Ugcy5hcHBlbmQoYSxvKTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyh1KSl7Y29uc3Qgbz1uZXcgQmxvYihbdV0pO3MuYXBwZW5kKGEsbyl9ZWxzZSBzLmFwcGVuZChhLHUpO3JldHVybiBzfSksbmV3IEZvcm1EYXRhKX0ocy5mb3JtKTtzLmZvcm1kYXRhPW8scy5ib2R5PW99ZWxzZSBzLmJvZHk9ZW5jb2RlRm9ybU9yUXVlcnkoYSk7ZGVsZXRlIHMuZm9ybX1pZihpKXtjb25zdFthLHVdPW8uc3BsaXQoIj8iKTtsZXQgXz0iIjtpZih1KXtjb25zdCBzPW5ldyBVUkxTZWFyY2hQYXJhbXModSk7T2JqZWN0LmtleXMoaSkuZm9yRWFjaCgobz0+cy5kZWxldGUobykpKSxfPVN0cmluZyhzKX1jb25zdCB3PSgoLi4ucyk9Pntjb25zdCBvPXMuZmlsdGVyKChzPT5zKSkuam9pbigiJiIpO3JldHVybiBvP2A/JHtvfWA6IiJ9KShfLGVuY29kZUZvcm1PclF1ZXJ5KGkpKTtzLnVybD1hK3csZGVsZXRlIHMucXVlcnl9cmV0dXJuIHN9ZnVuY3Rpb24gc2VyaWFsaXplSGVhZGVycyhzPXt9KXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2Ygcy5lbnRyaWVzP3t9OkFycmF5LmZyb20ocy5lbnRyaWVzKCkpLnJlZHVjZSgoKHMsW28saV0pPT4oc1tvXT1mdW5jdGlvbiBzZXJpYWxpemVIZWFkZXJWYWx1ZShzKXtyZXR1cm4gcy5pbmNsdWRlcygiLCAiKT9zLnNwbGl0KCIsICIpOnN9KGkpLHMpKSx7fSl9ZnVuY3Rpb24gc2VyaWFsaXplUmVzcG9uc2UocyxvLHtsb2FkU3BlYzppPSExfT17fSl7Y29uc3QgYT17b2s6cy5vayx1cmw6cy51cmx8fG8sc3RhdHVzOnMuc3RhdHVzLHN0YXR1c1RleHQ6cy5zdGF0dXNUZXh0LGhlYWRlcnM6c2VyaWFsaXplSGVhZGVycyhzLmhlYWRlcnMpfSx1PWEuaGVhZGVyc1siY29udGVudC10eXBlIl0sXz1pfHwoKHM9IiIpPT4vKGpzb258eG1sfHlhbWx8dGV4dClcYi8udGVzdChzKSkodSk7cmV0dXJuKF8/cy50ZXh0OnMuYmxvYnx8cy5idWZmZXIpLmNhbGwocykudGhlbigocz0+e2lmKGEudGV4dD1zLGEuZGF0YT1zLF8pdHJ5e2NvbnN0IG89ZnVuY3Rpb24gcGFyc2VCb2R5KHMsbyl7aWYobyl7aWYoMD09PW8uaW5kZXhPZigiYXBwbGljYXRpb24vanNvbiIpfHxvLmluZGV4T2YoIitqc29uIik+MClyZXR1cm4gSlNPTi5wYXJzZShzKTtpZigwPT09by5pbmRleE9mKCJhcHBsaWNhdGlvbi94bWwiKXx8by5pbmRleE9mKCIreG1sIik+MClyZXR1cm4gc31yZXR1cm4gZm4ubG9hZChzKX0ocyx1KTthLmJvZHk9byxhLm9iaj1vfWNhdGNoKHMpe2EucGFyc2VFcnJvcj1zfXJldHVybiBhfSkpfWFzeW5jIGZ1bmN0aW9uIGh0dHBfaHR0cChzLG89e30peyJvYmplY3QiPT10eXBlb2YgcyYmKHM9KG89cykudXJsKSxvLmhlYWRlcnM9by5oZWFkZXJzfHx7fSwobz1zZXJpYWxpemVSZXF1ZXN0KG8pKS5oZWFkZXJzJiZPYmplY3Qua2V5cyhvLmhlYWRlcnMpLmZvckVhY2goKHM9Pntjb25zdCBpPW8uaGVhZGVyc1tzXTsic3RyaW5nIj09dHlwZW9mIGkmJihvLmhlYWRlcnNbc109aS5yZXBsYWNlKC9cbisvZywiICIpKX0pKSxvLnJlcXVlc3RJbnRlcmNlcHRvciYmKG89YXdhaXQgby5yZXF1ZXN0SW50ZXJjZXB0b3Iobyl8fG8pO2NvbnN0IGk9by5oZWFkZXJzWyJjb250ZW50LXR5cGUiXXx8by5oZWFkZXJzWyJDb250ZW50LVR5cGUiXTtsZXQgYTsvbXVsdGlwYXJ0XC9mb3JtLWRhdGEvaS50ZXN0KGkpJiYoZGVsZXRlIG8uaGVhZGVyc1siY29udGVudC10eXBlIl0sZGVsZXRlIG8uaGVhZGVyc1siQ29udGVudC1UeXBlIl0pO3RyeXthPWF3YWl0KG8udXNlckZldGNofHxmZXRjaCkoby51cmwsbyksYT1hd2FpdCBzZXJpYWxpemVSZXNwb25zZShhLHMsbyksby5yZXNwb25zZUludGVyY2VwdG9yJiYoYT1hd2FpdCBvLnJlc3BvbnNlSW50ZXJjZXB0b3IoYSl8fGEpfWNhdGNoKHMpe2lmKCFhKXRocm93IHM7Y29uc3Qgbz1uZXcgRXJyb3IoYS5zdGF0dXNUZXh0fHxgcmVzcG9uc2Ugc3RhdHVzIGlzICR7YS5zdGF0dXN9YCk7dGhyb3cgby5zdGF0dXM9YS5zdGF0dXMsby5zdGF0dXNDb2RlPWEuc3RhdHVzLG8ucmVzcG9uc2VFcnJvcj1zLG99aWYoIWEub2spe2NvbnN0IHM9bmV3IEVycm9yKGEuc3RhdHVzVGV4dHx8YHJlc3BvbnNlIHN0YXR1cyBpcyAke2Euc3RhdHVzfWApO3Rocm93IHMuc3RhdHVzPWEuc3RhdHVzLHMuc3RhdHVzQ29kZT1hLnN0YXR1cyxzLnJlc3BvbnNlPWEsc31yZXR1cm4gYX1jb25zdCBvcHRpb25zX3JldHJpZXZhbFVSST1zPT57dmFyIG8saTtjb25zdHtiYXNlRG9jOmEsdXJsOnV9PXMsXz1udWxsIT09KG89bnVsbCE9YT9hOnUpJiZ2b2lkIDAhPT1vP286IiI7cmV0dXJuInN0cmluZyI9PXR5cGVvZihudWxsPT09KGk9Z2xvYmFsVGhpcy5kb2N1bWVudCl8fHZvaWQgMD09PWk/dm9pZCAwOmkuYmFzZVVSSSk/U3RyaW5nKG5ldyBVUkwoXyxnbG9iYWxUaGlzLmRvY3VtZW50LmJhc2VVUkkpKTpffSxvcHRpb25zX2h0dHBDbGllbnQ9cz0+e2NvbnN0e2ZldGNoOm8saHR0cDppfT1zO3JldHVybiBvfHxpfHxodHRwX2h0dHB9O2FzeW5jIGZ1bmN0aW9uIHJlc29sdmVHZW5lcmljU3RyYXRlZ3kocyl7Y29uc3R7c3BlYzpvLG1vZGU6aSxhbGxvd01ldGFQYXRjaGVzOmE9ITAscGF0aERpc2NyaW1pbmF0b3I6dSxtb2RlbFByb3BlcnR5TWFjcm86XyxwYXJhbWV0ZXJNYWNybzp3LHJlcXVlc3RJbnRlcmNlcHRvcjp4LHJlc3BvbnNlSW50ZXJjZXB0b3I6Qyxza2lwTm9ybWFsaXphdGlvbjpqPSExLHVzZUNpcmN1bGFyU3RydWN0dXJlczpMLHN0cmF0ZWdpZXM6Qn09cywkPW9wdGlvbnNfcmV0cmlldmFsVVJJKHMpLFU9b3B0aW9uc19odHRwQ2xpZW50KHMpLFY9Qi5maW5kKChzPT5zLm1hdGNoKG8pKSk7cmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGRvUmVzb2x2ZShzKXskJiYoWGwucmVmcy5kb2NDYWNoZVskXT1zKTtYbC5yZWZzLmZldGNoSlNPTj1tYWtlRmV0Y2hKU09OKFUse3JlcXVlc3RJbnRlcmNlcHRvcjp4LHJlc3BvbnNlSW50ZXJjZXB0b3I6Q30pO2NvbnN0IG89W1hsLnJlZnNdOyJmdW5jdGlvbiI9PXR5cGVvZiB3JiZvLnB1c2goWGwucGFyYW1ldGVycyk7ImZ1bmN0aW9uIj09dHlwZW9mIF8mJm8ucHVzaChYbC5wcm9wZXJ0aWVzKTsic3RyaWN0IiE9PWkmJm8ucHVzaChYbC5hbGxPZik7Y29uc3QgQj1hd2FpdCBmdW5jdGlvbiBtYXBTcGVjKHMpe3JldHVybiBuZXcgU3BlY01hcChzKS5kaXNwYXRjaCgpfSh7c3BlYzpzLGNvbnRleHQ6e2Jhc2VEb2M6JH0scGx1Z2luczpvLGFsbG93TWV0YVBhdGNoZXM6YSxwYXRoRGlzY3JpbWluYXRvcjp1LHBhcmFtZXRlck1hY3JvOncsbW9kZWxQcm9wZXJ0eU1hY3JvOl8sdXNlQ2lyY3VsYXJTdHJ1Y3R1cmVzOkx9KTtqfHwoQi5zcGVjPVYubm9ybWFsaXplKEIuc3BlYykpO3JldHVybiBCfShvKX1mdW5jdGlvbiBfcGF0aChzLG8pe2Zvcih2YXIgaT1vLGE9MDthPHMubGVuZ3RoO2ErPTEpe2lmKG51bGw9PWkpcmV0dXJuO3ZhciB1PXNbYV07aT1yYSh1KT9fbnRoKHUsaSk6aVt1XX1yZXR1cm4gaX1jb25zdCBldT1fY3VycnkzKChmdW5jdGlvbiBwYXRoU2F0aXNmaWVzKHMsbyxpKXtyZXR1cm4gcyhfcGF0aChvLGkpKX0pKTtjb25zdCB0dT1fY3VycnkyKChmdW5jdGlvbiBhbmQocyxvKXtyZXR1cm4gcyYmb30pKTtjb25zdCBydT1fY3VycnkyKChmdW5jdGlvbiBib3RoKHMsbyl7cmV0dXJuIF9pc0Z1bmN0aW9uKHMpP2Z1bmN0aW9uIF9ib3RoKCl7cmV0dXJuIHMuYXBwbHkodGhpcyxhcmd1bWVudHMpJiZvLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06YWModHUpKHMsbyl9KSk7Y29uc3QgbnU9a2EobnVsbCk7Y29uc3Qgc3U9Y2MobnUpO2Z1bmN0aW9uIGlzT2ZUeXBlT2JqZWN0X3R5cGVvZihzKXtyZXR1cm4gaXNPZlR5cGVPYmplY3RfdHlwZW9mPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHMpe3JldHVybiB0eXBlb2Ygc306ZnVuY3Rpb24ocyl7cmV0dXJuIHMmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnMuY29uc3RydWN0b3I9PT1TeW1ib2wmJnMhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBzfSxpc09mVHlwZU9iamVjdF90eXBlb2Yocyl9Y29uc3Qgb3U9ZnVuY3Rpb24gaXNPZlR5cGVPYmplY3Qocyl7cmV0dXJuIm9iamVjdCI9PT1pc09mVHlwZU9iamVjdF90eXBlb2Yocyl9O2NvbnN0IGl1PWxhKDEscnUoc3Usb3UpKTt2YXIgYXU9cGlwZSh4YSxFYygiT2JqZWN0IikpLGN1PXBpcGUoTGEsa2EoTGEoT2JqZWN0KSkpLGx1PWV1KHJ1KGpjLGN1KSxbImNvbnN0cnVjdG9yIl0pLHV1PWxhKDEsKGZ1bmN0aW9uKHMpe2lmKCFpdShzKXx8IWF1KHMpKXJldHVybiExO3ZhciBvPU9iamVjdC5nZXRQcm90b3R5cGVPZihzKTtyZXR1cm4hIW51KG8pfHxsdShvKX0pKTtjb25zdCBwdT11dSxyZXBsYWNlX3NwZWNpYWxfY2hhcnNfd2l0aF91bmRlcnNjb3JlPXM9PnMucmVwbGFjZSgvXFcvZ2ksIl8iKTtmdW5jdGlvbiBvcElkKHMsbyxpPSIiLHt2Mk9wZXJhdGlvbklkQ29tcGF0aWJpbGl0eU1vZGU6YX09e30pe2lmKCFzfHwib2JqZWN0IiE9dHlwZW9mIHMpcmV0dXJuIG51bGw7cmV0dXJuKHMub3BlcmF0aW9uSWR8fCIiKS5yZXBsYWNlKC9ccy9nLCIiKS5sZW5ndGg/cmVwbGFjZV9zcGVjaWFsX2NoYXJzX3dpdGhfdW5kZXJzY29yZShzLm9wZXJhdGlvbklkKTpmdW5jdGlvbiBpZEZyb21QYXRoTWV0aG9kKHMsbyx7djJPcGVyYXRpb25JZENvbXBhdGliaWxpdHlNb2RlOml9PXt9KXtpZihpKXtsZXQgaT1gJHtvLnRvTG93ZXJDYXNlKCl9XyR7c31gLnJlcGxhY2UoL1tccyFAIyQlXiYqKClfKz1be1xdfTs6PD58Li8/LFxcJyIiLV0vZywiXyIpO3JldHVybiBpPWl8fGAke3Muc3Vic3RyaW5nKDEpfV8ke299YCxpLnJlcGxhY2UoLygoXyl7Mix9KS9nLCJfIikucmVwbGFjZSgvXihfKSovZywiIikucmVwbGFjZSgvKFtfXSkqJC9nLCIiKX1yZXR1cm5gJHtvLnRvTG93ZXJDYXNlKCl9JHtyZXBsYWNlX3NwZWNpYWxfY2hhcnNfd2l0aF91bmRlcnNjb3JlKHMpfWB9KG8saSx7djJPcGVyYXRpb25JZENvbXBhdGliaWxpdHlNb2RlOmF9KX1mdW5jdGlvbiBub3JtYWxpemUocyl7Y29uc3R7c3BlYzpvfT1zLHtwYXRoczppfT1vLGE9e307aWYoIWl8fG8uJCRub3JtYWxpemVkKXJldHVybiBzO2Zvcihjb25zdCBzIGluIGkpe2NvbnN0IHU9aVtzXTtpZihudWxsPT11fHwhWyJvYmplY3QiLCJmdW5jdGlvbiJdLmluY2x1ZGVzKHR5cGVvZiB1KSljb250aW51ZTtjb25zdCBfPXUucGFyYW1ldGVycztmb3IoY29uc3QgaSBpbiB1KXtjb25zdCB3PXVbaV07aWYobnVsbD09d3x8IVsib2JqZWN0IiwiZnVuY3Rpb24iXS5pbmNsdWRlcyh0eXBlb2YgdykpY29udGludWU7Y29uc3QgeD1vcElkKHcscyxpKTtpZih4KXthW3hdP2FbeF0ucHVzaCh3KTphW3hdPVt3XTtjb25zdCBzPWFbeF07aWYocy5sZW5ndGg+MSlzLmZvckVhY2goKChzLG8pPT57cy5fX29yaWdpbmFsT3BlcmF0aW9uSWQ9cy5fX29yaWdpbmFsT3BlcmF0aW9uSWR8fHMub3BlcmF0aW9uSWQscy5vcGVyYXRpb25JZD1gJHt4fSR7bysxfWB9KSk7ZWxzZSBpZih2b2lkIDAhPT13Lm9wZXJhdGlvbklkKXtjb25zdCBvPXNbMF07by5fX29yaWdpbmFsT3BlcmF0aW9uSWQ9by5fX29yaWdpbmFsT3BlcmF0aW9uSWR8fHcub3BlcmF0aW9uSWQsby5vcGVyYXRpb25JZD14fX1pZigicGFyYW1ldGVycyIhPT1pKXtjb25zdCBzPVtdLGk9e307Zm9yKGNvbnN0IGEgaW4gbykicHJvZHVjZXMiIT09YSYmImNvbnN1bWVzIiE9PWEmJiJzZWN1cml0eSIhPT1hfHwoaVthXT1vW2FdLHMucHVzaChpKSk7aWYoXyYmKGkucGFyYW1ldGVycz1fLHMucHVzaChpKSkscy5sZW5ndGgpZm9yKGNvbnN0IG8gb2Ygcylmb3IoY29uc3QgcyBpbiBvKWlmKEFycmF5LmlzQXJyYXkod1tzXSkpe2lmKCJwYXJhbWV0ZXJzIj09PXMpZm9yKGNvbnN0IGkgb2Ygb1tzXSl7d1tzXS5zb21lKChzPT4hKCFwdShzKSYmIXB1KGkpKSYmKHM9PT1pfHxbIm5hbWUiLCIkcmVmIiwiJCRyZWYiXS5zb21lKChvPT4ic3RyaW5nIj09dHlwZW9mIHNbb10mJiJzdHJpbmciPT10eXBlb2YgaVtvXSYmc1tvXT09PWlbb10pKSkpKXx8d1tzXS5wdXNoKGkpfX1lbHNlIHdbc109b1tzXX19fXJldHVybiBvLiQkbm9ybWFsaXplZD0hMCxzfWNvbnN0IGh1PXtuYW1lOiJnZW5lcmljIixtYXRjaDooKT0+ITAsbm9ybWFsaXplKHMpe2NvbnN0e3NwZWM6b309bm9ybWFsaXplKHtzcGVjOnN9KTtyZXR1cm4gb30scmVzb2x2ZTphc3luYyBzPT5yZXNvbHZlR2VuZXJpY1N0cmF0ZWd5KHMpfSxkdT1odTtjb25zdCBpc09wZW5BUEkzMD1zPT57dHJ5e2NvbnN0e29wZW5hcGk6b309cztyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJi9eM1wuMFwuKD86WzEtOV1cZCp8MCkkLy50ZXN0KG8pfWNhdGNoe3JldHVybiExfX0saXNPcGVuQVBJMzE9cz0+e3RyeXtjb25zdHtvcGVuYXBpOm99PXM7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBvJiYvXjNcLjFcLig/OlsxLTldXGQqfDApJC8udGVzdChvKX1jYXRjaHtyZXR1cm4hMX19LGlzT3BlbkFQSTM9cz0+aXNPcGVuQVBJMzAocyl8fGlzT3BlbkFQSTMxKHMpfHwocz0+e3RyeXtjb25zdHtvcGVuYXBpOm99PXM7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBvJiYvXjNcLjJcLig/OlsxLTldXGQqfDApJC8udGVzdChvKX1jYXRjaHtyZXR1cm4hMX19KShzKSxmdT17bmFtZToib3BlbmFwaS0yIixtYXRjaDpzPT4ocz0+e3RyeXtjb25zdHtzd2FnZ2VyOm99PXM7cmV0dXJuIjIuMCI9PT1vfWNhdGNoe3JldHVybiExfX0pKHMpLG5vcm1hbGl6ZShzKXtjb25zdHtzcGVjOm99PW5vcm1hbGl6ZSh7c3BlYzpzfSk7cmV0dXJuIG99LHJlc29sdmU6YXN5bmMgcz0+YXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU9wZW5BUEkyU3RyYXRlZ3kocyl7cmV0dXJuIHJlc29sdmVHZW5lcmljU3RyYXRlZ3kocyl9KHMpfSxtdT1mdTtjb25zdCBndT17bmFtZToib3BlbmFwaS0zLTAiLG1hdGNoOnM9PmlzT3BlbkFQSTMwKHMpLG5vcm1hbGl6ZShzKXtjb25zdHtzcGVjOm99PW5vcm1hbGl6ZSh7c3BlYzpzfSk7cmV0dXJuIG99LHJlc29sdmU6YXN5bmMgcz0+YXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU9wZW5BUEkzMFN0cmF0ZWd5KHMpe3JldHVybiByZXNvbHZlR2VuZXJpY1N0cmF0ZWd5KHMpfShzKX0seXU9Z3U7dmFyIHZ1PV9fd2VicGFja19yZXF1aXJlX18oMzQwMzUpO2Z1bmN0aW9uIF9yZWR1Y2VkKHMpe3JldHVybiBzJiZzWyJAQHRyYW5zZHVjZXIvcmVkdWNlZCJdP3M6eyJAQHRyYW5zZHVjZXIvdmFsdWUiOnMsIkBAdHJhbnNkdWNlci9yZWR1Y2VkIjohMH19dmFyIGJ1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gWEFsbChzLG8pe3RoaXMueGY9byx0aGlzLmY9cyx0aGlzLmFsbD0hMH1yZXR1cm4gWEFsbC5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9pbml0Il09X3hmQmFzZV9pbml0LFhBbGwucHJvdG90eXBlWyJAQHRyYW5zZHVjZXIvcmVzdWx0Il09ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuYWxsJiYocz10aGlzLnhmWyJAQHRyYW5zZHVjZXIvc3RlcCJdKHMsITApKSx0aGlzLnhmWyJAQHRyYW5zZHVjZXIvcmVzdWx0Il0ocyl9LFhBbGwucHJvdG90eXBlWyJAQHRyYW5zZHVjZXIvc3RlcCJdPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHRoaXMuZihvKXx8KHRoaXMuYWxsPSExLHM9X3JlZHVjZWQodGhpcy54ZlsiQEB0cmFuc2R1Y2VyL3N0ZXAiXShzLCExKSkpLHN9LFhBbGx9KCk7ZnVuY3Rpb24gX3hhbGwocyl7cmV0dXJuIGZ1bmN0aW9uKG8pe3JldHVybiBuZXcgYnUocyxvKX19dmFyIFN1PV9jdXJyeTIoX2Rpc3BhdGNoYWJsZShbImFsbCJdLF94YWxsLChmdW5jdGlvbiBhbGwocyxvKXtmb3IodmFyIGk9MDtpPG8ubGVuZ3RoOyl7aWYoIXMob1tpXSkpcmV0dXJuITE7aSs9MX1yZXR1cm4hMH0pKSk7Y29uc3QgX3U9U3U7Y2xhc3MgQW5ub3RhdGlvbiBleHRlbmRzIHZ1Lk9te2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJhbm5vdGF0aW9uIn1nZXQgY29kZSgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuZ2V0KCJjb2RlIil9c2V0IGNvZGUocyl7dGhpcy5hdHRyaWJ1dGVzLnNldCgiY29kZSIscyl9fWNvbnN0IEV1PUFubm90YXRpb247Y2xhc3MgQ29tbWVudCBleHRlbmRzIHZ1Lk9te2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJjb21tZW50In19Y29uc3Qgd3U9Q29tbWVudDtjbGFzcyBQYXJzZVJlc3VsdCBleHRlbmRzIHZ1LndFe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJwYXJzZVJlc3VsdCJ9Z2V0IGFwaSgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmZpbHRlcigocz0+cy5jbGFzc2VzLmNvbnRhaW5zKCJhcGkiKSkpLmZpcnN0fWdldCByZXN1bHRzKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4uZmlsdGVyKChzPT5zLmNsYXNzZXMuY29udGFpbnMoInJlc3VsdCIpKSl9Z2V0IHJlc3VsdCgpe3JldHVybiB0aGlzLnJlc3VsdHMuZmlyc3R9Z2V0IGFubm90YXRpb25zKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4uZmlsdGVyKChzPT4iYW5ub3RhdGlvbiI9PT1zLmVsZW1lbnQpKX1nZXQgd2FybmluZ3MoKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5maWx0ZXIoKHM9PiJhbm5vdGF0aW9uIj09PXMuZWxlbWVudCYmcy5jbGFzc2VzLmNvbnRhaW5zKCJ3YXJuaW5nIikpKX1nZXQgZXJyb3JzKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4uZmlsdGVyKChzPT4iYW5ub3RhdGlvbiI9PT1zLmVsZW1lbnQmJnMuY2xhc3Nlcy5jb250YWlucygiZXJyb3IiKSkpfWdldCBpc0VtcHR5KCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ucmVqZWN0KChzPT4iYW5ub3RhdGlvbiI9PT1zLmVsZW1lbnQpKS5pc0VtcHR5fXJlcGxhY2VSZXN1bHQocyl7Y29uc3R7cmVzdWx0Om99PXRoaXM7aWYoaGMobykpcmV0dXJuITE7Y29uc3QgaT10aGlzLmNvbnRlbnQuZmluZEluZGV4KChzPT5zPT09bykpO3JldHVybi0xIT09aSYmKHRoaXMuY29udGVudFtpXT1zLCEwKX19Y29uc3QgeHU9UGFyc2VSZXN1bHQsaGFzTWV0aG9kPShzLG8pPT4ib2JqZWN0Ij09dHlwZW9mIG8mJm51bGwhPT1vJiZzIGluIG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBvW3NdLGhhc0Jhc2ljRWxlbWVudFByb3BzPXM9PiJvYmplY3QiPT10eXBlb2YgcyYmbnVsbCE9cyYmIl9zdG9yZWRFbGVtZW50ImluIHMmJiJzdHJpbmciPT10eXBlb2Ygcy5fc3RvcmVkRWxlbWVudCYmIl9jb250ZW50ImluIHMscHJpbWl0aXZlRXE9KHMsbyk9PiJvYmplY3QiPT10eXBlb2YgbyYmbnVsbCE9PW8mJiJwcmltaXRpdmUiaW4gbyYmKCJmdW5jdGlvbiI9PXR5cGVvZiBvLnByaW1pdGl2ZSYmby5wcmltaXRpdmUoKT09PXMpLGhhc0NsYXNzPShzLG8pPT4ib2JqZWN0Ij09dHlwZW9mIG8mJm51bGwhPT1vJiYiY2xhc3NlcyJpbiBvJiYoQXJyYXkuaXNBcnJheShvLmNsYXNzZXMpfHxvLmNsYXNzZXMgaW5zdGFuY2VvZiB2dS53RSkmJm8uY2xhc3Nlcy5pbmNsdWRlcyhzKSxpc0VsZW1lbnRUeXBlPShzLG8pPT4ib2JqZWN0Ij09dHlwZW9mIG8mJm51bGwhPT1vJiYiZWxlbWVudCJpbiBvJiZvLmVsZW1lbnQ9PT1zLGhlbHBlcnM9cz0+cyh7aGFzTWV0aG9kLGhhc0Jhc2ljRWxlbWVudFByb3BzLHByaW1pdGl2ZUVxLGlzRWxlbWVudFR5cGUsaGFzQ2xhc3N9KSxrdT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMscHJpbWl0aXZlRXE6b30pPT5pPT5pIGluc3RhbmNlb2YgdnUuSGd8fHMoaSkmJm8odm9pZCAwLGkpKSksT3U9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLHByaW1pdGl2ZUVxOm99KT0+aT0+aSBpbnN0YW5jZW9mIHZ1Lk9tfHxzKGkpJiZvKCJzdHJpbmciLGkpKSksQXU9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLHByaW1pdGl2ZUVxOm99KT0+aT0+aSBpbnN0YW5jZW9mIHZ1LmtUfHxzKGkpJiZvKCJudW1iZXIiLGkpKSksQ3U9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLHByaW1pdGl2ZUVxOm99KT0+aT0+aSBpbnN0YW5jZW9mIHZ1Lk9zfHxzKGkpJiZvKCJudWxsIixpKSkpLGp1PWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxwcmltaXRpdmVFcTpvfSk9Pmk9PmkgaW5zdGFuY2VvZiB2dS5iZHx8cyhpKSYmbygiYm9vbGVhbiIsaSkpKSxQdT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMscHJpbWl0aXZlRXE6byxoYXNNZXRob2Q6aX0pPT5hPT5hIGluc3RhbmNlb2YgdnUuU2h8fHMoYSkmJm8oIm9iamVjdCIsYSkmJmkoImtleXMiLGEpJiZpKCJ2YWx1ZXMiLGEpJiZpKCJpdGVtcyIsYSkpKSxJdT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMscHJpbWl0aXZlRXE6byxoYXNNZXRob2Q6aX0pPT5hPT5hIGluc3RhbmNlb2YgdnUud0UmJiEoYSBpbnN0YW5jZW9mIHZ1LlNoKXx8cyhhKSYmbygiYXJyYXkiLGEpJiZpKCJwdXNoIixhKSYmaSgidW5zaGlmdCIsYSkmJmkoIm1hcCIsYSkmJmkoInJlZHVjZSIsYSkpKSxUdT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIHZ1LlByfHxzKGEpJiZvKCJtZW1iZXIiLGEpJiZpKHZvaWQgMCxhKSkpLE51PWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgdnUuRnR8fHMoYSkmJm8oImxpbmsiLGEpJiZpKHZvaWQgMCxhKSkpLE11PWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgdnUuc0l8fHMoYSkmJm8oInJlZiIsYSkmJmkodm9pZCAwLGEpKSksUnU9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBFdXx8cyhhKSYmbygiYW5ub3RhdGlvbiIsYSkmJmkoImFycmF5IixhKSkpLER1PWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2Ygd3V8fHMoYSkmJm8oImNvbW1lbnQiLGEpJiZpKCJzdHJpbmciLGEpKSksTHU9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiB4dXx8cyhhKSYmbygicGFyc2VSZXN1bHQiLGEpJiZpKCJhcnJheSIsYSkpKSxpc1ByaW1pdGl2ZUVsZW1lbnQ9cz0+aXNFbGVtZW50VHlwZSgib2JqZWN0IixzKXx8aXNFbGVtZW50VHlwZSgiYXJyYXkiLHMpfHxpc0VsZW1lbnRUeXBlKCJib29sZWFuIixzKXx8aXNFbGVtZW50VHlwZSgibnVtYmVyIixzKXx8aXNFbGVtZW50VHlwZSgic3RyaW5nIixzKXx8aXNFbGVtZW50VHlwZSgibnVsbCIscyl8fGlzRWxlbWVudFR5cGUoIm1lbWJlciIscyksaGFzRWxlbWVudFNvdXJjZU1hcD1zPT4hIWt1KHMpJiYoTnVtYmVyLmlzSW50ZWdlcihzLnN0YXJ0UG9zaXRpb25Sb3cpJiZOdW1iZXIuaXNJbnRlZ2VyKHMuc3RhcnRQb3NpdGlvbkNvbHVtbikmJk51bWJlci5pc0ludGVnZXIocy5zdGFydEluZGV4KSYmTnVtYmVyLmlzSW50ZWdlcihzLmVuZFBvc2l0aW9uUm93KSYmTnVtYmVyLmlzSW50ZWdlcihzLmVuZFBvc2l0aW9uQ29sdW1uKSYmTnVtYmVyLmlzSW50ZWdlcihzLmVuZEluZGV4KSksaW5jbHVkZXNTeW1ib2xzPShzLG8pPT57aWYoMD09PXMubGVuZ3RoKXJldHVybiEwO2NvbnN0IGk9by5hdHRyaWJ1dGVzLmdldCgic3ltYm9scyIpO3JldHVybiEhSXUoaSkmJl91KEhhKGkudG9WYWx1ZSgpKSxzKX0saW5jbHVkZXNDbGFzc2VzPShzLG8pPT4wPT09cy5sZW5ndGh8fF91KEhhKG8uY2xhc3Nlcy50b1ZhbHVlKCkpLHMpO2NvbnN0IGVzX1Q9ZnVuY3Rpb24oKXtyZXR1cm4hMH07Y29uc3QgZXNfRj1mdW5jdGlvbigpe3JldHVybiExfSxnZXRWaXNpdEZuPShzLG8saSk9Pntjb25zdCBhPXNbb107aWYobnVsbCE9YSl7aWYoIWkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhKXJldHVybiBhO2NvbnN0IHM9aT9hLmxlYXZlOmEuZW50ZXI7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHMpcmV0dXJuIHN9ZWxzZXtjb25zdCBhPWk/cy5sZWF2ZTpzLmVudGVyO2lmKG51bGwhPWEpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXJldHVybiBhO2NvbnN0IHM9YVtvXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgcylyZXR1cm4gc319cmV0dXJuIG51bGx9LEZ1PXt9LGdldE5vZGVUeXBlPXM9Pm51bGw9PXM/dm9pZCAwOnMudHlwZSxpc05vZGU9cz0+InN0cmluZyI9PXR5cGVvZiBnZXROb2RlVHlwZShzKSxjbG9uZU5vZGU9cz0+T2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YocyksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocykpLG1lcmdlQWxsPShzLHt2aXNpdEZuR2V0dGVyOm89Z2V0VmlzaXRGbixub2RlVHlwZUdldHRlcjppPWdldE5vZGVUeXBlLGJyZWFrU3ltYm9sOmE9RnUsZGVsZXRlTm9kZVN5bWJvbDp1PW51bGwsc2tpcFZpc2l0aW5nTm9kZVN5bWJvbDpfPSExLGV4cG9zZUVkaXRzOnc9ITF9PXt9KT0+e2NvbnN0IHg9U3ltYm9sKCJza2lwIiksQz1uZXcgQXJyYXkocy5sZW5ndGgpLmZpbGwoeCk7cmV0dXJue2VudGVyKGosTCxCLCQsVSxWKXtsZXQgej1qLFk9ITE7Y29uc3QgWj17Li4uVixyZXBsYWNlV2l0aChzLG8pe1YucmVwbGFjZVdpdGgocyxvKSx6PXN9fTtmb3IobGV0IGo9MDtqPHMubGVuZ3RoO2orPTEpaWYoQ1tqXT09PXgpe2NvbnN0IHg9byhzW2pdLGkoeiksITEpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB4KXtjb25zdCBvPXguY2FsbChzW2pdLHosTCxCLCQsVSxaKTtpZigiZnVuY3Rpb24iPT10eXBlb2YobnVsbD09bz92b2lkIDA6by50aGVuKSl0aHJvdyBuZXcgR28oIkFzeW5jIHZpc2l0b3Igbm90IHN1cHBvcnRlZCBpbiBzeW5jIG1vZGUiLHt2aXNpdG9yOnNbal0sdmlzaXRGbjp4fSk7aWYobz09PV8pQ1tqXT16O2Vsc2UgaWYobz09PWEpQ1tqXT1hO2Vsc2V7aWYobz09PXUpcmV0dXJuIG87aWYodm9pZCAwIT09byl7aWYoIXcpcmV0dXJuIG87ej1vLFk9ITB9fX19cmV0dXJuIFk/ejp2b2lkIDB9LGxlYXZlKHUsdyxqLEwsQiwkKXtsZXQgVT11O2NvbnN0IFY9ey4uLiQscmVwbGFjZVdpdGgocyxvKXskLnJlcGxhY2VXaXRoKHMsbyksVT1zfX07Zm9yKGxldCB1PTA7dTxzLmxlbmd0aDt1Kz0xKWlmKENbdV09PT14KXtjb25zdCB4PW8oc1t1XSxpKFUpLCEwKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgeCl7Y29uc3Qgbz14LmNhbGwoc1t1XSxVLHcsaixMLEIsVik7aWYoImZ1bmN0aW9uIj09dHlwZW9mKG51bGw9PW8/dm9pZCAwOm8udGhlbikpdGhyb3cgbmV3IEdvKCJBc3luYyB2aXNpdG9yIG5vdCBzdXBwb3J0ZWQgaW4gc3luYyBtb2RlIix7dmlzaXRvcjpzW3VdLHZpc2l0Rm46eH0pO2lmKG89PT1hKUNbdV09YTtlbHNlIGlmKHZvaWQgMCE9PW8mJm8hPT1fKXJldHVybiBvfX1lbHNlIENbdV09PT1VJiYoQ1t1XT14KX19fTttZXJnZUFsbFtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5wcm9taXNpZnkuY3VzdG9tIildPShzLHt2aXNpdEZuR2V0dGVyOm89Z2V0VmlzaXRGbixub2RlVHlwZUdldHRlcjppPWdldE5vZGVUeXBlLGJyZWFrU3ltYm9sOmE9RnUsZGVsZXRlTm9kZVN5bWJvbDp1PW51bGwsc2tpcFZpc2l0aW5nTm9kZVN5bWJvbDpfPSExLGV4cG9zZUVkaXRzOnc9ITF9PXt9KT0+e2NvbnN0IHg9U3ltYm9sKCJza2lwIiksQz1uZXcgQXJyYXkocy5sZW5ndGgpLmZpbGwoeCk7cmV0dXJue2FzeW5jIGVudGVyKGosTCxCLCQsVSxWKXtsZXQgej1qLFk9ITE7Y29uc3QgWj17Li4uVixyZXBsYWNlV2l0aChzLG8pe1YucmVwbGFjZVdpdGgocyxvKSx6PXN9fTtmb3IobGV0IGo9MDtqPHMubGVuZ3RoO2orPTEpaWYoQ1tqXT09PXgpe2NvbnN0IHg9byhzW2pdLGkoeiksITEpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB4KXtjb25zdCBvPWF3YWl0IHguY2FsbChzW2pdLHosTCxCLCQsVSxaKTtpZihvPT09XylDW2pdPXo7ZWxzZSBpZihvPT09YSlDW2pdPWE7ZWxzZXtpZihvPT09dSlyZXR1cm4gbztpZih2b2lkIDAhPT1vKXtpZighdylyZXR1cm4gbzt6PW8sWT0hMH19fX1yZXR1cm4gWT96OnZvaWQgMH0sYXN5bmMgbGVhdmUodSx3LGosTCxCLCQpe2xldCBVPXU7Y29uc3QgVj17Li4uJCxyZXBsYWNlV2l0aChzLG8peyQucmVwbGFjZVdpdGgocyxvKSxVPXN9fTtmb3IobGV0IHU9MDt1PHMubGVuZ3RoO3UrPTEpaWYoQ1t1XT09PXgpe2NvbnN0IHg9byhzW3VdLGkoVSksITApO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB4KXtjb25zdCBvPWF3YWl0IHguY2FsbChzW3VdLFUsdyxqLEwsQixWKTtpZihvPT09YSlDW3VdPWE7ZWxzZSBpZih2b2lkIDAhPT1vJiZvIT09XylyZXR1cm4gb319ZWxzZSBDW3VdPT09VSYmKENbdV09eCl9fX07Y29uc3QgdmlzaXQ9KHMsbyx7a2V5TWFwOmk9bnVsbCxzdGF0ZTphPXt9LGJyZWFrU3ltYm9sOnU9RnUsZGVsZXRlTm9kZVN5bWJvbDpfPW51bGwsc2tpcFZpc2l0aW5nTm9kZVN5bWJvbDp3PSExLHZpc2l0Rm5HZXR0ZXI6eD1nZXRWaXNpdEZuLG5vZGVUeXBlR2V0dGVyOkM9Z2V0Tm9kZVR5cGUsbm9kZVByZWRpY2F0ZTpqPWlzTm9kZSxub2RlQ2xvbmVGbjpMPWNsb25lTm9kZSxkZXRlY3RDeWNsZXM6Qj0hMCxkZXRlY3RDeWNsZXNDYWxsYmFjazokPW51bGx9PXt9KT0+e2NvbnN0IFU9aXx8e307bGV0IFYseixZPUFycmF5LmlzQXJyYXkocyksWj1bc10sZWU9LTEsaWU9W10sYWU9cztjb25zdCBjZT1bXSxsZT1bXTtkb3tlZSs9MTtjb25zdCBzPWVlPT09Wi5sZW5ndGg7bGV0IGk7Y29uc3QgZmU9cyYmMCE9PWllLmxlbmd0aDtpZihzKXtpZihpPTA9PT1sZS5sZW5ndGg/dm9pZCAwOmNlLnBvcCgpLGFlPXosej1sZS5wb3AoKSxmZSlpZihZKXthZT1hZS5zbGljZSgpO2xldCBzPTA7Zm9yKGNvbnN0W28saV1vZiBpZSl7Y29uc3QgYT1vLXM7aT09PV8/KGFlLnNwbGljZShhLDEpLHMrPTEpOmFlW2FdPWl9fWVsc2V7YWU9TChhZSk7Zm9yKGNvbnN0W3Msb11vZiBpZSlhZVtzXT1vfWVlPVYuaW5kZXgsWj1WLmtleXMsaWU9Vi5lZGl0cyxZPVYuaW5BcnJheSxWPVYucHJldn1lbHNlIGlmKHohPT1fJiZ2b2lkIDAhPT16KXtpZihpPVk/ZWU6WltlZV0sYWU9eltpXSxhZT09PV98fHZvaWQgMD09PWFlKWNvbnRpbnVlO2NlLnB1c2goaSl9bGV0IHllO2lmKCFBcnJheS5pc0FycmF5KGFlKSl7dmFyIHBlO2lmKCFqKGFlKSl0aHJvdyBuZXcgR28oYEludmFsaWQgQVNUIE5vZGU6ICAke1N0cmluZyhhZSl9YCx7bm9kZTphZX0pO2lmKEImJmxlLmluY2x1ZGVzKGFlKSl7ImZ1bmN0aW9uIj09dHlwZW9mICQmJiQoYWUsaSx6LGNlLGxlKSxjZS5wb3AoKTtjb250aW51ZX1jb25zdCBfPXgobyxDKGFlKSxzKTtpZihfKXtmb3IoY29uc3RbcyxpXW9mIE9iamVjdC5lbnRyaWVzKGEpKW9bc109aTtjb25zdCB1PXtyZXBsYWNlV2l0aChvLGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBhP2EobyxhZSxpLHosY2UsbGUpOnomJih6W2ldPW8pLHN8fChhZT1vKX19O3llPV8uY2FsbChvLGFlLGkseixjZSxsZSx1KX1pZigiZnVuY3Rpb24iPT10eXBlb2YobnVsbD09PShwZT15ZSl8fHZvaWQgMD09PXBlP3ZvaWQgMDpwZS50aGVuKSl0aHJvdyBuZXcgR28oIkFzeW5jIHZpc2l0b3Igbm90IHN1cHBvcnRlZCBpbiBzeW5jIG1vZGUiLHt2aXNpdG9yOm8sdmlzaXRGbjpffSk7aWYoeWU9PT11KWJyZWFrO2lmKHllPT09dyl7aWYoIXMpe2NlLnBvcCgpO2NvbnRpbnVlfX1lbHNlIGlmKHZvaWQgMCE9PXllJiYoaWUucHVzaChbaSx5ZV0pLCFzKSl7aWYoIWooeWUpKXtjZS5wb3AoKTtjb250aW51ZX1hZT15ZX19dmFyIGRlO2lmKHZvaWQgMD09PXllJiZmZSYmaWUucHVzaChbaSxhZV0pLCFzKVY9e2luQXJyYXk6WSxpbmRleDplZSxrZXlzOlosZWRpdHM6aWUscHJldjpWfSxZPUFycmF5LmlzQXJyYXkoYWUpLFo9WT9hZTpudWxsIT09KGRlPVVbQyhhZSldKSYmdm9pZCAwIT09ZGU/ZGU6W10sZWU9LTEsaWU9W10seiE9PV8mJnZvaWQgMCE9PXomJmxlLnB1c2goeiksej1hZX13aGlsZSh2b2lkIDAhPT1WKTtyZXR1cm4gMCE9PWllLmxlbmd0aD9pZVtpZS5sZW5ndGgtMV1bMV06c307dmlzaXRbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbSIpXT1hc3luYyhzLG8se2tleU1hcDppPW51bGwsc3RhdGU6YT17fSxicmVha1N5bWJvbDp1PUZ1LGRlbGV0ZU5vZGVTeW1ib2w6Xz1udWxsLHNraXBWaXNpdGluZ05vZGVTeW1ib2w6dz0hMSx2aXNpdEZuR2V0dGVyOng9Z2V0VmlzaXRGbixub2RlVHlwZUdldHRlcjpDPWdldE5vZGVUeXBlLG5vZGVQcmVkaWNhdGU6aj1pc05vZGUsbm9kZUNsb25lRm46TD1jbG9uZU5vZGUsZGV0ZWN0Q3ljbGVzOkI9ITAsZGV0ZWN0Q3ljbGVzQ2FsbGJhY2s6JD1udWxsfT17fSk9Pntjb25zdCBVPWl8fHt9O2xldCBWLHosWT1BcnJheS5pc0FycmF5KHMpLFo9W3NdLGVlPS0xLGllPVtdLGFlPXM7Y29uc3QgY2U9W10sbGU9W107ZG97ZWUrPTE7Y29uc3Qgcz1lZT09PVoubGVuZ3RoO2xldCBpO2NvbnN0IGRlPXMmJjAhPT1pZS5sZW5ndGg7aWYocyl7aWYoaT0wPT09bGUubGVuZ3RoP3ZvaWQgMDpjZS5wb3AoKSxhZT16LHo9bGUucG9wKCksZGUpaWYoWSl7YWU9YWUuc2xpY2UoKTtsZXQgcz0wO2Zvcihjb25zdFtvLGldb2YgaWUpe2NvbnN0IGE9by1zO2k9PT1fPyhhZS5zcGxpY2UoYSwxKSxzKz0xKTphZVthXT1pfX1lbHNle2FlPUwoYWUpO2Zvcihjb25zdFtzLG9db2YgaWUpYWVbc109b31lZT1WLmluZGV4LFo9Vi5rZXlzLGllPVYuZWRpdHMsWT1WLmluQXJyYXksVj1WLnByZXZ9ZWxzZSBpZih6IT09XyYmdm9pZCAwIT09eil7aWYoaT1ZP2VlOlpbZWVdLGFlPXpbaV0sYWU9PT1ffHx2b2lkIDA9PT1hZSljb250aW51ZTtjZS5wdXNoKGkpfWxldCBmZTtpZighQXJyYXkuaXNBcnJheShhZSkpe2lmKCFqKGFlKSl0aHJvdyBuZXcgR28oYEludmFsaWQgQVNUIE5vZGU6ICR7U3RyaW5nKGFlKX1gLHtub2RlOmFlfSk7aWYoQiYmbGUuaW5jbHVkZXMoYWUpKXsiZnVuY3Rpb24iPT10eXBlb2YgJCYmJChhZSxpLHosY2UsbGUpLGNlLnBvcCgpO2NvbnRpbnVlfWNvbnN0IF89eChvLEMoYWUpLHMpO2lmKF8pe2Zvcihjb25zdFtzLGldb2YgT2JqZWN0LmVudHJpZXMoYSkpb1tzXT1pO2NvbnN0IHU9e3JlcGxhY2VXaXRoKG8sYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGE/YShvLGFlLGkseixjZSxsZSk6eiYmKHpbaV09byksc3x8KGFlPW8pfX07ZmU9YXdhaXQgXy5jYWxsKG8sYWUsaSx6LGNlLGxlLHUpfWlmKGZlPT09dSlicmVhaztpZihmZT09PXcpe2lmKCFzKXtjZS5wb3AoKTtjb250aW51ZX19ZWxzZSBpZih2b2lkIDAhPT1mZSYmKGllLnB1c2goW2ksZmVdKSwhcykpe2lmKCFqKGZlKSl7Y2UucG9wKCk7Y29udGludWV9YWU9ZmV9fXZhciBwZTtpZih2b2lkIDA9PT1mZSYmZGUmJmllLnB1c2goW2ksYWVdKSwhcylWPXtpbkFycmF5OlksaW5kZXg6ZWUsa2V5czpaLGVkaXRzOmllLHByZXY6Vn0sWT1BcnJheS5pc0FycmF5KGFlKSxaPVk/YWU6bnVsbCE9PShwZT1VW0MoYWUpXSkmJnZvaWQgMCE9PXBlP3BlOltdLGVlPS0xLGllPVtdLHohPT1fJiZ2b2lkIDAhPT16JiZsZS5wdXNoKHopLHo9YWV9d2hpbGUodm9pZCAwIT09Vik7cmV0dXJuIDAhPT1pZS5sZW5ndGg/aWVbaWUubGVuZ3RoLTFdWzFdOnN9O2NvbnN0IEJ1PWNsYXNzIENsb25lRXJyb3IgZXh0ZW5kcyBHb3t2YWx1ZTtjb25zdHJ1Y3RvcihzLG8pe3N1cGVyKHMsbyksdm9pZCAwIT09byYmKHRoaXMudmFsdWU9by52YWx1ZSl9fTtjb25zdCAkdT1jbGFzcyBEZWVwQ2xvbmVFcnJvciBleHRlbmRzIEJ1e307Y29uc3QgcXU9Y2xhc3MgU2hhbGxvd0Nsb25lRXJyb3IgZXh0ZW5kcyBCdXt9O2NvbnN0IFV1PV9jdXJyeTIoKGZ1bmN0aW9uIG1hcE9iakluZGV4ZWQocyxvKXtyZXR1cm4gX2FycmF5UmVkdWNlKChmdW5jdGlvbihpLGEpe3JldHVybiBpW2FdPXMob1thXSxhLG8pLGl9KSx7fSx3YShvKSl9KSk7Y29uc3QgVnU9X2N1cnJ5MSgoZnVuY3Rpb24gaXNOaWwocyl7cmV0dXJuIG51bGw9PXN9KSk7dmFyIHp1PV9jdXJyeTIoKGZ1bmN0aW9uIGhhc1BhdGgocyxvKXtpZigwPT09cy5sZW5ndGh8fFZ1KG8pKXJldHVybiExO2Zvcih2YXIgaT1vLGE9MDthPHMubGVuZ3RoOyl7aWYoVnUoaSl8fCFfaGFzKHNbYV0saSkpcmV0dXJuITE7aT1pW3NbYV1dLGErPTF9cmV0dXJuITB9KSk7Y29uc3QgV3U9enU7dmFyIEp1PV9jdXJyeTIoKGZ1bmN0aW9uIGhhcyhzLG8pe3JldHVybiBXdShbc10sbyl9KSk7Y29uc3QgSHU9SnU7Y29uc3QgS3U9X2N1cnJ5MygoZnVuY3Rpb24gcHJvcFNhdGlzZmllcyhzLG8saSl7cmV0dXJuIHMobmEobyxpKSl9KSk7Y29uc3QgR3U9X2N1cnJ5MihfcGF0aCk7dmFyIFl1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gWERyb3BXaGlsZShzLG8pe3RoaXMueGY9byx0aGlzLmY9c31yZXR1cm4gWERyb3BXaGlsZS5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9pbml0Il09X3hmQmFzZV9pbml0LFhEcm9wV2hpbGUucHJvdG90eXBlWyJAQHRyYW5zZHVjZXIvcmVzdWx0Il09X3hmQmFzZV9yZXN1bHQsWERyb3BXaGlsZS5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9zdGVwIl09ZnVuY3Rpb24ocyxvKXtpZih0aGlzLmYpe2lmKHRoaXMuZihvKSlyZXR1cm4gczt0aGlzLmY9bnVsbH1yZXR1cm4gdGhpcy54ZlsiQEB0cmFuc2R1Y2VyL3N0ZXAiXShzLG8pfSxYRHJvcFdoaWxlfSgpO2Z1bmN0aW9uIF94ZHJvcFdoaWxlKHMpe3JldHVybiBmdW5jdGlvbihvKXtyZXR1cm4gbmV3IFl1KHMsbyl9fWNvbnN0IFh1PV9jdXJyeTIoX2Rpc3BhdGNoYWJsZShbImRyb3BXaGlsZSJdLF94ZHJvcFdoaWxlLChmdW5jdGlvbiBkcm9wV2hpbGUocyxvKXtmb3IodmFyIGk9MCxhPW8ubGVuZ3RoO2k8YSYmcyhvW2ldKTspaSs9MTtyZXR1cm4gUmkoaSwxLzAsbyl9KSkpO2NvbnN0IFF1PXVhKChmdW5jdGlvbihzLG8pe3JldHVybiBwaXBlKEJhKCIiKSxYdShIYShzKSksSmEoIiIpKShvKX0pKSxkZXJlZmVyZW5jZT0ocyxvKT0+e2NvbnN0IGk9ZWEocyxvKTtyZXR1cm4gVXUoKHM9PntpZihwdShzKSYmSHUoIiRyZWYiLHMpJiZLdShSYywiJHJlZiIscykpe2NvbnN0IG89R3UoWyIkcmVmIl0scyksYT1RdSgiIy8iLG8pO3JldHVybiBHdShhLnNwbGl0KCIvIiksaSl9cmV0dXJuIHB1KHMpP2RlcmVmZXJlbmNlKHMsaSk6c30pLHMpfSxhc3NpZ25Tb3VyY2VNYXA9KHMsbyk9PihzLnN0YXJ0UG9zaXRpb25Sb3c9bnVsbD09bz92b2lkIDA6by5zdGFydFBvc2l0aW9uUm93LHMuc3RhcnRQb3NpdGlvbkNvbHVtbj1udWxsPT1vP3ZvaWQgMDpvLnN0YXJ0UG9zaXRpb25Db2x1bW4scy5zdGFydEluZGV4PW51bGw9PW8/dm9pZCAwOm8uc3RhcnRJbmRleCxzLmVuZFBvc2l0aW9uUm93PW51bGw9PW8/dm9pZCAwOm8uZW5kUG9zaXRpb25Sb3cscy5lbmRQb3NpdGlvbkNvbHVtbj1udWxsPT1vP3ZvaWQgMDpvLmVuZFBvc2l0aW9uQ29sdW1uLHMuZW5kSW5kZXg9bnVsbD09bz92b2lkIDA6by5lbmRJbmRleCxzKSxjbG9uZURlZXA9KHMsbz17fSk9Pntjb25zdHt2aXNpdGVkOmk9bmV3IFdlYWtNYXB9PW8sYT17Li4ubyx2aXNpdGVkOml9O2lmKGkuaGFzKHMpKXJldHVybiBpLmdldChzKTtpZihzIGluc3RhbmNlb2YgdnUuS2V5VmFsdWVQYWlyKXtjb25zdHtrZXk6byx2YWx1ZTp1fT1zLF89a3Uobyk/Y2xvbmVEZWVwKG8sYSk6byx3PWt1KHUpP2Nsb25lRGVlcCh1LGEpOnUseD1uZXcgdnUuS2V5VmFsdWVQYWlyKF8sdyk7cmV0dXJuIGkuc2V0KHMseCkseH1pZihzIGluc3RhbmNlb2YgdnUub3Qpe2NvbnN0IG1hcHBlcj1zPT5jbG9uZURlZXAocyxhKSxvPVsuLi5zXS5tYXAobWFwcGVyKSx1PW5ldyB2dS5vdChvKTtyZXR1cm4gaS5zZXQocyx1KSx1fWlmKHMgaW5zdGFuY2VvZiB2dS5HNil7Y29uc3QgbWFwcGVyPXM9PmNsb25lRGVlcChzLGEpLG89Wy4uLnNdLm1hcChtYXBwZXIpLHU9bmV3IHZ1Lkc2KG8pO3JldHVybiBpLnNldChzLHUpLHV9aWYoa3Uocykpe2NvbnN0IG89Y2xvbmVTaGFsbG93KHMpO2lmKGkuc2V0KHMsbykscy5jb250ZW50KWlmKGt1KHMuY29udGVudCkpby5jb250ZW50PWNsb25lRGVlcChzLmNvbnRlbnQsYSk7ZWxzZSBpZihzLmNvbnRlbnQgaW5zdGFuY2VvZiB2dS5LZXlWYWx1ZVBhaXIpby5jb250ZW50PWNsb25lRGVlcChzLmNvbnRlbnQsYSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHMuY29udGVudCkpe2NvbnN0IG1hcHBlcj1zPT5jbG9uZURlZXAocyxhKTtvLmNvbnRlbnQ9cy5jb250ZW50Lm1hcChtYXBwZXIpfWVsc2Ugby5jb250ZW50PXMuY29udGVudDtlbHNlIG8uY29udGVudD1zLmNvbnRlbnQ7cmV0dXJuIG99dGhyb3cgbmV3ICR1KCJWYWx1ZSBwcm92aWRlZCB0byBjbG9uZURlZXAgZnVuY3Rpb24gY291bGRuJ3QgYmUgY2xvbmVkIix7dmFsdWU6c30pfTtjbG9uZURlZXAuc2FmZT1zPT57dHJ5e3JldHVybiBjbG9uZURlZXAocyl9Y2F0Y2h7cmV0dXJuIHN9fTtjb25zdCBjbG9uZVNoYWxsb3dLZXlWYWx1ZVBhaXI9cz0+e2NvbnN0e2tleTpvLHZhbHVlOml9PXM7cmV0dXJuIG5ldyB2dS5LZXlWYWx1ZVBhaXIobyxpKX0sY2xvbmVTaGFsbG93RWxlbWVudD1zPT57Y29uc3Qgbz1uZXcgcy5jb25zdHJ1Y3RvcjtpZihvLmVsZW1lbnQ9cy5lbGVtZW50LGhhc0VsZW1lbnRTb3VyY2VNYXAocykmJmFzc2lnblNvdXJjZU1hcChvLHMpLHMubWV0YS5sZW5ndGg+MCYmKG8uX21ldGE9Y2xvbmVEZWVwKHMubWV0YSkpLHMuYXR0cmlidXRlcy5sZW5ndGg+MCYmKG8uX2F0dHJpYnV0ZXM9Y2xvbmVEZWVwKHMuYXR0cmlidXRlcykpLGt1KHMuY29udGVudCkpe2NvbnN0IGk9cy5jb250ZW50O28uY29udGVudD1jbG9uZVNoYWxsb3dFbGVtZW50KGkpfWVsc2UgQXJyYXkuaXNBcnJheShzLmNvbnRlbnQpP28uY29udGVudD1bLi4ucy5jb250ZW50XTpzLmNvbnRlbnQgaW5zdGFuY2VvZiB2dS5LZXlWYWx1ZVBhaXI/by5jb250ZW50PWNsb25lU2hhbGxvd0tleVZhbHVlUGFpcihzLmNvbnRlbnQpOm8uY29udGVudD1zLmNvbnRlbnQ7cmV0dXJuIG99LGNsb25lU2hhbGxvdz1zPT57aWYocyBpbnN0YW5jZW9mIHZ1LktleVZhbHVlUGFpcilyZXR1cm4gY2xvbmVTaGFsbG93S2V5VmFsdWVQYWlyKHMpO2lmKHMgaW5zdGFuY2VvZiB2dS5vdClyZXR1cm4ocz0+e2NvbnN0IG89Wy4uLnNdO3JldHVybiBuZXcgdnUub3Qobyl9KShzKTtpZihzIGluc3RhbmNlb2YgdnUuRzYpcmV0dXJuKHM9Pntjb25zdCBvPVsuLi5zXTtyZXR1cm4gbmV3IHZ1Lkc2KG8pfSkocyk7aWYoa3UocykpcmV0dXJuIGNsb25lU2hhbGxvd0VsZW1lbnQocyk7dGhyb3cgbmV3IHF1KCJWYWx1ZSBwcm92aWRlZCB0byBjbG9uZVNoYWxsb3cgZnVuY3Rpb24gY291bGRuJ3QgYmUgY2xvbmVkIix7dmFsdWU6c30pfTtjbG9uZVNoYWxsb3cuc2FmZT1zPT57dHJ5e3JldHVybiBjbG9uZVNoYWxsb3cocyl9Y2F0Y2h7cmV0dXJuIHN9fTtjb25zdCB2aXNpdG9yX2dldE5vZGVUeXBlPXM9PlB1KHMpPyJPYmplY3RFbGVtZW50IjpJdShzKT8iQXJyYXlFbGVtZW50IjpUdShzKT8iTWVtYmVyRWxlbWVudCI6T3Uocyk/IlN0cmluZ0VsZW1lbnQiOmp1KHMpPyJCb29sZWFuRWxlbWVudCI6QXUocyk/Ik51bWJlckVsZW1lbnQiOkN1KHMpPyJOdWxsRWxlbWVudCI6TnUocyk/IkxpbmtFbGVtZW50IjpNdShzKT8iUmVmRWxlbWVudCI6dm9pZCAwLHZpc2l0b3JfY2xvbmVOb2RlPXM9Pmt1KHMpP2Nsb25lU2hhbGxvdyhzKTpjbG9uZU5vZGUocyksWnU9cGlwZSh2aXNpdG9yX2dldE5vZGVUeXBlLFJjKSxlcD17T2JqZWN0RWxlbWVudDpbImNvbnRlbnQiXSxBcnJheUVsZW1lbnQ6WyJjb250ZW50Il0sTWVtYmVyRWxlbWVudDpbImtleSIsInZhbHVlIl0sU3RyaW5nRWxlbWVudDpbXSxCb29sZWFuRWxlbWVudDpbXSxOdW1iZXJFbGVtZW50OltdLE51bGxFbGVtZW50OltdLFJlZkVsZW1lbnQ6W10sTGlua0VsZW1lbnQ6W10sQW5ub3RhdGlvbjpbXSxDb21tZW50OltdLFBhcnNlUmVzdWx0RWxlbWVudDpbImNvbnRlbnQiXX07Y2xhc3MgUHJlZGljYXRlVmlzaXRvcntyZXN1bHQ7cHJlZGljYXRlO3JldHVybk9uVHJ1ZTtyZXR1cm5PbkZhbHNlO2NvbnN0cnVjdG9yKHtwcmVkaWNhdGU6cz1lc19GLHJldHVybk9uVHJ1ZTpvLHJldHVybk9uRmFsc2U6aX09e30pe3RoaXMucmVzdWx0PVtdLHRoaXMucHJlZGljYXRlPXMsdGhpcy5yZXR1cm5PblRydWU9byx0aGlzLnJldHVybk9uRmFsc2U9aX1lbnRlcihzKXtyZXR1cm4gdGhpcy5wcmVkaWNhdGUocyk/KHRoaXMucmVzdWx0LnB1c2gocyksdGhpcy5yZXR1cm5PblRydWUpOnRoaXMucmV0dXJuT25GYWxzZX19Y29uc3QgdmlzaXRvcl92aXNpdD0ocyxvLHtrZXlNYXA6aT1lcCwuLi5hfT17fSk9PnZpc2l0KHMsbyx7a2V5TWFwOmksbm9kZVR5cGVHZXR0ZXI6dmlzaXRvcl9nZXROb2RlVHlwZSxub2RlUHJlZGljYXRlOlp1LG5vZGVDbG9uZUZuOnZpc2l0b3JfY2xvbmVOb2RlLC4uLmF9KTt2aXNpdG9yX3Zpc2l0W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLnByb21pc2lmeS5jdXN0b20iKV09YXN5bmMocyxvLHtrZXlNYXA6aT1lcCwuLi5hfT17fSk9PnZpc2l0W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLnByb21pc2lmeS5jdXN0b20iKV0ocyxvLHtrZXlNYXA6aSxub2RlVHlwZUdldHRlcjp2aXNpdG9yX2dldE5vZGVUeXBlLG5vZGVQcmVkaWNhdGU6WnUsbm9kZUNsb25lRm46dmlzaXRvcl9jbG9uZU5vZGUsLi4uYX0pO2NvbnN0IG5vZGVUeXBlR2V0dGVyPXM9PiJzdHJpbmciPT10eXBlb2YobnVsbD09cz92b2lkIDA6cy50eXBlKT9zLnR5cGU6dmlzaXRvcl9nZXROb2RlVHlwZShzKSx0cD17RXBoZW1lcmFsT2JqZWN0OlsiY29udGVudCJdLEVwaGVtZXJhbEFycmF5OlsiY29udGVudCJdLC4uLmVwfSx2YWx1ZV92aXNpdG9yX3Zpc2l0PShzLG8se2tleU1hcDppPXRwLC4uLmF9PXt9KT0+dmlzaXRvcl92aXNpdChzLG8se2tleU1hcDppLG5vZGVUeXBlR2V0dGVyLG5vZGVQcmVkaWNhdGU6ZXNfVCxkZXRlY3RDeWNsZXM6ITEsZGVsZXRlTm9kZVN5bWJvbDpTeW1ib2wuZm9yKCJkZWxldGUtbm9kZSIpLHNraXBWaXNpdGluZ05vZGVTeW1ib2w6U3ltYm9sLmZvcigic2tpcC12aXNpdGluZy1ub2RlIiksLi4uYX0pO3ZhbHVlX3Zpc2l0b3JfdmlzaXRbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbSIpXT1hc3luYyhzLHtrZXlNYXA6bz10cCwuLi5pfT17fSk9PnZpc2l0b3JfdmlzaXRbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbSIpXShzLHZpc2l0b3Ise2tleU1hcDpvLG5vZGVUeXBlR2V0dGVyLG5vZGVQcmVkaWNhdGU6ZXNfVCxkZXRlY3RDeWNsZXM6ITEsZGVsZXRlTm9kZVN5bWJvbDpTeW1ib2wuZm9yKCJkZWxldGUtbm9kZSIpLHNraXBWaXNpdGluZ05vZGVTeW1ib2w6U3ltYm9sLmZvcigic2tpcC12aXNpdGluZy1ub2RlIiksLi4uaX0pO2NvbnN0IHJwPWNsYXNzIEVwaGVtZXJhbEFycmF5e3R5cGU9IkVwaGVtZXJhbEFycmF5Ijtjb250ZW50PVtdO3JlZmVyZW5jZT12b2lkIDA7Y29uc3RydWN0b3Iocyl7dGhpcy5jb250ZW50PXMsdGhpcy5yZWZlcmVuY2U9W119dG9SZWZlcmVuY2UoKXtyZXR1cm4gdGhpcy5yZWZlcmVuY2V9dG9BcnJheSgpe3JldHVybiB0aGlzLnJlZmVyZW5jZS5wdXNoKC4uLnRoaXMuY29udGVudCksdGhpcy5yZWZlcmVuY2V9fTtjb25zdCBucD1jbGFzcyBFcGhlbWVyYWxPYmplY3R7dHlwZT0iRXBoZW1lcmFsT2JqZWN0Ijtjb250ZW50PVtdO3JlZmVyZW5jZT12b2lkIDA7Y29uc3RydWN0b3Iocyl7dGhpcy5jb250ZW50PXMsdGhpcy5yZWZlcmVuY2U9e319dG9SZWZlcmVuY2UoKXtyZXR1cm4gdGhpcy5yZWZlcmVuY2V9dG9PYmplY3QoKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzLnJlZmVyZW5jZSxPYmplY3QuZnJvbUVudHJpZXModGhpcy5jb250ZW50KSl9fTtjbGFzcyBWaXNpdG9ye09iamVjdEVsZW1lbnQ9e2VudGVyOnM9PntpZih0aGlzLnJlZmVyZW5jZXMuaGFzKHMpKXJldHVybiB0aGlzLnJlZmVyZW5jZXMuZ2V0KHMpLnRvUmVmZXJlbmNlKCk7Y29uc3Qgbz1uZXcgbnAocy5jb250ZW50KTtyZXR1cm4gdGhpcy5yZWZlcmVuY2VzLnNldChzLG8pLG99fTtFcGhlbWVyYWxPYmplY3Q9e2xlYXZlOnM9PnMudG9PYmplY3QoKX07TWVtYmVyRWxlbWVudD17ZW50ZXI6cz0+W3Mua2V5LHMudmFsdWVdfTtBcnJheUVsZW1lbnQ9e2VudGVyOnM9PntpZih0aGlzLnJlZmVyZW5jZXMuaGFzKHMpKXJldHVybiB0aGlzLnJlZmVyZW5jZXMuZ2V0KHMpLnRvUmVmZXJlbmNlKCk7Y29uc3Qgbz1uZXcgcnAocy5jb250ZW50KTtyZXR1cm4gdGhpcy5yZWZlcmVuY2VzLnNldChzLG8pLG99fTtFcGhlbWVyYWxBcnJheT17bGVhdmU6cz0+cy50b0FycmF5KCl9O3JlZmVyZW5jZXM9bmV3IFdlYWtNYXA7Qm9vbGVhbkVsZW1lbnQocyl7cmV0dXJuIHMudG9WYWx1ZSgpfU51bWJlckVsZW1lbnQocyl7cmV0dXJuIHMudG9WYWx1ZSgpfVN0cmluZ0VsZW1lbnQocyl7cmV0dXJuIHMudG9WYWx1ZSgpfU51bGxFbGVtZW50KCl7cmV0dXJuIG51bGx9UmVmRWxlbWVudChzLC4uLm8pe3ZhciBpO2NvbnN0IGE9b1szXTtyZXR1cm4iRXBoZW1lcmFsT2JqZWN0Ij09PShudWxsPT09KGk9YVthLmxlbmd0aC0xXSl8fHZvaWQgMD09PWk/dm9pZCAwOmkudHlwZSk/U3ltYm9sLmZvcigiZGVsZXRlLW5vZGUiKTpTdHJpbmcocy50b1ZhbHVlKCkpfUxpbmtFbGVtZW50KHMpe3JldHVybiBPdShzLmhyZWYpP3MuaHJlZi50b1ZhbHVlKCk6IiJ9fWNvbnN0IHNlcmlhbGl6ZXJzX3ZhbHVlPXM9Pmt1KHMpP091KHMpfHxBdShzKXx8anUocyl8fEN1KHMpP3MudG9WYWx1ZSgpOnZhbHVlX3Zpc2l0b3JfdmlzaXQocyxuZXcgVmlzaXRvcik6cztjb25zdCBzcD1fY3VycnkzKChmdW5jdGlvbiBtZXJnZVdpdGhLZXkocyxvLGkpe3ZhciBhLHU9e307Zm9yKGEgaW4gaT1pfHx7fSxvPW98fHt9KV9oYXMoYSxvKSYmKHVbYV09X2hhcyhhLGkpP3MoYSxvW2FdLGlbYV0pOm9bYV0pO2ZvcihhIGluIGkpX2hhcyhhLGkpJiYhX2hhcyhhLHUpJiYodVthXT1pW2FdKTtyZXR1cm4gdX0pKTtjb25zdCBvcD1fY3VycnkzKChmdW5jdGlvbiBtZXJnZURlZXBXaXRoS2V5KHMsbyxpKXtyZXR1cm4gc3AoKGZ1bmN0aW9uKG8saSxhKXtyZXR1cm4gX2lzT2JqZWN0KGkpJiZfaXNPYmplY3QoYSk/bWVyZ2VEZWVwV2l0aEtleShzLGksYSk6cyhvLGksYSl9KSxvLGkpfSkpO2NvbnN0IGlwPV9jdXJyeTIoKGZ1bmN0aW9uIG1lcmdlRGVlcFJpZ2h0KHMsbyl7cmV0dXJuIG9wKChmdW5jdGlvbihzLG8saSl7cmV0dXJuIGl9KSxzLG8pfSkpO2NvbnN0IGNwPVJpKDAsLTEpO2NvbnN0IGxwPV9jdXJyeTIoKGZ1bmN0aW9uIGFwcGx5KHMsbyl7cmV0dXJuIHMuYXBwbHkodGhpcyxvKX0pKTtjb25zdCB1cD1jYyhqYyk7dmFyIHBwPV9jdXJyeTEoKGZ1bmN0aW9uIGVtcHR5KHMpe3JldHVybiBudWxsIT1zJiYiZnVuY3Rpb24iPT10eXBlb2Ygc1siZmFudGFzeS1sYW5kL2VtcHR5Il0/c1siZmFudGFzeS1sYW5kL2VtcHR5Il0oKTpudWxsIT1zJiZudWxsIT1zLmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2Ygcy5jb25zdHJ1Y3RvclsiZmFudGFzeS1sYW5kL2VtcHR5Il0/cy5jb25zdHJ1Y3RvclsiZmFudGFzeS1sYW5kL2VtcHR5Il0oKTpudWxsIT1zJiYiZnVuY3Rpb24iPT10eXBlb2Ygcy5lbXB0eT9zLmVtcHR5KCk6bnVsbCE9cyYmbnVsbCE9cy5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIHMuY29uc3RydWN0b3IuZW1wdHk/cy5jb25zdHJ1Y3Rvci5lbXB0eSgpOllvKHMpP1tdOl9pc1N0cmluZyhzKT8iIjpfaXNPYmplY3Qocyk/e306Z2Eocyk/ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpOmZ1bmN0aW9uIF9pc1R5cGVkQXJyYXkocyl7dmFyIG89T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHMpO3JldHVybiJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSI9PT1vfHwiW29iamVjdCBJbnQ4QXJyYXldIj09PW98fCJbb2JqZWN0IFVpbnQ4QXJyYXldIj09PW98fCJbb2JqZWN0IEludDE2QXJyYXldIj09PW98fCJbb2JqZWN0IFVpbnQxNkFycmF5XSI9PT1vfHwiW29iamVjdCBJbnQzMkFycmF5XSI9PT1vfHwiW29iamVjdCBVaW50MzJBcnJheV0iPT09b3x8IltvYmplY3QgRmxvYXQzMkFycmF5XSI9PT1vfHwiW29iamVjdCBGbG9hdDY0QXJyYXldIj09PW98fCJbb2JqZWN0IEJpZ0ludDY0QXJyYXldIj09PW98fCJbb2JqZWN0IEJpZ1VpbnQ2NEFycmF5XSI9PT1vfShzKT9zLmNvbnN0cnVjdG9yLmZyb20oIiIpOnZvaWQgMH0pKTtjb25zdCBocD1wcDtjb25zdCBkcD1fY3VycnkxKChmdW5jdGlvbiBpc0VtcHR5KHMpe3JldHVybiBudWxsIT1zJiZrYShzLGhwKHMpKX0pKTtjb25zdCBmcD1sYSgxLGpjKEFycmF5LmlzQXJyYXkpP0FycmF5LmlzQXJyYXk6cGlwZSh4YSxFYygiQXJyYXkiKSkpO2NvbnN0IG1wPXJ1KGZwLGRwKTt2YXIgZ3A9bGEoMywoZnVuY3Rpb24ocyxvLGkpe3ZhciBhPUd1KHMsaSksdT1HdShjcChzKSxpKTtpZighdXAoYSkmJiFtcChzKSl7dmFyIF89Wm8oYSx1KTtyZXR1cm4gbHAoXyxvKX19KSk7Y29uc3QgeXA9Z3A7Y2xhc3MgTmFtZXNwYWNlIGV4dGVuZHMgdnUuZyR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMucmVnaXN0ZXIoImFubm90YXRpb24iLEV1KSx0aGlzLnJlZ2lzdGVyKCJjb21tZW50Iix3dSksdGhpcy5yZWdpc3RlcigicGFyc2VSZXN1bHQiLHh1KX19Y29uc3QgdnA9bmV3IE5hbWVzcGFjZSxjcmVhdGVOYW1lc3BhY2U9cz0+e2NvbnN0IG89bmV3IE5hbWVzcGFjZTtyZXR1cm4gcHUocykmJm8udXNlKHMpLG99LGJwPXZwLHRvb2xib3g9KCk9Pih7cHJlZGljYXRlczp7Li4uaWV9LG5hbWVzcGFjZTpicH0pLFNwPXt0b29sYm94Q3JlYXRvcjp0b29sYm94LHZpc2l0b3JPcHRpb25zOntub2RlVHlwZUdldHRlcjp2aXNpdG9yX2dldE5vZGVUeXBlLGV4cG9zZUVkaXRzOiEwfX0sZGlzcGF0Y2hQbHVnaW5zU3luYz0ocyxvLGk9e30pPT57aWYoMD09PW8ubGVuZ3RoKXJldHVybiBzO2NvbnN0IGE9aXAoU3AsaSkse3Rvb2xib3hDcmVhdG9yOnUsdmlzaXRvck9wdGlvbnM6X309YSx3PXUoKSx4PW8ubWFwKChzPT5zKHcpKSksQz1tZXJnZUFsbCh4Lm1hcChpYSh7fSwidmlzaXRvciIpKSx7Li4uX30pO3guZm9yRWFjaCh5cChbInByZSJdLFtdKSk7Y29uc3Qgaj12aXNpdG9yX3Zpc2l0KHMsQyxfKTtyZXR1cm4geC5mb3JFYWNoKHlwKFsicG9zdCJdLFtdKSksan07ZGlzcGF0Y2hQbHVnaW5zU3luY1tTeW1ib2wuZm9yKCJub2RlanMudXRpbC5wcm9taXNpZnkuY3VzdG9tIildPWFzeW5jKHMsbyxpPXt9KT0+e2lmKDA9PT1vLmxlbmd0aClyZXR1cm4gcztjb25zdCBhPWlwKFNwLGkpLHt0b29sYm94Q3JlYXRvcjp1LHZpc2l0b3JPcHRpb25zOl99PWEsdz11KCkseD1vLm1hcCgocz0+cyh3KSkpLEM9bWVyZ2VBbGxbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbSIpXSxqPXZpc2l0b3JfdmlzaXRbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbSIpXSxMPUMoeC5tYXAoaWEoe30sInZpc2l0b3IiKSksey4uLl99KTthd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoeC5tYXAoeXAoWyJwcmUiXSxbXSkpKTtjb25zdCBCPWF3YWl0IGoocyxMLF8pO3JldHVybiBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoeC5tYXAoeXAoWyJwb3N0Il0sW10pKSksQn07Y29uc3QgcmVmcmFjdD0ocyx7VHlwZTpvLHBsdWdpbnM6aT1bXX0pPT57Y29uc3QgYT1uZXcgbyhzKTtyZXR1cm4ga3UocykmJihzLm1ldGEubGVuZ3RoPjAmJihhLm1ldGE9Y2xvbmVEZWVwKHMubWV0YSkpLHMuYXR0cmlidXRlcy5sZW5ndGg+MCYmKGEuYXR0cmlidXRlcz1jbG9uZURlZXAocy5hdHRyaWJ1dGVzKSkpLGRpc3BhdGNoUGx1Z2luc1N5bmMoYSxpLHt0b29sYm94Q3JlYXRvcjp0b29sYm94LHZpc2l0b3JPcHRpb25zOntub2RlVHlwZUdldHRlcjp2aXNpdG9yX2dldE5vZGVUeXBlfX0pfSxjcmVhdGVSZWZyYWN0b3I9cz0+KG8saT17fSk9PnJlZnJhY3Qobyx7Li4uaSxUeXBlOnN9KTt2dS5TaC5yZWZyYWN0PWNyZWF0ZVJlZnJhY3Rvcih2dS5TaCksdnUud0UucmVmcmFjdD1jcmVhdGVSZWZyYWN0b3IodnUud0UpLHZ1Lk9tLnJlZnJhY3Q9Y3JlYXRlUmVmcmFjdG9yKHZ1Lk9tKSx2dS5iZC5yZWZyYWN0PWNyZWF0ZVJlZnJhY3Rvcih2dS5iZCksdnUuT3MucmVmcmFjdD1jcmVhdGVSZWZyYWN0b3IodnUuT3MpLHZ1LmtULnJlZnJhY3Q9Y3JlYXRlUmVmcmFjdG9yKHZ1LmtUKSx2dS5GdC5yZWZyYWN0PWNyZWF0ZVJlZnJhY3Rvcih2dS5GdCksdnUuc0kucmVmcmFjdD1jcmVhdGVSZWZyYWN0b3IodnUuc0kpLEV1LnJlZnJhY3Q9Y3JlYXRlUmVmcmFjdG9yKEV1KSx3dS5yZWZyYWN0PWNyZWF0ZVJlZnJhY3Rvcih3dSkseHUucmVmcmFjdD1jcmVhdGVSZWZyYWN0b3IoeHUpO2NvbnN0IGNvbXB1dGVFZGdlcz0ocyxvPW5ldyBXZWFrTWFwKT0+KFR1KHMpPyhvLnNldChzLmtleSxzKSxjb21wdXRlRWRnZXMocy5rZXksbyksby5zZXQocy52YWx1ZSxzKSxjb21wdXRlRWRnZXMocy52YWx1ZSxvKSk6cy5jaGlsZHJlbi5mb3JFYWNoKChpPT57by5zZXQoaSxzKSxjb21wdXRlRWRnZXMoaSxvKX0pKSxvKTtjb25zdCBfcD1jbGFzcyBUcmFuc2NsdWRlcntlbGVtZW50O2VkZ2VzO2NvbnN0cnVjdG9yKHtlbGVtZW50OnN9KXt0aGlzLmVsZW1lbnQ9c310cmFuc2NsdWRlKHMsbyl7dmFyIGk7aWYocz09PXRoaXMuZWxlbWVudClyZXR1cm4gbztpZihzPT09bylyZXR1cm4gdGhpcy5lbGVtZW50O3RoaXMuZWRnZXM9bnVsbCE9PShpPXRoaXMuZWRnZXMpJiZ2b2lkIDAhPT1pP2k6Y29tcHV0ZUVkZ2VzKHRoaXMuZWxlbWVudCk7Y29uc3QgYT10aGlzLmVkZ2VzLmdldChzKTtyZXR1cm4gaGMoYSk/dm9pZCAwOihQdShhKT8oKHMsbyxpKT0+e2NvbnN0IGE9aS5nZXQocyk7UHUoYSkmJihhLmNvbnRlbnQ9YS5tYXAoKCh1LF8sdyk9Pnc9PT1zPyhpLmRlbGV0ZShzKSxpLnNldChvLGEpLG8pOncpKSl9KShzLG8sdGhpcy5lZGdlcyk6SXUoYSk/KChzLG8saSk9Pntjb25zdCBhPWkuZ2V0KHMpO0l1KGEpJiYoYS5jb250ZW50PWEubWFwKCh1PT51PT09cz8oaS5kZWxldGUocyksaS5zZXQobyxhKSxvKTp1KSkpfSkocyxvLHRoaXMuZWRnZXMpOlR1KGEpJiYoKHMsbyxpKT0+e2NvbnN0IGE9aS5nZXQocyk7VHUoYSkmJihhLmtleT09PXMmJihhLmtleT1vLGkuZGVsZXRlKHMpLGkuc2V0KG8sYSkpLGEudmFsdWU9PT1zJiYoYS52YWx1ZT1vLGkuZGVsZXRlKHMpLGkuc2V0KG8sYSkpKX0pKHMsbyx0aGlzLmVkZ2VzKSx0aGlzLmVsZW1lbnQpfX07Y29uc3QgZnJvbVVSSVJlZmVyZW5jZT1zPT57Y29uc3Qgbz1zLmluZGV4T2YoIiMiKTtyZXR1cm4ocz0+e3RyeXtjb25zdCBvPXMuc3RhcnRzV2l0aCgiIyIpP3Muc2xpY2UoMSk6cztyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KG8pfWNhdGNoe3JldHVybiBzfX0pKC0xPT09bz8iIyI6cy5zdWJzdHJpbmcobykpfSxFcD1mdW5jdGlvbiBmbnBhcnNlcigpe2NvbnN0IHM9QXAsbz1PcCxpPXRoaXMsYT0icGFyc2VyLmpzOiBQYXJzZXIoKTogIjtpLmFzdD12b2lkIDAsaS5zdGF0cz12b2lkIDAsaS50cmFjZT12b2lkIDAsaS5jYWxsYmFja3M9W107bGV0IHUsXyx3LHgsQyxqLEwsQj0wLCQ9MCxVPTAsVj0wLHo9MCxZPW5ldyBmdW5jdGlvbiBzeXN0ZW1EYXRhKCl7dGhpcy5zdGF0ZT1zLkFDVElWRSx0aGlzLnBocmFzZUxlbmd0aD0wLHRoaXMucmVmcmVzaD0oKT0+e3RoaXMuc3RhdGU9cy5BQ1RJVkUsdGhpcy5waHJhc2VMZW5ndGg9MH19O2kucGFyc2U9KFosZWUsaWUsYWUpPT57Y29uc3QgY2U9YCR7YX1wYXJzZSgpOiBgO0I9MCwkPTAsVT0wLFY9MCx6PTAsdT12b2lkIDAsXz12b2lkIDAsdz12b2lkIDAseD12b2lkIDAsWS5yZWZyZXNoKCksQz12b2lkIDAsaj12b2lkIDAsTD12b2lkIDAseD1vLnN0cmluZ1RvQ2hhcnMoaWUpLHU9Wi5ydWxlcyxfPVoudWR0cztjb25zdCBsZT1lZS50b0xvd2VyQ2FzZSgpO2xldCBwZTtmb3IoY29uc3QgcyBpbiB1KWlmKHUuaGFzT3duUHJvcGVydHkocykmJmxlPT09dVtzXS5sb3dlcil7cGU9dVtzXS5pbmRleDticmVha31pZih2b2lkIDA9PT1wZSl0aHJvdyBuZXcgRXJyb3IoYCR7Y2V9c3RhcnQgcnVsZSBuYW1lICcke3N0YXJ0UnVsZX0nIG5vdCByZWNvZ25pemVkYCk7KCgpPT57Y29uc3Qgcz1gJHthfWluaXRpYWxpemVDYWxsYmFja3MoKTogYDtsZXQgbyx3O2ZvcihDPVtdLGo9W10sbz0wO288dS5sZW5ndGg7bys9MSlDW29dPXZvaWQgMDtmb3Iobz0wO288Xy5sZW5ndGg7bys9MSlqW29dPXZvaWQgMDtjb25zdCB4PVtdO2ZvcihvPTA7bzx1Lmxlbmd0aDtvKz0xKXgucHVzaCh1W29dLmxvd2VyKTtmb3Iobz0wO288Xy5sZW5ndGg7bys9MSl4LnB1c2goX1tvXS5sb3dlcik7Zm9yKGNvbnN0IGEgaW4gaS5jYWxsYmFja3MpaWYoaS5jYWxsYmFja3MuaGFzT3duUHJvcGVydHkoYSkpe2lmKG89eC5pbmRleE9mKGEudG9Mb3dlckNhc2UoKSksbzwwKXRocm93IG5ldyBFcnJvcihgJHtzfXN5bnRheCBjYWxsYmFjayAnJHthfScgbm90IGEgcnVsZSBvciB1ZHQgbmFtZWApO2lmKHc9aS5jYWxsYmFja3NbYV0/aS5jYWxsYmFja3NbYV06dm9pZCAwLCJmdW5jdGlvbiIhPXR5cGVvZiB3JiZ2b2lkIDAhPT13KXRocm93IG5ldyBFcnJvcihgJHtzfXN5bnRheCBjYWxsYmFja1ske2F9XSBtdXN0IGJlIGZ1bmN0aW9uIHJlZmVyZW5jZSBvciBmYWxzeSlgKTtvPHUubGVuZ3RoP0Nbb109dzpqW28tdS5sZW5ndGhdPXd9fSkoKSxpLnRyYWNlJiZpLnRyYWNlLmluaXQodSxfLHgpLGkuc3RhdHMmJmkuc3RhdHMuaW5pdCh1LF8pLGkuYXN0JiZpLmFzdC5pbml0KHUsXyx4KSxMPWFlLHc9W3t0eXBlOnMuUk5NLGluZGV4OnBlfV0sb3BFeGVjdXRlKDAsMCksdz12b2lkIDA7bGV0IGRlPSExO3N3aXRjaChZLnN0YXRlKXtjYXNlIHMuQUNUSVZFOnRocm93IG5ldyBFcnJvcihgJHtjZX1maW5hbCBzdGF0ZSBzaG91bGQgbmV2ZXIgYmUgJ0FDVElWRSdgKTtjYXNlIHMuTk9NQVRDSDpkZT0hMTticmVhaztjYXNlIHMuRU1QVFk6Y2FzZSBzLk1BVENIOmRlPVkucGhyYXNlTGVuZ3RoPT09eC5sZW5ndGg7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVucmVjb2duaXplZCBzdGF0ZSIpfXJldHVybntzdWNjZXNzOmRlLHN0YXRlOlkuc3RhdGUsc3RhdGVOYW1lOnMuaWROYW1lKFkuc3RhdGUpLGxlbmd0aDp4Lmxlbmd0aCxtYXRjaGVkOlkucGhyYXNlTGVuZ3RoLG1heE1hdGNoZWQ6eixtYXhUcmVlRGVwdGg6VSxub2RlSGl0czpWfX07Y29uc3QgdmFsaWRhdGVSbm1DYWxsYmFja1Jlc3VsdD0obyxpLHUsXyk9PntpZihpLnBocmFzZUxlbmd0aD51KXtsZXQgcz1gJHthfW9wUk5NKCR7by5uYW1lfSk6IGNhbGxiYWNrIGZ1bmN0aW9uIGVycm9yOiBgO3Rocm93IHMrPWBzeXNEYXRhLnBocmFzZUxlbmd0aDogJHtpLnBocmFzZUxlbmd0aH1gLHMrPWAgbXVzdCBiZSA8PSByZW1haW5pbmcgY2hhcnM6ICR7dX1gLG5ldyBFcnJvcihzKX1zd2l0Y2goaS5zdGF0ZSl7Y2FzZSBzLkFDVElWRTppZighXyl0aHJvdyBuZXcgRXJyb3IoYCR7YX1vcFJOTSgke28ubmFtZX0pOiBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm4gZXJyb3IuIEFDVElWRSBzdGF0ZSBub3QgYWxsb3dlZC5gKTticmVhaztjYXNlIHMuRU1QVFk6aS5waHJhc2VMZW5ndGg9MDticmVhaztjYXNlIHMuTUFUQ0g6MD09PWkucGhyYXNlTGVuZ3RoJiYoaS5zdGF0ZT1zLkVNUFRZKTticmVhaztjYXNlIHMuTk9NQVRDSDppLnBocmFzZUxlbmd0aD0wO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGAke2F9b3BSTk0oJHtvLm5hbWV9KTogY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJuIGVycm9yLiBVbnJlY29nbml6ZWQgcmV0dXJuIHN0YXRlOiAke2kuc3RhdGV9YCl9fSxvcFVEVD0obyxDKT0+e2xldCAkLFUsVjtjb25zdCB6PXdbb10sWj1fW3ouaW5kZXhdO1kuVWR0SW5kZXg9Wi5pbmRleCxCfHwoVj1pLmFzdCYmaS5hc3QudWR0RGVmaW5lZCh6LmluZGV4KSxWJiYoVT11Lmxlbmd0aCt6LmluZGV4LCQ9aS5hc3QuZ2V0TGVuZ3RoKCksaS5hc3QuZG93bihVLFoubmFtZSkpKTtjb25zdCBlZT14Lmxlbmd0aC1DO2pbei5pbmRleF0oWSx4LEMsTCksKChvLGksdSk9PntpZihpLnBocmFzZUxlbmd0aD51KXtsZXQgcz1gJHthfW9wVURUKCR7by5uYW1lfSk6IGNhbGxiYWNrIGZ1bmN0aW9uIGVycm9yOiBgO3Rocm93IHMrPWBzeXNEYXRhLnBocmFzZUxlbmd0aDogJHtpLnBocmFzZUxlbmd0aH1gLHMrPWAgbXVzdCBiZSA8PSByZW1haW5pbmcgY2hhcnM6ICR7dX1gLG5ldyBFcnJvcihzKX1zd2l0Y2goaS5zdGF0ZSl7Y2FzZSBzLkFDVElWRTp0aHJvdyBuZXcgRXJyb3IoYCR7YX1vcFVEVCgke28ubmFtZX0pIEFDVElWRSBzdGF0ZSByZXR1cm4gbm90IGFsbG93ZWQuYCk7Y2FzZSBzLkVNUFRZOmlmKCFvLmVtcHR5KXRocm93IG5ldyBFcnJvcihgJHthfW9wVURUKCR7by5uYW1lfSkgbWF5IG5vdCByZXR1cm4gRU1QVFkuYCk7aS5waHJhc2VMZW5ndGg9MDticmVhaztjYXNlIHMuTUFUQ0g6aWYoMD09PWkucGhyYXNlTGVuZ3RoKXtpZighby5lbXB0eSl0aHJvdyBuZXcgRXJyb3IoYCR7YX1vcFVEVCgke28ubmFtZX0pIG1heSBub3QgcmV0dXJuIEVNUFRZLmApO2kuc3RhdGU9cy5FTVBUWX1icmVhaztjYXNlIHMuTk9NQVRDSDppLnBocmFzZUxlbmd0aD0wO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGAke2F9b3BVRFQoJHtvLm5hbWV9KTogY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJuIGVycm9yLiBVbnJlY29nbml6ZWQgcmV0dXJuIHN0YXRlOiAke2kuc3RhdGV9YCl9fSkoWixZLGVlKSxCfHxWJiYoWS5zdGF0ZT09PXMuTk9NQVRDSD9pLmFzdC5zZXRMZW5ndGgoJCk6aS5hc3QudXAoVSxaLm5hbWUsQyxZLnBocmFzZUxlbmd0aCkpfSxvcEV4ZWN1dGU9KG8sXyk9Pntjb25zdCBqPWAke2F9b3BFeGVjdXRlKCk6IGAsWj13W29dO3N3aXRjaChWKz0xLCQ+VSYmKFU9JCksJCs9MSxZLnJlZnJlc2goKSxpLnRyYWNlJiZpLnRyYWNlLmRvd24oWixfKSxaLnR5cGUpe2Nhc2Ugcy5BTFQ6KChvLGkpPT57Y29uc3QgYT13W29dO2ZvcihsZXQgbz0wO288YS5jaGlsZHJlbi5sZW5ndGgmJihvcEV4ZWN1dGUoYS5jaGlsZHJlbltvXSxpKSxZLnN0YXRlPT09cy5OT01BVENIKTtvKz0xKTt9KShvLF8pO2JyZWFrO2Nhc2Ugcy5DQVQ6KChvLGEpPT57bGV0IHUsXyx4LEM7Y29uc3Qgaj13W29dO2kuYXN0JiYoXz1pLmFzdC5nZXRMZW5ndGgoKSksdT0hMCx4PWEsQz0wO2ZvcihsZXQgbz0wO288ai5jaGlsZHJlbi5sZW5ndGg7bys9MSl7aWYob3BFeGVjdXRlKGouY2hpbGRyZW5bb10seCksWS5zdGF0ZT09PXMuTk9NQVRDSCl7dT0hMTticmVha314Kz1ZLnBocmFzZUxlbmd0aCxDKz1ZLnBocmFzZUxlbmd0aH11PyhZLnN0YXRlPTA9PT1DP3MuRU1QVFk6cy5NQVRDSCxZLnBocmFzZUxlbmd0aD1DKTooWS5zdGF0ZT1zLk5PTUFUQ0gsWS5waHJhc2VMZW5ndGg9MCxpLmFzdCYmaS5hc3Quc2V0TGVuZ3RoKF8pKX0pKG8sXyk7YnJlYWs7Y2FzZSBzLlJFUDooKG8sYSk9PntsZXQgdSxfLEMsajtjb25zdCBMPXdbb107aWYoMD09PUwubWF4KXJldHVybiBZLnN0YXRlPXMuRU1QVFksdm9pZChZLnBocmFzZUxlbmd0aD0wKTtmb3IoXz1hLEM9MCxqPTAsaS5hc3QmJih1PWkuYXN0LmdldExlbmd0aCgpKTshKF8+PXgubGVuZ3RoKSYmKG9wRXhlY3V0ZShvKzEsXyksWS5zdGF0ZSE9PXMuTk9NQVRDSCkmJlkuc3RhdGUhPT1zLkVNUFRZJiYoais9MSxDKz1ZLnBocmFzZUxlbmd0aCxfKz1ZLnBocmFzZUxlbmd0aCxqIT09TC5tYXgpOyk7WS5zdGF0ZT09PXMuRU1QVFl8fGo+PUwubWluPyhZLnN0YXRlPTA9PT1DP3MuRU1QVFk6cy5NQVRDSCxZLnBocmFzZUxlbmd0aD1DKTooWS5zdGF0ZT1zLk5PTUFUQ0gsWS5waHJhc2VMZW5ndGg9MCxpLmFzdCYmaS5hc3Quc2V0TGVuZ3RoKHUpKX0pKG8sXyk7YnJlYWs7Y2FzZSBzLlJOTTooKG8sYSk9PntsZXQgXyxqLCQ7Y29uc3QgVT13W29dLFY9dVtVLmluZGV4XSx6PUNbVi5pbmRleF07aWYoQnx8KGo9aS5hc3QmJmkuYXN0LnJ1bGVEZWZpbmVkKFUuaW5kZXgpLGomJihfPWkuYXN0LmdldExlbmd0aCgpLGkuYXN0LmRvd24oVS5pbmRleCx1W1UuaW5kZXhdLm5hbWUpKSkseil7Y29uc3Qgbz14Lmxlbmd0aC1hO3ooWSx4LGEsTCksdmFsaWRhdGVSbm1DYWxsYmFja1Jlc3VsdChWLFksbywhMCksWS5zdGF0ZT09PXMuQUNUSVZFJiYoJD13LHc9Vi5vcGNvZGVzLG9wRXhlY3V0ZSgwLGEpLHc9JCx6KFkseCxhLEwpLHZhbGlkYXRlUm5tQ2FsbGJhY2tSZXN1bHQoVixZLG8sITEpKX1lbHNlICQ9dyx3PVYub3Bjb2RlcyxvcEV4ZWN1dGUoMCxhLFkpLHc9JDtCfHxqJiYoWS5zdGF0ZT09PXMuTk9NQVRDSD9pLmFzdC5zZXRMZW5ndGgoXyk6aS5hc3QudXAoVS5pbmRleCxWLm5hbWUsYSxZLnBocmFzZUxlbmd0aCkpfSkobyxfKTticmVhaztjYXNlIHMuVFJHOigobyxpKT0+e2NvbnN0IGE9d1tvXTtZLnN0YXRlPXMuTk9NQVRDSCxpPHgubGVuZ3RoJiZhLm1pbjw9eFtpXSYmeFtpXTw9YS5tYXgmJihZLnN0YXRlPXMuTUFUQ0gsWS5waHJhc2VMZW5ndGg9MSl9KShvLF8pO2JyZWFrO2Nhc2Ugcy5UQlM6KChvLGkpPT57Y29uc3QgYT13W29dLHU9YS5zdHJpbmcubGVuZ3RoO2lmKFkuc3RhdGU9cy5OT01BVENILGkrdTw9eC5sZW5ndGgpe2ZvcihsZXQgcz0wO3M8dTtzKz0xKWlmKHhbaStzXSE9PWEuc3RyaW5nW3NdKXJldHVybjtZLnN0YXRlPXMuTUFUQ0gsWS5waHJhc2VMZW5ndGg9dX19KShvLF8pO2JyZWFrO2Nhc2Ugcy5UTFM6KChvLGkpPT57bGV0IGE7Y29uc3QgdT13W29dO1kuc3RhdGU9cy5OT01BVENIO2NvbnN0IF89dS5zdHJpbmcubGVuZ3RoO2lmKDAhPT1fKXtpZihpK188PXgubGVuZ3RoKXtmb3IobGV0IHM9MDtzPF87cys9MSlpZihhPXhbaStzXSxhPj02NSYmYTw9OTAmJihhKz0zMiksYSE9PXUuc3RyaW5nW3NdKXJldHVybjtZLnN0YXRlPXMuTUFUQ0gsWS5waHJhc2VMZW5ndGg9X319ZWxzZSBZLnN0YXRlPXMuRU1QVFl9KShvLF8pO2JyZWFrO2Nhc2Ugcy5VRFQ6b3BVRFQobyxfKTticmVhaztjYXNlIHMuQU5EOigobyxpKT0+e3N3aXRjaChCKz0xLG9wRXhlY3V0ZShvKzEsaSksQi09MSxZLnBocmFzZUxlbmd0aD0wLFkuc3RhdGUpe2Nhc2Ugcy5FTVBUWTpjYXNlIHMuTUFUQ0g6WS5zdGF0ZT1zLkVNUFRZO2JyZWFrO2Nhc2Ugcy5OT01BVENIOlkuc3RhdGU9cy5OT01BVENIO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBvcEFORDogaW52YWxpZCBzdGF0ZSAke1kuc3RhdGV9YCl9fSkobyxfKTticmVhaztjYXNlIHMuTk9UOigobyxpKT0+e3N3aXRjaChCKz0xLG9wRXhlY3V0ZShvKzEsaSksQi09MSxZLnBocmFzZUxlbmd0aD0wLFkuc3RhdGUpe2Nhc2Ugcy5FTVBUWTpjYXNlIHMuTUFUQ0g6WS5zdGF0ZT1zLk5PTUFUQ0g7YnJlYWs7Y2FzZSBzLk5PTUFUQ0g6WS5zdGF0ZT1zLkVNUFRZO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBvcE5PVDogaW52YWxpZCBzdGF0ZSAke1kuc3RhdGV9YCl9fSkobyxfKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgJHtqfXVucmVjb2duaXplZCBvcGVyYXRvcmApfUJ8fF8rWS5waHJhc2VMZW5ndGg+eiYmKHo9XytZLnBocmFzZUxlbmd0aCksaS5zdGF0cyYmaS5zdGF0cy5jb2xsZWN0KFosWSksaS50cmFjZSYmaS50cmFjZS51cChaLFkuc3RhdGUsXyxZLnBocmFzZUxlbmd0aCksJC09MX19LHdwPWZ1bmN0aW9uIGZuYXN0KCl7Y29uc3Qgcz1BcCxvPU9wLGk9dGhpcztsZXQgYSx1LF8sdz0wO2NvbnN0IHg9W10sQz1bXSxqPVtdO2Z1bmN0aW9uIGluZGVudChzKXtsZXQgbz0iIjtmb3IoO3MtLSA+MDspbys9IiAiO3JldHVybiBvfWkuY2FsbGJhY2tzPVtdLGkuaW5pdD0ocyxvLEwpPT57bGV0IEI7Qy5sZW5ndGg9MCxqLmxlbmd0aD0wLHc9MCxhPXMsdT1vLF89TDtjb25zdCAkPVtdO2ZvcihCPTA7QjxhLmxlbmd0aDtCKz0xKSQucHVzaChhW0JdLmxvd2VyKTtmb3IoQj0wO0I8dS5sZW5ndGg7Qis9MSkkLnB1c2godVtCXS5sb3dlcik7Zm9yKHc9YS5sZW5ndGgrdS5sZW5ndGgsQj0wO0I8dztCKz0xKXhbQl09dm9pZCAwO2Zvcihjb25zdCBzIGluIGkuY2FsbGJhY2tzKWlmKGkuY2FsbGJhY2tzLmhhc093blByb3BlcnR5KHMpKXtjb25zdCBvPXMudG9Mb3dlckNhc2UoKTtpZihCPSQuaW5kZXhPZihvKSxCPDApdGhyb3cgbmV3IEVycm9yKGBwYXJzZXIuanM6IEFzdCgpKTogaW5pdDogbm9kZSAnJHtzfScgbm90IGEgcnVsZSBvciB1ZHQgbmFtZWApO3hbQl09aS5jYWxsYmFja3Nbc119fSxpLnJ1bGVEZWZpbmVkPXM9PiEheFtzXSxpLnVkdERlZmluZWQ9cz0+ISF4W2EubGVuZ3RoK3NdLGkuZG93bj0obyxpKT0+e2NvbnN0IGE9ai5sZW5ndGg7cmV0dXJuIEMucHVzaChhKSxqLnB1c2goe25hbWU6aSx0aGlzSW5kZXg6YSx0aGF0SW5kZXg6dm9pZCAwLHN0YXRlOnMuU0VNX1BSRSxjYWxsYmFja0luZGV4Om8scGhyYXNlSW5kZXg6dm9pZCAwLHBocmFzZUxlbmd0aDp2b2lkIDAsc3RhY2s6Qy5sZW5ndGh9KSxhfSxpLnVwPShvLGksYSx1KT0+e2NvbnN0IF89ai5sZW5ndGgsdz1DLnBvcCgpO3JldHVybiBqLnB1c2goe25hbWU6aSx0aGlzSW5kZXg6Xyx0aGF0SW5kZXg6dyxzdGF0ZTpzLlNFTV9QT1NULGNhbGxiYWNrSW5kZXg6byxwaHJhc2VJbmRleDphLHBocmFzZUxlbmd0aDp1LHN0YWNrOkMubGVuZ3RofSksalt3XS50aGF0SW5kZXg9XyxqW3ddLnBocmFzZUluZGV4PWEsalt3XS5waHJhc2VMZW5ndGg9dSxffSxpLnRyYW5zbGF0ZT1vPT57bGV0IGksYTtmb3IobGV0IHU9MDt1PGoubGVuZ3RoO3UrPTEpYT1qW3VdLGk9eFthLmNhbGxiYWNrSW5kZXhdLGkmJihhLnN0YXRlPT09cy5TRU1fUFJFP2kocy5TRU1fUFJFLF8sYS5waHJhc2VJbmRleCxhLnBocmFzZUxlbmd0aCxvKTppJiZpKHMuU0VNX1BPU1QsXyxhLnBocmFzZUluZGV4LGEucGhyYXNlTGVuZ3RoLG8pKX0saS5zZXRMZW5ndGg9cz0+e2oubGVuZ3RoPXMsQy5sZW5ndGg9cz4wP2pbcy0xXS5zdGFjazowfSxpLmdldExlbmd0aD0oKT0+ai5sZW5ndGgsaS50b1htbD0oKT0+e2xldCBpPSIiLGE9MDtyZXR1cm4gaSs9Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+XG4nLGkrPWA8cm9vdCBub2Rlcz0iJHtqLmxlbmd0aC8yfSIgY2hhcmFjdGVycz0iJHtfLmxlbmd0aH0iPlxuYCxpKz0iXHgzYyEtLSBpbnB1dCBzdHJpbmcgLS1ceDNlXG4iLGkrPWluZGVudChhKzIpLGkrPW8uY2hhcnNUb1N0cmluZyhfKSxpKz0iXG4iLGouZm9yRWFjaCgodT0+e3Uuc3RhdGU9PT1zLlNFTV9QUkU/KGErPTEsaSs9aW5kZW50KGEpLGkrPWA8bm9kZSBuYW1lPSIke3UubmFtZX0iIGluZGV4PSIke3UucGhyYXNlSW5kZXh9IiBsZW5ndGg9IiR7dS5waHJhc2VMZW5ndGh9Ij5cbmAsaSs9aW5kZW50KGErMiksaSs9by5jaGFyc1RvU3RyaW5nKF8sdS5waHJhc2VJbmRleCx1LnBocmFzZUxlbmd0aCksaSs9IlxuIik6KGkrPWluZGVudChhKSxpKz1gPC9ub2RlPlx4M2MhLS0gbmFtZT0iJHt1Lm5hbWV9IiAtLVx4M2VcbmAsYS09MSl9KSksaSs9Ijwvcm9vdD5cbiIsaX19LHhwPWZ1bmN0aW9uIGZudHJhY2UoKXtjb25zdCBzPUFwLG89T3AsaT0icGFyc2VyLmpzOiBUcmFjZSgpOiAiO2xldCBhLHUsXyx3PSIiLHg9MDtjb25zdCBDPXRoaXMsaW5kZW50PXM9PntsZXQgbz0iIixpPTA7aWYocz49MClmb3IoO3MtLTspaSs9MSw1PT09aT8obys9InwiLGk9MCk6bys9Ii4iO3JldHVybiBvfTtDLmluaXQ9KHMsbyxpKT0+e3U9cyxfPW8sYT1pfTtjb25zdCBvcE5hbWU9YT0+e2xldCB3O3N3aXRjaChhLnR5cGUpe2Nhc2Ugcy5BTFQ6dz0iQUxUIjticmVhaztjYXNlIHMuQ0FUOnc9IkNBVCI7YnJlYWs7Y2FzZSBzLlJFUDp3PWEubWF4PT09MS8wP2BSRVAoJHthLm1pbn0saW5mKWA6YFJFUCgke2EubWlufSwke2EubWF4fSlgO2JyZWFrO2Nhc2Ugcy5STk06dz1gUk5NKCR7dVthLmluZGV4XS5uYW1lfSlgO2JyZWFrO2Nhc2Ugcy5UUkc6dz1gVFJHKCR7YS5taW59LCR7YS5tYXh9KWA7YnJlYWs7Y2FzZSBzLlRCUzp3PWEuc3RyaW5nLmxlbmd0aD42P2BUQlMoJHtvLmNoYXJzVG9TdHJpbmcoYS5zdHJpbmcsMCwzKX0uLi4pYDpgVEJTKCR7by5jaGFyc1RvU3RyaW5nKGEuc3RyaW5nLDAsNil9KWA7YnJlYWs7Y2FzZSBzLlRMUzp3PWEuc3RyaW5nLmxlbmd0aD42P2BUTFMoJHtvLmNoYXJzVG9TdHJpbmcoYS5zdHJpbmcsMCwzKX0uLi4pYDpgVExTKCR7by5jaGFyc1RvU3RyaW5nKGEuc3RyaW5nLDAsNil9KWA7YnJlYWs7Y2FzZSBzLlVEVDp3PWBVRFQoJHtfW2EuaW5kZXhdLm5hbWV9KWA7YnJlYWs7Y2FzZSBzLkFORDp3PSJBTkQiO2JyZWFrO2Nhc2Ugcy5OT1Q6dz0iTk9UIjticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgJHtpfVRyYWNlOiBvcE5hbWU6IHVucmVjb2duaXplZCBvcGNvZGVgKX1yZXR1cm4gd307Qy5kb3duPShzLGkpPT57Y29uc3QgdT1pbmRlbnQoeCksXz1NYXRoLm1pbigxMDAsYS5sZW5ndGgtaSk7bGV0IEM9by5jaGFyc1RvU3RyaW5nKGEsaSxfKTtfPGEubGVuZ3RoLWkmJihDKz0iLi4uIiksQz1gJHt1fXwtfFske29wTmFtZShzKX1dJHtDfVxuYCx3Kz1DLHgrPTF9LEMudXA9KHUsXyxDLGopPT57Y29uc3QgTD1gJHtpfXRyYWNlLnVwOiBgO3gtPTE7Y29uc3QgQj1pbmRlbnQoeCk7bGV0ICQsVSxWO3N3aXRjaChfKXtjYXNlIHMuRU1QVFk6Vj0ifEV8IixVPSInJyI7YnJlYWs7Y2FzZSBzLk1BVENIOlY9InxNfCIsJD1NYXRoLm1pbigxMDAsaiksVT0kPGo/YCcke28uY2hhcnNUb1N0cmluZyhhLEMsJCl9Li4uJ2A6YCcke28uY2hhcnNUb1N0cmluZyhhLEMsJCl9J2A7YnJlYWs7Y2FzZSBzLk5PTUFUQ0g6Vj0ifE58IixVPSIiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGAke0x9IHVucmVjb2duaXplZCBzdGF0ZWApfVU9YCR7Qn0ke1Z9WyR7b3BOYW1lKHUpfV0ke1V9XG5gLHcrPVV9LEMuZGlzcGxheVRyYWNlPSgpPT53fSxrcD1mdW5jdGlvbiBmbnN0YXRzKCl7Y29uc3Qgcz1BcDtsZXQgbyxpLGE7Y29uc3QgdT1bXSxfPVtdLHc9W107dGhpcy5pbml0PShzLGEpPT57bz1zLGk9YSxjbGVhcigpfSx0aGlzLmNvbGxlY3Q9KG8saSk9PntpbmNTdGF0KGEsaS5zdGF0ZSxpLnBocmFzZUxlbmd0aCksaW5jU3RhdCh1W28udHlwZV0saS5zdGF0ZSxpLnBocmFzZUxlbmd0aCksby50eXBlPT09cy5STk0mJmluY1N0YXQoX1tvLmluZGV4XSxpLnN0YXRlLGkucGhyYXNlTGVuZ3RoKSxvLnR5cGU9PT1zLlVEVCYmaW5jU3RhdCh3W28uaW5kZXhdLGkuc3RhdGUsaS5waHJhc2VMZW5ndGgpfSx0aGlzLmRpc3BsYXlTdGF0cz0oKT0+e2xldCBvPSIiO2NvbnN0IGk9e21hdGNoOjAsZW1wdHk6MCxub21hdGNoOjAsdG90YWw6MH0sZGlzcGxheVJvdz0ocyxvLGEsdSxfKT0+e2kubWF0Y2grPW8saS5lbXB0eSs9YSxpLm5vbWF0Y2grPXUsaS50b3RhbCs9XztyZXR1cm5gJHtzfSB8ICR7bm9ybWFsaXplKG8pfSB8ICR7bm9ybWFsaXplKGEpfSB8ICR7bm9ybWFsaXplKHUpfSB8ICR7bm9ybWFsaXplKF8pfSB8XG5gfTtyZXR1cm4gbys9IiAgICAgICAgICBPUEVSQVRPUiBTVEFUU1xuIixvKz0iICAgICAgfCAgIE1BVENIIHwgICBFTVBUWSB8IE5PTUFUQ0ggfCAgIFRPVEFMIHxcbiIsbys9ZGlzcGxheVJvdygiICBBTFQiLHVbcy5BTFRdLm1hdGNoLHVbcy5BTFRdLmVtcHR5LHVbcy5BTFRdLm5vbWF0Y2gsdVtzLkFMVF0udG90YWwpLG8rPWRpc3BsYXlSb3coIiAgQ0FUIix1W3MuQ0FUXS5tYXRjaCx1W3MuQ0FUXS5lbXB0eSx1W3MuQ0FUXS5ub21hdGNoLHVbcy5DQVRdLnRvdGFsKSxvKz1kaXNwbGF5Um93KCIgIFJFUCIsdVtzLlJFUF0ubWF0Y2gsdVtzLlJFUF0uZW1wdHksdVtzLlJFUF0ubm9tYXRjaCx1W3MuUkVQXS50b3RhbCksbys9ZGlzcGxheVJvdygiICBSTk0iLHVbcy5STk1dLm1hdGNoLHVbcy5STk1dLmVtcHR5LHVbcy5STk1dLm5vbWF0Y2gsdVtzLlJOTV0udG90YWwpLG8rPWRpc3BsYXlSb3coIiAgVFJHIix1W3MuVFJHXS5tYXRjaCx1W3MuVFJHXS5lbXB0eSx1W3MuVFJHXS5ub21hdGNoLHVbcy5UUkddLnRvdGFsKSxvKz1kaXNwbGF5Um93KCIgIFRCUyIsdVtzLlRCU10ubWF0Y2gsdVtzLlRCU10uZW1wdHksdVtzLlRCU10ubm9tYXRjaCx1W3MuVEJTXS50b3RhbCksbys9ZGlzcGxheVJvdygiICBUTFMiLHVbcy5UTFNdLm1hdGNoLHVbcy5UTFNdLmVtcHR5LHVbcy5UTFNdLm5vbWF0Y2gsdVtzLlRMU10udG90YWwpLG8rPWRpc3BsYXlSb3coIiAgVURUIix1W3MuVURUXS5tYXRjaCx1W3MuVURUXS5lbXB0eSx1W3MuVURUXS5ub21hdGNoLHVbcy5VRFRdLnRvdGFsKSxvKz1kaXNwbGF5Um93KCIgIEFORCIsdVtzLkFORF0ubWF0Y2gsdVtzLkFORF0uZW1wdHksdVtzLkFORF0ubm9tYXRjaCx1W3MuQU5EXS50b3RhbCksbys9ZGlzcGxheVJvdygiICBOT1QiLHVbcy5OT1RdLm1hdGNoLHVbcy5OT1RdLmVtcHR5LHVbcy5OT1RdLm5vbWF0Y2gsdVtzLk5PVF0udG90YWwpLG8rPWRpc3BsYXlSb3coIlRPVEFMIixpLm1hdGNoLGkuZW1wdHksaS5ub21hdGNoLGkudG90YWwpLG99LHRoaXMuZGlzcGxheUhpdHM9cz0+e2xldCBvPSIiO2NvbnN0IGRpc3BsYXlSb3c9KHMsbyxpLHUsXyk9PnthLm1hdGNoKz1zLGEuZW1wdHkrPW8sYS5ub21hdGNoKz1pLGEudG90YWwrPXU7cmV0dXJuYHwgJHtub3JtYWxpemUocyl9IHwgJHtub3JtYWxpemUobyl9IHwgJHtub3JtYWxpemUoaSl9IHwgJHtub3JtYWxpemUodSl9IHwgJHtffVxuYH07InN0cmluZyI9PXR5cGVvZiBzJiYiYSI9PT1zLnRvTG93ZXJDYXNlKClbMF0/KF8uc29ydChzb3J0QWxwaGEpLHcuc29ydChzb3J0QWxwaGEpLG8rPSIgICAgUlVMRVMvVURUUyBBTFBIQUJFVElDQUxMWVxuIik6InN0cmluZyI9PXR5cGVvZiBzJiYiaSI9PT1zLnRvTG93ZXJDYXNlKClbMF0/KF8uc29ydChzb3J0SW5kZXgpLHcuc29ydChzb3J0SW5kZXgpLG8rPSIgICAgUlVMRVMvVURUUyBCWSBJTkRFWFxuIik6KF8uc29ydChzb3J0SGl0cyksdy5zb3J0KHNvcnRIaXRzKSxvKz0iICAgIFJVTEVTL1VEVFMgQlkgSElUIENPVU5UXG4iKSxvKz0ifCAgIE1BVENIIHwgICBFTVBUWSB8IE5PTUFUQ0ggfCAgIFRPVEFMIHwgTkFNRVxuIjtmb3IobGV0IHM9MDtzPF8ubGVuZ3RoO3MrPTEpe2xldCBpPV9bc107aS50b3RhbCYmKG8rPWRpc3BsYXlSb3coaS5tYXRjaCxpLmVtcHR5LGkubm9tYXRjaCxpLnRvdGFsLGkubmFtZSkpfWZvcihsZXQgcz0wO3M8dy5sZW5ndGg7cys9MSl7bGV0IGk9d1tzXTtpLnRvdGFsJiYobys9ZGlzcGxheVJvdyhpLm1hdGNoLGkuZW1wdHksaS5ub21hdGNoLGkudG90YWwsaS5uYW1lKSl9cmV0dXJuIG99O2NvbnN0IG5vcm1hbGl6ZT1zPT5zPDEwP2AgICAgICAke3N9YDpzPDEwMD9gICAgICAke3N9YDpzPDFlMz9gICAgICR7c31gOnM8MWU0P2AgICAke3N9YDpzPDFlNT9gICAke3N9YDpzPDFlNj9gICR7c31gOmAke3N9YCxzb3J0QWxwaGE9KHMsbyk9PnMubG93ZXI8by5sb3dlcj8tMTpzLmxvd2VyPm8ubG93ZXI/MTowLHNvcnRIaXRzPShzLG8pPT5zLnRvdGFsPG8udG90YWw/MTpzLnRvdGFsPm8udG90YWw/LTE6c29ydEFscGhhKHMsbyksc29ydEluZGV4PShzLG8pPT5zLmluZGV4PG8uaW5kZXg/LTE6cy5pbmRleD5vLmluZGV4PzE6MCx4PWZ1bmN0aW9uIGZuZW1wdHkoKXt0aGlzLmVtcHR5PTAsdGhpcy5tYXRjaD0wLHRoaXMubm9tYXRjaD0wLHRoaXMudG90YWw9MH0sY2xlYXI9KCk9Pnt1Lmxlbmd0aD0wLGE9bmV3IHgsdVtzLkFMVF09bmV3IHgsdVtzLkNBVF09bmV3IHgsdVtzLlJFUF09bmV3IHgsdVtzLlJOTV09bmV3IHgsdVtzLlRSR109bmV3IHgsdVtzLlRCU109bmV3IHgsdVtzLlRMU109bmV3IHgsdVtzLlVEVF09bmV3IHgsdVtzLkFORF09bmV3IHgsdVtzLk5PVF09bmV3IHgsXy5sZW5ndGg9MDtmb3IobGV0IHM9MDtzPG8ubGVuZ3RoO3MrPTEpXy5wdXNoKHtlbXB0eTowLG1hdGNoOjAsbm9tYXRjaDowLHRvdGFsOjAsbmFtZTpvW3NdLm5hbWUsbG93ZXI6b1tzXS5sb3dlcixpbmRleDpvW3NdLmluZGV4fSk7aWYoaS5sZW5ndGg+MCl7dy5sZW5ndGg9MDtmb3IobGV0IHM9MDtzPGkubGVuZ3RoO3MrPTEpdy5wdXNoKHtlbXB0eTowLG1hdGNoOjAsbm9tYXRjaDowLHRvdGFsOjAsbmFtZTppW3NdLm5hbWUsbG93ZXI6aVtzXS5sb3dlcixpbmRleDppW3NdLmluZGV4fSl9fSxpbmNTdGF0PShvLGkpPT57c3dpdGNoKG8udG90YWwrPTEsaSl7Y2FzZSBzLkVNUFRZOm8uZW1wdHkrPTE7YnJlYWs7Y2FzZSBzLk1BVENIOm8ubWF0Y2grPTE7YnJlYWs7Y2FzZSBzLk5PTUFUQ0g6by5ub21hdGNoKz0xO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBwYXJzZXIuanM6IFN0YXRzKCk6IGNvbGxlY3QoKTogaW5jU3RhdCgpOiB1bnJlY29nbml6ZWQgc3RhdGU6ICR7aX1gKX19fSxPcD17c3RyaW5nVG9DaGFyczpzPT5bLi4uc10ubWFwKChzPT5zLmNvZGVQb2ludEF0KDApKSksY2hhcnNUb1N0cmluZzoocyxvLGkpPT57bGV0IGE9cztmb3IoOyEodm9pZCAwPT09b3x8bzwwKTspe2lmKHZvaWQgMD09PWkpe2E9cy5zbGljZShvKTticmVha31pZihpPD0wKXJldHVybiIiO2E9cy5zbGljZShvLG8raSk7YnJlYWt9cmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KC4uLmEpfX0sQXA9e0FMVDoxLENBVDoyLFJFUDozLFJOTTo0LFRSRzo1LFRCUzo2LFRMUzo3LFVEVDoxMSxBTkQ6MTIsTk9UOjEzLEFDVElWRToxMDAsTUFUQ0g6MTAxLEVNUFRZOjEwMixOT01BVENIOjEwMyxTRU1fUFJFOjIwMCxTRU1fUE9TVDoyMDEsU0VNX09LOjMwMCxpZE5hbWU6cz0+e3N3aXRjaChzKXtjYXNlIEFwLkFMVDpyZXR1cm4iQUxUIjtjYXNlIEFwLkNBVDpyZXR1cm4iQ0FUIjtjYXNlIEFwLlJFUDpyZXR1cm4iUkVQIjtjYXNlIEFwLlJOTTpyZXR1cm4iUk5NIjtjYXNlIEFwLlRSRzpyZXR1cm4iVFJHIjtjYXNlIEFwLlRCUzpyZXR1cm4iVEJTIjtjYXNlIEFwLlRMUzpyZXR1cm4iVExTIjtjYXNlIEFwLlVEVDpyZXR1cm4iVURUIjtjYXNlIEFwLkFORDpyZXR1cm4iQU5EIjtjYXNlIEFwLk5PVDpyZXR1cm4iTk9UIjtjYXNlIEFwLkFDVElWRTpyZXR1cm4iQUNUSVZFIjtjYXNlIEFwLkVNUFRZOnJldHVybiJFTVBUWSI7Y2FzZSBBcC5NQVRDSDpyZXR1cm4iTUFUQ0giO2Nhc2UgQXAuTk9NQVRDSDpyZXR1cm4iTk9NQVRDSCI7Y2FzZSBBcC5TRU1fUFJFOnJldHVybiJTRU1fUFJFIjtjYXNlIEFwLlNFTV9QT1NUOnJldHVybiJTRU1fUE9TVCI7Y2FzZSBBcC5TRU1fT0s6cmV0dXJuIlNFTV9PSyI7ZGVmYXVsdDpyZXR1cm4iVU5SRUNPR05JWkVEIFNUQVRFIn19fTtmdW5jdGlvbiBncmFtbWFyKCl7dGhpcy5ncmFtbWFyT2JqZWN0PSJncmFtbWFyT2JqZWN0Iix0aGlzLnJ1bGVzPVtdLHRoaXMucnVsZXNbMF09e25hbWU6Impzb24tcG9pbnRlciIsbG93ZXI6Impzb24tcG9pbnRlciIsaW5kZXg6MCxpc0JrcjohMX0sdGhpcy5ydWxlc1sxXT17bmFtZToicmVmZXJlbmNlLXRva2VuIixsb3dlcjoicmVmZXJlbmNlLXRva2VuIixpbmRleDoxLGlzQmtyOiExfSx0aGlzLnJ1bGVzWzJdPXtuYW1lOiJ1bmVzY2FwZWQiLGxvd2VyOiJ1bmVzY2FwZWQiLGluZGV4OjIsaXNCa3I6ITF9LHRoaXMucnVsZXNbM109e25hbWU6ImVzY2FwZWQiLGxvd2VyOiJlc2NhcGVkIixpbmRleDozLGlzQmtyOiExfSx0aGlzLnJ1bGVzWzRdPXtuYW1lOiJhcnJheS1sb2NhdGlvbiIsbG93ZXI6ImFycmF5LWxvY2F0aW9uIixpbmRleDo0LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzVdPXtuYW1lOiJhcnJheS1pbmRleCIsbG93ZXI6ImFycmF5LWluZGV4IixpbmRleDo1LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzZdPXtuYW1lOiJhcnJheS1kYXNoIixsb3dlcjoiYXJyYXktZGFzaCIsaW5kZXg6Nixpc0JrcjohMX0sdGhpcy5ydWxlc1s3XT17bmFtZToic2xhc2giLGxvd2VyOiJzbGFzaCIsaW5kZXg6Nyxpc0JrcjohMX0sdGhpcy51ZHRzPVtdLHRoaXMucnVsZXNbMF0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzBdLm9wY29kZXNbMF09e3R5cGU6MyxtaW46MCxtYXg6MS8wfSx0aGlzLnJ1bGVzWzBdLm9wY29kZXNbMV09e3R5cGU6MixjaGlsZHJlbjpbMiwzXX0sdGhpcy5ydWxlc1swXS5vcGNvZGVzWzJdPXt0eXBlOjQsaW5kZXg6N30sdGhpcy5ydWxlc1swXS5vcGNvZGVzWzNdPXt0eXBlOjQsaW5kZXg6MX0sdGhpcy5ydWxlc1sxXS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbMV0ub3Bjb2Rlc1swXT17dHlwZTozLG1pbjowLG1heDoxLzB9LHRoaXMucnVsZXNbMV0ub3Bjb2Rlc1sxXT17dHlwZToxLGNoaWxkcmVuOlsyLDNdfSx0aGlzLnJ1bGVzWzFdLm9wY29kZXNbMl09e3R5cGU6NCxpbmRleDoyfSx0aGlzLnJ1bGVzWzFdLm9wY29kZXNbM109e3R5cGU6NCxpbmRleDozfSx0aGlzLnJ1bGVzWzJdLm9wY29kZXM9W10sdGhpcy5ydWxlc1syXS5vcGNvZGVzWzBdPXt0eXBlOjEsY2hpbGRyZW46WzEsMiwzXX0sdGhpcy5ydWxlc1syXS5vcGNvZGVzWzFdPXt0eXBlOjUsbWluOjAsbWF4OjQ2fSx0aGlzLnJ1bGVzWzJdLm9wY29kZXNbMl09e3R5cGU6NSxtaW46NDgsbWF4OjEyNX0sdGhpcy5ydWxlc1syXS5vcGNvZGVzWzNdPXt0eXBlOjUsbWluOjEyNyxtYXg6MTExNDExMX0sdGhpcy5ydWxlc1szXS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbM10ub3Bjb2Rlc1swXT17dHlwZToyLGNoaWxkcmVuOlsxLDJdfSx0aGlzLnJ1bGVzWzNdLm9wY29kZXNbMV09e3R5cGU6NyxzdHJpbmc6WzEyNl19LHRoaXMucnVsZXNbM10ub3Bjb2Rlc1syXT17dHlwZToxLGNoaWxkcmVuOlszLDRdfSx0aGlzLnJ1bGVzWzNdLm9wY29kZXNbM109e3R5cGU6NyxzdHJpbmc6WzQ4XX0sdGhpcy5ydWxlc1szXS5vcGNvZGVzWzRdPXt0eXBlOjcsc3RyaW5nOls0OV19LHRoaXMucnVsZXNbNF0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzRdLm9wY29kZXNbMF09e3R5cGU6MSxjaGlsZHJlbjpbMSwyXX0sdGhpcy5ydWxlc1s0XS5vcGNvZGVzWzFdPXt0eXBlOjQsaW5kZXg6NX0sdGhpcy5ydWxlc1s0XS5vcGNvZGVzWzJdPXt0eXBlOjQsaW5kZXg6Nn0sdGhpcy5ydWxlc1s1XS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbNV0ub3Bjb2Rlc1swXT17dHlwZToxLGNoaWxkcmVuOlsxLDJdfSx0aGlzLnJ1bGVzWzVdLm9wY29kZXNbMV09e3R5cGU6NixzdHJpbmc6WzQ4XX0sdGhpcy5ydWxlc1s1XS5vcGNvZGVzWzJdPXt0eXBlOjIsY2hpbGRyZW46WzMsNF19LHRoaXMucnVsZXNbNV0ub3Bjb2Rlc1szXT17dHlwZTo1LG1pbjo0OSxtYXg6NTd9LHRoaXMucnVsZXNbNV0ub3Bjb2Rlc1s0XT17dHlwZTozLG1pbjowLG1heDoxLzB9LHRoaXMucnVsZXNbNV0ub3Bjb2Rlc1s1XT17dHlwZTo1LG1pbjo0OCxtYXg6NTd9LHRoaXMucnVsZXNbNl0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzZdLm9wY29kZXNbMF09e3R5cGU6NyxzdHJpbmc6WzQ1XX0sdGhpcy5ydWxlc1s3XS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbN10ub3Bjb2Rlc1swXT17dHlwZTo3LHN0cmluZzpbNDddfSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uIHRvU3RyaW5nKCl7bGV0IHM9IiI7cmV0dXJuIHMrPSI7IEphdmFTY3JpcHQgT2JqZWN0IE5vdGF0aW9uIChKU09OKSBQb2ludGVyIEFCTkYgc3ludGF4XG4iLHMrPSI7IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjkwMVxuIixzKz0ianNvbi1wb2ludGVyICAgID0gKiggc2xhc2ggcmVmZXJlbmNlLXRva2VuICkgOyBNT0RJRklDQVRJT046IHN1cnJvZ2F0ZSB0ZXh0IHJ1bGUgdXNlZFxuIixzKz0icmVmZXJlbmNlLXRva2VuID0gKiggdW5lc2NhcGVkIC8gZXNjYXBlZCApXG4iLHMrPSJ1bmVzY2FwZWQgICAgICAgPSAleDAwLTJFIC8gJXgzMC03RCAvICV4N0YtMTBGRkZGXG4iLHMrPSIgICAgICAgICAgICAgICAgOyAleDJGICgnLycpIGFuZCAleDdFICgnficpIGFyZSBleGNsdWRlZCBmcm9tICd1bmVzY2FwZWQnXG4iLHMrPSdlc2NhcGVkICAgICAgICAgPSAifiIgKCAiMCIgLyAiMSIgKVxuJyxzKz0iICAgICAgICAgICAgICAgIDsgcmVwcmVzZW50aW5nICd+JyBhbmQgJy8nLCByZXNwZWN0aXZlbHlcbiIscys9IlxuIixzKz0iOyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY5MDEjc2VjdGlvbi00XG4iLHMrPSJhcnJheS1sb2NhdGlvbiAgPSBhcnJheS1pbmRleCAvIGFycmF5LWRhc2hcbiIscys9ImFycmF5LWluZGV4ICAgICA9ICV4MzAgLyAoICV4MzEtMzkgKigleDMwLTM5KSApXG4iLHMrPScgICAgICAgICAgICAgICAgOyAiMCIsIG9yIGRpZ2l0cyB3aXRob3V0IGEgbGVhZGluZyAiMCJcbicscys9J2FycmF5LWRhc2ggICAgICA9ICItIlxuJyxzKz0iXG4iLHMrPSI7IFN1cnJvZ2F0ZSBuYW1lZCBydWxlc1xuIixzKz0nc2xhc2ggICAgICAgICAgID0gIi8iXG4nLCc7IEphdmFTY3JpcHQgT2JqZWN0IE5vdGF0aW9uIChKU09OKSBQb2ludGVyIEFCTkYgc3ludGF4XG47IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjkwMVxuanNvbi1wb2ludGVyICAgID0gKiggc2xhc2ggcmVmZXJlbmNlLXRva2VuICkgOyBNT0RJRklDQVRJT046IHN1cnJvZ2F0ZSB0ZXh0IHJ1bGUgdXNlZFxucmVmZXJlbmNlLXRva2VuID0gKiggdW5lc2NhcGVkIC8gZXNjYXBlZCApXG51bmVzY2FwZWQgICAgICAgPSAleDAwLTJFIC8gJXgzMC03RCAvICV4N0YtMTBGRkZGXG4gICAgICAgICAgICAgICAgOyAleDJGIChcJy9cJykgYW5kICV4N0UgKFwnflwnKSBhcmUgZXhjbHVkZWQgZnJvbSBcJ3VuZXNjYXBlZFwnXG5lc2NhcGVkICAgICAgICAgPSAifiIgKCAiMCIgLyAiMSIgKVxuICAgICAgICAgICAgICAgIDsgcmVwcmVzZW50aW5nIFwnflwnIGFuZCBcJy9cJywgcmVzcGVjdGl2ZWx5XG5cbjsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2OTAxI3NlY3Rpb24tNFxuYXJyYXktbG9jYXRpb24gID0gYXJyYXktaW5kZXggLyBhcnJheS1kYXNoXG5hcnJheS1pbmRleCAgICAgPSAleDMwIC8gKCAleDMxLTM5ICooJXgzMC0zOSkgKVxuICAgICAgICAgICAgICAgIDsgIjAiLCBvciBkaWdpdHMgd2l0aG91dCBhIGxlYWRpbmcgIjAiXG5hcnJheS1kYXNoICAgICAgPSAiLSJcblxuOyBTdXJyb2dhdGUgbmFtZWQgcnVsZXNcbnNsYXNoICAgICAgICAgICA9ICIvIlxuJ319Y2xhc3MgSlNPTlBvaW50ZXJFcnJvciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHMsbz12b2lkIDApe2lmKHN1cGVyKHMsbyksdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSwic3RyaW5nIj09dHlwZW9mIHMmJih0aGlzLm1lc3NhZ2U9cyksImZ1bmN0aW9uIj09dHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlP0Vycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcik6dGhpcy5zdGFjaz1uZXcgRXJyb3Iocykuc3RhY2ssbnVsbCE9byYmIm9iamVjdCI9PXR5cGVvZiBvJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywiY2F1c2UiKSYmISgiY2F1c2UiaW4gdGhpcykpe2NvbnN0e2NhdXNlOnN9PW87dGhpcy5jYXVzZT1zLHMgaW5zdGFuY2VvZiBFcnJvciYmInN0YWNrImluIHMmJih0aGlzLnN0YWNrPWAke3RoaXMuc3RhY2t9XG5DQVVTRTogJHtzLnN0YWNrfWApfWlmKG51bGwhPW8mJiJvYmplY3QiPT10eXBlb2Ygbyl7Y29uc3R7Y2F1c2U6cywuLi5pfT1vO09iamVjdC5hc3NpZ24odGhpcyxpKX19fWNvbnN0IENwPUpTT05Qb2ludGVyRXJyb3I7Y29uc3QganA9Y2xhc3MgSlNPTlBvaW50ZXJQYXJzZUVycm9yIGV4dGVuZHMgQ3B7fSxjYWxsYmFja3NfY3N0PXM9PihvLGksYSx1LF8pPT57aWYoIm9iamVjdCIhPXR5cGVvZiBffHxudWxsPT09X3x8QXJyYXkuaXNBcnJheShfKSl0aHJvdyBuZXcganAoInBhcnNlcidzIHVzZXIgZGF0YSBtdXN0IGJlIGFuIG9iamVjdCIpO2lmKG89PT1BcC5TRU1fUFJFKXtjb25zdCBvPXt0eXBlOnMsdGV4dDpPcC5jaGFyc1RvU3RyaW5nKGksYSx1KSxzdGFydDphLGxlbmd0aDp1LGNoaWxkcmVuOltdfTtpZihfLnN0YWNrLmxlbmd0aD4wKXtfLnN0YWNrW18uc3RhY2subGVuZ3RoLTFdLmNoaWxkcmVuLnB1c2gobyl9ZWxzZSBfLnJvb3Q9bztfLnN0YWNrLnB1c2gobyl9bz09PUFwLlNFTV9QT1NUJiZfLnN0YWNrLnBvcCgpfTtjb25zdCBQcD1jbGFzcyBDU1RUcmFuc2xhdG9yIGV4dGVuZHMgd3B7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuY2FsbGJhY2tzWyJqc29uLXBvaW50ZXIiXT1jYWxsYmFja3NfY3N0KCJqc29uLXBvaW50ZXIiKSx0aGlzLmNhbGxiYWNrc1sicmVmZXJlbmNlLXRva2VuIl09Y2FsbGJhY2tzX2NzdCgicmVmZXJlbmNlLXRva2VuIiksdGhpcy5jYWxsYmFja3Muc2xhc2g9Y2FsbGJhY2tzX2NzdCgidGV4dCIpfWdldFRyZWUoKXtjb25zdCBzPXtzdGFjazpbXSxyb290Om51bGx9O3JldHVybiB0aGlzLnRyYW5zbGF0ZShzKSxkZWxldGUgcy5zdGFjayxzfX0sZXNfdW5lc2NhcGU9cz0+e2lmKCJzdHJpbmciIT10eXBlb2Ygcyl0aHJvdyBuZXcgVHlwZUVycm9yKCJSZWZlcmVuY2UgdG9rZW4gbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBzLnJlcGxhY2UoL34xL2csIi8iKS5yZXBsYWNlKC9+MC9nLCJ+Iil9O2NvbnN0IElwPWNsYXNzIEFTVFRyYW5zbGF0b3IgZXh0ZW5kcyBQcHtnZXRUcmVlKCl7Y29uc3R7cm9vdDpzfT1zdXBlci5nZXRUcmVlKCk7cmV0dXJuIHMuY2hpbGRyZW4uZmlsdGVyKCgoe3R5cGU6c30pPT4icmVmZXJlbmNlLXRva2VuIj09PXMpKS5tYXAoKCh7dGV4dDpzfSk9PmVzX3VuZXNjYXBlKHMpKSl9fTtjb25zdCBUcD1jbGFzcyBFeHBlY3RhdGlvbnMgZXh0ZW5kcyBBcnJheXt0b1N0cmluZygpe3JldHVybiB0aGlzLm1hcCgocz0+YCIke1N0cmluZyhzKX0iYCkpLmpvaW4oIiwgIil9fTtjb25zdCBOcD1jbGFzcyBUcmFjZSBleHRlbmRzIHhwe2luZmVyRXhwZWN0YXRpb25zKCl7Y29uc3Qgcz10aGlzLmRpc3BsYXlUcmFjZSgpLnNwbGl0KCJcbiIpLG89bmV3IFNldDtsZXQgaT0tMTtmb3IobGV0IGE9MDthPHMubGVuZ3RoO2ErKyl7Y29uc3QgdT1zW2FdO2lmKHUuaW5jbHVkZXMoIk18Iikpe2NvbnN0IHM9dS5tYXRjaCgvXScoLiopJyQvKTtzJiZzWzFdJiYoaT1hKX1pZihhPmkpe2NvbnN0IHM9dS5tYXRjaCgvTlx8XFtUTFNcKChbXildKylcKV0vKTtzJiZvLmFkZChzWzFdKX19cmV0dXJuIG5ldyBUcCguLi5vKX19LE1wPW5ldyBncmFtbWFyLGVzX3BhcnNlPShzLHt0cmFuc2xhdG9yOm89bmV3IElwLHN0YXRzOmk9ITEsdHJhY2U6YT0hMX09e30pPT57aWYoInN0cmluZyIhPXR5cGVvZiBzKXRocm93IG5ldyBUeXBlRXJyb3IoIkpTT04gUG9pbnRlciBtdXN0IGJlIGEgc3RyaW5nIik7dHJ5e2NvbnN0IHU9bmV3IEVwO28mJih1LmFzdD1vKSxpJiYodS5zdGF0cz1uZXcga3ApLGEmJih1LnRyYWNlPW5ldyBOcCk7Y29uc3QgXz11LnBhcnNlKE1wLCJqc29uLXBvaW50ZXIiLHMpO3JldHVybntyZXN1bHQ6Xyx0cmVlOl8uc3VjY2VzcyYmbz91LmFzdC5nZXRUcmVlKCk6dm9pZCAwLHN0YXRzOnUuc3RhdHMsdHJhY2U6dS50cmFjZX19Y2F0Y2gobyl7dGhyb3cgbmV3IGpwKCJVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBKU09OIFBvaW50ZXIgcGFyc2luZyIse2NhdXNlOm8sanNvblBvaW50ZXI6c30pfX07bmV3IGdyYW1tYXIsbmV3IEVwLG5ldyBncmFtbWFyLG5ldyBFcDtjb25zdCBScD1uZXcgZ3JhbW1hcixEcD1uZXcgRXAsYXJyYXlfaW5kZXg9cz0+e2lmKCJzdHJpbmciIT10eXBlb2YgcylyZXR1cm4hMTt0cnl7cmV0dXJuIERwLnBhcnNlKFJwLCJhcnJheS1pbmRleCIscykuc3VjY2Vzc31jYXRjaHtyZXR1cm4hMX19LExwPW5ldyBncmFtbWFyLEZwPW5ldyBFcCxhcnJheV9kYXNoPXM9PntpZigic3RyaW5nIiE9dHlwZW9mIHMpcmV0dXJuITE7dHJ5e3JldHVybiBGcC5wYXJzZShMcCwiYXJyYXktZGFzaCIscykuc3VjY2Vzc31jYXRjaHtyZXR1cm4hMX19LGVzX2VzY2FwZT1zPT57aWYoInN0cmluZyIhPXR5cGVvZiBzJiYibnVtYmVyIiE9dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcigiUmVmZXJlbmNlIHRva2VuIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVtYmVyIik7cmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC9+L2csIn4wIikucmVwbGFjZSgvXC8vZywifjEiKX07Y29uc3QgQnA9Y2xhc3MgSlNPTlBvaW50ZXJDb21waWxlRXJyb3IgZXh0ZW5kcyBDcHt9LGVzX2NvbXBpbGU9cz0+e2lmKCFBcnJheS5pc0FycmF5KHMpKXRocm93IG5ldyBUeXBlRXJyb3IoIlJlZmVyZW5jZSB0b2tlbnMgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyBvciBudW1iZXJzIik7dHJ5e3JldHVybiAwPT09cy5sZW5ndGg/IiI6YC8ke3MubWFwKChzPT57aWYoInN0cmluZyIhPXR5cGVvZiBzJiYibnVtYmVyIiE9dHlwZW9mIHMpdGhyb3cgbmV3IFR5cGVFcnJvcigiUmVmZXJlbmNlIHRva2VuIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVtYmVyIik7cmV0dXJuIGVzX2VzY2FwZShTdHJpbmcocykpfSkpLmpvaW4oIi8iKX1gfWNhdGNoKG8pe3Rocm93IG5ldyBCcCgiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgSlNPTiBQb2ludGVyIGNvbXBpbGF0aW9uIix7Y2F1c2U6byxyZWZlcmVuY2VUb2tlbnM6c30pfX07Y29uc3QgJHA9Y2xhc3MgVHJhY2VCdWlsZGVyeyNlOyN0OyNyO2NvbnN0cnVjdG9yKHMsbz17fSl7dGhpcy4jZT1zLHRoaXMuI2Uuc3RlcHM9W10sdGhpcy4jZS5mYWlsZWQ9ITEsdGhpcy4jZS5mYWlsZWRBdD0tMSx0aGlzLiNlLm1lc3NhZ2U9YEpTT04gUG9pbnRlciAiJHtvLmpzb25Qb2ludGVyfSIgd2FzIHN1Y2Nlc3NmdWxseSBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgcHJvdmlkZWQgdmFsdWVgLHRoaXMuI2UuY29udGV4dD17Li4ubyxyZWFsbTpvLnJlYWxtLm5hbWV9LHRoaXMuI3Q9W10sdGhpcy4jcj1vLnJlYWxtfXN0ZXAoe3JlZmVyZW5jZVRva2VuOnMsaW5wdXQ6byxvdXRwdXQ6aSxzdWNjZXNzOmE9ITAscmVhc29uOnV9KXtjb25zdCBfPXRoaXMuI3QubGVuZ3RoO3RoaXMuI3QucHVzaChzKTtjb25zdCB3PXtyZWZlcmVuY2VUb2tlbjpzLHJlZmVyZW5jZVRva2VuUG9zaXRpb246XyxpbnB1dDpvLGlucHV0VHlwZTp0aGlzLiNyLmlzT2JqZWN0KG8pPyJvYmplY3QiOnRoaXMuI3IuaXNBcnJheShvKT8iYXJyYXkiOiJ1bnJlY29nbml6ZWQiLG91dHB1dDppLHN1Y2Nlc3M6YX07dSYmKHcucmVhc29uPXUpLHRoaXMuI2Uuc3RlcHMucHVzaCh3KSxhfHwodGhpcy4jZS5mYWlsZWQ9ITAsdGhpcy4jZS5mYWlsZWRBdD1fLHRoaXMuI2UubWVzc2FnZT11KX19O2NvbnN0IHFwPWNsYXNzIEV2YWx1YXRpb25SZWFsbXtuYW1lPSIiO2lzQXJyYXkocyl7dGhyb3cgbmV3IENwKCJSZWFsbS5pc0FycmF5KG5vZGUpIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBzdWJjbGFzcyIpfWlzT2JqZWN0KHMpe3Rocm93IG5ldyBDcCgiUmVhbG0uaXNPYmplY3Qobm9kZSkgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBhIHN1YmNsYXNzIil9c2l6ZU9mKHMpe3Rocm93IG5ldyBDcCgiUmVhbG0uc2l6ZU9mKG5vZGUpIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBzdWJjbGFzcyIpfWhhcyhzLG8pe3Rocm93IG5ldyBDcCgiUmVhbG0uaGFzKG5vZGUpIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYSBzdWJjbGFzcyIpfWV2YWx1YXRlKHMsbyl7dGhyb3cgbmV3IENwKCJSZWFsbS5ldmFsdWF0ZShub2RlKSBtdXN0IGJlIGltcGxlbWVudGVkIGluIGEgc3ViY2xhc3MiKX19O2NvbnN0IFVwPWNsYXNzIEpTT05Qb2ludGVyRXZhbHVhdGVFcnJvciBleHRlbmRzIENwe307Y29uc3QgVnA9Y2xhc3MgSlNPTlBvaW50ZXJJbmRleEVycm9yIGV4dGVuZHMgVXB7fTtjb25zdCB6cD1jbGFzcyBKU09ORXZhbHVhdGlvblJlYWxtIGV4dGVuZHMgcXB7bmFtZT0ianNvbiI7aXNBcnJheShzKXtyZXR1cm4gQXJyYXkuaXNBcnJheShzKX1pc09iamVjdChzKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHMmJm51bGwhPT1zJiYhdGhpcy5pc0FycmF5KHMpfXNpemVPZihzKXtyZXR1cm4gdGhpcy5pc0FycmF5KHMpP3MubGVuZ3RoOnRoaXMuaXNPYmplY3Qocyk/T2JqZWN0LmtleXMocykubGVuZ3RoOjB9aGFzKHMsbyl7aWYodGhpcy5pc0FycmF5KHMpKXtjb25zdCBpPU51bWJlcihvKSxhPWk+Pj4wO2lmKGkhPT1hKXRocm93IG5ldyBWcChgSW52YWxpZCBhcnJheSBpbmRleCAiJHtvfSI6IGluZGV4IG11c3QgYmUgYW4gdW5zaW5nZWQgMzItYml0IGludGVnZXJgLHtyZWZlcmVuY2VUb2tlbjpvLGN1cnJlbnRWYWx1ZTpzLHJlYWxtOnRoaXMubmFtZX0pO3JldHVybiBhPHRoaXMuc2l6ZU9mKHMpJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocyxpKX1yZXR1cm4hIXRoaXMuaXNPYmplY3QocykmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLG8pfWV2YWx1YXRlKHMsbyl7cmV0dXJuIHRoaXMuaXNBcnJheShzKT9zW051bWJlcihvKV06c1tvXX19O2NvbnN0IFdwPWNsYXNzIEpTT05Qb2ludGVyVHlwZUVycm9yIGV4dGVuZHMgVXB7fTtjb25zdCBKcD1jbGFzcyBKU09OUG9pbnRlcktleUVycm9yIGV4dGVuZHMgVXB7fSxlc19ldmFsdWF0ZT0ocyxvLHtzdHJpY3RBcnJheXM6aT0hMCxzdHJpY3RPYmplY3RzOmE9ITAscmVhbG06dT1uZXcgenAsdHJhY2U6Xz0hMH09e30pPT57Y29uc3R7cmVzdWx0OncsdHJlZTp4LHRyYWNlOkN9PWVzX3BhcnNlKG8se3RyYWNlOiEhX30pLGo9Im9iamVjdCI9PXR5cGVvZiBfJiZudWxsIT09Xz9uZXcgJHAoXyx7anNvblBvaW50ZXI6byxyZWZlcmVuY2VUb2tlbnM6eCxzdHJpY3RBcnJheXM6aSxzdHJpY3RPYmplY3RzOmEscmVhbG06dSx2YWx1ZTpzfSk6bnVsbDt0cnl7bGV0IF87aWYoIXcuc3VjY2Vzcyl7bGV0IGk9YEludmFsaWQgSlNPTiBQb2ludGVyOiAiJHtvfSIuIFN5bnRheCBlcnJvciBhdCBwb3NpdGlvbiAke3cubWF4TWF0Y2hlZH1gO3Rocm93IGkrPUM/YCwgZXhwZWN0ZWQgJHtDLmluZmVyRXhwZWN0YXRpb25zKCl9YDoiIixuZXcgVXAoaSx7anNvblBvaW50ZXI6byxjdXJyZW50VmFsdWU6cyxyZWFsbTp1Lm5hbWV9KX1yZXR1cm4geC5yZWR1Y2UoKChzLHcsQyk9PntpZih1LmlzQXJyYXkocykpe2lmKGFycmF5X2Rhc2godykpe2lmKGkpdGhyb3cgbmV3IFZwKGBJbnZhbGlkIGFycmF5IGluZGV4ICItIiBhdCBwb3NpdGlvbiAke0N9IGluICIke299Ii4gVGhlICItIiB0b2tlbiBhbHdheXMgcmVmZXJzIHRvIGEgbm9uZXhpc3RlbnQgZWxlbWVudCBkdXJpbmcgZXZhbHVhdGlvbmAse2pzb25Qb2ludGVyOm8scmVmZXJlbmNlVG9rZW5zOngscmVmZXJlbmNlVG9rZW46dyxyZWZlcmVuY2VUb2tlblBvc2l0aW9uOkMsY3VycmVudFZhbHVlOnMscmVhbG06dS5uYW1lfSk7cmV0dXJuIF89dS5ldmFsdWF0ZShzLFN0cmluZyh1LnNpemVPZihzKSkpLG51bGw9PWp8fGouc3RlcCh7cmVmZXJlbmNlVG9rZW46dyxpbnB1dDpzLG91dHB1dDpffSksX31pZighYXJyYXlfaW5kZXgodykpdGhyb3cgbmV3IFZwKGBJbnZhbGlkIGFycmF5IGluZGV4ICIke3d9IiBhdCBwb3NpdGlvbiAke0N9IGluICIke299IjogaW5kZXggTVVTVCBiZSAiMCIsIG9yIGRpZ2l0cyB3aXRob3V0IGEgbGVhZGluZyAiMCJgLHtqc29uUG9pbnRlcjpvLHJlZmVyZW5jZVRva2Vuczp4LHJlZmVyZW5jZVRva2VuOncscmVmZXJlbmNlVG9rZW5Qb3NpdGlvbjpDLGN1cnJlbnRWYWx1ZTpzLHJlYWxtOnUubmFtZX0pO2NvbnN0IGE9TnVtYmVyKHcpO2lmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhKSl0aHJvdyBuZXcgVnAoYEludmFsaWQgYXJyYXkgaW5kZXggIiR7d30iIGF0IHBvc2l0aW9uICR7Q30gaW4gIiR7b30iOiBpbmRleCBtdXN0IGJlIGEgc2FmZSBpbnRlZ2VyYCx7anNvblBvaW50ZXI6byxyZWZlcmVuY2VUb2tlbnM6eCxyZWZlcmVuY2VUb2tlbjp3LHJlZmVyZW5jZVRva2VuUG9zaXRpb246QyxjdXJyZW50VmFsdWU6cyxyZWFsbTp1Lm5hbWV9KTtpZighdS5oYXMocyx3KSYmaSl0aHJvdyBuZXcgVnAoYEludmFsaWQgYXJyYXkgaW5kZXggIiR7d30iIGF0IHBvc2l0aW9uICR7Q30gaW4gIiR7b30iOiBpbmRleCBub3QgZm91bmQgaW4gYXJyYXlgLHtqc29uUG9pbnRlcjpvLHJlZmVyZW5jZVRva2Vuczp4LHJlZmVyZW5jZVRva2VuOncscmVmZXJlbmNlVG9rZW5Qb3NpdGlvbjpDLGN1cnJlbnRWYWx1ZTpzLHJlYWxtOnUubmFtZX0pO3JldHVybiBfPXUuZXZhbHVhdGUocyx3KSxudWxsPT1qfHxqLnN0ZXAoe3JlZmVyZW5jZVRva2VuOncsaW5wdXQ6cyxvdXRwdXQ6X30pLF99aWYodS5pc09iamVjdChzKSl7aWYoIXUuaGFzKHMsdykmJmEpdGhyb3cgbmV3IEpwKGBJbnZhbGlkIG9iamVjdCBrZXkgIiR7d30iIGF0IHBvc2l0aW9uICR7Q30gaW4gIiR7b30iOiBrZXkgbm90IGZvdW5kIGluIG9iamVjdGAse2pzb25Qb2ludGVyOm8scmVmZXJlbmNlVG9rZW5zOngscmVmZXJlbmNlVG9rZW46dyxyZWZlcmVuY2VUb2tlblBvc2l0aW9uOkMsY3VycmVudFZhbHVlOnMscmVhbG06dS5uYW1lfSk7cmV0dXJuIF89dS5ldmFsdWF0ZShzLHcpLG51bGw9PWp8fGouc3RlcCh7cmVmZXJlbmNlVG9rZW46dyxpbnB1dDpzLG91dHB1dDpffSksX310aHJvdyBuZXcgV3AoYEludmFsaWQgcmVmZXJlbmNlIHRva2VuICIke3d9IiBhdCBwb3NpdGlvbiAke0N9IGluICIke299IjogY2Fubm90IGJlIGFwcGxpZWQgdG8gYSBub24tb2JqZWN0L25vbi1hcnJheSB2YWx1ZWAse2pzb25Qb2ludGVyOm8scmVmZXJlbmNlVG9rZW5zOngscmVmZXJlbmNlVG9rZW46dyxyZWZlcmVuY2VUb2tlblBvc2l0aW9uOkMsY3VycmVudFZhbHVlOnMscmVhbG06dS5uYW1lfSl9KSxzKX1jYXRjaChzKXtpZihudWxsPT1qfHxqLnN0ZXAoe3JlZmVyZW5jZVRva2VuOnMucmVmZXJlbmNlVG9rZW4saW5wdXQ6cy5jdXJyZW50VmFsdWUsc3VjY2VzczohMSxyZWFzb246cy5tZXNzYWdlfSkscyBpbnN0YW5jZW9mIFVwKXRocm93IHM7dGhyb3cgbmV3IFVwKCJVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBKU09OIFBvaW50ZXIgZXZhbHVhdGlvbiIse2NhdXNlOnMsanNvblBvaW50ZXI6byxyZWZlcmVuY2VUb2tlbnM6eH0pfX07Y29uc3QgSHA9Y2xhc3MgQXBpRE9NRXZhbHVhdGlvblJlYWxtIGV4dGVuZHMgcXB7bmFtZT0iYXBpZG9tIjtpc0FycmF5KHMpe3JldHVybiBJdShzKX1pc09iamVjdChzKXtyZXR1cm4gUHUocyl9c2l6ZU9mKHMpe3JldHVybiB0aGlzLmlzQXJyYXkocyl8fHRoaXMuaXNPYmplY3Qocyk/cy5sZW5ndGg6MH1oYXMocyxvKXtpZih0aGlzLmlzQXJyYXkocykpe2NvbnN0IGk9TnVtYmVyKG8pLGE9aT4+PjA7aWYoaSE9PWEpdGhyb3cgbmV3IFZwKGBJbnZhbGlkIGFycmF5IGluZGV4ICIke299IjogaW5kZXggbXVzdCBiZSBhbiB1bnNpbmdlZCAzMi1iaXQgaW50ZWdlcmAse3JlZmVyZW5jZVRva2VuOm8sY3VycmVudFZhbHVlOnMscmVhbG06dGhpcy5uYW1lfSk7cmV0dXJuIGE8dGhpcy5zaXplT2Yocyl9aWYodGhpcy5pc09iamVjdChzKSl7Y29uc3QgaT1zLmtleXMoKSxhPW5ldyBTZXQoaSk7aWYoaS5sZW5ndGghPT1hLnNpemUpdGhyb3cgbmV3IEpwKGBPYmplY3Qga2V5ICIke299IiBpcyBub3QgdW5pcXVlIOKAlCBKU09OIFBvaW50ZXIgcmVxdWlyZXMgdW5pcXVlIG1lbWJlciBuYW1lc2Ase3JlZmVyZW5jZVRva2VuOm8sY3VycmVudFZhbHVlOnMscmVhbG06dGhpcy5uYW1lfSk7cmV0dXJuIHMuaGFzS2V5KG8pfXJldHVybiExfWV2YWx1YXRlKHMsbyl7cmV0dXJuIHRoaXMuaXNBcnJheShzKT9zLmdldChOdW1iZXIobykpOnMuZ2V0KG8pfX0sYXBpZG9tX2V2YWx1YXRlPShzLG8saT17fSk9PmVzX2V2YWx1YXRlKHMsbyx7Li4uaSxyZWFsbTpuZXcgSHB9KTtjbGFzcyBDYWxsYmFjayBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJjYWxsYmFjayJ9fWNvbnN0IEtwPUNhbGxiYWNrO2NsYXNzIENvbXBvbmVudHMgZXh0ZW5kcyB2dS5TaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0iY29tcG9uZW50cyJ9Z2V0IHNjaGVtYXMoKXtyZXR1cm4gdGhpcy5nZXQoInNjaGVtYXMiKX1zZXQgc2NoZW1hcyhzKXt0aGlzLnNldCgic2NoZW1hcyIscyl9Z2V0IHJlc3BvbnNlcygpe3JldHVybiB0aGlzLmdldCgicmVzcG9uc2VzIil9c2V0IHJlc3BvbnNlcyhzKXt0aGlzLnNldCgicmVzcG9uc2VzIixzKX1nZXQgcGFyYW1ldGVycygpe3JldHVybiB0aGlzLmdldCgicGFyYW1ldGVycyIpfXNldCBwYXJhbWV0ZXJzKHMpe3RoaXMuc2V0KCJwYXJhbWV0ZXJzIixzKX1nZXQgZXhhbXBsZXMoKXtyZXR1cm4gdGhpcy5nZXQoImV4YW1wbGVzIil9c2V0IGV4YW1wbGVzKHMpe3RoaXMuc2V0KCJleGFtcGxlcyIscyl9Z2V0IHJlcXVlc3RCb2RpZXMoKXtyZXR1cm4gdGhpcy5nZXQoInJlcXVlc3RCb2RpZXMiKX1zZXQgcmVxdWVzdEJvZGllcyhzKXt0aGlzLnNldCgicmVxdWVzdEJvZGllcyIscyl9Z2V0IGhlYWRlcnMoKXtyZXR1cm4gdGhpcy5nZXQoImhlYWRlcnMiKX1zZXQgaGVhZGVycyhzKXt0aGlzLnNldCgiaGVhZGVycyIscyl9Z2V0IHNlY3VyaXR5U2NoZW1lcygpe3JldHVybiB0aGlzLmdldCgic2VjdXJpdHlTY2hlbWVzIil9c2V0IHNlY3VyaXR5U2NoZW1lcyhzKXt0aGlzLnNldCgic2VjdXJpdHlTY2hlbWVzIixzKX1nZXQgbGlua3MoKXtyZXR1cm4gdGhpcy5nZXQoImxpbmtzIil9c2V0IGxpbmtzKHMpe3RoaXMuc2V0KCJsaW5rcyIscyl9Z2V0IGNhbGxiYWNrcygpe3JldHVybiB0aGlzLmdldCgiY2FsbGJhY2tzIil9c2V0IGNhbGxiYWNrcyhzKXt0aGlzLnNldCgiY2FsbGJhY2tzIixzKX19Y29uc3QgR3A9Q29tcG9uZW50cztjbGFzcyBDb250YWN0IGV4dGVuZHMgdnUuU2h7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmVsZW1lbnQ9ImNvbnRhY3QifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuZ2V0KCJuYW1lIil9c2V0IG5hbWUocyl7dGhpcy5zZXQoIm5hbWUiLHMpfWdldCB1cmwoKXtyZXR1cm4gdGhpcy5nZXQoInVybCIpfXNldCB1cmwocyl7dGhpcy5zZXQoInVybCIscyl9Z2V0IGVtYWlsKCl7cmV0dXJuIHRoaXMuZ2V0KCJlbWFpbCIpfXNldCBlbWFpbChzKXt0aGlzLnNldCgiZW1haWwiLHMpfX1jb25zdCBZcD1Db250YWN0O2NsYXNzIERpc2NyaW1pbmF0b3IgZXh0ZW5kcyB2dS5TaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0iZGlzY3JpbWluYXRvciJ9Z2V0IHByb3BlcnR5TmFtZSgpe3JldHVybiB0aGlzLmdldCgicHJvcGVydHlOYW1lIil9c2V0IHByb3BlcnR5TmFtZShzKXt0aGlzLnNldCgicHJvcGVydHlOYW1lIixzKX1nZXQgbWFwcGluZygpe3JldHVybiB0aGlzLmdldCgibWFwcGluZyIpfXNldCBtYXBwaW5nKHMpe3RoaXMuc2V0KCJtYXBwaW5nIixzKX19Y29uc3QgWHA9RGlzY3JpbWluYXRvcjtjbGFzcyBFbmNvZGluZyBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJlbmNvZGluZyJ9Z2V0IGNvbnRlbnRUeXBlKCl7cmV0dXJuIHRoaXMuZ2V0KCJjb250ZW50VHlwZSIpfXNldCBjb250ZW50VHlwZShzKXt0aGlzLnNldCgiY29udGVudFR5cGUiLHMpfWdldCBoZWFkZXJzKCl7cmV0dXJuIHRoaXMuZ2V0KCJoZWFkZXJzIil9c2V0IGhlYWRlcnMocyl7dGhpcy5zZXQoImhlYWRlcnMiLHMpfWdldCBzdHlsZSgpe3JldHVybiB0aGlzLmdldCgic3R5bGUiKX1zZXQgc3R5bGUocyl7dGhpcy5zZXQoInN0eWxlIixzKX1nZXQgZXhwbG9kZSgpe3JldHVybiB0aGlzLmdldCgiZXhwbG9kZSIpfXNldCBleHBsb2RlKHMpe3RoaXMuc2V0KCJleHBsb2RlIixzKX1nZXQgYWxsb3dlZFJlc2VydmVkKCl7cmV0dXJuIHRoaXMuZ2V0KCJhbGxvd2VkUmVzZXJ2ZWQiKX1zZXQgYWxsb3dlZFJlc2VydmVkKHMpe3RoaXMuc2V0KCJhbGxvd2VkUmVzZXJ2ZWQiLHMpfX1jb25zdCBRcD1FbmNvZGluZztjbGFzcyBFeGFtcGxlIGV4dGVuZHMgdnUuU2h7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmVsZW1lbnQ9ImV4YW1wbGUifWdldCBzdW1tYXJ5KCl7cmV0dXJuIHRoaXMuZ2V0KCJzdW1tYXJ5Iil9c2V0IHN1bW1hcnkocyl7dGhpcy5zZXQoInN1bW1hcnkiLHMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLmdldCgiZGVzY3JpcHRpb24iKX1zZXQgZGVzY3JpcHRpb24ocyl7dGhpcy5zZXQoImRlc2NyaXB0aW9uIixzKX1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5nZXQoInZhbHVlIil9c2V0IHZhbHVlKHMpe3RoaXMuc2V0KCJ2YWx1ZSIscyl9Z2V0IGV4dGVybmFsVmFsdWUoKXtyZXR1cm4gdGhpcy5nZXQoImV4dGVybmFsVmFsdWUiKX1zZXQgZXh0ZXJuYWxWYWx1ZShzKXt0aGlzLnNldCgiZXh0ZXJuYWxWYWx1ZSIscyl9fWNvbnN0IFpwPUV4YW1wbGU7Y2xhc3MgRXh0ZXJuYWxEb2N1bWVudGF0aW9uIGV4dGVuZHMgdnUuU2h7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmVsZW1lbnQ9ImV4dGVybmFsRG9jdW1lbnRhdGlvbiJ9Z2V0IGRlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJkZXNjcmlwdGlvbiIpfXNldCBkZXNjcmlwdGlvbihzKXt0aGlzLnNldCgiZGVzY3JpcHRpb24iLHMpfWdldCB1cmwoKXtyZXR1cm4gdGhpcy5nZXQoInVybCIpfXNldCB1cmwocyl7dGhpcy5zZXQoInVybCIscyl9fWNvbnN0IHRoPUV4dGVybmFsRG9jdW1lbnRhdGlvbjtjbGFzcyBIZWFkZXIgZXh0ZW5kcyB2dS5TaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0iaGVhZGVyIn1nZXQgcmVxdWlyZWQoKXtyZXR1cm4gdGhpcy5oYXNLZXkoInJlcXVpcmVkIik/dGhpcy5nZXQoInJlcXVpcmVkIik6bmV3IHZ1LmJkKCExKX1zZXQgcmVxdWlyZWQocyl7dGhpcy5zZXQoInJlcXVpcmVkIixzKX1nZXQgZGVwcmVjYXRlZCgpe3JldHVybiB0aGlzLmhhc0tleSgiZGVwcmVjYXRlZCIpP3RoaXMuZ2V0KCJkZXByZWNhdGVkIik6bmV3IHZ1LmJkKCExKX1zZXQgZGVwcmVjYXRlZChzKXt0aGlzLnNldCgiZGVwcmVjYXRlZCIscyl9Z2V0IGFsbG93RW1wdHlWYWx1ZSgpe3JldHVybiB0aGlzLmdldCgiYWxsb3dFbXB0eVZhbHVlIil9c2V0IGFsbG93RW1wdHlWYWx1ZShzKXt0aGlzLnNldCgiYWxsb3dFbXB0eVZhbHVlIixzKX1nZXQgc3R5bGUoKXtyZXR1cm4gdGhpcy5nZXQoInN0eWxlIil9c2V0IHN0eWxlKHMpe3RoaXMuc2V0KCJzdHlsZSIscyl9Z2V0IGV4cGxvZGUoKXtyZXR1cm4gdGhpcy5nZXQoImV4cGxvZGUiKX1zZXQgZXhwbG9kZShzKXt0aGlzLnNldCgiZXhwbG9kZSIscyl9Z2V0IGFsbG93UmVzZXJ2ZWQoKXtyZXR1cm4gdGhpcy5nZXQoImFsbG93UmVzZXJ2ZWQiKX1zZXQgYWxsb3dSZXNlcnZlZChzKXt0aGlzLnNldCgiYWxsb3dSZXNlcnZlZCIscyl9Z2V0IHNjaGVtYSgpe3JldHVybiB0aGlzLmdldCgic2NoZW1hIil9c2V0IHNjaGVtYShzKXt0aGlzLnNldCgic2NoZW1hIixzKX1nZXQgZXhhbXBsZSgpe3JldHVybiB0aGlzLmdldCgiZXhhbXBsZSIpfXNldCBleGFtcGxlKHMpe3RoaXMuc2V0KCJleGFtcGxlIixzKX1nZXQgZXhhbXBsZXMoKXtyZXR1cm4gdGhpcy5nZXQoImV4YW1wbGVzIil9c2V0IGV4YW1wbGVzKHMpe3RoaXMuc2V0KCJleGFtcGxlcyIscyl9Z2V0IGNvbnRlbnRQcm9wKCl7cmV0dXJuIHRoaXMuZ2V0KCJjb250ZW50Iil9c2V0IGNvbnRlbnRQcm9wKHMpe3RoaXMuc2V0KCJjb250ZW50IixzKX19T2JqZWN0LmRlZmluZVByb3BlcnR5KEhlYWRlci5wcm90b3R5cGUsImRlc2NyaXB0aW9uIix7Z2V0KCl7cmV0dXJuIHRoaXMuZ2V0KCJkZXNjcmlwdGlvbiIpfSxzZXQocyl7dGhpcy5zZXQoImRlc2NyaXB0aW9uIixzKX0sZW51bWVyYWJsZTohMH0pO2NvbnN0IHJoPUhlYWRlcjtjbGFzcyBJbmZvIGV4dGVuZHMgdnUuU2h7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmVsZW1lbnQ9ImluZm8iLHRoaXMuY2xhc3Nlcy5wdXNoKCJpbmZvIil9Z2V0IHRpdGxlKCl7cmV0dXJuIHRoaXMuZ2V0KCJ0aXRsZSIpfXNldCB0aXRsZShzKXt0aGlzLnNldCgidGl0bGUiLHMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLmdldCgiZGVzY3JpcHRpb24iKX1zZXQgZGVzY3JpcHRpb24ocyl7dGhpcy5zZXQoImRlc2NyaXB0aW9uIixzKX1nZXQgdGVybXNPZlNlcnZpY2UoKXtyZXR1cm4gdGhpcy5nZXQoInRlcm1zT2ZTZXJ2aWNlIil9c2V0IHRlcm1zT2ZTZXJ2aWNlKHMpe3RoaXMuc2V0KCJ0ZXJtc09mU2VydmljZSIscyl9Z2V0IGNvbnRhY3QoKXtyZXR1cm4gdGhpcy5nZXQoImNvbnRhY3QiKX1zZXQgY29udGFjdChzKXt0aGlzLnNldCgiY29udGFjdCIscyl9Z2V0IGxpY2Vuc2UoKXtyZXR1cm4gdGhpcy5nZXQoImxpY2Vuc2UiKX1zZXQgbGljZW5zZShzKXt0aGlzLnNldCgibGljZW5zZSIscyl9Z2V0IHZlcnNpb24oKXtyZXR1cm4gdGhpcy5nZXQoInZlcnNpb24iKX1zZXQgdmVyc2lvbihzKXt0aGlzLnNldCgidmVyc2lvbiIscyl9fWNvbnN0IHVoPUluZm87Y2xhc3MgTGljZW5zZSBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJsaWNlbnNlIn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLmdldCgibmFtZSIpfXNldCBuYW1lKHMpe3RoaXMuc2V0KCJuYW1lIixzKX1nZXQgdXJsKCl7cmV0dXJuIHRoaXMuZ2V0KCJ1cmwiKX1zZXQgdXJsKHMpe3RoaXMuc2V0KCJ1cmwiLHMpfX1jb25zdCBkaD1MaWNlbnNlO2NsYXNzIExpbmsgZXh0ZW5kcyB2dS5TaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ibGluayJ9Z2V0IG9wZXJhdGlvblJlZigpe3JldHVybiB0aGlzLmdldCgib3BlcmF0aW9uUmVmIil9c2V0IG9wZXJhdGlvblJlZihzKXt0aGlzLnNldCgib3BlcmF0aW9uUmVmIixzKX1nZXQgb3BlcmF0aW9uSWQoKXtyZXR1cm4gdGhpcy5nZXQoIm9wZXJhdGlvbklkIil9c2V0IG9wZXJhdGlvbklkKHMpe3RoaXMuc2V0KCJvcGVyYXRpb25JZCIscyl9Z2V0IG9wZXJhdGlvbigpe3ZhciBzLG87cmV0dXJuIE91KHRoaXMub3BlcmF0aW9uUmVmKT9udWxsPT09KHM9dGhpcy5vcGVyYXRpb25SZWYpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLm1ldGEuZ2V0KCJvcGVyYXRpb24iKTpPdSh0aGlzLm9wZXJhdGlvbklkKT9udWxsPT09KG89dGhpcy5vcGVyYXRpb25JZCl8fHZvaWQgMD09PW8/dm9pZCAwOm8ubWV0YS5nZXQoIm9wZXJhdGlvbiIpOnZvaWQgMH1zZXQgb3BlcmF0aW9uKHMpe3RoaXMuc2V0KCJvcGVyYXRpb24iLHMpfWdldCBwYXJhbWV0ZXJzKCl7cmV0dXJuIHRoaXMuZ2V0KCJwYXJhbWV0ZXJzIil9c2V0IHBhcmFtZXRlcnMocyl7dGhpcy5zZXQoInBhcmFtZXRlcnMiLHMpfWdldCByZXF1ZXN0Qm9keSgpe3JldHVybiB0aGlzLmdldCgicmVxdWVzdEJvZHkiKX1zZXQgcmVxdWVzdEJvZHkocyl7dGhpcy5zZXQoInJlcXVlc3RCb2R5IixzKX1nZXQgZGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5nZXQoImRlc2NyaXB0aW9uIil9c2V0IGRlc2NyaXB0aW9uKHMpe3RoaXMuc2V0KCJkZXNjcmlwdGlvbiIscyl9Z2V0IHNlcnZlcigpe3JldHVybiB0aGlzLmdldCgic2VydmVyIil9c2V0IHNlcnZlcihzKXt0aGlzLnNldCgic2VydmVyIixzKX19Y29uc3QgZmg9TGluaztjbGFzcyBNZWRpYVR5cGUgZXh0ZW5kcyB2dS5TaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ibWVkaWFUeXBlIn1nZXQgc2NoZW1hKCl7cmV0dXJuIHRoaXMuZ2V0KCJzY2hlbWEiKX1zZXQgc2NoZW1hKHMpe3RoaXMuc2V0KCJzY2hlbWEiLHMpfWdldCBleGFtcGxlKCl7cmV0dXJuIHRoaXMuZ2V0KCJleGFtcGxlIil9c2V0IGV4YW1wbGUocyl7dGhpcy5zZXQoImV4YW1wbGUiLHMpfWdldCBleGFtcGxlcygpe3JldHVybiB0aGlzLmdldCgiZXhhbXBsZXMiKX1zZXQgZXhhbXBsZXMocyl7dGhpcy5zZXQoImV4YW1wbGVzIixzKX1nZXQgZW5jb2RpbmcoKXtyZXR1cm4gdGhpcy5nZXQoImVuY29kaW5nIil9c2V0IGVuY29kaW5nKHMpe3RoaXMuc2V0KCJlbmNvZGluZyIscyl9fWNvbnN0IHZoPU1lZGlhVHlwZTtjbGFzcyBPQXV0aEZsb3cgZXh0ZW5kcyB2dS5TaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ib0F1dGhGbG93In1nZXQgYXV0aG9yaXphdGlvblVybCgpe3JldHVybiB0aGlzLmdldCgiYXV0aG9yaXphdGlvblVybCIpfXNldCBhdXRob3JpemF0aW9uVXJsKHMpe3RoaXMuc2V0KCJhdXRob3JpemF0aW9uVXJsIixzKX1nZXQgdG9rZW5VcmwoKXtyZXR1cm4gdGhpcy5nZXQoInRva2VuVXJsIil9c2V0IHRva2VuVXJsKHMpe3RoaXMuc2V0KCJ0b2tlblVybCIscyl9Z2V0IHJlZnJlc2hVcmwoKXtyZXR1cm4gdGhpcy5nZXQoInJlZnJlc2hVcmwiKX1zZXQgcmVmcmVzaFVybChzKXt0aGlzLnNldCgicmVmcmVzaFVybCIscyl9Z2V0IHNjb3Blcygpe3JldHVybiB0aGlzLmdldCgic2NvcGVzIil9c2V0IHNjb3BlcyhzKXt0aGlzLnNldCgic2NvcGVzIixzKX19Y29uc3QgX2g9T0F1dGhGbG93O2NsYXNzIE9BdXRoRmxvd3MgZXh0ZW5kcyB2dS5TaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ib0F1dGhGbG93cyJ9Z2V0IGltcGxpY2l0KCl7cmV0dXJuIHRoaXMuZ2V0KCJpbXBsaWNpdCIpfXNldCBpbXBsaWNpdChzKXt0aGlzLnNldCgiaW1wbGljaXQiLHMpfWdldCBwYXNzd29yZCgpe3JldHVybiB0aGlzLmdldCgicGFzc3dvcmQiKX1zZXQgcGFzc3dvcmQocyl7dGhpcy5zZXQoInBhc3N3b3JkIixzKX1nZXQgY2xpZW50Q3JlZGVudGlhbHMoKXtyZXR1cm4gdGhpcy5nZXQoImNsaWVudENyZWRlbnRpYWxzIil9c2V0IGNsaWVudENyZWRlbnRpYWxzKHMpe3RoaXMuc2V0KCJjbGllbnRDcmVkZW50aWFscyIscyl9Z2V0IGF1dGhvcml6YXRpb25Db2RlKCl7cmV0dXJuIHRoaXMuZ2V0KCJhdXRob3JpemF0aW9uQ29kZSIpfXNldCBhdXRob3JpemF0aW9uQ29kZShzKXt0aGlzLnNldCgiYXV0aG9yaXphdGlvbkNvZGUiLHMpfX1jb25zdCB3aD1PQXV0aEZsb3dzO2NsYXNzIE9wZW5hcGkgZXh0ZW5kcyB2dS5PbXtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ib3BlbmFwaSIsdGhpcy5jbGFzc2VzLnB1c2goInNwZWMtdmVyc2lvbiIpLHRoaXMuY2xhc3Nlcy5wdXNoKCJ2ZXJzaW9uIil9fWNvbnN0IE9oPU9wZW5hcGk7Y2xhc3MgT3BlbkFwaTNfMCBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJvcGVuQXBpM18wIix0aGlzLmNsYXNzZXMucHVzaCgiYXBpIil9Z2V0IG9wZW5hcGkoKXtyZXR1cm4gdGhpcy5nZXQoIm9wZW5hcGkiKX1zZXQgb3BlbmFwaShzKXt0aGlzLnNldCgib3BlbmFwaSIscyl9Z2V0IGluZm8oKXtyZXR1cm4gdGhpcy5nZXQoImluZm8iKX1zZXQgaW5mbyhzKXt0aGlzLnNldCgiaW5mbyIscyl9Z2V0IHNlcnZlcnMoKXtyZXR1cm4gdGhpcy5nZXQoInNlcnZlcnMiKX1zZXQgc2VydmVycyhzKXt0aGlzLnNldCgic2VydmVycyIscyl9Z2V0IHBhdGhzKCl7cmV0dXJuIHRoaXMuZ2V0KCJwYXRocyIpfXNldCBwYXRocyhzKXt0aGlzLnNldCgicGF0aHMiLHMpfWdldCBjb21wb25lbnRzKCl7cmV0dXJuIHRoaXMuZ2V0KCJjb21wb25lbnRzIil9c2V0IGNvbXBvbmVudHMocyl7dGhpcy5zZXQoImNvbXBvbmVudHMiLHMpfWdldCBzZWN1cml0eSgpe3JldHVybiB0aGlzLmdldCgic2VjdXJpdHkiKX1zZXQgc2VjdXJpdHkocyl7dGhpcy5zZXQoInNlY3VyaXR5IixzKX1nZXQgdGFncygpe3JldHVybiB0aGlzLmdldCgidGFncyIpfXNldCB0YWdzKHMpe3RoaXMuc2V0KCJ0YWdzIixzKX1nZXQgZXh0ZXJuYWxEb2NzKCl7cmV0dXJuIHRoaXMuZ2V0KCJleHRlcm5hbERvY3MiKX1zZXQgZXh0ZXJuYWxEb2NzKHMpe3RoaXMuc2V0KCJleHRlcm5hbERvY3MiLHMpfX1jb25zdCBqaD1PcGVuQXBpM18wO2NsYXNzIE9wZXJhdGlvbiBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJvcGVyYXRpb24ifWdldCB0YWdzKCl7cmV0dXJuIHRoaXMuZ2V0KCJ0YWdzIil9c2V0IHRhZ3Mocyl7dGhpcy5zZXQoInRhZ3MiLHMpfWdldCBzdW1tYXJ5KCl7cmV0dXJuIHRoaXMuZ2V0KCJzdW1tYXJ5Iil9c2V0IHN1bW1hcnkocyl7dGhpcy5zZXQoInN1bW1hcnkiLHMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLmdldCgiZGVzY3JpcHRpb24iKX1zZXQgZGVzY3JpcHRpb24ocyl7dGhpcy5zZXQoImRlc2NyaXB0aW9uIixzKX1zZXQgZXh0ZXJuYWxEb2NzKHMpe3RoaXMuc2V0KCJleHRlcm5hbERvY3MiLHMpfWdldCBleHRlcm5hbERvY3MoKXtyZXR1cm4gdGhpcy5nZXQoImV4dGVybmFsRG9jcyIpfWdldCBvcGVyYXRpb25JZCgpe3JldHVybiB0aGlzLmdldCgib3BlcmF0aW9uSWQiKX1zZXQgb3BlcmF0aW9uSWQocyl7dGhpcy5zZXQoIm9wZXJhdGlvbklkIixzKX1nZXQgcGFyYW1ldGVycygpe3JldHVybiB0aGlzLmdldCgicGFyYW1ldGVycyIpfXNldCBwYXJhbWV0ZXJzKHMpe3RoaXMuc2V0KCJwYXJhbWV0ZXJzIixzKX1nZXQgcmVxdWVzdEJvZHkoKXtyZXR1cm4gdGhpcy5nZXQoInJlcXVlc3RCb2R5Iil9c2V0IHJlcXVlc3RCb2R5KHMpe3RoaXMuc2V0KCJyZXF1ZXN0Qm9keSIscyl9Z2V0IHJlc3BvbnNlcygpe3JldHVybiB0aGlzLmdldCgicmVzcG9uc2VzIil9c2V0IHJlc3BvbnNlcyhzKXt0aGlzLnNldCgicmVzcG9uc2VzIixzKX1nZXQgY2FsbGJhY2tzKCl7cmV0dXJuIHRoaXMuZ2V0KCJjYWxsYmFja3MiKX1zZXQgY2FsbGJhY2tzKHMpe3RoaXMuc2V0KCJjYWxsYmFja3MiLHMpfWdldCBkZXByZWNhdGVkKCl7cmV0dXJuIHRoaXMuaGFzS2V5KCJkZXByZWNhdGVkIik/dGhpcy5nZXQoImRlcHJlY2F0ZWQiKTpuZXcgdnUuYmQoITEpfXNldCBkZXByZWNhdGVkKHMpe3RoaXMuc2V0KCJkZXByZWNhdGVkIixzKX1nZXQgc2VjdXJpdHkoKXtyZXR1cm4gdGhpcy5nZXQoInNlY3VyaXR5Iil9c2V0IHNlY3VyaXR5KHMpe3RoaXMuc2V0KCJzZWN1cml0eSIscyl9Z2V0IHNlcnZlcnMoKXtyZXR1cm4gdGhpcy5nZXQoInNldmVycyIpfXNldCBzZXJ2ZXJzKHMpe3RoaXMuc2V0KCJzZXJ2ZXJzIixzKX19Y29uc3QgUGg9T3BlcmF0aW9uO2NsYXNzIFBhcmFtZXRlciBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJwYXJhbWV0ZXIifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuZ2V0KCJuYW1lIil9c2V0IG5hbWUocyl7dGhpcy5zZXQoIm5hbWUiLHMpfWdldCBpbigpe3JldHVybiB0aGlzLmdldCgiaW4iKX1zZXQgaW4ocyl7dGhpcy5zZXQoImluIixzKX1nZXQgcmVxdWlyZWQoKXtyZXR1cm4gdGhpcy5oYXNLZXkoInJlcXVpcmVkIik/dGhpcy5nZXQoInJlcXVpcmVkIik6bmV3IHZ1LmJkKCExKX1zZXQgcmVxdWlyZWQocyl7dGhpcy5zZXQoInJlcXVpcmVkIixzKX1nZXQgZGVwcmVjYXRlZCgpe3JldHVybiB0aGlzLmhhc0tleSgiZGVwcmVjYXRlZCIpP3RoaXMuZ2V0KCJkZXByZWNhdGVkIik6bmV3IHZ1LmJkKCExKX1zZXQgZGVwcmVjYXRlZChzKXt0aGlzLnNldCgiZGVwcmVjYXRlZCIscyl9Z2V0IGFsbG93RW1wdHlWYWx1ZSgpe3JldHVybiB0aGlzLmdldCgiYWxsb3dFbXB0eVZhbHVlIil9c2V0IGFsbG93RW1wdHlWYWx1ZShzKXt0aGlzLnNldCgiYWxsb3dFbXB0eVZhbHVlIixzKX1nZXQgc3R5bGUoKXtyZXR1cm4gdGhpcy5nZXQoInN0eWxlIil9c2V0IHN0eWxlKHMpe3RoaXMuc2V0KCJzdHlsZSIscyl9Z2V0IGV4cGxvZGUoKXtyZXR1cm4gdGhpcy5nZXQoImV4cGxvZGUiKX1zZXQgZXhwbG9kZShzKXt0aGlzLnNldCgiZXhwbG9kZSIscyl9Z2V0IGFsbG93UmVzZXJ2ZWQoKXtyZXR1cm4gdGhpcy5nZXQoImFsbG93UmVzZXJ2ZWQiKX1zZXQgYWxsb3dSZXNlcnZlZChzKXt0aGlzLnNldCgiYWxsb3dSZXNlcnZlZCIscyl9Z2V0IHNjaGVtYSgpe3JldHVybiB0aGlzLmdldCgic2NoZW1hIil9c2V0IHNjaGVtYShzKXt0aGlzLnNldCgic2NoZW1hIixzKX1nZXQgZXhhbXBsZSgpe3JldHVybiB0aGlzLmdldCgiZXhhbXBsZSIpfXNldCBleGFtcGxlKHMpe3RoaXMuc2V0KCJleGFtcGxlIixzKX1nZXQgZXhhbXBsZXMoKXtyZXR1cm4gdGhpcy5nZXQoImV4YW1wbGVzIil9c2V0IGV4YW1wbGVzKHMpe3RoaXMuc2V0KCJleGFtcGxlcyIscyl9Z2V0IGNvbnRlbnRQcm9wKCl7cmV0dXJuIHRoaXMuZ2V0KCJjb250ZW50Iil9c2V0IGNvbnRlbnRQcm9wKHMpe3RoaXMuc2V0KCJjb250ZW50IixzKX19T2JqZWN0LmRlZmluZVByb3BlcnR5KFBhcmFtZXRlci5wcm90b3R5cGUsImRlc2NyaXB0aW9uIix7Z2V0KCl7cmV0dXJuIHRoaXMuZ2V0KCJkZXNjcmlwdGlvbiIpfSxzZXQocyl7dGhpcy5zZXQoImRlc2NyaXB0aW9uIixzKX0sZW51bWVyYWJsZTohMH0pO2NvbnN0IEloPVBhcmFtZXRlcjtjbGFzcyBQYXRoSXRlbSBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJwYXRoSXRlbSJ9Z2V0ICRyZWYoKXtyZXR1cm4gdGhpcy5nZXQoIiRyZWYiKX1zZXQgJHJlZihzKXt0aGlzLnNldCgiJHJlZiIscyl9Z2V0IHN1bW1hcnkoKXtyZXR1cm4gdGhpcy5nZXQoInN1bW1hcnkiKX1zZXQgc3VtbWFyeShzKXt0aGlzLnNldCgic3VtbWFyeSIscyl9Z2V0IGRlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJkZXNjcmlwdGlvbiIpfXNldCBkZXNjcmlwdGlvbihzKXt0aGlzLnNldCgiZGVzY3JpcHRpb24iLHMpfWdldCBHRVQoKXtyZXR1cm4gdGhpcy5nZXQoImdldCIpfXNldCBHRVQocyl7dGhpcy5zZXQoIkdFVCIscyl9Z2V0IFBVVCgpe3JldHVybiB0aGlzLmdldCgicHV0Iil9c2V0IFBVVChzKXt0aGlzLnNldCgiUFVUIixzKX1nZXQgUE9TVCgpe3JldHVybiB0aGlzLmdldCgicG9zdCIpfXNldCBQT1NUKHMpe3RoaXMuc2V0KCJQT1NUIixzKX1nZXQgREVMRVRFKCl7cmV0dXJuIHRoaXMuZ2V0KCJkZWxldGUiKX1zZXQgREVMRVRFKHMpe3RoaXMuc2V0KCJERUxFVEUiLHMpfWdldCBPUFRJT05TKCl7cmV0dXJuIHRoaXMuZ2V0KCJvcHRpb25zIil9c2V0IE9QVElPTlMocyl7dGhpcy5zZXQoIk9QVElPTlMiLHMpfWdldCBIRUFEKCl7cmV0dXJuIHRoaXMuZ2V0KCJoZWFkIil9c2V0IEhFQUQocyl7dGhpcy5zZXQoIkhFQUQiLHMpfWdldCBQQVRDSCgpe3JldHVybiB0aGlzLmdldCgicGF0Y2giKX1zZXQgUEFUQ0gocyl7dGhpcy5zZXQoIlBBVENIIixzKX1nZXQgVFJBQ0UoKXtyZXR1cm4gdGhpcy5nZXQoInRyYWNlIil9c2V0IFRSQUNFKHMpe3RoaXMuc2V0KCJUUkFDRSIscyl9Z2V0IHNlcnZlcnMoKXtyZXR1cm4gdGhpcy5nZXQoInNlcnZlcnMiKX1zZXQgc2VydmVycyhzKXt0aGlzLnNldCgic2VydmVycyIscyl9Z2V0IHBhcmFtZXRlcnMoKXtyZXR1cm4gdGhpcy5nZXQoInBhcmFtZXRlcnMiKX1zZXQgcGFyYW1ldGVycyhzKXt0aGlzLnNldCgicGFyYW1ldGVycyIscyl9fWNvbnN0IFJoPVBhdGhJdGVtO2NsYXNzIFBhdGhzIGV4dGVuZHMgdnUuU2h7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmVsZW1lbnQ9InBhdGhzIn19Y29uc3QgRGg9UGF0aHM7Y2xhc3MgUmVmZXJlbmNlIGV4dGVuZHMgdnUuU2h7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmVsZW1lbnQ9InJlZmVyZW5jZSIsdGhpcy5jbGFzc2VzLnB1c2goIm9wZW5hcGktcmVmZXJlbmNlIil9Z2V0ICRyZWYoKXtyZXR1cm4gdGhpcy5nZXQoIiRyZWYiKX1zZXQgJHJlZihzKXt0aGlzLnNldCgiJHJlZiIscyl9fWNvbnN0IExoPVJlZmVyZW5jZTtjbGFzcyBSZXF1ZXN0Qm9keSBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJyZXF1ZXN0Qm9keSJ9Z2V0IGRlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJkZXNjcmlwdGlvbiIpfXNldCBkZXNjcmlwdGlvbihzKXt0aGlzLnNldCgiZGVzY3JpcHRpb24iLHMpfWdldCBjb250ZW50UHJvcCgpe3JldHVybiB0aGlzLmdldCgiY29udGVudCIpfXNldCBjb250ZW50UHJvcChzKXt0aGlzLnNldCgiY29udGVudCIscyl9Z2V0IHJlcXVpcmVkKCl7cmV0dXJuIHRoaXMuaGFzS2V5KCJyZXF1aXJlZCIpP3RoaXMuZ2V0KCJyZXF1aXJlZCIpOm5ldyB2dS5iZCghMSl9c2V0IHJlcXVpcmVkKHMpe3RoaXMuc2V0KCJyZXF1aXJlZCIscyl9fWNvbnN0IEZoPVJlcXVlc3RCb2R5O2NsYXNzIFJlc3BvbnNlX1Jlc3BvbnNlIGV4dGVuZHMgdnUuU2h7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmVsZW1lbnQ9InJlc3BvbnNlIn1nZXQgZGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5nZXQoImRlc2NyaXB0aW9uIil9c2V0IGRlc2NyaXB0aW9uKHMpe3RoaXMuc2V0KCJkZXNjcmlwdGlvbiIscyl9Z2V0IGhlYWRlcnMoKXtyZXR1cm4gdGhpcy5nZXQoImhlYWRlcnMiKX1zZXQgaGVhZGVycyhzKXt0aGlzLnNldCgiaGVhZGVycyIscyl9Z2V0IGNvbnRlbnRQcm9wKCl7cmV0dXJuIHRoaXMuZ2V0KCJjb250ZW50Iil9c2V0IGNvbnRlbnRQcm9wKHMpe3RoaXMuc2V0KCJjb250ZW50IixzKX1nZXQgbGlua3MoKXtyZXR1cm4gdGhpcy5nZXQoImxpbmtzIil9c2V0IGxpbmtzKHMpe3RoaXMuc2V0KCJsaW5rcyIscyl9fWNvbnN0IEpoPVJlc3BvbnNlX1Jlc3BvbnNlO2NsYXNzIFJlc3BvbnNlcyBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJyZXNwb25zZXMifWdldCBkZWZhdWx0KCl7cmV0dXJuIHRoaXMuZ2V0KCJkZWZhdWx0Iil9c2V0IGRlZmF1bHQocyl7dGhpcy5zZXQoImRlZmF1bHQiLHMpfX1jb25zdCBIaD1SZXNwb25zZXM7Y29uc3QgS2g9Y2xhc3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FcnJvciBleHRlbmRzIEtve307Y2xhc3MgSlNPTlNjaGVtYSBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJKU09OU2NoZW1hRHJhZnQ0In1nZXQgaWRQcm9wKCl7cmV0dXJuIHRoaXMuZ2V0KCJpZCIpfXNldCBpZFByb3Aocyl7dGhpcy5zZXQoImlkIixzKX1nZXQgJHNjaGVtYSgpe3JldHVybiB0aGlzLmdldCgiJHNjaGVtYSIpfXNldCAkc2NoZW1hKHMpe3RoaXMuc2V0KCIkc2NoZW1hIixzKX1nZXQgbXVsdGlwbGVPZigpe3JldHVybiB0aGlzLmdldCgibXVsdGlwbGVPZiIpfXNldCBtdWx0aXBsZU9mKHMpe3RoaXMuc2V0KCJtdWx0aXBsZU9mIixzKX1nZXQgbWF4aW11bSgpe3JldHVybiB0aGlzLmdldCgibWF4aW11bSIpfXNldCBtYXhpbXVtKHMpe3RoaXMuc2V0KCJtYXhpbXVtIixzKX1nZXQgZXhjbHVzaXZlTWF4aW11bSgpe3JldHVybiB0aGlzLmdldCgiZXhjbHVzaXZlTWF4aW11bSIpfXNldCBleGNsdXNpdmVNYXhpbXVtKHMpe3RoaXMuc2V0KCJleGNsdXNpdmVNYXhpbXVtIixzKX1nZXQgbWluaW11bSgpe3JldHVybiB0aGlzLmdldCgibWluaW11bSIpfXNldCBtaW5pbXVtKHMpe3RoaXMuc2V0KCJtaW5pbXVtIixzKX1nZXQgZXhjbHVzaXZlTWluaW11bSgpe3JldHVybiB0aGlzLmdldCgiZXhjbHVzaXZlTWluaW11bSIpfXNldCBleGNsdXNpdmVNaW5pbXVtKHMpe3RoaXMuc2V0KCJleGNsdXNpdmVNaW5pbXVtIixzKX1nZXQgbWF4TGVuZ3RoKCl7cmV0dXJuIHRoaXMuZ2V0KCJtYXhMZW5ndGgiKX1zZXQgbWF4TGVuZ3RoKHMpe3RoaXMuc2V0KCJtYXhMZW5ndGgiLHMpfWdldCBtaW5MZW5ndGgoKXtyZXR1cm4gdGhpcy5nZXQoIm1pbkxlbmd0aCIpfXNldCBtaW5MZW5ndGgocyl7dGhpcy5zZXQoIm1pbkxlbmd0aCIscyl9Z2V0IHBhdHRlcm4oKXtyZXR1cm4gdGhpcy5nZXQoInBhdHRlcm4iKX1zZXQgcGF0dGVybihzKXt0aGlzLnNldCgicGF0dGVybiIscyl9Z2V0IGFkZGl0aW9uYWxJdGVtcygpe3JldHVybiB0aGlzLmdldCgiYWRkaXRpb25hbEl0ZW1zIil9c2V0IGFkZGl0aW9uYWxJdGVtcyhzKXt0aGlzLnNldCgiYWRkaXRpb25hbEl0ZW1zIixzKX1nZXQgaXRlbXMoKXtyZXR1cm4gdGhpcy5nZXQoIml0ZW1zIil9c2V0IGl0ZW1zKHMpe3RoaXMuc2V0KCJpdGVtcyIscyl9Z2V0IG1heEl0ZW1zKCl7cmV0dXJuIHRoaXMuZ2V0KCJtYXhJdGVtcyIpfXNldCBtYXhJdGVtcyhzKXt0aGlzLnNldCgibWF4SXRlbXMiLHMpfWdldCBtaW5JdGVtcygpe3JldHVybiB0aGlzLmdldCgibWluSXRlbXMiKX1zZXQgbWluSXRlbXMocyl7dGhpcy5zZXQoIm1pbkl0ZW1zIixzKX1nZXQgdW5pcXVlSXRlbXMoKXtyZXR1cm4gdGhpcy5nZXQoInVuaXF1ZUl0ZW1zIil9c2V0IHVuaXF1ZUl0ZW1zKHMpe3RoaXMuc2V0KCJ1bmlxdWVJdGVtcyIscyl9Z2V0IG1heFByb3BlcnRpZXMoKXtyZXR1cm4gdGhpcy5nZXQoIm1heFByb3BlcnRpZXMiKX1zZXQgbWF4UHJvcGVydGllcyhzKXt0aGlzLnNldCgibWF4UHJvcGVydGllcyIscyl9Z2V0IG1pblByb3BlcnRpZXMoKXtyZXR1cm4gdGhpcy5nZXQoIm1pblByb3BlcnRpZXMiKX1zZXQgbWluUHJvcGVydGllcyhzKXt0aGlzLnNldCgibWluUHJvcGVydGllcyIscyl9Z2V0IHJlcXVpcmVkKCl7cmV0dXJuIHRoaXMuZ2V0KCJyZXF1aXJlZCIpfXNldCByZXF1aXJlZChzKXt0aGlzLnNldCgicmVxdWlyZWQiLHMpfWdldCBwcm9wZXJ0aWVzKCl7cmV0dXJuIHRoaXMuZ2V0KCJwcm9wZXJ0aWVzIil9c2V0IHByb3BlcnRpZXMocyl7dGhpcy5zZXQoInByb3BlcnRpZXMiLHMpfWdldCBhZGRpdGlvbmFsUHJvcGVydGllcygpe3JldHVybiB0aGlzLmdldCgiYWRkaXRpb25hbFByb3BlcnRpZXMiKX1zZXQgYWRkaXRpb25hbFByb3BlcnRpZXMocyl7dGhpcy5zZXQoImFkZGl0aW9uYWxQcm9wZXJ0aWVzIixzKX1nZXQgcGF0dGVyblByb3BlcnRpZXMoKXtyZXR1cm4gdGhpcy5nZXQoInBhdHRlcm5Qcm9wZXJ0aWVzIil9c2V0IHBhdHRlcm5Qcm9wZXJ0aWVzKHMpe3RoaXMuc2V0KCJwYXR0ZXJuUHJvcGVydGllcyIscyl9Z2V0IGRlcGVuZGVuY2llcygpe3JldHVybiB0aGlzLmdldCgiZGVwZW5kZW5jaWVzIil9c2V0IGRlcGVuZGVuY2llcyhzKXt0aGlzLnNldCgiZGVwZW5kZW5jaWVzIixzKX1nZXQgZW51bSgpe3JldHVybiB0aGlzLmdldCgiZW51bSIpfXNldCBlbnVtKHMpe3RoaXMuc2V0KCJlbnVtIixzKX1nZXQgdHlwZSgpe3JldHVybiB0aGlzLmdldCgidHlwZSIpfXNldCB0eXBlKHMpe3RoaXMuc2V0KCJ0eXBlIixzKX1nZXQgYWxsT2YoKXtyZXR1cm4gdGhpcy5nZXQoImFsbE9mIil9c2V0IGFsbE9mKHMpe3RoaXMuc2V0KCJhbGxPZiIscyl9Z2V0IGFueU9mKCl7cmV0dXJuIHRoaXMuZ2V0KCJhbnlPZiIpfXNldCBhbnlPZihzKXt0aGlzLnNldCgiYW55T2YiLHMpfWdldCBvbmVPZigpe3JldHVybiB0aGlzLmdldCgib25lT2YiKX1zZXQgb25lT2Yocyl7dGhpcy5zZXQoIm9uZU9mIixzKX1nZXQgbm90KCl7cmV0dXJuIHRoaXMuZ2V0KCJub3QiKX1zZXQgbm90KHMpe3RoaXMuc2V0KCJub3QiLHMpfWdldCBkZWZpbml0aW9ucygpe3JldHVybiB0aGlzLmdldCgiZGVmaW5pdGlvbnMiKX1zZXQgZGVmaW5pdGlvbnMocyl7dGhpcy5zZXQoImRlZmluaXRpb25zIixzKX1nZXQgdGl0bGUoKXtyZXR1cm4gdGhpcy5nZXQoInRpdGxlIil9c2V0IHRpdGxlKHMpe3RoaXMuc2V0KCJ0aXRsZSIscyl9Z2V0IGRlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KCJkZXNjcmlwdGlvbiIpfXNldCBkZXNjcmlwdGlvbihzKXt0aGlzLnNldCgiZGVzY3JpcHRpb24iLHMpfWdldCBkZWZhdWx0KCl7cmV0dXJuIHRoaXMuZ2V0KCJkZWZhdWx0Iil9c2V0IGRlZmF1bHQocyl7dGhpcy5zZXQoImRlZmF1bHQiLHMpfWdldCBmb3JtYXQoKXtyZXR1cm4gdGhpcy5nZXQoImZvcm1hdCIpfXNldCBmb3JtYXQocyl7dGhpcy5zZXQoImZvcm1hdCIscyl9Z2V0IGJhc2UoKXtyZXR1cm4gdGhpcy5nZXQoImJhc2UiKX1zZXQgYmFzZShzKXt0aGlzLnNldCgiYmFzZSIscyl9Z2V0IGxpbmtzKCl7cmV0dXJuIHRoaXMuZ2V0KCJsaW5rcyIpfXNldCBsaW5rcyhzKXt0aGlzLnNldCgibGlua3MiLHMpfWdldCBtZWRpYSgpe3JldHVybiB0aGlzLmdldCgibWVkaWEiKX1zZXQgbWVkaWEocyl7dGhpcy5zZXQoIm1lZGlhIixzKX1nZXQgcmVhZE9ubHkoKXtyZXR1cm4gdGhpcy5nZXQoInJlYWRPbmx5Iil9c2V0IHJlYWRPbmx5KHMpe3RoaXMuc2V0KCJyZWFkT25seSIscyl9fWNvbnN0IEdoPUpTT05TY2hlbWE7Y2xhc3MgSlNPTlJlZmVyZW5jZSBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJKU09OUmVmZXJlbmNlIix0aGlzLmNsYXNzZXMucHVzaCgianNvbi1yZWZlcmVuY2UiKX1nZXQgJHJlZigpe3JldHVybiB0aGlzLmdldCgiJHJlZiIpfXNldCAkcmVmKHMpe3RoaXMuc2V0KCIkcmVmIixzKX19Y29uc3QgUWg9SlNPTlJlZmVyZW5jZTtjbGFzcyBNZWRpYSBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJtZWRpYSJ9Z2V0IGJpbmFyeUVuY29kaW5nKCl7cmV0dXJuIHRoaXMuZ2V0KCJiaW5hcnlFbmNvZGluZyIpfXNldCBiaW5hcnlFbmNvZGluZyhzKXt0aGlzLnNldCgiYmluYXJ5RW5jb2RpbmciLHMpfWdldCB0eXBlKCl7cmV0dXJuIHRoaXMuZ2V0KCJ0eXBlIil9c2V0IHR5cGUocyl7dGhpcy5zZXQoInR5cGUiLHMpfX1jb25zdCB0ZD1NZWRpYTtjbGFzcyBMaW5rRGVzY3JpcHRpb24gZXh0ZW5kcyB2dS5TaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ibGlua0Rlc2NyaXB0aW9uIn1nZXQgaHJlZigpe3JldHVybiB0aGlzLmdldCgiaHJlZiIpfXNldCBocmVmKHMpe3RoaXMuc2V0KCJocmVmIixzKX1nZXQgcmVsKCl7cmV0dXJuIHRoaXMuZ2V0KCJyZWwiKX1zZXQgcmVsKHMpe3RoaXMuc2V0KCJyZWwiLHMpfWdldCB0aXRsZSgpe3JldHVybiB0aGlzLmdldCgidGl0bGUiKX1zZXQgdGl0bGUocyl7dGhpcy5zZXQoInRpdGxlIixzKX1nZXQgdGFyZ2V0U2NoZW1hKCl7cmV0dXJuIHRoaXMuZ2V0KCJ0YXJnZXRTY2hlbWEiKX1zZXQgdGFyZ2V0U2NoZW1hKHMpe3RoaXMuc2V0KCJ0YXJnZXRTY2hlbWEiLHMpfWdldCBtZWRpYVR5cGUoKXtyZXR1cm4gdGhpcy5nZXQoIm1lZGlhVHlwZSIpfXNldCBtZWRpYVR5cGUocyl7dGhpcy5zZXQoIm1lZGlhVHlwZSIscyl9Z2V0IG1ldGhvZCgpe3JldHVybiB0aGlzLmdldCgibWV0aG9kIil9c2V0IG1ldGhvZChzKXt0aGlzLnNldCgibWV0aG9kIixzKX1nZXQgZW5jVHlwZSgpe3JldHVybiB0aGlzLmdldCgiZW5jVHlwZSIpfXNldCBlbmNUeXBlKHMpe3RoaXMuc2V0KCJlbmNUeXBlIixzKX1nZXQgc2NoZW1hKCl7cmV0dXJuIHRoaXMuZ2V0KCJzY2hlbWEiKX1zZXQgc2NoZW1hKHMpe3RoaXMuc2V0KCJzY2hlbWEiLHMpfX1jb25zdCBzZD1MaW5rRGVzY3JpcHRpb24sZW1wdHlFbGVtZW50PXM9Pntjb25zdCBvPXMubWV0YS5sZW5ndGg+MD9jbG9uZURlZXAocy5tZXRhKTp2b2lkIDAsaT1zLmF0dHJpYnV0ZXMubGVuZ3RoPjA/Y2xvbmVEZWVwKHMuYXR0cmlidXRlcyk6dm9pZCAwO3JldHVybiBuZXcgcy5jb25zdHJ1Y3Rvcih2b2lkIDAsbyxpKX0sY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQ9KHMsbyk9Pm8uY2xvbmUmJm8uaXNNZXJnZWFibGVFbGVtZW50KHMpP2RlZXBtZXJnZShlbXB0eUVsZW1lbnQocykscyxvKTpzLGlkPXtjbG9uZTohMCxpc01lcmdlYWJsZUVsZW1lbnQ6cz0+UHUocyl8fEl1KHMpLGFycmF5RWxlbWVudE1lcmdlOihzLG8saSk9PnMuY29uY2F0KG8pWyJmYW50YXN5LWxhbmQvbWFwIl0oKHM9PmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHMsaSkpKSxvYmplY3RFbGVtZW50TWVyZ2U6KHMsbyxpKT0+e2NvbnN0IGE9UHUocyk/ZW1wdHlFbGVtZW50KHMpOmVtcHR5RWxlbWVudChvKTtyZXR1cm4gUHUocykmJnMuZm9yRWFjaCgoKHMsbyx1KT0+e2NvbnN0IF89Y2xvbmVTaGFsbG93KHUpO18udmFsdWU9Y2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQocyxpKSxhLmNvbnRlbnQucHVzaChfKX0pKSxvLmZvckVhY2goKChvLHUsXyk9Pntjb25zdCB3PXNlcmlhbGl6ZXJzX3ZhbHVlKHUpO2xldCB4O2lmKFB1KHMpJiZzLmhhc0tleSh3KSYmaS5pc01lcmdlYWJsZUVsZW1lbnQobykpe2NvbnN0IGE9cy5nZXQodyk7eD1jbG9uZVNoYWxsb3coXykseC52YWx1ZT0oKHMsbyk9PntpZigiZnVuY3Rpb24iIT10eXBlb2Ygby5jdXN0b21NZXJnZSlyZXR1cm4gZGVlcG1lcmdlO2NvbnN0IGk9by5jdXN0b21NZXJnZShzLG8pO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpP2k6ZGVlcG1lcmdlfSkodSxpKShhLG8saSl9ZWxzZSB4PWNsb25lU2hhbGxvdyhfKSx4LnZhbHVlPWNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKG8saSk7YS5yZW1vdmUodyksYS5jb250ZW50LnB1c2goeCl9KSksYX0sY3VzdG9tTWVyZ2U6dm9pZCAwLGN1c3RvbU1ldGFNZXJnZTp2b2lkIDAsY3VzdG9tQXR0cmlidXRlc01lcmdlOnZvaWQgMH0sZGVlcG1lcmdlPShzLG8saSk9Pnt2YXIgYSx1LF87Y29uc3Qgdz17Li4uaWQsLi4uaX07dy5pc01lcmdlYWJsZUVsZW1lbnQ9bnVsbCE9PShhPXcuaXNNZXJnZWFibGVFbGVtZW50KSYmdm9pZCAwIT09YT9hOmlkLmlzTWVyZ2VhYmxlRWxlbWVudCx3LmFycmF5RWxlbWVudE1lcmdlPW51bGwhPT0odT13LmFycmF5RWxlbWVudE1lcmdlKSYmdm9pZCAwIT09dT91OmlkLmFycmF5RWxlbWVudE1lcmdlLHcub2JqZWN0RWxlbWVudE1lcmdlPW51bGwhPT0oXz13Lm9iamVjdEVsZW1lbnRNZXJnZSkmJnZvaWQgMCE9PV8/XzppZC5vYmplY3RFbGVtZW50TWVyZ2U7Y29uc3QgeD1JdShvKTtpZighKHg9PT1JdShzKSkpcmV0dXJuIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKG8sdyk7Y29uc3QgQz14JiYiZnVuY3Rpb24iPT10eXBlb2Ygdy5hcnJheUVsZW1lbnRNZXJnZT93LmFycmF5RWxlbWVudE1lcmdlKHMsbyx3KTp3Lm9iamVjdEVsZW1lbnRNZXJnZShzLG8sdyk7cmV0dXJuIEMubWV0YT0ocz0+ImZ1bmN0aW9uIiE9dHlwZW9mIHMuY3VzdG9tTWV0YU1lcmdlP3M9PmNsb25lRGVlcChzKTpzLmN1c3RvbU1ldGFNZXJnZSkodykocy5tZXRhLG8ubWV0YSksQy5hdHRyaWJ1dGVzPShzPT4iZnVuY3Rpb24iIT10eXBlb2Ygcy5jdXN0b21BdHRyaWJ1dGVzTWVyZ2U/cz0+Y2xvbmVEZWVwKHMpOnMuY3VzdG9tQXR0cmlidXRlc01lcmdlKSh3KShzLmF0dHJpYnV0ZXMsby5hdHRyaWJ1dGVzKSxDfTtkZWVwbWVyZ2UuYWxsPShzLG8pPT57aWYoIUFycmF5LmlzQXJyYXkocykpdGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgb2YgZGVlcG1lcmdlIHNob3VsZCBiZSBhbiBhcnJheS4iKTtyZXR1cm4gMD09PXMubGVuZ3RoP25ldyB2dS5TaDpzLnJlZHVjZSgoKHMsaSk9PmRlZXBtZXJnZShzLGksbykpLGVtcHR5RWxlbWVudChzWzBdKSl9O2NvbnN0IGNkPWRlZXBtZXJnZTtjb25zdCBsZD1jbGFzcyBWaXNpdG9yX1Zpc2l0b3J7ZWxlbWVudDtjb25zdHJ1Y3RvcihzKXtPYmplY3QuYXNzaWduKHRoaXMscyl9Y29weU1ldGFBbmRBdHRyaWJ1dGVzKHMsbyl7KHMubWV0YS5sZW5ndGg+MHx8by5tZXRhLmxlbmd0aD4wKSYmKG8ubWV0YT1jZChvLm1ldGEscy5tZXRhKSksaGFzRWxlbWVudFNvdXJjZU1hcChzKSYmYXNzaWduU291cmNlTWFwKG8scyksKHMuYXR0cmlidXRlcy5sZW5ndGg+MHx8cy5tZXRhLmxlbmd0aD4wKSYmKG8uYXR0cmlidXRlcz1jZChvLmF0dHJpYnV0ZXMscy5hdHRyaWJ1dGVzKSl9fTtjb25zdCB1ZD1jbGFzcyBGYWxsYmFja1Zpc2l0b3IgZXh0ZW5kcyBsZHtlbnRlcihzKXtyZXR1cm4gdGhpcy5lbGVtZW50PWNsb25lRGVlcChzKSxGdX19LGNvcHlQcm9wcz0ocyxvLGk9W10pPT57Y29uc3QgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvKTtmb3IobGV0IHMgb2YgaSlkZWxldGUgYVtzXTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzLGEpfSxwcm90b0NoYWluPShzLG89W3NdKT0+e2NvbnN0IGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKHMpO3JldHVybiBudWxsPT09aT9vOnByb3RvQ2hhaW4oaSxbLi4ubyxpXSl9LGhhcmRNaXhQcm90b3M9KHMsbyxpPVtdKT0+e3ZhciBhO2NvbnN0IHU9bnVsbCE9PShhPSgoLi4ucyk9PntpZigwPT09cy5sZW5ndGgpcmV0dXJuO2xldCBvO2NvbnN0IGk9cy5tYXAoKHM9PnByb3RvQ2hhaW4ocykpKTtmb3IoO2kuZXZlcnkoKHM9PnMubGVuZ3RoPjApKTspe2NvbnN0IHM9aS5tYXAoKHM9PnMucG9wKCkpKSxhPXNbMF07aWYoIXMuZXZlcnkoKHM9PnM9PT1hKSkpYnJlYWs7bz1hfXJldHVybiBvfSkoLi4ucykpJiZ2b2lkIDAhPT1hP2E6T2JqZWN0LnByb3RvdHlwZSxfPU9iamVjdC5jcmVhdGUodSksdz1wcm90b0NoYWluKHUpO2ZvcihsZXQgbyBvZiBzKXtsZXQgcz1wcm90b0NoYWluKG8pO2ZvcihsZXQgbz1zLmxlbmd0aC0xO28+PTA7by0tKXtsZXQgYT1zW29dOy0xPT09dy5pbmRleE9mKGEpJiYoY29weVByb3BzKF8sYSxbImNvbnN0cnVjdG9yIiwuLi5pXSksdy5wdXNoKGEpKX19cmV0dXJuIF8uY29uc3RydWN0b3I9byxffSx1bmlxdWU9cz0+cy5maWx0ZXIoKChvLGkpPT5zLmluZGV4T2Yobyk9PWkpKSxnZXRJbmdyZWRpZW50V2l0aFByb3A9KHMsbyk9Pntjb25zdCBpPW8ubWFwKChzPT5wcm90b0NoYWluKHMpKSk7bGV0IGE9MCx1PSEwO2Zvcig7dTspe3U9ITE7Zm9yKGxldCBfPW8ubGVuZ3RoLTE7Xz49MDtfLS0pe2NvbnN0IG89aVtfXVthXTtpZihudWxsIT1vJiYodT0hMCxudWxsIT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8scykpKXJldHVybiBpW19dWzBdfWErK319LHByb3h5TWl4PShzLG89T2JqZWN0LnByb3RvdHlwZSk9Pm5ldyBQcm94eSh7fSx7Z2V0UHJvdG90eXBlT2Y6KCk9Pm8sc2V0UHJvdG90eXBlT2YoKXt0aHJvdyBFcnJvcigiQ2Fubm90IHNldCBwcm90b3R5cGUgb2YgUHJveGllcyBjcmVhdGVkIGJ5IHRzLW1peGVyIil9LGdldE93blByb3BlcnR5RGVzY3JpcHRvcjoobyxpKT0+T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihnZXRJbmdyZWRpZW50V2l0aFByb3AoaSxzKXx8e30saSksZGVmaW5lUHJvcGVydHkoKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBkZWZpbmUgbmV3IHByb3BlcnRpZXMgb24gUHJveGllcyBjcmVhdGVkIGJ5IHRzLW1peGVyIil9LGhhczooaSxhKT0+dm9pZCAwIT09Z2V0SW5ncmVkaWVudFdpdGhQcm9wKGEscyl8fHZvaWQgMCE9PW9bYV0sZ2V0OihpLGEpPT4oZ2V0SW5ncmVkaWVudFdpdGhQcm9wKGEscyl8fG8pW2FdLHNldChvLGksYSl7Y29uc3QgdT1nZXRJbmdyZWRpZW50V2l0aFByb3AoaSxzKTtpZih2b2lkIDA9PT11KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNldCBuZXcgcHJvcGVydGllcyBvbiBQcm94aWVzIGNyZWF0ZWQgYnkgdHMtbWl4ZXIiKTtyZXR1cm4gdVtpXT1hLCEwfSxkZWxldGVQcm9wZXJ0eSgpe3Rocm93IG5ldyBFcnJvcigiQ2Fubm90IGRlbGV0ZSBwcm9wZXJ0aWVzIG9uIFByb3hpZXMgY3JlYXRlZCBieSB0cy1taXhlciIpfSxvd25LZXlzOigpPT5zLm1hcChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcykucmVkdWNlKCgocyxvKT0+by5jb25jYXQocy5maWx0ZXIoKHM9Pm8uaW5kZXhPZihzKTwwKSkpKSl9KSxkZD1udWxsLG1kPSJjb3B5Iix5ZD0iY29weSIsdmQ9ImRlZXAiLFNkPW5ldyBXZWFrTWFwLGdldE1peGluc0ZvckNsYXNzPXM9PlNkLmdldChzKSxtZXJnZU9iamVjdHNPZkRlY29yYXRvcnM9KHMsbyk9Pnt2YXIgaSxhO2NvbnN0IHU9dW5pcXVlKFsuLi5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzKSwuLi5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKV0pLF89e307Zm9yKGxldCB3IG9mIHUpX1t3XT11bmlxdWUoWy4uLm51bGwhPT0oaT1udWxsPT1zP3ZvaWQgMDpzW3ddKSYmdm9pZCAwIT09aT9pOltdLC4uLm51bGwhPT0oYT1udWxsPT1vP3ZvaWQgMDpvW3ddKSYmdm9pZCAwIT09YT9hOltdXSk7cmV0dXJuIF99LG1lcmdlUHJvcGVydHlBbmRNZXRob2REZWNvcmF0b3JzPShzLG8pPT57dmFyIGksYSx1LF87cmV0dXJue3Byb3BlcnR5Om1lcmdlT2JqZWN0c09mRGVjb3JhdG9ycyhudWxsIT09KGk9bnVsbD09cz92b2lkIDA6cy5wcm9wZXJ0eSkmJnZvaWQgMCE9PWk/aTp7fSxudWxsIT09KGE9bnVsbD09bz92b2lkIDA6by5wcm9wZXJ0eSkmJnZvaWQgMCE9PWE/YTp7fSksbWV0aG9kOm1lcmdlT2JqZWN0c09mRGVjb3JhdG9ycyhudWxsIT09KHU9bnVsbD09cz92b2lkIDA6cy5tZXRob2QpJiZ2b2lkIDAhPT11P3U6e30sbnVsbCE9PShfPW51bGw9PW8/dm9pZCAwOm8ubWV0aG9kKSYmdm9pZCAwIT09Xz9fOnt9KX19LG1lcmdlRGVjb3JhdG9ycz0ocyxvKT0+e3ZhciBpLGEsdSxfLHcseDtyZXR1cm57Y2xhc3M6dW5pcXVlKFsuLi5udWxsIT09KGk9bnVsbD09cz92b2lkIDA6cy5jbGFzcykmJnZvaWQgMCE9PWk/aTpbXSwuLi5udWxsIT09KGE9bnVsbD09bz92b2lkIDA6by5jbGFzcykmJnZvaWQgMCE9PWE/YTpbXV0pLHN0YXRpYzptZXJnZVByb3BlcnR5QW5kTWV0aG9kRGVjb3JhdG9ycyhudWxsIT09KHU9bnVsbD09cz92b2lkIDA6cy5zdGF0aWMpJiZ2b2lkIDAhPT11P3U6e30sbnVsbCE9PShfPW51bGw9PW8/dm9pZCAwOm8uc3RhdGljKSYmdm9pZCAwIT09Xz9fOnt9KSxpbnN0YW5jZTptZXJnZVByb3BlcnR5QW5kTWV0aG9kRGVjb3JhdG9ycyhudWxsIT09KHc9bnVsbD09cz92b2lkIDA6cy5pbnN0YW5jZSkmJnZvaWQgMCE9PXc/dzp7fSxudWxsIT09KHg9bnVsbD09bz92b2lkIDA6by5pbnN0YW5jZSkmJnZvaWQgMCE9PXg/eDp7fSl9fSxfZD1uZXcgTWFwLGRlZXBEZWNvcmF0b3JTZWFyY2g9KC4uLnMpPT57Y29uc3Qgbz0oKC4uLnMpPT57dmFyIG87Y29uc3QgaT1uZXcgU2V0LGE9bmV3IFNldChbLi4uc10pO2Zvcig7YS5zaXplPjA7KWZvcihsZXQgcyBvZiBhKXtjb25zdCB1PXByb3RvQ2hhaW4ocy5wcm90b3R5cGUpLm1hcCgocz0+cy5jb25zdHJ1Y3RvcikpLF89Wy4uLnUsLi4ubnVsbCE9PShvPWdldE1peGluc0ZvckNsYXNzKHMpKSYmdm9pZCAwIT09bz9vOltdXS5maWx0ZXIoKHM9PiFpLmhhcyhzKSkpO2ZvcihsZXQgcyBvZiBfKWEuYWRkKHMpO2kuYWRkKHMpLGEuZGVsZXRlKHMpfXJldHVyblsuLi5pXX0pKC4uLnMpLm1hcCgocz0+X2QuZ2V0KHMpKSkuZmlsdGVyKChzPT4hIXMpKTtyZXR1cm4gMD09by5sZW5ndGg/e306MT09by5sZW5ndGg/b1swXTpvLnJlZHVjZSgoKHMsbyk9Pm1lcmdlRGVjb3JhdG9ycyhzLG8pKSl9LGdldERlY29yYXRvcnNGb3JDbGFzcz1zPT57bGV0IG89X2QuZ2V0KHMpO3JldHVybiBvfHwobz17fSxfZC5zZXQocyxvKSksb307ZnVuY3Rpb24gTWl4aW4oLi4ucyl7dmFyIG8saSxhO2NvbnN0IHU9cy5tYXAoKHM9PnMucHJvdG90eXBlKSksXz1kZDtpZihudWxsIT09Xyl7Y29uc3Qgcz11Lm1hcCgocz0+c1tfXSkpLmZpbHRlcigocz0+ImZ1bmN0aW9uIj09dHlwZW9mIHMpKSxjb21iaW5lZEluaXRGdW5jdGlvbj1mdW5jdGlvbiguLi5vKXtmb3IobGV0IGkgb2YgcylpLmFwcGx5KHRoaXMsbyl9LG89e1tfXTpjb21iaW5lZEluaXRGdW5jdGlvbn07dS5wdXNoKG8pfWZ1bmN0aW9uIE1peGVkQ2xhc3MoLi4ubyl7Zm9yKGNvbnN0IGkgb2Ygcyljb3B5UHJvcHModGhpcyxuZXcgaSguLi5vKSk7bnVsbCE9PV8mJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzW19dJiZ0aGlzW19dLmFwcGx5KHRoaXMsbyl9dmFyIHcseDtNaXhlZENsYXNzLnByb3RvdHlwZT0iY29weSI9PT15ZD9oYXJkTWl4UHJvdG9zKHUsTWl4ZWRDbGFzcyk6KHc9dSx4PU1peGVkQ2xhc3MscHJveHlNaXgoWy4uLncse2NvbnN0cnVjdG9yOnh9XSkpLE9iamVjdC5zZXRQcm90b3R5cGVPZihNaXhlZENsYXNzLCJjb3B5Ij09PW1kP2hhcmRNaXhQcm90b3MocyxudWxsLFsicHJvdG90eXBlIl0pOnByb3h5TWl4KHMsRnVuY3Rpb24ucHJvdG90eXBlKSk7bGV0IEM9TWl4ZWRDbGFzcztpZigibm9uZSIhPT12ZCl7Y29uc3QgdT0iZGVlcCI9PT12ZD9kZWVwRGVjb3JhdG9yU2VhcmNoKC4uLnMpOigoLi4ucyk9Pntjb25zdCBvPXMubWFwKChzPT5nZXREZWNvcmF0b3JzRm9yQ2xhc3MocykpKTtyZXR1cm4gMD09PW8ubGVuZ3RoP3t9OjE9PT1vLmxlbmd0aD9vWzBdOm8ucmVkdWNlKCgocyxvKT0+bWVyZ2VEZWNvcmF0b3JzKHMsbykpKX0pKC4uLnMpO2ZvcihsZXQgcyBvZiBudWxsIT09KG89bnVsbD09dT92b2lkIDA6dS5jbGFzcykmJnZvaWQgMCE9PW8/bzpbXSl7Y29uc3Qgbz1zKEMpO28mJihDPW8pfWFwcGx5UHJvcEFuZE1ldGhvZERlY29yYXRvcnMobnVsbCE9PShpPW51bGw9PXU/dm9pZCAwOnUuc3RhdGljKSYmdm9pZCAwIT09aT9pOnt9LEMpLGFwcGx5UHJvcEFuZE1ldGhvZERlY29yYXRvcnMobnVsbCE9PShhPW51bGw9PXU/dm9pZCAwOnUuaW5zdGFuY2UpJiZ2b2lkIDAhPT1hP2E6e30sQy5wcm90b3R5cGUpfXZhciBqLEw7cmV0dXJuIGo9QyxMPXMsU2Quc2V0KGosTCksQ31jb25zdCBhcHBseVByb3BBbmRNZXRob2REZWNvcmF0b3JzPShzLG8pPT57Y29uc3QgaT1zLnByb3BlcnR5LGE9cy5tZXRob2Q7aWYoaSlmb3IobGV0IHMgaW4gaSlmb3IobGV0IGEgb2YgaVtzXSlhKG8scyk7aWYoYSlmb3IobGV0IHMgaW4gYSlmb3IobGV0IGkgb2YgYVtzXSlpKG8scyxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8scykpfTtjb25zdCBFZD1fY3VycnkxKChmdW5jdGlvbiBhbGxQYXNzKHMpe3JldHVybiBsYShQaShmYywwLGJjKCJsZW5ndGgiLHMpKSwoZnVuY3Rpb24oKXtmb3IodmFyIG89MCxpPXMubGVuZ3RoO288aTspe2lmKCFzW29dLmFwcGx5KHRoaXMsYXJndW1lbnRzKSlyZXR1cm4hMTtvKz0xfXJldHVybiEwfSkpfSkpO2NvbnN0IHdkPV9jdXJyeTEoKGZ1bmN0aW9uIGlzTm90RW1wdHkocyl7cmV0dXJuIWRwKHMpfSkpO2NvbnN0IHhkPV9jdXJyeTIoKGZ1bmN0aW9uIG9yKHMsbyl7cmV0dXJuIHN8fG99KSk7dmFyIGtkPWNjKGxhKDEscnUoc3UsX2N1cnJ5MigoZnVuY3Rpb24gZWl0aGVyKHMsbyl7cmV0dXJuIF9pc0Z1bmN0aW9uKHMpP2Z1bmN0aW9uIF9laXRoZXIoKXtyZXR1cm4gcy5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfTphYyh4ZCkocyxvKX0pKShvdSxqYykpKSk7Y29uc3QgT2Q9RWQoW1JjLGtkLHdkXSk7Y29uc3QgQWQ9X2N1cnJ5MigoZnVuY3Rpb24gcGljayhzLG8pe2Zvcih2YXIgaT17fSxhPTA7YTxzLmxlbmd0aDspc1thXWluIG8mJihpW3NbYV1dPW9bc1thXV0pLGErPTE7cmV0dXJuIGl9KSk7Y29uc3QgQ2Q9Y2xhc3MgU3BlY2lmaWNhdGlvblZpc2l0b3IgZXh0ZW5kcyBsZHtzcGVjT2JqO3Bhc3NpbmdPcHRpb25zTmFtZXM9WyJzcGVjT2JqIiwicGFyZW50Il07Y29uc3RydWN0b3Ioe3NwZWNPYmo6cywuLi5vfSl7c3VwZXIoey4uLm99KSx0aGlzLnNwZWNPYmo9c31yZXRyaWV2ZVBhc3NpbmdPcHRpb25zKCl7cmV0dXJuIEFkKHRoaXMucGFzc2luZ09wdGlvbnNOYW1lcyx0aGlzKX1yZXRyaWV2ZUZpeGVkRmllbGRzKHMpe2NvbnN0IG89R3UoWyJ2aXNpdG9ycyIsLi4ucywiZml4ZWRGaWVsZHMiXSx0aGlzLnNwZWNPYmopO3JldHVybiJvYmplY3QiPT10eXBlb2YgbyYmbnVsbCE9PW8/T2JqZWN0LmtleXMobyk6W119cmV0cmlldmVWaXNpdG9yKHMpe3JldHVybiBldShqYyxbInZpc2l0b3JzIiwuLi5zXSx0aGlzLnNwZWNPYmopP0d1KFsidmlzaXRvcnMiLC4uLnNdLHRoaXMuc3BlY09iaik6R3UoWyJ2aXNpdG9ycyIsLi4ucywiJHZpc2l0b3IiXSx0aGlzLnNwZWNPYmopfXJldHJpZXZlVmlzaXRvckluc3RhbmNlKHMsbz17fSl7Y29uc3QgaT10aGlzLnJldHJpZXZlUGFzc2luZ09wdGlvbnMoKTtyZXR1cm4gbmV3KHRoaXMucmV0cmlldmVWaXNpdG9yKHMpKSh7Li4uaSwuLi5vfSl9dG9SZWZyYWN0ZWRFbGVtZW50KHMsbyxpPXt9KXtjb25zdCBhPXRoaXMucmV0cmlldmVWaXNpdG9ySW5zdGFuY2UocyxpKTtyZXR1cm4gYSBpbnN0YW5jZW9mIHVkJiYobnVsbD09YT92b2lkIDA6YS5jb25zdHJ1Y3Rvcik9PT11ZD9jbG9uZURlZXAobyk6KHZpc2l0b3JfdmlzaXQobyxhLGkpLGEuZWxlbWVudCl9fTtjb25zdCBJZD1jbGFzcyBGaXhlZEZpZWxkc1Zpc2l0b3IgZXh0ZW5kcyBDZHtzcGVjUGF0aDtpZ25vcmVkRmllbGRzO2NvbnN0cnVjdG9yKHtzcGVjUGF0aDpzLGlnbm9yZWRGaWVsZHM6bywuLi5pfSl7c3VwZXIoey4uLml9KSx0aGlzLnNwZWNQYXRoPXMsdGhpcy5pZ25vcmVkRmllbGRzPW98fFtdfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz10aGlzLnNwZWNQYXRoKHMpLGk9dGhpcy5yZXRyaWV2ZUZpeGVkRmllbGRzKG8pO3JldHVybiBzLmZvckVhY2goKChzLGEsdSk9PntpZihPdShhKSYmaS5pbmNsdWRlcyhzZXJpYWxpemVyc192YWx1ZShhKSkmJiF0aGlzLmlnbm9yZWRGaWVsZHMuaW5jbHVkZXMoc2VyaWFsaXplcnNfdmFsdWUoYSkpKXtjb25zdCBpPXRoaXMudG9SZWZyYWN0ZWRFbGVtZW50KFsuLi5vLCJmaXhlZEZpZWxkcyIsc2VyaWFsaXplcnNfdmFsdWUoYSldLHMpLF89bmV3IHZ1LlByKGNsb25lRGVlcChhKSxpKTt0aGlzLmNvcHlNZXRhQW5kQXR0cmlidXRlcyh1LF8pLF8uY2xhc3Nlcy5wdXNoKCJmaXhlZC1maWVsZCIpLHRoaXMuZWxlbWVudC5jb250ZW50LnB1c2goXyl9ZWxzZSB0aGlzLmlnbm9yZWRGaWVsZHMuaW5jbHVkZXMoc2VyaWFsaXplcnNfdmFsdWUoYSkpfHx0aGlzLmVsZW1lbnQuY29udGVudC5wdXNoKGNsb25lRGVlcCh1KSl9KSksdGhpcy5jb3B5TWV0YUFuZEF0dHJpYnV0ZXMocyx0aGlzLmVsZW1lbnQpLEZ1fX07Y29uc3QgVGQ9Y2xhc3MgUGFyZW50U2NoZW1hQXdhcmVWaXNpdG9ye3BhcmVudDtjb25zdHJ1Y3Rvcih7cGFyZW50OnN9KXt0aGlzLnBhcmVudD1zfX0sTmQ9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBHaHx8cyhhKSYmbygiSlNPTlNjaGVtYURyYWZ0NCIsYSkmJmkoIm9iamVjdCIsYSkpKSxNZD1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIFFofHxzKGEpJiZvKCJKU09OUmVmZXJlbmNlIixhKSYmaSgib2JqZWN0IixhKSkpLFJkPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgdGR8fHMoYSkmJm8oIm1lZGlhIixhKSYmaSgib2JqZWN0IixhKSkpLERkPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2Ygc2R8fHMoYSkmJm8oImxpbmtEZXNjcmlwdGlvbiIsYSkmJmkoIm9iamVjdCIsYSkpKTtjbGFzcyBKU09OU2NoZW1hVmlzaXRvciBleHRlbmRzKE1peGluKElkLFRkLHVkKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBHaCx0aGlzLnNwZWNQYXRoPWxjKFsiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSJdKX1nZXQgZGVmYXVsdERpYWxlY3RJZGVudGlmaWVyKCl7cmV0dXJuImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyJ9T2JqZWN0RWxlbWVudChzKXtyZXR1cm4gdGhpcy5oYW5kbGVEaWFsZWN0SWRlbnRpZmllcihzKSx0aGlzLmhhbmRsZVNjaGVtYUlkZW50aWZpZXIocyksdGhpcy5wYXJlbnQ9dGhpcy5lbGVtZW50LElkLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKX1oYW5kbGVEaWFsZWN0SWRlbnRpZmllcihzKXtpZihoYyh0aGlzLnBhcmVudCkmJiFPdShzLmdldCgiJHNjaGVtYSIpKSl0aGlzLmVsZW1lbnQuc2V0TWV0YVByb3BlcnR5KCJpbmhlcml0ZWREaWFsZWN0SWRlbnRpZmllciIsdGhpcy5kZWZhdWx0RGlhbGVjdElkZW50aWZpZXIpO2Vsc2UgaWYoTmQodGhpcy5wYXJlbnQpJiYhT3Uocy5nZXQoIiRzY2hlbWEiKSkpe2NvbnN0IHM9ZWEoc2VyaWFsaXplcnNfdmFsdWUodGhpcy5wYXJlbnQubWV0YS5nZXQoImluaGVyaXRlZERpYWxlY3RJZGVudGlmaWVyIikpLHNlcmlhbGl6ZXJzX3ZhbHVlKHRoaXMucGFyZW50LiRzY2hlbWEpKTt0aGlzLmVsZW1lbnQuc2V0TWV0YVByb3BlcnR5KCJpbmhlcml0ZWREaWFsZWN0SWRlbnRpZmllciIscyl9fWhhbmRsZVNjaGVtYUlkZW50aWZpZXIocyxvPSJpZCIpe2NvbnN0IGk9dm9pZCAwIT09dGhpcy5wYXJlbnQ/Y2xvbmVEZWVwKHRoaXMucGFyZW50LmdldE1ldGFQcm9wZXJ0eSgiYW5jZXN0b3JzU2NoZW1hSWRlbnRpZmllcnMiLFtdKSk6bmV3IHZ1LndFLGE9c2VyaWFsaXplcnNfdmFsdWUocy5nZXQobykpO09kKGEpJiZpLnB1c2goYSksdGhpcy5lbGVtZW50LnNldE1ldGFQcm9wZXJ0eSgiYW5jZXN0b3JzU2NoZW1hSWRlbnRpZmllcnMiLGkpfX1jb25zdCBMZD1KU09OU2NoZW1hVmlzaXRvcixpc0pTT05SZWZlcmVuY2VMaWtlRWxlbWVudD1zPT5QdShzKSYmcy5oYXNLZXkoIiRyZWYiKTtjbGFzcyBJdGVtc1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihDZCxUZCx1ZCkpe09iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz1pc0pTT05SZWZlcmVuY2VMaWtlRWxlbWVudChzKT9bImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05SZWZlcmVuY2UiXTpbImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiXTtyZXR1cm4gdGhpcy5lbGVtZW50PXRoaXMudG9SZWZyYWN0ZWRFbGVtZW50KG8scyksRnV9QXJyYXlFbGVtZW50KHMpe3JldHVybiB0aGlzLmVsZW1lbnQ9bmV3IHZ1LndFLHRoaXMuZWxlbWVudC5jbGFzc2VzLnB1c2goImpzb24tc2NoZW1hLWl0ZW1zIikscy5mb3JFYWNoKChzPT57Y29uc3Qgbz1pc0pTT05SZWZlcmVuY2VMaWtlRWxlbWVudChzKT9bImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05SZWZlcmVuY2UiXTpbImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiXSxpPXRoaXMudG9SZWZyYWN0ZWRFbGVtZW50KG8scyk7dGhpcy5lbGVtZW50LnB1c2goaSl9KSksdGhpcy5jb3B5TWV0YUFuZEF0dHJpYnV0ZXMocyx0aGlzLmVsZW1lbnQpLEZ1fX1jb25zdCBGZD1JdGVtc1Zpc2l0b3I7Y29uc3QgQmQ9Y2xhc3MgUmVxdWlyZWRWaXNpdG9yIGV4dGVuZHMgdWR7QXJyYXlFbGVtZW50KHMpe2NvbnN0IG89dGhpcy5lbnRlcihzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgianNvbi1zY2hlbWEtcmVxdWlyZWQiKSxvfX07Y29uc3QgJGQ9Y2xhc3MgUGF0dGVybmVkRmllbGRzVmlzaXRvciBleHRlbmRzIENke3NwZWNQYXRoO2lnbm9yZWRGaWVsZHM7ZmllbGRQYXR0ZXJuUHJlZGljYXRlPWVzX0Y7Y29uc3RydWN0b3Ioe3NwZWNQYXRoOnMsaWdub3JlZEZpZWxkczpvLGZpZWxkUGF0dGVyblByZWRpY2F0ZTppLC4uLmF9KXtzdXBlcih7Li4uYX0pLHRoaXMuc3BlY1BhdGg9cyx0aGlzLmlnbm9yZWRGaWVsZHM9b3x8W10sImZ1bmN0aW9uIj09dHlwZW9mIGkmJih0aGlzLmZpZWxkUGF0dGVyblByZWRpY2F0ZT1pKX1PYmplY3RFbGVtZW50KHMpe3JldHVybiBzLmZvckVhY2goKChzLG8saSk9PntpZighdGhpcy5pZ25vcmVkRmllbGRzLmluY2x1ZGVzKHNlcmlhbGl6ZXJzX3ZhbHVlKG8pKSYmdGhpcy5maWVsZFBhdHRlcm5QcmVkaWNhdGUoc2VyaWFsaXplcnNfdmFsdWUobykpKXtjb25zdCBhPXRoaXMuc3BlY1BhdGgocyksdT10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChhLHMpLF89bmV3IHZ1LlByKGNsb25lRGVlcChvKSx1KTt0aGlzLmNvcHlNZXRhQW5kQXR0cmlidXRlcyhpLF8pLF8uY2xhc3Nlcy5wdXNoKCJwYXR0ZXJuZWQtZmllbGQiKSx0aGlzLmVsZW1lbnQuY29udGVudC5wdXNoKF8pfWVsc2UgdGhpcy5pZ25vcmVkRmllbGRzLmluY2x1ZGVzKHNlcmlhbGl6ZXJzX3ZhbHVlKG8pKXx8dGhpcy5lbGVtZW50LmNvbnRlbnQucHVzaChjbG9uZURlZXAoaSkpfSkpLHRoaXMuY29weU1ldGFBbmRBdHRyaWJ1dGVzKHMsdGhpcy5lbGVtZW50KSxGdX19O2NvbnN0IFVkPWNsYXNzIE1hcFZpc2l0b3IgZXh0ZW5kcyAkZHtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmZpZWxkUGF0dGVyblByZWRpY2F0ZT1PZH19O2NsYXNzIFByb3BlcnRpZXNWaXNpdG9yIGV4dGVuZHMoTWl4aW4oVWQsVGQsdWQpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHZ1LlNoLHRoaXMuZWxlbWVudC5jbGFzc2VzLnB1c2goImpzb24tc2NoZW1hLXByb3BlcnRpZXMiKSx0aGlzLnNwZWNQYXRoPXM9PmlzSlNPTlJlZmVyZW5jZUxpa2VFbGVtZW50KHMpP1siZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSJdfX1jb25zdCBWZD1Qcm9wZXJ0aWVzVmlzaXRvcjtjbGFzcyBQYXR0ZXJuUHJvcGVydGllc1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihVZCxUZCx1ZCkpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgdnUuU2gsdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgianNvbi1zY2hlbWEtcGF0dGVyblByb3BlcnRpZXMiKSx0aGlzLnNwZWNQYXRoPXM9PmlzSlNPTlJlZmVyZW5jZUxpa2VFbGVtZW50KHMpP1siZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSJdfX1jb25zdCBXZD1QYXR0ZXJuUHJvcGVydGllc1Zpc2l0b3I7Y2xhc3MgRGVwZW5kZW5jaWVzVmlzaXRvciBleHRlbmRzKE1peGluKFVkLFRkLHVkKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB2dS5TaCx0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS1kZXBlbmRlbmNpZXMiKSx0aGlzLnNwZWNQYXRoPXM9PmlzSlNPTlJlZmVyZW5jZUxpa2VFbGVtZW50KHMpP1siZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSJdfX1jb25zdCBKZD1EZXBlbmRlbmNpZXNWaXNpdG9yO2NvbnN0IEhkPWNsYXNzIEVudW1WaXNpdG9yIGV4dGVuZHMgdWR7QXJyYXlFbGVtZW50KHMpe2NvbnN0IG89dGhpcy5lbnRlcihzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgianNvbi1zY2hlbWEtZW51bSIpLG99fTtjb25zdCBLZD1jbGFzcyBUeXBlVmlzaXRvciBleHRlbmRzIHVke1N0cmluZ0VsZW1lbnQocyl7Y29uc3Qgbz10aGlzLmVudGVyKHMpO3JldHVybiB0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS10eXBlIiksb31BcnJheUVsZW1lbnQocyl7Y29uc3Qgbz10aGlzLmVudGVyKHMpO3JldHVybiB0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS10eXBlIiksb319O2NsYXNzIEFsbE9mVmlzaXRvciBleHRlbmRzKE1peGluKENkLFRkLHVkKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB2dS53RSx0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS1hbGxPZiIpfUFycmF5RWxlbWVudChzKXtyZXR1cm4gcy5mb3JFYWNoKChzPT57Y29uc3Qgbz1pc0pTT05SZWZlcmVuY2VMaWtlRWxlbWVudChzKT9bImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05SZWZlcmVuY2UiXTpbImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiXSxpPXRoaXMudG9SZWZyYWN0ZWRFbGVtZW50KG8scyk7dGhpcy5lbGVtZW50LnB1c2goaSl9KSksdGhpcy5jb3B5TWV0YUFuZEF0dHJpYnV0ZXMocyx0aGlzLmVsZW1lbnQpLEZ1fX1jb25zdCBHZD1BbGxPZlZpc2l0b3I7Y2xhc3MgQW55T2ZWaXNpdG9yIGV4dGVuZHMoTWl4aW4oQ2QsVGQsdWQpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHZ1LndFLHRoaXMuZWxlbWVudC5jbGFzc2VzLnB1c2goImpzb24tc2NoZW1hLWFueU9mIil9QXJyYXlFbGVtZW50KHMpe3JldHVybiBzLmZvckVhY2goKHM9Pntjb25zdCBvPWlzSlNPTlJlZmVyZW5jZUxpa2VFbGVtZW50KHMpP1siZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSJdLGk9dGhpcy50b1JlZnJhY3RlZEVsZW1lbnQobyxzKTt0aGlzLmVsZW1lbnQucHVzaChpKX0pKSx0aGlzLmNvcHlNZXRhQW5kQXR0cmlidXRlcyhzLHRoaXMuZWxlbWVudCksRnV9fWNvbnN0IFlkPUFueU9mVmlzaXRvcjtjbGFzcyBPbmVPZlZpc2l0b3IgZXh0ZW5kcyhNaXhpbihDZCxUZCx1ZCkpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgdnUud0UsdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgianNvbi1zY2hlbWEtb25lT2YiKX1BcnJheUVsZW1lbnQocyl7cmV0dXJuIHMuZm9yRWFjaCgocz0+e2NvbnN0IG89aXNKU09OUmVmZXJlbmNlTGlrZUVsZW1lbnQocyk/WyJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OUmVmZXJlbmNlIl06WyJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIl0saT10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChvLHMpO3RoaXMuZWxlbWVudC5wdXNoKGkpfSkpLHRoaXMuY29weU1ldGFBbmRBdHRyaWJ1dGVzKHMsdGhpcy5lbGVtZW50KSxGdX19Y29uc3QgWGQ9T25lT2ZWaXNpdG9yO2NsYXNzIERlZmluaXRpb25zVmlzaXRvciBleHRlbmRzKE1peGluKFVkLFRkLHVkKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB2dS5TaCx0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS1kZWZpbml0aW9ucyIpLHRoaXMuc3BlY1BhdGg9cz0+aXNKU09OUmVmZXJlbmNlTGlrZUVsZW1lbnQocyk/WyJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OUmVmZXJlbmNlIl06WyJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIl19fWNvbnN0IFFkPURlZmluaXRpb25zVmlzaXRvcjtjbGFzcyBMaW5rc1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihDZCxUZCx1ZCkpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgdnUud0UsdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgianNvbi1zY2hlbWEtbGlua3MiKX1BcnJheUVsZW1lbnQocyl7cmV0dXJuIHMuZm9yRWFjaCgocz0+e2NvbnN0IG89dGhpcy50b1JlZnJhY3RlZEVsZW1lbnQoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJMaW5rRGVzY3JpcHRpb24iXSxzKTt0aGlzLmVsZW1lbnQucHVzaChvKX0pKSx0aGlzLmNvcHlNZXRhQW5kQXR0cmlidXRlcyhzLHRoaXMuZWxlbWVudCksRnV9fWNvbnN0IFpkPUxpbmtzVmlzaXRvcjtjbGFzcyBKU09OUmVmZXJlbmNlVmlzaXRvciBleHRlbmRzKE1peGluKElkLHVkKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBRaCx0aGlzLnNwZWNQYXRoPWxjKFsiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlJlZmVyZW5jZSJdKX1PYmplY3RFbGVtZW50KHMpe2NvbnN0IG89SWQucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiBPdSh0aGlzLmVsZW1lbnQuJHJlZikmJnRoaXMuZWxlbWVudC5jbGFzc2VzLnB1c2goInJlZmVyZW5jZS1lbGVtZW50Iiksb319Y29uc3QgZWY9SlNPTlJlZmVyZW5jZVZpc2l0b3I7Y29uc3QgcmY9Y2xhc3MgJFJlZlZpc2l0b3IgZXh0ZW5kcyB1ZHtTdHJpbmdFbGVtZW50KHMpe2NvbnN0IG89dGhpcy5lbnRlcihzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgicmVmZXJlbmNlLXZhbHVlIiksb319O2NvbnN0IG9mPV9jdXJyeTMoKGZ1bmN0aW9uIGlmRWxzZShzLG8saSl7cmV0dXJuIGxhKE1hdGgubWF4KHMubGVuZ3RoLG8ubGVuZ3RoLGkubGVuZ3RoKSwoZnVuY3Rpb24gX2lmRWxzZSgpe3JldHVybiBzLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9vLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pKX0pKTtjb25zdCBhZj1fY3VycnkxKChmdW5jdGlvbiBjb21wYXJhdG9yKHMpe3JldHVybiBmdW5jdGlvbihvLGkpe3JldHVybiBzKG8saSk/LTE6cyhpLG8pPzE6MH19KSk7dmFyIGNmPV9jdXJyeTIoKGZ1bmN0aW9uIHNvcnQocyxvKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobywwKS5zb3J0KHMpfSkpO2NvbnN0IGxmPWNmO3ZhciB1Zj1fY3VycnkxKChmdW5jdGlvbihzKXtyZXR1cm4gX250aCgwLHMpfSkpO2NvbnN0IGhmPXVmO2NvbnN0IGRmPV9jdXJyeTEoX3JlZHVjZWQpO2NvbnN0IG1mPWNjKFZ1KTtjb25zdCBnZj1ydShmcCx3ZCk7ZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHMpe3JldHVybiBmdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMocyl7aWYoQXJyYXkuaXNBcnJheShzKSlyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocyl9KHMpfHxmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KHMpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZudWxsIT1zW1N5bWJvbC5pdGVyYXRvcl18fG51bGwhPXNbIkBAaXRlcmF0b3IiXSlyZXR1cm4gQXJyYXkuZnJvbShzKX0ocyl8fGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShzLG8pe2lmKHMpe2lmKCJzdHJpbmciPT10eXBlb2YgcylyZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocyxvKTt2YXIgaT17fS50b1N0cmluZy5jYWxsKHMpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09aSYmcy5jb25zdHJ1Y3RvciYmKGk9cy5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PWl8fCJTZXQiPT09aT9BcnJheS5mcm9tKHMpOiJBcmd1bWVudHMiPT09aXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoaSk/X2FycmF5TGlrZVRvQXJyYXkocyxvKTp2b2lkIDB9fShzKXx8ZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkocyxvKXsobnVsbD09b3x8bz5zLmxlbmd0aCkmJihvPXMubGVuZ3RoKTtmb3IodmFyIGk9MCxhPUFycmF5KG8pO2k8bztpKyspYVtpXT1zW2ldO3JldHVybiBhfXZhciB5Zj1waXBlKGxmKGFmKChmdW5jdGlvbihzLG8pe3JldHVybiBzLmxlbmd0aD5vLmxlbmd0aH0pKSksaGYsbmEoImxlbmd0aCIpKSxiZj11YSgoZnVuY3Rpb24ocyxvLGkpe3ZhciBhPWkuYXBwbHkodm9pZCAwLF90b0NvbnN1bWFibGVBcnJheShzKSk7cmV0dXJuIG1mKGEpP2RmKGEpOm99KSk7Y29uc3QgU2Y9b2YoZ2YsKGZ1bmN0aW9uIGRpc3BhdGNoSW1wbChzKXt2YXIgbz15ZihzKTtyZXR1cm4gbGEobywoZnVuY3Rpb24oKXtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCxpPW5ldyBBcnJheShvKSxhPTA7YTxvO2ErKylpW2FdPWFyZ3VtZW50c1thXTtyZXR1cm4gUGkoYmYoaSksdm9pZCAwLHMpfSkpfSkscGMpO2NvbnN0IF9mPWNsYXNzIEFsdGVybmF0aW5nVmlzaXRvciBleHRlbmRzIENke2FsdGVybmF0b3I7Y29uc3RydWN0b3Ioe2FsdGVybmF0b3I6cywuLi5vfSl7c3VwZXIoey4uLm99KSx0aGlzLmFsdGVybmF0b3I9c31lbnRlcihzKXtjb25zdCBvPXRoaXMuYWx0ZXJuYXRvci5tYXAoKCh7cHJlZGljYXRlOnMsc3BlY1BhdGg6b30pPT5vZihzLGxjKG8pLHBjKSkpLGk9U2Yobykocyk7cmV0dXJuIHRoaXMuZWxlbWVudD10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChpLHMpLEZ1fX07Y29uc3QgeGY9Y2xhc3MgU2NoZW1hT3JSZWZlcmVuY2VWaXNpdG9yIGV4dGVuZHMgX2Z7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5hbHRlcm5hdG9yPVt7cHJlZGljYXRlOmlzSlNPTlJlZmVyZW5jZUxpa2VFbGVtZW50LHNwZWNQYXRoOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlJlZmVyZW5jZSJdfSx7cHJlZGljYXRlOmVzX1Qsc3BlY1BhdGg6WyJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIl19XX19O2NsYXNzIE1lZGlhVmlzaXRvciBleHRlbmRzKE1peGluKElkLHVkKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB0ZCx0aGlzLnNwZWNQYXRoPWxjKFsiZG9jdW1lbnQiLCJvYmplY3RzIiwiTWVkaWEiXSl9fWNvbnN0IGtmPU1lZGlhVmlzaXRvcjtjbGFzcyBMaW5rRGVzY3JpcHRpb25WaXNpdG9yIGV4dGVuZHMoTWl4aW4oSWQsdWQpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHNkLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJMaW5rRGVzY3JpcHRpb24iXSl9fWNvbnN0IE9mPUxpbmtEZXNjcmlwdGlvblZpc2l0b3IsQ2Y9e3Zpc2l0b3JzOnt2YWx1ZTp1ZCxKU09OU2NoZW1hT3JKU09OUmVmZXJlbmNlVmlzaXRvcjp4Zixkb2N1bWVudDp7b2JqZWN0czp7SlNPTlNjaGVtYTp7JHZpc2l0b3I6TGQsZml4ZWRGaWVsZHM6e2lkOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sJHNjaGVtYTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LG11bHRpcGxlT2Y6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxtYXhpbXVtOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZXhjbHVzaXZlTWF4aW11bTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LG1pbmltdW06eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxleGNsdXNpdmVNaW5pbXVtOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sbWF4TGVuZ3RoOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sbWluTGVuZ3RoOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0scGF0dGVybjp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGFkZGl0aW9uYWxJdGVtczp4ZixpdGVtczpGZCxtYXhJdGVtczp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LG1pbkl0ZW1zOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sdW5pcXVlSXRlbXM6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxtYXhQcm9wZXJ0aWVzOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sbWluUHJvcGVydGllczp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHJlcXVpcmVkOkJkLHByb3BlcnRpZXM6VmQsYWRkaXRpb25hbFByb3BlcnRpZXM6eGYscGF0dGVyblByb3BlcnRpZXM6V2QsZGVwZW5kZW5jaWVzOkpkLGVudW06SGQsdHlwZTpLZCxhbGxPZjpHZCxhbnlPZjpZZCxvbmVPZjpYZCxub3Q6eGYsZGVmaW5pdGlvbnM6UWQsdGl0bGU6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxkZXNjcmlwdGlvbjp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGRlZmF1bHQ6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxmb3JtYXQ6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxiYXNlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sbGlua3M6WmQsbWVkaWE6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9NZWRpYSJ9LHJlYWRPbmx5OnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn19fSxKU09OUmVmZXJlbmNlOnskdmlzaXRvcjplZixmaXhlZEZpZWxkczp7JHJlZjpyZn19LE1lZGlhOnskdmlzaXRvcjprZixmaXhlZEZpZWxkczp7YmluYXJ5RW5jb2Rpbmc6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSx0eXBlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn19fSxMaW5rRGVzY3JpcHRpb246eyR2aXNpdG9yOk9mLGZpeGVkRmllbGRzOntocmVmOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0scmVsOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sdGl0bGU6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSx0YXJnZXRTY2hlbWE6eGYsbWVkaWFUeXBlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sbWV0aG9kOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZW5jVHlwZTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHNjaGVtYTp4Zn19fX19fSx0cmF2ZXJzYWxfdmlzaXRvcl9nZXROb2RlVHlwZT1zPT57aWYoa3UocykpcmV0dXJuYCR7cy5lbGVtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3MuZWxlbWVudC5zbGljZSgxKX1FbGVtZW50YH0samY9e0pTT05TY2hlbWFEcmFmdDRFbGVtZW50OlsiY29udGVudCJdLEpTT05SZWZlcmVuY2VFbGVtZW50OlsiY29udGVudCJdLE1lZGlhRWxlbWVudDpbImNvbnRlbnQiXSxMaW5rRGVzY3JpcHRpb25FbGVtZW50OlsiY29udGVudCJdLC4uLmVwfSxQZj17bmFtZXNwYWNlOnM9Pntjb25zdHtiYXNlOm99PXM7cmV0dXJuIG8ucmVnaXN0ZXIoImpTT05TY2hlbWFEcmFmdDQiLEdoKSxvLnJlZ2lzdGVyKCJqU09OUmVmZXJlbmNlIixRaCksby5yZWdpc3RlcigibWVkaWEiLHRkKSxvLnJlZ2lzdGVyKCJsaW5rRGVzY3JpcHRpb24iLHNkKSxvfX0sVGY9UGYscmVmcmFjdG9yX3Rvb2xib3g9KCk9Pntjb25zdCBzPWNyZWF0ZU5hbWVzcGFjZShUZik7cmV0dXJue3ByZWRpY2F0ZXM6ey4uLmFlLGlzU3RyaW5nRWxlbWVudDpPdX0sbmFtZXNwYWNlOnN9fSxyZWZyYWN0b3JfcmVmcmFjdD0ocyx7c3BlY1BhdGg6bz1bInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsIiR2aXNpdG9yIl0scGx1Z2luczppPVtdLHNwZWNpZmljYXRpb25PYmo6YT1DZn09e30pPT57Y29uc3QgdT0oMCx2dS5lKShzKSxfPWRlcmVmZXJlbmNlKGEpLHc9bmV3KEd1KG8sXykpKHtzcGVjT2JqOl99KTtyZXR1cm4gdmlzaXRvcl92aXNpdCh1LHcpLGRpc3BhdGNoUGx1Z2luc1N5bmMody5lbGVtZW50LGkse3Rvb2xib3hDcmVhdG9yOnJlZnJhY3Rvcl90b29sYm94LHZpc2l0b3JPcHRpb25zOntrZXlNYXA6amYsbm9kZVR5cGVHZXR0ZXI6dHJhdmVyc2FsX3Zpc2l0b3JfZ2V0Tm9kZVR5cGV9fSl9LHJlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3I9cz0+KG8saT17fSk9PnJlZnJhY3Rvcl9yZWZyYWN0KG8se3NwZWNQYXRoOnMsLi4uaX0pO0doLnJlZnJhY3Q9cmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsIiR2aXNpdG9yIl0pLFFoLnJlZnJhY3Q9cmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlJlZmVyZW5jZSIsIiR2aXNpdG9yIl0pLHRkLnJlZnJhY3Q9cmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTWVkaWEiLCIkdmlzaXRvciJdKSxzZC5yZWZyYWN0PXJlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsIiR2aXNpdG9yIl0pO2NvbnN0IE5mPWNsYXNzIFNjaGVtYV9TY2hlbWEgZXh0ZW5kcyBHaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ic2NoZW1hIix0aGlzLmNsYXNzZXMucHVzaCgianNvbi1zY2hlbWEtZHJhZnQtNCIpfWdldCBpZFByb3AoKXt0aHJvdyBuZXcgS2goImlkUHJvcCBnZXR0ZXIgaW4gU2NoZW1hIGNsYXNzIGlzIG5vdCBub3Qgc3VwcG9ydGVkLiIpfXNldCBpZFByb3Aocyl7dGhyb3cgbmV3IEtoKCJpZFByb3Agc2V0dGVyIGluIFNjaGVtYSBjbGFzcyBpcyBub3Qgbm90IHN1cHBvcnRlZC4iKX1nZXQgJHNjaGVtYSgpe3Rocm93IG5ldyBLaCgiJHNjaGVtYSBnZXR0ZXIgaW4gU2NoZW1hIGNsYXNzIGlzIG5vdCBub3Qgc3VwcG9ydGVkLiIpfXNldCAkc2NoZW1hKHMpe3Rocm93IG5ldyBLaCgiJHNjaGVtYSBzZXR0ZXIgaW4gU2NoZW1hIGNsYXNzIGlzIG5vdCBub3Qgc3VwcG9ydGVkLiIpfWdldCBhZGRpdGlvbmFsSXRlbXMoKXtyZXR1cm4gdGhpcy5nZXQoImFkZGl0aW9uYWxJdGVtcyIpfXNldCBhZGRpdGlvbmFsSXRlbXMocyl7dGhpcy5zZXQoImFkZGl0aW9uYWxJdGVtcyIscyl9Z2V0IGl0ZW1zKCl7cmV0dXJuIHRoaXMuZ2V0KCJpdGVtcyIpfXNldCBpdGVtcyhzKXt0aGlzLnNldCgiaXRlbXMiLHMpfWdldCBhZGRpdGlvbmFsUHJvcGVydGllcygpe3JldHVybiB0aGlzLmdldCgiYWRkaXRpb25hbFByb3BlcnRpZXMiKX1zZXQgYWRkaXRpb25hbFByb3BlcnRpZXMocyl7dGhpcy5zZXQoImFkZGl0aW9uYWxQcm9wZXJ0aWVzIixzKX1nZXQgcGF0dGVyblByb3BlcnRpZXMoKXt0aHJvdyBuZXcgS2goInBhdHRlcm5Qcm9wZXJ0aWVzIGdldHRlciBpbiBTY2hlbWEgY2xhc3MgaXMgbm90IG5vdCBzdXBwb3J0ZWQuIil9c2V0IHBhdHRlcm5Qcm9wZXJ0aWVzKHMpe3Rocm93IG5ldyBLaCgicGF0dGVyblByb3BlcnRpZXMgc2V0dGVyIGluIFNjaGVtYSBjbGFzcyBpcyBub3Qgbm90IHN1cHBvcnRlZC4iKX1nZXQgZGVwZW5kZW5jaWVzKCl7dGhyb3cgbmV3IEtoKCJkZXBlbmRlbmNpZXMgZ2V0dGVyIGluIFNjaGVtYSBjbGFzcyBpcyBub3Qgbm90IHN1cHBvcnRlZC4iKX1zZXQgZGVwZW5kZW5jaWVzKHMpe3Rocm93IG5ldyBLaCgiZGVwZW5kZW5jaWVzIHNldHRlciBpbiBTY2hlbWEgY2xhc3MgaXMgbm90IG5vdCBzdXBwb3J0ZWQuIil9Z2V0IHR5cGUoKXtyZXR1cm4gdGhpcy5nZXQoInR5cGUiKX1zZXQgdHlwZShzKXt0aGlzLnNldCgidHlwZSIscyl9Z2V0IG5vdCgpe3JldHVybiB0aGlzLmdldCgibm90Iil9c2V0IG5vdChzKXt0aGlzLnNldCgibm90IixzKX1nZXQgZGVmaW5pdGlvbnMoKXt0aHJvdyBuZXcgS2goImRlZmluaXRpb25zIGdldHRlciBpbiBTY2hlbWEgY2xhc3MgaXMgbm90IG5vdCBzdXBwb3J0ZWQuIil9c2V0IGRlZmluaXRpb25zKHMpe3Rocm93IG5ldyBLaCgiZGVmaW5pdGlvbnMgc2V0dGVyIGluIFNjaGVtYSBjbGFzcyBpcyBub3Qgbm90IHN1cHBvcnRlZC4iKX1nZXQgYmFzZSgpe3Rocm93IG5ldyBLaCgiYmFzZSBnZXR0ZXIgaW4gU2NoZW1hIGNsYXNzIGlzIG5vdCBub3Qgc3VwcG9ydGVkLiIpfXNldCBiYXNlKHMpe3Rocm93IG5ldyBLaCgiYmFzZSBzZXR0ZXIgaW4gU2NoZW1hIGNsYXNzIGlzIG5vdCBub3Qgc3VwcG9ydGVkLiIpfWdldCBsaW5rcygpe3Rocm93IG5ldyBLaCgibGlua3MgZ2V0dGVyIGluIFNjaGVtYSBjbGFzcyBpcyBub3Qgbm90IHN1cHBvcnRlZC4iKX1zZXQgbGlua3Mocyl7dGhyb3cgbmV3IEtoKCJsaW5rcyBzZXR0ZXIgaW4gU2NoZW1hIGNsYXNzIGlzIG5vdCBub3Qgc3VwcG9ydGVkLiIpfWdldCBtZWRpYSgpe3Rocm93IG5ldyBLaCgibWVkaWEgZ2V0dGVyIGluIFNjaGVtYSBjbGFzcyBpcyBub3Qgbm90IHN1cHBvcnRlZC4iKX1zZXQgbWVkaWEocyl7dGhyb3cgbmV3IEtoKCJtZWRpYSBzZXR0ZXIgaW4gU2NoZW1hIGNsYXNzIGlzIG5vdCBub3Qgc3VwcG9ydGVkLiIpfWdldCBudWxsYWJsZSgpe3JldHVybiB0aGlzLmdldCgibnVsbGFibGUiKX1zZXQgbnVsbGFibGUocyl7dGhpcy5zZXQoIm51bGxhYmxlIixzKX1nZXQgZGlzY3JpbWluYXRvcigpe3JldHVybiB0aGlzLmdldCgiZGlzY3JpbWluYXRvciIpfXNldCBkaXNjcmltaW5hdG9yKHMpe3RoaXMuc2V0KCJkaXNjcmltaW5hdG9yIixzKX1nZXQgd3JpdGVPbmx5KCl7cmV0dXJuIHRoaXMuZ2V0KCJ3cml0ZU9ubHkiKX1zZXQgd3JpdGVPbmx5KHMpe3RoaXMuc2V0KCJ3cml0ZU9ubHkiLHMpfWdldCB4bWwoKXtyZXR1cm4gdGhpcy5nZXQoInhtbCIpfXNldCB4bWwocyl7dGhpcy5zZXQoInhtbCIscyl9Z2V0IGV4dGVybmFsRG9jcygpe3JldHVybiB0aGlzLmdldCgiZXh0ZXJuYWxEb2NzIil9c2V0IGV4dGVybmFsRG9jcyhzKXt0aGlzLnNldCgiZXh0ZXJuYWxEb2NzIixzKX1nZXQgZXhhbXBsZSgpe3JldHVybiB0aGlzLmdldCgiZXhhbXBsZSIpfXNldCBleGFtcGxlKHMpe3RoaXMuc2V0KCJleGFtcGxlIixzKX1nZXQgZGVwcmVjYXRlZCgpe3JldHVybiB0aGlzLmdldCgiZGVwcmVjYXRlZCIpfXNldCBkZXByZWNhdGVkKHMpe3RoaXMuc2V0KCJkZXByZWNhdGVkIixzKX19O2NsYXNzIFNlY3VyaXR5UmVxdWlyZW1lbnQgZXh0ZW5kcyB2dS5TaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ic2VjdXJpdHlSZXF1aXJlbWVudCJ9fWNvbnN0IFJmPVNlY3VyaXR5UmVxdWlyZW1lbnQ7Y2xhc3MgU2VjdXJpdHlTY2hlbWUgZXh0ZW5kcyB2dS5TaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ic2VjdXJpdHlTY2hlbWUifWdldCB0eXBlKCl7cmV0dXJuIHRoaXMuZ2V0KCJ0eXBlIil9c2V0IHR5cGUocyl7dGhpcy5zZXQoInR5cGUiLHMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLmdldCgiZGVzY3JpcHRpb24iKX1zZXQgZGVzY3JpcHRpb24ocyl7dGhpcy5zZXQoImRlc2NyaXB0aW9uIixzKX1nZXQgbmFtZSgpe3JldHVybiB0aGlzLmdldCgibmFtZSIpfXNldCBuYW1lKHMpe3RoaXMuc2V0KCJuYW1lIixzKX1nZXQgaW4oKXtyZXR1cm4gdGhpcy5nZXQoImluIil9c2V0IGluKHMpe3RoaXMuc2V0KCJpbiIscyl9Z2V0IHNjaGVtZSgpe3JldHVybiB0aGlzLmdldCgic2NoZW1lIil9c2V0IHNjaGVtZShzKXt0aGlzLnNldCgic2NoZW1lIixzKX1nZXQgYmVhcmVyRm9ybWF0KCl7cmV0dXJuIHRoaXMuZ2V0KCJiZWFyZXJGb3JtYXQiKX1zZXQgYmVhcmVyRm9ybWF0KHMpe3RoaXMuc2V0KCJiZWFyZXJGb3JtYXQiLHMpfWdldCBmbG93cygpe3JldHVybiB0aGlzLmdldCgiZmxvd3MiKX1zZXQgZmxvd3Mocyl7dGhpcy5zZXQoImZsb3dzIixzKX1nZXQgb3BlbklkQ29ubmVjdFVybCgpe3JldHVybiB0aGlzLmdldCgib3BlbklkQ29ubmVjdFVybCIpfXNldCBvcGVuSWRDb25uZWN0VXJsKHMpe3RoaXMuc2V0KCJvcGVuSWRDb25uZWN0VXJsIixzKX19Y29uc3QgRGY9U2VjdXJpdHlTY2hlbWU7Y2xhc3MgU2VydmVyIGV4dGVuZHMgdnUuU2h7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmVsZW1lbnQ9InNlcnZlciJ9Z2V0IHVybCgpe3JldHVybiB0aGlzLmdldCgidXJsIil9c2V0IHVybChzKXt0aGlzLnNldCgidXJsIixzKX1nZXQgZGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5nZXQoImRlc2NyaXB0aW9uIil9c2V0IGRlc2NyaXB0aW9uKHMpe3RoaXMuc2V0KCJkZXNjcmlwdGlvbiIscyl9Z2V0IHZhcmlhYmxlcygpe3JldHVybiB0aGlzLmdldCgidmFyaWFibGVzIil9c2V0IHZhcmlhYmxlcyhzKXt0aGlzLnNldCgidmFyaWFibGVzIixzKX19Y29uc3QgRmY9U2VydmVyO2NsYXNzIFNlcnZlclZhcmlhYmxlIGV4dGVuZHMgdnUuU2h7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmVsZW1lbnQ9InNlcnZlclZhcmlhYmxlIn1nZXQgZW51bSgpe3JldHVybiB0aGlzLmdldCgiZW51bSIpfXNldCBlbnVtKHMpe3RoaXMuc2V0KCJlbnVtIixzKX1nZXQgZGVmYXVsdCgpe3JldHVybiB0aGlzLmdldCgiZGVmYXVsdCIpfXNldCBkZWZhdWx0KHMpe3RoaXMuc2V0KCJkZWZhdWx0IixzKX1nZXQgZGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5nZXQoImRlc2NyaXB0aW9uIil9c2V0IGRlc2NyaXB0aW9uKHMpe3RoaXMuc2V0KCJkZXNjcmlwdGlvbiIscyl9fWNvbnN0IFZmPVNlcnZlclZhcmlhYmxlO2NsYXNzIFRhZyBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJ0YWcifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuZ2V0KCJuYW1lIil9c2V0IG5hbWUocyl7dGhpcy5zZXQoIm5hbWUiLHMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLmdldCgiZGVzY3JpcHRpb24iKX1zZXQgZGVzY3JpcHRpb24ocyl7dGhpcy5zZXQoImRlc2NyaXB0aW9uIixzKX1nZXQgZXh0ZXJuYWxEb2NzKCl7cmV0dXJuIHRoaXMuZ2V0KCJleHRlcm5hbERvY3MiKX1zZXQgZXh0ZXJuYWxEb2NzKHMpe3RoaXMuc2V0KCJleHRlcm5hbERvY3MiLHMpfX1jb25zdCBXZj1UYWc7Y2xhc3MgWG1sIGV4dGVuZHMgdnUuU2h7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmVsZW1lbnQ9InhtbCJ9Z2V0IG5hbWUoKXtyZXR1cm4gdGhpcy5nZXQoIm5hbWUiKX1zZXQgbmFtZShzKXt0aGlzLnNldCgibmFtZSIscyl9Z2V0IG5hbWVzcGFjZSgpe3JldHVybiB0aGlzLmdldCgibmFtZXNwYWNlIil9c2V0IG5hbWVzcGFjZShzKXt0aGlzLnNldCgibmFtZXNwYWNlIixzKX1nZXQgcHJlZml4KCl7cmV0dXJuIHRoaXMuZ2V0KCJwcmVmaXgiKX1zZXQgcHJlZml4KHMpe3RoaXMuc2V0KCJwcmVmaXgiLHMpfWdldCBhdHRyaWJ1dGUoKXtyZXR1cm4gdGhpcy5nZXQoImF0dHJpYnV0ZSIpfXNldCBhdHRyaWJ1dGUocyl7dGhpcy5zZXQoImF0dHJpYnV0ZSIscyl9Z2V0IHdyYXBwZWQoKXtyZXR1cm4gdGhpcy5nZXQoIndyYXBwZWQiKX1zZXQgd3JhcHBlZChzKXt0aGlzLnNldCgid3JhcHBlZCIscyl9fWNvbnN0IEpmPVhtbDtjb25zdCBIZj1jbGFzcyB2aXNpdG9yc19WaXNpdG9yX1Zpc2l0b3J7ZWxlbWVudDtjb25zdHJ1Y3RvcihzPXt9KXtPYmplY3QuYXNzaWduKHRoaXMscyl9Y29weU1ldGFBbmRBdHRyaWJ1dGVzKHMsbyl7KHMubWV0YS5sZW5ndGg+MHx8by5tZXRhLmxlbmd0aD4wKSYmKG8ubWV0YT1jZChvLm1ldGEscy5tZXRhKSksaGFzRWxlbWVudFNvdXJjZU1hcChzKSYmYXNzaWduU291cmNlTWFwKG8scyksKHMuYXR0cmlidXRlcy5sZW5ndGg+MHx8cy5tZXRhLmxlbmd0aD4wKSYmKG8uYXR0cmlidXRlcz1jZChvLmF0dHJpYnV0ZXMscy5hdHRyaWJ1dGVzKSl9fTtjb25zdCBHZj1jbGFzcyBGYWxsYmFja1Zpc2l0b3JfRmFsbGJhY2tWaXNpdG9yIGV4dGVuZHMgSGZ7ZW50ZXIocyl7cmV0dXJuIHRoaXMuZWxlbWVudD1jbG9uZURlZXAocyksRnV9fTtjb25zdCBYZj1jbGFzcyBTcGVjaWZpY2F0aW9uVmlzaXRvcl9TcGVjaWZpY2F0aW9uVmlzaXRvciBleHRlbmRzIEhme3NwZWNPYmo7cGFzc2luZ09wdGlvbnNOYW1lcz1bInNwZWNPYmoiLCJvcGVuQXBpR2VuZXJpY0VsZW1lbnQiLCJvcGVuQXBpU2VtYW50aWNFbGVtZW50Il07b3BlbkFwaUdlbmVyaWNFbGVtZW50O29wZW5BcGlTZW1hbnRpY0VsZW1lbnQ7Y29uc3RydWN0b3Ioe3NwZWNPYmo6cyxwYXNzaW5nT3B0aW9uc05hbWVzOm8sb3BlbkFwaUdlbmVyaWNFbGVtZW50Omksb3BlbkFwaVNlbWFudGljRWxlbWVudDphLC4uLnV9KXtzdXBlcih7Li4udX0pLHRoaXMuc3BlY09iaj1zLHRoaXMub3BlbkFwaUdlbmVyaWNFbGVtZW50PWksdGhpcy5vcGVuQXBpU2VtYW50aWNFbGVtZW50PWEsQXJyYXkuaXNBcnJheShvKSYmKHRoaXMucGFzc2luZ09wdGlvbnNOYW1lcz1vKX1yZXRyaWV2ZVBhc3NpbmdPcHRpb25zKCl7cmV0dXJuIEFkKHRoaXMucGFzc2luZ09wdGlvbnNOYW1lcyx0aGlzKX1yZXRyaWV2ZUZpeGVkRmllbGRzKHMpe2NvbnN0IG89R3UoWyJ2aXNpdG9ycyIsLi4ucywiZml4ZWRGaWVsZHMiXSx0aGlzLnNwZWNPYmopO3JldHVybiJvYmplY3QiPT10eXBlb2YgbyYmbnVsbCE9PW8/T2JqZWN0LmtleXMobyk6W119cmV0cmlldmVWaXNpdG9yKHMpe3JldHVybiBldShqYyxbInZpc2l0b3JzIiwuLi5zXSx0aGlzLnNwZWNPYmopP0d1KFsidmlzaXRvcnMiLC4uLnNdLHRoaXMuc3BlY09iaik6R3UoWyJ2aXNpdG9ycyIsLi4ucywiJHZpc2l0b3IiXSx0aGlzLnNwZWNPYmopfXJldHJpZXZlVmlzaXRvckluc3RhbmNlKHMsbz17fSl7Y29uc3QgaT10aGlzLnJldHJpZXZlUGFzc2luZ09wdGlvbnMoKTtyZXR1cm4gbmV3KHRoaXMucmV0cmlldmVWaXNpdG9yKHMpKSh7Li4uaSwuLi5vfSl9dG9SZWZyYWN0ZWRFbGVtZW50KHMsbyxpPXt9KXtjb25zdCBhPXRoaXMucmV0cmlldmVWaXNpdG9ySW5zdGFuY2UocyxpKTtyZXR1cm4gYSBpbnN0YW5jZW9mIEdmJiYobnVsbD09YT92b2lkIDA6YS5jb25zdHJ1Y3Rvcik9PT1HZj9jbG9uZURlZXAobyk6KHZpc2l0b3JfdmlzaXQobyxhLGkpLGEuZWxlbWVudCl9fTt2YXIgUWY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBYVGFrZShzLG8pe3RoaXMueGY9byx0aGlzLm49cyx0aGlzLmk9MH1yZXR1cm4gWFRha2UucHJvdG90eXBlWyJAQHRyYW5zZHVjZXIvaW5pdCJdPV94ZkJhc2VfaW5pdCxYVGFrZS5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9yZXN1bHQiXT1feGZCYXNlX3Jlc3VsdCxYVGFrZS5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9zdGVwIl09ZnVuY3Rpb24ocyxvKXt0aGlzLmkrPTE7dmFyIGk9MD09PXRoaXMubj9zOnRoaXMueGZbIkBAdHJhbnNkdWNlci9zdGVwIl0ocyxvKTtyZXR1cm4gdGhpcy5uPj0wJiZ0aGlzLmk+PXRoaXMubj9fcmVkdWNlZChpKTppfSxYVGFrZX0oKTtmdW5jdGlvbiBfeHRha2Uocyl7cmV0dXJuIGZ1bmN0aW9uKG8pe3JldHVybiBuZXcgUWYocyxvKX19Y29uc3QgZW09X2N1cnJ5MihfZGlzcGF0Y2hhYmxlKFsidGFrZSJdLF94dGFrZSwoZnVuY3Rpb24gdGFrZShzLG8pe3JldHVybiBSaSgwLHM8MD8xLzA6cyxvKX0pKSk7dmFyIHRtPV9jdXJyeTIoKGZ1bmN0aW9uKHMsbyl7cmV0dXJuIGthKGVtKHMubGVuZ3RoLG8pLHMpfSkpO2NvbnN0IHJtPXRtLGlzUmVmZXJlbmNlTGlrZUVsZW1lbnQ9cz0+UHUocykmJnMuaGFzS2V5KCIkcmVmIiksbm09UHUsc209UHUsaXNPcGVuQXBpRXh0ZW5zaW9uPXM9Pk91KHMua2V5KSYmcm0oIngtIixzZXJpYWxpemVyc192YWx1ZShzLmtleSkpO2NvbnN0IG9tPWNsYXNzIEZpeGVkRmllbGRzVmlzaXRvcl9GaXhlZEZpZWxkc1Zpc2l0b3IgZXh0ZW5kcyBYZntzcGVjUGF0aDtpZ25vcmVkRmllbGRzO2NhblN1cHBvcnRTcGVjaWZpY2F0aW9uRXh0ZW5zaW9ucz0hMDtzcGVjaWZpY2F0aW9uRXh0ZW5zaW9uUHJlZGljYXRlPWlzT3BlbkFwaUV4dGVuc2lvbjtjb25zdHJ1Y3Rvcih7c3BlY1BhdGg6cyxpZ25vcmVkRmllbGRzOm8sY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zOmksc3BlY2lmaWNhdGlvbkV4dGVuc2lvblByZWRpY2F0ZTphLC4uLnV9KXtzdXBlcih7Li4udX0pLHRoaXMuc3BlY1BhdGg9cyx0aGlzLmlnbm9yZWRGaWVsZHM9b3x8W10sImJvb2xlYW4iPT10eXBlb2YgaSYmKHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPWkpLCJmdW5jdGlvbiI9PXR5cGVvZiBhJiYodGhpcy5zcGVjaWZpY2F0aW9uRXh0ZW5zaW9uUHJlZGljYXRlPWEpfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz10aGlzLnNwZWNQYXRoKHMpLGk9dGhpcy5yZXRyaWV2ZUZpeGVkRmllbGRzKG8pO3JldHVybiBzLmZvckVhY2goKChzLGEsdSk9PntpZihPdShhKSYmaS5pbmNsdWRlcyhzZXJpYWxpemVyc192YWx1ZShhKSkmJiF0aGlzLmlnbm9yZWRGaWVsZHMuaW5jbHVkZXMoc2VyaWFsaXplcnNfdmFsdWUoYSkpKXtjb25zdCBpPXRoaXMudG9SZWZyYWN0ZWRFbGVtZW50KFsuLi5vLCJmaXhlZEZpZWxkcyIsc2VyaWFsaXplcnNfdmFsdWUoYSldLHMpLF89bmV3IHZ1LlByKGNsb25lRGVlcChhKSxpKTt0aGlzLmNvcHlNZXRhQW5kQXR0cmlidXRlcyh1LF8pLF8uY2xhc3Nlcy5wdXNoKCJmaXhlZC1maWVsZCIpLHRoaXMuZWxlbWVudC5jb250ZW50LnB1c2goXyl9ZWxzZSBpZih0aGlzLmNhblN1cHBvcnRTcGVjaWZpY2F0aW9uRXh0ZW5zaW9ucyYmdGhpcy5zcGVjaWZpY2F0aW9uRXh0ZW5zaW9uUHJlZGljYXRlKHUpKXtjb25zdCBzPXRoaXMudG9SZWZyYWN0ZWRFbGVtZW50KFsiZG9jdW1lbnQiLCJleHRlbnNpb24iXSx1KTt0aGlzLmVsZW1lbnQuY29udGVudC5wdXNoKHMpfWVsc2UgdGhpcy5pZ25vcmVkRmllbGRzLmluY2x1ZGVzKHNlcmlhbGl6ZXJzX3ZhbHVlKGEpKXx8dGhpcy5lbGVtZW50LmNvbnRlbnQucHVzaChjbG9uZURlZXAodSkpfSkpLHRoaXMuY29weU1ldGFBbmRBdHRyaWJ1dGVzKHMsdGhpcy5lbGVtZW50KSxGdX19O2NsYXNzIE9wZW5BcGkzXzBWaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IGpoLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJPcGVuQXBpIl0pLHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPSEwfU9iamVjdEVsZW1lbnQocyl7cmV0dXJuIG9tLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKX19Y29uc3QgaW09T3BlbkFwaTNfMFZpc2l0b3I7Y2xhc3MgT3BlbmFwaVZpc2l0b3IgZXh0ZW5kcyhNaXhpbihYZixHZikpe1N0cmluZ0VsZW1lbnQocyl7Y29uc3Qgbz1uZXcgT2goc2VyaWFsaXplcnNfdmFsdWUocykpO3JldHVybiB0aGlzLmNvcHlNZXRhQW5kQXR0cmlidXRlcyhzLG8pLHRoaXMuZWxlbWVudD1vLEZ1fX1jb25zdCBhbT1PcGVuYXBpVmlzaXRvcjtjb25zdCBjbT1jbGFzcyBTcGVjaWZpY2F0aW9uRXh0ZW5zaW9uVmlzaXRvciBleHRlbmRzIFhme01lbWJlckVsZW1lbnQocyl7cmV0dXJuIHRoaXMuZWxlbWVudD1jbG9uZURlZXAocyksdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgic3BlY2lmaWNhdGlvbi1leHRlbnNpb24iKSxGdX19O2NsYXNzIEluZm9WaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHVoLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJJbmZvIl0pLHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPSEwfX1jb25zdCBsbT1JbmZvVmlzaXRvcjtjb25zdCB1bT1jbGFzcyBWZXJzaW9uVmlzaXRvciBleHRlbmRzIEdme1N0cmluZ0VsZW1lbnQocyl7Y29uc3Qgbz1zdXBlci5lbnRlcihzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgiYXBpLXZlcnNpb24iKSx0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJ2ZXJzaW9uIiksb319O2NsYXNzIENvbnRhY3RWaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IFlwLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJDb250YWN0Il0pLHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPSEwfX1jb25zdCBwbT1Db250YWN0VmlzaXRvcjtjbGFzcyBMaWNlbnNlVmlzaXRvciBleHRlbmRzKE1peGluKG9tLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBkaCx0aGlzLnNwZWNQYXRoPWxjKFsiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGljZW5zZSJdKSx0aGlzLmNhblN1cHBvcnRTcGVjaWZpY2F0aW9uRXh0ZW5zaW9ucz0hMH19Y29uc3QgaG09TGljZW5zZVZpc2l0b3I7Y2xhc3MgTGlua1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihvbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgZmgsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmsiXSksdGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnM9ITB9T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPW9tLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKTtyZXR1cm4oT3UodGhpcy5lbGVtZW50Lm9wZXJhdGlvbklkKXx8T3UodGhpcy5lbGVtZW50Lm9wZXJhdGlvblJlZikpJiZ0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJyZWZlcmVuY2UtZWxlbWVudCIpLG99fWNvbnN0IGRtPUxpbmtWaXNpdG9yO2NvbnN0IGZtPWNsYXNzIE9wZXJhdGlvblJlZlZpc2l0b3IgZXh0ZW5kcyBHZntTdHJpbmdFbGVtZW50KHMpe2NvbnN0IG89c3VwZXIuZW50ZXIocyk7cmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc2VzLnB1c2goInJlZmVyZW5jZS12YWx1ZSIpLG99fTtjb25zdCBtbT1jbGFzcyBPcGVyYXRpb25JZFZpc2l0b3IgZXh0ZW5kcyBHZntTdHJpbmdFbGVtZW50KHMpe2NvbnN0IG89c3VwZXIuZW50ZXIocyk7cmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc2VzLnB1c2goInJlZmVyZW5jZS12YWx1ZSIpLG99fTtjb25zdCBnbT1jbGFzcyBQYXR0ZXJuZWRGaWVsZHNWaXNpdG9yX1BhdHRlcm5lZEZpZWxkc1Zpc2l0b3IgZXh0ZW5kcyBYZntzcGVjUGF0aDtpZ25vcmVkRmllbGRzO2ZpZWxkUGF0dGVyblByZWRpY2F0ZT1lc19GO2NhblN1cHBvcnRTcGVjaWZpY2F0aW9uRXh0ZW5zaW9ucz0hMTtzcGVjaWZpY2F0aW9uRXh0ZW5zaW9uUHJlZGljYXRlPWlzT3BlbkFwaUV4dGVuc2lvbjtjb25zdHJ1Y3Rvcih7c3BlY1BhdGg6cyxpZ25vcmVkRmllbGRzOm8sZmllbGRQYXR0ZXJuUHJlZGljYXRlOmksY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zOmEsc3BlY2lmaWNhdGlvbkV4dGVuc2lvblByZWRpY2F0ZTp1LC4uLl99KXtzdXBlcih7Li4uX30pLHRoaXMuc3BlY1BhdGg9cyx0aGlzLmlnbm9yZWRGaWVsZHM9b3x8W10sImZ1bmN0aW9uIj09dHlwZW9mIGkmJih0aGlzLmZpZWxkUGF0dGVyblByZWRpY2F0ZT1pKSwiYm9vbGVhbiI9PXR5cGVvZiBhJiYodGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnM9YSksImZ1bmN0aW9uIj09dHlwZW9mIHUmJih0aGlzLnNwZWNpZmljYXRpb25FeHRlbnNpb25QcmVkaWNhdGU9dSl9T2JqZWN0RWxlbWVudChzKXtyZXR1cm4gcy5mb3JFYWNoKCgocyxvLGkpPT57aWYodGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnMmJnRoaXMuc3BlY2lmaWNhdGlvbkV4dGVuc2lvblByZWRpY2F0ZShpKSl7Y29uc3Qgcz10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChbImRvY3VtZW50IiwiZXh0ZW5zaW9uIl0saSk7dGhpcy5lbGVtZW50LmNvbnRlbnQucHVzaChzKX1lbHNlIGlmKCF0aGlzLmlnbm9yZWRGaWVsZHMuaW5jbHVkZXMoc2VyaWFsaXplcnNfdmFsdWUobykpJiZ0aGlzLmZpZWxkUGF0dGVyblByZWRpY2F0ZShzZXJpYWxpemVyc192YWx1ZShvKSkpe2NvbnN0IGE9dGhpcy5zcGVjUGF0aChzKSx1PXRoaXMudG9SZWZyYWN0ZWRFbGVtZW50KGEscyksXz1uZXcgdnUuUHIoY2xvbmVEZWVwKG8pLHUpO3RoaXMuY29weU1ldGFBbmRBdHRyaWJ1dGVzKGksXyksXy5jbGFzc2VzLnB1c2goInBhdHRlcm5lZC1maWVsZCIpLHRoaXMuZWxlbWVudC5jb250ZW50LnB1c2goXyl9ZWxzZSB0aGlzLmlnbm9yZWRGaWVsZHMuaW5jbHVkZXMoc2VyaWFsaXplcnNfdmFsdWUobykpfHx0aGlzLmVsZW1lbnQuY29udGVudC5wdXNoKGNsb25lRGVlcChpKSl9KSksdGhpcy5jb3B5TWV0YUFuZEF0dHJpYnV0ZXMocyx0aGlzLmVsZW1lbnQpLEZ1fX07Y29uc3QgeW09Y2xhc3MgTWFwVmlzaXRvcl9NYXBWaXNpdG9yIGV4dGVuZHMgZ217Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5maWVsZFBhdHRlcm5QcmVkaWNhdGU9T2R9fTtjbGFzcyBMaW5rUGFyYW1ldGVycyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9ImxpbmstcGFyYW1ldGVycyI7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmNsYXNzZXMucHVzaChMaW5rUGFyYW1ldGVycy5wcmltYXJ5Q2xhc3MpfX1jb25zdCB2bT1MaW5rUGFyYW1ldGVycztjbGFzcyBQYXJhbWV0ZXJzVmlzaXRvciBleHRlbmRzKE1peGluKHltLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB2bSx0aGlzLnNwZWNQYXRoPWxjKFsidmFsdWUiXSl9fWNvbnN0IGJtPVBhcmFtZXRlcnNWaXNpdG9yO2NsYXNzIFNlcnZlclZpc2l0b3IgZXh0ZW5kcyhNaXhpbihvbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgRmYsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIlNlcnZlciJdKSx0aGlzLmNhblN1cHBvcnRTcGVjaWZpY2F0aW9uRXh0ZW5zaW9ucz0hMH19Y29uc3QgU209U2VydmVyVmlzaXRvcjtjb25zdCBfbT1jbGFzcyBVcmxWaXNpdG9yIGV4dGVuZHMgR2Z7U3RyaW5nRWxlbWVudChzKXtjb25zdCBvPXN1cGVyLmVudGVyKHMpO3JldHVybiB0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJzZXJ2ZXItdXJsIiksb319O2NsYXNzIFNlcnZlcnMgZXh0ZW5kcyB2dS53RXtzdGF0aWMgcHJpbWFyeUNsYXNzPSJzZXJ2ZXJzIjtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKFNlcnZlcnMucHJpbWFyeUNsYXNzKX19Y29uc3QgRW09U2VydmVycztjbGFzcyBTZXJ2ZXJzVmlzaXRvciBleHRlbmRzKE1peGluKFhmLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBFbX1BcnJheUVsZW1lbnQocyl7cmV0dXJuIHMuZm9yRWFjaCgocz0+e2NvbnN0IG89bm0ocyk/WyJkb2N1bWVudCIsIm9iamVjdHMiLCJTZXJ2ZXIiXTpbInZhbHVlIl0saT10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChvLHMpO3RoaXMuZWxlbWVudC5wdXNoKGkpfSkpLHRoaXMuY29weU1ldGFBbmRBdHRyaWJ1dGVzKHMsdGhpcy5lbGVtZW50KSxGdX19Y29uc3Qgd209U2VydmVyc1Zpc2l0b3I7Y2xhc3MgU2VydmVyVmFyaWFibGVWaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IFZmLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJTZXJ2ZXJWYXJpYWJsZSJdKSx0aGlzLmNhblN1cHBvcnRTcGVjaWZpY2F0aW9uRXh0ZW5zaW9ucz0hMH19Y29uc3QgeG09U2VydmVyVmFyaWFibGVWaXNpdG9yO2NsYXNzIFNlcnZlclZhcmlhYmxlcyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9InNlcnZlci12YXJpYWJsZXMiO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goU2VydmVyVmFyaWFibGVzLnByaW1hcnlDbGFzcyl9fWNvbnN0IGttPVNlcnZlclZhcmlhYmxlcztjbGFzcyBWYXJpYWJsZXNWaXNpdG9yIGV4dGVuZHMoTWl4aW4oeW0sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IGttLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJTZXJ2ZXJWYXJpYWJsZSJdKX19Y29uc3QgT209VmFyaWFibGVzVmlzaXRvcjtjbGFzcyBNZWRpYVR5cGVWaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHZoLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJNZWRpYVR5cGUiXSksdGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnM9ITB9fWNvbnN0IEFtPU1lZGlhVHlwZVZpc2l0b3I7Y29uc3QgQ209Y2xhc3MgQWx0ZXJuYXRpbmdWaXNpdG9yX0FsdGVybmF0aW5nVmlzaXRvciBleHRlbmRzIFhme2FsdGVybmF0b3I7Y29uc3RydWN0b3Ioe2FsdGVybmF0b3I6cywuLi5vfSl7c3VwZXIoey4uLm99KSx0aGlzLmFsdGVybmF0b3I9c3x8W119ZW50ZXIocyl7Y29uc3Qgbz10aGlzLmFsdGVybmF0b3IubWFwKCgoe3ByZWRpY2F0ZTpzLHNwZWNQYXRoOm99KT0+b2YocyxsYyhvKSxwYykpKSxpPVNmKG8pKHMpO3JldHVybiB0aGlzLmVsZW1lbnQ9dGhpcy50b1JlZnJhY3RlZEVsZW1lbnQoaSxzKSxGdX19LGptPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgS3B8fHMoYSkmJm8oImNhbGxiYWNrIixhKSYmaSgib2JqZWN0IixhKSkpLFBtPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgR3B8fHMoYSkmJm8oImNvbXBvbmVudHMiLGEpJiZpKCJvYmplY3QiLGEpKSksSW09aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBZcHx8cyhhKSYmbygiY29udGFjdCIsYSkmJmkoIm9iamVjdCIsYSkpKSxUbT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIFpwfHxzKGEpJiZvKCJleGFtcGxlIixhKSYmaSgib2JqZWN0IixhKSkpLE5tPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgdGh8fHMoYSkmJm8oImV4dGVybmFsRG9jdW1lbnRhdGlvbiIsYSkmJmkoIm9iamVjdCIsYSkpKSxNbT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIHJofHxzKGEpJiZvKCJoZWFkZXIiLGEpJiZpKCJvYmplY3QiLGEpKSksUm09aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiB1aHx8cyhhKSYmbygiaW5mbyIsYSkmJmkoIm9iamVjdCIsYSkpKSxEbT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIGRofHxzKGEpJiZvKCJsaWNlbnNlIixhKSYmaSgib2JqZWN0IixhKSkpLExtPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgZmh8fHMoYSkmJm8oImxpbmsiLGEpJiZpKCJvYmplY3QiLGEpKSksRm09aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBPaHx8cyhhKSYmbygib3BlbmFwaSIsYSkmJmkoInN0cmluZyIsYSkpKSxCbT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOmksaGFzQ2xhc3M6YX0pPT51PT51IGluc3RhbmNlb2Ygamh8fHModSkmJm8oIm9wZW5BcGkzXzAiLHUpJiZpKCJvYmplY3QiLHUpJiZhKCJhcGkiLHUpKSksJG09aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBQaHx8cyhhKSYmbygib3BlcmF0aW9uIixhKSYmaSgib2JqZWN0IixhKSkpLHFtPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgSWh8fHMoYSkmJm8oInBhcmFtZXRlciIsYSkmJmkoIm9iamVjdCIsYSkpKSxVbT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIFJofHxzKGEpJiZvKCJwYXRoSXRlbSIsYSkmJmkoIm9iamVjdCIsYSkpKSxWbT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIERofHxzKGEpJiZvKCJwYXRocyIsYSkmJmkoIm9iamVjdCIsYSkpKSx6bT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIExofHxzKGEpJiZvKCJyZWZlcmVuY2UiLGEpJiZpKCJvYmplY3QiLGEpKSksV209aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBGaHx8cyhhKSYmbygicmVxdWVzdEJvZHkiLGEpJiZpKCJvYmplY3QiLGEpKSksSm09aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBKaHx8cyhhKSYmbygicmVzcG9uc2UiLGEpJiZpKCJvYmplY3QiLGEpKSksSG09aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBIaHx8cyhhKSYmbygicmVzcG9uc2VzIixhKSYmaSgib2JqZWN0IixhKSkpLEttPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgTmZ8fHMoYSkmJm8oInNjaGVtYSIsYSkmJmkoIm9iamVjdCIsYSkpKSxpc0Jvb2xlYW5Kc29uU2NoZW1hRWxlbWVudD1zPT5qdShzKSYmcy5jbGFzc2VzLmluY2x1ZGVzKCJib29sZWFuLWpzb24tc2NoZW1hIiksR209aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBSZnx8cyhhKSYmbygic2VjdXJpdHlSZXF1aXJlbWVudCIsYSkmJmkoIm9iamVjdCIsYSkpKSxZbT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIERmfHxzKGEpJiZvKCJzZWN1cml0eVNjaGVtZSIsYSkmJmkoIm9iamVjdCIsYSkpKSxYbT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIEZmfHxzKGEpJiZvKCJzZXJ2ZXIiLGEpJiZpKCJvYmplY3QiLGEpKSksUW09aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBWZnx8cyhhKSYmbygic2VydmVyVmFyaWFibGUiLGEpJiZpKCJvYmplY3QiLGEpKSksWm09aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiB2aHx8cyhhKSYmbygibWVkaWFUeXBlIixhKSYmaSgib2JqZWN0IixhKSkpLGVnPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aSxoYXNDbGFzczphfSk9PnU9PnUgaW5zdGFuY2VvZiBFbXx8cyh1KSYmbygiYXJyYXkiLHUpJiZpKCJhcnJheSIsdSkmJmEoInNlcnZlcnMiLHUpKSkscmc9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBYcHx8cyhhKSYmbygiZGlzY3JpbWluYXRvciIsYSkmJmkoIm9iamVjdCIsYSkpKTtjbGFzcyBTY2hlbWFWaXNpdG9yIGV4dGVuZHMoTWl4aW4oQ20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmFsdGVybmF0b3I9W3twcmVkaWNhdGU6aXNSZWZlcmVuY2VMaWtlRWxlbWVudCxzcGVjUGF0aDpbImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlZmVyZW5jZSJdfSx7cHJlZGljYXRlOmVzX1Qsc3BlY1BhdGg6WyJkb2N1bWVudCIsIm9iamVjdHMiLCJTY2hlbWEiXX1dfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz1DbS5wcm90b3R5cGUuZW50ZXIuY2FsbCh0aGlzLHMpO3JldHVybiB6bSh0aGlzLmVsZW1lbnQpJiZ0aGlzLmVsZW1lbnQuc2V0TWV0YVByb3BlcnR5KCJyZWZlcmVuY2VkLWVsZW1lbnQiLCJzY2hlbWEiKSxvfX1jb25zdCBuZz1TY2hlbWFWaXNpdG9yO2NsYXNzIEV4YW1wbGVzVmlzaXRvciBleHRlbmRzKE1peGluKHltLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB2dS5TaCx0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJleGFtcGxlcyIpLHRoaXMuc3BlY1BhdGg9cz0+aXNSZWZlcmVuY2VMaWtlRWxlbWVudChzKT9bImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiRXhhbXBsZSJdLHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPSEwfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz15bS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyk7cmV0dXJuIHRoaXMuZWxlbWVudC5maWx0ZXIoem0pLmZvckVhY2goKHM9PntzLnNldE1ldGFQcm9wZXJ0eSgicmVmZXJlbmNlZC1lbGVtZW50IiwiZXhhbXBsZSIpfSkpLG99fWNvbnN0IHNnPUV4YW1wbGVzVmlzaXRvcjtjbGFzcyBNZWRpYVR5cGVFeGFtcGxlcyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9Im1lZGlhLXR5cGUtZXhhbXBsZXMiO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goTWVkaWFUeXBlRXhhbXBsZXMucHJpbWFyeUNsYXNzKSx0aGlzLmNsYXNzZXMucHVzaCgiZXhhbXBsZXMiKX19Y29uc3Qgb2c9TWVkaWFUeXBlRXhhbXBsZXM7Y29uc3QgbGc9Y2xhc3MgRXhhbXBsZXNWaXNpdG9yX0V4YW1wbGVzVmlzaXRvciBleHRlbmRzIHNne2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgb2d9fTtjbGFzcyBNZWRpYVR5cGVFbmNvZGluZyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9Im1lZGlhLXR5cGUtZW5jb2RpbmciO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goTWVkaWFUeXBlRW5jb2RpbmcucHJpbWFyeUNsYXNzKX19Y29uc3QgcGc9TWVkaWFUeXBlRW5jb2Rpbmc7Y2xhc3MgRW5jb2RpbmdWaXNpdG9yIGV4dGVuZHMoTWl4aW4oeW0sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHBnLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJFbmNvZGluZyJdKX19Y29uc3QgZmc9RW5jb2RpbmdWaXNpdG9yO2NsYXNzIFNlY3VyaXR5UmVxdWlyZW1lbnRWaXNpdG9yIGV4dGVuZHMoTWl4aW4oeW0sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IFJmLHRoaXMuc3BlY1BhdGg9bGMoWyJ2YWx1ZSJdKX19Y29uc3QgbWc9U2VjdXJpdHlSZXF1aXJlbWVudFZpc2l0b3I7Y2xhc3MgU2VjdXJpdHkgZXh0ZW5kcyB2dS53RXtzdGF0aWMgcHJpbWFyeUNsYXNzPSJzZWN1cml0eSI7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmNsYXNzZXMucHVzaChTZWN1cml0eS5wcmltYXJ5Q2xhc3MpfX1jb25zdCBnZz1TZWN1cml0eTtjbGFzcyBTZWN1cml0eVZpc2l0b3IgZXh0ZW5kcyhNaXhpbihYZixHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgZ2d9QXJyYXlFbGVtZW50KHMpe3JldHVybiBzLmZvckVhY2goKHM9PntpZihQdShzKSl7Y29uc3Qgbz10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChbImRvY3VtZW50Iiwib2JqZWN0cyIsIlNlY3VyaXR5UmVxdWlyZW1lbnQiXSxzKTt0aGlzLmVsZW1lbnQucHVzaChvKX1lbHNlIHRoaXMuZWxlbWVudC5wdXNoKGNsb25lRGVlcChzKSl9KSksdGhpcy5jb3B5TWV0YUFuZEF0dHJpYnV0ZXMocyx0aGlzLmVsZW1lbnQpLEZ1fX1jb25zdCB5Zz1TZWN1cml0eVZpc2l0b3I7Y2xhc3MgQ29tcG9uZW50c1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihvbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgR3AsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIkNvbXBvbmVudHMiXSksdGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnM9ITB9fWNvbnN0IF9nPUNvbXBvbmVudHNWaXNpdG9yO2NsYXNzIFRhZ1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihvbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgV2YsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIlRhZyJdKSx0aGlzLmNhblN1cHBvcnRTcGVjaWZpY2F0aW9uRXh0ZW5zaW9ucz0hMH19Y29uc3QgeGc9VGFnVmlzaXRvcjtjbGFzcyBSZWZlcmVuY2VWaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IExoLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZWZlcmVuY2UiXSksdGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnM9ITF9T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPW9tLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKTtyZXR1cm4gT3UodGhpcy5lbGVtZW50LiRyZWYpJiZ0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJyZWZlcmVuY2UtZWxlbWVudCIpLG99fWNvbnN0IGtnPVJlZmVyZW5jZVZpc2l0b3I7Y29uc3QgcWc9Y2xhc3MgJFJlZlZpc2l0b3JfJFJlZlZpc2l0b3IgZXh0ZW5kcyBHZntTdHJpbmdFbGVtZW50KHMpe2NvbnN0IG89c3VwZXIuZW50ZXIocyk7cmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc2VzLnB1c2goInJlZmVyZW5jZS12YWx1ZSIpLG99fTtjbGFzcyBQYXJhbWV0ZXJWaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IEloLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJQYXJhbWV0ZXIiXSksdGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnM9ITB9T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPW9tLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKTtyZXR1cm4gUHUodGhpcy5lbGVtZW50LmNvbnRlbnRQcm9wKSYmdGhpcy5lbGVtZW50LmNvbnRlbnRQcm9wLmZpbHRlcihabSkuZm9yRWFjaCgoKHMsbyk9PntzLnNldE1ldGFQcm9wZXJ0eSgibWVkaWEtdHlwZSIsc2VyaWFsaXplcnNfdmFsdWUobykpfSkpLG99fWNvbnN0IFVnPVBhcmFtZXRlclZpc2l0b3I7Y2xhc3MgU2NoZW1hVmlzaXRvcl9TY2hlbWFWaXNpdG9yIGV4dGVuZHMoTWl4aW4oQ20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmFsdGVybmF0b3I9W3twcmVkaWNhdGU6aXNSZWZlcmVuY2VMaWtlRWxlbWVudCxzcGVjUGF0aDpbImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlZmVyZW5jZSJdfSx7cHJlZGljYXRlOmVzX1Qsc3BlY1BhdGg6WyJkb2N1bWVudCIsIm9iamVjdHMiLCJTY2hlbWEiXX1dfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz1DbS5wcm90b3R5cGUuZW50ZXIuY2FsbCh0aGlzLHMpO3JldHVybiB6bSh0aGlzLmVsZW1lbnQpJiZ0aGlzLmVsZW1lbnQuc2V0TWV0YVByb3BlcnR5KCJyZWZlcmVuY2VkLWVsZW1lbnQiLCJzY2hlbWEiKSxvfX1jb25zdCBWZz1TY2hlbWFWaXNpdG9yX1NjaGVtYVZpc2l0b3I7Y2xhc3MgSGVhZGVyVmlzaXRvciBleHRlbmRzKE1peGluKG9tLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyByaCx0aGlzLnNwZWNQYXRoPWxjKFsiZG9jdW1lbnQiLCJvYmplY3RzIiwiSGVhZGVyIl0pLHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPSEwfX1jb25zdCB6Zz1IZWFkZXJWaXNpdG9yO2NsYXNzIGhlYWRlcl9TY2hlbWFWaXNpdG9yX1NjaGVtYVZpc2l0b3IgZXh0ZW5kcyhNaXhpbihDbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuYWx0ZXJuYXRvcj1be3ByZWRpY2F0ZTppc1JlZmVyZW5jZUxpa2VFbGVtZW50LHNwZWNQYXRoOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiUmVmZXJlbmNlIl19LHtwcmVkaWNhdGU6ZXNfVCxzcGVjUGF0aDpbImRvY3VtZW50Iiwib2JqZWN0cyIsIlNjaGVtYSJdfV19T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPUNtLnByb3RvdHlwZS5lbnRlci5jYWxsKHRoaXMscyk7cmV0dXJuIHptKHRoaXMuZWxlbWVudCkmJnRoaXMuZWxlbWVudC5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInNjaGVtYSIpLG99fWNvbnN0IFdnPWhlYWRlcl9TY2hlbWFWaXNpdG9yX1NjaGVtYVZpc2l0b3I7Y2xhc3MgSGVhZGVyRXhhbXBsZXMgZXh0ZW5kcyB2dS5TaHtzdGF0aWMgcHJpbWFyeUNsYXNzPSJoZWFkZXItZXhhbXBsZXMiO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goSGVhZGVyRXhhbXBsZXMucHJpbWFyeUNsYXNzKSx0aGlzLmNsYXNzZXMucHVzaCgiZXhhbXBsZXMiKX19Y29uc3QgS2c9SGVhZGVyRXhhbXBsZXM7Y29uc3QgWWc9Y2xhc3MgaGVhZGVyX0V4YW1wbGVzVmlzaXRvcl9FeGFtcGxlc1Zpc2l0b3IgZXh0ZW5kcyBzZ3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IEtnfX07Y2xhc3MgQ29udGVudFZpc2l0b3IgZXh0ZW5kcyhNaXhpbih5bSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgdnUuU2gsdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgiY29udGVudCIpLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJNZWRpYVR5cGUiXSl9fWNvbnN0IFhnPUNvbnRlbnRWaXNpdG9yO2NsYXNzIEhlYWRlckNvbnRlbnQgZXh0ZW5kcyB2dS5TaHtzdGF0aWMgcHJpbWFyeUNsYXNzPSJoZWFkZXItY29udGVudCI7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmNsYXNzZXMucHVzaChIZWFkZXJDb250ZW50LnByaW1hcnlDbGFzcyksdGhpcy5jbGFzc2VzLnB1c2goImNvbnRlbnQiKX19Y29uc3QgWmc9SGVhZGVyQ29udGVudDtjb25zdCBleT1jbGFzcyBDb250ZW50VmlzaXRvcl9Db250ZW50VmlzaXRvciBleHRlbmRzIFhne2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgWmd9fTtjbGFzcyBzY2hlbWFfU2NoZW1hVmlzaXRvciBleHRlbmRzKE1peGluKG9tLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBOZix0aGlzLnNwZWNQYXRoPWxjKFsiZG9jdW1lbnQiLCJvYmplY3RzIiwiU2NoZW1hIl0pLHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPSEwfX1jb25zdCB0eT1zY2hlbWFfU2NoZW1hVmlzaXRvcixyeT1DZi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkpTT05TY2hlbWEuZml4ZWRGaWVsZHMuYWxsT2Y7Y29uc3Qgbnk9Y2xhc3MgQWxsT2ZWaXNpdG9yX0FsbE9mVmlzaXRvciBleHRlbmRzIHJ5e0FycmF5RWxlbWVudChzKXtjb25zdCBvPXJ5LnByb3RvdHlwZS5BcnJheUVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiB0aGlzLmVsZW1lbnQuZmlsdGVyKHptKS5mb3JFYWNoKChzPT57cy5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInNjaGVtYSIpfSkpLG99fSxzeT1DZi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkpTT05TY2hlbWEuZml4ZWRGaWVsZHMuYW55T2Y7Y29uc3Qgb3k9Y2xhc3MgQW55T2ZWaXNpdG9yX0FueU9mVmlzaXRvciBleHRlbmRzIHN5e0FycmF5RWxlbWVudChzKXtjb25zdCBvPXN5LnByb3RvdHlwZS5BcnJheUVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiB0aGlzLmVsZW1lbnQuZmlsdGVyKHptKS5mb3JFYWNoKChzPT57cy5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInNjaGVtYSIpfSkpLG99fSxpeT1DZi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkpTT05TY2hlbWEuZml4ZWRGaWVsZHMub25lT2Y7Y29uc3QgYXk9Y2xhc3MgT25lT2ZWaXNpdG9yX09uZU9mVmlzaXRvciBleHRlbmRzIGl5e0FycmF5RWxlbWVudChzKXtjb25zdCBvPWl5LnByb3RvdHlwZS5BcnJheUVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiB0aGlzLmVsZW1lbnQuZmlsdGVyKHptKS5mb3JFYWNoKChzPT57cy5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInNjaGVtYSIpfSkpLG99fSxjeT1DZi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkpTT05TY2hlbWEuZml4ZWRGaWVsZHMuaXRlbXM7Y29uc3QgbHk9Y2xhc3MgSXRlbXNWaXNpdG9yX0l0ZW1zVmlzaXRvciBleHRlbmRzIGN5e09iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz1jeS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyk7cmV0dXJuIHptKHRoaXMuZWxlbWVudCkmJnRoaXMuZWxlbWVudC5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInNjaGVtYSIpLG99QXJyYXlFbGVtZW50KHMpe3JldHVybiB0aGlzLmVudGVyKHMpfX0sdXk9Q2YudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5KU09OU2NoZW1hLmZpeGVkRmllbGRzLnByb3BlcnRpZXM7Y29uc3QgcHk9Y2xhc3MgUHJvcGVydGllc1Zpc2l0b3JfUHJvcGVydGllc1Zpc2l0b3IgZXh0ZW5kcyB1eXtPYmplY3RFbGVtZW50KHMpe2NvbnN0IG89dXkucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiB0aGlzLmVsZW1lbnQuZmlsdGVyKHptKS5mb3JFYWNoKChzPT57cy5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInNjaGVtYSIpfSkpLG99fSxoeT1DZi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkpTT05TY2hlbWEuZml4ZWRGaWVsZHMudHlwZTtjb25zdCBkeT1jbGFzcyBUeXBlVmlzaXRvcl9UeXBlVmlzaXRvciBleHRlbmRzIGh5e0FycmF5RWxlbWVudChzKXtyZXR1cm4gdGhpcy5lbnRlcihzKX19LGZ5PUNmLnZpc2l0b3JzLkpTT05TY2hlbWFPckpTT05SZWZlcmVuY2VWaXNpdG9yO2NvbnN0IG15PWNsYXNzIFNjaGVtYU9yUmVmZXJlbmNlVmlzaXRvcl9TY2hlbWFPclJlZmVyZW5jZVZpc2l0b3IgZXh0ZW5kcyBmeXtPYmplY3RFbGVtZW50KHMpe2NvbnN0IG89ZnkucHJvdG90eXBlLmVudGVyLmNhbGwodGhpcyxzKTtyZXR1cm4gem0odGhpcy5lbGVtZW50KSYmdGhpcy5lbGVtZW50LnNldE1ldGFQcm9wZXJ0eSgicmVmZXJlbmNlZC1lbGVtZW50Iiwic2NoZW1hIiksb319O2NsYXNzIERpc2NyaW1pbmF0b3JWaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IFhwLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJEaXNjcmltaW5hdG9yIl0pLHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPSExfX1jb25zdCBneT1EaXNjcmltaW5hdG9yVmlzaXRvcjtjbGFzcyBEaXNjcmltaW5hdG9yTWFwcGluZyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9ImRpc2NyaW1pbmF0b3ItbWFwcGluZyI7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmNsYXNzZXMucHVzaChEaXNjcmltaW5hdG9yTWFwcGluZy5wcmltYXJ5Q2xhc3MpfX1jb25zdCB5eT1EaXNjcmltaW5hdG9yTWFwcGluZztjbGFzcyBNYXBwaW5nVmlzaXRvciBleHRlbmRzKE1peGluKHltLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB5eSx0aGlzLnNwZWNQYXRoPWxjKFsidmFsdWUiXSl9fWNvbnN0IHZ5PU1hcHBpbmdWaXNpdG9yO2NsYXNzIFhtbFZpc2l0b3IgZXh0ZW5kcyhNaXhpbihvbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgSmYsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIlhNTCJdKSx0aGlzLmNhblN1cHBvcnRTcGVjaWZpY2F0aW9uRXh0ZW5zaW9ucz0hMH19Y29uc3QgYnk9WG1sVmlzaXRvcjtjbGFzcyBQYXJhbWV0ZXJFeGFtcGxlcyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9InBhcmFtZXRlci1leGFtcGxlcyI7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmNsYXNzZXMucHVzaChQYXJhbWV0ZXJFeGFtcGxlcy5wcmltYXJ5Q2xhc3MpLHRoaXMuY2xhc3Nlcy5wdXNoKCJleGFtcGxlcyIpfX1jb25zdCBTeT1QYXJhbWV0ZXJFeGFtcGxlcztjb25zdCBfeT1jbGFzcyBwYXJhbWV0ZXJfRXhhbXBsZXNWaXNpdG9yX0V4YW1wbGVzVmlzaXRvciBleHRlbmRzIHNne2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgU3l9fTtjbGFzcyBQYXJhbWV0ZXJDb250ZW50IGV4dGVuZHMgdnUuU2h7c3RhdGljIHByaW1hcnlDbGFzcz0icGFyYW1ldGVyLWNvbnRlbnQiO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goUGFyYW1ldGVyQ29udGVudC5wcmltYXJ5Q2xhc3MpLHRoaXMuY2xhc3Nlcy5wdXNoKCJjb250ZW50Iil9fWNvbnN0IEV5PVBhcmFtZXRlckNvbnRlbnQ7Y29uc3Qgd3k9Y2xhc3MgcGFyYW1ldGVyX0NvbnRlbnRWaXNpdG9yX0NvbnRlbnRWaXNpdG9yIGV4dGVuZHMgWGd7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBFeX19O2NsYXNzIENvbXBvbmVudHNTY2hlbWFzIGV4dGVuZHMgdnUuU2h7c3RhdGljIHByaW1hcnlDbGFzcz0iY29tcG9uZW50cy1zY2hlbWFzIjtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKENvbXBvbmVudHNTY2hlbWFzLnByaW1hcnlDbGFzcyl9fWNvbnN0IHh5PUNvbXBvbmVudHNTY2hlbWFzO2NsYXNzIFNjaGVtYXNWaXNpdG9yIGV4dGVuZHMoTWl4aW4oeW0sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHh5LHRoaXMuc3BlY1BhdGg9cz0+aXNSZWZlcmVuY2VMaWtlRWxlbWVudChzKT9bImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiU2NoZW1hIl19T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPXltLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbHRlcih6bSkuZm9yRWFjaCgocz0+e3Muc2V0TWV0YVByb3BlcnR5KCJyZWZlcmVuY2VkLWVsZW1lbnQiLCJzY2hlbWEiKX0pKSxvfX1jb25zdCBreT1TY2hlbWFzVmlzaXRvcjtjbGFzcyBDb21wb25lbnRzUmVzcG9uc2VzIGV4dGVuZHMgdnUuU2h7c3RhdGljIHByaW1hcnlDbGFzcz0iY29tcG9uZW50cy1yZXNwb25zZXMiO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goQ29tcG9uZW50c1Jlc3BvbnNlcy5wcmltYXJ5Q2xhc3MpfX1jb25zdCBPeT1Db21wb25lbnRzUmVzcG9uc2VzO2NsYXNzIFJlc3BvbnNlc1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbih5bSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgT3ksdGhpcy5zcGVjUGF0aD1zPT5pc1JlZmVyZW5jZUxpa2VFbGVtZW50KHMpP1siZG9jdW1lbnQiLCJvYmplY3RzIiwiUmVmZXJlbmNlIl06WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZXNwb25zZSJdfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz15bS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyk7cmV0dXJuIHRoaXMuZWxlbWVudC5maWx0ZXIoem0pLmZvckVhY2goKHM9PntzLnNldE1ldGFQcm9wZXJ0eSgicmVmZXJlbmNlZC1lbGVtZW50IiwicmVzcG9uc2UiKX0pKSx0aGlzLmVsZW1lbnQuZmlsdGVyKEptKS5mb3JFYWNoKCgocyxvKT0+e3Muc2V0TWV0YVByb3BlcnR5KCJodHRwLXN0YXR1cy1jb2RlIixzZXJpYWxpemVyc192YWx1ZShvKSl9KSksb319Y29uc3QgQXk9UmVzcG9uc2VzVmlzaXRvcjtjbGFzcyBDb21wb25lbnRzUGFyYW1ldGVycyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9ImNvbXBvbmVudHMtcGFyYW1ldGVycyI7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmNsYXNzZXMucHVzaChDb21wb25lbnRzUGFyYW1ldGVycy5wcmltYXJ5Q2xhc3MpLHRoaXMuY2xhc3Nlcy5wdXNoKCJwYXJhbWV0ZXJzIil9fWNvbnN0IEN5PUNvbXBvbmVudHNQYXJhbWV0ZXJzO2NsYXNzIFBhcmFtZXRlcnNWaXNpdG9yX1BhcmFtZXRlcnNWaXNpdG9yIGV4dGVuZHMoTWl4aW4oeW0sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IEN5LHRoaXMuc3BlY1BhdGg9cz0+aXNSZWZlcmVuY2VMaWtlRWxlbWVudChzKT9bImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiUGFyYW1ldGVyIl19T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPXltLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbHRlcih6bSkuZm9yRWFjaCgocz0+e3Muc2V0TWV0YVByb3BlcnR5KCJyZWZlcmVuY2VkLWVsZW1lbnQiLCJwYXJhbWV0ZXIiKX0pKSxvfX1jb25zdCBqeT1QYXJhbWV0ZXJzVmlzaXRvcl9QYXJhbWV0ZXJzVmlzaXRvcjtjbGFzcyBDb21wb25lbnRzRXhhbXBsZXMgZXh0ZW5kcyB2dS5TaHtzdGF0aWMgcHJpbWFyeUNsYXNzPSJjb21wb25lbnRzLWV4YW1wbGVzIjtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKENvbXBvbmVudHNFeGFtcGxlcy5wcmltYXJ5Q2xhc3MpLHRoaXMuY2xhc3Nlcy5wdXNoKCJleGFtcGxlcyIpfX1jb25zdCBQeT1Db21wb25lbnRzRXhhbXBsZXM7Y2xhc3MgY29tcG9uZW50c19FeGFtcGxlc1Zpc2l0b3JfRXhhbXBsZXNWaXNpdG9yIGV4dGVuZHMoTWl4aW4oeW0sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IFB5LHRoaXMuc3BlY1BhdGg9cz0+aXNSZWZlcmVuY2VMaWtlRWxlbWVudChzKT9bImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiRXhhbXBsZSJdfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz15bS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyk7cmV0dXJuIHRoaXMuZWxlbWVudC5maWx0ZXIoem0pLmZvckVhY2goKHM9PntzLnNldE1ldGFQcm9wZXJ0eSgicmVmZXJlbmNlZC1lbGVtZW50IiwiZXhhbXBsZSIpfSkpLG99fWNvbnN0IEl5PWNvbXBvbmVudHNfRXhhbXBsZXNWaXNpdG9yX0V4YW1wbGVzVmlzaXRvcjtjbGFzcyBDb21wb25lbnRzUmVxdWVzdEJvZGllcyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9ImNvbXBvbmVudHMtcmVxdWVzdC1ib2RpZXMiO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goQ29tcG9uZW50c1JlcXVlc3RCb2RpZXMucHJpbWFyeUNsYXNzKX19Y29uc3QgVHk9Q29tcG9uZW50c1JlcXVlc3RCb2RpZXM7Y2xhc3MgUmVxdWVzdEJvZGllc1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbih5bSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgVHksdGhpcy5zcGVjUGF0aD1zPT5pc1JlZmVyZW5jZUxpa2VFbGVtZW50KHMpP1siZG9jdW1lbnQiLCJvYmplY3RzIiwiUmVmZXJlbmNlIl06WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZXF1ZXN0Qm9keSJdfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz15bS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyk7cmV0dXJuIHRoaXMuZWxlbWVudC5maWx0ZXIoem0pLmZvckVhY2goKHM9PntzLnNldE1ldGFQcm9wZXJ0eSgicmVmZXJlbmNlZC1lbGVtZW50IiwicmVxdWVzdEJvZHkiKX0pKSxvfX1jb25zdCBOeT1SZXF1ZXN0Qm9kaWVzVmlzaXRvcjtjbGFzcyBDb21wb25lbnRzSGVhZGVycyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9ImNvbXBvbmVudHMtaGVhZGVycyI7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmNsYXNzZXMucHVzaChDb21wb25lbnRzSGVhZGVycy5wcmltYXJ5Q2xhc3MpfX1jb25zdCBNeT1Db21wb25lbnRzSGVhZGVycztjbGFzcyBIZWFkZXJzVmlzaXRvciBleHRlbmRzKE1peGluKHltLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBNeSx0aGlzLnNwZWNQYXRoPXM9PmlzUmVmZXJlbmNlTGlrZUVsZW1lbnQocyk/WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZWZlcmVuY2UiXTpbImRvY3VtZW50Iiwib2JqZWN0cyIsIkhlYWRlciJdfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz15bS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyk7cmV0dXJuIHRoaXMuZWxlbWVudC5maWx0ZXIoem0pLmZvckVhY2goKHM9PntzLnNldE1ldGFQcm9wZXJ0eSgicmVmZXJlbmNlZC1lbGVtZW50IiwiaGVhZGVyIil9KSksdGhpcy5lbGVtZW50LmZpbHRlcihNbSkuZm9yRWFjaCgoKHMsbyk9PntzLnNldE1ldGFQcm9wZXJ0eSgiaGVhZGVyLW5hbWUiLHNlcmlhbGl6ZXJzX3ZhbHVlKG8pKX0pKSxvfX1jb25zdCBSeT1IZWFkZXJzVmlzaXRvcjtjbGFzcyBDb21wb25lbnRzU2VjdXJpdHlTY2hlbWVzIGV4dGVuZHMgdnUuU2h7c3RhdGljIHByaW1hcnlDbGFzcz0iY29tcG9uZW50cy1zZWN1cml0eS1zY2hlbWVzIjtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKENvbXBvbmVudHNTZWN1cml0eVNjaGVtZXMucHJpbWFyeUNsYXNzKX19Y29uc3QgRHk9Q29tcG9uZW50c1NlY3VyaXR5U2NoZW1lcztjbGFzcyBTZWN1cml0eVNjaGVtZXNWaXNpdG9yIGV4dGVuZHMoTWl4aW4oeW0sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IER5LHRoaXMuc3BlY1BhdGg9cz0+aXNSZWZlcmVuY2VMaWtlRWxlbWVudChzKT9bImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiU2VjdXJpdHlTY2hlbWUiXX1PYmplY3RFbGVtZW50KHMpe2NvbnN0IG89eW0ucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiB0aGlzLmVsZW1lbnQuZmlsdGVyKHptKS5mb3JFYWNoKChzPT57cy5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInNlY3VyaXR5U2NoZW1lIil9KSksb319Y29uc3QgTHk9U2VjdXJpdHlTY2hlbWVzVmlzaXRvcjtjbGFzcyBDb21wb25lbnRzTGlua3MgZXh0ZW5kcyB2dS5TaHtzdGF0aWMgcHJpbWFyeUNsYXNzPSJjb21wb25lbnRzLWxpbmtzIjtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKENvbXBvbmVudHNMaW5rcy5wcmltYXJ5Q2xhc3MpfX1jb25zdCBGeT1Db21wb25lbnRzTGlua3M7Y2xhc3MgTGlua3NWaXNpdG9yX0xpbmtzVmlzaXRvciBleHRlbmRzKE1peGluKHltLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBGeSx0aGlzLnNwZWNQYXRoPXM9PmlzUmVmZXJlbmNlTGlrZUVsZW1lbnQocyk/WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZWZlcmVuY2UiXTpbImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmsiXX1PYmplY3RFbGVtZW50KHMpe2NvbnN0IG89eW0ucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiB0aGlzLmVsZW1lbnQuZmlsdGVyKHptKS5mb3JFYWNoKChzPT57cy5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsImxpbmsiKX0pKSxvfX1jb25zdCBCeT1MaW5rc1Zpc2l0b3JfTGlua3NWaXNpdG9yO2NsYXNzIENvbXBvbmVudHNDYWxsYmFja3MgZXh0ZW5kcyB2dS5TaHtzdGF0aWMgcHJpbWFyeUNsYXNzPSJjb21wb25lbnRzLWNhbGxiYWNrcyI7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmNsYXNzZXMucHVzaChDb21wb25lbnRzQ2FsbGJhY2tzLnByaW1hcnlDbGFzcyl9fWNvbnN0ICR5PUNvbXBvbmVudHNDYWxsYmFja3M7Y2xhc3MgQ2FsbGJhY2tzVmlzaXRvciBleHRlbmRzKE1peGluKHltLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyAkeSx0aGlzLnNwZWNQYXRoPXM9PmlzUmVmZXJlbmNlTGlrZUVsZW1lbnQocyk/WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZWZlcmVuY2UiXTpbImRvY3VtZW50Iiwib2JqZWN0cyIsIkNhbGxiYWNrIl19T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPXltLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbHRlcih6bSkuZm9yRWFjaCgocz0+e3Muc2V0TWV0YVByb3BlcnR5KCJyZWZlcmVuY2VkLWVsZW1lbnQiLCJjYWxsYmFjayIpfSkpLG99fWNvbnN0IHF5PUNhbGxiYWNrc1Zpc2l0b3I7Y2xhc3MgRXhhbXBsZVZpc2l0b3IgZXh0ZW5kcyhNaXhpbihvbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgWnAsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIkV4YW1wbGUiXSksdGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnM9ITB9T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPW9tLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKTtyZXR1cm4gT3UodGhpcy5lbGVtZW50LmV4dGVybmFsVmFsdWUpJiZ0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJyZWZlcmVuY2UtZWxlbWVudCIpLG99fWNvbnN0IFV5PUV4YW1wbGVWaXNpdG9yO2NvbnN0IFZ5PWNsYXNzIEV4dGVybmFsVmFsdWVWaXNpdG9yIGV4dGVuZHMgR2Z7U3RyaW5nRWxlbWVudChzKXtjb25zdCBvPXN1cGVyLmVudGVyKHMpO3JldHVybiB0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJyZWZlcmVuY2UtdmFsdWUiKSxvfX07Y2xhc3MgRXh0ZXJuYWxEb2N1bWVudGF0aW9uVmlzaXRvciBleHRlbmRzKE1peGluKG9tLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB0aCx0aGlzLnNwZWNQYXRoPWxjKFsiZG9jdW1lbnQiLCJvYmplY3RzIiwiRXh0ZXJuYWxEb2N1bWVudGF0aW9uIl0pLHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPSEwfX1jb25zdCB6eT1FeHRlcm5hbERvY3VtZW50YXRpb25WaXNpdG9yO2NsYXNzIGVuY29kaW5nX0VuY29kaW5nVmlzaXRvciBleHRlbmRzKE1peGluKG9tLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBRcCx0aGlzLnNwZWNQYXRoPWxjKFsiZG9jdW1lbnQiLCJvYmplY3RzIiwiRW5jb2RpbmciXSksdGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnM9ITB9T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPW9tLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKTtyZXR1cm4gUHUodGhpcy5lbGVtZW50LmhlYWRlcnMpJiZ0aGlzLmVsZW1lbnQuaGVhZGVycy5maWx0ZXIoTW0pLmZvckVhY2goKChzLG8pPT57cy5zZXRNZXRhUHJvcGVydHkoImhlYWRlci1uYW1lIixzZXJpYWxpemVyc192YWx1ZShvKSl9KSksb319Y29uc3QgV3k9ZW5jb2RpbmdfRW5jb2RpbmdWaXNpdG9yO2NsYXNzIEVuY29kaW5nSGVhZGVycyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9ImVuY29kaW5nLWhlYWRlcnMiO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goRW5jb2RpbmdIZWFkZXJzLnByaW1hcnlDbGFzcyl9fWNvbnN0IEp5PUVuY29kaW5nSGVhZGVycztjbGFzcyBIZWFkZXJzVmlzaXRvcl9IZWFkZXJzVmlzaXRvciBleHRlbmRzKE1peGluKHltLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBKeSx0aGlzLnNwZWNQYXRoPXM9PmlzUmVmZXJlbmNlTGlrZUVsZW1lbnQocyk/WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZWZlcmVuY2UiXTpbImRvY3VtZW50Iiwib2JqZWN0cyIsIkhlYWRlciJdfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz15bS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyk7cmV0dXJuIHRoaXMuZWxlbWVudC5maWx0ZXIoem0pLmZvckVhY2goKHM9PntzLnNldE1ldGFQcm9wZXJ0eSgicmVmZXJlbmNlZC1lbGVtZW50IiwiaGVhZGVyIil9KSksdGhpcy5lbGVtZW50LmZvckVhY2goKChzLG8pPT57aWYoIU1tKHMpKXJldHVybjtjb25zdCBpPXNlcmlhbGl6ZXJzX3ZhbHVlKG8pO3Muc2V0TWV0YVByb3BlcnR5KCJoZWFkZXJOYW1lIixpKX0pKSxvfX1jb25zdCBIeT1IZWFkZXJzVmlzaXRvcl9IZWFkZXJzVmlzaXRvcjtjbGFzcyBQYXRoc1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihnbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgRGgsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIlBhdGhJdGVtIl0pLHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPSEwLHRoaXMuZmllbGRQYXR0ZXJuUHJlZGljYXRlPWVzX1R9T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPWdtLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbHRlcihVbSkuZm9yRWFjaCgoKHMsbyk9PntvLmNsYXNzZXMucHVzaCgib3BlbmFwaS1wYXRoLXRlbXBsYXRlIiksby5jbGFzc2VzLnB1c2goInBhdGgtdGVtcGxhdGUiKSxzLnNldE1ldGFQcm9wZXJ0eSgicGF0aCIsY2xvbmVEZWVwKG8pKX0pKSxvfX1jb25zdCBLeT1QYXRoc1Zpc2l0b3I7Y2xhc3MgUmVxdWVzdEJvZHlWaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IEZoLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZXF1ZXN0Qm9keSJdKX1PYmplY3RFbGVtZW50KHMpe2NvbnN0IG89b20ucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiBQdSh0aGlzLmVsZW1lbnQuY29udGVudFByb3ApJiZ0aGlzLmVsZW1lbnQuY29udGVudFByb3AuZmlsdGVyKFptKS5mb3JFYWNoKCgocyxvKT0+e3Muc2V0TWV0YVByb3BlcnR5KCJtZWRpYS10eXBlIixzZXJpYWxpemVyc192YWx1ZShvKSl9KSksb319Y29uc3QgR3k9UmVxdWVzdEJvZHlWaXNpdG9yO2NsYXNzIFJlcXVlc3RCb2R5Q29udGVudCBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9InJlcXVlc3QtYm9keS1jb250ZW50Ijtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKFJlcXVlc3RCb2R5Q29udGVudC5wcmltYXJ5Q2xhc3MpLHRoaXMuY2xhc3Nlcy5wdXNoKCJjb250ZW50Iil9fWNvbnN0IFl5PVJlcXVlc3RCb2R5Q29udGVudDtjb25zdCBYeT1jbGFzcyByZXF1ZXN0X2JvZHlfQ29udGVudFZpc2l0b3JfQ29udGVudFZpc2l0b3IgZXh0ZW5kcyBYZ3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IFl5fX07Y2xhc3MgQ2FsbGJhY2tWaXNpdG9yIGV4dGVuZHMoTWl4aW4oZ20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IEtwLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJQYXRoSXRlbSJdKSx0aGlzLmNhblN1cHBvcnRTcGVjaWZpY2F0aW9uRXh0ZW5zaW9ucz0hMCx0aGlzLmZpZWxkUGF0dGVyblByZWRpY2F0ZT1zPT4veyg/PGV4cHJlc3Npb24+W159XXsxLDIwODN9KX0vLnRlc3QoU3RyaW5nKHMpKX1PYmplY3RFbGVtZW50KHMpe2NvbnN0IG89eW0ucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiB0aGlzLmVsZW1lbnQuZmlsdGVyKFVtKS5mb3JFYWNoKCgocyxvKT0+e3Muc2V0TWV0YVByb3BlcnR5KCJydW50aW1lLWV4cHJlc3Npb24iLHNlcmlhbGl6ZXJzX3ZhbHVlKG8pKX0pKSxvfX1jb25zdCBReT1DYWxsYmFja1Zpc2l0b3I7Y2xhc3MgUmVzcG9uc2VWaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IEpoLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZXNwb25zZSJdKX1PYmplY3RFbGVtZW50KHMpe2NvbnN0IG89b20ucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiBQdSh0aGlzLmVsZW1lbnQuY29udGVudFByb3ApJiZ0aGlzLmVsZW1lbnQuY29udGVudFByb3AuZmlsdGVyKFptKS5mb3JFYWNoKCgocyxvKT0+e3Muc2V0TWV0YVByb3BlcnR5KCJtZWRpYS10eXBlIixzZXJpYWxpemVyc192YWx1ZShvKSl9KSksUHUodGhpcy5lbGVtZW50LmhlYWRlcnMpJiZ0aGlzLmVsZW1lbnQuaGVhZGVycy5maWx0ZXIoTW0pLmZvckVhY2goKChzLG8pPT57cy5zZXRNZXRhUHJvcGVydHkoImhlYWRlci1uYW1lIixzZXJpYWxpemVyc192YWx1ZShvKSl9KSksb319Y29uc3QgWnk9UmVzcG9uc2VWaXNpdG9yO2NsYXNzIFJlc3BvbnNlSGVhZGVycyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9InJlc3BvbnNlLWhlYWRlcnMiO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goUmVzcG9uc2VIZWFkZXJzLnByaW1hcnlDbGFzcyl9fWNvbnN0IGV2PVJlc3BvbnNlSGVhZGVycztjbGFzcyByZXNwb25zZV9IZWFkZXJzVmlzaXRvcl9IZWFkZXJzVmlzaXRvciBleHRlbmRzKE1peGluKHltLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBldix0aGlzLnNwZWNQYXRoPXM9PmlzUmVmZXJlbmNlTGlrZUVsZW1lbnQocyk/WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZWZlcmVuY2UiXTpbImRvY3VtZW50Iiwib2JqZWN0cyIsIkhlYWRlciJdfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz15bS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyk7cmV0dXJuIHRoaXMuZWxlbWVudC5maWx0ZXIoem0pLmZvckVhY2goKHM9PntzLnNldE1ldGFQcm9wZXJ0eSgicmVmZXJlbmNlZC1lbGVtZW50IiwiaGVhZGVyIil9KSksdGhpcy5lbGVtZW50LmZvckVhY2goKChzLG8pPT57aWYoIU1tKHMpKXJldHVybjtjb25zdCBpPXNlcmlhbGl6ZXJzX3ZhbHVlKG8pO3Muc2V0TWV0YVByb3BlcnR5KCJoZWFkZXItbmFtZSIsaSl9KSksb319Y29uc3QgdHY9cmVzcG9uc2VfSGVhZGVyc1Zpc2l0b3JfSGVhZGVyc1Zpc2l0b3I7Y2xhc3MgUmVzcG9uc2VDb250ZW50IGV4dGVuZHMgdnUuU2h7c3RhdGljIHByaW1hcnlDbGFzcz0icmVzcG9uc2UtY29udGVudCI7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmNsYXNzZXMucHVzaChSZXNwb25zZUNvbnRlbnQucHJpbWFyeUNsYXNzKSx0aGlzLmNsYXNzZXMucHVzaCgiY29udGVudCIpfX1jb25zdCBydj1SZXNwb25zZUNvbnRlbnQ7Y29uc3QgbnY9Y2xhc3MgcmVzcG9uc2VfQ29udGVudFZpc2l0b3JfQ29udGVudFZpc2l0b3IgZXh0ZW5kcyBYZ3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHJ2fX07Y2xhc3MgUmVzcG9uc2VMaW5rcyBleHRlbmRzIHZ1LlNoe3N0YXRpYyBwcmltYXJ5Q2xhc3M9InJlc3BvbnNlLWxpbmtzIjtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKFJlc3BvbnNlTGlua3MucHJpbWFyeUNsYXNzKX19Y29uc3Qgc3Y9UmVzcG9uc2VMaW5rcztjbGFzcyByZXNwb25zZV9MaW5rc1Zpc2l0b3JfTGlua3NWaXNpdG9yIGV4dGVuZHMoTWl4aW4oeW0sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHN2LHRoaXMuc3BlY1BhdGg9cz0+aXNSZWZlcmVuY2VMaWtlRWxlbWVudChzKT9bImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGluayJdfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz15bS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyk7cmV0dXJuIHRoaXMuZWxlbWVudC5maWx0ZXIoem0pLmZvckVhY2goKHM9PntzLnNldE1ldGFQcm9wZXJ0eSgicmVmZXJlbmNlZC1lbGVtZW50IiwibGluayIpfSkpLG99fWNvbnN0IG92PXJlc3BvbnNlX0xpbmtzVmlzaXRvcl9MaW5rc1Zpc2l0b3I7ZnVuY3Rpb24gX2lzTnVtYmVyKHMpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHMpfXZhciBpdj1fY3VycnkyKChmdW5jdGlvbiByYW5nZShzLG8pe2lmKCFfaXNOdW1iZXIocyl8fCFfaXNOdW1iZXIobykpdGhyb3cgbmV3IFR5cGVFcnJvcigiQm90aCBhcmd1bWVudHMgdG8gcmFuZ2UgbXVzdCBiZSBudW1iZXJzIik7Zm9yKHZhciBpPUFycmF5KHM8bz9vLXM6MCksYT1zPDA/bytNYXRoLmFicyhzKTpvLXMsdT0wO3U8YTspaVt1XT11K3MsdSs9MTtyZXR1cm4gaX0pKTtjb25zdCBhdj1pdjtmdW5jdGlvbiBoYXNPckFkZChzLG8saSl7dmFyIGEsdT10eXBlb2Ygcztzd2l0Y2godSl7Y2FzZSJzdHJpbmciOmNhc2UibnVtYmVyIjpyZXR1cm4gMD09PXMmJjEvcz09LTEvMD8hIWkuX2l0ZW1zWyItMCJdfHwobyYmKGkuX2l0ZW1zWyItMCJdPSEwKSwhMSk6bnVsbCE9PWkuX25hdGl2ZVNldD9vPyhhPWkuX25hdGl2ZVNldC5zaXplLGkuX25hdGl2ZVNldC5hZGQocyksaS5fbmF0aXZlU2V0LnNpemU9PT1hKTppLl9uYXRpdmVTZXQuaGFzKHMpOnUgaW4gaS5faXRlbXM/cyBpbiBpLl9pdGVtc1t1XXx8KG8mJihpLl9pdGVtc1t1XVtzXT0hMCksITEpOihvJiYoaS5faXRlbXNbdV09e30saS5faXRlbXNbdV1bc109ITApLCExKTtjYXNlImJvb2xlYW4iOmlmKHUgaW4gaS5faXRlbXMpe3ZhciBfPXM/MTowO3JldHVybiEhaS5faXRlbXNbdV1bX118fChvJiYoaS5faXRlbXNbdV1bX109ITApLCExKX1yZXR1cm4gbyYmKGkuX2l0ZW1zW3VdPXM/WyExLCEwXTpbITAsITFdKSwhMTtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gbnVsbCE9PWkuX25hdGl2ZVNldD9vPyhhPWkuX25hdGl2ZVNldC5zaXplLGkuX25hdGl2ZVNldC5hZGQocyksaS5fbmF0aXZlU2V0LnNpemU9PT1hKTppLl9uYXRpdmVTZXQuaGFzKHMpOnUgaW4gaS5faXRlbXM/ISFfaW5jbHVkZXMocyxpLl9pdGVtc1t1XSl8fChvJiZpLl9pdGVtc1t1XS5wdXNoKHMpLCExKToobyYmKGkuX2l0ZW1zW3VdPVtzXSksITEpO2Nhc2UidW5kZWZpbmVkIjpyZXR1cm4hIWkuX2l0ZW1zW3VdfHwobyYmKGkuX2l0ZW1zW3VdPSEwKSwhMSk7Y2FzZSJvYmplY3QiOmlmKG51bGw9PT1zKXJldHVybiEhaS5faXRlbXMubnVsbHx8KG8mJihpLl9pdGVtcy5udWxsPSEwKSwhMSk7ZGVmYXVsdDpyZXR1cm4odT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocykpaW4gaS5faXRlbXM/ISFfaW5jbHVkZXMocyxpLl9pdGVtc1t1XSl8fChvJiZpLl9pdGVtc1t1XS5wdXNoKHMpLCExKToobyYmKGkuX2l0ZW1zW3VdPVtzXSksITEpfX1jb25zdCBjdj1mdW5jdGlvbigpe2Z1bmN0aW9uIF9TZXQoKXt0aGlzLl9uYXRpdmVTZXQ9ImZ1bmN0aW9uIj09dHlwZW9mIFNldD9uZXcgU2V0Om51bGwsdGhpcy5faXRlbXM9e319cmV0dXJuIF9TZXQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihzKXtyZXR1cm4haGFzT3JBZGQocywhMCx0aGlzKX0sX1NldC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHMpe3JldHVybiBoYXNPckFkZChzLCExLHRoaXMpfSxfU2V0fSgpO3ZhciBsdj1fY3VycnkyKChmdW5jdGlvbiBkaWZmZXJlbmNlKHMsbyl7Zm9yKHZhciBpPVtdLGE9MCx1PXMubGVuZ3RoLF89by5sZW5ndGgsdz1uZXcgY3YseD0wO3g8Xzt4Kz0xKXcuYWRkKG9beF0pO2Zvcig7YTx1Oyl3LmFkZChzW2FdKSYmKGlbaS5sZW5ndGhdPXNbYV0pLGErPTE7cmV0dXJuIGl9KSk7Y29uc3QgdXY9bHY7Y2xhc3MgTWl4ZWRGaWVsZHNWaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sZ20pKXtzcGVjUGF0aEZpeGVkRmllbGRzO3NwZWNQYXRoUGF0dGVybmVkRmllbGRzO2NvbnN0cnVjdG9yKHtzcGVjUGF0aEZpeGVkRmllbGRzOnMsc3BlY1BhdGhQYXR0ZXJuZWRGaWVsZHM6bywuLi5pfSl7c3VwZXIoey4uLml9KSx0aGlzLnNwZWNQYXRoRml4ZWRGaWVsZHM9cyx0aGlzLnNwZWNQYXRoUGF0dGVybmVkRmllbGRzPW99T2JqZWN0RWxlbWVudChzKXtjb25zdHtzcGVjUGF0aDpvLGlnbm9yZWRGaWVsZHM6aX09dGhpczt0cnl7dGhpcy5zcGVjUGF0aD10aGlzLnNwZWNQYXRoRml4ZWRGaWVsZHM7Y29uc3Qgbz10aGlzLnJldHJpZXZlRml4ZWRGaWVsZHModGhpcy5zcGVjUGF0aChzKSk7dGhpcy5pZ25vcmVkRmllbGRzPVsuLi5pLC4uLnV2KHMua2V5cygpLG8pXSxvbS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyksdGhpcy5zcGVjUGF0aD10aGlzLnNwZWNQYXRoUGF0dGVybmVkRmllbGRzLHRoaXMuaWdub3JlZEZpZWxkcz1vLGdtLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKX1jYXRjaChzKXt0aHJvdyB0aGlzLnNwZWNQYXRoPW8sc31yZXR1cm4gRnV9fWNvbnN0IHB2PU1peGVkRmllbGRzVmlzaXRvcjtjbGFzcyByZXNwb25zZXNfUmVzcG9uc2VzVmlzaXRvciBleHRlbmRzKE1peGluKHB2LEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBIaCx0aGlzLnNwZWNQYXRoRml4ZWRGaWVsZHM9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZXNwb25zZXMiXSksdGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnM9ITAsdGhpcy5zcGVjUGF0aFBhdHRlcm5lZEZpZWxkcz1zPT5pc1JlZmVyZW5jZUxpa2VFbGVtZW50KHMpP1siZG9jdW1lbnQiLCJvYmplY3RzIiwiUmVmZXJlbmNlIl06WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZXNwb25zZSJdLHRoaXMuZmllbGRQYXR0ZXJuUHJlZGljYXRlPXM9Pm5ldyBSZWdFeHAoYF4oMVhYfDJYWHwzWFh8NFhYfDVYWHwke2F2KDEwMCw2MDApLmpvaW4oInwiKX0pJGApLnRlc3QoU3RyaW5nKHMpKX1PYmplY3RFbGVtZW50KHMpe2NvbnN0IG89cHYucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiB0aGlzLmVsZW1lbnQuZmlsdGVyKHptKS5mb3JFYWNoKChzPT57cy5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInJlc3BvbnNlIil9KSksdGhpcy5lbGVtZW50LmZpbHRlcihKbSkuZm9yRWFjaCgoKHMsbyk9Pntjb25zdCBpPWNsb25lRGVlcChvKTt0aGlzLmZpZWxkUGF0dGVyblByZWRpY2F0ZShzZXJpYWxpemVyc192YWx1ZShpKSkmJnMuc2V0TWV0YVByb3BlcnR5KCJodHRwLXN0YXR1cy1jb2RlIixpKX0pKSxvfX1jb25zdCBodj1yZXNwb25zZXNfUmVzcG9uc2VzVmlzaXRvcjtjbGFzcyBEZWZhdWx0VmlzaXRvciBleHRlbmRzKE1peGluKENtLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5hbHRlcm5hdG9yPVt7cHJlZGljYXRlOmlzUmVmZXJlbmNlTGlrZUVsZW1lbnQsc3BlY1BhdGg6WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZWZlcmVuY2UiXX0se3ByZWRpY2F0ZTplc19ULHNwZWNQYXRoOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiUmVzcG9uc2UiXX1dfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz1DbS5wcm90b3R5cGUuZW50ZXIuY2FsbCh0aGlzLHMpO3JldHVybiB6bSh0aGlzLmVsZW1lbnQpP3RoaXMuZWxlbWVudC5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInJlc3BvbnNlIik6Sm0odGhpcy5lbGVtZW50KSYmdGhpcy5lbGVtZW50LnNldE1ldGFQcm9wZXJ0eSgiaHR0cC1zdGF0dXMtY29kZSIsImRlZmF1bHQiKSxvfX1jb25zdCBkdj1EZWZhdWx0VmlzaXRvcjtjbGFzcyBPcGVyYXRpb25WaXNpdG9yIGV4dGVuZHMoTWl4aW4ob20sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IFBoLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJPcGVyYXRpb24iXSl9fWNvbnN0IGZ2PU9wZXJhdGlvblZpc2l0b3I7Y2xhc3MgT3BlcmF0aW9uVGFncyBleHRlbmRzIHZ1LndFe3N0YXRpYyBwcmltYXJ5Q2xhc3M9Im9wZXJhdGlvbi10YWdzIjtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKE9wZXJhdGlvblRhZ3MucHJpbWFyeUNsYXNzKX19Y29uc3QgbXY9T3BlcmF0aW9uVGFncztjb25zdCBndj1jbGFzcyBUYWdzVmlzaXRvciBleHRlbmRzIEdme2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgbXZ9QXJyYXlFbGVtZW50KHMpe3JldHVybiB0aGlzLmVsZW1lbnQ9dGhpcy5lbGVtZW50LmNvbmNhdChjbG9uZURlZXAocykpLEZ1fX07Y2xhc3MgT3BlcmF0aW9uUGFyYW1ldGVycyBleHRlbmRzIHZ1LndFe3N0YXRpYyBwcmltYXJ5Q2xhc3M9Im9wZXJhdGlvbi1wYXJhbWV0ZXJzIjtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKE9wZXJhdGlvblBhcmFtZXRlcnMucHJpbWFyeUNsYXNzKSx0aGlzLmNsYXNzZXMucHVzaCgicGFyYW1ldGVycyIpfX1jb25zdCB5dj1PcGVyYXRpb25QYXJhbWV0ZXJzO2NsYXNzIG9wZW5fYXBpXzNfMF9QYXJhbWV0ZXJzVmlzaXRvcl9QYXJhbWV0ZXJzVmlzaXRvciBleHRlbmRzKE1peGluKFhmLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB2dS53RSx0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJwYXJhbWV0ZXJzIil9QXJyYXlFbGVtZW50KHMpe3JldHVybiBzLmZvckVhY2goKHM9Pntjb25zdCBvPWlzUmVmZXJlbmNlTGlrZUVsZW1lbnQocyk/WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZWZlcmVuY2UiXTpbImRvY3VtZW50Iiwib2JqZWN0cyIsIlBhcmFtZXRlciJdLGk9dGhpcy50b1JlZnJhY3RlZEVsZW1lbnQobyxzKTt6bShpKSYmaS5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInBhcmFtZXRlciIpLHRoaXMuZWxlbWVudC5wdXNoKGkpfSkpLHRoaXMuY29weU1ldGFBbmRBdHRyaWJ1dGVzKHMsdGhpcy5lbGVtZW50KSxGdX19Y29uc3QgdnY9b3Blbl9hcGlfM18wX1BhcmFtZXRlcnNWaXNpdG9yX1BhcmFtZXRlcnNWaXNpdG9yO2NvbnN0IGJ2PWNsYXNzIG9wZXJhdGlvbl9QYXJhbWV0ZXJzVmlzaXRvcl9QYXJhbWV0ZXJzVmlzaXRvciBleHRlbmRzIHZ2e2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgeXZ9fTtjb25zdCBTdj1jbGFzcyBSZXF1ZXN0Qm9keVZpc2l0b3JfUmVxdWVzdEJvZHlWaXNpdG9yIGV4dGVuZHMgQ217Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5hbHRlcm5hdG9yPVt7cHJlZGljYXRlOmlzUmVmZXJlbmNlTGlrZUVsZW1lbnQsc3BlY1BhdGg6WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZWZlcmVuY2UiXX0se3ByZWRpY2F0ZTplc19ULHNwZWNQYXRoOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiUmVxdWVzdEJvZHkiXX1dfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz1DbS5wcm90b3R5cGUuZW50ZXIuY2FsbCh0aGlzLHMpO3JldHVybiB6bSh0aGlzLmVsZW1lbnQpJiZ0aGlzLmVsZW1lbnQuc2V0TWV0YVByb3BlcnR5KCJyZWZlcmVuY2VkLWVsZW1lbnQiLCJyZXF1ZXN0Qm9keSIpLG99fTtjbGFzcyBPcGVyYXRpb25DYWxsYmFja3MgZXh0ZW5kcyB2dS5TaHtzdGF0aWMgcHJpbWFyeUNsYXNzPSJvcGVyYXRpb24tY2FsbGJhY2tzIjtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKE9wZXJhdGlvbkNhbGxiYWNrcy5wcmltYXJ5Q2xhc3MpfX1jb25zdCBfdj1PcGVyYXRpb25DYWxsYmFja3M7Y2xhc3MgQ2FsbGJhY2tzVmlzaXRvcl9DYWxsYmFja3NWaXNpdG9yIGV4dGVuZHMoTWl4aW4oeW0sR2YpKXtzcGVjUGF0aDtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IF92LHRoaXMuc3BlY1BhdGg9cz0+aXNSZWZlcmVuY2VMaWtlRWxlbWVudChzKT9bImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiQ2FsbGJhY2siXX1PYmplY3RFbGVtZW50KHMpe2NvbnN0IG89eW0ucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiB0aGlzLmVsZW1lbnQuZmlsdGVyKHptKS5mb3JFYWNoKChzPT57cy5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsImNhbGxiYWNrIil9KSksb319Y29uc3QgRXY9Q2FsbGJhY2tzVmlzaXRvcl9DYWxsYmFja3NWaXNpdG9yO2NsYXNzIE9wZXJhdGlvblNlY3VyaXR5IGV4dGVuZHMgdnUud0V7c3RhdGljIHByaW1hcnlDbGFzcz0ib3BlcmF0aW9uLXNlY3VyaXR5Ijtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKE9wZXJhdGlvblNlY3VyaXR5LnByaW1hcnlDbGFzcyksdGhpcy5jbGFzc2VzLnB1c2goInNlY3VyaXR5Iil9fWNvbnN0IHd2PU9wZXJhdGlvblNlY3VyaXR5O2NsYXNzIFNlY3VyaXR5VmlzaXRvcl9TZWN1cml0eVZpc2l0b3IgZXh0ZW5kcyhNaXhpbihYZixHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgd3Z9QXJyYXlFbGVtZW50KHMpe3JldHVybiBzLmZvckVhY2goKHM9Pntjb25zdCBvPVB1KHMpP1siZG9jdW1lbnQiLCJvYmplY3RzIiwiU2VjdXJpdHlSZXF1aXJlbWVudCJdOlsidmFsdWUiXSxpPXRoaXMudG9SZWZyYWN0ZWRFbGVtZW50KG8scyk7dGhpcy5lbGVtZW50LnB1c2goaSl9KSksdGhpcy5jb3B5TWV0YUFuZEF0dHJpYnV0ZXMocyx0aGlzLmVsZW1lbnQpLEZ1fX1jb25zdCB4dj1TZWN1cml0eVZpc2l0b3JfU2VjdXJpdHlWaXNpdG9yO2NsYXNzIE9wZXJhdGlvblNlcnZlcnMgZXh0ZW5kcyB2dS53RXtzdGF0aWMgcHJpbWFyeUNsYXNzPSJvcGVyYXRpb24tc2VydmVycyI7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmNsYXNzZXMucHVzaChPcGVyYXRpb25TZXJ2ZXJzLnByaW1hcnlDbGFzcyksdGhpcy5jbGFzc2VzLnB1c2goInNlcnZlcnMiKX19Y29uc3Qga3Y9T3BlcmF0aW9uU2VydmVycztjb25zdCBPdj1jbGFzcyBTZXJ2ZXJzVmlzaXRvcl9TZXJ2ZXJzVmlzaXRvciBleHRlbmRzIHdte2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcga3Z9fTtjbGFzcyBQYXRoSXRlbVZpc2l0b3IgZXh0ZW5kcyhNaXhpbihvbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgUmgsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIlBhdGhJdGVtIl0pfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz1vbS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyk7cmV0dXJuIHRoaXMuZWxlbWVudC5maWx0ZXIoJG0pLmZvckVhY2goKChzLG8pPT57Y29uc3QgaT1jbG9uZURlZXAobyk7aS5jb250ZW50PXNlcmlhbGl6ZXJzX3ZhbHVlKGkpLnRvVXBwZXJDYXNlKCkscy5zZXRNZXRhUHJvcGVydHkoImh0dHAtbWV0aG9kIixpKX0pKSxPdSh0aGlzLmVsZW1lbnQuJHJlZikmJnRoaXMuZWxlbWVudC5jbGFzc2VzLnB1c2goInJlZmVyZW5jZS1lbGVtZW50Iiksb319Y29uc3QgQXY9UGF0aEl0ZW1WaXNpdG9yO2NvbnN0IEN2PWNsYXNzIHBhdGhfaXRlbV8kUmVmVmlzaXRvcl8kUmVmVmlzaXRvciBleHRlbmRzIEdme1N0cmluZ0VsZW1lbnQocyl7Y29uc3Qgbz1zdXBlci5lbnRlcihzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgicmVmZXJlbmNlLXZhbHVlIiksb319O2NsYXNzIFBhdGhJdGVtU2VydmVycyBleHRlbmRzIHZ1LndFe3N0YXRpYyBwcmltYXJ5Q2xhc3M9InBhdGgtaXRlbS1zZXJ2ZXJzIjtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKFBhdGhJdGVtU2VydmVycy5wcmltYXJ5Q2xhc3MpLHRoaXMuY2xhc3Nlcy5wdXNoKCJzZXJ2ZXJzIil9fWNvbnN0IGp2PVBhdGhJdGVtU2VydmVycztjb25zdCBQdj1jbGFzcyBwYXRoX2l0ZW1fU2VydmVyc1Zpc2l0b3JfU2VydmVyc1Zpc2l0b3IgZXh0ZW5kcyB3bXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IGp2fX07Y2xhc3MgUGF0aEl0ZW1QYXJhbWV0ZXJzIGV4dGVuZHMgdnUud0V7c3RhdGljIHByaW1hcnlDbGFzcz0icGF0aC1pdGVtLXBhcmFtZXRlcnMiO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goUGF0aEl0ZW1QYXJhbWV0ZXJzLnByaW1hcnlDbGFzcyksdGhpcy5jbGFzc2VzLnB1c2goInBhcmFtZXRlcnMiKX19Y29uc3QgSXY9UGF0aEl0ZW1QYXJhbWV0ZXJzO2NvbnN0IFR2PWNsYXNzIHBhdGhfaXRlbV9QYXJhbWV0ZXJzVmlzaXRvcl9QYXJhbWV0ZXJzVmlzaXRvciBleHRlbmRzIHZ2e2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgSXZ9fTtjbGFzcyBTZWN1cml0eVNjaGVtZVZpc2l0b3IgZXh0ZW5kcyhNaXhpbihvbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgRGYsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIlNlY3VyaXR5U2NoZW1lIl0pLHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPSEwfX1jb25zdCBOdj1TZWN1cml0eVNjaGVtZVZpc2l0b3I7Y2xhc3MgT0F1dGhGbG93c1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihvbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgd2gsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIk9BdXRoRmxvd3MiXSksdGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnM9ITB9fWNvbnN0IE12PU9BdXRoRmxvd3NWaXNpdG9yO2NsYXNzIE9BdXRoRmxvd1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihvbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgX2gsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIk9BdXRoRmxvdyJdKSx0aGlzLmNhblN1cHBvcnRTcGVjaWZpY2F0aW9uRXh0ZW5zaW9ucz0hMH19Y29uc3QgUnY9T0F1dGhGbG93VmlzaXRvcjtjbGFzcyBPQXV0aEZsb3dTY29wZXMgZXh0ZW5kcyB2dS5TaHtzdGF0aWMgcHJpbWFyeUNsYXNzPSJvYXV0aC1mbG93LXNjb3BlcyI7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmNsYXNzZXMucHVzaChPQXV0aEZsb3dTY29wZXMucHJpbWFyeUNsYXNzKX19Y29uc3QgRHY9T0F1dGhGbG93U2NvcGVzO2NsYXNzIFNjb3Blc1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbih5bSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgRHYsdGhpcy5zcGVjUGF0aD1sYyhbInZhbHVlIl0pfX1jb25zdCBMdj1TY29wZXNWaXNpdG9yO2NsYXNzIFRhZ3MgZXh0ZW5kcyB2dS53RXtzdGF0aWMgcHJpbWFyeUNsYXNzPSJ0YWdzIjtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuY2xhc3Nlcy5wdXNoKFRhZ3MucHJpbWFyeUNsYXNzKX19Y29uc3QgRnY9VGFncztjbGFzcyBUYWdzVmlzaXRvcl9UYWdzVmlzaXRvciBleHRlbmRzKE1peGluKFhmLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBGdn1BcnJheUVsZW1lbnQocyl7cmV0dXJuIHMuZm9yRWFjaCgocz0+e2NvbnN0IG89c20ocyk/WyJkb2N1bWVudCIsIm9iamVjdHMiLCJUYWciXTpbInZhbHVlIl0saT10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChvLHMpO3RoaXMuZWxlbWVudC5wdXNoKGkpfSkpLHRoaXMuY29weU1ldGFBbmRBdHRyaWJ1dGVzKHMsdGhpcy5lbGVtZW50KSxGdX19Y29uc3QgQnY9VGFnc1Zpc2l0b3JfVGFnc1Zpc2l0b3Ise2ZpeGVkRmllbGRzOiR2fT1DZi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkpTT05TY2hlbWEscXY9e3Zpc2l0b3JzOnt2YWx1ZTpHZixkb2N1bWVudDp7b2JqZWN0czp7T3BlbkFwaTp7JHZpc2l0b3I6aW0sZml4ZWRGaWVsZHM6e29wZW5hcGk6YW0saW5mbzp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL0luZm8ifSxzZXJ2ZXJzOndtLHBhdGhzOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvUGF0aHMifSxjb21wb25lbnRzOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvQ29tcG9uZW50cyJ9LHNlY3VyaXR5OnlnLHRhZ3M6QnYsZXh0ZXJuYWxEb2NzOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvRXh0ZXJuYWxEb2N1bWVudGF0aW9uIn19fSxJbmZvOnskdmlzaXRvcjpsbSxmaXhlZEZpZWxkczp7dGl0bGU6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxkZXNjcmlwdGlvbjp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHRlcm1zT2ZTZXJ2aWNlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sY29udGFjdDp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL0NvbnRhY3QifSxsaWNlbnNlOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvTGljZW5zZSJ9LHZlcnNpb246dW19fSxDb250YWN0OnskdmlzaXRvcjpwbSxmaXhlZEZpZWxkczp7bmFtZTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHVybDp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGVtYWlsOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn19fSxMaWNlbnNlOnskdmlzaXRvcjpobSxmaXhlZEZpZWxkczp7bmFtZTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHVybDp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9fX0sU2VydmVyOnskdmlzaXRvcjpTbSxmaXhlZEZpZWxkczp7dXJsOl9tLGRlc2NyaXB0aW9uOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sdmFyaWFibGVzOk9tfX0sU2VydmVyVmFyaWFibGU6eyR2aXNpdG9yOnhtLGZpeGVkRmllbGRzOntlbnVtOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZGVmYXVsdDp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGRlc2NyaXB0aW9uOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn19fSxDb21wb25lbnRzOnskdmlzaXRvcjpfZyxmaXhlZEZpZWxkczp7c2NoZW1hczpreSxyZXNwb25zZXM6QXkscGFyYW1ldGVyczpqeSxleGFtcGxlczpJeSxyZXF1ZXN0Qm9kaWVzOk55LGhlYWRlcnM6Unksc2VjdXJpdHlTY2hlbWVzOkx5LGxpbmtzOkJ5LGNhbGxiYWNrczpxeX19LFBhdGhzOnskdmlzaXRvcjpLeX0sUGF0aEl0ZW06eyR2aXNpdG9yOkF2LGZpeGVkRmllbGRzOnskcmVmOkN2LHN1bW1hcnk6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxkZXNjcmlwdGlvbjp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGdldDp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL09wZXJhdGlvbiJ9LHB1dDp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL09wZXJhdGlvbiJ9LHBvc3Q6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9PcGVyYXRpb24ifSxkZWxldGU6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9PcGVyYXRpb24ifSxvcHRpb25zOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvT3BlcmF0aW9uIn0saGVhZDp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL09wZXJhdGlvbiJ9LHBhdGNoOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvT3BlcmF0aW9uIn0sdHJhY2U6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9PcGVyYXRpb24ifSxzZXJ2ZXJzOlB2LHBhcmFtZXRlcnM6VHZ9fSxPcGVyYXRpb246eyR2aXNpdG9yOmZ2LGZpeGVkRmllbGRzOnt0YWdzOmd2LHN1bW1hcnk6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxkZXNjcmlwdGlvbjp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGV4dGVybmFsRG9jczp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL0V4dGVybmFsRG9jdW1lbnRhdGlvbiJ9LG9wZXJhdGlvbklkOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0scGFyYW1ldGVyczpidixyZXF1ZXN0Qm9keTpTdixyZXNwb25zZXM6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9SZXNwb25zZXMifSxjYWxsYmFja3M6RXYsZGVwcmVjYXRlZDp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHNlY3VyaXR5Onh2LHNlcnZlcnM6T3Z9fSxFeHRlcm5hbERvY3VtZW50YXRpb246eyR2aXNpdG9yOnp5LGZpeGVkRmllbGRzOntkZXNjcmlwdGlvbjp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHVybDp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9fX0sUGFyYW1ldGVyOnskdmlzaXRvcjpVZyxmaXhlZEZpZWxkczp7bmFtZTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGluOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZGVzY3JpcHRpb246eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxyZXF1aXJlZDp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGRlcHJlY2F0ZWQ6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxhbGxvd0VtcHR5VmFsdWU6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxzdHlsZTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGV4cGxvZGU6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxhbGxvd1Jlc2VydmVkOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sc2NoZW1hOlZnLGV4YW1wbGU6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxleGFtcGxlczpfeSxjb250ZW50Ond5fX0sUmVxdWVzdEJvZHk6eyR2aXNpdG9yOkd5LGZpeGVkRmllbGRzOntkZXNjcmlwdGlvbjp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGNvbnRlbnQ6WHkscmVxdWlyZWQ6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifX19LE1lZGlhVHlwZTp7JHZpc2l0b3I6QW0sZml4ZWRGaWVsZHM6e3NjaGVtYTpuZyxleGFtcGxlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZXhhbXBsZXM6bGcsZW5jb2Rpbmc6Zmd9fSxFbmNvZGluZzp7JHZpc2l0b3I6V3ksZml4ZWRGaWVsZHM6e2NvbnRlbnRUeXBlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0saGVhZGVyczpIeSxzdHlsZTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGV4cGxvZGU6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxhbGxvd1Jlc2VydmVkOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn19fSxSZXNwb25zZXM6eyR2aXNpdG9yOmh2LGZpeGVkRmllbGRzOntkZWZhdWx0OmR2fX0sUmVzcG9uc2U6eyR2aXNpdG9yOlp5LGZpeGVkRmllbGRzOntkZXNjcmlwdGlvbjp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGhlYWRlcnM6dHYsY29udGVudDpudixsaW5rczpvdn19LENhbGxiYWNrOnskdmlzaXRvcjpReX0sRXhhbXBsZTp7JHZpc2l0b3I6VXksZml4ZWRGaWVsZHM6e3N1bW1hcnk6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxkZXNjcmlwdGlvbjp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHZhbHVlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZXh0ZXJuYWxWYWx1ZTpWeX19LExpbms6eyR2aXNpdG9yOmRtLGZpeGVkRmllbGRzOntvcGVyYXRpb25SZWY6Zm0sb3BlcmF0aW9uSWQ6bW0scGFyYW1ldGVyczpibSxyZXF1ZXN0Qm9keTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGRlc2NyaXB0aW9uOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sc2VydmVyOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvU2VydmVyIn19fSxIZWFkZXI6eyR2aXNpdG9yOnpnLGZpeGVkRmllbGRzOntkZXNjcmlwdGlvbjp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHJlcXVpcmVkOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZGVwcmVjYXRlZDp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGFsbG93RW1wdHlWYWx1ZTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHN0eWxlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZXhwbG9kZTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGFsbG93UmVzZXJ2ZWQ6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxzY2hlbWE6V2csZXhhbXBsZTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGV4YW1wbGVzOllnLGNvbnRlbnQ6ZXl9fSxUYWc6eyR2aXNpdG9yOnhnLGZpeGVkRmllbGRzOntuYW1lOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZGVzY3JpcHRpb246eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxleHRlcm5hbERvY3M6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9FeHRlcm5hbERvY3VtZW50YXRpb24ifX19LFJlZmVyZW5jZTp7JHZpc2l0b3I6a2csZml4ZWRGaWVsZHM6eyRyZWY6cWd9fSxKU09OU2NoZW1hOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvU2NoZW1hIn0sSlNPTlJlZmVyZW5jZTp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL1JlZmVyZW5jZSJ9LFNjaGVtYTp7JHZpc2l0b3I6dHksZml4ZWRGaWVsZHM6e3RpdGxlOiR2LnRpdGxlLG11bHRpcGxlT2Y6JHYubXVsdGlwbGVPZixtYXhpbXVtOiR2Lm1heGltdW0sZXhjbHVzaXZlTWF4aW11bTokdi5leGNsdXNpdmVNYXhpbXVtLG1pbmltdW06JHYubWluaW11bSxleGNsdXNpdmVNaW5pbXVtOiR2LmV4Y2x1c2l2ZU1pbmltdW0sbWF4TGVuZ3RoOiR2Lm1heExlbmd0aCxtaW5MZW5ndGg6JHYubWluTGVuZ3RoLHBhdHRlcm46JHYucGF0dGVybixtYXhJdGVtczokdi5tYXhJdGVtcyxtaW5JdGVtczokdi5taW5JdGVtcyx1bmlxdWVJdGVtczokdi51bmlxdWVJdGVtcyxtYXhQcm9wZXJ0aWVzOiR2Lm1heFByb3BlcnRpZXMsbWluUHJvcGVydGllczokdi5taW5Qcm9wZXJ0aWVzLHJlcXVpcmVkOiR2LnJlcXVpcmVkLGVudW06JHYuZW51bSx0eXBlOmR5LGFsbE9mOm55LGFueU9mOm95LG9uZU9mOmF5LG5vdDpteSxpdGVtczpseSxwcm9wZXJ0aWVzOnB5LGFkZGl0aW9uYWxQcm9wZXJ0aWVzOm15LGRlc2NyaXB0aW9uOiR2LmRlc2NyaXB0aW9uLGZvcm1hdDokdi5mb3JtYXQsZGVmYXVsdDokdi5kZWZhdWx0LG51bGxhYmxlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZGlzY3JpbWluYXRvcjp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL0Rpc2NyaW1pbmF0b3IifSx3cml0ZU9ubHk6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSx4bWw6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9YTUwifSxleHRlcm5hbERvY3M6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9FeHRlcm5hbERvY3VtZW50YXRpb24ifSxleGFtcGxlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZGVwcmVjYXRlZDp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9fX0sRGlzY3JpbWluYXRvcjp7JHZpc2l0b3I6Z3ksZml4ZWRGaWVsZHM6e3Byb3BlcnR5TmFtZTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LG1hcHBpbmc6dnl9fSxYTUw6eyR2aXNpdG9yOmJ5LGZpeGVkRmllbGRzOntuYW1lOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sbmFtZXNwYWNlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0scHJlZml4OnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sYXR0cmlidXRlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sd3JhcHBlZDp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9fX0sU2VjdXJpdHlTY2hlbWU6eyR2aXNpdG9yOk52LGZpeGVkRmllbGRzOnt0eXBlOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sZGVzY3JpcHRpb246eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxuYW1lOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0saW46eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxzY2hlbWU6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxiZWFyZXJGb3JtYXQ6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxmbG93czp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL09BdXRoRmxvd3MifSxvcGVuSWRDb25uZWN0VXJsOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn19fSxPQXV0aEZsb3dzOnskdmlzaXRvcjpNdixmaXhlZEZpZWxkczp7aW1wbGljaXQ6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9PQXV0aEZsb3cifSxwYXNzd29yZDp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL09BdXRoRmxvdyJ9LGNsaWVudENyZWRlbnRpYWxzOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvT0F1dGhGbG93In0sYXV0aG9yaXphdGlvbkNvZGU6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9PQXV0aEZsb3cifX19LE9BdXRoRmxvdzp7JHZpc2l0b3I6UnYsZml4ZWRGaWVsZHM6e2F1dGhvcml6YXRpb25Vcmw6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSx0b2tlblVybDp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHJlZnJlc2hVcmw6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifSxzY29wZXM6THZ9fSxTZWN1cml0eVJlcXVpcmVtZW50OnskdmlzaXRvcjptZ319LGV4dGVuc2lvbjp7JHZpc2l0b3I6Y219fX19LHNyY190cmF2ZXJzYWxfdmlzaXRvcl9nZXROb2RlVHlwZT1zPT57aWYoa3UocykpcmV0dXJuYCR7cy5lbGVtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3MuZWxlbWVudC5zbGljZSgxKX1FbGVtZW50YH0sVXY9e0NhbGxiYWNrRWxlbWVudDpbImNvbnRlbnQiXSxDb21wb25lbnRzRWxlbWVudDpbImNvbnRlbnQiXSxDb250YWN0RWxlbWVudDpbImNvbnRlbnQiXSxEaXNjcmltaW5hdG9yRWxlbWVudDpbImNvbnRlbnQiXSxFbmNvZGluZzpbImNvbnRlbnQiXSxFeGFtcGxlOlsiY29udGVudCJdLEV4dGVybmFsRG9jdW1lbnRhdGlvbkVsZW1lbnQ6WyJjb250ZW50Il0sSGVhZGVyRWxlbWVudDpbImNvbnRlbnQiXSxJbmZvRWxlbWVudDpbImNvbnRlbnQiXSxMaWNlbnNlRWxlbWVudDpbImNvbnRlbnQiXSxNZWRpYVR5cGVFbGVtZW50OlsiY29udGVudCJdLE9BdXRoRmxvd0VsZW1lbnQ6WyJjb250ZW50Il0sT0F1dGhGbG93c0VsZW1lbnQ6WyJjb250ZW50Il0sT3BlbkFwaTNfMEVsZW1lbnQ6WyJjb250ZW50Il0sT3BlcmF0aW9uRWxlbWVudDpbImNvbnRlbnQiXSxQYXJhbWV0ZXJFbGVtZW50OlsiY29udGVudCJdLFBhdGhJdGVtRWxlbWVudDpbImNvbnRlbnQiXSxQYXRoc0VsZW1lbnQ6WyJjb250ZW50Il0sUmVmZXJlbmNlRWxlbWVudDpbImNvbnRlbnQiXSxSZXF1ZXN0Qm9keUVsZW1lbnQ6WyJjb250ZW50Il0sUmVzcG9uc2VFbGVtZW50OlsiY29udGVudCJdLFJlc3BvbnNlc0VsZW1lbnQ6WyJjb250ZW50Il0sU2NoZW1hRWxlbWVudDpbImNvbnRlbnQiXSxTZWN1cml0eVJlcXVpcmVtZW50RWxlbWVudDpbImNvbnRlbnQiXSxTZWN1cml0eVNjaGVtZUVsZW1lbnQ6WyJjb250ZW50Il0sU2VydmVyRWxlbWVudDpbImNvbnRlbnQiXSxTZXJ2ZXJWYXJpYWJsZUVsZW1lbnQ6WyJjb250ZW50Il0sVGFnRWxlbWVudDpbImNvbnRlbnQiXSwuLi5lcH0sVnY9e25hbWVzcGFjZTpzPT57Y29uc3R7YmFzZTpvfT1zO3JldHVybiBvLnJlZ2lzdGVyKCJjYWxsYmFjayIsS3ApLG8ucmVnaXN0ZXIoImNvbXBvbmVudHMiLEdwKSxvLnJlZ2lzdGVyKCJjb250YWN0IixZcCksby5yZWdpc3RlcigiZGlzY3JpbWluYXRvciIsWHApLG8ucmVnaXN0ZXIoImVuY29kaW5nIixRcCksby5yZWdpc3RlcigiZXhhbXBsZSIsWnApLG8ucmVnaXN0ZXIoImV4dGVybmFsRG9jdW1lbnRhdGlvbiIsdGgpLG8ucmVnaXN0ZXIoImhlYWRlciIscmgpLG8ucmVnaXN0ZXIoImluZm8iLHVoKSxvLnJlZ2lzdGVyKCJsaWNlbnNlIixkaCksby5yZWdpc3RlcigibGluayIsZmgpLG8ucmVnaXN0ZXIoIm1lZGlhVHlwZSIsdmgpLG8ucmVnaXN0ZXIoIm9BdXRoRmxvdyIsX2gpLG8ucmVnaXN0ZXIoIm9BdXRoRmxvd3MiLHdoKSxvLnJlZ2lzdGVyKCJvcGVuYXBpIixPaCksby5yZWdpc3Rlcigib3BlbkFwaTNfMCIsamgpLG8ucmVnaXN0ZXIoIm9wZXJhdGlvbiIsUGgpLG8ucmVnaXN0ZXIoInBhcmFtZXRlciIsSWgpLG8ucmVnaXN0ZXIoInBhdGhJdGVtIixSaCksby5yZWdpc3RlcigicGF0aHMiLERoKSxvLnJlZ2lzdGVyKCJyZWZlcmVuY2UiLExoKSxvLnJlZ2lzdGVyKCJyZXF1ZXN0Qm9keSIsRmgpLG8ucmVnaXN0ZXIoInJlc3BvbnNlIixKaCksby5yZWdpc3RlcigicmVzcG9uc2VzIixIaCksby5yZWdpc3Rlcigic2NoZW1hIixOZiksby5yZWdpc3Rlcigic2VjdXJpdHlSZXF1aXJlbWVudCIsUmYpLG8ucmVnaXN0ZXIoInNlY3VyaXR5U2NoZW1lIixEZiksby5yZWdpc3Rlcigic2VydmVyIixGZiksby5yZWdpc3Rlcigic2VydmVyVmFyaWFibGUiLFZmKSxvLnJlZ2lzdGVyKCJ0YWciLFdmKSxvLnJlZ2lzdGVyKCJ4bWwiLEpmKSxvfX0senY9VnYsc3JjX3JlZnJhY3Rvcl90b29sYm94PSgpPT57Y29uc3Qgcz1jcmVhdGVOYW1lc3BhY2UoenYpO3JldHVybntwcmVkaWNhdGVzOnsuLi5jZSxpc0VsZW1lbnQ6a3UsaXNTdHJpbmdFbGVtZW50Ok91LGlzQXJyYXlFbGVtZW50Okl1LGlzT2JqZWN0RWxlbWVudDpQdSxpc01lbWJlckVsZW1lbnQ6VHUsaW5jbHVkZXNDbGFzc2VzLGhhc0VsZW1lbnRTb3VyY2VNYXB9LG5hbWVzcGFjZTpzfX0sc3JjX3JlZnJhY3Rvcl9yZWZyYWN0PShzLHtzcGVjUGF0aDpvPVsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJPcGVuQXBpIiwiJHZpc2l0b3IiXSxwbHVnaW5zOmk9W119PXt9KT0+e2NvbnN0IGE9KDAsdnUuZSkocyksdT1kZXJlZmVyZW5jZShxdiksXz1uZXcoR3Uobyx1KSkoe3NwZWNPYmo6dX0pO3JldHVybiB2aXNpdG9yX3Zpc2l0KGEsXyksZGlzcGF0Y2hQbHVnaW5zU3luYyhfLmVsZW1lbnQsaSx7dG9vbGJveENyZWF0b3I6c3JjX3JlZnJhY3Rvcl90b29sYm94LHZpc2l0b3JPcHRpb25zOntrZXlNYXA6VXYsbm9kZVR5cGVHZXR0ZXI6c3JjX3RyYXZlcnNhbF92aXNpdG9yX2dldE5vZGVUeXBlfX0pfSxzcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3Rvcj1zPT4obyxpPXt9KT0+c3JjX3JlZnJhY3Rvcl9yZWZyYWN0KG8se3NwZWNQYXRoOnMsLi4uaX0pO0twLnJlZnJhY3Q9c3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkNhbGxiYWNrIiwiJHZpc2l0b3IiXSksR3AucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiQ29tcG9uZW50cyIsIiR2aXNpdG9yIl0pLFlwLnJlZnJhY3Q9c3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkNvbnRhY3QiLCIkdmlzaXRvciJdKSxacC5yZWZyYWN0PXNyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJFeGFtcGxlIiwiJHZpc2l0b3IiXSksWHAucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiRGlzY3JpbWluYXRvciIsIiR2aXNpdG9yIl0pLFFwLnJlZnJhY3Q9c3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkVuY29kaW5nIiwiJHZpc2l0b3IiXSksdGgucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiRXh0ZXJuYWxEb2N1bWVudGF0aW9uIiwiJHZpc2l0b3IiXSkscmgucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSGVhZGVyIiwiJHZpc2l0b3IiXSksdWgucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSW5mbyIsIiR2aXNpdG9yIl0pLGRoLnJlZnJhY3Q9c3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpY2Vuc2UiLCIkdmlzaXRvciJdKSxmaC5yZWZyYWN0PXNyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJMaW5rIiwiJHZpc2l0b3IiXSksdmgucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTWVkaWFUeXBlIiwiJHZpc2l0b3IiXSksX2gucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiT0F1dGhGbG93IiwiJHZpc2l0b3IiXSksd2gucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiT0F1dGhGbG93cyIsIiR2aXNpdG9yIl0pLE9oLnJlZnJhY3Q9c3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIk9wZW5BcGkiLCJmaXhlZEZpZWxkcyIsIm9wZW5hcGkiXSksamgucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiT3BlbkFwaSIsIiR2aXNpdG9yIl0pLFBoLnJlZnJhY3Q9c3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIk9wZXJhdGlvbiIsIiR2aXNpdG9yIl0pLEloLnJlZnJhY3Q9c3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIlBhcmFtZXRlciIsIiR2aXNpdG9yIl0pLFJoLnJlZnJhY3Q9c3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIlBhdGhJdGVtIiwiJHZpc2l0b3IiXSksRGgucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiUGF0aHMiLCIkdmlzaXRvciJdKSxMaC5yZWZyYWN0PXNyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJSZWZlcmVuY2UiLCIkdmlzaXRvciJdKSxGaC5yZWZyYWN0PXNyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJSZXF1ZXN0Qm9keSIsIiR2aXNpdG9yIl0pLEpoLnJlZnJhY3Q9c3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlc3BvbnNlIiwiJHZpc2l0b3IiXSksSGgucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiUmVzcG9uc2VzIiwiJHZpc2l0b3IiXSksTmYucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiU2NoZW1hIiwiJHZpc2l0b3IiXSksUmYucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiU2VjdXJpdHlSZXF1aXJlbWVudCIsIiR2aXNpdG9yIl0pLERmLnJlZnJhY3Q9c3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIlNlY3VyaXR5U2NoZW1lIiwiJHZpc2l0b3IiXSksRmYucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiU2VydmVyIiwiJHZpc2l0b3IiXSksVmYucmVmcmFjdD1zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiU2VydmVyVmFyaWFibGUiLCIkdmlzaXRvciJdKSxXZi5yZWZyYWN0PXNyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJUYWciLCIkdmlzaXRvciJdKSxKZi5yZWZyYWN0PXNyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJYTUwiLCIkdmlzaXRvciJdKTtjb25zdCBXdj1jbGFzcyBDYWxsYmFja19DYWxsYmFjayBleHRlbmRzIEtwe307Y29uc3QgSnY9Y2xhc3MgQ29tcG9uZW50c19Db21wb25lbnRzIGV4dGVuZHMgR3B7Z2V0IHBhdGhJdGVtcygpe3JldHVybiB0aGlzLmdldCgicGF0aEl0ZW1zIil9c2V0IHBhdGhJdGVtcyhzKXt0aGlzLnNldCgicGF0aEl0ZW1zIixzKX19O2NvbnN0IEh2PWNsYXNzIENvbnRhY3RfQ29udGFjdCBleHRlbmRzIFlwe307Y29uc3QgS3Y9Y2xhc3MgRGlzY3JpbWluYXRvcl9EaXNjcmltaW5hdG9yIGV4dGVuZHMgWHB7fTtjb25zdCBHdj1jbGFzcyBFbmNvZGluZ19FbmNvZGluZyBleHRlbmRzIFFwe307Y29uc3QgWXY9Y2xhc3MgRXhhbXBsZV9FeGFtcGxlIGV4dGVuZHMgWnB7fTtjb25zdCBYdj1jbGFzcyBFeHRlcm5hbERvY3VtZW50YXRpb25fRXh0ZXJuYWxEb2N1bWVudGF0aW9uIGV4dGVuZHMgdGh7fTtjb25zdCBRdj1jbGFzcyBIZWFkZXJfSGVhZGVyIGV4dGVuZHMgcmh7Z2V0IHNjaGVtYSgpe3JldHVybiB0aGlzLmdldCgic2NoZW1hIil9c2V0IHNjaGVtYShzKXt0aGlzLnNldCgic2NoZW1hIixzKX19O2NvbnN0IFp2PWNsYXNzIEluZm9fSW5mbyBleHRlbmRzIHVoe2dldCBsaWNlbnNlKCl7cmV0dXJuIHRoaXMuZ2V0KCJsaWNlbnNlIil9c2V0IGxpY2Vuc2Uocyl7dGhpcy5zZXQoImxpY2Vuc2UiLHMpfWdldCBzdW1tYXJ5KCl7cmV0dXJuIHRoaXMuZ2V0KCJzdW1tYXJ5Iil9c2V0IHN1bW1hcnkocyl7dGhpcy5zZXQoInN1bW1hcnkiLHMpfX07Y2xhc3MgSnNvblNjaGVtYURpYWxlY3QgZXh0ZW5kcyB2dS5PbXtzdGF0aWMgZGVmYXVsdD1uZXcgSnNvblNjaGVtYURpYWxlY3QoImh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzLzMuMS9kaWFsZWN0L2Jhc2UiKTtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ianNvblNjaGVtYURpYWxlY3QifX1jb25zdCBlYj1Kc29uU2NoZW1hRGlhbGVjdDtjb25zdCB0Yj1jbGFzcyBMaWNlbnNlX0xpY2Vuc2UgZXh0ZW5kcyBkaHtnZXQgaWRlbnRpZmllcigpe3JldHVybiB0aGlzLmdldCgiaWRlbnRpZmllciIpfXNldCBpZGVudGlmaWVyKHMpe3RoaXMuc2V0KCJpZGVudGlmaWVyIixzKX19O2NvbnN0IG5iPWNsYXNzIExpbmtfTGluayBleHRlbmRzIGZoe307Y29uc3QgcGI9Y2xhc3MgTWVkaWFUeXBlX01lZGlhVHlwZSBleHRlbmRzIHZoe2dldCBzY2hlbWEoKXtyZXR1cm4gdGhpcy5nZXQoInNjaGVtYSIpfXNldCBzY2hlbWEocyl7dGhpcy5zZXQoInNjaGVtYSIscyl9fTtjb25zdCBtYj1jbGFzcyBPQXV0aEZsb3dfT0F1dGhGbG93IGV4dGVuZHMgX2h7fTtjb25zdCB5Yj1jbGFzcyBPQXV0aEZsb3dzX09BdXRoRmxvd3MgZXh0ZW5kcyB3aHt9O2NvbnN0IFNiPWNsYXNzIE9wZW5hcGlfT3BlbmFwaSBleHRlbmRzIE9oe307Y2xhc3MgT3BlbkFwaTNfMSBleHRlbmRzIHZ1LlNoe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJvcGVuQXBpM18xIix0aGlzLmNsYXNzZXMucHVzaCgiYXBpIil9Z2V0IG9wZW5hcGkoKXtyZXR1cm4gdGhpcy5nZXQoIm9wZW5hcGkiKX1zZXQgb3BlbmFwaShzKXt0aGlzLnNldCgib3BlbmFwaSIscyl9Z2V0IGluZm8oKXtyZXR1cm4gdGhpcy5nZXQoImluZm8iKX1zZXQgaW5mbyhzKXt0aGlzLnNldCgiaW5mbyIscyl9Z2V0IGpzb25TY2hlbWFEaWFsZWN0KCl7cmV0dXJuIHRoaXMuZ2V0KCJqc29uU2NoZW1hRGlhbGVjdCIpfXNldCBqc29uU2NoZW1hRGlhbGVjdChzKXt0aGlzLnNldCgianNvblNjaGVtYURpYWxlY3QiLHMpfWdldCBzZXJ2ZXJzKCl7cmV0dXJuIHRoaXMuZ2V0KCJzZXJ2ZXJzIil9c2V0IHNlcnZlcnMocyl7dGhpcy5zZXQoInNlcnZlcnMiLHMpfWdldCBwYXRocygpe3JldHVybiB0aGlzLmdldCgicGF0aHMiKX1zZXQgcGF0aHMocyl7dGhpcy5zZXQoInBhdGhzIixzKX1nZXQgY29tcG9uZW50cygpe3JldHVybiB0aGlzLmdldCgiY29tcG9uZW50cyIpfXNldCBjb21wb25lbnRzKHMpe3RoaXMuc2V0KCJjb21wb25lbnRzIixzKX1nZXQgc2VjdXJpdHkoKXtyZXR1cm4gdGhpcy5nZXQoInNlY3VyaXR5Iil9c2V0IHNlY3VyaXR5KHMpe3RoaXMuc2V0KCJzZWN1cml0eSIscyl9Z2V0IHRhZ3MoKXtyZXR1cm4gdGhpcy5nZXQoInRhZ3MiKX1zZXQgdGFncyhzKXt0aGlzLnNldCgidGFncyIscyl9Z2V0IGV4dGVybmFsRG9jcygpe3JldHVybiB0aGlzLmdldCgiZXh0ZXJuYWxEb2NzIil9c2V0IGV4dGVybmFsRG9jcyhzKXt0aGlzLnNldCgiZXh0ZXJuYWxEb2NzIixzKX1nZXQgd2ViaG9va3MoKXtyZXR1cm4gdGhpcy5nZXQoIndlYmhvb2tzIil9c2V0IHdlYmhvb2tzKHMpe3RoaXMuc2V0KCJ3ZWJob29rcyIscyl9fWNvbnN0IF9iPU9wZW5BcGkzXzE7Y29uc3Qgd2I9Y2xhc3MgT3BlcmF0aW9uX09wZXJhdGlvbiBleHRlbmRzIFBoe2dldCByZXF1ZXN0Qm9keSgpe3JldHVybiB0aGlzLmdldCgicmVxdWVzdEJvZHkiKX1zZXQgcmVxdWVzdEJvZHkocyl7dGhpcy5zZXQoInJlcXVlc3RCb2R5IixzKX19O2NvbnN0IE9iPWNsYXNzIFBhcmFtZXRlcl9QYXJhbWV0ZXIgZXh0ZW5kcyBJaHtnZXQgc2NoZW1hKCl7cmV0dXJuIHRoaXMuZ2V0KCJzY2hlbWEiKX1zZXQgc2NoZW1hKHMpe3RoaXMuc2V0KCJzY2hlbWEiLHMpfX07Y29uc3QgQWI9Y2xhc3MgUGF0aEl0ZW1fUGF0aEl0ZW0gZXh0ZW5kcyBSaHtnZXQgR0VUKCl7cmV0dXJuIHRoaXMuZ2V0KCJnZXQiKX1zZXQgR0VUKHMpe3RoaXMuc2V0KCJHRVQiLHMpfWdldCBQVVQoKXtyZXR1cm4gdGhpcy5nZXQoInB1dCIpfXNldCBQVVQocyl7dGhpcy5zZXQoIlBVVCIscyl9Z2V0IFBPU1QoKXtyZXR1cm4gdGhpcy5nZXQoInBvc3QiKX1zZXQgUE9TVChzKXt0aGlzLnNldCgiUE9TVCIscyl9Z2V0IERFTEVURSgpe3JldHVybiB0aGlzLmdldCgiZGVsZXRlIil9c2V0IERFTEVURShzKXt0aGlzLnNldCgiREVMRVRFIixzKX1nZXQgT1BUSU9OUygpe3JldHVybiB0aGlzLmdldCgib3B0aW9ucyIpfXNldCBPUFRJT05TKHMpe3RoaXMuc2V0KCJPUFRJT05TIixzKX1nZXQgSEVBRCgpe3JldHVybiB0aGlzLmdldCgiaGVhZCIpfXNldCBIRUFEKHMpe3RoaXMuc2V0KCJIRUFEIixzKX1nZXQgUEFUQ0goKXtyZXR1cm4gdGhpcy5nZXQoInBhdGNoIil9c2V0IFBBVENIKHMpe3RoaXMuc2V0KCJQQVRDSCIscyl9Z2V0IFRSQUNFKCl7cmV0dXJuIHRoaXMuZ2V0KCJ0cmFjZSIpfXNldCBUUkFDRShzKXt0aGlzLnNldCgiVFJBQ0UiLHMpfX07Y29uc3QgUGI9Y2xhc3MgUGF0aHNfUGF0aHMgZXh0ZW5kcyBEaHt9O2NsYXNzIFJlZmVyZW5jZV9SZWZlcmVuY2UgZXh0ZW5kcyBMaHt9T2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmVyZW5jZV9SZWZlcmVuY2UucHJvdG90eXBlLCJkZXNjcmlwdGlvbiIse2dldCgpe3JldHVybiB0aGlzLmdldCgiZGVzY3JpcHRpb24iKX0sc2V0KHMpe3RoaXMuc2V0KCJkZXNjcmlwdGlvbiIscyl9LGVudW1lcmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVmZXJlbmNlX1JlZmVyZW5jZS5wcm90b3R5cGUsInN1bW1hcnkiLHtnZXQoKXtyZXR1cm4gdGhpcy5nZXQoInN1bW1hcnkiKX0sc2V0KHMpe3RoaXMuc2V0KCJzdW1tYXJ5IixzKX0sZW51bWVyYWJsZTohMH0pO2NvbnN0IEliPVJlZmVyZW5jZV9SZWZlcmVuY2U7Y29uc3QgTWI9Y2xhc3MgUmVxdWVzdEJvZHlfUmVxdWVzdEJvZHkgZXh0ZW5kcyBGaHt9O2NvbnN0IFJiPWNsYXNzIGVsZW1lbnRzX1Jlc3BvbnNlX1Jlc3BvbnNlIGV4dGVuZHMgSmh7fTtjb25zdCBMYj1jbGFzcyBSZXNwb25zZXNfUmVzcG9uc2VzIGV4dGVuZHMgSGh7fTtjb25zdCBxYj1jbGFzcyBKU09OU2NoZW1hX0pTT05TY2hlbWEgZXh0ZW5kcyBHaHtjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0iSlNPTlNjaGVtYURyYWZ0NiJ9Z2V0IGlkUHJvcCgpe3Rocm93IG5ldyBLaCgiaWQga2V5d29yZCBmcm9tIENvcmUgdm9jYWJ1bGFyeSBoYXMgYmVlbiByZW5hbWVkIHRvICRpZC4iKX1zZXQgaWRQcm9wKHMpe3Rocm93IG5ldyBLaCgiaWQga2V5d29yZCBmcm9tIENvcmUgdm9jYWJ1bGFyeSBoYXMgYmVlbiByZW5hbWVkIHRvICRpZC4iKX1nZXQgJGlkKCl7cmV0dXJuIHRoaXMuZ2V0KCIkaWQiKX1zZXQgJGlkKHMpe3RoaXMuc2V0KCIkaWQiLHMpfWdldCBleGNsdXNpdmVNYXhpbXVtKCl7cmV0dXJuIHRoaXMuZ2V0KCJleGNsdXNpdmVNYXhpbXVtIil9c2V0IGV4Y2x1c2l2ZU1heGltdW0ocyl7dGhpcy5zZXQoImV4Y2x1c2l2ZU1heGltdW0iLHMpfWdldCBleGNsdXNpdmVNaW5pbXVtKCl7cmV0dXJuIHRoaXMuZ2V0KCJleGNsdXNpdmVNaW5pbXVtIil9c2V0IGV4Y2x1c2l2ZU1pbmltdW0ocyl7dGhpcy5zZXQoImV4Y2x1c2l2ZU1pbmltdW0iLHMpfWdldCBjb250YWluc1Byb3AoKXtyZXR1cm4gdGhpcy5nZXQoImNvbnRhaW5zIil9c2V0IGNvbnRhaW5zUHJvcChzKXt0aGlzLnNldCgiY29udGFpbnMiLHMpfWdldCBpdGVtcygpe3JldHVybiB0aGlzLmdldCgiaXRlbXMiKX1zZXQgaXRlbXMocyl7dGhpcy5zZXQoIml0ZW1zIixzKX1nZXQgcHJvcGVydHlOYW1lcygpe3JldHVybiB0aGlzLmdldCgicHJvcGVydHlOYW1lcyIpfXNldCBwcm9wZXJ0eU5hbWVzKHMpe3RoaXMuc2V0KCJwcm9wZXJ0eU5hbWVzIixzKX1nZXQgY29uc3QoKXtyZXR1cm4gdGhpcy5nZXQoImNvbnN0Iil9c2V0IGNvbnN0KHMpe3RoaXMuc2V0KCJjb25zdCIscyl9Z2V0IG5vdCgpe3JldHVybiB0aGlzLmdldCgibm90Iil9c2V0IG5vdChzKXt0aGlzLnNldCgibm90IixzKX1nZXQgZXhhbXBsZXMoKXtyZXR1cm4gdGhpcy5nZXQoImV4YW1wbGVzIil9c2V0IGV4YW1wbGVzKHMpe3RoaXMuc2V0KCJleGFtcGxlcyIscyl9fTtjb25zdCB6Yj1jbGFzcyBMaW5rRGVzY3JpcHRpb25fTGlua0Rlc2NyaXB0aW9uIGV4dGVuZHMgc2R7Z2V0IGhyZWZTY2hlbWEoKXtyZXR1cm4gdGhpcy5nZXQoImhyZWZTY2hlbWEiKX1zZXQgaHJlZlNjaGVtYShzKXt0aGlzLnNldCgiaHJlZlNjaGVtYSIscyl9Z2V0IHRhcmdldFNjaGVtYSgpe3JldHVybiB0aGlzLmdldCgidGFyZ2V0U2NoZW1hIil9c2V0IHRhcmdldFNjaGVtYShzKXt0aGlzLnNldCgidGFyZ2V0U2NoZW1hIixzKX1nZXQgc2NoZW1hKCl7dGhyb3cgbmV3IEtoKCJzY2hlbWEga2V5d29yZCBmcm9tIEh5cGVyLVNjaGVtYSB2b2NhYnVsYXJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gc3VibWlzc2lvblNjaGVtYS4iKX1zZXQgc2NoZW1hKHMpe3Rocm93IG5ldyBLaCgic2NoZW1hIGtleXdvcmQgZnJvbSBIeXBlci1TY2hlbWEgdm9jYWJ1bGFyeSBoYXMgYmVlbiByZW5hbWVkIHRvIHN1Ym1pc3Npb25TY2hlbWEuIil9Z2V0IHN1Ym1pc3Npb25TY2hlbWEoKXtyZXR1cm4gdGhpcy5nZXQoInN1Ym1pc3Npb25TY2hlbWEiKX1zZXQgc3VibWlzc2lvblNjaGVtYShzKXt0aGlzLnNldCgic3VibWlzc2lvblNjaGVtYSIscyl9Z2V0IG1ldGhvZCgpe3Rocm93IG5ldyBLaCgibWV0aG9kIGtleXdvcmQgZnJvbSBIeXBlci1TY2hlbWEgdm9jYWJ1bGFyeSBoYXMgYmVlbiByZW1vdmVkLiIpfXNldCBtZXRob2Qocyl7dGhyb3cgbmV3IEtoKCJtZXRob2Qga2V5d29yZCBmcm9tIEh5cGVyLVNjaGVtYSB2b2NhYnVsYXJ5IGhhcyBiZWVuIHJlbW92ZWQuIil9Z2V0IGVuY1R5cGUoKXt0aHJvdyBuZXcgS2goImVuY1R5cGUga2V5d29yZCBmcm9tIEh5cGVyLVNjaGVtYSB2b2NhYnVsYXJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gc3VibWlzc2lvbkVuY1R5cGUuIil9c2V0IGVuY1R5cGUocyl7dGhyb3cgbmV3IEtoKCJlbmNUeXBlIGtleXdvcmQgZnJvbSBIeXBlci1TY2hlbWEgdm9jYWJ1bGFyeSBoYXMgYmVlbiByZW5hbWVkIHRvIHN1Ym1pc3Npb25FbmNUeXBlLiIpfWdldCBzdWJtaXNzaW9uRW5jVHlwZSgpe3JldHVybiB0aGlzLmdldCgic3VibWlzc2lvbkVuY1R5cGUiKX1zZXQgc3VibWlzc2lvbkVuY1R5cGUocyl7dGhpcy5zZXQoInN1Ym1pc3Npb25FbmNUeXBlIixzKX19O3ZhciBRYj1fY3VycnkzKChmdW5jdGlvbiBhc3NvY1BhdGgocyxvLGkpe2lmKDA9PT1zLmxlbmd0aClyZXR1cm4gbzt2YXIgYT1zWzBdO2lmKHMubGVuZ3RoPjEpe3ZhciB1PSFWdShpKSYmX2hhcyhhLGkpJiYib2JqZWN0Ij09dHlwZW9mIGlbYV0/aVthXTpyYShzWzFdKT9bXTp7fTtvPWFzc29jUGF0aChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzLDEpLG8sdSl9cmV0dXJuIGZ1bmN0aW9uIF9hc3NvYyhzLG8saSl7aWYocmEocykmJllvKGkpKXt2YXIgYT1bXS5jb25jYXQoaSk7cmV0dXJuIGFbc109byxhfXZhciB1PXt9O2Zvcih2YXIgXyBpbiBpKXVbX109aVtfXTtyZXR1cm4gdVtzXT1vLHV9KGEsbyxpKX0pKTtjb25zdCBlUz1RYjt2YXIgdFM9X2N1cnJ5MygoZnVuY3Rpb24gcmVtb3ZlKHMsbyxpKXt2YXIgYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpLDApO3JldHVybiBhLnNwbGljZShzLG8pLGF9KSk7Y29uc3QgclM9dFM7dmFyIG5TPV9jdXJyeTMoKGZ1bmN0aW9uIGFzc29jKHMsbyxpKXtyZXR1cm4gZVMoW3NdLG8saSl9KSk7Y29uc3Qgc1M9blM7dmFyIG9TPV9jdXJyeTIoKGZ1bmN0aW9uIGRpc3NvY1BhdGgocyxvKXtpZihudWxsPT1vKXJldHVybiBvO3N3aXRjaChzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBvO2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24gX2Rpc3NvYyhzLG8pe2lmKG51bGw9PW8pcmV0dXJuIG87aWYocmEocykmJllvKG8pKXJldHVybiByUyhzLDEsbyk7dmFyIGk9e307Zm9yKHZhciBhIGluIG8paVthXT1vW2FdO3JldHVybiBkZWxldGUgaVtzXSxpfShzWzBdLG8pO2RlZmF1bHQ6dmFyIGk9c1swXSxhPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHMsMSk7cmV0dXJuIG51bGw9PW9baV0/ZnVuY3Rpb24gX3NoYWxsb3dDbG9uZU9iamVjdChzLG8pe2lmKHJhKHMpJiZZbyhvKSlyZXR1cm5bXS5jb25jYXQobyk7dmFyIGk9e307Zm9yKHZhciBhIGluIG8paVthXT1vW2FdO3JldHVybiBpfShpLG8pOnNTKGksZGlzc29jUGF0aChhLG9baV0pLG8pfX0pKTtjb25zdCBpUz1vUztjb25zdCBhUz1jbGFzcyBqc29uX3NjaGVtYV9KU09OU2NoZW1hVmlzaXRvciBleHRlbmRzIExke2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgcWJ9Z2V0IGRlZmF1bHREaWFsZWN0SWRlbnRpZmllcigpe3JldHVybiJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA2L3NjaGVtYSMifUJvb2xlYW5FbGVtZW50KHMpe2NvbnN0IG89dGhpcy5lbnRlcihzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgiYm9vbGVhbi1qc29uLXNjaGVtYSIpLG99aGFuZGxlU2NoZW1hSWRlbnRpZmllcihzLG89IiRpZCIpe3JldHVybiBzdXBlci5oYW5kbGVTY2hlbWFJZGVudGlmaWVyKHMsbyl9fTtjb25zdCBjUz1jbGFzcyBqc29uX3NjaGVtYV9JdGVtc1Zpc2l0b3JfSXRlbXNWaXNpdG9yIGV4dGVuZHMgRmR7Qm9vbGVhbkVsZW1lbnQocyl7cmV0dXJuIHRoaXMuZWxlbWVudD10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChbImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiXSxzKSxGdX19O2NvbnN0IGxTPWNsYXNzIGpzb25fc2NoZW1hX0V4YW1wbGVzVmlzaXRvcl9FeGFtcGxlc1Zpc2l0b3IgZXh0ZW5kcyB1ZHtBcnJheUVsZW1lbnQocyl7Y29uc3Qgbz10aGlzLmVudGVyKHMpO3JldHVybiB0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS1leGFtcGxlcyIpLG99fTtjb25zdCB1Uz1jbGFzcyBsaW5rX2Rlc2NyaXB0aW9uX0xpbmtEZXNjcmlwdGlvblZpc2l0b3IgZXh0ZW5kcyBPZntjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHpifX0scFM9cGlwZShlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsIiR2aXNpdG9yIl0sYVMpLGlTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJpZCJdKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwiJGlkIl0sQ2YudmlzaXRvcnMudmFsdWUpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJjb250YWlucyJdLENmLnZpc2l0b3JzLkpTT05TY2hlbWFPckpTT05SZWZlcmVuY2VWaXNpdG9yKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwiaXRlbXMiXSxjUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsInByb3BlcnR5TmFtZXMiXSxDZi52aXNpdG9ycy5KU09OU2NoZW1hT3JKU09OUmVmZXJlbmNlVmlzaXRvciksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsImNvbnN0Il0sQ2YudmlzaXRvcnMudmFsdWUpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJleGFtcGxlcyJdLGxTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiJHZpc2l0b3IiXSx1UyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsImZpeGVkRmllbGRzIiwiaHJlZlNjaGVtYSJdLENmLnZpc2l0b3JzLkpTT05TY2hlbWFPckpTT05SZWZlcmVuY2VWaXNpdG9yKSxpUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiZml4ZWRGaWVsZHMiLCJzY2hlbWEiXSksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsImZpeGVkRmllbGRzIiwic3VibWlzc2lvblNjaGVtYSJdLENmLnZpc2l0b3JzLkpTT05TY2hlbWFPckpTT05SZWZlcmVuY2VWaXNpdG9yKSxpUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiZml4ZWRGaWVsZHMiLCJtZXRob2QiXSksaVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsImZpeGVkRmllbGRzIiwiZW5jVHlwZSJdKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiZml4ZWRGaWVsZHMiLCJzdWJtaXNzaW9uRW5jVHlwZSJdLENmLnZpc2l0b3JzLnZhbHVlKSkoQ2YpLGhTPXtKU09OU2NoZW1hRHJhZnQ2RWxlbWVudDpbImNvbnRlbnQiXSxKU09OUmVmZXJlbmNlRWxlbWVudDpbImNvbnRlbnQiXSxNZWRpYUVsZW1lbnQ6WyJjb250ZW50Il0sTGlua0Rlc2NyaXB0aW9uRWxlbWVudDpbImNvbnRlbnQiXSwuLi5lcH0sZFM9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBxYnx8cyhhKSYmbygiSlNPTlNjaGVtYURyYWZ0NiIsYSkmJmkoIm9iamVjdCIsYSkpKSxmUz1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIHpifHxzKGEpJiZvKCJsaW5rRGVzY3JpcHRpb24iLGEpJiZpKCJvYmplY3QiLGEpKSksbVM9e25hbWVzcGFjZTpzPT57Y29uc3R7YmFzZTpvfT1zO3JldHVybiBvLnJlZ2lzdGVyKCJqU09OU2NoZW1hRHJhZnQ2IixxYiksby5yZWdpc3RlcigialNPTlJlZmVyZW5jZSIsUWgpLG8ucmVnaXN0ZXIoIm1lZGlhIix0ZCksby5yZWdpc3RlcigibGlua0Rlc2NyaXB0aW9uIix6Yiksb319LGdTPW1TLGFwaWRvbV9uc19qc29uX3NjaGVtYV9kcmFmdF82X3NyY19yZWZyYWN0b3JfdG9vbGJveD0oKT0+e2NvbnN0IHM9Y3JlYXRlTmFtZXNwYWNlKGdTKTtyZXR1cm57cHJlZGljYXRlczp7Li4ubGUsaXNTdHJpbmdFbGVtZW50Ok91fSxuYW1lc3BhY2U6c319LGFwaWRvbV9uc19qc29uX3NjaGVtYV9kcmFmdF82X3NyY19yZWZyYWN0b3JfcmVmcmFjdD0ocyx7c3BlY1BhdGg6bz1bInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsIiR2aXNpdG9yIl0scGx1Z2luczppPVtdLHNwZWNpZmljYXRpb25PYmo6YT1wU309e30pPT57Y29uc3QgdT0oMCx2dS5lKShzKSxfPWRlcmVmZXJlbmNlKGEpLHc9bmV3KEd1KG8sXykpKHtzcGVjT2JqOl99KTtyZXR1cm4gdmlzaXRvcl92aXNpdCh1LHcpLGRpc3BhdGNoUGx1Z2luc1N5bmMody5lbGVtZW50LGkse3Rvb2xib3hDcmVhdG9yOmFwaWRvbV9uc19qc29uX3NjaGVtYV9kcmFmdF82X3NyY19yZWZyYWN0b3JfdG9vbGJveCx2aXNpdG9yT3B0aW9uczp7a2V5TWFwOmhTLG5vZGVUeXBlR2V0dGVyOnRyYXZlcnNhbF92aXNpdG9yX2dldE5vZGVUeXBlfX0pfSxhcGlkb21fbnNfanNvbl9zY2hlbWFfZHJhZnRfNl9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3Rvcj1zPT4obyxpPXt9KT0+YXBpZG9tX25zX2pzb25fc2NoZW1hX2RyYWZ0XzZfc3JjX3JlZnJhY3Rvcl9yZWZyYWN0KG8se3NwZWNQYXRoOnMsLi4uaX0pO3FiLnJlZnJhY3Q9YXBpZG9tX25zX2pzb25fc2NoZW1hX2RyYWZ0XzZfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCIkdmlzaXRvciJdKSx6Yi5yZWZyYWN0PWFwaWRvbV9uc19qc29uX3NjaGVtYV9kcmFmdF82X3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJMaW5rRGVzY3JpcHRpb24iLCIkdmlzaXRvciJdKTtjb25zdCB5Uz1jbGFzcyBlbGVtZW50c19KU09OU2NoZW1hX0pTT05TY2hlbWEgZXh0ZW5kcyBxYntjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0iSlNPTlNjaGVtYURyYWZ0NyJ9Z2V0ICRjb21tZW50KCl7cmV0dXJuIHRoaXMuZ2V0KCIkY29tbWVudCIpfXNldCAkY29tbWVudChzKXt0aGlzLnNldCgiJGNvbW1lbnQiLHMpfWdldCBpdGVtcygpe3JldHVybiB0aGlzLmdldCgiaXRlbXMiKX1zZXQgaXRlbXMocyl7dGhpcy5zZXQoIml0ZW1zIixzKX1nZXQgaWYoKXtyZXR1cm4gdGhpcy5nZXQoImlmIil9c2V0IGlmKHMpe3RoaXMuc2V0KCJpZiIscyl9Z2V0IHRoZW4oKXtyZXR1cm4gdGhpcy5nZXQoInRoZW4iKX1zZXQgdGhlbihzKXt0aGlzLnNldCgidGhlbiIscyl9Z2V0IGVsc2UoKXtyZXR1cm4gdGhpcy5nZXQoImVsc2UiKX1zZXQgZWxzZShzKXt0aGlzLnNldCgiZWxzZSIscyl9Z2V0IG5vdCgpe3JldHVybiB0aGlzLmdldCgibm90Iil9c2V0IG5vdChzKXt0aGlzLnNldCgibm90IixzKX1nZXQgY29udGVudEVuY29kaW5nKCl7cmV0dXJuIHRoaXMuZ2V0KCJjb250ZW50RW5jb2RpbmciKX1zZXQgY29udGVudEVuY29kaW5nKHMpe3RoaXMuc2V0KCJjb250ZW50RW5jb2RpbmciLHMpfWdldCBjb250ZW50TWVkaWFUeXBlKCl7cmV0dXJuIHRoaXMuZ2V0KCJjb250ZW50TWVkaWFUeXBlIil9c2V0IGNvbnRlbnRNZWRpYVR5cGUocyl7dGhpcy5zZXQoImNvbnRlbnRNZWRpYVR5cGUiLHMpfWdldCBtZWRpYSgpe3Rocm93IG5ldyBLaCgnbWVkaWEga2V5d29yZCBmcm9tIEh5cGVyLVNjaGVtYSB2b2NhYnVsYXJ5IGhhcyBiZWVuIG1vdmVkIHRvIHZhbGlkYXRpb24gdm9jYWJ1bGFyeSBhcyAiY29udGVudE1lZGlhVHlwZSIgLyAiY29udGVudEVuY29kaW5nIicpfXNldCBtZWRpYShzKXt0aHJvdyBuZXcgS2goJ21lZGlhIGtleXdvcmQgZnJvbSBIeXBlci1TY2hlbWEgdm9jYWJ1bGFyeSBoYXMgYmVlbiBtb3ZlZCB0byB2YWxpZGF0aW9uIHZvY2FidWxhcnkgYXMgImNvbnRlbnRNZWRpYVR5cGUiIC8gImNvbnRlbnRFbmNvZGluZyInKX1nZXQgd3JpdGVPbmx5KCl7cmV0dXJuIHRoaXMuZ2V0KCJ3cml0ZU9ubHkiKX1zZXQgd3JpdGVPbmx5KHMpe3RoaXMuc2V0KCJ3cml0ZU9ubHkiLHMpfX07Y29uc3QgdlM9Y2xhc3MgZWxlbWVudHNfTGlua0Rlc2NyaXB0aW9uX0xpbmtEZXNjcmlwdGlvbiBleHRlbmRzIHpie2dldCBhbmNob3IoKXtyZXR1cm4gdGhpcy5nZXQoImFuY2hvciIpfXNldCBhbmNob3Iocyl7dGhpcy5zZXQoImFuY2hvciIscyl9Z2V0IGFuY2hvclBvaW50ZXIoKXtyZXR1cm4gdGhpcy5nZXQoImFuY2hvclBvaW50ZXIiKX1zZXQgYW5jaG9yUG9pbnRlcihzKXt0aGlzLnNldCgiYW5jaG9yUG9pbnRlciIscyl9Z2V0IHRlbXBsYXRlUG9pbnRlcnMoKXtyZXR1cm4gdGhpcy5nZXQoInRlbXBsYXRlUG9pbnRlcnMiKX1zZXQgdGVtcGxhdGVQb2ludGVycyhzKXt0aGlzLnNldCgidGVtcGxhdGVQb2ludGVycyIscyl9Z2V0IHRlbXBsYXRlUmVxdWlyZWQoKXtyZXR1cm4gdGhpcy5nZXQoInRlbXBsYXRlUmVxdWlyZWQiKX1zZXQgdGVtcGxhdGVSZXF1aXJlZChzKXt0aGlzLnNldCgidGVtcGxhdGVSZXF1aXJlZCIscyl9Z2V0IHRhcmdldFNjaGVtYSgpe3JldHVybiB0aGlzLmdldCgidGFyZ2V0U2NoZW1hIil9c2V0IHRhcmdldFNjaGVtYShzKXt0aGlzLnNldCgidGFyZ2V0U2NoZW1hIixzKX1nZXQgbWVkaWFUeXBlKCl7dGhyb3cgbmV3IEtoKCJtZWRpYVR5cGUga2V5d29yZCBmcm9tIEh5cGVyLVNjaGVtYSB2b2NhYnVsYXJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gdGFyZ2V0TWVkaWFUeXBlLiIpfXNldCBtZWRpYVR5cGUocyl7dGhyb3cgbmV3IEtoKCJtZWRpYVR5cGUga2V5d29yZCBmcm9tIEh5cGVyLVNjaGVtYSB2b2NhYnVsYXJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gdGFyZ2V0TWVkaWFUeXBlLiIpfWdldCB0YXJnZXRNZWRpYVR5cGUoKXtyZXR1cm4gdGhpcy5nZXQoInRhcmdldE1lZGlhVHlwZSIpfXNldCB0YXJnZXRNZWRpYVR5cGUocyl7dGhpcy5zZXQoInRhcmdldE1lZGlhVHlwZSIscyl9Z2V0IHRhcmdldEhpbnRzKCl7cmV0dXJuIHRoaXMuZ2V0KCJ0YXJnZXRIaW50cyIpfXNldCB0YXJnZXRIaW50cyhzKXt0aGlzLnNldCgidGFyZ2V0SGludHMiLHMpfWdldCBkZXNjcmlwdGlvbigpe3JldHVybiB0aGlzLmdldCgiZGVzY3JpcHRpb24iKX1zZXQgZGVzY3JpcHRpb24ocyl7dGhpcy5zZXQoImRlc2NyaXB0aW9uIixzKX1nZXQgJGNvbW1lbnQoKXtyZXR1cm4gdGhpcy5nZXQoIiRjb21tZW50Iil9c2V0ICRjb21tZW50KHMpe3RoaXMuc2V0KCIkY29tbWVudCIscyl9Z2V0IGhyZWZTY2hlbWEoKXtyZXR1cm4gdGhpcy5nZXQoImhyZWZTY2hlbWEiKX1zZXQgaHJlZlNjaGVtYShzKXt0aGlzLnNldCgiaHJlZlNjaGVtYSIscyl9Z2V0IGhlYWRlclNjaGVtYSgpe3JldHVybiB0aGlzLmdldCgiaGVhZGVyU2NoZW1hIil9c2V0IGhlYWRlclNjaGVtYShzKXt0aGlzLnNldCgiaGVhZGVyU2NoZW1hIixzKX1nZXQgc3VibWlzc2lvblNjaGVtYSgpe3JldHVybiB0aGlzLmdldCgic3VibWlzc2lvblNjaGVtYSIpfXNldCBzdWJtaXNzaW9uU2NoZW1hKHMpe3RoaXMuc2V0KCJzdWJtaXNzaW9uU2NoZW1hIixzKX1nZXQgc3VibWlzc2lvbkVuY1R5cGUoKXt0aHJvdyBuZXcgS2goInN1Ym1pc3Npb25FbmNUeXBlIGtleXdvcmQgZnJvbSBIeXBlci1TY2hlbWEgdm9jYWJ1bGFyeSBoYXMgYmVlbiByZW5hbWVkIHRvIHN1Ym1pc3Npb25NZWRpYVR5cGUuIil9c2V0IHN1Ym1pc3Npb25FbmNUeXBlKHMpe3Rocm93IG5ldyBLaCgic3VibWlzc2lvbkVuY1R5cGUga2V5d29yZCBmcm9tIEh5cGVyLVNjaGVtYSB2b2NhYnVsYXJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gc3VibWlzc2lvbk1lZGlhVHlwZS4iKX1nZXQgc3VibWlzc2lvbk1lZGlhVHlwZSgpe3JldHVybiB0aGlzLmdldCgic3VibWlzc2lvbk1lZGlhVHlwZSIpfXNldCBzdWJtaXNzaW9uTWVkaWFUeXBlKHMpe3RoaXMuc2V0KCJzdWJtaXNzaW9uTWVkaWFUeXBlIixzKX19O2NvbnN0IGJTPWNsYXNzIHZpc2l0b3JzX2pzb25fc2NoZW1hX0pTT05TY2hlbWFWaXNpdG9yIGV4dGVuZHMgYVN7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB5U31nZXQgZGVmYXVsdERpYWxlY3RJZGVudGlmaWVyKCl7cmV0dXJuImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hIyJ9fTtjb25zdCBTUz1jbGFzcyBqc29uX3NjaGVtYV9saW5rX2Rlc2NyaXB0aW9uX0xpbmtEZXNjcmlwdGlvblZpc2l0b3IgZXh0ZW5kcyB1U3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHZTfX0sX1M9cGlwZShlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsIiR2aXNpdG9yIl0sYlMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCIkY29tbWVudCJdLHBTLnZpc2l0b3JzLnZhbHVlKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwiaWYiXSxwUy52aXNpdG9ycy5KU09OU2NoZW1hT3JKU09OUmVmZXJlbmNlVmlzaXRvciksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsInRoZW4iXSxwUy52aXNpdG9ycy5KU09OU2NoZW1hT3JKU09OUmVmZXJlbmNlVmlzaXRvciksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsImVsc2UiXSxwUy52aXNpdG9ycy5KU09OU2NoZW1hT3JKU09OUmVmZXJlbmNlVmlzaXRvciksaVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsIm1lZGlhIl0pLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJjb250ZW50RW5jb2RpbmciXSxwUy52aXNpdG9ycy52YWx1ZSksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsImNvbnRlbnRNZWRpYVR5cGUiXSxwUy52aXNpdG9ycy52YWx1ZSksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsIndyaXRlT25seSJdLHBTLnZpc2l0b3JzLnZhbHVlKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiJHZpc2l0b3IiXSxTUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsImZpeGVkRmllbGRzIiwiYW5jaG9yIl0scFMudmlzaXRvcnMudmFsdWUpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJMaW5rRGVzY3JpcHRpb24iLCJmaXhlZEZpZWxkcyIsImFuY2hvclBvaW50ZXIiXSxwUy52aXNpdG9ycy52YWx1ZSksaVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsImZpeGVkRmllbGRzIiwibWVkaWFUeXBlIl0pLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJMaW5rRGVzY3JpcHRpb24iLCJmaXhlZEZpZWxkcyIsInRhcmdldE1lZGlhVHlwZSJdLHBTLnZpc2l0b3JzLnZhbHVlKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiZml4ZWRGaWVsZHMiLCJ0YXJnZXRIaW50cyJdLHBTLnZpc2l0b3JzLnZhbHVlKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiZml4ZWRGaWVsZHMiLCJkZXNjcmlwdGlvbiJdLHBTLnZpc2l0b3JzLnZhbHVlKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiZml4ZWRGaWVsZHMiLCIkY29tbWVudCJdLHBTLnZpc2l0b3JzLnZhbHVlKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiZml4ZWRGaWVsZHMiLCJoZWFkZXJTY2hlbWEiXSxwUy52aXNpdG9ycy5KU09OU2NoZW1hT3JKU09OUmVmZXJlbmNlVmlzaXRvciksaVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsImZpeGVkRmllbGRzIiwic3VibWlzc2lvbkVuY1R5cGUiXSksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsImZpeGVkRmllbGRzIiwic3VibWlzc2lvbk1lZGlhVHlwZSJdLHBTLnZpc2l0b3JzLnZhbHVlKSkocFMpLEVTPXtKU09OU2NoZW1hRHJhZnQ3RWxlbWVudDpbImNvbnRlbnQiXSxKU09OUmVmZXJlbmNlRWxlbWVudDpbImNvbnRlbnQiXSxMaW5rRGVzY3JpcHRpb25FbGVtZW50OlsiY29udGVudCJdLC4uLmVwfSx3Uz1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIHlTfHxzKGEpJiZvKCJKU09OU2NoZW1hRHJhZnQ3IixhKSYmaSgib2JqZWN0IixhKSkpLHhTPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgdlN8fHMoYSkmJm8oImxpbmtEZXNjcmlwdGlvbiIsYSkmJmkoIm9iamVjdCIsYSkpKSxrUz17bmFtZXNwYWNlOnM9Pntjb25zdHtiYXNlOm99PXM7cmV0dXJuIG8ucmVnaXN0ZXIoImpTT05TY2hlbWFEcmFmdDciLHlTKSxvLnJlZ2lzdGVyKCJqU09OUmVmZXJlbmNlIixRaCksby5yZWdpc3RlcigibGlua0Rlc2NyaXB0aW9uIix2Uyksb319LE9TPWtTLGFwaWRvbV9uc19qc29uX3NjaGVtYV9kcmFmdF83X3NyY19yZWZyYWN0b3JfdG9vbGJveD0oKT0+e2NvbnN0IHM9Y3JlYXRlTmFtZXNwYWNlKE9TKTtyZXR1cm57cHJlZGljYXRlczp7Li4ucGUsaXNTdHJpbmdFbGVtZW50Ok91fSxuYW1lc3BhY2U6c319LGFwaWRvbV9uc19qc29uX3NjaGVtYV9kcmFmdF83X3NyY19yZWZyYWN0b3JfcmVmcmFjdD0ocyx7c3BlY1BhdGg6bz1bInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsIiR2aXNpdG9yIl0scGx1Z2luczppPVtdLHNwZWNpZmljYXRpb25PYmo6YT1fU309e30pPT57Y29uc3QgdT0oMCx2dS5lKShzKSxfPWRlcmVmZXJlbmNlKGEpLHc9bmV3KEd1KG8sXykpKHtzcGVjT2JqOl99KTtyZXR1cm4gdmlzaXRvcl92aXNpdCh1LHcpLGRpc3BhdGNoUGx1Z2luc1N5bmMody5lbGVtZW50LGkse3Rvb2xib3hDcmVhdG9yOmFwaWRvbV9uc19qc29uX3NjaGVtYV9kcmFmdF83X3NyY19yZWZyYWN0b3JfdG9vbGJveCx2aXNpdG9yT3B0aW9uczp7a2V5TWFwOkVTLG5vZGVUeXBlR2V0dGVyOnRyYXZlcnNhbF92aXNpdG9yX2dldE5vZGVUeXBlfX0pfSxhcGlkb21fbnNfanNvbl9zY2hlbWFfZHJhZnRfN19zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3Rvcj1zPT4obyxpPXt9KT0+YXBpZG9tX25zX2pzb25fc2NoZW1hX2RyYWZ0Xzdfc3JjX3JlZnJhY3Rvcl9yZWZyYWN0KG8se3NwZWNQYXRoOnMsLi4uaX0pO3lTLnJlZnJhY3Q9YXBpZG9tX25zX2pzb25fc2NoZW1hX2RyYWZ0Xzdfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCIkdmlzaXRvciJdKSx2Uy5yZWZyYWN0PWFwaWRvbV9uc19qc29uX3NjaGVtYV9kcmFmdF83X3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJMaW5rRGVzY3JpcHRpb24iLCIkdmlzaXRvciJdKTtjb25zdCBBUz1jbGFzcyBzcmNfZWxlbWVudHNfSlNPTlNjaGVtYV9KU09OU2NoZW1hIGV4dGVuZHMgeVN7Y29uc3RydWN0b3IocyxvLGkpe3N1cGVyKHMsbyxpKSx0aGlzLmVsZW1lbnQ9IkpTT05TY2hlbWEyMDE5MDkifWdldCAkdm9jYWJ1bGFyeSgpe3JldHVybiB0aGlzLmdldCgiJHZvY2FidWxhcnkiKX1zZXQgJHZvY2FidWxhcnkocyl7dGhpcy5zZXQoIiR2b2NhYnVsYXJ5IixzKX1nZXQgJGFuY2hvcigpe3JldHVybiB0aGlzLmdldCgiJGFuY2hvciIpfXNldCAkYW5jaG9yKHMpe3RoaXMuc2V0KCIkYW5jaG9yIixzKX1nZXQgJHJlY3Vyc2l2ZUFuY2hvcigpe3JldHVybiB0aGlzLmdldCgiJHJlY3Vyc2l2ZUFuY2hvciIpfXNldCAkcmVjdXJzaXZlQW5jaG9yKHMpe3RoaXMuc2V0KCIkcmVjdXJzaXZlQW5jaG9yIixzKX1nZXQgJHJlY3Vyc2l2ZVJlZigpe3JldHVybiB0aGlzLmdldCgiJHJlY3Vyc2l2ZVJlZiIpfXNldCAkcmVjdXJzaXZlUmVmKHMpe3RoaXMuc2V0KCIkcmVjdXJzaXZlUmVmIixzKX1nZXQgJHJlZigpe3JldHVybiB0aGlzLmdldCgiJHJlZiIpfXNldCAkcmVmKHMpe3RoaXMuc2V0KCIkcmVmIixzKX1nZXQgJGRlZnMoKXtyZXR1cm4gdGhpcy5nZXQoIiRkZWZzIil9c2V0ICRkZWZzKHMpe3RoaXMuc2V0KCIkZGVmcyIscyl9Z2V0IGRlZmluaXRpb25zKCl7dGhyb3cgbmV3IEtoKCJkZWZpbml0aW9ucyBrZXl3b3JkIGZyb20gVmFsaWRhdGlvbiB2b2NhYnVsYXJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gJGRlZnMuIil9c2V0IGRlZmluaXRpb25zKHMpe3Rocm93IG5ldyBLaCgiZGVmaW5pdGlvbnMga2V5d29yZCBmcm9tIFZhbGlkYXRpb24gdm9jYWJ1bGFyeSBoYXMgYmVlbiByZW5hbWVkIHRvICRkZWZzLiIpfWdldCBub3QoKXtyZXR1cm4gdGhpcy5nZXQoIm5vdCIpfXNldCBub3Qocyl7dGhpcy5zZXQoIm5vdCIscyl9Z2V0IGlmKCl7cmV0dXJuIHRoaXMuZ2V0KCJpZiIpfXNldCBpZihzKXt0aGlzLnNldCgiaWYiLHMpfWdldCB0aGVuKCl7cmV0dXJuIHRoaXMuZ2V0KCJ0aGVuIil9c2V0IHRoZW4ocyl7dGhpcy5zZXQoInRoZW4iLHMpfWdldCBlbHNlKCl7cmV0dXJuIHRoaXMuZ2V0KCJlbHNlIil9c2V0IGVsc2Uocyl7dGhpcy5zZXQoImVsc2UiLHMpfWdldCBkZXBlbmRlbnRTY2hlbWFzKCl7cmV0dXJuIHRoaXMuZ2V0KCJkZXBlbmRlbnRTY2hlbWFzIil9c2V0IGRlcGVuZGVudFNjaGVtYXMocyl7dGhpcy5zZXQoImRlcGVuZGVudFNjaGVtYXMiLHMpfWdldCBkZXBlbmRlbmNpZXMoKXt0aHJvdyBuZXcgS2goImRlcGVuZGVuY2llcyBrZXl3b3JkIGZyb20gVmFsaWRhdGlvbiB2b2NhYnVsYXJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gZGVwZW5kZW50U2NoZW1hcy4iKX1zZXQgZGVwZW5kZW5jaWVzKHMpe3Rocm93IG5ldyBLaCgiZGVwZW5kZW5jaWVzIGtleXdvcmQgZnJvbSBWYWxpZGF0aW9uIHZvY2FidWxhcnkgaGFzIGJlZW4gcmVuYW1lZCB0byBkZXBlbmRlbnRTY2hlbWFzLiIpfWdldCBpdGVtcygpe3JldHVybiB0aGlzLmdldCgiaXRlbXMiKX1zZXQgaXRlbXMocyl7dGhpcy5zZXQoIml0ZW1zIixzKX1nZXQgY29udGFpbnNQcm9wKCl7cmV0dXJuIHRoaXMuZ2V0KCJjb250YWlucyIpfXNldCBjb250YWluc1Byb3Aocyl7dGhpcy5zZXQoImNvbnRhaW5zIixzKX1nZXQgYWRkaXRpb25hbFByb3BlcnRpZXMoKXtyZXR1cm4gdGhpcy5nZXQoImFkZGl0aW9uYWxQcm9wZXJ0aWVzIil9c2V0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzKHMpe3RoaXMuc2V0KCJhZGRpdGlvbmFsUHJvcGVydGllcyIscyl9Z2V0IGFkZGl0aW9uYWxJdGVtcygpe3JldHVybiB0aGlzLmdldCgiYWRkaXRpb25hbEl0ZW1zIil9c2V0IGFkZGl0aW9uYWxJdGVtcyhzKXt0aGlzLnNldCgiYWRkaXRpb25hbEl0ZW1zIixzKX1nZXQgcHJvcGVydHlOYW1lcygpe3JldHVybiB0aGlzLmdldCgicHJvcGVydHlOYW1lcyIpfXNldCBwcm9wZXJ0eU5hbWVzKHMpe3RoaXMuc2V0KCJwcm9wZXJ0eU5hbWVzIixzKX1nZXQgdW5ldmFsdWF0ZWRJdGVtcygpe3JldHVybiB0aGlzLmdldCgidW5ldmFsdWF0ZWRJdGVtcyIpfXNldCB1bmV2YWx1YXRlZEl0ZW1zKHMpe3RoaXMuc2V0KCJ1bmV2YWx1YXRlZEl0ZW1zIixzKX1nZXQgdW5ldmFsdWF0ZWRQcm9wZXJ0aWVzKCl7cmV0dXJuIHRoaXMuZ2V0KCJ1bmV2YWx1YXRlZFByb3BlcnRpZXMiKX1zZXQgdW5ldmFsdWF0ZWRQcm9wZXJ0aWVzKHMpe3RoaXMuc2V0KCJ1bmV2YWx1YXRlZFByb3BlcnRpZXMiLHMpfWdldCBtYXhDb250YWlucygpe3JldHVybiB0aGlzLmdldCgibWF4Q29udGFpbnMiKX1zZXQgbWF4Q29udGFpbnMocyl7dGhpcy5zZXQoIm1heENvbnRhaW5zIixzKX1nZXQgbWluQ29udGFpbnMoKXtyZXR1cm4gdGhpcy5nZXQoIm1pbkNvbnRhaW5zIil9c2V0IG1pbkNvbnRhaW5zKHMpe3RoaXMuc2V0KCJtaW5Db250YWlucyIscyl9Z2V0IGRlcGVuZGVudFJlcXVpcmVkKCl7cmV0dXJuIHRoaXMuZ2V0KCJkZXBlbmRlbnRSZXF1aXJlZCIpfXNldCBkZXBlbmRlbnRSZXF1aXJlZChzKXt0aGlzLnNldCgiZGVwZW5kZW50UmVxdWlyZWQiLHMpfWdldCBkZXByZWNhdGVkKCl7cmV0dXJuIHRoaXMuZ2V0KCJkZXByZWNhdGVkIil9c2V0IGRlcHJlY2F0ZWQocyl7dGhpcy5zZXQoImRlcHJlY2F0ZWQiLHMpfWdldCBjb250ZW50U2NoZW1hKCl7cmV0dXJuIHRoaXMuZ2V0KCJjb250ZW50U2NoZW1hIil9c2V0IGNvbnRlbnRTY2hlbWEocyl7dGhpcy5zZXQoImNvbnRlbnRTY2hlbWEiLHMpfX07Y29uc3QgQ1M9Y2xhc3Mgc3JjX2VsZW1lbnRzX0xpbmtEZXNjcmlwdGlvbl9MaW5rRGVzY3JpcHRpb24gZXh0ZW5kcyB2U3tnZXQgdGFyZ2V0U2NoZW1hKCl7cmV0dXJuIHRoaXMuZ2V0KCJ0YXJnZXRTY2hlbWEiKX1zZXQgdGFyZ2V0U2NoZW1hKHMpe3RoaXMuc2V0KCJ0YXJnZXRTY2hlbWEiLHMpfWdldCBocmVmU2NoZW1hKCl7cmV0dXJuIHRoaXMuZ2V0KCJocmVmU2NoZW1hIil9c2V0IGhyZWZTY2hlbWEocyl7dGhpcy5zZXQoImhyZWZTY2hlbWEiLHMpfWdldCBoZWFkZXJTY2hlbWEoKXtyZXR1cm4gdGhpcy5nZXQoImhlYWRlclNjaGVtYSIpfXNldCBoZWFkZXJTY2hlbWEocyl7dGhpcy5zZXQoImhlYWRlclNjaGVtYSIscyl9Z2V0IHN1Ym1pc3Npb25TY2hlbWEoKXtyZXR1cm4gdGhpcy5nZXQoInN1Ym1pc3Npb25TY2hlbWEiKX1zZXQgc3VibWlzc2lvblNjaGVtYShzKXt0aGlzLnNldCgic3VibWlzc2lvblNjaGVtYSIscyl9fTtjb25zdCBqUz1jbGFzcyByZWZyYWN0b3JfdmlzaXRvcnNfanNvbl9zY2hlbWFfSlNPTlNjaGVtYVZpc2l0b3IgZXh0ZW5kcyBiU3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IEFTfWdldCBkZWZhdWx0RGlhbGVjdElkZW50aWZpZXIoKXtyZXR1cm4iaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQvMjAxOS0wOS9zY2hlbWEifU9iamVjdEVsZW1lbnQocyl7dGhpcy5oYW5kbGVEaWFsZWN0SWRlbnRpZmllcihzKSx0aGlzLmhhbmRsZVNjaGVtYUlkZW50aWZpZXIocyksdGhpcy5wYXJlbnQ9dGhpcy5lbGVtZW50O2NvbnN0IG89SWQucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiBPdSh0aGlzLmVsZW1lbnQuJHJlZikmJih0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJyZWZlcmVuY2UtZWxlbWVudCIpLHRoaXMuZWxlbWVudC5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInNjaGVtYSIpKSxvfX07Y29uc3QgUFM9Y2xhc3MgJHZvY2FidWxhcnlWaXNpdG9yIGV4dGVuZHMgdWR7T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPXN1cGVyLmVudGVyKHMpO3JldHVybiB0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS0kdm9jYWJ1bGFyeSIpLG99fTtjb25zdCBJUz1jbGFzcyAkcmVmVmlzaXRvciBleHRlbmRzIHVke1N0cmluZ0VsZW1lbnQocyl7Y29uc3Qgbz1zdXBlci5lbnRlcihzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgicmVmZXJlbmNlLXZhbHVlIiksb319O2NsYXNzICRkZWZzVmlzaXRvciBleHRlbmRzKE1peGluKFVkLFRkLHVkKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB2dS5TaCx0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS0kZGVmcyIpLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIl0pfX1jb25zdCBUUz0kZGVmc1Zpc2l0b3I7Y2xhc3MganNvbl9zY2hlbWFfQWxsT2ZWaXNpdG9yX0FsbE9mVmlzaXRvciBleHRlbmRzKE1peGluKENkLFRkLHVkKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB2dS53RSx0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS1hbGxPZiIpfUFycmF5RWxlbWVudChzKXtyZXR1cm4gcy5mb3JFYWNoKChzPT57Y29uc3Qgbz10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChbImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiXSxzKTt0aGlzLmVsZW1lbnQucHVzaChvKX0pKSx0aGlzLmNvcHlNZXRhQW5kQXR0cmlidXRlcyhzLHRoaXMuZWxlbWVudCksRnV9fWNvbnN0IE5TPWpzb25fc2NoZW1hX0FsbE9mVmlzaXRvcl9BbGxPZlZpc2l0b3I7Y2xhc3MganNvbl9zY2hlbWFfQW55T2ZWaXNpdG9yX0FueU9mVmlzaXRvciBleHRlbmRzKE1peGluKENkLFRkLHVkKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB2dS53RSx0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS1hbnlPZiIpfUFycmF5RWxlbWVudChzKXtyZXR1cm4gcy5mb3JFYWNoKChzPT57Y29uc3Qgbz10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChbImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiXSxzKTt0aGlzLmVsZW1lbnQucHVzaChvKX0pKSx0aGlzLmNvcHlNZXRhQW5kQXR0cmlidXRlcyhzLHRoaXMuZWxlbWVudCksRnV9fWNvbnN0IE1TPWpzb25fc2NoZW1hX0FueU9mVmlzaXRvcl9BbnlPZlZpc2l0b3I7Y2xhc3MganNvbl9zY2hlbWFfT25lT2ZWaXNpdG9yX09uZU9mVmlzaXRvciBleHRlbmRzKE1peGluKENkLFRkLHVkKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB2dS53RSx0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS1vbmVPZiIpfUFycmF5RWxlbWVudChzKXtyZXR1cm4gcy5mb3JFYWNoKChzPT57Y29uc3Qgbz10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChbImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiXSxzKTt0aGlzLmVsZW1lbnQucHVzaChvKX0pKSx0aGlzLmNvcHlNZXRhQW5kQXR0cmlidXRlcyhzLHRoaXMuZWxlbWVudCksRnV9fWNvbnN0IFJTPWpzb25fc2NoZW1hX09uZU9mVmlzaXRvcl9PbmVPZlZpc2l0b3I7Y2xhc3MgRGVwZW5kZW50U2NoZW1hc1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihVZCxUZCx1ZCkpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgdnUuU2gsdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgianNvbi1zY2hlbWEtZGVwZW5kZW50U2NoZW1hcyIpLHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIl0pfX1jb25zdCBEUz1EZXBlbmRlbnRTY2hlbWFzVmlzaXRvcjtjbGFzcyB2aXNpdG9yc19qc29uX3NjaGVtYV9JdGVtc1Zpc2l0b3JfSXRlbXNWaXNpdG9yIGV4dGVuZHMoTWl4aW4oQ2QsVGQsdWQpKXtPYmplY3RFbGVtZW50KHMpe3JldHVybiB0aGlzLmVsZW1lbnQ9dGhpcy50b1JlZnJhY3RlZEVsZW1lbnQoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIl0scyksRnV9QXJyYXlFbGVtZW50KHMpe3JldHVybiB0aGlzLmVsZW1lbnQ9bmV3IHZ1LndFLHRoaXMuZWxlbWVudC5jbGFzc2VzLnB1c2goImpzb24tc2NoZW1hLWl0ZW1zIikscy5mb3JFYWNoKChzPT57Y29uc3Qgbz10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChbImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiXSxzKTt0aGlzLmVsZW1lbnQucHVzaChvKX0pKSx0aGlzLmNvcHlNZXRhQW5kQXR0cmlidXRlcyhzLHRoaXMuZWxlbWVudCksRnV9Qm9vbGVhbkVsZW1lbnQocyl7cmV0dXJuIHRoaXMuZWxlbWVudD10aGlzLnRvUmVmcmFjdGVkRWxlbWVudChbImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiXSxzKSxGdX19Y29uc3QgTFM9dmlzaXRvcnNfanNvbl9zY2hlbWFfSXRlbXNWaXNpdG9yX0l0ZW1zVmlzaXRvcjtjbGFzcyBqc29uX3NjaGVtYV9Qcm9wZXJ0aWVzVmlzaXRvcl9Qcm9wZXJ0aWVzVmlzaXRvciBleHRlbmRzKE1peGluKFVkLFRkLHVkKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB2dS5TaCx0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJqc29uLXNjaGVtYS1wcm9wZXJ0aWVzIiksdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiXSl9fWNvbnN0IEZTPWpzb25fc2NoZW1hX1Byb3BlcnRpZXNWaXNpdG9yX1Byb3BlcnRpZXNWaXNpdG9yO2NsYXNzIFBhdHRlcm5Qcm9wZXJ0aWVzVmlzaXRvcl9QYXR0ZXJuUHJvcGVydGllc1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihVZCxUZCx1ZCkpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgdnUuU2gsdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgianNvbi1zY2hlbWEtcGF0dGVyblByb3BlcnRpZXMiKSx0aGlzLnNwZWNQYXRoPWxjKFsiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSJdKX19Y29uc3QgQlM9UGF0dGVyblByb3BlcnRpZXNWaXNpdG9yX1BhdHRlcm5Qcm9wZXJ0aWVzVmlzaXRvcjtjb25zdCAkUz1jbGFzcyBEZXBlbmRlbnRSZXF1aXJlZFZpc2l0b3IgZXh0ZW5kcyB1ZHtPYmplY3RFbGVtZW50KHMpe2NvbnN0IG89c3VwZXIuZW50ZXIocyk7cmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc2VzLnB1c2goImpzb24tc2NoZW1hLWRlcGVuZGVudFJlcXVpcmVkIiksb319O2NvbnN0IHFTPWNsYXNzIHZpc2l0b3JzX2pzb25fc2NoZW1hX2xpbmtfZGVzY3JpcHRpb25fTGlua0Rlc2NyaXB0aW9uVmlzaXRvciBleHRlbmRzIFNTe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgQ1N9fSxVUz1waXBlKGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiJHZpc2l0b3IiXSxqUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsIiR2b2NhYnVsYXJ5Il0sUFMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCIkYW5jaG9yIl0sX1MudmlzaXRvcnMudmFsdWUpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCIkcmVjdXJzaXZlQW5jaG9yIl0sX1MudmlzaXRvcnMudmFsdWUpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCIkcmVjdXJzaXZlUmVmIl0sX1MudmlzaXRvcnMudmFsdWUpLGlTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OUmVmZXJlbmNlIiwiJHZpc2l0b3IiXSksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsIiRyZWYiXSxJUyksaVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsImRlZmluaXRpb25zIl0pLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCIkZGVmcyJdLFRTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwiYWxsT2YiXSxOUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsImFueU9mIl0sTVMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJvbmVPZiJdLFJTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwibm90Il0salMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJpZiJdLGpTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwidGhlbiJdLGpTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwiZWxzZSJdLGpTKSxpUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwiZGVwZW5kZW5jaWVzIl0pLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJkZXBlbmRlbnRTY2hlbWFzIl0sRFMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJpdGVtcyJdLExTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwiY29udGFpbnMiXSxqUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsInByb3BlcnRpZXMiXSxGUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsInBhdHRlcm5Qcm9wZXJ0aWVzIl0sQlMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJhZGRpdGlvbmFsUHJvcGVydGllcyJdLGpTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwiYWRkaXRpb25hbEl0ZW1zIl0salMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJwcm9wZXJ0eU5hbWVzIl0salMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJ1bmV2YWx1YXRlZEl0ZW1zIl0salMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJ1bmV2YWx1YXRlZFByb3BlcnRpZXMiXSxqUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsIm1heENvbnRhaW5zIl0sX1MudmlzaXRvcnMudmFsdWUpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJtaW5Db250YWlucyJdLF9TLnZpc2l0b3JzLnZhbHVlKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwiZGVwZW5kZW50UmVxdWlyZWQiXSwkUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsImRlcHJlY2F0ZWQiXSxfUy52aXNpdG9ycy52YWx1ZSksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsImNvbnRlbnRTY2hlbWEiXSxqUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsIiR2aXNpdG9yIl0scVMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJMaW5rRGVzY3JpcHRpb24iLCJmaXhlZEZpZWxkcyIsInRhcmdldFNjaGVtYSJdLGpTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiZml4ZWRGaWVsZHMiLCJocmVmU2NoZW1hIl0salMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJMaW5rRGVzY3JpcHRpb24iLCJmaXhlZEZpZWxkcyIsImhlYWRlclNjaGVtYSJdLGpTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiZml4ZWRGaWVsZHMiLCJzdWJtaXNzaW9uU2NoZW1hIl0salMpKShfUyksVlM9e0pTT05TY2hlbWEyMDE5MDlFbGVtZW50OlsiY29udGVudCJdLExpbmtEZXNjcmlwdGlvbkVsZW1lbnQ6WyJjb250ZW50Il0sLi4uZXB9LHpTPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgQVN8fHMoYSkmJm8oIkpTT05TY2hlbWEyMDE5MDkiLGEpJiZpKCJvYmplY3QiLGEpKSksV1M9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBDU3x8cyhhKSYmbygibGlua0Rlc2NyaXB0aW9uIixhKSYmaSgib2JqZWN0IixhKSkpLEpTPXtuYW1lc3BhY2U6cz0+e2NvbnN0e2Jhc2U6b309cztyZXR1cm4gby5yZWdpc3RlcigialNPTlNjaGVtYTIwMTkwOSIsQVMpLG8ucmVnaXN0ZXIoImxpbmtEZXNjcmlwdGlvbiIsQ1MpLG99fSxIUz1KUyxhcGlkb21fbnNfanNvbl9zY2hlbWFfMjAxOV8wOV9zcmNfcmVmcmFjdG9yX3Rvb2xib3g9KCk9Pntjb25zdCBzPWNyZWF0ZU5hbWVzcGFjZShIUyk7cmV0dXJue3ByZWRpY2F0ZXM6ey4uLmRlLGlzU3RyaW5nRWxlbWVudDpPdX0sbmFtZXNwYWNlOnN9fSxhcGlkb21fbnNfanNvbl9zY2hlbWFfMjAxOV8wOV9zcmNfcmVmcmFjdG9yX3JlZnJhY3Q9KHMse3NwZWNQYXRoOm89WyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCIkdmlzaXRvciJdLHBsdWdpbnM6aT1bXSxzcGVjaWZpY2F0aW9uT2JqOmE9VVN9PXt9KT0+e2NvbnN0IHU9KDAsdnUuZSkocyksXz1kZXJlZmVyZW5jZShhKSx3PW5ldyhHdShvLF8pKSh7c3BlY09iajpffSk7cmV0dXJuIHZpc2l0b3JfdmlzaXQodSx3KSxkaXNwYXRjaFBsdWdpbnNTeW5jKHcuZWxlbWVudCxpLHt0b29sYm94Q3JlYXRvcjphcGlkb21fbnNfanNvbl9zY2hlbWFfMjAxOV8wOV9zcmNfcmVmcmFjdG9yX3Rvb2xib3gsdmlzaXRvck9wdGlvbnM6e2tleU1hcDpWUyxub2RlVHlwZUdldHRlcjp0cmF2ZXJzYWxfdmlzaXRvcl9nZXROb2RlVHlwZX19KX0sYXBpZG9tX25zX2pzb25fc2NoZW1hXzIwMTlfMDlfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3I9cz0+KG8saT17fSk9PmFwaWRvbV9uc19qc29uX3NjaGVtYV8yMDE5XzA5X3NyY19yZWZyYWN0b3JfcmVmcmFjdChvLHtzcGVjUGF0aDpzLC4uLml9KTtBUy5yZWZyYWN0PWFwaWRvbV9uc19qc29uX3NjaGVtYV8yMDE5XzA5X3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiJHZpc2l0b3IiXSksQ1MucmVmcmFjdD1hcGlkb21fbnNfanNvbl9zY2hlbWFfMjAxOV8wOV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiJHZpc2l0b3IiXSk7Y29uc3QgS1M9Y2xhc3MgYXBpZG9tX25zX2pzb25fc2NoZW1hXzIwMjBfMTJfc3JjX2VsZW1lbnRzX0pTT05TY2hlbWFfSlNPTlNjaGVtYSBleHRlbmRzIEFTe2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5lbGVtZW50PSJKU09OU2NoZW1hMjAyMDEyIn1nZXQgJGR5bmFtaWNBbmNob3IoKXtyZXR1cm4gdGhpcy5nZXQoIiRkeW5hbWljQW5jaG9yIil9c2V0ICRkeW5hbWljQW5jaG9yKHMpe3RoaXMuc2V0KCIkZHluYW1pY0FuY2hvciIscyl9Z2V0ICRyZWN1cnNpdmVBbmNob3IoKXt0aHJvdyBuZXcgS2goIiRyZWN1cnNpdmVBbmNob3Iga2V5d29yZCBmcm9tIENvcmUgdm9jYWJ1bGFyeSBoYXMgYmVlbiByZW5hbWVkIHRvICRkeW5hbWljQW5jaG9yLiIpfXNldCAkcmVjdXJzaXZlQW5jaG9yKHMpe3Rocm93IG5ldyBLaCgiJHJlY3Vyc2l2ZUFuY2hvciBrZXl3b3JkIGZyb20gQ29yZSB2b2NhYnVsYXJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gJGR5bmFtaWNBbmNob3IuIil9Z2V0ICRkeW5hbWljUmVmKCl7cmV0dXJuIHRoaXMuZ2V0KCIkZHluYW1pY1JlZiIpfXNldCAkZHluYW1pY1JlZihzKXt0aGlzLnNldCgiJGR5bmFtaWNSZWYiLHMpfWdldCAkcmVjdXJzaXZlUmVmKCl7dGhyb3cgbmV3IEtoKCIkcmVjdXJzaXZlUmVmIGtleXdvcmQgZnJvbSBDb3JlIHZvY2FidWxhcnkgaGFzIGJlZW4gcmVuYW1lZCB0byAkZHluYW1pY1JlZi4iKX1zZXQgJHJlY3Vyc2l2ZVJlZihzKXt0aHJvdyBuZXcgS2goIiRyZWN1cnNpdmVSZWYga2V5d29yZCBmcm9tIENvcmUgdm9jYWJ1bGFyeSBoYXMgYmVlbiByZW5hbWVkIHRvICRkeW5hbWljUmVmLiIpfWdldCBwcmVmaXhJdGVtcygpe3JldHVybiB0aGlzLmdldCgicHJlZml4SXRlbXMiKX1zZXQgcHJlZml4SXRlbXMocyl7dGhpcy5zZXQoInByZWZpeEl0ZW1zIixzKX19O2NvbnN0IEdTPWNsYXNzIGFwaWRvbV9uc19qc29uX3NjaGVtYV8yMDIwXzEyX3NyY19lbGVtZW50c19MaW5rRGVzY3JpcHRpb25fTGlua0Rlc2NyaXB0aW9uIGV4dGVuZHMgQ1N7Z2V0IHRhcmdldFNjaGVtYSgpe3JldHVybiB0aGlzLmdldCgidGFyZ2V0U2NoZW1hIil9c2V0IHRhcmdldFNjaGVtYShzKXt0aGlzLnNldCgidGFyZ2V0U2NoZW1hIixzKX1nZXQgaHJlZlNjaGVtYSgpe3JldHVybiB0aGlzLmdldCgiaHJlZlNjaGVtYSIpfXNldCBocmVmU2NoZW1hKHMpe3RoaXMuc2V0KCJocmVmU2NoZW1hIixzKX1nZXQgaGVhZGVyU2NoZW1hKCl7cmV0dXJuIHRoaXMuZ2V0KCJoZWFkZXJTY2hlbWEiKX1zZXQgaGVhZGVyU2NoZW1hKHMpe3RoaXMuc2V0KCJoZWFkZXJTY2hlbWEiLHMpfWdldCBzdWJtaXNzaW9uU2NoZW1hKCl7cmV0dXJuIHRoaXMuZ2V0KCJzdWJtaXNzaW9uU2NoZW1hIil9c2V0IHN1Ym1pc3Npb25TY2hlbWEocyl7dGhpcy5zZXQoInN1Ym1pc3Npb25TY2hlbWEiLHMpfX07Y29uc3QgWVM9Y2xhc3Mgc3JjX3JlZnJhY3Rvcl92aXNpdG9yc19qc29uX3NjaGVtYV9KU09OU2NoZW1hVmlzaXRvciBleHRlbmRzIGpTe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgS1N9Z2V0IGRlZmF1bHREaWFsZWN0SWRlbnRpZmllcigpe3JldHVybiJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC8yMDIwLTEyL3NjaGVtYSJ9fTtjbGFzcyBQcmVmaXhJdGVtc1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbihDZCxUZCx1ZCkpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgdnUud0UsdGhpcy5lbGVtZW50LmNsYXNzZXMucHVzaCgianNvbi1zY2hlbWEtcHJlZml4SXRlbXMiKX1BcnJheUVsZW1lbnQocyl7cmV0dXJuIHMuZm9yRWFjaCgocz0+e2NvbnN0IG89dGhpcy50b1JlZnJhY3RlZEVsZW1lbnQoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIl0scyk7dGhpcy5lbGVtZW50LnB1c2gobyl9KSksdGhpcy5jb3B5TWV0YUFuZEF0dHJpYnV0ZXMocyx0aGlzLmVsZW1lbnQpLEZ1fX1jb25zdCBYUz1QcmVmaXhJdGVtc1Zpc2l0b3I7Y29uc3QgUVM9Y2xhc3MgcmVmcmFjdG9yX3Zpc2l0b3JzX2pzb25fc2NoZW1hX2xpbmtfZGVzY3JpcHRpb25fTGlua0Rlc2NyaXB0aW9uVmlzaXRvciBleHRlbmRzIHFTe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgR1N9fSxaUz1waXBlKGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiJHZpc2l0b3IiXSxZUyksaVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsIiRyZWN1cnNpdmVBbmNob3IiXSksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsIiRkeW5hbWljQW5jaG9yIl0sVVMudmlzaXRvcnMudmFsdWUpLGlTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCIkcmVjdXJzaXZlUmVmIl0pLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCIkZHluYW1pY1JlZiJdLFVTLnZpc2l0b3JzLnZhbHVlKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwibm90Il0sWVMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJpZiJdLFlTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwidGhlbiJdLFlTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwiZWxzZSJdLFlTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwicHJlZml4SXRlbXMiXSxYUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsIml0ZW1zIl0sWVMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJjb250YWlucyJdLFlTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiXSxZUyksaVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkpTT05TY2hlbWEiLCJmaXhlZEZpZWxkcyIsImFkZGl0aW9uYWxJdGVtcyJdKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwicHJvcGVydHlOYW1lcyJdLFlTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwidW5ldmFsdWF0ZWRJdGVtcyJdLFlTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsImZpeGVkRmllbGRzIiwidW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIl0sWVMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiZml4ZWRGaWVsZHMiLCJjb250ZW50U2NoZW1hIl0sWVMpLGVTKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJMaW5rRGVzY3JpcHRpb24iLCIkdmlzaXRvciJdLFFTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiZml4ZWRGaWVsZHMiLCJ0YXJnZXRTY2hlbWEiXSxZUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsImZpeGVkRmllbGRzIiwiaHJlZlNjaGVtYSJdLFlTKSxlUyhbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGlua0Rlc2NyaXB0aW9uIiwiZml4ZWRGaWVsZHMiLCJoZWFkZXJTY2hlbWEiXSxZUyksZVMoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsImZpeGVkRmllbGRzIiwic3VibWlzc2lvblNjaGVtYSJdLFlTKSkoVVMpLGVfPXtKU09OU2NoZW1hMjAyMDEyRWxlbWVudDpbImNvbnRlbnQiXSxMaW5rRGVzY3JpcHRpb25FbGVtZW50OlsiY29udGVudCJdLC4uLmVwfSx0Xz1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIEtTfHxzKGEpJiZvKCJKU09OU2NoZW1hMjAyMDEyIixhKSYmaSgib2JqZWN0IixhKSkpLHJfPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgR1N8fHMoYSkmJm8oImxpbmtEZXNjcmlwdGlvbiIsYSkmJmkoIm9iamVjdCIsYSkpKSxuXz17bmFtZXNwYWNlOnM9Pntjb25zdHtiYXNlOm99PXM7cmV0dXJuIG8ucmVnaXN0ZXIoImpTT05TY2hlbWEyMDIwMTIiLEtTKSxvLnJlZ2lzdGVyKCJsaW5rRGVzY3JpcHRpb24iLEdTKSxvfX0sc189bl8sYXBpZG9tX25zX2pzb25fc2NoZW1hXzIwMjBfMTJfc3JjX3JlZnJhY3Rvcl90b29sYm94PSgpPT57Y29uc3Qgcz1jcmVhdGVOYW1lc3BhY2Uoc18pO3JldHVybntwcmVkaWNhdGVzOnsuLi5mZSxpc1N0cmluZ0VsZW1lbnQ6T3V9LG5hbWVzcGFjZTpzfX0sYXBpZG9tX25zX2pzb25fc2NoZW1hXzIwMjBfMTJfc3JjX3JlZnJhY3Rvcl9yZWZyYWN0PShzLHtzcGVjUGF0aDpvPVsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJKU09OU2NoZW1hIiwiJHZpc2l0b3IiXSxwbHVnaW5zOmk9W10sc3BlY2lmaWNhdGlvbk9iajphPVpTfT17fSk9Pntjb25zdCB1PSgwLHZ1LmUpKHMpLF89ZGVyZWZlcmVuY2UoYSksdz1uZXcoR3UobyxfKSkoe3NwZWNPYmo6X30pO3JldHVybiB2aXNpdG9yX3Zpc2l0KHUsdyksZGlzcGF0Y2hQbHVnaW5zU3luYyh3LmVsZW1lbnQsaSx7dG9vbGJveENyZWF0b3I6YXBpZG9tX25zX2pzb25fc2NoZW1hXzIwMjBfMTJfc3JjX3JlZnJhY3Rvcl90b29sYm94LHZpc2l0b3JPcHRpb25zOntrZXlNYXA6ZV8sbm9kZVR5cGVHZXR0ZXI6dHJhdmVyc2FsX3Zpc2l0b3JfZ2V0Tm9kZVR5cGV9fSl9LGFwaWRvbV9uc19qc29uX3NjaGVtYV8yMDIwXzEyX3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yPXM9PihvLGk9e30pPT5hcGlkb21fbnNfanNvbl9zY2hlbWFfMjAyMF8xMl9zcmNfcmVmcmFjdG9yX3JlZnJhY3Qobyx7c3BlY1BhdGg6cywuLi5pfSk7S1MucmVmcmFjdD1hcGlkb21fbnNfanNvbl9zY2hlbWFfMjAyMF8xMl9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSlNPTlNjaGVtYSIsIiR2aXNpdG9yIl0pLEdTLnJlZnJhY3Q9YXBpZG9tX25zX2pzb25fc2NoZW1hXzIwMjBfMTJfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpbmtEZXNjcmlwdGlvbiIsIiR2aXNpdG9yIl0pO2NvbnN0IG9fPWNsYXNzIGVsZW1lbnRzX1NjaGVtYV9TY2hlbWEgZXh0ZW5kcyBLU3tjb25zdHJ1Y3RvcihzLG8saSl7c3VwZXIocyxvLGkpLHRoaXMuZWxlbWVudD0ic2NoZW1hIn1nZXQgZGlzY3JpbWluYXRvcigpe3JldHVybiB0aGlzLmdldCgiZGlzY3JpbWluYXRvciIpfXNldCBkaXNjcmltaW5hdG9yKHMpe3RoaXMuc2V0KCJkaXNjcmltaW5hdG9yIixzKX1nZXQgeG1sKCl7cmV0dXJuIHRoaXMuZ2V0KCJ4bWwiKX1zZXQgeG1sKHMpe3RoaXMuc2V0KCJ4bWwiLHMpfWdldCBleHRlcm5hbERvY3MoKXtyZXR1cm4gdGhpcy5nZXQoImV4dGVybmFsRG9jcyIpfXNldCBleHRlcm5hbERvY3Mocyl7dGhpcy5zZXQoImV4dGVybmFsRG9jcyIscyl9Z2V0IGV4YW1wbGUoKXtyZXR1cm4gdGhpcy5nZXQoImV4YW1wbGUiKX1zZXQgZXhhbXBsZShzKXt0aGlzLnNldCgiZXhhbXBsZSIscyl9fTtjb25zdCBpXz1jbGFzcyBTZWN1cml0eVJlcXVpcmVtZW50X1NlY3VyaXR5UmVxdWlyZW1lbnQgZXh0ZW5kcyBSZnt9O2NvbnN0IGFfPWNsYXNzIFNlY3VyaXR5U2NoZW1lX1NlY3VyaXR5U2NoZW1lIGV4dGVuZHMgRGZ7fTtjb25zdCBjXz1jbGFzcyBTZXJ2ZXJfU2VydmVyIGV4dGVuZHMgRmZ7fTtjb25zdCBsXz1jbGFzcyBTZXJ2ZXJWYXJpYWJsZV9TZXJ2ZXJWYXJpYWJsZSBleHRlbmRzIFZme307Y29uc3QgdV89Y2xhc3MgVGFnX1RhZyBleHRlbmRzIFdme307Y29uc3QgcF89Y2xhc3MgWG1sX1htbCBleHRlbmRzIEpme307Y2xhc3MgT3BlbkFwaTNfMVZpc2l0b3IgZXh0ZW5kcyhNaXhpbihvbSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgX2IsdGhpcy5zcGVjUGF0aD1sYyhbImRvY3VtZW50Iiwib2JqZWN0cyIsIk9wZW5BcGkiXSksdGhpcy5jYW5TdXBwb3J0U3BlY2lmaWNhdGlvbkV4dGVuc2lvbnM9ITAsdGhpcy5vcGVuQXBpU2VtYW50aWNFbGVtZW50PXRoaXMuZWxlbWVudH1PYmplY3RFbGVtZW50KHMpe3JldHVybiB0aGlzLm9wZW5BcGlHZW5lcmljRWxlbWVudD1zLG9tLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKX19Y29uc3QgaF89T3BlbkFwaTNfMVZpc2l0b3IsZF89cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5JbmZvLiR2aXNpdG9yO2NvbnN0IGZfPWNsYXNzIGluZm9fSW5mb1Zpc2l0b3IgZXh0ZW5kcyBkX3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IFp2fX0sbV89cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5Db250YWN0LiR2aXNpdG9yO2NvbnN0IGdfPWNsYXNzIGNvbnRhY3RfQ29udGFjdFZpc2l0b3IgZXh0ZW5kcyBtX3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IEh2fX0seV89cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5MaWNlbnNlLiR2aXNpdG9yO2NvbnN0IHZfPWNsYXNzIGxpY2Vuc2VfTGljZW5zZVZpc2l0b3IgZXh0ZW5kcyB5X3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHRifX0sYl89cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5MaW5rLiR2aXNpdG9yO2NvbnN0IFNfPWNsYXNzIGxpbmtfTGlua1Zpc2l0b3IgZXh0ZW5kcyBiX3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IG5ifX07Y2xhc3MgSnNvblNjaGVtYURpYWxlY3RWaXNpdG9yIGV4dGVuZHMoTWl4aW4oWGYsR2YpKXtTdHJpbmdFbGVtZW50KHMpe2NvbnN0IG89bmV3IGViKHNlcmlhbGl6ZXJzX3ZhbHVlKHMpKTtyZXR1cm4gdGhpcy5jb3B5TWV0YUFuZEF0dHJpYnV0ZXMocyxvKSx0aGlzLmVsZW1lbnQ9byxGdX19Y29uc3QgRV89SnNvblNjaGVtYURpYWxlY3RWaXNpdG9yLHdfPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuU2VydmVyLiR2aXNpdG9yO2NvbnN0IHhfPWNsYXNzIHNlcnZlcl9TZXJ2ZXJWaXNpdG9yIGV4dGVuZHMgd197Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBjX319LGtfPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuU2VydmVyVmFyaWFibGUuJHZpc2l0b3I7Y29uc3QgT189Y2xhc3Mgc2VydmVyX3ZhcmlhYmxlX1NlcnZlclZhcmlhYmxlVmlzaXRvciBleHRlbmRzIGtfe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgbF99fSxBXz1xdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLk1lZGlhVHlwZS4kdmlzaXRvcjtjb25zdCBDXz1jbGFzcyBtZWRpYV90eXBlX01lZGlhVHlwZVZpc2l0b3IgZXh0ZW5kcyBBX3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHBifX0sal89cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5TZWN1cml0eVJlcXVpcmVtZW50LiR2aXNpdG9yO2NvbnN0IFBfPWNsYXNzIHNlY3VyaXR5X3JlcXVpcmVtZW50X1NlY3VyaXR5UmVxdWlyZW1lbnRWaXNpdG9yIGV4dGVuZHMgal97Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBpX319LElfPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuQ29tcG9uZW50cy4kdmlzaXRvcjtjb25zdCBUXz1jbGFzcyBjb21wb25lbnRzX0NvbXBvbmVudHNWaXNpdG9yIGV4dGVuZHMgSV97Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBKdn19LE5fPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuVGFnLiR2aXNpdG9yO2NvbnN0IE1fPWNsYXNzIHRhZ19UYWdWaXNpdG9yIGV4dGVuZHMgTl97Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyB1X319LFJfPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUmVmZXJlbmNlLiR2aXNpdG9yO2NvbnN0IERfPWNsYXNzIHJlZmVyZW5jZV9SZWZlcmVuY2VWaXNpdG9yIGV4dGVuZHMgUl97Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBJYn19LExfPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUGFyYW1ldGVyLiR2aXNpdG9yO2NvbnN0IEZfPWNsYXNzIHBhcmFtZXRlcl9QYXJhbWV0ZXJWaXNpdG9yIGV4dGVuZHMgTF97Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBPYn19LEJfPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuSGVhZGVyLiR2aXNpdG9yO2NvbnN0ICRfPWNsYXNzIGhlYWRlcl9IZWFkZXJWaXNpdG9yIGV4dGVuZHMgQl97Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBRdn19LHFfPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgV3Z8fHMoYSkmJm8oImNhbGxiYWNrIixhKSYmaSgib2JqZWN0IixhKSkpLFVfPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgSnZ8fHMoYSkmJm8oImNvbXBvbmVudHMiLGEpJiZpKCJvYmplY3QiLGEpKSksVl89aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBIdnx8cyhhKSYmbygiY29udGFjdCIsYSkmJmkoIm9iamVjdCIsYSkpKSx6Xz1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIFl2fHxzKGEpJiZvKCJleGFtcGxlIixhKSYmaSgib2JqZWN0IixhKSkpLFdfPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgWHZ8fHMoYSkmJm8oImV4dGVybmFsRG9jdW1lbnRhdGlvbiIsYSkmJmkoIm9iamVjdCIsYSkpKSxKXz1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIFF2fHxzKGEpJiZvKCJoZWFkZXIiLGEpJiZpKCJvYmplY3QiLGEpKSksSF89aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBadnx8cyhhKSYmbygiaW5mbyIsYSkmJmkoIm9iamVjdCIsYSkpKSxLXz1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIGVifHxzKGEpJiZvKCJqc29uU2NoZW1hRGlhbGVjdCIsYSkmJmkoInN0cmluZyIsYSkpKSxHXz1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIHRifHxzKGEpJiZvKCJsaWNlbnNlIixhKSYmaSgib2JqZWN0IixhKSkpLFlfPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgbmJ8fHMoYSkmJm8oImxpbmsiLGEpJiZpKCJvYmplY3QiLGEpKSksWF89aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBTYnx8cyhhKSYmbygib3BlbmFwaSIsYSkmJmkoInN0cmluZyIsYSkpKSxRXz1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOmksaGFzQ2xhc3M6YX0pPT51PT51IGluc3RhbmNlb2YgX2J8fHModSkmJm8oIm9wZW5BcGkzXzEiLHUpJiZpKCJvYmplY3QiLHUpJiZhKCJhcGkiLHUpKSksWl89aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiB3Ynx8cyhhKSYmbygib3BlcmF0aW9uIixhKSYmaSgib2JqZWN0IixhKSkpLGVFPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgT2J8fHMoYSkmJm8oInBhcmFtZXRlciIsYSkmJmkoIm9iamVjdCIsYSkpKSx0RT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIEFifHxzKGEpJiZvKCJwYXRoSXRlbSIsYSkmJmkoIm9iamVjdCIsYSkpKSxpc1BhdGhJdGVtRWxlbWVudEV4dGVybmFsPXM9PntpZighdEUocykpcmV0dXJuITE7aWYoIU91KHMuJHJlZikpcmV0dXJuITE7Y29uc3Qgbz1zZXJpYWxpemVyc192YWx1ZShzLiRyZWYpO3JldHVybiJzdHJpbmciPT10eXBlb2YgbyYmby5sZW5ndGg+MCYmIW8uc3RhcnRzV2l0aCgiIyIpfSxyRT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIFBifHxzKGEpJiZvKCJwYXRocyIsYSkmJmkoIm9iamVjdCIsYSkpKSxuRT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIElifHxzKGEpJiZvKCJyZWZlcmVuY2UiLGEpJiZpKCJvYmplY3QiLGEpKSksaXNSZWZlcmVuY2VFbGVtZW50RXh0ZXJuYWw9cz0+e2lmKCFuRShzKSlyZXR1cm4hMTtpZighT3Uocy4kcmVmKSlyZXR1cm4hMTtjb25zdCBvPXNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZik7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBvJiZvLmxlbmd0aD4wJiYhby5zdGFydHNXaXRoKCIjIil9LHNFPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgTWJ8fHMoYSkmJm8oInJlcXVlc3RCb2R5IixhKSYmaSgib2JqZWN0IixhKSkpLG9FPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgUmJ8fHMoYSkmJm8oInJlc3BvbnNlIixhKSYmaSgib2JqZWN0IixhKSkpLGlFPWhlbHBlcnMoKCh7aGFzQmFzaWNFbGVtZW50UHJvcHM6cyxpc0VsZW1lbnRUeXBlOm8scHJpbWl0aXZlRXE6aX0pPT5hPT5hIGluc3RhbmNlb2YgTGJ8fHMoYSkmJm8oInJlc3BvbnNlcyIsYSkmJmkoIm9iamVjdCIsYSkpKSxhRT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIG9ffHxzKGEpJiZvKCJzY2hlbWEiLGEpJiZpKCJvYmplY3QiLGEpKSkscHJlZGljYXRlc19pc0Jvb2xlYW5Kc29uU2NoZW1hRWxlbWVudD1zPT5qdShzKSYmcy5jbGFzc2VzLmluY2x1ZGVzKCJib29sZWFuLWpzb24tc2NoZW1hIiksY0U9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBpX3x8cyhhKSYmbygic2VjdXJpdHlSZXF1aXJlbWVudCIsYSkmJmkoIm9iamVjdCIsYSkpKSxsRT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIGFffHxzKGEpJiZvKCJzZWN1cml0eVNjaGVtZSIsYSkmJmkoIm9iamVjdCIsYSkpKSx1RT1oZWxwZXJzKCgoe2hhc0Jhc2ljRWxlbWVudFByb3BzOnMsaXNFbGVtZW50VHlwZTpvLHByaW1pdGl2ZUVxOml9KT0+YT0+YSBpbnN0YW5jZW9mIGNffHxzKGEpJiZvKCJzZXJ2ZXIiLGEpJiZpKCJvYmplY3QiLGEpKSkscEU9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBsX3x8cyhhKSYmbygic2VydmVyVmFyaWFibGUiLGEpJiZpKCJvYmplY3QiLGEpKSksaEU9aGVscGVycygoKHtoYXNCYXNpY0VsZW1lbnRQcm9wczpzLGlzRWxlbWVudFR5cGU6byxwcmltaXRpdmVFcTppfSk9PmE9PmEgaW5zdGFuY2VvZiBwYnx8cyhhKSYmbygibWVkaWFUeXBlIixhKSYmaSgib2JqZWN0IixhKSkpO2NsYXNzIG9wZW5fYXBpXzNfMV9zY2hlbWFfU2NoZW1hVmlzaXRvciBleHRlbmRzKE1peGluKG9tLFRkLEdmKSl7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBvXyx0aGlzLnNwZWNQYXRoPWxjKFsiZG9jdW1lbnQiLCJvYmplY3RzIiwiU2NoZW1hIl0pLHRoaXMuY2FuU3VwcG9ydFNwZWNpZmljYXRpb25FeHRlbnNpb25zPSEwLHRoaXMuanNvblNjaGVtYURlZmF1bHREaWFsZWN0PWViLmRlZmF1bHQsdGhpcy5wYXNzaW5nT3B0aW9uc05hbWVzLnB1c2goInBhcmVudCIpfU9iamVjdEVsZW1lbnQocyl7dGhpcy5oYW5kbGVEaWFsZWN0SWRlbnRpZmllcihzKSx0aGlzLmhhbmRsZVNjaGVtYUlkZW50aWZpZXIocyksdGhpcy5wYXJlbnQ9dGhpcy5lbGVtZW50O2NvbnN0IG89b20ucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiBPdSh0aGlzLmVsZW1lbnQuJHJlZikmJih0aGlzLmVsZW1lbnQuY2xhc3Nlcy5wdXNoKCJyZWZlcmVuY2UtZWxlbWVudCIpLHRoaXMuZWxlbWVudC5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInNjaGVtYSIpKSxvfUJvb2xlYW5FbGVtZW50KHMpe3JldHVybiBZUy5wcm90b3R5cGUuQm9vbGVhbkVsZW1lbnQuY2FsbCh0aGlzLHMpfWdldCBkZWZhdWx0RGlhbGVjdElkZW50aWZpZXIoKXtsZXQgcztyZXR1cm4gcz12b2lkIDAhPT10aGlzLm9wZW5BcGlTZW1hbnRpY0VsZW1lbnQmJktfKHRoaXMub3BlbkFwaVNlbWFudGljRWxlbWVudC5qc29uU2NoZW1hRGlhbGVjdCk/c2VyaWFsaXplcnNfdmFsdWUodGhpcy5vcGVuQXBpU2VtYW50aWNFbGVtZW50Lmpzb25TY2hlbWFEaWFsZWN0KTp2b2lkIDAhPT10aGlzLm9wZW5BcGlHZW5lcmljRWxlbWVudCYmT3UodGhpcy5vcGVuQXBpR2VuZXJpY0VsZW1lbnQuZ2V0KCJqc29uU2NoZW1hRGlhbGVjdCIpKT9zZXJpYWxpemVyc192YWx1ZSh0aGlzLm9wZW5BcGlHZW5lcmljRWxlbWVudC5nZXQoImpzb25TY2hlbWFEaWFsZWN0IikpOnNlcmlhbGl6ZXJzX3ZhbHVlKHRoaXMuanNvblNjaGVtYURlZmF1bHREaWFsZWN0KSxzfWhhbmRsZURpYWxlY3RJZGVudGlmaWVyKHMpe3JldHVybiBZUy5wcm90b3R5cGUuaGFuZGxlRGlhbGVjdElkZW50aWZpZXIuY2FsbCh0aGlzLHMpfWhhbmRsZVNjaGVtYUlkZW50aWZpZXIocyl7cmV0dXJuIFlTLnByb3RvdHlwZS5oYW5kbGVTY2hlbWFJZGVudGlmaWVyLmNhbGwodGhpcyxzKX19Y29uc3QgZEU9b3Blbl9hcGlfM18xX3NjaGVtYV9TY2hlbWFWaXNpdG9yO2NvbnN0IGZFPWNsYXNzICRkZWZzVmlzaXRvcl8kZGVmc1Zpc2l0b3IgZXh0ZW5kcyBUU3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLnBhc3NpbmdPcHRpb25zTmFtZXMucHVzaCgicGFyZW50Iil9fTtjb25zdCBtRT1jbGFzcyBzY2hlbWFfQWxsT2ZWaXNpdG9yX0FsbE9mVmlzaXRvciBleHRlbmRzIE5Te2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMucGFzc2luZ09wdGlvbnNOYW1lcy5wdXNoKCJwYXJlbnQiKX19O2NvbnN0IGdFPWNsYXNzIHNjaGVtYV9BbnlPZlZpc2l0b3JfQW55T2ZWaXNpdG9yIGV4dGVuZHMgTVN7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5wYXNzaW5nT3B0aW9uc05hbWVzLnB1c2goInBhcmVudCIpfX07Y29uc3QgeUU9Y2xhc3Mgc2NoZW1hX09uZU9mVmlzaXRvcl9PbmVPZlZpc2l0b3IgZXh0ZW5kcyBSU3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLnBhc3NpbmdPcHRpb25zTmFtZXMucHVzaCgicGFyZW50Iil9fTtjb25zdCB2RT1jbGFzcyBEZXBlbmRlbnRTY2hlbWFzVmlzaXRvcl9EZXBlbmRlbnRTY2hlbWFzVmlzaXRvciBleHRlbmRzIERTe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMucGFzc2luZ09wdGlvbnNOYW1lcy5wdXNoKCJwYXJlbnQiKX19O2NvbnN0IGJFPWNsYXNzIFByZWZpeEl0ZW1zVmlzaXRvcl9QcmVmaXhJdGVtc1Zpc2l0b3IgZXh0ZW5kcyBYU3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLnBhc3NpbmdPcHRpb25zTmFtZXMucHVzaCgicGFyZW50Iil9fTtjb25zdCBTRT1jbGFzcyBzY2hlbWFfUHJvcGVydGllc1Zpc2l0b3JfUHJvcGVydGllc1Zpc2l0b3IgZXh0ZW5kcyBGU3tjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLnBhc3NpbmdPcHRpb25zTmFtZXMucHVzaCgicGFyZW50Iil9fTtjb25zdCBfRT1jbGFzcyBzY2hlbWFfUGF0dGVyblByb3BlcnRpZXNWaXNpdG9yX1BhdHRlcm5Qcm9wZXJ0aWVzVmlzaXRvciBleHRlbmRzIEJTe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMucGFzc2luZ09wdGlvbnNOYW1lcy5wdXNoKCJwYXJlbnQiKX19LEVFPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuRGlzY3JpbWluYXRvci4kdmlzaXRvcjtjb25zdCB3RT1jbGFzcyBkaXN0cmltaW5hdG9yX0Rpc2NyaW1pbmF0b3JWaXNpdG9yIGV4dGVuZHMgRUV7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBLdix0aGlzLmNhblN1cHBvcnRTcGVjaWZpY2F0aW9uRXh0ZW5zaW9ucz0hMH19LHhFPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuWE1MLiR2aXNpdG9yO2NvbnN0IGtFPWNsYXNzIHhtbF9YbWxWaXNpdG9yIGV4dGVuZHMgeEV7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBwX319O2NsYXNzIFNjaGVtYXNWaXNpdG9yX1NjaGVtYXNWaXNpdG9yIGV4dGVuZHMoTWl4aW4oeW0sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHh5LHRoaXMuc3BlY1BhdGg9bGMoWyJkb2N1bWVudCIsIm9iamVjdHMiLCJTY2hlbWEiXSl9T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPXltLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbHRlcihhRSkuZm9yRWFjaCgoKHMsbyk9PntzLnNldE1ldGFQcm9wZXJ0eSgic2NoZW1hTmFtZSIsc2VyaWFsaXplcnNfdmFsdWUobykpfSkpLG99fWNvbnN0IE9FPVNjaGVtYXNWaXNpdG9yX1NjaGVtYXNWaXNpdG9yO2NsYXNzIENvbXBvbmVudHNQYXRoSXRlbXMgZXh0ZW5kcyB2dS5TaHtzdGF0aWMgcHJpbWFyeUNsYXNzPSJjb21wb25lbnRzLXBhdGgtaXRlbXMiO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goQ29tcG9uZW50c1BhdGhJdGVtcy5wcmltYXJ5Q2xhc3MpfX1jb25zdCBBRT1Db21wb25lbnRzUGF0aEl0ZW1zO2NsYXNzIFBhdGhJdGVtc1Zpc2l0b3IgZXh0ZW5kcyhNaXhpbih5bSxHZikpe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgQUUsdGhpcy5zcGVjUGF0aD1zPT5pc1JlZmVyZW5jZUxpa2VFbGVtZW50KHMpP1siZG9jdW1lbnQiLCJvYmplY3RzIiwiUmVmZXJlbmNlIl06WyJkb2N1bWVudCIsIm9iamVjdHMiLCJQYXRoSXRlbSJdfU9iamVjdEVsZW1lbnQocyl7Y29uc3Qgbz15bS5wcm90b3R5cGUuT2JqZWN0RWxlbWVudC5jYWxsKHRoaXMscyk7cmV0dXJuIHRoaXMuZWxlbWVudC5maWx0ZXIobkUpLmZvckVhY2goKHM9PntzLnNldE1ldGFQcm9wZXJ0eSgicmVmZXJlbmNlZC1lbGVtZW50IiwicGF0aEl0ZW0iKX0pKSxvfX1jb25zdCBDRT1QYXRoSXRlbXNWaXNpdG9yLGpFPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuRXhhbXBsZS4kdmlzaXRvcjtjb25zdCBQRT1jbGFzcyBleGFtcGxlX0V4YW1wbGVWaXNpdG9yIGV4dGVuZHMgakV7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBZdn19LElFPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuRXh0ZXJuYWxEb2N1bWVudGF0aW9uLiR2aXNpdG9yO2NvbnN0IFRFPWNsYXNzIGV4dGVybmFsX2RvY3VtZW50YXRpb25fRXh0ZXJuYWxEb2N1bWVudGF0aW9uVmlzaXRvciBleHRlbmRzIElFe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgWHZ9fSxORT1xdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkVuY29kaW5nLiR2aXNpdG9yO2NvbnN0IE1FPWNsYXNzIG9wZW5fYXBpXzNfMV9lbmNvZGluZ19FbmNvZGluZ1Zpc2l0b3IgZXh0ZW5kcyBORXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IEd2fX0sUkU9cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5QYXRocy4kdmlzaXRvcjtjb25zdCBERT1jbGFzcyBwYXRoc19QYXRoc1Zpc2l0b3IgZXh0ZW5kcyBSRXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IFBifX0sTEU9cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5SZXF1ZXN0Qm9keS4kdmlzaXRvcjtjb25zdCBGRT1jbGFzcyByZXF1ZXN0X2JvZHlfUmVxdWVzdEJvZHlWaXNpdG9yIGV4dGVuZHMgTEV7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBNYn19LEJFPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuQ2FsbGJhY2suJHZpc2l0b3I7Y29uc3QgJEU9Y2xhc3MgY2FsbGJhY2tfQ2FsbGJhY2tWaXNpdG9yIGV4dGVuZHMgQkV7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBXdix0aGlzLnNwZWNQYXRoPXM9PmlzUmVmZXJlbmNlTGlrZUVsZW1lbnQocyk/WyJkb2N1bWVudCIsIm9iamVjdHMiLCJSZWZlcmVuY2UiXTpbImRvY3VtZW50Iiwib2JqZWN0cyIsIlBhdGhJdGVtIl19T2JqZWN0RWxlbWVudChzKXtjb25zdCBvPUJFLnByb3RvdHlwZS5PYmplY3RFbGVtZW50LmNhbGwodGhpcyxzKTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbHRlcihuRSkuZm9yRWFjaCgocz0+e3Muc2V0TWV0YVByb3BlcnR5KCJyZWZlcmVuY2VkLWVsZW1lbnQiLCJwYXRoSXRlbSIpfSkpLG99fSxxRT1xdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlJlc3BvbnNlLiR2aXNpdG9yO2NvbnN0IFVFPWNsYXNzIHJlc3BvbnNlX1Jlc3BvbnNlVmlzaXRvciBleHRlbmRzIHFFe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgUmJ9fSxWRT1xdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlJlc3BvbnNlcy4kdmlzaXRvcjtjb25zdCB6RT1jbGFzcyBvcGVuX2FwaV8zXzFfcmVzcG9uc2VzX1Jlc3BvbnNlc1Zpc2l0b3IgZXh0ZW5kcyBWRXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IExifX0sV0U9cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5PcGVyYXRpb24uJHZpc2l0b3I7Y29uc3QgSkU9Y2xhc3Mgb3BlcmF0aW9uX09wZXJhdGlvblZpc2l0b3IgZXh0ZW5kcyBXRXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHdifX0sSEU9cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5QYXRoSXRlbS4kdmlzaXRvcjtjb25zdCBLRT1jbGFzcyBwYXRoX2l0ZW1fUGF0aEl0ZW1WaXNpdG9yIGV4dGVuZHMgSEV7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBBYn19LEdFPXF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuU2VjdXJpdHlTY2hlbWUuJHZpc2l0b3I7Y29uc3QgWUU9Y2xhc3Mgc2VjdXJpdHlfc2NoZW1lX1NlY3VyaXR5U2NoZW1lVmlzaXRvciBleHRlbmRzIEdFe2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuZWxlbWVudD1uZXcgYV99fSxYRT1xdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLk9BdXRoRmxvd3MuJHZpc2l0b3I7Y29uc3QgUUU9Y2xhc3Mgb2F1dGhfZmxvd3NfT0F1dGhGbG93c1Zpc2l0b3IgZXh0ZW5kcyBYRXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHlifX0sWkU9cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5PQXV0aEZsb3cuJHZpc2l0b3I7Y29uc3QgZXc9Y2xhc3Mgb2F1dGhfZmxvd19PQXV0aEZsb3dWaXNpdG9yIGV4dGVuZHMgWkV7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5lbGVtZW50PW5ldyBtYn19O2NsYXNzIFdlYmhvb2tzIGV4dGVuZHMgdnUuU2h7c3RhdGljIHByaW1hcnlDbGFzcz0id2ViaG9va3MiO2NvbnN0cnVjdG9yKHMsbyxpKXtzdXBlcihzLG8saSksdGhpcy5jbGFzc2VzLnB1c2goV2ViaG9va3MucHJpbWFyeUNsYXNzKX19Y29uc3QgdHc9V2ViaG9va3M7Y2xhc3MgV2ViaG9va3NWaXNpdG9yIGV4dGVuZHMoTWl4aW4oeW0sR2YpKXtjb25zdHJ1Y3RvcihzKXtzdXBlcihzKSx0aGlzLmVsZW1lbnQ9bmV3IHR3LHRoaXMuc3BlY1BhdGg9cz0+aXNSZWZlcmVuY2VMaWtlRWxlbWVudChzKT9bImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlZmVyZW5jZSJdOlsiZG9jdW1lbnQiLCJvYmplY3RzIiwiUGF0aEl0ZW0iXX1PYmplY3RFbGVtZW50KHMpe2NvbnN0IG89eW0ucHJvdG90eXBlLk9iamVjdEVsZW1lbnQuY2FsbCh0aGlzLHMpO3JldHVybiB0aGlzLmVsZW1lbnQuZmlsdGVyKG5FKS5mb3JFYWNoKChzPT57cy5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsInBhdGhJdGVtIil9KSksdGhpcy5lbGVtZW50LmZpbHRlcih0RSkuZm9yRWFjaCgoKHMsbyk9PntzLnNldE1ldGFQcm9wZXJ0eSgid2ViaG9vay1uYW1lIixzZXJpYWxpemVyc192YWx1ZShvKSl9KSksb319Y29uc3Qgcnc9V2ViaG9va3NWaXNpdG9yLHtKU09OU2NoZW1hOm53LExpbmtEZXNjcmlwdGlvbjpzd309WlMudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cyxvdz17dmlzaXRvcnM6e3ZhbHVlOnF2LnZpc2l0b3JzLnZhbHVlLGRvY3VtZW50OntvYmplY3RzOntPcGVuQXBpOnskdmlzaXRvcjpoXyxmaXhlZEZpZWxkczp7b3BlbmFwaTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLk9wZW5BcGkuZml4ZWRGaWVsZHMub3BlbmFwaSxpbmZvOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvSW5mbyJ9LGpzb25TY2hlbWFEaWFsZWN0OkVfLHNlcnZlcnM6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5PcGVuQXBpLmZpeGVkRmllbGRzLnNlcnZlcnMscGF0aHM6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9QYXRocyJ9LHdlYmhvb2tzOnJ3LGNvbXBvbmVudHM6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9Db21wb25lbnRzIn0sc2VjdXJpdHk6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5PcGVuQXBpLmZpeGVkRmllbGRzLnNlY3VyaXR5LHRhZ3M6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5PcGVuQXBpLmZpeGVkRmllbGRzLnRhZ3MsZXh0ZXJuYWxEb2NzOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvRXh0ZXJuYWxEb2N1bWVudGF0aW9uIn19fSxJbmZvOnskdmlzaXRvcjpmXyxmaXhlZEZpZWxkczp7dGl0bGU6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5JbmZvLmZpeGVkRmllbGRzLnRpdGxlLGRlc2NyaXB0aW9uOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuSW5mby5maXhlZEZpZWxkcy5kZXNjcmlwdGlvbixzdW1tYXJ5OnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn0sdGVybXNPZlNlcnZpY2U6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5JbmZvLmZpeGVkRmllbGRzLnRlcm1zT2ZTZXJ2aWNlLGNvbnRhY3Q6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9Db250YWN0In0sbGljZW5zZTp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL0xpY2Vuc2UifSx2ZXJzaW9uOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuSW5mby5maXhlZEZpZWxkcy52ZXJzaW9ufX0sQ29udGFjdDp7JHZpc2l0b3I6Z18sZml4ZWRGaWVsZHM6e25hbWU6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5Db250YWN0LmZpeGVkRmllbGRzLm5hbWUsdXJsOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuQ29udGFjdC5maXhlZEZpZWxkcy51cmwsZW1haWw6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5Db250YWN0LmZpeGVkRmllbGRzLmVtYWlsfX0sTGljZW5zZTp7JHZpc2l0b3I6dl8sZml4ZWRGaWVsZHM6e25hbWU6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5MaWNlbnNlLmZpeGVkRmllbGRzLm5hbWUsaWRlbnRpZmllcjp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LHVybDpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkxpY2Vuc2UuZml4ZWRGaWVsZHMudXJsfX0sU2VydmVyOnskdmlzaXRvcjp4XyxmaXhlZEZpZWxkczp7dXJsOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuU2VydmVyLmZpeGVkRmllbGRzLnVybCxkZXNjcmlwdGlvbjpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlNlcnZlci5maXhlZEZpZWxkcy5kZXNjcmlwdGlvbix2YXJpYWJsZXM6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5TZXJ2ZXIuZml4ZWRGaWVsZHMudmFyaWFibGVzfX0sU2VydmVyVmFyaWFibGU6eyR2aXNpdG9yOk9fLGZpeGVkRmllbGRzOntlbnVtOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuU2VydmVyVmFyaWFibGUuZml4ZWRGaWVsZHMuZW51bSxkZWZhdWx0OnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuU2VydmVyVmFyaWFibGUuZml4ZWRGaWVsZHMuZGVmYXVsdCxkZXNjcmlwdGlvbjpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlNlcnZlclZhcmlhYmxlLmZpeGVkRmllbGRzLmRlc2NyaXB0aW9ufX0sQ29tcG9uZW50czp7JHZpc2l0b3I6VF8sZml4ZWRGaWVsZHM6e3NjaGVtYXM6T0UscmVzcG9uc2VzOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuQ29tcG9uZW50cy5maXhlZEZpZWxkcy5yZXNwb25zZXMscGFyYW1ldGVyczpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkNvbXBvbmVudHMuZml4ZWRGaWVsZHMucGFyYW1ldGVycyxleGFtcGxlczpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkNvbXBvbmVudHMuZml4ZWRGaWVsZHMuZXhhbXBsZXMscmVxdWVzdEJvZGllczpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkNvbXBvbmVudHMuZml4ZWRGaWVsZHMucmVxdWVzdEJvZGllcyxoZWFkZXJzOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuQ29tcG9uZW50cy5maXhlZEZpZWxkcy5oZWFkZXJzLHNlY3VyaXR5U2NoZW1lczpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkNvbXBvbmVudHMuZml4ZWRGaWVsZHMuc2VjdXJpdHlTY2hlbWVzLGxpbmtzOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuQ29tcG9uZW50cy5maXhlZEZpZWxkcy5saW5rcyxjYWxsYmFja3M6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5Db21wb25lbnRzLmZpeGVkRmllbGRzLmNhbGxiYWNrcyxwYXRoSXRlbXM6Q0V9fSxQYXRoczp7JHZpc2l0b3I6REV9LFBhdGhJdGVtOnskdmlzaXRvcjpLRSxmaXhlZEZpZWxkczp7JHJlZjpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlBhdGhJdGVtLmZpeGVkRmllbGRzLiRyZWYsc3VtbWFyeTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlBhdGhJdGVtLmZpeGVkRmllbGRzLnN1bW1hcnksZGVzY3JpcHRpb246cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5QYXRoSXRlbS5maXhlZEZpZWxkcy5kZXNjcmlwdGlvbixnZXQ6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9PcGVyYXRpb24ifSxwdXQ6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9PcGVyYXRpb24ifSxwb3N0OnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvT3BlcmF0aW9uIn0sZGVsZXRlOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvT3BlcmF0aW9uIn0sb3B0aW9uczp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL09wZXJhdGlvbiJ9LGhlYWQ6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9PcGVyYXRpb24ifSxwYXRjaDp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL09wZXJhdGlvbiJ9LHRyYWNlOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvT3BlcmF0aW9uIn0sc2VydmVyczpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlBhdGhJdGVtLmZpeGVkRmllbGRzLnNlcnZlcnMscGFyYW1ldGVyczpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlBhdGhJdGVtLmZpeGVkRmllbGRzLnBhcmFtZXRlcnN9fSxPcGVyYXRpb246eyR2aXNpdG9yOkpFLGZpeGVkRmllbGRzOnt0YWdzOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuT3BlcmF0aW9uLmZpeGVkRmllbGRzLnRhZ3Msc3VtbWFyeTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLk9wZXJhdGlvbi5maXhlZEZpZWxkcy5zdW1tYXJ5LGRlc2NyaXB0aW9uOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuT3BlcmF0aW9uLmZpeGVkRmllbGRzLmRlc2NyaXB0aW9uLGV4dGVybmFsRG9jczp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL0V4dGVybmFsRG9jdW1lbnRhdGlvbiJ9LG9wZXJhdGlvbklkOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuT3BlcmF0aW9uLmZpeGVkRmllbGRzLm9wZXJhdGlvbklkLHBhcmFtZXRlcnM6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5PcGVyYXRpb24uZml4ZWRGaWVsZHMucGFyYW1ldGVycyxyZXF1ZXN0Qm9keTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLk9wZXJhdGlvbi5maXhlZEZpZWxkcy5yZXF1ZXN0Qm9keSxyZXNwb25zZXM6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9SZXNwb25zZXMifSxjYWxsYmFja3M6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5PcGVyYXRpb24uZml4ZWRGaWVsZHMuY2FsbGJhY2tzLGRlcHJlY2F0ZWQ6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5PcGVyYXRpb24uZml4ZWRGaWVsZHMuZGVwcmVjYXRlZCxzZWN1cml0eTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLk9wZXJhdGlvbi5maXhlZEZpZWxkcy5zZWN1cml0eSxzZXJ2ZXJzOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuT3BlcmF0aW9uLmZpeGVkRmllbGRzLnNlcnZlcnN9fSxFeHRlcm5hbERvY3VtZW50YXRpb246eyR2aXNpdG9yOlRFLGZpeGVkRmllbGRzOntkZXNjcmlwdGlvbjpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkV4dGVybmFsRG9jdW1lbnRhdGlvbi5maXhlZEZpZWxkcy5kZXNjcmlwdGlvbix1cmw6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5FeHRlcm5hbERvY3VtZW50YXRpb24uZml4ZWRGaWVsZHMudXJsfX0sUGFyYW1ldGVyOnskdmlzaXRvcjpGXyxmaXhlZEZpZWxkczp7bmFtZTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlBhcmFtZXRlci5maXhlZEZpZWxkcy5uYW1lLGluOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUGFyYW1ldGVyLmZpeGVkRmllbGRzLmluLGRlc2NyaXB0aW9uOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUGFyYW1ldGVyLmZpeGVkRmllbGRzLmRlc2NyaXB0aW9uLHJlcXVpcmVkOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUGFyYW1ldGVyLmZpeGVkRmllbGRzLnJlcXVpcmVkLGRlcHJlY2F0ZWQ6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5QYXJhbWV0ZXIuZml4ZWRGaWVsZHMuZGVwcmVjYXRlZCxhbGxvd0VtcHR5VmFsdWU6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5QYXJhbWV0ZXIuZml4ZWRGaWVsZHMuYWxsb3dFbXB0eVZhbHVlLHN0eWxlOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUGFyYW1ldGVyLmZpeGVkRmllbGRzLnN0eWxlLGV4cGxvZGU6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5QYXJhbWV0ZXIuZml4ZWRGaWVsZHMuZXhwbG9kZSxhbGxvd1Jlc2VydmVkOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUGFyYW1ldGVyLmZpeGVkRmllbGRzLmFsbG93UmVzZXJ2ZWQsc2NoZW1hOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvU2NoZW1hIn0sZXhhbXBsZTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlBhcmFtZXRlci5maXhlZEZpZWxkcy5leGFtcGxlLGV4YW1wbGVzOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUGFyYW1ldGVyLmZpeGVkRmllbGRzLmV4YW1wbGVzLGNvbnRlbnQ6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5QYXJhbWV0ZXIuZml4ZWRGaWVsZHMuY29udGVudH19LFJlcXVlc3RCb2R5OnskdmlzaXRvcjpGRSxmaXhlZEZpZWxkczp7ZGVzY3JpcHRpb246cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5SZXF1ZXN0Qm9keS5maXhlZEZpZWxkcy5kZXNjcmlwdGlvbixjb250ZW50OnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUmVxdWVzdEJvZHkuZml4ZWRGaWVsZHMuY29udGVudCxyZXF1aXJlZDpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlJlcXVlc3RCb2R5LmZpeGVkRmllbGRzLnJlcXVpcmVkfX0sTWVkaWFUeXBlOnskdmlzaXRvcjpDXyxmaXhlZEZpZWxkczp7c2NoZW1hOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvU2NoZW1hIn0sZXhhbXBsZTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLk1lZGlhVHlwZS5maXhlZEZpZWxkcy5leGFtcGxlLGV4YW1wbGVzOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuTWVkaWFUeXBlLmZpeGVkRmllbGRzLmV4YW1wbGVzLGVuY29kaW5nOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuTWVkaWFUeXBlLmZpeGVkRmllbGRzLmVuY29kaW5nfX0sRW5jb2Rpbmc6eyR2aXNpdG9yOk1FLGZpeGVkRmllbGRzOntjb250ZW50VHlwZTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkVuY29kaW5nLmZpeGVkRmllbGRzLmNvbnRlbnRUeXBlLGhlYWRlcnM6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5FbmNvZGluZy5maXhlZEZpZWxkcy5oZWFkZXJzLHN0eWxlOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuRW5jb2RpbmcuZml4ZWRGaWVsZHMuc3R5bGUsZXhwbG9kZTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkVuY29kaW5nLmZpeGVkRmllbGRzLmV4cGxvZGUsYWxsb3dSZXNlcnZlZDpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkVuY29kaW5nLmZpeGVkRmllbGRzLmFsbG93UmVzZXJ2ZWR9fSxSZXNwb25zZXM6eyR2aXNpdG9yOnpFLGZpeGVkRmllbGRzOntkZWZhdWx0OnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUmVzcG9uc2VzLmZpeGVkRmllbGRzLmRlZmF1bHR9fSxSZXNwb25zZTp7JHZpc2l0b3I6VUUsZml4ZWRGaWVsZHM6e2Rlc2NyaXB0aW9uOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUmVzcG9uc2UuZml4ZWRGaWVsZHMuZGVzY3JpcHRpb24saGVhZGVyczpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlJlc3BvbnNlLmZpeGVkRmllbGRzLmhlYWRlcnMsY29udGVudDpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlJlc3BvbnNlLmZpeGVkRmllbGRzLmNvbnRlbnQsbGlua3M6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5SZXNwb25zZS5maXhlZEZpZWxkcy5saW5rc319LENhbGxiYWNrOnskdmlzaXRvcjokRX0sRXhhbXBsZTp7JHZpc2l0b3I6UEUsZml4ZWRGaWVsZHM6e3N1bW1hcnk6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5FeGFtcGxlLmZpeGVkRmllbGRzLnN1bW1hcnksZGVzY3JpcHRpb246cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5FeGFtcGxlLmZpeGVkRmllbGRzLmRlc2NyaXB0aW9uLHZhbHVlOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuRXhhbXBsZS5maXhlZEZpZWxkcy52YWx1ZSxleHRlcm5hbFZhbHVlOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuRXhhbXBsZS5maXhlZEZpZWxkcy5leHRlcm5hbFZhbHVlfX0sTGluazp7JHZpc2l0b3I6U18sZml4ZWRGaWVsZHM6e29wZXJhdGlvblJlZjpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkxpbmsuZml4ZWRGaWVsZHMub3BlcmF0aW9uUmVmLG9wZXJhdGlvbklkOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuTGluay5maXhlZEZpZWxkcy5vcGVyYXRpb25JZCxwYXJhbWV0ZXJzOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuTGluay5maXhlZEZpZWxkcy5wYXJhbWV0ZXJzLHJlcXVlc3RCb2R5OnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuTGluay5maXhlZEZpZWxkcy5yZXF1ZXN0Qm9keSxkZXNjcmlwdGlvbjpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkxpbmsuZml4ZWRGaWVsZHMuZGVzY3JpcHRpb24sc2VydmVyOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvU2VydmVyIn19fSxIZWFkZXI6eyR2aXNpdG9yOiRfLGZpeGVkRmllbGRzOntkZXNjcmlwdGlvbjpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkhlYWRlci5maXhlZEZpZWxkcy5kZXNjcmlwdGlvbixyZXF1aXJlZDpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkhlYWRlci5maXhlZEZpZWxkcy5yZXF1aXJlZCxkZXByZWNhdGVkOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuSGVhZGVyLmZpeGVkRmllbGRzLmRlcHJlY2F0ZWQsYWxsb3dFbXB0eVZhbHVlOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuSGVhZGVyLmZpeGVkRmllbGRzLmFsbG93RW1wdHlWYWx1ZSxzdHlsZTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkhlYWRlci5maXhlZEZpZWxkcy5zdHlsZSxleHBsb2RlOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuSGVhZGVyLmZpeGVkRmllbGRzLmV4cGxvZGUsYWxsb3dSZXNlcnZlZDpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkhlYWRlci5maXhlZEZpZWxkcy5hbGxvd1Jlc2VydmVkLHNjaGVtYTp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL1NjaGVtYSJ9LGV4YW1wbGU6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5IZWFkZXIuZml4ZWRGaWVsZHMuZXhhbXBsZSxleGFtcGxlczpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLkhlYWRlci5maXhlZEZpZWxkcy5leGFtcGxlcyxjb250ZW50OnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuSGVhZGVyLmZpeGVkRmllbGRzLmNvbnRlbnR9fSxUYWc6eyR2aXNpdG9yOk1fLGZpeGVkRmllbGRzOntuYW1lOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuVGFnLmZpeGVkRmllbGRzLm5hbWUsZGVzY3JpcHRpb246cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5UYWcuZml4ZWRGaWVsZHMuZGVzY3JpcHRpb24sZXh0ZXJuYWxEb2NzOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvRXh0ZXJuYWxEb2N1bWVudGF0aW9uIn19fSxSZWZlcmVuY2U6eyR2aXNpdG9yOkRfLGZpeGVkRmllbGRzOnskcmVmOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuUmVmZXJlbmNlLmZpeGVkRmllbGRzLiRyZWYsc3VtbWFyeTp7JHJlZjoiIy92aXNpdG9ycy92YWx1ZSJ9LGRlc2NyaXB0aW9uOnskcmVmOiIjL3Zpc2l0b3JzL3ZhbHVlIn19fSxKU09OU2NoZW1hOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvU2NoZW1hIn0sTGlua0Rlc2NyaXB0aW9uOnsuLi5zd30sU2NoZW1hOnskdmlzaXRvcjpkRSxmaXhlZEZpZWxkczp7Li4ubncuZml4ZWRGaWVsZHMsJGRlZnM6ZkUsYWxsT2Y6bUUsYW55T2Y6Z0Usb25lT2Y6eUUsbm90OnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvU2NoZW1hIn0saWY6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9TY2hlbWEifSx0aGVuOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvU2NoZW1hIn0sZWxzZTp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL1NjaGVtYSJ9LGRlcGVuZGVudFNjaGVtYXM6dkUscHJlZml4SXRlbXM6YkUsaXRlbXM6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9TY2hlbWEifSxjb250YWluczp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL1NjaGVtYSJ9LHByb3BlcnRpZXM6U0UscGF0dGVyblByb3BlcnRpZXM6X0UsYWRkaXRpb25hbFByb3BlcnRpZXM6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9TY2hlbWEifSxwcm9wZXJ0eU5hbWVzOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvU2NoZW1hIn0sdW5ldmFsdWF0ZWRJdGVtczp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL1NjaGVtYSJ9LHVuZXZhbHVhdGVkUHJvcGVydGllczp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL1NjaGVtYSJ9LGNvbnRlbnRTY2hlbWE6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9TY2hlbWEifSxkaXNjcmltaW5hdG9yOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvRGlzY3JpbWluYXRvciJ9LHhtbDp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL1hNTCJ9LGV4dGVybmFsRG9jczp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL0V4dGVybmFsRG9jdW1lbnRhdGlvbiJ9LGV4YW1wbGU6eyRyZWY6IiMvdmlzaXRvcnMvdmFsdWUifX19LERpc2NyaW1pbmF0b3I6eyR2aXNpdG9yOndFLGZpeGVkRmllbGRzOntwcm9wZXJ0eU5hbWU6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5EaXNjcmltaW5hdG9yLmZpeGVkRmllbGRzLnByb3BlcnR5TmFtZSxtYXBwaW5nOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuRGlzY3JpbWluYXRvci5maXhlZEZpZWxkcy5tYXBwaW5nfX0sWE1MOnskdmlzaXRvcjprRSxmaXhlZEZpZWxkczp7bmFtZTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlhNTC5maXhlZEZpZWxkcy5uYW1lLG5hbWVzcGFjZTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlhNTC5maXhlZEZpZWxkcy5uYW1lc3BhY2UscHJlZml4OnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuWE1MLmZpeGVkRmllbGRzLnByZWZpeCxhdHRyaWJ1dGU6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5YTUwuZml4ZWRGaWVsZHMuYXR0cmlidXRlLHdyYXBwZWQ6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5YTUwuZml4ZWRGaWVsZHMud3JhcHBlZH19LFNlY3VyaXR5U2NoZW1lOnskdmlzaXRvcjpZRSxmaXhlZEZpZWxkczp7dHlwZTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlNlY3VyaXR5U2NoZW1lLmZpeGVkRmllbGRzLnR5cGUsZGVzY3JpcHRpb246cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5TZWN1cml0eVNjaGVtZS5maXhlZEZpZWxkcy5kZXNjcmlwdGlvbixuYW1lOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuU2VjdXJpdHlTY2hlbWUuZml4ZWRGaWVsZHMubmFtZSxpbjpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlNlY3VyaXR5U2NoZW1lLmZpeGVkRmllbGRzLmluLHNjaGVtZTpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlNlY3VyaXR5U2NoZW1lLmZpeGVkRmllbGRzLnNjaGVtZSxiZWFyZXJGb3JtYXQ6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5TZWN1cml0eVNjaGVtZS5maXhlZEZpZWxkcy5iZWFyZXJGb3JtYXQsZmxvd3M6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9PQXV0aEZsb3dzIn0sb3BlbklkQ29ubmVjdFVybDpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLlNlY3VyaXR5U2NoZW1lLmZpeGVkRmllbGRzLm9wZW5JZENvbm5lY3RVcmx9fSxPQXV0aEZsb3dzOnskdmlzaXRvcjpRRSxmaXhlZEZpZWxkczp7aW1wbGljaXQ6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9PQXV0aEZsb3cifSxwYXNzd29yZDp7JHJlZjoiIy92aXNpdG9ycy9kb2N1bWVudC9vYmplY3RzL09BdXRoRmxvdyJ9LGNsaWVudENyZWRlbnRpYWxzOnskcmVmOiIjL3Zpc2l0b3JzL2RvY3VtZW50L29iamVjdHMvT0F1dGhGbG93In0sYXV0aG9yaXphdGlvbkNvZGU6eyRyZWY6IiMvdmlzaXRvcnMvZG9jdW1lbnQvb2JqZWN0cy9PQXV0aEZsb3cifX19LE9BdXRoRmxvdzp7JHZpc2l0b3I6ZXcsZml4ZWRGaWVsZHM6e2F1dGhvcml6YXRpb25Vcmw6cXYudmlzaXRvcnMuZG9jdW1lbnQub2JqZWN0cy5PQXV0aEZsb3cuZml4ZWRGaWVsZHMuYXV0aG9yaXphdGlvblVybCx0b2tlblVybDpxdi52aXNpdG9ycy5kb2N1bWVudC5vYmplY3RzLk9BdXRoRmxvdy5maXhlZEZpZWxkcy50b2tlblVybCxyZWZyZXNoVXJsOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuT0F1dGhGbG93LmZpeGVkRmllbGRzLnJlZnJlc2hVcmwsc2NvcGVzOnF2LnZpc2l0b3JzLmRvY3VtZW50Lm9iamVjdHMuT0F1dGhGbG93LmZpeGVkRmllbGRzLnNjb3Blc319LFNlY3VyaXR5UmVxdWlyZW1lbnQ6eyR2aXNpdG9yOlBffX0sZXh0ZW5zaW9uOnskdmlzaXRvcjpxdi52aXNpdG9ycy5kb2N1bWVudC5leHRlbnNpb24uJHZpc2l0b3J9fX19LGFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfdHJhdmVyc2FsX3Zpc2l0b3JfZ2V0Tm9kZVR5cGU9cz0+e2lmKGt1KHMpKXJldHVybmAke3MuZWxlbWVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStzLmVsZW1lbnQuc2xpY2UoMSl9RWxlbWVudGB9LGl3PXtDYWxsYmFja0VsZW1lbnQ6WyJjb250ZW50Il0sQ29tcG9uZW50c0VsZW1lbnQ6WyJjb250ZW50Il0sQ29udGFjdEVsZW1lbnQ6WyJjb250ZW50Il0sRGlzY3JpbWluYXRvckVsZW1lbnQ6WyJjb250ZW50Il0sRW5jb2Rpbmc6WyJjb250ZW50Il0sRXhhbXBsZTpbImNvbnRlbnQiXSxFeHRlcm5hbERvY3VtZW50YXRpb25FbGVtZW50OlsiY29udGVudCJdLEhlYWRlckVsZW1lbnQ6WyJjb250ZW50Il0sSW5mb0VsZW1lbnQ6WyJjb250ZW50Il0sTGljZW5zZUVsZW1lbnQ6WyJjb250ZW50Il0sTWVkaWFUeXBlRWxlbWVudDpbImNvbnRlbnQiXSxPQXV0aEZsb3dFbGVtZW50OlsiY29udGVudCJdLE9BdXRoRmxvd3NFbGVtZW50OlsiY29udGVudCJdLE9wZW5BcGkzXzFFbGVtZW50OlsiY29udGVudCJdLE9wZXJhdGlvbkVsZW1lbnQ6WyJjb250ZW50Il0sUGFyYW1ldGVyRWxlbWVudDpbImNvbnRlbnQiXSxQYXRoSXRlbUVsZW1lbnQ6WyJjb250ZW50Il0sUGF0aHNFbGVtZW50OlsiY29udGVudCJdLFJlZmVyZW5jZUVsZW1lbnQ6WyJjb250ZW50Il0sUmVxdWVzdEJvZHlFbGVtZW50OlsiY29udGVudCJdLFJlc3BvbnNlRWxlbWVudDpbImNvbnRlbnQiXSxSZXNwb25zZXNFbGVtZW50OlsiY29udGVudCJdLFNjaGVtYUVsZW1lbnQ6WyJjb250ZW50Il0sU2VjdXJpdHlSZXF1aXJlbWVudEVsZW1lbnQ6WyJjb250ZW50Il0sU2VjdXJpdHlTY2hlbWVFbGVtZW50OlsiY29udGVudCJdLFNlcnZlckVsZW1lbnQ6WyJjb250ZW50Il0sU2VydmVyVmFyaWFibGVFbGVtZW50OlsiY29udGVudCJdLFRhZ0VsZW1lbnQ6WyJjb250ZW50Il0sLi4uZXB9LGF3PXtuYW1lc3BhY2U6cz0+e2NvbnN0e2Jhc2U6b309cztyZXR1cm4gby5yZWdpc3RlcigiY2FsbGJhY2siLFd2KSxvLnJlZ2lzdGVyKCJjb21wb25lbnRzIixKdiksby5yZWdpc3RlcigiY29udGFjdCIsSHYpLG8ucmVnaXN0ZXIoImRpc2NyaW1pbmF0b3IiLEt2KSxvLnJlZ2lzdGVyKCJlbmNvZGluZyIsR3YpLG8ucmVnaXN0ZXIoImV4YW1wbGUiLFl2KSxvLnJlZ2lzdGVyKCJleHRlcm5hbERvY3VtZW50YXRpb24iLFh2KSxvLnJlZ2lzdGVyKCJoZWFkZXIiLFF2KSxvLnJlZ2lzdGVyKCJpbmZvIixadiksby5yZWdpc3RlcigianNvblNjaGVtYURpYWxlY3QiLGViKSxvLnJlZ2lzdGVyKCJsaWNlbnNlIix0Yiksby5yZWdpc3RlcigibGluayIsbmIpLG8ucmVnaXN0ZXIoIm1lZGlhVHlwZSIscGIpLG8ucmVnaXN0ZXIoIm9BdXRoRmxvdyIsbWIpLG8ucmVnaXN0ZXIoIm9BdXRoRmxvd3MiLHliKSxvLnJlZ2lzdGVyKCJvcGVuYXBpIixTYiksby5yZWdpc3Rlcigib3BlbkFwaTNfMSIsX2IpLG8ucmVnaXN0ZXIoIm9wZXJhdGlvbiIsd2IpLG8ucmVnaXN0ZXIoInBhcmFtZXRlciIsT2IpLG8ucmVnaXN0ZXIoInBhdGhJdGVtIixBYiksby5yZWdpc3RlcigicGF0aHMiLFBiKSxvLnJlZ2lzdGVyKCJyZWZlcmVuY2UiLEliKSxvLnJlZ2lzdGVyKCJyZXF1ZXN0Qm9keSIsTWIpLG8ucmVnaXN0ZXIoInJlc3BvbnNlIixSYiksby5yZWdpc3RlcigicmVzcG9uc2VzIixMYiksby5yZWdpc3Rlcigic2NoZW1hIixvXyksby5yZWdpc3Rlcigic2VjdXJpdHlSZXF1aXJlbWVudCIsaV8pLG8ucmVnaXN0ZXIoInNlY3VyaXR5U2NoZW1lIixhXyksby5yZWdpc3Rlcigic2VydmVyIixjXyksby5yZWdpc3Rlcigic2VydmVyVmFyaWFibGUiLGxfKSxvLnJlZ2lzdGVyKCJ0YWciLHVfKSxvLnJlZ2lzdGVyKCJ4bWwiLHBfKSxvfX0sY3c9YXcsYW5jZXN0b3JMaW5lYWdlVG9KU09OUG9pbnRlcj1zPT57Y29uc3Qgbz1zLnJlZHVjZSgoKG8saSxhKT0+e2lmKFR1KGkpKXtjb25zdCBzPVN0cmluZyhzZXJpYWxpemVyc192YWx1ZShpLmtleSkpO28ucHVzaChzKX1lbHNlIGlmKEl1KHNbYS0yXSkpe2NvbnN0IHU9U3RyaW5nKHNbYS0yXS5jb250ZW50LmluZGV4T2YoaSkpO28ucHVzaCh1KX1yZXR1cm4gb30pLFtdKTtyZXR1cm4gZXNfY29tcGlsZShvKX0sYXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfdG9vbGJveD0oKT0+e2NvbnN0IHM9Y3JlYXRlTmFtZXNwYWNlKGN3KTtyZXR1cm57cHJlZGljYXRlczp7Li4ueWUsaXNFbGVtZW50Omt1LGlzU3RyaW5nRWxlbWVudDpPdSxpc0FycmF5RWxlbWVudDpJdSxpc09iamVjdEVsZW1lbnQ6UHUsaXNNZW1iZXJFbGVtZW50OlR1LGlzU2VydmVyc0VsZW1lbnQ6ZWcsaW5jbHVkZXNDbGFzc2VzLGhhc0VsZW1lbnRTb3VyY2VNYXB9LGFuY2VzdG9yTGluZWFnZVRvSlNPTlBvaW50ZXIsbmFtZXNwYWNlOnN9fSxhcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3JlZnJhY3Rvcl9yZWZyYWN0PShzLHtzcGVjUGF0aDpvPVsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJPcGVuQXBpIiwiJHZpc2l0b3IiXSxwbHVnaW5zOmk9W119PXt9KT0+e2NvbnN0IGE9KDAsdnUuZSkocyksdT1kZXJlZmVyZW5jZShvdyksXz1uZXcoR3Uobyx1KSkoe3NwZWNPYmo6dX0pO3JldHVybiB2aXNpdG9yX3Zpc2l0KGEsXyksZGlzcGF0Y2hQbHVnaW5zU3luYyhfLmVsZW1lbnQsaSx7dG9vbGJveENyZWF0b3I6YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfdG9vbGJveCx2aXNpdG9yT3B0aW9uczp7a2V5TWFwOml3LG5vZGVUeXBlR2V0dGVyOmFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfdHJhdmVyc2FsX3Zpc2l0b3JfZ2V0Tm9kZVR5cGV9fSl9LGFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3Rvcj1zPT4obyxpPXt9KT0+YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfcmVmcmFjdChvLHtzcGVjUGF0aDpzLC4uLml9KTtXdi5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiQ2FsbGJhY2siLCIkdmlzaXRvciJdKSxKdi5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiQ29tcG9uZW50cyIsIiR2aXNpdG9yIl0pLEh2LnJlZnJhY3Q9YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJDb250YWN0IiwiJHZpc2l0b3IiXSksWXYucmVmcmFjdD1hcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkV4YW1wbGUiLCIkdmlzaXRvciJdKSxLdi5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiRGlzY3JpbWluYXRvciIsIiR2aXNpdG9yIl0pLEd2LnJlZnJhY3Q9YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJFbmNvZGluZyIsIiR2aXNpdG9yIl0pLFh2LnJlZnJhY3Q9YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJFeHRlcm5hbERvY3VtZW50YXRpb24iLCIkdmlzaXRvciJdKSxRdi5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiSGVhZGVyIiwiJHZpc2l0b3IiXSksWnYucmVmcmFjdD1hcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkluZm8iLCIkdmlzaXRvciJdKSxlYi5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiT3BlbkFwaSIsImZpeGVkRmllbGRzIiwianNvblNjaGVtYURpYWxlY3QiXSksdGIucmVmcmFjdD1hcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIkxpY2Vuc2UiLCIkdmlzaXRvciJdKSxuYi5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiTGluayIsIiR2aXNpdG9yIl0pLHBiLnJlZnJhY3Q9YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJNZWRpYVR5cGUiLCIkdmlzaXRvciJdKSxtYi5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiT0F1dGhGbG93IiwiJHZpc2l0b3IiXSkseWIucmVmcmFjdD1hcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIk9BdXRoRmxvd3MiLCIkdmlzaXRvciJdKSxTYi5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiT3BlbkFwaSIsImZpeGVkRmllbGRzIiwib3BlbmFwaSJdKSxfYi5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiT3BlbkFwaSIsIiR2aXNpdG9yIl0pLHdiLnJlZnJhY3Q9YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJPcGVyYXRpb24iLCIkdmlzaXRvciJdKSxPYi5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiUGFyYW1ldGVyIiwiJHZpc2l0b3IiXSksQWIucmVmcmFjdD1hcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIlBhdGhJdGVtIiwiJHZpc2l0b3IiXSksUGIucmVmcmFjdD1hcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIlBhdGhzIiwiJHZpc2l0b3IiXSksSWIucmVmcmFjdD1hcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIlJlZmVyZW5jZSIsIiR2aXNpdG9yIl0pLE1iLnJlZnJhY3Q9YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJSZXF1ZXN0Qm9keSIsIiR2aXNpdG9yIl0pLFJiLnJlZnJhY3Q9YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJSZXNwb25zZSIsIiR2aXNpdG9yIl0pLExiLnJlZnJhY3Q9YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJSZXNwb25zZXMiLCIkdmlzaXRvciJdKSxvXy5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiU2NoZW1hIiwiJHZpc2l0b3IiXSksaV8ucmVmcmFjdD1hcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIlNlY3VyaXR5UmVxdWlyZW1lbnQiLCIkdmlzaXRvciJdKSxhXy5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiU2VjdXJpdHlTY2hlbWUiLCIkdmlzaXRvciJdKSxjXy5yZWZyYWN0PWFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfcmVmcmFjdG9yX2NyZWF0ZVJlZnJhY3RvcihbInZpc2l0b3JzIiwiZG9jdW1lbnQiLCJvYmplY3RzIiwiU2VydmVyIiwiJHZpc2l0b3IiXSksbF8ucmVmcmFjdD1hcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIlNlcnZlclZhcmlhYmxlIiwiJHZpc2l0b3IiXSksdV8ucmVmcmFjdD1hcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3JlZnJhY3Rvcl9jcmVhdGVSZWZyYWN0b3IoWyJ2aXNpdG9ycyIsImRvY3VtZW50Iiwib2JqZWN0cyIsIlRhZyIsIiR2aXNpdG9yIl0pLHBfLnJlZnJhY3Q9YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfY3JlYXRlUmVmcmFjdG9yKFsidmlzaXRvcnMiLCJkb2N1bWVudCIsIm9iamVjdHMiLCJYTUwiLCIkdmlzaXRvciJdKTtjb25zdCBsdz1jbGFzcyBOb3RJbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgS2h7fTtjb25zdCB1dz1jbGFzcyBNZWRpYVR5cGVzIGV4dGVuZHMgQXJyYXl7dW5rbm93bk1lZGlhVHlwZT0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjtmaWx0ZXJCeUZvcm1hdCgpe3Rocm93IG5ldyBsdygiZmlsdGVyQnlGb3JtYXQgbWV0aG9kIGluIE1lZGlhVHlwZXMgY2xhc3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4iKX1maW5kQnkoKXt0aHJvdyBuZXcgbHcoImZpbmRCeSBtZXRob2QgaW4gTWVkaWFUeXBlcyBjbGFzcyBpcyBub3QgeWV0IGltcGxlbWVudGVkLiIpfWxhdGVzdCgpe3Rocm93IG5ldyBsdygibGF0ZXN0IG1ldGhvZCBpbiBNZWRpYVR5cGVzIGNsYXNzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIil9fTtjbGFzcyBPcGVuQVBJTWVkaWFUeXBlcyBleHRlbmRzIHV3e2ZpbHRlckJ5Rm9ybWF0KHM9ImdlbmVyaWMiKXtjb25zdCBvPSJnZW5lcmljIj09PXM/Im9wZW5hcGk7dmVyc2lvbiI6cztyZXR1cm4gdGhpcy5maWx0ZXIoKHM9PnMuaW5jbHVkZXMobykpKX1maW5kQnkocz0iMy4xLjAiLG89ImdlbmVyaWMiKXtjb25zdCBpPSJnZW5lcmljIj09PW8/YHZuZC5vYWkub3BlbmFwaTt2ZXJzaW9uPSR7c31gOmB2bmQub2FpLm9wZW5hcGkrJHtvfTt2ZXJzaW9uPSR7c31gO3JldHVybiB0aGlzLmZpbmQoKHM9PnMuaW5jbHVkZXMoaSkpKXx8dGhpcy51bmtub3duTWVkaWFUeXBlfWxhdGVzdChzPSJnZW5lcmljIil7cmV0dXJuIGNhKHRoaXMuZmlsdGVyQnlGb3JtYXQocykpfX1jb25zdCBwdz1uZXcgT3BlbkFQSU1lZGlhVHlwZXMoImFwcGxpY2F0aW9uL3ZuZC5vYWkub3BlbmFwaTt2ZXJzaW9uPTMuMS4wIiwiYXBwbGljYXRpb24vdm5kLm9haS5vcGVuYXBpK2pzb247dmVyc2lvbj0zLjEuMCIsImFwcGxpY2F0aW9uL3ZuZC5vYWkub3BlbmFwaSt5YW1sO3ZlcnNpb249My4xLjAiKTtjb25zdCBodz1jbGFzcyBzcmNfUmVmZXJlbmNlX1JlZmVyZW5jZXt1cmk7ZGVwdGg7dmFsdWU7cmVmU2V0O2Vycm9ycztjb25zdHJ1Y3Rvcih7dXJpOnMsZGVwdGg6bz0wLHJlZlNldDppLHZhbHVlOmF9KXt0aGlzLnVyaT1zLHRoaXMudmFsdWU9YSx0aGlzLmRlcHRoPW8sdGhpcy5yZWZTZXQ9aSx0aGlzLmVycm9ycz1bXX19O2NvbnN0IGR3PWNsYXNzIFJlZmVyZW5jZVNldHtyb290UmVmO3JlZnM7Y2lyY3VsYXI7Y29uc3RydWN0b3Ioe3JlZnM6cz1bXSxjaXJjdWxhcjpvPSExfT17fSl7dGhpcy5yZWZzPVtdLHRoaXMuY2lyY3VsYXI9byxzLmZvckVhY2godGhpcy5hZGQuYmluZCh0aGlzKSl9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5yZWZzLmxlbmd0aH1hZGQocyl7cmV0dXJuIHRoaXMuaGFzKHMpfHwodGhpcy5yZWZzLnB1c2gocyksdGhpcy5yb290UmVmPXZvaWQgMD09PXRoaXMucm9vdFJlZj9zOnRoaXMucm9vdFJlZixzLnJlZlNldD10aGlzKSx0aGlzfW1lcmdlKHMpe2Zvcihjb25zdCBvIG9mIHMudmFsdWVzKCkpdGhpcy5hZGQobyk7cmV0dXJuIHRoaXN9aGFzKHMpe2NvbnN0IG89UmMocyk/czpzLnVyaTtyZXR1cm4gZGModGhpcy5maW5kKChzPT5zLnVyaT09PW8pKSl9ZmluZChzKXtyZXR1cm4gdGhpcy5yZWZzLmZpbmQocyl9KnZhbHVlcygpe3lpZWxkKnRoaXMucmVmc31jbGVhbigpe3RoaXMucmVmcy5mb3JFYWNoKChzPT57cy5yZWZTZXQ9dm9pZCAwfSkpLHRoaXMucm9vdFJlZj12b2lkIDAsdGhpcy5yZWZzLmxlbmd0aD0wfX07ZnVuY3Rpb24gX2lkZW50aXR5KHMpe3JldHVybiBzfWNvbnN0IGZ3PV9jdXJyeTEoX2lkZW50aXR5KSxtdz17cGFyc2U6e21lZGlhVHlwZToidGV4dC9wbGFpbiIscGFyc2VyczpbXSxwYXJzZXJPcHRzOnt9fSxyZXNvbHZlOntiYXNlVVJJOiIiLHJlc29sdmVyczpbXSxyZXNvbHZlck9wdHM6e30sc3RyYXRlZ2llczpbXSxzdHJhdGVneU9wdHM6e30saW50ZXJuYWw6ITAsZXh0ZXJuYWw6ITAsbWF4RGVwdGg6MS8wfSxkZXJlZmVyZW5jZTp7c3RyYXRlZ2llczpbXSxzdHJhdGVneU9wdHM6e30scmVmU2V0Om51bGwsbWF4RGVwdGg6MS8wLGNpcmN1bGFyOiJpZ25vcmUiLGNpcmN1bGFyUmVwbGFjZXI6ZncsaW1tdXRhYmxlOiEwLGRlcmVmZXJlbmNlT3B0czp7fX0sYnVuZGxlOntzdHJhdGVnaWVzOltdLHJlZlNldDpudWxsLG1heERlcHRoOjEvMH19O2NvbnN0IGd3PV9jdXJyeTIoKGZ1bmN0aW9uIGxlbnMocyxvKXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBzYygoZnVuY3Rpb24ocyl7cmV0dXJuIG8ocyxhKX0pLGkocyhhKSkpfX19KSk7dmFyIElkZW50aXR5PWZ1bmN0aW9uKHMpe3JldHVybnt2YWx1ZTpzLG1hcDpmdW5jdGlvbihvKXtyZXR1cm4gSWRlbnRpdHkobyhzKSl9fX0seXc9X2N1cnJ5MygoZnVuY3Rpb24gb3ZlcihzLG8saSl7cmV0dXJuIHMoKGZ1bmN0aW9uKHMpe3JldHVybiBJZGVudGl0eShvKHMpKX0pKShpKS52YWx1ZX0pKTtjb25zdCB2dz15dztjb25zdCBidz1rYSgiIiksU3c9Z3coR3UoWyJyZXNvbHZlIiwiYmFzZVVSSSJdKSxlUyhbInJlc29sdmUiLCJiYXNlVVJJIl0pKSxiYXNlVVJJRGVmYXVsdD1zPT5idyhzKT91cmxfY3dkKCk6cyx1dGlsX21lcmdlPShzLG8pPT57Y29uc3QgaT1pcChzLG8pO3JldHVybiB2dyhTdyxiYXNlVVJJRGVmYXVsdCxpKX07Y29uc3QgX3c9Y2xhc3MgRmlsZV9GaWxle3VyaTttZWRpYVR5cGU7ZGF0YTtwYXJzZVJlc3VsdDtjb25zdHJ1Y3Rvcih7dXJpOnMsbWVkaWFUeXBlOm89InRleHQvcGxhaW4iLGRhdGE6aSxwYXJzZVJlc3VsdDphfSl7dGhpcy51cmk9cyx0aGlzLm1lZGlhVHlwZT1vLHRoaXMuZGF0YT1pLHRoaXMucGFyc2VSZXN1bHQ9YX1nZXQgZXh0ZW5zaW9uKCl7cmV0dXJuIFJjKHRoaXMudXJpKT8ocz0+e2NvbnN0IG89cy5sYXN0SW5kZXhPZigiLiIpO3JldHVybiBvPj0wP3Muc3Vic3RyaW5nKG8pLnRvTG93ZXJDYXNlKCk6IiJ9KSh0aGlzLnVyaSk6IiJ9dG9TdHJpbmcoKXtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuZGF0YSlyZXR1cm4gdGhpcy5kYXRhO2lmKHRoaXMuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxbIkFycmF5QnVmZmVyIl0uaW5jbHVkZXMoeGEodGhpcy5kYXRhKSl8fEFycmF5QnVmZmVyLmlzVmlldyh0aGlzLmRhdGEpKXtyZXR1cm4gbmV3IFRleHREZWNvZGVyKCJ1dGYtOCIpLmRlY29kZSh0aGlzLmRhdGEpfXJldHVybiBTdHJpbmcodGhpcy5kYXRhKX19O2NvbnN0IEV3PWNsYXNzIFBsdWdpbkVycm9yIGV4dGVuZHMgS297cGx1Z2luO2NvbnN0cnVjdG9yKHMsbyl7c3VwZXIocyx7Y2F1c2U6by5jYXVzZX0pLHRoaXMucGx1Z2luPW8ucGx1Z2lufX0scGx1Z2luc19maWx0ZXI9YXN5bmMocyxvLGkpPT57Y29uc3QgYT1hd2FpdCBQcm9taXNlLmFsbChpLm1hcCh5cChbc10sbykpKTtyZXR1cm4gaS5maWx0ZXIoKChzLG8pPT5hW29dKSl9LHJ1bj1hc3luYyhzLG8saSk9PntsZXQgYTtmb3IoY29uc3QgdSBvZiBpKXRyeXtjb25zdCBpPWF3YWl0IHVbc10uY2FsbCh1LC4uLm8pO3JldHVybntwbHVnaW46dSxyZXN1bHQ6aX19Y2F0Y2gocyl7YT1uZXcgRXcoIkVycm9yIHdoaWxlIHJ1bm5pbmcgcGx1Z2luIix7Y2F1c2U6cyxwbHVnaW46dX0pfXJldHVybiBQcm9taXNlLnJlamVjdChhKX07Y29uc3Qgd3c9Y2xhc3MgRGVyZWZlcmVuY2VFcnJvciBleHRlbmRzIEtve307Y29uc3QgeHc9Y2xhc3MgVW5tYXRjaGVkRGVyZWZlcmVuY2VTdHJhdGVneUVycm9yIGV4dGVuZHMgd3d7fTtjb25zdCBkZXJlZmVyZW5jZUFwaURPTT1hc3luYyhzLG8pPT57bGV0IGk9cyxhPSExO2lmKCFMdShzKSl7Y29uc3Qgbz1jbG9uZVNoYWxsb3cocyk7by5jbGFzc2VzLnB1c2goInJlc3VsdCIpLGk9bmV3IHh1KFtvXSksYT0hMH1jb25zdCB1PW5ldyBfdyh7dXJpOm8ucmVzb2x2ZS5iYXNlVVJJLHBhcnNlUmVzdWx0OmksbWVkaWFUeXBlOm8ucGFyc2UubWVkaWFUeXBlfSksXz1hd2FpdCBwbHVnaW5zX2ZpbHRlcigiY2FuRGVyZWZlcmVuY2UiLFt1LG9dLG8uZGVyZWZlcmVuY2Uuc3RyYXRlZ2llcyk7aWYoZHAoXykpdGhyb3cgbmV3IHh3KHUudXJpKTt0cnl7Y29uc3R7cmVzdWx0OnN9PWF3YWl0IHJ1bigiZGVyZWZlcmVuY2UiLFt1LG9dLF8pO3JldHVybiBhP3MuZ2V0KDApOnN9Y2F0Y2gocyl7dGhyb3cgbmV3IHd3KGBFcnJvciB3aGlsZSBkZXJlZmVyZW5jaW5nIGZpbGUgIiR7dS51cml9ImAse2NhdXNlOnN9KX19O2NvbnN0IGt3PWNsYXNzIFBhcnNlRXJyb3IgZXh0ZW5kcyBLb3t9O2NvbnN0IE93PWNsYXNzIFBhcnNlckVycm9yIGV4dGVuZHMga3d7fTtjb25zdCBBdz1jbGFzcyBQYXJzZXJfUGFyc2Vye25hbWU7YWxsb3dFbXB0eTtzb3VyY2VNYXA7ZmlsZUV4dGVuc2lvbnM7bWVkaWFUeXBlcztjb25zdHJ1Y3Rvcih7bmFtZTpzLGFsbG93RW1wdHk6bz0hMCxzb3VyY2VNYXA6aT0hMSxmaWxlRXh0ZW5zaW9uczphPVtdLG1lZGlhVHlwZXM6dT1bXX0pe3RoaXMubmFtZT1zLHRoaXMuYWxsb3dFbXB0eT1vLHRoaXMuc291cmNlTWFwPWksdGhpcy5maWxlRXh0ZW5zaW9ucz1hLHRoaXMubWVkaWFUeXBlcz11fX07Y29uc3QgQ3c9Y2xhc3MgQmluYXJ5UGFyc2VyIGV4dGVuZHMgQXd7Y29uc3RydWN0b3Iocyl7c3VwZXIoey4uLm51bGwhPXM/czp7fSxuYW1lOiJiaW5hcnkifSl9Y2FuUGFyc2Uocyl7cmV0dXJuIDA9PT10aGlzLmZpbGVFeHRlbnNpb25zLmxlbmd0aHx8dGhpcy5maWxlRXh0ZW5zaW9ucy5pbmNsdWRlcyhzLmV4dGVuc2lvbil9cGFyc2Uocyl7dHJ5e2NvbnN0IG89dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHMudG9TdHJpbmcoKSkpLGk9YnRvYShvKSxhPW5ldyB4dTtpZigwIT09aS5sZW5ndGgpe2NvbnN0IHM9bmV3IHZ1Lk9tKGkpO3MuY2xhc3Nlcy5wdXNoKCJyZXN1bHQiKSxhLnB1c2gocyl9cmV0dXJuIGF9Y2F0Y2gobyl7dGhyb3cgbmV3IE93KGBFcnJvciBwYXJzaW5nICIke3MudXJpfSJgLHtjYXVzZTpvfSl9fX07Y29uc3Qganc9Y2xhc3MgUmVzb2x2ZVN0cmF0ZWd5e25hbWU7Y29uc3RydWN0b3Ioe25hbWU6c30pe3RoaXMubmFtZT1zfX07Y29uc3QgUHc9Y2xhc3MgT3BlbkFQSTNfMVJlc29sdmVTdHJhdGVneSBleHRlbmRzIGp3e2NvbnN0cnVjdG9yKHMpe3N1cGVyKHsuLi5udWxsIT1zP3M6e30sbmFtZToib3BlbmFwaS0zLTEifSl9Y2FuUmVzb2x2ZShzLG8pe2NvbnN0IGk9by5kZXJlZmVyZW5jZS5zdHJhdGVnaWVzLmZpbmQoKHM9PiJvcGVuYXBpLTMtMSI9PT1zLm5hbWUpKTtyZXR1cm4gdm9pZCAwIT09aSYmaS5jYW5EZXJlZmVyZW5jZShzLG8pfWFzeW5jIHJlc29sdmUocyxvKXtjb25zdCBpPW8uZGVyZWZlcmVuY2Uuc3RyYXRlZ2llcy5maW5kKChzPT4ib3BlbmFwaS0zLTEiPT09cy5uYW1lKSk7aWYodm9pZCAwPT09aSl0aHJvdyBuZXcgeHcoJyJvcGVuYXBpLTMtMSIgZGVyZWZlcmVuY2Ugc3RyYXRlZ3kgaXMgbm90IGF2YWlsYWJsZS4nKTtjb25zdCBhPW5ldyBkdyx1PXV0aWxfbWVyZ2Uobyx7cmVzb2x2ZTp7aW50ZXJuYWw6ITF9LGRlcmVmZXJlbmNlOntyZWZTZXQ6YX19KTtyZXR1cm4gYXdhaXQgaS5kZXJlZmVyZW5jZShzLHUpLGF9fTtjb25zdCBJdz1jbGFzcyBSZXNvbHZlcntuYW1lO2NvbnN0cnVjdG9yKHtuYW1lOnN9KXt0aGlzLm5hbWU9c319O2NvbnN0IFR3PWNsYXNzIEhUVFBSZXNvbHZlciBleHRlbmRzIEl3e3RpbWVvdXQ7cmVkaXJlY3RzO3dpdGhDcmVkZW50aWFscztjb25zdHJ1Y3RvcihzKXtjb25zdHtuYW1lOm89Imh0dHAtcmVzb2x2ZXIiLHRpbWVvdXQ6aT01ZTMscmVkaXJlY3RzOmE9NSx3aXRoQ3JlZGVudGlhbHM6dT0hMX09bnVsbCE9cz9zOnt9O3N1cGVyKHtuYW1lOm99KSx0aGlzLnRpbWVvdXQ9aSx0aGlzLnJlZGlyZWN0cz1hLHRoaXMud2l0aENyZWRlbnRpYWxzPXV9Y2FuUmVhZChzKXtyZXR1cm4gaXNIdHRwVXJsKHMudXJpKX19O2NvbnN0IE53PWNsYXNzIFJlc29sdmVFcnJvciBleHRlbmRzIEtve307Y29uc3QgTXc9Y2xhc3MgUmVzb2x2ZXJFcnJvciBleHRlbmRzIE53e30se0Fib3J0Q29udHJvbGxlcjpSdyxBYm9ydFNpZ25hbDpEd309Z2xvYmFsVGhpczt2b2lkIDA9PT1nbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciYmKGdsb2JhbFRoaXMuQWJvcnRDb250cm9sbGVyPVJ3KSx2b2lkIDA9PT1nbG9iYWxUaGlzLkFib3J0U2lnbmFsJiYoZ2xvYmFsVGhpcy5BYm9ydFNpZ25hbD1Edyk7Y29uc3QgTHc9Y2xhc3MgSFRUUFJlc29sdmVyU3dhZ2dlckNsaWVudCBleHRlbmRzIFR3e3N3YWdnZXJIVFRQQ2xpZW50PWh0dHBfaHR0cDtzd2FnZ2VySFRUUENsaWVudENvbmZpZztjb25zdHJ1Y3Rvcih7c3dhZ2dlckhUVFBDbGllbnQ6cz1odHRwX2h0dHAsc3dhZ2dlckhUVFBDbGllbnRDb25maWc6bz17fSwuLi5pfT17fSl7c3VwZXIoey4uLmksbmFtZToiaHR0cC1zd2FnZ2VyLWNsaWVudCJ9KSx0aGlzLnN3YWdnZXJIVFRQQ2xpZW50PXMsdGhpcy5zd2FnZ2VySFRUUENsaWVudENvbmZpZz1vfWdldEh0dHBDbGllbnQoKXtyZXR1cm4gdGhpcy5zd2FnZ2VySFRUUENsaWVudH1hc3luYyByZWFkKHMpe2NvbnN0IG89dGhpcy5nZXRIdHRwQ2xpZW50KCksaT1uZXcgQWJvcnRDb250cm9sbGVyLHtzaWduYWw6YX09aSx1PXNldFRpbWVvdXQoKCgpPT57aS5hYm9ydCgpfSksdGhpcy50aW1lb3V0KSxfPXRoaXMuZ2V0SHR0cENsaWVudCgpLndpdGhDcmVkZW50aWFsc3x8dGhpcy53aXRoQ3JlZGVudGlhbHM/ImluY2x1ZGUiOiJzYW1lLW9yaWdpbiIsdz0wPT09dGhpcy5yZWRpcmVjdHM/ImVycm9yIjoiZm9sbG93Iix4PXRoaXMucmVkaXJlY3RzPjA/dGhpcy5yZWRpcmVjdHM6dm9pZCAwO3RyeXtyZXR1cm4oYXdhaXQgbyh7dXJsOnMudXJpLHNpZ25hbDphLHVzZXJGZXRjaDphc3luYyhzLG8pPT57bGV0IGk9YXdhaXQgZmV0Y2gocyxvKTt0cnl7aS5oZWFkZXJzLmRlbGV0ZSgiQ29udGVudC1UeXBlIil9Y2F0Y2h7aT1uZXcgUmVzcG9uc2UoaS5ib2R5LHsuLi5pLGhlYWRlcnM6bmV3IEhlYWRlcnMoaS5oZWFkZXJzKX0pLGkuaGVhZGVycy5kZWxldGUoIkNvbnRlbnQtVHlwZSIpfXJldHVybiBpfSxjcmVkZW50aWFsczpfLHJlZGlyZWN0OncsZm9sbG93OngsLi4udGhpcy5zd2FnZ2VySFRUUENsaWVudENvbmZpZ30pKS50ZXh0LmFycmF5QnVmZmVyKCl9Y2F0Y2gobyl7dGhyb3cgbmV3IE13KGBFcnJvciBkb3dubG9hZGluZyAiJHtzLnVyaX0iYCx7Y2F1c2U6b30pfWZpbmFsbHl7Y2xlYXJUaW1lb3V0KHUpfX19LHRyYW5zZm9ybWVyc19mcm9tPShzLG89YnApPT57aWYoUmMocykpdHJ5e3JldHVybiBvLmZyb21SZWZyYWN0KEpTT04ucGFyc2UocykpfWNhdGNoe31yZXR1cm4gcHUocykmJkh1KCJlbGVtZW50IixzKT9vLmZyb21SZWZyYWN0KHMpOm8udG9FbGVtZW50KHMpfTtjb25zdCBGdz1jbGFzcyBKU09OUGFyc2VyIGV4dGVuZHMgQXd7Y29uc3RydWN0b3Iocz17fSl7c3VwZXIoe25hbWU6Impzb24tc3dhZ2dlci1jbGllbnQiLG1lZGlhVHlwZXM6WyJhcHBsaWNhdGlvbi9qc29uIl0sLi4uc30pfWFzeW5jIGNhblBhcnNlKHMpe2NvbnN0IG89MD09PXRoaXMuZmlsZUV4dGVuc2lvbnMubGVuZ3RofHx0aGlzLmZpbGVFeHRlbnNpb25zLmluY2x1ZGVzKHMuZXh0ZW5zaW9uKSxpPXRoaXMubWVkaWFUeXBlcy5pbmNsdWRlcyhzLm1lZGlhVHlwZSk7aWYoIW8pcmV0dXJuITE7aWYoaSlyZXR1cm4hMDtpZighaSl0cnl7cmV0dXJuIEpTT04ucGFyc2Uocy50b1N0cmluZygpKSwhMH1jYXRjaChzKXtyZXR1cm4hMX1yZXR1cm4hMX1hc3luYyBwYXJzZShzKXtpZih0aGlzLnNvdXJjZU1hcCl0aHJvdyBuZXcgT3coImpzb24tc3dhZ2dlci1jbGllbnQgcGFyc2VyIHBsdWdpbiBkb2Vzbid0IHN1cHBvcnQgc291cmNlTWFwcyBvcHRpb24iKTtjb25zdCBvPW5ldyB4dSxpPXMudG9TdHJpbmcoKTtpZih0aGlzLmFsbG93RW1wdHkmJiIiPT09aS50cmltKCkpcmV0dXJuIG87dHJ5e2NvbnN0IHM9dHJhbnNmb3JtZXJzX2Zyb20oSlNPTi5wYXJzZShpKSk7cmV0dXJuIHMuY2xhc3Nlcy5wdXNoKCJyZXN1bHQiKSxvLnB1c2gocyksb31jYXRjaChvKXt0aHJvdyBuZXcgT3coYEVycm9yIHBhcnNpbmcgIiR7cy51cml9ImAse2NhdXNlOm99KX19fTtjb25zdCBCdz1jbGFzcyBZQU1MUGFyc2VyIGV4dGVuZHMgQXd7Y29uc3RydWN0b3Iocz17fSl7c3VwZXIoe25hbWU6InlhbWwtMS0yLXN3YWdnZXItY2xpZW50IixtZWRpYVR5cGVzOlsidGV4dC95YW1sIiwiYXBwbGljYXRpb24veWFtbCJdLC4uLnN9KX1hc3luYyBjYW5QYXJzZShzKXtjb25zdCBvPTA9PT10aGlzLmZpbGVFeHRlbnNpb25zLmxlbmd0aHx8dGhpcy5maWxlRXh0ZW5zaW9ucy5pbmNsdWRlcyhzLmV4dGVuc2lvbiksaT10aGlzLm1lZGlhVHlwZXMuaW5jbHVkZXMocy5tZWRpYVR5cGUpO2lmKCFvKXJldHVybiExO2lmKGkpcmV0dXJuITA7aWYoIWkpdHJ5e3JldHVybiBmbi5sb2FkKHMudG9TdHJpbmcoKSx7c2NoZW1hOnJufSksITB9Y2F0Y2gocyl7cmV0dXJuITF9cmV0dXJuITF9YXN5bmMgcGFyc2Uocyl7aWYodGhpcy5zb3VyY2VNYXApdGhyb3cgbmV3IE93KCJ5YW1sLTEtMi1zd2FnZ2VyLWNsaWVudCBwYXJzZXIgcGx1Z2luIGRvZXNuJ3Qgc3VwcG9ydCBzb3VyY2VNYXBzIG9wdGlvbiIpO2NvbnN0IG89bmV3IHh1LGk9cy50b1N0cmluZygpO3RyeXtjb25zdCBzPWZuLmxvYWQoaSx7c2NoZW1hOnJufSk7aWYodGhpcy5hbGxvd0VtcHR5JiZ2b2lkIDA9PT1zKXJldHVybiBvO2NvbnN0IGE9dHJhbnNmb3JtZXJzX2Zyb20ocyk7cmV0dXJuIGEuY2xhc3Nlcy5wdXNoKCJyZXN1bHQiKSxvLnB1c2goYSksb31jYXRjaChvKXt0aHJvdyBuZXcgT3coYEVycm9yIHBhcnNpbmcgIiR7cy51cml9ImAse2NhdXNlOm99KX19fTtjb25zdCAkdz1jbGFzcyBPcGVuQVBJSlNPTjNfMVBhcnNlciBleHRlbmRzIEF3e2RldGVjdGlvblJlZ0V4cD0vIm9wZW5hcGkiXHMqOlxzKiIoPzx2ZXJzaW9uX2pzb24+M1wuMVwuKD86WzEtOV1cZCp8MCkpIi87Y29uc3RydWN0b3Iocz17fSl7c3VwZXIoe25hbWU6Im9wZW5hcGktanNvbi0zLTEtc3dhZ2dlci1jbGllbnQiLG1lZGlhVHlwZXM6bmV3IE9wZW5BUElNZWRpYVR5cGVzKC4uLnB3LmZpbHRlckJ5Rm9ybWF0KCJnZW5lcmljIiksLi4ucHcuZmlsdGVyQnlGb3JtYXQoImpzb24iKSksLi4uc30pfWFzeW5jIGNhblBhcnNlKHMpe2NvbnN0IG89MD09PXRoaXMuZmlsZUV4dGVuc2lvbnMubGVuZ3RofHx0aGlzLmZpbGVFeHRlbnNpb25zLmluY2x1ZGVzKHMuZXh0ZW5zaW9uKSxpPXRoaXMubWVkaWFUeXBlcy5pbmNsdWRlcyhzLm1lZGlhVHlwZSk7aWYoIW8pcmV0dXJuITE7aWYoaSlyZXR1cm4hMDtpZighaSl0cnl7Y29uc3Qgbz1zLnRvU3RyaW5nKCk7cmV0dXJuIEpTT04ucGFyc2UobyksdGhpcy5kZXRlY3Rpb25SZWdFeHAudGVzdChvKX1jYXRjaChzKXtyZXR1cm4hMX1yZXR1cm4hMX1hc3luYyBwYXJzZShzKXtpZih0aGlzLnNvdXJjZU1hcCl0aHJvdyBuZXcgT3coIm9wZW5hcGktanNvbi0zLTEtc3dhZ2dlci1jbGllbnQgcGFyc2VyIHBsdWdpbiBkb2Vzbid0IHN1cHBvcnQgc291cmNlTWFwcyBvcHRpb24iKTtjb25zdCBvPW5ldyB4dSxpPXMudG9TdHJpbmcoKTtpZih0aGlzLmFsbG93RW1wdHkmJiIiPT09aS50cmltKCkpcmV0dXJuIG87dHJ5e2NvbnN0IHM9SlNPTi5wYXJzZShpKSxhPV9iLnJlZnJhY3Qocyx0aGlzLnJlZnJhY3Rvck9wdHMpO3JldHVybiBhLmNsYXNzZXMucHVzaCgicmVzdWx0Iiksby5wdXNoKGEpLG99Y2F0Y2gobyl7dGhyb3cgbmV3IE93KGBFcnJvciBwYXJzaW5nICIke3MudXJpfSJgLHtjYXVzZTpvfSl9fX07Y29uc3QgcXc9Y2xhc3MgT3BlbkFQSVlBTUwzMVBhcnNlciBleHRlbmRzIEF3e2RldGVjdGlvblJlZ0V4cD0vKD88WUFNTD5eKFsiJ10/KW9wZW5hcGlcMlxzKjpccyooWyInXT8pKD88dmVyc2lvbl95YW1sPjNcLjFcLig/OlsxLTldXGQqfDApKVwzKD86XHMrfCQpKXwoPzxKU09OPiJvcGVuYXBpIlxzKjpccyoiKD88dmVyc2lvbl9qc29uPjNcLjFcLig/OlsxLTldXGQqfDApKSIpL207Y29uc3RydWN0b3Iocz17fSl7c3VwZXIoe25hbWU6Im9wZW5hcGkteWFtbC0zLTEtc3dhZ2dlci1jbGllbnQiLG1lZGlhVHlwZXM6bmV3IE9wZW5BUElNZWRpYVR5cGVzKC4uLnB3LmZpbHRlckJ5Rm9ybWF0KCJnZW5lcmljIiksLi4ucHcuZmlsdGVyQnlGb3JtYXQoInlhbWwiKSksLi4uc30pfWFzeW5jIGNhblBhcnNlKHMpe2NvbnN0IG89MD09PXRoaXMuZmlsZUV4dGVuc2lvbnMubGVuZ3RofHx0aGlzLmZpbGVFeHRlbnNpb25zLmluY2x1ZGVzKHMuZXh0ZW5zaW9uKSxpPXRoaXMubWVkaWFUeXBlcy5pbmNsdWRlcyhzLm1lZGlhVHlwZSk7aWYoIW8pcmV0dXJuITE7aWYoaSlyZXR1cm4hMDtpZighaSl0cnl7Y29uc3Qgbz1zLnRvU3RyaW5nKCk7cmV0dXJuIGZuLmxvYWQobyksdGhpcy5kZXRlY3Rpb25SZWdFeHAudGVzdChvKX1jYXRjaChzKXtyZXR1cm4hMX1yZXR1cm4hMX1hc3luYyBwYXJzZShzKXtpZih0aGlzLnNvdXJjZU1hcCl0aHJvdyBuZXcgT3coIm9wZW5hcGkteWFtbC0zLTEtc3dhZ2dlci1jbGllbnQgcGFyc2VyIHBsdWdpbiBkb2Vzbid0IHN1cHBvcnQgc291cmNlTWFwcyBvcHRpb24iKTtjb25zdCBvPW5ldyB4dSxpPXMudG9TdHJpbmcoKTt0cnl7Y29uc3Qgcz1mbi5sb2FkKGkse3NjaGVtYTpybn0pO2lmKHRoaXMuYWxsb3dFbXB0eSYmdm9pZCAwPT09cylyZXR1cm4gbztjb25zdCBhPV9iLnJlZnJhY3Qocyx0aGlzLnJlZnJhY3Rvck9wdHMpO3JldHVybiBhLmNsYXNzZXMucHVzaCgicmVzdWx0Iiksby5wdXNoKGEpLG99Y2F0Y2gobyl7dGhyb3cgbmV3IE93KGBFcnJvciBwYXJzaW5nICIke3MudXJpfSJgLHtjYXVzZTpvfSl9fX07Y29uc3QgVXc9X2N1cnJ5MygoZnVuY3Rpb24gcHJvcEVxKHMsbyxpKXtyZXR1cm4ga2EocyxuYShvLGkpKX0pKTtjb25zdCBWdz1jbGFzcyBEZXJlZmVyZW5jZVN0cmF0ZWd5e25hbWU7Y29uc3RydWN0b3Ioe25hbWU6c30pe3RoaXMubmFtZT1zfX07Y29uc3Qgenc9X2N1cnJ5MigoZnVuY3Rpb24gbm9uZShzLG8pe3JldHVybiBfdShfY29tcGxlbWVudChzKSxvKX0pKTt2YXIgV3c9X193ZWJwYWNrX3JlcXVpcmVfXyg4MDY4KTtjb25zdCBKdz1jbGFzcyBFbGVtZW50SWRlbnRpdHlFcnJvciBleHRlbmRzIEdve3ZhbHVlO2NvbnN0cnVjdG9yKHMsbyl7c3VwZXIocyxvKSx2b2lkIDAhPT1vJiYodGhpcy52YWx1ZT1vLnZhbHVlKX19O2NsYXNzIElkZW50aXR5TWFuYWdlcnt1dWlkO2lkZW50aXR5TWFwO2NvbnN0cnVjdG9yKHtsZW5ndGg6cz02fT17fSl7dGhpcy51dWlkPW5ldyBXdyh7bGVuZ3RoOnN9KSx0aGlzLmlkZW50aXR5TWFwPW5ldyBXZWFrTWFwfWlkZW50aWZ5KHMpe2lmKCFrdShzKSl0aHJvdyBuZXcgSncoIkNhbm5vdCBub3QgaWRlbnRpZnkgdGhlIGVsZW1lbnQuIGBlbGVtZW50YCBpcyBuZWl0aGVyIHN0cnVjdHVyYWxseSBjb21wYXRpYmxlIG5vciBhIHN1YmNsYXNzIG9mIGFuIEVsZW1lbnQgY2xhc3MuIix7dmFsdWU6c30pO2lmKHMubWV0YS5oYXNLZXkoImlkIikmJk91KHMubWV0YS5nZXQoImlkIikpJiYhcy5tZXRhLmdldCgiaWQiKS5lcXVhbHMoIiIpKXJldHVybiBzLmlkO2lmKHRoaXMuaWRlbnRpdHlNYXAuaGFzKHMpKXJldHVybiB0aGlzLmlkZW50aXR5TWFwLmdldChzKTtjb25zdCBvPW5ldyB2dS5PbSh0aGlzLmdlbmVyYXRlSWQoKSk7cmV0dXJuIHRoaXMuaWRlbnRpdHlNYXAuc2V0KHMsbyksb31mb3JnZXQocyl7cmV0dXJuISF0aGlzLmlkZW50aXR5TWFwLmhhcyhzKSYmKHRoaXMuaWRlbnRpdHlNYXAuZGVsZXRlKHMpLCEwKX1nZW5lcmF0ZUlkKCl7cmV0dXJuIHRoaXMudXVpZC5yYW5kb21VVUlEKCl9fW5ldyBJZGVudGl0eU1hbmFnZXI7Y29uc3QgSHc9X2N1cnJ5MygoZnVuY3Rpb24gcGF0aE9yKHMsbyxpKXtyZXR1cm4gZWEocyxfcGF0aChvLGkpKX0pKSx0cmF2ZXJzYWxfZmluZD0ocyxvKT0+e2NvbnN0IGk9bmV3IFByZWRpY2F0ZVZpc2l0b3Ioe3ByZWRpY2F0ZTpzLHJldHVybk9uVHJ1ZTpGdX0pO3JldHVybiB2aXNpdG9yX3Zpc2l0KG8saSksSHcodm9pZCAwLFswXSxpLnJlc3VsdCl9O2NvbnN0IEt3PWNsYXNzIEpzb25TY2hlbWEkYW5jaG9yRXJyb3IgZXh0ZW5kcyBLb3t9O2NvbnN0IEd3PWNsYXNzIEV2YWx1YXRpb25Kc29uU2NoZW1hJGFuY2hvckVycm9yIGV4dGVuZHMgS3d7fTtjb25zdCBZdz1jbGFzcyBJbnZhbGlkSnNvblNjaGVtYSRhbmNob3JFcnJvciBleHRlbmRzIEt3e2NvbnN0cnVjdG9yKHMpe3N1cGVyKGBJbnZhbGlkIEpTT04gU2NoZW1hICRhbmNob3IgIiR7c30iLmApfX0saXNBbmNob3I9cz0+L15bQS1aYS16X11bQS1aYS16XzAtOS4tXSokLy50ZXN0KHMpLHVyaVRvQW5jaG9yPXM9Pntjb25zdCBvPWdldEhhc2gocyk7cmV0dXJuIFF1KCIjIixvKX0sJGFuY2hvcl9ldmFsdWF0ZT0ocyxvKT0+e2NvbnN0IGk9KHM9PntpZighaXNBbmNob3IocykpdGhyb3cgbmV3IFl3KHMpO3JldHVybiBzfSkocyksYT10cmF2ZXJzYWxfZmluZCgocz0+YUUocykmJnNlcmlhbGl6ZXJzX3ZhbHVlKHMuJGFuY2hvcik9PT1pKSxvKTtpZihoYyhhKSl0aHJvdyBuZXcgR3coYEV2YWx1YXRpb24gZmFpbGVkIG9uIHRva2VuOiAiJHtpfSJgKTtyZXR1cm4gYX0sdHJhdmVyc2FsX2ZpbHRlcj0ocyxvKT0+e2NvbnN0IGk9bmV3IFByZWRpY2F0ZVZpc2l0b3Ioe3ByZWRpY2F0ZTpzfSk7cmV0dXJuIHZpc2l0b3JfdmlzaXQobyxpKSxuZXcgdnUuRzYoaS5yZXN1bHQpfTtjb25zdCBYdz1jbGFzcyBKc29uU2NoZW1hVXJpRXJyb3IgZXh0ZW5kcyBLb3t9O2NvbnN0IFF3PWNsYXNzIEV2YWx1YXRpb25Kc29uU2NoZW1hVXJpRXJyb3IgZXh0ZW5kcyBYd3t9LHJlc29sdmVTY2hlbWEkcmVmRmllbGQ9KHMsbyk9PntpZih2b2lkIDA9PT1vLiRyZWYpcmV0dXJuO2NvbnN0IGk9Z2V0SGFzaChzZXJpYWxpemVyc192YWx1ZShvLiRyZWYpKSxhPXNlcmlhbGl6ZXJzX3ZhbHVlKG8ubWV0YS5nZXQoImFuY2VzdG9yc1NjaGVtYUlkZW50aWZpZXJzIikpLHU9UGkoKChzLG8pPT5yZXNvbHZlKHMsc2FuaXRpemUoc3RyaXBIYXNoKG8pKSkpLHMsWy4uLmEsc2VyaWFsaXplcnNfdmFsdWUoby4kcmVmKV0pO3JldHVybmAke3V9JHsiIyI9PT1pPyIiOml9YH0scmVmcmFjdFRvU2NoZW1hRWxlbWVudD1zPT57aWYocmVmcmFjdFRvU2NoZW1hRWxlbWVudC5jYWNoZS5oYXMocykpcmV0dXJuIHJlZnJhY3RUb1NjaGVtYUVsZW1lbnQuY2FjaGUuZ2V0KHMpO2NvbnN0IG89b18ucmVmcmFjdChzKTtyZXR1cm4gcmVmcmFjdFRvU2NoZW1hRWxlbWVudC5jYWNoZS5zZXQocyxvKSxvfTtyZWZyYWN0VG9TY2hlbWFFbGVtZW50LmNhY2hlPW5ldyBXZWFrTWFwO2NvbnN0IG1heWJlUmVmcmFjdFRvU2NoZW1hRWxlbWVudD1zPT5pc1ByaW1pdGl2ZUVsZW1lbnQocyk/cmVmcmFjdFRvU2NoZW1hRWxlbWVudChzKTpzLHVyaV9ldmFsdWF0ZT0ocyxvKT0+e2NvbnN0e2NhY2hlOml9PXVyaV9ldmFsdWF0ZSxhPXN0cmlwSGFzaChzKSxpc1NjaGVtYUVsZW1lbnRXaXRoJGlkPXM9PmFFKHMpJiZ2b2lkIDAhPT1zLiRpZDtpZighaS5oYXMobykpe2NvbnN0IHM9dHJhdmVyc2FsX2ZpbHRlcihpc1NjaGVtYUVsZW1lbnRXaXRoJGlkLG8pO2kuc2V0KG8sQXJyYXkuZnJvbShzKSl9Y29uc3QgdT1pLmdldChvKS5maW5kKChzPT57Y29uc3Qgbz0oKHMsbyk9PntpZih2b2lkIDA9PT1vLiRpZClyZXR1cm47Y29uc3QgaT1zZXJpYWxpemVyc192YWx1ZShvLm1ldGEuZ2V0KCJhbmNlc3RvcnNTY2hlbWFJZGVudGlmaWVycyIpKTtyZXR1cm4gUGkoKChzLG8pPT5yZXNvbHZlKHMsc2FuaXRpemUoc3RyaXBIYXNoKG8pKSkpLHMsaSl9KShhLHMpO3JldHVybiBvPT09YX0pKTtpZihoYyh1KSl0aHJvdyBuZXcgUXcoYEV2YWx1YXRpb24gZmFpbGVkIG9uIFVSSTogIiR7c30iYCk7cmV0dXJuIGlzQW5jaG9yKHVyaVRvQW5jaG9yKHMpKT8kYW5jaG9yX2V2YWx1YXRlKHVyaVRvQW5jaG9yKHMpLHUpOmFwaWRvbV9ldmFsdWF0ZSh1LGZyb21VUklSZWZlcmVuY2UocykpfTt1cmlfZXZhbHVhdGUuY2FjaGU9bmV3IFdlYWtNYXA7Y29uc3QgWnc9Y2xhc3MgTWF4aW11bURlcmVmZXJlbmNlRGVwdGhFcnJvciBleHRlbmRzIHd3e307Y29uc3QgZXg9Y2xhc3MgTWF4aW11bVJlc29sdmVEZXB0aEVycm9yIGV4dGVuZHMgTnd7fTtjb25zdCB0eD1jbGFzcyBVbm1hdGNoZWRSZXNvbHZlckVycm9yIGV4dGVuZHMgTXd7fSxyeD0iYXBpZG9tLWZpbGUtY2FjaGUiLHNldENhY2hlRmlsZVJlc3VsdD1hc3luYyh7Y2FjaGVLZXk6cyxyZXN1bHQ6byxlcnJvcjppLGNhY2hlVFRMOmF9KT0+e2lmKDAhPT1hKXRyeXtjb25zdCBhPXtjYWNoZWRSZXN1bHQ6byxjYWNoZWRFcnJvcjppLHRpbWVzdGFtcDpEYXRlLm5vdygpfSx1PWF3YWl0IGNhY2hlcy5vcGVuKHJ4KSxfPW5ldyBSZXNwb25zZShKU09OLnN0cmluZ2lmeShhKSx7aGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifX0pO2F3YWl0IHUucHV0KHMsXyl9Y2F0Y2gocyl7Y29uc29sZS5lcnJvcigiQ2FjaGVTdG9yYWdlIGlzIG5vdCBhdmFpbGFibGUiKX19LHV0aWxfcmVhZEZpbGU9YXN5bmMocyxvKT0+e2NvbnN0e2NhY2hlVFRMOmk9MH09by5yZXNvbHZlLnJlc29sdmVyT3B0cyxhPWByZWFkXyR7cy51cml9YCx7Y2FjaGVkUmVzdWx0OnUsY2FjaGVkRXJyb3I6X309YXdhaXQoYXN5bmMoe2NhY2hlS2V5OnMsY2FjaGVUVEw6b30pPT57aWYoMD09PW8pcmV0dXJue2NhY2hlZFJlc3VsdDpudWxsLGNhY2hlZEVycm9yOm51bGx9O3RyeXtjb25zdCBpPWF3YWl0IGNhY2hlcy5vcGVuKHJ4KSxhPWF3YWl0IGkubWF0Y2gocyk7aWYoYSl7Y29uc3R7Y2FjaGVkUmVzdWx0OnUsY2FjaGVkRXJyb3I6Xyx0aW1lc3RhbXA6d309YXdhaXQgYS5qc29uKCk7aWYoRGF0ZS5ub3coKS13PG8pcmV0dXJue2NhY2hlZFJlc3VsdDp1LGNhY2hlZEVycm9yOl99O2F3YWl0IGkuZGVsZXRlKHMpfX1jYXRjaChzKXtyZXR1cm4gY29uc29sZS5sb2coIlRoZXJlIHdhcyBhbiBlcnJvciBwYXJzaW5nIHRoZSByZXNwb25zZSIpLHtjYWNoZWRSZXN1bHQ6bnVsbCxjYWNoZWRFcnJvcjpudWxsfX1yZXR1cm57Y2FjaGVkUmVzdWx0Om51bGwsY2FjaGVkRXJyb3I6bnVsbH19KSh7Y2FjaGVLZXk6YSxjYWNoZVRUTDppfSk7aWYobnVsbCE9PXUpcmV0dXJuIHU7aWYobnVsbCE9PV8pdGhyb3cgbmV3IE53KGBFcnJvciB3aGlsZSByZWFkaW5nIGZpbGUgIiR7cy51cml9ImAse2NhdXNlOl99KTtjb25zdCB3PW8ucmVzb2x2ZS5yZXNvbHZlcnMubWFwKChzPT57Y29uc3QgaT1PYmplY3QuY3JlYXRlKHMpO3JldHVybiBPYmplY3QuYXNzaWduKGksby5yZXNvbHZlLnJlc29sdmVyT3B0cyl9KSkseD1hd2FpdCBwbHVnaW5zX2ZpbHRlcigiY2FuUmVhZCIsW3Msb10sdyk7aWYoZHAoeCkpdGhyb3cgbmV3IHR4KHMudXJpKTt0cnl7Y29uc3R7cmVzdWx0Om99PWF3YWl0IHJ1bigicmVhZCIsW3NdLHgpLHU9bmV3IF93KHsuLi5zLGRhdGE6b30pLnRvU3RyaW5nKCk7cmV0dXJuIGF3YWl0IHNldENhY2hlRmlsZVJlc3VsdCh7Y2FjaGVLZXk6YSxyZXN1bHQ6dSxlcnJvcjpudWxsLGNhY2hlVFRMOml9KSxvfWNhdGNoKG8pe3ZhciBDLGosTDt0aHJvdyBhd2FpdCBzZXRDYWNoZUZpbGVSZXN1bHQoe2NhY2hlS2V5OmEscmVzdWx0Om51bGwsZXJyb3I6bnVsbCE9PShDPW51bGwhPT0oaj1udWxsPT1vfHxudWxsPT09KEw9by5jYXVzZSl8fHZvaWQgMD09PUw/dm9pZCAwOkwuY2F1c2UpJiZ2b2lkIDAhPT1qP2o6bnVsbD09bz92b2lkIDA6by5jYXVzZSkmJnZvaWQgMCE9PUM/QzpvLGNhY2hlVFRMOml9KSxuZXcgTncoYEVycm9yIHdoaWxlIHJlYWRpbmcgZmlsZSAiJHtzLnVyaX0iYCx7Y2F1c2U6b30pfX0sYXBpZG9tX3JlZmVyZW5jZV9zcmNfcGFyc2U9YXN5bmMocyxvKT0+e2NvbnN0IGk9bmV3IF93KHt1cmk6c2FuaXRpemUoc3RyaXBIYXNoKHMpKSxtZWRpYVR5cGU6by5wYXJzZS5tZWRpYVR5cGV9KSxhPWF3YWl0IHV0aWxfcmVhZEZpbGUoaSxvKTtyZXR1cm4oYXN5bmMocyxvKT0+e2NvbnN0IGk9by5wYXJzZS5wYXJzZXJzLm1hcCgocz0+e2NvbnN0IGk9T2JqZWN0LmNyZWF0ZShzKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihpLG8ucGFyc2UucGFyc2VyT3B0cyl9KSksYT1hd2FpdCBwbHVnaW5zX2ZpbHRlcigiY2FuUGFyc2UiLFtzLG9dLGkpO2lmKGRwKGEpKXRocm93IG5ldyB0eChzLnVyaSk7dHJ5e2NvbnN0e3BsdWdpbjppLHJlc3VsdDp1fT1hd2FpdCBydW4oInBhcnNlIixbcyxvXSxhKTtyZXR1cm4haS5hbGxvd0VtcHR5JiZ1LmlzRW1wdHk/UHJvbWlzZS5yZWplY3QobmV3IGt3KGBFcnJvciB3aGlsZSBwYXJzaW5nIGZpbGUgIiR7cy51cml9Ii4gRmlsZSBpcyBlbXB0eS5gKSk6dX1jYXRjaChvKXt0aHJvdyBuZXcga3coYEVycm9yIHdoaWxlIHBhcnNpbmcgZmlsZSAiJHtzLnVyaX0iYCx7Y2F1c2U6b30pfX0pKG5ldyBfdyh7Li4uaSxkYXRhOmF9KSxvKX07Y2xhc3MgQW5jZXN0b3JMaW5lYWdlIGV4dGVuZHMgQXJyYXl7aW5jbHVkZXNDeWNsZShzKXtyZXR1cm4gdGhpcy5maWx0ZXIoKG89Pm8uaGFzKHMpKSkubGVuZ3RoPjF9aW5jbHVkZXMocyxvKXtyZXR1cm4gcyBpbnN0YW5jZW9mIFNldD9zdXBlci5pbmNsdWRlcyhzLG8pOnRoaXMuc29tZSgobz0+by5oYXMocykpKX1maW5kSXRlbShzKXtmb3IoY29uc3QgbyBvZiB0aGlzKWZvcihjb25zdCBpIG9mIG8paWYoa3UoaSkmJnMoaSkpcmV0dXJuIGl9fWNvbnN0IG54PXZpc2l0b3JfdmlzaXRbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbSIpXSxzeD1uZXcgSWRlbnRpdHlNYW5hZ2VyLG11dGF0aW9uUmVwbGFjZXI9KHMsbyxpLGEpPT57VHUoYSk/YS52YWx1ZT1zOkFycmF5LmlzQXJyYXkoYSkmJihhW2ldPXMpfTtjbGFzcyBPcGVuQVBJM18xRGVyZWZlcmVuY2VWaXNpdG9ye2luZGlyZWN0aW9ucztuYW1lc3BhY2U7cmVmZXJlbmNlO29wdGlvbnM7YW5jZXN0b3JzO3JlZnJhY3RDYWNoZTthbGxPZkRpc2NyaW1pbmF0b3JNYXBwaW5nO2NvbnN0cnVjdG9yKHtyZWZlcmVuY2U6cyxuYW1lc3BhY2U6byxvcHRpb25zOmksaW5kaXJlY3Rpb25zOmE9W10sYW5jZXN0b3JzOnU9bmV3IEFuY2VzdG9yTGluZWFnZSxyZWZyYWN0Q2FjaGU6Xz1uZXcgTWFwLGFsbE9mRGlzY3JpbWluYXRvck1hcHBpbmc6dz1uZXcgTWFwfSl7dGhpcy5pbmRpcmVjdGlvbnM9YSx0aGlzLm5hbWVzcGFjZT1vLHRoaXMucmVmZXJlbmNlPXMsdGhpcy5vcHRpb25zPWksdGhpcy5hbmNlc3RvcnM9bmV3IEFuY2VzdG9yTGluZWFnZSguLi51KSx0aGlzLnJlZnJhY3RDYWNoZT1fLHRoaXMuYWxsT2ZEaXNjcmltaW5hdG9yTWFwcGluZz13fWhhbmRsZURlcmVmZXJlbmNlRXJyb3IocyxvLGkpe3ZhciBhLHU7aWYobnVsbD09PShhPXRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5kZXJlZmVyZW5jZU9wdHMpfHx2b2lkIDA9PT1hfHwhYS5jb250aW51ZU9uRXJyb3IpdGhyb3cgcztpZihpKXtjb25zdCBvPVsuLi5pXS5maW5kKChzPT5QdShzKSYmcy5nZXRNZXRhUHJvcGVydHkoInJlZi1yZWZlcmVuY2luZy1lbGVtZW50IikpKTt2YXIgXztpZihvKW51bGw9PT0oXz10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UuZGVyZWZlcmVuY2VPcHRzKXx8dm9pZCAwPT09X3x8Xy5lcnJvcnMucHVzaCh7ZXJyb3I6cyxyZWZFbDpvLmdldE1ldGFQcm9wZXJ0eSgicmVmLXJlZmVyZW5jaW5nLWVsZW1lbnQiKX0pfW51bGw9PT0odT10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UuZGVyZWZlcmVuY2VPcHRzKXx8dm9pZCAwPT09dXx8dS5lcnJvcnMucHVzaCh7ZXJyb3I6cyxyZWZFbDpvfSl9Z2V0TmVzdGVkVmlzaXRvck9wdGlvbnMocyl7dmFyIG8saTtyZXR1cm57Li4udGhpcy5vcHRpb25zLHJlc29sdmU6ey4uLnRoaXMub3B0aW9ucy5yZXNvbHZlLGV4dGVybmFsOihudWxsPT09KG89dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlKXx8dm9pZCAwPT09b3x8bnVsbD09PShvPW8uZGVyZWZlcmVuY2VPcHRzKXx8dm9pZCAwPT09b3x8IW8uc2tpcE5lc3RlZEV4dGVybmFsfHwhc2VyaWFsaXplcnNfdmFsdWUocy5nZXQoIiRyZWYiKSkuc3RhcnRzV2l0aCgiIyIpKSYmdGhpcy5vcHRpb25zLnJlc29sdmUuZXh0ZXJuYWx9LGRlcmVmZXJlbmNlOnsuLi50aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UsZGVyZWZlcmVuY2VPcHRzOnsuLi5udWxsPT09KGk9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlKXx8dm9pZCAwPT09aT92b2lkIDA6aS5kZXJlZmVyZW5jZU9wdHMsY29udGludWVPbkVycm9yOiExfX19fXRvQmFzZVVSSShzKXtyZXR1cm4gcmVzb2x2ZSh0aGlzLnJlZmVyZW5jZS51cmksc2FuaXRpemUoc3RyaXBIYXNoKHMpKSl9YXN5bmMgdG9SZWZlcmVuY2Uocyl7aWYodGhpcy5yZWZlcmVuY2UuZGVwdGg+PXRoaXMub3B0aW9ucy5yZXNvbHZlLm1heERlcHRoKXRocm93IG5ldyBleChgTWF4aW11bSByZXNvbHV0aW9uIGRlcHRoIG9mICR7dGhpcy5vcHRpb25zLnJlc29sdmUubWF4RGVwdGh9IGhhcyBiZWVuIGV4Y2VlZGVkIGJ5IGZpbGUgIiR7dGhpcy5yZWZlcmVuY2UudXJpfSJgKTtjb25zdCBvPXRoaXMudG9CYXNlVVJJKHMpLHtyZWZTZXQ6aX09dGhpcy5yZWZlcmVuY2U7aWYoaS5oYXMobykpcmV0dXJuIGkuZmluZChVdyhvLCJ1cmkiKSk7Y29uc3QgYT1hd2FpdCBhcGlkb21fcmVmZXJlbmNlX3NyY19wYXJzZSh1bnNhbml0aXplKG8pLHsuLi50aGlzLm9wdGlvbnMscGFyc2U6ey4uLnRoaXMub3B0aW9ucy5wYXJzZSxtZWRpYVR5cGU6InRleHQvcGxhaW4ifX0pLHU9bmV3IGh3KHt1cmk6byx2YWx1ZTpjbG9uZURlZXAoYSksZGVwdGg6dGhpcy5yZWZlcmVuY2UuZGVwdGgrMX0pO2lmKGkuYWRkKHUpLHRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5pbW11dGFibGUpe2NvbnN0IHM9bmV3IGh3KHt1cmk6YGltbXV0YWJsZTovLyR7b31gLHZhbHVlOmEsZGVwdGg6dGhpcy5yZWZlcmVuY2UuZGVwdGgrMX0pO2kuYWRkKHMpfXJldHVybiB1fXRvQW5jZXN0b3JMaW5lYWdlKHMpe2NvbnN0IG89bmV3IFNldChzLmZpbHRlcihrdSkpO3JldHVybltuZXcgQW5jZXN0b3JMaW5lYWdlKC4uLnRoaXMuYW5jZXN0b3JzLG8pLG9dfU9wZW5BcGkzXzFFbGVtZW50PXtsZWF2ZToocyxvLGksYSx1LF8pPT57dmFyIHc7aWYobnVsbD09PSh3PXRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5zdHJhdGVneU9wdHNbIm9wZW5hcGktMy0xIl0pfHx2b2lkIDA9PT13fHwhdy5kZXJlZmVyZW5jZURpc2NyaW1pbmF0b3JNYXBwaW5nKXJldHVybjtjb25zdCB4PWNsb25lU2hhbGxvdyhzKTtyZXR1cm4geC5zZXRNZXRhUHJvcGVydHkoImFsbE9mRGlzY3JpbWluYXRvck1hcHBpbmciLE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmFsbE9mRGlzY3JpbWluYXRvck1hcHBpbmcpKSxfLnJlcGxhY2VXaXRoKHgsbXV0YXRpb25SZXBsYWNlciksaT92b2lkIDA6eH19O2FzeW5jIFJlZmVyZW5jZUVsZW1lbnQocyxvLGksYSx1LF8pe3ZhciB3LHg7aWYodGhpcy5pbmRpcmVjdGlvbnMuaW5jbHVkZXMocykpcmV0dXJuITE7Y29uc3RbQyxqXT10aGlzLnRvQW5jZXN0b3JMaW5lYWdlKFsuLi51LGldKSxMPXRoaXMudG9CYXNlVVJJKHNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZikpLEI9c3RyaXBIYXNoKHRoaXMucmVmZXJlbmNlLnVyaSk9PT1MLCQ9IUI7aWYoIXRoaXMub3B0aW9ucy5yZXNvbHZlLmludGVybmFsJiZCKXJldHVybiExO2lmKCF0aGlzLm9wdGlvbnMucmVzb2x2ZS5leHRlcm5hbCYmJClyZXR1cm4hMTtsZXQgVTt0cnl7VT1hd2FpdCB0aGlzLnRvUmVmZXJlbmNlKHNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZikpfWNhdGNoKG8pe3JldHVybiB0aGlzLmhhbmRsZURlcmVmZXJlbmNlRXJyb3IobyxzLGopfWNvbnN0IFY9cmVzb2x2ZShMLHNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZikpO3RoaXMuaW5kaXJlY3Rpb25zLnB1c2gocyk7Y29uc3Qgej1mcm9tVVJJUmVmZXJlbmNlKFYpO2xldCBZO3RyeXtZPWFwaWRvbV9ldmFsdWF0ZShVLnZhbHVlLnJlc3VsdCx6KX1jYXRjaChvKXtyZXR1cm4gdGhpcy5pbmRpcmVjdGlvbnMucG9wKCksdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyxqKX1pZihZLmlkPXN4LmlkZW50aWZ5KFkpLGlzUHJpbWl0aXZlRWxlbWVudChZKSl7Y29uc3Qgbz1zZXJpYWxpemVyc192YWx1ZShzLm1ldGEuZ2V0KCJyZWZlcmVuY2VkLWVsZW1lbnQiKSksaT1gJHtvfS0ke3NlcmlhbGl6ZXJzX3ZhbHVlKHN4LmlkZW50aWZ5KFkpKX1gO2lmKHRoaXMucmVmcmFjdENhY2hlLmhhcyhpKSlZPXRoaXMucmVmcmFjdENhY2hlLmdldChpKTtlbHNlIGlmKGlzUmVmZXJlbmNlTGlrZUVsZW1lbnQoWSkpWT1JYi5yZWZyYWN0KFkpLFkuc2V0TWV0YVByb3BlcnR5KCJyZWZlcmVuY2VkLWVsZW1lbnQiLG8pLHRoaXMucmVmcmFjdENhY2hlLnNldChpLFkpO2Vsc2V7WT10aGlzLm5hbWVzcGFjZS5nZXRFbGVtZW50Q2xhc3MobykucmVmcmFjdChZKSx0aGlzLnJlZnJhY3RDYWNoZS5zZXQoaSxZKX19aWYocz09PVkpe2NvbnN0IG89bmV3IEtvKCJSZWN1cnNpdmUgUmVmZXJlbmNlIE9iamVjdCBkZXRlY3RlZCIpO3JldHVybiB0aGlzLmluZGlyZWN0aW9ucy5wb3AoKSx0aGlzLmhhbmRsZURlcmVmZXJlbmNlRXJyb3IobyxzLGopfWlmKHRoaXMuaW5kaXJlY3Rpb25zLmxlbmd0aD50aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UubWF4RGVwdGgpe2NvbnN0IG89bmV3IFp3KGBNYXhpbXVtIGRlcmVmZXJlbmNlIGRlcHRoIG9mICIke3RoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5tYXhEZXB0aH0iIGhhcyBiZWVuIGV4Y2VlZGVkIGluIGZpbGUgIiR7dGhpcy5yZWZlcmVuY2UudXJpfSJgKTtyZXR1cm4gdGhpcy5pbmRpcmVjdGlvbnMucG9wKCksdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyxqKX1pZihDLmluY2x1ZGVzKFkpKXtpZihVLnJlZlNldC5jaXJjdWxhcj0hMCwiZXJyb3IiPT09dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmNpcmN1bGFyKXtjb25zdCBvPW5ldyBLbygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIik7cmV0dXJuIHRoaXMuaW5kaXJlY3Rpb25zLnBvcCgpLHRoaXMuaGFuZGxlRGVyZWZlcmVuY2VFcnJvcihvLHMsail9aWYoInJlcGxhY2UiPT09dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmNpcmN1bGFyKXt2YXIgWixlZTtjb25zdCBvPW5ldyB2dS5zSShZLmlkLHt0eXBlOiJyZWZlcmVuY2UiLHVyaTpVLnVyaSwkcmVmOnNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZil9KSxhPShudWxsIT09KFo9bnVsbD09PShlZT10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2Uuc3RyYXRlZ3lPcHRzWyJvcGVuYXBpLTMtMSJdKXx8dm9pZCAwPT09ZWU/dm9pZCAwOmVlLmNpcmN1bGFyUmVwbGFjZXIpJiZ2b2lkIDAhPT1aP1o6dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmNpcmN1bGFyUmVwbGFjZXIpKG8pO3JldHVybiBfLnJlcGxhY2VXaXRoKGEsbXV0YXRpb25SZXBsYWNlciksIWkmJmF9fWNvbnN0IGllPXN0cmlwSGFzaChVLnJlZlNldC5yb290UmVmLnVyaSkhPT1VLnVyaSxhZT1bImVycm9yIiwicmVwbGFjZSJdLmluY2x1ZGVzKHRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5jaXJjdWxhcik7aWYoKCR8fGllfHxuRShZKXx8YWV8fG51bGwhPT0odz10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UuZGVyZWZlcmVuY2VPcHRzKSYmdm9pZCAwIT09dyYmdy5jb250aW51ZU9uRXJyb3IpJiYhQy5pbmNsdWRlc0N5Y2xlKFkpKXtqLmFkZChzKTtjb25zdCBvPW5ldyBPcGVuQVBJM18xRGVyZWZlcmVuY2VWaXNpdG9yKHtyZWZlcmVuY2U6VSxuYW1lc3BhY2U6dGhpcy5uYW1lc3BhY2UsaW5kaXJlY3Rpb25zOlsuLi50aGlzLmluZGlyZWN0aW9uc10sb3B0aW9uczp0aGlzLmdldE5lc3RlZFZpc2l0b3JPcHRpb25zKHMpLHJlZnJhY3RDYWNoZTp0aGlzLnJlZnJhY3RDYWNoZSxhbmNlc3RvcnM6QyxhbGxPZkRpc2NyaW1pbmF0b3JNYXBwaW5nOnRoaXMuYWxsT2ZEaXNjcmltaW5hdG9yTWFwcGluZ30pO3RyeXtZPWF3YWl0IG54KFksbyx7a2V5TWFwOml3LG5vZGVUeXBlR2V0dGVyOmFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfdHJhdmVyc2FsX3Zpc2l0b3JfZ2V0Tm9kZVR5cGV9KX1jYXRjaChvKXtyZXR1cm4gdGhpcy5pbmRpcmVjdGlvbnMucG9wKCksdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyxqKX1qLmRlbGV0ZShzKX10aGlzLmluZGlyZWN0aW9ucy5wb3AoKTtjb25zdCBjZT1jbG9uZVNoYWxsb3coWSk7cmV0dXJuIGNlLnNldE1ldGFQcm9wZXJ0eSgiaWQiLHN4LmdlbmVyYXRlSWQoKSksY2Uuc2V0TWV0YVByb3BlcnR5KCJyZWYtZmllbGRzIix7JHJlZjpzZXJpYWxpemVyc192YWx1ZShzLiRyZWYpLGRlc2NyaXB0aW9uOnNlcmlhbGl6ZXJzX3ZhbHVlKHMuZGVzY3JpcHRpb24pLHN1bW1hcnk6c2VyaWFsaXplcnNfdmFsdWUocy5zdW1tYXJ5KX0pLGNlLnNldE1ldGFQcm9wZXJ0eSgicmVmLW9yaWdpbiIsVS51cmkpLGNlLnNldE1ldGFQcm9wZXJ0eSgicmVmLXJlZmVyZW5jaW5nLWVsZW1lbnQtaWQiLGNsb25lRGVlcChzeC5pZGVudGlmeShzKSkpLG51bGwhPT0oeD10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UuZGVyZWZlcmVuY2VPcHRzKSYmdm9pZCAwIT09eCYmeC5jb250aW51ZU9uRXJyb3ImJmNlLnNldE1ldGFQcm9wZXJ0eSgicmVmLXJlZmVyZW5jaW5nLWVsZW1lbnQiLHMpLFB1KFkpJiZQdShjZSkmJihzLmhhc0tleSgiZGVzY3JpcHRpb24iKSYmImRlc2NyaXB0aW9uImluIFkmJihjZS5yZW1vdmUoImRlc2NyaXB0aW9uIiksY2Uuc2V0KCJkZXNjcmlwdGlvbiIscy5nZXQoImRlc2NyaXB0aW9uIikpKSxzLmhhc0tleSgic3VtbWFyeSIpJiYic3VtbWFyeSJpbiBZJiYoY2UucmVtb3ZlKCJzdW1tYXJ5IiksY2Uuc2V0KCJzdW1tYXJ5IixzLmdldCgic3VtbWFyeSIpKSkpLF8ucmVwbGFjZVdpdGgoY2UsbXV0YXRpb25SZXBsYWNlciksIWkmJmNlfWFzeW5jIFBhdGhJdGVtRWxlbWVudChzLG8saSxhLHUsXyl7dmFyIHc7aWYoIU91KHMuJHJlZikpcmV0dXJuO2lmKHRoaXMuaW5kaXJlY3Rpb25zLmluY2x1ZGVzKHMpKXJldHVybiExO2NvbnN0W3gsQ109dGhpcy50b0FuY2VzdG9yTGluZWFnZShbLi4udSxpXSksaj10aGlzLnRvQmFzZVVSSShzZXJpYWxpemVyc192YWx1ZShzLiRyZWYpKSxMPXN0cmlwSGFzaCh0aGlzLnJlZmVyZW5jZS51cmkpPT09aixCPSFMO2lmKCF0aGlzLm9wdGlvbnMucmVzb2x2ZS5pbnRlcm5hbCYmTClyZXR1cm47aWYoIXRoaXMub3B0aW9ucy5yZXNvbHZlLmV4dGVybmFsJiZCKXJldHVybjtsZXQgJDt0cnl7JD1hd2FpdCB0aGlzLnRvUmVmZXJlbmNlKHNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZikpfWNhdGNoKG8pe3JldHVybiB0aGlzLmhhbmRsZURlcmVmZXJlbmNlRXJyb3IobyxzLEMpfWNvbnN0IFU9cmVzb2x2ZShqLHNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZikpO3RoaXMuaW5kaXJlY3Rpb25zLnB1c2gocyk7Y29uc3QgVj1mcm9tVVJJUmVmZXJlbmNlKFUpO2xldCB6O3RyeXt6PWFwaWRvbV9ldmFsdWF0ZSgkLnZhbHVlLnJlc3VsdCxWKX1jYXRjaChvKXtyZXR1cm4gdGhpcy5pbmRpcmVjdGlvbnMucG9wKCksdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyxDKX1pZih6LmlkPXN4LmlkZW50aWZ5KHopLGlzUHJpbWl0aXZlRWxlbWVudCh6KSl7Y29uc3Qgcz1gcGF0aC1pdGVtLSR7c2VyaWFsaXplcnNfdmFsdWUoc3guaWRlbnRpZnkoeikpfWA7dGhpcy5yZWZyYWN0Q2FjaGUuaGFzKHMpP3o9dGhpcy5yZWZyYWN0Q2FjaGUuZ2V0KHMpOih6PUFiLnJlZnJhY3QoeiksdGhpcy5yZWZyYWN0Q2FjaGUuc2V0KHMseikpfWlmKHM9PT16KXtjb25zdCBvPW5ldyBLbygiUmVjdXJzaXZlIFBhdGggSXRlbSBPYmplY3QgcmVmZXJlbmNlIGRldGVjdGVkIik7cmV0dXJuIHRoaXMuaW5kaXJlY3Rpb25zLnBvcCgpLHRoaXMuaGFuZGxlRGVyZWZlcmVuY2VFcnJvcihvLHMsQyl9aWYodGhpcy5pbmRpcmVjdGlvbnMubGVuZ3RoPnRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5tYXhEZXB0aCl7Y29uc3Qgbz1uZXcgWncoYE1heGltdW0gZGVyZWZlcmVuY2UgZGVwdGggb2YgIiR7dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLm1heERlcHRofSIgaGFzIGJlZW4gZXhjZWVkZWQgaW4gZmlsZSAiJHt0aGlzLnJlZmVyZW5jZS51cml9ImApO3JldHVybiB0aGlzLmluZGlyZWN0aW9ucy5wb3AoKSx0aGlzLmhhbmRsZURlcmVmZXJlbmNlRXJyb3IobyxzLEMpfWlmKHguaW5jbHVkZXMoeikpe2lmKCQucmVmU2V0LmNpcmN1bGFyPSEwLCJlcnJvciI9PT10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UuY2lyY3VsYXIpe2NvbnN0IG89bmV3IEtvKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQiKTtyZXR1cm4gdGhpcy5pbmRpcmVjdGlvbnMucG9wKCksdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyxDKX1pZigicmVwbGFjZSI9PT10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UuY2lyY3VsYXIpe3ZhciBZLFo7Y29uc3Qgbz1uZXcgdnUuc0koei5pZCx7dHlwZToicGF0aC1pdGVtIix1cmk6JC51cmksJHJlZjpzZXJpYWxpemVyc192YWx1ZShzLiRyZWYpfSksYT0obnVsbCE9PShZPW51bGw9PT0oWj10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2Uuc3RyYXRlZ3lPcHRzWyJvcGVuYXBpLTMtMSJdKXx8dm9pZCAwPT09Wj92b2lkIDA6Wi5jaXJjdWxhclJlcGxhY2VyKSYmdm9pZCAwIT09WT9ZOnRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5jaXJjdWxhclJlcGxhY2VyKShvKTtyZXR1cm4gXy5yZXBsYWNlV2l0aChhLG11dGF0aW9uUmVwbGFjZXIpLCFpJiZhfX1jb25zdCBlZT1zdHJpcEhhc2goJC5yZWZTZXQucm9vdFJlZi51cmkpIT09JC51cmksaWU9WyJlcnJvciIsInJlcGxhY2UiXS5pbmNsdWRlcyh0aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UuY2lyY3VsYXIpO2lmKChCfHxlZXx8dEUoeikmJk91KHouJHJlZil8fGllfHxudWxsIT09KHc9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmRlcmVmZXJlbmNlT3B0cykmJnZvaWQgMCE9PXcmJncuY29udGludWVPbkVycm9yKSYmIXguaW5jbHVkZXNDeWNsZSh6KSl7Qy5hZGQocyk7Y29uc3Qgbz1uZXcgT3BlbkFQSTNfMURlcmVmZXJlbmNlVmlzaXRvcih7cmVmZXJlbmNlOiQsbmFtZXNwYWNlOnRoaXMubmFtZXNwYWNlLGluZGlyZWN0aW9uczpbLi4udGhpcy5pbmRpcmVjdGlvbnNdLG9wdGlvbnM6dGhpcy5nZXROZXN0ZWRWaXNpdG9yT3B0aW9ucyhzKSxyZWZyYWN0Q2FjaGU6dGhpcy5yZWZyYWN0Q2FjaGUsYW5jZXN0b3JzOngsYWxsT2ZEaXNjcmltaW5hdG9yTWFwcGluZzp0aGlzLmFsbE9mRGlzY3JpbWluYXRvck1hcHBpbmd9KTt0cnl7ej1hd2FpdCBueCh6LG8se2tleU1hcDppdyxub2RlVHlwZUdldHRlcjphcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3RyYXZlcnNhbF92aXNpdG9yX2dldE5vZGVUeXBlfSl9Y2F0Y2gobyl7cmV0dXJuIHRoaXMuaW5kaXJlY3Rpb25zLnBvcCgpLHRoaXMuaGFuZGxlRGVyZWZlcmVuY2VFcnJvcihvLHMsQyl9Qy5kZWxldGUocyl9aWYodGhpcy5pbmRpcmVjdGlvbnMucG9wKCksdEUoeikpe3ZhciBhZTtjb25zdCBvPW5ldyBBYihbLi4uei5jb250ZW50XSxjbG9uZURlZXAoei5tZXRhKSxjbG9uZURlZXAoei5hdHRyaWJ1dGVzKSk7by5zZXRNZXRhUHJvcGVydHkoImlkIixzeC5nZW5lcmF0ZUlkKCkpLHMuZm9yRWFjaCgoKHMsaSxhKT0+e28ucmVtb3ZlKHNlcmlhbGl6ZXJzX3ZhbHVlKGkpKSxvLmNvbnRlbnQucHVzaChhKX0pKSxvLnJlbW92ZSgiJHJlZiIpLG8uc2V0TWV0YVByb3BlcnR5KCJyZWYtZmllbGRzIix7JHJlZjpzZXJpYWxpemVyc192YWx1ZShzLiRyZWYpfSksby5zZXRNZXRhUHJvcGVydHkoInJlZi1vcmlnaW4iLCQudXJpKSxvLnNldE1ldGFQcm9wZXJ0eSgicmVmLXJlZmVyZW5jaW5nLWVsZW1lbnQtaWQiLGNsb25lRGVlcChzeC5pZGVudGlmeShzKSkpLG51bGwhPT0oYWU9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmRlcmVmZXJlbmNlT3B0cykmJnZvaWQgMCE9PWFlJiZhZS5jb250aW51ZU9uRXJyb3ImJm8uc2V0TWV0YVByb3BlcnR5KCJyZWYtcmVmZXJlbmNpbmctZWxlbWVudCIscyksej1vfXJldHVybiBfLnJlcGxhY2VXaXRoKHosbXV0YXRpb25SZXBsYWNlciksaT92b2lkIDA6en1hc3luYyBMaW5rRWxlbWVudChzLG8saSxhLHUsXyl7aWYoIU91KHMub3BlcmF0aW9uUmVmKSYmIU91KHMub3BlcmF0aW9uSWQpKXJldHVybjtpZihPdShzLm9wZXJhdGlvblJlZikmJk91KHMub3BlcmF0aW9uSWQpKXtjb25zdCBvPW5ldyBLbygiTGlua0VsZW1lbnQgb3BlcmF0aW9uUmVmIGFuZCBvcGVyYXRpb25JZCBmaWVsZHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iKTtyZXR1cm4gdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyl9bGV0IHc7aWYoT3Uocy5vcGVyYXRpb25SZWYpKXt2YXIgeDtjb25zdCBvPWZyb21VUklSZWZlcmVuY2Uoc2VyaWFsaXplcnNfdmFsdWUocy5vcGVyYXRpb25SZWYpKSxhPXRoaXMudG9CYXNlVVJJKHNlcmlhbGl6ZXJzX3ZhbHVlKHMub3BlcmF0aW9uUmVmKSksdT1zdHJpcEhhc2godGhpcy5yZWZlcmVuY2UudXJpKT09PWEsQz0hdTtpZighdGhpcy5vcHRpb25zLnJlc29sdmUuaW50ZXJuYWwmJnUpcmV0dXJuO2lmKCF0aGlzLm9wdGlvbnMucmVzb2x2ZS5leHRlcm5hbCYmQylyZXR1cm47bGV0IGo7dHJ5e2o9YXdhaXQgdGhpcy50b1JlZmVyZW5jZShzZXJpYWxpemVyc192YWx1ZShzLm9wZXJhdGlvblJlZikpLHc9YXBpZG9tX2V2YWx1YXRlKGoudmFsdWUucmVzdWx0LG8pfWNhdGNoKG8pe3JldHVybiB0aGlzLmhhbmRsZURlcmVmZXJlbmNlRXJyb3IobyxzKX1pZihpc1ByaW1pdGl2ZUVsZW1lbnQodykpe2NvbnN0IHM9YG9wZXJhdGlvbi0ke3NlcmlhbGl6ZXJzX3ZhbHVlKHN4LmlkZW50aWZ5KHcpKX1gO3RoaXMucmVmcmFjdENhY2hlLmhhcyhzKT93PXRoaXMucmVmcmFjdENhY2hlLmdldChzKToodz13Yi5yZWZyYWN0KHcpLHRoaXMucmVmcmFjdENhY2hlLnNldChzLHcpKX13PWNsb25lU2hhbGxvdyh3KSx3LnNldE1ldGFQcm9wZXJ0eSgicmVmLW9yaWdpbiIsai51cmkpO2NvbnN0IEw9Y2xvbmVTaGFsbG93KHMpO3JldHVybiBudWxsPT09KHg9TC5vcGVyYXRpb25SZWYpfHx2b2lkIDA9PT14fHx4Lm1ldGEuc2V0KCJvcGVyYXRpb24iLHcpLF8ucmVwbGFjZVdpdGgoTCxtdXRhdGlvblJlcGxhY2VyKSxpP3ZvaWQgMDpMfWlmKE91KHMub3BlcmF0aW9uSWQpKXt2YXIgQztjb25zdCBvPXNlcmlhbGl6ZXJzX3ZhbHVlKHMub3BlcmF0aW9uSWQpO2xldCBhO3RyeXthPWF3YWl0IHRoaXMudG9SZWZlcmVuY2UodW5zYW5pdGl6ZSh0aGlzLnJlZmVyZW5jZS51cmkpKX1jYXRjaChvKXtyZXR1cm4gdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyl9aWYodz10cmF2ZXJzYWxfZmluZCgocz0+Wl8ocykmJmt1KHMub3BlcmF0aW9uSWQpJiZzLm9wZXJhdGlvbklkLmVxdWFscyhvKSksYS52YWx1ZS5yZXN1bHQpLGhjKHcpKXtjb25zdCBpPW5ldyBLbyhgT3BlcmF0aW9uRWxlbWVudChvcGVyYXRpb25JZD0ke299KSBub3QgZm91bmQuYCk7cmV0dXJuIHRoaXMuaGFuZGxlRGVyZWZlcmVuY2VFcnJvcihpLHMpfWNvbnN0IHU9Y2xvbmVTaGFsbG93KHMpO3JldHVybiBudWxsPT09KEM9dS5vcGVyYXRpb25JZCl8fHZvaWQgMD09PUN8fEMubWV0YS5zZXQoIm9wZXJhdGlvbiIsdyksXy5yZXBsYWNlV2l0aCh1LG11dGF0aW9uUmVwbGFjZXIpLGk/dm9pZCAwOnV9fWFzeW5jIEV4YW1wbGVFbGVtZW50KHMsbyxpLGEsdSxfKXtpZighT3Uocy5leHRlcm5hbFZhbHVlKSlyZXR1cm47aWYocy5oYXNLZXkoInZhbHVlIikmJk91KHMuZXh0ZXJuYWxWYWx1ZSkpe2NvbnN0IG89bmV3IEtvKCJFeGFtcGxlRWxlbWVudCB2YWx1ZSBhbmQgZXh0ZXJuYWxWYWx1ZSBmaWVsZHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iKTtyZXR1cm4gdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyl9Y29uc3Qgdz10aGlzLnRvQmFzZVVSSShzZXJpYWxpemVyc192YWx1ZShzLmV4dGVybmFsVmFsdWUpKSx4PXN0cmlwSGFzaCh0aGlzLnJlZmVyZW5jZS51cmkpPT09dyxDPSF4O2lmKCF0aGlzLm9wdGlvbnMucmVzb2x2ZS5pbnRlcm5hbCYmeClyZXR1cm47aWYoIXRoaXMub3B0aW9ucy5yZXNvbHZlLmV4dGVybmFsJiZDKXJldHVybjtsZXQgajt0cnl7aj1hd2FpdCB0aGlzLnRvUmVmZXJlbmNlKHNlcmlhbGl6ZXJzX3ZhbHVlKHMuZXh0ZXJuYWxWYWx1ZSkpfWNhdGNoKG8pe3JldHVybiB0aGlzLmhhbmRsZURlcmVmZXJlbmNlRXJyb3IobyxzKX1jb25zdCBMPWNsb25lU2hhbGxvdyhqLnZhbHVlLnJlc3VsdCk7TC5zZXRNZXRhUHJvcGVydHkoInJlZi1vcmlnaW4iLGoudXJpKTtjb25zdCBCPWNsb25lU2hhbGxvdyhzKTtyZXR1cm4gQi52YWx1ZT1MLF8ucmVwbGFjZVdpdGgoQixtdXRhdGlvblJlcGxhY2VyKSxpP3ZvaWQgMDpCfWFzeW5jIE1lbWJlckVsZW1lbnQocyxvLGksYSx1LF8pe3ZhciB3O2NvbnN0IHg9dVt1Lmxlbmd0aC0xXTtpZighUHUoeCl8fCF4LmNsYXNzZXMuY29udGFpbnMoImRpc2NyaW1pbmF0b3ItbWFwcGluZyIpKXJldHVybjtpZihudWxsPT09KHc9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLnN0cmF0ZWd5T3B0c1sib3BlbmFwaS0zLTEiXSl8fHZvaWQgMD09PXd8fCF3LmRlcmVmZXJlbmNlRGlzY3JpbWluYXRvck1hcHBpbmcpcmV0dXJuITE7aWYoIU91KHMua2V5KXx8IU91KHMudmFsdWUpKXJldHVybiExO2lmKHRoaXMuaW5kaXJlY3Rpb25zLmluY2x1ZGVzKHMpKXJldHVybiExO3RoaXMuaW5kaXJlY3Rpb25zLnB1c2gocyk7Y29uc3RbQyxqXT10aGlzLnRvQW5jZXN0b3JMaW5lYWdlKFsuLi51LGldKSxMPVsuLi5qXS5maW5kTGFzdChhRSksQj1jbG9uZURlZXAoTC5nZXRNZXRhUHJvcGVydHkoImFuY2VzdG9yc1NjaGVtYUlkZW50aWZpZXJzIikpLCQ9c2VyaWFsaXplcnNfdmFsdWUocy52YWx1ZSksVT0vXlthLXpBLVowLTlcXC5cXC1fXSskLy50ZXN0KCQpP2AjL2NvbXBvbmVudHMvc2NoZW1hcy8keyR9YDokLFY9bmV3IG9fKHskcmVmOlV9KTtWLnNldE1ldGFQcm9wZXJ0eSgiYW5jZXN0b3JzU2NoZW1hSWRlbnRpZmllcnMiLEIpLGouYWRkKFYpO2NvbnN0IHo9bmV3IE9wZW5BUEkzXzFEZXJlZmVyZW5jZVZpc2l0b3Ioe3JlZmVyZW5jZTp0aGlzLnJlZmVyZW5jZSxuYW1lc3BhY2U6dGhpcy5uYW1lc3BhY2UsaW5kaXJlY3Rpb25zOlsuLi50aGlzLmluZGlyZWN0aW9uc10sb3B0aW9uczp0aGlzLmdldE5lc3RlZFZpc2l0b3JPcHRpb25zKFYpLHJlZnJhY3RDYWNoZTp0aGlzLnJlZnJhY3RDYWNoZSxhbmNlc3RvcnM6QyxhbGxPZkRpc2NyaW1pbmF0b3JNYXBwaW5nOnRoaXMuYWxsT2ZEaXNjcmltaW5hdG9yTWFwcGluZ30pO2xldCBZO3RyeXtZPWF3YWl0IG54KFYseix7a2V5TWFwOml3LG5vZGVUeXBlR2V0dGVyOmFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfdHJhdmVyc2FsX3Zpc2l0b3JfZ2V0Tm9kZVR5cGV9KX1jYXRjaChzKXtyZXR1cm4gdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKHMsVixqKX1qLmRlbGV0ZShWKSx0aGlzLmluZGlyZWN0aW9ucy5wb3AoKTtjb25zdCBaPWNsb25lU2hhbGxvdyhzKTtyZXR1cm4gWi52YWx1ZS5zZXRNZXRhUHJvcGVydHkoInJlZi1zY2hlbWEiLFkpLF8ucmVwbGFjZVdpdGgoWixtdXRhdGlvblJlcGxhY2VyKSxpP3ZvaWQgMDpafWFzeW5jIFNjaGVtYUVsZW1lbnQocyxvLGksYSx1LF8pe3ZhciB3O2lmKCFPdShzLiRyZWYpKXJldHVybjtpZih0aGlzLmluZGlyZWN0aW9ucy5pbmNsdWRlcyhzKSlyZXR1cm4hMTtjb25zdFt4LENdPXRoaXMudG9BbmNlc3RvckxpbmVhZ2UoWy4uLnUsaV0pO2xldCBqO3RyeXtqPWF3YWl0IHRoaXMudG9SZWZlcmVuY2UodW5zYW5pdGl6ZSh0aGlzLnJlZmVyZW5jZS51cmkpKX1jYXRjaChvKXtyZXR1cm4gdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyxDKX1sZXR7dXJpOkx9PWo7Y29uc3QgQj1yZXNvbHZlU2NoZW1hJHJlZkZpZWxkKEwscyksJD1zdHJpcEhhc2goQiksVT1uZXcgX3coe3VyaTokfSksVj16dygocz0+cy5jYW5SZWFkKFUpKSx0aGlzLm9wdGlvbnMucmVzb2x2ZS5yZXNvbHZlcnMpLHo9IVY7bGV0IFksWj1zdHJpcEhhc2godGhpcy5yZWZlcmVuY2UudXJpKT09PUIsZWU9IVo7dGhpcy5pbmRpcmVjdGlvbnMucHVzaChzKTt0cnl7aWYoVnx8eil7TD10aGlzLnRvQmFzZVVSSShCKTtjb25zdCBzPUIsbz1tYXliZVJlZnJhY3RUb1NjaGVtYUVsZW1lbnQoai52YWx1ZS5yZXN1bHQpO2lmKFk9dXJpX2V2YWx1YXRlKHMsbyksWT1tYXliZVJlZnJhY3RUb1NjaGVtYUVsZW1lbnQoWSksWS5pZD1zeC5pZGVudGlmeShZKSwhdGhpcy5vcHRpb25zLnJlc29sdmUuaW50ZXJuYWwmJlopcmV0dXJuO2lmKCF0aGlzLm9wdGlvbnMucmVzb2x2ZS5leHRlcm5hbCYmZWUpcmV0dXJufWVsc2V7aWYoTD10aGlzLnRvQmFzZVVSSShCKSxaPXN0cmlwSGFzaCh0aGlzLnJlZmVyZW5jZS51cmkpPT09TCxlZT0hWiwhdGhpcy5vcHRpb25zLnJlc29sdmUuaW50ZXJuYWwmJlopcmV0dXJuO2lmKCF0aGlzLm9wdGlvbnMucmVzb2x2ZS5leHRlcm5hbCYmZWUpcmV0dXJuO2o9YXdhaXQgdGhpcy50b1JlZmVyZW5jZSh1bnNhbml0aXplKEIpKTtjb25zdCBzPWZyb21VUklSZWZlcmVuY2UoQiksbz1tYXliZVJlZnJhY3RUb1NjaGVtYUVsZW1lbnQoai52YWx1ZS5yZXN1bHQpO1k9YXBpZG9tX2V2YWx1YXRlKG8scyksWT1tYXliZVJlZnJhY3RUb1NjaGVtYUVsZW1lbnQoWSksWS5pZD1zeC5pZGVudGlmeShZKX19Y2F0Y2gobyl7aWYoISh6JiZvIGluc3RhbmNlb2YgUXcpKXJldHVybiB0aGlzLmluZGlyZWN0aW9ucy5wb3AoKSx0aGlzLmhhbmRsZURlcmVmZXJlbmNlRXJyb3IobyxzLEMpO2lmKGlzQW5jaG9yKHVyaVRvQW5jaG9yKEIpKSl7aWYoWj1zdHJpcEhhc2godGhpcy5yZWZlcmVuY2UudXJpKT09PUwsZWU9IVosIXRoaXMub3B0aW9ucy5yZXNvbHZlLmludGVybmFsJiZaKXJldHVybjtpZighdGhpcy5vcHRpb25zLnJlc29sdmUuZXh0ZXJuYWwmJmVlKXJldHVybjt0cnl7aj1hd2FpdCB0aGlzLnRvUmVmZXJlbmNlKHVuc2FuaXRpemUoQikpfWNhdGNoKG8pe3JldHVybiB0aGlzLmluZGlyZWN0aW9ucy5wb3AoKSx0aGlzLmhhbmRsZURlcmVmZXJlbmNlRXJyb3IobyxzLEMpfWNvbnN0IG89dXJpVG9BbmNob3IoQiksaT1tYXliZVJlZnJhY3RUb1NjaGVtYUVsZW1lbnQoai52YWx1ZS5yZXN1bHQpO3RyeXtZPSRhbmNob3JfZXZhbHVhdGUobyxpKX1jYXRjaChvKXtyZXR1cm4gdGhpcy5pbmRpcmVjdGlvbnMucG9wKCksdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyxDKX1ZPW1heWJlUmVmcmFjdFRvU2NoZW1hRWxlbWVudChZKSxZLmlkPXN4LmlkZW50aWZ5KFkpfWVsc2V7aWYoTD10aGlzLnRvQmFzZVVSSShCKSxaPXN0cmlwSGFzaCh0aGlzLnJlZmVyZW5jZS51cmkpPT09TCxlZT0hWiwhdGhpcy5vcHRpb25zLnJlc29sdmUuaW50ZXJuYWwmJlopcmV0dXJuO2lmKCF0aGlzLm9wdGlvbnMucmVzb2x2ZS5leHRlcm5hbCYmZWUpcmV0dXJuO3RyeXtqPWF3YWl0IHRoaXMudG9SZWZlcmVuY2UodW5zYW5pdGl6ZShCKSl9Y2F0Y2gobyl7cmV0dXJuIHRoaXMuaW5kaXJlY3Rpb25zLnBvcCgpLHRoaXMuaGFuZGxlRGVyZWZlcmVuY2VFcnJvcihvLHMsQyl9Y29uc3Qgbz1mcm9tVVJJUmVmZXJlbmNlKEIpLGk9bWF5YmVSZWZyYWN0VG9TY2hlbWFFbGVtZW50KGoudmFsdWUucmVzdWx0KTt0cnl7WT1hcGlkb21fZXZhbHVhdGUoaSxvKX1jYXRjaChvKXtyZXR1cm4gdGhpcy5pbmRpcmVjdGlvbnMucG9wKCksdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyxDKX1ZPW1heWJlUmVmcmFjdFRvU2NoZW1hRWxlbWVudChZKSxZLmlkPXN4LmlkZW50aWZ5KFkpfX1pZihzPT09WSl7Y29uc3Qgbz1uZXcgS28oIlJlY3Vyc2l2ZSBTY2hlbWEgT2JqZWN0IHJlZmVyZW5jZSBkZXRlY3RlZCIpO3JldHVybiB0aGlzLmluZGlyZWN0aW9ucy5wb3AoKSx0aGlzLmhhbmRsZURlcmVmZXJlbmNlRXJyb3IobyxzLEMpfWlmKHRoaXMuaW5kaXJlY3Rpb25zLmxlbmd0aD50aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UubWF4RGVwdGgpe2NvbnN0IG89bmV3IFp3KGBNYXhpbXVtIGRlcmVmZXJlbmNlIGRlcHRoIG9mICIke3RoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5tYXhEZXB0aH0iIGhhcyBiZWVuIGV4Y2VlZGVkIGluIGZpbGUgIiR7dGhpcy5yZWZlcmVuY2UudXJpfSJgKTtyZXR1cm4gdGhpcy5pbmRpcmVjdGlvbnMucG9wKCksdGhpcy5oYW5kbGVEZXJlZmVyZW5jZUVycm9yKG8scyxDKX1pZih4LmluY2x1ZGVzKFkpKXtpZihqLnJlZlNldC5jaXJjdWxhcj0hMCwiZXJyb3IiPT09dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmNpcmN1bGFyKXtjb25zdCBvPW5ldyBLbygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIik7cmV0dXJuIHRoaXMuaW5kaXJlY3Rpb25zLnBvcCgpLHRoaXMuaGFuZGxlRGVyZWZlcmVuY2VFcnJvcihvLHMsQyl9aWYoInJlcGxhY2UiPT09dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmNpcmN1bGFyKXt2YXIgaWUsYWU7Y29uc3Qgbz1uZXcgdnUuc0koWS5pZCx7dHlwZToianNvbi1zY2hlbWEiLHVyaTpqLnVyaSwkcmVmOnNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZil9KSxhPShudWxsIT09KGllPW51bGw9PT0oYWU9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLnN0cmF0ZWd5T3B0c1sib3BlbmFwaS0zLTEiXSl8fHZvaWQgMD09PWFlP3ZvaWQgMDphZS5jaXJjdWxhclJlcGxhY2VyKSYmdm9pZCAwIT09aWU/aWU6dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmNpcmN1bGFyUmVwbGFjZXIpKG8pO3JldHVybiBfLnJlcGxhY2VXaXRoKGEsbXV0YXRpb25SZXBsYWNlciksIWkmJmF9fWNvbnN0IGNlPXN0cmlwSGFzaChqLnJlZlNldC5yb290UmVmLnVyaSkhPT1qLnVyaSxsZT1bImVycm9yIiwicmVwbGFjZSJdLmluY2x1ZGVzKHRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5jaXJjdWxhcik7aWYoKGVlfHxjZXx8YUUoWSkmJk91KFkuJHJlZil8fGxlfHxudWxsIT09KHc9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmRlcmVmZXJlbmNlT3B0cykmJnZvaWQgMCE9PXcmJncuY29udGludWVPbkVycm9yKSYmIXguaW5jbHVkZXNDeWNsZShZKSl7Qy5hZGQocyk7Y29uc3Qgbz1uZXcgT3BlbkFQSTNfMURlcmVmZXJlbmNlVmlzaXRvcih7cmVmZXJlbmNlOmosbmFtZXNwYWNlOnRoaXMubmFtZXNwYWNlLGluZGlyZWN0aW9uczpbLi4udGhpcy5pbmRpcmVjdGlvbnNdLG9wdGlvbnM6dGhpcy5nZXROZXN0ZWRWaXNpdG9yT3B0aW9ucyhzKSxyZWZyYWN0Q2FjaGU6dGhpcy5yZWZyYWN0Q2FjaGUsYW5jZXN0b3JzOngsYWxsT2ZEaXNjcmltaW5hdG9yTWFwcGluZzp0aGlzLmFsbE9mRGlzY3JpbWluYXRvck1hcHBpbmd9KTt0cnl7WT1hd2FpdCBueChZLG8se2tleU1hcDppdyxub2RlVHlwZUdldHRlcjphcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3RyYXZlcnNhbF92aXNpdG9yX2dldE5vZGVUeXBlfSl9Y2F0Y2gobyl7cmV0dXJuIHRoaXMuaW5kaXJlY3Rpb25zLnBvcCgpLHRoaXMuaGFuZGxlRGVyZWZlcmVuY2VFcnJvcihvLHMsQyl9Qy5kZWxldGUocyl9aWYodGhpcy5pbmRpcmVjdGlvbnMucG9wKCkscHJlZGljYXRlc19pc0Jvb2xlYW5Kc29uU2NoZW1hRWxlbWVudChZKSl7Y29uc3Qgbz1jbG9uZURlZXAoWSk7cmV0dXJuIG8uc2V0TWV0YVByb3BlcnR5KCJpZCIsc3guZ2VuZXJhdGVJZCgpKSxvLnNldE1ldGFQcm9wZXJ0eSgicmVmLWZpZWxkcyIseyRyZWY6c2VyaWFsaXplcnNfdmFsdWUocy4kcmVmKSwkcmVmQmFzZVVSSTpCfSksby5zZXRNZXRhUHJvcGVydHkoInJlZi1vcmlnaW4iLGoudXJpKSxvLnNldE1ldGFQcm9wZXJ0eSgicmVmLXJlZmVyZW5jaW5nLWVsZW1lbnQtaWQiLGNsb25lRGVlcChzeC5pZGVudGlmeShzKSkpLF8ucmVwbGFjZVdpdGgobyxtdXRhdGlvblJlcGxhY2VyKSwhaSYmb31pZihhRShZKSl7dmFyIHBlLGRlO2NvbnN0IG89bmV3IG9fKFsuLi5ZLmNvbnRlbnRdLGNsb25lRGVlcChZLm1ldGEpLGNsb25lRGVlcChZLmF0dHJpYnV0ZXMpKTtpZihvLnNldE1ldGFQcm9wZXJ0eSgiaWQiLHN4LmdlbmVyYXRlSWQoKSkscy5mb3JFYWNoKCgocyxpLGEpPT57by5yZW1vdmUoc2VyaWFsaXplcnNfdmFsdWUoaSkpLG8uY29udGVudC5wdXNoKGEpfSkpLG8ucmVtb3ZlKCIkcmVmIiksby5zZXRNZXRhUHJvcGVydHkoInJlZi1maWVsZHMiLHskcmVmOnNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZiksJHJlZkJhc2VVUkk6Qn0pLG8uc2V0TWV0YVByb3BlcnR5KCJyZWYtb3JpZ2luIixqLnVyaSksby5zZXRNZXRhUHJvcGVydHkoInJlZi1yZWZlcmVuY2luZy1lbGVtZW50LWlkIixjbG9uZURlZXAoc3guaWRlbnRpZnkocykpKSxudWxsIT09KHBlPXRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5kZXJlZmVyZW5jZU9wdHMpJiZ2b2lkIDAhPT1wZSYmcGUuY29udGludWVPbkVycm9yJiZvLnNldE1ldGFQcm9wZXJ0eSgicmVmLXJlZmVyZW5jaW5nLWVsZW1lbnQiLHMpLG51bGwhPT0oZGU9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLnN0cmF0ZWd5T3B0c1sib3BlbmFwaS0zLTEiXSkmJnZvaWQgMCE9PWRlJiZkZS5kZXJlZmVyZW5jZURpc2NyaW1pbmF0b3JNYXBwaW5nKXt2YXIgZmU7Y29uc3Qgcz11W3UubGVuZ3RoLTFdLGk9Wy4uLkNdLmZpbmRMYXN0KGFFKSxhPW51bGw9PWk/dm9pZCAwOmkuZ2V0TWV0YVByb3BlcnR5KCJzY2hlbWFOYW1lIiksXz1zZXJpYWxpemVyc192YWx1ZShvLmdldE1ldGFQcm9wZXJ0eSgic2NoZW1hTmFtZSIpKTtpZihfJiZhJiZudWxsIT1zJiZudWxsIT09KGZlPXMuY2xhc3NlcykmJnZvaWQgMCE9PWZlJiZmZS5jb250YWlucygianNvbi1zY2hlbWEtYWxsT2YiKSl7dmFyIHllO2NvbnN0IHM9bnVsbCE9PSh5ZT10aGlzLmFsbE9mRGlzY3JpbWluYXRvck1hcHBpbmcuZ2V0KF8pKSYmdm9pZCAwIT09eWU/eWU6W107cy5wdXNoKGkpLHRoaXMuYWxsT2ZEaXNjcmltaW5hdG9yTWFwcGluZy5zZXQoXyxzKX19WT1vfXJldHVybiBfLnJlcGxhY2VXaXRoKFksbXV0YXRpb25SZXBsYWNlciksaT92b2lkIDA6WX19Y29uc3Qgb3g9T3BlbkFQSTNfMURlcmVmZXJlbmNlVmlzaXRvcixpeD12aXNpdG9yX3Zpc2l0W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLnByb21pc2lmeS5jdXN0b20iKV07Y29uc3QgYXg9Y2xhc3MgT3BlbkFQSTNfMURlcmVmZXJlbmNlU3RyYXRlZ3kgZXh0ZW5kcyBWd3tjb25zdHJ1Y3RvcihzKXtzdXBlcih7Li4ubnVsbCE9cz9zOnt9LG5hbWU6Im9wZW5hcGktMy0xIn0pfWNhbkRlcmVmZXJlbmNlKHMpe3ZhciBvO3JldHVybiJ0ZXh0L3BsYWluIiE9PXMubWVkaWFUeXBlP3B3LmluY2x1ZGVzKHMubWVkaWFUeXBlKTpRXyhudWxsPT09KG89cy5wYXJzZVJlc3VsdCl8fHZvaWQgMD09PW8/dm9pZCAwOm8ucmVzdWx0KX1hc3luYyBkZXJlZmVyZW5jZShzLG8pe3ZhciBpO2NvbnN0IGE9Y3JlYXRlTmFtZXNwYWNlKGN3KSx1PW51bGwhPT0oaT1vLmRlcmVmZXJlbmNlLnJlZlNldCkmJnZvaWQgMCE9PWk/aTpuZXcgZHcsXz1uZXcgZHc7bGV0IHcseD11O3UuaGFzKHMudXJpKT93PXUuZmluZChVdyhzLnVyaSwidXJpIikpOih3PW5ldyBodyh7dXJpOnMudXJpLHZhbHVlOnMucGFyc2VSZXN1bHR9KSx1LmFkZCh3KSksby5kZXJlZmVyZW5jZS5pbW11dGFibGUmJih1LnJlZnMubWFwKChzPT5uZXcgaHcoey4uLnMsdmFsdWU6Y2xvbmVEZWVwKHMudmFsdWUpfSkpKS5mb3JFYWNoKChzPT5fLmFkZChzKSkpLHc9Xy5maW5kKChvPT5vLnVyaT09PXMudXJpKSkseD1fKTtjb25zdCBDPW5ldyBveCh7cmVmZXJlbmNlOncsbmFtZXNwYWNlOmEsb3B0aW9uczpvfSksaj1hd2FpdCBpeCh4LnJvb3RSZWYudmFsdWUsQyx7a2V5TWFwOml3LG5vZGVUeXBlR2V0dGVyOmFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfdHJhdmVyc2FsX3Zpc2l0b3JfZ2V0Tm9kZVR5cGV9KTtyZXR1cm4gby5kZXJlZmVyZW5jZS5pbW11dGFibGUmJl8ucmVmcy5maWx0ZXIoKHM9PnMudXJpLnN0YXJ0c1dpdGgoImltbXV0YWJsZTovLyIpKSkubWFwKChzPT5uZXcgaHcoey4uLnMsdXJpOnMudXJpLnJlcGxhY2UoL15pbW11dGFibGU6XC9cLy8sIiIpfSkpKS5mb3JFYWNoKChzPT51LmFkZChzKSkpLG51bGw9PT1vLmRlcmVmZXJlbmNlLnJlZlNldCYmdS5jbGVhbigpLF8uY2xlYW4oKSxqfX0sdG9fcGF0aD1zPT57Y29uc3Qgbz0ocz0+cy5zbGljZSgyKSkocyk7cmV0dXJuIG8ucmVkdWNlKCgocyxpLGEpPT57aWYoVHUoaSkpe2NvbnN0IG89U3RyaW5nKHNlcmlhbGl6ZXJzX3ZhbHVlKGkua2V5KSk7cy5wdXNoKG8pfWVsc2UgaWYoSXUob1thLTJdKSl7Y29uc3QgdT1vW2EtMl0uY29udGVudC5pbmRleE9mKGkpO3MucHVzaCh1KX1yZXR1cm4gc30pLFtdKX07Y29uc3QgY3g9Y2xhc3MgTW9kZWxQcm9wZXJ0eU1hY3JvVmlzaXRvcnttb2RlbFByb3BlcnR5TWFjcm87b3B0aW9ucztTY2hlbWFFbGVtZW50PXtsZWF2ZToocyxvLGksYSx1KT0+e3ZvaWQgMCE9PXMucHJvcGVydGllcyYmUHUocy5wcm9wZXJ0aWVzKSYmcy5wcm9wZXJ0aWVzLmZvckVhY2goKG89PntpZihQdShvKSl0cnl7Y29uc3Qgcz10aGlzLm1vZGVsUHJvcGVydHlNYWNybyhzZXJpYWxpemVyc192YWx1ZShvKSk7by5zZXQoImRlZmF1bHQiLHMpfWNhdGNoKG8pe3ZhciBhLF87Y29uc3Qgdz1uZXcgRXJyb3Iobyx7Y2F1c2U6b30pO3cuZnVsbFBhdGg9Wy4uLnRvX3BhdGgoWy4uLnUsaSxzXSksInByb3BlcnRpZXMiXSxudWxsPT09KGE9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmRlcmVmZXJlbmNlT3B0cyl8fHZvaWQgMD09PWF8fG51bGw9PT0oYT1hLmVycm9ycyl8fHZvaWQgMD09PWF8fG51bGw9PT0oXz1hLnB1c2gpfHx2b2lkIDA9PT1ffHxfLmNhbGwoYSx3KX19KSl9fTtjb25zdHJ1Y3Rvcih7bW9kZWxQcm9wZXJ0eU1hY3JvOnMsb3B0aW9uczpvfSl7dGhpcy5tb2RlbFByb3BlcnR5TWFjcm89cyx0aGlzLm9wdGlvbnM9b319O3ZhciBseD1mdW5jdGlvbigpe2Z1bmN0aW9uIFhVbmlxV2l0aChzLG8pe3RoaXMueGY9byx0aGlzLnByZWQ9cyx0aGlzLml0ZW1zPVtdfXJldHVybiBYVW5pcVdpdGgucHJvdG90eXBlWyJAQHRyYW5zZHVjZXIvaW5pdCJdPV94ZkJhc2VfaW5pdCxYVW5pcVdpdGgucHJvdG90eXBlWyJAQHRyYW5zZHVjZXIvcmVzdWx0Il09X3hmQmFzZV9yZXN1bHQsWFVuaXFXaXRoLnByb3RvdHlwZVsiQEB0cmFuc2R1Y2VyL3N0ZXAiXT1mdW5jdGlvbihzLG8pe3JldHVybiBfaW5jbHVkZXNXaXRoKHRoaXMucHJlZCxvLHRoaXMuaXRlbXMpP3M6KHRoaXMuaXRlbXMucHVzaChvKSx0aGlzLnhmWyJAQHRyYW5zZHVjZXIvc3RlcCJdKHMsbykpfSxYVW5pcVdpdGh9KCk7ZnVuY3Rpb24gX3h1bmlxV2l0aChzKXtyZXR1cm4gZnVuY3Rpb24obyl7cmV0dXJuIG5ldyBseChzLG8pfX12YXIgdXg9X2N1cnJ5MihfZGlzcGF0Y2hhYmxlKFtdLF94dW5pcVdpdGgsKGZ1bmN0aW9uKHMsbyl7Zm9yKHZhciBpLGE9MCx1PW8ubGVuZ3RoLF89W107YTx1OylfaW5jbHVkZXNXaXRoKHMsaT1vW2FdLF8pfHwoX1tfLmxlbmd0aF09aSksYSs9MTtyZXR1cm4gX30pKSk7Y29uc3QgcHg9dXg7Y29uc3QgaHg9Y2xhc3MgYWxsX29mX0FsbE9mVmlzaXRvcntvcHRpb25zO1NjaGVtYUVsZW1lbnQ9e2xlYXZlKHMsbyxpLGEsdSl7aWYodm9pZCAwPT09cy5hbGxPZilyZXR1cm47aWYoIUl1KHMuYWxsT2YpKXt2YXIgXyx3O2NvbnN0IG89bmV3IFR5cGVFcnJvcigiYWxsT2YgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybiBvLmZ1bGxQYXRoPVsuLi50b19wYXRoKFsuLi51LGksc10pLCJhbGxPZiJdLHZvaWQobnVsbD09PShfPXRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5kZXJlZmVyZW5jZU9wdHMpfHx2b2lkIDA9PT1ffHxudWxsPT09KF89Xy5lcnJvcnMpfHx2b2lkIDA9PT1ffHxudWxsPT09KHc9Xy5wdXNoKXx8dm9pZCAwPT09d3x8dy5jYWxsKF8sbykpfWlmKHMuYWxsT2YuaXNFbXB0eSlyZXR1cm4gdm9pZCBzLnJlbW92ZSgiYWxsT2YiKTtpZighcy5hbGxPZi5jb250ZW50LmV2ZXJ5KGFFKSl7dmFyIHgsQztjb25zdCBvPW5ldyBUeXBlRXJyb3IoIkVsZW1lbnRzIGluIGFsbE9mIG11c3QgYmUgb2JqZWN0cyIpO3JldHVybiBvLmZ1bGxQYXRoPVsuLi50b19wYXRoKFsuLi51LGksc10pLCJhbGxPZiJdLHZvaWQobnVsbD09PSh4PXRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5kZXJlZmVyZW5jZU9wdHMpfHx2b2lkIDA9PT14fHxudWxsPT09KHg9eC5lcnJvcnMpfHx2b2lkIDA9PT14fHxudWxsPT09KEM9eC5wdXNoKXx8dm9pZCAwPT09Q3x8Qy5jYWxsKHgsbykpfWZvcig7cy5oYXNLZXkoImFsbE9mIik7KXtjb25zdHthbGxPZjpvfT1zO3MucmVtb3ZlKCJhbGxPZiIpO2NvbnN0IGk9Y2QuYWxsKFsuLi5vLmNvbnRlbnQsc10se2N1c3RvbU1lcmdlOnM9PiJlbnVtIj09PXNlcmlhbGl6ZXJzX3ZhbHVlKHMpPyhzLG8pPT57aWYoaW5jbHVkZXNDbGFzc2VzKFsianNvbi1zY2hlbWEtZW51bSJdLHMpJiZpbmNsdWRlc0NsYXNzZXMoWyJqc29uLXNjaGVtYS1lbnVtIl0sbykpe2NvbnN0IGFyZUVsZW1lbnRzRXF1YWw9KHMsbyk9PiEoSXUocyl8fEl1KG8pfHxQdShzKXx8UHUobykpJiZzLmVxdWFscyhzZXJpYWxpemVyc192YWx1ZShvKSksaT1jbG9uZVNoYWxsb3cocyk7cmV0dXJuIGkuY29udGVudD1weChhcmVFbGVtZW50c0VxdWFsKShbLi4ucy5jb250ZW50LC4uLm8uY29udGVudF0pLGl9cmV0dXJuIGNkKHMsbyl9OmNkfSk7aWYocy5oYXNLZXkoIiQkcmVmIil8fGkucmVtb3ZlKCIkJHJlZiIpLHMuaGFzS2V5KCJleGFtcGxlIikpe2NvbnN0IG89aS5nZXRNZW1iZXIoImV4YW1wbGUiKTtvJiYoby52YWx1ZT1zLmdldCgiZXhhbXBsZSIpKX1pZihzLmhhc0tleSgiZXhhbXBsZXMiKSl7Y29uc3Qgbz1pLmdldE1lbWJlcigiZXhhbXBsZXMiKTtvJiYoby52YWx1ZT1zLmdldCgiZXhhbXBsZXMiKSl9cy5jb250ZW50PWkuY29udGVudH19fTtjb25zdHJ1Y3Rvcih7b3B0aW9uczpzfSl7dGhpcy5vcHRpb25zPXN9fTtjb25zdCBkeD1jbGFzcyBQYXJhbWV0ZXJNYWNyb1Zpc2l0b3J7cGFyYW1ldGVyTWFjcm87b3B0aW9uczsjbjtPcGVyYXRpb25FbGVtZW50PXtlbnRlcjpzPT57dGhpcy4jbj1zfSxsZWF2ZTooKT0+e3RoaXMuI249dm9pZCAwfX07UGFyYW1ldGVyRWxlbWVudD17bGVhdmU6KHMsbyxpLGEsdSk9Pntjb25zdCBfPXRoaXMuI24/c2VyaWFsaXplcnNfdmFsdWUodGhpcy4jbik6bnVsbCx3PXNlcmlhbGl6ZXJzX3ZhbHVlKHMpO3RyeXtjb25zdCBvPXRoaXMucGFyYW1ldGVyTWFjcm8oXyx3KTtzLnNldCgiZGVmYXVsdCIsbyl9Y2F0Y2gocyl7dmFyIHgsQztjb25zdCBvPW5ldyBFcnJvcihzLHtjYXVzZTpzfSk7by5mdWxsUGF0aD10b19wYXRoKFsuLi51LGldKSxudWxsPT09KHg9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmRlcmVmZXJlbmNlT3B0cyl8fHZvaWQgMD09PXh8fG51bGw9PT0oeD14LmVycm9ycyl8fHZvaWQgMD09PXh8fG51bGw9PT0oQz14LnB1c2gpfHx2b2lkIDA9PT1DfHxDLmNhbGwoeCxvKX19fTtjb25zdHJ1Y3Rvcih7cGFyYW1ldGVyTWFjcm86cyxvcHRpb25zOm99KXt0aGlzLnBhcmFtZXRlck1hY3JvPXMsdGhpcy5vcHRpb25zPW99fSxnZXRfcm9vdF9jYXVzZT1zPT57aWYobnVsbD09cy5jYXVzZSlyZXR1cm4gcztsZXR7Y2F1c2U6b309cztmb3IoO251bGwhPW8uY2F1c2U7KW89by5jYXVzZTtyZXR1cm4gb307Y29uc3QgZng9Y2xhc3MgU2NoZW1hUmVmRXJyb3IgZXh0ZW5kcyBHb3t9LHt3cmFwRXJyb3I6bXh9PUhsLGd4PXZpc2l0b3JfdmlzaXRbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbSIpXSx5eD1uZXcgSWRlbnRpdHlNYW5hZ2VyLGRlcmVmZXJlbmNlX211dGF0aW9uUmVwbGFjZXI9KHMsbyxpLGEpPT57VHUoYSk/YS52YWx1ZT1zOkFycmF5LmlzQXJyYXkoYSkmJihhW2ldPXMpfTtjbGFzcyBPcGVuQVBJM18xU3dhZ2dlckNsaWVudERlcmVmZXJlbmNlVmlzaXRvciBleHRlbmRzIG94e3VzZUNpcmN1bGFyU3RydWN0dXJlczthbGxvd01ldGFQYXRjaGVzO2Jhc2VQYXRoO2NvbnN0cnVjdG9yKHthbGxvd01ldGFQYXRjaGVzOnM9ITAsdXNlQ2lyY3VsYXJTdHJ1Y3R1cmVzOm89ITEsYmFzZVBhdGg6aT1udWxsLC4uLmF9KXtzdXBlcihhKSx0aGlzLmFsbG93TWV0YVBhdGNoZXM9cyx0aGlzLnVzZUNpcmN1bGFyU3RydWN0dXJlcz1vLHRoaXMuYmFzZVBhdGg9aX1hc3luYyBSZWZlcmVuY2VFbGVtZW50KHMsbyxpLGEsdSxfKXt0cnl7aWYodGhpcy5pbmRpcmVjdGlvbnMuaW5jbHVkZXMocykpcmV0dXJuITE7Y29uc3RbbyxhXT10aGlzLnRvQW5jZXN0b3JMaW5lYWdlKFsuLi51LGldKSxqPXRoaXMudG9CYXNlVVJJKHNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZikpLEw9c3RyaXBIYXNoKHRoaXMucmVmZXJlbmNlLnVyaSk9PT1qLEI9IUw7aWYoIXRoaXMub3B0aW9ucy5yZXNvbHZlLmludGVybmFsJiZMKXJldHVybiExO2lmKCF0aGlzLm9wdGlvbnMucmVzb2x2ZS5leHRlcm5hbCYmQilyZXR1cm4hMTtjb25zdCAkPWF3YWl0IHRoaXMudG9SZWZlcmVuY2Uoc2VyaWFsaXplcnNfdmFsdWUocy4kcmVmKSksVT1yZXNvbHZlKGosc2VyaWFsaXplcnNfdmFsdWUocy4kcmVmKSk7dGhpcy5pbmRpcmVjdGlvbnMucHVzaChzKTtjb25zdCBWPWZyb21VUklSZWZlcmVuY2UoVSk7bGV0IHo9YXBpZG9tX2V2YWx1YXRlKCQudmFsdWUucmVzdWx0LFYpO2lmKHouaWQ9eXguaWRlbnRpZnkoeiksaXNQcmltaXRpdmVFbGVtZW50KHopKXtjb25zdCBvPXNlcmlhbGl6ZXJzX3ZhbHVlKHMubWV0YS5nZXQoInJlZmVyZW5jZWQtZWxlbWVudCIpKSxpPWAke299LSR7c2VyaWFsaXplcnNfdmFsdWUoeXguaWRlbnRpZnkoeikpfWA7aWYodGhpcy5yZWZyYWN0Q2FjaGUuaGFzKGkpKXo9dGhpcy5yZWZyYWN0Q2FjaGUuZ2V0KGkpO2Vsc2UgaWYoaXNSZWZlcmVuY2VMaWtlRWxlbWVudCh6KSl6PUliLnJlZnJhY3Qoeiksei5zZXRNZXRhUHJvcGVydHkoInJlZmVyZW5jZWQtZWxlbWVudCIsbyksdGhpcy5yZWZyYWN0Q2FjaGUuc2V0KGkseik7ZWxzZXt6PXRoaXMubmFtZXNwYWNlLmdldEVsZW1lbnRDbGFzcyhvKS5yZWZyYWN0KHopLHRoaXMucmVmcmFjdENhY2hlLnNldChpLHopfX1pZihzPT09eil0aHJvdyBuZXcgS28oIlJlY3Vyc2l2ZSBSZWZlcmVuY2UgT2JqZWN0IGRldGVjdGVkIik7aWYodGhpcy5pbmRpcmVjdGlvbnMubGVuZ3RoPnRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5tYXhEZXB0aCl0aHJvdyBuZXcgWncoYE1heGltdW0gZGVyZWZlcmVuY2UgZGVwdGggb2YgIiR7dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLm1heERlcHRofSIgaGFzIGJlZW4gZXhjZWVkZWQgaW4gZmlsZSAiJHt0aGlzLnJlZmVyZW5jZS51cml9ImApO2lmKG8uaW5jbHVkZXMoeikpe2lmKCQucmVmU2V0LmNpcmN1bGFyPSEwLCJlcnJvciI9PT10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UuY2lyY3VsYXIpdGhyb3cgbmV3IEtvKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQiKTtpZigicmVwbGFjZSI9PT10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UuY2lyY3VsYXIpe3ZhciB3LHg7Y29uc3Qgbz1uZXcgdnUuc0koei5pZCx7dHlwZToicmVmZXJlbmNlIix1cmk6JC51cmksJHJlZjpzZXJpYWxpemVyc192YWx1ZShzLiRyZWYpLGJhc2VVUkk6VSxyZWZlcmVuY2luZ0VsZW1lbnQ6c30pLGE9KG51bGwhPT0odz1udWxsPT09KHg9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLnN0cmF0ZWd5T3B0c1sib3BlbmFwaS0zLTEiXSl8fHZvaWQgMD09PXg/dm9pZCAwOnguY2lyY3VsYXJSZXBsYWNlcikmJnZvaWQgMCE9PXc/dzp0aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UuY2lyY3VsYXJSZXBsYWNlcikobyk7cmV0dXJuIF8ucmVwbGFjZVdpdGgobyxkZXJlZmVyZW5jZV9tdXRhdGlvblJlcGxhY2VyKSwhaSYmYX19Y29uc3QgWT1zdHJpcEhhc2goJC5yZWZTZXQucm9vdFJlZi51cmkpIT09JC51cmksWj1bImVycm9yIiwicmVwbGFjZSJdLmluY2x1ZGVzKHRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5jaXJjdWxhcik7aWYoKEJ8fFl8fG5FKHopfHxaKSYmIW8uaW5jbHVkZXNDeWNsZSh6KSl7dmFyIEM7YS5hZGQocyk7Y29uc3QgXz1uZXcgT3BlbkFQSTNfMVN3YWdnZXJDbGllbnREZXJlZmVyZW5jZVZpc2l0b3Ioe3JlZmVyZW5jZTokLG5hbWVzcGFjZTp0aGlzLm5hbWVzcGFjZSxpbmRpcmVjdGlvbnM6Wy4uLnRoaXMuaW5kaXJlY3Rpb25zXSxvcHRpb25zOnRoaXMub3B0aW9ucyxyZWZyYWN0Q2FjaGU6dGhpcy5yZWZyYWN0Q2FjaGUsYW5jZXN0b3JzOm8sYWxsb3dNZXRhUGF0Y2hlczp0aGlzLmFsbG93TWV0YVBhdGNoZXMsdXNlQ2lyY3VsYXJTdHJ1Y3R1cmVzOnRoaXMudXNlQ2lyY3VsYXJTdHJ1Y3R1cmVzLGJhc2VQYXRoOm51bGwhPT0oQz10aGlzLmJhc2VQYXRoKSYmdm9pZCAwIT09Qz9DOlsuLi50b19wYXRoKFsuLi51LGksc10pLCIkcmVmIl19KTt6PWF3YWl0IGd4KHosXyx7a2V5TWFwOml3LG5vZGVUeXBlR2V0dGVyOmFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfdHJhdmVyc2FsX3Zpc2l0b3JfZ2V0Tm9kZVR5cGV9KSxhLmRlbGV0ZShzKX10aGlzLmluZGlyZWN0aW9ucy5wb3AoKTtjb25zdCBlZT1jbG9uZVNoYWxsb3coeik7aWYoZWUuc2V0TWV0YVByb3BlcnR5KCJyZWYtZmllbGRzIix7JHJlZjpzZXJpYWxpemVyc192YWx1ZShzLiRyZWYpLGRlc2NyaXB0aW9uOnNlcmlhbGl6ZXJzX3ZhbHVlKHMuZGVzY3JpcHRpb24pLHN1bW1hcnk6c2VyaWFsaXplcnNfdmFsdWUocy5zdW1tYXJ5KX0pLGVlLnNldE1ldGFQcm9wZXJ0eSgicmVmLW9yaWdpbiIsJC51cmkpLGVlLnNldE1ldGFQcm9wZXJ0eSgicmVmLXJlZmVyZW5jaW5nLWVsZW1lbnQtaWQiLGNsb25lRGVlcCh5eC5pZGVudGlmeShzKSkpLFB1KHopJiYocy5oYXNLZXkoImRlc2NyaXB0aW9uIikmJiJkZXNjcmlwdGlvbiJpbiB6JiYoZWUucmVtb3ZlKCJkZXNjcmlwdGlvbiIpLGVlLnNldCgiZGVzY3JpcHRpb24iLHMuZ2V0KCJkZXNjcmlwdGlvbiIpKSkscy5oYXNLZXkoInN1bW1hcnkiKSYmInN1bW1hcnkiaW4geiYmKGVlLnJlbW92ZSgic3VtbWFyeSIpLGVlLnNldCgic3VtbWFyeSIscy5nZXQoInN1bW1hcnkiKSkpKSx0aGlzLmFsbG93TWV0YVBhdGNoZXMmJlB1KGVlKSYmIWVlLmhhc0tleSgiJCRyZWYiKSl7Y29uc3Qgcz1yZXNvbHZlKGosVSk7ZWUuc2V0KCIkJHJlZiIscyl9cmV0dXJuIF8ucmVwbGFjZVdpdGgoZWUsZGVyZWZlcmVuY2VfbXV0YXRpb25SZXBsYWNlciksIWkmJmVlfWNhdGNoKG8pe3ZhciBqLEwsQjtjb25zdCBhPWdldF9yb290X2NhdXNlKG8pLF89bXgoYSx7YmFzZURvYzp0aGlzLnJlZmVyZW5jZS51cmksJHJlZjpzZXJpYWxpemVyc192YWx1ZShzLiRyZWYpLHBvaW50ZXI6ZnJvbVVSSVJlZmVyZW5jZShzZXJpYWxpemVyc192YWx1ZShzLiRyZWYpKSxmdWxsUGF0aDpudWxsIT09KGo9dGhpcy5iYXNlUGF0aCkmJnZvaWQgMCE9PWo/ajpbLi4udG9fcGF0aChbLi4udSxpLHNdKSwiJHJlZiJdfSk7cmV0dXJuIHZvaWQobnVsbD09PShMPXRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5kZXJlZmVyZW5jZU9wdHMpfHx2b2lkIDA9PT1MfHxudWxsPT09KEw9TC5lcnJvcnMpfHx2b2lkIDA9PT1MfHxudWxsPT09KEI9TC5wdXNoKXx8dm9pZCAwPT09Qnx8Qi5jYWxsKEwsXykpfX1hc3luYyBQYXRoSXRlbUVsZW1lbnQocyxvLGksYSx1LF8pe3RyeXtpZighT3Uocy4kcmVmKSlyZXR1cm47aWYodGhpcy5pbmRpcmVjdGlvbnMuaW5jbHVkZXMocykpcmV0dXJuITE7aWYoaW5jbHVkZXNDbGFzc2VzKFsiY3ljbGUiXSxzLiRyZWYpKXJldHVybiExO2NvbnN0W28sYV09dGhpcy50b0FuY2VzdG9yTGluZWFnZShbLi4udSxpXSksaj10aGlzLnRvQmFzZVVSSShzZXJpYWxpemVyc192YWx1ZShzLiRyZWYpKSxMPXN0cmlwSGFzaCh0aGlzLnJlZmVyZW5jZS51cmkpPT09aixCPSFMO2lmKCF0aGlzLm9wdGlvbnMucmVzb2x2ZS5pbnRlcm5hbCYmTClyZXR1cm47aWYoIXRoaXMub3B0aW9ucy5yZXNvbHZlLmV4dGVybmFsJiZCKXJldHVybjtjb25zdCAkPWF3YWl0IHRoaXMudG9SZWZlcmVuY2Uoc2VyaWFsaXplcnNfdmFsdWUocy4kcmVmKSksVT1yZXNvbHZlKGosc2VyaWFsaXplcnNfdmFsdWUocy4kcmVmKSk7dGhpcy5pbmRpcmVjdGlvbnMucHVzaChzKTtjb25zdCBWPWZyb21VUklSZWZlcmVuY2UoVSk7bGV0IHo9YXBpZG9tX2V2YWx1YXRlKCQudmFsdWUucmVzdWx0LFYpO2lmKHouaWQ9eXguaWRlbnRpZnkoeiksaXNQcmltaXRpdmVFbGVtZW50KHopKXtjb25zdCBzPWBwYXRoLWl0ZW0tJHtzZXJpYWxpemVyc192YWx1ZSh5eC5pZGVudGlmeSh6KSl9YDt0aGlzLnJlZnJhY3RDYWNoZS5oYXMocyk/ej10aGlzLnJlZnJhY3RDYWNoZS5nZXQocyk6KHo9QWIucmVmcmFjdCh6KSx0aGlzLnJlZnJhY3RDYWNoZS5zZXQocyx6KSl9aWYocz09PXopdGhyb3cgbmV3IEtvKCJSZWN1cnNpdmUgUGF0aCBJdGVtIE9iamVjdCByZWZlcmVuY2UgZGV0ZWN0ZWQiKTtpZih0aGlzLmluZGlyZWN0aW9ucy5sZW5ndGg+dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLm1heERlcHRoKXRocm93IG5ldyBadyhgTWF4aW11bSBkZXJlZmVyZW5jZSBkZXB0aCBvZiAiJHt0aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UubWF4RGVwdGh9IiBoYXMgYmVlbiBleGNlZWRlZCBpbiBmaWxlICIke3RoaXMucmVmZXJlbmNlLnVyaX0iYCk7aWYoby5pbmNsdWRlcyh6KSl7aWYoJC5yZWZTZXQuY2lyY3VsYXI9ITAsImVycm9yIj09PXRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5jaXJjdWxhcil0aHJvdyBuZXcgS28oIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCIpO2lmKCJyZXBsYWNlIj09PXRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5jaXJjdWxhcil7dmFyIHcseDtjb25zdCBvPW5ldyB2dS5zSSh6LmlkLHt0eXBlOiJwYXRoLWl0ZW0iLHVyaTokLnVyaSwkcmVmOnNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZiksYmFzZVVSSTpVLHJlZmVyZW5jaW5nRWxlbWVudDpzfSksYT0obnVsbCE9PSh3PW51bGw9PT0oeD10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2Uuc3RyYXRlZ3lPcHRzWyJvcGVuYXBpLTMtMSJdKXx8dm9pZCAwPT09eD92b2lkIDA6eC5jaXJjdWxhclJlcGxhY2VyKSYmdm9pZCAwIT09dz93OnRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5jaXJjdWxhclJlcGxhY2VyKShvKTtyZXR1cm4gXy5yZXBsYWNlV2l0aChvLGRlcmVmZXJlbmNlX211dGF0aW9uUmVwbGFjZXIpLCFpJiZhfX1jb25zdCBZPXN0cmlwSGFzaCgkLnJlZlNldC5yb290UmVmLnVyaSkhPT0kLnVyaSxaPVsiZXJyb3IiLCJyZXBsYWNlIl0uaW5jbHVkZXModGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmNpcmN1bGFyKTtpZigoQnx8WXx8dEUoeikmJk91KHouJHJlZil8fFopJiYhby5pbmNsdWRlc0N5Y2xlKHopKXt2YXIgQzthLmFkZChzKTtjb25zdCBfPW5ldyBPcGVuQVBJM18xU3dhZ2dlckNsaWVudERlcmVmZXJlbmNlVmlzaXRvcih7cmVmZXJlbmNlOiQsbmFtZXNwYWNlOnRoaXMubmFtZXNwYWNlLGluZGlyZWN0aW9uczpbLi4udGhpcy5pbmRpcmVjdGlvbnNdLG9wdGlvbnM6dGhpcy5vcHRpb25zLGFuY2VzdG9yczpvLGFsbG93TWV0YVBhdGNoZXM6dGhpcy5hbGxvd01ldGFQYXRjaGVzLHVzZUNpcmN1bGFyU3RydWN0dXJlczp0aGlzLnVzZUNpcmN1bGFyU3RydWN0dXJlcyxiYXNlUGF0aDpudWxsIT09KEM9dGhpcy5iYXNlUGF0aCkmJnZvaWQgMCE9PUM/QzpbLi4udG9fcGF0aChbLi4udSxpLHNdKSwiJHJlZiJdfSk7ej1hd2FpdCBneCh6LF8se2tleU1hcDppdyxub2RlVHlwZUdldHRlcjphcGlkb21fbnNfb3BlbmFwaV8zXzFfc3JjX3RyYXZlcnNhbF92aXNpdG9yX2dldE5vZGVUeXBlfSksYS5kZWxldGUocyl9aWYodGhpcy5pbmRpcmVjdGlvbnMucG9wKCksdEUoeikpe2NvbnN0IG89bmV3IEFiKFsuLi56LmNvbnRlbnRdLGNsb25lRGVlcCh6Lm1ldGEpLGNsb25lRGVlcCh6LmF0dHJpYnV0ZXMpKTtpZihzLmZvckVhY2goKChzLGksYSk9PntvLnJlbW92ZShzZXJpYWxpemVyc192YWx1ZShpKSksby5jb250ZW50LnB1c2goYSl9KSksby5yZW1vdmUoIiRyZWYiKSxvLnNldE1ldGFQcm9wZXJ0eSgicmVmLWZpZWxkcyIseyRyZWY6c2VyaWFsaXplcnNfdmFsdWUocy4kcmVmKX0pLG8uc2V0TWV0YVByb3BlcnR5KCJyZWYtb3JpZ2luIiwkLnVyaSksby5zZXRNZXRhUHJvcGVydHkoInJlZi1yZWZlcmVuY2luZy1lbGVtZW50LWlkIixjbG9uZURlZXAoeXguaWRlbnRpZnkocykpKSx0aGlzLmFsbG93TWV0YVBhdGNoZXMmJnZvaWQgMD09PW8uZ2V0KCIkJHJlZiIpKXtjb25zdCBzPXJlc29sdmUoaixVKTtvLnNldCgiJCRyZWYiLHMpfXo9b31yZXR1cm4gXy5yZXBsYWNlV2l0aCh6LGRlcmVmZXJlbmNlX211dGF0aW9uUmVwbGFjZXIpLGk/dm9pZCAwOnp9Y2F0Y2gobyl7dmFyIGosTCxCO2NvbnN0IGE9Z2V0X3Jvb3RfY2F1c2UobyksXz1teChhLHtiYXNlRG9jOnRoaXMucmVmZXJlbmNlLnVyaSwkcmVmOnNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZikscG9pbnRlcjpmcm9tVVJJUmVmZXJlbmNlKHNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZikpLGZ1bGxQYXRoOm51bGwhPT0oaj10aGlzLmJhc2VQYXRoKSYmdm9pZCAwIT09aj9qOlsuLi50b19wYXRoKFsuLi51LGksc10pLCIkcmVmIl19KTtyZXR1cm4gdm9pZChudWxsPT09KEw9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmRlcmVmZXJlbmNlT3B0cyl8fHZvaWQgMD09PUx8fG51bGw9PT0oTD1MLmVycm9ycyl8fHZvaWQgMD09PUx8fG51bGw9PT0oQj1MLnB1c2gpfHx2b2lkIDA9PT1CfHxCLmNhbGwoTCxfKSl9fWFzeW5jIFNjaGVtYUVsZW1lbnQocyxvLGksYSx1LF8pe3RyeXtpZighT3Uocy4kcmVmKSlyZXR1cm47aWYodGhpcy5pbmRpcmVjdGlvbnMuaW5jbHVkZXMocykpcmV0dXJuITE7Y29uc3RbbyxhXT10aGlzLnRvQW5jZXN0b3JMaW5lYWdlKFsuLi51LGldKTtsZXQgaj1hd2FpdCB0aGlzLnRvUmVmZXJlbmNlKHVuc2FuaXRpemUodGhpcy5yZWZlcmVuY2UudXJpKSkse3VyaTpMfT1qO2NvbnN0IEI9cmVzb2x2ZVNjaGVtYSRyZWZGaWVsZChMLHMpLCQ9c3RyaXBIYXNoKEIpLFU9bmV3IF93KHt1cmk6JH0pLFY9IXRoaXMub3B0aW9ucy5yZXNvbHZlLnJlc29sdmVycy5zb21lKChzPT5zLmNhblJlYWQoVSkpKSx6PSFWO2xldCBZLFo9c3RyaXBIYXNoKHRoaXMucmVmZXJlbmNlLnVyaSk9PT1CLGVlPSFaO3RoaXMuaW5kaXJlY3Rpb25zLnB1c2gocyk7dHJ5e2lmKFZ8fHope0w9dGhpcy50b0Jhc2VVUkkoQik7Y29uc3Qgcz1CLG89bWF5YmVSZWZyYWN0VG9TY2hlbWFFbGVtZW50KGoudmFsdWUucmVzdWx0KTtpZihZPXVyaV9ldmFsdWF0ZShzLG8pLFk9bWF5YmVSZWZyYWN0VG9TY2hlbWFFbGVtZW50KFkpLFkuaWQ9eXguaWRlbnRpZnkoWSksIXRoaXMub3B0aW9ucy5yZXNvbHZlLmludGVybmFsJiZaKXJldHVybjtpZighdGhpcy5vcHRpb25zLnJlc29sdmUuZXh0ZXJuYWwmJmVlKXJldHVybn1lbHNle2lmKEw9dGhpcy50b0Jhc2VVUkkoQiksWj1zdHJpcEhhc2godGhpcy5yZWZlcmVuY2UudXJpKT09PUwsZWU9IVosIXRoaXMub3B0aW9ucy5yZXNvbHZlLmludGVybmFsJiZaKXJldHVybjtpZighdGhpcy5vcHRpb25zLnJlc29sdmUuZXh0ZXJuYWwmJmVlKXJldHVybjtqPWF3YWl0IHRoaXMudG9SZWZlcmVuY2UodW5zYW5pdGl6ZShCKSk7Y29uc3Qgcz1mcm9tVVJJUmVmZXJlbmNlKEIpLG89bWF5YmVSZWZyYWN0VG9TY2hlbWFFbGVtZW50KGoudmFsdWUucmVzdWx0KTtZPWFwaWRvbV9ldmFsdWF0ZShvLHMpLFk9bWF5YmVSZWZyYWN0VG9TY2hlbWFFbGVtZW50KFkpLFkuaWQ9eXguaWRlbnRpZnkoWSl9fWNhdGNoKHMpe2lmKCEoeiYmcyBpbnN0YW5jZW9mIFF3KSl0aHJvdyBzO2lmKGlzQW5jaG9yKHVyaVRvQW5jaG9yKEIpKSl7aWYoWj1zdHJpcEhhc2godGhpcy5yZWZlcmVuY2UudXJpKT09PUwsZWU9IVosIXRoaXMub3B0aW9ucy5yZXNvbHZlLmludGVybmFsJiZaKXJldHVybjtpZighdGhpcy5vcHRpb25zLnJlc29sdmUuZXh0ZXJuYWwmJmVlKXJldHVybjtqPWF3YWl0IHRoaXMudG9SZWZlcmVuY2UodW5zYW5pdGl6ZShCKSk7Y29uc3Qgcz11cmlUb0FuY2hvcihCKSxvPW1heWJlUmVmcmFjdFRvU2NoZW1hRWxlbWVudChqLnZhbHVlLnJlc3VsdCk7WT0kYW5jaG9yX2V2YWx1YXRlKHMsbyksWT1tYXliZVJlZnJhY3RUb1NjaGVtYUVsZW1lbnQoWSksWS5pZD15eC5pZGVudGlmeShZKX1lbHNle2lmKEw9dGhpcy50b0Jhc2VVUkkoc2VyaWFsaXplcnNfdmFsdWUoQikpLFo9c3RyaXBIYXNoKHRoaXMucmVmZXJlbmNlLnVyaSk9PT1MLGVlPSFaLCF0aGlzLm9wdGlvbnMucmVzb2x2ZS5pbnRlcm5hbCYmWilyZXR1cm47aWYoIXRoaXMub3B0aW9ucy5yZXNvbHZlLmV4dGVybmFsJiZlZSlyZXR1cm47aj1hd2FpdCB0aGlzLnRvUmVmZXJlbmNlKHVuc2FuaXRpemUoQikpO2NvbnN0IHM9ZnJvbVVSSVJlZmVyZW5jZShCKSxvPW1heWJlUmVmcmFjdFRvU2NoZW1hRWxlbWVudChqLnZhbHVlLnJlc3VsdCk7WT1hcGlkb21fZXZhbHVhdGUobyxzKSxZPW1heWJlUmVmcmFjdFRvU2NoZW1hRWxlbWVudChZKSxZLmlkPXl4LmlkZW50aWZ5KFkpfX1pZihzPT09WSl0aHJvdyBuZXcgS28oIlJlY3Vyc2l2ZSBTY2hlbWEgT2JqZWN0IHJlZmVyZW5jZSBkZXRlY3RlZCIpO2lmKHRoaXMuaW5kaXJlY3Rpb25zLmxlbmd0aD50aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UubWF4RGVwdGgpdGhyb3cgbmV3IFp3KGBNYXhpbXVtIGRlcmVmZXJlbmNlIGRlcHRoIG9mICIke3RoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5tYXhEZXB0aH0iIGhhcyBiZWVuIGV4Y2VlZGVkIGluIGZpbGUgIiR7dGhpcy5yZWZlcmVuY2UudXJpfSJgKTtpZihvLmluY2x1ZGVzKFkpKXtpZihqLnJlZlNldC5jaXJjdWxhcj0hMCwiZXJyb3IiPT09dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmNpcmN1bGFyKXRocm93IG5ldyBLbygiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIik7aWYoInJlcGxhY2UiPT09dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmNpcmN1bGFyKXt2YXIgdyx4O2NvbnN0IG89bmV3IHZ1LnNJKFkuaWQse3R5cGU6Impzb24tc2NoZW1hIix1cmk6ai51cmksJHJlZjpzZXJpYWxpemVyc192YWx1ZShzLiRyZWYpLGJhc2VVUkk6cmVzb2x2ZShMLEIpLHJlZmVyZW5jaW5nRWxlbWVudDpzfSksYT0obnVsbCE9PSh3PW51bGw9PT0oeD10aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2Uuc3RyYXRlZ3lPcHRzWyJvcGVuYXBpLTMtMSJdKXx8dm9pZCAwPT09eD92b2lkIDA6eC5jaXJjdWxhclJlcGxhY2VyKSYmdm9pZCAwIT09dz93OnRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5jaXJjdWxhclJlcGxhY2VyKShvKTtyZXR1cm4gXy5yZXBsYWNlV2l0aChhLGRlcmVmZXJlbmNlX211dGF0aW9uUmVwbGFjZXIpLCFpJiZhfX1jb25zdCBpZT1zdHJpcEhhc2goai5yZWZTZXQucm9vdFJlZi51cmkpIT09ai51cmksYWU9WyJlcnJvciIsInJlcGxhY2UiXS5pbmNsdWRlcyh0aGlzLm9wdGlvbnMuZGVyZWZlcmVuY2UuY2lyY3VsYXIpO2lmKChlZXx8aWV8fGFFKFkpJiZPdShZLiRyZWYpfHxhZSkmJiFvLmluY2x1ZGVzQ3ljbGUoWSkpe3ZhciBDO2EuYWRkKHMpO2NvbnN0IF89bmV3IE9wZW5BUEkzXzFTd2FnZ2VyQ2xpZW50RGVyZWZlcmVuY2VWaXNpdG9yKHtyZWZlcmVuY2U6aixuYW1lc3BhY2U6dGhpcy5uYW1lc3BhY2UsaW5kaXJlY3Rpb25zOlsuLi50aGlzLmluZGlyZWN0aW9uc10sb3B0aW9uczp0aGlzLm9wdGlvbnMsdXNlQ2lyY3VsYXJTdHJ1Y3R1cmVzOnRoaXMudXNlQ2lyY3VsYXJTdHJ1Y3R1cmVzLGFsbG93TWV0YVBhdGNoZXM6dGhpcy5hbGxvd01ldGFQYXRjaGVzLGFuY2VzdG9yczpvLGJhc2VQYXRoOm51bGwhPT0oQz10aGlzLmJhc2VQYXRoKSYmdm9pZCAwIT09Qz9DOlsuLi50b19wYXRoKFsuLi51LGksc10pLCIkcmVmIl19KTtZPWF3YWl0IGd4KFksXyx7a2V5TWFwOml3LG5vZGVUeXBlR2V0dGVyOmFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfdHJhdmVyc2FsX3Zpc2l0b3JfZ2V0Tm9kZVR5cGV9KSxhLmRlbGV0ZShzKX1pZih0aGlzLmluZGlyZWN0aW9ucy5wb3AoKSxwcmVkaWNhdGVzX2lzQm9vbGVhbkpzb25TY2hlbWFFbGVtZW50KFkpKXtjb25zdCBvPWNsb25lRGVlcChZKTtyZXR1cm4gby5zZXRNZXRhUHJvcGVydHkoInJlZi1maWVsZHMiLHskcmVmOnNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZil9KSxvLnNldE1ldGFQcm9wZXJ0eSgicmVmLW9yaWdpbiIsai51cmkpLG8uc2V0TWV0YVByb3BlcnR5KCJyZWYtcmVmZXJlbmNpbmctZWxlbWVudC1pZCIsY2xvbmVEZWVwKHl4LmlkZW50aWZ5KHMpKSksXy5yZXBsYWNlV2l0aChvLGRlcmVmZXJlbmNlX211dGF0aW9uUmVwbGFjZXIpLCFpJiZvfWlmKGFFKFkpKXtjb25zdCBvPW5ldyBvXyhbLi4uWS5jb250ZW50XSxjbG9uZURlZXAoWS5tZXRhKSxjbG9uZURlZXAoWS5hdHRyaWJ1dGVzKSk7aWYocy5mb3JFYWNoKCgocyxpLGEpPT57by5yZW1vdmUoc2VyaWFsaXplcnNfdmFsdWUoaSkpLG8uY29udGVudC5wdXNoKGEpfSkpLG8ucmVtb3ZlKCIkcmVmIiksby5zZXRNZXRhUHJvcGVydHkoInJlZi1maWVsZHMiLHskcmVmOnNlcmlhbGl6ZXJzX3ZhbHVlKHMuJHJlZil9KSxvLnNldE1ldGFQcm9wZXJ0eSgicmVmLW9yaWdpbiIsai51cmkpLG8uc2V0TWV0YVByb3BlcnR5KCJyZWYtcmVmZXJlbmNpbmctZWxlbWVudC1pZCIsY2xvbmVEZWVwKHl4LmlkZW50aWZ5KHMpKSksdGhpcy5hbGxvd01ldGFQYXRjaGVzJiZ2b2lkIDA9PT1vLmdldCgiJCRyZWYiKSl7Y29uc3Qgcz1yZXNvbHZlKEwsQik7by5zZXQoIiQkcmVmIixzKX1ZPW99cmV0dXJuIF8ucmVwbGFjZVdpdGgoWSxkZXJlZmVyZW5jZV9tdXRhdGlvblJlcGxhY2VyKSxpP3ZvaWQgMDpZfWNhdGNoKG8pe3ZhciBqLEwsQjtjb25zdCBhPWdldF9yb290X2NhdXNlKG8pLF89bmV3IGZ4KGBDb3VsZCBub3QgcmVzb2x2ZSByZWZlcmVuY2U6ICR7YS5tZXNzYWdlfWAse2Jhc2VEb2M6dGhpcy5yZWZlcmVuY2UudXJpLCRyZWY6c2VyaWFsaXplcnNfdmFsdWUocy4kcmVmKSxmdWxsUGF0aDpudWxsIT09KGo9dGhpcy5iYXNlUGF0aCkmJnZvaWQgMCE9PWo/ajpbLi4udG9fcGF0aChbLi4udSxpLHNdKSwiJHJlZiJdLGNhdXNlOmF9KTtyZXR1cm4gdm9pZChudWxsPT09KEw9dGhpcy5vcHRpb25zLmRlcmVmZXJlbmNlLmRlcmVmZXJlbmNlT3B0cyl8fHZvaWQgMD09PUx8fG51bGw9PT0oTD1MLmVycm9ycyl8fHZvaWQgMD09PUx8fG51bGw9PT0oQj1MLnB1c2gpfHx2b2lkIDA9PT1CfHxCLmNhbGwoTCxfKSl9fWFzeW5jIExpbmtFbGVtZW50KCl7fWFzeW5jIEV4YW1wbGVFbGVtZW50KHMsbyxpLGEsdSxfKXt0cnl7cmV0dXJuIGF3YWl0IHN1cGVyLkV4YW1wbGVFbGVtZW50KHMsbyxpLGEsdSxfKX1jYXRjaChvKXt2YXIgdyx4LEM7Y29uc3QgYT1nZXRfcm9vdF9jYXVzZShvKSxfPW14KGEse2Jhc2VEb2M6dGhpcy5yZWZlcmVuY2UudXJpLGV4dGVybmFsVmFsdWU6c2VyaWFsaXplcnNfdmFsdWUocy5leHRlcm5hbFZhbHVlKSxmdWxsUGF0aDpudWxsIT09KHc9dGhpcy5iYXNlUGF0aCkmJnZvaWQgMCE9PXc/dzpbLi4udG9fcGF0aChbLi4udSxpLHNdKSwiZXh0ZXJuYWxWYWx1ZSJdfSk7cmV0dXJuIHZvaWQobnVsbD09PSh4PXRoaXMub3B0aW9ucy5kZXJlZmVyZW5jZS5kZXJlZmVyZW5jZU9wdHMpfHx2b2lkIDA9PT14fHxudWxsPT09KHg9eC5lcnJvcnMpfHx2b2lkIDA9PT14fHxudWxsPT09KEM9eC5wdXNoKXx8dm9pZCAwPT09Q3x8Qy5jYWxsKHgsXykpfX19Y29uc3Qgdng9T3BlbkFQSTNfMVN3YWdnZXJDbGllbnREZXJlZmVyZW5jZVZpc2l0b3IsYng9bWVyZ2VBbGxbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbSIpXTtjb25zdCBTeD1jbGFzcyBSb290VmlzaXRvcntjb25zdHJ1Y3Rvcih7cGFyYW1ldGVyTWFjcm86cyxtb2RlbFByb3BlcnR5TWFjcm86byxtb2RlOmksb3B0aW9uczphLC4uLnV9KXtjb25zdCBfPVtdO18ucHVzaChuZXcgdngoey4uLnUsb3B0aW9uczphfSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZfLnB1c2gobmV3IGN4KHttb2RlbFByb3BlcnR5TWFjcm86byxvcHRpb25zOmF9KSksInN0cmljdCIhPT1pJiZfLnB1c2gobmV3IGh4KHtvcHRpb25zOmF9KSksImZ1bmN0aW9uIj09dHlwZW9mIHMmJl8ucHVzaChuZXcgZHgoe3BhcmFtZXRlck1hY3JvOnMsb3B0aW9uczphfSkpO2NvbnN0IHc9YngoXyx7bm9kZVR5cGVHZXR0ZXI6YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY190cmF2ZXJzYWxfdmlzaXRvcl9nZXROb2RlVHlwZX0pO09iamVjdC5hc3NpZ24odGhpcyx3KX19LF94PXZpc2l0b3JfdmlzaXRbU3ltYm9sLmZvcigibm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbSIpXTtjb25zdCBFeD1jbGFzcyBPcGVuQVBJM18xU3dhZ2dlckNsaWVudERlcmVmZXJlbmNlU3RyYXRlZ3kgZXh0ZW5kcyBheHthbGxvd01ldGFQYXRjaGVzO3BhcmFtZXRlck1hY3JvO21vZGVsUHJvcGVydHlNYWNybzttb2RlO2FuY2VzdG9ycztjb25zdHJ1Y3Rvcih7YWxsb3dNZXRhUGF0Y2hlczpzPSExLHBhcmFtZXRlck1hY3JvOm89bnVsbCxtb2RlbFByb3BlcnR5TWFjcm86aT1udWxsLG1vZGU6YT0ibm9uLXN0cmljdCIsYW5jZXN0b3JzOnU9W10sLi4uX309e30pe3N1cGVyKHsuLi5ffSksdGhpcy5uYW1lPSJvcGVuYXBpLTMtMS1zd2FnZ2VyLWNsaWVudCIsdGhpcy5hbGxvd01ldGFQYXRjaGVzPXMsdGhpcy5wYXJhbWV0ZXJNYWNybz1vLHRoaXMubW9kZWxQcm9wZXJ0eU1hY3JvPWksdGhpcy5tb2RlPWEsdGhpcy5hbmNlc3RvcnM9Wy4uLnVdfWFzeW5jIGRlcmVmZXJlbmNlKHMsbyl7dmFyIGk7Y29uc3QgYT1jcmVhdGVOYW1lc3BhY2UoY3cpLHU9bnVsbCE9PShpPW8uZGVyZWZlcmVuY2UucmVmU2V0KSYmdm9pZCAwIT09aT9pOm5ldyBkdyxfPW5ldyBkdztsZXQgdyx4PXU7dS5oYXMocy51cmkpP3c9dS5maW5kKChvPT5vLnVyaT09PXMudXJpKSk6KHc9bmV3IGh3KHt1cmk6cy51cmksdmFsdWU6cy5wYXJzZVJlc3VsdH0pLHUuYWRkKHcpKSxvLmRlcmVmZXJlbmNlLmltbXV0YWJsZSYmKHUucmVmcy5tYXAoKHM9Pm5ldyBodyh7Li4ucyx2YWx1ZTpjbG9uZURlZXAocy52YWx1ZSl9KSkpLmZvckVhY2goKHM9Pl8uYWRkKHMpKSksdz1fLmZpbmQoKG89Pm8udXJpPT09cy51cmkpKSx4PV8pO2NvbnN0IEM9bmV3IFN4KHtyZWZlcmVuY2U6dyxuYW1lc3BhY2U6YSxvcHRpb25zOm8sYWxsb3dNZXRhUGF0Y2hlczp0aGlzLmFsbG93TWV0YVBhdGNoZXMsYW5jZXN0b3JzOnRoaXMuYW5jZXN0b3JzLG1vZGVsUHJvcGVydHlNYWNybzp0aGlzLm1vZGVsUHJvcGVydHlNYWNybyxtb2RlOnRoaXMubW9kZSxwYXJhbWV0ZXJNYWNybzp0aGlzLnBhcmFtZXRlck1hY3JvfSksaj1hd2FpdCBfeCh4LnJvb3RSZWYudmFsdWUsQyx7a2V5TWFwOml3LG5vZGVUeXBlR2V0dGVyOmFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfdHJhdmVyc2FsX3Zpc2l0b3JfZ2V0Tm9kZVR5cGV9KTtyZXR1cm4gby5kZXJlZmVyZW5jZS5pbW11dGFibGUmJl8ucmVmcy5maWx0ZXIoKHM9PnMudXJpLnN0YXJ0c1dpdGgoImltbXV0YWJsZTovLyIpKSkubWFwKChzPT5uZXcgaHcoey4uLnMsdXJpOnMudXJpLnJlcGxhY2UoL15pbW11dGFibGU6XC9cLy8sIiIpfSkpKS5mb3JFYWNoKChzPT51LmFkZChzKSkpLG51bGw9PT1vLmRlcmVmZXJlbmNlLnJlZlNldCYmdS5jbGVhbigpLF8uY2xlYW4oKSxqfX0sY2lyY3VsYXJSZXBsYWNlcj1zPT57Y29uc3Qgbz1zZXJpYWxpemVyc192YWx1ZShzLm1ldGEuZ2V0KCJiYXNlVVJJIikpLGk9cy5tZXRhLmdldCgicmVmZXJlbmNpbmdFbGVtZW50Iik7cmV0dXJuIG5ldyB2dS5TaCh7JHJlZjpvfSxjbG9uZURlZXAoaS5tZXRhKSxjbG9uZURlZXAoaS5hdHRyaWJ1dGVzKSl9LHJlc29sdmVPcGVuQVBJMzFTdHJhdGVneT1hc3luYyBzPT57Y29uc3R7c3BlYzpvLHRpbWVvdXQ6aSxyZWRpcmVjdHM6YSxyZXF1ZXN0SW50ZXJjZXB0b3I6dSxyZXNwb25zZUludGVyY2VwdG9yOl8scGF0aERpc2NyaW1pbmF0b3I6dz1bXSxhbGxvd01ldGFQYXRjaGVzOng9ITEsdXNlQ2lyY3VsYXJTdHJ1Y3R1cmVzOkM9ITEsc2tpcE5vcm1hbGl6YXRpb246aj0hMSxwYXJhbWV0ZXJNYWNybzpMPW51bGwsbW9kZWxQcm9wZXJ0eU1hY3JvOkI9bnVsbCxtb2RlOiQ9Im5vbi1zdHJpY3QiLHN0cmF0ZWdpZXM6VX09czt0cnl7Y29uc3R7Y2FjaGU6Vn09cmVzb2x2ZU9wZW5BUEkzMVN0cmF0ZWd5LHo9VS5maW5kKChzPT5zLm1hdGNoKG8pKSksWT1pc0h0dHBVcmwodXJsX2N3ZCgpKT91cmxfY3dkKCk6TmwsWj1vcHRpb25zX3JldHJpZXZhbFVSSShzKSxlZT1yZXNvbHZlKFksWik7bGV0IGllO1YuaGFzKG8pP2llPVYuZ2V0KG8pOihpZT1fYi5yZWZyYWN0KG8pLGllLmNsYXNzZXMucHVzaCgicmVzdWx0IiksVi5zZXQobyxpZSkpO2NvbnN0IGFlPW5ldyB4dShbaWVdKSxjZT1lc19jb21waWxlKHcpLGxlPSIiPT09Y2U/IiI6YCMke2NlfWAscGU9YXBpZG9tX2V2YWx1YXRlKGllLGNlKSxkZT1uZXcgaHcoe3VyaTplZSx2YWx1ZTphZX0pLGZlPW5ldyBkdyh7cmVmczpbZGVdfSk7IiIhPT1jZSYmKGZlLnJvb3RSZWY9dm9pZCAwKTtjb25zdCB5ZT1bbmV3IFNldChbcGVdKV0sYmU9W10sU2U9YXdhaXQoYXN5bmMocyxvPXt9KT0+e2NvbnN0IGk9dXRpbF9tZXJnZShtdyxvKTtyZXR1cm4gZGVyZWZlcmVuY2VBcGlET00ocyxpKX0pKHBlLHtyZXNvbHZlOntiYXNlVVJJOmAke2VlfSR7bGV9YCxyZXNvbHZlcnM6W25ldyBMdyh7dGltZW91dDppfHwxZTQscmVkaXJlY3RzOmF8fDEwfSldLHJlc29sdmVyT3B0czp7c3dhZ2dlckhUVFBDbGllbnRDb25maWc6e3JlcXVlc3RJbnRlcmNlcHRvcjp1LHJlc3BvbnNlSW50ZXJjZXB0b3I6X319LHN0cmF0ZWdpZXM6W25ldyBQd119LHBhcnNlOnttZWRpYVR5cGU6cHcubGF0ZXN0KCkscGFyc2VyczpbbmV3ICR3KHthbGxvd0VtcHR5OiExLHNvdXJjZU1hcDohMX0pLG5ldyBxdyh7YWxsb3dFbXB0eTohMSxzb3VyY2VNYXA6ITF9KSxuZXcgRncoe2FsbG93RW1wdHk6ITEsc291cmNlTWFwOiExfSksbmV3IEJ3KHthbGxvd0VtcHR5OiExLHNvdXJjZU1hcDohMX0pLG5ldyBDdyh7YWxsb3dFbXB0eTohMSxzb3VyY2VNYXA6ITF9KV19LGRlcmVmZXJlbmNlOnttYXhEZXB0aDoxMDAsc3RyYXRlZ2llczpbbmV3IEV4KHthbGxvd01ldGFQYXRjaGVzOngsdXNlQ2lyY3VsYXJTdHJ1Y3R1cmVzOkMscGFyYW1ldGVyTWFjcm86TCxtb2RlbFByb3BlcnR5TWFjcm86Qixtb2RlOiQsYW5jZXN0b3JzOnllfSldLHJlZlNldDpmZSxkZXJlZmVyZW5jZU9wdHM6e2Vycm9yczpiZX0saW1tdXRhYmxlOiExLGNpcmN1bGFyOkM/Imlnbm9yZSI6InJlcGxhY2UiLGNpcmN1bGFyUmVwbGFjZXI6Qz9tdy5kZXJlZmVyZW5jZS5jaXJjdWxhclJlcGxhY2VyOmNpcmN1bGFyUmVwbGFjZXJ9fSksX2U9KChzLG8saSk9Pm5ldyBfcCh7ZWxlbWVudDppfSkudHJhbnNjbHVkZShzLG8pKShwZSxTZSxpZSksd2U9aj9fZTp6Lm5vcm1hbGl6ZShfZSk7cmV0dXJue3NwZWM6c2VyaWFsaXplcnNfdmFsdWUod2UpLGVycm9yczpiZX19Y2F0Y2gocyl7aWYocyBpbnN0YW5jZW9mIFVwKXJldHVybntzcGVjOm8sZXJyb3JzOltdfTt0aHJvdyBzfX07cmVzb2x2ZU9wZW5BUEkzMVN0cmF0ZWd5LmNhY2hlPW5ldyBXZWFrTWFwO2NvbnN0IHd4PXJlc29sdmVPcGVuQVBJMzFTdHJhdGVneTtmdW5jdGlvbiBfY2xvbmUocyxvLGkpe2lmKGl8fChpPW5ldyB4eCksZnVuY3Rpb24gX2lzUHJpbWl0aXZlKHMpe3ZhciBvPXR5cGVvZiBzO3JldHVybiBudWxsPT1zfHwib2JqZWN0IiE9byYmImZ1bmN0aW9uIiE9b30ocykpcmV0dXJuIHM7dmFyIGE9ZnVuY3Rpb24gY29weShhKXt2YXIgdT1pLmdldChzKTtpZih1KXJldHVybiB1O2Zvcih2YXIgXyBpbiBpLnNldChzLGEpLHMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsXykmJihhW19dPW8/X2Nsb25lKHNbX10sITAsaSk6c1tfXSk7cmV0dXJuIGF9O3N3aXRjaCh4YShzKSl7Y2FzZSJPYmplY3QiOnJldHVybiBhKE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHMpKSk7Y2FzZSJBcnJheSI6cmV0dXJuIGEoQXJyYXkocy5sZW5ndGgpKTtjYXNlIkRhdGUiOnJldHVybiBuZXcgRGF0ZShzLnZhbHVlT2YoKSk7Y2FzZSJSZWdFeHAiOnJldHVybiBmdW5jdGlvbiBfY2xvbmVSZWdFeHAocyl7cmV0dXJuIG5ldyBSZWdFeHAocy5zb3VyY2Uscy5mbGFncz9zLmZsYWdzOihzLmdsb2JhbD8iZyI6IiIpKyhzLmlnbm9yZUNhc2U/ImkiOiIiKSsocy5tdWx0aWxpbmU/Im0iOiIiKSsocy5zdGlja3k/InkiOiIiKSsocy51bmljb2RlPyJ1IjoiIikrKHMuZG90QWxsPyJzIjoiIikpfShzKTtjYXNlIkludDhBcnJheSI6Y2FzZSJVaW50OEFycmF5IjpjYXNlIlVpbnQ4Q2xhbXBlZEFycmF5IjpjYXNlIkludDE2QXJyYXkiOmNhc2UiVWludDE2QXJyYXkiOmNhc2UiSW50MzJBcnJheSI6Y2FzZSJVaW50MzJBcnJheSI6Y2FzZSJGbG9hdDMyQXJyYXkiOmNhc2UiRmxvYXQ2NEFycmF5IjpjYXNlIkJpZ0ludDY0QXJyYXkiOmNhc2UiQmlnVWludDY0QXJyYXkiOnJldHVybiBzLnNsaWNlKCk7ZGVmYXVsdDpyZXR1cm4gc319dmFyIHh4PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gX09iamVjdE1hcCgpe3RoaXMubWFwPXt9LHRoaXMubGVuZ3RoPTB9cmV0dXJuIF9PYmplY3RNYXAucHJvdG90eXBlLnNldD1mdW5jdGlvbihzLG8pe3ZhciBpPXRoaXMuaGFzaChzKSxhPXRoaXMubWFwW2ldO2F8fCh0aGlzLm1hcFtpXT1hPVtdKSxhLnB1c2goW3Msb10pLHRoaXMubGVuZ3RoKz0xfSxfT2JqZWN0TWFwLnByb3RvdHlwZS5oYXNoPWZ1bmN0aW9uKHMpe3ZhciBvPVtdO2Zvcih2YXIgaSBpbiBzKW8ucHVzaChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc1tpXSkpO3JldHVybiBvLmpvaW4oKX0sX09iamVjdE1hcC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHMpe2lmKHRoaXMubGVuZ3RoPD0xODApZm9yKHZhciBvIGluIHRoaXMubWFwKWZvcih2YXIgaT10aGlzLm1hcFtvXSxhPTA7YTxpLmxlbmd0aDthKz0xKXtpZigoXz1pW2FdKVswXT09PXMpcmV0dXJuIF9bMV19ZWxzZXt2YXIgdT10aGlzLmhhc2gocyk7aWYoaT10aGlzLm1hcFt1XSlmb3IoYT0wO2E8aS5sZW5ndGg7YSs9MSl7dmFyIF87aWYoKF89aVthXSlbMF09PT1zKXJldHVybiBfWzFdfX19LF9PYmplY3RNYXB9KCksa3g9ZnVuY3Rpb24oKXtmdW5jdGlvbiBYUmVkdWNlQnkocyxvLGksYSl7dGhpcy52YWx1ZUZuPXMsdGhpcy52YWx1ZUFjYz1vLHRoaXMua2V5Rm49aSx0aGlzLnhmPWEsdGhpcy5pbnB1dHM9e319cmV0dXJuIFhSZWR1Y2VCeS5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9pbml0Il09X3hmQmFzZV9pbml0LFhSZWR1Y2VCeS5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9yZXN1bHQiXT1mdW5jdGlvbihzKXt2YXIgbztmb3IobyBpbiB0aGlzLmlucHV0cylpZihfaGFzKG8sdGhpcy5pbnB1dHMpJiYocz10aGlzLnhmWyJAQHRyYW5zZHVjZXIvc3RlcCJdKHMsdGhpcy5pbnB1dHNbb10pKVsiQEB0cmFuc2R1Y2VyL3JlZHVjZWQiXSl7cz1zWyJAQHRyYW5zZHVjZXIvdmFsdWUiXTticmVha31yZXR1cm4gdGhpcy5pbnB1dHM9bnVsbCx0aGlzLnhmWyJAQHRyYW5zZHVjZXIvcmVzdWx0Il0ocyl9LFhSZWR1Y2VCeS5wcm90b3R5cGVbIkBAdHJhbnNkdWNlci9zdGVwIl09ZnVuY3Rpb24ocyxvKXt2YXIgaT10aGlzLmtleUZuKG8pO3JldHVybiB0aGlzLmlucHV0c1tpXT10aGlzLmlucHV0c1tpXXx8W2ksX2Nsb25lKHRoaXMudmFsdWVBY2MsITEpXSx0aGlzLmlucHV0c1tpXVsxXT10aGlzLnZhbHVlRm4odGhpcy5pbnB1dHNbaV1bMV0sbyksc30sWFJlZHVjZUJ5fSgpO2Z1bmN0aW9uIF94cmVkdWNlQnkocyxvLGkpe3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gbmV3IGt4KHMsbyxpLGEpfX12YXIgT3g9X2N1cnJ5Tig0LFtdLF9kaXNwYXRjaGFibGUoW10sX3hyZWR1Y2VCeSwoZnVuY3Rpb24gcmVkdWNlQnkocyxvLGksYSl7dmFyIHU9X3h3cmFwKChmdW5jdGlvbihhLHUpe3ZhciBfPWkodSksdz1zKF9oYXMoXyxhKT9hW19dOl9jbG9uZShvLCExKSx1KTtyZXR1cm4gdyYmd1siQEB0cmFuc2R1Y2VyL3JlZHVjZWQiXT9fcmVkdWNlZChhKTooYVtfXT13LGEpfSkpO3JldHVybiBfaSh1LHt9LGEpfSkpKTtjb25zdCBBeD1fY3VycnkyKF9jaGVja0Zvck1ldGhvZCgiZ3JvdXBCeSIsT3goKGZ1bmN0aW9uKHMsbyl7cmV0dXJuIHMucHVzaChvKSxzfSksW10pKSk7Y29uc3QgQ3g9Y2xhc3MgTm9ybWFsaXplU3RvcmFnZXtpbnRlcm5hbFN0b3JlO2NvbnN0cnVjdG9yKHMsbyxpKXt0aGlzLnN0b3JhZ2VFbGVtZW50PXMsdGhpcy5zdG9yYWdlRmllbGQ9byx0aGlzLnN0b3JhZ2VTdWJGaWVsZD1pfWdldCBzdG9yZSgpe2lmKCF0aGlzLmludGVybmFsU3RvcmUpe2xldCBzPXRoaXMuc3RvcmFnZUVsZW1lbnQuZ2V0KHRoaXMuc3RvcmFnZUZpZWxkKTtQdShzKXx8KHM9bmV3IHZ1LlNoLHRoaXMuc3RvcmFnZUVsZW1lbnQuc2V0KHRoaXMuc3RvcmFnZUZpZWxkLHMpKTtsZXQgbz1zLmdldCh0aGlzLnN0b3JhZ2VTdWJGaWVsZCk7SXUobyl8fChvPW5ldyB2dS53RSxzLnNldCh0aGlzLnN0b3JhZ2VTdWJGaWVsZCxvKSksdGhpcy5pbnRlcm5hbFN0b3JlPW99cmV0dXJuIHRoaXMuaW50ZXJuYWxTdG9yZX1hcHBlbmQocyl7dGhpcy5pbmNsdWRlcyhzKXx8dGhpcy5zdG9yZS5wdXNoKHMpfWluY2x1ZGVzKHMpe3JldHVybiB0aGlzLnN0b3JlLmluY2x1ZGVzKHMpfX0scmVtb3ZlU3BhY2VzPXM9PnMucmVwbGFjZSgvXHMvZywiIiksbm9ybWFsaXplX29wZXJhdGlvbl9pZHNfcmVwbGFjZVNwZWNpYWxDaGFyc1dpdGhVbmRlcnNjb3JlPXM9PnMucmVwbGFjZSgvXFcvZ2ksIl8iKSxub3JtYWxpemVPcGVyYXRpb25JZD0ocyxvLGkpPT57Y29uc3QgYT1yZW1vdmVTcGFjZXMocyk7cmV0dXJuIGEubGVuZ3RoPjA/bm9ybWFsaXplX29wZXJhdGlvbl9pZHNfcmVwbGFjZVNwZWNpYWxDaGFyc1dpdGhVbmRlcnNjb3JlKGEpOigocyxvKT0+YCR7bm9ybWFsaXplX29wZXJhdGlvbl9pZHNfcmVwbGFjZVNwZWNpYWxDaGFyc1dpdGhVbmRlcnNjb3JlKHJlbW92ZVNwYWNlcyhvLnRvTG93ZXJDYXNlKCkpKX0ke25vcm1hbGl6ZV9vcGVyYXRpb25faWRzX3JlcGxhY2VTcGVjaWFsQ2hhcnNXaXRoVW5kZXJzY29yZShyZW1vdmVTcGFjZXMocykpfWApKG8saSl9LG5vcm1hbGl6ZV9vcGVyYXRpb25faWRzPSh7c3RvcmFnZUZpZWxkOnM9Ingtbm9ybWFsaXplZCIsb3BlcmF0aW9uSWROb3JtYWxpemVyOm89bm9ybWFsaXplT3BlcmF0aW9uSWR9PXt9KT0+aT0+e2NvbnN0e3ByZWRpY2F0ZXM6YSxhbmNlc3RvckxpbmVhZ2VUb0pTT05Qb2ludGVyOnUsbmFtZXNwYWNlOl99PWksdz1bXSx4PVtdLEM9W107bGV0IGo7cmV0dXJue3Zpc2l0b3I6e09wZW5BcGkzXzFFbGVtZW50OntlbnRlcihvKXtqPW5ldyBDeChvLHMsIm9wZXJhdGlvbi1pZHMiKX0sbGVhdmUoKXtjb25zdCBzPUF4KChzPT5zZXJpYWxpemVyc192YWx1ZShzLm9wZXJhdGlvbklkKSkseCk7T2JqZWN0LmVudHJpZXMocykuZm9yRWFjaCgoKFtzLG9dKT0+e0FycmF5LmlzQXJyYXkobykmJihvLmxlbmd0aDw9MXx8by5mb3JFYWNoKCgobyxpKT0+e2NvbnN0IGE9YCR7c30ke2krMX1gO28ub3BlcmF0aW9uSWQ9bmV3IF8uZWxlbWVudHMuU3RyaW5nKGEpfSkpKX0pKSxDLmZvckVhY2goKHM9PntpZih2b2lkIDA9PT1zLm9wZXJhdGlvbklkKXJldHVybjtjb25zdCBvPVN0cmluZyhzZXJpYWxpemVyc192YWx1ZShzLm9wZXJhdGlvbklkKSksaT14LmZpbmQoKHM9PnNlcmlhbGl6ZXJzX3ZhbHVlKHMubWV0YS5nZXQoIm9yaWdpbmFsT3BlcmF0aW9uSWQiKSk9PT1vKSk7dm9pZCAwIT09aSYmKHMub3BlcmF0aW9uSWQ9Y2xvbmVEZWVwLnNhZmUoaS5vcGVyYXRpb25JZCkscy5tZXRhLnNldCgib3JpZ2luYWxPcGVyYXRpb25JZCIsbykscy5zZXQoIl9fb3JpZ2luYWxPcGVyYXRpb25JZCIsbykpfSkpLHgubGVuZ3RoPTAsQy5sZW5ndGg9MCxqPXZvaWQgMH19LFBhdGhJdGVtRWxlbWVudDp7ZW50ZXIocyl7Y29uc3Qgbz1lYSgicGF0aCIsc2VyaWFsaXplcnNfdmFsdWUocy5tZXRhLmdldCgicGF0aCIpKSk7dy5wdXNoKG8pfSxsZWF2ZSgpe3cucG9wKCl9fSxPcGVyYXRpb25FbGVtZW50OntlbnRlcihzLGksYSxDLEwpe2lmKHZvaWQgMD09PXMub3BlcmF0aW9uSWQpcmV0dXJuO2NvbnN0IEI9dShbLi4uTCxhLHNdKTtpZihqLmluY2x1ZGVzKEIpKXJldHVybjtjb25zdCAkPVN0cmluZyhzZXJpYWxpemVyc192YWx1ZShzLm9wZXJhdGlvbklkKSksVT1jYSh3KSxWPWVhKCJtZXRob2QiLHNlcmlhbGl6ZXJzX3ZhbHVlKHMubWV0YS5nZXQoImh0dHAtbWV0aG9kIikpKSx6PW8oJCxVLFYpOyQhPT16JiYocy5vcGVyYXRpb25JZD1uZXcgXy5lbGVtZW50cy5TdHJpbmcoeikscy5zZXQoIl9fb3JpZ2luYWxPcGVyYXRpb25JZCIsJCkscy5tZXRhLnNldCgib3JpZ2luYWxPcGVyYXRpb25JZCIsJCkseC5wdXNoKHMpLGouYXBwZW5kKEIpKX19LExpbmtFbGVtZW50OntsZWF2ZShzKXthLmlzTGlua0VsZW1lbnQocykmJnZvaWQgMCE9PXMub3BlcmF0aW9uSWQmJkMucHVzaChzKX19fX19LG5vcm1hbGl6ZV9wYXJhbWV0ZXJzPSh7c3RvcmFnZUZpZWxkOnM9Ingtbm9ybWFsaXplZCJ9PXt9KT0+bz0+e2NvbnN0e3ByZWRpY2F0ZXM6aSxhbmNlc3RvckxpbmVhZ2VUb0pTT05Qb2ludGVyOmF9PW8scGFyYW1ldGVyRXF1YWxzPShzLG8pPT4hIWkuaXNQYXJhbWV0ZXJFbGVtZW50KHMpJiYoISFpLmlzUGFyYW1ldGVyRWxlbWVudChvKSYmKCEhaS5pc1N0cmluZ0VsZW1lbnQocy5uYW1lKSYmKCEhaS5pc1N0cmluZ0VsZW1lbnQocy5pbikmJighIWkuaXNTdHJpbmdFbGVtZW50KG8ubmFtZSkmJighIWkuaXNTdHJpbmdFbGVtZW50KG8uaW4pJiYoc2VyaWFsaXplcnNfdmFsdWUocy5uYW1lKT09PXNlcmlhbGl6ZXJzX3ZhbHVlKG8ubmFtZSkmJnNlcmlhbGl6ZXJzX3ZhbHVlKHMuaW4pPT09c2VyaWFsaXplcnNfdmFsdWUoby5pbikpKSkpKSksdT1bXTtsZXQgXztyZXR1cm57dmlzaXRvcjp7T3BlbkFwaTNfMUVsZW1lbnQ6e2VudGVyKG8pe189bmV3IEN4KG8scywicGFyYW1ldGVycyIpfSxsZWF2ZSgpe189dm9pZCAwfX0sUGF0aEl0ZW1FbGVtZW50OntlbnRlcihzLG8sYSxfLHcpe2lmKHcuc29tZShpLmlzQ29tcG9uZW50c0VsZW1lbnQpKXJldHVybjtjb25zdHtwYXJhbWV0ZXJzOnh9PXM7aS5pc0FycmF5RWxlbWVudCh4KT91LnB1c2goWy4uLnguY29udGVudF0pOnUucHVzaChbXSl9LGxlYXZlKCl7dS5wb3AoKX19LE9wZXJhdGlvbkVsZW1lbnQ6e2xlYXZlKHMsbyxpLHcseCl7Y29uc3QgQz1jYSh1KTtpZighQXJyYXkuaXNBcnJheShDKXx8MD09PUMubGVuZ3RoKXJldHVybjtjb25zdCBqPWEoWy4uLngsaSxzXSk7aWYoXy5pbmNsdWRlcyhqKSlyZXR1cm47Y29uc3QgTD1IdyhbXSxbInBhcmFtZXRlcnMiLCJjb250ZW50Il0scyksQj1weChwYXJhbWV0ZXJFcXVhbHMsWy4uLkwsLi4uQ10pO3MucGFyYW1ldGVycz1uZXcgeXYoQiksXy5hcHBlbmQoail9fX19fSxub3JtYWxpemVfc2VjdXJpdHlfcmVxdWlyZW1lbnRzPSh7c3RvcmFnZUZpZWxkOnM9Ingtbm9ybWFsaXplZCJ9PXt9KT0+bz0+e2NvbnN0e3ByZWRpY2F0ZXM6aSxhbmNlc3RvckxpbmVhZ2VUb0pTT05Qb2ludGVyOmF9PW87bGV0IHUsXztyZXR1cm57dmlzaXRvcjp7T3BlbkFwaTNfMUVsZW1lbnQ6e2VudGVyKG8pe189bmV3IEN4KG8scywic2VjdXJpdHktcmVxdWlyZW1lbnRzIiksaS5pc0FycmF5RWxlbWVudChvLnNlY3VyaXR5KSYmKHU9by5zZWN1cml0eSl9LGxlYXZlKCl7Xz12b2lkIDAsdT12b2lkIDB9fSxPcGVyYXRpb25FbGVtZW50OntsZWF2ZShzLG8sdyx4LEMpe2lmKEMuc29tZShpLmlzQ29tcG9uZW50c0VsZW1lbnQpKXJldHVybjtjb25zdCBqPWEoWy4uLkMsdyxzXSk7aWYoXy5pbmNsdWRlcyhqKSlyZXR1cm47dmFyIEw7dm9pZCAwPT09cy5zZWN1cml0eSYmdm9pZCAwIT09dSYmKHMuc2VjdXJpdHk9bmV3IHd2KG51bGw9PT0oTD11KXx8dm9pZCAwPT09TD92b2lkIDA6TC5jb250ZW50KSxfLmFwcGVuZChqKSl9fX19fSxub3JtYWxpemVfcGFyYW1ldGVyX2V4YW1wbGVzPSh7c3RvcmFnZUZpZWxkOnM9Ingtbm9ybWFsaXplZCJ9PXt9KT0+bz0+e2NvbnN0e3ByZWRpY2F0ZXM6aSxhbmNlc3RvckxpbmVhZ2VUb0pTT05Qb2ludGVyOmF9PW87bGV0IHU7cmV0dXJue3Zpc2l0b3I6e09wZW5BcGkzXzFFbGVtZW50OntlbnRlcihvKXt1PW5ldyBDeChvLHMsInBhcmFtZXRlci1leGFtcGxlcyIpfSxsZWF2ZSgpe3U9dm9pZCAwfX0sUGFyYW1ldGVyRWxlbWVudDp7bGVhdmUocyxvLF8sdyx4KXt2YXIgQyxqO2lmKHguc29tZShpLmlzQ29tcG9uZW50c0VsZW1lbnQpKXJldHVybjtpZih2b2lkIDA9PT1zLnNjaGVtYXx8IWkuaXNTY2hlbWFFbGVtZW50KHMuc2NoZW1hKSlyZXR1cm47aWYodm9pZCAwPT09KG51bGw9PT0oQz1zLnNjaGVtYSl8fHZvaWQgMD09PUM/dm9pZCAwOkMuZXhhbXBsZSkmJnZvaWQgMD09PShudWxsPT09KGo9cy5zY2hlbWEpfHx2b2lkIDA9PT1qP3ZvaWQgMDpqLmV4YW1wbGVzKSlyZXR1cm47Y29uc3QgTD1hKFsuLi54LF8sc10pO2lmKCF1LmluY2x1ZGVzKEwpKXtpZih2b2lkIDAhPT1zLmV4YW1wbGVzJiZpLmlzT2JqZWN0RWxlbWVudChzLmV4YW1wbGVzKSl7Y29uc3Qgbz1zLmV4YW1wbGVzLm1hcCgocz0+Y2xvbmVEZWVwLnNhZmUocy52YWx1ZSkpKTtyZXR1cm4gdm9pZCAwIT09cy5zY2hlbWEuZXhhbXBsZXMmJihzLnNjaGVtYS5zZXQoImV4YW1wbGVzIixvKSx1LmFwcGVuZChMKSksdm9pZCh2b2lkIDAhPT1zLnNjaGVtYS5leGFtcGxlJiYocy5zY2hlbWEuc2V0KCJleGFtcGxlIixvWzBdKSx1LmFwcGVuZChMKSkpfXZvaWQgMCE9PXMuZXhhbXBsZSYmKHZvaWQgMCE9PXMuc2NoZW1hLmV4YW1wbGVzJiYocy5zY2hlbWEuc2V0KCJleGFtcGxlcyIsW2Nsb25lRGVlcChzLmV4YW1wbGUpXSksdS5hcHBlbmQoTCkpLHZvaWQgMCE9PXMuc2NoZW1hLmV4YW1wbGUmJihzLnNjaGVtYS5zZXQoImV4YW1wbGUiLGNsb25lRGVlcChzLmV4YW1wbGUpKSx1LmFwcGVuZChMKSkpfX19fX19LG5vcm1hbGl6ZV9oZWFkZXJfZXhhbXBsZXM9KHtzdG9yYWdlRmllbGQ6cz0ieC1ub3JtYWxpemVkIn09e30pPT5vPT57Y29uc3R7cHJlZGljYXRlczppLGFuY2VzdG9yTGluZWFnZVRvSlNPTlBvaW50ZXI6YX09bztsZXQgdTtyZXR1cm57dmlzaXRvcjp7T3BlbkFwaTNfMUVsZW1lbnQ6e2VudGVyKG8pe3U9bmV3IEN4KG8scywiaGVhZGVyLWV4YW1wbGVzIil9LGxlYXZlKCl7dT12b2lkIDB9fSxIZWFkZXJFbGVtZW50OntsZWF2ZShzLG8sXyx3LHgpe3ZhciBDLGo7aWYoeC5zb21lKGkuaXNDb21wb25lbnRzRWxlbWVudCkpcmV0dXJuO2lmKHZvaWQgMD09PXMuc2NoZW1hfHwhaS5pc1NjaGVtYUVsZW1lbnQocy5zY2hlbWEpKXJldHVybjtpZih2b2lkIDA9PT0obnVsbD09PShDPXMuc2NoZW1hKXx8dm9pZCAwPT09Qz92b2lkIDA6Qy5leGFtcGxlKSYmdm9pZCAwPT09KG51bGw9PT0oaj1zLnNjaGVtYSl8fHZvaWQgMD09PWo/dm9pZCAwOmouZXhhbXBsZXMpKXJldHVybjtjb25zdCBMPWEoWy4uLngsXyxzXSk7aWYoIXUuaW5jbHVkZXMoTCkpe2lmKHZvaWQgMCE9PXMuZXhhbXBsZXMmJmkuaXNPYmplY3RFbGVtZW50KHMuZXhhbXBsZXMpKXtjb25zdCBvPXMuZXhhbXBsZXMubWFwKChzPT5jbG9uZURlZXAuc2FmZShzLnZhbHVlKSkpO3JldHVybiB2b2lkIDAhPT1zLnNjaGVtYS5leGFtcGxlcyYmKHMuc2NoZW1hLnNldCgiZXhhbXBsZXMiLG8pLHUuYXBwZW5kKEwpKSx2b2lkKHZvaWQgMCE9PXMuc2NoZW1hLmV4YW1wbGUmJihzLnNjaGVtYS5zZXQoImV4YW1wbGUiLG9bMF0pLHUuYXBwZW5kKEwpKSl9dm9pZCAwIT09cy5leGFtcGxlJiYodm9pZCAwIT09cy5zY2hlbWEuZXhhbXBsZXMmJihzLnNjaGVtYS5zZXQoImV4YW1wbGVzIixbY2xvbmVEZWVwKHMuZXhhbXBsZSldKSx1LmFwcGVuZChMKSksdm9pZCAwIT09cy5zY2hlbWEuZXhhbXBsZSYmKHMuc2NoZW1hLnNldCgiZXhhbXBsZSIsY2xvbmVEZWVwKHMuZXhhbXBsZSkpLHUuYXBwZW5kKEwpKSl9fX19fX0sb3BlbmFwaV8zXzFfYXBpZG9tX25vcm1hbGl6ZT1zPT57aWYoIVB1KHMpKXJldHVybiBzO2NvbnN0IG89W25vcm1hbGl6ZV9vcGVyYXRpb25faWRzKHtvcGVyYXRpb25JZE5vcm1hbGl6ZXI6KHMsbyxpKT0+b3BJZCh7b3BlcmF0aW9uSWQ6c30sbyxpLHt2Mk9wZXJhdGlvbklkQ29tcGF0aWJpbGl0eU1vZGU6ITF9KX0pLG5vcm1hbGl6ZV9wYXJhbWV0ZXJzKCksbm9ybWFsaXplX3NlY3VyaXR5X3JlcXVpcmVtZW50cygpLG5vcm1hbGl6ZV9wYXJhbWV0ZXJfZXhhbXBsZXMoKSxub3JtYWxpemVfaGVhZGVyX2V4YW1wbGVzKCldO3JldHVybiBkaXNwYXRjaFBsdWdpbnNTeW5jKHMsbyx7dG9vbGJveENyZWF0b3I6YXBpZG9tX25zX29wZW5hcGlfM18xX3NyY19yZWZyYWN0b3JfdG9vbGJveCx2aXNpdG9yT3B0aW9uczp7a2V5TWFwOml3LG5vZGVUeXBlR2V0dGVyOmFwaWRvbV9uc19vcGVuYXBpXzNfMV9zcmNfdHJhdmVyc2FsX3Zpc2l0b3JfZ2V0Tm9kZVR5cGV9fSl9LGp4PXtuYW1lOiJvcGVuYXBpLTMtMS1hcGlkb20iLG1hdGNoOnM9PmlzT3BlbkFQSTMxKHMpLG5vcm1hbGl6ZShzKXtpZigha3UocykmJnB1KHMpJiYhcy4kJG5vcm1hbGl6ZWQpe2NvbnN0IGk9KG89b3BlbmFwaV8zXzFfYXBpZG9tX25vcm1hbGl6ZSxzPT57Y29uc3QgaT1fYi5yZWZyYWN0KHMpO2kuY2xhc3Nlcy5wdXNoKCJyZXN1bHQiKTtjb25zdCBhPW8oaSksdT1zZXJpYWxpemVyc192YWx1ZShhKTtyZXR1cm4gd3guY2FjaGUuc2V0KHUsYSksc2VyaWFsaXplcnNfdmFsdWUoYSl9KShzKTtyZXR1cm4gaS4kJG5vcm1hbGl6ZWQ9ITAsaX12YXIgbztyZXR1cm4ga3Uocyk/b3BlbmFwaV8zXzFfYXBpZG9tX25vcm1hbGl6ZShzKTpzfSxyZXNvbHZlOmFzeW5jIHM9Pnd4KHMpfSxQeD1qeCxtYWtlUmVzb2x2ZT1zPT5hc3luYyBvPT4oYXN5bmMgcz0+e2NvbnN0e3NwZWM6byxyZXF1ZXN0SW50ZXJjZXB0b3I6aSxyZXNwb25zZUludGVyY2VwdG9yOmF9PXMsdT1vcHRpb25zX3JldHJpZXZhbFVSSShzKSxfPW9wdGlvbnNfaHR0cENsaWVudChzKSx3PW98fGF3YWl0IG1ha2VGZXRjaEpTT04oXyx7cmVxdWVzdEludGVyY2VwdG9yOmkscmVzcG9uc2VJbnRlcmNlcHRvcjphfSkodSkseD17Li4ucyxzcGVjOnd9O3JldHVybiBzLnN0cmF0ZWdpZXMuZmluZCgocz0+cy5tYXRjaCh3KSkpLnJlc29sdmUoeCl9KSh7Li4ucywuLi5vfSksSXg9bWFrZVJlc29sdmUoe3N0cmF0ZWdpZXM6W3l1LG11LGR1XX0pO2NvbnN0IHNlcnZlcl91cmxfdGVtcGxhdGU9KHMsbyxpLGEsdSk9PntpZihzPT09QXAuU0VNX1BSRSl7aWYoITE9PT1BcnJheS5pc0FycmF5KHUpKXRocm93IG5ldyBFcnJvcigicGFyc2VyJ3MgdXNlciBkYXRhIG11c3QgYmUgYW4gYXJyYXkiKTt1LnB1c2goWyJzZXJ2ZXItdXJsLXRlbXBsYXRlIixPcC5jaGFyc1RvU3RyaW5nKG8saSxhKV0pfXJldHVybiBBcC5TRU1fT0t9LGNhbGxiYWNrc19zZXJ2ZXJfdmFyaWFibGU9KHMsbyxpLGEsdSk9PntpZihzPT09QXAuU0VNX1BSRSl7aWYoITE9PT1BcnJheS5pc0FycmF5KHUpKXRocm93IG5ldyBFcnJvcigicGFyc2VyJ3MgdXNlciBkYXRhIG11c3QgYmUgYW4gYXJyYXkiKTt1LnB1c2goWyJzZXJ2ZXItdmFyaWFibGUiLE9wLmNoYXJzVG9TdHJpbmcobyxpLGEpXSl9cmV0dXJuIEFwLlNFTV9PS30sc2VydmVyX3ZhcmlhYmxlX25hbWU9KHMsbyxpLGEsdSk9PntpZihzPT09QXAuU0VNX1BSRSl7aWYoITE9PT1BcnJheS5pc0FycmF5KHUpKXRocm93IG5ldyBFcnJvcigicGFyc2VyJ3MgdXNlciBkYXRhIG11c3QgYmUgYW4gYXJyYXkiKTt1LnB1c2goWyJzZXJ2ZXItdmFyaWFibGUtbmFtZSIsT3AuY2hhcnNUb1N0cmluZyhvLGksYSldKX1yZXR1cm4gQXAuU0VNX09LfSxjYWxsYmFja3NfbGl0ZXJhbHM9KHMsbyxpLGEsdSk9PntpZihzPT09QXAuU0VNX1BSRSl7aWYoITE9PT1BcnJheS5pc0FycmF5KHUpKXRocm93IG5ldyBFcnJvcigicGFyc2VyJ3MgdXNlciBkYXRhIG11c3QgYmUgYW4gYXJyYXkiKTt1LnB1c2goWyJsaXRlcmFscyIsT3AuY2hhcnNUb1N0cmluZyhvLGksYSldKX1yZXR1cm4gQXAuU0VNX09LfSxUeD1uZXcgZnVuY3Rpb24gc2VydmVyX3VybF90ZW1wbGF0aW5nX2dyYW1tYXIoKXt0aGlzLmdyYW1tYXJPYmplY3Q9ImdyYW1tYXJPYmplY3QiLHRoaXMucnVsZXM9W10sdGhpcy5ydWxlc1swXT17bmFtZToic2VydmVyLXVybC10ZW1wbGF0ZSIsbG93ZXI6InNlcnZlci11cmwtdGVtcGxhdGUiLGluZGV4OjAsaXNCa3I6ITF9LHRoaXMucnVsZXNbMV09e25hbWU6InNlcnZlci12YXJpYWJsZSIsbG93ZXI6InNlcnZlci12YXJpYWJsZSIsaW5kZXg6MSxpc0JrcjohMX0sdGhpcy5ydWxlc1syXT17bmFtZToic2VydmVyLXZhcmlhYmxlLW5hbWUiLGxvd2VyOiJzZXJ2ZXItdmFyaWFibGUtbmFtZSIsaW5kZXg6Mixpc0JrcjohMX0sdGhpcy5ydWxlc1szXT17bmFtZToibGl0ZXJhbHMiLGxvd2VyOiJsaXRlcmFscyIsaW5kZXg6Myxpc0JrcjohMX0sdGhpcy5ydWxlc1s0XT17bmFtZToiRElHSVQiLGxvd2VyOiJkaWdpdCIsaW5kZXg6NCxpc0JrcjohMX0sdGhpcy5ydWxlc1s1XT17bmFtZToiSEVYRElHIixsb3dlcjoiaGV4ZGlnIixpbmRleDo1LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzZdPXtuYW1lOiJwY3QtZW5jb2RlZCIsbG93ZXI6InBjdC1lbmNvZGVkIixpbmRleDo2LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzddPXtuYW1lOiJ1Y3NjaGFyIixsb3dlcjoidWNzY2hhciIsaW5kZXg6Nyxpc0JrcjohMX0sdGhpcy5ydWxlc1s4XT17bmFtZToiaXByaXZhdGUiLGxvd2VyOiJpcHJpdmF0ZSIsaW5kZXg6OCxpc0JrcjohMX0sdGhpcy51ZHRzPVtdLHRoaXMucnVsZXNbMF0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzBdLm9wY29kZXNbMF09e3R5cGU6MyxtaW46MSxtYXg6MS8wfSx0aGlzLnJ1bGVzWzBdLm9wY29kZXNbMV09e3R5cGU6MSxjaGlsZHJlbjpbMiwzXX0sdGhpcy5ydWxlc1swXS5vcGNvZGVzWzJdPXt0eXBlOjQsaW5kZXg6M30sdGhpcy5ydWxlc1swXS5vcGNvZGVzWzNdPXt0eXBlOjQsaW5kZXg6MX0sdGhpcy5ydWxlc1sxXS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbMV0ub3Bjb2Rlc1swXT17dHlwZToyLGNoaWxkcmVuOlsxLDIsM119LHRoaXMucnVsZXNbMV0ub3Bjb2Rlc1sxXT17dHlwZTo3LHN0cmluZzpbMTIzXX0sdGhpcy5ydWxlc1sxXS5vcGNvZGVzWzJdPXt0eXBlOjQsaW5kZXg6Mn0sdGhpcy5ydWxlc1sxXS5vcGNvZGVzWzNdPXt0eXBlOjcsc3RyaW5nOlsxMjVdfSx0aGlzLnJ1bGVzWzJdLm9wY29kZXM9W10sdGhpcy5ydWxlc1syXS5vcGNvZGVzWzBdPXt0eXBlOjMsbWluOjEsbWF4OjEvMH0sdGhpcy5ydWxlc1syXS5vcGNvZGVzWzFdPXt0eXBlOjEsY2hpbGRyZW46WzIsMyw0XX0sdGhpcy5ydWxlc1syXS5vcGNvZGVzWzJdPXt0eXBlOjUsbWluOjAsbWF4OjEyMn0sdGhpcy5ydWxlc1syXS5vcGNvZGVzWzNdPXt0eXBlOjYsc3RyaW5nOlsxMjRdfSx0aGlzLnJ1bGVzWzJdLm9wY29kZXNbNF09e3R5cGU6NSxtaW46MTI2LG1heDoxMTE0MTExfSx0aGlzLnJ1bGVzWzNdLm9wY29kZXM9W10sdGhpcy5ydWxlc1szXS5vcGNvZGVzWzBdPXt0eXBlOjMsbWluOjEsbWF4OjEvMH0sdGhpcy5ydWxlc1szXS5vcGNvZGVzWzFdPXt0eXBlOjEsY2hpbGRyZW46WzIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxM119LHRoaXMucnVsZXNbM10ub3Bjb2Rlc1syXT17dHlwZTo2LHN0cmluZzpbMzNdfSx0aGlzLnJ1bGVzWzNdLm9wY29kZXNbM109e3R5cGU6NSxtaW46MzUsbWF4OjM2fSx0aGlzLnJ1bGVzWzNdLm9wY29kZXNbNF09e3R5cGU6NSxtaW46MzgsbWF4OjU5fSx0aGlzLnJ1bGVzWzNdLm9wY29kZXNbNV09e3R5cGU6NixzdHJpbmc6WzYxXX0sdGhpcy5ydWxlc1szXS5vcGNvZGVzWzZdPXt0eXBlOjUsbWluOjYzLG1heDo5MX0sdGhpcy5ydWxlc1szXS5vcGNvZGVzWzddPXt0eXBlOjYsc3RyaW5nOls5M119LHRoaXMucnVsZXNbM10ub3Bjb2Rlc1s4XT17dHlwZTo2LHN0cmluZzpbOTVdfSx0aGlzLnJ1bGVzWzNdLm9wY29kZXNbOV09e3R5cGU6NSxtaW46OTcsbWF4OjEyMn0sdGhpcy5ydWxlc1szXS5vcGNvZGVzWzEwXT17dHlwZTo2LHN0cmluZzpbMTI2XX0sdGhpcy5ydWxlc1szXS5vcGNvZGVzWzExXT17dHlwZTo0LGluZGV4Ojd9LHRoaXMucnVsZXNbM10ub3Bjb2Rlc1sxMl09e3R5cGU6NCxpbmRleDo4fSx0aGlzLnJ1bGVzWzNdLm9wY29kZXNbMTNdPXt0eXBlOjQsaW5kZXg6Nn0sdGhpcy5ydWxlc1s0XS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbNF0ub3Bjb2Rlc1swXT17dHlwZTo1LG1pbjo0OCxtYXg6NTd9LHRoaXMucnVsZXNbNV0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzVdLm9wY29kZXNbMF09e3R5cGU6MSxjaGlsZHJlbjpbMSwyLDMsNCw1LDYsN119LHRoaXMucnVsZXNbNV0ub3Bjb2Rlc1sxXT17dHlwZTo0LGluZGV4OjR9LHRoaXMucnVsZXNbNV0ub3Bjb2Rlc1syXT17dHlwZTo3LHN0cmluZzpbOTddfSx0aGlzLnJ1bGVzWzVdLm9wY29kZXNbM109e3R5cGU6NyxzdHJpbmc6Wzk4XX0sdGhpcy5ydWxlc1s1XS5vcGNvZGVzWzRdPXt0eXBlOjcsc3RyaW5nOls5OV19LHRoaXMucnVsZXNbNV0ub3Bjb2Rlc1s1XT17dHlwZTo3LHN0cmluZzpbMTAwXX0sdGhpcy5ydWxlc1s1XS5vcGNvZGVzWzZdPXt0eXBlOjcsc3RyaW5nOlsxMDFdfSx0aGlzLnJ1bGVzWzVdLm9wY29kZXNbN109e3R5cGU6NyxzdHJpbmc6WzEwMl19LHRoaXMucnVsZXNbNl0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzZdLm9wY29kZXNbMF09e3R5cGU6MixjaGlsZHJlbjpbMSwyLDNdfSx0aGlzLnJ1bGVzWzZdLm9wY29kZXNbMV09e3R5cGU6NyxzdHJpbmc6WzM3XX0sdGhpcy5ydWxlc1s2XS5vcGNvZGVzWzJdPXt0eXBlOjQsaW5kZXg6NX0sdGhpcy5ydWxlc1s2XS5vcGNvZGVzWzNdPXt0eXBlOjQsaW5kZXg6NX0sdGhpcy5ydWxlc1s3XS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbN10ub3Bjb2Rlc1swXT17dHlwZToxLGNoaWxkcmVuOlsxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxN119LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1sxXT17dHlwZTo1LG1pbjoxNjAsbWF4OjU1Mjk1fSx0aGlzLnJ1bGVzWzddLm9wY29kZXNbMl09e3R5cGU6NSxtaW46NjM3NDQsbWF4OjY0OTc1fSx0aGlzLnJ1bGVzWzddLm9wY29kZXNbM109e3R5cGU6NSxtaW46NjUwMDgsbWF4OjY1NTE5fSx0aGlzLnJ1bGVzWzddLm9wY29kZXNbNF09e3R5cGU6NSxtaW46NjU1MzYsbWF4OjEzMTA2OX0sdGhpcy5ydWxlc1s3XS5vcGNvZGVzWzVdPXt0eXBlOjUsbWluOjEzMTA3MixtYXg6MTk2NjA1fSx0aGlzLnJ1bGVzWzddLm9wY29kZXNbNl09e3R5cGU6NSxtaW46MTk2NjA4LG1heDoyNjIxNDF9LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1s3XT17dHlwZTo1LG1pbjoyNjIxNDQsbWF4OjMyNzY3N30sdGhpcy5ydWxlc1s3XS5vcGNvZGVzWzhdPXt0eXBlOjUsbWluOjMyNzY4MCxtYXg6MzkzMjEzfSx0aGlzLnJ1bGVzWzddLm9wY29kZXNbOV09e3R5cGU6NSxtaW46MzkzMjE2LG1heDo0NTg3NDl9LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1sxMF09e3R5cGU6NSxtaW46NDU4NzUyLG1heDo1MjQyODV9LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1sxMV09e3R5cGU6NSxtaW46NTI0Mjg4LG1heDo1ODk4MjF9LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1sxMl09e3R5cGU6NSxtaW46NTg5ODI0LG1heDo2NTUzNTd9LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1sxM109e3R5cGU6NSxtaW46NjU1MzYwLG1heDo3MjA4OTN9LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1sxNF09e3R5cGU6NSxtaW46NzIwODk2LG1heDo3ODY0Mjl9LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1sxNV09e3R5cGU6NSxtaW46Nzg2NDMyLG1heDo4NTE5NjV9LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1sxNl09e3R5cGU6NSxtaW46ODUxOTY4LG1heDo5MTc1MDF9LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1sxN109e3R5cGU6NSxtaW46OTIxNjAwLG1heDo5ODMwMzd9LHRoaXMucnVsZXNbOF0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzhdLm9wY29kZXNbMF09e3R5cGU6MSxjaGlsZHJlbjpbMSwyLDNdfSx0aGlzLnJ1bGVzWzhdLm9wY29kZXNbMV09e3R5cGU6NSxtaW46NTczNDQsbWF4OjYzNzQzfSx0aGlzLnJ1bGVzWzhdLm9wY29kZXNbMl09e3R5cGU6NSxtaW46OTgzMDQwLG1heDoxMDQ4NTczfSx0aGlzLnJ1bGVzWzhdLm9wY29kZXNbM109e3R5cGU6NSxtaW46MTA0ODU3NixtYXg6MTExNDEwOX0sdGhpcy50b1N0cmluZz1mdW5jdGlvbiB0b1N0cmluZygpe2xldCBzPSIiO3JldHVybiBzKz0iOyBPcGVuQVBJIFNlcnZlciBVUkwgdGVtcGxhdGluZyBBQk5GIHN5bnRheFxuIixzKz0ic2VydmVyLXVybC10ZW1wbGF0ZSAgICA9IDEqKCBsaXRlcmFscyAvIHNlcnZlci12YXJpYWJsZSApIDsgdmFyaWFudCBvZiBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjU3MCNzZWN0aW9uLTJcbiIscys9J3NlcnZlci12YXJpYWJsZSAgICAgICAgPSAieyIgc2VydmVyLXZhcmlhYmxlLW5hbWUgIn0iXG4nLHMrPSJzZXJ2ZXItdmFyaWFibGUtbmFtZSAgID0gMSooICV4MDAtN0EgLyAleDdDIC8gJXg3RS0xMEZGRkYgKSA7IGV2ZXJ5IFVURjggY2hhcmFjdGVyIGV4Y2VwdCB7IGFuZCB9IChmcm9tIE9wZW5BUEkpXG4iLHMrPSJcbiIscys9IjsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzY1NzAjc2VjdGlvbi0yLjFcbiIscys9IjsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvZXJyYXRhL2VpZDY5MzdcbiIscys9ImxpdGVyYWxzICAgICAgICAgICAgICAgPSAxKiggJXgyMSAvICV4MjMtMjQgLyAleDI2LTNCIC8gJXgzRCAvICV4M0YtNUJcbiIscys9IiAgICAgICAgICAgICAgICAgICAgICAgLyAleDVEIC8gJXg1RiAvICV4NjEtN0EgLyAleDdFIC8gdWNzY2hhciAvIGlwcml2YXRlXG4iLHMrPSIgICAgICAgICAgICAgICAgICAgICAgIC8gcGN0LWVuY29kZWQpXG4iLHMrPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBhbnkgVW5pY29kZSBjaGFyYWN0ZXIgZXhjZXB0OiBDVEwsIFNQLFxuIixzKz0nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIERRVU9URSwgIiUiIChhc2lkZSBmcm9tIHBjdC1lbmNvZGVkKSxcbicscys9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAiPCIsICI+IiwgIlxcIiwgIl4iLCAiYCIsICJ7IiwgInwiLCAifSJcbicscys9IlxuIixzKz0iOyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjU3MCNzZWN0aW9uLTEuNVxuIixzKz0iRElHSVQgICAgICAgICAgPSAgJXgzMC0zOSAgICAgICAgICAgICA7IDAtOVxuIixzKz0nSEVYRElHICAgICAgICAgPSAgRElHSVQgLyAiQSIgLyAiQiIgLyAiQyIgLyAiRCIgLyAiRSIgLyAiRiIgOyBjYXNlLWluc2Vuc2l0aXZlXG4nLHMrPSJcbiIscys9J3BjdC1lbmNvZGVkICAgID0gICIlIiBIRVhESUcgSEVYRElHXG4nLHMrPSJcbiIscys9InVjc2NoYXIgICAgICAgID0gICV4QTAtRDdGRiAvICV4RjkwMC1GRENGIC8gJXhGREYwLUZGRUZcbiIscys9IiAgICAgICAgICAgICAgIC8gICV4MTAwMDAtMUZGRkQgLyAleDIwMDAwLTJGRkZEIC8gJXgzMDAwMC0zRkZGRFxuIixzKz0iICAgICAgICAgICAgICAgLyAgJXg0MDAwMC00RkZGRCAvICV4NTAwMDAtNUZGRkQgLyAleDYwMDAwLTZGRkZEXG4iLHMrPSIgICAgICAgICAgICAgICAvICAleDcwMDAwLTdGRkZEIC8gJXg4MDAwMC04RkZGRCAvICV4OTAwMDAtOUZGRkRcbiIscys9IiAgICAgICAgICAgICAgIC8gICV4QTAwMDAtQUZGRkQgLyAleEIwMDAwLUJGRkZEIC8gJXhDMDAwMC1DRkZGRFxuIixzKz0iICAgICAgICAgICAgICAgLyAgJXhEMDAwMC1ERkZGRCAvICV4RTEwMDAtRUZGRkRcbiIscys9IlxuIixzKz0iaXByaXZhdGUgICAgICAgPSAgJXhFMDAwLUY4RkYgLyAleEYwMDAwLUZGRkZEIC8gJXgxMDAwMDAtMTBGRkZEXG4iLCc7IE9wZW5BUEkgU2VydmVyIFVSTCB0ZW1wbGF0aW5nIEFCTkYgc3ludGF4XG5zZXJ2ZXItdXJsLXRlbXBsYXRlICAgID0gMSooIGxpdGVyYWxzIC8gc2VydmVyLXZhcmlhYmxlICkgOyB2YXJpYW50IG9mIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2NTcwI3NlY3Rpb24tMlxuc2VydmVyLXZhcmlhYmxlICAgICAgICA9ICJ7IiBzZXJ2ZXItdmFyaWFibGUtbmFtZSAifSJcbnNlcnZlci12YXJpYWJsZS1uYW1lICAgPSAxKiggJXgwMC03QSAvICV4N0MgLyAleDdFLTEwRkZGRiApIDsgZXZlcnkgVVRGOCBjaGFyYWN0ZXIgZXhjZXB0IHsgYW5kIH0gKGZyb20gT3BlbkFQSSlcblxuOyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjU3MCNzZWN0aW9uLTIuMVxuOyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9lcnJhdGEvZWlkNjkzN1xubGl0ZXJhbHMgICAgICAgICAgICAgICA9IDEqKCAleDIxIC8gJXgyMy0yNCAvICV4MjYtM0IgLyAleDNEIC8gJXgzRi01QlxuICAgICAgICAgICAgICAgICAgICAgICAvICV4NUQgLyAleDVGIC8gJXg2MS03QSAvICV4N0UgLyB1Y3NjaGFyIC8gaXByaXZhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgLyBwY3QtZW5jb2RlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGFueSBVbmljb2RlIGNoYXJhY3RlciBleGNlcHQ6IENUTCwgU1AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAgRFFVT1RFLCAiJSIgKGFzaWRlIGZyb20gcGN0LWVuY29kZWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgICI8IiwgIj4iLCAiXFwiLCAiXiIsICJgIiwgInsiLCAifCIsICJ9IlxuXG47IGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2NTcwI3NlY3Rpb24tMS41XG5ESUdJVCAgICAgICAgICA9ICAleDMwLTM5ICAgICAgICAgICAgIDsgMC05XG5IRVhESUcgICAgICAgICA9ICBESUdJVCAvICJBIiAvICJCIiAvICJDIiAvICJEIiAvICJFIiAvICJGIiA7IGNhc2UtaW5zZW5zaXRpdmVcblxucGN0LWVuY29kZWQgICAgPSAgIiUiIEhFWERJRyBIRVhESUdcblxudWNzY2hhciAgICAgICAgPSAgJXhBMC1EN0ZGIC8gJXhGOTAwLUZEQ0YgLyAleEZERjAtRkZFRlxuICAgICAgICAgICAgICAgLyAgJXgxMDAwMC0xRkZGRCAvICV4MjAwMDAtMkZGRkQgLyAleDMwMDAwLTNGRkZEXG4gICAgICAgICAgICAgICAvICAleDQwMDAwLTRGRkZEIC8gJXg1MDAwMC01RkZGRCAvICV4NjAwMDAtNkZGRkRcbiAgICAgICAgICAgICAgIC8gICV4NzAwMDAtN0ZGRkQgLyAleDgwMDAwLThGRkZEIC8gJXg5MDAwMC05RkZGRFxuICAgICAgICAgICAgICAgLyAgJXhBMDAwMC1BRkZGRCAvICV4QjAwMDAtQkZGRkQgLyAleEMwMDAwLUNGRkZEXG4gICAgICAgICAgICAgICAvICAleEQwMDAwLURGRkZEIC8gJXhFMTAwMC1FRkZGRFxuXG5pcHJpdmF0ZSAgICAgICA9ICAleEUwMDAtRjhGRiAvICV4RjAwMDAtRkZGRkQgLyAleDEwMDAwMC0xMEZGRkRcbid9fSxvcGVuYXBpX3NlcnZlcl91cmxfdGVtcGxhdGluZ19lc19wYXJzZT1zPT57Y29uc3Qgbz1uZXcgRXA7by5hc3Q9bmV3IHdwLG8uYXN0LmNhbGxiYWNrc1sic2VydmVyLXVybC10ZW1wbGF0ZSJdPXNlcnZlcl91cmxfdGVtcGxhdGUsby5hc3QuY2FsbGJhY2tzWyJzZXJ2ZXItdmFyaWFibGUiXT1jYWxsYmFja3Nfc2VydmVyX3ZhcmlhYmxlLG8uYXN0LmNhbGxiYWNrc1sic2VydmVyLXZhcmlhYmxlLW5hbWUiXT1zZXJ2ZXJfdmFyaWFibGVfbmFtZSxvLmFzdC5jYWxsYmFja3MubGl0ZXJhbHM9Y2FsbGJhY2tzX2xpdGVyYWxzO3JldHVybntyZXN1bHQ6by5wYXJzZShUeCwic2VydmVyLXVybC10ZW1wbGF0ZSIscyksYXN0Om8uYXN0fX0sZXNfdGVzdD0ocyx7c3RyaWN0Om89ITF9PXt9KT0+e3RyeXtjb25zdCBpPW9wZW5hcGlfc2VydmVyX3VybF90ZW1wbGF0aW5nX2VzX3BhcnNlKHMpO2lmKCFpLnJlc3VsdC5zdWNjZXNzKXJldHVybiExO2NvbnN0IGE9W107aS5hc3QudHJhbnNsYXRlKGEpO2NvbnN0IHU9YS5zb21lKCgoW3NdKT0+InNlcnZlci12YXJpYWJsZSI9PT1zKSk7aWYoIW8mJiF1KXRyeXtyZXR1cm4gbmV3IFVSTChzLCJodHRwczovL3ZsYWRpbWlyZ29yZWouY29tIiksITB9Y2F0Y2h7cmV0dXJuITF9cmV0dXJuIW98fHV9Y2F0Y2h7cmV0dXJuITF9fSxlbmNvZGVTZXJ2ZXJWYXJpYWJsZT1zPT4ocz0+e3RyeXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHMmJmRlY29kZVVSSUNvbXBvbmVudChzKSE9PXN9Y2F0Y2h7cmV0dXJuITF9fSkocyk/czplbmNvZGVVUklDb21wb25lbnQocykucmVwbGFjZSgvJTVCL2csIlsiKS5yZXBsYWNlKC8lNUQvZywiXSIpLE54PVsibGl0ZXJhbHMiLCJzZXJ2ZXItdmFyaWFibGUtbmFtZSJdLGVzX3N1YnN0aXR1dGU9KHMsbyxpPXt9KT0+e2NvbnN0IGE9ey4uLntlbmNvZGVyOmVuY29kZVNlcnZlclZhcmlhYmxlfSwuLi5pfSx1PW9wZW5hcGlfc2VydmVyX3VybF90ZW1wbGF0aW5nX2VzX3BhcnNlKHMpO2lmKCF1LnJlc3VsdC5zdWNjZXNzKXJldHVybiBzO2NvbnN0IF89W107dS5hc3QudHJhbnNsYXRlKF8pO2NvbnN0IHc9Xy5maWx0ZXIoKChbc10pPT5OeC5pbmNsdWRlcyhzKSkpLm1hcCgoKFtzLGldKT0+InNlcnZlci12YXJpYWJsZS1uYW1lIj09PXM/T2JqZWN0Lmhhc093bihvLGkpP2EuZW5jb2RlcihvW2ldLGkpOmB7JHtpfX1gOmkpKTtyZXR1cm4gdy5qb2luKCIiKX07ZnVuY3Rpb24gcGF0aF90ZW1wbGF0aW5nX2dyYW1tYXIoKXt0aGlzLmdyYW1tYXJPYmplY3Q9ImdyYW1tYXJPYmplY3QiLHRoaXMucnVsZXM9W10sdGhpcy5ydWxlc1swXT17bmFtZToicGF0aC10ZW1wbGF0ZSIsbG93ZXI6InBhdGgtdGVtcGxhdGUiLGluZGV4OjAsaXNCa3I6ITF9LHRoaXMucnVsZXNbMV09e25hbWU6InBhdGgtc2VnbWVudCIsbG93ZXI6InBhdGgtc2VnbWVudCIsaW5kZXg6MSxpc0JrcjohMX0sdGhpcy5ydWxlc1syXT17bmFtZToic2xhc2giLGxvd2VyOiJzbGFzaCIsaW5kZXg6Mixpc0JrcjohMX0sdGhpcy5ydWxlc1szXT17bmFtZToicGF0aC1saXRlcmFsIixsb3dlcjoicGF0aC1saXRlcmFsIixpbmRleDozLGlzQmtyOiExfSx0aGlzLnJ1bGVzWzRdPXtuYW1lOiJ0ZW1wbGF0ZS1leHByZXNzaW9uIixsb3dlcjoidGVtcGxhdGUtZXhwcmVzc2lvbiIsaW5kZXg6NCxpc0JrcjohMX0sdGhpcy5ydWxlc1s1XT17bmFtZToidGVtcGxhdGUtZXhwcmVzc2lvbi1wYXJhbS1uYW1lIixsb3dlcjoidGVtcGxhdGUtZXhwcmVzc2lvbi1wYXJhbS1uYW1lIixpbmRleDo1LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzZdPXtuYW1lOiJwY2hhciIsbG93ZXI6InBjaGFyIixpbmRleDo2LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzddPXtuYW1lOiJ1bnJlc2VydmVkIixsb3dlcjoidW5yZXNlcnZlZCIsaW5kZXg6Nyxpc0JrcjohMX0sdGhpcy5ydWxlc1s4XT17bmFtZToicGN0LWVuY29kZWQiLGxvd2VyOiJwY3QtZW5jb2RlZCIsaW5kZXg6OCxpc0JrcjohMX0sdGhpcy5ydWxlc1s5XT17bmFtZToic3ViLWRlbGltcyIsbG93ZXI6InN1Yi1kZWxpbXMiLGluZGV4OjksaXNCa3I6ITF9LHRoaXMucnVsZXNbMTBdPXtuYW1lOiJBTFBIQSIsbG93ZXI6ImFscGhhIixpbmRleDoxMCxpc0JrcjohMX0sdGhpcy5ydWxlc1sxMV09e25hbWU6IkRJR0lUIixsb3dlcjoiZGlnaXQiLGluZGV4OjExLGlzQmtyOiExfSx0aGlzLnJ1bGVzWzEyXT17bmFtZToiSEVYRElHIixsb3dlcjoiaGV4ZGlnIixpbmRleDoxMixpc0JrcjohMX0sdGhpcy51ZHRzPVtdLHRoaXMucnVsZXNbMF0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzBdLm9wY29kZXNbMF09e3R5cGU6MixjaGlsZHJlbjpbMSwyLDZdfSx0aGlzLnJ1bGVzWzBdLm9wY29kZXNbMV09e3R5cGU6NCxpbmRleDoyfSx0aGlzLnJ1bGVzWzBdLm9wY29kZXNbMl09e3R5cGU6MyxtaW46MCxtYXg6MS8wfSx0aGlzLnJ1bGVzWzBdLm9wY29kZXNbM109e3R5cGU6MixjaGlsZHJlbjpbNCw1XX0sdGhpcy5ydWxlc1swXS5vcGNvZGVzWzRdPXt0eXBlOjQsaW5kZXg6MX0sdGhpcy5ydWxlc1swXS5vcGNvZGVzWzVdPXt0eXBlOjQsaW5kZXg6Mn0sdGhpcy5ydWxlc1swXS5vcGNvZGVzWzZdPXt0eXBlOjMsbWluOjAsbWF4OjF9LHRoaXMucnVsZXNbMF0ub3Bjb2Rlc1s3XT17dHlwZTo0LGluZGV4OjF9LHRoaXMucnVsZXNbMV0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzFdLm9wY29kZXNbMF09e3R5cGU6MyxtaW46MSxtYXg6MS8wfSx0aGlzLnJ1bGVzWzFdLm9wY29kZXNbMV09e3R5cGU6MSxjaGlsZHJlbjpbMiwzXX0sdGhpcy5ydWxlc1sxXS5vcGNvZGVzWzJdPXt0eXBlOjQsaW5kZXg6M30sdGhpcy5ydWxlc1sxXS5vcGNvZGVzWzNdPXt0eXBlOjQsaW5kZXg6NH0sdGhpcy5ydWxlc1syXS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbMl0ub3Bjb2Rlc1swXT17dHlwZTo3LHN0cmluZzpbNDddfSx0aGlzLnJ1bGVzWzNdLm9wY29kZXM9W10sdGhpcy5ydWxlc1szXS5vcGNvZGVzWzBdPXt0eXBlOjMsbWluOjEsbWF4OjEvMH0sdGhpcy5ydWxlc1szXS5vcGNvZGVzWzFdPXt0eXBlOjQsaW5kZXg6Nn0sdGhpcy5ydWxlc1s0XS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbNF0ub3Bjb2Rlc1swXT17dHlwZToyLGNoaWxkcmVuOlsxLDIsM119LHRoaXMucnVsZXNbNF0ub3Bjb2Rlc1sxXT17dHlwZTo3LHN0cmluZzpbMTIzXX0sdGhpcy5ydWxlc1s0XS5vcGNvZGVzWzJdPXt0eXBlOjQsaW5kZXg6NX0sdGhpcy5ydWxlc1s0XS5vcGNvZGVzWzNdPXt0eXBlOjcsc3RyaW5nOlsxMjVdfSx0aGlzLnJ1bGVzWzVdLm9wY29kZXM9W10sdGhpcy5ydWxlc1s1XS5vcGNvZGVzWzBdPXt0eXBlOjMsbWluOjEsbWF4OjEvMH0sdGhpcy5ydWxlc1s1XS5vcGNvZGVzWzFdPXt0eXBlOjEsY2hpbGRyZW46WzIsMyw0XX0sdGhpcy5ydWxlc1s1XS5vcGNvZGVzWzJdPXt0eXBlOjUsbWluOjAsbWF4OjEyMn0sdGhpcy5ydWxlc1s1XS5vcGNvZGVzWzNdPXt0eXBlOjYsc3RyaW5nOlsxMjRdfSx0aGlzLnJ1bGVzWzVdLm9wY29kZXNbNF09e3R5cGU6NSxtaW46MTI2LG1heDoxMTE0MTExfSx0aGlzLnJ1bGVzWzZdLm9wY29kZXM9W10sdGhpcy5ydWxlc1s2XS5vcGNvZGVzWzBdPXt0eXBlOjEsY2hpbGRyZW46WzEsMiwzLDQsNV19LHRoaXMucnVsZXNbNl0ub3Bjb2Rlc1sxXT17dHlwZTo0LGluZGV4Ojd9LHRoaXMucnVsZXNbNl0ub3Bjb2Rlc1syXT17dHlwZTo0LGluZGV4Ojh9LHRoaXMucnVsZXNbNl0ub3Bjb2Rlc1szXT17dHlwZTo0LGluZGV4Ojl9LHRoaXMucnVsZXNbNl0ub3Bjb2Rlc1s0XT17dHlwZTo3LHN0cmluZzpbNThdfSx0aGlzLnJ1bGVzWzZdLm9wY29kZXNbNV09e3R5cGU6NyxzdHJpbmc6WzY0XX0sdGhpcy5ydWxlc1s3XS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbN10ub3Bjb2Rlc1swXT17dHlwZToxLGNoaWxkcmVuOlsxLDIsMyw0LDUsNl19LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1sxXT17dHlwZTo0LGluZGV4OjEwfSx0aGlzLnJ1bGVzWzddLm9wY29kZXNbMl09e3R5cGU6NCxpbmRleDoxMX0sdGhpcy5ydWxlc1s3XS5vcGNvZGVzWzNdPXt0eXBlOjcsc3RyaW5nOls0NV19LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1s0XT17dHlwZTo3LHN0cmluZzpbNDZdfSx0aGlzLnJ1bGVzWzddLm9wY29kZXNbNV09e3R5cGU6NyxzdHJpbmc6Wzk1XX0sdGhpcy5ydWxlc1s3XS5vcGNvZGVzWzZdPXt0eXBlOjcsc3RyaW5nOlsxMjZdfSx0aGlzLnJ1bGVzWzhdLm9wY29kZXM9W10sdGhpcy5ydWxlc1s4XS5vcGNvZGVzWzBdPXt0eXBlOjIsY2hpbGRyZW46WzEsMiwzXX0sdGhpcy5ydWxlc1s4XS5vcGNvZGVzWzFdPXt0eXBlOjcsc3RyaW5nOlszN119LHRoaXMucnVsZXNbOF0ub3Bjb2Rlc1syXT17dHlwZTo0LGluZGV4OjEyfSx0aGlzLnJ1bGVzWzhdLm9wY29kZXNbM109e3R5cGU6NCxpbmRleDoxMn0sdGhpcy5ydWxlc1s5XS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbOV0ub3Bjb2Rlc1swXT17dHlwZToxLGNoaWxkcmVuOlsxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMV19LHRoaXMucnVsZXNbOV0ub3Bjb2Rlc1sxXT17dHlwZTo3LHN0cmluZzpbMzNdfSx0aGlzLnJ1bGVzWzldLm9wY29kZXNbMl09e3R5cGU6NyxzdHJpbmc6WzM2XX0sdGhpcy5ydWxlc1s5XS5vcGNvZGVzWzNdPXt0eXBlOjcsc3RyaW5nOlszOF19LHRoaXMucnVsZXNbOV0ub3Bjb2Rlc1s0XT17dHlwZTo3LHN0cmluZzpbMzldfSx0aGlzLnJ1bGVzWzldLm9wY29kZXNbNV09e3R5cGU6NyxzdHJpbmc6WzQwXX0sdGhpcy5ydWxlc1s5XS5vcGNvZGVzWzZdPXt0eXBlOjcsc3RyaW5nOls0MV19LHRoaXMucnVsZXNbOV0ub3Bjb2Rlc1s3XT17dHlwZTo3LHN0cmluZzpbNDJdfSx0aGlzLnJ1bGVzWzldLm9wY29kZXNbOF09e3R5cGU6NyxzdHJpbmc6WzQzXX0sdGhpcy5ydWxlc1s5XS5vcGNvZGVzWzldPXt0eXBlOjcsc3RyaW5nOls0NF19LHRoaXMucnVsZXNbOV0ub3Bjb2Rlc1sxMF09e3R5cGU6NyxzdHJpbmc6WzU5XX0sdGhpcy5ydWxlc1s5XS5vcGNvZGVzWzExXT17dHlwZTo3LHN0cmluZzpbNjFdfSx0aGlzLnJ1bGVzWzEwXS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbMTBdLm9wY29kZXNbMF09e3R5cGU6MSxjaGlsZHJlbjpbMSwyXX0sdGhpcy5ydWxlc1sxMF0ub3Bjb2Rlc1sxXT17dHlwZTo1LG1pbjo2NSxtYXg6OTB9LHRoaXMucnVsZXNbMTBdLm9wY29kZXNbMl09e3R5cGU6NSxtaW46OTcsbWF4OjEyMn0sdGhpcy5ydWxlc1sxMV0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzExXS5vcGNvZGVzWzBdPXt0eXBlOjUsbWluOjQ4LG1heDo1N30sdGhpcy5ydWxlc1sxMl0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzEyXS5vcGNvZGVzWzBdPXt0eXBlOjEsY2hpbGRyZW46WzEsMiwzLDQsNSw2LDddfSx0aGlzLnJ1bGVzWzEyXS5vcGNvZGVzWzFdPXt0eXBlOjQsaW5kZXg6MTF9LHRoaXMucnVsZXNbMTJdLm9wY29kZXNbMl09e3R5cGU6NyxzdHJpbmc6Wzk3XX0sdGhpcy5ydWxlc1sxMl0ub3Bjb2Rlc1szXT17dHlwZTo3LHN0cmluZzpbOThdfSx0aGlzLnJ1bGVzWzEyXS5vcGNvZGVzWzRdPXt0eXBlOjcsc3RyaW5nOls5OV19LHRoaXMucnVsZXNbMTJdLm9wY29kZXNbNV09e3R5cGU6NyxzdHJpbmc6WzEwMF19LHRoaXMucnVsZXNbMTJdLm9wY29kZXNbNl09e3R5cGU6NyxzdHJpbmc6WzEwMV19LHRoaXMucnVsZXNbMTJdLm9wY29kZXNbN109e3R5cGU6NyxzdHJpbmc6WzEwMl19LHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24gdG9TdHJpbmcoKXtsZXQgcz0iIjtyZXR1cm4gcys9IjsgT3BlbkFQSSBQYXRoIFRlbXBsYXRpbmcgQUJORiBzeW50YXhcbiIscys9IjsgdmFyaWFudCBvZiBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjNcbiIscys9InBhdGgtdGVtcGxhdGUgICAgICAgICAgICAgICAgICA9IHNsYXNoICooIHBhdGgtc2VnbWVudCBzbGFzaCApIFsgcGF0aC1zZWdtZW50IF1cbiIscys9InBhdGgtc2VnbWVudCAgICAgICAgICAgICAgICAgICA9IDEqKCBwYXRoLWxpdGVyYWwgLyB0ZW1wbGF0ZS1leHByZXNzaW9uIClcbiIscys9J3NsYXNoICAgICAgICAgICAgICAgICAgICAgICAgICA9ICIvIlxuJyxzKz0icGF0aC1saXRlcmFsICAgICAgICAgICAgICAgICAgID0gMSpwY2hhclxuIixzKz0ndGVtcGxhdGUtZXhwcmVzc2lvbiAgICAgICAgICAgID0gInsiIHRlbXBsYXRlLWV4cHJlc3Npb24tcGFyYW0tbmFtZSAifSJcbicscys9InRlbXBsYXRlLWV4cHJlc3Npb24tcGFyYW0tbmFtZSA9IDEqKCAleDAwLTdBIC8gJXg3QyAvICV4N0UtMTBGRkZGICkgOyBldmVyeSBVVEY4IGNoYXJhY3RlciBleGNlcHQgeyBhbmQgfSAoZnJvbSBPcGVuQVBJKVxuIixzKz0iXG4iLHMrPSI7IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuM1xuIixzKz0ncGNoYXIgICAgICAgICAgICAgICA9IHVucmVzZXJ2ZWQgLyBwY3QtZW5jb2RlZCAvIHN1Yi1kZWxpbXMgLyAiOiIgLyAiQCJcbicscys9J3VucmVzZXJ2ZWQgICAgICAgICAgPSBBTFBIQSAvIERJR0lUIC8gIi0iIC8gIi4iIC8gIl8iIC8gIn4iXG4nLHMrPSIgICAgICAgICAgICAgICAgICAgIDsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMi4zXG4iLHMrPSdwY3QtZW5jb2RlZCAgICAgICAgID0gIiUiIEhFWERJRyBIRVhESUdcbicscys9IiAgICAgICAgICAgICAgICAgICAgOyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM5ODYjc2VjdGlvbi0yLjFcbiIscys9J3N1Yi1kZWxpbXMgICAgICAgICAgPSAiISIgLyAiJCIgLyAiJiIgLyAiXCciIC8gIigiIC8gIikiXG4nLHMrPScgICAgICAgICAgICAgICAgICAgIC8gIioiIC8gIisiIC8gIiwiIC8gIjsiIC8gIj0iXG4nLHMrPSIgICAgICAgICAgICAgICAgICAgIDsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMi4yXG4iLHMrPSJcbiIscys9IjsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM1MjM0I2FwcGVuZGl4LUIuMVxuIixzKz0iQUxQSEEgICAgICAgICAgICAgICA9ICV4NDEtNUEgLyAleDYxLTdBICAgOyBBLVogLyBhLXpcbiIscys9IkRJR0lUICAgICAgICAgICAgICAgPSAleDMwLTM5ICAgICAgICAgICAgOyAwLTlcbiIscys9J0hFWERJRyAgICAgICAgICAgICAgPSBESUdJVCAvICJBIiAvICJCIiAvICJDIiAvICJEIiAvICJFIiAvICJGIlxuJywnOyBPcGVuQVBJIFBhdGggVGVtcGxhdGluZyBBQk5GIHN5bnRheFxuOyB2YXJpYW50IG9mIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuM1xucGF0aC10ZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0gc2xhc2ggKiggcGF0aC1zZWdtZW50IHNsYXNoICkgWyBwYXRoLXNlZ21lbnQgXVxucGF0aC1zZWdtZW50ICAgICAgICAgICAgICAgICAgID0gMSooIHBhdGgtbGl0ZXJhbCAvIHRlbXBsYXRlLWV4cHJlc3Npb24gKVxuc2xhc2ggICAgICAgICAgICAgICAgICAgICAgICAgID0gIi8iXG5wYXRoLWxpdGVyYWwgICAgICAgICAgICAgICAgICAgPSAxKnBjaGFyXG50ZW1wbGF0ZS1leHByZXNzaW9uICAgICAgICAgICAgPSAieyIgdGVtcGxhdGUtZXhwcmVzc2lvbi1wYXJhbS1uYW1lICJ9IlxudGVtcGxhdGUtZXhwcmVzc2lvbi1wYXJhbS1uYW1lID0gMSooICV4MDAtN0EgLyAleDdDIC8gJXg3RS0xMEZGRkYgKSA7IGV2ZXJ5IFVURjggY2hhcmFjdGVyIGV4Y2VwdCB7IGFuZCB9IChmcm9tIE9wZW5BUEkpXG5cbjsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4zXG5wY2hhciAgICAgICAgICAgICAgID0gdW5yZXNlcnZlZCAvIHBjdC1lbmNvZGVkIC8gc3ViLWRlbGltcyAvICI6IiAvICJAIlxudW5yZXNlcnZlZCAgICAgICAgICA9IEFMUEhBIC8gRElHSVQgLyAiLSIgLyAiLiIgLyAiXyIgLyAifiJcbiAgICAgICAgICAgICAgICAgICAgOyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM5ODYjc2VjdGlvbi0yLjNcbnBjdC1lbmNvZGVkICAgICAgICAgPSAiJSIgSEVYRElHIEhFWERJR1xuICAgICAgICAgICAgICAgICAgICA7IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIuMVxuc3ViLWRlbGltcyAgICAgICAgICA9ICIhIiAvICIkIiAvICImIiAvICJcJyIgLyAiKCIgLyAiKSJcbiAgICAgICAgICAgICAgICAgICAgLyAiKiIgLyAiKyIgLyAiLCIgLyAiOyIgLyAiPSJcbiAgICAgICAgICAgICAgICAgICAgOyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM5ODYjc2VjdGlvbi0yLjJcblxuOyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzUyMzQjYXBwZW5kaXgtQi4xXG5BTFBIQSAgICAgICAgICAgICAgID0gJXg0MS01QSAvICV4NjEtN0EgICA7IEEtWiAvIGEtelxuRElHSVQgICAgICAgICAgICAgICA9ICV4MzAtMzkgICAgICAgICAgICA7IDAtOVxuSEVYRElHICAgICAgICAgICAgICA9IERJR0lUIC8gIkEiIC8gIkIiIC8gIkMiIC8gIkQiIC8gIkUiIC8gIkYiXG4nfX1jb25zdCBjYWxsYmFja3Nfc2xhc2g9KHMsbyxpLGEsdSk9PihzPT09QXAuU0VNX1BSRT91LnB1c2goWyJzbGFzaCIsT3AuY2hhcnNUb1N0cmluZyhvLGksYSldKTpBcC5TRU1fUE9TVCxBcC5TRU1fT0spLHBhdGhfdGVtcGxhdGU9KHMsbyxpLGEsdSk9PntpZihzPT09QXAuU0VNX1BSRSl7aWYoITE9PT1BcnJheS5pc0FycmF5KHUpKXRocm93IG5ldyBFcnJvcigicGFyc2VyJ3MgdXNlciBkYXRhIG11c3QgYmUgYW4gYXJyYXkiKTt1LnB1c2goWyJwYXRoLXRlbXBsYXRlIixPcC5jaGFyc1RvU3RyaW5nKG8saSxhKV0pfXJldHVybiBBcC5TRU1fT0t9LHBhdGhfbGl0ZXJhbD0ocyxvLGksYSx1KT0+KHM9PT1BcC5TRU1fUFJFP3UucHVzaChbInBhdGgtbGl0ZXJhbCIsT3AuY2hhcnNUb1N0cmluZyhvLGksYSldKTpBcC5TRU1fUE9TVCxBcC5TRU1fT0spLHRlbXBsYXRlX2V4cHJlc3Npb249KHMsbyxpLGEsdSk9PihzPT09QXAuU0VNX1BSRT91LnB1c2goWyJ0ZW1wbGF0ZS1leHByZXNzaW9uIixPcC5jaGFyc1RvU3RyaW5nKG8saSxhKV0pOkFwLlNFTV9QT1NULEFwLlNFTV9PSyksdGVtcGxhdGVfZXhwcmVzc2lvbl9wYXJhbV9uYW1lPShzLG8saSxhLHUpPT4ocz09PUFwLlNFTV9QUkU/dS5wdXNoKFsidGVtcGxhdGUtZXhwcmVzc2lvbi1wYXJhbS1uYW1lIixPcC5jaGFyc1RvU3RyaW5nKG8saSxhKV0pOkFwLlNFTV9QT1NULEFwLlNFTV9PSyksTXg9bmV3IHBhdGhfdGVtcGxhdGluZ19ncmFtbWFyLG9wZW5hcGlfcGF0aF90ZW1wbGF0aW5nX2VzX3BhcnNlPXM9Pntjb25zdCBvPW5ldyBFcDtvLmFzdD1uZXcgd3Asby5hc3QuY2FsbGJhY2tzWyJwYXRoLXRlbXBsYXRlIl09cGF0aF90ZW1wbGF0ZSxvLmFzdC5jYWxsYmFja3Muc2xhc2g9Y2FsbGJhY2tzX3NsYXNoLG8uYXN0LmNhbGxiYWNrc1sicGF0aC1saXRlcmFsIl09cGF0aF9saXRlcmFsLG8uYXN0LmNhbGxiYWNrc1sidGVtcGxhdGUtZXhwcmVzc2lvbiJdPXRlbXBsYXRlX2V4cHJlc3Npb24sby5hc3QuY2FsbGJhY2tzWyJ0ZW1wbGF0ZS1leHByZXNzaW9uLXBhcmFtLW5hbWUiXT10ZW1wbGF0ZV9leHByZXNzaW9uX3BhcmFtX25hbWU7cmV0dXJue3Jlc3VsdDpvLnBhcnNlKE14LCJwYXRoLXRlbXBsYXRlIixzKSxhc3Q6by5hc3R9fTtjb25zdCBlbmNvZGVQYXRoQ29tcG9uZW50PXM9PihzPT57dHJ5e3JldHVybiJzdHJpbmciPT10eXBlb2YgcyYmZGVjb2RlVVJJQ29tcG9uZW50KHMpIT09c31jYXRjaHtyZXR1cm4hMX19KShzKT9zOmVuY29kZVVSSUNvbXBvbmVudChzKS5yZXBsYWNlKC8lNUIvZywiWyIpLnJlcGxhY2UoLyU1RC9nLCJdIiksUng9WyJzbGFzaCIsInBhdGgtbGl0ZXJhbCIsInRlbXBsYXRlLWV4cHJlc3Npb24tcGFyYW0tbmFtZSJdLGVzX3Jlc29sdmU9KHMsbyxpPXt9KT0+e2NvbnN0IGE9ey4uLntlbmNvZGVyOmVuY29kZVBhdGhDb21wb25lbnR9LC4uLml9LHU9b3BlbmFwaV9wYXRoX3RlbXBsYXRpbmdfZXNfcGFyc2Uocyk7aWYoIXUucmVzdWx0LnN1Y2Nlc3MpcmV0dXJuIHM7Y29uc3QgXz1bXTt1LmFzdC50cmFuc2xhdGUoXyk7Y29uc3Qgdz1fLmZpbHRlcigoKFtzXSk9PlJ4LmluY2x1ZGVzKHMpKSkubWFwKCgoW3MsaV0pPT4idGVtcGxhdGUtZXhwcmVzc2lvbi1wYXJhbS1uYW1lIj09PXM/T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8saSk/YS5lbmNvZGVyKG9baV0saSk6YHske2l9fWA6aSkpO3JldHVybiB3LmpvaW4oIiIpfTtuZXcgcGF0aF90ZW1wbGF0aW5nX2dyYW1tYXIsbmV3IEVwO2NvbnN0IER4PXtib2R5OmZ1bmN0aW9uIGJvZHlCdWlsZGVyKHtyZXE6cyx2YWx1ZTpvfSl7dm9pZCAwIT09byYmKHMuYm9keT1vKX0saGVhZGVyOmZ1bmN0aW9uIGhlYWRlckJ1aWxkZXIoe3JlcTpzLHBhcmFtZXRlcjpvLHZhbHVlOml9KXtzLmhlYWRlcnM9cy5oZWFkZXJzfHx7fSx2b2lkIDAhPT1pJiYocy5oZWFkZXJzW28ubmFtZV09aSl9LHF1ZXJ5OmZ1bmN0aW9uIHF1ZXJ5QnVpbGRlcih7cmVxOnMsdmFsdWU6byxwYXJhbWV0ZXI6aX0pe3MucXVlcnk9cy5xdWVyeXx8e30sITE9PT1vJiYiYm9vbGVhbiI9PT1pLnR5cGUmJihvPSJmYWxzZSIpOzA9PT1vJiZbIm51bWJlciIsImludGVnZXIiXS5pbmRleE9mKGkudHlwZSk+LTEmJihvPSIwIik7aWYobylzLnF1ZXJ5W2kubmFtZV09e2NvbGxlY3Rpb25Gb3JtYXQ6aS5jb2xsZWN0aW9uRm9ybWF0LHZhbHVlOm99O2Vsc2UgaWYoaS5hbGxvd0VtcHR5VmFsdWUmJnZvaWQgMCE9PW8pe2NvbnN0IG89aS5uYW1lO3MucXVlcnlbb109cy5xdWVyeVtvXXx8e30scy5xdWVyeVtvXS5hbGxvd0VtcHR5VmFsdWU9ITB9fSxwYXRoOmZ1bmN0aW9uIHBhdGhCdWlsZGVyKHtyZXE6cyx2YWx1ZTpvLHBhcmFtZXRlcjppLGJhc2VVUkw6YX0pe2lmKHZvaWQgMCE9PW8pe2NvbnN0IHU9cy51cmwucmVwbGFjZShhLCIiKSxfPWVzX3Jlc29sdmUodSx7W2kubmFtZV06b30pO3MudXJsPWErX319LGZvcm1EYXRhOmZ1bmN0aW9uIGZvcm1EYXRhQnVpbGRlcih7cmVxOnMsdmFsdWU6byxwYXJhbWV0ZXI6aX0peyExPT09byYmImJvb2xlYW4iPT09aS50eXBlJiYobz0iZmFsc2UiKTswPT09byYmWyJudW1iZXIiLCJpbnRlZ2VyIl0uaW5kZXhPZihpLnR5cGUpPi0xJiYobz0iMCIpO2lmKG8pcy5mb3JtPXMuZm9ybXx8e30scy5mb3JtW2kubmFtZV09e2NvbGxlY3Rpb25Gb3JtYXQ6aS5jb2xsZWN0aW9uRm9ybWF0LHZhbHVlOm99O2Vsc2UgaWYoaS5hbGxvd0VtcHR5VmFsdWUmJnZvaWQgMCE9PW8pe3MuZm9ybT1zLmZvcm18fHt9O2NvbnN0IG89aS5uYW1lO3MuZm9ybVtvXT1zLmZvcm1bb118fHt9LHMuZm9ybVtvXS5hbGxvd0VtcHR5VmFsdWU9ITB9fX07ZnVuY3Rpb24gc2VyaWFsaXplKHMsbyl7cmV0dXJuIG8uaW5jbHVkZXMoImFwcGxpY2F0aW9uL2pzb24iKT8ic3RyaW5nIj09dHlwZW9mIHM/czooQXJyYXkuaXNBcnJheShzKSYmKHM9cy5tYXAoKHM9Pnt0cnl7cmV0dXJuIEpTT04ucGFyc2Uocyl9Y2F0Y2gobyl7cmV0dXJuIHN9fSkpKSxKU09OLnN0cmluZ2lmeShzKSk6U3RyaW5nKHMpfWZ1bmN0aW9uIGdyYW1tYXJfZ3JhbW1hcigpe3RoaXMuZ3JhbW1hck9iamVjdD0iZ3JhbW1hck9iamVjdCIsdGhpcy5ydWxlcz1bXSx0aGlzLnJ1bGVzWzBdPXtuYW1lOiJsZW5pZW50LWNvb2tpZS1zdHJpbmciLGxvd2VyOiJsZW5pZW50LWNvb2tpZS1zdHJpbmciLGluZGV4OjAsaXNCa3I6ITF9LHRoaXMucnVsZXNbMV09e25hbWU6ImxlbmllbnQtY29va2llLWVudHJ5Iixsb3dlcjoibGVuaWVudC1jb29raWUtZW50cnkiLGluZGV4OjEsaXNCa3I6ITF9LHRoaXMucnVsZXNbMl09e25hbWU6ImxlbmllbnQtY29va2llLXBhaXIiLGxvd2VyOiJsZW5pZW50LWNvb2tpZS1wYWlyIixpbmRleDoyLGlzQmtyOiExfSx0aGlzLnJ1bGVzWzNdPXtuYW1lOiJsZW5pZW50LWNvb2tpZS1wYWlyLWludmFsaWQiLGxvd2VyOiJsZW5pZW50LWNvb2tpZS1wYWlyLWludmFsaWQiLGluZGV4OjMsaXNCa3I6ITF9LHRoaXMucnVsZXNbNF09e25hbWU6ImxlbmllbnQtY29va2llLW5hbWUiLGxvd2VyOiJsZW5pZW50LWNvb2tpZS1uYW1lIixpbmRleDo0LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzVdPXtuYW1lOiJsZW5pZW50LWNvb2tpZS12YWx1ZSIsbG93ZXI6ImxlbmllbnQtY29va2llLXZhbHVlIixpbmRleDo1LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzZdPXtuYW1lOiJsZW5pZW50LXF1b3RlZC12YWx1ZSIsbG93ZXI6ImxlbmllbnQtcXVvdGVkLXZhbHVlIixpbmRleDo2LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzddPXtuYW1lOiJsZW5pZW50LXF1b3RlZC1jaGFyIixsb3dlcjoibGVuaWVudC1xdW90ZWQtY2hhciIsaW5kZXg6Nyxpc0JrcjohMX0sdGhpcy5ydWxlc1s4XT17bmFtZToibGVuaWVudC1jb29raWUtb2N0ZXQiLGxvd2VyOiJsZW5pZW50LWNvb2tpZS1vY3RldCIsaW5kZXg6OCxpc0JrcjohMX0sdGhpcy5ydWxlc1s5XT17bmFtZToiY29va2llLXN0cmluZyIsbG93ZXI6ImNvb2tpZS1zdHJpbmciLGluZGV4OjksaXNCa3I6ITF9LHRoaXMucnVsZXNbMTBdPXtuYW1lOiJjb29raWUtcGFpciIsbG93ZXI6ImNvb2tpZS1wYWlyIixpbmRleDoxMCxpc0JrcjohMX0sdGhpcy5ydWxlc1sxMV09e25hbWU6ImNvb2tpZS1uYW1lIixsb3dlcjoiY29va2llLW5hbWUiLGluZGV4OjExLGlzQmtyOiExfSx0aGlzLnJ1bGVzWzEyXT17bmFtZToiY29va2llLXZhbHVlIixsb3dlcjoiY29va2llLXZhbHVlIixpbmRleDoxMixpc0JrcjohMX0sdGhpcy5ydWxlc1sxM109e25hbWU6ImNvb2tpZS1vY3RldCIsbG93ZXI6ImNvb2tpZS1vY3RldCIsaW5kZXg6MTMsaXNCa3I6ITF9LHRoaXMucnVsZXNbMTRdPXtuYW1lOiJPV1MiLGxvd2VyOiJvd3MiLGluZGV4OjE0LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzE1XT17bmFtZToidG9rZW4iLGxvd2VyOiJ0b2tlbiIsaW5kZXg6MTUsaXNCa3I6ITF9LHRoaXMucnVsZXNbMTZdPXtuYW1lOiJ0Y2hhciIsbG93ZXI6InRjaGFyIixpbmRleDoxNixpc0JrcjohMX0sdGhpcy5ydWxlc1sxN109e25hbWU6IkNIQVIiLGxvd2VyOiJjaGFyIixpbmRleDoxNyxpc0JrcjohMX0sdGhpcy5ydWxlc1sxOF09e25hbWU6IkNUTCIsbG93ZXI6ImN0bCIsaW5kZXg6MTgsaXNCa3I6ITF9LHRoaXMucnVsZXNbMTldPXtuYW1lOiJzZXBhcmF0b3JzIixsb3dlcjoic2VwYXJhdG9ycyIsaW5kZXg6MTksaXNCa3I6ITF9LHRoaXMucnVsZXNbMjBdPXtuYW1lOiJTUCIsbG93ZXI6InNwIixpbmRleDoyMCxpc0JrcjohMX0sdGhpcy5ydWxlc1syMV09e25hbWU6IkhUIixsb3dlcjoiaHQiLGluZGV4OjIxLGlzQmtyOiExfSx0aGlzLnJ1bGVzWzIyXT17bmFtZToiQUxQSEEiLGxvd2VyOiJhbHBoYSIsaW5kZXg6MjIsaXNCa3I6ITF9LHRoaXMucnVsZXNbMjNdPXtuYW1lOiJESUdJVCIsbG93ZXI6ImRpZ2l0IixpbmRleDoyMyxpc0JrcjohMX0sdGhpcy5ydWxlc1syNF09e25hbWU6IkRRVU9URSIsbG93ZXI6ImRxdW90ZSIsaW5kZXg6MjQsaXNCa3I6ITF9LHRoaXMucnVsZXNbMjVdPXtuYW1lOiJXU1AiLGxvd2VyOiJ3c3AiLGluZGV4OjI1LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzI2XT17bmFtZToiSFRBQiIsbG93ZXI6Imh0YWIiLGluZGV4OjI2LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzI3XT17bmFtZToiQ1JMRiIsbG93ZXI6ImNybGYiLGluZGV4OjI3LGlzQmtyOiExfSx0aGlzLnJ1bGVzWzI4XT17bmFtZToiQ1IiLGxvd2VyOiJjciIsaW5kZXg6MjgsaXNCa3I6ITF9LHRoaXMucnVsZXNbMjldPXtuYW1lOiJMRiIsbG93ZXI6ImxmIixpbmRleDoyOSxpc0JrcjohMX0sdGhpcy51ZHRzPVtdLHRoaXMucnVsZXNbMF0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzBdLm9wY29kZXNbMF09e3R5cGU6MixjaGlsZHJlbjpbMSwyXX0sdGhpcy5ydWxlc1swXS5vcGNvZGVzWzFdPXt0eXBlOjQsaW5kZXg6MX0sdGhpcy5ydWxlc1swXS5vcGNvZGVzWzJdPXt0eXBlOjMsbWluOjAsbWF4OjEvMH0sdGhpcy5ydWxlc1swXS5vcGNvZGVzWzNdPXt0eXBlOjIsY2hpbGRyZW46WzQsNSw2XX0sdGhpcy5ydWxlc1swXS5vcGNvZGVzWzRdPXt0eXBlOjcsc3RyaW5nOls1OV19LHRoaXMucnVsZXNbMF0ub3Bjb2Rlc1s1XT17dHlwZTo0LGluZGV4OjE0fSx0aGlzLnJ1bGVzWzBdLm9wY29kZXNbNl09e3R5cGU6NCxpbmRleDoxfSx0aGlzLnJ1bGVzWzFdLm9wY29kZXM9W10sdGhpcy5ydWxlc1sxXS5vcGNvZGVzWzBdPXt0eXBlOjEsY2hpbGRyZW46WzEsMl19LHRoaXMucnVsZXNbMV0ub3Bjb2Rlc1sxXT17dHlwZTo0LGluZGV4OjJ9LHRoaXMucnVsZXNbMV0ub3Bjb2Rlc1syXT17dHlwZTo0LGluZGV4OjN9LHRoaXMucnVsZXNbMl0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzJdLm9wY29kZXNbMF09e3R5cGU6MixjaGlsZHJlbjpbMSwyLDMsNCw1LDYsN119LHRoaXMucnVsZXNbMl0ub3Bjb2Rlc1sxXT17dHlwZTo0LGluZGV4OjE0fSx0aGlzLnJ1bGVzWzJdLm9wY29kZXNbMl09e3R5cGU6NCxpbmRleDo0fSx0aGlzLnJ1bGVzWzJdLm9wY29kZXNbM109e3R5cGU6NCxpbmRleDoxNH0sdGhpcy5ydWxlc1syXS5vcGNvZGVzWzRdPXt0eXBlOjcsc3RyaW5nOls2MV19LHRoaXMucnVsZXNbMl0ub3Bjb2Rlc1s1XT17dHlwZTo0LGluZGV4OjE0fSx0aGlzLnJ1bGVzWzJdLm9wY29kZXNbNl09e3R5cGU6NCxpbmRleDo1fSx0aGlzLnJ1bGVzWzJdLm9wY29kZXNbN109e3R5cGU6NCxpbmRleDoxNH0sdGhpcy5ydWxlc1szXS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbM10ub3Bjb2Rlc1swXT17dHlwZToyLGNoaWxkcmVuOlsxLDIsNF19LHRoaXMucnVsZXNbM10ub3Bjb2Rlc1sxXT17dHlwZTo0LGluZGV4OjE0fSx0aGlzLnJ1bGVzWzNdLm9wY29kZXNbMl09e3R5cGU6MyxtaW46MSxtYXg6MS8wfSx0aGlzLnJ1bGVzWzNdLm9wY29kZXNbM109e3R5cGU6NCxpbmRleDoxNn0sdGhpcy5ydWxlc1szXS5vcGNvZGVzWzRdPXt0eXBlOjQsaW5kZXg6MTR9LHRoaXMucnVsZXNbNF0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzRdLm9wY29kZXNbMF09e3R5cGU6MyxtaW46MSxtYXg6MS8wfSx0aGlzLnJ1bGVzWzRdLm9wY29kZXNbMV09e3R5cGU6MSxjaGlsZHJlbjpbMiwzLDRdfSx0aGlzLnJ1bGVzWzRdLm9wY29kZXNbMl09e3R5cGU6NSxtaW46MzMsbWF4OjU4fSx0aGlzLnJ1bGVzWzRdLm9wY29kZXNbM109e3R5cGU6NixzdHJpbmc6WzYwXX0sdGhpcy5ydWxlc1s0XS5vcGNvZGVzWzRdPXt0eXBlOjUsbWluOjYyLG1heDoxMjZ9LHRoaXMucnVsZXNbNV0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzVdLm9wY29kZXNbMF09e3R5cGU6MSxjaGlsZHJlbjpbMSw2XX0sdGhpcy5ydWxlc1s1XS5vcGNvZGVzWzFdPXt0eXBlOjIsY2hpbGRyZW46WzIsM119LHRoaXMucnVsZXNbNV0ub3Bjb2Rlc1syXT17dHlwZTo0LGluZGV4OjZ9LHRoaXMucnVsZXNbNV0ub3Bjb2Rlc1szXT17dHlwZTozLG1pbjowLG1heDoxfSx0aGlzLnJ1bGVzWzVdLm9wY29kZXNbNF09e3R5cGU6MyxtaW46MCxtYXg6MS8wfSx0aGlzLnJ1bGVzWzVdLm9wY29kZXNbNV09e3R5cGU6NCxpbmRleDo4fSx0aGlzLnJ1bGVzWzVdLm9wY29kZXNbNl09e3R5cGU6MyxtaW46MCxtYXg6MS8wfSx0aGlzLnJ1bGVzWzVdLm9wY29kZXNbN109e3R5cGU6NCxpbmRleDo4fSx0aGlzLnJ1bGVzWzZdLm9wY29kZXM9W10sdGhpcy5ydWxlc1s2XS5vcGNvZGVzWzBdPXt0eXBlOjIsY2hpbGRyZW46WzEsMiw0XX0sdGhpcy5ydWxlc1s2XS5vcGNvZGVzWzFdPXt0eXBlOjQsaW5kZXg6MjR9LHRoaXMucnVsZXNbNl0ub3Bjb2Rlc1syXT17dHlwZTozLG1pbjowLG1heDoxLzB9LHRoaXMucnVsZXNbNl0ub3Bjb2Rlc1szXT17dHlwZTo0LGluZGV4Ojd9LHRoaXMucnVsZXNbNl0ub3Bjb2Rlc1s0XT17dHlwZTo0LGluZGV4OjI0fSx0aGlzLnJ1bGVzWzddLm9wY29kZXM9W10sdGhpcy5ydWxlc1s3XS5vcGNvZGVzWzBdPXt0eXBlOjEsY2hpbGRyZW46WzEsMl19LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1sxXT17dHlwZTo1LG1pbjozMixtYXg6MzN9LHRoaXMucnVsZXNbN10ub3Bjb2Rlc1syXT17dHlwZTo1LG1pbjozNSxtYXg6MTI2fSx0aGlzLnJ1bGVzWzhdLm9wY29kZXM9W10sdGhpcy5ydWxlc1s4XS5vcGNvZGVzWzBdPXt0eXBlOjEsY2hpbGRyZW46WzEsMiwzXX0sdGhpcy5ydWxlc1s4XS5vcGNvZGVzWzFdPXt0eXBlOjUsbWluOjMzLG1heDo0M30sdGhpcy5ydWxlc1s4XS5vcGNvZGVzWzJdPXt0eXBlOjUsbWluOjQ1LG1heDo1OH0sdGhpcy5ydWxlc1s4XS5vcGNvZGVzWzNdPXt0eXBlOjUsbWluOjYwLG1heDoxMjZ9LHRoaXMucnVsZXNbOV0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzldLm9wY29kZXNbMF09e3R5cGU6MixjaGlsZHJlbjpbMSwyXX0sdGhpcy5ydWxlc1s5XS5vcGNvZGVzWzFdPXt0eXBlOjQsaW5kZXg6MTB9LHRoaXMucnVsZXNbOV0ub3Bjb2Rlc1syXT17dHlwZTozLG1pbjowLG1heDoxLzB9LHRoaXMucnVsZXNbOV0ub3Bjb2Rlc1szXT17dHlwZToyLGNoaWxkcmVuOls0LDUsNl19LHRoaXMucnVsZXNbOV0ub3Bjb2Rlc1s0XT17dHlwZTo3LHN0cmluZzpbNTldfSx0aGlzLnJ1bGVzWzldLm9wY29kZXNbNV09e3R5cGU6NCxpbmRleDoyMH0sdGhpcy5ydWxlc1s5XS5vcGNvZGVzWzZdPXt0eXBlOjQsaW5kZXg6MTB9LHRoaXMucnVsZXNbMTBdLm9wY29kZXM9W10sdGhpcy5ydWxlc1sxMF0ub3Bjb2Rlc1swXT17dHlwZToyLGNoaWxkcmVuOlsxLDIsM119LHRoaXMucnVsZXNbMTBdLm9wY29kZXNbMV09e3R5cGU6NCxpbmRleDoxMX0sdGhpcy5ydWxlc1sxMF0ub3Bjb2Rlc1syXT17dHlwZTo3LHN0cmluZzpbNjFdfSx0aGlzLnJ1bGVzWzEwXS5vcGNvZGVzWzNdPXt0eXBlOjQsaW5kZXg6MTJ9LHRoaXMucnVsZXNbMTFdLm9wY29kZXM9W10sdGhpcy5ydWxlc1sxMV0ub3Bjb2Rlc1swXT17dHlwZTo0LGluZGV4OjE1fSx0aGlzLnJ1bGVzWzEyXS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbMTJdLm9wY29kZXNbMF09e3R5cGU6MSxjaGlsZHJlbjpbMSw2XX0sdGhpcy5ydWxlc1sxMl0ub3Bjb2Rlc1sxXT17dHlwZToyLGNoaWxkcmVuOlsyLDMsNV19LHRoaXMucnVsZXNbMTJdLm9wY29kZXNbMl09e3R5cGU6NCxpbmRleDoyNH0sdGhpcy5ydWxlc1sxMl0ub3Bjb2Rlc1szXT17dHlwZTozLG1pbjowLG1heDoxLzB9LHRoaXMucnVsZXNbMTJdLm9wY29kZXNbNF09e3R5cGU6NCxpbmRleDoxM30sdGhpcy5ydWxlc1sxMl0ub3Bjb2Rlc1s1XT17dHlwZTo0LGluZGV4OjI0fSx0aGlzLnJ1bGVzWzEyXS5vcGNvZGVzWzZdPXt0eXBlOjMsbWluOjAsbWF4OjEvMH0sdGhpcy5ydWxlc1sxMl0ub3Bjb2Rlc1s3XT17dHlwZTo0LGluZGV4OjEzfSx0aGlzLnJ1bGVzWzEzXS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbMTNdLm9wY29kZXNbMF09e3R5cGU6MSxjaGlsZHJlbjpbMSwyLDMsNCw1XX0sdGhpcy5ydWxlc1sxM10ub3Bjb2Rlc1sxXT17dHlwZTo2LHN0cmluZzpbMzNdfSx0aGlzLnJ1bGVzWzEzXS5vcGNvZGVzWzJdPXt0eXBlOjUsbWluOjM1LG1heDo0M30sdGhpcy5ydWxlc1sxM10ub3Bjb2Rlc1szXT17dHlwZTo1LG1pbjo0NSxtYXg6NTh9LHRoaXMucnVsZXNbMTNdLm9wY29kZXNbNF09e3R5cGU6NSxtaW46NjAsbWF4OjkxfSx0aGlzLnJ1bGVzWzEzXS5vcGNvZGVzWzVdPXt0eXBlOjUsbWluOjkzLG1heDoxMjZ9LHRoaXMucnVsZXNbMTRdLm9wY29kZXM9W10sdGhpcy5ydWxlc1sxNF0ub3Bjb2Rlc1swXT17dHlwZTozLG1pbjowLG1heDoxLzB9LHRoaXMucnVsZXNbMTRdLm9wY29kZXNbMV09e3R5cGU6MixjaGlsZHJlbjpbMiw0XX0sdGhpcy5ydWxlc1sxNF0ub3Bjb2Rlc1syXT17dHlwZTozLG1pbjowLG1heDoxfSx0aGlzLnJ1bGVzWzE0XS5vcGNvZGVzWzNdPXt0eXBlOjQsaW5kZXg6Mjd9LHRoaXMucnVsZXNbMTRdLm9wY29kZXNbNF09e3R5cGU6NCxpbmRleDoyNX0sdGhpcy5ydWxlc1sxNV0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzE1XS5vcGNvZGVzWzBdPXt0eXBlOjMsbWluOjEsbWF4OjEvMH0sdGhpcy5ydWxlc1sxNV0ub3Bjb2Rlc1sxXT17dHlwZTo0LGluZGV4OjE2fSx0aGlzLnJ1bGVzWzE2XS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbMTZdLm9wY29kZXNbMF09e3R5cGU6MSxjaGlsZHJlbjpbMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTddfSx0aGlzLnJ1bGVzWzE2XS5vcGNvZGVzWzFdPXt0eXBlOjcsc3RyaW5nOlszM119LHRoaXMucnVsZXNbMTZdLm9wY29kZXNbMl09e3R5cGU6NyxzdHJpbmc6WzM1XX0sdGhpcy5ydWxlc1sxNl0ub3Bjb2Rlc1szXT17dHlwZTo3LHN0cmluZzpbMzZdfSx0aGlzLnJ1bGVzWzE2XS5vcGNvZGVzWzRdPXt0eXBlOjcsc3RyaW5nOlszN119LHRoaXMucnVsZXNbMTZdLm9wY29kZXNbNV09e3R5cGU6NyxzdHJpbmc6WzM4XX0sdGhpcy5ydWxlc1sxNl0ub3Bjb2Rlc1s2XT17dHlwZTo3LHN0cmluZzpbMzldfSx0aGlzLnJ1bGVzWzE2XS5vcGNvZGVzWzddPXt0eXBlOjcsc3RyaW5nOls0Ml19LHRoaXMucnVsZXNbMTZdLm9wY29kZXNbOF09e3R5cGU6NyxzdHJpbmc6WzQzXX0sdGhpcy5ydWxlc1sxNl0ub3Bjb2Rlc1s5XT17dHlwZTo3LHN0cmluZzpbNDVdfSx0aGlzLnJ1bGVzWzE2XS5vcGNvZGVzWzEwXT17dHlwZTo3LHN0cmluZzpbNDZdfSx0aGlzLnJ1bGVzWzE2XS5vcGNvZGVzWzExXT17dHlwZTo3LHN0cmluZzpbOTRdfSx0aGlzLnJ1bGVzWzE2XS5vcGNvZGVzWzEyXT17dHlwZTo3LHN0cmluZzpbOTVdfSx0aGlzLnJ1bGVzWzE2XS5vcGNvZGVzWzEzXT17dHlwZTo3LHN0cmluZzpbOTZdfSx0aGlzLnJ1bGVzWzE2XS5vcGNvZGVzWzE0XT17dHlwZTo3LHN0cmluZzpbMTI0XX0sdGhpcy5ydWxlc1sxNl0ub3Bjb2Rlc1sxNV09e3R5cGU6NyxzdHJpbmc6WzEyNl19LHRoaXMucnVsZXNbMTZdLm9wY29kZXNbMTZdPXt0eXBlOjQsaW5kZXg6MjN9LHRoaXMucnVsZXNbMTZdLm9wY29kZXNbMTddPXt0eXBlOjQsaW5kZXg6MjJ9LHRoaXMucnVsZXNbMTddLm9wY29kZXM9W10sdGhpcy5ydWxlc1sxN10ub3Bjb2Rlc1swXT17dHlwZTo1LG1pbjoxLG1heDoxMjd9LHRoaXMucnVsZXNbMThdLm9wY29kZXM9W10sdGhpcy5ydWxlc1sxOF0ub3Bjb2Rlc1swXT17dHlwZToxLGNoaWxkcmVuOlsxLDJdfSx0aGlzLnJ1bGVzWzE4XS5vcGNvZGVzWzFdPXt0eXBlOjUsbWluOjAsbWF4OjMxfSx0aGlzLnJ1bGVzWzE4XS5vcGNvZGVzWzJdPXt0eXBlOjYsc3RyaW5nOlsxMjddfSx0aGlzLnJ1bGVzWzE5XS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbMTldLm9wY29kZXNbMF09e3R5cGU6MSxjaGlsZHJlbjpbMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldfSx0aGlzLnJ1bGVzWzE5XS5vcGNvZGVzWzFdPXt0eXBlOjcsc3RyaW5nOls0MF19LHRoaXMucnVsZXNbMTldLm9wY29kZXNbMl09e3R5cGU6NyxzdHJpbmc6WzQxXX0sdGhpcy5ydWxlc1sxOV0ub3Bjb2Rlc1szXT17dHlwZTo3LHN0cmluZzpbNjBdfSx0aGlzLnJ1bGVzWzE5XS5vcGNvZGVzWzRdPXt0eXBlOjcsc3RyaW5nOls2Ml19LHRoaXMucnVsZXNbMTldLm9wY29kZXNbNV09e3R5cGU6NyxzdHJpbmc6WzY0XX0sdGhpcy5ydWxlc1sxOV0ub3Bjb2Rlc1s2XT17dHlwZTo3LHN0cmluZzpbNDRdfSx0aGlzLnJ1bGVzWzE5XS5vcGNvZGVzWzddPXt0eXBlOjcsc3RyaW5nOls1OV19LHRoaXMucnVsZXNbMTldLm9wY29kZXNbOF09e3R5cGU6NyxzdHJpbmc6WzU4XX0sdGhpcy5ydWxlc1sxOV0ub3Bjb2Rlc1s5XT17dHlwZTo3LHN0cmluZzpbOTJdfSx0aGlzLnJ1bGVzWzE5XS5vcGNvZGVzWzEwXT17dHlwZTo2LHN0cmluZzpbMzRdfSx0aGlzLnJ1bGVzWzE5XS5vcGNvZGVzWzExXT17dHlwZTo3LHN0cmluZzpbNDddfSx0aGlzLnJ1bGVzWzE5XS5vcGNvZGVzWzEyXT17dHlwZTo3LHN0cmluZzpbOTFdfSx0aGlzLnJ1bGVzWzE5XS5vcGNvZGVzWzEzXT17dHlwZTo3LHN0cmluZzpbOTNdfSx0aGlzLnJ1bGVzWzE5XS5vcGNvZGVzWzE0XT17dHlwZTo3LHN0cmluZzpbNjNdfSx0aGlzLnJ1bGVzWzE5XS5vcGNvZGVzWzE1XT17dHlwZTo3LHN0cmluZzpbNjFdfSx0aGlzLnJ1bGVzWzE5XS5vcGNvZGVzWzE2XT17dHlwZTo3LHN0cmluZzpbMTIzXX0sdGhpcy5ydWxlc1sxOV0ub3Bjb2Rlc1sxN109e3R5cGU6NyxzdHJpbmc6WzEyNV19LHRoaXMucnVsZXNbMTldLm9wY29kZXNbMThdPXt0eXBlOjQsaW5kZXg6MjB9LHRoaXMucnVsZXNbMTldLm9wY29kZXNbMTldPXt0eXBlOjQsaW5kZXg6MjF9LHRoaXMucnVsZXNbMjBdLm9wY29kZXM9W10sdGhpcy5ydWxlc1syMF0ub3Bjb2Rlc1swXT17dHlwZTo2LHN0cmluZzpbMzJdfSx0aGlzLnJ1bGVzWzIxXS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbMjFdLm9wY29kZXNbMF09e3R5cGU6NixzdHJpbmc6WzldfSx0aGlzLnJ1bGVzWzIyXS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbMjJdLm9wY29kZXNbMF09e3R5cGU6MSxjaGlsZHJlbjpbMSwyXX0sdGhpcy5ydWxlc1syMl0ub3Bjb2Rlc1sxXT17dHlwZTo1LG1pbjo2NSxtYXg6OTB9LHRoaXMucnVsZXNbMjJdLm9wY29kZXNbMl09e3R5cGU6NSxtaW46OTcsbWF4OjEyMn0sdGhpcy5ydWxlc1syM10ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzIzXS5vcGNvZGVzWzBdPXt0eXBlOjUsbWluOjQ4LG1heDo1N30sdGhpcy5ydWxlc1syNF0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzI0XS5vcGNvZGVzWzBdPXt0eXBlOjYsc3RyaW5nOlszNF19LHRoaXMucnVsZXNbMjVdLm9wY29kZXM9W10sdGhpcy5ydWxlc1syNV0ub3Bjb2Rlc1swXT17dHlwZToxLGNoaWxkcmVuOlsxLDJdfSx0aGlzLnJ1bGVzWzI1XS5vcGNvZGVzWzFdPXt0eXBlOjQsaW5kZXg6MjB9LHRoaXMucnVsZXNbMjVdLm9wY29kZXNbMl09e3R5cGU6NCxpbmRleDoyNn0sdGhpcy5ydWxlc1syNl0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzI2XS5vcGNvZGVzWzBdPXt0eXBlOjYsc3RyaW5nOls5XX0sdGhpcy5ydWxlc1syN10ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzI3XS5vcGNvZGVzWzBdPXt0eXBlOjIsY2hpbGRyZW46WzEsMl19LHRoaXMucnVsZXNbMjddLm9wY29kZXNbMV09e3R5cGU6NCxpbmRleDoyOH0sdGhpcy5ydWxlc1syN10ub3Bjb2Rlc1syXT17dHlwZTo0LGluZGV4OjI5fSx0aGlzLnJ1bGVzWzI4XS5vcGNvZGVzPVtdLHRoaXMucnVsZXNbMjhdLm9wY29kZXNbMF09e3R5cGU6NixzdHJpbmc6WzEzXX0sdGhpcy5ydWxlc1syOV0ub3Bjb2Rlcz1bXSx0aGlzLnJ1bGVzWzI5XS5vcGNvZGVzWzBdPXt0eXBlOjYsc3RyaW5nOlsxMF19LHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24gdG9TdHJpbmcoKXtsZXQgcz0iIjtyZXR1cm4gcys9IjsgTGVuaWVudCB2ZXJzaW9uIG9mIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTQuMi4xXG4iLHMrPSdsZW5pZW50LWNvb2tpZS1zdHJpbmcgICAgICAgID0gbGVuaWVudC1jb29raWUtZW50cnkgKiggIjsiIE9XUyBsZW5pZW50LWNvb2tpZS1lbnRyeSApXG4nLHMrPSJsZW5pZW50LWNvb2tpZS1lbnRyeSAgICAgICAgID0gbGVuaWVudC1jb29raWUtcGFpciAvIGxlbmllbnQtY29va2llLXBhaXItaW52YWxpZFxuIixzKz0nbGVuaWVudC1jb29raWUtcGFpciAgICAgICAgICA9IE9XUyBsZW5pZW50LWNvb2tpZS1uYW1lIE9XUyAiPSIgT1dTIGxlbmllbnQtY29va2llLXZhbHVlIE9XU1xuJyxzKz0nbGVuaWVudC1jb29raWUtcGFpci1pbnZhbGlkICA9IE9XUyAxKnRjaGFyIE9XUyA7IEFsbG93IGZvciBzdGFuZGFsb25lIGVudHJpZXMgbGlrZSAiZml6eiIgdG8gYmUgaWdub3JlZFxuJyxzKz0nbGVuaWVudC1jb29raWUtbmFtZSAgICAgICAgICA9IDEqKCAleDIxLTNBIC8gJXgzQyAvICV4M0UtN0UgKSA7IEFsbG93IGFsbCBwcmludGFibGUgVVMtQVNDSUkgZXhjZXB0ICI9IlxuJyxzKz0ibGVuaWVudC1jb29raWUtdmFsdWUgICAgICAgICA9IGxlbmllbnQtcXVvdGVkLXZhbHVlIFsgKmxlbmllbnQtY29va2llLW9jdGV0IF0gLyAqbGVuaWVudC1jb29raWUtb2N0ZXRcbiIscys9ImxlbmllbnQtcXVvdGVkLXZhbHVlICAgICAgICAgPSBEUVVPVEUgKiggbGVuaWVudC1xdW90ZWQtY2hhciApIERRVU9URVxuIixzKz0ibGVuaWVudC1xdW90ZWQtY2hhciAgICAgICAgICA9ICV4MjAtMjEgLyAleDIzLTdFIDsgQWxsb3cgYWxsIHByaW50YWJsZSBVUy1BU0NJSSBleGNlcHQgRFFVT1RFXG4iLHMrPSJsZW5pZW50LWNvb2tpZS1vY3RldCAgICAgICAgID0gJXgyMS0yQiAvICV4MkQtM0EgLyAleDNDLTdFXG4iLHMrPSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQWxsb3cgYWxsIHByaW50YWJsZSBjaGFyYWN0ZXJzIGV4Y2VwdCBDVExzLCBzZW1pY29sb24gYW5kIFNQXG4iLHMrPSJcbiIscys9IjsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNC4yLjFcbiIscys9J2Nvb2tpZS1zdHJpbmcgICAgID0gY29va2llLXBhaXIgKiggIjsiIFNQIGNvb2tpZS1wYWlyIClcbicscys9IlxuIixzKz0iOyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzYyNjUjc2VjdGlvbi00LjEuMVxuIixzKz0iOyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9lcnJhdGEvZWlkNTUxOFxuIixzKz0nY29va2llLXBhaXIgICAgICAgPSBjb29raWUtbmFtZSAiPSIgY29va2llLXZhbHVlXG4nLHMrPSJjb29raWUtbmFtZSAgICAgICA9IHRva2VuXG4iLHMrPSJjb29raWUtdmFsdWUgICAgICA9ICggRFFVT1RFICpjb29raWUtb2N0ZXQgRFFVT1RFICkgLyAqY29va2llLW9jdGV0XG4iLHMrPSIgICAgICAgICAgICAgICAgICA7IGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL2VycmF0YS9laWQ4MjQyXG4iLHMrPSJjb29raWUtb2N0ZXQgICAgICA9ICV4MjEgLyAleDIzLTJCIC8gJXgyRC0zQSAvICV4M0MtNUIgLyAleDVELTdFXG4iLHMrPSIgICAgICAgICAgICAgICAgICAgICAgIDsgVVMtQVNDSUkgY2hhcmFjdGVycyBleGNsdWRpbmcgQ1RMcyxcbiIscys9IiAgICAgICAgICAgICAgICAgICAgICAgOyB3aGl0ZXNwYWNlLCBEUVVPVEUsIGNvbW1hLCBzZW1pY29sb24sXG4iLHMrPSIgICAgICAgICAgICAgICAgICAgICAgIDsgYW5kIGJhY2tzbGFzaFxuIixzKz0iXG4iLHMrPSI7IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTIuMlxuIixzKz0nT1dTICAgICAgICAgICAgPSAqKCBbIENSTEYgXSBXU1AgKSA7ICJvcHRpb25hbCIgd2hpdGVzcGFjZVxuJyxzKz0iXG4iLHMrPSI7IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjOTExMCNzZWN0aW9uLTUuNi4yXG4iLHMrPSJ0b2tlbiAgICAgICAgICA9IDEqKHRjaGFyKVxuIixzKz0ndGNoYXIgICAgICAgICAgPSAiISIgLyAiIyIgLyAiJCIgLyAiJSIgLyAiJiIgLyAiXCciIC8gIioiXG4nLHMrPScgICAgICAgICAgICAgICAgIC8gIisiIC8gIi0iIC8gIi4iIC8gIl4iIC8gIl8iIC8gImAiIC8gInwiIC8gIn4iXG4nLHMrPSIgICAgICAgICAgICAgICAgIC8gRElHSVQgLyBBTFBIQVxuIixzKz0iICAgICAgICAgICAgICAgICA7IGFueSBWQ0hBUiwgZXhjZXB0IGRlbGltaXRlcnNcbiIscys9IlxuIixzKz0iOyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzI2MTYjc2VjdGlvbi0yLjJcbiIscys9IkNIQVIgICAgICAgICAgID0gJXgwMS03RiA7IGFueSBVUy1BU0NJSSBjaGFyYWN0ZXIgKG9jdGV0cyAwIC0gMTI3KVxuIixzKz0iQ1RMICAgICAgICAgICAgPSAleDAwLTFGIC8gJXg3RiA7IGFueSBVUy1BU0NJSSBjb250cm9sIGNoYXJhY3RlclxuIixzKz0nc2VwYXJhdG9ycyAgICAgPSAiKCIgLyAiKSIgLyAiPCIgLyAiPiIgLyAiQCIgLyAiLCIgLyAiOyIgLyAiOiIgLyAiXFwiIC8gJXgyMiAvICIvIiAvICJbIiAvICJdIiAvICI/IiAvICI9IiAvICJ7IiAvICJ9IiAvIFNQIC8gSFRcbicscys9IlNQICAgICAgICAgICAgID0gJXgyMCA7IFVTLUFTQ0lJIFNQLCBzcGFjZSAoMzIpXG4iLHMrPSJIVCAgICAgICAgICAgICA9ICV4MDkgOyBVUy1BU0NJSSBIVCwgaG9yaXpvbnRhbC10YWIgKDkpXG4iLHMrPSJcbiIscys9IjsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM1MjM0I2FwcGVuZGl4LUIuMVxuIixzKz0iQUxQSEEgICAgICAgICAgPSAgJXg0MS01QSAvICV4NjEtN0EgOyBBLVogLyBhLXpcbiIscys9IkRJR0lUICAgICAgICAgID0gICV4MzAtMzkgOyAwLTlcbiIscys9J0RRVU9URSAgICAgICAgID0gICV4MjIgOyAiIChEb3VibGUgUXVvdGUpXG4nLHMrPSJXU1AgICAgICAgICAgICA9ICBTUCAvIEhUQUIgOyB3aGl0ZSBzcGFjZVxuIixzKz0iSFRBQiAgICAgICAgICAgPSAgJXgwOSA7IGhvcml6b250YWwgdGFiXG4iLHMrPSJDUkxGICAgICAgICAgICA9ICBDUiBMRiA7IEludGVybmV0IHN0YW5kYXJkIG5ld2xpbmVcbiIscys9IkNSICAgICAgICAgICAgID0gICV4MEQgOyBjYXJyaWFnZSByZXR1cm5cbiIscys9IkxGICAgICAgICAgICAgID0gICV4MEEgOyBsaW5lZmVlZFxuIiwnOyBMZW5pZW50IHZlcnNpb24gb2YgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2MjY1I3NlY3Rpb24tNC4yLjFcbmxlbmllbnQtY29va2llLXN0cmluZyAgICAgICAgPSBsZW5pZW50LWNvb2tpZS1lbnRyeSAqKCAiOyIgT1dTIGxlbmllbnQtY29va2llLWVudHJ5IClcbmxlbmllbnQtY29va2llLWVudHJ5ICAgICAgICAgPSBsZW5pZW50LWNvb2tpZS1wYWlyIC8gbGVuaWVudC1jb29raWUtcGFpci1pbnZhbGlkXG5sZW5pZW50LWNvb2tpZS1wYWlyICAgICAgICAgID0gT1dTIGxlbmllbnQtY29va2llLW5hbWUgT1dTICI9IiBPV1MgbGVuaWVudC1jb29raWUtdmFsdWUgT1dTXG5sZW5pZW50LWNvb2tpZS1wYWlyLWludmFsaWQgID0gT1dTIDEqdGNoYXIgT1dTIDsgQWxsb3cgZm9yIHN0YW5kYWxvbmUgZW50cmllcyBsaWtlICJmaXp6IiB0byBiZSBpZ25vcmVkXG5sZW5pZW50LWNvb2tpZS1uYW1lICAgICAgICAgID0gMSooICV4MjEtM0EgLyAleDNDIC8gJXgzRS03RSApIDsgQWxsb3cgYWxsIHByaW50YWJsZSBVUy1BU0NJSSBleGNlcHQgIj0iXG5sZW5pZW50LWNvb2tpZS12YWx1ZSAgICAgICAgID0gbGVuaWVudC1xdW90ZWQtdmFsdWUgWyAqbGVuaWVudC1jb29raWUtb2N0ZXQgXSAvICpsZW5pZW50LWNvb2tpZS1vY3RldFxubGVuaWVudC1xdW90ZWQtdmFsdWUgICAgICAgICA9IERRVU9URSAqKCBsZW5pZW50LXF1b3RlZC1jaGFyICkgRFFVT1RFXG5sZW5pZW50LXF1b3RlZC1jaGFyICAgICAgICAgID0gJXgyMC0yMSAvICV4MjMtN0UgOyBBbGxvdyBhbGwgcHJpbnRhYmxlIFVTLUFTQ0lJIGV4Y2VwdCBEUVVPVEVcbmxlbmllbnQtY29va2llLW9jdGV0ICAgICAgICAgPSAleDIxLTJCIC8gJXgyRC0zQSAvICV4M0MtN0VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBBbGxvdyBhbGwgcHJpbnRhYmxlIGNoYXJhY3RlcnMgZXhjZXB0IENUTHMsIHNlbWljb2xvbiBhbmQgU1BcblxuOyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzYyNjUjc2VjdGlvbi00LjIuMVxuY29va2llLXN0cmluZyAgICAgPSBjb29raWUtcGFpciAqKCAiOyIgU1AgY29va2llLXBhaXIgKVxuXG47IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjI2NSNzZWN0aW9uLTQuMS4xXG47IGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL2VycmF0YS9laWQ1NTE4XG5jb29raWUtcGFpciAgICAgICA9IGNvb2tpZS1uYW1lICI9IiBjb29raWUtdmFsdWVcbmNvb2tpZS1uYW1lICAgICAgID0gdG9rZW5cbmNvb2tpZS12YWx1ZSAgICAgID0gKCBEUVVPVEUgKmNvb2tpZS1vY3RldCBEUVVPVEUgKSAvICpjb29raWUtb2N0ZXRcbiAgICAgICAgICAgICAgICAgIDsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvZXJyYXRhL2VpZDgyNDJcbmNvb2tpZS1vY3RldCAgICAgID0gJXgyMSAvICV4MjMtMkIgLyAleDJELTNBIC8gJXgzQy01QiAvICV4NUQtN0VcbiAgICAgICAgICAgICAgICAgICAgICAgOyBVUy1BU0NJSSBjaGFyYWN0ZXJzIGV4Y2x1ZGluZyBDVExzLFxuICAgICAgICAgICAgICAgICAgICAgICA7IHdoaXRlc3BhY2UsIERRVU9URSwgY29tbWEsIHNlbWljb2xvbixcbiAgICAgICAgICAgICAgICAgICAgICAgOyBhbmQgYmFja3NsYXNoXG5cbjsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2MjY1I3NlY3Rpb24tMi4yXG5PV1MgICAgICAgICAgICA9ICooIFsgQ1JMRiBdIFdTUCApIDsgIm9wdGlvbmFsIiB3aGl0ZXNwYWNlXG5cbjsgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM5MTEwI3NlY3Rpb24tNS42LjJcbnRva2VuICAgICAgICAgID0gMSoodGNoYXIpXG50Y2hhciAgICAgICAgICA9ICIhIiAvICIjIiAvICIkIiAvICIlIiAvICImIiAvICJcJyIgLyAiKiJcbiAgICAgICAgICAgICAgICAgLyAiKyIgLyAiLSIgLyAiLiIgLyAiXiIgLyAiXyIgLyAiYCIgLyAifCIgLyAifiJcbiAgICAgICAgICAgICAgICAgLyBESUdJVCAvIEFMUEhBXG4gICAgICAgICAgICAgICAgIDsgYW55IFZDSEFSLCBleGNlcHQgZGVsaW1pdGVyc1xuXG47IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMjYxNiNzZWN0aW9uLTIuMlxuQ0hBUiAgICAgICAgICAgPSAleDAxLTdGIDsgYW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpXG5DVEwgICAgICAgICAgICA9ICV4MDAtMUYgLyAleDdGIDsgYW55IFVTLUFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVyXG5zZXBhcmF0b3JzICAgICA9ICIoIiAvICIpIiAvICI8IiAvICI+IiAvICJAIiAvICIsIiAvICI7IiAvICI6IiAvICJcXCIgLyAleDIyIC8gIi8iIC8gIlsiIC8gIl0iIC8gIj8iIC8gIj0iIC8gInsiIC8gIn0iIC8gU1AgLyBIVFxuU1AgICAgICAgICAgICAgPSAleDIwIDsgVVMtQVNDSUkgU1AsIHNwYWNlICgzMilcbkhUICAgICAgICAgICAgID0gJXgwOSA7IFVTLUFTQ0lJIEhULCBob3Jpem9udGFsLXRhYiAoOSlcblxuOyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzUyMzQjYXBwZW5kaXgtQi4xXG5BTFBIQSAgICAgICAgICA9ICAleDQxLTVBIC8gJXg2MS03QSA7IEEtWiAvIGEtelxuRElHSVQgICAgICAgICAgPSAgJXgzMC0zOSA7IDAtOVxuRFFVT1RFICAgICAgICAgPSAgJXgyMiA7ICIgKERvdWJsZSBRdW90ZSlcbldTUCAgICAgICAgICAgID0gIFNQIC8gSFRBQiA7IHdoaXRlIHNwYWNlXG5IVEFCICAgICAgICAgICA9ICAleDA5IDsgaG9yaXpvbnRhbCB0YWJcbkNSTEYgICAgICAgICAgID0gIENSIExGIDsgSW50ZXJuZXQgc3RhbmRhcmQgbmV3bGluZVxuQ1IgICAgICAgICAgICAgPSAgJXgwRCA7IGNhcnJpYWdlIHJldHVyblxuTEYgICAgICAgICAgICAgPSAgJXgwQSA7IGxpbmVmZWVkXG4nfX1uZXcgZ3JhbW1hcl9ncmFtbWFyO2NvbnN0IHBlcmNlbnRFbmNvZGVDaGFyPXM9PntpZigic3RyaW5nIiE9dHlwZW9mIHN8fDEhPT1bLi4uc10ubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIklucHV0IG11c3QgYmUgYSBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZy4iKTtjb25zdCBvPXMuY29kZVBvaW50QXQoMCk7cmV0dXJuIG88PTEyNz9gJSR7by50b1N0cmluZygxNikudG9VcHBlckNhc2UoKS5wYWRTdGFydCgyLCIwIil9YDplbmNvZGVVUklDb21wb25lbnQocyl9LHV0aWxzX2lzUXVvdGVkPXM9PnMubGVuZ3RoPj0yJiZzLnN0YXJ0c1dpdGgoJyInKSYmcy5lbmRzV2l0aCgnIicpLHVucXVvdGU9cz0+dXRpbHNfaXNRdW90ZWQocyk/cy5zbGljZSgxLC0xKTpzLHF1b3RlPXM9PmAiJHtzfSJgLHV0aWxzX2lkZW50aXR5PXM9PnMsTHg9bmV3IEVwLEZ4PW5ldyBncmFtbWFyX2dyYW1tYXIsdGVzdF9jb29raWVfdmFsdWU9KHMse3N0cmljdDpvPSEwLHF1b3RlZDppPW51bGx9PXt9KT0+e3RyeXtjb25zdCBhPW8/ImNvb2tpZS12YWx1ZSI6ImxlbmllbnQtY29va2llLXZhbHVlIix1PUx4LnBhcnNlKEZ4LGEscyk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgaT91LnN1Y2Nlc3MmJmk9PT11dGlsc19pc1F1b3RlZChzKTp1LnN1Y2Nlc3N9Y2F0Y2h7cmV0dXJuITF9fSxiYXNlNjRfYnJvd3Nlcj1zPT57Y29uc3Qgbz0obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUocykucmVkdWNlKCgocyxvKT0+cytTdHJpbmcuZnJvbUNoYXJDb2RlKG8pKSwiIik7cmV0dXJuIGJ0b2Eobyl9LGNvb2tpZV92YWx1ZV9zdHJpY3RfYmFzZTY0PShzLG89YmFzZTY0X2Jyb3dzZXIpPT57Y29uc3QgaT1TdHJpbmcocyk7aWYodGVzdF9jb29raWVfdmFsdWUoaSkpcmV0dXJuIGk7Y29uc3QgYT11dGlsc19pc1F1b3RlZChpKSx1PW8oYT91bnF1b3RlKGkpOmkpO3JldHVybiBhP3F1b3RlKHUpOnV9LGJhc2U2NHVybF9icm93c2VyPXM9PihzPT5zLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIikucmVwbGFjZSgvPSskL2csIiIpKShiYXNlNjRfYnJvd3NlcihzKSksY29va2llX3ZhbHVlX3N0cmljdF9iYXNlNjR1cmw9cz0+Y29va2llX3ZhbHVlX3N0cmljdF9iYXNlNjQocyxiYXNlNjR1cmxfYnJvd3NlciksQng9bmV3IEVwLCR4PW5ldyBncmFtbWFyX2dyYW1tYXIsdGVzdF9jb29raWVfbmFtZT0ocyx7c3RyaWN0Om89ITB9PXt9KT0+e3RyeXtjb25zdCBpPW8/ImNvb2tpZS1uYW1lIjoibGVuaWVudC1jb29raWUtbmFtZSI7cmV0dXJuIEJ4LnBhcnNlKCR4LGkscykuc3VjY2Vzc31jYXRjaHtyZXR1cm4hMX19LGNvb2tpZV9uYW1lX3N0cmljdD1zPT57aWYoIXRlc3RfY29va2llX25hbWUocykpdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBjb29raWUgbmFtZTogJHtzfWApfSxjb29raWVfdmFsdWVfc3RyaWN0PXM9PntpZighdGVzdF9jb29raWVfdmFsdWUocykpdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBjb29raWUgdmFsdWU6ICR7c31gKX0scXg9e2VuY29kZXJzOntuYW1lOnV0aWxzX2lkZW50aXR5LHZhbHVlOmNvb2tpZV92YWx1ZV9zdHJpY3RfYmFzZTY0dXJsfSx2YWxpZGF0b3JzOntuYW1lOmNvb2tpZV9uYW1lX3N0cmljdCx2YWx1ZTpjb29raWVfdmFsdWVfc3RyaWN0fX0sc2V0X2Nvb2tpZV9zZXJpYWxpemU9KHMsbyxpPXt9KT0+e2NvbnN0IGE9ey4uLnF4LC4uLmksZW5jb2RlcnM6ey4uLnF4LmVuY29kZXJzLC4uLmkuZW5jb2RlcnN9LHZhbGlkYXRvcnM6ey4uLnF4LnZhbGlkYXRvcnMsLi4uaS52YWxpZGF0b3JzfX0sdT1hLmVuY29kZXJzLm5hbWUocyksXz1hLmVuY29kZXJzLnZhbHVlKG8pO3JldHVybiBhLnZhbGlkYXRvcnMubmFtZSh1KSxhLnZhbGlkYXRvcnMudmFsdWUoXyksYCR7dX09JHtffWB9LGNvb2tpZV9zZXJpYWxpemU9KHMsbz17fSk9PihBcnJheS5pc0FycmF5KHMpP3M6Im9iamVjdCI9PXR5cGVvZiBzJiZudWxsIT09cz9PYmplY3QuZW50cmllcyhzKTpbXSkubWFwKCgoW3MsaV0pPT5zZXRfY29va2llX3NlcmlhbGl6ZShzLGksbykpKS5qb2luKCI7ICIpO2NvbnN0IFV4PW5ldyBFcCxWeD1uZXcgZ3JhbW1hcl9ncmFtbWFyLGNvb2tpZV92YWx1ZV9zdHJpY3RfcGVyY2VudD1zPT57Y29uc3Qgbz1TdHJpbmcocyk7aWYodGVzdF9jb29raWVfdmFsdWUobykpcmV0dXJuIG87Y29uc3QgaT11dGlsc19pc1F1b3RlZChvKSxhPWk/dW5xdW90ZShvKTpvO2xldCB1PSIiO2Zvcihjb25zdCBzIG9mIGEpdSs9VXgucGFyc2UoVngsImNvb2tpZS1vY3RldCIscykuc3VjY2Vzcz9zOnBlcmNlbnRFbmNvZGVDaGFyKHMpO3JldHVybiBpP3F1b3RlKHUpOnV9O25ldyBFcCxuZXcgZ3JhbW1hcl9ncmFtbWFyO2NvbnN0IGNvb2tpZV9uYW1lX2xlbmllbnQ9cz0+e2lmKCF0ZXN0X2Nvb2tpZV9uYW1lKHMse3N0cmljdDohMX0pKXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgY29va2llIG5hbWU6ICR7c31gKX07Y29uc3QgdmFsdWVQZXJjZW50RW5jb2Rlcj1zPT5jb29raWVfdmFsdWVfc3RyaWN0X3BlcmNlbnQocykucmVwbGFjZSgvWz0mXS9ndSwocz0+Ij0iPT09cz8iJTNEIjoiJTI2IikpLGhlbHBlcnNfY29va2llX3NlcmlhbGl6ZT0ocyxvPXt9KT0+Y29va2llX3NlcmlhbGl6ZShzLGlwKHtlbmNvZGVyczp7bmFtZTp1dGlsc19pZGVudGl0eSx2YWx1ZTp2YWx1ZVBlcmNlbnRFbmNvZGVyfSx2YWxpZGF0b3JzOntuYW1lOmNvb2tpZV9uYW1lX2xlbmllbnQsdmFsdWU6Y29va2llX3ZhbHVlX3N0cmljdH19LG8pKTtmdW5jdGlvbiBwYXJhbWV0ZXJfYnVpbGRlcnNfcGF0aCh7cmVxOnMsdmFsdWU6byxwYXJhbWV0ZXI6aSxiYXNlVVJMOmF9KXtjb25zdHtuYW1lOnUsc3R5bGU6XyxleHBsb2RlOncsY29udGVudDp4fT1pO2lmKHZvaWQgMD09PW8pcmV0dXJuO2NvbnN0IEM9cy51cmwucmVwbGFjZShhLCIiKTtsZXQgajtpZih4KXtjb25zdCBzPU9iamVjdC5rZXlzKHgpWzBdO2o9ZXNfcmVzb2x2ZShDLHtbdV06b30se2VuY29kZXI6bz0+ZW5jb2RlQ2hhcmFjdGVycyhzZXJpYWxpemUobyxzKSl9KX1lbHNlIGo9ZXNfcmVzb2x2ZShDLHtbdV06b30se2VuY29kZXI6cz0+c3R5bGl6ZSh7a2V5OmkubmFtZSx2YWx1ZTpzLHN0eWxlOl98fCJzaW1wbGUiLGV4cGxvZGU6bnVsbCE9dyYmdyxlc2NhcGU6InJlc2VydmVkIn0pfSk7cy51cmw9YStqfWZ1bmN0aW9uIHF1ZXJ5KHtyZXE6cyx2YWx1ZTpvLHBhcmFtZXRlcjppfSl7aWYocy5xdWVyeT1zLnF1ZXJ5fHx7fSx2b2lkIDAhPT1vJiZpLmNvbnRlbnQpe2NvbnN0IGE9c2VyaWFsaXplKG8sT2JqZWN0LmtleXMoaS5jb250ZW50KVswXSk7aWYoYSlzLnF1ZXJ5W2kubmFtZV09YTtlbHNlIGlmKGkuYWxsb3dFbXB0eVZhbHVlKXtjb25zdCBvPWkubmFtZTtzLnF1ZXJ5W29dPXMucXVlcnlbb118fHt9LHMucXVlcnlbb10uYWxsb3dFbXB0eVZhbHVlPSEwfX1lbHNlIGlmKCExPT09byYmKG89ImZhbHNlIiksMD09PW8mJihvPSIwIiksbyl7Y29uc3R7c3R5bGU6YSxleHBsb2RlOnUsYWxsb3dSZXNlcnZlZDpffT1pO3MucXVlcnlbaS5uYW1lXT17dmFsdWU6byxzZXJpYWxpemF0aW9uT3B0aW9uOntzdHlsZTphLGV4cGxvZGU6dSxhbGxvd1Jlc2VydmVkOl99fX1lbHNlIGlmKGkuYWxsb3dFbXB0eVZhbHVlJiZ2b2lkIDAhPT1vKXtjb25zdCBvPWkubmFtZTtzLnF1ZXJ5W29dPXMucXVlcnlbb118fHt9LHMucXVlcnlbb10uYWxsb3dFbXB0eVZhbHVlPSEwfX1jb25zdCB6eD1bImFjY2VwdCIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LXR5cGUiXTtmdW5jdGlvbiBwYXJhbWV0ZXJfYnVpbGRlcnNfaGVhZGVyKHtyZXE6cyxwYXJhbWV0ZXI6byx2YWx1ZTppfSl7aWYocy5oZWFkZXJzPXMuaGVhZGVyc3x8e30sISh6eC5pbmRleE9mKG8ubmFtZS50b0xvd2VyQ2FzZSgpKT4tMSkpaWYodm9pZCAwIT09aSYmby5jb250ZW50KXtjb25zdCBhPU9iamVjdC5rZXlzKG8uY29udGVudClbMF07cy5oZWFkZXJzW28ubmFtZV09c2VyaWFsaXplKGksYSl9ZWxzZSB2b2lkIDA9PT1pfHxBcnJheS5pc0FycmF5KGkpJiYwPT09aS5sZW5ndGh8fChzLmhlYWRlcnNbby5uYW1lXT1zdHlsaXplKHtrZXk6by5uYW1lLHZhbHVlOmksc3R5bGU6by5zdHlsZXx8InNpbXBsZSIsZXhwbG9kZTp2b2lkIDAhPT1vLmV4cGxvZGUmJm8uZXhwbG9kZSxlc2NhcGU6ITF9KSl9ZnVuY3Rpb24gY29va2llKHtyZXE6cyxwYXJhbWV0ZXI6byx2YWx1ZTppfSl7Y29uc3R7bmFtZTphfT1vO2lmKHMuaGVhZGVycz1zLmhlYWRlcnN8fHt9LHZvaWQgMCE9PWkmJm8uY29udGVudCl7Y29uc3QgdT1zZXJpYWxpemUoaSxPYmplY3Qua2V5cyhvLmNvbnRlbnQpWzBdKTtzLmhlYWRlcnMuQ29va2llPWhlbHBlcnNfY29va2llX3NlcmlhbGl6ZSh7W2FdOnV9KX1lbHNlIGlmKHZvaWQgMCE9PWkmJighQXJyYXkuaXNBcnJheShpKXx8MCE9PWkubGVuZ3RoKSl7dmFyIHU7Y29uc3QgXz1zdHlsaXplKHtrZXk6by5uYW1lLHZhbHVlOmksZXNjYXBlOiExLHN0eWxlOm8uc3R5bGV8fCJmb3JtIixleHBsb2RlOm51bGwhPT0odT1vLmV4cGxvZGUpJiZ2b2lkIDAhPT11JiZ1fSksdz1BcnJheS5pc0FycmF5KGkpJiZvLmV4cGxvZGU/YCR7YX09JHtffWA6XztzLmhlYWRlcnMuQ29va2llPWhlbHBlcnNfY29va2llX3NlcmlhbGl6ZSh7W2FdOnd9KX19Y29uc3QgV3g9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6d2luZG93LHtidG9hOkp4fT1XeCxIeD1KeDtmdW5jdGlvbiBidWlsZFJlcXVlc3QocyxvKXtjb25zdHtvcGVyYXRpb246aSxyZXF1ZXN0Qm9keTphLHNlY3VyaXRpZXM6dSxzcGVjOl8sYXR0YWNoQ29udGVudFR5cGVGb3JFbXB0eVBheWxvYWQ6d309cztsZXR7cmVxdWVzdENvbnRlbnRUeXBlOnh9PXM7bz1mdW5jdGlvbiBhcHBseVNlY3VyaXRpZXMoe3JlcXVlc3Q6cyxzZWN1cml0aWVzOm89e30sb3BlcmF0aW9uOmk9e30sc3BlYzphfSl7dmFyIHU7Y29uc3QgXz17Li4uc30se2F1dGhvcml6ZWQ6dz17fX09byx4PWkuc2VjdXJpdHl8fGEuc2VjdXJpdHl8fFtdLEM9dyYmISFPYmplY3Qua2V5cyh3KS5sZW5ndGgsaj0obnVsbD09YXx8bnVsbD09PSh1PWEuY29tcG9uZW50cyl8fHZvaWQgMD09PXU/dm9pZCAwOnUuc2VjdXJpdHlTY2hlbWVzKXx8e307aWYoXy5oZWFkZXJzPV8uaGVhZGVyc3x8e30sXy5xdWVyeT1fLnF1ZXJ5fHx7fSwhT2JqZWN0LmtleXMobykubGVuZ3RofHwhQ3x8IXh8fEFycmF5LmlzQXJyYXkoaS5zZWN1cml0eSkmJiFpLnNlY3VyaXR5Lmxlbmd0aClyZXR1cm4gcztyZXR1cm4geC5mb3JFYWNoKChzPT57T2JqZWN0LmtleXMocykuZm9yRWFjaCgocz0+e2NvbnN0IG89d1tzXSxpPWpbc107aWYoIW8pcmV0dXJuO2NvbnN0IGE9by52YWx1ZXx8byx7dHlwZTp1fT1pO2lmKG8paWYoImFwaUtleSI9PT11KSJxdWVyeSI9PT1pLmluJiYoXy5xdWVyeVtpLm5hbWVdPWEpLCJoZWFkZXIiPT09aS5pbiYmKF8uaGVhZGVyc1tpLm5hbWVdPWEpLCJjb29raWUiPT09aS5pbiYmKF8uY29va2llc1tpLm5hbWVdPWEpO2Vsc2UgaWYoImh0dHAiPT09dSl7aWYoL15iYXNpYyQvaS50ZXN0KGkuc2NoZW1lKSl7Y29uc3Qgcz1hLnVzZXJuYW1lfHwiIixvPWEucGFzc3dvcmR8fCIiLGk9SHgoYCR7c306JHtvfWApO18uaGVhZGVycy5BdXRob3JpemF0aW9uPWBCYXNpYyAke2l9YH0vXmJlYXJlciQvaS50ZXN0KGkuc2NoZW1lKSYmKF8uaGVhZGVycy5BdXRob3JpemF0aW9uPWBCZWFyZXIgJHthfWApfWVsc2UgaWYoIm9hdXRoMiI9PT11fHwib3BlbklkQ29ubmVjdCI9PT11KXtjb25zdCBzPW8udG9rZW58fHt9LGE9c1tpWyJ4LXRva2VuTmFtZSJdfHwiYWNjZXNzX3Rva2VuIl07bGV0IHU9cy50b2tlbl90eXBlO3UmJiJiZWFyZXIiIT09dS50b0xvd2VyQ2FzZSgpfHwodT0iQmVhcmVyIiksXy5oZWFkZXJzLkF1dGhvcml6YXRpb249YCR7dX0gJHthfWB9fSkpfSkpLF99KHtyZXF1ZXN0Om8sc2VjdXJpdGllczp1LG9wZXJhdGlvbjppLHNwZWM6X30pO2NvbnN0IEM9aS5yZXF1ZXN0Qm9keXx8e30saj1PYmplY3Qua2V5cyhDLmNvbnRlbnR8fHt9KSxMPXgmJmouaW5kZXhPZih4KT4tMTtpZihhfHx3KXtpZih4JiZMKW8uaGVhZGVyc1siQ29udGVudC1UeXBlIl09eDtlbHNlIGlmKCF4KXtjb25zdCBzPWpbMF07cyYmKG8uaGVhZGVyc1siQ29udGVudC1UeXBlIl09cyx4PXMpfX1lbHNlIHgmJkwmJihvLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPXgpO2lmKCFzLnJlc3BvbnNlQ29udGVudFR5cGUmJmkucmVzcG9uc2VzKXtjb25zdCBzPU9iamVjdC5lbnRyaWVzKGkucmVzcG9uc2VzKS5maWx0ZXIoKChbcyxvXSk9Pntjb25zdCBpPXBhcnNlSW50KHMsMTApO3JldHVybiBpPj0yMDAmJmk8MzAwJiZwdShvLmNvbnRlbnQpfSkpLnJlZHVjZSgoKHMsWyxvXSk9PnMuY29uY2F0KE9iamVjdC5rZXlzKG8uY29udGVudCkpKSxbXSk7cy5sZW5ndGg+MCYmKG8uaGVhZGVycy5hY2NlcHQ9cy5qb2luKCIsICIpKX1pZihhKWlmKHgpe2lmKGouaW5kZXhPZih4KT4tMSlpZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIj09PXh8fCJtdWx0aXBhcnQvZm9ybS1kYXRhIj09PXgpaWYoIm9iamVjdCI9PXR5cGVvZiBhKXt2YXIgQiwkO2NvbnN0IHM9bnVsbCE9PShCPW51bGw9PT0oJD1DLmNvbnRlbnRbeF0pfHx2b2lkIDA9PT0kP3ZvaWQgMDokLmVuY29kaW5nKSYmdm9pZCAwIT09Qj9COnt9O28uZm9ybT17fSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKChpPT57bGV0IHU7dHJ5e3U9SlNPTi5wYXJzZShhW2ldKX1jYXRjaHt1PWFbaV19by5mb3JtW2ldPXt2YWx1ZTp1LGVuY29kaW5nOnNbaV18fHt9fX0pKX1lbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgYSl7dmFyIFUsVjtjb25zdCBzPW51bGwhPT0oVT1udWxsPT09KFY9Qy5jb250ZW50W3hdKXx8dm9pZCAwPT09Vj92b2lkIDA6Vi5lbmNvZGluZykmJnZvaWQgMCE9PVU/VTp7fTt0cnl7by5mb3JtPXt9O2NvbnN0IGk9SlNPTi5wYXJzZShhKTtPYmplY3QuZW50cmllcyhpKS5mb3JFYWNoKCgoW2ksYV0pPT57by5mb3JtW2ldPXt2YWx1ZTphLGVuY29kaW5nOnNbaV18fHt9fX0pKX1jYXRjaHtvLmZvcm09YX19ZWxzZSBvLmZvcm09YTtlbHNlIG8uYm9keT1hfWVsc2Ugby5ib2R5PWE7cmV0dXJuIG99ZnVuY3Rpb24gYnVpbGRfcmVxdWVzdF9idWlsZFJlcXVlc3QocyxvKXtjb25zdHtzcGVjOmksb3BlcmF0aW9uOmEsc2VjdXJpdGllczp1LHJlcXVlc3RDb250ZW50VHlwZTpfLHJlc3BvbnNlQ29udGVudFR5cGU6dyxhdHRhY2hDb250ZW50VHlwZUZvckVtcHR5UGF5bG9hZDp4fT1zO2lmKG89ZnVuY3Rpb24gYnVpbGRfcmVxdWVzdF9hcHBseVNlY3VyaXRpZXMoe3JlcXVlc3Q6cyxzZWN1cml0aWVzOm89e30sb3BlcmF0aW9uOmk9e30sc3BlYzphfSl7Y29uc3QgdT17Li4uc30se2F1dGhvcml6ZWQ6Xz17fSxzcGVjU2VjdXJpdHk6dz1bXX09byx4PWkuc2VjdXJpdHl8fHcsQz1fJiYhIU9iamVjdC5rZXlzKF8pLmxlbmd0aCxqPWEuc2VjdXJpdHlEZWZpbml0aW9ucztpZih1LmhlYWRlcnM9dS5oZWFkZXJzfHx7fSx1LnF1ZXJ5PXUucXVlcnl8fHt9LCFPYmplY3Qua2V5cyhvKS5sZW5ndGh8fCFDfHwheHx8QXJyYXkuaXNBcnJheShpLnNlY3VyaXR5KSYmIWkuc2VjdXJpdHkubGVuZ3RoKXJldHVybiBzO3JldHVybiB4LmZvckVhY2goKHM9PntPYmplY3Qua2V5cyhzKS5mb3JFYWNoKChzPT57Y29uc3Qgbz1fW3NdO2lmKCFvKXJldHVybjtjb25zdHt0b2tlbjppfT1vLGE9by52YWx1ZXx8byx3PWpbc10se3R5cGU6eH09dyxDPXdbIngtdG9rZW5OYW1lIl18fCJhY2Nlc3NfdG9rZW4iLEw9aSYmaVtDXTtsZXQgQj1pJiZpLnRva2VuX3R5cGU7aWYobylpZigiYXBpS2V5Ij09PXgpe2NvbnN0IHM9InF1ZXJ5Ij09PXcuaW4/InF1ZXJ5IjoiaGVhZGVycyI7dVtzXT11W3NdfHx7fSx1W3NdW3cubmFtZV09YX1lbHNlIGlmKCJiYXNpYyI9PT14KWlmKGEuaGVhZGVyKXUuaGVhZGVycy5hdXRob3JpemF0aW9uPWEuaGVhZGVyO2Vsc2V7Y29uc3Qgcz1hLnVzZXJuYW1lfHwiIixvPWEucGFzc3dvcmR8fCIiO2EuYmFzZTY0PUh4KGAke3N9OiR7b31gKSx1LmhlYWRlcnMuYXV0aG9yaXphdGlvbj1gQmFzaWMgJHthLmJhc2U2NH1gfWVsc2Uib2F1dGgyIj09PXgmJkwmJihCPUImJiJiZWFyZXIiIT09Qi50b0xvd2VyQ2FzZSgpP0I6IkJlYXJlciIsdS5oZWFkZXJzLmF1dGhvcml6YXRpb249YCR7Qn0gJHtMfWApfSkpfSkpLHV9KHtyZXF1ZXN0Om8sc2VjdXJpdGllczp1LG9wZXJhdGlvbjphLHNwZWM6aX0pLG8uYm9keXx8by5mb3JtfHx4KV8/by5oZWFkZXJzWyJDb250ZW50LVR5cGUiXT1fOkFycmF5LmlzQXJyYXkoYS5jb25zdW1lcyk/W28uaGVhZGVyc1siQ29udGVudC1UeXBlIl1dPWEuY29uc3VtZXM6QXJyYXkuaXNBcnJheShpLmNvbnN1bWVzKT9bby5oZWFkZXJzWyJDb250ZW50LVR5cGUiXV09aS5jb25zdW1lczphLnBhcmFtZXRlcnMmJmEucGFyYW1ldGVycy5maWx0ZXIoKHM9PiJmaWxlIj09PXMudHlwZSkpLmxlbmd0aD9vLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPSJtdWx0aXBhcnQvZm9ybS1kYXRhIjphLnBhcmFtZXRlcnMmJmEucGFyYW1ldGVycy5maWx0ZXIoKHM9PiJmb3JtRGF0YSI9PT1zLmluKSkubGVuZ3RoJiYoby5oZWFkZXJzWyJDb250ZW50LVR5cGUiXT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7ZWxzZSBpZihfKXtjb25zdCBzPWEucGFyYW1ldGVycyYmYS5wYXJhbWV0ZXJzLmZpbHRlcigocz0+ImJvZHkiPT09cy5pbikpLmxlbmd0aD4wLGk9YS5wYXJhbWV0ZXJzJiZhLnBhcmFtZXRlcnMuZmlsdGVyKChzPT4iZm9ybURhdGEiPT09cy5pbikpLmxlbmd0aD4wOyhzfHxpKSYmKG8uaGVhZGVyc1siQ29udGVudC1UeXBlIl09Xyl9cmV0dXJuIXcmJkFycmF5LmlzQXJyYXkoYS5wcm9kdWNlcykmJmEucHJvZHVjZXMubGVuZ3RoPjAmJihvLmhlYWRlcnMuYWNjZXB0PWEucHJvZHVjZXMuam9pbigiLCAiKSksb31mdW5jdGlvbiBpZEZyb21QYXRoTWV0aG9kTGVnYWN5KHMsbyl7cmV0dXJuYCR7by50b0xvd2VyQ2FzZSgpfS0ke3N9YH1jb25zdCBhcnJheU9yRW1wdHk9cz0+QXJyYXkuaXNBcnJheShzKT9zOltdLGZpbmRPYmplY3RPckFycmF5U2NoZW1hPShzLHtyZWN1cnNlOm89ITAsZGVwdGg6aT0xfT17fSk9PntpZihwdShzKSl7aWYoIm9iamVjdCI9PT1zLnR5cGV8fCJhcnJheSI9PT1zLnR5cGV8fEFycmF5LmlzQXJyYXkocy50eXBlKSYmKHMudHlwZS5pbmNsdWRlcygib2JqZWN0Iil8fHMudHlwZS5pbmNsdWRlcygiYXJyYXkiKSkpcmV0dXJuIHM7aWYoIShpPlJsKSYmbyl7Y29uc3QgYT1BcnJheS5pc0FycmF5KHMub25lT2YpP3Mub25lT2YuZmluZCgocz0+ZmluZE9iamVjdE9yQXJyYXlTY2hlbWEocyx7cmVjdXJzZTpvLGRlcHRoOmkrMX0pKSk6dm9pZCAwO2lmKGEpcmV0dXJuIGE7Y29uc3QgdT1BcnJheS5pc0FycmF5KHMuYW55T2YpP3MuYW55T2YuZmluZCgocz0+ZmluZE9iamVjdE9yQXJyYXlTY2hlbWEocyx7cmVjdXJzZTpvLGRlcHRoOmkrMX0pKSk6dm9pZCAwO2lmKHUpcmV0dXJuIHV9fX0scGFyc2VKc29uT2JqZWN0T3JBcnJheT0oe3ZhbHVlOnMsc2lsZW50RmFpbDpvPSExfSk9Pnt0cnl7Y29uc3QgaT1KU09OLnBhcnNlKHMpO2lmKHB1KGkpfHxBcnJheS5pc0FycmF5KGkpKXJldHVybiBpO2lmKCFvKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgSlNPTiBzZXJpYWxpemVkIG9iamVjdCBvciBhcnJheSIpfWNhdGNoe2lmKCFvKXRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IHBhcnNlIHBhcmFtZXRlciB2YWx1ZSBzdHJpbmcgYXMgSlNPTiBPYmplY3Qgb3IgSlNPTiBBcnJheSIpfXJldHVybiBzfSxwYXJzZVVSSVJlZmVyZW5jZT1zPT57dHJ5e3JldHVybiBuZXcgVVJMKHMpfWNhdGNoe2NvbnN0IG89bmV3IFVSTChzLE5sKSxpPVN0cmluZyhzKS5zdGFydHNXaXRoKCIvIik/by5wYXRobmFtZTpvLnBhdGhuYW1lLnN1YnN0cmluZygxKTtyZXR1cm57aGFzaDpvLmhhc2gsaG9zdDoiIixob3N0bmFtZToiIixocmVmOiIiLG9yaWdpbjoiIixwYXNzd29yZDoiIixwYXRobmFtZTppLHBvcnQ6IiIscHJvdG9jb2w6IiIsc2VhcmNoOm8uc2VhcmNoLHNlYXJjaFBhcmFtczpvLnNlYXJjaFBhcmFtc319fTtjbGFzcyBPcGVyYXRpb25Ob3RGb3VuZEVycm9yIGV4dGVuZHMgR297fWNvbnN0IEt4PXtidWlsZFJlcXVlc3Q6ZXhlY3V0ZV9idWlsZFJlcXVlc3R9O2Z1bmN0aW9uIGV4ZWN1dGVfZXhlY3V0ZSh7aHR0cDpzLGZldGNoOm8sc3BlYzppLG9wZXJhdGlvbklkOmEscGF0aE5hbWU6dSxtZXRob2Q6XyxwYXJhbWV0ZXJzOncsc2VjdXJpdGllczp4LC4uLkN9KXtjb25zdCBqPXN8fG98fGh0dHBfaHR0cDt1JiZfJiYhYSYmKGE9aWRGcm9tUGF0aE1ldGhvZExlZ2FjeSh1LF8pKTtjb25zdCBMPUt4LmJ1aWxkUmVxdWVzdCh7c3BlYzppLG9wZXJhdGlvbklkOmEscGFyYW1ldGVyczp3LHNlY3VyaXRpZXM6eCxodHRwOmosLi4uQ30pO3JldHVybiBMLmJvZHkmJihwdShMLmJvZHkpfHxBcnJheS5pc0FycmF5KEwuYm9keSkpJiYoTC5ib2R5PUpTT04uc3RyaW5naWZ5KEwuYm9keSkpLGooTCl9ZnVuY3Rpb24gZXhlY3V0ZV9idWlsZFJlcXVlc3Qocyl7Y29uc3R7c3BlYzpvLG9wZXJhdGlvbklkOmkscmVzcG9uc2VDb250ZW50VHlwZTphLHNjaGVtZTp1LHJlcXVlc3RJbnRlcmNlcHRvcjpfLHJlc3BvbnNlSW50ZXJjZXB0b3I6dyxjb250ZXh0VXJsOngsdXNlckZldGNoOkMsc2VydmVyOmosc2VydmVyVmFyaWFibGVzOkwsaHR0cDpCLHNpZ25hbDokLHNlcnZlclZhcmlhYmxlRW5jb2RlcjpVfT1zO2xldHtwYXJhbWV0ZXJzOlYscGFyYW1ldGVyQnVpbGRlcnM6eixiYXNlVVJMOll9PXM7Y29uc3QgWj1pc09wZW5BUEkzKG8pO3p8fCh6PVo/YmU6RHgpO2xldCBlZT17dXJsOiIiLGNyZWRlbnRpYWxzOkImJkIud2l0aENyZWRlbnRpYWxzPyJpbmNsdWRlIjoic2FtZS1vcmlnaW4iLGhlYWRlcnM6e30sY29va2llczp7fX07JCYmKGVlLnNpZ25hbD0kKSxfJiYoZWUucmVxdWVzdEludGVyY2VwdG9yPV8pLHcmJihlZS5yZXNwb25zZUludGVyY2VwdG9yPXcpLEMmJihlZS51c2VyRmV0Y2g9Qyk7Y29uc3QgaWU9ZnVuY3Rpb24gZ2V0T3BlcmF0aW9uUmF3KHMsbyl7cmV0dXJuIHMmJnMucGF0aHM/ZnVuY3Rpb24gZmluZE9wZXJhdGlvbihzLG8pe3JldHVybiBmdW5jdGlvbiBlYWNoT3BlcmF0aW9uKHMsbyxpKXtpZighc3x8Im9iamVjdCIhPXR5cGVvZiBzfHwhcy5wYXRoc3x8Im9iamVjdCIhPXR5cGVvZiBzLnBhdGhzKXJldHVybiBudWxsO2NvbnN0e3BhdGhzOmF9PXM7Zm9yKGNvbnN0IHUgaW4gYSlmb3IoY29uc3QgXyBpbiBhW3VdKXtpZigiUEFSQU1FVEVSUyI9PT1fLnRvVXBwZXJDYXNlKCkpY29udGludWU7Y29uc3Qgdz1hW3VdW19dO2lmKCF3fHwib2JqZWN0IiE9dHlwZW9mIHcpY29udGludWU7Y29uc3QgeD17c3BlYzpzLHBhdGhOYW1lOnUsbWV0aG9kOl8udG9VcHBlckNhc2UoKSxvcGVyYXRpb246d30sQz1vKHgpO2lmKGkmJkMpcmV0dXJuIHh9fShzLG8sITApfHxudWxsfShzLCgoe3BhdGhOYW1lOnMsbWV0aG9kOmksb3BlcmF0aW9uOmF9KT0+e2lmKCFhfHwib2JqZWN0IiE9dHlwZW9mIGEpcmV0dXJuITE7Y29uc3QgdT1hLm9wZXJhdGlvbklkO3JldHVybltvcElkKGEscyxpKSxpZEZyb21QYXRoTWV0aG9kTGVnYWN5KHMsaSksdV0uc29tZSgocz0+cyYmcz09PW8pKX0pKTpudWxsfShvLGkpO2lmKCFpZSl0aHJvdyBuZXcgT3BlcmF0aW9uTm90Rm91bmRFcnJvcihgT3BlcmF0aW9uICR7aX0gbm90IGZvdW5kYCk7Y29uc3R7b3BlcmF0aW9uOmFlPXt9LG1ldGhvZDpjZSxwYXRoTmFtZTpsZX09aWU7aWYoWT1udWxsIT1ZP1k6ZnVuY3Rpb24gYmFzZVVybChzKXtjb25zdCBvPWlzT3BlbkFQSTMocy5zcGVjKTtyZXR1cm4gbz9mdW5jdGlvbiBvYXMzQmFzZVVybCh7c3BlYzpzLHBhdGhOYW1lOm8sbWV0aG9kOmksc2VydmVyOmEsY29udGV4dFVybDp1LHNlcnZlclZhcmlhYmxlczpfPXt9LHNlcnZlclZhcmlhYmxlRW5jb2Rlcjp3fSl7dmFyIHgsQztsZXQgaixMPVtdLEI9IiI7Y29uc3QgJD1udWxsPT1zfHxudWxsPT09KHg9cy5wYXRocyl8fHZvaWQgMD09PXh8fG51bGw9PT0oeD14W29dKXx8dm9pZCAwPT09eHx8bnVsbD09PSh4PXhbKGl8fCIiKS50b0xvd2VyQ2FzZSgpXSl8fHZvaWQgMD09PXg/dm9pZCAwOnguc2VydmVycyxVPW51bGw9PXN8fG51bGw9PT0oQz1zLnBhdGhzKXx8dm9pZCAwPT09Q3x8bnVsbD09PShDPUNbb10pfHx2b2lkIDA9PT1DP3ZvaWQgMDpDLnNlcnZlcnMsVj1udWxsPT1zP3ZvaWQgMDpzLnNlcnZlcnM7TD1pc05vbkVtcHR5U2VydmVyTGlzdCgkKT8kOmlzTm9uRW1wdHlTZXJ2ZXJMaXN0KFUpP1U6aXNOb25FbXB0eVNlcnZlckxpc3QoVik/VjpbTWxdLGEmJihqPUwuZmluZCgocz0+cy51cmw9PT1hKSksaiYmKEI9YSkpO0J8fChbal09TCxCPWoudXJsKTtpZihlc190ZXN0KEIse3N0cmljdDohMH0pKXtjb25zdCBzPU9iamVjdC5lbnRyaWVzKHsuLi5qLnZhcmlhYmxlc30pLnJlZHVjZSgoKHMsW28saV0pPT4oc1tvXT1pLmRlZmF1bHQscykpLHt9KTtCPWVzX3N1YnN0aXR1dGUoQix7Li4ucywuLi5ffSx7ZW5jb2RlcjoiZnVuY3Rpb24iPT10eXBlb2Ygdz93OmZ3fSl9cmV0dXJuIGZ1bmN0aW9uIGJ1aWxkT2FzM1VybFdpdGhDb250ZXh0KHM9IiIsbz0iIil7Y29uc3QgaT1wYXJzZVVSSVJlZmVyZW5jZShzJiZvP3Jlc29sdmUobyxzKTpzKSxhPXBhcnNlVVJJUmVmZXJlbmNlKG8pLHU9c3RyaXBOb25BbHBoYShpLnByb3RvY29sKXx8c3RyaXBOb25BbHBoYShhLnByb3RvY29sKSxfPWkuaG9zdHx8YS5ob3N0LHc9aS5wYXRobmFtZTtsZXQgeDt4PXUmJl8/YCR7dX06Ly8ke18rd31gOnc7cmV0dXJuIi8iPT09eFt4Lmxlbmd0aC0xXT94LnNsaWNlKDAsLTEpOnh9KEIsdSl9KHMpOmZ1bmN0aW9uIHN3YWdnZXIyQmFzZVVybCh7c3BlYzpzLHNjaGVtZTpvLGNvbnRleHRVcmw6aT0iIn0pe2NvbnN0IGE9cGFyc2VVUklSZWZlcmVuY2UoaSksdT1BcnJheS5pc0FycmF5KHMuc2NoZW1lcyk/cy5zY2hlbWVzWzBdOm51bGwsXz1vfHx1fHxzdHJpcE5vbkFscGhhKGEucHJvdG9jb2wpfHwiaHR0cCIsdz1zLmhvc3R8fGEuaG9zdHx8IiIseD1zLmJhc2VQYXRofHwiIjtsZXQgQztDPV8mJnc/YCR7X306Ly8ke3creH1gOng7cmV0dXJuIi8iPT09Q1tDLmxlbmd0aC0xXT9DLnNsaWNlKDAsLTEpOkN9KHMpfSh7c3BlYzpvLHNjaGVtZTp1LGNvbnRleHRVcmw6eCxzZXJ2ZXI6aixzZXJ2ZXJWYXJpYWJsZXM6TCxwYXRoTmFtZTpsZSxtZXRob2Q6Y2Usc2VydmVyVmFyaWFibGVFbmNvZGVyOlV9KSxlZS51cmwrPVksIWkpcmV0dXJuIGRlbGV0ZSBlZS5jb29raWVzLGVlO2VlLnVybCs9bGUsZWUubWV0aG9kPWAke2NlfWAudG9VcHBlckNhc2UoKSxWPVZ8fHt9O2NvbnN0IHBlPW8ucGF0aHNbbGVdfHx7fTthJiYoZWUuaGVhZGVycy5hY2NlcHQ9YSk7Y29uc3QgZGU9KHM9Pntjb25zdCBvPXt9O3MuZm9yRWFjaCgocz0+e29bcy5pbl18fChvW3MuaW5dPXt9KSxvW3MuaW5dW3MubmFtZV09c30pKTtjb25zdCBpPVtdO3JldHVybiBPYmplY3Qua2V5cyhvKS5mb3JFYWNoKChzPT57T2JqZWN0LmtleXMob1tzXSkuZm9yRWFjaCgoYT0+e2kucHVzaChvW3NdW2FdKX0pKX0pKSxpfSkoW10uY29uY2F0KGFycmF5T3JFbXB0eShhZS5wYXJhbWV0ZXJzKSkuY29uY2F0KGFycmF5T3JFbXB0eShwZS5wYXJhbWV0ZXJzKSkpO2RlLmZvckVhY2goKHM9Pntjb25zdCBpPXpbcy5pbl07bGV0IGE7aWYoImJvZHkiPT09cy5pbiYmcy5zY2hlbWEmJnMuc2NoZW1hLnByb3BlcnRpZXMmJihhPVYpLGE9cyYmcy5uYW1lJiZWW3MubmFtZV0sdm9pZCAwPT09YT9hPXMmJnMubmFtZSYmVltgJHtzLmlufS4ke3MubmFtZX1gXTooKHMsbyk9Pm8uZmlsdGVyKChvPT5vLm5hbWU9PT1zKSkpKHMubmFtZSxkZSkubGVuZ3RoPjEmJmNvbnNvbGUud2FybihgUGFyYW1ldGVyICcke3MubmFtZX0nIGlzIGFtYmlndW91cyBiZWNhdXNlIHRoZSBkZWZpbmVkIHNwZWMgaGFzIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyIHdpdGggdGhlIG5hbWU6ICcke3MubmFtZX0nIGFuZCB0aGUgcGFzc2VkLWluIHBhcmFtZXRlciB2YWx1ZXMgZGlkIG5vdCBkZWZpbmUgYW4gJ2luJyB2YWx1ZS5gKSxudWxsIT09YSl7aWYodm9pZCAwIT09cy5kZWZhdWx0JiZ2b2lkIDA9PT1hJiYoYT1zLmRlZmF1bHQpLHZvaWQgMD09PWEmJnMucmVxdWlyZWQmJiFzLmFsbG93RW1wdHlWYWx1ZSl0aHJvdyBuZXcgRXJyb3IoYFJlcXVpcmVkIHBhcmFtZXRlciAke3MubmFtZX0gaXMgbm90IHByb3ZpZGVkYCk7WiYmInN0cmluZyI9PXR5cGVvZiBhJiYoSHUoInR5cGUiLHMuc2NoZW1hKSYmInN0cmluZyI9PXR5cGVvZiBzLnNjaGVtYS50eXBlJiZmaW5kT2JqZWN0T3JBcnJheVNjaGVtYShzLnNjaGVtYSx7cmVjdXJzZTohMX0pP2E9cGFyc2VKc29uT2JqZWN0T3JBcnJheSh7dmFsdWU6YSxzaWxlbnRGYWlsOiExfSk6KEh1KCJ0eXBlIixzLnNjaGVtYSkmJkFycmF5LmlzQXJyYXkocy5zY2hlbWEudHlwZSkmJmZpbmRPYmplY3RPckFycmF5U2NoZW1hKHMuc2NoZW1hLHtyZWN1cnNlOiExfSl8fCFIdSgidHlwZSIscy5zY2hlbWEpJiZmaW5kT2JqZWN0T3JBcnJheVNjaGVtYShzLnNjaGVtYSx7cmVjdXJzZTohMH0pKSYmKGE9cGFyc2VKc29uT2JqZWN0T3JBcnJheSh7dmFsdWU6YSxzaWxlbnRGYWlsOiEwfSkpKSxpJiZpKHtyZXE6ZWUscGFyYW1ldGVyOnMsdmFsdWU6YSxvcGVyYXRpb246YWUsc3BlYzpvLGJhc2VVUkw6WX0pfX0pKTtjb25zdCBmZT17Li4ucyxvcGVyYXRpb246YWV9O2lmKGVlPVo/YnVpbGRSZXF1ZXN0KGZlLGVlKTpidWlsZF9yZXF1ZXN0X2J1aWxkUmVxdWVzdChmZSxlZSksZWUuY29va2llcyYmT2JqZWN0LmtleXMoZWUuY29va2llcykubGVuZ3RoPjApe2NvbnN0IHM9aGVscGVyc19jb29raWVfc2VyaWFsaXplKGVlLmNvb2tpZXMpO09kKGVlLmhlYWRlcnMuQ29va2llKT9lZS5oZWFkZXJzLkNvb2tpZSs9YDsgJHtzfWA6ZWUuaGVhZGVycy5Db29raWU9c31yZXR1cm4gZWUuY29va2llcyYmZGVsZXRlIGVlLmNvb2tpZXMsc2VyaWFsaXplUmVxdWVzdChlZSl9Y29uc3Qgc3RyaXBOb25BbHBoYT1zPT5zP3MucmVwbGFjZSgvXFcvZywiIik6bnVsbDtjb25zdCBpc05vbkVtcHR5U2VydmVyTGlzdD1zPT5BcnJheS5pc0FycmF5KHMpJiZzLmxlbmd0aD4wO2NvbnN0IG1ha2VSZXNvbHZlU3VidHJlZT1zPT5hc3luYyhvLGksYT17fSk9Pihhc3luYyhzLG8saT17fSk9Pntjb25zdHtyZXR1cm5FbnRpcmVUcmVlOmEsYmFzZURvYzp1LHJlcXVlc3RJbnRlcmNlcHRvcjpfLHJlc3BvbnNlSW50ZXJjZXB0b3I6dyxwYXJhbWV0ZXJNYWNybzp4LG1vZGVsUHJvcGVydHlNYWNybzpDLHVzZUNpcmN1bGFyU3RydWN0dXJlczpqLHN0cmF0ZWdpZXM6TH09aSxCPXtzcGVjOnMscGF0aERpc2NyaW1pbmF0b3I6byxiYXNlRG9jOnUscmVxdWVzdEludGVyY2VwdG9yOl8scmVzcG9uc2VJbnRlcmNlcHRvcjp3LHBhcmFtZXRlck1hY3JvOngsbW9kZWxQcm9wZXJ0eU1hY3JvOkMsdXNlQ2lyY3VsYXJTdHJ1Y3R1cmVzOmosc3RyYXRlZ2llczpMfSwkPUwuZmluZCgobz0+by5tYXRjaChzKSkpLm5vcm1hbGl6ZShzKSxVPWF3YWl0IEl4KHtzcGVjOiQsLi4uQixhbGxvd01ldGFQYXRjaGVzOiEwLHNraXBOb3JtYWxpemF0aW9uOiFpc09wZW5BUEkzMShzKX0pO3JldHVybiFhJiZBcnJheS5pc0FycmF5KG8pJiZvLmxlbmd0aCYmKFUuc3BlYz1vLnJlZHVjZSgoKHMsbyk9Pm51bGw9PXM/dm9pZCAwOnNbb10pLFUuc3BlYyl8fG51bGwpLFV9KShvLGksey4uLnMsLi4uYX0pLEd4PShtYWtlUmVzb2x2ZVN1YnRyZWUoe3N0cmF0ZWdpZXM6W3l1LG11LGR1XX0pLChzLG8pPT4oLi4uaSk9PntzKC4uLmkpO2NvbnN0IGE9by5nZXRDb25maWdzKCkud2l0aENyZWRlbnRpYWxzO28uZm4uZmV0Y2gud2l0aENyZWRlbnRpYWxzPWF9KTtmdW5jdGlvbiBzd2FnZ2VyX2NsaWVudCh7Y29uZmlnczpzLGdldENvbmZpZ3M6b30pe3JldHVybntmbjp7ZmV0Y2g6KGk9aHR0cF9odHRwLGE9cy5wcmVGZXRjaCx1PXMucG9zdEZldGNoLHU9dXx8KHM9PnMpLGE9YXx8KHM9PnMpLHM9Pigic3RyaW5nIj09dHlwZW9mIHMmJihzPXt1cmw6c30pLHM9c2VyaWFsaXplUmVxdWVzdChzKSxzPWEocyksdShpKHMpKSkpLGJ1aWxkUmVxdWVzdDpleGVjdXRlX2J1aWxkUmVxdWVzdCxleGVjdXRlOmV4ZWN1dGVfZXhlY3V0ZSxyZXNvbHZlOm1ha2VSZXNvbHZlKHtzdHJhdGVnaWVzOltQeCx5dSxtdSxkdV19KSxyZXNvbHZlU3VidHJlZTphc3luYyhzLGksYT17fSk9Pntjb25zdCB1PW8oKSxfPXttb2RlbFByb3BlcnR5TWFjcm86dS5tb2RlbFByb3BlcnR5TWFjcm8scGFyYW1ldGVyTWFjcm86dS5wYXJhbWV0ZXJNYWNybyxyZXF1ZXN0SW50ZXJjZXB0b3I6dS5yZXF1ZXN0SW50ZXJjZXB0b3IscmVzcG9uc2VJbnRlcmNlcHRvcjp1LnJlc3BvbnNlSW50ZXJjZXB0b3Isc3RyYXRlZ2llczpbUHgseXUsbXUsZHVdfTtyZXR1cm4gbWFrZVJlc29sdmVTdWJ0cmVlKF8pKHMsaSxhKX0sc2VyaWFsaXplUmVzOnNlcmlhbGl6ZVJlc3BvbnNlLG9wSWR9LHN0YXRlUGx1Z2luczp7Y29uZmlnczp7d3JhcEFjdGlvbnM6e2xvYWRlZDpHeH19fX07dmFyIGksYSx1fWZ1bmN0aW9uIHV0aWwoKXtyZXR1cm57Zm46e3NoYWxsb3dFcXVhbEtleXMsc2FuaXRpemVVcmx9fX12YXIgWXg9X193ZWJwYWNrX3JlcXVpcmVfXyg0MDk2MSksWHg9KF9fd2VicGFja19yZXF1aXJlX18oNzg0MTgpLFJlLnZlcnNpb24uc3RhcnRzV2l0aCgiMTkiKSksUXg9U3ltYm9sLmZvcihYeD8icmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnQiOiJyZWFjdC5lbGVtZW50IiksWng9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksdGs9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxyaz1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLG5rPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksc2s9U3ltYm9sLmZvcigicmVhY3QuY29uc3VtZXIiKSxvaz1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksbGs9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSx1az1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLHBrPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlX2xpc3QiKSxmaz1TeW1ib2wuZm9yKCJyZWFjdC5tZW1vIiksbWs9U3ltYm9sLmZvcigicmVhY3QubGF6eSIpLHlrPWxrLHZrPWZrO2Z1bmN0aW9uIHR5cGVPZihzKXtpZigib2JqZWN0Ij09dHlwZW9mIHMmJm51bGwhPT1zKXtjb25zdHskJHR5cGVvZjpvfT1zO3N3aXRjaChvKXtjYXNlIFF4OnN3aXRjaChzPXMudHlwZSl7Y2FzZSB0azpjYXNlIG5rOmNhc2Ugcms6Y2FzZSB1azpjYXNlIHBrOnJldHVybiBzO2RlZmF1bHQ6c3dpdGNoKHM9cyYmcy4kJHR5cGVvZil7Y2FzZSBvazpjYXNlIGxrOmNhc2UgbWs6Y2FzZSBmazpjYXNlIHNrOnJldHVybiBzO2RlZmF1bHQ6cmV0dXJuIG99fWNhc2UgWng6cmV0dXJuIG99fX1mdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShzLG8saSxhLHthcmVTdGF0ZXNFcXVhbDp1LGFyZU93blByb3BzRXF1YWw6XyxhcmVTdGF0ZVByb3BzRXF1YWw6d30pe2xldCB4LEMsaixMLEIsJD0hMTtmdW5jdGlvbiBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMoJCxVKXtjb25zdCBWPSFfKFUsQyksej0hdSgkLHgsVSxDKTtyZXR1cm4geD0kLEM9VSxWJiZ6P2Z1bmN0aW9uIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKXtyZXR1cm4gaj1zKHgsQyksby5kZXBlbmRzT25Pd25Qcm9wcyYmKEw9byhhLEMpKSxCPWkoaixMLEMpLEJ9KCk6Vj9mdW5jdGlvbiBoYW5kbGVOZXdQcm9wcygpe3JldHVybiBzLmRlcGVuZHNPbk93blByb3BzJiYoaj1zKHgsQykpLG8uZGVwZW5kc09uT3duUHJvcHMmJihMPW8oYSxDKSksQj1pKGosTCxDKSxCfSgpOno/ZnVuY3Rpb24gaGFuZGxlTmV3U3RhdGUoKXtjb25zdCBvPXMoeCxDKSxhPSF3KG8saik7cmV0dXJuIGo9byxhJiYoQj1pKGosTCxDKSksQn0oKTpCfXJldHVybiBmdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yKHUsXyl7cmV0dXJuICQ/aGFuZGxlU3Vic2VxdWVudENhbGxzKHUsXyk6ZnVuY3Rpb24gaGFuZGxlRmlyc3RDYWxsKHUsXyl7cmV0dXJuIHg9dSxDPV8saj1zKHgsQyksTD1vKGEsQyksQj1pKGosTCxDKSwkPSEwLEJ9KHUsXyl9fWZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQocyl7cmV0dXJuIGZ1bmN0aW9uIGluaXRDb25zdGFudFNlbGVjdG9yKG8pe2NvbnN0IGk9cyhvKTtmdW5jdGlvbiBjb25zdGFudFNlbGVjdG9yKCl7cmV0dXJuIGl9cmV0dXJuIGNvbnN0YW50U2VsZWN0b3IuZGVwZW5kc09uT3duUHJvcHM9ITEsY29uc3RhbnRTZWxlY3Rvcn19ZnVuY3Rpb24gZ2V0RGVwZW5kc09uT3duUHJvcHMocyl7cmV0dXJuIHMuZGVwZW5kc09uT3duUHJvcHM/Qm9vbGVhbihzLmRlcGVuZHNPbk93blByb3BzKToxIT09cy5sZW5ndGh9ZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNGdW5jKHMsbyl7cmV0dXJuIGZ1bmN0aW9uIGluaXRQcm94eVNlbGVjdG9yKG8se2Rpc3BsYXlOYW1lOml9KXtjb25zdCBhPWZ1bmN0aW9uIG1hcFRvUHJvcHNQcm94eShzLG8pe3JldHVybiBhLmRlcGVuZHNPbk93blByb3BzP2EubWFwVG9Qcm9wcyhzLG8pOmEubWFwVG9Qcm9wcyhzLHZvaWQgMCl9O3JldHVybiBhLmRlcGVuZHNPbk93blByb3BzPSEwLGEubWFwVG9Qcm9wcz1mdW5jdGlvbiBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5KG8saSl7YS5tYXBUb1Byb3BzPXMsYS5kZXBlbmRzT25Pd25Qcm9wcz1nZXREZXBlbmRzT25Pd25Qcm9wcyhzKTtsZXQgdT1hKG8saSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHUmJihhLm1hcFRvUHJvcHM9dSxhLmRlcGVuZHNPbk93blByb3BzPWdldERlcGVuZHNPbk93blByb3BzKHUpLHU9YShvLGkpKSx1fSxhfX1mdW5jdGlvbiBjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShzLG8pe3JldHVybihpLGEpPT57dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIG9mIHR5cGUgJHt0eXBlb2Ygc30gZm9yICR7b30gYXJndW1lbnQgd2hlbiBjb25uZWN0aW5nIGNvbXBvbmVudCAke2Eud3JhcHBlZENvbXBvbmVudE5hbWV9LmApfX1mdW5jdGlvbiBkZWZhdWx0TWVyZ2VQcm9wcyhzLG8saSl7cmV0dXJuey4uLmksLi4ucywuLi5vfX1mdW5jdGlvbiBkZWZhdWx0Tm9vcEJhdGNoKHMpe3MoKX12YXIgX2s9e25vdGlmeSgpe30sZ2V0OigpPT5bXX07ZnVuY3Rpb24gY3JlYXRlU3Vic2NyaXB0aW9uKHMsbyl7bGV0IGksYT1fayx1PTAsXz0hMTtmdW5jdGlvbiBoYW5kbGVDaGFuZ2VXcmFwcGVyKCl7dy5vblN0YXRlQ2hhbmdlJiZ3Lm9uU3RhdGVDaGFuZ2UoKX1mdW5jdGlvbiB0cnlTdWJzY3JpYmUoKXt1KyssaXx8KGk9bz9vLmFkZE5lc3RlZFN1YihoYW5kbGVDaGFuZ2VXcmFwcGVyKTpzLnN1YnNjcmliZShoYW5kbGVDaGFuZ2VXcmFwcGVyKSxhPWZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpe2xldCBzPW51bGwsbz1udWxsO3JldHVybntjbGVhcigpe3M9bnVsbCxvPW51bGx9LG5vdGlmeSgpe2RlZmF1bHROb29wQmF0Y2goKCgpPT57bGV0IG89cztmb3IoO287KW8uY2FsbGJhY2soKSxvPW8ubmV4dH0pKX0sZ2V0KCl7Y29uc3Qgbz1bXTtsZXQgaT1zO2Zvcig7aTspby5wdXNoKGkpLGk9aS5uZXh0O3JldHVybiBvfSxzdWJzY3JpYmUoaSl7bGV0IGE9ITA7Y29uc3QgdT1vPXtjYWxsYmFjazppLG5leHQ6bnVsbCxwcmV2Om99O3JldHVybiB1LnByZXY/dS5wcmV2Lm5leHQ9dTpzPXUsZnVuY3Rpb24gdW5zdWJzY3JpYmUoKXthJiZudWxsIT09cyYmKGE9ITEsdS5uZXh0P3UubmV4dC5wcmV2PXUucHJldjpvPXUucHJldix1LnByZXY/dS5wcmV2Lm5leHQ9dS5uZXh0OnM9dS5uZXh0KX19fX0oKSl9ZnVuY3Rpb24gdHJ5VW5zdWJzY3JpYmUoKXt1LS0saSYmMD09PXUmJihpKCksaT12b2lkIDAsYS5jbGVhcigpLGE9X2spfWNvbnN0IHc9e2FkZE5lc3RlZFN1YjpmdW5jdGlvbiBhZGROZXN0ZWRTdWIocyl7dHJ5U3Vic2NyaWJlKCk7Y29uc3Qgbz1hLnN1YnNjcmliZShzKTtsZXQgaT0hMTtyZXR1cm4oKT0+e2l8fChpPSEwLG8oKSx0cnlVbnN1YnNjcmliZSgpKX19LG5vdGlmeU5lc3RlZFN1YnM6ZnVuY3Rpb24gbm90aWZ5TmVzdGVkU3Vicygpe2Eubm90aWZ5KCl9LGhhbmRsZUNoYW5nZVdyYXBwZXIsaXNTdWJzY3JpYmVkOmZ1bmN0aW9uIGlzU3Vic2NyaWJlZCgpe3JldHVybiBffSx0cnlTdWJzY3JpYmU6ZnVuY3Rpb24gdHJ5U3Vic2NyaWJlU2VsZigpe198fChfPSEwLHRyeVN1YnNjcmliZSgpKX0sdHJ5VW5zdWJzY3JpYmU6ZnVuY3Rpb24gdHJ5VW5zdWJzY3JpYmVTZWxmKCl7XyYmKF89ITEsdHJ5VW5zdWJzY3JpYmUoKSl9LGdldExpc3RlbmVyczooKT0+YX07cmV0dXJuIHd9dmFyIHdrPSgoKT0+ISgidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvd3x8dm9pZCAwPT09d2luZG93LmRvY3VtZW50fHx2b2lkIDA9PT13aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkpKCkseGs9KCgpPT4idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmIlJlYWN0TmF0aXZlIj09PW5hdmlnYXRvci5wcm9kdWN0KSgpLEFrPSgoKT0+d2t8fHhrP1JlLnVzZUxheW91dEVmZmVjdDpSZS51c2VFZmZlY3QpKCk7ZnVuY3Rpb24gaXMocyxvKXtyZXR1cm4gcz09PW8/MCE9PXN8fDAhPT1vfHwxL3M9PTEvbzpzIT1zJiZvIT1vfWZ1bmN0aW9uIHNoYWxsb3dFcXVhbChzLG8pe2lmKGlzKHMsbykpcmV0dXJuITA7aWYoIm9iamVjdCIhPXR5cGVvZiBzfHxudWxsPT09c3x8Im9iamVjdCIhPXR5cGVvZiBvfHxudWxsPT09bylyZXR1cm4hMTtjb25zdCBpPU9iamVjdC5rZXlzKHMpLGE9T2JqZWN0LmtleXMobyk7aWYoaS5sZW5ndGghPT1hLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErKylpZighT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8saVthXSl8fCFpcyhzW2lbYV1dLG9baVthXV0pKXJldHVybiExO3JldHVybiEwfXZhciBCaz17Y2hpbGRDb250ZXh0VHlwZXM6ITAsY29udGV4dFR5cGU6ITAsY29udGV4dFR5cGVzOiEwLGRlZmF1bHRQcm9wczohMCxkaXNwbGF5TmFtZTohMCxnZXREZWZhdWx0UHJvcHM6ITAsZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yOiEwLGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczohMCxtaXhpbnM6ITAscHJvcFR5cGVzOiEwLHR5cGU6ITB9LHFrPXtuYW1lOiEwLGxlbmd0aDohMCxwcm90b3R5cGU6ITAsY2FsbGVyOiEwLGNhbGxlZTohMCxhcmd1bWVudHM6ITAsYXJpdHk6ITB9LFZrPXskJHR5cGVvZjohMCxjb21wYXJlOiEwLGRlZmF1bHRQcm9wczohMCxkaXNwbGF5TmFtZTohMCxwcm9wVHlwZXM6ITAsdHlwZTohMH0sems9e1t5a106eyQkdHlwZW9mOiEwLHJlbmRlcjohMCxkZWZhdWx0UHJvcHM6ITAsZGlzcGxheU5hbWU6ITAscHJvcFR5cGVzOiEwfSxbdmtdOlZrfTtmdW5jdGlvbiBnZXRTdGF0aWNzKHMpe3JldHVybiBmdW5jdGlvbiBpc01lbW8ocyl7cmV0dXJuIHR5cGVPZihzKT09PWZrfShzKT9Wazp6a1tzLiQkdHlwZW9mXXx8Qmt9dmFyIGVPPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSx0Tz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyxyTz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLG5PPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isc089T2JqZWN0LmdldFByb3RvdHlwZU9mLG9PPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3MocyxvKXtpZigic3RyaW5nIiE9dHlwZW9mIG8pe2lmKG9PKXtjb25zdCBpPXNPKG8pO2kmJmkhPT1vTyYmaG9pc3ROb25SZWFjdFN0YXRpY3MocyxpKX1sZXQgaT10TyhvKTtyTyYmKGk9aS5jb25jYXQock8obykpKTtjb25zdCBhPWdldFN0YXRpY3MocyksdT1nZXRTdGF0aWNzKG8pO2ZvcihsZXQgXz0wO188aS5sZW5ndGg7KytfKXtjb25zdCB3PWlbX107aWYoIShxa1t3XXx8dSYmdVt3XXx8YSYmYVt3XSkpe2NvbnN0IGk9bk8obyx3KTt0cnl7ZU8ocyx3LGkpfWNhdGNoKHMpe319fX1yZXR1cm4gc312YXIgaU89U3ltYm9sLmZvcigicmVhY3QtcmVkdXgtY29udGV4dCIpLGFPPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOnt9O2Z1bmN0aW9uIGdldENvbnRleHQoKXtpZighUmUuY3JlYXRlQ29udGV4dClyZXR1cm57fTtjb25zdCBzPWFPW2lPXT8/PW5ldyBNYXA7bGV0IG89cy5nZXQoUmUuY3JlYXRlQ29udGV4dCk7cmV0dXJuIG98fChvPVJlLmNyZWF0ZUNvbnRleHQobnVsbCkscy5zZXQoUmUuY3JlYXRlQ29udGV4dCxvKSksb312YXIgY089Z2V0Q29udGV4dCgpLGxPPVtudWxsLG51bGxdO2Z1bmN0aW9uIGNhcHR1cmVXcmFwcGVyUHJvcHMocyxvLGksYSx1LF8pe3MuY3VycmVudD1hLGkuY3VycmVudD0hMSx1LmN1cnJlbnQmJih1LmN1cnJlbnQ9bnVsbCxfKCkpfWZ1bmN0aW9uIHN0cmljdEVxdWFsKHMsbyl7cmV0dXJuIHM9PT1vfXZhciB1Tz1mdW5jdGlvbiBjb25uZWN0KHMsbyxpLHtwdXJlOmEsYXJlU3RhdGVzRXF1YWw6dT1zdHJpY3RFcXVhbCxhcmVPd25Qcm9wc0VxdWFsOl89c2hhbGxvd0VxdWFsLGFyZVN0YXRlUHJvcHNFcXVhbDp3PXNoYWxsb3dFcXVhbCxhcmVNZXJnZWRQcm9wc0VxdWFsOng9c2hhbGxvd0VxdWFsLGZvcndhcmRSZWY6Qz0hMSxjb250ZXh0Omo9Y099PXt9KXtjb25zdCBMPWosQj1mdW5jdGlvbiBtYXBTdGF0ZVRvUHJvcHNGYWN0b3J5KHMpe3JldHVybiBzPyJmdW5jdGlvbiI9PXR5cGVvZiBzP3dyYXBNYXBUb1Byb3BzRnVuYyhzKTpjcmVhdGVJbnZhbGlkQXJnRmFjdG9yeShzLCJtYXBTdGF0ZVRvUHJvcHMiKTp3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KCgoKT0+KHt9KSkpfShzKSwkPWZ1bmN0aW9uIG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3Rvcnkocyl7cmV0dXJuIHMmJiJvYmplY3QiPT10eXBlb2Ygcz93cmFwTWFwVG9Qcm9wc0NvbnN0YW50KChvPT5mdW5jdGlvbiByZWFjdF9yZWR1eF9iaW5kQWN0aW9uQ3JlYXRvcnMocyxvKXtjb25zdCBpPXt9O2Zvcihjb25zdCBhIGluIHMpe2NvbnN0IHU9c1thXTsiZnVuY3Rpb24iPT10eXBlb2YgdSYmKGlbYV09KC4uLnMpPT5vKHUoLi4ucykpKX1yZXR1cm4gaX0ocyxvKSkpOnM/ImZ1bmN0aW9uIj09dHlwZW9mIHM/d3JhcE1hcFRvUHJvcHNGdW5jKHMpOmNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KHMsIm1hcERpc3BhdGNoVG9Qcm9wcyIpOndyYXBNYXBUb1Byb3BzQ29uc3RhbnQoKHM9Pih7ZGlzcGF0Y2g6c30pKSl9KG8pLFU9ZnVuY3Rpb24gbWVyZ2VQcm9wc0ZhY3Rvcnkocyl7cmV0dXJuIHM/ImZ1bmN0aW9uIj09dHlwZW9mIHM/ZnVuY3Rpb24gd3JhcE1lcmdlUHJvcHNGdW5jKHMpe3JldHVybiBmdW5jdGlvbiBpbml0TWVyZ2VQcm9wc1Byb3h5KG8se2Rpc3BsYXlOYW1lOmksYXJlTWVyZ2VkUHJvcHNFcXVhbDphfSl7bGV0IHUsXz0hMTtyZXR1cm4gZnVuY3Rpb24gbWVyZ2VQcm9wc1Byb3h5KG8saSx3KXtjb25zdCB4PXMobyxpLHcpO3JldHVybiBfP2EoeCx1KXx8KHU9eCk6KF89ITAsdT14KSx1fX19KHMpOmNyZWF0ZUludmFsaWRBcmdGYWN0b3J5KHMsIm1lcmdlUHJvcHMiKTooKT0+ZGVmYXVsdE1lcmdlUHJvcHN9KGkpLFY9Qm9vbGVhbihzKTtyZXR1cm4gcz0+e2NvbnN0IG89cy5kaXNwbGF5TmFtZXx8cy5uYW1lfHwiQ29tcG9uZW50IixpPWBDb25uZWN0KCR7b30pYCxhPXtzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXM6VixkaXNwbGF5TmFtZTppLHdyYXBwZWRDb21wb25lbnROYW1lOm8sV3JhcHBlZENvbXBvbmVudDpzLGluaXRNYXBTdGF0ZVRvUHJvcHM6Qixpbml0TWFwRGlzcGF0Y2hUb1Byb3BzOiQsaW5pdE1lcmdlUHJvcHM6VSxhcmVTdGF0ZXNFcXVhbDp1LGFyZVN0YXRlUHJvcHNFcXVhbDp3LGFyZU93blByb3BzRXF1YWw6XyxhcmVNZXJnZWRQcm9wc0VxdWFsOnh9O2Z1bmN0aW9uIENvbm5lY3RGdW5jdGlvbihvKXtjb25zdFtpLHUsX109UmUudXNlTWVtbygoKCk9Pntjb25zdHtyZWFjdFJlZHV4Rm9yd2FyZGVkUmVmOnMsLi4uaX09bztyZXR1cm5bby5jb250ZXh0LHMsaV19KSxbb10pLHc9UmUudXNlTWVtbygoKCk9PkwpLFtpLExdKSx4PVJlLnVzZUNvbnRleHQodyksQz1Cb29sZWFuKG8uc3RvcmUpJiZCb29sZWFuKG8uc3RvcmUuZ2V0U3RhdGUpJiZCb29sZWFuKG8uc3RvcmUuZGlzcGF0Y2gpLGo9Qm9vbGVhbih4KSYmQm9vbGVhbih4LnN0b3JlKTtjb25zdCBCPUM/by5zdG9yZTp4LnN0b3JlLCQ9aj94LmdldFNlcnZlclN0YXRlOkIuZ2V0U3RhdGUsVT1SZS51c2VNZW1vKCgoKT0+ZnVuY3Rpb24gZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShzLHtpbml0TWFwU3RhdGVUb1Byb3BzOm8saW5pdE1hcERpc3BhdGNoVG9Qcm9wczppLGluaXRNZXJnZVByb3BzOmEsLi4udX0pe3JldHVybiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShvKHMsdSksaShzLHUpLGEocyx1KSxzLHUpfShCLmRpc3BhdGNoLGEpKSxbQl0pLFt6LFldPVJlLnVzZU1lbW8oKCgpPT57aWYoIVYpcmV0dXJuIGxPO2NvbnN0IHM9Y3JlYXRlU3Vic2NyaXB0aW9uKEIsQz92b2lkIDA6eC5zdWJzY3JpcHRpb24pLG89cy5ub3RpZnlOZXN0ZWRTdWJzLmJpbmQocyk7cmV0dXJuW3Msb119KSxbQixDLHhdKSxaPVJlLnVzZU1lbW8oKCgpPT5DP3g6ey4uLngsc3Vic2NyaXB0aW9uOnp9KSxbQyx4LHpdKSxlZT1SZS51c2VSZWYodm9pZCAwKSxpZT1SZS51c2VSZWYoXyksYWU9UmUudXNlUmVmKHZvaWQgMCksY2U9UmUudXNlUmVmKCExKSxsZT1SZS51c2VSZWYoITEpLHBlPVJlLnVzZVJlZih2b2lkIDApO0FrKCgoKT0+KGxlLmN1cnJlbnQ9ITAsKCk9PntsZS5jdXJyZW50PSExfSkpLFtdKTtjb25zdCBkZT1SZS51c2VNZW1vKCgoKT0+KCk9PmFlLmN1cnJlbnQmJl89PT1pZS5jdXJyZW50P2FlLmN1cnJlbnQ6VShCLmdldFN0YXRlKCksXykpLFtCLF9dKSxmZT1SZS51c2VNZW1vKCgoKT0+cz0+ej9mdW5jdGlvbiBzdWJzY3JpYmVVcGRhdGVzKHMsbyxpLGEsdSxfLHcseCxDLGosTCl7aWYoIXMpcmV0dXJuKCk9Pnt9O2xldCBCPSExLCQ9bnVsbDtjb25zdCBjaGVja0ZvclVwZGF0ZXM9KCk9PntpZihCfHwheC5jdXJyZW50KXJldHVybjtjb25zdCBzPW8uZ2V0U3RhdGUoKTtsZXQgaSxVO3RyeXtpPWEocyx1LmN1cnJlbnQpfWNhdGNoKHMpe1U9cywkPXN9VXx8KCQ9bnVsbCksaT09PV8uY3VycmVudD93LmN1cnJlbnR8fGooKTooXy5jdXJyZW50PWksQy5jdXJyZW50PWksdy5jdXJyZW50PSEwLEwoKSl9O3JldHVybiBpLm9uU3RhdGVDaGFuZ2U9Y2hlY2tGb3JVcGRhdGVzLGkudHJ5U3Vic2NyaWJlKCksY2hlY2tGb3JVcGRhdGVzKCksKCk9PntpZihCPSEwLGkudHJ5VW5zdWJzY3JpYmUoKSxpLm9uU3RhdGVDaGFuZ2U9bnVsbCwkKXRocm93ICR9fShWLEIseixVLGllLGVlLGNlLGxlLGFlLFkscyk6KCk9Pnt9KSxbel0pO2xldCB5ZTshZnVuY3Rpb24gdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdFdpdGhBcmdzKHMsbyxpKXtBaygoKCk9PnMoLi4ubykpLGkpfShjYXB0dXJlV3JhcHBlclByb3BzLFtpZSxlZSxjZSxfLGFlLFldKTt0cnl7eWU9UmUudXNlU3luY0V4dGVybmFsU3RvcmUoZmUsZGUsJD8oKT0+VSgkKCksXyk6ZGUpfWNhdGNoKHMpe3Rocm93IHBlLmN1cnJlbnQmJihzLm1lc3NhZ2UrPWBcblRoZSBlcnJvciBtYXkgYmUgY29ycmVsYXRlZCB3aXRoIHRoaXMgcHJldmlvdXMgZXJyb3I6XG4ke3BlLmN1cnJlbnQuc3RhY2t9XG5cbmApLHN9QWsoKCgpPT57cGUuY3VycmVudD12b2lkIDAsYWUuY3VycmVudD12b2lkIDAsZWUuY3VycmVudD15ZX0pKTtjb25zdCBiZT1SZS51c2VNZW1vKCgoKT0+UmUuY3JlYXRlRWxlbWVudChzLHsuLi55ZSxyZWY6dX0pKSxbdSxzLHllXSk7cmV0dXJuIFJlLnVzZU1lbW8oKCgpPT5WP1JlLmNyZWF0ZUVsZW1lbnQody5Qcm92aWRlcix7dmFsdWU6Wn0sYmUpOmJlKSxbdyxiZSxaXSl9Y29uc3Qgaj1SZS5tZW1vKENvbm5lY3RGdW5jdGlvbik7aWYoai5XcmFwcGVkQ29tcG9uZW50PXMsai5kaXNwbGF5TmFtZT1Db25uZWN0RnVuY3Rpb24uZGlzcGxheU5hbWU9aSxDKXtjb25zdCBvPVJlLmZvcndhcmRSZWYoKGZ1bmN0aW9uIGZvcndhcmRDb25uZWN0UmVmKHMsbyl7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoaix7Li4ucyxyZWFjdFJlZHV4Rm9yd2FyZGVkUmVmOm99KX0pKTtyZXR1cm4gby5kaXNwbGF5TmFtZT1pLG8uV3JhcHBlZENvbXBvbmVudD1zLGhvaXN0Tm9uUmVhY3RTdGF0aWNzKG8scyl9cmV0dXJuIGhvaXN0Tm9uUmVhY3RTdGF0aWNzKGoscyl9fTt2YXIgcE89ZnVuY3Rpb24gUHJvdmlkZXIocyl7Y29uc3R7Y2hpbGRyZW46byxjb250ZXh0Omksc2VydmVyU3RhdGU6YSxzdG9yZTp1fT1zLF89UmUudXNlTWVtbygoKCk9Pntjb25zdCBzPWNyZWF0ZVN1YnNjcmlwdGlvbih1KTtyZXR1cm57c3RvcmU6dSxzdWJzY3JpcHRpb246cyxnZXRTZXJ2ZXJTdGF0ZTphPygpPT5hOnZvaWQgMH19KSxbdSxhXSksdz1SZS51c2VNZW1vKCgoKT0+dS5nZXRTdGF0ZSgpKSxbdV0pO0FrKCgoKT0+e2NvbnN0e3N1YnNjcmlwdGlvbjpzfT1fO3JldHVybiBzLm9uU3RhdGVDaGFuZ2U9cy5ub3RpZnlOZXN0ZWRTdWJzLHMudHJ5U3Vic2NyaWJlKCksdyE9PXUuZ2V0U3RhdGUoKSYmcy5ub3RpZnlOZXN0ZWRTdWJzKCksKCk9PntzLnRyeVVuc3Vic2NyaWJlKCkscy5vblN0YXRlQ2hhbmdlPXZvaWQgMH19KSxbXyx3XSk7Y29uc3QgeD1pfHxjTztyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCh4LlByb3ZpZGVyLHt2YWx1ZTpffSxvKX07dmFyIGhPPV9fd2VicGFja19yZXF1aXJlX18oODM0ODgpLGRPPV9fd2VicGFja19yZXF1aXJlX18ubihoTyk7Y29uc3Qgd2l0aFN5c3RlbT1zPT5vPT57Y29uc3R7Zm46aX09cygpO2NsYXNzIFdpdGhTeXN0ZW0gZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQobyxNbigpKHt9LHMoKSx0aGlzLnByb3BzLHRoaXMuY29udGV4dCkpfX1yZXR1cm4gV2l0aFN5c3RlbS5kaXNwbGF5TmFtZT1gV2l0aFN5c3RlbSgke2kuZ2V0RGlzcGxheU5hbWUobyl9KWAsV2l0aFN5c3RlbX0sd2l0aFJvb3Q9KHMsbyk9Pmk9Pntjb25zdHtmbjphfT1zKCk7Y2xhc3MgV2l0aFJvb3QgZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQocE8se3N0b3JlOm99LFJlLmNyZWF0ZUVsZW1lbnQoaSxNbigpKHt9LHRoaXMucHJvcHMsdGhpcy5jb250ZXh0KSkpfX1yZXR1cm4gV2l0aFJvb3QuZGlzcGxheU5hbWU9YFdpdGhSb290KCR7YS5nZXREaXNwbGF5TmFtZShpKX0pYCxXaXRoUm9vdH0sd2l0aENvbm5lY3Q9KHMsbyxpKT0+Y29tcG9zZShpP3dpdGhSb290KHMsaSk6ZE8oKSx1TygoKGksYSk9Pntjb25zdCB1PXsuLi5hLC4uLnMoKX0sXz1vLnByb3RvdHlwZT8ubWFwU3RhdGVUb1Byb3BzfHwocz0+KHtzdGF0ZTpzfSkpO3JldHVybiBfKGksdSl9KSksd2l0aFN5c3RlbShzKSkobyksaGFuZGxlUHJvcHM9KHMsbyxpLGEpPT57Zm9yKGNvbnN0IHUgaW4gbyl7Y29uc3QgXz1vW3VdOyJmdW5jdGlvbiI9PXR5cGVvZiBfJiZfKGlbdV0sYVt1XSxzKCkpfX0sd2l0aE1hcHBlZENvbnRhaW5lcj0ocyxvLGkpPT4obyxhKT0+e2NvbnN0e2ZuOnV9PXMoKSxfPWkobywicm9vdCIpO2NsYXNzIFdpdGhNYXBwZWRDb250YWluZXIgZXh0ZW5kcyBSZS5Db21wb25lbnR7Y29uc3RydWN0b3IobyxpKXtzdXBlcihvLGkpLGhhbmRsZVByb3BzKHMsYSxvLHt9KX1VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhvKXtoYW5kbGVQcm9wcyhzLGEsbyx0aGlzLnByb3BzKX1yZW5kZXIoKXtjb25zdCBzPUd0KCkodGhpcy5wcm9wcyxhP09iamVjdC5rZXlzKGEpOltdKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudChfLHMpfX1yZXR1cm4gV2l0aE1hcHBlZENvbnRhaW5lci5kaXNwbGF5TmFtZT1gV2l0aE1hcHBlZENvbnRhaW5lcigke3UuZ2V0RGlzcGxheU5hbWUoXyl9KWAsV2l0aE1hcHBlZENvbnRhaW5lcn0scmVuZGVyPShzLG8saSxhKT0+dT0+e2NvbnN0IF89aShzLG8sYSkoIkFwcCIsInJvb3QiKSx7Y3JlYXRlUm9vdDp3fT1ZeDt3KHUpLnJlbmRlcihSZS5jcmVhdGVFbGVtZW50KF8sbnVsbCkpfSxnZXRDb21wb25lbnQ9KHMsbyxpKT0+KGEsdSxfPXt9KT0+e2lmKCJzdHJpbmciIT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJOZWVkIGEgc3RyaW5nLCB0byBmZXRjaCBhIGNvbXBvbmVudC4gV2FzIGdpdmVuIGEgIit0eXBlb2YgYSk7Y29uc3Qgdz1pKGEpO3JldHVybiB3P3U/InJvb3QiPT09dT93aXRoQ29ubmVjdChzLHcsbygpKTp3aXRoQ29ubmVjdChzLHcpOnc6KF8uZmFpbFNpbGVudGx5fHxzKCkubG9nLndhcm4oIkNvdWxkIG5vdCBmaW5kIGNvbXBvbmVudDoiLGEpLG51bGwpfSxnZXREaXNwbGF5TmFtZT1zPT5zLmRpc3BsYXlOYW1lfHxzLm5hbWV8fCJDb21wb25lbnQiLHZpZXc9KHtnZXRDb21wb25lbnRzOnMsZ2V0U3RvcmU6byxnZXRTeXN0ZW06aX0pPT57Y29uc3QgYT0odT1nZXRDb21wb25lbnQoaSxvLHMpLFB0KHUsKCguLi5zKT0+SlNPTi5zdHJpbmdpZnkocykpKSk7dmFyIHU7Y29uc3QgXz0ocz0+dXRpbHNfbWVtb2l6ZU4ocywoKC4uLnMpPT5zKSkpKHdpdGhNYXBwZWRDb250YWluZXIoaSwwLGEpKTtyZXR1cm57cm9vdEluamVjdHM6e2dldENvbXBvbmVudDphLG1ha2VNYXBwZWRDb250YWluZXI6XyxyZW5kZXI6cmVuZGVyKGksbyxnZXRDb21wb25lbnQscyl9LGZuOntnZXREaXNwbGF5TmFtZX19fSx2aWV3X2xlZ2FjeT0oe1JlYWN0OnMsZ2V0U3lzdGVtOm8sZ2V0U3RvcmU6aSxnZXRDb21wb25lbnRzOmF9KT0+e2NvbnN0IHU9e30sXz1wYXJzZUludChzPy52ZXJzaW9uLDEwKTtyZXR1cm4gXz49MTYmJl88MTgmJih1LnJlbmRlcj0oKHMsbyxpLGEpPT51PT57Y29uc3QgXz1pKHMsbyxhKSgiQXBwIiwicm9vdCIpO1l4LnJlbmRlcihSZS5jcmVhdGVFbGVtZW50KF8sbnVsbCksdSl9KShvLGksZ2V0Q29tcG9uZW50LGEpKSx7cm9vdEluamVjdHM6dX19O2Z1bmN0aW9uIGRvd25sb2FkVXJsUGx1Z2luKHMpe2xldHtmbjpvfT1zO2NvbnN0IGk9e2Rvd25sb2FkOnM9Pih7ZXJyQWN0aW9uczppLHNwZWNTZWxlY3RvcnM6YSxzcGVjQWN0aW9uczp1LGdldENvbmZpZ3M6X30pPT57bGV0e2ZldGNoOnd9PW87Y29uc3QgeD1fKCk7ZnVuY3Rpb24gbmV4dChvKXtpZihvIGluc3RhbmNlb2YgRXJyb3J8fG8uc3RhdHVzPj00MDApcmV0dXJuIHUudXBkYXRlTG9hZGluZ1N0YXR1cygiZmFpbGVkIiksaS5uZXdUaHJvd25FcnIoT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoKG8ubWVzc2FnZXx8by5zdGF0dXNUZXh0KSsiICIrcykse3NvdXJjZToiZmV0Y2gifSkpLHZvaWQoIW8uc3RhdHVzJiZvIGluc3RhbmNlb2YgRXJyb3ImJmZ1bmN0aW9uIGNoZWNrUG9zc2libGVGYWlsUmVhc29ucygpe3RyeXtsZXQgbztpZigiVVJMImluIGx0P289bmV3IFVSTChzKToobz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIiksby5ocmVmPXMpLCJodHRwczoiIT09by5wcm90b2NvbCYmImh0dHBzOiI9PT1sdC5sb2NhdGlvbi5wcm90b2NvbCl7Y29uc3Qgcz1PYmplY3QuYXNzaWduKG5ldyBFcnJvcihgUG9zc2libGUgbWl4ZWQtY29udGVudCBpc3N1ZT8gVGhlIHBhZ2Ugd2FzIGxvYWRlZCBvdmVyIGh0dHBzOi8vIGJ1dCBhICR7by5wcm90b2NvbH0vLyBVUkwgd2FzIHNwZWNpZmllZC4gQ2hlY2sgdGhhdCB5b3UgYXJlIG5vdCBhdHRlbXB0aW5nIHRvIGxvYWQgbWl4ZWQgY29udGVudC5gKSx7c291cmNlOiJmZXRjaCJ9KTtyZXR1cm4gdm9pZCBpLm5ld1Rocm93bkVycihzKX1pZihvLm9yaWdpbiE9PWx0LmxvY2F0aW9uLm9yaWdpbil7Y29uc3Qgcz1PYmplY3QuYXNzaWduKG5ldyBFcnJvcihgUG9zc2libGUgY3Jvc3Mtb3JpZ2luIChDT1JTKSBpc3N1ZT8gVGhlIFVSTCBvcmlnaW4gKCR7by5vcmlnaW59KSBkb2VzIG5vdCBtYXRjaCB0aGUgcGFnZSAoJHtsdC5sb2NhdGlvbi5vcmlnaW59KS4gQ2hlY2sgdGhlIHNlcnZlciByZXR1cm5zIHRoZSBjb3JyZWN0ICdBY2Nlc3MtQ29udHJvbC1BbGxvdy0qJyBoZWFkZXJzLmApLHtzb3VyY2U6ImZldGNoIn0pO2kubmV3VGhyb3duRXJyKHMpfX1jYXRjaChzKXtyZXR1cm59fSgpKTt1LnVwZGF0ZUxvYWRpbmdTdGF0dXMoInN1Y2Nlc3MiKSx1LnVwZGF0ZVNwZWMoby50ZXh0KSxhLnVybCgpIT09cyYmdS51cGRhdGVVcmwocyl9cz1zfHxhLnVybCgpLHUudXBkYXRlTG9hZGluZ1N0YXR1cygibG9hZGluZyIpLGkuY2xlYXIoe3NvdXJjZToiZmV0Y2gifSksdyh7dXJsOnMsbG9hZFNwZWM6ITAscmVxdWVzdEludGVyY2VwdG9yOngucmVxdWVzdEludGVyY2VwdG9yfHwocz0+cykscmVzcG9uc2VJbnRlcmNlcHRvcjp4LnJlc3BvbnNlSW50ZXJjZXB0b3J8fChzPT5zKSxjcmVkZW50aWFsczoic2FtZS1vcmlnaW4iLGhlYWRlcnM6e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwqLyoifX0pLnRoZW4obmV4dCxuZXh0KX0sdXBkYXRlTG9hZGluZ1N0YXR1czpzPT57bGV0IG89W251bGwsImxvYWRpbmciLCJmYWlsZWQiLCJzdWNjZXNzIiwiZmFpbGVkQ29uZmlnIl07cmV0dXJuLTE9PT1vLmluZGV4T2YocykmJmNvbnNvbGUuZXJyb3IoYEVycm9yOiAke3N9IGlzIG5vdCBvbmUgb2YgJHtKU09OLnN0cmluZ2lmeShvKX1gKSx7dHlwZToic3BlY191cGRhdGVfbG9hZGluZ19zdGF0dXMiLHBheWxvYWQ6c319fTtsZXQgYT17bG9hZGluZ1N0YXR1czpVdCgocz0+c3x8KDAsemUuTWFwKSgpKSwocz0+cy5nZXQoImxvYWRpbmdTdGF0dXMiKXx8bnVsbCkpfTtyZXR1cm57c3RhdGVQbHVnaW5zOntzcGVjOnthY3Rpb25zOmkscmVkdWNlcnM6e3NwZWNfdXBkYXRlX2xvYWRpbmdfc3RhdHVzOihzLG8pPT4ic3RyaW5nIj09dHlwZW9mIG8ucGF5bG9hZD9zLnNldCgibG9hZGluZ1N0YXR1cyIsby5wYXlsb2FkKTpzfSxzZWxlY3RvcnM6YX19fX1mdW5jdGlvbiBhcnJheUxpa2VUb0FycmF5X2FycmF5TGlrZVRvQXJyYXkocyxvKXsobnVsbD09b3x8bz5zLmxlbmd0aCkmJihvPXMubGVuZ3RoKTtmb3IodmFyIGk9MCxhPUFycmF5KG8pO2k8bztpKyspYVtpXT1zW2ldO3JldHVybiBhfWZ1bmN0aW9uIHRvQ29uc3VtYWJsZUFycmF5X3RvQ29uc3VtYWJsZUFycmF5KHMpe3JldHVybiBmdW5jdGlvbiBhcnJheVdpdGhvdXRIb2xlc19hcnJheVdpdGhvdXRIb2xlcyhzKXtpZihBcnJheS5pc0FycmF5KHMpKXJldHVybiBhcnJheUxpa2VUb0FycmF5X2FycmF5TGlrZVRvQXJyYXkocyl9KHMpfHxmdW5jdGlvbiBpdGVyYWJsZVRvQXJyYXlfaXRlcmFibGVUb0FycmF5KHMpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZudWxsIT1zW1N5bWJvbC5pdGVyYXRvcl18fG51bGwhPXNbIkBAaXRlcmF0b3IiXSlyZXR1cm4gQXJyYXkuZnJvbShzKX0ocyl8fGZ1bmN0aW9uIHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5X3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KHMsbyl7aWYocyl7aWYoInN0cmluZyI9PXR5cGVvZiBzKXJldHVybiBhcnJheUxpa2VUb0FycmF5X2FycmF5TGlrZVRvQXJyYXkocyxvKTt2YXIgaT17fS50b1N0cmluZy5jYWxsKHMpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09aSYmcy5jb25zdHJ1Y3RvciYmKGk9cy5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PWl8fCJTZXQiPT09aT9BcnJheS5mcm9tKHMpOiJBcmd1bWVudHMiPT09aXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoaSk/YXJyYXlMaWtlVG9BcnJheV9hcnJheUxpa2VUb0FycmF5KHMsbyk6dm9pZCAwfX0ocyl8fGZ1bmN0aW9uIG5vbkl0ZXJhYmxlU3ByZWFkX25vbkl0ZXJhYmxlU3ByZWFkKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9KCl9ZnVuY3Rpb24gdHlwZW9mX3R5cGVvZihzKXtyZXR1cm4gdHlwZW9mX3R5cGVvZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihzKXtyZXR1cm4gdHlwZW9mIHN9OmZ1bmN0aW9uKHMpe3JldHVybiBzJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZzLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZzIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2Ygc30sdHlwZW9mX3R5cGVvZihzKX1mdW5jdGlvbiB0b1Byb3BlcnR5S2V5KHMpe3ZhciBvPWZ1bmN0aW9uIHRvUHJpbWl0aXZlKHMsbyl7aWYoIm9iamVjdCIhPXR5cGVvZl90eXBlb2Yocyl8fCFzKXJldHVybiBzO3ZhciBpPXNbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1pKXt2YXIgYT1pLmNhbGwocyxvfHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT10eXBlb2ZfdHlwZW9mKGEpKXJldHVybiBhO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09bz9TdHJpbmc6TnVtYmVyKShzKX0ocywic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PXR5cGVvZl90eXBlb2Yobyk/bzpvKyIifWZ1bmN0aW9uIGRlZmluZVByb3BlcnR5X2RlZmluZVByb3BlcnR5KHMsbyxpKXtyZXR1cm4obz10b1Byb3BlcnR5S2V5KG8pKWluIHM/T2JqZWN0LmRlZmluZVByb3BlcnR5KHMsbyx7dmFsdWU6aSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnNbb109aSxzfWZ1bmN0aW9uIGV4dGVuZHNfZXh0ZW5kcygpe3JldHVybiBleHRlbmRzX2V4dGVuZHM9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbihzKXtmb3IodmFyIG89MTtvPGFyZ3VtZW50cy5sZW5ndGg7bysrKXt2YXIgaT1hcmd1bWVudHNbb107Zm9yKHZhciBhIGluIGkpKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksYSkmJihzW2FdPWlbYV0pfXJldHVybiBzfSxleHRlbmRzX2V4dGVuZHMuYXBwbHkobnVsbCxhcmd1bWVudHMpfWZ1bmN0aW9uIGNyZWF0ZV9lbGVtZW50X293bktleXMocyxvKXt2YXIgaT1PYmplY3Qua2V5cyhzKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpO28mJihhPWEuZmlsdGVyKChmdW5jdGlvbihvKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzLG8pLmVudW1lcmFibGV9KSkpLGkucHVzaC5hcHBseShpLGEpfXJldHVybiBpfWZ1bmN0aW9uIF9vYmplY3RTcHJlYWQocyl7Zm9yKHZhciBvPTE7bzxhcmd1bWVudHMubGVuZ3RoO28rKyl7dmFyIGk9bnVsbCE9YXJndW1lbnRzW29dP2FyZ3VtZW50c1tvXTp7fTtvJTI/Y3JlYXRlX2VsZW1lbnRfb3duS2V5cyhPYmplY3QoaSksITApLmZvckVhY2goKGZ1bmN0aW9uKG8pe2RlZmluZVByb3BlcnR5X2RlZmluZVByb3BlcnR5KHMsbyxpW29dKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhzLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGkpKTpjcmVhdGVfZWxlbWVudF9vd25LZXlzKE9iamVjdChpKSkuZm9yRWFjaCgoZnVuY3Rpb24obyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHMsbyxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGksbykpfSkpfXJldHVybiBzfXZhciBmTz17fTtmdW5jdGlvbiBjcmVhdGVTdHlsZU9iamVjdChzKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30saT1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtyZXR1cm4gZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lQ29tYmluYXRpb25zKHMpe2lmKDA9PT1zLmxlbmd0aHx8MT09PXMubGVuZ3RoKXJldHVybiBzO3ZhciBvPXMuam9pbigiLiIpO3JldHVybiBmT1tvXXx8KGZPW29dPWZ1bmN0aW9uIHBvd2VyU2V0UGVybXV0YXRpb25zKHMpe3ZhciBvPXMubGVuZ3RoO3JldHVybiAwPT09b3x8MT09PW8/czoyPT09bz9bc1swXSxzWzFdLCIiLmNvbmNhdChzWzBdLCIuIikuY29uY2F0KHNbMV0pLCIiLmNvbmNhdChzWzFdLCIuIikuY29uY2F0KHNbMF0pXTozPT09bz9bc1swXSxzWzFdLHNbMl0sIiIuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1sxXSksIiIuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1syXSksIiIuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1swXSksIiIuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1syXSksIiIuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1swXSksIiIuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1sxXSksIiIuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzJdKSwiIi5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbMV0pLCIiLmNvbmNhdChzWzFdLCIuIikuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1syXSksIiIuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1syXSwiLiIpLmNvbmNhdChzWzBdKSwiIi5jb25jYXQoc1syXSwiLiIpLmNvbmNhdChzWzBdLCIuIikuY29uY2F0KHNbMV0pLCIiLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1swXSldOm8+PTQ/W3NbMF0sc1sxXSxzWzJdLHNbM10sIiIuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1sxXSksIiIuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1syXSksIiIuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1szXSksIiIuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1swXSksIiIuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1syXSksIiIuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1szXSksIiIuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1swXSksIiIuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1sxXSksIiIuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1szXSksIiIuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1swXSksIiIuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1sxXSksIiIuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1syXSksIiIuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzJdKSwiIi5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzFdLCIuIikuY29uY2F0KHNbM10pLCIiLmNvbmNhdChzWzBdLCIuIikuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1sxXSksIiIuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1syXSwiLiIpLmNvbmNhdChzWzNdKSwiIi5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMV0pLCIiLmNvbmNhdChzWzBdLCIuIikuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1syXSksIiIuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzJdKSwiIi5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzBdLCIuIikuY29uY2F0KHNbM10pLCIiLmNvbmNhdChzWzFdLCIuIikuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1swXSksIiIuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1syXSwiLiIpLmNvbmNhdChzWzNdKSwiIi5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMF0pLCIiLmNvbmNhdChzWzFdLCIuIikuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1syXSksIiIuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzFdKSwiIi5jb25jYXQoc1syXSwiLiIpLmNvbmNhdChzWzBdLCIuIikuY29uY2F0KHNbM10pLCIiLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1swXSksIiIuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzNdKSwiIi5jb25jYXQoc1syXSwiLiIpLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMF0pLCIiLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1sxXSksIiIuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzFdKSwiIi5jb25jYXQoc1szXSwiLiIpLmNvbmNhdChzWzBdLCIuIikuY29uY2F0KHNbMl0pLCIiLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1swXSksIiIuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzJdKSwiIi5jb25jYXQoc1szXSwiLiIpLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbMF0pLCIiLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1sxXSksIiIuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbM10pLCIiLmNvbmNhdChzWzBdLCIuIikuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1szXSwiLiIpLmNvbmNhdChzWzJdKSwiIi5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1szXSksIiIuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1syXSwiLiIpLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMV0pLCIiLmNvbmNhdChzWzBdLCIuIikuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzJdKSwiIi5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1sxXSksIiIuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbM10pLCIiLmNvbmNhdChzWzFdLCIuIikuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1szXSwiLiIpLmNvbmNhdChzWzJdKSwiIi5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1szXSksIiIuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1syXSwiLiIpLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMF0pLCIiLmNvbmNhdChzWzFdLCIuIikuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzJdKSwiIi5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1swXSksIiIuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzFdLCIuIikuY29uY2F0KHNbM10pLCIiLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1szXSwiLiIpLmNvbmNhdChzWzFdKSwiIi5jb25jYXQoc1syXSwiLiIpLmNvbmNhdChzWzFdLCIuIikuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1szXSksIiIuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMF0pLCIiLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzFdKSwiIi5jb25jYXQoc1syXSwiLiIpLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1swXSksIiIuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzFdLCIuIikuY29uY2F0KHNbMl0pLCIiLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1syXSwiLiIpLmNvbmNhdChzWzFdKSwiIi5jb25jYXQoc1szXSwiLiIpLmNvbmNhdChzWzFdLCIuIikuY29uY2F0KHNbMF0sIi4iKS5jb25jYXQoc1syXSksIiIuY29uY2F0KHNbM10sIi4iKS5jb25jYXQoc1sxXSwiLiIpLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbMF0pLCIiLmNvbmNhdChzWzNdLCIuIikuY29uY2F0KHNbMl0sIi4iKS5jb25jYXQoc1swXSwiLiIpLmNvbmNhdChzWzFdKSwiIi5jb25jYXQoc1szXSwiLiIpLmNvbmNhdChzWzJdLCIuIikuY29uY2F0KHNbMV0sIi4iKS5jb25jYXQoc1swXSldOnZvaWQgMH0ocykpLGZPW29dfShzLmZpbHRlcigoZnVuY3Rpb24ocyl7cmV0dXJuInRva2VuIiE9PXN9KSkpLnJlZHVjZSgoZnVuY3Rpb24ocyxvKXtyZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LHMpLGlbb10pfSksbyl9ZnVuY3Rpb24gY3JlYXRlQ2xhc3NOYW1lU3RyaW5nKHMpe3JldHVybiBzLmpvaW4oIiAiKX1mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHMpe3ZhciBvPXMubm9kZSxpPXMuc3R5bGVzaGVldCxhPXMuc3R5bGUsdT12b2lkIDA9PT1hP3t9OmEsXz1zLnVzZUlubGluZVN0eWxlcyx3PXMua2V5LHg9by5wcm9wZXJ0aWVzLEM9by50eXBlLGo9by50YWdOYW1lLEw9by52YWx1ZTtpZigidGV4dCI9PT1DKXJldHVybiBMO2lmKGope3ZhciBCLCQ9ZnVuY3Rpb24gY3JlYXRlQ2hpbGRyZW4ocyxvKXt2YXIgaT0wO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gaSs9MSxhLm1hcCgoZnVuY3Rpb24oYSx1KXtyZXR1cm4gY3JlYXRlRWxlbWVudCh7bm9kZTphLHN0eWxlc2hlZXQ6cyx1c2VJbmxpbmVTdHlsZXM6byxrZXk6ImNvZGUtc2VnbWVudC0iLmNvbmNhdChpLCItIikuY29uY2F0KHUpfSl9KSl9fShpLF8pO2lmKF8pe3ZhciBVPU9iamVjdC5rZXlzKGkpLnJlZHVjZSgoZnVuY3Rpb24ocyxvKXtyZXR1cm4gby5zcGxpdCgiLiIpLmZvckVhY2goKGZ1bmN0aW9uKG8pe3MuaW5jbHVkZXMobyl8fHMucHVzaChvKX0pKSxzfSksW10pLFY9eC5jbGFzc05hbWUmJnguY2xhc3NOYW1lLmluY2x1ZGVzKCJ0b2tlbiIpP1sidG9rZW4iXTpbXSx6PXguY2xhc3NOYW1lJiZWLmNvbmNhdCh4LmNsYXNzTmFtZS5maWx0ZXIoKGZ1bmN0aW9uKHMpe3JldHVybiFVLmluY2x1ZGVzKHMpfSkpKTtCPV9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSx4KSx7fSx7Y2xhc3NOYW1lOmNyZWF0ZUNsYXNzTmFtZVN0cmluZyh6KXx8dm9pZCAwLHN0eWxlOmNyZWF0ZVN0eWxlT2JqZWN0KHguY2xhc3NOYW1lLE9iamVjdC5hc3NpZ24oe30seC5zdHlsZSx1KSxpKX0pfWVsc2UgQj1fb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30seCkse30se2NsYXNzTmFtZTpjcmVhdGVDbGFzc05hbWVTdHJpbmcoeC5jbGFzc05hbWUpfSk7dmFyIFk9JChvLmNoaWxkcmVuKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudChqLGV4dGVuZHNfZXh0ZW5kcyh7a2V5Ond9LEIpLFkpfX12YXIgbU89WyJsYW5ndWFnZSIsImNoaWxkcmVuIiwic3R5bGUiLCJjdXN0b21TdHlsZSIsImNvZGVUYWdQcm9wcyIsInVzZUlubGluZVN0eWxlcyIsInNob3dMaW5lTnVtYmVycyIsInNob3dJbmxpbmVMaW5lTnVtYmVycyIsInN0YXJ0aW5nTGluZU51bWJlciIsImxpbmVOdW1iZXJDb250YWluZXJTdHlsZSIsImxpbmVOdW1iZXJTdHlsZSIsIndyYXBMaW5lcyIsIndyYXBMb25nTGluZXMiLCJsaW5lUHJvcHMiLCJyZW5kZXJlciIsIlByZVRhZyIsIkNvZGVUYWciLCJjb2RlIiwiYXN0R2VuZXJhdG9yIl07ZnVuY3Rpb24gaGlnaGxpZ2h0X293bktleXMocyxvKXt2YXIgaT1PYmplY3Qua2V5cyhzKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpO28mJihhPWEuZmlsdGVyKChmdW5jdGlvbihvKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzLG8pLmVudW1lcmFibGV9KSkpLGkucHVzaC5hcHBseShpLGEpfXJldHVybiBpfWZ1bmN0aW9uIGhpZ2hsaWdodF9vYmplY3RTcHJlYWQocyl7Zm9yKHZhciBvPTE7bzxhcmd1bWVudHMubGVuZ3RoO28rKyl7dmFyIGk9bnVsbCE9YXJndW1lbnRzW29dP2FyZ3VtZW50c1tvXTp7fTtvJTI/aGlnaGxpZ2h0X293bktleXMoT2JqZWN0KGkpLCEwKS5mb3JFYWNoKChmdW5jdGlvbihvKXtkZWZpbmVQcm9wZXJ0eV9kZWZpbmVQcm9wZXJ0eShzLG8saVtvXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocyxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhpKSk6aGlnaGxpZ2h0X293bktleXMoT2JqZWN0KGkpKS5mb3JFYWNoKChmdW5jdGlvbihvKXtPYmplY3QuZGVmaW5lUHJvcGVydHkocyxvLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxvKSl9KSl9cmV0dXJuIHN9dmFyIGdPPS9cbi9nO2Z1bmN0aW9uIEFsbExpbmVOdW1iZXJzKHMpe3ZhciBvPXMuY29kZVN0cmluZyxpPXMuY29kZVN0eWxlLGE9cy5jb250YWluZXJTdHlsZSx1PXZvaWQgMD09PWE/e2Zsb2F0OiJsZWZ0IixwYWRkaW5nUmlnaHQ6IjEwcHgifTphLF89cy5udW1iZXJTdHlsZSx3PXZvaWQgMD09PV8/e306Xyx4PXMuc3RhcnRpbmdMaW5lTnVtYmVyO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJjb2RlIix7c3R5bGU6T2JqZWN0LmFzc2lnbih7fSxpLHUpfSxmdW5jdGlvbiBnZXRBbGxMaW5lTnVtYmVycyhzKXt2YXIgbz1zLmxpbmVzLGk9cy5zdGFydGluZ0xpbmVOdW1iZXIsYT1zLnN0eWxlO3JldHVybiBvLm1hcCgoZnVuY3Rpb24ocyxvKXt2YXIgdT1vK2k7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtrZXk6ImxpbmUtIi5jb25jYXQobyksY2xhc3NOYW1lOiJyZWFjdC1zeW50YXgtaGlnaGxpZ2h0ZXItbGluZS1udW1iZXIiLHN0eWxlOiJmdW5jdGlvbiI9PXR5cGVvZiBhP2EodSk6YX0sIiIuY29uY2F0KHUsIlxuIikpfSkpfSh7bGluZXM6by5yZXBsYWNlKC9cbiQvLCIiKS5zcGxpdCgiXG4iKSxzdHlsZTp3LHN0YXJ0aW5nTGluZU51bWJlcjp4fSkpfWZ1bmN0aW9uIGdldElubGluZUxpbmVOdW1iZXIocyxvKXtyZXR1cm57dHlwZToiZWxlbWVudCIsdGFnTmFtZToic3BhbiIscHJvcGVydGllczp7a2V5OiJsaW5lLW51bWJlci0tIi5jb25jYXQocyksY2xhc3NOYW1lOlsiY29tbWVudCIsImxpbmVudW1iZXIiLCJyZWFjdC1zeW50YXgtaGlnaGxpZ2h0ZXItbGluZS1udW1iZXIiXSxzdHlsZTpvfSxjaGlsZHJlbjpbe3R5cGU6InRleHQiLHZhbHVlOnN9XX19ZnVuY3Rpb24gYXNzZW1ibGVMaW5lTnVtYmVyU3R5bGVzKHMsbyxpKXt2YXIgYSx1PXtkaXNwbGF5OiJpbmxpbmUtYmxvY2siLG1pbldpZHRoOihhPWksIiIuY29uY2F0KGEudG9TdHJpbmcoKS5sZW5ndGgsIi4yNWVtIikpLHBhZGRpbmdSaWdodDoiMWVtIix0ZXh0QWxpZ246InJpZ2h0Iix1c2VyU2VsZWN0OiJub25lIn0sXz0iZnVuY3Rpb24iPT10eXBlb2Ygcz9zKG8pOnM7cmV0dXJuIGhpZ2hsaWdodF9vYmplY3RTcHJlYWQoaGlnaGxpZ2h0X29iamVjdFNwcmVhZCh7fSx1KSxfKX1mdW5jdGlvbiBjcmVhdGVMaW5lRWxlbWVudChzKXt2YXIgbz1zLmNoaWxkcmVuLGk9cy5saW5lTnVtYmVyLGE9cy5saW5lTnVtYmVyU3R5bGUsdT1zLmxhcmdlc3RMaW5lTnVtYmVyLF89cy5zaG93SW5saW5lTGluZU51bWJlcnMsdz1zLmxpbmVQcm9wcyx4PXZvaWQgMD09PXc/e306dyxDPXMuY2xhc3NOYW1lLGo9dm9pZCAwPT09Qz9bXTpDLEw9cy5zaG93TGluZU51bWJlcnMsQj1zLndyYXBMb25nTGluZXMsJD1zLndyYXBMaW5lcyxVPXZvaWQgMCE9PSQmJiQ/aGlnaGxpZ2h0X29iamVjdFNwcmVhZCh7fSwiZnVuY3Rpb24iPT10eXBlb2YgeD94KGkpOngpOnt9O2lmKFUuY2xhc3NOYW1lPVUuY2xhc3NOYW1lP1tdLmNvbmNhdCh0b0NvbnN1bWFibGVBcnJheV90b0NvbnN1bWFibGVBcnJheShVLmNsYXNzTmFtZS50cmltKCkuc3BsaXQoL1xzKy8pKSx0b0NvbnN1bWFibGVBcnJheV90b0NvbnN1bWFibGVBcnJheShqKSk6aixpJiZfKXt2YXIgVj1hc3NlbWJsZUxpbmVOdW1iZXJTdHlsZXMoYSxpLHUpO28udW5zaGlmdChnZXRJbmxpbmVMaW5lTnVtYmVyKGksVikpfXJldHVybiBCJkwmJihVLnN0eWxlPWhpZ2hsaWdodF9vYmplY3RTcHJlYWQoe2Rpc3BsYXk6ImZsZXgifSxVLnN0eWxlKSkse3R5cGU6ImVsZW1lbnQiLHRhZ05hbWU6InNwYW4iLHByb3BlcnRpZXM6VSxjaGlsZHJlbjpvfX1mdW5jdGlvbiBmbGF0dGVuQ29kZVRyZWUocyl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOltdLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOltdO3ZvaWQgMD09PXMubGVuZ3RoJiYocz1bc10pO2Zvcih2YXIgYT0wO2E8cy5sZW5ndGg7YSsrKXt2YXIgdT1zW2FdO2lmKCJ0ZXh0Ij09PXUudHlwZSlpLnB1c2goY3JlYXRlTGluZUVsZW1lbnQoe2NoaWxkcmVuOlt1XSxjbGFzc05hbWU6dG9Db25zdW1hYmxlQXJyYXlfdG9Db25zdW1hYmxlQXJyYXkobmV3IFNldChvKSl9KSk7ZWxzZSBpZih1LmNoaWxkcmVuKXt2YXIgXyx3PW8uY29uY2F0KChudWxsPT09KF89dS5wcm9wZXJ0aWVzKXx8dm9pZCAwPT09Xz92b2lkIDA6Xy5jbGFzc05hbWUpfHxbXSk7ZmxhdHRlbkNvZGVUcmVlKHUuY2hpbGRyZW4sdykuZm9yRWFjaCgoZnVuY3Rpb24ocyl7cmV0dXJuIGkucHVzaChzKX0pKX19cmV0dXJuIGl9ZnVuY3Rpb24gcHJvY2Vzc0xpbmVzKHMsbyxpLGEsdSxfLHcseCxDKXt2YXIgaixMPWZsYXR0ZW5Db2RlVHJlZShzLnZhbHVlKSxCPVtdLCQ9LTEsVT0wO2Z1bmN0aW9uIGNyZWF0ZUxpbmUocyxfKXt2YXIgaj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06W107cmV0dXJuIG98fGoubGVuZ3RoPjA/ZnVuY3Rpb24gY3JlYXRlV3JhcHBlZExpbmUocyxfKXtyZXR1cm4gY3JlYXRlTGluZUVsZW1lbnQoe2NoaWxkcmVuOnMsbGluZU51bWJlcjpfLGxpbmVOdW1iZXJTdHlsZTp4LGxhcmdlc3RMaW5lTnVtYmVyOncsc2hvd0lubGluZUxpbmVOdW1iZXJzOnUsbGluZVByb3BzOmksY2xhc3NOYW1lOmFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpbXSxzaG93TGluZU51bWJlcnM6YSx3cmFwTG9uZ0xpbmVzOkMsd3JhcExpbmVzOm99KX0ocyxfLGopOmZ1bmN0aW9uIGNyZWF0ZVVud3JhcHBlZExpbmUocyxvKXtpZihhJiZvJiZ1KXt2YXIgaT1hc3NlbWJsZUxpbmVOdW1iZXJTdHlsZXMoeCxvLHcpO3MudW5zaGlmdChnZXRJbmxpbmVMaW5lTnVtYmVyKG8saSkpfXJldHVybiBzfShzLF8pfWZvcih2YXIgVj1mdW5jdGlvbiBfbG9vcCgpe3ZhciBzPUxbVV0sbz1zLmNoaWxkcmVuWzBdLnZhbHVlLGk9ZnVuY3Rpb24gZ2V0TmV3TGluZXMocyl7cmV0dXJuIHMubWF0Y2goZ08pfShvKTtpZihpKXt2YXIgdT1vLnNwbGl0KCJcbiIpO3UuZm9yRWFjaCgoZnVuY3Rpb24obyxpKXt2YXIgdz1hJiZCLmxlbmd0aCtfLHg9e3R5cGU6InRleHQiLHZhbHVlOiIiLmNvbmNhdChvLCJcbiIpfTtpZigwPT09aSl7dmFyIEM9Y3JlYXRlTGluZShMLnNsaWNlKCQrMSxVKS5jb25jYXQoY3JlYXRlTGluZUVsZW1lbnQoe2NoaWxkcmVuOlt4XSxjbGFzc05hbWU6cy5wcm9wZXJ0aWVzLmNsYXNzTmFtZX0pKSx3KTtCLnB1c2goQyl9ZWxzZSBpZihpPT09dS5sZW5ndGgtMSl7dmFyIGo9TFtVKzFdJiZMW1UrMV0uY2hpbGRyZW4mJkxbVSsxXS5jaGlsZHJlblswXSxWPXt0eXBlOiJ0ZXh0Iix2YWx1ZToiIi5jb25jYXQobyl9O2lmKGope3ZhciB6PWNyZWF0ZUxpbmVFbGVtZW50KHtjaGlsZHJlbjpbVl0sY2xhc3NOYW1lOnMucHJvcGVydGllcy5jbGFzc05hbWV9KTtMLnNwbGljZShVKzEsMCx6KX1lbHNle3ZhciBZPWNyZWF0ZUxpbmUoW1ZdLHcscy5wcm9wZXJ0aWVzLmNsYXNzTmFtZSk7Qi5wdXNoKFkpfX1lbHNle3ZhciBaPWNyZWF0ZUxpbmUoW3hdLHcscy5wcm9wZXJ0aWVzLmNsYXNzTmFtZSk7Qi5wdXNoKFopfX0pKSwkPVV9VSsrfTtVPEwubGVuZ3RoOylWKCk7aWYoJCE9PUwubGVuZ3RoLTEpe3ZhciB6PUwuc2xpY2UoJCsxLEwubGVuZ3RoKTtpZih6JiZ6Lmxlbmd0aCl7dmFyIFk9Y3JlYXRlTGluZSh6LGEmJkIubGVuZ3RoK18pO0IucHVzaChZKX19cmV0dXJuIG8/Qjooaj1bXSkuY29uY2F0LmFwcGx5KGosQil9ZnVuY3Rpb24gZGVmYXVsdFJlbmRlcmVyKHMpe3ZhciBvPXMucm93cyxpPXMuc3R5bGVzaGVldCxhPXMudXNlSW5saW5lU3R5bGVzO3JldHVybiBvLm1hcCgoZnVuY3Rpb24ocyxvKXtyZXR1cm4gY3JlYXRlRWxlbWVudCh7bm9kZTpzLHN0eWxlc2hlZXQ6aSx1c2VJbmxpbmVTdHlsZXM6YSxrZXk6ImNvZGUtc2VnbWVudC0iLmNvbmNhdChvKX0pfSkpfWZ1bmN0aW9uIGlzSGlnaGxpZ2h0SnMocyl7cmV0dXJuIHMmJnZvaWQgMCE9PXMuaGlnaGxpZ2h0QXV0b312YXIgeU89X193ZWJwYWNrX3JlcXVpcmVfXyg0Mzc2OCksdk89ZnVuY3Rpb24gaGlnaGxpZ2h0KHMsbyl7cmV0dXJuIGZ1bmN0aW9uIFN5bnRheEhpZ2hsaWdodGVyKGkpe3ZhciBhLHUsXz1pLmxhbmd1YWdlLHc9aS5jaGlsZHJlbix4PWkuc3R5bGUsQz12b2lkIDA9PT14P286eCxqPWkuY3VzdG9tU3R5bGUsTD12b2lkIDA9PT1qP3t9OmosQj1pLmNvZGVUYWdQcm9wcywkPXZvaWQgMD09PUI/e2NsYXNzTmFtZTpfPyJsYW5ndWFnZS0iLmNvbmNhdChfKTp2b2lkIDAsc3R5bGU6aGlnaGxpZ2h0X29iamVjdFNwcmVhZChoaWdobGlnaHRfb2JqZWN0U3ByZWFkKHt9LENbJ2NvZGVbY2xhc3MqPSJsYW5ndWFnZS0iXSddKSxDWydjb2RlW2NsYXNzKj0ibGFuZ3VhZ2UtJy5jb25jYXQoXywnIl0nKV0pfTpCLFU9aS51c2VJbmxpbmVTdHlsZXMsVj12b2lkIDA9PT1VfHxVLHo9aS5zaG93TGluZU51bWJlcnMsWT12b2lkIDAhPT16JiZ6LFo9aS5zaG93SW5saW5lTGluZU51bWJlcnMsZWU9dm9pZCAwPT09Wnx8WixpZT1pLnN0YXJ0aW5nTGluZU51bWJlcixhZT12b2lkIDA9PT1pZT8xOmllLGNlPWkubGluZU51bWJlckNvbnRhaW5lclN0eWxlLGxlPWkubGluZU51bWJlclN0eWxlLHBlPXZvaWQgMD09PWxlP3t9OmxlLGRlPWkud3JhcExpbmVzLGZlPWkud3JhcExvbmdMaW5lcyx5ZT12b2lkIDAhPT1mZSYmZmUsYmU9aS5saW5lUHJvcHMsU2U9dm9pZCAwPT09YmU/e306YmUsX2U9aS5yZW5kZXJlcix3ZT1pLlByZVRhZyx4ZT12b2lkIDA9PT13ZT8icHJlIjp3ZSxQZT1pLkNvZGVUYWcsVGU9dm9pZCAwPT09UGU/ImNvZGUiOlBlLCRlPWkuY29kZSxxZT12b2lkIDA9PT0kZT8oQXJyYXkuaXNBcnJheSh3KT93WzBdOncpfHwiIjokZSx6ZT1pLmFzdEdlbmVyYXRvcixXZT1mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocyxvKXtpZihudWxsPT1zKXJldHVybnt9O3ZhciBpLGEsdT1mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzLG8pe2lmKG51bGw9PXMpcmV0dXJue307dmFyIGk9e307Zm9yKHZhciBhIGluIHMpaWYoe30uaGFzT3duUHJvcGVydHkuY2FsbChzLGEpKXtpZigtMSE9PW8uaW5kZXhPZihhKSljb250aW51ZTtpW2FdPXNbYV19cmV0dXJuIGl9KHMsbyk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIF89T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTtmb3IoYT0wO2E8Xy5sZW5ndGg7YSsrKWk9X1thXSwtMT09PW8uaW5kZXhPZihpKSYme30ucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLGkpJiYodVtpXT1zW2ldKX1yZXR1cm4gdX0oaSxtTyk7emU9emV8fHM7dmFyIEhlPVk/UmUuY3JlYXRlRWxlbWVudChBbGxMaW5lTnVtYmVycyx7Y29udGFpbmVyU3R5bGU6Y2UsY29kZVN0eWxlOiQuc3R5bGV8fHt9LG51bWJlclN0eWxlOnBlLHN0YXJ0aW5nTGluZU51bWJlcjphZSxjb2RlU3RyaW5nOnFlfSk6bnVsbCxZZT1DLmhsanN8fENbJ3ByZVtjbGFzcyo9Imxhbmd1YWdlLSJdJ118fHtiYWNrZ3JvdW5kQ29sb3I6IiNmZmYifSxYZT1pc0hpZ2hsaWdodEpzKHplKT8iaGxqcyI6InByaXNtanMiLFFlPVY/T2JqZWN0LmFzc2lnbih7fSxXZSx7c3R5bGU6T2JqZWN0LmFzc2lnbih7fSxZZSxMKX0pOk9iamVjdC5hc3NpZ24oe30sV2Use2NsYXNzTmFtZTpXZS5jbGFzc05hbWU/IiIuY29uY2F0KFhlLCIgIikuY29uY2F0KFdlLmNsYXNzTmFtZSk6WGUsc3R5bGU6T2JqZWN0LmFzc2lnbih7fSxMKX0pO2lmKCQuc3R5bGU9aGlnaGxpZ2h0X29iamVjdFNwcmVhZCh5ZT97d2hpdGVTcGFjZToicHJlLXdyYXAifTp7d2hpdGVTcGFjZToicHJlIn0sJC5zdHlsZSksIXplKXJldHVybiBSZS5jcmVhdGVFbGVtZW50KHhlLFFlLEhlLFJlLmNyZWF0ZUVsZW1lbnQoVGUsJCxxZSkpOyh2b2lkIDA9PT1kZSYmX2V8fHllKSYmKGRlPSEwKSxfZT1fZXx8ZGVmYXVsdFJlbmRlcmVyO3ZhciBldD1be3R5cGU6InRleHQiLHZhbHVlOnFlfV0sdHQ9ZnVuY3Rpb24gZ2V0Q29kZVRyZWUocyl7dmFyIG89cy5hc3RHZW5lcmF0b3IsaT1zLmxhbmd1YWdlLGE9cy5jb2RlLHU9cy5kZWZhdWx0Q29kZVZhbHVlO2lmKGlzSGlnaGxpZ2h0SnMobykpe3ZhciBfPWZ1bmN0aW9uKHMsbyl7cmV0dXJuLTEhPT1zLmxpc3RMYW5ndWFnZXMoKS5pbmRleE9mKG8pfShvLGkpO3JldHVybiJ0ZXh0Ij09PWk/e3ZhbHVlOnUsbGFuZ3VhZ2U6InRleHQifTpfP28uaGlnaGxpZ2h0KGksYSk6by5oaWdobGlnaHRBdXRvKGEpfXRyeXtyZXR1cm4gaSYmInRleHQiIT09aT97dmFsdWU6by5oaWdobGlnaHQoYSxpKX06e3ZhbHVlOnV9fWNhdGNoKHMpe3JldHVybnt2YWx1ZTp1fX19KHthc3RHZW5lcmF0b3I6emUsbGFuZ3VhZ2U6Xyxjb2RlOnFlLGRlZmF1bHRDb2RlVmFsdWU6ZXR9KTtudWxsPT09dHQubGFuZ3VhZ2UmJih0dC52YWx1ZT1ldCk7dmFyIHJ0PXByb2Nlc3NMaW5lcyh0dCxkZSxTZSxZLGVlLGFlLGFlKyhudWxsIT09KGE9bnVsbD09PSh1PXFlLm1hdGNoKC9cbi9nKSl8fHZvaWQgMD09PXU/dm9pZCAwOnUubGVuZ3RoKSYmdm9pZCAwIT09YT9hOjApLHBlLHllKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCh4ZSxRZSxSZS5jcmVhdGVFbGVtZW50KFRlLCQsIWVlJiZIZSxfZSh7cm93czpydCxzdHlsZXNoZWV0OkMsdXNlSW5saW5lU3R5bGVzOlZ9KSkpfX0oeU8se30pO3ZPLnJlZ2lzdGVyTGFuZ3VhZ2U9eU8ucmVnaXN0ZXJMYW5ndWFnZTtjb25zdCBiTz12Tzt2YXIgU089X193ZWJwYWNrX3JlcXVpcmVfXyg5NTA4OSk7Y29uc3QgX089X193ZWJwYWNrX3JlcXVpcmVfXy5uKFNPKSgpO3ZhciBFTz1fX3dlYnBhY2tfcmVxdWlyZV9fKDY1NzcyKTtjb25zdCB3Tz1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oRU8pKCk7dmFyIHhPPV9fd2VicGFja19yZXF1aXJlX18oMTcyODUpO2NvbnN0IGtPPV9fd2VicGFja19yZXF1aXJlX18ubih4TykoKTt2YXIgT089X193ZWJwYWNrX3JlcXVpcmVfXygzNTM0NCk7Y29uc3QgQU89X193ZWJwYWNrX3JlcXVpcmVfXy5uKE9PKSgpO3ZhciBDTz1fX3dlYnBhY2tfcmVxdWlyZV9fKDE3NTMzKTtjb25zdCBqTz1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oQ08pKCk7dmFyIFBPPV9fd2VicGFja19yZXF1aXJlX18oNzM0MDIpO2NvbnN0IElPPV9fd2VicGFja19yZXF1aXJlX18ubihQTykoKTt2YXIgVE89X193ZWJwYWNrX3JlcXVpcmVfXygyNjU3MSk7Y29uc3QgTk89X193ZWJwYWNrX3JlcXVpcmVfXy5uKFRPKSgpLGFmdGVyX2xvYWQ9KCk9PntiTy5yZWdpc3Rlckxhbmd1YWdlKCJqc29uIix3TyksYk8ucmVnaXN0ZXJMYW5ndWFnZSgianMiLF9PKSxiTy5yZWdpc3Rlckxhbmd1YWdlKCJ4bWwiLGtPKSxiTy5yZWdpc3Rlckxhbmd1YWdlKCJ5YW1sIixqTyksYk8ucmVnaXN0ZXJMYW5ndWFnZSgiaHR0cCIsSU8pLGJPLnJlZ2lzdGVyTGFuZ3VhZ2UoImJhc2giLEFPKSxiTy5yZWdpc3Rlckxhbmd1YWdlKCJwb3dlcnNoZWxsIixOTyksYk8ucmVnaXN0ZXJMYW5ndWFnZSgiamF2YXNjcmlwdCIsX08pfSxNTz17aGxqczp7ZGlzcGxheToiYmxvY2siLG92ZXJmbG93WDoiYXV0byIscGFkZGluZzoiMC41ZW0iLGJhY2tncm91bmQ6IiMzMzMiLGNvbG9yOiJ3aGl0ZSJ9LCJobGpzLW5hbWUiOntmb250V2VpZ2h0OiJib2xkIn0sImhsanMtc3Ryb25nIjp7Zm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLWNvZGUiOntmb250U3R5bGU6Iml0YWxpYyIsY29sb3I6IiM4ODgifSwiaGxqcy1lbXBoYXNpcyI6e2ZvbnRTdHlsZToiaXRhbGljIn0sImhsanMtdGFnIjp7Y29sb3I6IiM2MmM4ZjMifSwiaGxqcy12YXJpYWJsZSI6e2NvbG9yOiIjYWRlNWZjIn0sImhsanMtdGVtcGxhdGUtdmFyaWFibGUiOntjb2xvcjoiI2FkZTVmYyJ9LCJobGpzLXNlbGVjdG9yLWlkIjp7Y29sb3I6IiNhZGU1ZmMifSwiaGxqcy1zZWxlY3Rvci1jbGFzcyI6e2NvbG9yOiIjYWRlNWZjIn0sImhsanMtc3RyaW5nIjp7Y29sb3I6IiNhMmZjYTIifSwiaGxqcy1idWxsZXQiOntjb2xvcjoiI2QzNjM2MyJ9LCJobGpzLXR5cGUiOntjb2xvcjoiI2ZmYSJ9LCJobGpzLXRpdGxlIjp7Y29sb3I6IiNmZmEifSwiaGxqcy1zZWN0aW9uIjp7Y29sb3I6IiNmZmEifSwiaGxqcy1hdHRyaWJ1dGUiOntjb2xvcjoiI2ZmYSJ9LCJobGpzLXF1b3RlIjp7Y29sb3I6IiNmZmEifSwiaGxqcy1idWlsdF9pbiI6e2NvbG9yOiIjZmZhIn0sImhsanMtYnVpbHRpbi1uYW1lIjp7Y29sb3I6IiNmZmEifSwiaGxqcy1udW1iZXIiOntjb2xvcjoiI2QzNjM2MyJ9LCJobGpzLXN5bWJvbCI6e2NvbG9yOiIjZDM2MzYzIn0sImhsanMta2V5d29yZCI6e2NvbG9yOiIjZmNjMjhjIn0sImhsanMtc2VsZWN0b3ItdGFnIjp7Y29sb3I6IiNmY2MyOGMifSwiaGxqcy1saXRlcmFsIjp7Y29sb3I6IiNmY2MyOGMifSwiaGxqcy1jb21tZW50Ijp7Y29sb3I6IiM4ODgifSwiaGxqcy1kZWxldGlvbiI6e2NvbG9yOiIjMzMzIixiYWNrZ3JvdW5kQ29sb3I6IiNmYzliOWIifSwiaGxqcy1yZWdleHAiOntjb2xvcjoiI2M2YjRmMCJ9LCJobGpzLWxpbmsiOntjb2xvcjoiI2M2YjRmMCJ9LCJobGpzLW1ldGEiOntjb2xvcjoiI2ZjOWI5YiJ9LCJobGpzLWFkZGl0aW9uIjp7YmFja2dyb3VuZENvbG9yOiIjYTJmY2EyIixjb2xvcjoiIzMzMyJ9fSxSTz17YWdhdGU6TU8sYXJ0YTp7aGxqczp7ZGlzcGxheToiYmxvY2siLG92ZXJmbG93WDoiYXV0byIscGFkZGluZzoiMC41ZW0iLGJhY2tncm91bmQ6IiMyMjIiLGNvbG9yOiIjYWFhIn0sImhsanMtc3Vic3QiOntjb2xvcjoiI2FhYSJ9LCJobGpzLXNlY3Rpb24iOntjb2xvcjoiI2ZmZiIsZm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLWNvbW1lbnQiOntjb2xvcjoiIzQ0NCJ9LCJobGpzLXF1b3RlIjp7Y29sb3I6IiM0NDQifSwiaGxqcy1tZXRhIjp7Y29sb3I6IiM0NDQifSwiaGxqcy1zdHJpbmciOntjb2xvcjoiI2ZmY2MzMyJ9LCJobGpzLXN5bWJvbCI6e2NvbG9yOiIjZmZjYzMzIn0sImhsanMtYnVsbGV0Ijp7Y29sb3I6IiNmZmNjMzMifSwiaGxqcy1yZWdleHAiOntjb2xvcjoiI2ZmY2MzMyJ9LCJobGpzLW51bWJlciI6e2NvbG9yOiIjMDBjYzY2In0sImhsanMtYWRkaXRpb24iOntjb2xvcjoiIzAwY2M2NiJ9LCJobGpzLWJ1aWx0X2luIjp7Y29sb3I6IiMzMmFhZWUifSwiaGxqcy1idWlsdGluLW5hbWUiOntjb2xvcjoiIzMyYWFlZSJ9LCJobGpzLWxpdGVyYWwiOntjb2xvcjoiIzMyYWFlZSJ9LCJobGpzLXR5cGUiOntjb2xvcjoiIzMyYWFlZSJ9LCJobGpzLXRlbXBsYXRlLXZhcmlhYmxlIjp7Y29sb3I6IiMzMmFhZWUifSwiaGxqcy1hdHRyaWJ1dGUiOntjb2xvcjoiIzMyYWFlZSJ9LCJobGpzLWxpbmsiOntjb2xvcjoiIzMyYWFlZSJ9LCJobGpzLWtleXdvcmQiOntjb2xvcjoiIzY2NDRhYSJ9LCJobGpzLXNlbGVjdG9yLXRhZyI6e2NvbG9yOiIjNjY0NGFhIn0sImhsanMtbmFtZSI6e2NvbG9yOiIjNjY0NGFhIn0sImhsanMtc2VsZWN0b3ItaWQiOntjb2xvcjoiIzY2NDRhYSJ9LCJobGpzLXNlbGVjdG9yLWNsYXNzIjp7Y29sb3I6IiM2NjQ0YWEifSwiaGxqcy10aXRsZSI6e2NvbG9yOiIjYmIxMTY2In0sImhsanMtdmFyaWFibGUiOntjb2xvcjoiI2JiMTE2NiJ9LCJobGpzLWRlbGV0aW9uIjp7Y29sb3I6IiNiYjExNjYifSwiaGxqcy10ZW1wbGF0ZS10YWciOntjb2xvcjoiI2JiMTE2NiJ9LCJobGpzLWRvY3RhZyI6e2ZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1zdHJvbmciOntmb250V2VpZ2h0OiJib2xkIn0sImhsanMtZW1waGFzaXMiOntmb250U3R5bGU6Iml0YWxpYyJ9fSxtb25va2FpOntobGpzOntkaXNwbGF5OiJibG9jayIsb3ZlcmZsb3dYOiJhdXRvIixwYWRkaW5nOiIwLjVlbSIsYmFja2dyb3VuZDoiIzI3MjgyMiIsY29sb3I6IiNkZGQifSwiaGxqcy10YWciOntjb2xvcjoiI2Y5MjY3MiJ9LCJobGpzLWtleXdvcmQiOntjb2xvcjoiI2Y5MjY3MiIsZm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLXNlbGVjdG9yLXRhZyI6e2NvbG9yOiIjZjkyNjcyIixmb250V2VpZ2h0OiJib2xkIn0sImhsanMtbGl0ZXJhbCI6e2NvbG9yOiIjZjkyNjcyIixmb250V2VpZ2h0OiJib2xkIn0sImhsanMtc3Ryb25nIjp7Y29sb3I6IiNmOTI2NzIifSwiaGxqcy1uYW1lIjp7Y29sb3I6IiNmOTI2NzIifSwiaGxqcy1jb2RlIjp7Y29sb3I6IiM2NmQ5ZWYifSwiaGxqcy1jbGFzcyAuaGxqcy10aXRsZSI6e2NvbG9yOiJ3aGl0ZSJ9LCJobGpzLWF0dHJpYnV0ZSI6e2NvbG9yOiIjYmY3OWRiIn0sImhsanMtc3ltYm9sIjp7Y29sb3I6IiNiZjc5ZGIifSwiaGxqcy1yZWdleHAiOntjb2xvcjoiI2JmNzlkYiJ9LCJobGpzLWxpbmsiOntjb2xvcjoiI2JmNzlkYiJ9LCJobGpzLXN0cmluZyI6e2NvbG9yOiIjYTZlMjJlIn0sImhsanMtYnVsbGV0Ijp7Y29sb3I6IiNhNmUyMmUifSwiaGxqcy1zdWJzdCI6e2NvbG9yOiIjYTZlMjJlIn0sImhsanMtdGl0bGUiOntjb2xvcjoiI2E2ZTIyZSIsZm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLXNlY3Rpb24iOntjb2xvcjoiI2E2ZTIyZSIsZm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLWVtcGhhc2lzIjp7Y29sb3I6IiNhNmUyMmUifSwiaGxqcy10eXBlIjp7Y29sb3I6IiNhNmUyMmUiLGZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1idWlsdF9pbiI6e2NvbG9yOiIjYTZlMjJlIn0sImhsanMtYnVpbHRpbi1uYW1lIjp7Y29sb3I6IiNhNmUyMmUifSwiaGxqcy1zZWxlY3Rvci1hdHRyIjp7Y29sb3I6IiNhNmUyMmUifSwiaGxqcy1zZWxlY3Rvci1wc2V1ZG8iOntjb2xvcjoiI2E2ZTIyZSJ9LCJobGpzLWFkZGl0aW9uIjp7Y29sb3I6IiNhNmUyMmUifSwiaGxqcy12YXJpYWJsZSI6e2NvbG9yOiIjYTZlMjJlIn0sImhsanMtdGVtcGxhdGUtdGFnIjp7Y29sb3I6IiNhNmUyMmUifSwiaGxqcy10ZW1wbGF0ZS12YXJpYWJsZSI6e2NvbG9yOiIjYTZlMjJlIn0sImhsanMtY29tbWVudCI6e2NvbG9yOiIjNzU3MTVlIn0sImhsanMtcXVvdGUiOntjb2xvcjoiIzc1NzE1ZSJ9LCJobGpzLWRlbGV0aW9uIjp7Y29sb3I6IiM3NTcxNWUifSwiaGxqcy1tZXRhIjp7Y29sb3I6IiM3NTcxNWUifSwiaGxqcy1kb2N0YWciOntmb250V2VpZ2h0OiJib2xkIn0sImhsanMtc2VsZWN0b3ItaWQiOntmb250V2VpZ2h0OiJib2xkIn19LG5vcmQ6e2hsanM6e2Rpc3BsYXk6ImJsb2NrIixvdmVyZmxvd1g6ImF1dG8iLHBhZGRpbmc6IjAuNWVtIixiYWNrZ3JvdW5kOiIjMkUzNDQwIixjb2xvcjoiI0Q4REVFOSJ9LCJobGpzLXN1YnN0Ijp7Y29sb3I6IiNEOERFRTkifSwiaGxqcy1zZWxlY3Rvci10YWciOntjb2xvcjoiIzgxQTFDMSJ9LCJobGpzLXNlbGVjdG9yLWlkIjp7Y29sb3I6IiM4RkJDQkIiLGZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1zZWxlY3Rvci1jbGFzcyI6e2NvbG9yOiIjOEZCQ0JCIn0sImhsanMtc2VsZWN0b3ItYXR0ciI6e2NvbG9yOiIjOEZCQ0JCIn0sImhsanMtc2VsZWN0b3ItcHNldWRvIjp7Y29sb3I6IiM4OEMwRDAifSwiaGxqcy1hZGRpdGlvbiI6e2JhY2tncm91bmRDb2xvcjoicmdiYSgxNjMsIDE5MCwgMTQwLCAwLjUpIn0sImhsanMtZGVsZXRpb24iOntiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMTkxLCA5NywgMTA2LCAwLjUpIn0sImhsanMtYnVpbHRfaW4iOntjb2xvcjoiIzhGQkNCQiJ9LCJobGpzLXR5cGUiOntjb2xvcjoiIzhGQkNCQiJ9LCJobGpzLWNsYXNzIjp7Y29sb3I6IiM4RkJDQkIifSwiaGxqcy1mdW5jdGlvbiI6e2NvbG9yOiIjODhDMEQwIn0sImhsanMtZnVuY3Rpb24gPiAuaGxqcy10aXRsZSI6e2NvbG9yOiIjODhDMEQwIn0sImhsanMta2V5d29yZCI6e2NvbG9yOiIjODFBMUMxIn0sImhsanMtbGl0ZXJhbCI6e2NvbG9yOiIjODFBMUMxIn0sImhsanMtc3ltYm9sIjp7Y29sb3I6IiM4MUExQzEifSwiaGxqcy1udW1iZXIiOntjb2xvcjoiI0I0OEVBRCJ9LCJobGpzLXJlZ2V4cCI6e2NvbG9yOiIjRUJDQjhCIn0sImhsanMtc3RyaW5nIjp7Y29sb3I6IiNBM0JFOEMifSwiaGxqcy10aXRsZSI6e2NvbG9yOiIjOEZCQ0JCIn0sImhsanMtcGFyYW1zIjp7Y29sb3I6IiNEOERFRTkifSwiaGxqcy1idWxsZXQiOntjb2xvcjoiIzgxQTFDMSJ9LCJobGpzLWNvZGUiOntjb2xvcjoiIzhGQkNCQiJ9LCJobGpzLWVtcGhhc2lzIjp7Zm9udFN0eWxlOiJpdGFsaWMifSwiaGxqcy1mb3JtdWxhIjp7Y29sb3I6IiM4RkJDQkIifSwiaGxqcy1zdHJvbmciOntmb250V2VpZ2h0OiJib2xkIn0sImhsanMtbGluazpob3ZlciI6e3RleHREZWNvcmF0aW9uOiJ1bmRlcmxpbmUifSwiaGxqcy1xdW90ZSI6e2NvbG9yOiIjNEM1NjZBIn0sImhsanMtY29tbWVudCI6e2NvbG9yOiIjNEM1NjZBIn0sImhsanMtZG9jdGFnIjp7Y29sb3I6IiM4RkJDQkIifSwiaGxqcy1tZXRhIjp7Y29sb3I6IiM1RTgxQUMifSwiaGxqcy1tZXRhLWtleXdvcmQiOntjb2xvcjoiIzVFODFBQyJ9LCJobGpzLW1ldGEtc3RyaW5nIjp7Y29sb3I6IiNBM0JFOEMifSwiaGxqcy1hdHRyIjp7Y29sb3I6IiM4RkJDQkIifSwiaGxqcy1hdHRyaWJ1dGUiOntjb2xvcjoiI0Q4REVFOSJ9LCJobGpzLWJ1aWx0aW4tbmFtZSI6e2NvbG9yOiIjODFBMUMxIn0sImhsanMtbmFtZSI6e2NvbG9yOiIjODFBMUMxIn0sImhsanMtc2VjdGlvbiI6e2NvbG9yOiIjODhDMEQwIn0sImhsanMtdGFnIjp7Y29sb3I6IiM4MUExQzEifSwiaGxqcy12YXJpYWJsZSI6e2NvbG9yOiIjRDhERUU5In0sImhsanMtdGVtcGxhdGUtdmFyaWFibGUiOntjb2xvcjoiI0Q4REVFOSJ9LCJobGpzLXRlbXBsYXRlLXRhZyI6e2NvbG9yOiIjNUU4MUFDIn0sImFibmYgLmhsanMtYXR0cmlidXRlIjp7Y29sb3I6IiM4OEMwRDAifSwiYWJuZiAuaGxqcy1zeW1ib2wiOntjb2xvcjoiI0VCQ0I4QiJ9LCJhcGFjaGUgLmhsanMtYXR0cmlidXRlIjp7Y29sb3I6IiM4OEMwRDAifSwiYXBhY2hlIC5obGpzLXNlY3Rpb24iOntjb2xvcjoiIzgxQTFDMSJ9LCJhcmR1aW5vIC5obGpzLWJ1aWx0X2luIjp7Y29sb3I6IiM4OEMwRDAifSwiYXNwZWN0aiAuaGxqcy1tZXRhIjp7Y29sb3I6IiNEMDg3NzAifSwiYXNwZWN0aiA+IC5obGpzLXRpdGxlIjp7Y29sb3I6IiM4OEMwRDAifSwiYm5mIC5obGpzLWF0dHJpYnV0ZSI6e2NvbG9yOiIjOEZCQ0JCIn0sImNsb2p1cmUgLmhsanMtbmFtZSI6e2NvbG9yOiIjODhDMEQwIn0sImNsb2p1cmUgLmhsanMtc3ltYm9sIjp7Y29sb3I6IiNFQkNCOEIifSwiY29xIC5obGpzLWJ1aWx0X2luIjp7Y29sb3I6IiM4OEMwRDAifSwiY3BwIC5obGpzLW1ldGEtc3RyaW5nIjp7Y29sb3I6IiM4RkJDQkIifSwiY3NzIC5obGpzLWJ1aWx0X2luIjp7Y29sb3I6IiM4OEMwRDAifSwiY3NzIC5obGpzLWtleXdvcmQiOntjb2xvcjoiI0QwODc3MCJ9LCJkaWZmIC5obGpzLW1ldGEiOntjb2xvcjoiIzhGQkNCQiJ9LCJlYm5mIC5obGpzLWF0dHJpYnV0ZSI6e2NvbG9yOiIjOEZCQ0JCIn0sImdsc2wgLmhsanMtYnVpbHRfaW4iOntjb2xvcjoiIzg4QzBEMCJ9LCJncm9vdnkgLmhsanMtbWV0YTpub3QoOmZpcnN0LWNoaWxkKSI6e2NvbG9yOiIjRDA4NzcwIn0sImhheGUgLmhsanMtbWV0YSI6e2NvbG9yOiIjRDA4NzcwIn0sImphdmEgLmhsanMtbWV0YSI6e2NvbG9yOiIjRDA4NzcwIn0sImxkaWYgLmhsanMtYXR0cmlidXRlIjp7Y29sb3I6IiM4RkJDQkIifSwibGlzcCAuaGxqcy1uYW1lIjp7Y29sb3I6IiM4OEMwRDAifSwibHVhIC5obGpzLWJ1aWx0X2luIjp7Y29sb3I6IiM4OEMwRDAifSwibW9vbnNjcmlwdCAuaGxqcy1idWlsdF9pbiI6e2NvbG9yOiIjODhDMEQwIn0sIm5naW54IC5obGpzLWF0dHJpYnV0ZSI6e2NvbG9yOiIjODhDMEQwIn0sIm5naW54IC5obGpzLXNlY3Rpb24iOntjb2xvcjoiIzVFODFBQyJ9LCJwZiAuaGxqcy1idWlsdF9pbiI6e2NvbG9yOiIjODhDMEQwIn0sInByb2Nlc3NpbmcgLmhsanMtYnVpbHRfaW4iOntjb2xvcjoiIzg4QzBEMCJ9LCJzY3NzIC5obGpzLWtleXdvcmQiOntjb2xvcjoiIzgxQTFDMSJ9LCJzdHlsdXMgLmhsanMta2V5d29yZCI6e2NvbG9yOiIjODFBMUMxIn0sInN3aWZ0IC5obGpzLW1ldGEiOntjb2xvcjoiI0QwODc3MCJ9LCJ2aW0gLmhsanMtYnVpbHRfaW4iOntjb2xvcjoiIzg4QzBEMCIsZm9udFN0eWxlOiJpdGFsaWMifSwieWFtbCAuaGxqcy1tZXRhIjp7Y29sb3I6IiNEMDg3NzAifX0sb2JzaWRpYW46e2hsanM6e2Rpc3BsYXk6ImJsb2NrIixvdmVyZmxvd1g6ImF1dG8iLHBhZGRpbmc6IjAuNWVtIixiYWNrZ3JvdW5kOiIjMjgyYjJlIixjb2xvcjoiI2UwZTJlNCJ9LCJobGpzLWtleXdvcmQiOntjb2xvcjoiIzkzYzc2MyIsZm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLXNlbGVjdG9yLXRhZyI6e2NvbG9yOiIjOTNjNzYzIixmb250V2VpZ2h0OiJib2xkIn0sImhsanMtbGl0ZXJhbCI6e2NvbG9yOiIjOTNjNzYzIixmb250V2VpZ2h0OiJib2xkIn0sImhsanMtc2VsZWN0b3ItaWQiOntjb2xvcjoiIzkzYzc2MyJ9LCJobGpzLW51bWJlciI6e2NvbG9yOiIjZmZjZDIyIn0sImhsanMtYXR0cmlidXRlIjp7Y29sb3I6IiM2NjhiYjAifSwiaGxqcy1jb2RlIjp7Y29sb3I6IndoaXRlIn0sImhsanMtY2xhc3MgLmhsanMtdGl0bGUiOntjb2xvcjoid2hpdGUifSwiaGxqcy1zZWN0aW9uIjp7Y29sb3I6IndoaXRlIixmb250V2VpZ2h0OiJib2xkIn0sImhsanMtcmVnZXhwIjp7Y29sb3I6IiNkMzk3NDUifSwiaGxqcy1saW5rIjp7Y29sb3I6IiNkMzk3NDUifSwiaGxqcy1tZXRhIjp7Y29sb3I6IiM1NTcxODIifSwiaGxqcy10YWciOntjb2xvcjoiIzhjYmJhZCJ9LCJobGpzLW5hbWUiOntjb2xvcjoiIzhjYmJhZCIsZm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLWJ1bGxldCI6e2NvbG9yOiIjOGNiYmFkIn0sImhsanMtc3Vic3QiOntjb2xvcjoiIzhjYmJhZCJ9LCJobGpzLWVtcGhhc2lzIjp7Y29sb3I6IiM4Y2JiYWQifSwiaGxqcy10eXBlIjp7Y29sb3I6IiM4Y2JiYWQiLGZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1idWlsdF9pbiI6e2NvbG9yOiIjOGNiYmFkIn0sImhsanMtc2VsZWN0b3ItYXR0ciI6e2NvbG9yOiIjOGNiYmFkIn0sImhsanMtc2VsZWN0b3ItcHNldWRvIjp7Y29sb3I6IiM4Y2JiYWQifSwiaGxqcy1hZGRpdGlvbiI6e2NvbG9yOiIjOGNiYmFkIn0sImhsanMtdmFyaWFibGUiOntjb2xvcjoiIzhjYmJhZCJ9LCJobGpzLXRlbXBsYXRlLXRhZyI6e2NvbG9yOiIjOGNiYmFkIn0sImhsanMtdGVtcGxhdGUtdmFyaWFibGUiOntjb2xvcjoiIzhjYmJhZCJ9LCJobGpzLXN0cmluZyI6e2NvbG9yOiIjZWM3NjAwIn0sImhsanMtc3ltYm9sIjp7Y29sb3I6IiNlYzc2MDAifSwiaGxqcy1jb21tZW50Ijp7Y29sb3I6IiM4MThlOTYifSwiaGxqcy1xdW90ZSI6e2NvbG9yOiIjODE4ZTk2In0sImhsanMtZGVsZXRpb24iOntjb2xvcjoiIzgxOGU5NiJ9LCJobGpzLXNlbGVjdG9yLWNsYXNzIjp7Y29sb3I6IiNBMDgyQkQifSwiaGxqcy1kb2N0YWciOntmb250V2VpZ2h0OiJib2xkIn0sImhsanMtdGl0bGUiOntmb250V2VpZ2h0OiJib2xkIn0sImhsanMtc3Ryb25nIjp7Zm9udFdlaWdodDoiYm9sZCJ9fSwidG9tb3Jyb3ctbmlnaHQiOnsiaGxqcy1jb21tZW50Ijp7Y29sb3I6IiM5Njk4OTYifSwiaGxqcy1xdW90ZSI6e2NvbG9yOiIjOTY5ODk2In0sImhsanMtdmFyaWFibGUiOntjb2xvcjoiI2NjNjY2NiJ9LCJobGpzLXRlbXBsYXRlLXZhcmlhYmxlIjp7Y29sb3I6IiNjYzY2NjYifSwiaGxqcy10YWciOntjb2xvcjoiI2NjNjY2NiJ9LCJobGpzLW5hbWUiOntjb2xvcjoiI2NjNjY2NiJ9LCJobGpzLXNlbGVjdG9yLWlkIjp7Y29sb3I6IiNjYzY2NjYifSwiaGxqcy1zZWxlY3Rvci1jbGFzcyI6e2NvbG9yOiIjY2M2NjY2In0sImhsanMtcmVnZXhwIjp7Y29sb3I6IiNjYzY2NjYifSwiaGxqcy1kZWxldGlvbiI6e2NvbG9yOiIjY2M2NjY2In0sImhsanMtbnVtYmVyIjp7Y29sb3I6IiNkZTkzNWYifSwiaGxqcy1idWlsdF9pbiI6e2NvbG9yOiIjZGU5MzVmIn0sImhsanMtYnVpbHRpbi1uYW1lIjp7Y29sb3I6IiNkZTkzNWYifSwiaGxqcy1saXRlcmFsIjp7Y29sb3I6IiNkZTkzNWYifSwiaGxqcy10eXBlIjp7Y29sb3I6IiNkZTkzNWYifSwiaGxqcy1wYXJhbXMiOntjb2xvcjoiI2RlOTM1ZiJ9LCJobGpzLW1ldGEiOntjb2xvcjoiI2RlOTM1ZiJ9LCJobGpzLWxpbmsiOntjb2xvcjoiI2RlOTM1ZiJ9LCJobGpzLWF0dHJpYnV0ZSI6e2NvbG9yOiIjZjBjNjc0In0sImhsanMtc3RyaW5nIjp7Y29sb3I6IiNiNWJkNjgifSwiaGxqcy1zeW1ib2wiOntjb2xvcjoiI2I1YmQ2OCJ9LCJobGpzLWJ1bGxldCI6e2NvbG9yOiIjYjViZDY4In0sImhsanMtYWRkaXRpb24iOntjb2xvcjoiI2I1YmQ2OCJ9LCJobGpzLXRpdGxlIjp7Y29sb3I6IiM4MWEyYmUifSwiaGxqcy1zZWN0aW9uIjp7Y29sb3I6IiM4MWEyYmUifSwiaGxqcy1rZXl3b3JkIjp7Y29sb3I6IiNiMjk0YmIifSwiaGxqcy1zZWxlY3Rvci10YWciOntjb2xvcjoiI2IyOTRiYiJ9LGhsanM6e2Rpc3BsYXk6ImJsb2NrIixvdmVyZmxvd1g6ImF1dG8iLGJhY2tncm91bmQ6IiMxZDFmMjEiLGNvbG9yOiIjYzVjOGM2IixwYWRkaW5nOiIwLjVlbSJ9LCJobGpzLWVtcGhhc2lzIjp7Zm9udFN0eWxlOiJpdGFsaWMifSwiaGxqcy1zdHJvbmciOntmb250V2VpZ2h0OiJib2xkIn19LGlkZWE6e2hsanM6e2Rpc3BsYXk6ImJsb2NrIixvdmVyZmxvd1g6ImF1dG8iLHBhZGRpbmc6IjAuNWVtIixjb2xvcjoiIzAwMCIsYmFja2dyb3VuZDoiI2ZmZiJ9LCJobGpzLXN1YnN0Ijp7Zm9udFdlaWdodDoibm9ybWFsIixjb2xvcjoiIzAwMCJ9LCJobGpzLXRpdGxlIjp7Zm9udFdlaWdodDoibm9ybWFsIixjb2xvcjoiIzAwMCJ9LCJobGpzLWNvbW1lbnQiOntjb2xvcjoiIzgwODA4MCIsZm9udFN0eWxlOiJpdGFsaWMifSwiaGxqcy1xdW90ZSI6e2NvbG9yOiIjODA4MDgwIixmb250U3R5bGU6Iml0YWxpYyJ9LCJobGpzLW1ldGEiOntjb2xvcjoiIzgwODAwMCJ9LCJobGpzLXRhZyI6e2JhY2tncm91bmQ6IiNlZmVmZWYifSwiaGxqcy1zZWN0aW9uIjp7Zm9udFdlaWdodDoiYm9sZCIsY29sb3I6IiMwMDAwODAifSwiaGxqcy1uYW1lIjp7Zm9udFdlaWdodDoiYm9sZCIsY29sb3I6IiMwMDAwODAifSwiaGxqcy1saXRlcmFsIjp7Zm9udFdlaWdodDoiYm9sZCIsY29sb3I6IiMwMDAwODAifSwiaGxqcy1rZXl3b3JkIjp7Zm9udFdlaWdodDoiYm9sZCIsY29sb3I6IiMwMDAwODAifSwiaGxqcy1zZWxlY3Rvci10YWciOntmb250V2VpZ2h0OiJib2xkIixjb2xvcjoiIzAwMDA4MCJ9LCJobGpzLXR5cGUiOntmb250V2VpZ2h0OiJib2xkIixjb2xvcjoiIzAwMDA4MCJ9LCJobGpzLXNlbGVjdG9yLWlkIjp7Zm9udFdlaWdodDoiYm9sZCIsY29sb3I6IiMwMDAwODAifSwiaGxqcy1zZWxlY3Rvci1jbGFzcyI6e2ZvbnRXZWlnaHQ6ImJvbGQiLGNvbG9yOiIjMDAwMDgwIn0sImhsanMtYXR0cmlidXRlIjp7Zm9udFdlaWdodDoiYm9sZCIsY29sb3I6IiMwMDAwZmYifSwiaGxqcy1udW1iZXIiOntmb250V2VpZ2h0OiJub3JtYWwiLGNvbG9yOiIjMDAwMGZmIn0sImhsanMtcmVnZXhwIjp7Zm9udFdlaWdodDoibm9ybWFsIixjb2xvcjoiIzAwMDBmZiJ9LCJobGpzLWxpbmsiOntmb250V2VpZ2h0OiJub3JtYWwiLGNvbG9yOiIjMDAwMGZmIn0sImhsanMtc3RyaW5nIjp7Y29sb3I6IiMwMDgwMDAiLGZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1zeW1ib2wiOntjb2xvcjoiIzAwMCIsYmFja2dyb3VuZDoiI2QwZWRlZCIsZm9udFN0eWxlOiJpdGFsaWMifSwiaGxqcy1idWxsZXQiOntjb2xvcjoiIzAwMCIsYmFja2dyb3VuZDoiI2QwZWRlZCIsZm9udFN0eWxlOiJpdGFsaWMifSwiaGxqcy1mb3JtdWxhIjp7Y29sb3I6IiMwMDAiLGJhY2tncm91bmQ6IiNkMGVkZWQiLGZvbnRTdHlsZToiaXRhbGljIn0sImhsanMtZG9jdGFnIjp7dGV4dERlY29yYXRpb246InVuZGVybGluZSJ9LCJobGpzLXZhcmlhYmxlIjp7Y29sb3I6IiM2NjBlN2EifSwiaGxqcy10ZW1wbGF0ZS12YXJpYWJsZSI6e2NvbG9yOiIjNjYwZTdhIn0sImhsanMtYWRkaXRpb24iOntiYWNrZ3JvdW5kOiIjYmFlZWJhIn0sImhsanMtZGVsZXRpb24iOntiYWNrZ3JvdW5kOiIjZmZjOGJkIn0sImhsanMtZW1waGFzaXMiOntmb250U3R5bGU6Iml0YWxpYyJ9LCJobGpzLXN0cm9uZyI6e2ZvbnRXZWlnaHQ6ImJvbGQifX19LERPPU1PLGNvbXBvbmVudHNfU3ludGF4SGlnaGxpZ2h0ZXI9KHtsYW5ndWFnZTpzLGNsYXNzTmFtZTpvPSIiLGdldENvbmZpZ3M6aSxzeW50YXhIaWdobGlnaHRpbmc6YT17fSxjaGlsZHJlbjp1PSIifSk9Pntjb25zdCBfPWkoKS5zeW50YXhIaWdobGlnaHQudGhlbWUse3N0eWxlczp3LGRlZmF1bHRTdHlsZTp4fT1hLEM9dz8uW19dPz94O3JldHVybiBSZS5jcmVhdGVFbGVtZW50KGJPLHtsYW5ndWFnZTpzLGNsYXNzTmFtZTpvLHN0eWxlOkN9LHUpfTt2YXIgTE89X193ZWJwYWNrX3JlcXVpcmVfXyg1NDE5KSxGTz1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oTE8pO2NvbnN0IGNvbXBvbmVudHNfSGlnaGxpZ2h0Q29kZT0oe2ZpbGVOYW1lOnM9InJlc3BvbnNlLnR4dCIsY2xhc3NOYW1lOm8sZG93bmxvYWRhYmxlOmksZ2V0Q29tcG9uZW50OmEsY2FuQ29weTp1LGxhbmd1YWdlOl8sY2hpbGRyZW46d30pPT57Y29uc3QgeD0oMCxSZS51c2VSZWYpKG51bGwpLEM9YSgiU3ludGF4SGlnaGxpZ2h0ZXIiLCEwKSxoYW5kbGVQcmV2ZW50WVNjcm9sbGluZ0JleW9uZEVsZW1lbnQ9cz0+e2NvbnN0e3RhcmdldDpvLGRlbHRhWTppfT1zLHtzY3JvbGxIZWlnaHQ6YSxvZmZzZXRIZWlnaHQ6dSxzY3JvbGxUb3A6X309bzthPnUmJigwPT09XyYmaTwwfHx1K18+PWEmJmk+MCkmJnMucHJldmVudERlZmF1bHQoKX07cmV0dXJuKDAsUmUudXNlRWZmZWN0KSgoKCk9Pntjb25zdCBzPUFycmF5LmZyb20oeC5jdXJyZW50LmNoaWxkTm9kZXMpLmZpbHRlcigocz0+ISFzLm5vZGVUeXBlJiZzLmNsYXNzTGlzdC5jb250YWlucygibWljcm9saWdodCIpKSk7cmV0dXJuIHMuZm9yRWFjaCgocz0+cy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIixoYW5kbGVQcmV2ZW50WVNjcm9sbGluZ0JleW9uZEVsZW1lbnQse3Bhc3NpdmU6ITF9KSkpLCgpPT57cy5mb3JFYWNoKChzPT5zLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNld2hlZWwiLGhhbmRsZVByZXZlbnRZU2Nyb2xsaW5nQmV5b25kRWxlbWVudCkpKX19KSxbdyxvLF9dKSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImhpZ2hsaWdodC1jb2RlIixyZWY6eH0sdSYmUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjb3B5LXRvLWNsaXBib2FyZCJ9LFJlLmNyZWF0ZUVsZW1lbnQoSG4uQ29weVRvQ2xpcGJvYXJkLHt0ZXh0Ond9LFJlLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIsbnVsbCkpKSxpP1JlLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse2NsYXNzTmFtZToiZG93bmxvYWQtY29udGVudHMiLG9uQ2xpY2s6KCk9PntGTygpKHcscyl9fSwiRG93bmxvYWQiKTpudWxsLFJlLmNyZWF0ZUVsZW1lbnQoQyx7bGFuZ3VhZ2U6XyxjbGFzc05hbWU6Sm4oKShvLCJtaWNyb2xpZ2h0IikscmVuZGVyUGxhaW5UZXh0Oih7Y2hpbGRyZW46cyxQbGFpblRleHRWaWV3ZXI6aX0pPT5SZS5jcmVhdGVFbGVtZW50KGkse2NsYXNzTmFtZTpvfSxzKX0sdykpfSxjb21wb25lbnRzX1BsYWluVGV4dFZpZXdlcj0oe2NsYXNzTmFtZTpzPSIiLGNoaWxkcmVuOm99KT0+UmUuY3JlYXRlRWxlbWVudCgicHJlIix7Y2xhc3NOYW1lOkpuKCkoIm1pY3JvbGlnaHQiLHMpfSxvKSx3cmFwX2NvbXBvbmVudHNfU3ludGF4SGlnaGxpZ2h0ZXI9KHMsbyk9Pih7cmVuZGVyUGxhaW5UZXh0OmksY2hpbGRyZW46YSwuLi51fSk9Pntjb25zdCBfPW8uZ2V0Q29uZmlncygpLnN5bnRheEhpZ2hsaWdodC5hY3RpdmF0ZWQsdz1vLmdldENvbXBvbmVudCgiUGxhaW5UZXh0Vmlld2VyIik7cmV0dXJuIF98fCJmdW5jdGlvbiIhPXR5cGVvZiBpP18/UmUuY3JlYXRlRWxlbWVudChzLHUsYSk6UmUuY3JlYXRlRWxlbWVudCh3LG51bGwsYSk6aSh7Y2hpbGRyZW46YSxQbGFpblRleHRWaWV3ZXI6d30pfSxTeW50YXhIaWdobGlnaHRpbmdQbHVnaW4xPSgpPT4oe2FmdGVyTG9hZDphZnRlcl9sb2FkLHJvb3RJbmplY3RzOntzeW50YXhIaWdobGlnaHRpbmc6e3N0eWxlczpSTyxkZWZhdWx0U3R5bGU6RE99fSxjb21wb25lbnRzOntTeW50YXhIaWdobGlnaHRlcjpjb21wb25lbnRzX1N5bnRheEhpZ2hsaWdodGVyLEhpZ2hsaWdodENvZGU6Y29tcG9uZW50c19IaWdobGlnaHRDb2RlLFBsYWluVGV4dFZpZXdlcjpjb21wb25lbnRzX1BsYWluVGV4dFZpZXdlcn19KSxTeW50YXhIaWdobGlnaHRpbmdQbHVnaW4yPSgpPT4oe3dyYXBDb21wb25lbnRzOntTeW50YXhIaWdobGlnaHRlcjp3cmFwX2NvbXBvbmVudHNfU3ludGF4SGlnaGxpZ2h0ZXJ9fSksc3ludGF4X2hpZ2hsaWdodGluZz0oKT0+W1N5bnRheEhpZ2hsaWdodGluZ1BsdWdpbjEsU3ludGF4SGlnaGxpZ2h0aW5nUGx1Z2luMl0sdmVyc2lvbnNfYWZ0ZXJfbG9hZD0oKT0+e2NvbnN0e0dJVF9ESVJUWTpzLEdJVF9DT01NSVQ6byxQQUNLQUdFX1ZFUlNJT046aSxCVUlMRF9USU1FOmF9PXtQQUNLQUdFX1ZFUlNJT046IjUuMzIuMCIsR0lUX0NPTU1JVDoiZzMyN2ZmY2JhIixHSVRfRElSVFk6ITAsQlVJTERfVElNRToiRnJpLCAyNyBGZWIgMjAyNiAxMTo1MToyOSBHTVQifTtsdC52ZXJzaW9ucz1sdC52ZXJzaW9uc3x8e30sbHQudmVyc2lvbnMuc3dhZ2dlclVJPXt2ZXJzaW9uOmksZ2l0UmV2aXNpb246byxnaXREaXJ0eTpzLGJ1aWxkVGltZXN0YW1wOmF9fSx2ZXJzaW9ucz0oKT0+KHthZnRlckxvYWQ6dmVyc2lvbnNfYWZ0ZXJfbG9hZH0pO3ZhciBCTz1fX3dlYnBhY2tfcmVxdWlyZV9fKDQ3MjQ4KSwkTz1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oQk8pO2NvbnN0IHFPPWNvbnNvbGUuZXJyb3Isd2l0aEVycm9yQm91bmRhcnk9cz0+bz0+e2NvbnN0e2dldENvbXBvbmVudDppLGZuOmF9PXMoKSx1PWkoIkVycm9yQm91bmRhcnkiKSxfPWEuZ2V0RGlzcGxheU5hbWUobyk7Y2xhc3MgV2l0aEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQodSx7dGFyZ2V0TmFtZTpfLGdldENvbXBvbmVudDppLGZuOmF9LFJlLmNyZWF0ZUVsZW1lbnQobyxNbigpKHt9LHRoaXMucHJvcHMsdGhpcy5jb250ZXh0KSkpfX12YXIgdztyZXR1cm4gV2l0aEVycm9yQm91bmRhcnkuZGlzcGxheU5hbWU9YFdpdGhFcnJvckJvdW5kYXJ5KCR7X30pYCwodz1vKS5wcm90b3R5cGUmJncucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQmJihXaXRoRXJyb3JCb3VuZGFyeS5wcm90b3R5cGUubWFwU3RhdGVUb1Byb3BzPW8ucHJvdG90eXBlLm1hcFN0YXRlVG9Qcm9wcyksV2l0aEVycm9yQm91bmRhcnl9LGZhbGxiYWNrPSh7bmFtZTpzfSk9PlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZmFsbGJhY2sifSwi8J+YsSAiLFJlLmNyZWF0ZUVsZW1lbnQoImkiLG51bGwsIkNvdWxkIG5vdCByZW5kZXIgIiwidCI9PT1zPyJ0aGlzIGNvbXBvbmVudCI6cywiLCBzZWUgdGhlIGNvbnNvbGUuIikpO2NsYXNzIEVycm9yQm91bmRhcnkgZXh0ZW5kcyBSZS5Db21wb25lbnR7c3RhdGljIGRlZmF1bHRQcm9wcz17dGFyZ2V0TmFtZToidGhpcyBjb21wb25lbnQiLGdldENvbXBvbmVudDooKT0+ZmFsbGJhY2ssZm46e2NvbXBvbmVudERpZENhdGNoOnFPfSxjaGlsZHJlbjpudWxsfTtzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKHMpe3JldHVybntoYXNFcnJvcjohMCxlcnJvcjpzfX1jb25zdHJ1Y3RvciguLi5zKXtzdXBlciguLi5zKSx0aGlzLnN0YXRlPXtoYXNFcnJvcjohMSxlcnJvcjpudWxsfX1jb21wb25lbnREaWRDYXRjaChzLG8pe3RoaXMucHJvcHMuZm4uY29tcG9uZW50RGlkQ2F0Y2gocyxvKX1yZW5kZXIoKXtjb25zdHtnZXRDb21wb25lbnQ6cyx0YXJnZXROYW1lOm8sY2hpbGRyZW46aX09dGhpcy5wcm9wcztpZih0aGlzLnN0YXRlLmhhc0Vycm9yKXtjb25zdCBpPXMoIkZhbGxiYWNrIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoaSx7bmFtZTpvfSl9cmV0dXJuIGl9fWNvbnN0IFVPPUVycm9yQm91bmRhcnksc2FmZV9yZW5kZXI9KHtjb21wb25lbnRMaXN0OnM9W10sZnVsbE92ZXJyaWRlOm89ITF9PXt9KT0+KHtnZXRTeXN0ZW06aX0pPT57Y29uc3QgYT1vP3M6WyJBcHAiLCJCYXNlTGF5b3V0IiwiVmVyc2lvblByYWdtYUZpbHRlciIsIkluZm9Db250YWluZXIiLCJTZXJ2ZXJzQ29udGFpbmVyIiwiU2NoZW1lc0NvbnRhaW5lciIsIkF1dGhvcml6ZUJ0bkNvbnRhaW5lciIsIkZpbHRlckNvbnRhaW5lciIsIk9wZXJhdGlvbnMiLCJPcGVyYXRpb25Db250YWluZXIiLCJwYXJhbWV0ZXJzIiwicmVzcG9uc2VzIiwiT3BlcmF0aW9uU2VydmVycyIsIk1vZGVscyIsIk1vZGVsV3JhcHBlciIsLi4uc10sdT0kTygpKGEsQXJyYXkoYS5sZW5ndGgpLmZpbGwoKChzLHtmbjpvfSk9Pm8ud2l0aEVycm9yQm91bmRhcnkocykpKSk7cmV0dXJue2ZuOntjb21wb25lbnREaWRDYXRjaDpxTyx3aXRoRXJyb3JCb3VuZGFyeTp3aXRoRXJyb3JCb3VuZGFyeShpKX0sY29tcG9uZW50czp7RXJyb3JCb3VuZGFyeTpVTyxGYWxsYmFjazpmYWxsYmFja30sd3JhcENvbXBvbmVudHM6dX19O2NsYXNzIEFwcCBleHRlbmRzIFJlLkNvbXBvbmVudHtnZXRMYXlvdXQoKXtjb25zdHtnZXRDb21wb25lbnQ6cyxsYXlvdXRTZWxlY3RvcnM6b309dGhpcy5wcm9wcyxpPW8uY3VycmVudCgpLGE9cyhpLCEwKTtyZXR1cm4gYXx8KCgpPT5SZS5jcmVhdGVFbGVtZW50KCJoMSIsbnVsbCwnIE5vIGxheW91dCBkZWZpbmVkIGZvciAiJyxpLCciICcpKX1yZW5kZXIoKXtjb25zdCBzPXRoaXMuZ2V0TGF5b3V0KCk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQocyxudWxsKX19Y29uc3QgVk89QXBwO2NsYXNzIEF1dGhvcml6YXRpb25Qb3B1cCBleHRlbmRzIFJlLkNvbXBvbmVudHtjbG9zZT0oKT0+e2xldHthdXRoQWN0aW9uczpzfT10aGlzLnByb3BzO3Muc2hvd0RlZmluaXRpb25zKCExKX07cmVuZGVyKCl7bGV0e2F1dGhTZWxlY3RvcnM6cyxhdXRoQWN0aW9uczpvLGdldENvbXBvbmVudDppLGVyclNlbGVjdG9yczphLHNwZWNTZWxlY3RvcnM6dSxmbjp7QVNUOl89e319fT10aGlzLnByb3BzLHc9cy5zaG93bkRlZmluaXRpb25zKCk7Y29uc3QgeD1pKCJhdXRocyIpLEM9aSgiQ2xvc2VJY29uIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZGlhbG9nLXV4In0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJiYWNrZHJvcC11eCJ9KSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im1vZGFsLXV4In0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJtb2RhbC1kaWFsb2ctdXgifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im1vZGFsLXV4LWlubmVyIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJtb2RhbC11eC1oZWFkZXIifSxSZS5jcmVhdGVFbGVtZW50KCJoMyIsbnVsbCwiQXZhaWxhYmxlIGF1dGhvcml6YXRpb25zIiksUmUuY3JlYXRlRWxlbWVudCgiYnV0dG9uIix7dHlwZToiYnV0dG9uIixjbGFzc05hbWU6ImNsb3NlLW1vZGFsIixvbkNsaWNrOnRoaXMuY2xvc2V9LFJlLmNyZWF0ZUVsZW1lbnQoQyxudWxsKSkpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibW9kYWwtdXgtY29udGVudCJ9LHcudmFsdWVTZXEoKS5tYXAoKCh3LEMpPT5SZS5jcmVhdGVFbGVtZW50KHgse2tleTpDLEFTVDpfLGRlZmluaXRpb25zOncsZ2V0Q29tcG9uZW50OmksZXJyU2VsZWN0b3JzOmEsYXV0aFNlbGVjdG9yczpzLGF1dGhBY3Rpb25zOm8sc3BlY1NlbGVjdG9yczp1fSkpKSkpKSkpfX1jbGFzcyBBdXRob3JpemVCdG4gZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7bGV0e2lzQXV0aG9yaXplZDpzLHNob3dQb3B1cDpvLG9uQ2xpY2s6aSxnZXRDb21wb25lbnQ6YX09dGhpcy5wcm9wcztjb25zdCB1PWEoImF1dGhvcml6YXRpb25Qb3B1cCIsITApLF89YSgiTG9ja0F1dGhJY29uIiwhMCksdz1hKCJVbmxvY2tBdXRoSWNvbiIsITApO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImF1dGgtd3JhcHBlciJ9LFJlLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse2NsYXNzTmFtZTpzPyJidG4gYXV0aG9yaXplIGxvY2tlZCI6ImJ0biBhdXRob3JpemUgdW5sb2NrZWQiLG9uQ2xpY2s6aX0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIsbnVsbCwiQXV0aG9yaXplIikscz9SZS5jcmVhdGVFbGVtZW50KF8sbnVsbCk6UmUuY3JlYXRlRWxlbWVudCh3LG51bGwpKSxvJiZSZS5jcmVhdGVFbGVtZW50KHUsbnVsbCkpfX1jbGFzcyBBdXRob3JpemVCdG5Db250YWluZXIgZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7Y29uc3R7YXV0aEFjdGlvbnM6cyxhdXRoU2VsZWN0b3JzOm8sc3BlY1NlbGVjdG9yczppLGdldENvbXBvbmVudDphfT10aGlzLnByb3BzLHU9aS5zZWN1cml0eURlZmluaXRpb25zKCksXz1vLmRlZmluaXRpb25zVG9BdXRob3JpemUoKSx3PWEoImF1dGhvcml6ZUJ0biIpO3JldHVybiB1P1JlLmNyZWF0ZUVsZW1lbnQodyx7b25DbGljazooKT0+cy5zaG93RGVmaW5pdGlvbnMoXyksaXNBdXRob3JpemVkOiEhby5hdXRob3JpemVkKCkuc2l6ZSxzaG93UG9wdXA6ISFvLnNob3duRGVmaW5pdGlvbnMoKSxnZXRDb21wb25lbnQ6YX0pOm51bGx9fWNsYXNzIEF1dGhvcml6ZU9wZXJhdGlvbkJ0biBleHRlbmRzIFJlLkNvbXBvbmVudHtvbkNsaWNrPXM9PntzLnN0b3BQcm9wYWdhdGlvbigpO2xldHtvbkNsaWNrOm99PXRoaXMucHJvcHM7byYmbygpfTtyZW5kZXIoKXtsZXR7aXNBdXRob3JpemVkOnMsZ2V0Q29tcG9uZW50Om99PXRoaXMucHJvcHM7Y29uc3QgaT1vKCJMb2NrQXV0aE9wZXJhdGlvbkljb24iLCEwKSxhPW8oIlVubG9ja0F1dGhPcGVyYXRpb25JY29uIiwhMCk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse2NsYXNzTmFtZToiYXV0aG9yaXphdGlvbl9fYnRuIiwiYXJpYS1sYWJlbCI6cz8iYXV0aG9yaXphdGlvbiBidXR0b24gbG9ja2VkIjoiYXV0aG9yaXphdGlvbiBidXR0b24gdW5sb2NrZWQiLG9uQ2xpY2s6dGhpcy5vbkNsaWNrfSxzP1JlLmNyZWF0ZUVsZW1lbnQoaSx7Y2xhc3NOYW1lOiJsb2NrZWQifSk6UmUuY3JlYXRlRWxlbWVudChhLHtjbGFzc05hbWU6InVubG9ja2VkIn0pKX19Y2xhc3MgQXV0aHMgZXh0ZW5kcyBSZS5Db21wb25lbnR7Y29uc3RydWN0b3IocyxvKXtzdXBlcihzLG8pLHRoaXMuc3RhdGU9e319b25BdXRoQ2hhbmdlPXM9PntsZXR7bmFtZTpvfT1zO3RoaXMuc2V0U3RhdGUoe1tvXTpzfSl9O3N1Ym1pdEF1dGg9cz0+e3MucHJldmVudERlZmF1bHQoKTtsZXR7YXV0aEFjdGlvbnM6b309dGhpcy5wcm9wcztvLmF1dGhvcml6ZVdpdGhQZXJzaXN0T3B0aW9uKHRoaXMuc3RhdGUpfTtsb2dvdXRDbGljaz1zPT57cy5wcmV2ZW50RGVmYXVsdCgpO2xldHthdXRoQWN0aW9uczpvLGRlZmluaXRpb25zOml9PXRoaXMucHJvcHMsYT1pLm1hcCgoKHMsbyk9Pm8pKS50b0FycmF5KCk7dGhpcy5zZXRTdGF0ZShhLnJlZHVjZSgoKHMsbyk9PihzW29dPSIiLHMpKSx7fSkpLG8ubG9nb3V0V2l0aFBlcnNpc3RPcHRpb24oYSl9O2Nsb3NlPXM9PntzLnByZXZlbnREZWZhdWx0KCk7bGV0e2F1dGhBY3Rpb25zOm99PXRoaXMucHJvcHM7by5zaG93RGVmaW5pdGlvbnMoITEpfTtyZW5kZXIoKXtsZXR7ZGVmaW5pdGlvbnM6cyxnZXRDb21wb25lbnQ6byxhdXRoU2VsZWN0b3JzOmksZXJyU2VsZWN0b3JzOmF9PXRoaXMucHJvcHM7Y29uc3QgdT1vKCJBdXRoSXRlbSIpLF89bygib2F1dGgyIiwhMCksdz1vKCJCdXR0b24iKTtsZXQgeD1pLmF1dGhvcml6ZWQoKSxDPXMuZmlsdGVyKCgocyxvKT0+ISF4LmdldChvKSkpLGo9cy5maWx0ZXIoKHM9PiJvYXV0aDIiIT09cy5nZXQoInR5cGUiKSkpLEw9cy5maWx0ZXIoKHM9PiJvYXV0aDIiPT09cy5nZXQoInR5cGUiKSkpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImF1dGgtY29udGFpbmVyIn0sISFqLnNpemUmJlJlLmNyZWF0ZUVsZW1lbnQoImZvcm0iLHtvblN1Ym1pdDp0aGlzLnN1Ym1pdEF1dGh9LGoubWFwKCgocyxfKT0+UmUuY3JlYXRlRWxlbWVudCh1LHtrZXk6XyxzY2hlbWE6cyxuYW1lOl8sZ2V0Q29tcG9uZW50Om8sb25BdXRoQ2hhbmdlOnRoaXMub25BdXRoQ2hhbmdlLGF1dGhvcml6ZWQ6eCxlcnJTZWxlY3RvcnM6YSxhdXRoU2VsZWN0b3JzOml9KSkpLnRvQXJyYXkoKSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImF1dGgtYnRuLXdyYXBwZXIifSxqLnNpemU9PT1DLnNpemU/UmUuY3JlYXRlRWxlbWVudCh3LHtjbGFzc05hbWU6ImJ0biBtb2RhbC1idG4gYXV0aCIsb25DbGljazp0aGlzLmxvZ291dENsaWNrLCJhcmlhLWxhYmVsIjoiUmVtb3ZlIGF1dGhvcml6YXRpb24ifSwiTG9nb3V0Iik6UmUuY3JlYXRlRWxlbWVudCh3LHt0eXBlOiJzdWJtaXQiLGNsYXNzTmFtZToiYnRuIG1vZGFsLWJ0biBhdXRoIGF1dGhvcml6ZSIsImFyaWEtbGFiZWwiOiJBcHBseSBjcmVkZW50aWFscyJ9LCJBdXRob3JpemUiKSxSZS5jcmVhdGVFbGVtZW50KHcse2NsYXNzTmFtZToiYnRuIG1vZGFsLWJ0biBhdXRoIGJ0bi1kb25lIixvbkNsaWNrOnRoaXMuY2xvc2V9LCJDbG9zZSIpKSksTCYmTC5zaXplP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InNjb3BlLWRlZiJ9LFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIlNjb3BlcyBhcmUgdXNlZCB0byBncmFudCBhbiBhcHBsaWNhdGlvbiBkaWZmZXJlbnQgbGV2ZWxzIG9mIGFjY2VzcyB0byBkYXRhIG9uIGJlaGFsZiBvZiB0aGUgZW5kIHVzZXIuIEVhY2ggQVBJIG1heSBkZWNsYXJlIG9uZSBvciBtb3JlIHNjb3Blcy4iKSxSZS5jcmVhdGVFbGVtZW50KCJwIixudWxsLCJBUEkgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBzY29wZXMuIFNlbGVjdCB3aGljaCBvbmVzIHlvdSB3YW50IHRvIGdyYW50IHRvIFN3YWdnZXIgVUkuIikpLHMuZmlsdGVyKChzPT4ib2F1dGgyIj09PXMuZ2V0KCJ0eXBlIikpKS5tYXAoKChzLG8pPT5SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtrZXk6b30sUmUuY3JlYXRlRWxlbWVudChfLHthdXRob3JpemVkOngsc2NoZW1hOnMsbmFtZTpvfSkpKSkudG9BcnJheSgpKTpudWxsKX19Y2xhc3MgYXV0aF9pdGVtX0F1dGhzIGV4dGVuZHMgUmUuQ29tcG9uZW50e3JlbmRlcigpe2xldHtzY2hlbWE6cyxuYW1lOm8sZ2V0Q29tcG9uZW50Omksb25BdXRoQ2hhbmdlOmEsYXV0aG9yaXplZDp1LGVyclNlbGVjdG9yczpfLGF1dGhTZWxlY3RvcnM6d309dGhpcy5wcm9wcztjb25zdCB4PWkoImFwaUtleUF1dGgiKSxDPWkoImJhc2ljQXV0aCIpO2xldCBqO2NvbnN0IEw9cy5nZXQoInR5cGUiKTtzd2l0Y2goTCl7Y2FzZSJhcGlLZXkiOmo9UmUuY3JlYXRlRWxlbWVudCh4LHtrZXk6byxzY2hlbWE6cyxuYW1lOm8sZXJyU2VsZWN0b3JzOl8sYXV0aG9yaXplZDp1LGdldENvbXBvbmVudDppLG9uQ2hhbmdlOmEsYXV0aFNlbGVjdG9yczp3fSk7YnJlYWs7Y2FzZSJiYXNpYyI6aj1SZS5jcmVhdGVFbGVtZW50KEMse2tleTpvLHNjaGVtYTpzLG5hbWU6byxlcnJTZWxlY3RvcnM6XyxhdXRob3JpemVkOnUsZ2V0Q29tcG9uZW50Omksb25DaGFuZ2U6YSxhdXRoU2VsZWN0b3JzOnd9KTticmVhaztkZWZhdWx0Omo9UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7a2V5Om99LCJVbmtub3duIHNlY3VyaXR5IGRlZmluaXRpb24gdHlwZSAiLEwpfXJldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtrZXk6YCR7b30tanVtcGB9LGopfX1jbGFzcyBBdXRoRXJyb3IgZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7bGV0e2Vycm9yOnN9PXRoaXMucHJvcHMsbz1zLmdldCgibGV2ZWwiKSxpPXMuZ2V0KCJtZXNzYWdlIiksYT1zLmdldCgic291cmNlIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZXJyb3JzIn0sUmUuY3JlYXRlRWxlbWVudCgiYiIsbnVsbCxhLCIgIixvKSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLGkpKX19Y2xhc3MgQXBpS2V5QXV0aCBleHRlbmRzIFJlLkNvbXBvbmVudHtjb25zdHJ1Y3RvcihzLG8pe3N1cGVyKHMsbyk7bGV0e25hbWU6aSxzY2hlbWE6YX09dGhpcy5wcm9wcyx1PXRoaXMuZ2V0VmFsdWUoKTt0aGlzLnN0YXRlPXtuYW1lOmksc2NoZW1hOmEsdmFsdWU6dX19Z2V0VmFsdWUoKXtsZXR7bmFtZTpzLGF1dGhvcml6ZWQ6b309dGhpcy5wcm9wcztyZXR1cm4gbyYmby5nZXRJbihbcywidmFsdWUiXSl9b25DaGFuZ2U9cz0+e2xldHtvbkNoYW5nZTpvfT10aGlzLnByb3BzLGk9cy50YXJnZXQudmFsdWUsYT1PYmplY3QuYXNzaWduKHt9LHRoaXMuc3RhdGUse3ZhbHVlOml9KTt0aGlzLnNldFN0YXRlKGEpLG8oYSl9O3JlbmRlcigpe2xldHtzY2hlbWE6cyxnZXRDb21wb25lbnQ6byxlcnJTZWxlY3RvcnM6aSxuYW1lOmEsYXV0aFNlbGVjdG9yczp1fT10aGlzLnByb3BzO2NvbnN0IF89bygiSW5wdXQiKSx3PW8oIlJvdyIpLHg9bygiQ29sIiksQz1vKCJhdXRoRXJyb3IiKSxqPW8oIk1hcmtkb3duIiwhMCksTD1vKCJKdW1wVG9QYXRoIiwhMCksQj11LnNlbGVjdEF1dGhQYXRoKGEpO2xldCAkPXRoaXMuZ2V0VmFsdWUoKSxVPWkuYWxsRXJyb3JzKCkuZmlsdGVyKChzPT5zLmdldCgiYXV0aElkIik9PT1hKSk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJoNCIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLGF8fHMuZ2V0KCJuYW1lIikpLCLCoChhcGlLZXkpIixSZS5jcmVhdGVFbGVtZW50KEwse3BhdGg6Qn0pKSwkJiZSZS5jcmVhdGVFbGVtZW50KCJoNiIsbnVsbCwiQXV0aG9yaXplZCIpLFJlLmNyZWF0ZUVsZW1lbnQodyxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoaix7c291cmNlOnMuZ2V0KCJkZXNjcmlwdGlvbiIpfSkpLFJlLmNyZWF0ZUVsZW1lbnQodyxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIk5hbWU6ICIsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCxzLmdldCgibmFtZSIpKSkpLFJlLmNyZWF0ZUVsZW1lbnQodyxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIkluOiAiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwscy5nZXQoImluIikpKSksUmUuY3JlYXRlRWxlbWVudCh3LG51bGwsUmUuY3JlYXRlRWxlbWVudCgibGFiZWwiLHtodG1sRm9yOiJhcGlfa2V5X3ZhbHVlIn0sIlZhbHVlOiIpLCQ/UmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICoqKioqKiAiKTpSZS5jcmVhdGVFbGVtZW50KHgsbnVsbCxSZS5jcmVhdGVFbGVtZW50KF8se2lkOiJhcGlfa2V5X3ZhbHVlIix0eXBlOiJ0ZXh0IixvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlLGF1dG9Gb2N1czohMH0pKSksVS52YWx1ZVNlcSgpLm1hcCgoKHMsbyk9PlJlLmNyZWF0ZUVsZW1lbnQoQyx7ZXJyb3I6cyxrZXk6b30pKSkpfX1jbGFzcyBCYXNpY0F1dGggZXh0ZW5kcyBSZS5Db21wb25lbnR7Y29uc3RydWN0b3IocyxvKXtzdXBlcihzLG8pO2xldHtzY2hlbWE6aSxuYW1lOmF9PXRoaXMucHJvcHMsdT10aGlzLmdldFZhbHVlKCkudXNlcm5hbWU7dGhpcy5zdGF0ZT17bmFtZTphLHNjaGVtYTppLHZhbHVlOnU/e3VzZXJuYW1lOnV9Ont9fX1nZXRWYWx1ZSgpe2xldHthdXRob3JpemVkOnMsbmFtZTpvfT10aGlzLnByb3BzO3JldHVybiBzJiZzLmdldEluKFtvLCJ2YWx1ZSJdKXx8e319b25DaGFuZ2U9cz0+e2xldHtvbkNoYW5nZTpvfT10aGlzLnByb3BzLHt2YWx1ZTppLG5hbWU6YX09cy50YXJnZXQsdT10aGlzLnN0YXRlLnZhbHVlO3VbYV09aSx0aGlzLnNldFN0YXRlKHt2YWx1ZTp1fSksbyh0aGlzLnN0YXRlKX07cmVuZGVyKCl7bGV0e3NjaGVtYTpzLGdldENvbXBvbmVudDpvLG5hbWU6aSxlcnJTZWxlY3RvcnM6YSxhdXRoU2VsZWN0b3JzOnV9PXRoaXMucHJvcHM7Y29uc3QgXz1vKCJJbnB1dCIpLHc9bygiUm93IikseD1vKCJDb2wiKSxDPW8oImF1dGhFcnJvciIpLGo9bygiSnVtcFRvUGF0aCIsITApLEw9bygiTWFya2Rvd24iLCEwKSxCPXUuc2VsZWN0QXV0aFBhdGgoaSk7bGV0ICQ9dGhpcy5nZXRWYWx1ZSgpLnVzZXJuYW1lLFU9YS5hbGxFcnJvcnMoKS5maWx0ZXIoKHM9PnMuZ2V0KCJhdXRoSWQiKT09PWkpKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLCJCYXNpYyBhdXRob3JpemF0aW9uIixSZS5jcmVhdGVFbGVtZW50KGose3BhdGg6Qn0pKSwkJiZSZS5jcmVhdGVFbGVtZW50KCJoNiIsbnVsbCwiQXV0aG9yaXplZCIpLFJlLmNyZWF0ZUVsZW1lbnQodyxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoTCx7c291cmNlOnMuZ2V0KCJkZXNjcmlwdGlvbiIpfSkpLFJlLmNyZWF0ZUVsZW1lbnQodyxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7aHRtbEZvcjoiYXV0aF91c2VybmFtZSJ9LCJVc2VybmFtZToiKSwkP1JlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsIiAiLCQsIiAiKTpSZS5jcmVhdGVFbGVtZW50KHgsbnVsbCxSZS5jcmVhdGVFbGVtZW50KF8se2lkOiJhdXRoX3VzZXJuYW1lIix0eXBlOiJ0ZXh0IixyZXF1aXJlZDoicmVxdWlyZWQiLG5hbWU6InVzZXJuYW1lIixvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlLGF1dG9Gb2N1czohMH0pKSksUmUuY3JlYXRlRWxlbWVudCh3LG51bGwsUmUuY3JlYXRlRWxlbWVudCgibGFiZWwiLHtodG1sRm9yOiJhdXRoX3Bhc3N3b3JkIn0sIlBhc3N3b3JkOiIpLCQ/UmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICoqKioqKiAiKTpSZS5jcmVhdGVFbGVtZW50KHgsbnVsbCxSZS5jcmVhdGVFbGVtZW50KF8se2lkOiJhdXRoX3Bhc3N3b3JkIixhdXRvQ29tcGxldGU6Im5ldy1wYXNzd29yZCIsbmFtZToicGFzc3dvcmQiLHR5cGU6InBhc3N3b3JkIixvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlfSkpKSxVLnZhbHVlU2VxKCkubWFwKCgocyxvKT0+UmUuY3JlYXRlRWxlbWVudChDLHtlcnJvcjpzLGtleTpvfSkpKSl9fWZ1bmN0aW9uIGV4YW1wbGVfRXhhbXBsZShzKXtjb25zdHtleGFtcGxlOm8sc2hvd1ZhbHVlOmksZ2V0Q29tcG9uZW50OmF9PXMsdT1hKCJNYXJrZG93biIsITApLF89YSgiSGlnaGxpZ2h0Q29kZSIsITApO3JldHVybiBvJiZ6ZS5NYXAuaXNNYXAobyk/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJleGFtcGxlIn0sby5nZXQoImRlc2NyaXB0aW9uIik/UmUuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIse2NsYXNzTmFtZToiZXhhbXBsZV9fc2VjdGlvbiJ9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZXhhbXBsZV9fc2VjdGlvbi1oZWFkZXIifSwiRXhhbXBsZSBEZXNjcmlwdGlvbiIpLFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsUmUuY3JlYXRlRWxlbWVudCh1LHtzb3VyY2U6by5nZXQoImRlc2NyaXB0aW9uIil9KSkpOm51bGwsaSYmby5oYXMoInZhbHVlIik/UmUuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIse2NsYXNzTmFtZToiZXhhbXBsZV9fc2VjdGlvbiJ9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZXhhbXBsZV9fc2VjdGlvbi1oZWFkZXIifSwiRXhhbXBsZSBWYWx1ZSIpLFJlLmNyZWF0ZUVsZW1lbnQoXyxudWxsLHN0cmluZ2lmeShvLmdldCgidmFsdWUiKSkpKTpudWxsKTpudWxsfWNsYXNzIEV4YW1wbGVzU2VsZWN0IGV4dGVuZHMgUmUuUHVyZUNvbXBvbmVudHtzdGF0aWMgZGVmYXVsdFByb3BzPXtleGFtcGxlczooMCx6ZS5NYXApKHt9KSxvblNlbGVjdDooLi4ucyk9PmNvbnNvbGUubG9nKCJERUJVRzogRXhhbXBsZXNTZWxlY3Qgd2FzIG5vdCBnaXZlbiBhbiBvblNlbGVjdCBjYWxsYmFjayIsLi4ucyksY3VycmVudEV4YW1wbGVLZXk6bnVsbCxzaG93TGFiZWxzOiEwfTtfb25TZWxlY3Q9KHMse2lzU3ludGhldGljQ2hhbmdlOm89ITF9PXt9KT0+eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnByb3BzLm9uU2VsZWN0JiZ0aGlzLnByb3BzLm9uU2VsZWN0KHMse2lzU3ludGhldGljQ2hhbmdlOm99KX07X29uRG9tU2VsZWN0PXM9PntpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wcm9wcy5vblNlbGVjdCl7Y29uc3Qgbz1zLnRhcmdldC5zZWxlY3RlZE9wdGlvbnNbMF0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpO3RoaXMuX29uU2VsZWN0KG8se2lzU3ludGhldGljQ2hhbmdlOiExfSl9fTtnZXRDdXJyZW50RXhhbXBsZT0oKT0+e2NvbnN0e2V4YW1wbGVzOnMsY3VycmVudEV4YW1wbGVLZXk6b309dGhpcy5wcm9wcyxpPXMuZ2V0KG8pLGE9cy5rZXlTZXEoKS5maXJzdCgpLHU9cy5nZXQoYSk7cmV0dXJuIGl8fHV8fCgwLHplLk1hcCkoe30pfTtjb21wb25lbnREaWRNb3VudCgpe2NvbnN0e29uU2VsZWN0OnMsZXhhbXBsZXM6b309dGhpcy5wcm9wcztpZigiZnVuY3Rpb24iPT10eXBlb2Ygcyl7Y29uc3Qgcz1vLmZpcnN0KCksaT1vLmtleU9mKHMpO3RoaXMuX29uU2VsZWN0KGkse2lzU3ludGhldGljQ2hhbmdlOiEwfSl9fVVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHMpe2NvbnN0e2N1cnJlbnRFeGFtcGxlS2V5Om8sZXhhbXBsZXM6aX09cztpZihpIT09dGhpcy5wcm9wcy5leGFtcGxlcyYmIWkuaGFzKG8pKXtjb25zdCBzPWkuZmlyc3QoKSxvPWkua2V5T2Yocyk7dGhpcy5fb25TZWxlY3Qobyx7aXNTeW50aGV0aWNDaGFuZ2U6ITB9KX19cmVuZGVyKCl7Y29uc3R7ZXhhbXBsZXM6cyxjdXJyZW50RXhhbXBsZUtleTpvLGlzVmFsdWVNb2RpZmllZDppLGlzTW9kaWZpZWRWYWx1ZUF2YWlsYWJsZTphLHNob3dMYWJlbHM6dX09dGhpcy5wcm9wcztyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJleGFtcGxlcy1zZWxlY3QifSx1P1JlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ImV4YW1wbGVzLXNlbGVjdF9fc2VjdGlvbi1sYWJlbCJ9LCJFeGFtcGxlczogIik6bnVsbCxSZS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiLHtjbGFzc05hbWU6ImV4YW1wbGVzLXNlbGVjdC1lbGVtZW50IixvbkNoYW5nZTp0aGlzLl9vbkRvbVNlbGVjdCx2YWx1ZTphJiZpPyJfX01PRElGSUVEX19WQUxVRV9fIjpvfHwiIn0sYT9SZS5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHt2YWx1ZToiX19NT0RJRklFRF9fVkFMVUVfXyJ9LCJbTW9kaWZpZWQgdmFsdWVdIik6bnVsbCxzLm1hcCgoKHMsbyk9PlJlLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIse2tleTpvLHZhbHVlOm99LHplLk1hcC5pc01hcChzKSYmcy5nZXQoInN1bW1hcnkiKXx8bykpKS52YWx1ZVNlcSgpKSl9fWNvbnN0IHN0cmluZ2lmeVVubGVzc0xpc3Q9cz0+emUuTGlzdC5pc0xpc3Qocyk/czpzdHJpbmdpZnkocyk7Y2xhc3MgRXhhbXBsZXNTZWxlY3RWYWx1ZVJldGFpbmVyIGV4dGVuZHMgUmUuUHVyZUNvbXBvbmVudHtzdGF0aWMgZGVmYXVsdFByb3BzPXt1c2VySGFzRWRpdGVkQm9keTohMSxleGFtcGxlczooMCx6ZS5NYXApKHt9KSxjdXJyZW50TmFtZXNwYWNlOiJfX0RFRkFVTFRfX05BTUVTUEFDRV9fIixzZXRSZXRhaW5SZXF1ZXN0Qm9keVZhbHVlRmxhZzooKT0+e30sb25TZWxlY3Q6KC4uLnMpPT5jb25zb2xlLmxvZygiRXhhbXBsZXNTZWxlY3RWYWx1ZVJldGFpbmVyOiBubyBgb25TZWxlY3RgIGZ1bmN0aW9uIHdhcyBwcm92aWRlZCIsLi4ucyksdXBkYXRlVmFsdWU6KC4uLnMpPT5jb25zb2xlLmxvZygiRXhhbXBsZXNTZWxlY3RWYWx1ZVJldGFpbmVyOiBubyBgdXBkYXRlVmFsdWVgIGZ1bmN0aW9uIHdhcyBwcm92aWRlZCIsLi4ucyl9O2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpO2NvbnN0IG89dGhpcy5fZ2V0Q3VycmVudEV4YW1wbGVWYWx1ZSgpO3RoaXMuc3RhdGU9e1tzLmN1cnJlbnROYW1lc3BhY2VdOigwLHplLk1hcCkoe2xhc3RVc2VyRWRpdGVkVmFsdWU6dGhpcy5wcm9wcy5jdXJyZW50VXNlcklucHV0VmFsdWUsbGFzdERvd25zdHJlYW1WYWx1ZTpvLGlzTW9kaWZpZWRWYWx1ZVNlbGVjdGVkOnRoaXMucHJvcHMudXNlckhhc0VkaXRlZEJvZHl8fHRoaXMucHJvcHMuY3VycmVudFVzZXJJbnB1dFZhbHVlIT09b30pfX1jb21wb25lbnRXaWxsVW5tb3VudCgpe3RoaXMucHJvcHMuc2V0UmV0YWluUmVxdWVzdEJvZHlWYWx1ZUZsYWcoITEpfV9nZXRTdGF0ZUZvckN1cnJlbnROYW1lc3BhY2U9KCk9Pntjb25zdHtjdXJyZW50TmFtZXNwYWNlOnN9PXRoaXMucHJvcHM7cmV0dXJuKHRoaXMuc3RhdGVbc118fCgwLHplLk1hcCkoKSkudG9PYmplY3QoKX07X3NldFN0YXRlRm9yQ3VycmVudE5hbWVzcGFjZT1zPT57Y29uc3R7Y3VycmVudE5hbWVzcGFjZTpvfT10aGlzLnByb3BzO3JldHVybiB0aGlzLl9zZXRTdGF0ZUZvck5hbWVzcGFjZShvLHMpfTtfc2V0U3RhdGVGb3JOYW1lc3BhY2U9KHMsbyk9Pntjb25zdCBpPSh0aGlzLnN0YXRlW3NdfHwoMCx6ZS5NYXApKCkpLm1lcmdlRGVlcChvKTtyZXR1cm4gdGhpcy5zZXRTdGF0ZSh7W3NdOml9KX07X2lzQ3VycmVudFVzZXJJbnB1dFNhbWVBc0V4YW1wbGVWYWx1ZT0oKT0+e2NvbnN0e2N1cnJlbnRVc2VySW5wdXRWYWx1ZTpzfT10aGlzLnByb3BzO3JldHVybiB0aGlzLl9nZXRDdXJyZW50RXhhbXBsZVZhbHVlKCk9PT1zfTtfZ2V0VmFsdWVGb3JFeGFtcGxlPShzLG8pPT57Y29uc3R7ZXhhbXBsZXM6aX09b3x8dGhpcy5wcm9wcztyZXR1cm4gc3RyaW5naWZ5VW5sZXNzTGlzdCgoaXx8KDAsemUuTWFwKSh7fSkpLmdldEluKFtzLCJ2YWx1ZSJdKSl9O19nZXRDdXJyZW50RXhhbXBsZVZhbHVlPXM9Pntjb25zdHtjdXJyZW50S2V5Om99PXN8fHRoaXMucHJvcHM7cmV0dXJuIHRoaXMuX2dldFZhbHVlRm9yRXhhbXBsZShvLHN8fHRoaXMucHJvcHMpfTtfb25FeGFtcGxlc1NlbGVjdD0ocyx7aXNTeW50aGV0aWNDaGFuZ2U6b309e30sLi4uaSk9Pntjb25zdHtvblNlbGVjdDphLHVwZGF0ZVZhbHVlOnUsY3VycmVudFVzZXJJbnB1dFZhbHVlOl8sdXNlckhhc0VkaXRlZEJvZHk6d309dGhpcy5wcm9wcyx7bGFzdFVzZXJFZGl0ZWRWYWx1ZTp4fT10aGlzLl9nZXRTdGF0ZUZvckN1cnJlbnROYW1lc3BhY2UoKSxDPXRoaXMuX2dldFZhbHVlRm9yRXhhbXBsZShzKTtpZigiX19NT0RJRklFRF9fVkFMVUVfXyI9PT1zKXJldHVybiB1KHN0cmluZ2lmeVVubGVzc0xpc3QoeCkpLHRoaXMuX3NldFN0YXRlRm9yQ3VycmVudE5hbWVzcGFjZSh7aXNNb2RpZmllZFZhbHVlU2VsZWN0ZWQ6ITB9KTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmYShzLHtpc1N5bnRoZXRpY0NoYW5nZTpvfSwuLi5pKSx0aGlzLl9zZXRTdGF0ZUZvckN1cnJlbnROYW1lc3BhY2Uoe2xhc3REb3duc3RyZWFtVmFsdWU6Qyxpc01vZGlmaWVkVmFsdWVTZWxlY3RlZDpvJiZ3fHwhIV8mJl8hPT1DfSksb3x8ImZ1bmN0aW9uIj09dHlwZW9mIHUmJnUoc3RyaW5naWZ5VW5sZXNzTGlzdChDKSl9O1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHMpe2NvbnN0e2N1cnJlbnRVc2VySW5wdXRWYWx1ZTpvLGV4YW1wbGVzOmksb25TZWxlY3Q6YSx1c2VySGFzRWRpdGVkQm9keTp1fT1zLHtsYXN0VXNlckVkaXRlZFZhbHVlOl8sbGFzdERvd25zdHJlYW1WYWx1ZTp3fT10aGlzLl9nZXRTdGF0ZUZvckN1cnJlbnROYW1lc3BhY2UoKSx4PXRoaXMuX2dldFZhbHVlRm9yRXhhbXBsZShzLmN1cnJlbnRLZXkscyksQz1pLmZpbHRlcigocz0+emUuTWFwLmlzTWFwKHMpJiYocy5nZXQoInZhbHVlIik9PT1vfHxzdHJpbmdpZnkocy5nZXQoInZhbHVlIikpPT09bykpKTtpZihDLnNpemUpe2xldCBvO289Qy5oYXMocy5jdXJyZW50S2V5KT9zLmN1cnJlbnRLZXk6Qy5rZXlTZXEoKS5maXJzdCgpLGEobyx7aXNTeW50aGV0aWNDaGFuZ2U6ITB9KX1lbHNlIG8hPT10aGlzLnByb3BzLmN1cnJlbnRVc2VySW5wdXRWYWx1ZSYmbyE9PV8mJm8hPT13JiYodGhpcy5wcm9wcy5zZXRSZXRhaW5SZXF1ZXN0Qm9keVZhbHVlRmxhZyghMCksdGhpcy5fc2V0U3RhdGVGb3JOYW1lc3BhY2Uocy5jdXJyZW50TmFtZXNwYWNlLHtsYXN0VXNlckVkaXRlZFZhbHVlOnMuY3VycmVudFVzZXJJbnB1dFZhbHVlLGlzTW9kaWZpZWRWYWx1ZVNlbGVjdGVkOnV8fG8hPT14fSkpfXJlbmRlcigpe2NvbnN0e2N1cnJlbnRVc2VySW5wdXRWYWx1ZTpzLGV4YW1wbGVzOm8sY3VycmVudEtleTppLGdldENvbXBvbmVudDphLHVzZXJIYXNFZGl0ZWRCb2R5OnV9PXRoaXMucHJvcHMse2xhc3REb3duc3RyZWFtVmFsdWU6XyxsYXN0VXNlckVkaXRlZFZhbHVlOncsaXNNb2RpZmllZFZhbHVlU2VsZWN0ZWQ6eH09dGhpcy5fZ2V0U3RhdGVGb3JDdXJyZW50TmFtZXNwYWNlKCksQz1hKCJFeGFtcGxlc1NlbGVjdCIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KEMse2V4YW1wbGVzOm8sY3VycmVudEV4YW1wbGVLZXk6aSxvblNlbGVjdDp0aGlzLl9vbkV4YW1wbGVzU2VsZWN0LGlzTW9kaWZpZWRWYWx1ZUF2YWlsYWJsZTohIXcmJnchPT1fLGlzVmFsdWVNb2RpZmllZDp2b2lkIDAhPT1zJiZ4JiZzIT09dGhpcy5fZ2V0Q3VycmVudEV4YW1wbGVWYWx1ZSgpfHx1fSl9fWZ1bmN0aW9uIG9hdXRoMl9hdXRob3JpemVfYXV0aG9yaXplKHthdXRoOnMsYXV0aEFjdGlvbnM6byxlcnJBY3Rpb25zOmksY29uZmlnczphLGF1dGhDb25maWdzOnU9e30sY3VycmVudFNlcnZlcjpffSl7bGV0e3NjaGVtYTp3LHNjb3Blczp4LG5hbWU6QyxjbGllbnRJZDpqfT1zLEw9dy5nZXQoImZsb3ciKSxCPVtdO3N3aXRjaChMKXtjYXNlInBhc3N3b3JkIjpyZXR1cm4gdm9pZCBvLmF1dGhvcml6ZVBhc3N3b3JkKHMpO2Nhc2UiYXBwbGljYXRpb24iOmNhc2UiY2xpZW50Q3JlZGVudGlhbHMiOmNhc2UiY2xpZW50X2NyZWRlbnRpYWxzIjpyZXR1cm4gdm9pZCBvLmF1dGhvcml6ZUFwcGxpY2F0aW9uKHMpO2Nhc2UiYWNjZXNzQ29kZSI6Y2FzZSJhdXRob3JpemF0aW9uQ29kZSI6Y2FzZSJhdXRob3JpemF0aW9uX2NvZGUiOkIucHVzaCgicmVzcG9uc2VfdHlwZT1jb2RlIik7YnJlYWs7Y2FzZSJpbXBsaWNpdCI6Qi5wdXNoKCJyZXNwb25zZV90eXBlPXRva2VuIil9InN0cmluZyI9PXR5cGVvZiBqJiZCLnB1c2goImNsaWVudF9pZD0iK2VuY29kZVVSSUNvbXBvbmVudChqKSk7bGV0ICQ9YS5vYXV0aDJSZWRpcmVjdFVybDtpZih2b2lkIDA9PT0kKXJldHVybiB2b2lkIGkubmV3QXV0aEVycih7YXV0aElkOkMsc291cmNlOiJ2YWxpZGF0aW9uIixsZXZlbDoiZXJyb3IiLG1lc3NhZ2U6Im9hdXRoMlJlZGlyZWN0VXJsIGNvbmZpZ3VyYXRpb24gaXMgbm90IHBhc3NlZC4gT2F1dGgyIGF1dGhvcml6YXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZC4ifSk7Qi5wdXNoKCJyZWRpcmVjdF91cmk9IitlbmNvZGVVUklDb21wb25lbnQoJCkpO2xldCBVPVtdO2lmKEFycmF5LmlzQXJyYXkoeCk/VT14OldlKCkuTGlzdC5pc0xpc3QoeCkmJihVPXgudG9BcnJheSgpKSxVLmxlbmd0aD4wKXtsZXQgcz11LnNjb3BlU2VwYXJhdG9yfHwiICI7Qi5wdXNoKCJzY29wZT0iK2VuY29kZVVSSUNvbXBvbmVudChVLmpvaW4ocykpKX1sZXQgVj11dGlsc19idG9hKG5ldyBEYXRlKTtpZihCLnB1c2goInN0YXRlPSIrZW5jb2RlVVJJQ29tcG9uZW50KFYpKSx2b2lkIDAhPT11LnJlYWxtJiZCLnB1c2goInJlYWxtPSIrZW5jb2RlVVJJQ29tcG9uZW50KHUucmVhbG0pKSwoImF1dGhvcml6YXRpb25Db2RlIj09PUx8fCJhdXRob3JpemF0aW9uX2NvZGUiPT09THx8ImFjY2Vzc0NvZGUiPT09TCkmJnUudXNlUGtjZVdpdGhBdXRob3JpemF0aW9uQ29kZUdyYW50KXtjb25zdCBvPWZ1bmN0aW9uIGdlbmVyYXRlQ29kZVZlcmlmaWVyKCl7cmV0dXJuIGI2NHRvQjY0VXJsRW5jb2RlZCh4dCgpKDMyKS50b1N0cmluZygiYmFzZTY0IikpfSgpLGk9ZnVuY3Rpb24gY3JlYXRlQ29kZUNoYWxsZW5nZShzKXtyZXR1cm4gYjY0dG9CNjRVcmxFbmNvZGVkKE90KCkoInNoYTI1NiIpLnVwZGF0ZShzKS5kaWdlc3QoImJhc2U2NCIpKX0obyk7Qi5wdXNoKCJjb2RlX2NoYWxsZW5nZT0iK2kpLEIucHVzaCgiY29kZV9jaGFsbGVuZ2VfbWV0aG9kPVMyNTYiKSxzLmNvZGVWZXJpZmllcj1vfWxldHthZGRpdGlvbmFsUXVlcnlTdHJpbmdQYXJhbXM6en09dTtmb3IobGV0IHMgaW4geil2b2lkIDAhPT16W3NdJiZCLnB1c2goW3MseltzXV0ubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbigiPSIpKTtjb25zdCBZPXcuZ2V0KCJhdXRob3JpemF0aW9uVXJsIik7bGV0IFo7Wj1fP050KCkoc2FuaXRpemVVcmwoWSksXywhMCkudG9TdHJpbmcoKTpzYW5pdGl6ZVVybChZKTtsZXQgZWUsaWU9W1osQi5qb2luKCImIildLmpvaW4oInN0cmluZyIhPXR5cGVvZiBZfHxZLmluY2x1ZGVzKCI/Iik/IiYiOiI/Iik7ZWU9ImltcGxpY2l0Ij09PUw/by5wcmVBdXRob3JpemVJbXBsaWNpdDp1LnVzZUJhc2ljQXV0aGVudGljYXRpb25XaXRoQWNjZXNzQ29kZUdyYW50P28uYXV0aG9yaXplQWNjZXNzQ29kZVdpdGhCYXNpY0F1dGhlbnRpY2F0aW9uOm8uYXV0aG9yaXplQWNjZXNzQ29kZVdpdGhGb3JtUGFyYW1zLG8uYXV0aFBvcHVwKGllLHthdXRoOnMsc3RhdGU6VixyZWRpcmVjdFVybDokLGNhbGxiYWNrOmVlLGVyckNiOmkubmV3QXV0aEVycn0pfWNsYXNzIE9hdXRoMiBleHRlbmRzIFJlLkNvbXBvbmVudHtjb25zdHJ1Y3RvcihzLG8pe3N1cGVyKHMsbyk7bGV0e25hbWU6aSxzY2hlbWE6YSxhdXRob3JpemVkOnUsYXV0aFNlbGVjdG9yczpffT10aGlzLnByb3BzLHc9dSYmdS5nZXQoaSkseD1fLmdldENvbmZpZ3MoKXx8e30sQz13JiZ3LmdldCgidXNlcm5hbWUiKXx8IiIsaj13JiZ3LmdldCgiY2xpZW50SWQiKXx8eC5jbGllbnRJZHx8IiIsTD13JiZ3LmdldCgiY2xpZW50U2VjcmV0Iil8fHguY2xpZW50U2VjcmV0fHwiIixCPXcmJncuZ2V0KCJwYXNzd29yZFR5cGUiKXx8ImJhc2ljIiwkPXcmJncuZ2V0KCJzY29wZXMiKXx8eC5zY29wZXN8fFtdOyJzdHJpbmciPT10eXBlb2YgJCYmKCQ9JC5zcGxpdCh4LnNjb3BlU2VwYXJhdG9yfHwiICIpKSx0aGlzLnN0YXRlPXthcHBOYW1lOnguYXBwTmFtZSxuYW1lOmksc2NoZW1hOmEsc2NvcGVzOiQsY2xpZW50SWQ6aixjbGllbnRTZWNyZXQ6TCx1c2VybmFtZTpDLHBhc3N3b3JkOiIiLHBhc3N3b3JkVHlwZTpCfX1jbG9zZT1zPT57cy5wcmV2ZW50RGVmYXVsdCgpO2xldHthdXRoQWN0aW9uczpvfT10aGlzLnByb3BzO28uc2hvd0RlZmluaXRpb25zKCExKX07YXV0aG9yaXplPSgpPT57bGV0e2F1dGhBY3Rpb25zOnMsZXJyQWN0aW9uczpvLGdldENvbmZpZ3M6aSxhdXRoU2VsZWN0b3JzOmEsb2FzM1NlbGVjdG9yczp1fT10aGlzLnByb3BzLF89aSgpLHc9YS5nZXRDb25maWdzKCk7by5jbGVhcih7YXV0aElkOm5hbWUsdHlwZToiYXV0aCIsc291cmNlOiJhdXRoIn0pLG9hdXRoMl9hdXRob3JpemVfYXV0aG9yaXplKHthdXRoOnRoaXMuc3RhdGUsY3VycmVudFNlcnZlcjp1LnNlcnZlckVmZmVjdGl2ZVZhbHVlKHUuc2VsZWN0ZWRTZXJ2ZXIoKSksYXV0aEFjdGlvbnM6cyxlcnJBY3Rpb25zOm8sY29uZmlnczpfLGF1dGhDb25maWdzOnd9KX07b25TY29wZUNoYW5nZT1zPT57bGV0e3RhcmdldDpvfT1zLHtjaGVja2VkOml9PW8sYT1vLmRhdGFzZXQudmFsdWU7aWYoaSYmLTE9PT10aGlzLnN0YXRlLnNjb3Blcy5pbmRleE9mKGEpKXtsZXQgcz10aGlzLnN0YXRlLnNjb3Blcy5jb25jYXQoW2FdKTt0aGlzLnNldFN0YXRlKHtzY29wZXM6c30pfWVsc2UhaSYmdGhpcy5zdGF0ZS5zY29wZXMuaW5kZXhPZihhKT4tMSYmdGhpcy5zZXRTdGF0ZSh7c2NvcGVzOnRoaXMuc3RhdGUuc2NvcGVzLmZpbHRlcigocz0+cyE9PWEpKX0pfTtvbklucHV0Q2hhbmdlPXM9PntsZXR7dGFyZ2V0OntkYXRhc2V0OntuYW1lOm99LHZhbHVlOml9fT1zLGE9e1tvXTppfTt0aGlzLnNldFN0YXRlKGEpfTtzZWxlY3RTY29wZXM9cz0+e3MudGFyZ2V0LmRhdGFzZXQuYWxsP3RoaXMuc2V0U3RhdGUoe3Njb3BlczpBcnJheS5mcm9tKCh0aGlzLnByb3BzLnNjaGVtYS5nZXQoImFsbG93ZWRTY29wZXMiKXx8dGhpcy5wcm9wcy5zY2hlbWEuZ2V0KCJzY29wZXMiKSkua2V5cygpKX0pOnRoaXMuc2V0U3RhdGUoe3Njb3BlczpbXX0pfTtsb2dvdXQ9cz0+e3MucHJldmVudERlZmF1bHQoKTtsZXR7YXV0aEFjdGlvbnM6byxlcnJBY3Rpb25zOmksbmFtZTphfT10aGlzLnByb3BzO2kuY2xlYXIoe2F1dGhJZDphLHR5cGU6ImF1dGgiLHNvdXJjZToiYXV0aCJ9KSxvLmxvZ291dFdpdGhQZXJzaXN0T3B0aW9uKFthXSl9O3JlbmRlcigpe2xldHtzY2hlbWE6cyxnZXRDb21wb25lbnQ6byxhdXRoU2VsZWN0b3JzOmksZXJyU2VsZWN0b3JzOmEsbmFtZTp1LHNwZWNTZWxlY3RvcnM6X309dGhpcy5wcm9wcztjb25zdCB3PW8oIklucHV0IikseD1vKCJSb3ciKSxDPW8oIkNvbCIpLGo9bygiQnV0dG9uIiksTD1vKCJhdXRoRXJyb3IiKSxCPW8oIkp1bXBUb1BhdGgiLCEwKSwkPW8oIk1hcmtkb3duIiwhMCksVT1vKCJJbml0aWFsaXplZElucHV0Iikse2lzT0FTMzpWfT1fO2xldCB6PVYoKT9zLmdldCgib3BlbklkQ29ubmVjdFVybCIpOm51bGw7Y29uc3QgWT0iaW1wbGljaXQiLFo9InBhc3N3b3JkIixlZT1WKCk/ej8iYXV0aG9yaXphdGlvbl9jb2RlIjoiYXV0aG9yaXphdGlvbkNvZGUiOiJhY2Nlc3NDb2RlIixpZT1WKCk/ej8iY2xpZW50X2NyZWRlbnRpYWxzIjoiY2xpZW50Q3JlZGVudGlhbHMiOiJhcHBsaWNhdGlvbiIsYWU9aS5zZWxlY3RBdXRoUGF0aCh1KTtsZXQgY2U9ISEoaS5nZXRDb25maWdzKCl8fHt9KS51c2VQa2NlV2l0aEF1dGhvcml6YXRpb25Db2RlR3JhbnQsbGU9cy5nZXQoImZsb3ciKSxwZT1sZT09PWVlJiZjZT9sZSsiIHdpdGggUEtDRSI6bGUsZGU9cy5nZXQoImFsbG93ZWRTY29wZXMiKXx8cy5nZXQoInNjb3BlcyIpLGZlPSEhaS5hdXRob3JpemVkKCkuZ2V0KHUpLHllPWEuYWxsRXJyb3JzKCkuZmlsdGVyKChzPT5zLmdldCgiYXV0aElkIik9PT11KSksYmU9IXllLmZpbHRlcigocz0+InZhbGlkYXRpb24iPT09cy5nZXQoInNvdXJjZSIpKSkuc2l6ZSxTZT1zLmdldCgiZGVzY3JpcHRpb24iKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLHUsIiAoT0F1dGgyLCAiLHBlLCIpICIsUmUuY3JlYXRlRWxlbWVudChCLHtwYXRoOmFlfSkpLHRoaXMuc3RhdGUuYXBwTmFtZT9SZS5jcmVhdGVFbGVtZW50KCJoNSIsbnVsbCwiQXBwbGljYXRpb246ICIsdGhpcy5zdGF0ZS5hcHBOYW1lLCIgIik6bnVsbCxTZSYmUmUuY3JlYXRlRWxlbWVudCgkLHtzb3VyY2U6cy5nZXQoImRlc2NyaXB0aW9uIil9KSxmZSYmUmUuY3JlYXRlRWxlbWVudCgiaDYiLG51bGwsIkF1dGhvcml6ZWQiKSx6JiZSZS5jcmVhdGVFbGVtZW50KCJwIixudWxsLCJPcGVuSUQgQ29ubmVjdCBVUkw6ICIsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCx6KSksKGxlPT09WXx8bGU9PT1lZSkmJlJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIkF1dGhvcml6YXRpb24gVVJMOiAiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwscy5nZXQoImF1dGhvcml6YXRpb25VcmwiKSkpLChsZT09PVp8fGxlPT09ZWV8fGxlPT09aWUpJiZSZS5jcmVhdGVFbGVtZW50KCJwIixudWxsLCJUb2tlbiBVUkw6IixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCIgIixzLmdldCgidG9rZW5VcmwiKSkpLFJlLmNyZWF0ZUVsZW1lbnQoInAiLHtjbGFzc05hbWU6ImZsb3cifSwiRmxvdzogIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLHBlKSksbGUhPT1aP251bGw6UmUuY3JlYXRlRWxlbWVudCh4LG51bGwsUmUuY3JlYXRlRWxlbWVudCh4LG51bGwsUmUuY3JlYXRlRWxlbWVudCgibGFiZWwiLHtodG1sRm9yOiJvYXV0aF91c2VybmFtZSJ9LCJ1c2VybmFtZToiKSxmZT9SZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCIgIix0aGlzLnN0YXRlLnVzZXJuYW1lLCIgIik6UmUuY3JlYXRlRWxlbWVudChDLHt0YWJsZXQ6MTAsZGVza3RvcDoxMH0sUmUuY3JlYXRlRWxlbWVudCgiaW5wdXQiLHtpZDoib2F1dGhfdXNlcm5hbWUiLHR5cGU6InRleHQiLCJkYXRhLW5hbWUiOiJ1c2VybmFtZSIsb25DaGFuZ2U6dGhpcy5vbklucHV0Q2hhbmdlLGF1dG9Gb2N1czohMH0pKSksUmUuY3JlYXRlRWxlbWVudCh4LG51bGwsUmUuY3JlYXRlRWxlbWVudCgibGFiZWwiLHtodG1sRm9yOiJvYXV0aF9wYXNzd29yZCJ9LCJwYXNzd29yZDoiKSxmZT9SZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCIgKioqKioqICIpOlJlLmNyZWF0ZUVsZW1lbnQoQyx7dGFibGV0OjEwLGRlc2t0b3A6MTB9LFJlLmNyZWF0ZUVsZW1lbnQoImlucHV0Iix7aWQ6Im9hdXRoX3Bhc3N3b3JkIix0eXBlOiJwYXNzd29yZCIsImRhdGEtbmFtZSI6InBhc3N3b3JkIixvbkNoYW5nZTp0aGlzLm9uSW5wdXRDaGFuZ2V9KSkpLFJlLmNyZWF0ZUVsZW1lbnQoeCxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7aHRtbEZvcjoicGFzc3dvcmRfdHlwZSJ9LCJDbGllbnQgY3JlZGVudGlhbHMgbG9jYXRpb246IiksZmU/UmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICIsdGhpcy5zdGF0ZS5wYXNzd29yZFR5cGUsIiAiKTpSZS5jcmVhdGVFbGVtZW50KEMse3RhYmxldDoxMCxkZXNrdG9wOjEwfSxSZS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiLHtpZDoicGFzc3dvcmRfdHlwZSIsImRhdGEtbmFtZSI6InBhc3N3b3JkVHlwZSIsb25DaGFuZ2U6dGhpcy5vbklucHV0Q2hhbmdlfSxSZS5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHt2YWx1ZToiYmFzaWMifSwiQXV0aG9yaXphdGlvbiBoZWFkZXIiKSxSZS5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHt2YWx1ZToicmVxdWVzdC1ib2R5In0sIlJlcXVlc3QgYm9keSIpKSkpKSwobGU9PT1pZXx8bGU9PT1ZfHxsZT09PWVlfHxsZT09PVopJiYoIWZlfHxmZSYmdGhpcy5zdGF0ZS5jbGllbnRJZCkmJlJlLmNyZWF0ZUVsZW1lbnQoeCxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7aHRtbEZvcjpgY2xpZW50X2lkXyR7bGV9YH0sImNsaWVudF9pZDoiKSxmZT9SZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCIgKioqKioqICIpOlJlLmNyZWF0ZUVsZW1lbnQoQyx7dGFibGV0OjEwLGRlc2t0b3A6MTB9LFJlLmNyZWF0ZUVsZW1lbnQoVSx7aWQ6YGNsaWVudF9pZF8ke2xlfWAsdHlwZToidGV4dCIscmVxdWlyZWQ6bGU9PT1aLGluaXRpYWxWYWx1ZTp0aGlzLnN0YXRlLmNsaWVudElkLCJkYXRhLW5hbWUiOiJjbGllbnRJZCIsb25DaGFuZ2U6dGhpcy5vbklucHV0Q2hhbmdlfSkpKSwobGU9PT1pZXx8bGU9PT1lZXx8bGU9PT1aKSYmUmUuY3JlYXRlRWxlbWVudCh4LG51bGwsUmUuY3JlYXRlRWxlbWVudCgibGFiZWwiLHtodG1sRm9yOmBjbGllbnRfc2VjcmV0XyR7bGV9YH0sImNsaWVudF9zZWNyZXQ6IiksZmU/UmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICoqKioqKiAiKTpSZS5jcmVhdGVFbGVtZW50KEMse3RhYmxldDoxMCxkZXNrdG9wOjEwfSxSZS5jcmVhdGVFbGVtZW50KFUse2lkOmBjbGllbnRfc2VjcmV0XyR7bGV9YCxpbml0aWFsVmFsdWU6dGhpcy5zdGF0ZS5jbGllbnRTZWNyZXQsdHlwZToicGFzc3dvcmQiLCJkYXRhLW5hbWUiOiJjbGllbnRTZWNyZXQiLG9uQ2hhbmdlOnRoaXMub25JbnB1dENoYW5nZX0pKSksIWZlJiZkZSYmZGUuc2l6ZT9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InNjb3BlcyJ9LFJlLmNyZWF0ZUVsZW1lbnQoImgyIixudWxsLCJTY29wZXM6IixSZS5jcmVhdGVFbGVtZW50KCJhIix7b25DbGljazp0aGlzLnNlbGVjdFNjb3BlcywiZGF0YS1hbGwiOiEwfSwic2VsZWN0IGFsbCIpLFJlLmNyZWF0ZUVsZW1lbnQoImEiLHtvbkNsaWNrOnRoaXMuc2VsZWN0U2NvcGVzfSwic2VsZWN0IG5vbmUiKSksZGUubWFwKCgocyxvKT0+UmUuY3JlYXRlRWxlbWVudCh4LHtrZXk6b30sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjaGVja2JveCJ9LFJlLmNyZWF0ZUVsZW1lbnQodyx7ImRhdGEtdmFsdWUiOm8saWQ6YCR7b30tJHtsZX0tY2hlY2tib3gtJHt0aGlzLnN0YXRlLm5hbWV9YCxkaXNhYmxlZDpmZSxjaGVja2VkOnRoaXMuc3RhdGUuc2NvcGVzLmluY2x1ZGVzKG8pLHR5cGU6ImNoZWNrYm94IixvbkNoYW5nZTp0aGlzLm9uU2NvcGVDaGFuZ2V9KSxSZS5jcmVhdGVFbGVtZW50KCJsYWJlbCIse2h0bWxGb3I6YCR7b30tJHtsZX0tY2hlY2tib3gtJHt0aGlzLnN0YXRlLm5hbWV9YH0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToiaXRlbSJ9KSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InRleHQifSxSZS5jcmVhdGVFbGVtZW50KCJwIix7Y2xhc3NOYW1lOiJuYW1lIn0sbyksUmUuY3JlYXRlRWxlbWVudCgicCIse2NsYXNzTmFtZToiZGVzY3JpcHRpb24ifSxzKSkpKSkpKS50b0FycmF5KCkpOm51bGwseWUudmFsdWVTZXEoKS5tYXAoKChzLG8pPT5SZS5jcmVhdGVFbGVtZW50KEwse2Vycm9yOnMsa2V5Om99KSkpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYXV0aC1idG4td3JhcHBlciJ9LGJlJiYoZmU/UmUuY3JlYXRlRWxlbWVudChqLHtjbGFzc05hbWU6ImJ0biBtb2RhbC1idG4gYXV0aCBhdXRob3JpemUiLG9uQ2xpY2s6dGhpcy5sb2dvdXQsImFyaWEtbGFiZWwiOiJSZW1vdmUgYXV0aG9yaXphdGlvbiJ9LCJMb2dvdXQiKTpSZS5jcmVhdGVFbGVtZW50KGose2NsYXNzTmFtZToiYnRuIG1vZGFsLWJ0biBhdXRoIGF1dGhvcml6ZSIsb25DbGljazp0aGlzLmF1dGhvcml6ZSwiYXJpYS1sYWJlbCI6IkFwcGx5IGdpdmVuIE9BdXRoMiBjcmVkZW50aWFscyJ9LCJBdXRob3JpemUiKSksUmUuY3JlYXRlRWxlbWVudChqLHtjbGFzc05hbWU6ImJ0biBtb2RhbC1idG4gYXV0aCBidG4tZG9uZSIsb25DbGljazp0aGlzLmNsb3NlfSwiQ2xvc2UiKSkpfX1jbGFzcyBDbGVhciBleHRlbmRzIFJlLkNvbXBvbmVudHtvbkNsaWNrPSgpPT57bGV0e3NwZWNBY3Rpb25zOnMscGF0aDpvLG1ldGhvZDppfT10aGlzLnByb3BzO3MuY2xlYXJSZXNwb25zZShvLGkpLHMuY2xlYXJSZXF1ZXN0KG8saSl9O3JlbmRlcigpe3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHtjbGFzc05hbWU6ImJ0biBidG4tY2xlYXIgb3BibG9jay1jb250cm9sX19idG4iLG9uQ2xpY2s6dGhpcy5vbkNsaWNrfSwiQ2xlYXIiKX19Y29uc3QgbGl2ZV9yZXNwb25zZV9IZWFkZXJzPSh7aGVhZGVyczpzfSk9PlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJoNSIsbnVsbCwiUmVzcG9uc2UgaGVhZGVycyIpLFJlLmNyZWF0ZUVsZW1lbnQoInByZSIse2NsYXNzTmFtZToibWljcm9saWdodCJ9LHMpKSxEdXJhdGlvbj0oe2R1cmF0aW9uOnN9KT0+UmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImg1IixudWxsLCJSZXF1ZXN0IGR1cmF0aW9uIiksUmUuY3JlYXRlRWxlbWVudCgicHJlIix7Y2xhc3NOYW1lOiJtaWNyb2xpZ2h0In0scywiIG1zIikpO2NsYXNzIExpdmVSZXNwb25zZSBleHRlbmRzIFJlLkNvbXBvbmVudHtzaG91bGRDb21wb25lbnRVcGRhdGUocyl7cmV0dXJuIHRoaXMucHJvcHMucmVzcG9uc2UhPT1zLnJlc3BvbnNlfHx0aGlzLnByb3BzLnBhdGghPT1zLnBhdGh8fHRoaXMucHJvcHMubWV0aG9kIT09cy5tZXRob2R8fHRoaXMucHJvcHMuZGlzcGxheVJlcXVlc3REdXJhdGlvbiE9PXMuZGlzcGxheVJlcXVlc3REdXJhdGlvbn1yZW5kZXIoKXtjb25zdHtyZXNwb25zZTpzLGdldENvbXBvbmVudDpvLGdldENvbmZpZ3M6aSxkaXNwbGF5UmVxdWVzdER1cmF0aW9uOmEsc3BlY1NlbGVjdG9yczp1LHBhdGg6XyxtZXRob2Q6d309dGhpcy5wcm9wcyx7c2hvd011dGF0ZWRSZXF1ZXN0OngscmVxdWVzdFNuaXBwZXRzRW5hYmxlZDpDfT1pKCksaj14P3UubXV0YXRlZFJlcXVlc3RGb3IoXyx3KTp1LnJlcXVlc3RGb3IoXyx3KSxMPXMuZ2V0KCJzdGF0dXMiKSxCPWouZ2V0KCJ1cmwiKSwkPXMuZ2V0KCJoZWFkZXJzIikudG9KUygpLFU9cy5nZXQoIm5vdERvY3VtZW50ZWQiKSxWPXMuZ2V0KCJlcnJvciIpLHo9cy5nZXQoInRleHQiKSxZPXMuZ2V0KCJkdXJhdGlvbiIpLFo9T2JqZWN0LmtleXMoJCksZWU9JFsiY29udGVudC10eXBlIl18fCRbIkNvbnRlbnQtVHlwZSJdLGllPW8oInJlc3BvbnNlQm9keSIpLGFlPVoubWFwKChzPT57dmFyIG89QXJyYXkuaXNBcnJheSgkW3NdKT8kW3NdLmpvaW4oKTokW3NdO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJoZWFkZXJsaW5lIixrZXk6c30sIiAiLHMsIjogIixvLCIgIil9KSksY2U9MCE9PWFlLmxlbmd0aCxsZT1vKCJNYXJrZG93biIsITApLHBlPW8oIlJlcXVlc3RTbmlwcGV0cyIsITApLGRlPW8oImN1cmwiLCEwKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLGomJkM/UmUuY3JlYXRlRWxlbWVudChwZSx7cmVxdWVzdDpqfSk6UmUuY3JlYXRlRWxlbWVudChkZSx7cmVxdWVzdDpqfSksQiYmUmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicmVxdWVzdC11cmwifSxSZS5jcmVhdGVFbGVtZW50KCJoNCIsbnVsbCwiUmVxdWVzdCBVUkwiKSxSZS5jcmVhdGVFbGVtZW50KCJwcmUiLHtjbGFzc05hbWU6Im1pY3JvbGlnaHQifSxCKSkpLFJlLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLCJTZXJ2ZXIgcmVzcG9uc2UiKSxSZS5jcmVhdGVFbGVtZW50KCJ0YWJsZSIse2NsYXNzTmFtZToicmVzcG9uc2VzLXRhYmxlIGxpdmUtcmVzcG9uc2VzLXRhYmxlIn0sUmUuY3JlYXRlRWxlbWVudCgidGhlYWQiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgidHIiLHtjbGFzc05hbWU6InJlc3BvbnNlcy1oZWFkZXIifSxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToiY29sX2hlYWRlciByZXNwb25zZS1jb2xfc3RhdHVzIn0sIkNvZGUiKSxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToiY29sX2hlYWRlciByZXNwb25zZS1jb2xfZGVzY3JpcHRpb24ifSwiRGV0YWlscyIpKSksUmUuY3JlYXRlRWxlbWVudCgidGJvZHkiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgidHIiLHtjbGFzc05hbWU6InJlc3BvbnNlIn0sUmUuY3JlYXRlRWxlbWVudCgidGQiLHtjbGFzc05hbWU6InJlc3BvbnNlLWNvbF9zdGF0dXMifSxMLFU/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJyZXNwb25zZS11bmRvY3VtZW50ZWQifSxSZS5jcmVhdGVFbGVtZW50KCJpIixudWxsLCIgVW5kb2N1bWVudGVkICIpKTpudWxsKSxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToicmVzcG9uc2UtY29sX2Rlc2NyaXB0aW9uIn0sVj9SZS5jcmVhdGVFbGVtZW50KGxlLHtzb3VyY2U6YCR7IiIhPT1zLmdldCgibmFtZSIpP2Ake3MuZ2V0KCJuYW1lIil9OiBgOiIifSR7cy5nZXQoIm1lc3NhZ2UiKX1gfSk6bnVsbCx6P1JlLmNyZWF0ZUVsZW1lbnQoaWUse2NvbnRlbnQ6eixjb250ZW50VHlwZTplZSx1cmw6QixoZWFkZXJzOiQsZ2V0Q29uZmlnczppLGdldENvbXBvbmVudDpvfSk6bnVsbCxjZT9SZS5jcmVhdGVFbGVtZW50KGxpdmVfcmVzcG9uc2VfSGVhZGVycyx7aGVhZGVyczphZX0pOm51bGwsYSYmWT9SZS5jcmVhdGVFbGVtZW50KER1cmF0aW9uLHtkdXJhdGlvbjpZfSk6bnVsbCkpKSkpfX1jbGFzcyBPbmxpbmVWYWxpZGF0b3JCYWRnZSBleHRlbmRzIFJlLkNvbXBvbmVudHtjb25zdHJ1Y3RvcihzLG8pe3N1cGVyKHMsbyk7bGV0e2dldENvbmZpZ3M6aX09cyx7dmFsaWRhdG9yVXJsOmF9PWkoKTt0aGlzLnN0YXRlPXt1cmw6dGhpcy5nZXREZWZpbml0aW9uVXJsKCksdmFsaWRhdG9yVXJsOnZvaWQgMD09PWE/Imh0dHBzOi8vdmFsaWRhdG9yLnN3YWdnZXIuaW8vdmFsaWRhdG9yIjphfX1nZXREZWZpbml0aW9uVXJsPSgpPT57bGV0e3NwZWNTZWxlY3RvcnM6c309dGhpcy5wcm9wcztyZXR1cm4gbmV3KE50KCkpKHMudXJsKCksbHQubG9jYXRpb24pLnRvU3RyaW5nKCl9O1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHMpe2xldHtnZXRDb25maWdzOm99PXMse3ZhbGlkYXRvclVybDppfT1vKCk7dGhpcy5zZXRTdGF0ZSh7dXJsOnRoaXMuZ2V0RGVmaW5pdGlvblVybCgpLHZhbGlkYXRvclVybDp2b2lkIDA9PT1pPyJodHRwczovL3ZhbGlkYXRvci5zd2FnZ2VyLmlvL3ZhbGlkYXRvciI6aX0pfXJlbmRlcigpe2xldHtnZXRDb25maWdzOnN9PXRoaXMucHJvcHMse3NwZWM6b309cygpLGk9c2FuaXRpemVVcmwodGhpcy5zdGF0ZS52YWxpZGF0b3JVcmwpO3JldHVybiJvYmplY3QiPT10eXBlb2YgbyYmT2JqZWN0LmtleXMobykubGVuZ3RoP251bGw6dGhpcy5zdGF0ZS51cmwmJnJlcXVpcmVzVmFsaWRhdGlvblVSTCh0aGlzLnN0YXRlLnZhbGlkYXRvclVybCkmJnJlcXVpcmVzVmFsaWRhdGlvblVSTCh0aGlzLnN0YXRlLnVybCk/UmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToiZmxvYXQtcmlnaHQifSxSZS5jcmVhdGVFbGVtZW50KCJhIix7dGFyZ2V0OiJfYmxhbmsiLHJlbDoibm9vcGVuZXIgbm9yZWZlcnJlciIsaHJlZjpgJHtpfS9kZWJ1Zz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5zdGF0ZS51cmwpfWB9LFJlLmNyZWF0ZUVsZW1lbnQoVmFsaWRhdG9ySW1hZ2Use3NyYzpgJHtpfT91cmw9JHtlbmNvZGVVUklDb21wb25lbnQodGhpcy5zdGF0ZS51cmwpfWAsYWx0OiJPbmxpbmUgdmFsaWRhdG9yIGJhZGdlIn0pKSk6bnVsbH19Y2xhc3MgVmFsaWRhdG9ySW1hZ2UgZXh0ZW5kcyBSZS5Db21wb25lbnR7Y29uc3RydWN0b3Iocyl7c3VwZXIocyksdGhpcy5zdGF0ZT17bG9hZGVkOiExLGVycm9yOiExfX1jb21wb25lbnREaWRNb3VudCgpe2NvbnN0IHM9bmV3IEltYWdlO3Mub25sb2FkPSgpPT57dGhpcy5zZXRTdGF0ZSh7bG9hZGVkOiEwfSl9LHMub25lcnJvcj0oKT0+e3RoaXMuc2V0U3RhdGUoe2Vycm9yOiEwfSl9LHMuc3JjPXRoaXMucHJvcHMuc3JjfVVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHMpe2lmKHMuc3JjIT09dGhpcy5wcm9wcy5zcmMpe2NvbnN0IG89bmV3IEltYWdlO28ub25sb2FkPSgpPT57dGhpcy5zZXRTdGF0ZSh7bG9hZGVkOiEwfSl9LG8ub25lcnJvcj0oKT0+e3RoaXMuc2V0U3RhdGUoe2Vycm9yOiEwfSl9LG8uc3JjPXMuc3JjfX1yZW5kZXIoKXtyZXR1cm4gdGhpcy5zdGF0ZS5lcnJvcj9SZS5jcmVhdGVFbGVtZW50KCJpbWciLHthbHQ6IkVycm9yIn0pOnRoaXMuc3RhdGUubG9hZGVkP1JlLmNyZWF0ZUVsZW1lbnQoImltZyIse3NyYzp0aGlzLnByb3BzLnNyYyxhbHQ6dGhpcy5wcm9wcy5hbHR9KTpudWxsfX1jbGFzcyBPcGVyYXRpb25zIGV4dGVuZHMgUmUuQ29tcG9uZW50e3JlbmRlcigpe2xldHtzcGVjU2VsZWN0b3JzOnN9PXRoaXMucHJvcHM7Y29uc3Qgbz1zLnRhZ2dlZE9wZXJhdGlvbnMoKTtyZXR1cm4gMD09PW8uc2l6ZT9SZS5jcmVhdGVFbGVtZW50KCJoMyIsbnVsbCwiIE5vIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiBzcGVjISIpOlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxvLm1hcCh0aGlzLnJlbmRlck9wZXJhdGlvblRhZykudG9BcnJheSgpLG8uc2l6ZTwxP1JlLmNyZWF0ZUVsZW1lbnQoImgzIixudWxsLCIgTm8gb3BlcmF0aW9ucyBkZWZpbmVkIGluIHNwZWMhICIpOm51bGwpfXJlbmRlck9wZXJhdGlvblRhZz0ocyxvKT0+e2NvbnN0e3NwZWNTZWxlY3RvcnM6aSxnZXRDb21wb25lbnQ6YSxvYXMzU2VsZWN0b3JzOnUsbGF5b3V0U2VsZWN0b3JzOl8sbGF5b3V0QWN0aW9uczp3LGdldENvbmZpZ3M6eH09dGhpcy5wcm9wcyxDPWkudmFsaWRPcGVyYXRpb25NZXRob2RzKCksaj1hKCJPcGVyYXRpb25Db250YWluZXIiLCEwKSxMPWEoIk9wZXJhdGlvblRhZyIpLEI9cy5nZXQoIm9wZXJhdGlvbnMiKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudChMLHtrZXk6Im9wZXJhdGlvbi0iK28sdGFnT2JqOnMsdGFnOm8sb2FzM1NlbGVjdG9yczp1LGxheW91dFNlbGVjdG9yczpfLGxheW91dEFjdGlvbnM6dyxnZXRDb25maWdzOngsZ2V0Q29tcG9uZW50OmEsc3BlY1VybDppLnVybCgpfSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wZXJhdGlvbi10YWctY29udGVudCJ9LEIubWFwKChzPT57Y29uc3QgaT1zLmdldCgicGF0aCIpLGE9cy5nZXQoIm1ldGhvZCIpLHU9V2UoKS5MaXN0KFsicGF0aHMiLGksYV0pO3JldHVybi0xPT09Qy5pbmRleE9mKGEpP251bGw6UmUuY3JlYXRlRWxlbWVudChqLHtrZXk6YCR7aX0tJHthfWAsc3BlY1BhdGg6dSxvcDpzLHBhdGg6aSxtZXRob2Q6YSx0YWc6b30pfSkpLnRvQXJyYXkoKSkpfX1jbGFzcyBPcGVyYXRpb25UYWcgZXh0ZW5kcyBSZS5Db21wb25lbnR7c3RhdGljIGRlZmF1bHRQcm9wcz17dGFnT2JqOldlKCkuZnJvbUpTKHt9KSx0YWc6IiJ9O3JlbmRlcigpe2NvbnN0e3RhZ09iajpzLHRhZzpvLGNoaWxkcmVuOmksb2FzM1NlbGVjdG9yczphLGxheW91dFNlbGVjdG9yczp1LGxheW91dEFjdGlvbnM6XyxnZXRDb25maWdzOncsZ2V0Q29tcG9uZW50Ongsc3BlY1VybDpDfT10aGlzLnByb3BzO2xldHtkb2NFeHBhbnNpb246aixkZWVwTGlua2luZzpMfT13KCk7Y29uc3QgQj14KCJDb2xsYXBzZSIpLCQ9eCgiTWFya2Rvd24iLCEwKSxVPXgoIkRlZXBMaW5rIiksVj14KCJMaW5rIiksej14KCJBcnJvd1VwSWNvbiIpLFk9eCgiQXJyb3dEb3duSWNvbiIpO2xldCBaLGVlPXMuZ2V0SW4oWyJ0YWdEZXRhaWxzIiwiZGVzY3JpcHRpb24iXSxudWxsKSxpZT1zLmdldEluKFsidGFnRGV0YWlscyIsImV4dGVybmFsRG9jcyIsImRlc2NyaXB0aW9uIl0pLGFlPXMuZ2V0SW4oWyJ0YWdEZXRhaWxzIiwiZXh0ZXJuYWxEb2NzIiwidXJsIl0pO1o9aXNGdW5jKGEpJiZpc0Z1bmMoYS5zZWxlY3RlZFNlcnZlcik/c2FmZUJ1aWxkVXJsKGFlLEMse3NlbGVjdGVkU2VydmVyOmEuc2VsZWN0ZWRTZXJ2ZXIoKX0pOmFlO2xldCBjZT1bIm9wZXJhdGlvbnMtdGFnIixvXSxsZT11LmlzU2hvd24oY2UsImZ1bGwiPT09anx8Imxpc3QiPT09aik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTpsZT8ib3BibG9jay10YWctc2VjdGlvbiBpcy1vcGVuIjoib3BibG9jay10YWctc2VjdGlvbiJ9LFJlLmNyZWF0ZUVsZW1lbnQoImgzIix7b25DbGljazooKT0+Xy5zaG93KGNlLCFsZSksY2xhc3NOYW1lOmVlPyJvcGJsb2NrLXRhZyI6Im9wYmxvY2stdGFnIG5vLWRlc2MiLGlkOmNlLm1hcCgocz0+ZXNjYXBlRGVlcExpbmtQYXRoKHMpKSkuam9pbigiLSIpLCJkYXRhLXRhZyI6bywiZGF0YS1pcy1vcGVuIjpsZX0sUmUuY3JlYXRlRWxlbWVudChVLHtlbmFibGVkOkwsaXNTaG93bjpsZSxwYXRoOmNyZWF0ZURlZXBMaW5rUGF0aChvKSx0ZXh0Om99KSxlZT9SZS5jcmVhdGVFbGVtZW50KCJzbWFsbCIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCQse3NvdXJjZTplZX0pKTpSZS5jcmVhdGVFbGVtZW50KCJzbWFsbCIsbnVsbCksWj9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImluZm9fX2V4dGVybmFsZG9jcyJ9LFJlLmNyZWF0ZUVsZW1lbnQoInNtYWxsIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoVix7aHJlZjpzYW5pdGl6ZVVybChaKSxvbkNsaWNrOnM9PnMuc3RvcFByb3BhZ2F0aW9uKCksdGFyZ2V0OiJfYmxhbmsifSxpZXx8WikpKTpudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIseyJhcmlhLWV4cGFuZGVkIjpsZSxjbGFzc05hbWU6ImV4cGFuZC1vcGVyYXRpb24iLHRpdGxlOmxlPyJDb2xsYXBzZSBvcGVyYXRpb24iOiJFeHBhbmQgb3BlcmF0aW9uIixvbkNsaWNrOigpPT5fLnNob3coY2UsIWxlKX0sbGU/UmUuY3JlYXRlRWxlbWVudCh6LHtjbGFzc05hbWU6ImFycm93In0pOlJlLmNyZWF0ZUVsZW1lbnQoWSx7Y2xhc3NOYW1lOiJhcnJvdyJ9KSkpLFJlLmNyZWF0ZUVsZW1lbnQoQix7aXNPcGVuZWQ6bGV9LGkpKX19Y2xhc3Mgb3BlcmF0aW9uX09wZXJhdGlvbiBleHRlbmRzIFJlLlB1cmVDb21wb25lbnR7c3RhdGljIGRlZmF1bHRQcm9wcz17b3BlcmF0aW9uOm51bGwscmVzcG9uc2U6bnVsbCxyZXF1ZXN0Om51bGwsc3BlY1BhdGg6KDAsemUuTGlzdCkoKSxzdW1tYXJ5OiIifTtyZW5kZXIoKXtsZXR7c3BlY1BhdGg6cyxyZXNwb25zZTpvLHJlcXVlc3Q6aSx0b2dnbGVTaG93bjphLG9uVHJ5b3V0Q2xpY2s6dSxvblJlc2V0Q2xpY2s6XyxvbkNhbmNlbENsaWNrOncsb25FeGVjdXRlOngsZm46QyxnZXRDb21wb25lbnQ6aixnZXRDb25maWdzOkwsc3BlY0FjdGlvbnM6QixzcGVjU2VsZWN0b3JzOiQsYXV0aEFjdGlvbnM6VSxhdXRoU2VsZWN0b3JzOlYsb2FzM0FjdGlvbnM6eixvYXMzU2VsZWN0b3JzOll9PXRoaXMucHJvcHMsWj10aGlzLnByb3BzLm9wZXJhdGlvbix7ZGVwcmVjYXRlZDplZSxpc1Nob3duOmllLHBhdGg6YWUsbWV0aG9kOmNlLG9wOmxlLHRhZzpwZSxvcGVyYXRpb25JZDpkZSxhbGxvd1RyeUl0T3V0OmZlLGRpc3BsYXlSZXF1ZXN0RHVyYXRpb246eWUsdHJ5SXRPdXRFbmFibGVkOmJlLGV4ZWN1dGVJblByb2dyZXNzOlNlfT1aLnRvT2JqZWN0KCk7Y29uc3QgX2U9bGUuZ2V0KCJkZXNjcmlwdGlvbiIpLHdlPWxlLmdldCgiZXh0ZXJuYWxEb2NzIik/LnRvSlMoKSx4ZT1sZS5nZXQoInNjaGVtZXMiKT8udG9KUygpLFBlPXdlP3NhZmVCdWlsZFVybCh3ZS51cmwsJC51cmwoKSx7c2VsZWN0ZWRTZXJ2ZXI6WS5zZWxlY3RlZFNlcnZlcigpfSk6IiI7bGV0IFRlPVouZ2V0SW4oWyJvcCJdKSwkZT1UZS5nZXQoInJlc3BvbnNlcyIpLHFlPWZ1bmN0aW9uIGdldExpc3QocyxvKXtpZighV2UoKS5JdGVyYWJsZS5pc0l0ZXJhYmxlKHMpKXJldHVybiBXZSgpLkxpc3QoKTtsZXQgaT1zLmdldEluKEFycmF5LmlzQXJyYXkobyk/bzpbb10pO3JldHVybiBXZSgpLkxpc3QuaXNMaXN0KGkpP2k6V2UoKS5MaXN0KCl9KFRlLFsicGFyYW1ldGVycyJdKSx6ZT0kLm9wZXJhdGlvblNjaGVtZShhZSxjZSksSGU9WyJvcGVyYXRpb25zIixwZSxkZV0sWWU9Z2V0RXh0ZW5zaW9ucyhUZSk7Y29uc3QgWGU9aigicmVzcG9uc2VzIiksUWU9aigicGFyYW1ldGVycyIpLGV0PWooImV4ZWN1dGUiKSx0dD1qKCJjbGVhciIpLHJ0PWooIkNvbGxhcHNlIiksbnQ9aigiTWFya2Rvd24iLCEwKSxzdD1qKCJzY2hlbWVzIiksb3Q9aigiT3BlcmF0aW9uU2VydmVycyIpLGl0PWooIk9wZXJhdGlvbkV4dCIpLGF0PWooIk9wZXJhdGlvblN1bW1hcnkiKSxjdD1qKCJMaW5rIikse3Nob3dFeHRlbnNpb25zOmx0fT1MKCk7aWYoJGUmJm8mJm8uc2l6ZT4wKXtsZXQgcz0hJGUuZ2V0KFN0cmluZyhvLmdldCgic3RhdHVzIikpKSYmISRlLmdldCgiZGVmYXVsdCIpO289by5zZXQoIm5vdERvY3VtZW50ZWQiLHMpfWxldCB1dD1bYWUsY2VdO2NvbnN0IHB0PSQudmFsaWRhdGlvbkVycm9ycyhbYWUsY2VdKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOmVlPyJvcGJsb2NrIG9wYmxvY2stZGVwcmVjYXRlZCI6aWU/YG9wYmxvY2sgb3BibG9jay0ke2NlfSBpcy1vcGVuYDpgb3BibG9jayBvcGJsb2NrLSR7Y2V9YCxpZDplc2NhcGVEZWVwTGlua1BhdGgoSGUuam9pbigiLSIpKX0sUmUuY3JlYXRlRWxlbWVudChhdCx7b3BlcmF0aW9uUHJvcHM6Wixpc1Nob3duOmllLHRvZ2dsZVNob3duOmEsZ2V0Q29tcG9uZW50OmosYXV0aEFjdGlvbnM6VSxhdXRoU2VsZWN0b3JzOlYsc3BlY1BhdGg6c30pLFJlLmNyZWF0ZUVsZW1lbnQocnQse2lzT3BlbmVkOmllfSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stYm9keSJ9LFRlJiZUZS5zaXplfHxudWxsPT09VGU/bnVsbDpSZS5jcmVhdGVFbGVtZW50KHJvbGxpbmdfbG9hZCx7aGVpZ2h0OiIzMnB4Iix3aWR0aDoiMzJweCIsY2xhc3NOYW1lOiJvcGJsb2NrLWxvYWRpbmctYW5pbWF0aW9uIn0pLGVlJiZSZS5jcmVhdGVFbGVtZW50KCJoNCIse2NsYXNzTmFtZToib3BibG9jay10aXRsZV9ub3JtYWwifSwiIFdhcm5pbmc6IERlcHJlY2F0ZWQiKSxfZSYmUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLWRlc2NyaXB0aW9uLXdyYXBwZXIifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stZGVzY3JpcHRpb24ifSxSZS5jcmVhdGVFbGVtZW50KG50LHtzb3VyY2U6X2V9KSkpLFBlP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1leHRlcm5hbC1kb2NzLXdyYXBwZXIifSxSZS5jcmVhdGVFbGVtZW50KCJoNCIse2NsYXNzTmFtZToib3BibG9jay10aXRsZV9ub3JtYWwifSwiRmluZCBtb3JlIGRldGFpbHMiKSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stZXh0ZXJuYWwtZG9jcyJ9LHdlLmRlc2NyaXB0aW9uJiZSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJvcGJsb2NrLWV4dGVybmFsLWRvY3NfX2Rlc2NyaXB0aW9uIn0sUmUuY3JlYXRlRWxlbWVudChudCx7c291cmNlOndlLmRlc2NyaXB0aW9ufSkpLFJlLmNyZWF0ZUVsZW1lbnQoY3Qse3RhcmdldDoiX2JsYW5rIixjbGFzc05hbWU6Im9wYmxvY2stZXh0ZXJuYWwtZG9jc19fbGluayIsaHJlZjpzYW5pdGl6ZVVybChQZSl9LFBlKSkpOm51bGwsVGUmJlRlLnNpemU/UmUuY3JlYXRlRWxlbWVudChRZSx7cGFyYW1ldGVyczpxZSxzcGVjUGF0aDpzLnB1c2goInBhcmFtZXRlcnMiKSxvcGVyYXRpb246VGUsb25DaGFuZ2VLZXk6dXQsb25UcnlvdXRDbGljazp1LG9uUmVzZXRDbGljazpfLG9uQ2FuY2VsQ2xpY2s6dyx0cnlJdE91dEVuYWJsZWQ6YmUsYWxsb3dUcnlJdE91dDpmZSxmbjpDLGdldENvbXBvbmVudDpqLHNwZWNBY3Rpb25zOkIsc3BlY1NlbGVjdG9yczokLHBhdGhNZXRob2Q6W2FlLGNlXSxnZXRDb25maWdzOkwsb2FzM0FjdGlvbnM6eixvYXMzU2VsZWN0b3JzOll9KTpudWxsLGJlP1JlLmNyZWF0ZUVsZW1lbnQob3Qse2dldENvbXBvbmVudDpqLHBhdGg6YWUsbWV0aG9kOmNlLG9wZXJhdGlvblNlcnZlcnM6VGUuZ2V0KCJzZXJ2ZXJzIikscGF0aFNlcnZlcnM6JC5wYXRocygpLmdldEluKFthZSwic2VydmVycyJdKSxnZXRTZWxlY3RlZFNlcnZlcjpZLnNlbGVjdGVkU2VydmVyLHNldFNlbGVjdGVkU2VydmVyOnouc2V0U2VsZWN0ZWRTZXJ2ZXIsc2V0U2VydmVyVmFyaWFibGVWYWx1ZTp6LnNldFNlcnZlclZhcmlhYmxlVmFsdWUsZ2V0U2VydmVyVmFyaWFibGU6WS5zZXJ2ZXJWYXJpYWJsZVZhbHVlLGdldEVmZmVjdGl2ZVNlcnZlclZhbHVlOlkuc2VydmVyRWZmZWN0aXZlVmFsdWV9KTpudWxsLGJlJiZmZSYmeGUmJnhlLnNpemU/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXNjaGVtZXMifSxSZS5jcmVhdGVFbGVtZW50KHN0LHtzY2hlbWVzOnhlLHBhdGg6YWUsbWV0aG9kOmNlLHNwZWNBY3Rpb25zOkIsY3VycmVudFNjaGVtZTp6ZX0pKTpudWxsLCFiZXx8IWZlfHxwdC5sZW5ndGg8PTA/bnVsbDpSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InZhbGlkYXRpb24tZXJyb3JzIGVycm9ycy13cmFwcGVyIn0sIlBsZWFzZSBjb3JyZWN0IHRoZSBmb2xsb3dpbmcgdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHRyeSBhZ2Fpbi4iLFJlLmNyZWF0ZUVsZW1lbnQoInVsIixudWxsLHB0Lm1hcCgoKHMsbyk9PlJlLmNyZWF0ZUVsZW1lbnQoImxpIix7a2V5Om99LCIgIixzLCIgIikpKSkpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTpiZSYmbyYmZmU/ImJ0bi1ncm91cCI6ImV4ZWN1dGUtd3JhcHBlciJ9LGJlJiZmZT9SZS5jcmVhdGVFbGVtZW50KGV0LHtvcGVyYXRpb246VGUsc3BlY0FjdGlvbnM6QixzcGVjU2VsZWN0b3JzOiQsb2FzM1NlbGVjdG9yczpZLG9hczNBY3Rpb25zOnoscGF0aDphZSxtZXRob2Q6Y2Usb25FeGVjdXRlOngsZGlzYWJsZWQ6U2V9KTpudWxsLGJlJiZvJiZmZT9SZS5jcmVhdGVFbGVtZW50KHR0LHtzcGVjQWN0aW9uczpCLHBhdGg6YWUsbWV0aG9kOmNlfSk6bnVsbCksU2U/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJsb2FkaW5nLWNvbnRhaW5lciJ9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibG9hZGluZyJ9KSk6bnVsbCwkZT9SZS5jcmVhdGVFbGVtZW50KFhlLHtyZXNwb25zZXM6JGUscmVxdWVzdDppLHRyeUl0T3V0UmVzcG9uc2U6byxnZXRDb21wb25lbnQ6aixnZXRDb25maWdzOkwsc3BlY1NlbGVjdG9yczokLG9hczNBY3Rpb25zOnosb2FzM1NlbGVjdG9yczpZLHNwZWNBY3Rpb25zOkIscHJvZHVjZXM6JC5wcm9kdWNlc09wdGlvbnNGb3IoW2FlLGNlXSkscHJvZHVjZXNWYWx1ZTokLmN1cnJlbnRQcm9kdWNlc0ZvcihbYWUsY2VdKSxzcGVjUGF0aDpzLnB1c2goInJlc3BvbnNlcyIpLHBhdGg6YWUsbWV0aG9kOmNlLGRpc3BsYXlSZXF1ZXN0RHVyYXRpb246eWUsZm46Q30pOm51bGwsbHQmJlllLnNpemU/UmUuY3JlYXRlRWxlbWVudChpdCx7ZXh0ZW5zaW9uczpZZSxnZXRDb21wb25lbnQ6an0pOm51bGwpKSl9fWNsYXNzIE9wZXJhdGlvbkNvbnRhaW5lciBleHRlbmRzIFJlLlB1cmVDb21wb25lbnR7Y29uc3RydWN0b3IocyxvKXtzdXBlcihzLG8pO2NvbnN0e3RyeUl0T3V0RW5hYmxlZDppfT1zLmdldENvbmZpZ3MoKTt0aGlzLnN0YXRlPXt0cnlJdE91dEVuYWJsZWQ6aSxleGVjdXRlSW5Qcm9ncmVzczohMX19c3RhdGljIGRlZmF1bHRQcm9wcz17c2hvd1N1bW1hcnk6ITAscmVzcG9uc2U6bnVsbCxhbGxvd1RyeUl0T3V0OiEwLGRpc3BsYXlPcGVyYXRpb25JZDohMSxkaXNwbGF5UmVxdWVzdER1cmF0aW9uOiExfTttYXBTdGF0ZVRvUHJvcHMocyxvKXtjb25zdHtvcDppLGxheW91dFNlbGVjdG9yczphLGdldENvbmZpZ3M6dX09byx7ZG9jRXhwYW5zaW9uOl8sZGVlcExpbmtpbmc6dyxkaXNwbGF5T3BlcmF0aW9uSWQ6eCxkaXNwbGF5UmVxdWVzdER1cmF0aW9uOkMsc3VwcG9ydGVkU3VibWl0TWV0aG9kczpqfT11KCksTD1hLnNob3dTdW1tYXJ5KCksQj1pLmdldEluKFsib3BlcmF0aW9uIiwiX19vcmlnaW5hbE9wZXJhdGlvbklkIl0pfHxpLmdldEluKFsib3BlcmF0aW9uIiwib3BlcmF0aW9uSWQiXSl8fG9wSWQoaS5nZXQoIm9wZXJhdGlvbiIpLG8ucGF0aCxvLm1ldGhvZCl8fGkuZ2V0KCJpZCIpLCQ9WyJvcGVyYXRpb25zIixvLnRhZyxCXSxVPWouaW5kZXhPZihvLm1ldGhvZCk+PTAmJih2b2lkIDA9PT1vLmFsbG93VHJ5SXRPdXQ/by5zcGVjU2VsZWN0b3JzLmFsbG93VHJ5SXRPdXRGb3Ioby5wYXRoLG8ubWV0aG9kKTpvLmFsbG93VHJ5SXRPdXQpLFY9aS5nZXRJbihbIm9wZXJhdGlvbiIsInNlY3VyaXR5Il0pfHxvLnNwZWNTZWxlY3RvcnMuc2VjdXJpdHkoKTtyZXR1cm57b3BlcmF0aW9uSWQ6Qixpc0RlZXBMaW5raW5nRW5hYmxlZDp3LHNob3dTdW1tYXJ5OkwsZGlzcGxheU9wZXJhdGlvbklkOngsZGlzcGxheVJlcXVlc3REdXJhdGlvbjpDLGFsbG93VHJ5SXRPdXQ6VSxzZWN1cml0eTpWLGlzQXV0aG9yaXplZDpvLmF1dGhTZWxlY3RvcnMuaXNBdXRob3JpemVkKFYpLGlzU2hvd246YS5pc1Nob3duKCQsImZ1bGwiPT09XyksanVtcFRvS2V5OmBwYXRocy4ke28ucGF0aH0uJHtvLm1ldGhvZH1gLHJlc3BvbnNlOm8uc3BlY1NlbGVjdG9ycy5yZXNwb25zZUZvcihvLnBhdGgsby5tZXRob2QpLHJlcXVlc3Q6by5zcGVjU2VsZWN0b3JzLnJlcXVlc3RGb3Ioby5wYXRoLG8ubWV0aG9kKX19Y29tcG9uZW50RGlkTW91bnQoKXtjb25zdHtpc1Nob3duOnN9PXRoaXMucHJvcHMsbz10aGlzLmdldFJlc29sdmVkU3VidHJlZSgpO3MmJnZvaWQgMD09PW8mJnRoaXMucmVxdWVzdFJlc29sdmVkU3VidHJlZSgpfWNvbXBvbmVudERpZFVwZGF0ZShzKXtjb25zdHtyZXNwb25zZTpvLGlzU2hvd246aX09dGhpcy5wcm9wcyxhPXRoaXMuZ2V0UmVzb2x2ZWRTdWJ0cmVlKCk7byE9PXMucmVzcG9uc2UmJnRoaXMuc2V0U3RhdGUoe2V4ZWN1dGVJblByb2dyZXNzOiExfSksaSYmdm9pZCAwPT09YSYmdGhpcy5yZXF1ZXN0UmVzb2x2ZWRTdWJ0cmVlKCl9dG9nZ2xlU2hvd249KCk9PntsZXR7bGF5b3V0QWN0aW9uczpzLHRhZzpvLG9wZXJhdGlvbklkOmksaXNTaG93bjphfT10aGlzLnByb3BzO2NvbnN0IHU9dGhpcy5nZXRSZXNvbHZlZFN1YnRyZWUoKTthfHx2b2lkIDAhPT11fHx0aGlzLnJlcXVlc3RSZXNvbHZlZFN1YnRyZWUoKSxzLnNob3coWyJvcGVyYXRpb25zIixvLGldLCFhKX07b25DYW5jZWxDbGljaz0oKT0+e3RoaXMuc2V0U3RhdGUoe3RyeUl0T3V0RW5hYmxlZDohdGhpcy5zdGF0ZS50cnlJdE91dEVuYWJsZWR9KX07b25UcnlvdXRDbGljaz0oKT0+e3RoaXMuc2V0U3RhdGUoe3RyeUl0T3V0RW5hYmxlZDohdGhpcy5zdGF0ZS50cnlJdE91dEVuYWJsZWR9KX07b25SZXNldENsaWNrPXM9Pntjb25zdCBvPXRoaXMucHJvcHMub2FzM1NlbGVjdG9ycy5zZWxlY3REZWZhdWx0UmVxdWVzdEJvZHlWYWx1ZSguLi5zKSxpPXRoaXMucHJvcHMub2FzM1NlbGVjdG9ycy5yZXF1ZXN0Q29udGVudFR5cGUoLi4ucyk7aWYoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI9PT1pfHwibXVsdGlwYXJ0L2Zvcm0tZGF0YSI9PT1pKXtjb25zdCBpPUpTT04ucGFyc2Uobyk7T2JqZWN0LmVudHJpZXMoaSkuZm9yRWFjaCgoKFtzLG9dKT0+e0FycmF5LmlzQXJyYXkobyk/aVtzXT1pW3NdLm1hcCgocz0+Im9iamVjdCI9PXR5cGVvZiBzP0pTT04uc3RyaW5naWZ5KHMsbnVsbCwyKTpzKSk6Im9iamVjdCI9PXR5cGVvZiBvJiYoaVtzXT1KU09OLnN0cmluZ2lmeShpW3NdLG51bGwsMikpfSkpLHRoaXMucHJvcHMub2FzM0FjdGlvbnMuc2V0UmVxdWVzdEJvZHlWYWx1ZSh7dmFsdWU6KDAsemUuZnJvbUpTKShpKSxwYXRoTWV0aG9kOnN9KX1lbHNlIHRoaXMucHJvcHMub2FzM0FjdGlvbnMuc2V0UmVxdWVzdEJvZHlWYWx1ZSh7dmFsdWU6byxwYXRoTWV0aG9kOnN9KX07b25FeGVjdXRlPSgpPT57dGhpcy5zZXRTdGF0ZSh7ZXhlY3V0ZUluUHJvZ3Jlc3M6ITB9KX07Z2V0UmVzb2x2ZWRTdWJ0cmVlPSgpPT57Y29uc3R7c3BlY1NlbGVjdG9yczpzLHBhdGg6byxtZXRob2Q6aSxzcGVjUGF0aDphfT10aGlzLnByb3BzO3JldHVybiBhP3Muc3BlY1Jlc29sdmVkU3VidHJlZShhLnRvSlMoKSk6cy5zcGVjUmVzb2x2ZWRTdWJ0cmVlKFsicGF0aHMiLG8saV0pfTtyZXF1ZXN0UmVzb2x2ZWRTdWJ0cmVlPSgpPT57Y29uc3R7c3BlY0FjdGlvbnM6cyxwYXRoOm8sbWV0aG9kOmksc3BlY1BhdGg6YX09dGhpcy5wcm9wcztyZXR1cm4gYT9zLnJlcXVlc3RSZXNvbHZlZFN1YnRyZWUoYS50b0pTKCkpOnMucmVxdWVzdFJlc29sdmVkU3VidHJlZShbInBhdGhzIixvLGldKX07cmVuZGVyKCl7bGV0e29wOnMsdGFnOm8scGF0aDppLG1ldGhvZDphLHNlY3VyaXR5OnUsaXNBdXRob3JpemVkOl8sb3BlcmF0aW9uSWQ6dyxzaG93U3VtbWFyeTp4LGlzU2hvd246QyxqdW1wVG9LZXk6aixhbGxvd1RyeUl0T3V0OkwscmVzcG9uc2U6QixyZXF1ZXN0OiQsZGlzcGxheU9wZXJhdGlvbklkOlUsZGlzcGxheVJlcXVlc3REdXJhdGlvbjpWLGlzRGVlcExpbmtpbmdFbmFibGVkOnosc3BlY1BhdGg6WSxzcGVjU2VsZWN0b3JzOlosc3BlY0FjdGlvbnM6ZWUsZ2V0Q29tcG9uZW50OmllLGdldENvbmZpZ3M6YWUsbGF5b3V0U2VsZWN0b3JzOmNlLGxheW91dEFjdGlvbnM6bGUsYXV0aEFjdGlvbnM6cGUsYXV0aFNlbGVjdG9yczpkZSxvYXMzQWN0aW9uczpmZSxvYXMzU2VsZWN0b3JzOnllLGZuOmJlfT10aGlzLnByb3BzO2NvbnN0IFNlPWllKCJvcGVyYXRpb24iKSxfZT10aGlzLmdldFJlc29sdmVkU3VidHJlZSgpfHwoMCx6ZS5NYXApKCksd2U9KDAsemUuZnJvbUpTKSh7b3A6X2UsdGFnOm8scGF0aDppLHN1bW1hcnk6cy5nZXRJbihbIm9wZXJhdGlvbiIsInN1bW1hcnkiXSl8fCIiLGRlcHJlY2F0ZWQ6X2UuZ2V0KCJkZXByZWNhdGVkIil8fHMuZ2V0SW4oWyJvcGVyYXRpb24iLCJkZXByZWNhdGVkIl0pfHwhMSxtZXRob2Q6YSxzZWN1cml0eTp1LGlzQXV0aG9yaXplZDpfLG9wZXJhdGlvbklkOncsb3JpZ2luYWxPcGVyYXRpb25JZDpfZS5nZXRJbihbIm9wZXJhdGlvbiIsIl9fb3JpZ2luYWxPcGVyYXRpb25JZCJdKSxzaG93U3VtbWFyeTp4LGlzU2hvd246QyxqdW1wVG9LZXk6aixhbGxvd1RyeUl0T3V0OkwscmVxdWVzdDokLGRpc3BsYXlPcGVyYXRpb25JZDpVLGRpc3BsYXlSZXF1ZXN0RHVyYXRpb246Vixpc0RlZXBMaW5raW5nRW5hYmxlZDp6LGV4ZWN1dGVJblByb2dyZXNzOnRoaXMuc3RhdGUuZXhlY3V0ZUluUHJvZ3Jlc3MsdHJ5SXRPdXRFbmFibGVkOnRoaXMuc3RhdGUudHJ5SXRPdXRFbmFibGVkfSk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoU2Use29wZXJhdGlvbjp3ZSxyZXNwb25zZTpCLHJlcXVlc3Q6JCxpc1Nob3duOkMsdG9nZ2xlU2hvd246dGhpcy50b2dnbGVTaG93bixvblRyeW91dENsaWNrOnRoaXMub25UcnlvdXRDbGljayxvblJlc2V0Q2xpY2s6dGhpcy5vblJlc2V0Q2xpY2ssb25DYW5jZWxDbGljazp0aGlzLm9uQ2FuY2VsQ2xpY2ssb25FeGVjdXRlOnRoaXMub25FeGVjdXRlLHNwZWNQYXRoOlksc3BlY0FjdGlvbnM6ZWUsc3BlY1NlbGVjdG9yczpaLG9hczNBY3Rpb25zOmZlLG9hczNTZWxlY3RvcnM6eWUsbGF5b3V0QWN0aW9uczpsZSxsYXlvdXRTZWxlY3RvcnM6Y2UsYXV0aEFjdGlvbnM6cGUsYXV0aFNlbGVjdG9yczpkZSxnZXRDb21wb25lbnQ6aWUsZ2V0Q29uZmlnczphZSxmbjpiZX0pfX12YXIgek89X193ZWJwYWNrX3JlcXVpcmVfXygxMzIyMiksV089X193ZWJwYWNrX3JlcXVpcmVfXy5uKHpPKTtjbGFzcyBPcGVyYXRpb25TdW1tYXJ5IGV4dGVuZHMgUmUuUHVyZUNvbXBvbmVudHtzdGF0aWMgZGVmYXVsdFByb3BzPXtvcGVyYXRpb25Qcm9wczpudWxsLHNwZWNQYXRoOigwLHplLkxpc3QpKCksc3VtbWFyeToiIn07cmVuZGVyKCl7bGV0e2lzU2hvd246cyx0b2dnbGVTaG93bjpvLGdldENvbXBvbmVudDppLGF1dGhBY3Rpb25zOmEsYXV0aFNlbGVjdG9yczp1LG9wZXJhdGlvblByb3BzOl8sc3BlY1BhdGg6d309dGhpcy5wcm9wcyx7c3VtbWFyeTp4LGlzQXV0aG9yaXplZDpDLG1ldGhvZDpqLG9wOkwsc2hvd1N1bW1hcnk6QixwYXRoOiQsb3BlcmF0aW9uSWQ6VSxvcmlnaW5hbE9wZXJhdGlvbklkOlYsZGlzcGxheU9wZXJhdGlvbklkOnp9PV8udG9PYmplY3QoKTtjb25zdCBZPUwuZ2V0KCJzdW1tYXJ5IiksWj1fLmdldCgic2VjdXJpdHkiKSxlZT1pKCJhdXRob3JpemVPcGVyYXRpb25CdG4iLCEwKSxpZT1pKCJPcGVyYXRpb25TdW1tYXJ5TWV0aG9kIiksYWU9aSgiT3BlcmF0aW9uU3VtbWFyeVBhdGgiKSxjZT1pKCJKdW1wVG9QYXRoIiwhMCksbGU9aSgiQ29weVRvQ2xpcGJvYXJkQnRuIiwhMCkscGU9aSgiQXJyb3dVcEljb24iKSxkZT1pKCJBcnJvd0Rvd25JY29uIiksZmU9WiYmISFaLmNvdW50KCkseWU9ZmUmJjE9PT1aLnNpemUmJlouZmlyc3QoKS5pc0VtcHR5KCksYmU9IWZlfHx5ZTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOmBvcGJsb2NrLXN1bW1hcnkgb3BibG9jay1zdW1tYXJ5LSR7an1gfSxSZS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHsiYXJpYS1leHBhbmRlZCI6cyxjbGFzc05hbWU6Im9wYmxvY2stc3VtbWFyeS1jb250cm9sIixvbkNsaWNrOm99LFJlLmNyZWF0ZUVsZW1lbnQoaWUse21ldGhvZDpqfSksUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXN1bW1hcnktcGF0aC1kZXNjcmlwdGlvbi13cmFwcGVyIn0sUmUuY3JlYXRlRWxlbWVudChhZSx7Z2V0Q29tcG9uZW50Omksb3BlcmF0aW9uUHJvcHM6XyxzcGVjUGF0aDp3fSksQj9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stc3VtbWFyeS1kZXNjcmlwdGlvbiJ9LFdPKCkoWXx8eCkpOm51bGwpLHomJihWfHxVKT9SZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJvcGJsb2NrLXN1bW1hcnktb3BlcmF0aW9uLWlkIn0sVnx8VSk6bnVsbCksUmUuY3JlYXRlRWxlbWVudChsZSx7dGV4dFRvQ29weTpgJHt3LmdldCgxKX1gfSksYmU/bnVsbDpSZS5jcmVhdGVFbGVtZW50KGVlLHtpc0F1dGhvcml6ZWQ6QyxvbkNsaWNrOigpPT57Y29uc3Qgcz11LmRlZmluaXRpb25zRm9yUmVxdWlyZW1lbnRzKFopO2Euc2hvd0RlZmluaXRpb25zKHMpfX0pLFJlLmNyZWF0ZUVsZW1lbnQoY2Use3BhdGg6d30pLFJlLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIseyJhcmlhLWxhYmVsIjpgJHtqfSAkeyQucmVwbGFjZSgvXC8vZywi4oCLLyIpfWAsY2xhc3NOYW1lOiJvcGJsb2NrLWNvbnRyb2wtYXJyb3ciLCJhcmlhLWV4cGFuZGVkIjpzLHRhYkluZGV4OiItMSIsb25DbGljazpvfSxzP1JlLmNyZWF0ZUVsZW1lbnQocGUse2NsYXNzTmFtZToiYXJyb3cifSk6UmUuY3JlYXRlRWxlbWVudChkZSx7Y2xhc3NOYW1lOiJhcnJvdyJ9KSkpfX1jbGFzcyBPcGVyYXRpb25TdW1tYXJ5TWV0aG9kIGV4dGVuZHMgUmUuUHVyZUNvbXBvbmVudHtzdGF0aWMgZGVmYXVsdFByb3BzPXtvcGVyYXRpb25Qcm9wczpudWxsfTtyZW5kZXIoKXtsZXR7bWV0aG9kOnN9PXRoaXMucHJvcHM7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im9wYmxvY2stc3VtbWFyeS1tZXRob2QifSxzLnRvVXBwZXJDYXNlKCkpfX1jbGFzcyBPcGVyYXRpb25TdW1tYXJ5UGF0aCBleHRlbmRzIFJlLlB1cmVDb21wb25lbnR7cmVuZGVyKCl7bGV0e2dldENvbXBvbmVudDpzLG9wZXJhdGlvblByb3BzOm99PXRoaXMucHJvcHMse2RlcHJlY2F0ZWQ6aSxpc1Nob3duOmEscGF0aDp1LHRhZzpfLG9wZXJhdGlvbklkOncsaXNEZWVwTGlua2luZ0VuYWJsZWQ6eH09by50b09iamVjdCgpO2NvbnN0IEM9dS5zcGxpdCgvKD89XC8pL2cpO2ZvcihsZXQgcz0xO3M8Qy5sZW5ndGg7cys9MilDLnNwbGljZShzLDAsUmUuY3JlYXRlRWxlbWVudCgid2JyIix7a2V5OnN9KSk7Y29uc3Qgaj1zKCJEZWVwTGluayIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOmk/Im9wYmxvY2stc3VtbWFyeS1wYXRoX19kZXByZWNhdGVkIjoib3BibG9jay1zdW1tYXJ5LXBhdGgiLCJkYXRhLXBhdGgiOnV9LFJlLmNyZWF0ZUVsZW1lbnQoaix7ZW5hYmxlZDp4LGlzU2hvd246YSxwYXRoOmNyZWF0ZURlZXBMaW5rUGF0aChgJHtffS8ke3d9YCksdGV4dDpDfSkpfX1jb25zdCBvcGVyYXRpb25fZXh0ZW5zaW9ucz0oe2V4dGVuc2lvbnM6cyxnZXRDb21wb25lbnQ6b30pPT57bGV0IGk9bygiT3BlcmF0aW9uRXh0Um93Iik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1zZWN0aW9uIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXNlY3Rpb24taGVhZGVyIn0sUmUuY3JlYXRlRWxlbWVudCgiaDQiLG51bGwsIkV4dGVuc2lvbnMiKSksUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ0YWJsZS1jb250YWluZXIifSxSZS5jcmVhdGVFbGVtZW50KCJ0YWJsZSIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJ0aGVhZCIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJ0ciIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToiY29sX2hlYWRlciJ9LCJGaWVsZCIpLFJlLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJjb2xfaGVhZGVyIn0sIlZhbHVlIikpKSxSZS5jcmVhdGVFbGVtZW50KCJ0Ym9keSIsbnVsbCxzLmVudHJ5U2VxKCkubWFwKCgoW3Msb10pPT5SZS5jcmVhdGVFbGVtZW50KGkse2tleTpgJHtzfS0ke299YCx4S2V5OnMseFZhbDpvfSkpKSkpKSl9LG9wZXJhdGlvbl9leHRlbnNpb25fcm93PSh7eEtleTpzLHhWYWw6b30pPT57Y29uc3QgaT1vP28udG9KUz9vLnRvSlMoKTpvOm51bGw7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoInRyIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLHMpLFJlLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLEpTT04uc3RyaW5naWZ5KGkpKSl9O2Z1bmN0aW9uIGNyZWF0ZUh0bWxSZWFkeUlkKHMsbz0iXyIpe3JldHVybiBzLnJlcGxhY2UoL1teXHctXS9nLG8pfWNsYXNzIHJlc3BvbnNlc19SZXNwb25zZXMgZXh0ZW5kcyBSZS5Db21wb25lbnR7c3RhdGljIGRlZmF1bHRQcm9wcz17dHJ5SXRPdXRSZXNwb25zZTpudWxsLHByb2R1Y2VzOigwLHplLmZyb21KUykoWyJhcHBsaWNhdGlvbi9qc29uIl0pLGRpc3BsYXlSZXF1ZXN0RHVyYXRpb246ITF9O29uQ2hhbmdlUHJvZHVjZXNXcmFwcGVyPXM9PnRoaXMucHJvcHMuc3BlY0FjdGlvbnMuY2hhbmdlUHJvZHVjZXNWYWx1ZShbdGhpcy5wcm9wcy5wYXRoLHRoaXMucHJvcHMubWV0aG9kXSxzKTtvblJlc3BvbnNlQ29udGVudFR5cGVDaGFuZ2U9KHtjb250cm9sc0FjY2VwdEhlYWRlcjpzLHZhbHVlOm99KT0+e2NvbnN0e29hczNBY3Rpb25zOmkscGF0aDphLG1ldGhvZDp1fT10aGlzLnByb3BzO3MmJmkuc2V0UmVzcG9uc2VDb250ZW50VHlwZSh7dmFsdWU6byxwYXRoOmEsbWV0aG9kOnV9KX07cmVuZGVyKCl7bGV0e3Jlc3BvbnNlczpzLHRyeUl0T3V0UmVzcG9uc2U6byxnZXRDb21wb25lbnQ6aSxnZXRDb25maWdzOmEsc3BlY1NlbGVjdG9yczp1LGZuOl8scHJvZHVjZXNWYWx1ZTp3LGRpc3BsYXlSZXF1ZXN0RHVyYXRpb246eCxzcGVjUGF0aDpDLHBhdGg6aixtZXRob2Q6TCxvYXMzU2VsZWN0b3JzOkIsb2FzM0FjdGlvbnM6JH09dGhpcy5wcm9wcyxVPWZ1bmN0aW9uIGRlZmF1bHRTdGF0dXNDb2RlKHMpe2xldCBvPXMua2V5U2VxKCk7cmV0dXJuIG8uY29udGFpbnMoanQpP2p0Om8uZmlsdGVyKChzPT4iMiI9PT0ocysiIilbMF0pKS5zb3J0KCkuZmlyc3QoKX0ocyk7Y29uc3QgVj1pKCJjb250ZW50VHlwZSIpLHo9aSgibGl2ZVJlc3BvbnNlIiksWT1pKCJyZXNwb25zZSIpO2xldCBaPXRoaXMucHJvcHMucHJvZHVjZXMmJnRoaXMucHJvcHMucHJvZHVjZXMuc2l6ZT90aGlzLnByb3BzLnByb2R1Y2VzOnJlc3BvbnNlc19SZXNwb25zZXMuZGVmYXVsdFByb3BzLnByb2R1Y2VzO2NvbnN0IGVlPXUuaXNPQVMzKCk/ZnVuY3Rpb24gZ2V0QWNjZXB0Q29udHJvbGxpbmdSZXNwb25zZShzKXtpZighV2UoKS5PcmRlcmVkTWFwLmlzT3JkZXJlZE1hcChzKSlyZXR1cm4gbnVsbDtpZighcy5zaXplKXJldHVybiBudWxsO2NvbnN0IG89cy5maW5kKCgocyxvKT0+by5zdGFydHNXaXRoKCIyIikmJk9iamVjdC5rZXlzKHMuZ2V0KCJjb250ZW50Iil8fHt9KS5sZW5ndGg+MCkpLGk9cy5nZXQoImRlZmF1bHQiKXx8V2UoKS5PcmRlcmVkTWFwKCksYT0oaS5nZXQoImNvbnRlbnQiKXx8V2UoKS5PcmRlcmVkTWFwKCkpLmtleVNlcSgpLnRvSlMoKS5sZW5ndGg/aTpudWxsO3JldHVybiBvfHxhfShzKTpudWxsLGllPXMuZmlsdGVyKCgocyxvKT0+IWlzRXh0ZW5zaW9uKG8pKSksYWU9Y3JlYXRlSHRtbFJlYWR5SWQoYCR7TH0ke2p9X3Jlc3BvbnNlc2ApLGNlPWAke2FlfV9zZWxlY3RgO3JldHVybiBpZSYmaWUuc2l6ZT9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InJlc3BvbnNlcy13cmFwcGVyIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXNlY3Rpb24taGVhZGVyIn0sUmUuY3JlYXRlRWxlbWVudCgiaDQiLG51bGwsIlJlc3BvbnNlcyIpLHUuaXNPQVMzKCk/bnVsbDpSZS5jcmVhdGVFbGVtZW50KCJsYWJlbCIse2h0bWxGb3I6Y2V9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsIlJlc3BvbnNlIGNvbnRlbnQgdHlwZSIpLFJlLmNyZWF0ZUVsZW1lbnQoVix7dmFsdWU6dyxhcmlhQ29udHJvbHM6YWUsYXJpYUxhYmVsOiJSZXNwb25zZSBjb250ZW50IHR5cGUiLGNsYXNzTmFtZToiZXhlY3V0ZS1jb250ZW50LXR5cGUiLGNvbnRlbnRUeXBlczpaLGNvbnRyb2xJZDpjZSxvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlUHJvZHVjZXNXcmFwcGVyfSkpKSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InJlc3BvbnNlcy1pbm5lciJ9LG8/UmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoeix7cmVzcG9uc2U6byxnZXRDb21wb25lbnQ6aSxnZXRDb25maWdzOmEsc3BlY1NlbGVjdG9yczp1LHBhdGg6dGhpcy5wcm9wcy5wYXRoLG1ldGhvZDp0aGlzLnByb3BzLm1ldGhvZCxkaXNwbGF5UmVxdWVzdER1cmF0aW9uOnh9KSxSZS5jcmVhdGVFbGVtZW50KCJoNCIsbnVsbCwiUmVzcG9uc2VzIikpOm51bGwsUmUuY3JlYXRlRWxlbWVudCgidGFibGUiLHsiYXJpYS1saXZlIjoicG9saXRlIixjbGFzc05hbWU6InJlc3BvbnNlcy10YWJsZSIsaWQ6YWUscm9sZToicmVnaW9uIn0sUmUuY3JlYXRlRWxlbWVudCgidGhlYWQiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgidHIiLHtjbGFzc05hbWU6InJlc3BvbnNlcy1oZWFkZXIifSxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToiY29sX2hlYWRlciByZXNwb25zZS1jb2xfc3RhdHVzIn0sIkNvZGUiKSxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToiY29sX2hlYWRlciByZXNwb25zZS1jb2xfZGVzY3JpcHRpb24ifSwiRGVzY3JpcHRpb24iKSx1LmlzT0FTMygpP1JlLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJjb2wgY29sX2hlYWRlciByZXNwb25zZS1jb2xfbGlua3MifSwiTGlua3MiKTpudWxsKSksUmUuY3JlYXRlRWxlbWVudCgidGJvZHkiLG51bGwsaWUuZW50cnlTZXEoKS5tYXAoKChbcyx4XSk9PntsZXQgVj1vJiZvLmdldCgic3RhdHVzIik9PXM/InJlc3BvbnNlX2N1cnJlbnQiOiIiO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KFkse2tleTpzLHBhdGg6aixtZXRob2Q6TCxzcGVjUGF0aDpDLnB1c2gocyksaXNEZWZhdWx0OlU9PT1zLGZuOl8sY2xhc3NOYW1lOlYsY29kZTpzLHJlc3BvbnNlOngsc3BlY1NlbGVjdG9yczp1LGNvbnRyb2xzQWNjZXB0SGVhZGVyOng9PT1lZSxvbkNvbnRlbnRUeXBlQ2hhbmdlOnRoaXMub25SZXNwb25zZUNvbnRlbnRUeXBlQ2hhbmdlLGNvbnRlbnRUeXBlOncsZ2V0Q29uZmlnczphLGFjdGl2ZUV4YW1wbGVzS2V5OkIuYWN0aXZlRXhhbXBsZXNNZW1iZXIoaixMLCJyZXNwb25zZXMiLHMpLG9hczNBY3Rpb25zOiQsZ2V0Q29tcG9uZW50Oml9KX0pKS50b0FycmF5KCkpKSkpOm51bGx9fWZ1bmN0aW9uIGdldEtub3duU3ludGF4SGlnaGxpZ2h0ZXJMYW5ndWFnZShzKXtjb25zdCBvPWZ1bmN0aW9uIGNhbkpzb25QYXJzZShzKXt0cnl7cmV0dXJuISFKU09OLnBhcnNlKHMpfWNhdGNoKHMpe3JldHVybiBudWxsfX0ocyk7cmV0dXJuIG8/Impzb24iOm51bGx9Y2xhc3MgcmVzcG9uc2VfUmVzcG9uc2UgZXh0ZW5kcyBSZS5Db21wb25lbnR7Y29uc3RydWN0b3IocyxvKXtzdXBlcihzLG8pLHRoaXMuc3RhdGU9e3Jlc3BvbnNlQ29udGVudFR5cGU6IiJ9fXN0YXRpYyBkZWZhdWx0UHJvcHM9e3Jlc3BvbnNlOigwLHplLmZyb21KUykoe30pLG9uQ29udGVudFR5cGVDaGFuZ2U6KCk9Pnt9fTtfb25Db250ZW50VHlwZUNoYW5nZT1zPT57Y29uc3R7b25Db250ZW50VHlwZUNoYW5nZTpvLGNvbnRyb2xzQWNjZXB0SGVhZGVyOml9PXRoaXMucHJvcHM7dGhpcy5zZXRTdGF0ZSh7cmVzcG9uc2VDb250ZW50VHlwZTpzfSksbyh7dmFsdWU6cyxjb250cm9sc0FjY2VwdEhlYWRlcjppfSl9O2dldFRhcmdldEV4YW1wbGVzS2V5PSgpPT57Y29uc3R7cmVzcG9uc2U6cyxjb250ZW50VHlwZTpvLGFjdGl2ZUV4YW1wbGVzS2V5Oml9PXRoaXMucHJvcHMsYT10aGlzLnN0YXRlLnJlc3BvbnNlQ29udGVudFR5cGV8fG8sdT1zLmdldEluKFsiY29udGVudCIsYV0sKDAsemUuTWFwKSh7fSkpLmdldCgiZXhhbXBsZXMiLG51bGwpLmtleVNlcSgpLmZpcnN0KCk7cmV0dXJuIGl8fHV9O3JlbmRlcigpe2xldHtwYXRoOnMsbWV0aG9kOm8sY29kZTppLHJlc3BvbnNlOmEsY2xhc3NOYW1lOnUsc3BlY1BhdGg6Xyxmbjp3LGdldENvbXBvbmVudDp4LGdldENvbmZpZ3M6QyxzcGVjU2VsZWN0b3JzOmosY29udGVudFR5cGU6TCxjb250cm9sc0FjY2VwdEhlYWRlcjpCLG9hczNBY3Rpb25zOiR9PXRoaXMucHJvcHMse2luZmVyU2NoZW1hOlUsZ2V0U2FtcGxlU2NoZW1hOlZ9PXcsej1qLmlzT0FTMygpO2NvbnN0e3Nob3dFeHRlbnNpb25zOll9PUMoKTtsZXQgWj1ZP2dldEV4dGVuc2lvbnMoYSk6bnVsbCxlZT1hLmdldCgiaGVhZGVycyIpLGllPWEuZ2V0KCJsaW5rcyIpO2NvbnN0IGFlPXgoIlJlc3BvbnNlRXh0ZW5zaW9uIiksY2U9eCgiaGVhZGVycyIpLGxlPXgoIkhpZ2hsaWdodENvZGUiLCEwKSxwZT14KCJtb2RlbEV4YW1wbGUiKSxkZT14KCJNYXJrZG93biIsITApLGZlPXgoIm9wZXJhdGlvbkxpbmsiKSx5ZT14KCJjb250ZW50VHlwZSIpLGJlPXgoIkV4YW1wbGVzU2VsZWN0IiksU2U9eCgiRXhhbXBsZSIpO3ZhciBfZSx3ZTtjb25zdCB4ZT10aGlzLnN0YXRlLnJlc3BvbnNlQ29udGVudFR5cGV8fEwsUGU9YS5nZXRJbihbImNvbnRlbnQiLHhlXSwoMCx6ZS5NYXApKHt9KSksVGU9UGUuZ2V0KCJleGFtcGxlcyIsbnVsbCk7aWYoeil7Y29uc3Qgcz1QZS5nZXQoInNjaGVtYSIpO19lPXM/VShzLnRvSlMoKSk6bnVsbCx3ZT1zP18ucHVzaCgiY29udGVudCIsdGhpcy5zdGF0ZS5yZXNwb25zZUNvbnRlbnRUeXBlLCJzY2hlbWEiKTpffWVsc2UgX2U9YS5nZXQoInNjaGVtYSIpLHdlPWEuaGFzKCJzY2hlbWEiKT9fLnB1c2goInNjaGVtYSIpOl87bGV0ICRlLHFlLFdlPSExLEhlPXtpbmNsdWRlUmVhZE9ubHk6ITB9O2lmKHopaWYocWU9UGUuZ2V0KCJzY2hlbWEiKT8udG9KUygpLHplLk1hcC5pc01hcChUZSkmJiFUZS5pc0VtcHR5KCkpe2NvbnN0IHM9dGhpcy5nZXRUYXJnZXRFeGFtcGxlc0tleSgpLGdldE1lZGlhVHlwZUV4YW1wbGU9cz0+emUuTWFwLmlzTWFwKHMpP3MuZ2V0KCJ2YWx1ZSIpOnZvaWQgMDskZT1nZXRNZWRpYVR5cGVFeGFtcGxlKFRlLmdldChzLCgwLHplLk1hcCkoe30pKSksdm9pZCAwPT09JGUmJigkZT1nZXRNZWRpYVR5cGVFeGFtcGxlKFRlLnZhbHVlcygpLm5leHQoKS52YWx1ZSkpLFdlPSEwfWVsc2Ugdm9pZCAwIT09UGUuZ2V0KCJleGFtcGxlIikmJigkZT1QZS5nZXQoImV4YW1wbGUiKSxXZT0hMCk7ZWxzZXtxZT1fZSxIZT17Li4uSGUsaW5jbHVkZVdyaXRlT25seTohMH07Y29uc3Qgcz1hLmdldEluKFsiZXhhbXBsZXMiLHhlXSk7cyYmKCRlPXMsV2U9ITApfWNvbnN0IFllPSgocyxvKT0+e2lmKG51bGw9PXMpcmV0dXJuIG51bGw7Y29uc3QgaT1nZXRLbm93blN5bnRheEhpZ2hsaWdodGVyTGFuZ3VhZ2Uocyk/Impzb24iOm51bGw7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KG8se2NsYXNzTmFtZToiZXhhbXBsZSIsbGFuZ3VhZ2U6aX0sc3RyaW5naWZ5KHMpKSl9KShWKHFlLHhlLEhlLFdlPyRlOnZvaWQgMCksbGUpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJ0ciIse2NsYXNzTmFtZToicmVzcG9uc2UgIisodXx8IiIpLCJkYXRhLWNvZGUiOml9LFJlLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJyZXNwb25zZS1jb2xfc3RhdHVzIn0saSksUmUuY3JlYXRlRWxlbWVudCgidGQiLHtjbGFzc05hbWU6InJlc3BvbnNlLWNvbF9kZXNjcmlwdGlvbiJ9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicmVzcG9uc2UtY29sX2Rlc2NyaXB0aW9uX19pbm5lciJ9LFJlLmNyZWF0ZUVsZW1lbnQoZGUse3NvdXJjZTphLmdldCgiZGVzY3JpcHRpb24iKX0pKSxZJiZaLnNpemU/Wi5lbnRyeVNlcSgpLm1hcCgoKFtzLG9dKT0+UmUuY3JlYXRlRWxlbWVudChhZSx7a2V5OmAke3N9LSR7b31gLHhLZXk6cyx4VmFsOm99KSkpOm51bGwseiYmYS5nZXQoImNvbnRlbnQiKT9SZS5jcmVhdGVFbGVtZW50KCJzZWN0aW9uIix7Y2xhc3NOYW1lOiJyZXNwb25zZS1jb250cm9scyJ9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTpKbigpKCJyZXNwb25zZS1jb250cm9sLW1lZGlhLXR5cGUiLHsicmVzcG9uc2UtY29udHJvbC1tZWRpYS10eXBlLS1hY2NlcHQtY29udHJvbGxlciI6Qn0pfSxSZS5jcmVhdGVFbGVtZW50KCJzbWFsbCIse2NsYXNzTmFtZToicmVzcG9uc2UtY29udHJvbC1tZWRpYS10eXBlX190aXRsZSJ9LCJNZWRpYSB0eXBlIiksUmUuY3JlYXRlRWxlbWVudCh5ZSx7dmFsdWU6dGhpcy5zdGF0ZS5yZXNwb25zZUNvbnRlbnRUeXBlLGNvbnRlbnRUeXBlczphLmdldCgiY29udGVudCIpP2EuZ2V0KCJjb250ZW50Iikua2V5U2VxKCk6KDAsemUuU2VxKSgpLG9uQ2hhbmdlOnRoaXMuX29uQ29udGVudFR5cGVDaGFuZ2UsYXJpYUxhYmVsOiJNZWRpYSBUeXBlIn0pLEI/UmUuY3JlYXRlRWxlbWVudCgic21hbGwiLHtjbGFzc05hbWU6InJlc3BvbnNlLWNvbnRyb2wtbWVkaWEtdHlwZV9fYWNjZXB0LW1lc3NhZ2UifSwiQ29udHJvbHMgIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJBY2NlcHQiKSwiIGhlYWRlci4iKTpudWxsKSx6ZS5NYXAuaXNNYXAoVGUpJiYhVGUuaXNFbXB0eSgpP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicmVzcG9uc2UtY29udHJvbC1leGFtcGxlcyJ9LFJlLmNyZWF0ZUVsZW1lbnQoInNtYWxsIix7Y2xhc3NOYW1lOiJyZXNwb25zZS1jb250cm9sLWV4YW1wbGVzX190aXRsZSJ9LCJFeGFtcGxlcyIpLFJlLmNyZWF0ZUVsZW1lbnQoYmUse2V4YW1wbGVzOlRlLGN1cnJlbnRFeGFtcGxlS2V5OnRoaXMuZ2V0VGFyZ2V0RXhhbXBsZXNLZXkoKSxvblNlbGVjdDphPT4kLnNldEFjdGl2ZUV4YW1wbGVzTWVtYmVyKHtuYW1lOmEscGF0aE1ldGhvZDpbcyxvXSxjb250ZXh0VHlwZToicmVzcG9uc2VzIixjb250ZXh0TmFtZTppfSksc2hvd0xhYmVsczohMX0pKTpudWxsKTpudWxsLFllfHxfZT9SZS5jcmVhdGVFbGVtZW50KHBlLHtzcGVjUGF0aDp3ZSxnZXRDb21wb25lbnQ6eCxnZXRDb25maWdzOkMsc3BlY1NlbGVjdG9yczpqLHNjaGVtYTpmcm9tSlNPcmRlcmVkKF9lKSxleGFtcGxlOlllLGluY2x1ZGVSZWFkT25seTohMH0pOm51bGwseiYmVGU/UmUuY3JlYXRlRWxlbWVudChTZSx7ZXhhbXBsZTpUZS5nZXQodGhpcy5nZXRUYXJnZXRFeGFtcGxlc0tleSgpLCgwLHplLk1hcCkoe30pKSxnZXRDb21wb25lbnQ6eCxnZXRDb25maWdzOkMsb21pdFZhbHVlOiEwfSk6bnVsbCxlZT9SZS5jcmVhdGVFbGVtZW50KGNlLHtoZWFkZXJzOmVlLGdldENvbXBvbmVudDp4fSk6bnVsbCksej9SZS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToicmVzcG9uc2UtY29sX2xpbmtzIn0saWU/aWUudG9TZXEoKS5lbnRyeVNlcSgpLm1hcCgoKFtzLG9dKT0+UmUuY3JlYXRlRWxlbWVudChmZSx7a2V5OnMsbmFtZTpzLGxpbms6byxnZXRDb21wb25lbnQ6eH0pKSk6UmUuY3JlYXRlRWxlbWVudCgiaSIsbnVsbCwiTm8gbGlua3MiKSk6bnVsbCl9fWNvbnN0IHJlc3BvbnNlX2V4dGVuc2lvbj0oe3hLZXk6cyx4VmFsOm99KT0+UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJyZXNwb25zZV9fZXh0ZW5zaW9uIn0scywiOiAiLFN0cmluZyhvKSk7dmFyIEpPPV9fd2VicGFja19yZXF1aXJlX18oMjY2NTcpLEhPPV9fd2VicGFja19yZXF1aXJlX18ubihKTyksS089X193ZWJwYWNrX3JlcXVpcmVfXyg4MDIxOCksR089X193ZWJwYWNrX3JlcXVpcmVfXy5uKEtPKTtjbGFzcyBSZXNwb25zZUJvZHkgZXh0ZW5kcyBSZS5QdXJlQ29tcG9uZW50e3N0YXRlPXtwYXJzZWRDb250ZW50Om51bGx9O3VwZGF0ZVBhcnNlZENvbnRlbnQ9cz0+e2NvbnN0e2NvbnRlbnQ6b309dGhpcy5wcm9wcztpZihzIT09bylpZihvJiZvIGluc3RhbmNlb2YgQmxvYil7dmFyIGk9bmV3IEZpbGVSZWFkZXI7aS5vbmxvYWQ9KCk9Pnt0aGlzLnNldFN0YXRlKHtwYXJzZWRDb250ZW50OmkucmVzdWx0fSl9LGkucmVhZEFzVGV4dChvKX1lbHNlIHRoaXMuc2V0U3RhdGUoe3BhcnNlZENvbnRlbnQ6by50b1N0cmluZygpfSl9O2NvbXBvbmVudERpZE1vdW50KCl7dGhpcy51cGRhdGVQYXJzZWRDb250ZW50KG51bGwpfWNvbXBvbmVudERpZFVwZGF0ZShzKXt0aGlzLnVwZGF0ZVBhcnNlZENvbnRlbnQocy5jb250ZW50KX1yZW5kZXIoKXtsZXR7Y29udGVudDpzLGNvbnRlbnRUeXBlOm8sdXJsOmksaGVhZGVyczphPXt9LGdldENvbXBvbmVudDp1fT10aGlzLnByb3BzO2NvbnN0e3BhcnNlZENvbnRlbnQ6X309dGhpcy5zdGF0ZSx3PXUoIkhpZ2hsaWdodENvZGUiLCEwKSx4PSJyZXNwb25zZV8iKyhuZXcgRGF0ZSkuZ2V0VGltZSgpO2xldCBDLGo7aWYoaT1pfHwiIiwoL15hcHBsaWNhdGlvblwvb2N0ZXQtc3RyZWFtL2kudGVzdChvKXx8YVsiQ29udGVudC1EaXNwb3NpdGlvbiJdJiYvYXR0YWNobWVudC9pLnRlc3QoYVsiQ29udGVudC1EaXNwb3NpdGlvbiJdKXx8YVsiY29udGVudC1kaXNwb3NpdGlvbiJdJiYvYXR0YWNobWVudC9pLnRlc3QoYVsiY29udGVudC1kaXNwb3NpdGlvbiJdKXx8YVsiQ29udGVudC1EZXNjcmlwdGlvbiJdJiYvRmlsZSBUcmFuc2Zlci9pLnRlc3QoYVsiQ29udGVudC1EZXNjcmlwdGlvbiJdKXx8YVsiY29udGVudC1kZXNjcmlwdGlvbiJdJiYvRmlsZSBUcmFuc2Zlci9pLnRlc3QoYVsiY29udGVudC1kZXNjcmlwdGlvbiJdKSkmJihzLnNpemU+MHx8cy5sZW5ndGg+MCkpaWYoIkJsb2IiaW4gd2luZG93KXtsZXQgdT1vfHwidGV4dC9odG1sIixfPXMgaW5zdGFuY2VvZiBCbG9iP3M6bmV3IEJsb2IoW3NdLHt0eXBlOnV9KSx3PXdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKF8pLHg9W3UsaS5zdWJzdHIoaS5sYXN0SW5kZXhPZigiLyIpKzEpLHddLmpvaW4oIjoiKSxDPWFbImNvbnRlbnQtZGlzcG9zaXRpb24iXXx8YVsiQ29udGVudC1EaXNwb3NpdGlvbiJdO2lmKHZvaWQgMCE9PUMpe2xldCBzPWZ1bmN0aW9uIGV4dHJhY3RGaWxlTmFtZUZyb21Db250ZW50RGlzcG9zaXRpb25IZWFkZXIocyl7bGV0IG87aWYoWy9maWxlbmFtZVwqPVteJ10rJ1x3KiciKFteIl0rKSI7Py9pLC9maWxlbmFtZVwqPVteJ10rJ1x3KicoW147XSspOz8vaSwvZmlsZW5hbWU9IihbXjtdKik7PyIvaSwvZmlsZW5hbWU9KFteO10qKTs/L2ldLnNvbWUoKGk9PihvPWkuZXhlYyhzKSxudWxsIT09bykpKSxudWxsIT09byYmby5sZW5ndGg+MSl0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChvWzFdKX1jYXRjaChzKXtjb25zb2xlLmVycm9yKHMpfXJldHVybiBudWxsfShDKTtudWxsIT09cyYmKHg9cyl9aj1sdC5uYXZpZ2F0b3ImJmx0Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJhIix7aHJlZjp3LG9uQ2xpY2s6KCk9Pmx0Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKF8seCl9LCJEb3dubG9hZCBmaWxlIikpOlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJhIix7aHJlZjp3LGRvd25sb2FkOnh9LCJEb3dubG9hZCBmaWxlIikpfWVsc2Ugaj1SZS5jcmVhdGVFbGVtZW50KCJwcmUiLHtjbGFzc05hbWU6Im1pY3JvbGlnaHQifSwiRG93bmxvYWQgaGVhZGVycyBkZXRlY3RlZCBidXQgeW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgZG93bmxvYWRpbmcgYmluYXJ5IHZpYSBYSFIgKEJsb2IpLiIpO2Vsc2UgaWYoL2pzb24vaS50ZXN0KG8pKXtsZXQgbz1udWxsO2dldEtub3duU3ludGF4SGlnaGxpZ2h0ZXJMYW5ndWFnZShzKSYmKG89Impzb24iKTt0cnl7Qz1KU09OLnN0cmluZ2lmeShKU09OLnBhcnNlKHMpLG51bGwsIiAgIil9Y2F0Y2gobyl7Qz0iY2FuJ3QgcGFyc2UgSlNPTi4gIFJhdyByZXN1bHQ6XG5cbiIrc31qPVJlLmNyZWF0ZUVsZW1lbnQodyx7bGFuZ3VhZ2U6byxkb3dubG9hZGFibGU6ITAsZmlsZU5hbWU6YCR7eH0uanNvbmAsY2FuQ29weTohMH0sQyl9ZWxzZS94bWwvaS50ZXN0KG8pPyhDPUhPKCkocyx7dGV4dE5vZGVzT25TYW1lTGluZTohMCxpbmRlbnRvcjoiICAifSksaj1SZS5jcmVhdGVFbGVtZW50KHcse2Rvd25sb2FkYWJsZTohMCxmaWxlTmFtZTpgJHt4fS54bWxgLGNhbkNvcHk6ITB9LEMpKTpqPSJ0ZXh0L2h0bWwiPT09R08oKShvKXx8L3RleHRcL3BsYWluLy50ZXN0KG8pP1JlLmNyZWF0ZUVsZW1lbnQodyx7ZG93bmxvYWRhYmxlOiEwLGZpbGVOYW1lOmAke3h9Lmh0bWxgLGNhbkNvcHk6ITB9LHMpOiJ0ZXh0L2NzdiI9PT1HTygpKG8pfHwvdGV4dFwvY3N2Ly50ZXN0KG8pP1JlLmNyZWF0ZUVsZW1lbnQodyx7ZG93bmxvYWRhYmxlOiEwLGZpbGVOYW1lOmAke3h9LmNzdmAsY2FuQ29weTohMH0scyk6L15pbWFnZVwvL2kudGVzdChvKT9vLmluY2x1ZGVzKCJzdmciKT9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsIiAiLHMsIiAiKTpSZS5jcmVhdGVFbGVtZW50KCJpbWciLHtzcmM6d2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwocyl9KTovXmF1ZGlvXC8vaS50ZXN0KG8pP1JlLmNyZWF0ZUVsZW1lbnQoInByZSIse2NsYXNzTmFtZToibWljcm9saWdodCJ9LFJlLmNyZWF0ZUVsZW1lbnQoImF1ZGlvIix7Y29udHJvbHM6ITAsa2V5Oml9LFJlLmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIse3NyYzppLHR5cGU6b30pKSk6InN0cmluZyI9PXR5cGVvZiBzP1JlLmNyZWF0ZUVsZW1lbnQodyx7ZG93bmxvYWRhYmxlOiEwLGZpbGVOYW1lOmAke3h9LnR4dGAsY2FuQ29weTohMH0scyk6cy5zaXplPjA/Xz9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgicCIse2NsYXNzTmFtZToiaSJ9LCJVbnJlY29nbml6ZWQgcmVzcG9uc2UgdHlwZTsgZGlzcGxheWluZyBjb250ZW50IGFzIHRleHQuIiksUmUuY3JlYXRlRWxlbWVudCh3LHtkb3dubG9hZGFibGU6ITAsZmlsZU5hbWU6YCR7eH0udHh0YCxjYW5Db3B5OiEwfSxfKSk6UmUuY3JlYXRlRWxlbWVudCgicCIse2NsYXNzTmFtZToiaSJ9LCJVbnJlY29nbml6ZWQgcmVzcG9uc2UgdHlwZTsgdW5hYmxlIHRvIGRpc3BsYXkuIik6bnVsbDtyZXR1cm4gaj9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgiaDUiLG51bGwsIlJlc3BvbnNlIGJvZHkiKSxqKTpudWxsfX1jbGFzcyBQYXJhbWV0ZXJzIGV4dGVuZHMgUmUuQ29tcG9uZW50e2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMuc3RhdGU9e2NhbGxiYWNrVmlzaWJsZTohMSxwYXJhbWV0ZXJzVmlzaWJsZTohMH19c3RhdGljIGRlZmF1bHRQcm9wcz17b25UcnlvdXRDbGljazpGdW5jdGlvbi5wcm90b3R5cGUsb25DYW5jZWxDbGljazpGdW5jdGlvbi5wcm90b3R5cGUsdHJ5SXRPdXRFbmFibGVkOiExLGFsbG93VHJ5SXRPdXQ6ITAsb25DaGFuZ2VLZXk6W10sc3BlY1BhdGg6W119O29uQ2hhbmdlPShzLG8saSk9PntsZXR7c3BlY0FjdGlvbnM6e2NoYW5nZVBhcmFtQnlJZGVudGl0eTphfSxvbkNoYW5nZUtleTp1fT10aGlzLnByb3BzO2EodSxzLG8saSl9O29uQ2hhbmdlQ29uc3VtZXNXcmFwcGVyPXM9PntsZXR7c3BlY0FjdGlvbnM6e2NoYW5nZUNvbnN1bWVzVmFsdWU6b30sb25DaGFuZ2VLZXk6aX09dGhpcy5wcm9wcztvKGkscyl9O3RvZ2dsZVRhYj1zPT4icGFyYW1ldGVycyI9PT1zP3RoaXMuc2V0U3RhdGUoe3BhcmFtZXRlcnNWaXNpYmxlOiEwLGNhbGxiYWNrVmlzaWJsZTohMX0pOiJjYWxsYmFja3MiPT09cz90aGlzLnNldFN0YXRlKHtjYWxsYmFja1Zpc2libGU6ITAscGFyYW1ldGVyc1Zpc2libGU6ITF9KTp2b2lkIDA7b25DaGFuZ2VNZWRpYVR5cGU9KHt2YWx1ZTpzLHBhdGhNZXRob2Q6b30pPT57bGV0e3NwZWNBY3Rpb25zOmksb2FzM1NlbGVjdG9yczphLG9hczNBY3Rpb25zOnV9PXRoaXMucHJvcHM7Y29uc3QgXz1hLmhhc1VzZXJFZGl0ZWRCb2R5KC4uLm8pLHc9YS5zaG91bGRSZXRhaW5SZXF1ZXN0Qm9keVZhbHVlKC4uLm8pO3Uuc2V0UmVxdWVzdENvbnRlbnRUeXBlKHt2YWx1ZTpzLHBhdGhNZXRob2Q6b30pLHUuaW5pdFJlcXVlc3RCb2R5VmFsaWRhdGVFcnJvcih7cGF0aE1ldGhvZDpvfSksX3x8KHd8fHUuc2V0UmVxdWVzdEJvZHlWYWx1ZSh7dmFsdWU6dm9pZCAwLHBhdGhNZXRob2Q6b30pLGkuY2xlYXJSZXNwb25zZSguLi5vKSxpLmNsZWFyUmVxdWVzdCguLi5vKSxpLmNsZWFyVmFsaWRhdGVQYXJhbXMobykpfTtyZW5kZXIoKXtsZXR7b25UcnlvdXRDbGljazpzLG9uUmVzZXRDbGljazpvLHBhcmFtZXRlcnM6aSxhbGxvd1RyeUl0T3V0OmEsdHJ5SXRPdXRFbmFibGVkOnUsc3BlY1BhdGg6Xyxmbjp3LGdldENvbXBvbmVudDp4LGdldENvbmZpZ3M6QyxzcGVjU2VsZWN0b3JzOmosc3BlY0FjdGlvbnM6TCxwYXRoTWV0aG9kOkIsb2FzM0FjdGlvbnM6JCxvYXMzU2VsZWN0b3JzOlUsb3BlcmF0aW9uOlZ9PXRoaXMucHJvcHM7Y29uc3Qgej14KCJwYXJhbWV0ZXJSb3ciKSxZPXgoIlRyeUl0T3V0QnV0dG9uIiksWj14KCJjb250ZW50VHlwZSIpLGVlPXgoIkNhbGxiYWNrcyIsITApLGllPXgoIlJlcXVlc3RCb2R5IiwhMCksYWU9dSYmYSxjZT1qLmlzT0FTMygpLGxlPWAke2NyZWF0ZUh0bWxSZWFkeUlkKGAke0JbMV19JHtCWzBdfV9yZXF1ZXN0c2ApfV9zZWxlY3RgLHBlPVYuZ2V0KCJyZXF1ZXN0Qm9keSIpLGRlPU9iamVjdC52YWx1ZXMoaS5yZWR1Y2UoKChzLG8pPT57aWYoemUuTWFwLmlzTWFwKG8pKXtjb25zdCBpPW8uZ2V0KCJpbiIpO3NbaV0/Pz1bXSxzW2ldLnB1c2gobyl9cmV0dXJuIHN9KSx7fSkpLnJlZHVjZSgoKHMsbyk9PnMuY29uY2F0KG8pKSxbXSk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1zZWN0aW9uIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXNlY3Rpb24taGVhZGVyIn0sY2U/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ0YWItaGVhZGVyIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7b25DbGljazooKT0+dGhpcy50b2dnbGVUYWIoInBhcmFtZXRlcnMiKSxjbGFzc05hbWU6YHRhYi1pdGVtICR7dGhpcy5zdGF0ZS5wYXJhbWV0ZXJzVmlzaWJsZSYmImFjdGl2ZSJ9YH0sUmUuY3JlYXRlRWxlbWVudCgiaDQiLHtjbGFzc05hbWU6Im9wYmxvY2stdGl0bGUifSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLCJQYXJhbWV0ZXJzIikpKSxWLmdldCgiY2FsbGJhY2tzIik/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7b25DbGljazooKT0+dGhpcy50b2dnbGVUYWIoImNhbGxiYWNrcyIpLGNsYXNzTmFtZTpgdGFiLWl0ZW0gJHt0aGlzLnN0YXRlLmNhbGxiYWNrVmlzaWJsZSYmImFjdGl2ZSJ9YH0sUmUuY3JlYXRlRWxlbWVudCgiaDQiLHtjbGFzc05hbWU6Im9wYmxvY2stdGl0bGUifSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLCJDYWxsYmFja3MiKSkpOm51bGwpOlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToidGFiLWhlYWRlciJ9LFJlLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXRpdGxlIn0sIlBhcmFtZXRlcnMiKSksYT9SZS5jcmVhdGVFbGVtZW50KFkse2lzT0FTMzpqLmlzT0FTMygpLGhhc1VzZXJFZGl0ZWRCb2R5OlUuaGFzVXNlckVkaXRlZEJvZHkoLi4uQiksZW5hYmxlZDp1LG9uQ2FuY2VsQ2xpY2s6dGhpcy5wcm9wcy5vbkNhbmNlbENsaWNrLG9uVHJ5b3V0Q2xpY2s6cyxvblJlc2V0Q2xpY2s6KCk9Pm8oQil9KTpudWxsKSx0aGlzLnN0YXRlLnBhcmFtZXRlcnNWaXNpYmxlP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicGFyYW1ldGVycy1jb250YWluZXIifSxkZS5sZW5ndGg/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ0YWJsZS1jb250YWluZXIifSxSZS5jcmVhdGVFbGVtZW50KCJ0YWJsZSIse2NsYXNzTmFtZToicGFyYW1ldGVycyJ9LFJlLmNyZWF0ZUVsZW1lbnQoInRoZWFkIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInRyIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInRoIix7Y2xhc3NOYW1lOiJjb2xfaGVhZGVyIHBhcmFtZXRlcnMtY29sX25hbWUifSwiTmFtZSIpLFJlLmNyZWF0ZUVsZW1lbnQoInRoIix7Y2xhc3NOYW1lOiJjb2xfaGVhZGVyIHBhcmFtZXRlcnMtY29sX2Rlc2NyaXB0aW9uIn0sIkRlc2NyaXB0aW9uIikpKSxSZS5jcmVhdGVFbGVtZW50KCJ0Ym9keSIsbnVsbCxkZS5tYXAoKChzLG8pPT5SZS5jcmVhdGVFbGVtZW50KHose2ZuOncsc3BlY1BhdGg6Xy5wdXNoKG8udG9TdHJpbmcoKSksZ2V0Q29tcG9uZW50OngsZ2V0Q29uZmlnczpDLHJhd1BhcmFtOnMscGFyYW06ai5wYXJhbWV0ZXJXaXRoTWV0YUJ5SWRlbnRpdHkoQixzKSxrZXk6YCR7cy5nZXQoImluIil9LiR7cy5nZXQoIm5hbWUiKX1gLG9uQ2hhbmdlOnRoaXMub25DaGFuZ2Usb25DaGFuZ2VDb25zdW1lczp0aGlzLm9uQ2hhbmdlQ29uc3VtZXNXcmFwcGVyLHNwZWNTZWxlY3RvcnM6aixzcGVjQWN0aW9uczpMLG9hczNBY3Rpb25zOiQsb2FzM1NlbGVjdG9yczpVLHBhdGhNZXRob2Q6Qixpc0V4ZWN1dGU6YWV9KSkpKSkpOlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1kZXNjcmlwdGlvbi13cmFwcGVyIn0sUmUuY3JlYXRlRWxlbWVudCgicCIsbnVsbCwiTm8gcGFyYW1ldGVycyIpKSk6bnVsbCx0aGlzLnN0YXRlLmNhbGxiYWNrVmlzaWJsZT9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImNhbGxiYWNrcy1jb250YWluZXIgb3BibG9jay1kZXNjcmlwdGlvbi13cmFwcGVyIn0sUmUuY3JlYXRlRWxlbWVudChlZSx7Y2FsbGJhY2tzOigwLHplLk1hcCkoVi5nZXQoImNhbGxiYWNrcyIpKSxzcGVjUGF0aDpfLnNsaWNlKDAsLTEpLnB1c2goImNhbGxiYWNrcyIpfSkpOm51bGwsY2UmJnBlJiZ0aGlzLnN0YXRlLnBhcmFtZXRlcnNWaXNpYmxlJiZSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stc2VjdGlvbiBvcGJsb2NrLXNlY3Rpb24tcmVxdWVzdC1ib2R5In0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXNlY3Rpb24taGVhZGVyIn0sUmUuY3JlYXRlRWxlbWVudCgiaDQiLHtjbGFzc05hbWU6YG9wYmxvY2stdGl0bGUgcGFyYW1ldGVyX19uYW1lICR7cGUuZ2V0KCJyZXF1aXJlZCIpJiYicmVxdWlyZWQifWB9LCJSZXF1ZXN0IGJvZHkiKSxSZS5jcmVhdGVFbGVtZW50KCJsYWJlbCIse2lkOmxlfSxSZS5jcmVhdGVFbGVtZW50KFose3ZhbHVlOlUucmVxdWVzdENvbnRlbnRUeXBlKC4uLkIpLGNvbnRlbnRUeXBlczpwZS5nZXQoImNvbnRlbnQiLCgwLHplLkxpc3QpKCkpLmtleVNlcSgpLG9uQ2hhbmdlOnM9Pnt0aGlzLm9uQ2hhbmdlTWVkaWFUeXBlKHt2YWx1ZTpzLHBhdGhNZXRob2Q6Qn0pfSxjbGFzc05hbWU6ImJvZHktcGFyYW0tY29udGVudC10eXBlIixhcmlhTGFiZWw6IlJlcXVlc3QgY29udGVudCB0eXBlIixjb250cm9sSWQ6bGV9KSkpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1kZXNjcmlwdGlvbi13cmFwcGVyIn0sUmUuY3JlYXRlRWxlbWVudChpZSx7c2V0UmV0YWluUmVxdWVzdEJvZHlWYWx1ZUZsYWc6cz0+JC5zZXRSZXRhaW5SZXF1ZXN0Qm9keVZhbHVlRmxhZyh7dmFsdWU6cyxwYXRoTWV0aG9kOkJ9KSx1c2VySGFzRWRpdGVkQm9keTpVLmhhc1VzZXJFZGl0ZWRCb2R5KC4uLkIpLHNwZWNQYXRoOl8uc2xpY2UoMCwtMSkucHVzaCgicmVxdWVzdEJvZHkiKSxyZXF1ZXN0Qm9keTpwZSxyZXF1ZXN0Qm9keVZhbHVlOlUucmVxdWVzdEJvZHlWYWx1ZSguLi5CKSxyZXF1ZXN0Qm9keUluY2x1c2lvblNldHRpbmc6VS5yZXF1ZXN0Qm9keUluY2x1c2lvblNldHRpbmcoLi4uQikscmVxdWVzdEJvZHlFcnJvcnM6VS5yZXF1ZXN0Qm9keUVycm9ycyguLi5CKSxpc0V4ZWN1dGU6YWUsZ2V0Q29uZmlnczpDLGFjdGl2ZUV4YW1wbGVzS2V5OlUuYWN0aXZlRXhhbXBsZXNNZW1iZXIoLi4uQiwicmVxdWVzdEJvZHkiLCJyZXF1ZXN0Qm9keSIpLHVwZGF0ZUFjdGl2ZUV4YW1wbGVzS2V5OnM9Pnt0aGlzLnByb3BzLm9hczNBY3Rpb25zLnNldEFjdGl2ZUV4YW1wbGVzTWVtYmVyKHtuYW1lOnMscGF0aE1ldGhvZDp0aGlzLnByb3BzLnBhdGhNZXRob2QsY29udGV4dFR5cGU6InJlcXVlc3RCb2R5Iixjb250ZXh0TmFtZToicmVxdWVzdEJvZHkifSl9LG9uQ2hhbmdlOihzLG8pPT57aWYobyl7Y29uc3QgaT1VLnJlcXVlc3RCb2R5VmFsdWUoLi4uQiksYT16ZS5NYXAuaXNNYXAoaSk/aTooMCx6ZS5NYXApKCk7cmV0dXJuICQuc2V0UmVxdWVzdEJvZHlWYWx1ZSh7cGF0aE1ldGhvZDpCLHZhbHVlOmEuc2V0SW4obyxzKX0pfSQuc2V0UmVxdWVzdEJvZHlWYWx1ZSh7dmFsdWU6cyxwYXRoTWV0aG9kOkJ9KX0sb25DaGFuZ2VJbmNsdWRlRW1wdHk6KHMsbyk9PnskLnNldFJlcXVlc3RCb2R5SW5jbHVzaW9uKHtwYXRoTWV0aG9kOkIsdmFsdWU6byxuYW1lOnN9KX0sY29udGVudFR5cGU6VS5yZXF1ZXN0Q29udGVudFR5cGUoLi4uQil9KSkpKX19Y29uc3QgcGFyYW1ldGVyX2V4dGVuc2lvbj0oe3hLZXk6cyx4VmFsOm99KT0+UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJwYXJhbWV0ZXJfX2V4dGVuc2lvbiJ9LHMsIjogIixTdHJpbmcobykpLFlPPXtvbkNoYW5nZTooKT0+e30saXNJbmNsdWRlZE9wdGlvbnM6e319O2NsYXNzIFBhcmFtZXRlckluY2x1ZGVFbXB0eSBleHRlbmRzIFJlLkNvbXBvbmVudHtzdGF0aWMgZGVmYXVsdFByb3BzPVlPO2NvbXBvbmVudERpZE1vdW50KCl7Y29uc3R7aXNJbmNsdWRlZE9wdGlvbnM6cyxvbkNoYW5nZTpvfT10aGlzLnByb3BzLHtzaG91bGREaXNwYXRjaEluaXQ6aSxkZWZhdWx0VmFsdWU6YX09cztpJiZvKGEpfW9uQ2hlY2tib3hDaGFuZ2U9cz0+e2NvbnN0e29uQ2hhbmdlOm99PXRoaXMucHJvcHM7byhzLnRhcmdldC5jaGVja2VkKX07cmVuZGVyKCl7bGV0e2lzSW5jbHVkZWQ6cyxpc0Rpc2FibGVkOm99PXRoaXMucHJvcHM7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJsYWJlbCIse2h0bWxGb3I6ImluY2x1ZGVfZW1wdHlfdmFsdWUiLGNsYXNzTmFtZTpKbigpKCJwYXJhbWV0ZXJfX2VtcHR5X3ZhbHVlX3RvZ2dsZSIse2Rpc2FibGVkOm99KX0sUmUuY3JlYXRlRWxlbWVudCgiaW5wdXQiLHtpZDoiaW5jbHVkZV9lbXB0eV92YWx1ZSIsdHlwZToiY2hlY2tib3giLGRpc2FibGVkOm8sY2hlY2tlZDohbyYmcyxvbkNoYW5nZTp0aGlzLm9uQ2hlY2tib3hDaGFuZ2V9KSwiU2VuZCBlbXB0eSB2YWx1ZSIpKX19Y2xhc3MgUGFyYW1ldGVyUm93IGV4dGVuZHMgUmUuQ29tcG9uZW50e2NvbnN0cnVjdG9yKHMsbyl7c3VwZXIocyxvKSx0aGlzLnNldERlZmF1bHRWYWx1ZSgpfVVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHMpe2xldCBvLHtzcGVjU2VsZWN0b3JzOmkscGF0aE1ldGhvZDphLHJhd1BhcmFtOnV9PXMsXz1pLmlzT0FTMygpLHc9aS5wYXJhbWV0ZXJXaXRoTWV0YUJ5SWRlbnRpdHkoYSx1KXx8bmV3IHplLk1hcDtpZih3PXcuaXNFbXB0eSgpP3U6dyxfKXtsZXR7c2NoZW1hOnN9PWdldFBhcmFtZXRlclNjaGVtYSh3LHtpc09BUzM6X30pO289cz9zLmdldCgiZW51bSIpOnZvaWQgMH1lbHNlIG89dz93LmdldCgiZW51bSIpOnZvaWQgMDtsZXQgeCxDPXc/dy5nZXQoInZhbHVlIik6dm9pZCAwO3ZvaWQgMCE9PUM/eD1DOnUuZ2V0KCJyZXF1aXJlZCIpJiZvJiZvLnNpemUmJih4PW8uZmlyc3QoKSksdm9pZCAwIT09eCYmeCE9PUMmJnRoaXMub25DaGFuZ2VXcmFwcGVyKGZ1bmN0aW9uIG51bWJlclRvU3RyaW5nKHMpe3JldHVybiJudW1iZXIiPT10eXBlb2Ygcz9zLnRvU3RyaW5nKCk6c30oeCkpLHRoaXMuc2V0RGVmYXVsdFZhbHVlKCl9b25DaGFuZ2VXcmFwcGVyPShzLG89ITEpPT57bGV0IGkse29uQ2hhbmdlOmEscmF3UGFyYW06dX09dGhpcy5wcm9wcztyZXR1cm4gaT0iIj09PXN8fHMmJjA9PT1zLnNpemU/bnVsbDpzLGEodSxpLG8pfTtfb25FeGFtcGxlU2VsZWN0PXM9Pnt0aGlzLnByb3BzLm9hczNBY3Rpb25zLnNldEFjdGl2ZUV4YW1wbGVzTWVtYmVyKHtuYW1lOnMscGF0aE1ldGhvZDp0aGlzLnByb3BzLnBhdGhNZXRob2QsY29udGV4dFR5cGU6InBhcmFtZXRlcnMiLGNvbnRleHROYW1lOnRoaXMuZ2V0UGFyYW1LZXkoKX0pfTtvbkNoYW5nZUluY2x1ZGVFbXB0eT1zPT57bGV0e3NwZWNBY3Rpb25zOm8scGFyYW06aSxwYXRoTWV0aG9kOmF9PXRoaXMucHJvcHM7Y29uc3QgdT1pLmdldCgibmFtZSIpLF89aS5nZXQoImluIik7cmV0dXJuIG8udXBkYXRlRW1wdHlQYXJhbUluY2x1c2lvbihhLHUsXyxzKX07c2V0RGVmYXVsdFZhbHVlPSgpPT57bGV0e3NwZWNTZWxlY3RvcnM6cyxwYXRoTWV0aG9kOm8scmF3UGFyYW06aSxvYXMzU2VsZWN0b3JzOmEsZm46dX09dGhpcy5wcm9wcztjb25zdCBfPXMucGFyYW1ldGVyV2l0aE1ldGFCeUlkZW50aXR5KG8saSl8fCgwLHplLk1hcCkoKTtsZXR7c2NoZW1hOnd9PWdldFBhcmFtZXRlclNjaGVtYShfLHtpc09BUzM6cy5pc09BUzMoKX0pO2NvbnN0IHg9Xy5nZXQoImNvbnRlbnQiLCgwLHplLk1hcCkoKSkua2V5U2VxKCkuZmlyc3QoKSxDPXc/dS5nZXRTYW1wbGVTY2hlbWEody50b0pTKCkseCx7aW5jbHVkZVdyaXRlT25seTohMH0pOm51bGw7aWYoXyYmdm9pZCAwPT09Xy5nZXQoInZhbHVlIikmJiJib2R5IiE9PV8uZ2V0KCJpbiIpKXtsZXQgaTtpZihzLmlzU3dhZ2dlcjIoKSlpPXZvaWQgMCE9PV8uZ2V0KCJ4LWV4YW1wbGUiKT9fLmdldCgieC1leGFtcGxlIik6dm9pZCAwIT09Xy5nZXRJbihbInNjaGVtYSIsImV4YW1wbGUiXSk/Xy5nZXRJbihbInNjaGVtYSIsImV4YW1wbGUiXSk6dyYmdy5nZXRJbihbImRlZmF1bHQiXSk7ZWxzZSBpZihzLmlzT0FTMygpKXt3PXRoaXMuY29tcG9zZUpzb25TY2hlbWEodyk7Y29uc3Qgcz1hLmFjdGl2ZUV4YW1wbGVzTWVtYmVyKC4uLm8sInBhcmFtZXRlcnMiLHRoaXMuZ2V0UGFyYW1LZXkoKSk7aT12b2lkIDAhPT1fLmdldEluKFsiZXhhbXBsZXMiLHMsInZhbHVlIl0pP18uZ2V0SW4oWyJleGFtcGxlcyIscywidmFsdWUiXSk6dm9pZCAwIT09Xy5nZXRJbihbImNvbnRlbnQiLHgsImV4YW1wbGUiXSk/Xy5nZXRJbihbImNvbnRlbnQiLHgsImV4YW1wbGUiXSk6dm9pZCAwIT09Xy5nZXQoImV4YW1wbGUiKT9fLmdldCgiZXhhbXBsZSIpOnZvaWQgMCE9PSh3JiZ3LmdldCgiZXhhbXBsZSIpKT93JiZ3LmdldCgiZXhhbXBsZSIpOnZvaWQgMCE9PSh3JiZ3LmdldCgiZGVmYXVsdCIpKT93JiZ3LmdldCgiZGVmYXVsdCIpOl8uZ2V0KCJkZWZhdWx0Iil9dm9pZCAwPT09aXx8emUuTGlzdC5pc0xpc3QoaSl8fChpPXN0cmluZ2lmeShpKSk7Y29uc3Qgaj11LmdldFNjaGVtYU9iamVjdFR5cGUodyksTD11LmdldFNjaGVtYU9iamVjdFR5cGUodz8uZ2V0KCJpdGVtcyIpKTt2b2lkIDAhPT1pP3RoaXMub25DaGFuZ2VXcmFwcGVyKGkpOiJvYmplY3QiPT09aiYmQyYmIV8uZ2V0KCJleGFtcGxlcyIpP3RoaXMub25DaGFuZ2VXcmFwcGVyKHplLkxpc3QuaXNMaXN0KEMpP0M6c3RyaW5naWZ5KEMpKToiYXJyYXkiPT09aiYmIm9iamVjdCI9PT1MJiZDJiYhXy5nZXQoImV4YW1wbGVzIikmJnRoaXMub25DaGFuZ2VXcmFwcGVyKHplLkxpc3QuaXNMaXN0KEMpP0M6KDAsemUuTGlzdCkoSlNPTi5wYXJzZShDKSkpfX07Z2V0UGFyYW1LZXkoKXtjb25zdHtwYXJhbTpzfT10aGlzLnByb3BzO3JldHVybiBzP2Ake3MuZ2V0KCJuYW1lIil9LSR7cy5nZXQoImluIil9YDpudWxsfWNvbXBvc2VKc29uU2NoZW1hKHMpe2NvbnN0e2ZuOm99PXRoaXMucHJvcHMsaT1zLmdldCgib25lT2YiKT8uZ2V0KDApPy50b0pTKCksYT1zLmdldCgiYW55T2YiKT8uZ2V0KDApPy50b0pTKCk7cmV0dXJuKDAsemUuZnJvbUpTKShvLm1lcmdlSnNvblNjaGVtYShzLnRvSlMoKSxpPz9hPz97fSkpfXJlbmRlcigpe2xldHtwYXJhbTpzLHJhd1BhcmFtOm8sZ2V0Q29tcG9uZW50OmksZ2V0Q29uZmlnczphLGlzRXhlY3V0ZTp1LGZuOl8sb25DaGFuZ2VDb25zdW1lczp3LHNwZWNTZWxlY3RvcnM6eCxwYXRoTWV0aG9kOkMsc3BlY1BhdGg6aixvYXMzU2VsZWN0b3JzOkx9PXRoaXMucHJvcHMsQj14LmlzT0FTMygpO2NvbnN0e3Nob3dFeHRlbnNpb25zOiQsc2hvd0NvbW1vbkV4dGVuc2lvbnM6VX09YSgpO2lmKHN8fChzPW8pLCFvKXJldHVybiBudWxsO2NvbnN0IFY9aSgiSnNvblNjaGVtYUZvcm0iKSx6PWkoIlBhcmFtQm9keSIpO2xldCBZPXMuZ2V0KCJpbiIpLFo9ImJvZHkiIT09WT9udWxsOlJlLmNyZWF0ZUVsZW1lbnQoeix7Z2V0Q29tcG9uZW50OmksZ2V0Q29uZmlnczphLGZuOl8scGFyYW06cyxjb25zdW1lczp4LmNvbnN1bWVzT3B0aW9uc0ZvcihDKSxjb25zdW1lc1ZhbHVlOnguY29udGVudFR5cGVWYWx1ZXMoQykuZ2V0KCJyZXF1ZXN0Q29udGVudFR5cGUiKSxvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlV3JhcHBlcixvbkNoYW5nZUNvbnN1bWVzOncsaXNFeGVjdXRlOnUsc3BlY1NlbGVjdG9yczp4LHBhdGhNZXRob2Q6Q30pO2NvbnN0IGVlPWkoIm1vZGVsRXhhbXBsZSIpLGllPWkoIk1hcmtkb3duIiwhMCksYWU9aSgiUGFyYW1ldGVyRXh0IiksY2U9aSgiUGFyYW1ldGVySW5jbHVkZUVtcHR5IiksbGU9aSgiRXhhbXBsZXNTZWxlY3RWYWx1ZVJldGFpbmVyIikscGU9aSgiRXhhbXBsZSIpO2xldHtzY2hlbWE6ZGV9PWdldFBhcmFtZXRlclNjaGVtYShzLHtpc09BUzM6Qn0pLGZlPXgucGFyYW1ldGVyV2l0aE1ldGFCeUlkZW50aXR5KEMsbyl8fCgwLHplLk1hcCkoKTtjb25zdCB5ZT1mZS5nZXQoImNvbnRlbnQiLCgwLHplLk1hcCkoKSkua2V5U2VxKCkuZmlyc3QoKTtCJiYoZGU9dGhpcy5jb21wb3NlSnNvblNjaGVtYShkZSkpO2xldCBiZT1kZT9kZS5nZXQoImZvcm1hdCIpOm51bGwsU2U9ImZvcm1EYXRhIj09PVksX2U9IkZvcm1EYXRhImluIGx0LHdlPXMuZ2V0KCJyZXF1aXJlZCIpO2NvbnN0IHhlPV8uZ2V0U2NoZW1hT2JqZWN0VHlwZShkZSksUGU9Xy5nZXRTY2hlbWFPYmplY3RUeXBlKGRlPy5nZXQoIml0ZW1zIikpLFRlPV8uZ2V0U2NoZW1hT2JqZWN0VHlwZUxhYmVsKGRlKSwkZT0hWiYmIm9iamVjdCI9PT14ZSxxZT0hWiYmIm9iamVjdCI9PT1QZTtsZXQgV2UsSGUsWWUsWGUsUWU9ZmU/ZmUuZ2V0KCJ2YWx1ZSIpOiIiLGV0PVU/Z2V0Q29tbW9uRXh0ZW5zaW9ucyhkZSk6bnVsbCx0dD0kP2dldEV4dGVuc2lvbnMocyk6bnVsbCxydD0hMTt2b2lkIDAhPT1zJiZkZSYmKFdlPWRlLmdldCgiaXRlbXMiKSksdm9pZCAwIT09V2U/KEhlPVdlLmdldCgiZW51bSIpLFllPVdlLmdldCgiZGVmYXVsdCIpKTpkZSYmKEhlPWRlLmdldCgiZW51bSIpKSxIZSYmSGUuc2l6ZSYmSGUuc2l6ZT4wJiYocnQ9ITApLHZvaWQgMCE9PXMmJihkZSYmKFllPWRlLmdldCgiZGVmYXVsdCIpKSx2b2lkIDA9PT1ZZSYmKFllPXMuZ2V0KCJkZWZhdWx0IikpLFhlPXMuZ2V0KCJleGFtcGxlIiksdm9pZCAwPT09WGUmJihYZT1zLmdldCgieC1leGFtcGxlIikpKTtjb25zdCBudD1aP251bGw6UmUuY3JlYXRlRWxlbWVudChWLHtmbjpfLGdldENvbXBvbmVudDppLHZhbHVlOlFlLHJlcXVpcmVkOndlLGRpc2FibGVkOiF1LGRlc2NyaXB0aW9uOnMuZ2V0KCJuYW1lIiksb25DaGFuZ2U6dGhpcy5vbkNoYW5nZVdyYXBwZXIsZXJyb3JzOmZlLmdldCgiZXJyb3JzIiksc2NoZW1hOmRlfSk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoInRyIix7ImRhdGEtcGFyYW0tbmFtZSI6cy5nZXQoIm5hbWUiKSwiZGF0YS1wYXJhbS1pbiI6cy5nZXQoImluIil9LFJlLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJwYXJhbWV0ZXJzLWNvbF9uYW1lIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOndlPyJwYXJhbWV0ZXJfX25hbWUgcmVxdWlyZWQiOiJwYXJhbWV0ZXJfX25hbWUifSxzLmdldCgibmFtZSIpLHdlP1JlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsIsKgKiIpOm51bGwpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicGFyYW1ldGVyX190eXBlIn0sVGUsYmUmJlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByb3AtZm9ybWF0In0sIigkIixiZSwiKSIpKSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InBhcmFtZXRlcl9fZGVwcmVjYXRlZCJ9LEImJnMuZ2V0KCJkZXByZWNhdGVkIik/ImRlcHJlY2F0ZWQiOm51bGwpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicGFyYW1ldGVyX19pbiJ9LCIoIixzLmdldCgiaW4iKSwiKSIpKSxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToicGFyYW1ldGVycy1jb2xfZGVzY3JpcHRpb24ifSxzLmdldCgiZGVzY3JpcHRpb24iKT9SZS5jcmVhdGVFbGVtZW50KGllLHtzb3VyY2U6cy5nZXQoImRlc2NyaXB0aW9uIil9KTpudWxsLCFaJiZ1fHwhcnQ/bnVsbDpSZS5jcmVhdGVFbGVtZW50KGllLHtjbGFzc05hbWU6InBhcmFtZXRlcl9fZW51bSIsc291cmNlOiI8aT5BdmFpbGFibGUgdmFsdWVzPC9pPiA6ICIrSGUubWFwKChmdW5jdGlvbihzKXtyZXR1cm4gc30pKS50b0FycmF5KCkubWFwKFN0cmluZykuam9pbigiLCAiKX0pLCFaJiZ1fHx2b2lkIDA9PT1ZZT9udWxsOlJlLmNyZWF0ZUVsZW1lbnQoaWUse2NsYXNzTmFtZToicGFyYW1ldGVyX19kZWZhdWx0Iixzb3VyY2U6IjxpPkRlZmF1bHQgdmFsdWU8L2k+IDogIitZZX0pLCFaJiZ1fHx2b2lkIDA9PT1YZT9udWxsOlJlLmNyZWF0ZUVsZW1lbnQoaWUse3NvdXJjZToiPGk+RXhhbXBsZTwvaT4gOiAiK1hlfSksU2UmJiFfZSYmUmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLCJFcnJvcjogeW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgRm9ybURhdGEiKSxCJiZzLmdldCgiZXhhbXBsZXMiKT9SZS5jcmVhdGVFbGVtZW50KCJzZWN0aW9uIix7Y2xhc3NOYW1lOiJwYXJhbWV0ZXItY29udHJvbHMifSxSZS5jcmVhdGVFbGVtZW50KGxlLHtleGFtcGxlczpzLmdldCgiZXhhbXBsZXMiKSxvblNlbGVjdDp0aGlzLl9vbkV4YW1wbGVTZWxlY3QsdXBkYXRlVmFsdWU6dGhpcy5vbkNoYW5nZVdyYXBwZXIsZ2V0Q29tcG9uZW50OmksZGVmYXVsdFRvRmlyc3RFeGFtcGxlOiEwLGN1cnJlbnRLZXk6TC5hY3RpdmVFeGFtcGxlc01lbWJlciguLi5DLCJwYXJhbWV0ZXJzIix0aGlzLmdldFBhcmFtS2V5KCkpLGN1cnJlbnRVc2VySW5wdXRWYWx1ZTpRZX0pKTpudWxsLCRlfHxxZT9SZS5jcmVhdGVFbGVtZW50KGVlLHtnZXRDb21wb25lbnQ6aSxzcGVjUGF0aDp5ZT9qLnB1c2goImNvbnRlbnQiLHllLCJzY2hlbWEiKTpqLnB1c2goInNjaGVtYSIpLGdldENvbmZpZ3M6YSxpc0V4ZWN1dGU6dSxzcGVjU2VsZWN0b3JzOngsc2NoZW1hOmRlLGV4YW1wbGU6bnR9KTpudCxaJiZkZT9SZS5jcmVhdGVFbGVtZW50KGVlLHtnZXRDb21wb25lbnQ6aSxzcGVjUGF0aDpqLnB1c2goInNjaGVtYSIpLGdldENvbmZpZ3M6YSxpc0V4ZWN1dGU6dSxzcGVjU2VsZWN0b3JzOngsc2NoZW1hOmRlLGV4YW1wbGU6WixpbmNsdWRlV3JpdGVPbmx5OiEwfSk6bnVsbCwhWiYmdSYmcy5nZXQoImFsbG93RW1wdHlWYWx1ZSIpP1JlLmNyZWF0ZUVsZW1lbnQoY2Use29uQ2hhbmdlOnRoaXMub25DaGFuZ2VJbmNsdWRlRW1wdHksaXNJbmNsdWRlZDp4LnBhcmFtZXRlckluY2x1c2lvblNldHRpbmdGb3IoQyxzLmdldCgibmFtZSIpLHMuZ2V0KCJpbiIpKSxpc0Rpc2FibGVkOiFpc0VtcHR5VmFsdWUoUWUpfSk6bnVsbCxCJiZzLmdldCgiZXhhbXBsZXMiKT9SZS5jcmVhdGVFbGVtZW50KHBlLHtleGFtcGxlOnMuZ2V0SW4oWyJleGFtcGxlcyIsTC5hY3RpdmVFeGFtcGxlc01lbWJlciguLi5DLCJwYXJhbWV0ZXJzIix0aGlzLmdldFBhcmFtS2V5KCkpXSksZ2V0Q29tcG9uZW50OmksZ2V0Q29uZmlnczphfSk6bnVsbCxVJiZldC5zaXplP2V0LmVudHJ5U2VxKCkubWFwKCgoW3Msb10pPT5SZS5jcmVhdGVFbGVtZW50KGFlLHtrZXk6YCR7c30tJHtvfWAseEtleTpzLHhWYWw6b30pKSk6bnVsbCwkJiZ0dC5zaXplP3R0LmVudHJ5U2VxKCkubWFwKCgoW3Msb10pPT5SZS5jcmVhdGVFbGVtZW50KGFlLHtrZXk6YCR7c30tJHtvfWAseEtleTpzLHhWYWw6b30pKSk6bnVsbCkpfX1jbGFzcyBFeGVjdXRlIGV4dGVuZHMgUmUuQ29tcG9uZW50e2hhbmRsZVZhbGlkYXRlUGFyYW1ldGVycz0oKT0+e2xldHtzcGVjU2VsZWN0b3JzOnMsc3BlY0FjdGlvbnM6byxwYXRoOmksbWV0aG9kOmF9PXRoaXMucHJvcHM7cmV0dXJuIG8udmFsaWRhdGVQYXJhbXMoW2ksYV0pLHMudmFsaWRhdGVCZWZvcmVFeGVjdXRlKFtpLGFdKX07aGFuZGxlVmFsaWRhdGVSZXF1ZXN0Qm9keT0oKT0+e2xldHtwYXRoOnMsbWV0aG9kOm8sc3BlY1NlbGVjdG9yczppLG9hczNTZWxlY3RvcnM6YSxvYXMzQWN0aW9uczp1fT10aGlzLnByb3BzLF89e21pc3NpbmdCb2R5VmFsdWU6ITEsbWlzc2luZ1JlcXVpcmVkS2V5czpbXX07dS5jbGVhclJlcXVlc3RCb2R5VmFsaWRhdGVFcnJvcih7cGF0aDpzLG1ldGhvZDpvfSk7bGV0IHc9aS5nZXRPQVMzUmVxdWlyZWRSZXF1ZXN0Qm9keUNvbnRlbnRUeXBlKFtzLG9dKSx4PWEucmVxdWVzdEJvZHlWYWx1ZShzLG8pLEM9YS52YWxpZGF0ZUJlZm9yZUV4ZWN1dGUoW3Msb10pLGo9YS5yZXF1ZXN0Q29udGVudFR5cGUocyxvKTtpZighQylyZXR1cm4gXy5taXNzaW5nQm9keVZhbHVlPSEwLHUuc2V0UmVxdWVzdEJvZHlWYWxpZGF0ZUVycm9yKHtwYXRoOnMsbWV0aG9kOm8sdmFsaWRhdGlvbkVycm9yczpffSksITE7aWYoIXcpcmV0dXJuITA7bGV0IEw9YS52YWxpZGF0ZVNoYWxsb3dSZXF1aXJlZCh7b2FzM1JlcXVpcmVkUmVxdWVzdEJvZHlDb250ZW50VHlwZTp3LG9hczNSZXF1ZXN0Q29udGVudFR5cGU6aixvYXMzUmVxdWVzdEJvZHlWYWx1ZTp4fSk7cmV0dXJuIUx8fEwubGVuZ3RoPDF8fChMLmZvckVhY2goKHM9PntfLm1pc3NpbmdSZXF1aXJlZEtleXMucHVzaChzKX0pKSx1LnNldFJlcXVlc3RCb2R5VmFsaWRhdGVFcnJvcih7cGF0aDpzLG1ldGhvZDpvLHZhbGlkYXRpb25FcnJvcnM6X30pLCExKX07aGFuZGxlVmFsaWRhdGlvblJlc3VsdFBhc3M9KCk9PntsZXR7c3BlY0FjdGlvbnM6cyxvcGVyYXRpb246byxwYXRoOmksbWV0aG9kOmF9PXRoaXMucHJvcHM7dGhpcy5wcm9wcy5vbkV4ZWN1dGUmJnRoaXMucHJvcHMub25FeGVjdXRlKCkscy5leGVjdXRlKHtvcGVyYXRpb246byxwYXRoOmksbWV0aG9kOmF9KX07aGFuZGxlVmFsaWRhdGlvblJlc3VsdEZhaWw9KCk9PntsZXR7c3BlY0FjdGlvbnM6cyxwYXRoOm8sbWV0aG9kOml9PXRoaXMucHJvcHM7cy5jbGVhclZhbGlkYXRlUGFyYW1zKFtvLGldKSxzZXRUaW1lb3V0KCgoKT0+e3MudmFsaWRhdGVQYXJhbXMoW28saV0pfSksNDApfTtoYW5kbGVWYWxpZGF0aW9uUmVzdWx0PXM9PntzP3RoaXMuaGFuZGxlVmFsaWRhdGlvblJlc3VsdFBhc3MoKTp0aGlzLmhhbmRsZVZhbGlkYXRpb25SZXN1bHRGYWlsKCl9O29uQ2xpY2s9KCk9PntsZXQgcz10aGlzLmhhbmRsZVZhbGlkYXRlUGFyYW1ldGVycygpLG89dGhpcy5oYW5kbGVWYWxpZGF0ZVJlcXVlc3RCb2R5KCksaT1zJiZvO3RoaXMuaGFuZGxlVmFsaWRhdGlvblJlc3VsdChpKX07b25DaGFuZ2VQcm9kdWNlc1dyYXBwZXI9cz0+dGhpcy5wcm9wcy5zcGVjQWN0aW9ucy5jaGFuZ2VQcm9kdWNlc1ZhbHVlKFt0aGlzLnByb3BzLnBhdGgsdGhpcy5wcm9wcy5tZXRob2RdLHMpO3JlbmRlcigpe2NvbnN0e2Rpc2FibGVkOnN9PXRoaXMucHJvcHM7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse2NsYXNzTmFtZToiYnRuIGV4ZWN1dGUgb3BibG9jay1jb250cm9sX19idG4iLG9uQ2xpY2s6dGhpcy5vbkNsaWNrLGRpc2FibGVkOnN9LCJFeGVjdXRlIil9fWNsYXNzIGhlYWRlcnNfSGVhZGVycyBleHRlbmRzIFJlLkNvbXBvbmVudHtyZW5kZXIoKXtsZXR7aGVhZGVyczpzLGdldENvbXBvbmVudDpvfT10aGlzLnByb3BzO2NvbnN0IGk9bygiUHJvcGVydHkiKSxhPW8oIk1hcmtkb3duIiwhMCk7cmV0dXJuIHMmJnMuc2l6ZT9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImhlYWRlcnMtd3JhcHBlciJ9LFJlLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJoZWFkZXJzX190aXRsZSJ9LCJIZWFkZXJzOiIpLFJlLmNyZWF0ZUVsZW1lbnQoInRhYmxlIix7Y2xhc3NOYW1lOiJoZWFkZXJzIn0sUmUuY3JlYXRlRWxlbWVudCgidGhlYWQiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgidHIiLHtjbGFzc05hbWU6ImhlYWRlci1yb3cifSxSZS5jcmVhdGVFbGVtZW50KCJ0aCIse2NsYXNzTmFtZToiaGVhZGVyLWNvbCJ9LCJOYW1lIiksUmUuY3JlYXRlRWxlbWVudCgidGgiLHtjbGFzc05hbWU6ImhlYWRlci1jb2wifSwiRGVzY3JpcHRpb24iKSxSZS5jcmVhdGVFbGVtZW50KCJ0aCIse2NsYXNzTmFtZToiaGVhZGVyLWNvbCJ9LCJUeXBlIikpKSxSZS5jcmVhdGVFbGVtZW50KCJ0Ym9keSIsbnVsbCxzLmVudHJ5U2VxKCkubWFwKCgoW3Msb10pPT57aWYoIVdlKCkuTWFwLmlzTWFwKG8pKXJldHVybiBudWxsO2NvbnN0IHU9by5nZXQoImRlc2NyaXB0aW9uIiksXz1vLmdldEluKFsic2NoZW1hIl0pP28uZ2V0SW4oWyJzY2hlbWEiLCJ0eXBlIl0pOm8uZ2V0SW4oWyJ0eXBlIl0pLHc9by5nZXRJbihbInNjaGVtYSIsImV4YW1wbGUiXSk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoInRyIix7a2V5OnN9LFJlLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJoZWFkZXItY29sIn0scyksUmUuY3JlYXRlRWxlbWVudCgidGQiLHtjbGFzc05hbWU6ImhlYWRlci1jb2wifSx1P1JlLmNyZWF0ZUVsZW1lbnQoYSx7c291cmNlOnV9KTpudWxsKSxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToiaGVhZGVyLWNvbCJ9LF8sIiAiLHc/UmUuY3JlYXRlRWxlbWVudChpLHtwcm9wS2V5OiJFeGFtcGxlIixwcm9wVmFsOncscHJvcENsYXNzOiJoZWFkZXItZXhhbXBsZSJ9KTpudWxsKSl9KSkudG9BcnJheSgpKSkpOm51bGx9fWNsYXNzIEVycm9ycyBleHRlbmRzIFJlLkNvbXBvbmVudHtyZW5kZXIoKXtsZXR7ZWRpdG9yQWN0aW9uczpzLGVyclNlbGVjdG9yczpvLGxheW91dFNlbGVjdG9yczppLGxheW91dEFjdGlvbnM6YSxnZXRDb21wb25lbnQ6dX09dGhpcy5wcm9wcztjb25zdCBfPXUoIkNvbGxhcHNlIik7aWYocyYmcy5qdW1wVG9MaW5lKXZhciB3PXMuanVtcFRvTGluZTtsZXQgeD1vLmFsbEVycm9ycygpLmZpbHRlcigocz0+InRocm93biI9PT1zLmdldCgidHlwZSIpfHwiZXJyb3IiPT09cy5nZXQoImxldmVsIikpKTtpZigheHx8eC5jb3VudCgpPDEpcmV0dXJuIG51bGw7bGV0IEM9aS5pc1Nob3duKFsiZXJyb3JQYW5lIl0sITApLGo9eC5zb3J0QnkoKHM9PnMuZ2V0KCJsaW5lIikpKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgicHJlIix7Y2xhc3NOYW1lOiJlcnJvcnMtd3JhcHBlciJ9LFJlLmNyZWF0ZUVsZW1lbnQoImhncm91cCIse2NsYXNzTmFtZToiZXJyb3IifSxSZS5jcmVhdGVFbGVtZW50KCJoNCIse2NsYXNzTmFtZToiZXJyb3JzX190aXRsZSJ9LCJFcnJvcnMiKSxSZS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHtjbGFzc05hbWU6ImJ0biBlcnJvcnNfX2NsZWFyLWJ0biIsb25DbGljazooKT0+YS5zaG93KFsiZXJyb3JQYW5lIl0sIUMpfSxDPyJIaWRlIjoiU2hvdyIpKSxSZS5jcmVhdGVFbGVtZW50KF8se2lzT3BlbmVkOkMsYW5pbWF0ZWQ6ITB9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZXJyb3JzIn0sai5tYXAoKChzLG8pPT57bGV0IGk9cy5nZXQoInR5cGUiKTtyZXR1cm4idGhyb3duIj09PWl8fCJhdXRoIj09PWk/UmUuY3JlYXRlRWxlbWVudChUaHJvd25FcnJvckl0ZW0se2tleTpvLGVycm9yOnMuZ2V0KCJlcnJvciIpfHxzLGp1bXBUb0xpbmU6d30pOiJzcGVjIj09PWk/UmUuY3JlYXRlRWxlbWVudChTcGVjRXJyb3JJdGVtLHtrZXk6byxlcnJvcjpzLGp1bXBUb0xpbmU6d30pOnZvaWQgMH0pKSkpKX19Y29uc3QgVGhyb3duRXJyb3JJdGVtPSh7ZXJyb3I6cyxqdW1wVG9MaW5lOm99KT0+e2lmKCFzKXJldHVybiBudWxsO2xldCBpPXMuZ2V0KCJsaW5lIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZXJyb3Itd3JhcHBlciJ9LHM/UmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLHMuZ2V0KCJzb3VyY2UiKSYmcy5nZXQoImxldmVsIik/dG9UaXRsZUNhc2Uocy5nZXQoInNvdXJjZSIpKSsiICIrcy5nZXQoImxldmVsIik6IiIscy5nZXQoInBhdGgiKT9SZS5jcmVhdGVFbGVtZW50KCJzbWFsbCIsbnVsbCwiIGF0ICIscy5nZXQoInBhdGgiKSk6bnVsbCksUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibWVzc2FnZSB0aHJvd24ifSxzLmdldCgibWVzc2FnZSIpKSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImVycm9yLWxpbmUifSxpJiZvP1JlLmNyZWF0ZUVsZW1lbnQoImEiLHtvbkNsaWNrOm8uYmluZChudWxsLGkpfSwiSnVtcCB0byBsaW5lICIsaSk6bnVsbCkpOm51bGwpfSxTcGVjRXJyb3JJdGVtPSh7ZXJyb3I6cyxqdW1wVG9MaW5lOm89bnVsbH0pPT57bGV0IGk9bnVsbDtyZXR1cm4gcy5nZXQoInBhdGgiKT9pPXplLkxpc3QuaXNMaXN0KHMuZ2V0KCJwYXRoIikpP1JlLmNyZWF0ZUVsZW1lbnQoInNtYWxsIixudWxsLCJhdCAiLHMuZ2V0KCJwYXRoIikuam9pbigiLiIpKTpSZS5jcmVhdGVFbGVtZW50KCJzbWFsbCIsbnVsbCwiYXQgIixzLmdldCgicGF0aCIpKTpzLmdldCgibGluZSIpJiYhbyYmKGk9UmUuY3JlYXRlRWxlbWVudCgic21hbGwiLG51bGwsIm9uIGxpbmUgIixzLmdldCgibGluZSIpKSksUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJlcnJvci13cmFwcGVyIn0scz9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgiaDQiLG51bGwsdG9UaXRsZUNhc2Uocy5nZXQoInNvdXJjZSIpKSsiICIrcy5nZXQoImxldmVsIiksIsKgIixpKSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtZXNzYWdlIn0scy5nZXQoIm1lc3NhZ2UiKSksUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJlcnJvci1saW5lIn0sbz9SZS5jcmVhdGVFbGVtZW50KCJhIix7b25DbGljazpvLmJpbmQobnVsbCxzLmdldCgibGluZSIpKX0sIkp1bXAgdG8gbGluZSAiLHMuZ2V0KCJsaW5lIikpOm51bGwpKTpudWxsKX07ZnVuY3Rpb24gdG9UaXRsZUNhc2Uocyl7cmV0dXJuKHN8fCIiKS5zcGxpdCgiICIpLm1hcCgocz0+c1swXS50b1VwcGVyQ2FzZSgpK3Muc2xpY2UoMSkpKS5qb2luKCIgIil9Y29uc3QgY29udGVudF90eXBlX25vb3A9KCk9Pnt9O2NsYXNzIENvbnRlbnRUeXBlIGV4dGVuZHMgUmUuQ29tcG9uZW50e3N0YXRpYyBkZWZhdWx0UHJvcHM9e29uQ2hhbmdlOmNvbnRlbnRfdHlwZV9ub29wLHZhbHVlOm51bGwsY29udGVudFR5cGVzOigwLHplLmZyb21KUykoWyJhcHBsaWNhdGlvbi9qc29uIl0pfTtjb21wb25lbnREaWRNb3VudCgpe2NvbnN0e2NvbnRlbnRUeXBlczpzLG9uQ2hhbmdlOm99PXRoaXMucHJvcHM7cyYmcy5zaXplJiZvKHMuZmlyc3QoKSl9Y29tcG9uZW50RGlkVXBkYXRlKCl7Y29uc3R7Y29udGVudFR5cGVzOnMsdmFsdWU6byxvbkNoYW5nZTppfT10aGlzLnByb3BzO3MmJnMuc2l6ZSYmKHMuaW5jbHVkZXMobyl8fGkocy5maXJzdCgpKSl9b25DaGFuZ2VXcmFwcGVyPXM9PnRoaXMucHJvcHMub25DaGFuZ2Uocy50YXJnZXQudmFsdWUpO3JlbmRlcigpe2xldHthcmlhQ29udHJvbHM6cyxhcmlhTGFiZWw6byxjbGFzc05hbWU6aSxjb250ZW50VHlwZXM6YSxjb250cm9sSWQ6dSx2YWx1ZTpffT10aGlzLnByb3BzO3JldHVybiBhJiZhLnNpemU/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjb250ZW50LXR5cGUtd3JhcHBlciAiKyhpfHwiIil9LFJlLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIseyJhcmlhLWNvbnRyb2xzIjpzLCJhcmlhLWxhYmVsIjpvLGNsYXNzTmFtZToiY29udGVudC10eXBlIixpZDp1LG9uQ2hhbmdlOnRoaXMub25DaGFuZ2VXcmFwcGVyLHZhbHVlOl98fCIifSxhLm1hcCgocz0+UmUuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7a2V5OnMsdmFsdWU6c30scykpKS50b0FycmF5KCkpKTpudWxsfX1mdW5jdGlvbiB4Y2xhc3MoLi4ucyl7cmV0dXJuIHMuZmlsdGVyKChzPT4hIXMpKS5qb2luKCIgIikudHJpbSgpfWNsYXNzIENvbnRhaW5lciBleHRlbmRzIFJlLkNvbXBvbmVudHtyZW5kZXIoKXtsZXR7ZnVsbHNjcmVlbjpzLGZ1bGw6bywuLi5pfT10aGlzLnByb3BzO2lmKHMpcmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoInNlY3Rpb24iLGkpO2xldCBhPSJzd2FnZ2VyLWNvbnRhaW5lciIrKG8/Ii1mdWxsIjoiIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoInNlY3Rpb24iLE1uKCkoe30saSx7Y2xhc3NOYW1lOnhjbGFzcyhpLmNsYXNzTmFtZSxhKX0pKX19Y29uc3QgWE89e21vYmlsZToiIix0YWJsZXQ6Ii10YWJsZXQiLGRlc2t0b3A6Ii1kZXNrdG9wIixsYXJnZToiLWhkIn07Y2xhc3MgQ29sIGV4dGVuZHMgUmUuQ29tcG9uZW50e3JlbmRlcigpe2NvbnN0e2hpZGU6cyxrZWVwQ29udGVudHM6byxtb2JpbGU6aSx0YWJsZXQ6YSxkZXNrdG9wOnUsbGFyZ2U6XywuLi53fT10aGlzLnByb3BzO2lmKHMmJiFvKXJldHVybiBSZS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsKTtsZXQgeD1bXTtmb3IobGV0IHMgaW4gWE8pe2lmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoWE8scykpY29udGludWU7bGV0IG89WE9bc107aWYocyBpbiB0aGlzLnByb3BzKXtsZXQgaT10aGlzLnByb3BzW3NdO2lmKGk8MSl7eC5wdXNoKCJub25lIitvKTtjb250aW51ZX14LnB1c2goImJsb2NrIitvKSx4LnB1c2goImNvbC0iK2krbyl9fXMmJngucHVzaCgiaGlkZGVuIik7bGV0IEM9eGNsYXNzKHcuY2xhc3NOYW1lLC4uLngpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJzZWN0aW9uIixNbigpKHt9LHcse2NsYXNzTmFtZTpDfSkpfX1jbGFzcyBSb3cgZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsTW4oKSh7fSx0aGlzLnByb3BzLHtjbGFzc05hbWU6eGNsYXNzKHRoaXMucHJvcHMuY2xhc3NOYW1lLCJ3cmFwcGVyIil9KSl9fWNsYXNzIEJ1dHRvbiBleHRlbmRzIFJlLkNvbXBvbmVudHtzdGF0aWMgZGVmYXVsdFByb3BzPXtjbGFzc05hbWU6IiJ9O3JlbmRlcigpe3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJidXR0b24iLE1uKCkoe30sdGhpcy5wcm9wcyx7Y2xhc3NOYW1lOnhjbGFzcyh0aGlzLnByb3BzLmNsYXNzTmFtZSwiYnV0dG9uIil9KSl9fWNvbnN0IFRleHRBcmVhPXM9PlJlLmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIixzKSxJbnB1dD1zPT5SZS5jcmVhdGVFbGVtZW50KCJpbnB1dCIscyk7Y2xhc3MgU2VsZWN0IGV4dGVuZHMgUmUuQ29tcG9uZW50e3N0YXRpYyBkZWZhdWx0UHJvcHM9e211bHRpcGxlOiExLGFsbG93RW1wdHlWYWx1ZTohMH07Y29uc3RydWN0b3IocyxvKXtsZXQgaTtzdXBlcihzLG8pLGk9cy52YWx1ZT9zLnZhbHVlOnMubXVsdGlwbGU/WyIiXToiIix0aGlzLnN0YXRlPXt2YWx1ZTppfX1vbkNoYW5nZT1zPT57bGV0IG8se29uQ2hhbmdlOmksbXVsdGlwbGU6YX09dGhpcy5wcm9wcyx1PVtdLnNsaWNlLmNhbGwocy50YXJnZXQub3B0aW9ucyk7bz1hP3UuZmlsdGVyKChmdW5jdGlvbihzKXtyZXR1cm4gcy5zZWxlY3RlZH0pKS5tYXAoKGZ1bmN0aW9uKHMpe3JldHVybiBzLnZhbHVlfSkpOnMudGFyZ2V0LnZhbHVlLHRoaXMuc2V0U3RhdGUoe3ZhbHVlOm99KSxpJiZpKG8pfTtVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhzKXtzLnZhbHVlIT09dGhpcy5wcm9wcy52YWx1ZSYmdGhpcy5zZXRTdGF0ZSh7dmFsdWU6cy52YWx1ZX0pfXJlbmRlcigpe2xldHthbGxvd2VkVmFsdWVzOnMsbXVsdGlwbGU6byxhbGxvd0VtcHR5VmFsdWU6aSxkaXNhYmxlZDphfT10aGlzLnByb3BzLHU9dGhpcy5zdGF0ZS52YWx1ZT8udG9KUz8uKCl8fHRoaXMuc3RhdGUudmFsdWU7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIse2NsYXNzTmFtZTp0aGlzLnByb3BzLmNsYXNzTmFtZSxtdWx0aXBsZTpvLHZhbHVlOnUsb25DaGFuZ2U6dGhpcy5vbkNoYW5nZSxkaXNhYmxlZDphfSxpP1JlLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIse3ZhbHVlOiIifSwiLS0iKTpudWxsLHMubWFwKChmdW5jdGlvbihzLG8pe3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHtrZXk6byx2YWx1ZTpTdHJpbmcocyl9LFN0cmluZyhzKSl9KSkpfX1jbGFzcyBsYXlvdXRfdXRpbHNfTGluayBleHRlbmRzIFJlLkNvbXBvbmVudHtyZW5kZXIoKXtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiYSIsTW4oKSh7fSx0aGlzLnByb3BzLHtyZWw6Im5vb3BlbmVyIG5vcmVmZXJyZXIiLGNsYXNzTmFtZTp4Y2xhc3ModGhpcy5wcm9wcy5jbGFzc05hbWUsImxpbmsiKX0pKX19Y29uc3QgTm9NYXJnaW49KHtjaGlsZHJlbjpzfSk9PlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibm8tbWFyZ2luIn0sIiAiLHMsIiAiKTtjbGFzcyBDb2xsYXBzZSBleHRlbmRzIFJlLkNvbXBvbmVudHtzdGF0aWMgZGVmYXVsdFByb3BzPXtpc09wZW5lZDohMSxhbmltYXRlZDohMX07cmVuZGVyTm90QW5pbWF0ZWQoKXtyZXR1cm4gdGhpcy5wcm9wcy5pc09wZW5lZD9SZS5jcmVhdGVFbGVtZW50KE5vTWFyZ2luLG51bGwsdGhpcy5wcm9wcy5jaGlsZHJlbik6UmUuY3JlYXRlRWxlbWVudCgibm9zY3JpcHQiLG51bGwpfXJlbmRlcigpe2xldHthbmltYXRlZDpzLGlzT3BlbmVkOm8sY2hpbGRyZW46aX09dGhpcy5wcm9wcztyZXR1cm4gcz8oaT1vP2k6bnVsbCxSZS5jcmVhdGVFbGVtZW50KE5vTWFyZ2luLG51bGwsaSkpOnRoaXMucmVuZGVyTm90QW5pbWF0ZWQoKX19Y2xhc3MgT3ZlcnZpZXcgZXh0ZW5kcyBSZS5Db21wb25lbnR7Y29uc3RydWN0b3IoLi4ucyl7c3VwZXIoLi4ucyksdGhpcy5zZXRUYWdTaG93bj10aGlzLl9zZXRUYWdTaG93bi5iaW5kKHRoaXMpfV9zZXRUYWdTaG93bihzLG8pe3RoaXMucHJvcHMubGF5b3V0QWN0aW9ucy5zaG93KHMsbyl9c2hvd09wKHMsbyl7bGV0e2xheW91dEFjdGlvbnM6aX09dGhpcy5wcm9wcztpLnNob3cocyxvKX1yZW5kZXIoKXtsZXR7c3BlY1NlbGVjdG9yczpzLGxheW91dFNlbGVjdG9yczpvLGxheW91dEFjdGlvbnM6aSxnZXRDb21wb25lbnQ6YX09dGhpcy5wcm9wcyx1PXMudGFnZ2VkT3BlcmF0aW9ucygpO2NvbnN0IF89YSgiQ29sbGFwc2UiKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJvdmVydmlldy10aXRsZSJ9LCJPdmVydmlldyIpLHUubWFwKCgocyxhKT0+e2xldCB1PXMuZ2V0KCJvcGVyYXRpb25zIiksdz1bIm92ZXJ2aWV3LXRhZ3MiLGFdLHg9by5pc1Nob3duKHcsITApO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtrZXk6Im92ZXJ2aWV3LSIrYX0sUmUuY3JlYXRlRWxlbWVudCgiaDQiLHtvbkNsaWNrOigpPT5pLnNob3codywheCksY2xhc3NOYW1lOiJsaW5rIG92ZXJ2aWV3LXRhZyJ9LCIgIix4PyItIjoiKyIsYSksUmUuY3JlYXRlRWxlbWVudChfLHtpc09wZW5lZDp4LGFuaW1hdGVkOiEwfSx1Lm1hcCgocz0+e2xldHtwYXRoOmEsbWV0aG9kOnUsaWQ6X309cy50b09iamVjdCgpLHc9Im9wZXJhdGlvbnMiLHg9XyxDPW8uaXNTaG93bihbdyx4XSk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoT3BlcmF0aW9uTGluayx7a2V5Ol8scGF0aDphLG1ldGhvZDp1LGlkOmErIi0iK3Usc2hvd246QyxzaG93T3BJZDp4LHNob3dPcElkUHJlZml4OncsaHJlZjpgI29wZXJhdGlvbi0ke3h9YCxvbkNsaWNrOmkuc2hvd30pfSkpLnRvQXJyYXkoKSkpfSkpLnRvQXJyYXkoKSx1LnNpemU8MSYmUmUuY3JlYXRlRWxlbWVudCgiaDMiLG51bGwsIiBObyBvcGVyYXRpb25zIGRlZmluZWQgaW4gc3BlYyEgIikpfX1jbGFzcyBPcGVyYXRpb25MaW5rIGV4dGVuZHMgUmUuQ29tcG9uZW50e2NvbnN0cnVjdG9yKHMpe3N1cGVyKHMpLHRoaXMub25DbGljaz10aGlzLl9vbkNsaWNrLmJpbmQodGhpcyl9X29uQ2xpY2soKXtsZXR7c2hvd09wSWQ6cyxzaG93T3BJZFByZWZpeDpvLG9uQ2xpY2s6aSxzaG93bjphfT10aGlzLnByb3BzO2koW28sc10sIWEpfXJlbmRlcigpe2xldHtpZDpzLG1ldGhvZDpvLHNob3duOmksaHJlZjphfT10aGlzLnByb3BzO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KGxheW91dF91dGlsc19MaW5rLHtocmVmOmEsb25DbGljazp0aGlzLm9uQ2xpY2ssY2xhc3NOYW1lOiJibG9jayBvcGJsb2NrLWxpbmsgIisoaT8ic2hvd24iOiIiKX0sUmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInNtYWxsIix7Y2xhc3NOYW1lOmBib2xkLWxhYmVsLSR7b31gfSxvLnRvVXBwZXJDYXNlKCkpLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ImJvbGQtbGFiZWwifSxzKSkpfX1jbGFzcyBJbml0aWFsaXplZElucHV0IGV4dGVuZHMgUmUuQ29tcG9uZW50e2NvbXBvbmVudERpZE1vdW50KCl7dGhpcy5wcm9wcy5pbml0aWFsVmFsdWUmJih0aGlzLmlucHV0UmVmLnZhbHVlPXRoaXMucHJvcHMuaW5pdGlhbFZhbHVlKX1yZW5kZXIoKXtjb25zdHt2YWx1ZTpzLGRlZmF1bHRWYWx1ZTpvLGluaXRpYWxWYWx1ZTppLC4uLmF9PXRoaXMucHJvcHM7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImlucHV0IixNbigpKHt9LGEse3JlZjpzPT50aGlzLmlucHV0UmVmPXN9KSl9fWNsYXNzIEluZm9CYXNlUGF0aCBleHRlbmRzIFJlLkNvbXBvbmVudHtyZW5kZXIoKXtjb25zdHtob3N0OnMsYmFzZVBhdGg6b309dGhpcy5wcm9wcztyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgicHJlIix7Y2xhc3NOYW1lOiJiYXNlLXVybCJ9LCJbIEJhc2UgVVJMOiAiLHMsbywiIF0iKX19Y2xhc3MgSW5mb1VybCBleHRlbmRzIFJlLlB1cmVDb21wb25lbnR7cmVuZGVyKCl7Y29uc3R7dXJsOnMsZ2V0Q29tcG9uZW50Om99PXRoaXMucHJvcHMsaT1vKCJMaW5rIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoaSx7dGFyZ2V0OiJfYmxhbmsiLGhyZWY6c2FuaXRpemVVcmwocyl9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InVybCJ9LCIgIixzKSl9fWNsYXNzIGluZm9fSW5mbyBleHRlbmRzIFJlLkNvbXBvbmVudHtyZW5kZXIoKXtjb25zdHtpbmZvOnMsdXJsOm8saG9zdDppLGJhc2VQYXRoOmEsZ2V0Q29tcG9uZW50OnUsZXh0ZXJuYWxEb2NzOl8sc2VsZWN0ZWRTZXJ2ZXI6dyx1cmw6eH09dGhpcy5wcm9wcyxDPXMuZ2V0KCJ2ZXJzaW9uIiksaj1zLmdldCgiZGVzY3JpcHRpb24iKSxMPXMuZ2V0KCJ0aXRsZSIpLEI9c2FmZUJ1aWxkVXJsKHMuZ2V0KCJ0ZXJtc09mU2VydmljZSIpLHgse3NlbGVjdGVkU2VydmVyOnd9KSwkPXMuZ2V0KCJjb250YWN0IiksVT1zLmdldCgibGljZW5zZSIpLFY9c2FmZUJ1aWxkVXJsKF8mJl8uZ2V0KCJ1cmwiKSx4LHtzZWxlY3RlZFNlcnZlcjp3fSksej1fJiZfLmdldCgiZGVzY3JpcHRpb24iKSxZPXUoIk1hcmtkb3duIiwhMCksWj11KCJMaW5rIiksZWU9dSgiVmVyc2lvblN0YW1wIiksaWU9dSgiT3BlbkFQSVZlcnNpb24iKSxhZT11KCJJbmZvVXJsIiksY2U9dSgiSW5mb0Jhc2VQYXRoIiksbGU9dSgiTGljZW5zZSIpLHBlPXUoIkNvbnRhY3QiKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJpbmZvIn0sUmUuY3JlYXRlRWxlbWVudCgiaGdyb3VwIix7Y2xhc3NOYW1lOiJtYWluIn0sUmUuY3JlYXRlRWxlbWVudCgiaDEiLHtjbGFzc05hbWU6InRpdGxlIn0sTCxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLEMmJlJlLmNyZWF0ZUVsZW1lbnQoZWUse3ZlcnNpb246Q30pLFJlLmNyZWF0ZUVsZW1lbnQoaWUse29hc1ZlcnNpb246IjIuMCJ9KSkpLGl8fGE/UmUuY3JlYXRlRWxlbWVudChjZSx7aG9zdDppLGJhc2VQYXRoOmF9KTpudWxsLG8mJlJlLmNyZWF0ZUVsZW1lbnQoYWUse2dldENvbXBvbmVudDp1LHVybDpvfSkpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZGVzY3JpcHRpb24ifSxSZS5jcmVhdGVFbGVtZW50KFkse3NvdXJjZTpqfSkpLEImJlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiaW5mb19fdG9zIn0sUmUuY3JlYXRlRWxlbWVudChaLHt0YXJnZXQ6Il9ibGFuayIsaHJlZjpzYW5pdGl6ZVVybChCKX0sIlRlcm1zIG9mIHNlcnZpY2UiKSksJD8uc2l6ZT4wJiZSZS5jcmVhdGVFbGVtZW50KHBlLHtnZXRDb21wb25lbnQ6dSxkYXRhOiQsc2VsZWN0ZWRTZXJ2ZXI6dyx1cmw6b30pLFU/LnNpemU+MCYmUmUuY3JlYXRlRWxlbWVudChsZSx7Z2V0Q29tcG9uZW50OnUsbGljZW5zZTpVLHNlbGVjdGVkU2VydmVyOncsdXJsOm99KSxWP1JlLmNyZWF0ZUVsZW1lbnQoWix7Y2xhc3NOYW1lOiJpbmZvX19leHRkb2NzIix0YXJnZXQ6Il9ibGFuayIsaHJlZjpzYW5pdGl6ZVVybChWKX0senx8Vik6bnVsbCl9fWNvbnN0IFFPPWluZm9fSW5mbztjbGFzcyBJbmZvQ29udGFpbmVyIGV4dGVuZHMgUmUuQ29tcG9uZW50e3JlbmRlcigpe2NvbnN0e3NwZWNTZWxlY3RvcnM6cyxnZXRDb21wb25lbnQ6byxvYXMzU2VsZWN0b3JzOml9PXRoaXMucHJvcHMsYT1zLmluZm8oKSx1PXMudXJsKCksXz1zLmJhc2VQYXRoKCksdz1zLmhvc3QoKSx4PXMuZXh0ZXJuYWxEb2NzKCksQz1pLnNlbGVjdGVkU2VydmVyKCksaj1vKCJpbmZvIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxhJiZhLmNvdW50KCk/UmUuY3JlYXRlRWxlbWVudChqLHtpbmZvOmEsdXJsOnUsaG9zdDp3LGJhc2VQYXRoOl8sZXh0ZXJuYWxEb2NzOngsZ2V0Q29tcG9uZW50Om8sc2VsZWN0ZWRTZXJ2ZXI6Q30pOm51bGwpfX1jbGFzcyBjb250YWN0X0NvbnRhY3QgZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7Y29uc3R7ZGF0YTpzLGdldENvbXBvbmVudDpvLHNlbGVjdGVkU2VydmVyOmksdXJsOmF9PXRoaXMucHJvcHMsdT1zLmdldCgibmFtZSIsInRoZSBkZXZlbG9wZXIiKSxfPXNhZmVCdWlsZFVybChzLmdldCgidXJsIiksYSx7c2VsZWN0ZWRTZXJ2ZXI6aX0pLHc9cy5nZXQoImVtYWlsIikseD1vKCJMaW5rIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiaW5mb19fY29udGFjdCJ9LF8mJlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KHgse2hyZWY6c2FuaXRpemVVcmwoXyksdGFyZ2V0OiJfYmxhbmsifSx1LCIgLSBXZWJzaXRlIikpLHcmJlJlLmNyZWF0ZUVsZW1lbnQoeCx7aHJlZjpzYW5pdGl6ZVVybChgbWFpbHRvOiR7d31gKX0sXz9gU2VuZCBlbWFpbCB0byAke3V9YDpgQ29udGFjdCAke3V9YCkpfX1jb25zdCBaTz1jb250YWN0X0NvbnRhY3Q7Y2xhc3MgbGljZW5zZV9MaWNlbnNlIGV4dGVuZHMgUmUuQ29tcG9uZW50e3JlbmRlcigpe2NvbnN0e2xpY2Vuc2U6cyxnZXRDb21wb25lbnQ6byxzZWxlY3RlZFNlcnZlcjppLHVybDphfT10aGlzLnByb3BzLHU9cy5nZXQoIm5hbWUiLCJMaWNlbnNlIiksXz1zYWZlQnVpbGRVcmwocy5nZXQoInVybCIpLGEse3NlbGVjdGVkU2VydmVyOml9KSx3PW8oIkxpbmsiKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJpbmZvX19saWNlbnNlIn0sXz9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImluZm9fX2xpY2Vuc2VfX3VybCJ9LFJlLmNyZWF0ZUVsZW1lbnQodyx7dGFyZ2V0OiJfYmxhbmsiLGhyZWY6c2FuaXRpemVVcmwoXyl9LHUpKTpSZS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLHUpKX19Y29uc3QgZUE9bGljZW5zZV9MaWNlbnNlO2NsYXNzIEp1bXBUb1BhdGggZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7cmV0dXJuIG51bGx9fWNsYXNzIENvcHlUb0NsaXBib2FyZEJ0biBleHRlbmRzIFJlLkNvbXBvbmVudHtyZW5kZXIoKXtsZXR7Z2V0Q29tcG9uZW50OnN9PXRoaXMucHJvcHM7Y29uc3Qgbz1zKCJDb3B5SWNvbiIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InZpZXctbGluZS1saW5rIGNvcHktdG8tY2xpcGJvYXJkIix0aXRsZToiQ29weSB0byBjbGlwYm9hcmQifSxSZS5jcmVhdGVFbGVtZW50KEhuLkNvcHlUb0NsaXBib2FyZCx7dGV4dDp0aGlzLnByb3BzLnRleHRUb0NvcHl9LFJlLmNyZWF0ZUVsZW1lbnQobyxudWxsKSkpfX1jbGFzcyBGb290ZXIgZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZm9vdGVyIn0pfX1jbGFzcyBGaWx0ZXJDb250YWluZXIgZXh0ZW5kcyBSZS5Db21wb25lbnR7b25GaWx0ZXJDaGFuZ2U9cz0+e2NvbnN0e3RhcmdldDp7dmFsdWU6b319PXM7dGhpcy5wcm9wcy5sYXlvdXRBY3Rpb25zLnVwZGF0ZUZpbHRlcihvKX07cmVuZGVyKCl7Y29uc3R7c3BlY1NlbGVjdG9yczpzLGxheW91dFNlbGVjdG9yczpvLGdldENvbXBvbmVudDppfT10aGlzLnByb3BzLGE9aSgiQ29sIiksdT0ibG9hZGluZyI9PT1zLmxvYWRpbmdTdGF0dXMoKSxfPSJmYWlsZWQiPT09cy5sb2FkaW5nU3RhdHVzKCksdz1vLmN1cnJlbnRGaWx0ZXIoKSx4PVsib3BlcmF0aW9uLWZpbHRlci1pbnB1dCJdO3JldHVybiBfJiZ4LnB1c2goImZhaWxlZCIpLHUmJngucHVzaCgibG9hZGluZyIpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCwhMT09PXc/bnVsbDpSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImZpbHRlci1jb250YWluZXIifSxSZS5jcmVhdGVFbGVtZW50KGEse2NsYXNzTmFtZToiZmlsdGVyIHdyYXBwZXIiLG1vYmlsZToxMn0sUmUuY3JlYXRlRWxlbWVudCgiaW5wdXQiLHtjbGFzc05hbWU6eC5qb2luKCIgIikscGxhY2Vob2xkZXI6IkZpbHRlciBieSB0YWciLHR5cGU6InRleHQiLG9uQ2hhbmdlOnRoaXMub25GaWx0ZXJDaGFuZ2UsdmFsdWU6InN0cmluZyI9PXR5cGVvZiB3P3c6IiIsZGlzYWJsZWQ6dX0pKSkpfX1jb25zdCB0QT1GdW5jdGlvbi5wcm90b3R5cGU7Y2xhc3MgUGFyYW1Cb2R5IGV4dGVuZHMgUmUuUHVyZUNvbXBvbmVudHtzdGF0aWMgZGVmYXVsdFByb3A9e2NvbnN1bWVzOigwLHplLmZyb21KUykoWyJhcHBsaWNhdGlvbi9qc29uIl0pLHBhcmFtOigwLHplLmZyb21KUykoe30pLG9uQ2hhbmdlOnRBLG9uQ2hhbmdlQ29uc3VtZXM6dEF9O2NvbnN0cnVjdG9yKHMsbyl7c3VwZXIocyxvKSx0aGlzLnN0YXRlPXtpc0VkaXRCb3g6ITEsdmFsdWU6IiJ9fWNvbXBvbmVudERpZE1vdW50KCl7dGhpcy51cGRhdGVWYWx1ZXMuY2FsbCh0aGlzLHRoaXMucHJvcHMpfVVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHMpe3RoaXMudXBkYXRlVmFsdWVzLmNhbGwodGhpcyxzKX11cGRhdGVWYWx1ZXM9cz0+e2xldHtwYXJhbTpvLGlzRXhlY3V0ZTppLGNvbnN1bWVzVmFsdWU6YT0iIn09cyx1PS94bWwvaS50ZXN0KGEpLF89L2pzb24vaS50ZXN0KGEpLHc9dT9vLmdldCgidmFsdWVfeG1sIik6by5nZXQoInZhbHVlIik7aWYodm9pZCAwIT09dyl7bGV0IHM9IXcmJl8/Int9Ijp3O3RoaXMuc2V0U3RhdGUoe3ZhbHVlOnN9KSx0aGlzLm9uQ2hhbmdlKHMse2lzWG1sOnUsaXNFZGl0Qm94Oml9KX1lbHNlIHU/dGhpcy5vbkNoYW5nZSh0aGlzLnNhbXBsZSgieG1sIikse2lzWG1sOnUsaXNFZGl0Qm94Oml9KTp0aGlzLm9uQ2hhbmdlKHRoaXMuc2FtcGxlKCkse2lzRWRpdEJveDppfSl9O3NhbXBsZT1zPT57bGV0e3BhcmFtOm8sZm46aX09dGhpcy5wcm9wcyxhPWkuaW5mZXJTY2hlbWEoby50b0pTKCkpO3JldHVybiBpLmdldFNhbXBsZVNjaGVtYShhLHMse2luY2x1ZGVXcml0ZU9ubHk6ITB9KX07b25DaGFuZ2U9KHMse2lzRWRpdEJveDpvLGlzWG1sOml9KT0+e3RoaXMuc2V0U3RhdGUoe3ZhbHVlOnMsaXNFZGl0Qm94Om99KSx0aGlzLl9vbkNoYW5nZShzLGkpfTtfb25DaGFuZ2U9KHMsbyk9PnsodGhpcy5wcm9wcy5vbkNoYW5nZXx8dEEpKHMsbyl9O2hhbmRsZU9uQ2hhbmdlPXM9Pntjb25zdHtjb25zdW1lc1ZhbHVlOm99PXRoaXMucHJvcHMsaT0veG1sL2kudGVzdChvKSxhPXMudGFyZ2V0LnZhbHVlO3RoaXMub25DaGFuZ2UoYSx7aXNYbWw6aSxpc0VkaXRCb3g6dGhpcy5zdGF0ZS5pc0VkaXRCb3h9KX07dG9nZ2xlSXNFZGl0Qm94PSgpPT50aGlzLnNldFN0YXRlKChzPT4oe2lzRWRpdEJveDohcy5pc0VkaXRCb3h9KSkpO3JlbmRlcigpe2xldHtvbkNoYW5nZUNvbnN1bWVzOnMscGFyYW06byxpc0V4ZWN1dGU6aSxzcGVjU2VsZWN0b3JzOmEscGF0aE1ldGhvZDp1LGdldENvbXBvbmVudDpffT10aGlzLnByb3BzO2NvbnN0IHc9XygiQnV0dG9uIikseD1fKCJUZXh0QXJlYSIpLEM9XygiSGlnaGxpZ2h0Q29kZSIsITApLGo9XygiY29udGVudFR5cGUiKTtsZXQgTD0oYT9hLnBhcmFtZXRlcldpdGhNZXRhQnlJZGVudGl0eSh1LG8pOm8pLmdldCgiZXJyb3JzIiwoMCx6ZS5MaXN0KSgpKSxCPWEuY29udGVudFR5cGVWYWx1ZXModSkuZ2V0KCJyZXF1ZXN0Q29udGVudFR5cGUiKSwkPXRoaXMucHJvcHMuY29uc3VtZXMmJnRoaXMucHJvcHMuY29uc3VtZXMuc2l6ZT90aGlzLnByb3BzLmNvbnN1bWVzOlBhcmFtQm9keS5kZWZhdWx0UHJvcC5jb25zdW1lcyx7dmFsdWU6VSxpc0VkaXRCb3g6Vn09dGhpcy5zdGF0ZSx6PW51bGw7Z2V0S25vd25TeW50YXhIaWdobGlnaHRlckxhbmd1YWdlKFUpJiYoej0ianNvbiIpO2NvbnN0IFk9YCR7Y3JlYXRlSHRtbFJlYWR5SWQoYCR7dVsxXX0ke3VbMF19X3BhcmFtZXRlcnNgKX1fc2VsZWN0YDtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJib2R5LXBhcmFtIiwiZGF0YS1wYXJhbS1uYW1lIjpvLmdldCgibmFtZSIpLCJkYXRhLXBhcmFtLWluIjpvLmdldCgiaW4iKX0sViYmaT9SZS5jcmVhdGVFbGVtZW50KHgse2NsYXNzTmFtZToiYm9keS1wYXJhbV9fdGV4dCIrKEwuY291bnQoKT8iIGludmFsaWQiOiIiKSx2YWx1ZTpVLG9uQ2hhbmdlOnRoaXMuaGFuZGxlT25DaGFuZ2V9KTpVJiZSZS5jcmVhdGVFbGVtZW50KEMse2NsYXNzTmFtZToiYm9keS1wYXJhbV9fZXhhbXBsZSIsbGFuZ3VhZ2U6en0sVSksUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJib2R5LXBhcmFtLW9wdGlvbnMifSxpP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYm9keS1wYXJhbS1lZGl0In0sUmUuY3JlYXRlRWxlbWVudCh3LHtjbGFzc05hbWU6Vj8iYnRuIGNhbmNlbCBib2R5LXBhcmFtX19leGFtcGxlLWVkaXQiOiJidG4gZWRpdCBib2R5LXBhcmFtX19leGFtcGxlLWVkaXQiLG9uQ2xpY2s6dGhpcy50b2dnbGVJc0VkaXRCb3h9LFY/IkNhbmNlbCI6IkVkaXQiKSk6bnVsbCxSZS5jcmVhdGVFbGVtZW50KCJsYWJlbCIse2h0bWxGb3I6WX0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIsbnVsbCwiUGFyYW1ldGVyIGNvbnRlbnQgdHlwZSIpLFJlLmNyZWF0ZUVsZW1lbnQoaix7dmFsdWU6Qixjb250ZW50VHlwZXM6JCxvbkNoYW5nZTpzLGNsYXNzTmFtZToiYm9keS1wYXJhbS1jb250ZW50LXR5cGUiLGFyaWFMYWJlbDoiUGFyYW1ldGVyIGNvbnRlbnQgdHlwZSIsY29udHJvbElkOll9KSkpKX19Y2xhc3MgQ3VybCBleHRlbmRzIFJlLkNvbXBvbmVudHtyZW5kZXIoKXtjb25zdHtyZXF1ZXN0OnMsZ2V0Q29tcG9uZW50Om99PXRoaXMucHJvcHMsaT1yZXF1ZXN0U25pcHBldEdlbmVyYXRvcl9jdXJsX2Jhc2gocyksYT1vKCJTeW50YXhIaWdobGlnaHRlciIsITApO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImN1cmwtY29tbWFuZCJ9LFJlLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLCJDdXJsIiksUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjb3B5LXRvLWNsaXBib2FyZCJ9LFJlLmNyZWF0ZUVsZW1lbnQoSG4uQ29weVRvQ2xpcGJvYXJkLHt0ZXh0Oml9LFJlLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIsbnVsbCkpKSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsUmUuY3JlYXRlRWxlbWVudChhLHtsYW5ndWFnZToiYmFzaCIsY2xhc3NOYW1lOiJjdXJsIG1pY3JvbGlnaHQiLHJlbmRlclBsYWluVGV4dDooe2NoaWxkcmVuOnMsUGxhaW5UZXh0Vmlld2VyOm99KT0+UmUuY3JlYXRlRWxlbWVudChvLHtjbGFzc05hbWU6ImN1cmwifSxzKX0saSkpKX19Y29uc3QgcHJvcGVydHk9KHtwcm9wS2V5OnMscHJvcFZhbDpvLHByb3BDbGFzczppfSk9PlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6aX0sUmUuY3JlYXRlRWxlbWVudCgiYnIiLG51bGwpLHMsIjogIixzdHJpbmdpZnkobykpO2NsYXNzIFRyeUl0T3V0QnV0dG9uIGV4dGVuZHMgUmUuQ29tcG9uZW50e3N0YXRpYyBkZWZhdWx0UHJvcHM9e29uVHJ5b3V0Q2xpY2s6RnVuY3Rpb24ucHJvdG90eXBlLG9uQ2FuY2VsQ2xpY2s6RnVuY3Rpb24ucHJvdG90eXBlLG9uUmVzZXRDbGljazpGdW5jdGlvbi5wcm90b3R5cGUsZW5hYmxlZDohMSxoYXNVc2VyRWRpdGVkQm9keTohMSxpc09BUzM6ITF9O3JlbmRlcigpe2NvbnN0e29uVHJ5b3V0Q2xpY2s6cyxvbkNhbmNlbENsaWNrOm8sb25SZXNldENsaWNrOmksZW5hYmxlZDphLGhhc1VzZXJFZGl0ZWRCb2R5OnUsaXNPQVMzOl99PXRoaXMucHJvcHMsdz1fJiZ1O3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6dz8idHJ5LW91dCBidG4tZ3JvdXAiOiJ0cnktb3V0In0sYT9SZS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHtjbGFzc05hbWU6ImJ0biB0cnktb3V0X19idG4gY2FuY2VsIixvbkNsaWNrOm99LCJDYW5jZWwiKTpSZS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHtjbGFzc05hbWU6ImJ0biB0cnktb3V0X19idG4iLG9uQ2xpY2s6c30sIlRyeSBpdCBvdXQgIiksdyYmUmUuY3JlYXRlRWxlbWVudCgiYnV0dG9uIix7Y2xhc3NOYW1lOiJidG4gdHJ5LW91dF9fYnRuIHJlc2V0IixvbkNsaWNrOml9LCJSZXNldCIpKX19Y2xhc3MgVmVyc2lvblByYWdtYUZpbHRlciBleHRlbmRzIFJlLlB1cmVDb21wb25lbnR7c3RhdGljIGRlZmF1bHRQcm9wcz17YWxzb1Nob3c6bnVsbCxjaGlsZHJlbjpudWxsLGJ5cGFzczohMX07cmVuZGVyKCl7Y29uc3R7YnlwYXNzOnMsaXNTd2FnZ2VyMjpvLGlzT0FTMzppLGFsc29TaG93OmF9PXRoaXMucHJvcHM7cmV0dXJuIHM/UmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLHRoaXMucHJvcHMuY2hpbGRyZW4pOm8mJmk/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ2ZXJzaW9uLXByYWdtYSJ9LGEsUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ2ZXJzaW9uLXByYWdtYV9fbWVzc2FnZSB2ZXJzaW9uLXByYWdtYV9fbWVzc2FnZS0tYW1iaWd1b3VzIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImgzIixudWxsLCJVbmFibGUgdG8gcmVuZGVyIHRoaXMgZGVmaW5pdGlvbiIpLFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwic3dhZ2dlciIpLCIgYW5kICIsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaSIpLCIgZmllbGRzIGNhbm5vdCBiZSBwcmVzZW50IGluIHRoZSBzYW1lIFN3YWdnZXIgb3IgT3BlbkFQSSBkZWZpbml0aW9uLiBQbGVhc2UgcmVtb3ZlIG9uZSBvZiB0aGUgZmllbGRzLiIpLFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIlN1cHBvcnRlZCB2ZXJzaW9uIGZpZWxkcyBhcmUgIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJzd2FnZ2VyOiAiLCciMi4wIicpLCIgYW5kIHRob3NlIHRoYXQgbWF0Y2ggIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJvcGVuYXBpOiAzLjAubiIpLCIgKGZvciBleGFtcGxlLCAiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsIm9wZW5hcGk6IDMuMC40IiksIikuIikpKSk6b3x8aT9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsdGhpcy5wcm9wcy5jaGlsZHJlbik6UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ2ZXJzaW9uLXByYWdtYSJ9LGEsUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ2ZXJzaW9uLXByYWdtYV9fbWVzc2FnZSB2ZXJzaW9uLXByYWdtYV9fbWVzc2FnZS0tbWlzc2luZyJ9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJoMyIsbnVsbCwiVW5hYmxlIHRvIHJlbmRlciB0aGlzIGRlZmluaXRpb24iKSxSZS5jcmVhdGVFbGVtZW50KCJwIixudWxsLCJUaGUgcHJvdmlkZWQgZGVmaW5pdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsaWQgdmVyc2lvbiBmaWVsZC4iKSxSZS5jcmVhdGVFbGVtZW50KCJwIixudWxsLCJQbGVhc2UgaW5kaWNhdGUgYSB2YWxpZCBTd2FnZ2VyIG9yIE9wZW5BUEkgdmVyc2lvbiBmaWVsZC4gU3VwcG9ydGVkIHZlcnNpb24gZmllbGRzIGFyZSAiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsInN3YWdnZXI6ICIsJyIyLjAiJyksIiBhbmQgdGhvc2UgdGhhdCBtYXRjaCAiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsIm9wZW5hcGk6IDMuMC5uIiksIiAoZm9yIGV4YW1wbGUsICIsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaTogMy4wLjQiKSwiKS4iKSkpKX19Y29uc3QgdmVyc2lvbl9zdGFtcD0oe3ZlcnNpb246c30pPT5SZS5jcmVhdGVFbGVtZW50KCJzbWFsbCIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJwcmUiLHtjbGFzc05hbWU6InZlcnNpb24ifSwiICIscywiICIpKSxvcGVuYXBpX3ZlcnNpb249KHtvYXNWZXJzaW9uOnN9KT0+UmUuY3JlYXRlRWxlbWVudCgic21hbGwiLHtjbGFzc05hbWU6InZlcnNpb24tc3RhbXAifSxSZS5jcmVhdGVFbGVtZW50KCJwcmUiLHtjbGFzc05hbWU6InZlcnNpb24ifSwiT0FTICIscykpLGRlZXBfbGluaz0oe2VuYWJsZWQ6cyxwYXRoOm8sdGV4dDppfSk9PlJlLmNyZWF0ZUVsZW1lbnQoImEiLHtjbGFzc05hbWU6Im5vc3R5bGUiLG9uQ2xpY2s6cz9zPT5zLnByZXZlbnREZWZhdWx0KCk6bnVsbCxocmVmOnM/YCMvJHtvfWA6bnVsbH0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIsbnVsbCxpKSksc3ZnX2Fzc2V0cz0oKT0+UmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInN2ZyIse3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseG1sbnNYbGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsY2xhc3NOYW1lOiJzdmctYXNzZXRzIn0sUmUuY3JlYXRlRWxlbWVudCgiZGVmcyIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJzeW1ib2wiLHt2aWV3Qm94OiIwIDAgMjAgMjAiLGlkOiJ1bmxvY2tlZCJ9LFJlLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTUuOCA4SDE0VjUuNkMxNCAyLjcwMyAxMi42NjUgMSAxMCAxIDcuMzM0IDEgNiAyLjcwMyA2IDUuNlY2aDJ2LS44MDFDOCAzLjc1NCA4Ljc5NyAzIDEwIDNjMS4yMDMgMCAyIC43NTQgMiAyLjE5OVY4SDRjLS41NTMgMC0xIC42NDYtMSAxLjE5OVYxN2MwIC41NDkuNDI4IDEuMTM5Ljk1MSAxLjMwN2wxLjE5Ny4zODdDNS42NzIgMTguODYxIDYuNTUgMTkgNy4xIDE5aDUuOGMuNTQ5IDAgMS40MjgtLjEzOSAxLjk1MS0uMzA3bDEuMTk2LS4zODdjLjUyNC0uMTY3Ljk1My0uNzU3Ljk1My0xLjMwNlY5LjE5OUMxNyA4LjY0NiAxNi4zNTIgOCAxNS44IDh6In0pKSxSZS5jcmVhdGVFbGVtZW50KCJzeW1ib2wiLHt2aWV3Qm94OiIwIDAgMjAgMjAiLGlkOiJsb2NrZWQifSxSZS5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTE1LjggOEgxNFY1LjZDMTQgMi43MDMgMTIuNjY1IDEgMTAgMSA3LjMzNCAxIDYgMi43MDMgNiA1LjZWOEg0Yy0uNTUzIDAtMSAuNjQ2LTEgMS4xOTlWMTdjMCAuNTQ5LjQyOCAxLjEzOS45NTEgMS4zMDdsMS4xOTcuMzg3QzUuNjcyIDE4Ljg2MSA2LjU1IDE5IDcuMSAxOWg1LjhjLjU0OSAwIDEuNDI4LS4xMzkgMS45NTEtLjMwN2wxLjE5Ni0uMzg3Yy41MjQtLjE2Ny45NTMtLjc1Ny45NTMtMS4zMDZWOS4xOTlDMTcgOC42NDYgMTYuMzUyIDggMTUuOCA4ek0xMiA4SDhWNS4xOTlDOCAzLjc1NCA4Ljc5NyAzIDEwIDNjMS4yMDMgMCAyIC43NTQgMiAyLjE5OVY4eiJ9KSksUmUuY3JlYXRlRWxlbWVudCgic3ltYm9sIix7dmlld0JveDoiMCAwIDIwIDIwIixpZDoiY2xvc2UifSxSZS5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTE0LjM0OCAxNC44NDljLS40NjkuNDY5LTEuMjI5LjQ2OS0xLjY5NyAwTDEwIDExLjgxOWwtMi42NTEgMy4wMjljLS40NjkuNDY5LTEuMjI5LjQ2OS0xLjY5NyAwLS40NjktLjQ2OS0uNDY5LTEuMjI5IDAtMS42OTdsMi43NTgtMy4xNS0yLjc1OS0zLjE1MmMtLjQ2OS0uNDY5LS40NjktMS4yMjggMC0xLjY5Ny40NjktLjQ2OSAxLjIyOC0uNDY5IDEuNjk3IDBMMTAgOC4xODNsMi42NTEtMy4wMzFjLjQ2OS0uNDY5IDEuMjI4LS40NjkgMS42OTcgMCAuNDY5LjQ2OS40NjkgMS4yMjkgMCAxLjY5N2wtMi43NTggMy4xNTIgMi43NTggMy4xNWMuNDY5LjQ2OS40NjkgMS4yMjkgMCAxLjY5OHoifSkpLFJlLmNyZWF0ZUVsZW1lbnQoInN5bWJvbCIse3ZpZXdCb3g6IjAgMCAyMCAyMCIsaWQ6ImxhcmdlLWFycm93In0sUmUuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xMy4yNSAxMEw2LjEwOSAyLjU4Yy0uMjY4LS4yNy0uMjY4LS43MDcgMC0uOTc5LjI2OC0uMjcuNzAxLS4yNy45NjkgMGw3LjgzIDcuOTA4Yy4yNjguMjcxLjI2OC43MDkgMCAuOTc5bC03LjgzIDcuOTA4Yy0uMjY4LjI3MS0uNzAxLjI3LS45NjkgMC0uMjY4LS4yNjktLjI2OC0uNzA3IDAtLjk3OUwxMy4yNSAxMHoifSkpLFJlLmNyZWF0ZUVsZW1lbnQoInN5bWJvbCIse3ZpZXdCb3g6IjAgMCAyMCAyMCIsaWQ6ImxhcmdlLWFycm93LWRvd24ifSxSZS5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTE3LjQxOCA2LjEwOWMuMjcyLS4yNjguNzA5LS4yNjguOTc5IDBzLjI3MS43MDEgMCAuOTY5bC03LjkwOCA3LjgzYy0uMjcuMjY4LS43MDcuMjY4LS45NzkgMGwtNy45MDgtNy44M2MtLjI3LS4yNjgtLjI3LS43MDEgMC0uOTY5LjI3MS0uMjY4LjcwOS0uMjY4Ljk3OSAwTDEwIDEzLjI1bDcuNDE4LTcuMTQxeiJ9KSksUmUuY3JlYXRlRWxlbWVudCgic3ltYm9sIix7dmlld0JveDoiMCAwIDIwIDIwIixpZDoibGFyZ2UtYXJyb3ctdXAifSxSZS5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTSAxNy40MTggMTQuOTA4IEMgMTcuNjkgMTUuMTc2IDE4LjEyNyAxNS4xNzYgMTguMzk3IDE0LjkwOCBDIDE4LjY2NyAxNC42NCAxOC42NjggMTQuMjA3IDE4LjM5NyAxMy45MzkgTCAxMC40ODkgNi4xMDkgQyAxMC4yMTkgNS44NDEgOS43ODIgNS44NDEgOS41MSA2LjEwOSBMIDEuNjAyIDEzLjkzOSBDIDEuMzMyIDE0LjIwNyAxLjMzMiAxNC42NCAxLjYwMiAxNC45MDggQyAxLjg3MyAxNS4xNzYgMi4zMTEgMTUuMTc2IDIuNTgxIDE0LjkwOCBMIDEwIDcuNzY3IEwgMTcuNDE4IDE0LjkwOCBaIn0pKSxSZS5jcmVhdGVFbGVtZW50KCJzeW1ib2wiLHt2aWV3Qm94OiIwIDAgMjQgMjQiLGlkOiJqdW1wLXRvIn0sUmUuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xOSA3djRINS44M2wzLjU4LTMuNTlMOCA2bC02IDYgNiA2IDEuNDEtMS40MUw1LjgzIDEzSDIxVjd6In0pKSxSZS5jcmVhdGVFbGVtZW50KCJzeW1ib2wiLHt2aWV3Qm94OiIwIDAgMjQgMjQiLGlkOiJleHBhbmQifSxSZS5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiJ9KSksUmUuY3JlYXRlRWxlbWVudCgic3ltYm9sIix7dmlld0JveDoiMCAwIDE1IDE2IixpZDoiY29weSJ9LFJlLmNyZWF0ZUVsZW1lbnQoImciLHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgyLCAtMSkifSxSZS5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZmlsbDoiI2ZmZmZmZiIsZmlsbFJ1bGU6ImV2ZW5vZGQiLGQ6Ik0yIDEzaDR2MUgydi0xem01LTZIMnYxaDVWN3ptMiAzVjhsLTMgMyAzIDN2LTJoNXYtMkg5ek00LjUgOUgydjFoMi41Vjl6TTIgMTJoMi41di0xSDJ2MXptOSAxaDF2MmMtLjAyLjI4LS4xMS41Mi0uMy43LS4xOS4xOC0uNDIuMjgtLjcuM0gxYy0uNTUgMC0xLS40NS0xLTFWNGMwLS41NS40NS0xIDEtMWgzYzAtMS4xMS44OS0yIDItMiAxLjExIDAgMiAuODkgMiAyaDNjLjU1IDAgMSAuNDUgMSAxdjVoLTFWNkgxdjloMTB2LTJ6TTIgNWg4YzAtLjU1LS40NS0xLTEtMUg4Yy0uNTUgMC0xLS40NS0xLTFzLS40NS0xLTEtMS0xIC40NS0xIDEtLjQ1IDEtMSAxSDNjLS41NSAwLTEgLjQ1LTEgMXoifSkpKSkpKTt2YXIgckE7ZnVuY3Rpb24gZGVjb2RlRW50aXR5KHMpe3JldHVybihyQT1yQXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKSkuaW5uZXJIVE1MPSImIitzKyI7IixyQS52YWx1ZX12YXIgbkE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBpbmRleF9icm93c2VyX2hhcyhzLG8pe3JldHVybiEhcyYmbkEuY2FsbChzLG8pfWZ1bmN0aW9uIGluZGV4X2Jyb3dzZXJfYXNzaWduKHMpe3JldHVybltdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLmZvckVhY2goKGZ1bmN0aW9uKG8pe2lmKG8pe2lmKCJvYmplY3QiIT10eXBlb2Ygbyl0aHJvdyBuZXcgVHlwZUVycm9yKG8rIm11c3QgYmUgb2JqZWN0Iik7T2JqZWN0LmtleXMobykuZm9yRWFjaCgoZnVuY3Rpb24oaSl7c1tpXT1vW2ldfSkpfX0pKSxzfXZhciBzQT0vXFwoW1xcISIjJCUmJygpKissLlwvOjs8PT4/QFtcXV5fYHt8fX4tXSkvZztmdW5jdGlvbiB1bmVzY2FwZU1kKHMpe3JldHVybiBzLmluZGV4T2YoIlxcIik8MD9zOnMucmVwbGFjZShzQSwiJDEiKX1mdW5jdGlvbiBpc1ZhbGlkRW50aXR5Q29kZShzKXtyZXR1cm4hKHM+PTU1Mjk2JiZzPD01NzM0MykmJighKHM+PTY0OTc2JiZzPD02NTAwNykmJighISg2NTUzNSZ+cyYmNjU1MzQhPSg2NTUzNSZzKSkmJighKHM+PTAmJnM8PTgpJiYoMTEhPT1zJiYoIShzPj0xNCYmczw9MzEpJiYoIShzPj0xMjcmJnM8PTE1OSkmJiEocz4xMTE0MTExKSkpKSkpKX1mdW5jdGlvbiBmcm9tQ29kZVBvaW50KHMpe2lmKHM+NjU1MzUpe3ZhciBvPTU1Mjk2Kygocy09NjU1MzYpPj4xMCksaT01NjMyMCsoMTAyMyZzKTtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShvLGkpfXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHMpfXZhciBvQT0vJihbYS16I11bYS16MC05XXsxLDMxfSk7L2dpLGlBPS9eIygoPzp4W2EtZjAtOV17MSw4fXxbMC05XXsxLDh9KSkvaTtmdW5jdGlvbiByZXBsYWNlRW50aXR5UGF0dGVybihzLG8pe3ZhciBpPTAsYT1kZWNvZGVFbnRpdHkobyk7cmV0dXJuIG8hPT1hP2E6MzU9PT1vLmNoYXJDb2RlQXQoMCkmJmlBLnRlc3QobykmJmlzVmFsaWRFbnRpdHlDb2RlKGk9IngiPT09b1sxXS50b0xvd2VyQ2FzZSgpP3BhcnNlSW50KG8uc2xpY2UoMiksMTYpOnBhcnNlSW50KG8uc2xpY2UoMSksMTApKT9mcm9tQ29kZVBvaW50KGkpOnN9ZnVuY3Rpb24gcmVwbGFjZUVudGl0aWVzKHMpe3JldHVybiBzLmluZGV4T2YoIiYiKTwwP3M6cy5yZXBsYWNlKG9BLHJlcGxhY2VFbnRpdHlQYXR0ZXJuKX12YXIgYUE9L1smPD4iXS8sY0E9L1smPD4iXS9nLGxBPXsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsifTtmdW5jdGlvbiByZXBsYWNlVW5zYWZlQ2hhcihzKXtyZXR1cm4gbEFbc119ZnVuY3Rpb24gZXNjYXBlSHRtbChzKXtyZXR1cm4gYUEudGVzdChzKT9zLnJlcGxhY2UoY0EscmVwbGFjZVVuc2FmZUNoYXIpOnN9dmFyIHVBPXt9O2Z1bmN0aW9uIG5leHRUb2tlbihzLG8pe3JldHVybisrbz49cy5sZW5ndGgtMj9vOiJwYXJhZ3JhcGhfb3BlbiI9PT1zW29dLnR5cGUmJnNbb10udGlnaHQmJiJpbmxpbmUiPT09c1tvKzFdLnR5cGUmJjA9PT1zW28rMV0uY29udGVudC5sZW5ndGgmJiJwYXJhZ3JhcGhfY2xvc2UiPT09c1tvKzJdLnR5cGUmJnNbbysyXS50aWdodD9uZXh0VG9rZW4ocyxvKzIpOm99dUEuYmxvY2txdW90ZV9vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIjxibG9ja3F1b3RlPlxuIn0sdUEuYmxvY2txdW90ZV9jbG9zZT1mdW5jdGlvbihzLG8pe3JldHVybiI8L2Jsb2NrcXVvdGU+IitwQShzLG8pfSx1QS5jb2RlPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHNbb10uYmxvY2s/IjxwcmU+PGNvZGU+Iitlc2NhcGVIdG1sKHNbb10uY29udGVudCkrIjwvY29kZT48L3ByZT4iK3BBKHMsbyk6Ijxjb2RlPiIrZXNjYXBlSHRtbChzW29dLmNvbnRlbnQpKyI8L2NvZGU+In0sdUEuZmVuY2U9ZnVuY3Rpb24ocyxvLGksYSx1KXt2YXIgXyx3LHg9c1tvXSxDPSIiLGo9aS5sYW5nUHJlZml4O2lmKHgucGFyYW1zKXtpZih3PShfPXgucGFyYW1zLnNwbGl0KC9ccysvZykpLmpvaW4oIiAiKSxpbmRleF9icm93c2VyX2hhcyh1LnJ1bGVzLmZlbmNlX2N1c3RvbSxfWzBdKSlyZXR1cm4gdS5ydWxlcy5mZW5jZV9jdXN0b21bX1swXV0ocyxvLGksYSx1KTtDPScgY2xhc3M9Iicraitlc2NhcGVIdG1sKHJlcGxhY2VFbnRpdGllcyh1bmVzY2FwZU1kKHcpKSkrJyInfXJldHVybiI8cHJlPjxjb2RlIitDKyI+IisoaS5oaWdobGlnaHQmJmkuaGlnaGxpZ2h0LmFwcGx5KGkuaGlnaGxpZ2h0LFt4LmNvbnRlbnRdLmNvbmNhdChfKSl8fGVzY2FwZUh0bWwoeC5jb250ZW50KSkrIjwvY29kZT48L3ByZT4iK3BBKHMsbyl9LHVBLmZlbmNlX2N1c3RvbT17fSx1QS5oZWFkaW5nX29wZW49ZnVuY3Rpb24ocyxvKXtyZXR1cm4iPGgiK3Nbb10uaExldmVsKyI+In0sdUEuaGVhZGluZ19jbG9zZT1mdW5jdGlvbihzLG8pe3JldHVybiI8L2giK3Nbb10uaExldmVsKyI+XG4ifSx1QS5ocj1mdW5jdGlvbihzLG8saSl7cmV0dXJuKGkueGh0bWxPdXQ/IjxociAvPiI6Ijxocj4iKStwQShzLG8pfSx1QS5idWxsZXRfbGlzdF9vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIjx1bD5cbiJ9LHVBLmJ1bGxldF9saXN0X2Nsb3NlPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIjwvdWw+IitwQShzLG8pfSx1QS5saXN0X2l0ZW1fb3Blbj1mdW5jdGlvbigpe3JldHVybiI8bGk+In0sdUEubGlzdF9pdGVtX2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvbGk+XG4ifSx1QS5vcmRlcmVkX2xpc3Rfb3Blbj1mdW5jdGlvbihzLG8pe3ZhciBpPXNbb107cmV0dXJuIjxvbCIrKGkub3JkZXI+MT8nIHN0YXJ0PSInK2kub3JkZXIrJyInOiIiKSsiPlxuIn0sdUEub3JkZXJlZF9saXN0X2Nsb3NlPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIjwvb2w+IitwQShzLG8pfSx1QS5wYXJhZ3JhcGhfb3Blbj1mdW5jdGlvbihzLG8pe3JldHVybiBzW29dLnRpZ2h0PyIiOiI8cD4ifSx1QS5wYXJhZ3JhcGhfY2xvc2U9ZnVuY3Rpb24ocyxvKXt2YXIgaT0hKHNbb10udGlnaHQmJm8mJiJpbmxpbmUiPT09c1tvLTFdLnR5cGUmJiFzW28tMV0uY29udGVudCk7cmV0dXJuKHNbb10udGlnaHQ/IiI6IjwvcD4iKSsoaT9wQShzLG8pOiIiKX0sdUEubGlua19vcGVuPWZ1bmN0aW9uKHMsbyxpKXt2YXIgYT1zW29dLnRpdGxlPycgdGl0bGU9IicrZXNjYXBlSHRtbChyZXBsYWNlRW50aXRpZXMoc1tvXS50aXRsZSkpKyciJzoiIix1PWkubGlua1RhcmdldD8nIHRhcmdldD0iJytpLmxpbmtUYXJnZXQrJyInOiIiO3JldHVybic8YSBocmVmPSInK2VzY2FwZUh0bWwoc1tvXS5ocmVmKSsnIicrYSt1KyI+In0sdUEubGlua19jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L2E+In0sdUEuaW1hZ2U9ZnVuY3Rpb24ocyxvLGkpe3ZhciBhPScgc3JjPSInK2VzY2FwZUh0bWwoc1tvXS5zcmMpKyciJyx1PXNbb10udGl0bGU/JyB0aXRsZT0iJytlc2NhcGVIdG1sKHJlcGxhY2VFbnRpdGllcyhzW29dLnRpdGxlKSkrJyInOiIiO3JldHVybiI8aW1nIithKygnIGFsdD0iJysoc1tvXS5hbHQ/ZXNjYXBlSHRtbChyZXBsYWNlRW50aXRpZXModW5lc2NhcGVNZChzW29dLmFsdCkpKToiIikrJyInKSt1KyhpLnhodG1sT3V0PyIgLyI6IiIpKyI+In0sdUEudGFibGVfb3Blbj1mdW5jdGlvbigpe3JldHVybiI8dGFibGU+XG4ifSx1QS50YWJsZV9jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L3RhYmxlPlxuIn0sdUEudGhlYWRfb3Blbj1mdW5jdGlvbigpe3JldHVybiI8dGhlYWQ+XG4ifSx1QS50aGVhZF9jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L3RoZWFkPlxuIn0sdUEudGJvZHlfb3Blbj1mdW5jdGlvbigpe3JldHVybiI8dGJvZHk+XG4ifSx1QS50Ym9keV9jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L3Rib2R5PlxuIn0sdUEudHJfb3Blbj1mdW5jdGlvbigpe3JldHVybiI8dHI+In0sdUEudHJfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC90cj5cbiJ9LHVBLnRoX29wZW49ZnVuY3Rpb24ocyxvKXt2YXIgaT1zW29dO3JldHVybiI8dGgiKyhpLmFsaWduPycgc3R5bGU9InRleHQtYWxpZ246JytpLmFsaWduKyciJzoiIikrIj4ifSx1QS50aF9jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L3RoPiJ9LHVBLnRkX29wZW49ZnVuY3Rpb24ocyxvKXt2YXIgaT1zW29dO3JldHVybiI8dGQiKyhpLmFsaWduPycgc3R5bGU9InRleHQtYWxpZ246JytpLmFsaWduKyciJzoiIikrIj4ifSx1QS50ZF9jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L3RkPiJ9LHVBLnN0cm9uZ19vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIjxzdHJvbmc+In0sdUEuc3Ryb25nX2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvc3Ryb25nPiJ9LHVBLmVtX29wZW49ZnVuY3Rpb24oKXtyZXR1cm4iPGVtPiJ9LHVBLmVtX2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvZW0+In0sdUEuZGVsX29wZW49ZnVuY3Rpb24oKXtyZXR1cm4iPGRlbD4ifSx1QS5kZWxfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC9kZWw+In0sdUEuaW5zX29wZW49ZnVuY3Rpb24oKXtyZXR1cm4iPGlucz4ifSx1QS5pbnNfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC9pbnM+In0sdUEubWFya19vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIjxtYXJrPiJ9LHVBLm1hcmtfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC9tYXJrPiJ9LHVBLnN1Yj1mdW5jdGlvbihzLG8pe3JldHVybiI8c3ViPiIrZXNjYXBlSHRtbChzW29dLmNvbnRlbnQpKyI8L3N1Yj4ifSx1QS5zdXA9ZnVuY3Rpb24ocyxvKXtyZXR1cm4iPHN1cD4iK2VzY2FwZUh0bWwoc1tvXS5jb250ZW50KSsiPC9zdXA+In0sdUEuaGFyZGJyZWFrPWZ1bmN0aW9uKHMsbyxpKXtyZXR1cm4gaS54aHRtbE91dD8iPGJyIC8+XG4iOiI8YnI+XG4ifSx1QS5zb2Z0YnJlYWs9ZnVuY3Rpb24ocyxvLGkpe3JldHVybiBpLmJyZWFrcz9pLnhodG1sT3V0PyI8YnIgLz5cbiI6Ijxicj5cbiI6IlxuIn0sdUEudGV4dD1mdW5jdGlvbihzLG8pe3JldHVybiBlc2NhcGVIdG1sKHNbb10uY29udGVudCl9LHVBLmh0bWxibG9jaz1mdW5jdGlvbihzLG8pe3JldHVybiBzW29dLmNvbnRlbnR9LHVBLmh0bWx0YWc9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gc1tvXS5jb250ZW50fSx1QS5hYmJyX29wZW49ZnVuY3Rpb24ocyxvKXtyZXR1cm4nPGFiYnIgdGl0bGU9IicrZXNjYXBlSHRtbChyZXBsYWNlRW50aXRpZXMoc1tvXS50aXRsZSkpKyciPid9LHVBLmFiYnJfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC9hYmJyPiJ9LHVBLmZvb3Rub3RlX3JlZj1mdW5jdGlvbihzLG8pe3ZhciBpPU51bWJlcihzW29dLmlkKzEpLnRvU3RyaW5nKCksYT0iZm5yZWYiK2k7cmV0dXJuIHNbb10uc3ViSWQ+MCYmKGErPSI6IitzW29dLnN1YklkKSwnPHN1cCBjbGFzcz0iZm9vdG5vdGUtcmVmIj48YSBocmVmPSIjZm4nK2krJyIgaWQ9IicrYSsnIj5bJytpKyJdPC9hPjwvc3VwPiJ9LHVBLmZvb3Rub3RlX2Jsb2NrX29wZW49ZnVuY3Rpb24ocyxvLGkpe3JldHVybihpLnhodG1sT3V0Pyc8aHIgY2xhc3M9ImZvb3Rub3Rlcy1zZXAiIC8+XG4nOic8aHIgY2xhc3M9ImZvb3Rub3Rlcy1zZXAiPlxuJykrJzxzZWN0aW9uIGNsYXNzPSJmb290bm90ZXMiPlxuPG9sIGNsYXNzPSJmb290bm90ZXMtbGlzdCI+XG4nfSx1QS5mb290bm90ZV9ibG9ja19jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L29sPlxuPC9zZWN0aW9uPlxuIn0sdUEuZm9vdG5vdGVfb3Blbj1mdW5jdGlvbihzLG8pe3JldHVybic8bGkgaWQ9ImZuJytOdW1iZXIoc1tvXS5pZCsxKS50b1N0cmluZygpKyciICBjbGFzcz0iZm9vdG5vdGUtaXRlbSI+J30sdUEuZm9vdG5vdGVfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC9saT5cbiJ9LHVBLmZvb3Rub3RlX2FuY2hvcj1mdW5jdGlvbihzLG8pe3ZhciBpPSJmbnJlZiIrTnVtYmVyKHNbb10uaWQrMSkudG9TdHJpbmcoKTtyZXR1cm4gc1tvXS5zdWJJZD4wJiYoaSs9IjoiK3Nbb10uc3ViSWQpLCcgPGEgaHJlZj0iIycraSsnIiBjbGFzcz0iZm9vdG5vdGUtYmFja3JlZiI+4oapPC9hPid9LHVBLmRsX29wZW49ZnVuY3Rpb24oKXtyZXR1cm4iPGRsPlxuIn0sdUEuZHRfb3Blbj1mdW5jdGlvbigpe3JldHVybiI8ZHQ+In0sdUEuZGRfb3Blbj1mdW5jdGlvbigpe3JldHVybiI8ZGQ+In0sdUEuZGxfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC9kbD5cbiJ9LHVBLmR0X2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvZHQ+XG4ifSx1QS5kZF9jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L2RkPlxuIn07dmFyIHBBPXVBLmdldEJyZWFrPWZ1bmN0aW9uIGdldEJyZWFrKHMsbyl7cmV0dXJuKG89bmV4dFRva2VuKHMsbykpPHMubGVuZ3RoJiYibGlzdF9pdGVtX2Nsb3NlIj09PXNbb10udHlwZT8iIjoiXG4ifTtmdW5jdGlvbiBSZW5kZXJlcigpe3RoaXMucnVsZXM9aW5kZXhfYnJvd3Nlcl9hc3NpZ24oe30sdUEpLHRoaXMuZ2V0QnJlYWs9dUEuZ2V0QnJlYWt9ZnVuY3Rpb24gUnVsZXIoKXt0aGlzLl9fcnVsZXNfXz1bXSx0aGlzLl9fY2FjaGVfXz1udWxsfWZ1bmN0aW9uIFN0YXRlSW5saW5lKHMsbyxpLGEsdSl7dGhpcy5zcmM9cyx0aGlzLmVudj1hLHRoaXMub3B0aW9ucz1pLHRoaXMucGFyc2VyPW8sdGhpcy50b2tlbnM9dSx0aGlzLnBvcz0wLHRoaXMucG9zTWF4PXRoaXMuc3JjLmxlbmd0aCx0aGlzLmxldmVsPTAsdGhpcy5wZW5kaW5nPSIiLHRoaXMucGVuZGluZ0xldmVsPTAsdGhpcy5jYWNoZT1bXSx0aGlzLmlzSW5MYWJlbD0hMSx0aGlzLmxpbmtMZXZlbD0wLHRoaXMubGlua0NvbnRlbnQ9IiIsdGhpcy5sYWJlbFVubWF0Y2hlZFNjb3Blcz0wfWZ1bmN0aW9uIHBhcnNlTGlua0xhYmVsKHMsbyl7dmFyIGksYSx1LF89LTEsdz1zLnBvc01heCx4PXMucG9zLEM9cy5pc0luTGFiZWw7aWYocy5pc0luTGFiZWwpcmV0dXJuLTE7aWYocy5sYWJlbFVubWF0Y2hlZFNjb3BlcylyZXR1cm4gcy5sYWJlbFVubWF0Y2hlZFNjb3Blcy0tLC0xO2ZvcihzLnBvcz1vKzEscy5pc0luTGFiZWw9ITAsaT0xO3MucG9zPHc7KXtpZig5MT09PSh1PXMuc3JjLmNoYXJDb2RlQXQocy5wb3MpKSlpKys7ZWxzZSBpZig5Mz09PXUmJjA9PT0tLWkpe2E9ITA7YnJlYWt9cy5wYXJzZXIuc2tpcFRva2VuKHMpfXJldHVybiBhPyhfPXMucG9zLHMubGFiZWxVbm1hdGNoZWRTY29wZXM9MCk6cy5sYWJlbFVubWF0Y2hlZFNjb3Blcz1pLTEscy5wb3M9eCxzLmlzSW5MYWJlbD1DLF99ZnVuY3Rpb24gcGFyc2VBYmJyKHMsbyxpLGEpe3ZhciB1LF8sdyx4LEMsajtpZig0MiE9PXMuY2hhckNvZGVBdCgwKSlyZXR1cm4tMTtpZig5MSE9PXMuY2hhckNvZGVBdCgxKSlyZXR1cm4tMTtpZigtMT09PXMuaW5kZXhPZigiXToiKSlyZXR1cm4tMTtpZigoXz1wYXJzZUxpbmtMYWJlbCh1PW5ldyBTdGF0ZUlubGluZShzLG8saSxhLFtdKSwxKSk8MHx8NTghPT1zLmNoYXJDb2RlQXQoXysxKSlyZXR1cm4tMTtmb3IoeD11LnBvc01heCx3PV8rMjt3PHgmJjEwIT09dS5zcmMuY2hhckNvZGVBdCh3KTt3KyspO3JldHVybiBDPXMuc2xpY2UoMixfKSwwPT09KGo9cy5zbGljZShfKzIsdykudHJpbSgpKS5sZW5ndGg/LTE6KGEuYWJicmV2aWF0aW9uc3x8KGEuYWJicmV2aWF0aW9ucz17fSksdm9pZCAwPT09YS5hYmJyZXZpYXRpb25zWyI6IitDXSYmKGEuYWJicmV2aWF0aW9uc1siOiIrQ109aiksdyl9ZnVuY3Rpb24gbm9ybWFsaXplTGluayhzKXt2YXIgbz1yZXBsYWNlRW50aXRpZXMocyk7dHJ5e289ZGVjb2RlVVJJKG8pfWNhdGNoKHMpe31yZXR1cm4gZW5jb2RlVVJJKG8pfWZ1bmN0aW9uIHBhcnNlTGlua0Rlc3RpbmF0aW9uKHMsbyl7dmFyIGksYSx1LF89byx3PXMucG9zTWF4O2lmKDYwPT09cy5zcmMuY2hhckNvZGVBdChvKSl7Zm9yKG8rKztvPHc7KXtpZigxMD09PShpPXMuc3JjLmNoYXJDb2RlQXQobykpKXJldHVybiExO2lmKDYyPT09aSlyZXR1cm4gdT1ub3JtYWxpemVMaW5rKHVuZXNjYXBlTWQocy5zcmMuc2xpY2UoXysxLG8pKSksISFzLnBhcnNlci52YWxpZGF0ZUxpbmsodSkmJihzLnBvcz1vKzEscy5saW5rQ29udGVudD11LCEwKTs5Mj09PWkmJm8rMTx3P28rPTI6bysrfXJldHVybiExfWZvcihhPTA7bzx3JiYzMiE9PShpPXMuc3JjLmNoYXJDb2RlQXQobykpJiYhKGk8MzJ8fDEyNz09PWkpOylpZig5Mj09PWkmJm8rMTx3KW8rPTI7ZWxzZXtpZig0MD09PWkmJisrYT4xKWJyZWFrO2lmKDQxPT09aSYmLS1hPDApYnJlYWs7bysrfXJldHVybiBfIT09byYmKHU9dW5lc2NhcGVNZChzLnNyYy5zbGljZShfLG8pKSwhIXMucGFyc2VyLnZhbGlkYXRlTGluayh1KSYmKHMubGlua0NvbnRlbnQ9dSxzLnBvcz1vLCEwKSl9ZnVuY3Rpb24gcGFyc2VMaW5rVGl0bGUocyxvKXt2YXIgaSxhPW8sdT1zLnBvc01heCxfPXMuc3JjLmNoYXJDb2RlQXQobyk7aWYoMzQhPT1fJiYzOSE9PV8mJjQwIT09XylyZXR1cm4hMTtmb3IobysrLDQwPT09XyYmKF89NDEpO288dTspe2lmKChpPXMuc3JjLmNoYXJDb2RlQXQobykpPT09XylyZXR1cm4gcy5wb3M9bysxLHMubGlua0NvbnRlbnQ9dW5lc2NhcGVNZChzLnNyYy5zbGljZShhKzEsbykpLCEwOzkyPT09aSYmbysxPHU/bys9MjpvKyt9cmV0dXJuITF9ZnVuY3Rpb24gbm9ybWFsaXplUmVmZXJlbmNlKHMpe3JldHVybiBzLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpLnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gcGFyc2VSZWZlcmVuY2UocyxvLGksYSl7dmFyIHUsXyx3LHgsQyxqLEwsQiwkO2lmKDkxIT09cy5jaGFyQ29kZUF0KDApKXJldHVybi0xO2lmKC0xPT09cy5pbmRleE9mKCJdOiIpKXJldHVybi0xO2lmKChfPXBhcnNlTGlua0xhYmVsKHU9bmV3IFN0YXRlSW5saW5lKHMsbyxpLGEsW10pLDApKTwwfHw1OCE9PXMuY2hhckNvZGVBdChfKzEpKXJldHVybi0xO2Zvcih4PXUucG9zTWF4LHc9XysyO3c8eCYmKDMyPT09KEM9dS5zcmMuY2hhckNvZGVBdCh3KSl8fDEwPT09Qyk7dysrKTtpZighcGFyc2VMaW5rRGVzdGluYXRpb24odSx3KSlyZXR1cm4tMTtmb3IoTD11LmxpbmtDb250ZW50LGo9dz11LnBvcyx3Kz0xO3c8eCYmKDMyPT09KEM9dS5zcmMuY2hhckNvZGVBdCh3KSl8fDEwPT09Qyk7dysrKTtmb3Iodzx4JiZqIT09dyYmcGFyc2VMaW5rVGl0bGUodSx3KT8oQj11LmxpbmtDb250ZW50LHc9dS5wb3MpOihCPSIiLHc9aik7dzx4JiYzMj09PXUuc3JjLmNoYXJDb2RlQXQodyk7KXcrKztyZXR1cm4gdzx4JiYxMCE9PXUuc3JjLmNoYXJDb2RlQXQodyk/LTE6KCQ9bm9ybWFsaXplUmVmZXJlbmNlKHMuc2xpY2UoMSxfKSksdm9pZCAwPT09YS5yZWZlcmVuY2VzWyRdJiYoYS5yZWZlcmVuY2VzWyRdPXt0aXRsZTpCLGhyZWY6TH0pLHcpfVJlbmRlcmVyLnByb3RvdHlwZS5yZW5kZXJJbmxpbmU9ZnVuY3Rpb24ocyxvLGkpe2Zvcih2YXIgYT10aGlzLnJ1bGVzLHU9cy5sZW5ndGgsXz0wLHc9IiI7dS0tOyl3Kz1hW3NbX10udHlwZV0ocyxfKyssbyxpLHRoaXMpO3JldHVybiB3fSxSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKHMsbyxpKXtmb3IodmFyIGE9dGhpcy5ydWxlcyx1PXMubGVuZ3RoLF89LTEsdz0iIjsrK188dTspImlubGluZSI9PT1zW19dLnR5cGU/dys9dGhpcy5yZW5kZXJJbmxpbmUoc1tfXS5jaGlsZHJlbixvLGkpOncrPWFbc1tfXS50eXBlXShzLF8sbyxpLHRoaXMpO3JldHVybiB3fSxSdWxlci5wcm90b3R5cGUuX19maW5kX189ZnVuY3Rpb24ocyl7Zm9yKHZhciBvPXRoaXMuX19ydWxlc19fLmxlbmd0aCxpPS0xO28tLTspaWYodGhpcy5fX3J1bGVzX19bKytpXS5uYW1lPT09cylyZXR1cm4gaTtyZXR1cm4tMX0sUnVsZXIucHJvdG90eXBlLl9fY29tcGlsZV9fPWZ1bmN0aW9uKCl7dmFyIHM9dGhpcyxvPVsiIl07cy5fX3J1bGVzX18uZm9yRWFjaCgoZnVuY3Rpb24ocyl7cy5lbmFibGVkJiZzLmFsdC5mb3JFYWNoKChmdW5jdGlvbihzKXtvLmluZGV4T2Yocyk8MCYmby5wdXNoKHMpfSkpfSkpLHMuX19jYWNoZV9fPXt9LG8uZm9yRWFjaCgoZnVuY3Rpb24obyl7cy5fX2NhY2hlX19bb109W10scy5fX3J1bGVzX18uZm9yRWFjaCgoZnVuY3Rpb24oaSl7aS5lbmFibGVkJiYobyYmaS5hbHQuaW5kZXhPZihvKTwwfHxzLl9fY2FjaGVfX1tvXS5wdXNoKGkuZm4pKX0pKX0pKX0sUnVsZXIucHJvdG90eXBlLmF0PWZ1bmN0aW9uKHMsbyxpKXt2YXIgYT10aGlzLl9fZmluZF9fKHMpLHU9aXx8e307aWYoLTE9PT1hKXRocm93IG5ldyBFcnJvcigiUGFyc2VyIHJ1bGUgbm90IGZvdW5kOiAiK3MpO3RoaXMuX19ydWxlc19fW2FdLmZuPW8sdGhpcy5fX3J1bGVzX19bYV0uYWx0PXUuYWx0fHxbXSx0aGlzLl9fY2FjaGVfXz1udWxsfSxSdWxlci5wcm90b3R5cGUuYmVmb3JlPWZ1bmN0aW9uKHMsbyxpLGEpe3ZhciB1PXRoaXMuX19maW5kX18ocyksXz1hfHx7fTtpZigtMT09PXUpdGhyb3cgbmV3IEVycm9yKCJQYXJzZXIgcnVsZSBub3QgZm91bmQ6ICIrcyk7dGhpcy5fX3J1bGVzX18uc3BsaWNlKHUsMCx7bmFtZTpvLGVuYWJsZWQ6ITAsZm46aSxhbHQ6Xy5hbHR8fFtdfSksdGhpcy5fX2NhY2hlX189bnVsbH0sUnVsZXIucHJvdG90eXBlLmFmdGVyPWZ1bmN0aW9uKHMsbyxpLGEpe3ZhciB1PXRoaXMuX19maW5kX18ocyksXz1hfHx7fTtpZigtMT09PXUpdGhyb3cgbmV3IEVycm9yKCJQYXJzZXIgcnVsZSBub3QgZm91bmQ6ICIrcyk7dGhpcy5fX3J1bGVzX18uc3BsaWNlKHUrMSwwLHtuYW1lOm8sZW5hYmxlZDohMCxmbjppLGFsdDpfLmFsdHx8W119KSx0aGlzLl9fY2FjaGVfXz1udWxsfSxSdWxlci5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihzLG8saSl7dmFyIGE9aXx8e307dGhpcy5fX3J1bGVzX18ucHVzaCh7bmFtZTpzLGVuYWJsZWQ6ITAsZm46byxhbHQ6YS5hbHR8fFtdfSksdGhpcy5fX2NhY2hlX189bnVsbH0sUnVsZXIucHJvdG90eXBlLmVuYWJsZT1mdW5jdGlvbihzLG8pe3M9QXJyYXkuaXNBcnJheShzKT9zOltzXSxvJiZ0aGlzLl9fcnVsZXNfXy5mb3JFYWNoKChmdW5jdGlvbihzKXtzLmVuYWJsZWQ9ITF9KSkscy5mb3JFYWNoKChmdW5jdGlvbihzKXt2YXIgbz10aGlzLl9fZmluZF9fKHMpO2lmKG88MCl0aHJvdyBuZXcgRXJyb3IoIlJ1bGVzIG1hbmFnZXI6IGludmFsaWQgcnVsZSBuYW1lICIrcyk7dGhpcy5fX3J1bGVzX19bb10uZW5hYmxlZD0hMH0pLHRoaXMpLHRoaXMuX19jYWNoZV9fPW51bGx9LFJ1bGVyLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKHMpeyhzPUFycmF5LmlzQXJyYXkocyk/czpbc10pLmZvckVhY2goKGZ1bmN0aW9uKHMpe3ZhciBvPXRoaXMuX19maW5kX18ocyk7aWYobzwwKXRocm93IG5ldyBFcnJvcigiUnVsZXMgbWFuYWdlcjogaW52YWxpZCBydWxlIG5hbWUgIitzKTt0aGlzLl9fcnVsZXNfX1tvXS5lbmFibGVkPSExfSksdGhpcyksdGhpcy5fX2NhY2hlX189bnVsbH0sUnVsZXIucHJvdG90eXBlLmdldFJ1bGVzPWZ1bmN0aW9uKHMpe3JldHVybiBudWxsPT09dGhpcy5fX2NhY2hlX18mJnRoaXMuX19jb21waWxlX18oKSx0aGlzLl9fY2FjaGVfX1tzXXx8W119LFN0YXRlSW5saW5lLnByb3RvdHlwZS5wdXNoUGVuZGluZz1mdW5jdGlvbigpe3RoaXMudG9rZW5zLnB1c2goe3R5cGU6InRleHQiLGNvbnRlbnQ6dGhpcy5wZW5kaW5nLGxldmVsOnRoaXMucGVuZGluZ0xldmVsfSksdGhpcy5wZW5kaW5nPSIifSxTdGF0ZUlubGluZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihzKXt0aGlzLnBlbmRpbmcmJnRoaXMucHVzaFBlbmRpbmcoKSx0aGlzLnRva2Vucy5wdXNoKHMpLHRoaXMucGVuZGluZ0xldmVsPXRoaXMubGV2ZWx9LFN0YXRlSW5saW5lLnByb3RvdHlwZS5jYWNoZVNldD1mdW5jdGlvbihzLG8pe2Zvcih2YXIgaT10aGlzLmNhY2hlLmxlbmd0aDtpPD1zO2krKyl0aGlzLmNhY2hlLnB1c2goMCk7dGhpcy5jYWNoZVtzXT1vfSxTdGF0ZUlubGluZS5wcm90b3R5cGUuY2FjaGVHZXQ9ZnVuY3Rpb24ocyl7cmV0dXJuIHM8dGhpcy5jYWNoZS5sZW5ndGg/dGhpcy5jYWNoZVtzXTowfTt2YXIgaEE9IiBcbigpW10nXCIuLCE/LSI7ZnVuY3Rpb24gcmVnRXNjYXBlKHMpe3JldHVybiBzLnJlcGxhY2UoLyhbLSgpXFtcXXt9Kz8qLiRcXnwsOiM8IVxcXSkvZywiXFwkMSIpfXZhciBkQT0vXCstfFwuXC58XD9cP1w/XD98ISEhIXwsLHwtLS8sZkE9L1woKGN8dG18cnxwKVwpL2dpLG1BPXtjOiLCqSIscjoiwq4iLHA6IsKnIix0bToi4oSiIn07ZnVuY3Rpb24gcmVwbGFjZVNjb3BlZEFiYnIocyl7cmV0dXJuIHMuaW5kZXhPZigiKCIpPDA/czpzLnJlcGxhY2UoZkEsKGZ1bmN0aW9uKHMsbyl7cmV0dXJuIG1BW28udG9Mb3dlckNhc2UoKV19KSl9dmFyIGdBPS9bJyJdLyx5QT0vWyciXS9nLHZBPS9bLVxzKClcW1xdXS87ZnVuY3Rpb24gaXNMZXR0ZXIocyxvKXtyZXR1cm4hKG88MHx8bz49cy5sZW5ndGgpJiYhdkEudGVzdChzW29dKX1mdW5jdGlvbiByZXBsYWNlQXQocyxvLGkpe3JldHVybiBzLnN1YnN0cigwLG8pK2krcy5zdWJzdHIobysxKX12YXIgYkE9W1siYmxvY2siLGZ1bmN0aW9uIGJsb2NrKHMpe3MuaW5saW5lTW9kZT9zLnRva2Vucy5wdXNoKHt0eXBlOiJpbmxpbmUiLGNvbnRlbnQ6cy5zcmMucmVwbGFjZSgvXG4vZywiICIpLnRyaW0oKSxsZXZlbDowLGxpbmVzOlswLDFdLGNoaWxkcmVuOltdfSk6cy5ibG9jay5wYXJzZShzLnNyYyxzLm9wdGlvbnMscy5lbnYscy50b2tlbnMpfV0sWyJhYmJyIixmdW5jdGlvbiBhYmJyKHMpe3ZhciBvLGksYSx1LF89cy50b2tlbnM7aWYoIXMuaW5saW5lTW9kZSlmb3Iobz0xLGk9Xy5sZW5ndGgtMTtvPGk7bysrKWlmKCJwYXJhZ3JhcGhfb3BlbiI9PT1fW28tMV0udHlwZSYmImlubGluZSI9PT1fW29dLnR5cGUmJiJwYXJhZ3JhcGhfY2xvc2UiPT09X1tvKzFdLnR5cGUpe2ZvcihhPV9bb10uY29udGVudDthLmxlbmd0aCYmISgodT1wYXJzZUFiYnIoYSxzLmlubGluZSxzLm9wdGlvbnMscy5lbnYpKTwwKTspYT1hLnNsaWNlKHUpLnRyaW0oKTtfW29dLmNvbnRlbnQ9YSxhLmxlbmd0aHx8KF9bby0xXS50aWdodD0hMCxfW28rMV0udGlnaHQ9ITApfX1dLFsicmVmZXJlbmNlcyIsZnVuY3Rpb24gcmVmZXJlbmNlcyhzKXt2YXIgbyxpLGEsdSxfPXMudG9rZW5zO2lmKHMuZW52LnJlZmVyZW5jZXM9cy5lbnYucmVmZXJlbmNlc3x8e30sIXMuaW5saW5lTW9kZSlmb3Iobz0xLGk9Xy5sZW5ndGgtMTtvPGk7bysrKWlmKCJpbmxpbmUiPT09X1tvXS50eXBlJiYicGFyYWdyYXBoX29wZW4iPT09X1tvLTFdLnR5cGUmJiJwYXJhZ3JhcGhfY2xvc2UiPT09X1tvKzFdLnR5cGUpe2ZvcihhPV9bb10uY29udGVudDthLmxlbmd0aCYmISgodT1wYXJzZVJlZmVyZW5jZShhLHMuaW5saW5lLHMub3B0aW9ucyxzLmVudikpPDApOylhPWEuc2xpY2UodSkudHJpbSgpO19bb10uY29udGVudD1hLGEubGVuZ3RofHwoX1tvLTFdLnRpZ2h0PSEwLF9bbysxXS50aWdodD0hMCl9fV0sWyJpbmxpbmUiLGZ1bmN0aW9uIGlubGluZShzKXt2YXIgbyxpLGEsdT1zLnRva2Vucztmb3IoaT0wLGE9dS5sZW5ndGg7aTxhO2krKykiaW5saW5lIj09PShvPXVbaV0pLnR5cGUmJnMuaW5saW5lLnBhcnNlKG8uY29udGVudCxzLm9wdGlvbnMscy5lbnYsby5jaGlsZHJlbil9XSxbImZvb3Rub3RlX3RhaWwiLGZ1bmN0aW9uIGZvb3Rub3RlX2Jsb2NrKHMpe3ZhciBvLGksYSx1LF8sdyx4LEMsaixMPTAsQj0hMSwkPXt9O2lmKHMuZW52LmZvb3Rub3RlcyYmKHMudG9rZW5zPXMudG9rZW5zLmZpbHRlcigoZnVuY3Rpb24ocyl7cmV0dXJuImZvb3Rub3RlX3JlZmVyZW5jZV9vcGVuIj09PXMudHlwZT8oQj0hMCxDPVtdLGo9cy5sYWJlbCwhMSk6ImZvb3Rub3RlX3JlZmVyZW5jZV9jbG9zZSI9PT1zLnR5cGU/KEI9ITEsJFsiOiIral09QywhMSk6KEImJkMucHVzaChzKSwhQil9KSkscy5lbnYuZm9vdG5vdGVzLmxpc3QpKXtmb3Iodz1zLmVudi5mb290bm90ZXMubGlzdCxzLnRva2Vucy5wdXNoKHt0eXBlOiJmb290bm90ZV9ibG9ja19vcGVuIixsZXZlbDpMKyt9KSxvPTAsaT13Lmxlbmd0aDtvPGk7bysrKXtmb3Iocy50b2tlbnMucHVzaCh7dHlwZToiZm9vdG5vdGVfb3BlbiIsaWQ6byxsZXZlbDpMKyt9KSx3W29dLnRva2Vucz8oKHg9W10pLnB1c2goe3R5cGU6InBhcmFncmFwaF9vcGVuIix0aWdodDohMSxsZXZlbDpMKyt9KSx4LnB1c2goe3R5cGU6ImlubGluZSIsY29udGVudDoiIixsZXZlbDpMLGNoaWxkcmVuOndbb10udG9rZW5zfSkseC5wdXNoKHt0eXBlOiJwYXJhZ3JhcGhfY2xvc2UiLHRpZ2h0OiExLGxldmVsOi0tTH0pKTp3W29dLmxhYmVsJiYoeD0kWyI6Iit3W29dLmxhYmVsXSkscy50b2tlbnM9cy50b2tlbnMuY29uY2F0KHgpLF89InBhcmFncmFwaF9jbG9zZSI9PT1zLnRva2Vuc1tzLnRva2Vucy5sZW5ndGgtMV0udHlwZT9zLnRva2Vucy5wb3AoKTpudWxsLHU9d1tvXS5jb3VudD4wP3dbb10uY291bnQ6MSxhPTA7YTx1O2ErKylzLnRva2Vucy5wdXNoKHt0eXBlOiJmb290bm90ZV9hbmNob3IiLGlkOm8sc3ViSWQ6YSxsZXZlbDpMfSk7XyYmcy50b2tlbnMucHVzaChfKSxzLnRva2Vucy5wdXNoKHt0eXBlOiJmb290bm90ZV9jbG9zZSIsbGV2ZWw6LS1MfSl9cy50b2tlbnMucHVzaCh7dHlwZToiZm9vdG5vdGVfYmxvY2tfY2xvc2UiLGxldmVsOi0tTH0pfX1dLFsiYWJicjIiLGZ1bmN0aW9uIGFiYnIyKHMpe3ZhciBvLGksYSx1LF8sdyx4LEMsaixMLEIsJCxVPXMudG9rZW5zO2lmKHMuZW52LmFiYnJldmlhdGlvbnMpZm9yKHMuZW52LmFiYnJSZWdFeHB8fCgkPSIoXnxbIitoQS5zcGxpdCgiIikubWFwKHJlZ0VzY2FwZSkuam9pbigiIikrIl0pKCIrT2JqZWN0LmtleXMocy5lbnYuYWJicmV2aWF0aW9ucykubWFwKChmdW5jdGlvbihzKXtyZXR1cm4gcy5zdWJzdHIoMSl9KSkuc29ydCgoZnVuY3Rpb24ocyxvKXtyZXR1cm4gby5sZW5ndGgtcy5sZW5ndGh9KSkubWFwKHJlZ0VzY2FwZSkuam9pbigifCIpKyIpKCR8WyIraEEuc3BsaXQoIiIpLm1hcChyZWdFc2NhcGUpLmpvaW4oIiIpKyJdKSIscy5lbnYuYWJiclJlZ0V4cD1uZXcgUmVnRXhwKCQsImciKSksTD1zLmVudi5hYmJyUmVnRXhwLGk9MCxhPVUubGVuZ3RoO2k8YTtpKyspaWYoImlubGluZSI9PT1VW2ldLnR5cGUpZm9yKG89KHU9VVtpXS5jaGlsZHJlbikubGVuZ3RoLTE7bz49MDtvLS0paWYoInRleHQiPT09KF89dVtvXSkudHlwZSl7Zm9yKEM9MCx3PV8uY29udGVudCxMLmxhc3RJbmRleD0wLGo9Xy5sZXZlbCx4PVtdO0I9TC5leGVjKHcpOylMLmxhc3RJbmRleD5DJiZ4LnB1c2goe3R5cGU6InRleHQiLGNvbnRlbnQ6dy5zbGljZShDLEIuaW5kZXgrQlsxXS5sZW5ndGgpLGxldmVsOmp9KSx4LnB1c2goe3R5cGU6ImFiYnJfb3BlbiIsdGl0bGU6cy5lbnYuYWJicmV2aWF0aW9uc1siOiIrQlsyXV0sbGV2ZWw6aisrfSkseC5wdXNoKHt0eXBlOiJ0ZXh0Iixjb250ZW50OkJbMl0sbGV2ZWw6an0pLHgucHVzaCh7dHlwZToiYWJicl9jbG9zZSIsbGV2ZWw6LS1qfSksQz1MLmxhc3RJbmRleC1CWzNdLmxlbmd0aDt4Lmxlbmd0aCYmKEM8dy5sZW5ndGgmJngucHVzaCh7dHlwZToidGV4dCIsY29udGVudDp3LnNsaWNlKEMpLGxldmVsOmp9KSxVW2ldLmNoaWxkcmVuPXU9W10uY29uY2F0KHUuc2xpY2UoMCxvKSx4LHUuc2xpY2UobysxKSkpfX1dLFsicmVwbGFjZW1lbnRzIixmdW5jdGlvbiBpbmRleF9icm93c2VyX3JlcGxhY2Uocyl7dmFyIG8saSxhLHUsXztpZihzLm9wdGlvbnMudHlwb2dyYXBoZXIpZm9yKF89cy50b2tlbnMubGVuZ3RoLTE7Xz49MDtfLS0paWYoImlubGluZSI9PT1zLnRva2Vuc1tfXS50eXBlKWZvcihvPSh1PXMudG9rZW5zW19dLmNoaWxkcmVuKS5sZW5ndGgtMTtvPj0wO28tLSkidGV4dCI9PT0oaT11W29dKS50eXBlJiYoYT1yZXBsYWNlU2NvcGVkQWJicihhPWkuY29udGVudCksZEEudGVzdChhKSYmKGE9YS5yZXBsYWNlKC9cKy0vZywiwrEiKS5yZXBsYWNlKC9cLnsyLH0vZywi4oCmIikucmVwbGFjZSgvKFs/IV0p4oCmL2csIiQxLi4iKS5yZXBsYWNlKC8oWz8hXSl7NCx9L2csIiQxJDEkMSIpLnJlcGxhY2UoLyx7Mix9L2csIiwiKS5yZXBsYWNlKC8oXnxbXi1dKS0tLShbXi1dfCQpL2dtLCIkMeKAlCQyIikucmVwbGFjZSgvKF58XHMpLS0oXHN8JCkvZ20sIiQx4oCTJDIiKS5yZXBsYWNlKC8oXnxbXi1cc10pLS0oW14tXHNdfCQpL2dtLCIkMeKAkyQyIikpLGkuY29udGVudD1hKX1dLFsic21hcnRxdW90ZXMiLGZ1bmN0aW9uIHNtYXJ0cXVvdGVzKHMpe3ZhciBvLGksYSx1LF8sdyx4LEMsaixMLEIsJCxVLFYseixZLFo7aWYocy5vcHRpb25zLnR5cG9ncmFwaGVyKWZvcihaPVtdLHo9cy50b2tlbnMubGVuZ3RoLTE7ej49MDt6LS0paWYoImlubGluZSI9PT1zLnRva2Vuc1t6XS50eXBlKWZvcihZPXMudG9rZW5zW3pdLmNoaWxkcmVuLFoubGVuZ3RoPTAsbz0wO288WS5sZW5ndGg7bysrKWlmKCJ0ZXh0Ij09PShpPVlbb10pLnR5cGUmJiFnQS50ZXN0KGkudGV4dCkpe2Zvcih4PVlbb10ubGV2ZWwsVT1aLmxlbmd0aC0xO1U+PTAmJiEoWltVXS5sZXZlbDw9eCk7VS0tKTtaLmxlbmd0aD1VKzEsXz0wLHc9KGE9aS5jb250ZW50KS5sZW5ndGg7ZTpmb3IoO188dyYmKHlBLmxhc3RJbmRleD1fLHU9eUEuZXhlYyhhKSk7KWlmKEM9IWlzTGV0dGVyKGEsdS5pbmRleC0xKSxfPXUuaW5kZXgrMSxWPSInIj09PXVbMF0sKGo9IWlzTGV0dGVyKGEsXykpfHxDKXtpZihCPSFqLCQ9IUMpZm9yKFU9Wi5sZW5ndGgtMTtVPj0wJiYoTD1aW1VdLCEoWltVXS5sZXZlbDx4KSk7VS0tKWlmKEwuc2luZ2xlPT09ViYmWltVXS5sZXZlbD09PXgpe0w9WltVXSxWPyhZW0wudG9rZW5dLmNvbnRlbnQ9cmVwbGFjZUF0KFlbTC50b2tlbl0uY29udGVudCxMLnBvcyxzLm9wdGlvbnMucXVvdGVzWzJdKSxpLmNvbnRlbnQ9cmVwbGFjZUF0KGkuY29udGVudCx1LmluZGV4LHMub3B0aW9ucy5xdW90ZXNbM10pKTooWVtMLnRva2VuXS5jb250ZW50PXJlcGxhY2VBdChZW0wudG9rZW5dLmNvbnRlbnQsTC5wb3Mscy5vcHRpb25zLnF1b3Rlc1swXSksaS5jb250ZW50PXJlcGxhY2VBdChpLmNvbnRlbnQsdS5pbmRleCxzLm9wdGlvbnMucXVvdGVzWzFdKSksWi5sZW5ndGg9VTtjb250aW51ZSBlfUI/Wi5wdXNoKHt0b2tlbjpvLHBvczp1LmluZGV4LHNpbmdsZTpWLGxldmVsOnh9KTokJiZWJiYoaS5jb250ZW50PXJlcGxhY2VBdChpLmNvbnRlbnQsdS5pbmRleCwi4oCZIikpfWVsc2UgViYmKGkuY29udGVudD1yZXBsYWNlQXQoaS5jb250ZW50LHUuaW5kZXgsIuKAmSIpKX19XV07ZnVuY3Rpb24gQ29yZSgpe3RoaXMub3B0aW9ucz17fSx0aGlzLnJ1bGVyPW5ldyBSdWxlcjtmb3IodmFyIHM9MDtzPGJBLmxlbmd0aDtzKyspdGhpcy5ydWxlci5wdXNoKGJBW3NdWzBdLGJBW3NdWzFdKX1mdW5jdGlvbiBTdGF0ZUJsb2NrKHMsbyxpLGEsdSl7dmFyIF8sdyx4LEMsaixMLEI7Zm9yKHRoaXMuc3JjPXMsdGhpcy5wYXJzZXI9byx0aGlzLm9wdGlvbnM9aSx0aGlzLmVudj1hLHRoaXMudG9rZW5zPXUsdGhpcy5iTWFya3M9W10sdGhpcy5lTWFya3M9W10sdGhpcy50U2hpZnQ9W10sdGhpcy5ibGtJbmRlbnQ9MCx0aGlzLmxpbmU9MCx0aGlzLmxpbmVNYXg9MCx0aGlzLnRpZ2h0PSExLHRoaXMucGFyZW50VHlwZT0icm9vdCIsdGhpcy5kZEluZGVudD0tMSx0aGlzLmxldmVsPTAsdGhpcy5yZXN1bHQ9IiIsTD0wLEI9ITEseD1DPUw9MCxqPSh3PXRoaXMuc3JjKS5sZW5ndGg7QzxqO0MrKyl7aWYoXz13LmNoYXJDb2RlQXQoQyksIUIpe2lmKDMyPT09Xyl7TCsrO2NvbnRpbnVlfUI9ITB9MTAhPT1fJiZDIT09ai0xfHwoMTAhPT1fJiZDKyssdGhpcy5iTWFya3MucHVzaCh4KSx0aGlzLmVNYXJrcy5wdXNoKEMpLHRoaXMudFNoaWZ0LnB1c2goTCksQj0hMSxMPTAseD1DKzEpfXRoaXMuYk1hcmtzLnB1c2gody5sZW5ndGgpLHRoaXMuZU1hcmtzLnB1c2gody5sZW5ndGgpLHRoaXMudFNoaWZ0LnB1c2goMCksdGhpcy5saW5lTWF4PXRoaXMuYk1hcmtzLmxlbmd0aC0xfWZ1bmN0aW9uIHNraXBCdWxsZXRMaXN0TWFya2VyKHMsbyl7dmFyIGksYSx1O3JldHVybihhPXMuYk1hcmtzW29dK3MudFNoaWZ0W29dKT49KHU9cy5lTWFya3Nbb10pfHw0MiE9PShpPXMuc3JjLmNoYXJDb2RlQXQoYSsrKSkmJjQ1IT09aSYmNDMhPT1pfHxhPHUmJjMyIT09cy5zcmMuY2hhckNvZGVBdChhKT8tMTphfWZ1bmN0aW9uIHNraXBPcmRlcmVkTGlzdE1hcmtlcihzLG8pe3ZhciBpLGE9cy5iTWFya3Nbb10rcy50U2hpZnRbb10sdT1zLmVNYXJrc1tvXTtpZihhKzE+PXUpcmV0dXJuLTE7aWYoKGk9cy5zcmMuY2hhckNvZGVBdChhKyspKTw0OHx8aT41NylyZXR1cm4tMTtmb3IoOzspe2lmKGE+PXUpcmV0dXJuLTE7aWYoISgoaT1zLnNyYy5jaGFyQ29kZUF0KGErKykpPj00OCYmaTw9NTcpKXtpZig0MT09PWl8fDQ2PT09aSlicmVhaztyZXR1cm4tMX19cmV0dXJuIGE8dSYmMzIhPT1zLnNyYy5jaGFyQ29kZUF0KGEpPy0xOmF9Q29yZS5wcm90b3R5cGUucHJvY2Vzcz1mdW5jdGlvbihzKXt2YXIgbyxpLGE7Zm9yKG89MCxpPShhPXRoaXMucnVsZXIuZ2V0UnVsZXMoIiIpKS5sZW5ndGg7bzxpO28rKylhW29dKHMpfSxTdGF0ZUJsb2NrLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uIGlzRW1wdHkocyl7cmV0dXJuIHRoaXMuYk1hcmtzW3NdK3RoaXMudFNoaWZ0W3NdPj10aGlzLmVNYXJrc1tzXX0sU3RhdGVCbG9jay5wcm90b3R5cGUuc2tpcEVtcHR5TGluZXM9ZnVuY3Rpb24gc2tpcEVtcHR5TGluZXMocyl7Zm9yKHZhciBvPXRoaXMubGluZU1heDtzPG8mJiEodGhpcy5iTWFya3Nbc10rdGhpcy50U2hpZnRbc108dGhpcy5lTWFya3Nbc10pO3MrKyk7cmV0dXJuIHN9LFN0YXRlQmxvY2sucHJvdG90eXBlLnNraXBTcGFjZXM9ZnVuY3Rpb24gc2tpcFNwYWNlcyhzKXtmb3IodmFyIG89dGhpcy5zcmMubGVuZ3RoO3M8byYmMzI9PT10aGlzLnNyYy5jaGFyQ29kZUF0KHMpO3MrKyk7cmV0dXJuIHN9LFN0YXRlQmxvY2sucHJvdG90eXBlLnNraXBDaGFycz1mdW5jdGlvbiBza2lwQ2hhcnMocyxvKXtmb3IodmFyIGk9dGhpcy5zcmMubGVuZ3RoO3M8aSYmdGhpcy5zcmMuY2hhckNvZGVBdChzKT09PW87cysrKTtyZXR1cm4gc30sU3RhdGVCbG9jay5wcm90b3R5cGUuc2tpcENoYXJzQmFjaz1mdW5jdGlvbiBza2lwQ2hhcnNCYWNrKHMsbyxpKXtpZihzPD1pKXJldHVybiBzO2Zvcig7cz5pOylpZihvIT09dGhpcy5zcmMuY2hhckNvZGVBdCgtLXMpKXJldHVybiBzKzE7cmV0dXJuIHN9LFN0YXRlQmxvY2sucHJvdG90eXBlLmdldExpbmVzPWZ1bmN0aW9uIGdldExpbmVzKHMsbyxpLGEpe3ZhciB1LF8sdyx4LEMsaj1zO2lmKHM+PW8pcmV0dXJuIiI7aWYoaisxPT09bylyZXR1cm4gXz10aGlzLmJNYXJrc1tqXStNYXRoLm1pbih0aGlzLnRTaGlmdFtqXSxpKSx3PWE/dGhpcy5lTWFya3Nbal0rMTp0aGlzLmVNYXJrc1tqXSx0aGlzLnNyYy5zbGljZShfLHcpO2Zvcih4PW5ldyBBcnJheShvLXMpLHU9MDtqPG87aisrLHUrKykoQz10aGlzLnRTaGlmdFtqXSk+aSYmKEM9aSksQzwwJiYoQz0wKSxfPXRoaXMuYk1hcmtzW2pdK0Msdz1qKzE8b3x8YT90aGlzLmVNYXJrc1tqXSsxOnRoaXMuZU1hcmtzW2pdLHhbdV09dGhpcy5zcmMuc2xpY2UoXyx3KTtyZXR1cm4geC5qb2luKCIiKX07dmFyIFNBPXt9O1siYXJ0aWNsZSIsImFzaWRlIiwiYnV0dG9uIiwiYmxvY2txdW90ZSIsImJvZHkiLCJjYW52YXMiLCJjYXB0aW9uIiwiY29sIiwiY29sZ3JvdXAiLCJkZCIsImRpdiIsImRsIiwiZHQiLCJlbWJlZCIsImZpZWxkc2V0IiwiZmlnY2FwdGlvbiIsImZpZ3VyZSIsImZvb3RlciIsImZvcm0iLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJoZWFkZXIiLCJoZ3JvdXAiLCJociIsImlmcmFtZSIsImxpIiwibWFwIiwib2JqZWN0Iiwib2wiLCJvdXRwdXQiLCJwIiwicHJlIiwicHJvZ3Jlc3MiLCJzY3JpcHQiLCJzZWN0aW9uIiwic3R5bGUiLCJ0YWJsZSIsInRib2R5IiwidGQiLCJ0ZXh0YXJlYSIsInRmb290IiwidGgiLCJ0ciIsInRoZWFkIiwidWwiLCJ2aWRlbyJdLmZvckVhY2goKGZ1bmN0aW9uKHMpe1NBW3NdPSEwfSkpO3ZhciBfQT0vXjwoW2EtekEtWl17MSwxNX0pW1xzXC8+XS8sRUE9L148XC8oW2EtekEtWl17MSwxNX0pW1xzPl0vO2Z1bmN0aW9uIGluZGV4X2Jyb3dzZXJfZ2V0TGluZShzLG8pe3ZhciBpPXMuYk1hcmtzW29dK3MuYmxrSW5kZW50LGE9cy5lTWFya3Nbb107cmV0dXJuIHMuc3JjLnN1YnN0cihpLGEtaSl9ZnVuY3Rpb24gc2tpcE1hcmtlcihzLG8pe3ZhciBpLGEsdT1zLmJNYXJrc1tvXStzLnRTaGlmdFtvXSxfPXMuZU1hcmtzW29dO3JldHVybiB1Pj1ffHwxMjYhPT0oYT1zLnNyYy5jaGFyQ29kZUF0KHUrKykpJiY1OCE9PWF8fHU9PT0oaT1zLnNraXBTcGFjZXModSkpfHxpPj1fPy0xOml9dmFyIHdBPVtbImNvZGUiLGZ1bmN0aW9uIGNvZGUocyxvLGkpe3ZhciBhLHU7aWYocy50U2hpZnRbb10tcy5ibGtJbmRlbnQ8NClyZXR1cm4hMTtmb3IodT1hPW8rMTthPGk7KWlmKHMuaXNFbXB0eShhKSlhKys7ZWxzZXtpZighKHMudFNoaWZ0W2FdLXMuYmxrSW5kZW50Pj00KSlicmVhazt1PSsrYX1yZXR1cm4gcy5saW5lPWEscy50b2tlbnMucHVzaCh7dHlwZToiY29kZSIsY29udGVudDpzLmdldExpbmVzKG8sdSw0K3MuYmxrSW5kZW50LCEwKSxibG9jazohMCxsaW5lczpbbyxzLmxpbmVdLGxldmVsOnMubGV2ZWx9KSwhMH1dLFsiZmVuY2VzIixmdW5jdGlvbiBmZW5jZXMocyxvLGksYSl7dmFyIHUsXyx3LHgsQyxqPSExLEw9cy5iTWFya3Nbb10rcy50U2hpZnRbb10sQj1zLmVNYXJrc1tvXTtpZihMKzM+QilyZXR1cm4hMTtpZigxMjYhPT0odT1zLnNyYy5jaGFyQ29kZUF0KEwpKSYmOTYhPT11KXJldHVybiExO2lmKEM9TCwoXz0oTD1zLnNraXBDaGFycyhMLHUpKS1DKTwzKXJldHVybiExO2lmKCh3PXMuc3JjLnNsaWNlKEwsQikudHJpbSgpKS5pbmRleE9mKCJgIik+PTApcmV0dXJuITE7aWYoYSlyZXR1cm4hMDtmb3IoeD1vOyEoKyt4Pj1pKSYmISgoTD1DPXMuYk1hcmtzW3hdK3MudFNoaWZ0W3hdKTwoQj1zLmVNYXJrc1t4XSkmJnMudFNoaWZ0W3hdPHMuYmxrSW5kZW50KTspaWYocy5zcmMuY2hhckNvZGVBdChMKT09PXUmJiEocy50U2hpZnRbeF0tcy5ibGtJbmRlbnQ+PTR8fChMPXMuc2tpcENoYXJzKEwsdSkpLUM8X3x8KEw9cy5za2lwU3BhY2VzKEwpKTxCKSl7aj0hMDticmVha31yZXR1cm4gXz1zLnRTaGlmdFtvXSxzLmxpbmU9eCsoaj8xOjApLHMudG9rZW5zLnB1c2goe3R5cGU6ImZlbmNlIixwYXJhbXM6dyxjb250ZW50OnMuZ2V0TGluZXMobysxLHgsXywhMCksbGluZXM6W28scy5saW5lXSxsZXZlbDpzLmxldmVsfSksITB9LFsicGFyYWdyYXBoIiwiYmxvY2txdW90ZSIsImxpc3QiXV0sWyJibG9ja3F1b3RlIixmdW5jdGlvbiBibG9ja3F1b3RlKHMsbyxpLGEpe3ZhciB1LF8sdyx4LEMsaixMLEIsJCxVLFYsej1zLmJNYXJrc1tvXStzLnRTaGlmdFtvXSxZPXMuZU1hcmtzW29dO2lmKHo+WSlyZXR1cm4hMTtpZig2MiE9PXMuc3JjLmNoYXJDb2RlQXQoeisrKSlyZXR1cm4hMTtpZihzLmxldmVsPj1zLm9wdGlvbnMubWF4TmVzdGluZylyZXR1cm4hMTtpZihhKXJldHVybiEwO2ZvcigzMj09PXMuc3JjLmNoYXJDb2RlQXQoeikmJnorKyxDPXMuYmxrSW5kZW50LHMuYmxrSW5kZW50PTAseD1bcy5iTWFya3Nbb11dLHMuYk1hcmtzW29dPXosXz0oej16PFk/cy5za2lwU3BhY2VzKHopOnopPj1ZLHc9W3MudFNoaWZ0W29dXSxzLnRTaGlmdFtvXT16LXMuYk1hcmtzW29dLEI9cy5wYXJzZXIucnVsZXIuZ2V0UnVsZXMoImJsb2NrcXVvdGUiKSx1PW8rMTt1PGkmJiEoKHo9cy5iTWFya3NbdV0rcy50U2hpZnRbdV0pPj0oWT1zLmVNYXJrc1t1XSkpO3UrKylpZig2MiE9PXMuc3JjLmNoYXJDb2RlQXQoeisrKSl7aWYoXylicmVhaztmb3IoVj0hMSwkPTAsVT1CLmxlbmd0aDskPFU7JCsrKWlmKEJbJF0ocyx1LGksITApKXtWPSEwO2JyZWFrfWlmKFYpYnJlYWs7eC5wdXNoKHMuYk1hcmtzW3VdKSx3LnB1c2gocy50U2hpZnRbdV0pLHMudFNoaWZ0W3VdPS0xMzM3fWVsc2UgMzI9PT1zLnNyYy5jaGFyQ29kZUF0KHopJiZ6KysseC5wdXNoKHMuYk1hcmtzW3VdKSxzLmJNYXJrc1t1XT16LF89KHo9ejxZP3Muc2tpcFNwYWNlcyh6KTp6KT49WSx3LnB1c2gocy50U2hpZnRbdV0pLHMudFNoaWZ0W3VdPXotcy5iTWFya3NbdV07Zm9yKGo9cy5wYXJlbnRUeXBlLHMucGFyZW50VHlwZT0iYmxvY2txdW90ZSIscy50b2tlbnMucHVzaCh7dHlwZToiYmxvY2txdW90ZV9vcGVuIixsaW5lczpMPVtvLDBdLGxldmVsOnMubGV2ZWwrK30pLHMucGFyc2VyLnRva2VuaXplKHMsbyx1KSxzLnRva2Vucy5wdXNoKHt0eXBlOiJibG9ja3F1b3RlX2Nsb3NlIixsZXZlbDotLXMubGV2ZWx9KSxzLnBhcmVudFR5cGU9aixMWzFdPXMubGluZSwkPTA7JDx3Lmxlbmd0aDskKyspcy5iTWFya3NbJCtvXT14WyRdLHMudFNoaWZ0WyQrb109d1skXTtyZXR1cm4gcy5ibGtJbmRlbnQ9QywhMH0sWyJwYXJhZ3JhcGgiLCJibG9ja3F1b3RlIiwibGlzdCJdXSxbImhyIixmdW5jdGlvbiBocihzLG8saSxhKXt2YXIgdSxfLHcseD1zLmJNYXJrc1tvXSxDPXMuZU1hcmtzW29dO2lmKCh4Kz1zLnRTaGlmdFtvXSk+QylyZXR1cm4hMTtpZig0MiE9PSh1PXMuc3JjLmNoYXJDb2RlQXQoeCsrKSkmJjQ1IT09dSYmOTUhPT11KXJldHVybiExO2ZvcihfPTE7eDxDOyl7aWYoKHc9cy5zcmMuY2hhckNvZGVBdCh4KyspKSE9PXUmJjMyIT09dylyZXR1cm4hMTt3PT09dSYmXysrfXJldHVybiEoXzwzKSYmKGF8fChzLmxpbmU9bysxLHMudG9rZW5zLnB1c2goe3R5cGU6ImhyIixsaW5lczpbbyxzLmxpbmVdLGxldmVsOnMubGV2ZWx9KSksITApfSxbInBhcmFncmFwaCIsImJsb2NrcXVvdGUiLCJsaXN0Il1dLFsibGlzdCIsZnVuY3Rpb24gaW5kZXhfYnJvd3Nlcl9saXN0KHMsbyxpLGEpe3ZhciB1LF8sdyx4LEMsaixMLEIsJCxVLFYseixZLFosZWUsaWUsYWUsY2UsbGUscGUsZGUsZmU9ITA7aWYoKEI9c2tpcE9yZGVyZWRMaXN0TWFya2VyKHMsbykpPj0wKXo9ITA7ZWxzZXtpZighKChCPXNraXBCdWxsZXRMaXN0TWFya2VyKHMsbykpPj0wKSlyZXR1cm4hMTt6PSExfWlmKHMubGV2ZWw+PXMub3B0aW9ucy5tYXhOZXN0aW5nKXJldHVybiExO2lmKFY9cy5zcmMuY2hhckNvZGVBdChCLTEpLGEpcmV0dXJuITA7Zm9yKFo9cy50b2tlbnMubGVuZ3RoLHo/KEw9cy5iTWFya3Nbb10rcy50U2hpZnRbb10sVT1OdW1iZXIocy5zcmMuc3Vic3RyKEwsQi1MLTEpKSxzLnRva2Vucy5wdXNoKHt0eXBlOiJvcmRlcmVkX2xpc3Rfb3BlbiIsb3JkZXI6VSxsaW5lczppZT1bbywwXSxsZXZlbDpzLmxldmVsKyt9KSk6cy50b2tlbnMucHVzaCh7dHlwZToiYnVsbGV0X2xpc3Rfb3BlbiIsbGluZXM6aWU9W28sMF0sbGV2ZWw6cy5sZXZlbCsrfSksdT1vLGVlPSExLGNlPXMucGFyc2VyLnJ1bGVyLmdldFJ1bGVzKCJsaXN0Iik7ISghKHU8aSl8fCgoJD0oWT1zLnNraXBTcGFjZXMoQikpPj1zLmVNYXJrc1t1XT8xOlktQik+NCYmKCQ9MSksJDwxJiYoJD0xKSxfPUItcy5iTWFya3NbdV0rJCxzLnRva2Vucy5wdXNoKHt0eXBlOiJsaXN0X2l0ZW1fb3BlbiIsbGluZXM6YWU9W28sMF0sbGV2ZWw6cy5sZXZlbCsrfSkseD1zLmJsa0luZGVudCxDPXMudGlnaHQsdz1zLnRTaGlmdFtvXSxqPXMucGFyZW50VHlwZSxzLnRTaGlmdFtvXT1ZLXMuYk1hcmtzW29dLHMuYmxrSW5kZW50PV8scy50aWdodD0hMCxzLnBhcmVudFR5cGU9Imxpc3QiLHMucGFyc2VyLnRva2VuaXplKHMsbyxpLCEwKSxzLnRpZ2h0JiYhZWV8fChmZT0hMSksZWU9cy5saW5lLW8+MSYmcy5pc0VtcHR5KHMubGluZS0xKSxzLmJsa0luZGVudD14LHMudFNoaWZ0W29dPXcscy50aWdodD1DLHMucGFyZW50VHlwZT1qLHMudG9rZW5zLnB1c2goe3R5cGU6Imxpc3RfaXRlbV9jbG9zZSIsbGV2ZWw6LS1zLmxldmVsfSksdT1vPXMubGluZSxhZVsxXT11LFk9cy5iTWFya3Nbb10sdT49aSl8fHMuaXNFbXB0eSh1KXx8cy50U2hpZnRbdV08cy5ibGtJbmRlbnQpOyl7Zm9yKGRlPSExLGxlPTAscGU9Y2UubGVuZ3RoO2xlPHBlO2xlKyspaWYoY2VbbGVdKHMsdSxpLCEwKSl7ZGU9ITA7YnJlYWt9aWYoZGUpYnJlYWs7aWYoeil7aWYoKEI9c2tpcE9yZGVyZWRMaXN0TWFya2VyKHMsdSkpPDApYnJlYWt9ZWxzZSBpZigoQj1za2lwQnVsbGV0TGlzdE1hcmtlcihzLHUpKTwwKWJyZWFrO2lmKFYhPT1zLnNyYy5jaGFyQ29kZUF0KEItMSkpYnJlYWt9cmV0dXJuIHMudG9rZW5zLnB1c2goe3R5cGU6ej8ib3JkZXJlZF9saXN0X2Nsb3NlIjoiYnVsbGV0X2xpc3RfY2xvc2UiLGxldmVsOi0tcy5sZXZlbH0pLGllWzFdPXUscy5saW5lPXUsZmUmJmZ1bmN0aW9uIG1hcmtUaWdodFBhcmFncmFwaHMocyxvKXt2YXIgaSxhLHU9cy5sZXZlbCsyO2ZvcihpPW8rMixhPXMudG9rZW5zLmxlbmd0aC0yO2k8YTtpKyspcy50b2tlbnNbaV0ubGV2ZWw9PT11JiYicGFyYWdyYXBoX29wZW4iPT09cy50b2tlbnNbaV0udHlwZSYmKHMudG9rZW5zW2krMl0udGlnaHQ9ITAscy50b2tlbnNbaV0udGlnaHQ9ITAsaSs9Mil9KHMsWiksITB9LFsicGFyYWdyYXBoIiwiYmxvY2txdW90ZSJdXSxbImZvb3Rub3RlIixmdW5jdGlvbiBmb290bm90ZShzLG8saSxhKXt2YXIgdSxfLHcseCxDLGo9cy5iTWFya3Nbb10rcy50U2hpZnRbb10sTD1zLmVNYXJrc1tvXTtpZihqKzQ+TClyZXR1cm4hMTtpZig5MSE9PXMuc3JjLmNoYXJDb2RlQXQoaikpcmV0dXJuITE7aWYoOTQhPT1zLnNyYy5jaGFyQ29kZUF0KGorMSkpcmV0dXJuITE7aWYocy5sZXZlbD49cy5vcHRpb25zLm1heE5lc3RpbmcpcmV0dXJuITE7Zm9yKHg9aisyO3g8TDt4Kyspe2lmKDMyPT09cy5zcmMuY2hhckNvZGVBdCh4KSlyZXR1cm4hMTtpZig5Mz09PXMuc3JjLmNoYXJDb2RlQXQoeCkpYnJlYWt9cmV0dXJuIHghPT1qKzImJighKHgrMT49THx8NTghPT1zLnNyYy5jaGFyQ29kZUF0KCsreCkpJiYoYXx8KHgrKyxzLmVudi5mb290bm90ZXN8fChzLmVudi5mb290bm90ZXM9e30pLHMuZW52LmZvb3Rub3Rlcy5yZWZzfHwocy5lbnYuZm9vdG5vdGVzLnJlZnM9e30pLEM9cy5zcmMuc2xpY2UoaisyLHgtMikscy5lbnYuZm9vdG5vdGVzLnJlZnNbIjoiK0NdPS0xLHMudG9rZW5zLnB1c2goe3R5cGU6ImZvb3Rub3RlX3JlZmVyZW5jZV9vcGVuIixsYWJlbDpDLGxldmVsOnMubGV2ZWwrK30pLHU9cy5iTWFya3Nbb10sXz1zLnRTaGlmdFtvXSx3PXMucGFyZW50VHlwZSxzLnRTaGlmdFtvXT1zLnNraXBTcGFjZXMoeCkteCxzLmJNYXJrc1tvXT14LHMuYmxrSW5kZW50Kz00LHMucGFyZW50VHlwZT0iZm9vdG5vdGUiLHMudFNoaWZ0W29dPHMuYmxrSW5kZW50JiYocy50U2hpZnRbb10rPXMuYmxrSW5kZW50LHMuYk1hcmtzW29dLT1zLmJsa0luZGVudCkscy5wYXJzZXIudG9rZW5pemUocyxvLGksITApLHMucGFyZW50VHlwZT13LHMuYmxrSW5kZW50LT00LHMudFNoaWZ0W29dPV8scy5iTWFya3Nbb109dSxzLnRva2Vucy5wdXNoKHt0eXBlOiJmb290bm90ZV9yZWZlcmVuY2VfY2xvc2UiLGxldmVsOi0tcy5sZXZlbH0pKSwhMCkpfSxbInBhcmFncmFwaCJdXSxbImhlYWRpbmciLGZ1bmN0aW9uIGhlYWRpbmcocyxvLGksYSl7dmFyIHUsXyx3LHg9cy5iTWFya3Nbb10rcy50U2hpZnRbb10sQz1zLmVNYXJrc1tvXTtpZih4Pj1DKXJldHVybiExO2lmKDM1IT09KHU9cy5zcmMuY2hhckNvZGVBdCh4KSl8fHg+PUMpcmV0dXJuITE7Zm9yKF89MSx1PXMuc3JjLmNoYXJDb2RlQXQoKyt4KTszNT09PXUmJng8QyYmXzw9NjspXysrLHU9cy5zcmMuY2hhckNvZGVBdCgrK3gpO3JldHVybiEoXz42fHx4PEMmJjMyIT09dSkmJihhfHwoQz1zLnNraXBDaGFyc0JhY2soQywzMix4KSwodz1zLnNraXBDaGFyc0JhY2soQywzNSx4KSk+eCYmMzI9PT1zLnNyYy5jaGFyQ29kZUF0KHctMSkmJihDPXcpLHMubGluZT1vKzEscy50b2tlbnMucHVzaCh7dHlwZToiaGVhZGluZ19vcGVuIixoTGV2ZWw6XyxsaW5lczpbbyxzLmxpbmVdLGxldmVsOnMubGV2ZWx9KSx4PEMmJnMudG9rZW5zLnB1c2goe3R5cGU6ImlubGluZSIsY29udGVudDpzLnNyYy5zbGljZSh4LEMpLnRyaW0oKSxsZXZlbDpzLmxldmVsKzEsbGluZXM6W28scy5saW5lXSxjaGlsZHJlbjpbXX0pLHMudG9rZW5zLnB1c2goe3R5cGU6ImhlYWRpbmdfY2xvc2UiLGhMZXZlbDpfLGxldmVsOnMubGV2ZWx9KSksITApfSxbInBhcmFncmFwaCIsImJsb2NrcXVvdGUiXV0sWyJsaGVhZGluZyIsZnVuY3Rpb24gbGhlYWRpbmcocyxvLGkpe3ZhciBhLHUsXyx3PW8rMTtyZXR1cm4hKHc+PWkpJiYoIShzLnRTaGlmdFt3XTxzLmJsa0luZGVudCkmJighKHMudFNoaWZ0W3ddLXMuYmxrSW5kZW50PjMpJiYoISgodT1zLmJNYXJrc1t3XStzLnRTaGlmdFt3XSk+PShfPXMuZU1hcmtzW3ddKSkmJigoNDU9PT0oYT1zLnNyYy5jaGFyQ29kZUF0KHUpKXx8NjE9PT1hKSYmKHU9cy5za2lwQ2hhcnModSxhKSwhKCh1PXMuc2tpcFNwYWNlcyh1KSk8XykmJih1PXMuYk1hcmtzW29dK3MudFNoaWZ0W29dLHMubGluZT13KzEscy50b2tlbnMucHVzaCh7dHlwZToiaGVhZGluZ19vcGVuIixoTGV2ZWw6NjE9PT1hPzE6MixsaW5lczpbbyxzLmxpbmVdLGxldmVsOnMubGV2ZWx9KSxzLnRva2Vucy5wdXNoKHt0eXBlOiJpbmxpbmUiLGNvbnRlbnQ6cy5zcmMuc2xpY2UodSxzLmVNYXJrc1tvXSkudHJpbSgpLGxldmVsOnMubGV2ZWwrMSxsaW5lczpbbyxzLmxpbmUtMV0sY2hpbGRyZW46W119KSxzLnRva2Vucy5wdXNoKHt0eXBlOiJoZWFkaW5nX2Nsb3NlIixoTGV2ZWw6NjE9PT1hPzE6MixsZXZlbDpzLmxldmVsfSksITApKSkpKSl9XSxbImh0bWxibG9jayIsZnVuY3Rpb24gaHRtbGJsb2NrKHMsbyxpLGEpe3ZhciB1LF8sdyx4PXMuYk1hcmtzW29dLEM9cy5lTWFya3Nbb10saj1zLnRTaGlmdFtvXTtpZih4Kz1qLCFzLm9wdGlvbnMuaHRtbClyZXR1cm4hMTtpZihqPjN8fHgrMj49QylyZXR1cm4hMTtpZig2MCE9PXMuc3JjLmNoYXJDb2RlQXQoeCkpcmV0dXJuITE7aWYoMzM9PT0odT1zLnNyYy5jaGFyQ29kZUF0KHgrMSkpfHw2Mz09PXUpe2lmKGEpcmV0dXJuITB9ZWxzZXtpZig0NyE9PXUmJiFmdW5jdGlvbiBpc0xldHRlciQxKHMpe3ZhciBvPTMyfHM7cmV0dXJuIG8+PTk3JiZvPD0xMjJ9KHUpKXJldHVybiExO2lmKDQ3PT09dSl7aWYoIShfPXMuc3JjLnNsaWNlKHgsQykubWF0Y2goRUEpKSlyZXR1cm4hMX1lbHNlIGlmKCEoXz1zLnNyYy5zbGljZSh4LEMpLm1hdGNoKF9BKSkpcmV0dXJuITE7aWYoITAhPT1TQVtfWzFdLnRvTG93ZXJDYXNlKCldKXJldHVybiExO2lmKGEpcmV0dXJuITB9Zm9yKHc9bysxO3c8cy5saW5lTWF4JiYhcy5pc0VtcHR5KHcpOyl3Kys7cmV0dXJuIHMubGluZT13LHMudG9rZW5zLnB1c2goe3R5cGU6Imh0bWxibG9jayIsbGV2ZWw6cy5sZXZlbCxsaW5lczpbbyxzLmxpbmVdLGNvbnRlbnQ6cy5nZXRMaW5lcyhvLHcsMCwhMCl9KSwhMH0sWyJwYXJhZ3JhcGgiLCJibG9ja3F1b3RlIl1dLFsidGFibGUiLGZ1bmN0aW9uIHRhYmxlKHMsbyxpLGEpe3ZhciB1LF8sdyx4LEMsaixMLEIsJCxVLFY7aWYobysyPmkpcmV0dXJuITE7aWYoQz1vKzEscy50U2hpZnRbQ108cy5ibGtJbmRlbnQpcmV0dXJuITE7aWYoKHc9cy5iTWFya3NbQ10rcy50U2hpZnRbQ10pPj1zLmVNYXJrc1tDXSlyZXR1cm4hMTtpZigxMjQhPT0odT1zLnNyYy5jaGFyQ29kZUF0KHcpKSYmNDUhPT11JiY1OCE9PXUpcmV0dXJuITE7aWYoXz1pbmRleF9icm93c2VyX2dldExpbmUocyxvKzEpLCEvXlstOnwgXSskLy50ZXN0KF8pKXJldHVybiExO2lmKChqPV8uc3BsaXQoInwiKSk8PTIpcmV0dXJuITE7Zm9yKEI9W10seD0wO3g8ai5sZW5ndGg7eCsrKXtpZighKCQ9alt4XS50cmltKCkpKXtpZigwPT09eHx8eD09PWoubGVuZ3RoLTEpY29udGludWU7cmV0dXJuITF9aWYoIS9eOj8tKzo/JC8udGVzdCgkKSlyZXR1cm4hMTs1OD09PSQuY2hhckNvZGVBdCgkLmxlbmd0aC0xKT9CLnB1c2goNTg9PT0kLmNoYXJDb2RlQXQoMCk/ImNlbnRlciI6InJpZ2h0Iik6NTg9PT0kLmNoYXJDb2RlQXQoMCk/Qi5wdXNoKCJsZWZ0Iik6Qi5wdXNoKCIiKX1pZigtMT09PShfPWluZGV4X2Jyb3dzZXJfZ2V0TGluZShzLG8pLnRyaW0oKSkuaW5kZXhPZigifCIpKXJldHVybiExO2lmKGo9Xy5yZXBsYWNlKC9eXHx8XHwkL2csIiIpLnNwbGl0KCJ8IiksQi5sZW5ndGghPT1qLmxlbmd0aClyZXR1cm4hMTtpZihhKXJldHVybiEwO2ZvcihzLnRva2Vucy5wdXNoKHt0eXBlOiJ0YWJsZV9vcGVuIixsaW5lczpVPVtvLDBdLGxldmVsOnMubGV2ZWwrK30pLHMudG9rZW5zLnB1c2goe3R5cGU6InRoZWFkX29wZW4iLGxpbmVzOltvLG8rMV0sbGV2ZWw6cy5sZXZlbCsrfSkscy50b2tlbnMucHVzaCh7dHlwZToidHJfb3BlbiIsbGluZXM6W28sbysxXSxsZXZlbDpzLmxldmVsKyt9KSx4PTA7eDxqLmxlbmd0aDt4Kyspcy50b2tlbnMucHVzaCh7dHlwZToidGhfb3BlbiIsYWxpZ246Qlt4XSxsaW5lczpbbyxvKzFdLGxldmVsOnMubGV2ZWwrK30pLHMudG9rZW5zLnB1c2goe3R5cGU6ImlubGluZSIsY29udGVudDpqW3hdLnRyaW0oKSxsaW5lczpbbyxvKzFdLGxldmVsOnMubGV2ZWwsY2hpbGRyZW46W119KSxzLnRva2Vucy5wdXNoKHt0eXBlOiJ0aF9jbG9zZSIsbGV2ZWw6LS1zLmxldmVsfSk7Zm9yKHMudG9rZW5zLnB1c2goe3R5cGU6InRyX2Nsb3NlIixsZXZlbDotLXMubGV2ZWx9KSxzLnRva2Vucy5wdXNoKHt0eXBlOiJ0aGVhZF9jbG9zZSIsbGV2ZWw6LS1zLmxldmVsfSkscy50b2tlbnMucHVzaCh7dHlwZToidGJvZHlfb3BlbiIsbGluZXM6Vj1bbysyLDBdLGxldmVsOnMubGV2ZWwrK30pLEM9bysyO0M8aSYmIShzLnRTaGlmdFtDXTxzLmJsa0luZGVudCkmJi0xIT09KF89aW5kZXhfYnJvd3Nlcl9nZXRMaW5lKHMsQykudHJpbSgpKS5pbmRleE9mKCJ8Iik7QysrKXtmb3Ioaj1fLnJlcGxhY2UoL15cfHxcfCQvZywiIikuc3BsaXQoInwiKSxzLnRva2Vucy5wdXNoKHt0eXBlOiJ0cl9vcGVuIixsZXZlbDpzLmxldmVsKyt9KSx4PTA7eDxqLmxlbmd0aDt4Kyspcy50b2tlbnMucHVzaCh7dHlwZToidGRfb3BlbiIsYWxpZ246Qlt4XSxsZXZlbDpzLmxldmVsKyt9KSxMPWpbeF0uc3Vic3RyaW5nKDEyND09PWpbeF0uY2hhckNvZGVBdCgwKT8xOjAsMTI0PT09alt4XS5jaGFyQ29kZUF0KGpbeF0ubGVuZ3RoLTEpP2pbeF0ubGVuZ3RoLTE6alt4XS5sZW5ndGgpLnRyaW0oKSxzLnRva2Vucy5wdXNoKHt0eXBlOiJpbmxpbmUiLGNvbnRlbnQ6TCxsZXZlbDpzLmxldmVsLGNoaWxkcmVuOltdfSkscy50b2tlbnMucHVzaCh7dHlwZToidGRfY2xvc2UiLGxldmVsOi0tcy5sZXZlbH0pO3MudG9rZW5zLnB1c2goe3R5cGU6InRyX2Nsb3NlIixsZXZlbDotLXMubGV2ZWx9KX1yZXR1cm4gcy50b2tlbnMucHVzaCh7dHlwZToidGJvZHlfY2xvc2UiLGxldmVsOi0tcy5sZXZlbH0pLHMudG9rZW5zLnB1c2goe3R5cGU6InRhYmxlX2Nsb3NlIixsZXZlbDotLXMubGV2ZWx9KSxVWzFdPVZbMV09QyxzLmxpbmU9QywhMH0sWyJwYXJhZ3JhcGgiXV0sWyJkZWZsaXN0IixmdW5jdGlvbiBkZWZsaXN0KHMsbyxpLGEpe3ZhciB1LF8sdyx4LEMsaixMLEIsJCxVLFYseixZLFo7aWYoYSlyZXR1cm4hKHMuZGRJbmRlbnQ8MCkmJnNraXBNYXJrZXIocyxvKT49MDtpZihMPW8rMSxzLmlzRW1wdHkoTCkmJisrTD5pKXJldHVybiExO2lmKHMudFNoaWZ0W0xdPHMuYmxrSW5kZW50KXJldHVybiExO2lmKCh1PXNraXBNYXJrZXIocyxMKSk8MClyZXR1cm4hMTtpZihzLmxldmVsPj1zLm9wdGlvbnMubWF4TmVzdGluZylyZXR1cm4hMTtqPXMudG9rZW5zLmxlbmd0aCxzLnRva2Vucy5wdXNoKHt0eXBlOiJkbF9vcGVuIixsaW5lczpDPVtvLDBdLGxldmVsOnMubGV2ZWwrK30pLHc9byxfPUw7ZTpmb3IoOzspe2ZvcihaPSEwLFk9ITEscy50b2tlbnMucHVzaCh7dHlwZToiZHRfb3BlbiIsbGluZXM6W3csd10sbGV2ZWw6cy5sZXZlbCsrfSkscy50b2tlbnMucHVzaCh7dHlwZToiaW5saW5lIixjb250ZW50OnMuZ2V0TGluZXModyx3KzEscy5ibGtJbmRlbnQsITEpLnRyaW0oKSxsZXZlbDpzLmxldmVsKzEsbGluZXM6W3csd10sY2hpbGRyZW46W119KSxzLnRva2Vucy5wdXNoKHt0eXBlOiJkdF9jbG9zZSIsbGV2ZWw6LS1zLmxldmVsfSk7Oyl7aWYocy50b2tlbnMucHVzaCh7dHlwZToiZGRfb3BlbiIsbGluZXM6eD1bTCwwXSxsZXZlbDpzLmxldmVsKyt9KSx6PXMudGlnaHQsJD1zLmRkSW5kZW50LEI9cy5ibGtJbmRlbnQsVj1zLnRTaGlmdFtfXSxVPXMucGFyZW50VHlwZSxzLmJsa0luZGVudD1zLmRkSW5kZW50PXMudFNoaWZ0W19dKzIscy50U2hpZnRbX109dS1zLmJNYXJrc1tfXSxzLnRpZ2h0PSEwLHMucGFyZW50VHlwZT0iZGVmbGlzdCIscy5wYXJzZXIudG9rZW5pemUocyxfLGksITApLHMudGlnaHQmJiFZfHwoWj0hMSksWT1zLmxpbmUtXz4xJiZzLmlzRW1wdHkocy5saW5lLTEpLHMudFNoaWZ0W19dPVYscy50aWdodD16LHMucGFyZW50VHlwZT1VLHMuYmxrSW5kZW50PUIscy5kZEluZGVudD0kLHMudG9rZW5zLnB1c2goe3R5cGU6ImRkX2Nsb3NlIixsZXZlbDotLXMubGV2ZWx9KSx4WzFdPUw9cy5saW5lLEw+PWkpYnJlYWsgZTtpZihzLnRTaGlmdFtMXTxzLmJsa0luZGVudClicmVhayBlO2lmKCh1PXNraXBNYXJrZXIocyxMKSk8MClicmVhaztfPUx9aWYoTD49aSlicmVhaztpZih3PUwscy5pc0VtcHR5KHcpKWJyZWFrO2lmKHMudFNoaWZ0W3ddPHMuYmxrSW5kZW50KWJyZWFrO2lmKChfPXcrMSk+PWkpYnJlYWs7aWYocy5pc0VtcHR5KF8pJiZfKyssXz49aSlicmVhaztpZihzLnRTaGlmdFtfXTxzLmJsa0luZGVudClicmVhaztpZigodT1za2lwTWFya2VyKHMsXykpPDApYnJlYWt9cmV0dXJuIHMudG9rZW5zLnB1c2goe3R5cGU6ImRsX2Nsb3NlIixsZXZlbDotLXMubGV2ZWx9KSxDWzFdPUwscy5saW5lPUwsWiYmZnVuY3Rpb24gbWFya1RpZ2h0UGFyYWdyYXBocyQxKHMsbyl7dmFyIGksYSx1PXMubGV2ZWwrMjtmb3IoaT1vKzIsYT1zLnRva2Vucy5sZW5ndGgtMjtpPGE7aSsrKXMudG9rZW5zW2ldLmxldmVsPT09dSYmInBhcmFncmFwaF9vcGVuIj09PXMudG9rZW5zW2ldLnR5cGUmJihzLnRva2Vuc1tpKzJdLnRpZ2h0PSEwLHMudG9rZW5zW2ldLnRpZ2h0PSEwLGkrPTIpfShzLGopLCEwfSxbInBhcmFncmFwaCJdXSxbInBhcmFncmFwaCIsZnVuY3Rpb24gcGFyYWdyYXBoKHMsbyl7dmFyIGksYSx1LF8sdyx4LEM9bysxO2lmKEM8KGk9cy5saW5lTWF4KSYmIXMuaXNFbXB0eShDKSlmb3IoeD1zLnBhcnNlci5ydWxlci5nZXRSdWxlcygicGFyYWdyYXBoIik7QzxpJiYhcy5pc0VtcHR5KEMpO0MrKylpZighKHMudFNoaWZ0W0NdLXMuYmxrSW5kZW50PjMpKXtmb3IodT0hMSxfPTAsdz14Lmxlbmd0aDtfPHc7XysrKWlmKHhbX10ocyxDLGksITApKXt1PSEwO2JyZWFrfWlmKHUpYnJlYWt9cmV0dXJuIGE9cy5nZXRMaW5lcyhvLEMscy5ibGtJbmRlbnQsITEpLnRyaW0oKSxzLmxpbmU9QyxhLmxlbmd0aCYmKHMudG9rZW5zLnB1c2goe3R5cGU6InBhcmFncmFwaF9vcGVuIix0aWdodDohMSxsaW5lczpbbyxzLmxpbmVdLGxldmVsOnMubGV2ZWx9KSxzLnRva2Vucy5wdXNoKHt0eXBlOiJpbmxpbmUiLGNvbnRlbnQ6YSxsZXZlbDpzLmxldmVsKzEsbGluZXM6W28scy5saW5lXSxjaGlsZHJlbjpbXX0pLHMudG9rZW5zLnB1c2goe3R5cGU6InBhcmFncmFwaF9jbG9zZSIsdGlnaHQ6ITEsbGV2ZWw6cy5sZXZlbH0pKSwhMH1dXTtmdW5jdGlvbiBQYXJzZXJCbG9jaygpe3RoaXMucnVsZXI9bmV3IFJ1bGVyO2Zvcih2YXIgcz0wO3M8d0EubGVuZ3RoO3MrKyl0aGlzLnJ1bGVyLnB1c2god0Fbc11bMF0sd0Fbc11bMV0se2FsdDood0Fbc11bMl18fFtdKS5zbGljZSgpfSl9UGFyc2VyQmxvY2sucHJvdG90eXBlLnRva2VuaXplPWZ1bmN0aW9uKHMsbyxpKXtmb3IodmFyIGEsdT10aGlzLnJ1bGVyLmdldFJ1bGVzKCIiKSxfPXUubGVuZ3RoLHc9byx4PSExO3c8aSYmKHMubGluZT13PXMuc2tpcEVtcHR5TGluZXModyksISh3Pj1pKSkmJiEocy50U2hpZnRbd108cy5ibGtJbmRlbnQpOyl7Zm9yKGE9MDthPF8mJiF1W2FdKHMsdyxpLCExKTthKyspO2lmKHMudGlnaHQ9IXgscy5pc0VtcHR5KHMubGluZS0xKSYmKHg9ITApLCh3PXMubGluZSk8aSYmcy5pc0VtcHR5KHcpKXtpZih4PSEwLCsrdzxpJiYibGlzdCI9PT1zLnBhcmVudFR5cGUmJnMuaXNFbXB0eSh3KSlicmVhaztzLmxpbmU9d319fTt2YXIgeEE9L1tcblx0XS9nLGtBPS9ccltcblx1MDA4NV18W1x1MjQyNFx1MjAyOFx1MDA4NV0vZyxPQT0vXHUwMGEwL2c7ZnVuY3Rpb24gaXNUZXJtaW5hdG9yQ2hhcihzKXtzd2l0Y2gocyl7Y2FzZSAxMDpjYXNlIDkyOmNhc2UgOTY6Y2FzZSA0MjpjYXNlIDk1OmNhc2UgOTQ6Y2FzZSA5MTpjYXNlIDkzOmNhc2UgMzM6Y2FzZSAzODpjYXNlIDYwOmNhc2UgNjI6Y2FzZSAxMjM6Y2FzZSAxMjU6Y2FzZSAzNjpjYXNlIDM3OmNhc2UgNjQ6Y2FzZSAxMjY6Y2FzZSA0MzpjYXNlIDYxOmNhc2UgNTg6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19UGFyc2VyQmxvY2sucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHMsbyxpLGEpe3ZhciB1LF89MCx3PTA7aWYoIXMpcmV0dXJuW107KHM9KHM9cy5yZXBsYWNlKE9BLCIgIikpLnJlcGxhY2Uoa0EsIlxuIikpLmluZGV4T2YoIlx0Iik+PTAmJihzPXMucmVwbGFjZSh4QSwoZnVuY3Rpb24obyxpKXt2YXIgYTtyZXR1cm4gMTA9PT1zLmNoYXJDb2RlQXQoaSk/KF89aSsxLHc9MCxvKTooYT0iICAgICIuc2xpY2UoKGktXy13KSU0KSx3PWktXysxLGEpfSkpKSx1PW5ldyBTdGF0ZUJsb2NrKHMsdGhpcyxvLGksYSksdGhpcy50b2tlbml6ZSh1LHUubGluZSx1LmxpbmVNYXgpfTtmb3IodmFyIEFBPVtdLENBPTA7Q0E8MjU2O0NBKyspQUEucHVzaCgwKTtmdW5jdGlvbiBpc0FscGhhTnVtKHMpe3JldHVybiBzPj00OCYmczw9NTd8fHM+PTY1JiZzPD05MHx8cz49OTcmJnM8PTEyMn1mdW5jdGlvbiBzY2FuRGVsaW1zKHMsbyl7dmFyIGksYSx1LF89byx3PSEwLHg9ITAsQz1zLnBvc01heCxqPXMuc3JjLmNoYXJDb2RlQXQobyk7Zm9yKGk9bz4wP3Muc3JjLmNoYXJDb2RlQXQoby0xKTotMTtfPEMmJnMuc3JjLmNoYXJDb2RlQXQoXyk9PT1qOylfKys7cmV0dXJuIF8+PUMmJih3PSExKSwodT1fLW8pPj00P3c9eD0hMTooMzIhPT0oYT1fPEM/cy5zcmMuY2hhckNvZGVBdChfKTotMSkmJjEwIT09YXx8KHc9ITEpLDMyIT09aSYmMTAhPT1pfHwoeD0hMSksOTU9PT1qJiYoaXNBbHBoYU51bShpKSYmKHc9ITEpLGlzQWxwaGFOdW0oYSkmJih4PSExKSkpLHtjYW5fb3Blbjp3LGNhbl9jbG9zZTp4LGRlbGltczp1fX0iXFwhXCIjJCUmJygpKissLi86Ozw9Pj9AW11eX2B7fH1+LSIuc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKHMpe0FBW3MuY2hhckNvZGVBdCgwKV09MX0pKTt2YXIgakE9L1xcKFsgXFwhIiMkJSYnKCkqKywuXC86Ozw9Pj9AW1xdXl9ge3x9fi1dKS9nO3ZhciBQQT0vXFwoWyBcXCEiIyQlJicoKSorLC5cLzo7PD0+P0BbXF1eX2B7fH1+LV0pL2c7dmFyIElBPVsiY29hcCIsImRvaSIsImphdmFzY3JpcHQiLCJhYWEiLCJhYWFzIiwiYWJvdXQiLCJhY2FwIiwiY2FwIiwiY2lkIiwiY3JpZCIsImRhdGEiLCJkYXYiLCJkaWN0IiwiZG5zIiwiZmlsZSIsImZ0cCIsImdlbyIsImdvIiwiZ29waGVyIiwiaDMyMyIsImh0dHAiLCJodHRwcyIsImlheCIsImljYXAiLCJpbSIsImltYXAiLCJpbmZvIiwiaXBwIiwiaXJpcyIsImlyaXMuYmVlcCIsImlyaXMueHBjIiwiaXJpcy54cGNzIiwiaXJpcy5sd3oiLCJsZGFwIiwibWFpbHRvIiwibWlkIiwibXNycCIsIm1zcnBzIiwibXRxcCIsIm11cGRhdGUiLCJuZXdzIiwibmZzIiwibmkiLCJuaWgiLCJubnRwIiwib3BhcXVlbG9ja3Rva2VuIiwicG9wIiwicHJlcyIsInJ0c3AiLCJzZXJ2aWNlIiwic2Vzc2lvbiIsInNodHRwIiwic2lldmUiLCJzaXAiLCJzaXBzIiwic21zIiwic25tcCIsInNvYXAuYmVlcCIsInNvYXAuYmVlcHMiLCJ0YWciLCJ0ZWwiLCJ0ZWxuZXQiLCJ0ZnRwIiwidGhpc21lc3NhZ2UiLCJ0bjMyNzAiLCJ0aXAiLCJ0diIsInVybiIsInZlbW1pIiwid3MiLCJ3c3MiLCJ4Y29uIiwieGNvbi11c2VyaWQiLCJ4bWxycGMuYmVlcCIsInhtbHJwYy5iZWVwcyIsInhtcHAiLCJ6MzkuNTByIiwiejM5LjUwcyIsImFkaXVteHRyYSIsImFmcCIsImFmcyIsImFpbSIsImFwdCIsImF0dGFjaG1lbnQiLCJhdyIsImJlc2hhcmUiLCJiaXRjb2luIiwiYm9sbyIsImNhbGx0byIsImNocm9tZSIsImNocm9tZS1leHRlbnNpb24iLCJjb20tZXZlbnRicml0ZS1hdHRlbmRlZSIsImNvbnRlbnQiLCJjdnMiLCJkbG5hLXBsYXlzaW5nbGUiLCJkbG5hLXBsYXljb250YWluZXIiLCJkdG4iLCJkdmIiLCJlZDJrIiwiZmFjZXRpbWUiLCJmZWVkIiwiZmluZ2VyIiwiZmlzaCIsImdnIiwiZ2l0IiwiZ2l6bW9wcm9qZWN0IiwiZ3RhbGsiLCJoY3AiLCJpY29uIiwiaXBuIiwiaXJjIiwiaXJjNiIsImlyY3MiLCJpdG1zIiwiamFyIiwiam1zIiwia2V5cGFyYyIsImxhc3RmbSIsImxkYXBzIiwibWFnbmV0IiwibWFwcyIsIm1hcmtldCIsIm1lc3NhZ2UiLCJtbXMiLCJtcy1oZWxwIiwibXNuaW0iLCJtdW1ibGUiLCJtdm4iLCJub3RlcyIsIm9pZCIsInBhbG0iLCJwYXBhcmF6emkiLCJwbGF0Zm9ybSIsInByb3h5IiwicHN5YyIsInF1ZXJ5IiwicmVzIiwicmVzb3VyY2UiLCJybWkiLCJyc3luYyIsInJ0bXAiLCJzZWNvbmRsaWZlIiwic2Z0cCIsInNnbiIsInNreXBlIiwic21iIiwic29sZGF0Iiwic3BvdGlmeSIsInNzaCIsInN0ZWFtIiwic3ZuIiwidGVhbXNwZWFrIiwidGhpbmdzIiwidWRwIiwidW5yZWFsIiwidXQyMDA0IiwidmVudHJpbG8iLCJ2aWV3LXNvdXJjZSIsIndlYmNhbCIsInd0YWkiLCJ3eWNpd3lnIiwieGZpcmUiLCJ4cmkiLCJ5bXNnciJdLFRBPS9ePChbYS16QS1aMC05LiEjJCUmJyorXC89P15fYHt8fX4tXStAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKik+LyxOQT0vXjwoW2EtekEtWi5cLV17MSwyNX0pOihbXjw+XHgwMC1ceDIwXSopPi87ZnVuY3Rpb24gcmVwbGFjZSQxKHMsbyl7cmV0dXJuIHM9cy5zb3VyY2Usbz1vfHwiIixmdW5jdGlvbiBzZWxmKGksYSl7cmV0dXJuIGk/KGE9YS5zb3VyY2V8fGEscz1zLnJlcGxhY2UoaSxhKSxzZWxmKTpuZXcgUmVnRXhwKHMsbyl9fXZhciBNQT1yZXBsYWNlJDEoLyg/OnVucXVvdGVkfHNpbmdsZV9xdW90ZWR8ZG91YmxlX3F1b3RlZCkvKSgidW5xdW90ZWQiLC9bXiInPTw+YFx4MDAtXHgyMF0rLykoInNpbmdsZV9xdW90ZWQiLC8nW14nXSonLykoImRvdWJsZV9xdW90ZWQiLC8iW14iXSoiLykoKSxSQT1yZXBsYWNlJDEoLyg/OlxzK2F0dHJfbmFtZSg/OlxzKj1ccyphdHRyX3ZhbHVlKT8pLykoImF0dHJfbmFtZSIsL1thLXpBLVpfOl1bYS16QS1aMC05Oi5fLV0qLykoImF0dHJfdmFsdWUiLE1BKSgpLERBPXJlcGxhY2UkMSgvPFtBLVphLXpdW0EtWmEtejAtOV0qYXR0cmlidXRlKlxzKlwvPz4vKSgiYXR0cmlidXRlIixSQSkoKSxMQT1yZXBsYWNlJDEoL14oPzpvcGVuX3RhZ3xjbG9zZV90YWd8Y29tbWVudHxwcm9jZXNzaW5nfGRlY2xhcmF0aW9ufGNkYXRhKS8pKCJvcGVuX3RhZyIsREEpKCJjbG9zZV90YWciLC88XC9bQS1aYS16XVtBLVphLXowLTldKlxzKj4vKSgiY29tbWVudCIsLzwhLS0tLT58PCEtLSg/Oi0/W14+LV0pKD86LT9bXi1dKSotLT4vKSgicHJvY2Vzc2luZyIsLzxbP10uKj9bP10+LykoImRlY2xhcmF0aW9uIiwvPCFbQS1aXStccytbXj5dKj4vKSgiY2RhdGEiLC88IVxbQ0RBVEFcW1tcc1xTXSo/XF1cXT4vKSgpO3ZhciBGQT0vXiYjKCg/OnhbYS1mMC05XXsxLDh9fFswLTldezEsOH0pKTsvaSxCQT0vXiYoW2Etel1bYS16MC05XXsxLDMxfSk7L2k7dmFyICRBPVtbInRleHQiLGZ1bmN0aW9uIGluZGV4X2Jyb3dzZXJfdGV4dChzLG8pe2Zvcih2YXIgaT1zLnBvcztpPHMucG9zTWF4JiYhaXNUZXJtaW5hdG9yQ2hhcihzLnNyYy5jaGFyQ29kZUF0KGkpKTspaSsrO3JldHVybiBpIT09cy5wb3MmJihvfHwocy5wZW5kaW5nKz1zLnNyYy5zbGljZShzLnBvcyxpKSkscy5wb3M9aSwhMCl9XSxbIm5ld2xpbmUiLGZ1bmN0aW9uIG5ld2xpbmUocyxvKXt2YXIgaSxhLHU9cy5wb3M7aWYoMTAhPT1zLnNyYy5jaGFyQ29kZUF0KHUpKXJldHVybiExO2lmKGk9cy5wZW5kaW5nLmxlbmd0aC0xLGE9cy5wb3NNYXgsIW8paWYoaT49MCYmMzI9PT1zLnBlbmRpbmcuY2hhckNvZGVBdChpKSlpZihpPj0xJiYzMj09PXMucGVuZGluZy5jaGFyQ29kZUF0KGktMSkpe2Zvcih2YXIgXz1pLTI7Xz49MDtfLS0paWYoMzIhPT1zLnBlbmRpbmcuY2hhckNvZGVBdChfKSl7cy5wZW5kaW5nPXMucGVuZGluZy5zdWJzdHJpbmcoMCxfKzEpO2JyZWFrfXMucHVzaCh7dHlwZToiaGFyZGJyZWFrIixsZXZlbDpzLmxldmVsfSl9ZWxzZSBzLnBlbmRpbmc9cy5wZW5kaW5nLnNsaWNlKDAsLTEpLHMucHVzaCh7dHlwZToic29mdGJyZWFrIixsZXZlbDpzLmxldmVsfSk7ZWxzZSBzLnB1c2goe3R5cGU6InNvZnRicmVhayIsbGV2ZWw6cy5sZXZlbH0pO2Zvcih1Kys7dTxhJiYzMj09PXMuc3JjLmNoYXJDb2RlQXQodSk7KXUrKztyZXR1cm4gcy5wb3M9dSwhMH1dLFsiZXNjYXBlIixmdW5jdGlvbiBpbmRleF9icm93c2VyX2VzY2FwZShzLG8pe3ZhciBpLGE9cy5wb3MsdT1zLnBvc01heDtpZig5MiE9PXMuc3JjLmNoYXJDb2RlQXQoYSkpcmV0dXJuITE7aWYoKythPHUpe2lmKChpPXMuc3JjLmNoYXJDb2RlQXQoYSkpPDI1NiYmMCE9PUFBW2ldKXJldHVybiBvfHwocy5wZW5kaW5nKz1zLnNyY1thXSkscy5wb3MrPTIsITA7aWYoMTA9PT1pKXtmb3Iob3x8cy5wdXNoKHt0eXBlOiJoYXJkYnJlYWsiLGxldmVsOnMubGV2ZWx9KSxhKys7YTx1JiYzMj09PXMuc3JjLmNoYXJDb2RlQXQoYSk7KWErKztyZXR1cm4gcy5wb3M9YSwhMH19cmV0dXJuIG98fChzLnBlbmRpbmcrPSJcXCIpLHMucG9zKyssITB9XSxbImJhY2t0aWNrcyIsZnVuY3Rpb24gYmFja3RpY2tzKHMsbyl7dmFyIGksYSx1LF8sdyx4PXMucG9zO2lmKDk2IT09cy5zcmMuY2hhckNvZGVBdCh4KSlyZXR1cm4hMTtmb3IoaT14LHgrKyxhPXMucG9zTWF4O3g8YSYmOTY9PT1zLnNyYy5jaGFyQ29kZUF0KHgpOyl4Kys7Zm9yKHU9cy5zcmMuc2xpY2UoaSx4KSxfPXc9eDstMSE9PShfPXMuc3JjLmluZGV4T2YoImAiLHcpKTspe2Zvcih3PV8rMTt3PGEmJjk2PT09cy5zcmMuY2hhckNvZGVBdCh3KTspdysrO2lmKHctXz09PXUubGVuZ3RoKXJldHVybiBvfHxzLnB1c2goe3R5cGU6ImNvZGUiLGNvbnRlbnQ6cy5zcmMuc2xpY2UoeCxfKS5yZXBsYWNlKC9bIFxuXSsvZywiICIpLnRyaW0oKSxibG9jazohMSxsZXZlbDpzLmxldmVsfSkscy5wb3M9dywhMH1yZXR1cm4gb3x8KHMucGVuZGluZys9dSkscy5wb3MrPXUubGVuZ3RoLCEwfV0sWyJkZWwiLGZ1bmN0aW9uIGRlbChzLG8pe3ZhciBpLGEsdSxfLHcseD1zLnBvc01heCxDPXMucG9zO2lmKDEyNiE9PXMuc3JjLmNoYXJDb2RlQXQoQykpcmV0dXJuITE7aWYobylyZXR1cm4hMTtpZihDKzQ+PXgpcmV0dXJuITE7aWYoMTI2IT09cy5zcmMuY2hhckNvZGVBdChDKzEpKXJldHVybiExO2lmKHMubGV2ZWw+PXMub3B0aW9ucy5tYXhOZXN0aW5nKXJldHVybiExO2lmKF89Qz4wP3Muc3JjLmNoYXJDb2RlQXQoQy0xKTotMSx3PXMuc3JjLmNoYXJDb2RlQXQoQysyKSwxMjY9PT1fKXJldHVybiExO2lmKDEyNj09PXcpcmV0dXJuITE7aWYoMzI9PT13fHwxMD09PXcpcmV0dXJuITE7Zm9yKGE9QysyO2E8eCYmMTI2PT09cy5zcmMuY2hhckNvZGVBdChhKTspYSsrO2lmKGE+QyszKXJldHVybiBzLnBvcys9YS1DLG98fChzLnBlbmRpbmcrPXMuc3JjLnNsaWNlKEMsYSkpLCEwO2ZvcihzLnBvcz1DKzIsdT0xO3MucG9zKzE8eDspe2lmKDEyNj09PXMuc3JjLmNoYXJDb2RlQXQocy5wb3MpJiYxMjY9PT1zLnNyYy5jaGFyQ29kZUF0KHMucG9zKzEpJiYoXz1zLnNyYy5jaGFyQ29kZUF0KHMucG9zLTEpLDEyNiE9PSh3PXMucG9zKzI8eD9zLnNyYy5jaGFyQ29kZUF0KHMucG9zKzIpOi0xKSYmMTI2IT09XyYmKDMyIT09XyYmMTAhPT1fP3UtLTozMiE9PXcmJjEwIT09dyYmdSsrLHU8PTApKSl7aT0hMDticmVha31zLnBhcnNlci5za2lwVG9rZW4ocyl9cmV0dXJuIGk/KHMucG9zTWF4PXMucG9zLHMucG9zPUMrMixvfHwocy5wdXNoKHt0eXBlOiJkZWxfb3BlbiIsbGV2ZWw6cy5sZXZlbCsrfSkscy5wYXJzZXIudG9rZW5pemUocykscy5wdXNoKHt0eXBlOiJkZWxfY2xvc2UiLGxldmVsOi0tcy5sZXZlbH0pKSxzLnBvcz1zLnBvc01heCsyLHMucG9zTWF4PXgsITApOihzLnBvcz1DLCExKX1dLFsiaW5zIixmdW5jdGlvbiBpbnMocyxvKXt2YXIgaSxhLHUsXyx3LHg9cy5wb3NNYXgsQz1zLnBvcztpZig0MyE9PXMuc3JjLmNoYXJDb2RlQXQoQykpcmV0dXJuITE7aWYobylyZXR1cm4hMTtpZihDKzQ+PXgpcmV0dXJuITE7aWYoNDMhPT1zLnNyYy5jaGFyQ29kZUF0KEMrMSkpcmV0dXJuITE7aWYocy5sZXZlbD49cy5vcHRpb25zLm1heE5lc3RpbmcpcmV0dXJuITE7aWYoXz1DPjA/cy5zcmMuY2hhckNvZGVBdChDLTEpOi0xLHc9cy5zcmMuY2hhckNvZGVBdChDKzIpLDQzPT09XylyZXR1cm4hMTtpZig0Mz09PXcpcmV0dXJuITE7aWYoMzI9PT13fHwxMD09PXcpcmV0dXJuITE7Zm9yKGE9QysyO2E8eCYmNDM9PT1zLnNyYy5jaGFyQ29kZUF0KGEpOylhKys7aWYoYSE9PUMrMilyZXR1cm4gcy5wb3MrPWEtQyxvfHwocy5wZW5kaW5nKz1zLnNyYy5zbGljZShDLGEpKSwhMDtmb3Iocy5wb3M9QysyLHU9MTtzLnBvcysxPHg7KXtpZig0Mz09PXMuc3JjLmNoYXJDb2RlQXQocy5wb3MpJiY0Mz09PXMuc3JjLmNoYXJDb2RlQXQocy5wb3MrMSkmJihfPXMuc3JjLmNoYXJDb2RlQXQocy5wb3MtMSksNDMhPT0odz1zLnBvcysyPHg/cy5zcmMuY2hhckNvZGVBdChzLnBvcysyKTotMSkmJjQzIT09XyYmKDMyIT09XyYmMTAhPT1fP3UtLTozMiE9PXcmJjEwIT09dyYmdSsrLHU8PTApKSl7aT0hMDticmVha31zLnBhcnNlci5za2lwVG9rZW4ocyl9cmV0dXJuIGk/KHMucG9zTWF4PXMucG9zLHMucG9zPUMrMixvfHwocy5wdXNoKHt0eXBlOiJpbnNfb3BlbiIsbGV2ZWw6cy5sZXZlbCsrfSkscy5wYXJzZXIudG9rZW5pemUocykscy5wdXNoKHt0eXBlOiJpbnNfY2xvc2UiLGxldmVsOi0tcy5sZXZlbH0pKSxzLnBvcz1zLnBvc01heCsyLHMucG9zTWF4PXgsITApOihzLnBvcz1DLCExKX1dLFsibWFyayIsZnVuY3Rpb24gbWFyayhzLG8pe3ZhciBpLGEsdSxfLHcseD1zLnBvc01heCxDPXMucG9zO2lmKDYxIT09cy5zcmMuY2hhckNvZGVBdChDKSlyZXR1cm4hMTtpZihvKXJldHVybiExO2lmKEMrND49eClyZXR1cm4hMTtpZig2MSE9PXMuc3JjLmNoYXJDb2RlQXQoQysxKSlyZXR1cm4hMTtpZihzLmxldmVsPj1zLm9wdGlvbnMubWF4TmVzdGluZylyZXR1cm4hMTtpZihfPUM+MD9zLnNyYy5jaGFyQ29kZUF0KEMtMSk6LTEsdz1zLnNyYy5jaGFyQ29kZUF0KEMrMiksNjE9PT1fKXJldHVybiExO2lmKDYxPT09dylyZXR1cm4hMTtpZigzMj09PXd8fDEwPT09dylyZXR1cm4hMTtmb3IoYT1DKzI7YTx4JiY2MT09PXMuc3JjLmNoYXJDb2RlQXQoYSk7KWErKztpZihhIT09QysyKXJldHVybiBzLnBvcys9YS1DLG98fChzLnBlbmRpbmcrPXMuc3JjLnNsaWNlKEMsYSkpLCEwO2ZvcihzLnBvcz1DKzIsdT0xO3MucG9zKzE8eDspe2lmKDYxPT09cy5zcmMuY2hhckNvZGVBdChzLnBvcykmJjYxPT09cy5zcmMuY2hhckNvZGVBdChzLnBvcysxKSYmKF89cy5zcmMuY2hhckNvZGVBdChzLnBvcy0xKSw2MSE9PSh3PXMucG9zKzI8eD9zLnNyYy5jaGFyQ29kZUF0KHMucG9zKzIpOi0xKSYmNjEhPT1fJiYoMzIhPT1fJiYxMCE9PV8/dS0tOjMyIT09dyYmMTAhPT13JiZ1KyssdTw9MCkpKXtpPSEwO2JyZWFrfXMucGFyc2VyLnNraXBUb2tlbihzKX1yZXR1cm4gaT8ocy5wb3NNYXg9cy5wb3Mscy5wb3M9QysyLG98fChzLnB1c2goe3R5cGU6Im1hcmtfb3BlbiIsbGV2ZWw6cy5sZXZlbCsrfSkscy5wYXJzZXIudG9rZW5pemUocykscy5wdXNoKHt0eXBlOiJtYXJrX2Nsb3NlIixsZXZlbDotLXMubGV2ZWx9KSkscy5wb3M9cy5wb3NNYXgrMixzLnBvc01heD14LCEwKToocy5wb3M9QywhMSl9XSxbImVtcGhhc2lzIixmdW5jdGlvbiBlbXBoYXNpcyhzLG8pe3ZhciBpLGEsdSxfLHcseCxDLGo9cy5wb3NNYXgsTD1zLnBvcyxCPXMuc3JjLmNoYXJDb2RlQXQoTCk7aWYoOTUhPT1CJiY0MiE9PUIpcmV0dXJuITE7aWYobylyZXR1cm4hMTtpZihpPShDPXNjYW5EZWxpbXMocyxMKSkuZGVsaW1zLCFDLmNhbl9vcGVuKXJldHVybiBzLnBvcys9aSxvfHwocy5wZW5kaW5nKz1zLnNyYy5zbGljZShMLHMucG9zKSksITA7aWYocy5sZXZlbD49cy5vcHRpb25zLm1heE5lc3RpbmcpcmV0dXJuITE7Zm9yKHMucG9zPUwraSx4PVtpXTtzLnBvczxqOylpZihzLnNyYy5jaGFyQ29kZUF0KHMucG9zKSE9PUIpcy5wYXJzZXIuc2tpcFRva2VuKHMpO2Vsc2V7aWYoYT0oQz1zY2FuRGVsaW1zKHMscy5wb3MpKS5kZWxpbXMsQy5jYW5fY2xvc2Upe2ZvcihfPXgucG9wKCksdz1hO18hPT13Oyl7aWYodzxfKXt4LnB1c2goXy13KTticmVha31pZih3LT1fLDA9PT14Lmxlbmd0aClicmVhaztzLnBvcys9XyxfPXgucG9wKCl9aWYoMD09PXgubGVuZ3RoKXtpPV8sdT0hMDticmVha31zLnBvcys9YTtjb250aW51ZX1DLmNhbl9vcGVuJiZ4LnB1c2goYSkscy5wb3MrPWF9cmV0dXJuIHU/KHMucG9zTWF4PXMucG9zLHMucG9zPUwraSxvfHwoMiE9PWkmJjMhPT1pfHxzLnB1c2goe3R5cGU6InN0cm9uZ19vcGVuIixsZXZlbDpzLmxldmVsKyt9KSwxIT09aSYmMyE9PWl8fHMucHVzaCh7dHlwZToiZW1fb3BlbiIsbGV2ZWw6cy5sZXZlbCsrfSkscy5wYXJzZXIudG9rZW5pemUocyksMSE9PWkmJjMhPT1pfHxzLnB1c2goe3R5cGU6ImVtX2Nsb3NlIixsZXZlbDotLXMubGV2ZWx9KSwyIT09aSYmMyE9PWl8fHMucHVzaCh7dHlwZToic3Ryb25nX2Nsb3NlIixsZXZlbDotLXMubGV2ZWx9KSkscy5wb3M9cy5wb3NNYXgraSxzLnBvc01heD1qLCEwKToocy5wb3M9TCwhMSl9XSxbInN1YiIsZnVuY3Rpb24gc3ViKHMsbyl7dmFyIGksYSx1PXMucG9zTWF4LF89cy5wb3M7aWYoMTI2IT09cy5zcmMuY2hhckNvZGVBdChfKSlyZXR1cm4hMTtpZihvKXJldHVybiExO2lmKF8rMj49dSlyZXR1cm4hMTtpZihzLmxldmVsPj1zLm9wdGlvbnMubWF4TmVzdGluZylyZXR1cm4hMTtmb3Iocy5wb3M9XysxO3MucG9zPHU7KXtpZigxMjY9PT1zLnNyYy5jaGFyQ29kZUF0KHMucG9zKSl7aT0hMDticmVha31zLnBhcnNlci5za2lwVG9rZW4ocyl9cmV0dXJuIGkmJl8rMSE9PXMucG9zPyhhPXMuc3JjLnNsaWNlKF8rMSxzLnBvcykpLm1hdGNoKC8oXnxbXlxcXSkoXFxcXCkqXHMvKT8ocy5wb3M9XywhMSk6KHMucG9zTWF4PXMucG9zLHMucG9zPV8rMSxvfHxzLnB1c2goe3R5cGU6InN1YiIsbGV2ZWw6cy5sZXZlbCxjb250ZW50OmEucmVwbGFjZShqQSwiJDEiKX0pLHMucG9zPXMucG9zTWF4KzEscy5wb3NNYXg9dSwhMCk6KHMucG9zPV8sITEpfV0sWyJzdXAiLGZ1bmN0aW9uIHN1cChzLG8pe3ZhciBpLGEsdT1zLnBvc01heCxfPXMucG9zO2lmKDk0IT09cy5zcmMuY2hhckNvZGVBdChfKSlyZXR1cm4hMTtpZihvKXJldHVybiExO2lmKF8rMj49dSlyZXR1cm4hMTtpZihzLmxldmVsPj1zLm9wdGlvbnMubWF4TmVzdGluZylyZXR1cm4hMTtmb3Iocy5wb3M9XysxO3MucG9zPHU7KXtpZig5ND09PXMuc3JjLmNoYXJDb2RlQXQocy5wb3MpKXtpPSEwO2JyZWFrfXMucGFyc2VyLnNraXBUb2tlbihzKX1yZXR1cm4gaSYmXysxIT09cy5wb3M/KGE9cy5zcmMuc2xpY2UoXysxLHMucG9zKSkubWF0Y2goLyhefFteXFxdKShcXFxcKSpccy8pPyhzLnBvcz1fLCExKToocy5wb3NNYXg9cy5wb3Mscy5wb3M9XysxLG98fHMucHVzaCh7dHlwZToic3VwIixsZXZlbDpzLmxldmVsLGNvbnRlbnQ6YS5yZXBsYWNlKFBBLCIkMSIpfSkscy5wb3M9cy5wb3NNYXgrMSxzLnBvc01heD11LCEwKToocy5wb3M9XywhMSl9XSxbImxpbmtzIixmdW5jdGlvbiBsaW5rcyhzLG8pe3ZhciBpLGEsdSxfLHcseCxDLGosTD0hMSxCPXMucG9zLCQ9cy5wb3NNYXgsVT1zLnBvcyxWPXMuc3JjLmNoYXJDb2RlQXQoVSk7aWYoMzM9PT1WJiYoTD0hMCxWPXMuc3JjLmNoYXJDb2RlQXQoKytVKSksOTEhPT1WKXJldHVybiExO2lmKHMubGV2ZWw+PXMub3B0aW9ucy5tYXhOZXN0aW5nKXJldHVybiExO2lmKGk9VSsxLChhPXBhcnNlTGlua0xhYmVsKHMsVSkpPDApcmV0dXJuITE7aWYoKHg9YSsxKTwkJiY0MD09PXMuc3JjLmNoYXJDb2RlQXQoeCkpe2Zvcih4Kys7eDwkJiYoMzI9PT0oaj1zLnNyYy5jaGFyQ29kZUF0KHgpKXx8MTA9PT1qKTt4KyspO2lmKHg+PSQpcmV0dXJuITE7Zm9yKFU9eCxwYXJzZUxpbmtEZXN0aW5hdGlvbihzLHgpPyhfPXMubGlua0NvbnRlbnQseD1zLnBvcyk6Xz0iIixVPXg7eDwkJiYoMzI9PT0oaj1zLnNyYy5jaGFyQ29kZUF0KHgpKXx8MTA9PT1qKTt4KyspO2lmKHg8JCYmVSE9PXgmJnBhcnNlTGlua1RpdGxlKHMseCkpZm9yKHc9cy5saW5rQ29udGVudCx4PXMucG9zO3g8JCYmKDMyPT09KGo9cy5zcmMuY2hhckNvZGVBdCh4KSl8fDEwPT09aik7eCsrKTtlbHNlIHc9IiI7aWYoeD49JHx8NDEhPT1zLnNyYy5jaGFyQ29kZUF0KHgpKXJldHVybiBzLnBvcz1CLCExO3grK31lbHNle2lmKHMubGlua0xldmVsPjApcmV0dXJuITE7Zm9yKDt4PCQmJigzMj09PShqPXMuc3JjLmNoYXJDb2RlQXQoeCkpfHwxMD09PWopO3grKyk7aWYoeDwkJiY5MT09PXMuc3JjLmNoYXJDb2RlQXQoeCkmJihVPXgrMSwoeD1wYXJzZUxpbmtMYWJlbChzLHgpKT49MD91PXMuc3JjLnNsaWNlKFUseCsrKTp4PVUtMSksdXx8KHZvaWQgMD09PXUmJih4PWErMSksdT1zLnNyYy5zbGljZShpLGEpKSwhKEM9cy5lbnYucmVmZXJlbmNlc1tub3JtYWxpemVSZWZlcmVuY2UodSldKSlyZXR1cm4gcy5wb3M9QiwhMTtfPUMuaHJlZix3PUMudGl0bGV9cmV0dXJuIG98fChzLnBvcz1pLHMucG9zTWF4PWEsTD9zLnB1c2goe3R5cGU6ImltYWdlIixzcmM6Xyx0aXRsZTp3LGFsdDpzLnNyYy5zdWJzdHIoaSxhLWkpLGxldmVsOnMubGV2ZWx9KToocy5wdXNoKHt0eXBlOiJsaW5rX29wZW4iLGhyZWY6Xyx0aXRsZTp3LGxldmVsOnMubGV2ZWwrK30pLHMubGlua0xldmVsKysscy5wYXJzZXIudG9rZW5pemUocykscy5saW5rTGV2ZWwtLSxzLnB1c2goe3R5cGU6ImxpbmtfY2xvc2UiLGxldmVsOi0tcy5sZXZlbH0pKSkscy5wb3M9eCxzLnBvc01heD0kLCEwfV0sWyJmb290bm90ZV9pbmxpbmUiLGZ1bmN0aW9uIGZvb3Rub3RlX2lubGluZShzLG8pe3ZhciBpLGEsdSxfLHc9cy5wb3NNYXgseD1zLnBvcztyZXR1cm4hKHgrMj49dykmJig5ND09PXMuc3JjLmNoYXJDb2RlQXQoeCkmJig5MT09PXMuc3JjLmNoYXJDb2RlQXQoeCsxKSYmKCEocy5sZXZlbD49cy5vcHRpb25zLm1heE5lc3RpbmcpJiYoaT14KzIsISgoYT1wYXJzZUxpbmtMYWJlbChzLHgrMSkpPDApJiYob3x8KHMuZW52LmZvb3Rub3Rlc3x8KHMuZW52LmZvb3Rub3Rlcz17fSkscy5lbnYuZm9vdG5vdGVzLmxpc3R8fChzLmVudi5mb290bm90ZXMubGlzdD1bXSksdT1zLmVudi5mb290bm90ZXMubGlzdC5sZW5ndGgscy5wb3M9aSxzLnBvc01heD1hLHMucHVzaCh7dHlwZToiZm9vdG5vdGVfcmVmIixpZDp1LGxldmVsOnMubGV2ZWx9KSxzLmxpbmtMZXZlbCsrLF89cy50b2tlbnMubGVuZ3RoLHMucGFyc2VyLnRva2VuaXplKHMpLHMuZW52LmZvb3Rub3Rlcy5saXN0W3VdPXt0b2tlbnM6cy50b2tlbnMuc3BsaWNlKF8pfSxzLmxpbmtMZXZlbC0tKSxzLnBvcz1hKzEscy5wb3NNYXg9dywhMCkpKSkpfV0sWyJmb290bm90ZV9yZWYiLGZ1bmN0aW9uIGZvb3Rub3RlX3JlZihzLG8pe3ZhciBpLGEsdSxfLHc9cy5wb3NNYXgseD1zLnBvcztpZih4KzM+dylyZXR1cm4hMTtpZighcy5lbnYuZm9vdG5vdGVzfHwhcy5lbnYuZm9vdG5vdGVzLnJlZnMpcmV0dXJuITE7aWYoOTEhPT1zLnNyYy5jaGFyQ29kZUF0KHgpKXJldHVybiExO2lmKDk0IT09cy5zcmMuY2hhckNvZGVBdCh4KzEpKXJldHVybiExO2lmKHMubGV2ZWw+PXMub3B0aW9ucy5tYXhOZXN0aW5nKXJldHVybiExO2ZvcihhPXgrMjthPHc7YSsrKXtpZigzMj09PXMuc3JjLmNoYXJDb2RlQXQoYSkpcmV0dXJuITE7aWYoMTA9PT1zLnNyYy5jaGFyQ29kZUF0KGEpKXJldHVybiExO2lmKDkzPT09cy5zcmMuY2hhckNvZGVBdChhKSlicmVha31yZXR1cm4gYSE9PXgrMiYmKCEoYT49dykmJihhKyssaT1zLnNyYy5zbGljZSh4KzIsYS0xKSx2b2lkIDAhPT1zLmVudi5mb290bm90ZXMucmVmc1siOiIraV0mJihvfHwocy5lbnYuZm9vdG5vdGVzLmxpc3R8fChzLmVudi5mb290bm90ZXMubGlzdD1bXSkscy5lbnYuZm9vdG5vdGVzLnJlZnNbIjoiK2ldPDA/KHU9cy5lbnYuZm9vdG5vdGVzLmxpc3QubGVuZ3RoLHMuZW52LmZvb3Rub3Rlcy5saXN0W3VdPXtsYWJlbDppLGNvdW50OjB9LHMuZW52LmZvb3Rub3Rlcy5yZWZzWyI6IitpXT11KTp1PXMuZW52LmZvb3Rub3Rlcy5yZWZzWyI6IitpXSxfPXMuZW52LmZvb3Rub3Rlcy5saXN0W3VdLmNvdW50LHMuZW52LmZvb3Rub3Rlcy5saXN0W3VdLmNvdW50Kysscy5wdXNoKHt0eXBlOiJmb290bm90ZV9yZWYiLGlkOnUsc3ViSWQ6XyxsZXZlbDpzLmxldmVsfSkpLHMucG9zPWEscy5wb3NNYXg9dywhMCkpKX1dLFsiYXV0b2xpbmsiLGZ1bmN0aW9uIGF1dG9saW5rKHMsbyl7dmFyIGksYSx1LF8sdyx4PXMucG9zO3JldHVybiA2MD09PXMuc3JjLmNoYXJDb2RlQXQoeCkmJighKChpPXMuc3JjLnNsaWNlKHgpKS5pbmRleE9mKCI+Iik8MCkmJigoYT1pLm1hdGNoKE5BKSk/IShJQS5pbmRleE9mKGFbMV0udG9Mb3dlckNhc2UoKSk8MCkmJih3PW5vcm1hbGl6ZUxpbmsoXz1hWzBdLnNsaWNlKDEsLTEpKSwhIXMucGFyc2VyLnZhbGlkYXRlTGluayhfKSYmKG98fChzLnB1c2goe3R5cGU6Imxpbmtfb3BlbiIsaHJlZjp3LGxldmVsOnMubGV2ZWx9KSxzLnB1c2goe3R5cGU6InRleHQiLGNvbnRlbnQ6XyxsZXZlbDpzLmxldmVsKzF9KSxzLnB1c2goe3R5cGU6ImxpbmtfY2xvc2UiLGxldmVsOnMubGV2ZWx9KSkscy5wb3MrPWFbMF0ubGVuZ3RoLCEwKSk6ISEodT1pLm1hdGNoKFRBKSkmJih3PW5vcm1hbGl6ZUxpbmsoIm1haWx0bzoiKyhfPXVbMF0uc2xpY2UoMSwtMSkpKSwhIXMucGFyc2VyLnZhbGlkYXRlTGluayh3KSYmKG98fChzLnB1c2goe3R5cGU6Imxpbmtfb3BlbiIsaHJlZjp3LGxldmVsOnMubGV2ZWx9KSxzLnB1c2goe3R5cGU6InRleHQiLGNvbnRlbnQ6XyxsZXZlbDpzLmxldmVsKzF9KSxzLnB1c2goe3R5cGU6ImxpbmtfY2xvc2UiLGxldmVsOnMubGV2ZWx9KSkscy5wb3MrPXVbMF0ubGVuZ3RoLCEwKSkpKX1dLFsiaHRtbHRhZyIsZnVuY3Rpb24gaHRtbHRhZyhzLG8pe3ZhciBpLGEsdSxfPXMucG9zO3JldHVybiEhcy5vcHRpb25zLmh0bWwmJih1PXMucG9zTWF4LCEoNjAhPT1zLnNyYy5jaGFyQ29kZUF0KF8pfHxfKzI+PXUpJiYoISgzMyE9PShpPXMuc3JjLmNoYXJDb2RlQXQoXysxKSkmJjYzIT09aSYmNDchPT1pJiYhZnVuY3Rpb24gaXNMZXR0ZXIkMihzKXt2YXIgbz0zMnxzO3JldHVybiBvPj05NyYmbzw9MTIyfShpKSkmJighIShhPXMuc3JjLnNsaWNlKF8pLm1hdGNoKExBKSkmJihvfHxzLnB1c2goe3R5cGU6Imh0bWx0YWciLGNvbnRlbnQ6cy5zcmMuc2xpY2UoXyxfK2FbMF0ubGVuZ3RoKSxsZXZlbDpzLmxldmVsfSkscy5wb3MrPWFbMF0ubGVuZ3RoLCEwKSkpKX1dLFsiZW50aXR5IixmdW5jdGlvbiBlbnRpdHkocyxvKXt2YXIgaSxhLHU9cy5wb3MsXz1zLnBvc01heDtpZigzOCE9PXMuc3JjLmNoYXJDb2RlQXQodSkpcmV0dXJuITE7aWYodSsxPF8paWYoMzU9PT1zLnNyYy5jaGFyQ29kZUF0KHUrMSkpe2lmKGE9cy5zcmMuc2xpY2UodSkubWF0Y2goRkEpKXJldHVybiBvfHwoaT0ieCI9PT1hWzFdWzBdLnRvTG93ZXJDYXNlKCk/cGFyc2VJbnQoYVsxXS5zbGljZSgxKSwxNik6cGFyc2VJbnQoYVsxXSwxMCkscy5wZW5kaW5nKz1pc1ZhbGlkRW50aXR5Q29kZShpKT9mcm9tQ29kZVBvaW50KGkpOmZyb21Db2RlUG9pbnQoNjU1MzMpKSxzLnBvcys9YVswXS5sZW5ndGgsITB9ZWxzZSBpZihhPXMuc3JjLnNsaWNlKHUpLm1hdGNoKEJBKSl7dmFyIHc9ZGVjb2RlRW50aXR5KGFbMV0pO2lmKGFbMV0hPT13KXJldHVybiBvfHwocy5wZW5kaW5nKz13KSxzLnBvcys9YVswXS5sZW5ndGgsITB9cmV0dXJuIG98fChzLnBlbmRpbmcrPSImIikscy5wb3MrKywhMH1dXTtmdW5jdGlvbiBQYXJzZXJJbmxpbmUoKXt0aGlzLnJ1bGVyPW5ldyBSdWxlcjtmb3IodmFyIHM9MDtzPCRBLmxlbmd0aDtzKyspdGhpcy5ydWxlci5wdXNoKCRBW3NdWzBdLCRBW3NdWzFdKTt0aGlzLnZhbGlkYXRlTGluaz12YWxpZGF0ZUxpbmt9ZnVuY3Rpb24gdmFsaWRhdGVMaW5rKHMpe3ZhciBvPXMudHJpbSgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuLTE9PT0obz1yZXBsYWNlRW50aXRpZXMobykpLmluZGV4T2YoIjoiKXx8LTE9PT1bInZic2NyaXB0IiwiamF2YXNjcmlwdCIsImZpbGUiLCJkYXRhIl0uaW5kZXhPZihvLnNwbGl0KCI6IilbMF0pfVBhcnNlcklubGluZS5wcm90b3R5cGUuc2tpcFRva2VuPWZ1bmN0aW9uKHMpe3ZhciBvLGksYT10aGlzLnJ1bGVyLmdldFJ1bGVzKCIiKSx1PWEubGVuZ3RoLF89cy5wb3M7aWYoKGk9cy5jYWNoZUdldChfKSk+MClzLnBvcz1pO2Vsc2V7Zm9yKG89MDtvPHU7bysrKWlmKGFbb10ocywhMCkpcmV0dXJuIHZvaWQgcy5jYWNoZVNldChfLHMucG9zKTtzLnBvcysrLHMuY2FjaGVTZXQoXyxzLnBvcyl9fSxQYXJzZXJJbmxpbmUucHJvdG90eXBlLnRva2VuaXplPWZ1bmN0aW9uKHMpe2Zvcih2YXIgbyxpLGE9dGhpcy5ydWxlci5nZXRSdWxlcygiIiksdT1hLmxlbmd0aCxfPXMucG9zTWF4O3MucG9zPF87KXtmb3IoaT0wO2k8dSYmIShvPWFbaV0ocywhMSkpO2krKyk7aWYobyl7aWYocy5wb3M+PV8pYnJlYWt9ZWxzZSBzLnBlbmRpbmcrPXMuc3JjW3MucG9zKytdfXMucGVuZGluZyYmcy5wdXNoUGVuZGluZygpfSxQYXJzZXJJbmxpbmUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHMsbyxpLGEpe3ZhciB1PW5ldyBTdGF0ZUlubGluZShzLHRoaXMsbyxpLGEpO3RoaXMudG9rZW5pemUodSl9O3ZhciBxQT17ZGVmYXVsdDp7b3B0aW9uczp7aHRtbDohMSx4aHRtbE91dDohMSxicmVha3M6ITEsbGFuZ1ByZWZpeDoibGFuZ3VhZ2UtIixsaW5rVGFyZ2V0OiIiLHR5cG9ncmFwaGVyOiExLHF1b3Rlczoi4oCc4oCd4oCY4oCZIixoaWdobGlnaHQ6bnVsbCxtYXhOZXN0aW5nOjIwfSxjb21wb25lbnRzOntjb3JlOntydWxlczpbImJsb2NrIiwiaW5saW5lIiwicmVmZXJlbmNlcyIsInJlcGxhY2VtZW50cyIsInNtYXJ0cXVvdGVzIiwicmVmZXJlbmNlcyIsImFiYnIyIiwiZm9vdG5vdGVfdGFpbCJdfSxibG9jazp7cnVsZXM6WyJibG9ja3F1b3RlIiwiY29kZSIsImZlbmNlcyIsImZvb3Rub3RlIiwiaGVhZGluZyIsImhyIiwiaHRtbGJsb2NrIiwibGhlYWRpbmciLCJsaXN0IiwicGFyYWdyYXBoIiwidGFibGUiXX0saW5saW5lOntydWxlczpbImF1dG9saW5rIiwiYmFja3RpY2tzIiwiZGVsIiwiZW1waGFzaXMiLCJlbnRpdHkiLCJlc2NhcGUiLCJmb290bm90ZV9yZWYiLCJodG1sdGFnIiwibGlua3MiLCJuZXdsaW5lIiwidGV4dCJdfX19LGZ1bGw6e29wdGlvbnM6e2h0bWw6ITEseGh0bWxPdXQ6ITEsYnJlYWtzOiExLGxhbmdQcmVmaXg6Imxhbmd1YWdlLSIsbGlua1RhcmdldDoiIix0eXBvZ3JhcGhlcjohMSxxdW90ZXM6IuKAnOKAneKAmOKAmSIsaGlnaGxpZ2h0Om51bGwsbWF4TmVzdGluZzoyMH0sY29tcG9uZW50czp7Y29yZTp7fSxibG9jazp7fSxpbmxpbmU6e319fSxjb21tb25tYXJrOntvcHRpb25zOntodG1sOiEwLHhodG1sT3V0OiEwLGJyZWFrczohMSxsYW5nUHJlZml4OiJsYW5ndWFnZS0iLGxpbmtUYXJnZXQ6IiIsdHlwb2dyYXBoZXI6ITEscXVvdGVzOiLigJzigJ3igJjigJkiLGhpZ2hsaWdodDpudWxsLG1heE5lc3Rpbmc6MjB9LGNvbXBvbmVudHM6e2NvcmU6e3J1bGVzOlsiYmxvY2siLCJpbmxpbmUiLCJyZWZlcmVuY2VzIiwiYWJicjIiXX0sYmxvY2s6e3J1bGVzOlsiYmxvY2txdW90ZSIsImNvZGUiLCJmZW5jZXMiLCJoZWFkaW5nIiwiaHIiLCJodG1sYmxvY2siLCJsaGVhZGluZyIsImxpc3QiLCJwYXJhZ3JhcGgiXX0saW5saW5lOntydWxlczpbImF1dG9saW5rIiwiYmFja3RpY2tzIiwiZW1waGFzaXMiLCJlbnRpdHkiLCJlc2NhcGUiLCJodG1sdGFnIiwibGlua3MiLCJuZXdsaW5lIiwidGV4dCJdfX19fTtmdW5jdGlvbiBTdGF0ZUNvcmUocyxvLGkpe3RoaXMuc3JjPW8sdGhpcy5lbnY9aSx0aGlzLm9wdGlvbnM9cy5vcHRpb25zLHRoaXMudG9rZW5zPVtdLHRoaXMuaW5saW5lTW9kZT0hMSx0aGlzLmlubGluZT1zLmlubGluZSx0aGlzLmJsb2NrPXMuYmxvY2ssdGhpcy5yZW5kZXJlcj1zLnJlbmRlcmVyLHRoaXMudHlwb2dyYXBoZXI9cy50eXBvZ3JhcGhlcn1mdW5jdGlvbiBSZW1hcmthYmxlKHMsbyl7InN0cmluZyIhPXR5cGVvZiBzJiYobz1zLHM9ImRlZmF1bHQiKSxvJiZudWxsIT1vLmxpbmtpZnkmJmNvbnNvbGUud2FybigibGlua2lmeSBvcHRpb24gaXMgcmVtb3ZlZC4gVXNlIGxpbmtpZnkgcGx1Z2luIGluc3RlYWQ6XG5cbmltcG9ydCBSZW1hcmthYmxlIGZyb20gJ3JlbWFya2FibGUnO1xuaW1wb3J0IGxpbmtpZnkgZnJvbSAncmVtYXJrYWJsZS9saW5raWZ5Jztcbm5ldyBSZW1hcmthYmxlKCkudXNlKGxpbmtpZnkpXG4iKSx0aGlzLmlubGluZT1uZXcgUGFyc2VySW5saW5lLHRoaXMuYmxvY2s9bmV3IFBhcnNlckJsb2NrLHRoaXMuY29yZT1uZXcgQ29yZSx0aGlzLnJlbmRlcmVyPW5ldyBSZW5kZXJlcix0aGlzLnJ1bGVyPW5ldyBSdWxlcix0aGlzLm9wdGlvbnM9e30sdGhpcy5jb25maWd1cmUocUFbc10pLHRoaXMuc2V0KG98fHt9KX1SZW1hcmthYmxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocyl7aW5kZXhfYnJvd3Nlcl9hc3NpZ24odGhpcy5vcHRpb25zLHMpfSxSZW1hcmthYmxlLnByb3RvdHlwZS5jb25maWd1cmU9ZnVuY3Rpb24ocyl7dmFyIG89dGhpcztpZighcyl0aHJvdyBuZXcgRXJyb3IoIldyb25nIGByZW1hcmthYmxlYCBwcmVzZXQsIGNoZWNrIG5hbWUvY29udGVudCIpO3Mub3B0aW9ucyYmby5zZXQocy5vcHRpb25zKSxzLmNvbXBvbmVudHMmJk9iamVjdC5rZXlzKHMuY29tcG9uZW50cykuZm9yRWFjaCgoZnVuY3Rpb24oaSl7cy5jb21wb25lbnRzW2ldLnJ1bGVzJiZvW2ldLnJ1bGVyLmVuYWJsZShzLmNvbXBvbmVudHNbaV0ucnVsZXMsITApfSkpfSxSZW1hcmthYmxlLnByb3RvdHlwZS51c2U9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gcyh0aGlzLG8pLHRoaXN9LFJlbWFya2FibGUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKHMsbyl7dmFyIGk9bmV3IFN0YXRlQ29yZSh0aGlzLHMsbyk7cmV0dXJuIHRoaXMuY29yZS5wcm9jZXNzKGkpLGkudG9rZW5zfSxSZW1hcmthYmxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gbz1vfHx7fSx0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnBhcnNlKHMsbyksdGhpcy5vcHRpb25zLG8pfSxSZW1hcmthYmxlLnByb3RvdHlwZS5wYXJzZUlubGluZT1mdW5jdGlvbihzLG8pe3ZhciBpPW5ldyBTdGF0ZUNvcmUodGhpcyxzLG8pO3JldHVybiBpLmlubGluZU1vZGU9ITAsdGhpcy5jb3JlLnByb2Nlc3MoaSksaS50b2tlbnN9LFJlbWFya2FibGUucHJvdG90eXBlLnJlbmRlcklubGluZT1mdW5jdGlvbihzLG8pe3JldHVybiBvPW98fHt9LHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMucGFyc2VJbmxpbmUocyxvKSx0aGlzLm9wdGlvbnMsbyl9O2Z1bmN0aW9uIGluZGV4T2YocyxvKXtpZihBcnJheS5wcm90b3R5cGUuaW5kZXhPZilyZXR1cm4gcy5pbmRleE9mKG8pO2Zvcih2YXIgaT0wLGE9cy5sZW5ndGg7aTxhO2krKylpZihzW2ldPT09bylyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiB1dGlsc19yZW1vdmUocyxvKXtmb3IodmFyIGk9cy5sZW5ndGgtMTtpPj0wO2ktLSkhMD09PW8oc1tpXSkmJnMuc3BsaWNlKGksMSl9ZnVuY3Rpb24gdGhyb3dVbmhhbmRsZWRDYXNlRXJyb3Iocyl7dGhyb3cgbmV3IEVycm9yKCJVbmhhbmRsZWQgY2FzZSBmb3IgdmFsdWU6ICciLmNvbmNhdChzLCInIikpfXZhciBVQT1mdW5jdGlvbigpe2Z1bmN0aW9uIEh0bWxUYWcocyl7dm9pZCAwPT09cyYmKHM9e30pLHRoaXMudGFnTmFtZT0iIix0aGlzLmF0dHJzPXt9LHRoaXMuaW5uZXJIVE1MPSIiLHRoaXMud2hpdGVzcGFjZVJlZ2V4PS9ccysvLHRoaXMudGFnTmFtZT1zLnRhZ05hbWV8fCIiLHRoaXMuYXR0cnM9cy5hdHRyc3x8e30sdGhpcy5pbm5lckhUTUw9cy5pbm5lckh0bWx8fHMuaW5uZXJIVE1MfHwiIn1yZXR1cm4gSHRtbFRhZy5wcm90b3R5cGUuc2V0VGFnTmFtZT1mdW5jdGlvbihzKXtyZXR1cm4gdGhpcy50YWdOYW1lPXMsdGhpc30sSHRtbFRhZy5wcm90b3R5cGUuZ2V0VGFnTmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRhZ05hbWV8fCIifSxIdG1sVGFnLnByb3RvdHlwZS5zZXRBdHRyPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIHRoaXMuZ2V0QXR0cnMoKVtzXT1vLHRoaXN9LEh0bWxUYWcucHJvdG90eXBlLmdldEF0dHI9ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuZ2V0QXR0cnMoKVtzXX0sSHRtbFRhZy5wcm90b3R5cGUuc2V0QXR0cnM9ZnVuY3Rpb24ocyl7cmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRBdHRycygpLHMpLHRoaXN9LEh0bWxUYWcucHJvdG90eXBlLmdldEF0dHJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXR0cnN8fCh0aGlzLmF0dHJzPXt9KX0sSHRtbFRhZy5wcm90b3R5cGUuc2V0Q2xhc3M9ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuc2V0QXR0cigiY2xhc3MiLHMpfSxIdG1sVGFnLnByb3RvdHlwZS5hZGRDbGFzcz1mdW5jdGlvbihzKXtmb3IodmFyIG8saT10aGlzLmdldENsYXNzKCksYT10aGlzLndoaXRlc3BhY2VSZWdleCx1PWk/aS5zcGxpdChhKTpbXSxfPXMuc3BsaXQoYSk7bz1fLnNoaWZ0KCk7KS0xPT09aW5kZXhPZih1LG8pJiZ1LnB1c2gobyk7cmV0dXJuIHRoaXMuZ2V0QXR0cnMoKS5jbGFzcz11LmpvaW4oIiAiKSx0aGlzfSxIdG1sVGFnLnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbihzKXtmb3IodmFyIG8saT10aGlzLmdldENsYXNzKCksYT10aGlzLndoaXRlc3BhY2VSZWdleCx1PWk/aS5zcGxpdChhKTpbXSxfPXMuc3BsaXQoYSk7dS5sZW5ndGgmJihvPV8uc2hpZnQoKSk7KXt2YXIgdz1pbmRleE9mKHUsbyk7LTEhPT13JiZ1LnNwbGljZSh3LDEpfXJldHVybiB0aGlzLmdldEF0dHJzKCkuY2xhc3M9dS5qb2luKCIgIiksdGhpc30sSHRtbFRhZy5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBdHRycygpLmNsYXNzfHwiIn0sSHRtbFRhZy5wcm90b3R5cGUuaGFzQ2xhc3M9ZnVuY3Rpb24ocyl7cmV0dXJuLTEhPT0oIiAiK3RoaXMuZ2V0Q2xhc3MoKSsiICIpLmluZGV4T2YoIiAiK3MrIiAiKX0sSHRtbFRhZy5wcm90b3R5cGUuc2V0SW5uZXJIVE1MPWZ1bmN0aW9uKHMpe3JldHVybiB0aGlzLmlubmVySFRNTD1zLHRoaXN9LEh0bWxUYWcucHJvdG90eXBlLnNldElubmVySHRtbD1mdW5jdGlvbihzKXtyZXR1cm4gdGhpcy5zZXRJbm5lckhUTUwocyl9LEh0bWxUYWcucHJvdG90eXBlLmdldElubmVySFRNTD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlubmVySFRNTHx8IiJ9LEh0bWxUYWcucHJvdG90eXBlLmdldElubmVySHRtbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldElubmVySFRNTCgpfSxIdG1sVGFnLnByb3RvdHlwZS50b0FuY2hvclN0cmluZz1mdW5jdGlvbigpe3ZhciBzPXRoaXMuZ2V0VGFnTmFtZSgpLG89dGhpcy5idWlsZEF0dHJzU3RyKCk7cmV0dXJuWyI8IixzLG89bz8iICIrbzoiIiwiPiIsdGhpcy5nZXRJbm5lckh0bWwoKSwiPC8iLHMsIj4iXS5qb2luKCIiKX0sSHRtbFRhZy5wcm90b3R5cGUuYnVpbGRBdHRyc1N0cj1mdW5jdGlvbigpe2lmKCF0aGlzLmF0dHJzKXJldHVybiIiO3ZhciBzPXRoaXMuZ2V0QXR0cnMoKSxvPVtdO2Zvcih2YXIgaSBpbiBzKXMuaGFzT3duUHJvcGVydHkoaSkmJm8ucHVzaChpKyc9Iicrc1tpXSsnIicpO3JldHVybiBvLmpvaW4oIiAiKX0sSHRtbFRhZ30oKTt2YXIgVkE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBbmNob3JUYWdCdWlsZGVyKHMpe3ZvaWQgMD09PXMmJihzPXt9KSx0aGlzLm5ld1dpbmRvdz0hMSx0aGlzLnRydW5jYXRlPXt9LHRoaXMuY2xhc3NOYW1lPSIiLHRoaXMubmV3V2luZG93PXMubmV3V2luZG93fHwhMSx0aGlzLnRydW5jYXRlPXMudHJ1bmNhdGV8fHt9LHRoaXMuY2xhc3NOYW1lPXMuY2xhc3NOYW1lfHwiIn1yZXR1cm4gQW5jaG9yVGFnQnVpbGRlci5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24ocyl7cmV0dXJuIG5ldyBVQSh7dGFnTmFtZToiYSIsYXR0cnM6dGhpcy5jcmVhdGVBdHRycyhzKSxpbm5lckh0bWw6dGhpcy5wcm9jZXNzQW5jaG9yVGV4dChzLmdldEFuY2hvclRleHQoKSl9KX0sQW5jaG9yVGFnQnVpbGRlci5wcm90b3R5cGUuY3JlYXRlQXR0cnM9ZnVuY3Rpb24ocyl7dmFyIG89e2hyZWY6cy5nZXRBbmNob3JIcmVmKCl9LGk9dGhpcy5jcmVhdGVDc3NDbGFzcyhzKTtyZXR1cm4gaSYmKG8uY2xhc3M9aSksdGhpcy5uZXdXaW5kb3cmJihvLnRhcmdldD0iX2JsYW5rIixvLnJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIpLHRoaXMudHJ1bmNhdGUmJnRoaXMudHJ1bmNhdGUubGVuZ3RoJiZ0aGlzLnRydW5jYXRlLmxlbmd0aDxzLmdldEFuY2hvclRleHQoKS5sZW5ndGgmJihvLnRpdGxlPXMuZ2V0QW5jaG9ySHJlZigpKSxvfSxBbmNob3JUYWdCdWlsZGVyLnByb3RvdHlwZS5jcmVhdGVDc3NDbGFzcz1mdW5jdGlvbihzKXt2YXIgbz10aGlzLmNsYXNzTmFtZTtpZihvKXtmb3IodmFyIGk9W29dLGE9cy5nZXRDc3NDbGFzc1N1ZmZpeGVzKCksdT0wLF89YS5sZW5ndGg7dTxfO3UrKylpLnB1c2gobysiLSIrYVt1XSk7cmV0dXJuIGkuam9pbigiICIpfXJldHVybiIifSxBbmNob3JUYWdCdWlsZGVyLnByb3RvdHlwZS5wcm9jZXNzQW5jaG9yVGV4dD1mdW5jdGlvbihzKXtyZXR1cm4gcz10aGlzLmRvVHJ1bmNhdGUocyl9LEFuY2hvclRhZ0J1aWxkZXIucHJvdG90eXBlLmRvVHJ1bmNhdGU9ZnVuY3Rpb24ocyl7dmFyIG89dGhpcy50cnVuY2F0ZTtpZighb3x8IW8ubGVuZ3RoKXJldHVybiBzO3ZhciBpPW8ubGVuZ3RoLGE9by5sb2NhdGlvbjtyZXR1cm4ic21hcnQiPT09YT9mdW5jdGlvbiB0cnVuY2F0ZVNtYXJ0KHMsbyxpKXt2YXIgYSx1O251bGw9PWk/KGk9IiZoZWxsaXA7Iix1PTMsYT04KToodT1pLmxlbmd0aCxhPWkubGVuZ3RoKTt2YXIgYnVpbGRVcmw9ZnVuY3Rpb24ocyl7dmFyIG89IiI7cmV0dXJuIHMuc2NoZW1lJiZzLmhvc3QmJihvKz1zLnNjaGVtZSsiOi8vIikscy5ob3N0JiYobys9cy5ob3N0KSxzLnBhdGgmJihvKz0iLyIrcy5wYXRoKSxzLnF1ZXJ5JiYobys9Ij8iK3MucXVlcnkpLHMuZnJhZ21lbnQmJihvKz0iIyIrcy5mcmFnbWVudCksb30sYnVpbGRTZWdtZW50PWZ1bmN0aW9uKHMsbyl7dmFyIGE9by8yLHU9TWF0aC5jZWlsKGEpLF89LTEqTWF0aC5mbG9vcihhKSx3PSIiO3JldHVybiBfPDAmJih3PXMuc3Vic3RyKF8pKSxzLnN1YnN0cigwLHUpK2krd307aWYocy5sZW5ndGg8PW8pcmV0dXJuIHM7dmFyIF89by11LHc9ZnVuY3Rpb24ocyl7dmFyIG89e30saT1zLGE9aS5tYXRjaCgvXihbYS16XSspOlwvXC8vaSk7cmV0dXJuIGEmJihvLnNjaGVtZT1hWzFdLGk9aS5zdWJzdHIoYVswXS5sZW5ndGgpKSwoYT1pLm1hdGNoKC9eKC4qPykoPz0oXD98I3xcL3wkKSkvaSkpJiYoby5ob3N0PWFbMV0saT1pLnN1YnN0cihhWzBdLmxlbmd0aCkpLChhPWkubWF0Y2goL15cLyguKj8pKD89KFw/fCN8JCkpL2kpKSYmKG8ucGF0aD1hWzFdLGk9aS5zdWJzdHIoYVswXS5sZW5ndGgpKSwoYT1pLm1hdGNoKC9eXD8oLio/KSg/PSgjfCQpKS9pKSkmJihvLnF1ZXJ5PWFbMV0saT1pLnN1YnN0cihhWzBdLmxlbmd0aCkpLChhPWkubWF0Y2goL14jKC4qPykkL2kpKSYmKG8uZnJhZ21lbnQ9YVsxXSksb30ocyk7aWYody5xdWVyeSl7dmFyIHg9dy5xdWVyeS5tYXRjaCgvXiguKj8pKD89KFw/fFwjKSkoLio/KSQvaSk7eCYmKHcucXVlcnk9dy5xdWVyeS5zdWJzdHIoMCx4WzFdLmxlbmd0aCkscz1idWlsZFVybCh3KSl9aWYocy5sZW5ndGg8PW8pcmV0dXJuIHM7aWYody5ob3N0JiYody5ob3N0PXcuaG9zdC5yZXBsYWNlKC9ed3d3XC4vLCIiKSxzPWJ1aWxkVXJsKHcpKSxzLmxlbmd0aDw9bylyZXR1cm4gczt2YXIgQz0iIjtpZih3Lmhvc3QmJihDKz13Lmhvc3QpLEMubGVuZ3RoPj1fKXJldHVybiB3Lmhvc3QubGVuZ3RoPT1vPyh3Lmhvc3Quc3Vic3RyKDAsby11KStpKS5zdWJzdHIoMCxfK2EpOmJ1aWxkU2VnbWVudChDLF8pLnN1YnN0cigwLF8rYSk7dmFyIGo9IiI7aWYody5wYXRoJiYoais9Ii8iK3cucGF0aCksdy5xdWVyeSYmKGorPSI/Iit3LnF1ZXJ5KSxqKXtpZigoQytqKS5sZW5ndGg+PV8pcmV0dXJuKEMraikubGVuZ3RoPT1vPyhDK2opLnN1YnN0cigwLG8pOihDK2J1aWxkU2VnbWVudChqLF8tQy5sZW5ndGgpKS5zdWJzdHIoMCxfK2EpO0MrPWp9aWYody5mcmFnbWVudCl7dmFyIEw9IiMiK3cuZnJhZ21lbnQ7aWYoKEMrTCkubGVuZ3RoPj1fKXJldHVybihDK0wpLmxlbmd0aD09bz8oQytMKS5zdWJzdHIoMCxvKTooQytidWlsZFNlZ21lbnQoTCxfLUMubGVuZ3RoKSkuc3Vic3RyKDAsXythKTtDKz1MfWlmKHcuc2NoZW1lJiZ3Lmhvc3Qpe3ZhciBCPXcuc2NoZW1lKyI6Ly8iO2lmKChDK0IpLmxlbmd0aDxfKXJldHVybihCK0MpLnN1YnN0cigwLG8pfWlmKEMubGVuZ3RoPD1vKXJldHVybiBDO3ZhciAkPSIiO3JldHVybiBfPjAmJigkPUMuc3Vic3RyKC0xKk1hdGguZmxvb3IoXy8yKSkpLChDLnN1YnN0cigwLE1hdGguY2VpbChfLzIpKStpKyQpLnN1YnN0cigwLF8rYSl9KHMsaSk6Im1pZGRsZSI9PT1hP2Z1bmN0aW9uIHRydW5jYXRlTWlkZGxlKHMsbyxpKXtpZihzLmxlbmd0aDw9bylyZXR1cm4gczt2YXIgYSx1O251bGw9PWk/KGk9IiZoZWxsaXA7IixhPTgsdT0zKTooYT1pLmxlbmd0aCx1PWkubGVuZ3RoKTt2YXIgXz1vLXUsdz0iIjtyZXR1cm4gXz4wJiYodz1zLnN1YnN0cigtMSpNYXRoLmZsb29yKF8vMikpKSwocy5zdWJzdHIoMCxNYXRoLmNlaWwoXy8yKSkraSt3KS5zdWJzdHIoMCxfK2EpfShzLGkpOmZ1bmN0aW9uIHRydW5jYXRlRW5kKHMsbyxpKXtyZXR1cm4gZnVuY3Rpb24gZWxsaXBzaXMocyxvLGkpe3ZhciBhO3JldHVybiBzLmxlbmd0aD5vJiYobnVsbD09aT8oaT0iJmhlbGxpcDsiLGE9Myk6YT1pLmxlbmd0aCxzPXMuc3Vic3RyaW5nKDAsby1hKStpKSxzfShzLG8saSl9KHMsaSl9LEFuY2hvclRhZ0J1aWxkZXJ9KCksekE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBNYXRjaChzKXt0aGlzLl9fanNkdWNrRHVtbXlEb2NQcm9wPW51bGwsdGhpcy5tYXRjaGVkVGV4dD0iIix0aGlzLm9mZnNldD0wLHRoaXMudGFnQnVpbGRlcj1zLnRhZ0J1aWxkZXIsdGhpcy5tYXRjaGVkVGV4dD1zLm1hdGNoZWRUZXh0LHRoaXMub2Zmc2V0PXMub2Zmc2V0fXJldHVybiBNYXRjaC5wcm90b3R5cGUuZ2V0TWF0Y2hlZFRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaGVkVGV4dH0sTWF0Y2gucHJvdG90eXBlLnNldE9mZnNldD1mdW5jdGlvbihzKXt0aGlzLm9mZnNldD1zfSxNYXRjaC5wcm90b3R5cGUuZ2V0T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2Zmc2V0fSxNYXRjaC5wcm90b3R5cGUuZ2V0Q3NzQ2xhc3NTdWZmaXhlcz1mdW5jdGlvbigpe3JldHVyblt0aGlzLmdldFR5cGUoKV19LE1hdGNoLnByb3RvdHlwZS5idWlsZFRhZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRhZ0J1aWxkZXIuYnVpbGQodGhpcyl9LE1hdGNofSgpLGV4dGVuZFN0YXRpY3M9ZnVuY3Rpb24ocyxvKXtyZXR1cm4gZXh0ZW5kU3RhdGljcz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24ocyxvKXtzLl9fcHJvdG9fXz1vfXx8ZnVuY3Rpb24ocyxvKXtmb3IodmFyIGkgaW4gbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobyxpKSYmKHNbaV09b1tpXSl9LGV4dGVuZFN0YXRpY3MocyxvKX07ZnVuY3Rpb24gdHNsaWJfZXM2X2V4dGVuZHMocyxvKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgbyYmbnVsbCE9PW8pdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSAiK1N0cmluZyhvKSsiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwiKTtmdW5jdGlvbiBfXygpe3RoaXMuY29uc3RydWN0b3I9c31leHRlbmRTdGF0aWNzKHMsbykscy5wcm90b3R5cGU9bnVsbD09PW8/T2JqZWN0LmNyZWF0ZShvKTooX18ucHJvdG90eXBlPW8ucHJvdG90eXBlLG5ldyBfXyl9dmFyIF9fYXNzaWduPWZ1bmN0aW9uKCl7cmV0dXJuIF9fYXNzaWduPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uIF9fYXNzaWduKHMpe2Zvcih2YXIgbyxpPTEsYT1hcmd1bWVudHMubGVuZ3RoO2k8YTtpKyspZm9yKHZhciB1IGluIG89YXJndW1lbnRzW2ldKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLHUpJiYoc1t1XT1vW3VdKTtyZXR1cm4gc30sX19hc3NpZ24uYXBwbHkodGhpcyxhcmd1bWVudHMpfTtPYmplY3QuY3JlYXRlO09iamVjdC5jcmVhdGU7ImZ1bmN0aW9uIj09dHlwZW9mIFN1cHByZXNzZWRFcnJvciYmU3VwcHJlc3NlZEVycm9yO3ZhciBXQSxKQT1mdW5jdGlvbihzKXtmdW5jdGlvbiBFbWFpbE1hdGNoKG8pe3ZhciBpPXMuY2FsbCh0aGlzLG8pfHx0aGlzO3JldHVybiBpLmVtYWlsPSIiLGkuZW1haWw9by5lbWFpbCxpfXJldHVybiB0c2xpYl9lczZfZXh0ZW5kcyhFbWFpbE1hdGNoLHMpLEVtYWlsTWF0Y2gucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iZW1haWwifSxFbWFpbE1hdGNoLnByb3RvdHlwZS5nZXRFbWFpbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVtYWlsfSxFbWFpbE1hdGNoLnByb3RvdHlwZS5nZXRBbmNob3JIcmVmPWZ1bmN0aW9uKCl7cmV0dXJuIm1haWx0bzoiK3RoaXMuZW1haWx9LEVtYWlsTWF0Y2gucHJvdG90eXBlLmdldEFuY2hvclRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbWFpbH0sRW1haWxNYXRjaH0oekEpLEhBPWZ1bmN0aW9uKHMpe2Z1bmN0aW9uIEhhc2h0YWdNYXRjaChvKXt2YXIgaT1zLmNhbGwodGhpcyxvKXx8dGhpcztyZXR1cm4gaS5zZXJ2aWNlTmFtZT0iIixpLmhhc2h0YWc9IiIsaS5zZXJ2aWNlTmFtZT1vLnNlcnZpY2VOYW1lLGkuaGFzaHRhZz1vLmhhc2h0YWcsaX1yZXR1cm4gdHNsaWJfZXM2X2V4dGVuZHMoSGFzaHRhZ01hdGNoLHMpLEhhc2h0YWdNYXRjaC5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiJoYXNodGFnIn0sSGFzaHRhZ01hdGNoLnByb3RvdHlwZS5nZXRTZXJ2aWNlTmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlcnZpY2VOYW1lfSxIYXNodGFnTWF0Y2gucHJvdG90eXBlLmdldEhhc2h0YWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNodGFnfSxIYXNodGFnTWF0Y2gucHJvdG90eXBlLmdldEFuY2hvckhyZWY9ZnVuY3Rpb24oKXt2YXIgcz10aGlzLnNlcnZpY2VOYW1lLG89dGhpcy5oYXNodGFnO3N3aXRjaChzKXtjYXNlInR3aXR0ZXIiOnJldHVybiJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvIitvO2Nhc2UiZmFjZWJvb2siOnJldHVybiJodHRwczovL3d3dy5mYWNlYm9vay5jb20vaGFzaHRhZy8iK287Y2FzZSJpbnN0YWdyYW0iOnJldHVybiJodHRwczovL2luc3RhZ3JhbS5jb20vZXhwbG9yZS90YWdzLyIrbztjYXNlInRpa3RvayI6cmV0dXJuImh0dHBzOi8vd3d3LnRpa3Rvay5jb20vdGFnLyIrbztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBzZXJ2aWNlIG5hbWUgdG8gcG9pbnQgaGFzaHRhZyB0bzogIitzKX19LEhhc2h0YWdNYXRjaC5wcm90b3R5cGUuZ2V0QW5jaG9yVGV4dD1mdW5jdGlvbigpe3JldHVybiIjIit0aGlzLmhhc2h0YWd9LEhhc2h0YWdNYXRjaH0oekEpLEtBPWZ1bmN0aW9uKHMpe2Z1bmN0aW9uIE1lbnRpb25NYXRjaChvKXt2YXIgaT1zLmNhbGwodGhpcyxvKXx8dGhpcztyZXR1cm4gaS5zZXJ2aWNlTmFtZT0idHdpdHRlciIsaS5tZW50aW9uPSIiLGkubWVudGlvbj1vLm1lbnRpb24saS5zZXJ2aWNlTmFtZT1vLnNlcnZpY2VOYW1lLGl9cmV0dXJuIHRzbGliX2VzNl9leHRlbmRzKE1lbnRpb25NYXRjaCxzKSxNZW50aW9uTWF0Y2gucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4ibWVudGlvbiJ9LE1lbnRpb25NYXRjaC5wcm90b3R5cGUuZ2V0TWVudGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnRpb259LE1lbnRpb25NYXRjaC5wcm90b3R5cGUuZ2V0U2VydmljZU5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXJ2aWNlTmFtZX0sTWVudGlvbk1hdGNoLnByb3RvdHlwZS5nZXRBbmNob3JIcmVmPWZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuc2VydmljZU5hbWUpe2Nhc2UidHdpdHRlciI6cmV0dXJuImh0dHBzOi8vdHdpdHRlci5jb20vIit0aGlzLm1lbnRpb247Y2FzZSJpbnN0YWdyYW0iOnJldHVybiJodHRwczovL2luc3RhZ3JhbS5jb20vIit0aGlzLm1lbnRpb247Y2FzZSJzb3VuZGNsb3VkIjpyZXR1cm4iaHR0cHM6Ly9zb3VuZGNsb3VkLmNvbS8iK3RoaXMubWVudGlvbjtjYXNlInRpa3RvayI6cmV0dXJuImh0dHBzOi8vd3d3LnRpa3Rvay5jb20vQCIrdGhpcy5tZW50aW9uO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHNlcnZpY2UgbmFtZSB0byBwb2ludCBtZW50aW9uIHRvOiAiK3RoaXMuc2VydmljZU5hbWUpfX0sTWVudGlvbk1hdGNoLnByb3RvdHlwZS5nZXRBbmNob3JUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIkAiK3RoaXMubWVudGlvbn0sTWVudGlvbk1hdGNoLnByb3RvdHlwZS5nZXRDc3NDbGFzc1N1ZmZpeGVzPWZ1bmN0aW9uKCl7dmFyIG89cy5wcm90b3R5cGUuZ2V0Q3NzQ2xhc3NTdWZmaXhlcy5jYWxsKHRoaXMpLGk9dGhpcy5nZXRTZXJ2aWNlTmFtZSgpO3JldHVybiBpJiZvLnB1c2goaSksb30sTWVudGlvbk1hdGNofSh6QSksR0E9ZnVuY3Rpb24ocyl7ZnVuY3Rpb24gUGhvbmVNYXRjaChvKXt2YXIgaT1zLmNhbGwodGhpcyxvKXx8dGhpcztyZXR1cm4gaS5udW1iZXI9IiIsaS5wbHVzU2lnbj0hMSxpLm51bWJlcj1vLm51bWJlcixpLnBsdXNTaWduPW8ucGx1c1NpZ24saX1yZXR1cm4gdHNsaWJfZXM2X2V4dGVuZHMoUGhvbmVNYXRjaCxzKSxQaG9uZU1hdGNoLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuInBob25lIn0sUGhvbmVNYXRjaC5wcm90b3R5cGUuZ2V0UGhvbmVOdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5udW1iZXJ9LFBob25lTWF0Y2gucHJvdG90eXBlLmdldE51bWJlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBob25lTnVtYmVyKCl9LFBob25lTWF0Y2gucHJvdG90eXBlLmdldEFuY2hvckhyZWY9ZnVuY3Rpb24oKXtyZXR1cm4idGVsOiIrKHRoaXMucGx1c1NpZ24/IisiOiIiKSt0aGlzLm51bWJlcn0sUGhvbmVNYXRjaC5wcm90b3R5cGUuZ2V0QW5jaG9yVGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZWRUZXh0fSxQaG9uZU1hdGNofSh6QSksWUE9ZnVuY3Rpb24ocyl7ZnVuY3Rpb24gVXJsTWF0Y2gobyl7dmFyIGk9cy5jYWxsKHRoaXMsbyl8fHRoaXM7cmV0dXJuIGkudXJsPSIiLGkudXJsTWF0Y2hUeXBlPSJzY2hlbWUiLGkucHJvdG9jb2xVcmxNYXRjaD0hMSxpLnByb3RvY29sUmVsYXRpdmVNYXRjaD0hMSxpLnN0cmlwUHJlZml4PXtzY2hlbWU6ITAsd3d3OiEwfSxpLnN0cmlwVHJhaWxpbmdTbGFzaD0hMCxpLmRlY29kZVBlcmNlbnRFbmNvZGluZz0hMCxpLnNjaGVtZVByZWZpeFJlZ2V4PS9eKGh0dHBzPzpcL1wvKT8vaSxpLnd3d1ByZWZpeFJlZ2V4PS9eKGh0dHBzPzpcL1wvKT8od3d3XC4pPy9pLGkucHJvdG9jb2xSZWxhdGl2ZVJlZ2V4PS9eXC9cLy8saS5wcm90b2NvbFByZXBlbmRlZD0hMSxpLnVybE1hdGNoVHlwZT1vLnVybE1hdGNoVHlwZSxpLnVybD1vLnVybCxpLnByb3RvY29sVXJsTWF0Y2g9by5wcm90b2NvbFVybE1hdGNoLGkucHJvdG9jb2xSZWxhdGl2ZU1hdGNoPW8ucHJvdG9jb2xSZWxhdGl2ZU1hdGNoLGkuc3RyaXBQcmVmaXg9by5zdHJpcFByZWZpeCxpLnN0cmlwVHJhaWxpbmdTbGFzaD1vLnN0cmlwVHJhaWxpbmdTbGFzaCxpLmRlY29kZVBlcmNlbnRFbmNvZGluZz1vLmRlY29kZVBlcmNlbnRFbmNvZGluZyxpfXJldHVybiB0c2xpYl9lczZfZXh0ZW5kcyhVcmxNYXRjaCxzKSxVcmxNYXRjaC5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiJ1cmwifSxVcmxNYXRjaC5wcm90b3R5cGUuZ2V0VXJsTWF0Y2hUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXJsTWF0Y2hUeXBlfSxVcmxNYXRjaC5wcm90b3R5cGUuZ2V0VXJsPWZ1bmN0aW9uKCl7dmFyIHM9dGhpcy51cmw7cmV0dXJuIHRoaXMucHJvdG9jb2xSZWxhdGl2ZU1hdGNofHx0aGlzLnByb3RvY29sVXJsTWF0Y2h8fHRoaXMucHJvdG9jb2xQcmVwZW5kZWR8fChzPXRoaXMudXJsPSJodHRwOi8vIitzLHRoaXMucHJvdG9jb2xQcmVwZW5kZWQ9ITApLHN9LFVybE1hdGNoLnByb3RvdHlwZS5nZXRBbmNob3JIcmVmPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VXJsKCkucmVwbGFjZSgvJmFtcDsvZywiJiIpfSxVcmxNYXRjaC5wcm90b3R5cGUuZ2V0QW5jaG9yVGV4dD1mdW5jdGlvbigpe3ZhciBzPXRoaXMuZ2V0TWF0Y2hlZFRleHQoKTtyZXR1cm4gdGhpcy5wcm90b2NvbFJlbGF0aXZlTWF0Y2gmJihzPXRoaXMuc3RyaXBQcm90b2NvbFJlbGF0aXZlUHJlZml4KHMpKSx0aGlzLnN0cmlwUHJlZml4LnNjaGVtZSYmKHM9dGhpcy5zdHJpcFNjaGVtZVByZWZpeChzKSksdGhpcy5zdHJpcFByZWZpeC53d3cmJihzPXRoaXMuc3RyaXBXd3dQcmVmaXgocykpLHRoaXMuc3RyaXBUcmFpbGluZ1NsYXNoJiYocz10aGlzLnJlbW92ZVRyYWlsaW5nU2xhc2gocykpLHRoaXMuZGVjb2RlUGVyY2VudEVuY29kaW5nJiYocz10aGlzLnJlbW92ZVBlcmNlbnRFbmNvZGluZyhzKSksc30sVXJsTWF0Y2gucHJvdG90eXBlLnN0cmlwU2NoZW1lUHJlZml4PWZ1bmN0aW9uKHMpe3JldHVybiBzLnJlcGxhY2UodGhpcy5zY2hlbWVQcmVmaXhSZWdleCwiIil9LFVybE1hdGNoLnByb3RvdHlwZS5zdHJpcFd3d1ByZWZpeD1mdW5jdGlvbihzKXtyZXR1cm4gcy5yZXBsYWNlKHRoaXMud3d3UHJlZml4UmVnZXgsIiQxIil9LFVybE1hdGNoLnByb3RvdHlwZS5zdHJpcFByb3RvY29sUmVsYXRpdmVQcmVmaXg9ZnVuY3Rpb24ocyl7cmV0dXJuIHMucmVwbGFjZSh0aGlzLnByb3RvY29sUmVsYXRpdmVSZWdleCwiIil9LFVybE1hdGNoLnByb3RvdHlwZS5yZW1vdmVUcmFpbGluZ1NsYXNoPWZ1bmN0aW9uKHMpe3JldHVybiIvIj09PXMuY2hhckF0KHMubGVuZ3RoLTEpJiYocz1zLnNsaWNlKDAsLTEpKSxzfSxVcmxNYXRjaC5wcm90b3R5cGUucmVtb3ZlUGVyY2VudEVuY29kaW5nPWZ1bmN0aW9uKHMpe3ZhciBvPXMucmVwbGFjZSgvJTIyL2dpLCImcXVvdDsiKS5yZXBsYWNlKC8lMjYvZ2ksIiZhbXA7IikucmVwbGFjZSgvJTI3L2dpLCImIzM5OyIpLnJlcGxhY2UoLyUzQy9naSwiJmx0OyIpLnJlcGxhY2UoLyUzRS9naSwiJmd0OyIpO3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KG8pfWNhdGNoKHMpe3JldHVybiBvfX0sVXJsTWF0Y2h9KHpBKSxYQT1mdW5jdGlvbiBYQShzKXt0aGlzLl9fanNkdWNrRHVtbXlEb2NQcm9wPW51bGwsdGhpcy50YWdCdWlsZGVyPXMudGFnQnVpbGRlcn0sUUE9L1tBLVphLXpdLyxaQT0vW1xkXS8sZUM9L1tcRF0vLHRDPS9ccy8sckM9L1snIl0vLG5DPS9bXHgwMC1ceDFGXHg3Rl0vLHNDPS9BLVphLXpceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg3XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDhBMC1cdTA4QjRcdTA4QjYtXHUwOEJEXHUwOTA0LVx1MDkzOVx1MDkzRFx1MDk1MFx1MDk1OC1cdTA5NjFcdTA5NzEtXHUwOTgwXHUwOTg1LVx1MDk4Q1x1MDk4Rlx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlCRFx1MDlDRVx1MDlEQ1x1MDlERFx1MDlERi1cdTA5RTFcdTA5RjBcdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzJcdTBBMzNcdTBBMzVcdTBBMzZcdTBBMzhcdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjJcdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUQwXHUwQUUwXHUwQUUxXHUwQUY5XHUwQjA1LVx1MEIwQ1x1MEIwRlx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyXHUwQjMzXHUwQjM1LVx1MEIzOVx1MEIzRFx1MEI1Q1x1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCNzFcdTBCODNcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTlcdTBCOUFcdTBCOUNcdTBCOUVcdTBCOUZcdTBCQTNcdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCOVx1MEJEMFx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzlcdTBDM0RcdTBDNTgtXHUwQzVBXHUwQzYwXHUwQzYxXHUwQzgwXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDQkRcdTBDREVcdTBDRTBcdTBDRTFcdTBDRjFcdTBDRjJcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEM0FcdTBEM0RcdTBENEVcdTBENTQtXHUwRDU2XHUwRDVGLVx1MEQ2MVx1MEQ3QS1cdTBEN0ZcdTBEODUtXHUwRDk2XHUwRDlBLVx1MERCMVx1MERCMy1cdTBEQkJcdTBEQkRcdTBEQzAtXHUwREM2XHUwRTAxLVx1MEUzMFx1MEUzMlx1MEUzM1x1MEU0MC1cdTBFNDZcdTBFODFcdTBFODJcdTBFODRcdTBFODdcdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUFcdTBFQUJcdTBFQUQtXHUwRUIwXHUwRUIyXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVEQy1cdTBFREZcdTBGMDBcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY4OC1cdTBGOENcdTEwMDAtXHUxMDJBXHUxMDNGXHUxMDUwLVx1MTA1NVx1MTA1QS1cdTEwNURcdTEwNjFcdTEwNjVcdTEwNjZcdTEwNkUtXHUxMDcwXHUxMDc1LVx1MTA4MVx1MTA4RVx1MTBBMC1cdTEwQzVcdTEwQzdcdTEwQ0RcdTEwRDAtXHUxMEZBXHUxMEZDLVx1MTI0OFx1MTI0QS1cdTEyNERcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVBLVx1MTI1RFx1MTI2MC1cdTEyODhcdTEyOEEtXHUxMjhEXHUxMjkwLVx1MTJCMFx1MTJCMi1cdTEyQjVcdTEyQjgtXHUxMkJFXHUxMkMwXHUxMkMyLVx1MTJDNVx1MTJDOC1cdTEyRDZcdTEyRDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNUFcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkYxLVx1MTZGOFx1MTcwMC1cdTE3MENcdTE3MEUtXHUxNzExXHUxNzIwLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc3XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRCXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQ0U5LVx1MUNFQ1x1MUNFRS1cdTFDRjFcdTFDRjVcdTFDRjZcdTFEMDAtXHUxREJGXHUxRTAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMDcxXHUyMDdGXHUyMDkwLVx1MjA5Q1x1MjEwMlx1MjEwN1x1MjEwQS1cdTIxMTNcdTIxMTVcdTIxMTktXHUyMTFEXHUyMTI0XHUyMTI2XHUyMTI4XHUyMTJBLVx1MjEyRFx1MjEyRi1cdTIxMzlcdTIxM0MtXHUyMTNGXHUyMTQ1LVx1MjE0OVx1MjE0RVx1MjE4M1x1MjE4NFx1MkMwMC1cdTJDMkVcdTJDMzAtXHUyQzVFXHUyQzYwLVx1MkNFNFx1MkNFQi1cdTJDRUVcdTJDRjJcdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ4MC1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkUyRlx1MzAwNVx1MzAwNlx1MzAzMS1cdTMwMzVcdTMwM0JcdTMwM0NcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkMtXHUzMEZGXHUzMTA1LVx1MzEyRFx1MzEzMS1cdTMxOEVcdTMxQTAtXHUzMUJBXHUzMUYwLVx1MzFGRlx1MzQwMC1cdTREQjVcdTRFMDAtXHU5RkQ1XHVBMDAwLVx1QTQ4Q1x1QTREMC1cdUE0RkRcdUE1MDAtXHVBNjBDXHVBNjEwLVx1QTYxRlx1QTYyQVx1QTYyQlx1QTY0MC1cdUE2NkVcdUE2N0YtXHVBNjlEXHVBNkEwLVx1QTZFNVx1QTcxNy1cdUE3MUZcdUE3MjItXHVBNzg4XHVBNzhCLVx1QTdBRVx1QTdCMC1cdUE3QjdcdUE3RjctXHVBODAxXHVBODAzLVx1QTgwNVx1QTgwNy1cdUE4MEFcdUE4MEMtXHVBODIyXHVBODQwLVx1QTg3M1x1QTg4Mi1cdUE4QjNcdUE4RjItXHVBOEY3XHVBOEZCXHVBOEZEXHVBOTBBLVx1QTkyNVx1QTkzMC1cdUE5NDZcdUE5NjAtXHVBOTdDXHVBOTg0LVx1QTlCMlx1QTlDRlx1QTlFMC1cdUE5RTRcdUE5RTYtXHVBOUVGXHVBOUZBLVx1QTlGRVx1QUEwMC1cdUFBMjhcdUFBNDAtXHVBQTQyXHVBQTQ0LVx1QUE0Qlx1QUE2MC1cdUFBNzZcdUFBN0FcdUFBN0UtXHVBQUFGXHVBQUIxXHVBQUI1XHVBQUI2XHVBQUI5LVx1QUFCRFx1QUFDMFx1QUFDMlx1QUFEQi1cdUFBRERcdUFBRTAtXHVBQUVBXHVBQUYyLVx1QUFGNFx1QUIwMS1cdUFCMDZcdUFCMDktXHVBQjBFXHVBQjExLVx1QUIxNlx1QUIyMC1cdUFCMjZcdUFCMjgtXHVBQjJFXHVBQjMwLVx1QUI1QVx1QUI1Qy1cdUFCNjVcdUFCNzAtXHVBQkUyXHVBQzAwLVx1RDdBM1x1RDdCMC1cdUQ3QzZcdUQ3Q0ItXHVEN0ZCXHVGOTAwLVx1RkE2RFx1RkE3MC1cdUZBRDlcdUZCMDAtXHVGQjA2XHVGQjEzLVx1RkIxN1x1RkIxRFx1RkIxRi1cdUZCMjhcdUZCMkEtXHVGQjM2XHVGQjM4LVx1RkIzQ1x1RkIzRVx1RkI0MFx1RkI0MVx1RkI0M1x1RkI0NFx1RkI0Ni1cdUZCQjFcdUZCRDMtXHVGRDNEXHVGRDUwLVx1RkQ4Rlx1RkQ5Mi1cdUZEQzdcdUZERjAtXHVGREZCXHVGRTcwLVx1RkU3NFx1RkU3Ni1cdUZFRkNcdUZGMjEtXHVGRjNBXHVGRjQxLVx1RkY1QVx1RkY2Ni1cdUZGQkVcdUZGQzItXHVGRkM3XHVGRkNBLVx1RkZDRlx1RkZEMi1cdUZGRDdcdUZGREEtXHVGRkRDLy5zb3VyY2Usb0M9c0MrL1x1MjcwMC1cdTI3YmZcdWRkZTYtXHVkZGZmXHVkODAwLVx1ZGJmZlx1ZGMwMC1cdWRmZmZcdWZlMGVcdWZlMGZcdTAzMDAtXHUwMzZmXHVmZTIwLVx1ZmUyM1x1MjBkMC1cdTIwZjBcdWQ4M2NcdWRmZmItXHVkZmZmXHUyMDBkXHUzMjk5XHUzMjk3XHUzMDNkXHUzMDMwXHUyNGMyXHVkODNjXHVkZDcwLVx1ZGQ3MVx1ZGQ3ZS1cdWRkN2ZcdWRkOGVcdWRkOTEtXHVkZDlhXHVkZGU2LVx1ZGRmZlx1ZGUwMS1cdWRlMDJcdWRlMWFcdWRlMmZcdWRlMzItXHVkZTNhXHVkZTUwLVx1ZGU1MVx1MjAzY1x1MjA0OVx1MjVhYS1cdTI1YWJcdTI1YjZcdTI1YzBcdTI1ZmItXHUyNWZlXHUwMGE5XHUwMGFlXHUyMTIyXHUyMTM5XHVkYzA0XHUyNjAwLVx1MjZGRlx1MmIwNVx1MmIwNlx1MmIwN1x1MmIxYlx1MmIxY1x1MmI1MFx1MmI1NVx1MjMxYVx1MjMxYlx1MjMyOFx1MjNjZlx1MjNlOS1cdTIzZjNcdTIzZjgtXHUyM2ZhXHVkY2NmXHUyOTM1XHUyOTM0XHUyMTkwLVx1MjFmZi8uc291cmNlKy9cdTAzMDAtXHUwMzZGXHUwNDgzLVx1MDQ4OVx1MDU5MS1cdTA1QkRcdTA1QkZcdTA1QzFcdTA1QzJcdTA1QzRcdTA1QzVcdTA1QzdcdTA2MTAtXHUwNjFBXHUwNjRCLVx1MDY1Rlx1MDY3MFx1MDZENi1cdTA2RENcdTA2REYtXHUwNkU0XHUwNkU3XHUwNkU4XHUwNkVBLVx1MDZFRFx1MDcxMVx1MDczMC1cdTA3NEFcdTA3QTYtXHUwN0IwXHUwN0VCLVx1MDdGM1x1MDgxNi1cdTA4MTlcdTA4MUItXHUwODIzXHUwODI1LVx1MDgyN1x1MDgyOS1cdTA4MkRcdTA4NTktXHUwODVCXHUwOEQ0LVx1MDhFMVx1MDhFMy1cdTA5MDNcdTA5M0EtXHUwOTNDXHUwOTNFLVx1MDk0Rlx1MDk1MS1cdTA5NTdcdTA5NjJcdTA5NjNcdTA5ODEtXHUwOTgzXHUwOUJDXHUwOUJFLVx1MDlDNFx1MDlDN1x1MDlDOFx1MDlDQi1cdTA5Q0RcdTA5RDdcdTA5RTJcdTA5RTNcdTBBMDEtXHUwQTAzXHUwQTNDXHUwQTNFLVx1MEE0Mlx1MEE0N1x1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNTFcdTBBNzBcdTBBNzFcdTBBNzVcdTBBODEtXHUwQTgzXHUwQUJDXHUwQUJFLVx1MEFDNVx1MEFDNy1cdTBBQzlcdTBBQ0ItXHUwQUNEXHUwQUUyXHUwQUUzXHUwQjAxLVx1MEIwM1x1MEIzQ1x1MEIzRS1cdTBCNDRcdTBCNDdcdTBCNDhcdTBCNEItXHUwQjREXHUwQjU2XHUwQjU3XHUwQjYyXHUwQjYzXHUwQjgyXHUwQkJFLVx1MEJDMlx1MEJDNi1cdTBCQzhcdTBCQ0EtXHUwQkNEXHUwQkQ3XHUwQzAwLVx1MEMwM1x1MEMzRS1cdTBDNDRcdTBDNDYtXHUwQzQ4XHUwQzRBLVx1MEM0RFx1MEM1NVx1MEM1Nlx1MEM2Mlx1MEM2M1x1MEM4MS1cdTBDODNcdTBDQkNcdTBDQkUtXHUwQ0M0XHUwQ0M2LVx1MENDOFx1MENDQS1cdTBDQ0RcdTBDRDVcdTBDRDZcdTBDRTJcdTBDRTNcdTBEMDEtXHUwRDAzXHUwRDNFLVx1MEQ0NFx1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRDYyXHUwRDYzXHUwRDgyXHUwRDgzXHUwRENBXHUwRENGLVx1MERENFx1MERENlx1MEREOC1cdTBEREZcdTBERjJcdTBERjNcdTBFMzFcdTBFMzQtXHUwRTNBXHUwRTQ3LVx1MEU0RVx1MEVCMVx1MEVCNC1cdTBFQjlcdTBFQkJcdTBFQkNcdTBFQzgtXHUwRUNEXHUwRjE4XHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Nlx1MEY4N1x1MEY4RC1cdTBGOTdcdTBGOTktXHUwRkJDXHUwRkM2XHUxMDJCLVx1MTAzRVx1MTA1Ni1cdTEwNTlcdTEwNUUtXHUxMDYwXHUxMDYyLVx1MTA2NFx1MTA2Ny1cdTEwNkRcdTEwNzEtXHUxMDc0XHUxMDgyLVx1MTA4RFx1MTA4Rlx1MTA5QS1cdTEwOURcdTEzNUQtXHUxMzVGXHUxNzEyLVx1MTcxNFx1MTczMi1cdTE3MzRcdTE3NTJcdTE3NTNcdTE3NzJcdTE3NzNcdTE3QjQtXHUxN0QzXHUxN0REXHUxODBCLVx1MTgwRFx1MTg4NVx1MTg4Nlx1MThBOVx1MTkyMC1cdTE5MkJcdTE5MzAtXHUxOTNCXHUxQTE3LVx1MUExQlx1MUE1NS1cdTFBNUVcdTFBNjAtXHUxQTdDXHUxQTdGXHUxQUIwLVx1MUFCRVx1MUIwMC1cdTFCMDRcdTFCMzQtXHUxQjQ0XHUxQjZCLVx1MUI3M1x1MUI4MC1cdTFCODJcdTFCQTEtXHUxQkFEXHUxQkU2LVx1MUJGM1x1MUMyNC1cdTFDMzdcdTFDRDAtXHUxQ0QyXHUxQ0Q0LVx1MUNFOFx1MUNFRFx1MUNGMi1cdTFDRjRcdTFDRjhcdTFDRjlcdTFEQzAtXHUxREY1XHUxREZCLVx1MURGRlx1MjBEMC1cdTIwRjBcdTJDRUYtXHUyQ0YxXHUyRDdGXHUyREUwLVx1MkRGRlx1MzAyQS1cdTMwMkZcdTMwOTlcdTMwOUFcdUE2NkYtXHVBNjcyXHVBNjc0LVx1QTY3RFx1QTY5RVx1QTY5Rlx1QTZGMFx1QTZGMVx1QTgwMlx1QTgwNlx1QTgwQlx1QTgyMy1cdUE4MjdcdUE4ODBcdUE4ODFcdUE4QjQtXHVBOEM1XHVBOEUwLVx1QThGMVx1QTkyNi1cdUE5MkRcdUE5NDctXHVBOTUzXHVBOTgwLVx1QTk4M1x1QTlCMy1cdUE5QzBcdUE5RTVcdUFBMjktXHVBQTM2XHVBQTQzXHVBQTRDXHVBQTREXHVBQTdCLVx1QUE3RFx1QUFCMFx1QUFCMi1cdUFBQjRcdUFBQjdcdUFBQjhcdUFBQkVcdUFBQkZcdUFBQzFcdUFBRUItXHVBQUVGXHVBQUY1XHVBQUY2XHVBQkUzLVx1QUJFQVx1QUJFQ1x1QUJFRFx1RkIxRVx1RkUwMC1cdUZFMEZcdUZFMjAtXHVGRTJGLy5zb3VyY2UsaUM9LzAtOVx1MDY2MC1cdTA2NjlcdTA2RjAtXHUwNkY5XHUwN0MwLVx1MDdDOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU2LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MERFNi1cdTBERUZcdTBFNTAtXHUwRTU5XHUwRUQwLVx1MEVEOVx1MEYyMC1cdTBGMjlcdTEwNDAtXHUxMDQ5XHUxMDkwLVx1MTA5OVx1MTdFMC1cdTE3RTlcdTE4MTAtXHUxODE5XHUxOTQ2LVx1MTk0Rlx1MTlEMC1cdTE5RDlcdTFBODAtXHUxQTg5XHUxQTkwLVx1MUE5OVx1MUI1MC1cdTFCNTlcdTFCQjAtXHUxQkI5XHUxQzQwLVx1MUM0OVx1MUM1MC1cdTFDNTlcdUE2MjAtXHVBNjI5XHVBOEQwLVx1QThEOVx1QTkwMC1cdUE5MDlcdUE5RDAtXHVBOUQ5XHVBOUYwLVx1QTlGOVx1QUE1MC1cdUFBNTlcdUFCRjAtXHVBQkY5XHVGRjEwLVx1RkYxOS8uc291cmNlLGFDPW9DK2lDLGNDPW9DK2lDLGxDPW5ldyBSZWdFeHAoIlsiLmNvbmNhdChjQywiXSIpKSx1Qz0iKD86WyIraUMrIl17MSwzfVxcLil7M31bIitpQysiXXsxLDN9IixwQz0iWyIrY0MrIl0oPzpbIitjQysiXFwtX117MCw2MX1bIitjQysiXSk/IixnZXREb21haW5MYWJlbFN0cj1mdW5jdGlvbihzKXtyZXR1cm4iKD89KCIrcEMrIikpXFwiK3N9LGdldERvbWFpbk5hbWVTdHI9ZnVuY3Rpb24ocyl7cmV0dXJuIig/OiIrZ2V0RG9tYWluTGFiZWxTdHIocykrIig/OlxcLiIrZ2V0RG9tYWluTGFiZWxTdHIocysxKSsiKXswLDEyNn18Iit1QysiKSJ9LGhDPShuZXcgUmVnRXhwKCJbIitjQysiLlxcLV0qWyIrY0MrIlxcLV0iKSxsQyksZEM9Lyg/OnhuLS12ZXJtZ2Vuc2JlcmF0dW5nLXB3Ynx4bi0tdmVybWdlbnNiZXJhdGVyLWN0Ynx4bi0tY2xjaGMwZWEwYjJnMmE5Z2NkfHhuLS13NHI4NWVsOGZodTVkbnJhfG5vcnRod2VzdGVybm11dHVhbHx0cmF2ZWxlcnNpbnN1cmFuY2V8dmVybcO2Z2Vuc2JlcmF0dW5nfHhuLS01c3UzNGo5MzZiZ3NnfHhuLS1iY2sxYjlhNWRyZTRjfHhuLS1tZ2JhaDFhM2hqa3JkfHhuLS1tZ2JhaTlhemdxcDZqfHhuLS1tZ2JlcnA0YTVkNGFyfHhuLS14a2MyZGwzYTVlZTBofHZlcm3DtmdlbnNiZXJhdGVyfHhuLS1menlzOGQ2OXV2Z218eG4tLW1nYmE3YzBiYm4wYXx4bi0tbWdiY3BxNmdwYTFhfHhuLS14a2MyYWwzaHllMmF8YW1lcmljYW5leHByZXNzfGtlcnJ5cHJvcGVydGllc3xzYW5kdmlrY29yb21hbnR8eG4tLWkxYjZiMWE2YTJlfHhuLS1rY3J4NzdkMXg0YXx4bi0tbGdiYmF0MWFkOGp8eG4tLW1nYmEzYTRmMTZhfHhuLS1tZ2JhYWtjN2R2Znx4bi0tbWdiYzBhOWF6Y2d8eG4tLW5xdjdmczAwZW1hfGFtZXJpY2FuZmFtaWx5fGJhbmFuYXJlcHVibGljfGNhbmNlcnJlc2VhcmNofGNvb2tpbmdjaGFubmVsfGtlcnJ5bG9naXN0aWNzfHdlYXRoZXJjaGFubmVsfHhuLS01NGI3ZnRhMGNjfHhuLS02cXE5ODZiM3hsfHhuLS04MGFxZWNkcjFhfHhuLS1iNHc2MDVmZXJkfHhuLS1maXEyMjhjNWhzfHhuLS1oMmJyZWczZXZlfHhuLS1qbHE0ODBuMnJnfHhuLS1qbHE2MXU5dzdifHhuLS1tZ2JhM2EzZWp0fHhuLS1tZ2JhYW03YThofHhuLS1tZ2JheWg3Z3BhfHhuLS1tZ2JiaDFhNzFlfHhuLS1tZ2JjYTdkemRvfHhuLS1tZ2JpNGVjZXhwfHhuLS1tZ2J4NGNkMGFifHhuLS1ydmMxZTBhbTNlfGludGVybmF0aW9uYWx8bGlmZWluc3VyYW5jZXx0cmF2ZWxjaGFubmVsfHdvbHRlcnNrbHV3ZXJ8eG4tLWNja3djeGV0ZHx4bi0tZWNrdmR0YzlkfHhuLS1mcGNyajljM2R8eG4tLWZ6YzJjOWUyY3x4bi0taDJicmo5YzhjfHhuLS10aXE0OXhxeWp8eG4tLXlmcm80aTY3b3x4bi0teWdiaTJhbW14fGNvbnN0cnVjdGlvbnxscGxmaW5hbmNpYWx8c2Nob2xhcnNoaXBzfHZlcnNpY2hlcnVuZ3x4bi0tM2UwYjcwN2V8eG4tLTQ1YnI1Y3lsfHhuLS00ZGJyazBjZXx4bi0tODBhZHhoa3N8eG4tLTgwYXNlaGRifHhuLS04eTBhMDYzYXx4bi0tZ2NrcjNmMGZ8eG4tLW1nYjlhd2JmfHhuLS1tZ2JhYjJiZHx4bi0tbWdiZ3U4MmF8eG4tLW1nYnBsMmZofHhuLS1tZ2J0M2RoZHx4bi0tbWsxYnU0NGN8eG4tLW5nYmM1YXpkfHhuLS1uZ2JlOWUwYXx4bi0tb2dicGY4Zmx8eG4tLXFja2ExcG1jfGFjY291bnRhbnRzfGJhcmNsYXljYXJkfGJsYWNrZnJpZGF5fGJsb2NrYnVzdGVyfGJyaWRnZXN0b25lfGNhbHZpbmtsZWlufGNvbnRyYWN0b3JzfGNyZWRpdHVuaW9ufGVuZ2luZWVyaW5nfGVudGVycHJpc2VzfGZvb2RuZXR3b3JrfGludmVzdG1lbnRzfGtlcnJ5aG90ZWxzfGxhbWJvcmdoaW5pfG1vdG9yY3ljbGVzfG9sYXlhbmdyb3VwfHBob3RvZ3JhcGh5fHBsYXlzdGF0aW9ufHByb2R1Y3Rpb25zfHByb2dyZXNzaXZlfHJlZHVtYnJlbGxhfHdpbGxpYW1oaWxsfHhuLS0xMWI0YzNkfHhuLS0xY2syZTFifHhuLS0xcXF3MjNhfHhuLS0yc2NyajljfHhuLS0zYnN0MDBtfHhuLS0zZHM0NDNnfHhuLS0zaGNyajljfHhuLS00MmMyZDlhfHhuLS00NWJyajljfHhuLS01NXF3NDJnfHhuLS02ZnJ6ODJnfHhuLS04MGFvMjFhfHhuLS05a3J0MDBhfHhuLS1jY2syYjNifHhuLS1jenI2OTRifHhuLS1kMWFjajNifHhuLS1lZnZ5ODhofHhuLS1mY3Q0MjlrfHhuLS1manE3MjBhfHhuLS1mbHczNTFlfHhuLS1nMnh4NDhjfHhuLS1nZWNyajljfHhuLS1nazNhdDFlfHhuLS1oMmJyajljfHhuLS1oeHQ4MTRlfHhuLS1pbXI1MTNufHhuLS1qNncxOTNnfHhuLS1qdnIxODltfHhuLS1rcHJ3MTNkfHhuLS1rcHJ5NTdkfHhuLS1tZ2JiaDFhfHhuLS1tZ2J0eDJifHhuLS1taXg4OTFmfHhuLS1ueXF5MjZhfHhuLS1vdHU3OTZkfHhuLS1wZ2JzMGRofHhuLS1xOWp5YjRjfHhuLS1yaHF2OTZnfHhuLS1yb3Z1ODhifHhuLS1zOWJyajljfHhuLS1zZXM1NTRnfHhuLS10NjBiNTZhfHhuLS12dXE4NjFifHhuLS13NHJzNDBsfHhuLS14aHE1MjFifHhuLS16ZnIxNjRifOCumuCuv+CumeCvjeCuleCuquCvjeCuquCvguCusOCvjXxhY2NvdW50YW50fGFwYXJ0bWVudHN8YXNzb2NpYXRlc3xiYXNrZXRiYWxsfGJucHBhcmliYXN8Ym9laHJpbmdlcnxjYXBpdGFsb25lfGNvbnN1bHRpbmd8Y3JlZGl0Y2FyZHxjdWlzaW5lbGxhfGV1cm92aXNpb258ZXh0cmFzcGFjZXxmb3VuZGF0aW9ufGhlYWx0aGNhcmV8aW1tb2JpbGllbnxpbmR1c3RyaWVzfG1hbmFnZW1lbnR8bWl0c3ViaXNoaXxuZXh0ZGlyZWN0fHByb3BlcnRpZXN8cHJvdGVjdGlvbnxwcnVkZW50aWFsfHJlYWxlc3RhdGV8cmVwdWJsaWNhbnxyZXN0YXVyYW50fHNjaGFlZmZsZXJ8dGF0YW1vdG9yc3x0ZWNobm9sb2d5fHVuaXZlcnNpdHl8dmxhYW5kZXJlbnx2b2xrc3dhZ2VufHhuLS0zMHJyN3l8eG4tLTNweHU4a3x4bi0tNDVxMTFjfHhuLS00Z2JyaW18eG4tLTU1cXg1ZHx4bi0tNXR6bTVnfHhuLS04MGFzd2d8eG4tLTkwYTNhY3x4bi0tOWRicTJhfHhuLS05ZXQ1MnV8eG4tLWMyYnI3Z3x4bi0tY2c0YmtpfHhuLS1jenJzMHR8eG4tLWN6cnUyZHx4bi0tZmlxNjRifHhuLS1maXFzOHN8eG4tLWZpcXo5c3x4bi0taW8wYTdpfHhuLS1rcHV0M2l8eG4tLW14dHExbXx4bi0tbzNjdzRofHhuLS1wc3N5MnV8eG4tLXE3Y2U2YXx4bi0tdW51cDR5fHhuLS13Z2JoMWN8eG4tLXdnYmw2YXx4bi0teTlhM2FxfGFjY2VudHVyZXxhbGZhcm9tZW98YWxsZmluYW56fGFtc3RlcmRhbXxhbmFseXRpY3N8YXF1YXJlbGxlfGJhcmNlbG9uYXxibG9vbWJlcmd8Y2hyaXN0bWFzfGNvbW11bml0eXxkaXJlY3Rvcnl8ZWR1Y2F0aW9ufGVxdWlwbWVudHxmYWlyd2luZHN8ZmluYW5jaWFsfGZpcmVzdG9uZXxmcmVzZW5pdXN8ZnJvbnRkb29yfGZ1cm5pdHVyZXxnb2xkcG9pbnR8aGlzYW1pdHN1fGhvbWVkZXBvdHxob21lZ29vZHN8aG9tZXNlbnNlfGluc3RpdHV0ZXxpbnN1cmFuY2V8a3Vva2dyb3VwfGxhbmNhc3RlcnxsYW5kcm92ZXJ8bGlmZXN0eWxlfG1hcmtldGluZ3xtYXJzaGFsbHN8bWVsYm91cm5lfG1pY3Jvc29mdHxwYW5hc29uaWN8cGFzc2FnZW5zfHByYW1lcmljYXxyaWNoYXJkbGl8c2hhbmdyaWxhfHNvbHV0aW9uc3xzdGF0ZWJhbmt8c3RhdGVmYXJtfHN0b2NraG9sbXx0cmF2ZWxlcnN8dmFjYXRpb25zfHhuLS05MGFpc3x4bi0tYzFhdmd8eG4tLWQxYWxmfHhuLS1lMWE0Y3x4bi0tZmhiZWl8eG4tLWoxYWVmfHhuLS1qMWFtaHx4bi0tbDFhY2N8eG4tLW5nYnJ4fHhuLS1ucXY3Znx4bi0tcDFhY2Z8eG4tLXF4YTZhfHhuLS10Y2t3ZXx4bi0tdmhxdXZ8eW9kb2Jhc2hpfNmF2YjYsdmK2KrYp9mG2YrYp3xhYnVkaGFiaXxhaXJmb3JjZXxhbGxzdGF0ZXxhdHRvcm5leXxiYXJjbGF5c3xiYXJlZm9vdHxiYXJnYWluc3xiYXNlYmFsbHxib3V0aXF1ZXxicmFkZXNjb3xicm9hZHdheXxicnVzc2Vsc3xidWlsZGVyc3xidXNpbmVzc3xjYXBldG93bnxjYXRlcmluZ3xjYXRob2xpY3xjaXByaWFuaXxjaXR5ZWF0c3xjbGVhbmluZ3xjbGluaXF1ZXxjbG90aGluZ3xjb21tYmFua3xjb21wdXRlcnxkZWxpdmVyeXxkZWxvaXR0ZXxkZW1vY3JhdHxkaWFtb25kc3xkaXNjb3VudHxkaXNjb3Zlcnxkb3dubG9hZHxlbmdpbmVlcnxlcmljc3NvbnxldGlzYWxhdHxleGNoYW5nZXxmZWVkYmFja3xmaWRlbGl0eXxmaXJtZGFsZXxmb290YmFsbHxmcm9udGllcnxnb29keWVhcnxncmFpbmdlcnxncmFwaGljc3xndWFyZGlhbnxoZGZjYmFua3xoZWxzaW5raXxob2xkaW5nc3xob3NwaXRhbHxpbmZpbml0aXxpcGlyYW5nYXxpc3RhbmJ1bHxqcG1vcmdhbnxsaWdodGluZ3xsdW5kYmVja3xtYXJyaW90dHxtYXNlcmF0aXxtY2tpbnNleXxtZW1vcmlhbHxtZXJja21zZHxtb3J0Z2FnZXxvYnNlcnZlcnxwYXJ0bmVyc3xwaGFybWFjeXxwaWN0dXJlc3xwbHVtYmluZ3xwcm9wZXJ0eXxyZWRzdG9uZXxyZWxpYW5jZXxzYWFybGFuZHxzYW1zY2x1YnxzZWN1cml0eXxzZXJ2aWNlc3xzaG9wcGluZ3xzaG93dGltZXxzb2Z0YmFua3xzb2Z0d2FyZXxzdGNncm91cHxzdXBwbGllc3x0cmFpbmluZ3x2YW5ndWFyZHx2ZW50dXJlc3x2ZXJpc2lnbnx3b29kc2lkZXx4bi0tOTBhZXx4bi0tbm9kZXx4bi0tcDFhaXx4bi0tcXhhbXx5b2tvaGFtYXzYp9mE2LPYudmI2K/ZitipfGFib2dhZG98YWNhZGVteXxhZ2FraGFufGFsaWJhYmF8YW5kcm9pZHxhdGhsZXRhfGF1Y3Rpb258YXVkaWJsZXxhdXNwb3N0fGF2aWFuY2F8YmFuYW1leHxiYXVoYXVzfGJlbnRsZXl8YmVzdGJ1eXxib29raW5nfGJyb3RoZXJ8YnVnYXR0aXxjYXBpdGFsfGNhcmF2YW58Y2FyZWVyc3xjaGFubmVsfGNoYXJpdHl8Y2hpbnRhaXxjaXRhZGVsfGNsdWJtZWR8Y29sbGVnZXxjb2xvZ25lfGNvbWNhc3R8Y29tcGFueXxjb21wYXJlfGNvbnRhY3R8Y29va2luZ3xjb3JzaWNhfGNvdW50cnl8Y291cG9uc3xjb3Vyc2VzfGNyaWNrZXR8Y3J1aXNlc3xkZW50aXN0fGRpZ2l0YWx8ZG9tYWluc3xleHBvc2VkfGV4cHJlc3N8ZmFybWVyc3xmYXNoaW9ufGZlcnJhcml8ZmVycmVyb3xmaW5hbmNlfGZpc2hpbmd8Zml0bmVzc3xmbGlnaHRzfGZsb3Jpc3R8Zmxvd2Vyc3xmb3JzYWxlfGZyb2dhbnN8ZnVqaXRzdXxnYWxsZXJ5fGdlbnRpbmd8Z29kYWRkeXxncm9jZXJ5fGd1aXRhcnN8aGFtYnVyZ3xoYW5nb3V0fGhpdGFjaGl8aG9saWRheXxob3N0aW5nfGhvdGVsZXN8aG90bWFpbHxoeXVuZGFpfGlzbWFpbGl8amV3ZWxyeXxqdW5pcGVyfGtpdGNoZW58a29tYXRzdXxsYWNhaXhhfGxhbnhlc3N8bGFzYWxsZXxsYXRyb2JlfGxlY2xlcmN8bGltaXRlZHxsaW5jb2xufG1hcmtldHN8bW9uc3RlcnxuZXRiYW5rfG5ldGZsaXh8bmV0d29ya3xuZXVzdGFyfG9raW5hd2F8b2xkbmF2eXxvcmdhbmljfG9yaWdpbnN8cGhpbGlwc3xwaW9uZWVyfHBvbGl0aWV8cmVhbHRvcnxyZWNpcGVzfHJlbnRhbHN8cmV2aWV3c3xyZXhyb3RofHNhbXN1bmd8c2FuZHZpa3xzY2htaWR0fHNjaHdhcnp8c2NpZW5jZXxzaGlrc2hhfHNpbmdsZXN8c3RhcGxlc3xzdG9yYWdlfHN1cHBvcnR8c3VyZ2VyeXxzeXN0ZW1zfHRlbWFzZWt8dGhlYXRlcnx0aGVhdHJlfHRpY2tldHN8dGlmZmFueXx0b3NoaWJhfHRyYWRpbmd8d2FsbWFydHx3YW5nZ291fHdhdGNoZXN8d2VhdGhlcnx3ZWJzaXRlfHdlZGRpbmd8d2hvc3dob3x3aW5kb3dzfHdpbm5lcnN8eGZpbml0eXx5YW1heHVufHlvdXR1YmV8enVlcmljaHzQutCw0YLQvtC70LjQunzYp9iq2LXYp9mE2KfYqnzYp9mE2KjYrdix2YrZhnzYp9mE2KzYstin2KbYsXzYp9mE2LnZhNmK2KfZhnzZvtin2qnYs9iq2KfZhnzZg9in2KvZiNmE2YrZg3zgrofgrqjgr43grqTgrr/grq/grr58YWJhcnRofGFiYm90dHxhYmJ2aWV8YWZyaWNhfGFnZW5jeXxhaXJidXN8YWlydGVsfGFsaXBheXxhbHNhY2V8YWxzdG9tfGFtYXpvbnxhbnF1YW58YXJhbWNvfGF1dGhvcnxiYXllcm58YmVhdXR5fGJlcmxpbnxiaGFydGl8Ym9zdGlrfGJvc3Rvbnxicm9rZXJ8Y2FtZXJhfGNhcmVlcnxjYXNpbm98Y2VudGVyfGNoYW5lbHxjaHJvbWV8Y2h1cmNofGNpcmNsZXxjbGFpbXN8Y2xpbmljfGNvZmZlZXxjb21zZWN8Y29uZG9zfGNvdXBvbnxjcmVkaXR8Y3J1aXNlfGRhdGluZ3xkYXRzdW58ZGVhbGVyfGRlZ3JlZXxkZW50YWx8ZGVzaWdufGRpcmVjdHxkb2N0b3J8ZHVubG9wfGR1cG9udHxkdXJiYW58ZW1lcmNrfGVuZXJneXxlc3RhdGV8ZXZlbnRzfGV4cGVydHxmYW1pbHl8ZmxpY2tyfGZ1dGJvbHxnYWxsdXB8Z2FyZGVufGdlb3JnZXxnaXZpbmd8Z2xvYmFsfGdvb2dsZXxncmF0aXN8aGVhbHRofGhlcm1lc3xoaXBob3B8aG9ja2V5fGhvdGVsc3xodWdoZXN8aW1hbWF0fGluc3VyZXxpbnR1aXR8amFndWFyfGpvYnVyZ3xqdWVnb3N8a2F1ZmVufGtpbmRlcnxraW5kbGV8a29zaGVyfGxhbmNpYXxsYXRpbm98bGF3eWVyfGxlZnJha3xsaXZpbmd8bG9ja2VyfGxvbmRvbnxsdXh1cnl8bWFkcmlkfG1haXNvbnxtYWtldXB8bWFya2V0fG1hdHRlbHxtb2JpbGV8bW9uYXNofG1vcm1vbnxtb3Njb3d8bXVzZXVtfG11dHVhbHxuYWdveWF8bmF0dXJhfG5pc3NhbnxuaXNzYXl8bm9ydG9ufG5vd3J1enxvZmZpY2V8b2xheWFufG9ubGluZXxvcmFjbGV8b3JhbmdlfG90c3VrYXxwZml6ZXJ8cGhvdG9zfHBoeXNpb3xwaWN0ZXR8cXVlYmVjfHJhY2luZ3xyZWFsdHl8cmVpc2VufHJlcGFpcnxyZXBvcnR8cmV2aWV3fHJvY2hlcnxyb2dlcnN8cnl1a3l1fHNhZmV0eXxzYWt1cmF8c2Fub2ZpfHNjaG9vbHxzY2h1bGV8c2VhcmNofHNlY3VyZXxzZWxlY3R8c2hvdWppfHNvY2Nlcnxzb2NpYWx8c3RyZWFtfHN0dWRpb3xzdXBwbHl8c3V6dWtpfHN3YXRjaHxzeWRuZXl8dGFpcGVpfHRhb2Jhb3x0YXJnZXR8dGF0dG9vfHRlbm5pc3x0aWVuZGF8dGptYXh4fHRrbWF4eHx0b3lvdGF8dHJhdmVsfHVuaWNvbXx2aWFqZXN8dmlraW5nfHZpbGxhc3x2aXJnaW58dmlzaW9ufHZvdGluZ3x2b3lhZ2V8dnVlbG9zfHdhbHRlcnx3ZWJjYW18eGlodWFufHlhY2h0c3x5YW5kZXh8emFwcG9zfNC80L7RgdC60LLQsHzQvtC90LvQsNC50L182KfYqNmI2LjYqNmKfNin2LHYp9mF2YPZiHzYp9mE2KfYsdiv2YZ82KfZhNmF2LrYsdiofNin2YXYp9ix2KfYqnzZgdmE2LPYt9mK2YZ82YXZhNmK2LPZitinfOCkreCkvuCksOCkpOCkruCljXzgrofgrrLgrpngr43grpXgr4h844OV44Kh44OD44K344On44OzfGFjdG9yfGFkdWx0fGFldG5hfGFtZmFtfGFtaWNhfGFwcGxlfGFyY2hpfGF1ZGlvfGF1dG9zfGF6dXJlfGJhaWR1fGJlYXRzfGJpYmxlfGJpbmdvfGJsYWNrfGJvYXRzfGJvc2NofGJ1aWxkfGNhbm9ufGNhcmRzfGNoYXNlfGNoZWFwfGNpc2NvfGNpdGljfGNsaWNrfGNsb3VkfGNvYWNofGNvZGVzfGNyb3dufGN5bXJ1fGRhYnVyfGRhbmNlfGRlYWxzfGRlbHRhfGRyaXZlfGR1YmFpfGVhcnRofGVkZWthfGVtYWlsfGVwc29ufGZhaXRofGZlZGV4fGZpbmFsfGZvcmV4fGZvcnVtfGdhbGxvfGdhbWVzfGdpZnRzfGdpdmVzfGdsYXNzfGdsb2JvfGdtYWlsfGdyZWVufGdyaXBlfGdyb3VwfGd1Y2NpfGd1aWRlfGhvbWVzfGhvbmRhfGhvcnNlfGhvdXNlfGh5YXR0fGlrYW5vfGlyaXNofGpldHp0fGtvZWxufGt5b3RvfGxhbWVyfGxlYXNlfGxlZ2FsfGxleHVzfGxpbGx5fGxpbmRlfGxpcHN5fGxvYW5zfGxvY3VzfGxvdHRlfGxvdHRvfG1hY3lzfG1hbmdvfG1lZGlhfG1pYW1pfG1vbmV5fG1vdmllfG11c2ljfG5leHVzfG5pa29ufG5pbmphfG5va2lhfG5vd3R2fG9tZWdhfG9zYWthfHBhcmlzfHBhcnRzfHBhcnR5fHBob25lfHBob3RvfHBpenphfHBsYWNlfHBva2VyfHByYXhpfHByZXNzfHByaW1lfHByb21vfHF1ZXN0fHJhZGlvfHJlaGFifHJlaXNlfHJpY29ofHJvY2tzfHJvZGVvfHJ1Z2J5fHNhbG9ufHNlbmVyfHNldmVufHNoYXJwfHNoZWxsfHNob2VzfHNreXBlfHNsaW5nfHNtYXJ0fHNtaWxlfHNvbGFyfHNwYWNlfHNwb3J0fHN0YWRhfHN0b3JlfHN0dWR5fHN0eWxlfHN1Y2tzfHN3aXNzfHRhdGFyfHRpcmVzfHRpcm9sfHRtYWxsfHRvZGF5fHRva3lvfHRvb2xzfHRvcmF5fHRvdGFsfHRvdXJzfHRyYWRlfHRydXN0fHR1bmVzfHR1c2h1fHViYW5rfHZlZ2FzfHZpZGVvfHZvZGthfHZvbHZvfHdhbGVzfHdhdGNofHdlYmVyfHdlaWJvfHdvcmtzfHdvcmxkfHhlcm94fHlhaG9vfNeZ16nXqNeQ15x82KfbjNix2KfZhnzYqNin2LLYp9ixfNio2r7Yp9ix2Kp82LPZiNiv2KfZhnzYs9mI2LHZitipfNmH2YXYsdin2Yd84KSt4KS+4KSw4KWL4KSkfOCkuOCkguCkl+CkoOCkqHzgpqzgpr7gpoLgprLgpr584LCt4LC+4LCw4LCk4LGNfOC0reC0vuC0sOC0pOC0gnzlmInph4zlpKfphZLlupd8YWFycHxhYmxlfGFkYWN8YWVyb3xha2RufGFsbHl8YW1leHxhcmFifGFybXl8YXJwYXxhcnRlfGFzZGF8YXNpYXxhdWRpfGF1dG98YmFieXxiYW5kfGJhbmt8YmJ2YXxiZWVyfGJlc3R8YmlrZXxiaW5nfGJsb2d8Ymx1ZXxib2ZhfGJvbmR8Ym9va3xidXp6fGNhZmV8Y2FsbHxjYW1wfGNhcmV8Y2Fyc3xjYXNhfGNhc2V8Y2FzaHxjYnJlfGNlcm58Y2hhdHxjaXRpfGNpdHl8Y2x1Ynxjb29sfGNvb3B8Y3lvdXxkYXRhfGRhdGV8ZGNsa3xkZWFsfGRlbGx8ZGVzaXxkaWV0fGRpc2h8ZG9jc3xkdmFnfGVybml8ZmFnZXxmYWlsfGZhbnN8ZmFybXxmYXN0fGZpYXR8Zmlkb3xmaWxtfGZpcmV8ZmlzaHxmbGlyfGZvb2R8Zm9yZHxmcmVlfGZ1bmR8Z2FtZXxnYml6fGdlbnR8Z2dlZXxnaWZ0fGdtYmh8Z29sZHxnb2xmfGdvb2d8Z3VnZXxndXJ1fGhhaXJ8aGF1c3xoZGZjfGhlbHB8aGVyZXxoZ3R2fGhvc3R8aHNiY3xpY2JjfGllZWV8aW1kYnxpbW1vfGluZm98aXRhdXxqYXZhfGplZXB8am9ic3xqcHJzfGtkZGl8a2lkc3xraXdpfGtwbWd8a3JlZHxsYW5kfGxlZ298bGdidHxsaWRsfGxpZmV8bGlrZXxsaW1vfGxpbmt8bGl2ZXxsb2FufGxvZnR8bG92ZXxsdGRhfGx1eGV8bWFpZnxtZWV0fG1lbWV8bWVudXxtaW5pfG1pbnR8bW9iaXxtb2RhfG1vdG98bmFtZXxuYXZ5fG5ld3N8bmV4dHxuaWNvfG5pa2V8b2xsb3xvcGVufHBhZ2V8cGFyc3xwY2N3fHBpY3N8cGluZ3xwaW5rfHBsYXl8cGx1c3xwb2hsfHBvcm58cG9zdHxwcm9kfHByb2Z8cXBvbnxyZWFkfHJlaXR8cmVudHxyZXN0fHJpY2h8cm9vbXxyc3ZwfHJ1aHJ8c2FmZXxzYWxlfHNhcmx8c2F2ZXxzYXhvfHNjb3R8c2VhdHxzZWVrfHNleHl8c2hhd3xzaGlhfHNob3B8c2hvd3xzaWxrfHNpbmF8c2l0ZXxza2lufHNuY2Z8c29odXxzb25nfHNvbnl8c3BvdHxzdGFyfHN1cmZ8dGFsa3x0YXhpfHRlYW18dGVjaHx0ZXZhfHRpYWF8dGlwc3x0b3dufHRveXN8dHViZXx2YW5hfHZpc2F8dml2YXx2aXZvfHZvdGV8dm90b3x3YW5nfHdlaXJ8d2llbnx3aWtpfHdpbmV8d29ya3x4Ym94fHlvZ2F8emFyYXx6ZXJvfHpvbmV80LTQtdGC0Lh80YHQsNC50YJ82KjYp9ix2Kp82KjZitiq2YN82oDYp9ix2Kp82KrZiNmG2LN82LTYqNmD2Kl82LnYsdin2YJ82LnZhdin2YZ82YXZiNmC2Ll84KSt4KS+4KSw4KSkfOCmreCmvuCmsOCmpHzgpq3gpr7gp7DgpqR84Kit4Ki+4Kiw4KikfOCqreCqvuCqsOCqpHzgrK3grL7grLDgrKR84LKt4LK+4LKw4LKkfOC2veC2guC2muC3j3zjgqLjg57jgr7jg7N844Kw44O844Kw44OrfOOCr+ODqeOCpuODiXzjg53jgqTjg7Pjg4h857uE57uH5py65p6EfOmbu+ioiuebiOenkXzpppnmoLzph4zmi4l8YWFhfGFiYnxhYmN8YWNvfGFkc3xhZWd8YWZsfGFpZ3xhbnp8YW9sfGFwcHxhcnR8YXdzfGF4YXxiYXJ8YmJjfGJidHxiY2d8YmNufGJldHxiaWR8YmlvfGJpenxibXN8Ym13fGJvbXxib298Ym90fGJveHxidXl8YnpofGNhYnxjYWx8Y2FtfGNhcnxjYXR8Y2JhfGNibnxjYnN8Y2VvfGNmYXxjZmR8Y29tfGNwYXxjcnN8ZGFkfGRheXxkZHN8ZGV2fGRobHxkaXl8ZG5wfGRvZ3xkb3R8ZHR2fGR2cnxlYXR8ZWNvfGVkdXxlc3F8ZXVzfGZhbnxmaXR8Zmx5fGZvb3xmb3h8ZnJsfGZ0cnxmdW58ZnlpfGdhbHxnYXB8Z2F5fGdkbnxnZWF8Z2xlfGdtb3xnbXh8Z29vfGdvcHxnb3R8Z292fGhib3xoaXZ8aGt0fGhvdHxob3d8aWJtfGljZXxpY3V8aWZtfGluY3xpbmd8aW5rfGludHxpc3R8aXR2fGpjYnxqaW98amxsfGptcHxqbmp8am90fGpveXxrZmh8a2lhfGtpbXxrcG58a3JkfGxhdHxsYXd8bGRzfGxsY3xsbHB8bG9sfGxwbHxsdGR8bWFufG1hcHxtYmF8bWVkfG1lbnxtaWx8bWl0fG1sYnxtbHN8bW1hfG1vZXxtb2l8bW9tfG1vdnxtc2R8bXRufG10cnxuYWJ8bmJhfG5lY3xuZXR8bmV3fG5mbHxuZ298bmhrfG5vd3xucmF8bnJ3fG50dHxueWN8b2JpfG9uZXxvbmd8b25sfG9vb3xvcmd8b3R0fG92aHxwYXl8cGV0fHBoZHxwaWR8cGlufHBuY3xwcm98cHJ1fHB1Ynxwd2N8cmVkfHJlbnxyaWx8cmlvfHJpcHxydW58cndlfHNhcHxzYXN8c2JpfHNic3xzY2F8c2NifHNlc3xzZXd8c2V4fHNmcnxza2l8c2t5fHNveXxzcGF8c3JsfHN0Y3x0YWJ8dGF4fHRjaXx0ZGt8dGVsfHRoZHx0anh8dG9wfHRydnx0dWl8dHZzfHVic3x1bm98dW9sfHVwc3x2ZXR8dmlnfHZpbnx2aXB8d2VkfHdpbnx3bWV8d293fHd0Y3x3dGZ8eGlufHh4eHx4eXp8eW91fHl1bnx6aXB80LHQtdC7fNC60L7QvHzSm9Cw0Ld80LzQutC0fNC80L7QvXzQvtGA0LN80YDRg9GBfNGB0YDQsXzRg9C60YB81bDVodW1fNen15XXnXzYudix2Kh82YLYt9ixfNmD2YjZhXzZhdi12LF84KSV4KWJ4KSufOCkqOClh+Ckn3zguITguK3guKF84LmE4LiX4LiifOC6peC6suC6p3zjgrnjg4jjgqJ844K744O844OrfOOBv+OCk+OBqnzkuK3mlofnvZF85Lqa6ams6YCKfOWkqeS4u+aVmXzmiJHniLHkvaB85paw5Yqg5Z2hfOa3oemprOmUoXzor7rln7rkupp86aOe5Yip5rWmfGFjfGFkfGFlfGFmfGFnfGFpfGFsfGFtfGFvfGFxfGFyfGFzfGF0fGF1fGF3fGF4fGF6fGJhfGJifGJkfGJlfGJmfGJnfGJofGJpfGJqfGJtfGJufGJvfGJyfGJzfGJ0fGJ2fGJ3fGJ5fGJ6fGNhfGNjfGNkfGNmfGNnfGNofGNpfGNrfGNsfGNtfGNufGNvfGNyfGN1fGN2fGN3fGN4fGN5fGN6fGRlfGRqfGRrfGRtfGRvfGR6fGVjfGVlfGVnfGVyfGVzfGV0fGV1fGZpfGZqfGZrfGZtfGZvfGZyfGdhfGdifGdkfGdlfGdmfGdnfGdofGdpfGdsfGdtfGdufGdwfGdxfGdyfGdzfGd0fGd1fGd3fGd5fGhrfGhtfGhufGhyfGh0fGh1fGlkfGllfGlsfGltfGlufGlvfGlxfGlyfGlzfGl0fGplfGptfGpvfGpwfGtlfGtnfGtofGtpfGttfGtufGtwfGtyfGt3fGt5fGt6fGxhfGxifGxjfGxpfGxrfGxyfGxzfGx0fGx1fGx2fGx5fG1hfG1jfG1kfG1lfG1nfG1ofG1rfG1sfG1tfG1ufG1vfG1wfG1xfG1yfG1zfG10fG11fG12fG13fG14fG15fG16fG5hfG5jfG5lfG5mfG5nfG5pfG5sfG5vfG5wfG5yfG51fG56fG9tfHBhfHBlfHBmfHBnfHBofHBrfHBsfHBtfHBufHByfHBzfHB0fHB3fHB5fHFhfHJlfHJvfHJzfHJ1fHJ3fHNhfHNifHNjfHNkfHNlfHNnfHNofHNpfHNqfHNrfHNsfHNtfHNufHNvfHNyfHNzfHN0fHN1fHN2fHN4fHN5fHN6fHRjfHRkfHRmfHRnfHRofHRqfHRrfHRsfHRtfHRufHRvfHRyfHR0fHR2fHR3fHR6fHVhfHVnfHVrfHVzfHV5fHV6fHZhfHZjfHZlfHZnfHZpfHZufHZ1fHdmfHdzfHllfHl0fHphfHptfHp3fM61zrt8zrXPhXzQsdCzfNC10Y580YDRhHzhg5Lhg5R864u364S3fOuLt+y7tHzsgrzshLF87ZWc6rWtfOOCs+ODoHzkuJbnlYx85Lit5L+hfOS4reWbvXzkuK3lnIt85LyB5LiafOS9m+WxsXzkv6Hmga985YGl5bq3fOWFq+WNpnzlhazlj7h85YWs55uKfOWPsOa5vnzlj7DngaN85ZWG5Z+OfOWVhuW6l3zllYbmoId85ZiJ6YeMfOWcqOe6v3zlpKfmi7985aix5LmQfOWutumbu3zlub/kuJx85b6u5Y2afOaFiOWWhHzmiYvmnLp85oub6IGYfOaUv+WKoXzmlL/lupx85paw6Ze7fOaXtuWwmnzmm7jnsY185py65p6EfOa4uOaIj3zmvrPploB854K555yLfOenu+WKqHznvZHlnYB8572R5bqXfOe9keermXznvZHnu5x86IGU6YCafOiwt+atjHzotK3nial86YCa6LKpfOmbhuWbonzpo5/lk4F86aSQ5Y6FfOmmmea4rykvLGZDPW5ldyBSZWdFeHAoIlsiLmNvbmNhdChjQywiISMkJSYnKisvPT9eX2B7fH1+LV0iKSksbUM9bmV3IFJlZ0V4cCgiXiIuY29uY2F0KGRDLnNvdXJjZSwiJCIpKSxnQz1mdW5jdGlvbihzKXtmdW5jdGlvbiBFbWFpbE1hdGNoZXIoKXt2YXIgbz1udWxsIT09cyYmcy5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIG8ubG9jYWxQYXJ0Q2hhclJlZ2V4PWZDLG8uc3RyaWN0VGxkUmVnZXg9bUMsb31yZXR1cm4gdHNsaWJfZXM2X2V4dGVuZHMoRW1haWxNYXRjaGVyLHMpLEVtYWlsTWF0Y2hlci5wcm90b3R5cGUucGFyc2VNYXRjaGVzPWZ1bmN0aW9uKHMpe2Zvcih2YXIgbz10aGlzLnRhZ0J1aWxkZXIsaT10aGlzLmxvY2FsUGFydENoYXJSZWdleCxhPXRoaXMuc3RyaWN0VGxkUmVnZXgsdT1bXSxfPXMubGVuZ3RoLHc9bmV3IHlDLHg9e206ImEiLGE6ImkiLGk6ImwiLGw6InQiLHQ6Im8iLG86IjoifSxDPTAsaj0wLEw9dztDPF87KXt2YXIgQj1zLmNoYXJBdChDKTtzd2l0Y2goail7Y2FzZSAwOnN0YXRlTm9uRW1haWxBZGRyZXNzKEIpO2JyZWFrO2Nhc2UgMTpzdGF0ZU1haWxUbyhzLmNoYXJBdChDLTEpLEIpO2JyZWFrO2Nhc2UgMjpzdGF0ZUxvY2FsUGFydChCKTticmVhaztjYXNlIDM6c3RhdGVMb2NhbFBhcnREb3QoQik7YnJlYWs7Y2FzZSA0OnN0YXRlQXRTaWduKEIpO2JyZWFrO2Nhc2UgNTpzdGF0ZURvbWFpbkNoYXIoQik7YnJlYWs7Y2FzZSA2OnN0YXRlRG9tYWluSHlwaGVuKEIpO2JyZWFrO2Nhc2UgNzpzdGF0ZURvbWFpbkRvdChCKTticmVhaztkZWZhdWx0OnRocm93VW5oYW5kbGVkQ2FzZUVycm9yKGopfUMrK31yZXR1cm4gY2FwdHVyZU1hdGNoSWZWYWxpZEFuZFJlc2V0KCksdTtmdW5jdGlvbiBzdGF0ZU5vbkVtYWlsQWRkcmVzcyhzKXsibSI9PT1zP2JlZ2luRW1haWxNYXRjaCgxKTppLnRlc3QocykmJmJlZ2luRW1haWxNYXRjaCgpfWZ1bmN0aW9uIHN0YXRlTWFpbFRvKHMsbyl7IjoiPT09cz9pLnRlc3Qobyk/KGo9MixMPW5ldyB5QyhfX2Fzc2lnbihfX2Fzc2lnbih7fSxMKSx7aGFzTWFpbHRvUHJlZml4OiEwfSkpKTpyZXNldFRvTm9uRW1haWxNYXRjaFN0YXRlKCk6eFtzXT09PW98fChpLnRlc3Qobyk/aj0yOiIuIj09PW8/aj0zOiJAIj09PW8/aj00OnJlc2V0VG9Ob25FbWFpbE1hdGNoU3RhdGUoKSl9ZnVuY3Rpb24gc3RhdGVMb2NhbFBhcnQocyl7Ii4iPT09cz9qPTM6IkAiPT09cz9qPTQ6aS50ZXN0KHMpfHxyZXNldFRvTm9uRW1haWxNYXRjaFN0YXRlKCl9ZnVuY3Rpb24gc3RhdGVMb2NhbFBhcnREb3Qocyl7Ii4iPT09c3x8IkAiPT09cz9yZXNldFRvTm9uRW1haWxNYXRjaFN0YXRlKCk6aS50ZXN0KHMpP2o9MjpyZXNldFRvTm9uRW1haWxNYXRjaFN0YXRlKCl9ZnVuY3Rpb24gc3RhdGVBdFNpZ24ocyl7aEMudGVzdChzKT9qPTU6cmVzZXRUb05vbkVtYWlsTWF0Y2hTdGF0ZSgpfWZ1bmN0aW9uIHN0YXRlRG9tYWluQ2hhcihzKXsiLiI9PT1zP2o9NzoiLSI9PT1zP2o9NjpoQy50ZXN0KHMpfHxjYXB0dXJlTWF0Y2hJZlZhbGlkQW5kUmVzZXQoKX1mdW5jdGlvbiBzdGF0ZURvbWFpbkh5cGhlbihzKXsiLSI9PT1zfHwiLiI9PT1zP2NhcHR1cmVNYXRjaElmVmFsaWRBbmRSZXNldCgpOmhDLnRlc3Qocyk/aj01OmNhcHR1cmVNYXRjaElmVmFsaWRBbmRSZXNldCgpfWZ1bmN0aW9uIHN0YXRlRG9tYWluRG90KHMpeyIuIj09PXN8fCItIj09PXM/Y2FwdHVyZU1hdGNoSWZWYWxpZEFuZFJlc2V0KCk6aEMudGVzdChzKT8oaj01LEw9bmV3IHlDKF9fYXNzaWduKF9fYXNzaWduKHt9LEwpLHtoYXNEb21haW5Eb3Q6ITB9KSkpOmNhcHR1cmVNYXRjaElmVmFsaWRBbmRSZXNldCgpfWZ1bmN0aW9uIGJlZ2luRW1haWxNYXRjaChzKXt2b2lkIDA9PT1zJiYocz0yKSxqPXMsTD1uZXcgeUMoe2lkeDpDfSl9ZnVuY3Rpb24gcmVzZXRUb05vbkVtYWlsTWF0Y2hTdGF0ZSgpe2o9MCxMPXd9ZnVuY3Rpb24gY2FwdHVyZU1hdGNoSWZWYWxpZEFuZFJlc2V0KCl7aWYoTC5oYXNEb21haW5Eb3Qpe3ZhciBpPXMuc2xpY2UoTC5pZHgsQyk7L1stLl0kLy50ZXN0KGkpJiYoaT1pLnNsaWNlKDAsLTEpKTt2YXIgXz1MLmhhc01haWx0b1ByZWZpeD9pLnNsaWNlKDcpOmk7KGZ1bmN0aW9uIGRvZXNFbWFpbEhhdmVWYWxpZFRsZChzKXt2YXIgbz1zLnNwbGl0KCIuIikucG9wKCl8fCIiLGk9by50b0xvd2VyQ2FzZSgpO3JldHVybiBhLnRlc3QoaSl9KShfKSYmdS5wdXNoKG5ldyBKQSh7dGFnQnVpbGRlcjpvLG1hdGNoZWRUZXh0Omksb2Zmc2V0OkwuaWR4LGVtYWlsOl99KSl9cmVzZXRUb05vbkVtYWlsTWF0Y2hTdGF0ZSgpfX0sRW1haWxNYXRjaGVyfShYQSkseUM9ZnVuY3Rpb24geUMocyl7dm9pZCAwPT09cyYmKHM9e30pLHRoaXMuaWR4PXZvaWQgMCE9PXMuaWR4P3MuaWR4Oi0xLHRoaXMuaGFzTWFpbHRvUHJlZml4PSEhcy5oYXNNYWlsdG9QcmVmaXgsdGhpcy5oYXNEb21haW5Eb3Q9ISFzLmhhc0RvbWFpbkRvdH0sdkM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBVcmxNYXRjaFZhbGlkYXRvcigpe31yZXR1cm4gVXJsTWF0Y2hWYWxpZGF0b3IuaXNWYWxpZD1mdW5jdGlvbihzLG8pe3JldHVybiEobyYmIXRoaXMuaXNWYWxpZFVyaVNjaGVtZShvKXx8dGhpcy51cmxNYXRjaERvZXNOb3RIYXZlUHJvdG9jb2xPckRvdChzLG8pfHx0aGlzLnVybE1hdGNoRG9lc05vdEhhdmVBdExlYXN0T25lV29yZENoYXIocyxvKSYmIXRoaXMuaXNWYWxpZElwQWRkcmVzcyhzKXx8dGhpcy5jb250YWluc011bHRpcGxlRG90cyhzKSl9LFVybE1hdGNoVmFsaWRhdG9yLmlzVmFsaWRJcEFkZHJlc3M9ZnVuY3Rpb24ocyl7dmFyIG89bmV3IFJlZ0V4cCh0aGlzLmhhc0Z1bGxQcm90b2NvbFJlZ2V4LnNvdXJjZSt0aGlzLmlwUmVnZXguc291cmNlKTtyZXR1cm4gbnVsbCE9PXMubWF0Y2gobyl9LFVybE1hdGNoVmFsaWRhdG9yLmNvbnRhaW5zTXVsdGlwbGVEb3RzPWZ1bmN0aW9uKHMpe3ZhciBvPXM7cmV0dXJuIHRoaXMuaGFzRnVsbFByb3RvY29sUmVnZXgudGVzdChzKSYmKG89cy5zcGxpdCgiOi8vIilbMV0pLG8uc3BsaXQoIi8iKVswXS5pbmRleE9mKCIuLiIpPi0xfSxVcmxNYXRjaFZhbGlkYXRvci5pc1ZhbGlkVXJpU2NoZW1lPWZ1bmN0aW9uKHMpe3ZhciBvPXMubWF0Y2godGhpcy51cmlTY2hlbWVSZWdleCksaT1vJiZvWzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuImphdmFzY3JpcHQ6IiE9PWkmJiJ2YnNjcmlwdDoiIT09aX0sVXJsTWF0Y2hWYWxpZGF0b3IudXJsTWF0Y2hEb2VzTm90SGF2ZVByb3RvY29sT3JEb3Q9ZnVuY3Rpb24ocyxvKXtyZXR1cm4hKCFzfHxvJiZ0aGlzLmhhc0Z1bGxQcm90b2NvbFJlZ2V4LnRlc3Qobyl8fC0xIT09cy5pbmRleE9mKCIuIikpfSxVcmxNYXRjaFZhbGlkYXRvci51cmxNYXRjaERvZXNOb3RIYXZlQXRMZWFzdE9uZVdvcmRDaGFyPWZ1bmN0aW9uKHMsbyl7cmV0dXJuISghc3x8IW8pJiYoIXRoaXMuaGFzRnVsbFByb3RvY29sUmVnZXgudGVzdChvKSYmIXRoaXMuaGFzV29yZENoYXJBZnRlclByb3RvY29sUmVnZXgudGVzdChzKSl9LFVybE1hdGNoVmFsaWRhdG9yLmhhc0Z1bGxQcm90b2NvbFJlZ2V4PS9eW0EtWmEtel1bLS4rQS1aYS16MC05XSo6XC9cLy8sVXJsTWF0Y2hWYWxpZGF0b3IudXJpU2NoZW1lUmVnZXg9L15bQS1aYS16XVstLitBLVphLXowLTldKjovLFVybE1hdGNoVmFsaWRhdG9yLmhhc1dvcmRDaGFyQWZ0ZXJQcm90b2NvbFJlZ2V4PW5ldyBSZWdFeHAoIjpbXlxcc10qP1siK3NDKyJdIiksVXJsTWF0Y2hWYWxpZGF0b3IuaXBSZWdleD0vWzAtOV1bMC05XT9bMC05XT9cLlswLTldWzAtOV0/WzAtOV0/XC5bMC05XVswLTldP1swLTldP1wuWzAtOV1bMC05XT9bMC05XT8oOlswLTldKik/XC8/JC8sVXJsTWF0Y2hWYWxpZGF0b3J9KCksYkM9KFdBPW5ldyBSZWdFeHAoIlsvPyNdKD86WyIrY0MrIlxcLSsmQCMvJT1+XygpfCckKlxcW1xcXXt9PyE6LC47XuKck10qWyIrY0MrIlxcLSsmQCMvJT1+XygpfCckKlxcW1xcXXt94pyTXSk/IiksbmV3IFJlZ0V4cChbIig/OiIsIigiLC8oPzpbQS1aYS16XVstLitBLVphLXowLTldezAsNjN9Oig/IVtBLVphLXpdWy0uK0EtWmEtejAtOV17MCw2M306XC9cLykoPyFcZCtcLz8pKD86XC9cLyk/KS8uc291cmNlLGdldERvbWFpbk5hbWVTdHIoMiksIikiLCJ8IiwiKCIsIigvLyk/IiwvKD86d3d3XC4pLy5zb3VyY2UsZ2V0RG9tYWluTmFtZVN0cig2KSwiKSIsInwiLCIoIiwiKC8vKT8iLGdldERvbWFpbk5hbWVTdHIoMTApKyJcXC4iLGRDLnNvdXJjZSwiKD8hWy0iK2FDKyJdKSIsIikiLCIpIiwiKD86OlswLTldKyk/IiwiKD86IitXQS5zb3VyY2UrIik/Il0uam9pbigiIiksImdpIikpLFNDPW5ldyBSZWdFeHAoIlsiK2NDKyJdIiksX0M9ZnVuY3Rpb24ocyl7ZnVuY3Rpb24gVXJsTWF0Y2hlcihvKXt2YXIgaT1zLmNhbGwodGhpcyxvKXx8dGhpcztyZXR1cm4gaS5zdHJpcFByZWZpeD17c2NoZW1lOiEwLHd3dzohMH0saS5zdHJpcFRyYWlsaW5nU2xhc2g9ITAsaS5kZWNvZGVQZXJjZW50RW5jb2Rpbmc9ITAsaS5tYXRjaGVyUmVnZXg9YkMsaS53b3JkQ2hhclJlZ0V4cD1TQyxpLnN0cmlwUHJlZml4PW8uc3RyaXBQcmVmaXgsaS5zdHJpcFRyYWlsaW5nU2xhc2g9by5zdHJpcFRyYWlsaW5nU2xhc2gsaS5kZWNvZGVQZXJjZW50RW5jb2Rpbmc9by5kZWNvZGVQZXJjZW50RW5jb2RpbmcsaX1yZXR1cm4gdHNsaWJfZXM2X2V4dGVuZHMoVXJsTWF0Y2hlcixzKSxVcmxNYXRjaGVyLnByb3RvdHlwZS5wYXJzZU1hdGNoZXM9ZnVuY3Rpb24ocyl7Zm9yKHZhciBvLGk9dGhpcy5tYXRjaGVyUmVnZXgsYT10aGlzLnN0cmlwUHJlZml4LHU9dGhpcy5zdHJpcFRyYWlsaW5nU2xhc2gsXz10aGlzLmRlY29kZVBlcmNlbnRFbmNvZGluZyx3PXRoaXMudGFnQnVpbGRlcix4PVtdLF9sb29wXzE9ZnVuY3Rpb24oKXt2YXIgaT1vWzBdLGo9b1sxXSxMPW9bNF0sQj1vWzVdLCQ9b1s5XSxVPW8uaW5kZXgsVj1CfHwkLHo9cy5jaGFyQXQoVS0xKTtpZighdkMuaXNWYWxpZChpLGopKXJldHVybiJjb250aW51ZSI7aWYoVT4wJiYiQCI9PT16KXJldHVybiJjb250aW51ZSI7aWYoVT4wJiZWJiZDLndvcmRDaGFyUmVnRXhwLnRlc3QoeikpcmV0dXJuImNvbnRpbnVlIjtpZigvXD8kLy50ZXN0KGkpJiYoaT1pLnN1YnN0cigwLGkubGVuZ3RoLTEpKSxDLm1hdGNoSGFzVW5iYWxhbmNlZENsb3NpbmdQYXJlbihpKSlpPWkuc3Vic3RyKDAsaS5sZW5ndGgtMSk7ZWxzZXt2YXIgWT1DLm1hdGNoSGFzSW52YWxpZENoYXJBZnRlclRsZChpLGopO1k+LTEmJihpPWkuc3Vic3RyKDAsWSkpfXZhciBaPVsiaHR0cDovLyIsImh0dHBzOi8vIl0uZmluZCgoZnVuY3Rpb24ocyl7cmV0dXJuISFqJiYtMSE9PWouaW5kZXhPZihzKX0pKTtpZihaKXt2YXIgZWU9aS5pbmRleE9mKFopO2k9aS5zdWJzdHIoZWUpLGo9ai5zdWJzdHIoZWUpLFUrPWVlfXZhciBpZT1qPyJzY2hlbWUiOkw/Ind3dyI6InRsZCIsYWU9ISFqO3gucHVzaChuZXcgWUEoe3RhZ0J1aWxkZXI6dyxtYXRjaGVkVGV4dDppLG9mZnNldDpVLHVybE1hdGNoVHlwZTppZSx1cmw6aSxwcm90b2NvbFVybE1hdGNoOmFlLHByb3RvY29sUmVsYXRpdmVNYXRjaDohIVYsc3RyaXBQcmVmaXg6YSxzdHJpcFRyYWlsaW5nU2xhc2g6dSxkZWNvZGVQZXJjZW50RW5jb2Rpbmc6X30pKX0sQz10aGlzO251bGwhPT0obz1pLmV4ZWMocykpOylfbG9vcF8xKCk7cmV0dXJuIHh9LFVybE1hdGNoZXIucHJvdG90eXBlLm1hdGNoSGFzVW5iYWxhbmNlZENsb3NpbmdQYXJlbj1mdW5jdGlvbihzKXt2YXIgbyxpPXMuY2hhckF0KHMubGVuZ3RoLTEpO2lmKCIpIj09PWkpbz0iKCI7ZWxzZSBpZigiXSI9PT1pKW89IlsiO2Vsc2V7aWYoIn0iIT09aSlyZXR1cm4hMTtvPSJ7In1mb3IodmFyIGE9MCx1PTAsXz1zLmxlbmd0aC0xO3U8Xzt1Kyspe3ZhciB3PXMuY2hhckF0KHUpO3c9PT1vP2ErKzp3PT09aSYmKGE9TWF0aC5tYXgoYS0xLDApKX1yZXR1cm4gMD09PWF9LFVybE1hdGNoZXIucHJvdG90eXBlLm1hdGNoSGFzSW52YWxpZENoYXJBZnRlclRsZD1mdW5jdGlvbihzLG8pe2lmKCFzKXJldHVybi0xO3ZhciBpPTA7byYmKGk9cy5pbmRleE9mKCI6Iikscz1zLnNsaWNlKGkpKTt2YXIgYT1uZXcgUmVnRXhwKCJeKCguPy8vKT9bLS4iK2NDKyJdKlstIitjQysiXVxcLlstIitjQysiXSspIikuZXhlYyhzKTtyZXR1cm4gbnVsbD09PWE/LTE6KGkrPWFbMV0ubGVuZ3RoLHM9cy5zbGljZShhWzFdLmxlbmd0aCksL15bXi0uQS1aYS16MC05OlwvPyNdLy50ZXN0KHMpP2k6LTEpfSxVcmxNYXRjaGVyfShYQSksRUM9bmV3IFJlZ0V4cCgiW18iLmNvbmNhdChjQywiXSIpKSx3Qz1mdW5jdGlvbihzKXtmdW5jdGlvbiBIYXNodGFnTWF0Y2hlcihvKXt2YXIgaT1zLmNhbGwodGhpcyxvKXx8dGhpcztyZXR1cm4gaS5zZXJ2aWNlTmFtZT0idHdpdHRlciIsaS5zZXJ2aWNlTmFtZT1vLnNlcnZpY2VOYW1lLGl9cmV0dXJuIHRzbGliX2VzNl9leHRlbmRzKEhhc2h0YWdNYXRjaGVyLHMpLEhhc2h0YWdNYXRjaGVyLnByb3RvdHlwZS5wYXJzZU1hdGNoZXM9ZnVuY3Rpb24ocyl7Zm9yKHZhciBvPXRoaXMudGFnQnVpbGRlcixpPXRoaXMuc2VydmljZU5hbWUsYT1bXSx1PXMubGVuZ3RoLF89MCx3PS0xLHg9MDtfPHU7KXt2YXIgQz1zLmNoYXJBdChfKTtzd2l0Y2goeCl7Y2FzZSAwOnN0YXRlTm9uZShDKTticmVhaztjYXNlIDE6c3RhdGVOb25IYXNodGFnV29yZENoYXIoQyk7YnJlYWs7Y2FzZSAyOnN0YXRlSGFzaHRhZ0hhc2hDaGFyKEMpO2JyZWFrO2Nhc2UgMzpzdGF0ZUhhc2h0YWdUZXh0Q2hhcihDKTticmVhaztkZWZhdWx0OnRocm93VW5oYW5kbGVkQ2FzZUVycm9yKHgpfV8rK31yZXR1cm4gY2FwdHVyZU1hdGNoSWZWYWxpZCgpLGE7ZnVuY3Rpb24gc3RhdGVOb25lKHMpeyIjIj09PXM/KHg9Mix3PV8pOmxDLnRlc3QocykmJih4PTEpfWZ1bmN0aW9uIHN0YXRlTm9uSGFzaHRhZ1dvcmRDaGFyKHMpe2xDLnRlc3Qocyl8fCh4PTApfWZ1bmN0aW9uIHN0YXRlSGFzaHRhZ0hhc2hDaGFyKHMpe3g9RUMudGVzdChzKT8zOmxDLnRlc3Qocyk/MTowfWZ1bmN0aW9uIHN0YXRlSGFzaHRhZ1RleHRDaGFyKHMpe0VDLnRlc3Qocyl8fChjYXB0dXJlTWF0Y2hJZlZhbGlkKCksdz0tMSx4PWxDLnRlc3Qocyk/MTowKX1mdW5jdGlvbiBjYXB0dXJlTWF0Y2hJZlZhbGlkKCl7aWYodz4tMSYmXy13PD0xNDApe3ZhciB1PXMuc2xpY2UodyxfKSx4PW5ldyBIQSh7dGFnQnVpbGRlcjpvLG1hdGNoZWRUZXh0OnUsb2Zmc2V0Oncsc2VydmljZU5hbWU6aSxoYXNodGFnOnUuc2xpY2UoMSl9KTthLnB1c2goeCl9fX0sSGFzaHRhZ01hdGNoZXJ9KFhBKSx4Qz1bInR3aXR0ZXIiLCJmYWNlYm9vayIsImluc3RhZ3JhbSIsInRpa3RvayJdLGtDPW5ldyBSZWdFeHAoIiIuY29uY2F0KC8oPzooPzooPzooXCspP1xkezEsM31bLVwwNDAuXT8pP1woP1xkezN9XCk/Wy1cMDQwLl0/XGR7M31bLVwwNDAuXT9cZHs0fSl8KD86KFwrKSg/OjlbOTc2XVxkfDhbOTg3NTMwXVxkfDZbOTg3XVxkfDVbOTBdXGR8NDJcZHwzWzg3NV1cZHwyWzk4NjU0MzIxXVxkfDlbODU0MzIxMF18OFs2NDIxXXw2WzY1NDMyMTBdfDVbODc2NTQzMjFdfDRbOTg3NjU0MzEwXXwzWzk2NDMyMTBdfDJbNzBdfDd8MSlbLVwwNDAuXT8oPzpcZFstXDA0MC5dPyl7NiwxMn1cZCspKShbLDtdK1swLTldKyM/KSovLnNvdXJjZSwifCIpLmNvbmNhdCgvKDAoWzEtOV17MX0tP1sxLTldXGR7M318WzEtOV17Mn0tP1xkezN9fFsxLTldezJ9XGR7MX0tP1xkezJ9fFsxLTldezJ9XGR7Mn0tP1xkezF9KS0/XGR7NH18MFs3ODldMC0/XGR7NH0tP1xkezR9fDA1MC0/XGR7NH0tP1xkezR9KS8uc291cmNlKSwiZyIpLE9DPWZ1bmN0aW9uKHMpe2Z1bmN0aW9uIFBob25lTWF0Y2hlcigpe3ZhciBvPW51bGwhPT1zJiZzLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gby5tYXRjaGVyUmVnZXg9a0Msb31yZXR1cm4gdHNsaWJfZXM2X2V4dGVuZHMoUGhvbmVNYXRjaGVyLHMpLFBob25lTWF0Y2hlci5wcm90b3R5cGUucGFyc2VNYXRjaGVzPWZ1bmN0aW9uKHMpe2Zvcih2YXIgbyxpPXRoaXMubWF0Y2hlclJlZ2V4LGE9dGhpcy50YWdCdWlsZGVyLHU9W107bnVsbCE9PShvPWkuZXhlYyhzKSk7KXt2YXIgXz1vWzBdLHc9Xy5yZXBsYWNlKC9bXjAtOSw7I10vZywiIikseD0hKCFvWzFdJiYhb1syXSksQz0wPT1vLmluZGV4PyIiOnMuc3Vic3RyKG8uaW5kZXgtMSwxKSxqPXMuc3Vic3RyKG8uaW5kZXgrXy5sZW5ndGgsMSksTD0hQy5tYXRjaCgvXGQvKSYmIWoubWF0Y2goL1xkLyk7dGhpcy50ZXN0TWF0Y2gob1szXSkmJnRoaXMudGVzdE1hdGNoKF8pJiZMJiZ1LnB1c2gobmV3IEdBKHt0YWdCdWlsZGVyOmEsbWF0Y2hlZFRleHQ6XyxvZmZzZXQ6by5pbmRleCxudW1iZXI6dyxwbHVzU2lnbjp4fSkpfXJldHVybiB1fSxQaG9uZU1hdGNoZXIucHJvdG90eXBlLnRlc3RNYXRjaD1mdW5jdGlvbihzKXtyZXR1cm4gZUMudGVzdChzKX0sUGhvbmVNYXRjaGVyfShYQSksQUM9bmV3IFJlZ0V4cCgiQFtfIi5jb25jYXQoY0MsIl17MSw1MH0oPyFbXyIpLmNvbmNhdChjQywiXSkiKSwiZyIpLENDPW5ldyBSZWdFeHAoIkBbXy4iLmNvbmNhdChjQywiXXsxLDMwfSg/IVtfIikuY29uY2F0KGNDLCJdKSIpLCJnIiksakM9bmV3IFJlZ0V4cCgiQFstXy4iLmNvbmNhdChjQywiXXsxLDUwfSg/IVstXyIpLmNvbmNhdChjQywiXSkiKSwiZyIpLFBDPW5ldyBSZWdFeHAoIkBbXy4iLmNvbmNhdChjQywiXXsxLDIzfVtfIikuY29uY2F0KGNDLCJdKD8hW18iKS5jb25jYXQoY0MsIl0pIiksImciKSxJQz1uZXcgUmVnRXhwKCJbXiIrY0MrIl0iKSxUQz1mdW5jdGlvbihzKXtmdW5jdGlvbiBNZW50aW9uTWF0Y2hlcihvKXt2YXIgaT1zLmNhbGwodGhpcyxvKXx8dGhpcztyZXR1cm4gaS5zZXJ2aWNlTmFtZT0idHdpdHRlciIsaS5tYXRjaGVyUmVnZXhlcz17dHdpdHRlcjpBQyxpbnN0YWdyYW06Q0Msc291bmRjbG91ZDpqQyx0aWt0b2s6UEN9LGkubm9uV29yZENoYXJSZWdleD1JQyxpLnNlcnZpY2VOYW1lPW8uc2VydmljZU5hbWUsaX1yZXR1cm4gdHNsaWJfZXM2X2V4dGVuZHMoTWVudGlvbk1hdGNoZXIscyksTWVudGlvbk1hdGNoZXIucHJvdG90eXBlLnBhcnNlTWF0Y2hlcz1mdW5jdGlvbihzKXt2YXIgbyxpPXRoaXMuc2VydmljZU5hbWUsYT10aGlzLm1hdGNoZXJSZWdleGVzW3RoaXMuc2VydmljZU5hbWVdLHU9dGhpcy5ub25Xb3JkQ2hhclJlZ2V4LF89dGhpcy50YWdCdWlsZGVyLHc9W107aWYoIWEpcmV0dXJuIHc7Zm9yKDtudWxsIT09KG89YS5leGVjKHMpKTspe3ZhciB4PW8uaW5kZXgsQz1zLmNoYXJBdCh4LTEpO2lmKDA9PT14fHx1LnRlc3QoQykpe3ZhciBqPW9bMF0ucmVwbGFjZSgvXC4rJC9nLCIiKSxMPWouc2xpY2UoMSk7dy5wdXNoKG5ldyBLQSh7dGFnQnVpbGRlcjpfLG1hdGNoZWRUZXh0Omosb2Zmc2V0Ongsc2VydmljZU5hbWU6aSxtZW50aW9uOkx9KSl9fXJldHVybiB3fSxNZW50aW9uTWF0Y2hlcn0oWEEpO2Z1bmN0aW9uIHBhcnNlSHRtbChzLG8pe2Zvcih2YXIgaT1vLm9uT3BlblRhZyxhPW8ub25DbG9zZVRhZyx1PW8ub25UZXh0LF89by5vbkNvbW1lbnQsdz1vLm9uRG9jdHlwZSx4PW5ldyBOQyxDPTAsaj1zLmxlbmd0aCxMPTAsQj0wLCQ9eDtDPGo7KXt2YXIgVT1zLmNoYXJBdChDKTtzd2l0Y2goTCl7Y2FzZSAwOnN0YXRlRGF0YShVKTticmVhaztjYXNlIDE6c3RhdGVUYWdPcGVuKFUpO2JyZWFrO2Nhc2UgMjpzdGF0ZUVuZFRhZ09wZW4oVSk7YnJlYWs7Y2FzZSAzOnN0YXRlVGFnTmFtZShVKTticmVhaztjYXNlIDQ6c3RhdGVCZWZvcmVBdHRyaWJ1dGVOYW1lKFUpO2JyZWFrO2Nhc2UgNTpzdGF0ZUF0dHJpYnV0ZU5hbWUoVSk7YnJlYWs7Y2FzZSA2OnN0YXRlQWZ0ZXJBdHRyaWJ1dGVOYW1lKFUpO2JyZWFrO2Nhc2UgNzpzdGF0ZUJlZm9yZUF0dHJpYnV0ZVZhbHVlKFUpO2JyZWFrO2Nhc2UgODpzdGF0ZUF0dHJpYnV0ZVZhbHVlRG91YmxlUXVvdGVkKFUpO2JyZWFrO2Nhc2UgOTpzdGF0ZUF0dHJpYnV0ZVZhbHVlU2luZ2xlUXVvdGVkKFUpO2JyZWFrO2Nhc2UgMTA6c3RhdGVBdHRyaWJ1dGVWYWx1ZVVucXVvdGVkKFUpO2JyZWFrO2Nhc2UgMTE6c3RhdGVBZnRlckF0dHJpYnV0ZVZhbHVlUXVvdGVkKFUpO2JyZWFrO2Nhc2UgMTI6c3RhdGVTZWxmQ2xvc2luZ1N0YXJ0VGFnKFUpO2JyZWFrO2Nhc2UgMTM6c3RhdGVNYXJrdXBEZWNsYXJhdGlvbk9wZW4oVSk7YnJlYWs7Y2FzZSAxNDpzdGF0ZUNvbW1lbnRTdGFydChVKTticmVhaztjYXNlIDE1OnN0YXRlQ29tbWVudFN0YXJ0RGFzaChVKTticmVhaztjYXNlIDE2OnN0YXRlQ29tbWVudChVKTticmVhaztjYXNlIDE3OnN0YXRlQ29tbWVudEVuZERhc2goVSk7YnJlYWs7Y2FzZSAxODpzdGF0ZUNvbW1lbnRFbmQoVSk7YnJlYWs7Y2FzZSAxOTpzdGF0ZUNvbW1lbnRFbmRCYW5nKFUpO2JyZWFrO2Nhc2UgMjA6c3RhdGVEb2N0eXBlKFUpO2JyZWFrO2RlZmF1bHQ6dGhyb3dVbmhhbmRsZWRDYXNlRXJyb3IoTCl9QysrfWZ1bmN0aW9uIHN0YXRlRGF0YShzKXsiPCI9PT1zJiZzdGFydE5ld1RhZygpfWZ1bmN0aW9uIHN0YXRlVGFnT3BlbihzKXsiISI9PT1zP0w9MTM6Ii8iPT09cz8oTD0yLCQ9bmV3IE5DKF9fYXNzaWduKF9fYXNzaWduKHt9LCQpLHtpc0Nsb3Npbmc6ITB9KSkpOiI8Ij09PXM/c3RhcnROZXdUYWcoKTpRQS50ZXN0KHMpPyhMPTMsJD1uZXcgTkMoX19hc3NpZ24oX19hc3NpZ24oe30sJCkse2lzT3BlbmluZzohMH0pKSk6KEw9MCwkPXgpfWZ1bmN0aW9uIHN0YXRlVGFnTmFtZShzKXt0Qy50ZXN0KHMpPygkPW5ldyBOQyhfX2Fzc2lnbihfX2Fzc2lnbih7fSwkKSx7bmFtZTpjYXB0dXJlVGFnTmFtZSgpfSkpLEw9NCk6IjwiPT09cz9zdGFydE5ld1RhZygpOiIvIj09PXM/KCQ9bmV3IE5DKF9fYXNzaWduKF9fYXNzaWduKHt9LCQpLHtuYW1lOmNhcHR1cmVUYWdOYW1lKCl9KSksTD0xMik6Ij4iPT09cz8oJD1uZXcgTkMoX19hc3NpZ24oX19hc3NpZ24oe30sJCkse25hbWU6Y2FwdHVyZVRhZ05hbWUoKX0pKSxlbWl0VGFnQW5kUHJldmlvdXNUZXh0Tm9kZSgpKTpRQS50ZXN0KHMpfHxaQS50ZXN0KHMpfHwiOiI9PT1zfHxyZXNldFRvRGF0YVN0YXRlKCl9ZnVuY3Rpb24gc3RhdGVFbmRUYWdPcGVuKHMpeyI+Ij09PXM/cmVzZXRUb0RhdGFTdGF0ZSgpOlFBLnRlc3Qocyk/TD0zOnJlc2V0VG9EYXRhU3RhdGUoKX1mdW5jdGlvbiBzdGF0ZUJlZm9yZUF0dHJpYnV0ZU5hbWUocyl7dEMudGVzdChzKXx8KCIvIj09PXM/TD0xMjoiPiI9PT1zP2VtaXRUYWdBbmRQcmV2aW91c1RleHROb2RlKCk6IjwiPT09cz9zdGFydE5ld1RhZygpOiI9Ij09PXN8fHJDLnRlc3Qocyl8fG5DLnRlc3Qocyk/cmVzZXRUb0RhdGFTdGF0ZSgpOkw9NSl9ZnVuY3Rpb24gc3RhdGVBdHRyaWJ1dGVOYW1lKHMpe3RDLnRlc3Qocyk/TD02OiIvIj09PXM/TD0xMjoiPSI9PT1zP0w9NzoiPiI9PT1zP2VtaXRUYWdBbmRQcmV2aW91c1RleHROb2RlKCk6IjwiPT09cz9zdGFydE5ld1RhZygpOnJDLnRlc3QocykmJnJlc2V0VG9EYXRhU3RhdGUoKX1mdW5jdGlvbiBzdGF0ZUFmdGVyQXR0cmlidXRlTmFtZShzKXt0Qy50ZXN0KHMpfHwoIi8iPT09cz9MPTEyOiI9Ij09PXM/TD03OiI+Ij09PXM/ZW1pdFRhZ0FuZFByZXZpb3VzVGV4dE5vZGUoKToiPCI9PT1zP3N0YXJ0TmV3VGFnKCk6ckMudGVzdChzKT9yZXNldFRvRGF0YVN0YXRlKCk6TD01KX1mdW5jdGlvbiBzdGF0ZUJlZm9yZUF0dHJpYnV0ZVZhbHVlKHMpe3RDLnRlc3Qocyl8fCgnIic9PT1zP0w9ODoiJyI9PT1zP0w9OTovWz49YF0vLnRlc3Qocyk/cmVzZXRUb0RhdGFTdGF0ZSgpOiI8Ij09PXM/c3RhcnROZXdUYWcoKTpMPTEwKX1mdW5jdGlvbiBzdGF0ZUF0dHJpYnV0ZVZhbHVlRG91YmxlUXVvdGVkKHMpeyciJz09PXMmJihMPTExKX1mdW5jdGlvbiBzdGF0ZUF0dHJpYnV0ZVZhbHVlU2luZ2xlUXVvdGVkKHMpeyInIj09PXMmJihMPTExKX1mdW5jdGlvbiBzdGF0ZUF0dHJpYnV0ZVZhbHVlVW5xdW90ZWQocyl7dEMudGVzdChzKT9MPTQ6Ij4iPT09cz9lbWl0VGFnQW5kUHJldmlvdXNUZXh0Tm9kZSgpOiI8Ij09PXMmJnN0YXJ0TmV3VGFnKCl9ZnVuY3Rpb24gc3RhdGVBZnRlckF0dHJpYnV0ZVZhbHVlUXVvdGVkKHMpe3RDLnRlc3Qocyk/TD00OiIvIj09PXM/TD0xMjoiPiI9PT1zP2VtaXRUYWdBbmRQcmV2aW91c1RleHROb2RlKCk6IjwiPT09cz9zdGFydE5ld1RhZygpOihMPTQsZnVuY3Rpb24gcmVjb25zdW1lQ3VycmVudENoYXJhY3Rlcigpe0MtLX0oKSl9ZnVuY3Rpb24gc3RhdGVTZWxmQ2xvc2luZ1N0YXJ0VGFnKHMpeyI+Ij09PXM/KCQ9bmV3IE5DKF9fYXNzaWduKF9fYXNzaWduKHt9LCQpLHtpc0Nsb3Npbmc6ITB9KSksZW1pdFRhZ0FuZFByZXZpb3VzVGV4dE5vZGUoKSk6TD00fWZ1bmN0aW9uIHN0YXRlTWFya3VwRGVjbGFyYXRpb25PcGVuKG8peyItLSI9PT1zLnN1YnN0cihDLDIpPyhDKz0yLCQ9bmV3IE5DKF9fYXNzaWduKF9fYXNzaWduKHt9LCQpLHt0eXBlOiJjb21tZW50In0pKSxMPTE0KToiRE9DVFlQRSI9PT1zLnN1YnN0cihDLDcpLnRvVXBwZXJDYXNlKCk/KEMrPTcsJD1uZXcgTkMoX19hc3NpZ24oX19hc3NpZ24oe30sJCkse3R5cGU6ImRvY3R5cGUifSkpLEw9MjApOnJlc2V0VG9EYXRhU3RhdGUoKX1mdW5jdGlvbiBzdGF0ZUNvbW1lbnRTdGFydChzKXsiLSI9PT1zP0w9MTU6Ij4iPT09cz9yZXNldFRvRGF0YVN0YXRlKCk6TD0xNn1mdW5jdGlvbiBzdGF0ZUNvbW1lbnRTdGFydERhc2gocyl7Ii0iPT09cz9MPTE4OiI+Ij09PXM/cmVzZXRUb0RhdGFTdGF0ZSgpOkw9MTZ9ZnVuY3Rpb24gc3RhdGVDb21tZW50KHMpeyItIj09PXMmJihMPTE3KX1mdW5jdGlvbiBzdGF0ZUNvbW1lbnRFbmREYXNoKHMpe0w9Ii0iPT09cz8xODoxNn1mdW5jdGlvbiBzdGF0ZUNvbW1lbnRFbmQocyl7Ij4iPT09cz9lbWl0VGFnQW5kUHJldmlvdXNUZXh0Tm9kZSgpOiIhIj09PXM/TD0xOToiLSI9PT1zfHwoTD0xNil9ZnVuY3Rpb24gc3RhdGVDb21tZW50RW5kQmFuZyhzKXsiLSI9PT1zP0w9MTc6Ij4iPT09cz9lbWl0VGFnQW5kUHJldmlvdXNUZXh0Tm9kZSgpOkw9MTZ9ZnVuY3Rpb24gc3RhdGVEb2N0eXBlKHMpeyI+Ij09PXM/ZW1pdFRhZ0FuZFByZXZpb3VzVGV4dE5vZGUoKToiPCI9PT1zJiZzdGFydE5ld1RhZygpfWZ1bmN0aW9uIHJlc2V0VG9EYXRhU3RhdGUoKXtMPTAsJD14fWZ1bmN0aW9uIHN0YXJ0TmV3VGFnKCl7TD0xLCQ9bmV3IE5DKHtpZHg6Q30pfWZ1bmN0aW9uIGVtaXRUYWdBbmRQcmV2aW91c1RleHROb2RlKCl7dmFyIG89cy5zbGljZShCLCQuaWR4KTtvJiZ1KG8sQiksImNvbW1lbnQiPT09JC50eXBlP18oJC5pZHgpOiJkb2N0eXBlIj09PSQudHlwZT93KCQuaWR4KTooJC5pc09wZW5pbmcmJmkoJC5uYW1lLCQuaWR4KSwkLmlzQ2xvc2luZyYmYSgkLm5hbWUsJC5pZHgpKSxyZXNldFRvRGF0YVN0YXRlKCksQj1DKzF9ZnVuY3Rpb24gY2FwdHVyZVRhZ05hbWUoKXt2YXIgbz0kLmlkeCsoJC5pc0Nsb3Npbmc/MjoxKTtyZXR1cm4gcy5zbGljZShvLEMpLnRvTG93ZXJDYXNlKCl9QjxDJiZmdW5jdGlvbiBlbWl0VGV4dCgpe3ZhciBvPXMuc2xpY2UoQixDKTt1KG8sQiksQj1DKzF9KCl9dmFyIE5DPWZ1bmN0aW9uIE5DKHMpe3ZvaWQgMD09PXMmJihzPXt9KSx0aGlzLmlkeD12b2lkIDAhPT1zLmlkeD9zLmlkeDotMSx0aGlzLnR5cGU9cy50eXBlfHwidGFnIix0aGlzLm5hbWU9cy5uYW1lfHwiIix0aGlzLmlzT3BlbmluZz0hIXMuaXNPcGVuaW5nLHRoaXMuaXNDbG9zaW5nPSEhcy5pc0Nsb3Npbmd9LE1DPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gQXV0b2xpbmtlcihzKXt2b2lkIDA9PT1zJiYocz17fSksdGhpcy52ZXJzaW9uPUF1dG9saW5rZXIudmVyc2lvbix0aGlzLnVybHM9e30sdGhpcy5lbWFpbD0hMCx0aGlzLnBob25lPSEwLHRoaXMuaGFzaHRhZz0hMSx0aGlzLm1lbnRpb249ITEsdGhpcy5uZXdXaW5kb3c9ITAsdGhpcy5zdHJpcFByZWZpeD17c2NoZW1lOiEwLHd3dzohMH0sdGhpcy5zdHJpcFRyYWlsaW5nU2xhc2g9ITAsdGhpcy5kZWNvZGVQZXJjZW50RW5jb2Rpbmc9ITAsdGhpcy50cnVuY2F0ZT17bGVuZ3RoOjAsbG9jYXRpb246ImVuZCJ9LHRoaXMuY2xhc3NOYW1lPSIiLHRoaXMucmVwbGFjZUZuPW51bGwsdGhpcy5jb250ZXh0PXZvaWQgMCx0aGlzLnNhbml0aXplSHRtbD0hMSx0aGlzLm1hdGNoZXJzPW51bGwsdGhpcy50YWdCdWlsZGVyPW51bGwsdGhpcy51cmxzPXRoaXMubm9ybWFsaXplVXJsc0NmZyhzLnVybHMpLHRoaXMuZW1haWw9ImJvb2xlYW4iPT10eXBlb2Ygcy5lbWFpbD9zLmVtYWlsOnRoaXMuZW1haWwsdGhpcy5waG9uZT0iYm9vbGVhbiI9PXR5cGVvZiBzLnBob25lP3MucGhvbmU6dGhpcy5waG9uZSx0aGlzLmhhc2h0YWc9cy5oYXNodGFnfHx0aGlzLmhhc2h0YWcsdGhpcy5tZW50aW9uPXMubWVudGlvbnx8dGhpcy5tZW50aW9uLHRoaXMubmV3V2luZG93PSJib29sZWFuIj09dHlwZW9mIHMubmV3V2luZG93P3MubmV3V2luZG93OnRoaXMubmV3V2luZG93LHRoaXMuc3RyaXBQcmVmaXg9dGhpcy5ub3JtYWxpemVTdHJpcFByZWZpeENmZyhzLnN0cmlwUHJlZml4KSx0aGlzLnN0cmlwVHJhaWxpbmdTbGFzaD0iYm9vbGVhbiI9PXR5cGVvZiBzLnN0cmlwVHJhaWxpbmdTbGFzaD9zLnN0cmlwVHJhaWxpbmdTbGFzaDp0aGlzLnN0cmlwVHJhaWxpbmdTbGFzaCx0aGlzLmRlY29kZVBlcmNlbnRFbmNvZGluZz0iYm9vbGVhbiI9PXR5cGVvZiBzLmRlY29kZVBlcmNlbnRFbmNvZGluZz9zLmRlY29kZVBlcmNlbnRFbmNvZGluZzp0aGlzLmRlY29kZVBlcmNlbnRFbmNvZGluZyx0aGlzLnNhbml0aXplSHRtbD1zLnNhbml0aXplSHRtbHx8ITE7dmFyIG89dGhpcy5tZW50aW9uO2lmKCExIT09byYmLTE9PT1bInR3aXR0ZXIiLCJpbnN0YWdyYW0iLCJzb3VuZGNsb3VkIiwidGlrdG9rIl0uaW5kZXhPZihvKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYG1lbnRpb25gIGNmZyAnIi5jb25jYXQobywiJyAtIHNlZSBkb2NzIikpO3ZhciBpPXRoaXMuaGFzaHRhZztpZighMSE9PWkmJi0xPT09eEMuaW5kZXhPZihpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYGhhc2h0YWdgIGNmZyAnIi5jb25jYXQoaSwiJyAtIHNlZSBkb2NzIikpO3RoaXMudHJ1bmNhdGU9dGhpcy5ub3JtYWxpemVUcnVuY2F0ZUNmZyhzLnRydW5jYXRlKSx0aGlzLmNsYXNzTmFtZT1zLmNsYXNzTmFtZXx8dGhpcy5jbGFzc05hbWUsdGhpcy5yZXBsYWNlRm49cy5yZXBsYWNlRm58fHRoaXMucmVwbGFjZUZuLHRoaXMuY29udGV4dD1zLmNvbnRleHR8fHRoaXN9cmV0dXJuIEF1dG9saW5rZXIubGluaz1mdW5jdGlvbihzLG8pe3JldHVybiBuZXcgQXV0b2xpbmtlcihvKS5saW5rKHMpfSxBdXRvbGlua2VyLnBhcnNlPWZ1bmN0aW9uKHMsbyl7cmV0dXJuIG5ldyBBdXRvbGlua2VyKG8pLnBhcnNlKHMpfSxBdXRvbGlua2VyLnByb3RvdHlwZS5ub3JtYWxpemVVcmxzQ2ZnPWZ1bmN0aW9uKHMpe3JldHVybiBudWxsPT1zJiYocz0hMCksImJvb2xlYW4iPT10eXBlb2Ygcz97c2NoZW1lTWF0Y2hlczpzLHd3d01hdGNoZXM6cyx0bGRNYXRjaGVzOnN9OntzY2hlbWVNYXRjaGVzOiJib29sZWFuIiE9dHlwZW9mIHMuc2NoZW1lTWF0Y2hlc3x8cy5zY2hlbWVNYXRjaGVzLHd3d01hdGNoZXM6ImJvb2xlYW4iIT10eXBlb2Ygcy53d3dNYXRjaGVzfHxzLnd3d01hdGNoZXMsdGxkTWF0Y2hlczoiYm9vbGVhbiIhPXR5cGVvZiBzLnRsZE1hdGNoZXN8fHMudGxkTWF0Y2hlc319LEF1dG9saW5rZXIucHJvdG90eXBlLm5vcm1hbGl6ZVN0cmlwUHJlZml4Q2ZnPWZ1bmN0aW9uKHMpe3JldHVybiBudWxsPT1zJiYocz0hMCksImJvb2xlYW4iPT10eXBlb2Ygcz97c2NoZW1lOnMsd3d3OnN9OntzY2hlbWU6ImJvb2xlYW4iIT10eXBlb2Ygcy5zY2hlbWV8fHMuc2NoZW1lLHd3dzoiYm9vbGVhbiIhPXR5cGVvZiBzLnd3d3x8cy53d3d9fSxBdXRvbGlua2VyLnByb3RvdHlwZS5ub3JtYWxpemVUcnVuY2F0ZUNmZz1mdW5jdGlvbihzKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHM/e2xlbmd0aDpzLGxvY2F0aW9uOiJlbmQifTpmdW5jdGlvbiBkZWZhdWx0cyhzLG8pe2Zvcih2YXIgaSBpbiBvKW8uaGFzT3duUHJvcGVydHkoaSkmJnZvaWQgMD09PXNbaV0mJihzW2ldPW9baV0pO3JldHVybiBzfShzfHx7fSx7bGVuZ3RoOk51bWJlci5QT1NJVElWRV9JTkZJTklUWSxsb2NhdGlvbjoiZW5kIn0pfSxBdXRvbGlua2VyLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihzKXt2YXIgbz10aGlzLGk9WyJhIiwic3R5bGUiLCJzY3JpcHQiXSxhPTAsdT1bXTtyZXR1cm4gcGFyc2VIdG1sKHMse29uT3BlblRhZzpmdW5jdGlvbihzKXtpLmluZGV4T2Yocyk+PTAmJmErK30sb25UZXh0OmZ1bmN0aW9uKHMsaSl7aWYoMD09PWEpe3ZhciBfPWZ1bmN0aW9uIHNwbGl0QW5kQ2FwdHVyZShzLG8pe2lmKCFvLmdsb2JhbCl0aHJvdyBuZXcgRXJyb3IoImBzcGxpdFJlZ2V4YCBtdXN0IGhhdmUgdGhlICdnJyBmbGFnIHNldCIpO2Zvcih2YXIgaSxhPVtdLHU9MDtpPW8uZXhlYyhzKTspYS5wdXNoKHMuc3Vic3RyaW5nKHUsaS5pbmRleCkpLGEucHVzaChpWzBdKSx1PWkuaW5kZXgraVswXS5sZW5ndGg7cmV0dXJuIGEucHVzaChzLnN1YnN0cmluZyh1KSksYX0ocywvKCZuYnNwO3wmIzE2MDt8Jmx0O3wmIzYwO3wmZ3Q7fCYjNjI7fCZxdW90O3wmIzM0O3wmIzM5OykvZ2kpLHc9aTtfLmZvckVhY2goKGZ1bmN0aW9uKHMsaSl7aWYoaSUyPT0wKXt2YXIgYT1vLnBhcnNlVGV4dChzLHcpO3UucHVzaC5hcHBseSh1LGEpfXcrPXMubGVuZ3RofSkpfX0sb25DbG9zZVRhZzpmdW5jdGlvbihzKXtpLmluZGV4T2Yocyk+PTAmJihhPU1hdGgubWF4KGEtMSwwKSl9LG9uQ29tbWVudDpmdW5jdGlvbihzKXt9LG9uRG9jdHlwZTpmdW5jdGlvbihzKXt9fSksdT10aGlzLmNvbXBhY3RNYXRjaGVzKHUpLHU9dGhpcy5yZW1vdmVVbndhbnRlZE1hdGNoZXModSl9LEF1dG9saW5rZXIucHJvdG90eXBlLmNvbXBhY3RNYXRjaGVzPWZ1bmN0aW9uKHMpe3Muc29ydCgoZnVuY3Rpb24ocyxvKXtyZXR1cm4gcy5nZXRPZmZzZXQoKS1vLmdldE9mZnNldCgpfSkpO2Zvcih2YXIgbz0wO288cy5sZW5ndGgtMTspe3ZhciBpPXNbb10sYT1pLmdldE9mZnNldCgpLHU9aS5nZXRNYXRjaGVkVGV4dCgpLmxlbmd0aCxfPWErdTtpZihvKzE8cy5sZW5ndGgpe2lmKHNbbysxXS5nZXRPZmZzZXQoKT09PWEpe3ZhciB3PXNbbysxXS5nZXRNYXRjaGVkVGV4dCgpLmxlbmd0aD51P286bysxO3Muc3BsaWNlKHcsMSk7Y29udGludWV9aWYoc1tvKzFdLmdldE9mZnNldCgpPF8pe3Muc3BsaWNlKG8rMSwxKTtjb250aW51ZX19bysrfXJldHVybiBzfSxBdXRvbGlua2VyLnByb3RvdHlwZS5yZW1vdmVVbndhbnRlZE1hdGNoZXM9ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuaGFzaHRhZ3x8dXRpbHNfcmVtb3ZlKHMsKGZ1bmN0aW9uKHMpe3JldHVybiJoYXNodGFnIj09PXMuZ2V0VHlwZSgpfSkpLHRoaXMuZW1haWx8fHV0aWxzX3JlbW92ZShzLChmdW5jdGlvbihzKXtyZXR1cm4iZW1haWwiPT09cy5nZXRUeXBlKCl9KSksdGhpcy5waG9uZXx8dXRpbHNfcmVtb3ZlKHMsKGZ1bmN0aW9uKHMpe3JldHVybiJwaG9uZSI9PT1zLmdldFR5cGUoKX0pKSx0aGlzLm1lbnRpb258fHV0aWxzX3JlbW92ZShzLChmdW5jdGlvbihzKXtyZXR1cm4ibWVudGlvbiI9PT1zLmdldFR5cGUoKX0pKSx0aGlzLnVybHMuc2NoZW1lTWF0Y2hlc3x8dXRpbHNfcmVtb3ZlKHMsKGZ1bmN0aW9uKHMpe3JldHVybiJ1cmwiPT09cy5nZXRUeXBlKCkmJiJzY2hlbWUiPT09cy5nZXRVcmxNYXRjaFR5cGUoKX0pKSx0aGlzLnVybHMud3d3TWF0Y2hlc3x8dXRpbHNfcmVtb3ZlKHMsKGZ1bmN0aW9uKHMpe3JldHVybiJ1cmwiPT09cy5nZXRUeXBlKCkmJiJ3d3ciPT09cy5nZXRVcmxNYXRjaFR5cGUoKX0pKSx0aGlzLnVybHMudGxkTWF0Y2hlc3x8dXRpbHNfcmVtb3ZlKHMsKGZ1bmN0aW9uKHMpe3JldHVybiJ1cmwiPT09cy5nZXRUeXBlKCkmJiJ0bGQiPT09cy5nZXRVcmxNYXRjaFR5cGUoKX0pKSxzfSxBdXRvbGlua2VyLnByb3RvdHlwZS5wYXJzZVRleHQ9ZnVuY3Rpb24ocyxvKXt2b2lkIDA9PT1vJiYobz0wKSxvPW98fDA7Zm9yKHZhciBpPXRoaXMuZ2V0TWF0Y2hlcnMoKSxhPVtdLHU9MCxfPWkubGVuZ3RoO3U8Xzt1Kyspe2Zvcih2YXIgdz1pW3VdLnBhcnNlTWF0Y2hlcyhzKSx4PTAsQz13Lmxlbmd0aDt4PEM7eCsrKXdbeF0uc2V0T2Zmc2V0KG8rd1t4XS5nZXRPZmZzZXQoKSk7YS5wdXNoLmFwcGx5KGEsdyl9cmV0dXJuIGF9LEF1dG9saW5rZXIucHJvdG90eXBlLmxpbms9ZnVuY3Rpb24ocyl7aWYoIXMpcmV0dXJuIiI7dGhpcy5zYW5pdGl6ZUh0bWwmJihzPXMucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikpO2Zvcih2YXIgbz10aGlzLnBhcnNlKHMpLGk9W10sYT0wLHU9MCxfPW8ubGVuZ3RoO3U8Xzt1Kyspe3ZhciB3PW9bdV07aS5wdXNoKHMuc3Vic3RyaW5nKGEsdy5nZXRPZmZzZXQoKSkpLGkucHVzaCh0aGlzLmNyZWF0ZU1hdGNoUmV0dXJuVmFsKHcpKSxhPXcuZ2V0T2Zmc2V0KCkrdy5nZXRNYXRjaGVkVGV4dCgpLmxlbmd0aH1yZXR1cm4gaS5wdXNoKHMuc3Vic3RyaW5nKGEpKSxpLmpvaW4oIiIpfSxBdXRvbGlua2VyLnByb3RvdHlwZS5jcmVhdGVNYXRjaFJldHVyblZhbD1mdW5jdGlvbihzKXt2YXIgbztyZXR1cm4gdGhpcy5yZXBsYWNlRm4mJihvPXRoaXMucmVwbGFjZUZuLmNhbGwodGhpcy5jb250ZXh0LHMpKSwic3RyaW5nIj09dHlwZW9mIG8/bzohMT09PW8/cy5nZXRNYXRjaGVkVGV4dCgpOm8gaW5zdGFuY2VvZiBVQT9vLnRvQW5jaG9yU3RyaW5nKCk6cy5idWlsZFRhZygpLnRvQW5jaG9yU3RyaW5nKCl9LEF1dG9saW5rZXIucHJvdG90eXBlLmdldE1hdGNoZXJzPWZ1bmN0aW9uKCl7aWYodGhpcy5tYXRjaGVycylyZXR1cm4gdGhpcy5tYXRjaGVyczt2YXIgcz10aGlzLmdldFRhZ0J1aWxkZXIoKSxvPVtuZXcgd0Moe3RhZ0J1aWxkZXI6cyxzZXJ2aWNlTmFtZTp0aGlzLmhhc2h0YWd9KSxuZXcgZ0Moe3RhZ0J1aWxkZXI6c30pLG5ldyBPQyh7dGFnQnVpbGRlcjpzfSksbmV3IFRDKHt0YWdCdWlsZGVyOnMsc2VydmljZU5hbWU6dGhpcy5tZW50aW9ufSksbmV3IF9DKHt0YWdCdWlsZGVyOnMsc3RyaXBQcmVmaXg6dGhpcy5zdHJpcFByZWZpeCxzdHJpcFRyYWlsaW5nU2xhc2g6dGhpcy5zdHJpcFRyYWlsaW5nU2xhc2gsZGVjb2RlUGVyY2VudEVuY29kaW5nOnRoaXMuZGVjb2RlUGVyY2VudEVuY29kaW5nfSldO3JldHVybiB0aGlzLm1hdGNoZXJzPW99LEF1dG9saW5rZXIucHJvdG90eXBlLmdldFRhZ0J1aWxkZXI9ZnVuY3Rpb24oKXt2YXIgcz10aGlzLnRhZ0J1aWxkZXI7cmV0dXJuIHN8fChzPXRoaXMudGFnQnVpbGRlcj1uZXcgVkEoe25ld1dpbmRvdzp0aGlzLm5ld1dpbmRvdyx0cnVuY2F0ZTp0aGlzLnRydW5jYXRlLGNsYXNzTmFtZTp0aGlzLmNsYXNzTmFtZX0pKSxzfSxBdXRvbGlua2VyLnZlcnNpb249IjMuMTYuMiIsQXV0b2xpbmtlci5BbmNob3JUYWdCdWlsZGVyPVZBLEF1dG9saW5rZXIuSHRtbFRhZz1VQSxBdXRvbGlua2VyLm1hdGNoZXI9e0VtYWlsOmdDLEhhc2h0YWc6d0MsTWF0Y2hlcjpYQSxNZW50aW9uOlRDLFBob25lOk9DLFVybDpfQ30sQXV0b2xpbmtlci5tYXRjaD17RW1haWw6SkEsSGFzaHRhZzpIQSxNYXRjaDp6QSxNZW50aW9uOktBLFBob25lOkdBLFVybDpZQX0sQXV0b2xpbmtlcn0oKTtjb25zdCBSQz1NQzt2YXIgREM9L3d3d3xAfFw6XC9cLy87ZnVuY3Rpb24gaXNMaW5rT3BlbihzKXtyZXR1cm4vXjxhWz5cc10vaS50ZXN0KHMpfWZ1bmN0aW9uIGlzTGlua0Nsb3NlKHMpe3JldHVybi9ePFwvYVxzKj4vaS50ZXN0KHMpfWZ1bmN0aW9uIGNyZWF0ZUxpbmtpZmllcigpe3ZhciBzPVtdLG89bmV3IFJDKHtzdHJpcFByZWZpeDohMSx1cmw6ITAsZW1haWw6ITAscmVwbGFjZUZuOmZ1bmN0aW9uKG8pe3N3aXRjaChvLmdldFR5cGUoKSl7Y2FzZSJ1cmwiOnMucHVzaCh7dGV4dDpvLm1hdGNoZWRUZXh0LHVybDpvLmdldFVybCgpfSk7YnJlYWs7Y2FzZSJlbWFpbCI6cy5wdXNoKHt0ZXh0Om8ubWF0Y2hlZFRleHQsdXJsOiJtYWlsdG86IitvLmdldEVtYWlsKCkucmVwbGFjZSgvXm1haWx0bzovaSwiIil9KX1yZXR1cm4hMX19KTtyZXR1cm57bGlua3M6cyxhdXRvbGlua2VyOm99fWZ1bmN0aW9uIHBhcnNlVG9rZW5zKHMpe3ZhciBvLGksYSx1LF8sdyx4LEMsaixMLEIsJCxVLFY9cy50b2tlbnMsej1udWxsO2ZvcihpPTAsYT1WLmxlbmd0aDtpPGE7aSsrKWlmKCJpbmxpbmUiPT09VltpXS50eXBlKWZvcihCPTAsbz0odT1WW2ldLmNoaWxkcmVuKS5sZW5ndGgtMTtvPj0wO28tLSlpZigibGlua19jbG9zZSIhPT0oXz11W29dKS50eXBlKXtpZigiaHRtbHRhZyI9PT1fLnR5cGUmJihpc0xpbmtPcGVuKF8uY29udGVudCkmJkI+MCYmQi0tLGlzTGlua0Nsb3NlKF8uY29udGVudCkmJkIrKyksIShCPjApJiYidGV4dCI9PT1fLnR5cGUmJkRDLnRlc3QoXy5jb250ZW50KSl7aWYoenx8KCQ9KHo9Y3JlYXRlTGlua2lmaWVyKCkpLmxpbmtzLFU9ei5hdXRvbGlua2VyKSx3PV8uY29udGVudCwkLmxlbmd0aD0wLFUubGluayh3KSwhJC5sZW5ndGgpY29udGludWU7Zm9yKHg9W10sTD1fLmxldmVsLEM9MDtDPCQubGVuZ3RoO0MrKylzLmlubGluZS52YWxpZGF0ZUxpbmsoJFtDXS51cmwpJiYoKGo9dy5pbmRleE9mKCRbQ10udGV4dCkpJiZ4LnB1c2goe3R5cGU6InRleHQiLGNvbnRlbnQ6dy5zbGljZSgwLGopLGxldmVsOkx9KSx4LnB1c2goe3R5cGU6Imxpbmtfb3BlbiIsaHJlZjokW0NdLnVybCx0aXRsZToiIixsZXZlbDpMKyt9KSx4LnB1c2goe3R5cGU6InRleHQiLGNvbnRlbnQ6JFtDXS50ZXh0LGxldmVsOkx9KSx4LnB1c2goe3R5cGU6ImxpbmtfY2xvc2UiLGxldmVsOi0tTH0pLHc9dy5zbGljZShqKyRbQ10udGV4dC5sZW5ndGgpKTt3Lmxlbmd0aCYmeC5wdXNoKHt0eXBlOiJ0ZXh0Iixjb250ZW50OncsbGV2ZWw6TH0pLFZbaV0uY2hpbGRyZW49dT1bXS5jb25jYXQodS5zbGljZSgwLG8pLHgsdS5zbGljZShvKzEpKX19ZWxzZSBmb3Ioby0tO3Vbb10ubGV2ZWwhPT1fLmxldmVsJiYibGlua19vcGVuIiE9PXVbb10udHlwZTspby0tfWZ1bmN0aW9uIGxpbmtpZnkocyl7cy5jb3JlLnJ1bGVyLnB1c2goImxpbmtpZnkiLHBhcnNlVG9rZW5zKX1jb25zdHtlbnRyaWVzOkxDLHNldFByb3RvdHlwZU9mOkZDLGlzRnJvemVuOkJDLGdldFByb3RvdHlwZU9mOiRDLGdldE93blByb3BlcnR5RGVzY3JpcHRvcjpxQ309T2JqZWN0O2xldHtmcmVlemU6VUMsc2VhbDpWQyxjcmVhdGU6ekN9PU9iamVjdCx7YXBwbHk6V0MsY29uc3RydWN0OkpDfT0idW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJlJlZmxlY3Q7VUN8fChVQz1mdW5jdGlvbiBmcmVlemUocyl7cmV0dXJuIHN9KSxWQ3x8KFZDPWZ1bmN0aW9uIHNlYWwocyl7cmV0dXJuIHN9KSxXQ3x8KFdDPWZ1bmN0aW9uIGFwcGx5KHMsbyxpKXtyZXR1cm4gcy5hcHBseShvLGkpfSksSkN8fChKQz1mdW5jdGlvbiBjb25zdHJ1Y3QocyxvKXtyZXR1cm4gbmV3IHMoLi4ubyl9KTtjb25zdCBIQz11bmFwcGx5KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKSxLQz11bmFwcGx5KEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZiksR0M9dW5hcHBseShBcnJheS5wcm90b3R5cGUucG9wKSxZQz11bmFwcGx5KEFycmF5LnByb3RvdHlwZS5wdXNoKSxYQz11bmFwcGx5KEFycmF5LnByb3RvdHlwZS5zcGxpY2UpLFFDPXVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS50b0xvd2VyQ2FzZSksWkM9dW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nKSxlaj11bmFwcGx5KFN0cmluZy5wcm90b3R5cGUubWF0Y2gpLGZqPXVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKSxtaj11bmFwcGx5KFN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiksX2o9dW5hcHBseShTdHJpbmcucHJvdG90eXBlLnRyaW0pLEFqPXVuYXBwbHkoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSksQ2o9dW5hcHBseShSZWdFeHAucHJvdG90eXBlLnRlc3QpLE5qPWZ1bmN0aW9uIHVuY29uc3RydWN0KHMpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGk9bmV3IEFycmF5KG8pLGE9MDthPG87YSsrKWlbYV09YXJndW1lbnRzW2FdO3JldHVybiBKQyhzLGkpfX0oVHlwZUVycm9yKTtmdW5jdGlvbiB1bmFwcGx5KHMpe3JldHVybiBmdW5jdGlvbihvKXtvIGluc3RhbmNlb2YgUmVnRXhwJiYoby5sYXN0SW5kZXg9MCk7Zm9yKHZhciBpPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkoaT4xP2ktMTowKSx1PTE7dTxpO3UrKylhW3UtMV09YXJndW1lbnRzW3VdO3JldHVybiBXQyhzLG8sYSl9fWZ1bmN0aW9uIGFkZFRvU2V0KHMsbyl7bGV0IGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOlFDO0ZDJiZGQyhzLG51bGwpO2xldCBhPW8ubGVuZ3RoO2Zvcig7YS0tOyl7bGV0IHU9b1thXTtpZigic3RyaW5nIj09dHlwZW9mIHUpe2NvbnN0IHM9aSh1KTtzIT09dSYmKEJDKG8pfHwob1thXT1zKSx1PXMpfXNbdV09ITB9cmV0dXJuIHN9ZnVuY3Rpb24gcHVyaWZ5X2VzX2NsZWFuQXJyYXkocyl7Zm9yKGxldCBvPTA7bzxzLmxlbmd0aDtvKyspe0FqKHMsbyl8fChzW29dPW51bGwpfXJldHVybiBzfWZ1bmN0aW9uIGNsb25lKHMpe2NvbnN0IG89ekMobnVsbCk7Zm9yKGNvbnN0W2ksYV1vZiBMQyhzKSl7QWoocyxpKSYmKEFycmF5LmlzQXJyYXkoYSk/b1tpXT1wdXJpZnlfZXNfY2xlYW5BcnJheShhKTphJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuY29uc3RydWN0b3I9PT1PYmplY3Q/b1tpXT1jbG9uZShhKTpvW2ldPWEpfXJldHVybiBvfWZ1bmN0aW9uIGxvb2t1cEdldHRlcihzLG8pe2Zvcig7bnVsbCE9PXM7KXtjb25zdCBpPXFDKHMsbyk7aWYoaSl7aWYoaS5nZXQpcmV0dXJuIHVuYXBwbHkoaS5nZXQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpLnZhbHVlKXJldHVybiB1bmFwcGx5KGkudmFsdWUpfXM9JEMocyl9cmV0dXJuIGZ1bmN0aW9uIGZhbGxiYWNrVmFsdWUoKXtyZXR1cm4gbnVsbH19Y29uc3QgQmo9VUMoWyJhIiwiYWJiciIsImFjcm9ueW0iLCJhZGRyZXNzIiwiYXJlYSIsImFydGljbGUiLCJhc2lkZSIsImF1ZGlvIiwiYiIsImJkaSIsImJkbyIsImJpZyIsImJsaW5rIiwiYmxvY2txdW90ZSIsImJvZHkiLCJiciIsImJ1dHRvbiIsImNhbnZhcyIsImNhcHRpb24iLCJjZW50ZXIiLCJjaXRlIiwiY29kZSIsImNvbCIsImNvbGdyb3VwIiwiY29udGVudCIsImRhdGEiLCJkYXRhbGlzdCIsImRkIiwiZGVjb3JhdG9yIiwiZGVsIiwiZGV0YWlscyIsImRmbiIsImRpYWxvZyIsImRpciIsImRpdiIsImRsIiwiZHQiLCJlbGVtZW50IiwiZW0iLCJmaWVsZHNldCIsImZpZ2NhcHRpb24iLCJmaWd1cmUiLCJmb250IiwiZm9vdGVyIiwiZm9ybSIsImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiIsImhlYWQiLCJoZWFkZXIiLCJoZ3JvdXAiLCJociIsImh0bWwiLCJpIiwiaW1nIiwiaW5wdXQiLCJpbnMiLCJrYmQiLCJsYWJlbCIsImxlZ2VuZCIsImxpIiwibWFpbiIsIm1hcCIsIm1hcmsiLCJtYXJxdWVlIiwibWVudSIsIm1lbnVpdGVtIiwibWV0ZXIiLCJuYXYiLCJub2JyIiwib2wiLCJvcHRncm91cCIsIm9wdGlvbiIsIm91dHB1dCIsInAiLCJwaWN0dXJlIiwicHJlIiwicHJvZ3Jlc3MiLCJxIiwicnAiLCJydCIsInJ1YnkiLCJzIiwic2FtcCIsInNlY3Rpb24iLCJzZWxlY3QiLCJzaGFkb3ciLCJzbWFsbCIsInNvdXJjZSIsInNwYWNlciIsInNwYW4iLCJzdHJpa2UiLCJzdHJvbmciLCJzdHlsZSIsInN1YiIsInN1bW1hcnkiLCJzdXAiLCJ0YWJsZSIsInRib2R5IiwidGQiLCJ0ZW1wbGF0ZSIsInRleHRhcmVhIiwidGZvb3QiLCJ0aCIsInRoZWFkIiwidGltZSIsInRyIiwidHJhY2siLCJ0dCIsInUiLCJ1bCIsInZhciIsInZpZGVvIiwid2JyIl0pLCRqPVVDKFsic3ZnIiwiYSIsImFsdGdseXBoIiwiYWx0Z2x5cGhkZWYiLCJhbHRnbHlwaGl0ZW0iLCJhbmltYXRlY29sb3IiLCJhbmltYXRlbW90aW9uIiwiYW5pbWF0ZXRyYW5zZm9ybSIsImNpcmNsZSIsImNsaXBwYXRoIiwiZGVmcyIsImRlc2MiLCJlbGxpcHNlIiwiZmlsdGVyIiwiZm9udCIsImciLCJnbHlwaCIsImdseXBocmVmIiwiaGtlcm4iLCJpbWFnZSIsImxpbmUiLCJsaW5lYXJncmFkaWVudCIsIm1hcmtlciIsIm1hc2siLCJtZXRhZGF0YSIsIm1wYXRoIiwicGF0aCIsInBhdHRlcm4iLCJwb2x5Z29uIiwicG9seWxpbmUiLCJyYWRpYWxncmFkaWVudCIsInJlY3QiLCJzdG9wIiwic3R5bGUiLCJzd2l0Y2giLCJzeW1ib2wiLCJ0ZXh0IiwidGV4dHBhdGgiLCJ0aXRsZSIsInRyZWYiLCJ0c3BhbiIsInZpZXciLCJ2a2VybiJdKSx6aj1VQyhbImZlQmxlbmQiLCJmZUNvbG9yTWF0cml4IiwiZmVDb21wb25lbnRUcmFuc2ZlciIsImZlQ29tcG9zaXRlIiwiZmVDb252b2x2ZU1hdHJpeCIsImZlRGlmZnVzZUxpZ2h0aW5nIiwiZmVEaXNwbGFjZW1lbnRNYXAiLCJmZURpc3RhbnRMaWdodCIsImZlRHJvcFNoYWRvdyIsImZlRmxvb2QiLCJmZUZ1bmNBIiwiZmVGdW5jQiIsImZlRnVuY0ciLCJmZUZ1bmNSIiwiZmVHYXVzc2lhbkJsdXIiLCJmZUltYWdlIiwiZmVNZXJnZSIsImZlTWVyZ2VOb2RlIiwiZmVNb3JwaG9sb2d5IiwiZmVPZmZzZXQiLCJmZVBvaW50TGlnaHQiLCJmZVNwZWN1bGFyTGlnaHRpbmciLCJmZVNwb3RMaWdodCIsImZlVGlsZSIsImZlVHVyYnVsZW5jZSJdKSxKaj1VQyhbImFuaW1hdGUiLCJjb2xvci1wcm9maWxlIiwiY3Vyc29yIiwiZGlzY2FyZCIsImZvbnQtZmFjZSIsImZvbnQtZmFjZS1mb3JtYXQiLCJmb250LWZhY2UtbmFtZSIsImZvbnQtZmFjZS1zcmMiLCJmb250LWZhY2UtdXJpIiwiZm9yZWlnbm9iamVjdCIsImhhdGNoIiwiaGF0Y2hwYXRoIiwibWVzaCIsIm1lc2hncmFkaWVudCIsIm1lc2hwYXRjaCIsIm1lc2hyb3ciLCJtaXNzaW5nLWdseXBoIiwic2NyaXB0Iiwic2V0Iiwic29saWRjb2xvciIsInVua25vd24iLCJ1c2UiXSksS2o9VUMoWyJtYXRoIiwibWVuY2xvc2UiLCJtZXJyb3IiLCJtZmVuY2VkIiwibWZyYWMiLCJtZ2x5cGgiLCJtaSIsIm1sYWJlbGVkdHIiLCJtbXVsdGlzY3JpcHRzIiwibW4iLCJtbyIsIm1vdmVyIiwibXBhZGRlZCIsIm1waGFudG9tIiwibXJvb3QiLCJtcm93IiwibXMiLCJtc3BhY2UiLCJtc3FydCIsIm1zdHlsZSIsIm1zdWIiLCJtc3VwIiwibXN1YnN1cCIsIm10YWJsZSIsIm10ZCIsIm10ZXh0IiwibXRyIiwibXVuZGVyIiwibXVuZGVyb3ZlciIsIm1wcmVzY3JpcHRzIl0pLEdqPVVDKFsibWFjdGlvbiIsIm1hbGlnbmdyb3VwIiwibWFsaWdubWFyayIsIm1sb25nZGl2IiwibXNjYXJyaWVzIiwibXNjYXJyeSIsIm1zZ3JvdXAiLCJtc3RhY2siLCJtc2xpbmUiLCJtc3JvdyIsInNlbWFudGljcyIsImFubm90YXRpb24iLCJhbm5vdGF0aW9uLXhtbCIsIm1wcmVzY3JpcHRzIiwibm9uZSJdKSxYaj1VQyhbIiN0ZXh0Il0pLGVQPVVDKFsiYWNjZXB0IiwiYWN0aW9uIiwiYWxpZ24iLCJhbHQiLCJhdXRvY2FwaXRhbGl6ZSIsImF1dG9jb21wbGV0ZSIsImF1dG9waWN0dXJlaW5waWN0dXJlIiwiYXV0b3BsYXkiLCJiYWNrZ3JvdW5kIiwiYmdjb2xvciIsImJvcmRlciIsImNhcHR1cmUiLCJjZWxscGFkZGluZyIsImNlbGxzcGFjaW5nIiwiY2hlY2tlZCIsImNpdGUiLCJjbGFzcyIsImNsZWFyIiwiY29sb3IiLCJjb2xzIiwiY29sc3BhbiIsImNvbnRyb2xzIiwiY29udHJvbHNsaXN0IiwiY29vcmRzIiwiY3Jvc3NvcmlnaW4iLCJkYXRldGltZSIsImRlY29kaW5nIiwiZGVmYXVsdCIsImRpciIsImRpc2FibGVkIiwiZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUiLCJkaXNhYmxlcmVtb3RlcGxheWJhY2siLCJkb3dubG9hZCIsImRyYWdnYWJsZSIsImVuY3R5cGUiLCJlbnRlcmtleWhpbnQiLCJmYWNlIiwiZm9yIiwiaGVhZGVycyIsImhlaWdodCIsImhpZGRlbiIsImhpZ2giLCJocmVmIiwiaHJlZmxhbmciLCJpZCIsImlucHV0bW9kZSIsImludGVncml0eSIsImlzbWFwIiwia2luZCIsImxhYmVsIiwibGFuZyIsImxpc3QiLCJsb2FkaW5nIiwibG9vcCIsImxvdyIsIm1heCIsIm1heGxlbmd0aCIsIm1lZGlhIiwibWV0aG9kIiwibWluIiwibWlubGVuZ3RoIiwibXVsdGlwbGUiLCJtdXRlZCIsIm5hbWUiLCJub25jZSIsIm5vc2hhZGUiLCJub3ZhbGlkYXRlIiwibm93cmFwIiwib3BlbiIsIm9wdGltdW0iLCJwYXR0ZXJuIiwicGxhY2Vob2xkZXIiLCJwbGF5c2lubGluZSIsInBvcG92ZXIiLCJwb3BvdmVydGFyZ2V0IiwicG9wb3ZlcnRhcmdldGFjdGlvbiIsInBvc3RlciIsInByZWxvYWQiLCJwdWJkYXRlIiwicmFkaW9ncm91cCIsInJlYWRvbmx5IiwicmVsIiwicmVxdWlyZWQiLCJyZXYiLCJyZXZlcnNlZCIsInJvbGUiLCJyb3dzIiwicm93c3BhbiIsInNwZWxsY2hlY2siLCJzY29wZSIsInNlbGVjdGVkIiwic2hhcGUiLCJzaXplIiwic2l6ZXMiLCJzcGFuIiwic3JjbGFuZyIsInN0YXJ0Iiwic3JjIiwic3Jjc2V0Iiwic3RlcCIsInN0eWxlIiwic3VtbWFyeSIsInRhYmluZGV4IiwidGl0bGUiLCJ0cmFuc2xhdGUiLCJ0eXBlIiwidXNlbWFwIiwidmFsaWduIiwidmFsdWUiLCJ3aWR0aCIsIndyYXAiLCJ4bWxucyIsInNsb3QiXSksdFA9VUMoWyJhY2NlbnQtaGVpZ2h0IiwiYWNjdW11bGF0ZSIsImFkZGl0aXZlIiwiYWxpZ25tZW50LWJhc2VsaW5lIiwiYW1wbGl0dWRlIiwiYXNjZW50IiwiYXR0cmlidXRlbmFtZSIsImF0dHJpYnV0ZXR5cGUiLCJhemltdXRoIiwiYmFzZWZyZXF1ZW5jeSIsImJhc2VsaW5lLXNoaWZ0IiwiYmVnaW4iLCJiaWFzIiwiYnkiLCJjbGFzcyIsImNsaXAiLCJjbGlwcGF0aHVuaXRzIiwiY2xpcC1wYXRoIiwiY2xpcC1ydWxlIiwiY29sb3IiLCJjb2xvci1pbnRlcnBvbGF0aW9uIiwiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIiwiY29sb3ItcHJvZmlsZSIsImNvbG9yLXJlbmRlcmluZyIsImN4IiwiY3kiLCJkIiwiZHgiLCJkeSIsImRpZmZ1c2Vjb25zdGFudCIsImRpcmVjdGlvbiIsImRpc3BsYXkiLCJkaXZpc29yIiwiZHVyIiwiZWRnZW1vZGUiLCJlbGV2YXRpb24iLCJlbmQiLCJleHBvbmVudCIsImZpbGwiLCJmaWxsLW9wYWNpdHkiLCJmaWxsLXJ1bGUiLCJmaWx0ZXIiLCJmaWx0ZXJ1bml0cyIsImZsb29kLWNvbG9yIiwiZmxvb2Qtb3BhY2l0eSIsImZvbnQtZmFtaWx5IiwiZm9udC1zaXplIiwiZm9udC1zaXplLWFkanVzdCIsImZvbnQtc3RyZXRjaCIsImZvbnQtc3R5bGUiLCJmb250LXZhcmlhbnQiLCJmb250LXdlaWdodCIsImZ4IiwiZnkiLCJnMSIsImcyIiwiZ2x5cGgtbmFtZSIsImdseXBocmVmIiwiZ3JhZGllbnR1bml0cyIsImdyYWRpZW50dHJhbnNmb3JtIiwiaGVpZ2h0IiwiaHJlZiIsImlkIiwiaW1hZ2UtcmVuZGVyaW5nIiwiaW4iLCJpbjIiLCJpbnRlcmNlcHQiLCJrIiwiazEiLCJrMiIsImszIiwiazQiLCJrZXJuaW5nIiwia2V5cG9pbnRzIiwia2V5c3BsaW5lcyIsImtleXRpbWVzIiwibGFuZyIsImxlbmd0aGFkanVzdCIsImxldHRlci1zcGFjaW5nIiwia2VybmVsbWF0cml4Iiwia2VybmVsdW5pdGxlbmd0aCIsImxpZ2h0aW5nLWNvbG9yIiwibG9jYWwiLCJtYXJrZXItZW5kIiwibWFya2VyLW1pZCIsIm1hcmtlci1zdGFydCIsIm1hcmtlcmhlaWdodCIsIm1hcmtlcnVuaXRzIiwibWFya2Vyd2lkdGgiLCJtYXNrY29udGVudHVuaXRzIiwibWFza3VuaXRzIiwibWF4IiwibWFzayIsIm1lZGlhIiwibWV0aG9kIiwibW9kZSIsIm1pbiIsIm5hbWUiLCJudW1vY3RhdmVzIiwib2Zmc2V0Iiwib3BlcmF0b3IiLCJvcGFjaXR5Iiwib3JkZXIiLCJvcmllbnQiLCJvcmllbnRhdGlvbiIsIm9yaWdpbiIsIm92ZXJmbG93IiwicGFpbnQtb3JkZXIiLCJwYXRoIiwicGF0aGxlbmd0aCIsInBhdHRlcm5jb250ZW50dW5pdHMiLCJwYXR0ZXJudHJhbnNmb3JtIiwicGF0dGVybnVuaXRzIiwicG9pbnRzIiwicHJlc2VydmVhbHBoYSIsInByZXNlcnZlYXNwZWN0cmF0aW8iLCJwcmltaXRpdmV1bml0cyIsInIiLCJyeCIsInJ5IiwicmFkaXVzIiwicmVmeCIsInJlZnkiLCJyZXBlYXRjb3VudCIsInJlcGVhdGR1ciIsInJlc3RhcnQiLCJyZXN1bHQiLCJyb3RhdGUiLCJzY2FsZSIsInNlZWQiLCJzaGFwZS1yZW5kZXJpbmciLCJzbG9wZSIsInNwZWN1bGFyY29uc3RhbnQiLCJzcGVjdWxhcmV4cG9uZW50Iiwic3ByZWFkbWV0aG9kIiwic3RhcnRvZmZzZXQiLCJzdGRkZXZpYXRpb24iLCJzdGl0Y2h0aWxlcyIsInN0b3AtY29sb3IiLCJzdG9wLW9wYWNpdHkiLCJzdHJva2UtZGFzaGFycmF5Iiwic3Ryb2tlLWRhc2hvZmZzZXQiLCJzdHJva2UtbGluZWNhcCIsInN0cm9rZS1saW5lam9pbiIsInN0cm9rZS1taXRlcmxpbWl0Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2UiLCJzdHJva2Utd2lkdGgiLCJzdHlsZSIsInN1cmZhY2VzY2FsZSIsInN5c3RlbWxhbmd1YWdlIiwidGFiaW5kZXgiLCJ0YWJsZXZhbHVlcyIsInRhcmdldHgiLCJ0YXJnZXR5IiwidHJhbnNmb3JtIiwidHJhbnNmb3JtLW9yaWdpbiIsInRleHQtYW5jaG9yIiwidGV4dC1kZWNvcmF0aW9uIiwidGV4dC1yZW5kZXJpbmciLCJ0ZXh0bGVuZ3RoIiwidHlwZSIsInUxIiwidTIiLCJ1bmljb2RlIiwidmFsdWVzIiwidmlld2JveCIsInZpc2liaWxpdHkiLCJ2ZXJzaW9uIiwidmVydC1hZHYteSIsInZlcnQtb3JpZ2luLXgiLCJ2ZXJ0LW9yaWdpbi15Iiwid2lkdGgiLCJ3b3JkLXNwYWNpbmciLCJ3cmFwIiwid3JpdGluZy1tb2RlIiwieGNoYW5uZWxzZWxlY3RvciIsInljaGFubmVsc2VsZWN0b3IiLCJ4IiwieDEiLCJ4MiIsInhtbG5zIiwieSIsInkxIiwieTIiLCJ6Iiwiem9vbWFuZHBhbiJdKSxyUD1VQyhbImFjY2VudCIsImFjY2VudHVuZGVyIiwiYWxpZ24iLCJiZXZlbGxlZCIsImNsb3NlIiwiY29sdW1uc2FsaWduIiwiY29sdW1ubGluZXMiLCJjb2x1bW5zcGFuIiwiZGVub21hbGlnbiIsImRlcHRoIiwiZGlyIiwiZGlzcGxheSIsImRpc3BsYXlzdHlsZSIsImVuY29kaW5nIiwiZmVuY2UiLCJmcmFtZSIsImhlaWdodCIsImhyZWYiLCJpZCIsImxhcmdlb3AiLCJsZW5ndGgiLCJsaW5ldGhpY2tuZXNzIiwibHNwYWNlIiwibHF1b3RlIiwibWF0aGJhY2tncm91bmQiLCJtYXRoY29sb3IiLCJtYXRoc2l6ZSIsIm1hdGh2YXJpYW50IiwibWF4c2l6ZSIsIm1pbnNpemUiLCJtb3ZhYmxlbGltaXRzIiwibm90YXRpb24iLCJudW1hbGlnbiIsIm9wZW4iLCJyb3dhbGlnbiIsInJvd2xpbmVzIiwicm93c3BhY2luZyIsInJvd3NwYW4iLCJyc3BhY2UiLCJycXVvdGUiLCJzY3JpcHRsZXZlbCIsInNjcmlwdG1pbnNpemUiLCJzY3JpcHRzaXplbXVsdGlwbGllciIsInNlbGVjdGlvbiIsInNlcGFyYXRvciIsInNlcGFyYXRvcnMiLCJzdHJldGNoeSIsInN1YnNjcmlwdHNoaWZ0Iiwic3Vwc2NyaXB0c2hpZnQiLCJzeW1tZXRyaWMiLCJ2b2Zmc2V0Iiwid2lkdGgiLCJ4bWxucyJdKSxuUD1VQyhbInhsaW5rOmhyZWYiLCJ4bWw6aWQiLCJ4bGluazp0aXRsZSIsInhtbDpzcGFjZSIsInhtbG5zOnhsaW5rIl0pLHNQPVZDKC9ce1x7W1x3XFddKnxbXHdcV10qXH1cfS9nbSksb1A9VkMoLzwlW1x3XFddKnxbXHdcV10qJT4vZ20pLGlQPVZDKC9cJFx7W1x3XFddKi9nbSksYVA9VkMoL15kYXRhLVtcLVx3Llx1MDBCNy1cdUZGRkZdKyQvKSxjUD1WQygvXmFyaWEtW1wtXHddKyQvKSxsUD1WQygvXig/Oig/Oig/OmZ8aHQpdHBzP3xtYWlsdG98dGVsfGNhbGx0b3xzbXN8Y2lkfHhtcHB8bWF0cml4KTp8W15hLXpdfFthLXorLlwtXSsoPzpbXmEteisuXC06XXwkKSkvaSksdVA9VkMoL14oPzpcdytzY3JpcHR8ZGF0YSk6L2kpLHBQPVZDKC9bXHUwMDAwLVx1MDAyMFx1MDBBMFx1MTY4MFx1MTgwRVx1MjAwMC1cdTIwMjlcdTIwNUZcdTMwMDBdL2cpLGhQPVZDKC9eaHRtbCQvaSksZFA9VkMoL15bYS16XVsuXHddKigtWy5cd10rKSskL2kpO3ZhciBmUD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxBUklBX0FUVFI6Y1AsQVRUUl9XSElURVNQQUNFOnBQLENVU1RPTV9FTEVNRU5UOmRQLERBVEFfQVRUUjphUCxET0NUWVBFX05BTUU6aFAsRVJCX0VYUFI6b1AsSVNfQUxMT1dFRF9VUkk6bFAsSVNfU0NSSVBUX09SX0RBVEE6dVAsTVVTVEFDSEVfRVhQUjpzUCxUTVBMSVRfRVhQUjppUH0pO2NvbnN0IG1QPTEsZ1A9Myx5UD03LHZQPTgsYlA9OSxTUD1mdW5jdGlvbiBnZXRHbG9iYWwoKXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz9udWxsOndpbmRvd307dmFyIF9QPWZ1bmN0aW9uIGNyZWF0ZURPTVB1cmlmeSgpe2xldCBzPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpTUCgpO2NvbnN0IERPTVB1cmlmeT1zPT5jcmVhdGVET01QdXJpZnkocyk7aWYoRE9NUHVyaWZ5LnZlcnNpb249IjMuMi42IixET01QdXJpZnkucmVtb3ZlZD1bXSwhc3x8IXMuZG9jdW1lbnR8fHMuZG9jdW1lbnQubm9kZVR5cGUhPT1iUHx8IXMuRWxlbWVudClyZXR1cm4gRE9NUHVyaWZ5LmlzU3VwcG9ydGVkPSExLERPTVB1cmlmeTtsZXR7ZG9jdW1lbnQ6b309cztjb25zdCBpPW8sYT1pLmN1cnJlbnRTY3JpcHQse0RvY3VtZW50RnJhZ21lbnQ6dSxIVE1MVGVtcGxhdGVFbGVtZW50Ol8sTm9kZTp3LEVsZW1lbnQ6eCxOb2RlRmlsdGVyOkMsTmFtZWROb2RlTWFwOmo9cy5OYW1lZE5vZGVNYXB8fHMuTW96TmFtZWRBdHRyTWFwLEhUTUxGb3JtRWxlbWVudDpMLERPTVBhcnNlcjpCLHRydXN0ZWRUeXBlczokfT1zLFU9eC5wcm90b3R5cGUsVj1sb29rdXBHZXR0ZXIoVSwiY2xvbmVOb2RlIiksej1sb29rdXBHZXR0ZXIoVSwicmVtb3ZlIiksWT1sb29rdXBHZXR0ZXIoVSwibmV4dFNpYmxpbmciKSxaPWxvb2t1cEdldHRlcihVLCJjaGlsZE5vZGVzIiksZWU9bG9va3VwR2V0dGVyKFUsInBhcmVudE5vZGUiKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgXyl7Y29uc3Qgcz1vLmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7cy5jb250ZW50JiZzLmNvbnRlbnQub3duZXJEb2N1bWVudCYmKG89cy5jb250ZW50Lm93bmVyRG9jdW1lbnQpfWxldCBpZSxhZT0iIjtjb25zdHtpbXBsZW1lbnRhdGlvbjpjZSxjcmVhdGVOb2RlSXRlcmF0b3I6bGUsY3JlYXRlRG9jdW1lbnRGcmFnbWVudDpwZSxnZXRFbGVtZW50c0J5VGFnTmFtZTpkZX09byx7aW1wb3J0Tm9kZTpmZX09aTtsZXQgeWU9e2FmdGVyU2FuaXRpemVBdHRyaWJ1dGVzOltdLGFmdGVyU2FuaXRpemVFbGVtZW50czpbXSxhZnRlclNhbml0aXplU2hhZG93RE9NOltdLGJlZm9yZVNhbml0aXplQXR0cmlidXRlczpbXSxiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzOltdLGJlZm9yZVNhbml0aXplU2hhZG93RE9NOltdLHVwb25TYW5pdGl6ZUF0dHJpYnV0ZTpbXSx1cG9uU2FuaXRpemVFbGVtZW50OltdLHVwb25TYW5pdGl6ZVNoYWRvd05vZGU6W119O0RPTVB1cmlmeS5pc1N1cHBvcnRlZD0iZnVuY3Rpb24iPT10eXBlb2YgTEMmJiJmdW5jdGlvbiI9PXR5cGVvZiBlZSYmY2UmJnZvaWQgMCE9PWNlLmNyZWF0ZUhUTUxEb2N1bWVudDtjb25zdHtNVVNUQUNIRV9FWFBSOmJlLEVSQl9FWFBSOlNlLFRNUExJVF9FWFBSOl9lLERBVEFfQVRUUjp3ZSxBUklBX0FUVFI6eGUsSVNfU0NSSVBUX09SX0RBVEE6UGUsQVRUUl9XSElURVNQQUNFOlRlLENVU1RPTV9FTEVNRU5UOlJlfT1mUDtsZXR7SVNfQUxMT1dFRF9VUkk6JGV9PWZQLHFlPW51bGw7Y29uc3QgemU9YWRkVG9TZXQoe30sWy4uLkJqLC4uLiRqLC4uLnpqLC4uLktqLC4uLlhqXSk7bGV0IFdlPW51bGw7Y29uc3QgSGU9YWRkVG9TZXQoe30sWy4uLmVQLC4uLnRQLC4uLnJQLC4uLm5QXSk7bGV0IFllPU9iamVjdC5zZWFsKHpDKG51bGwse3RhZ05hbWVDaGVjazp7d3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsdmFsdWU6bnVsbH0sYXR0cmlidXRlTmFtZUNoZWNrOnt3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCx2YWx1ZTpudWxsfSxhbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHM6e3dyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLHZhbHVlOiExfX0pKSxYZT1udWxsLFFlPW51bGwsZXQ9ITAsdHQ9ITAscnQ9ITEsbnQ9ITAsc3Q9ITEsb3Q9ITAsaXQ9ITEsYXQ9ITEsY3Q9ITEsbHQ9ITEsdXQ9ITEscHQ9ITEsaHQ9ITAsZHQ9ITEsbXQ9ITAsZ3Q9ITEseXQ9e30sdnQ9bnVsbDtjb25zdCBidD1hZGRUb1NldCh7fSxbImFubm90YXRpb24teG1sIiwiYXVkaW8iLCJjb2xncm91cCIsImRlc2MiLCJmb3JlaWdub2JqZWN0IiwiaGVhZCIsImlmcmFtZSIsIm1hdGgiLCJtaSIsIm1uIiwibW8iLCJtcyIsIm10ZXh0Iiwibm9lbWJlZCIsIm5vZnJhbWVzIiwibm9zY3JpcHQiLCJwbGFpbnRleHQiLCJzY3JpcHQiLCJzdHlsZSIsInN2ZyIsInRlbXBsYXRlIiwidGhlYWQiLCJ0aXRsZSIsInZpZGVvIiwieG1wIl0pO2xldCBTdD1udWxsO2NvbnN0IF90PWFkZFRvU2V0KHt9LFsiYXVkaW8iLCJ2aWRlbyIsImltZyIsInNvdXJjZSIsImltYWdlIiwidHJhY2siXSk7bGV0IEV0PW51bGw7Y29uc3Qgd3Q9YWRkVG9TZXQoe30sWyJhbHQiLCJjbGFzcyIsImZvciIsImlkIiwibGFiZWwiLCJuYW1lIiwicGF0dGVybiIsInBsYWNlaG9sZGVyIiwicm9sZSIsInN1bW1hcnkiLCJ0aXRsZSIsInZhbHVlIiwic3R5bGUiLCJ4bWxucyJdKSx4dD0iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCIsa3Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixPdD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI7bGV0IEF0PU90LEN0PSExLGp0PW51bGw7Y29uc3QgUHQ9YWRkVG9TZXQoe30sW3h0LGt0LE90XSxaQyk7bGV0IEl0PWFkZFRvU2V0KHt9LFsibWkiLCJtbyIsIm1uIiwibXMiLCJtdGV4dCJdKSxUdD1hZGRUb1NldCh7fSxbImFubm90YXRpb24teG1sIl0pO2NvbnN0IE50PWFkZFRvU2V0KHt9LFsidGl0bGUiLCJzdHlsZSIsImZvbnQiLCJhIiwic2NyaXB0Il0pO2xldCBNdD1udWxsO2NvbnN0IFJ0PVsiYXBwbGljYXRpb24veGh0bWwreG1sIiwidGV4dC9odG1sIl07bGV0IER0PW51bGwsTHQ9bnVsbDtjb25zdCBGdD1vLmNyZWF0ZUVsZW1lbnQoImZvcm0iKSxCdD1mdW5jdGlvbiBpc1JlZ2V4T3JGdW5jdGlvbihzKXtyZXR1cm4gcyBpbnN0YW5jZW9mIFJlZ0V4cHx8cyBpbnN0YW5jZW9mIEZ1bmN0aW9ufSwkdD1mdW5jdGlvbiBfcGFyc2VDb25maWcoKXtsZXQgcz1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e307aWYoIUx0fHxMdCE9PXMpe2lmKHMmJiJvYmplY3QiPT10eXBlb2Ygc3x8KHM9e30pLHM9Y2xvbmUocyksTXQ9LTE9PT1SdC5pbmRleE9mKHMuUEFSU0VSX01FRElBX1RZUEUpPyJ0ZXh0L2h0bWwiOnMuUEFSU0VSX01FRElBX1RZUEUsRHQ9ImFwcGxpY2F0aW9uL3hodG1sK3htbCI9PT1NdD9aQzpRQyxxZT1BaihzLCJBTExPV0VEX1RBR1MiKT9hZGRUb1NldCh7fSxzLkFMTE9XRURfVEFHUyxEdCk6emUsV2U9QWoocywiQUxMT1dFRF9BVFRSIik/YWRkVG9TZXQoe30scy5BTExPV0VEX0FUVFIsRHQpOkhlLGp0PUFqKHMsIkFMTE9XRURfTkFNRVNQQUNFUyIpP2FkZFRvU2V0KHt9LHMuQUxMT1dFRF9OQU1FU1BBQ0VTLFpDKTpQdCxFdD1BaihzLCJBRERfVVJJX1NBRkVfQVRUUiIpP2FkZFRvU2V0KGNsb25lKHd0KSxzLkFERF9VUklfU0FGRV9BVFRSLER0KTp3dCxTdD1BaihzLCJBRERfREFUQV9VUklfVEFHUyIpP2FkZFRvU2V0KGNsb25lKF90KSxzLkFERF9EQVRBX1VSSV9UQUdTLER0KTpfdCx2dD1BaihzLCJGT1JCSURfQ09OVEVOVFMiKT9hZGRUb1NldCh7fSxzLkZPUkJJRF9DT05URU5UUyxEdCk6YnQsWGU9QWoocywiRk9SQklEX1RBR1MiKT9hZGRUb1NldCh7fSxzLkZPUkJJRF9UQUdTLER0KTpjbG9uZSh7fSksUWU9QWoocywiRk9SQklEX0FUVFIiKT9hZGRUb1NldCh7fSxzLkZPUkJJRF9BVFRSLER0KTpjbG9uZSh7fSkseXQ9ISFBaihzLCJVU0VfUFJPRklMRVMiKSYmcy5VU0VfUFJPRklMRVMsZXQ9ITEhPT1zLkFMTE9XX0FSSUFfQVRUUix0dD0hMSE9PXMuQUxMT1dfREFUQV9BVFRSLHJ0PXMuQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFN8fCExLG50PSExIT09cy5BTExPV19TRUxGX0NMT1NFX0lOX0FUVFIsc3Q9cy5TQUZFX0ZPUl9URU1QTEFURVN8fCExLG90PSExIT09cy5TQUZFX0ZPUl9YTUwsaXQ9cy5XSE9MRV9ET0NVTUVOVHx8ITEsbHQ9cy5SRVRVUk5fRE9NfHwhMSx1dD1zLlJFVFVSTl9ET01fRlJBR01FTlR8fCExLHB0PXMuUkVUVVJOX1RSVVNURURfVFlQRXx8ITEsY3Q9cy5GT1JDRV9CT0RZfHwhMSxodD0hMSE9PXMuU0FOSVRJWkVfRE9NLGR0PXMuU0FOSVRJWkVfTkFNRURfUFJPUFN8fCExLG10PSExIT09cy5LRUVQX0NPTlRFTlQsZ3Q9cy5JTl9QTEFDRXx8ITEsJGU9cy5BTExPV0VEX1VSSV9SRUdFWFB8fGxQLEF0PXMuTkFNRVNQQUNFfHxPdCxJdD1zLk1BVEhNTF9URVhUX0lOVEVHUkFUSU9OX1BPSU5UU3x8SXQsVHQ9cy5IVE1MX0lOVEVHUkFUSU9OX1BPSU5UU3x8VHQsWWU9cy5DVVNUT01fRUxFTUVOVF9IQU5ETElOR3x8e30scy5DVVNUT01fRUxFTUVOVF9IQU5ETElORyYmQnQocy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy50YWdOYW1lQ2hlY2spJiYoWWUudGFnTmFtZUNoZWNrPXMuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcudGFnTmFtZUNoZWNrKSxzLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HJiZCdChzLkNVU1RPTV9FTEVNRU5UX0hBTkRMSU5HLmF0dHJpYnV0ZU5hbWVDaGVjaykmJihZZS5hdHRyaWJ1dGVOYW1lQ2hlY2s9cy5DVVNUT01fRUxFTUVOVF9IQU5ETElORy5hdHRyaWJ1dGVOYW1lQ2hlY2spLHMuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcmJiJib29sZWFuIj09dHlwZW9mIHMuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzJiYoWWUuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzPXMuQ1VTVE9NX0VMRU1FTlRfSEFORExJTkcuYWxsb3dDdXN0b21pemVkQnVpbHRJbkVsZW1lbnRzKSxzdCYmKHR0PSExKSx1dCYmKGx0PSEwKSx5dCYmKHFlPWFkZFRvU2V0KHt9LFhqKSxXZT1bXSwhMD09PXl0Lmh0bWwmJihhZGRUb1NldChxZSxCaiksYWRkVG9TZXQoV2UsZVApKSwhMD09PXl0LnN2ZyYmKGFkZFRvU2V0KHFlLCRqKSxhZGRUb1NldChXZSx0UCksYWRkVG9TZXQoV2UsblApKSwhMD09PXl0LnN2Z0ZpbHRlcnMmJihhZGRUb1NldChxZSx6aiksYWRkVG9TZXQoV2UsdFApLGFkZFRvU2V0KFdlLG5QKSksITA9PT15dC5tYXRoTWwmJihhZGRUb1NldChxZSxLaiksYWRkVG9TZXQoV2UsclApLGFkZFRvU2V0KFdlLG5QKSkpLHMuQUREX1RBR1MmJihxZT09PXplJiYocWU9Y2xvbmUocWUpKSxhZGRUb1NldChxZSxzLkFERF9UQUdTLER0KSkscy5BRERfQVRUUiYmKFdlPT09SGUmJihXZT1jbG9uZShXZSkpLGFkZFRvU2V0KFdlLHMuQUREX0FUVFIsRHQpKSxzLkFERF9VUklfU0FGRV9BVFRSJiZhZGRUb1NldChFdCxzLkFERF9VUklfU0FGRV9BVFRSLER0KSxzLkZPUkJJRF9DT05URU5UUyYmKHZ0PT09YnQmJih2dD1jbG9uZSh2dCkpLGFkZFRvU2V0KHZ0LHMuRk9SQklEX0NPTlRFTlRTLER0KSksbXQmJihxZVsiI3RleHQiXT0hMCksaXQmJmFkZFRvU2V0KHFlLFsiaHRtbCIsImhlYWQiLCJib2R5Il0pLHFlLnRhYmxlJiYoYWRkVG9TZXQocWUsWyJ0Ym9keSJdKSxkZWxldGUgWGUudGJvZHkpLHMuVFJVU1RFRF9UWVBFU19QT0xJQ1kpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBzLlRSVVNURURfVFlQRVNfUE9MSUNZLmNyZWF0ZUhUTUwpdGhyb3cgTmooJ1RSVVNURURfVFlQRVNfUE9MSUNZIGNvbmZpZ3VyYXRpb24gb3B0aW9uIG11c3QgcHJvdmlkZSBhICJjcmVhdGVIVE1MIiBob29rLicpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBzLlRSVVNURURfVFlQRVNfUE9MSUNZLmNyZWF0ZVNjcmlwdFVSTCl0aHJvdyBOaignVFJVU1RFRF9UWVBFU19QT0xJQ1kgY29uZmlndXJhdGlvbiBvcHRpb24gbXVzdCBwcm92aWRlIGEgImNyZWF0ZVNjcmlwdFVSTCIgaG9vay4nKTtpZT1zLlRSVVNURURfVFlQRVNfUE9MSUNZLGFlPWllLmNyZWF0ZUhUTUwoIiIpfWVsc2Ugdm9pZCAwPT09aWUmJihpZT1mdW5jdGlvbiBfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KHMsbyl7aWYoIm9iamVjdCIhPXR5cGVvZiBzfHwiZnVuY3Rpb24iIT10eXBlb2Ygcy5jcmVhdGVQb2xpY3kpcmV0dXJuIG51bGw7bGV0IGk9bnVsbDtjb25zdCBhPSJkYXRhLXR0LXBvbGljeS1zdWZmaXgiO28mJm8uaGFzQXR0cmlidXRlKGEpJiYoaT1vLmdldEF0dHJpYnV0ZShhKSk7Y29uc3QgdT0iZG9tcHVyaWZ5IisoaT8iIyIraToiIik7dHJ5e3JldHVybiBzLmNyZWF0ZVBvbGljeSh1LHtjcmVhdGVIVE1MOnM9PnMsY3JlYXRlU2NyaXB0VVJMOnM9PnN9KX1jYXRjaChzKXtyZXR1cm4gY29uc29sZS53YXJuKCJUcnVzdGVkVHlwZXMgcG9saWN5ICIrdSsiIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIpLG51bGx9fSgkLGEpKSxudWxsIT09aWUmJiJzdHJpbmciPT10eXBlb2YgYWUmJihhZT1pZS5jcmVhdGVIVE1MKCIiKSk7VUMmJlVDKHMpLEx0PXN9fSxxdD1hZGRUb1NldCh7fSxbLi4uJGosLi4uemosLi4uSmpdKSxVdD1hZGRUb1NldCh7fSxbLi4uS2osLi4uR2pdKSxWdD1mdW5jdGlvbiBfZm9yY2VSZW1vdmUocyl7WUMoRE9NUHVyaWZ5LnJlbW92ZWQse2VsZW1lbnQ6c30pO3RyeXtlZShzKS5yZW1vdmVDaGlsZChzKX1jYXRjaChvKXt6KHMpfX0senQ9ZnVuY3Rpb24gX3JlbW92ZUF0dHJpYnV0ZShzLG8pe3RyeXtZQyhET01QdXJpZnkucmVtb3ZlZCx7YXR0cmlidXRlOm8uZ2V0QXR0cmlidXRlTm9kZShzKSxmcm9tOm99KX1jYXRjaChzKXtZQyhET01QdXJpZnkucmVtb3ZlZCx7YXR0cmlidXRlOm51bGwsZnJvbTpvfSl9aWYoby5yZW1vdmVBdHRyaWJ1dGUocyksImlzIj09PXMpaWYobHR8fHV0KXRyeXtWdChvKX1jYXRjaChzKXt9ZWxzZSB0cnl7by5zZXRBdHRyaWJ1dGUocywiIil9Y2F0Y2gocyl7fX0sV3Q9ZnVuY3Rpb24gX2luaXREb2N1bWVudChzKXtsZXQgaT1udWxsLGE9bnVsbDtpZihjdClzPSI8cmVtb3ZlPjwvcmVtb3ZlPiIrcztlbHNle2NvbnN0IG89ZWoocywvXltcclxuXHQgXSsvKTthPW8mJm9bMF19ImFwcGxpY2F0aW9uL3hodG1sK3htbCI9PT1NdCYmQXQ9PT1PdCYmKHM9JzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48L2hlYWQ+PGJvZHk+JytzKyI8L2JvZHk+PC9odG1sPiIpO2NvbnN0IHU9aWU/aWUuY3JlYXRlSFRNTChzKTpzO2lmKEF0PT09T3QpdHJ5e2k9KG5ldyBCKS5wYXJzZUZyb21TdHJpbmcodSxNdCl9Y2F0Y2gocyl7fWlmKCFpfHwhaS5kb2N1bWVudEVsZW1lbnQpe2k9Y2UuY3JlYXRlRG9jdW1lbnQoQXQsInRlbXBsYXRlIixudWxsKTt0cnl7aS5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MPUN0P2FlOnV9Y2F0Y2gocyl7fX1jb25zdCBfPWkuYm9keXx8aS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHMmJmEmJl8uaW5zZXJ0QmVmb3JlKG8uY3JlYXRlVGV4dE5vZGUoYSksXy5jaGlsZE5vZGVzWzBdfHxudWxsKSxBdD09PU90P2RlLmNhbGwoaSxpdD8iaHRtbCI6ImJvZHkiKVswXTppdD9pLmRvY3VtZW50RWxlbWVudDpffSxKdD1mdW5jdGlvbiBfY3JlYXRlTm9kZUl0ZXJhdG9yKHMpe3JldHVybiBsZS5jYWxsKHMub3duZXJEb2N1bWVudHx8cyxzLEMuU0hPV19FTEVNRU5UfEMuU0hPV19DT01NRU5UfEMuU0hPV19URVhUfEMuU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OfEMuU0hPV19DREFUQV9TRUNUSU9OLG51bGwpfSxIdD1mdW5jdGlvbiBfaXNDbG9iYmVyZWQocyl7cmV0dXJuIHMgaW5zdGFuY2VvZiBMJiYoInN0cmluZyIhPXR5cGVvZiBzLm5vZGVOYW1lfHwic3RyaW5nIiE9dHlwZW9mIHMudGV4dENvbnRlbnR8fCJmdW5jdGlvbiIhPXR5cGVvZiBzLnJlbW92ZUNoaWxkfHwhKHMuYXR0cmlidXRlcyBpbnN0YW5jZW9mIGopfHwiZnVuY3Rpb24iIT10eXBlb2Ygcy5yZW1vdmVBdHRyaWJ1dGV8fCJmdW5jdGlvbiIhPXR5cGVvZiBzLnNldEF0dHJpYnV0ZXx8InN0cmluZyIhPXR5cGVvZiBzLm5hbWVzcGFjZVVSSXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHMuaW5zZXJ0QmVmb3JlfHwiZnVuY3Rpb24iIT10eXBlb2Ygcy5oYXNDaGlsZE5vZGVzKX0sS3Q9ZnVuY3Rpb24gX2lzTm9kZShzKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdyYmcyBpbnN0YW5jZW9mIHd9O2Z1bmN0aW9uIF9leGVjdXRlSG9va3MocyxvLGkpe0hDKHMsKHM9PntzLmNhbGwoRE9NUHVyaWZ5LG8saSxMdCl9KSl9Y29uc3QgR3Q9ZnVuY3Rpb24gX3Nhbml0aXplRWxlbWVudHMocyl7bGV0IG89bnVsbDtpZihfZXhlY3V0ZUhvb2tzKHllLmJlZm9yZVNhbml0aXplRWxlbWVudHMscyxudWxsKSxIdChzKSlyZXR1cm4gVnQocyksITA7Y29uc3QgaT1EdChzLm5vZGVOYW1lKTtpZihfZXhlY3V0ZUhvb2tzKHllLnVwb25TYW5pdGl6ZUVsZW1lbnQscyx7dGFnTmFtZTppLGFsbG93ZWRUYWdzOnFlfSksb3QmJnMuaGFzQ2hpbGROb2RlcygpJiYhS3Qocy5maXJzdEVsZW1lbnRDaGlsZCkmJkNqKC88Wy9cdyFdL2cscy5pbm5lckhUTUwpJiZDaigvPFsvXHchXS9nLHMudGV4dENvbnRlbnQpKXJldHVybiBWdChzKSwhMDtpZihzLm5vZGVUeXBlPT09eVApcmV0dXJuIFZ0KHMpLCEwO2lmKG90JiZzLm5vZGVUeXBlPT09dlAmJkNqKC88Wy9cd10vZyxzLmRhdGEpKXJldHVybiBWdChzKSwhMDtpZighcWVbaV18fFhlW2ldKXtpZighWGVbaV0mJlh0KGkpKXtpZihZZS50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAmJkNqKFllLnRhZ05hbWVDaGVjayxpKSlyZXR1cm4hMTtpZihZZS50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiYmWWUudGFnTmFtZUNoZWNrKGkpKXJldHVybiExfWlmKG10JiYhdnRbaV0pe2NvbnN0IG89ZWUocyl8fHMucGFyZW50Tm9kZSxpPVoocyl8fHMuY2hpbGROb2RlcztpZihpJiZvKXtmb3IobGV0IGE9aS5sZW5ndGgtMTthPj0wOy0tYSl7Y29uc3QgdT1WKGlbYV0sITApO3UuX19yZW1vdmFsQ291bnQ9KHMuX19yZW1vdmFsQ291bnR8fDApKzEsby5pbnNlcnRCZWZvcmUodSxZKHMpKX19fXJldHVybiBWdChzKSwhMH1yZXR1cm4gcyBpbnN0YW5jZW9mIHgmJiFmdW5jdGlvbiBfY2hlY2tWYWxpZE5hbWVzcGFjZShzKXtsZXQgbz1lZShzKTtvJiZvLnRhZ05hbWV8fChvPXtuYW1lc3BhY2VVUkk6QXQsdGFnTmFtZToidGVtcGxhdGUifSk7Y29uc3QgaT1RQyhzLnRhZ05hbWUpLGE9UUMoby50YWdOYW1lKTtyZXR1cm4hIWp0W3MubmFtZXNwYWNlVVJJXSYmKHMubmFtZXNwYWNlVVJJPT09a3Q/by5uYW1lc3BhY2VVUkk9PT1PdD8ic3ZnIj09PWk6by5uYW1lc3BhY2VVUkk9PT14dD8ic3ZnIj09PWkmJigiYW5ub3RhdGlvbi14bWwiPT09YXx8SXRbYV0pOkJvb2xlYW4ocXRbaV0pOnMubmFtZXNwYWNlVVJJPT09eHQ/by5uYW1lc3BhY2VVUkk9PT1PdD8ibWF0aCI9PT1pOm8ubmFtZXNwYWNlVVJJPT09a3Q/Im1hdGgiPT09aSYmVHRbYV06Qm9vbGVhbihVdFtpXSk6cy5uYW1lc3BhY2VVUkk9PT1PdD8hKG8ubmFtZXNwYWNlVVJJPT09a3QmJiFUdFthXSkmJiEoby5uYW1lc3BhY2VVUkk9PT14dCYmIUl0W2FdKSYmIVV0W2ldJiYoTnRbaV18fCFxdFtpXSk6ISgiYXBwbGljYXRpb24veGh0bWwreG1sIiE9PU10fHwhanRbcy5uYW1lc3BhY2VVUkldKSl9KHMpPyhWdChzKSwhMCk6Im5vc2NyaXB0IiE9PWkmJiJub2VtYmVkIiE9PWkmJiJub2ZyYW1lcyIhPT1pfHwhQ2ooLzxcL25vKHNjcmlwdHxlbWJlZHxmcmFtZXMpL2kscy5pbm5lckhUTUwpPyhzdCYmcy5ub2RlVHlwZT09PWdQJiYobz1zLnRleHRDb250ZW50LEhDKFtiZSxTZSxfZV0sKHM9PntvPWZqKG8scywiICIpfSkpLHMudGV4dENvbnRlbnQhPT1vJiYoWUMoRE9NUHVyaWZ5LnJlbW92ZWQse2VsZW1lbnQ6cy5jbG9uZU5vZGUoKX0pLHMudGV4dENvbnRlbnQ9bykpLF9leGVjdXRlSG9va3MoeWUuYWZ0ZXJTYW5pdGl6ZUVsZW1lbnRzLHMsbnVsbCksITEpOihWdChzKSwhMCl9LFl0PWZ1bmN0aW9uIF9pc1ZhbGlkQXR0cmlidXRlKHMsaSxhKXtpZihodCYmKCJpZCI9PT1pfHwibmFtZSI9PT1pKSYmKGEgaW4gb3x8YSBpbiBGdCkpcmV0dXJuITE7aWYodHQmJiFRZVtpXSYmQ2ood2UsaSkpO2Vsc2UgaWYoZXQmJkNqKHhlLGkpKTtlbHNlIGlmKCFXZVtpXXx8UWVbaV0pe2lmKCEoWHQocykmJihZZS50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAmJkNqKFllLnRhZ05hbWVDaGVjayxzKXx8WWUudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24mJlllLnRhZ05hbWVDaGVjayhzKSkmJihZZS5hdHRyaWJ1dGVOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAmJkNqKFllLmF0dHJpYnV0ZU5hbWVDaGVjayxpKXx8WWUuYXR0cmlidXRlTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24mJlllLmF0dHJpYnV0ZU5hbWVDaGVjayhpKSl8fCJpcyI9PT1pJiZZZS5hbGxvd0N1c3RvbWl6ZWRCdWlsdEluRWxlbWVudHMmJihZZS50YWdOYW1lQ2hlY2sgaW5zdGFuY2VvZiBSZWdFeHAmJkNqKFllLnRhZ05hbWVDaGVjayxhKXx8WWUudGFnTmFtZUNoZWNrIGluc3RhbmNlb2YgRnVuY3Rpb24mJlllLnRhZ05hbWVDaGVjayhhKSkpKXJldHVybiExfWVsc2UgaWYoRXRbaV0pO2Vsc2UgaWYoQ2ooJGUsZmooYSxUZSwiIikpKTtlbHNlIGlmKCJzcmMiIT09aSYmInhsaW5rOmhyZWYiIT09aSYmImhyZWYiIT09aXx8InNjcmlwdCI9PT1zfHwwIT09bWooYSwiZGF0YToiKXx8IVN0W3NdKXtpZihydCYmIUNqKFBlLGZqKGEsVGUsIiIpKSk7ZWxzZSBpZihhKXJldHVybiExfWVsc2U7cmV0dXJuITB9LFh0PWZ1bmN0aW9uIF9pc0Jhc2ljQ3VzdG9tRWxlbWVudChzKXtyZXR1cm4iYW5ub3RhdGlvbi14bWwiIT09cyYmZWoocyxSZSl9LFF0PWZ1bmN0aW9uIF9zYW5pdGl6ZUF0dHJpYnV0ZXMocyl7X2V4ZWN1dGVIb29rcyh5ZS5iZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXMscyxudWxsKTtjb25zdHthdHRyaWJ1dGVzOm99PXM7aWYoIW98fEh0KHMpKXJldHVybjtjb25zdCBpPXthdHRyTmFtZToiIixhdHRyVmFsdWU6IiIsa2VlcEF0dHI6ITAsYWxsb3dlZEF0dHJpYnV0ZXM6V2UsZm9yY2VLZWVwQXR0cjp2b2lkIDB9O2xldCBhPW8ubGVuZ3RoO2Zvcig7YS0tOyl7Y29uc3QgdT1vW2FdLHtuYW1lOl8sbmFtZXNwYWNlVVJJOncsdmFsdWU6eH09dSxDPUR0KF8pLGo9eDtsZXQgTD0idmFsdWUiPT09Xz9qOl9qKGopO2lmKGkuYXR0ck5hbWU9QyxpLmF0dHJWYWx1ZT1MLGkua2VlcEF0dHI9ITAsaS5mb3JjZUtlZXBBdHRyPXZvaWQgMCxfZXhlY3V0ZUhvb2tzKHllLnVwb25TYW5pdGl6ZUF0dHJpYnV0ZSxzLGkpLEw9aS5hdHRyVmFsdWUsIWR0fHwiaWQiIT09QyYmIm5hbWUiIT09Q3x8KHp0KF8scyksTD0idXNlci1jb250ZW50LSIrTCksb3QmJkNqKC8oKC0tIT98XSk+KXw8XC8oc3R5bGV8dGl0bGUpL2ksTCkpe3p0KF8scyk7Y29udGludWV9aWYoaS5mb3JjZUtlZXBBdHRyKWNvbnRpbnVlO2lmKCFpLmtlZXBBdHRyKXt6dChfLHMpO2NvbnRpbnVlfWlmKCFudCYmQ2ooL1wvPi9pLEwpKXt6dChfLHMpO2NvbnRpbnVlfXN0JiZIQyhbYmUsU2UsX2VdLChzPT57TD1maihMLHMsIiAiKX0pKTtjb25zdCBCPUR0KHMubm9kZU5hbWUpO2lmKFl0KEIsQyxMKSl7aWYoaWUmJiJvYmplY3QiPT10eXBlb2YgJCYmImZ1bmN0aW9uIj09dHlwZW9mICQuZ2V0QXR0cmlidXRlVHlwZSlpZih3KTtlbHNlIHN3aXRjaCgkLmdldEF0dHJpYnV0ZVR5cGUoQixDKSl7Y2FzZSJUcnVzdGVkSFRNTCI6TD1pZS5jcmVhdGVIVE1MKEwpO2JyZWFrO2Nhc2UiVHJ1c3RlZFNjcmlwdFVSTCI6TD1pZS5jcmVhdGVTY3JpcHRVUkwoTCl9aWYoTCE9PWopdHJ5e3c/cy5zZXRBdHRyaWJ1dGVOUyh3LF8sTCk6cy5zZXRBdHRyaWJ1dGUoXyxMKSxIdChzKT9WdChzKTpHQyhET01QdXJpZnkucmVtb3ZlZCl9Y2F0Y2gobyl7enQoXyxzKX19ZWxzZSB6dChfLHMpfV9leGVjdXRlSG9va3MoeWUuYWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXMscyxudWxsKX0sWnQ9ZnVuY3Rpb24gX3Nhbml0aXplU2hhZG93RE9NKHMpe2xldCBvPW51bGw7Y29uc3QgaT1KdChzKTtmb3IoX2V4ZWN1dGVIb29rcyh5ZS5iZWZvcmVTYW5pdGl6ZVNoYWRvd0RPTSxzLG51bGwpO289aS5uZXh0Tm9kZSgpOylfZXhlY3V0ZUhvb2tzKHllLnVwb25TYW5pdGl6ZVNoYWRvd05vZGUsbyxudWxsKSxHdChvKSxRdChvKSxvLmNvbnRlbnQgaW5zdGFuY2VvZiB1JiZfc2FuaXRpemVTaGFkb3dET00oby5jb250ZW50KTtfZXhlY3V0ZUhvb2tzKHllLmFmdGVyU2FuaXRpemVTaGFkb3dET00scyxudWxsKX07cmV0dXJuIERPTVB1cmlmeS5zYW5pdGl6ZT1mdW5jdGlvbihzKXtsZXQgbz1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30sYT1udWxsLF89bnVsbCx4PW51bGwsQz1udWxsO2lmKEN0PSFzLEN0JiYocz0iXHgzYyEtLVx4M2UiKSwic3RyaW5nIiE9dHlwZW9mIHMmJiFLdChzKSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHMudG9TdHJpbmcpdGhyb3cgTmooInRvU3RyaW5nIGlzIG5vdCBhIGZ1bmN0aW9uIik7aWYoInN0cmluZyIhPXR5cGVvZihzPXMudG9TdHJpbmcoKSkpdGhyb3cgTmooImRpcnR5IGlzIG5vdCBhIHN0cmluZywgYWJvcnRpbmciKX1pZighRE9NUHVyaWZ5LmlzU3VwcG9ydGVkKXJldHVybiBzO2lmKGF0fHwkdChvKSxET01QdXJpZnkucmVtb3ZlZD1bXSwic3RyaW5nIj09dHlwZW9mIHMmJihndD0hMSksZ3Qpe2lmKHMubm9kZU5hbWUpe2NvbnN0IG89RHQocy5ub2RlTmFtZSk7aWYoIXFlW29dfHxYZVtvXSl0aHJvdyBOaigicm9vdCBub2RlIGlzIGZvcmJpZGRlbiBhbmQgY2Fubm90IGJlIHNhbml0aXplZCBpbi1wbGFjZSIpfX1lbHNlIGlmKHMgaW5zdGFuY2VvZiB3KWE9V3QoIlx4M2MhLS0tLVx4M2UiKSxfPWEub3duZXJEb2N1bWVudC5pbXBvcnROb2RlKHMsITApLF8ubm9kZVR5cGU9PT1tUCYmIkJPRFkiPT09Xy5ub2RlTmFtZXx8IkhUTUwiPT09Xy5ub2RlTmFtZT9hPV86YS5hcHBlbmRDaGlsZChfKTtlbHNle2lmKCFsdCYmIXN0JiYhaXQmJi0xPT09cy5pbmRleE9mKCI8IikpcmV0dXJuIGllJiZwdD9pZS5jcmVhdGVIVE1MKHMpOnM7aWYoYT1XdChzKSwhYSlyZXR1cm4gbHQ/bnVsbDpwdD9hZToiIn1hJiZjdCYmVnQoYS5maXJzdENoaWxkKTtjb25zdCBqPUp0KGd0P3M6YSk7Zm9yKDt4PWoubmV4dE5vZGUoKTspR3QoeCksUXQoeCkseC5jb250ZW50IGluc3RhbmNlb2YgdSYmWnQoeC5jb250ZW50KTtpZihndClyZXR1cm4gcztpZihsdCl7aWYodXQpZm9yKEM9cGUuY2FsbChhLm93bmVyRG9jdW1lbnQpO2EuZmlyc3RDaGlsZDspQy5hcHBlbmRDaGlsZChhLmZpcnN0Q2hpbGQpO2Vsc2UgQz1hO3JldHVybihXZS5zaGFkb3dyb290fHxXZS5zaGFkb3dyb290bW9kZSkmJihDPWZlLmNhbGwoaSxDLCEwKSksQ31sZXQgTD1pdD9hLm91dGVySFRNTDphLmlubmVySFRNTDtyZXR1cm4gaXQmJnFlWyIhZG9jdHlwZSJdJiZhLm93bmVyRG9jdW1lbnQmJmEub3duZXJEb2N1bWVudC5kb2N0eXBlJiZhLm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lJiZDaihoUCxhLm93bmVyRG9jdW1lbnQuZG9jdHlwZS5uYW1lKSYmKEw9IjwhRE9DVFlQRSAiK2Eub3duZXJEb2N1bWVudC5kb2N0eXBlLm5hbWUrIj5cbiIrTCksc3QmJkhDKFtiZSxTZSxfZV0sKHM9PntMPWZqKEwscywiICIpfSkpLGllJiZwdD9pZS5jcmVhdGVIVE1MKEwpOkx9LERPTVB1cmlmeS5zZXRDb25maWc9ZnVuY3Rpb24oKXskdChhcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30pLGF0PSEwfSxET01QdXJpZnkuY2xlYXJDb25maWc9ZnVuY3Rpb24oKXtMdD1udWxsLGF0PSExfSxET01QdXJpZnkuaXNWYWxpZEF0dHJpYnV0ZT1mdW5jdGlvbihzLG8saSl7THR8fCR0KHt9KTtjb25zdCBhPUR0KHMpLHU9RHQobyk7cmV0dXJuIFl0KGEsdSxpKX0sRE9NUHVyaWZ5LmFkZEhvb2s9ZnVuY3Rpb24ocyxvKXsiZnVuY3Rpb24iPT10eXBlb2YgbyYmWUMoeWVbc10sbyl9LERPTVB1cmlmeS5yZW1vdmVIb29rPWZ1bmN0aW9uKHMsbyl7aWYodm9pZCAwIT09byl7Y29uc3QgaT1LQyh5ZVtzXSxvKTtyZXR1cm4tMT09PWk/dm9pZCAwOlhDKHllW3NdLGksMSlbMF19cmV0dXJuIEdDKHllW3NdKX0sRE9NUHVyaWZ5LnJlbW92ZUhvb2tzPWZ1bmN0aW9uKHMpe3llW3NdPVtdfSxET01QdXJpZnkucmVtb3ZlQWxsSG9va3M9ZnVuY3Rpb24oKXt5ZT17YWZ0ZXJTYW5pdGl6ZUF0dHJpYnV0ZXM6W10sYWZ0ZXJTYW5pdGl6ZUVsZW1lbnRzOltdLGFmdGVyU2FuaXRpemVTaGFkb3dET006W10sYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzOltdLGJlZm9yZVNhbml0aXplRWxlbWVudHM6W10sYmVmb3JlU2FuaXRpemVTaGFkb3dET006W10sdXBvblNhbml0aXplQXR0cmlidXRlOltdLHVwb25TYW5pdGl6ZUVsZW1lbnQ6W10sdXBvblNhbml0aXplU2hhZG93Tm9kZTpbXX19LERPTVB1cmlmeX0oKTtfUC5hZGRIb29rJiZfUC5hZGRIb29rKCJiZWZvcmVTYW5pdGl6ZUVsZW1lbnRzIiwoZnVuY3Rpb24ocyl7cmV0dXJuIHMuaHJlZiYmcy5zZXRBdHRyaWJ1dGUoInJlbCIsIm5vb3BlbmVyIG5vcmVmZXJyZXIiKSxzfSkpO2NvbnN0IEVQPWZ1bmN0aW9uIE1hcmtkb3duKHtzb3VyY2U6cyxjbGFzc05hbWU6bz0iIixnZXRDb25maWdzOmk9KCk9Pih7dXNlVW5zYWZlTWFya2Rvd246ITF9KX0pe2lmKCJzdHJpbmciIT10eXBlb2YgcylyZXR1cm4gbnVsbDtjb25zdCBhPW5ldyBSZW1hcmthYmxlKHtodG1sOiEwLHR5cG9ncmFwaGVyOiEwLGJyZWFrczohMCxsaW5rVGFyZ2V0OiJfYmxhbmsifSkudXNlKGxpbmtpZnkpO2EuY29yZS5ydWxlci5kaXNhYmxlKFsicmVwbGFjZW1lbnRzIiwic21hcnRxdW90ZXMiXSk7Y29uc3R7dXNlVW5zYWZlTWFya2Rvd246dX09aSgpLF89YS5yZW5kZXIocyksdz1zYW5pdGl6ZXIoXyx7dXNlVW5zYWZlTWFya2Rvd246dX0pO3JldHVybiBzJiZfJiZ3P1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTpKbigpKG8sIm1hcmtkb3duIiksZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDp3fX0pOm51bGx9O2Z1bmN0aW9uIHNhbml0aXplcihzLHt1c2VVbnNhZmVNYXJrZG93bjpvPSExfT17fSl7Y29uc3QgaT1vLGE9bz9bXTpbInN0eWxlIiwiY2xhc3MiXTtyZXR1cm4gbyYmIXNhbml0aXplci5oYXNXYXJuZWRBYm91dERlcHJlY2F0aW9uJiYoY29uc29sZS53YXJuKCJ1c2VVbnNhZmVNYXJrZG93biBkaXNwbGF5IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgc2luY2UgPjMuMjYuMCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHY0LjAuMC4iKSxzYW5pdGl6ZXIuaGFzV2FybmVkQWJvdXREZXByZWNhdGlvbj0hMCksX1Auc2FuaXRpemUocyx7QUREX0FUVFI6WyJ0YXJnZXQiXSxGT1JCSURfVEFHUzpbInN0eWxlIiwiZm9ybSJdLEFMTE9XX0RBVEFfQVRUUjppLEZPUkJJRF9BVFRSOmF9KX1zYW5pdGl6ZXIuaGFzV2FybmVkQWJvdXREZXByZWNhdGlvbj0hMTtjbGFzcyBCYXNlTGF5b3V0IGV4dGVuZHMgUmUuQ29tcG9uZW50e3JlbmRlcigpe2NvbnN0e2VyclNlbGVjdG9yczpzLHNwZWNTZWxlY3RvcnM6byxnZXRDb21wb25lbnQ6aX09dGhpcy5wcm9wcyxhPWkoIlN2Z0Fzc2V0cyIpLHU9aSgiSW5mb0NvbnRhaW5lciIsITApLF89aSgiVmVyc2lvblByYWdtYUZpbHRlciIpLHc9aSgib3BlcmF0aW9ucyIsITApLHg9aSgiTW9kZWxzIiwhMCksQz1pKCJXZWJob29rcyIsITApLGo9aSgiUm93IiksTD1pKCJDb2wiKSxCPWkoImVycm9ycyIsITApLCQ9aSgiU2VydmVyc0NvbnRhaW5lciIsITApLFU9aSgiU2NoZW1lc0NvbnRhaW5lciIsITApLFY9aSgiQXV0aG9yaXplQnRuQ29udGFpbmVyIiwhMCksej1pKCJGaWx0ZXJDb250YWluZXIiLCEwKSxZPW8uaXNTd2FnZ2VyMigpLFo9by5pc09BUzMoKSxlZT1vLmlzT0FTMzEoKSxpZT1vLmlzT0FTMzIoKSxhZT0hby5zcGVjU3RyKCksY2U9by5sb2FkaW5nU3RhdHVzKCk7bGV0IGxlPW51bGw7aWYoImxvYWRpbmciPT09Y2UmJihsZT1SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImluZm8ifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImxvYWRpbmctY29udGFpbmVyIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJsb2FkaW5nIn0pKSkpLCJmYWlsZWQiPT09Y2UmJihsZT1SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImluZm8ifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImxvYWRpbmctY29udGFpbmVyIn0sUmUuY3JlYXRlRWxlbWVudCgiaDQiLHtjbGFzc05hbWU6InRpdGxlIn0sIkZhaWxlZCB0byBsb2FkIEFQSSBkZWZpbml0aW9uLiIpLFJlLmNyZWF0ZUVsZW1lbnQoQixudWxsKSkpKSwiZmFpbGVkQ29uZmlnIj09PWNlKXtjb25zdCBvPXMubGFzdEVycm9yKCksaT1vP28uZ2V0KCJtZXNzYWdlIik6IiI7bGU9UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJpbmZvIGZhaWxlZC1jb25maWcifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImxvYWRpbmctY29udGFpbmVyIn0sUmUuY3JlYXRlRWxlbWVudCgiaDQiLHtjbGFzc05hbWU6InRpdGxlIn0sIkZhaWxlZCB0byBsb2FkIHJlbW90ZSBjb25maWd1cmF0aW9uLiIpLFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsaSkpKX1pZighbGUmJmFlJiYobGU9UmUuY3JlYXRlRWxlbWVudCgiaDQiLG51bGwsIk5vIEFQSSBkZWZpbml0aW9uIHByb3ZpZGVkLiIpKSxsZSlyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJzd2FnZ2VyLXVpIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJsb2FkaW5nLWNvbnRhaW5lciJ9LGxlKSk7Y29uc3QgcGU9by5zZXJ2ZXJzKCksZGU9by5zY2hlbWVzKCksZmU9cGUmJnBlLnNpemUseWU9ZGUmJmRlLnNpemUsYmU9ISFvLnNlY3VyaXR5RGVmaW5pdGlvbnMoKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJzd2FnZ2VyLXVpIn0sUmUuY3JlYXRlRWxlbWVudChhLG51bGwpLFJlLmNyZWF0ZUVsZW1lbnQoXyx7aXNTd2FnZ2VyMjpZLGlzT0FTMzpaLGlzT0FTMzE6ZWUsaXNPQVMzMjppZSxhbHNvU2hvdzpSZS5jcmVhdGVFbGVtZW50KEIsbnVsbCl9LFJlLmNyZWF0ZUVsZW1lbnQoQixudWxsKSxSZS5jcmVhdGVFbGVtZW50KGose2NsYXNzTmFtZToiaW5mb3JtYXRpb24tY29udGFpbmVyIn0sUmUuY3JlYXRlRWxlbWVudChMLHttb2JpbGU6MTJ9LFJlLmNyZWF0ZUVsZW1lbnQodSxudWxsKSkpLGZlfHx5ZXx8YmU/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJzY2hlbWUtY29udGFpbmVyIn0sUmUuY3JlYXRlRWxlbWVudChMLHtjbGFzc05hbWU6InNjaGVtZXMgd3JhcHBlciIsbW9iaWxlOjEyfSxmZXx8eWU/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJzY2hlbWVzLXNlcnZlci1jb250YWluZXIifSxmZT9SZS5jcmVhdGVFbGVtZW50KCQsbnVsbCk6bnVsbCx5ZT9SZS5jcmVhdGVFbGVtZW50KFUsbnVsbCk6bnVsbCk6bnVsbCxiZT9SZS5jcmVhdGVFbGVtZW50KFYsbnVsbCk6bnVsbCkpOm51bGwsUmUuY3JlYXRlRWxlbWVudCh6LG51bGwpLFJlLmNyZWF0ZUVsZW1lbnQoaixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoTCx7bW9iaWxlOjEyLGRlc2t0b3A6MTJ9LFJlLmNyZWF0ZUVsZW1lbnQodyxudWxsKSkpLGVlJiZSZS5jcmVhdGVFbGVtZW50KGose2NsYXNzTmFtZToid2ViaG9va3MtY29udGFpbmVyIn0sUmUuY3JlYXRlRWxlbWVudChMLHttb2JpbGU6MTIsZGVza3RvcDoxMn0sUmUuY3JlYXRlRWxlbWVudChDLG51bGwpKSksUmUuY3JlYXRlRWxlbWVudChqLG51bGwsUmUuY3JlYXRlRWxlbWVudChMLHttb2JpbGU6MTIsZGVza3RvcDoxMn0sUmUuY3JlYXRlRWxlbWVudCh4LG51bGwpKSkpKX19Y29uc3QgY29yZV9jb21wb25lbnRzPSgpPT4oe2NvbXBvbmVudHM6e0FwcDpWTyxhdXRob3JpemF0aW9uUG9wdXA6QXV0aG9yaXphdGlvblBvcHVwLGF1dGhvcml6ZUJ0bjpBdXRob3JpemVCdG4sQXV0aG9yaXplQnRuQ29udGFpbmVyLGF1dGhvcml6ZU9wZXJhdGlvbkJ0bjpBdXRob3JpemVPcGVyYXRpb25CdG4sYXV0aHM6QXV0aHMsQXV0aEl0ZW06YXV0aF9pdGVtX0F1dGhzLGF1dGhFcnJvcjpBdXRoRXJyb3Isb2F1dGgyOk9hdXRoMixhcGlLZXlBdXRoOkFwaUtleUF1dGgsYmFzaWNBdXRoOkJhc2ljQXV0aCxjbGVhcjpDbGVhcixsaXZlUmVzcG9uc2U6TGl2ZVJlc3BvbnNlLEluaXRpYWxpemVkSW5wdXQsaW5mbzpRTyxJbmZvQ29udGFpbmVyLEluZm9VcmwsSW5mb0Jhc2VQYXRoLENvbnRhY3Q6Wk8sTGljZW5zZTplQSxKdW1wVG9QYXRoLENvcHlUb0NsaXBib2FyZEJ0bixvbmxpbmVWYWxpZGF0b3JCYWRnZTpPbmxpbmVWYWxpZGF0b3JCYWRnZSxvcGVyYXRpb25zOk9wZXJhdGlvbnMsb3BlcmF0aW9uOm9wZXJhdGlvbl9PcGVyYXRpb24sT3BlcmF0aW9uU3VtbWFyeSxPcGVyYXRpb25TdW1tYXJ5TWV0aG9kLE9wZXJhdGlvblN1bW1hcnlQYXRoLHJlc3BvbnNlczpyZXNwb25zZXNfUmVzcG9uc2VzLHJlc3BvbnNlOnJlc3BvbnNlX1Jlc3BvbnNlLFJlc3BvbnNlRXh0ZW5zaW9uOnJlc3BvbnNlX2V4dGVuc2lvbixyZXNwb25zZUJvZHk6UmVzcG9uc2VCb2R5LHBhcmFtZXRlcnM6UGFyYW1ldGVycyxwYXJhbWV0ZXJSb3c6UGFyYW1ldGVyUm93LGV4ZWN1dGU6RXhlY3V0ZSxoZWFkZXJzOmhlYWRlcnNfSGVhZGVycyxlcnJvcnM6RXJyb3JzLGNvbnRlbnRUeXBlOkNvbnRlbnRUeXBlLG92ZXJ2aWV3Ok92ZXJ2aWV3LGZvb3RlcjpGb290ZXIsRmlsdGVyQ29udGFpbmVyLFBhcmFtQm9keSxjdXJsOkN1cmwsUHJvcGVydHk6cHJvcGVydHksVHJ5SXRPdXRCdXR0b24sTWFya2Rvd246RVAsQmFzZUxheW91dCxWZXJzaW9uUHJhZ21hRmlsdGVyLFZlcnNpb25TdGFtcDp2ZXJzaW9uX3N0YW1wLE9wZXJhdGlvbkV4dDpvcGVyYXRpb25fZXh0ZW5zaW9ucyxPcGVyYXRpb25FeHRSb3c6b3BlcmF0aW9uX2V4dGVuc2lvbl9yb3csUGFyYW1ldGVyRXh0OnBhcmFtZXRlcl9leHRlbnNpb24sUGFyYW1ldGVySW5jbHVkZUVtcHR5LE9wZXJhdGlvblRhZyxPcGVyYXRpb25Db250YWluZXIsT3BlbkFQSVZlcnNpb246b3BlbmFwaV92ZXJzaW9uLERlZXBMaW5rOmRlZXBfbGluayxTdmdBc3NldHM6c3ZnX2Fzc2V0cyxFeGFtcGxlOmV4YW1wbGVfRXhhbXBsZSxFeGFtcGxlc1NlbGVjdCxFeGFtcGxlc1NlbGVjdFZhbHVlUmV0YWluZXJ9fSksZm9ybV9jb21wb25lbnRzPSgpPT4oe2NvbXBvbmVudHM6ey4uLlNlfX0pLGJhc2U9KCk9Pltjb25maWdzUGx1Z2luLHV0aWwsbG9ncyx2aWV3LHZpZXdfbGVnYWN5LHBsdWdpbnNfc3BlYyxlcnIsaWNvbnMscGx1Z2luc19sYXlvdXQsanNvbl9zY2hlbWFfNSxqc29uX3NjaGVtYV81X3NhbXBsZXMsY29yZV9jb21wb25lbnRzLGZvcm1fY29tcG9uZW50cyxzd2FnZ2VyX2NsaWVudCxhdXRoLGRvd25sb2FkVXJsUGx1Z2luLGRlZXBfbGlua2luZyxmaWx0ZXIsb25fY29tcGxldGUscGx1Z2luc19yZXF1ZXN0X3NuaXBwZXRzLHN5bnRheF9oaWdobGlnaHRpbmcsdmVyc2lvbnMsc2FmZV9yZW5kZXIoKV0sd1A9KDAsemUuTWFwKSgpO2Z1bmN0aW9uIG9ubHlPQVMzKHMpe3JldHVybihvLGkpPT4oLi4uYSk9PntpZihpLmdldFN5c3RlbSgpLnNwZWNTZWxlY3RvcnMuaXNPQVMzKCkpe2NvbnN0IG89cyguLi5hKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbz9vKGkpOm99cmV0dXJuIG8oLi4uYSl9fWNvbnN0IHhQPW9ubHlPQVMzKHhzKCkobnVsbCkpLGtQPW9ubHlPQVMzKCgocyxvKT0+cz0+cy5nZXRTeXN0ZW0oKS5zcGVjU2VsZWN0b3JzLmZpbmRTY2hlbWEobykpKSxPUD1vbmx5T0FTMygoKCk9PnM9Pntjb25zdCBvPXMuZ2V0U3lzdGVtKCkuc3BlY1NlbGVjdG9ycy5zcGVjSnNvbigpLmdldEluKFsiY29tcG9uZW50cyIsInNjaGVtYXMiXSk7cmV0dXJuIHplLk1hcC5pc01hcChvKT9vOndQfSkpLEFQPW9ubHlPQVMzKCgoKT0+cz0+cy5nZXRTeXN0ZW0oKS5zcGVjU2VsZWN0b3JzLnNwZWNKc29uKCkuaGFzSW4oWyJzZXJ2ZXJzIiwwXSkpKSxDUD1vbmx5T0FTMyhVdChOcywocz0+cy5nZXRJbihbImNvbXBvbmVudHMiLCJzZWN1cml0eVNjaGVtZXMiXSl8fG51bGwpKSksd3JhcF9zZWxlY3RvcnNfdmFsaWRPcGVyYXRpb25NZXRob2RzPShzLG8pPT4oaSwuLi5hKT0+by5zcGVjU2VsZWN0b3JzLmlzT0FTMygpP28ub2FzM1NlbGVjdG9ycy52YWxpZE9wZXJhdGlvbk1ldGhvZHMoKTpzKC4uLmEpLGpQPXhQLFBQPXhQLElQPXhQLFRQPXhQLE5QPXhQO2NvbnN0IE1QPWZ1bmN0aW9uIHdyYXBfc2VsZWN0b3JzX29ubHlPQVMzKHMpe3JldHVybihvLGkpPT4oLi4uYSk9PntpZihpLmdldFN5c3RlbSgpLnNwZWNTZWxlY3RvcnMuaXNPQVMzKCkpe2xldCBvPWkuZ2V0U3RhdGUoKS5nZXRJbihbInNwZWMiLCJyZXNvbHZlZFN1YnRyZWVzIiwiY29tcG9uZW50cyIsInNlY3VyaXR5U2NoZW1lcyJdKTtyZXR1cm4gcyhpLG8sLi4uYSl9cmV0dXJuIG8oLi4uYSl9fShVdCgocz0+cyksKCh7c3BlY1NlbGVjdG9yczpzfSk9PnMuc2VjdXJpdHlEZWZpbml0aW9ucygpKSwoKHMsbyk9PntsZXQgaT0oMCx6ZS5MaXN0KSgpO3JldHVybiBvPyhvLmVudHJ5U2VxKCkuZm9yRWFjaCgoKFtzLG9dKT0+e2NvbnN0IGE9bz8uZ2V0KCJ0eXBlIik7aWYoIm9hdXRoMiI9PT1hJiZvLmdldCgiZmxvd3MiKS5lbnRyeVNlcSgpLmZvckVhY2goKChbYSx1XSk9PntsZXQgXz0oMCx6ZS5mcm9tSlMpKHtmbG93OmEsYXV0aG9yaXphdGlvblVybDp1LmdldCgiYXV0aG9yaXphdGlvblVybCIpLHRva2VuVXJsOnUuZ2V0KCJ0b2tlblVybCIpLHNjb3Blczp1LmdldCgic2NvcGVzIiksdHlwZTpvLmdldCgidHlwZSIpLGRlc2NyaXB0aW9uOm8uZ2V0KCJkZXNjcmlwdGlvbiIpfSk7aT1pLnB1c2gobmV3IHplLk1hcCh7W3NdOl8uZmlsdGVyKChzPT52b2lkIDAhPT1zKSl9KSl9KSksImh0dHAiIT09YSYmImFwaUtleSIhPT1hfHwoaT1pLnB1c2gobmV3IHplLk1hcCh7W3NdOm99KSkpLCJvcGVuSWRDb25uZWN0Ij09PWEmJm8uZ2V0KCJvcGVuSWRDb25uZWN0RGF0YSIpKXtsZXQgYT1vLmdldCgib3BlbklkQ29ubmVjdERhdGEiKTsoYS5nZXQoImdyYW50X3R5cGVzX3N1cHBvcnRlZCIpfHxbImF1dGhvcml6YXRpb25fY29kZSIsImltcGxpY2l0Il0pLmZvckVhY2goKHU9PntsZXQgXz1hLmdldCgic2NvcGVzX3N1cHBvcnRlZCIpJiZhLmdldCgic2NvcGVzX3N1cHBvcnRlZCIpLnJlZHVjZSgoKHMsbyk9PnMuc2V0KG8sIiIpKSxuZXcgemUuTWFwKSx3PSgwLHplLmZyb21KUykoe2Zsb3c6dSxhdXRob3JpemF0aW9uVXJsOmEuZ2V0KCJhdXRob3JpemF0aW9uX2VuZHBvaW50IiksdG9rZW5Vcmw6YS5nZXQoInRva2VuX2VuZHBvaW50Iiksc2NvcGVzOl8sdHlwZToib2F1dGgyIixvcGVuSWRDb25uZWN0VXJsOm8uZ2V0KCJvcGVuSWRDb25uZWN0VXJsIil9KTtpPWkucHVzaChuZXcgemUuTWFwKHtbc106dy5maWx0ZXIoKHM9PnZvaWQgMCE9PXMpKX0pKX0pKX19KSksaSk6aX0pKSk7ZnVuY3Rpb24gT0FTM0NvbXBvbmVudFdyYXBGYWN0b3J5KHMpe3JldHVybihvLGkpPT5hPT4iZnVuY3Rpb24iPT10eXBlb2YgaS5zcGVjU2VsZWN0b3JzPy5pc09BUzM/aS5zcGVjU2VsZWN0b3JzLmlzT0FTMygpP1JlLmNyZWF0ZUVsZW1lbnQocyxNbigpKHt9LGEsaSx7T3JpOm99KSk6UmUuY3JlYXRlRWxlbWVudChvLGEpOihjb25zb2xlLndhcm4oIk9BUzMgd3JhcHBlcjogY291bGRuJ3QgZ2V0IHNwZWMiKSxudWxsKX1jb25zdCBSUD0oMCx6ZS5NYXApKCksc2VsZWN0b3JzX2lzU3dhZ2dlcjI9KCk9PnM9PmZ1bmN0aW9uIGlzU3dhZ2dlcjIocyl7Y29uc3Qgbz1zLmdldCgic3dhZ2dlciIpO3JldHVybiJzdHJpbmciPT10eXBlb2YgbyYmIjIuMCI9PT1vfShzLmdldFN5c3RlbSgpLnNwZWNTZWxlY3RvcnMuc3BlY0pzb24oKSksc2VsZWN0b3JzX2lzT0FTMzA9KCk9PnM9PmZ1bmN0aW9uIGlzT0FTMzAocyl7Y29uc3Qgbz1zLmdldCgib3BlbmFwaSIpO3JldHVybiJzdHJpbmciPT10eXBlb2YgbyYmL14zXC4wXC4oPzpbMS05XVxkKnwwKSQvLnRlc3Qobyl9KHMuZ2V0U3lzdGVtKCkuc3BlY1NlbGVjdG9ycy5zcGVjSnNvbigpKSxzZWxlY3RvcnNfaXNPQVMzPSgpPT5zPT5zLmdldFN5c3RlbSgpLnNwZWNTZWxlY3RvcnMuaXNPQVMzMCgpO2Z1bmN0aW9uIHNlbGVjdG9yc19vbmx5T0FTMyhzKXtyZXR1cm4obywuLi5pKT0+YT0+e2lmKGEuc3BlY1NlbGVjdG9ycy5pc09BUzMoKSl7Y29uc3QgdT1zKG8sLi4uaSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHU/dShhKTp1fXJldHVybiBudWxsfX1jb25zdCBEUD1zZWxlY3RvcnNfb25seU9BUzMoKCgpPT5zPT5zLnNwZWNTZWxlY3RvcnMuc3BlY0pzb24oKS5nZXQoInNlcnZlcnMiLFJQKSkpLGZpbmRTY2hlbWE9KHMsbyk9Pntjb25zdCBpPXMuZ2V0SW4oWyJyZXNvbHZlZFN1YnRyZWVzIiwiY29tcG9uZW50cyIsInNjaGVtYXMiLG9dLG51bGwpLGE9cy5nZXRJbihbImpzb24iLCJjb21wb25lbnRzIiwic2NoZW1hcyIsb10sbnVsbCk7cmV0dXJuIGl8fGF8fG51bGx9LExQPXNlbGVjdG9yc19vbmx5T0FTMygoKHMse2NhbGxiYWNrczpvLHNwZWNQYXRoOml9KT0+cz0+e2NvbnN0IGE9cy5zcGVjU2VsZWN0b3JzLnZhbGlkT3BlcmF0aW9uTWV0aG9kcygpO3JldHVybiB6ZS5NYXAuaXNNYXAobyk/by5yZWR1Y2UoKChzLG8sdSk9PntpZighemUuTWFwLmlzTWFwKG8pKXJldHVybiBzO2NvbnN0IF89by5yZWR1Y2UoKChzLG8sXyk9PntpZighemUuTWFwLmlzTWFwKG8pKXJldHVybiBzO2NvbnN0IHc9by5lbnRyeVNlcSgpLmZpbHRlcigoKFtzXSk9PmEuaW5jbHVkZXMocykpKS5tYXAoKChbcyxvXSk9Pih7b3BlcmF0aW9uOigwLHplLk1hcCkoe29wZXJhdGlvbjpvfSksbWV0aG9kOnMscGF0aDpfLGNhbGxiYWNrTmFtZTp1LHNwZWNQYXRoOmkuY29uY2F0KFt1LF8sc10pfSkpKTtyZXR1cm4gcy5jb25jYXQodyl9KSwoMCx6ZS5MaXN0KSgpKTtyZXR1cm4gcy5jb25jYXQoXyl9KSwoMCx6ZS5MaXN0KSgpKS5ncm91cEJ5KChzPT5zLmNhbGxiYWNrTmFtZSkpLm1hcCgocz0+cy50b0FycmF5KCkpKS50b09iamVjdCgpOnt9fSkpLGNhbGxiYWNrcz0oe2NhbGxiYWNrczpzLHNwZWNQYXRoOm8sc3BlY1NlbGVjdG9yczppLGdldENvbXBvbmVudDphfSk9Pntjb25zdCB1PWkuY2FsbGJhY2tzT3BlcmF0aW9ucyh7Y2FsbGJhY2tzOnMsc3BlY1BhdGg6b30pLF89T2JqZWN0LmtleXModSksdz1hKCJPcGVyYXRpb25Db250YWluZXIiLCEwKTtyZXR1cm4gMD09PV8ubGVuZ3RoP1JlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsIk5vIGNhbGxiYWNrcyIpOlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxfLm1hcCgocz0+UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7a2V5OmAke3N9YH0sUmUuY3JlYXRlRWxlbWVudCgiaDIiLG51bGwscyksdVtzXS5tYXAoKG89PlJlLmNyZWF0ZUVsZW1lbnQodyx7a2V5OmAke3N9LSR7by5wYXRofS0ke28ubWV0aG9kfWAsb3A6by5vcGVyYXRpb24sdGFnOiJjYWxsYmFja3MiLG1ldGhvZDpvLm1ldGhvZCxwYXRoOm8ucGF0aCxzcGVjUGF0aDpvLnNwZWNQYXRoLGFsbG93VHJ5SXRPdXQ6ITF9KSkpKSkpKX0sZ2V0RGVmYXVsdFJlcXVlc3RCb2R5VmFsdWU9KHMsbyxpLGEpPT57Y29uc3QgdT1zLmdldEluKFsiY29udGVudCIsb10pPz8oMCx6ZS5PcmRlcmVkTWFwKSgpLF89dS5nZXQoInNjaGVtYSIsKDAsemUuT3JkZXJlZE1hcCkoKSksdz12b2lkIDAhPT11LmdldCgiZXhhbXBsZXMiKSx4PXUuZ2V0KCJleGFtcGxlIiksQz13P3UuZ2V0SW4oWyJleGFtcGxlcyIsaSwidmFsdWUiXSk6eDtyZXR1cm4gc3RyaW5naWZ5KGEuZ2V0U2FtcGxlU2NoZW1hKF8sbyx7aW5jbHVkZVdyaXRlT25seTohMH0sQykpfSxjb21wb25lbnRzX3JlcXVlc3RfYm9keT0oe3VzZXJIYXNFZGl0ZWRCb2R5OnMscmVxdWVzdEJvZHk6byxyZXF1ZXN0Qm9keVZhbHVlOmkscmVxdWVzdEJvZHlJbmNsdXNpb25TZXR0aW5nOmEscmVxdWVzdEJvZHlFcnJvcnM6dSxnZXRDb21wb25lbnQ6XyxnZXRDb25maWdzOncsc3BlY1NlbGVjdG9yczp4LGZuOkMsY29udGVudFR5cGU6aixpc0V4ZWN1dGU6TCxzcGVjUGF0aDpCLG9uQ2hhbmdlOiQsb25DaGFuZ2VJbmNsdWRlRW1wdHk6VSxhY3RpdmVFeGFtcGxlc0tleTpWLHVwZGF0ZUFjdGl2ZUV4YW1wbGVzS2V5Onosc2V0UmV0YWluUmVxdWVzdEJvZHlWYWx1ZUZsYWc6WX0pPT57Y29uc3QgaGFuZGxlRmlsZT1zPT57JChzLnRhcmdldC5maWxlc1swXSl9LHNldElzSW5jbHVkZWRPcHRpb25zPXM9PntsZXQgbz17a2V5OnMsc2hvdWxkRGlzcGF0Y2hJbml0OiExLGRlZmF1bHRWYWx1ZTohMH07cmV0dXJuIm5vIHZhbHVlIj09PWEuZ2V0KHMsIm5vIHZhbHVlIikmJihvLnNob3VsZERpc3BhdGNoSW5pdD0hMCksb30sWj1fKCJNYXJrZG93biIsITApLGVlPV8oIm1vZGVsRXhhbXBsZSIpLGllPV8oIlJlcXVlc3RCb2R5RWRpdG9yIiksYWU9XygiSGlnaGxpZ2h0Q29kZSIsITApLGNlPV8oIkV4YW1wbGVzU2VsZWN0VmFsdWVSZXRhaW5lciIpLGxlPV8oIkV4YW1wbGUiKSxwZT1fKCJQYXJhbWV0ZXJJbmNsdWRlRW1wdHkiKSx7c2hvd0NvbW1vbkV4dGVuc2lvbnM6ZGV9PXcoKSxmZT1vPy5nZXQoImRlc2NyaXB0aW9uIik/P251bGwseWU9bz8uZ2V0KCJjb250ZW50Iik/P25ldyB6ZS5PcmRlcmVkTWFwO2o9anx8eWUua2V5U2VxKCkuZmlyc3QoKXx8IiI7Y29uc3QgYmU9eWUuZ2V0KGopPz8oMCx6ZS5PcmRlcmVkTWFwKSgpLFNlPWJlLmdldCgic2NoZW1hIiwoMCx6ZS5PcmRlcmVkTWFwKSgpKSxfZT1iZS5nZXQoImV4YW1wbGVzIixudWxsKSx3ZT1fZT8ubWFwKCgocyxpKT0+e2NvbnN0IGE9cz8uZ2V0KCJ2YWx1ZSIsbnVsbCk7cmV0dXJuIGEmJihzPXMuc2V0KCJ2YWx1ZSIsZ2V0RGVmYXVsdFJlcXVlc3RCb2R5VmFsdWUobyxqLGksQyksYSkpLHN9KSk7dT16ZS5MaXN0LmlzTGlzdCh1KT91OigwLHplLkxpc3QpKCk7aWYoQy5pc0ZpbGVVcGxvYWRJbnRlbmRlZChiZT8uZ2V0KCJzY2hlbWEiKSxqKSl7Y29uc3Qgcz1fKCJJbnB1dCIpO3JldHVybiBMP1JlLmNyZWF0ZUVsZW1lbnQocyx7dHlwZToiZmlsZSIsb25DaGFuZ2U6aGFuZGxlRmlsZX0pOlJlLmNyZWF0ZUVsZW1lbnQoImkiLG51bGwsIkV4YW1wbGUgdmFsdWVzIGFyZSBub3QgYXZhaWxhYmxlIGZvciAiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsaiksIiBtZWRpYSB0eXBlcy4iKX1pZighYmUuc2l6ZSlyZXR1cm4gbnVsbDtpZihDLmhhc1NjaGVtYVR5cGUoYmUuZ2V0KCJzY2hlbWEiKSwib2JqZWN0IikmJigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIj09PWp8fDA9PT1qLmluZGV4T2YoIm11bHRpcGFydC8iKSkmJlNlLmdldCgicHJvcGVydGllcyIsKDAsemUuT3JkZXJlZE1hcCkoKSkuc2l6ZT4wKXtjb25zdCBzPV8oIkpzb25TY2hlbWFGb3JtIiksbz1fKCJQYXJhbWV0ZXJFeHQiKSxqPVNlLmdldCgicHJvcGVydGllcyIsKDAsemUuT3JkZXJlZE1hcCkoKSk7cmV0dXJuIGk9emUuTWFwLmlzTWFwKGkpP2k6KDAsemUuT3JkZXJlZE1hcCkoKSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InRhYmxlLWNvbnRhaW5lciJ9LGZlJiZSZS5jcmVhdGVFbGVtZW50KFose3NvdXJjZTpmZX0pLFJlLmNyZWF0ZUVsZW1lbnQoInRhYmxlIixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoInRib2R5IixudWxsLHplLk1hcC5pc01hcChqKSYmai5lbnRyeVNlcSgpLm1hcCgoKFtqLFZdKT0+e2lmKFYuZ2V0KCJyZWFkT25seSIpKXJldHVybjtjb25zdCB6PVYuZ2V0KCJvbmVPZiIpPy5nZXQoMCk/LnRvSlMoKSxZPVYuZ2V0KCJhbnlPZiIpPy5nZXQoMCk/LnRvSlMoKTtWPSgwLHplLmZyb21KUykoQy5tZXJnZUpzb25TY2hlbWEoVi50b0pTKCksej8/WT8/e30pKTtsZXQgaWU9ZGU/Z2V0Q29tbW9uRXh0ZW5zaW9ucyhWKTpudWxsO2NvbnN0IGFlPVNlLmdldCgicmVxdWlyZWQiLCgwLHplLkxpc3QpKCkpLmluY2x1ZGVzKGopLGNlPUMuZ2V0U2NoZW1hT2JqZWN0VHlwZShWKSxsZT1DLmdldFNjaGVtYU9iamVjdFR5cGVMYWJlbChWKSxmZT1DLmdldFNjaGVtYU9iamVjdFR5cGUoVj8uZ2V0KCJpdGVtcyIpKSx5ZT1WLmdldCgiZm9ybWF0IiksYmU9Vi5nZXQoImRlc2NyaXB0aW9uIiksX2U9aS5nZXRJbihbaiwidmFsdWUiXSksd2U9aS5nZXRJbihbaiwiZXJyb3JzIl0pfHx1LHhlPWEuZ2V0KGopfHwhMTtsZXQgUGU9Qy5nZXRTYW1wbGVTY2hlbWEoViwhMSx7aW5jbHVkZVdyaXRlT25seTohMH0pOyExPT09UGUmJihQZT0iZmFsc2UiKSwwPT09UGUmJihQZT0iMCIpLCJzdHJpbmciIT10eXBlb2YgUGUmJiJvYmplY3QiPT09Y2UmJihQZT1zdHJpbmdpZnkoUGUpKSwic3RyaW5nIj09dHlwZW9mIFBlJiYiYXJyYXkiPT09Y2UmJihQZT1KU09OLnBhcnNlKFBlKSk7Y29uc3QgVGU9Qy5pc0ZpbGVVcGxvYWRJbnRlbmRlZChWKSwkZT1SZS5jcmVhdGVFbGVtZW50KHMse2ZuOkMsZGlzcGF0Y2hJbml0aWFsVmFsdWU6IVRlLHNjaGVtYTpWLGRlc2NyaXB0aW9uOmosZ2V0Q29tcG9uZW50Ol8sdmFsdWU6dm9pZCAwPT09X2U/UGU6X2UscmVxdWlyZWQ6YWUsZXJyb3JzOndlLG9uQ2hhbmdlOnM9PnskKHMsW2pdKX19KTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgidHIiLHtrZXk6aixjbGFzc05hbWU6InBhcmFtZXRlcnMiLCJkYXRhLXByb3BlcnR5LW5hbWUiOmp9LFJlLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJwYXJhbWV0ZXJzLWNvbF9uYW1lIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOmFlPyJwYXJhbWV0ZXJfX25hbWUgcmVxdWlyZWQiOiJwYXJhbWV0ZXJfX25hbWUifSxqLGFlP1JlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsIsKgKiIpOm51bGwpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicGFyYW1ldGVyX190eXBlIn0sbGUseWUmJlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByb3AtZm9ybWF0In0sIigkIix5ZSwiKSIpLGRlJiZpZS5zaXplP2llLmVudHJ5U2VxKCkubWFwKCgoW3MsaV0pPT5SZS5jcmVhdGVFbGVtZW50KG8se2tleTpgJHtzfS0ke2l9YCx4S2V5OnMseFZhbDppfSkpKTpudWxsKSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InBhcmFtZXRlcl9fZGVwcmVjYXRlZCJ9LFYuZ2V0KCJkZXByZWNhdGVkIik/ImRlcHJlY2F0ZWQiOm51bGwpKSxSZS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToicGFyYW1ldGVycy1jb2xfZGVzY3JpcHRpb24ifSxSZS5jcmVhdGVFbGVtZW50KFose3NvdXJjZTpiZX0pLEw/UmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLCJvYmplY3QiPT09Y2V8fCJvYmplY3QiPT09ZmU/UmUuY3JlYXRlRWxlbWVudChlZSx7Z2V0Q29tcG9uZW50Ol8sc3BlY1BhdGg6Qi5wdXNoKCJzY2hlbWEiKSxnZXRDb25maWdzOncsaXNFeGVjdXRlOkwsc3BlY1NlbGVjdG9yczp4LHNjaGVtYTpWLGV4YW1wbGU6JGV9KTokZSxhZT9udWxsOlJlLmNyZWF0ZUVsZW1lbnQocGUse29uQ2hhbmdlOnM9PlUoaixzKSxpc0luY2x1ZGVkOnhlLGlzSW5jbHVkZWRPcHRpb25zOnNldElzSW5jbHVkZWRPcHRpb25zKGopLGlzRGlzYWJsZWQ6QXJyYXkuaXNBcnJheShfZSk/MCE9PV9lLmxlbmd0aDohaXNFbXB0eVZhbHVlKF9lKX0pKTpudWxsKSl9KSkpKSl9Y29uc3QgeGU9Z2V0RGVmYXVsdFJlcXVlc3RCb2R5VmFsdWUobyxqLFYsQyk7bGV0IFBlPW51bGw7Z2V0S25vd25TeW50YXhIaWdobGlnaHRlckxhbmd1YWdlKHhlKSYmKFBlPSJqc29uIik7Y29uc3QgVGU9TD9SZS5jcmVhdGVFbGVtZW50KGllLHt2YWx1ZTppLGVycm9yczp1LGRlZmF1bHRWYWx1ZTp4ZSxvbkNoYW5nZTokLGdldENvbXBvbmVudDpffSk6UmUuY3JlYXRlRWxlbWVudChhZSx7Y2xhc3NOYW1lOiJib2R5LXBhcmFtX19leGFtcGxlIixsYW5ndWFnZTpQZX0sc3RyaW5naWZ5KGkpfHx4ZSk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxmZSYmUmUuY3JlYXRlRWxlbWVudChaLHtzb3VyY2U6ZmV9KSx3ZT9SZS5jcmVhdGVFbGVtZW50KGNlLHt1c2VySGFzRWRpdGVkQm9keTpzLGV4YW1wbGVzOndlLGN1cnJlbnRLZXk6VixjdXJyZW50VXNlcklucHV0VmFsdWU6aSxvblNlbGVjdDpzPT57eihzKX0sdXBkYXRlVmFsdWU6JCxkZWZhdWx0VG9GaXJzdEV4YW1wbGU6ITAsZ2V0Q29tcG9uZW50Ol8sc2V0UmV0YWluUmVxdWVzdEJvZHlWYWx1ZUZsYWc6WX0pOm51bGwsUmUuY3JlYXRlRWxlbWVudChlZSx7Z2V0Q29tcG9uZW50Ol8sZ2V0Q29uZmlnczp3LHNwZWNTZWxlY3RvcnM6eCxleHBhbmREZXB0aDoxLGlzRXhlY3V0ZTpMLHNjaGVtYTpiZS5nZXQoInNjaGVtYSIpLHNwZWNQYXRoOkIucHVzaCgiY29udGVudCIsaiwic2NoZW1hIiksZXhhbXBsZTpUZSxpbmNsdWRlV3JpdGVPbmx5OiEwfSksd2U/UmUuY3JlYXRlRWxlbWVudChsZSx7ZXhhbXBsZTp3ZS5nZXQoViksZ2V0Q29tcG9uZW50Ol8sZ2V0Q29uZmlnczp3fSk6bnVsbCl9O2NsYXNzIG9wZXJhdGlvbl9saW5rX09wZXJhdGlvbkxpbmsgZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7Y29uc3R7bGluazpzLG5hbWU6byxnZXRDb21wb25lbnQ6aX09dGhpcy5wcm9wcyxhPWkoIk1hcmtkb3duIiwhMCk7bGV0IHU9cy5nZXQoIm9wZXJhdGlvbklkIil8fHMuZ2V0KCJvcGVyYXRpb25SZWYiKSxfPXMuZ2V0KCJwYXJhbWV0ZXJzIikmJnMuZ2V0KCJwYXJhbWV0ZXJzIikudG9KUygpLHc9cy5nZXQoImRlc2NyaXB0aW9uIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BlcmF0aW9uLWxpbmsifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImRlc2NyaXB0aW9uIn0sUmUuY3JlYXRlRWxlbWVudCgiYiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLG8pKSx3P1JlLmNyZWF0ZUVsZW1lbnQoYSx7c291cmNlOnd9KTpudWxsKSxSZS5jcmVhdGVFbGVtZW50KCJwcmUiLG51bGwsIk9wZXJhdGlvbiBgIix1LCJgIixSZS5jcmVhdGVFbGVtZW50KCJiciIsbnVsbCksUmUuY3JlYXRlRWxlbWVudCgiYnIiLG51bGwpLCJQYXJhbWV0ZXJzICIsZnVuY3Rpb24gcGFkU3RyaW5nKHMsbyl7aWYoInN0cmluZyIhPXR5cGVvZiBvKXJldHVybiIiO3JldHVybiBvLnNwbGl0KCJcbiIpLm1hcCgoKG8saSk9Pmk+MD9BcnJheShzKzEpLmpvaW4oIiAiKStvOm8pKS5qb2luKCJcbiIpfSgwLEpTT04uc3RyaW5naWZ5KF8sbnVsbCwyKSl8fCJ7fSIsUmUuY3JlYXRlRWxlbWVudCgiYnIiLG51bGwpKSl9fWNvbnN0IEZQPW9wZXJhdGlvbl9saW5rX09wZXJhdGlvbkxpbmssY29tcG9uZW50c19zZXJ2ZXJzPSh7c2VydmVyczpzLGN1cnJlbnRTZXJ2ZXI6byxzZXRTZWxlY3RlZFNlcnZlcjppLHNldFNlcnZlclZhcmlhYmxlVmFsdWU6YSxnZXRTZXJ2ZXJWYXJpYWJsZTp1LGdldEVmZmVjdGl2ZVNlcnZlclZhbHVlOl99KT0+e2NvbnN0IHc9KHMuZmluZCgocz0+cy5nZXQoInVybCIpPT09bykpfHwoMCx6ZS5PcmRlcmVkTWFwKSgpKS5nZXQoInZhcmlhYmxlcyIpfHwoMCx6ZS5PcmRlcmVkTWFwKSgpLHg9MCE9PXcuc2l6ZTsoMCxSZS51c2VFZmZlY3QpKCgoKT0+e298fGkocy5maXJzdCgpPy5nZXQoInVybCIpKX0pLFtdKSwoMCxSZS51c2VFZmZlY3QpKCgoKT0+e2NvbnN0IHU9cy5maW5kKChzPT5zLmdldCgidXJsIik9PT1vKSk7aWYoIXUpcmV0dXJuIHZvaWQgaShzLmZpcnN0KCkuZ2V0KCJ1cmwiKSk7KHUuZ2V0KCJ2YXJpYWJsZXMiKXx8KDAsemUuT3JkZXJlZE1hcCkoKSkubWFwKCgocyxpKT0+e2Eoe3NlcnZlcjpvLGtleTppLHZhbDpzLmdldCgiZGVmYXVsdCIpfHwiIn0pfSkpfSksW28sc10pO2NvbnN0IEM9KDAsUmUudXNlQ2FsbGJhY2spKChzPT57aShzLnRhcmdldC52YWx1ZSl9KSxbaV0pLGo9KDAsUmUudXNlQ2FsbGJhY2spKChzPT57Y29uc3QgaT1zLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtdmFyaWFibGUiKSx1PXMudGFyZ2V0LnZhbHVlO2Eoe3NlcnZlcjpvLGtleTppLHZhbDp1fSl9KSxbYSxvXSk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToic2VydmVycyJ9LFJlLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7aHRtbEZvcjoic2VydmVycyJ9LFJlLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIse29uQ2hhbmdlOkMsdmFsdWU6byxpZDoic2VydmVycyJ9LHMudmFsdWVTZXEoKS5tYXAoKHM9PlJlLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIse3ZhbHVlOnMuZ2V0KCJ1cmwiKSxrZXk6cy5nZXQoInVybCIpfSxzLmdldCgidXJsIikscy5nZXQoImRlc2NyaXB0aW9uIikmJmAgLSAke3MuZ2V0KCJkZXNjcmlwdGlvbiIpfWApKSkudG9BcnJheSgpKSkseCYmUmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiY29tcHV0ZWQtdXJsIn0sIkNvbXB1dGVkIFVSTDoiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsXyhvKSkpLFJlLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLCJTZXJ2ZXIgdmFyaWFibGVzIiksUmUuY3JlYXRlRWxlbWVudCgidGFibGUiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgidGJvZHkiLG51bGwsdy5lbnRyeVNlcSgpLm1hcCgoKFtzLGldKT0+UmUuY3JlYXRlRWxlbWVudCgidHIiLHtrZXk6c30sUmUuY3JlYXRlRWxlbWVudCgidGQiLG51bGwscyksUmUuY3JlYXRlRWxlbWVudCgidGQiLG51bGwsaS5nZXQoImVudW0iKT9SZS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiLHsiZGF0YS12YXJpYWJsZSI6cyxvbkNoYW5nZTpqfSxpLmdldCgiZW51bSIpLm1hcCgoaT0+UmUuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7c2VsZWN0ZWQ6aT09PXUobyxzKSxrZXk6aSx2YWx1ZTppfSxpKSkpKTpSZS5jcmVhdGVFbGVtZW50KCJpbnB1dCIse3R5cGU6InRleHQiLHZhbHVlOnUobyxzKXx8IiIsb25DaGFuZ2U6aiwiZGF0YS12YXJpYWJsZSI6c30pKSkpKSkpKSl9O2NsYXNzIFNlcnZlcnNDb250YWluZXIgZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7Y29uc3R7c3BlY1NlbGVjdG9yczpzLG9hczNTZWxlY3RvcnM6byxvYXMzQWN0aW9uczppLGdldENvbXBvbmVudDphfT10aGlzLnByb3BzLHU9cy5zZXJ2ZXJzKCksXz1hKCJTZXJ2ZXJzIik7cmV0dXJuIHUmJnUuc2l6ZT9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToic2VydmVycy10aXRsZSJ9LCJTZXJ2ZXJzIiksUmUuY3JlYXRlRWxlbWVudChfLHtzZXJ2ZXJzOnUsY3VycmVudFNlcnZlcjpvLnNlbGVjdGVkU2VydmVyKCksc2V0U2VsZWN0ZWRTZXJ2ZXI6aS5zZXRTZWxlY3RlZFNlcnZlcixzZXRTZXJ2ZXJWYXJpYWJsZVZhbHVlOmkuc2V0U2VydmVyVmFyaWFibGVWYWx1ZSxnZXRTZXJ2ZXJWYXJpYWJsZTpvLnNlcnZlclZhcmlhYmxlVmFsdWUsZ2V0RWZmZWN0aXZlU2VydmVyVmFsdWU6by5zZXJ2ZXJFZmZlY3RpdmVWYWx1ZX0pKTpudWxsfX1jb25zdCBCUD1GdW5jdGlvbi5wcm90b3R5cGU7Y2xhc3MgUmVxdWVzdEJvZHlFZGl0b3IgZXh0ZW5kcyBSZS5QdXJlQ29tcG9uZW50e3N0YXRpYyBkZWZhdWx0UHJvcHM9e29uQ2hhbmdlOkJQLHVzZXJIYXNFZGl0ZWRCb2R5OiExfTtjb25zdHJ1Y3RvcihzLG8pe3N1cGVyKHMsbyksdGhpcy5zdGF0ZT17dmFsdWU6c3RyaW5naWZ5KHMudmFsdWUpfHxzLmRlZmF1bHRWYWx1ZX0scy5vbkNoYW5nZShzLnZhbHVlKX1hcHBseURlZmF1bHRWYWx1ZT1zPT57Y29uc3R7b25DaGFuZ2U6byxkZWZhdWx0VmFsdWU6aX09c3x8dGhpcy5wcm9wcztyZXR1cm4gdGhpcy5zZXRTdGF0ZSh7dmFsdWU6aX0pLG8oaSl9O29uQ2hhbmdlPXM9Pnt0aGlzLnByb3BzLm9uQ2hhbmdlKHN0cmluZ2lmeShzKSl9O29uRG9tQ2hhbmdlPXM9Pntjb25zdCBvPXMudGFyZ2V0LnZhbHVlO3RoaXMuc2V0U3RhdGUoe3ZhbHVlOm99LCgoKT0+dGhpcy5vbkNoYW5nZShvKSkpfTtVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhzKXt0aGlzLnByb3BzLnZhbHVlIT09cy52YWx1ZSYmcy52YWx1ZSE9PXRoaXMuc3RhdGUudmFsdWUmJnRoaXMuc2V0U3RhdGUoe3ZhbHVlOnN0cmluZ2lmeShzLnZhbHVlKX0pLCFzLnZhbHVlJiZzLmRlZmF1bHRWYWx1ZSYmdGhpcy5zdGF0ZS52YWx1ZSYmdGhpcy5hcHBseURlZmF1bHRWYWx1ZShzKX1yZW5kZXIoKXtsZXR7Z2V0Q29tcG9uZW50OnMsZXJyb3JzOm99PXRoaXMucHJvcHMse3ZhbHVlOml9PXRoaXMuc3RhdGUsYT1vLnNpemU+MDtjb25zdCB1PXMoIlRleHRBcmVhIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYm9keS1wYXJhbSJ9LFJlLmNyZWF0ZUVsZW1lbnQodSx7Y2xhc3NOYW1lOkpuKCkoImJvZHktcGFyYW1fX3RleHQiLHtpbnZhbGlkOmF9KSx0aXRsZTpvLnNpemU/by5qb2luKCIsICIpOiIiLHZhbHVlOmksb25DaGFuZ2U6dGhpcy5vbkRvbUNoYW5nZX0pKX19Y2xhc3MgSHR0cEF1dGggZXh0ZW5kcyBSZS5Db21wb25lbnR7Y29uc3RydWN0b3IocyxvKXtzdXBlcihzLG8pO2xldHtuYW1lOmksc2NoZW1hOmF9PXRoaXMucHJvcHMsdT10aGlzLmdldFZhbHVlKCk7dGhpcy5zdGF0ZT17bmFtZTppLHNjaGVtYTphLHZhbHVlOnV9fWdldFZhbHVlKCl7bGV0e25hbWU6cyxhdXRob3JpemVkOm99PXRoaXMucHJvcHM7cmV0dXJuIG8mJm8uZ2V0SW4oW3MsInZhbHVlIl0pfW9uQ2hhbmdlPXM9PntsZXR7b25DaGFuZ2U6b309dGhpcy5wcm9wcyx7dmFsdWU6aSxuYW1lOmF9PXMudGFyZ2V0LHU9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnN0YXRlLnZhbHVlKTthP3VbYV09aTp1PWksdGhpcy5zZXRTdGF0ZSh7dmFsdWU6dX0sKCgpPT5vKHRoaXMuc3RhdGUpKSl9O3JlbmRlcigpe2xldHtzY2hlbWE6cyxnZXRDb21wb25lbnQ6byxlcnJTZWxlY3RvcnM6aSxuYW1lOmEsYXV0aFNlbGVjdG9yczp1fT10aGlzLnByb3BzO2NvbnN0IF89bygiSW5wdXQiKSx3PW8oIlJvdyIpLHg9bygiQ29sIiksQz1vKCJhdXRoRXJyb3IiKSxqPW8oIk1hcmtkb3duIiwhMCksTD1vKCJKdW1wVG9QYXRoIiwhMCksQj0ocy5nZXQoInNjaGVtZSIpfHwiIikudG9Mb3dlckNhc2UoKSwkPXUuc2VsZWN0QXV0aFBhdGgoYSk7bGV0IFU9dGhpcy5nZXRWYWx1ZSgpLFY9aS5hbGxFcnJvcnMoKS5maWx0ZXIoKHM9PnMuZ2V0KCJhdXRoSWQiKT09PWEpKTtpZigiYmFzaWMiPT09Qil7bGV0IG89VT9VLmdldCgidXNlcm5hbWUiKTpudWxsO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgiaDQiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCxhKSwiwqAgKGh0dHAsIEJhc2ljKSIsUmUuY3JlYXRlRWxlbWVudChMLHtwYXRoOiR9KSksbyYmUmUuY3JlYXRlRWxlbWVudCgiaDYiLG51bGwsIkF1dGhvcml6ZWQiKSxSZS5jcmVhdGVFbGVtZW50KHcsbnVsbCxSZS5jcmVhdGVFbGVtZW50KGose3NvdXJjZTpzLmdldCgiZGVzY3JpcHRpb24iKX0pKSxSZS5jcmVhdGVFbGVtZW50KHcsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJsYWJlbCIse2h0bWxGb3I6ImF1dGgtYmFzaWMtdXNlcm5hbWUifSwiVXNlcm5hbWU6Iiksbz9SZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCIgIixvLCIgIik6UmUuY3JlYXRlRWxlbWVudCh4LG51bGwsUmUuY3JlYXRlRWxlbWVudChfLHtpZDoiYXV0aC1iYXNpYy11c2VybmFtZSIsdHlwZToidGV4dCIscmVxdWlyZWQ6InJlcXVpcmVkIixuYW1lOiJ1c2VybmFtZSIsImFyaWEtbGFiZWwiOiJhdXRoLWJhc2ljLXVzZXJuYW1lIixvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlLGF1dG9Gb2N1czohMH0pKSksUmUuY3JlYXRlRWxlbWVudCh3LG51bGwsUmUuY3JlYXRlRWxlbWVudCgibGFiZWwiLHtodG1sRm9yOiJhdXRoLWJhc2ljLXBhc3N3b3JkIn0sIlBhc3N3b3JkOiIpLG8/UmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICoqKioqKiAiKTpSZS5jcmVhdGVFbGVtZW50KHgsbnVsbCxSZS5jcmVhdGVFbGVtZW50KF8se2lkOiJhdXRoLWJhc2ljLXBhc3N3b3JkIixhdXRvQ29tcGxldGU6Im5ldy1wYXNzd29yZCIsbmFtZToicGFzc3dvcmQiLHR5cGU6InBhc3N3b3JkIiwiYXJpYS1sYWJlbCI6ImF1dGgtYmFzaWMtcGFzc3dvcmQiLG9uQ2hhbmdlOnRoaXMub25DaGFuZ2V9KSkpLFYudmFsdWVTZXEoKS5tYXAoKChzLG8pPT5SZS5jcmVhdGVFbGVtZW50KEMse2Vycm9yOnMsa2V5Om99KSkpKX1yZXR1cm4iYmVhcmVyIj09PUI/UmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsYSksIsKgIChodHRwLCBCZWFyZXIpIixSZS5jcmVhdGVFbGVtZW50KEwse3BhdGg6JH0pKSxVJiZSZS5jcmVhdGVFbGVtZW50KCJoNiIsbnVsbCwiQXV0aG9yaXplZCIpLFJlLmNyZWF0ZUVsZW1lbnQodyxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoaix7c291cmNlOnMuZ2V0KCJkZXNjcmlwdGlvbiIpfSkpLFJlLmNyZWF0ZUVsZW1lbnQodyxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7aHRtbEZvcjoiYXV0aC1iZWFyZXItdmFsdWUifSwiVmFsdWU6IiksVT9SZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCIgKioqKioqICIpOlJlLmNyZWF0ZUVsZW1lbnQoeCxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoXyx7aWQ6ImF1dGgtYmVhcmVyLXZhbHVlIix0eXBlOiJ0ZXh0IiwiYXJpYS1sYWJlbCI6ImF1dGgtYmVhcmVyLXZhbHVlIixvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlLGF1dG9Gb2N1czohMH0pKSksVi52YWx1ZVNlcSgpLm1hcCgoKHMsbyk9PlJlLmNyZWF0ZUVsZW1lbnQoQyx7ZXJyb3I6cyxrZXk6b30pKSkpOlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJlbSIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJiIixudWxsLGEpLCIgSFRUUCBhdXRoZW50aWNhdGlvbjogdW5zdXBwb3J0ZWQgc2NoZW1lICIsYCcke0J9J2ApKX19Y2xhc3Mgb3BlcmF0aW9uX3NlcnZlcnNfT3BlcmF0aW9uU2VydmVycyBleHRlbmRzIFJlLkNvbXBvbmVudHtzZXRTZWxlY3RlZFNlcnZlcj1zPT57Y29uc3R7cGF0aDpvLG1ldGhvZDppfT10aGlzLnByb3BzO3JldHVybiB0aGlzLmZvcmNlVXBkYXRlKCksdGhpcy5wcm9wcy5zZXRTZWxlY3RlZFNlcnZlcihzLGAke299OiR7aX1gKX07c2V0U2VydmVyVmFyaWFibGVWYWx1ZT1zPT57Y29uc3R7cGF0aDpvLG1ldGhvZDppfT10aGlzLnByb3BzO3JldHVybiB0aGlzLmZvcmNlVXBkYXRlKCksdGhpcy5wcm9wcy5zZXRTZXJ2ZXJWYXJpYWJsZVZhbHVlKHsuLi5zLG5hbWVzcGFjZTpgJHtvfToke2l9YH0pfTtnZXRTZWxlY3RlZFNlcnZlcj0oKT0+e2NvbnN0e3BhdGg6cyxtZXRob2Q6b309dGhpcy5wcm9wcztyZXR1cm4gdGhpcy5wcm9wcy5nZXRTZWxlY3RlZFNlcnZlcihgJHtzfToke299YCl9O2dldFNlcnZlclZhcmlhYmxlPShzLG8pPT57Y29uc3R7cGF0aDppLG1ldGhvZDphfT10aGlzLnByb3BzO3JldHVybiB0aGlzLnByb3BzLmdldFNlcnZlclZhcmlhYmxlKHtuYW1lc3BhY2U6YCR7aX06JHthfWAsc2VydmVyOnN9LG8pfTtnZXRFZmZlY3RpdmVTZXJ2ZXJWYWx1ZT1zPT57Y29uc3R7cGF0aDpvLG1ldGhvZDppfT10aGlzLnByb3BzO3JldHVybiB0aGlzLnByb3BzLmdldEVmZmVjdGl2ZVNlcnZlclZhbHVlKHtzZXJ2ZXI6cyxuYW1lc3BhY2U6YCR7b306JHtpfWB9KX07cmVuZGVyKCl7Y29uc3R7b3BlcmF0aW9uU2VydmVyczpzLHBhdGhTZXJ2ZXJzOm8sZ2V0Q29tcG9uZW50Oml9PXRoaXMucHJvcHM7aWYoIXMmJiFvKXJldHVybiBudWxsO2NvbnN0IGE9aSgiU2VydmVycyIpLHU9c3x8byxfPXM/Im9wZXJhdGlvbiI6InBhdGgiO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stc2VjdGlvbiBvcGVyYXRpb24tc2VydmVycyJ9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1zZWN0aW9uLWhlYWRlciJ9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToidGFiLWhlYWRlciJ9LFJlLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXRpdGxlIn0sIlNlcnZlcnMiKSkpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1kZXNjcmlwdGlvbi13cmFwcGVyIn0sUmUuY3JlYXRlRWxlbWVudCgiaDQiLHtjbGFzc05hbWU6Im1lc3NhZ2UifSwiVGhlc2UgIixfLCItbGV2ZWwgb3B0aW9ucyBvdmVycmlkZSB0aGUgZ2xvYmFsIHNlcnZlciBvcHRpb25zLiIpLFJlLmNyZWF0ZUVsZW1lbnQoYSx7c2VydmVyczp1LGN1cnJlbnRTZXJ2ZXI6dGhpcy5nZXRTZWxlY3RlZFNlcnZlcigpLHNldFNlbGVjdGVkU2VydmVyOnRoaXMuc2V0U2VsZWN0ZWRTZXJ2ZXIsc2V0U2VydmVyVmFyaWFibGVWYWx1ZTp0aGlzLnNldFNlcnZlclZhcmlhYmxlVmFsdWUsZ2V0U2VydmVyVmFyaWFibGU6dGhpcy5nZXRTZXJ2ZXJWYXJpYWJsZSxnZXRFZmZlY3RpdmVTZXJ2ZXJWYWx1ZTp0aGlzLmdldEVmZmVjdGl2ZVNlcnZlclZhbHVlfSkpKX19Y29uc3QgJFA9e0NhbGxiYWNrczpjYWxsYmFja3MsSHR0cEF1dGgsUmVxdWVzdEJvZHk6Y29tcG9uZW50c19yZXF1ZXN0X2JvZHksU2VydmVyczpjb21wb25lbnRzX3NlcnZlcnMsU2VydmVyc0NvbnRhaW5lcixSZXF1ZXN0Qm9keUVkaXRvcixPcGVyYXRpb25TZXJ2ZXJzOm9wZXJhdGlvbl9zZXJ2ZXJzX09wZXJhdGlvblNlcnZlcnMsb3BlcmF0aW9uTGluazpGUH0scVA9bmV3IFJlbWFya2FibGUoImNvbW1vbm1hcmsiKTtxUC5ibG9jay5ydWxlci5lbmFibGUoWyJ0YWJsZSJdKSxxUC5zZXQoe2xpbmtUYXJnZXQ6Il9ibGFuayJ9KTtjb25zdCBVUD1PQVMzQ29tcG9uZW50V3JhcEZhY3RvcnkoKCh7c291cmNlOnMsY2xhc3NOYW1lOm89IiIsZ2V0Q29uZmlnczppPSgpPT4oe3VzZVVuc2FmZU1hcmtkb3duOiExfSl9KT0+e2lmKCJzdHJpbmciIT10eXBlb2YgcylyZXR1cm4gbnVsbDtpZihzKXtjb25zdHt1c2VVbnNhZmVNYXJrZG93bjphfT1pKCksdT1zYW5pdGl6ZXIocVAucmVuZGVyKHMpLHt1c2VVbnNhZmVNYXJrZG93bjphfSk7bGV0IF87cmV0dXJuInN0cmluZyI9PXR5cGVvZiB1JiYoXz11LnRyaW0oKSksUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7ZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpffSxjbGFzc05hbWU6Sm4oKShvLCJyZW5kZXJlZE1hcmtkb3duIil9KX1yZXR1cm4gbnVsbH0pKSxWUD1PQVMzQ29tcG9uZW50V3JhcEZhY3RvcnkoKCh7T3JpOnMsLi4ub30pPT57Y29uc3R7c2NoZW1hOmksZ2V0Q29tcG9uZW50OmEsZXJyU2VsZWN0b3JzOnUsYXV0aG9yaXplZDpfLG9uQXV0aENoYW5nZTp3LG5hbWU6eCxhdXRoU2VsZWN0b3JzOkN9PW8saj1hKCJIdHRwQXV0aCIpO3JldHVybiJodHRwIj09PWkuZ2V0KCJ0eXBlIik/UmUuY3JlYXRlRWxlbWVudChqLHtrZXk6eCxzY2hlbWE6aSxuYW1lOngsZXJyU2VsZWN0b3JzOnUsYXV0aG9yaXplZDpfLGdldENvbXBvbmVudDphLG9uQ2hhbmdlOncsYXV0aFNlbGVjdG9yczpDfSk6UmUuY3JlYXRlRWxlbWVudChzLG8pfSkpLHpQPU9BUzNDb21wb25lbnRXcmFwRmFjdG9yeShPbmxpbmVWYWxpZGF0b3JCYWRnZSk7Y2xhc3MgTW9kZWxDb21wb25lbnQgZXh0ZW5kcyBSZS5Db21wb25lbnR7cmVuZGVyKCl7bGV0e2dldENvbmZpZ3M6cyxzY2hlbWE6byxPcmk6aX09dGhpcy5wcm9wcyxhPVsibW9kZWwtYm94Il0sdT1udWxsO3JldHVybiEwPT09by5nZXQoImRlcHJlY2F0ZWQiKSYmKGEucHVzaCgiZGVwcmVjYXRlZCIpLHU9UmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWwtZGVwcmVjYXRlZC13YXJuaW5nIn0sIkRlcHJlY2F0ZWQ6IikpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTphLmpvaW4oIiAiKX0sdSxSZS5jcmVhdGVFbGVtZW50KGksTW4oKSh7fSx0aGlzLnByb3BzLHtnZXRDb25maWdzOnMsZGVwdGg6MSxleHBhbmREZXB0aDp0aGlzLnByb3BzLmV4cGFuZERlcHRofHwwfSkpKX19Y29uc3QgV1A9T0FTM0NvbXBvbmVudFdyYXBGYWN0b3J5KE1vZGVsQ29tcG9uZW50KSxKUD1PQVMzQ29tcG9uZW50V3JhcEZhY3RvcnkoKCh7T3JpOnMsLi4ub30pPT57Y29uc3R7c2NoZW1hOmksZ2V0Q29tcG9uZW50OmEsZXJyb3JzOnUsb25DaGFuZ2U6Xyxmbjp3fT1vLHg9dy5pc0ZpbGVVcGxvYWRJbnRlbmRlZChpKSxDPWEoIklucHV0Iik7cmV0dXJuIHg/UmUuY3JlYXRlRWxlbWVudChDLHt0eXBlOiJmaWxlIixjbGFzc05hbWU6dS5sZW5ndGg/ImludmFsaWQiOiIiLHRpdGxlOnUubGVuZ3RoP3U6IiIsb25DaGFuZ2U6cz0+e18ocy50YXJnZXQuZmlsZXNbMF0pfSxkaXNhYmxlZDpzLmlzRGlzYWJsZWR9KTpSZS5jcmVhdGVFbGVtZW50KHMsbyl9KSksSFA9e01hcmtkb3duOlVQLEF1dGhJdGVtOlZQLE9wZW5BUElWZXJzaW9uOmZ1bmN0aW9uIE9BUzMwQ29tcG9uZW50V3JhcEZhY3Rvcnkocyl7cmV0dXJuKG8saSk9PmE9PiJmdW5jdGlvbiI9PXR5cGVvZiBpLnNwZWNTZWxlY3RvcnM/LmlzT0FTMzA/aS5zcGVjU2VsZWN0b3JzLmlzT0FTMzAoKT9SZS5jcmVhdGVFbGVtZW50KHMsTW4oKSh7fSxhLGkse09yaTpvfSkpOlJlLmNyZWF0ZUVsZW1lbnQobyxhKTooY29uc29sZS53YXJuKCJPQVMzMCB3cmFwcGVyOiBjb3VsZG4ndCBnZXQgc3BlYyIpLG51bGwpfSgocz0+e2NvbnN0e09yaTpvfT1zO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KG8se29hc1ZlcnNpb246IjMuMCJ9KX0pKSxKc29uU2NoZW1hX3N0cmluZzpKUCxtb2RlbDpXUCxvbmxpbmVWYWxpZGF0b3JCYWRnZTp6UH0sS1A9Im9hczNfc2V0X3NlcnZlcnMiLEdQPSJvYXMzX3NldF9yZXF1ZXN0X2JvZHlfdmFsdWUiLFlQPSJvYXMzX3NldF9yZXF1ZXN0X2JvZHlfcmV0YWluX2ZsYWciLFhQPSJvYXMzX3NldF9yZXF1ZXN0X2JvZHlfaW5jbHVzaW9uIixRUD0ib2FzM19zZXRfYWN0aXZlX2V4YW1wbGVzX21lbWJlciIsWlA9Im9hczNfc2V0X3JlcXVlc3RfY29udGVudF90eXBlIixlST0ib2FzM19zZXRfcmVzcG9uc2VfY29udGVudF90eXBlIix0ST0ib2FzM19zZXRfc2VydmVyX3ZhcmlhYmxlX3ZhbHVlIixyST0ib2FzM19zZXRfcmVxdWVzdF9ib2R5X3ZhbGlkYXRlX2Vycm9yIixuST0ib2FzM19jbGVhcl9yZXF1ZXN0X2JvZHlfdmFsaWRhdGVfZXJyb3IiLHNJPSJvYXMzX2NsZWFyX3JlcXVlc3RfYm9keV92YWx1ZSI7ZnVuY3Rpb24gc2V0U2VsZWN0ZWRTZXJ2ZXIocyxvKXtyZXR1cm57dHlwZTpLUCxwYXlsb2FkOntzZWxlY3RlZFNlcnZlclVybDpzLG5hbWVzcGFjZTpvfX19ZnVuY3Rpb24gc2V0UmVxdWVzdEJvZHlWYWx1ZSh7dmFsdWU6cyxwYXRoTWV0aG9kOm99KXtyZXR1cm57dHlwZTpHUCxwYXlsb2FkOnt2YWx1ZTpzLHBhdGhNZXRob2Q6b319fWNvbnN0IHNldFJldGFpblJlcXVlc3RCb2R5VmFsdWVGbGFnPSh7dmFsdWU6cyxwYXRoTWV0aG9kOm99KT0+KHt0eXBlOllQLHBheWxvYWQ6e3ZhbHVlOnMscGF0aE1ldGhvZDpvfX0pO2Z1bmN0aW9uIHNldFJlcXVlc3RCb2R5SW5jbHVzaW9uKHt2YWx1ZTpzLHBhdGhNZXRob2Q6byxuYW1lOml9KXtyZXR1cm57dHlwZTpYUCxwYXlsb2FkOnt2YWx1ZTpzLHBhdGhNZXRob2Q6byxuYW1lOml9fX1mdW5jdGlvbiBzZXRBY3RpdmVFeGFtcGxlc01lbWJlcih7bmFtZTpzLHBhdGhNZXRob2Q6byxjb250ZXh0VHlwZTppLGNvbnRleHROYW1lOmF9KXtyZXR1cm57dHlwZTpRUCxwYXlsb2FkOntuYW1lOnMscGF0aE1ldGhvZDpvLGNvbnRleHRUeXBlOmksY29udGV4dE5hbWU6YX19fWZ1bmN0aW9uIHNldFJlcXVlc3RDb250ZW50VHlwZSh7dmFsdWU6cyxwYXRoTWV0aG9kOm99KXtyZXR1cm57dHlwZTpaUCxwYXlsb2FkOnt2YWx1ZTpzLHBhdGhNZXRob2Q6b319fWZ1bmN0aW9uIHNldFJlc3BvbnNlQ29udGVudFR5cGUoe3ZhbHVlOnMscGF0aDpvLG1ldGhvZDppfSl7cmV0dXJue3R5cGU6ZUkscGF5bG9hZDp7dmFsdWU6cyxwYXRoOm8sbWV0aG9kOml9fX1mdW5jdGlvbiBzZXRTZXJ2ZXJWYXJpYWJsZVZhbHVlKHtzZXJ2ZXI6cyxuYW1lc3BhY2U6byxrZXk6aSx2YWw6YX0pe3JldHVybnt0eXBlOnRJLHBheWxvYWQ6e3NlcnZlcjpzLG5hbWVzcGFjZTpvLGtleTppLHZhbDphfX19Y29uc3Qgc2V0UmVxdWVzdEJvZHlWYWxpZGF0ZUVycm9yPSh7cGF0aDpzLG1ldGhvZDpvLHZhbGlkYXRpb25FcnJvcnM6aX0pPT4oe3R5cGU6ckkscGF5bG9hZDp7cGF0aDpzLG1ldGhvZDpvLHZhbGlkYXRpb25FcnJvcnM6aX19KSxjbGVhclJlcXVlc3RCb2R5VmFsaWRhdGVFcnJvcj0oe3BhdGg6cyxtZXRob2Q6b30pPT4oe3R5cGU6bkkscGF5bG9hZDp7cGF0aDpzLG1ldGhvZDpvfX0pLGluaXRSZXF1ZXN0Qm9keVZhbGlkYXRlRXJyb3I9KHtwYXRoTWV0aG9kOnN9KT0+KHt0eXBlOm5JLHBheWxvYWQ6e3BhdGg6c1swXSxtZXRob2Q6c1sxXX19KSxjbGVhclJlcXVlc3RCb2R5VmFsdWU9KHtwYXRoTWV0aG9kOnN9KT0+KHt0eXBlOnNJLHBheWxvYWQ6e3BhdGhNZXRob2Q6c319KTt2YXIgb0k9X193ZWJwYWNrX3JlcXVpcmVfXyg2MDY4MCksaUk9X193ZWJwYWNrX3JlcXVpcmVfXy5uKG9JKTtjb25zdCBvYXMzX3NlbGVjdG9yc19vbmx5T0FTMz1zPT4obywuLi5pKT0+YT0+e2lmKGEuZ2V0U3lzdGVtKCkuc3BlY1NlbGVjdG9ycy5pc09BUzMoKSl7Y29uc3QgdT1zKG8sLi4uaSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHU/dShhKTp1fXJldHVybiBudWxsfTtjb25zdCBhST1vYXMzX3NlbGVjdG9yc19vbmx5T0FTMygoKHMsbyk9Pntjb25zdCBpPW8/W28sInNlbGVjdGVkU2VydmVyIl06WyJzZWxlY3RlZFNlcnZlciJdO3JldHVybiBzLmdldEluKGkpfHwiIn0pKSxjST1vYXMzX3NlbGVjdG9yc19vbmx5T0FTMygoKHMsbyxpKT0+cy5nZXRJbihbInJlcXVlc3REYXRhIixvLGksImJvZHlWYWx1ZSJdKXx8bnVsbCkpLGxJPW9hczNfc2VsZWN0b3JzX29ubHlPQVMzKCgocyxvLGkpPT5zLmdldEluKFsicmVxdWVzdERhdGEiLG8saSwicmV0YWluQm9keVZhbHVlIl0pfHwhMSkpLHNlbGVjdERlZmF1bHRSZXF1ZXN0Qm9keVZhbHVlPShzLG8saSk9PnM9Pntjb25zdHtvYXMzU2VsZWN0b3JzOmEsc3BlY1NlbGVjdG9yczp1LGZuOl99PXMuZ2V0U3lzdGVtKCk7aWYodS5pc09BUzMoKSl7Y29uc3Qgcz1hLnJlcXVlc3RDb250ZW50VHlwZShvLGkpO2lmKHMpcmV0dXJuIGdldERlZmF1bHRSZXF1ZXN0Qm9keVZhbHVlKHUuc3BlY1Jlc29sdmVkU3VidHJlZShbInBhdGhzIixvLGksInJlcXVlc3RCb2R5Il0pLHMsYS5hY3RpdmVFeGFtcGxlc01lbWJlcihvLGksInJlcXVlc3RCb2R5IiwicmVxdWVzdEJvZHkiKSxfKX1yZXR1cm4gbnVsbH0sdUk9b2FzM19zZWxlY3RvcnNfb25seU9BUzMoKChzLG8saSk9PnM9Pntjb25zdHtvYXMzU2VsZWN0b3JzOmEsc3BlY1NlbGVjdG9yczp1LGZuOl99PXM7bGV0IHc9ITE7Y29uc3QgeD1hLnJlcXVlc3RDb250ZW50VHlwZShvLGkpO2xldCBDPWEucmVxdWVzdEJvZHlWYWx1ZShvLGkpO2NvbnN0IGo9dS5zcGVjUmVzb2x2ZWRTdWJ0cmVlKFsicGF0aHMiLG8saSwicmVxdWVzdEJvZHkiXSk7aWYoIWopcmV0dXJuITE7aWYoemUuTWFwLmlzTWFwKEMpJiYoQz1zdHJpbmdpZnkoQy5tYXBFbnRyaWVzKChzPT56ZS5NYXAuaXNNYXAoc1sxXSk/W3NbMF0sc1sxXS5nZXQoInZhbHVlIildOnMpKS50b0pTKCkpKSx6ZS5MaXN0LmlzTGlzdChDKSYmKEM9c3RyaW5naWZ5KEMpKSx4KXtjb25zdCBzPWdldERlZmF1bHRSZXF1ZXN0Qm9keVZhbHVlKGoseCxhLmFjdGl2ZUV4YW1wbGVzTWVtYmVyKG8saSwicmVxdWVzdEJvZHkiLCJyZXF1ZXN0Qm9keSIpLF8pO3c9ISFDJiZDIT09c31yZXR1cm4gd30pKSxwST1vYXMzX3NlbGVjdG9yc19vbmx5T0FTMygoKHMsbyxpKT0+cy5nZXRJbihbInJlcXVlc3REYXRhIixvLGksImJvZHlJbmNsdXNpb24iXSl8fCgwLHplLk1hcCkoKSkpLGhJPW9hczNfc2VsZWN0b3JzX29ubHlPQVMzKCgocyxvLGkpPT5zLmdldEluKFsicmVxdWVzdERhdGEiLG8saSwiZXJyb3JzIl0pfHxudWxsKSksZEk9b2FzM19zZWxlY3RvcnNfb25seU9BUzMoKChzLG8saSxhLHUpPT5zLmdldEluKFsiZXhhbXBsZXMiLG8saSxhLHUsImFjdGl2ZUV4YW1wbGUiXSl8fG51bGwpKSxmST1vYXMzX3NlbGVjdG9yc19vbmx5T0FTMygoKHMsbyxpKT0+cy5nZXRJbihbInJlcXVlc3REYXRhIixvLGksInJlcXVlc3RDb250ZW50VHlwZSJdKXx8bnVsbCkpLG1JPW9hczNfc2VsZWN0b3JzX29ubHlPQVMzKCgocyxvLGkpPT5zLmdldEluKFsicmVxdWVzdERhdGEiLG8saSwicmVzcG9uc2VDb250ZW50VHlwZSJdKXx8bnVsbCkpLGdJPW9hczNfc2VsZWN0b3JzX29ubHlPQVMzKCgocyxvLGkpPT57bGV0IGE7aWYoInN0cmluZyIhPXR5cGVvZiBvKXtjb25zdHtzZXJ2ZXI6cyxuYW1lc3BhY2U6dX09bzthPXU/W3UsInNlcnZlclZhcmlhYmxlVmFsdWVzIixzLGldOlsic2VydmVyVmFyaWFibGVWYWx1ZXMiLHMsaV19ZWxzZXthPVsic2VydmVyVmFyaWFibGVWYWx1ZXMiLG8saV19cmV0dXJuIHMuZ2V0SW4oYSl8fG51bGx9KSkseUk9b2FzM19zZWxlY3RvcnNfb25seU9BUzMoKChzLG8pPT57bGV0IGk7aWYoInN0cmluZyIhPXR5cGVvZiBvKXtjb25zdHtzZXJ2ZXI6cyxuYW1lc3BhY2U6YX09bztpPWE/W2EsInNlcnZlclZhcmlhYmxlVmFsdWVzIixzXTpbInNlcnZlclZhcmlhYmxlVmFsdWVzIixzXX1lbHNle2k9WyJzZXJ2ZXJWYXJpYWJsZVZhbHVlcyIsb119cmV0dXJuIHMuZ2V0SW4oaSl8fCgwLHplLk9yZGVyZWRNYXApKCl9KSksdkk9b2FzM19zZWxlY3RvcnNfb25seU9BUzMoKChzLG8pPT57dmFyIGksYTtpZigic3RyaW5nIiE9dHlwZW9mIG8pe2NvbnN0e3NlcnZlcjp1LG5hbWVzcGFjZTpffT1vO2E9dSxpPV8/cy5nZXRJbihbXywic2VydmVyVmFyaWFibGVWYWx1ZXMiLGFdKTpzLmdldEluKFsic2VydmVyVmFyaWFibGVWYWx1ZXMiLGFdKX1lbHNlIGE9byxpPXMuZ2V0SW4oWyJzZXJ2ZXJWYXJpYWJsZVZhbHVlcyIsYV0pO2k9aXx8KDAsemUuT3JkZXJlZE1hcCkoKTtsZXQgdT1hO3JldHVybiBpLm1hcCgoKHMsbyk9Pnt1PXUucmVwbGFjZShuZXcgUmVnRXhwKGB7JHtpSSgpKG8pfX1gLCJnIikscyl9KSksdX0pKSxiST1mdW5jdGlvbiB2YWxpZGF0ZVJlcXVlc3RCb2R5SXNSZXF1aXJlZChzKXtyZXR1cm4oLi4ubyk9Pmk9Pntjb25zdCBhPWkuZ2V0U3lzdGVtKCkuc3BlY1NlbGVjdG9ycy5zcGVjSnNvbigpO2xldCB1PVsuLi5vXVsxXXx8W107cmV0dXJuIWEuZ2V0SW4oWyJwYXRocyIsLi4udSwicmVxdWVzdEJvZHkiLCJyZXF1aXJlZCJdKXx8cyguLi5vKX19KCgocyxvKT0+KChzLG8pPT4obz1vfHxbXSwhIXMuZ2V0SW4oWyJyZXF1ZXN0RGF0YSIsLi4ubywiYm9keVZhbHVlIl0pKSkocyxvKSkpLHZhbGlkYXRlU2hhbGxvd1JlcXVpcmVkPShzLHtvYXMzUmVxdWlyZWRSZXF1ZXN0Qm9keUNvbnRlbnRUeXBlOm8sb2FzM1JlcXVlc3RDb250ZW50VHlwZTppLG9hczNSZXF1ZXN0Qm9keVZhbHVlOmF9KT0+e2xldCB1PVtdO2lmKCF6ZS5NYXAuaXNNYXAoYSkpcmV0dXJuIHU7bGV0IF89W107cmV0dXJuIE9iamVjdC5rZXlzKG8ucmVxdWVzdENvbnRlbnRUeXBlKS5mb3JFYWNoKChzPT57aWYocz09PWkpe28ucmVxdWVzdENvbnRlbnRUeXBlW3NdLmZvckVhY2goKHM9PntfLmluZGV4T2Yocyk8MCYmXy5wdXNoKHMpfSkpfX0pKSxfLmZvckVhY2goKHM9PnthLmdldEluKFtzLCJ2YWx1ZSJdKXx8dS5wdXNoKHMpfSkpLHV9LFNJPXhzKCkoWyJnZXQiLCJwdXQiLCJwb3N0IiwiZGVsZXRlIiwib3B0aW9ucyIsImhlYWQiLCJwYXRjaCIsInRyYWNlIl0pLF9JPXtbS1BdOihzLHtwYXlsb2FkOntzZWxlY3RlZFNlcnZlclVybDpvLG5hbWVzcGFjZTppfX0pPT57Y29uc3QgYT1pP1tpLCJzZWxlY3RlZFNlcnZlciJdOlsic2VsZWN0ZWRTZXJ2ZXIiXTtyZXR1cm4gcy5zZXRJbihhLG8pfSxbR1BdOihzLHtwYXlsb2FkOnt2YWx1ZTpvLHBhdGhNZXRob2Q6aX19KT0+e2xldFthLHVdPWk7aWYoIXplLk1hcC5pc01hcChvKSlyZXR1cm4gcy5zZXRJbihbInJlcXVlc3REYXRhIixhLHUsImJvZHlWYWx1ZSJdLG8pO2xldCBfPXMuZ2V0SW4oWyJyZXF1ZXN0RGF0YSIsYSx1LCJib2R5VmFsdWUiXSl8fCgwLHplLk1hcCkoKTt6ZS5NYXAuaXNNYXAoXyl8fChfPSgwLHplLk1hcCkoKSk7bGV0IHc9Xztjb25zdFsuLi54XT1vLmtleXMoKTtyZXR1cm4geC5mb3JFYWNoKChzPT57bGV0IGk9by5nZXRJbihbc10pO3cuaGFzKHMpJiZ6ZS5NYXAuaXNNYXAoaSl8fCh3PXcuc2V0SW4oW3MsInZhbHVlIl0saSkpfSkpLHMuc2V0SW4oWyJyZXF1ZXN0RGF0YSIsYSx1LCJib2R5VmFsdWUiXSx3KX0sW1lQXToocyx7cGF5bG9hZDp7dmFsdWU6byxwYXRoTWV0aG9kOml9fSk9PntsZXRbYSx1XT1pO3JldHVybiBzLnNldEluKFsicmVxdWVzdERhdGEiLGEsdSwicmV0YWluQm9keVZhbHVlIl0sbyl9LFtYUF06KHMse3BheWxvYWQ6e3ZhbHVlOm8scGF0aE1ldGhvZDppLG5hbWU6YX19KT0+e2xldFt1LF9dPWk7cmV0dXJuIHMuc2V0SW4oWyJyZXF1ZXN0RGF0YSIsdSxfLCJib2R5SW5jbHVzaW9uIixhXSxvKX0sW1FQXToocyx7cGF5bG9hZDp7bmFtZTpvLHBhdGhNZXRob2Q6aSxjb250ZXh0VHlwZTphLGNvbnRleHROYW1lOnV9fSk9PntsZXRbXyx3XT1pO3JldHVybiBzLnNldEluKFsiZXhhbXBsZXMiLF8sdyxhLHUsImFjdGl2ZUV4YW1wbGUiXSxvKX0sW1pQXToocyx7cGF5bG9hZDp7dmFsdWU6byxwYXRoTWV0aG9kOml9fSk9PntsZXRbYSx1XT1pO3JldHVybiBzLnNldEluKFsicmVxdWVzdERhdGEiLGEsdSwicmVxdWVzdENvbnRlbnRUeXBlIl0sbyl9LFtlSV06KHMse3BheWxvYWQ6e3ZhbHVlOm8scGF0aDppLG1ldGhvZDphfX0pPT5zLnNldEluKFsicmVxdWVzdERhdGEiLGksYSwicmVzcG9uc2VDb250ZW50VHlwZSJdLG8pLFt0SV06KHMse3BheWxvYWQ6e3NlcnZlcjpvLG5hbWVzcGFjZTppLGtleTphLHZhbDp1fX0pPT57Y29uc3QgXz1pP1tpLCJzZXJ2ZXJWYXJpYWJsZVZhbHVlcyIsbyxhXTpbInNlcnZlclZhcmlhYmxlVmFsdWVzIixvLGFdO3JldHVybiBzLnNldEluKF8sdSl9LFtySV06KHMse3BheWxvYWQ6e3BhdGg6byxtZXRob2Q6aSx2YWxpZGF0aW9uRXJyb3JzOmF9fSk9PntsZXQgdT1bXTtpZih1LnB1c2goIlJlcXVpcmVkIGZpZWxkIGlzIG5vdCBwcm92aWRlZCIpLGEubWlzc2luZ0JvZHlWYWx1ZSlyZXR1cm4gcy5zZXRJbihbInJlcXVlc3REYXRhIixvLGksImVycm9ycyJdLCgwLHplLmZyb21KUykodSkpO2lmKGEubWlzc2luZ1JlcXVpcmVkS2V5cyYmYS5taXNzaW5nUmVxdWlyZWRLZXlzLmxlbmd0aD4wKXtjb25zdHttaXNzaW5nUmVxdWlyZWRLZXlzOl99PWE7cmV0dXJuIHMudXBkYXRlSW4oWyJyZXF1ZXN0RGF0YSIsbyxpLCJib2R5VmFsdWUiXSwoMCx6ZS5mcm9tSlMpKHt9KSwocz0+Xy5yZWR1Y2UoKChzLG8pPT5zLnNldEluKFtvLCJlcnJvcnMiXSwoMCx6ZS5mcm9tSlMpKHUpKSkscykpKX1yZXR1cm4gY29uc29sZS53YXJuKCJ1bmV4cGVjdGVkIHJlc3VsdDogU0VUX1JFUVVFU1RfQk9EWV9WQUxJREFURV9FUlJPUiIpLHN9LFtuSV06KHMse3BheWxvYWQ6e3BhdGg6byxtZXRob2Q6aX19KT0+e2NvbnN0IGE9cy5nZXRJbihbInJlcXVlc3REYXRhIixvLGksImJvZHlWYWx1ZSJdKTtpZighemUuTWFwLmlzTWFwKGEpKXJldHVybiBzLnNldEluKFsicmVxdWVzdERhdGEiLG8saSwiZXJyb3JzIl0sKDAsemUuZnJvbUpTKShbXSkpO2NvbnN0Wy4uLnVdPWEua2V5cygpO3JldHVybiB1P3MudXBkYXRlSW4oWyJyZXF1ZXN0RGF0YSIsbyxpLCJib2R5VmFsdWUiXSwoMCx6ZS5mcm9tSlMpKHt9KSwocz0+dS5yZWR1Y2UoKChzLG8pPT5zLnNldEluKFtvLCJlcnJvcnMiXSwoMCx6ZS5mcm9tSlMpKFtdKSkpLHMpKSk6c30sW3NJXToocyx7cGF5bG9hZDp7cGF0aE1ldGhvZDpvfX0pPT57bGV0W2ksYV09bztjb25zdCB1PXMuZ2V0SW4oWyJyZXF1ZXN0RGF0YSIsaSxhLCJib2R5VmFsdWUiXSk7cmV0dXJuIHU/emUuTWFwLmlzTWFwKHUpP3Muc2V0SW4oWyJyZXF1ZXN0RGF0YSIsaSxhLCJib2R5VmFsdWUiXSwoMCx6ZS5NYXApKCkpOnMuc2V0SW4oWyJyZXF1ZXN0RGF0YSIsaSxhLCJib2R5VmFsdWUiXSwiIik6c319O2Z1bmN0aW9uIG9hczMoe2dldFN5c3RlbTpzfSl7Y29uc3Qgbz0ocz0+KG8saT1udWxsKT0+e2NvbnN0e2dldENvbmZpZ3M6YSxmbjp1fT1zKCkse2ZpbGVVcGxvYWRNZWRpYVR5cGVzOl99PWEoKTtpZigic3RyaW5nIj09dHlwZW9mIGkmJl8uc29tZSgocz0+aS5zdGFydHNXaXRoKHMpKSkpcmV0dXJuITA7Y29uc3Qgdz16ZS5NYXAuaXNNYXAobyk7aWYoIXcmJiFhcygpKG8pKXJldHVybiExO2NvbnN0IHg9dz9vLmdldCgiZm9ybWF0Iik6by5mb3JtYXQ7cmV0dXJuIHUuaGFzU2NoZW1hVHlwZShvLCJzdHJpbmciKSYmWyJiaW5hcnkiLCJieXRlIl0uaW5jbHVkZXMoeCl9KShzKTtyZXR1cm57Y29tcG9uZW50czokUCx3cmFwQ29tcG9uZW50czpIUCxzdGF0ZVBsdWdpbnM6e3NwZWM6e3dyYXBTZWxlY3RvcnM6X2Usc2VsZWN0b3JzOnhlfSxhdXRoOnt3cmFwU2VsZWN0b3JzOndlfSxvYXMzOnthY3Rpb25zOnsuLi5QZX0scmVkdWNlcnM6X0ksc2VsZWN0b3JzOnsuLi5UZX19fSxmbjp7aXNGaWxlVXBsb2FkSW50ZW5kZWQ6byxpc0ZpbGVVcGxvYWRJbnRlbmRlZE9BUzMwOm99fX1jb25zdCB3ZWJob29rcz0oe3NwZWNTZWxlY3RvcnM6cyxnZXRDb21wb25lbnQ6b30pPT57Y29uc3QgaT1zLnNlbGVjdFdlYmhvb2tzT3BlcmF0aW9ucygpO2lmKCFpKXJldHVybiBudWxsO2NvbnN0IGE9T2JqZWN0LmtleXMoaSksdT1vKCJPcGVyYXRpb25Db250YWluZXIiLCEwKTtyZXR1cm4gMD09PWEubGVuZ3RoP251bGw6UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ3ZWJob29rcyJ9LFJlLmNyZWF0ZUVsZW1lbnQoImgyIixudWxsLCJXZWJob29rcyIpLGEubWFwKChzPT5SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtrZXk6YCR7c30td2ViaG9va2B9LGlbc10ubWFwKChvPT5SZS5jcmVhdGVFbGVtZW50KHUse2tleTpgJHtzfS0ke28ubWV0aG9kfS13ZWJob29rYCxvcDpvLm9wZXJhdGlvbix0YWc6IndlYmhvb2tzIixtZXRob2Q6by5tZXRob2QscGF0aDpzLHNwZWNQYXRoOigwLHplLkxpc3QpKG8uc3BlY1BhdGgpLGFsbG93VHJ5SXRPdXQ6ITF9KSkpKSkpKX0sb2FzMzFfY29tcG9uZW50c19saWNlbnNlPSh7Z2V0Q29tcG9uZW50OnMsc3BlY1NlbGVjdG9yczpvfSk9Pntjb25zdCBpPW8uc2VsZWN0TGljZW5zZU5hbWVGaWVsZCgpLGE9by5zZWxlY3RMaWNlbnNlVXJsKCksdT1zKCJMaW5rIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiaW5mb19fbGljZW5zZSJ9LGE/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJpbmZvX19saWNlbnNlX191cmwifSxSZS5jcmVhdGVFbGVtZW50KHUse3RhcmdldDoiX2JsYW5rIixocmVmOnNhbml0aXplVXJsKGEpfSxpKSk6UmUuY3JlYXRlRWxlbWVudCgic3BhbiIsbnVsbCxpKSl9LG9hczMxX2NvbXBvbmVudHNfY29udGFjdD0oe2dldENvbXBvbmVudDpzLHNwZWNTZWxlY3RvcnM6b30pPT57Y29uc3QgaT1vLnNlbGVjdENvbnRhY3ROYW1lRmllbGQoKSxhPW8uc2VsZWN0Q29udGFjdFVybCgpLHU9by5zZWxlY3RDb250YWN0RW1haWxGaWVsZCgpLF89cygiTGluayIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImluZm9fX2NvbnRhY3QifSxhJiZSZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsUmUuY3JlYXRlRWxlbWVudChfLHtocmVmOnNhbml0aXplVXJsKGEpLHRhcmdldDoiX2JsYW5rIn0saSwiIC0gV2Vic2l0ZSIpKSx1JiZSZS5jcmVhdGVFbGVtZW50KF8se2hyZWY6c2FuaXRpemVVcmwoYG1haWx0bzoke3V9YCl9LGE/YFNlbmQgZW1haWwgdG8gJHtpfWA6YENvbnRhY3QgJHtpfWApKX0sb2FzMzFfY29tcG9uZW50c19pbmZvPSh7Z2V0Q29tcG9uZW50OnMsc3BlY1NlbGVjdG9yczpvfSk9Pntjb25zdCBpPW8udmVyc2lvbigpLGE9by51cmwoKSx1PW8uYmFzZVBhdGgoKSxfPW8uaG9zdCgpLHc9by5zZWxlY3RJbmZvU3VtbWFyeUZpZWxkKCkseD1vLnNlbGVjdEluZm9EZXNjcmlwdGlvbkZpZWxkKCksQz1vLnNlbGVjdEluZm9UaXRsZUZpZWxkKCksaj1vLnNlbGVjdEluZm9UZXJtc09mU2VydmljZVVybCgpLEw9by5zZWxlY3RFeHRlcm5hbERvY3NVcmwoKSxCPW8uc2VsZWN0RXh0ZXJuYWxEb2NzRGVzY3JpcHRpb25GaWVsZCgpLCQ9by5jb250YWN0KCksVT1vLmxpY2Vuc2UoKSxWPXMoIk1hcmtkb3duIiwhMCksej1zKCJMaW5rIiksWT1zKCJWZXJzaW9uU3RhbXAiKSxaPXMoIk9wZW5BUElWZXJzaW9uIiksZWU9cygiSW5mb1VybCIpLGllPXMoIkluZm9CYXNlUGF0aCIpLGFlPXMoIkxpY2Vuc2UiLCEwKSxjZT1zKCJDb250YWN0IiwhMCksbGU9cygiSnNvblNjaGVtYURpYWxlY3QiLCEwKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJpbmZvIn0sUmUuY3JlYXRlRWxlbWVudCgiaGdyb3VwIix7Y2xhc3NOYW1lOiJtYWluIn0sUmUuY3JlYXRlRWxlbWVudCgiaDEiLHtjbGFzc05hbWU6InRpdGxlIn0sQyxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLGkmJlJlLmNyZWF0ZUVsZW1lbnQoWSx7dmVyc2lvbjppfSksUmUuY3JlYXRlRWxlbWVudChaLHtvYXNWZXJzaW9uOiIzLjEifSkpKSwoX3x8dSkmJlJlLmNyZWF0ZUVsZW1lbnQoaWUse2hvc3Q6XyxiYXNlUGF0aDp1fSksYSYmUmUuY3JlYXRlRWxlbWVudChlZSx7Z2V0Q29tcG9uZW50OnMsdXJsOmF9KSksdyYmUmUuY3JlYXRlRWxlbWVudCgicCIse2NsYXNzTmFtZToiaW5mb19fc3VtbWFyeSJ9LHcpLFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiaW5mb19fZGVzY3JpcHRpb24gZGVzY3JpcHRpb24ifSxSZS5jcmVhdGVFbGVtZW50KFYse3NvdXJjZTp4fSkpLGomJlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiaW5mb19fdG9zIn0sUmUuY3JlYXRlRWxlbWVudCh6LHt0YXJnZXQ6Il9ibGFuayIsaHJlZjpzYW5pdGl6ZVVybChqKX0sIlRlcm1zIG9mIHNlcnZpY2UiKSksJC5zaXplPjAmJlJlLmNyZWF0ZUVsZW1lbnQoY2UsbnVsbCksVS5zaXplPjAmJlJlLmNyZWF0ZUVsZW1lbnQoYWUsbnVsbCksTCYmUmUuY3JlYXRlRWxlbWVudCh6LHtjbGFzc05hbWU6ImluZm9fX2V4dGRvY3MiLHRhcmdldDoiX2JsYW5rIixocmVmOnNhbml0aXplVXJsKEwpfSxCfHxMKSxSZS5jcmVhdGVFbGVtZW50KGxlLG51bGwpKX0sanNvbl9zY2hlbWFfZGlhbGVjdD0oe2dldENvbXBvbmVudDpzLHNwZWNTZWxlY3RvcnM6b30pPT57Y29uc3QgaT1vLnNlbGVjdEpzb25TY2hlbWFEaWFsZWN0RmllbGQoKSxhPW8uc2VsZWN0SnNvblNjaGVtYURpYWxlY3REZWZhdWx0KCksdT1zKCJMaW5rIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoUmUuRnJhZ21lbnQsbnVsbCxpJiZpPT09YSYmUmUuY3JlYXRlRWxlbWVudCgicCIse2NsYXNzTmFtZToiaW5mb19fanNvbnNjaGVtYWRpYWxlY3QifSwiSlNPTiBTY2hlbWEgZGlhbGVjdDoiLCIgIixSZS5jcmVhdGVFbGVtZW50KHUse3RhcmdldDoiX2JsYW5rIixocmVmOnNhbml0aXplVXJsKGkpfSxpKSksaSYmaSE9PWEmJlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZXJyb3Itd3JhcHBlciJ9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibm8tbWFyZ2luIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJlcnJvcnMifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImVycm9ycy13cmFwcGVyIn0sUmUuY3JlYXRlRWxlbWVudCgiaDQiLHtjbGFzc05hbWU6ImNlbnRlciJ9LCJXYXJuaW5nIiksUmUuY3JlYXRlRWxlbWVudCgicCIse2NsYXNzTmFtZToibWVzc2FnZSJ9LFJlLmNyZWF0ZUVsZW1lbnQoInN0cm9uZyIsbnVsbCwiT3BlbkFQSS5qc29uU2NoZW1hRGlhbGVjdCIpLCIgZmllbGQgY29udGFpbnMgYSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiIsIiAiLFJlLmNyZWF0ZUVsZW1lbnQodSx7dGFyZ2V0OiJfYmxhbmsiLGhyZWY6YX0sYSksIi4gVmFsdWVzIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IG9uZSBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSBlaXRoZXIgb21pdCB0aGUgZmllbGQgb3IgcHJvdmlkZSBpdCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlLiIpKSkpKSl9LHZlcnNpb25fcHJhZ21hX2ZpbHRlcj0oe2J5cGFzczpzLGlzU3dhZ2dlcjI6byxpc09BUzM6aSxpc09BUzMxOmEsYWxzb1Nob3c6dSxjaGlsZHJlbjpffSk9PnM/UmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLF8pOm8mJihpfHxhKT9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InZlcnNpb24tcHJhZ21hIn0sdSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InZlcnNpb24tcHJhZ21hX19tZXNzYWdlIHZlcnNpb24tcHJhZ21hX19tZXNzYWdlLS1hbWJpZ3VvdXMifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgiaDMiLG51bGwsIlVuYWJsZSB0byByZW5kZXIgdGhpcyBkZWZpbml0aW9uIiksUmUuY3JlYXRlRWxlbWVudCgicCIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJzd2FnZ2VyIiksIiBhbmQgIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJvcGVuYXBpIiksIiBmaWVsZHMgY2Fubm90IGJlIHByZXNlbnQgaW4gdGhlIHNhbWUgU3dhZ2dlciBvciBPcGVuQVBJIGRlZmluaXRpb24uIFBsZWFzZSByZW1vdmUgb25lIG9mIHRoZSBmaWVsZHMuIiksUmUuY3JlYXRlRWxlbWVudCgicCIsbnVsbCwiU3VwcG9ydGVkIHZlcnNpb24gZmllbGRzIGFyZSAiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsJ3N3YWdnZXI6ICIyLjAiJyksIiwiLCIgIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJvcGVuYXBpOiAzLjAueCIpLCIsIG9yICIsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaTogMy4xLngiKSwiIChmb3IgZXhhbXBsZSwgIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJvcGVuYXBpOiAzLjEuMCIpLCIpLiIpKSkpOm98fGl8fGE/UmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLF8pOlJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToidmVyc2lvbi1wcmFnbWEifSx1LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToidmVyc2lvbi1wcmFnbWFfX21lc3NhZ2UgdmVyc2lvbi1wcmFnbWFfX21lc3NhZ2UtLW1pc3NpbmcifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgiaDMiLG51bGwsIlVuYWJsZSB0byByZW5kZXIgdGhpcyBkZWZpbml0aW9uIiksUmUuY3JlYXRlRWxlbWVudCgicCIsbnVsbCwiVGhlIHByb3ZpZGVkIGRlZmluaXRpb24gZG9lcyBub3Qgc3BlY2lmeSBhIHZhbGlkIHZlcnNpb24gZmllbGQuIiksUmUuY3JlYXRlRWxlbWVudCgicCIsbnVsbCwiUGxlYXNlIGluZGljYXRlIGEgdmFsaWQgU3dhZ2dlciBvciBPcGVuQVBJIHZlcnNpb24gZmllbGQuIFN1cHBvcnRlZCB2ZXJzaW9uIGZpZWxkcyBhcmUgIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCdzd2FnZ2VyOiAiMi4wIicpLCIsIiwiICIsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaTogMy4wLngiKSwiLCBvciAiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsIm9wZW5hcGk6IDMuMS54IiksIiAoZm9yIGV4YW1wbGUsICIsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaTogMy4xLjAiKSwiKS4iKSkpKSxnZXRNb2RlbE5hbWU9cz0+InN0cmluZyI9PXR5cGVvZiBzJiZzLmluY2x1ZGVzKCIjL2NvbXBvbmVudHMvc2NoZW1hcy8iKT8ocz0+e2NvbnN0IG89cy5yZXBsYWNlKC9+MS9nLCIvIikucmVwbGFjZSgvfjAvZywifiIpO3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KG8pfWNhdGNoe3JldHVybiBvfX0pKHMucmVwbGFjZSgvXi4qI1wvY29tcG9uZW50c1wvc2NoZW1hc1wvLywiIikpOm51bGwsRUk9KDAsUmUuZm9yd2FyZFJlZikoKCh7c2NoZW1hOnMsZ2V0Q29tcG9uZW50Om8sb25Ub2dnbGU6aT0oKT0+e30sc3BlY1BhdGg6YX0sdSk9Pntjb25zdCBfPW8oIkpTT05TY2hlbWEyMDIwMTIiKSx3PWdldE1vZGVsTmFtZShzLmdldCgiJCRyZWYiKSkseD0oMCxSZS51c2VDYWxsYmFjaykoKChzLG8pPT57aSh3LG8pfSksW3csaV0pO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KF8se25hbWU6dyxzY2hlbWE6cy50b0pTKCkscmVmOnUsb25FeHBhbmQ6eCxpZGVudGlmaWVyOmEudG9KUygpLmpvaW4oIl8iKX0pfSkpLHdJPUVJLG1vZGVscz0oe3NwZWNBY3Rpb25zOnMsc3BlY1NlbGVjdG9yczpvLGxheW91dFNlbGVjdG9yczppLGxheW91dEFjdGlvbnM6YSxnZXRDb21wb25lbnQ6dSxnZXRDb25maWdzOl8sZm46d30pPT57Y29uc3QgeD1vLnNlbGVjdFNjaGVtYXMoKSxDPU9iamVjdC5rZXlzKHgpLmxlbmd0aD4wLGo9WyJjb21wb25lbnRzIiwic2NoZW1hcyJdLHtkb2NFeHBhbnNpb246TCxkZWZhdWx0TW9kZWxzRXhwYW5kRGVwdGg6Qn09XygpLCQ9Qj4wJiYibm9uZSIhPT1MLFU9aS5pc1Nob3duKGosJCksVj11KCJDb2xsYXBzZSIpLHo9dSgiSlNPTlNjaGVtYTIwMjAxMiIpLFk9dSgiQXJyb3dVcEljb24iKSxaPXUoIkFycm93RG93bkljb24iKSx7Z2V0VGl0bGU6ZWV9PXcuanNvblNjaGVtYTIwMjAxMi51c2VGbigpOygwLFJlLnVzZUVmZmVjdCkoKCgpPT57Y29uc3QgYT1PYmplY3QuZW50cmllcyh4KS5zb21lKCgoW3NdKT0+aS5pc1Nob3duKFsuLi5qLHNdLCExKSkpLHU9VSYmKEI+MXx8YSksXz1udWxsIT1vLnNwZWNSZXNvbHZlZFN1YnRyZWUoaik7dSYmIV8mJnMucmVxdWVzdFJlc29sdmVkU3VidHJlZShqKX0pLFtVLEJdKTtjb25zdCBpZT0oMCxSZS51c2VDYWxsYmFjaykoKCgpPT57YS5zaG93KGosIVUpfSksW1VdKSxhZT0oMCxSZS51c2VDYWxsYmFjaykoKHM9PntudWxsIT09cyYmYS5yZWFkeVRvU2Nyb2xsKGoscyl9KSxbXSksaGFuZGxlSlNPTlNjaGVtYTIwMjAxMlJlZj1zPT5vPT57bnVsbCE9PW8mJmEucmVhZHlUb1Njcm9sbChbLi4uaixzXSxvKX0saGFuZGxlSlNPTlNjaGVtYTIwMjAxMkV4cGFuZD1pPT4odSxfKT0+e2NvbnN0IHc9Wy4uLmosaV07aWYoXyl7bnVsbCE9by5zcGVjUmVzb2x2ZWRTdWJ0cmVlKHcpfHxzLnJlcXVlc3RSZXNvbHZlZFN1YnRyZWUoWy4uLmosaV0pLGEuc2hvdyh3LCEwKX1lbHNlIGEuc2hvdyh3LCExKX07cmV0dXJuIUN8fEI8MD9udWxsOlJlLmNyZWF0ZUVsZW1lbnQoInNlY3Rpb24iLHtjbGFzc05hbWU6Sm4oKSgibW9kZWxzIix7ImlzLW9wZW4iOlV9KSxyZWY6YWV9LFJlLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIseyJhcmlhLWV4cGFuZGVkIjpVLGNsYXNzTmFtZToibW9kZWxzLWNvbnRyb2wiLG9uQ2xpY2s6aWV9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsIlNjaGVtYXMiKSxVP1JlLmNyZWF0ZUVsZW1lbnQoWSxudWxsKTpSZS5jcmVhdGVFbGVtZW50KFosbnVsbCkpKSxSZS5jcmVhdGVFbGVtZW50KFYse2lzT3BlbmVkOlV9LE9iamVjdC5lbnRyaWVzKHgpLm1hcCgoKFtzLG9dKT0+e2NvbnN0IGk9ZWUobyx7bG9va3VwOiJiYXNpYyJ9KXx8cztyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCh6LHtrZXk6cyxyZWY6aGFuZGxlSlNPTlNjaGVtYTIwMjAxMlJlZihzKSxzY2hlbWE6byxuYW1lOmksb25FeHBhbmQ6aGFuZGxlSlNPTlNjaGVtYTIwMjAxMkV4cGFuZChzKX0pfSkpKSl9LG11dHVhbF90bHNfYXV0aD0oe3NjaGVtYTpzLGdldENvbXBvbmVudDpvLG5hbWU6aSxhdXRoU2VsZWN0b3JzOmF9KT0+e2NvbnN0IHU9bygiSnVtcFRvUGF0aCIsITApLF89YS5zZWxlY3RBdXRoUGF0aChpKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLGksIiAobXV0dWFsVExTKSAiLFJlLmNyZWF0ZUVsZW1lbnQodSx7cGF0aDpffSkpLFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIk11dHVhbCBUTFMgaXMgcmVxdWlyZWQgYnkgdGhpcyBBUEkvT3BlcmF0aW9uLiBDZXJ0aWZpY2F0ZXMgYXJlIG1hbmFnZWQgdmlhIHlvdXIgT3BlcmF0aW5nIFN5c3RlbSBhbmQvb3IgeW91ciBicm93c2VyLiIpLFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwscy5nZXQoImRlc2NyaXB0aW9uIikpKX07Y2xhc3MgYXV0aHNfQXV0aHMgZXh0ZW5kcyBSZS5Db21wb25lbnR7Y29uc3RydWN0b3IocyxvKXtzdXBlcihzLG8pLHRoaXMuc3RhdGU9e319b25BdXRoQ2hhbmdlPXM9PntsZXR7bmFtZTpvfT1zO3RoaXMuc2V0U3RhdGUoe1tvXTpzfSl9O3N1Ym1pdEF1dGg9cz0+e3MucHJldmVudERlZmF1bHQoKTtsZXR7YXV0aEFjdGlvbnM6b309dGhpcy5wcm9wcztvLmF1dGhvcml6ZVdpdGhQZXJzaXN0T3B0aW9uKHRoaXMuc3RhdGUpfTtsb2dvdXRDbGljaz1zPT57cy5wcmV2ZW50RGVmYXVsdCgpO2xldHthdXRoQWN0aW9uczpvLGRlZmluaXRpb25zOml9PXRoaXMucHJvcHMsYT1pLm1hcCgoKHMsbyk9Pm8pKS50b0FycmF5KCk7dGhpcy5zZXRTdGF0ZShhLnJlZHVjZSgoKHMsbyk9PihzW29dPSIiLHMpKSx7fSkpLG8ubG9nb3V0V2l0aFBlcnNpc3RPcHRpb24oYSl9O2Nsb3NlPXM9PntzLnByZXZlbnREZWZhdWx0KCk7bGV0e2F1dGhBY3Rpb25zOm99PXRoaXMucHJvcHM7by5zaG93RGVmaW5pdGlvbnMoITEpfTtyZW5kZXIoKXtsZXR7ZGVmaW5pdGlvbnM6cyxnZXRDb21wb25lbnQ6byxhdXRoU2VsZWN0b3JzOmksZXJyU2VsZWN0b3JzOmF9PXRoaXMucHJvcHM7Y29uc3QgdT1vKCJBdXRoSXRlbSIpLF89bygib2F1dGgyIiwhMCksdz1vKCJCdXR0b24iKSx4PWkuYXV0aG9yaXplZCgpLEM9cy5maWx0ZXIoKChzLG8pPT4hIXguZ2V0KG8pKSksaj1zLmZpbHRlcigocz0+Im9hdXRoMiIhPT1zLmdldCgidHlwZSIpJiYibXV0dWFsVExTIiE9PXMuZ2V0KCJ0eXBlIikpKSxMPXMuZmlsdGVyKChzPT4ib2F1dGgyIj09PXMuZ2V0KCJ0eXBlIikpKSxCPXMuZmlsdGVyKChzPT4ibXV0dWFsVExTIj09PXMuZ2V0KCJ0eXBlIikpKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJhdXRoLWNvbnRhaW5lciJ9LGouc2l6ZT4wJiZSZS5jcmVhdGVFbGVtZW50KCJmb3JtIix7b25TdWJtaXQ6dGhpcy5zdWJtaXRBdXRofSxqLm1hcCgoKHMsXyk9PlJlLmNyZWF0ZUVsZW1lbnQodSx7a2V5Ol8sc2NoZW1hOnMsbmFtZTpfLGdldENvbXBvbmVudDpvLG9uQXV0aENoYW5nZTp0aGlzLm9uQXV0aENoYW5nZSxhdXRob3JpemVkOngsZXJyU2VsZWN0b3JzOmEsYXV0aFNlbGVjdG9yczppfSkpKS50b0FycmF5KCksUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJhdXRoLWJ0bi13cmFwcGVyIn0sai5zaXplPT09Qy5zaXplP1JlLmNyZWF0ZUVsZW1lbnQodyx7Y2xhc3NOYW1lOiJidG4gbW9kYWwtYnRuIGF1dGgiLG9uQ2xpY2s6dGhpcy5sb2dvdXRDbGljaywiYXJpYS1sYWJlbCI6IlJlbW92ZSBhdXRob3JpemF0aW9uIn0sIkxvZ291dCIpOlJlLmNyZWF0ZUVsZW1lbnQodyx7dHlwZToic3VibWl0IixjbGFzc05hbWU6ImJ0biBtb2RhbC1idG4gYXV0aCBhdXRob3JpemUiLCJhcmlhLWxhYmVsIjoiQXBwbHkgY3JlZGVudGlhbHMifSwiQXV0aG9yaXplIiksUmUuY3JlYXRlRWxlbWVudCh3LHtjbGFzc05hbWU6ImJ0biBtb2RhbC1idG4gYXV0aCBidG4tZG9uZSIsb25DbGljazp0aGlzLmNsb3NlfSwiQ2xvc2UiKSkpLEwuc2l6ZT4wP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InNjb3BlLWRlZiJ9LFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIlNjb3BlcyBhcmUgdXNlZCB0byBncmFudCBhbiBhcHBsaWNhdGlvbiBkaWZmZXJlbnQgbGV2ZWxzIG9mIGFjY2VzcyB0byBkYXRhIG9uIGJlaGFsZiBvZiB0aGUgZW5kIHVzZXIuIEVhY2ggQVBJIG1heSBkZWNsYXJlIG9uZSBvciBtb3JlIHNjb3Blcy4iKSxSZS5jcmVhdGVFbGVtZW50KCJwIixudWxsLCJBUEkgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBzY29wZXMuIFNlbGVjdCB3aGljaCBvbmVzIHlvdSB3YW50IHRvIGdyYW50IHRvIFN3YWdnZXIgVUkuIikpLHMuZmlsdGVyKChzPT4ib2F1dGgyIj09PXMuZ2V0KCJ0eXBlIikpKS5tYXAoKChzLG8pPT5SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtrZXk6b30sUmUuY3JlYXRlRWxlbWVudChfLHthdXRob3JpemVkOngsc2NoZW1hOnMsbmFtZTpvfSkpKSkudG9BcnJheSgpKTpudWxsLEIuc2l6ZT4wJiZSZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsQi5tYXAoKChzLF8pPT5SZS5jcmVhdGVFbGVtZW50KHUse2tleTpfLHNjaGVtYTpzLG5hbWU6XyxnZXRDb21wb25lbnQ6byxvbkF1dGhDaGFuZ2U6dGhpcy5vbkF1dGhDaGFuZ2UsYXV0aG9yaXplZDp4LGVyclNlbGVjdG9yczphLGF1dGhTZWxlY3RvcnM6aX0pKSkudG9BcnJheSgpKSl9fWNvbnN0IHhJPWF1dGhzX0F1dGhzLGlzT0FTMzE9cz0+e2NvbnN0IG89cy5nZXQoIm9wZW5hcGkiKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJi9eM1wuMVwuKD86WzEtOV1cZCp8MCkkLy50ZXN0KG8pfSxmbl9jcmVhdGVPbmx5T0FTMzFTZWxlY3Rvcj1zPT4obywuLi5pKT0+YT0+e2lmKGEuZ2V0U3lzdGVtKCkuc3BlY1NlbGVjdG9ycy5pc09BUzMxKCkpe2NvbnN0IHU9cyhvLC4uLmkpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB1P3UoYSk6dX1yZXR1cm4gbnVsbH0sY3JlYXRlT25seU9BUzMxU2VsZWN0b3JXcmFwcGVyPXM9PihvLGkpPT4oYSwuLi51KT0+e2lmKGkuZ2V0U3lzdGVtKCkuc3BlY1NlbGVjdG9ycy5pc09BUzMxKCkpe2NvbnN0IF89cyhhLC4uLnUpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBfP18obyxpKTpffXJldHVybiBvKC4uLnUpfSxmbl9jcmVhdGVTeXN0ZW1TZWxlY3Rvcj1zPT4obywuLi5pKT0+YT0+e2NvbnN0IHU9cyhvLGEsLi4uaSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHU/dShhKTp1fSxjcmVhdGVPbmx5T0FTMzFDb21wb25lbnRXcmFwcGVyPXM9PihvLGkpPT5hPT5pLnNwZWNTZWxlY3RvcnMuaXNPQVMzMSgpP1JlLmNyZWF0ZUVsZW1lbnQocyxNbigpKHt9LGEse29yaWdpbmFsQ29tcG9uZW50Om8sZ2V0U3lzdGVtOmkuZ2V0U3lzdGVtfSkpOlJlLmNyZWF0ZUVsZW1lbnQobyxhKSx3cmFwT0FTMzFGbj0ocyxvKT0+e2NvbnN0e2ZuOmksc3BlY1NlbGVjdG9yczphfT1vO3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocykubWFwKCgoW3Msb10pPT57Y29uc3QgdT1pW3NdO3JldHVybltzLCguLi5zKT0+YS5pc09BUzMxKCk/byguLi5zKToiZnVuY3Rpb24iPT10eXBlb2YgdT91KC4uLnMpOnZvaWQgMF19KSkpfSxrST1jcmVhdGVPbmx5T0FTMzFDb21wb25lbnRXcmFwcGVyKCgoe2dldFN5c3RlbTpzfSk9Pntjb25zdCBvPXMoKS5nZXRDb21wb25lbnQoIk9BUzMxTGljZW5zZSIsITApO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KG8sbnVsbCl9KSksT0k9Y3JlYXRlT25seU9BUzMxQ29tcG9uZW50V3JhcHBlcigoKHtnZXRTeXN0ZW06c30pPT57Y29uc3Qgbz1zKCkuZ2V0Q29tcG9uZW50KCJPQVMzMUNvbnRhY3QiLCEwKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudChvLG51bGwpfSkpLEFJPWNyZWF0ZU9ubHlPQVMzMUNvbXBvbmVudFdyYXBwZXIoKCh7Z2V0U3lzdGVtOnN9KT0+e2NvbnN0IG89cygpLmdldENvbXBvbmVudCgiT0FTMzFJbmZvIiwhMCk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQobyxudWxsKX0pKSxnZXRQcm9wZXJ0aWVzPShzLHtpbmNsdWRlUmVhZE9ubHk6byxpbmNsdWRlV3JpdGVPbmx5Oml9KT0+e2lmKCFzPy5wcm9wZXJ0aWVzKXJldHVybnt9O2NvbnN0IGE9T2JqZWN0LmVudHJpZXMocy5wcm9wZXJ0aWVzKS5maWx0ZXIoKChbLHNdKT0+KCEoITA9PT1zPy5yZWFkT25seSl8fG8pJiYoISghMD09PXM/LndyaXRlT25seSl8fGkpKSk7cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhhKX0sbWFrZUdldFNjaGVtYUtleXdvcmRzPXM9PntpZigiZnVuY3Rpb24iIT10eXBlb2YgcylyZXR1cm4gbnVsbDtjb25zdCBvPXMoKTtyZXR1cm4oKT0+Wy4uLm8sImRpc2NyaW1pbmF0b3IiLCJ4bWwiLCJleHRlcm5hbERvY3MiLCJleGFtcGxlIiwiJCRyZWYiXX0sQ0k9Y3JlYXRlT25seU9BUzMxQ29tcG9uZW50V3JhcHBlcigoKHtnZXRTeXN0ZW06cywuLi5vfSk9Pntjb25zdCBpPXMoKSx7Z2V0Q29tcG9uZW50OmEsZm46dSxnZXRDb25maWdzOl99PWksdz1fKCkseD1hKCJPQVMzMU1vZGVsIiksQz1hKCJ3aXRoSlNPTlNjaGVtYTIwMjAxMlN5c3RlbUNvbnRleHQiKTtyZXR1cm4gQ0kuTW9kZWxXaXRoSlNPTlNjaGVtYUNvbnRleHQ/Pz1DKHgse2NvbmZpZzp7ZGVmYXVsdCRzY2hlbWE6Imh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzLzMuMS9kaWFsZWN0L2Jhc2UiLGRlZmF1bHRFeHBhbmRlZExldmVsczp3LmRlZmF1bHRNb2RlbEV4cGFuZERlcHRoLGluY2x1ZGVSZWFkT25seTpvLmluY2x1ZGVSZWFkT25seSxpbmNsdWRlV3JpdGVPbmx5Om8uaW5jbHVkZVdyaXRlT25seX0sZm46e2dldFByb3BlcnRpZXM6dS5qc29uU2NoZW1hMjAyMDEyLmdldFByb3BlcnRpZXMsaXNFeHBhbmRhYmxlOnUuanNvblNjaGVtYTIwMjAxMi5pc0V4cGFuZGFibGUsZ2V0U2NoZW1hS2V5d29yZHM6bWFrZUdldFNjaGVtYUtleXdvcmRzKHUuanNvblNjaGVtYTIwMjAxMi5nZXRTY2hlbWFLZXl3b3Jkcyl9fSksUmUuY3JlYXRlRWxlbWVudChDSS5Nb2RlbFdpdGhKU09OU2NoZW1hQ29udGV4dCxvKX0pKSxqST1DSSxQST1jcmVhdGVPbmx5T0FTMzFDb21wb25lbnRXcmFwcGVyKCgoe2dldFN5c3RlbTpzfSk9Pntjb25zdHtnZXRDb21wb25lbnQ6byxmbjppLGdldENvbmZpZ3M6YX09cygpLHU9YSgpO2lmKFBJLk1vZGVsc1dpdGhKU09OU2NoZW1hQ29udGV4dClyZXR1cm4gUmUuY3JlYXRlRWxlbWVudChQSS5Nb2RlbHNXaXRoSlNPTlNjaGVtYUNvbnRleHQsbnVsbCk7Y29uc3QgXz1vKCJPQVMzMU1vZGVscyIsITApLHc9bygid2l0aEpTT05TY2hlbWEyMDIwMTJTeXN0ZW1Db250ZXh0Iik7cmV0dXJuIFBJLk1vZGVsc1dpdGhKU09OU2NoZW1hQ29udGV4dD8/PXcoXyx7Y29uZmlnOntkZWZhdWx0JHNjaGVtYToiaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvMy4xL2RpYWxlY3QvYmFzZSIsZGVmYXVsdEV4cGFuZGVkTGV2ZWxzOnUuZGVmYXVsdE1vZGVsc0V4cGFuZERlcHRoLTEsaW5jbHVkZVJlYWRPbmx5OiEwLGluY2x1ZGVXcml0ZU9ubHk6ITB9LGZuOntnZXRQcm9wZXJ0aWVzOmkuanNvblNjaGVtYTIwMjAxMi5nZXRQcm9wZXJ0aWVzLGlzRXhwYW5kYWJsZTppLmpzb25TY2hlbWEyMDIwMTIuaXNFeHBhbmRhYmxlLGdldFNjaGVtYUtleXdvcmRzOm1ha2VHZXRTY2hlbWFLZXl3b3JkcyhpLmpzb25TY2hlbWEyMDIwMTIuZ2V0U2NoZW1hS2V5d29yZHMpfX0pLFJlLmNyZWF0ZUVsZW1lbnQoUEkuTW9kZWxzV2l0aEpTT05TY2hlbWFDb250ZXh0LG51bGwpfSkpO1BJLk1vZGVsc1dpdGhKU09OU2NoZW1hQ29udGV4dD1udWxsO2NvbnN0IElJPVBJLHdyYXBfY29tcG9uZW50c192ZXJzaW9uX3ByYWdtYV9maWx0ZXI9KHMsbyk9PnM9Pntjb25zdCBpPW8uc3BlY1NlbGVjdG9ycy5pc09BUzMxKCksYT1vLmdldENvbXBvbmVudCgiT0FTMzFWZXJzaW9uUHJhZ21hRmlsdGVyIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoYSxNbigpKHtpc09BUzMxOml9LHMpKX0sVEk9Y3JlYXRlT25seU9BUzMxQ29tcG9uZW50V3JhcHBlcigoKHtvcmlnaW5hbENvbXBvbmVudDpzLC4uLm99KT0+e2NvbnN0e2dldENvbXBvbmVudDppLHNjaGVtYTphLG5hbWU6dX09byxfPWkoIk11dHVhbFRMU0F1dGgiLCEwKTtyZXR1cm4ibXV0dWFsVExTIj09PWEuZ2V0KCJ0eXBlIik/UmUuY3JlYXRlRWxlbWVudChfLHtzY2hlbWE6YSxuYW1lOnV9KTpSZS5jcmVhdGVFbGVtZW50KHMsbyl9KSksTkk9VEksTUk9Y3JlYXRlT25seU9BUzMxQ29tcG9uZW50V3JhcHBlcigoKHtnZXRTeXN0ZW06cywuLi5vfSk9Pntjb25zdCBpPXMoKS5nZXRDb21wb25lbnQoIk9BUzMxQXV0aHMiLCEwKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudChpLG8pfSkpLFJJPSgwLHplLk1hcCkoKSxEST1VdCgoKHMsbyk9Pm8uc3BlY1NlbGVjdG9ycy5zcGVjSnNvbigpKSxpc09BUzMxKSxzZWxlY3RvcnNfd2ViaG9va3M9KCk9PnM9Pntjb25zdCBvPXMuc3BlY1NlbGVjdG9ycy5zcGVjSnNvbigpLmdldCgid2ViaG9va3MiKTtyZXR1cm4gemUuTWFwLmlzTWFwKG8pP286Ukl9LExJPVV0KFsocyxvKT0+by5zcGVjU2VsZWN0b3JzLndlYmhvb2tzKCksKHMsbyk9Pm8uc3BlY1NlbGVjdG9ycy52YWxpZE9wZXJhdGlvbk1ldGhvZHMoKSwocyxvKT0+by5zcGVjU2VsZWN0b3JzLnNwZWNSZXNvbHZlZFN1YnRyZWUoWyJ3ZWJob29rcyJdKV0sKChzLG8pPT5zLnJlZHVjZSgoKHMsaSxhKT0+e2lmKCF6ZS5NYXAuaXNNYXAoaSkpcmV0dXJuIHM7Y29uc3QgdT1pLmVudHJ5U2VxKCkuZmlsdGVyKCgoW3NdKT0+by5pbmNsdWRlcyhzKSkpLm1hcCgoKFtzLG9dKT0+KHtvcGVyYXRpb246KDAsemUuTWFwKSh7b3BlcmF0aW9uOm99KSxtZXRob2Q6cyxwYXRoOmEsc3BlY1BhdGg6WyJ3ZWJob29rcyIsYSxzXX0pKSk7cmV0dXJuIHMuY29uY2F0KHUpfSksKDAsemUuTGlzdCkoKSkuZ3JvdXBCeSgocz0+cy5wYXRoKSkubWFwKChzPT5zLnRvQXJyYXkoKSkpLnRvT2JqZWN0KCkpKSxzZWxlY3RvcnNfbGljZW5zZT0oKT0+cz0+e2NvbnN0IG89cy5zcGVjU2VsZWN0b3JzLmluZm8oKS5nZXQoImxpY2Vuc2UiKTtyZXR1cm4gemUuTWFwLmlzTWFwKG8pP286Ukl9LHNlbGVjdExpY2Vuc2VOYW1lRmllbGQ9KCk9PnM9PnMuc3BlY1NlbGVjdG9ycy5saWNlbnNlKCkuZ2V0KCJuYW1lIiwiTGljZW5zZSIpLHNlbGVjdExpY2Vuc2VVcmxGaWVsZD0oKT0+cz0+cy5zcGVjU2VsZWN0b3JzLmxpY2Vuc2UoKS5nZXQoInVybCIpLEZJPVV0KFsocyxvKT0+by5zcGVjU2VsZWN0b3JzLnVybCgpLChzLG8pPT5vLm9hczNTZWxlY3RvcnMuc2VsZWN0ZWRTZXJ2ZXIoKSwocyxvKT0+by5zcGVjU2VsZWN0b3JzLnNlbGVjdExpY2Vuc2VVcmxGaWVsZCgpXSwoKHMsbyxpKT0+e2lmKGkpcmV0dXJuIHNhZmVCdWlsZFVybChpLHMse3NlbGVjdGVkU2VydmVyOm99KX0pKSxzZWxlY3RMaWNlbnNlSWRlbnRpZmllckZpZWxkPSgpPT5zPT5zLnNwZWNTZWxlY3RvcnMubGljZW5zZSgpLmdldCgiaWRlbnRpZmllciIpLHNlbGVjdG9yc19jb250YWN0PSgpPT5zPT57Y29uc3Qgbz1zLnNwZWNTZWxlY3RvcnMuaW5mbygpLmdldCgiY29udGFjdCIpO3JldHVybiB6ZS5NYXAuaXNNYXAobyk/bzpSSX0sc2VsZWN0Q29udGFjdE5hbWVGaWVsZD0oKT0+cz0+cy5zcGVjU2VsZWN0b3JzLmNvbnRhY3QoKS5nZXQoIm5hbWUiLCJ0aGUgZGV2ZWxvcGVyIiksc2VsZWN0Q29udGFjdEVtYWlsRmllbGQ9KCk9PnM9PnMuc3BlY1NlbGVjdG9ycy5jb250YWN0KCkuZ2V0KCJlbWFpbCIpLHNlbGVjdENvbnRhY3RVcmxGaWVsZD0oKT0+cz0+cy5zcGVjU2VsZWN0b3JzLmNvbnRhY3QoKS5nZXQoInVybCIpLEJJPVV0KFsocyxvKT0+by5zcGVjU2VsZWN0b3JzLnVybCgpLChzLG8pPT5vLm9hczNTZWxlY3RvcnMuc2VsZWN0ZWRTZXJ2ZXIoKSwocyxvKT0+by5zcGVjU2VsZWN0b3JzLnNlbGVjdENvbnRhY3RVcmxGaWVsZCgpXSwoKHMsbyxpKT0+e2lmKGkpcmV0dXJuIHNhZmVCdWlsZFVybChpLHMse3NlbGVjdGVkU2VydmVyOm99KX0pKSxzZWxlY3RJbmZvVGl0bGVGaWVsZD0oKT0+cz0+cy5zcGVjU2VsZWN0b3JzLmluZm8oKS5nZXQoInRpdGxlIiksc2VsZWN0SW5mb1N1bW1hcnlGaWVsZD0oKT0+cz0+cy5zcGVjU2VsZWN0b3JzLmluZm8oKS5nZXQoInN1bW1hcnkiKSxzZWxlY3RJbmZvRGVzY3JpcHRpb25GaWVsZD0oKT0+cz0+cy5zcGVjU2VsZWN0b3JzLmluZm8oKS5nZXQoImRlc2NyaXB0aW9uIiksc2VsZWN0SW5mb1Rlcm1zT2ZTZXJ2aWNlRmllbGQ9KCk9PnM9PnMuc3BlY1NlbGVjdG9ycy5pbmZvKCkuZ2V0KCJ0ZXJtc09mU2VydmljZSIpLCRJPVV0KFsocyxvKT0+by5zcGVjU2VsZWN0b3JzLnVybCgpLChzLG8pPT5vLm9hczNTZWxlY3RvcnMuc2VsZWN0ZWRTZXJ2ZXIoKSwocyxvKT0+by5zcGVjU2VsZWN0b3JzLnNlbGVjdEluZm9UZXJtc09mU2VydmljZUZpZWxkKCldLCgocyxvLGkpPT57aWYoaSlyZXR1cm4gc2FmZUJ1aWxkVXJsKGkscyx7c2VsZWN0ZWRTZXJ2ZXI6b30pfSkpLHNlbGVjdEV4dGVybmFsRG9jc0Rlc2NyaXB0aW9uRmllbGQ9KCk9PnM9PnMuc3BlY1NlbGVjdG9ycy5leHRlcm5hbERvY3MoKS5nZXQoImRlc2NyaXB0aW9uIiksc2VsZWN0RXh0ZXJuYWxEb2NzVXJsRmllbGQ9KCk9PnM9PnMuc3BlY1NlbGVjdG9ycy5leHRlcm5hbERvY3MoKS5nZXQoInVybCIpLHFJPVV0KFsocyxvKT0+by5zcGVjU2VsZWN0b3JzLnVybCgpLChzLG8pPT5vLm9hczNTZWxlY3RvcnMuc2VsZWN0ZWRTZXJ2ZXIoKSwocyxvKT0+by5zcGVjU2VsZWN0b3JzLnNlbGVjdEV4dGVybmFsRG9jc1VybEZpZWxkKCldLCgocyxvLGkpPT57aWYoaSlyZXR1cm4gc2FmZUJ1aWxkVXJsKGkscyx7c2VsZWN0ZWRTZXJ2ZXI6b30pfSkpLHNlbGVjdEpzb25TY2hlbWFEaWFsZWN0RmllbGQ9KCk9PnM9PnMuc3BlY1NlbGVjdG9ycy5zcGVjSnNvbigpLmdldCgianNvblNjaGVtYURpYWxlY3QiKSxzZWxlY3RKc29uU2NoZW1hRGlhbGVjdERlZmF1bHQ9KCk9PiJodHRwczovL3NwZWMub3BlbmFwaXMub3JnL29hcy8zLjEvZGlhbGVjdC9iYXNlIixVST1VdCgoKHMsbyk9Pm8uc3BlY1NlbGVjdG9ycy5kZWZpbml0aW9ucygpKSwoKHMsbyk9Pm8uc3BlY1NlbGVjdG9ycy5zcGVjUmVzb2x2ZWRTdWJ0cmVlKFsiY29tcG9uZW50cyIsInNjaGVtYXMiXSkpLCgocyxvKT0+emUuTWFwLmlzTWFwKHMpP3plLk1hcC5pc01hcChvKT9PYmplY3QuZW50cmllcyhzLnRvSlMoKSkucmVkdWNlKCgocyxbaSxhXSk9Pntjb25zdCB1PW8uZ2V0KGkpO3JldHVybiBzW2ldPXU/LnRvSlMoKXx8YSxzfSkse30pOnMudG9KUygpOnt9KSksd3JhcF9zZWxlY3RvcnNfaXNPQVMzPShzLG8pPT4oaSwuLi5hKT0+by5zcGVjU2VsZWN0b3JzLmlzT0FTMzEoKXx8cyguLi5hKSxWST1jcmVhdGVPbmx5T0FTMzFTZWxlY3RvcldyYXBwZXIoKCgpPT4ocyxvKT0+by5vYXMzMVNlbGVjdG9ycy5zZWxlY3RMaWNlbnNlVXJsKCkpKSx6ST1jcmVhdGVPbmx5T0FTMzFTZWxlY3RvcldyYXBwZXIoKCgpPT4ocyxvKT0+e2NvbnN0IGk9by5zcGVjU2VsZWN0b3JzLnNlY3VyaXR5RGVmaW5pdGlvbnMoKTtsZXQgYT1zKCk7cmV0dXJuIGk/KGkuZW50cnlTZXEoKS5mb3JFYWNoKCgoW3Msb10pPT57Y29uc3QgaT1vPy5nZXQoInR5cGUiKTsibXV0dWFsVExTIj09PWkmJihhPWEucHVzaChuZXcgemUuTWFwKHtbc106b30pKSl9KSksYSk6YX0pKSxXST1VdChbKHMsbyk9Pm8uc3BlY1NlbGVjdG9ycy51cmwoKSwocyxvKT0+by5vYXMzU2VsZWN0b3JzLnNlbGVjdGVkU2VydmVyKCksKHMsbyk9Pm8uc3BlY1NlbGVjdG9ycy5zZWxlY3RMaWNlbnNlVXJsRmllbGQoKSwocyxvKT0+by5zcGVjU2VsZWN0b3JzLnNlbGVjdExpY2Vuc2VJZGVudGlmaWVyRmllbGQoKV0sKChzLG8saSxhKT0+aT9zYWZlQnVpbGRVcmwoaSxzLHtzZWxlY3RlZFNlcnZlcjpvfSk6YT9gaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy8ke2F9Lmh0bWxgOnZvaWQgMCkpLGtleXdvcmRzX0V4YW1wbGU9KHtzY2hlbWE6cyxnZXRTeXN0ZW06b30pPT57Y29uc3R7Zm46aSxnZXRDb21wb25lbnQ6YX09bygpLHtoYXNLZXl3b3JkOnV9PWkuanNvblNjaGVtYTIwMjAxMi51c2VGbigpLF89YSgiSlNPTlNjaGVtYTIwMjAxMkpTT05WaWV3ZXIiKTtyZXR1cm4gdShzLCJleGFtcGxlIik/UmUuY3JlYXRlRWxlbWVudChfLHtuYW1lOiJFeGFtcGxlIix2YWx1ZTpzLmV4YW1wbGUsY2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS1leGFtcGxlIn0pOm51bGx9LGtleXdvcmRzX1htbD0oe3NjaGVtYTpzLGdldFN5c3RlbTpvfSk9Pntjb25zdCBpPXM/LnhtbHx8e30se2ZuOmEsZ2V0Q29tcG9uZW50OnUsZ2V0Q29uZmlnczpffT1vKCkse3Nob3dFeHRlbnNpb25zOnd9PV8oKSx7dXNlQ29tcG9uZW50OngsdXNlSXNFeHBhbmRlZDpDLHVzZVBhdGg6aix1c2VMZXZlbDpMfT1hLmpzb25TY2hlbWEyMDIwMTIse3BhdGg6Qn09aigieG1sIikse2lzRXhwYW5kZWQ6JCxzZXRFeHBhbmRlZDpVLHNldENvbGxhcHNlZDpWfT1DKCJ4bWwiKSxbeixZXT1MKCksWj13P2dldEV4dGVuc2lvbnMoaSk6W10sZWU9ISEoaS5uYW1lfHxpLm5hbWVzcGFjZXx8aS5wcmVmaXh8fFoubGVuZ3RoPjApLGllPXgoIkFjY29yZGlvbiIpLGFlPXgoIkV4cGFuZERlZXBCdXR0b24iKSxjZT11KCJPcGVuQVBJMzFFeHRlbnNpb25zIiksbGU9dSgiSlNPTlNjaGVtYTIwMjAxMlBhdGhDb250ZXh0IikoKSxwZT11KCJKU09OU2NoZW1hMjAyMDEyTGV2ZWxDb250ZXh0IikoKSxkZT0oMCxSZS51c2VDYWxsYmFjaykoKCgpPT57JD9WKCk6VSgpfSksWyQsVSxWXSksZmU9KDAsUmUudXNlQ2FsbGJhY2spKCgocyxvKT0+e28/VSh7ZGVlcDohMH0pOlYoe2RlZXA6ITB9KX0pLFtVLFZdKTtyZXR1cm4gMD09PU9iamVjdC5rZXlzKGkpLmxlbmd0aD9udWxsOlJlLmNyZWF0ZUVsZW1lbnQobGUuUHJvdmlkZXIse3ZhbHVlOkJ9LFJlLmNyZWF0ZUVsZW1lbnQocGUuUHJvdmlkZXIse3ZhbHVlOll9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0teG1sIiwiZGF0YS1qc29uLXNjaGVtYS1sZXZlbCI6en0sZWU/UmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoaWUse2V4cGFuZGVkOiQsb25DaGFuZ2U6ZGV9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXNlY29uZGFyeSJ9LCJYTUwiKSksUmUuY3JlYXRlRWxlbWVudChhZSx7ZXhwYW5kZWQ6JCxvbkNsaWNrOmZlfSkpOlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXNlY29uZGFyeSJ9LCJYTUwiKSwhMD09PWkuYXR0cmlidXRlJiZSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyX19hdHRyaWJ1dGUganNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlLS1tdXRlZCJ9LCJhdHRyaWJ1dGUiKSwhMD09PWkud3JhcHBlZCYmUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlIGpzb24tc2NoZW1hLTIwMjAtMTJfX2F0dHJpYnV0ZS0tbXV0ZWQifSwid3JhcHBlZCIpLFJlLmNyZWF0ZUVsZW1lbnQoInN0cm9uZyIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlIGpzb24tc2NoZW1hLTIwMjAtMTJfX2F0dHJpYnV0ZS0tcHJpbWFyeSJ9LCJvYmplY3QiKSxSZS5jcmVhdGVFbGVtZW50KCJ1bCIse2NsYXNzTmFtZTpKbigpKCJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX2NoaWxkcmVuIix7Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fY2hpbGRyZW4tLWNvbGxhcHNlZCI6ISR9KX0sJCYmUmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLGkubmFtZSYmUmUuY3JlYXRlRWxlbWVudCgibGkiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItcHJvcGVydHkifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQifSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1zZWNvbmRhcnkifSwibmFtZSIpLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fdmFsdWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX192YWx1ZS0tc2Vjb25kYXJ5In0saS5uYW1lKSkpLGkubmFtZXNwYWNlJiZSZS5jcmVhdGVFbGVtZW50KCJsaSIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1wcm9wZXJ0eSJ9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIn0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZS0tc2Vjb25kYXJ5In0sIm5hbWVzcGFjZSIpLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fdmFsdWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX192YWx1ZS0tc2Vjb25kYXJ5In0saS5uYW1lc3BhY2UpKSksaS5wcmVmaXgmJlJlLmNyZWF0ZUVsZW1lbnQoImxpIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLXByb3BlcnR5In0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQifSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1zZWNvbmRhcnkifSwicHJlZml4IiksUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX192YWx1ZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX3ZhbHVlLS1zZWNvbmRhcnkifSxpLnByZWZpeCkpKSksWi5sZW5ndGg+MCYmUmUuY3JlYXRlRWxlbWVudChjZSx7b3BlbkFQSVNwZWNPYmo6aSxvcGVuQVBJRXh0ZW5zaW9uczpaLGdldFN5c3RlbTpvfSkpKSkpfSxEaXNjcmltaW5hdG9yX0Rpc2NyaW1pbmF0b3JNYXBwaW5nPSh7ZGlzY3JpbWluYXRvcjpzfSk9Pntjb25zdCBvPXM/Lm1hcHBpbmd8fHt9O3JldHVybiAwPT09T2JqZWN0LmtleXMobykubGVuZ3RoP251bGw6T2JqZWN0LmVudHJpZXMobykubWFwKCgoW3Msb10pPT5SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtrZXk6YCR7c30tJHtvfWAsY2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQifSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1zZWNvbmRhcnkifSxzKSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX3ZhbHVlIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fdmFsdWUtLXNlY29uZGFyeSJ9LG8pKSkpfSxrZXl3b3Jkc19EaXNjcmltaW5hdG9yX0Rpc2NyaW1pbmF0b3I9KHtzY2hlbWE6cyxnZXRTeXN0ZW06b30pPT57Y29uc3QgaT1zPy5kaXNjcmltaW5hdG9yfHx7fSx7Zm46YSxnZXRDb21wb25lbnQ6dSxnZXRDb25maWdzOl99PW8oKSx7c2hvd0V4dGVuc2lvbnM6d309XygpLHt1c2VDb21wb25lbnQ6eCx1c2VJc0V4cGFuZGVkOkMsdXNlUGF0aDpqLHVzZUxldmVsOkx9PWEuanNvblNjaGVtYTIwMjAxMixCPSJkaXNjcmltaW5hdG9yIix7cGF0aDokfT1qKEIpLHtpc0V4cGFuZGVkOlUsc2V0RXhwYW5kZWQ6VixzZXRDb2xsYXBzZWQ6en09QyhCKSxbWSxaXT1MKCksZWU9dz9nZXRFeHRlbnNpb25zKGkpOltdLGllPSEhKGkubWFwcGluZ3x8ZWUubGVuZ3RoPjApLGFlPXgoIkFjY29yZGlvbiIpLGNlPXgoIkV4cGFuZERlZXBCdXR0b24iKSxsZT11KCJPcGVuQVBJMzFFeHRlbnNpb25zIikscGU9dSgiSlNPTlNjaGVtYTIwMjAxMlBhdGhDb250ZXh0IikoKSxkZT11KCJKU09OU2NoZW1hMjAyMDEyTGV2ZWxDb250ZXh0IikoKSxmZT0oMCxSZS51c2VDYWxsYmFjaykoKCgpPT57VT96KCk6VigpfSksW1UsVix6XSkseWU9KDAsUmUudXNlQ2FsbGJhY2spKCgocyxvKT0+e28/Vih7ZGVlcDohMH0pOnooe2RlZXA6ITB9KX0pLFtWLHpdKTtyZXR1cm4gMD09PU9iamVjdC5rZXlzKGkpLmxlbmd0aD9udWxsOlJlLmNyZWF0ZUVsZW1lbnQocGUuUHJvdmlkZXIse3ZhbHVlOiR9LFJlLmNyZWF0ZUVsZW1lbnQoZGUuUHJvdmlkZXIse3ZhbHVlOlp9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0tZGlzY3JpbWluYXRvciIsImRhdGEtanNvbi1zY2hlbWEtbGV2ZWwiOll9LGllP1JlLmNyZWF0ZUVsZW1lbnQoUmUuRnJhZ21lbnQsbnVsbCxSZS5jcmVhdGVFbGVtZW50KGFlLHtleHBhbmRlZDpVLG9uQ2hhbmdlOmZlfSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1zZWNvbmRhcnkifSwiRGlzY3JpbWluYXRvciIpKSxSZS5jcmVhdGVFbGVtZW50KGNlLHtleHBhbmRlZDpVLG9uQ2xpY2s6eWV9KSk6UmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZS0tc2Vjb25kYXJ5In0sIkRpc2NyaW1pbmF0b3IiKSxpLnByb3BlcnR5TmFtZSYmUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlIGpzb24tc2NoZW1hLTIwMjAtMTJfX2F0dHJpYnV0ZS0tbXV0ZWQifSxpLnByb3BlcnR5TmFtZSksUmUuY3JlYXRlRWxlbWVudCgic3Ryb25nIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyX19hdHRyaWJ1dGUganNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlLS1wcmltYXJ5In0sIm9iamVjdCIpLFJlLmNyZWF0ZUVsZW1lbnQoInVsIix7Y2xhc3NOYW1lOkpuKCkoImpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fY2hpbGRyZW4iLHsianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19jaGlsZHJlbi0tY29sbGFwc2VkIjohVX0pfSxVJiZSZS5jcmVhdGVFbGVtZW50KCJsaSIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1wcm9wZXJ0eSJ9LFJlLmNyZWF0ZUVsZW1lbnQoRGlzY3JpbWluYXRvcl9EaXNjcmltaW5hdG9yTWFwcGluZyx7ZGlzY3JpbWluYXRvcjppfSkpLGVlLmxlbmd0aD4wJiZSZS5jcmVhdGVFbGVtZW50KGxlLHtvcGVuQVBJU3BlY09iajppLG9wZW5BUElFeHRlbnNpb25zOmVlLGdldFN5c3RlbTpvfSkpKSkpfSxrZXl3b3Jkc19PcGVuQVBJRXh0ZW5zaW9ucz0oe29wZW5BUElTcGVjT2JqOnMsZ2V0U3lzdGVtOm8sb3BlbkFQSUV4dGVuc2lvbnM6aX0pPT57Y29uc3R7Zm46YX09bygpLHt1c2VDb21wb25lbnQ6dX09YS5qc29uU2NoZW1hMjAyMDEyLF89dSgiSlNPTlZpZXdlciIpO3JldHVybiBpLm1hcCgobz0+UmUuY3JlYXRlRWxlbWVudChfLHtrZXk6byxuYW1lOm8sdmFsdWU6c1tvXSxjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItanNvbi12aWV3ZXItZXh0ZW5zaW9uLWtleXdvcmQifSkpKX0sa2V5d29yZHNfRXh0ZXJuYWxEb2NzPSh7c2NoZW1hOnMsZ2V0U3lzdGVtOm99KT0+e2NvbnN0IGk9cz8uZXh0ZXJuYWxEb2NzfHx7fSx7Zm46YSxnZXRDb21wb25lbnQ6dSxnZXRDb25maWdzOl99PW8oKSx7c2hvd0V4dGVuc2lvbnM6d309XygpLHt1c2VDb21wb25lbnQ6eCx1c2VJc0V4cGFuZGVkOkMsdXNlUGF0aDpqLHVzZUxldmVsOkx9PWEuanNvblNjaGVtYTIwMjAxMixCPSJleHRlcm5hbERvY3MiLHtwYXRoOiR9PWooQikse2lzRXhwYW5kZWQ6VSxzZXRFeHBhbmRlZDpWLHNldENvbGxhcHNlZDp6fT1DKEIpLFtZLFpdPUwoKSxlZT13P2dldEV4dGVuc2lvbnMoaSk6W10saWU9ISEoaS5kZXNjcmlwdGlvbnx8aS51cmx8fGVlLmxlbmd0aD4wKSxhZT14KCJBY2NvcmRpb24iKSxjZT14KCJFeHBhbmREZWVwQnV0dG9uIiksbGU9dSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmREZXNjcmlwdGlvbiIpLHBlPXUoIkxpbmsiKSxkZT11KCJPcGVuQVBJMzFFeHRlbnNpb25zIiksZmU9dSgiSlNPTlNjaGVtYTIwMjAxMlBhdGhDb250ZXh0IikoKSx5ZT11KCJKU09OU2NoZW1hMjAyMDEyTGV2ZWxDb250ZXh0IikoKSxiZT0oMCxSZS51c2VDYWxsYmFjaykoKCgpPT57VT96KCk6VigpfSksW1UsVix6XSksU2U9KDAsUmUudXNlQ2FsbGJhY2spKCgocyxvKT0+e28/Vih7ZGVlcDohMH0pOnooe2RlZXA6ITB9KX0pLFtWLHpdKTtyZXR1cm4gMD09PU9iamVjdC5rZXlzKGkpLmxlbmd0aD9udWxsOlJlLmNyZWF0ZUVsZW1lbnQoZmUuUHJvdmlkZXIse3ZhbHVlOiR9LFJlLmNyZWF0ZUVsZW1lbnQoeWUuUHJvdmlkZXIse3ZhbHVlOlp9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0tZXh0ZXJuYWxEb2NzIiwiZGF0YS1qc29uLXNjaGVtYS1sZXZlbCI6WX0saWU/UmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoYWUse2V4cGFuZGVkOlUsb25DaGFuZ2U6YmV9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXNlY29uZGFyeSJ9LCJFeHRlcm5hbCBkb2N1bWVudGF0aW9uIikpLFJlLmNyZWF0ZUVsZW1lbnQoY2Use2V4cGFuZGVkOlUsb25DbGljazpTZX0pKTpSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1zZWNvbmRhcnkifSwiRXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIpLFJlLmNyZWF0ZUVsZW1lbnQoInN0cm9uZyIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlIGpzb24tc2NoZW1hLTIwMjAtMTJfX2F0dHJpYnV0ZS0tcHJpbWFyeSJ9LCJvYmplY3QiKSxSZS5jcmVhdGVFbGVtZW50KCJ1bCIse2NsYXNzTmFtZTpKbigpKCJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX2NoaWxkcmVuIix7Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fY2hpbGRyZW4tLWNvbGxhcHNlZCI6IVV9KX0sVSYmUmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLGkuZGVzY3JpcHRpb24mJlJlLmNyZWF0ZUVsZW1lbnQoImxpIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLXByb3BlcnR5In0sUmUuY3JlYXRlRWxlbWVudChsZSx7c2NoZW1hOmksZ2V0U3lzdGVtOm99KSksaS51cmwmJlJlLmNyZWF0ZUVsZW1lbnQoImxpIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLXByb3BlcnR5In0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIn0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZS0tc2Vjb25kYXJ5In0sInVybCIpLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fdmFsdWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX192YWx1ZS0tc2Vjb25kYXJ5In0sUmUuY3JlYXRlRWxlbWVudChwZSx7dGFyZ2V0OiJfYmxhbmsiLGhyZWY6c2FuaXRpemVVcmwoaS51cmwpfSxpLnVybCkpKSkpLGVlLmxlbmd0aD4wJiZSZS5jcmVhdGVFbGVtZW50KGRlLHtvcGVuQVBJU3BlY09iajppLG9wZW5BUElFeHRlbnNpb25zOmVlLGdldFN5c3RlbTpvfSkpKSkpfSxrZXl3b3Jkc19EZXNjcmlwdGlvbj0oe3NjaGVtYTpzLGdldFN5c3RlbTpvfSk9PntpZighcz8uZGVzY3JpcHRpb24pcmV0dXJuIG51bGw7Y29uc3R7Z2V0Q29tcG9uZW50Oml9PW8oKSxhPWkoIk1hcmtkb3duIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0tZGVzY3JpcHRpb24ifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItY29yZS1rZXl3b3JkX192YWx1ZSBqc29uLXNjaGVtYS0yMDIwLTEyLWNvcmUta2V5d29yZF9fdmFsdWUtLXNlY29uZGFyeSJ9LFJlLmNyZWF0ZUVsZW1lbnQoYSx7c291cmNlOnMuZGVzY3JpcHRpb259KSkpfSxKST1jcmVhdGVPbmx5T0FTMzFDb21wb25lbnRXcmFwcGVyKGtleXdvcmRzX0Rlc2NyaXB0aW9uKSxIST1jcmVhdGVPbmx5T0FTMzFDb21wb25lbnRXcmFwcGVyKCgoe3NjaGVtYTpzLGdldFN5c3RlbTpvLG9yaWdpbmFsQ29tcG9uZW50Oml9KT0+e2NvbnN0e2dldENvbXBvbmVudDphfT1vKCksdT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZERpc2NyaW1pbmF0b3IiKSxfPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkWG1sIiksdz1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZEV4YW1wbGUiKSx4PWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkRXh0ZXJuYWxEb2NzIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoUmUuRnJhZ21lbnQsbnVsbCxSZS5jcmVhdGVFbGVtZW50KGkse3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudCh1LHtzY2hlbWE6cyxnZXRTeXN0ZW06b30pLFJlLmNyZWF0ZUVsZW1lbnQoXyx7c2NoZW1hOnMsZ2V0U3lzdGVtOm99KSxSZS5jcmVhdGVFbGVtZW50KHgse3NjaGVtYTpzLGdldFN5c3RlbTpvfSksUmUuY3JlYXRlRWxlbWVudCh3LHtzY2hlbWE6cyxnZXRTeXN0ZW06b30pKX0pKSxLST1ISSxrZXl3b3Jkc19Qcm9wZXJ0aWVzPSh7c2NoZW1hOnMsZ2V0U3lzdGVtOm99KT0+e2NvbnN0e2ZuOmksZ2V0Q29tcG9uZW50OmF9PW8oKSx7dXNlQ29tcG9uZW50OnUsdXNlUGF0aDpffT1pLmpzb25TY2hlbWEyMDIwMTIse2dldERlcGVuZGVudFJlcXVpcmVkOncsZ2V0UHJvcGVydGllczp4fT1pLmpzb25TY2hlbWEyMDIwMTIudXNlRm4oKSxDPWkuanNvblNjaGVtYTIwMjAxMi51c2VDb25maWcoKSxqPUFycmF5LmlzQXJyYXkocz8ucmVxdWlyZWQpP3MucmVxdWlyZWQ6W10se3BhdGg6TH09XygicHJvcGVydGllcyIpLEI9dSgiSlNPTlNjaGVtYSIpLCQ9YSgiSlNPTlNjaGVtYTIwMjAxMlBhdGhDb250ZXh0IikoKSxVPXgocyxDKTtyZXR1cm4gMD09PU9iamVjdC5rZXlzKFUpLmxlbmd0aD9udWxsOlJlLmNyZWF0ZUVsZW1lbnQoJC5Qcm92aWRlcix7dmFsdWU6TH0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS1wcm9wZXJ0aWVzIn0sUmUuY3JlYXRlRWxlbWVudCgidWwiLG51bGwsT2JqZWN0LmVudHJpZXMoVSkubWFwKCgoW28saV0pPT57Y29uc3QgYT1qLmluY2x1ZGVzKG8pLHU9dyhvLHMpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJsaSIse2tleTpvLGNsYXNzTmFtZTpKbigpKCJqc29uLXNjaGVtYS0yMDIwLTEyLXByb3BlcnR5Iix7Impzb24tc2NoZW1hLTIwMjAtMTItcHJvcGVydHktLXJlcXVpcmVkIjphfSl9LFJlLmNyZWF0ZUVsZW1lbnQoQix7bmFtZTpvLHNjaGVtYTppLGRlcGVuZGVudFJlcXVpcmVkOnV9KSl9KSkpKSl9LEdJPWNyZWF0ZU9ubHlPQVMzMUNvbXBvbmVudFdyYXBwZXIoa2V5d29yZHNfUHJvcGVydGllcyk7Y29uc3QgWUk9ZnVuY3Rpb24gb2FzMzFfYWZ0ZXJfbG9hZF9hZnRlckxvYWQoe2ZuOnMsZ2V0U3lzdGVtOm99KXtpZihzLmpzb25TY2hlbWEyMDIwMTIpe2NvbnN0IGk9KChzLG8pPT57Y29uc3R7Zm46aX09bygpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBzKXJldHVybiBudWxsO2NvbnN0e2hhc0tleXdvcmQ6YX09aS5qc29uU2NoZW1hMjAyMDEyO3JldHVybiBvPT5zKG8pfHxhKG8sImV4YW1wbGUiKXx8bz8ueG1sfHxvPy5kaXNjcmltaW5hdG9yfHxvPy5leHRlcm5hbERvY3N9KShzLmpzb25TY2hlbWEyMDIwMTIuaXNFeHBhbmRhYmxlLG8pO09iamVjdC5hc3NpZ24odGhpcy5mbi5qc29uU2NoZW1hMjAyMDEyLHtpc0V4cGFuZGFibGU6aSxnZXRQcm9wZXJ0aWVzfSl9aWYoImZ1bmN0aW9uIj09dHlwZW9mIHMuc2FtcGxlRnJvbVNjaGVtYSYmcy5qc29uU2NoZW1hMjAyMDEyKXtjb25zdCBpPXdyYXBPQVMzMUZuKHtzYW1wbGVGcm9tU2NoZW1hOnMuanNvblNjaGVtYTIwMjAxMi5zYW1wbGVGcm9tU2NoZW1hLHNhbXBsZUZyb21TY2hlbWFHZW5lcmljOnMuanNvblNjaGVtYTIwMjAxMi5zYW1wbGVGcm9tU2NoZW1hR2VuZXJpYyxjcmVhdGVYTUxFeGFtcGxlOnMuanNvblNjaGVtYTIwMjAxMi5jcmVhdGVYTUxFeGFtcGxlLG1lbW9pemVkU2FtcGxlRnJvbVNjaGVtYTpzLmpzb25TY2hlbWEyMDIwMTIubWVtb2l6ZWRTYW1wbGVGcm9tU2NoZW1hLG1lbW9pemVkQ3JlYXRlWE1MRXhhbXBsZTpzLmpzb25TY2hlbWEyMDIwMTIubWVtb2l6ZWRDcmVhdGVYTUxFeGFtcGxlLGdldEpzb25TYW1wbGVTY2hlbWE6cy5qc29uU2NoZW1hMjAyMDEyLmdldEpzb25TYW1wbGVTY2hlbWEsZ2V0WWFtbFNhbXBsZVNjaGVtYTpzLmpzb25TY2hlbWEyMDIwMTIuZ2V0WWFtbFNhbXBsZVNjaGVtYSxnZXRYbWxTYW1wbGVTY2hlbWE6cy5qc29uU2NoZW1hMjAyMDEyLmdldFhtbFNhbXBsZVNjaGVtYSxnZXRTYW1wbGVTY2hlbWE6cy5qc29uU2NoZW1hMjAyMDEyLmdldFNhbXBsZVNjaGVtYSxtZXJnZUpzb25TY2hlbWE6cy5qc29uU2NoZW1hMjAyMDEyLm1lcmdlSnNvblNjaGVtYSxnZXRTY2hlbWFPYmplY3RUeXBlTGFiZWw6bz0+cy5qc29uU2NoZW1hMjAyMDEyLmdldFR5cGUoaW1tdXRhYmxlVG9KUyhvKSksZ2V0U2NoZW1hT2JqZWN0VHlwZTpvPT5zLmpzb25TY2hlbWEyMDIwMTIuZm9sZFR5cGUoaW1tdXRhYmxlVG9KUyhvKT8udHlwZSl9LG8oKSk7T2JqZWN0LmFzc2lnbih0aGlzLmZuLGkpfWNvbnN0IGk9KHM9PihvLGk9bnVsbCk9Pntjb25zdHtmbjphfT1zKCk7aWYoYS5pc0ZpbGVVcGxvYWRJbnRlbmRlZE9BUzMwKG8saSkpcmV0dXJuITA7Y29uc3QgdT16ZS5NYXAuaXNNYXAobyk7aWYoIXUmJiFhcygpKG8pKXJldHVybiExO2NvbnN0IF89dT9vLmdldCgiY29udGVudE1lZGlhVHlwZSIpOm8uY29udGVudE1lZGlhVHlwZSx3PXU/by5nZXQoImNvbnRlbnRFbmNvZGluZyIpOm8uY29udGVudEVuY29kaW5nO3JldHVybiJzdHJpbmciPT10eXBlb2YgXyYmIiIhPT1ffHwic3RyaW5nIj09dHlwZW9mIHcmJiIiIT09d30pKG8pLHtpc0ZpbGVVcGxvYWRJbnRlbmRlZDphfT13cmFwT0FTMzFGbih7aXNGaWxlVXBsb2FkSW50ZW5kZWQ6aX0sbygpKTtpZih0aGlzLmZuLmlzRmlsZVVwbG9hZEludGVuZGVkPWEsdGhpcy5mbi5pc0ZpbGVVcGxvYWRJbnRlbmRlZE9BUzMxPWkscy5qc29uU2NoZW1hMjAyMDEyKXtjb25zdHtoYXNTY2hlbWFUeXBlOml9PXdyYXBPQVMzMUZuKHtoYXNTY2hlbWFUeXBlOnMuanNvblNjaGVtYTIwMjAxMi5oYXNTY2hlbWFUeXBlfSxvKCkpO3RoaXMuZm4uaGFzU2NoZW1hVHlwZT1pfX0sb2FzMzE9KHtmbjpzfSk9Pntjb25zdCBvPXMuY3JlYXRlU3lzdGVtU2VsZWN0b3J8fGZuX2NyZWF0ZVN5c3RlbVNlbGVjdG9yLGk9cy5jcmVhdGVPbmx5T0FTMzFTZWxlY3Rvcnx8Zm5fY3JlYXRlT25seU9BUzMxU2VsZWN0b3I7cmV0dXJue2FmdGVyTG9hZDpZSSxmbjp7aXNPQVMzMSxjcmVhdGVTeXN0ZW1TZWxlY3Rvcjpmbl9jcmVhdGVTeXN0ZW1TZWxlY3RvcixjcmVhdGVPbmx5T0FTMzFTZWxlY3Rvcjpmbl9jcmVhdGVPbmx5T0FTMzFTZWxlY3Rvcn0sY29tcG9uZW50czp7V2ViaG9va3M6d2ViaG9va3MsSnNvblNjaGVtYURpYWxlY3Q6anNvbl9zY2hlbWFfZGlhbGVjdCxNdXR1YWxUTFNBdXRoOm11dHVhbF90bHNfYXV0aCxPQVMzMUluZm86b2FzMzFfY29tcG9uZW50c19pbmZvLE9BUzMxTGljZW5zZTpvYXMzMV9jb21wb25lbnRzX2xpY2Vuc2UsT0FTMzFDb250YWN0Om9hczMxX2NvbXBvbmVudHNfY29udGFjdCxPQVMzMVZlcnNpb25QcmFnbWFGaWx0ZXI6dmVyc2lvbl9wcmFnbWFfZmlsdGVyLE9BUzMxTW9kZWw6d0ksT0FTMzFNb2RlbHM6bW9kZWxzLE9BUzMxQXV0aHM6eEksSlNPTlNjaGVtYTIwMjAxMktleXdvcmRFeGFtcGxlOmtleXdvcmRzX0V4YW1wbGUsSlNPTlNjaGVtYTIwMjAxMktleXdvcmRYbWw6a2V5d29yZHNfWG1sLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkRGlzY3JpbWluYXRvcjprZXl3b3Jkc19EaXNjcmltaW5hdG9yX0Rpc2NyaW1pbmF0b3IsSlNPTlNjaGVtYTIwMjAxMktleXdvcmRFeHRlcm5hbERvY3M6a2V5d29yZHNfRXh0ZXJuYWxEb2NzLE9wZW5BUEkzMUV4dGVuc2lvbnM6a2V5d29yZHNfT3BlbkFQSUV4dGVuc2lvbnN9LHdyYXBDb21wb25lbnRzOntJbmZvQ29udGFpbmVyOkFJLExpY2Vuc2U6a0ksQ29udGFjdDpPSSxWZXJzaW9uUHJhZ21hRmlsdGVyOndyYXBfY29tcG9uZW50c192ZXJzaW9uX3ByYWdtYV9maWx0ZXIsTW9kZWw6akksTW9kZWxzOklJLEF1dGhJdGVtOk5JLGF1dGhzOk1JLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkRGVzY3JpcHRpb246SkksSlNPTlNjaGVtYTIwMjAxMktleXdvcmRFeGFtcGxlczpLSSxKU09OU2NoZW1hMjAyMDEyS2V5d29yZFByb3BlcnRpZXM6R0l9LHN0YXRlUGx1Z2luczp7YXV0aDp7d3JhcFNlbGVjdG9yczp7ZGVmaW5pdGlvbnNUb0F1dGhvcml6ZTp6SX19LHNwZWM6e3NlbGVjdG9yczp7aXNPQVMzMTpvKERJKSxsaWNlbnNlOnNlbGVjdG9yc19saWNlbnNlLHNlbGVjdExpY2Vuc2VOYW1lRmllbGQsc2VsZWN0TGljZW5zZVVybEZpZWxkLHNlbGVjdExpY2Vuc2VJZGVudGlmaWVyRmllbGQ6aShzZWxlY3RMaWNlbnNlSWRlbnRpZmllckZpZWxkKSxzZWxlY3RMaWNlbnNlVXJsOm8oRkkpLGNvbnRhY3Q6c2VsZWN0b3JzX2NvbnRhY3Qsc2VsZWN0Q29udGFjdE5hbWVGaWVsZCxzZWxlY3RDb250YWN0RW1haWxGaWVsZCxzZWxlY3RDb250YWN0VXJsRmllbGQsc2VsZWN0Q29udGFjdFVybDpvKEJJKSxzZWxlY3RJbmZvVGl0bGVGaWVsZCxzZWxlY3RJbmZvU3VtbWFyeUZpZWxkOmkoc2VsZWN0SW5mb1N1bW1hcnlGaWVsZCksc2VsZWN0SW5mb0Rlc2NyaXB0aW9uRmllbGQsc2VsZWN0SW5mb1Rlcm1zT2ZTZXJ2aWNlRmllbGQsc2VsZWN0SW5mb1Rlcm1zT2ZTZXJ2aWNlVXJsOm8oJEkpLHNlbGVjdEV4dGVybmFsRG9jc0Rlc2NyaXB0aW9uRmllbGQsc2VsZWN0RXh0ZXJuYWxEb2NzVXJsRmllbGQsc2VsZWN0RXh0ZXJuYWxEb2NzVXJsOm8ocUkpLHdlYmhvb2tzOmkoc2VsZWN0b3JzX3dlYmhvb2tzKSxzZWxlY3RXZWJob29rc09wZXJhdGlvbnM6aShvKExJKSksc2VsZWN0SnNvblNjaGVtYURpYWxlY3RGaWVsZCxzZWxlY3RKc29uU2NoZW1hRGlhbGVjdERlZmF1bHQsc2VsZWN0U2NoZW1hczpvKFVJKX0sd3JhcFNlbGVjdG9yczp7aXNPQVMzOndyYXBfc2VsZWN0b3JzX2lzT0FTMyxzZWxlY3RMaWNlbnNlVXJsOlZJfX0sb2FzMzE6e3NlbGVjdG9yczp7c2VsZWN0TGljZW5zZVVybDppKG8oV0kpKX19fX19LGNvbXBvbmVudHNfdmVyc2lvbl9wcmFnbWFfZmlsdGVyPSh7YnlwYXNzOnMsaXNTd2FnZ2VyMjpvLGlzT0FTMzppLGlzT0FTMzE6YSxpc09BUzMyOnUsYWxzb1Nob3c6XyxjaGlsZHJlbjp3fSk9PnM/UmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLHcpOm8mJihpfHxhfHx1KT9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InZlcnNpb24tcHJhZ21hIn0sXyxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InZlcnNpb24tcHJhZ21hX19tZXNzYWdlIHZlcnNpb24tcHJhZ21hX19tZXNzYWdlLS1hbWJpZ3VvdXMifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsUmUuY3JlYXRlRWxlbWVudCgiaDMiLG51bGwsIlVuYWJsZSB0byByZW5kZXIgdGhpcyBkZWZpbml0aW9uIiksUmUuY3JlYXRlRWxlbWVudCgicCIsbnVsbCxSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJzd2FnZ2VyIiksIiBhbmQgIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJvcGVuYXBpIiksIiBmaWVsZHMgY2Fubm90IGJlIHByZXNlbnQgaW4gdGhlIHNhbWUgU3dhZ2dlciBvciBPcGVuQVBJIGRlZmluaXRpb24uIFBsZWFzZSByZW1vdmUgb25lIG9mIHRoZSBmaWVsZHMuIiksUmUuY3JlYXRlRWxlbWVudCgicCIsbnVsbCwiU3VwcG9ydGVkIHZlcnNpb24gZmllbGRzIGFyZSAiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsJ3N3YWdnZXI6ICIyLjAiJyksIiAiLCJhbmQgIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJvcGVuYXBpOiAzLjAueCIpLCIsICIsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaTogMy4xLngiKSwiLCBvciIsIiAiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsIm9wZW5hcGk6IDMuMi54IiksIiAoZm9yIGV4YW1wbGUsIiwiICIsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaTogMy4yLjAiKSwiKS4iKSkpKTpvfHxpfHxhfHx1P1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCx3KTpSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InZlcnNpb24tcHJhZ21hIn0sXyxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InZlcnNpb24tcHJhZ21hX19tZXNzYWdlIHZlcnNpb24tcHJhZ21hX19tZXNzYWdlLS1taXNzaW5nIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLFJlLmNyZWF0ZUVsZW1lbnQoImgzIixudWxsLCJVbmFibGUgdG8gcmVuZGVyIHRoaXMgZGVmaW5pdGlvbiIpLFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIlRoZSBwcm92aWRlZCBkZWZpbml0aW9uIGRvZXMgbm90IHNwZWNpZnkgYSB2YWxpZCB2ZXJzaW9uIGZpZWxkLiIpLFJlLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIlBsZWFzZSBpbmRpY2F0ZSBhIHZhbGlkIFN3YWdnZXIgb3IgT3BlbkFQSSB2ZXJzaW9uIGZpZWxkLiBTdXBwb3J0ZWQgdmVyc2lvbiBmaWVsZHMgYXJlICIsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwnc3dhZ2dlcjogIjIuMCInKSwiICIsImFuZCAiLFJlLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsIm9wZW5hcGk6IDMuMC54IiksIiwgIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJvcGVuYXBpOiAzLjEueCIpLCIsIG9yIiwiICIsUmUuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaTogMy4yLngiKSwiIChmb3IgZXhhbXBsZSwiLCIgIixSZS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJvcGVuYXBpOiAzLjIuMCIpLCIpLiIpKSkpLGlzT0FTMzI9cz0+e2NvbnN0IG89cy5nZXQoIm9wZW5hcGkiKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJi9eM1wuMlwuKD86WzEtOV1cZCp8MCkkLy50ZXN0KG8pfSxjcmVhdGVPbmx5T0FTMzJTZWxlY3Rvcj1zPT4obywuLi5pKT0+YT0+e2lmKGEuZ2V0U3lzdGVtKCkuc3BlY1NlbGVjdG9ycy5pc09BUzMyKCkpe2NvbnN0IHU9cyhvLC4uLmkpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB1P3UoYSk6dX1yZXR1cm4gbnVsbH0sb2FzMzJfZm5fY3JlYXRlU3lzdGVtU2VsZWN0b3I9cz0+KG8sLi4uaSk9PmE9Pntjb25zdCB1PXMobyxhLC4uLmkpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB1P3UoYSk6dX0sY3JlYXRlT25seU9BUzMyQ29tcG9uZW50V3JhcHBlcj1zPT4obyxpKT0+YT0+aS5zcGVjU2VsZWN0b3JzLmlzT0FTMzIoKT9SZS5jcmVhdGVFbGVtZW50KHMsTW4oKSh7fSxhLHtvcmlnaW5hbENvbXBvbmVudDpvLGdldFN5c3RlbTppLmdldFN5c3RlbX0pKTpSZS5jcmVhdGVFbGVtZW50KG8sYSksd3JhcE9BUzMyRm49KHMsbyk9Pntjb25zdHtmbjppLHNwZWNTZWxlY3RvcnM6YX09bztyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHMpLm1hcCgoKFtzLG9dKT0+e2NvbnN0IHU9aVtzXTtyZXR1cm5bcywoLi4ucyk9PmEuaXNPQVMzMigpP28oLi4ucyk6ImZ1bmN0aW9uIj09dHlwZW9mIHU/dSguLi5zKTp2b2lkIDBdfSkpKX0sWEk9Y3JlYXRlT25seU9BUzMyQ29tcG9uZW50V3JhcHBlcigocz0+e2NvbnN0e2dldFN5c3RlbTpvfT1zLGk9bygpLmdldENvbXBvbmVudCgiT0FTMzFDb250YWN0IiwhMCk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoaSxzKX0pKSxRST1jcmVhdGVPbmx5T0FTMzJDb21wb25lbnRXcmFwcGVyKCgoe2dldFN5c3RlbTpzfSk9Pntjb25zdCBvPXMoKS5nZXRDb21wb25lbnQoIk9BUzMxSW5mbyIsITApO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KG8sbnVsbCl9KSksWkk9Y3JlYXRlT25seU9BUzMyQ29tcG9uZW50V3JhcHBlcigocz0+e2NvbnN0e2dldFN5c3RlbTpvfT1zLGk9bygpLmdldENvbXBvbmVudCgiT0FTMzFMaWNlbnNlIiwhMCk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoaSxzKX0pKSxmbl9tYWtlR2V0U2NoZW1hS2V5d29yZHM9cz0+e2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBzKXJldHVybiBudWxsO2NvbnN0IG89cygpO3JldHVybigpPT5bLi4ubywiZGlzY3JpbWluYXRvciIsInhtbCIsImV4dGVybmFsRG9jcyIsImV4YW1wbGUiLCIkJHJlZiJdfSxlVD1jcmVhdGVPbmx5T0FTMzJDb21wb25lbnRXcmFwcGVyKCgoe2dldFN5c3RlbTpzLC4uLm99KT0+e2NvbnN0IGk9cygpLHtnZXRDb21wb25lbnQ6YSxmbjp1LGdldENvbmZpZ3M6X309aSx3PV8oKSx4PWEoIk9BUzMxTW9kZWwiKSxDPWEoIndpdGhKU09OU2NoZW1hMjAyMDEyU3lzdGVtQ29udGV4dCIpO3JldHVybiBlVC5Nb2RlbFdpdGhKU09OU2NoZW1hQ29udGV4dD8/PUMoeCx7Y29uZmlnOntkZWZhdWx0JHNjaGVtYToiaHR0cHM6Ly9zcGVjLm9wZW5hcGlzLm9yZy9vYXMvMy4yL3NjaGVtYS8yMDI1LTA5LTE3IixkZWZhdWx0RXhwYW5kZWRMZXZlbHM6dy5kZWZhdWx0TW9kZWxFeHBhbmREZXB0aCxpbmNsdWRlUmVhZE9ubHk6by5pbmNsdWRlUmVhZE9ubHksaW5jbHVkZVdyaXRlT25seTpvLmluY2x1ZGVXcml0ZU9ubHl9LGZuOntnZXRQcm9wZXJ0aWVzOnUuanNvblNjaGVtYTIwMjAxMi5nZXRQcm9wZXJ0aWVzLGlzRXhwYW5kYWJsZTp1Lmpzb25TY2hlbWEyMDIwMTIuaXNFeHBhbmRhYmxlLGdldFNjaGVtYUtleXdvcmRzOmZuX21ha2VHZXRTY2hlbWFLZXl3b3Jkcyh1Lmpzb25TY2hlbWEyMDIwMTIuZ2V0U2NoZW1hS2V5d29yZHMpfX0pLFJlLmNyZWF0ZUVsZW1lbnQoZVQuTW9kZWxXaXRoSlNPTlNjaGVtYUNvbnRleHQsbyl9KSksdFQ9ZVQsclQ9Y3JlYXRlT25seU9BUzMyQ29tcG9uZW50V3JhcHBlcigoKHtnZXRTeXN0ZW06c30pPT57Y29uc3R7Z2V0Q29tcG9uZW50Om8sZm46aSxnZXRDb25maWdzOmF9PXMoKSx1PWEoKTtpZihyVC5Nb2RlbHNXaXRoSlNPTlNjaGVtYUNvbnRleHQpcmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoclQuTW9kZWxzV2l0aEpTT05TY2hlbWFDb250ZXh0LG51bGwpO2NvbnN0IF89bygiT0FTMzFNb2RlbHMiLCEwKSx3PW8oIndpdGhKU09OU2NoZW1hMjAyMDEyU3lzdGVtQ29udGV4dCIpO3JldHVybiByVC5Nb2RlbHNXaXRoSlNPTlNjaGVtYUNvbnRleHQ/Pz13KF8se2NvbmZpZzp7ZGVmYXVsdCRzY2hlbWE6Imh0dHBzOi8vc3BlYy5vcGVuYXBpcy5vcmcvb2FzLzMuMi9zY2hlbWEvMjAyNS0wOS0xNyIsZGVmYXVsdEV4cGFuZGVkTGV2ZWxzOnUuZGVmYXVsdE1vZGVsc0V4cGFuZERlcHRoLTEsaW5jbHVkZVJlYWRPbmx5OiEwLGluY2x1ZGVXcml0ZU9ubHk6ITB9LGZuOntnZXRQcm9wZXJ0aWVzOmkuanNvblNjaGVtYTIwMjAxMi5nZXRQcm9wZXJ0aWVzLGlzRXhwYW5kYWJsZTppLmpzb25TY2hlbWEyMDIwMTIuaXNFeHBhbmRhYmxlLGdldFNjaGVtYUtleXdvcmRzOmZuX21ha2VHZXRTY2hlbWFLZXl3b3JkcyhpLmpzb25TY2hlbWEyMDIwMTIuZ2V0U2NoZW1hS2V5d29yZHMpfX0pLFJlLmNyZWF0ZUVsZW1lbnQoclQuTW9kZWxzV2l0aEpTT05TY2hlbWFDb250ZXh0LG51bGwpfSkpO3JULk1vZGVsc1dpdGhKU09OU2NoZW1hQ29udGV4dD1udWxsO2NvbnN0IG5UPXJULHNUPWNyZWF0ZU9ubHlPQVMzMkNvbXBvbmVudFdyYXBwZXIoKHM9Pntjb25zdHtvcmlnaW5hbENvbXBvbmVudDpvfT1zO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KG8se29hc1ZlcnNpb246IjMuMiJ9KX0pKSxvYXMzMl93cmFwX2NvbXBvbmVudHNfdmVyc2lvbl9wcmFnbWFfZmlsdGVyPShzLG8pPT5zPT57Y29uc3QgaT1vLnNwZWNTZWxlY3RvcnMuaXNPQVMzMigpLGE9by5nZXRDb21wb25lbnQoIk9BUzMyVmVyc2lvblByYWdtYUZpbHRlciIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KGEsTW4oKSh7aXNPQVMzMjppfSxzKSl9LGNvbXBvbmVudHNfa2V5d29yZHNfRGVzY3JpcHRpb249KHtzY2hlbWE6cyxnZXRTeXN0ZW06b30pPT57aWYoIXM/LmRlc2NyaXB0aW9uKXJldHVybiBudWxsO2NvbnN0e2dldENvbXBvbmVudDppfT1vKCksYT1pKCJNYXJrZG93biIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLWRlc2NyaXB0aW9uIn0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWNvcmUta2V5d29yZF9fdmFsdWUganNvbi1zY2hlbWEtMjAyMC0xMi1jb3JlLWtleXdvcmRfX3ZhbHVlLS1zZWNvbmRhcnkifSxSZS5jcmVhdGVFbGVtZW50KGEse3NvdXJjZTpzLmRlc2NyaXB0aW9ufSkpKX0sb1Q9Y3JlYXRlT25seU9BUzMyQ29tcG9uZW50V3JhcHBlcihjb21wb25lbnRzX2tleXdvcmRzX0Rlc2NyaXB0aW9uKSxpVD1jcmVhdGVPbmx5T0FTMzJDb21wb25lbnRXcmFwcGVyKCgoe3NjaGVtYTpzLGdldFN5c3RlbTpvLG9yaWdpbmFsQ29tcG9uZW50Oml9KT0+e2NvbnN0e2dldENvbXBvbmVudDphfT1vKCksdT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZERpc2NyaW1pbmF0b3IiKSxfPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkWG1sIiksdz1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZEV4YW1wbGUiKSx4PWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkRXh0ZXJuYWxEb2NzIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoUmUuRnJhZ21lbnQsbnVsbCxSZS5jcmVhdGVFbGVtZW50KGkse3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudCh1LHtzY2hlbWE6cyxnZXRTeXN0ZW06b30pLFJlLmNyZWF0ZUVsZW1lbnQoXyx7c2NoZW1hOnMsZ2V0U3lzdGVtOm99KSxSZS5jcmVhdGVFbGVtZW50KHgse3NjaGVtYTpzLGdldFN5c3RlbTpvfSksUmUuY3JlYXRlRWxlbWVudCh3LHtzY2hlbWE6cyxnZXRTeXN0ZW06b30pKX0pKSxhVD1pVCxjb21wb25lbnRzX2tleXdvcmRzX1Byb3BlcnRpZXM9KHtzY2hlbWE6cyxnZXRTeXN0ZW06b30pPT57Y29uc3R7Zm46aSxnZXRDb21wb25lbnQ6YX09bygpLHt1c2VDb21wb25lbnQ6dSx1c2VQYXRoOl99PWkuanNvblNjaGVtYTIwMjAxMix7Z2V0RGVwZW5kZW50UmVxdWlyZWQ6dyxnZXRQcm9wZXJ0aWVzOnh9PWkuanNvblNjaGVtYTIwMjAxMi51c2VGbigpLEM9aS5qc29uU2NoZW1hMjAyMDEyLnVzZUNvbmZpZygpLGo9QXJyYXkuaXNBcnJheShzPy5yZXF1aXJlZCk/cy5yZXF1aXJlZDpbXSx7cGF0aDpMfT1fKCJwcm9wZXJ0aWVzIiksQj11KCJKU09OU2NoZW1hIiksJD1hKCJKU09OU2NoZW1hMjAyMDEyUGF0aENvbnRleHQiKSgpLFU9eChzLEMpO3JldHVybiAwPT09T2JqZWN0LmtleXMoVSkubGVuZ3RoP251bGw6UmUuY3JlYXRlRWxlbWVudCgkLlByb3ZpZGVyLHt2YWx1ZTpMfSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLXByb3BlcnRpZXMifSxSZS5jcmVhdGVFbGVtZW50KCJ1bCIsbnVsbCxPYmplY3QuZW50cmllcyhVKS5tYXAoKChbbyxpXSk9Pntjb25zdCBhPWouaW5jbHVkZXMobyksdT13KG8scyk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImxpIix7a2V5Om8sY2xhc3NOYW1lOkpuKCkoImpzb24tc2NoZW1hLTIwMjAtMTItcHJvcGVydHkiLHsianNvbi1zY2hlbWEtMjAyMC0xMi1wcm9wZXJ0eS0tcmVxdWlyZWQiOmF9KX0sUmUuY3JlYXRlRWxlbWVudChCLHtuYW1lOm8sc2NoZW1hOmksZGVwZW5kZW50UmVxdWlyZWQ6dX0pKX0pKSkpKX0sY1Q9Y3JlYXRlT25seU9BUzMyQ29tcG9uZW50V3JhcHBlcihjb21wb25lbnRzX2tleXdvcmRzX1Byb3BlcnRpZXMpLGxUPXhzKCkoWyJnZXQiLCJwdXQiLCJwb3N0IiwiZGVsZXRlIiwib3B0aW9ucyIsImhlYWQiLCJwYXRjaCIsInRyYWNlIiwicXVlcnkiXSksc3BlY19leHRlbnNpb25zX3dyYXBfc2VsZWN0b3JzX2lzT0FTMz0ocyxvKT0+KGksLi4uYSk9Pm8uc3BlY1NlbGVjdG9ycy5pc09BUzMyKCl8fHMoLi4uYSksdVQ9KHBUPSgpPT4ocyxvKT0+by5vYXMzMlNlbGVjdG9ycy52YWxpZE9wZXJhdGlvbk1ldGhvZHMoKSwocyxvKT0+KGksLi4uYSk9PntpZihvLmdldFN5c3RlbSgpLnNwZWNTZWxlY3RvcnMuaXNPQVMzMigpKXtjb25zdCB1PXBUKGksLi4uYSk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHU/dShzLG8pOnV9cmV0dXJuIHMoLi4uYSl9KTt2YXIgcFQ7Y29uc3QgaFQ9KDAsemUuTWFwKSgpLHNlbGVjdElzT0FTMzI9KHMsbyk9PigpPT57Y29uc3Qgcz1vLnNwZWNTZWxlY3RvcnMuc3BlY0pzb24oKTtyZXR1cm4gaXNPQVMzMihzKX0sc3BlY19leHRlbnNpb25zX3NlbGVjdG9yc19saWNlbnNlPSgpPT5zPT57Y29uc3Qgbz1zLnNwZWNTZWxlY3RvcnMuaW5mbygpLmdldCgibGljZW5zZSIpO3JldHVybiB6ZS5NYXAuaXNNYXAobyk/bzpoVH0sc2VsZWN0b3JzX3NlbGVjdExpY2Vuc2VOYW1lRmllbGQ9KCk9PnM9PnMuc3BlY1NlbGVjdG9ycy5saWNlbnNlKCkuZ2V0KCJuYW1lIiwiTGljZW5zZSIpLHNlbGVjdG9yc19zZWxlY3RMaWNlbnNlVXJsRmllbGQ9KCk9PnM9PnMuc3BlY1NlbGVjdG9ycy5saWNlbnNlKCkuZ2V0KCJ1cmwiKSxkVD1VdChbKHMsbyk9Pm8uc3BlY1NlbGVjdG9ycy51cmwoKSwocyxvKT0+by5vYXMzU2VsZWN0b3JzLnNlbGVjdGVkU2VydmVyKCksKHMsbyk9Pm8uc3BlY1NlbGVjdG9ycy5zZWxlY3RMaWNlbnNlVXJsRmllbGQoKV0sKChzLG8saSk9PntpZihpKXJldHVybiBzYWZlQnVpbGRVcmwoaSxzLHtzZWxlY3RlZFNlcnZlcjpvfSl9KSksc2VsZWN0b3JzX3NlbGVjdExpY2Vuc2VJZGVudGlmaWVyRmllbGQ9KCk9PnM9PnMuc3BlY1NlbGVjdG9ycy5saWNlbnNlKCkuZ2V0KCJpZGVudGlmaWVyIiksc3BlY19leHRlbnNpb25zX3NlbGVjdG9yc19jb250YWN0PSgpPT5zPT57Y29uc3Qgbz1zLnNwZWNTZWxlY3RvcnMuaW5mbygpLmdldCgiY29udGFjdCIpO3JldHVybiB6ZS5NYXAuaXNNYXAobyk/bzpoVH0sc2VsZWN0b3JzX3NlbGVjdENvbnRhY3ROYW1lRmllbGQ9KCk9PnM9PnMuc3BlY1NlbGVjdG9ycy5jb250YWN0KCkuZ2V0KCJuYW1lIiwidGhlIGRldmVsb3BlciIpLHNlbGVjdG9yc19zZWxlY3RDb250YWN0RW1haWxGaWVsZD0oKT0+cz0+cy5zcGVjU2VsZWN0b3JzLmNvbnRhY3QoKS5nZXQoImVtYWlsIiksc2VsZWN0b3JzX3NlbGVjdENvbnRhY3RVcmxGaWVsZD0oKT0+cz0+cy5zcGVjU2VsZWN0b3JzLmNvbnRhY3QoKS5nZXQoInVybCIpLGZUPVV0KFsocyxvKT0+by5zcGVjU2VsZWN0b3JzLnVybCgpLChzLG8pPT5vLm9hczNTZWxlY3RvcnMuc2VsZWN0ZWRTZXJ2ZXIoKSwocyxvKT0+by5zcGVjU2VsZWN0b3JzLnNlbGVjdENvbnRhY3RVcmxGaWVsZCgpXSwoKHMsbyxpKT0+e2lmKGkpcmV0dXJuIHNhZmVCdWlsZFVybChpLHMse3NlbGVjdGVkU2VydmVyOm99KX0pKSxzZWxlY3RvcnNfc2VsZWN0SW5mb1N1bW1hcnlGaWVsZD0oKT0+cz0+cy5zcGVjU2VsZWN0b3JzLmluZm8oKS5nZXQoInN1bW1hcnkiKTtjb25zdCBtVD1mdW5jdGlvbiBvYXMzMl9hZnRlcl9sb2FkX2FmdGVyTG9hZCh7Zm46cyxnZXRTeXN0ZW06b30pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBzLnNhbXBsZUZyb21TY2hlbWEmJnMuanNvblNjaGVtYTIwMjAxMil7Y29uc3QgaT13cmFwT0FTMzJGbih7c2FtcGxlRnJvbVNjaGVtYTpzLmpzb25TY2hlbWEyMDIwMTIuc2FtcGxlRnJvbVNjaGVtYSxzYW1wbGVGcm9tU2NoZW1hR2VuZXJpYzpzLmpzb25TY2hlbWEyMDIwMTIuc2FtcGxlRnJvbVNjaGVtYUdlbmVyaWMsY3JlYXRlWE1MRXhhbXBsZTpzLmpzb25TY2hlbWEyMDIwMTIuY3JlYXRlWE1MRXhhbXBsZSxtZW1vaXplZFNhbXBsZUZyb21TY2hlbWE6cy5qc29uU2NoZW1hMjAyMDEyLm1lbW9pemVkU2FtcGxlRnJvbVNjaGVtYSxtZW1vaXplZENyZWF0ZVhNTEV4YW1wbGU6cy5qc29uU2NoZW1hMjAyMDEyLm1lbW9pemVkQ3JlYXRlWE1MRXhhbXBsZSxnZXRKc29uU2FtcGxlU2NoZW1hOnMuanNvblNjaGVtYTIwMjAxMi5nZXRKc29uU2FtcGxlU2NoZW1hLGdldFlhbWxTYW1wbGVTY2hlbWE6cy5qc29uU2NoZW1hMjAyMDEyLmdldFlhbWxTYW1wbGVTY2hlbWEsZ2V0WG1sU2FtcGxlU2NoZW1hOnMuanNvblNjaGVtYTIwMjAxMi5nZXRYbWxTYW1wbGVTY2hlbWEsZ2V0U2FtcGxlU2NoZW1hOnMuanNvblNjaGVtYTIwMjAxMi5nZXRTYW1wbGVTY2hlbWEsbWVyZ2VKc29uU2NoZW1hOnMuanNvblNjaGVtYTIwMjAxMi5tZXJnZUpzb25TY2hlbWEsZ2V0U2NoZW1hT2JqZWN0VHlwZUxhYmVsOm89PnMuanNvblNjaGVtYTIwMjAxMi5nZXRUeXBlKGltbXV0YWJsZVRvSlMobykpLGdldFNjaGVtYU9iamVjdFR5cGU6bz0+cy5qc29uU2NoZW1hMjAyMDEyLmZvbGRUeXBlKGltbXV0YWJsZVRvSlMobyk/LnR5cGUpfSxvKCkpO09iamVjdC5hc3NpZ24odGhpcy5mbixpKX1jb25zdCBpPShzPT4obyxpPW51bGwpPT57Y29uc3R7Zm46YX09cygpO2lmKGEuaXNGaWxlVXBsb2FkSW50ZW5kZWRPQVMzMChvLGkpKXJldHVybiEwO2NvbnN0IHU9emUuTWFwLmlzTWFwKG8pO2lmKCF1JiYhYXMoKShvKSlyZXR1cm4hMTtjb25zdCBfPXU/by5nZXQoImNvbnRlbnRNZWRpYVR5cGUiKTpvLmNvbnRlbnRNZWRpYVR5cGUsdz11P28uZ2V0KCJjb250ZW50RW5jb2RpbmciKTpvLmNvbnRlbnRFbmNvZGluZztyZXR1cm4ic3RyaW5nIj09dHlwZW9mIF8mJiIiIT09X3x8InN0cmluZyI9PXR5cGVvZiB3JiYiIiE9PXd9KShvKSx7aXNGaWxlVXBsb2FkSW50ZW5kZWQ6YX09d3JhcE9BUzMyRm4oe2lzRmlsZVVwbG9hZEludGVuZGVkOml9LG8oKSk7aWYodGhpcy5mbi5pc0ZpbGVVcGxvYWRJbnRlbmRlZD1hLHRoaXMuZm4uaXNGaWxlVXBsb2FkSW50ZW5kZWRPQVMzMj1pLHMuanNvblNjaGVtYTIwMjAxMil7Y29uc3R7aGFzU2NoZW1hVHlwZTppfT13cmFwT0FTMzJGbih7aGFzU2NoZW1hVHlwZTpzLmpzb25TY2hlbWEyMDIwMTIuaGFzU2NoZW1hVHlwZX0sbygpKTt0aGlzLmZuLmhhc1NjaGVtYVR5cGU9aX19LG9hczMyPSh7Zm46c30pPT57Y29uc3Qgbz1zLmNyZWF0ZVN5c3RlbVNlbGVjdG9yfHxvYXMzMl9mbl9jcmVhdGVTeXN0ZW1TZWxlY3RvcjtyZXR1cm57YWZ0ZXJMb2FkOm1ULGZuOntpc09BUzMyLGNyZWF0ZVN5c3RlbVNlbGVjdG9yOm9hczMyX2ZuX2NyZWF0ZVN5c3RlbVNlbGVjdG9yLGNyZWF0ZU9ubHlPQVMzMlNlbGVjdG9yfSxjb21wb25lbnRzOntPQVMzMlZlcnNpb25QcmFnbWFGaWx0ZXI6Y29tcG9uZW50c192ZXJzaW9uX3ByYWdtYV9maWx0ZXJ9LHdyYXBDb21wb25lbnRzOntDb250YWN0OlhJLEluZm9Db250YWluZXI6UUksTGljZW5zZTpaSSxNb2RlbDp0VCxNb2RlbHM6blQsT3BlbkFQSVZlcnNpb246c1QsVmVyc2lvblByYWdtYUZpbHRlcjpvYXMzMl93cmFwX2NvbXBvbmVudHNfdmVyc2lvbl9wcmFnbWFfZmlsdGVyLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkRGVzY3JpcHRpb246b1QsSlNPTlNjaGVtYTIwMjAxMktleXdvcmRFeGFtcGxlczphVCxKU09OU2NoZW1hMjAyMDEyS2V5d29yZFByb3BlcnRpZXM6Y1R9LHN0YXRlUGx1Z2luczp7c3BlYzp7c2VsZWN0b3JzOntpc09BUzMyOm8oc2VsZWN0SXNPQVMzMiksc2VsZWN0SW5mb1N1bW1hcnlGaWVsZDpzZWxlY3RvcnNfc2VsZWN0SW5mb1N1bW1hcnlGaWVsZCxsaWNlbnNlOnNwZWNfZXh0ZW5zaW9uc19zZWxlY3RvcnNfbGljZW5zZSxzZWxlY3RMaWNlbnNlTmFtZUZpZWxkOnNlbGVjdG9yc19zZWxlY3RMaWNlbnNlTmFtZUZpZWxkLHNlbGVjdExpY2Vuc2VVcmxGaWVsZDpzZWxlY3RvcnNfc2VsZWN0TGljZW5zZVVybEZpZWxkLHNlbGVjdExpY2Vuc2VJZGVudGlmaWVyRmllbGQ6c2VsZWN0b3JzX3NlbGVjdExpY2Vuc2VJZGVudGlmaWVyRmllbGQsc2VsZWN0TGljZW5zZVVybDpvKGRUKSxjb250YWN0OnNwZWNfZXh0ZW5zaW9uc19zZWxlY3RvcnNfY29udGFjdCxzZWxlY3RDb250YWN0TmFtZUZpZWxkOnNlbGVjdG9yc19zZWxlY3RDb250YWN0TmFtZUZpZWxkLHNlbGVjdENvbnRhY3RFbWFpbEZpZWxkOnNlbGVjdG9yc19zZWxlY3RDb250YWN0RW1haWxGaWVsZCxzZWxlY3RDb250YWN0VXJsRmllbGQ6c2VsZWN0b3JzX3NlbGVjdENvbnRhY3RVcmxGaWVsZCxzZWxlY3RDb250YWN0VXJsOm8oZlQpfSx3cmFwU2VsZWN0b3JzOntpc09BUzM6c3BlY19leHRlbnNpb25zX3dyYXBfc2VsZWN0b3JzX2lzT0FTMyx2YWxpZE9wZXJhdGlvbk1ldGhvZHM6dVR9fSxvYXMzMjp7c2VsZWN0b3JzOnt2YWxpZE9wZXJhdGlvbk1ldGhvZHM6bFR9fX19fSxnVD1lcygpLm9iamVjdCx5VD1lcygpLmJvb2wsdlQ9KGVzKCkub25lT2ZUeXBlKFtnVCx5VF0pLCgwLFJlLmNyZWF0ZUNvbnRleHQpKG51bGwpKTt2VC5kaXNwbGF5TmFtZT0iSlNPTlNjaGVtYUNvbnRleHQiO2NvbnN0IGJUPSgwLFJlLmNyZWF0ZUNvbnRleHQpKDApO2JULmRpc3BsYXlOYW1lPSJKU09OU2NoZW1hTGV2ZWxDb250ZXh0Ijtjb25zdCBTVD0oMCxSZS5jcmVhdGVDb250ZXh0KShuZXcgU2V0KSxfVD0oMCxSZS5jcmVhdGVDb250ZXh0KShbXSk7Y2xhc3MgSlNPTlNjaGVtYUlzRXhwYW5kZWRTdGF0ZXtzdGF0aWMgQ29sbGFwc2VkPSJjb2xsYXBzZWQiO3N0YXRpYyBFeHBhbmRlZD0iZXhwYW5kZWQiO3N0YXRpYyBEZWVwbHlFeHBhbmRlZD0iZGVlcGx5LWV4cGFuZGVkIn1jb25zdCB1c2VDb25maWc9KCk9Pntjb25zdHtjb25maWc6c309KDAsUmUudXNlQ29udGV4dCkodlQpO3JldHVybiBzfSx1c2VDb21wb25lbnQ9cz0+e2NvbnN0e2NvbXBvbmVudHM6b309KDAsUmUudXNlQ29udGV4dCkodlQpO3JldHVybiBvW3NdfHxudWxsfSx1c2VGbj0ocz12b2lkIDApPT57Y29uc3R7Zm46b309KDAsUmUudXNlQ29udGV4dCkodlQpO3JldHVybiB2b2lkIDAhPT1zP29bc106b30sdXNlSlNPTlNjaGVtYUNvbnRleHRTdGF0ZT0oKT0+e2NvbnN0WyxzXT0oMCxSZS51c2VTdGF0ZSkobnVsbCkse3N0YXRlOm99PSgwLFJlLnVzZUNvbnRleHQpKHZUKTtyZXR1cm57c3RhdGU6byxzZXRTdGF0ZTppPT57aShvKSxzKHt9KX19fSx1c2VMZXZlbD0oKT0+e2NvbnN0IHM9KDAsUmUudXNlQ29udGV4dCkoYlQpO3JldHVybltzLHMrMV19LHVzZVBhdGg9cz0+e2NvbnN0IG89KDAsUmUudXNlQ29udGV4dCkoX1QpLHtzZXRTdGF0ZTppfT11c2VKU09OU2NoZW1hQ29udGV4dFN0YXRlKCksYT0ic3RyaW5nIj09dHlwZW9mIHM/Wy4uLm8sc106bztyZXR1cm57cGF0aDphLHBhdGhNdXRhdG9yOihzLG89e2RlZXA6ITF9KT0+e2NvbnN0IHU9YS50b1N0cmluZygpLHVwZGF0ZUZuPW89PntvLnBhdGhzW3VdPXMscz09PUpTT05TY2hlbWFJc0V4cGFuZGVkU3RhdGUuQ29sbGFwc2VkJiZPYmplY3Qua2V5cyhvLnBhdGhzKS5mb3JFYWNoKChzPT57cy5zdGFydHNXaXRoKHUpJiZvLnBhdGhzW3NdPT09SlNPTlNjaGVtYUlzRXhwYW5kZWRTdGF0ZS5EZWVwbHlFeHBhbmRlZCYmKG8ucGF0aHNbc109SlNPTlNjaGVtYUlzRXhwYW5kZWRTdGF0ZS5FeHBhbmRlZCl9KSl9LHVwZGF0ZURlZXBGbj1vPT57T2JqZWN0LmtleXMoby5wYXRocykuZm9yRWFjaCgoaT0+e2kuc3RhcnRzV2l0aCh1KSYmKG8ucGF0aHNbaV09cyl9KSl9O28uZGVlcD9pKHVwZGF0ZURlZXBGbik6aSh1cGRhdGVGbil9fX0sdXNlSXNFeHBhbmRlZD1zPT57Y29uc3Rbb109dXNlTGV2ZWwoKSx7ZGVmYXVsdEV4cGFuZGVkTGV2ZWxzOml9PXVzZUNvbmZpZygpLHtwYXRoOmEscGF0aE11dGF0b3I6dX09dXNlUGF0aChzKSx7cGF0aDpffT11c2VQYXRoKCkse3N0YXRlOnd9PXVzZUpTT05TY2hlbWFDb250ZXh0U3RhdGUoKSx4PXcucGF0aHNbYS50b1N0cmluZygpXSxDPXcucGF0aHNbXy50b1N0cmluZygpXT8/dy5wYXRoc1tfLnNsaWNlKDAsLTEpLnRvU3RyaW5nKCldLGo9eD8/KGktbz4wP0pTT05TY2hlbWFJc0V4cGFuZGVkU3RhdGUuRXhwYW5kZWQ6SlNPTlNjaGVtYUlzRXhwYW5kZWRTdGF0ZS5Db2xsYXBzZWQpLEw9aiE9PUpTT05TY2hlbWFJc0V4cGFuZGVkU3RhdGUuQ29sbGFwc2VkOygwLFJlLnVzZUVmZmVjdCkoKCgpPT57dShDPT09SlNPTlNjaGVtYUlzRXhwYW5kZWRTdGF0ZS5EZWVwbHlFeHBhbmRlZD9KU09OU2NoZW1hSXNFeHBhbmRlZFN0YXRlLkRlZXBseUV4cGFuZGVkOmopfSksW0NdKTtyZXR1cm57aXNFeHBhbmRlZDpMLHNldEV4cGFuZGVkOigwLFJlLnVzZUNhbGxiYWNrKSgoKHM9e2RlZXA6ITF9KT0+e3Uocy5kZWVwP0pTT05TY2hlbWFJc0V4cGFuZGVkU3RhdGUuRGVlcGx5RXhwYW5kZWQ6SlNPTlNjaGVtYUlzRXhwYW5kZWRTdGF0ZS5FeHBhbmRlZCl9KSxbXSksc2V0Q29sbGFwc2VkOigwLFJlLnVzZUNhbGxiYWNrKSgoKHM9e2RlZXA6ITF9KT0+e3UoSlNPTlNjaGVtYUlzRXhwYW5kZWRTdGF0ZS5Db2xsYXBzZWQscyl9KSxbXSl9fSx1c2VSZW5kZXJlZFNjaGVtYXM9KHM9dm9pZCAwKT0+e2lmKHZvaWQgMD09PXMpcmV0dXJuKDAsUmUudXNlQ29udGV4dCkoU1QpO2NvbnN0IG89KDAsUmUudXNlQ29udGV4dCkoU1QpO3JldHVybiBuZXcgU2V0KFsuLi5vLHNdKX0sRVQ9KDAsUmUuZm9yd2FyZFJlZikoKCh7c2NoZW1hOnMsbmFtZTpvPSIiLGRlcGVuZGVudFJlcXVpcmVkOmk9W10sb25FeHBhbmQ6YT0oKT0+e30saWRlbnRpZmllcjp1PSIifSxfKT0+e2NvbnN0IHc9dXNlRm4oKSx4PXV8fHM/LiRpZHx8byx7cGF0aDpDfT11c2VQYXRoKHgpLHtpc0V4cGFuZGVkOmosc2V0RXhwYW5kZWQ6TCxzZXRDb2xsYXBzZWQ6Qn09dXNlSXNFeHBhbmRlZCh4KSxbJCxVXT11c2VMZXZlbCgpLFY9KCgpPT57Y29uc3Rbc109dXNlTGV2ZWwoKTtyZXR1cm4gcz4wfSkoKSx6PXcuaXNFeHBhbmRhYmxlKHMpfHxpLmxlbmd0aD4wLFk9KHM9PnVzZVJlbmRlcmVkU2NoZW1hcygpLmhhcyhzKSkocyksWj11c2VSZW5kZXJlZFNjaGVtYXMocyksZWU9dy5zdHJpbmdpZnlDb25zdHJhaW50cyhzKSxpZT11c2VDb21wb25lbnQoIkFjY29yZGlvbiIpLGFlPXVzZUNvbXBvbmVudCgiS2V5d29yZCRzY2hlbWEiKSxjZT11c2VDb21wb25lbnQoIktleXdvcmQkdm9jYWJ1bGFyeSIpLGxlPXVzZUNvbXBvbmVudCgiS2V5d29yZCRpZCIpLHBlPXVzZUNvbXBvbmVudCgiS2V5d29yZCRhbmNob3IiKSxkZT11c2VDb21wb25lbnQoIktleXdvcmQkZHluYW1pY0FuY2hvciIpLGZlPXVzZUNvbXBvbmVudCgiS2V5d29yZCRyZWYiKSx5ZT11c2VDb21wb25lbnQoIktleXdvcmQkZHluYW1pY1JlZiIpLGJlPXVzZUNvbXBvbmVudCgiS2V5d29yZCRkZWZzIiksU2U9dXNlQ29tcG9uZW50KCJLZXl3b3JkJGNvbW1lbnQiKSxfZT11c2VDb21wb25lbnQoIktleXdvcmRBbGxPZiIpLHdlPXVzZUNvbXBvbmVudCgiS2V5d29yZEFueU9mIikseGU9dXNlQ29tcG9uZW50KCJLZXl3b3JkT25lT2YiKSxQZT11c2VDb21wb25lbnQoIktleXdvcmROb3QiKSxUZT11c2VDb21wb25lbnQoIktleXdvcmRJZiIpLCRlPXVzZUNvbXBvbmVudCgiS2V5d29yZFRoZW4iKSxxZT11c2VDb21wb25lbnQoIktleXdvcmRFbHNlIiksemU9dXNlQ29tcG9uZW50KCJLZXl3b3JkRGVwZW5kZW50U2NoZW1hcyIpLFdlPXVzZUNvbXBvbmVudCgiS2V5d29yZFByZWZpeEl0ZW1zIiksSGU9dXNlQ29tcG9uZW50KCJLZXl3b3JkSXRlbXMiKSxZZT11c2VDb21wb25lbnQoIktleXdvcmRDb250YWlucyIpLFhlPXVzZUNvbXBvbmVudCgiS2V5d29yZFByb3BlcnRpZXMiKSxRZT11c2VDb21wb25lbnQoIktleXdvcmRQYXR0ZXJuUHJvcGVydGllcyIpLGV0PXVzZUNvbXBvbmVudCgiS2V5d29yZEFkZGl0aW9uYWxQcm9wZXJ0aWVzIiksdHQ9dXNlQ29tcG9uZW50KCJLZXl3b3JkUHJvcGVydHlOYW1lcyIpLHJ0PXVzZUNvbXBvbmVudCgiS2V5d29yZFVuZXZhbHVhdGVkSXRlbXMiKSxudD11c2VDb21wb25lbnQoIktleXdvcmRVbmV2YWx1YXRlZFByb3BlcnRpZXMiKSxzdD11c2VDb21wb25lbnQoIktleXdvcmRUeXBlIiksb3Q9dXNlQ29tcG9uZW50KCJLZXl3b3JkRW51bSIpLGl0PXVzZUNvbXBvbmVudCgiS2V5d29yZENvbnN0IiksYXQ9dXNlQ29tcG9uZW50KCJLZXl3b3JkQ29uc3RyYWludCIpLGN0PXVzZUNvbXBvbmVudCgiS2V5d29yZERlcGVuZGVudFJlcXVpcmVkIiksbHQ9dXNlQ29tcG9uZW50KCJLZXl3b3JkQ29udGVudFNjaGVtYSIpLHV0PXVzZUNvbXBvbmVudCgiS2V5d29yZFRpdGxlIikscHQ9dXNlQ29tcG9uZW50KCJLZXl3b3JkRGVzY3JpcHRpb24iKSxodD11c2VDb21wb25lbnQoIktleXdvcmREZWZhdWx0IiksZHQ9dXNlQ29tcG9uZW50KCJLZXl3b3JkRGVwcmVjYXRlZCIpLG10PXVzZUNvbXBvbmVudCgiS2V5d29yZFJlYWRPbmx5IiksZ3Q9dXNlQ29tcG9uZW50KCJLZXl3b3JkV3JpdGVPbmx5IikseXQ9dXNlQ29tcG9uZW50KCJLZXl3b3JkRXhhbXBsZXMiKSx2dD11c2VDb21wb25lbnQoIkV4dGVuc2lvbktleXdvcmRzIiksYnQ9dXNlQ29tcG9uZW50KCJFeHBhbmREZWVwQnV0dG9uIiksU3Q9KDAsUmUudXNlQ2FsbGJhY2spKCgocyxvKT0+e28/TCgpOkIoKSxhKHMsbywhMSl9KSxbYSxMLEJdKSxfdD0oMCxSZS51c2VDYWxsYmFjaykoKChzLG8pPT57bz9MKHtkZWVwOiEwfSk6Qih7ZGVlcDohMH0pLGEocyxvLCEwKX0pLFthLEwsQl0pO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KF9ULlByb3ZpZGVyLHt2YWx1ZTpDfSxSZS5jcmVhdGVFbGVtZW50KGJULlByb3ZpZGVyLHt2YWx1ZTpVfSxSZS5jcmVhdGVFbGVtZW50KFNULlByb3ZpZGVyLHt2YWx1ZTpafSxSZS5jcmVhdGVFbGVtZW50KCJhcnRpY2xlIix7cmVmOl8sImRhdGEtanNvbi1zY2hlbWEtbGV2ZWwiOiQsY2xhc3NOYW1lOkpuKCkoImpzb24tc2NoZW1hLTIwMjAtMTIiLHsianNvbi1zY2hlbWEtMjAyMC0xMi0tZW1iZWRkZWQiOlYsImpzb24tc2NoZW1hLTIwMjAtMTItLWNpcmN1bGFyIjpZfSl9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1oZWFkIn0seiYmIVk/UmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLFJlLmNyZWF0ZUVsZW1lbnQoaWUse2V4cGFuZGVkOmosb25DaGFuZ2U6U3R9LFJlLmNyZWF0ZUVsZW1lbnQodXQse3RpdGxlOm8sc2NoZW1hOnN9KSksUmUuY3JlYXRlRWxlbWVudChidCx7ZXhwYW5kZWQ6aixvbkNsaWNrOl90fSkpOlJlLmNyZWF0ZUVsZW1lbnQodXQse3RpdGxlOm8sc2NoZW1hOnN9KSxSZS5jcmVhdGVFbGVtZW50KGR0LHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQobXQse3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudChndCx7c2NoZW1hOnN9KSxSZS5jcmVhdGVFbGVtZW50KHN0LHtzY2hlbWE6cyxpc0NpcmN1bGFyOll9KSxlZS5sZW5ndGg+MCYmZWUubWFwKChzPT5SZS5jcmVhdGVFbGVtZW50KGF0LHtrZXk6YCR7cy5zY29wZX0tJHtzLnZhbHVlfWAsY29uc3RyYWludDpzfSkpKSksUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOkpuKCkoImpzb24tc2NoZW1hLTIwMjAtMTItYm9keSIseyJqc29uLXNjaGVtYS0yMDIwLTEyLWJvZHktLWNvbGxhcHNlZCI6IWp9KX0saiYmUmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLFJlLmNyZWF0ZUVsZW1lbnQocHQse3NjaGVtYTpzfSksIVkmJnomJlJlLmNyZWF0ZUVsZW1lbnQoUmUuRnJhZ21lbnQsbnVsbCxSZS5jcmVhdGVFbGVtZW50KFhlLHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQoUWUse3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudChldCx7c2NoZW1hOnN9KSxSZS5jcmVhdGVFbGVtZW50KG50LHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQodHQse3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudChfZSx7c2NoZW1hOnN9KSxSZS5jcmVhdGVFbGVtZW50KHdlLHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQoeGUse3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudChQZSx7c2NoZW1hOnN9KSxSZS5jcmVhdGVFbGVtZW50KFRlLHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQoJGUse3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudChxZSx7c2NoZW1hOnN9KSxSZS5jcmVhdGVFbGVtZW50KHplLHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQoV2Use3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudChIZSx7c2NoZW1hOnN9KSxSZS5jcmVhdGVFbGVtZW50KHJ0LHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQoWWUse3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudChsdCx7c2NoZW1hOnN9KSksUmUuY3JlYXRlRWxlbWVudChvdCx7c2NoZW1hOnN9KSxSZS5jcmVhdGVFbGVtZW50KGl0LHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQoY3Qse3NjaGVtYTpzLGRlcGVuZGVudFJlcXVpcmVkOml9KSxSZS5jcmVhdGVFbGVtZW50KGh0LHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQoeXQse3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudChhZSx7c2NoZW1hOnN9KSxSZS5jcmVhdGVFbGVtZW50KGNlLHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQobGUse3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudChwZSx7c2NoZW1hOnN9KSxSZS5jcmVhdGVFbGVtZW50KGRlLHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQoZmUse3NjaGVtYTpzfSksIVkmJnomJlJlLmNyZWF0ZUVsZW1lbnQoYmUse3NjaGVtYTpzfSksUmUuY3JlYXRlRWxlbWVudCh5ZSx7c2NoZW1hOnN9KSxSZS5jcmVhdGVFbGVtZW50KFNlLHtzY2hlbWE6c30pLFJlLmNyZWF0ZUVsZW1lbnQodnQse3NjaGVtYTpzfSkpKSkpKSl9KSksd1Q9RVQsa2V5d29yZHNfJHNjaGVtYT0oe3NjaGVtYTpzfSk9PnM/LiRzY2hlbWE/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS0kc2NoZW1hIn0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZS0tc2Vjb25kYXJ5In0sIiRzY2hlbWEiKSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX3ZhbHVlIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fdmFsdWUtLXNlY29uZGFyeSJ9LHMuJHNjaGVtYSkpOm51bGwsJHZvY2FidWxhcnlfJHZvY2FidWxhcnk9KHtzY2hlbWE6c30pPT57Y29uc3Qgbz0iJHZvY2FidWxhcnkiLHtwYXRoOml9PXVzZVBhdGgobykse2lzRXhwYW5kZWQ6YSxzZXRFeHBhbmRlZDp1LHNldENvbGxhcHNlZDpffT11c2VJc0V4cGFuZGVkKG8pLHc9dXNlQ29tcG9uZW50KCJBY2NvcmRpb24iKSx4PSgwLFJlLnVzZUNhbGxiYWNrKSgoKCk9PnthP18oKTp1KCl9KSxbYSx1LF9dKTtyZXR1cm4gcz8uJHZvY2FidWxhcnk/Im9iamVjdCIhPXR5cGVvZiBzLiR2b2NhYnVsYXJ5P251bGw6UmUuY3JlYXRlRWxlbWVudChfVC5Qcm92aWRlcix7dmFsdWU6aX0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS0kdm9jYWJ1bGFyeSJ9LFJlLmNyZWF0ZUVsZW1lbnQodyx7ZXhwYW5kZWQ6YSxvbkNoYW5nZTp4fSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1zZWNvbmRhcnkifSwiJHZvY2FidWxhcnkiKSksUmUuY3JlYXRlRWxlbWVudCgic3Ryb25nIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyX19hdHRyaWJ1dGUganNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlLS1wcmltYXJ5In0sIm9iamVjdCIpLFJlLmNyZWF0ZUVsZW1lbnQoInVsIixudWxsLGEmJk9iamVjdC5lbnRyaWVzKHMuJHZvY2FidWxhcnkpLm1hcCgoKFtzLG9dKT0+UmUuY3JlYXRlRWxlbWVudCgibGkiLHtrZXk6cyxjbGFzc05hbWU6Sm4oKSgianNvbi1zY2hlbWEtMjAyMC0xMi0kdm9jYWJ1bGFyeS11cmkiLHsianNvbi1zY2hlbWEtMjAyMC0xMi0kdm9jYWJ1bGFyeS11cmktLWRpc2FibGVkIjohb30pfSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX3ZhbHVlIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fdmFsdWUtLXNlY29uZGFyeSJ9LHMpKSkpKSkpOm51bGx9LGtleXdvcmRzXyRpZD0oe3NjaGVtYTpzfSk9PnM/LiRpZD9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLSRpZCJ9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXNlY29uZGFyeSJ9LCIkaWQiKSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX3ZhbHVlIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fdmFsdWUtLXNlY29uZGFyeSJ9LHMuJGlkKSk6bnVsbCxrZXl3b3Jkc18kYW5jaG9yPSh7c2NoZW1hOnN9KT0+cz8uJGFuY2hvcj9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLSRhbmNob3IifSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1zZWNvbmRhcnkifSwiJGFuY2hvciIpLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fdmFsdWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX192YWx1ZS0tc2Vjb25kYXJ5In0scy4kYW5jaG9yKSk6bnVsbCxrZXl3b3Jkc18kZHluYW1pY0FuY2hvcj0oe3NjaGVtYTpzfSk9PnM/LiRkeW5hbWljQW5jaG9yP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0tJGR5bmFtaWNBbmNob3IifSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1zZWNvbmRhcnkifSwiJGR5bmFtaWNBbmNob3IiKSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX3ZhbHVlIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fdmFsdWUtLXNlY29uZGFyeSJ9LHMuJGR5bmFtaWNBbmNob3IpKTpudWxsLGtleXdvcmRzXyRyZWY9KHtzY2hlbWE6c30pPT5zPy4kcmVmP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0tJHJlZiJ9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXNlY29uZGFyeSJ9LCIkcmVmIiksUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX192YWx1ZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX3ZhbHVlLS1zZWNvbmRhcnkifSxzLiRyZWYpKTpudWxsLGtleXdvcmRzXyRkeW5hbWljUmVmPSh7c2NoZW1hOnN9KT0+cz8uJGR5bmFtaWNSZWY/UmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS0kZHluYW1pY1JlZiJ9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXNlY29uZGFyeSJ9LCIkZHluYW1pY1JlZiIpLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fdmFsdWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX192YWx1ZS0tc2Vjb25kYXJ5In0scy4kZHluYW1pY1JlZikpOm51bGwsa2V5d29yZHNfJGRlZnM9KHtzY2hlbWE6c30pPT57Y29uc3Qgbz1zPy4kZGVmc3x8e30saT0iJGRlZnMiLHtwYXRoOmF9PXVzZVBhdGgoaSkse2lzRXhwYW5kZWQ6dSxzZXRFeHBhbmRlZDpfLHNldENvbGxhcHNlZDp3fT11c2VJc0V4cGFuZGVkKGkpLFt4LENdPXVzZUxldmVsKCksaj11c2VDb21wb25lbnQoIkFjY29yZGlvbiIpLEw9dXNlQ29tcG9uZW50KCJFeHBhbmREZWVwQnV0dG9uIiksQj11c2VDb21wb25lbnQoIkpTT05TY2hlbWEiKSwkPSgwLFJlLnVzZUNhbGxiYWNrKSgoKCk9Pnt1P3coKTpfKCl9KSxbdSxfLHddKSxVPSgwLFJlLnVzZUNhbGxiYWNrKSgoKHMsbyk9PntvP18oe2RlZXA6ITB9KTp3KHtkZWVwOiEwfSl9KSxbXyx3XSk7cmV0dXJuIDA9PT1PYmplY3Qua2V5cyhvKS5sZW5ndGg/bnVsbDpSZS5jcmVhdGVFbGVtZW50KF9ULlByb3ZpZGVyLHt2YWx1ZTphfSxSZS5jcmVhdGVFbGVtZW50KGJULlByb3ZpZGVyLHt2YWx1ZTpDfSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLSRkZWZzIiwiZGF0YS1qc29uLXNjaGVtYS1sZXZlbCI6eH0sUmUuY3JlYXRlRWxlbWVudChqLHtleHBhbmRlZDp1LG9uQ2hhbmdlOiR9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXNlY29uZGFyeSJ9LCIkZGVmcyIpKSxSZS5jcmVhdGVFbGVtZW50KEwse2V4cGFuZGVkOnUsb25DbGljazpVfSksUmUuY3JlYXRlRWxlbWVudCgic3Ryb25nIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyX19hdHRyaWJ1dGUganNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlLS1wcmltYXJ5In0sIm9iamVjdCIpLFJlLmNyZWF0ZUVsZW1lbnQoInVsIix7Y2xhc3NOYW1lOkpuKCkoImpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fY2hpbGRyZW4iLHsianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19jaGlsZHJlbi0tY29sbGFwc2VkIjohdX0pfSx1JiZSZS5jcmVhdGVFbGVtZW50KFJlLkZyYWdtZW50LG51bGwsT2JqZWN0LmVudHJpZXMobykubWFwKCgoW3Msb10pPT5SZS5jcmVhdGVFbGVtZW50KCJsaSIse2tleTpzLGNsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1wcm9wZXJ0eSJ9LFJlLmNyZWF0ZUVsZW1lbnQoQix7bmFtZTpzLHNjaGVtYTpvfSkpKSkpKSkpKX0sa2V5d29yZHNfJGNvbW1lbnQ9KHtzY2hlbWE6c30pPT5zPy4kY29tbWVudD9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLSRjb21tZW50In0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZS0tc2Vjb25kYXJ5In0sIiRjb21tZW50IiksUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX192YWx1ZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX3ZhbHVlLS1zZWNvbmRhcnkifSxzLiRjb21tZW50KSk6bnVsbCxrZXl3b3Jkc19BbGxPZj0oe3NjaGVtYTpzfSk9Pntjb25zdCBvPXM/LmFsbE9mfHxbXSxpPXVzZUZuKCksYT0iYWxsT2YiLHtwYXRoOnV9PXVzZVBhdGgoYSkse2lzRXhwYW5kZWQ6XyxzZXRFeHBhbmRlZDp3LHNldENvbGxhcHNlZDp4fT11c2VJc0V4cGFuZGVkKGEpLFtDLGpdPXVzZUxldmVsKCksTD11c2VDb21wb25lbnQoIkFjY29yZGlvbiIpLEI9dXNlQ29tcG9uZW50KCJFeHBhbmREZWVwQnV0dG9uIiksJD11c2VDb21wb25lbnQoIkpTT05TY2hlbWEiKSxVPXVzZUNvbXBvbmVudCgiS2V5d29yZFR5cGUiKSxWPSgwLFJlLnVzZUNhbGxiYWNrKSgoKCk9PntfP3goKTp3KCl9KSxbXyx3LHhdKSx6PSgwLFJlLnVzZUNhbGxiYWNrKSgoKHMsbyk9PntvP3coe2RlZXA6ITB9KTp4KHtkZWVwOiEwfSl9KSxbdyx4XSk7cmV0dXJuIEFycmF5LmlzQXJyYXkobykmJjAhPT1vLmxlbmd0aD9SZS5jcmVhdGVFbGVtZW50KF9ULlByb3ZpZGVyLHt2YWx1ZTp1fSxSZS5jcmVhdGVFbGVtZW50KGJULlByb3ZpZGVyLHt2YWx1ZTpqfSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLWFsbE9mIiwiZGF0YS1qc29uLXNjaGVtYS1sZXZlbCI6Q30sUmUuY3JlYXRlRWxlbWVudChMLHtleHBhbmRlZDpfLG9uQ2hhbmdlOlZ9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXByaW1hcnkifSwiQWxsIG9mIikpLFJlLmNyZWF0ZUVsZW1lbnQoQix7ZXhwYW5kZWQ6XyxvbkNsaWNrOnp9KSxSZS5jcmVhdGVFbGVtZW50KFUse3NjaGVtYTp7YWxsT2Y6b319KSxSZS5jcmVhdGVFbGVtZW50KCJ1bCIse2NsYXNzTmFtZTpKbigpKCJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX2NoaWxkcmVuIix7Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fY2hpbGRyZW4tLWNvbGxhcHNlZCI6IV99KX0sXyYmUmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLG8ubWFwKCgocyxvKT0+UmUuY3JlYXRlRWxlbWVudCgibGkiLHtrZXk6YCMke299YCxjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItcHJvcGVydHkifSxSZS5jcmVhdGVFbGVtZW50KCQse25hbWU6YCMke299ICR7aS5nZXRUaXRsZShzKX1gLHNjaGVtYTpzfSkpKSkpKSkpKTpudWxsfSxrZXl3b3Jkc19BbnlPZj0oe3NjaGVtYTpzfSk9Pntjb25zdCBvPXM/LmFueU9mfHxbXSxpPXVzZUZuKCksYT0iYW55T2YiLHtwYXRoOnV9PXVzZVBhdGgoYSkse2lzRXhwYW5kZWQ6XyxzZXRFeHBhbmRlZDp3LHNldENvbGxhcHNlZDp4fT11c2VJc0V4cGFuZGVkKGEpLFtDLGpdPXVzZUxldmVsKCksTD11c2VDb21wb25lbnQoIkFjY29yZGlvbiIpLEI9dXNlQ29tcG9uZW50KCJFeHBhbmREZWVwQnV0dG9uIiksJD11c2VDb21wb25lbnQoIkpTT05TY2hlbWEiKSxVPXVzZUNvbXBvbmVudCgiS2V5d29yZFR5cGUiKSxWPSgwLFJlLnVzZUNhbGxiYWNrKSgoKCk9PntfP3goKTp3KCl9KSxbXyx3LHhdKSx6PSgwLFJlLnVzZUNhbGxiYWNrKSgoKHMsbyk9PntvP3coe2RlZXA6ITB9KTp4KHtkZWVwOiEwfSl9KSxbdyx4XSk7cmV0dXJuIEFycmF5LmlzQXJyYXkobykmJjAhPT1vLmxlbmd0aD9SZS5jcmVhdGVFbGVtZW50KF9ULlByb3ZpZGVyLHt2YWx1ZTp1fSxSZS5jcmVhdGVFbGVtZW50KGJULlByb3ZpZGVyLHt2YWx1ZTpqfSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLWFueU9mIiwiZGF0YS1qc29uLXNjaGVtYS1sZXZlbCI6Q30sUmUuY3JlYXRlRWxlbWVudChMLHtleHBhbmRlZDpfLG9uQ2hhbmdlOlZ9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXByaW1hcnkifSwiQW55IG9mIikpLFJlLmNyZWF0ZUVsZW1lbnQoQix7ZXhwYW5kZWQ6XyxvbkNsaWNrOnp9KSxSZS5jcmVhdGVFbGVtZW50KFUse3NjaGVtYTp7YW55T2Y6b319KSxSZS5jcmVhdGVFbGVtZW50KCJ1bCIse2NsYXNzTmFtZTpKbigpKCJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX2NoaWxkcmVuIix7Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fY2hpbGRyZW4tLWNvbGxhcHNlZCI6IV99KX0sXyYmUmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLG8ubWFwKCgocyxvKT0+UmUuY3JlYXRlRWxlbWVudCgibGkiLHtrZXk6YCMke299YCxjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItcHJvcGVydHkifSxSZS5jcmVhdGVFbGVtZW50KCQse25hbWU6YCMke299ICR7aS5nZXRUaXRsZShzKX1gLHNjaGVtYTpzfSkpKSkpKSkpKTpudWxsfSxrZXl3b3Jkc19PbmVPZj0oe3NjaGVtYTpzfSk9Pntjb25zdCBvPXM/Lm9uZU9mfHxbXSxpPXVzZUZuKCksYT0ib25lT2YiLHtwYXRoOnV9PXVzZVBhdGgoYSkse2lzRXhwYW5kZWQ6XyxzZXRFeHBhbmRlZDp3LHNldENvbGxhcHNlZDp4fT11c2VJc0V4cGFuZGVkKGEpLFtDLGpdPXVzZUxldmVsKCksTD11c2VDb21wb25lbnQoIkFjY29yZGlvbiIpLEI9dXNlQ29tcG9uZW50KCJFeHBhbmREZWVwQnV0dG9uIiksJD11c2VDb21wb25lbnQoIkpTT05TY2hlbWEiKSxVPXVzZUNvbXBvbmVudCgiS2V5d29yZFR5cGUiKSxWPSgwLFJlLnVzZUNhbGxiYWNrKSgoKCk9PntfP3goKTp3KCl9KSxbXyx3LHhdKSx6PSgwLFJlLnVzZUNhbGxiYWNrKSgoKHMsbyk9PntvP3coe2RlZXA6ITB9KTp4KHtkZWVwOiEwfSl9KSxbdyx4XSk7cmV0dXJuIEFycmF5LmlzQXJyYXkobykmJjAhPT1vLmxlbmd0aD9SZS5jcmVhdGVFbGVtZW50KF9ULlByb3ZpZGVyLHt2YWx1ZTp1fSxSZS5jcmVhdGVFbGVtZW50KGJULlByb3ZpZGVyLHt2YWx1ZTpqfSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLW9uZU9mIiwiZGF0YS1qc29uLXNjaGVtYS1sZXZlbCI6Q30sUmUuY3JlYXRlRWxlbWVudChMLHtleHBhbmRlZDpfLG9uQ2hhbmdlOlZ9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXByaW1hcnkifSwiT25lIG9mIikpLFJlLmNyZWF0ZUVsZW1lbnQoQix7ZXhwYW5kZWQ6XyxvbkNsaWNrOnp9KSxSZS5jcmVhdGVFbGVtZW50KFUse3NjaGVtYTp7b25lT2Y6b319KSxSZS5jcmVhdGVFbGVtZW50KCJ1bCIse2NsYXNzTmFtZTpKbigpKCJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX2NoaWxkcmVuIix7Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fY2hpbGRyZW4tLWNvbGxhcHNlZCI6IV99KX0sXyYmUmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLG8ubWFwKCgocyxvKT0+UmUuY3JlYXRlRWxlbWVudCgibGkiLHtrZXk6YCMke299YCxjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItcHJvcGVydHkifSxSZS5jcmVhdGVFbGVtZW50KCQse25hbWU6YCMke299ICR7aS5nZXRUaXRsZShzKX1gLHNjaGVtYTpzfSkpKSkpKSkpKTpudWxsfSxrZXl3b3Jkc19Ob3Q9KHtzY2hlbWE6c30pPT57Y29uc3Qgbz11c2VGbigpLGk9dXNlQ29tcG9uZW50KCJKU09OU2NoZW1hIik7aWYoIW8uaGFzS2V5d29yZChzLCJub3QiKSlyZXR1cm4gbnVsbDtjb25zdCBhPVJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXByaW1hcnkifSwiTm90Iik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0tbm90In0sUmUuY3JlYXRlRWxlbWVudChpLHtuYW1lOmEsc2NoZW1hOnMubm90LGlkZW50aWZpZXI6Im5vdCJ9KSl9LGtleXdvcmRzX0lmPSh7c2NoZW1hOnN9KT0+e2NvbnN0IG89dXNlRm4oKSxpPXVzZUNvbXBvbmVudCgiSlNPTlNjaGVtYSIpO2lmKCFvLmhhc0tleXdvcmQocywiaWYiKSlyZXR1cm4gbnVsbDtjb25zdCBhPVJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXByaW1hcnkifSwiSWYiKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS1pZiJ9LFJlLmNyZWF0ZUVsZW1lbnQoaSx7bmFtZTphLHNjaGVtYTpzLmlmLGlkZW50aWZpZXI6ImlmIn0pKX0sa2V5d29yZHNfVGhlbj0oe3NjaGVtYTpzfSk9Pntjb25zdCBvPXVzZUZuKCksaT11c2VDb21wb25lbnQoIkpTT05TY2hlbWEiKTtpZighby5oYXNLZXl3b3JkKHMsInRoZW4iKSlyZXR1cm4gbnVsbDtjb25zdCBhPVJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXByaW1hcnkifSwiVGhlbiIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLXRoZW4ifSxSZS5jcmVhdGVFbGVtZW50KGkse25hbWU6YSxzY2hlbWE6cy50aGVuLGlkZW50aWZpZXI6InRoZW4ifSkpfSxrZXl3b3Jkc19FbHNlPSh7c2NoZW1hOnN9KT0+e2NvbnN0IG89dXNlRm4oKSxpPXVzZUNvbXBvbmVudCgiSlNPTlNjaGVtYSIpO2lmKCFvLmhhc0tleXdvcmQocywiZWxzZSIpKXJldHVybiBudWxsO2NvbnN0IGE9UmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZS0tcHJpbWFyeSJ9LCJFbHNlIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0taWYifSxSZS5jcmVhdGVFbGVtZW50KGkse25hbWU6YSxzY2hlbWE6cy5lbHNlLGlkZW50aWZpZXI6ImVsc2UifSkpfSxrZXl3b3Jkc19EZXBlbmRlbnRTY2hlbWFzPSh7c2NoZW1hOnN9KT0+e2NvbnN0IG89cz8uZGVwZW5kZW50U2NoZW1hc3x8W10saT0iZGVwZW5kZW50U2NoZW1hcyIse3BhdGg6YX09dXNlUGF0aChpKSx7aXNFeHBhbmRlZDp1LHNldEV4cGFuZGVkOl8sc2V0Q29sbGFwc2VkOnd9PXVzZUlzRXhwYW5kZWQoaSksW3gsQ109dXNlTGV2ZWwoKSxqPXVzZUNvbXBvbmVudCgiQWNjb3JkaW9uIiksTD11c2VDb21wb25lbnQoIkV4cGFuZERlZXBCdXR0b24iKSxCPXVzZUNvbXBvbmVudCgiSlNPTlNjaGVtYSIpLCQ9KDAsUmUudXNlQ2FsbGJhY2spKCgoKT0+e3U/dygpOl8oKX0pLFt1LF8sd10pLFU9KDAsUmUudXNlQ2FsbGJhY2spKCgocyxvKT0+e28/Xyh7ZGVlcDohMH0pOncoe2RlZXA6ITB9KX0pLFtfLHddKTtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIG98fDA9PT1PYmplY3Qua2V5cyhvKS5sZW5ndGg/bnVsbDpSZS5jcmVhdGVFbGVtZW50KF9ULlByb3ZpZGVyLHt2YWx1ZTphfSxSZS5jcmVhdGVFbGVtZW50KGJULlByb3ZpZGVyLHt2YWx1ZTpDfSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLWRlcGVuZGVudFNjaGVtYXMiLCJkYXRhLWpzb24tc2NoZW1hLWxldmVsIjp4fSxSZS5jcmVhdGVFbGVtZW50KGose2V4cGFuZGVkOnUsb25DaGFuZ2U6JH0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZS0tcHJpbWFyeSJ9LCJEZXBlbmRlbnQgc2NoZW1hcyIpKSxSZS5jcmVhdGVFbGVtZW50KEwse2V4cGFuZGVkOnUsb25DbGljazpVfSksUmUuY3JlYXRlRWxlbWVudCgic3Ryb25nIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyX19hdHRyaWJ1dGUganNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlLS1wcmltYXJ5In0sIm9iamVjdCIpLFJlLmNyZWF0ZUVsZW1lbnQoInVsIix7Y2xhc3NOYW1lOkpuKCkoImpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fY2hpbGRyZW4iLHsianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19jaGlsZHJlbi0tY29sbGFwc2VkIjohdX0pfSx1JiZSZS5jcmVhdGVFbGVtZW50KFJlLkZyYWdtZW50LG51bGwsT2JqZWN0LmVudHJpZXMobykubWFwKCgoW3Msb10pPT5SZS5jcmVhdGVFbGVtZW50KCJsaSIse2tleTpzLGNsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1wcm9wZXJ0eSJ9LFJlLmNyZWF0ZUVsZW1lbnQoQix7bmFtZTpzLHNjaGVtYTpvfSkpKSkpKSkpKX0sa2V5d29yZHNfUHJlZml4SXRlbXM9KHtzY2hlbWE6c30pPT57Y29uc3Qgbz1zPy5wcmVmaXhJdGVtc3x8W10saT11c2VGbigpLGE9InByZWZpeEl0ZW1zIix7cGF0aDp1fT11c2VQYXRoKGEpLHtpc0V4cGFuZGVkOl8sc2V0RXhwYW5kZWQ6dyxzZXRDb2xsYXBzZWQ6eH09dXNlSXNFeHBhbmRlZChhKSxbQyxqXT11c2VMZXZlbCgpLEw9dXNlQ29tcG9uZW50KCJBY2NvcmRpb24iKSxCPXVzZUNvbXBvbmVudCgiRXhwYW5kRGVlcEJ1dHRvbiIpLCQ9dXNlQ29tcG9uZW50KCJKU09OU2NoZW1hIiksVT11c2VDb21wb25lbnQoIktleXdvcmRUeXBlIiksVj0oMCxSZS51c2VDYWxsYmFjaykoKCgpPT57Xz94KCk6dygpfSksW18sdyx4XSksej0oMCxSZS51c2VDYWxsYmFjaykoKChzLG8pPT57bz93KHtkZWVwOiEwfSk6eCh7ZGVlcDohMH0pfSksW3cseF0pO3JldHVybiBBcnJheS5pc0FycmF5KG8pJiYwIT09by5sZW5ndGg/UmUuY3JlYXRlRWxlbWVudChfVC5Qcm92aWRlcix7dmFsdWU6dX0sUmUuY3JlYXRlRWxlbWVudChiVC5Qcm92aWRlcix7dmFsdWU6an0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS1wcmVmaXhJdGVtcyIsImRhdGEtanNvbi1zY2hlbWEtbGV2ZWwiOkN9LFJlLmNyZWF0ZUVsZW1lbnQoTCx7ZXhwYW5kZWQ6XyxvbkNoYW5nZTpWfSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1wcmltYXJ5In0sIlByZWZpeCBpdGVtcyIpKSxSZS5jcmVhdGVFbGVtZW50KEIse2V4cGFuZGVkOl8sb25DbGljazp6fSksUmUuY3JlYXRlRWxlbWVudChVLHtzY2hlbWE6e3ByZWZpeEl0ZW1zOm99fSksUmUuY3JlYXRlRWxlbWVudCgidWwiLHtjbGFzc05hbWU6Sm4oKSgianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19jaGlsZHJlbiIseyJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX2NoaWxkcmVuLS1jb2xsYXBzZWQiOiFffSl9LF8mJlJlLmNyZWF0ZUVsZW1lbnQoUmUuRnJhZ21lbnQsbnVsbCxvLm1hcCgoKHMsbyk9PlJlLmNyZWF0ZUVsZW1lbnQoImxpIix7a2V5OmAjJHtvfWAsY2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLXByb3BlcnR5In0sUmUuY3JlYXRlRWxlbWVudCgkLHtuYW1lOmAjJHtvfSAke2kuZ2V0VGl0bGUocyl9YCxzY2hlbWE6c30pKSkpKSkpKSk6bnVsbH0sa2V5d29yZHNfSXRlbXM9KHtzY2hlbWE6c30pPT57Y29uc3Qgbz11c2VGbigpLGk9dXNlQ29tcG9uZW50KCJKU09OU2NoZW1hIik7aWYoIW8uaGFzS2V5d29yZChzLCJpdGVtcyIpKXJldHVybiBudWxsO2NvbnN0IGE9UmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZS0tcHJpbWFyeSJ9LCJJdGVtcyIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLWl0ZW1zIn0sUmUuY3JlYXRlRWxlbWVudChpLHtuYW1lOmEsc2NoZW1hOnMuaXRlbXMsaWRlbnRpZmllcjoiaXRlbXMifSkpfSxrZXl3b3Jkc19Db250YWlucz0oe3NjaGVtYTpzfSk9Pntjb25zdCBvPXVzZUZuKCksaT11c2VDb21wb25lbnQoIkpTT05TY2hlbWEiKTtpZighby5oYXNLZXl3b3JkKHMsImNvbnRhaW5zIikpcmV0dXJuIG51bGw7Y29uc3QgYT1SZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1wcmltYXJ5In0sIkNvbnRhaW5zIik7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0tY29udGFpbnMifSxSZS5jcmVhdGVFbGVtZW50KGkse25hbWU6YSxzY2hlbWE6cy5jb250YWlucyxpZGVudGlmaWVyOiJjb250YWlucyJ9KSl9LGtleXdvcmRzX1Byb3BlcnRpZXNfUHJvcGVydGllcz0oe3NjaGVtYTpzfSk9Pntjb25zdCBvPXVzZUZuKCksaT1zPy5wcm9wZXJ0aWVzfHx7fSxhPUFycmF5LmlzQXJyYXkocz8ucmVxdWlyZWQpP3MucmVxdWlyZWQ6W10sdT11c2VDb21wb25lbnQoIkpTT05TY2hlbWEiKSx7cGF0aDpffT11c2VQYXRoKCJwcm9wZXJ0aWVzIik7cmV0dXJuIDA9PT1PYmplY3Qua2V5cyhpKS5sZW5ndGg/bnVsbDpSZS5jcmVhdGVFbGVtZW50KF9ULlByb3ZpZGVyLHt2YWx1ZTpffSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLXByb3BlcnRpZXMifSxSZS5jcmVhdGVFbGVtZW50KCJ1bCIsbnVsbCxPYmplY3QuZW50cmllcyhpKS5tYXAoKChbaSxfXSk9Pntjb25zdCB3PWEuaW5jbHVkZXMoaSkseD1vLmdldERlcGVuZGVudFJlcXVpcmVkKGkscyk7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoImxpIix7a2V5OmksY2xhc3NOYW1lOkpuKCkoImpzb24tc2NoZW1hLTIwMjAtMTItcHJvcGVydHkiLHsianNvbi1zY2hlbWEtMjAyMC0xMi1wcm9wZXJ0eS0tcmVxdWlyZWQiOnd9KX0sUmUuY3JlYXRlRWxlbWVudCh1LHtuYW1lOmksc2NoZW1hOl8sZGVwZW5kZW50UmVxdWlyZWQ6eH0pKX0pKSkpKX0sUGF0dGVyblByb3BlcnRpZXNfUGF0dGVyblByb3BlcnRpZXM9KHtzY2hlbWE6c30pPT57Y29uc3Qgbz1zPy5wYXR0ZXJuUHJvcGVydGllc3x8e30saT11c2VDb21wb25lbnQoIkpTT05TY2hlbWEiKSx7cGF0aDphfT11c2VQYXRoKCJwYXR0ZXJuUHJvcGVydGllcyIpO3JldHVybiAwPT09T2JqZWN0LmtleXMobykubGVuZ3RoP251bGw6UmUuY3JlYXRlRWxlbWVudChfVC5Qcm92aWRlcix7dmFsdWU6YX0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS1wYXR0ZXJuUHJvcGVydGllcyJ9LFJlLmNyZWF0ZUVsZW1lbnQoInVsIixudWxsLE9iamVjdC5lbnRyaWVzKG8pLm1hcCgoKFtzLG9dKT0+UmUuY3JlYXRlRWxlbWVudCgibGkiLHtrZXk6cyxjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItcHJvcGVydHkifSxSZS5jcmVhdGVFbGVtZW50KGkse25hbWU6cyxzY2hlbWE6b30pKSkpKSkpfSxrZXl3b3Jkc19BZGRpdGlvbmFsUHJvcGVydGllcz0oe3NjaGVtYTpzfSk9Pntjb25zdCBvPXVzZUZuKCksaT11c2VDb21wb25lbnQoIkpTT05TY2hlbWEiKTtpZighby5oYXNLZXl3b3JkKHMsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIikpcmV0dXJuIG51bGw7Y29uc3QgYT1SZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1wcmltYXJ5In0sIkFkZGl0aW9uYWwgcHJvcGVydGllcyIpO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLWFkZGl0aW9uYWxQcm9wZXJ0aWVzIn0sITA9PT1zLmFkZGl0aW9uYWxQcm9wZXJ0aWVzP1JlLmNyZWF0ZUVsZW1lbnQoUmUuRnJhZ21lbnQsbnVsbCxhLFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTJfX2F0dHJpYnV0ZSBqc29uLXNjaGVtYS0yMDIwLTEyX19hdHRyaWJ1dGUtLXByaW1hcnkifSwiYWxsb3dlZCIpKTohMT09PXMuYWRkaXRpb25hbFByb3BlcnRpZXM/UmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLGEsUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlIGpzb24tc2NoZW1hLTIwMjAtMTJfX2F0dHJpYnV0ZS0tcHJpbWFyeSJ9LCJmb3JiaWRkZW4iKSk6UmUuY3JlYXRlRWxlbWVudChpLHtuYW1lOmEsc2NoZW1hOnMuYWRkaXRpb25hbFByb3BlcnRpZXMsaWRlbnRpZmllcjoiYWRkaXRpb25hbFByb3BlcnRpZXMifSkpfSxrZXl3b3Jkc19Qcm9wZXJ0eU5hbWVzPSh7c2NoZW1hOnN9KT0+e2NvbnN0IG89dXNlRm4oKSxpPXVzZUNvbXBvbmVudCgiSlNPTlNjaGVtYSIpLGE9UmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZS0tcHJpbWFyeSJ9LCJQcm9wZXJ0eSBuYW1lcyIpO3JldHVybiBvLmhhc0tleXdvcmQocywicHJvcGVydHlOYW1lcyIpP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0tcHJvcGVydHlOYW1lcyJ9LFJlLmNyZWF0ZUVsZW1lbnQoaSx7bmFtZTphLHNjaGVtYTpzLnByb3BlcnR5TmFtZXMsaWRlbnRpZmllcjoicHJvcGVydHlOYW1lcyJ9KSk6bnVsbH0sa2V5d29yZHNfVW5ldmFsdWF0ZWRJdGVtcz0oe3NjaGVtYTpzfSk9Pntjb25zdCBvPXVzZUZuKCksaT11c2VDb21wb25lbnQoIkpTT05TY2hlbWEiKTtpZighby5oYXNLZXl3b3JkKHMsInVuZXZhbHVhdGVkSXRlbXMiKSlyZXR1cm4gbnVsbDtjb25zdCBhPVJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXByaW1hcnkifSwiVW5ldmFsdWF0ZWQgaXRlbXMiKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS11bmV2YWx1YXRlZEl0ZW1zIn0sUmUuY3JlYXRlRWxlbWVudChpLHtuYW1lOmEsc2NoZW1hOnMudW5ldmFsdWF0ZWRJdGVtcyxpZGVudGlmaWVyOiJ1bmV2YWx1YXRlZEl0ZW1zIn0pKX0sa2V5d29yZHNfVW5ldmFsdWF0ZWRQcm9wZXJ0aWVzPSh7c2NoZW1hOnN9KT0+e2NvbnN0IG89dXNlRm4oKSxpPXVzZUNvbXBvbmVudCgiSlNPTlNjaGVtYSIpO2lmKCFvLmhhc0tleXdvcmQocywidW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIikpcmV0dXJuIG51bGw7Y29uc3QgYT1SZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1wcmltYXJ5In0sIlVuZXZhbHVhdGVkIHByb3BlcnRpZXMiKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS11bmV2YWx1YXRlZFByb3BlcnRpZXMifSxSZS5jcmVhdGVFbGVtZW50KGkse25hbWU6YSxzY2hlbWE6cy51bmV2YWx1YXRlZFByb3BlcnRpZXMsaWRlbnRpZmllcjoidW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIn0pKX0sa2V5d29yZHNfVHlwZT0oe3NjaGVtYTpzLGlzQ2lyY3VsYXI6bz0hMX0pPT57Y29uc3QgaT11c2VGbigpLmdldFR5cGUocyksYT1vPyIgW2NpcmN1bGFyXSI6IiI7cmV0dXJuIFJlLmNyZWF0ZUVsZW1lbnQoInN0cm9uZyIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlIGpzb24tc2NoZW1hLTIwMjAtMTJfX2F0dHJpYnV0ZS0tcHJpbWFyeSJ9LGAke2l9JHthfWApfSxFbnVtX0VudW09KHtzY2hlbWE6c30pPT57Y29uc3Qgbz11c2VDb21wb25lbnQoIkpTT05WaWV3ZXIiKTtyZXR1cm4gQXJyYXkuaXNBcnJheShzPy5lbnVtKT9SZS5jcmVhdGVFbGVtZW50KG8se25hbWU6IkVudW0iLHZhbHVlOnMuZW51bSxjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLWVudW0ifSk6bnVsbH0sQ29uc3RfQ29uc3Q9KHtzY2hlbWE6c30pPT57Y29uc3Qgbz11c2VGbigpLGk9dXNlQ29tcG9uZW50KCJKU09OVmlld2VyIik7cmV0dXJuIG8uaGFzS2V5d29yZChzLCJjb25zdCIpP1JlLmNyZWF0ZUVsZW1lbnQoaSx7bmFtZToiQ29uc3QiLHZhbHVlOnMuY29uc3QsY2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS1jb25zdCJ9KTpudWxsfSxmbl91cHBlckZpcnN0PXM9PiJzdHJpbmciPT10eXBlb2Ygcz9gJHtzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7cy5zbGljZSgxKX1gOnMsbWFrZUdldFRpdGxlPXM9PihvLHtsb29rdXA6aT0iZXh0ZW5kZWQifT17fSk9Pntjb25zdCBhPXMoKTtpZihudWxsIT1vPy50aXRsZSlyZXR1cm4gYS51cHBlckZpcnN0KFN0cmluZyhvLnRpdGxlKSk7aWYoImV4dGVuZGVkIj09PWkpe2lmKG51bGwhPW8/LiRhbmNob3IpcmV0dXJuIGEudXBwZXJGaXJzdChTdHJpbmcoby4kYW5jaG9yKSk7aWYobnVsbCE9bz8uJGlkKXJldHVybiBTdHJpbmcoby4kaWQpfXJldHVybiIifSxtYWtlR2V0VHlwZT1zPT57Y29uc3QgZ2V0VHlwZT0obyxpPW5ldyBXZWFrU2V0KT0+e2NvbnN0IGE9cygpO2lmKG51bGw9PW8pcmV0dXJuImFueSI7aWYoYS5pc0Jvb2xlYW5KU09OU2NoZW1hKG8pKXJldHVybiBvPyJhbnkiOiJuZXZlciI7aWYoIm9iamVjdCIhPXR5cGVvZiBvKXJldHVybiJhbnkiO2lmKGkuaGFzKG8pKXJldHVybiJhbnkiO2kuYWRkKG8pO2NvbnN0e3R5cGU6dSxwcmVmaXhJdGVtczpfLGl0ZW1zOnd9PW8sZ2V0QXJyYXlUeXBlPSgpPT57aWYoQXJyYXkuaXNBcnJheShfKSl7Y29uc3Qgcz1fLm1hcCgocz0+Z2V0VHlwZShzLGkpKSksbz13P2dldFR5cGUodyxpKToiYW55IjtyZXR1cm5gYXJyYXk8WyR7cy5qb2luKCIsICIpfV0sICR7b30+YH1pZih3KXtyZXR1cm5gYXJyYXk8JHtnZXRUeXBlKHcsaSl9PmB9cmV0dXJuImFycmF5PGFueT4ifTtpZihvLm5vdCYmImFueSI9PT1nZXRUeXBlKG8ubm90KSlyZXR1cm4ibmV2ZXIiO2NvbnN0IGhhbmRsZUNvbWJpbmluZ0tleXdvcmRzPShzLGEpPT57aWYoQXJyYXkuaXNBcnJheShvW3NdKSl7cmV0dXJuYCgke29bc10ubWFwKChzPT5nZXRUeXBlKHMsaSkpKS5qb2luKGEpfSlgfXJldHVybiBudWxsfSx4PVtBcnJheS5pc0FycmF5KHUpP3UubWFwKChzPT4iYXJyYXkiPT09cz9nZXRBcnJheVR5cGUoKTpzKSkuam9pbigiIHwgIik6ImFycmF5Ij09PXU/Z2V0QXJyYXlUeXBlKCk6WyJudWxsIiwiYm9vbGVhbiIsIm9iamVjdCIsImFycmF5IiwibnVtYmVyIiwiaW50ZWdlciIsInN0cmluZyJdLmluY2x1ZGVzKHUpP3U6KCgpPT57aWYoT2JqZWN0Lmhhc093bihvLCJwcmVmaXhJdGVtcyIpfHxPYmplY3QuaGFzT3duKG8sIml0ZW1zIil8fE9iamVjdC5oYXNPd24obywiY29udGFpbnMiKSlyZXR1cm4gZ2V0QXJyYXlUeXBlKCk7aWYoT2JqZWN0Lmhhc093bihvLCJwcm9wZXJ0aWVzIil8fE9iamVjdC5oYXNPd24obywiYWRkaXRpb25hbFByb3BlcnRpZXMiKXx8T2JqZWN0Lmhhc093bihvLCJwYXR0ZXJuUHJvcGVydGllcyIpKXJldHVybiJvYmplY3QiO2lmKFsiaW50MzIiLCJpbnQ2NCJdLmluY2x1ZGVzKG8uZm9ybWF0KSlyZXR1cm4iaW50ZWdlciI7aWYoWyJmbG9hdCIsImRvdWJsZSJdLmluY2x1ZGVzKG8uZm9ybWF0KSlyZXR1cm4ibnVtYmVyIjtpZihPYmplY3QuaGFzT3duKG8sIm1pbmltdW0iKXx8T2JqZWN0Lmhhc093bihvLCJtYXhpbXVtIil8fE9iamVjdC5oYXNPd24obywiZXhjbHVzaXZlTWluaW11bSIpfHxPYmplY3QuaGFzT3duKG8sImV4Y2x1c2l2ZU1heGltdW0iKXx8T2JqZWN0Lmhhc093bihvLCJtdWx0aXBsZU9mIikpcmV0dXJuIm51bWJlciB8IGludGVnZXIiO2lmKE9iamVjdC5oYXNPd24obywicGF0dGVybiIpfHxPYmplY3QuaGFzT3duKG8sImZvcm1hdCIpfHxPYmplY3QuaGFzT3duKG8sIm1pbkxlbmd0aCIpfHxPYmplY3QuaGFzT3duKG8sIm1heExlbmd0aCIpfHxPYmplY3QuaGFzT3duKG8sImNvbnRlbnRFbmNvZGluZyIpfHxPYmplY3QuaGFzT3duKG8sImNvbnRlbnRNZWRpYVR5cGUiKSlyZXR1cm4ic3RyaW5nIjtpZih2b2lkIDAhPT1vLmNvbnN0KXtpZihudWxsPT09by5jb25zdClyZXR1cm4ibnVsbCI7aWYoImJvb2xlYW4iPT10eXBlb2Ygby5jb25zdClyZXR1cm4iYm9vbGVhbiI7aWYoIm51bWJlciI9PXR5cGVvZiBvLmNvbnN0KXJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKG8uY29uc3QpPyJpbnRlZ2VyIjoibnVtYmVyIjtpZigic3RyaW5nIj09dHlwZW9mIG8uY29uc3QpcmV0dXJuInN0cmluZyI7aWYoQXJyYXkuaXNBcnJheShvLmNvbnN0KSlyZXR1cm4iYXJyYXk8YW55PiI7aWYoIm9iamVjdCI9PXR5cGVvZiBvLmNvbnN0KXJldHVybiJvYmplY3QifXJldHVybiBudWxsfSkoKSxoYW5kbGVDb21iaW5pbmdLZXl3b3Jkcygib25lT2YiLCIgfCAiKSxoYW5kbGVDb21iaW5pbmdLZXl3b3JkcygiYW55T2YiLCIgfCAiKSxoYW5kbGVDb21iaW5pbmdLZXl3b3JkcygiYWxsT2YiLCIgJiAiKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiB8ICIpO3JldHVybiBpLmRlbGV0ZShvKSx4fHwiYW55In07cmV0dXJuIGdldFR5cGV9LGlzQm9vbGVhbkpTT05TY2hlbWE9cz0+ImJvb2xlYW4iPT10eXBlb2YgcyxoYXNLZXl3b3JkPShzLG8pPT5udWxsIT09cyYmIm9iamVjdCI9PXR5cGVvZiBzJiZPYmplY3QuaGFzT3duKHMsbyksZm5fbWFrZUlzRXhwYW5kYWJsZT1zPT5vPT57Y29uc3QgaT1zKCk7cmV0dXJuIG8/LiRzY2hlbWF8fG8/LiR2b2NhYnVsYXJ5fHxvPy4kaWR8fG8/LiRhbmNob3J8fG8/LiRkeW5hbWljQW5jaG9yfHxvPy4kcmVmfHxvPy4kZHluYW1pY1JlZnx8bz8uJGRlZnN8fG8/LiRjb21tZW50fHxvPy5hbGxPZnx8bz8uYW55T2Z8fG8/Lm9uZU9mfHxpLmhhc0tleXdvcmQobywibm90Iil8fGkuaGFzS2V5d29yZChvLCJpZiIpfHxpLmhhc0tleXdvcmQobywidGhlbiIpfHxpLmhhc0tleXdvcmQobywiZWxzZSIpfHxvPy5kZXBlbmRlbnRTY2hlbWFzfHxvPy5wcmVmaXhJdGVtc3x8aS5oYXNLZXl3b3JkKG8sIml0ZW1zIil8fGkuaGFzS2V5d29yZChvLCJjb250YWlucyIpfHxvPy5wcm9wZXJ0aWVzfHxvPy5wYXR0ZXJuUHJvcGVydGllc3x8aS5oYXNLZXl3b3JkKG8sImFkZGl0aW9uYWxQcm9wZXJ0aWVzIil8fGkuaGFzS2V5d29yZChvLCJwcm9wZXJ0eU5hbWVzIil8fGkuaGFzS2V5d29yZChvLCJ1bmV2YWx1YXRlZEl0ZW1zIil8fGkuaGFzS2V5d29yZChvLCJ1bmV2YWx1YXRlZFByb3BlcnRpZXMiKXx8bz8uZGVzY3JpcHRpb258fG8/LmVudW18fGkuaGFzS2V5d29yZChvLCJjb25zdCIpfHxpLmhhc0tleXdvcmQobywiY29udGVudFNjaGVtYSIpfHxpLmhhc0tleXdvcmQobywiZGVmYXVsdCIpfHxvPy5leGFtcGxlc3x8aS5nZXRFeHRlbnNpb25LZXl3b3JkcyhvKS5sZW5ndGg+MH0sZm5fc3RyaW5naWZ5PXM9Pm51bGw9PT1zfHxbIm51bWJlciIsImJpZ2ludCIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2Ygcyk/U3RyaW5nKHMpOkFycmF5LmlzQXJyYXkocyk/YFske3MubWFwKGZuX3N0cmluZ2lmeSkuam9pbigiLCAiKX1dYDpKU09OLnN0cmluZ2lmeShzKSxzdHJpbmdpZnlDb25zdHJhaW50UmFuZ2U9KHMsbyxpKT0+e2NvbnN0IGE9Im51bWJlciI9PXR5cGVvZiBvLHU9Im51bWJlciI9PXR5cGVvZiBpO3JldHVybiBhJiZ1P289PT1pP2Ake299ICR7c31gOmBbJHtvfSwgJHtpfV0gJHtzfWA6YT9g4omlICR7b30gJHtzfWA6dT9g4omkICR7aX0gJHtzfWA6bnVsbH0sc3RyaW5naWZ5Q29uc3RyYWludHM9cz0+e2NvbnN0IG89W10saT0ocz0+e2lmKCJudW1iZXIiIT10eXBlb2Ygcz8ubXVsdGlwbGVPZilyZXR1cm4gbnVsbDtpZihzLm11bHRpcGxlT2Y8PTApcmV0dXJuIG51bGw7aWYoMT09PXMubXVsdGlwbGVPZilyZXR1cm4gbnVsbDtjb25zdHttdWx0aXBsZU9mOm99PXM7aWYoTnVtYmVyLmlzSW50ZWdlcihvKSlyZXR1cm5gbXVsdGlwbGUgb2YgJHtvfWA7Y29uc3QgaT0xMCoqby50b1N0cmluZygpLnNwbGl0KCIuIilbMV0ubGVuZ3RoO3JldHVybmBtdWx0aXBsZSBvZiAke28qaX0vJHtpfWB9KShzKTtudWxsIT09aSYmby5wdXNoKHtzY29wZToibnVtYmVyIix2YWx1ZTppfSk7Y29uc3QgYT0ocz0+e2NvbnN0IG89cz8ubWluaW11bSxpPXM/Lm1heGltdW0sYT1zPy5leGNsdXNpdmVNaW5pbXVtLHU9cz8uZXhjbHVzaXZlTWF4aW11bSxfPSJudW1iZXIiPT10eXBlb2Ygbyx3PSJudW1iZXIiPT10eXBlb2YgaSx4PSJudW1iZXIiPT10eXBlb2YgYSxDPSJudW1iZXIiPT10eXBlb2YgdSxqPXgmJighX3x8bzxhKSxMPUMmJighd3x8aT51KTtpZigoX3x8eCkmJih3fHxDKSlyZXR1cm5gJHtqPyIoIjoiWyJ9JHtqP2E6b30sICR7TD91Oml9JHtMPyIpIjoiXSJ9YDtpZihffHx4KXJldHVybmAke2o/Ij4iOiLiiaUifSAke2o/YTpvfWA7aWYod3x8QylyZXR1cm5gJHtMPyI8Ijoi4omkIn0gJHtMP3U6aX1gO3JldHVybiBudWxsfSkocyk7bnVsbCE9PWEmJm8ucHVzaCh7c2NvcGU6Im51bWJlciIsdmFsdWU6YX0pLHM/LmZvcm1hdCYmby5wdXNoKHtzY29wZToic3RyaW5nIix2YWx1ZTpzLmZvcm1hdH0pO2NvbnN0IHU9c3RyaW5naWZ5Q29uc3RyYWludFJhbmdlKCJjaGFyYWN0ZXJzIixzPy5taW5MZW5ndGgscz8ubWF4TGVuZ3RoKTtudWxsIT09dSYmby5wdXNoKHtzY29wZToic3RyaW5nIix2YWx1ZTp1fSkscz8ucGF0dGVybiYmby5wdXNoKHtzY29wZToic3RyaW5nIix2YWx1ZTpgbWF0Y2hlcyAke3M/LnBhdHRlcm59YH0pLHM/LmNvbnRlbnRNZWRpYVR5cGUmJm8ucHVzaCh7c2NvcGU6InN0cmluZyIsdmFsdWU6YG1lZGlhIHR5cGU6ICR7cy5jb250ZW50TWVkaWFUeXBlfWB9KSxzPy5jb250ZW50RW5jb2RpbmcmJm8ucHVzaCh7c2NvcGU6InN0cmluZyIsdmFsdWU6YGVuY29kaW5nOiAke3MuY29udGVudEVuY29kaW5nfWB9KTtjb25zdCBfPXN0cmluZ2lmeUNvbnN0cmFpbnRSYW5nZShzPy51bmlxdWVJdGVtcz8idW5pcXVlIGl0ZW1zIjoiaXRlbXMiLHM/Lm1pbkl0ZW1zLHM/Lm1heEl0ZW1zKTtudWxsIT09XyYmby5wdXNoKHtzY29wZToiYXJyYXkiLHZhbHVlOl99KSxzPy51bmlxdWVJdGVtcyYmIV8mJm8ucHVzaCh7c2NvcGU6ImFycmF5Iix2YWx1ZToidW5pcXVlIn0pO2NvbnN0IHc9c3RyaW5naWZ5Q29uc3RyYWludFJhbmdlKCJjb250YWluZWQgaXRlbXMiLHM/Lm1pbkNvbnRhaW5zLHM/Lm1heENvbnRhaW5zKTtudWxsIT09dyYmby5wdXNoKHtzY29wZToiYXJyYXkiLHZhbHVlOnd9KTtjb25zdCB4PXN0cmluZ2lmeUNvbnN0cmFpbnRSYW5nZSgicHJvcGVydGllcyIscz8ubWluUHJvcGVydGllcyxzPy5tYXhQcm9wZXJ0aWVzKTtyZXR1cm4gbnVsbCE9PXgmJm8ucHVzaCh7c2NvcGU6Im9iamVjdCIsdmFsdWU6eH0pLG99LGdldERlcGVuZGVudFJlcXVpcmVkPShzLG8pPT5vPy5kZXBlbmRlbnRSZXF1aXJlZD9BcnJheS5mcm9tKE9iamVjdC5lbnRyaWVzKG8uZGVwZW5kZW50UmVxdWlyZWQpLnJlZHVjZSgoKG8sW2ksYV0pPT5BcnJheS5pc0FycmF5KGEpJiZhLmluY2x1ZGVzKHMpPyhvLmFkZChpKSxvKTpvKSxuZXcgU2V0KSk6W10sZm5faXNQbGFpbk9iamVjdD1zPT4ib2JqZWN0Ij09dHlwZW9mIHMmJm51bGwhPT1zJiYhQXJyYXkuaXNBcnJheShzKSYmKG51bGw9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocyl8fE9iamVjdC5nZXRQcm90b3R5cGVPZihzKT09PU9iamVjdC5wcm90b3R5cGUpLGdldFNjaGVtYUtleXdvcmRzPSgpPT5bIiRzY2hlbWEiLCIkdm9jYWJ1bGFyeSIsIiRpZCIsIiRhbmNob3IiLCIkZHluYW1pY0FuY2hvciIsIiRkeW5hbWljUmVmIiwiJHJlZiIsIiRkZWZzIiwiJGNvbW1lbnQiLCJhbGxPZiIsImFueU9mIiwib25lT2YiLCJub3QiLCJpZiIsInRoZW4iLCJlbHNlIiwiZGVwZW5kZW50U2NoZW1hcyIsInByZWZpeEl0ZW1zIiwiaXRlbXMiLCJjb250YWlucyIsInByb3BlcnRpZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwicHJvcGVydHlOYW1lcyIsInVuZXZhbHVhdGVkSXRlbXMiLCJ1bmV2YWx1YXRlZFByb3BlcnRpZXMiLCJ0eXBlIiwiZW51bSIsImNvbnN0IiwibXVsdGlwbGVPZiIsIm1heGltdW0iLCJleGNsdXNpdmVNYXhpbXVtIiwibWluaW11bSIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhMZW5ndGgiLCJtaW5MZW5ndGgiLCJwYXR0ZXJuIiwibWF4SXRlbXMiLCJtaW5JdGVtcyIsInVuaXF1ZUl0ZW1zIiwibWF4Q29udGFpbnMiLCJtaW5Db250YWlucyIsIm1heFByb3BlcnRpZXMiLCJtaW5Qcm9wZXJ0aWVzIiwicmVxdWlyZWQiLCJkZXBlbmRlbnRSZXF1aXJlZCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJkZWZhdWx0IiwiZGVwcmVjYXRlZCIsInJlYWRPbmx5Iiwid3JpdGVPbmx5IiwiZXhhbXBsZXMiLCJmb3JtYXQiLCJjb250ZW50RW5jb2RpbmciLCJjb250ZW50TWVkaWFUeXBlIiwiY29udGVudFNjaGVtYSJdLG1ha2VHZXRFeHRlbnNpb25LZXl3b3Jkcz1zPT5vPT57Y29uc3QgaT1zKCkuZ2V0U2NoZW1hS2V5d29yZHMoKTtyZXR1cm4gZm5faXNQbGFpbk9iamVjdChvKT8oKHMsbyk9Pntjb25zdCBpPW5ldyBTZXQobyk7cmV0dXJuIHMuZmlsdGVyKChzPT4haS5oYXMocykpKX0pKE9iamVjdC5rZXlzKG8pLGkpOltdfSxmbl9oYXNTY2hlbWFUeXBlPShzLG8pPT57Y29uc3QgaT16ZS5NYXAuaXNNYXAocyk7aWYoIWkmJiFmbl9pc1BsYWluT2JqZWN0KHMpKXJldHVybiExO2NvbnN0IGhhc1R5cGU9cz0+bz09PXN8fEFycmF5LmlzQXJyYXkobykmJm8uaW5jbHVkZXMocyksYT1pP3MuZ2V0KCJ0eXBlIik6cy50eXBlO3JldHVybiB6ZS5MaXN0LmlzTGlzdChhKXx8QXJyYXkuaXNBcnJheShhKT9hLnNvbWUoKHM9Pmhhc1R5cGUocykpKTpoYXNUeXBlKGEpfSxDb25zdHJhaW50PSh7Y29uc3RyYWludDpzfSk9PmZuX2lzUGxhaW5PYmplY3QocykmJiJzdHJpbmciPT10eXBlb2Ygcy5zY29wZSYmInN0cmluZyI9PXR5cGVvZiBzLnZhbHVlP1JlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6YGpzb24tc2NoZW1hLTIwMjAtMTJfX2NvbnN0cmFpbnQganNvbi1zY2hlbWEtMjAyMC0xMl9fY29uc3RyYWludC0tJHtzLnNjb3BlfWB9LHMudmFsdWUpOm51bGwseFQ9UmUubWVtbyhDb25zdHJhaW50KSxEZXBlbmRlbnRSZXF1aXJlZF9EZXBlbmRlbnRSZXF1aXJlZD0oe2RlcGVuZGVudFJlcXVpcmVkOnN9KT0+QXJyYXkuaXNBcnJheShzKSYmMCE9PXMubGVuZ3RoP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0tZGVwZW5kZW50UmVxdWlyZWQifSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lLS1wcmltYXJ5In0sIlJlcXVpcmVkIHdoZW4gZGVmaW5lZCIpLFJlLmNyZWF0ZUVsZW1lbnQoInVsIixudWxsLHMubWFwKChzPT5SZS5jcmVhdGVFbGVtZW50KCJsaSIse2tleTpzfSxSZS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX3ZhbHVlIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fdmFsdWUtLXdhcm5pbmcifSxzKSkpKSkpOm51bGwsa2V5d29yZHNfQ29udGVudFNjaGVtYT0oe3NjaGVtYTpzfSk9Pntjb25zdCBvPXVzZUZuKCksaT11c2VDb21wb25lbnQoIkpTT05TY2hlbWEiKTtpZighby5oYXNLZXl3b3JkKHMsImNvbnRlbnRTY2hlbWEiKSlyZXR1cm4gbnVsbDtjb25zdCBhPVJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX25hbWUtLXByaW1hcnkifSwiQ29udGVudCBzY2hlbWEiKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS1jb250ZW50U2NoZW1hIn0sUmUuY3JlYXRlRWxlbWVudChpLHtuYW1lOmEsc2NoZW1hOnMuY29udGVudFNjaGVtYSxpZGVudGlmaWVyOiJjb250ZW50U2NoZW1hIn0pKX0sVGl0bGVfVGl0bGU9KHt0aXRsZTpzPSIiLHNjaGVtYTpvfSk9Pntjb25zdCBpPXVzZUZuKCksYT1zfHxpLmdldFRpdGxlKG8pO3JldHVybiBhP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMl9fdGl0bGUifSxhKTpudWxsfSxrZXl3b3Jkc19EZXNjcmlwdGlvbl9EZXNjcmlwdGlvbj0oe3NjaGVtYTpzfSk9PnM/LmRlc2NyaXB0aW9uP1JlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0tZGVzY3JpcHRpb24ifSxSZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItY29yZS1rZXl3b3JkX192YWx1ZSBqc29uLXNjaGVtYS0yMDIwLTEyLWNvcmUta2V5d29yZF9fdmFsdWUtLXNlY29uZGFyeSJ9LHMuZGVzY3JpcHRpb24pKTpudWxsLERlZmF1bHRfRGVmYXVsdD0oe3NjaGVtYTpzfSk9Pntjb25zdCBvPXVzZUZuKCksaT11c2VDb21wb25lbnQoIkpTT05WaWV3ZXIiKTtyZXR1cm4gby5oYXNLZXl3b3JkKHMsImRlZmF1bHQiKT9SZS5jcmVhdGVFbGVtZW50KGkse25hbWU6IkRlZmF1bHQiLHZhbHVlOnMuZGVmYXVsdCxjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZCBqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQtLWRlZmF1bHQifSk6bnVsbH0sa2V5d29yZHNfRGVwcmVjYXRlZD0oe3NjaGVtYTpzfSk9PiEwIT09cz8uZGVwcmVjYXRlZD9udWxsOlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTJfX2F0dHJpYnV0ZSBqc29uLXNjaGVtYS0yMDIwLTEyX19hdHRyaWJ1dGUtLXdhcm5pbmcifSwiZGVwcmVjYXRlZCIpLGtleXdvcmRzX1JlYWRPbmx5PSh7c2NoZW1hOnN9KT0+ITAhPT1zPy5yZWFkT25seT9udWxsOlJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTJfX2F0dHJpYnV0ZSBqc29uLXNjaGVtYS0yMDIwLTEyX19hdHRyaWJ1dGUtLW11dGVkIn0sInJlYWQtb25seSIpLGtleXdvcmRzX1dyaXRlT25seT0oe3NjaGVtYTpzfSk9PiEwIT09cz8ud3JpdGVPbmx5P251bGw6UmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlIGpzb24tc2NoZW1hLTIwMjAtMTJfX2F0dHJpYnV0ZS0tbXV0ZWQifSwid3JpdGUtb25seSIpLGtleXdvcmRzX0V4YW1wbGVzX0V4YW1wbGVzPSh7c2NoZW1hOnN9KT0+e2NvbnN0IG89cz8uZXhhbXBsZXN8fFtdLGk9dXNlQ29tcG9uZW50KCJKU09OVmlld2VyIik7cmV0dXJuIEFycmF5LmlzQXJyYXkobykmJjAhPT1vLmxlbmd0aD9SZS5jcmVhdGVFbGVtZW50KGkse25hbWU6IkV4YW1wbGVzIix2YWx1ZTpzLmV4YW1wbGVzLGNsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZC0tZXhhbXBsZXMifSk6bnVsbH0sRXh0ZW5zaW9uS2V5d29yZHNfRXh0ZW5zaW9uS2V5d29yZHM9KHtzY2hlbWE6c30pPT57Y29uc3Qgbz11c2VGbigpLGk9IkV4dGVuc2lvbktleXdvcmRzIix7cGF0aDphfT11c2VQYXRoKGkpLHtpc0V4cGFuZGVkOnUsc2V0RXhwYW5kZWQ6XyxzZXRDb2xsYXBzZWQ6d309dXNlSXNFeHBhbmRlZChpKSxbeCxDXT11c2VMZXZlbCgpLGo9dXNlQ29tcG9uZW50KCJBY2NvcmRpb24iKSxMPXVzZUNvbXBvbmVudCgiRXhwYW5kRGVlcEJ1dHRvbiIpLEI9dXNlQ29tcG9uZW50KCJKU09OVmlld2VyIikse3Nob3dFeHRlbnNpb25LZXl3b3JkczokfT11c2VDb25maWcoKSxVPW8uZ2V0RXh0ZW5zaW9uS2V5d29yZHMocyksVj0oMCxSZS51c2VDYWxsYmFjaykoKCgpPT57dT93KCk6XygpfSksW3UsXyx3XSksej0oMCxSZS51c2VDYWxsYmFjaykoKChzLG8pPT57bz9fKHtkZWVwOiEwfSk6dyh7ZGVlcDohMH0pfSksW18sd10pO3JldHVybiAkJiYwIT09VS5sZW5ndGg/UmUuY3JlYXRlRWxlbWVudChfVC5Qcm92aWRlcix7dmFsdWU6YX0sUmUuY3JlYXRlRWxlbWVudChiVC5Qcm92aWRlcix7dmFsdWU6Q30sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmQganNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkLS1leHRlbnNpb24ta2V5d29yZHMiLCJkYXRhLWpzb24tc2NoZW1hLWxldmVsIjp4fSxSZS5jcmVhdGVFbGVtZW50KGose2V4cGFuZGVkOnUsb25DaGFuZ2U6Vn0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19uYW1lIGpzb24tc2NoZW1hLTIwMjAtMTIta2V5d29yZF9fbmFtZS0tZXh0ZW5zaW9uIn0sIkV4dGVuc2lvbiBLZXl3b3JkcyIpKSxSZS5jcmVhdGVFbGVtZW50KEwse2V4cGFuZGVkOnUsb25DbGljazp6fSksUmUuY3JlYXRlRWxlbWVudCgidWwiLHtjbGFzc05hbWU6Sm4oKSgianNvbi1zY2hlbWEtMjAyMC0xMi1rZXl3b3JkX19jaGlsZHJlbiIseyJqc29uLXNjaGVtYS0yMDIwLTEyLWtleXdvcmRfX2NoaWxkcmVuLS1jb2xsYXBzZWQiOiF1fSl9LHUmJlJlLmNyZWF0ZUVsZW1lbnQoUmUuRnJhZ21lbnQsbnVsbCxVLm1hcCgobz0+UmUuY3JlYXRlRWxlbWVudChCLHtrZXk6byxuYW1lOm8sdmFsdWU6c1tvXSxjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItanNvbi12aWV3ZXItZXh0ZW5zaW9uLWtleXdvcmQifSkpKSkpKSkpOm51bGx9LEpTT05WaWV3ZXI9KHtuYW1lOnMsdmFsdWU6byxjbGFzc05hbWU6aX0pPT57Y29uc3QgYT11c2VGbigpLHtwYXRoOnV9PXVzZVBhdGgocykse2lzRXhwYW5kZWQ6XyxzZXRFeHBhbmRlZDp3LHNldENvbGxhcHNlZDp4fT11c2VJc0V4cGFuZGVkKHMpLFtDLGpdPXVzZUxldmVsKCksTD11c2VDb21wb25lbnQoIkFjY29yZGlvbiIpLEI9dXNlQ29tcG9uZW50KCJFeHBhbmREZWVwQnV0dG9uIiksJD0ic3RyaW5nIj09dHlwZW9mIG98fCJudW1iZXIiPT10eXBlb2Ygb3x8ImJpZ2ludCI9PXR5cGVvZiBvfHwiYm9vbGVhbiI9PXR5cGVvZiBvfHwic3ltYm9sIj09dHlwZW9mIG98fG51bGw9PW8sVT0ocz0+Zm5faXNQbGFpbk9iamVjdChzKSYmMD09PU9iamVjdC5rZXlzKHMpLmxlbmd0aCkobyl8fChzPT5BcnJheS5pc0FycmF5KHMpJiYwPT09cy5sZW5ndGgpKG8pLFY9KDAsUmUudXNlQ2FsbGJhY2spKCgoKT0+e18/eCgpOncoKX0pLFtfLHcseF0pLHo9KDAsUmUudXNlQ2FsbGJhY2spKCgocyxvKT0+e28/dyh7ZGVlcDohMH0pOngoe2RlZXA6ITB9KX0pLFt3LHhdKTtyZXR1cm4gJD9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Sm4oKSgianNvbi1zY2hlbWEtMjAyMC0xMi1qc29uLXZpZXdlciIsaSl9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItanNvbi12aWV3ZXJfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1qc29uLXZpZXdlcl9fbmFtZS0tc2Vjb25kYXJ5In0scyksUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1qc29uLXZpZXdlcl9fdmFsdWUganNvbi1zY2hlbWEtMjAyMC0xMi1qc29uLXZpZXdlcl9fdmFsdWUtLXNlY29uZGFyeSJ9LGEuc3RyaW5naWZ5KG8pKSk6VT9SZS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Sm4oKSgianNvbi1zY2hlbWEtMjAyMC0xMi1qc29uLXZpZXdlciIsaSl9LFJlLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItanNvbi12aWV3ZXJfX25hbWUganNvbi1zY2hlbWEtMjAyMC0xMi1qc29uLXZpZXdlcl9fbmFtZS0tc2Vjb25kYXJ5In0scyksUmUuY3JlYXRlRWxlbWVudCgic3Ryb25nIix7Y2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyX19hdHRyaWJ1dGUganNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlLS1wcmltYXJ5In0sQXJyYXkuaXNBcnJheShvKT8iZW1wdHkgYXJyYXkiOiJlbXB0eSBvYmplY3QiKSk6UmUuY3JlYXRlRWxlbWVudChfVC5Qcm92aWRlcix7dmFsdWU6dX0sUmUuY3JlYXRlRWxlbWVudChiVC5Qcm92aWRlcix7dmFsdWU6an0sUmUuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOkpuKCkoImpzb24tc2NoZW1hLTIwMjAtMTItanNvbi12aWV3ZXIiLGkpLCJkYXRhLWpzb24tc2NoZW1hLWxldmVsIjpDfSxSZS5jcmVhdGVFbGVtZW50KEwse2V4cGFuZGVkOl8sb25DaGFuZ2U6Vn0sUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1qc29uLXZpZXdlcl9fbmFtZSBqc29uLXNjaGVtYS0yMDIwLTEyLWpzb24tdmlld2VyX19uYW1lLS1zZWNvbmRhcnkifSxzKSksUmUuY3JlYXRlRWxlbWVudChCLHtleHBhbmRlZDpfLG9uQ2xpY2s6en0pLFJlLmNyZWF0ZUVsZW1lbnQoInN0cm9uZyIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMl9fYXR0cmlidXRlIGpzb24tc2NoZW1hLTIwMjAtMTJfX2F0dHJpYnV0ZS0tcHJpbWFyeSJ9LEFycmF5LmlzQXJyYXkobyk/ImFycmF5Ijoib2JqZWN0IiksUmUuY3JlYXRlRWxlbWVudCgidWwiLHtjbGFzc05hbWU6Sm4oKSgianNvbi1zY2hlbWEtMjAyMC0xMi1qc29uLXZpZXdlcl9fY2hpbGRyZW4iLHsianNvbi1zY2hlbWEtMjAyMC0xMi1qc29uLXZpZXdlcl9fY2hpbGRyZW4tLWNvbGxhcHNlZCI6IV99KX0sXyYmUmUuY3JlYXRlRWxlbWVudChSZS5GcmFnbWVudCxudWxsLEFycmF5LmlzQXJyYXkobyk/by5tYXAoKChzLG8pPT5SZS5jcmVhdGVFbGVtZW50KCJsaSIse2tleTpgIyR7b31gLGNsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1wcm9wZXJ0eSJ9LFJlLmNyZWF0ZUVsZW1lbnQoSlNPTlZpZXdlcix7bmFtZTpgIyR7b31gLHZhbHVlOnMsY2xhc3NOYW1lOml9KSkpKTpPYmplY3QuZW50cmllcyhvKS5tYXAoKChbcyxvXSk9PlJlLmNyZWF0ZUVsZW1lbnQoImxpIix7a2V5OnMsY2xhc3NOYW1lOiJqc29uLXNjaGVtYS0yMDIwLTEyLXByb3BlcnR5In0sUmUuY3JlYXRlRWxlbWVudChKU09OVmlld2VyLHtuYW1lOnMsdmFsdWU6byxjbGFzc05hbWU6aX0pKSkpKSkpKSl9LGtUPUpTT05WaWV3ZXIsQWNjb3JkaW9uX0FjY29yZGlvbj0oe2V4cGFuZGVkOnM9ITEsY2hpbGRyZW46byxvbkNoYW5nZTppfSk9Pntjb25zdCBhPXVzZUNvbXBvbmVudCgiQ2hldnJvblJpZ2h0SWNvbiIpLHU9KDAsUmUudXNlQ2FsbGJhY2spKChvPT57aShvLCFzKX0pLFtzLGldKTtyZXR1cm4gUmUuY3JlYXRlRWxlbWVudCgiYnV0dG9uIix7dHlwZToiYnV0dG9uIixjbGFzc05hbWU6Impzb24tc2NoZW1hLTIwMjAtMTItYWNjb3JkaW9uIixvbkNsaWNrOnV9LFJlLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1hY2NvcmRpb25fX2NoaWxkcmVuIn0sbyksUmUuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZTpKbigpKCJqc29uLXNjaGVtYS0yMDIwLTEyLWFjY29yZGlvbl9faWNvbiIseyJqc29uLXNjaGVtYS0yMDIwLTEyLWFjY29yZGlvbl9faWNvbi0tZXhwYW5kZWQiOnMsImpzb24tc2NoZW1hLTIwMjAtMTItYWNjb3JkaW9uX19pY29uLS1jb2xsYXBzZWQiOiFzfSl9LFJlLmNyZWF0ZUVsZW1lbnQoYSxudWxsKSkpfSxFeHBhbmREZWVwQnV0dG9uX0V4cGFuZERlZXBCdXR0b249KHtleHBhbmRlZDpzLG9uQ2xpY2s6b30pPT57Y29uc3QgaT0oMCxSZS51c2VDYWxsYmFjaykoKGk9PntvKGksIXMpfSksW3Msb10pO3JldHVybiBSZS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHt0eXBlOiJidXR0b24iLGNsYXNzTmFtZToianNvbi1zY2hlbWEtMjAyMC0xMi1leHBhbmQtZGVlcC1idXR0b24iLG9uQ2xpY2s6aX0scz8iQ29sbGFwc2UgYWxsIjoiRXhwYW5kIGFsbCIpfSxpY29uc19DaGV2cm9uUmlnaHQ9KCk9PlJlLmNyZWF0ZUVsZW1lbnQoInN2ZyIse3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6IjI0IixoZWlnaHQ6IjI0Iix2aWV3Qm94OiIwIDAgMjQgMjQifSxSZS5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiJ9KSksd2l0aEpTT05TY2hlbWFDb250ZXh0PShzLG89e30pPT57Y29uc3QgaT17Y29tcG9uZW50czp7SlNPTlNjaGVtYTp3VCxLZXl3b3JkJHNjaGVtYTprZXl3b3Jkc18kc2NoZW1hLEtleXdvcmQkdm9jYWJ1bGFyeTokdm9jYWJ1bGFyeV8kdm9jYWJ1bGFyeSxLZXl3b3JkJGlkOmtleXdvcmRzXyRpZCxLZXl3b3JkJGFuY2hvcjprZXl3b3Jkc18kYW5jaG9yLEtleXdvcmQkZHluYW1pY0FuY2hvcjprZXl3b3Jkc18kZHluYW1pY0FuY2hvcixLZXl3b3JkJHJlZjprZXl3b3Jkc18kcmVmLEtleXdvcmQkZHluYW1pY1JlZjprZXl3b3Jkc18kZHluYW1pY1JlZixLZXl3b3JkJGRlZnM6a2V5d29yZHNfJGRlZnMsS2V5d29yZCRjb21tZW50OmtleXdvcmRzXyRjb21tZW50LEtleXdvcmRBbGxPZjprZXl3b3Jkc19BbGxPZixLZXl3b3JkQW55T2Y6a2V5d29yZHNfQW55T2YsS2V5d29yZE9uZU9mOmtleXdvcmRzX09uZU9mLEtleXdvcmROb3Q6a2V5d29yZHNfTm90LEtleXdvcmRJZjprZXl3b3Jkc19JZixLZXl3b3JkVGhlbjprZXl3b3Jkc19UaGVuLEtleXdvcmRFbHNlOmtleXdvcmRzX0Vsc2UsS2V5d29yZERlcGVuZGVudFNjaGVtYXM6a2V5d29yZHNfRGVwZW5kZW50U2NoZW1hcyxLZXl3b3JkUHJlZml4SXRlbXM6a2V5d29yZHNfUHJlZml4SXRlbXMsS2V5d29yZEl0ZW1zOmtleXdvcmRzX0l0ZW1zLEtleXdvcmRDb250YWluczprZXl3b3Jkc19Db250YWlucyxLZXl3b3JkUHJvcGVydGllczprZXl3b3Jkc19Qcm9wZXJ0aWVzX1Byb3BlcnRpZXMsS2V5d29yZFBhdHRlcm5Qcm9wZXJ0aWVzOlBhdHRlcm5Qcm9wZXJ0aWVzX1BhdHRlcm5Qcm9wZXJ0aWVzLEtleXdvcmRBZGRpdGlvbmFsUHJvcGVydGllczprZXl3b3Jkc19BZGRpdGlvbmFsUHJvcGVydGllcyxLZXl3b3JkUHJvcGVydHlOYW1lczprZXl3b3Jkc19Qcm9wZXJ0eU5hbWVzLEtleXdvcmRVbmV2YWx1YXRlZEl0ZW1zOmtleXdvcmRzX1VuZXZhbHVhdGVkSXRlbXMsS2V5d29yZFVuZXZhbHVhdGVkUHJvcGVydGllczprZXl3b3Jkc19VbmV2YWx1YXRlZFByb3BlcnRpZXMsS2V5d29yZFR5cGU6a2V5d29yZHNfVHlwZSxLZXl3b3JkRW51bTpFbnVtX0VudW0sS2V5d29yZENvbnN0OkNvbnN0X0NvbnN0LEtleXdvcmRDb25zdHJhaW50OnhULEtleXdvcmREZXBlbmRlbnRSZXF1aXJlZDpEZXBlbmRlbnRSZXF1aXJlZF9EZXBlbmRlbnRSZXF1aXJlZCxLZXl3b3JkQ29udGVudFNjaGVtYTprZXl3b3Jkc19Db250ZW50U2NoZW1hLEtleXdvcmRUaXRsZTpUaXRsZV9UaXRsZSxLZXl3b3JkRGVzY3JpcHRpb246a2V5d29yZHNfRGVzY3JpcHRpb25fRGVzY3JpcHRpb24sS2V5d29yZERlZmF1bHQ6RGVmYXVsdF9EZWZhdWx0LEtleXdvcmREZXByZWNhdGVkOmtleXdvcmRzX0RlcHJlY2F0ZWQsS2V5d29yZFJlYWRPbmx5OmtleXdvcmRzX1JlYWRPbmx5LEtleXdvcmRXcml0ZU9ubHk6a2V5d29yZHNfV3JpdGVPbmx5LEtleXdvcmRFeGFtcGxlczprZXl3b3Jkc19FeGFtcGxlc19FeGFtcGxlcyxFeHRlbnNpb25LZXl3b3JkczpFeHRlbnNpb25LZXl3b3Jkc19FeHRlbnNpb25LZXl3b3JkcyxKU09OVmlld2VyOmtULEFjY29yZGlvbjpBY2NvcmRpb25fQWNjb3JkaW9uLEV4cGFuZERlZXBCdXR0b246RXhwYW5kRGVlcEJ1dHRvbl9FeHBhbmREZWVwQnV0dG9uLENoZXZyb25SaWdodEljb246aWNvbnNfQ2hldnJvblJpZ2h0LC4uLm8uY29tcG9uZW50c30sY29uZmlnOntkZWZhdWx0JHNjaGVtYToiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQvMjAyMC0xMi9zY2hlbWEiLGRlZmF1bHRFeHBhbmRlZExldmVsczowLHNob3dFeHRlbnNpb25LZXl3b3JkczohMCwuLi5vLmNvbmZpZ30sZm46e3VwcGVyRmlyc3Q6Zm5fdXBwZXJGaXJzdCxnZXRUaXRsZTptYWtlR2V0VGl0bGUodXNlRm4pLGdldFR5cGU6bWFrZUdldFR5cGUodXNlRm4pLGlzQm9vbGVhbkpTT05TY2hlbWEsaGFzS2V5d29yZCxpc0V4cGFuZGFibGU6Zm5fbWFrZUlzRXhwYW5kYWJsZSh1c2VGbiksc3RyaW5naWZ5OmZuX3N0cmluZ2lmeSxzdHJpbmdpZnlDb25zdHJhaW50cyxnZXREZXBlbmRlbnRSZXF1aXJlZCxnZXRTY2hlbWFLZXl3b3JkcyxnZXRFeHRlbnNpb25LZXl3b3JkczptYWtlR2V0RXh0ZW5zaW9uS2V5d29yZHModXNlRm4pLC4uLm8uZm59LHN0YXRlOntwYXRoczp7fX19LEhPQz1vPT5SZS5jcmVhdGVFbGVtZW50KHZULlByb3ZpZGVyLHt2YWx1ZTppfSxSZS5jcmVhdGVFbGVtZW50KHMsbykpO3JldHVybiBIT0MuY29udGV4dHM9e0pTT05TY2hlbWFDb250ZXh0OnZUfSxIT0MuZGlzcGxheU5hbWU9cy5kaXNwbGF5TmFtZSxIT0N9LG1ha2VXaXRoSlNPTlNjaGVtYVN5c3RlbUNvbnRleHQ9KHtnZXRTeXN0ZW06c30pPT4obyxpPXt9KT0+e2NvbnN0e2dldENvbXBvbmVudDphLGdldENvbmZpZ3M6dX09cygpLF89dSgpLHc9YSgiSlNPTlNjaGVtYTIwMjAxMiIpLHg9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmQkc2NoZW1hIiksQz1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZCR2b2NhYnVsYXJ5Iiksaj1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZCRpZCIpLEw9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmQkYW5jaG9yIiksQj1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZCRkeW5hbWljQW5jaG9yIiksJD1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZCRyZWYiKSxVPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkJGR5bmFtaWNSZWYiKSxWPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkJGRlZnMiKSx6PWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkJGNvbW1lbnQiKSxZPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkQWxsT2YiKSxaPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkQW55T2YiKSxlZT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZE9uZU9mIiksaWU9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmROb3QiKSxhZT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZElmIiksY2U9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmRUaGVuIiksbGU9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmRFbHNlIikscGU9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmREZXBlbmRlbnRTY2hlbWFzIiksZGU9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmRQcmVmaXhJdGVtcyIpLGZlPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkSXRlbXMiKSx5ZT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZENvbnRhaW5zIiksYmU9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmRQcm9wZXJ0aWVzIiksU2U9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmRQYXR0ZXJuUHJvcGVydGllcyIpLF9lPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkQWRkaXRpb25hbFByb3BlcnRpZXMiKSx3ZT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZFByb3BlcnR5TmFtZXMiKSx4ZT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZFVuZXZhbHVhdGVkSXRlbXMiKSxQZT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZFVuZXZhbHVhdGVkUHJvcGVydGllcyIpLFRlPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkVHlwZSIpLFJlPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkRW51bSIpLCRlPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkQ29uc3QiKSxxZT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZENvbnN0cmFpbnQiKSx6ZT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZERlcGVuZGVudFJlcXVpcmVkIiksV2U9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmRDb250ZW50U2NoZW1hIiksSGU9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmRUaXRsZSIpLFllPWEoIkpTT05TY2hlbWEyMDIwMTJLZXl3b3JkRGVzY3JpcHRpb24iKSxYZT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZERlZmF1bHQiKSxRZT1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZERlcHJlY2F0ZWQiKSxldD1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZFJlYWRPbmx5IiksdHQ9YSgiSlNPTlNjaGVtYTIwMjAxMktleXdvcmRXcml0ZU9ubHkiKSxydD1hKCJKU09OU2NoZW1hMjAyMDEyS2V5d29yZEV4YW1wbGVzIiksbnQ9YSgiSlNPTlNjaGVtYTIwMjAxMkV4dGVuc2lvbktleXdvcmRzIiksc3Q9YSgiSlNPTlNjaGVtYTIwMjAxMkpTT05WaWV3ZXIiKSxvdD1hKCJKU09OU2NoZW1hMjAyMDEyQWNjb3JkaW9uIiksaXQ9YSgiSlNPTlNjaGVtYTIwMjAxMkV4cGFuZERlZXBCdXR0b24iKSxhdD1hKCJKU09OU2NoZW1hMjAyMDEyQ2hldnJvblJpZ2h0SWNvbiIpO3JldHVybiB3aXRoSlNPTlNjaGVtYUNvbnRleHQobyx7Y29tcG9uZW50czp7SlNPTlNjaGVtYTp3LEtleXdvcmQkc2NoZW1hOngsS2V5d29yZCR2b2NhYnVsYXJ5OkMsS2V5d29yZCRpZDpqLEtleXdvcmQkYW5jaG9yOkwsS2V5d29yZCRkeW5hbWljQW5jaG9yOkIsS2V5d29yZCRyZWY6JCxLZXl3b3JkJGR5bmFtaWNSZWY6VSxLZXl3b3JkJGRlZnM6VixLZXl3b3JkJGNvbW1lbnQ6eixLZXl3b3JkQWxsT2Y6WSxLZXl3b3JkQW55T2Y6WixLZXl3b3JkT25lT2Y6ZWUsS2V5d29yZE5vdDppZSxLZXl3b3JkSWY6YWUsS2V5d29yZFRoZW46Y2UsS2V5d29yZEVsc2U6bGUsS2V5d29yZERlcGVuZGVudFNjaGVtYXM6cGUsS2V5d29yZFByZWZpeEl0ZW1zOmRlLEtleXdvcmRJdGVtczpmZSxLZXl3b3JkQ29udGFpbnM6eWUsS2V5d29yZFByb3BlcnRpZXM6YmUsS2V5d29yZFBhdHRlcm5Qcm9wZXJ0aWVzOlNlLEtleXdvcmRBZGRpdGlvbmFsUHJvcGVydGllczpfZSxLZXl3b3JkUHJvcGVydHlOYW1lczp3ZSxLZXl3b3JkVW5ldmFsdWF0ZWRJdGVtczp4ZSxLZXl3b3JkVW5ldmFsdWF0ZWRQcm9wZXJ0aWVzOlBlLEtleXdvcmRUeXBlOlRlLEtleXdvcmRFbnVtOlJlLEtleXdvcmRDb25zdDokZSxLZXl3b3JkQ29uc3RyYWludDpxZSxLZXl3b3JkRGVwZW5kZW50UmVxdWlyZWQ6emUsS2V5d29yZENvbnRlbnRTY2hlbWE6V2UsS2V5d29yZFRpdGxlOkhlLEtleXdvcmREZXNjcmlwdGlvbjpZZSxLZXl3b3JkRGVmYXVsdDpYZSxLZXl3b3JkRGVwcmVjYXRlZDpRZSxLZXl3b3JkUmVhZE9ubHk6ZXQsS2V5d29yZFdyaXRlT25seTp0dCxLZXl3b3JkRXhhbXBsZXM6cnQsRXh0ZW5zaW9uS2V5d29yZHM6bnQsSlNPTlZpZXdlcjpzdCxBY2NvcmRpb246b3QsRXhwYW5kRGVlcEJ1dHRvbjppdCxDaGV2cm9uUmlnaHRJY29uOmF0LC4uLmkuY29tcG9uZW50c30sY29uZmlnOntzaG93RXh0ZW5zaW9uS2V5d29yZHM6Xy5zaG93RXh0ZW5zaW9ucywuLi5pLmNvbmZpZ30sZm46ey4uLmkuZm59fSl9LGpzb25fc2NoZW1hXzIwMjBfMTI9KHtnZXRTeXN0ZW06cyxmbjpvfSk9Pntjb25zdCBmbkFjY2Vzc29yPSgpPT4oe3VwcGVyRmlyc3Q6by51cHBlckZpcnN0LC4uLm8uanNvblNjaGVtYTIwMjAxMn0pO3JldHVybntjb21wb25lbnRzOntKU09OU2NoZW1hMjAyMDEyOndULEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkJHNjaGVtYTprZXl3b3Jkc18kc2NoZW1hLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkJHZvY2FidWxhcnk6JHZvY2FidWxhcnlfJHZvY2FidWxhcnksSlNPTlNjaGVtYTIwMjAxMktleXdvcmQkaWQ6a2V5d29yZHNfJGlkLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkJGFuY2hvcjprZXl3b3Jkc18kYW5jaG9yLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkJGR5bmFtaWNBbmNob3I6a2V5d29yZHNfJGR5bmFtaWNBbmNob3IsSlNPTlNjaGVtYTIwMjAxMktleXdvcmQkcmVmOmtleXdvcmRzXyRyZWYsSlNPTlNjaGVtYTIwMjAxMktleXdvcmQkZHluYW1pY1JlZjprZXl3b3Jkc18kZHluYW1pY1JlZixKU09OU2NoZW1hMjAyMDEyS2V5d29yZCRkZWZzOmtleXdvcmRzXyRkZWZzLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkJGNvbW1lbnQ6a2V5d29yZHNfJGNvbW1lbnQsSlNPTlNjaGVtYTIwMjAxMktleXdvcmRBbGxPZjprZXl3b3Jkc19BbGxPZixKU09OU2NoZW1hMjAyMDEyS2V5d29yZEFueU9mOmtleXdvcmRzX0FueU9mLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkT25lT2Y6a2V5d29yZHNfT25lT2YsSlNPTlNjaGVtYTIwMjAxMktleXdvcmROb3Q6a2V5d29yZHNfTm90LEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkSWY6a2V5d29yZHNfSWYsSlNPTlNjaGVtYTIwMjAxMktleXdvcmRUaGVuOmtleXdvcmRzX1RoZW4sSlNPTlNjaGVtYTIwMjAxMktleXdvcmRFbHNlOmtleXdvcmRzX0Vsc2UsSlNPTlNjaGVtYTIwMjAxMktleXdvcmREZXBlbmRlbnRTY2hlbWFzOmtleXdvcmRzX0RlcGVuZGVudFNjaGVtYXMsSlNPTlNjaGVtYTIwMjAxMktleXdvcmRQcmVmaXhJdGVtczprZXl3b3Jkc19QcmVmaXhJdGVtcyxKU09OU2NoZW1hMjAyMDEyS2V5d29yZEl0ZW1zOmtleXdvcmRzX0l0ZW1zLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkQ29udGFpbnM6a2V5d29yZHNfQ29udGFpbnMsSlNPTlNjaGVtYTIwMjAxMktleXdvcmRQcm9wZXJ0aWVzOmtleXdvcmRzX1Byb3BlcnRpZXNfUHJvcGVydGllcyxKU09OU2NoZW1hMjAyMDEyS2V5d29yZFBhdHRlcm5Qcm9wZXJ0aWVzOlBhdHRlcm5Qcm9wZXJ0aWVzX1BhdHRlcm5Qcm9wZXJ0aWVzLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkQWRkaXRpb25hbFByb3BlcnRpZXM6a2V5d29yZHNfQWRkaXRpb25hbFByb3BlcnRpZXMsSlNPTlNjaGVtYTIwMjAxMktleXdvcmRQcm9wZXJ0eU5hbWVzOmtleXdvcmRzX1Byb3BlcnR5TmFtZXMsSlNPTlNjaGVtYTIwMjAxMktleXdvcmRVbmV2YWx1YXRlZEl0ZW1zOmtleXdvcmRzX1VuZXZhbHVhdGVkSXRlbXMsSlNPTlNjaGVtYTIwMjAxMktleXdvcmRVbmV2YWx1YXRlZFByb3BlcnRpZXM6a2V5d29yZHNfVW5ldmFsdWF0ZWRQcm9wZXJ0aWVzLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkVHlwZTprZXl3b3Jkc19UeXBlLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkRW51bTpFbnVtX0VudW0sSlNPTlNjaGVtYTIwMjAxMktleXdvcmRDb25zdDpDb25zdF9Db25zdCxKU09OU2NoZW1hMjAyMDEyS2V5d29yZENvbnN0cmFpbnQ6eFQsSlNPTlNjaGVtYTIwMjAxMktleXdvcmREZXBlbmRlbnRSZXF1aXJlZDpEZXBlbmRlbnRSZXF1aXJlZF9EZXBlbmRlbnRSZXF1aXJlZCxKU09OU2NoZW1hMjAyMDEyS2V5d29yZENvbnRlbnRTY2hlbWE6a2V5d29yZHNfQ29udGVudFNjaGVtYSxKU09OU2NoZW1hMjAyMDEyS2V5d29yZFRpdGxlOlRpdGxlX1RpdGxlLEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkRGVzY3JpcHRpb246a2V5d29yZHNfRGVzY3JpcHRpb25fRGVzY3JpcHRpb24sSlNPTlNjaGVtYTIwMjAxMktleXdvcmREZWZhdWx0OkRlZmF1bHRfRGVmYXVsdCxKU09OU2NoZW1hMjAyMDEyS2V5d29yZERlcHJlY2F0ZWQ6a2V5d29yZHNfRGVwcmVjYXRlZCxKU09OU2NoZW1hMjAyMDEyS2V5d29yZFJlYWRPbmx5OmtleXdvcmRzX1JlYWRPbmx5LEpTT05TY2hlbWEyMDIwMTJLZXl3b3JkV3JpdGVPbmx5OmtleXdvcmRzX1dyaXRlT25seSxKU09OU2NoZW1hMjAyMDEyS2V5d29yZEV4YW1wbGVzOmtleXdvcmRzX0V4YW1wbGVzX0V4YW1wbGVzLEpTT05TY2hlbWEyMDIwMTJFeHRlbnNpb25LZXl3b3JkczpFeHRlbnNpb25LZXl3b3Jkc19FeHRlbnNpb25LZXl3b3JkcyxKU09OU2NoZW1hMjAyMDEySlNPTlZpZXdlcjprVCxKU09OU2NoZW1hMjAyMDEyQWNjb3JkaW9uOkFjY29yZGlvbl9BY2NvcmRpb24sSlNPTlNjaGVtYTIwMjAxMkV4cGFuZERlZXBCdXR0b246RXhwYW5kRGVlcEJ1dHRvbl9FeHBhbmREZWVwQnV0dG9uLEpTT05TY2hlbWEyMDIwMTJDaGV2cm9uUmlnaHRJY29uOmljb25zX0NoZXZyb25SaWdodCx3aXRoSlNPTlNjaGVtYTIwMjAxMkNvbnRleHQ6d2l0aEpTT05TY2hlbWFDb250ZXh0LHdpdGhKU09OU2NoZW1hMjAyMDEyU3lzdGVtQ29udGV4dDptYWtlV2l0aEpTT05TY2hlbWFTeXN0ZW1Db250ZXh0KHMoKSksSlNPTlNjaGVtYTIwMjAxMlBhdGhDb250ZXh0OigpPT5fVCxKU09OU2NoZW1hMjAyMDEyTGV2ZWxDb250ZXh0OigpPT5iVH0sZm46e3VwcGVyRmlyc3Q6Zm5fdXBwZXJGaXJzdCxqc29uU2NoZW1hMjAyMDEyOntnZXRUaXRsZTptYWtlR2V0VGl0bGUoZm5BY2Nlc3NvciksZ2V0VHlwZTptYWtlR2V0VHlwZShmbkFjY2Vzc29yKSxpc0V4cGFuZGFibGU6Zm5fbWFrZUlzRXhwYW5kYWJsZShmbkFjY2Vzc29yKSxpc0Jvb2xlYW5KU09OU2NoZW1hLGhhc0tleXdvcmQsdXNlRm4sdXNlQ29uZmlnLHVzZUNvbXBvbmVudCx1c2VJc0V4cGFuZGVkLHVzZVBhdGgsdXNlTGV2ZWwsZ2V0U2NoZW1hS2V5d29yZHMsZ2V0RXh0ZW5zaW9uS2V5d29yZHM6bWFrZUdldEV4dGVuc2lvbktleXdvcmRzKGZuQWNjZXNzb3IpLGhhc1NjaGVtYVR5cGU6Zm5faGFzU2NoZW1hVHlwZX19fX0sYXJyYXk9KHMse3NhbXBsZTpvPVtdfT17fSk9PigocyxvPXt9KT0+e2NvbnN0e21pbkl0ZW1zOmksbWF4SXRlbXM6YSx1bmlxdWVJdGVtczp1fT1vLHtjb250YWluczpfLG1pbkNvbnRhaW5zOncsbWF4Q29udGFpbnM6eH09bztsZXQgQz1bLi4uc107aWYobnVsbCE9XyYmIm9iamVjdCI9PXR5cGVvZiBfKXtpZihOdW1iZXIuaXNJbnRlZ2VyKHcpJiZ3PjEpe2NvbnN0IHM9Qy5hdCgwKTtmb3IobGV0IG89MTtvPHc7bys9MSlDLnVuc2hpZnQocyl9TnVtYmVyLmlzSW50ZWdlcih4KX1pZihOdW1iZXIuaXNJbnRlZ2VyKGEpJiZhPjAmJihDPXMuc2xpY2UoMCxhKSksTnVtYmVyLmlzSW50ZWdlcihpKSYmaT4wKWZvcihsZXQgcz0wO0MubGVuZ3RoPGk7cys9MSlDLnB1c2goQ1tzJUMubGVuZ3RoXSk7cmV0dXJuITA9PT11JiYoQz1BcnJheS5mcm9tKG5ldyBTZXQoQykpKSxDfSkobyxzKSxvYmplY3Q9KCk9Pnt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfSxieXRlcz1zPT54dCgpKHMpLHJhbmRvbV9waWNrPXM9PnMuYXQoMCkscHJlZGljYXRlc19pc0Jvb2xlYW5KU09OU2NoZW1hPXM9PiJib29sZWFuIj09dHlwZW9mIHMsaXNKU09OU2NoZW1hT2JqZWN0PXM9PmFzKCkocyksaXNKU09OU2NoZW1hPXM9PnByZWRpY2F0ZXNfaXNCb29sZWFuSlNPTlNjaGVtYShzKXx8aXNKU09OU2NoZW1hT2JqZWN0KHMpO2NvbnN0IE9UPWNsYXNzIFJlZ2lzdHJ5e2RhdGE9e307cmVnaXN0ZXIocyxvKXt0aGlzLmRhdGFbc109b311bnJlZ2lzdGVyKHMpe3ZvaWQgMD09PXM/dGhpcy5kYXRhPXt9OmRlbGV0ZSB0aGlzLmRhdGFbc119Z2V0KHMpe3JldHVybiB0aGlzLmRhdGFbc119fSxpbnQzMj0oKT0+MCxpbnQ2ND0oKT0+MCxnZW5lcmF0b3JzX2Zsb2F0PSgpPT4uMSxnZW5lcmF0b3JzX2RvdWJsZT0oKT0+LjEsZW1haWw9KCk9PiJ1c2VyQGV4YW1wbGUuY29tIixpZG5fZW1haWw9KCk9PiLsi6TroYBAZXhhbXBsZS5jb20iLGhvc3RuYW1lPSgpPT4iZXhhbXBsZS5jb20iLGlkbl9ob3N0bmFtZT0oKT0+IuyLpOuhgC5jb20iLGlwdjQ9KCk9PiIxOTguNTEuMTAwLjQyIixpcHY2PSgpPT4iMjAwMTowZGI4OjViOTY6MDAwMDowMDAwOjQyNmY6OGUxNzo2NDJhIix1cmk9KCk9PiJodHRwczovL2V4YW1wbGUuY29tLyIsdXJpX3JlZmVyZW5jZT0oKT0+InBhdGgvaW5kZXguaHRtbCIsaXJpPSgpPT4iaHR0cHM6Ly/si6TroYAuY29tLyIsaXJpX3JlZmVyZW5jZT0oKT0+InBhdGgv7Iuk66GALmh0bWwiLHV1aWQ9KCk9PiIzZmE4NWY2NC01NzE3LTQ1NjItYjNmYy0yYzk2M2Y2NmFmYTYiLHVyaV90ZW1wbGF0ZT0oKT0+Imh0dHBzOi8vZXhhbXBsZS5jb20vZGljdGlvbmFyeS97dGVybToxfS97dGVybX0iLGdlbmVyYXRvcnNfanNvbl9wb2ludGVyPSgpPT4iL2EvYi9jIixyZWxhdGl2ZV9qc29uX3BvaW50ZXI9KCk9PiIxLzAiLGRhdGVfdGltZT0oKT0+KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLGRhdGU9KCk9PihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwxMCksdGltZT0oKT0+KG5ldyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygxMSksZHVyYXRpb249KCk9PiJQM0QiLGdlbmVyYXRvcnNfcGFzc3dvcmQ9KCk9PiIqKioqKioqKiIscmVnZXg9KCk9PiJeW2Etel0rJCI7Y29uc3QgQVQ9bmV3IGNsYXNzIEZvcm1hdFJlZ2lzdHJ5IGV4dGVuZHMgT1R7I3M9e2ludDMyLGludDY0LGZsb2F0OmdlbmVyYXRvcnNfZmxvYXQsZG91YmxlOmdlbmVyYXRvcnNfZG91YmxlLGVtYWlsLCJpZG4tZW1haWwiOmlkbl9lbWFpbCxob3N0bmFtZSwiaWRuLWhvc3RuYW1lIjppZG5faG9zdG5hbWUsaXB2NCxpcHY2LHVyaSwidXJpLXJlZmVyZW5jZSI6dXJpX3JlZmVyZW5jZSxpcmksImlyaS1yZWZlcmVuY2UiOmlyaV9yZWZlcmVuY2UsdXVpZCwidXJpLXRlbXBsYXRlIjp1cmlfdGVtcGxhdGUsImpzb24tcG9pbnRlciI6Z2VuZXJhdG9yc19qc29uX3BvaW50ZXIsInJlbGF0aXZlLWpzb24tcG9pbnRlciI6cmVsYXRpdmVfanNvbl9wb2ludGVyLCJkYXRlLXRpbWUiOmRhdGVfdGltZSxkYXRlLHRpbWUsZHVyYXRpb24scGFzc3dvcmQ6Z2VuZXJhdG9yc19wYXNzd29yZCxyZWdleH07ZGF0YT17Li4udGhpcy4jc307Z2V0IGRlZmF1bHRzKCl7cmV0dXJuey4uLnRoaXMuI3N9fX0sZm9ybWF0QVBJPShzLG8pPT4iZnVuY3Rpb24iPT10eXBlb2Ygbz9BVC5yZWdpc3RlcihzLG8pOm51bGw9PT1vP0FULnVucmVnaXN0ZXIocyk6QVQuZ2V0KHMpO2Zvcm1hdEFQSS5nZXREZWZhdWx0cz0oKT0+QVQuZGVmYXVsdHM7Y29uc3QgQ1Q9Zm9ybWF0QVBJO3ZhciBqVD1fX3dlYnBhY2tfcmVxdWlyZV9fKDQ4Mjg3KS5CdWZmZXI7Y29uc3QgXzdiaXQ9cz0+alQuZnJvbShzKS50b1N0cmluZygiYXNjaWkiKTt2YXIgUFQ9X193ZWJwYWNrX3JlcXVpcmVfXyg0ODI4NykuQnVmZmVyO2NvbnN0IF84Yml0PXM9PlBULmZyb20ocykudG9TdHJpbmcoInV0ZjgiKTt2YXIgSVQ9X193ZWJwYWNrX3JlcXVpcmVfXyg0ODI4NykuQnVmZmVyO2NvbnN0IGVuY29kZXJzX2JpbmFyeT1zPT5JVC5mcm9tKHMpLnRvU3RyaW5nKCJiaW5hcnkiKSxxdW90ZWRfcHJpbnRhYmxlPXM9PntsZXQgbz0iIjtmb3IobGV0IGk9MDtpPHMubGVuZ3RoO2krKyl7Y29uc3QgYT1zLmNoYXJDb2RlQXQoaSk7aWYoNjE9PT1hKW8rPSI9M0QiO2Vsc2UgaWYoYT49MzMmJmE8PTYwfHxhPj02MiYmYTw9MTI2fHw5PT09YXx8MzI9PT1hKW8rPXMuY2hhckF0KGkpO2Vsc2UgaWYoMTM9PT1hfHwxMD09PWEpbys9IlxyXG4iO2Vsc2UgaWYoYT4xMjYpe2NvbnN0IGE9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHMuY2hhckF0KGkpKSk7Zm9yKGxldCBzPTA7czxhLmxlbmd0aDtzKyspbys9Ij0iKygiMCIrYS5jaGFyQ29kZUF0KHMpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpLnRvVXBwZXJDYXNlKCl9ZWxzZSBvKz0iPSIrKCIwIithLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpLnRvVXBwZXJDYXNlKCl9cmV0dXJuIG99O3ZhciBUVD1fX3dlYnBhY2tfcmVxdWlyZV9fKDQ4Mjg3KS5CdWZmZXI7Y29uc3QgYmFzZTE2PXM9PlRULmZyb20ocykudG9TdHJpbmcoImhleCIpO3ZhciBOVD1fX3dlYnBhY2tfcmVxdWlyZV9fKDQ4Mjg3KS5CdWZmZXI7Y29uc3QgYmFzZTMyPXM9Pntjb25zdCBvPU5ULmZyb20ocykudG9TdHJpbmcoInV0ZjgiKSxpPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjIzNDU2NyI7bGV0IGE9MCx1PSIiLF89MCx3PTA7Zm9yKGxldCBzPTA7czxvLmxlbmd0aDtzKyspZm9yKF89Xzw8OHxvLmNoYXJDb2RlQXQocyksdys9ODt3Pj01Oyl1Kz1pLmNoYXJBdChfPj4+dy01JjMxKSx3LT01O3c+MCYmKHUrPWkuY2hhckF0KF88PDUtdyYzMSksYT0oOC04Km8ubGVuZ3RoJTUpJTUpO2ZvcihsZXQgcz0wO3M8YTtzKyspdSs9Ij0iO3JldHVybiB1fTt2YXIgTVQ9X193ZWJwYWNrX3JlcXVpcmVfXyg0ODI4NykuQnVmZmVyO2NvbnN0IGJhc2U2ND1zPT5NVC5mcm9tKHMpLnRvU3RyaW5nKCJiYXNlNjQiKTt2YXIgUlQ9X193ZWJwYWNrX3JlcXVpcmVfXyg0ODI4NykuQnVmZmVyO2NvbnN0IGJhc2U2NHVybD1zPT5SVC5mcm9tKHMpLnRvU3RyaW5nKCJiYXNlNjR1cmwiKTtjb25zdCBEVD1uZXcgY2xhc3MgRW5jb2RlclJlZ2lzdHJ5IGV4dGVuZHMgT1R7I3M9eyI3Yml0IjpfN2JpdCwiOGJpdCI6XzhiaXQsYmluYXJ5OmVuY29kZXJzX2JpbmFyeSwicXVvdGVkLXByaW50YWJsZSI6cXVvdGVkX3ByaW50YWJsZSxiYXNlMTYsYmFzZTMyLGJhc2U2NCxiYXNlNjR1cmx9O2RhdGE9ey4uLnRoaXMuI3N9O2dldCBkZWZhdWx0cygpe3JldHVybnsuLi50aGlzLiNzfX19LGVuY29kZXJBUEk9KHMsbyk9PiJmdW5jdGlvbiI9PXR5cGVvZiBvP0RULnJlZ2lzdGVyKHMsbyk6bnVsbD09PW8/RFQudW5yZWdpc3RlcihzKTpEVC5nZXQocyk7ZW5jb2RlckFQSS5nZXREZWZhdWx0cz0oKT0+RFQuZGVmYXVsdHM7Y29uc3QgTFQ9ZW5jb2RlckFQSSxGVD17InRleHQvcGxhaW4iOigpPT4ic3RyaW5nIiwidGV4dC9jc3MiOigpPT4iLnNlbGVjdG9yIHsgYm9yZGVyOiAxcHggc29saWQgcmVkIH0iLCJ0ZXh0L2NzdiI6KCk9PiJ2YWx1ZTEsdmFsdWUyLHZhbHVlMyIsInRleHQvaHRtbCI6KCk9PiI8cD5jb250ZW50PC9wPiIsInRleHQvY2FsZW5kYXIiOigpPT4iQkVHSU46VkNBTEVOREFSIiwidGV4dC9qYXZhc2NyaXB0IjooKT0+ImNvbnNvbGUuZGlyKCdIZWxsbyB3b3JsZCEnKTsiLCJ0ZXh0L3htbCI6KCk9Pic8cGVyc29uIGFnZT0iMzAiPkpvaG4gRG9lPC9wZXJzb24+JywidGV4dC8qIjooKT0+InN0cmluZyJ9LEJUPXsiaW1hZ2UvKiI6KCk9PmJ5dGVzKDI1KS50b1N0cmluZygiYmluYXJ5Iil9LCRUPXsiYXVkaW8vKiI6KCk9PmJ5dGVzKDI1KS50b1N0cmluZygiYmluYXJ5Iil9LHFUPXsidmlkZW8vKiI6KCk9PmJ5dGVzKDI1KS50b1N0cmluZygiYmluYXJ5Iil9LFVUPXsiYXBwbGljYXRpb24vanNvbiI6KCk9Pid7ImtleSI6InZhbHVlIn0nLCJhcHBsaWNhdGlvbi9sZCtqc29uIjooKT0+J3sibmFtZSI6ICJKb2huIERvZSJ9JywiYXBwbGljYXRpb24veC1odHRwZC1waHAiOigpPT4iPD9waHAgZWNobyAnPHA+SGVsbG8gV29ybGQhPC9wPic7ID8+IiwiYXBwbGljYXRpb24vcnRmIjooKT0+U3RyaW5nLnJhd2B7XHJ0ZjFcYWRlZmxhbmcxMDI1XGFuc2lcYW5zaWNwZzEyNTJcdWMxYCwiYXBwbGljYXRpb24veC1zaCI6KCk9PidlY2hvICJIZWxsbyBXb3JsZCEiJywiYXBwbGljYXRpb24veGh0bWwreG1sIjooKT0+IjxwPmNvbnRlbnQ8L3A+IiwiYXBwbGljYXRpb24vKiI6KCk9PmJ5dGVzKDI1KS50b1N0cmluZygiYmluYXJ5Iil9O2NvbnN0IFZUPW5ldyBjbGFzcyBNZWRpYVR5cGVSZWdpc3RyeSBleHRlbmRzIE9UeyNzPXsuLi5GVCwuLi5CVCwuLi4kVCwuLi5xVCwuLi5VVH07ZGF0YT17Li4udGhpcy4jc307Z2V0IGRlZmF1bHRzKCl7cmV0dXJuey4uLnRoaXMuI3N9fX0sbWVkaWFUeXBlQVBJPShzLG8pPT57aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8pcmV0dXJuIFZULnJlZ2lzdGVyKHMsbyk7aWYobnVsbD09PW8pcmV0dXJuIFZULnVucmVnaXN0ZXIocyk7Y29uc3QgaT1zLnNwbGl0KCI7IikuYXQoMCksYT1gJHtpLnNwbGl0KCIvIikuYXQoMCl9LypgO3JldHVybiBWVC5nZXQocyl8fFZULmdldChpKXx8VlQuZ2V0KGEpfTttZWRpYVR5cGVBUEkuZ2V0RGVmYXVsdHM9KCk9PlZULmRlZmF1bHRzO2NvbnN0IHpUPW1lZGlhVHlwZUFQSSxhcHBseVN0cmluZ0NvbnN0cmFpbnRzPShzLG89e30pPT57Y29uc3R7bWF4TGVuZ3RoOmksbWluTGVuZ3RoOmF9PW87bGV0IHU9cztpZihOdW1iZXIuaXNJbnRlZ2VyKGkpJiZpPjAmJih1PXUuc2xpY2UoMCxpKSksTnVtYmVyLmlzSW50ZWdlcihhKSYmYT4wKXtsZXQgcz0wO2Zvcig7dS5sZW5ndGg8YTspdSs9dVtzKysldS5sZW5ndGhdfXJldHVybiB1fSx0eXBlc19zdHJpbmc9KHMse3NhbXBsZTpvfT17fSk9Pntjb25zdHtjb250ZW50RW5jb2Rpbmc6aSxjb250ZW50TWVkaWFUeXBlOmEsY29udGVudFNjaGVtYTp1fT1zLHtwYXR0ZXJuOl8sZm9ybWF0Ond9PXMseD1MVChpKXx8ZE8oKTtsZXQgQztyZXR1cm4gQz0ic3RyaW5nIj09dHlwZW9mIF8/YXBwbHlTdHJpbmdDb25zdHJhaW50cygocz0+e3RyeXtjb25zdCBvPS8oPzw9KD88IVxcKVx7KShcZHszLH0pKD89XH0pfCg/PD0oPzwhXFwpXHtcZCosKShcZHszLH0pKD89XH0pfCg/PD0oPzwhXFwpXHspKFxkezMsfSkoPz0sXGQqXH0pL2csaT1zLnJlcGxhY2UobywiMTAwIiksYT1uZXcocHMoKSkoaSk7cmV0dXJuIGEubWF4PTEwMCxhLmdlbigpfWNhdGNoe3JldHVybiJzdHJpbmcifX0pKF8pLHMpOiJzdHJpbmciPT10eXBlb2Ygdz8ocz0+e2NvbnN0e2Zvcm1hdDpvfT1zLGk9Q1Qobyk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGk/aShzKToic3RyaW5nIn0pKHMpOmlzSlNPTlNjaGVtYSh1KSYmInN0cmluZyI9PXR5cGVvZiBhJiZ2b2lkIDAhPT1vP0FycmF5LmlzQXJyYXkobyl8fCJvYmplY3QiPT10eXBlb2Ygbz9KU09OLnN0cmluZ2lmeShvKTphcHBseVN0cmluZ0NvbnN0cmFpbnRzKFN0cmluZyhvKSxzKToic3RyaW5nIj09dHlwZW9mIGE/KHM9Pntjb25zdHtjb250ZW50TWVkaWFUeXBlOm99PXMsaT16VChvKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgaT9pKHMpOiJzdHJpbmcifSkocyk6YXBwbHlTdHJpbmdDb25zdHJhaW50cygic3RyaW5nIixzKSx4KEMpfSxhcHBseU51bWJlckNvbnN0cmFpbnRzPShzLG89e30pPT57Y29uc3R7bWluaW11bTppLG1heGltdW06YSxleGNsdXNpdmVNaW5pbXVtOnUsZXhjbHVzaXZlTWF4aW11bTpffT1vLHttdWx0aXBsZU9mOnd9PW8seD1OdW1iZXIuaXNJbnRlZ2VyKHMpPzE6TnVtYmVyLkVQU0lMT047bGV0IEM9Im51bWJlciI9PXR5cGVvZiBpP2k6bnVsbCxqPSJudW1iZXIiPT10eXBlb2YgYT9hOm51bGwsTD1zO2lmKCJudW1iZXIiPT10eXBlb2YgdSYmKEM9bnVsbCE9PUM/TWF0aC5tYXgoQyx1K3gpOnUreCksIm51bWJlciI9PXR5cGVvZiBfJiYoaj1udWxsIT09aj9NYXRoLm1pbihqLF8teCk6Xy14KSxMPUM+aiYmc3x8Q3x8anx8TCwibnVtYmVyIj09dHlwZW9mIHcmJnc+MCl7Y29uc3Qgcz1MJXc7TD0wPT09cz9MOkwrdy1zfXJldHVybiBMfSx0eXBlc19udW1iZXI9cz0+e2NvbnN0e2Zvcm1hdDpvfT1zO2xldCBpO3JldHVybiBpPSJzdHJpbmciPT10eXBlb2Ygbz8ocz0+e2NvbnN0e2Zvcm1hdDpvfT1zLGk9Q1Qobyk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGk/aShzKTowfSkocyk6MCxhcHBseU51bWJlckNvbnN0cmFpbnRzKGkscyl9LHR5cGVzX2ludGVnZXI9cz0+e2NvbnN0e2Zvcm1hdDpvfT1zO2xldCBpO3JldHVybiBpPSJzdHJpbmciPT10eXBlb2Ygbz8ocz0+e2NvbnN0e2Zvcm1hdDpvfT1zLGk9Q1Qobyk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGkpcmV0dXJuIGkocyk7c3dpdGNoKG8pe2Nhc2UiaW50MzIiOnJldHVybiBpbnQzMigpO2Nhc2UiaW50NjQiOnJldHVybiBpbnQ2NCgpfXJldHVybiAwfSkocyk6MCxhcHBseU51bWJlckNvbnN0cmFpbnRzKGkscyl9LHR5cGVzX2Jvb2xlYW49cz0+ImJvb2xlYW4iIT10eXBlb2Ygcy5kZWZhdWx0fHxzLmRlZmF1bHQsV1Q9bmV3IFByb3h5KHthcnJheSxvYmplY3Qsc3RyaW5nOnR5cGVzX3N0cmluZyxudW1iZXI6dHlwZXNfbnVtYmVyLGludGVnZXI6dHlwZXNfaW50ZWdlcixib29sZWFuOnR5cGVzX2Jvb2xlYW4sbnVsbDooKT0+bnVsbH0se2dldDoocyxvKT0+InN0cmluZyI9PXR5cGVvZiBvJiZPYmplY3QuaGFzT3duKHMsbyk/c1tvXTooKT0+YFVua25vd24gVHlwZTogJHtvfWB9KSxKVD1bImFycmF5Iiwib2JqZWN0IiwibnVtYmVyIiwiaW50ZWdlciIsInN0cmluZyIsImJvb2xlYW4iLCJudWxsIl0saGFzRXhhbXBsZT1zPT57aWYoIWlzSlNPTlNjaGVtYU9iamVjdChzKSlyZXR1cm4hMTtjb25zdHtleGFtcGxlczpvLGV4YW1wbGU6aSxkZWZhdWx0OmF9PXM7cmV0dXJuISEoQXJyYXkuaXNBcnJheShvKSYmby5sZW5ndGg+PTEpfHwodm9pZCAwIT09YXx8dm9pZCAwIT09aSl9LGV4dHJhY3RFeGFtcGxlPXM9PntpZighaXNKU09OU2NoZW1hT2JqZWN0KHMpKXJldHVybiBudWxsO2NvbnN0e2V4YW1wbGVzOm8sZXhhbXBsZTppLGRlZmF1bHQ6YX09cztyZXR1cm4gQXJyYXkuaXNBcnJheShvKSYmby5sZW5ndGg+PTE/by5hdCgwKTp2b2lkIDAhPT1hP2E6dm9pZCAwIT09aT9pOnZvaWQgMH0sSFQ9e2FycmF5OlsiaXRlbXMiLCJwcmVmaXhJdGVtcyIsImNvbnRhaW5zIiwibWF4Q29udGFpbnMiLCJtaW5Db250YWlucyIsIm1heEl0ZW1zIiwibWluSXRlbXMiLCJ1bmlxdWVJdGVtcyIsInVuZXZhbHVhdGVkSXRlbXMiXSxvYmplY3Q6WyJwcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsInByb3BlcnR5TmFtZXMiLCJtaW5Qcm9wZXJ0aWVzIiwibWF4UHJvcGVydGllcyIsInJlcXVpcmVkIiwiZGVwZW5kZW50U2NoZW1hcyIsImRlcGVuZGVudFJlcXVpcmVkIiwidW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIl0sc3RyaW5nOlsicGF0dGVybiIsImZvcm1hdCIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsImNvbnRlbnRFbmNvZGluZyIsImNvbnRlbnRNZWRpYVR5cGUiLCJjb250ZW50U2NoZW1hIl0saW50ZWdlcjpbIm1pbmltdW0iLCJtYXhpbXVtIiwiZXhjbHVzaXZlTWluaW11bSIsImV4Y2x1c2l2ZU1heGltdW0iLCJtdWx0aXBsZU9mIl19O0hULm51bWJlcj1IVC5pbnRlZ2VyO2NvbnN0IEtUPSJzdHJpbmciLGluZmVyVHlwZUZyb21WYWx1ZT1zPT52b2lkIDA9PT1zP251bGw6bnVsbD09PXM/Im51bGwiOkFycmF5LmlzQXJyYXkocyk/ImFycmF5IjpOdW1iZXIuaXNJbnRlZ2VyKHMpPyJpbnRlZ2VyIjp0eXBlb2Ygcyxmb2xkVHlwZT1zPT57aWYoQXJyYXkuaXNBcnJheShzKSYmcy5sZW5ndGg+PTEpe2lmKHMuaW5jbHVkZXMoImFycmF5IikpcmV0dXJuImFycmF5IjtpZihzLmluY2x1ZGVzKCJvYmplY3QiKSlyZXR1cm4ib2JqZWN0Ijt7Y29uc3Qgbz1zLmZpbHRlcigocz0+Im51bGwiIT09cykpLGk9cmFuZG9tX3BpY2soby5sZW5ndGg+MD9vOnMpO2lmKEpULmluY2x1ZGVzKGkpKXJldHVybiBpfX1yZXR1cm4gSlQuaW5jbHVkZXMocyk/czpudWxsfSxpbmZlclR5cGU9KHMsbz1uZXcgV2Vha1NldCk9PntpZighaXNKU09OU2NoZW1hT2JqZWN0KHMpKXJldHVybiBLVDtpZihvLmhhcyhzKSlyZXR1cm4gS1Q7by5hZGQocyk7bGV0e3R5cGU6aSxjb25zdDphfT1zO2lmKGk9Zm9sZFR5cGUoaSksInN0cmluZyIhPXR5cGVvZiBpKXtjb25zdCBvPU9iamVjdC5rZXlzKEhUKTtlOmZvcihsZXQgYT0wO2E8by5sZW5ndGg7YSs9MSl7Y29uc3QgdT1vW2FdLF89SFRbdV07Zm9yKGxldCBvPTA7bzxfLmxlbmd0aDtvKz0xKXtjb25zdCBhPV9bb107aWYoT2JqZWN0Lmhhc093bihzLGEpKXtpPXU7YnJlYWsgZX19fX1pZigic3RyaW5nIiE9dHlwZW9mIGkmJnZvaWQgMCE9PWEpe2NvbnN0IHM9aW5mZXJUeXBlRnJvbVZhbHVlKGEpO2k9InN0cmluZyI9PXR5cGVvZiBzP3M6aX1pZigic3RyaW5nIiE9dHlwZW9mIGkpe2NvbnN0IGNvbWJpbmVUeXBlcz1pPT57aWYoQXJyYXkuaXNBcnJheShzW2ldKSl7Y29uc3QgYT1zW2ldLm1hcCgocz0+aW5mZXJUeXBlKHMsbykpKTtyZXR1cm4gZm9sZFR5cGUoYSl9cmV0dXJuIG51bGx9LGE9Y29tYmluZVR5cGVzKCJhbGxPZiIpLHU9Y29tYmluZVR5cGVzKCJhbnlPZiIpLF89Y29tYmluZVR5cGVzKCJvbmVPZiIpLHc9cy5ub3Q/aW5mZXJUeXBlKHMubm90LG8pOm51bGw7KGF8fHV8fF98fHcpJiYoaT1mb2xkVHlwZShbYSx1LF8sd10uZmlsdGVyKEJvb2xlYW4pKSl9aWYoInN0cmluZyIhPXR5cGVvZiBpJiZoYXNFeGFtcGxlKHMpKXtjb25zdCBvPWV4dHJhY3RFeGFtcGxlKHMpLGE9aW5mZXJUeXBlRnJvbVZhbHVlKG8pO2k9InN0cmluZyI9PXR5cGVvZiBhP2E6aX1yZXR1cm4gby5kZWxldGUocyksaXx8S1R9LHR5cGVfZ2V0VHlwZT1zPT5pbmZlclR5cGUocyksdHlwZUNhc3Q9cz0+cHJlZGljYXRlc19pc0Jvb2xlYW5KU09OU2NoZW1hKHMpPyhzPT4hMT09PXM/e25vdDp7fX06e30pKHMpOmlzSlNPTlNjaGVtYU9iamVjdChzKT9zOnt9LG1lcmdlX21lcmdlPShzLG8saT17fSk9PntpZihwcmVkaWNhdGVzX2lzQm9vbGVhbkpTT05TY2hlbWEocykmJiEwPT09cylyZXR1cm4hMDtpZihwcmVkaWNhdGVzX2lzQm9vbGVhbkpTT05TY2hlbWEocykmJiExPT09cylyZXR1cm4hMTtpZihwcmVkaWNhdGVzX2lzQm9vbGVhbkpTT05TY2hlbWEobykmJiEwPT09bylyZXR1cm4hMDtpZihwcmVkaWNhdGVzX2lzQm9vbGVhbkpTT05TY2hlbWEobykmJiExPT09bylyZXR1cm4hMTtpZighaXNKU09OU2NoZW1hKHMpKXJldHVybiBvO2lmKCFpc0pTT05TY2hlbWEobykpcmV0dXJuIHM7Y29uc3QgYT17Li4ubywuLi5zfTtpZihvLnR5cGUmJnMudHlwZSYmQXJyYXkuaXNBcnJheShvLnR5cGUpJiYic3RyaW5nIj09dHlwZW9mIG8udHlwZSl7Y29uc3QgaT1ub3JtYWxpemVBcnJheShvLnR5cGUpLmNvbmNhdChzLnR5cGUpO2EudHlwZT1BcnJheS5mcm9tKG5ldyBTZXQoaSkpfWlmKEFycmF5LmlzQXJyYXkoby5yZXF1aXJlZCkmJkFycmF5LmlzQXJyYXkocy5yZXF1aXJlZCkmJihhLnJlcXVpcmVkPVsuLi5uZXcgU2V0KFsuLi5zLnJlcXVpcmVkLC4uLm8ucmVxdWlyZWRdKV0pLG8ucHJvcGVydGllcyYmcy5wcm9wZXJ0aWVzKXtjb25zdCB1PW5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKG8ucHJvcGVydGllcyksLi4uT2JqZWN0LmtleXMocy5wcm9wZXJ0aWVzKV0pO2EucHJvcGVydGllcz17fTtmb3IoY29uc3QgXyBvZiB1KXtjb25zdCB1PW8ucHJvcGVydGllc1tfXXx8e30sdz1zLnByb3BlcnRpZXNbX118fHt9O3UucmVhZE9ubHkmJiFpLmluY2x1ZGVSZWFkT25seXx8dS53cml0ZU9ubHkmJiFpLmluY2x1ZGVXcml0ZU9ubHk/YS5yZXF1aXJlZD0oYS5yZXF1aXJlZHx8W10pLmZpbHRlcigocz0+cyE9PV8pKTphLnByb3BlcnRpZXNbX109bWVyZ2VfbWVyZ2Uodyx1LGkpfX1yZXR1cm4gaXNKU09OU2NoZW1hKG8uaXRlbXMpJiZpc0pTT05TY2hlbWEocy5pdGVtcykmJihhLml0ZW1zPW1lcmdlX21lcmdlKHMuaXRlbXMsby5pdGVtcyxpKSksaXNKU09OU2NoZW1hKG8uY29udGFpbnMpJiZpc0pTT05TY2hlbWEocy5jb250YWlucykmJihhLmNvbnRhaW5zPW1lcmdlX21lcmdlKHMuY29udGFpbnMsby5jb250YWlucyxpKSksaXNKU09OU2NoZW1hKG8uY29udGVudFNjaGVtYSkmJmlzSlNPTlNjaGVtYShzLmNvbnRlbnRTY2hlbWEpJiYoYS5jb250ZW50U2NoZW1hPW1lcmdlX21lcmdlKHMuY29udGVudFNjaGVtYSxvLmNvbnRlbnRTY2hlbWEsaSkpLGF9LEdUPW1lcmdlX21lcmdlLG1haW5fc2FtcGxlRnJvbVNjaGVtYUdlbmVyaWM9KHMsbz17fSxpPXZvaWQgMCxhPSExKT0+e2lmKG51bGw9PXMmJnZvaWQgMD09PWkpcmV0dXJuOyJmdW5jdGlvbiI9PXR5cGVvZiBzPy50b0pTJiYocz1zLnRvSlMoKSkscz10eXBlQ2FzdChzKTtsZXQgdT12b2lkIDAhPT1pfHxoYXNFeGFtcGxlKHMpO2NvbnN0IF89IXUmJkFycmF5LmlzQXJyYXkocy5vbmVPZikmJnMub25lT2YubGVuZ3RoPjAsdz0hdSYmQXJyYXkuaXNBcnJheShzLmFueU9mKSYmcy5hbnlPZi5sZW5ndGg+MDtpZighdSYmKF98fHcpKXtjb25zdCBpPXR5cGVDYXN0KHJhbmRvbV9waWNrKF8/cy5vbmVPZjpzLmFueU9mKSk7IShzPUdUKHMsaSxvKSkueG1sJiZpLnhtbCYmKHMueG1sPWkueG1sKSxoYXNFeGFtcGxlKHMpJiZoYXNFeGFtcGxlKGkpJiYodT0hMCl9Y29uc3QgeD17fTtsZXR7eG1sOkMscHJvcGVydGllczpqLGFkZGl0aW9uYWxQcm9wZXJ0aWVzOkwsaXRlbXM6Qixjb250YWluczokfT1zfHx7fSxVPXR5cGVfZ2V0VHlwZShzKSx7aW5jbHVkZVJlYWRPbmx5OlYsaW5jbHVkZVdyaXRlT25seTp6fT1vO0M9Q3x8e307bGV0IFkse25hbWU6WixwcmVmaXg6ZWUsbmFtZXNwYWNlOmllfT1DLGFlPXt9O2lmKE9iamVjdC5oYXNPd24ocywidHlwZSIpfHwocy50eXBlPVUpLGEmJihaPVp8fCJub3RhZ25hbWUiLFk9KGVlP2Ake2VlfTpgOiIiKStaLGllKSl7eFtlZT9geG1sbnM6JHtlZX1gOiJ4bWxucyJdPWllfWEmJihhZVtZXT1bXSk7Y29uc3QgY2U9b2JqZWN0aWZ5KGopO2xldCBsZSxwZT0wO2NvbnN0IGhhc0V4Y2VlZGVkTWF4UHJvcGVydGllcz0oKT0+TnVtYmVyLmlzSW50ZWdlcihzLm1heFByb3BlcnRpZXMpJiZzLm1heFByb3BlcnRpZXM+MCYmcGU+PXMubWF4UHJvcGVydGllcyxjYW5BZGRQcm9wZXJ0eT1vPT4hKE51bWJlci5pc0ludGVnZXIocy5tYXhQcm9wZXJ0aWVzKSYmcy5tYXhQcm9wZXJ0aWVzPjApfHwhaGFzRXhjZWVkZWRNYXhQcm9wZXJ0aWVzKCkmJighKG89PiFBcnJheS5pc0FycmF5KHMucmVxdWlyZWQpfHwwPT09cy5yZXF1aXJlZC5sZW5ndGh8fCFzLnJlcXVpcmVkLmluY2x1ZGVzKG8pKShvKXx8cy5tYXhQcm9wZXJ0aWVzLXBlLSgoKT0+e2lmKCFBcnJheS5pc0FycmF5KHMucmVxdWlyZWQpfHwwPT09cy5yZXF1aXJlZC5sZW5ndGgpcmV0dXJuIDA7bGV0IG89MDtyZXR1cm4gYT9zLnJlcXVpcmVkLmZvckVhY2goKHM9Pm8rPXZvaWQgMD09PWFlW3NdPzA6MSkpOnMucmVxdWlyZWQuZm9yRWFjaCgocz0+e28rPXZvaWQgMD09PWFlW1ldPy5maW5kKChvPT52b2lkIDAhPT1vW3NdKSk/MDoxfSkpLHMucmVxdWlyZWQubGVuZ3RoLW99KSgpPjApO2lmKGxlPWE/KGksdT12b2lkIDApPT57aWYocyYmY2VbaV0pe2lmKGNlW2ldLnhtbD1jZVtpXS54bWx8fHt9LGNlW2ldLnhtbC5hdHRyaWJ1dGUpe2NvbnN0IHM9QXJyYXkuaXNBcnJheShjZVtpXS5lbnVtKT9yYW5kb21fcGljayhjZVtpXS5lbnVtKTp2b2lkIDA7aWYoaGFzRXhhbXBsZShjZVtpXSkpeFtjZVtpXS54bWwubmFtZXx8aV09ZXh0cmFjdEV4YW1wbGUoY2VbaV0pO2Vsc2UgaWYodm9pZCAwIT09cyl4W2NlW2ldLnhtbC5uYW1lfHxpXT1zO2Vsc2V7Y29uc3Qgcz10eXBlQ2FzdChjZVtpXSksYT10eXBlX2dldFR5cGUocyksXz1jZVtpXS54bWwubmFtZXx8aTtpZigiYXJyYXkiPT09YSl7Y29uc3Qgcz1tYWluX3NhbXBsZUZyb21TY2hlbWFHZW5lcmljKGNlW2ldLG8sdSwhMSk7eFtfXT1zLm1hcCgocz0+YXMoKShzKT8iVW5rbm93blR5cGVPYmplY3QiOkFycmF5LmlzQXJyYXkocyk/IlVua25vd25UeXBlQXJyYXkiOnMpKS5qb2luKCIgIil9ZWxzZSB4W19dPSJvYmplY3QiPT09YT8iVW5rbm93blR5cGVPYmplY3QiOldUW2FdKHMpfXJldHVybn1jZVtpXS54bWwubmFtZT1jZVtpXS54bWwubmFtZXx8aX1lbHNlIGNlW2ldfHwhMT09PUx8fChjZVtpXT17eG1sOntuYW1lOml9fSk7bGV0IF89bWFpbl9zYW1wbGVGcm9tU2NoZW1hR2VuZXJpYyhjZVtpXSxvLHUsYSk7Y2FuQWRkUHJvcGVydHkoaSkmJihwZSsrLEFycmF5LmlzQXJyYXkoXyk/YWVbWV09YWVbWV0uY29uY2F0KF8pOmFlW1ldLnB1c2goXykpfTooaSx1KT0+e2lmKGNhbkFkZFByb3BlcnR5KGkpKXtpZihhcygpKHMuZGlzY3JpbWluYXRvcj8ubWFwcGluZykmJnMuZGlzY3JpbWluYXRvci5wcm9wZXJ0eU5hbWU9PT1pJiYic3RyaW5nIj09dHlwZW9mIHMuJCRyZWYpe2Zvcihjb25zdCBvIGluIHMuZGlzY3JpbWluYXRvci5tYXBwaW5nKWlmKC0xIT09cy4kJHJlZi5zZWFyY2gocy5kaXNjcmltaW5hdG9yLm1hcHBpbmdbb10pKXthZVtpXT1vO2JyZWFrfX1lbHNlIGFlW2ldPW1haW5fc2FtcGxlRnJvbVNjaGVtYUdlbmVyaWMoY2VbaV0sbyx1LGEpO3BlKyt9fSx1KXtsZXQgdTtpZih1PXZvaWQgMCE9PWk/aTpleHRyYWN0RXhhbXBsZShzKSwhYSl7aWYoIm51bWJlciI9PXR5cGVvZiB1JiYic3RyaW5nIj09PVUpcmV0dXJuYCR7dX1gO2lmKCJzdHJpbmciIT10eXBlb2YgdXx8InN0cmluZyI9PT1VKXJldHVybiB1O3RyeXtyZXR1cm4gSlNPTi5wYXJzZSh1KX1jYXRjaHtyZXR1cm4gdX19aWYoImFycmF5Ij09PVUpe2lmKCFBcnJheS5pc0FycmF5KHUpKXtpZigic3RyaW5nIj09dHlwZW9mIHUpcmV0dXJuIHU7dT1bdV19bGV0IGk9W107cmV0dXJuIGlzSlNPTlNjaGVtYU9iamVjdChCKSYmKEIueG1sPUIueG1sfHxDfHx7fSxCLnhtbC5uYW1lPUIueG1sLm5hbWV8fEMubmFtZSxpPXUubWFwKChzPT5tYWluX3NhbXBsZUZyb21TY2hlbWFHZW5lcmljKEIsbyxzLGEpKSkpLGlzSlNPTlNjaGVtYU9iamVjdCgkKSYmKCQueG1sPSQueG1sfHxDfHx7fSwkLnhtbC5uYW1lPSQueG1sLm5hbWV8fEMubmFtZSxpPVttYWluX3NhbXBsZUZyb21TY2hlbWFHZW5lcmljKCQsbyx2b2lkIDAsYSksLi4uaV0pLGk9V1QuYXJyYXkocyx7c2FtcGxlOml9KSxDLndyYXBwZWQ/KGFlW1ldPWksZHMoKSh4KXx8YWVbWV0ucHVzaCh7X2F0dHI6eH0pKTphZT1pLGFlfWlmKCJvYmplY3QiPT09VSl7aWYoInN0cmluZyI9PXR5cGVvZiB1KXJldHVybiB1O2Zvcihjb25zdCBzIGluIHUpT2JqZWN0Lmhhc093bih1LHMpJiYoY2Vbc10/LnJlYWRPbmx5JiYhVnx8Y2Vbc10/LndyaXRlT25seSYmIXp8fChjZVtzXT8ueG1sPy5hdHRyaWJ1dGU/eFtjZVtzXS54bWwubmFtZXx8c109dVtzXTpsZShzLHVbc10pKSk7cmV0dXJuIGRzKCkoeCl8fGFlW1ldLnB1c2goe19hdHRyOnh9KSxhZX1yZXR1cm4gYWVbWV09ZHMoKSh4KT91Olt7X2F0dHI6eH0sdV0sYWV9aWYoImFycmF5Ij09PVUpe2xldCBpPVtdO2lmKGlzSlNPTlNjaGVtYU9iamVjdCgkKSlpZihhJiYoJC54bWw9JC54bWx8fHMueG1sfHx7fSwkLnhtbC5uYW1lPSQueG1sLm5hbWV8fEMubmFtZSksQXJyYXkuaXNBcnJheSgkLmFueU9mKSl7Y29uc3R7YW55T2Y6cywuLi51fT1CO2kucHVzaCguLi4kLmFueU9mLm1hcCgocz0+bWFpbl9zYW1wbGVGcm9tU2NoZW1hR2VuZXJpYyhHVChzLHUsbyksbyx2b2lkIDAsYSkpKSl9ZWxzZSBpZihBcnJheS5pc0FycmF5KCQub25lT2YpKXtjb25zdHtvbmVPZjpzLC4uLnV9PUI7aS5wdXNoKC4uLiQub25lT2YubWFwKChzPT5tYWluX3NhbXBsZUZyb21TY2hlbWFHZW5lcmljKEdUKHMsdSxvKSxvLHZvaWQgMCxhKSkpKX1lbHNle2lmKCEoIWF8fGEmJkMud3JhcHBlZCkpcmV0dXJuIG1haW5fc2FtcGxlRnJvbVNjaGVtYUdlbmVyaWMoJCxvLHZvaWQgMCxhKTtpLnB1c2gobWFpbl9zYW1wbGVGcm9tU2NoZW1hR2VuZXJpYygkLG8sdm9pZCAwLGEpKX1pZihpc0pTT05TY2hlbWFPYmplY3QoQikpaWYoYSYmKEIueG1sPUIueG1sfHxzLnhtbHx8e30sQi54bWwubmFtZT1CLnhtbC5uYW1lfHxDLm5hbWUpLEFycmF5LmlzQXJyYXkoQi5hbnlPZikpe2NvbnN0e2FueU9mOnMsLi4udX09QjtpLnB1c2goLi4uQi5hbnlPZi5tYXAoKHM9Pm1haW5fc2FtcGxlRnJvbVNjaGVtYUdlbmVyaWMoR1Qocyx1LG8pLG8sdm9pZCAwLGEpKSkpfWVsc2UgaWYoQXJyYXkuaXNBcnJheShCLm9uZU9mKSl7Y29uc3R7b25lT2Y6cywuLi51fT1CO2kucHVzaCguLi5CLm9uZU9mLm1hcCgocz0+bWFpbl9zYW1wbGVGcm9tU2NoZW1hR2VuZXJpYyhHVChzLHUsbyksbyx2b2lkIDAsYSkpKSl9ZWxzZXtpZighKCFhfHxhJiZDLndyYXBwZWQpKXJldHVybiBtYWluX3NhbXBsZUZyb21TY2hlbWFHZW5lcmljKEIsbyx2b2lkIDAsYSk7aS5wdXNoKG1haW5fc2FtcGxlRnJvbVNjaGVtYUdlbmVyaWMoQixvLHZvaWQgMCxhKSl9cmV0dXJuIGk9V1QuYXJyYXkocyx7c2FtcGxlOml9KSxhJiZDLndyYXBwZWQ/KGFlW1ldPWksZHMoKSh4KXx8YWVbWV0ucHVzaCh7X2F0dHI6eH0pLGFlKTppfWlmKCJvYmplY3QiPT09VSl7Zm9yKGxldCBzIGluIGNlKU9iamVjdC5oYXNPd24oY2UscykmJihjZVtzXT8uZGVwcmVjYXRlZHx8Y2Vbc10/LnJlYWRPbmx5JiYhVnx8Y2Vbc10/LndyaXRlT25seSYmIXp8fGxlKHMpKTtpZihhJiZ4JiZhZVtZXS5wdXNoKHtfYXR0cjp4fSksaGFzRXhjZWVkZWRNYXhQcm9wZXJ0aWVzKCkpcmV0dXJuIGFlO2lmKHByZWRpY2F0ZXNfaXNCb29sZWFuSlNPTlNjaGVtYShMKSYmTClhP2FlW1ldLnB1c2goe2FkZGl0aW9uYWxQcm9wOiJBbnl0aGluZyBjYW4gYmUgaGVyZSJ9KTphZS5hZGRpdGlvbmFsUHJvcDE9e30scGUrKztlbHNlIGlmKGlzSlNPTlNjaGVtYU9iamVjdChMKSl7Y29uc3QgaT1MLHU9bWFpbl9zYW1wbGVGcm9tU2NoZW1hR2VuZXJpYyhpLG8sdm9pZCAwLGEpO2lmKGEmJiJzdHJpbmciPT10eXBlb2YgaT8ueG1sPy5uYW1lJiYibm90YWduYW1lIiE9PWk/LnhtbD8ubmFtZSlhZVtZXS5wdXNoKHUpO2Vsc2V7Y29uc3Qgbz1pPy5bIngtYWRkaXRpb25hbFByb3BlcnRpZXNOYW1lIl18fCJhZGRpdGlvbmFsUHJvcCIsXz1OdW1iZXIuaXNJbnRlZ2VyKHMubWluUHJvcGVydGllcykmJnMubWluUHJvcGVydGllcz4wJiZwZTxzLm1pblByb3BlcnRpZXM/cy5taW5Qcm9wZXJ0aWVzLXBlOjM7Zm9yKGxldCBzPTE7czw9XztzKyspe2lmKGhhc0V4Y2VlZGVkTWF4UHJvcGVydGllcygpKXJldHVybiBhZTtpZihhKXtjb25zdCBpPXt9O2lbbytzXT11Lm5vdGFnbmFtZSxhZVtZXS5wdXNoKGkpfWVsc2UgYWVbbytzXT11O3BlKyt9fX1yZXR1cm4gYWV9bGV0IGRlO2lmKHZvaWQgMCE9PXMuY29uc3QpZGU9cy5jb25zdDtlbHNlIGlmKHMmJkFycmF5LmlzQXJyYXkocy5lbnVtKSlkZT1yYW5kb21fcGljayhub3JtYWxpemVBcnJheShzLmVudW0pKTtlbHNle2NvbnN0IGk9aXNKU09OU2NoZW1hT2JqZWN0KHMuY29udGVudFNjaGVtYSk/bWFpbl9zYW1wbGVGcm9tU2NoZW1hR2VuZXJpYyhzLmNvbnRlbnRTY2hlbWEsbyx2b2lkIDAsYSk6dm9pZCAwO2RlPVdUW1VdKHMse3NhbXBsZTppfSl9cmV0dXJuIGE/KGFlW1ldPWRzKCkoeCk/ZGU6W3tfYXR0cjp4fSxkZV0sYWUpOmRlfSxtYWluX2NyZWF0ZVhNTEV4YW1wbGU9KHMsbyxpKT0+e2NvbnN0IGE9bWFpbl9zYW1wbGVGcm9tU2NoZW1hR2VuZXJpYyhzLG8saSwhMCk7aWYoYSlyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGE/YTpscygpKGEse2RlY2xhcmF0aW9uOiEwLGluZGVudDoiXHQifSl9LG1haW5fc2FtcGxlRnJvbVNjaGVtYT0ocyxvLGkpPT5tYWluX3NhbXBsZUZyb21TY2hlbWFHZW5lcmljKHMsbyxpLCExKSxtYWluX3Jlc29sdmVyPShzLG8saSk9PltzLEpTT04uc3RyaW5naWZ5KG8pLEpTT04uc3RyaW5naWZ5KGkpXSxZVD11dGlsc19tZW1vaXplTihtYWluX2NyZWF0ZVhNTEV4YW1wbGUsbWFpbl9yZXNvbHZlciksWFQ9dXRpbHNfbWVtb2l6ZU4obWFpbl9zYW1wbGVGcm9tU2NoZW1hLG1haW5fcmVzb2x2ZXIpO2NvbnN0IFFUPW5ldyBjbGFzcyBPcHRpb25SZWdpc3RyeSBleHRlbmRzIE9UeyNzPXt9O2RhdGE9ey4uLnRoaXMuI3N9O2dldCBkZWZhdWx0cygpe3JldHVybnsuLi50aGlzLiNzfX19LGFwaV9vcHRpb25BUEk9KHMsbyk9Pih2b2lkIDAhPT1vJiZRVC5yZWdpc3RlcihzLG8pLFFULmdldChzKSksWlQ9W3t3aGVuOi9qc29uLyxzaG91bGRTdHJpbmdpZnlUeXBlczpbInN0cmluZyJdfV0sZU49WyJvYmplY3QiXSxmbl9nZXRfanNvbl9zYW1wbGVfc2NoZW1hPXM9PihvLGksYSx1KT0+e2NvbnN0e2ZuOl99PXMoKSx3PV8uanNvblNjaGVtYTIwMjAxMi5tZW1vaXplZFNhbXBsZUZyb21TY2hlbWEobyxpLHUpLHg9dHlwZW9mIHcsQz1aVC5yZWR1Y2UoKChzLG8pPT5vLndoZW4udGVzdChhKT9bLi4ucywuLi5vLnNob3VsZFN0cmluZ2lmeVR5cGVzXTpzKSxlTik7cmV0dXJuIGd0KCkoQywocz0+cz09PXgpKT9KU09OLnN0cmluZ2lmeSh3LG51bGwsMik6d30sZm5fZ2V0X3lhbWxfc2FtcGxlX3NjaGVtYT1zPT4obyxpLGEsdSk9Pntjb25zdHtmbjpffT1zKCksdz1fLmpzb25TY2hlbWEyMDIwMTIuZ2V0SnNvblNhbXBsZVNjaGVtYShvLGksYSx1KTtsZXQgeDt0cnl7eD1mbi5kdW1wKGZuLmxvYWQodykse2xpbmVXaWR0aDotMX0se3NjaGVtYTpybn0pLCJcbiI9PT14W3gubGVuZ3RoLTFdJiYoeD14LnNsaWNlKDAseC5sZW5ndGgtMSkpfWNhdGNoKHMpe3JldHVybiBjb25zb2xlLmVycm9yKHMpLCJlcnJvcjogY291bGQgbm90IGdlbmVyYXRlIHlhbWwgZXhhbXBsZSJ9cmV0dXJuIHgucmVwbGFjZSgvXHQvZywiICAiKX0sZm5fZ2V0X3htbF9zYW1wbGVfc2NoZW1hPXM9PihvLGksYSk9Pntjb25zdHtmbjp1fT1zKCk7aWYobyYmIW8ueG1sJiYoby54bWw9e30pLG8mJiFvLnhtbC5uYW1lKXtpZighby4kJHJlZiYmKG8udHlwZXx8by5pdGVtc3x8by5wcm9wZXJ0aWVzfHxvLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKSlyZXR1cm4nPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz5cblx4M2MhLS0gWE1MIGV4YW1wbGUgY2Fubm90IGJlIGdlbmVyYXRlZDsgcm9vdCBlbGVtZW50IG5hbWUgaXMgdW5kZWZpbmVkIC0tXHgzZSc7aWYoby4kJHJlZil7bGV0IHM9by4kJHJlZi5tYXRjaCgvXFMqXC8oXFMrKSQvKTtvLnhtbC5uYW1lPXNbMV19fXJldHVybiB1Lmpzb25TY2hlbWEyMDIwMTIubWVtb2l6ZWRDcmVhdGVYTUxFeGFtcGxlKG8saSxhKX0sZm5fZ2V0X3NhbXBsZV9zY2hlbWE9cz0+KG8saT0iIixhPXt9LHU9dm9pZCAwKT0+e2NvbnN0e2ZuOl99PXMoKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbz8udG9KUyYmKG89by50b0pTKCkpLCJmdW5jdGlvbiI9PXR5cGVvZiB1Py50b0pTJiYodT11LnRvSlMoKSksL3htbC8udGVzdChpKT9fLmpzb25TY2hlbWEyMDIwMTIuZ2V0WG1sU2FtcGxlU2NoZW1hKG8sYSx1KTovKHlhbWx8eW1sKS8udGVzdChpKT9fLmpzb25TY2hlbWEyMDIwMTIuZ2V0WWFtbFNhbXBsZVNjaGVtYShvLGEsaSx1KTpfLmpzb25TY2hlbWEyMDIwMTIuZ2V0SnNvblNhbXBsZVNjaGVtYShvLGEsaSx1KX0sanNvbl9zY2hlbWFfMjAyMF8xMl9zYW1wbGVzPSh7Z2V0U3lzdGVtOnN9KT0+e2NvbnN0IG89Zm5fZ2V0X2pzb25fc2FtcGxlX3NjaGVtYShzKSxpPWZuX2dldF95YW1sX3NhbXBsZV9zY2hlbWEocyksYT1mbl9nZXRfeG1sX3NhbXBsZV9zY2hlbWEocyksdT1mbl9nZXRfc2FtcGxlX3NjaGVtYShzKTtyZXR1cm57Zm46e2pzb25TY2hlbWEyMDIwMTI6e3NhbXBsZUZyb21TY2hlbWE6bWFpbl9zYW1wbGVGcm9tU2NoZW1hLHNhbXBsZUZyb21TY2hlbWFHZW5lcmljOm1haW5fc2FtcGxlRnJvbVNjaGVtYUdlbmVyaWMsc2FtcGxlT3B0aW9uQVBJOmFwaV9vcHRpb25BUEksc2FtcGxlRW5jb2RlckFQSTpMVCxzYW1wbGVGb3JtYXRBUEk6Q1Qsc2FtcGxlTWVkaWFUeXBlQVBJOnpULGNyZWF0ZVhNTEV4YW1wbGU6bWFpbl9jcmVhdGVYTUxFeGFtcGxlLG1lbW9pemVkU2FtcGxlRnJvbVNjaGVtYTpYVCxtZW1vaXplZENyZWF0ZVhNTEV4YW1wbGU6WVQsZ2V0SnNvblNhbXBsZVNjaGVtYTpvLGdldFlhbWxTYW1wbGVTY2hlbWE6aSxnZXRYbWxTYW1wbGVTY2hlbWE6YSxnZXRTYW1wbGVTY2hlbWE6dSxtZXJnZUpzb25TY2hlbWE6R1QsZm9sZFR5cGV9fX19O2Z1bmN0aW9uIFByZXNldEFwaXMoKXtyZXR1cm5bYmFzZSxvYXMzLGpzb25fc2NoZW1hXzIwMjBfMTIsanNvbl9zY2hlbWFfMjAyMF8xMl9zYW1wbGVzLG9hczMxLG9hczMyXX1jb25zdCBpbmxpbmVfcGx1Z2luPXM9PigpPT4oe2ZuOnMuZm4sY29tcG9uZW50czpzLmNvbXBvbmVudHN9KSxmYWN0b3JpemF0aW9uX3N5c3RlbT1zPT57Y29uc3Qgbz1ZZSgpKHtsYXlvdXQ6e2xheW91dDpzLmxheW91dCxmaWx0ZXI6cy5maWx0ZXJ9LHNwZWM6e3NwZWM6IiIsdXJsOnMudXJsfSxyZXF1ZXN0U25pcHBldHM6cy5yZXF1ZXN0U25pcHBldHN9LHMuaW5pdGlhbFN0YXRlKTtpZihzLmluaXRpYWxTdGF0ZSlmb3IoY29uc3RbaSxhXW9mIE9iamVjdC5lbnRyaWVzKHMuaW5pdGlhbFN0YXRlKSl2b2lkIDA9PT1hJiZkZWxldGUgb1tpXTtyZXR1cm57c3lzdGVtOntjb25maWdzOnMuY29uZmlnc30scGx1Z2luczpzLnByZXNldHMsc3RhdGU6b319LHNvdXJjZXNfcXVlcnk9KCk9PnM9Pntjb25zdCBvPXMucXVlcnlDb25maWdFbmFibGVkPygoKT0+e2NvbnN0IHM9bmV3IFVSTFNlYXJjaFBhcmFtcyhsdC5sb2NhdGlvbi5zZWFyY2gpO3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMocyl9KSgpOnt9O3JldHVybiBPYmplY3QuZW50cmllcyhvKS5yZWR1Y2UoKChzLFtvLGldKT0+KCJjb25maWciPT09bz9zLmNvbmZpZ1VybD1pOiJ1cmxzLnByaW1hcnlOYW1lIj09PW8/c1tvXT1pOnM9Y28oKShzLG8saSkscykpLHt9KX0sc291cmNlc191cmw9KHt1cmw6cyxzeXN0ZW06b30pPT5hc3luYyBpPT57aWYoIXMpcmV0dXJue307aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG8uY29uZmlnc0FjdGlvbnM/LmdldENvbmZpZ0J5VXJsKXJldHVybnt9O2NvbnN0IGE9KCgpPT57Y29uc3Qgcz17fTtyZXR1cm4gcy5wcm9taXNlPW5ldyBQcm9taXNlKCgobyxpKT0+e3MucmVzb2x2ZT1vLHMucmVqZWN0PWl9KSksc30pKCk7cmV0dXJuIG8uY29uZmlnc0FjdGlvbnMuZ2V0Q29uZmlnQnlVcmwoe3VybDpzLGxvYWRSZW1vdGVDb25maWc6ITAscmVxdWVzdEludGVyY2VwdG9yOmkucmVxdWVzdEludGVyY2VwdG9yLHJlc3BvbnNlSW50ZXJjZXB0b3I6aS5yZXNwb25zZUludGVyY2VwdG9yfSwocz0+e2EucmVzb2x2ZShzKX0pKSxhLnByb21pc2V9LHJ1bnRpbWU9KCk9PigpPT57Y29uc3Qgcz17fTtyZXR1cm4gZ2xvYmFsVGhpcy5sb2NhdGlvbiYmKHMub2F1dGgyUmVkaXJlY3RVcmw9YCR7Z2xvYmFsVGhpcy5sb2NhdGlvbi5wcm90b2NvbH0vLyR7Z2xvYmFsVGhpcy5sb2NhdGlvbi5ob3N0fSR7Z2xvYmFsVGhpcy5sb2NhdGlvbi5wYXRobmFtZS5zdWJzdHJpbmcoMCxnbG9iYWxUaGlzLmxvY2F0aW9uLnBhdGhuYW1lLmxhc3RJbmRleE9mKCIvIikpfS9vYXV0aDItcmVkaXJlY3QuaHRtbGApLHN9LHROPU9iamVjdC5mcmVlemUoe2RvbV9pZDpudWxsLGRvbU5vZGU6bnVsbCxzcGVjOnt9LHVybDoiIix1cmxzOm51bGwsY29uZmlnVXJsOm51bGwsbGF5b3V0OiJCYXNlTGF5b3V0Iixkb2NFeHBhbnNpb246Imxpc3QiLG1heERpc3BsYXllZFRhZ3M6LTEsZmlsdGVyOiExLHZhbGlkYXRvclVybDoiaHR0cHM6Ly92YWxpZGF0b3Iuc3dhZ2dlci5pby92YWxpZGF0b3IiLG9hdXRoMlJlZGlyZWN0VXJsOnZvaWQgMCxwZXJzaXN0QXV0aG9yaXphdGlvbjohMSxjb25maWdzOnt9LGRpc3BsYXlPcGVyYXRpb25JZDohMSxkaXNwbGF5UmVxdWVzdER1cmF0aW9uOiExLGRlZXBMaW5raW5nOiExLHRyeUl0T3V0RW5hYmxlZDohMSxyZXF1ZXN0SW50ZXJjZXB0b3I6cz0+KHMuY3VybE9wdGlvbnM9W10scykscmVzcG9uc2VJbnRlcmNlcHRvcjpzPT5zLHNob3dNdXRhdGVkUmVxdWVzdDohMCxkZWZhdWx0TW9kZWxSZW5kZXJpbmc6ImV4YW1wbGUiLGRlZmF1bHRNb2RlbEV4cGFuZERlcHRoOjEsZGVmYXVsdE1vZGVsc0V4cGFuZERlcHRoOjEsc2hvd0V4dGVuc2lvbnM6ITEsc2hvd0NvbW1vbkV4dGVuc2lvbnM6ITEsd2l0aENyZWRlbnRpYWxzOiExLHJlcXVlc3RTbmlwcGV0c0VuYWJsZWQ6ITEscmVxdWVzdFNuaXBwZXRzOntnZW5lcmF0b3JzOntjdXJsX2Jhc2g6e3RpdGxlOiJjVVJMIChiYXNoKSIsc3ludGF4OiJiYXNoIn0sY3VybF9wb3dlcnNoZWxsOnt0aXRsZToiY1VSTCAoUG93ZXJTaGVsbCkiLHN5bnRheDoicG93ZXJzaGVsbCJ9LGN1cmxfY21kOnt0aXRsZToiY1VSTCAoQ01EKSIsc3ludGF4OiJiYXNoIn19LGRlZmF1bHRFeHBhbmRlZDohMCxsYW5ndWFnZXM6bnVsbH0sc3VwcG9ydGVkU3VibWl0TWV0aG9kczpbImdldCIsInB1dCIsInBvc3QiLCJkZWxldGUiLCJvcHRpb25zIiwiaGVhZCIsInBhdGNoIiwidHJhY2UiXSxxdWVyeUNvbmZpZ0VuYWJsZWQ6ITEscHJlc2V0czpbUHJlc2V0QXBpc10scGx1Z2luczpbXSxpbml0aWFsU3RhdGU6e30sZm46e30sY29tcG9uZW50czp7fSxzeW50YXhIaWdobGlnaHQ6e2FjdGl2YXRlZDohMCx0aGVtZToiYWdhdGUifSxvcGVyYXRpb25zU29ydGVyOm51bGwsdGFnc1NvcnRlcjpudWxsLG9uQ29tcGxldGU6bnVsbCxtb2RlbFByb3BlcnR5TWFjcm86bnVsbCxwYXJhbWV0ZXJNYWNybzpudWxsLGZpbGVVcGxvYWRNZWRpYVR5cGVzOlsiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwiaW1hZ2UvIiwiYXVkaW8vIiwidmlkZW8vIl0sdW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOm51bGx9KTt2YXIgck49X193ZWJwYWNrX3JlcXVpcmVfXyg2MTQ0OCksbk49X193ZWJwYWNrX3JlcXVpcmVfXy5uKHJOKSxzTj1fX3dlYnBhY2tfcmVxdWlyZV9fKDc3NzMxKSxvTj1fX3dlYnBhY2tfcmVxdWlyZV9fLm4oc04pO2NvbnN0IHR5cGVfY2FzdGVyc19hcnJheT0ocyxvPVtdKT0+QXJyYXkuaXNBcnJheShzKT9zOm8sdHlwZV9jYXN0ZXJzX2Jvb2xlYW49KHMsbz0hMSk9PiEwPT09c3x8InRydWUiPT09c3x8MT09PXN8fCIxIj09PXN8fCExIT09cyYmImZhbHNlIiE9PXMmJjAhPT1zJiYiMCIhPT1zJiZvLGRvbV9ub2RlPXM9Pm51bGw9PT1zfHwibnVsbCI9PT1zP251bGw6cyx0eXBlX2Nhc3RlcnNfZmlsdGVyPXM9Pntjb25zdCBvPVN0cmluZyhzKTtyZXR1cm4gdHlwZV9jYXN0ZXJzX2Jvb2xlYW4ocyxvKX0sdHlwZV9jYXN0ZXJzX2Z1bmN0aW9uPShzLG8pPT4iZnVuY3Rpb24iPT10eXBlb2Ygcz9zOm8sbnVsbGFibGVfYXJyYXk9cz0+QXJyYXkuaXNBcnJheShzKT9zOm51bGwsbnVsbGFibGVfZnVuY3Rpb249cz0+ImZ1bmN0aW9uIj09dHlwZW9mIHM/czpudWxsLG51bGxhYmxlX3N0cmluZz1zPT5udWxsPT09c3x8Im51bGwiPT09cz9udWxsOlN0cmluZyhzKSx0eXBlX2Nhc3RlcnNfbnVtYmVyPShzLG89LTEpPT57Y29uc3QgaT1wYXJzZUludChzLDEwKTtyZXR1cm4gTnVtYmVyLmlzTmFOKGkpP286aX0sdHlwZV9jYXN0ZXJzX29iamVjdD0ocyxvPXt9KT0+YXMoKShzKT9zOm8sc29ydGVyPXM9PiJmdW5jdGlvbiI9PXR5cGVvZiBzfHwic3RyaW5nIj09dHlwZW9mIHM/czpudWxsLHR5cGVfY2FzdGVyc19zdHJpbmc9cz0+U3RyaW5nKHMpLHN5bnRheF9oaWdobGlnaHQ9KHMsbyk9PmFzKCkocyk/czohMT09PXN8fCJmYWxzZSI9PT1zfHwwPT09c3x8IjAiPT09cz97YWN0aXZhdGVkOiExfTpvLHVuZGVmaW5lZF9zdHJpbmc9cz0+dm9pZCAwPT09c3x8InVuZGVmaW5lZCI9PT1zP3ZvaWQgMDpTdHJpbmcocyksaU49e2NvbXBvbmVudHM6e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX29iamVjdH0sY29uZmlnczp7dHlwZUNhc3Rlcjp0eXBlX2Nhc3RlcnNfb2JqZWN0fSxjb25maWdVcmw6e3R5cGVDYXN0ZXI6bnVsbGFibGVfc3RyaW5nfSxkZWVwTGlua2luZzp7dHlwZUNhc3Rlcjp0eXBlX2Nhc3RlcnNfYm9vbGVhbixkZWZhdWx0VmFsdWU6dE4uZGVlcExpbmtpbmd9LGRlZmF1bHRNb2RlbEV4cGFuZERlcHRoOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19udW1iZXIsZGVmYXVsdFZhbHVlOnROLmRlZmF1bHRNb2RlbEV4cGFuZERlcHRofSxkZWZhdWx0TW9kZWxSZW5kZXJpbmc6e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX3N0cmluZ30sZGVmYXVsdE1vZGVsc0V4cGFuZERlcHRoOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19udW1iZXIsZGVmYXVsdFZhbHVlOnROLmRlZmF1bHRNb2RlbHNFeHBhbmREZXB0aH0sZGlzcGxheU9wZXJhdGlvbklkOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19ib29sZWFuLGRlZmF1bHRWYWx1ZTp0Ti5kaXNwbGF5T3BlcmF0aW9uSWR9LGRpc3BsYXlSZXF1ZXN0RHVyYXRpb246e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX2Jvb2xlYW4sZGVmYXVsdFZhbHVlOnROLmRpc3BsYXlSZXF1ZXN0RHVyYXRpb259LGRvY0V4cGFuc2lvbjp7dHlwZUNhc3Rlcjp0eXBlX2Nhc3RlcnNfc3RyaW5nfSxkb21faWQ6e3R5cGVDYXN0ZXI6bnVsbGFibGVfc3RyaW5nfSxkb21Ob2RlOnt0eXBlQ2FzdGVyOmRvbV9ub2RlfSxmaWxlVXBsb2FkTWVkaWFUeXBlczp7dHlwZUNhc3Rlcjp0eXBlX2Nhc3RlcnNfYXJyYXksZGVmYXVsdFZhbHVlOnROLmZpbGVVcGxvYWRNZWRpYVR5cGVzfSxmaWx0ZXI6e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX2ZpbHRlcn0sZm46e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX29iamVjdH0saW5pdGlhbFN0YXRlOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19vYmplY3R9LGxheW91dDp7dHlwZUNhc3Rlcjp0eXBlX2Nhc3RlcnNfc3RyaW5nfSxtYXhEaXNwbGF5ZWRUYWdzOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19udW1iZXIsZGVmYXVsdFZhbHVlOnROLm1heERpc3BsYXllZFRhZ3N9LG1vZGVsUHJvcGVydHlNYWNybzp7dHlwZUNhc3RlcjpudWxsYWJsZV9mdW5jdGlvbn0sb2F1dGgyUmVkaXJlY3RVcmw6e3R5cGVDYXN0ZXI6dW5kZWZpbmVkX3N0cmluZ30sb25Db21wbGV0ZTp7dHlwZUNhc3RlcjpudWxsYWJsZV9mdW5jdGlvbn0sb3BlcmF0aW9uc1NvcnRlcjp7dHlwZUNhc3Rlcjpzb3J0ZXJ9LHBhcmFtYXRlck1hY3JvOnt0eXBlQ2FzdGVyOm51bGxhYmxlX2Z1bmN0aW9ufSxwZXJzaXN0QXV0aG9yaXphdGlvbjp7dHlwZUNhc3Rlcjp0eXBlX2Nhc3RlcnNfYm9vbGVhbixkZWZhdWx0VmFsdWU6dE4ucGVyc2lzdEF1dGhvcml6YXRpb259LHBsdWdpbnM6e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX2FycmF5LGRlZmF1bHRWYWx1ZTp0Ti5wbHVnaW5zfSxwcmVzZXRzOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19hcnJheSxkZWZhdWx0VmFsdWU6dE4ucHJlc2V0c30scmVxdWVzdEludGVyY2VwdG9yOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19mdW5jdGlvbixkZWZhdWx0VmFsdWU6dE4ucmVxdWVzdEludGVyY2VwdG9yfSxyZXF1ZXN0U25pcHBldHM6e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX29iamVjdCxkZWZhdWx0VmFsdWU6dE4ucmVxdWVzdFNuaXBwZXRzfSxyZXF1ZXN0U25pcHBldHNFbmFibGVkOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19ib29sZWFuLGRlZmF1bHRWYWx1ZTp0Ti5yZXF1ZXN0U25pcHBldHNFbmFibGVkfSxyZXNwb25zZUludGVyY2VwdG9yOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19mdW5jdGlvbixkZWZhdWx0VmFsdWU6dE4ucmVzcG9uc2VJbnRlcmNlcHRvcn0sc2hvd0NvbW1vbkV4dGVuc2lvbnM6e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX2Jvb2xlYW4sZGVmYXVsdFZhbHVlOnROLnNob3dDb21tb25FeHRlbnNpb25zfSxzaG93RXh0ZW5zaW9uczp7dHlwZUNhc3Rlcjp0eXBlX2Nhc3RlcnNfYm9vbGVhbixkZWZhdWx0VmFsdWU6dE4uc2hvd0V4dGVuc2lvbnN9LHNob3dNdXRhdGVkUmVxdWVzdDp7dHlwZUNhc3Rlcjp0eXBlX2Nhc3RlcnNfYm9vbGVhbixkZWZhdWx0VmFsdWU6dE4uc2hvd011dGF0ZWRSZXF1ZXN0fSxzcGVjOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19vYmplY3QsZGVmYXVsdFZhbHVlOnROLnNwZWN9LHN1cHBvcnRlZFN1Ym1pdE1ldGhvZHM6e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX2FycmF5LGRlZmF1bHRWYWx1ZTp0Ti5zdXBwb3J0ZWRTdWJtaXRNZXRob2RzfSxzeW50YXhIaWdobGlnaHQ6e3R5cGVDYXN0ZXI6c3ludGF4X2hpZ2hsaWdodCxkZWZhdWx0VmFsdWU6dE4uc3ludGF4SGlnaGxpZ2h0fSwic3ludGF4SGlnaGxpZ2h0LmFjdGl2YXRlZCI6e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX2Jvb2xlYW4sZGVmYXVsdFZhbHVlOnROLnN5bnRheEhpZ2hsaWdodC5hY3RpdmF0ZWR9LCJzeW50YXhIaWdobGlnaHQudGhlbWUiOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19zdHJpbmd9LHRhZ3NTb3J0ZXI6e3R5cGVDYXN0ZXI6c29ydGVyfSx0cnlJdE91dEVuYWJsZWQ6e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX2Jvb2xlYW4sZGVmYXVsdFZhbHVlOnROLnRyeUl0T3V0RW5hYmxlZH0sdXJsOnt0eXBlQ2FzdGVyOnR5cGVfY2FzdGVyc19zdHJpbmd9LHVybHM6e3R5cGVDYXN0ZXI6bnVsbGFibGVfYXJyYXl9LCJ1cmxzLnByaW1hcnlOYW1lIjp7dHlwZUNhc3Rlcjp0eXBlX2Nhc3RlcnNfc3RyaW5nfSx2YWxpZGF0b3JVcmw6e3R5cGVDYXN0ZXI6bnVsbGFibGVfc3RyaW5nfSx3aXRoQ3JlZGVudGlhbHM6e3R5cGVDYXN0ZXI6dHlwZV9jYXN0ZXJzX2Jvb2xlYW4sZGVmYXVsdFZhbHVlOnROLndpdGhDcmVkZW50aWFsc30sdW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOnt0eXBlQ2FzdGVyOm51bGxhYmxlX2Z1bmN0aW9ufX0sdHlwZV9jYXN0PXM9Pk9iamVjdC5lbnRyaWVzKGlOKS5yZWR1Y2UoKChzLFtvLHt0eXBlQ2FzdGVyOmksZGVmYXVsdFZhbHVlOmF9XSk9PntpZihuTigpKHMsbykpe2NvbnN0IHU9aShDbigpKHMsbyksYSk7cz1vTigpKG8sdSxzKX1yZXR1cm4gc30pLHsuLi5zfSksY29uZmlnX21lcmdlPShzLC4uLm8pPT57bGV0IGk9U3ltYm9sLmZvcigiZG9tTm9kZSIpLGE9U3ltYm9sLmZvcigicHJpbWFyeU5hbWUiKTtjb25zdCB1PVtdO2Zvcihjb25zdCBzIG9mIG8pe2NvbnN0IG89ey4uLnN9O09iamVjdC5oYXNPd24obywiZG9tTm9kZSIpJiYoaT1vLmRvbU5vZGUsZGVsZXRlIG8uZG9tTm9kZSksT2JqZWN0Lmhhc093bihvLCJ1cmxzLnByaW1hcnlOYW1lIik/KGE9b1sidXJscy5wcmltYXJ5TmFtZSJdLGRlbGV0ZSBvWyJ1cmxzLnByaW1hcnlOYW1lIl0pOkFycmF5LmlzQXJyYXkoby51cmxzKSYmT2JqZWN0Lmhhc093bihvLnVybHMsInByaW1hcnlOYW1lIikmJihhPW8udXJscy5wcmltYXJ5TmFtZSxkZWxldGUgby51cmxzLnByaW1hcnlOYW1lKSx1LnB1c2gobyl9Y29uc3QgXz1ZZSgpKHMsLi4udSk7cmV0dXJuIGkhPT1TeW1ib2wuZm9yKCJkb21Ob2RlIikmJihfLmRvbU5vZGU9aSksYSE9PVN5bWJvbC5mb3IoInByaW1hcnlOYW1lIikmJkFycmF5LmlzQXJyYXkoXy51cmxzKSYmKF8udXJscy5wcmltYXJ5TmFtZT1hKSx0eXBlX2Nhc3QoXyl9O2Z1bmN0aW9uIFN3YWdnZXJVSShzKXtjb25zdCBvPXNvdXJjZXNfcXVlcnkoKShzKSxpPXJ1bnRpbWUoKSgpLGE9U3dhZ2dlclVJLmNvbmZpZy5tZXJnZSh7fSxTd2FnZ2VyVUkuY29uZmlnLmRlZmF1bHRzLGkscyxvKSx1PWZhY3Rvcml6YXRpb25fc3lzdGVtKGEpLF89aW5saW5lX3BsdWdpbihhKSx3PW5ldyBTdG9yZSh1KTt3LnJlZ2lzdGVyKFthLnBsdWdpbnMsX10pO2NvbnN0IHg9dy5nZXRTeXN0ZW0oKSxwZXJzaXN0Q29uZmlncz1zPT57dy5zZXRDb25maWdzKHMpLHguY29uZmlnc0FjdGlvbnMubG9hZGVkKCl9LHVwZGF0ZVNwZWM9cz0+eyFvLnVybCYmIm9iamVjdCI9PXR5cGVvZiBzLnNwZWMmJk9iamVjdC5rZXlzKHMuc3BlYykubGVuZ3RoPjA/KHguc3BlY0FjdGlvbnMudXBkYXRlVXJsKCIiKSx4LnNwZWNBY3Rpb25zLnVwZGF0ZUxvYWRpbmdTdGF0dXMoInN1Y2Nlc3MiKSx4LnNwZWNBY3Rpb25zLnVwZGF0ZVNwZWMoSlNPTi5zdHJpbmdpZnkocy5zcGVjKSkpOiJmdW5jdGlvbiI9PXR5cGVvZiB4LnNwZWNBY3Rpb25zLmRvd25sb2FkJiZzLnVybCYmIXMudXJscyYmKHguc3BlY0FjdGlvbnMudXBkYXRlVXJsKHMudXJsKSx4LnNwZWNBY3Rpb25zLmRvd25sb2FkKHMudXJsKSl9LHJlbmRlcj1zPT57aWYocy5kb21Ob2RlKXgucmVuZGVyKHMuZG9tTm9kZSwiQXBwIik7ZWxzZSBpZihzLmRvbV9pZCl7Y29uc3Qgbz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHMuZG9tX2lkKTt4LnJlbmRlcihvLCJBcHAiKX1lbHNlIG51bGw9PT1zLmRvbV9pZHx8bnVsbD09PXMuZG9tTm9kZXx8Y29uc29sZS5lcnJvcigiU2tpcHBlZCByZW5kZXJpbmc6IG5vIGBkb21faWRgIG9yIGBkb21Ob2RlYCB3YXMgc3BlY2lmaWVkIil9O3JldHVybiBhLmNvbmZpZ1VybD8oKGFzeW5jKCk9Pntjb25zdHtjb25maWdVcmw6c309YSxpPWF3YWl0IHNvdXJjZXNfdXJsKHt1cmw6cyxzeXN0ZW06eH0pKGEpLHU9U3dhZ2dlclVJLmNvbmZpZy5tZXJnZSh7fSxhLGksbyk7cGVyc2lzdENvbmZpZ3ModSksbnVsbCE9PWkmJnVwZGF0ZVNwZWModSkscmVuZGVyKHUpfSkoKSx4KToocGVyc2lzdENvbmZpZ3MoYSksdXBkYXRlU3BlYyhhKSxyZW5kZXIoYSkseCl9U3dhZ2dlclVJLlN5c3RlbT1TdG9yZSxTd2FnZ2VyVUkuY29uZmlnPXtkZWZhdWx0czp0TixtZXJnZTpjb25maWdfbWVyZ2UsdHlwZUNhc3Q6dHlwZV9jYXN0LHR5cGVDYXN0TWFwcGluZ3M6aU59LFN3YWdnZXJVSS5wcmVzZXRzPXtiYXNlLGFwaXM6UHJlc2V0QXBpc30sU3dhZ2dlclVJLnBsdWdpbnM9e0F1dGg6YXV0aCxDb25maWdzOmNvbmZpZ3NQbHVnaW4sRGVlcExpbmluZzpkZWVwX2xpbmtpbmcsRXJyOmVycixGaWx0ZXI6ZmlsdGVyLEljb25zOmljb25zLEpTT05TY2hlbWE1Ompzb25fc2NoZW1hXzUsSlNPTlNjaGVtYTVTYW1wbGVzOmpzb25fc2NoZW1hXzVfc2FtcGxlcyxKU09OU2NoZW1hMjAyMDEyOmpzb25fc2NoZW1hXzIwMjBfMTIsSlNPTlNjaGVtYTIwMjAxMlNhbXBsZXM6anNvbl9zY2hlbWFfMjAyMF8xMl9zYW1wbGVzLExheW91dDpwbHVnaW5zX2xheW91dCxMb2dzOmxvZ3MsT3BlbkFQSTMwOm9hczMsT3BlbkFQSTMxOm9hczMsT25Db21wbGV0ZTpvbl9jb21wbGV0ZSxSZXF1ZXN0U25pcHBldHM6cGx1Z2luc19yZXF1ZXN0X3NuaXBwZXRzLFNwZWM6cGx1Z2luc19zcGVjLFN3YWdnZXJDbGllbnQ6c3dhZ2dlcl9jbGllbnQsVXRpbDp1dGlsLFZpZXc6dmlldyxWaWV3TGVnYWN5OnZpZXdfbGVnYWN5LERvd25sb2FkVXJsOmRvd25sb2FkVXJsUGx1Z2luLFN5bnRheEhpZ2hsaWdodGluZzpzeW50YXhfaGlnaGxpZ2h0aW5nLFZlcnNpb25zOnZlcnNpb25zLFNhZmVSZW5kZXI6c2FmZV9yZW5kZXJ9O2NvbnN0IGFOPVN3YWdnZXJVSX0pKCksaT1pLmRlZmF1bHR9KSgpKSk7","response_hash":"5545aed22c4eff9affc5b6ff99aaaf45fb9e8d3f5031c8795f1470618a88e066","response_time_ms":0,"response_words":29865,"has_response":true,"parameters":[{"name":"1","value":"api-docs","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":13},{"name":"2","value":"swagger-ui-bundle.js","type":"path","name_start":-1,"name_end":-1,"value_start":14,"value_end":34}],"sent_at":"2026-04-05T05:33:08.392665Z","received_at":"2026-04-05T05:33:08.392664Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"3877d0e0-7cb8-4ba2-a077-1c67ee857673","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/metrics/editor-4.7.8.php","url":"http://localhost:3000/metrics/editor-4.7.8.php","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9tZXRyaWNzL2VkaXRvci00LjcuOC5waHAgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"912b6d219c5280d388d1bc81412bf15f148487939eccbfa80efa133c3bb84151","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["text/html; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:33:05 GMT"],"Etag":["W/\"124fa-19d5c20147a\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sun, 05 Apr 2026 05:31:39 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Nuclei-Ignore-Error":["unexpected EOF"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=UTF-8","response_content_length":0,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpWYXJ5OiBBY2NlcHQtRW5jb2RpbmcNClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNClgtTnVjbGVpLUlnbm9yZS1FcnJvcjogdW5leHBlY3RlZCBFT0YNCkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKg0KQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgNCkZlYXR1cmUtUG9saWN5OiBwYXltZW50ICdzZWxmJw0KRGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMzowNSBHTVQNCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpYLVJlY3J1aXRpbmc6IC8jL2pvYnMNCkFjY2VwdC1SYW5nZXM6IGJ5dGVzDQpDYWNoZS1Db250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MA0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KRXRhZzogVy8iMTI0ZmEtMTlkNWMyMDE0N2EiDQpMYXN0LU1vZGlmaWVkOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMxOjM5IEdNVA0KDQo=","response_hash":"7a523be76adb0fbcc4e73cc495c077063b971aa32052a836a28974488152df24","response_time_ms":0,"response_words":44,"has_response":true,"parameters":[{"name":"1","value":"metrics","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12},{"name":"2","value":"editor-4.7.8.php","type":"path","name_start":-1,"name_end":-1,"value_start":13,"value_end":29}],"sent_at":"2026-04-05T05:33:08.392674Z","received_at":"2026-04-05T05:33:08.392674Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"c30b649c-2e5a-471c-af92-08b49993d3be","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/metrics/editor-4.7.9-mysql-en.php","url":"http://localhost:3000/metrics/editor-4.7.9-mysql-en.php","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9tZXRyaWNzL2VkaXRvci00LjcuOS1teXNxbC1lbi5waHAgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"9fa03f599f378358bf75b3fc9d96eaadc3e51f1e50cd11a22e5cfb1a591f044b","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["text/html; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:33:05 GMT"],"Etag":["W/\"124fa-19d5c20147a\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sun, 05 Apr 2026 05:31:39 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Nuclei-Ignore-Error":["unexpected EOF"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=UTF-8","response_content_length":0,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1VVEYtOA0KRGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMzowNSBHTVQNCkV0YWc6IFcvIjEyNGZhLTE5ZDVjMjAxNDdhIg0KTGFzdC1Nb2RpZmllZDogU3VuLCAwNSBBcHIgMjAyNiAwNTozMTozOSBHTVQNClgtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYNClgtRnJhbWUtT3B0aW9uczogU0FNRU9SSUdJTg0KQWNjZXB0LVJhbmdlczogYnl0ZXMNCkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKg0KVmFyeTogQWNjZXB0LUVuY29kaW5nDQpYLU51Y2xlaS1JZ25vcmUtRXJyb3I6IHVuZXhwZWN0ZWQgRU9GDQpYLVJlY3J1aXRpbmc6IC8jL2pvYnMNCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KQ2FjaGUtQ29udHJvbDogcHVibGljLCBtYXgtYWdlPTANCkZlYXR1cmUtUG9saWN5OiBwYXltZW50ICdzZWxmJw0KDQo=","response_hash":"fd80ed1d00749faf129c7264bfb15dca433252e4d620ba12081f073715bcb1fc","response_time_ms":0,"response_words":44,"has_response":true,"parameters":[{"name":"1","value":"metrics","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12},{"name":"2","value":"editor-4.7.9-mysql-en.php","type":"path","name_start":-1,"name_end":-1,"value_start":13,"value_end":38}],"sent_at":"2026-04-05T05:33:08.39268Z","received_at":"2026-04-05T05:33:08.392679Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"70409b74-a788-49b9-80e4-d3d0347c9967","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/metrics/editor-4.7.9-en.php","url":"http://localhost:3000/metrics/editor-4.7.9-en.php","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9tZXRyaWNzL2VkaXRvci00LjcuOS1lbi5waHAgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"42c6e8a5bfde3de10de9b88aa2c70d23489a8b7adb8e1ebb408eaba9d30b57d4","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["text/html; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:33:05 GMT"],"Etag":["W/\"124fa-19d5c20147a\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sun, 05 Apr 2026 05:31:39 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Nuclei-Ignore-Error":["unexpected EOF"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=UTF-8","response_content_length":0,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpFdGFnOiBXLyIxMjRmYS0xOWQ1YzIwMTQ3YSINCkZlYXR1cmUtUG9saWN5OiBwYXltZW50ICdzZWxmJw0KWC1SZWNydWl0aW5nOiAvIy9qb2JzDQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMzOjA1IEdNVA0KWC1Db250ZW50LVR5cGUtT3B0aW9uczogbm9zbmlmZg0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpYLU51Y2xlaS1JZ25vcmUtRXJyb3I6IHVuZXhwZWN0ZWQgRU9GDQpBY2NlcHQtUmFuZ2VzOiBieXRlcw0KQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqDQpLZWVwLUFsaXZlOiB0aW1lb3V0PTUNClZhcnk6IEFjY2VwdC1FbmNvZGluZw0KQ2FjaGUtQ29udHJvbDogcHVibGljLCBtYXgtYWdlPTANCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVURi04DQpMYXN0LU1vZGlmaWVkOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMxOjM5IEdNVA0KDQo=","response_hash":"621f3f5e8967412fb6f58ea49464fa2647121972c3c215c0f87f5e6442627278","response_time_ms":0,"response_words":44,"has_response":true,"parameters":[{"name":"1","value":"metrics","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12},{"name":"2","value":"editor-4.7.9-en.php","type":"path","name_start":-1,"name_end":-1,"value_start":13,"value_end":32}],"sent_at":"2026-04-05T05:33:08.392686Z","received_at":"2026-04-05T05:33:08.392685Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"7952da17-45f5-4124-89be-d2645e4ea764","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/metrics/editor-4.7.8-mysql-en.php","url":"http://localhost:3000/metrics/editor-4.7.8-mysql-en.php","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9tZXRyaWNzL2VkaXRvci00LjcuOC1teXNxbC1lbi5waHAgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"242d99b65b2530933812406c47b5f8c87905a964163001aa9526f393a8886119","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["text/html; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:33:05 GMT"],"Etag":["W/\"124fa-19d5c20147a\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sun, 05 Apr 2026 05:31:39 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Nuclei-Ignore-Error":["unexpected EOF"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=UTF-8","response_content_length":0,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpWYXJ5OiBBY2NlcHQtRW5jb2RpbmcNClgtUmVjcnVpdGluZzogLyMvam9icw0KQ2FjaGUtQ29udHJvbDogcHVibGljLCBtYXgtYWdlPTANCkV0YWc6IFcvIjEyNGZhLTE5ZDVjMjAxNDdhIg0KWC1Db250ZW50LVR5cGUtT3B0aW9uczogbm9zbmlmZg0KQWNjZXB0LVJhbmdlczogYnl0ZXMNCkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKg0KRGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMzowNSBHTVQNCkZlYXR1cmUtUG9saWN5OiBwYXltZW50ICdzZWxmJw0KQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgNCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpYLU51Y2xlaS1JZ25vcmUtRXJyb3I6IHVuZXhwZWN0ZWQgRU9GDQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpMYXN0LU1vZGlmaWVkOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMxOjM5IEdNVA0KDQo=","response_hash":"5873ca697c451bdf17e951183ce60fa976e56b591d0aad3ba303600d35fec184","response_time_ms":0,"response_words":44,"has_response":true,"parameters":[{"name":"1","value":"metrics","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12},{"name":"2","value":"editor-4.7.8-mysql-en.php","type":"path","name_start":-1,"name_end":-1,"value_start":13,"value_end":38}],"sent_at":"2026-04-05T05:33:08.392692Z","received_at":"2026-04-05T05:33:08.392692Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"6607ee93-e119-4469-ac8d-5793922fea5b","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/metrics/editor-4.7.9.php","url":"http://localhost:3000/metrics/editor-4.7.9.php","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9tZXRyaWNzL2VkaXRvci00LjcuOS5waHAgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"28fc8949bc3220612d09c5f644b1de075f80bd75a7abc54576af8cc07e889584","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["text/html; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:33:05 GMT"],"Etag":["W/\"124fa-19d5c20147a\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sun, 05 Apr 2026 05:31:39 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Nuclei-Ignore-Error":["unexpected EOF"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=UTF-8","response_content_length":0,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpMYXN0LU1vZGlmaWVkOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMxOjM5IEdNVA0KVmFyeTogQWNjZXB0LUVuY29kaW5nDQpYLUZyYW1lLU9wdGlvbnM6IFNBTUVPUklHSU4NCkFjY2VwdC1SYW5nZXM6IGJ5dGVzDQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMzOjA1IEdNVA0KRXRhZzogVy8iMTI0ZmEtMTlkNWMyMDE0N2EiDQpYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBub3NuaWZmDQpYLVJlY3J1aXRpbmc6IC8jL2pvYnMNCkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKg0KQ2FjaGUtQ29udHJvbDogcHVibGljLCBtYXgtYWdlPTANCktlZXAtQWxpdmU6IHRpbWVvdXQ9NQ0KWC1OdWNsZWktSWdub3JlLUVycm9yOiB1bmV4cGVjdGVkIEVPRg0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgNCkZlYXR1cmUtUG9saWN5OiBwYXltZW50ICdzZWxmJw0KDQo=","response_hash":"44a7955c928a05b1d96dfce88c039620143f681d4f2ea69baff851345cfd07ca","response_time_ms":0,"response_words":44,"has_response":true,"parameters":[{"name":"1","value":"metrics","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12},{"name":"2","value":"editor-4.7.9.php","type":"path","name_start":-1,"name_end":-1,"value_start":13,"value_end":29}],"sent_at":"2026-04-05T05:33:08.392698Z","received_at":"2026-04-05T05:33:08.392698Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"f6075958-ecf6-4917-92b9-3139a36568ba","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/metrics/editor-4.8.0-en.php","url":"http://localhost:3000/metrics/editor-4.8.0-en.php","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9tZXRyaWNzL2VkaXRvci00LjguMC1lbi5waHAgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"d19e8a461874ff21e8a4282ce8a3978de270af02cca4e9f37e12a323494cb498","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["text/html; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:33:05 GMT"],"Etag":["W/\"124fa-19d5c20147a\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sun, 05 Apr 2026 05:31:39 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Nuclei-Ignore-Error":["unexpected EOF"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=UTF-8","response_content_length":0,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpWYXJ5OiBBY2NlcHQtRW5jb2RpbmcNClgtUmVjcnVpdGluZzogLyMvam9icw0KQWNjZXB0LVJhbmdlczogYnl0ZXMNCkV0YWc6IFcvIjEyNGZhLTE5ZDVjMjAxNDdhIg0KS2VlcC1BbGl2ZTogdGltZW91dD01DQpMYXN0LU1vZGlmaWVkOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMxOjM5IEdNVA0KWC1OdWNsZWktSWdub3JlLUVycm9yOiB1bmV4cGVjdGVkIEVPRg0KQ2FjaGUtQ29udHJvbDogcHVibGljLCBtYXgtYWdlPTANCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVURi04DQpDb25uZWN0aW9uOiBrZWVwLWFsaXZlDQpYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBub3NuaWZmDQpYLUZyYW1lLU9wdGlvbnM6IFNBTUVPUklHSU4NCkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKg0KRGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMzowNSBHTVQNCkZlYXR1cmUtUG9saWN5OiBwYXltZW50ICdzZWxmJw0KDQo=","response_hash":"03cad5c44f9a38ca886832391eeaec69f32a468bc7cc17c1990714ea5e874348","response_time_ms":0,"response_words":44,"has_response":true,"parameters":[{"name":"1","value":"metrics","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12},{"name":"2","value":"editor-4.8.0-en.php","type":"path","name_start":-1,"name_end":-1,"value_start":13,"value_end":32}],"sent_at":"2026-04-05T05:33:08.392705Z","received_at":"2026-04-05T05:33:08.392704Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"b325d382-ca70-4776-b816-280f52b1dbff","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"http","hostname":"localhost","port":3000,"ip":"::1","method":"GET","path":"/metrics/editor-4.8.0-mysql-en.php","url":"http://localhost:3000/metrics/editor-4.8.0-mysql-en.php","http_version":"HTTP/1.1","request_headers":{"Host":["localhost:3000"]},"request_content_length":0,"raw_request":"R0VUIC9tZXRyaWNzL2VkaXRvci00LjguMC1teXNxbC1lbi5waHAgSFRUUC8xLjENCkhvc3Q6IGxvY2FsaG9zdDozMDAwDQoNCg==","request_hash":"e4f3c7c5e2f815f636b057ebd7a4aac17db9c99a6df33e7553a19a1784d7026f","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"Accept-Ranges":["bytes"],"Access-Control-Allow-Origin":["*"],"Cache-Control":["public, max-age=0"],"Connection":["keep-alive"],"Content-Type":["text/html; charset=UTF-8"],"Date":["Sun, 05 Apr 2026 05:33:05 GMT"],"Etag":["W/\"124fa-19d5c20147a\""],"Feature-Policy":["payment 'self'"],"Keep-Alive":["timeout=5"],"Last-Modified":["Sun, 05 Apr 2026 05:31:39 GMT"],"Vary":["Accept-Encoding"],"X-Content-Type-Options":["nosniff"],"X-Frame-Options":["SAMEORIGIN"],"X-Nuclei-Ignore-Error":["unexpected EOF"],"X-Recruiting":["/#/jobs"]},"response_content_type":"text/html; charset=UTF-8","response_content_length":0,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpBY2NlcHQtUmFuZ2VzOiBieXRlcw0KQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqDQpDYWNoZS1Db250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MA0KQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgNCkZlYXR1cmUtUG9saWN5OiBwYXltZW50ICdzZWxmJw0KVmFyeTogQWNjZXB0LUVuY29kaW5nDQpYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBub3NuaWZmDQpYLU51Y2xlaS1JZ25vcmUtRXJyb3I6IHVuZXhwZWN0ZWQgRU9GDQpEYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMzOjA1IEdNVA0KQ29ubmVjdGlvbjoga2VlcC1hbGl2ZQ0KRXRhZzogVy8iMTI0ZmEtMTlkNWMyMDE0N2EiDQpMYXN0LU1vZGlmaWVkOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMxOjM5IEdNVA0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lODQpLZWVwLUFsaXZlOiB0aW1lb3V0PTUNClgtUmVjcnVpdGluZzogLyMvam9icw0KDQo=","response_hash":"6d0576b7f15d33320c7453fbc5f78c3887861822e700ed2aa18940907b5d5356","response_time_ms":0,"response_words":44,"has_response":true,"parameters":[{"name":"1","value":"metrics","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12},{"name":"2","value":"editor-4.8.0-mysql-en.php","type":"path","name_start":-1,"name_end":-1,"value_start":13,"value_end":38}],"sent_at":"2026-04-05T05:33:08.392711Z","received_at":"2026-04-05T05:33:08.392711Z","created_at":"2026-04-05T05:33:08Z","source":"deparos","is_authenticated":false,"risk_score":0}} +{"type":"module","data":{"id":"xss-light-url-params","name":"XSS Light - URL Parameters","type":"active","description":"## Description\nCharacter-based Reflected XSS detection for URL query parameters. Applies POST-to-GET\nconversion when applicable and tests URL parameters for reflection-based XSS.\n\n## Notes\n- Focuses specifically on URL query string parameters\n- Converts POST parameters to GET for broader coverage when applicable\n\n## References\n- https://portswigger.net/burp/documentation/scanner/xss","short_description":"Detects XSS in URL parameters (POST→GET conversion when applicable)","confirmation_criteria":"Confirmed when URL query parameter values are reflected in the response with exploitable character handling","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"xss-light-path","name":"XSS Light - Path Injection","type":"active","description":"## Description\nCharacter-based Reflected XSS detection in URL path segments. Tests path components\nfor reflection using recursive, cut, and append injection strategies.\n\n## Notes\n- Targets URL path segments rather than query parameters\n- Uses multiple path manipulation strategies for thorough coverage\n\n## References\n- https://portswigger.net/burp/documentation/scanner/xss","short_description":"Detects XSS via path manipulation (recursive, cut, append)","confirmation_criteria":"Confirmed when injected path segment characters are reflected in the response without sanitization","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"xss-light-param-discovery","name":"XSS Light - Parameter Discovery","type":"active","description":"## Description\nDiscovers and tests hidden parameters that reflect in the response. Brute-forces common\nparameter names and checks if values are echoed back, then tests for XSS.\n\n## Notes\n- Runs per-request to discover parameters not visible in the original request\n- Combines parameter discovery with XSS Light transform analysis\n\n## References\n- https://portswigger.net/burp/documentation/scanner/xss","short_description":"Detects XSS via echo parameter discovery","confirmation_criteria":"Confirmed when a discovered hidden parameter reflects injected characters without proper encoding","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"reflected-ssti","name":"Reflected SSTI","type":"active","description":"## Description\nDetects Server-Side Template Injection vulnerabilities by injecting math expressions\n(e.g., {{7*7}}) and checking if the computed result appears in the response.\n\n## Notes\n- Tests multiple template engine syntaxes (Jinja2, Twig, Freemarker, etc.)\n- Uses unique random values to avoid false positives from cached responses\n- Confirmed by matching computed mathematical results in the response\n\n## References\n- https://portswigger.net/research/server-side-template-injection","short_description":"Detects SSTI via math expression evaluation","confirmation_criteria":"Confirmed when injected math expressions (e.g., {{7*7}}=49) are evaluated and the computed result appears in the response","severity":"high","confidence":"certain","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssti-detection","name":"SSTI Detection","type":"active","description":"## Description\nDetects Server-Side Template Injection via Boolean Error-Based Blind technique.\nSends valid and invalid template expressions and compares response differences.\n\n## Notes\n- Uses differential analysis: valid template syntax vs invalid syntax\n- Detects template engines by error response patterns\n- Complements the Reflected SSTI module with blind detection\n\n## References\n- https://portswigger.net/research/server-side-template-injection","short_description":"Diff-based SSTI detection via error responses","confirmation_criteria":"Confirmed when valid template expressions produce different responses than syntactically invalid ones, indicating server-side evaluation","severity":"high","confidence":"certain","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"csti-detection","name":"Client-Side Template Injection (CSTI)","type":"active","description":"## Description\nDetects Client-Side Template Injection vulnerabilities by injecting template expressions\n(e.g., {{7*7}}) and checking if the expression is reflected literally (not HTML-encoded)\nin the response body within a client-side template framework scope.\n\n## Notes\n- Different from server-side SSTI: checks for literal reflection, not evaluation\n- Fingerprints AngularJS and Vue.js frameworks per-host (cached)\n- Only scans hosts where a client-side template framework is detected\n- Verifies the expression is not HTML-encoded (which would prevent exploitation)\n- Uses double confirmation with random anchors to reduce false positives\n\n## References\n- https://portswigger.net/research/xss-without-html-client-side-template-injection-with-angularjs\n- https://portswigger.net/web-security/cross-site-scripting/contexts/client-side-template-injection","short_description":"Detects client-side template injection in AngularJS/Vue.js applications","confirmation_criteria":"Confirmed when injected template expressions (e.g., {{7*7}}) are reflected literally in the HTML response within a client-side framework scope","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"angular-template-injection","name":"Angular Template Injection","type":"active","description":"## Description\nDetects Angular template injection vulnerabilities by injecting math expressions inside\nAngular template syntax (e.g., {{7*7}}) and checking if the computed result appears in\nthe response. This indicates the Angular engine is evaluating user-controlled expressions,\nwhich can lead to arbitrary JavaScript execution.\n\n## Notes\n- Tests basic Angular expression evaluation ({{mathA*mathB}})\n- Tests Angular 1.x sandbox bypass via constructor chain\n- Uses double confirmation with random math anchors to reduce false positives\n- Each confirmation attempt uses different random values\n- Checks that computed result appears in response but not in baseline\n\n## References\n- https://portswigger.net/research/xss-without-html-client-side-template-injection-with-angularjs\n- https://github.com/nicedayzhu/angular-sandbox-bypass-collection","short_description":"Detects Angular template injection via expression evaluation","confirmation_criteria":"Confirmed when injected Angular math expressions are evaluated and the computed result appears in the response across multiple attempts","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"lfi-generic","name":"LFI Generic","type":"active","description":"## Description\nDetects Local File Inclusion vulnerabilities by injecting path traversal payloads\nand checking for known file contents (e.g., /etc/passwd, win.ini) in responses.\n\n## Notes\n- Tests each insertion point with multiple traversal depth levels\n- Matches against known OS file content signatures\n- Uses request deduplication to avoid redundant checks\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/11.1-Testing_for_Local_File_Inclusion","short_description":"Detects LFI via path traversal payloads","confirmation_criteria":"Confirmed when path traversal payloads cause known system file contents (e.g., /etc/passwd) to appear in the response","severity":"critical","confidence":"certain","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"lfi-path-traversal","name":"LFI Path Traversal","type":"active","description":"## Description\nDetects Local File Inclusion vulnerabilities using advanced path traversal techniques\nincluding null byte injection, double URL encoding, Unicode bypass characters, and\nmulti-marker confirmation to reduce false positives.\n\n## Notes\n- Complements lfi_generic with deeper traversal payloads and stronger confirmation\n- Requires at least 2 markers to match in fuzzed response (not present in baseline)\n- Body length delta check prevents matching on trivially similar responses\n- Pre-filters insertion points by file-like parameter names and path-like values\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/11.1-Testing_for_Local_File_Inclusion\n- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion","short_description":"Detects LFI via advanced path traversal, null bytes, encoding bypass, and multi-marker confirmation","confirmation_criteria":"Confirmed when multiple file content markers appear in the response after injecting path traversal payloads and are absent from the baseline response","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sqli-error-based","name":"SQLi Error Based","type":"active","description":"## Description\nDetects SQL injection vulnerabilities by injecting SQL syntax into parameters and\nanalyzing response bodies for database error messages from MySQL, PostgreSQL, MSSQL,\nOracle, and SQLite.\n\n## Notes\n- Tests each insertion point independently\n- Uses request deduplication to avoid redundant checks\n- Skips hosts that have exceeded the error threshold\n\n## References\n- https://owasp.org/www-community/attacks/SQL_Injection","short_description":"Detects SQLi via error messages","confirmation_criteria":"Confirmed when injected SQL syntax triggers a database error pattern in the response body","severity":"critical","confidence":"certain","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sqli-boolean-blind","name":"Blind SQL Injection (Boolean-Based)","type":"active","description":"## Description\nTests for boolean-based blind SQL injection by sending paired TRUE/FALSE payloads and comparing\nresponse differentials. Uses triple-verification to minimize false positives: TRUE and FALSE\npayloads must produce consistently different responses across multiple requests.\n\n## Notes\n- Sends TRUE and FALSE payload pairs to each injection point\n- Compares responses using status code, body length differential, and content hash\n- Triple-verification: confirms TRUE/FALSE differential is consistent across retries\n- Tests string context, numeric context, and WAF bypass payloads\n- Uses NoRedirects to capture TRUE/FALSE differential before redirect\n\n## References\n- https://owasp.org/www-community/attacks/Blind_SQL_Injection\n- https://portswigger.net/web-security/sql-injection/blind","short_description":"Detects boolean-based blind SQL injection vulnerabilities","confirmation_criteria":"Confirmed when TRUE payloads consistently produce different responses from FALSE payloads across multiple verification requests","severity":"high","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sqli-time-blind","name":"Blind SQL Injection (Time-Based)","type":"active","description":"## Description\nTests for time-based blind SQL injection by sending paired sleep/no-sleep payloads and\nmeasuring response time differentials. Uses triple-verification (sleep, no-sleep, sleep)\nto minimize false positives caused by network jitter or server load.\n\n## Notes\n- Sends sleep and no-sleep payload pairs to each injection point\n- Measures response time using wall-clock timing around each request\n- Triple-verification: confirms sleep causes consistent delay across multiple requests\n- Tests MySQL SLEEP, PostgreSQL pg_sleep, MSSQL WAITFOR DELAY, SQLite RANDOMBLOB, Oracle DBMS_PIPE\n- Tests both string and numeric contexts\n- Uses NoRedirects to capture timing before redirect\n\n## References\n- https://owasp.org/www-community/attacks/Blind_SQL_Injection\n- https://portswigger.net/web-security/sql-injection/blind/lab-time-delays","short_description":"Detects time-based blind SQL injection vulnerabilities","confirmation_criteria":"Confirmed when sleep payloads consistently cause measurable time delays compared to no-sleep payloads across triple verification","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nosqli-error-based","name":"NoSQLi Error Based","type":"active","description":"## Description\nDetects NoSQL injection vulnerabilities by injecting MongoDB/NoSQL operators and\nsyntax into parameters and analyzing response bodies for database error messages.\n\n## Notes\n- Tests each insertion point with NoSQL-specific payloads\n- Detects MongoDB, CouchDB, and Cassandra error patterns\n- Uses request deduplication to avoid redundant checks\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/05.6-Testing_for_NoSQL_Injection\n- https://portswigger.net/web-security/nosql-injection","short_description":"Detects NoSQL injection via error messages and operator injection","confirmation_criteria":"Confirmed when injected NoSQL operators trigger database error patterns in the response body","severity":"critical","confidence":"certain","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nosqli-operator-injection","name":"NoSQL Operator Injection","type":"active","description":"## Description\nTests for NoSQL injection by injecting MongoDB query operators ($ne, $gt, $regex,\n$where) and detecting authentication bypass, data exfiltration, and behavioral\nchanges. Complements nosqli_error_based by focusing on operator-level injection\nrather than error messages.\n\n## Notes\n- Payload selection adapts to insertion point type (JSON, URL, body)\n- Four detection modes: auth bypass, size increase, boolean differential, time delay\n- Skips when NoSQL error patterns are detected (deferred to nosqli_error_based)\n- Deduplicates by request hash manager\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/05.6-Testing_for_NoSQL_Injection\n- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20Injection","short_description":"Detects MongoDB operator injection ($ne, $gt, $regex, $where) for auth bypass and data exfiltration","confirmation_criteria":"Confirmed when NoSQL operator injection causes authentication bypass, data exfiltration, or measurable behavioral change","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"crlf-injection","name":"CRLF Injection","type":"active","description":"## Description\nDetects CRLF injection vulnerabilities in HTTP headers by injecting carriage return and\nline feed characters and checking if they appear in response headers.\n\n## Notes\n- Tests URL parameters for header injection via CRLF sequences\n- Can lead to HTTP response splitting and header injection attacks\n\n## References\n- https://owasp.org/www-community/vulnerabilities/CRLF_Injection","short_description":"Detects CRLF injection","confirmation_criteria":"Confirmed when injected CRLF sequences appear in HTTP response headers, indicating header injection","severity":"medium","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"code-exec","name":"Code Execution (RCE)","type":"active","description":"## Description\nDetects OS Command Injection vulnerabilities using time-based blind detection. Injects\nsleep/delay commands and measures response time differences to confirm execution.\n\n## Notes\n- Uses time-based blind technique to avoid false positives\n- Tests multiple shell syntaxes (bash, cmd, PowerShell)\n\n## References\n- https://owasp.org/www-community/attacks/Command_Injection\n- https://portswigger.net/bappstore/3123d5b5f25c4128894d97ea1571571c","short_description":"Detects OS command injection via time-based blind","confirmation_criteria":"Confirmed when injected sleep/delay commands cause measurable response time increase matching the specified delay","severity":"critical","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"input-behavior-probe","name":"Input Behavior Probe","type":"active","description":"## Description\nComprehensive behavior probing module that detects anomalous responses by\ncomparing HTML tag structure and status codes against a baseline. Operates\nat both request scope and insertion-point scope.\n\n## Probe Types\n1. **Header probing** (per-request): Injects values into known security-relevant\n headers (X-Forwarded-Host, X-Original-URL, etc.) and weird header names.\n2. **Path manipulation** (per-request): Applies prefix/postfix path traversal\n and encoding tricks to each URL path segment.\n3. **Debug parameter injection** (per-request): Appends debug/admin parameters\n (debug=true, admin=1, etc.) to detect hidden debug modes.\n4. **Polyglot fuzz** (per-insertion-point): Injects a polyglot payload to detect\n HTML tag structure changes (original behavior).\n5. **Param char fuzzing** (per-insertion-point): Appends special characters to\n parameter values to detect parser-level behavior differences.\n\n## Notes\n- Compares HTML tag counts and status codes between baseline and probed responses\n- Low confidence; useful as a triage signal for manual investigation\n- Per-request probes are deduped by host+path; per-IP probes are deduped by request hash\n\n## References\n- https://owasp.org/www-community/Fuzzing\n- https://portswigger.net/research/backslash-powered-scanning","short_description":"Detects behavior changes from header, path, debug param, and char probing","confirmation_criteria":"Indicated when probed requests cause structural changes in the response HTML tag tree or notable status code transitions compared to the baseline","severity":"suspect","confidence":"tentative","scan_scope":["PER_INSERTION_POINT","PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"xxe-generic","name":"XXE Generic","type":"active","description":"## Description\nDetects XML External Entity (XXE) injection vulnerabilities in endpoints that accept\nXML input by injecting entity declarations and checking for entity expansion.\n\n## Notes\n- Tests XML body parameters for entity expansion\n- Injects external entity declarations targeting known files\n- Checks for entity value reflection in response body\n- Complements the XML SAML Security module for non-SAML XML endpoints\n\n## References\n- https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing\n- https://portswigger.net/web-security/xxe","short_description":"Detects XML external entity injection in generic XML endpoints","confirmation_criteria":"Confirmed when injected XML entities are expanded and their values appear in the response body","severity":"critical","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"insecure-deserialization","name":"Insecure Deserialization","type":"active","description":"## Description\nDetects insecure deserialization vulnerabilities by injecting serialized object payloads\nand analyzing responses for deserialization error messages across multiple frameworks.\n\n## Notes\n- Tests for Java, PHP, Python, Ruby, and .NET deserialization patterns\n- Uses error-based detection to identify deserialization endpoints\n- Analyzes response bodies for framework-specific error messages\n- OWASP Top 10 2021: A08\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/16-Testing_for_HTTP_Incoming_Requests\n- https://portswigger.net/web-security/deserialization","short_description":"Detects insecure deserialization via error-based detection","confirmation_criteria":"Confirmed when injected serialized payloads trigger deserialization error messages in the response","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssrf-detection","name":"SSRF Detection","type":"active","description":"## Description\nDetects Server-Side Request Forgery (SSRF) vulnerabilities by injecting internal and\nexternal URLs into parameters and analyzing response differences and timing.\n\n## Notes\n- Tests for in-band SSRF using internal IP addresses and cloud metadata endpoints\n- Analyzes response differences between original and injected values\n- Targets parameters with URL-like values\n- OWASP Top 10 2021: A10\n\n## References\n- https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/\n- https://portswigger.net/web-security/ssrf","short_description":"Detects server-side request forgery via out-of-band and in-band techniques","confirmation_criteria":"Confirmed when injected internal URLs or metadata endpoints cause different response content or timing compared to baseline","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssrf-blind","name":"Blind SSRF Detection","type":"active","description":"## Description\nDetects blind Server-Side Request Forgery (SSRF) vulnerabilities by injecting OAST callback\nURLs into URL-like parameters. Unlike in-band SSRF detection, this module detects cases where\nthe server fetches the URL but does not reflect the response content back to the client.\n\n## Notes\n- Requires an interactsh server (configured via oast settings)\n- Targets parameters whose name or value suggests URL input\n- Injects multiple payload formats: direct HTTP/HTTPS, with path, with port, URL-encoded\n- Findings arrive asynchronously via the OAST polling callback\n- Deduplication via RHM and DiskSet to avoid redundant requests\n- OWASP Top 10 2021: A10 (SSRF)\n\n## References\n- https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/\n- https://portswigger.net/web-security/ssrf/blind","short_description":"Detects blind server-side request forgery via OAST callbacks","confirmation_criteria":"Confirmed when target server makes outbound DNS or HTTP request to OAST callback URL injected into a URL-like parameter","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssti-blind","name":"Blind Server-Side Template Injection (SSTI)","type":"active","description":"## Description\nDetects blind Server-Side Template Injection vulnerabilities using a dual approach:\nOAST (Out-of-Band) callbacks via DNS lookups and time-delay payloads as a fallback.\nOAST payloads use nslookup to trigger DNS callbacks, while time-delay payloads use\ncomputationally expensive loops to cause measurable response delays.\n\n## Notes\n- Dual detection: OAST callbacks (Firm confidence) + time-delay fallback (Tentative confidence)\n- OAST payloads target Jinja2, Mako, Freemarker, ERB, EJS, and Pebble engines\n- Time-delay payloads target Jinja2, Twig, Mako, ERB, and Freemarker engines\n- Time-delay uses triple verification (slow, fast, slow) to reduce false positives\n- OAST findings arrive asynchronously via polling callbacks\n\n## References\n- https://portswigger.net/research/server-side-template-injection\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/18-Testing_for_Server-Side_Template_Injection","short_description":"Detects blind SSTI via OAST callbacks and time-delay payloads","confirmation_criteria":"Confirmed via OAST DNS callback from template evaluation or consistent time-delay differential","severity":"critical","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"oast-probe","name":"OAST Probe","type":"active","description":"## Description\nInjects OAST (Out-of-Band Application Security Testing) callback URLs into HTTP headers\nand URL-like parameters to detect blind vulnerabilities such as blind SSRF, blind XXE,\nand blind command injection.\n\n## Notes\n- Requires an interactsh server (configured via oast settings)\n- Injects unique callback URLs into headers: Referer, X-Forwarded-For, X-Forwarded-Host, Origin, X-Original-URL\n- For insertion point scanning, targets parameters with URL-like values\n- Findings arrive asynchronously via the polling callback — this module returns nil results directly\n- DNS-only callbacks are reported as Info; HTTP callbacks are reported as High severity\n- OWASP Top 10 2021: A10 (SSRF)\n\n## References\n- https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/\n- https://portswigger.net/burp/documentation/collaborator","short_description":"Detects blind vulnerabilities via out-of-band callbacks (DNS/HTTP)","confirmation_criteria":"Confirmed when target server makes outbound DNS or HTTP request to OAST callback URL","severity":"high","confidence":"certain","scan_scope":["PER_INSERTION_POINT","PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"proxy-pingback","name":"Proxy Pingback","type":"active","description":"## Description\nProbes for open proxy and callback endpoints by injecting OAST callback URLs into common\nproxy-related URL paths. This detects endpoints that forward or fetch user-supplied URLs\n(open proxy / blind SSRF).\n\n## Notes\n- Requires an interactsh server (configured via oast settings)\n- Targets proxy-related paths: /proxy, /httpproxy, /callback, /url, /remote, etc.\n- Appends OAST URLs via query parameters: url, src, proxy, callback, email, etc.\n- Sends 54 probe requests per host covering path and parameter patterns\n- Each host is tested only once (DiskSet dedup)\n- Findings arrive asynchronously via the OAST polling callback\n- OWASP Top 10 2021: A10 (SSRF)\n\n## References\n- https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/\n- https://portswigger.net/burp/documentation/collaborator","short_description":"Detects open proxy/callback endpoints via OAST URL injection into proxy-related paths","confirmation_criteria":"Confirmed when target server makes outbound DNS or HTTP request to OAST callback URL via proxy endpoint","severity":"high","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cors-misconfiguration","name":"CORS Misconfiguration","type":"active","description":"## Description\nDetects CORS (Cross-Origin Resource Sharing) misconfigurations that allow unauthorized\ncross-origin access. Tests for reflected origins, null origin acceptance, wildcard with\ncredentials, and subdomain bypass patterns.\n\n## Notes\n- Runs once per host with internal deduplication\n- Sends 4 probes with different Origin headers per host\n- Low false-positive rate due to strict header matching\n\n## References\n- https://portswigger.net/web-security/cors\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/11-Client-side_Testing/07-Testing_Cross_Origin_Resource_Sharing","short_description":"Detects permissive CORS policies allowing unauthorized cross-origin access","confirmation_criteria":"Confirmed when the server reflects a controlled Origin value in the Access-Control-Allow-Origin header, indicating permissive CORS policy","severity":"medium","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-actuator-misconfig","name":"Spring Actuator Misconfiguration","type":"active","description":"## Description\nDetects exposed Spring Boot Actuator endpoints that leak sensitive application\ninformation such as environment variables, health status, and configuration.\n\n## Notes\n- Checks common actuator paths (/actuator, /env, /health, /info, /mappings, etc.)\n- Runs per-request to detect misconfigured access controls\n- Exposed actuators can leak secrets, internal URLs, and database credentials\n\n## References\n- https://docs.spring.io/spring-boot/reference/actuator/endpoints.html\n- https://www.veracode.com/blog/research/exploiting-spring-boot-actuators","short_description":"Detects exposed Spring Boot actuator endpoints","confirmation_criteria":"Confirmed when actuator endpoints return valid JSON responses containing application configuration or health data","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"host-header-injection","name":"Host Header Injection","type":"active","description":"## Description\nDetects host header injection vulnerabilities by manipulating the Host header and\nrelated headers (X-Forwarded-Host, X-Host) to identify routing or content changes.\n\n## Notes\n- Tests host header manipulation with evil domain values\n- Checks for host value reflection in response body and headers\n- Runs per-request to test each endpoint\n- Can lead to password reset poisoning, cache poisoning, and SSRF\n\n## References\n- https://portswigger.net/web-security/host-header\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection","short_description":"Detects host header injection and routing manipulation","confirmation_criteria":"Confirmed when manipulated Host header value is reflected in response body, Location header, or other response headers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"web-cache-poisoning","name":"Web Cache Poisoning","type":"active","description":"## Description\nDetects web cache poisoning vulnerabilities by injecting values via unkeyed headers\n(X-Forwarded-Host, X-Forwarded-Scheme, X-Original-URL) and checking for reflection.\n\n## Notes\n- Tests unkeyed headers that may influence cached responses\n- Checks for header value reflection in response body\n- Analyzes cache-related headers (Age, X-Cache, Cache-Control)\n- Runs per-request to test endpoint-specific caching behavior\n\n## References\n- https://portswigger.net/web-security/web-cache-poisoning\n- https://portswigger.net/research/practical-web-cache-poisoning","short_description":"Detects web cache poisoning via unkeyed header injection","confirmation_criteria":"Confirmed when unkeyed header values are reflected in the response body, indicating cache-poisoning potential","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"prototype-pollution","name":"Prototype Pollution","type":"active","description":"## Description\nDetects server-side prototype pollution vulnerabilities by injecting __proto__ and\nconstructor.prototype properties in JSON parameters and analyzing response changes.\n\n## Notes\n- Tests JSON body parameters for prototype pollution vectors\n- Injects __proto__, constructor.prototype, and __proto__[status] payloads\n- Analyzes response status code and body changes after pollution\n- Targets Node.js/Express applications\n\n## References\n- https://portswigger.net/web-security/prototype-pollution\n- https://portswigger.net/research/server-side-prototype-pollution","short_description":"Detects server-side prototype pollution via JSON injection","confirmation_criteria":"Confirmed when __proto__ or constructor.prototype injection causes observable changes in response status, headers, or body","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"client-prototype-pollution","name":"Client-Side Prototype Pollution","type":"active","description":"## Description\nDetects client-side prototype pollution vulnerabilities by analyzing JavaScript code\non the page for known vulnerable URL parameter parsing patterns (sources) and\nexploitable property access patterns (gadgets).\n\n## Notes\n- Different from server-side prototype pollution: targets browser-side JavaScript, not JSON bodies\n- Analyzes inline scripts and fetches external JS files (skipping CDN libraries)\n- Detects source patterns (jQuery.extend, lodash.merge, custom parsers)\n- Detects gadget patterns (innerHTML, eval, script.src assignments)\n- Sends probe requests to verify URL parameter acceptance\n- Host-level deduplication (scans once per host)\n\n## References\n- https://portswigger.net/web-security/prototype-pollution\n- https://portswigger.net/web-security/prototype-pollution/client-side\n- https://portswigger.net/research/widespread-prototype-pollution-gadgets","short_description":"Detects client-side prototype pollution via JavaScript static analysis","confirmation_criteria":"Confirmed when JavaScript static analysis identifies known prototype pollution source patterns in the page's scripts","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"path-normalization","name":"Path Normalization","type":"active","description":"## Description\nTests for path normalization vulnerabilities by iteratively applying traversal payloads\n(with conditional auto-slashing) and checking response status codes and fingerprints\nagainst expected internal/public patterns.\n\n## Notes\n- Compares response fingerprints between public and internal path variations\n- Uses iterative payload application with auto-slashing heuristics\n- Targets middleware and reverse proxy path normalization inconsistencies\n\n## References\n- https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf","short_description":"Detects path normalization vulnerabilities","confirmation_criteria":"Confirmed when traversal payloads produce response fingerprints matching internal resources that differ from public access patterns","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nginx-off-by-slash","name":"Nginx Off-by-Slash","type":"active","description":"## Description\nTests for Nginx \"off-by-slash\" alias traversal misconfiguration. When an Nginx location block\nuses an alias directive without a matching trailing slash, attackers can traverse outside the\nintended directory. For example, \"location /static { alias /var/www/assets/; }\" allows\nrequesting \"/static../etc/passwd\" to read files outside /var/www/assets/.\n\n## Notes\n- Operates on path segments, testing each first-level directory for alias traversal\n- Compares response body against baseline to confirm the traversal resolved to the same content\n- Skips media/JS URLs, non-GET requests, and very small baseline responses\n\n## References\n- https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf\n- https://github.com/bayotop/off-by-slash\n- https://github.com/yandex/gixy\n- https://github.com/hakaioffsec/nginx-alias-traversal","short_description":"Detects Nginx alias traversal via missing trailing slash","confirmation_criteria":"Confirmed when a path-traversal request using the off-by-slash pattern returns status 200 with a body matching a known valid suffix endpoint","severity":"high","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nginx-path-escape","name":"Nginx Path Escape Detection","type":"active","description":"## Description\nDetects Nginx path escape vulnerabilities through differential response analysis,\ntesting alias traversal, URL encoding bypass, and semicolon injection techniques.\n\n## Notes\n- Uses response fingerprint comparison between baseline and test requests\n- Tests per-request with multiple escape techniques\n- Targets Nginx-specific path handling behaviors\n\n## References\n- https://www.acunetix.com/vulnerabilities/web/path-traversal-via-misconfigured-nginx-alias/","short_description":"Diff-based Nginx path escape detection (alias traversal, encoding bypass, semicolon injection)","confirmation_criteria":"Confirmed when path escape payloads produce different response content or status compared to the baseline, indicating path traversal","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"smart-behavior-detection","name":"Smart Behavior Detection","type":"active","description":"## Description\nDetects injection vulnerabilities through differential response analysis. Sends pairs\nof semantically equivalent and different payloads and compares response behaviors.\n\n## Notes\n- Uses behavioral diffing: true/false payload pairs that should produce identical vs different responses\n- Low confidence; serves as a triage signal for deeper investigation\n\n## References\n- https://portswigger.net/bappstore/3123d5b5f25c4128894d97ea1571571c","short_description":"Diff-based injection detection via behavioral analysis","confirmation_criteria":"Indicated when semantically different payloads produce measurably different response behaviors while equivalent payloads produce identical responses","severity":"suspect","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"suspect-transform","name":"Suspect Transform Detection","type":"active","description":"## Description\nDetects suspicious input transformations that may indicate vulnerabilities, including\nexpression evaluation, quote consumption, and unicode normalization issues.\n\n## Notes\n- Tests for server-side expression evaluation (math, string operations)\n- Detects quote consumption that may indicate injection contexts\n- Identifies unicode normalization that could bypass security filters\n\n## References\n- https://portswigger.net/bappstore/3123d5b5f25c4128894d97ea1571571c","short_description":"Detects expression evaluation, quote consumption, unicode transformations","confirmation_criteria":"Indicated when injected expressions are evaluated, quotes are consumed, or unicode characters are normalized by the server","severity":"suspect","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"backslash-transformation","name":"Backslash Transformation Detection","type":"active","description":"## Description\nDetects how servers handle backslash-escaped characters and special characters by injecting\nescape sequences and analyzing transformations in the response.\n\n## Notes\n- Tests each insertion point for backslash consumption, escape interpretation, and unicode handling\n- Useful as a precursor signal for deeper injection testing\n\n## References\n- https://portswigger.net/research/backslash-powered-scanning","short_description":"Detects escape sequence interpretation, backslash consumption, character handling","confirmation_criteria":"Confirmed when injected backslash sequences are transformed differently than literal characters in the response","severity":"suspect","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"race-interference","name":"Race Interference Detection","type":"active","description":"## Description\nDetects race condition vulnerabilities through parallel request analysis, looking for\ninput storage races, cross-request contamination, and request interference patterns.\n\n## Notes\n- Sends concurrent requests with different payloads and analyzes response variations\n- Tests for TOCTOU and state mutation races\n- Requires careful timing analysis\n\n## References\n- https://portswigger.net/research/smashing-the-state-machine","short_description":"Detects input storage, cross-contamination, and request interference races","confirmation_criteria":"Confirmed when parallel requests with different payloads produce cross-contaminated responses, indicating shared mutable state","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"xml-saml-security","name":"XML SAML Security","type":"active","description":"## Description\nDetects unsafe XML transformation in SAML processing, including XXE (XML External Entity)\nand DTD (Document Type Definition) injection vulnerabilities.\n\n## Notes\n- Tests XML parameters for entity expansion and external entity loading\n- Targets SAML-specific XML processing endpoints\n\n## References\n- https://portswigger.net/research/saml-roulette-the-hacker-always-wins\n- https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing","short_description":"SAML XML security checks (XXE/DTD)","confirmation_criteria":"Confirmed when injected XML entities are processed and expanded, or DTD declarations are loaded by the server","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"jwt-vulnerability","name":"JWT Vulnerability","type":"active","description":"## Description\nDetects JWT vulnerabilities including algorithm confusion (none algorithm), weak\nsigning keys, and missing signature verification by manipulating JWT tokens.\n\n## Notes\n- Tests for 'none' algorithm acceptance (CVE-2015-9235)\n- Tests for empty signature acceptance\n- Tests for algorithm confusion (RS256 to HS256)\n- Analyzes Authorization headers and cookies for JWT tokens\n\n## References\n- https://portswigger.net/web-security/jwt\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/06-Session_Management_Testing/10-Testing_JSON_Web_Tokens","short_description":"Detects JWT algorithm confusion and weak signing vulnerabilities","confirmation_criteria":"Confirmed when JWT tokens with 'none' algorithm or empty signature are accepted by the server with a successful response","severity":"critical","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"http-request-smuggling","name":"HTTP Request Smuggling","type":"active","description":"## Description\nDetects HTTP request smuggling vulnerabilities by sending ambiguous requests with\nconflicting Content-Length and Transfer-Encoding headers to identify desync behavior.\n\n## Notes\n- Tests CL.TE and TE.CL desync patterns\n- Uses differential timing analysis to detect smuggling\n- Runs once per host to avoid disruption\n- Requires careful timeout configuration\n\n## References\n- https://portswigger.net/web-security/request-smuggling\n- https://portswigger.net/research/http-desync-attacks","short_description":"Detects HTTP request smuggling via CL.TE and TE.CL desync","confirmation_criteria":"Confirmed when conflicting CL/TE headers cause measurable response timing differences indicating request desync","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"graphql-scan","name":"GraphQL Security Scanner","type":"active","description":"## Description\nDiscovers GraphQL endpoints and tests them for common security misconfigurations including\nenabled introspection, SQL injection through GraphQL arguments, and query batching abuse.\n\n## Notes\n- Probes 8 common GraphQL endpoint paths\n- Tests both POST and GET request methods for endpoint discovery\n- Checks for enabled introspection (information disclosure)\n- Injects SQL payloads into discovered or common field arguments\n- Tests for query batching support (rate limiting bypass)\n- Runs once per host\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/12-API_Testing/01-Testing_GraphQL\n- https://graphql.org/learn/introspection/","short_description":"Tests GraphQL endpoints for introspection, injection, and batching vulnerabilities","confirmation_criteria":"Confirmed when GraphQL endpoint responds to introspection queries, SQL payloads produce database errors, or batch queries execute successfully","severity":"medium","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"file-upload-scan","name":"File Upload Scanner","type":"active","description":"## Description\nTests file upload endpoints for unrestricted file upload vulnerabilities by attempting\nto upload files with various bypass techniques. If upload succeeds, attempts to verify\nexecution of the uploaded file.\n\n## Notes\n- Only triggers on multipart/form-data requests with a filename parameter\n- Tests 7 probe types: direct extension, double extension, null byte, case variation, magic bytes, SVG XXE, and HTML XSS\n- Each probe uses a unique marker for verification\n- Reconstructs multipart body preserving non-file fields (CSRF tokens, hidden fields)\n- Early abort if first probe returns 400/403/415 (strict validation)\n- Attempts to verify upload by fetching common upload directories\n\n## References\n- https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload\n- https://portswigger.net/web-security/file-upload","short_description":"Tests for arbitrary file upload and execution vulnerabilities","confirmation_criteria":"Confirmed when an uploaded file is accessible and contains the unique scan marker, indicating arbitrary file upload and potential code execution","severity":"high","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"default-credentials","name":"Default Credentials","type":"active","description":"## Description\nDetects login endpoints from observed traffic and tests them with common default credential\npairs. Uses intelligent login form detection, CAPTCHA awareness, and lockout protection.\n\n## Notes\n- Only tests POST requests with form-encoded or JSON bodies\n- Detects login endpoints by matching parameter names and URL paths\n- Sends baseline invalid credentials first to establish failure response\n- Stops on first successful login or lockout detection\n- 500ms delay between credential attempts to avoid rate limiting\n- Preserves CSRF tokens and hidden form fields during testing\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/04-Authentication_Testing/02-Testing_for_Default_Credentials","short_description":"Tests for default or common credential pairs on login endpoints","confirmation_criteria":"Confirmed when a known credential pair produces a response significantly different from the invalid-credential baseline, indicating successful authentication","severity":"high","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"forbidden-bypass","name":"403/401 Forbidden Bypass","type":"active","description":"## Description\nTests various techniques to bypass 403 Forbidden and 401 Unauthorized responses, including path manipulation,\nheader injection, HTTP method tampering, method override headers, and URL encoding tricks.\n\n## Notes\n- Only activates when the original response returns 401 or 403 status\n- Tests multiple bypass vectors: path traversal, special headers, HTTP method changes, method override headers\n\n## References\n- https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/403-and-401-bypasses.html","short_description":"Detects bypass methods for 403/401 Forbidden responses","confirmation_criteria":"Confirmed when a bypass technique produces a non-403 response with valid content for a previously forbidden resource","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"http-method-tampering","name":"HTTP Method Tampering","type":"active","description":"## Description\nTests if dangerous HTTP methods (PUT, DELETE, PATCH) are unexpectedly enabled on endpoints,\nand whether method override headers (X-HTTP-Method-Override, X-HTTP-Method, X-Method-Override)\nallow changing server behavior.\n\n## Notes\n- On 2xx endpoints: tests if PUT/DELETE/PATCH return 2xx with meaningful body\n- Tests method override headers via POST with override header set to DELETE/PUT\n- Complementary to forbidden_bypass which focuses on 401/403 endpoints\n- Rate-limited per host to avoid excessive probing\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/06-Test_HTTP_Methods\n- https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html","short_description":"Detects unexpectedly enabled HTTP methods and method override headers","confirmation_criteria":"Confirmed when dangerous HTTP methods return successful responses or method override headers alter server behavior","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"csrf-verify","name":"CSRF Token Verification","type":"active","description":"## Description\nFor requests that contain a CSRF token, this module verifies whether the server\nactually enforces it. It removes, empties, or randomizes the token value and\nchecks if the server still accepts the request.\n\n## Notes\n- Only targets requests that already have a CSRF token parameter\n- Three probe strategies: token removed, token emptied, token randomized\n- Stops probing early if the server returns 4xx/5xx (properly validated)\n- Deduplicates by method + host + path\n\n## References\n- https://owasp.org/www-community/attacks/csrf\n- https://portswigger.net/web-security/csrf/bypassing-token-validation","short_description":"Verifies CSRF token enforcement by removing, emptying, or randomizing tokens","confirmation_criteria":"Confirmed when the server accepts a request with a removed, emptied, or randomized CSRF token","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"idor-detection","name":"IDOR Detection","type":"active","description":"## Description\nActively tests for Insecure Direct Object Reference (IDOR) and Broken Object Level\nAuthorization (BOLA) vulnerabilities by substituting ID parameters with neighbor values\nand comparing responses.\n\nThe module targets parameters classified as object identifiers by the passive IDOR module\n(sequential integers, structured codes, base64-encoded IDs, UUIDv1, emails). For each\ncandidate, it generates predictable neighbor IDs and sends probe requests to detect\nwhether the server enforces authorization.\n\n## Detection Logic\n1. Classify parameter via authzutil.ClassifyParam — skip if not an object ID or low predictability\n2. Generate neighbor IDs (e.g., user_id=42 → 41, 43) via authzutil.GenerateNeighborIDs\n3. Fetch baseline response for the original request\n4. Send probe requests with neighbor IDs and compare responses:\n - 401/403/404 or login redirect → authorization enforced (skip)\n - Soft-denial body strings → authorization enforced (skip)\n - Content identical → public data, not IDOR (skip)\n - Structurally different → different resource type (skip)\n - Structurally similar + different content → potential IDOR finding\n\n## Notes\n- Covers OWASP API1:2023 (Broken Object Level Authorization)\n- Limited to 50 probes per host to avoid excessive traffic\n- Only tests parameters with predictable ID formats (skips UUIDv4, random hex)\n- Confidence promoted to Firm when user-specific fields differ between responses\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/\n- https://cwe.mitre.org/data/definitions/639.html\n- https://portswigger.net/web-security/access-control/idor","short_description":"Detects missing authorization on object ID parameters (IDOR/BOLA)","confirmation_criteria":"Indicated when a probe request with a neighbor object ID returns a structurally similar response with different content, suggesting missing authorization enforcement","severity":"high","confidence":"tentative","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"authz-compare","name":"Cross-Session Authorization Compare","type":"active","description":"## Description\nDetects Broken Object Level Authorization (BOLA) and Insecure Direct Object Reference\n(IDOR) by replaying the same request with different authenticated sessions and comparing\nresponses.\n\nWhen multiple sessions are configured (via --session or --auth-config), this module\nreplays each request observed by the primary session using the compare sessions. It then\nanalyzes the response differences to detect missing authorization enforcement.\n\n## Detection Logic\nFor each request from the primary session:\n1. Skip static assets, media files, and non-authenticated endpoints\n2. Replay the request with each compare session's credentials\n3. Compare primary vs compare responses:\n - Primary 200, Compare 401/403 → properly enforced (skip)\n - Primary 200, Compare 302→login → properly enforced (skip)\n - Primary 200, Compare 200 (same content) → public data (skip)\n - Primary 200, Compare 200 (different content) → IDOR/BOLA finding\n - Primary non-200 → skip (primary can't access either)\n\n## Requirements\n- At least 2 sessions must be configured: one primary and one or more compare sessions\n- Sessions are configured via `--session`, `--auth-config`, or `--session-file` CLI flags\n\n## Notes\n- This module is automatically skipped when no compare sessions are configured\n- Covers OWASP API1:2023 (Broken Object Level Authorization)\n- Complements the idor-detection module which tests neighbor IDs within a single session\n- Uses structural response comparison from authzutil for robust matching\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/\n- https://owasp.org/API-Security/editions/2023/en/0xa5-broken-function-level-authorization/\n- https://cwe.mitre.org/data/definitions/639.html","short_description":"Compares responses across authenticated sessions to detect IDOR/BOLA","confirmation_criteria":"Indicated when two different authenticated sessions receive structurally similar 200 responses with different content at the same endpoint, suggesting missing authorization enforcement","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"mass-assignment","name":"Mass Assignment","type":"active","description":"## Description\nTests JSON API endpoints for mass assignment vulnerabilities by injecting privilege-related\nkeys (role, admin, is_admin, permissions, etc.) into POST/PUT/PATCH JSON request bodies\nand observing server responses.\n\n## Notes\n- Only activates on POST/PUT/PATCH requests with application/json content type\n- Injects one privilege key at a time to isolate findings\n- Reports firm confidence if server echoes back the injected key in response\n- Reports tentative confidence if server accepts the request without error\n- Skips keys already present in the original request body\n\n## References\n- https://cheatsheetseries.owasp.org/cheatsheets/Mass_Assignment_Cheat_Sheet.html\n- https://owasp.org/API-Security/editions/2023/en/0xa3-broken-object-property-level-authorization/","short_description":"Detects mass assignment / parameter pollution in JSON APIs","confirmation_criteria":"Confirmed when injected privilege keys are echoed back in server response or accepted without validation error","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sensitive-file-discovery","name":"Sensitive File Discovery","type":"active","description":"## Description\nDiscovers sensitive files and endpoints exposed on the web server using two\nvalidation strategies. High-confidence probes (~25 paths) use content markers\nto confirm findings. Bulk probes (~1,350 paths covering dot files, extensionless\nfiles, and log files) use Content-Type and body differencing against a 404\nfingerprint.\n\n## Notes\n- Runs once per unique host\n- Marker-based probes: ~25 paths with content marker validation (firm confidence)\n- Generic probes: ~1,350 paths with Content-Type and body differencing (tentative confidence)\n- Generic probes are skipped if the 404 page returns text/plain or octet-stream\n- Fingerprints 404 responses to avoid false positives from custom error pages\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information","short_description":"Probes for exposed sensitive files (.env, .git/config, dot files, log files, and more)","confirmation_criteria":"Marker-based: confirmed when response contains expected content markers. Generic: confirmed when response has text/plain or octet-stream Content-Type and body differs from 404 fingerprint","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"backup-file-discovery","name":"Backup File Discovery","type":"active","description":"## Description\nDiscovers publicly accessible backup files by generating candidate filenames\nfrom the target hostname parts, common backup names, and year variants, then\ncombining them with archive and backup extensions.\n\n## Notes\n- Runs once per unique host\n- Generates ~600-900 candidate paths depending on hostname complexity\n- Validates using 404 fingerprinting, Content-Type, Content-Length, and body differencing\n- SQL/text dumps additionally checked for content markers (CREATE TABLE, INSERT INTO, etc.)\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information","short_description":"Probes for exposed backup archives derived from hostname, common names, and year variants","confirmation_criteria":"Confirmed when response returns 200 with matching archive Content-Type, body size >1KB, and body differs from 404 fingerprint. SQL dumps additionally validated via content markers.","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"iis-shortname-discovery","name":"IIS Short Filename Discovery","type":"active","description":"## Description\nDetects and enumerates IIS 8.3 short filenames exposed through the tilde (~)\nvulnerability. When IIS has short filename generation enabled, an attacker can\ndiscover partial file and directory names by observing differential HTTP status\ncodes for wildcard-based requests.\n\nThe module performs three phases:\n1. **Vulnerability detection** - tests HTTP methods and path suffixes to find a\n working oracle (distinct status codes for existing vs non-existing patterns)\n2. **Character discovery** - identifies which characters appear in short filenames\n to minimize the enumeration search space\n3. **Recursive enumeration** - brute-forces filenames character-by-character\n (up to 6 chars for name, 3 for extension per 8.3 convention)\n\n## Notes\n- Only runs on IIS servers (detected via Server, X-Powered-By, or X-AspNet-Version headers)\n- Runs once per unique host\n- Caps total requests at 2000 per host to avoid excessive traffic\n- Reports discovered 8.3 short filenames (does not attempt full-name autocomplete)\n\n## References\n- https://soroush.me/blog/2023/07/thirteen-years-on-advancing-the-understanding-of-iis-short-file-name-sfn-disclosure/\n- https://github.com/bitquark/shortscan","short_description":"Enumerates IIS 8.3 short filenames via tilde-based oracle (per-host)","confirmation_criteria":"Confirmed when the server returns distinct status codes for wildcard patterns matching existing vs non-existing 8.3 short filenames","severity":"medium","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"jsonp-callback","name":"JSONP Callback Injection","type":"active","description":"## Description\nDetects JSONP (JSON with Padding) endpoints that wrap responses in callback\nfunctions, enabling cross-origin data theft. First checks for existing JSONP\npatterns in responses, then actively injects callback parameters.\n\n## Notes\n- Two-phase detection: passive check for existing JSONP, then active callback injection\n- Severity upgraded from Medium to High if response contains sensitive data\n- Tests multiple common callback parameter names\n- Deduplicates by host + path\n\n## References\n- https://owasp.org/www-community/attacks/Cross_Site_Script_Inclusion\n- https://www.benhayak.com/2015/06/same-origin-method-execution-some.html","short_description":"Detects JSONP endpoints that allow cross-origin data theft via callback injection","confirmation_criteria":"Confirmed when injecting a callback parameter causes the response to be wrapped in the specified function call","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"open-redirect","name":"Open Redirect","type":"active","description":"## Description\nDetects open redirect vulnerabilities by injecting external URLs into parameters\nand checking if the server responds with a redirect to the injected location.\n\n## Notes\n- Tests parameters for unvalidated redirect behavior\n- Checks both Location header and meta refresh redirects\n- Uses request deduplication to avoid redundant checks\n\n## References\n- https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html","short_description":"Detects open redirect vulnerabilities","confirmation_criteria":"Confirmed when injected external URL appears in a redirect Location header or meta refresh tag","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"websocket-security","name":"WebSocket Security","type":"active","description":"## Description\nDetects WebSocket endpoints that accept upgrade requests without proper origin validation.\nTests whether the server enforces origin checks by sending upgrade requests with matching,\nevil, and missing Origin headers.\n\n## Notes\n- Runs once per host+path with internal deduplication\n- Sends up to 3 WebSocket upgrade probes per unique endpoint\n- Low false-positive rate due to strict 101 status code matching\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/11-Client-side_Testing/10-Testing_WebSockets\n- https://portswigger.net/web-security/websockets","short_description":"Detects insecure WebSocket upgrade policies and missing origin validation","confirmation_criteria":"Confirmed when the server accepts a WebSocket upgrade request from an unauthorized or missing origin, indicating missing origin validation","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ws-injection","name":"WebSocket Injection","type":"active","description":"## Description\nTests for injection vulnerabilities (XSS, SQLi, command injection, template injection) in HTTP\nparameters that are likely forwarded to WebSocket message processing contexts. The module targets\nparameters with names commonly associated with WebSocket messaging (e.g., message, data, payload,\ncmd) and sends crafted payloads to detect unvalidated input handling.\n\n## Notes\n- Only tests parameters whose names suggest WebSocket message processing involvement.\n- Checks for reflected XSS payloads, SQL error messages, command output patterns, and template\n expression evaluation in responses.\n- Uses insertion-point-level deduplication to avoid redundant checks.\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/11-Client-side_Testing/10-Testing_WebSockets\n- https://portswigger.net/web-security/websockets","short_description":"Tests for injection vulnerabilities in parameters forwarded to WebSocket message processing","confirmation_criteria":"Confirmed when an injected payload is reflected unencoded, triggers a SQL error, produces command output, or evaluates a template expression in the HTTP response","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ws-cswsh","name":"WebSocket CSWSH","type":"active","description":"## Description\nTests for Cross-Site WebSocket Hijacking (CSWSH) by verifying whether WebSocket upgrade\nendpoints properly validate the Origin header. An attacker can hijack a user's authenticated\nWebSocket connection if the server does not enforce origin checks, allowing cross-origin\nWebSocket handshakes to succeed.\n\n## Notes\n- Only tests endpoints that respond with 101 Switching Protocols to a well-formed WS upgrade.\n- Tests four scenarios: evil external origin, null origin, subdomain spoofing, and missing\n Origin header.\n- Deduplicates by host and path to avoid redundant checks.\n\n## References\n- https://christian-schneider.net/CrossSiteWebSocketHijacking.html\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/11-Client-side_Testing/10-Testing_WebSockets\n- https://portswigger.net/web-security/websockets/cross-site-websocket-hijacking","short_description":"Tests for Cross-Site WebSocket Hijacking via insufficient origin validation","confirmation_criteria":"Confirmed when a WebSocket upgrade succeeds with a malicious, null, subdomain, or missing Origin header","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-rate-limit-bypass","name":"API Rate Limit Bypass","type":"active","description":"## Description\nDetects API rate limiting that can be bypassed using IP spoofing headers such as\nX-Forwarded-For, X-Real-IP, and similar headers. First triggers rate limiting by\nsending rapid requests, then tests whether bypass headers circumvent the limit.\n\n## Notes\n- Runs once per host with internal deduplication\n- Sends up to 10 rapid requests to trigger rate limiting\n- Tests 8 different IP spoofing header variations\n- Only reports when rate limiting is confirmed then bypassed\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/04-Authentication_Testing/04-Testing_for_Bypassing_Authentication_Schema\n- https://portswigger.net/web-security/authentication/password-based","short_description":"Detects rate limiting bypass via IP spoofing headers","confirmation_criteria":"Confirmed when the server enforces rate limiting (429 response) but accepts requests with IP spoofing headers, indicating bypassable rate limiting","severity":"medium","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-data-leakage","name":"Next.js Data Route Leakage","type":"active","description":"## Description\nDetects Next.js data route leakage where authenticated page data can be accessed\nwithout authorization. Next.js Pages Router exposes JSON data at predictable\n/_next/data//.json URLs. When authentication middleware protects\nthe HTML page but not the data route, sensitive page props leak.\n\n## Notes\n- Only activates on 302/401/403 responses from Next.js hosts\n- Requires buildId extraction (from shared cache or response body)\n- Validates JSON response contains pageProps and is not a notFound page\n- Deduplicates by host+path\n\n## References\n- https://nextjs.org/docs/pages/building-your-application/data-fetching\n- https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps","short_description":"Detects unauthorized access to Next.js data routes on auth-protected pages","confirmation_criteria":"Confirmed when the data route returns 200 with valid pageProps JSON for an auth-protected page","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-middleware-bypass","name":"Next.js Middleware Bypass","type":"active","description":"## Description\nTests for Next.js middleware bypass vulnerabilities including CVE-2025-29927 and\npath normalization issues. Next.js middleware runs before route handlers and is\ncommonly used for authentication. Certain header injections and path manipulations\ncan skip middleware execution entirely.\n\n## Notes\n- Only activates on 401/403 responses from Next.js hosts\n- Tests x-middleware-subrequest header injection (CVE-2025-29927)\n- Tests path normalization bypasses (double slashes, URL encoding, locale prefixes)\n- Deduplicates with per-host limit (max 20 attempts per host)\n- Validates bypass by checking status change from 401/403 to 200\n\n## References\n- https://github.com/advisories/GHSA-f82v-jwr5-mffw\n- https://zhero-web-sec.github.io/research-and-things/nextjs-middleware-bypass","short_description":"Detects Next.js middleware authentication bypass via header injection and path manipulation","confirmation_criteria":"Confirmed when a bypass technique changes the response from 401/403 to 200 with non-error content","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-image-ssrf","name":"Next.js Image Optimizer SSRF","type":"active","description":"## Description\nTests the Next.js image optimization endpoint (/_next/image) for Server-Side Request\nForgery. The image optimizer accepts a URL parameter and fetches the image server-side.\nIf improperly configured, it can be abused to access internal resources or cloud\nmetadata endpoints.\n\n## Notes\n- Runs once per host on Next.js-identified targets\n- First verifies /_next/image endpoint exists\n- Uses OAST for out-of-band confirmation when available\n- Falls back to in-band probes (AWS metadata, localhost)\n- Deduplicates by host\n\n## References\n- https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps\n- https://nextjs.org/docs/pages/api-reference/components/image","short_description":"Detects SSRF via the Next.js image optimization endpoint","confirmation_criteria":"Confirmed when the image optimizer fetches an attacker-controlled or internal URL","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-draft-mode-exposure","name":"Next.js Draft Mode Exposure","type":"active","description":"## Description\nProbes common Next.js Draft Mode and Preview Mode API endpoints for missing or weak\nauthentication. Draft Mode allows viewing unpublished CMS content by setting special\ncookies (__prerender_bypass, __next_preview_data). If the enabling endpoint lacks\nproper secret validation, attackers can access embargoed or sensitive content.\n\n## Notes\n- Runs once per host on Next.js-identified targets\n- Probes common draft/preview API routes with no token and common weak tokens\n- Confirms by detecting __prerender_bypass or __next_preview_data cookies in response\n- Deduplicates by host\n\n## References\n- https://nextjs.org/docs/app/guides/draft-mode\n- https://nextjs.org/docs/pages/building-your-application/configuring/preview-mode","short_description":"Detects insecure or unprotected Next.js Draft/Preview Mode endpoints","confirmation_criteria":"Confirmed when a draft/preview endpoint sets bypass cookies without a valid secret","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-version-audit","name":"Next.js Version Audit","type":"active","description":"## Description\nExtracts the Next.js version from client-side JavaScript bundles and maps it to\nknown security advisories. Checks for critical vulnerabilities including middleware\nauth bypass (CVE-2025-29927), SSRF via Server Actions (CVE-2024-34351), cache\npoisoning (CVE-2024-46982), and Server Actions DoS (CVE-2024-39693).\n\n## Notes\n- Active per-host scanner - sends requests to /_next/static/ paths\n- Extracts version from JS bundle patterns (e.g., \"Next.js \")\n- Falls back to __NEXT_DATA__ build metadata analysis\n- Maps extracted version against a local CVE advisory database\n- Deduplicates by host\n\n## References\n- https://github.com/vercel/next.js/security/advisories\n- https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=next.js","short_description":"Fingerprints Next.js version and maps to known CVE advisories","confirmation_criteria":"Confirmed when Next.js version is extracted and matches a known vulnerable version range","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"js-devserver-exposure","name":"JS Dev Server Exposure","type":"active","description":"## Description\nProbes for exposed JavaScript development server endpoints that should never be\naccessible in production. Development servers expose hot module replacement (HMR)\nendpoints, debug tools, and internal APIs that leak source code, enable code injection,\nor reveal server internals.\n\n## Notes\n- Runs once per host\n- Probes: webpack HMR, Vite ping, webpack dev server sockjs, Vue CLI open-in-editor, Nuxt HMR, Remix dev\n- Validates via Content-Type and response body markers\n- Fingerprints 404 to avoid false positives on custom error pages\n\n## References\n- https://webpack.js.org/configuration/dev-server/\n- https://vitejs.dev/config/server-options","short_description":"Detects exposed JavaScript development server endpoints (webpack HMR, Vite, Nuxt)","confirmation_criteria":"Confirmed when a dev server endpoint responds with expected Content-Type or markers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-misconfig","name":"WordPress Misconfiguration","type":"active","description":"## Description\nProbes for WordPress-specific files and endpoints that should not be publicly\naccessible: configuration backups, debug logs, installer/repair endpoints,\ninformational files, directory listings, and the externally triggerable cron.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to avoid false positives from WAF block pages\n- Checks backup variants of wp-config.php (~, .old, .save, .swp, .txt)\n- Detects exposed debug.log with PHP error/warning markers\n- Checks directory listing on /wp-content/uploads/ and /wp-content/plugins/\n\n## References\n- https://developer.wordpress.org/advanced-administration/wordpress/wp-config/\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/","short_description":"Detects exposed WordPress configuration files, debug logs, and dangerous endpoints","confirmation_criteria":"Confirmed when probed WordPress files return 200 with expected content markers (PHP constants, log entries, directory index HTML)","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-xmlrpc","name":"WordPress XML-RPC Abuse","type":"active","description":"## Description\nTests whether the WordPress XML-RPC endpoint is enabled and checks for dangerous\nmethods: system.multicall (enables amplified brute-force attacks in a single request)\nand pingback.ping (enables SSRF-like outbound requests and DDoS amplification).\n\n## Notes\n- Runs once per host\n- Sends a benign system.listMethods call to confirm XML-RPC is active\n- Checks for multicall and pingback methods in the response\n- Does not attempt actual brute-force or pingback abuse\n\n## References\n- https://developer.wordpress.org/plugins/security/data-validation/\n- https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-core","short_description":"Detects enabled WordPress XML-RPC with multicall brute-force and pingback abuse potential","confirmation_criteria":"Confirmed when /xmlrpc.php returns a valid methodResponse containing method names","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-user-enum","name":"WordPress User Enumeration","type":"active","description":"## Description\nTests for WordPress user enumeration through two vectors:\n1. Author archive redirects: /?author=N redirects to /author//\n2. REST API user listing: /wp-json/wp/v2/users returns user objects with slugs\n\nEnumerated usernames can be used for password brute-force attacks.\n\n## Notes\n- Runs once per host\n- Tests author IDs 1 through 5\n- Checks REST API with and without per_page parameter\n- Non-destructive: only performs GET requests\n\n## References\n- https://www.wpbeginner.com/plugins/how-to-discourage-brute-force-by-blocking-author-scans-in-wordpress/\n- https://developer.wordpress.org/rest-api/reference/users/","short_description":"Detects WordPress user enumeration via author archives and REST API","confirmation_criteria":"Confirmed when author archive redirects expose usernames or REST API returns user objects","severity":"medium","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-ajax-exposure","name":"WordPress AJAX Action Exposure","type":"active","description":"## Description\nProbes for commonly vulnerable WordPress AJAX actions registered via\nwp_ajax_nopriv_* that should not be accessible to unauthenticated users.\nThese are among the most frequently exploited WordPress plugin vulnerabilities.\n\n## Notes\n- Runs once per host\n- Tests known vulnerable AJAX action names from popular plugins\n- Sends POST requests to /wp-admin/admin-ajax.php with action parameter\n- Validates responses to distinguish real handlers from WordPress default \"0\" response\n- Does not attempt exploitation, only confirms action handler existence\n\n## References\n- https://developer.wordpress.org/plugins/javascript/ajax/\n- https://www.wordfence.com/threat-intel/vulnerabilities","short_description":"Detects publicly accessible WordPress AJAX actions from plugins with known vulnerabilities","confirmation_criteria":"Confirmed when admin-ajax.php returns a non-default response for a known vulnerable action name","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"drupal-misconfig","name":"Drupal Misconfiguration","type":"active","description":"## Description\nProbes for Drupal-specific files and endpoints that should not be publicly\naccessible: settings.php source disclosure, services.yml, update.php, install.php,\nauthorize.php, CHANGELOG.txt, config sync directory, Twig debug output, public\nfiles directory listing, and development services.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Covers both Drupal 7 and Drupal 8+ paths\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://www.drupal.org/docs/administering-a-drupal-site/security-in-drupal/securing-your-site\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Drupal configuration files, update scripts, installer, debug settings, and directory listings","confirmation_criteria":"Confirmed when probed Drupal files return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"drupal-user-enum","name":"Drupal User Enumeration","type":"active","description":"## Description\nTests for Drupal user enumeration through two vectors:\n1. User profile paths: /user/1 through /user/5, checking for redirects to /users/\n2. JSON:API user listing: /jsonapi/user/user returns user objects anonymously\n\nEnumerated usernames can be used for password brute-force attacks.\n\n## Notes\n- Runs once per host\n- Tests user IDs 1 through 5\n- Checks JSON:API endpoint for anonymous user data access\n- Non-destructive: only performs GET requests\n\n## References\n- https://www.drupal.org/docs/security-in-drupal\n- https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module","short_description":"Detects Drupal user enumeration via user profile paths and JSON:API","confirmation_criteria":"Confirmed when user profile paths expose usernames or JSON:API returns user objects","severity":"medium","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"joomla-misconfig","name":"Joomla Misconfiguration","type":"active","description":"## Description\nProbes for Joomla-specific files and endpoints that should not be publicly\naccessible: configuration.php backups, exposed log and temp directories,\nAkeeba backup archives, debug mode artifacts, com_ajax information disclosure,\nand composer metadata files.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Checks both frontend and administrator paths\n\n## References\n- https://docs.joomla.org/Security_Checklist\n- https://developer.joomla.org/security-centre.html","short_description":"Detects exposed Joomla configuration backups, log/temp directories, backup archives, and debug settings","confirmation_criteria":"Confirmed when probed Joomla files return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"joomla-user-enum","name":"Joomla User Enumeration","type":"active","description":"## Description\nTests for Joomla user enumeration and admin exposure through multiple vectors:\n1. Registration form: accessible /index.php?option=com_users&view=registration\n2. Web Services API (J4+): /api/index.php/v1/users returns user data\n3. Administrator login: /administrator/ publicly accessible without WAF/IP restrictions\n\n## Notes\n- Runs once per host\n- Tests registration form accessibility and API user listing\n- Checks administrator login exposure\n- Non-destructive: only performs GET requests\n\n## References\n- https://docs.joomla.org/Security_Checklist\n- https://developer.joomla.org/security-centre.html","short_description":"Detects Joomla user enumeration via registration form, API endpoints, and admin login exposure","confirmation_criteria":"Confirmed when user registration form is accessible, API exposes user data, or admin login is unprotected","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cms-installer-exposure","name":"CMS Installer Exposure","type":"active","description":"## Description\nProbes for exposed CMS installation and setup wizards that should not be\naccessible in production deployments. Covers WordPress, Drupal, and Joomla\ninstaller endpoints. An accessible installer can allow an attacker to\nre-install or reconfigure the CMS.\n\n## Notes\n- Runs once per host\n- Checks WordPress /wp-admin/install.php, Drupal /install.php and /core/install.php, Joomla /installation/index.php\n- Validates responses with CMS-specific content markers\n- Fingerprints 404 to avoid false positives\n\n## References\n- https://developer.wordpress.org/advanced-administration/before-install/howto-install/\n- https://www.drupal.org/docs/getting-started/installing-drupal\n- https://docs.joomla.org/Installing_Joomla","short_description":"Detects exposed CMS installation wizards for WordPress, Drupal, and Joomla","confirmation_criteria":"Confirmed when installer endpoints return 200 with installation wizard content markers","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-misconfig","name":"Firebase Misconfiguration","type":"active","description":"## Description\nProbes for Firebase-specific files and endpoints that should not be publicly\naccessible: project configuration, security rules, runtime config, service\naccount keys, and mobile config files.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Checks /__/firebase/init.json for project config exposure\n- Probes for security rules files (firestore.rules, storage.rules, database.rules.json)\n- Detects exposed service account keys and runtime configuration\n- Non-destructive: all probes are read-only GET requests\n\n## References\n- https://firebase.google.com/docs/hosting/reserved-urls\n- https://firebase.google.com/docs/rules\n- https://firebase.google.com/docs/admin/setup","short_description":"Detects exposed Firebase configuration, security rules, and credential files","confirmation_criteria":"Confirmed when probed Firebase files return 200 with expected content markers (Firebase config keys, rules syntax, service account fields)","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-rtdb-exposure","name":"Firebase RTDB Exposure","type":"active","description":"## Description\nExtracts Firebase Realtime Database URLs from crawled responses and probes\nthem for public read access. Tests root-level access and common subpaths\nthat often contain sensitive data.\n\n## Notes\n- Extracts databaseURL from Firebase config in HTML/JS responses\n- Probes root with shallow=true for efficient detection\n- Tests common subpaths: users, config, admin, tokens, etc.\n- Non-destructive: all probes are read-only GET requests\n- Scans leaked data for embedded secrets (JWT, API keys)\n- Deduplicates by database URL to avoid redundant probing\n\n## References\n- https://firebase.google.com/docs/database/rest/start\n- https://firebase.google.com/docs/database/security","short_description":"Detects publicly readable Firebase Realtime Database instances","confirmation_criteria":"Confirmed when Firebase RTDB REST endpoint returns HTTP 200 with JSON data instead of permission denied","severity":"critical","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-storage-exposure","name":"Firebase Storage Exposure","type":"active","description":"## Description\nExtracts Firebase Storage bucket names from crawled responses and probes\nthem for public listing and access via the Firebase Storage REST API\nand Google Cloud Storage endpoints.\n\n## Notes\n- Extracts storageBucket from Firebase config in HTML/JS responses\n- Tests object listing via Firebase Storage REST API\n- Probes common prefixes: users/, uploads/, exports/, backups/\n- Tests Google Cloud Storage endpoint for alternative public access\n- Non-destructive: all probes are read-only GET requests\n- Deduplicates by bucket name to avoid redundant probing\n\n## References\n- https://firebase.google.com/docs/storage/web/start\n- https://firebase.google.com/docs/storage/security","short_description":"Detects publicly accessible Firebase Cloud Storage buckets","confirmation_criteria":"Confirmed when Firebase Storage listing endpoint returns HTTP 200 with items or prefixes in JSON response","severity":"high","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-auth-misconfig","name":"Firebase Auth Misconfiguration","type":"active","description":"## Description\nExtracts Firebase API keys from crawled responses and probes the Identity\nToolkit API for authentication misconfigurations including anonymous signup,\nemail enumeration, unrestricted API keys, and weak password policies.\n\n## Notes\n- Extracts apiKey from Firebase config in HTML/JS responses\n- Tests anonymous authentication (signUp without email/password)\n- Tests email enumeration via signInWithPassword error differentiation\n- Tests unrestricted API key usage from scanner origin\n- Cleans up any test accounts created during scanning\n- Deduplicates by API key to avoid redundant probing\n\n## References\n- https://firebase.google.com/docs/auth/web/start\n- https://cloud.google.com/identity-platform/docs/reference/rest","short_description":"Detects Firebase Authentication misconfigurations via Identity Toolkit probing","confirmation_criteria":"Confirmed when Identity Toolkit endpoints respond with auth tokens or distinguishable error codes indicating misconfiguration","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-functions-exposure","name":"Firebase Functions Exposure","type":"active","description":"## Description\nExtracts Cloud Functions URLs from crawled responses and probes them for\nunauthenticated access and verbose error leakage.\n\n## Notes\n- Extracts cloudfunctions.net URLs from HTML/JS responses\n- Parses firebase.json hosting rewrites if available to discover function routes\n- Probes discovered functions without authentication\n- Tests for verbose error/stack trace leakage with malformed input\n- Non-destructive: uses GET and safe POST probes only\n- Deduplicates by function URL to avoid redundant probing\n\n## References\n- https://firebase.google.com/docs/functions/http-events\n- https://firebase.google.com/docs/hosting/cloud-functions","short_description":"Detects unauthenticated Firebase Cloud Functions and verbose error leakage","confirmation_criteria":"Confirmed when Cloud Function endpoints respond with business data without authentication or leak stack traces","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"php-debug-exposure","name":"PHP Debug Exposure","type":"active","description":"## Description\nProbes for PHP-specific debug and administration endpoints that should not be\npublicly accessible: phpinfo() pages at common paths, PHP-FPM status/ping\nendpoints, and phpMyAdmin installations.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Complements sensitive_file_discovery with additional PHP-specific paths\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://www.php.net/manual/en/function.phpinfo.php\n- https://www.php.net/manual/en/fpm.status.php\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed phpinfo pages, PHP-FPM status endpoints, and phpMyAdmin instances","confirmation_criteria":"Confirmed when probed PHP debug endpoints return 200 with expected content markers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"php-source-disclosure","name":"PHP Source Disclosure","type":"active","description":"## Description\nProbes for PHP source code disclosure caused by misconfigured web servers: .phps\nhighlight handlers that expose syntax-highlighted source, alternate PHP extensions\n(.phtml, .php5, .php7) that may serve source as plaintext, and PHP files served\nas static content due to handler misconfiguration.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with PHP source code markers\n- Detects both highlighted source and raw PHP code exposure\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://www.php.net/manual/en/security.hiding.php\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects PHP source code disclosure via .phps handlers, misconfigured extensions, and static file serving","confirmation_criteria":"Confirmed when probed endpoints return PHP source code markers in the response body","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"php-composer-exposure","name":"PHP Composer Exposure","type":"active","description":"## Description\nProbes for Composer dependency management artifacts that should not be publicly\naccessible: composer.json and composer.lock manifests revealing exact dependency\nversions, vendor directory contents, Composer installed metadata, and PHPUnit\ndev endpoint that may allow remote code execution.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- PHPUnit eval-stdin.php is a known RCE vector in vulnerable versions\n\n## References\n- https://getcomposer.org/doc/\n- https://blog.packagist.com/composer-lock-security/\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Composer manifests, vendor directory, and PHPUnit dev endpoints","confirmation_criteria":"Confirmed when probed Composer artifacts return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"php-framework-debug","name":"PHP Framework Debug Exposure","type":"active","description":"## Description\nProbes for debug and development endpoints specific to PHP frameworks beyond\nLaravel and Symfony: Yii debug module and Gii code generator, CodeIgniter\nuser guide and profiler output, CakePHP debug kit, and common PHP framework\ndebug patterns.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Covers Yii, CodeIgniter, CakePHP, and Slim frameworks\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://www.yiiframework.com/doc/guide/2.0/en/tool-debugger\n- https://codeigniter.com/user_guide/\n- https://book.cakephp.org/4/en/debug-kit.html\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed debug endpoints for Yii, CodeIgniter, CakePHP, and other PHP frameworks","confirmation_criteria":"Confirmed when probed framework debug endpoints return 200 with expected content markers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"php-path-info-misconfig","name":"PHP PATH_INFO Misconfiguration","type":"active","description":"## Description\nTests for PHP-FPM/CGI PATH_INFO routing misconfiguration (cgi.fix_pathinfo=1)\nwhere requests to non-existent PHP scripts with PATH_INFO are routed to a\ndifferent script. This can enable authorization bypass or unintended script\nexecution by appending arbitrary paths to valid PHP endpoints.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Sends requests to deliberately invalid script paths\n- Compares responses to establish if PATH_INFO rewriting is active\n- Low false positive rate due to multi-step validation\n\n## References\n- https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#passing-uncontrolled-requests-to-php\n- https://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects cgi.fix_pathinfo routing ambiguity allowing script path manipulation","confirmation_criteria":"Confirmed when requests to non-existent PHP scripts with PATH_INFO return valid responses instead of 404","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-misconfig","name":"Laravel Misconfiguration","type":"active","description":"## Description\nProbes for Laravel framework-specific misconfigurations: debug mode enabled with\nIgnition/Whoops error pages, exposed debugbar endpoints leaking SQL queries and\nroutes, accessible application logs with stack traces and secrets, and exposed\nTelescope debugging dashboard.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Debug mode detection triggers a deliberate error to check for Ignition/Whoops\n\n## References\n- https://laravel.com/docs/configuration\n- https://flareapp.io/docs/ignition-for-laravel/introduction\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects Laravel debug mode, exposed debugbar, application logs, and configuration leaks","confirmation_criteria":"Confirmed when probed Laravel endpoints return 200 with expected framework-specific markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-ignition-rce","name":"Laravel Ignition RCE","type":"active","description":"## Description\nProbes for exposed Laravel Ignition debug endpoints (/_ignition/health-check,\n/_ignition/execute-solution, /_ignition/scripts/*, /_ignition/styles/*) and\nflags potential CVE-2021-3129 RCE candidates when version evidence indicates\nfacade/ignition < 2.5.2 or Laravel < 8.4.2.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Does NOT attempt exploitation; reports as candidate with prerequisites\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://nvd.nist.gov/vuln/detail/CVE-2021-3129\n- https://www.ambionics.io/blog/laravel-debug-rce\n- https://flareapp.io/docs/ignition-for-laravel/introduction","short_description":"Detects exposed Ignition endpoints and flags CVE-2021-3129 RCE candidates","confirmation_criteria":"Confirmed when Ignition endpoints are reachable and return expected framework-specific markers","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-devtool-exposure","name":"Laravel Developer Tool Exposure","type":"active","description":"## Description\nProbes for exposed Laravel developer tools that should not be accessible in\nproduction: Web Tinker (interactive PHP console), Clockwork (profiling tool),\nLaravel Pulse (monitoring dashboard), and Log Viewer. These tools can expose\nsensitive data such as SQL queries, routes, timings, logs, and may allow\narbitrary code execution.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Web Tinker is critical severity due to potential code execution\n\n## References\n- https://github.com/spatie/laravel-web-tinker\n- https://github.com/itsgoingd/clockwork\n- https://laravel.com/docs/pulse\n- https://github.com/opcodesio/log-viewer","short_description":"Detects exposed Laravel developer tools: Web Tinker, Clockwork, Pulse, and Log Viewer","confirmation_criteria":"Confirmed when developer tool endpoints return 200 with expected framework-specific markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-sensitive-files","name":"Laravel Sensitive Files","type":"active","description":"## Description\nProbes for Laravel-specific sensitive files not covered by generic file discovery\nmodules: PHPUnit configuration (phpunit.xml), exposed SQLite databases, storage\nframework internals (sessions, views, cache), vendor PHPUnit eval-stdin.php\n(CVE-2017-9841), and wrong document root indicators (artisan, server.php,\nroutes/web.php, config/app.php, bootstrap/app.php).\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Complements the generic sensitive_file_discovery and php_composer_exposure modules\n- Validates responses with content markers and anti-markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Wrong document root detection is critical severity\n\n## References\n- https://laravel.com/docs/structure\n- https://nvd.nist.gov/vuln/detail/CVE-2017-9841\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects Laravel-specific sensitive files: PHPUnit config, SQLite DB, storage internals, eval-stdin, and wrong document root","confirmation_criteria":"Confirmed when probed Laravel file paths return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-admin-exposure","name":"Laravel Admin Exposure","type":"active","description":"## Description\nProbes for unauthenticated access to Laravel admin panels (Nova, Filament,\nBackpack, Voyager), API documentation endpoints (Swagger UI, L5-Swagger,\nScramble, OpenAPI specs), and GraphQL endpoints with introspection enabled.\nThese surfaces increase attack surface and may expose sensitive data or\nadmin functionality.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Admin panels reported as high severity; API docs as informational/low\n\n## References\n- https://nova.laravel.com/docs\n- https://filamentphp.com/docs\n- https://lighthouse-php.com/master/security/authentication.html","short_description":"Detects unauthenticated access to Laravel admin panels, API documentation, and GraphQL endpoints","confirmation_criteria":"Confirmed when admin or documentation endpoints return 200 with expected framework-specific markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"symfony-misconfig","name":"Symfony Misconfiguration","type":"active","description":"## Description\nProbes for Symfony framework-specific misconfigurations: web profiler/debug toolbar\naccessible in production, dev front controller (app_dev.php) exposed, debug logs,\nand exposed configuration files.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Checks for X-Debug-Token and X-Debug-Token-Link response headers\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://symfony.com/doc/current/reference/configuration/framework.html\n- https://symfony.com/doc/current/profiler.html\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Symfony profiler, debug toolbar, dev front controller, and configuration leaks","confirmation_criteria":"Confirmed when probed Symfony endpoints return 200 with expected framework-specific markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"magento-misconfig","name":"Magento Misconfiguration","type":"active","description":"## Description\nProbes for Magento-specific files and endpoints that should not be publicly\naccessible: setup wizard, downloader interface, version disclosure files,\nexposed configuration, and admin panel paths.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Covers both Magento 1.x and Magento 2.x paths\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://experienceleague.adobe.com/docs/commerce-operations/configuration-guide/overview.html\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Magento setup wizard, downloader, version files, and admin panels","confirmation_criteria":"Confirmed when probed Magento endpoints return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-storage-listing","name":"Cloud Storage Listing","type":"active","description":"## Description\nTests cloud storage endpoints for public listing access. Attempts S3 ListObjectsV2,\nAzure container blob listing, and Azure account container listing requests.\n\n## Notes\n- Only runs on hosts identified as cloud storage endpoints\n- S3: GET /?list-type=2 checking for ListBucketResult\n- Azure: GET /?restype=container&comp=list checking for Blobs\n- Azure: GET /?comp=list checking for Containers\n- Runs once per host with deduplication\n\n## References\n- https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html\n- https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs","short_description":"Detects publicly listable S3 buckets and Azure containers","confirmation_criteria":"Confirmed when storage endpoint returns XML listing response with object/blob entries","severity":"high","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-bucket-takeover","name":"Cloud Bucket Takeover","type":"active","description":"## Description\nTests cloud storage endpoints for bucket/container not-found conditions that indicate\npotential subdomain takeover. Checks for S3 NoSuchBucket, GCS bucket-not-found,\nand Azure ContainerNotFound errors.\n\n## Notes\n- Only runs on hosts identified as cloud storage endpoints\n- GET / and check for specific not-found error patterns\n- Takeover risk exists when DNS points to storage but bucket is unclaimed\n- Runs once per host with deduplication\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/10-Test_for_Subdomain_Takeover\n- https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html","short_description":"Detects dangling cloud storage buckets vulnerable to takeover","confirmation_criteria":"Confirmed when cloud storage endpoint returns bucket/container not-found error while DNS still resolves","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-origin-bypass","name":"Cloud Origin Bypass","type":"active","description":"## Description\nDetects when cloud storage origins are directly reachable with weaker security controls\nthan the CDN/WAF layer. Identifies CDN presence from headers, extracts origin storage\nURLs from response body, and compares security headers between CDN and origin.\n\n## Notes\n- Step 1: Detect CDN from CF-Ray, X-Cache, Via, X-Amz-Cf-Id, X-Served-By headers\n- Step 2: Extract origin storage URLs from response body\n- Step 3: Fetch origin directly and compare security headers\n- Flags when origin is reachable with weaker controls (missing CSP, XFO, XCTO, HSTS)\n- Runs once per host with deduplication\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/\n- https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html","short_description":"Detects direct access to cloud storage origins bypassing CDN security controls","confirmation_criteria":"Confirmed when cloud storage origin is directly reachable with fewer security headers than the CDN-fronted endpoint","severity":"medium","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-public-read","name":"Cloud Public Read","type":"active","description":"## Description\nTests cloud storage endpoints for publicly readable sensitive directories and files.\nProbes common paths like /uploads/, /backups/, /data/, /logs/, /config/ and verifies\nreal content is returned (not error pages).\n\n## Notes\n- Only runs on hosts identified as cloud storage endpoints\n- HEAD then GET common sensitive paths\n- Verifies responses contain real content (body length > 50, not error pages)\n- Runs once per host with deduplication\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/\n- https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-overview.html","short_description":"Detects publicly readable sensitive paths on cloud storage endpoints","confirmation_criteria":"Confirmed when cloud storage endpoint returns real content for sensitive paths without authentication","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-misconfig","name":"ASP.NET Misconfiguration","type":"active","description":"## Description\nProbes for exposed ASP.NET diagnostic and debug endpoints that should not be\naccessible in production. Covers trace.axd, ELMAH, Glimpse, MiniProfiler,\nHangfire dashboard, SignalR endpoints, and Yellow Screen of Death (YSoD)\nverbose error detection.\n\n## Notes\n- Runs once per host\n- Probes diagnostic endpoints with content marker validation\n- Tests for verbose error pages by triggering error conditions\n- Fingerprints 404 to avoid false positives\n\n## References\n- https://learn.microsoft.com/en-us/aspnet/core/fundamentals/error-handling\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/01-Test_Network_Infrastructure_Configuration","short_description":"Detects ASP.NET/IIS misconfigurations including exposed diagnostics, debug endpoints, and verbose errors","confirmation_criteria":"Confirmed when diagnostic endpoints return 200 with expected content markers or verbose error information is disclosed","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-sensitive-files","name":"ASP.NET Sensitive Files","type":"active","description":"## Description\nDiscovers ASP.NET-specific sensitive files and directories exposed on the web\nserver. Covers web.config and its backups/transforms, appsettings.json files,\nconnection string configs, Global.asax, App_Data/bin directories, NuGet configs,\ncross-domain policy files, and classic ASP include files.\n\n## Notes\n- Runs once per unique host\n- Validates responses with content marker matching\n- Fingerprints 404 responses to avoid false positives from custom error pages\n- Anti-markers prevent false positives from HTML error pages\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information\n- https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/","short_description":"Probes for exposed ASP.NET configuration files, backups, and sensitive directories","confirmation_criteria":"Confirmed when sensitive file paths return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-viewstate-scan","name":"ASP.NET ViewState Scan","type":"active","description":"## Description\nActively tests ASP.NET ViewState security by tampering with ViewState MAC\nvalidation, testing event validation bypass, detecting cookieless session\ntokens in URLs, and checking for verbose error disclosure on ViewState\ntampering.\n\n## Notes\n- Runs once per host\n- Finds pages with __VIEWSTATE forms and tests MAC validation\n- Tampers ViewState bytes and POSTs back to detect disabled MAC\n- Submits forged __EVENTTARGET to detect disabled event validation\n- Scans for cookieless session URL patterns (S(...)/)\n- Checks if ViewState errors reveal stack traces\n\n## References\n- https://learn.microsoft.com/en-us/previous-versions/aspnet/bb386448(v=vs.100)\n- https://owasp.org/www-community/attacks/Cross-Site_Request_Forgery_(CSRF)","short_description":"Tests for ASP.NET ViewState MAC disabled, event validation bypass, and cookieless sessions","confirmation_criteria":"Confirmed when ViewState MAC is disabled (tampered ViewState accepted) or event validation can be bypassed","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-service-exposure","name":"ASP.NET Service Exposure","type":"active","description":"## Description\nProbes for exposed ASP.NET service endpoints. For .asmx URLs in traffic, probes\n?WSDL and ?disco for WSDL disclosure. For .svc URLs, probes ?wsdl and sends\nmalformed SOAP to detect WCF detailed faults. Also probes common paths for\nOData metadata and legacy service endpoints.\n\n## Notes\n- Runs once per host\n- Traffic-aware: inspects original request URL for .asmx/.svc extensions\n- Probes OData $metadata and common service paths\n- Tests WCF for verbose fault disclosure (includeExceptionDetailInFaults)\n- Fingerprints 404 to avoid false positives\n\n## References\n- https://learn.microsoft.com/en-us/dotnet/framework/wcf/\n- https://learn.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/","short_description":"Detects exposed ASP.NET service endpoints including ASMX, WCF, OData, and legacy service paths","confirmation_criteria":"Confirmed when service endpoints return WSDL definitions, OData metadata, or verbose fault details","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-blazor-exposure","name":"ASP.NET Blazor Exposure","type":"active","description":"## Description\nProbes for exposed Blazor WebAssembly and Blazor Server endpoints. Blazor WASM\nships .NET DLL assemblies to the browser; if the boot manifest is accessible,\nattackers can download and decompile all application assemblies to recover source\ncode, API keys, and business logic. Blazor Server exposes a SignalR hub that\nreveals real-time communication infrastructure.\n\n## Notes\n- Runs once per host\n- Probes boot manifest, runtime JS, and SignalR negotiate endpoint\n- If boot manifest found, extracts assembly names as evidence\n- Fingerprints 404 to avoid false positives\n\n## References\n- https://learn.microsoft.com/en-us/aspnet/core/blazor/\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/01-Test_Network_Infrastructure_Configuration","short_description":"Detects exposed Blazor WebAssembly assemblies and Blazor Server endpoints","confirmation_criteria":"Confirmed when Blazor boot manifest or framework DLLs are publicly accessible","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-health-exposure","name":"ASP.NET Health Endpoint Exposure","type":"active","description":"## Description\nProbes for exposed ASP.NET Core health check and monitoring endpoints that can\nreveal infrastructure details including database connectivity status, external\nservice dependencies, memory and CPU metrics, and deployment configuration.\nCovers standard health check endpoints, Health Checks UI dashboard, Prometheus\nmetrics, and development tooling left enabled in production.\n\n## Notes\n- Runs once per host\n- Probes health check, monitoring, and dev-tooling endpoints\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/01-Test_Network_Infrastructure_Configuration","short_description":"Detects exposed ASP.NET health checks, monitoring dashboards, and metrics endpoints","confirmation_criteria":"Confirmed when health or monitoring endpoints return detailed infrastructure information without authentication","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-identity-probe","name":"ASP.NET Identity Probe","type":"active","description":"## Description\nProbes for exposed ASP.NET Identity scaffolded pages, IdentityServer/Duende OIDC\ndiscovery documents, and authentication-related misconfigurations. Exposed OIDC\ndiscovery documents reveal token endpoints, supported scopes, and grant types.\nOpen registration endpoints may allow unauthorized account creation. Scaffolded\nIdentity UI pages confirm the authentication framework in use.\n\n## Notes\n- Runs once per host\n- Probes Identity UI, OIDC discovery, and token endpoints\n- Extracts OIDC metadata (scopes, grant types, endpoints) as evidence\n- Fingerprints 404 to avoid false positives\n\n## References\n- https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity\n- https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization\n- https://openid.net/specs/openid-connect-discovery-1_0.html","short_description":"Detects exposed ASP.NET Identity endpoints, IdentityServer discovery, and authentication misconfigurations","confirmation_criteria":"Confirmed when Identity endpoints or OIDC discovery documents are publicly accessible","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-h2-console-exposure","name":"Spring H2 Console Exposure","type":"active","description":"## Description\nProbes for exposed H2 database web consoles that are commonly enabled during\ndevelopment and accidentally left accessible in production Spring Boot deployments.\nThe H2 console provides direct database access, enabling SQL execution, data\nexfiltration, and potential remote code execution.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Checks common H2 console paths with content markers\n- Fingerprints 404 responses to reduce false positives\n- H2 console exposure in production is critical severity\n\n## References\n- https://www.h2database.com/html/tutorial.html\n- https://docs.spring.io/spring-boot/docs/current/reference/html/data.html#data.sql.h2-web-console","short_description":"Detects exposed H2 database web consoles commonly left enabled in Spring Boot applications","confirmation_criteria":"Confirmed when H2 console login page or interface is accessible without authentication","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-jolokia-exposure","name":"Spring Jolokia Exposure","type":"active","description":"## Description\nProbes for exposed Jolokia endpoints that provide HTTP/JSON access to JMX\n(Java Management Extensions). Jolokia can disclose sensitive runtime attributes,\nMBean operations, and in some configurations enable dangerous operations like\nremote code execution through MBean invocation.\n\n## Notes\n- Runs once per host\n- Checks multiple Jolokia paths including actuator-prefixed variants\n- Validates responses using Jolokia-specific JSON markers\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://jolokia.org/reference/html/index.html\n- https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html","short_description":"Detects exposed Jolokia JMX endpoints providing HTTP access to Java Management Extensions","confirmation_criteria":"Confirmed when Jolokia endpoints return valid JSON responses with agent information or MBean data","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-debug-exposure","name":"Spring Debug Exposure","type":"active","description":"## Description\nProbes for Spring Boot debug endpoints and verbose error page configurations.\nDetects Whitelabel error pages with stack traces, Spring Boot DevTools remote\nendpoints, and debug parameter behaviors that reveal internal application details\nincluding package names, class paths, library versions, and configuration.\n\n## Notes\n- Runs once per host\n- Checks Whitelabel error page with trace parameter\n- Probes Spring Boot DevTools remote restart endpoint\n- Tests for debug parameter behaviors\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://docs.spring.io/spring-boot/docs/current/reference/html/web.html#web.servlet.spring-mvc.error-handling\n- https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools","short_description":"Detects Spring Boot debug endpoints, Whitelabel error pages, and verbose stack trace disclosure","confirmation_criteria":"Confirmed when debug endpoints or verbose error pages reveal internal application details","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-cloud-config-exposure","name":"Spring Cloud Config Exposure","type":"active","description":"## Description\nProbes for exposed Spring Cloud Config Server endpoints that serve application\nconfiguration for various environments. These endpoints can leak database\ncredentials, API keys, encryption keys, and internal service URLs. Also checks\nfor exposed encrypt/decrypt endpoints that could be abused for cryptographic\noperations.\n\n## Notes\n- Runs once per host\n- Checks common config patterns: /{app}/{profile} and /{app}/{profile}/{label}\n- Probes encrypt and decrypt endpoints\n- Validates responses using Spring Cloud Config JSON markers\n\n## References\n- https://docs.spring.io/spring-cloud-config/docs/current/reference/html/\n- https://cloud.spring.io/spring-cloud-config/reference/html/#_security","short_description":"Detects exposed Spring Cloud Config Server endpoints leaking application configuration and secrets","confirmation_criteria":"Confirmed when config server endpoints return application configuration with property sources","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-gateway-exposure","name":"Spring Gateway Exposure","type":"active","description":"## Description\nProbes for exposed Spring Cloud Gateway actuator endpoints that reveal routing\nconfiguration, global filters, and route filter definitions. Exposed gateway\nroutes can disclose internal service topology, backend URLs, and rate limiting\nconfiguration. Write-enabled gateway endpoints could allow route manipulation\nfor traffic steering and SSRF-style attacks.\n\n## Notes\n- Runs once per host\n- Checks gateway-specific actuator paths\n- Validates responses using gateway JSON markers\n- Read-only probing (does not attempt route modification)\n\n## References\n- https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#actuator-api\n- https://cloud.spring.io/spring-cloud-gateway/reference/html/","short_description":"Detects exposed Spring Cloud Gateway actuator endpoints revealing routes and filters","confirmation_criteria":"Confirmed when gateway actuator endpoints return route or filter configuration data","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-data-rest-exposure","name":"Spring Data REST Exposure","type":"active","description":"## Description\nProbes for Spring Data REST auto-exposed repository endpoints. Spring Data REST\nautomatically creates RESTful endpoints for JPA repositories, which may expose\nentities without proper authorization. The module detects HAL-style API roots\nand ALPS profile endpoints that reveal the full data model.\n\n## Notes\n- Runs once per host\n- Checks for HAL/HATEOAS discovery responses\n- Detects ALPS profile metadata endpoints\n- Validates using Spring Data REST JSON markers\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://docs.spring.io/spring-data/rest/docs/current/reference/html/\n- https://spring.io/projects/spring-data-rest","short_description":"Detects auto-exposed Spring Data REST repository endpoints with HAL/HATEOAS discovery","confirmation_criteria":"Confirmed when HAL-style API root or ALPS profile endpoint returns Spring Data REST repository links","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-boot-admin-exposure","name":"Spring Boot Admin Exposure","type":"active","description":"## Description\nProbes for exposed Spring Boot Admin (SBA) dashboards. SBA aggregates actuator\ndata from multiple registered Spring Boot services, providing a centralized\nview of health, metrics, configuration, and environment details. An exposed\nSBA dashboard can enable broad infrastructure compromise through access to\nmultiple services' actuator endpoints.\n\n## Notes\n- Runs once per host\n- Checks common SBA paths: /admin, /boot-admin, /sba, /springbootadmin\n- Validates using SBA-specific UI markers\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://codecentric.github.io/spring-boot-admin/current/\n- https://github.com/codecentric/spring-boot-admin","short_description":"Detects exposed Spring Boot Admin dashboards providing centralized access to actuator data","confirmation_criteria":"Confirmed when Spring Boot Admin dashboard UI or API is accessible without authentication","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"java-sensitive-files","name":"Java Sensitive Files","type":"active","description":"## Description\nProbes for Java/Spring-specific sensitive files not covered by generic file\ndiscovery modules: application.properties/yml, WEB-INF/web.xml, META-INF\nmanifests, Maven/Gradle build files, and backup configuration files that\nare commonly exposed through misconfigured static file serving.\n\n## Notes\n- Runs once per host\n- Checks Java-specific config, deployment, and build artifact paths\n- Validates responses with content markers and anti-markers\n- Fingerprints 404 responses to detect custom error pages\n- Complements the generic sensitive_file_discovery module\n\n## References\n- https://tomcat.apache.org/tomcat-10.1-doc/security-howto.html\n- https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html","short_description":"Detects Java-specific sensitive files: application configs, WEB-INF, META-INF, and build artifacts","confirmation_criteria":"Confirmed when Java-specific sensitive files return expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"java-appserver-console","name":"Java App Server Console","type":"active","description":"## Description\nProbes for exposed administration consoles of enterprise Java application servers\nincluding WildFly/JBoss, Oracle WebLogic, and GlassFish/Payara. These admin\nconsoles are high-value targets as they enable application deployment, server\nconfiguration, and often have known CVEs. Default or weak credentials can lead\nto full server compromise.\n\n## Notes\n- Runs once per host\n- Checks server-specific admin console paths\n- Detects both accessible consoles and authentication challenges\n- Validates using server-specific HTML and header markers\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://docs.wildfly.org/\n- https://docs.oracle.com/en/middleware/standalone/weblogic-server/\n- https://glassfish.org/documentation","short_description":"Detects exposed admin consoles for WildFly/JBoss, WebLogic, and GlassFish/Payara","confirmation_criteria":"Confirmed when app server admin console page or login form is accessible","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"tomcat-manager-exposure","name":"Tomcat Manager Exposure","type":"active","description":"## Description\nProbes for exposed Apache Tomcat Manager and Host Manager web interfaces. These\nadministrative interfaces allow deploying WAR files, managing virtual hosts,\nand viewing server status. Default or weak credentials on these interfaces\ncan lead to complete server compromise through malicious WAR deployment.\n\n## Notes\n- Runs once per host\n- Checks manager, host-manager, and status pages\n- Detects both login challenges (401 with WWW-Authenticate) and accessible pages\n- Also detects Tomcat default pages and example servlets\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://tomcat.apache.org/tomcat-10.1-doc/manager-howto.html\n- https://tomcat.apache.org/tomcat-10.1-doc/security-howto.html","short_description":"Detects exposed Apache Tomcat Manager and Host Manager interfaces","confirmation_criteria":"Confirmed when Tomcat Manager or Host Manager interface is accessible or prompts for authentication","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"struts-ognl-injection","name":"Struts OGNL Injection","type":"active","description":"## Description\nDetects Apache Struts OGNL injection vulnerabilities by injecting OGNL math expressions\ninto the Content-Type header (CVE-2017-5638 style) and into request parameters. Uses safe\narithmetic-based detection to confirm expression evaluation without executing commands.\n\n## Notes\n- Tests Content-Type header injection for CVE-2017-5638 variants\n- Tests parameter-level OGNL expression injection (${} and %{} syntax)\n- Uses math expressions (multiplication) to confirm evaluation\n- Deduplication via DiskSet (per-request) and RHM (per-insertion-point)\n\n## References\n- https://nvd.nist.gov/vuln/detail/CVE-2017-5638\n- https://cwiki.apache.org/confluence/display/WW/S2-045\n- https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection","short_description":"Detects Apache Struts OGNL injection via Content-Type and parameter payloads","confirmation_criteria":"Confirmed when injected OGNL math expression is evaluated and the computed result appears in the response body or headers","severity":"critical","confidence":"firm","scan_scope":["PER_INSERTION_POINT","PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"log4shell-probe","name":"Log4Shell Probe","type":"active","description":"## Description\nDetects Log4Shell (CVE-2021-44228) and related Log4j JNDI injection vulnerabilities by\ninjecting JNDI lookup payloads into HTTP headers and request parameters. Uses OAST\n(Out-of-band Application Security Testing) callbacks to confirm exploitation.\n\n## Notes\n- Requires an interactsh server (configured via oast settings)\n- Injects JNDI payloads into common HTTP headers (X-Forwarded-For, User-Agent, etc.)\n- Tests multiple JNDI obfuscation patterns to bypass WAF rules\n- Injects JNDI payloads into request parameters via insertion points\n- Findings arrive asynchronously via the OAST polling callback\n- Deduplication via DiskSet (per-request) and RHM (per-insertion-point)\n\n## References\n- https://nvd.nist.gov/vuln/detail/CVE-2021-44228\n- https://logging.apache.org/log4j/2.x/security.html\n- https://www.lunasec.io/docs/blog/log4j-zero-day/","short_description":"Detects Log4Shell (CVE-2021-44228) via JNDI payload injection with OAST callbacks","confirmation_criteria":"Confirmed when target server performs outbound DNS or LDAP lookup to OAST callback URL injected via JNDI expression","severity":"critical","confidence":"certain","scan_scope":["PER_INSERTION_POINT","PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ldap-injection","name":"LDAP Injection","type":"active","description":"## Description\nDetects LDAP injection vulnerabilities by injecting malformed LDAP filter expressions into\nparameters that are likely used in LDAP queries (e.g., username, search, filter). Uses both\nerror-based detection (checking for LDAP error messages in responses) and boolean-based\ndetection (comparing responses with wildcard vs. baseline).\n\n## Notes\n- Only tests parameters whose name suggests LDAP usage (username, uid, cn, filter, etc.)\n- Checks for LDAP error messages that were not present in the baseline response\n- Performs boolean-based differential analysis with wildcard injection\n- Deduplication via RHM to avoid redundant requests\n\n## References\n- https://owasp.org/www-community/attacks/LDAP_Injection\n- https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html","short_description":"Detects LDAP injection via error-based and boolean-based techniques","confirmation_criteria":"Confirmed when injected LDAP filter syntax triggers error messages or produces differential responses indicating filter manipulation","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"idor-guid","name":"IDOR GUID Predictability","type":"active","description":"## Description\nDetects Insecure Direct Object Reference (IDOR) vulnerabilities arising from predictable GUID/UUID patterns.\nUUIDv1 encodes a timestamp and MAC address, making sequential IDs guessable. This module identifies\nparameters containing UUIDv1 values, extracts their timestamps, generates time-neighbor UUIDs, and\nchecks if the application returns valid responses for those predicted identifiers.","short_description":"Detects predictable GUID patterns like UUIDv1 with extractable timestamps","confirmation_criteria":"Confirmed when a time-neighbor UUID generated from UUIDv1 timestamp extraction returns a valid (non-error) response different from the original","severity":"medium","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cache-deception","name":"Web Cache Deception","type":"active","description":"## Description\nDetects Web Cache Deception vulnerabilities where appending static file extensions (e.g., .css, .js, .png)\nto authenticated URLs causes reverse proxies or CDNs to cache sensitive responses. An attacker can trick\na victim into visiting a crafted URL, causing their authenticated response to be cached and subsequently\naccessible to the attacker.","short_description":"Detects web cache deception via path confusion with static file extensions","confirmation_criteria":"Confirmed when a path-confused request returns the same authenticated content as the original and cache indicators (Age, X-Cache, CF-Cache-Status) suggest the response was cached","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"subdomain-takeover","name":"Subdomain Takeover","type":"active","description":"## Description\nDetects subdomain takeover vulnerabilities caused by dangling DNS records (CNAME or A) pointing to\ndeprovisioned cloud services. When a service is removed but its DNS record remains, an attacker can\nclaim the same service identifier and serve malicious content under the target's domain.","short_description":"Detects dangling DNS records pointing to deprovisioned cloud services","confirmation_criteria":"Confirmed when an HTTP response from the host matches known fingerprints of unclaimed/deprovisioned cloud service pages","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"pdf-generation-injection","name":"PDF Generation Injection","type":"active","description":"## Description\nDetects injection vulnerabilities in server-side PDF generation endpoints. Applications using tools like\nwkhtmltopdf, Puppeteer, WeasyPrint, or Prince to convert HTML to PDF may be vulnerable to HTML/JavaScript\ninjection. Attackers can inject markup that triggers SSRF (via external resource loading), local file\nreads (via file:// protocol), or information disclosure.","short_description":"Detects HTML/JS injection into server-side PDF generation endpoints for SSRF/file read","confirmation_criteria":"Confirmed when injected HTML/JS payloads produce evidence of server-side rendering in the response (PDF markers, reflected injection artifacts, or OAST callbacks)","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"express-debug-probe","name":"Express Debug Probe","type":"active","description":"## Description\nActively triggers error responses in Express.js and NestJS applications to detect\nstack trace leakage and debug information exposure. When NODE_ENV is not set to\nproduction, Express and NestJS return detailed error responses including stack traces,\nfile paths, and internal module information.\n\n## Notes\n- Runs once per host\n- Probes: malformed JSON body, type-mismatch path parameters, random 404 endpoint\n- Detects NODE_ENV misconfiguration, stack trace leakage, file path disclosure\n- Fingerprints 404 to avoid false positives on custom error pages\n\n## References\n- https://expressjs.com/en/guide/error-handling.html\n- https://docs.nestjs.com/exception-filters","short_description":"Triggers error responses in Express/NestJS apps to detect stack trace and debug info leakage","confirmation_criteria":"Confirmed when an error response contains stack traces, file paths, or debug markers","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"express-trust-proxy-misconfig","name":"Express Trust Proxy Misconfiguration","type":"active","description":"## Description\nDetects Express.js trust proxy misconfiguration by sending X-Forwarded-* header variants\nand comparing responses against a baseline to identify behavioral changes.\n\nWhen Express.js has `trust proxy` enabled without proper validation, attackers can\nmanipulate X-Forwarded-Proto, X-Forwarded-Host, X-Forwarded-For, and X-Forwarded-Port\nheaders to cause protocol confusion, IP-based access control bypass, and port injection.\n\n## Notes\n- X-Forwarded-Proto can cause redirect loops or strip Secure flags from cookies\n- X-Forwarded-Host can be trusted for URL generation, leading to host-based attacks\n- X-Forwarded-For can bypass IP-based rate limiting or access controls\n- X-Forwarded-Port can inject unexpected ports into generated URLs and redirects\n- Compares each probe response against a baseline to detect behavioral changes\n\n## References\n- https://expressjs.com/en/guide/behind-proxies.html\n- https://expressjs.com/en/api.html#trust.proxy.options.table\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection","short_description":"Detects Express trust proxy misconfiguration via X-Forwarded-* header manipulation","confirmation_criteria":"Confirmed when X-Forwarded-* header manipulation causes observable behavioral changes such as redirect differences, cookie Secure flag removal, access control bypass, or port injection in generated URLs","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"express-directory-listing","name":"Express Directory Listing","type":"active","description":"## Description\nProbes for directory listing exposure in Express.js applications using serve-index\nor similar middleware. Directory listings reveal the full file inventory of static\ndirectories, potentially exposing sensitive files, backup archives, configuration\nfiles, and internal assets that should not be publicly accessible.\n\n## Notes\n- Runs once per host\n- Probes common static/upload directories: /public/, /uploads/, /static/, /assets/, /files/, /media/, /images/, /dist/\n- Detects serve-index, Nginx autoindex, and Apache autoindex markers\n- Fingerprints 404 to avoid false positives on custom error pages\n\n## References\n- https://expressjs.com/en/resources/middleware/serve-index.html\n- https://www.npmjs.com/package/serve-index","short_description":"Detects directory listing exposure via serve-index or similar middleware","confirmation_criteria":"Confirmed when a directory path responds with directory listing indicators such as serve-index markers, autoindex output, or file listing HTML","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"common-directory-listing","name":"Common Directory Listing","type":"active","description":"## Description\nProbes for directory listing exposure across common web servers including Apache,\nNginx, Microsoft IIS, Jetty, and Python SimpleHTTPServer. Directory listings reveal\nthe full file inventory of served directories, potentially exposing sensitive files,\nbackup archives, configuration files, and internal assets.\n\n## Notes\n- Runs once per host\n- Probes common directories: /, /uploads/, /files/, /sites/, /assets/, /static/, /META-INF/, /WEB-INF/, /aspnet_client/, /App_Data/\n- Detects Apache, Nginx, Python, Jetty, and IIS directory listing signatures\n- Fingerprints 404 to avoid false positives on custom error pages\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information\n- https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html","short_description":"Detects directory listing exposure on common web servers (Apache, Nginx, IIS, Jetty, Python)","confirmation_criteria":"Confirmed when a directory path responds with server-specific directory listing indicators such as Apache Index of, Nginx autoindex, IIS directory browsing, Jetty directory, or Python directory listing markers","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-info-exposure","name":"Rails Info Exposure","type":"active","description":"## Description\nProbes for Rails development-oriented endpoints that are commonly left exposed in\nproduction deployments. Checks for informational pages (/rails/info), mailer previews\n(/rails/mailers), Action Mailbox conductor UI, and health endpoints that leak metadata.\n\n## Notes\n- Sends GET requests to known Rails development endpoints\n- Fingerprints 404 responses to avoid false positives from custom error pages\n- Checks for Rails-specific content markers in response bodies\n- Reports exposed endpoints with appropriate severity levels\n\n## References\n- https://guides.rubyonrails.org/configuring.html\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Rails development and debug endpoints in production","confirmation_criteria":"Confirmed when Rails development endpoints return 200 with framework-specific content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-sensitive-files","name":"Rails Sensitive Files","type":"active","description":"## Description\nProbes for Rails-specific sensitive files that may be exposed due to misconfigured web\nservers or containerized deployments serving the application root as static files.\nChecks for master keys, encrypted credentials, database configs, Gemfiles, logs,\nSQLite databases, and server configurations.\n\n## Notes\n- Sends GET/HEAD requests to known Rails configuration file paths\n- Uses content markers to confirm file type and reduce false positives\n- Fingerprints 404 responses to avoid custom error page false positives\n- Each finding has severity based on the sensitivity of the exposed file\n\n## References\n- https://guides.rubyonrails.org/security.html\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Rails configuration files, credentials, and artifacts","confirmation_criteria":"Confirmed when Rails configuration files are accessible and contain expected content markers","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-admin-dashboard","name":"Rails Admin Dashboard","type":"active","description":"## Description\nProbes for common Rails ecosystem admin panels and background job dashboards that are\nfrequently mounted at predictable paths. Checks for Sidekiq, GoodJob, Resque, Delayed Job,\nrack-mini-profiler, ActiveAdmin, and RailsAdmin.\n\n## Notes\n- Sends GET requests to known Rails dashboard paths\n- Checks for framework-specific content markers in response bodies\n- Reports both unauthenticated and auth-gated dashboards\n- Fingerprints 404 responses to avoid false positives\n\n## References\n- https://github.com/sidekiq/sidekiq/wiki/Monitoring\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Rails ecosystem admin panels and dashboard UIs","confirmation_criteria":"Confirmed when Rails dashboard endpoints return responses containing framework-specific UI markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-active-storage-probe","name":"Rails Active Storage Probe","type":"active","description":"## Description\nProbes for Rails Active Storage direct upload endpoints that may accept unauthenticated\nuploads, and Action Mailbox ingress endpoints that may accept unauthorized email submissions.\nAlso checks for publicly accessible Active Storage blob routes.\n\n## Notes\n- Uses OPTIONS requests for direct upload endpoint to check allowed methods\n- Probes Action Mailbox ingress paths for multiple email providers\n- Fingerprints 404 responses to avoid false positives\n\n## References\n- https://guides.rubyonrails.org/active_storage_overview.html\n- https://guides.rubyonrails.org/action_mailbox_basics.html","short_description":"Detects exposed Rails Active Storage direct upload and Action Mailbox ingress endpoints","confirmation_criteria":"Confirmed when Active Storage or Action Mailbox endpoints respond with expected behavior","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-action-mailbox-probe","name":"Rails Action Mailbox Probe","type":"active","description":"## Description\nProbes for Rails Action Mailbox ingress endpoints for multiple email service providers.\nThese endpoints receive inbound emails via HTTP and may be accessible without proper\nauthentication or provider signature validation.\n\n## Notes\n- Uses OPTIONS and POST requests to check for accessible ingress endpoints\n- Tests relay, SendGrid, Mailgun, Mandrill, and Postmark ingress paths\n- Checks for WWW-Authenticate headers indicating basic auth protection\n- Fingerprints 404 responses to avoid false positives\n\n## References\n- https://guides.rubyonrails.org/action_mailbox_basics.html\n- https://api.rubyonrails.org/classes/ActionMailbox.html","short_description":"Detects exposed Rails Action Mailbox ingress endpoints that may accept unauthorized submissions","confirmation_criteria":"Confirmed when Action Mailbox ingress endpoints respond to requests without authentication","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-spec-ingest","name":"API Spec Ingest","type":"active","description":"Probes common paths for API specification files (OpenAPI, Swagger, Postman Collections),\nparses discovered specs, and feeds the extracted endpoints back into the scanning pipeline\nas new work items. This extends attack surface coverage by automatically discovering and\nauditing API endpoints defined in specification documents.","short_description":"Discovers API specs (OpenAPI/Swagger/Postman) and ingests endpoints for scanning","confirmation_criteria":"An API specification document was found and successfully parsed. Extracted endpoints have been ingested into the scanning pipeline.","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"fastapi-docs-exposure","name":"FastAPI Docs Exposure","type":"active","description":"## Description\nProbes for exposed FastAPI interactive API documentation. FastAPI auto-generates\nSwagger UI at /docs, ReDoc at /redoc, and the OpenAPI spec at /openapi.json by\ndefault. These endpoints reveal all API routes, schemas, and parameters, increasing\nthe attack surface for further exploitation.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Reported as low severity (information disclosure)\n\n## References\n- https://fastapi.tiangolo.com/tutorial/metadata/","short_description":"Probes for exposed FastAPI interactive API documentation endpoints","confirmation_criteria":"Confirmed when documentation endpoints return 200 with expected FastAPI-specific markers","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"fastapi-auth-inconsistency","name":"FastAPI Auth Inconsistency","type":"active","description":"## Description\nFetches the FastAPI OpenAPI schema from /openapi.json and analyzes it for\nauthentication inconsistencies. Identifies operations that lack security\nrequirements, either because they explicitly opt out of global security\nor because no security is defined at any level.\n\n## Notes\n- Runs once per host\n- Parses /openapi.json for OpenAPI spec\n- Flags operations under /api prefix without security requirements\n- Optionally verifies by calling endpoints without auth\n- FA-02: FastAPI auth inconsistency detection\n\n## References\n- https://fastapi.tiangolo.com/tutorial/security/","short_description":"Fetches OpenAPI schema and finds unprotected operations","confirmation_criteria":"Confirmed when OpenAPI spec reveals operations without security requirements, optionally verified by unauthenticated access","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"django-debug-exposure","name":"Django Debug Exposure","type":"active","description":"## Description\nTriggers errors to detect Django applications running with DEBUG=True. When\nenabled, Django displays detailed error pages containing settings, URL\npatterns, stack traces, and environment variables. This module sends requests\ndesigned to trigger 404 and 500 error pages that reveal debug information.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Sends a request to a random non-existent path to trigger a Django debug 404 page\n- Sends a malformed JSON POST to trigger a 500 error with stack trace\n- Validates responses with Django-specific debug page markers\n\n## References\n- https://docs.djangoproject.com/en/stable/ref/settings/#debug","short_description":"Triggers errors to detect Django DEBUG=True information disclosure","confirmation_criteria":"Confirmed when error responses contain Django debug page markers indicating DEBUG=True","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"django-admin-exposure","name":"Django Admin Exposure","type":"active","description":"## Description\nProbes for exposed Django admin panel. Django ships with a built-in admin\ninterface at /admin/ that provides full CRUD access to the application's data\nmodels. An exposed admin panel increases attack surface and may allow brute\nforce or credential stuffing attacks against the admin login.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with Django admin-specific markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Admin index reported as medium severity; login page confirms admin is installed\n\n## References\n- https://docs.djangoproject.com/en/stable/ref/contrib/admin/","short_description":"Probes for exposed Django admin panel and login page","confirmation_criteria":"Confirmed when admin endpoints return 200 with expected Django admin-specific markers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"django-debug-toolbar-exposure","name":"Django Debug Toolbar Exposure","type":"active","description":"## Description\nProbes for exposed django-debug-toolbar endpoints. When debug toolbar is left\nenabled in production, it exposes internal application state including SQL queries,\ntemplate context, signal handlers, cache operations, and profiling data.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- DJ-06: django-debug-toolbar detection\n\n## References\n- https://django-debug-toolbar.readthedocs.io/","short_description":"Detects exposed django-debug-toolbar panels and render endpoints","confirmation_criteria":"Confirmed when debug toolbar endpoints return 200 with expected django-debug-toolbar markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"django-browsable-api-exposure","name":"Django Browsable API Exposure","type":"active","description":"## Description\nDetects Django REST Framework browsable API exposure by re-requesting endpoints\nwith Accept: text/html. When the browsable API is enabled in production, it\nprovides an interactive HTML interface that reveals API schema, available actions,\nfilter options, and authentication requirements.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Re-requests the original URL with Accept: text/html header\n- Also probes /api/ with Accept: text/html\n- DJ-07: DRF browsable API detection\n\n## References\n- https://www.django-rest-framework.org/topics/browsable-api/","short_description":"Detects DRF browsable API by requesting endpoints with Accept: text/html","confirmation_criteria":"Confirmed when endpoints return HTML containing DRF browsable API markers","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"flask-werkzeug-debugger","name":"Flask Werkzeug Debugger","type":"active","description":"## Description\nDetects exposed Werkzeug interactive debugger in Flask applications. The\nWerkzeug debugger provides an interactive Python console in the browser when\nan unhandled exception occurs. This allows arbitrary code execution on the\nserver and is a critical vulnerability when exposed in production.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Sends requests designed to trigger 404 and 500 errors\n- Distinguishes between full interactive debugger (critical/RCE) and stack trace disclosure (high/info disclosure)\n- Interactive debugger confirmed by \"Werkzeug Debugger\" marker\n\n## References\n- https://flask.palletsprojects.com/en/latest/debugging/\n- https://werkzeug.palletsprojects.com/en/latest/debug/","short_description":"Detects exposed Werkzeug interactive debugger enabling remote code execution","confirmation_criteria":"Confirmed when error responses contain Werkzeug debugger markers indicating interactive console access","severity":"critical","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"proxy-header-trust","name":"Proxy Header Trust","type":"active","description":"## Description\nCross-framework detection of proxy header trust issues. Tests whether the application\nblindly trusts X-Forwarded-Proto, X-Forwarded-Host, and X-Forwarded-For headers,\nwhich can lead to host injection, protocol confusion, and IP-based access control bypass.\n\n## Notes\n- Runs once per host\n- Sends baseline request then compares with header-injected variants\n- X-Forwarded-Host reflected in Location or body indicates host injection (High)\n- X-Forwarded-Proto behavior changes indicate protocol confusion (Medium)\n- X-Forwarded-For bypassing restrictions indicates IP trust issues (High)\n- CF-21, FA-05, FL-06, DJ-08: cross-framework proxy header trust detection\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Cross-framework detection of proxy header trust issues via X-Forwarded-* header manipulation","confirmation_criteria":"Confirmed when X-Forwarded-* header manipulation causes observable behavioral changes such as host reflection, redirect differences, or access control bypass","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"bfla-detection","name":"BFLA Detection","type":"active","description":"## Description\nDetects Broken Function-Level Authorization (BFLA) by testing admin and privileged\nendpoints with missing or downgraded authentication. Strips Authorization and Cookie\nheaders, attempts empty tokens, and tests method switching on admin-like paths.\n\n## Notes\n- Runs once per unique host+path combination via DiskSet dedup\n- Skips non-2xx original responses (only tests endpoints that currently succeed)\n- Compares response status codes and body lengths to reduce false positives\n- Heuristic-based detection targeting known admin/privileged path patterns\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa5-broken-function-level-authorization/\n- https://portswigger.net/web-security/access-control","short_description":"Detects Broken Function-Level Authorization on privileged endpoints","confirmation_criteria":"Confirmed when a privileged endpoint returns a successful response after removing or downgrading authentication credentials","severity":"high","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"oauth-misconfiguration","name":"OAuth/OIDC Misconfiguration","type":"active","description":"## Description\nDetects common OAuth and OpenID Connect misconfigurations that can lead to account\ntakeover or authorization bypass. Tests for redirect_uri manipulation, missing CSRF\nstate parameter, and response_type downgrade to implicit flow.\n\n## Notes\n- Runs once per unique host+path combination via DiskSet dedup\n- Only activates on detected OAuth/OIDC endpoints (path and parameter heuristics)\n- Tests redirect_uri with multiple bypass techniques (direct replacement, subdomain confusion, path traversal)\n- Checks for missing state parameter (CSRF protection)\n- Tests response_type downgrade from code to token (implicit flow)\n\n## References\n- https://portswigger.net/web-security/oauth\n- https://datatracker.ietf.org/doc/html/rfc6749#section-10.6\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/05-Testing_for_OAuth_Weaknesses","short_description":"Detects common OAuth/OIDC misconfigurations including open redirect and missing state","confirmation_criteria":"Confirmed when an OAuth endpoint accepts a manipulated redirect_uri, is missing CSRF state protection, or accepts implicit flow downgrade","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-key-url-exposure","name":"API Key in URL","type":"active","description":"## Description\nDetects API keys and authentication tokens that continue to work when moved from\nHTTP headers to URL query parameters. API keys in URLs are logged in access logs,\nbrowser history, referrer headers, and proxy logs, significantly increasing the\nrisk of credential exposure.\n\n## Notes\n- Tests once per unique host+path combination\n- Checks common auth headers: Authorization, X-API-Key, X-Auth-Token, etc.\n- Only tests the first matching auth header per request\n- Reports when response with URL parameter matches original 2xx status\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa2-broken-authentication/\n- https://cwe.mitre.org/data/definitions/598.html","short_description":"Detects API keys that work when moved from headers to URL parameters","confirmation_criteria":"Confirmed when the server returns a successful response with the API key passed as a URL query parameter instead of in the authorization header","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"fastify-hono-probe","name":"Fastify/Hono Probe","type":"active","description":"## Description\nProbes for framework-specific documentation, metrics, and debug endpoints exposed\nby Fastify and Hono Node.js frameworks. These frameworks may inadvertently expose\nSwagger documentation, API references, metrics endpoints, and overview pages in\nproduction deployments.\n\n## Notes\n- Runs once per host with internal deduplication\n- Tests 8 framework-specific paths across Fastify and Hono\n- Each probe has tailored response matching to reduce false positives\n\n## References\n- https://fastify.dev/docs/latest/\n- https://hono.dev/docs/","short_description":"Detects exposed Fastify and Hono framework endpoints","confirmation_criteria":"Confirmed when the server responds with framework-specific content at known documentation or debug paths, indicating exposed internal endpoints","severity":"medium","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"metaframework-probe","name":"Metaframework Probe","type":"active","description":"## Description\nProbes for framework-specific internal files and debug endpoints exposed by modern\nJavaScript meta-frameworks including Remix, Astro, and SvelteKit. These frameworks\nmay inadvertently expose manifest files, build directories, version information,\nand development endpoints in production deployments.\n\n## Notes\n- Runs once per host with internal deduplication\n- Tests 8 framework-specific paths across Remix, Astro, and SvelteKit\n- Each probe has tailored response matching to reduce false positives\n\n## References\n- https://remix.run/docs/en/main\n- https://docs.astro.build/en/getting-started/\n- https://kit.svelte.dev/docs/introduction","short_description":"Detects exposed Remix, Astro, and SvelteKit internal files and endpoints","confirmation_criteria":"Confirmed when the server responds with framework-specific content at known internal paths, indicating exposed build artifacts or debug endpoints","severity":"low","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"dom-xss-detect","name":"DOM XSS Detect","type":"passive","description":"## Description\nPassively detects potential DOM-based XSS patterns by analyzing JavaScript code in\nresponses for dangerous source-to-sink data flows.\n\n## Notes\n- Scans response bodies for known DOM XSS source patterns (location.hash, document.referrer, etc.)\n- Identifies dangerous sink patterns (innerHTML, eval, document.write, etc.)\n- Pattern-based detection; manual verification recommended\n\n## References\n- https://owasp.org/www-community/attacks/DOM_Based_XSS","short_description":"Detects potential DOM-based XSS patterns in responses","confirmation_criteria":"Indicated when response JavaScript contains known source-to-sink patterns that could enable DOM-based XSS","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"auth-headers-detect","name":"Auth Headers Detect","type":"passive","description":"## Description\nPassively detects authorization and authentication headers in HTTP requests,\nflagging endpoints that handle sensitive credentials.\n\n## Notes\n- Scans request headers for Authorization, Cookie, X-API-Key, and similar patterns\n- Helps identify authentication boundaries in the application\n\n## References\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization","short_description":"Detects authorization headers in requests","confirmation_criteria":"Confirmed when request contains recognized authentication headers (Authorization, Bearer tokens, API keys)","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"openredirect-params","name":"Open Redirect Params","type":"passive","description":"## Description\nPassively detects URL parameters with names commonly associated with open redirect\nvulnerabilities (redirect, url, next, return, goto, etc.).\n\n## Notes\n- Pattern-based detection on parameter names only; does not test for actual redirects\n- Low confidence; serves as a triage signal for the active open redirect module\n\n## References\n- https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html","short_description":"Detects URL parameters commonly used for open redirects","confirmation_criteria":"Indicated when URL contains parameters with redirect-associated names (redirect, url, next, return, goto)","severity":"info","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"oauth-facebook-detect","name":"Facebook OAuth Detect","type":"passive","description":"## Description\nPassively detects Facebook OAuth redirect parameters in requests, flagging potential\nOAuth misconfiguration or open redirect vectors in the authentication flow.\n\n## Notes\n- Scans URL parameters for Facebook OAuth redirect_uri and related parameters\n- Helps identify OAuth flows that may be vulnerable to redirect manipulation\n\n## References\n- https://developers.facebook.com/docs/facebook-login/security/","short_description":"Detects Facebook OAuth redirect parameters for security analysis","confirmation_criteria":"Confirmed when request URL contains Facebook OAuth parameters (client_id, redirect_uri) matching known OAuth flow patterns","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"anomaly-ranking","name":"Anomaly Ranking","type":"passive","description":"## Description\nRanks HTTP responses by statistical anomaly to identify interesting endpoints. Buffers\nresponses per host and applies statistical ranking when thresholds are reached.\n\n## Notes\n- Buffers per-host response attributes and flushes at configurable thresholds\n- Uses statistical analysis to identify outlier responses worth investigating\n- Updates risk_score on database records for prioritization\n\n## References\n- https://en.wikipedia.org/wiki/Anomaly_detection","short_description":"Statistical anomaly detection across per-host response batches","confirmation_criteria":"Indicated when a response's statistical attributes (size, status, headers) deviate significantly from the per-host baseline","severity":"suspect","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"secret-detect","name":"Secret Detection","type":"passive","description":"## Description\nPassively scans HTTP response bodies for leaked secrets, credentials, API keys,\nand connection strings using the Kingfisher secret detection engine.\n\n## Notes\n- Scans response bodies only (no additional HTTP requests sent)\n- Skips binary/media content types\n- Uses lazy-initialized singleton Kingfisher scanner\n- Generates one finding per detected secret\n\n## References\n- https://github.com/mongodb/kingfisher","short_description":"Detects leaked secrets and credentials in HTTP responses","confirmation_criteria":"Confirmed when Kingfisher detects a known secret pattern in the HTTP response body","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sourcemap-detect","name":"Sourcemap Exposure Detect","type":"passive","description":"## Description\nPassively detects exposed JavaScript sourcemaps by identifying SourceMappingURL\nreferences in JS/CSS responses and validating accessible .map files.\n\n## Notes\n- Detects sourceMappingURL comments in JavaScript and CSS responses\n- Validates .map file responses by parsing sourcemap JSON structure\n- Exposed sourcemaps reveal original source code, file paths, and potentially secrets\n\n## References\n- https://developer.chrome.com/docs/devtools/javascript/source-maps\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed JavaScript sourcemaps in production responses","confirmation_criteria":"Confirmed when response contains a sourceMappingURL reference or a valid sourcemap JSON structure is detected","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"security-headers-missing","name":"Security Headers Missing","type":"passive","description":"## Description\nPassively detects missing HTTP security headers that protect against common web\nattacks including XSS, clickjacking, MIME sniffing, and protocol downgrade.\n\n## Notes\n- Checks for X-Content-Type-Options, X-Frame-Options, Strict-Transport-Security, Content-Security-Policy, and Permissions-Policy\n- Runs per-host to avoid duplicate findings\n- Only flags HTML responses to reduce noise\n\n## References\n- https://owasp.org/www-project-secure-headers/\n- https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html","short_description":"Detects missing HTTP security headers in responses","confirmation_criteria":"Confirmed when HTTP response lacks one or more recommended security headers","severity":"info","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"info-disclosure-detect","name":"Info Disclosure Detect","type":"passive","description":"## Description\nPassively detects information disclosure in HTTP responses including server version\nstrings, framework identifiers, internal IP addresses, and stack traces.\n\n## Notes\n- Scans response headers and bodies for disclosure patterns\n- Detects server software versions, internal paths, email addresses, and debug info\n- Runs per-request to catch endpoint-specific disclosures\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/01-Information_Gathering/","short_description":"Detects information disclosure patterns in HTTP responses","confirmation_criteria":"Confirmed when response contains identifiable server versions, internal IPs, stack traces, or debug information","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"directory-listing-detect","name":"Directory Listing Detect","type":"passive","description":"## Description\nPassively detects directory listing exposure in HTTP responses across common web\nservers including Apache, Nginx, Microsoft IIS, Jetty, and Python SimpleHTTPServer.\n\n## Notes\n- Analyzes existing responses without sending additional requests\n- Detects Apache, Nginx, Python, Jetty, and IIS directory listing signatures\n- Skips binary/media content types\n- Only processes 2xx responses\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information\n- https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html","short_description":"Passively detects directory listing exposure in HTTP responses","confirmation_criteria":"Confirmed when response contains server-specific directory listing indicators such as Apache Index of, Nginx autoindex, IIS directory browsing, Jetty directory, or Python directory listing markers","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cookie-security-detect","name":"Cookie Security Detect","type":"passive","description":"## Description\nPassively detects insecure cookie configurations by analyzing Set-Cookie headers\nfor missing Secure, HttpOnly, and SameSite attributes.\n\n## Notes\n- Checks all Set-Cookie headers in responses\n- Flags cookies missing Secure flag on HTTPS responses\n- Flags cookies missing HttpOnly attribute\n- Flags cookies without SameSite attribute\n\n## References\n- https://owasp.org/www-community/controls/SecureCookieAttribute\n- https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html","short_description":"Detects insecure cookie attributes in HTTP responses","confirmation_criteria":"Confirmed when Set-Cookie headers lack Secure, HttpOnly, or SameSite attributes","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"mixed-content-detect","name":"Mixed Content Detect","type":"passive","description":"## Description\nPassively detects mixed content issues where HTTPS pages load resources over\ninsecure HTTP connections, potentially exposing data to interception.\n\n## Notes\n- Scans HTML response bodies for HTTP URLs in src, href, and action attributes\n- Only checks responses from HTTPS origins\n- Flags both active (scripts, iframes) and passive (images, stylesheets) mixed content\n\n## References\n- https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content\n- https://owasp.org/www-community/controls/Certificate_and_Public_Key_Pinning","short_description":"Detects mixed HTTP/HTTPS content in responses","confirmation_criteria":"Confirmed when HTTPS page contains references to resources loaded over insecure HTTP","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sensitive-url-params","name":"Sensitive URL Params","type":"passive","description":"## Description\nPassively detects sensitive information passed via URL query parameters, which may\nbe logged in server logs, browser history, and referrer headers.\n\n## Notes\n- Detects passwords, tokens, API keys, and credentials in URL parameters\n- Pattern-based detection on both parameter names and values\n- Sensitive data in URLs is logged and may leak via Referer headers\n\n## References\n- https://owasp.org/www-community/vulnerabilities/Information_exposure_through_query_strings_in_url\n- https://cwe.mitre.org/data/definitions/598.html","short_description":"Detects sensitive data in URL query parameters","confirmation_criteria":"Indicated when URL query parameters contain names or values matching sensitive data patterns (password, token, key, secret)","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cors-headers-detect","name":"CORS Headers Detect","type":"passive","description":"## Description\nPassively detects permissive CORS configurations by analyzing Access-Control-Allow-Origin\nand related headers in HTTP responses without sending additional requests.\n\n## Notes\n- Flags wildcard (*) CORS origins\n- Flags CORS with credentials enabled\n- Complements the active CORS misconfiguration module with passive detection\n- Runs per-request for comprehensive coverage\n\n## References\n- https://portswigger.net/web-security/cors\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS","short_description":"Passively detects permissive CORS headers in responses","confirmation_criteria":"Confirmed when response contains permissive CORS headers such as wildcard origin or credentials enabled","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"jwt-weak-secret","name":"JWT Weak Secret Detection","type":"passive","description":"## Description\nPassively detects JWT tokens signed with weak HMAC secrets by performing offline\nbrute-force against an embedded wordlist of ~104K known weak secrets.\n\nWhen an asymmetric-algorithm JWT (RS256, ES256, etc.) is found but no HMAC secret\nmatches, emits a low-severity informational finding noting the potential for\nalgorithm confusion (CVE-2015-9235). Active testing is recommended to confirm.\n\n## Notes\n- Extracts JWTs from Authorization Bearer headers and cookies\n- Tests HMAC-based algorithms (HS256, HS384, HS512)\n- Detects non-cryptographic (plaintext ASCII) signatures indicating trivially forgeable tokens\n- Tests algorithm confusion (CVE-2015-9235): tries HS256/HS384/HS512 brute-force on asymmetric tokens (RS256, ES256, etc.)\n- Emits informational finding for asymmetric JWTs even when no weak secret is found\n- Computes HMAC signatures offline without sending additional requests\n- Uses embedded jwt.secrets.list wordlist\n\n## References\n- https://portswigger.net/web-security/jwt\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/06-Session_Management_Testing/10-Testing_JSON_Web_Tokens","short_description":"Detects JWTs with weak HMAC secrets, non-cryptographic signatures, and algorithm confusion","confirmation_criteria":"Confirmed when a JWT HMAC signature matches a known weak secret","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"jwt-claims-detect","name":"JWT Claim Analyzer","type":"passive","description":"## Description\nPassively analyzes JWT tokens found in request headers, cookies, and response bodies\nfor security misconfigurations such as algorithm:none, missing expiration, long-lived\ntokens, and privileged claims.\n\n## Notes\n- Extracts JWTs from Authorization Bearer headers, cookies, and response bodies\n- Decodes header and payload without verifying signatures\n- Checks for alg:none, missing exp/iss/aud, long-lived tokens, and admin claims\n- Does not send additional requests\n\n## References\n- https://portswigger.net/web-security/jwt\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/06-Session_Management_Testing/10-Testing_JSON_Web_Tokens","short_description":"Analyzes JWT claims for security misconfigurations","confirmation_criteria":"Confirmed when JWT claims contain security misconfigurations","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"serialized-object-detect","name":"Serialized Object Detection","type":"passive","description":"## Description\nPassively detects serialized objects in HTTP request parameters by matching known\nserialization format signatures for Java, PHP, .NET, and Python.\n\n## Notes\n- Java: base64 prefix \"rO0AB\" or hex prefix \"aced0005\"\n- PHP: pattern matching O:N:\"class\", a:N:{, etc.\n- .NET: base64 prefix \"AAEAAAD\" (BinaryFormatter)\n- Python: pickle indicators (\"ccopy_reg\" prefix or protocol markers)\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/16-Testing_for_HTTP_Incoming_Requests\n- https://portswigger.net/web-security/deserialization","short_description":"Detects serialized Java/PHP/.NET/Python objects in request parameters","confirmation_criteria":"Confirmed when request parameter values contain known serialization format signatures","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sql-syntax-detect","name":"SQL Syntax in Request Detection","type":"passive","description":"## Description\nPassively detects SQL statements and keywords in HTTP request parameter values,\nwhich may indicate SQL injection attempts or unsafe parameter handling.\n\n## Notes\n- Matches SQL statements: SELECT..FROM, INSERT INTO, UPDATE..SET, DELETE FROM, UNION SELECT, etc.\n- Secondary check for SQL keyword pairs: WHERE/AND/OR with comparison operators\n- URL-decodes parameter values before checking\n- Minimum value length of 8 characters to reduce false positives\n\n## References\n- https://owasp.org/www-community/attacks/SQL_Injection\n- https://cwe.mitre.org/data/definitions/89.html","short_description":"Detects SQL syntax in HTTP request parameter values","confirmation_criteria":"Indicated when request parameter values contain SQL statement patterns","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"content-type-mismatch","name":"Content Type Mismatch","type":"passive","description":"## Description\nPassively detects mismatches between the Content-Type header and actual response body\ncontent, which can lead to MIME confusion attacks and XSS.\n\n## Notes\n- Compares declared Content-Type with detected body content signatures\n- Flags JSON/XML/HTML content served with incorrect Content-Type\n- Missing X-Content-Type-Options makes MIME sniffing exploitable\n\n## References\n- https://owasp.org/www-project-secure-headers/#x-content-type-options\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options","short_description":"Detects mismatches between Content-Type header and response body","confirmation_criteria":"Confirmed when the Content-Type header does not match the actual content of the response body","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"csrf-detect","name":"CSRF Detection","type":"passive","description":"## Description\nDetects state-changing HTTP requests (POST, PUT, DELETE, PATCH) that lack common\nanti-CSRF protections such as CSRF tokens in parameters/headers or SameSite cookie\nattributes.\n\n## Notes\n- Passive only — does not send any HTTP requests\n- Skips JSON API requests with Origin header (CORS-protected)\n- Checks for CSRF tokens in body parameters, custom headers, and SameSite cookies\n- Deduplicates by method + host + path\n\n## References\n- https://owasp.org/www-community/attacks/csrf\n- https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html","short_description":"Flags state-changing requests missing anti-CSRF protections","confirmation_criteria":"Indicated when a state-changing request lacks CSRF token parameters, custom anti-CSRF headers, and SameSite cookie attributes","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"idor-params-detect","name":"IDOR Parameter Detection","type":"passive","description":"## Description\nPassively identifies HTTP parameters whose names and values suggest they reference\nobject identifiers, providing triage signals for potential IDOR (Insecure Direct\nObject Reference) and BOLA (Broken Object Level Authorization) vulnerabilities.\n\nThe module classifies parameter names (e.g. user_id, account_id) and values\n(sequential integers, UUIDs, structured codes) to compute a confidence score.\nPath parameters following resource nouns (e.g. /users/123) receive additional weight.\n\nWhen JSON responses are present, the module also flags excessive data exposure by\ndetecting sensitive field names (password_hash, ssn, is_admin, etc.).\n\n## Notes\n- Informational finding: flags endpoints for further active testing (Layer 2+)\n- Covers OWASP API1:2023 (BOLA) and API3:2023 (BOPLA) triage\n- Does not send additional requests — purely passive analysis\n- Deduplicates by host + normalized path pattern + parameter name + type\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/\n- https://owasp.org/API-Security/editions/2023/en/0xa3-broken-object-property-level-authorization/\n- https://cwe.mitre.org/data/definitions/639.html","short_description":"Detects parameters that may reference object identifiers (IDOR/BOLA triage)","confirmation_criteria":"Indicated when a request parameter has a high-signal identifier name combined with a predictable value format, or when a JSON response exposes sensitive internal fields","severity":"info","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"crypto-weakness-detect","name":"Cryptographic Weakness Detection","type":"passive","description":"## Description\nDetects cryptographic weaknesses in HTTP responses and cookies, including PHP magic hashes,\nweak hash algorithms near sensitive contexts, padding oracle indicators, and encrypted cookies\nwithout integrity protection (MAC).\n\n## Notes\n- Analyzes both request cookies and response headers/body\n- Checks for MD5/SHA1 usage near password, token, or hash keywords\n- Detects padding oracle error messages that may enable ciphertext manipulation\n- Identifies encrypted cookie values that lack HMAC integrity verification\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/\n- https://www.whitehatsec.com/blog/magic-hashes/","short_description":"Detects weak cryptographic patterns in HTTP traffic","confirmation_criteria":"Confirmed when response contains identifiable cryptographic weakness patterns such as magic hashes, weak hash usage, padding oracle errors, or unprotected encrypted cookies","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"error-message-detect","name":"Error Message Detect","type":"passive","description":"## Description\nPassively detects error messages in HTTP responses that reveal server-side technology,\ndebug information, or database error details. Covers debug pages, Apache, ASP.NET, Java,\nPython, PHP, Ruby, Node.js, SQL database errors, and other common frameworks.\n\n## Notes\n- Categorizes errors by technology (Debug, Apache, ASP, Java, Generic, SQL)\n- Debug page patterns are reported at low severity with certain confidence\n- SQL error patterns are reported at low severity with firm confidence\n- Other error patterns are reported at info severity with firm confidence\n\n## References\n- https://cheatsheetseries.owasp.org/cheatsheets/Error_Handling_Cheat_Sheet.html\n- https://raw.githubusercontent.com/PortSwigger/error-message-checks/master/src/main/resources/burp/match-rules.tab\n- https://github.com/1ndianl33t/Gf-Patterns","short_description":"Detects interesting error messages in HTTP responses","confirmation_criteria":"Confirmed when response body contains recognizable error messages or stack traces from known frameworks","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"base64-data-detect","name":"Base64 Data Detect","type":"passive","description":"## Description\nPassively detects interesting base64 encoded data in HTTP requests and responses.\nMatches known prefixes for JSON (eyJ), PHP serialized objects (YTo, Tzo),\nXML/PHP (PD8/PD9), HTTPS/HTTP URLs (aHR0cHM6L, aHR0cDo), and Java serialized\nobjects (rO0).\n\n## Notes\n- Scans both request and response content\n- Low noise: only flags known interesting base64 prefixes\n- Manual review is recommended to assess the encoded data\n\n## References\n- https://portswigger.net/kb/issues/00700200_base64-encoded-data-in-parameter\n- https://cheatsheetseries.owasp.org/index.html\n- https://github.com/tomnomnom/gf/blob/master/examples/base64.json","short_description":"Identifies interesting base64 encoded data like JSON, PHP Object in requests/responses","confirmation_criteria":"Confirmed when request or response contains base64-encoded data matching known interesting prefixes (JSON, PHP objects, URLs, Java objects)","severity":"info","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"password-autocomplete-detect","name":"Password Autocomplete Detect","type":"passive","description":"## Description\nPassively detects password input fields in HTML responses that do not have autocomplete\ndisabled, which may allow browsers to store sensitive credentials.\n\n## Notes\n- Checks for autocomplete=\"off\" or autocomplete=\"new-password\" on password inputs\n- Also checks enclosing form elements for autocomplete attributes\n- Only fires on text/html responses\n\n## References\n- https://owasp.org/www-community/controls/PasswordAutocomplete\n- https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html","short_description":"Detects password fields without autocomplete disabled","confirmation_criteria":"Confirmed when password input fields lack autocomplete='off' or autocomplete='new-password'","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cacheable-https-detect","name":"Cacheable HTTPS Response Detect","type":"passive","description":"## Description\nPassively detects HTTPS responses containing sensitive content (Set-Cookie headers or\npassword fields) that lack proper cache-control directives, allowing browsers or proxies\nto cache sensitive data.\n\n## Notes\n- Only fires on HTTPS URLs with sensitive response indicators\n- Checks for Cache-Control: no-store, no-cache, or private\n- Also checks Pragma: no-cache as legacy fallback\n- Missing or permissive cache control on sensitive responses is flagged\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/04-Authentication_Testing/06-Testing_for_Browser_Cache_Weaknesses\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cache-Control","short_description":"Detects sensitive HTTPS responses without proper cache control","confirmation_criteria":"Confirmed when sensitive HTTPS response lacks Cache-Control: no-store/no-cache/private directives","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"input-reflection-detect","name":"Input Reflection Detect","type":"passive","description":"## Description\nPassively detects when request parameter values are reflected verbatim in the response body.\nInput reflection is a prerequisite for many injection vulnerabilities including XSS.\n\n## Notes\n- Only checks text/html responses\n- Filters out short values (<4 chars), all-numeric values, and token-like values\n- Reports reflected parameters as informational findings for further investigation\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/01-Testing_for_Reflected_Cross_Site_Scripting","short_description":"Detects request parameter values reflected in responses","confirmation_criteria":"Indicated when a request parameter value appears verbatim in the response body","severity":"info","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"graphql-introspection-detect","name":"GraphQL Introspection Leak Detect","type":"passive","description":"## Description\nPassively detects GraphQL introspection responses that leak the full API schema,\nincluding types, queries, mutations, and subscriptions.\n\n## Notes\n- Checks JSON response bodies for introspection-specific fields (__schema, __type)\n- Requires confirmation fields (queryType, mutationType, subscriptionType, types) to avoid false positives\n- Runs per-request to catch endpoint-specific disclosures\n\n## References\n- https://graphql.org/learn/introspection/\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/12-API_Testing/01-Testing_GraphQL","short_description":"Detects GraphQL introspection responses that expose the full API schema","confirmation_criteria":"Confirmed when response contains GraphQL introspection fields (__schema/__type) with schema definition markers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"js-framework-fingerprint","name":"JS Framework Fingerprint","type":"passive","description":"## Description\nPassively identifies the JavaScript framework powering a web application by analyzing\nHTML response bodies and HTTP headers for framework-specific markers. Stores results\nin a shared per-host cache used by other framework-specific modules.\n\n## Notes\n- Passive only — does not send any HTTP requests\n- Detects: Next.js (Pages/App Router), Nuxt.js, Angular, React CRA, Remix, SvelteKit, Gatsby\n- Extracts Next.js buildId for use by active Next.js modules\n- Deduplicates by host to avoid redundant processing\n- Requires strong signals (script tags or headers) to avoid false positives\n\n## References\n- https://nextjs.org/docs\n- https://nuxt.com/docs\n- https://angular.dev","short_description":"Identifies JavaScript frameworks (Next.js, Nuxt, Angular, React, Remix, SvelteKit, Gatsby)","confirmation_criteria":"Confirmed when framework-specific markers (script tags, headers, or asset URL patterns) are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssr-data-exposure","name":"SSR Data Exposure","type":"passive","description":"## Description\nScans server-side rendered (SSR) state blobs embedded in HTML pages for sensitive data\nexposure. Modern JS frameworks serialize application state into the HTML page for hydration,\nwhich may inadvertently include API keys, tokens, admin flags, email addresses,\npassword hashes, or internal URLs.\n\n## Notes\n- Passive only — does not send any HTTP requests\n- Extracts state from: __NEXT_DATA__, __NUXT__, __INITIAL_STATE__, __APOLLO_STATE__\n- Scans extracted JSON for API keys, tokens, admin flags, emails, password hashes, internal IPs\n- Minimum token length of 16 characters to reduce false positives\n- Deduplicates by host+path\n\n## References\n- https://nextjs.org/docs/pages/building-your-application/data-fetching\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/04-Testing_for_Weak_Encryption","short_description":"Detects sensitive data leaked in server-side rendered state blobs","confirmation_criteria":"Confirmed when sensitive patterns (API keys, tokens, admin flags, credentials) are found in SSR state blobs","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cache-auth-misconfiguration","name":"Cache-Auth Misconfiguration","type":"passive","description":"## Description\nDetects responses that are publicly cacheable (Cache-Control: public or s-maxage) but\ncontain user-specific indicators (Set-Cookie, Authorization) without proper Vary headers.\nThis can lead to one user's authenticated response being served from cache to another\nuser, causing data leakage or session confusion.\n\n## Notes\n- Passive only — does not send any HTTP requests\n- Skips static assets (JS, CSS, images, fonts)\n- Checks for Cache-Control: public or s-maxage without no-store/private\n- Reports missing Vary: Cookie when Set-Cookie is present\n- Reports missing Vary: Authorization when Authorization header was in request\n- Deduplicates by host+path\n\n## References\n- https://portswigger.net/web-security/web-cache-poisoning\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary","short_description":"Detects cacheable responses with user-specific data missing Vary headers","confirmation_criteria":"Confirmed when a cacheable response has user-specific headers but missing corresponding Vary header","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"server-action-auth","name":"Server Action Auth Check","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js Server Actions that perform\nstate-changing operations (database mutations, writes) without any authorization checks.\nServer Actions marked with \"use server\" execute on the server and are directly callable\nfrom the client. If they lack session validation or auth guards, any unauthenticated\nuser can invoke them to modify data.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects \"use server\" directive combined with mutation patterns (create, update, delete, etc.)\n- Flags when no authorization patterns are found (getSession, auth(), verifyToken, etc.)\n- Deduplicates by host+path\n- CWE-862: Missing Authorization\n\n## References\n- https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations\n- https://cwe.mitre.org/data/definitions/862.html\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/02-Testing_for_Bypassing_Authorization_Schema","short_description":"Detects Next.js Server Actions missing authorization checks","confirmation_criteria":"Confirmed when a Server Action contains mutation operations but no authorization checks","severity":"high","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextauth-config-audit","name":"NextAuth.js Configuration Audit","type":"passive","description":"## Description\nInspects HTTP responses for NextAuth.js (Auth.js) session configuration issues.\nChecks session cookies for missing security flags, decodes JWT session tokens to\ndetect sensitive data exposure, and fingerprints NextAuth API endpoints for\ninformation leakage.\n\n## Notes\n- Detects NextAuth session cookies (next-auth.session-token, __Secure-next-auth.*)\n- Checks cookie flags: Secure, HttpOnly, SameSite\n- Decodes JWT payloads to detect sensitive claims (passwords, secrets, tokens)\n- Fingerprints NextAuth endpoints via response patterns\n- Deduplicates by host\n\n## References\n- https://next-auth.js.org/configuration/options\n- https://next-auth.js.org/configuration/options#cookies\n- https://authjs.dev/getting-started/session-management/protecting","short_description":"Detects insecure NextAuth.js session and cookie configurations","confirmation_criteria":"Confirmed when NextAuth session cookies have insecure flags or JWT tokens contain sensitive data","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-config-audit","name":"Next.js Config Audit","type":"passive","description":"## Description\nScans response bodies for insecure Next.js configuration patterns that can introduce\nsecurity vulnerabilities. Checks for dangerous SVG allowances (XSS risk), wildcard\nimage domains (SSRF risk), HTTP protocol in image config (cleartext transport),\nexposed production source maps (information disclosure), internal API exposure via\nrewrites/redirects, and missing security headers configuration.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects: dangerouslyAllowSVG, wildcard image hostnames, HTTP protocol, production source maps\n- Also checks for internal API route exposure and missing security headers config\n- Each matched pattern emits a separate finding with matched snippet\n- Deduplicates by host\n\n## References\n- https://nextjs.org/docs/app/api-reference/next-config-js\n- https://cwe.mitre.org/data/definitions/79.html\n- https://cwe.mitre.org/data/definitions/918.html\n- https://cwe.mitre.org/data/definitions/540.html","short_description":"Detects insecure Next.js configuration patterns","confirmation_criteria":"Confirmed when insecure configuration patterns are found in Next.js config files","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nuxt-config-audit","name":"Nuxt Config Audit","type":"passive","description":"## Description\nScans response bodies for insecure Nuxt.js configuration patterns and sensitive data leaked\nthrough Nuxt state blobs. Detects exposed __NUXT__ and __NUXT_DATA__ state in HTML, checks\nfor sensitive data patterns (API keys, tokens, internal URLs) within Nuxt state, and identifies\ndangerous configuration options such as enabled devtools, exposed runtime secrets, production\nsource maps, and debug mode.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects: __NUXT__ / __NUXT_DATA__ state blobs in HTML\n- Scans Nuxt state for API keys, tokens, admin flags, internal IPs\n- Checks config patterns: devtools, runtimeConfig secrets, productionSourceMap, debug\n- Also detects /_nuxt/ source map exposure\n- Deduplicates by host\n\n## References\n- https://nuxt.com/docs/guide/directory-structure/nuxt-config\n- https://nuxt.com/docs/api/nuxt-config#runtimeconfig\n- https://cwe.mitre.org/data/definitions/540.html\n- https://cwe.mitre.org/data/definitions/200.html","short_description":"Detects insecure Nuxt configuration patterns and sensitive data in Nuxt state","confirmation_criteria":"Confirmed when insecure configuration patterns or sensitive data are found in Nuxt state or config","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"javascript-uri-sink","name":"JavaScript URI Sink Detection","type":"passive","description":"## Description\nDetects javascript: protocol URIs in HTML attributes that act as XSS sinks.\nWhen user-controlled data flows into href, src, or other URL-based attributes\nwithout protocol validation, an attacker can inject javascript: URIs to achieve\nscript execution on user interaction (e.g., clicking a link).\n\nThis is a distinct vector from general DOM XSS — React's default data binding\ndoes not protect against javascript: URIs in href attributes.\n\n## Notes\n- Scans HTML responses for javascript: URIs in href, src, action, formaction attributes\n- Correlates with request parameters to identify reflection from user input\n- Flags both direct javascript: URIs and obfuscated variants (url-encoded, mixed case)\n- Deduplicates by host+path\n\n## References\n- https://owasp.org/www-community/attacks/xss/\n- https://snyk.io/blog/10-react-security-best-practices/\n- https://cwe.mitre.org/data/definitions/79.html","short_description":"Detects javascript: URIs reflected in href/src attributes","confirmation_criteria":"Confirmed when javascript: URI is found in a URL-based HTML attribute, especially when correlated with request input","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssr-hydration-xss","name":"SSR Hydration XSS Detection","type":"passive","description":"## Description\nDetects unsafe patterns in server-side rendered (SSR) pages where JSON data is\nembedded in inline script tags for client-side hydration. If the serialized JSON\nis not properly encoded, an attacker can inject a closing tag followed\nby arbitrary HTML/JavaScript, leading to XSS on page load.\n\nCommon vulnerable patterns include:\n- __NEXT_DATA__ script tags with unescaped user content\n- window.__PRELOADED_STATE__ assignments with raw JSON.stringify output\n- Hydration scripts that embed user-controlled data without HTML escaping\n\n## Notes\n- Scans HTML responses for inline script tags containing hydration data\n- Detects unescaped sequences within JSON hydration blocks\n- Checks for missing HTML entity encoding of < characters in embedded JSON\n- Correlates with request parameters to identify user-controlled data in hydration\n- Deduplicates by host+path\n\n## References\n- https://snyk.io/blog/10-react-security-best-practices/\n- https://owasp.org/www-community/attacks/xss/\n- https://cwe.mitre.org/data/definitions/79.html","short_description":"Detects potential XSS in server-side rendered JSON hydration scripts","confirmation_criteria":"Confirmed when user-controlled data appears unescaped in a JSON hydration script block","severity":"high","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"remix-loader-exposure","name":"Remix Loader Exposure","type":"passive","description":"## Description\nScans HTML responses for Remix framework-specific patterns that may leak sensitive data.\nDetects exposed Remix context (window.__remixContext), manifest (__remixManifest), Remix\nresponse headers, and loader data embedded in script tags. Extracts Remix state data and\nscans for sensitive patterns including API keys, tokens, admin flags, email addresses,\npassword hashes, internal IPs, database URLs, and AWS keys.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects: window.__remixContext, __remixManifest, X-Remix-Response/X-Remix-Revalidate headers\n- Extracts loader data from script tags and scans for sensitive patterns\n- Minimum token length of 16 characters to reduce false positives\n- Deduplicates by host+path\n\n## References\n- https://remix.run/docs/en/main/route/loader\n- https://remix.run/docs/en/main/guides/streaming\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/04-Testing_for_Weak_Encryption","short_description":"Detects sensitive data leaked through Remix loader data and context","confirmation_criteria":"Confirmed when sensitive data patterns are found in Remix loader data or context","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"client-auth-guard","name":"Client Auth Guard Check","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js client components that\nimplement authentication guards purely on the client side using useEffect redirects.\nClient-side auth checks can be trivially bypassed by disabling JavaScript or\nmanipulating the DOM, leaving protected routes accessible without authentication.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects \"use client\" directive combined with useEffect-based auth redirects\n- Flags when no server-side auth indicators are found alongside client redirects\n- Covers router.push/replace to login/signin/auth and window.location redirects\n- Deduplicates by host+path\n- CWE-862: Missing Authorization\n\n## References\n- https://nextjs.org/docs/app/building-your-application/authentication\n- https://cwe.mitre.org/data/definitions/862.html\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/02-Testing_for_Bypassing_Authorization_Schema","short_description":"Detects client-only auth guards without server-side enforcement","confirmation_criteria":"Confirmed when a client component implements auth redirect via useEffect without server-side auth","severity":"high","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cache-data-leak","name":"Cache Data Leak","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js caching and static\ngeneration patterns that may inadvertently leak authenticated or user-specific data.\nStatic pages (getStaticProps, force-static) are generated at build time and served\nto all users, so including session-dependent data causes cross-user data leakage.\nSimilarly, unstable_cache without user-scoped keys or server fetches without\ncache: \"no-store\" may serve stale authenticated responses to different users.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects: getStaticProps with auth, force-static with auth, unstable_cache without user key\n- Also detects server component fetches with auth headers but without no-store/revalidate:0\n- CWE-524: Use of Cache That Contains Sensitive Information\n- Deduplicates by host+path\n\n## References\n- https://nextjs.org/docs/app/building-your-application/caching\n- https://nextjs.org/docs/app/building-your-application/data-fetching\n- https://cwe.mitre.org/data/definitions/524.html","short_description":"Detects cache and static generation patterns that may leak user data","confirmation_criteria":"Confirmed when static generation or caching patterns are used alongside authentication-scoped data fetching","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"server-action-input-audit","name":"Server Action Input Audit","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js Server Actions that accept\nuser input (FormData or function arguments) without runtime schema validation. Server\nActions rely on TypeScript types for compile-time safety, but these types are erased at\nruntime. Without runtime validation (zod, yup, joi, valibot, etc.), attackers can submit\narbitrary data types, unexpected fields, or injection payloads.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects \"use server\" directive combined with FormData/argument usage\n- Flags when no validation library patterns are found (z.parse, z.safeParse, schema.validate, etc.)\n- Complements server_action_auth which checks for missing authorization\n- Deduplicates by host+path\n- CWE-20: Improper Input Validation\n\n## References\n- https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations\n- https://nextjs.org/blog/security-nextjs-server-components-actions\n- https://cwe.mitre.org/data/definitions/20.html","short_description":"Detects Next.js Server Actions missing runtime input validation","confirmation_criteria":"Confirmed when a Server Action processes input without any runtime validation library","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"server-action-bind-audit","name":"Server Action Bind Audit","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js Server Actions that use\n.bind() to pass sensitive identifiers (IDs, slugs, resource references) as arguments.\nBound arguments are not encrypted and can be tampered with by the client. If the action\ndoes not re-authorize the resource on the server side, this creates an IDOR vulnerability\nwhere users can modify other users' resources by changing the bound ID.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects .bind(null, ) patterns in server component code\n- Flags when bound values look like resource identifiers (id, userId, postId, etc.)\n- Cross-references with authorization check patterns inside the action body\n- Deduplicates by host+path\n- CWE-639: Authorization Bypass Through User-Controlled Key\n\n## References\n- https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations#passing-additional-arguments\n- https://nextjs.org/blog/security-nextjs-server-components-actions\n- https://cwe.mitre.org/data/definitions/639.html","short_description":"Detects Server Action .bind() with sensitive identifiers risking IDOR","confirmation_criteria":"Confirmed when .bind() passes identifiers to a Server Action without re-authorization in the action body","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"server-only-boundary-audit","name":"Server-Only Boundary Audit","type":"passive","description":"## Description\nScans client-side JavaScript bundles for evidence that server-only code has leaked\ninto the browser. Server-side modules (database clients, internal API helpers, crypto\noperations, environment secrets) should use the 'server-only' package to enforce the\nboundary. When this guard is missing, Next.js may accidentally bundle server code into\nthe client, exposing proprietary logic, internal endpoints, and potentially credentials.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Scans JS response bodies under /_next/static/ paths\n- Detects server-side module identifiers in client bundles (prisma, drizzle, knex, etc.)\n- Detects internal API endpoint patterns (localhost, 127.0.0.1, internal service URLs)\n- Detects server crypto/auth module usage (bcrypt, jsonwebtoken, jose)\n- Deduplicates by host+path\n\n## References\n- https://nextjs.org/docs/app/building-your-application/rendering/composition-patterns#keeping-server-only-code-out-of-the-client-environment\n- https://cwe.mitre.org/data/definitions/200.html\n- https://cwe.mitre.org/data/definitions/540.html","short_description":"Detects server-side modules leaked into client component bundles","confirmation_criteria":"Confirmed when client-side JavaScript bundles contain server-only module identifiers or internal service references","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-dynamic-param-audit","name":"Next.js Dynamic Param Audit","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js pages and route handlers\nthat use dynamic route params or searchParams directly in database queries, authorization\ndecisions, or sensitive operations without runtime validation. Dynamic route segments\n([param]) and searchParams are user-controlled strings that must be validated before\nuse in security-sensitive contexts.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects params.id, params.slug, searchParams.* used directly in DB queries\n- Detects searchParams used in authorization decisions (isAdmin, role, etc.)\n- Flags when no schema validation is applied before use\n- Deduplicates by host+path\n- CWE-20: Improper Input Validation\n\n## References\n- https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes\n- https://nextjs.org/blog/security-nextjs-server-components-actions\n- https://cwe.mitre.org/data/definitions/20.html\n- https://cwe.mitre.org/data/definitions/89.html","short_description":"Detects unsafe usage of dynamic route params without validation","confirmation_criteria":"Confirmed when dynamic params or searchParams are used directly in sensitive operations without validation","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"unsafe-html-sink","name":"Unsafe HTML Sink","type":"passive","description":"## Description\nScans JavaScript, TypeScript, Vue, and Svelte response bodies for patterns that inject\nraw HTML into the DOM without sanitization. These sinks are common sources of XSS\nvulnerabilities in modern frontend frameworks: React (dangerouslySetInnerHTML),\nVue (v-html), Svelte ({@html}), Angular (bypassSecurityTrust*), and vanilla DOM APIs\n(innerHTML, outerHTML, insertAdjacentHTML, document.write). Also detects dangerous\ncode injection patterns via eval() and new Function().\n\n## Notes\n- Passive only -- does not send any HTTP requests\n- Scans JS/TS/Vue/Svelte files and inline scripts in HTML responses\n- Each detected pattern produces a separate finding\n- Deduplicates by host+path\n- eval() detections are suppressed for test/spec/mock files\n\n## References\n- https://react.dev/reference/react-dom/components/common#dangerously-setting-the-inner-html\n- https://vuejs.org/api/built-in-directives.html#v-html\n- https://svelte.dev/docs/special-tags#html\n- https://angular.io/api/platform-browser/DomSanitizer\n- https://owasp.org/www-community/attacks/DOM_Based_XSS\n- https://cwe.mitre.org/data/definitions/79.html","short_description":"Detects raw HTML injection sinks in JS/TS framework code","confirmation_criteria":"Confirmed when response JavaScript or template code contains known unsafe HTML injection sinks","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"insecure-token-storage","name":"Insecure Token Storage","type":"passive","description":"## Description\nScans JavaScript response bodies for patterns that store authentication tokens,\nAPI keys, or session identifiers in browser localStorage or sessionStorage.\nStoring sensitive tokens in Web Storage exposes them to XSS attacks -- any\nscript running in the same origin can read these values, making token theft\ntrivial if an XSS vulnerability exists.\n\n## Notes\n- Passive only -- does not send any HTTP requests\n- Detects setItem calls with known auth-related key names\n- Detects bracket notation assignment to known auth key names\n- Flags patterns that read from localStorage for Authorization headers (higher severity)\n- Deduplicates by host+path\n\n## References\n- https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#local-storage\n- https://owasp.org/www-community/attacks/xss/\n- https://cwe.mitre.org/data/definitions/922.html\n- https://auth0.com/docs/secure/security-guidance/data-security/token-storage","short_description":"Detects auth tokens stored in localStorage/sessionStorage","confirmation_criteria":"Confirmed when JavaScript code stores auth tokens or secrets in localStorage or sessionStorage","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"env-secret-exposure","name":"Environment Secret Exposure","type":"passive","description":"## Description\nScans response bodies for secrets accidentally exposed through public environment\nvariable mechanisms in modern JS frameworks. Next.js (NEXT_PUBLIC_), Vite (VITE_),\nand Create React App (REACT_APP_) all expose prefixed environment variables to the\nclient bundle. When developers store secret keys, tokens, or passwords in these\npublic variables, they are shipped to every browser that loads the application.\nAlso detects .env files served directly with embedded secrets.\n\n## Notes\n- Passive only -- does not send any HTTP requests\n- Scans JS, HTML, JSON, and plain text responses\n- Detects NEXT_PUBLIC_, VITE_, REACT_APP_ prefixed secret variables\n- Detects raw .env file content with secret indicators (sk_live_, AKIA, ghp_, etc.)\n- Minimum value length of 8 characters to reduce false positives\n- Deduplicates by host\n\n## References\n- https://nextjs.org/docs/app/building-your-application/configuring/environment-variables\n- https://vitejs.dev/guide/env-and-mode.html\n- https://create-react-app.dev/docs/adding-custom-environment-variables/\n- https://cwe.mitre.org/data/definitions/200.html\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/05-Enumerate_Infrastructure_and_Application_Admin_Interfaces","short_description":"Detects secrets exposed through public environment variables","confirmation_criteria":"Confirmed when response body contains public environment variables with secret values or .env file content with credential indicators","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"build-misconfig-detect","name":"Build Misconfiguration Detect","type":"passive","description":"## Description\nScans JavaScript, TypeScript, and JSON response bodies for build and deployment\nmisconfigurations in modern frontend frameworks. Detects production source maps\nenabled (Next.js, Vite, webpack), development mode start scripts in production\npackage.json, dangerous SVG handling in Next.js image optimization, and overly\nbroad image remote patterns. These misconfigurations can leak source code,\nexpose development tooling, or enable SSRF attacks.\n\n## Notes\n- Passive only -- does not send any HTTP requests\n- Scans JS/TS/JSON responses and config file URLs\n- Detects: source maps in prod, dev mode in prod, SVG XSS risk, broad image remotePatterns\n- Deduplicates by host\n\n## References\n- https://nextjs.org/docs/app/api-reference/next-config-js/productionBrowserSourceMaps\n- https://vitejs.dev/config/build-options.html#build-sourcemap\n- https://webpack.js.org/configuration/devtool/\n- https://cwe.mitre.org/data/definitions/540.html\n- https://cwe.mitre.org/data/definitions/489.html","short_description":"Detects build and deployment misconfigurations in framework config files","confirmation_criteria":"Confirmed when response body contains build or deployment configuration patterns that indicate misconfigurations in production","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"csp-weakness-audit","name":"CSP Weakness Audit","type":"passive","description":"## Description\nParses Content-Security-Policy headers and evaluates individual directives for\nunsafe configurations that reduce CSP effectiveness. Detects unsafe-inline,\nunsafe-eval, wildcard sources, missing frame-ancestors, missing base-uri\nrestriction, overly permissive script-src, and data: or blob: URI schemes\nin sensitive directives.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Only processes HTML responses (text/html content type)\n- Parses actual CSP header values, not just presence/absence\n- Each weakness emits a separate finding with the problematic directive\n- Deduplicates by host\n- Complements security_headers_missing which only checks for header presence\n\n## References\n- https://cwe.mitre.org/data/definitions/693.html\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP\n- https://csp-evaluator.withgoogle.com/","short_description":"Detects weak or unsafe Content-Security-Policy directives","confirmation_criteria":"Confirmed when CSP header contains directives that significantly weaken its protection","severity":"medium","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"hsts-preload-audit","name":"HSTS Preload Audit","type":"passive","description":"## Description\nPassively audits the Strict-Transport-Security (HSTS) header on HTTPS responses\nto verify preload readiness: sufficient max-age, includeSubDomains directive,\nand preload directive.\n\n## Notes\n- Only checks HTTPS HTML responses\n- Requires max-age >= 31536000 (1 year) for preload eligibility\n- Runs per-host to avoid duplicate findings\n\n## References\n- https://hstspreload.org/\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security","short_description":"Audits Strict-Transport-Security header for preload readiness","confirmation_criteria":"Confirmed when HSTS header is missing, incomplete, or not preload-ready","severity":"low","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"referrer-policy-detect","name":"Referrer Policy Detect","type":"passive","description":"## Description\nPassively detects missing or weak Referrer-Policy headers that may leak\nsensitive URL information to third-party origins.\n\n## Notes\n- Flags missing Referrer-Policy header\n- Flags weak values: unsafe-url, no-referrer-when-downgrade\n- Safe values are not flagged: no-referrer, same-origin, strict-origin, strict-origin-when-cross-origin\n- Runs per-host to avoid duplicate findings\n\n## References\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy\n- https://owasp.org/www-project-secure-headers/","short_description":"Detects missing or weak Referrer-Policy headers","confirmation_criteria":"Confirmed when Referrer-Policy header is missing or set to a weak value","severity":"low","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"permissions-policy-detect","name":"Permissions Policy Detect","type":"passive","description":"## Description\nPassively detects missing or overly permissive Permissions-Policy (and legacy\nFeature-Policy) headers that grant sensitive browser APIs to all origins.\n\n## Notes\n- Checks both Permissions-Policy and legacy Feature-Policy headers\n- Flags overly permissive directives: camera=*, microphone=*, geolocation=*, payment=*, usb=*\n- Flags missing header entirely\n- Runs per-host to avoid duplicate findings\n\n## References\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Permissions-Policy\n- https://www.w3.org/TR/permissions-policy/","short_description":"Detects missing or overly permissive Permissions-Policy headers","confirmation_criteria":"Confirmed when Permissions-Policy header is missing or contains overly permissive directives","severity":"info","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"subresource-integrity-detect","name":"Subresource Integrity Detect","type":"passive","description":"## Description\nPassively detects external scripts and stylesheets loaded without Subresource\nIntegrity (SRI) attributes. Missing SRI allows compromised CDNs or third-party\nhosts to inject malicious code.\n\n## Notes\n- Scans HTML response bodies for script and link tags referencing external origins\n- Flags external resources (http://, https://, //) that lack an integrity attribute\n- Skips inline scripts, same-origin resources, and data: URIs\n- Deduplicates by host+path\n\n## References\n- https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity\n- https://www.w3.org/TR/SRI/","short_description":"Detects external resources loaded without subresource integrity","confirmation_criteria":"Confirmed when external script or stylesheet is loaded without an integrity attribute","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-version-detect","name":"API Version Detect","type":"passive","description":"## Description\nPassively detects API version indicators in HTTP traffic including URL path patterns,\nversion headers, and version fields in JSON response bodies.\n\n## Notes\n- Detects version patterns in URL paths (e.g., /v1/, /api/v2/)\n- Checks for version-related response headers (API-Version, X-API-Version, Accept-Version)\n- Parses JSON response bodies for version fields\n- Useful for API enumeration and identifying deprecated API versions\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/12-API_Testing/","short_description":"Detects API versioning patterns in URLs, headers, and response bodies","confirmation_criteria":"Confirmed when URL path, headers, or response body contain API version indicators","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"grpc-web-detect","name":"gRPC-Web Detect","type":"passive","description":"## Description\nPassively detects gRPC-Web protocol usage by inspecting request and response\nContent-Type headers and gRPC-specific response headers.\n\n## Notes\n- Detects gRPC-Web content types (application/grpc-web, application/grpc-web+proto, application/grpc-web-text)\n- Checks for grpc-status response header\n- Checks for gRPC content types in requests\n- Useful for identifying gRPC-Web endpoints for further testing\n\n## References\n- https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-WEB.md\n- https://grpc.io/docs/platforms/web/","short_description":"Detects gRPC-Web protocol usage in HTTP traffic","confirmation_criteria":"Confirmed when request or response contains gRPC-Web content types or gRPC-specific headers","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wasm-module-detect","name":"WebAssembly Module Detect","type":"passive","description":"## Description\nPassively detects WebAssembly (WASM) module usage by identifying .wasm files,\napplication/wasm content types, WASM magic bytes, and WebAssembly instantiation\ncalls in JavaScript files.\n\n## Notes\n- Detects WASM binary files via magic bytes (\\x00asm)\n- Identifies WebAssembly.instantiate, WebAssembly.compile, and WebAssembly.instantiateStreaming calls in JS\n- WASM modules may contain sensitive logic worth reverse engineering\n- Useful for identifying client-side logic that may bypass server-side controls\n\n## References\n- https://webassembly.org/\n- https://developer.mozilla.org/en-US/docs/WebAssembly","short_description":"Detects WebAssembly modules and WASM instantiation in HTTP responses","confirmation_criteria":"Confirmed when response contains WASM magic bytes, application/wasm content type, or WebAssembly instantiation calls","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"endpoint-classifier","name":"Endpoint Classifier","type":"passive","description":"## Description\nClassifies HTTP endpoints and annotates database records with semantic tags (remarks).\nTags are derived from request/response characteristics such as content type, status code,\npath patterns, and authentication headers.\n\n## Tags Applied\n- json-api, html-page, graphql, api-endpoint\n- file-upload, redirect, error-page, authenticated\n- xml-api, form-endpoint\n\n## Notes\n- Runs as a passive module, no additional requests sent\n- Tags stored in HTTPRecord.Remarks for downstream filtering and prioritization","short_description":"Tags HTTP records with semantic labels based on request/response characteristics","confirmation_criteria":"Endpoint classified based on HTTP request/response characteristics","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-fingerprint","name":"WordPress Fingerprint","type":"passive","description":"## Description\nPassively identifies WordPress installations from HTML responses, extracts core\nversion information, and builds an inventory of installed plugins and themes by\nparsing asset URLs (/wp-content/plugins//, /wp-content/themes//).\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects WordPress via /wp-content/, /wp-includes/, wp-json, X-Pingback header, generator meta tag\n- Extracts version from generator meta tag and RSS feed generator element\n- Enumerates plugin/theme slugs from asset URL paths\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://developer.wordpress.org/\n- https://codex.wordpress.org/Determining_Plugin_and_Theme_License_Status","short_description":"Identifies WordPress installations and enumerates core version, plugins, and themes","confirmation_criteria":"Confirmed when WordPress-specific paths, headers, or meta tags are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-rest-api-detect","name":"WordPress REST API Exposure","type":"passive","description":"## Description\nPassively detects WordPress REST API exposure by analyzing responses from\n/wp-json/ endpoints. Identifies non-core plugin namespaces that may have\nweak or missing permission_callback, and flags unauthenticated access to\nsensitive built-in endpoints like wp/v2/users and wp/v2/settings.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Analyzes JSON responses from wp-json endpoints\n- Flags custom plugin namespaces (non-core) as potential attack surface\n- Detects user data exposure in wp/v2/users responses\n- Deduplicates by host\n\n## References\n- https://developer.wordpress.org/rest-api/\n- https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/","short_description":"Detects exposed WordPress REST API namespaces and sensitive endpoints","confirmation_criteria":"Confirmed when REST API responses contain namespace listings or user data accessible without authentication","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"drupal-fingerprint","name":"Drupal Fingerprint","type":"passive","description":"## Description\nPassively identifies Drupal installations from HTML responses and HTTP headers.\nDetects core version generation (Drupal 7 vs 8+) via asset path patterns (/misc/ vs /core/),\nX-Drupal-Cache and X-Drupal-Dynamic-Cache headers, generator meta tags, and drupalSettings\nJavaScript objects. Enumerates contributed modules from asset URL paths.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Drupal via X-Drupal-Cache, X-Drupal-Dynamic-Cache headers\n- Distinguishes Drupal 7 (/misc/, /sites/all/modules/) from Drupal 8+ (/core/, /modules/contrib/)\n- Extracts contrib module names from asset URL paths\n- Deduplicates by host\n\n## References\n- https://www.drupal.org/docs\n- https://www.drupal.org/security","short_description":"Identifies Drupal installations and detects core version, major generation (7/8/9/10/11), and contributed modules","confirmation_criteria":"Confirmed when Drupal-specific headers, asset paths, or meta tags are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"drupal-api-detect","name":"Drupal API Exposure","type":"passive","description":"## Description\nPassively detects Drupal JSON:API and REST module exposure by analyzing response\nheaders and bodies. Identifies application/vnd.api+json content types, JSON:API\nresource links, and REST module response patterns that indicate API endpoints\nare accessible anonymously.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects application/vnd.api+json content type (JSON:API)\n- Identifies jsonapi resource links in response bodies\n- Flags responses containing Drupal entity data structures\n- Deduplicates by host\n\n## References\n- https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module\n- https://www.drupal.org/docs/drupal-apis/restful-web-services-api","short_description":"Detects exposed Drupal JSON:API and REST endpoints from response content","confirmation_criteria":"Confirmed when responses contain JSON:API content types or Drupal REST entity data structures","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"joomla-fingerprint","name":"Joomla Fingerprint","type":"passive","description":"## Description\nPassively identifies Joomla installations from HTML responses. Detects Joomla\nvia generator meta tags, /administrator/ links, /media/com_* and /components/com_*\nasset paths, and Joomla-specific JavaScript objects. Enumerates installed\nextensions (components, modules, plugins) from URL patterns. Distinguishes\nJoomla 4+ by /api/index.php references.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Joomla via generator meta tag, /media/system/js/ paths, com_* references\n- Enumerates extensions from /components/com_*, /media/com_*, /modules/mod_* paths\n- Detects Joomla 4+ via /api/index.php references\n- Deduplicates by host\n\n## References\n- https://docs.joomla.org/\n- https://developer.joomla.org/security-centre.html","short_description":"Identifies Joomla installations and enumerates components, modules, and plugins from asset paths","confirmation_criteria":"Confirmed when Joomla-specific asset paths, headers, or meta tags are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"joomla-api-detect","name":"Joomla API Exposure","type":"passive","description":"## Description\nPassively detects Joomla Web Services API (Joomla 4+) exposure by analyzing\nresponse headers and bodies. Identifies application/vnd.api+json content types,\nAPI resource links, and CORS headers on API responses that indicate endpoints\nare accessible anonymously or with overly permissive cross-origin settings.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects application/vnd.api+json content type\n- Identifies /api/index.php path patterns\n- Flags overly permissive CORS (Access-Control-Allow-Origin: *) on API endpoints\n- Deduplicates by host\n\n## References\n- https://docs.joomla.org/J4.x:Joomla_Core_APIs\n- https://developer.joomla.org/security-centre.html","short_description":"Detects exposed Joomla Web Services API endpoints and CORS misconfigurations","confirmation_criteria":"Confirmed when responses contain Joomla API content types or resource structures","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-fingerprint","name":"Firebase Fingerprint","type":"passive","description":"## Description\nPassively identifies Firebase usage from HTML/JS responses, extracts project\nconfiguration, and detects leaked Firebase-specific secrets and tokens.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Firebase via SDK references, initializeApp calls, and config objects\n- Extracts projectId, apiKey, databaseURL, storageBucket from config\n- Flags leaked FCM server keys, App Check debug tokens, RTDB auth tokens\n- Flags leaked Firebase Storage download tokens in URLs\n- Detects staging/dev project indicators in projectId\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://firebase.google.com/docs/web/setup\n- https://firebase.google.com/docs/projects/api-keys","short_description":"Identifies Firebase usage and detects leaked Firebase secrets in responses","confirmation_criteria":"Confirmed when Firebase SDK references, configuration objects, or leaked Firebase secrets are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-storage-fingerprint","name":"Cloud Storage Fingerprint","type":"passive","description":"## Description\nPassively detects cloud storage services (AWS S3, Google Cloud Storage, Azure Blob Storage)\nfrom HTTP response headers, URL patterns in response bodies, and request host analysis.\n\n## Notes\n- Checks Server, x-amz-request-id, x-ms-request-id, x-goog-* headers\n- Scans response body for cloud storage URL patterns\n- Runs once per host with deduplication\n\n## References\n- https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html\n- https://cloud.google.com/storage/docs/request-endpoints\n- https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction","short_description":"Detects S3, GCS, and Azure Blob Storage endpoints in HTTP responses","confirmation_criteria":"Confirmed when response headers or body contain cloud storage service identifiers","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-signed-url-leak","name":"Cloud Signed URL Leak","type":"passive","description":"## Description\nPassively detects leaked AWS presigned URLs, GCS signed URLs, and Azure SAS tokens\nin HTTP response bodies. Parses expiry and permissions to assess risk level.\n\n## Notes\n- Scans response body for X-Amz-Signature, X-Goog-Signature, and Azure SAS parameters\n- Upgrades severity to High if write-capable or long-lived (>24h)\n- Deduplicates by URL and signature hash\n\n## References\n- https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html\n- https://cloud.google.com/storage/docs/access-control/signed-urls\n- https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview","short_description":"Detects leaked cloud storage signed URLs and SAS tokens in responses","confirmation_criteria":"Confirmed when response body contains cloud storage signed URL or SAS token parameters","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-storage-error-info","name":"Cloud Storage Error Info","type":"passive","description":"## Description\nPassively extracts leaked cloud storage identifiers (bucket names, regions, endpoints)\nfrom S3 XML error responses, Azure x-ms-error-code headers, and GCS error JSON.\n\n## Notes\n- Parses S3 XML errors for BucketName, Region, Code elements\n- Checks Azure x-ms-error-code header and XML error bodies\n- Parses GCS JSON error responses for bucket metadata\n- Runs once per host with deduplication\n\n## References\n- https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n- https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes","short_description":"Extracts bucket names and regions from cloud storage error responses","confirmation_criteria":"Confirmed when error response reveals cloud storage bucket name, region, or error code","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-fingerprint","name":"Laravel Fingerprint","type":"passive","description":"## Description\nPassively identifies Laravel installations by analyzing HTTP response headers,\ncookies (laravel_session, XSRF-TOKEN), body patterns (csrf-token meta tag,\nIlluminate error strings), and Sanctum/Passport indicators. Requires 2+\nindependent signals to avoid false positives.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Deduplicates by host to avoid redundant processing\n- Extracts version hints from error pages and headers when available\n- Reports as informational severity\n\n## References\n- https://laravel.com/docs/csrf\n- https://laravel.com/docs/session\n- https://laravel.com/docs/sanctum","short_description":"Identifies Laravel installations from response headers, cookies, and body patterns","confirmation_criteria":"Confirmed when 2+ independent Laravel-specific signals are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-fingerprint","name":"ASP.NET Fingerprint","type":"passive","description":"## Description\nPassively identifies ASP.NET and Microsoft IIS installations by analyzing HTTP\nresponse headers (X-AspNet-Version, X-AspNetMvc-Version, X-Powered-By, Server),\ncookies (ASP.NET_SessionId, .ASPXAUTH, .AspNetCore.Cookies), and body patterns\n(__VIEWSTATE, __EVENTVALIDATION, WebResource.axd, ScriptResource.axd).\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Extracts IIS version from Server header, ASP.NET version from X-AspNet-Version\n- Detects classic ASP, ASP.NET Web Forms, ASP.NET MVC, and ASP.NET Core\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://learn.microsoft.com/en-us/aspnet/\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/01-Information_Gathering/02-Fingerprint_Web_Server","short_description":"Identifies ASP.NET and IIS installations from response headers, cookies, and body patterns","confirmation_criteria":"Confirmed when ASP.NET-specific headers, cookies, or body patterns are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-viewstate-detect","name":"ASP.NET ViewState Detect","type":"passive","description":"## Description\nPassively analyzes ASP.NET ViewState in HTML responses for security issues.\nChecks for unencrypted ViewState (plaintext base64), missing EventValidation,\nmissing RequestVerificationToken on postback forms (CSRF risk), and oversized\nViewState payloads that may carry sensitive data.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Parses __VIEWSTATE from HTML form fields\n- Base64-decodes ViewState to check for encryption envelope\n- Flags ViewState > 4KB as potential sensitive data carrier\n- Deduplicates by host to report once per target\n\n## References\n- https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.page.viewstateencryptionmode\n- https://owasp.org/www-community/attacks/Cross-Site_Request_Forgery_(CSRF)","short_description":"Detects ASP.NET ViewState issues including missing encryption, CSRF tokens, and large payloads","confirmation_criteria":"Confirmed when ViewState is present and lacks encryption or associated security tokens","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-fingerprint","name":"Spring Fingerprint","type":"passive","description":"## Description\nPassively identifies Spring Boot and Spring MVC applications by analyzing HTTP\nresponse headers (X-Application-Context, Server), cookies (JSESSIONID pattern),\ndefault error page patterns (Whitelabel), and body content markers.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Spring via Whitelabel Error Page, server headers, session cookies\n- Identifies underlying servlet container (Tomcat, Jetty, Undertow)\n- Recognizes Spring-specific response patterns\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://docs.spring.io/spring-boot/docs/current/reference/html/\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/01-Information_Gathering/02-Fingerprint_Web_Server","short_description":"Identifies Spring Boot/Spring MVC applications from response headers, cookies, error pages, and body patterns","confirmation_criteria":"Confirmed when Spring-specific headers, cookies, or body patterns are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"jackson-deserialize-detect","name":"Jackson Deserialization Detect","type":"passive","description":"## Description\nPassively detects indicators of Jackson polymorphic deserialization in HTTP\nresponses. Looks for type discriminator fields (@class, @type, java class\nreferences) in JSON responses and Java deserialization error messages in\nerror responses. Jackson default typing can enable gadget-based RCE.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Checks JSON responses for type discriminator fields\n- Detects Java class references in JSON payloads\n- Identifies deserialization error patterns\n- Deduplicates by host\n\n## References\n- https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features\n- https://cwe.mitre.org/data/definitions/502.html","short_description":"Detects Jackson polymorphic typing indicators and Java deserialization error patterns in responses","confirmation_criteria":"Confirmed when response contains Jackson type discriminator fields or Java deserialization error patterns","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"express-fingerprint","name":"Express/NestJS Fingerprint","type":"passive","description":"## Description\nPassively identifies Express.js and NestJS applications by analyzing HTTP response\nheaders, cookies, and error body patterns. Detects X-Powered-By header set to Express,\nNestJS default error shapes in JSON responses, connect.sid session cookie, and Express\ndefault weak ETag format.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Express via X-Powered-By header\n- Identifies NestJS by its default JSON error shape (statusCode, message, error)\n- Recognizes connect.sid session cookie as Express session middleware\n- Checks ETag header for Express default weak ETag format (W/\"...\")\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://expressjs.com/en/api.html\n- https://docs.nestjs.com/exception-filters\n- https://github.com/expressjs/session","short_description":"Identifies Express.js and NestJS applications via response headers and error body patterns","confirmation_criteria":"Confirmed when Express or NestJS-specific headers, cookies, or error body patterns are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"express-session-audit","name":"Express Session Audit","type":"passive","description":"## Description\nAudits Express.js session cookies for security issues beyond basic cookie attribute checks.\nDetects default session names (connect.sid), excessive session expiry windows, and\nsession proliferation on anonymous or static requests.\n\n## Notes\n- Flags connect.sid default session name as a fingerprinting risk enabling framework identification\n- Flags excessive Max-Age (>7 days / 604800 seconds) or very long Expires dates\n- Detects session proliferation when session cookies are set on anonymous/static requests\n\n## References\n- https://expressjs.com/en/resources/middleware/session.html\n- https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html\n- https://owasp.org/www-community/controls/SecureCookieAttribute","short_description":"Audits Express.js session cookies for default naming, excessive expiry, and session proliferation","confirmation_criteria":"Confirmed when Express.js session cookies exhibit default naming, excessive expiry, or unnecessary proliferation","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cors-vary-origin-missing","name":"CORS Vary Origin Missing","type":"passive","description":"## Description\nDetects responses with a dynamic Access-Control-Allow-Origin header that are missing\nthe Vary: Origin header. When a server reflects a specific origin in ACAO without\nincluding Vary: Origin, shared caches may serve the response to requests from different\norigins, enabling cache poisoning attacks.\n\n## Notes\n- Flags responses where ACAO is a specific origin (not wildcard) without Vary: Origin\n- Severity is upgraded to Medium when Access-Control-Allow-Credentials: true is also present\n- Cache poisoning with credentials amplifies the impact significantly\n- Complements CORS header detection with cache-specific misconfiguration checks\n\n## References\n- https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary\n- https://www.w3.org/TR/cors/#resource-implementation","short_description":"Detects dynamic CORS responses missing Vary: Origin header enabling cache poisoning","confirmation_criteria":"Confirmed when a dynamic CORS response lacks the Vary: Origin header required for correct cache behavior","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-fingerprint","name":"Rails Fingerprint","type":"passive","description":"## Description\nPassively identifies Ruby on Rails installations by analyzing HTTP response headers\n(X-Request-Id, X-Runtime, Server), cookies (_session suffix), default error page\npatterns, and body content markers (__VIEWSTATE absence with Rails patterns).\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Rails via X-Request-Id + X-Runtime header combination\n- Identifies Puma/Unicorn/Passenger server headers\n- Recognizes default Rails 404/500 error page text\n- Detects Rails session cookies by naming convention\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://guides.rubyonrails.org/configuring.html\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/01-Information_Gathering/02-Fingerprint_Web_Server","short_description":"Identifies Ruby on Rails installations from response headers, cookies, and body patterns","confirmation_criteria":"Confirmed when Rails-specific headers, cookies, or body patterns are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-debug-detect","name":"Rails Debug Detect","type":"passive","description":"## Description\nPassively detects Rails development/debug tooling exposed in production responses.\nIdentifies Rails exception pages with stack traces, Better Errors pages, Web Console\npresence, ActiveRecord database errors, and absolute filesystem path disclosure.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Checks for Rails-specific exception class names and debug section markers\n- Detects Better Errors and Web Console development gems\n- Identifies ActiveRecord/database error leakage\n- Flags absolute filesystem path disclosure in responses\n\n## References\n- https://guides.rubyonrails.org/debugging_rails_applications.html\n- https://owasp.org/www-community/Improper_Error_Handling","short_description":"Detects Rails debug exception pages, Better Errors, Web Console, and ActiveRecord errors in responses","confirmation_criteria":"Confirmed when Rails-specific debug patterns or exception details are found in response bodies","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-active-storage-detect","name":"Rails Active Storage Detect","type":"passive","description":"## Description\nPassively detects Rails Active Storage usage by scanning response bodies for Active\nStorage blob URLs, representation URLs, and direct upload form attributes. Flags\npotentially publicly accessible file attachments.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Scans HTML bodies for /rails/active_storage/ URL patterns\n- Detects data-direct-upload-url attributes in forms\n- Identifies activestorage JavaScript references\n- Deduplicates by host\n\n## References\n- https://guides.rubyonrails.org/active_storage_overview.html","short_description":"Passively detects Active Storage URLs and direct upload references in responses","confirmation_criteria":"Confirmed when Active Storage URL patterns or direct upload attributes are found in responses","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-action-cable-detect","name":"Rails Action Cable Detect","type":"passive","description":"## Description\nPassively detects Rails Action Cable (WebSocket) usage by scanning response bodies for\nAction Cable meta tags, JavaScript configuration, and WebSocket endpoint references.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects action-cable-url meta tags in HTML\n- Identifies Action Cable JavaScript references and channel subscriptions\n- Scans for WebSocket endpoint paths (/cable, /websocket, /ws)\n- Deduplicates by host\n\n## References\n- https://guides.rubyonrails.org/action_cable_overview.html","short_description":"Passively detects Action Cable WebSocket endpoints and configuration in responses","confirmation_criteria":"Confirmed when Action Cable meta tags, JS references, or WebSocket endpoint patterns are found","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"fastapi-fingerprint","name":"FastAPI Fingerprint","type":"passive","description":"## Description\nPassively identifies FastAPI/Starlette/Uvicorn installations by analyzing HTTP\nresponse headers (Server, x-process-time), body patterns (OpenAPI JSON shape,\ndetail error shape), and well-known documentation endpoints (/docs, /redoc).\nRequires 2+ independent signals to avoid false positives.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Deduplicates by host to avoid redundant processing\n- Detects Uvicorn via Server header\n- Recognizes FastAPI default error shape and OpenAPI spec indicators\n- Identifies /docs (Swagger UI) and /redoc documentation endpoints\n\n## References\n- https://fastapi.tiangolo.com/","short_description":"Identifies FastAPI/Starlette/Uvicorn installations from response headers, body patterns, and endpoints","confirmation_criteria":"Confirmed when 2+ independent FastAPI/Starlette/Uvicorn-specific signals are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"django-fingerprint","name":"Django Fingerprint","type":"passive","description":"## Description\nPassively identifies Django installations by analyzing HTTP response cookies\n(csrftoken, sessionid), body patterns (csrfmiddlewaretoken hidden field,\nDjango-specific error strings), and default header configurations. Requires\n2+ independent signals to avoid false positives.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Deduplicates by host to avoid redundant processing\n- Detects Django default CSRF cookie and session cookie names\n- Recognizes Django error page patterns (ImproperlyConfigured, OperationalError)\n- X-Frame-Options: DENY is a weak signal, only counted with another signal\n\n## References\n- https://www.djangoproject.com/","short_description":"Identifies Django installations from response headers, cookies, and body patterns","confirmation_criteria":"Confirmed when 2+ independent Django-specific signals are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"flask-fingerprint","name":"Flask Fingerprint","type":"passive","description":"## Description\nPassively identifies Flask/Werkzeug installations by analyzing HTTP response\nheaders (Server: Werkzeug), cookies (Flask default signed session cookie),\nand body patterns (Werkzeug Debugger, Jinja2 errors, Flask tracebacks).\nReports with Certain confidence on strong signals, Firm on weak signals only.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Deduplicates by host to avoid redundant processing\n- Strong signals: Werkzeug Debugger in body, Werkzeug in Server header\n- Weak signals: Flask session cookie, Jinja2 errors, Flask tracebacks\n- Requires 1+ strong signal or 2+ weak signals to report\n\n## References\n- https://flask.palletsprojects.com/","short_description":"Identifies Flask/Werkzeug installations from response headers, cookies, and body patterns","confirmation_criteria":"Confirmed when Flask/Werkzeug-specific signals are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"python-debug-detect","name":"Python Debug Detect","type":"passive","description":"## Description\nPassively detects Python tracebacks, debug information, and path disclosure in\nHTTP responses. Identifies full Python tracebacks, file path disclosure via\nsite-packages paths, Django debug pages, and Werkzeug Debugger exposure. Each\ndetection pattern generates a separate finding with appropriate severity.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Deduplicates by host + detection type to avoid spam\n- Werkzeug Debugger: Critical severity (potential RCE)\n- Full Python traceback: High severity (secrets/paths exposed)\n- Django debug page: High severity\n- File path disclosure: Medium severity\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects Python tracebacks, debug pages, and path disclosure in responses","confirmation_criteria":"Confirmed when Python-specific debug patterns or tracebacks are found in response bodies","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-spec-detect","name":"API Spec Detect","type":"passive","description":"Passively analyzes HTTP responses for API specification content (OpenAPI, Swagger,\nPostman Collections). When a spec is detected, it is parsed and the extracted endpoints\nare fed back into the scanning pipeline as new work items.","short_description":"Detects API spec responses and ingests endpoints for scanning","confirmation_criteria":"An API specification document was detected in a response body. Extracted endpoints have been ingested into the scanning pipeline.","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sensitive-api-fields-detect","name":"Sensitive API Fields Detect","type":"passive","description":"## Description\nPassively analyzes JSON API responses for field names that indicate sensitive\ndata exposure. Checks for password fields, API keys, access tokens, private\nkeys, SSNs, and credit card numbers. Skips API documentation and JSON Schema\nresponses to reduce false positives.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Only operates on application/json responses\n- Uses quoted field name matching to avoid false positives in prose\n- Skips OpenAPI/Swagger docs and JSON Schema responses\n- Deduplicates by host to avoid flooding with the same finding\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa3-broken-object-property-level-authorization/","short_description":"Flags JSON API responses containing sensitive field names like passwords, API keys, and PII","confirmation_criteria":"Confirmed when JSON response body contains sensitive field names","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-pagination-leak","name":"API Pagination Leak","type":"passive","description":"## Description\nPassively detects API pagination metadata in JSON responses that reveals total record\ncounts, page counts, or cursor-based navigation details. This information can disclose\nhow many records exist in a collection, which may reveal business-sensitive data such as\nuser counts, order volumes, or internal resource quantities.\n\n## Notes\n- Checks JSON response bodies for common pagination fields (total_count, total, totalItems, etc.)\n- Only triggers on JSON responses to avoid false positives\n- Deduplicates by host+path to avoid redundant findings\n- Reports matched fields and their values as extracted results\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa3-broken-object-property-level-authorization/\n- https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html","short_description":"Detects API pagination metadata that reveals total record counts","confirmation_criteria":"Confirmed when JSON response contains pagination metadata fields exposing total record counts or page navigation details","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"verbose-error-stacktrace","name":"Verbose Error Stack Trace","type":"passive","description":"## Description\nDetects verbose stack traces in HTTP responses that expose internal file paths,\nline numbers, and function names. Unlike the generic error-message-detect module,\nthis module specifically targets multi-line stack trace patterns with file system\npaths, providing higher confidence findings for each technology stack.\n\nCovers Go, Java, Python, Ruby, Node.js, .NET/C#, and PHP stack traces.\n\n## Notes\n- Uses multiline-aware regex patterns to detect structured stack traces\n- Each technology stack has its own detection pattern and severity\n- Requires at least one file path with line number to confirm a stack trace\n- Deduplicates by host+path to avoid redundant findings\n\n## References\n- https://owasp.org/www-community/Improper_Error_Handling\n- https://cheatsheetseries.owasp.org/cheatsheets/Error_Handling_Cheat_Sheet.html\n- https://cwe.mitre.org/data/definitions/209.html","short_description":"Detects full stack traces with file paths in HTTP responses","confirmation_criteria":"Confirmed when response body contains a structured stack trace with file paths and line numbers from a known technology stack","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"graphql-error-leak","name":"GraphQL Error Leak","type":"passive","description":"## Description\nPassively detects verbose GraphQL error responses that leak internal implementation details\nsuch as resolver names, field suggestions, type information, database errors, and stack traces.\nThese errors can help attackers enumerate the schema, discover hidden fields, and identify\nbackend technologies without requiring introspection access.\n\n## Notes\n- Checks JSON response bodies for GraphQL error array structure\n- Detects field suggestion leaks (\"Did you mean ...?\")\n- Detects resolver/type name exposure in error paths\n- Detects database and ORM errors surfaced through GraphQL\n- Deduplicates by host+path to avoid redundant findings\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/12-API_Testing/01-Testing_GraphQL\n- https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html\n- https://the-bilal-rizwan.medium.com/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696","short_description":"Detects verbose GraphQL errors exposing schema and resolver details","confirmation_criteria":"Confirmed when JSON response contains GraphQL error objects with internal details such as field suggestions, resolver paths, or stack traces","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"metaframework-fingerprint","name":"Meta-Framework Fingerprint","type":"passive","description":"## Description\nPassively identifies newer JavaScript meta-frameworks by analyzing HTML response bodies\nand HTTP headers for framework-specific markers. Complements the existing js-framework-fingerprint\nmodule which covers Next.js, Nuxt, Angular, React, and Gatsby.\n\n## Notes\n- Passive only — does not send any HTTP requests\n- Detects: Remix, Astro, SvelteKit, SolidStart, Qwik\n- Uses strong signals (hydration markers, asset URL patterns, headers) to avoid false positives\n- Deduplicates by host to fingerprint each host only once\n\n## References\n- https://remix.run/docs\n- https://docs.astro.build\n- https://svelte.dev/docs/kit\n- https://start.solidjs.com\n- https://qwik.dev","short_description":"Identifies Remix, Astro, SvelteKit, Solid, and Qwik meta-frameworks","confirmation_criteria":"Confirmed when framework-specific markers (hydration scripts, asset URL patterns, or headers) are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"software-version-header","name":"Software Version Header","type":"passive","description":"## Description\nPassively detects HTTP response headers that reveal exact software version numbers.\nHeaders such as Server, X-Powered-By, X-AspNet-Version, and X-AspNetMvc-Version\nfrequently expose the underlying technology stack and its version, enabling attackers\nto search for known CVEs targeting those specific versions.\n\n## Notes\n- Checks common version-disclosing headers against version number patterns\n- Only reports when an actual version number is present (not just a product name)\n- Deduplicates by host to report each server's version headers once\n- Extracts the header name, product, and version for each finding\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/01-Information_Gathering/08-Fingerprint_Web_Application_Framework\n- https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html\n- https://cwe.mitre.org/data/definitions/200.html","short_description":"Detects HTTP headers that disclose specific software version strings","confirmation_criteria":"Confirmed when HTTP response headers contain version-disclosing values with identifiable version numbers","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} diff --git a/test/testdata/sample-jsonl-output/vigolium-spider.jsonl b/test/testdata/sample-jsonl-output/vigolium-spider.jsonl new file mode 100644 index 0000000..e495338 --- /dev/null +++ b/test/testdata/sample-jsonl-output/vigolium-spider.jsonl @@ -0,0 +1,262 @@ +{"type":"scan","data":{"uuid":"5789dfa4-2793-4791-baef-353392da94aa","project_uuid":"00000000-0000-0000-0000-000000000001","name":"cli-scan","status":"completed","target":"https://ginandjuice.shop/","threads":50,"scan_source":"cli","scan_mode":"full","start_cursor_at":"0001-01-01T00:00:00Z","cursor_at":"0001-01-01T00:00:00Z","processed_count":31,"started_at":"2026-04-05T05:31:26.870765Z","finished_at":"2026-04-05T05:37:27Z","duration_ms":0,"total_requests":0,"total_findings":0,"critical_count":0,"high_count":0,"medium_count":0,"low_count":0,"info_count":0,"suspect_count":0,"created_at":"2026-04-05T05:31:26Z","updated_at":"2026-04-05T05:37:27Z"}} +{"type":"http_record","data":{"uuid":"6d171668-9f73-4138-9994-0b22a60dd46b","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"POST","path":"/catalog/product/stock","url":"https://ginandjuice.shop/catalog/product/stock","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Content-Type":["application/xml"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/catalog/product?productId=11"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_type":"application/xml","request_content_length":107,"raw_request":"UE9TVCAvY2F0YWxvZy9wcm9kdWN0L3N0b2NrIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpSZWZlcmVyOiBodHRwczovL2dpbmFuZGp1aWNlLnNob3AvY2F0YWxvZy9wcm9kdWN0P3Byb2R1Y3RJZD0xMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2DQpBY2NlcHQtTGFuZ3VhZ2U6IGVuDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3htbA0KDQo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjxzdG9ja0NoZWNrPjxwcm9kdWN0SWQ+YTwvcHJvZHVjdElkPjxzdG9yZUlkPjM8L3N0b3JlSWQ+PC9zdG9ja0NoZWNrPg==","request_hash":"49a2a485cf76c6a4803009a8de0482fc1f010fb94ae488f5d3a9be052c72fca9","status_code":400,"response_http_version":"HTTP/1.1","response_headers":{"content-encoding":["gzip"],"content-length":["49"],"content-type":["application/json; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:35:32 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/json; charset=utf-8","response_content_length":29,"raw_response":"SFRUUC8xLjEgNDAwIEJhZCBSZXF1ZXN0DQp4LWJhY2tlbmQ6IGM5OGRmNWM0LWE1MjctNGRhYS04OGNkLTgzYzVkZTRlN2M3Nw0KY29udGVudC1sZW5ndGg6IDQ5DQpkYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjM1OjMyIEdNVA0KY29udGVudC1lbmNvZGluZzogZ3ppcA0KY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04DQp4LWZyYW1lLW9wdGlvbnM6IFNBTUVPUklHSU4NCg0KIlByb2R1Y3QgSUQgbXVzdCBiZSBhIG51bWJlciI=","response_hash":"13a408c5d8e236bb41370f617b99917275821fd7b4fba413a432190b286cdac5","response_time_ms":0,"response_words":24,"has_response":true,"parameters":[{"name":"1","value":"catalog","type":"path","name_start":-1,"name_end":-1,"value_start":6,"value_end":13},{"name":"2","value":"product","type":"path","name_start":-1,"name_end":-1,"value_start":14,"value_end":21},{"name":"3","value":"stock","type":"path","name_start":-1,"name_end":-1,"value_start":22,"value_end":27},{"name":"productid","value":"a","type":"xml","name_start":-1,"name_end":-1,"value_start":372,"value_end":373},{"name":"storeid","value":"3","type":"xml","name_start":-1,"name_end":-1,"value_start":394,"value_end":395}],"sent_at":"2026-04-05T05:35:33.015459Z","received_at":"2026-04-05T05:35:33.015433Z","created_at":"2026-04-05T05:35:33Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"156f4bc5-d508-4f69-9cfa-4aa4ab0f82fe","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"POST","path":"/catalog/subscribe","url":"https://ginandjuice.shop/catalog/subscribe","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Content-Type":["application/json;charset=UTF-8"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_type":"application/json;charset=UTF-8","request_content_length":46,"raw_request":"UE9TVCAvY2F0YWxvZy9zdWJzY3JpYmUgSFRUUC8xLjENCkhvc3Q6IGdpbmFuZGp1aWNlLnNob3ANClJlZmVyZXI6IGh0dHBzOi8vZ2luYW5kanVpY2Uuc2hvcC8NClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTQuMC4wLjAgU2FmYXJpLzUzNy4zNg0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgNCg0KeyJlbWFpbCI6ImpvaG50ZWQxMzIxMjNAZ21haWwuY29tIiwiY3NyZiI6ImEifQ==","request_hash":"674da25494d0f4f92a0ca633a1c101aea5f8a46fb61e0d40eeca758a7e5715ac","status_code":400,"response_http_version":"HTTP/1.1","response_headers":{"content-encoding":["gzip"],"content-length":["40"],"content-type":["application/json; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:34:07 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/json; charset=utf-8","response_content_length":20,"raw_response":"SFRUUC8xLjEgNDAwIEJhZCBSZXF1ZXN0DQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KeC1iYWNrZW5kOiBjOThkZjVjNC1hNTI3LTRkYWEtODhjZC04M2M1ZGU0ZTdjNzcNCmNvbnRlbnQtbGVuZ3RoOiA0MA0KZGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozNDowNyBHTVQNCg0KIkludmFsaWQgQ1NSRiB0b2tlbiI=","response_hash":"959ac3c1f78065cfad5f3b46775b901bc9730515a12d788cdbb8930c5f244a67","response_time_ms":0,"response_words":21,"has_response":true,"parameters":[{"name":"1","value":"catalog","type":"path","name_start":-1,"name_end":-1,"value_start":6,"value_end":13},{"name":"2","value":"subscribe","type":"path","name_start":-1,"name_end":-1,"value_start":14,"value_end":23},{"name":"email","value":"johnted132123@gmail.com","type":"json","name_start":296,"name_end":301,"value_start":304,"value_end":327},{"name":"csrf","value":"a","type":"json","name_start":330,"name_end":334,"value_start":337,"value_end":338}],"sent_at":"2026-04-05T05:34:07.243715Z","received_at":"2026-04-05T05:34:07.243608Z","created_at":"2026-04-05T05:34:07Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"57eb484d-5dae-4a7c-953a-d50335334330","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/catalog?category=Accessories","url":"https://ginandjuice.shop/catalog?category=Accessories","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/catalog"],"Upgrade-Insecure-Requests":["1"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9jYXRhbG9nP2NhdGVnb3J5PUFjY2Vzc29yaWVzIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuDQpSZWZlcmVyOiBodHRwczovL2dpbmFuZGp1aWNlLnNob3AvY2F0YWxvZw0KVXBncmFkZS1JbnNlY3VyZS1SZXF1ZXN0czogMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2DQoNCg==","request_hash":"462d6d9789d457528cfe71bda5167e43e680639538e61a99e659f051f49f1bee","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"content-encoding":["gzip"],"content-length":["2465"],"content-type":["text/html; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:33:49 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/html; charset=utf-8","response_content_length":10437,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LXR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOA0KZGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMzo0OSBHTVQNCngtYmFja2VuZDogYzk4ZGY1YzQtYTUyNy00ZGFhLTg4Y2QtODNjNWRlNGU3Yzc3DQp4LWZyYW1lLW9wdGlvbnM6IFNBTUVPUklHSU4NCmNvbnRlbnQtZW5jb2Rpbmc6IGd6aXANCmNvbnRlbnQtbGVuZ3RoOiAyNDY1DQoNCjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KPCEtLUxBQl9IRUFEX1NUQVJULS0+CiAgICA8aGVhZD4KICAgICAgICA8bGluayBocmVmPS9yZXNvdXJjZXMvbGFiaGVhZGVyL2Nzcy9zY2FuTWVIZWFkZXIuY3NzIHJlbD1zdHlsZXNoZWV0PgogICAgICAgIDxsaW5rIGhyZWY9L3Jlc291cmNlcy9jc3MvbGFic0Vjb21tZXJjZS5jc3MgcmVsPXN0eWxlc2hlZXQ+CiAgICAgICAgPGxpbmsgaHJlZj0vcmVzb3VyY2VzL2Nzcy9sYWJzU2Nhbm1lLmNzcyByZWw9c3R5bGVzaGVldD4KICAgICAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCB1c2VyLXNjYWxhYmxlPW5vIj4KICAgICAgICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy9qcy9yZWFjdC5kZXZlbG9wbWVudC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvanMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIj48L3NjcmlwdD4KICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvcmVzb3VyY2VzL2pzL2FuZ3VsYXJfMS03LTcuanMiPjwvc2NyaXB0PgogICAgICAgIDx0aXRsZT5Qcm9kdWN0cyAtIEdpbiAmYW1wOyBKdWljZSBTaG9wPC90aXRsZT4KICAgIDwvaGVhZD4KPCEtLUxBQl9IRUFEX0VORC0tPgogICAgPGJvZHkgbmctYXBwPgogICAgICAgIDxkaXYgaWQ9InNjYW5NZUhlYWRlciI+CiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJoZWFkZXItZGVzY3JpcHRpb24iPgogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIGRlbGliZXJhdGVseSB2dWxuZXJhYmxlIHdlYiBhcHBsaWNhdGlvbiBkZXNpZ25lZCBmb3IgdGVzdGluZyB3ZWImbmJzcDt2dWxuZXJhYmlsaXR5Jm5ic3A7c2Nhbm5lcnMuCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpbmsiIG9ubW91c2VlbnRlcj0id2luZG93Ll9feDEgPSAxIiBvbm1vdXNlb3Zlcj0id2luZG93Ll9feDIgPSAxIiBvbm1vdXNlbW92ZT0id2luZG93Ll9feDMgPSAxIiAgb25tb3VzZWRvd249IndpbmRvdy5fX3g0ID0gMSIgb25tb3VzZXVwPSJpZiAod2luZG93Ll9feDEgJiYgd2luZG93Ll9feDIgJiYgd2luZG93Ll9feDMgJiYgd2luZG93Ll9feDQpIGxvY2F0aW9uID0gYXRvYignTDNaMWJHNWxjbUZpYVd4cGRHbGxjdz09JykiIG9ubW91c2VsZWF2ZT0iZGVsZXRlIHdpbmRvdy5fX3gxOyBkZWxldGUgd2luZG93Ll9feDI7IGRlbGV0ZSB3aW5kb3cuX194MzsgZGVsZXRlIHdpbmRvdy5fX3g0Ij5QdXQgeW91ciBzY2FubmVyIHRvIHRoZSB0ZXN0ITwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0nc2Nhbk1lQmFubmVyJz4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Y29udGFpbmVyPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy8nPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXNjYW5tZS1sb2dvPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXRpdGxlLWNvbnRhaW5lcj4KICAgICAgICAgICAgICAgICAgICAgICAgPG5hdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3MgcHJpbWFyeS1saW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNlbGVjdGVkIiBocmVmPSIvY2F0YWxvZyI+UHJvZHVjdHM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9ibG9nIj5CbG9nPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvYWJvdXQiPk91ciBzdG9yeTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3Mgc2Vjb25kYXJ5LWxpbmtzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJhY2NvdW50LWljb24iIGhyZWY9Ii9teS1hY2NvdW50Ij48c3ZnPjx1c2UgaHJlZj0iL3Jlc291cmNlcy9pbWFnZXMvaWNvbi1hY2NvdW50LnN2ZyNhY2NvdW50LWljb24iPjwvdXNlPjwvc3ZnPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9teS1hY2NvdW50Ij5Mb2cgaW48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9teS1hY2NvdW50Ij5NeSBhY2NvdW50PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImNhcnQtaWNvbiIgaHJlZj0iL2NhdGFsb2cvY2FydCI+PHNwYW4+MDwvc3Bhbj48c3ZnPjx1c2UgaHJlZj0iL3Jlc291cmNlcy9pbWFnZXMvaWNvbi1jYXJ0LnN2ZyNjYXJ0LWljb24iPjwvdXNlPjwvc3ZnPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXRvZ2dsZSI+PGEgY2xhc3M9Im5hdi10cmlnZ2VyIj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmF2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHRoZW1lPSJlY29tbWVyY2UiPgogICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0ibWFpbmNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIgaXMtcGFnZSI+CiAgICAgICAgICAgICAgICAgICAgPGhlYWRlciBjbGFzcz0ibm90aWZpY2F0aW9uLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPC9oZWFkZXI+CiAgICAgICAgICAgICAgICAgICAgPGgxPlByb2R1Y3RzPC9oMT4KICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1zZWFyY2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iL2NhdGFsb2ciIG1ldGhvZD1HRVQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT10ZXh0IGlkPSJzZWFyY2hCYXIiIHBsYWNlaG9sZGVyPSJTZWFyY2ggcHJvZHVjdHMiIG5hbWU9InNlYXJjaFRlcm0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoVGV4dCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hCYXInKS52YWx1ZSA9IHNlYXJjaFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBoaWRkZW4gdHlwZT10ZXh0IG5hbWU9ImNhdGVnb3J5IiB2YWx1ZT0iQWNjZXNzb3JpZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPXN1Ym1pdCBjbGFzcz1idXR0b24+U2VhcmNoPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24gaWQ9InJlYWN0LWNvbnRhaW5lciIgY2xhc3M9InNlYXJjaC1maWx0ZXJzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlJlZmluZSB5b3VyIHNlYXJjaDo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgPgogICAgY29uc3QgZWxlbWVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQ7CiAgICBjb25zdCBjYXRlZ29yaWVzID0geyJBbGwiOiIvY2F0YWxvZyIsIkFjY2Vzc29yaWVzIjoiL2NhdGFsb2c/Y2F0ZWdvcnk9QWNjZXNzb3JpZXMiLCJBY2NvbXBhbmltZW50cyI6Ii9jYXRhbG9nP2NhdGVnb3J5PUFjY29tcGFuaW1lbnRzIiwiQm9va3MiOiIvY2F0YWxvZz9jYXRlZ29yeT1Cb29rcyIsIkdpbiI6Ii9jYXRhbG9nP2NhdGVnb3J5PUdpbiIsIkp1aWNlIjoiL2NhdGFsb2c/Y2F0ZWdvcnk9SnVpY2UifTsKICAgIGNvbnN0IHNlbGVjdGVkQ2F0ZWdvcnkgPSAiQWNjZXNzb3JpZXMiOwogICAgY29uc3Qgcm9vdCA9IFJlYWN0RE9NLmNyZWF0ZVJvb3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlYWN0LWNvbnRhaW5lcicpKTsKCiAgICBjb25zdCBjYXRlZ29yeVNlbGVjdGVkID0gKG5hbWUsIHNlbGVjdGVkKSA9PiAhIXNlbGVjdGVkID8gbmFtZSA9PT0gc2VsZWN0ZWQgOiBuYW1lID09PSAiQWxsIjsKCiAgICBjb25zdCBjYXRlZ29yeUxpc3QgPSBPYmplY3QuZW50cmllcyhjYXRlZ29yaWVzKS5tYXAoKGNhdGVnb3J5LCBpKSA9PiB7CiAgICAgICAgY29uc3QgbmFtZSA9IGNhdGVnb3J5WzBdOwogICAgICAgIGNvbnN0IGhyZWYgPSBjYXRlZ29yeVsxXTsKICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNhdGVnb3J5U2VsZWN0ZWQobmFtZSwgc2VsZWN0ZWRDYXRlZ29yeSk7CiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gc2VsZWN0ZWQgPyAnZmlsdGVyLWNhdGVnb3J5IHNlbGVjdGVkJyA6ICdmaWx0ZXItY2F0ZWdvcnknOwogICAgICAgIHJldHVybiBlbGVtZW50KCdhJywgeyBrZXk6IGksIGNsYXNzTmFtZSwgaHJlZiB9LCBuYW1lKTsKICAgIH0pOwoKICAgIGNvbnN0IGZpbHRlckJhciA9IGVsZW1lbnQoJ2RpdicsIG51bGwsIGNhdGVnb3J5TGlzdCk7CiAgICByb290LnJlbmRlcihmaWx0ZXJCYXIpOwoKPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJjb250YWluZXItbGlzdC10aWxlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9jYXRhbG9nL3Byb2R1Y3Q/cHJvZHVjdElkPTUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9pbWFnZS9zY2FubWUvcHJvZHVjdGNhdGFsb2cvcHJvZHVjdHMvOC5wbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkZsYW1pbuKAmSBDb2NrdGFpbCBHbGFzc2VzPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltYWdlcy9yYXRpbmcxLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpY2UiPiQ2OS44MTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPlZpZXcgZGV0YWlsczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvY2F0YWxvZy9wcm9kdWN0P3Byb2R1Y3RJZD05Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2Uvc2Nhbm1lL3Byb2R1Y3RjYXRhbG9nL3Byb2R1Y3RzLzcucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5MaW1pdGVkIEVkaXRpb24gQ29ja3RhaWwgU2hha2VyPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltYWdlcy9yYXRpbmcyLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpY2UiPiQxMC41Mjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPlZpZXcgZGV0YWlsczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvY2F0YWxvZy9wcm9kdWN0P3Byb2R1Y3RJZD0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9wcm9kdWN0Y2F0YWxvZy9wcm9kdWN0cy85LnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+RnJ1aXQgQ3VybGl3dXJsaWVyPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltYWdlcy9yYXRpbmcxLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpY2UiPiQyMC44Njwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPlZpZXcgZGV0YWlsczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPWlzLWxpbmtiYWNrPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvY2F0YWxvZyc+Q29udGludWUgc2hvcHBpbmc8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItd3JhcHBlciI+CiAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItbGVmdCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5OZXZlciBtaXNzIGEgZGVhbCAtIHN1YnNjcmliZSBub3c8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5Kb2luIG91ciB3b3JsZHdpZGUgY29tbXVuaXR5IG9mIGdpbiBhbmQganVpY2UgZmFuYXRpY3MsIGZvciBleGNsdXNpdmUgbmV3cyBvbiBvdXIgbGF0ZXN0IGRlYWxzLCBuZXcgcmVsZWFzZXMsIGNvbGxhYm9yYXRpb25zLCBhbmQgbW9yZS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPScvcmVzb3VyY2VzL2pzL3N1YnNjcmliZU5vdy5qcyc+PC9zY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InN1YnNjcmliZSIgY2xhc3M9ImZvcm0iIGRhdGEtbWV0aG9kPSJwb3N0IiBkYXRhLWFjdGlvbj0iL2NhdGFsb2cvc3Vic2NyaWJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWVtYWlsIG5hbWU9ZW1haWwgcGxhY2Vob2xkZXI9IkVtYWlsIGFkZHJlc3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9ImhpZGRlbiIgbmFtZT0iY3NyZiIgdmFsdWU9IlFXNWx0T2ZBU1dXQXZCNGwxZzhjYUs1OVJ1R01hTUh4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ1dHRvbiIgdHlwZT1zdWJtaXQ+U3Vic2NyaWJlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGlhbG9nIGlkPSJjb3Vwb24tZGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdXBvbi13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjbG9zZS1idXR0b24iIG9uY2xpY2s9ImNsb3NlQ291cG9uRGlhbG9nKGV2ZW50KSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY291cG9uLWluZm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDE+MjAlIG9mZiBldmVyeXRoaW5nPC9oMT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY291cG9uLWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBpZD0iY29weWFibGUtY291cG9uIj5Db3Vwb24gbm90IGZvdW5kPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImNvcHktY291cG9uLWJ1dHRvbiIgY2xhc3M9ImNvcHktYnV0dG9uIiBvbmNsaWNrPSJjb3B5Q291cG9uKGV2ZW50KSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjb3Vwb24tY29waWVkLXRpY2siIGNsYXNzPSJjb3Vwb24tY29waWVkLXRpY2sgaGlkZGVuIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFwcGx5IHRoaXMgY291cG9uIHRvIHlvdXIgU2hvcHBpbmcgQ2FydCBiZWZvcmUgcGxhY2luZyB5b3VyIG9yZGVyLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2RpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWNvcHlyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwb3J0c3dpZ2dlci1sb2dvIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+wqkgMjAyMyBQb3J0U3dpZ2dlciBMdGQuPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1yaWdodCI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iZm9vdGVyLWxvd2VyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXJOYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic29jaWFsTGlua3MiPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPG5hdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3MgcHJpbWFyeS1saW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNlbGVjdGVkIiBocmVmPSIvY2F0YWxvZyI+UHJvZHVjdHM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9ibG9nIj5CbG9nPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvYWJvdXQiPk91ciBzdG9yeTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9uYXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxzY3JpcHQgc3JjPScvcmVzb3VyY2VzL2Zvb3Rlci9qcy9zY2FubWUuanMnPjwvc2NyaXB0PgogICAgPC9ib2R5Pgo8L2h0bWw+Cg==","response_hash":"9699010546b4c563815ec276e81891fd69c5516f7ea8d3e19768bdf6beaa109e","response_time_ms":0,"response_words":515,"has_response":true,"response_title":"Products - Gin & Juice Shop","parameters":[{"name":"category","value":"Accessories","type":"url","name_start":13,"name_end":21,"value_start":22,"value_end":33},{"name":"1","value":"catalog","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12}],"sent_at":"2026-04-05T05:33:49.235651Z","received_at":"2026-04-05T05:33:49.235648Z","created_at":"2026-04-05T05:33:49Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"ce612394-6bb6-4ebd-8bd2-907244aeafd3","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"POST","path":"/catalog/cart","url":"https://ginandjuice.shop/catalog/cart","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Content-Type":["application/x-www-form-urlencoded"],"Host":["ginandjuice.shop"],"Origin":["https://ginandjuice.shop"],"Referer":["https://ginandjuice.shop/catalog/product?productId=11"],"Upgrade-Insecure-Requests":["1"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_type":"application/x-www-form-urlencoded","request_content_length":32,"raw_request":"UE9TVCAvY2F0YWxvZy9jYXJ0IEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpVcGdyYWRlLUluc2VjdXJlLVJlcXVlc3RzOiAxDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE0LjAuMC4wIFNhZmFyaS81MzcuMzYNCkFjY2VwdC1MYW5ndWFnZTogZW4NCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkDQpPcmlnaW46IGh0dHBzOi8vZ2luYW5kanVpY2Uuc2hvcA0KUmVmZXJlcjogaHR0cHM6Ly9naW5hbmRqdWljZS5zaG9wL2NhdGFsb2cvcHJvZHVjdD9wcm9kdWN0SWQ9MTENCg0KcHJvZHVjdElkPTExJnJlZGlyPWEmcXVhbnRpdHk9MTE=","request_hash":"e695ecce4d15d68b9a703b23741103532029d5ed4b11613dc929043627376e57","status_code":400,"response_http_version":"HTTP/1.1","response_headers":{"content-encoding":["gzip"],"content-length":["42"],"content-type":["application/json; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:33:42 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/json; charset=utf-8","response_content_length":24,"raw_response":"SFRUUC8xLjEgNDAwIEJhZCBSZXF1ZXN0DQpjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzM6NDIgR01UDQp4LWJhY2tlbmQ6IGM5OGRmNWM0LWE1MjctNGRhYS04OGNkLTgzYzVkZTRlN2M3Nw0KeC1mcmFtZS1vcHRpb25zOiBTQU1FT1JJR0lODQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LWxlbmd0aDogNDINCg0KIkludmFsaWQgcmVkaXJlY3QgdmFsdWUi","response_hash":"e54abaf45105810522c07bdb7142a410e5091677728a0857f581a44323534c4a","response_time_ms":0,"response_words":21,"has_response":true,"parameters":[{"name":"1","value":"catalog","type":"path","name_start":-1,"name_end":-1,"value_start":6,"value_end":13},{"name":"2","value":"cart","type":"path","name_start":-1,"name_end":-1,"value_start":14,"value_end":18},{"name":"productId","value":"11","type":"body","name_start":384,"name_end":393,"value_start":394,"value_end":396},{"name":"redir","value":"a","type":"body","name_start":397,"name_end":402,"value_start":403,"value_end":404},{"name":"quantity","value":"11","type":"body","name_start":405,"name_end":413,"value_start":414,"value_end":416}],"sent_at":"2026-04-05T05:33:42.30992Z","received_at":"2026-04-05T05:33:42.30991Z","created_at":"2026-04-05T05:33:42Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"34e3c5ee-775c-40ea-81eb-ecc0669abcdb","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/about","url":"https://ginandjuice.shop/about","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/catalog/cart"],"Upgrade-Insecure-Requests":["1"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9hYm91dCBIVFRQLzEuMQ0KSG9zdDogZ2luYW5kanVpY2Uuc2hvcA0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KUmVmZXJlcjogaHR0cHM6Ly9naW5hbmRqdWljZS5zaG9wL2NhdGFsb2cvY2FydA0KVXBncmFkZS1JbnNlY3VyZS1SZXF1ZXN0czogMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2DQoNCg==","request_hash":"a66cfc9b5aeb6bacf3c944a52f1b6a81b035a74c9977f0b7b66ddb986eb04495","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"content-encoding":["gzip"],"content-length":["2618"],"content-type":["text/html; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:32:42 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/html; charset=utf-8","response_content_length":11208,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpkYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjQyIEdNVA0KeC1iYWNrZW5kOiBjOThkZjVjNC1hNTI3LTRkYWEtODhjZC04M2M1ZGU0ZTdjNzcNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY29udGVudC1lbmNvZGluZzogZ3ppcA0KY29udGVudC1sZW5ndGg6IDI2MTgNCmNvbnRlbnQtdHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04DQoNCjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KPCEtLUxBQl9IRUFEX1NUQVJULS0+CiAgICA8aGVhZD4KICAgICAgICA8bGluayBocmVmPS9yZXNvdXJjZXMvbGFiaGVhZGVyL2Nzcy9zY2FuTWVIZWFkZXIuY3NzIHJlbD1zdHlsZXNoZWV0PgogICAgICAgIDxsaW5rIGhyZWY9L3Jlc291cmNlcy9jc3MvbGFic1NjYW5tZS5jc3MgcmVsPXN0eWxlc2hlZXQ+CiAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyI+CiAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvanMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiPjwvc2NyaXB0PgogICAgICAgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3Jlc291cmNlcy9qcy9hbmd1bGFyXzEtNy03LmpzIj48L3NjcmlwdD4KICAgICAgICA8dGl0bGU+T3VyIHN0b3J5IC0gR2luICZhbXA7IEp1aWNlIFNob3A8L3RpdGxlPgogICAgPC9oZWFkPgo8IS0tTEFCX0hFQURfRU5ELS0+CiAgICA8Ym9keSBuZy1hcHA+CiAgICAgICAgPGRpdiBpZD0ic2Nhbk1lSGVhZGVyIj4KICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImhlYWRlci1kZXNjcmlwdGlvbiI+CiAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgZGVsaWJlcmF0ZWx5IHZ1bG5lcmFibGUgd2ViIGFwcGxpY2F0aW9uIGRlc2lnbmVkIGZvciB0ZXN0aW5nIHdlYiZuYnNwO3Z1bG5lcmFiaWxpdHkmbmJzcDtzY2FubmVycy4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGluayIgb25tb3VzZWVudGVyPSJ3aW5kb3cuX194MSA9IDEiIG9ubW91c2VvdmVyPSJ3aW5kb3cuX194MiA9IDEiIG9ubW91c2Vtb3ZlPSJ3aW5kb3cuX194MyA9IDEiICBvbm1vdXNlZG93bj0id2luZG93Ll9feDQgPSAxIiBvbm1vdXNldXA9ImlmICh3aW5kb3cuX194MSAmJiB3aW5kb3cuX194MiAmJiB3aW5kb3cuX194MyAmJiB3aW5kb3cuX194NCkgbG9jYXRpb24gPSBhdG9iKCdMM1oxYkc1bGNtRmlhV3hwZEdsbGN3PT0nKSIgb25tb3VzZWxlYXZlPSJkZWxldGUgd2luZG93Ll9feDE7IGRlbGV0ZSB3aW5kb3cuX194MjsgZGVsZXRlIHdpbmRvdy5fX3gzOyBkZWxldGUgd2luZG93Ll9feDQiPlB1dCB5b3VyIHNjYW5uZXIgdG8gdGhlIHRlc3QhPC9zcGFuPgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSdzY2FuTWVCYW5uZXInPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1jb250YWluZXI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0nLyc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9c2Nhbm1lLWxvZ28+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9dGl0bGUtY29udGFpbmVyPgogICAgICAgICAgICAgICAgICAgICAgICA8bmF2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBwcmltYXJ5LWxpbmtzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9jYXRhbG9nIj5Qcm9kdWN0czwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2Jsb2ciPkJsb2c8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2VsZWN0ZWQiIGhyZWY9Ii9hYm91dCI+T3VyIHN0b3J5PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBzZWNvbmRhcnktbGlua3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImFjY291bnQtaWNvbiIgaHJlZj0iL215LWFjY291bnQiPjxzdmc+PHVzZSBocmVmPSIvcmVzb3VyY2VzL2ltYWdlcy9pY29uLWFjY291bnQuc3ZnI2FjY291bnQtaWNvbiI+PC91c2U+PC9zdmc+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL215LWFjY291bnQiPkxvZyBpbjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL215LWFjY291bnQiPk15IGFjY291bnQ8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iY2FydC1pY29uIiBocmVmPSIvY2F0YWxvZy9jYXJ0Ij48c3Bhbj4wPC9zcGFuPjxzdmc+PHVzZSBocmVmPSIvcmVzb3VyY2VzL2ltYWdlcy9pY29uLWNhcnQuc3ZnI2NhcnQtaWNvbiI+PC91c2U+PC9zdmc+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJuYXYtdG9nZ2xlIj48YSBjbGFzcz0ibmF2LXRyaWdnZXIiPjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9uYXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgdGhlbWU9ImFib3V0Ij4KICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9Im1haW5jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGlzLXBhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxoZWFkZXIgY2xhc3M9Im5vdGlmaWNhdGlvbi1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDwvaGVhZGVyPgogICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJ0aXRsZUJhbm5lciI+CiAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJvdXJTdG9yeSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImFib3V0VGl0bGUiIGNsYXNzPSJhYm91dC10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDE+T1VSIFNUT1JZPC9oMT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJhYm91dENvbnRlbnQiIGNsYXNzPSJhYm91dC1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFib3V0LXZpZGVvLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFib3V0LXZpZGVvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpZGVvIGNvbnRyb2xzIG11dGVkIHBvc3Rlcj0iL3Jlc291cmNlcy9pbWFnZXMvZ2luLWFuZC1qdWljZS10ZWFtLmpwZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIHNyYz0iL3Jlc291cmNlcy9pbWFnZXMvZ2luLWFuZC1qdWljZS10ZWFtLm1wNCIgdHlwZT0idmlkZW8vbXA0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB2aWRlbyB0YWcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmlkZW8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWJvdXQtaW1hZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL3Jlc291cmNlcy9pbWFnZXMvZ2luLWFuZC1qdWljZS1kaXN0aWxsZXJ5LmpwZyIgYWx0PSJHaW4gZGlzdGlsbGVyeSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJhYm91dERlc2NyaXB0aW9uIiBjbGFzcz0iYWJvdXQtZGVzY3JpcHRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImFib3V0VGV4dDEiIGNsYXNzPSJhYm91dC10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPlRoZSBwdXJwbGUgbWVuYWNlPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Q2FybG9zIE1vbnRveWEuIEEgbWFuIG9mIG1hbnkgbmFtZXM6ICZxdW90O3RoZSBwdXJwbGUgbWVuYWNlJnF1b3Q7LCAmcXVvdDt0aGUgZXZpbCBnZW5pdXMgb2YgZ2luJnF1b3Q7IC0gYW5kIGZvciB0aGF0IG1hdHRlciwgJnF1b3Q7dGhlIGVwaXRvbWUgb2YgcHVyZSBldmls4oSiJnF1b3Q7LiBDYXJsb3MgZm91bmRlZCBHaW4gJiBKdWljZSBTaG9wIGluIDIwMjIgYmVjYXVzZSBoZSBjb3VsZG4ndCBmaW5kIGEgZGVjZW50IHZ1bG5lcmFibGUgd2ViIGFwcCB0byB0ZXN0IGEgc2Nhbm5lciBvbiAtIHBlcmhhcHMgd2l0aG91dCByZWFsaXppbmcgYXQgdGhhdCBtb21lbnQgdGhhdCBoaXN0b3J5IHdhcyBpbiBoaXMgaGFuZHMuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFib3V0LXZpZGVvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpZGVvIGNvbnRyb2xzIG11dGVkIHBvc3Rlcj0iL3Jlc291cmNlcy9pbWFnZXMvZ2luLWFuZC1qdWljZS10ZWFtLmpwZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlIHNyYz0iL3Jlc291cmNlcy9pbWFnZXMvZ2luLWFuZC1qdWljZS10ZWFtLm1wNCIgdHlwZT0idmlkZW8vbXA0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB2aWRlbyB0YWcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdmlkZW8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iYWJvdXRUZXh0MiIgY2xhc3M9ImFib3V0LXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+SG93IHRvIHRlc3QgYSBzY2FubmVyPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+Tm93YWRheXMsIEdpbiAmIEp1aWNlIFNob3AgaXMgdGhlIGJvbGRlc3QsIGJhZGRlc3QgdnVsbmVyYWJsZSB3ZWIgYXBwbGljYXRpb24gb24gdGhlIG5ldCAtIGNvbnRhaW5pbmcgYSA8c3BhbiBjbGFzcz0ibGluayIgb25tb3VzZWVudGVyPSJ3aW5kb3cuX194MSA9IDEiIG9ubW91c2VvdmVyPSJ3aW5kb3cuX194MiA9IDEiIG9ubW91c2Vtb3ZlPSJ3aW5kb3cuX194MyA9IDEiICBvbm1vdXNlZG93bj0id2luZG93Ll9feDQgPSAxIiBvbm1vdXNldXA9ImlmICh3aW5kb3cuX194MSAmJiB3aW5kb3cuX194MiAmJiB3aW5kb3cuX194MyAmJiB3aW5kb3cuX194NCkgbG9jYXRpb24gPSBhdG9iKCdMM1oxYkc1bGNtRmlhV3hwZEdsbGN3PT0nKSIgb25tb3VzZWxlYXZlPSJkZWxldGUgd2luZG93Ll9feDE7IGRlbGV0ZSB3aW5kb3cuX194MjsgZGVsZXRlIHdpbmRvdy5fX3gzOyBkZWxldGUgd2luZG93Ll9feDQiPnJhbmdlIG9mIHJlYWxpc3RpYyB2dWxuZXJhYmlsaXRpZXM8L3NwYW4+IHRoYXQgd2lsbCBoZWxwIHlvdSB0byA8YSBocmVmPSJodHRwczovL3BvcnRzd2lnZ2VyLm5ldC9idXJwL2VudGVycHJpc2UvcmVzb3VyY2VzL2hvdy10by1ldmFsdWF0ZS1hLXdlYi12dWxuZXJhYmlsaXR5LXNjYW5uZXIiPnB1dCBhbnkgd2ViIHZ1bG5lcmFiaWxpdHkgc2Nhbm5lciB0byB0aGUgdGVzdDwvYT4uIEJ1dCBpdCdzIG1vcmUgdGhhbiB0aGF0LiBUbyB1cywgR2luICYgSnVpY2UgU2hvcCBpcyBmYW1pbHkuIEl0J3MgbGlmZS4gSXQncyBsb3ZlLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJhYm91dFRleHQzIiBjbGFzcz0iYWJvdXQtdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5UaGUgZnV0dXJlPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+RnJvbSBodW1ibGUgYmVnaW5uaW5ncyBpbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9wb3J0c3dpZ2dlci5uZXQvd2ViLXNlY3VyaXR5Ij5XZWIgU2VjdXJpdHkgQWNhZGVteTwvYT4sIENhcmxvcyBoYXMgYnJvdWdodCB5b3UgYSByYW5nZSBvZiBnaW5zIHRoYXQgaGF2ZSByb2NrZWQgdGhlIHdvcmxkLiBCdXQgaGUncyBub3QgZ29pbmcgdG8gc3RvcCB0aGVyZS4gT2ggbm8uIFlvdSdyZSBnb2luZyB0byBzZWUgbW9yZSBmcm9tIENhcmxvcyAtIGEgbWFuIHdobyBkb2Vzbid0IHJlc3Qgb24gaGlzIGxhdXJlbHMuIEtlZXAgYW4gZXllIG91dCBmb3IgbmV3IGdpbnMgZnJvbSBoaXMgZXhwZXJpbWVudGFsIGtpdGNoZW4gLSBhbmQgb2YgY291cnNlIG5ldyB2dWxuZXJhYmlsaXRpZXMgZnJvbSA8YSBocmVmPSJodHRwczovL3BvcnRzd2lnZ2VyLm5ldC9yZXNlYXJjaCI+UG9ydFN3aWdnZXIgUmVzZWFyY2g8L2E+LiBXZSdsbCBhbHNvIGtlZXAgZGV2ZWxvcGluZyB0aGUgYXBwIGl0c2VsZiAtIHRvIGVuc3VyZSB0aGF0IGl0IHJlcHJlc2VudHMgYSByZWFsaXN0aWMgY2hhbGxlbmdlIGZvciBzY2FubmVycy48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWJvdXQtaW1hZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL3Jlc291cmNlcy9pbWFnZXMvZ2luLWFuZC1qdWljZS1kaXN0aWxsZXJ5LmpwZyIgYWx0PSJHaW4gZGlzdGlsbGVyeSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItd3JhcHBlciI+CiAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItbGVmdCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5OZXZlciBtaXNzIGEgZGVhbCAtIHN1YnNjcmliZSBub3c8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5Kb2luIG91ciB3b3JsZHdpZGUgY29tbXVuaXR5IG9mIGdpbiBhbmQganVpY2UgZmFuYXRpY3MsIGZvciBleGNsdXNpdmUgbmV3cyBvbiBvdXIgbGF0ZXN0IGRlYWxzLCBuZXcgcmVsZWFzZXMsIGNvbGxhYm9yYXRpb25zLCBhbmQgbW9yZS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPScvcmVzb3VyY2VzL2pzL3N1YnNjcmliZU5vdy5qcyc+PC9zY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InN1YnNjcmliZSIgY2xhc3M9ImZvcm0iIGRhdGEtbWV0aG9kPSJwb3N0IiBkYXRhLWFjdGlvbj0iL2NhdGFsb2cvc3Vic2NyaWJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWVtYWlsIG5hbWU9ZW1haWwgcGxhY2Vob2xkZXI9IkVtYWlsIGFkZHJlc3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9ImhpZGRlbiIgbmFtZT0iY3NyZiIgdmFsdWU9IjJpREZjTHdOa29nY0tvMnN6VHdvWlYxOXZnTVhLYjdTIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ1dHRvbiIgdHlwZT1zdWJtaXQ+U3Vic2NyaWJlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGlhbG9nIGlkPSJjb3Vwb24tZGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdXBvbi13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjbG9zZS1idXR0b24iIG9uY2xpY2s9ImNsb3NlQ291cG9uRGlhbG9nKGV2ZW50KSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY291cG9uLWluZm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDE+MjAlIG9mZiBldmVyeXRoaW5nPC9oMT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY291cG9uLWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBpZD0iY29weWFibGUtY291cG9uIj5Db3Vwb24gbm90IGZvdW5kPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImNvcHktY291cG9uLWJ1dHRvbiIgY2xhc3M9ImNvcHktYnV0dG9uIiBvbmNsaWNrPSJjb3B5Q291cG9uKGV2ZW50KSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjb3Vwb24tY29waWVkLXRpY2siIGNsYXNzPSJjb3Vwb24tY29waWVkLXRpY2sgaGlkZGVuIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFwcGx5IHRoaXMgY291cG9uIHRvIHlvdXIgU2hvcHBpbmcgQ2FydCBiZWZvcmUgcGxhY2luZyB5b3VyIG9yZGVyLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2RpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWNvcHlyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwb3J0c3dpZ2dlci1sb2dvIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+wqkgMjAyMyBQb3J0U3dpZ2dlciBMdGQuPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1yaWdodCI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iZm9vdGVyLWxvd2VyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXJOYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic29jaWFsTGlua3MiPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPG5hdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3MgcHJpbWFyeS1saW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvY2F0YWxvZyI+UHJvZHVjdHM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9ibG9nIj5CbG9nPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNlbGVjdGVkIiBocmVmPSIvYWJvdXQiPk91ciBzdG9yeTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9uYXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxzY3JpcHQgc3JjPScvcmVzb3VyY2VzL2Zvb3Rlci9qcy9zY2FubWUuanMnPjwvc2NyaXB0PgogICAgPC9ib2R5Pgo8L2h0bWw+Cg==","response_hash":"0f294572704a63082ca890169c428e223058b8e1764dcb88c1571caaca4a9e4d","response_time_ms":0,"response_words":668,"has_response":true,"response_title":"Our story - Gin & Juice Shop","parameters":[{"name":"1","value":"about","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":10}],"sent_at":"2026-04-05T05:32:42.867895Z","received_at":"2026-04-05T05:32:42.867892Z","created_at":"2026-04-05T05:32:42Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"71598b05-49f8-48db-95ee-720bf767eaff","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/images/shopping-cart.svg","url":"https://ginandjuice.shop/resources/images/shopping-cart.svg","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/resources/css/labsScanme.css"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvaW1hZ2VzL3Nob3BwaW5nLWNhcnQuc3ZnIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE0LjAuMC4wIFNhZmFyaS81MzcuMzYNCkFjY2VwdC1MYW5ndWFnZTogZW4NClJlZmVyZXI6IGh0dHBzOi8vZ2luYW5kanVpY2Uuc2hvcC9yZXNvdXJjZXMvY3NzL2xhYnNTY2FubWUuY3NzDQoNCg==","request_hash":"79cef93ba0d9715cfc5f5594f61e89b752bdfe2044e1f4308199a76ff49c1a36","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["520"],"content-type":["image/svg+xml"],"date":["Sun, 05 Apr 2026 05:32:25 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"image/svg+xml","response_content_length":1458,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LXR5cGU6IGltYWdlL3N2Zyt4bWwNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY2FjaGUtY29udHJvbDogcHVibGljLCBtYXgtYWdlPTM2MDANCmNvbnRlbnQtbGVuZ3RoOiA1MjANCngtYmFja2VuZDogYzk4ZGY1YzQtYTUyNy00ZGFhLTg4Y2QtODNjNWRlNGU3Yzc3DQpkYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjI1IEdNVA0KDQo8c3ZnIHdpZHRoPSI3NyIgaGVpZ2h0PSI2MiIgdmlld0JveD0iMCAwIDc3IDYyIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgPHBhdGggZD0iTTEgMUgxMC4yNDk2QzExLjY2OTkgMSAxMi44OTU2IDEuOTk2MDEgMTMuMTg2MiAzLjM4NjI5TDIyLjAyNCA0NS42NzUxQzIyLjMxNDYgNDcuMDY1MyAyMy41NDAzIDQ4LjA2MTMgMjQuOTYwNiA0OC4wNjEzSDY2LjU2MTMiIHN0cm9rZT0iIzAwMTM1MCIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgogICAgPHBhdGggZD0iTTIxLjEyMzMgMzkuMjk4M0w2Ny4wNDQgMzUuMjY1M0M2OC4zMTEgMzUuMTU0IDY5LjM3MDIgMzQuMjU1OCA2OS42ODcgMzMuMDIzOUw3NS4wMDA1IDEyLjM2MDRIMTUuMjgxMiIgc3Ryb2tlPSIjMDAxMzUwIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgICA8cGF0aCBkPSJNMjkuMjM0OSA2MC43MTkzQzMxLjU2NTIgNjAuNzE5MyAzMy40NTQyIDU4LjgzMDMgMzMuNDU0MiA1Ni41MDAxQzMzLjQ1NDIgNTQuMTY5OCAzMS41NjUyIDUyLjI4MDggMjkuMjM0OSA1Mi4yODA4QzI2LjkwNDcgNTIuMjgwOCAyNS4wMTU2IDU0LjE2OTggMjUuMDE1NiA1Ni41MDAxQzI1LjAxNTYgNTguODMwMyAyNi45MDQ3IDYwLjcxOTMgMjkuMjM0OSA2MC43MTkzWiIgc3Ryb2tlPSIjMDAxMzUwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgICA8cGF0aCBkPSJNNTYuNTAwNSA2MC43MTkzQzU4LjgzMDggNjAuNzE5MyA2MC43MTk4IDU4LjgzMDMgNjAuNzE5OCA1Ni41MDAxQzYwLjcxOTggNTQuMTY5OCA1OC44MzA4IDUyLjI4MDggNTYuNTAwNSA1Mi4yODA4QzU0LjE3MDMgNTIuMjgwOCA1Mi4yODEyIDU0LjE2OTggNTIuMjgxMiA1Ni41MDAxQzUyLjI4MTIgNTguODMwMyA1NC4xNzAzIDYwLjcxOTMgNTYuNTAwNSA2MC43MTkzWiIgc3Ryb2tlPSIjMDAxMzUwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgICA8cGF0aCBkPSJNMjguOTE0MSAxMy4zMzM1TDMxLjUwODMgMzguNjQ5MyIgc3Ryb2tlPSIjMDAxMzUwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxwYXRoIGQ9Ik00NC40OTIyIDEzLjMzMzVWMzYuNzAxOSIgc3Ryb2tlPSIjMDAxMzUwIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxwYXRoIGQ9Ik02MC4wNzMxIDEzLjMzMzVMNTcuNDc2NiAzNi43MDE5IiBzdHJva2U9IiMwMDEzNTAiIHN0cm9rZS13aWR0aD0iMiIvPgogICAgPHBhdGggZD0iTTcxLjc1MzkgMjUuMDE3NkwxNy4yMjc3IDI1LjAxNzYiIHN0cm9rZT0iIzAwMTM1MCIgc3Ryb2tlLXdpZHRoPSIyIi8+Cjwvc3ZnPgo=","response_hash":"88e16ee194b18471bd401720dd6f6115329b40da0b9b1483ec6c1460dbe1ea56","response_time_ms":0,"response_words":139,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"images","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":21},{"name":"3","value":"shopping-cart.svg","type":"path","name_start":-1,"name_end":-1,"value_start":22,"value_end":39}],"sent_at":"2026-04-05T05:32:25.74988Z","received_at":"2026-04-05T05:32:25.749869Z","created_at":"2026-04-05T05:32:25Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"ff54c171-cd26-40df-8ef6-043c78bac3a5","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/blog/post?postId=4","url":"https://ginandjuice.shop/blog/post?postId=4","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/blog"],"Upgrade-Insecure-Requests":["1"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9ibG9nL3Bvc3Q/cG9zdElkPTQgSFRUUC8xLjENCkhvc3Q6IGdpbmFuZGp1aWNlLnNob3ANClVwZ3JhZGUtSW5zZWN1cmUtUmVxdWVzdHM6IDENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTQuMC4wLjAgU2FmYXJpLzUzNy4zNg0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KUmVmZXJlcjogaHR0cHM6Ly9naW5hbmRqdWljZS5zaG9wL2Jsb2cNCg0K","request_hash":"676512b926cddae225a6c6a2b9f3e975723c7d87260646911dab5921a33fbabf","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"content-encoding":["gzip"],"content-length":["3848"],"content-type":["text/html; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:32:17 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/html; charset=utf-8","response_content_length":12232,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LWxlbmd0aDogMzg0OA0KY29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzI6MTcgR01UDQp4LWJhY2tlbmQ6IGM5OGRmNWM0LWE1MjctNGRhYS04OGNkLTgzYzVkZTRlN2M3Nw0KeC1mcmFtZS1vcHRpb25zOiBTQU1FT1JJR0lODQpjb250ZW50LWVuY29kaW5nOiBnemlwDQoNCjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KPCEtLUxBQl9IRUFEX1NUQVJULS0+CiAgICA8aGVhZD4KICAgICAgICA8bGluayBocmVmPS9yZXNvdXJjZXMvbGFiaGVhZGVyL2Nzcy9zY2FuTWVIZWFkZXIuY3NzIHJlbD1zdHlsZXNoZWV0PgogICAgICAgIDxsaW5rIGhyZWY9L3Jlc291cmNlcy9jc3MvbGFic1NjYW5tZS5jc3MgcmVsPXN0eWxlc2hlZXQ+CiAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyI+CiAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvanMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiPjwvc2NyaXB0PgogICAgICAgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3Jlc291cmNlcy9qcy9hbmd1bGFyXzEtNy03LmpzIj48L3NjcmlwdD4KICAgICAgICA8dGl0bGU+VGhlIENvbXBsYWludCAtIEJsb2cgLSBHaW4gJmFtcDsgSnVpY2UgU2hvcDwvdGl0bGU+CiAgICA8L2hlYWQ+CjwhLS1MQUJfSEVBRF9FTkQtLT4KICAgIDxib2R5IG5nLWFwcD4KICAgICAgICA8ZGl2IGlkPSJzY2FuTWVIZWFkZXIiPgogICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iaGVhZGVyLWRlc2NyaXB0aW9uIj4KICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBkZWxpYmVyYXRlbHkgdnVsbmVyYWJsZSB3ZWIgYXBwbGljYXRpb24gZGVzaWduZWQgZm9yIHRlc3Rpbmcgd2ViJm5ic3A7dnVsbmVyYWJpbGl0eSZuYnNwO3NjYW5uZXJzLgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaW5rIiBvbm1vdXNlZW50ZXI9IndpbmRvdy5fX3gxID0gMSIgb25tb3VzZW92ZXI9IndpbmRvdy5fX3gyID0gMSIgb25tb3VzZW1vdmU9IndpbmRvdy5fX3gzID0gMSIgIG9ubW91c2Vkb3duPSJ3aW5kb3cuX194NCA9IDEiIG9ubW91c2V1cD0iaWYgKHdpbmRvdy5fX3gxICYmIHdpbmRvdy5fX3gyICYmIHdpbmRvdy5fX3gzICYmIHdpbmRvdy5fX3g0KSBsb2NhdGlvbiA9IGF0b2IoJ0wzWjFiRzVsY21GaWFXeHBkR2xsY3c9PScpIiBvbm1vdXNlbGVhdmU9ImRlbGV0ZSB3aW5kb3cuX194MTsgZGVsZXRlIHdpbmRvdy5fX3gyOyBkZWxldGUgd2luZG93Ll9feDM7IGRlbGV0ZSB3aW5kb3cuX194NCI+UHV0IHlvdXIgc2Nhbm5lciB0byB0aGUgdGVzdCE8L3NwYW4+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9J3NjYW5NZUJhbm5lcic+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPWNvbnRhaW5lcj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvJz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1zY2FubWUtbG9nbz48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz10aXRsZS1jb250YWluZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxuYXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdmlnYXRpb24taGVhZGVyLWxpbmtzIHByaW1hcnktbGlua3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2NhdGFsb2ciPlByb2R1Y3RzPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNlbGVjdGVkIiBocmVmPSIvYmxvZyI+QmxvZzwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2Fib3V0Ij5PdXIgc3Rvcnk8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdmlnYXRpb24taGVhZGVyLWxpbmtzIHNlY29uZGFyeS1saW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYWNjb3VudC1pY29uIiBocmVmPSIvbXktYWNjb3VudCI+PHN2Zz48dXNlIGhyZWY9Ii9yZXNvdXJjZXMvaW1hZ2VzL2ljb24tYWNjb3VudC5zdmcjYWNjb3VudC1pY29uIj48L3VzZT48L3N2Zz48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvbXktYWNjb3VudCI+TG9nIGluPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvbXktYWNjb3VudCI+TXkgYWNjb3VudDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJjYXJ0LWljb24iIGhyZWY9Ii9jYXRhbG9nL2NhcnQiPjxzcGFuPjA8L3NwYW4+PHN2Zz48dXNlIGhyZWY9Ii9yZXNvdXJjZXMvaW1hZ2VzL2ljb24tY2FydC5zdmcjY2FydC1pY29uIj48L3VzZT48L3N2Zz48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi10b2dnbGUiPjxhIGNsYXNzPSJuYXYtdHJpZ2dlciI+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICA8L25hdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiB0aGVtZT0iYmxvZy1hcnRpY2xlIj4KICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9Im1haW5jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGlzLXBhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxoZWFkZXIgY2xhc3M9Im5vdGlmaWNhdGlvbi1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDwvaGVhZGVyPgogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iYnJlYWRjcnVtYnMiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLyI+SG9tZTwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iL2Jsb2ciPkJsb2c8L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlRoZSBDb21wbGFpbnQ8L2xpPgogICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmxvZy1wb3N0IHNpbmdsZSI+CiAgICAgICAgICAgICAgICAgICAgPGgxPlRoZSBDb21wbGFpbnQ8L2gxPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjcmVhdGVkLWJ5Ij48c3BhbiBpZD1ibG9nLWF1dGhvcj5DYXJsb3MgTW9udG95YTwvc3Bhbj4gfCA8c3BhbiBpZD1ibG9nLWRhdGU+MDkgTWFyY2ggMjAyNjwvc3Bhbj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9pbWFnZS9zY2FubWUvYmxvZy9wb3N0cy8zLmpwZyI+CiAgICAgICAgICAgICAgICAgICAgPGhyPgogICAgICAgICAgICAgICAgICAgIDxwPk15IG1haW4gbWFuIFBldGVyIFdpZW5lciBjYWxsZWQgYnkgdGhlIG90aGVyIGRheSB3aXRoIHNvbWUgY29mZmVlIGFuZCBjcm9pc3NhbnRzLCBJIGRvbuKAmXQga25vdyB3aG8gaGUgdGhpbmtzIGhlIGlzLCBnb25lIGFsbCBwb3NoIGFuZCB0aGUgbGlrZS4gQW55d2F5cywgd2XigJlyZSBqdXPigJkgaGF2aW7igJkgYSBjaGF0LCBXaWVuZXIgd2FzIGp1c+KAmSBzYXlpbuKAmSBoaXMgZ2lybGZyaWVuZCwgUGVhY2hlcywgaGFkIGdvbmUgYW5kIGpvaW5lZCB0aGUgbW9iIHdpdGggdGhlIGRvZyZhcG9zO3MgcG91bmQgLSBhIHN0cmFuZ2Ugb25lIHRoYXQgZ2lybC4gU28sIHdlIHdhcyBqdXPigJkgY2hld2lu4oCZIHRoZSBmYXQgd2hlbiB0aGlzIHdvbWFuIGNvbWVzIGJ1cnN0aW7igJkgaW50byB0aGUgc3RvcmUuIEkgc2F5cyBsaWtlLCDigJx3aGF04oCZcyB0aGUgaHVycnk/IFRoaXMgYWluJmFwb3M7dCB3aGVyZSB0aGUgZmlyZSBpcy7igJ0gTWUgYW5kIFdpZW5lciB3ZXJlIGhhdmlu4oCZIGEgbGl0dGxlIGxhdWdoIGFib3V0IGl0IHdoZW4gc2hlIHNheXMsIOKAnHRoaXMgaXNu4oCZdCBhIGpva2luZyBtYXR0ZXIsIEnigJl2ZSBjb21lIGFib3V0IHRoZSBmbGF2b3VyaW5ncyBnaWZ0IGJveCBteSBkYXVnaHRlciBib3VnaHQgbWUgZm9yIG15IGJpcnRoZGF5LuKAnSBJIHdhcyBkZWFkIHBsZWFzZWQsIGl04oCZcyBub3Qgb2Z0ZW4gd2UgZ2V0IG11Y2ggZmVlZGJhY2sgb24gb3VyIHNwZWNpYWxzLCBzbyBJIHB1ZmZzIG91dCBteSBjaGVzdCBhbmQgZ2l2ZXMgV2llbmVyIGEga25vd2lu4oCZIGxvb2suIEhl4oCZcyBhbHdheXMgbWFraW5nIGZ1biBvZiBtZSBhbmQgbXkgc3RvcmUsIGFuZCBub3cgaGUgd2FzIGdvaW7igJkgdG8gaGVhciBmaXJzdCBoYW5kIHdoYXQgYSBncmVhdCBzdWNjZXNzIEkgcmVhbGx5IGFtLjwvcD4KICAgICAgICAgICAgICAgICAgICA8cD5JIHNldHRsZXMgbXlzZWxmIGJhY2sgaW4gbXkgY2hhaXIgYW5kIHB1dHMgbXkgZmVldCB1cCBvbiB0aGUgY291bnRlciwgYW5rbGVzIGNyb3NzZWQuIFRoZW4gc2hlIHN0YXJ0cy4gU2hlIHNheXMgZmlyc3Qgb2YgYWxsIGhlciBkYXVnaHRlciBpcyBvbmx5IHRlbiwgYW5kIGV2ZW4gdGhvdWdoIHRoZXJlIHdhc27igJl0IGFueSBib296ZSBpbiB0aGUgZ2lmdCBib3ggc2hlIHNob3VsZG7igJl0IGhhdmUgYmVlbiBhbGxvd2VkIHRvIGJ1eSBpdC4gVGhlbiBzaGUgc2F5cyBpdCB3YXMganVz4oCZIGEgYm94IG9mIHJldHJvIHN3ZWV0cyBhbmQgc2hlIGNvdWxkIGhhdmUgZ290IGl0IGluIHRoZSBwb3VuZCBzaG9wLiBBbmQgYXMgZm9yIHRoZSBwYWNrYWdpbuKAmSwgd2VsbCwgYXQgdGhhdCBwb2ludCBJIHRob3VnaHQgc2hlIHdhcyBnb2luZyB0byBleHBsb2RlIHJpZ2h0IHRoZXJlIGluIGZyb250IG9mIG1lLiBTaGUgZ2V0cyB0aGUgZ2lmdCBib3ggb3V0IG9mIGhlciBiYWcgYW5kIHNsYW1zIGl0IGRvd24gb24gdGhlIGNvdW50ZXIgZGVtYW5kaW5nIGEgcmVmdW5kLiBJIGxvb2tzIGF0IGl0IGFuZCBjb3VsZCBzZWUgdGhhdCBzb21lIG9mIHRoZSBjb250ZW50cyB3ZXJlIG1pc3NpbuKAmS4gV2hlbiBJIHBvaW50ZWQgdGhpcyBvdXQgdG8gdGhlIGFuZ3J5IGxhZHkgc2hlIHNheXMsIOKAnG9mIGNvdXJzZSB0aGVyZSBhcmUsIHlvdSBzb2xkIGEgYm94IG9mIHN3ZWV0cyB0byBhIGtpZCHigJ08L3A+CiAgICAgICAgICAgICAgICAgICAgPHA+UmlnaHQsIHNvIFdpZW5lciB3aG8gaGFkIGJlZW4gcXVpZXQgdGhpcyB3aG9sZSB0aW1lIHdhbGtzIG92ZXIgdG8gdGhlIGNvdW50ZXIgYW5kIGxvb2tzIGF0IHRoZSBnaWZ0IGJveC4gSGUgcG9rZXMgaXQgYWJvdXQgd2l0aCBoaXMgZmluZ2VyIGFuZCBzYXlzLCDigJxtYWRhbSB5b3UgYXJlIGFic29sdXRlbHkgcmlnaHQuIFRoaXMgaXMgbm90aGluZyBtb3JlIHRoYW4gc3dlZXRzIGluIGEgY2VyZWFsIHBhY2tldC7igJ0gV0hBVD8gV2hhdCB3YXMgaGUgdHJ5aW7igJkgdG8gZG8gdG8gbWU/IEFuZCB3aGF0IHdhcyB3aXRoIHRoZSBwb3NoIGFjY2VudD8gQW5kLCBJIHRob3VnaHQgaGUgd2FzIG15IGZyaWVuZCBldmVuIGlmIGhlIGRvZXMgbGlrZSB0byB3aW5kIG1lIHVwLiBUaGVuIGhlIHR1cm5zIGFyb3VuZCBhbmQgZ2l2ZXMgbWUgYSB3aW5rLiBBIHdpbms/IEhlIHR1cm5zIGJhY2sgdG8gdGhlIGxhZHkgYW5kIHNheXMgaGUgYmVsaWV2ZXMgc2hlIGhhcyBldmVyeSByaWdodCB0byBhc2sgZm9yIGEgcmVmdW5kLCBhbmQgdGhhdCB0aGUgcHJvcHJpZXRvciBpcyBub3RoaW5nIGJ1dCBhbiB1bnNjcnVwdWxvdXMgZ29vZCBmb3Igbm90aGlu4oCZIHRyeWlu4oCZIHRvIHJpcCBvZmYgdGhlIGhhcmQtd29ya2luZyBwZW9wbGUgb2Ygb3VyIGRlYXIgY291bnRyeS4gV2VsbCwgSSBhbG1vc3QgZmVsbCBvdmVyLiBJ4oCZZCBuZXZlciBoZWFyZCBoaW0gc2F5IHRoYXQgbWFueSB3b3JkcyBpbiBvbmUgZ28gYmVmb3JlLiBIZSBsb29rcyBhdCBtZSBhbmQgd2lua3MgYWdhaW4uIEkgaGF2ZSB0byBzYXkgdGhvdWdoLCB0byBiZSBmYWlyLCB0aGUgYW5ncnkgbGFkeSBkaWRu4oCZdCBzZWVtIHF1aXRlIHNvIGFuZ3J5IG5vdywgc2hlIGp1c+KAmSBzdG9vZCB3aXRoIGhlciBhcm1zIGZvbGRlZCBsb29raW5nIGF0IG1lIGxpa2Ugc2hlIHdhcyB3YWl0aW7igJkgZm9yIG1lIHRvIHNheSBzb21ldGhpbuKAmS48L3A+CiAgICAgICAgICAgICAgICAgICAgPHA+V2VsbCwgSSBzdG9vZCBtZSBncm91bmQsIGZvbGRlZCBteSBhcm1zIGFuZCBzdGFyZXMgcmlnaHQgYmFjayBhdCBoZXIuIFRoZW1zIGlzIGRhbWFnZWQgZ29vZHMgbm93LCBJIGNhbuKAmXQgc2VsbCB0aGVtIG9uIGFmdGVyIHRoZXnigJlzIGJlZW4gb3BlbmVkLiDigJxJ4oCZbSB3YWl0aW5nLOKAnSBzaGUgc2F5cy4gSSB0ZWxscyBoZXIgc28gYW0gSSwgYW5kIHNoZSBhc2tzIHdoYXQgSeKAmW0gd2FpdGlu4oCZIGZvci4gQXQgdGhpcyBwb2ludCBJIHdhc27igJl0IHN1cmUgaG93IHRvIGFuc3dlciwgYXMgSSBkaWRu4oCZdCBrbm93IHdoYXQgSSB3YXMgd2FpdGlu4oCZIGZvci4gVGhlbiBXaWVuZXIgd2Fsa3Mgb3ZlciB0byB0aGUgdGlsbCBhbmQgdGFrZXMgb3V0IHR3ZW50eSBidWNrcy4gV2hhdD8gQXMgaXQgdHJpZXMgdG8gaGFuZCBpdCBvdmVyIHRoZSB0aGUgYW5ncnkgbGFkeSwgSSBncmFicyBoaW0gYW5kIHdyZXN0bGVzIGhpbSB0byB0aGUgZ3JvdW5kLiBXZSB3YXMgcm9sbGluZyBhYm91dCBvbiB0aGUgZmxvb3IgdHJ5aW7igJkgdG8gZ2V0IHRoZSBiZXR0ZXIgb2YgZWFjaCBvdGhlciB3aGVuIHdlIGhlYXJkIHRoZSBzdG9yZSBiZWxsIHRpbmtsZS4gV2UgYm90aCBsb29rcyB1cCBhbmQgdGhlIGFuZ3J5IGxhZHkgaGFzIGxlZnQgYW5kIHNvIGhhcyB0aGUgdHdlbnR5IGJ1Y2tzLiBTbywgSeKAmW0gZnVtaW7igJkgYXQgV2llbmVyIGFuZCBoZSBqdXPigJkgbGF1Z2hzIGF0IG1lLiBJIGFza3MgaGltIHdoYXQgaGUgaXMgbGF1Z2lu4oCZIGF0IGFuZCBoZSBqdXPigJkgc2F5cyBob3cgbXVjaCBmdW4gdGhhdCB3YXMuIEZVTiE/IEkgZ3JhYnMgaGltIGFuZCBjaHVja3MgaGltIG91dCB0aGUgZnJvbnQgZG9vciBhbmQgdGVsbHMgaGltIG5vdCB0byBjb21lIGJhY2sgdW50aWwgaGXigJlzIGdvdCB0aGF0IHR3ZW50eSB0byBnaXZlIGJhY2sgdG8gbWUuIFlhIGtub3cgd2hhdCBoZSBzYXlzIHRoZW4/IEhlIHRlbGxzIG1lIGhpbSBhbmQgdGhlIGFuZ3J5IGxhZHkgYXJlIGluIGEgcGxheSB0b2dldGhlciwgYW5kIHRoZXkgd2FudGVkIHRvIHJlaGVhcnNlIGluIGEgcmVhbCBsaWZlIHNpdHVhdGlvbiwgYXBwYXJlbnRseSBpcyBzb21ldGhpbuKAmSBhYm91dCBnZXR0aW7igJkgcmlnaHQgaW50byB0aGUgY2hhcmFjdGVyLiBIZSB0aGVuIGhhbmRzIG1lIGEgdHdlbnR5IGFuZCBzYXlzIEkgc2hvdWxkbuKAmXQgc2VsbCBzbyBtdWNoIHJ1YmJpc2ggaW4gdGhlIHN0b3JlIGFuZCBpdCB3b3VsZCBzZXJ2ZSBtZSByaWdodCBpZiB0aGF0IGhhcHBlbmVkIGZvciByZWFsLiBJIGFza3MgeWEsIHRoYXQgbWFu4oCZcyBhIGxpYWJpbGl0eS48L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdi8+CiAgICAgICAgICAgICAgICAgICAgPGhyPgogICAgICAgICAgICAgICAgICAgIDxoMT5Db21tZW50czwvaDE+CiAgICAgICAgICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImNvbW1lbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL2F2YXRhci5zdmciIGNsYXNzPSJhdmF0YXIiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWUgTWVhbG9uZSB8IDI0IE1hcmNoIDIwMjYKICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5TdG9wIHRoZSB3b3JsZCBJIHdhbnQgdG8gZ2V0IG9mZiE8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPjwvcD4KICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaXMtbGlua2JhY2siPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScjJyBvbmNsaWNrPSdldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBsb2NhdGlvbiA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKS5nZXQoImJhY2siKSB8fCAiL2Jsb2ciOyc+QmFjayB0byBCbG9nPC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWxlZnQiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1jZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDI+TmV2ZXIgbWlzcyBhIGRlYWwgLSBzdWJzY3JpYmUgbm93PC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+Sm9pbiBvdXIgd29ybGR3aWRlIGNvbW11bml0eSBvZiBnaW4gYW5kIGp1aWNlIGZhbmF0aWNzLCBmb3IgZXhjbHVzaXZlIG5ld3Mgb24gb3VyIGxhdGVzdCBkZWFscywgbmV3IHJlbGVhc2VzLCBjb2xsYWJvcmF0aW9ucywgYW5kIG1vcmUuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0IHNyYz0nL3Jlc291cmNlcy9qcy9zdWJzY3JpYmVOb3cuanMnPjwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJzdWJzY3JpYmUiIGNsYXNzPSJmb3JtIiBkYXRhLW1ldGhvZD0icG9zdCIgZGF0YS1hY3Rpb249Ii9jYXRhbG9nL3N1YnNjcmliZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1lbWFpbCBuYW1lPWVtYWlsIHBsYWNlaG9sZGVyPSJFbWFpbCBhZGRyZXNzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNzcmYiIHZhbHVlPSJCMzJjQjF6YUgzcWZLSlVselA2UXlpbVN0UDRyOGlGbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidXR0b24iIHR5cGU9c3VibWl0PlN1YnNjcmliZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpYWxvZyBpZD0iY291cG9uLWRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Vwb24td3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xvc2UtYnV0dG9uIiBvbmNsaWNrPSJjbG9zZUNvdXBvbkRpYWxvZyhldmVudCkiPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdXBvbi1pbmZvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxPjIwJSBvZmYgZXZlcnl0aGluZzwvaDE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdXBvbi1pbnB1dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgaWQ9ImNvcHlhYmxlLWNvdXBvbiI+Q291cG9uIG5vdCBmb3VuZDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJjb3B5LWNvdXBvbi1idXR0b24iIGNsYXNzPSJjb3B5LWJ1dHRvbiIgb25jbGljaz0iY29weUNvdXBvbihldmVudCkiPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iY291cG9uLWNvcGllZC10aWNrIiBjbGFzcz0iY291cG9uLWNvcGllZC10aWNrIGhpZGRlbiI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BcHBseSB0aGlzIGNvdXBvbiB0byB5b3VyIFNob3BwaW5nIENhcnQgYmVmb3JlIHBsYWNpbmcgeW91ciBvcmRlci48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1jb3B5cmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icG9ydHN3aWdnZXItbG9nbyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PsKpIDIwMjMgUG9ydFN3aWdnZXIgTHRkLjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItcmlnaHQiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImZvb3Rlci1sb3dlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNvY2lhbExpbmtzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxuYXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdmlnYXRpb24taGVhZGVyLWxpbmtzIHByaW1hcnktbGlua3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2NhdGFsb2ciPlByb2R1Y3RzPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNlbGVjdGVkIiBocmVmPSIvYmxvZyI+QmxvZzwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2Fib3V0Ij5PdXIgc3Rvcnk8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmF2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8c2NyaXB0IHNyYz0nL3Jlc291cmNlcy9mb290ZXIvanMvc2Nhbm1lLmpzJz48L3NjcmlwdD4KICAgIDwvYm9keT4KPC9odG1sPgo=","response_hash":"52937a64f27bd85c19d3c3bd06c4c140e6b788325f3441cc843d06e3366404d5","response_time_ms":0,"response_words":1178,"has_response":true,"response_title":"The Complaint - Blog - Gin & Juice Shop","parameters":[{"name":"postId","value":"4","type":"url","name_start":15,"name_end":21,"value_start":22,"value_end":23},{"name":"1","value":"blog","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":9},{"name":"2","value":"post","type":"path","name_start":-1,"name_end":-1,"value_start":10,"value_end":14}],"sent_at":"2026-04-05T05:32:17.202136Z","received_at":"2026-04-05T05:32:17.202132Z","created_at":"2026-04-05T05:32:17Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"e16cf7b0-bd38-465d-8808-1c8423bfc06a","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/images/avatar.svg","url":"https://ginandjuice.shop/resources/images/avatar.svg","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/blog/post?postId=4"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvaW1hZ2VzL2F2YXRhci5zdmcgSFRUUC8xLjENCkhvc3Q6IGdpbmFuZGp1aWNlLnNob3ANClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTQuMC4wLjAgU2FmYXJpLzUzNy4zNg0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KUmVmZXJlcjogaHR0cHM6Ly9naW5hbmRqdWljZS5zaG9wL2Jsb2cvcG9zdD9wb3N0SWQ9NA0KDQo=","request_hash":"c61cf0b4e39486f40aeda75c568cf9d6ccbcf24b5d743f2327cc794952450895","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["374"],"content-type":["image/svg+xml"],"date":["Sun, 05 Apr 2026 05:32:17 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"image/svg+xml","response_content_length":761,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LXR5cGU6IGltYWdlL3N2Zyt4bWwNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY2FjaGUtY29udHJvbDogcHVibGljLCBtYXgtYWdlPTM2MDANCmNvbnRlbnQtbGVuZ3RoOiAzNzQNCngtYmFja2VuZDogYzk4ZGY1YzQtYTUyNy00ZGFhLTg4Y2QtODNjNWRlNGU3Yzc3DQpkYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjE3IEdNVA0KY29udGVudC1lbmNvZGluZzogZ3ppcA0KDQo8c3ZnIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgdmlld0JveD0iMCAwIDI4IDI4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8Y2lyY2xlIGN4PSIxNCIgY3k9IjE0IiByPSIxNCIgZmlsbD0iIzVCNEZGRiIvPgo8cGF0aCBkPSJNMTkuODMzMiAyMC42MjVWMTkuMDQxN0MxOS44MzMyIDE4LjIwMTggMTkuNDk5NSAxNy4zOTY0IDE4LjkwNTcgMTYuODAyNUMxOC4zMTE4IDE2LjIwODYgMTcuNTA2NCAxNS44NzUgMTYuNjY2NSAxNS44NzVIMTAuMzMzMkM5LjQ5MzMyIDE1Ljg3NSA4LjY4Nzg2IDE2LjIwODYgOC4wOTQgMTYuODAyNUM3LjUwMDEzIDE3LjM5NjQgNy4xNjY1IDE4LjIwMTggNy4xNjY1IDE5LjA0MTdWMjAuNjI1IiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTMuNTAwMiAxMi43MDgzQzE1LjI0OTEgMTIuNzA4MyAxNi42NjY4IDExLjI5MDYgMTYuNjY2OCA5LjU0MTY3QzE2LjY2NjggNy43OTI3NiAxNS4yNDkxIDYuMzc1IDEzLjUwMDIgNi4zNzVDMTEuNzUxMyA2LjM3NSAxMC4zMzM1IDcuNzkyNzYgMTAuMzMzNSA5LjU0MTY3QzEwLjMzMzUgMTEuMjkwNiAxMS43NTEzIDEyLjcwODMgMTMuNTAwMiAxMi43MDgzWiIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPC9zdmc+Cg==","response_hash":"04a3b125bfc375e35f6d3c22ad3e60e223dd4ff07014aaf4a1508673bb65353b","response_time_ms":0,"response_words":89,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"images","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":21},{"name":"3","value":"avatar.svg","type":"path","name_start":-1,"name_end":-1,"value_start":22,"value_end":32}],"sent_at":"2026-04-05T05:32:17.374734Z","received_at":"2026-04-05T05:32:17.374729Z","created_at":"2026-04-05T05:32:17Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"3285d2bc-cede-40a9-9939-2cbf8660b4a4","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/js/searchLogger.js","url":"https://ginandjuice.shop/resources/js/searchLogger.js","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/blog"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvanMvc2VhcmNoTG9nZ2VyLmpzIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE0LjAuMC4wIFNhZmFyaS81MzcuMzYNCkFjY2VwdC1MYW5ndWFnZTogZW4NClJlZmVyZXI6IGh0dHBzOi8vZ2luYW5kanVpY2Uuc2hvcC9ibG9nDQoNCg==","request_hash":"ae248adee17645100a00ea35ad407b8713636e992cbb233c23a054c5348e0ffa","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["364"],"content-type":["application/javascript; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:32:15 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/javascript; charset=utf-8","response_content_length":657,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY2FjaGUtY29udHJvbDogcHVibGljLCBtYXgtYWdlPTM2MDANCmNvbnRlbnQtbGVuZ3RoOiAzNjQNCngtYmFja2VuZDogYzk4ZGY1YzQtYTUyNy00ZGFhLTg4Y2QtODNjNWRlNGU3Yzc3DQpkYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjE1IEdNVA0KY29udGVudC1lbmNvZGluZzogZ3ppcA0KDQphc3luYyBmdW5jdGlvbiBsb2dRdWVyeSh1cmwsIHBhcmFtcykgewogICAgdHJ5IHsKICAgICAgICBhd2FpdCBmZXRjaCh1cmwsIHttZXRob2Q6ICJwb3N0Iiwga2VlcGFsaXZlOiB0cnVlLCBib2R5OiBKU09OLnN0cmluZ2lmeShwYXJhbXMpfSk7CiAgICB9IGNhdGNoKGUpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCJGYWlsZWQgc3RvcmluZyBxdWVyeSIpOwogICAgfQp9Cgphc3luYyBmdW5jdGlvbiBzZWFyY2hMb2dnZXIoKSB7CiAgICBsZXQgY29uZmlnID0ge3BhcmFtczogZGVwYXJhbShuZXcgVVJMKGxvY2F0aW9uKS5zZWFyY2hQYXJhbXMudG9TdHJpbmcoKSl9OwoKICAgIGlmKGNvbmZpZy50cmFuc3BvcnRfdXJsKSB7CiAgICAgICAgbGV0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgIHNjcmlwdC5zcmMgPSBjb25maWcudHJhbnNwb3J0X3VybDsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgICB9CgogICAgaWYoY29uZmlnLnBhcmFtcyAmJiBjb25maWcucGFyYW1zLnNlYXJjaCkgewogICAgICAgIGF3YWl0IGxvZ1F1ZXJ5KCcvbG9nZ2VyJywgY29uZmlnLnBhcmFtcyk7CiAgICB9Cn0KCndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgc2VhcmNoTG9nZ2VyKTs=","response_hash":"8194554a1c32dd6080ac48a5bc997a82e1d7991aac8c9cd44c0d8f525bdf6832","response_time_ms":0,"response_words":76,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"js","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":17},{"name":"3","value":"searchLogger.js","type":"path","name_start":-1,"name_end":-1,"value_start":18,"value_end":33}],"sent_at":"2026-04-05T05:32:15.99935Z","received_at":"2026-04-05T05:32:15.999339Z","created_at":"2026-04-05T05:32:16Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"d1d640fd-a5b6-4cf5-8758-302079c20931","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/js/deparam.js","url":"https://ginandjuice.shop/resources/js/deparam.js","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/blog"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvanMvZGVwYXJhbS5qcyBIVFRQLzEuMQ0KSG9zdDogZ2luYW5kanVpY2Uuc2hvcA0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2DQpBY2NlcHQtTGFuZ3VhZ2U6IGVuDQpSZWZlcmVyOiBodHRwczovL2dpbmFuZGp1aWNlLnNob3AvYmxvZw0KDQo=","request_hash":"be419fa535f701bcc4ffd0cfdbb92b01c376bd524b0b903482ae1247385a20c2","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["719"],"content-type":["application/javascript; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:32:15 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/javascript; charset=utf-8","response_content_length":2128,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY2FjaGUtY29udHJvbDogcHVibGljLCBtYXgtYWdlPTM2MDANCmNvbnRlbnQtbGVuZ3RoOiA3MTkNCngtYmFja2VuZDogYzk4ZGY1YzQtYTUyNy00ZGFhLTg4Y2QtODNjNWRlNGU3Yzc3DQpkYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMyOjE1IEdNVA0KDQp2YXIgZGVwYXJhbSA9IGZ1bmN0aW9uKCBwYXJhbXMsIGNvZXJjZSApIHsKICAgIHZhciBvYmogPSB7fSwKICAgICAgICBjb2VyY2VfdHlwZXMgPSB7ICd0cnVlJzogITAsICdmYWxzZSc6ICExLCAnbnVsbCc6IG51bGwgfTsKCiAgICBpZiAoIXBhcmFtcykgewogICAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgcGFyYW1zLnJlcGxhY2UoL1wrL2csICcgJykuc3BsaXQoJyYnKS5mb3JFYWNoKGZ1bmN0aW9uKHYpewogICAgICAgIHZhciBwYXJhbSA9IHYuc3BsaXQoICc9JyApLAogICAgICAgICAgICBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoIHBhcmFtWzBdICksCiAgICAgICAgICAgIHZhbCwKICAgICAgICAgICAgY3VyID0gb2JqLAogICAgICAgICAgICBpID0gMCwKCiAgICAgICAgICAgIGtleXMgPSBrZXkuc3BsaXQoICddWycgKSwKICAgICAgICAgICAga2V5c19sYXN0ID0ga2V5cy5sZW5ndGggLSAxOwoKICAgICAgICBpZiAoIC9cWy8udGVzdCgga2V5c1swXSApICYmIC9cXSQvLnRlc3QoIGtleXNbIGtleXNfbGFzdCBdICkgKSB7CiAgICAgICAgICAgIGtleXNbIGtleXNfbGFzdCBdID0ga2V5c1sga2V5c19sYXN0IF0ucmVwbGFjZSggL1xdJC8sICcnICk7CiAgICAgICAgICAgIGtleXMgPSBrZXlzLnNoaWZ0KCkuc3BsaXQoJ1snKS5jb25jYXQoIGtleXMgKTsKICAgICAgICAgICAga2V5c19sYXN0ID0ga2V5cy5sZW5ndGggLSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGtleXNfbGFzdCA9IDA7CiAgICAgICAgfQoKICAgICAgICBpZiAoIHBhcmFtLmxlbmd0aCA9PT0gMiApIHsKICAgICAgICAgICAgdmFsID0gZGVjb2RlVVJJQ29tcG9uZW50KCBwYXJhbVsxXSApOwoKICAgICAgICAgICAgaWYgKCBjb2VyY2UgKSB7CiAgICAgICAgICAgICAgICB2YWwgPSB2YWwgJiYgIWlzTmFOKHZhbCkgJiYgKCgrdmFsICsgJycpID09PSB2YWwpID8gK3ZhbCAgICAgICAgLy8gbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgOiB2YWwgPT09ICd1bmRlZmluZWQnICAgICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZCAgICAgICAgIC8vIHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICA6IGNvZXJjZV90eXBlc1t2YWxdICE9PSB1bmRlZmluZWQgICAgICAgICAgID8gY29lcmNlX3R5cGVzW3ZhbF0gLy8gdHJ1ZSwgZmFsc2UsIG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmcKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBrZXlzX2xhc3QgKSB7CiAgICAgICAgICAgICAgICBmb3IgKCA7IGkgPD0ga2V5c19sYXN0OyBpKysgKSB7CiAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5c1tpXSA9PT0gJycgPyBjdXIubGVuZ3RoIDoga2V5c1tpXTsKICAgICAgICAgICAgICAgICAgICBjdXIgPSBjdXJba2V5XSA9IGkgPCBrZXlzX2xhc3QKICAgICAgICAgICAgICAgICAgICAgICAgPyBjdXJba2V5XSB8fCAoIGtleXNbaSsxXSAmJiBpc05hTigga2V5c1tpKzFdICkgPyB7fSA6IFtdICkKICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoIG9ialtrZXldICkgPT09ICdbb2JqZWN0IEFycmF5XScgKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0ucHVzaCggdmFsICk7CgogICAgICAgICAgICAgICAgfSBlbHNlIGlmICgge30uaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkgKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSBbIG9ialtrZXldLCB2YWwgXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgb2JqW2tleV0gPSB2YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSBlbHNlIGlmICgga2V5ICkgewogICAgICAgICAgICBvYmpba2V5XSA9IGNvZXJjZQogICAgICAgICAgICAgICAgPyB1bmRlZmluZWQKICAgICAgICAgICAgICAgIDogJyc7CiAgICAgICAgfQogICAgfSk7CgogICAgcmV0dXJuIG9iajsKfTsK","response_hash":"ceda2945bc9c61ad2551b1056c13f4b0915e784f38b24550a4353b3aca296ce1","response_time_ms":0,"response_words":279,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"js","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":17},{"name":"3","value":"deparam.js","type":"path","name_start":-1,"name_end":-1,"value_start":18,"value_end":28}],"sent_at":"2026-04-05T05:32:16.039699Z","received_at":"2026-04-05T05:32:16.03969Z","created_at":"2026-04-05T05:32:16Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"01267102-673a-4f99-850c-8cc02cab4e65","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/css/labsBlog.css","url":"https://ginandjuice.shop/resources/css/labsBlog.css","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/blog"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvY3NzL2xhYnNCbG9nLmNzcyBIVFRQLzEuMQ0KSG9zdDogZ2luYW5kanVpY2Uuc2hvcA0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KUmVmZXJlcjogaHR0cHM6Ly9naW5hbmRqdWljZS5zaG9wL2Jsb2cNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTQuMC4wLjAgU2FmYXJpLzUzNy4zNg0KDQo=","request_hash":"fd0d4cad4ada43bba46650a1cee2b23ef157cfedb4febb65f607ec7a2e7eeea4","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["4570"],"content-type":["text/css"],"date":["Sun, 05 Apr 2026 05:32:15 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/css","response_content_length":23904,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LXR5cGU6IHRleHQvY3NzDQp4LWZyYW1lLW9wdGlvbnM6IFNBTUVPUklHSU4NCmNhY2hlLWNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0zNjAwDQpjb250ZW50LWxlbmd0aDogNDU3MA0KeC1iYWNrZW5kOiBjOThkZjVjNC1hNTI3LTRkYWEtODhjZC04M2M1ZGU0ZTdjNzcNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzI6MTUgR01UDQoNCjpyb290IHsKICAtLXNwYWNpbmdiYXNlOiAwLjllbTsKfQoKQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7CiAgOnJvb3QgewogICAgLS1zcGFjaW5nYmFzZTogMWVtOwogIH0KfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7CiAgOnJvb3QgewogICAgLS1zcGFjaW5nYmFzZTogMS4xZW07CiAgfQp9Ci8qMiovCi8qNCovCi8qOCovCi8qMTIqLwovKjIwKi8KLyozMiovCi8qNTIqLwovKjg0Ki8KLyogY29tcG9uZW50IHNwYWNpbmcgKi8KLypTcGFjaW5nIHVzZWQgZm9yIGNvbnRhaW5lciBjb2x1bW5zIGxheW91dHMqLwo6cm9vdCB7CiAgLyogc2V0IGJhc2UgdmFsdWVzICovCiAgLS10ZXh0LWJhc2Utc2l6ZTogMWVtOwogIC0tdGV4dC1zY2FsZS1yYXRpbzogMS4xOwogIC8qIHR5cGUgc2NhbGUgKi8KICAtLXRleHQteHM6IGNhbGMoMWVtIC8gKHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpKTsKICAtLXRleHQtc206IGNhbGMoMWVtIC8gdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpOwogIC0tdGV4dC1tZDogY2FsYygxLjAxZW0gKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSk7CiAgLS10ZXh0LWxnOiBjYWxjKDFlbSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpOwogIC0tdGV4dC14bDogY2FsYygxZW0gKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpOwogIC0tdGV4dC14eGw6IGNhbGMoMWVtICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykgKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpOwogIC0tdGV4dC14eHhsOiBjYWxjKDFlbSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykgKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpOwogIC8qIGxpbmUtaGVpZ2h0ICovCiAgLS1oZWFkaW5nLWxpbmUtaGVpZ2h0OiAxOwogIC0tdGV4dC1saW5laGVpZ2h0OiAxLjQ7CiAgLS10ZXh0LWxpbmVoZWlnaHQtc206IDEuMzsKICAtLXRleHQtbGluZWhlaWdodC1tZDogMS40NTsKICAtLXRleHQtbGluZWhlaWdodC1scmc6IDEuNTsKfQoKQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7CiAgOnJvb3QgewogICAgLS10ZXh0LXNjYWxlLXJhdGlvOiAxLjE1OwogICAgLS10ZXh0LWxpbmVoZWlnaHQ6IDEuNDU7CiAgfQp9CkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsKICA6cm9vdCB7CiAgICAtLXRleHQtc2NhbGUtcmF0aW86IDEuMjsKICAgIC0tdGV4dC1saW5laGVpZ2h0OiAxLjU7CiAgfQp9Ci5vcmFuZ2UtYm9yZGVyLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNmZjY2MzMgIWltcG9ydGFudDsKICBwYWRkaW5nOiA1cHggMHB4ICFpbXBvcnRhbnQ7Cn0KCi53aGl0ZS1ib3JkZXItYm90dG9tLCAubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciBoMyB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZmYgIWltcG9ydGFudDsKfQoKLmxpZ2h0LWdyZXktYm9yZGVyIHsKICBib3JkZXI6IDFweCBzb2xpZCAjYjNiM2IzICFpbXBvcnRhbnQ7Cn0KCi5saWdodC1ncmV5LWJvcmRlci10b3AgewogIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYjNiM2IzICFpbXBvcnRhbnQ7Cn0KCi5saWdodGVyLWdyZXktYm9yZGVyIHsKICBib3JkZXI6IDFweCBzb2xpZCAjY2JkMGQxICFpbXBvcnRhbnQ7Cn0KCi5saWdodGVyLWdyZXktYm9yZGVyLWJvdHRvbSwgLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgaDMgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2JkMGQxICFpbXBvcnRhbnQ7Cn0KCi5ib3JkZXItYm90dG9tLWdyZXkgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjOTk5ICFpbXBvcnRhbnQ7Cn0KCi5ib3JkZXItdG9wLWdyZXkgewogIGJvcmRlci10b3A6IDFweCBzb2xpZCAjOTk5ICFpbXBvcnRhbnQ7Cn0KCi5ib3JkZXItYm90dG9tLWxpZ2h0LWdyZXkgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYjNiM2IzICFpbXBvcnRhbnQ7Cn0KCi5ib3JkZXItdG9wLWxpZ2h0LWdyZXkgewogIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYjNiM2IzICFpbXBvcnRhbnQ7Cn0KCi5ib3JkZXItYm90dG9tLXgtbGlnaHQtZ3JleSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNmU2ZTYgIWltcG9ydGFudDsKfQoKLmJvcmRlci10b3AteC1saWdodC1ncmV5IHsKICBib3JkZXItdG9wOiAxcHggc29saWQgI2U2ZTZlNiAhaW1wb3J0YW50Owp9CgpkaXYuYm9yZGVyLWJvdHRvbS14LWxpZ2h0LWdyZXkgewogIG1hcmdpbjogMWVtIDAgIWltcG9ydGFudDsKfQoKLndoaXRlLWJvcmRlci1kYXNoZWQtb2Zmc2V0IHsKICBvdXRsaW5lOiAxcHggZGFzaGVkICNmZmY7CiAgb3V0bGluZS1vZmZzZXQ6IC02cHg7Cn0KCi54LWxpZ2h0LWdyZXktYm9yZGVyIHsKICBib3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2ICFpbXBvcnRhbnQ7Cn0KCi5tYWluY29udGFpbmVyIGgxLAoubWFpbmNvbnRhaW5lciBoMiwKLm1haW5jb250YWluZXIgaDMsCi5tYWluY29udGFpbmVyIGg0IHsKICBjb2xvcjogI2FlNzVjMzsKfQoubWFpbmNvbnRhaW5lciBoMSBhLAoubWFpbmNvbnRhaW5lciBoMiBhLAoubWFpbmNvbnRhaW5lciBoMyBhLAoubWFpbmNvbnRhaW5lciBoNCBhIHsKICBjb2xvcjogI2FlNzVjMzsKfQoKKiwgKjpiZWZvcmUsICo6YWZ0ZXIgewogIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKYm9keSB7CiAgbWFyZ2luOiAwOwogIG1pbi13aWR0aDogMjkwcHg7CiAgbWluLWhlaWdodDogMTAwdmg7Cn0KCi5pcy1mbGV4IHsKICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICBkaXNwbGF5OiAtbW96LWJveDsKICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgZGlzcGxheTogZmxleDsKfQouaXMtZmxleCAubWFpbmNvbnRhaW5lciB7CiAgLW1vei1mbGV4OiAxIDEgYXV0bzsKICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogIC1tcy1mbGV4OiAxIDEgYXV0bzsKICBmbGV4OiAxIDEgYXV0bzsKICBtaW4taGVpZ2h0OiAxMDB2aDsKICBtaW4td2lkdGg6IDA7Cn0KLmlzLWZsZXguZmxleGRpcmVjdGlvbi1jb2wgewogIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsOwogIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7CiAgLW1vei1ib3gtZGlyZWN0aW9uOiBub3JtYWw7CiAgLW1vei1ib3gtb3JpZW50OiB2ZXJ0aWNhbDsKICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmNvbnRhaW5lciB7CiAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA3LjVlbSk7Cn0KCmhyIHsKICBib3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2OwogIG1hcmdpbjogMS44ZW0gMDsKfQoKaHI6bGFzdC1vZi10eXBlIHsKICBtYXJnaW4tdG9wOiAwOwp9CgouaGlkZGVuIHsKICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7Cn0KCi5jb250YWluZXItbGlzdC10aWxlcyB7CiAgLXdlYmtpdC1ib3gtcGFjazoganVzdGlmeTsKICAtbW96LWJveC1wYWNrOiBqdXN0aWZ5OwogIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7CiAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC1tb3otYm94OwogIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtd3JhcDogd3JhcDsKICBtYXJnaW46IDFlbSAwOwp9Ci5jb250YWluZXItbGlzdC10aWxlcyA+IGRpdiB7CiAgcGFkZGluZzogMWVtIDAgMmVtIDA7CiAgLW1vei1mbGV4OiAxIDAgMjQlOwogIC13ZWJraXQtZmxleDogMSAwIDI0JTsKICAtbXMtZmxleDogMSAwIDI0JTsKICBmbGV4OiAxIDAgMjQlOwogIG1heC13aWR0aDogMjQlOwp9Ci5jb250YWluZXItbGlzdC10aWxlcyA+IGRpdiBpbWc6Zmlyc3Qtb2YtdHlwZSB7CiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjsKICB3aWR0aDogMjcwcHg7CiAgaGVpZ2h0OiAyMDBweDsKICBib3JkZXItcmFkaXVzOiA1cHg7CiAgb3BhY2l0eTogMC45OwogIHBhZGRpbmc6IDA7Cn0KLmNvbnRhaW5lci1saXN0LXRpbGVzID4gZGl2IGltZzpudGgtb2YtdHlwZSgyKSB7CiAgYm9yZGVyOiBub25lOwp9Ci5jb250YWluZXItbGlzdC10aWxlcyA+IGRpdiBoMyB7CiAgZm9udC1zaXplOiAwLjhlbTsKICBmb250LXdlaWdodDogYm9sZDsKfQouY29udGFpbmVyLWxpc3QtdGlsZXMgPiBkaXYgLmJ1dHRvbiB7CiAgZmxvYXQ6IHVuc2V0OwogIG1hcmdpbjogMC43ZW0gYXV0byAwIGF1dG87CiAgZGlzcGxheTogYmxvY2s7CiAgYm9yZGVyLXJhZGl1czogMDsKfQoKQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSB7CiAgLm1haW5jb250YWluZXIgewogICAgbWluLWhlaWdodDogMzYwcHg7CiAgfQp9CkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDk5MXB4KSB7CiAgLmlzLWZsZXggewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9CiAgLmlzLWZsZXggLnJpZ2h0Y29sIHsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Ci5jb250YWluZXIgewogIHdpZHRoOiAxMTQwcHg7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBtYXJnaW46IDAgYXV0bzsKICBwYWRkaW5nOiAwOwp9Ci5jb250YWluZXIuaXMtZmxleCB7CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLW1vei1ib3g7CiAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IGZsZXg7Cn0KLmNvbnRhaW5lci5pcy1mbGV4IC5sZWZ0Y29sIHsKICBtYXJnaW4tcmlnaHQ6IDEuOGVtOwp9Ci5jb250YWluZXIuaXMtZmxleCAubWFpbmNvbCB7CiAgLW1vei1mbGV4OiAxIDEgYXV0bzsKICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogIC1tcy1mbGV4OiAxIDEgYXV0bzsKICBmbGV4OiAxIDEgYXV0bzsKICBtaW4taGVpZ2h0OiAxMDAlOwogIG1pbi13aWR0aDogMDsKfQouY29udGFpbmVyLmlzLWZsZXggLnJpZ2h0Y29sIHsKICBtYXJnaW4tbGVmdDogMS44ZW07CiAgbWF4LXdpZHRoOiAzMS44ZW07Cn0KCi5tYWluY29udGFpbmVyIC5jb250YWluZXIgewogIHBhZGRpbmc6IDEuOGVtIDA7Cn0KLm1haW5jb250YWluZXIgLmNvbnRhaW5lciAuaW5mb3JtYXRpb24gewogIGJhY2tncm91bmQ6ICNlYmYwZjI7CiAgcGFkZGluZzogMWVtOwogIGJvcmRlci1yYWRpdXM6IDE1cHg7Cn0KLm1haW5jb250YWluZXIgLmNvbnRhaW5lciAuaW5mb3JtYXRpb24gcDpsYXN0LW9mLXR5cGUgewogIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDExOTBweCkgewogIC5jb250YWluZXIgewogICAgcGFkZGluZzogMCAxZW07CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogMTE0MHB4OwogIH0KCiAgLm1haW5jb250YWluZXIgLmNvbnRhaW5lciB7CiAgICBwYWRkaW5nOiAxLjhlbSAxZW07CiAgfQp9CkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkgewogIC5tYWluY29udGFpbmVyIHsKICAgIG1pbi1oZWlnaHQ6IDM2MHB4OwogIH0KfQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTFweCkgewogIC5jb250YWluZXIuaXMtZmxleCB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIH0KICAuY29udGFpbmVyLmlzLWZsZXggLnJpZ2h0Y29sIHsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9CmEgewogIGNvbG9yOiAjYWU3NWMzOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQphOmhvdmVyLCBhOmFjdGl2ZSB7CiAgY29sb3I6ICM5MTYwYTU7CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KYS53aGl0ZSB7CiAgY29sb3I6ICNmZmY7Cn0KCi5pcy1saW5rYmFjayB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KLmlzLWxpbmtiYWNrOmJlZm9yZSB7CiAgY29udGVudDogIjwiOwogIGNvbG9yOiAjYWU3NWMzOwp9Ci5pcy1saW5rYmFjazpiZWZvcmU6aG92ZXIsIC5pcy1saW5rYmFjazpiZWZvcmU6YWN0aXZlIHsKICBjb2xvcjogIzkxNjBhNTsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQouaXMtbGlua2JhY2sgYTpob3ZlciB7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CgoubWFyZ2luLW5vbmUgewogIG1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7Cn0KCi5zaG9ydC1jb250ZW50LXNwYWNpbmcgewogIG1hcmdpbjogNCUgMCA2JSAwICFpbXBvcnRhbnQ7Cn0KCi5jZW50ZXItYmxvY2sgewogIGRpc3BsYXk6IGJsb2NrOwogIG1hcmdpbi1yaWdodDogYXV0bzsKICBtYXJnaW4tbGVmdDogYXV0bzsKfQoKLm1hcmdpbi1zIHsKICBtYXJnaW46IDVweCAhaW1wb3J0YW50Owp9CgoubWFyZ2luLW0gewogIG1hcmdpbjogMWVtICFpbXBvcnRhbnQ7Cn0KCi5tYXJnaW4tbCB7CiAgbWFyZ2luOiAxLjhlbSAhaW1wb3J0YW50Owp9CgoubWFyZ2luLWxlZnQtcyB7CiAgbWFyZ2luLWxlZnQ6IDVweCAhaW1wb3J0YW50Owp9CgoubWFyZ2luLWxlZnQtbSB7CiAgbWFyZ2luLWxlZnQ6IDFlbSAhaW1wb3J0YW50Owp9CgoubWFyZ2luLWxlZnQtbCB7CiAgbWFyZ2luLWxlZnQ6IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5tYXJnaW4tcmlnaHQtcyB7CiAgbWFyZ2luLXJpZ2h0OiA1cHggIWltcG9ydGFudDsKfQoKLm1hcmdpbi1yaWdodC1tIHsKICBtYXJnaW4tcmlnaHQ6IDFlbSAhaW1wb3J0YW50Owp9CgoubWFyZ2luLXJpZ2h0LWwgewogIG1hcmdpbi1yaWdodDogMS44ZW0gIWltcG9ydGFudDsKfQoKLm1hcmdpbi10b3AtcyB7CiAgbWFyZ2luLXRvcDogMTBweCAhaW1wb3J0YW50Owp9CgoubWFyZ2luLXRvcC1tIHsKICBtYXJnaW4tdG9wOiAxLjhlbSAhaW1wb3J0YW50Owp9CgoubWFyZ2luLXRvcC1sIHsKICBtYXJnaW4tdG9wOiA1MHB4ICFpbXBvcnRhbnQ7Cn0KCi5tYXJnaW4tYm90dG9tLXMgewogIG1hcmdpbi1ib3R0b206IDEwcHggIWltcG9ydGFudDsKfQoKLm1hcmdpbi1ib3R0b20tbSB7CiAgbWFyZ2luLWJvdHRvbTogMS44ZW0gIWltcG9ydGFudDsKfQoKLm1hcmdpbi1ib3R0b20tbCB7CiAgbWFyZ2luLWJvdHRvbTogNTBweCAhaW1wb3J0YW50Owp9CgoubWFyZ2luLWJvdHRvbS00MCB7CiAgbWFyZ2luLWJvdHRvbTogNDAlOwp9CgoubmF2Y29udGFpbmVyIHsKICBtaW4taGVpZ2h0OiAxMDB2aDsKICBtaW4td2lkdGg6IDQwMHB4OwogIG1heC13aWR0aDogNDAwcHg7CiAgYmFja2dyb3VuZC1jb2xvcjogIzAwNzFiYzsKICBwYWRkaW5nOiAxZW07CiAgcG9zaXRpb246IGZpeGVkOwp9Ci5uYXZjb250YWluZXIgaDEsIC5uYXZjb250YWluZXIgaDIsIC5uYXZjb250YWluZXIgaDMsIC5uYXZjb250YWluZXIgaDQsIC5uYXZjb250YWluZXIgbGksIC5uYXZjb250YWluZXIgYSB7CiAgY29sb3I6ICNmZmY7Cn0KLm5hdmNvbnRhaW5lciBoMiB7CiAgZm9udC1zaXplOiB2YXIoLS10ZXh0LXhsKTsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciB7CiAgb3ZlcmZsb3c6IHNjcm9sbDsKICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gMTAwcHgpOwp9Ci5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIGgzIHsKICBtYXJnaW46IDE2cHggMCA4cHggMDsKICBkaXNwbGF5OiBibG9jazsKICBmb250LXNpemU6IDFlbTsKICBmb250LXdlaWdodDogYm9sZDsKICB3aWR0aDogMTAwJTsKICBjb2xvcjogI2ZmZjsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciBoMzpmaXJzdC1vZi10eXBlIHsKICBtYXJnaW46IDAgMCA4cHggMDsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciBhIHsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgYTpob3ZlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA5NGM3MjsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciB1bCB7CiAgcGFkZGluZzogMDsKICBtYXJnaW46IDA7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkgewogIGxpc3Qtc3R5bGU6IG5vbmU7CiAgbGluZS1oZWlnaHQ6IDEuNWVtOwogIGJhY2tncm91bmQ6IG5vbmU7CiAgcGFkZGluZzogMDsKICBtYXJnaW46IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgcmlnaHQ6IDVweDsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciB1bCBsaSBhIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgZGlzcGxheTogYmxvY2s7CiAgcGFkZGluZy1sZWZ0OiA1cHg7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkuaXMtZHJvcGRvd24gewogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgcmlnaHQ6IDA7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkuaXMtZHJvcGRvd24gbGFiZWwgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKSBzY2FsZSgxLCAxLjUpOwogIC1tb3otdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpIHNjYWxlKDEsIDEuNSk7CiAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKSBzY2FsZSgxLCAxLjUpOwogIC1vLXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKSBzY2FsZSgxLCAxLjUpOwogIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKSBzY2FsZSgxLCAxLjUpOwogIGZvbnQtc2l6ZTogMThweDsKICBtYXJnaW4tcmlnaHQ6IDVweDsKICBmb250LXdlaWdodDogNDAwOwogIGNvbG9yOiB3aGl0ZTsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciB1bCBsaS5pcy1kcm9wZG93biBsYWJlbCArIHVsIGxpIHsKICBkaXNwbGF5OiBub25lOwogIGZvbnQtd2VpZ2h0OiA0MDA7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkuaXMtZHJvcGRvd24gaW5wdXRbdHlwZT1jaGVja2JveF06Y2hlY2tlZCArIGxhYmVsIHsKICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgc2NhbGUoMSwgMS41KTsKICAtbW96LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgc2NhbGUoMSwgMS41KTsKICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSBzY2FsZSgxLCAxLjUpOwogIC1vLXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgc2NhbGUoMSwgMS41KTsKICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpIHNjYWxlKDEsIDEuNSk7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkuaXMtZHJvcGRvd24gaW5wdXRbdHlwZT1jaGVja2JveF06Y2hlY2tlZCArIGxhYmVsICsgdWwgewogIG1hcmdpbjogMCAwIDAgMTVweDsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciB1bCBsaS5pcy1kcm9wZG93biBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgbGFiZWwgKyB1bCBsaSB7CiAgZGlzcGxheTogYmxvY2s7Cn0KCi5zZWN0aW9uLXBhZGRpbmcgewogIHBhZGRpbmc6IDEuOGVtIDA7Cn0KCi5zZWN0aW9uLXBhZGRpbmctbHJnIHsKICBwYWRkaW5nOiA0MHB4IDBweDsKfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgewogIC5zZWN0aW9uLXBhZGRpbmcsIC5zZWN0aW9uLXBhZGRpbmctbHJnIHsKICAgIHBhZGRpbmc6IDFlbSAwOwogIH0KfQoucGFkZGluZy1zIHsKICBwYWRkaW5nOiA1cHggIWltcG9ydGFudDsKfQoKLnBhZGRpbmctbSB7CiAgcGFkZGluZzogMWVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLWwgewogIHBhZGRpbmc6IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLWxlZnQtcywgLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgaDMgewogIHBhZGRpbmctbGVmdDogNXB4ICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLWxlZnQtbSB7CiAgcGFkZGluZy1sZWZ0OiAxZW0gIWltcG9ydGFudDsKfQoKLnBhZGRpbmctbGVmdC1sIHsKICBwYWRkaW5nLWxlZnQ6IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLXJpZ2h0LXMgewogIHBhZGRpbmctcmlnaHQ6IDVweCAhaW1wb3J0YW50Owp9CgoucGFkZGluZy1yaWdodC1tIHsKICBwYWRkaW5nLXJpZ2h0OiAxZW0gIWltcG9ydGFudDsKfQoKLnBhZGRpbmctcmlnaHQtbCB7CiAgcGFkZGluZy1yaWdodDogMS44ZW0gIWltcG9ydGFudDsKfQoKLnBhZGRpbmctdG9wLXMgewogIHBhZGRpbmctdG9wOiAxMHB4ICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLXRvcC1tIHsKICBwYWRkaW5nLXRvcDogMS44ZW0gIWltcG9ydGFudDsKfQoKLnBhZGRpbmctdG9wLWwgewogIHBhZGRpbmctdG9wOiA1MHB4ICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLWJvdHRvbS1zIHsKICBwYWRkaW5nLWJvdHRvbTogMTBweCAhaW1wb3J0YW50Owp9CgoucGFkZGluZy1ib3R0b20tbSB7CiAgcGFkZGluZy1ib3R0b206IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLWJvdHRvbS1sIHsKICBwYWRkaW5nLWJvdHRvbTogNTBweCAhaW1wb3J0YW50Owp9Cgpib2R5IHsKICBiYWNrZ3JvdW5kOiAjZmZmICFpbXBvcnRhbnQ7CiAgY29sb3I6ICMzMzMzMzI7CiAgZm9udC1zaXplOiAxNnB4OwogIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7CiAgZm9udC1mYW1pbHk6IEFyaWFsLCAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CiAgbGluZS1oZWlnaHQ6IDEuNDsKICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogIHdvcmQtd3JhcDogYnJlYWstd29yZDsKfQoKcCB7CiAgbWFyZ2luOiAwIDAgMTBweDsKfQpwLmlzLXdhcm5pbmcgewogIGNvbG9yOiAjYjUwMDAwOwogIGRpc3BsYXk6IGlubGluZTsKICBtYXJnaW4tbGVmdDogY2FsYygwLjI1ICogdmFyKC0tc3BhY2luZ2Jhc2UpKTsKfQpwLmlzLXdhcm5pbmc6Zmlyc3QtY2hpbGQgewogIG1hcmdpbi1sZWZ0OiAwOwp9Cgouc21hbGxlci10ZXh0IHsKICBmb250LXNpemU6IDAuOWVtOwp9CgpoMSwgaDIsIGgzLCBoNCwgaDUsIC5oMiwgLmgzLCAuaDQsIGg1LCAuaDUgewogIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgbGluZS1oZWlnaHQ6IHZhcigtLWhlYWRpbmctbGluZS1oZWlnaHQpOwogIG1hcmdpbjogY2FsYygwLjc1ICogdmFyKC0tc3BhY2luZ2Jhc2UpKSAwIGNhbGMoMC41ICogdmFyKC0tc3BhY2luZ2Jhc2UpKSAwOwogIGNvbG9yOiAjZmY2NjMzOwp9CmgxLmlzLXVuZGVybGluZWQsIGgyLmlzLXVuZGVybGluZWQsIGgzLmlzLXVuZGVybGluZWQsIGg0LmlzLXVuZGVybGluZWQsIGg1LmlzLXVuZGVybGluZWQsIC5oMi5pcy11bmRlcmxpbmVkLCAuaDMuaXMtdW5kZXJsaW5lZCwgLmg0LmlzLXVuZGVybGluZWQsIGg1LmlzLXVuZGVybGluZWQsIC5oNS5pcy11bmRlcmxpbmVkIHsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZmNjYzMzsKICBwYWRkaW5nLWJvdHRvbTogY2FsYygwLjExMjUgKiB2YXIoLS1zcGFjaW5nYmFzZSkpOwp9CmgxOmZpcnN0LWNoaWxkLCBoMjpmaXJzdC1jaGlsZCwgaDM6Zmlyc3QtY2hpbGQsIGg0OmZpcnN0LWNoaWxkLCBoNTpmaXJzdC1jaGlsZCwgLmgyOmZpcnN0LWNoaWxkLCAuaDM6Zmlyc3QtY2hpbGQsIC5oNDpmaXJzdC1jaGlsZCwgaDU6Zmlyc3QtY2hpbGQsIC5oNTpmaXJzdC1jaGlsZCB7CiAgbWFyZ2luLXRvcDogMDsKfQpoMTpsYXN0LWNoaWxkLCBoMjpsYXN0LWNoaWxkLCBoMzpsYXN0LWNoaWxkLCBoNDpsYXN0LWNoaWxkLCBoNTpsYXN0LWNoaWxkLCAuaDI6bGFzdC1jaGlsZCwgLmgzOmxhc3QtY2hpbGQsIC5oNDpsYXN0LWNoaWxkLCBoNTpsYXN0LWNoaWxkLCAuaDU6bGFzdC1jaGlsZCB7CiAgbWFyZ2luLWJvdHRvbTogMDsKfQoKaDEsIC5oMSB7CiAgZm9udC1zaXplOiB2YXIoLS10ZXh0LXh4eGwpOwp9CgpoMiwgLmgyIHsKICBmb250LXNpemU6IHZhcigtLXRleHQteHhsKTsKfQoKaDMsIC5oMyB7CiAgZm9udC1zaXplOiB2YXIoLS10ZXh0LXhsKTsKfQoKaDQsIC5oNCB7CiAgZm9udC1zaXplOiB2YXIoLS10ZXh0LWxnKTsKfQoKaDUsIC5oNSB7CiAgZm9udC1zaXplOiB2YXIoLS10ZXh0LW1kKTsKICBsaW5lLWhlaWdodDogdmFyKC0tdGV4dC1saW5laGVpZ2h0KTsKfQoKY2l0ZSB7CiAgbWFyZ2luOiAxZW0gMmVtOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjZmY2NjMzOwogIHBhZGRpbmc6IDAgMS42ZW07CiAgY29sb3I6IHJnYmEoNTEsIDUxLCA1MSwgMC4zKTsKfQoKLnNtYWxscHJpbnQgewogIGZvbnQtc2l6ZTogMTJweDsKfQoKLm5vd3JhcCwgLnRleHQtbm93cmFwIHsKICB3aGl0ZS1zcGFjZTogbm93cmFwICFpbXBvcnRhbnQ7Cn0KCi5wcmUtd3JhcCB7CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwICFpbXBvcnRhbnQ7Cn0KCi50ZXh0LWxlZnQgewogIHRleHQtYWxpZ246IGxlZnQgIWltcG9ydGFudDsKfQoKLnRleHQtY2VudGVyIHsKICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDsKfQoKLnRleHQtcmlnaHQgewogIHRleHQtYWxpZ246IHJpZ2h0ICFpbXBvcnRhbnQ7Cn0KCi5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIGgzIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoudGV4dC1oaWdobGlnaHQgewogIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5pZWZpeC13b3JkLWJyZWFrIHsKICAtbXMtd29yZC1icmVhazogYnJlYWstYWxsOwp9CgoubGlnaHQtZ3JleS10ZXh0IHsKICBjb2xvcjogI2IzYjNiMzsKfQoKLmlzLWRhcmsgaW5wdXQsIC5pcy1kYXJrIHRleHRhcmVhIHsKICBmb250LWZhbWlseTogQ291cmllciwgbW9ub3NwYWNlOwp9CgouYmxvY2sgewogIGRpc3BsYXk6IGJsb2NrOwp9CgouaXMtaW5pdGlhbGx5aGlkZGVuIHsKICBkaXNwbGF5OiBub25lOwp9CgppbnB1dFt0eXBlPXN1Ym1pdF0sIGlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1yZXNldF0sIGJ1dHRvbiB7CiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgZm9udC1zaXplOiBpbmhlcml0Owp9CgouYnV0dG9uIHsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDI1cHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiAyNXB4OwogIGJvcmRlci1yYWRpdXM6IDI1cHg7CiAgLW1zLXRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgYmFja2dyb3VuZC1jb2xvcjogI2FlNzVjMzsKICBjb2xvcjogI2ZmZjsKICBmb250LXNpemU6IDE2cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgcGFkZGluZzogN3B4IDFlbTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICBtaW4td2lkdGg6IDEyMHB4Owp9Ci5idXR0b24uZGlzYWJsZWQgewogIGJvcmRlcjogMXB4IHNvbGlkICM5OTk5OTk7CiAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKICBjb2xvcjogIzY2NjY2NjsKfQouYnV0dG9uOmhvdmVyOmVuYWJsZWQsIC5idXR0b246YWN0aXZlOmVuYWJsZWQgewogIGN1cnNvcjogcG9pbnRlcjsKICBjb2xvcjogI2ZmZjsKfQouYnV0dG9uOmhvdmVyOmVuYWJsZWQgewogIC1vLXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcyBlYXNlLCBjb2xvciAwLjNzIGVhc2U7CiAgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwgY29sb3IgMC4zcyBlYXNlOwogIC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzIGVhc2UsIGNvbG9yIDAuM3MgZWFzZTsKICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwgY29sb3IgMC4zcyBlYXNlOwogIGJhY2tncm91bmQtY29sb3I6ICM5MTYwYTU7Cn0KLmJ1dHRvbjphY3RpdmU6ZW5hYmxlZCB7CiAgLW8tdHJhbnNpdGlvbjogbm9uZTsKICAtbW96LXRyYW5zaXRpb246IG5vbmU7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogIHRyYW5zaXRpb246IG5vbmU7CiAgYmFja2dyb3VuZC1jb2xvcjogIzZmNDU4MjsKfQouYnV0dG9uLmlzLWxhcmdlIHsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDIwcHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiAyMHB4OwogIGJvcmRlci1yYWRpdXM6IDIwcHg7CiAgcGFkZGluZzogNXB4IDI1cHg7CiAgbWluLXdpZHRoOiAyMDBweDsKICBmb250LXNpemU6IDI0cHg7Cn0KLmJ1dHRvbi5pcy1zbWFsbCB7CiAgcGFkZGluZzogNXB4IDEycHg7CiAgbWluLXdpZHRoOiAxMDBweDsKICBmb250LXNpemU6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE1cHg7Cn0KLmJ1dHRvbi5pcy13YXJuaW5nIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDYwMDAwOwp9Ci5idXR0b24uaXMtd2FybmluZzpob3ZlcjplbmFibGVkLCAuYnV0dG9uLmlzLXdhcm5pbmc6YWN0aXZlOmVuYWJsZWQgewogIGJhY2tncm91bmQtY29sb3I6ICNiNTAwMDA7Cn0KLmJ1dHRvbi5pcy1wb3NpdGl2ZWFjdGlvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzcwZDE2ZDsKfQouYnV0dG9uLmlzLXBvc2l0aXZlYWN0aW9uOmhvdmVyOmVuYWJsZWQsIC5idXR0b24uaXMtcG9zaXRpdmVhY3Rpb246YWN0aXZlOmVuYWJsZWQgewogIGJhY2tncm91bmQtY29sb3I6ICMwODk4MDA7Cn0KLmJ1dHRvbiBhOmhvdmVyIHsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCmJ1dHRvbi5idXR0b24gewogIGJvcmRlcjogbm9uZTsKfQoKaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9cmVzZXRdIHsKICB0ZXh0LXNpemUtYWRqdXN0OiAxMDAlOwogIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOwp9CgpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7CiAgaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9cmVzZXRdLCBidXR0b24sIC5idG4gewogICAgbWFyZ2luOiAxZW0gMDsKICB9Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpIHsKICBpbnB1dFt0eXBlPXN1Ym1pdF0sIGlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1yZXNldF0sIGJ1dHRvbiwgLmJ0biB7CiAgICBtYXJnaW46IDJlbSBhdXRvOwogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICB9Cn0KLnRvcC1saW5rcyB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogIGZsZXg6IDAgMSAxMDAlOwp9Ci50b3AtbGlua3MgLnVzZXItbGV2ZWwtYWRtaW5pc3RyYXRvciB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50b3AtbGlua3MgcCB7CiAgcGFkZGluZzogMCAxMHB4Owp9CgoudG9wLWxpbmtzIHA6bGFzdC1jaGlsZCB7CiAgZGlzcGxheTogbm9uZTsKfQoKLnNoaXBwaW5nLWluZm8gewogIGRpc3BsYXk6IGZsZXg7CiAgY29sb3I6ICMwMDcxYmM7CiAgZmxleDogMSAwIGF1dG87Cn0KCi5zaGlwcGluZy1pbmZvIGltZyB7CiAgcGFkZGluZy1yaWdodDogMTFweDsKfQoKLm5hdmlnYXRpb24taGVhZGVyIHsKICBkaXNwbGF5OiBmbGV4Owp9CgppbnB1dCwgYnV0dG9uLCBzZWxlY3QsIHRleHRhcmVhIHsKICBmb250LWZhbWlseTogaW5oZXJpdDsKICBmb250LXNpemU6IGluaGVyaXQ7Cn0KCmlucHV0LCBzZWxlY3QsIHRleHRhcmVhIHsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDA7CiAgLW1vei1ib3JkZXItcmFkaXVzOiAwOwogIGJvcmRlci1yYWRpdXM6IDA7CiAgd2lkdGg6IDEwMCU7CiAgbWluLWhlaWdodDogMS41ZW07CiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjsKICBwYWRkaW5nOiAwLjRlbTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogIGNvbG9yOiAjMzMzMzMyOwogIG1hcmdpbi1ib3R0b206IDFlbTsKICBtYXgtd2lkdGg6IDEwMCU7Cn0KaW5wdXQ6aG92ZXIsIHNlbGVjdDpob3ZlciwgdGV4dGFyZWE6aG92ZXIgewogIGJvcmRlcjogMXB4IHNvbGlkICNjYmQwZDE7Cn0KaW5wdXQ6Zm9jdXMsIHNlbGVjdDpmb2N1cywgdGV4dGFyZWE6Zm9jdXMgewogIGJvcmRlcjogMXB4IHNvbGlkICNhZTc1YzM7CiAgb3V0bGluZTogMXB4IHNvbGlkICNhZTc1YzM7Cn0KCnRleHRhcmVhIHsKICB3aWR0aDogMTAwJTsKfQoKZm9ybSB7CiAgbWF4LXdpZHRoOiA3MDBweDsKfQpmb3JtIGlucHV0W3R5cGU9dXNlcm5hbWVdLCBmb3JtIGlucHV0W3R5cGU9cGFzc3dvcmRdIHsKICBtYXgtd2lkdGg6IDUwJTsKICBkaXNwbGF5OiBibG9jazsKfQpmb3JtIGJ1dHRvbiB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbjogMWVtIDA7Cn0KCnNlbGVjdCB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwOwogIC1tb3otYm9yZGVyLXJhZGl1czogMDsKICBib3JkZXItcmFkaXVzOiAwOwogIG1hcmdpbjogNHB4IDBweDsKICBoZWlnaHQ6IDMwcHg7CiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjsKICBwYWRkaW5nOiA0cHg7CiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDsKICBjb2xvcjogIzMzMzMzMjsKICBmb250LWZhbWlseTogaW5oZXJpdDsKICBmb250LXNpemU6IGluaGVyaXQ7CiAgbWluLXdpZHRoOiAxMjBweDsKICBtYXgtd2lkdGg6IDMyMHB4Owp9CnNlbGVjdDo6LW1zLWV4cGFuZCB7CiAgZGlzcGxheTogbm9uZTsKfQpzZWxlY3Q6aG92ZXIgewogIGJvcmRlcjogMXB4IHNvbGlkICNjYmQwZDE7Cn0Kc2VsZWN0OmZvY3VzIHsKICBib3JkZXI6IDFweCBzb2xpZCAjYWU3NWMzOwp9CgouY29uZmlybWF0aW9uIHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKbGFiZWwgewogIGNvbG9yOiAjOTk5OwogIGRpc3BsYXk6IGJsb2NrOwogIGxpbmUtaGVpZ2h0OiAyNXB4Owp9Cgoubm90aWZpY2F0aW9uLWxhYnNvbHZlZC1oaWRkZW4gewogIG1heC1oZWlnaHQ6IDA7CiAgb3BhY2l0eTogMDsKICBvdmVyZmxvdzogaGlkZGVuOwogIHZpc2liaWxpdHk6IGhpZGRlbjsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZC1oaWRkZW4gLmNvbnRhaW5lciB7CiAgbWF4LWhlaWdodDogMDsKfQoKLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgewogIC1vLXRyYW5zaXRpb246IG1heC1oZWlnaHQgMC41cyBlYXNlLWluIDBzLCBvcGFjaXR5IDAuNXMgZWFzZS1pbiAwLjJzLCB0cmFuc2l0aW9uIDAuNXMgZWFzZS1pbiAwLjJzOwogIC1tb3otdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjVzIGVhc2UtaW4gMHMsIG9wYWNpdHkgMC41cyBlYXNlLWluIDAuMnMsIHRyYW5zaXRpb24gMC41cyBlYXNlLWluIDAuMnM7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1pbiAwcywgb3BhY2l0eSAwLjVzIGVhc2UtaW4gMC4ycywgdHJhbnNpdGlvbiAwLjVzIGVhc2UtaW4gMC4yczsKICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1pbiAwcywgb3BhY2l0eSAwLjVzIGVhc2UtaW4gMC4ycywgdHJhbnNpdGlvbiAwLjVzIGVhc2UtaW4gMC4yczsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2NjMzOwogIG9wYWNpdHk6IDE7CiAgbWF4LWhlaWdodDogMTAwcHg7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZFtjb21wbGV0aW9uLXR5cGU9aW5jb21wbGV0ZV0gewogIGJhY2tncm91bmQtY29sb3I6ICNmZmFmMTA7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWRbY29tcGxldGlvbi10eXBlPWluY29tcGxldGVdIC5jb250YWluZXIgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmFmMTA7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciB7CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLW1vei1ib3g7CiAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IGZsZXg7CiAgLXdlYmtpdC1ib3gtcGFjazoganVzdGlmeTsKICAtbW96LWJveC1wYWNrOiBqdXN0aWZ5OwogIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7CiAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7CiAgLW1vei1ib3gtYWxpZ246IGNlbnRlcjsKICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIC1vLXRyYW5zaXRpb246IG1heC1oZWlnaHQgMC41cyBlYXNlLWluIDBzLCBwYWRkaW5nIDAuNXMgZWFzZS1pbiAwczsKICAtbW96LXRyYW5zaXRpb246IG1heC1oZWlnaHQgMC41cyBlYXNlLWluIDBzLCBwYWRkaW5nIDAuNXMgZWFzZS1pbiAwczsKICAtd2Via2l0LXRyYW5zaXRpb246IG1heC1oZWlnaHQgMC41cyBlYXNlLWluIDBzLCBwYWRkaW5nIDAuNXMgZWFzZS1pbiAwczsKICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1pbiAwcywgcGFkZGluZyAwLjVzIGVhc2UtaW4gMHM7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNjYzMzsKICBtYXJnaW46IDAgYXV0bzsKICBtYXgtaGVpZ2h0OiAxMDBweDsKICBwYWRkaW5nOiBjYWxjKGNhbGMoMSAqIHZhcigtLXNwYWNpbmdiYXNlKSkgLSAzcHgpIDAgY2FsYygxICogdmFyKC0tc3BhY2luZ2Jhc2UpKSAwOwp9Ci5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgaDQgewogIGZsZXg6IDE7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmctcmlnaHQ6IDEwcHg7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBzcGFuIHsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgaDQsIC5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgYSwgLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBzcGFuIHsKICBjb2xvcjogI2ZmZjsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGEgewogIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWZsZXg7CiAgZGlzcGxheTogLW1zLWlubGluZS1mbGV4Ym94OwogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7CiAgLW1vei1ib3gtYWxpZ246IGNlbnRlcjsKICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBhLmJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMjsKICBib3JkZXItcmFkaXVzOiAwOwogIG1pbi13aWR0aDogMDsKICBwYWRkaW5nOiAwIDVweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGEuYnV0dG9uOmhvdmVyIHsKICBjb2xvcjogIzMzMzMzMjsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGEuYnV0dG9uIHN2ZyB7CiAgZmlsbDogY3VycmVudENvbG9yOwogIHBhZGRpbmctcmlnaHQ6IDVweDsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGE6bGFzdC1jaGlsZCB7CiAgLW8tdHJhbnNpdGlvbjogY29sb3IgMC4ycywgZmlsbCAwLjJzOwogIC1tb3otdHJhbnNpdGlvbjogY29sb3IgMC4ycywgZmlsbCAwLjJzOwogIC13ZWJraXQtdHJhbnNpdGlvbjogY29sb3IgMC4ycywgZmlsbCAwLjJzOwogIHRyYW5zaXRpb246IGNvbG9yIDAuMnMsIGZpbGwgMC4yczsKICBwYWRkaW5nLWxlZnQ6IDIwcHg7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBhOmxhc3QtY2hpbGQgc3ZnIHsKICBmaWxsOiBjdXJyZW50Q29sb3I7CiAgcGFkZGluZy1sZWZ0OiA1cHg7CiAgaGVpZ2h0OiAxMnB4Owp9Ci5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgYTpsYXN0LWNoaWxkOmhvdmVyIHsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgY29sb3I6ICMzMzMzMzI7Cn0KCi5zZWFyY2gsIC5zZWFyY2gtZmlsdGVycywgLmxvZ2luLWZvcm0gewogIGJhY2tncm91bmQ6ICNlYmYwZjI7CiAgcGFkZGluZzogMWVtOwp9Ci5zZWFyY2ggaW5wdXQsIC5zZWFyY2ggdGV4dGFyZWEsIC5zZWFyY2gtZmlsdGVycyBpbnB1dCwgLnNlYXJjaC1maWx0ZXJzIHRleHRhcmVhLCAubG9naW4tZm9ybSBpbnB1dCwgLmxvZ2luLWZvcm0gdGV4dGFyZWEgewogIGJhY2tncm91bmQ6IHdoaXRlOwp9Ci5zZWFyY2ggaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIsIC5zZWFyY2ggdGV4dGFyZWE6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIsIC5zZWFyY2gtZmlsdGVycyBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyLCAubG9naW4tZm9ybSBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciwgLmxvZ2luLWZvcm0gdGV4dGFyZWE6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogIGNvbG9yOiAjOTk5Owp9Ci5zZWFyY2ggaW5wdXQ6LW1vei1wbGFjZWhvbGRlciwgLnNlYXJjaCB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyLCAuc2VhcmNoLWZpbHRlcnMgaW5wdXQ6LW1vei1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIHRleHRhcmVhOi1tb3otcGxhY2Vob2xkZXIsIC5sb2dpbi1mb3JtIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIsIC5sb2dpbi1mb3JtIHRleHRhcmVhOi1tb3otcGxhY2Vob2xkZXIgewogIGNvbG9yOiAjOTk5Owp9Ci5zZWFyY2ggaW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIsIC5zZWFyY2ggdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXIsIC5zZWFyY2gtZmlsdGVycyBpbnB1dDo6LW1vei1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIHRleHRhcmVhOjotbW96LXBsYWNlaG9sZGVyLCAubG9naW4tZm9ybSBpbnB1dDo6LW1vei1wbGFjZWhvbGRlciwgLmxvZ2luLWZvcm0gdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXIgewogIGNvbG9yOiAjOTk5Owp9Ci5zZWFyY2ggaW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyLCAuc2VhcmNoIHRleHRhcmVhOi1tcy1pbnB1dC1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIGlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIHRleHRhcmVhOi1tcy1pbnB1dC1wbGFjZWhvbGRlciwgLmxvZ2luLWZvcm0gaW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyLCAubG9naW4tZm9ybSB0ZXh0YXJlYTotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogIGNvbG9yOiAjOTk5Owp9CgoubG9naW4tZm9ybSBpbWcgewogIG1hcmdpbi1yaWdodDogMWVtOwogIHdpZHRoOiA1ZW07Cn0KCi5zZWFyY2ggewogIGNvbG9yOiB3aGl0ZTsKfQouc2VhcmNoIGZvcm0gewogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC1tb3otYm94OwogIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiBmbGV4OwogIG1hcmdpbjogMCBhdXRvOwp9Ci5zZWFyY2ggZm9ybSBpbnB1dCB7CiAgLW1vei1mbGV4OiAxIDEgYXV0bzsKICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogIC1tcy1mbGV4OiAxIDEgYXV0bzsKICBmbGV4OiAxIDEgYXV0bzsKICBtYXJnaW4tYm90dG9tOiAwOwp9Ci5zZWFyY2ggZm9ybSBpbnB1dDpob3ZlciB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NiZDBkMTsKfQouc2VhcmNoIGZvcm0gaW5wdXQ6Zm9jdXMgewogIGJvcmRlcjogMXB4IHNvbGlkICNhZTc1YzM7CiAgb3V0bGluZTogMXB4IHNvbGlkICNhZTc1YzM7Cn0KLnNlYXJjaCBmb3JtIGJ1dHRvbiB7CiAgbWFyZ2luOiAwIDAgMCAwLjZlbTsKfQoKLnNlYXJjaC1maWx0ZXJzIHsKICBjb2xvcjogd2hpdGU7Cn0KLnNlYXJjaC1maWx0ZXJzIGEgewogIGJvcmRlcjogMXB4IHNvbGlkIHdoaXRlOwogIHBhZGRpbmc6IDRweCA1cHg7CiAgbWFyZ2luOiAzcHggMDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLnNlYXJjaC1maWx0ZXJzIGE6aG92ZXIgewogIC1vLXRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycyBsaW5lYXI7CiAgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnMgbGluZWFyOwogIC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzIGxpbmVhcjsKICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnMgbGluZWFyOwogIGJhY2tncm91bmQ6ICNmZmY7CiAgYm9yZGVyOiAxcHggc29saWQgI2NiZDBkMTsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KLnNlYXJjaC1maWx0ZXJzIGE6Zm9jdXMgewogIGJvcmRlcjogMXB4IHNvbGlkICNhZTc1YzM7Cn0KCiNteXN0ZXJ5T2JqZWN0aXZlIHsKICBtYXJnaW4tdG9wOiAwLjVlbTsKfQoKI215c3RlcnlPYmplY3RpdmUucmV2ZWFsZWQgewogIGZvbnQtc2l6ZTogMC44ZW07Cn0KCiNteXN0ZXJ5UmV2ZWFsLCAjbXlzdGVyeUxpbmsgewogIGN1cnNvcjogcG9pbnRlcjsKfQoKW3RoZW1lPWJsb2ddIHsKICBtYXJnaW46IGF1dG87Cn0KW3RoZW1lPWJsb2ddIGgxIHsKICBmb250LXNpemU6IDEuOGVtOwp9Clt0aGVtZT1ibG9nXSBoMiB7CiAgZm9udC1zaXplOiAxLjVlbTsKfQpbdGhlbWU9YmxvZ10gLmJsb2ctaGVhZGVyIHsKICBtYXJnaW46IDIuNWVtIDAgMmVtIDA7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9Clt0aGVtZT1ibG9nXSAuYmxvZy1oZWFkZXIgaW1nIHsKICB3aWR0aDogMzUwcHg7Cn0KW3RoZW1lPWJsb2ddIC5jb21tZW50IHsKICBib3JkZXItdG9wOiAxcHggc29saWQgI2ViZjBmMjsKICBtYXJnaW46IDFlbSAwOwogIHBhZGRpbmctdG9wOiAxZW07Cn0KW3RoZW1lPWJsb2ddIC5jb21tZW50IGltZyB7CiAgZmxvYXQ6IGxlZnQ7CiAgbWFyZ2luLXJpZ2h0OiAxZW07CiAgd2lkdGg6IDEuNmVtOwp9Clt0aGVtZT1ibG9nXSAuYWRkLWNvbW1lbnQgLmJ1dHRvbiB7CiAgZGlzcGxheTogdGFibGU7CiAgbWFyZ2luOiAxZW0gMDsKfQpbdGhlbWU9YmxvZ10gLmFkZC1jb21tZW50IGltZyB7CiAgd2lkdGg6IDVlbTsKfQpbdGhlbWU9YmxvZ10gLmJsb2ctdG9wLWxpbmtzIHsKICB0ZXh0LWFsaWduOiByaWdodDsKfQpbdGhlbWU9YmxvZ10gLmNvbnRhaW5lci5pcy1wYWdlIHsKICB3aWR0aDogNzAwcHg7Cn0KW3RoZW1lPWJsb2ddIC5ibG9nLWxpc3QgewogIHdpZHRoOiA3MDBweDsKICBtYXJnaW46IDJlbSBhdXRvOwp9Clt0aGVtZT1ibG9nXSAuYmxvZy1saXN0IGEuYnV0dG9uIHsKICBtYXJnaW4tYm90dG9tOiAyZW07CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Clt0aGVtZT1ibG9nXSAuYmxvZy1saXN0IGEgaW1nIHsKICBib3JkZXItdG9wOiAxcHggc29saWQgI2U2ZTZlNjsKICBwYWRkaW5nLXRvcDogMmVtOwp9Clt0aGVtZT1ibG9nXSAuYmxvZy1saXN0IGEgaW1nOmZpcnN0LWNoaWxkIHsKICBib3JkZXItdG9wOiAwOwogIHBhZGRpbmctdG9wOiAwOwp9CgovKiMgc291cmNlTWFwcGluZ1VSTD1sYWJzQmxvZy5jc3MubWFwICovCg==","response_hash":"32038b1a140d3eb2f543ef89c0e82c8510306ca5baee8df28c2ece5bf0ea0b4a","response_time_ms":0,"response_words":2652,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"css","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":18},{"name":"3","value":"labsBlog.css","type":"path","name_start":-1,"name_end":-1,"value_start":19,"value_end":31}],"sent_at":"2026-04-05T05:32:16.09017Z","received_at":"2026-04-05T05:32:16.090163Z","created_at":"2026-04-05T05:32:16Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"e21eaab2-5462-44f6-99e2-23e142813572","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/blog","url":"https://ginandjuice.shop/blog","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"Upgrade-Insecure-Requests":["1"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9ibG9nIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpVcGdyYWRlLUluc2VjdXJlLVJlcXVlc3RzOiAxDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE0LjAuMC4wIFNhZmFyaS81MzcuMzYNCkFjY2VwdC1MYW5ndWFnZTogZW4NClJlZmVyZXI6IGh0dHBzOi8vZ2luYW5kanVpY2Uuc2hvcC8NCg0K","request_hash":"fbcd993fa2e859ee5f7b0ffe00d4e5e91643a80c60938ad6de54fc4db1d6e896","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"content-encoding":["gzip"],"content-length":["2679"],"content-type":["text/html; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:32:15 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/html; charset=utf-8","response_content_length":10965,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LWxlbmd0aDogMjY3OQ0KY29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzI6MTUgR01UDQp4LWJhY2tlbmQ6IGM5OGRmNWM0LWE1MjctNGRhYS04OGNkLTgzYzVkZTRlN2M3Nw0KeC1mcmFtZS1vcHRpb25zOiBTQU1FT1JJR0lODQpjb250ZW50LWVuY29kaW5nOiBnemlwDQoNCjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KPCEtLUxBQl9IRUFEX1NUQVJULS0+CiAgICA8aGVhZD4KICAgICAgICA8bGluayBocmVmPS9yZXNvdXJjZXMvbGFiaGVhZGVyL2Nzcy9zY2FuTWVIZWFkZXIuY3NzIHJlbD1zdHlsZXNoZWV0PgogICAgICAgIDxsaW5rIGhyZWY9L3Jlc291cmNlcy9jc3MvbGFic0Jsb2cuY3NzIHJlbD1zdHlsZXNoZWV0PgogICAgICAgIDxsaW5rIGhyZWY9L3Jlc291cmNlcy9jc3MvbGFic1NjYW5tZS5jc3MgcmVsPXN0eWxlc2hlZXQ+CiAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyI+CiAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvanMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiPjwvc2NyaXB0PgogICAgICAgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3Jlc291cmNlcy9qcy9hbmd1bGFyXzEtNy03LmpzIj48L3NjcmlwdD4KICAgICAgICA8dGl0bGU+QmxvZyAtIEdpbiAmYW1wOyBKdWljZSBTaG9wPC90aXRsZT4KICAgIDwvaGVhZD4KPCEtLUxBQl9IRUFEX0VORC0tPgogICAgPGJvZHkgbmctYXBwPgogICAgICAgIDxkaXYgaWQ9InNjYW5NZUhlYWRlciI+CiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJoZWFkZXItZGVzY3JpcHRpb24iPgogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIGRlbGliZXJhdGVseSB2dWxuZXJhYmxlIHdlYiBhcHBsaWNhdGlvbiBkZXNpZ25lZCBmb3IgdGVzdGluZyB3ZWImbmJzcDt2dWxuZXJhYmlsaXR5Jm5ic3A7c2Nhbm5lcnMuCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpbmsiIG9ubW91c2VlbnRlcj0id2luZG93Ll9feDEgPSAxIiBvbm1vdXNlb3Zlcj0id2luZG93Ll9feDIgPSAxIiBvbm1vdXNlbW92ZT0id2luZG93Ll9feDMgPSAxIiAgb25tb3VzZWRvd249IndpbmRvdy5fX3g0ID0gMSIgb25tb3VzZXVwPSJpZiAod2luZG93Ll9feDEgJiYgd2luZG93Ll9feDIgJiYgd2luZG93Ll9feDMgJiYgd2luZG93Ll9feDQpIGxvY2F0aW9uID0gYXRvYignTDNaMWJHNWxjbUZpYVd4cGRHbGxjdz09JykiIG9ubW91c2VsZWF2ZT0iZGVsZXRlIHdpbmRvdy5fX3gxOyBkZWxldGUgd2luZG93Ll9feDI7IGRlbGV0ZSB3aW5kb3cuX194MzsgZGVsZXRlIHdpbmRvdy5fX3g0Ij5QdXQgeW91ciBzY2FubmVyIHRvIHRoZSB0ZXN0ITwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0nc2Nhbk1lQmFubmVyJz4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Y29udGFpbmVyPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy8nPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXNjYW5tZS1sb2dvPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXRpdGxlLWNvbnRhaW5lcj4KICAgICAgICAgICAgICAgICAgICAgICAgPG5hdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3MgcHJpbWFyeS1saW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvY2F0YWxvZyI+UHJvZHVjdHM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2VsZWN0ZWQiIGhyZWY9Ii9ibG9nIj5CbG9nPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvYWJvdXQiPk91ciBzdG9yeTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3Mgc2Vjb25kYXJ5LWxpbmtzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJhY2NvdW50LWljb24iIGhyZWY9Ii9teS1hY2NvdW50Ij48c3ZnPjx1c2UgaHJlZj0iL3Jlc291cmNlcy9pbWFnZXMvaWNvbi1hY2NvdW50LnN2ZyNhY2NvdW50LWljb24iPjwvdXNlPjwvc3ZnPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9teS1hY2NvdW50Ij5Mb2cgaW48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9teS1hY2NvdW50Ij5NeSBhY2NvdW50PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImNhcnQtaWNvbiIgaHJlZj0iL2NhdGFsb2cvY2FydCI+PHNwYW4+MDwvc3Bhbj48c3ZnPjx1c2UgaHJlZj0iL3Jlc291cmNlcy9pbWFnZXMvaWNvbi1jYXJ0LnN2ZyNjYXJ0LWljb24iPjwvdXNlPjwvc3ZnPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXRvZ2dsZSI+PGEgY2xhc3M9Im5hdi10cmlnZ2VyIj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmF2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHRoZW1lPSJibG9nIj4KICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9Im1haW5jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGlzLXBhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxoZWFkZXIgY2xhc3M9Im5vdGlmaWNhdGlvbi1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDwvaGVhZGVyPgogICAgICAgICAgICAgICAgICAgIDxoMT5CbG9nPC9oMT4KICAgICAgICAgICAgICAgICAgICA8c2NyaXB0IHNyYz0nL3Jlc291cmNlcy9qcy9kZXBhcmFtLmpzJz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Jy9yZXNvdXJjZXMvanMvc2VhcmNoTG9nZ2VyLmpzJz48L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1zZWFyY2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0vYmxvZy8gbWV0aG9kPUdFVD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPXRleHQgcGxhY2Vob2xkZXI9J1NlYXJjaCB0aGUgYmxvZy4uLicgbmFtZT1zZWFyY2g+CiAgICAgICAgPGlucHV0IHR5cGU9aGlkZGVuIG5hbWU9YmFjayB2YWx1ZT0iL2Jsb2cvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1zdWJtaXQgY2xhc3M9YnV0dG9uPlNlYXJjaDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJibG9nLWxpc3QiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJibG9nLXBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD0zIj48aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9ibG9nL3Bvc3RzLzUuanBnIj48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5BIEhhaXJ5IERheTwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPllvIGR1ZGVzISBDYXJsb3MgaGVyZSBhZ2Fpbi4gSSB3YW50IHRvIHRlbGwgeW91IGFib3V0IHdoYXQgaGFwcGVuZWQgaW4gdGhlIHN0b3JlIHRoZSBvdGhlciBkYXkuIE1hbiwgSSB3YXMgZ2V0dGluZyBzbyB0aWdodCBvdmVyIGl0IEkgdGhvdWdodCBJ4oCZZCBidXN0IGEgYmxvb2QgdmVzc2VsLiBTbywgSSBnZXQgdGhpcyBwaG9uZSBjYWxsLi4uPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIGlzLXNtYWxsIiBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD0zIj5WaWV3IHBvc3Q8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJibG9nLXBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD00Ij48aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9ibG9nL3Bvc3RzLzMuanBnIj48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5UaGUgQ29tcGxhaW50PC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+TXkgbWFpbiBtYW4gUGV0ZXIgV2llbmVyIGNhbGxlZCBieSB0aGUgb3RoZXIgZGF5IHdpdGggc29tZSBjb2ZmZWUgYW5kIGNyb2lzc2FudHMsIEkgZG9u4oCZdCBrbm93IHdobyBoZSB0aGlua3MgaGUgaXMsIGdvbmUgYWxsIHBvc2ggYW5kIHRoZSBsaWtlLiBBbnl3YXlzLCB3ZeKAmXJlIGp1c+KAmSBoYXZpbuKAmSBhIGNoYXQsIFdpZW5lciB3YXMganVz4oCZIHNheWlu4oCZIGhpcy4uLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBpcy1zbWFsbCIgaHJlZj0iL2Jsb2cvcG9zdD9wb3N0SWQ9NCI+VmlldyBwb3N0PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmxvZy1wb3N0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2Jsb2cvcG9zdD9wb3N0SWQ9NiI+PGltZyBzcmM9Ii9pbWFnZS9zY2FubWUvYmxvZy9wb3N0cy80LmpwZyI+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8aDI+VHJhaW5pbmcgRGF5PC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhleSBzYXkgbm8gbWFuIGlzIGFuIElzbGFuZC4gSSBkb27igJl0IGtub3cgd2h5IHRoZXkgc2F5IGl0LCBvciB3aGF0IGl0IHJlYWxseSBtZWFucywgYnV0IEkgdGhpbmsgaXQgbWVhbnMgd2UgZG9u4oCZdCB3b3JrIGFsb25lLiBBbnl3YXlzLCBteSBsaXR0bGUgc3RvcmUgaGFzIGEgY291cGxlIG9mIGludmVzdG9ycywgdGhleSBnYXZlIG1lLi4uPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIGlzLXNtYWxsIiBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD02Ij5WaWV3IHBvc3Q8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJibG9nLXBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD0yIj48aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9ibG9nL3Bvc3RzLzYuanBnIj48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5UaGUgVGhpcmQgV2hlZWw8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5ZbyBob21pZXMhIEkgd2FubmEgdGVsbCB5YSBhYm91dCBHaW5ueeKAmXMgYmlydGhkYXkgbGFzdCB3ZWVrLiBJIHdhcyBkZWFkIGhhcHB5IHRoYXQgbWUgYW5kIEdpbiB3ZXJlIHN0aWxsIHRvZ2V0aGVyIGZvciBoZXIgYmlydGhkYXkgYW5kIHdhbnRlZCB0byBtYWtlIGl0IHJlYWwgc3BlY2lhbCAtIHNoZSBpcyBteSBnaXJsZnJpZW5kIGFmdGVyIGFsbC4gU28sLi4uPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIGlzLXNtYWxsIiBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD0yIj5WaWV3IHBvc3Q8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJibG9nLXBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD01Ij48aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9ibG9nL3Bvc3RzLzEuanBnIj48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5DYXJsb3MgTW9udG95YSB2cyBQZXRlciBXaWVuZXI8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5JZiB5b3Uga25vdyBtZSwgeW914oCZbGwga25vdyBteSBob21pZSBQZXRlciBXaWVuZXIgaXMgYWx3YXlzIHBsYXlpbuKAmSBwcmFua3Mgb24gbWUsIHNvbWUgb2YgdGhlIHN0dW50cyBoZeKAmXMgcHVsbGVkIGhhdmUgYmVlbiBhIHJpZ2h0IGhlYWRhY2hlLiBTbywgb25lIGRheSBJIGRlY2lkZXMgaXTigJlzIHRpbWUgdG8gZ2V0IG15IG93biBiYWNrLiBJLi4uPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIGlzLXNtYWxsIiBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD01Ij5WaWV3IHBvc3Q8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJibG9nLXBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD0xIj48aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9ibG9nL3Bvc3RzLzIuanBnIj48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5NZWV0aW5nIEdpbm55PC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+SXTigJlzIG5vdCBhIGNvaW5jaWRlbmNlIEkgaGF2ZSBhIGdpcmxmcmllbmQgY2FsbGVkIEdpbm55LCB3aXRoIG1lIHJ1bm5pbuKAmSBhIEdpbiAmIEp1aWNlIHN0b3JlIGFu4oCZIGFsbC4gSSB3YW50ZWQgYSBnaXJsZnJpZW5kIHdobyB3b3VsZCBzdWl0IG15IGxpZmVzdHlsZSwgeW91IGtub3cgd2hhdCBJIG1lYW4/IFNvIEkgd2VudCBzcGVlZCBkYXRpbmcgd2l0aC4uLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBpcy1zbWFsbCIgaHJlZj0iL2Jsb2cvcG9zdD9wb3N0SWQ9MSI+VmlldyBwb3N0PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItd3JhcHBlciI+CiAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItbGVmdCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5OZXZlciBtaXNzIGEgZGVhbCAtIHN1YnNjcmliZSBub3c8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5Kb2luIG91ciB3b3JsZHdpZGUgY29tbXVuaXR5IG9mIGdpbiBhbmQganVpY2UgZmFuYXRpY3MsIGZvciBleGNsdXNpdmUgbmV3cyBvbiBvdXIgbGF0ZXN0IGRlYWxzLCBuZXcgcmVsZWFzZXMsIGNvbGxhYm9yYXRpb25zLCBhbmQgbW9yZS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPScvcmVzb3VyY2VzL2pzL3N1YnNjcmliZU5vdy5qcyc+PC9zY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InN1YnNjcmliZSIgY2xhc3M9ImZvcm0iIGRhdGEtbWV0aG9kPSJwb3N0IiBkYXRhLWFjdGlvbj0iL2NhdGFsb2cvc3Vic2NyaWJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWVtYWlsIG5hbWU9ZW1haWwgcGxhY2Vob2xkZXI9IkVtYWlsIGFkZHJlc3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9ImhpZGRlbiIgbmFtZT0iY3NyZiIgdmFsdWU9IlJ6Skx0QlE3SFdMM3RvWlJ6dGEwZnkzRmNJTkxpZEd6Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ1dHRvbiIgdHlwZT1zdWJtaXQ+U3Vic2NyaWJlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGlhbG9nIGlkPSJjb3Vwb24tZGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdXBvbi13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjbG9zZS1idXR0b24iIG9uY2xpY2s9ImNsb3NlQ291cG9uRGlhbG9nKGV2ZW50KSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY291cG9uLWluZm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDE+MjAlIG9mZiBldmVyeXRoaW5nPC9oMT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY291cG9uLWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBpZD0iY29weWFibGUtY291cG9uIj5Db3Vwb24gbm90IGZvdW5kPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImNvcHktY291cG9uLWJ1dHRvbiIgY2xhc3M9ImNvcHktYnV0dG9uIiBvbmNsaWNrPSJjb3B5Q291cG9uKGV2ZW50KSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjb3Vwb24tY29waWVkLXRpY2siIGNsYXNzPSJjb3Vwb24tY29waWVkLXRpY2sgaGlkZGVuIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFwcGx5IHRoaXMgY291cG9uIHRvIHlvdXIgU2hvcHBpbmcgQ2FydCBiZWZvcmUgcGxhY2luZyB5b3VyIG9yZGVyLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2RpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWNvcHlyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwb3J0c3dpZ2dlci1sb2dvIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+wqkgMjAyMyBQb3J0U3dpZ2dlciBMdGQuPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1yaWdodCI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iZm9vdGVyLWxvd2VyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXJOYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic29jaWFsTGlua3MiPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPG5hdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3MgcHJpbWFyeS1saW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvY2F0YWxvZyI+UHJvZHVjdHM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2VsZWN0ZWQiIGhyZWY9Ii9ibG9nIj5CbG9nPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvYWJvdXQiPk91ciBzdG9yeTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9uYXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxzY3JpcHQgc3JjPScvcmVzb3VyY2VzL2Zvb3Rlci9qcy9zY2FubWUuanMnPjwvc2NyaXB0PgogICAgPC9ib2R5Pgo8L2h0bWw+Cg==","response_hash":"fb7344a857f62c798ebdaae08261c8a41675bb7970ec01eac7b42208a9fb5140","response_time_ms":0,"response_words":693,"has_response":true,"response_title":"Blog - Gin & Juice Shop","parameters":[{"name":"1","value":"blog","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":9}],"sent_at":"2026-04-05T05:32:15.891194Z","received_at":"2026-04-05T05:32:15.89119Z","created_at":"2026-04-05T05:32:15Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"e7a513bb-0a69-4059-8324-6bf91738db71","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/login","url":"https://ginandjuice.shop/login","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Upgrade-Insecure-Requests":["1"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9sb2dpbiBIVFRQLzEuMQ0KSG9zdDogZ2luYW5kanVpY2Uuc2hvcA0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KVXBncmFkZS1JbnNlY3VyZS1SZXF1ZXN0czogMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2DQoNCg==","request_hash":"4ae8aca32c8172ceb56cffca5773887dce57ac27f8c1e71ccce1196f37627694","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"content-encoding":["gzip"],"content-length":["1827"],"content-type":["text/html; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:31:53 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/html; charset=utf-8","response_content_length":7493,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LWxlbmd0aDogMTgyNw0KY29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzE6NTMgR01UDQp4LWJhY2tlbmQ6IGM5OGRmNWM0LWE1MjctNGRhYS04OGNkLTgzYzVkZTRlN2M3Nw0KeC1mcmFtZS1vcHRpb25zOiBTQU1FT1JJR0lODQpjb250ZW50LWVuY29kaW5nOiBnemlwDQoNCjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KPCEtLUxBQl9IRUFEX1NUQVJULS0+CiAgICA8aGVhZD4KICAgICAgICA8bGluayBocmVmPS9yZXNvdXJjZXMvbGFiaGVhZGVyL2Nzcy9zY2FuTWVIZWFkZXIuY3NzIHJlbD1zdHlsZXNoZWV0PgogICAgICAgIDxsaW5rIGhyZWY9L3Jlc291cmNlcy9jc3MvbGFic1NjYW5tZS5jc3MgcmVsPXN0eWxlc2hlZXQ+CiAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyI+CiAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvanMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiPjwvc2NyaXB0PgogICAgICAgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3Jlc291cmNlcy9qcy9hbmd1bGFyXzEtNy03LmpzIj48L3NjcmlwdD4KICAgICAgICA8dGl0bGU+TG9naW4gLSBHaW4gJmFtcDsgSnVpY2UgU2hvcDwvdGl0bGU+CiAgICA8L2hlYWQ+CjwhLS1MQUJfSEVBRF9FTkQtLT4KICAgIDxib2R5IG5nLWFwcD4KICAgICAgICA8ZGl2IGlkPSJzY2FuTWVIZWFkZXIiPgogICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iaGVhZGVyLWRlc2NyaXB0aW9uIj4KICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBkZWxpYmVyYXRlbHkgdnVsbmVyYWJsZSB3ZWIgYXBwbGljYXRpb24gZGVzaWduZWQgZm9yIHRlc3Rpbmcgd2ViJm5ic3A7dnVsbmVyYWJpbGl0eSZuYnNwO3NjYW5uZXJzLgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaW5rIiBvbm1vdXNlZW50ZXI9IndpbmRvdy5fX3gxID0gMSIgb25tb3VzZW92ZXI9IndpbmRvdy5fX3gyID0gMSIgb25tb3VzZW1vdmU9IndpbmRvdy5fX3gzID0gMSIgIG9ubW91c2Vkb3duPSJ3aW5kb3cuX194NCA9IDEiIG9ubW91c2V1cD0iaWYgKHdpbmRvdy5fX3gxICYmIHdpbmRvdy5fX3gyICYmIHdpbmRvdy5fX3gzICYmIHdpbmRvdy5fX3g0KSBsb2NhdGlvbiA9IGF0b2IoJ0wzWjFiRzVsY21GaWFXeHBkR2xsY3c9PScpIiBvbm1vdXNlbGVhdmU9ImRlbGV0ZSB3aW5kb3cuX194MTsgZGVsZXRlIHdpbmRvdy5fX3gyOyBkZWxldGUgd2luZG93Ll9feDM7IGRlbGV0ZSB3aW5kb3cuX194NCI+UHV0IHlvdXIgc2Nhbm5lciB0byB0aGUgdGVzdCE8L3NwYW4+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9J3NjYW5NZUJhbm5lcic+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPWNvbnRhaW5lcj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPScvJz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1zY2FubWUtbG9nbz48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz10aXRsZS1jb250YWluZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxuYXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdmlnYXRpb24taGVhZGVyLWxpbmtzIHByaW1hcnktbGlua3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2NhdGFsb2ciPlByb2R1Y3RzPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvYmxvZyI+QmxvZzwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2Fib3V0Ij5PdXIgc3Rvcnk8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdmlnYXRpb24taGVhZGVyLWxpbmtzIHNlY29uZGFyeS1saW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYWNjb3VudC1pY29uIHNlbGVjdGVkIiBocmVmPSIvbXktYWNjb3VudCI+PHN2Zz48dXNlIGhyZWY9Ii9yZXNvdXJjZXMvaW1hZ2VzL2ljb24tYWNjb3VudC5zdmcjYWNjb3VudC1pY29uIj48L3VzZT48L3N2Zz48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvbXktYWNjb3VudCI+TG9nIGluPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvbXktYWNjb3VudCI+TXkgYWNjb3VudDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJjYXJ0LWljb24iIGhyZWY9Ii9jYXRhbG9nL2NhcnQiPjxzcGFuPjA8L3NwYW4+PHN2Zz48dXNlIGhyZWY9Ii9yZXNvdXJjZXMvaW1hZ2VzL2ljb24tY2FydC5zdmcjY2FydC1pY29uIj48L3VzZT48L3N2Zz48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9Im5hdi10b2dnbGUiPjxhIGNsYXNzPSJuYXYtdHJpZ2dlciI+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICA8L25hdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiB0aGVtZT0ibG9naW4iPgogICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0ibWFpbmNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIgaXMtcGFnZSI+CiAgICAgICAgICAgICAgICAgICAgPGhlYWRlciBjbGFzcz0ibm90aWZpY2F0aW9uLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPC9oZWFkZXI+CiAgICAgICAgICAgICAgICAgICAgPGgxPkxvZ2luPC9oMT4KICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9bG9naW4tZm9ybSBtZXRob2Q9UE9TVCBhY3Rpb249Ii9sb2dpbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjc3JmIiB2YWx1ZT0iaUhWaGswYzhObFNLTmNFZklLN2F1ZHRiZzk1WVhRZ3IiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PGI+VXNlcm5hbWU8L2I+IGNhcmxvczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0YWJpbmRleD0wIHBsYWNlaG9sZGVyPSJVc2VybmFtZSIgcmVxdWlyZWQgdHlwZT11c2VybmFtZSBuYW1lPSJ1c2VybmFtZSIgYXV0b2ZvY3VzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1idXR0b24gdHlwZT1zdWJtaXQ+IExvZyBpbiA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci13cmFwcGVyIj4KICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJmb290ZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1sZWZ0Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgyPk5ldmVyIG1pc3MgYSBkZWFsIC0gc3Vic2NyaWJlIG5vdzwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkpvaW4gb3VyIHdvcmxkd2lkZSBjb21tdW5pdHkgb2YgZ2luIGFuZCBqdWljZSBmYW5hdGljcywgZm9yIGV4Y2x1c2l2ZSBuZXdzIG9uIG91ciBsYXRlc3QgZGVhbHMsIG5ldyByZWxlYXNlcywgY29sbGFib3JhdGlvbnMsIGFuZCBtb3JlLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdCBzcmM9Jy9yZXNvdXJjZXMvanMvc3Vic2NyaWJlTm93LmpzJz48L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ic3Vic2NyaWJlIiBjbGFzcz0iZm9ybSIgZGF0YS1tZXRob2Q9InBvc3QiIGRhdGEtYWN0aW9uPSIvY2F0YWxvZy9zdWJzY3JpYmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9ZW1haWwgbmFtZT1lbWFpbCBwbGFjZWhvbGRlcj0iRW1haWwgYWRkcmVzcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjc3JmIiB2YWx1ZT0ibTVyWHJMSkdOZ0Y4MFIyVE9kaEZ4S29aTmtIa0lqQkEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnV0dG9uIiB0eXBlPXN1Ym1pdD5TdWJzY3JpYmU8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaWFsb2cgaWQ9ImNvdXBvbi1kaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY291cG9uLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNsb3NlLWJ1dHRvbiIgb25jbGljaz0iY2xvc2VDb3Vwb25EaWFsb2coZXZlbnQpIj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Vwb24taW5mbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMT4yMCUgb2ZmIGV2ZXJ5dGhpbmc8L2gxPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Vwb24taW5wdXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGlkPSJjb3B5YWJsZS1jb3Vwb24iPkNvdXBvbiBub3QgZm91bmQ8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iY29weS1jb3Vwb24tYnV0dG9uIiBjbGFzcz0iY29weS1idXR0b24iIG9uY2xpY2s9ImNvcHlDb3Vwb24oZXZlbnQpIj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImNvdXBvbi1jb3BpZWQtdGljayIgY2xhc3M9ImNvdXBvbi1jb3BpZWQtdGljayBoaWRkZW4iPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXBwbHkgdGhpcyBjb3Vwb24gdG8geW91ciBTaG9wcGluZyBDYXJ0IGJlZm9yZSBwbGFjaW5nIHlvdXIgb3JkZXIuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGlhbG9nPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItY29weXJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBvcnRzd2lnZ2VyLWxvZ28iPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj7CqSAyMDIzIFBvcnRTd2lnZ2VyIEx0ZC48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLXJpZ2h0Ij48L2Rpdj4KICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJmb290ZXItbG93ZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlck5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzb2NpYWxMaW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bmF2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBwcmltYXJ5LWxpbmtzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9jYXRhbG9nIj5Qcm9kdWN0czwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2Jsb2ciPkJsb2c8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9hYm91dCI+T3VyIHN0b3J5PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICA8L25hdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNjcmlwdCBzcmM9Jy9yZXNvdXJjZXMvZm9vdGVyL2pzL3NjYW5tZS5qcyc+PC9zY3JpcHQ+CiAgICA8L2JvZHk+CjwvaHRtbD4K","response_hash":"e3b595c9d4cb3538216c71cc9aff11c339942e9f386f8dd485abd2824d584d8a","response_time_ms":0,"response_words":366,"has_response":true,"response_title":"Login - Gin & Juice Shop","parameters":[{"name":"1","value":"login","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":10}],"sent_at":"2026-04-05T05:31:53.493711Z","received_at":"2026-04-05T05:31:53.493707Z","created_at":"2026-04-05T05:31:53Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"89220e1b-9610-4ba0-989f-c3bcc86d89d3","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/catalog/product?productId=11","url":"https://ginandjuice.shop/catalog/product?productId=11","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/catalog"],"Upgrade-Insecure-Requests":["1"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9jYXRhbG9nL3Byb2R1Y3Q/cHJvZHVjdElkPTExIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuDQpSZWZlcmVyOiBodHRwczovL2dpbmFuZGp1aWNlLnNob3AvY2F0YWxvZw0KVXBncmFkZS1JbnNlY3VyZS1SZXF1ZXN0czogMQ0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2DQoNCg==","request_hash":"00c93e0077191f9155b7253be2eacbc8cdaa6a0d07b64d297a98d635531e49f9","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"content-encoding":["gzip"],"content-length":["2852"],"content-type":["text/html; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:31:43 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/html; charset=utf-8","response_content_length":12111,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQp4LWZyYW1lLW9wdGlvbnM6IFNBTUVPUklHSU4NCmNvbnRlbnQtZW5jb2Rpbmc6IGd6aXANCmNvbnRlbnQtbGVuZ3RoOiAyODUyDQpjb250ZW50LXR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOA0KZGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMTo0MyBHTVQNCngtYmFja2VuZDogYzk4ZGY1YzQtYTUyNy00ZGFhLTg4Y2QtODNjNWRlNGU3Yzc3DQoNCjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KPCEtLUxBQl9IRUFEX1NUQVJULS0+CiAgICA8aGVhZD4KICAgICAgICA8bGluayBocmVmPS9yZXNvdXJjZXMvbGFiaGVhZGVyL2Nzcy9zY2FuTWVIZWFkZXIuY3NzIHJlbD1zdHlsZXNoZWV0PgogICAgICAgIDxsaW5rIGhyZWY9L3Jlc291cmNlcy9jc3MvbGFic1NjYW5tZS5jc3MgcmVsPXN0eWxlc2hlZXQ+CiAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyI+CiAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvanMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiPjwvc2NyaXB0PgogICAgICAgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3Jlc291cmNlcy9qcy9hbmd1bGFyXzEtNy03LmpzIj48L3NjcmlwdD4KICAgICAgICA8dGl0bGU+Q3VzdG9taXNlZCBDb2NrdGFpbCBJY2UgLSBQcm9kdWN0IC0gR2luICZhbXA7IEp1aWNlIFNob3A8L3RpdGxlPgogICAgPC9oZWFkPgo8IS0tTEFCX0hFQURfRU5ELS0+CiAgICA8Ym9keSBuZy1hcHA+CiAgICAgICAgPGRpdiBpZD0ic2Nhbk1lSGVhZGVyIj4KICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImhlYWRlci1kZXNjcmlwdGlvbiI+CiAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgZGVsaWJlcmF0ZWx5IHZ1bG5lcmFibGUgd2ViIGFwcGxpY2F0aW9uIGRlc2lnbmVkIGZvciB0ZXN0aW5nIHdlYiZuYnNwO3Z1bG5lcmFiaWxpdHkmbmJzcDtzY2FubmVycy4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGluayIgb25tb3VzZWVudGVyPSJ3aW5kb3cuX194MSA9IDEiIG9ubW91c2VvdmVyPSJ3aW5kb3cuX194MiA9IDEiIG9ubW91c2Vtb3ZlPSJ3aW5kb3cuX194MyA9IDEiICBvbm1vdXNlZG93bj0id2luZG93Ll9feDQgPSAxIiBvbm1vdXNldXA9ImlmICh3aW5kb3cuX194MSAmJiB3aW5kb3cuX194MiAmJiB3aW5kb3cuX194MyAmJiB3aW5kb3cuX194NCkgbG9jYXRpb24gPSBhdG9iKCdMM1oxYkc1bGNtRmlhV3hwZEdsbGN3PT0nKSIgb25tb3VzZWxlYXZlPSJkZWxldGUgd2luZG93Ll9feDE7IGRlbGV0ZSB3aW5kb3cuX194MjsgZGVsZXRlIHdpbmRvdy5fX3gzOyBkZWxldGUgd2luZG93Ll9feDQiPlB1dCB5b3VyIHNjYW5uZXIgdG8gdGhlIHRlc3QhPC9zcGFuPgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSdzY2FuTWVCYW5uZXInPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1jb250YWluZXI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0nLyc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9c2Nhbm1lLWxvZ28+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9dGl0bGUtY29udGFpbmVyPgogICAgICAgICAgICAgICAgICAgICAgICA8bmF2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBwcmltYXJ5LWxpbmtzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2VsZWN0ZWQiIGhyZWY9Ii9jYXRhbG9nIj5Qcm9kdWN0czwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2Jsb2ciPkJsb2c8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9hYm91dCI+T3VyIHN0b3J5PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBzZWNvbmRhcnktbGlua3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImFjY291bnQtaWNvbiIgaHJlZj0iL215LWFjY291bnQiPjxzdmc+PHVzZSBocmVmPSIvcmVzb3VyY2VzL2ltYWdlcy9pY29uLWFjY291bnQuc3ZnI2FjY291bnQtaWNvbiI+PC91c2U+PC9zdmc+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL215LWFjY291bnQiPkxvZyBpbjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL215LWFjY291bnQiPk15IGFjY291bnQ8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iY2FydC1pY29uIiBocmVmPSIvY2F0YWxvZy9jYXJ0Ij48c3Bhbj4wPC9zcGFuPjxzdmc+PHVzZSBocmVmPSIvcmVzb3VyY2VzL2ltYWdlcy9pY29uLWNhcnQuc3ZnI2NhcnQtaWNvbiI+PC91c2U+PC9zdmc+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJuYXYtdG9nZ2xlIj48YSBjbGFzcz0ibmF2LXRyaWdnZXIiPjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9uYXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgdGhlbWU9ImVjb21tZXJjZS1wcm9kdWN0Ij4KICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9Im1haW5jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGlzLXBhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxoZWFkZXIgY2xhc3M9Im5vdGlmaWNhdGlvbi1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDwvaGVhZGVyPgogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iYnJlYWRjcnVtYnMiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLyI+SG9tZTwvYT48L2xpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iL2NhdGFsb2ciPlByb2R1Y3RzPC9hPjwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5DdXN0b21pc2VkIENvY2t0YWlsIEljZTwvbGk+CiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0icHJvZHVjdCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPSJwcm9kdWN0LWltYWdlIiBzcmM9Ii9pbWFnZS9zY2FubWUvcHJvZHVjdGNhdGFsb2cvcHJvZHVjdHMvMTIucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+Q3VzdG9taXNlZCBDb2NrdGFpbCBJY2U8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0icHJvZHVjdC1pbWFnZSIgc3JjPSIvaW1hZ2Uvc2Nhbm1lL3Byb2R1Y3RjYXRhbG9nL3Byb2R1Y3RzLzEyLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpY2UtcmF0aW5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpY2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkNjMuNTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL3JhdGluZzIucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZXNjcmlwdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkRlc2NyaXB0aW9uOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SW1hZ2luZSBzZWVpbmcgeW91ciBvd24gbmFtZSBmbG9hdGluZyBpbiB5b3VyIGNvY2t0YWlsLiBDdXN0b21pc2VkIGFuZCBwZXJzb25hbGlzZWQgaWNlIGlzIHRoZSBwcmVzZW50IG9mIGEgbGlmZXRpbWUuIFdlbGwsIHVudGlsIGl0IG1lbHRzIHRoYXQgaXMuIEJ1dCwgd2l0aCBvdXIgc3BlY2lhbCBpY2Ugc3RlbmNpbCBraXQsIHlvdSBjYW4gYnJpbmcgeW91ciBuYW1lIG9uIGljZSB0byBsaWZlIGFueSB0aW1lIHlvdSB3YW50IHRvLiBXZSBoYXZlIGEgcGF0ZW50IGluIHBsYWNlIGZvciB0aGlzIHByb2R1Y3Qgc28gd2UgY2FuIGFzc3VyZSB5b3UgdGhhdCB5b3Ugd2lsbCBoYXZlIHRoZSBvbmx5IGdlbnVpbmUgb25lIG9uIHRoZSBtYXJrZXQsIHRob3NlIG90aGVyIGZha2VycyBjYW4gZ28gYXdheSwgYW5kIHlvdSBjYW4gdGVsbCB0aGVtIHNvLiBGb3JnZXQgcGxhY2Ugc2V0dGluZ3MgZm9yIGRpbm5lciwgeW91ciBndWVzdHMgd2lsbCBrbm93IHdoZXJlIHRvIHNpdCB3aGVuIHRoZXkgc2VlIHRoZWlyIG5hbWVzIGJvYiBib2IgYm9iYmluZyBpbiBpY2U7IGRvbuKAmXQgbGVhdmUgaXQgdG9vIGxvbmcgYmVmb3JlIHlvdSBjYWxsIHRoZW0gaW4gZm9yIGVhdHMsIGVzcGVjaWFsbHkgaWYgeW91IGhhdmUgYSByb2FyaW5nIGxvZyBmaXJlIGluIHlvdXIgZGluaW5nIHJvb20uPC9wPgo8cD5DT05URU5UUzogMSBhbHBoYWJldCBzdGVuY2lsLCAxIGJsYWNrIFNoYXJwaWUuPC9wPgo8cD5IT1cgVE8gVVNFOiBNYWtlIGEgcmVhc29uYWJseS1zaXplZCBpY2UgY3ViZS4gV2l0aCB0aGUgU2hhcnBpZSBzcGVsbCBvdXQgdGhlIGxldHRlcnMgb2YgdGhlIG5hbWUgeW91IHdhbnQgdXNpbmcgdGhlIGFscGhhYmV0IHN0ZW5jaWwuPC9wPgo8cD5XQVJOSU5HOiBUaGUgcHJvY2VzcyBvZiB3cml0aW5nIHRoZSBuYW1lcyBtdXN0IGJlIHVuZGVydGFrZW4gaW4gYSB0aW1lbHkgbWFubmVyLiBBbHNvLCB5b3VyIGhhbmRzIG11c3QgYmUgdmVyeSBjb2xkIHRvIHN0b3AgdGhlIGljZSBmcm9tIG1lbHRpbmcuIFJlLWZyZWV6ZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIGFuZCB1c2Ugd2hlbiBuZWVkZWQuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0b2NrLWNoZWNrIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBpZD0ic3RvY2tDaGVja0Zvcm0iIGFjdGlvbj0iL2NhdGFsb2cvcHJvZHVjdC9zdG9jayIgbWV0aG9kPSJQT1NUIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9ImhpZGRlbiIgbmFtZT0icHJvZHVjdElkIiB2YWx1ZT0iMTEiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9InN0b3JlSWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMSIgPkxvbmRvbjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMiIgPlBhcmlzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzIiA+TWlsYW48L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iYnV0dG9uIj5DaGVjayBzdG9jazwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0ic3RvY2tDaGVja1Jlc3VsdCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL2pzL3htbFN0b2NrQ2hlY2tQYXlsb2FkLmpzIj48L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy9qcy9zdG9ja0NoZWNrLmpzIj48L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXJ0LWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gaWQ9YWRkVG9DYXJ0Rm9ybSBhY3Rpb249L2NhdGFsb2cvY2FydCBtZXRob2Q9UE9TVD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9aGlkZGVuIG5hbWU9cHJvZHVjdElkIHZhbHVlPTExPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1oaWRkZW4gbmFtZT1yZWRpciB2YWx1ZT1QUk9EVUNUPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSdwcm9kdWN0LXF1YW50aXR5JyByZXF1aXJlZCBuYW1lPXF1YW50aXR5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMSIgc2VsZWN0ZWQ+MTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMiI+Mjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMyI+Mzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNCI+NDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNSI+NTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNiI+Njwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNyI+Nzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iOCI+ODwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iOSI+OTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTAiPjEwPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMSI+MTE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEyIj4xMjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTMiPjEzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNCI+MTQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE1Ij4xNTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPXN1Ym1pdCBjbGFzcz1idXR0b24+QWRkIHRvIGNhcnQ8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idmlldy1jYXJ0LWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2NhdGFsb2cvY2FydCI+VmlldyBjYXJ0PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItd3JhcHBlciI+CiAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItbGVmdCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5OZXZlciBtaXNzIGEgZGVhbCAtIHN1YnNjcmliZSBub3c8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICA8cD5Kb2luIG91ciB3b3JsZHdpZGUgY29tbXVuaXR5IG9mIGdpbiBhbmQganVpY2UgZmFuYXRpY3MsIGZvciBleGNsdXNpdmUgbmV3cyBvbiBvdXIgbGF0ZXN0IGRlYWxzLCBuZXcgcmVsZWFzZXMsIGNvbGxhYm9yYXRpb25zLCBhbmQgbW9yZS48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPScvcmVzb3VyY2VzL2pzL3N1YnNjcmliZU5vdy5qcyc+PC9zY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InN1YnNjcmliZSIgY2xhc3M9ImZvcm0iIGRhdGEtbWV0aG9kPSJwb3N0IiBkYXRhLWFjdGlvbj0iL2NhdGFsb2cvc3Vic2NyaWJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPWVtYWlsIG5hbWU9ZW1haWwgcGxhY2Vob2xkZXI9IkVtYWlsIGFkZHJlc3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9ImhpZGRlbiIgbmFtZT0iY3NyZiIgdmFsdWU9ImJhVDFJQ0RGVllEVEtPNUNQUHVWZElDazdvWVY0ZFdoIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ1dHRvbiIgdHlwZT1zdWJtaXQ+U3Vic2NyaWJlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGlhbG9nIGlkPSJjb3Vwb24tZGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdXBvbi13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjbG9zZS1idXR0b24iIG9uY2xpY2s9ImNsb3NlQ291cG9uRGlhbG9nKGV2ZW50KSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY291cG9uLWluZm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDE+MjAlIG9mZiBldmVyeXRoaW5nPC9oMT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY291cG9uLWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBpZD0iY29weWFibGUtY291cG9uIj5Db3Vwb24gbm90IGZvdW5kPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImNvcHktY291cG9uLWJ1dHRvbiIgY2xhc3M9ImNvcHktYnV0dG9uIiBvbmNsaWNrPSJjb3B5Q291cG9uKGV2ZW50KSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjb3Vwb24tY29waWVkLXRpY2siIGNsYXNzPSJjb3Vwb24tY29waWVkLXRpY2sgaGlkZGVuIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFwcGx5IHRoaXMgY291cG9uIHRvIHlvdXIgU2hvcHBpbmcgQ2FydCBiZWZvcmUgcGxhY2luZyB5b3VyIG9yZGVyLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2RpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWNvcHlyaWdodCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwb3J0c3dpZ2dlci1sb2dvIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+wqkgMjAyMyBQb3J0U3dpZ2dlciBMdGQuPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1yaWdodCI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iZm9vdGVyLWxvd2VyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXJOYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic29jaWFsTGlua3MiPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPG5hdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3MgcHJpbWFyeS1saW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNlbGVjdGVkIiBocmVmPSIvY2F0YWxvZyI+UHJvZHVjdHM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9ibG9nIj5CbG9nPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvYWJvdXQiPk91ciBzdG9yeTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9uYXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxzY3JpcHQgc3JjPScvcmVzb3VyY2VzL2Zvb3Rlci9qcy9zY2FubWUuanMnPjwvc2NyaXB0PgogICAgPC9ib2R5Pgo8L2h0bWw+Cg==","response_hash":"60b015b3722e63b1529de5a1bf92a6091420d8c20c8682d7cf308fd5c7133162","response_time_ms":0,"response_words":679,"has_response":true,"response_title":"Customised Cocktail Ice - Product - Gin & Juice Shop","parameters":[{"name":"productId","value":"11","type":"url","name_start":21,"name_end":30,"value_start":31,"value_end":33},{"name":"1","value":"catalog","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12},{"name":"2","value":"product","type":"path","name_start":-1,"name_end":-1,"value_start":13,"value_end":20}],"sent_at":"2026-04-05T05:31:44.077297Z","received_at":"2026-04-05T05:31:44.077292Z","created_at":"2026-04-05T05:31:44Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"dcf927b7-1481-4b1b-bd3e-1e4af10b5fe4","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/js/xmlStockCheckPayload.js","url":"https://ginandjuice.shop/resources/js/xmlStockCheckPayload.js","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/catalog/product?productId=11"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvanMveG1sU3RvY2tDaGVja1BheWxvYWQuanMgSFRUUC8xLjENCkhvc3Q6IGdpbmFuZGp1aWNlLnNob3ANClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTQuMC4wLjAgU2FmYXJpLzUzNy4zNg0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KUmVmZXJlcjogaHR0cHM6Ly9naW5hbmRqdWljZS5zaG9wL2NhdGFsb2cvcHJvZHVjdD9wcm9kdWN0SWQ9MTENCg0K","request_hash":"dd9140b87e4948469125b1235c342d808fe6b2070791b5ba20ef72c7c3ad9db8","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["230"],"content-type":["application/javascript; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:31:44 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/javascript; charset=utf-8","response_content_length":356,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQp4LWZyYW1lLW9wdGlvbnM6IFNBTUVPUklHSU4NCmNhY2hlLWNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0zNjAwDQpjb250ZW50LWxlbmd0aDogMjMwDQp4LWJhY2tlbmQ6IGM5OGRmNWM0LWE1MjctNGRhYS04OGNkLTgzYzVkZTRlN2M3Nw0KZGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMTo0NCBHTVQNCmNvbnRlbnQtZW5jb2Rpbmc6IGd6aXANCmNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vamF2YXNjcmlwdDsgY2hhcnNldD11dGYtOA0KDQp3aW5kb3cuY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24veG1sJzsKCmZ1bmN0aW9uIHBheWxvYWQoZGF0YSkgewogICAgdmFyIHhtbCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pic7CiAgICB4bWwgKz0gJzxzdG9ja0NoZWNrPic7CgogICAgZm9yKHZhciBwYWlyIG9mIGRhdGEuZW50cmllcygpKSB7CiAgICAgICAgdmFyIGtleSA9IHBhaXJbMF07CiAgICAgICAgdmFyIHZhbHVlID0gcGFpclsxXTsKCiAgICAgICAgeG1sICs9ICc8JyArIGtleSArICc+JyArIHZhbHVlICsgJzwvJyArIGtleSArICc+JzsKICAgIH0KCiAgICB4bWwgKz0gJzwvc3RvY2tDaGVjaz4nOwogICAgcmV0dXJuIHhtbDsKfQ==","response_hash":"a724ea11c3b58244a5a2a0c2c07c4ee61cee64bfa419c789ce3324bed02f7571","response_time_ms":0,"response_words":71,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"js","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":17},{"name":"3","value":"xmlStockCheckPayload.js","type":"path","name_start":-1,"name_end":-1,"value_start":18,"value_end":41}],"sent_at":"2026-04-05T05:31:44.305013Z","received_at":"2026-04-05T05:31:44.305007Z","created_at":"2026-04-05T05:31:44Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"2f66d172-a11c-42b3-89cd-7485cedff5d7","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/js/stockCheck.js","url":"https://ginandjuice.shop/resources/js/stockCheck.js","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/catalog/product?productId=11"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvanMvc3RvY2tDaGVjay5qcyBIVFRQLzEuMQ0KSG9zdDogZ2luYW5kanVpY2Uuc2hvcA0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2DQpBY2NlcHQtTGFuZ3VhZ2U6IGVuDQpSZWZlcmVyOiBodHRwczovL2dpbmFuZGp1aWNlLnNob3AvY2F0YWxvZy9wcm9kdWN0P3Byb2R1Y3RJZD0xMQ0KDQo=","request_hash":"63462ba1102c500c99f924b8cb1de7490e8c715d8d839ee158a7056edc24803d","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["420"],"content-type":["application/javascript; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:31:44 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/javascript; charset=utf-8","response_content_length":824,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjYWNoZS1jb250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MzYwMA0KY29udGVudC1sZW5ndGg6IDQyMA0KeC1iYWNrZW5kOiBjOThkZjVjNC1hNTI3LTRkYWEtODhjZC04M2M1ZGU0ZTdjNzcNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzE6NDQgR01UDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KDQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RvY2tDaGVja0Zvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBmdW5jdGlvbihlKSB7CiAgICBjaGVja1N0b2NrKHRoaXMuZ2V0QXR0cmlidXRlKCJtZXRob2QiKSwgdGhpcy5nZXRBdHRyaWJ1dGUoImFjdGlvbiIpLCBuZXcgRm9ybURhdGEodGhpcykpOwogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwp9KTsKCmZ1bmN0aW9uIGNoZWNrU3RvY2sobWV0aG9kLCBwYXRoLCBkYXRhKSB7CiAgICBjb25zdCByZXRyeSA9ICh0cmllcykgPT4gdHJpZXMgPT0gMAogICAgICAgID8gbnVsbAogICAgICAgIDogZmV0Y2goCiAgICAgICAgICAgIHBhdGgsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1ldGhvZCwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6IHdpbmRvdy5jb250ZW50VHlwZSB9LAogICAgICAgICAgICAgICAgYm9keTogcGF5bG9hZChkYXRhKQogICAgICAgICAgICB9CiAgICAgICAgICApCiAgICAgICAgICAgIC50aGVuKHJlcyA9PiByZXMuc3RhdHVzID09PSAyMDAKICAgICAgICAgICAgICAgID8gcmVzLnRleHQoKS50aGVuKHQgPT4gaXNOYU4odCkgPyB0IDogdCArICIgdW5pdHMiKQogICAgICAgICAgICAgICAgOiAiQ291bGQgbm90IGZldGNoIHN0b2NrIGxldmVscyEiCiAgICAgICAgICAgICkKICAgICAgICAgICAgLnRoZW4ocmVzID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdG9ja0NoZWNrUmVzdWx0IikuaW5uZXJIVE1MID0gcmVzKQogICAgICAgICAgICAuY2F0Y2goZSA9PiByZXRyeSh0cmllcyAtIDEpKTsKCiAgICByZXRyeSgzKTsKfQ==","response_hash":"3d5a422bfba2fbe5c99cae5797a10e42e345b5fe1c0855fcaad99539b5d87ddd","response_time_ms":0,"response_words":94,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"js","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":17},{"name":"3","value":"stockCheck.js","type":"path","name_start":-1,"name_end":-1,"value_start":18,"value_end":31}],"sent_at":"2026-04-05T05:31:44.339426Z","received_at":"2026-04-05T05:31:44.339421Z","created_at":"2026-04-05T05:31:44Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"4b04e6e2-a0c9-4ff2-bb42-4ce9e57d1730","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/catalog","url":"https://ginandjuice.shop/catalog","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"Upgrade-Insecure-Requests":["1"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9jYXRhbG9nIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuDQpSZWZlcmVyOiBodHRwczovL2dpbmFuZGp1aWNlLnNob3AvDQpVcGdyYWRlLUluc2VjdXJlLVJlcXVlc3RzOiAxDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE0LjAuMC4wIFNhZmFyaS81MzcuMzYNCg0K","request_hash":"0877f156326e103b900bc0a68a93bb07ef72f89f59f9c100569e2ccef89b4262","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"content-encoding":["gzip"],"content-length":["2900"],"content-type":["text/html; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:31:40 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/html; charset=utf-8","response_content_length":16840,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQp4LWJhY2tlbmQ6IGM5OGRmNWM0LWE1MjctNGRhYS04OGNkLTgzYzVkZTRlN2M3Nw0KeC1mcmFtZS1vcHRpb25zOiBTQU1FT1JJR0lODQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LWxlbmd0aDogMjkwMA0KY29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzE6NDAgR01UDQoNCjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KPCEtLUxBQl9IRUFEX1NUQVJULS0+CiAgICA8aGVhZD4KICAgICAgICA8bGluayBocmVmPS9yZXNvdXJjZXMvbGFiaGVhZGVyL2Nzcy9zY2FuTWVIZWFkZXIuY3NzIHJlbD1zdHlsZXNoZWV0PgogICAgICAgIDxsaW5rIGhyZWY9L3Jlc291cmNlcy9jc3MvbGFic0Vjb21tZXJjZS5jc3MgcmVsPXN0eWxlc2hlZXQ+CiAgICAgICAgPGxpbmsgaHJlZj0vcmVzb3VyY2VzL2Nzcy9sYWJzU2Nhbm1lLmNzcyByZWw9c3R5bGVzaGVldD4KICAgICAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCB1c2VyLXNjYWxhYmxlPW5vIj4KICAgICAgICA8c2NyaXB0IHNyYz0iL3Jlc291cmNlcy9qcy9yZWFjdC5kZXZlbG9wbWVudC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvanMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIj48L3NjcmlwdD4KICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvcmVzb3VyY2VzL2pzL2FuZ3VsYXJfMS03LTcuanMiPjwvc2NyaXB0PgogICAgICAgIDx0aXRsZT5Qcm9kdWN0cyAtIEdpbiAmYW1wOyBKdWljZSBTaG9wPC90aXRsZT4KICAgIDwvaGVhZD4KPCEtLUxBQl9IRUFEX0VORC0tPgogICAgPGJvZHkgbmctYXBwPgogICAgICAgIDxkaXYgaWQ9InNjYW5NZUhlYWRlciI+CiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJoZWFkZXItZGVzY3JpcHRpb24iPgogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIGRlbGliZXJhdGVseSB2dWxuZXJhYmxlIHdlYiBhcHBsaWNhdGlvbiBkZXNpZ25lZCBmb3IgdGVzdGluZyB3ZWImbmJzcDt2dWxuZXJhYmlsaXR5Jm5ic3A7c2Nhbm5lcnMuCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpbmsiIG9ubW91c2VlbnRlcj0id2luZG93Ll9feDEgPSAxIiBvbm1vdXNlb3Zlcj0id2luZG93Ll9feDIgPSAxIiBvbm1vdXNlbW92ZT0id2luZG93Ll9feDMgPSAxIiAgb25tb3VzZWRvd249IndpbmRvdy5fX3g0ID0gMSIgb25tb3VzZXVwPSJpZiAod2luZG93Ll9feDEgJiYgd2luZG93Ll9feDIgJiYgd2luZG93Ll9feDMgJiYgd2luZG93Ll9feDQpIGxvY2F0aW9uID0gYXRvYignTDNaMWJHNWxjbUZpYVd4cGRHbGxjdz09JykiIG9ubW91c2VsZWF2ZT0iZGVsZXRlIHdpbmRvdy5fX3gxOyBkZWxldGUgd2luZG93Ll9feDI7IGRlbGV0ZSB3aW5kb3cuX194MzsgZGVsZXRlIHdpbmRvdy5fX3g0Ij5QdXQgeW91ciBzY2FubmVyIHRvIHRoZSB0ZXN0ITwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0nc2Nhbk1lQmFubmVyJz4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Y29udGFpbmVyPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy8nPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXNjYW5tZS1sb2dvPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXRpdGxlLWNvbnRhaW5lcj4KICAgICAgICAgICAgICAgICAgICAgICAgPG5hdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3MgcHJpbWFyeS1saW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNlbGVjdGVkIiBocmVmPSIvY2F0YWxvZyI+UHJvZHVjdHM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9ibG9nIj5CbG9nPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvYWJvdXQiPk91ciBzdG9yeTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3Mgc2Vjb25kYXJ5LWxpbmtzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJhY2NvdW50LWljb24iIGhyZWY9Ii9teS1hY2NvdW50Ij48c3ZnPjx1c2UgaHJlZj0iL3Jlc291cmNlcy9pbWFnZXMvaWNvbi1hY2NvdW50LnN2ZyNhY2NvdW50LWljb24iPjwvdXNlPjwvc3ZnPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9teS1hY2NvdW50Ij5Mb2cgaW48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9teS1hY2NvdW50Ij5NeSBhY2NvdW50PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImNhcnQtaWNvbiIgaHJlZj0iL2NhdGFsb2cvY2FydCI+PHNwYW4+MDwvc3Bhbj48c3ZnPjx1c2UgaHJlZj0iL3Jlc291cmNlcy9pbWFnZXMvaWNvbi1jYXJ0LnN2ZyNjYXJ0LWljb24iPjwvdXNlPjwvc3ZnPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXRvZ2dsZSI+PGEgY2xhc3M9Im5hdi10cmlnZ2VyIj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmF2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHRoZW1lPSJlY29tbWVyY2UiPgogICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0ibWFpbmNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIgaXMtcGFnZSI+CiAgICAgICAgICAgICAgICAgICAgPGhlYWRlciBjbGFzcz0ibm90aWZpY2F0aW9uLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPC9oZWFkZXI+CiAgICAgICAgICAgICAgICAgICAgPGgxPlByb2R1Y3RzPC9oMT4KICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1zZWFyY2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iL2NhdGFsb2ciIG1ldGhvZD1HRVQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT10ZXh0IGlkPSJzZWFyY2hCYXIiIHBsYWNlaG9sZGVyPSJTZWFyY2ggcHJvZHVjdHMiIG5hbWU9InNlYXJjaFRlcm0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoVGV4dCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hCYXInKS52YWx1ZSA9IHNlYXJjaFRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1zdWJtaXQgY2xhc3M9YnV0dG9uPlNlYXJjaDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJyZWFjdC1jb250YWluZXIiIGNsYXNzPSJzZWFyY2gtZmlsdGVycyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5SZWZpbmUgeW91ciBzZWFyY2g6PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiID4KICAgIGNvbnN0IGVsZW1lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50OwogICAgY29uc3QgY2F0ZWdvcmllcyA9IHsiQWxsIjoiL2NhdGFsb2ciLCJBY2Nlc3NvcmllcyI6Ii9jYXRhbG9nP2NhdGVnb3J5PUFjY2Vzc29yaWVzIiwiQWNjb21wYW5pbWVudHMiOiIvY2F0YWxvZz9jYXRlZ29yeT1BY2NvbXBhbmltZW50cyIsIkJvb2tzIjoiL2NhdGFsb2c/Y2F0ZWdvcnk9Qm9va3MiLCJHaW4iOiIvY2F0YWxvZz9jYXRlZ29yeT1HaW4iLCJKdWljZSI6Ii9jYXRhbG9nP2NhdGVnb3J5PUp1aWNlIn07CiAgICBjb25zdCBzZWxlY3RlZENhdGVnb3J5ID0gbnVsbDsKICAgIGNvbnN0IHJvb3QgPSBSZWFjdERPTS5jcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWFjdC1jb250YWluZXInKSk7CgogICAgY29uc3QgY2F0ZWdvcnlTZWxlY3RlZCA9IChuYW1lLCBzZWxlY3RlZCkgPT4gISFzZWxlY3RlZCA/IG5hbWUgPT09IHNlbGVjdGVkIDogbmFtZSA9PT0gIkFsbCI7CgogICAgY29uc3QgY2F0ZWdvcnlMaXN0ID0gT2JqZWN0LmVudHJpZXMoY2F0ZWdvcmllcykubWFwKChjYXRlZ29yeSwgaSkgPT4gewogICAgICAgIGNvbnN0IG5hbWUgPSBjYXRlZ29yeVswXTsKICAgICAgICBjb25zdCBocmVmID0gY2F0ZWdvcnlbMV07CiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjYXRlZ29yeVNlbGVjdGVkKG5hbWUsIHNlbGVjdGVkQ2F0ZWdvcnkpOwogICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHNlbGVjdGVkID8gJ2ZpbHRlci1jYXRlZ29yeSBzZWxlY3RlZCcgOiAnZmlsdGVyLWNhdGVnb3J5JzsKICAgICAgICByZXR1cm4gZWxlbWVudCgnYScsIHsga2V5OiBpLCBjbGFzc05hbWUsIGhyZWYgfSwgbmFtZSk7CiAgICB9KTsKCiAgICBjb25zdCBmaWx0ZXJCYXIgPSBlbGVtZW50KCdkaXYnLCBudWxsLCBjYXRlZ29yeUxpc3QpOwogICAgcm9vdC5yZW5kZXIoZmlsdGVyQmFyKTsKCjwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iY29udGFpbmVyLWxpc3QtdGlsZXMiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvY2F0YWxvZy9wcm9kdWN0P3Byb2R1Y3RJZD0xIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2Uvc2Nhbm1lL3Byb2R1Y3RjYXRhbG9nL3Byb2R1Y3RzL3BpbmVhcHBsZV9lZGl0aW9uLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+UGluZWFwcGxlIEVkaXRpb24gQ29ja3RhaWw8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL3JhdGluZzMucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZSI+JDMwLjUwPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbiI+VmlldyBkZXRhaWxzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9jYXRhbG9nL3Byb2R1Y3Q/cHJvZHVjdElkPTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9pbWFnZS9zY2FubWUvcHJvZHVjdGNhdGFsb2cvcHJvZHVjdHMvMTEucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5DcmVhdGUgWW91ciBPd24gQ29ja3RhaWw8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL3JhdGluZzUucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZSI+JDg0Ljk2PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbiI+VmlldyBkZXRhaWxzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9jYXRhbG9nL3Byb2R1Y3Q/cHJvZHVjdElkPTMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9pbWFnZS9zY2FubWUvcHJvZHVjdGNhdGFsb2cvcHJvZHVjdHMvMTAucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5GcnVpdCBPdmVybGF5czwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL3Jlc291cmNlcy9pbWFnZXMvcmF0aW5nMy5wbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByaWNlIj4kOTIuNzk8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uIj5WaWV3IGRldGFpbHM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2NhdGFsb2cvcHJvZHVjdD9wcm9kdWN0SWQ9NCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9wcm9kdWN0Y2F0YWxvZy9wcm9kdWN0cy81LnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+SnVpY2UgRXh0cmFjdG9yPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltYWdlcy9yYXRpbmc1LnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpY2UiPiQ4MS40Njwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPlZpZXcgZGV0YWlsczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvY2F0YWxvZy9wcm9kdWN0P3Byb2R1Y3RJZD01Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2Uvc2Nhbm1lL3Byb2R1Y3RjYXRhbG9nL3Byb2R1Y3RzLzgucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5GbGFtaW7igJkgQ29ja3RhaWwgR2xhc3NlczwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL3Jlc291cmNlcy9pbWFnZXMvcmF0aW5nMS5wbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByaWNlIj4kNjkuODE8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uIj5WaWV3IGRldGFpbHM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2NhdGFsb2cvcHJvZHVjdD9wcm9kdWN0SWQ9NiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9wcm9kdWN0Y2F0YWxvZy9wcm9kdWN0cy9iYXRjaF8xMzM3LnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+QmF0Y2ggMTMzNyBDb2NrdGFpbDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL3Jlc291cmNlcy9pbWFnZXMvcmF0aW5nNC5wbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByaWNlIj4kMzAuNTA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uIj5WaWV3IGRldGFpbHM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2NhdGFsb2cvcHJvZHVjdD9wcm9kdWN0SWQ9NyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9wcm9kdWN0Y2F0YWxvZy9wcm9kdWN0cy8zLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+RnJ1aXQgU2xpY2VyIChMaW1pdGVkIEVkaXRpb24pPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltYWdlcy9yYXRpbmc0LnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpY2UiPiQyMS4yNjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPlZpZXcgZGV0YWlsczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvY2F0YWxvZy9wcm9kdWN0P3Byb2R1Y3RJZD04Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2Uvc2Nhbm1lL3Byb2R1Y3RjYXRhbG9nL3Byb2R1Y3RzLzEucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5KdWljaW4mYXBvczsgQnJpY2s8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL3JhdGluZzMucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZSI+JDk2LjI1PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbiI+VmlldyBkZXRhaWxzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9jYXRhbG9nL3Byb2R1Y3Q/cHJvZHVjdElkPTkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9pbWFnZS9zY2FubWUvcHJvZHVjdGNhdGFsb2cvcHJvZHVjdHMvNy5wbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkxpbWl0ZWQgRWRpdGlvbiBDb2NrdGFpbCBTaGFrZXI8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL3JhdGluZzIucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZSI+JDEwLjUyPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbiI+VmlldyBkZXRhaWxzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9jYXRhbG9nL3Byb2R1Y3Q/cHJvZHVjdElkPTEwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2Uvc2Nhbm1lL3Byb2R1Y3RjYXRhbG9nL3Byb2R1Y3RzLzIucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5TbG9lIEdpbiBUaW1lciBLaXQ8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL3JhdGluZzMucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZSI+JDg1Ljc4PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbiI+VmlldyBkZXRhaWxzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9jYXRhbG9nL3Byb2R1Y3Q/cHJvZHVjdElkPTExIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2Uvc2Nhbm1lL3Byb2R1Y3RjYXRhbG9nL3Byb2R1Y3RzLzEyLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+Q3VzdG9taXNlZCBDb2NrdGFpbCBJY2U8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL3JhdGluZzIucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZSI+JDYzLjU3PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbiI+VmlldyBkZXRhaWxzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9jYXRhbG9nL3Byb2R1Y3Q/cHJvZHVjdElkPTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2Uvc2Nhbm1lL3Byb2R1Y3RjYXRhbG9nL3Byb2R1Y3RzLzkucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5GcnVpdCBDdXJsaXd1cmxpZXI8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL3JhdGluZzEucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZSI+JDIwLjg2PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbiI+VmlldyBkZXRhaWxzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9jYXRhbG9nL3Byb2R1Y3Q/cHJvZHVjdElkPTEzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2Uvc2Nhbm1lL3Byb2R1Y3RjYXRhbG9nL3Byb2R1Y3RzLzYucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5PcmFuZ2UgR2luIEZpbmVzdDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL3Jlc291cmNlcy9pbWFnZXMvcmF0aW5nMi5wbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByaWNlIj4kNjQuNjQ8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uIj5WaWV3IGRldGFpbHM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2NhdGFsb2cvcHJvZHVjdD9wcm9kdWN0SWQ9MTQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9pbWFnZS9zY2FubWUvcHJvZHVjdGNhdGFsb2cvcHJvZHVjdHMva2V0dGxlX3N0aWxsLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+S2V0dGxlIFN0aWxsIEVkaXRpb24gR2luPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltYWdlcy9yYXRpbmc1LnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpY2UiPiQ1MC4wMDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPlZpZXcgZGV0YWlsczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvY2F0YWxvZy9wcm9kdWN0P3Byb2R1Y3RJZD0xNSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9wcm9kdWN0Y2F0YWxvZy9wcm9kdWN0cy9vcmlnaW5hbF9kcnlfc3FsaS5wbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPk9yaWdpbmFsIERyeSBTUUxpIENvY2t0YWlsPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltYWdlcy9yYXRpbmc0LnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpY2UiPiQzMC41MDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPlZpZXcgZGV0YWlsczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvY2F0YWxvZy9wcm9kdWN0P3Byb2R1Y3RJZD0xNiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9wcm9kdWN0Y2F0YWxvZy9wcm9kdWN0cy9wdXJwbGVfaGF0LnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+UHVycGxlIEhhdCBHaW48L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL3JhdGluZzUucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZSI+JDEwMC4wMDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPlZpZXcgZGV0YWlsczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvY2F0YWxvZy9wcm9kdWN0P3Byb2R1Y3RJZD0xNyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9wcm9kdWN0Y2F0YWxvZy9wcm9kdWN0cy9sb3N0X2luX2FfaGV5ZXMucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5Mb3N0IGluIGEgSGV5ZXMgR2luPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltYWdlcy9yYXRpbmc1LnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0icHJpY2UiPiQ1MC4wMDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPlZpZXcgZGV0YWlsczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvY2F0YWxvZy9wcm9kdWN0P3Byb2R1Y3RJZD0xOCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9wcm9kdWN0Y2F0YWxvZy9wcm9kdWN0cy80LnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+R2luIEZsYXZvdXJpbmcgR2lmdCBCb3g8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL3JhdGluZzMucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZSI+JDY4LjcwPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbiI+VmlldyBkZXRhaWxzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLWxlZnQiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1jZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDI+TmV2ZXIgbWlzcyBhIGRlYWwgLSBzdWJzY3JpYmUgbm93PC9oMj4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+Sm9pbiBvdXIgd29ybGR3aWRlIGNvbW11bml0eSBvZiBnaW4gYW5kIGp1aWNlIGZhbmF0aWNzLCBmb3IgZXhjbHVzaXZlIG5ld3Mgb24gb3VyIGxhdGVzdCBkZWFscywgbmV3IHJlbGVhc2VzLCBjb2xsYWJvcmF0aW9ucywgYW5kIG1vcmUuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0IHNyYz0nL3Jlc291cmNlcy9qcy9zdWJzY3JpYmVOb3cuanMnPjwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJzdWJzY3JpYmUiIGNsYXNzPSJmb3JtIiBkYXRhLW1ldGhvZD0icG9zdCIgZGF0YS1hY3Rpb249Ii9jYXRhbG9nL3N1YnNjcmliZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT1lbWFpbCBuYW1lPWVtYWlsIHBsYWNlaG9sZGVyPSJFbWFpbCBhZGRyZXNzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNzcmYiIHZhbHVlPSJoOHVyT1l1Mm5kanhRazAwa0E1RFBaUzRtZHgyR25pViI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidXR0b24iIHR5cGU9c3VibWl0PlN1YnNjcmliZTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpYWxvZyBpZD0iY291cG9uLWRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Vwb24td3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY2xvc2UtYnV0dG9uIiBvbmNsaWNrPSJjbG9zZUNvdXBvbkRpYWxvZyhldmVudCkiPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdXBvbi1pbmZvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxPjIwJSBvZmYgZXZlcnl0aGluZzwvaDE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvdXBvbi1pbnB1dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgaWQ9ImNvcHlhYmxlLWNvdXBvbiI+Q291cG9uIG5vdCBmb3VuZDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJjb3B5LWNvdXBvbi1idXR0b24iIGNsYXNzPSJjb3B5LWJ1dHRvbiIgb25jbGljaz0iY29weUNvdXBvbihldmVudCkiPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iY291cG9uLWNvcGllZC10aWNrIiBjbGFzcz0iY291cG9uLWNvcGllZC10aWNrIGhpZGRlbiI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5BcHBseSB0aGlzIGNvdXBvbiB0byB5b3VyIFNob3BwaW5nIENhcnQgYmVmb3JlIHBsYWNpbmcgeW91ciBvcmRlci48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1jb3B5cmlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icG9ydHN3aWdnZXItbG9nbyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PsKpIDIwMjMgUG9ydFN3aWdnZXIgTHRkLjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItcmlnaHQiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImZvb3Rlci1sb3dlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNvY2lhbExpbmtzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxuYXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9Im5hdmlnYXRpb24taGVhZGVyLWxpbmtzIHByaW1hcnktbGlua3MiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZWxlY3RlZCIgaHJlZj0iL2NhdGFsb2ciPlByb2R1Y3RzPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvYmxvZyI+QmxvZzwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2Fib3V0Ij5PdXIgc3Rvcnk8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmF2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8c2NyaXB0IHNyYz0nL3Jlc291cmNlcy9mb290ZXIvanMvc2Nhbm1lLmpzJz48L3NjcmlwdD4KICAgIDwvYm9keT4KPC9odG1sPgo=","response_hash":"eab76be1ce987f9e3069c7b7c1261520ead5c8fe7e23e3ac32fffd17493d5c1d","response_time_ms":0,"response_words":734,"has_response":true,"response_title":"Products - Gin & Juice Shop","parameters":[{"name":"1","value":"catalog","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":12}],"sent_at":"2026-04-05T05:31:40.550259Z","received_at":"2026-04-05T05:31:40.550256Z","created_at":"2026-04-05T05:31:40Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"77a85b46-4f2b-40fe-9184-e5f057b98fc5","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/css/labsEcommerce.css","url":"https://ginandjuice.shop/resources/css/labsEcommerce.css","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/catalog"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvY3NzL2xhYnNFY29tbWVyY2UuY3NzIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuDQpSZWZlcmVyOiBodHRwczovL2dpbmFuZGp1aWNlLnNob3AvY2F0YWxvZw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2DQoNCg==","request_hash":"bd8ec14e526a41f6e52d1ef466778ebfff9dd63895efa0fc9452181a4caad1b5","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["5237"],"content-type":["text/css"],"date":["Sun, 05 Apr 2026 05:31:40 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/css","response_content_length":28218,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQp4LWJhY2tlbmQ6IGM5OGRmNWM0LWE1MjctNGRhYS04OGNkLTgzYzVkZTRlN2M3Nw0KZGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMTo0MCBHTVQNCmNvbnRlbnQtZW5jb2Rpbmc6IGd6aXANCmNvbnRlbnQtdHlwZTogdGV4dC9jc3MNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY2FjaGUtY29udHJvbDogcHVibGljLCBtYXgtYWdlPTM2MDANCmNvbnRlbnQtbGVuZ3RoOiA1MjM3DQoNCjpyb290IHsKICAtLXNwYWNpbmdiYXNlOiAwLjllbTsKfQoKQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7CiAgOnJvb3QgewogICAgLS1zcGFjaW5nYmFzZTogMWVtOwogIH0KfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7CiAgOnJvb3QgewogICAgLS1zcGFjaW5nYmFzZTogMS4xZW07CiAgfQp9Ci8qMiovCi8qNCovCi8qOCovCi8qMTIqLwovKjIwKi8KLyozMiovCi8qNTIqLwovKjg0Ki8KLyogY29tcG9uZW50IHNwYWNpbmcgKi8KLypTcGFjaW5nIHVzZWQgZm9yIGNvbnRhaW5lciBjb2x1bW5zIGxheW91dHMqLwo6cm9vdCB7CiAgLyogc2V0IGJhc2UgdmFsdWVzICovCiAgLS10ZXh0LWJhc2Utc2l6ZTogMWVtOwogIC0tdGV4dC1zY2FsZS1yYXRpbzogMS4xOwogIC8qIHR5cGUgc2NhbGUgKi8KICAtLXRleHQteHM6IGNhbGMoMWVtIC8gKHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpKTsKICAtLXRleHQtc206IGNhbGMoMWVtIC8gdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpOwogIC0tdGV4dC1tZDogY2FsYygxLjAxZW0gKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSk7CiAgLS10ZXh0LWxnOiBjYWxjKDFlbSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpOwogIC0tdGV4dC14bDogY2FsYygxZW0gKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpOwogIC0tdGV4dC14eGw6IGNhbGMoMWVtICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykgKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpOwogIC0tdGV4dC14eHhsOiBjYWxjKDFlbSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykgKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpOwogIC8qIGxpbmUtaGVpZ2h0ICovCiAgLS1oZWFkaW5nLWxpbmUtaGVpZ2h0OiAxOwogIC0tdGV4dC1saW5laGVpZ2h0OiAxLjQ7CiAgLS10ZXh0LWxpbmVoZWlnaHQtc206IDEuMzsKICAtLXRleHQtbGluZWhlaWdodC1tZDogMS40NTsKICAtLXRleHQtbGluZWhlaWdodC1scmc6IDEuNTsKfQoKQG1lZGlhIChtaW4td2lkdGg6IDk5MnB4KSB7CiAgOnJvb3QgewogICAgLS10ZXh0LXNjYWxlLXJhdGlvOiAxLjE1OwogICAgLS10ZXh0LWxpbmVoZWlnaHQ6IDEuNDU7CiAgfQp9CkBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHsKICA6cm9vdCB7CiAgICAtLXRleHQtc2NhbGUtcmF0aW86IDEuMjsKICAgIC0tdGV4dC1saW5laGVpZ2h0OiAxLjU7CiAgfQp9Ci5vcmFuZ2UtYm9yZGVyLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNmZjY2MzMgIWltcG9ydGFudDsKICBwYWRkaW5nOiA1cHggMHB4ICFpbXBvcnRhbnQ7Cn0KCi53aGl0ZS1ib3JkZXItYm90dG9tLCAubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciBoMyB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZmYgIWltcG9ydGFudDsKfQoKLmxpZ2h0LWdyZXktYm9yZGVyIHsKICBib3JkZXI6IDFweCBzb2xpZCAjYjNiM2IzICFpbXBvcnRhbnQ7Cn0KCi5saWdodC1ncmV5LWJvcmRlci10b3AgewogIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYjNiM2IzICFpbXBvcnRhbnQ7Cn0KCi5saWdodGVyLWdyZXktYm9yZGVyIHsKICBib3JkZXI6IDFweCBzb2xpZCAjY2JkMGQxICFpbXBvcnRhbnQ7Cn0KCi5saWdodGVyLWdyZXktYm9yZGVyLWJvdHRvbSwgLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgaDMgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2JkMGQxICFpbXBvcnRhbnQ7Cn0KCi5ib3JkZXItYm90dG9tLWdyZXkgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjOTk5ICFpbXBvcnRhbnQ7Cn0KCi5ib3JkZXItdG9wLWdyZXkgewogIGJvcmRlci10b3A6IDFweCBzb2xpZCAjOTk5ICFpbXBvcnRhbnQ7Cn0KCi5ib3JkZXItYm90dG9tLWxpZ2h0LWdyZXkgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYjNiM2IzICFpbXBvcnRhbnQ7Cn0KCi5ib3JkZXItdG9wLWxpZ2h0LWdyZXkgewogIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYjNiM2IzICFpbXBvcnRhbnQ7Cn0KCi5ib3JkZXItYm90dG9tLXgtbGlnaHQtZ3JleSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNmU2ZTYgIWltcG9ydGFudDsKfQoKLmJvcmRlci10b3AteC1saWdodC1ncmV5IHsKICBib3JkZXItdG9wOiAxcHggc29saWQgI2U2ZTZlNiAhaW1wb3J0YW50Owp9CgpkaXYuYm9yZGVyLWJvdHRvbS14LWxpZ2h0LWdyZXkgewogIG1hcmdpbjogMWVtIDAgIWltcG9ydGFudDsKfQoKLndoaXRlLWJvcmRlci1kYXNoZWQtb2Zmc2V0IHsKICBvdXRsaW5lOiAxcHggZGFzaGVkICNmZmY7CiAgb3V0bGluZS1vZmZzZXQ6IC02cHg7Cn0KCi54LWxpZ2h0LWdyZXktYm9yZGVyIHsKICBib3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2ICFpbXBvcnRhbnQ7Cn0KCi5tYWluY29udGFpbmVyIGgxLAoubWFpbmNvbnRhaW5lciBoMiwKLm1haW5jb250YWluZXIgaDMsCi5tYWluY29udGFpbmVyIGg0IHsKICBjb2xvcjogIzMzMzMzMjsKfQoubWFpbmNvbnRhaW5lciBoMSBhLAoubWFpbmNvbnRhaW5lciBoMiBhLAoubWFpbmNvbnRhaW5lciBoMyBhLAoubWFpbmNvbnRhaW5lciBoNCBhIHsKICBjb2xvcjogIzMzMzMzMjsKfQoKKiwgKjpiZWZvcmUsICo6YWZ0ZXIgewogIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKYm9keSB7CiAgbWFyZ2luOiAwOwogIG1pbi13aWR0aDogMjkwcHg7CiAgbWluLWhlaWdodDogMTAwdmg7Cn0KCi5pcy1mbGV4IHsKICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICBkaXNwbGF5OiAtbW96LWJveDsKICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgZGlzcGxheTogZmxleDsKfQouaXMtZmxleCAubWFpbmNvbnRhaW5lciB7CiAgLW1vei1mbGV4OiAxIDEgYXV0bzsKICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogIC1tcy1mbGV4OiAxIDEgYXV0bzsKICBmbGV4OiAxIDEgYXV0bzsKICBtaW4taGVpZ2h0OiAxMDB2aDsKICBtaW4td2lkdGg6IDA7Cn0KLmlzLWZsZXguZmxleGRpcmVjdGlvbi1jb2wgewogIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsOwogIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7CiAgLW1vei1ib3gtZGlyZWN0aW9uOiBub3JtYWw7CiAgLW1vei1ib3gtb3JpZW50OiB2ZXJ0aWNhbDsKICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmNvbnRhaW5lciB7CiAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA3LjVlbSk7Cn0KCmhyIHsKICBib3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2OwogIG1hcmdpbjogMS44ZW0gMDsKfQoKaHI6bGFzdC1vZi10eXBlIHsKICBtYXJnaW4tdG9wOiAwOwp9CgouaGlkZGVuIHsKICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7Cn0KCi5jb250YWluZXItbGlzdC10aWxlcyB7CiAgLXdlYmtpdC1ib3gtcGFjazoganVzdGlmeTsKICAtbW96LWJveC1wYWNrOiBqdXN0aWZ5OwogIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7CiAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC1tb3otYm94OwogIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtd3JhcDogd3JhcDsKICBtYXJnaW46IDFlbSAwOwp9Ci5jb250YWluZXItbGlzdC10aWxlcyA+IGRpdiB7CiAgcGFkZGluZzogMWVtIDAgMmVtIDA7CiAgLW1vei1mbGV4OiAxIDAgMjQlOwogIC13ZWJraXQtZmxleDogMSAwIDI0JTsKICAtbXMtZmxleDogMSAwIDI0JTsKICBmbGV4OiAxIDAgMjQlOwogIG1heC13aWR0aDogMjQlOwp9Ci5jb250YWluZXItbGlzdC10aWxlcyA+IGRpdiBpbWc6Zmlyc3Qtb2YtdHlwZSB7CiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjsKICB3aWR0aDogMjcwcHg7CiAgaGVpZ2h0OiAyMDBweDsKICBib3JkZXItcmFkaXVzOiA1cHg7CiAgb3BhY2l0eTogMC45OwogIHBhZGRpbmc6IDA7Cn0KLmNvbnRhaW5lci1saXN0LXRpbGVzID4gZGl2IGltZzpudGgtb2YtdHlwZSgyKSB7CiAgYm9yZGVyOiBub25lOwp9Ci5jb250YWluZXItbGlzdC10aWxlcyA+IGRpdiBoMyB7CiAgZm9udC1zaXplOiAwLjhlbTsKICBmb250LXdlaWdodDogYm9sZDsKfQouY29udGFpbmVyLWxpc3QtdGlsZXMgPiBkaXYgLmJ1dHRvbiB7CiAgZmxvYXQ6IHVuc2V0OwogIG1hcmdpbjogMC43ZW0gYXV0byAwIGF1dG87CiAgZGlzcGxheTogYmxvY2s7CiAgYm9yZGVyLXJhZGl1czogMDsKfQoKQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTAyNHB4KSB7CiAgLm1haW5jb250YWluZXIgewogICAgbWluLWhlaWdodDogMzYwcHg7CiAgfQp9CkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDk5MXB4KSB7CiAgLmlzLWZsZXggewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9CiAgLmlzLWZsZXggLnJpZ2h0Y29sIHsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9Ci5jb250YWluZXIgewogIHdpZHRoOiAxMTQwcHg7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBtYXJnaW46IDAgYXV0bzsKICBwYWRkaW5nOiAwOwp9Ci5jb250YWluZXIuaXMtZmxleCB7CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLW1vei1ib3g7CiAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IGZsZXg7Cn0KLmNvbnRhaW5lci5pcy1mbGV4IC5sZWZ0Y29sIHsKICBtYXJnaW4tcmlnaHQ6IDEuOGVtOwp9Ci5jb250YWluZXIuaXMtZmxleCAubWFpbmNvbCB7CiAgLW1vei1mbGV4OiAxIDEgYXV0bzsKICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogIC1tcy1mbGV4OiAxIDEgYXV0bzsKICBmbGV4OiAxIDEgYXV0bzsKICBtaW4taGVpZ2h0OiAxMDAlOwogIG1pbi13aWR0aDogMDsKfQouY29udGFpbmVyLmlzLWZsZXggLnJpZ2h0Y29sIHsKICBtYXJnaW4tbGVmdDogMS44ZW07CiAgbWF4LXdpZHRoOiAzMS44ZW07Cn0KCi5tYWluY29udGFpbmVyIC5jb250YWluZXIgewogIHBhZGRpbmc6IDEuOGVtIDA7Cn0KLm1haW5jb250YWluZXIgLmNvbnRhaW5lciAuaW5mb3JtYXRpb24gewogIGJhY2tncm91bmQ6ICNlYmYwZjI7CiAgcGFkZGluZzogMWVtOwogIGJvcmRlci1yYWRpdXM6IDE1cHg7Cn0KLm1haW5jb250YWluZXIgLmNvbnRhaW5lciAuaW5mb3JtYXRpb24gcDpsYXN0LW9mLXR5cGUgewogIG1hcmdpbi1ib3R0b206IDA7Cn0KCkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDExOTBweCkgewogIC5jb250YWluZXIgewogICAgcGFkZGluZzogMCAxZW07CiAgICB3aWR0aDogMTAwJTsKICAgIG1heC13aWR0aDogMTE0MHB4OwogIH0KCiAgLm1haW5jb250YWluZXIgLmNvbnRhaW5lciB7CiAgICBwYWRkaW5nOiAxLjhlbSAxZW07CiAgfQp9CkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkgewogIC5tYWluY29udGFpbmVyIHsKICAgIG1pbi1oZWlnaHQ6IDM2MHB4OwogIH0KfQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTFweCkgewogIC5jb250YWluZXIuaXMtZmxleCB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIH0KICAuY29udGFpbmVyLmlzLWZsZXggLnJpZ2h0Y29sIHsKICAgIG1hcmdpbi1sZWZ0OiAwcHg7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQp9CmEgewogIGNvbG9yOiAjMDA3MWJjOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQphOmhvdmVyLCBhOmFjdGl2ZSB7CiAgY29sb3I6ICMwOTRjNzI7CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KYS53aGl0ZSB7CiAgY29sb3I6ICNmZmY7Cn0KCi5pcy1saW5rYmFjayB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KLmlzLWxpbmtiYWNrOmJlZm9yZSB7CiAgY29udGVudDogIjwiOwogIGNvbG9yOiAjMDA3MWJjOwp9Ci5pcy1saW5rYmFjazpiZWZvcmU6aG92ZXIsIC5pcy1saW5rYmFjazpiZWZvcmU6YWN0aXZlIHsKICBjb2xvcjogIzA5NGM3MjsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQouaXMtbGlua2JhY2sgYTpob3ZlciB7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CgoubWFyZ2luLW5vbmUgewogIG1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7Cn0KCi5zaG9ydC1jb250ZW50LXNwYWNpbmcgewogIG1hcmdpbjogNCUgMCA2JSAwICFpbXBvcnRhbnQ7Cn0KCi5jZW50ZXItYmxvY2sgewogIGRpc3BsYXk6IGJsb2NrOwogIG1hcmdpbi1yaWdodDogYXV0bzsKICBtYXJnaW4tbGVmdDogYXV0bzsKfQoKLm1hcmdpbi1zIHsKICBtYXJnaW46IDVweCAhaW1wb3J0YW50Owp9CgoubWFyZ2luLW0gewogIG1hcmdpbjogMWVtICFpbXBvcnRhbnQ7Cn0KCi5tYXJnaW4tbCB7CiAgbWFyZ2luOiAxLjhlbSAhaW1wb3J0YW50Owp9CgoubWFyZ2luLWxlZnQtcyB7CiAgbWFyZ2luLWxlZnQ6IDVweCAhaW1wb3J0YW50Owp9CgoubWFyZ2luLWxlZnQtbSB7CiAgbWFyZ2luLWxlZnQ6IDFlbSAhaW1wb3J0YW50Owp9CgoubWFyZ2luLWxlZnQtbCB7CiAgbWFyZ2luLWxlZnQ6IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5tYXJnaW4tcmlnaHQtcyB7CiAgbWFyZ2luLXJpZ2h0OiA1cHggIWltcG9ydGFudDsKfQoKLm1hcmdpbi1yaWdodC1tIHsKICBtYXJnaW4tcmlnaHQ6IDFlbSAhaW1wb3J0YW50Owp9CgoubWFyZ2luLXJpZ2h0LWwgewogIG1hcmdpbi1yaWdodDogMS44ZW0gIWltcG9ydGFudDsKfQoKLm1hcmdpbi10b3AtcyB7CiAgbWFyZ2luLXRvcDogMTBweCAhaW1wb3J0YW50Owp9CgoubWFyZ2luLXRvcC1tIHsKICBtYXJnaW4tdG9wOiAxLjhlbSAhaW1wb3J0YW50Owp9CgoubWFyZ2luLXRvcC1sIHsKICBtYXJnaW4tdG9wOiA1MHB4ICFpbXBvcnRhbnQ7Cn0KCi5tYXJnaW4tYm90dG9tLXMgewogIG1hcmdpbi1ib3R0b206IDEwcHggIWltcG9ydGFudDsKfQoKLm1hcmdpbi1ib3R0b20tbSB7CiAgbWFyZ2luLWJvdHRvbTogMS44ZW0gIWltcG9ydGFudDsKfQoKLm1hcmdpbi1ib3R0b20tbCB7CiAgbWFyZ2luLWJvdHRvbTogNTBweCAhaW1wb3J0YW50Owp9CgoubWFyZ2luLWJvdHRvbS00MCB7CiAgbWFyZ2luLWJvdHRvbTogNDAlOwp9CgoubmF2Y29udGFpbmVyIHsKICBtaW4taGVpZ2h0OiAxMDB2aDsKICBtaW4td2lkdGg6IDQwMHB4OwogIG1heC13aWR0aDogNDAwcHg7CiAgYmFja2dyb3VuZC1jb2xvcjogIzAwNzFiYzsKICBwYWRkaW5nOiAxZW07CiAgcG9zaXRpb246IGZpeGVkOwp9Ci5uYXZjb250YWluZXIgaDEsIC5uYXZjb250YWluZXIgaDIsIC5uYXZjb250YWluZXIgaDMsIC5uYXZjb250YWluZXIgaDQsIC5uYXZjb250YWluZXIgbGksIC5uYXZjb250YWluZXIgYSB7CiAgY29sb3I6ICNmZmY7Cn0KLm5hdmNvbnRhaW5lciBoMiB7CiAgZm9udC1zaXplOiB2YXIoLS10ZXh0LXhsKTsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciB7CiAgb3ZlcmZsb3c6IHNjcm9sbDsKICBtYXgtaGVpZ2h0OiBjYWxjKDEwMHZoIC0gMTAwcHgpOwp9Ci5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIGgzIHsKICBtYXJnaW46IDE2cHggMCA4cHggMDsKICBkaXNwbGF5OiBibG9jazsKICBmb250LXNpemU6IDFlbTsKICBmb250LXdlaWdodDogYm9sZDsKICB3aWR0aDogMTAwJTsKICBjb2xvcjogI2ZmZjsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciBoMzpmaXJzdC1vZi10eXBlIHsKICBtYXJnaW46IDAgMCA4cHggMDsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciBhIHsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgYTpob3ZlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA5NGM3MjsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciB1bCB7CiAgcGFkZGluZzogMDsKICBtYXJnaW46IDA7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkgewogIGxpc3Qtc3R5bGU6IG5vbmU7CiAgbGluZS1oZWlnaHQ6IDEuNWVtOwogIGJhY2tncm91bmQ6IG5vbmU7CiAgcGFkZGluZzogMDsKICBtYXJnaW46IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgcmlnaHQ6IDVweDsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciB1bCBsaSBhIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgZGlzcGxheTogYmxvY2s7CiAgcGFkZGluZy1sZWZ0OiA1cHg7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkuaXMtZHJvcGRvd24gewogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgcmlnaHQ6IDA7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkuaXMtZHJvcGRvd24gbGFiZWwgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKSBzY2FsZSgxLCAxLjUpOwogIC1tb3otdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpIHNjYWxlKDEsIDEuNSk7CiAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKSBzY2FsZSgxLCAxLjUpOwogIC1vLXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKSBzY2FsZSgxLCAxLjUpOwogIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKSBzY2FsZSgxLCAxLjUpOwogIGZvbnQtc2l6ZTogMThweDsKICBtYXJnaW4tcmlnaHQ6IDVweDsKICBmb250LXdlaWdodDogNDAwOwogIGNvbG9yOiB3aGl0ZTsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciB1bCBsaS5pcy1kcm9wZG93biBsYWJlbCArIHVsIGxpIHsKICBkaXNwbGF5OiBub25lOwogIGZvbnQtd2VpZ2h0OiA0MDA7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkuaXMtZHJvcGRvd24gaW5wdXRbdHlwZT1jaGVja2JveF06Y2hlY2tlZCArIGxhYmVsIHsKICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgc2NhbGUoMSwgMS41KTsKICAtbW96LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgc2NhbGUoMSwgMS41KTsKICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSBzY2FsZSgxLCAxLjUpOwogIC1vLXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgc2NhbGUoMSwgMS41KTsKICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpIHNjYWxlKDEsIDEuNSk7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkuaXMtZHJvcGRvd24gaW5wdXRbdHlwZT1jaGVja2JveF06Y2hlY2tlZCArIGxhYmVsICsgdWwgewogIG1hcmdpbjogMCAwIDAgMTVweDsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciB1bCBsaS5pcy1kcm9wZG93biBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgbGFiZWwgKyB1bCBsaSB7CiAgZGlzcGxheTogYmxvY2s7Cn0KCi5zZWN0aW9uLXBhZGRpbmcgewogIHBhZGRpbmc6IDEuOGVtIDA7Cn0KCi5zZWN0aW9uLXBhZGRpbmctbHJnIHsKICBwYWRkaW5nOiA0MHB4IDBweDsKfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgewogIC5zZWN0aW9uLXBhZGRpbmcsIC5zZWN0aW9uLXBhZGRpbmctbHJnIHsKICAgIHBhZGRpbmc6IDFlbSAwOwogIH0KfQoucGFkZGluZy1zIHsKICBwYWRkaW5nOiA1cHggIWltcG9ydGFudDsKfQoKLnBhZGRpbmctbSB7CiAgcGFkZGluZzogMWVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLWwgewogIHBhZGRpbmc6IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLWxlZnQtcywgLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgaDMgewogIHBhZGRpbmctbGVmdDogNXB4ICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLWxlZnQtbSB7CiAgcGFkZGluZy1sZWZ0OiAxZW0gIWltcG9ydGFudDsKfQoKLnBhZGRpbmctbGVmdC1sIHsKICBwYWRkaW5nLWxlZnQ6IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLXJpZ2h0LXMgewogIHBhZGRpbmctcmlnaHQ6IDVweCAhaW1wb3J0YW50Owp9CgoucGFkZGluZy1yaWdodC1tIHsKICBwYWRkaW5nLXJpZ2h0OiAxZW0gIWltcG9ydGFudDsKfQoKLnBhZGRpbmctcmlnaHQtbCB7CiAgcGFkZGluZy1yaWdodDogMS44ZW0gIWltcG9ydGFudDsKfQoKLnBhZGRpbmctdG9wLXMgewogIHBhZGRpbmctdG9wOiAxMHB4ICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLXRvcC1tIHsKICBwYWRkaW5nLXRvcDogMS44ZW0gIWltcG9ydGFudDsKfQoKLnBhZGRpbmctdG9wLWwgewogIHBhZGRpbmctdG9wOiA1MHB4ICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLWJvdHRvbS1zIHsKICBwYWRkaW5nLWJvdHRvbTogMTBweCAhaW1wb3J0YW50Owp9CgoucGFkZGluZy1ib3R0b20tbSB7CiAgcGFkZGluZy1ib3R0b206IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLWJvdHRvbS1sIHsKICBwYWRkaW5nLWJvdHRvbTogNTBweCAhaW1wb3J0YW50Owp9Cgpib2R5IHsKICBiYWNrZ3JvdW5kOiAjZmZmICFpbXBvcnRhbnQ7CiAgY29sb3I6ICMzMzMzMzI7CiAgZm9udC1zaXplOiAxNnB4OwogIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7CiAgZm9udC1mYW1pbHk6IEFyaWFsLCAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CiAgbGluZS1oZWlnaHQ6IDEuNDsKICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogIHdvcmQtd3JhcDogYnJlYWstd29yZDsKfQoKcCB7CiAgbWFyZ2luOiAwIDAgMTBweDsKfQpwLmlzLXdhcm5pbmcgewogIGNvbG9yOiAjYjUwMDAwOwogIGRpc3BsYXk6IGlubGluZTsKICBtYXJnaW4tbGVmdDogY2FsYygwLjI1ICogdmFyKC0tc3BhY2luZ2Jhc2UpKTsKfQpwLmlzLXdhcm5pbmc6Zmlyc3QtY2hpbGQgewogIG1hcmdpbi1sZWZ0OiAwOwp9Cgouc21hbGxlci10ZXh0IHsKICBmb250LXNpemU6IDAuOWVtOwp9CgpoMSwgaDIsIGgzLCBoNCwgaDUsIC5oMiwgLmgzLCAuaDQsIGg1LCAuaDUgewogIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgbGluZS1oZWlnaHQ6IHZhcigtLWhlYWRpbmctbGluZS1oZWlnaHQpOwogIG1hcmdpbjogY2FsYygwLjc1ICogdmFyKC0tc3BhY2luZ2Jhc2UpKSAwIGNhbGMoMC41ICogdmFyKC0tc3BhY2luZ2Jhc2UpKSAwOwogIGNvbG9yOiAjZmY2NjMzOwp9CmgxLmlzLXVuZGVybGluZWQsIGgyLmlzLXVuZGVybGluZWQsIGgzLmlzLXVuZGVybGluZWQsIGg0LmlzLXVuZGVybGluZWQsIGg1LmlzLXVuZGVybGluZWQsIC5oMi5pcy11bmRlcmxpbmVkLCAuaDMuaXMtdW5kZXJsaW5lZCwgLmg0LmlzLXVuZGVybGluZWQsIGg1LmlzLXVuZGVybGluZWQsIC5oNS5pcy11bmRlcmxpbmVkIHsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZmNjYzMzsKICBwYWRkaW5nLWJvdHRvbTogY2FsYygwLjExMjUgKiB2YXIoLS1zcGFjaW5nYmFzZSkpOwp9CmgxOmZpcnN0LWNoaWxkLCBoMjpmaXJzdC1jaGlsZCwgaDM6Zmlyc3QtY2hpbGQsIGg0OmZpcnN0LWNoaWxkLCBoNTpmaXJzdC1jaGlsZCwgLmgyOmZpcnN0LWNoaWxkLCAuaDM6Zmlyc3QtY2hpbGQsIC5oNDpmaXJzdC1jaGlsZCwgaDU6Zmlyc3QtY2hpbGQsIC5oNTpmaXJzdC1jaGlsZCB7CiAgbWFyZ2luLXRvcDogMDsKfQpoMTpsYXN0LWNoaWxkLCBoMjpsYXN0LWNoaWxkLCBoMzpsYXN0LWNoaWxkLCBoNDpsYXN0LWNoaWxkLCBoNTpsYXN0LWNoaWxkLCAuaDI6bGFzdC1jaGlsZCwgLmgzOmxhc3QtY2hpbGQsIC5oNDpsYXN0LWNoaWxkLCBoNTpsYXN0LWNoaWxkLCAuaDU6bGFzdC1jaGlsZCB7CiAgbWFyZ2luLWJvdHRvbTogMDsKfQoKaDEsIC5oMSB7CiAgZm9udC1zaXplOiB2YXIoLS10ZXh0LXh4eGwpOwp9CgpoMiwgLmgyIHsKICBmb250LXNpemU6IHZhcigtLXRleHQteHhsKTsKfQoKaDMsIC5oMyB7CiAgZm9udC1zaXplOiB2YXIoLS10ZXh0LXhsKTsKfQoKaDQsIC5oNCB7CiAgZm9udC1zaXplOiB2YXIoLS10ZXh0LWxnKTsKfQoKaDUsIC5oNSB7CiAgZm9udC1zaXplOiB2YXIoLS10ZXh0LW1kKTsKICBsaW5lLWhlaWdodDogdmFyKC0tdGV4dC1saW5laGVpZ2h0KTsKfQoKY2l0ZSB7CiAgbWFyZ2luOiAxZW0gMmVtOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjZmY2NjMzOwogIHBhZGRpbmc6IDAgMS42ZW07CiAgY29sb3I6IHJnYmEoNTEsIDUxLCA1MSwgMC4zKTsKfQoKLnNtYWxscHJpbnQgewogIGZvbnQtc2l6ZTogMTJweDsKfQoKLm5vd3JhcCwgLnRleHQtbm93cmFwIHsKICB3aGl0ZS1zcGFjZTogbm93cmFwICFpbXBvcnRhbnQ7Cn0KCi5wcmUtd3JhcCB7CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwICFpbXBvcnRhbnQ7Cn0KCi50ZXh0LWxlZnQgewogIHRleHQtYWxpZ246IGxlZnQgIWltcG9ydGFudDsKfQoKLnRleHQtY2VudGVyIHsKICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDsKfQoKLnRleHQtcmlnaHQgewogIHRleHQtYWxpZ246IHJpZ2h0ICFpbXBvcnRhbnQ7Cn0KCi5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIGgzIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoudGV4dC1oaWdobGlnaHQgewogIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5pZWZpeC13b3JkLWJyZWFrIHsKICAtbXMtd29yZC1icmVhazogYnJlYWstYWxsOwp9CgoubGlnaHQtZ3JleS10ZXh0IHsKICBjb2xvcjogI2IzYjNiMzsKfQoKLmlzLWRhcmsgaW5wdXQsIC5pcy1kYXJrIHRleHRhcmVhIHsKICBmb250LWZhbWlseTogQ291cmllciwgbW9ub3NwYWNlOwp9CgouYmxvY2sgewogIGRpc3BsYXk6IGJsb2NrOwp9CgouaXMtaW5pdGlhbGx5aGlkZGVuIHsKICBkaXNwbGF5OiBub25lOwp9CgppbnB1dFt0eXBlPXN1Ym1pdF0sIGlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1yZXNldF0sIGJ1dHRvbiB7CiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgZm9udC1zaXplOiBpbmhlcml0Owp9CgouYnV0dG9uIHsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDI1cHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiAyNXB4OwogIGJvcmRlci1yYWRpdXM6IDI1cHg7CiAgLW1zLXRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgYmFja2dyb3VuZC1jb2xvcjogIzExNWY4MjsKICBjb2xvcjogI2ZmZjsKICBmb250LXNpemU6IDE2cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgcGFkZGluZzogN3B4IDFlbTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICBtaW4td2lkdGg6IDEyMHB4Owp9Ci5idXR0b24uZGlzYWJsZWQgewogIGJvcmRlcjogMXB4IHNvbGlkICM5OTk5OTk7CiAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKICBjb2xvcjogIzY2NjY2NjsKfQouYnV0dG9uOmhvdmVyOmVuYWJsZWQsIC5idXR0b246YWN0aXZlOmVuYWJsZWQgewogIGN1cnNvcjogcG9pbnRlcjsKICBjb2xvcjogI2ZmZjsKfQouYnV0dG9uOmhvdmVyOmVuYWJsZWQgewogIC1vLXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcyBlYXNlLCBjb2xvciAwLjNzIGVhc2U7CiAgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwgY29sb3IgMC4zcyBlYXNlOwogIC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzIGVhc2UsIGNvbG9yIDAuM3MgZWFzZTsKICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwgY29sb3IgMC4zcyBlYXNlOwogIGJhY2tncm91bmQtY29sb3I6ICMzMjRkNWM7Cn0KLmJ1dHRvbjphY3RpdmU6ZW5hYmxlZCB7CiAgLW8tdHJhbnNpdGlvbjogbm9uZTsKICAtbW96LXRyYW5zaXRpb246IG5vbmU7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogIHRyYW5zaXRpb246IG5vbmU7CiAgYmFja2dyb3VuZC1jb2xvcjogIzI4M2U0OTsKfQouYnV0dG9uLmlzLWxhcmdlIHsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDIwcHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiAyMHB4OwogIGJvcmRlci1yYWRpdXM6IDIwcHg7CiAgcGFkZGluZzogNXB4IDI1cHg7CiAgbWluLXdpZHRoOiAyMDBweDsKICBmb250LXNpemU6IDI0cHg7Cn0KLmJ1dHRvbi5pcy1zbWFsbCB7CiAgcGFkZGluZzogNXB4IDEycHg7CiAgbWluLXdpZHRoOiAxMDBweDsKICBmb250LXNpemU6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE1cHg7Cn0KLmJ1dHRvbi5pcy13YXJuaW5nIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDYwMDAwOwp9Ci5idXR0b24uaXMtd2FybmluZzpob3ZlcjplbmFibGVkLCAuYnV0dG9uLmlzLXdhcm5pbmc6YWN0aXZlOmVuYWJsZWQgewogIGJhY2tncm91bmQtY29sb3I6ICNiNTAwMDA7Cn0KLmJ1dHRvbi5pcy1wb3NpdGl2ZWFjdGlvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzcwZDE2ZDsKfQouYnV0dG9uLmlzLXBvc2l0aXZlYWN0aW9uOmhvdmVyOmVuYWJsZWQsIC5idXR0b24uaXMtcG9zaXRpdmVhY3Rpb246YWN0aXZlOmVuYWJsZWQgewogIGJhY2tncm91bmQtY29sb3I6ICMwODk4MDA7Cn0KLmJ1dHRvbiBhOmhvdmVyIHsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCmJ1dHRvbi5idXR0b24gewogIGJvcmRlcjogbm9uZTsKfQoKaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9cmVzZXRdIHsKICB0ZXh0LXNpemUtYWRqdXN0OiAxMDAlOwogIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOwp9CgpAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7CiAgaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9cmVzZXRdLCBidXR0b24sIC5idG4gewogICAgbWFyZ2luOiAxZW0gMDsKICB9Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpIHsKICBpbnB1dFt0eXBlPXN1Ym1pdF0sIGlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1yZXNldF0sIGJ1dHRvbiwgLmJ0biB7CiAgICBtYXJnaW46IDJlbSBhdXRvOwogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMTAwJTsKICB9Cn0KLnRvcC1saW5rcyB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogIGZsZXg6IDAgMSAxMDAlOwp9Ci50b3AtbGlua3MgLnVzZXItbGV2ZWwtYWRtaW5pc3RyYXRvciB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50b3AtbGlua3MgcCB7CiAgcGFkZGluZzogMCAxMHB4Owp9CgoudG9wLWxpbmtzIHA6bGFzdC1jaGlsZCB7CiAgZGlzcGxheTogbm9uZTsKfQoKLnNoaXBwaW5nLWluZm8gewogIGRpc3BsYXk6IGZsZXg7CiAgY29sb3I6ICMwMDcxYmM7CiAgZmxleDogMSAwIGF1dG87Cn0KCi5zaGlwcGluZy1pbmZvIGltZyB7CiAgcGFkZGluZy1yaWdodDogMTFweDsKfQoKLm5hdmlnYXRpb24taGVhZGVyIHsKICBkaXNwbGF5OiBmbGV4Owp9CgppbnB1dCwgYnV0dG9uLCBzZWxlY3QsIHRleHRhcmVhIHsKICBmb250LWZhbWlseTogaW5oZXJpdDsKICBmb250LXNpemU6IGluaGVyaXQ7Cn0KCmlucHV0LCBzZWxlY3QsIHRleHRhcmVhIHsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDA7CiAgLW1vei1ib3JkZXItcmFkaXVzOiAwOwogIGJvcmRlci1yYWRpdXM6IDA7CiAgd2lkdGg6IDEwMCU7CiAgbWluLWhlaWdodDogMS41ZW07CiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjsKICBwYWRkaW5nOiAwLjRlbTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogIGNvbG9yOiAjMzMzMzMyOwogIG1hcmdpbi1ib3R0b206IDFlbTsKICBtYXgtd2lkdGg6IDEwMCU7Cn0KaW5wdXQ6aG92ZXIsIHNlbGVjdDpob3ZlciwgdGV4dGFyZWE6aG92ZXIgewogIGJvcmRlcjogMXB4IHNvbGlkICNjYmQwZDE7Cn0KaW5wdXQ6Zm9jdXMsIHNlbGVjdDpmb2N1cywgdGV4dGFyZWE6Zm9jdXMgewogIGJvcmRlcjogMXB4IHNvbGlkICMzMzMzMzI7CiAgb3V0bGluZTogMXB4IHNvbGlkICMzMzMzMzI7Cn0KCnRleHRhcmVhIHsKICB3aWR0aDogMTAwJTsKfQoKZm9ybSB7CiAgbWF4LXdpZHRoOiA3MDBweDsKfQpmb3JtIGlucHV0W3R5cGU9dXNlcm5hbWVdLCBmb3JtIGlucHV0W3R5cGU9cGFzc3dvcmRdIHsKICBtYXgtd2lkdGg6IDUwJTsKICBkaXNwbGF5OiBibG9jazsKfQpmb3JtIGJ1dHRvbiB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbjogMWVtIDA7Cn0KCnNlbGVjdCB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwOwogIC1tb3otYm9yZGVyLXJhZGl1czogMDsKICBib3JkZXItcmFkaXVzOiAwOwogIG1hcmdpbjogNHB4IDBweDsKICBoZWlnaHQ6IDMwcHg7CiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjsKICBwYWRkaW5nOiA0cHg7CiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDsKICBjb2xvcjogIzMzMzMzMjsKICBmb250LWZhbWlseTogaW5oZXJpdDsKICBmb250LXNpemU6IGluaGVyaXQ7CiAgbWluLXdpZHRoOiAxMjBweDsKICBtYXgtd2lkdGg6IDMyMHB4Owp9CnNlbGVjdDo6LW1zLWV4cGFuZCB7CiAgZGlzcGxheTogbm9uZTsKfQpzZWxlY3Q6aG92ZXIgewogIGJvcmRlcjogMXB4IHNvbGlkICNjYmQwZDE7Cn0Kc2VsZWN0OmZvY3VzIHsKICBib3JkZXI6IDFweCBzb2xpZCAjMzMzMzMyOwp9CgouY29uZmlybWF0aW9uIHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKbGFiZWwgewogIGNvbG9yOiAjOTk5OwogIGRpc3BsYXk6IGJsb2NrOwogIGxpbmUtaGVpZ2h0OiAyNXB4Owp9Cgoubm90aWZpY2F0aW9uLWxhYnNvbHZlZC1oaWRkZW4gewogIG1heC1oZWlnaHQ6IDA7CiAgb3BhY2l0eTogMDsKICBvdmVyZmxvdzogaGlkZGVuOwogIHZpc2liaWxpdHk6IGhpZGRlbjsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZC1oaWRkZW4gLmNvbnRhaW5lciB7CiAgbWF4LWhlaWdodDogMDsKfQoKLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgewogIC1vLXRyYW5zaXRpb246IG1heC1oZWlnaHQgMC41cyBlYXNlLWluIDBzLCBvcGFjaXR5IDAuNXMgZWFzZS1pbiAwLjJzLCB0cmFuc2l0aW9uIDAuNXMgZWFzZS1pbiAwLjJzOwogIC1tb3otdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjVzIGVhc2UtaW4gMHMsIG9wYWNpdHkgMC41cyBlYXNlLWluIDAuMnMsIHRyYW5zaXRpb24gMC41cyBlYXNlLWluIDAuMnM7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1pbiAwcywgb3BhY2l0eSAwLjVzIGVhc2UtaW4gMC4ycywgdHJhbnNpdGlvbiAwLjVzIGVhc2UtaW4gMC4yczsKICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1pbiAwcywgb3BhY2l0eSAwLjVzIGVhc2UtaW4gMC4ycywgdHJhbnNpdGlvbiAwLjVzIGVhc2UtaW4gMC4yczsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY2NjMzOwogIG9wYWNpdHk6IDE7CiAgbWF4LWhlaWdodDogMTAwcHg7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZFtjb21wbGV0aW9uLXR5cGU9aW5jb21wbGV0ZV0gewogIGJhY2tncm91bmQtY29sb3I6ICNmZmFmMTA7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWRbY29tcGxldGlvbi10eXBlPWluY29tcGxldGVdIC5jb250YWluZXIgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmFmMTA7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciB7CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLW1vei1ib3g7CiAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IGZsZXg7CiAgLXdlYmtpdC1ib3gtcGFjazoganVzdGlmeTsKICAtbW96LWJveC1wYWNrOiBqdXN0aWZ5OwogIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7CiAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7CiAgLW1vei1ib3gtYWxpZ246IGNlbnRlcjsKICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIC1vLXRyYW5zaXRpb246IG1heC1oZWlnaHQgMC41cyBlYXNlLWluIDBzLCBwYWRkaW5nIDAuNXMgZWFzZS1pbiAwczsKICAtbW96LXRyYW5zaXRpb246IG1heC1oZWlnaHQgMC41cyBlYXNlLWluIDBzLCBwYWRkaW5nIDAuNXMgZWFzZS1pbiAwczsKICAtd2Via2l0LXRyYW5zaXRpb246IG1heC1oZWlnaHQgMC41cyBlYXNlLWluIDBzLCBwYWRkaW5nIDAuNXMgZWFzZS1pbiAwczsKICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1pbiAwcywgcGFkZGluZyAwLjVzIGVhc2UtaW4gMHM7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNjYzMzsKICBtYXJnaW46IDAgYXV0bzsKICBtYXgtaGVpZ2h0OiAxMDBweDsKICBwYWRkaW5nOiBjYWxjKGNhbGMoMSAqIHZhcigtLXNwYWNpbmdiYXNlKSkgLSAzcHgpIDAgY2FsYygxICogdmFyKC0tc3BhY2luZ2Jhc2UpKSAwOwp9Ci5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgaDQgewogIGZsZXg6IDE7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmctcmlnaHQ6IDEwcHg7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBzcGFuIHsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgaDQsIC5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgYSwgLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBzcGFuIHsKICBjb2xvcjogI2ZmZjsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGEgewogIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWZsZXg7CiAgZGlzcGxheTogLW1zLWlubGluZS1mbGV4Ym94OwogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7CiAgLW1vei1ib3gtYWxpZ246IGNlbnRlcjsKICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBhLmJ1dHRvbiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMjsKICBib3JkZXItcmFkaXVzOiAwOwogIG1pbi13aWR0aDogMDsKICBwYWRkaW5nOiAwIDVweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGEuYnV0dG9uOmhvdmVyIHsKICBjb2xvcjogIzMzMzMzMjsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGEuYnV0dG9uIHN2ZyB7CiAgZmlsbDogY3VycmVudENvbG9yOwogIHBhZGRpbmctcmlnaHQ6IDVweDsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGE6bGFzdC1jaGlsZCB7CiAgLW8tdHJhbnNpdGlvbjogY29sb3IgMC4ycywgZmlsbCAwLjJzOwogIC1tb3otdHJhbnNpdGlvbjogY29sb3IgMC4ycywgZmlsbCAwLjJzOwogIC13ZWJraXQtdHJhbnNpdGlvbjogY29sb3IgMC4ycywgZmlsbCAwLjJzOwogIHRyYW5zaXRpb246IGNvbG9yIDAuMnMsIGZpbGwgMC4yczsKICBwYWRkaW5nLWxlZnQ6IDIwcHg7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBhOmxhc3QtY2hpbGQgc3ZnIHsKICBmaWxsOiBjdXJyZW50Q29sb3I7CiAgcGFkZGluZy1sZWZ0OiA1cHg7CiAgaGVpZ2h0OiAxMnB4Owp9Ci5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgYTpsYXN0LWNoaWxkOmhvdmVyIHsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgY29sb3I6ICMzMzMzMzI7Cn0KCnRhYmxlIHsKICBib3JkZXItc3BhY2luZzogMDsKICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogIHRhYmxlLWxheW91dDogZml4ZWQ7CiAgb3ZlcmZsb3cteDogYXV0bzsKICBkaXNwbGF5OiBibG9jazsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgbWFyZ2luOiBjYWxjKDEuMjUgKiB2YXIoLS1zcGFjaW5nYmFzZSkpIDA7Cn0KdGFibGU6Zmlyc3QtY2hpbGQgewogIG1hcmdpbjogMCAwIGNhbGMoMS4yNSAqIHZhcigtLXNwYWNpbmdiYXNlKSkgMDsKfQp0YWJsZTpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkIHsKICBtYXJnaW46IDA7Cn0KdGFibGUgdHIgewogIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTZlNmU2OwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTZlNmU2OwogIG1pbi1oZWlnaHQ6IDMxcHg7Cn0KdGFibGUgdHI6Zmlyc3QtY2hpbGQgewogIGJvcmRlci10b3A6IG5vbmU7Cn0KdGFibGUgdHIgdGQsIHRhYmxlIHRyIHRoIHsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHBhZGRpbmc6IDRweCAxNnB4IDRweCAwOwogIHRleHQtYWxpZ246IGxlZnQ7Cn0KdGFibGUgdHIgdGQ6bGFzdC1jaGlsZCwgdGFibGUgdHIgdGg6bGFzdC1jaGlsZCB7CiAgcGFkZGluZzogNHB4IDA7Cn0KdGFibGUuaXMtZnVsbHlib3JkZXJlZCB0ciB7CiAgYm9yZGVyOiBub25lOwp9CnRhYmxlLmlzLWZ1bGx5Ym9yZGVyZWQgdHIgdGQsIHRhYmxlLmlzLWZ1bGx5Ym9yZGVyZWQgdHIgdGggewogIGJvcmRlcjogMXB4IHNvbGlkICNlNmU2ZTY7CiAgcGFkZGluZzogNHB4IDhweDsKfQp0YWJsZS5pcy1mdWxsd2lkdGggewogIHdpZHRoOiAxMDAlOwogIGRpc3BsYXk6IHRhYmxlOwp9CnRhYmxlLmlzLWZ1bGx3aWR0aC1saXN0IHsKICB3aWR0aDogMTAwJTsKICBkaXNwbGF5OiB0YWJsZTsKfQp0YWJsZS5pcy1mdWxsd2lkdGgtbGlzdCB0ciB0ZDpmaXJzdC1jaGlsZCwgdGFibGUuaXMtZnVsbHdpZHRoLWxpc3QgdHIgdGg6Zmlyc3QtY2hpbGQgewogIHdpZHRoOiA2NSU7Cn0KdGFibGUuaXMtdGFibGUtbGlzdCB7CiAgd2lkdGg6IDEwMCU7CiAgZGlzcGxheTogdGFibGU7Cn0KdGFibGUuaXMtdGFibGUtbGlzdCB0ciB7CiAgLXdlYmtpdC1ib3gtYWxpZ246IHN0YXJ0OwogIC1tb3otYm94LWFsaWduOiBzdGFydDsKICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICBkaXNwbGF5OiAtbW96LWJveDsKICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgZGlzcGxheTogZmxleDsKICAtd2Via2l0LWJveC1wYWNrOiBqdXN0aWZ5OwogIC1tb3otYm94LXBhY2s6IGp1c3RpZnk7CiAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgYm9yZGVyLXRvcDogbm9uZTsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U2ZTZlNjsKfQp0YWJsZS5pcy10YWJsZS1saXN0IHRyIHRkLCB0YWJsZS5pcy10YWJsZS1saXN0IHRyIHRoIHsKICAtd2Via2l0LWFsaWduLXNlbGY6IGNlbnRlcjsKICAtbXMtZmxleC1pdGVtLWFsaWduOiBjZW50ZXI7CiAgYWxpZ24tc2VsZjogY2VudGVyOwp9CnRhYmxlLmlzLXRhYmxlLWxpc3QgdHIgdGQ6Zmlyc3QtY2hpbGQsIHRhYmxlLmlzLXRhYmxlLWxpc3QgdHIgdGg6Zmlyc3QtY2hpbGQgewogIC1tb3otZmxleDogMTsKICAtd2Via2l0LWZsZXg6IDE7CiAgLW1zLWZsZXg6IDE7CiAgZmxleDogMTsKfQp0YWJsZS5pcy10YWJsZS1saXN0IHRyIHRkOmxhc3QtY2hpbGQsIHRhYmxlLmlzLXRhYmxlLWxpc3QgdHIgdGg6bGFzdC1jaGlsZCB7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQp0YWJsZS5pcy10YWJsZS1saXN0IHRyIHRkOmxhc3QtY2hpbGQgewogIGNvbG9yOiAjYjNiM2IzOwp9CnRhYmxlLmlzLXRhYmxlLW51bWJlcnMgdHIgewogIC13ZWJraXQtYm94LWFsaWduOiBzdGFydDsKICAtbW96LWJveC1hbGlnbjogc3RhcnQ7CiAgLW1zLWZsZXgtYWxpZ246IHN0YXJ0OwogIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLW1vei1ib3g7CiAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IGZsZXg7CiAgLXdlYmtpdC1ib3gtcGFjazoganVzdGlmeTsKICAtbW96LWJveC1wYWNrOiBqdXN0aWZ5OwogIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7CiAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIGJvcmRlci10b3A6IG5vbmU7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNmU2ZTY7Cn0KdGFibGUuaXMtdGFibGUtbnVtYmVycyB0ciB0aCwgdGFibGUuaXMtdGFibGUtbnVtYmVycyB0ciB0ZCB7CiAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgLW1zLWZsZXgtaXRlbS1hbGlnbjogY2VudGVyOwogIGFsaWduLXNlbGY6IGNlbnRlcjsKICBtaW4td2lkdGg6IDExMHB4Owp9CnRhYmxlLmlzLXRhYmxlLW51bWJlcnMgdHIgdGg6Zmlyc3QtY2hpbGQsIHRhYmxlLmlzLXRhYmxlLW51bWJlcnMgdHIgdGQ6Zmlyc3QtY2hpbGQgewogIC1tb3otZmxleDogMTsKICAtd2Via2l0LWZsZXg6IDE7CiAgLW1zLWZsZXg6IDE7CiAgZmxleDogMTsKfQp0YWJsZS5pcy10YWJsZS1udW1iZXJzIHRyIHRkIHsKICB0ZXh0LWFsaWduOiByaWdodDsKICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtZW5kOwogIC1tcy1mbGV4LWl0ZW0tYWxpZ246IGVuZDsKICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKfQp0YWJsZS5pcy10YWJsZS1pbmZvcm1hdGlvbiB0ciB7CiAgYm9yZGVyOiBub25lOwogIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQp0YWJsZS5pcy10YWJsZS1pbmZvcm1hdGlvbiB0ciB0aCB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9CnRhYmxlLmlzLXRhYmxlLWluZm9ybWF0aW9uIHRyLnR5cGluZyB0ZCB7CiAgYW5pbWF0aW9uOiB0eXBpbmcgOHMgbGluZWFyIGluZmluaXRlOwp9CnRhYmxlLmlzLXRhYmxlLW11bHRpZGlyZWN0aW9uIHRyIHRoOmZpcnN0LWNoaWxkIHsKICB0ZXh0LWFsaWduOiByaWdodDsKfQp0YWJsZS5pcy10YWJsZS1sb25nZGVzY3JpcHRpb24gdHIgdGgsIHRhYmxlLmlzLXRhYmxlLWxvbmdkZXNjcmlwdGlvbiB0ciB0ZCB7CiAgZGlzcGxheTogYmxvY2s7Cn0KCkBrZXlmcmFtZXMgdHlwaW5nIHsKICA4NSUgewogICAgb3BhY2l0eTogMTsKICB9CiAgODYlIHsKICAgIG9wYWNpdHk6IDA7CiAgfQogIDk1JSB7CiAgICBvcGFjaXR5OiAwOwogIH0KICA5NiUgewogICAgb3BhY2l0eTogMTsKICB9Cn0KLnNlYXJjaCwgLnNlYXJjaC1maWx0ZXJzLCAubG9naW4tZm9ybSB7CiAgYmFja2dyb3VuZDogI2ViZjBmMjsKICBwYWRkaW5nOiAxZW07Cn0KLnNlYXJjaCBpbnB1dCwgLnNlYXJjaCB0ZXh0YXJlYSwgLnNlYXJjaC1maWx0ZXJzIGlucHV0LCAuc2VhcmNoLWZpbHRlcnMgdGV4dGFyZWEsIC5sb2dpbi1mb3JtIGlucHV0LCAubG9naW4tZm9ybSB0ZXh0YXJlYSB7CiAgYmFja2dyb3VuZDogd2hpdGU7Cn0KLnNlYXJjaCBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciwgLnNlYXJjaCB0ZXh0YXJlYTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIGlucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyLCAuc2VhcmNoLWZpbHRlcnMgdGV4dGFyZWE6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIsIC5sb2dpbi1mb3JtIGlucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyLCAubG9naW4tZm9ybSB0ZXh0YXJlYTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7CiAgY29sb3I6ICM5OTk7Cn0KLnNlYXJjaCBpbnB1dDotbW96LXBsYWNlaG9sZGVyLCAuc2VhcmNoIHRleHRhcmVhOi1tb3otcGxhY2Vob2xkZXIsIC5zZWFyY2gtZmlsdGVycyBpbnB1dDotbW96LXBsYWNlaG9sZGVyLCAuc2VhcmNoLWZpbHRlcnMgdGV4dGFyZWE6LW1vei1wbGFjZWhvbGRlciwgLmxvZ2luLWZvcm0gaW5wdXQ6LW1vei1wbGFjZWhvbGRlciwgLmxvZ2luLWZvcm0gdGV4dGFyZWE6LW1vei1wbGFjZWhvbGRlciB7CiAgY29sb3I6ICM5OTk7Cn0KLnNlYXJjaCBpbnB1dDo6LW1vei1wbGFjZWhvbGRlciwgLnNlYXJjaCB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIGlucHV0OjotbW96LXBsYWNlaG9sZGVyLCAuc2VhcmNoLWZpbHRlcnMgdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXIsIC5sb2dpbi1mb3JtIGlucHV0OjotbW96LXBsYWNlaG9sZGVyLCAubG9naW4tZm9ybSB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgY29sb3I6ICM5OTk7Cn0KLnNlYXJjaCBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIsIC5zZWFyY2ggdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyLCAuc2VhcmNoLWZpbHRlcnMgaW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyLCAuc2VhcmNoLWZpbHRlcnMgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyLCAubG9naW4tZm9ybSBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIsIC5sb2dpbi1mb3JtIHRleHRhcmVhOi1tcy1pbnB1dC1wbGFjZWhvbGRlciB7CiAgY29sb3I6ICM5OTk7Cn0KCi5sb2dpbi1mb3JtIGltZyB7CiAgbWFyZ2luLXJpZ2h0OiAxZW07CiAgd2lkdGg6IDVlbTsKfQoKLnNlYXJjaCB7CiAgY29sb3I6IHdoaXRlOwp9Ci5zZWFyY2ggZm9ybSB7CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLW1vei1ib3g7CiAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IGZsZXg7CiAgbWFyZ2luOiAwIGF1dG87Cn0KLnNlYXJjaCBmb3JtIGlucHV0IHsKICAtbW96LWZsZXg6IDEgMSBhdXRvOwogIC13ZWJraXQtZmxleDogMSAxIGF1dG87CiAgLW1zLWZsZXg6IDEgMSBhdXRvOwogIGZsZXg6IDEgMSBhdXRvOwogIG1hcmdpbi1ib3R0b206IDA7Cn0KLnNlYXJjaCBmb3JtIGlucHV0OmhvdmVyIHsKICBib3JkZXI6IDFweCBzb2xpZCAjY2JkMGQxOwp9Ci5zZWFyY2ggZm9ybSBpbnB1dDpmb2N1cyB7CiAgYm9yZGVyOiAxcHggc29saWQgIzMzMzMzMjsKICBvdXRsaW5lOiAxcHggc29saWQgIzMzMzMzMjsKfQouc2VhcmNoIGZvcm0gYnV0dG9uIHsKICBtYXJnaW46IDAgMCAwIDAuNmVtOwp9Cgouc2VhcmNoLWZpbHRlcnMgewogIGNvbG9yOiB3aGl0ZTsKfQouc2VhcmNoLWZpbHRlcnMgYSB7CiAgYm9yZGVyOiAxcHggc29saWQgd2hpdGU7CiAgcGFkZGluZzogNHB4IDVweDsKICBtYXJnaW46IDNweCAwOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQouc2VhcmNoLWZpbHRlcnMgYTpob3ZlciB7CiAgLW8tdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzIGxpbmVhcjsKICAtbW96LXRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycyBsaW5lYXI7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnMgbGluZWFyOwogIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycyBsaW5lYXI7CiAgYmFja2dyb3VuZDogI2ZmZjsKICBib3JkZXI6IDFweCBzb2xpZCAjY2JkMGQxOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQouc2VhcmNoLWZpbHRlcnMgYTpmb2N1cyB7CiAgYm9yZGVyOiAxcHggc29saWQgIzMzMzMzMjsKfQoKI215c3RlcnlPYmplY3RpdmUgewogIG1hcmdpbi10b3A6IDAuNWVtOwp9CgojbXlzdGVyeU9iamVjdGl2ZS5yZXZlYWxlZCB7CiAgZm9udC1zaXplOiAwLjhlbTsKfQoKI215c3RlcnlSZXZlYWwsICNteXN0ZXJ5TGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgpbdGhlbWU9ZWNvbW1lcmNlXSAuZWNvbXMtcGFnZWhlYWRlciB7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1hcmdpbjogMi41ZW0gMCAyZW0gMDsKICBmb250LXdpc2U6IDEzcHg7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmVjb21zLXBhZ2VoZWFkZXIgaW1nIHsKICB3aWR0aDogMzUwcHg7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgaW1nIHsKICBtYXJnaW4tcmlnaHQ6IDFlbTsKfQpbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSBpbWc6Zmlyc3Qtb2YtdHlwZSB7CiAgZGlzcGxheTogYmxvY2s7CiAgcGFkZGluZzogMCAwIDAuN2VtIDA7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgaW1nOm50aC1vZi10eXBlKDIpIHsKICBtYXJnaW46IDFlbSAwOwogIGJvcmRlcjogMXB4IHNvbGlkICNlNmU2ZTY7CiAgZGlzcGxheTogYmxvY2s7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLmJ1dHRvbiB7CiAgYm9yZGVyLXJhZGl1czogMDsKICBwYWRkaW5nOiAwLjJlbSAxZW07CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5idXR0b24ucmlnaHQgewogIGZsb2F0OiByaWdodDsKfQpbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAuYnV0dG9uLmlzLXNtYWxsIHsKICBwYWRkaW5nOiAwLjNlbSAxZW07Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgbGFiZWwgewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5wcm9kdWN0LW1lc3NhZ2luZy1iYW5uZXIgewogIGJhY2tncm91bmQ6IHllbGxvdzsKICBib3JkZXI6IDJweCBzb2xpZCBvcmFuZ2U7CiAgYm9yZGVyLXJhZGl1czogN3B4OwogIHdpZHRoOiBmaXQtY29udGVudDsKICBtYXJnaW4tYmxvY2s6IDEwcHg7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLnByb2R1Y3QtbWVzc2FnaW5nLWJhbm5lciBwIHsKICBtYXJnaW46IDVweDsKfQpbdGhlbWU9ZWNvbW1lcmNlXSBzZWN0aW9uLnByb2R1Y3QtcmV2aWV3cyAucHJvZHVjdC1yZXZpZXcgewogIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWJmMGYyOwogIG1hcmdpbjogMWVtIDA7CiAgcGFkZGluZy10b3A6IDFlbTsKfQpbdGhlbWU9ZWNvbW1lcmNlXSBzZWN0aW9uLnByb2R1Y3QtcmV2aWV3cyAucHJvZHVjdC1yZXZpZXcgaW1nIHsKICBmbG9hdDogbGVmdDsKICBtYXJnaW4tcmlnaHQ6IDFlbTsKICB3aWR0aDogMS42ZW07Cn0KW3RoZW1lPWVjb21tZXJjZV0gc2VjdGlvbi5wcm9kdWN0LXJldmlld3MgLnByb2R1Y3QtcmV2aWV3LWRlbGV0ZS1mb3JtIHsKICBkaXNwbGF5OiBpbmxpbmU7CiAgZmxvYXQ6IGlubGluZS1lbmQ7Cn0KW3RoZW1lPWVjb21tZXJjZV0gc2VjdGlvbi5wcm9kdWN0LXJldmlld3MgLnByb2R1Y3QtcmV2aWV3LWRlbGV0ZS1mb3JtIC5idXR0b24gewogIG1hcmdpbjogMDsKICBtaW4td2lkdGg6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmNhcHRjaGEtY29udGFpbmVyIGlucHV0W3R5cGU9dGV4dF0gewogIHBhZGRpbmc6IDEycHggMjBweDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICBib3JkZXItcmFkaXVzOiA0cHg7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQpbdGhlbWU9ZWNvbW1lcmNlXSAuY2FwdGNoYS1jb250YWluZXIgY2FudmFzIHsKICAvKnByZXZlbnQgaW50ZXJhY3Rpb24gd2l0aCB0aGUgY2FudmFzKi8KICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyojIHNvdXJjZU1hcHBpbmdVUkw9bGFic0Vjb21tZXJjZS5jc3MubWFwICovCg==","response_hash":"fc4b2d128df05d2bba30ae0c157bc2389c8dab414b68521c9ce36b65ce3bcddc","response_time_ms":0,"response_words":3090,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"css","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":18},{"name":"3","value":"labsEcommerce.css","type":"path","name_start":-1,"name_end":-1,"value_start":19,"value_end":36}],"sent_at":"2026-04-05T05:31:40.698547Z","received_at":"2026-04-05T05:31:40.698542Z","created_at":"2026-04-05T05:31:40Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"45c0f878-af27-4aa9-8e3a-ad9b5196592b","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/images/icon-search.svg","url":"https://ginandjuice.shop/resources/images/icon-search.svg","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/resources/css/labsScanme.css"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvaW1hZ2VzL2ljb24tc2VhcmNoLnN2ZyBIVFRQLzEuMQ0KSG9zdDogZ2luYW5kanVpY2Uuc2hvcA0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2DQpBY2NlcHQtTGFuZ3VhZ2U6IGVuDQpSZWZlcmVyOiBodHRwczovL2dpbmFuZGp1aWNlLnNob3AvcmVzb3VyY2VzL2Nzcy9sYWJzU2Nhbm1lLmNzcw0KDQo=","request_hash":"bbcfa67e33082fdcfd4964e5fabe4a2108c4e8f56565164883b1a72f459d46d1","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["241"],"content-type":["image/svg+xml"],"date":["Sun, 05 Apr 2026 05:31:40 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"image/svg+xml","response_content_length":487,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjYWNoZS1jb250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MzYwMA0KY29udGVudC1sZW5ndGg6IDI0MQ0KeC1iYWNrZW5kOiBjOThkZjVjNC1hNTI3LTRkYWEtODhjZC04M2M1ZGU0ZTdjNzcNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzE6NDAgR01UDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LXR5cGU6IGltYWdlL3N2Zyt4bWwNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KDQo8c3ZnIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDE4IDE4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNOC4yNSAxNC4yNUMxMS41NjM3IDE0LjI1IDE0LjI1IDExLjU2MzcgMTQuMjUgOC4yNUMxNC4yNSA0LjkzNjI5IDExLjU2MzcgMi4yNSA4LjI1IDIuMjVDNC45MzYyOSAyLjI1IDIuMjUgNC45MzYyOSAyLjI1IDguMjVDMi4yNSAxMS41NjM3IDQuOTM2MjkgMTQuMjUgOC4yNSAxNC4yNVoiIHN0cm9rZT0iIzAwMDAyMyIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTUuNzUwOCAxNS43NUwxMi40ODgzIDEyLjQ4NzUiIHN0cm9rZT0iIzAwMDAyMyIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K","response_hash":"523ff3a2c4e0a99f87b66095a16c8497a2cd29c985b36e8624e4f9435aa457a6","response_time_ms":0,"response_words":65,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"images","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":21},{"name":"3","value":"icon-search.svg","type":"path","name_start":-1,"name_end":-1,"value_start":22,"value_end":37}],"sent_at":"2026-04-05T05:31:40.956396Z","received_at":"2026-04-05T05:31:40.956392Z","created_at":"2026-04-05T05:31:40Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"4b262dc9-f41a-4019-a6c4-04e0b0aa78b5","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/js/angular_1-7-7.js","url":"https://ginandjuice.shop/resources/js/angular_1-7-7.js","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvanMvYW5ndWxhcl8xLTctNy5qcyBIVFRQLzEuMQ0KSG9zdDogZ2luYW5kanVpY2Uuc2hvcA0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KUmVmZXJlcjogaHR0cHM6Ly9naW5hbmRqdWljZS5zaG9wLw0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2DQoNCg==","request_hash":"4887202c33d1c429ee7b67cdf76ff4c9e9fb89fd925a93e745d523928d2f29cc","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["62531"],"content-type":["application/javascript; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:31:31 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/javascript; charset=utf-8","response_content_length":195161,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY2FjaGUtY29udHJvbDogcHVibGljLCBtYXgtYWdlPTM2MDANCmNvbnRlbnQtbGVuZ3RoOiA2MjUzMQ0KeC1iYWNrZW5kOiBjOThkZjVjNC1hNTI3LTRkYWEtODhjZC04M2M1ZGU0ZTdjNzcNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzE6MzEgR01UDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQoNCi8qCiBBbmd1bGFySlMgdjEuNy43CiAoYykgMjAxMC0yMDE4IEdvb2dsZSwgSW5jLiBodHRwOi8vYW5ndWxhcmpzLm9yZwogTGljZW5zZTogTUlUCiovCihmdW5jdGlvbihDKXsndXNlIHN0cmljdCc7ZnVuY3Rpb24gcmUoYSl7aWYoRChhKSl3KGEub2JqZWN0TWF4RGVwdGgpJiYoV2Iub2JqZWN0TWF4RGVwdGg9WGIoYS5vYmplY3RNYXhEZXB0aCk/YS5vYmplY3RNYXhEZXB0aDpOYU4pLHcoYS51cmxFcnJvclBhcmFtc0VuYWJsZWQpJiZHYShhLnVybEVycm9yUGFyYW1zRW5hYmxlZCkmJihXYi51cmxFcnJvclBhcmFtc0VuYWJsZWQ9YS51cmxFcnJvclBhcmFtc0VuYWJsZWQpO2Vsc2UgcmV0dXJuIFdifWZ1bmN0aW9uIFhiKGEpe3JldHVybiBXKGEpJiYwPGF9ZnVuY3Rpb24gRihhLGIpe2I9Ynx8RXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGQ9YXJndW1lbnRzWzBdLGM7Yz0iWyIrKGE/YSsiOiI6IiIpK2QrIl0gaHR0cDovL2Vycm9ycy5hbmd1bGFyanMub3JnLzEuNy43LyIrKGE/YSsiLyI6IiIpK2Q7Zm9yKGQ9MTtkPGFyZ3VtZW50cy5sZW5ndGg7ZCsrKXtjPWMrKDE9PWQ/Ij8iOiImIikrInAiKyhkLTEpKyI9Ijt2YXIgZT1lbmNvZGVVUklDb21wb25lbnQsCiAgICBmO2Y9YXJndW1lbnRzW2RdO2Y9ImZ1bmN0aW9uIj09dHlwZW9mIGY/Zi50b1N0cmluZygpLnJlcGxhY2UoLyBce1tcc1xTXSokLywiIik6InVuZGVmaW5lZCI9PXR5cGVvZiBmPyJ1bmRlZmluZWQiOiJzdHJpbmciIT10eXBlb2YgZj9KU09OLnN0cmluZ2lmeShmKTpmO2MrPWUoZil9cmV0dXJuIG5ldyBiKGMpfX1mdW5jdGlvbiB5YShhKXtpZihudWxsPT1hfHwkYShhKSlyZXR1cm4hMTtpZihIKGEpfHxBKGEpfHx4JiZhIGluc3RhbmNlb2YgeClyZXR1cm4hMDt2YXIgYj0ibGVuZ3RoImluIE9iamVjdChhKSYmYS5sZW5ndGg7cmV0dXJuIFcoYikmJigwPD1iJiZiLTEgaW4gYXx8ImZ1bmN0aW9uIj09PXR5cGVvZiBhLml0ZW0pfWZ1bmN0aW9uIHIoYSxiLGQpe3ZhciBjLGU7aWYoYSlpZihCKGEpKWZvcihjIGluIGEpInByb3RvdHlwZSIhPT1jJiYibGVuZ3RoIiE9PWMmJiJuYW1lIiE9PWMmJmEuaGFzT3duUHJvcGVydHkoYykmJmIuY2FsbChkLGFbY10sYyxhKTtlbHNlIGlmKEgoYSl8fAogICAgeWEoYSkpe3ZhciBmPSJvYmplY3QiIT09dHlwZW9mIGE7Yz0wO2ZvcihlPWEubGVuZ3RoO2M8ZTtjKyspKGZ8fGMgaW4gYSkmJmIuY2FsbChkLGFbY10sYyxhKX1lbHNlIGlmKGEuZm9yRWFjaCYmYS5mb3JFYWNoIT09cilhLmZvckVhY2goYixkLGEpO2Vsc2UgaWYoTmMoYSkpZm9yKGMgaW4gYSliLmNhbGwoZCxhW2NdLGMsYSk7ZWxzZSBpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEuaGFzT3duUHJvcGVydHkpZm9yKGMgaW4gYSlhLmhhc093blByb3BlcnR5KGMpJiZiLmNhbGwoZCxhW2NdLGMsYSk7ZWxzZSBmb3IoYyBpbiBhKXRhLmNhbGwoYSxjKSYmYi5jYWxsKGQsYVtjXSxjLGEpO3JldHVybiBhfWZ1bmN0aW9uIE9jKGEsYixkKXtmb3IodmFyIGM9T2JqZWN0LmtleXMoYSkuc29ydCgpLGU9MDtlPGMubGVuZ3RoO2UrKyliLmNhbGwoZCxhW2NbZV1dLGNbZV0pO3JldHVybiBjfWZ1bmN0aW9uIFliKGEpe3JldHVybiBmdW5jdGlvbihiLGQpe2EoZCxiKX19ZnVuY3Rpb24gc2UoKXtyZXR1cm4rK3BifQogICAgZnVuY3Rpb24gWmIoYSxiLGQpe2Zvcih2YXIgYz1hLiQkaGFzaEtleSxlPTAsZj1iLmxlbmd0aDtlPGY7KytlKXt2YXIgZz1iW2VdO2lmKEQoZyl8fEIoZykpZm9yKHZhciBrPU9iamVjdC5rZXlzKGcpLGg9MCxsPWsubGVuZ3RoO2g8bDtoKyspe3ZhciBtPWtbaF0scD1nW21dO2QmJkQocCk/aGEocCk/YVttXT1uZXcgRGF0ZShwLnZhbHVlT2YoKSk6YWIocCk/YVttXT1uZXcgUmVnRXhwKHApOnAubm9kZU5hbWU/YVttXT1wLmNsb25lTm9kZSghMCk6JGIocCk/YVttXT1wLmNsb25lKCk6KEQoYVttXSl8fChhW21dPUgocCk/W106e30pLFpiKGFbbV0sW3BdLCEwKSk6YVttXT1wfX1jP2EuJCRoYXNoS2V5PWM6ZGVsZXRlIGEuJCRoYXNoS2V5O3JldHVybiBhfWZ1bmN0aW9uIFMoYSl7cmV0dXJuIFpiKGEsSGEuY2FsbChhcmd1bWVudHMsMSksITEpfWZ1bmN0aW9uIHRlKGEpe3JldHVybiBaYihhLEhhLmNhbGwoYXJndW1lbnRzLDEpLCEwKX1mdW5jdGlvbiBmYShhKXtyZXR1cm4gcGFyc2VJbnQoYSwKICAgICAgICAxMCl9ZnVuY3Rpb24gYWMoYSxiKXtyZXR1cm4gUyhPYmplY3QuY3JlYXRlKGEpLGIpfWZ1bmN0aW9uIEUoKXt9ZnVuY3Rpb24gVGEoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gaWEoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGF9fWZ1bmN0aW9uIGJjKGEpe3JldHVybiBCKGEudG9TdHJpbmcpJiZhLnRvU3RyaW5nIT09bGF9ZnVuY3Rpb24geihhKXtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBhfWZ1bmN0aW9uIHcoYSl7cmV0dXJuInVuZGVmaW5lZCIhPT10eXBlb2YgYX1mdW5jdGlvbiBEKGEpe3JldHVybiBudWxsIT09YSYmIm9iamVjdCI9PT10eXBlb2YgYX1mdW5jdGlvbiBOYyhhKXtyZXR1cm4gbnVsbCE9PWEmJiJvYmplY3QiPT09dHlwZW9mIGEmJiFQYyhhKX1mdW5jdGlvbiBBKGEpe3JldHVybiJzdHJpbmciPT09dHlwZW9mIGF9ZnVuY3Rpb24gVyhhKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBhfWZ1bmN0aW9uIGhhKGEpe3JldHVybiJbb2JqZWN0IERhdGVdIj09PWxhLmNhbGwoYSl9CiAgICBmdW5jdGlvbiBIKGEpe3JldHVybiBBcnJheS5pc0FycmF5KGEpfHxhIGluc3RhbmNlb2YgQXJyYXl9ZnVuY3Rpb24gY2MoYSl7c3dpdGNoKGxhLmNhbGwoYSkpe2Nhc2UgIltvYmplY3QgRXJyb3JdIjpyZXR1cm4hMDtjYXNlICJbb2JqZWN0IEV4Y2VwdGlvbl0iOnJldHVybiEwO2Nhc2UgIltvYmplY3QgRE9NRXhjZXB0aW9uXSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4gYSBpbnN0YW5jZW9mIEVycm9yfX1mdW5jdGlvbiBCKGEpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgYX1mdW5jdGlvbiBhYihhKXtyZXR1cm4iW29iamVjdCBSZWdFeHBdIj09PWxhLmNhbGwoYSl9ZnVuY3Rpb24gJGEoYSl7cmV0dXJuIGEmJmEud2luZG93PT09YX1mdW5jdGlvbiBiYihhKXtyZXR1cm4gYSYmYS4kZXZhbEFzeW5jJiZhLiR3YXRjaH1mdW5jdGlvbiBHYShhKXtyZXR1cm4iYm9vbGVhbiI9PT10eXBlb2YgYX1mdW5jdGlvbiB1ZShhKXtyZXR1cm4gYSYmVyhhLmxlbmd0aCkmJnZlLnRlc3QobGEuY2FsbChhKSl9CiAgICBmdW5jdGlvbiAkYihhKXtyZXR1cm4hKCFhfHwhKGEubm9kZU5hbWV8fGEucHJvcCYmYS5hdHRyJiZhLmZpbmQpKX1mdW5jdGlvbiB3ZShhKXt2YXIgYj17fTthPWEuc3BsaXQoIiwiKTt2YXIgZDtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWJbYVtkXV09ITA7cmV0dXJuIGJ9ZnVuY3Rpb24gdWEoYSl7cmV0dXJuIEsoYS5ub2RlTmFtZXx8YVswXSYmYVswXS5ub2RlTmFtZSl9ZnVuY3Rpb24gY2IoYSxiKXt2YXIgZD1hLmluZGV4T2YoYik7MDw9ZCYmYS5zcGxpY2UoZCwxKTtyZXR1cm4gZH1mdW5jdGlvbiBJYShhLGIsZCl7ZnVuY3Rpb24gYyhhLGIsYyl7Yy0tO2lmKDA+YylyZXR1cm4iLi4uIjt2YXIgZD1iLiQkaGFzaEtleSxmO2lmKEgoYSkpe2Y9MDtmb3IodmFyIGc9YS5sZW5ndGg7ZjxnO2YrKyliLnB1c2goZShhW2ZdLGMpKX1lbHNlIGlmKE5jKGEpKWZvcihmIGluIGEpYltmXT1lKGFbZl0sYyk7ZWxzZSBpZihhJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuaGFzT3duUHJvcGVydHkpZm9yKGYgaW4gYSlhLmhhc093blByb3BlcnR5KGYpJiYKICAgIChiW2ZdPWUoYVtmXSxjKSk7ZWxzZSBmb3IoZiBpbiBhKXRhLmNhbGwoYSxmKSYmKGJbZl09ZShhW2ZdLGMpKTtkP2IuJCRoYXNoS2V5PWQ6ZGVsZXRlIGIuJCRoYXNoS2V5O3JldHVybiBifWZ1bmN0aW9uIGUoYSxiKXtpZighRChhKSlyZXR1cm4gYTt2YXIgZD1nLmluZGV4T2YoYSk7aWYoLTEhPT1kKXJldHVybiBrW2RdO2lmKCRhKGEpfHxiYihhKSl0aHJvdyBwYSgiY3B3cyIpO3ZhciBkPSExLGU9ZihhKTt2b2lkIDA9PT1lJiYoZT1IKGEpP1tdOk9iamVjdC5jcmVhdGUoUGMoYSkpLGQ9ITApO2cucHVzaChhKTtrLnB1c2goZSk7cmV0dXJuIGQ/YyhhLGUsYik6ZX1mdW5jdGlvbiBmKGEpe3N3aXRjaChsYS5jYWxsKGEpKXtjYXNlICJbb2JqZWN0IEludDhBcnJheV0iOmNhc2UgIltvYmplY3QgSW50MTZBcnJheV0iOmNhc2UgIltvYmplY3QgSW50MzJBcnJheV0iOmNhc2UgIltvYmplY3QgRmxvYXQzMkFycmF5XSI6Y2FzZSAiW29iamVjdCBGbG9hdDY0QXJyYXldIjpjYXNlICJbb2JqZWN0IFVpbnQ4QXJyYXldIjpjYXNlICJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSI6Y2FzZSAiW29iamVjdCBVaW50MTZBcnJheV0iOmNhc2UgIltvYmplY3QgVWludDMyQXJyYXldIjpyZXR1cm4gbmV3IGEuY29uc3RydWN0b3IoZShhLmJ1ZmZlciksCiAgICAgICAgYS5ieXRlT2Zmc2V0LGEubGVuZ3RoKTtjYXNlICJbb2JqZWN0IEFycmF5QnVmZmVyXSI6aWYoIWEuc2xpY2Upe3ZhciBiPW5ldyBBcnJheUJ1ZmZlcihhLmJ5dGVMZW5ndGgpOyhuZXcgVWludDhBcnJheShiKSkuc2V0KG5ldyBVaW50OEFycmF5KGEpKTtyZXR1cm4gYn1yZXR1cm4gYS5zbGljZSgwKTtjYXNlICJbb2JqZWN0IEJvb2xlYW5dIjpjYXNlICJbb2JqZWN0IE51bWJlcl0iOmNhc2UgIltvYmplY3QgU3RyaW5nXSI6Y2FzZSAiW29iamVjdCBEYXRlXSI6cmV0dXJuIG5ldyBhLmNvbnN0cnVjdG9yKGEudmFsdWVPZigpKTtjYXNlICJbb2JqZWN0IFJlZ0V4cF0iOnJldHVybiBiPW5ldyBSZWdFeHAoYS5zb3VyY2UsYS50b1N0cmluZygpLm1hdGNoKC9bXi9dKiQvKVswXSksYi5sYXN0SW5kZXg9YS5sYXN0SW5kZXgsYjtjYXNlICJbb2JqZWN0IEJsb2JdIjpyZXR1cm4gbmV3IGEuY29uc3RydWN0b3IoW2FdLHt0eXBlOmEudHlwZX0pfWlmKEIoYS5jbG9uZU5vZGUpKXJldHVybiBhLmNsb25lTm9kZSghMCl9CiAgICAgICAgdmFyIGc9W10saz1bXTtkPVhiKGQpP2Q6TmFOO2lmKGIpe2lmKHVlKGIpfHwiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09bGEuY2FsbChiKSl0aHJvdyBwYSgiY3B0YSIpO2lmKGE9PT1iKXRocm93IHBhKCJjcGkiKTtIKGIpP2IubGVuZ3RoPTA6cihiLGZ1bmN0aW9uKGEsYyl7IiQkaGFzaEtleSIhPT1jJiZkZWxldGUgYltjXX0pO2cucHVzaChhKTtrLnB1c2goYik7cmV0dXJuIGMoYSxiLGQpfXJldHVybiBlKGEsZCl9ZnVuY3Rpb24gZGMoYSxiKXtyZXR1cm4gYT09PWJ8fGEhPT1hJiZiIT09Yn1mdW5jdGlvbiB2YShhLGIpe2lmKGE9PT1iKXJldHVybiEwO2lmKG51bGw9PT1hfHxudWxsPT09YilyZXR1cm4hMTtpZihhIT09YSYmYiE9PWIpcmV0dXJuITA7dmFyIGQ9dHlwZW9mIGEsYztpZihkPT09dHlwZW9mIGImJiJvYmplY3QiPT09ZClpZihIKGEpKXtpZighSChiKSlyZXR1cm4hMTtpZigoZD1hLmxlbmd0aCk9PT1iLmxlbmd0aCl7Zm9yKGM9MDtjPGQ7YysrKWlmKCF2YShhW2NdLAogICAgICAgIGJbY10pKXJldHVybiExO3JldHVybiEwfX1lbHNle2lmKGhhKGEpKXJldHVybiBoYShiKT9kYyhhLmdldFRpbWUoKSxiLmdldFRpbWUoKSk6ITE7aWYoYWIoYSkpcmV0dXJuIGFiKGIpP2EudG9TdHJpbmcoKT09PWIudG9TdHJpbmcoKTohMTtpZihiYihhKXx8YmIoYil8fCRhKGEpfHwkYShiKXx8SChiKXx8aGEoYil8fGFiKGIpKXJldHVybiExO2Q9VCgpO2ZvcihjIGluIGEpaWYoIiQiIT09Yy5jaGFyQXQoMCkmJiFCKGFbY10pKXtpZighdmEoYVtjXSxiW2NdKSlyZXR1cm4hMTtkW2NdPSEwfWZvcihjIGluIGIpaWYoIShjIGluIGQpJiYiJCIhPT1jLmNoYXJBdCgwKSYmdyhiW2NdKSYmIUIoYltjXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gZGIoYSxiLGQpe3JldHVybiBhLmNvbmNhdChIYS5jYWxsKGIsZCkpfWZ1bmN0aW9uIFZhKGEsYil7dmFyIGQ9Mjxhcmd1bWVudHMubGVuZ3RoP0hhLmNhbGwoYXJndW1lbnRzLDIpOltdO3JldHVybiFCKGIpfHxiIGluc3RhbmNlb2YKICAgIFJlZ0V4cD9iOmQubGVuZ3RoP2Z1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/Yi5hcHBseShhLGRiKGQsYXJndW1lbnRzLDApKTpiLmFwcGx5KGEsZCl9OmZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/Yi5hcHBseShhLGFyZ3VtZW50cyk6Yi5jYWxsKGEpfX1mdW5jdGlvbiBRYyhhLGIpe3ZhciBkPWI7InN0cmluZyI9PT10eXBlb2YgYSYmIiQiPT09YS5jaGFyQXQoMCkmJiIkIj09PWEuY2hhckF0KDEpP2Q9dm9pZCAwOiRhKGIpP2Q9IiRXSU5ET1ciOmImJkMuZG9jdW1lbnQ9PT1iP2Q9IiRET0NVTUVOVCI6YmIoYikmJihkPSIkU0NPUEUiKTtyZXR1cm4gZH1mdW5jdGlvbiBlYihhLGIpe2lmKCF6KGEpKXJldHVybiBXKGIpfHwoYj1iPzI6bnVsbCksSlNPTi5zdHJpbmdpZnkoYSxRYyxiKX1mdW5jdGlvbiBSYyhhKXtyZXR1cm4gQShhKT9KU09OLnBhcnNlKGEpOmF9ZnVuY3Rpb24gZWMoYSxiKXthPWEucmVwbGFjZSh4ZSwiIik7dmFyIGQ9RGF0ZS5wYXJzZSgiSmFuIDAxLCAxOTcwIDAwOjAwOjAwICIrCiAgICAgICAgYSkvNkU0O3JldHVybiBYKGQpP2I6ZH1mdW5jdGlvbiBTYyhhLGIpe2E9bmV3IERhdGUoYS5nZXRUaW1lKCkpO2Euc2V0TWludXRlcyhhLmdldE1pbnV0ZXMoKStiKTtyZXR1cm4gYX1mdW5jdGlvbiBmYyhhLGIsZCl7ZD1kPy0xOjE7dmFyIGM9YS5nZXRUaW1lem9uZU9mZnNldCgpO2I9ZWMoYixjKTtyZXR1cm4gU2MoYSxkKihiLWMpKX1mdW5jdGlvbiB6YShhKXthPXgoYSkuY2xvbmUoKS5lbXB0eSgpO3ZhciBiPXgoIjxkaXY+PC9kaXY+IikuYXBwZW5kKGEpLmh0bWwoKTt0cnl7cmV0dXJuIGFbMF0ubm9kZVR5cGU9PT1QYT9LKGIpOmIubWF0Y2goL14oPFtePl0rPikvKVsxXS5yZXBsYWNlKC9ePChbXHctXSspLyxmdW5jdGlvbihhLGIpe3JldHVybiI8IitLKGIpfSl9Y2F0Y2goZCl7cmV0dXJuIEsoYil9fWZ1bmN0aW9uIFRjKGEpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGEpfWNhdGNoKGIpe319ZnVuY3Rpb24gZ2MoYSl7dmFyIGI9e307cigoYXx8IiIpLnNwbGl0KCImIiksCiAgICAgICAgZnVuY3Rpb24oYSl7dmFyIGMsZSxmO2EmJihlPWE9YS5yZXBsYWNlKC9cKy9nLCIlMjAiKSxjPWEuaW5kZXhPZigiPSIpLC0xIT09YyYmKGU9YS5zdWJzdHJpbmcoMCxjKSxmPWEuc3Vic3RyaW5nKGMrMSkpLGU9VGMoZSksdyhlKSYmKGY9dyhmKT9UYyhmKTohMCx0YS5jYWxsKGIsZSk/SChiW2VdKT9iW2VdLnB1c2goZik6YltlXT1bYltlXSxmXTpiW2VdPWYpKX0pO3JldHVybiBifWZ1bmN0aW9uIHllKGEpe3ZhciBiPVtdO3IoYSxmdW5jdGlvbihhLGMpe0goYSk/cihhLGZ1bmN0aW9uKGEpe2IucHVzaChiYShjLCEwKSsoITA9PT1hPyIiOiI9IitiYShhLCEwKSkpfSk6Yi5wdXNoKGJhKGMsITApKyghMD09PWE/IiI6Ij0iK2JhKGEsITApKSl9KTtyZXR1cm4gYi5sZW5ndGg/Yi5qb2luKCImIik6IiJ9ZnVuY3Rpb24gaGMoYSl7cmV0dXJuIGJhKGEsITApLnJlcGxhY2UoLyUyNi9naSwiJiIpLnJlcGxhY2UoLyUzRC9naSwiPSIpLnJlcGxhY2UoLyUyQi9naSwiKyIpfWZ1bmN0aW9uIGJhKGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoYSkucmVwbGFjZSgvJTQwL2dpLCJAIikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lM0IvZ2ksIjsiKS5yZXBsYWNlKC8lMjAvZyxiPyIlMjAiOiIrIil9ZnVuY3Rpb24gemUoYSxiKXt2YXIgZCxjLGU9UWEubGVuZ3RoO2ZvcihjPTA7YzxlOysrYylpZihkPVFhW2NdK2IsQShkPWEuZ2V0QXR0cmlidXRlKGQpKSlyZXR1cm4gZDtyZXR1cm4gbnVsbH1mdW5jdGlvbiBBZShhLGIpe3ZhciBkLGMsZT17fTtyKFFhLGZ1bmN0aW9uKGIpe2IrPSJhcHAiOyFkJiZhLmhhc0F0dHJpYnV0ZSYmYS5oYXNBdHRyaWJ1dGUoYikmJihkPWEsYz1hLmdldEF0dHJpYnV0ZShiKSl9KTtyKFFhLGZ1bmN0aW9uKGIpe2IrPSJhcHAiO3ZhciBlOyFkJiYoZT1hLnF1ZXJ5U2VsZWN0b3IoIlsiK2IucmVwbGFjZSgiOiIsIlxcOiIpKyJdIikpJiYoZD1lLGM9ZS5nZXRBdHRyaWJ1dGUoYikpfSk7CiAgICAgICAgZCYmKEJlPyhlLnN0cmljdERpPW51bGwhPT16ZShkLCJzdHJpY3QtZGkiKSxiKGQsYz9bY106W10sZSkpOkMuY29uc29sZS5lcnJvcigiQW5ndWxhckpTOiBkaXNhYmxpbmcgYXV0b21hdGljIGJvb3RzdHJhcC4gPHNjcmlwdD4gcHJvdG9jb2wgaW5kaWNhdGVzIGFuIGV4dGVuc2lvbiwgZG9jdW1lbnQubG9jYXRpb24uaHJlZiBkb2VzIG5vdCBtYXRjaC4iKSl9ZnVuY3Rpb24gVWMoYSxiLGQpe0QoZCl8fChkPXt9KTtkPVMoe3N0cmljdERpOiExfSxkKTt2YXIgYz1mdW5jdGlvbigpe2E9eChhKTtpZihhLmluamVjdG9yKCkpe3ZhciBjPWFbMF09PT1DLmRvY3VtZW50PyJkb2N1bWVudCI6emEoYSk7dGhyb3cgcGEoImJ0c3RycGQiLGMucmVwbGFjZSgvPC8sIiZsdDsiKS5yZXBsYWNlKC8+LywiJmd0OyIpKTt9Yj1ifHxbXTtiLnVuc2hpZnQoWyIkcHJvdmlkZSIsZnVuY3Rpb24oYil7Yi52YWx1ZSgiJHJvb3RFbGVtZW50IixhKX1dKTtkLmRlYnVnSW5mb0VuYWJsZWQmJmIucHVzaChbIiRjb21waWxlUHJvdmlkZXIiLAogICAgICAgIGZ1bmN0aW9uKGEpe2EuZGVidWdJbmZvRW5hYmxlZCghMCl9XSk7Yi51bnNoaWZ0KCJuZyIpO2M9ZmIoYixkLnN0cmljdERpKTtjLmludm9rZShbIiRyb290U2NvcGUiLCIkcm9vdEVsZW1lbnQiLCIkY29tcGlsZSIsIiRpbmplY3RvciIsZnVuY3Rpb24oYSxiLGMsZCl7YS4kYXBwbHkoZnVuY3Rpb24oKXtiLmRhdGEoIiRpbmplY3RvciIsZCk7YyhiKShhKX0pfV0pO3JldHVybiBjfSxlPS9eTkdfRU5BQkxFX0RFQlVHX0lORk8hLyxmPS9eTkdfREVGRVJfQk9PVFNUUkFQIS87QyYmZS50ZXN0KEMubmFtZSkmJihkLmRlYnVnSW5mb0VuYWJsZWQ9ITAsQy5uYW1lPUMubmFtZS5yZXBsYWNlKGUsIiIpKTtpZihDJiYhZi50ZXN0KEMubmFtZSkpcmV0dXJuIGMoKTtDLm5hbWU9Qy5uYW1lLnJlcGxhY2UoZiwiIik7Y2EucmVzdW1lQm9vdHN0cmFwPWZ1bmN0aW9uKGEpe3IoYSxmdW5jdGlvbihhKXtiLnB1c2goYSl9KTtyZXR1cm4gYygpfTtCKGNhLnJlc3VtZURlZmVycmVkQm9vdHN0cmFwKSYmCiAgICBjYS5yZXN1bWVEZWZlcnJlZEJvb3RzdHJhcCgpfWZ1bmN0aW9uIENlKCl7Qy5uYW1lPSJOR19FTkFCTEVfREVCVUdfSU5GTyEiK0MubmFtZTtDLmxvY2F0aW9uLnJlbG9hZCgpfWZ1bmN0aW9uIERlKGEpe2E9Y2EuZWxlbWVudChhKS5pbmplY3RvcigpO2lmKCFhKXRocm93IHBhKCJ0ZXN0Iik7cmV0dXJuIGEuZ2V0KCIkJHRlc3RhYmlsaXR5Iil9ZnVuY3Rpb24gVmMoYSxiKXtiPWJ8fCJfIjtyZXR1cm4gYS5yZXBsYWNlKEVlLGZ1bmN0aW9uKGEsYyl7cmV0dXJuKGM/YjoiIikrYS50b0xvd2VyQ2FzZSgpfSl9ZnVuY3Rpb24gRmUoKXt2YXIgYTtpZighV2Mpe3ZhciBiPXFiKCk7KHJiPXooYik/Qy5qUXVlcnk6Yj9DW2JdOnZvaWQgMCkmJnJiLmZuLm9uPyh4PXJiLFMocmIuZm4se3Njb3BlOldhLnNjb3BlLGlzb2xhdGVTY29wZTpXYS5pc29sYXRlU2NvcGUsY29udHJvbGxlcjpXYS5jb250cm9sbGVyLGluamVjdG9yOldhLmluamVjdG9yLGluaGVyaXRlZERhdGE6V2EuaW5oZXJpdGVkRGF0YX0pKToKICAgICAgICB4PVk7YT14LmNsZWFuRGF0YTt4LmNsZWFuRGF0YT1mdW5jdGlvbihiKXtmb3IodmFyIGMsZT0wLGY7bnVsbCE9KGY9YltlXSk7ZSsrKShjPSh4Ll9kYXRhKGYpfHx7fSkuZXZlbnRzKSYmYy4kZGVzdHJveSYmeChmKS50cmlnZ2VySGFuZGxlcigiJGRlc3Ryb3kiKTthKGIpfTtjYS5lbGVtZW50PXg7V2M9ITB9fWZ1bmN0aW9uIGdiKGEsYixkKXtpZighYSl0aHJvdyBwYSgiYXJlcSIsYnx8Ij8iLGR8fCJyZXF1aXJlZCIpO3JldHVybiBhfWZ1bmN0aW9uIHNiKGEsYixkKXtkJiZIKGEpJiYoYT1hW2EubGVuZ3RoLTFdKTtnYihCKGEpLGIsIm5vdCBhIGZ1bmN0aW9uLCBnb3QgIisoYSYmIm9iamVjdCI9PT10eXBlb2YgYT9hLmNvbnN0cnVjdG9yLm5hbWV8fCJPYmplY3QiOnR5cGVvZiBhKSk7cmV0dXJuIGF9ZnVuY3Rpb24gSmEoYSxiKXtpZigiaGFzT3duUHJvcGVydHkiPT09YSl0aHJvdyBwYSgiYmFkbmFtZSIsYik7fWZ1bmN0aW9uIEdlKGEsYixkKXtpZighYilyZXR1cm4gYTtiPWIuc3BsaXQoIi4iKTsKICAgICAgICBmb3IodmFyIGMsZT1hLGY9Yi5sZW5ndGgsZz0wO2c8ZjtnKyspYz1iW2ddLGEmJihhPShlPWEpW2NdKTtyZXR1cm4hZCYmQihhKT9WYShlLGEpOmF9ZnVuY3Rpb24gdGIoYSl7Zm9yKHZhciBiPWFbMF0sZD1hW2EubGVuZ3RoLTFdLGMsZT0xO2IhPT1kJiYoYj1iLm5leHRTaWJsaW5nKTtlKyspaWYoY3x8YVtlXSE9PWIpY3x8KGM9eChIYS5jYWxsKGEsMCxlKSkpLGMucHVzaChiKTtyZXR1cm4gY3x8YX1mdW5jdGlvbiBUKCl7cmV0dXJuIE9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24gaWMoYSl7aWYobnVsbD09YSlyZXR1cm4iIjtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgInN0cmluZyI6YnJlYWs7Y2FzZSAibnVtYmVyIjphPSIiK2E7YnJlYWs7ZGVmYXVsdDphPSFiYyhhKXx8SChhKXx8aGEoYSk/ZWIoYSk6YS50b1N0cmluZygpfXJldHVybiBhfWZ1bmN0aW9uIEhlKGEpe2Z1bmN0aW9uIGIoYSxiLGMpe3JldHVybiBhW2JdfHwoYVtiXT1jKCkpfXZhciBkPUYoIiRpbmplY3RvciIpLAogICAgICAgIGM9RigibmciKTthPWIoYSwiYW5ndWxhciIsT2JqZWN0KTthLiQkbWluRXJyPWEuJCRtaW5FcnJ8fEY7cmV0dXJuIGIoYSwibW9kdWxlIixmdW5jdGlvbigpe3ZhciBhPXt9O3JldHVybiBmdW5jdGlvbihmLGcsayl7dmFyIGg9e307aWYoImhhc093blByb3BlcnR5Ij09PWYpdGhyb3cgYygiYmFkbmFtZSIsIm1vZHVsZSIpO2cmJmEuaGFzT3duUHJvcGVydHkoZikmJihhW2ZdPW51bGwpO3JldHVybiBiKGEsZixmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjLGQsZil7Znx8KGY9ZSk7cmV0dXJuIGZ1bmN0aW9uKCl7ZltkfHwicHVzaCJdKFtiLGMsYXJndW1lbnRzXSk7cmV0dXJuIHR9fWZ1bmN0aW9uIGIoYSxjLGQpe2R8fChkPWUpO3JldHVybiBmdW5jdGlvbihiLGUpe2UmJkIoZSkmJihlLiQkbW9kdWxlTmFtZT1mKTtkLnB1c2goW2EsYyxhcmd1bWVudHNdKTtyZXR1cm4gdH19aWYoIWcpdGhyb3cgZCgibm9tb2QiLGYpO3ZhciBlPVtdLG49W10scz1bXSxHPWEoIiRpbmplY3RvciIsImludm9rZSIsCiAgICAgICAgInB1c2giLG4pLHQ9e19pbnZva2VRdWV1ZTplLF9jb25maWdCbG9ja3M6bixfcnVuQmxvY2tzOnMsaW5mbzpmdW5jdGlvbihhKXtpZih3KGEpKXtpZighRChhKSl0aHJvdyBjKCJhb2JqIiwidmFsdWUiKTtoPWE7cmV0dXJuIHRoaXN9cmV0dXJuIGh9LHJlcXVpcmVzOmcsbmFtZTpmLHByb3ZpZGVyOmIoIiRwcm92aWRlIiwicHJvdmlkZXIiKSxmYWN0b3J5OmIoIiRwcm92aWRlIiwiZmFjdG9yeSIpLHNlcnZpY2U6YigiJHByb3ZpZGUiLCJzZXJ2aWNlIiksdmFsdWU6YSgiJHByb3ZpZGUiLCJ2YWx1ZSIpLGNvbnN0YW50OmEoIiRwcm92aWRlIiwiY29uc3RhbnQiLCJ1bnNoaWZ0IiksZGVjb3JhdG9yOmIoIiRwcm92aWRlIiwiZGVjb3JhdG9yIixuKSxhbmltYXRpb246YigiJGFuaW1hdGVQcm92aWRlciIsInJlZ2lzdGVyIiksZmlsdGVyOmIoIiRmaWx0ZXJQcm92aWRlciIsInJlZ2lzdGVyIiksY29udHJvbGxlcjpiKCIkY29udHJvbGxlclByb3ZpZGVyIiwicmVnaXN0ZXIiKSxkaXJlY3RpdmU6YigiJGNvbXBpbGVQcm92aWRlciIsCiAgICAgICAgICAgICJkaXJlY3RpdmUiKSxjb21wb25lbnQ6YigiJGNvbXBpbGVQcm92aWRlciIsImNvbXBvbmVudCIpLGNvbmZpZzpHLHJ1bjpmdW5jdGlvbihhKXtzLnB1c2goYSk7cmV0dXJuIHRoaXN9fTtrJiZHKGspO3JldHVybiB0fSl9fSl9ZnVuY3Rpb24gamEoYSxiKXtpZihIKGEpKXtiPWJ8fFtdO2Zvcih2YXIgZD0wLGM9YS5sZW5ndGg7ZDxjO2QrKyliW2RdPWFbZF19ZWxzZSBpZihEKGEpKWZvcihkIGluIGI9Ynx8e30sYSlpZigiJCIhPT1kLmNoYXJBdCgwKXx8IiQiIT09ZC5jaGFyQXQoMSkpYltkXT1hW2RdO3JldHVybiBifHxhfWZ1bmN0aW9uIEllKGEsYil7dmFyIGQ9W107WGIoYikmJihhPWNhLmNvcHkoYSxudWxsLGIpKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYSxmdW5jdGlvbihhLGIpe2I9UWMoYSxiKTtpZihEKGIpKXtpZigwPD1kLmluZGV4T2YoYikpcmV0dXJuIi4uLiI7ZC5wdXNoKGIpfXJldHVybiBifSl9ZnVuY3Rpb24gSmUoYSl7UyhhLHtlcnJvckhhbmRsaW5nQ29uZmlnOnJlLAogICAgICAgIGJvb3RzdHJhcDpVYyxjb3B5OklhLGV4dGVuZDpTLG1lcmdlOnRlLGVxdWFsczp2YSxlbGVtZW50OngsZm9yRWFjaDpyLGluamVjdG9yOmZiLG5vb3A6RSxiaW5kOlZhLHRvSnNvbjplYixmcm9tSnNvbjpSYyxpZGVudGl0eTpUYSxpc1VuZGVmaW5lZDp6LGlzRGVmaW5lZDp3LGlzU3RyaW5nOkEsaXNGdW5jdGlvbjpCLGlzT2JqZWN0OkQsaXNOdW1iZXI6Vyxpc0VsZW1lbnQ6JGIsaXNBcnJheTpILHZlcnNpb246S2UsaXNEYXRlOmhhLGNhbGxiYWNrczp7JCRjb3VudGVyOjB9LGdldFRlc3RhYmlsaXR5OkRlLHJlbG9hZFdpdGhEZWJ1Z0luZm86Q2UsJCRtaW5FcnI6RiwkJGNzcDpBYSwkJGVuY29kZVVyaVNlZ21lbnQ6aGMsJCRlbmNvZGVVcmlRdWVyeTpiYSwkJGxvd2VyY2FzZTpLLCQkc3RyaW5naWZ5OmljLCQkdXBwZXJjYXNlOnVifSk7a2M9SGUoQyk7a2MoIm5nIixbIm5nTG9jYWxlIl0sWyIkcHJvdmlkZSIsZnVuY3Rpb24oYSl7YS5wcm92aWRlcih7JCRzYW5pdGl6ZVVyaTpMZX0pOwogICAgICAgIGEucHJvdmlkZXIoIiRjb21waWxlIixYYykuZGlyZWN0aXZlKHthOk1lLGlucHV0OlljLHRleHRhcmVhOlljLGZvcm06TmUsc2NyaXB0Ok9lLHNlbGVjdDpQZSxvcHRpb246UWUsbmdCaW5kOlJlLG5nQmluZEh0bWw6U2UsbmdCaW5kVGVtcGxhdGU6VGUsbmdDbGFzczpVZSxuZ0NsYXNzRXZlbjpWZSxuZ0NsYXNzT2RkOldlLG5nQ2xvYWs6WGUsbmdDb250cm9sbGVyOlllLG5nRm9ybTpaZSxuZ0hpZGU6JGUsbmdJZjphZixuZ0luY2x1ZGU6YmYsbmdJbml0OmNmLG5nTm9uQmluZGFibGU6ZGYsbmdQbHVyYWxpemU6ZWYsbmdSZWY6ZmYsbmdSZXBlYXQ6Z2YsbmdTaG93OmhmLG5nU3R5bGU6amYsbmdTd2l0Y2g6a2YsbmdTd2l0Y2hXaGVuOmxmLG5nU3dpdGNoRGVmYXVsdDptZixuZ09wdGlvbnM6bmYsbmdUcmFuc2NsdWRlOm9mLG5nTW9kZWw6cGYsbmdMaXN0OnFmLG5nQ2hhbmdlOnJmLHBhdHRlcm46WmMsbmdQYXR0ZXJuOlpjLHJlcXVpcmVkOiRjLG5nUmVxdWlyZWQ6JGMsbWlubGVuZ3RoOmFkLAogICAgICAgICAgICBuZ01pbmxlbmd0aDphZCxtYXhsZW5ndGg6YmQsbmdNYXhsZW5ndGg6YmQsbmdWYWx1ZTpzZixuZ01vZGVsT3B0aW9uczp0Zn0pLmRpcmVjdGl2ZSh7bmdJbmNsdWRlOnVmLGlucHV0OnZmfSkuZGlyZWN0aXZlKHZiKS5kaXJlY3RpdmUoY2QpO2EucHJvdmlkZXIoeyRhbmNob3JTY3JvbGw6d2YsJGFuaW1hdGU6eGYsJGFuaW1hdGVDc3M6eWYsJCRhbmltYXRlSnM6emYsJCRhbmltYXRlUXVldWU6QWYsJCRBbmltYXRlUnVubmVyOkJmLCQkYW5pbWF0ZUFzeW5jUnVuOkNmLCRicm93c2VyOkRmLCRjYWNoZUZhY3Rvcnk6RWYsJGNvbnRyb2xsZXI6RmYsJGRvY3VtZW50OkdmLCQkaXNEb2N1bWVudEhpZGRlbjpIZiwkZXhjZXB0aW9uSGFuZGxlcjpJZiwkZmlsdGVyOmRkLCQkZm9yY2VSZWZsb3c6SmYsJGludGVycG9sYXRlOktmLCRpbnRlcnZhbDpMZiwkJGludGVydmFsRmFjdG9yeTpNZiwkaHR0cDpOZiwkaHR0cFBhcmFtU2VyaWFsaXplcjpPZiwkaHR0cFBhcmFtU2VyaWFsaXplckpRTGlrZTpQZiwKICAgICAgICAgICAgJGh0dHBCYWNrZW5kOlFmLCR4aHJGYWN0b3J5OlJmLCRqc29ucENhbGxiYWNrczpTZiwkbG9jYXRpb246VGYsJGxvZzpVZiwkcGFyc2U6VmYsJHJvb3RTY29wZTpXZiwkcTpYZiwkJHE6WWYsJHNjZTpaZiwkc2NlRGVsZWdhdGU6JGYsJHNuaWZmZXI6YWcsJCR0YXNrVHJhY2tlckZhY3Rvcnk6YmcsJHRlbXBsYXRlQ2FjaGU6Y2csJHRlbXBsYXRlUmVxdWVzdDpkZywkJHRlc3RhYmlsaXR5OmVnLCR0aW1lb3V0OmZnLCR3aW5kb3c6Z2csJCRyQUY6aGcsJCRqcUxpdGU6aWcsJCRNYXA6amcsJCRjb29raWVSZWFkZXI6a2d9KX1dKS5pbmZvKHthbmd1bGFyVmVyc2lvbjoiMS43LjcifSl9ZnVuY3Rpb24gd2IoYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIHhiKGEpe3JldHVybiBhLnJlcGxhY2UobGcsd2IpfWZ1bmN0aW9uIGxjKGEpe2E9YS5ub2RlVHlwZTtyZXR1cm4gMT09PWF8fCFhfHw5PT09YX1mdW5jdGlvbiBlZChhLGIpe3ZhciBkLGMsZT1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKICAgICAgICBmPVtdO2lmKG1jLnRlc3QoYSkpe2Q9ZS5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtjPShtZy5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpO2M9b2FbY118fG9hLl9kZWZhdWx0O2QuaW5uZXJIVE1MPWNbMV0rYS5yZXBsYWNlKG5nLCI8JDE+PC8kMj4iKStjWzJdO2ZvcihjPWNbMF07Yy0tOylkPWQubGFzdENoaWxkO2Y9ZGIoZixkLmNoaWxkTm9kZXMpO2Q9ZS5maXJzdENoaWxkO2QudGV4dENvbnRlbnQ9IiJ9ZWxzZSBmLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShhKSk7ZS50ZXh0Q29udGVudD0iIjtlLmlubmVySFRNTD0iIjtyKGYsZnVuY3Rpb24oYSl7ZS5hcHBlbmRDaGlsZChhKX0pO3JldHVybiBlfWZ1bmN0aW9uIFkoYSl7aWYoYSBpbnN0YW5jZW9mIFkpcmV0dXJuIGE7dmFyIGI7QShhKSYmKGE9VShhKSxiPSEwKTtpZighKHRoaXMgaW5zdGFuY2VvZiBZKSl7aWYoYiYmIjwiIT09YS5jaGFyQXQoMCkpdGhyb3cgbmMoIm5vc2VsIik7cmV0dXJuIG5ldyBZKGEpfWlmKGIpe2I9CiAgICAgICAgQy5kb2N1bWVudDt2YXIgZDthPShkPW9nLmV4ZWMoYSkpP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPWVkKGEsYikpP2QuY2hpbGROb2RlczpbXTtvYyh0aGlzLGEpfWVsc2UgQihhKT9mZChhKTpvYyh0aGlzLGEpfWZ1bmN0aW9uIHBjKGEpe3JldHVybiBhLmNsb25lTm9kZSghMCl9ZnVuY3Rpb24geWIoYSxiKXshYiYmbGMoYSkmJnguY2xlYW5EYXRhKFthXSk7YS5xdWVyeVNlbGVjdG9yQWxsJiZ4LmNsZWFuRGF0YShhLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSl9ZnVuY3Rpb24gZ2QoYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gaGQoYSl7dmFyIGI9YS5uZzMzOSxkPWImJkthW2JdLGM9ZCYmZC5ldmVudHMsZD1kJiZkLmRhdGE7ZCYmIWdkKGQpfHxjJiYhZ2QoYyl8fChkZWxldGUgS2FbYl0sYS5uZzMzOT12b2lkIDApfWZ1bmN0aW9uIGlkKGEsYixkLGMpe2lmKHcoYykpdGhyb3cgbmMoIm9mZmFyZ3MiKTt2YXIgZT0oYz16YihhKSkmJmMuZXZlbnRzLAogICAgICAgIGY9YyYmYy5oYW5kbGU7aWYoZil7aWYoYil7dmFyIGc9ZnVuY3Rpb24oYil7dmFyIGM9ZVtiXTt3KGQpJiZjYihjfHxbXSxkKTt3KGQpJiZjJiYwPGMubGVuZ3RofHwoYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsZiksZGVsZXRlIGVbYl0pfTtyKGIuc3BsaXQoIiAiKSxmdW5jdGlvbihhKXtnKGEpO0FiW2FdJiZnKEFiW2FdKX0pfWVsc2UgZm9yKGIgaW4gZSkiJGRlc3Ryb3kiIT09YiYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsZiksZGVsZXRlIGVbYl07aGQoYSl9fWZ1bmN0aW9uIHFjKGEsYil7dmFyIGQ9YS5uZzMzOTtpZihkPWQmJkthW2RdKWI/ZGVsZXRlIGQuZGF0YVtiXTpkLmRhdGE9e30saGQoYSl9ZnVuY3Rpb24gemIoYSxiKXt2YXIgZD1hLm5nMzM5LGQ9ZCYmS2FbZF07YiYmIWQmJihhLm5nMzM5PWQ9KytwZyxkPUthW2RdPXtldmVudHM6e30sZGF0YTp7fSxoYW5kbGU6dm9pZCAwfSk7cmV0dXJuIGR9ZnVuY3Rpb24gcmMoYSxiLGQpe2lmKGxjKGEpKXt2YXIgYyxlPXcoZCksCiAgICAgICAgZj0hZSYmYiYmIUQoYiksZz0hYjthPShhPXpiKGEsIWYpKSYmYS5kYXRhO2lmKGUpYVt4YihiKV09ZDtlbHNle2lmKGcpcmV0dXJuIGE7aWYoZilyZXR1cm4gYSYmYVt4YihiKV07Zm9yKGMgaW4gYilhW3hiKGMpXT1iW2NdfX19ZnVuY3Rpb24gQmIoYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGU/LTE8KCIgIisoYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKSsiICIpLnJlcGxhY2UoL1tcblx0XS9nLCIgIikuaW5kZXhPZigiICIrYisiICIpOiExfWZ1bmN0aW9uIENiKGEsYil7aWYoYiYmYS5zZXRBdHRyaWJ1dGUpe3ZhciBkPSgiICIrKGEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiKS5yZXBsYWNlKC9bXG5cdF0vZywiICIpLGM9ZDtyKGIuc3BsaXQoIiAiKSxmdW5jdGlvbihhKXthPVUoYSk7Yz1jLnJlcGxhY2UoIiAiK2ErIiAiLCIgIil9KTtjIT09ZCYmYS5zZXRBdHRyaWJ1dGUoImNsYXNzIixVKGMpKX19ZnVuY3Rpb24gRGIoYSxiKXtpZihiJiZhLnNldEF0dHJpYnV0ZSl7dmFyIGQ9CiAgICAgICAgKCIgIisoYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKSsiICIpLnJlcGxhY2UoL1tcblx0XS9nLCIgIiksYz1kO3IoYi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEpe2E9VShhKTstMT09PWMuaW5kZXhPZigiICIrYSsiICIpJiYoYys9YSsiICIpfSk7YyE9PWQmJmEuc2V0QXR0cmlidXRlKCJjbGFzcyIsVShjKSl9fWZ1bmN0aW9uIG9jKGEsYil7aWYoYilpZihiLm5vZGVUeXBlKWFbYS5sZW5ndGgrK109YjtlbHNle3ZhciBkPWIubGVuZ3RoO2lmKCJudW1iZXIiPT09dHlwZW9mIGQmJmIud2luZG93IT09Yil7aWYoZClmb3IodmFyIGM9MDtjPGQ7YysrKWFbYS5sZW5ndGgrK109YltjXX1lbHNlIGFbYS5sZW5ndGgrK109Yn19ZnVuY3Rpb24gamQoYSxiKXtyZXR1cm4gRWIoYSwiJCIrKGJ8fCJuZ0NvbnRyb2xsZXIiKSsiQ29udHJvbGxlciIpfWZ1bmN0aW9uIEViKGEsYixkKXs5PT09YS5ub2RlVHlwZSYmKGE9YS5kb2N1bWVudEVsZW1lbnQpO2ZvcihiPUgoYik/YjpbYl07YTspe2Zvcih2YXIgYz0KICAgICAgICAwLGU9Yi5sZW5ndGg7YzxlO2MrKylpZih3KGQ9eC5kYXRhKGEsYltjXSkpKXJldHVybiBkO2E9YS5wYXJlbnROb2RlfHwxMT09PWEubm9kZVR5cGUmJmEuaG9zdH19ZnVuY3Rpb24ga2QoYSl7Zm9yKHliKGEsITApO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIEZiKGEsYil7Ynx8eWIoYSk7dmFyIGQ9YS5wYXJlbnROb2RlO2QmJmQucmVtb3ZlQ2hpbGQoYSl9ZnVuY3Rpb24gcWcoYSxiKXtiPWJ8fEM7aWYoImNvbXBsZXRlIj09PWIuZG9jdW1lbnQucmVhZHlTdGF0ZSliLnNldFRpbWVvdXQoYSk7ZWxzZSB4KGIpLm9uKCJsb2FkIixhKX1mdW5jdGlvbiBmZChhKXtmdW5jdGlvbiBiKCl7Qy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixiKTtDLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLGIpO2EoKX0iY29tcGxldGUiPT09Qy5kb2N1bWVudC5yZWFkeVN0YXRlP0Muc2V0VGltZW91dChhKTooQy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwKICAgICAgICBiKSxDLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGIpKX1mdW5jdGlvbiBsZChhLGIpe3ZhciBkPUdiW2IudG9Mb3dlckNhc2UoKV07cmV0dXJuIGQmJm1kW3VhKGEpXSYmZH1mdW5jdGlvbiByZyhhLGIpe3ZhciBkPWZ1bmN0aW9uKGMsZCl7Yy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gYy5kZWZhdWx0UHJldmVudGVkfTt2YXIgZj1iW2R8fGMudHlwZV0sZz1mP2YubGVuZ3RoOjA7aWYoZyl7aWYoeihjLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCkpe3ZhciBrPWMuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO2Muc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7Yy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9ITA7Yy5zdG9wUHJvcGFnYXRpb24mJmMuc3RvcFByb3BhZ2F0aW9uKCk7ayYmay5jYWxsKGMpfX1jLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWZ1bmN0aW9uKCl7cmV0dXJuITA9PT1jLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZH07CiAgICAgICAgdmFyIGg9Zi5zcGVjaWFsSGFuZGxlcldyYXBwZXJ8fHNnOzE8ZyYmKGY9amEoZikpO2Zvcih2YXIgbD0wO2w8ZztsKyspYy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpfHxoKGEsYyxmW2xdKX19O2QuZWxlbT1hO3JldHVybiBkfWZ1bmN0aW9uIHNnKGEsYixkKXtkLmNhbGwoYSxiKX1mdW5jdGlvbiB0ZyhhLGIsZCl7dmFyIGM9Yi5yZWxhdGVkVGFyZ2V0O2MmJihjPT09YXx8dWcuY2FsbChhLGMpKXx8ZC5jYWxsKGEsYil9ZnVuY3Rpb24gaWcoKXt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gUyhZLHtoYXNDbGFzczpmdW5jdGlvbihhLGIpe2EuYXR0ciYmKGE9YVswXSk7cmV0dXJuIEJiKGEsYil9LGFkZENsYXNzOmZ1bmN0aW9uKGEsYil7YS5hdHRyJiYoYT1hWzBdKTtyZXR1cm4gRGIoYSxiKX0scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSxiKXthLmF0dHImJihhPWFbMF0pO3JldHVybiBDYihhLGIpfX0pfX1mdW5jdGlvbiBMYShhLGIpe3ZhciBkPWEmJmEuJCRoYXNoS2V5OwogICAgICAgIGlmKGQpcmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiBkJiYoZD1hLiQkaGFzaEtleSgpKSxkO2Q9dHlwZW9mIGE7cmV0dXJuIGQ9ImZ1bmN0aW9uIj09PWR8fCJvYmplY3QiPT09ZCYmbnVsbCE9PWE/YS4kJGhhc2hLZXk9ZCsiOiIrKGJ8fHNlKSgpOmQrIjoiK2F9ZnVuY3Rpb24gbmQoKXt0aGlzLl9rZXlzPVtdO3RoaXMuX3ZhbHVlcz1bXTt0aGlzLl9sYXN0S2V5PU5hTjt0aGlzLl9sYXN0SW5kZXg9LTF9ZnVuY3Rpb24gb2QoYSl7YT1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKS5yZXBsYWNlKHZnLCIiKTtyZXR1cm4gYS5tYXRjaCh3Zyl8fGEubWF0Y2goeGcpfWZ1bmN0aW9uIHlnKGEpe3JldHVybihhPW9kKGEpKT8iZnVuY3Rpb24oIisoYVsxXXx8IiIpLnJlcGxhY2UoL1tcc1xyXG5dKy8sIiAiKSsiKSI6ImZuIn1mdW5jdGlvbiBmYihhLGIpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7aWYoRChiKSlyKGIsWWIoYSkpO2Vsc2UgcmV0dXJuIGEoYiwKICAgICAgICBjKX19ZnVuY3Rpb24gYyhhLGIpe0phKGEsInNlcnZpY2UiKTtpZihCKGIpfHxIKGIpKWI9bi5pbnN0YW50aWF0ZShiKTtpZighYi4kZ2V0KXRocm93IEJhKCJwZ2V0IixhKTtyZXR1cm4gcFthKyJQcm92aWRlciJdPWJ9ZnVuY3Rpb24gZShhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBjPXQuaW52b2tlKGIsdGhpcyk7aWYoeihjKSl0aHJvdyBCYSgidW5kZWYiLGEpO3JldHVybiBjfX1mdW5jdGlvbiBmKGEsYixkKXtyZXR1cm4gYyhhLHskZ2V0OiExIT09ZD9lKGEsYik6Yn0pfWZ1bmN0aW9uIGcoYSl7Z2IoeihhKXx8SChhKSwibW9kdWxlc1RvTG9hZCIsIm5vdCBhbiBhcnJheSIpO3ZhciBiPVtdLGM7cihhLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7dmFyIGIsYztiPTA7Zm9yKGM9YS5sZW5ndGg7YjxjO2IrKyl7dmFyIGU9YVtiXSxmPW4uZ2V0KGVbMF0pO2ZbZVsxXV0uYXBwbHkoZixlWzJdKX19aWYoIW0uZ2V0KGEpKXttLnNldChhLCEwKTt0cnl7QShhKT8oYz1rYyhhKSwKICAgICAgICB0Lm1vZHVsZXNbYV09YyxiPWIuY29uY2F0KGcoYy5yZXF1aXJlcykpLmNvbmNhdChjLl9ydW5CbG9ja3MpLGQoYy5faW52b2tlUXVldWUpLGQoYy5fY29uZmlnQmxvY2tzKSk6QihhKT9iLnB1c2gobi5pbnZva2UoYSkpOkgoYSk/Yi5wdXNoKG4uaW52b2tlKGEpKTpzYihhLCJtb2R1bGUiKX1jYXRjaChlKXt0aHJvdyBIKGEpJiYoYT1hW2EubGVuZ3RoLTFdKSxlLm1lc3NhZ2UmJmUuc3RhY2smJi0xPT09ZS5zdGFjay5pbmRleE9mKGUubWVzc2FnZSkmJihlPWUubWVzc2FnZSsiXG4iK2Uuc3RhY2spLEJhKCJtb2R1bGVyciIsYSxlLnN0YWNrfHxlLm1lc3NhZ2V8fGUpO319fSk7cmV0dXJuIGJ9ZnVuY3Rpb24gayhhLGMpe2Z1bmN0aW9uIGQoYixlKXtpZihhLmhhc093blByb3BlcnR5KGIpKXtpZihhW2JdPT09aCl0aHJvdyBCYSgiY2RlcCIsYisiIDwtICIrbC5qb2luKCIgPC0gIikpO3JldHVybiBhW2JdfXRyeXtyZXR1cm4gbC51bnNoaWZ0KGIpLGFbYl09aCxhW2JdPWMoYixlKSwKICAgICAgICBhW2JdfWNhdGNoKGYpe3Rocm93IGFbYl09PT1oJiZkZWxldGUgYVtiXSxmO31maW5hbGx5e2wuc2hpZnQoKX19ZnVuY3Rpb24gZShhLGMsZil7dmFyIGc9W107YT1mYi4kJGFubm90YXRlKGEsYixmKTtmb3IodmFyIGg9MCxrPWEubGVuZ3RoO2g8aztoKyspe3ZhciBsPWFbaF07aWYoInN0cmluZyIhPT10eXBlb2YgbCl0aHJvdyBCYSgiaXRrbiIsbCk7Zy5wdXNoKGMmJmMuaGFzT3duUHJvcGVydHkobCk/Y1tsXTpkKGwsZikpfXJldHVybiBnfXJldHVybntpbnZva2U6ZnVuY3Rpb24oYSxiLGMsZCl7InN0cmluZyI9PT10eXBlb2YgYyYmKGQ9YyxjPW51bGwpO2M9ZShhLGMsZCk7SChhKSYmKGE9YVthLmxlbmd0aC0xXSk7ZD1hO2lmKENhfHwiZnVuY3Rpb24iIT09dHlwZW9mIGQpZD0hMTtlbHNle3ZhciBmPWQuJCRuZ0lzQ2xhc3M7R2EoZil8fChmPWQuJCRuZ0lzQ2xhc3M9L15jbGFzc1xiLy50ZXN0KEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGQpKSk7ZD1mfXJldHVybiBkPwogICAgICAgICAgICAoYy51bnNoaWZ0KG51bGwpLG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoYSxjKSkpOmEuYXBwbHkoYixjKX0saW5zdGFudGlhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPUgoYSk/YVthLmxlbmd0aC0xXTphO2E9ZShhLGIsYyk7YS51bnNoaWZ0KG51bGwpO3JldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KGQsYSkpfSxnZXQ6ZCxhbm5vdGF0ZTpmYi4kJGFubm90YXRlLGhhczpmdW5jdGlvbihiKXtyZXR1cm4gcC5oYXNPd25Qcm9wZXJ0eShiKyJQcm92aWRlciIpfHxhLmhhc093blByb3BlcnR5KGIpfX19Yj0hMD09PWI7dmFyIGg9e30sbD1bXSxtPW5ldyBIYixwPXskcHJvdmlkZTp7cHJvdmlkZXI6ZChjKSxmYWN0b3J5OmQoZiksc2VydmljZTpkKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGYoYSxbIiRpbmplY3RvciIsZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5zdGFudGlhdGUoYil9XSl9KSx2YWx1ZTpkKGZ1bmN0aW9uKGEsYil7cmV0dXJuIGYoYSwKICAgICAgICAgICAgICAgIGlhKGIpLCExKX0pLGNvbnN0YW50OmQoZnVuY3Rpb24oYSxiKXtKYShhLCJjb25zdGFudCIpO3BbYV09YjtzW2FdPWJ9KSxkZWNvcmF0b3I6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uLmdldChhKyJQcm92aWRlciIpLGQ9Yy4kZ2V0O2MuJGdldD1mdW5jdGlvbigpe3ZhciBhPXQuaW52b2tlKGQsYyk7cmV0dXJuIHQuaW52b2tlKGIsbnVsbCx7JGRlbGVnYXRlOmF9KX19fX0sbj1wLiRpbmplY3Rvcj1rKHAsZnVuY3Rpb24oYSxiKXtjYS5pc1N0cmluZyhiKSYmbC5wdXNoKGIpO3Rocm93IEJhKCJ1bnByIixsLmpvaW4oIiA8LSAiKSk7fSkscz17fSxHPWsocyxmdW5jdGlvbihhLGIpe3ZhciBjPW4uZ2V0KGErIlByb3ZpZGVyIixiKTtyZXR1cm4gdC5pbnZva2UoYy4kZ2V0LGMsdm9pZCAwLGEpfSksdD1HO3AuJGluamVjdG9yUHJvdmlkZXI9eyRnZXQ6aWEoRyl9O3QubW9kdWxlcz1uLm1vZHVsZXM9VCgpO3ZhciBOPWcoYSksdD1HLmdldCgiJGluamVjdG9yIik7dC5zdHJpY3REaT1iO3IoTiwKICAgICAgICBmdW5jdGlvbihhKXthJiZ0Lmludm9rZShhKX0pO3QubG9hZE5ld01vZHVsZXM9ZnVuY3Rpb24oYSl7cihnKGEpLGZ1bmN0aW9uKGEpe2EmJnQuaW52b2tlKGEpfSl9O3JldHVybiB0fWZ1bmN0aW9uIHdmKCl7dmFyIGE9ITA7dGhpcy5kaXNhYmxlQXV0b1Njcm9sbGluZz1mdW5jdGlvbigpe2E9ITF9O3RoaXMuJGdldD1bIiR3aW5kb3ciLCIkbG9jYXRpb24iLCIkcm9vdFNjb3BlIixmdW5jdGlvbihiLGQsYyl7ZnVuY3Rpb24gZShhKXt2YXIgYj1udWxsO0FycmF5LnByb3RvdHlwZS5zb21lLmNhbGwoYSxmdW5jdGlvbihhKXtpZigiYSI9PT11YShhKSlyZXR1cm4gYj1hLCEwfSk7cmV0dXJuIGJ9ZnVuY3Rpb24gZihhKXtpZihhKXthLnNjcm9sbEludG9WaWV3KCk7dmFyIGM7Yz1nLnlPZmZzZXQ7QihjKT9jPWMoKTokYihjKT8oYz1jWzBdLGM9ImZpeGVkIiE9PWIuZ2V0Q29tcHV0ZWRTdHlsZShjKS5wb3NpdGlvbj8wOmMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tKTpXKGMpfHwKICAgICAgICAoYz0wKTtjJiYoYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCxiLnNjcm9sbEJ5KDAsYS1jKSl9ZWxzZSBiLnNjcm9sbFRvKDAsMCl9ZnVuY3Rpb24gZyhhKXthPUEoYSk/YTpXKGEpP2EudG9TdHJpbmcoKTpkLmhhc2goKTt2YXIgYjthPyhiPWsuZ2V0RWxlbWVudEJ5SWQoYSkpP2YoYik6KGI9ZShrLmdldEVsZW1lbnRzQnlOYW1lKGEpKSk/ZihiKToidG9wIj09PWEmJmYobnVsbCk6ZihudWxsKX12YXIgaz1iLmRvY3VtZW50O2EmJmMuJHdhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIGQuaGFzaCgpfSxmdW5jdGlvbihhLGIpe2E9PT1iJiYiIj09PWF8fHFnKGZ1bmN0aW9uKCl7Yy4kZXZhbEFzeW5jKGcpfSl9KTtyZXR1cm4gZ31dfWZ1bmN0aW9uIGhiKGEsYil7aWYoIWEmJiFiKXJldHVybiIiO2lmKCFhKXJldHVybiBiO2lmKCFiKXJldHVybiBhO0goYSkmJihhPWEuam9pbigiICIpKTtIKGIpJiYoYj1iLmpvaW4oIiAiKSk7cmV0dXJuIGErIiAiK2J9ZnVuY3Rpb24gemcoYSl7QShhKSYmCiAgICAoYT1hLnNwbGl0KCIgIikpO3ZhciBiPVQoKTtyKGEsZnVuY3Rpb24oYSl7YS5sZW5ndGgmJihiW2FdPSEwKX0pO3JldHVybiBifWZ1bmN0aW9uIHJhKGEpe3JldHVybiBEKGEpP2E6e319ZnVuY3Rpb24gQWcoYSxiLGQsYyxlKXtmdW5jdGlvbiBmKCl7cWE9bnVsbDtrKCl9ZnVuY3Rpb24gZygpe3Q9eSgpO3Q9eih0KT9udWxsOnQ7dmEodCxQKSYmKHQ9UCk7Tj1QPXR9ZnVuY3Rpb24gaygpe3ZhciBhPU47ZygpO2lmKHYhPT1oLnVybCgpfHxhIT09dCl2PWgudXJsKCksTj10LHIoSixmdW5jdGlvbihhKXthKGgudXJsKCksdCl9KX12YXIgaD10aGlzLGw9YS5sb2NhdGlvbixtPWEuaGlzdG9yeSxwPWEuc2V0VGltZW91dCxuPWEuY2xlYXJUaW1lb3V0LHM9e30sRz1lKGQpO2guaXNNb2NrPSExO2guJCRjb21wbGV0ZU91dHN0YW5kaW5nUmVxdWVzdD1HLmNvbXBsZXRlVGFzaztoLiQkaW5jT3V0c3RhbmRpbmdSZXF1ZXN0Q291bnQ9Ry5pbmNUYXNrQ291bnQ7aC5ub3RpZnlXaGVuTm9PdXRzdGFuZGluZ1JlcXVlc3RzPQogICAgICAgIEcubm90aWZ5V2hlbk5vUGVuZGluZ1Rhc2tzO3ZhciB0LE4sdj1sLmhyZWYsamM9Yi5maW5kKCJiYXNlIikscWE9bnVsbCx5PWMuaGlzdG9yeT9mdW5jdGlvbigpe3RyeXtyZXR1cm4gbS5zdGF0ZX1jYXRjaChhKXt9fTpFO2coKTtoLnVybD1mdW5jdGlvbihiLGQsZSl7eihlKSYmKGU9bnVsbCk7bCE9PWEubG9jYXRpb24mJihsPWEubG9jYXRpb24pO20hPT1hLmhpc3RvcnkmJihtPWEuaGlzdG9yeSk7aWYoYil7dmFyIGY9Tj09PWU7Yj1nYShiKS5ocmVmO2lmKHY9PT1iJiYoIWMuaGlzdG9yeXx8ZikpcmV0dXJuIGg7dmFyIGs9diYmRGEodik9PT1EYShiKTt2PWI7Tj1lOyFjLmhpc3Rvcnl8fGsmJmY/KGt8fChxYT1iKSxkP2wucmVwbGFjZShiKTprPyhkPWwsZT1iLGY9ZS5pbmRleE9mKCIjIiksZT0tMT09PWY/IiI6ZS5zdWJzdHIoZiksZC5oYXNoPWUpOmwuaHJlZj1iLGwuaHJlZiE9PWImJihxYT1iKSk6KG1bZD8icmVwbGFjZVN0YXRlIjoicHVzaFN0YXRlIl0oZSwiIixiKSxnKCkpOwogICAgICAgIHFhJiYocWE9Yik7cmV0dXJuIGh9cmV0dXJuKHFhfHxsLmhyZWYpLnJlcGxhY2UoLyMkLywiIil9O2guc3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdH07dmFyIEo9W10sST0hMSxQPW51bGw7aC5vblVybENoYW5nZT1mdW5jdGlvbihiKXtpZighSSl7aWYoYy5oaXN0b3J5KXgoYSkub24oInBvcHN0YXRlIixmKTt4KGEpLm9uKCJoYXNoY2hhbmdlIixmKTtJPSEwfUoucHVzaChiKTtyZXR1cm4gYn07aC4kJGFwcGxpY2F0aW9uRGVzdHJveWVkPWZ1bmN0aW9uKCl7eChhKS5vZmYoImhhc2hjaGFuZ2UgcG9wc3RhdGUiLGYpfTtoLiQkY2hlY2tVcmxDaGFuZ2U9aztoLmJhc2VIcmVmPWZ1bmN0aW9uKCl7dmFyIGE9amMuYXR0cigiaHJlZiIpO3JldHVybiBhP2EucmVwbGFjZSgvXihodHRwcz86KT9cL1wvW14vXSovLCIiKToiIn07aC5kZWZlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yj1ifHwwO2M9Y3x8Ry5ERUZBVUxUX1RBU0tfVFlQRTtHLmluY1Rhc2tDb3VudChjKTtkPXAoZnVuY3Rpb24oKXtkZWxldGUgc1tkXTsKICAgICAgICBHLmNvbXBsZXRlVGFzayhhLGMpfSxiKTtzW2RdPWM7cmV0dXJuIGR9O2guZGVmZXIuY2FuY2VsPWZ1bmN0aW9uKGEpe2lmKHMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBiPXNbYV07ZGVsZXRlIHNbYV07bihhKTtHLmNvbXBsZXRlVGFzayhFLGIpO3JldHVybiEwfXJldHVybiExfX1mdW5jdGlvbiBEZigpe3RoaXMuJGdldD1bIiR3aW5kb3ciLCIkbG9nIiwiJHNuaWZmZXIiLCIkZG9jdW1lbnQiLCIkJHRhc2tUcmFja2VyRmFjdG9yeSIsZnVuY3Rpb24oYSxiLGQsYyxlKXtyZXR1cm4gbmV3IEFnKGEsYyxiLGQsZSl9XX1mdW5jdGlvbiBFZigpe3RoaXMuJGdldD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxjKXtmdW5jdGlvbiBlKGEpe2EhPT1wJiYobj9uPT09YSYmKG49YS5uKTpuPWEsZihhLm4sYS5wKSxmKGEscCkscD1hLHAubj1udWxsKX1mdW5jdGlvbiBmKGEsYil7YSE9PWImJihhJiYoYS5wPWIpLGImJihiLm49YSkpfWlmKGEgaW4gYil0aHJvdyBGKCIkY2FjaGVGYWN0b3J5IikoImlpZCIsCiAgICAgICAgYSk7dmFyIGc9MCxrPVMoe30sYyx7aWQ6YX0pLGg9VCgpLGw9YyYmYy5jYXBhY2l0eXx8TnVtYmVyLk1BWF9WQUxVRSxtPVQoKSxwPW51bGwsbj1udWxsO3JldHVybiBiW2FdPXtwdXQ6ZnVuY3Rpb24oYSxiKXtpZigheihiKSl7aWYobDxOdW1iZXIuTUFYX1ZBTFVFKXt2YXIgYz1tW2FdfHwobVthXT17a2V5OmF9KTtlKGMpfWEgaW4gaHx8ZysrO2hbYV09YjtnPmwmJnRoaXMucmVtb3ZlKG4ua2V5KTtyZXR1cm4gYn19LGdldDpmdW5jdGlvbihhKXtpZihsPE51bWJlci5NQVhfVkFMVUUpe3ZhciBiPW1bYV07aWYoIWIpcmV0dXJuO2UoYil9cmV0dXJuIGhbYV19LHJlbW92ZTpmdW5jdGlvbihhKXtpZihsPE51bWJlci5NQVhfVkFMVUUpe3ZhciBiPW1bYV07aWYoIWIpcmV0dXJuO2I9PT1wJiYocD1iLnApO2I9PT1uJiYobj1iLm4pO2YoYi5uLGIucCk7ZGVsZXRlIG1bYV19YSBpbiBoJiYoZGVsZXRlIGhbYV0sZy0tKX0scmVtb3ZlQWxsOmZ1bmN0aW9uKCl7aD1UKCk7Zz0wO209VCgpOwogICAgICAgICAgICBwPW49bnVsbH0sZGVzdHJveTpmdW5jdGlvbigpe209az1oPW51bGw7ZGVsZXRlIGJbYV19LGluZm86ZnVuY3Rpb24oKXtyZXR1cm4gUyh7fSxrLHtzaXplOmd9KX19fXZhciBiPXt9O2EuaW5mbz1mdW5jdGlvbigpe3ZhciBhPXt9O3IoYixmdW5jdGlvbihiLGUpe2FbZV09Yi5pbmZvKCl9KTtyZXR1cm4gYX07YS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGJbYV19O3JldHVybiBhfX1mdW5jdGlvbiBjZygpe3RoaXMuJGdldD1bIiRjYWNoZUZhY3RvcnkiLGZ1bmN0aW9uKGEpe3JldHVybiBhKCJ0ZW1wbGF0ZXMiKX1dfWZ1bmN0aW9uIFhjKGEsYil7ZnVuY3Rpb24gZChhLGIsYyl7dmFyIGQ9L14oW0AmXXxbPTxdKFwqPykpKFw/PylccyooW1x3JF0qKSQvLGU9VCgpO3IoYSxmdW5jdGlvbihhLGYpe2E9YS50cmltKCk7aWYoYSBpbiBwKWVbZl09cFthXTtlbHNle3ZhciBnPWEubWF0Y2goZCk7aWYoIWcpdGhyb3cgJCgiaXNjcCIsYixmLGEsYz8iY29udHJvbGxlciBiaW5kaW5ncyBkZWZpbml0aW9uIjoKICAgICAgICAiaXNvbGF0ZSBzY29wZSBkZWZpbml0aW9uIik7ZVtmXT17bW9kZTpnWzFdWzBdLGNvbGxlY3Rpb246IioiPT09Z1syXSxvcHRpb25hbDoiPyI9PT1nWzNdLGF0dHJOYW1lOmdbNF18fGZ9O2dbNF0mJihwW2FdPWVbZl0pfX0pO3JldHVybiBlfWZ1bmN0aW9uIGMoYSl7dmFyIGI9YS5jaGFyQXQoMCk7aWYoIWJ8fGIhPT1LKGIpKXRocm93ICQoImJhZGRpciIsYSk7aWYoYSE9PWEudHJpbSgpKXRocm93ICQoImJhZGRpciIsYSk7fWZ1bmN0aW9uIGUoYSl7dmFyIGI9YS5yZXF1aXJlfHxhLmNvbnRyb2xsZXImJmEubmFtZTshSChiKSYmRChiKSYmcihiLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5tYXRjaChsKTthLnN1YnN0cmluZyhkWzBdLmxlbmd0aCl8fChiW2NdPWRbMF0rYyl9KTtyZXR1cm4gYn12YXIgZj17fSxnPS9eXHMqZGlyZWN0aXZlOlxzKihbXHctXSspXHMrKC4qKSQvLGs9LygoW1x3LV0rKSg/OjooW147XSspKT87PykvLGg9d2UoIm5nU3JjLG5nU3Jjc2V0LHNyYyxzcmNzZXQiKSwKICAgICAgICBsPS9eKD86KFxeXF4/KT8oXD8pPyhcXlxePyk/KT8vLG09L14ob25bYS16XSt8Zm9ybWFjdGlvbikkLyxwPVQoKTt0aGlzLmRpcmVjdGl2ZT1mdW5jdGlvbiBxYShiLGQpe2diKGIsIm5hbWUiKTtKYShiLCJkaXJlY3RpdmUiKTtBKGIpPyhjKGIpLGdiKGQsImRpcmVjdGl2ZUZhY3RvcnkiKSxmLmhhc093blByb3BlcnR5KGIpfHwoZltiXT1bXSxhLmZhY3RvcnkoYisiRGlyZWN0aXZlIixbIiRpbmplY3RvciIsIiRleGNlcHRpb25IYW5kbGVyIixmdW5jdGlvbihhLGMpe3ZhciBkPVtdO3IoZltiXSxmdW5jdGlvbihmLGcpe3RyeXt2YXIgaD1hLmludm9rZShmKTtCKGgpP2g9e2NvbXBpbGU6aWEoaCl9OiFoLmNvbXBpbGUmJmgubGluayYmKGguY29tcGlsZT1pYShoLmxpbmspKTtoLnByaW9yaXR5PWgucHJpb3JpdHl8fDA7aC5pbmRleD1nO2gubmFtZT1oLm5hbWV8fGI7aC5yZXF1aXJlPWUoaCk7dmFyIGs9aCxsPWgucmVzdHJpY3Q7aWYobCYmKCFBKGwpfHwhL1tFQUNNXS8udGVzdChsKSkpdGhyb3cgJCgiYmFkcmVzdHJpY3QiLAogICAgICAgIGwsYik7ay5yZXN0cmljdD1sfHwiRUEiO2guJCRtb2R1bGVOYW1lPWYuJCRtb2R1bGVOYW1lO2QucHVzaChoKX1jYXRjaChtKXtjKG0pfX0pO3JldHVybiBkfV0pKSxmW2JdLnB1c2goZCkpOnIoYixZYihxYSkpO3JldHVybiB0aGlzfTt0aGlzLmNvbXBvbmVudD1mdW5jdGlvbiB5KGEsYil7ZnVuY3Rpb24gYyhhKXtmdW5jdGlvbiBlKGIpe3JldHVybiBCKGIpfHxIKGIpP2Z1bmN0aW9uKGMsZCl7cmV0dXJuIGEuaW52b2tlKGIsdGhpcyx7JGVsZW1lbnQ6YywkYXR0cnM6ZH0pfTpifXZhciBmPWIudGVtcGxhdGV8fGIudGVtcGxhdGVVcmw/Yi50ZW1wbGF0ZToiIixnPXtjb250cm9sbGVyOmQsY29udHJvbGxlckFzOkJnKGIuY29udHJvbGxlcil8fGIuY29udHJvbGxlckFzfHwiJGN0cmwiLHRlbXBsYXRlOmUoZiksdGVtcGxhdGVVcmw6ZShiLnRlbXBsYXRlVXJsKSx0cmFuc2NsdWRlOmIudHJhbnNjbHVkZSxzY29wZTp7fSxiaW5kVG9Db250cm9sbGVyOmIuYmluZGluZ3N8fHt9LHJlc3RyaWN0OiJFIiwKICAgICAgICByZXF1aXJlOmIucmVxdWlyZX07cihiLGZ1bmN0aW9uKGEsYil7IiQiPT09Yi5jaGFyQXQoMCkmJihnW2JdPWEpfSk7cmV0dXJuIGd9aWYoIUEoYSkpcmV0dXJuIHIoYSxZYihWYSh0aGlzLHkpKSksdGhpczt2YXIgZD1iLmNvbnRyb2xsZXJ8fGZ1bmN0aW9uKCl7fTtyKGIsZnVuY3Rpb24oYSxiKXsiJCI9PT1iLmNoYXJBdCgwKSYmKGNbYl09YSxCKGQpJiYoZFtiXT1hKSl9KTtjLiRpbmplY3Q9WyIkaW5qZWN0b3IiXTtyZXR1cm4gdGhpcy5kaXJlY3RpdmUoYSxjKX07dGhpcy5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdD1mdW5jdGlvbihhKXtyZXR1cm4gdyhhKT8oYi5hSHJlZlNhbml0aXphdGlvbldoaXRlbGlzdChhKSx0aGlzKTpiLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0KCl9O3RoaXMuaW1nU3JjU2FuaXRpemF0aW9uV2hpdGVsaXN0PWZ1bmN0aW9uKGEpe3JldHVybiB3KGEpPyhiLmltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdChhKSx0aGlzKTpiLmltZ1NyY1Nhbml0aXphdGlvbldoaXRlbGlzdCgpfTsKICAgICAgICB2YXIgbj0hMDt0aGlzLmRlYnVnSW5mb0VuYWJsZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHcoYSk/KG49YSx0aGlzKTpufTt2YXIgcz0hMTt0aGlzLnN0cmljdENvbXBvbmVudEJpbmRpbmdzRW5hYmxlZD1mdW5jdGlvbihhKXtyZXR1cm4gdyhhKT8ocz1hLHRoaXMpOnN9O3ZhciBHPTEwO3RoaXMub25DaGFuZ2VzVHRsPWZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhHPWEsdGhpcyk6R307dmFyIHQ9ITA7dGhpcy5jb21tZW50RGlyZWN0aXZlc0VuYWJsZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9YSx0aGlzKTp0fTt2YXIgTj0hMDt0aGlzLmNzc0NsYXNzRGlyZWN0aXZlc0VuYWJsZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE49YSx0aGlzKTpOfTt2YXIgdj1UKCk7dGhpcy5hZGRQcm9wZXJ0eVNlY3VyaXR5Q29udGV4dD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS50b0xvd2VyQ2FzZSgpKyJ8IitiLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmKGQgaW4gdiYmdltkXSE9PWMpdGhyb3cgJCgiY3R4b3ZlcnJpZGUiLGEsYix2W2RdLGMpO3ZbZF09YztyZXR1cm4gdGhpc307KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3IoYyxmdW5jdGlvbihhKXt2W2EudG9Mb3dlckNhc2UoKV09Yn0pfWEoVi5IVE1MLFsiaWZyYW1lfHNyY2RvYyIsIip8aW5uZXJIVE1MIiwiKnxvdXRlckhUTUwiXSk7YShWLkNTUyxbIip8c3R5bGUiXSk7YShWLlVSTCwiYXJlYXxocmVmIGFyZWF8cGluZyBhfGhyZWYgYXxwaW5nIGJsb2NrcXVvdGV8Y2l0ZSBib2R5fGJhY2tncm91bmQgZGVsfGNpdGUgaW5wdXR8c3JjIGluc3xjaXRlIHF8Y2l0ZSIuc3BsaXQoIiAiKSk7YShWLk1FRElBX1VSTCwiYXVkaW98c3JjIGltZ3xzcmMgaW1nfHNyY3NldCBzb3VyY2V8c3JjIHNvdXJjZXxzcmNzZXQgdHJhY2t8c3JjIHZpZGVvfHNyYyB2aWRlb3xwb3N0ZXIiLnNwbGl0KCIgIikpO2EoVi5SRVNPVVJDRV9VUkwsIip8Zm9ybUFjdGlvbiBhcHBsZXR8Y29kZSBhcHBsZXR8Y29kZWJhc2UgYmFzZXxocmVmIGVtYmVkfHNyYyBmcmFtZXxzcmMgZm9ybXxhY3Rpb24gaGVhZHxwcm9maWxlIGh0bWx8bWFuaWZlc3QgaWZyYW1lfHNyYyBsaW5rfGhyZWYgbWVkaWF8c3JjIG9iamVjdHxjb2RlYmFzZSBvYmplY3R8ZGF0YSBzY3JpcHR8c3JjIi5zcGxpdCgiICIpKX0pKCk7CiAgICAgICAgdGhpcy4kZ2V0PVsiJGluamVjdG9yIiwiJGludGVycG9sYXRlIiwiJGV4Y2VwdGlvbkhhbmRsZXIiLCIkdGVtcGxhdGVSZXF1ZXN0IiwiJHBhcnNlIiwiJGNvbnRyb2xsZXIiLCIkcm9vdFNjb3BlIiwiJHNjZSIsIiRhbmltYXRlIixmdW5jdGlvbihhLGIsYyxlLHAsTSxMLHUsUil7ZnVuY3Rpb24gcSgpe3RyeXtpZighLS1KYSl0aHJvdyBVYT12b2lkIDAsJCgiaW5mY2huZyIsRyk7TC4kYXBwbHkoZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiPVVhLmxlbmd0aDthPGI7KythKXRyeXtVYVthXSgpfWNhdGNoKGQpe2MoZCl9VWE9dm9pZCAwfSl9ZmluYWxseXtKYSsrfX1mdW5jdGlvbiBtYShhLGIpe2lmKCFhKXJldHVybiBhO2lmKCFBKGEpKXRocm93ICQoInNyY3NldCIsYixhLnRvU3RyaW5nKCkpO2Zvcih2YXIgYz0iIixkPVUoYSksZT0vKFxzK1xkK3hccyosfFxzK1xkK3dccyosfFxzKyx8LFxzKykvLGU9L1xzLy50ZXN0KGQpP2U6LygsKS8sZD1kLnNwbGl0KGUpLGU9TWF0aC5mbG9vcihkLmxlbmd0aC8KICAgICAgICAgICAgMiksZj0wO2Y8ZTtmKyspdmFyIGc9MipmLGM9Yyt1LmdldFRydXN0ZWRNZWRpYVVybChVKGRbZ10pKSxjPWMrKCIgIitVKGRbZysxXSkpO2Q9VShkWzIqZl0pLnNwbGl0KC9ccy8pO2MrPXUuZ2V0VHJ1c3RlZE1lZGlhVXJsKFUoZFswXSkpOzI9PT1kLmxlbmd0aCYmKGMrPSIgIitVKGRbMV0pKTtyZXR1cm4gY31mdW5jdGlvbiB3KGEsYil7aWYoYil7dmFyIGM9T2JqZWN0LmtleXMoYiksZCxlLGY7ZD0wO2ZvcihlPWMubGVuZ3RoO2Q8ZTtkKyspZj1jW2RdLHRoaXNbZl09YltmXX1lbHNlIHRoaXMuJGF0dHI9e307dGhpcy4kJGVsZW1lbnQ9YX1mdW5jdGlvbiBPKGEsYixjKXtGYS5pbm5lckhUTUw9IjxzcGFuICIrYisiPiI7Yj1GYS5maXJzdENoaWxkLmF0dHJpYnV0ZXM7dmFyIGQ9YlswXTtiLnJlbW92ZU5hbWVkSXRlbShkLm5hbWUpO2QudmFsdWU9YzthLmF0dHJpYnV0ZXMuc2V0TmFtZWRJdGVtKGQpfWZ1bmN0aW9uIHNhKGEsYil7dHJ5e2EuYWRkQ2xhc3MoYil9Y2F0Y2goYyl7fX0KICAgICAgICAgICAgZnVuY3Rpb24gZGEoYSxiLGMsZCxlKXthIGluc3RhbmNlb2YgeHx8KGE9eChhKSk7dmFyIGY9WGEoYSxiLGEsYyxkLGUpO2RhLiQkYWRkU2NvcGVDbGFzcyhhKTt2YXIgZz1udWxsO3JldHVybiBmdW5jdGlvbihiLGMsZCl7aWYoIWEpdGhyb3cgJCgibXVsdGlsaW5rIik7Z2IoYiwic2NvcGUiKTtlJiZlLm5lZWRzTmV3U2NvcGUmJihiPWIuJHBhcmVudC4kbmV3KCkpO2Q9ZHx8e307dmFyIGg9ZC5wYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbixrPWQudHJhbnNjbHVkZUNvbnRyb2xsZXJzO2Q9ZC5mdXR1cmVQYXJlbnRFbGVtZW50O2gmJmguJCRib3VuZFRyYW5zY2x1ZGUmJihoPWguJCRib3VuZFRyYW5zY2x1ZGUpO2d8fChnPShkPWQmJmRbMF0pPyJmb3JlaWdub2JqZWN0IiE9PXVhKGQpJiZsYS5jYWxsKGQpLm1hdGNoKC9TVkcvKT8ic3ZnIjoiaHRtbCI6Imh0bWwiKTtkPSJodG1sIiE9PWc/eChqYShnLHgoIjxkaXY+PC9kaXY+IikuYXBwZW5kKGEpLmh0bWwoKSkpOmM/V2EuY2xvbmUuY2FsbChhKToKICAgICAgICAgICAgICAgIGE7aWYoaylmb3IodmFyIGwgaW4gaylkLmRhdGEoIiQiK2wrIkNvbnRyb2xsZXIiLGtbbF0uaW5zdGFuY2UpO2RhLiQkYWRkU2NvcGVJbmZvKGQsYik7YyYmYyhkLGIpO2YmJmYoYixkLGQsaCk7Y3x8KGE9Zj1udWxsKTtyZXR1cm4gZH19ZnVuY3Rpb24gWGEoYSxiLGMsZCxlLGYpe2Z1bmN0aW9uIGcoYSxjLGQsZSl7dmFyIGYsayxsLG0scCxJLHQ7aWYobilmb3IodD1BcnJheShjLmxlbmd0aCksbT0wO208aC5sZW5ndGg7bSs9MylmPWhbbV0sdFtmXT1jW2ZdO2Vsc2UgdD1jO209MDtmb3IocD1oLmxlbmd0aDttPHA7KWs9dFtoW20rK11dLGM9aFttKytdLGY9aFttKytdLGM/KGMuc2NvcGU/KGw9YS4kbmV3KCksZGEuJCRhZGRTY29wZUluZm8oeChrKSxsKSk6bD1hLEk9Yy50cmFuc2NsdWRlT25UaGlzRWxlbWVudD9rYShhLGMudHJhbnNjbHVkZSxlKTohYy50ZW1wbGF0ZU9uVGhpc0VsZW1lbnQmJmU/ZTohZSYmYj9rYShhLGIpOm51bGwsYyhmLGwsayxkLEkpKTpmJiZmKGEsay5jaGlsZE5vZGVzLAogICAgICAgICAgICAgICAgdm9pZCAwLGUpfWZvcih2YXIgaD1bXSxrPUgoYSl8fGEgaW5zdGFuY2VvZiB4LGwsbSxwLEksbix0PTA7dDxhLmxlbmd0aDt0Kyspe2w9bmV3IHc7MTE9PT1DYSYmaWIoYSx0LGspO209c2MoYVt0XSxbXSxsLDA9PT10P2Q6dm9pZCAwLGUpOyhmPW0ubGVuZ3RoP2FhKG0sYVt0XSxsLGIsYyxudWxsLFtdLFtdLGYpOm51bGwpJiZmLnNjb3BlJiZkYS4kJGFkZFNjb3BlQ2xhc3MobC4kJGVsZW1lbnQpO2w9ZiYmZi50ZXJtaW5hbHx8IShwPWFbdF0uY2hpbGROb2Rlcyl8fCFwLmxlbmd0aD9udWxsOlhhKHAsZj8oZi50cmFuc2NsdWRlT25UaGlzRWxlbWVudHx8IWYudGVtcGxhdGVPblRoaXNFbGVtZW50KSYmZi50cmFuc2NsdWRlOmIpO2lmKGZ8fGwpaC5wdXNoKHQsZixsKSxJPSEwLG49bnx8ZjtmPW51bGx9cmV0dXJuIEk/ZzpudWxsfWZ1bmN0aW9uIGliKGEsYixjKXt2YXIgZD1hW2JdLGU9ZC5wYXJlbnROb2RlLGY7aWYoZC5ub2RlVHlwZT09PVBhKWZvcig7Oyl7Zj1lP2QubmV4dFNpYmxpbmc6CiAgICAgICAgICAgICAgICBhW2IrMV07aWYoIWZ8fGYubm9kZVR5cGUhPT1QYSlicmVhaztkLm5vZGVWYWx1ZSs9Zi5ub2RlVmFsdWU7Zi5wYXJlbnROb2RlJiZmLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZik7YyYmZj09PWFbYisxXSYmYS5zcGxpY2UoYisxLDEpfX1mdW5jdGlvbiBrYShhLGIsYyl7ZnVuY3Rpb24gZChlLGYsZyxoLGspe2V8fChlPWEuJG5ldyghMSxrKSxlLiQkdHJhbnNjbHVkZWQ9ITApO3JldHVybiBiKGUsZix7cGFyZW50Qm91bmRUcmFuc2NsdWRlRm46Yyx0cmFuc2NsdWRlQ29udHJvbGxlcnM6ZyxmdXR1cmVQYXJlbnRFbGVtZW50Omh9KX12YXIgZT1kLiQkc2xvdHM9VCgpLGY7Zm9yKGYgaW4gYi4kJHNsb3RzKWVbZl09Yi4kJHNsb3RzW2ZdP2thKGEsYi4kJHNsb3RzW2ZdLGMpOm51bGw7cmV0dXJuIGR9ZnVuY3Rpb24gc2MoYSxiLGQsZSxmKXt2YXIgZz1kLiRhdHRyLGg7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTpoPXVhKGEpO1goYix3YShoKSwiRSIsZSxmKTtmb3IodmFyIGwsbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbix0LEoscz1hLmF0dHJpYnV0ZXMsdj0wLEc9cyYmcy5sZW5ndGg7djxHO3YrKyl7dmFyIFA9ITEsTj0hMSxyPSExLHk9ITEsdT0hMSxNO2w9c1t2XTttPWwubmFtZTt0PWwudmFsdWU7bj13YShtLnRvTG93ZXJDYXNlKCkpOyhKPW4ubWF0Y2goUmEpKT8ocj0iQXR0ciI9PT1KWzFdLHk9IlByb3AiPT09SlsxXSx1PSJPbiI9PT1KWzFdLG09bS5yZXBsYWNlKHBkLCIiKS50b0xvd2VyQ2FzZSgpLnN1YnN0cig0K0pbMV0ubGVuZ3RoKS5yZXBsYWNlKC9fKC4pL2csZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSkpOihNPW4ubWF0Y2goU2EpKSYmY2EoTVsxXSkmJihQPW0sTj1tLnN1YnN0cigwLG0ubGVuZ3RoLTUpKyJlbmQiLG09bS5zdWJzdHIoMCxtLmxlbmd0aC02KSk7aWYoeXx8dSlkW25dPXQsZ1tuXT1sLm5hbWUseT9FYShhLGIsbixtKTpiLnB1c2gocWQocCxMLGMsbixtLCExKSk7ZWxzZXtuPXdhKG0udG9Mb3dlckNhc2UoKSk7Z1tuXT1tO2lmKHJ8fCFkLmhhc093blByb3BlcnR5KG4pKWRbbl09CiAgICAgICAgICAgICAgICB0LGxkKGEsbikmJihkW25dPSEwKTtJYShhLGIsdCxuLHIpO1goYixuLCJBIixlLGYsUCxOKX19ImlucHV0Ij09PWgmJiJoaWRkZW4iPT09YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSYmYS5zZXRBdHRyaWJ1dGUoImF1dG9jb21wbGV0ZSIsIm9mZiIpO2lmKCFRYSlicmVhaztnPWEuY2xhc3NOYW1lO0QoZykmJihnPWcuYW5pbVZhbCk7aWYoQShnKSYmIiIhPT1nKWZvcig7YT1rLmV4ZWMoZyk7KW49d2EoYVsyXSksWChiLG4sIkMiLGUsZikmJihkW25dPVUoYVszXSkpLGc9Zy5zdWJzdHIoYS5pbmRleCthWzBdLmxlbmd0aCk7YnJlYWs7Y2FzZSBQYTpuYShiLGEubm9kZVZhbHVlKTticmVhaztjYXNlIDg6aWYoIU9hKWJyZWFrO0YoYSxiLGQsZSxmKX1iLnNvcnQoaWEpO3JldHVybiBifWZ1bmN0aW9uIEYoYSxiLGMsZCxlKXt0cnl7dmFyIGY9Zy5leGVjKGEubm9kZVZhbHVlKTtpZihmKXt2YXIgaD13YShmWzFdKTtYKGIsaCwiTSIsZCxlKSYmKGNbaF09VShmWzJdKSl9fWNhdGNoKGspe319CiAgICAgICAgICAgIGZ1bmN0aW9uIFYoYSxiLGMpe3ZhciBkPVtdLGU9MDtpZihiJiZhLmhhc0F0dHJpYnV0ZSYmYS5oYXNBdHRyaWJ1dGUoYikpe2Rve2lmKCFhKXRocm93ICQoInV0ZXJkaXIiLGIsYyk7MT09PWEubm9kZVR5cGUmJihhLmhhc0F0dHJpYnV0ZShiKSYmZSsrLGEuaGFzQXR0cmlidXRlKGMpJiZlLS0pO2QucHVzaChhKTthPWEubmV4dFNpYmxpbmd9d2hpbGUoMDxlKX1lbHNlIGQucHVzaChhKTtyZXR1cm4geChkKX1mdW5jdGlvbiBZKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCxlLGYsZyxoKXtlPVYoZVswXSxiLGMpO3JldHVybiBhKGQsZSxmLGcsaCl9fWZ1bmN0aW9uIFooYSxiLGMsZCxlLGYpe3ZhciBnO3JldHVybiBhP2RhKGIsYyxkLGUsZik6ZnVuY3Rpb24oKXtnfHwoZz1kYShiLGMsZCxlLGYpLGI9Yz1mPW51bGwpO3JldHVybiBnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gYWEoYSxiLGQsZSxmLGcsaCxrLGwpe2Z1bmN0aW9uIG0oYSxiLGMsZCl7aWYoYSl7YyYmKGE9CiAgICAgICAgICAgICAgICBZKGEsYyxkKSk7YS5yZXF1aXJlPXUucmVxdWlyZTthLmRpcmVjdGl2ZU5hbWU9UTtpZihzPT09dXx8dS4kJGlzb2xhdGVTY29wZSlhPUFhKGEse2lzb2xhdGVTY29wZTohMH0pO2gucHVzaChhKX1pZihiKXtjJiYoYj1ZKGIsYyxkKSk7Yi5yZXF1aXJlPXUucmVxdWlyZTtiLmRpcmVjdGl2ZU5hbWU9UTtpZihzPT09dXx8dS4kJGlzb2xhdGVTY29wZSliPUFhKGIse2lzb2xhdGVTY29wZTohMH0pO2sucHVzaChiKX19ZnVuY3Rpb24gcChhLGUsZixnLGwpe2Z1bmN0aW9uIG0oYSxiLGMsZCl7dmFyIGU7YmIoYSl8fChkPWMsYz1iLGI9YSxhPXZvaWQgMCk7TiYmKGU9UCk7Y3x8KGM9Tj9RLnBhcmVudCgpOlEpO2lmKGQpe3ZhciBmPWwuJCRzbG90c1tkXTtpZihmKXJldHVybiBmKGEsYixlLGMsUik7aWYoeihmKSl0aHJvdyAkKCJub3Nsb3QiLGQsemEoUSkpO31lbHNlIHJldHVybiBsKGEsYixlLGMsUil9dmFyIG4sdSxMLHksRyxQLE0sUTtiPT09Zj8oZz1kLFE9ZC4kJGVsZW1lbnQpOihRPQogICAgICAgICAgICAgICAgeChmKSxnPW5ldyB3KFEsZCkpO0c9ZTtzP3k9ZS4kbmV3KCEwKTp0JiYoRz1lLiRwYXJlbnQpO2wmJihNPW0sTS4kJGJvdW5kVHJhbnNjbHVkZT1sLE0uaXNTbG90RmlsbGVkPWZ1bmN0aW9uKGEpe3JldHVybiEhbC4kJHNsb3RzW2FdfSk7SiYmKFA9ZWEoUSxnLE0sSix5LGUscykpO3MmJihkYS4kJGFkZFNjb3BlSW5mbyhRLHksITAsISh2JiYodj09PXN8fHY9PT1zLiQkb3JpZ2luYWxEaXJlY3RpdmUpKSksZGEuJCRhZGRTY29wZUNsYXNzKFEsITApLHkuJCRpc29sYXRlQmluZGluZ3M9cy4kJGlzb2xhdGVCaW5kaW5ncyx1PURhKGUsZyx5LHkuJCRpc29sYXRlQmluZGluZ3MscyksdS5yZW1vdmVXYXRjaGVzJiZ5LiRvbigiJGRlc3Ryb3kiLHUucmVtb3ZlV2F0Y2hlcykpO2ZvcihuIGluIFApe3U9SltuXTtMPVBbbl07dmFyIENnPXUuJCRiaW5kaW5ncy5iaW5kVG9Db250cm9sbGVyO0wuaW5zdGFuY2U9TCgpO1EuZGF0YSgiJCIrdS5uYW1lKyJDb250cm9sbGVyIixMLmluc3RhbmNlKTsKICAgICAgICAgICAgICAgIEwuYmluZGluZ0luZm89RGEoRyxnLEwuaW5zdGFuY2UsQ2csdSl9cihKLGZ1bmN0aW9uKGEsYil7dmFyIGM9YS5yZXF1aXJlO2EuYmluZFRvQ29udHJvbGxlciYmIUgoYykmJkQoYykmJlMoUFtiXS5pbnN0YW5jZSxXKGIsYyxRLFApKX0pO3IoUCxmdW5jdGlvbihhKXt2YXIgYj1hLmluc3RhbmNlO2lmKEIoYi4kb25DaGFuZ2VzKSl0cnl7Yi4kb25DaGFuZ2VzKGEuYmluZGluZ0luZm8uaW5pdGlhbENoYW5nZXMpfWNhdGNoKGQpe2MoZCl9aWYoQihiLiRvbkluaXQpKXRyeXtiLiRvbkluaXQoKX1jYXRjaChlKXtjKGUpfUIoYi4kZG9DaGVjaykmJihHLiR3YXRjaChmdW5jdGlvbigpe2IuJGRvQ2hlY2soKX0pLGIuJGRvQ2hlY2soKSk7QihiLiRvbkRlc3Ryb3kpJiZHLiRvbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7Yi4kb25EZXN0cm95KCl9KX0pO249MDtmb3IodT1oLmxlbmd0aDtuPHU7bisrKUw9aFtuXSxCYShMLEwuaXNvbGF0ZVNjb3BlP3k6ZSxRLGcsTC5yZXF1aXJlJiZXKEwuZGlyZWN0aXZlTmFtZSwKICAgICAgICAgICAgICAgIEwucmVxdWlyZSxRLFApLE0pO3ZhciBSPWU7cyYmKHMudGVtcGxhdGV8fG51bGw9PT1zLnRlbXBsYXRlVXJsKSYmKFI9eSk7YSYmYShSLGYuY2hpbGROb2Rlcyx2b2lkIDAsbCk7Zm9yKG49ay5sZW5ndGgtMTswPD1uO24tLSlMPWtbbl0sQmEoTCxMLmlzb2xhdGVTY29wZT95OmUsUSxnLEwucmVxdWlyZSYmVyhMLmRpcmVjdGl2ZU5hbWUsTC5yZXF1aXJlLFEsUCksTSk7cihQLGZ1bmN0aW9uKGEpe2E9YS5pbnN0YW5jZTtCKGEuJHBvc3RMaW5rKSYmYS4kcG9zdExpbmsoKX0pfWw9bHx8e307Zm9yKHZhciBuPS1OdW1iZXIuTUFYX1ZBTFVFLHQ9bC5uZXdTY29wZURpcmVjdGl2ZSxKPWwuY29udHJvbGxlckRpcmVjdGl2ZXMscz1sLm5ld0lzb2xhdGVTY29wZURpcmVjdGl2ZSx2PWwudGVtcGxhdGVEaXJlY3RpdmUsTD1sLm5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmUsRz0hMSxQPSExLE49bC5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSx5PWQuJCRlbGVtZW50PXgoYiksdSxRLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0sUj1lLHEsbWE9ITEsSWI9ITEsTyxzYT0wLEE9YS5sZW5ndGg7c2E8QTtzYSsrKXt1PWFbc2FdO3ZhciBFPXUuJCRzdGFydCxpYj11LiQkZW5kO0UmJih5PVYoYixFLGliKSk7TT12b2lkIDA7aWYobj51LnByaW9yaXR5KWJyZWFrO2lmKE89dS5zY29wZSl1LnRlbXBsYXRlVXJsfHwoRChPKT8oYmEoIm5ldy9pc29sYXRlZCBzY29wZSIsc3x8dCx1LHkpLHM9dSk6YmEoIm5ldy9pc29sYXRlZCBzY29wZSIscyx1LHkpKSx0PXR8fHU7UT11Lm5hbWU7aWYoIW1hJiYodS5yZXBsYWNlJiYodS50ZW1wbGF0ZVVybHx8dS50ZW1wbGF0ZSl8fHUudHJhbnNjbHVkZSYmIXUuJCR0bGIpKXtmb3IoTz1zYSsxO21hPWFbTysrXTspaWYobWEudHJhbnNjbHVkZSYmIW1hLiQkdGxifHxtYS5yZXBsYWNlJiYobWEudGVtcGxhdGVVcmx8fG1hLnRlbXBsYXRlKSl7SWI9ITA7YnJlYWt9bWE9ITB9IXUudGVtcGxhdGVVcmwmJnUuY29udHJvbGxlciYmKEo9Snx8VCgpLGJhKCInIitRKyInIGNvbnRyb2xsZXIiLAogICAgICAgICAgICAgICAgSltRXSx1LHkpLEpbUV09dSk7aWYoTz11LnRyYW5zY2x1ZGUpaWYoRz0hMCx1LiQkdGxifHwoYmEoInRyYW5zY2x1c2lvbiIsTCx1LHkpLEw9dSksImVsZW1lbnQiPT09TylOPSEwLG49dS5wcmlvcml0eSxNPXkseT1kLiQkZWxlbWVudD14KGRhLiQkY3JlYXRlQ29tbWVudChRLGRbUV0pKSxiPXlbMF0scGEoZixIYS5jYWxsKE0sMCksYiksUj1aKEliLE0sZSxuLGcmJmcubmFtZSx7bm9uVGxiVHJhbnNjbHVkZURpcmVjdGl2ZTpMfSk7ZWxzZXt2YXIga2E9VCgpO2lmKEQoTykpe009Qy5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7dmFyIFhhPVQoKSxGPVQoKTtyKE8sZnVuY3Rpb24oYSxiKXt2YXIgYz0iPyI9PT1hLmNoYXJBdCgwKTthPWM/YS5zdWJzdHJpbmcoMSk6YTtYYVthXT1iO2thW2JdPW51bGw7RltiXT1jfSk7cih5LmNvbnRlbnRzKCksZnVuY3Rpb24oYSl7dmFyIGI9WGFbd2EodWEoYSkpXTtiPyhGW2JdPSEwLGthW2JdPWthW2JdfHxDLmRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwKICAgICAgICAgICAgICAgIGthW2JdLmFwcGVuZENoaWxkKGEpKTpNLmFwcGVuZENoaWxkKGEpfSk7cihGLGZ1bmN0aW9uKGEsYil7aWYoIWEpdGhyb3cgJCgicmVxc2xvdCIsYik7fSk7Zm9yKHZhciBLIGluIGthKWthW0tdJiYoUj14KGthW0tdLmNoaWxkTm9kZXMpLGthW0tdPVooSWIsUixlKSk7TT14KE0uY2hpbGROb2Rlcyl9ZWxzZSBNPXgocGMoYikpLmNvbnRlbnRzKCk7eS5lbXB0eSgpO1I9WihJYixNLGUsdm9pZCAwLHZvaWQgMCx7bmVlZHNOZXdTY29wZTp1LiQkaXNvbGF0ZVNjb3BlfHx1LiQkbmV3U2NvcGV9KTtSLiQkc2xvdHM9a2F9aWYodS50ZW1wbGF0ZSlpZihQPSEwLGJhKCJ0ZW1wbGF0ZSIsdix1LHkpLHY9dSxPPUIodS50ZW1wbGF0ZSk/dS50ZW1wbGF0ZSh5LGQpOnUudGVtcGxhdGUsTz1OYShPKSx1LnJlcGxhY2Upe2c9dTtNPW1jLnRlc3QoTyk/cmQoamEodS50ZW1wbGF0ZU5hbWVzcGFjZSxVKE8pKSk6W107Yj1NWzBdO2lmKDEhPT1NLmxlbmd0aHx8MSE9PWIubm9kZVR5cGUpdGhyb3cgJCgidHBscnQiLAogICAgICAgICAgICAgICAgUSwiIik7cGEoZix5LGIpO0E9eyRhdHRyOnt9fTtPPXNjKGIsW10sQSk7dmFyIERnPWEuc3BsaWNlKHNhKzEsYS5sZW5ndGgtKHNhKzEpKTsoc3x8dCkmJmZhKE8scyx0KTthPWEuY29uY2F0KE8pLmNvbmNhdChEZyk7Z2EoZCxBKTtBPWEubGVuZ3RofWVsc2UgeS5odG1sKE8pO2lmKHUudGVtcGxhdGVVcmwpUD0hMCxiYSgidGVtcGxhdGUiLHYsdSx5KSx2PXUsdS5yZXBsYWNlJiYoZz11KSxwPWhhKGEuc3BsaWNlKHNhLGEubGVuZ3RoLXNhKSx5LGQsZixHJiZSLGgsayx7Y29udHJvbGxlckRpcmVjdGl2ZXM6SixuZXdTY29wZURpcmVjdGl2ZTp0IT09dSYmdCxuZXdJc29sYXRlU2NvcGVEaXJlY3RpdmU6cyx0ZW1wbGF0ZURpcmVjdGl2ZTp2LG5vblRsYlRyYW5zY2x1ZGVEaXJlY3RpdmU6TH0pLEE9YS5sZW5ndGg7ZWxzZSBpZih1LmNvbXBpbGUpdHJ5e3E9dS5jb21waWxlKHksZCxSKTt2YXIgWD11LiQkb3JpZ2luYWxEaXJlY3RpdmV8fHU7QihxKT9tKG51bGwsVmEoWCxxKSxFLGliKToKICAgICAgICAgICAgICAgIHEmJm0oVmEoWCxxLnByZSksVmEoWCxxLnBvc3QpLEUsaWIpfWNhdGNoKGNhKXtjKGNhLHphKHkpKX11LnRlcm1pbmFsJiYocC50ZXJtaW5hbD0hMCxuPU1hdGgubWF4KG4sdS5wcmlvcml0eSkpfXAuc2NvcGU9dCYmITA9PT10LnNjb3BlO3AudHJhbnNjbHVkZU9uVGhpc0VsZW1lbnQ9RztwLnRlbXBsYXRlT25UaGlzRWxlbWVudD1QO3AudHJhbnNjbHVkZT1SO2wuaGFzRWxlbWVudFRyYW5zY2x1ZGVEaXJlY3RpdmU9TjtyZXR1cm4gcH1mdW5jdGlvbiBXKGEsYixjLGQpe3ZhciBlO2lmKEEoYikpe3ZhciBmPWIubWF0Y2gobCk7Yj1iLnN1YnN0cmluZyhmWzBdLmxlbmd0aCk7dmFyIGc9ZlsxXXx8ZlszXSxmPSI/Ij09PWZbMl07Il5eIj09PWc/Yz1jLnBhcmVudCgpOmU9KGU9ZCYmZFtiXSkmJmUuaW5zdGFuY2U7aWYoIWUpe3ZhciBoPSIkIitiKyJDb250cm9sbGVyIjtlPSJeXiI9PT1nJiZjWzBdJiY5PT09Y1swXS5ub2RlVHlwZT9udWxsOmc/Yy5pbmhlcml0ZWREYXRhKGgpOmMuZGF0YShoKX1pZighZSYmCiAgICAgICAgICAgICAgICAhZil0aHJvdyAkKCJjdHJlcSIsYixhKTt9ZWxzZSBpZihIKGIpKWZvcihlPVtdLGc9MCxmPWIubGVuZ3RoO2c8ZjtnKyspZVtnXT1XKGEsYltnXSxjLGQpO2Vsc2UgRChiKSYmKGU9e30scihiLGZ1bmN0aW9uKGIsZil7ZVtmXT1XKGEsYixjLGQpfSkpO3JldHVybiBlfHxudWxsfWZ1bmN0aW9uIGVhKGEsYixjLGQsZSxmLGcpe3ZhciBoPVQoKSxrO2ZvcihrIGluIGQpe3ZhciBsPWRba10sbT17JHNjb3BlOmw9PT1nfHxsLiQkaXNvbGF0ZVNjb3BlP2U6ZiwkZWxlbWVudDphLCRhdHRyczpiLCR0cmFuc2NsdWRlOmN9LHA9bC5jb250cm9sbGVyOyJAIj09PXAmJihwPWJbbC5uYW1lXSk7bT1NKHAsbSwhMCxsLmNvbnRyb2xsZXJBcyk7aFtsLm5hbWVdPW07YS5kYXRhKCIkIitsLm5hbWUrIkNvbnRyb2xsZXIiLG0uaW5zdGFuY2UpfXJldHVybiBofWZ1bmN0aW9uIGZhKGEsYixjKXtmb3IodmFyIGQ9MCxlPWEubGVuZ3RoO2Q8ZTtkKyspYVtkXT1hYyhhW2RdLHskJGlzb2xhdGVTY29wZTpiLAogICAgICAgICAgICAgICAgJCRuZXdTY29wZTpjfSl9ZnVuY3Rpb24gWChiLGMsZSxnLGgsayxsKXtpZihjPT09aClyZXR1cm4gbnVsbDt2YXIgbT1udWxsO2lmKGYuaGFzT3duUHJvcGVydHkoYykpe2g9YS5nZXQoYysiRGlyZWN0aXZlIik7Zm9yKHZhciBwPTAsbj1oLmxlbmd0aDtwPG47cCsrKWlmKGM9aFtwXSwoeihnKXx8Zz5jLnByaW9yaXR5KSYmLTEhPT1jLnJlc3RyaWN0LmluZGV4T2YoZSkpe2smJihjPWFjKGMseyQkc3RhcnQ6aywkJGVuZDpsfSkpO2lmKCFjLiQkYmluZGluZ3Mpe3ZhciBJPW09Yyx0PWMubmFtZSx1PXtpc29sYXRlU2NvcGU6bnVsbCxiaW5kVG9Db250cm9sbGVyOm51bGx9O0QoSS5zY29wZSkmJighMD09PUkuYmluZFRvQ29udHJvbGxlcj8odS5iaW5kVG9Db250cm9sbGVyPWQoSS5zY29wZSx0LCEwKSx1Lmlzb2xhdGVTY29wZT17fSk6dS5pc29sYXRlU2NvcGU9ZChJLnNjb3BlLHQsITEpKTtEKEkuYmluZFRvQ29udHJvbGxlcikmJih1LmJpbmRUb0NvbnRyb2xsZXI9ZChJLmJpbmRUb0NvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICB0LCEwKSk7aWYodS5iaW5kVG9Db250cm9sbGVyJiYhSS5jb250cm9sbGVyKXRocm93ICQoIm5vY3RybCIsdCk7bT1tLiQkYmluZGluZ3M9dTtEKG0uaXNvbGF0ZVNjb3BlKSYmKGMuJCRpc29sYXRlQmluZGluZ3M9bS5pc29sYXRlU2NvcGUpfWIucHVzaChjKTttPWN9fXJldHVybiBtfWZ1bmN0aW9uIGNhKGIpe2lmKGYuaGFzT3duUHJvcGVydHkoYikpZm9yKHZhciBjPWEuZ2V0KGIrIkRpcmVjdGl2ZSIpLGQ9MCxlPWMubGVuZ3RoO2Q8ZTtkKyspaWYoYj1jW2RdLGIubXVsdGlFbGVtZW50KXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGdhKGEsYil7dmFyIGM9Yi4kYXR0cixkPWEuJGF0dHI7cihhLGZ1bmN0aW9uKGQsZSl7IiQiIT09ZS5jaGFyQXQoMCkmJihiW2VdJiZiW2VdIT09ZCYmKGQ9ZC5sZW5ndGg/ZCsoKCJzdHlsZSI9PT1lPyI7IjoiICIpK2JbZV0pOmJbZV0pLGEuJHNldChlLGQsITAsY1tlXSkpfSk7cihiLGZ1bmN0aW9uKGIsZSl7YS5oYXNPd25Qcm9wZXJ0eShlKXx8CiAgICAgICAgICAgICIkIj09PWUuY2hhckF0KDApfHwoYVtlXT1iLCJjbGFzcyIhPT1lJiYic3R5bGUiIT09ZSYmKGRbZV09Y1tlXSkpfSl9ZnVuY3Rpb24gaGEoYSxiLGQsZixnLGgsayxsKXt2YXIgbT1bXSxwLG4sdD1iWzBdLHU9YS5zaGlmdCgpLEo9YWModSx7dGVtcGxhdGVVcmw6bnVsbCx0cmFuc2NsdWRlOm51bGwscmVwbGFjZTpudWxsLCQkb3JpZ2luYWxEaXJlY3RpdmU6dX0pLHM9Qih1LnRlbXBsYXRlVXJsKT91LnRlbXBsYXRlVXJsKGIsZCk6dS50ZW1wbGF0ZVVybCxMPXUudGVtcGxhdGVOYW1lc3BhY2U7Yi5lbXB0eSgpO2UocykudGhlbihmdW5jdGlvbihjKXt2YXIgZSxJO2M9TmEoYyk7aWYodS5yZXBsYWNlKXtjPW1jLnRlc3QoYyk/cmQoamEoTCxVKGMpKSk6W107ZT1jWzBdO2lmKDEhPT1jLmxlbmd0aHx8MSE9PWUubm9kZVR5cGUpdGhyb3cgJCgidHBscnQiLHUubmFtZSxzKTtjPXskYXR0cjp7fX07cGEoZixiLGUpO3ZhciB2PXNjKGUsW10sYyk7RCh1LnNjb3BlKSYmZmEodiwhMCk7YT0KICAgICAgICAgICAgICAgIHYuY29uY2F0KGEpO2dhKGQsYyl9ZWxzZSBlPXQsYi5odG1sKGMpO2EudW5zaGlmdChKKTtwPWFhKGEsZSxkLGcsYix1LGgsayxsKTtyKGYsZnVuY3Rpb24oYSxjKXthPT09ZSYmKGZbY109YlswXSl9KTtmb3Iobj1YYShiWzBdLmNoaWxkTm9kZXMsZyk7bS5sZW5ndGg7KXtjPW0uc2hpZnQoKTtJPW0uc2hpZnQoKTt2YXIgeT1tLnNoaWZ0KCksUD1tLnNoaWZ0KCksdj1iWzBdO2lmKCFjLiQkZGVzdHJveWVkKXtpZihJIT09dCl7dmFyIEc9SS5jbGFzc05hbWU7bC5oYXNFbGVtZW50VHJhbnNjbHVkZURpcmVjdGl2ZSYmdS5yZXBsYWNlfHwodj1wYyhlKSk7cGEoeSx4KEkpLHYpO3NhKHgodiksRyl9ST1wLnRyYW5zY2x1ZGVPblRoaXNFbGVtZW50P2thKGMscC50cmFuc2NsdWRlLFApOlA7cChuLGMsdixmLEkpfX1tPW51bGx9KS5jYXRjaChmdW5jdGlvbihhKXtjYyhhKSYmYyhhKX0pO3JldHVybiBmdW5jdGlvbihhLGIsYyxkLGUpe2E9ZTtiLiQkZGVzdHJveWVkfHwobT9tLnB1c2goYiwKICAgICAgICAgICAgICAgIGMsZCxhKToocC50cmFuc2NsdWRlT25UaGlzRWxlbWVudCYmKGE9a2EoYixwLnRyYW5zY2x1ZGUsZSkpLHAobixiLGMsZCxhKSkpfX1mdW5jdGlvbiBpYShhLGIpe3ZhciBjPWIucHJpb3JpdHktYS5wcmlvcml0eTtyZXR1cm4gMCE9PWM/YzphLm5hbWUhPT1iLm5hbWU/YS5uYW1lPGIubmFtZT8tMToxOmEuaW5kZXgtYi5pbmRleH1mdW5jdGlvbiBiYShhLGIsYyxkKXtmdW5jdGlvbiBlKGEpe3JldHVybiBhPyIgKG1vZHVsZTogIithKyIpIjoiIn1pZihiKXRocm93ICQoIm11bHRpZGlyIixiLm5hbWUsZShiLiQkbW9kdWxlTmFtZSksYy5uYW1lLGUoYy4kJG1vZHVsZU5hbWUpLGEsemEoZCkpO31mdW5jdGlvbiBuYShhLGMpe3ZhciBkPWIoYywhMCk7ZCYmYS5wdXNoKHtwcmlvcml0eTowLGNvbXBpbGU6ZnVuY3Rpb24oYSl7YT1hLnBhcmVudCgpO3ZhciBiPSEhYS5sZW5ndGg7YiYmZGEuJCRhZGRCaW5kaW5nQ2xhc3MoYSk7cmV0dXJuIGZ1bmN0aW9uKGEsYyl7dmFyIGU9Yy5wYXJlbnQoKTsKICAgICAgICAgICAgICAgICAgICBifHxkYS4kJGFkZEJpbmRpbmdDbGFzcyhlKTtkYS4kJGFkZEJpbmRpbmdJbmZvKGUsZC5leHByZXNzaW9ucyk7YS4kd2F0Y2goZCxmdW5jdGlvbihhKXtjWzBdLm5vZGVWYWx1ZT1hfSl9fX0pfWZ1bmN0aW9uIGphKGEsYil7YT1LKGF8fCJodG1sIik7c3dpdGNoKGEpe2Nhc2UgInN2ZyI6Y2FzZSAibWF0aCI6dmFyIGM9Qy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlubmVySFRNTD0iPCIrYSsiPiIrYisiPC8iK2ErIj4iO3JldHVybiBjLmNoaWxkTm9kZXNbMF0uY2hpbGROb2RlcztkZWZhdWx0OnJldHVybiBifX1mdW5jdGlvbiBvYShhLGIpe2lmKCJzcmNkb2MiPT09YilyZXR1cm4gdS5IVE1MO2lmKCJzcmMiPT09Ynx8Im5nU3JjIj09PWIpcmV0dXJuLTE9PT1bImltZyIsInZpZGVvIiwiYXVkaW8iLCJzb3VyY2UiLCJ0cmFjayJdLmluZGV4T2YoYSk/dS5SRVNPVVJDRV9VUkw6dS5NRURJQV9VUkw7aWYoInhsaW5rSHJlZiI9PT1iKXJldHVybiJpbWFnZSI9PT1hP3UuTUVESUFfVVJMOgogICAgICAgICAgICAgICAgImEiPT09YT91LlVSTDp1LlJFU09VUkNFX1VSTDtpZigiZm9ybSI9PT1hJiYiYWN0aW9uIj09PWJ8fCJiYXNlIj09PWEmJiJocmVmIj09PWJ8fCJsaW5rIj09PWEmJiJocmVmIj09PWIpcmV0dXJuIHUuUkVTT1VSQ0VfVVJMO2lmKCJhIj09PWEmJigiaHJlZiI9PT1ifHwibmdIcmVmIj09PWIpKXJldHVybiB1LlVSTH1mdW5jdGlvbiB4YShhLGIpe3ZhciBjPWIudG9Mb3dlckNhc2UoKTtyZXR1cm4gdlthKyJ8IitjXXx8dlsiKnwiK2NdfWZ1bmN0aW9uIHlhKGEpe3JldHVybiBtYSh1LnZhbHVlT2YoYSksIm5nLXByb3Atc3Jjc2V0Iil9ZnVuY3Rpb24gRWEoYSxiLGMsZCl7aWYobS50ZXN0KGQpKXRocm93ICQoIm5vZG9tZXZlbnRzIik7YT11YShhKTt2YXIgZT14YShhLGQpLGY9VGE7InNyY3NldCIhPT1kfHwiaW1nIiE9PWEmJiJzb3VyY2UiIT09YT9lJiYoZj11LmdldFRydXN0ZWQuYmluZCh1LGUpKTpmPXlhO2IucHVzaCh7cHJpb3JpdHk6MTAwLGNvbXBpbGU6ZnVuY3Rpb24oYSxiKXt2YXIgZT0KICAgICAgICAgICAgICAgICAgICBwKGJbY10pLGc9cChiW2NdLGZ1bmN0aW9uKGEpe3JldHVybiB1LnZhbHVlT2YoYSl9KTtyZXR1cm57cHJlOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe3ZhciBnPWUoYSk7YlswXVtkXT1mKGcpfWMoKTthLiR3YXRjaChnLGMpfX19fSl9ZnVuY3Rpb24gSWEoYSxjLGQsZSxmKXt2YXIgZz11YShhKSxrPW9hKGcsZSksbD1oW2VdfHxmLHA9YihkLCFmLGssbCk7aWYocCl7aWYoIm11bHRpcGxlIj09PWUmJiJzZWxlY3QiPT09Zyl0aHJvdyAkKCJzZWxtdWx0aSIsemEoYSkpO2lmKG0udGVzdChlKSl0aHJvdyAkKCJub2RvbWV2ZW50cyIpO2MucHVzaCh7cHJpb3JpdHk6MTAwLGNvbXBpbGU6ZnVuY3Rpb24oKXtyZXR1cm57cHJlOmZ1bmN0aW9uKGEsYyxmKXtjPWYuJCRvYnNlcnZlcnN8fChmLiQkb2JzZXJ2ZXJzPVQoKSk7dmFyIGc9ZltlXTtnIT09ZCYmKHA9ZyYmYihnLCEwLGssbCksZD1nKTtwJiYoZltlXT1wKGEpLChjW2VdfHwoY1tlXT1bXSkpLiQkaW50ZXI9ITAsKGYuJCRvYnNlcnZlcnMmJgogICAgICAgICAgICAgICAgICAgICAgICBmLiQkb2JzZXJ2ZXJzW2VdLiQkc2NvcGV8fGEpLiR3YXRjaChwLGZ1bmN0aW9uKGEsYil7ImNsYXNzIj09PWUmJmEhPT1iP2YuJHVwZGF0ZUNsYXNzKGEsYik6Zi4kc2V0KGUsYSl9KSl9fX19KX19ZnVuY3Rpb24gcGEoYSxiLGMpe3ZhciBkPWJbMF0sZT1iLmxlbmd0aCxmPWQucGFyZW50Tm9kZSxnLGg7aWYoYSlmb3IoZz0wLGg9YS5sZW5ndGg7ZzxoO2crKylpZihhW2ddPT09ZCl7YVtnKytdPWM7aD1nK2UtMTtmb3IodmFyIGs9YS5sZW5ndGg7ZzxrO2crKyxoKyspaDxrP2FbZ109YVtoXTpkZWxldGUgYVtnXTthLmxlbmd0aC09ZS0xO2EuY29udGV4dD09PWQmJihhLmNvbnRleHQ9Yyk7YnJlYWt9ZiYmZi5yZXBsYWNlQ2hpbGQoYyxkKTthPUMuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2ZvcihnPTA7ZzxlO2crKylhLmFwcGVuZENoaWxkKGJbZ10pO3guaGFzRGF0YShkKSYmKHguZGF0YShjLHguZGF0YShkKSkseChkKS5vZmYoIiRkZXN0cm95IikpO3guY2xlYW5EYXRhKGEucXVlcnlTZWxlY3RvckFsbCgiKiIpKTsKICAgICAgICAgICAgICAgIGZvcihnPTE7ZzxlO2crKylkZWxldGUgYltnXTtiWzBdPWM7Yi5sZW5ndGg9MX1mdW5jdGlvbiBBYShhLGIpe3JldHVybiBTKGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkobnVsbCxhcmd1bWVudHMpfSxhLGIpfWZ1bmN0aW9uIEJhKGEsYixkLGUsZixnKXt0cnl7YShiLGQsZSxmLGcpfWNhdGNoKGgpe2MoaCx6YShkKSl9fWZ1bmN0aW9uIHJhKGEsYil7aWYocyl0aHJvdyAkKCJtaXNzaW5nYXR0ciIsYSxiKTt9ZnVuY3Rpb24gRGEoYSxjLGQsZSxmKXtmdW5jdGlvbiBnKGIsYyxlKXtCKGQuJG9uQ2hhbmdlcykmJiFkYyhjLGUpJiYoVWF8fChhLiQkcG9zdERpZ2VzdChxKSxVYT1bXSksbXx8KG09e30sVWEucHVzaChoKSksbVtiXSYmKGU9bVtiXS5wcmV2aW91c1ZhbHVlKSxtW2JdPW5ldyBKYihlLGMpKX1mdW5jdGlvbiBoKCl7ZC4kb25DaGFuZ2VzKG0pO209dm9pZCAwfXZhciBrPVtdLGw9e30sbTtyKGUsZnVuY3Rpb24oZSxoKXt2YXIgbT1lLmF0dHJOYW1lLG49ZS5vcHRpb25hbCwKICAgICAgICAgICAgICAgIEksdCx1LHM7c3dpdGNoKGUubW9kZSl7Y2FzZSAiQCI6bnx8dGEuY2FsbChjLG0pfHwocmEobSxmLm5hbWUpLGRbaF09Y1ttXT12b2lkIDApO249Yy4kb2JzZXJ2ZShtLGZ1bmN0aW9uKGEpe2lmKEEoYSl8fEdhKGEpKWcoaCxhLGRbaF0pLGRbaF09YX0pO2MuJCRvYnNlcnZlcnNbbV0uJCRzY29wZT1hO0k9Y1ttXTtBKEkpP2RbaF09YihJKShhKTpHYShJKSYmKGRbaF09SSk7bFtoXT1uZXcgSmIodGMsZFtoXSk7ay5wdXNoKG4pO2JyZWFrO2Nhc2UgIj0iOmlmKCF0YS5jYWxsKGMsbSkpe2lmKG4pYnJlYWs7cmEobSxmLm5hbWUpO2NbbV09dm9pZCAwfWlmKG4mJiFjW21dKWJyZWFrO3Q9cChjW21dKTtzPXQubGl0ZXJhbD92YTpkYzt1PXQuYXNzaWdufHxmdW5jdGlvbigpe0k9ZFtoXT10KGEpO3Rocm93ICQoIm5vbmFzc2lnbiIsY1ttXSxtLGYubmFtZSk7fTtJPWRbaF09dChhKTtuPWZ1bmN0aW9uKGIpe3MoYixkW2hdKXx8KHMoYixJKT91KGEsYj1kW2hdKTpkW2hdPWIpO3JldHVybiBJPQogICAgICAgICAgICAgICAgYn07bi4kc3RhdGVmdWw9ITA7bj1lLmNvbGxlY3Rpb24/YS4kd2F0Y2hDb2xsZWN0aW9uKGNbbV0sbik6YS4kd2F0Y2gocChjW21dLG4pLG51bGwsdC5saXRlcmFsKTtrLnB1c2gobik7YnJlYWs7Y2FzZSAiPCI6aWYoIXRhLmNhbGwoYyxtKSl7aWYobilicmVhaztyYShtLGYubmFtZSk7Y1ttXT12b2lkIDB9aWYobiYmIWNbbV0pYnJlYWs7dD1wKGNbbV0pO3ZhciB2PXQubGl0ZXJhbCxMPWRbaF09dChhKTtsW2hdPW5ldyBKYih0YyxkW2hdKTtuPWFbZS5jb2xsZWN0aW9uPyIkd2F0Y2hDb2xsZWN0aW9uIjoiJHdhdGNoIl0odCxmdW5jdGlvbihhLGIpe2lmKGI9PT1hKXtpZihiPT09THx8diYmdmEoYixMKSlyZXR1cm47Yj1MfWcoaCxhLGIpO2RbaF09YX0pO2sucHVzaChuKTticmVhaztjYXNlICImIjpufHx0YS5jYWxsKGMsbSl8fHJhKG0sZi5uYW1lKTt0PWMuaGFzT3duUHJvcGVydHkobSk/cChjW21dKTpFO2lmKHQ9PT1FJiZuKWJyZWFrO2RbaF09ZnVuY3Rpb24oYil7cmV0dXJuIHQoYSwKICAgICAgICAgICAgICAgIGIpfX19KTtyZXR1cm57aW5pdGlhbENoYW5nZXM6bCxyZW1vdmVXYXRjaGVzOmsubGVuZ3RoJiZmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI9ay5sZW5ndGg7YTxiOysrYSlrW2FdKCl9fX12YXIgTWE9L15cdy8sRmE9Qy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxPYT10LFFhPU4sSmE9RyxVYTt3LnByb3RvdHlwZT17JG5vcm1hbGl6ZTp3YSwkYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7YSYmMDxhLmxlbmd0aCYmUi5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCxhKX0sJHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe2EmJjA8YS5sZW5ndGgmJlIucmVtb3ZlQ2xhc3ModGhpcy4kJGVsZW1lbnQsYSl9LCR1cGRhdGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXNkKGEsYik7YyYmYy5sZW5ndGgmJlIuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsYyk7KGM9c2QoYixhKSkmJmMubGVuZ3RoJiZSLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LGMpfSwkc2V0OmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBmPQogICAgICAgICAgICAgICAgICAgIGxkKHRoaXMuJCRlbGVtZW50WzBdLGEpLGc9dGRbYV0saD1hO2Y/KHRoaXMuJCRlbGVtZW50LnByb3AoYSxiKSxlPWYpOmcmJih0aGlzW2ddPWIsaD1nKTt0aGlzW2FdPWI7ZT90aGlzLiRhdHRyW2FdPWU6KGU9dGhpcy4kYXR0clthXSl8fCh0aGlzLiRhdHRyW2FdPWU9VmMoYSwiLSIpKTsiaW1nIj09PXVhKHRoaXMuJCRlbGVtZW50KSYmInNyY3NldCI9PT1hJiYodGhpc1thXT1iPW1hKGIsIiRzZXQoJ3NyY3NldCcsIHZhbHVlKSIpKTshMSE9PWQmJihudWxsPT09Ynx8eihiKT90aGlzLiQkZWxlbWVudC5yZW1vdmVBdHRyKGUpOk1hLnRlc3QoZSk/ZiYmITE9PT1iP3RoaXMuJCRlbGVtZW50LnJlbW92ZUF0dHIoZSk6dGhpcy4kJGVsZW1lbnQuYXR0cihlLGIpOk8odGhpcy4kJGVsZW1lbnRbMF0sZSxiKSk7KGE9dGhpcy4kJG9ic2VydmVycykmJnIoYVtoXSxmdW5jdGlvbihhKXt0cnl7YShiKX1jYXRjaChkKXtjKGQpfX0pfSwkb2JzZXJ2ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsCiAgICAgICAgICAgICAgICAgICAgZD1jLiQkb2JzZXJ2ZXJzfHwoYy4kJG9ic2VydmVycz1UKCkpLGU9ZFthXXx8KGRbYV09W10pO2UucHVzaChiKTtMLiRldmFsQXN5bmMoZnVuY3Rpb24oKXtlLiQkaW50ZXJ8fCFjLmhhc093blByb3BlcnR5KGEpfHx6KGNbYV0pfHxiKGNbYV0pfSk7cmV0dXJuIGZ1bmN0aW9uKCl7Y2IoZSxiKX19fTt2YXIgS2E9Yi5zdGFydFN5bWJvbCgpLExhPWIuZW5kU3ltYm9sKCksTmE9Int7Ij09PUthJiYifX0iPT09TGE/VGE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZSgvXHtcey9nLEthKS5yZXBsYWNlKC99fS9nLExhKX0sUmE9L15uZyhBdHRyfFByb3B8T24pKFtBLVpdLiopJC8sU2E9L14oLispU3RhcnQkLztkYS4kJGFkZEJpbmRpbmdJbmZvPW4/ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmRhdGEoIiRiaW5kaW5nIil8fFtdO0goYik/Yz1jLmNvbmNhdChiKTpjLnB1c2goYik7YS5kYXRhKCIkYmluZGluZyIsYyl9OkU7ZGEuJCRhZGRCaW5kaW5nQ2xhc3M9bj9mdW5jdGlvbihhKXtzYShhLAogICAgICAgICAgICAgICAgIm5nLWJpbmRpbmciKX06RTtkYS4kJGFkZFNjb3BlSW5mbz1uP2Z1bmN0aW9uKGEsYixjLGQpe2EuZGF0YShjP2Q/IiRpc29sYXRlU2NvcGVOb1RlbXBsYXRlIjoiJGlzb2xhdGVTY29wZSI6IiRzY29wZSIsYil9OkU7ZGEuJCRhZGRTY29wZUNsYXNzPW4/ZnVuY3Rpb24oYSxiKXtzYShhLGI/Im5nLWlzb2xhdGUtc2NvcGUiOiJuZy1zY29wZSIpfTpFO2RhLiQkY3JlYXRlQ29tbWVudD1mdW5jdGlvbihhLGIpe3ZhciBjPSIiO24mJihjPSIgIisoYXx8IiIpKyI6ICIsYiYmKGMrPWIrIiAiKSk7cmV0dXJuIEMuZG9jdW1lbnQuY3JlYXRlQ29tbWVudChjKX07cmV0dXJuIGRhfV19ZnVuY3Rpb24gSmIoYSxiKXt0aGlzLnByZXZpb3VzVmFsdWU9YTt0aGlzLmN1cnJlbnRWYWx1ZT1ifWZ1bmN0aW9uIHdhKGEpe3JldHVybiBhLnJlcGxhY2UocGQsIiIpLnJlcGxhY2UoRWcsZnVuY3Rpb24oYSxkLGMpe3JldHVybiBjP2QudG9VcHBlckNhc2UoKTpkfSl9ZnVuY3Rpb24gc2QoYSxiKXt2YXIgZD0KICAgICAgICAiIixjPWEuc3BsaXQoL1xzKy8pLGU9Yi5zcGxpdCgvXHMrLyksZj0wO2E6Zm9yKDtmPGMubGVuZ3RoO2YrKyl7Zm9yKHZhciBnPWNbZl0saz0wO2s8ZS5sZW5ndGg7aysrKWlmKGc9PT1lW2tdKWNvbnRpbnVlIGE7ZCs9KDA8ZC5sZW5ndGg/IiAiOiIiKStnfXJldHVybiBkfWZ1bmN0aW9uIHJkKGEpe2E9eChhKTt2YXIgYj1hLmxlbmd0aDtpZigxPj1iKXJldHVybiBhO2Zvcig7Yi0tOyl7dmFyIGQ9YVtiXTsoOD09PWQubm9kZVR5cGV8fGQubm9kZVR5cGU9PT1QYSYmIiI9PT1kLm5vZGVWYWx1ZS50cmltKCkpJiZGZy5jYWxsKGEsYiwxKX1yZXR1cm4gYX1mdW5jdGlvbiBCZyhhLGIpe2lmKGImJkEoYikpcmV0dXJuIGI7aWYoQShhKSl7dmFyIGQ9dWQuZXhlYyhhKTtpZihkKXJldHVybiBkWzNdfX1mdW5jdGlvbiBGZigpe3ZhciBhPXt9O3RoaXMuaGFzPWZ1bmN0aW9uKGIpe3JldHVybiBhLmhhc093blByb3BlcnR5KGIpfTt0aGlzLnJlZ2lzdGVyPWZ1bmN0aW9uKGIsZCl7SmEoYiwKICAgICAgICAiY29udHJvbGxlciIpO0QoYik/UyhhLGIpOmFbYl09ZH07dGhpcy4kZ2V0PVsiJGluamVjdG9yIixmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGEsYixkLGcpe2lmKCFhfHwhRChhLiRzY29wZSkpdGhyb3cgRigiJGNvbnRyb2xsZXIiKSgibm9zY3AiLGcsYik7YS4kc2NvcGVbYl09ZH1yZXR1cm4gZnVuY3Rpb24oYyxlLGYsZyl7dmFyIGssaCxsO2Y9ITA9PT1mO2cmJkEoZykmJihsPWcpO2lmKEEoYykpe2c9Yy5tYXRjaCh1ZCk7aWYoIWcpdGhyb3cgdmQoImN0cmxmbXQiLGMpO2g9Z1sxXTtsPWx8fGdbM107Yz1hLmhhc093blByb3BlcnR5KGgpP2FbaF06R2UoZS4kc2NvcGUsaCwhMCk7aWYoIWMpdGhyb3cgdmQoImN0cmxyZWciLGgpO3NiKGMsaCwhMCl9aWYoZilyZXR1cm4gZj0oSChjKT9jW2MubGVuZ3RoLTFdOmMpLnByb3RvdHlwZSxrPU9iamVjdC5jcmVhdGUoZnx8bnVsbCksbCYmZChlLGwsayxofHxjLm5hbWUpLFMoZnVuY3Rpb24oKXt2YXIgYT1iLmludm9rZShjLGssZSxoKTsKICAgICAgICBhIT09ayYmKEQoYSl8fEIoYSkpJiYoaz1hLGwmJmQoZSxsLGssaHx8Yy5uYW1lKSk7cmV0dXJuIGt9LHtpbnN0YW5jZTprLGlkZW50aWZpZXI6bH0pO2s9Yi5pbnN0YW50aWF0ZShjLGUsaCk7bCYmZChlLGwsayxofHxjLm5hbWUpO3JldHVybiBrfX1dfWZ1bmN0aW9uIEdmKCl7dGhpcy4kZ2V0PVsiJHdpbmRvdyIsZnVuY3Rpb24oYSl7cmV0dXJuIHgoYS5kb2N1bWVudCl9XX1mdW5jdGlvbiBIZigpe3RoaXMuJGdldD1bIiRkb2N1bWVudCIsIiRyb290U2NvcGUiLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZCgpe2U9Yy5oaWRkZW59dmFyIGM9YVswXSxlPWMmJmMuaGlkZGVuO2Eub24oInZpc2liaWxpdHljaGFuZ2UiLGQpO2IuJG9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXthLm9mZigidmlzaWJpbGl0eWNoYW5nZSIsZCl9KTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZX19XX1mdW5jdGlvbiBJZigpe3RoaXMuJGdldD1bIiRsb2ciLGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQpe2EuZXJyb3IuYXBwbHkoYSxhcmd1bWVudHMpfX1dfWZ1bmN0aW9uIHVjKGEpe3JldHVybiBEKGEpP2hhKGEpP2EudG9JU09TdHJpbmcoKTplYihhKTphfWZ1bmN0aW9uIE9mKCl7dGhpcy4kZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiIiO3ZhciBiPVtdO09jKGEsZnVuY3Rpb24oYSxjKXtudWxsPT09YXx8eihhKXx8QihhKXx8KEgoYSk/cihhLGZ1bmN0aW9uKGEpe2IucHVzaChiYShjKSsiPSIrYmEodWMoYSkpKX0pOmIucHVzaChiYShjKSsiPSIrYmEodWMoYSkpKSl9KTtyZXR1cm4gYi5qb2luKCImIil9fX1mdW5jdGlvbiBQZigpe3RoaXMuJGdldD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsZSxmKXtIKGEpP3IoYSxmdW5jdGlvbihhLGMpe2IoYSxlKyJbIisoRChhKT9jOiIiKSsiXSIpfSk6RChhKSYmIWhhKGEpP09jKGEsZnVuY3Rpb24oYSxjKXtiKGEsZSsoZj8iIjoiWyIpK2MrKGY/IiI6Il0iKSl9KToKICAgICAgICAoQihhKSYmKGE9YSgpKSxkLnB1c2goYmEoZSkrIj0iKyhudWxsPT1hPyIiOmJhKHVjKGEpKSkpKX1pZighYSlyZXR1cm4iIjt2YXIgZD1bXTtiKGEsIiIsITApO3JldHVybiBkLmpvaW4oIiYiKX19fWZ1bmN0aW9uIHZjKGEsYil7aWYoQShhKSl7dmFyIGQ9YS5yZXBsYWNlKEdnLCIiKS50cmltKCk7aWYoZCl7dmFyIGM9YigiQ29udGVudC1UeXBlIiksYz1jJiYwPT09Yy5pbmRleE9mKHdkKSxlOyhlPWMpfHwoZT0oZT1kLm1hdGNoKEhnKSkmJklnW2VbMF1dLnRlc3QoZCkpO2lmKGUpdHJ5e2E9UmMoZCl9Y2F0Y2goZil7aWYoIWMpcmV0dXJuIGE7dGhyb3cgS2IoImJhZGRhdGEiLGEsZik7fX19cmV0dXJuIGF9ZnVuY3Rpb24geGQoYSl7dmFyIGI9VCgpLGQ7QShhKT9yKGEuc3BsaXQoIlxuIiksZnVuY3Rpb24oYSl7ZD1hLmluZGV4T2YoIjoiKTt2YXIgZT1LKFUoYS5zdWJzdHIoMCxkKSkpO2E9VShhLnN1YnN0cihkKzEpKTtlJiYoYltlXT1iW2VdP2JbZV0rIiwgIithOmEpfSk6RChhKSYmCiAgICAgICAgcihhLGZ1bmN0aW9uKGEsZCl7dmFyIGY9SyhkKSxnPVUoYSk7ZiYmKGJbZl09YltmXT9iW2ZdKyIsICIrZzpnKX0pO3JldHVybiBifWZ1bmN0aW9uIHlkKGEpe3ZhciBiO3JldHVybiBmdW5jdGlvbihkKXtifHwoYj14ZChhKSk7cmV0dXJuIGQ/KGQ9YltLKGQpXSx2b2lkIDA9PT1kJiYoZD1udWxsKSxkKTpifX1mdW5jdGlvbiB6ZChhLGIsZCxjKXtpZihCKGMpKXJldHVybiBjKGEsYixkKTtyKGMsZnVuY3Rpb24oYyl7YT1jKGEsYixkKX0pO3JldHVybiBhfWZ1bmN0aW9uIE5mKCl7dmFyIGE9dGhpcy5kZWZhdWx0cz17dHJhbnNmb3JtUmVzcG9uc2U6W3ZjXSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihhKXtyZXR1cm4gRChhKSYmIltvYmplY3QgRmlsZV0iIT09bGEuY2FsbChhKSYmIltvYmplY3QgQmxvYl0iIT09bGEuY2FsbChhKSYmIltvYmplY3QgRm9ybURhdGFdIiE9PWxhLmNhbGwoYSk/ZWIoYSk6YX1dLGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifSwKICAgICAgICAgICAgcG9zdDpqYSh3YykscHV0OmphKHdjKSxwYXRjaDpqYSh3Yyl9LHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixwYXJhbVNlcmlhbGl6ZXI6IiRodHRwUGFyYW1TZXJpYWxpemVyIixqc29ucENhbGxiYWNrUGFyYW06ImNhbGxiYWNrIn0sYj0hMTt0aGlzLnVzZUFwcGx5QXN5bmM9ZnVuY3Rpb24oYSl7cmV0dXJuIHcoYSk/KGI9ISFhLHRoaXMpOmJ9O3ZhciBkPXRoaXMuaW50ZXJjZXB0b3JzPVtdLGM9dGhpcy54c3JmV2hpdGVsaXN0ZWRPcmlnaW5zPVtdO3RoaXMuJGdldD1bIiRicm93c2VyIiwiJGh0dHBCYWNrZW5kIiwiJCRjb29raWVSZWFkZXIiLCIkY2FjaGVGYWN0b3J5IiwiJHJvb3RTY29wZSIsIiRxIiwiJGluamVjdG9yIiwiJHNjZSIsZnVuY3Rpb24oZSxmLGcsayxoLGwsbSxwKXtmdW5jdGlvbiBuKGIpe2Z1bmN0aW9uIGMoYSxiKXtmb3IodmFyIGQ9MCxlPWIubGVuZ3RoO2Q8ZTspe3ZhciBmPWJbZCsrXSxnPWJbZCsrXTsKICAgICAgICBhPWEudGhlbihmLGcpfWIubGVuZ3RoPTA7cmV0dXJuIGF9ZnVuY3Rpb24gZChhLGIpe3ZhciBjLGU9e307cihhLGZ1bmN0aW9uKGEsZCl7QihhKT8oYz1hKGIpLG51bGwhPWMmJihlW2RdPWMpKTplW2RdPWF9KTtyZXR1cm4gZX1mdW5jdGlvbiBmKGEpe3ZhciBiPVMoe30sYSk7Yi5kYXRhPXpkKGEuZGF0YSxhLmhlYWRlcnMsYS5zdGF0dXMsZy50cmFuc2Zvcm1SZXNwb25zZSk7YT1hLnN0YXR1cztyZXR1cm4gMjAwPD1hJiYzMDA+YT9iOmwucmVqZWN0KGIpfWlmKCFEKGIpKXRocm93IEYoIiRodHRwIikoImJhZHJlcSIsYik7aWYoIUEocC52YWx1ZU9mKGIudXJsKSkpdGhyb3cgRigiJGh0dHAiKSgiYmFkcmVxIixiLnVybCk7dmFyIGc9Uyh7bWV0aG9kOiJnZXQiLHRyYW5zZm9ybVJlcXVlc3Q6YS50cmFuc2Zvcm1SZXF1ZXN0LHRyYW5zZm9ybVJlc3BvbnNlOmEudHJhbnNmb3JtUmVzcG9uc2UscGFyYW1TZXJpYWxpemVyOmEucGFyYW1TZXJpYWxpemVyLGpzb25wQ2FsbGJhY2tQYXJhbTphLmpzb25wQ2FsbGJhY2tQYXJhbX0sCiAgICAgICAgYik7Zy5oZWFkZXJzPWZ1bmN0aW9uKGIpe3ZhciBjPWEuaGVhZGVycyxlPVMoe30sYi5oZWFkZXJzKSxmLGcsaCxjPVMoe30sYy5jb21tb24sY1tLKGIubWV0aG9kKV0pO2E6Zm9yKGYgaW4gYyl7Zz1LKGYpO2ZvcihoIGluIGUpaWYoSyhoKT09PWcpY29udGludWUgYTtlW2ZdPWNbZl19cmV0dXJuIGQoZSxqYShiKSl9KGIpO2cubWV0aG9kPXViKGcubWV0aG9kKTtnLnBhcmFtU2VyaWFsaXplcj1BKGcucGFyYW1TZXJpYWxpemVyKT9tLmdldChnLnBhcmFtU2VyaWFsaXplcik6Zy5wYXJhbVNlcmlhbGl6ZXI7ZS4kJGluY091dHN0YW5kaW5nUmVxdWVzdENvdW50KCIkaHR0cCIpO3ZhciBoPVtdLGs9W107Yj1sLnJlc29sdmUoZyk7cih2LGZ1bmN0aW9uKGEpeyhhLnJlcXVlc3R8fGEucmVxdWVzdEVycm9yKSYmaC51bnNoaWZ0KGEucmVxdWVzdCxhLnJlcXVlc3RFcnJvcik7KGEucmVzcG9uc2V8fGEucmVzcG9uc2VFcnJvcikmJmsucHVzaChhLnJlc3BvbnNlLGEucmVzcG9uc2VFcnJvcil9KTsKICAgICAgICBiPWMoYixoKTtiPWIudGhlbihmdW5jdGlvbihiKXt2YXIgYz1iLmhlYWRlcnMsZD16ZChiLmRhdGEseWQoYyksdm9pZCAwLGIudHJhbnNmb3JtUmVxdWVzdCk7eihkKSYmcihjLGZ1bmN0aW9uKGEsYil7ImNvbnRlbnQtdHlwZSI9PT1LKGIpJiZkZWxldGUgY1tiXX0pO3ooYi53aXRoQ3JlZGVudGlhbHMpJiYheihhLndpdGhDcmVkZW50aWFscykmJihiLndpdGhDcmVkZW50aWFscz1hLndpdGhDcmVkZW50aWFscyk7cmV0dXJuIHMoYixkKS50aGVuKGYsZil9KTtiPWMoYixrKTtyZXR1cm4gYj1iLmZpbmFsbHkoZnVuY3Rpb24oKXtlLiQkY29tcGxldGVPdXRzdGFuZGluZ1JlcXVlc3QoRSwiJGh0dHAiKX0pfWZ1bmN0aW9uIHMoYyxkKXtmdW5jdGlvbiBlKGEpe2lmKGEpe3ZhciBjPXt9O3IoYSxmdW5jdGlvbihhLGQpe2NbZF09ZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZCgpe2EoYyl9Yj9oLiRhcHBseUFzeW5jKGQpOmguJCRwaGFzZT9kKCk6aC4kYXBwbHkoZCl9fSk7cmV0dXJuIGN9fWZ1bmN0aW9uIGsoYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyxkLGUsZil7ZnVuY3Rpb24gZygpe20oYyxhLGQsZSxmKX1SJiYoMjAwPD1hJiYzMDA+YT9SLnB1dChPLFthLGMseGQoZCksZSxmXSk6Ui5yZW1vdmUoTykpO2I/aC4kYXBwbHlBc3luYyhnKTooZygpLGguJCRwaGFzZXx8aC4kYXBwbHkoKSl9ZnVuY3Rpb24gbShhLGIsZCxlLGYpe2I9LTE8PWI/YjowOygyMDA8PWImJjMwMD5iP0wucmVzb2x2ZTpMLnJlamVjdCkoe2RhdGE6YSxzdGF0dXM6YixoZWFkZXJzOnlkKGQpLGNvbmZpZzpjLHN0YXR1c1RleHQ6ZSx4aHJTdGF0dXM6Zn0pfWZ1bmN0aW9uIHMoYSl7bShhLmRhdGEsYS5zdGF0dXMsamEoYS5oZWFkZXJzKCkpLGEuc3RhdHVzVGV4dCxhLnhoclN0YXR1cyl9ZnVuY3Rpb24gdigpe3ZhciBhPW4ucGVuZGluZ1JlcXVlc3RzLmluZGV4T2YoYyk7LTEhPT1hJiZuLnBlbmRpbmdSZXF1ZXN0cy5zcGxpY2UoYSwxKX12YXIgTD1sLmRlZmVyKCksdT1MLnByb21pc2UsUixxLG1hPWMuaGVhZGVycyx4PSJqc29ucCI9PT1LKGMubWV0aG9kKSwKICAgICAgICBPPWMudXJsO3g/Tz1wLmdldFRydXN0ZWRSZXNvdXJjZVVybChPKTpBKE8pfHwoTz1wLnZhbHVlT2YoTykpO089RyhPLGMucGFyYW1TZXJpYWxpemVyKGMucGFyYW1zKSk7eCYmKE89dChPLGMuanNvbnBDYWxsYmFja1BhcmFtKSk7bi5wZW5kaW5nUmVxdWVzdHMucHVzaChjKTt1LnRoZW4odix2KTshYy5jYWNoZSYmIWEuY2FjaGV8fCExPT09Yy5jYWNoZXx8IkdFVCIhPT1jLm1ldGhvZCYmIkpTT05QIiE9PWMubWV0aG9kfHwoUj1EKGMuY2FjaGUpP2MuY2FjaGU6RChhLmNhY2hlKT9hLmNhY2hlOk4pO1ImJihxPVIuZ2V0KE8pLHcocSk/cSYmQihxLnRoZW4pP3EudGhlbihzLHMpOkgocSk/bShxWzFdLHFbMF0samEocVsyXSkscVszXSxxWzRdKTptKHEsMjAwLHt9LCJPSyIsImNvbXBsZXRlIik6Ui5wdXQoTyx1KSk7eihxKSYmKChxPWpjKGMudXJsKT9nKClbYy54c3JmQ29va2llTmFtZXx8YS54c3JmQ29va2llTmFtZV06dm9pZCAwKSYmKG1hW2MueHNyZkhlYWRlck5hbWV8fGEueHNyZkhlYWRlck5hbWVdPQogICAgICAgIHEpLGYoYy5tZXRob2QsTyxkLGssbWEsYy50aW1lb3V0LGMud2l0aENyZWRlbnRpYWxzLGMucmVzcG9uc2VUeXBlLGUoYy5ldmVudEhhbmRsZXJzKSxlKGMudXBsb2FkRXZlbnRIYW5kbGVycykpKTtyZXR1cm4gdX1mdW5jdGlvbiBHKGEsYil7MDxiLmxlbmd0aCYmKGErPSgtMT09PWEuaW5kZXhPZigiPyIpPyI/IjoiJiIpK2IpO3JldHVybiBhfWZ1bmN0aW9uIHQoYSxiKXt2YXIgYz1hLnNwbGl0KCI/Iik7aWYoMjxjLmxlbmd0aCl0aHJvdyBLYigiYmFkanNvbnAiLGEpO2M9Z2MoY1sxXSk7cihjLGZ1bmN0aW9uKGMsZCl7aWYoIkpTT05fQ0FMTEJBQ0siPT09Yyl0aHJvdyBLYigiYmFkanNvbnAiLGEpO2lmKGQ9PT1iKXRocm93IEtiKCJiYWRqc29ucCIsYixhKTt9KTtyZXR1cm4gYSs9KC0xPT09YS5pbmRleE9mKCI/Iik/Ij8iOiImIikrYisiPUpTT05fQ0FMTEJBQ0sifXZhciBOPWsoIiRodHRwIik7YS5wYXJhbVNlcmlhbGl6ZXI9QShhLnBhcmFtU2VyaWFsaXplcik/bS5nZXQoYS5wYXJhbVNlcmlhbGl6ZXIpOgogICAgICAgIGEucGFyYW1TZXJpYWxpemVyO3ZhciB2PVtdO3IoZCxmdW5jdGlvbihhKXt2LnVuc2hpZnQoQShhKT9tLmdldChhKTptLmludm9rZShhKSl9KTt2YXIgamM9SmcoYyk7bi5wZW5kaW5nUmVxdWVzdHM9W107KGZ1bmN0aW9uKGEpe3IoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe25bYV09ZnVuY3Rpb24oYixjKXtyZXR1cm4gbihTKHt9LGN8fHt9LHttZXRob2Q6YSx1cmw6Yn0pKX19KX0pKCJnZXQiLCJkZWxldGUiLCJoZWFkIiwianNvbnAiKTsoZnVuY3Rpb24oYSl7cihhcmd1bWVudHMsZnVuY3Rpb24oYSl7blthXT1mdW5jdGlvbihiLGMsZCl7cmV0dXJuIG4oUyh7fSxkfHx7fSx7bWV0aG9kOmEsdXJsOmIsZGF0YTpjfSkpfX0pfSkoInBvc3QiLCJwdXQiLCJwYXRjaCIpO24uZGVmYXVsdHM9YTtyZXR1cm4gbn1dfWZ1bmN0aW9uIFJmKCl7dGhpcy4kZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBDLlhNTEh0dHBSZXF1ZXN0fX19ZnVuY3Rpb24gUWYoKXt0aGlzLiRnZXQ9CiAgICAgICAgWyIkYnJvd3NlciIsIiRqc29ucENhbGxiYWNrcyIsIiRkb2N1bWVudCIsIiR4aHJGYWN0b3J5IixmdW5jdGlvbihhLGIsZCxjKXtyZXR1cm4gS2coYSxjLGEuZGVmZXIsYixkWzBdKX1dfWZ1bmN0aW9uIEtnKGEsYixkLGMsZSl7ZnVuY3Rpb24gZihhLGIsZCl7YT1hLnJlcGxhY2UoIkpTT05fQ0FMTEJBQ0siLGIpO3ZhciBmPWUuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksbT1udWxsO2YudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtmLnNyYz1hO2YuYXN5bmM9ITA7bT1mdW5jdGlvbihhKXtmLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLG0pO2YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG0pO2UuYm9keS5yZW1vdmVDaGlsZChmKTtmPW51bGw7dmFyIGc9LTEscz0idW5rbm93biI7YSYmKCJsb2FkIiE9PWEudHlwZXx8Yy53YXNDYWxsZWQoYil8fChhPXt0eXBlOiJlcnJvciJ9KSxzPWEudHlwZSxnPSJlcnJvciI9PT1hLnR5cGU/NDA0OjIwMCk7ZCYmZChnLHMpfTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLAogICAgICAgIG0pO2YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG0pO2UuYm9keS5hcHBlbmRDaGlsZChmKTtyZXR1cm4gbX1yZXR1cm4gZnVuY3Rpb24oZSxrLGgsbCxtLHAsbixzLEcsdCl7ZnVuY3Rpb24gTihhKXtKPSJ0aW1lb3V0Ij09PWE7cWEmJnFhKCk7eSYmeS5hYm9ydCgpfWZ1bmN0aW9uIHYoYSxiLGMsZSxmLGcpe3coUCkmJmQuY2FuY2VsKFApO3FhPXk9bnVsbDthKGIsYyxlLGYsZyl9az1rfHxhLnVybCgpO2lmKCJqc29ucCI9PT1LKGUpKXZhciBxPWMuY3JlYXRlQ2FsbGJhY2soaykscWE9ZihrLHEsZnVuY3Rpb24oYSxiKXt2YXIgZD0yMDA9PT1hJiZjLmdldFJlc3BvbnNlKHEpO3YobCxhLGQsIiIsYiwiY29tcGxldGUiKTtjLnJlbW92ZUNhbGxiYWNrKHEpfSk7ZWxzZXt2YXIgeT1iKGUsayksSj0hMTt5Lm9wZW4oZSxrLCEwKTtyKG0sZnVuY3Rpb24oYSxiKXt3KGEpJiZ5LnNldFJlcXVlc3RIZWFkZXIoYixhKX0pO3kub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9eS5zdGF0dXNUZXh0fHwKICAgICAgICAiIixiPSJyZXNwb25zZSJpbiB5P3kucmVzcG9uc2U6eS5yZXNwb25zZVRleHQsYz0xMjIzPT09eS5zdGF0dXM/MjA0Onkuc3RhdHVzOzA9PT1jJiYoYz1iPzIwMDoiZmlsZSI9PT1nYShrKS5wcm90b2NvbD80MDQ6MCk7dihsLGMsYix5LmdldEFsbFJlc3BvbnNlSGVhZGVycygpLGEsImNvbXBsZXRlIil9O3kub25lcnJvcj1mdW5jdGlvbigpe3YobCwtMSxudWxsLG51bGwsIiIsImVycm9yIil9O3kub250aW1lb3V0PWZ1bmN0aW9uKCl7dihsLC0xLG51bGwsbnVsbCwiIiwidGltZW91dCIpfTt5Lm9uYWJvcnQ9ZnVuY3Rpb24oKXt2KGwsLTEsbnVsbCxudWxsLCIiLEo/InRpbWVvdXQiOiJhYm9ydCIpfTtyKEcsZnVuY3Rpb24oYSxiKXt5LmFkZEV2ZW50TGlzdGVuZXIoYixhKX0pO3IodCxmdW5jdGlvbihhLGIpe3kudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoYixhKX0pO24mJih5LndpdGhDcmVkZW50aWFscz0hMCk7aWYocyl0cnl7eS5yZXNwb25zZVR5cGU9c31jYXRjaChJKXtpZigianNvbiIhPT0KICAgICAgICBzKXRocm93IEk7fXkuc2VuZCh6KGgpP251bGw6aCl9aWYoMDxwKXZhciBQPWQoZnVuY3Rpb24oKXtOKCJ0aW1lb3V0Iil9LHApO2Vsc2UgcCYmQihwLnRoZW4pJiZwLnRoZW4oZnVuY3Rpb24oKXtOKHcocC4kJHRpbWVvdXRJZCk/InRpbWVvdXQiOiJhYm9ydCIpfSl9fWZ1bmN0aW9uIEtmKCl7dmFyIGE9Int7IixiPSJ9fSI7dGhpcy5zdGFydFN5bWJvbD1mdW5jdGlvbihiKXtyZXR1cm4gYj8oYT1iLHRoaXMpOmF9O3RoaXMuZW5kU3ltYm9sPWZ1bmN0aW9uKGEpe3JldHVybiBhPyhiPWEsdGhpcyk6Yn07dGhpcy4kZ2V0PVsiJHBhcnNlIiwiJGV4Y2VwdGlvbkhhbmRsZXIiLCIkc2NlIixmdW5jdGlvbihkLGMsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm4iXFxcXFxcIithfWZ1bmN0aW9uIGcoYyl7cmV0dXJuIGMucmVwbGFjZShwLGEpLnJlcGxhY2UobixiKX1mdW5jdGlvbiBrKGEsYixjLGQpe3ZhciBlPWEuJHdhdGNoKGZ1bmN0aW9uKGEpe2UoKTtyZXR1cm4gZChhKX0sYixjKTtyZXR1cm4gZX0KICAgICAgICBmdW5jdGlvbiBoKGYsaCxuLHApe2Z1bmN0aW9uIHYoYSl7dHJ5e3JldHVybiBhPW4mJiFyP2UuZ2V0VHJ1c3RlZChuLGEpOmUudmFsdWVPZihhKSxwJiYhdyhhKT9hOmljKGEpfWNhdGNoKGIpe2MoTWEuaW50ZXJyKGYsYikpfX12YXIgcj1uPT09ZS5VUkx8fG49PT1lLk1FRElBX1VSTDtpZighZi5sZW5ndGh8fC0xPT09Zi5pbmRleE9mKGEpKXtpZihoKXJldHVybjtoPWcoZik7ciYmKGg9ZS5nZXRUcnVzdGVkKG4saCkpO2g9aWEoaCk7aC5leHA9ZjtoLmV4cHJlc3Npb25zPVtdO2guJCR3YXRjaERlbGVnYXRlPWs7cmV0dXJuIGh9cD0hIXA7Zm9yKHZhciBxLHksSj0wLEk9W10sUCxRPWYubGVuZ3RoLE09W10sTD1bXSx1O0o8UTspaWYoLTEhPT0ocT1mLmluZGV4T2YoYSxKKSkmJi0xIT09KHk9Zi5pbmRleE9mKGIscStsKSkpSiE9PXEmJk0ucHVzaChnKGYuc3Vic3RyaW5nKEoscSkpKSxKPWYuc3Vic3RyaW5nKHErbCx5KSxJLnB1c2goSiksSj15K20sTC5wdXNoKE0ubGVuZ3RoKSwKICAgICAgICAgICAgTS5wdXNoKCIiKTtlbHNle0ohPT1RJiZNLnB1c2goZyhmLnN1YnN0cmluZyhKKSkpO2JyZWFrfXU9MT09PU0ubGVuZ3RoJiYxPT09TC5sZW5ndGg7dmFyIFI9ciYmdT92b2lkIDA6djtQPUkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBkKGEsUil9KTtpZighaHx8SS5sZW5ndGgpe3ZhciB4PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9SS5sZW5ndGg7YjxjO2IrKyl7aWYocCYmeihhW2JdKSlyZXR1cm47TVtMW2JdXT1hW2JdfWlmKHIpcmV0dXJuIGUuZ2V0VHJ1c3RlZChuLHU/TVswXTpNLmpvaW4oIiIpKTtuJiYxPE0ubGVuZ3RoJiZNYS50aHJvd05vY29uY2F0KGYpO3JldHVybiBNLmpvaW4oIiIpfTtyZXR1cm4gUyhmdW5jdGlvbihhKXt2YXIgYj0wLGQ9SS5sZW5ndGgsZT1BcnJheShkKTt0cnl7Zm9yKDtiPGQ7YisrKWVbYl09UFtiXShhKTtyZXR1cm4geChlKX1jYXRjaChnKXtjKE1hLmludGVycihmLGcpKX19LHtleHA6ZixleHByZXNzaW9uczpJLCQkd2F0Y2hEZWxlZ2F0ZTpmdW5jdGlvbihhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIpe3ZhciBjO3JldHVybiBhLiR3YXRjaEdyb3VwKFAsZnVuY3Rpb24oZCxlKXt2YXIgZj14KGQpO2IuY2FsbCh0aGlzLGYsZCE9PWU/YzpmLGEpO2M9Zn0pfX0pfX12YXIgbD1hLmxlbmd0aCxtPWIubGVuZ3RoLHA9bmV3IFJlZ0V4cChhLnJlcGxhY2UoLy4vZyxmKSwiZyIpLG49bmV3IFJlZ0V4cChiLnJlcGxhY2UoLy4vZyxmKSwiZyIpO2guc3RhcnRTeW1ib2w9ZnVuY3Rpb24oKXtyZXR1cm4gYX07aC5lbmRTeW1ib2w9ZnVuY3Rpb24oKXtyZXR1cm4gYn07cmV0dXJuIGh9XX1mdW5jdGlvbiBMZigpe3RoaXMuJGdldD1bIiQkaW50ZXJ2YWxGYWN0b3J5IiwiJHdpbmRvdyIsZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxjPWZ1bmN0aW9uKGEpe2IuY2xlYXJJbnRlcnZhbChhKTtkZWxldGUgZFthXX0sZT1hKGZ1bmN0aW9uKGEsYyxlKXthPWIuc2V0SW50ZXJ2YWwoYSxjKTtkW2FdPWU7cmV0dXJuIGF9LGMpO2UuY2FuY2VsPWZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiExO2lmKCFhLmhhc093blByb3BlcnR5KCIkJGludGVydmFsSWQiKSl0aHJvdyBMZygiYmFkcHJvbSIpOwogICAgICAgIGlmKCFkLmhhc093blByb3BlcnR5KGEuJCRpbnRlcnZhbElkKSlyZXR1cm4hMTthPWEuJCRpbnRlcnZhbElkO3ZhciBiPWRbYV0sZT1iLnByb21pc2U7ZS4kJHN0YXRlJiYoZS4kJHN0YXRlLnB1cj0hMCk7Yi5yZWplY3QoImNhbmNlbGVkIik7YyhhKTtyZXR1cm4hMH07cmV0dXJuIGV9XX1mdW5jdGlvbiBNZigpe3RoaXMuJGdldD1bIiRicm93c2VyIiwiJHEiLCIkJHEiLCIkcm9vdFNjb3BlIixmdW5jdGlvbihhLGIsZCxjKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxrLGgsbCl7ZnVuY3Rpb24gbSgpe3A/Zy5hcHBseShudWxsLG4pOmcocyl9dmFyIHA9NDxhcmd1bWVudHMubGVuZ3RoLG49cD9IYS5jYWxsKGFyZ3VtZW50cyw0KTpbXSxzPTAsRz13KGwpJiYhbCx0PShHP2Q6YikuZGVmZXIoKSxyPXQucHJvbWlzZTtoPXcoaCk/aDowO3IuJCRpbnRlcnZhbElkPWUoZnVuY3Rpb24oKXtHP2EuZGVmZXIobSk6Yy4kZXZhbEFzeW5jKG0pO3Qubm90aWZ5KHMrKyk7CiAgICAgICAgMDxoJiZzPj1oJiYodC5yZXNvbHZlKHMpLGYoci4kJGludGVydmFsSWQpKTtHfHxjLiRhcHBseSgpfSxrLHQsRyk7cmV0dXJuIHJ9fX1dfWZ1bmN0aW9uIEFkKGEsYil7dmFyIGQ9Z2EoYSk7Yi4kJHByb3RvY29sPWQucHJvdG9jb2w7Yi4kJGhvc3Q9ZC5ob3N0bmFtZTtiLiQkcG9ydD1mYShkLnBvcnQpfHxNZ1tkLnByb3RvY29sXXx8bnVsbH1mdW5jdGlvbiBCZChhLGIsZCl7aWYoTmcudGVzdChhKSl0aHJvdyBqYigiYmFkcGF0aCIsYSk7dmFyIGM9Ii8iIT09YS5jaGFyQXQoMCk7YyYmKGE9Ii8iK2EpO2E9Z2EoYSk7Zm9yKHZhciBjPShjJiYiLyI9PT1hLnBhdGhuYW1lLmNoYXJBdCgwKT9hLnBhdGhuYW1lLnN1YnN0cmluZygxKTphLnBhdGhuYW1lKS5zcGxpdCgiLyIpLGU9Yy5sZW5ndGg7ZS0tOyljW2VdPWRlY29kZVVSSUNvbXBvbmVudChjW2VdKSxkJiYoY1tlXT1jW2VdLnJlcGxhY2UoL1wvL2csIiUyRiIpKTtkPWMuam9pbigiLyIpO2IuJCRwYXRoPWQ7Yi4kJHNlYXJjaD1nYyhhLnNlYXJjaCk7CiAgICAgICAgYi4kJGhhc2g9ZGVjb2RlVVJJQ29tcG9uZW50KGEuaGFzaCk7Yi4kJHBhdGgmJiIvIiE9PWIuJCRwYXRoLmNoYXJBdCgwKSYmKGIuJCRwYXRoPSIvIitiLiQkcGF0aCl9ZnVuY3Rpb24geGMoYSxiKXtyZXR1cm4gYS5zbGljZSgwLGIubGVuZ3RoKT09PWJ9ZnVuY3Rpb24geGEoYSxiKXtpZih4YyhiLGEpKXJldHVybiBiLnN1YnN0cihhLmxlbmd0aCl9ZnVuY3Rpb24gRGEoYSl7dmFyIGI9YS5pbmRleE9mKCIjIik7cmV0dXJuLTE9PT1iP2E6YS5zdWJzdHIoMCxiKX1mdW5jdGlvbiB5YyhhLGIsZCl7dGhpcy4kJGh0bWw1PSEwO2Q9ZHx8IiI7QWQoYSx0aGlzKTt0aGlzLiQkcGFyc2U9ZnVuY3Rpb24oYSl7dmFyIGQ9eGEoYixhKTtpZighQShkKSl0aHJvdyBqYigiaXB0aHByZngiLGEsYik7QmQoZCx0aGlzLCEwKTt0aGlzLiQkcGF0aHx8KHRoaXMuJCRwYXRoPSIvIik7dGhpcy4kJGNvbXBvc2UoKX07dGhpcy4kJG5vcm1hbGl6ZVVybD1mdW5jdGlvbihhKXtyZXR1cm4gYithLnN1YnN0cigxKX07CiAgICAgICAgdGhpcy4kJHBhcnNlTGlua1VybD1mdW5jdGlvbihjLGUpe2lmKGUmJiIjIj09PWVbMF0pcmV0dXJuIHRoaXMuaGFzaChlLnNsaWNlKDEpKSwhMDt2YXIgZixnO3coZj14YShhLGMpKT8oZz1mLGc9ZCYmdyhmPXhhKGQsZikpP2IrKHhhKCIvIixmKXx8Zik6YStnKTp3KGY9eGEoYixjKSk/Zz1iK2Y6Yj09PWMrIi8iJiYoZz1iKTtnJiZ0aGlzLiQkcGFyc2UoZyk7cmV0dXJuISFnfX1mdW5jdGlvbiB6YyhhLGIsZCl7QWQoYSx0aGlzKTt0aGlzLiQkcGFyc2U9ZnVuY3Rpb24oYyl7dmFyIGU9eGEoYSxjKXx8eGEoYixjKSxmO3ooZSl8fCIjIiE9PWUuY2hhckF0KDApP3RoaXMuJCRodG1sNT9mPWU6KGY9IiIseihlKSYmKGE9Yyx0aGlzLnJlcGxhY2UoKSkpOihmPXhhKGQsZSkseihmKSYmKGY9ZSkpO0JkKGYsdGhpcywhMSk7Yz10aGlzLiQkcGF0aDt2YXIgZT1hLGc9L15cL1tBLVpdOihcLy4qKS87eGMoZixlKSYmKGY9Zi5yZXBsYWNlKGUsIiIpKTtnLmV4ZWMoZil8fChjPShmPWcuZXhlYyhjKSk/CiAgICAgICAgZlsxXTpjKTt0aGlzLiQkcGF0aD1jO3RoaXMuJCRjb21wb3NlKCl9O3RoaXMuJCRub3JtYWxpemVVcmw9ZnVuY3Rpb24oYil7cmV0dXJuIGErKGI/ZCtiOiIiKX07dGhpcy4kJHBhcnNlTGlua1VybD1mdW5jdGlvbihiLGQpe3JldHVybiBEYShhKT09PURhKGIpPyh0aGlzLiQkcGFyc2UoYiksITApOiExfX1mdW5jdGlvbiBDZChhLGIsZCl7dGhpcy4kJGh0bWw1PSEwO3pjLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLiQkcGFyc2VMaW5rVXJsPWZ1bmN0aW9uKGMsZSl7aWYoZSYmIiMiPT09ZVswXSlyZXR1cm4gdGhpcy5oYXNoKGUuc2xpY2UoMSkpLCEwO3ZhciBmLGc7YT09PURhKGMpP2Y9YzooZz14YShiLGMpKT9mPWErZCtnOmI9PT1jKyIvIiYmKGY9Yik7ZiYmdGhpcy4kJHBhcnNlKGYpO3JldHVybiEhZn07dGhpcy4kJG5vcm1hbGl6ZVVybD1mdW5jdGlvbihiKXtyZXR1cm4gYStkK2J9fWZ1bmN0aW9uIExiKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzW2FdfX1mdW5jdGlvbiBEZChhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYil7cmV0dXJuIGZ1bmN0aW9uKGQpe2lmKHooZCkpcmV0dXJuIHRoaXNbYV07dGhpc1thXT1iKGQpO3RoaXMuJCRjb21wb3NlKCk7cmV0dXJuIHRoaXN9fWZ1bmN0aW9uIFRmKCl7dmFyIGE9IiEiLGI9e2VuYWJsZWQ6ITEscmVxdWlyZUJhc2U6ITAscmV3cml0ZUxpbmtzOiEwfTt0aGlzLmhhc2hQcmVmaXg9ZnVuY3Rpb24oYil7cmV0dXJuIHcoYik/KGE9Yix0aGlzKTphfTt0aGlzLmh0bWw1TW9kZT1mdW5jdGlvbihhKXtpZihHYShhKSlyZXR1cm4gYi5lbmFibGVkPWEsdGhpcztpZihEKGEpKXtHYShhLmVuYWJsZWQpJiYoYi5lbmFibGVkPWEuZW5hYmxlZCk7R2EoYS5yZXF1aXJlQmFzZSkmJihiLnJlcXVpcmVCYXNlPWEucmVxdWlyZUJhc2UpO2lmKEdhKGEucmV3cml0ZUxpbmtzKXx8QShhLnJld3JpdGVMaW5rcykpYi5yZXdyaXRlTGlua3M9YS5yZXdyaXRlTGlua3M7cmV0dXJuIHRoaXN9cmV0dXJuIGJ9O3RoaXMuJGdldD1bIiRyb290U2NvcGUiLCIkYnJvd3NlciIsIiRzbmlmZmVyIiwKICAgICAgICAiJHJvb3RFbGVtZW50IiwiJHdpbmRvdyIsZnVuY3Rpb24oZCxjLGUsZixnKXtmdW5jdGlvbiBrKGEsYil7cmV0dXJuIGE9PT1ifHxnYShhKS5ocmVmPT09Z2EoYikuaHJlZn1mdW5jdGlvbiBoKGEsYixkKXt2YXIgZT1tLnVybCgpLGY9bS4kJHN0YXRlO3RyeXtjLnVybChhLGIsZCksbS4kJHN0YXRlPWMuc3RhdGUoKX1jYXRjaChnKXt0aHJvdyBtLnVybChlKSxtLiQkc3RhdGU9ZixnO319ZnVuY3Rpb24gbChhLGIpe2QuJGJyb2FkY2FzdCgiJGxvY2F0aW9uQ2hhbmdlU3VjY2VzcyIsbS5hYnNVcmwoKSxhLG0uJCRzdGF0ZSxiKX12YXIgbSxwO3A9Yy5iYXNlSHJlZigpO3ZhciBuPWMudXJsKCkscztpZihiLmVuYWJsZWQpe2lmKCFwJiZiLnJlcXVpcmVCYXNlKXRocm93IGpiKCJub2Jhc2UiKTtzPW4uc3Vic3RyaW5nKDAsbi5pbmRleE9mKCIvIixuLmluZGV4T2YoIi8vIikrMikpKyhwfHwiLyIpO3A9ZS5oaXN0b3J5P3ljOkNkfWVsc2Ugcz1EYShuKSxwPXpjO3ZhciByPXMuc3Vic3RyKDAsCiAgICAgICAgICAgIERhKHMpLmxhc3RJbmRleE9mKCIvIikrMSk7bT1uZXcgcChzLHIsIiMiK2EpO20uJCRwYXJzZUxpbmtVcmwobixuKTttLiQkc3RhdGU9Yy5zdGF0ZSgpO3ZhciB0PS9eXHMqKGphdmFzY3JpcHR8bWFpbHRvKTovaTtmLm9uKCJjbGljayIsZnVuY3Rpb24oYSl7dmFyIGU9Yi5yZXdyaXRlTGlua3M7aWYoZSYmIWEuY3RybEtleSYmIWEubWV0YUtleSYmIWEuc2hpZnRLZXkmJjIhPT1hLndoaWNoJiYyIT09YS5idXR0b24pe2Zvcih2YXIgZz14KGEudGFyZ2V0KTsiYSIhPT11YShnWzBdKTspaWYoZ1swXT09PWZbMF18fCEoZz1nLnBhcmVudCgpKVswXSlyZXR1cm47aWYoIUEoZSl8fCF6KGcuYXR0cihlKSkpe3ZhciBlPWcucHJvcCgiaHJlZiIpLGg9Zy5hdHRyKCJocmVmIil8fGcuYXR0cigieGxpbms6aHJlZiIpO0QoZSkmJiJbb2JqZWN0IFNWR0FuaW1hdGVkU3RyaW5nXSI9PT1lLnRvU3RyaW5nKCkmJihlPWdhKGUuYW5pbVZhbCkuaHJlZik7dC50ZXN0KGUpfHwhZXx8Zy5hdHRyKCJ0YXJnZXQiKXx8CiAgICAgICAgYS5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8IW0uJCRwYXJzZUxpbmtVcmwoZSxoKXx8KGEucHJldmVudERlZmF1bHQoKSxtLmFic1VybCgpIT09Yy51cmwoKSYmZC4kYXBwbHkoKSl9fX0pO20uYWJzVXJsKCkhPT1uJiZjLnVybChtLmFic1VybCgpLCEwKTt2YXIgTj0hMDtjLm9uVXJsQ2hhbmdlKGZ1bmN0aW9uKGEsYil7eGMoYSxyKT8oZC4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7dmFyIGM9bS5hYnNVcmwoKSxlPW0uJCRzdGF0ZSxmO20uJCRwYXJzZShhKTttLiQkc3RhdGU9YjtmPWQuJGJyb2FkY2FzdCgiJGxvY2F0aW9uQ2hhbmdlU3RhcnQiLGEsYyxiLGUpLmRlZmF1bHRQcmV2ZW50ZWQ7bS5hYnNVcmwoKT09PWEmJihmPyhtLiQkcGFyc2UoYyksbS4kJHN0YXRlPWUsaChjLCExLGUpKTooTj0hMSxsKGMsZSkpKX0pLGQuJCRwaGFzZXx8ZC4kZGlnZXN0KCkpOmcubG9jYXRpb24uaHJlZj1hfSk7ZC4kd2F0Y2goZnVuY3Rpb24oKXtpZihOfHxtLiQkdXJsVXBkYXRlZEJ5TG9jYXRpb24pe20uJCR1cmxVcGRhdGVkQnlMb2NhdGlvbj0KICAgICAgICAgICAgITE7dmFyIGE9Yy51cmwoKSxiPW0uYWJzVXJsKCksZj1jLnN0YXRlKCksZz1tLiQkcmVwbGFjZSxuPSFrKGEsYil8fG0uJCRodG1sNSYmZS5oaXN0b3J5JiZmIT09bS4kJHN0YXRlO2lmKE58fG4pTj0hMSxkLiRldmFsQXN5bmMoZnVuY3Rpb24oKXt2YXIgYj1tLmFic1VybCgpLGM9ZC4kYnJvYWRjYXN0KCIkbG9jYXRpb25DaGFuZ2VTdGFydCIsYixhLG0uJCRzdGF0ZSxmKS5kZWZhdWx0UHJldmVudGVkO20uYWJzVXJsKCk9PT1iJiYoYz8obS4kJHBhcnNlKGEpLG0uJCRzdGF0ZT1mKToobiYmaChiLGcsZj09PW0uJCRzdGF0ZT9udWxsOm0uJCRzdGF0ZSksbChhLGYpKSl9KX1tLiQkcmVwbGFjZT0hMX0pO3JldHVybiBtfV19ZnVuY3Rpb24gVWYoKXt2YXIgYT0hMCxiPXRoaXM7dGhpcy5kZWJ1Z0VuYWJsZWQ9ZnVuY3Rpb24oYil7cmV0dXJuIHcoYik/KGE9Yix0aGlzKTphfTt0aGlzLiRnZXQ9WyIkd2luZG93IixmdW5jdGlvbihkKXtmdW5jdGlvbiBjKGEpe2NjKGEpJiYoYS5zdGFjayYmCiAgICBmP2E9YS5tZXNzYWdlJiYtMT09PWEuc3RhY2suaW5kZXhPZihhLm1lc3NhZ2UpPyJFcnJvcjogIithLm1lc3NhZ2UrIlxuIithLnN0YWNrOmEuc3RhY2s6YS5zb3VyY2VVUkwmJihhPWEubWVzc2FnZSsiXG4iK2Euc291cmNlVVJMKyI6IithLmxpbmUpKTtyZXR1cm4gYX1mdW5jdGlvbiBlKGEpe3ZhciBiPWQuY29uc29sZXx8e30sZT1iW2FdfHxiLmxvZ3x8RTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1bXTtyKGFyZ3VtZW50cyxmdW5jdGlvbihiKXthLnB1c2goYyhiKSl9KTtyZXR1cm4gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoZSxiLGEpfX12YXIgZj1DYXx8L1xiRWRnZVwvLy50ZXN0KGQubmF2aWdhdG9yJiZkLm5hdmlnYXRvci51c2VyQWdlbnQpO3JldHVybntsb2c6ZSgibG9nIiksaW5mbzplKCJpbmZvIiksd2FybjplKCJ3YXJuIiksZXJyb3I6ZSgiZXJyb3IiKSxkZWJ1ZzpmdW5jdGlvbigpe3ZhciBjPWUoImRlYnVnIik7cmV0dXJuIGZ1bmN0aW9uKCl7YSYmYy5hcHBseShiLAogICAgICAgICAgICBhcmd1bWVudHMpfX0oKX19XX1mdW5jdGlvbiBPZyhhKXtyZXR1cm4gYSsiIn1mdW5jdGlvbiBQZyhhLGIpe3JldHVybiJ1bmRlZmluZWQiIT09dHlwZW9mIGE/YTpifWZ1bmN0aW9uIEVkKGEsYil7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYT9iOiJ1bmRlZmluZWQiPT09dHlwZW9mIGI/YTphK2J9ZnVuY3Rpb24gUWcoYSxiKXtzd2l0Y2goYS50eXBlKXtjYXNlIHEuTWVtYmVyRXhwcmVzc2lvbjppZihhLmNvbXB1dGVkKXJldHVybiExO2JyZWFrO2Nhc2UgcS5VbmFyeUV4cHJlc3Npb246cmV0dXJuIDE7Y2FzZSBxLkJpbmFyeUV4cHJlc3Npb246cmV0dXJuIisiIT09YS5vcGVyYXRvcj8xOiExO2Nhc2UgcS5DYWxsRXhwcmVzc2lvbjpyZXR1cm4hMX1yZXR1cm4gdm9pZCAwPT09Yj9GZDpifWZ1bmN0aW9uIFooYSxiLGQpe3ZhciBjLGUsZj1hLmlzUHVyZT1RZyhhLGQpO3N3aXRjaChhLnR5cGUpe2Nhc2UgcS5Qcm9ncmFtOmM9ITA7cihhLmJvZHksZnVuY3Rpb24oYSl7WihhLmV4cHJlc3Npb24sCiAgICAgICAgYixmKTtjPWMmJmEuZXhwcmVzc2lvbi5jb25zdGFudH0pO2EuY29uc3RhbnQ9YzticmVhaztjYXNlIHEuTGl0ZXJhbDphLmNvbnN0YW50PSEwO2EudG9XYXRjaD1bXTticmVhaztjYXNlIHEuVW5hcnlFeHByZXNzaW9uOlooYS5hcmd1bWVudCxiLGYpO2EuY29uc3RhbnQ9YS5hcmd1bWVudC5jb25zdGFudDthLnRvV2F0Y2g9YS5hcmd1bWVudC50b1dhdGNoO2JyZWFrO2Nhc2UgcS5CaW5hcnlFeHByZXNzaW9uOlooYS5sZWZ0LGIsZik7WihhLnJpZ2h0LGIsZik7YS5jb25zdGFudD1hLmxlZnQuY29uc3RhbnQmJmEucmlnaHQuY29uc3RhbnQ7YS50b1dhdGNoPWEubGVmdC50b1dhdGNoLmNvbmNhdChhLnJpZ2h0LnRvV2F0Y2gpO2JyZWFrO2Nhc2UgcS5Mb2dpY2FsRXhwcmVzc2lvbjpaKGEubGVmdCxiLGYpO1ooYS5yaWdodCxiLGYpO2EuY29uc3RhbnQ9YS5sZWZ0LmNvbnN0YW50JiZhLnJpZ2h0LmNvbnN0YW50O2EudG9XYXRjaD1hLmNvbnN0YW50P1tdOlthXTticmVhaztjYXNlIHEuQ29uZGl0aW9uYWxFeHByZXNzaW9uOlooYS50ZXN0LAogICAgICAgIGIsZik7WihhLmFsdGVybmF0ZSxiLGYpO1ooYS5jb25zZXF1ZW50LGIsZik7YS5jb25zdGFudD1hLnRlc3QuY29uc3RhbnQmJmEuYWx0ZXJuYXRlLmNvbnN0YW50JiZhLmNvbnNlcXVlbnQuY29uc3RhbnQ7YS50b1dhdGNoPWEuY29uc3RhbnQ/W106W2FdO2JyZWFrO2Nhc2UgcS5JZGVudGlmaWVyOmEuY29uc3RhbnQ9ITE7YS50b1dhdGNoPVthXTticmVhaztjYXNlIHEuTWVtYmVyRXhwcmVzc2lvbjpaKGEub2JqZWN0LGIsZik7YS5jb21wdXRlZCYmWihhLnByb3BlcnR5LGIsZik7YS5jb25zdGFudD1hLm9iamVjdC5jb25zdGFudCYmKCFhLmNvbXB1dGVkfHxhLnByb3BlcnR5LmNvbnN0YW50KTthLnRvV2F0Y2g9YS5jb25zdGFudD9bXTpbYV07YnJlYWs7Y2FzZSBxLkNhbGxFeHByZXNzaW9uOmM9ZD1hLmZpbHRlcj8hYihhLmNhbGxlZS5uYW1lKS4kc3RhdGVmdWw6ITE7ZT1bXTtyKGEuYXJndW1lbnRzLGZ1bmN0aW9uKGEpe1ooYSxiLGYpO2M9YyYmYS5jb25zdGFudDtlLnB1c2guYXBwbHkoZSwKICAgICAgICBhLnRvV2F0Y2gpfSk7YS5jb25zdGFudD1jO2EudG9XYXRjaD1kP2U6W2FdO2JyZWFrO2Nhc2UgcS5Bc3NpZ25tZW50RXhwcmVzc2lvbjpaKGEubGVmdCxiLGYpO1ooYS5yaWdodCxiLGYpO2EuY29uc3RhbnQ9YS5sZWZ0LmNvbnN0YW50JiZhLnJpZ2h0LmNvbnN0YW50O2EudG9XYXRjaD1bYV07YnJlYWs7Y2FzZSBxLkFycmF5RXhwcmVzc2lvbjpjPSEwO2U9W107cihhLmVsZW1lbnRzLGZ1bmN0aW9uKGEpe1ooYSxiLGYpO2M9YyYmYS5jb25zdGFudDtlLnB1c2guYXBwbHkoZSxhLnRvV2F0Y2gpfSk7YS5jb25zdGFudD1jO2EudG9XYXRjaD1lO2JyZWFrO2Nhc2UgcS5PYmplY3RFeHByZXNzaW9uOmM9ITA7ZT1bXTtyKGEucHJvcGVydGllcyxmdW5jdGlvbihhKXtaKGEudmFsdWUsYixmKTtjPWMmJmEudmFsdWUuY29uc3RhbnQ7ZS5wdXNoLmFwcGx5KGUsYS52YWx1ZS50b1dhdGNoKTthLmNvbXB1dGVkJiYoWihhLmtleSxiLCExKSxjPWMmJmEua2V5LmNvbnN0YW50LGUucHVzaC5hcHBseShlLAogICAgICAgIGEua2V5LnRvV2F0Y2gpKX0pO2EuY29uc3RhbnQ9YzthLnRvV2F0Y2g9ZTticmVhaztjYXNlIHEuVGhpc0V4cHJlc3Npb246YS5jb25zdGFudD0hMTthLnRvV2F0Y2g9W107YnJlYWs7Y2FzZSBxLkxvY2Fsc0V4cHJlc3Npb246YS5jb25zdGFudD0hMSxhLnRvV2F0Y2g9W119fWZ1bmN0aW9uIEdkKGEpe2lmKDE9PT1hLmxlbmd0aCl7YT1hWzBdLmV4cHJlc3Npb247dmFyIGI9YS50b1dhdGNoO3JldHVybiAxIT09Yi5sZW5ndGg/YjpiWzBdIT09YT9iOnZvaWQgMH19ZnVuY3Rpb24gSGQoYSl7cmV0dXJuIGEudHlwZT09PXEuSWRlbnRpZmllcnx8YS50eXBlPT09cS5NZW1iZXJFeHByZXNzaW9ufWZ1bmN0aW9uIElkKGEpe2lmKDE9PT1hLmJvZHkubGVuZ3RoJiZIZChhLmJvZHlbMF0uZXhwcmVzc2lvbikpcmV0dXJue3R5cGU6cS5Bc3NpZ25tZW50RXhwcmVzc2lvbixsZWZ0OmEuYm9keVswXS5leHByZXNzaW9uLHJpZ2h0Ont0eXBlOnEuTkdWYWx1ZVBhcmFtZXRlcn0sb3BlcmF0b3I6Ij0ifX0KICAgIGZ1bmN0aW9uIEpkKGEpe3RoaXMuJGZpbHRlcj1hfWZ1bmN0aW9uIEtkKGEpe3RoaXMuJGZpbHRlcj1hfWZ1bmN0aW9uIE1iKGEsYixkKXt0aGlzLmFzdD1uZXcgcShhLGQpO3RoaXMuYXN0Q29tcGlsZXI9ZC5jc3A/bmV3IEtkKGIpOm5ldyBKZChiKX1mdW5jdGlvbiBBYyhhKXtyZXR1cm4gQihhLnZhbHVlT2YpP2EudmFsdWVPZigpOlJnLmNhbGwoYSl9ZnVuY3Rpb24gVmYoKXt2YXIgYT1UKCksYj17InRydWUiOiEwLCJmYWxzZSI6ITEsIm51bGwiOm51bGwsdW5kZWZpbmVkOnZvaWQgMH0sZCxjO3RoaXMuYWRkTGl0ZXJhbD1mdW5jdGlvbihhLGMpe2JbYV09Y307dGhpcy5zZXRJZGVudGlmaWVyRm5zPWZ1bmN0aW9uKGEsYil7ZD1hO2M9YjtyZXR1cm4gdGhpc307dGhpcy4kZ2V0PVsiJGZpbHRlciIsZnVuY3Rpb24oZSl7ZnVuY3Rpb24gZihiLGMpe3ZhciBkLGY7c3dpdGNoKHR5cGVvZiBiKXtjYXNlICJzdHJpbmciOnJldHVybiBmPWI9Yi50cmltKCksZD1hW2ZdLGR8fChkPW5ldyBOYihHKSwKICAgICAgICBkPShuZXcgTWIoZCxlLEcpKS5wYXJzZShiKSxhW2ZdPXAoZCkpLHMoZCxjKTtjYXNlICJmdW5jdGlvbiI6cmV0dXJuIHMoYixjKTtkZWZhdWx0OnJldHVybiBzKEUsYyl9fWZ1bmN0aW9uIGcoYSxiLGMpe3JldHVybiBudWxsPT1hfHxudWxsPT1iP2E9PT1iOiJvYmplY3QiIT09dHlwZW9mIGF8fChhPUFjKGEpLCJvYmplY3QiIT09dHlwZW9mIGF8fGMpP2E9PT1ifHxhIT09YSYmYiE9PWI6ITF9ZnVuY3Rpb24gayhhLGIsYyxkLGUpe3ZhciBmPWQuaW5wdXRzLGg7aWYoMT09PWYubGVuZ3RoKXt2YXIgaz1nLGY9ZlswXTtyZXR1cm4gYS4kd2F0Y2goZnVuY3Rpb24oYSl7dmFyIGI9ZihhKTtnKGIsayxmLmlzUHVyZSl8fChoPWQoYSx2b2lkIDAsdm9pZCAwLFtiXSksaz1iJiZBYyhiKSk7cmV0dXJuIGh9LGIsYyxlKX1mb3IodmFyIGw9W10sbT1bXSxuPTAscD1mLmxlbmd0aDtuPHA7bisrKWxbbl09ZyxtW25dPW51bGw7cmV0dXJuIGEuJHdhdGNoKGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0KICAgICAgICAhMSxjPTAsZT1mLmxlbmd0aDtjPGU7YysrKXt2YXIgaz1mW2NdKGEpO2lmKGJ8fChiPSFnKGssbFtjXSxmW2NdLmlzUHVyZSkpKW1bY109ayxsW2NdPWsmJkFjKGspfWImJihoPWQoYSx2b2lkIDAsdm9pZCAwLG0pKTtyZXR1cm4gaH0sYixjLGUpfWZ1bmN0aW9uIGgoYSxiLGMsZCxlKXtmdW5jdGlvbiBmKCl7aChtKSYmaygpfWZ1bmN0aW9uIGcoYSxiLGMsZCl7bT11JiZkP2RbMF06bihhLGIsYyxkKTtoKG0pJiZhLiQkcG9zdERpZ2VzdChmKTtyZXR1cm4gcyhtKX12YXIgaD1kLmxpdGVyYWw/bDp3LGssbSxuPWQuJCRpbnRlcmNlcHRlZHx8ZCxzPWQuJCRpbnRlcmNlcHRvcnx8VGEsdT1kLmlucHV0cyYmIW4uaW5wdXRzO2cubGl0ZXJhbD1kLmxpdGVyYWw7Zy5jb25zdGFudD1kLmNvbnN0YW50O2cuaW5wdXRzPWQuaW5wdXRzO3AoZyk7cmV0dXJuIGs9YS4kd2F0Y2goZyxiLGMsZSl9ZnVuY3Rpb24gbChhKXt2YXIgYj0hMDtyKGEsZnVuY3Rpb24oYSl7dyhhKXx8KGI9ITEpfSk7cmV0dXJuIGJ9CiAgICAgICAgZnVuY3Rpb24gbShhLGIsYyxkKXt2YXIgZT1hLiR3YXRjaChmdW5jdGlvbihhKXtlKCk7cmV0dXJuIGQoYSl9LGIsYyk7cmV0dXJuIGV9ZnVuY3Rpb24gcChhKXthLmNvbnN0YW50P2EuJCR3YXRjaERlbGVnYXRlPW06YS5vbmVUaW1lP2EuJCR3YXRjaERlbGVnYXRlPWg6YS5pbnB1dHMmJihhLiQkd2F0Y2hEZWxlZ2F0ZT1rKTtyZXR1cm4gYX1mdW5jdGlvbiBuKGEsYil7ZnVuY3Rpb24gYyhkKXtyZXR1cm4gYihhKGQpKX1jLiRzdGF0ZWZ1bD1hLiRzdGF0ZWZ1bHx8Yi4kc3RhdGVmdWw7Yy4kJHB1cmU9YS4kJHB1cmUmJmIuJCRwdXJlO3JldHVybiBjfWZ1bmN0aW9uIHMoYSxiKXtpZighYilyZXR1cm4gYTthLiQkaW50ZXJjZXB0b3ImJihiPW4oYS4kJGludGVyY2VwdG9yLGIpLGE9YS4kJGludGVyY2VwdGVkKTt2YXIgYz0hMSxkPWZ1bmN0aW9uKGQsZSxmLGcpe2Q9YyYmZz9nWzBdOmEoZCxlLGYsZyk7cmV0dXJuIGIoZCl9O2QuJCRpbnRlcmNlcHRlZD1hO2QuJCRpbnRlcmNlcHRvcj0KICAgICAgICAgICAgYjtkLmxpdGVyYWw9YS5saXRlcmFsO2Qub25lVGltZT1hLm9uZVRpbWU7ZC5jb25zdGFudD1hLmNvbnN0YW50O2IuJHN0YXRlZnVsfHwoYz0hYS5pbnB1dHMsZC5pbnB1dHM9YS5pbnB1dHM/YS5pbnB1dHM6W2FdLGIuJCRwdXJlfHwoZC5pbnB1dHM9ZC5pbnB1dHMubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUHVyZT09PUZkP2Z1bmN0aW9uKGIpe3JldHVybiBhKGIpfTphfSkpKTtyZXR1cm4gcChkKX12YXIgRz17Y3NwOkFhKCkubm9VbnNhZmVFdmFsLGxpdGVyYWxzOklhKGIpLGlzSWRlbnRpZmllclN0YXJ0OkIoZCkmJmQsaXNJZGVudGlmaWVyQ29udGludWU6QihjKSYmY307Zi4kJGdldEFzdD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgTmIoRyk7cmV0dXJuKG5ldyBNYihiLGUsRykpLmdldEFzdChhKS5hc3R9O3JldHVybiBmfV19ZnVuY3Rpb24gWGYoKXt2YXIgYT0hMDt0aGlzLiRnZXQ9WyIkcm9vdFNjb3BlIiwiJGV4Y2VwdGlvbkhhbmRsZXIiLGZ1bmN0aW9uKGIsZCl7cmV0dXJuIExkKGZ1bmN0aW9uKGEpe2IuJGV2YWxBc3luYyhhKX0sCiAgICAgICAgZCxhKX1dO3RoaXMuZXJyb3JPblVuaGFuZGxlZFJlamVjdGlvbnM9ZnVuY3Rpb24oYil7cmV0dXJuIHcoYik/KGE9Yix0aGlzKTphfX1mdW5jdGlvbiBZZigpe3ZhciBhPSEwO3RoaXMuJGdldD1bIiRicm93c2VyIiwiJGV4Y2VwdGlvbkhhbmRsZXIiLGZ1bmN0aW9uKGIsZCl7cmV0dXJuIExkKGZ1bmN0aW9uKGEpe2IuZGVmZXIoYSl9LGQsYSl9XTt0aGlzLmVycm9yT25VbmhhbmRsZWRSZWplY3Rpb25zPWZ1bmN0aW9uKGIpe3JldHVybiB3KGIpPyhhPWIsdGhpcyk6YX19ZnVuY3Rpb24gTGQoYSxiLGQpe2Z1bmN0aW9uIGMoKXtyZXR1cm4gbmV3IGV9ZnVuY3Rpb24gZSgpe3ZhciBhPXRoaXMucHJvbWlzZT1uZXcgZjt0aGlzLnJlc29sdmU9ZnVuY3Rpb24oYil7aChhLGIpfTt0aGlzLnJlamVjdD1mdW5jdGlvbihiKXttKGEsYil9O3RoaXMubm90aWZ5PWZ1bmN0aW9uKGIpe24oYSxiKX19ZnVuY3Rpb24gZigpe3RoaXMuJCRzdGF0ZT17c3RhdHVzOjB9fWZ1bmN0aW9uIGcoKXtmb3IoOyF3JiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5sZW5ndGg7KXt2YXIgYT14LnNoaWZ0KCk7aWYoIWEucHVyKXthLnB1cj0hMDt2YXIgYz1hLnZhbHVlLGM9IlBvc3NpYmx5IHVuaGFuZGxlZCByZWplY3Rpb246ICIrKCJmdW5jdGlvbiI9PT10eXBlb2YgYz9jLnRvU3RyaW5nKCkucmVwbGFjZSgvIFx7W1xzXFNdKiQvLCIiKTp6KGMpPyJ1bmRlZmluZWQiOiJzdHJpbmciIT09dHlwZW9mIGM/SWUoYyx2b2lkIDApOmMpO2NjKGEudmFsdWUpP2IoYS52YWx1ZSxjKTpiKGMpfX19ZnVuY3Rpb24gayhjKXshZHx8Yy5wZW5kaW5nfHwyIT09Yy5zdGF0dXN8fGMucHVyfHwoMD09PXcmJjA9PT14Lmxlbmd0aCYmYShnKSx4LnB1c2goYykpOyFjLnByb2Nlc3NTY2hlZHVsZWQmJmMucGVuZGluZyYmKGMucHJvY2Vzc1NjaGVkdWxlZD0hMCwrK3csYShmdW5jdGlvbigpe3ZhciBlLGYsaztrPWMucGVuZGluZztjLnByb2Nlc3NTY2hlZHVsZWQ9ITE7Yy5wZW5kaW5nPXZvaWQgMDt0cnl7Zm9yKHZhciBsPTAsbj1rLmxlbmd0aDtsPG47KytsKXtjLnB1cj0KICAgICAgICAhMDtmPWtbbF1bMF07ZT1rW2xdW2Muc3RhdHVzXTt0cnl7QihlKT9oKGYsZShjLnZhbHVlKSk6MT09PWMuc3RhdHVzP2goZixjLnZhbHVlKTptKGYsYy52YWx1ZSl9Y2F0Y2gocCl7bShmLHApLHAmJiEwPT09cC4kJHBhc3NUb0V4Y2VwdGlvbkhhbmRsZXImJmIocCl9fX1maW5hbGx5ey0tdyxkJiYwPT09dyYmYShnKX19KSl9ZnVuY3Rpb24gaChhLGIpe2EuJCRzdGF0ZS5zdGF0dXN8fChiPT09YT9wKGEsdigicWN5Y2xlIixiKSk6bChhLGIpKX1mdW5jdGlvbiBsKGEsYil7ZnVuY3Rpb24gYyhiKXtnfHwoZz0hMCxsKGEsYikpfWZ1bmN0aW9uIGQoYil7Z3x8KGc9ITAscChhLGIpKX1mdW5jdGlvbiBlKGIpe24oYSxiKX12YXIgZixnPSExO3RyeXtpZihEKGIpfHxCKGIpKWY9Yi50aGVuO0IoZik/KGEuJCRzdGF0ZS5zdGF0dXM9LTEsZi5jYWxsKGIsYyxkLGUpKTooYS4kJHN0YXRlLnZhbHVlPWIsYS4kJHN0YXRlLnN0YXR1cz0xLGsoYS4kJHN0YXRlKSl9Y2F0Y2goaCl7ZChoKX19ZnVuY3Rpb24gbShhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIpe2EuJCRzdGF0ZS5zdGF0dXN8fHAoYSxiKX1mdW5jdGlvbiBwKGEsYil7YS4kJHN0YXRlLnZhbHVlPWI7YS4kJHN0YXRlLnN0YXR1cz0yO2soYS4kJHN0YXRlKX1mdW5jdGlvbiBuKGMsZCl7dmFyIGU9Yy4kJHN0YXRlLnBlbmRpbmc7MD49Yy4kJHN0YXRlLnN0YXR1cyYmZSYmZS5sZW5ndGgmJmEoZnVuY3Rpb24oKXtmb3IodmFyIGEsYyxmPTAsZz1lLmxlbmd0aDtmPGc7ZisrKXtjPWVbZl1bMF07YT1lW2ZdWzNdO3RyeXtuKGMsQihhKT9hKGQpOmQpfWNhdGNoKGgpe2IoaCl9fX0pfWZ1bmN0aW9uIHMoYSl7dmFyIGI9bmV3IGY7bShiLGEpO3JldHVybiBifWZ1bmN0aW9uIEcoYSxiLGMpe3ZhciBkPW51bGw7dHJ5e0IoYykmJihkPWMoKSl9Y2F0Y2goZSl7cmV0dXJuIHMoZSl9cmV0dXJuIGQmJkIoZC50aGVuKT9kLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gYihhKX0scyk6YihhKX1mdW5jdGlvbiB0KGEsYixjLGQpe3ZhciBlPW5ldyBmO2goZSxhKTtyZXR1cm4gZS50aGVuKGIsYywKICAgICAgICBkKX1mdW5jdGlvbiBxKGEpe2lmKCFCKGEpKXRocm93IHYoIm5vcnNsdnIiLGEpO3ZhciBiPW5ldyBmO2EoZnVuY3Rpb24oYSl7aChiLGEpfSxmdW5jdGlvbihhKXttKGIsYSl9KTtyZXR1cm4gYn12YXIgdj1GKCIkcSIsVHlwZUVycm9yKSx3PTAseD1bXTtTKGYucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uKGEsYixjKXtpZih6KGEpJiZ6KGIpJiZ6KGMpKXJldHVybiB0aGlzO3ZhciBkPW5ldyBmO3RoaXMuJCRzdGF0ZS5wZW5kaW5nPXRoaXMuJCRzdGF0ZS5wZW5kaW5nfHxbXTt0aGlzLiQkc3RhdGUucGVuZGluZy5wdXNoKFtkLGEsYixjXSk7MDx0aGlzLiQkc3RhdGUuc3RhdHVzJiZrKHRoaXMuJCRzdGF0ZSk7cmV0dXJuIGR9LCJjYXRjaCI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudGhlbihudWxsLGEpfSwiZmluYWxseSI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGIpe3JldHVybiBHKGIseSxhKX0sZnVuY3Rpb24oYil7cmV0dXJuIEcoYixzLGEpfSwKICAgICAgICAgICAgYil9fSk7dmFyIHk9dDtxLnByb3RvdHlwZT1mLnByb3RvdHlwZTtxLmRlZmVyPWM7cS5yZWplY3Q9cztxLndoZW49dDtxLnJlc29sdmU9eTtxLmFsbD1mdW5jdGlvbihhKXt2YXIgYj1uZXcgZixjPTAsZD1IKGEpP1tdOnt9O3IoYSxmdW5jdGlvbihhLGUpe2MrKzt0KGEpLnRoZW4oZnVuY3Rpb24oYSl7ZFtlXT1hOy0tY3x8aChiLGQpfSxmdW5jdGlvbihhKXttKGIsYSl9KX0pOzA9PT1jJiZoKGIsZCk7cmV0dXJuIGJ9O3EucmFjZT1mdW5jdGlvbihhKXt2YXIgYj1jKCk7cihhLGZ1bmN0aW9uKGEpe3QoYSkudGhlbihiLnJlc29sdmUsYi5yZWplY3QpfSk7cmV0dXJuIGIucHJvbWlzZX07cmV0dXJuIHF9ZnVuY3Rpb24gaGcoKXt0aGlzLiRnZXQ9WyIkd2luZG93IiwiJHRpbWVvdXQiLGZ1bmN0aW9uKGEsYil7dmFyIGQ9YS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGEud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lLGM9YS5jYW5jZWxBbmltYXRpb25GcmFtZXx8YS53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZXx8CiAgICAgICAgYS53ZWJraXRDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUsZT0hIWQsZj1lP2Z1bmN0aW9uKGEpe3ZhciBiPWQoYSk7cmV0dXJuIGZ1bmN0aW9uKCl7YyhiKX19OmZ1bmN0aW9uKGEpe3ZhciBjPWIoYSwxNi42NiwhMSk7cmV0dXJuIGZ1bmN0aW9uKCl7Yi5jYW5jZWwoYyl9fTtmLnN1cHBvcnRlZD1lO3JldHVybiBmfV19ZnVuY3Rpb24gV2YoKXtmdW5jdGlvbiBhKGEpe2Z1bmN0aW9uIGIoKXt0aGlzLiQkd2F0Y2hlcnM9dGhpcy4kJG5leHRTaWJsaW5nPXRoaXMuJCRjaGlsZEhlYWQ9dGhpcy4kJGNoaWxkVGFpbD1udWxsO3RoaXMuJCRsaXN0ZW5lcnM9e307dGhpcy4kJGxpc3RlbmVyQ291bnQ9e307dGhpcy4kJHdhdGNoZXJzQ291bnQ9MDt0aGlzLiRpZD0rK3BiO3RoaXMuJCRDaGlsZFNjb3BlPW51bGw7dGhpcy4kJHN1c3BlbmRlZD0hMX1iLnByb3RvdHlwZT1hO3JldHVybiBifXZhciBiPTEwLGQ9RigiJHJvb3RTY29wZSIpLGM9bnVsbCxlPW51bGw7dGhpcy5kaWdlc3RUdGw9CiAgICAgICAgZnVuY3Rpb24oYSl7YXJndW1lbnRzLmxlbmd0aCYmKGI9YSk7cmV0dXJuIGJ9O3RoaXMuJGdldD1bIiRleGNlcHRpb25IYW5kbGVyIiwiJHBhcnNlIiwiJGJyb3dzZXIiLGZ1bmN0aW9uKGYsZyxrKXtmdW5jdGlvbiBoKGEpe2EuY3VycmVudFNjb3BlLiQkZGVzdHJveWVkPSEwfWZ1bmN0aW9uIGwoYSl7OT09PUNhJiYoYS4kJGNoaWxkSGVhZCYmbChhLiQkY2hpbGRIZWFkKSxhLiQkbmV4dFNpYmxpbmcmJmwoYS4kJG5leHRTaWJsaW5nKSk7YS4kcGFyZW50PWEuJCRuZXh0U2libGluZz1hLiQkcHJldlNpYmxpbmc9YS4kJGNoaWxkSGVhZD1hLiQkY2hpbGRUYWlsPWEuJHJvb3Q9YS4kJHdhdGNoZXJzPW51bGx9ZnVuY3Rpb24gbSgpe3RoaXMuJGlkPSsrcGI7dGhpcy4kJHBoYXNlPXRoaXMuJHBhcmVudD10aGlzLiQkd2F0Y2hlcnM9dGhpcy4kJG5leHRTaWJsaW5nPXRoaXMuJCRwcmV2U2libGluZz10aGlzLiQkY2hpbGRIZWFkPXRoaXMuJCRjaGlsZFRhaWw9bnVsbDt0aGlzLiRyb290PQogICAgICAgIHRoaXM7dGhpcy4kJHN1c3BlbmRlZD10aGlzLiQkZGVzdHJveWVkPSExO3RoaXMuJCRsaXN0ZW5lcnM9e307dGhpcy4kJGxpc3RlbmVyQ291bnQ9e307dGhpcy4kJHdhdGNoZXJzQ291bnQ9MDt0aGlzLiQkaXNvbGF0ZUJpbmRpbmdzPW51bGx9ZnVuY3Rpb24gcChhKXtpZih2LiQkcGhhc2UpdGhyb3cgZCgiaW5wcm9nIix2LiQkcGhhc2UpO3YuJCRwaGFzZT1hfWZ1bmN0aW9uIG4oYSxiKXtkbyBhLiQkd2F0Y2hlcnNDb3VudCs9Yjt3aGlsZShhPWEuJHBhcmVudCl9ZnVuY3Rpb24gcyhhLGIsYyl7ZG8gYS4kJGxpc3RlbmVyQ291bnRbY10tPWIsMD09PWEuJCRsaXN0ZW5lckNvdW50W2NdJiZkZWxldGUgYS4kJGxpc3RlbmVyQ291bnRbY107d2hpbGUoYT1hLiRwYXJlbnQpfWZ1bmN0aW9uIEcoKXt9ZnVuY3Rpb24gdCgpe2Zvcig7eS5sZW5ndGg7KXRyeXt5LnNoaWZ0KCkoKX1jYXRjaChhKXtmKGEpfWU9bnVsbH1mdW5jdGlvbiBxKCl7bnVsbD09PWUmJihlPWsuZGVmZXIoZnVuY3Rpb24oKXt2LiRhcHBseSh0KX0sCiAgICAgICAgbnVsbCwiJGFwcGx5QXN5bmMiKSl9bS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOm0sJG5ldzpmdW5jdGlvbihiLGMpe3ZhciBkO2M9Y3x8dGhpcztiPyhkPW5ldyBtLGQuJHJvb3Q9dGhpcy4kcm9vdCk6KHRoaXMuJCRDaGlsZFNjb3BlfHwodGhpcy4kJENoaWxkU2NvcGU9YSh0aGlzKSksZD1uZXcgdGhpcy4kJENoaWxkU2NvcGUpO2QuJHBhcmVudD1jO2QuJCRwcmV2U2libGluZz1jLiQkY2hpbGRUYWlsO2MuJCRjaGlsZEhlYWQ/KGMuJCRjaGlsZFRhaWwuJCRuZXh0U2libGluZz1kLGMuJCRjaGlsZFRhaWw9ZCk6Yy4kJGNoaWxkSGVhZD1jLiQkY2hpbGRUYWlsPWQ7KGJ8fGMhPT10aGlzKSYmZC4kb24oIiRkZXN0cm95IixoKTtyZXR1cm4gZH0sJHdhdGNoOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBmPWcoYSk7Yj1CKGIpP2I6RTtpZihmLiQkd2F0Y2hEZWxlZ2F0ZSlyZXR1cm4gZi4kJHdhdGNoRGVsZWdhdGUodGhpcyxiLGQsZixhKTt2YXIgaD10aGlzLGs9aC4kJHdhdGNoZXJzLGw9CiAgICAgICAgICAgIHtmbjpiLGxhc3Q6RyxnZXQ6ZixleHA6ZXx8YSxlcTohIWR9O2M9bnVsbDtrfHwoaz1oLiQkd2F0Y2hlcnM9W10say4kJGRpZ2VzdFdhdGNoSW5kZXg9LTEpO2sudW5zaGlmdChsKTtrLiQkZGlnZXN0V2F0Y2hJbmRleCsrO24odGhpcywxKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1jYihrLGwpOzA8PWEmJihuKGgsLTEpLGE8ay4kJGRpZ2VzdFdhdGNoSW5kZXgmJmsuJCRkaWdlc3RXYXRjaEluZGV4LS0pO2M9bnVsbH19LCR3YXRjaEdyb3VwOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe2g9ITE7dHJ5e2s/KGs9ITEsYihlLGUsZykpOmIoZSxkLGcpfWZpbmFsbHl7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZFtmXT1lW2ZdfX12YXIgZD1BcnJheShhLmxlbmd0aCksZT1BcnJheShhLmxlbmd0aCksZj1bXSxnPXRoaXMsaD0hMSxrPSEwO2lmKCFhLmxlbmd0aCl7dmFyIGw9ITA7Zy4kZXZhbEFzeW5jKGZ1bmN0aW9uKCl7bCYmYihlLGUsZyl9KTtyZXR1cm4gZnVuY3Rpb24oKXtsPQogICAgICAgICAgICAhMX19aWYoMT09PWEubGVuZ3RoKXJldHVybiB0aGlzLiR3YXRjaChhWzBdLGZ1bmN0aW9uKGEsYyxmKXtlWzBdPWE7ZFswXT1jO2IoZSxhPT09Yz9lOmQsZil9KTtyKGEsZnVuY3Rpb24oYSxiKXt2YXIgZD1nLiR3YXRjaChhLGZ1bmN0aW9uKGEpe2VbYl09YTtofHwoaD0hMCxnLiRldmFsQXN5bmMoYykpfSk7Zi5wdXNoKGQpfSk7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKDtmLmxlbmd0aDspZi5zaGlmdCgpKCl9fSwkd2F0Y2hDb2xsZWN0aW9uOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtlPWE7dmFyIGIsZCxnLGg7aWYoIXooZSkpe2lmKEQoZSkpaWYoeWEoZSkpZm9yKGYhPT1uJiYoZj1uLHQ9Zi5sZW5ndGg9MCxsKyspLGE9ZS5sZW5ndGgsdCE9PWEmJihsKyssZi5sZW5ndGg9dD1hKSxiPTA7YjxhO2IrKyloPWZbYl0sZz1lW2JdLGQ9aCE9PWgmJmchPT1nLGR8fGg9PT1nfHwobCsrLGZbYl09Zyk7ZWxzZXtmIT09cCYmKGY9cD17fSx0PTAsbCsrKTthPTA7Zm9yKGIgaW4gZSl0YS5jYWxsKGUsCiAgICAgICAgICAgIGIpJiYoYSsrLGc9ZVtiXSxoPWZbYl0sYiBpbiBmPyhkPWghPT1oJiZnIT09ZyxkfHxoPT09Z3x8KGwrKyxmW2JdPWcpKToodCsrLGZbYl09ZyxsKyspKTtpZih0PmEpZm9yKGIgaW4gbCsrLGYpdGEuY2FsbChlLGIpfHwodC0tLGRlbGV0ZSBmW2JdKX1lbHNlIGYhPT1lJiYoZj1lLGwrKyk7cmV0dXJuIGx9fWMuJCRwdXJlPWcoYSkubGl0ZXJhbDtjLiRzdGF0ZWZ1bD0hYy4kJHB1cmU7dmFyIGQ9dGhpcyxlLGYsaCxrPTE8Yi5sZW5ndGgsbD0wLG09ZyhhLGMpLG49W10scD17fSxzPSEwLHQ9MDtyZXR1cm4gdGhpcy4kd2F0Y2gobSxmdW5jdGlvbigpe3M/KHM9ITEsYihlLGUsZCkpOmIoZSxoLGQpO2lmKGspaWYoRChlKSlpZih5YShlKSl7aD1BcnJheShlLmxlbmd0aCk7Zm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspaFthXT1lW2FdfWVsc2UgZm9yKGEgaW4gaD17fSxlKXRhLmNhbGwoZSxhKSYmKGhbYV09ZVthXSk7ZWxzZSBoPWV9KX0sJGRpZ2VzdDpmdW5jdGlvbigpe3ZhciBhLAogICAgICAgICAgICBnLGgsbCxtLG4scyxyPWIscSx5PXcubGVuZ3RoP3Y6dGhpcyxOPVtdLHosQTtwKCIkZGlnZXN0Iik7ay4kJGNoZWNrVXJsQ2hhbmdlKCk7dGhpcz09PXYmJm51bGwhPT1lJiYoay5kZWZlci5jYW5jZWwoZSksdCgpKTtjPW51bGw7ZG97cz0hMTtxPXk7Zm9yKG49MDtuPHcubGVuZ3RoO24rKyl7dHJ5e0E9d1tuXSxsPUEuZm4sbChBLnNjb3BlLEEubG9jYWxzKX1jYXRjaChDKXtmKEMpfWM9bnVsbH13Lmxlbmd0aD0wO2E6ZG97aWYobj0hcS4kJHN1c3BlbmRlZCYmcS4kJHdhdGNoZXJzKWZvcihuLiQkZGlnZXN0V2F0Y2hJbmRleD1uLmxlbmd0aDtuLiQkZGlnZXN0V2F0Y2hJbmRleC0tOyl0cnl7aWYoYT1uW24uJCRkaWdlc3RXYXRjaEluZGV4XSlpZihtPWEuZ2V0LChnPW0ocSkpIT09KGg9YS5sYXN0KSYmIShhLmVxP3ZhKGcsaCk6WChnKSYmWChoKSkpcz0hMCxjPWEsYS5sYXN0PWEuZXE/SWEoZyxudWxsKTpnLGw9YS5mbixsKGcsaD09PUc/ZzpoLHEpLDU+ciYmKHo9NC1yLE5bel18fAogICAgICAgIChOW3pdPVtdKSxOW3pdLnB1c2goe21zZzpCKGEuZXhwKT8iZm46ICIrKGEuZXhwLm5hbWV8fGEuZXhwLnRvU3RyaW5nKCkpOmEuZXhwLG5ld1ZhbDpnLG9sZFZhbDpofSkpO2Vsc2UgaWYoYT09PWMpe3M9ITE7YnJlYWsgYX19Y2F0Y2goRSl7ZihFKX1pZighKG49IXEuJCRzdXNwZW5kZWQmJnEuJCR3YXRjaGVyc0NvdW50JiZxLiQkY2hpbGRIZWFkfHxxIT09eSYmcS4kJG5leHRTaWJsaW5nKSlmb3IoO3EhPT15JiYhKG49cS4kJG5leHRTaWJsaW5nKTspcT1xLiRwYXJlbnR9d2hpbGUocT1uKTtpZigoc3x8dy5sZW5ndGgpJiYhci0tKXRocm93IHYuJCRwaGFzZT1udWxsLGQoImluZmRpZyIsYixOKTt9d2hpbGUoc3x8dy5sZW5ndGgpO2Zvcih2LiQkcGhhc2U9bnVsbDtKPHgubGVuZ3RoOyl0cnl7eFtKKytdKCl9Y2F0Y2goRCl7ZihEKX14Lmxlbmd0aD1KPTA7ay4kJGNoZWNrVXJsQ2hhbmdlKCl9LCRzdXNwZW5kOmZ1bmN0aW9uKCl7dGhpcy4kJHN1c3BlbmRlZD0hMH0sJGlzU3VzcGVuZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJCRzdXNwZW5kZWR9LAogICAgICAgICRyZXN1bWU6ZnVuY3Rpb24oKXt0aGlzLiQkc3VzcGVuZGVkPSExfSwkZGVzdHJveTpmdW5jdGlvbigpe2lmKCF0aGlzLiQkZGVzdHJveWVkKXt2YXIgYT10aGlzLiRwYXJlbnQ7dGhpcy4kYnJvYWRjYXN0KCIkZGVzdHJveSIpO3RoaXMuJCRkZXN0cm95ZWQ9ITA7dGhpcz09PXYmJmsuJCRhcHBsaWNhdGlvbkRlc3Ryb3llZCgpO24odGhpcywtdGhpcy4kJHdhdGNoZXJzQ291bnQpO2Zvcih2YXIgYiBpbiB0aGlzLiQkbGlzdGVuZXJDb3VudClzKHRoaXMsdGhpcy4kJGxpc3RlbmVyQ291bnRbYl0sYik7YSYmYS4kJGNoaWxkSGVhZD09PXRoaXMmJihhLiQkY2hpbGRIZWFkPXRoaXMuJCRuZXh0U2libGluZyk7YSYmYS4kJGNoaWxkVGFpbD09PXRoaXMmJihhLiQkY2hpbGRUYWlsPXRoaXMuJCRwcmV2U2libGluZyk7dGhpcy4kJHByZXZTaWJsaW5nJiYodGhpcy4kJHByZXZTaWJsaW5nLiQkbmV4dFNpYmxpbmc9dGhpcy4kJG5leHRTaWJsaW5nKTt0aGlzLiQkbmV4dFNpYmxpbmcmJih0aGlzLiQkbmV4dFNpYmxpbmcuJCRwcmV2U2libGluZz0KICAgICAgICAgICAgdGhpcy4kJHByZXZTaWJsaW5nKTt0aGlzLiRkZXN0cm95PXRoaXMuJGRpZ2VzdD10aGlzLiRhcHBseT10aGlzLiRldmFsQXN5bmM9dGhpcy4kYXBwbHlBc3luYz1FO3RoaXMuJG9uPXRoaXMuJHdhdGNoPXRoaXMuJHdhdGNoR3JvdXA9ZnVuY3Rpb24oKXtyZXR1cm4gRX07dGhpcy4kJGxpc3RlbmVycz17fTt0aGlzLiQkbmV4dFNpYmxpbmc9bnVsbDtsKHRoaXMpfX0sJGV2YWw6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZyhhKSh0aGlzLGIpfSwkZXZhbEFzeW5jOmZ1bmN0aW9uKGEsYil7di4kJHBoYXNlfHx3Lmxlbmd0aHx8ay5kZWZlcihmdW5jdGlvbigpe3cubGVuZ3RoJiZ2LiRkaWdlc3QoKX0sbnVsbCwiJGV2YWxBc3luYyIpO3cucHVzaCh7c2NvcGU6dGhpcyxmbjpnKGEpLGxvY2FsczpifSl9LCQkcG9zdERpZ2VzdDpmdW5jdGlvbihhKXt4LnB1c2goYSl9LCRhcHBseTpmdW5jdGlvbihhKXt0cnl7cCgiJGFwcGx5Iik7dHJ5e3JldHVybiB0aGlzLiRldmFsKGEpfWZpbmFsbHl7di4kJHBoYXNlPQogICAgICAgICAgICBudWxsfX1jYXRjaChiKXtmKGIpfWZpbmFsbHl7dHJ5e3YuJGRpZ2VzdCgpfWNhdGNoKGMpe3Rocm93IGYoYyksYzt9fX0sJGFwcGx5QXN5bmM6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe2MuJGV2YWwoYSl9dmFyIGM9dGhpczthJiZ5LnB1c2goYik7YT1nKGEpO3EoKX0sJG9uOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy4kJGxpc3RlbmVyc1thXTtjfHwodGhpcy4kJGxpc3RlbmVyc1thXT1jPVtdKTtjLnB1c2goYik7dmFyIGQ9dGhpcztkbyBkLiQkbGlzdGVuZXJDb3VudFthXXx8KGQuJCRsaXN0ZW5lckNvdW50W2FdPTApLGQuJCRsaXN0ZW5lckNvdW50W2FdKys7d2hpbGUoZD1kLiRwYXJlbnQpO3ZhciBlPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGQ9Yy5pbmRleE9mKGIpOy0xIT09ZCYmKGRlbGV0ZSBjW2RdLHMoZSwxLGEpKX19LCRlbWl0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlPXRoaXMsZz0hMSxoPXtuYW1lOmEsdGFyZ2V0U2NvcGU6ZSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXtnPQogICAgICAgICAgICAgICAgITB9LHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7aC5kZWZhdWx0UHJldmVudGVkPSEwfSxkZWZhdWx0UHJldmVudGVkOiExfSxrPWRiKFtoXSxhcmd1bWVudHMsMSksbCxtO2Rve2Q9ZS4kJGxpc3RlbmVyc1thXXx8YztoLmN1cnJlbnRTY29wZT1lO2w9MDtmb3IobT1kLmxlbmd0aDtsPG07bCsrKWlmKGRbbF0pdHJ5e2RbbF0uYXBwbHkobnVsbCxrKX1jYXRjaChuKXtmKG4pfWVsc2UgZC5zcGxpY2UobCwxKSxsLS0sbS0tO2lmKGcpYnJlYWs7ZT1lLiRwYXJlbnR9d2hpbGUoZSk7aC5jdXJyZW50U2NvcGU9bnVsbDtyZXR1cm4gaH0sJGJyb2FkY2FzdDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMsZD10aGlzLGU9e25hbWU6YSx0YXJnZXRTY29wZTp0aGlzLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7ZS5kZWZhdWx0UHJldmVudGVkPSEwfSxkZWZhdWx0UHJldmVudGVkOiExfTtpZighdGhpcy4kJGxpc3RlbmVyQ291bnRbYV0pcmV0dXJuIGU7Zm9yKHZhciBnPWRiKFtlXSxhcmd1bWVudHMsCiAgICAgICAgICAgIDEpLGgsaztjPWQ7KXtlLmN1cnJlbnRTY29wZT1jO2Q9Yy4kJGxpc3RlbmVyc1thXXx8W107aD0wO2ZvcihrPWQubGVuZ3RoO2g8aztoKyspaWYoZFtoXSl0cnl7ZFtoXS5hcHBseShudWxsLGcpfWNhdGNoKGwpe2YobCl9ZWxzZSBkLnNwbGljZShoLDEpLGgtLSxrLS07aWYoIShkPWMuJCRsaXN0ZW5lckNvdW50W2FdJiZjLiQkY2hpbGRIZWFkfHxjIT09dGhpcyYmYy4kJG5leHRTaWJsaW5nKSlmb3IoO2MhPT10aGlzJiYhKGQ9Yy4kJG5leHRTaWJsaW5nKTspYz1jLiRwYXJlbnR9ZS5jdXJyZW50U2NvcGU9bnVsbDtyZXR1cm4gZX19O3ZhciB2PW5ldyBtLHc9di4kJGFzeW5jUXVldWU9W10seD12LiQkcG9zdERpZ2VzdFF1ZXVlPVtdLHk9di4kJGFwcGx5QXN5bmNRdWV1ZT1bXSxKPTA7cmV0dXJuIHZ9XX1mdW5jdGlvbiBMZSgpe3ZhciBhPS9eXHMqKGh0dHBzP3xzP2Z0cHxtYWlsdG98dGVsfGZpbGUpOi8sYj0vXlxzKigoaHR0cHM/fGZ0cHxmaWxlfGJsb2IpOnxkYXRhOmltYWdlXC8pLzsKICAgICAgICB0aGlzLmFIcmVmU2FuaXRpemF0aW9uV2hpdGVsaXN0PWZ1bmN0aW9uKGIpe3JldHVybiB3KGIpPyhhPWIsdGhpcyk6YX07dGhpcy5pbWdTcmNTYW5pdGl6YXRpb25XaGl0ZWxpc3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIHcoYSk/KGI9YSx0aGlzKTpifTt0aGlzLiRnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZCxjKXt2YXIgZT1jP2I6YSxmPWdhKGQmJmQudHJpbSgpKS5ocmVmO3JldHVybiIiPT09Znx8Zi5tYXRjaChlKT9kOiJ1bnNhZmU6IitmfX19ZnVuY3Rpb24gU2coYSl7aWYoInNlbGYiPT09YSlyZXR1cm4gYTtpZihBKGEpKXtpZigtMTxhLmluZGV4T2YoIioqKiIpKXRocm93IEVhKCJpd2NhcmQiLGEpO2E9TWQoYSkucmVwbGFjZSgvXFxcKlxcXCovZywiLioiKS5yZXBsYWNlKC9cXFwqL2csIlteOi8uPyY7XSoiKTtyZXR1cm4gbmV3IFJlZ0V4cCgiXiIrYSsiJCIpfWlmKGFiKGEpKXJldHVybiBuZXcgUmVnRXhwKCJeIithLnNvdXJjZSsiJCIpO3Rocm93IEVhKCJpbWF0Y2hlciIpOwogICAgfWZ1bmN0aW9uIE5kKGEpe3ZhciBiPVtdO3coYSkmJnIoYSxmdW5jdGlvbihhKXtiLnB1c2goU2coYSkpfSk7cmV0dXJuIGJ9ZnVuY3Rpb24gJGYoKXt0aGlzLlNDRV9DT05URVhUUz1WO3ZhciBhPVsic2VsZiJdLGI9W107dGhpcy5yZXNvdXJjZVVybFdoaXRlbGlzdD1mdW5jdGlvbihiKXthcmd1bWVudHMubGVuZ3RoJiYoYT1OZChiKSk7cmV0dXJuIGF9O3RoaXMucmVzb3VyY2VVcmxCbGFja2xpc3Q9ZnVuY3Rpb24oYSl7YXJndW1lbnRzLmxlbmd0aCYmKGI9TmQoYSkpO3JldHVybiBifTt0aGlzLiRnZXQ9WyIkaW5qZWN0b3IiLCIkJHNhbml0aXplVXJpIixmdW5jdGlvbihkLGMpe2Z1bmN0aW9uIGUoYSxiKXt2YXIgYzsic2VsZiI9PT1hPyhjPUJjKGIsT2QpKXx8KEMuZG9jdW1lbnQuYmFzZVVSST9jPUMuZG9jdW1lbnQuYmFzZVVSSTooTmF8fChOYT1DLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxOYS5ocmVmPSIuIixOYT1OYS5jbG9uZU5vZGUoITEpKSxjPU5hLmhyZWYpLAogICAgICAgIGM9QmMoYixjKSk6Yz0hIWEuZXhlYyhiLmhyZWYpO3JldHVybiBjfWZ1bmN0aW9uIGYoYSl7dmFyIGI9ZnVuY3Rpb24oYSl7dGhpcy4kJHVud3JhcFRydXN0ZWRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBhfX07YSYmKGIucHJvdG90eXBlPW5ldyBhKTtiLnByb3RvdHlwZS52YWx1ZU9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJCR1bndyYXBUcnVzdGVkVmFsdWUoKX07Yi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kJHVud3JhcFRydXN0ZWRWYWx1ZSgpLnRvU3RyaW5nKCl9O3JldHVybiBifXZhciBnPWZ1bmN0aW9uKGEpe3Rocm93IEVhKCJ1bnNhZmUiKTt9O2QuaGFzKCIkc2FuaXRpemUiKSYmKGc9ZC5nZXQoIiRzYW5pdGl6ZSIpKTt2YXIgaz1mKCksaD17fTtoW1YuSFRNTF09ZihrKTtoW1YuQ1NTXT1mKGspO2hbVi5NRURJQV9VUkxdPWYoayk7aFtWLlVSTF09ZihoW1YuTUVESUFfVVJMXSk7aFtWLkpTXT1mKGspO2hbVi5SRVNPVVJDRV9VUkxdPQogICAgICAgIGYoaFtWLlVSTF0pO3JldHVybnt0cnVzdEFzOmZ1bmN0aW9uKGEsYil7dmFyIGM9aC5oYXNPd25Qcm9wZXJ0eShhKT9oW2FdOm51bGw7aWYoIWMpdGhyb3cgRWEoImljb250ZXh0IixhLGIpO2lmKG51bGw9PT1ifHx6KGIpfHwiIj09PWIpcmV0dXJuIGI7aWYoInN0cmluZyIhPT10eXBlb2YgYil0aHJvdyBFYSgiaXR5cGUiLGEpO3JldHVybiBuZXcgYyhiKX0sZ2V0VHJ1c3RlZDpmdW5jdGlvbihkLGYpe2lmKG51bGw9PT1mfHx6KGYpfHwiIj09PWYpcmV0dXJuIGY7dmFyIGs9aC5oYXNPd25Qcm9wZXJ0eShkKT9oW2RdOm51bGw7aWYoayYmZiBpbnN0YW5jZW9mIGspcmV0dXJuIGYuJCR1bndyYXBUcnVzdGVkVmFsdWUoKTtCKGYuJCR1bndyYXBUcnVzdGVkVmFsdWUpJiYoZj1mLiQkdW53cmFwVHJ1c3RlZFZhbHVlKCkpO2lmKGQ9PT1WLk1FRElBX1VSTHx8ZD09PVYuVVJMKXJldHVybiBjKGYudG9TdHJpbmcoKSxkPT09Vi5NRURJQV9VUkwpO2lmKGQ9PT1WLlJFU09VUkNFX1VSTCl7dmFyIGs9CiAgICAgICAgICAgIGdhKGYudG9TdHJpbmcoKSksbixzLHI9ITE7bj0wO2ZvcihzPWEubGVuZ3RoO248cztuKyspaWYoZShhW25dLGspKXtyPSEwO2JyZWFrfWlmKHIpZm9yKG49MCxzPWIubGVuZ3RoO248cztuKyspaWYoZShiW25dLGspKXtyPSExO2JyZWFrfWlmKHIpcmV0dXJuIGY7dGhyb3cgRWEoImluc2VjdXJsIixmLnRvU3RyaW5nKCkpO31pZihkPT09Vi5IVE1MKXJldHVybiBnKGYpO3Rocm93IEVhKCJ1bnNhZmUiKTt9LHZhbHVlT2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBrP2EuJCR1bndyYXBUcnVzdGVkVmFsdWUoKTphfX19XX1mdW5jdGlvbiBaZigpe3ZhciBhPSEwO3RoaXMuZW5hYmxlZD1mdW5jdGlvbihiKXthcmd1bWVudHMubGVuZ3RoJiYoYT0hIWIpO3JldHVybiBhfTt0aGlzLiRnZXQ9WyIkcGFyc2UiLCIkc2NlRGVsZWdhdGUiLGZ1bmN0aW9uKGIsZCl7aWYoYSYmOD5DYSl0aHJvdyBFYSgiaWVxdWlya3MiKTt2YXIgYz1qYShWKTtjLmlzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiBhfTsKICAgICAgICBjLnRydXN0QXM9ZC50cnVzdEFzO2MuZ2V0VHJ1c3RlZD1kLmdldFRydXN0ZWQ7Yy52YWx1ZU9mPWQudmFsdWVPZjthfHwoYy50cnVzdEFzPWMuZ2V0VHJ1c3RlZD1mdW5jdGlvbihhLGIpe3JldHVybiBifSxjLnZhbHVlT2Y9VGEpO2MucGFyc2VBcz1mdW5jdGlvbihhLGQpe3ZhciBlPWIoZCk7cmV0dXJuIGUubGl0ZXJhbCYmZS5jb25zdGFudD9lOmIoZCxmdW5jdGlvbihiKXtyZXR1cm4gYy5nZXRUcnVzdGVkKGEsYil9KX07dmFyIGU9Yy5wYXJzZUFzLGY9Yy5nZXRUcnVzdGVkLGc9Yy50cnVzdEFzO3IoVixmdW5jdGlvbihhLGIpe3ZhciBkPUsoYik7Y1soInBhcnNlX2FzXyIrZCkucmVwbGFjZShDYyx3YildPWZ1bmN0aW9uKGIpe3JldHVybiBlKGEsYil9O2NbKCJnZXRfdHJ1c3RlZF8iK2QpLnJlcGxhY2UoQ2Msd2IpXT1mdW5jdGlvbihiKXtyZXR1cm4gZihhLGIpfTtjWygidHJ1c3RfYXNfIitkKS5yZXBsYWNlKENjLHdiKV09ZnVuY3Rpb24oYil7cmV0dXJuIGcoYSxiKX19KTsKICAgICAgICByZXR1cm4gY31dfWZ1bmN0aW9uIGFnKCl7dGhpcy4kZ2V0PVsiJHdpbmRvdyIsIiRkb2N1bWVudCIsZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxjPSEoKCFhLm53fHwhYS5udy5wcm9jZXNzKSYmYS5jaHJvbWUmJihhLmNocm9tZS5hcHAmJmEuY2hyb21lLmFwcC5ydW50aW1lfHwhYS5jaHJvbWUuYXBwJiZhLmNocm9tZS5ydW50aW1lJiZhLmNocm9tZS5ydW50aW1lLmlkKSkmJmEuaGlzdG9yeSYmYS5oaXN0b3J5LnB1c2hTdGF0ZSxlPWZhKCgvYW5kcm9pZCAoXGQrKS8uZXhlYyhLKChhLm5hdmlnYXRvcnx8e30pLnVzZXJBZ2VudCkpfHxbXSlbMV0pLGY9L0JveGVlL2kudGVzdCgoYS5uYXZpZ2F0b3J8fHt9KS51c2VyQWdlbnQpLGc9YlswXXx8e30saz1nLmJvZHkmJmcuYm9keS5zdHlsZSxoPSExLGw9ITE7ayYmKGg9ISEoInRyYW5zaXRpb24iaW4ga3x8IndlYmtpdFRyYW5zaXRpb24iaW4gayksbD0hISgiYW5pbWF0aW9uImluIGt8fCJ3ZWJraXRBbmltYXRpb24iaW4gaykpO3JldHVybntoaXN0b3J5OiEoIWN8fAogICAgICAgICAgICA0PmV8fGYpLGhhc0V2ZW50OmZ1bmN0aW9uKGEpe2lmKCJpbnB1dCI9PT1hJiZDYSlyZXR1cm4hMTtpZih6KGRbYV0pKXt2YXIgYj1nLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2RbYV09Im9uIithIGluIGJ9cmV0dXJuIGRbYV19LGNzcDpBYSgpLHRyYW5zaXRpb25zOmgsYW5pbWF0aW9uczpsLGFuZHJvaWQ6ZX19XX1mdW5jdGlvbiBiZygpe3RoaXMuJGdldD1pYShmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFRnKGEpfSl9ZnVuY3Rpb24gVGcoYSl7ZnVuY3Rpb24gYigpe3ZhciBhPWUucG9wKCk7cmV0dXJuIGEmJmEuY2J9ZnVuY3Rpb24gZChhKXtmb3IodmFyIGI9ZS5sZW5ndGgtMTswPD1iOy0tYil7dmFyIGM9ZVtiXTtpZihjLnR5cGU9PT1hKXJldHVybiBlLnNwbGljZShiLDEpLGMuY2J9fXZhciBjPXt9LGU9W10sZj10aGlzLkFMTF9UQVNLU19UWVBFPSIkJGFsbCQkIixnPXRoaXMuREVGQVVMVF9UQVNLX1RZUEU9IiQkZGVmYXVsdCQkIjt0aGlzLmNvbXBsZXRlVGFzaz1mdW5jdGlvbihlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKXtoPWh8fGc7dHJ5e2UoKX1maW5hbGx5e3ZhciBsO2w9aHx8ZztjW2xdJiYoY1tsXS0tLGNbZl0tLSk7bD1jW2hdO3ZhciBtPWNbZl07aWYoIW18fCFsKWZvcihsPW0/ZDpiO209bChoKTspdHJ5e20oKX1jYXRjaChwKXthLmVycm9yKHApfX19O3RoaXMuaW5jVGFza0NvdW50PWZ1bmN0aW9uKGEpe2E9YXx8ZztjW2FdPShjW2FdfHwwKSsxO2NbZl09KGNbZl18fDApKzF9O3RoaXMubm90aWZ5V2hlbk5vUGVuZGluZ1Rhc2tzPWZ1bmN0aW9uKGEsYil7Yj1ifHxmO2NbYl0/ZS5wdXNoKHt0eXBlOmIsY2I6YX0pOmEoKX19ZnVuY3Rpb24gZGcoKXt2YXIgYTt0aGlzLmh0dHBPcHRpb25zPWZ1bmN0aW9uKGIpe3JldHVybiBiPyhhPWIsdGhpcyk6YX07dGhpcy4kZ2V0PVsiJGV4Y2VwdGlvbkhhbmRsZXIiLCIkdGVtcGxhdGVDYWNoZSIsIiRodHRwIiwiJHEiLCIkc2NlIixmdW5jdGlvbihiLGQsYyxlLGYpe2Z1bmN0aW9uIGcoayxoKXtnLnRvdGFsUGVuZGluZ1JlcXVlc3RzKys7aWYoIUEoayl8fAogICAgICAgIHooZC5nZXQoaykpKWs9Zi5nZXRUcnVzdGVkUmVzb3VyY2VVcmwoayk7dmFyIGw9Yy5kZWZhdWx0cyYmYy5kZWZhdWx0cy50cmFuc2Zvcm1SZXNwb25zZTtIKGwpP2w9bC5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT12Y30pOmw9PT12YyYmKGw9bnVsbCk7cmV0dXJuIGMuZ2V0KGssUyh7Y2FjaGU6ZCx0cmFuc2Zvcm1SZXNwb25zZTpsfSxhKSkuZmluYWxseShmdW5jdGlvbigpe2cudG90YWxQZW5kaW5nUmVxdWVzdHMtLX0pLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIGQucHV0KGssYS5kYXRhKX0sZnVuY3Rpb24oYSl7aHx8KGE9VWcoInRwbG9hZCIsayxhLnN0YXR1cyxhLnN0YXR1c1RleHQpLGIoYSkpO3JldHVybiBlLnJlamVjdChhKX0pfWcudG90YWxQZW5kaW5nUmVxdWVzdHM9MDtyZXR1cm4gZ31dfWZ1bmN0aW9uIGVnKCl7dGhpcy4kZ2V0PVsiJHJvb3RTY29wZSIsIiRicm93c2VyIiwiJGxvY2F0aW9uIixmdW5jdGlvbihhLGIsZCl7cmV0dXJue2ZpbmRCaW5kaW5nczpmdW5jdGlvbihhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLGQpe2E9YS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJuZy1iaW5kaW5nIik7dmFyIGc9W107cihhLGZ1bmN0aW9uKGEpe3ZhciBjPWNhLmVsZW1lbnQoYSkuZGF0YSgiJGJpbmRpbmciKTtjJiZyKGMsZnVuY3Rpb24oYyl7ZD8obmV3IFJlZ0V4cCgiKF58XFxzKSIrTWQoYikrIihcXHN8XFx8fCQpIikpLnRlc3QoYykmJmcucHVzaChhKTotMSE9PWMuaW5kZXhPZihiKSYmZy5wdXNoKGEpfSl9KTtyZXR1cm4gZ30sZmluZE1vZGVsczpmdW5jdGlvbihhLGIsZCl7Zm9yKHZhciBnPVsibmctIiwiZGF0YS1uZy0iLCJuZ1xcOiJdLGs9MDtrPGcubGVuZ3RoOysrayl7dmFyIGg9YS5xdWVyeVNlbGVjdG9yQWxsKCJbIitnW2tdKyJtb2RlbCIrKGQ/Ij0iOiIqPSIpKyciJytiKyciXScpO2lmKGgubGVuZ3RoKXJldHVybiBofX0sZ2V0TG9jYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZC51cmwoKX0sc2V0TG9jYXRpb246ZnVuY3Rpb24oYil7YiE9PWQudXJsKCkmJihkLnVybChiKSxhLiRkaWdlc3QoKSl9LAogICAgICAgIHdoZW5TdGFibGU6ZnVuY3Rpb24oYSl7Yi5ub3RpZnlXaGVuTm9PdXRzdGFuZGluZ1JlcXVlc3RzKGEpfX19XX1mdW5jdGlvbiBmZygpe3RoaXMuJGdldD1bIiRyb290U2NvcGUiLCIkYnJvd3NlciIsIiRxIiwiJCRxIiwiJGV4Y2VwdGlvbkhhbmRsZXIiLGZ1bmN0aW9uKGEsYixkLGMsZSl7ZnVuY3Rpb24gZihmLGgsbCl7QihmKXx8KGw9aCxoPWYsZj1FKTt2YXIgbT1IYS5jYWxsKGFyZ3VtZW50cywzKSxwPXcobCkmJiFsLG49KHA/YzpkKS5kZWZlcigpLHM9bi5wcm9taXNlLHI7cj1iLmRlZmVyKGZ1bmN0aW9uKCl7dHJ5e24ucmVzb2x2ZShmLmFwcGx5KG51bGwsbSkpfWNhdGNoKGIpe24ucmVqZWN0KGIpLGUoYil9ZmluYWxseXtkZWxldGUgZ1tzLiQkdGltZW91dElkXX1wfHxhLiRhcHBseSgpfSxoLCIkdGltZW91dCIpO3MuJCR0aW1lb3V0SWQ9cjtnW3JdPW47cmV0dXJuIHN9dmFyIGc9e307Zi5jYW5jZWw9ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuITE7aWYoIWEuaGFzT3duUHJvcGVydHkoIiQkdGltZW91dElkIikpdGhyb3cgVmcoImJhZHByb20iKTsKICAgICAgICBpZighZy5oYXNPd25Qcm9wZXJ0eShhLiQkdGltZW91dElkKSlyZXR1cm4hMTthPWEuJCR0aW1lb3V0SWQ7dmFyIGM9Z1thXSxkPWMucHJvbWlzZTtkLiQkc3RhdGUmJihkLiQkc3RhdGUucHVyPSEwKTtjLnJlamVjdCgiY2FuY2VsZWQiKTtkZWxldGUgZ1thXTtyZXR1cm4gYi5kZWZlci5jYW5jZWwoYSl9O3JldHVybiBmfV19ZnVuY3Rpb24gZ2EoYSl7aWYoIUEoYSkpcmV0dXJuIGE7Q2EmJihhYS5zZXRBdHRyaWJ1dGUoImhyZWYiLGEpLGE9YWEuaHJlZik7YWEuc2V0QXR0cmlidXRlKCJocmVmIixhKTthPWFhLmhvc3RuYW1lOyFXZyYmLTE8YS5pbmRleE9mKCI6IikmJihhPSJbIithKyJdIik7cmV0dXJue2hyZWY6YWEuaHJlZixwcm90b2NvbDphYS5wcm90b2NvbD9hYS5wcm90b2NvbC5yZXBsYWNlKC86JC8sIiIpOiIiLGhvc3Q6YWEuaG9zdCxzZWFyY2g6YWEuc2VhcmNoP2FhLnNlYXJjaC5yZXBsYWNlKC9eXD8vLCIiKToiIixoYXNoOmFhLmhhc2g/YWEuaGFzaC5yZXBsYWNlKC9eIy8sCiAgICAgICAgICAgICIiKToiIixob3N0bmFtZTphLHBvcnQ6YWEucG9ydCxwYXRobmFtZToiLyI9PT1hYS5wYXRobmFtZS5jaGFyQXQoMCk/YWEucGF0aG5hbWU6Ii8iK2FhLnBhdGhuYW1lfX1mdW5jdGlvbiBKZyhhKXt2YXIgYj1bT2RdLmNvbmNhdChhLm1hcChnYSkpO3JldHVybiBmdW5jdGlvbihhKXthPWdhKGEpO3JldHVybiBiLnNvbWUoQmMuYmluZChudWxsLGEpKX19ZnVuY3Rpb24gQmMoYSxiKXthPWdhKGEpO2I9Z2EoYik7cmV0dXJuIGEucHJvdG9jb2w9PT1iLnByb3RvY29sJiZhLmhvc3Q9PT1iLmhvc3R9ZnVuY3Rpb24gZ2coKXt0aGlzLiRnZXQ9aWEoQyl9ZnVuY3Rpb24gUGQoYSl7ZnVuY3Rpb24gYihhKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChhKX1jYXRjaChiKXtyZXR1cm4gYX19dmFyIGQ9YVswXXx8e30sYz17fSxlPSIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhLGcsayxoLGw7dHJ5e2E9ZC5jb29raWV8fCIifWNhdGNoKG0pe2E9IiJ9aWYoYSE9PWUpZm9yKGU9YSxhPQogICAgICAgIGUuc3BsaXQoIjsgIiksYz17fSxrPTA7azxhLmxlbmd0aDtrKyspZz1hW2tdLGg9Zy5pbmRleE9mKCI9IiksMDxoJiYobD1iKGcuc3Vic3RyaW5nKDAsaCkpLHooY1tsXSkmJihjW2xdPWIoZy5zdWJzdHJpbmcoaCsxKSkpKTtyZXR1cm4gY319ZnVuY3Rpb24ga2coKXt0aGlzLiRnZXQ9UGR9ZnVuY3Rpb24gZGQoYSl7ZnVuY3Rpb24gYihkLGMpe2lmKEQoZCkpe3ZhciBlPXt9O3IoZCxmdW5jdGlvbihhLGMpe2VbY109YihjLGEpfSk7cmV0dXJuIGV9cmV0dXJuIGEuZmFjdG9yeShkKyJGaWx0ZXIiLGMpfXRoaXMucmVnaXN0ZXI9Yjt0aGlzLiRnZXQ9WyIkaW5qZWN0b3IiLGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYS5nZXQoYisiRmlsdGVyIil9fV07YigiY3VycmVuY3kiLFFkKTtiKCJkYXRlIixSZCk7YigiZmlsdGVyIixYZyk7YigianNvbiIsWWcpO2IoImxpbWl0VG8iLFpnKTtiKCJsb3dlcmNhc2UiLCRnKTtiKCJudW1iZXIiLFNkKTtiKCJvcmRlckJ5IiwKICAgICAgICBUZCk7YigidXBwZXJjYXNlIixhaCl9ZnVuY3Rpb24gWGcoKXtyZXR1cm4gZnVuY3Rpb24oYSxiLGQsYyl7aWYoIXlhKGEpKXtpZihudWxsPT1hKXJldHVybiBhO3Rocm93IEYoImZpbHRlciIpKCJub3RhcnJheSIsYSk7fWM9Y3x8IiQiO3ZhciBlO3N3aXRjaChEYyhiKSl7Y2FzZSAiZnVuY3Rpb24iOmJyZWFrO2Nhc2UgImJvb2xlYW4iOmNhc2UgIm51bGwiOmNhc2UgIm51bWJlciI6Y2FzZSAic3RyaW5nIjplPSEwO2Nhc2UgIm9iamVjdCI6Yj1iaChiLGQsYyxlKTticmVhaztkZWZhdWx0OnJldHVybiBhfXJldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSxiKX19ZnVuY3Rpb24gYmgoYSxiLGQsYyl7dmFyIGU9RChhKSYmZCBpbiBhOyEwPT09Yj9iPXZhOkIoYil8fChiPWZ1bmN0aW9uKGEsYil7aWYoeihhKSlyZXR1cm4hMTtpZihudWxsPT09YXx8bnVsbD09PWIpcmV0dXJuIGE9PT1iO2lmKEQoYil8fEQoYSkmJiFiYyhhKSlyZXR1cm4hMTthPUsoIiIrYSk7Yj1LKCIiKwogICAgICAgIGIpO3JldHVybi0xIT09YS5pbmRleE9mKGIpfSk7cmV0dXJuIGZ1bmN0aW9uKGYpe3JldHVybiBlJiYhRChmKT9GYShmLGFbZF0sYixkLCExKTpGYShmLGEsYixkLGMpfX1mdW5jdGlvbiBGYShhLGIsZCxjLGUsZil7dmFyIGc9RGMoYSksaz1EYyhiKTtpZigic3RyaW5nIj09PWsmJiIhIj09PWIuY2hhckF0KDApKXJldHVybiFGYShhLGIuc3Vic3RyaW5nKDEpLGQsYyxlKTtpZihIKGEpKXJldHVybiBhLnNvbWUoZnVuY3Rpb24oYSl7cmV0dXJuIEZhKGEsYixkLGMsZSl9KTtzd2l0Y2goZyl7Y2FzZSAib2JqZWN0Ijp2YXIgaDtpZihlKXtmb3IoaCBpbiBhKWlmKGguY2hhckF0JiYiJCIhPT1oLmNoYXJBdCgwKSYmRmEoYVtoXSxiLGQsYywhMCkpcmV0dXJuITA7cmV0dXJuIGY/ITE6RmEoYSxiLGQsYywhMSl9aWYoIm9iamVjdCI9PT1rKXtmb3IoaCBpbiBiKWlmKGY9YltoXSwhQihmKSYmIXooZikmJihnPWg9PT1jLCFGYShnP2E6YVtoXSxmLGQsYyxnLGcpKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gZChhLAogICAgICAgIGIpO2Nhc2UgImZ1bmN0aW9uIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiBkKGEsYil9fWZ1bmN0aW9uIERjKGEpe3JldHVybiBudWxsPT09YT8ibnVsbCI6dHlwZW9mIGF9ZnVuY3Rpb24gUWQoYSl7dmFyIGI9YS5OVU1CRVJfRk9STUFUUztyZXR1cm4gZnVuY3Rpb24oYSxjLGUpe3ooYykmJihjPWIuQ1VSUkVOQ1lfU1lNKTt6KGUpJiYoZT1iLlBBVFRFUk5TWzFdLm1heEZyYWMpO3ZhciBmPWM/L1x1MDBBNC9nOi9ccypcdTAwQTRccyovZztyZXR1cm4gbnVsbD09YT9hOlVkKGEsYi5QQVRURVJOU1sxXSxiLkdST1VQX1NFUCxiLkRFQ0lNQUxfU0VQLGUpLnJlcGxhY2UoZixjKX19ZnVuY3Rpb24gU2QoYSl7dmFyIGI9YS5OVU1CRVJfRk9STUFUUztyZXR1cm4gZnVuY3Rpb24oYSxjKXtyZXR1cm4gbnVsbD09YT9hOlVkKGEsYi5QQVRURVJOU1swXSxiLkdST1VQX1NFUCxiLkRFQ0lNQUxfU0VQLGMpfX1mdW5jdGlvbiBjaChhKXt2YXIgYj0wLGQsYyxlLGYsZzstMTwoYz1hLmluZGV4T2YoVmQpKSYmCiAgICAoYT1hLnJlcGxhY2UoVmQsIiIpKTswPChlPWEuc2VhcmNoKC9lL2kpKT8oMD5jJiYoYz1lKSxjKz0rYS5zbGljZShlKzEpLGE9YS5zdWJzdHJpbmcoMCxlKSk6MD5jJiYoYz1hLmxlbmd0aCk7Zm9yKGU9MDthLmNoYXJBdChlKT09PUVjO2UrKyk7aWYoZT09PShnPWEubGVuZ3RoKSlkPVswXSxjPTE7ZWxzZXtmb3IoZy0tO2EuY2hhckF0KGcpPT09RWM7KWctLTtjLT1lO2Q9W107Zm9yKGY9MDtlPD1nO2UrKyxmKyspZFtmXT0rYS5jaGFyQXQoZSl9Yz5XZCYmKGQ9ZC5zcGxpY2UoMCxXZC0xKSxiPWMtMSxjPTEpO3JldHVybntkOmQsZTpiLGk6Y319ZnVuY3Rpb24gZGgoYSxiLGQsYyl7dmFyIGU9YS5kLGY9ZS5sZW5ndGgtYS5pO2I9eihiKT9NYXRoLm1pbihNYXRoLm1heChkLGYpLGMpOitiO2Q9YithLmk7Yz1lW2RdO2lmKDA8ZCl7ZS5zcGxpY2UoTWF0aC5tYXgoYS5pLGQpKTtmb3IodmFyIGc9ZDtnPGUubGVuZ3RoO2crKyllW2ddPTB9ZWxzZSBmb3IoZj1NYXRoLm1heCgwLGYpLGEuaT0KICAgICAgICAxLGUubGVuZ3RoPU1hdGgubWF4KDEsZD1iKzEpLGVbMF09MCxnPTE7ZzxkO2crKyllW2ddPTA7aWYoNTw9YylpZigwPmQtMSl7Zm9yKGM9MDtjPmQ7Yy0tKWUudW5zaGlmdCgwKSxhLmkrKztlLnVuc2hpZnQoMSk7YS5pKyt9ZWxzZSBlW2QtMV0rKztmb3IoO2Y8TWF0aC5tYXgoMCxiKTtmKyspZS5wdXNoKDApO2lmKGI9ZS5yZWR1Y2VSaWdodChmdW5jdGlvbihhLGIsYyxkKXtiKz1hO2RbY109YiUxMDtyZXR1cm4gTWF0aC5mbG9vcihiLzEwKX0sMCkpZS51bnNoaWZ0KGIpLGEuaSsrfWZ1bmN0aW9uIFVkKGEsYixkLGMsZSl7aWYoIUEoYSkmJiFXKGEpfHxpc05hTihhKSlyZXR1cm4iIjt2YXIgZj0haXNGaW5pdGUoYSksZz0hMSxrPU1hdGguYWJzKGEpKyIiLGg9IiI7aWYoZiloPSJcdTIyMWUiO2Vsc2V7Zz1jaChrKTtkaChnLGUsYi5taW5GcmFjLGIubWF4RnJhYyk7aD1nLmQ7az1nLmk7ZT1nLmU7Zj1bXTtmb3IoZz1oLnJlZHVjZShmdW5jdGlvbihhLGIpe3JldHVybiBhJiYhYn0sCiAgICAgICAgITApOzA+azspaC51bnNoaWZ0KDApLGsrKzswPGs/Zj1oLnNwbGljZShrLGgubGVuZ3RoKTooZj1oLGg9WzBdKTtrPVtdO2ZvcihoLmxlbmd0aD49Yi5sZ1NpemUmJmsudW5zaGlmdChoLnNwbGljZSgtYi5sZ1NpemUsaC5sZW5ndGgpLmpvaW4oIiIpKTtoLmxlbmd0aD5iLmdTaXplOylrLnVuc2hpZnQoaC5zcGxpY2UoLWIuZ1NpemUsaC5sZW5ndGgpLmpvaW4oIiIpKTtoLmxlbmd0aCYmay51bnNoaWZ0KGguam9pbigiIikpO2g9ay5qb2luKGQpO2YubGVuZ3RoJiYoaCs9YytmLmpvaW4oIiIpKTtlJiYoaCs9ImUrIitlKX1yZXR1cm4gMD5hJiYhZz9iLm5lZ1ByZStoK2IubmVnU3VmOmIucG9zUHJlK2grYi5wb3NTdWZ9ZnVuY3Rpb24gT2IoYSxiLGQsYyl7dmFyIGU9IiI7aWYoMD5hfHxjJiYwPj1hKWM/YT0tYSsxOihhPS1hLGU9Ii0iKTtmb3IoYT0iIithO2EubGVuZ3RoPGI7KWE9RWMrYTtkJiYoYT1hLnN1YnN0cihhLmxlbmd0aC1iKSk7cmV0dXJuIGUrYX1mdW5jdGlvbiBlYShhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYixkLGMsZSl7ZD1kfHwwO3JldHVybiBmdW5jdGlvbihmKXtmPWZbImdldCIrYV0oKTtpZigwPGR8fGY+LWQpZis9ZDswPT09ZiYmLTEyPT09ZCYmKGY9MTIpO3JldHVybiBPYihmLGIsYyxlKX19ZnVuY3Rpb24ga2IoYSxiLGQpe3JldHVybiBmdW5jdGlvbihjLGUpe3ZhciBmPWNbImdldCIrYV0oKSxnPXViKChkPyJTVEFOREFMT05FIjoiIikrKGI/IlNIT1JUIjoiIikrYSk7cmV0dXJuIGVbZ11bZl19fWZ1bmN0aW9uIFhkKGEpe3ZhciBiPShuZXcgRGF0ZShhLDAsMSkpLmdldERheSgpO3JldHVybiBuZXcgRGF0ZShhLDAsKDQ+PWI/NToxMiktYil9ZnVuY3Rpb24gWWQoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBkPVhkKGIuZ2V0RnVsbFllYXIoKSk7Yj0rbmV3IERhdGUoYi5nZXRGdWxsWWVhcigpLGIuZ2V0TW9udGgoKSxiLmdldERhdGUoKSsoNC1iLmdldERheSgpKSktK2Q7Yj0xK01hdGgucm91bmQoYi82MDQ4RTUpO3JldHVybiBPYihiLGEpfX1mdW5jdGlvbiBGYyhhLGIpe3JldHVybiAwPj0KICAgIGEuZ2V0RnVsbFllYXIoKT9iLkVSQVNbMF06Yi5FUkFTWzFdfWZ1bmN0aW9uIFJkKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGI7aWYoYj1hLm1hdGNoKGQpKXthPW5ldyBEYXRlKDApO3ZhciBmPTAsZz0wLGs9Yls4XT9hLnNldFVUQ0Z1bGxZZWFyOmEuc2V0RnVsbFllYXIsaD1iWzhdP2Euc2V0VVRDSG91cnM6YS5zZXRIb3VycztiWzldJiYoZj1mYShiWzldK2JbMTBdKSxnPWZhKGJbOV0rYlsxMV0pKTtrLmNhbGwoYSxmYShiWzFdKSxmYShiWzJdKS0xLGZhKGJbM10pKTtmPWZhKGJbNF18fDApLWY7Zz1mYShiWzVdfHwwKS1nO2s9ZmEoYls2XXx8MCk7Yj1NYXRoLnJvdW5kKDFFMypwYXJzZUZsb2F0KCIwLiIrKGJbN118fDApKSk7aC5jYWxsKGEsZixnLGssYil9cmV0dXJuIGF9dmFyIGQ9L14oXGR7NH0pLT8oXGRcZCktPyhcZFxkKSg/OlQoXGRcZCkoPzo6PyhcZFxkKSg/Ojo/KFxkXGQpKD86XC4oXGQrKSk/KT8pPyhafChbKy1dKShcZFxkKTo/KFxkXGQpKT8pPyQvO3JldHVybiBmdW5jdGlvbihjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQsZil7dmFyIGc9IiIsaz1bXSxoLGw7ZD1kfHwibWVkaXVtRGF0ZSI7ZD1hLkRBVEVUSU1FX0ZPUk1BVFNbZF18fGQ7QShjKSYmKGM9ZWgudGVzdChjKT9mYShjKTpiKGMpKTtXKGMpJiYoYz1uZXcgRGF0ZShjKSk7aWYoIWhhKGMpfHwhaXNGaW5pdGUoYy5nZXRUaW1lKCkpKXJldHVybiBjO2Zvcig7ZDspKGw9ZmguZXhlYyhkKSk/KGs9ZGIoayxsLDEpLGQ9ay5wb3AoKSk6KGsucHVzaChkKSxkPW51bGwpO3ZhciBtPWMuZ2V0VGltZXpvbmVPZmZzZXQoKTtmJiYobT1lYyhmLG0pLGM9ZmMoYyxmLCEwKSk7cihrLGZ1bmN0aW9uKGIpe2g9Z2hbYl07Zys9aD9oKGMsYS5EQVRFVElNRV9GT1JNQVRTLG0pOiInJyI9PT1iPyInIjpiLnJlcGxhY2UoLyheJ3wnJCkvZywiIikucmVwbGFjZSgvJycvZywiJyIpfSk7cmV0dXJuIGd9fWZ1bmN0aW9uIFlnKCl7cmV0dXJuIGZ1bmN0aW9uKGEsYil7eihiKSYmKGI9Mik7cmV0dXJuIGViKGEsYil9fWZ1bmN0aW9uIFpnKCl7cmV0dXJuIGZ1bmN0aW9uKGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYixkKXtiPUluZmluaXR5PT09TWF0aC5hYnMoTnVtYmVyKGIpKT9OdW1iZXIoYik6ZmEoYik7aWYoWChiKSlyZXR1cm4gYTtXKGEpJiYoYT1hLnRvU3RyaW5nKCkpO2lmKCF5YShhKSlyZXR1cm4gYTtkPSFkfHxpc05hTihkKT8wOmZhKGQpO2Q9MD5kP01hdGgubWF4KDAsYS5sZW5ndGgrZCk6ZDtyZXR1cm4gMDw9Yj9HYyhhLGQsZCtiKTowPT09ZD9HYyhhLGIsYS5sZW5ndGgpOkdjKGEsTWF0aC5tYXgoMCxkK2IpLGQpfX1mdW5jdGlvbiBHYyhhLGIsZCl7cmV0dXJuIEEoYSk/YS5zbGljZShiLGQpOkhhLmNhbGwoYSxiLGQpfWZ1bmN0aW9uIFRkKGEpe2Z1bmN0aW9uIGIoYil7cmV0dXJuIGIubWFwKGZ1bmN0aW9uKGIpe3ZhciBjPTEsZD1UYTtpZihCKGIpKWQ9YjtlbHNlIGlmKEEoYikpe2lmKCIrIj09PWIuY2hhckF0KDApfHwiLSI9PT1iLmNoYXJBdCgwKSljPSItIj09PWIuY2hhckF0KDApPy0xOjEsYj1iLnN1YnN0cmluZygxKTtpZigiIiE9PWImJihkPWEoYiksZC5jb25zdGFudCkpdmFyIGU9CiAgICAgICAgZCgpLGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGFbZV19fXJldHVybntnZXQ6ZCxkZXNjZW5kaW5nOmN9fSl9ZnVuY3Rpb24gZChhKXtzd2l0Y2godHlwZW9mIGEpe2Nhc2UgIm51bWJlciI6Y2FzZSAiYm9vbGVhbiI6Y2FzZSAic3RyaW5nIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBjKGEsYil7dmFyIGM9MCxkPWEudHlwZSxoPWIudHlwZTtpZihkPT09aCl7dmFyIGg9YS52YWx1ZSxsPWIudmFsdWU7InN0cmluZyI9PT1kPyhoPWgudG9Mb3dlckNhc2UoKSxsPWwudG9Mb3dlckNhc2UoKSk6Im9iamVjdCI9PT1kJiYoRChoKSYmKGg9YS5pbmRleCksRChsKSYmKGw9Yi5pbmRleCkpO2ghPT1sJiYoYz1oPGw/LTE6MSl9ZWxzZSBjPSJ1bmRlZmluZWQiPT09ZD8xOiJ1bmRlZmluZWQiPT09aD8tMToibnVsbCI9PT1kPzE6Im51bGwiPT09aD8tMTpkPGg/LTE6MTtyZXR1cm4gY31yZXR1cm4gZnVuY3Rpb24oYSxmLGcsayl7aWYobnVsbD09YSlyZXR1cm4gYTtpZigheWEoYSkpdGhyb3cgRigib3JkZXJCeSIpKCJub3RhcnJheSIsCiAgICAgICAgYSk7SChmKXx8KGY9W2ZdKTswPT09Zi5sZW5ndGgmJihmPVsiKyJdKTt2YXIgaD1iKGYpLGw9Zz8tMToxLG09QihrKT9rOmM7YT1BcnJheS5wcm90b3R5cGUubWFwLmNhbGwoYSxmdW5jdGlvbihhLGIpe3JldHVybnt2YWx1ZTphLHRpZUJyZWFrZXI6e3ZhbHVlOmIsdHlwZToibnVtYmVyIixpbmRleDpifSxwcmVkaWNhdGVWYWx1ZXM6aC5tYXAoZnVuY3Rpb24oYyl7dmFyIGU9Yy5nZXQoYSk7Yz10eXBlb2YgZTtpZihudWxsPT09ZSljPSJudWxsIjtlbHNlIGlmKCJvYmplY3QiPT09YylhOntpZihCKGUudmFsdWVPZikmJihlPWUudmFsdWVPZigpLGQoZSkpKWJyZWFrIGE7YmMoZSkmJihlPWUudG9TdHJpbmcoKSxkKGUpKX1yZXR1cm57dmFsdWU6ZSx0eXBlOmMsaW5kZXg6Yn19KX19KTthLnNvcnQoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9MCxlPWgubGVuZ3RoO2Q8ZTtkKyspe3ZhciBmPW0oYS5wcmVkaWNhdGVWYWx1ZXNbZF0sYi5wcmVkaWNhdGVWYWx1ZXNbZF0pO2lmKGYpcmV0dXJuIGYqCiAgICAgICAgaFtkXS5kZXNjZW5kaW5nKmx9cmV0dXJuKG0oYS50aWVCcmVha2VyLGIudGllQnJlYWtlcil8fGMoYS50aWVCcmVha2VyLGIudGllQnJlYWtlcikpKmx9KTtyZXR1cm4gYT1hLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS52YWx1ZX0pfX1mdW5jdGlvbiBSYShhKXtCKGEpJiYoYT17bGluazphfSk7YS5yZXN0cmljdD1hLnJlc3RyaWN0fHwiQUMiO3JldHVybiBpYShhKX1mdW5jdGlvbiBQYihhLGIsZCxjLGUpe3RoaXMuJCRjb250cm9scz1bXTt0aGlzLiRlcnJvcj17fTt0aGlzLiQkc3VjY2Vzcz17fTt0aGlzLiRwZW5kaW5nPXZvaWQgMDt0aGlzLiRuYW1lPWUoYi5uYW1lfHxiLm5nRm9ybXx8IiIpKGQpO3RoaXMuJGRpcnR5PSExO3RoaXMuJHZhbGlkPXRoaXMuJHByaXN0aW5lPSEwO3RoaXMuJHN1Ym1pdHRlZD10aGlzLiRpbnZhbGlkPSExO3RoaXMuJCRwYXJlbnRGb3JtPWxiO3RoaXMuJCRlbGVtZW50PWE7dGhpcy4kJGFuaW1hdGU9YztaZCh0aGlzKX1mdW5jdGlvbiBaZChhKXthLiQkY2xhc3NDYWNoZT0KICAgICAgICB7fTthLiQkY2xhc3NDYWNoZVskZF09IShhLiQkY2xhc3NDYWNoZVttYl09YS4kJGVsZW1lbnQuaGFzQ2xhc3MobWIpKX1mdW5jdGlvbiBhZShhKXtmdW5jdGlvbiBiKGEsYixjKXtjJiYhYS4kJGNsYXNzQ2FjaGVbYl0/KGEuJCRhbmltYXRlLmFkZENsYXNzKGEuJCRlbGVtZW50LGIpLGEuJCRjbGFzc0NhY2hlW2JdPSEwKTohYyYmYS4kJGNsYXNzQ2FjaGVbYl0mJihhLiQkYW5pbWF0ZS5yZW1vdmVDbGFzcyhhLiQkZWxlbWVudCxiKSxhLiQkY2xhc3NDYWNoZVtiXT0hMSl9ZnVuY3Rpb24gZChhLGMsZCl7Yz1jPyItIitWYyhjLCItIik6IiI7YihhLG1iK2MsITA9PT1kKTtiKGEsJGQrYywhMT09PWQpfXZhciBjPWEuc2V0LGU9YS51bnNldDthLmNsYXp6LnByb3RvdHlwZS4kc2V0VmFsaWRpdHk9ZnVuY3Rpb24oYSxnLGspe3ooZyk/KHRoaXMuJHBlbmRpbmd8fCh0aGlzLiRwZW5kaW5nPXt9KSxjKHRoaXMuJHBlbmRpbmcsYSxrKSk6KHRoaXMuJHBlbmRpbmcmJmUodGhpcy4kcGVuZGluZywKICAgICAgICBhLGspLGJlKHRoaXMuJHBlbmRpbmcpJiYodGhpcy4kcGVuZGluZz12b2lkIDApKTtHYShnKT9nPyhlKHRoaXMuJGVycm9yLGEsayksYyh0aGlzLiQkc3VjY2VzcyxhLGspKTooYyh0aGlzLiRlcnJvcixhLGspLGUodGhpcy4kJHN1Y2Nlc3MsYSxrKSk6KGUodGhpcy4kZXJyb3IsYSxrKSxlKHRoaXMuJCRzdWNjZXNzLGEsaykpO3RoaXMuJHBlbmRpbmc/KGIodGhpcywibmctcGVuZGluZyIsITApLHRoaXMuJHZhbGlkPXRoaXMuJGludmFsaWQ9dm9pZCAwLGQodGhpcywiIixudWxsKSk6KGIodGhpcywibmctcGVuZGluZyIsITEpLHRoaXMuJHZhbGlkPWJlKHRoaXMuJGVycm9yKSx0aGlzLiRpbnZhbGlkPSF0aGlzLiR2YWxpZCxkKHRoaXMsIiIsdGhpcy4kdmFsaWQpKTtnPXRoaXMuJHBlbmRpbmcmJnRoaXMuJHBlbmRpbmdbYV0/dm9pZCAwOnRoaXMuJGVycm9yW2FdPyExOnRoaXMuJCRzdWNjZXNzW2FdPyEwOm51bGw7ZCh0aGlzLGEsZyk7dGhpcy4kJHBhcmVudEZvcm0uJHNldFZhbGlkaXR5KGEsCiAgICAgICAgZyx0aGlzKX19ZnVuY3Rpb24gYmUoYSl7aWYoYSlmb3IodmFyIGIgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGIpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIEhjKGEpe2EuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbihiKXtyZXR1cm4gYS4kaXNFbXB0eShiKT9iOmIudG9TdHJpbmcoKX0pfWZ1bmN0aW9uIFNhKGEsYixkLGMsZSxmKXt2YXIgZz1LKGJbMF0udHlwZSk7aWYoIWUuYW5kcm9pZCl7dmFyIGs9ITE7Yi5vbigiY29tcG9zaXRpb25zdGFydCIsZnVuY3Rpb24oKXtrPSEwfSk7Yi5vbigiY29tcG9zaXRpb251cGRhdGUiLGZ1bmN0aW9uKGEpe2lmKHooYS5kYXRhKXx8IiI9PT1hLmRhdGEpaz0hMX0pO2Iub24oImNvbXBvc2l0aW9uZW5kIixmdW5jdGlvbigpe2s9ITE7bCgpfSl9dmFyIGgsbD1mdW5jdGlvbihhKXtoJiYoZi5kZWZlci5jYW5jZWwoaCksaD1udWxsKTtpZighayl7dmFyIGU9Yi52YWwoKTthPWEmJmEudHlwZTsicGFzc3dvcmQiPT09Z3x8ZC5uZ1RyaW0mJgogICAgImZhbHNlIj09PWQubmdUcmltfHwoZT1VKGUpKTsoYy4kdmlld1ZhbHVlIT09ZXx8IiI9PT1lJiZjLiQkaGFzTmF0aXZlVmFsaWRhdG9ycykmJmMuJHNldFZpZXdWYWx1ZShlLGEpfX07aWYoZS5oYXNFdmVudCgiaW5wdXQiKSliLm9uKCJpbnB1dCIsbCk7ZWxzZXt2YXIgbT1mdW5jdGlvbihhLGIsYyl7aHx8KGg9Zi5kZWZlcihmdW5jdGlvbigpe2g9bnVsbDtiJiZiLnZhbHVlPT09Y3x8bChhKX0pKX07Yi5vbigia2V5ZG93biIsZnVuY3Rpb24oYSl7dmFyIGI9YS5rZXlDb2RlOzkxPT09Ynx8MTU8YiYmMTk+Ynx8Mzc8PWImJjQwPj1ifHxtKGEsdGhpcyx0aGlzLnZhbHVlKX0pO2lmKGUuaGFzRXZlbnQoInBhc3RlIikpYi5vbigicGFzdGUgY3V0IGRyb3AiLG0pfWIub24oImNoYW5nZSIsbCk7aWYoY2VbZ10mJmMuJCRoYXNOYXRpdmVWYWxpZGF0b3JzJiZnPT09ZC50eXBlKWIub24oImtleWRvd24gd2hlZWwgbW91c2Vkb3duIixmdW5jdGlvbihhKXtpZighaCl7dmFyIGI9dGhpcy52YWxpZGl0eSwKICAgICAgICBjPWIuYmFkSW5wdXQsZD1iLnR5cGVNaXNtYXRjaDtoPWYuZGVmZXIoZnVuY3Rpb24oKXtoPW51bGw7Yi5iYWRJbnB1dD09PWMmJmIudHlwZU1pc21hdGNoPT09ZHx8bChhKX0pfX0pO2MuJHJlbmRlcj1mdW5jdGlvbigpe3ZhciBhPWMuJGlzRW1wdHkoYy4kdmlld1ZhbHVlKT8iIjpjLiR2aWV3VmFsdWU7Yi52YWwoKSE9PWEmJmIudmFsKGEpfX1mdW5jdGlvbiBRYihhLGIpe3JldHVybiBmdW5jdGlvbihkLGMpe3ZhciBlLGY7aWYoaGEoZCkpcmV0dXJuIGQ7aWYoQShkKSl7JyInPT09ZC5jaGFyQXQoMCkmJiciJz09PWQuY2hhckF0KGQubGVuZ3RoLTEpJiYoZD1kLnN1YnN0cmluZygxLGQubGVuZ3RoLTEpKTtpZihoaC50ZXN0KGQpKXJldHVybiBuZXcgRGF0ZShkKTthLmxhc3RJbmRleD0wO2lmKGU9YS5leGVjKGQpKXJldHVybiBlLnNoaWZ0KCksZj1jP3t5eXl5OmMuZ2V0RnVsbFllYXIoKSxNTTpjLmdldE1vbnRoKCkrMSxkZDpjLmdldERhdGUoKSxISDpjLmdldEhvdXJzKCksbW06Yy5nZXRNaW51dGVzKCksCiAgICAgICAgc3M6Yy5nZXRTZWNvbmRzKCksc3NzOmMuZ2V0TWlsbGlzZWNvbmRzKCkvMUUzfTp7eXl5eToxOTcwLE1NOjEsZGQ6MSxISDowLG1tOjAsc3M6MCxzc3M6MH0scihlLGZ1bmN0aW9uKGEsYyl7YzxiLmxlbmd0aCYmKGZbYltjXV09K2EpfSksZT1uZXcgRGF0ZShmLnl5eXksZi5NTS0xLGYuZGQsZi5ISCxmLm1tLGYuc3N8fDAsMUUzKmYuc3NzfHwwKSwxMDA+Zi55eXl5JiZlLnNldEZ1bGxZZWFyKGYueXl5eSksZX1yZXR1cm4gTmFOfX1mdW5jdGlvbiBuYihhLGIsZCxjKXtyZXR1cm4gZnVuY3Rpb24oZSxmLGcsayxoLGwsbSxwKXtmdW5jdGlvbiBuKGEpe3JldHVybiBhJiYhKGEuZ2V0VGltZSYmYS5nZXRUaW1lKCkhPT1hLmdldFRpbWUoKSl9ZnVuY3Rpb24gcyhhKXtyZXR1cm4gdyhhKSYmIWhhKGEpP3IoYSl8fHZvaWQgMDphfWZ1bmN0aW9uIHIoYSxiKXt2YXIgYz1rLiRvcHRpb25zLmdldE9wdGlvbigidGltZXpvbmUiKTt2JiZ2IT09YyYmKGI9U2MoYixlYyh2KSkpO3ZhciBlPWQoYSwKICAgICAgICBiKTshaXNOYU4oZSkmJmMmJihlPWZjKGUsYykpO3JldHVybiBlfUljKGUsZixnLGssYSk7U2EoZSxmLGcsayxoLGwpO3ZhciB0PSJ0aW1lIj09PWF8fCJkYXRldGltZWxvY2FsIj09PWEscSx2O2suJHBhcnNlcnMucHVzaChmdW5jdGlvbihjKXtpZihrLiRpc0VtcHR5KGMpKXJldHVybiBudWxsO2lmKGIudGVzdChjKSlyZXR1cm4gcihjLHEpO2suJCRwYXJzZXJOYW1lPWF9KTtrLiRmb3JtYXR0ZXJzLnB1c2goZnVuY3Rpb24oYSl7aWYoYSYmIWhhKGEpKXRocm93IG9iKCJkYXRlZm10IixhKTtpZihuKGEpKXtxPWE7dmFyIGI9ay4kb3B0aW9ucy5nZXRPcHRpb24oInRpbWV6b25lIik7YiYmKHY9YixxPWZjKHEsYiwhMCkpO3ZhciBkPWM7dCYmQShrLiRvcHRpb25zLmdldE9wdGlvbigidGltZVNlY29uZHNGb3JtYXQiKSkmJihkPWMucmVwbGFjZSgic3Muc3NzIixrLiRvcHRpb25zLmdldE9wdGlvbigidGltZVNlY29uZHNGb3JtYXQiKSkucmVwbGFjZSgvOiQvLCIiKSk7YT1tKCJkYXRlIikoYSwKICAgICAgICBkLGIpO3QmJmsuJG9wdGlvbnMuZ2V0T3B0aW9uKCJ0aW1lU3RyaXBaZXJvU2Vjb25kcyIpJiYoYT1hLnJlcGxhY2UoLyg/OjowMCk/KD86XC4wMDApPyQvLCIiKSk7cmV0dXJuIGF9dj1xPW51bGw7cmV0dXJuIiJ9KTtpZih3KGcubWluKXx8Zy5uZ01pbil7dmFyIHg9Zy5taW58fHAoZy5uZ01pbikoZSksQj1zKHgpO2suJHZhbGlkYXRvcnMubWluPWZ1bmN0aW9uKGEpe3JldHVybiFuKGEpfHx6KEIpfHxkKGEpPj1CfTtnLiRvYnNlcnZlKCJtaW4iLGZ1bmN0aW9uKGEpe2EhPT14JiYoQj1zKGEpLHg9YSxrLiR2YWxpZGF0ZSgpKX0pfWlmKHcoZy5tYXgpfHxnLm5nTWF4KXt2YXIgeT1nLm1heHx8cChnLm5nTWF4KShlKSxKPXMoeSk7ay4kdmFsaWRhdG9ycy5tYXg9ZnVuY3Rpb24oYSl7cmV0dXJuIW4oYSl8fHooSil8fGQoYSk8PUp9O2cuJG9ic2VydmUoIm1heCIsZnVuY3Rpb24oYSl7YSE9PXkmJihKPXMoYSkseT1hLGsuJHZhbGlkYXRlKCkpfSl9fX1mdW5jdGlvbiBJYyhhLGIsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLGUpeyhjLiQkaGFzTmF0aXZlVmFsaWRhdG9ycz1EKGJbMF0udmFsaWRpdHkpKSYmYy4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKGEpe3ZhciBkPWIucHJvcCgidmFsaWRpdHkiKXx8e307aWYoZC5iYWRJbnB1dHx8ZC50eXBlTWlzbWF0Y2gpYy4kJHBhcnNlck5hbWU9ZTtlbHNlIHJldHVybiBhfSl9ZnVuY3Rpb24gZGUoYSl7YS4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKGIpe2lmKGEuJGlzRW1wdHkoYikpcmV0dXJuIG51bGw7aWYoaWgudGVzdChiKSlyZXR1cm4gcGFyc2VGbG9hdChiKTthLiQkcGFyc2VyTmFtZT0ibnVtYmVyIn0pO2EuJGZvcm1hdHRlcnMucHVzaChmdW5jdGlvbihiKXtpZighYS4kaXNFbXB0eShiKSl7aWYoIVcoYikpdGhyb3cgb2IoIm51bWZtdCIsYik7Yj1iLnRvU3RyaW5nKCl9cmV0dXJuIGJ9KX1mdW5jdGlvbiBuYShhKXt3KGEpJiYhVyhhKSYmKGE9cGFyc2VGbG9hdChhKSk7cmV0dXJuIFgoYSk/dm9pZCAwOmF9ZnVuY3Rpb24gSmMoYSl7dmFyIGI9YS50b1N0cmluZygpLAogICAgICAgIGQ9Yi5pbmRleE9mKCIuIik7cmV0dXJuLTE9PT1kPy0xPGEmJjE+YSYmKGE9L2UtKFxkKykkLy5leGVjKGIpKT9OdW1iZXIoYVsxXSk6MDpiLmxlbmd0aC1kLTF9ZnVuY3Rpb24gZWUoYSxiLGQpe2E9TnVtYmVyKGEpO3ZhciBjPShhfDApIT09YSxlPShifDApIT09YixmPShkfDApIT09ZDtpZihjfHxlfHxmKXt2YXIgZz1jP0pjKGEpOjAsaz1lP0pjKGIpOjAsaD1mP0pjKGQpOjAsZz1NYXRoLm1heChnLGssaCksZz1NYXRoLnBvdygxMCxnKTthKj1nO2IqPWc7ZCo9ZztjJiYoYT1NYXRoLnJvdW5kKGEpKTtlJiYoYj1NYXRoLnJvdW5kKGIpKTtmJiYoZD1NYXRoLnJvdW5kKGQpKX1yZXR1cm4gMD09PShhLWIpJWR9ZnVuY3Rpb24gZmUoYSxiLGQsYyxlKXtpZih3KGMpKXthPWEoYyk7aWYoIWEuY29uc3RhbnQpdGhyb3cgb2IoImNvbnN0ZXhwciIsZCxjKTtyZXR1cm4gYShiKX1yZXR1cm4gZX1mdW5jdGlvbiBLYyhhLGIpe2Z1bmN0aW9uIGQoYSxiKXtpZighYXx8IWEubGVuZ3RoKXJldHVybltdOwogICAgICAgIGlmKCFifHwhYi5sZW5ndGgpcmV0dXJuIGE7dmFyIGM9W10sZD0wO2E6Zm9yKDtkPGEubGVuZ3RoO2QrKyl7Zm9yKHZhciBlPWFbZF0sbT0wO208Yi5sZW5ndGg7bSsrKWlmKGU9PT1iW21dKWNvbnRpbnVlIGE7Yy5wdXNoKGUpfXJldHVybiBjfWZ1bmN0aW9uIGMoYSl7aWYoIWEpcmV0dXJuIGE7dmFyIGI9YTtIKGEpP2I9YS5tYXAoYykuam9pbigiICIpOkQoYSk/Yj1PYmplY3Qua2V5cyhhKS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGFbYl19KS5qb2luKCIgIik6QShhKXx8KGI9YSsiIik7cmV0dXJuIGJ9YT0ibmdDbGFzcyIrYTt2YXIgZTtyZXR1cm5bIiRwYXJzZSIsZnVuY3Rpb24oZil7cmV0dXJue3Jlc3RyaWN0OiJBQyIsbGluazpmdW5jdGlvbihnLGssaCl7ZnVuY3Rpb24gbChhLGIpe3ZhciBjPVtdO3IoYSxmdW5jdGlvbihhKXtpZigwPGJ8fHBbYV0pcFthXT0ocFthXXx8MCkrYixwW2FdPT09KygwPGIpJiZjLnB1c2goYSl9KTtyZXR1cm4gYy5qb2luKCIgIil9ZnVuY3Rpb24gbShhKXtpZihhPT09CiAgICAgICAgICAgIGIpe3ZhciBjPXMsYz1sKGMmJmMuc3BsaXQoIiAiKSwxKTtoLiRhZGRDbGFzcyhjKX1lbHNlIGM9cyxjPWwoYyYmYy5zcGxpdCgiICIpLC0xKSxoLiRyZW1vdmVDbGFzcyhjKTtuPWF9dmFyIHA9ay5kYXRhKCIkY2xhc3NDb3VudHMiKSxuPSEwLHM7cHx8KHA9VCgpLGsuZGF0YSgiJGNsYXNzQ291bnRzIixwKSk7Im5nQ2xhc3MiIT09YSYmKGV8fChlPWYoIiRpbmRleCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEmMX0pKSxnLiR3YXRjaChlLG0pKTtnLiR3YXRjaChmKGhbYV0sYyksZnVuY3Rpb24oYSl7aWYobj09PWIpe3ZhciBjPXMmJnMuc3BsaXQoIiAiKSxlPWEmJmEuc3BsaXQoIiAiKSxmPWQoYyxlKSxjPWQoZSxjKSxmPWwoZiwtMSksYz1sKGMsMSk7aC4kYWRkQ2xhc3MoYyk7aC4kcmVtb3ZlQ2xhc3MoZil9cz1hfSl9fX1dfWZ1bmN0aW9uIHFkKGEsYixkLGMsZSxmKXtyZXR1cm57cmVzdHJpY3Q6IkEiLGNvbXBpbGU6ZnVuY3Rpb24oZyxrKXt2YXIgaD1hKGtbY10pO3JldHVybiBmdW5jdGlvbihhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyl7Yy5vbihlLGZ1bmN0aW9uKGMpe3ZhciBlPWZ1bmN0aW9uKCl7aChhLHskZXZlbnQ6Y30pfTtpZihiLiQkcGhhc2UpaWYoZilhLiRldmFsQXN5bmMoZSk7ZWxzZSB0cnl7ZSgpfWNhdGNoKGcpe2QoZyl9ZWxzZSBhLiRhcHBseShlKX0pfX19fWZ1bmN0aW9uIFJiKGEsYixkLGMsZSxmLGcsayxoKXt0aGlzLiRtb2RlbFZhbHVlPXRoaXMuJHZpZXdWYWx1ZT1OdW1iZXIuTmFOO3RoaXMuJCRyYXdNb2RlbFZhbHVlPXZvaWQgMDt0aGlzLiR2YWxpZGF0b3JzPXt9O3RoaXMuJGFzeW5jVmFsaWRhdG9ycz17fTt0aGlzLiRwYXJzZXJzPVtdO3RoaXMuJGZvcm1hdHRlcnM9W107dGhpcy4kdmlld0NoYW5nZUxpc3RlbmVycz1bXTt0aGlzLiR1bnRvdWNoZWQ9ITA7dGhpcy4kdG91Y2hlZD0hMTt0aGlzLiRwcmlzdGluZT0hMDt0aGlzLiRkaXJ0eT0hMTt0aGlzLiR2YWxpZD0hMDt0aGlzLiRpbnZhbGlkPSExO3RoaXMuJGVycm9yPXt9O3RoaXMuJCRzdWNjZXNzPXt9O3RoaXMuJHBlbmRpbmc9CiAgICAgICAgdm9pZCAwO3RoaXMuJG5hbWU9aChkLm5hbWV8fCIiLCExKShhKTt0aGlzLiQkcGFyZW50Rm9ybT1sYjt0aGlzLiRvcHRpb25zPVNiO3RoaXMuJCR1cGRhdGVFdmVudHM9IiI7dGhpcy4kJHVwZGF0ZUV2ZW50SGFuZGxlcj10aGlzLiQkdXBkYXRlRXZlbnRIYW5kbGVyLmJpbmQodGhpcyk7dGhpcy4kJHBhcnNlZE5nTW9kZWw9ZShkLm5nTW9kZWwpO3RoaXMuJCRwYXJzZWROZ01vZGVsQXNzaWduPXRoaXMuJCRwYXJzZWROZ01vZGVsLmFzc2lnbjt0aGlzLiQkbmdNb2RlbEdldD10aGlzLiQkcGFyc2VkTmdNb2RlbDt0aGlzLiQkbmdNb2RlbFNldD10aGlzLiQkcGFyc2VkTmdNb2RlbEFzc2lnbjt0aGlzLiQkcGVuZGluZ0RlYm91bmNlPW51bGw7dGhpcy4kJHBhcnNlclZhbGlkPXZvaWQgMDt0aGlzLiQkcGFyc2VyTmFtZT0icGFyc2UiO3RoaXMuJCRjdXJyZW50VmFsaWRhdGlvblJ1bklkPTA7dGhpcy4kJHNjb3BlPWE7dGhpcy4kJHJvb3RTY29wZT1hLiRyb290O3RoaXMuJCRhdHRyPWQ7CiAgICAgICAgdGhpcy4kJGVsZW1lbnQ9Yzt0aGlzLiQkYW5pbWF0ZT1mO3RoaXMuJCR0aW1lb3V0PWc7dGhpcy4kJHBhcnNlPWU7dGhpcy4kJHE9azt0aGlzLiQkZXhjZXB0aW9uSGFuZGxlcj1iO1pkKHRoaXMpO2poKHRoaXMpfWZ1bmN0aW9uIGpoKGEpe2EuJCRzY29wZS4kd2F0Y2goZnVuY3Rpb24oYil7Yj1hLiQkbmdNb2RlbEdldChiKTtiPT09YS4kbW9kZWxWYWx1ZXx8YS4kbW9kZWxWYWx1ZSE9PWEuJG1vZGVsVmFsdWUmJmIhPT1ifHxhLiQkc2V0TW9kZWxWYWx1ZShiKTtyZXR1cm4gYn0pfWZ1bmN0aW9uIExjKGEpe3RoaXMuJCRvcHRpb25zPWF9ZnVuY3Rpb24gZ2UoYSxiKXtyKGIsZnVuY3Rpb24oYixjKXt3KGFbY10pfHwoYVtjXT1iKX0pfWZ1bmN0aW9uIE9hKGEsYil7YS5wcm9wKCJzZWxlY3RlZCIsYik7YS5hdHRyKCJzZWxlY3RlZCIsYil9ZnVuY3Rpb24gaGUoYSxiLGQpe2lmKGEpe0EoYSkmJihhPW5ldyBSZWdFeHAoIl4iK2ErIiQiKSk7aWYoIWEudGVzdCl0aHJvdyBGKCJuZ1BhdHRlcm4iKSgibm9yZWdleHAiLAogICAgICAgIGIsYSx6YShkKSk7cmV0dXJuIGF9fWZ1bmN0aW9uIFRiKGEpe2E9ZmEoYSk7cmV0dXJuIFgoYSk/LTE6YX12YXIgV2I9e29iamVjdE1heERlcHRoOjUsdXJsRXJyb3JQYXJhbXNFbmFibGVkOiEwfSxpZT0vXlwvKC4rKVwvKFthLXpdKikkLyx0YT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEs9ZnVuY3Rpb24oYSl7cmV0dXJuIEEoYSk/YS50b0xvd2VyQ2FzZSgpOmF9LHViPWZ1bmN0aW9uKGEpe3JldHVybiBBKGEpP2EudG9VcHBlckNhc2UoKTphfSxDYSx4LHJiLEhhPVtdLnNsaWNlLEZnPVtdLnNwbGljZSxraD1bXS5wdXNoLGxhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsUGM9T2JqZWN0LmdldFByb3RvdHlwZU9mLHBhPUYoIm5nIiksY2E9Qy5hbmd1bGFyfHwoQy5hbmd1bGFyPXt9KSxrYyxwYj0wO0NhPUMuZG9jdW1lbnQuZG9jdW1lbnRNb2RlO3ZhciBYPU51bWJlci5pc05hTnx8ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT1hfTtFLiRpbmplY3Q9W107VGEuJGluamVjdD0KICAgICAgICBbXTt2YXIgdmU9L15cW29iamVjdCAoPzpVaW50OHxVaW50OENsYW1wZWR8VWludDE2fFVpbnQzMnxJbnQ4fEludDE2fEludDMyfEZsb2F0MzJ8RmxvYXQ2NClBcnJheV0kLyxVPWZ1bmN0aW9uKGEpe3JldHVybiBBKGEpP2EudHJpbSgpOmF9LE1kPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoLyhbLSgpW1xde30rPyouJF58LDojPCFcXF0pL2csIlxcJDEiKS5yZXBsYWNlKC9ceDA4L2csIlxceDA4Iil9LEFhPWZ1bmN0aW9uKCl7aWYoIXcoQWEucnVsZXMpKXt2YXIgYT1DLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIltuZy1jc3BdIil8fEMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiW2RhdGEtbmctY3NwXSIpO2lmKGEpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJuZy1jc3AiKXx8YS5nZXRBdHRyaWJ1dGUoImRhdGEtbmctY3NwIik7QWEucnVsZXM9e25vVW5zYWZlRXZhbDohYnx8LTEhPT1iLmluZGV4T2YoIm5vLXVuc2FmZS1ldmFsIiksbm9JbmxpbmVTdHlsZTohYnx8LTEhPT0KICAgICAgICAgICAgYi5pbmRleE9mKCJuby1pbmxpbmUtc3R5bGUiKX19ZWxzZXthPUFhO3RyeXtuZXcgRnVuY3Rpb24oIiIpLGI9ITF9Y2F0Y2goZCl7Yj0hMH1hLnJ1bGVzPXtub1Vuc2FmZUV2YWw6Yixub0lubGluZVN0eWxlOiExfX19cmV0dXJuIEFhLnJ1bGVzfSxxYj1mdW5jdGlvbigpe2lmKHcocWIubmFtZV8pKXJldHVybiBxYi5uYW1lXzt2YXIgYSxiLGQ9UWEubGVuZ3RoLGMsZTtmb3IoYj0wO2I8ZDsrK2IpaWYoYz1RYVtiXSxhPUMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiWyIrYy5yZXBsYWNlKCI6IiwiXFw6IikrImpxXSIpKXtlPWEuZ2V0QXR0cmlidXRlKGMrImpxIik7YnJlYWt9cmV0dXJuIHFiLm5hbWVfPWV9LHhlPS86L2csUWE9WyJuZy0iLCJkYXRhLW5nLSIsIm5nOiIsIngtbmctIl0sQmU9ZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50U2NyaXB0O2lmKCFiKXJldHVybiEwO2lmKCEoYiBpbnN0YW5jZW9mIEMuSFRNTFNjcmlwdEVsZW1lbnR8fGIgaW5zdGFuY2VvZiBDLlNWR1NjcmlwdEVsZW1lbnQpKXJldHVybiExOwogICAgICAgIGI9Yi5hdHRyaWJ1dGVzO3JldHVybltiLmdldE5hbWVkSXRlbSgic3JjIiksYi5nZXROYW1lZEl0ZW0oImhyZWYiKSxiLmdldE5hbWVkSXRlbSgieGxpbms6aHJlZiIpXS5ldmVyeShmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMDtpZighYi52YWx1ZSlyZXR1cm4hMTt2YXIgYz1hLmNyZWF0ZUVsZW1lbnQoImEiKTtjLmhyZWY9Yi52YWx1ZTtpZihhLmxvY2F0aW9uLm9yaWdpbj09PWMub3JpZ2luKXJldHVybiEwO3N3aXRjaChjLnByb3RvY29sKXtjYXNlICJodHRwOiI6Y2FzZSAiaHR0cHM6IjpjYXNlICJmdHA6IjpjYXNlICJibG9iOiI6Y2FzZSAiZmlsZToiOmNhc2UgImRhdGE6IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0pfShDLmRvY3VtZW50KSxFZT0vW0EtWl0vZyxXYz0hMSxQYT0zLEtlPXtmdWxsOiIxLjcuNyIsbWFqb3I6MSxtaW5vcjo3LGRvdDo3LGNvZGVOYW1lOiJraW5nbHktZXhpdGluZyJ9O1kuZXhwYW5kbz0ibmczMzkiO3ZhciBLYT1ZLmNhY2hlPXt9LHBnPQogICAgICAgIDE7WS5fZGF0YT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jYWNoZVthW3RoaXMuZXhwYW5kb11dfHx7fX07dmFyIGxnPS8tKFthLXpdKS9nLGxoPS9eLW1zLS8sQWI9e21vdXNlbGVhdmU6Im1vdXNlb3V0Iixtb3VzZWVudGVyOiJtb3VzZW92ZXIifSxuYz1GKCJqcUxpdGUiKSxvZz0vXjwoW1x3LV0rKVxzKlwvPz4oPzo8XC9cMT58KSQvLG1jPS88fCYjP1x3KzsvLG1nPS88KFtcdzotXSspLyxuZz0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6LV0rKVtePl0qKVwvPi9naSxvYT17b3B0aW9uOlsxLCc8c2VsZWN0IG11bHRpcGxlPSJtdWx0aXBsZSI+JywiPC9zZWxlY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLAogICAgICAgICAgICAiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtvYS5vcHRncm91cD1vYS5vcHRpb247b2EudGJvZHk9b2EudGZvb3Q9b2EuY29sZ3JvdXA9b2EuY2FwdGlvbj1vYS50aGVhZDtvYS50aD1vYS50ZDt2YXIgdWc9Qy5Ob2RlLnByb3RvdHlwZS5jb250YWluc3x8ZnVuY3Rpb24oYSl7cmV0dXJuISEodGhpcy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKSYxNil9LFdhPVkucHJvdG90eXBlPXtyZWFkeTpmZCx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciBhPVtdO3IodGhpcyxmdW5jdGlvbihiKXthLnB1c2goIiIrYil9KTtyZXR1cm4iWyIrYS5qb2luKCIsICIpKyJdIn0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8PWE/eCh0aGlzW2FdKTp4KHRoaXNbdGhpcy5sZW5ndGgrYV0pfSxsZW5ndGg6MCxwdXNoOmtoLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSxHYj17fTtyKCJtdWx0aXBsZSBzZWxlY3RlZCBjaGVja2VkIGRpc2FibGVkIHJlYWRPbmx5IHJlcXVpcmVkIG9wZW4iLnNwbGl0KCIgIiksCiAgICAgICAgZnVuY3Rpb24oYSl7R2JbSyhhKV09YX0pO3ZhciBtZD17fTtyKCJpbnB1dCBzZWxlY3Qgb3B0aW9uIHRleHRhcmVhIGJ1dHRvbiBmb3JtIGRldGFpbHMiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSl7bWRbYV09ITB9KTt2YXIgdGQ9e25nTWlubGVuZ3RoOiJtaW5sZW5ndGgiLG5nTWF4bGVuZ3RoOiJtYXhsZW5ndGgiLG5nTWluOiJtaW4iLG5nTWF4OiJtYXgiLG5nUGF0dGVybjoicGF0dGVybiIsbmdTdGVwOiJzdGVwIn07cih7ZGF0YTpyYyxyZW1vdmVEYXRhOnFjLGhhc0RhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIEthW2EubmczMzldKXJldHVybiEwO3JldHVybiExfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsZD1hLmxlbmd0aDtiPGQ7YisrKXFjKGFbYl0pLGlkKGFbYl0pfX0sZnVuY3Rpb24oYSxiKXtZW2JdPWF9KTtyKHtkYXRhOnJjLGluaGVyaXRlZERhdGE6RWIsc2NvcGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHguZGF0YShhLCIkc2NvcGUiKXx8RWIoYS5wYXJlbnROb2RlfHwKICAgICAgICAgICAgYSxbIiRpc29sYXRlU2NvcGUiLCIkc2NvcGUiXSl9LGlzb2xhdGVTY29wZTpmdW5jdGlvbihhKXtyZXR1cm4geC5kYXRhKGEsIiRpc29sYXRlU2NvcGUiKXx8eC5kYXRhKGEsIiRpc29sYXRlU2NvcGVOb1RlbXBsYXRlIil9LGNvbnRyb2xsZXI6amQsaW5qZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIEViKGEsIiRpbmplY3RvciIpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7YS5yZW1vdmVBdHRyaWJ1dGUoYil9LGhhc0NsYXNzOkJiLGNzczpmdW5jdGlvbihhLGIsZCl7Yj14YihiLnJlcGxhY2UobGgsIm1zLSIpKTtpZih3KGQpKWEuc3R5bGVbYl09ZDtlbHNlIHJldHVybiBhLnN0eWxlW2JdfSxhdHRyOmZ1bmN0aW9uKGEsYixkKXt2YXIgYz1hLm5vZGVUeXBlO2lmKGMhPT1QYSYmMiE9PWMmJjghPT1jJiZhLmdldEF0dHJpYnV0ZSl7dmFyIGM9SyhiKSxlPUdiW2NdO2lmKHcoZCkpbnVsbD09PWR8fCExPT09ZCYmZT9hLnJlbW92ZUF0dHJpYnV0ZShiKTphLnNldEF0dHJpYnV0ZShiLAogICAgICAgICAgICBlP2M6ZCk7ZWxzZSByZXR1cm4gYT1hLmdldEF0dHJpYnV0ZShiKSxlJiZudWxsIT09YSYmKGE9YyksbnVsbD09PWE/dm9pZCAwOmF9fSxwcm9wOmZ1bmN0aW9uKGEsYixkKXtpZih3KGQpKWFbYl09ZDtlbHNlIHJldHVybiBhW2JdfSx0ZXh0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGQpe2lmKHooZCkpe3ZhciBjPWEubm9kZVR5cGU7cmV0dXJuIDE9PT1jfHxjPT09UGE/YS50ZXh0Q29udGVudDoiIn1hLnRleHRDb250ZW50PWR9YS4kZHY9IiI7cmV0dXJuIGF9KCksdmFsOmZ1bmN0aW9uKGEsYil7aWYoeihiKSl7aWYoYS5tdWx0aXBsZSYmInNlbGVjdCI9PT11YShhKSl7dmFyIGQ9W107cihhLm9wdGlvbnMsZnVuY3Rpb24oYSl7YS5zZWxlY3RlZCYmZC5wdXNoKGEudmFsdWV8fGEudGV4dCl9KTtyZXR1cm4gZH1yZXR1cm4gYS52YWx1ZX1hLnZhbHVlPWJ9LGh0bWw6ZnVuY3Rpb24oYSxiKXtpZih6KGIpKXJldHVybiBhLmlubmVySFRNTDt5YihhLCEwKTthLmlubmVySFRNTD1ifSwKICAgICAgICBlbXB0eTprZH0sZnVuY3Rpb24oYSxiKXtZLnByb3RvdHlwZVtiXT1mdW5jdGlvbihiLGMpe3ZhciBlLGYsZz10aGlzLmxlbmd0aDtpZihhIT09a2QmJnooMj09PWEubGVuZ3RoJiZhIT09QmImJmEhPT1qZD9iOmMpKXtpZihEKGIpKXtmb3IoZT0wO2U8ZztlKyspaWYoYT09PXJjKWEodGhpc1tlXSxiKTtlbHNlIGZvcihmIGluIGIpYSh0aGlzW2VdLGYsYltmXSk7cmV0dXJuIHRoaXN9ZT1hLiRkdjtnPXooZSk/TWF0aC5taW4oZywxKTpnO2ZvcihmPTA7ZjxnO2YrKyl7dmFyIGs9YSh0aGlzW2ZdLGIsYyk7ZT1lP2UrazprfXJldHVybiBlfWZvcihlPTA7ZTxnO2UrKylhKHRoaXNbZV0sYixjKTtyZXR1cm4gdGhpc319KTtyKHtyZW1vdmVEYXRhOnFjLG9uOmZ1bmN0aW9uKGEsYixkLGMpe2lmKHcoYykpdGhyb3cgbmMoIm9uYXJncyIpO2lmKGxjKGEpKXtjPXpiKGEsITApO3ZhciBlPWMuZXZlbnRzLGY9Yy5oYW5kbGU7Znx8KGY9Yy5oYW5kbGU9cmcoYSxlKSk7Yz0wPD1iLmluZGV4T2YoIiAiKT8KICAgICAgICAgICAgYi5zcGxpdCgiICIpOltiXTtmb3IodmFyIGc9Yy5sZW5ndGgsaz1mdW5jdGlvbihiLGMsZyl7dmFyIGs9ZVtiXTtrfHwoaz1lW2JdPVtdLGsuc3BlY2lhbEhhbmRsZXJXcmFwcGVyPWMsIiRkZXN0cm95Ij09PWJ8fGd8fGEuYWRkRXZlbnRMaXN0ZW5lcihiLGYpKTtrLnB1c2goZCl9O2ctLTspYj1jW2ddLEFiW2JdPyhrKEFiW2JdLHRnKSxrKGIsdm9pZCAwLCEwKSk6ayhiKX19LG9mZjppZCxvbmU6ZnVuY3Rpb24oYSxiLGQpe2E9eChhKTthLm9uKGIsZnVuY3Rpb24gZSgpe2Eub2ZmKGIsZCk7YS5vZmYoYixlKX0pO2Eub24oYixkKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSxiKXt2YXIgZCxjPWEucGFyZW50Tm9kZTt5YihhKTtyKG5ldyBZKGIpLGZ1bmN0aW9uKGIpe2Q/Yy5pbnNlcnRCZWZvcmUoYixkLm5leHRTaWJsaW5nKTpjLnJlcGxhY2VDaGlsZChiLGEpO2Q9Yn0pfSxjaGlsZHJlbjpmdW5jdGlvbihhKXt2YXIgYj1bXTtyKGEuY2hpbGROb2RlcyxmdW5jdGlvbihhKXsxPT09CiAgICAgICAgYS5ub2RlVHlwZSYmYi5wdXNoKGEpfSk7cmV0dXJuIGJ9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNvbnRlbnREb2N1bWVudHx8YS5jaGlsZE5vZGVzfHxbXX0sYXBwZW5kOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YS5ub2RlVHlwZTtpZigxPT09ZHx8MTE9PT1kKXtiPW5ldyBZKGIpO2Zvcih2YXIgZD0wLGM9Yi5sZW5ndGg7ZDxjO2QrKylhLmFwcGVuZENoaWxkKGJbZF0pfX0scHJlcGVuZDpmdW5jdGlvbihhLGIpe2lmKDE9PT1hLm5vZGVUeXBlKXt2YXIgZD1hLmZpcnN0Q2hpbGQ7cihuZXcgWShiKSxmdW5jdGlvbihiKXthLmluc2VydEJlZm9yZShiLGQpfSl9fSx3cmFwOmZ1bmN0aW9uKGEsYil7dmFyIGQ9eChiKS5lcSgwKS5jbG9uZSgpWzBdLGM9YS5wYXJlbnROb2RlO2MmJmMucmVwbGFjZUNoaWxkKGQsYSk7ZC5hcHBlbmRDaGlsZChhKX0scmVtb3ZlOkZiLGRldGFjaDpmdW5jdGlvbihhKXtGYihhLCEwKX0sYWZ0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLGM9YS5wYXJlbnROb2RlOwogICAgICAgICAgICBpZihjKXtiPW5ldyBZKGIpO2Zvcih2YXIgZT0wLGY9Yi5sZW5ndGg7ZTxmO2UrKyl7dmFyIGc9YltlXTtjLmluc2VydEJlZm9yZShnLGQubmV4dFNpYmxpbmcpO2Q9Z319fSxhZGRDbGFzczpEYixyZW1vdmVDbGFzczpDYix0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIsZCl7YiYmcihiLnNwbGl0KCIgIiksZnVuY3Rpb24oYil7dmFyIGU9ZDt6KGUpJiYoZT0hQmIoYSxiKSk7KGU/RGI6Q2IpKGEsYil9KX0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybihhPWEucGFyZW50Tm9kZSkmJjExIT09YS5ub2RlVHlwZT9hOm51bGx9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubmV4dEVsZW1lbnRTaWJsaW5nfSxmaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKTpbXX0sY2xvbmU6cGMsdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjLGUsZj1iLnR5cGV8fGIsZz16YihhKTtpZihnPShnPWcmJmcuZXZlbnRzKSYmCiAgICAgICAgICAgIGdbZl0pYz17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9LGlzRGVmYXVsdFByZXZlbnRlZDpmdW5jdGlvbigpe3JldHVybiEwPT09dGhpcy5kZWZhdWx0UHJldmVudGVkfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD0hMH0saXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMD09PXRoaXMuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkfSxzdG9wUHJvcGFnYXRpb246RSx0eXBlOmYsdGFyZ2V0OmF9LGIudHlwZSYmKGM9UyhjLGIpKSxiPWphKGcpLGU9ZD9bY10uY29uY2F0KGQpOltjXSxyKGIsZnVuY3Rpb24oYil7Yy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpfHxiLmFwcGx5KGEsZSl9KX19LGZ1bmN0aW9uKGEsYil7WS5wcm90b3R5cGVbYl09ZnVuY3Rpb24oYixjLGUpe2Zvcih2YXIgZixnPTAsaz10aGlzLmxlbmd0aDtnPAogICAgaztnKyspeihmKT8oZj1hKHRoaXNbZ10sYixjLGUpLHcoZikmJihmPXgoZikpKTpvYyhmLGEodGhpc1tnXSxiLGMsZSkpO3JldHVybiB3KGYpP2Y6dGhpc319KTtZLnByb3RvdHlwZS5iaW5kPVkucHJvdG90eXBlLm9uO1kucHJvdG90eXBlLnVuYmluZD1ZLnByb3RvdHlwZS5vZmY7dmFyIG1oPU9iamVjdC5jcmVhdGUobnVsbCk7bmQucHJvdG90eXBlPXtfaWR4OmZ1bmN0aW9uKGEpe2EhPT10aGlzLl9sYXN0S2V5JiYodGhpcy5fbGFzdEtleT1hLHRoaXMuX2xhc3RJbmRleD10aGlzLl9rZXlzLmluZGV4T2YoYSkpO3JldHVybiB0aGlzLl9sYXN0SW5kZXh9LF90cmFuc2Zvcm1LZXk6ZnVuY3Rpb24oYSl7cmV0dXJuIFgoYSk/bWg6YX0sZ2V0OmZ1bmN0aW9uKGEpe2E9dGhpcy5fdHJhbnNmb3JtS2V5KGEpO2E9dGhpcy5faWR4KGEpO2lmKC0xIT09YSlyZXR1cm4gdGhpcy5fdmFsdWVzW2FdfSxoYXM6ZnVuY3Rpb24oYSl7YT10aGlzLl90cmFuc2Zvcm1LZXkoYSk7cmV0dXJuLTEhPT10aGlzLl9pZHgoYSl9LAogICAgICAgIHNldDpmdW5jdGlvbihhLGIpe2E9dGhpcy5fdHJhbnNmb3JtS2V5KGEpO3ZhciBkPXRoaXMuX2lkeChhKTstMT09PWQmJihkPXRoaXMuX2xhc3RJbmRleD10aGlzLl9rZXlzLmxlbmd0aCk7dGhpcy5fa2V5c1tkXT1hO3RoaXMuX3ZhbHVlc1tkXT1ifSxkZWxldGU6ZnVuY3Rpb24oYSl7YT10aGlzLl90cmFuc2Zvcm1LZXkoYSk7YT10aGlzLl9pZHgoYSk7aWYoLTE9PT1hKXJldHVybiExO3RoaXMuX2tleXMuc3BsaWNlKGEsMSk7dGhpcy5fdmFsdWVzLnNwbGljZShhLDEpO3RoaXMuX2xhc3RLZXk9TmFOO3RoaXMuX2xhc3RJbmRleD0tMTtyZXR1cm4hMH19O3ZhciBIYj1uZCxqZz1bZnVuY3Rpb24oKXt0aGlzLiRnZXQ9W2Z1bmN0aW9uKCl7cmV0dXJuIEhifV19XSx3Zz0vXihbXihdKz8pPT4vLHhnPS9eW14oXSpcKFxzKihbXildKilcKS9tLG5oPS8sLyxvaD0vXlxzKihfPykoXFMrPylcMVxzKiQvLHZnPS8oKFwvXC8uKiQpfChcL1wqW1xzXFNdKj9cKlwvKSkvbWcsQmE9RigiJGluamVjdG9yIik7CiAgICBmYi4kJGFubm90YXRlPWZ1bmN0aW9uKGEsYixkKXt2YXIgYztpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe2lmKCEoYz1hLiRpbmplY3QpKXtjPVtdO2lmKGEubGVuZ3RoKXtpZihiKXRocm93IEEoZCkmJmR8fChkPWEubmFtZXx8eWcoYSkpLEJhKCJzdHJpY3RkaSIsZCk7Yj1vZChhKTtyKGJbMV0uc3BsaXQobmgpLGZ1bmN0aW9uKGEpe2EucmVwbGFjZShvaCxmdW5jdGlvbihhLGIsZCl7Yy5wdXNoKGQpfSl9KX1hLiRpbmplY3Q9Y319ZWxzZSBIKGEpPyhiPWEubGVuZ3RoLTEsc2IoYVtiXSwiZm4iKSxjPWEuc2xpY2UoMCxiKSk6c2IoYSwiZm4iLCEwKTtyZXR1cm4gY307dmFyIGplPUYoIiRhbmltYXRlIiksemY9ZnVuY3Rpb24oKXt0aGlzLiRnZXQ9RX0sQWY9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgSGIsYj1bXTt0aGlzLiRnZXQ9WyIkJEFuaW1hdGVSdW5uZXIiLCIkcm9vdFNjb3BlIixmdW5jdGlvbihkLGMpe2Z1bmN0aW9uIGUoYSxiLGMpe3ZhciBkPSExO2ImJihiPUEoYik/Yi5zcGxpdCgiICIpOgogICAgICAgIEgoYik/YjpbXSxyKGIsZnVuY3Rpb24oYil7YiYmKGQ9ITAsYVtiXT1jKX0pKTtyZXR1cm4gZH1mdW5jdGlvbiBmKCl7cihiLGZ1bmN0aW9uKGIpe3ZhciBjPWEuZ2V0KGIpO2lmKGMpe3ZhciBkPXpnKGIuYXR0cigiY2xhc3MiKSksZT0iIixmPSIiO3IoYyxmdW5jdGlvbihhLGIpe2EhPT0hIWRbYl0mJihhP2UrPShlLmxlbmd0aD8iICI6IiIpK2I6Zis9KGYubGVuZ3RoPyIgIjoiIikrYil9KTtyKGIsZnVuY3Rpb24oYSl7ZSYmRGIoYSxlKTtmJiZDYihhLGYpfSk7YS5kZWxldGUoYil9fSk7Yi5sZW5ndGg9MH1yZXR1cm57ZW5hYmxlZDpFLG9uOkUsb2ZmOkUscGluOkUscHVzaDpmdW5jdGlvbihnLGssaCxsKXtsJiZsKCk7aD1ofHx7fTtoLmZyb20mJmcuY3NzKGguZnJvbSk7aC50byYmZy5jc3MoaC50byk7aWYoaC5hZGRDbGFzc3x8aC5yZW1vdmVDbGFzcylpZihrPWguYWRkQ2xhc3MsbD1oLnJlbW92ZUNsYXNzLGg9YS5nZXQoZyl8fHt9LGs9ZShoLGssITApLGw9ZShoLGwsITEpLAogICAgICAgIGt8fGwpYS5zZXQoZyxoKSxiLnB1c2goZyksMT09PWIubGVuZ3RoJiZjLiQkcG9zdERpZ2VzdChmKTtnPW5ldyBkO2cuY29tcGxldGUoKTtyZXR1cm4gZ319fV19LHhmPVsiJHByb3ZpZGUiLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsZD1udWxsLGM9bnVsbDt0aGlzLiQkcmVnaXN0ZXJlZEFuaW1hdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKTt0aGlzLnJlZ2lzdGVyPWZ1bmN0aW9uKGMsZCl7aWYoYyYmIi4iIT09Yy5jaGFyQXQoMCkpdGhyb3cgamUoIm5vdGNzZWwiLGMpO3ZhciBnPWMrIi1hbmltYXRpb24iO2IuJCRyZWdpc3RlcmVkQW5pbWF0aW9uc1tjLnN1YnN0cigxKV09ZzthLmZhY3RvcnkoZyxkKX07dGhpcy5jdXN0b21GaWx0ZXI9ZnVuY3Rpb24oYSl7MT09PWFyZ3VtZW50cy5sZW5ndGgmJihjPUIoYSk/YTpudWxsKTtyZXR1cm4gY307dGhpcy5jbGFzc05hbWVGaWx0ZXI9ZnVuY3Rpb24oYSl7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgmJihkPWEgaW5zdGFuY2VvZiBSZWdFeHA/CiAgICAgICAgYTpudWxsKSYmL1soXHN8XC8pXW5nLWFuaW1hdGVbKFxzfFwvKV0vLnRlc3QoZC50b1N0cmluZygpKSl0aHJvdyBkPW51bGwsamUoIm5vbmdjbHMiLCJuZy1hbmltYXRlIik7cmV0dXJuIGR9O3RoaXMuJGdldD1bIiQkYW5pbWF0ZVF1ZXVlIixmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYyxkKXtpZihkKXt2YXIgZTthOntmb3IoZT0wO2U8ZC5sZW5ndGg7ZSsrKXt2YXIgZj1kW2VdO2lmKDE9PT1mLm5vZGVUeXBlKXtlPWY7YnJlYWsgYX19ZT12b2lkIDB9IWV8fGUucGFyZW50Tm9kZXx8ZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nfHwoZD1udWxsKX1kP2QuYWZ0ZXIoYSk6Yy5wcmVwZW5kKGEpfXJldHVybntvbjphLm9uLG9mZjphLm9mZixwaW46YS5waW4sZW5hYmxlZDphLmVuYWJsZWQsY2FuY2VsOmZ1bmN0aW9uKGEpe2EuY2FuY2VsJiZhLmNhbmNlbCgpfSxlbnRlcjpmdW5jdGlvbihjLGQsaCxsKXtkPWQmJngoZCk7aD1oJiZ4KGgpO2Q9ZHx8aC5wYXJlbnQoKTtiKGMsZCxoKTtyZXR1cm4gYS5wdXNoKGMsCiAgICAgICAgICAgICJlbnRlciIscmEobCkpfSxtb3ZlOmZ1bmN0aW9uKGMsZCxoLGwpe2Q9ZCYmeChkKTtoPWgmJngoaCk7ZD1kfHxoLnBhcmVudCgpO2IoYyxkLGgpO3JldHVybiBhLnB1c2goYywibW92ZSIscmEobCkpfSxsZWF2ZTpmdW5jdGlvbihiLGMpe3JldHVybiBhLnB1c2goYiwibGVhdmUiLHJhKGMpLGZ1bmN0aW9uKCl7Yi5yZW1vdmUoKX0pfSxhZGRDbGFzczpmdW5jdGlvbihiLGMsZCl7ZD1yYShkKTtkLmFkZENsYXNzPWhiKGQuYWRkY2xhc3MsYyk7cmV0dXJuIGEucHVzaChiLCJhZGRDbGFzcyIsZCl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGIsYyxkKXtkPXJhKGQpO2QucmVtb3ZlQ2xhc3M9aGIoZC5yZW1vdmVDbGFzcyxjKTtyZXR1cm4gYS5wdXNoKGIsInJlbW92ZUNsYXNzIixkKX0sc2V0Q2xhc3M6ZnVuY3Rpb24oYixjLGQsZil7Zj1yYShmKTtmLmFkZENsYXNzPWhiKGYuYWRkQ2xhc3MsYyk7Zi5yZW1vdmVDbGFzcz1oYihmLnJlbW92ZUNsYXNzLGQpO3JldHVybiBhLnB1c2goYiwic2V0Q2xhc3MiLAogICAgICAgICAgICBmKX0sYW5pbWF0ZTpmdW5jdGlvbihiLGMsZCxmLG0pe209cmEobSk7bS5mcm9tPW0uZnJvbT9TKG0uZnJvbSxjKTpjO20udG89bS50bz9TKG0udG8sZCk6ZDttLnRlbXBDbGFzc2VzPWhiKG0udGVtcENsYXNzZXMsZnx8Im5nLWlubGluZS1hbmltYXRlIik7cmV0dXJuIGEucHVzaChiLCJhbmltYXRlIixtKX19fV19XSxDZj1mdW5jdGlvbigpe3RoaXMuJGdldD1bIiQkckFGIixmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIpe2QucHVzaChiKTsxPGQubGVuZ3RofHxhKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTxkLmxlbmd0aDthKyspZFthXSgpO2Q9W119KX12YXIgZD1bXTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT0hMTtiKGZ1bmN0aW9uKCl7YT0hMH0pO3JldHVybiBmdW5jdGlvbihkKXthP2QoKTpiKGQpfX19XX0sQmY9ZnVuY3Rpb24oKXt0aGlzLiRnZXQ9WyIkcSIsIiRzbmlmZmVyIiwiJCRhbmltYXRlQXN5bmNSdW4iLCIkJGlzRG9jdW1lbnRIaWRkZW4iLCIkdGltZW91dCIsZnVuY3Rpb24oYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsZCxjLGUpe2Z1bmN0aW9uIGYoYSl7dGhpcy5zZXRIb3N0KGEpO3ZhciBiPWQoKTt0aGlzLl9kb25lQ2FsbGJhY2tzPVtdO3RoaXMuX3RpY2s9ZnVuY3Rpb24oYSl7YygpP2UoYSwwLCExKTpiKGEpfTt0aGlzLl9zdGF0ZT0wfWYuY2hhaW49ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKCl7aWYoZD09PWEubGVuZ3RoKWIoITApO2Vsc2UgYVtkXShmdW5jdGlvbihhKXshMT09PWE/YighMSk6KGQrKyxjKCkpfSl9dmFyIGQ9MDtjKCl9O2YuYWxsPWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhmKXtlPWUmJmY7KytkPT09YS5sZW5ndGgmJmIoZSl9dmFyIGQ9MCxlPSEwO3IoYSxmdW5jdGlvbihhKXthLmRvbmUoYyl9KX07Zi5wcm90b3R5cGU9e3NldEhvc3Q6ZnVuY3Rpb24oYSl7dGhpcy5ob3N0PWF8fHt9fSxkb25lOmZ1bmN0aW9uKGEpezI9PT10aGlzLl9zdGF0ZT9hKCk6dGhpcy5fZG9uZUNhbGxiYWNrcy5wdXNoKGEpfSxwcm9ncmVzczpFLGdldFByb21pc2U6ZnVuY3Rpb24oKXtpZighdGhpcy5wcm9taXNlKXt2YXIgYj0KICAgICAgICAgICAgdGhpczt0aGlzLnByb21pc2U9YShmdW5jdGlvbihhLGMpe2IuZG9uZShmdW5jdGlvbihiKXshMT09PWI/YygpOmEoKX0pfSl9cmV0dXJuIHRoaXMucHJvbWlzZX0sdGhlbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmdldFByb21pc2UoKS50aGVuKGEsYil9LCJjYXRjaCI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpWyJjYXRjaCJdKGEpfSwiZmluYWxseSI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpWyJmaW5hbGx5Il0oYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5ob3N0LnBhdXNlJiZ0aGlzLmhvc3QucGF1c2UoKX0scmVzdW1lOmZ1bmN0aW9uKCl7dGhpcy5ob3N0LnJlc3VtZSYmdGhpcy5ob3N0LnJlc3VtZSgpfSxlbmQ6ZnVuY3Rpb24oKXt0aGlzLmhvc3QuZW5kJiZ0aGlzLmhvc3QuZW5kKCk7dGhpcy5fcmVzb2x2ZSghMCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuaG9zdC5jYW5jZWwmJnRoaXMuaG9zdC5jYW5jZWwoKTt0aGlzLl9yZXNvbHZlKCExKX0sCiAgICAgICAgY29tcGxldGU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczswPT09Yi5fc3RhdGUmJihiLl9zdGF0ZT0xLGIuX3RpY2soZnVuY3Rpb24oKXtiLl9yZXNvbHZlKGEpfSkpfSxfcmVzb2x2ZTpmdW5jdGlvbihhKXsyIT09dGhpcy5fc3RhdGUmJihyKHRoaXMuX2RvbmVDYWxsYmFja3MsZnVuY3Rpb24oYil7YihhKX0pLHRoaXMuX2RvbmVDYWxsYmFja3MubGVuZ3RoPTAsdGhpcy5fc3RhdGU9Mil9fTtyZXR1cm4gZn1dfSx5Zj1mdW5jdGlvbigpe3RoaXMuJGdldD1bIiQkckFGIiwiJHEiLCIkJEFuaW1hdGVSdW5uZXIiLGZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oYixlKXtmdW5jdGlvbiBmKCl7YShmdW5jdGlvbigpe2cuYWRkQ2xhc3MmJihiLmFkZENsYXNzKGcuYWRkQ2xhc3MpLGcuYWRkQ2xhc3M9bnVsbCk7Zy5yZW1vdmVDbGFzcyYmKGIucmVtb3ZlQ2xhc3MoZy5yZW1vdmVDbGFzcyksZy5yZW1vdmVDbGFzcz1udWxsKTtnLnRvJiYoYi5jc3MoZy50byksZy50bz1udWxsKTtrfHwKICAgIGguY29tcGxldGUoKTtrPSEwfSk7cmV0dXJuIGh9dmFyIGc9ZXx8e307Zy4kJHByZXBhcmVkfHwoZz1JYShnKSk7Zy5jbGVhbnVwU3R5bGVzJiYoZy5mcm9tPWcudG89bnVsbCk7Zy5mcm9tJiYoYi5jc3MoZy5mcm9tKSxnLmZyb209bnVsbCk7dmFyIGssaD1uZXcgZDtyZXR1cm57c3RhcnQ6ZixlbmQ6Zn19fV19LCQ9RigiJGNvbXBpbGUiKSx0Yz1uZXcgZnVuY3Rpb24oKXt9O1hjLiRpbmplY3Q9WyIkcHJvdmlkZSIsIiQkc2FuaXRpemVVcmlQcm92aWRlciJdO0piLnByb3RvdHlwZS5pc0ZpcnN0Q2hhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldmlvdXNWYWx1ZT09PXRjfTt2YXIgcGQ9L14oKD86eHxkYXRhKVs6XC1fXSkvaSxFZz0vWzpcLV9dKyguKS9nLHZkPUYoIiRjb250cm9sbGVyIiksdWQ9L14oXFMrKShccythc1xzKyhbXHckXSspKT8kLyxKZj1mdW5jdGlvbigpe3RoaXMuJGdldD1bIiRkb2N1bWVudCIsZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2I/IWIubm9kZVR5cGUmJgogICAgICAgIGIgaW5zdGFuY2VvZiB4JiYoYj1iWzBdKTpiPWFbMF0uYm9keTtyZXR1cm4gYi5vZmZzZXRXaWR0aCsxfX1dfSx3ZD0iYXBwbGljYXRpb24vanNvbiIsd2M9eyJDb250ZW50LVR5cGUiOndkKyI7Y2hhcnNldD11dGYtOCJ9LEhnPS9eXFt8Xlx7KD8hXHspLyxJZz17IlsiOi9dJC8sInsiOi99JC99LEdnPS9eXCldXH0nLD9cbi8sS2I9RigiJGh0dHAiKSxNYT1jYS4kaW50ZXJwb2xhdGVNaW5FcnI9RigiJGludGVycG9sYXRlIik7TWEudGhyb3dOb2NvbmNhdD1mdW5jdGlvbihhKXt0aHJvdyBNYSgibm9jb25jYXQiLGEpO307TWEuaW50ZXJyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hKCJpbnRlcnIiLGEsYi50b1N0cmluZygpKX07dmFyIExnPUYoIiRpbnRlcnZhbCIpLFNmPWZ1bmN0aW9uKCl7dGhpcy4kZ2V0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXt2YXIgYj1mdW5jdGlvbihhKXtiLmRhdGE9YTtiLmNhbGxlZD0hMH07Yi5pZD1hO3JldHVybiBifXZhciBiPWNhLmNhbGxiYWNrcywKICAgICAgICBkPXt9O3JldHVybntjcmVhdGVDYWxsYmFjazpmdW5jdGlvbihjKXtjPSJfIisoYi4kJGNvdW50ZXIrKykudG9TdHJpbmcoMzYpO3ZhciBlPSJhbmd1bGFyLmNhbGxiYWNrcy4iK2MsZj1hKGMpO2RbZV09YltjXT1mO3JldHVybiBlfSx3YXNDYWxsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGRbYV0uY2FsbGVkfSxnZXRSZXNwb25zZTpmdW5jdGlvbihhKXtyZXR1cm4gZFthXS5kYXRhfSxyZW1vdmVDYWxsYmFjazpmdW5jdGlvbihhKXtkZWxldGUgYltkW2FdLmlkXTtkZWxldGUgZFthXX19fX0scGg9L14oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/JC8sTWc9e2h0dHA6ODAsaHR0cHM6NDQzLGZ0cDoyMX0samI9RigiJGxvY2F0aW9uIiksTmc9L15ccypbXFwvXXsyLH0vLHFoPXskJGFic1VybDoiIiwkJGh0bWw1OiExLCQkcmVwbGFjZTohMSwkJGNvbXBvc2U6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy4kJHBhdGgsYj10aGlzLiQkaGFzaCxkPXllKHRoaXMuJCRzZWFyY2gpLGI9Yj8KICAgICAgICAgICAgIiMiK2hjKGIpOiIiLGE9YS5zcGxpdCgiLyIpLGM9YS5sZW5ndGg7Yy0tOylhW2NdPWhjKGFbY10ucmVwbGFjZSgvJTJGL2csIi8iKSk7dGhpcy4kJHVybD1hLmpvaW4oIi8iKSsoZD8iPyIrZDoiIikrYjt0aGlzLiQkYWJzVXJsPXRoaXMuJCRub3JtYWxpemVVcmwodGhpcy4kJHVybCk7dGhpcy4kJHVybFVwZGF0ZWRCeUxvY2F0aW9uPSEwfSxhYnNVcmw6TGIoIiQkYWJzVXJsIiksdXJsOmZ1bmN0aW9uKGEpe2lmKHooYSkpcmV0dXJuIHRoaXMuJCR1cmw7dmFyIGI9cGguZXhlYyhhKTsoYlsxXXx8IiI9PT1hKSYmdGhpcy5wYXRoKGRlY29kZVVSSUNvbXBvbmVudChiWzFdKSk7KGJbMl18fGJbMV18fCIiPT09YSkmJnRoaXMuc2VhcmNoKGJbM118fCIiKTt0aGlzLmhhc2goYls1XXx8IiIpO3JldHVybiB0aGlzfSxwcm90b2NvbDpMYigiJCRwcm90b2NvbCIpLGhvc3Q6TGIoIiQkaG9zdCIpLHBvcnQ6TGIoIiQkcG9ydCIpLHBhdGg6RGQoIiQkcGF0aCIsZnVuY3Rpb24oYSl7YT1udWxsIT09CiAgICAgICAgYT9hLnRvU3RyaW5nKCk6IiI7cmV0dXJuIi8iPT09YS5jaGFyQXQoMCk/YToiLyIrYX0pLHNlYXJjaDpmdW5jdGlvbihhLGIpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHRoaXMuJCRzZWFyY2g7Y2FzZSAxOmlmKEEoYSl8fFcoYSkpYT1hLnRvU3RyaW5nKCksdGhpcy4kJHNlYXJjaD1nYyhhKTtlbHNlIGlmKEQoYSkpYT1JYShhLHt9KSxyKGEsZnVuY3Rpb24oYixjKXtudWxsPT1iJiZkZWxldGUgYVtjXX0pLHRoaXMuJCRzZWFyY2g9YTtlbHNlIHRocm93IGpiKCJpc3JjaGFyZyIpO2JyZWFrO2RlZmF1bHQ6eihiKXx8bnVsbD09PWI/ZGVsZXRlIHRoaXMuJCRzZWFyY2hbYV06dGhpcy4kJHNlYXJjaFthXT1ifXRoaXMuJCRjb21wb3NlKCk7cmV0dXJuIHRoaXN9LGhhc2g6RGQoIiQkaGFzaCIsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT1hP2EudG9TdHJpbmcoKToiIn0pLHJlcGxhY2U6ZnVuY3Rpb24oKXt0aGlzLiQkcmVwbGFjZT0hMDtyZXR1cm4gdGhpc319OwogICAgcihbQ2QsemMseWNdLGZ1bmN0aW9uKGEpe2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocWgpO2EucHJvdG90eXBlLnN0YXRlPWZ1bmN0aW9uKGIpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLiQkc3RhdGU7aWYoYSE9PXljfHwhdGhpcy4kJGh0bWw1KXRocm93IGpiKCJub3N0YXRlIik7dGhpcy4kJHN0YXRlPXooYik/bnVsbDpiO3RoaXMuJCR1cmxVcGRhdGVkQnlMb2NhdGlvbj0hMDtyZXR1cm4gdGhpc319KTt2YXIgWWE9RigiJHBhcnNlIiksUmc9e30uY29uc3RydWN0b3IucHJvdG90eXBlLnZhbHVlT2YsVWI9VCgpO3IoIisgLSAqIC8gJSA9PT0gIT09ID09ICE9IDwgPiA8PSA+PSAmJiB8fCAhID0gfCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhKXtVYlthXT0hMH0pO3ZhciByaD17bjoiXG4iLGY6IlxmIixyOiJcciIsdDoiXHQiLHY6Ilx2IiwiJyI6IiciLCciJzonIid9LE5iPWZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucz1hfTtOYi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk5iLAogICAgICAgIGxleDpmdW5jdGlvbihhKXt0aGlzLnRleHQ9YTt0aGlzLmluZGV4PTA7Zm9yKHRoaXMudG9rZW5zPVtdO3RoaXMuaW5kZXg8dGhpcy50ZXh0Lmxlbmd0aDspaWYoYT10aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpLCciJz09PWF8fCInIj09PWEpdGhpcy5yZWFkU3RyaW5nKGEpO2Vsc2UgaWYodGhpcy5pc051bWJlcihhKXx8Ii4iPT09YSYmdGhpcy5pc051bWJlcih0aGlzLnBlZWsoKSkpdGhpcy5yZWFkTnVtYmVyKCk7ZWxzZSBpZih0aGlzLmlzSWRlbnRpZmllclN0YXJ0KHRoaXMucGVla011bHRpY2hhcigpKSl0aGlzLnJlYWRJZGVudCgpO2Vsc2UgaWYodGhpcy5pcyhhLCIoKXt9W10uLDs6PyIpKXRoaXMudG9rZW5zLnB1c2goe2luZGV4OnRoaXMuaW5kZXgsdGV4dDphfSksdGhpcy5pbmRleCsrO2Vsc2UgaWYodGhpcy5pc1doaXRlc3BhY2UoYSkpdGhpcy5pbmRleCsrO2Vsc2V7dmFyIGI9YSt0aGlzLnBlZWsoKSxkPWIrdGhpcy5wZWVrKDIpLGM9VWJbYl0sZT1VYltkXTtVYlthXXx8CiAgICAgICAgY3x8ZT8oYT1lP2Q6Yz9iOmEsdGhpcy50b2tlbnMucHVzaCh7aW5kZXg6dGhpcy5pbmRleCx0ZXh0OmEsb3BlcmF0b3I6ITB9KSx0aGlzLmluZGV4Kz1hLmxlbmd0aCk6dGhpcy50aHJvd0Vycm9yKCJVbmV4cGVjdGVkIG5leHQgY2hhcmFjdGVyICIsdGhpcy5pbmRleCx0aGlzLmluZGV4KzEpfXJldHVybiB0aGlzLnRva2Vuc30saXM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4tMSE9PWIuaW5kZXhPZihhKX0scGVlazpmdW5jdGlvbihhKXthPWF8fDE7cmV0dXJuIHRoaXMuaW5kZXgrYTx0aGlzLnRleHQubGVuZ3RoP3RoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCthKTohMX0saXNOdW1iZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIjAiPD1hJiYiOSI+PWEmJiJzdHJpbmciPT09dHlwZW9mIGF9LGlzV2hpdGVzcGFjZTpmdW5jdGlvbihhKXtyZXR1cm4iICI9PT1hfHwiXHIiPT09YXx8Ilx0Ij09PWF8fCJcbiI9PT1hfHwiXHYiPT09YXx8Ilx1MDBhMCI9PT1hfSxpc0lkZW50aWZpZXJTdGFydDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vcHRpb25zLmlzSWRlbnRpZmllclN0YXJ0PwogICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXNJZGVudGlmaWVyU3RhcnQoYSx0aGlzLmNvZGVQb2ludEF0KGEpKTp0aGlzLmlzVmFsaWRJZGVudGlmaWVyU3RhcnQoYSl9LGlzVmFsaWRJZGVudGlmaWVyU3RhcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuImEiPD1hJiYieiI+PWF8fCJBIjw9YSYmIloiPj1hfHwiXyI9PT1hfHwiJCI9PT1hfSxpc0lkZW50aWZpZXJDb250aW51ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vcHRpb25zLmlzSWRlbnRpZmllckNvbnRpbnVlP3RoaXMub3B0aW9ucy5pc0lkZW50aWZpZXJDb250aW51ZShhLHRoaXMuY29kZVBvaW50QXQoYSkpOnRoaXMuaXNWYWxpZElkZW50aWZpZXJDb250aW51ZShhKX0saXNWYWxpZElkZW50aWZpZXJDb250aW51ZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmlzVmFsaWRJZGVudGlmaWVyU3RhcnQoYSxiKXx8dGhpcy5pc051bWJlcihhKX0sY29kZVBvaW50QXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLmxlbmd0aD9hLmNoYXJDb2RlQXQoMCk6CiAgICAgICAgICAgIChhLmNoYXJDb2RlQXQoMCk8PDEwKSthLmNoYXJDb2RlQXQoMSktNTY2MTM4ODh9LHBlZWtNdWx0aWNoYXI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpLGI9dGhpcy5wZWVrKCk7aWYoIWIpcmV0dXJuIGE7dmFyIGQ9YS5jaGFyQ29kZUF0KDApLGM9Yi5jaGFyQ29kZUF0KDApO3JldHVybiA1NTI5Njw9ZCYmNTYzMTk+PWQmJjU2MzIwPD1jJiY1NzM0Mz49Yz9hK2I6YX0saXNFeHBPcGVyYXRvcjpmdW5jdGlvbihhKXtyZXR1cm4iLSI9PT1hfHwiKyI9PT1hfHx0aGlzLmlzTnVtYmVyKGEpfSx0aHJvd0Vycm9yOmZ1bmN0aW9uKGEsYixkKXtkPWR8fHRoaXMuaW5kZXg7Yj13KGIpPyJzICIrYisiLSIrdGhpcy5pbmRleCsiIFsiK3RoaXMudGV4dC5zdWJzdHJpbmcoYixkKSsiXSI6IiAiK2Q7dGhyb3cgWWEoImxleGVyciIsYSxiLHRoaXMudGV4dCk7fSxyZWFkTnVtYmVyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSIiLGI9dGhpcy5pbmRleDt0aGlzLmluZGV4PAogICAgICAgIHRoaXMudGV4dC5sZW5ndGg7KXt2YXIgZD1LKHRoaXMudGV4dC5jaGFyQXQodGhpcy5pbmRleCkpO2lmKCIuIj09PWR8fHRoaXMuaXNOdW1iZXIoZCkpYSs9ZDtlbHNle3ZhciBjPXRoaXMucGVlaygpO2lmKCJlIj09PWQmJnRoaXMuaXNFeHBPcGVyYXRvcihjKSlhKz1kO2Vsc2UgaWYodGhpcy5pc0V4cE9wZXJhdG9yKGQpJiZjJiZ0aGlzLmlzTnVtYmVyKGMpJiYiZSI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSlhKz1kO2Vsc2UgaWYoIXRoaXMuaXNFeHBPcGVyYXRvcihkKXx8YyYmdGhpcy5pc051bWJlcihjKXx8ImUiIT09YS5jaGFyQXQoYS5sZW5ndGgtMSkpYnJlYWs7ZWxzZSB0aGlzLnRocm93RXJyb3IoIkludmFsaWQgZXhwb25lbnQiKX10aGlzLmluZGV4Kyt9dGhpcy50b2tlbnMucHVzaCh7aW5kZXg6Yix0ZXh0OmEsY29uc3RhbnQ6ITAsdmFsdWU6TnVtYmVyKGEpfSl9LHJlYWRJZGVudDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaW5kZXg7Zm9yKHRoaXMuaW5kZXgrPXRoaXMucGVla011bHRpY2hhcigpLmxlbmd0aDt0aGlzLmluZGV4PAogICAgICAgIHRoaXMudGV4dC5sZW5ndGg7KXt2YXIgYj10aGlzLnBlZWtNdWx0aWNoYXIoKTtpZighdGhpcy5pc0lkZW50aWZpZXJDb250aW51ZShiKSlicmVhazt0aGlzLmluZGV4Kz1iLmxlbmd0aH10aGlzLnRva2Vucy5wdXNoKHtpbmRleDphLHRleHQ6dGhpcy50ZXh0LnNsaWNlKGEsdGhpcy5pbmRleCksaWRlbnRpZmllcjohMH0pfSxyZWFkU3RyaW5nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuaW5kZXg7dGhpcy5pbmRleCsrO2Zvcih2YXIgZD0iIixjPWEsZT0hMTt0aGlzLmluZGV4PHRoaXMudGV4dC5sZW5ndGg7KXt2YXIgZj10aGlzLnRleHQuY2hhckF0KHRoaXMuaW5kZXgpLGM9YytmO2lmKGUpInUiPT09Zj8oZT10aGlzLnRleHQuc3Vic3RyaW5nKHRoaXMuaW5kZXgrMSx0aGlzLmluZGV4KzUpLGUubWF0Y2goL1tcZGEtZl17NH0vaSl8fHRoaXMudGhyb3dFcnJvcigiSW52YWxpZCB1bmljb2RlIGVzY2FwZSBbXFx1IitlKyJdIiksdGhpcy5pbmRleCs9NCxkKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGUsCiAgICAgICAgICAgIDE2KSkpOmQrPXJoW2ZdfHxmLGU9ITE7ZWxzZSBpZigiXFwiPT09ZillPSEwO2Vsc2V7aWYoZj09PWEpe3RoaXMuaW5kZXgrKzt0aGlzLnRva2Vucy5wdXNoKHtpbmRleDpiLHRleHQ6Yyxjb25zdGFudDohMCx2YWx1ZTpkfSk7cmV0dXJufWQrPWZ9dGhpcy5pbmRleCsrfXRoaXMudGhyb3dFcnJvcigiVW50ZXJtaW5hdGVkIHF1b3RlIixiKX19O3ZhciBxPWZ1bmN0aW9uKGEsYil7dGhpcy5sZXhlcj1hO3RoaXMub3B0aW9ucz1ifTtxLlByb2dyYW09IlByb2dyYW0iO3EuRXhwcmVzc2lvblN0YXRlbWVudD0iRXhwcmVzc2lvblN0YXRlbWVudCI7cS5Bc3NpZ25tZW50RXhwcmVzc2lvbj0iQXNzaWdubWVudEV4cHJlc3Npb24iO3EuQ29uZGl0aW9uYWxFeHByZXNzaW9uPSJDb25kaXRpb25hbEV4cHJlc3Npb24iO3EuTG9naWNhbEV4cHJlc3Npb249IkxvZ2ljYWxFeHByZXNzaW9uIjtxLkJpbmFyeUV4cHJlc3Npb249IkJpbmFyeUV4cHJlc3Npb24iO3EuVW5hcnlFeHByZXNzaW9uPSJVbmFyeUV4cHJlc3Npb24iOwogICAgcS5DYWxsRXhwcmVzc2lvbj0iQ2FsbEV4cHJlc3Npb24iO3EuTWVtYmVyRXhwcmVzc2lvbj0iTWVtYmVyRXhwcmVzc2lvbiI7cS5JZGVudGlmaWVyPSJJZGVudGlmaWVyIjtxLkxpdGVyYWw9IkxpdGVyYWwiO3EuQXJyYXlFeHByZXNzaW9uPSJBcnJheUV4cHJlc3Npb24iO3EuUHJvcGVydHk9IlByb3BlcnR5IjtxLk9iamVjdEV4cHJlc3Npb249Ik9iamVjdEV4cHJlc3Npb24iO3EuVGhpc0V4cHJlc3Npb249IlRoaXNFeHByZXNzaW9uIjtxLkxvY2Fsc0V4cHJlc3Npb249IkxvY2Fsc0V4cHJlc3Npb24iO3EuTkdWYWx1ZVBhcmFtZXRlcj0iTkdWYWx1ZVBhcmFtZXRlciI7cS5wcm90b3R5cGU9e2FzdDpmdW5jdGlvbihhKXt0aGlzLnRleHQ9YTt0aGlzLnRva2Vucz10aGlzLmxleGVyLmxleChhKTthPXRoaXMucHJvZ3JhbSgpOzAhPT10aGlzLnRva2Vucy5sZW5ndGgmJnRoaXMudGhyb3dFcnJvcigiaXMgYW4gdW5leHBlY3RlZCB0b2tlbiIsdGhpcy50b2tlbnNbMF0pO3JldHVybiBhfSwKICAgICAgICBwcm9ncmFtOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdOzspaWYoMDx0aGlzLnRva2Vucy5sZW5ndGgmJiF0aGlzLnBlZWsoIn0iLCIpIiwiOyIsIl0iKSYmYS5wdXNoKHRoaXMuZXhwcmVzc2lvblN0YXRlbWVudCgpKSwhdGhpcy5leHBlY3QoIjsiKSlyZXR1cm57dHlwZTpxLlByb2dyYW0sYm9keTphfX0sZXhwcmVzc2lvblN0YXRlbWVudDpmdW5jdGlvbigpe3JldHVybnt0eXBlOnEuRXhwcmVzc2lvblN0YXRlbWVudCxleHByZXNzaW9uOnRoaXMuZmlsdGVyQ2hhaW4oKX19LGZpbHRlckNoYWluOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZXhwcmVzc2lvbigpO3RoaXMuZXhwZWN0KCJ8Iik7KWE9dGhpcy5maWx0ZXIoYSk7cmV0dXJuIGF9LGV4cHJlc3Npb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hc3NpZ25tZW50KCl9LGFzc2lnbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRlcm5hcnkoKTtpZih0aGlzLmV4cGVjdCgiPSIpKXtpZighSGQoYSkpdGhyb3cgWWEoImx2YWwiKTsKICAgICAgICAgICAgYT17dHlwZTpxLkFzc2lnbm1lbnRFeHByZXNzaW9uLGxlZnQ6YSxyaWdodDp0aGlzLmFzc2lnbm1lbnQoKSxvcGVyYXRvcjoiPSJ9fXJldHVybiBhfSx0ZXJuYXJ5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sb2dpY2FsT1IoKSxiLGQ7cmV0dXJuIHRoaXMuZXhwZWN0KCI/IikmJihiPXRoaXMuZXhwcmVzc2lvbigpLHRoaXMuY29uc3VtZSgiOiIpKT8oZD10aGlzLmV4cHJlc3Npb24oKSx7dHlwZTpxLkNvbmRpdGlvbmFsRXhwcmVzc2lvbix0ZXN0OmEsYWx0ZXJuYXRlOmIsY29uc2VxdWVudDpkfSk6YX0sbG9naWNhbE9SOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMubG9naWNhbEFORCgpO3RoaXMuZXhwZWN0KCJ8fCIpOylhPXt0eXBlOnEuTG9naWNhbEV4cHJlc3Npb24sb3BlcmF0b3I6Inx8IixsZWZ0OmEscmlnaHQ6dGhpcy5sb2dpY2FsQU5EKCl9O3JldHVybiBhfSxsb2dpY2FsQU5EOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZXF1YWxpdHkoKTt0aGlzLmV4cGVjdCgiJiYiKTspYT0KICAgICAgICAgICAge3R5cGU6cS5Mb2dpY2FsRXhwcmVzc2lvbixvcGVyYXRvcjoiJiYiLGxlZnQ6YSxyaWdodDp0aGlzLmVxdWFsaXR5KCl9O3JldHVybiBhfSxlcXVhbGl0eTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnJlbGF0aW9uYWwoKSxiO2I9dGhpcy5leHBlY3QoIj09IiwiIT0iLCI9PT0iLCIhPT0iKTspYT17dHlwZTpxLkJpbmFyeUV4cHJlc3Npb24sb3BlcmF0b3I6Yi50ZXh0LGxlZnQ6YSxyaWdodDp0aGlzLnJlbGF0aW9uYWwoKX07cmV0dXJuIGF9LHJlbGF0aW9uYWw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hZGRpdGl2ZSgpLGI7Yj10aGlzLmV4cGVjdCgiPCIsIj4iLCI8PSIsIj49Iik7KWE9e3R5cGU6cS5CaW5hcnlFeHByZXNzaW9uLG9wZXJhdG9yOmIudGV4dCxsZWZ0OmEscmlnaHQ6dGhpcy5hZGRpdGl2ZSgpfTtyZXR1cm4gYX0sYWRkaXRpdmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5tdWx0aXBsaWNhdGl2ZSgpLGI7Yj10aGlzLmV4cGVjdCgiKyIsIi0iKTspYT17dHlwZTpxLkJpbmFyeUV4cHJlc3Npb24sCiAgICAgICAgICAgIG9wZXJhdG9yOmIudGV4dCxsZWZ0OmEscmlnaHQ6dGhpcy5tdWx0aXBsaWNhdGl2ZSgpfTtyZXR1cm4gYX0sbXVsdGlwbGljYXRpdmU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51bmFyeSgpLGI7Yj10aGlzLmV4cGVjdCgiKiIsIi8iLCIlIik7KWE9e3R5cGU6cS5CaW5hcnlFeHByZXNzaW9uLG9wZXJhdG9yOmIudGV4dCxsZWZ0OmEscmlnaHQ6dGhpcy51bmFyeSgpfTtyZXR1cm4gYX0sdW5hcnk6ZnVuY3Rpb24oKXt2YXIgYTtyZXR1cm4oYT10aGlzLmV4cGVjdCgiKyIsIi0iLCIhIikpP3t0eXBlOnEuVW5hcnlFeHByZXNzaW9uLG9wZXJhdG9yOmEudGV4dCxwcmVmaXg6ITAsYXJndW1lbnQ6dGhpcy51bmFyeSgpfTp0aGlzLnByaW1hcnkoKX0scHJpbWFyeTpmdW5jdGlvbigpe3ZhciBhO3RoaXMuZXhwZWN0KCIoIik/KGE9dGhpcy5maWx0ZXJDaGFpbigpLHRoaXMuY29uc3VtZSgiKSIpKTp0aGlzLmV4cGVjdCgiWyIpP2E9dGhpcy5hcnJheURlY2xhcmF0aW9uKCk6dGhpcy5leHBlY3QoInsiKT8KICAgICAgICAgICAgYT10aGlzLm9iamVjdCgpOnRoaXMuc2VsZlJlZmVyZW50aWFsLmhhc093blByb3BlcnR5KHRoaXMucGVlaygpLnRleHQpP2E9SWEodGhpcy5zZWxmUmVmZXJlbnRpYWxbdGhpcy5jb25zdW1lKCkudGV4dF0pOnRoaXMub3B0aW9ucy5saXRlcmFscy5oYXNPd25Qcm9wZXJ0eSh0aGlzLnBlZWsoKS50ZXh0KT9hPXt0eXBlOnEuTGl0ZXJhbCx2YWx1ZTp0aGlzLm9wdGlvbnMubGl0ZXJhbHNbdGhpcy5jb25zdW1lKCkudGV4dF19OnRoaXMucGVlaygpLmlkZW50aWZpZXI/YT10aGlzLmlkZW50aWZpZXIoKTp0aGlzLnBlZWsoKS5jb25zdGFudD9hPXRoaXMuY29uc3RhbnQoKTp0aGlzLnRocm93RXJyb3IoIm5vdCBhIHByaW1hcnkgZXhwcmVzc2lvbiIsdGhpcy5wZWVrKCkpO2Zvcih2YXIgYjtiPXRoaXMuZXhwZWN0KCIoIiwiWyIsIi4iKTspIigiPT09Yi50ZXh0PyhhPXt0eXBlOnEuQ2FsbEV4cHJlc3Npb24sY2FsbGVlOmEsYXJndW1lbnRzOnRoaXMucGFyc2VBcmd1bWVudHMoKX0sdGhpcy5jb25zdW1lKCIpIikpOgogICAgICAgICAgICAiWyI9PT1iLnRleHQ/KGE9e3R5cGU6cS5NZW1iZXJFeHByZXNzaW9uLG9iamVjdDphLHByb3BlcnR5OnRoaXMuZXhwcmVzc2lvbigpLGNvbXB1dGVkOiEwfSx0aGlzLmNvbnN1bWUoIl0iKSk6Ii4iPT09Yi50ZXh0P2E9e3R5cGU6cS5NZW1iZXJFeHByZXNzaW9uLG9iamVjdDphLHByb3BlcnR5OnRoaXMuaWRlbnRpZmllcigpLGNvbXB1dGVkOiExfTp0aGlzLnRocm93RXJyb3IoIklNUE9TU0lCTEUiKTtyZXR1cm4gYX0sZmlsdGVyOmZ1bmN0aW9uKGEpe2E9W2FdO2Zvcih2YXIgYj17dHlwZTpxLkNhbGxFeHByZXNzaW9uLGNhbGxlZTp0aGlzLmlkZW50aWZpZXIoKSxhcmd1bWVudHM6YSxmaWx0ZXI6ITB9O3RoaXMuZXhwZWN0KCI6Iik7KWEucHVzaCh0aGlzLmV4cHJlc3Npb24oKSk7cmV0dXJuIGJ9LHBhcnNlQXJndW1lbnRzOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYoIikiIT09dGhpcy5wZWVrVG9rZW4oKS50ZXh0KXtkbyBhLnB1c2godGhpcy5maWx0ZXJDaGFpbigpKTt3aGlsZSh0aGlzLmV4cGVjdCgiLCIpKQogICAgICAgIH1yZXR1cm4gYX0saWRlbnRpZmllcjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY29uc3VtZSgpO2EuaWRlbnRpZmllcnx8dGhpcy50aHJvd0Vycm9yKCJpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyIixhKTtyZXR1cm57dHlwZTpxLklkZW50aWZpZXIsbmFtZTphLnRleHR9fSxjb25zdGFudDpmdW5jdGlvbigpe3JldHVybnt0eXBlOnEuTGl0ZXJhbCx2YWx1ZTp0aGlzLmNvbnN1bWUoKS52YWx1ZX19LGFycmF5RGVjbGFyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZigiXSIhPT10aGlzLnBlZWtUb2tlbigpLnRleHQpe2Rve2lmKHRoaXMucGVlaygiXSIpKWJyZWFrO2EucHVzaCh0aGlzLmV4cHJlc3Npb24oKSl9d2hpbGUodGhpcy5leHBlY3QoIiwiKSl9dGhpcy5jb25zdW1lKCJdIik7cmV0dXJue3R5cGU6cS5BcnJheUV4cHJlc3Npb24sZWxlbWVudHM6YX19LG9iamVjdDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7aWYoIn0iIT09dGhpcy5wZWVrVG9rZW4oKS50ZXh0KXtkb3tpZih0aGlzLnBlZWsoIn0iKSlicmVhazsKICAgICAgICAgICAgYj17dHlwZTpxLlByb3BlcnR5LGtpbmQ6ImluaXQifTt0aGlzLnBlZWsoKS5jb25zdGFudD8oYi5rZXk9dGhpcy5jb25zdGFudCgpLGIuY29tcHV0ZWQ9ITEsdGhpcy5jb25zdW1lKCI6IiksYi52YWx1ZT10aGlzLmV4cHJlc3Npb24oKSk6dGhpcy5wZWVrKCkuaWRlbnRpZmllcj8oYi5rZXk9dGhpcy5pZGVudGlmaWVyKCksYi5jb21wdXRlZD0hMSx0aGlzLnBlZWsoIjoiKT8odGhpcy5jb25zdW1lKCI6IiksYi52YWx1ZT10aGlzLmV4cHJlc3Npb24oKSk6Yi52YWx1ZT1iLmtleSk6dGhpcy5wZWVrKCJbIik/KHRoaXMuY29uc3VtZSgiWyIpLGIua2V5PXRoaXMuZXhwcmVzc2lvbigpLHRoaXMuY29uc3VtZSgiXSIpLGIuY29tcHV0ZWQ9ITAsdGhpcy5jb25zdW1lKCI6IiksYi52YWx1ZT10aGlzLmV4cHJlc3Npb24oKSk6dGhpcy50aHJvd0Vycm9yKCJpbnZhbGlkIGtleSIsdGhpcy5wZWVrKCkpO2EucHVzaChiKX13aGlsZSh0aGlzLmV4cGVjdCgiLCIpKX10aGlzLmNvbnN1bWUoIn0iKTsKICAgICAgICAgICAgcmV0dXJue3R5cGU6cS5PYmplY3RFeHByZXNzaW9uLHByb3BlcnRpZXM6YX19LHRocm93RXJyb3I6ZnVuY3Rpb24oYSxiKXt0aHJvdyBZYSgic3ludGF4IixiLnRleHQsYSxiLmluZGV4KzEsdGhpcy50ZXh0LHRoaXMudGV4dC5zdWJzdHJpbmcoYi5pbmRleCkpO30sY29uc3VtZTpmdW5jdGlvbihhKXtpZigwPT09dGhpcy50b2tlbnMubGVuZ3RoKXRocm93IFlhKCJ1ZW9lIix0aGlzLnRleHQpO3ZhciBiPXRoaXMuZXhwZWN0KGEpO2J8fHRoaXMudGhyb3dFcnJvcigiaXMgdW5leHBlY3RlZCwgZXhwZWN0aW5nIFsiK2ErIl0iLHRoaXMucGVlaygpKTtyZXR1cm4gYn0scGVla1Rva2VuOmZ1bmN0aW9uKCl7aWYoMD09PXRoaXMudG9rZW5zLmxlbmd0aCl0aHJvdyBZYSgidWVvZSIsdGhpcy50ZXh0KTtyZXR1cm4gdGhpcy50b2tlbnNbMF19LHBlZWs6ZnVuY3Rpb24oYSxiLGQsYyl7cmV0dXJuIHRoaXMucGVla0FoZWFkKDAsYSxiLGQsYyl9LHBlZWtBaGVhZDpmdW5jdGlvbihhLGIsZCxjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpe2lmKHRoaXMudG9rZW5zLmxlbmd0aD5hKXthPXRoaXMudG9rZW5zW2FdO3ZhciBmPWEudGV4dDtpZihmPT09Ynx8Zj09PWR8fGY9PT1jfHxmPT09ZXx8IShifHxkfHxjfHxlKSlyZXR1cm4gYX1yZXR1cm4hMX0sZXhwZWN0OmZ1bmN0aW9uKGEsYixkLGMpe3JldHVybihhPXRoaXMucGVlayhhLGIsZCxjKSk/KHRoaXMudG9rZW5zLnNoaWZ0KCksYSk6ITF9LHNlbGZSZWZlcmVudGlhbDp7InRoaXMiOnt0eXBlOnEuVGhpc0V4cHJlc3Npb259LCRsb2NhbHM6e3R5cGU6cS5Mb2NhbHNFeHByZXNzaW9ufX19O3ZhciBGZD0yO0pkLnByb3RvdHlwZT17Y29tcGlsZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzO3RoaXMuc3RhdGU9e25leHRJZDowLGZpbHRlcnM6e30sZm46e3ZhcnM6W10sYm9keTpbXSxvd246e319LGFzc2lnbjp7dmFyczpbXSxib2R5OltdLG93bjp7fX0saW5wdXRzOltdfTtaKGEsYi4kZmlsdGVyKTt2YXIgZD0iIixjO3RoaXMuc3RhZ2U9ImFzc2lnbiI7aWYoYz1JZChhKSl0aGlzLnN0YXRlLmNvbXB1dGluZz0KICAgICAgICAgICAgImFzc2lnbiIsZD10aGlzLm5leHRJZCgpLHRoaXMucmVjdXJzZShjLGQpLHRoaXMucmV0dXJuXyhkKSxkPSJmbi5hc3NpZ249Iit0aGlzLmdlbmVyYXRlRnVuY3Rpb24oImFzc2lnbiIsInMsdixsIik7Yz1HZChhLmJvZHkpO2Iuc3RhZ2U9ImlucHV0cyI7cihjLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9ImZuIitjO2Iuc3RhdGVbZF09e3ZhcnM6W10sYm9keTpbXSxvd246e319O2Iuc3RhdGUuY29tcHV0aW5nPWQ7dmFyIGs9Yi5uZXh0SWQoKTtiLnJlY3Vyc2UoYSxrKTtiLnJldHVybl8oayk7Yi5zdGF0ZS5pbnB1dHMucHVzaCh7bmFtZTpkLGlzUHVyZTphLmlzUHVyZX0pO2Eud2F0Y2hJZD1jfSk7dGhpcy5zdGF0ZS5jb21wdXRpbmc9ImZuIjt0aGlzLnN0YWdlPSJtYWluIjt0aGlzLnJlY3Vyc2UoYSk7YT0nIicrdGhpcy5VU0UrIiAiK3RoaXMuU1RSSUNUKyciO1xuJyt0aGlzLmZpbHRlclByZWZpeCgpKyJ2YXIgZm49Iit0aGlzLmdlbmVyYXRlRnVuY3Rpb24oImZuIiwicyxsLGEsaSIpKwogICAgICAgICAgICBkK3RoaXMud2F0Y2hGbnMoKSsicmV0dXJuIGZuOyI7YT0obmV3IEZ1bmN0aW9uKCIkZmlsdGVyIiwiZ2V0U3RyaW5nVmFsdWUiLCJpZkRlZmluZWQiLCJwbHVzIixhKSkodGhpcy4kZmlsdGVyLE9nLFBnLEVkKTt0aGlzLnN0YXRlPXRoaXMuc3RhZ2U9dm9pZCAwO3JldHVybiBhfSxVU0U6InVzZSIsU1RSSUNUOiJzdHJpY3QiLHdhdGNoRm5zOmZ1bmN0aW9uKCl7dmFyIGE9W10sYj10aGlzLnN0YXRlLmlucHV0cyxkPXRoaXM7cihiLGZ1bmN0aW9uKGIpe2EucHVzaCgidmFyICIrYi5uYW1lKyI9IitkLmdlbmVyYXRlRnVuY3Rpb24oYi5uYW1lLCJzIikpO2IuaXNQdXJlJiZhLnB1c2goYi5uYW1lLCIuaXNQdXJlPSIrSlNPTi5zdHJpbmdpZnkoYi5pc1B1cmUpKyI7Iil9KTtiLmxlbmd0aCYmYS5wdXNoKCJmbi5pbnB1dHM9WyIrYi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZX0pLmpvaW4oIiwiKSsiXTsiKTtyZXR1cm4gYS5qb2luKCIiKX0sZ2VuZXJhdGVGdW5jdGlvbjpmdW5jdGlvbihhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKXtyZXR1cm4iZnVuY3Rpb24oIitiKyIpeyIrdGhpcy52YXJzUHJlZml4KGEpK3RoaXMuYm9keShhKSsifTsifSxmaWx0ZXJQcmVmaXg6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiPXRoaXM7cih0aGlzLnN0YXRlLmZpbHRlcnMsZnVuY3Rpb24oZCxjKXthLnB1c2goZCsiPSRmaWx0ZXIoIitiLmVzY2FwZShjKSsiKSIpfSk7cmV0dXJuIGEubGVuZ3RoPyJ2YXIgIithLmpvaW4oIiwiKSsiOyI6IiJ9LHZhcnNQcmVmaXg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3RhdGVbYV0udmFycy5sZW5ndGg/InZhciAiK3RoaXMuc3RhdGVbYV0udmFycy5qb2luKCIsIikrIjsiOiIifSxib2R5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0YXRlW2FdLmJvZHkuam9pbigiIil9LHJlY3Vyc2U6ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe3ZhciBnLGssaD10aGlzLGwsbSxwO2M9Y3x8RTtpZighZiYmdyhhLndhdGNoSWQpKWI9Ynx8dGhpcy5uZXh0SWQoKSx0aGlzLmlmXygiaSIsdGhpcy5sYXp5QXNzaWduKGIsCiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRNZW1iZXIoImkiLGEud2F0Y2hJZCkpLHRoaXMubGF6eVJlY3Vyc2UoYSxiLGQsYyxlLCEwKSk7ZWxzZSBzd2l0Y2goYS50eXBlKXtjYXNlIHEuUHJvZ3JhbTpyKGEuYm9keSxmdW5jdGlvbihiLGMpe2gucmVjdXJzZShiLmV4cHJlc3Npb24sdm9pZCAwLHZvaWQgMCxmdW5jdGlvbihhKXtrPWF9KTtjIT09YS5ib2R5Lmxlbmd0aC0xP2guY3VycmVudCgpLmJvZHkucHVzaChrLCI7Iik6aC5yZXR1cm5fKGspfSk7YnJlYWs7Y2FzZSBxLkxpdGVyYWw6bT10aGlzLmVzY2FwZShhLnZhbHVlKTt0aGlzLmFzc2lnbihiLG0pO2MoYnx8bSk7YnJlYWs7Y2FzZSBxLlVuYXJ5RXhwcmVzc2lvbjp0aGlzLnJlY3Vyc2UoYS5hcmd1bWVudCx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKGEpe2s9YX0pO209YS5vcGVyYXRvcisiKCIrdGhpcy5pZkRlZmluZWQoaywwKSsiKSI7dGhpcy5hc3NpZ24oYixtKTtjKG0pO2JyZWFrO2Nhc2UgcS5CaW5hcnlFeHByZXNzaW9uOnRoaXMucmVjdXJzZShhLmxlZnQsCiAgICAgICAgICAgIHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oYSl7Zz1hfSk7dGhpcy5yZWN1cnNlKGEucmlnaHQsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbihhKXtrPWF9KTttPSIrIj09PWEub3BlcmF0b3I/dGhpcy5wbHVzKGcsayk6Ii0iPT09YS5vcGVyYXRvcj90aGlzLmlmRGVmaW5lZChnLDApK2Eub3BlcmF0b3IrdGhpcy5pZkRlZmluZWQoaywwKToiKCIrZysiKSIrYS5vcGVyYXRvcisiKCIraysiKSI7dGhpcy5hc3NpZ24oYixtKTtjKG0pO2JyZWFrO2Nhc2UgcS5Mb2dpY2FsRXhwcmVzc2lvbjpiPWJ8fHRoaXMubmV4dElkKCk7aC5yZWN1cnNlKGEubGVmdCxiKTtoLmlmXygiJiYiPT09YS5vcGVyYXRvcj9iOmgubm90KGIpLGgubGF6eVJlY3Vyc2UoYS5yaWdodCxiKSk7YyhiKTticmVhaztjYXNlIHEuQ29uZGl0aW9uYWxFeHByZXNzaW9uOmI9Ynx8dGhpcy5uZXh0SWQoKTtoLnJlY3Vyc2UoYS50ZXN0LGIpO2guaWZfKGIsaC5sYXp5UmVjdXJzZShhLmFsdGVybmF0ZSxiKSxoLmxhenlSZWN1cnNlKGEuY29uc2VxdWVudCwKICAgICAgICAgICAgYikpO2MoYik7YnJlYWs7Y2FzZSBxLklkZW50aWZpZXI6Yj1ifHx0aGlzLm5leHRJZCgpO2QmJihkLmNvbnRleHQ9ImlucHV0cyI9PT1oLnN0YWdlPyJzIjp0aGlzLmFzc2lnbih0aGlzLm5leHRJZCgpLHRoaXMuZ2V0SGFzT3duUHJvcGVydHkoImwiLGEubmFtZSkrIj9sOnMiKSxkLmNvbXB1dGVkPSExLGQubmFtZT1hLm5hbWUpO2guaWZfKCJpbnB1dHMiPT09aC5zdGFnZXx8aC5ub3QoaC5nZXRIYXNPd25Qcm9wZXJ0eSgibCIsYS5uYW1lKSksZnVuY3Rpb24oKXtoLmlmXygiaW5wdXRzIj09PWguc3RhZ2V8fCJzIixmdW5jdGlvbigpe2UmJjEhPT1lJiZoLmlmXyhoLmlzTnVsbChoLm5vbkNvbXB1dGVkTWVtYmVyKCJzIixhLm5hbWUpKSxoLmxhenlBc3NpZ24oaC5ub25Db21wdXRlZE1lbWJlcigicyIsYS5uYW1lKSwie30iKSk7aC5hc3NpZ24oYixoLm5vbkNvbXB1dGVkTWVtYmVyKCJzIixhLm5hbWUpKX0pfSxiJiZoLmxhenlBc3NpZ24oYixoLm5vbkNvbXB1dGVkTWVtYmVyKCJsIiwKICAgICAgICAgICAgYS5uYW1lKSkpO2MoYik7YnJlYWs7Y2FzZSBxLk1lbWJlckV4cHJlc3Npb246Zz1kJiYoZC5jb250ZXh0PXRoaXMubmV4dElkKCkpfHx0aGlzLm5leHRJZCgpO2I9Ynx8dGhpcy5uZXh0SWQoKTtoLnJlY3Vyc2UoYS5vYmplY3QsZyx2b2lkIDAsZnVuY3Rpb24oKXtoLmlmXyhoLm5vdE51bGwoZyksZnVuY3Rpb24oKXthLmNvbXB1dGVkPyhrPWgubmV4dElkKCksaC5yZWN1cnNlKGEucHJvcGVydHksayksaC5nZXRTdHJpbmdWYWx1ZShrKSxlJiYxIT09ZSYmaC5pZl8oaC5ub3QoaC5jb21wdXRlZE1lbWJlcihnLGspKSxoLmxhenlBc3NpZ24oaC5jb21wdXRlZE1lbWJlcihnLGspLCJ7fSIpKSxtPWguY29tcHV0ZWRNZW1iZXIoZyxrKSxoLmFzc2lnbihiLG0pLGQmJihkLmNvbXB1dGVkPSEwLGQubmFtZT1rKSk6KGUmJjEhPT1lJiZoLmlmXyhoLmlzTnVsbChoLm5vbkNvbXB1dGVkTWVtYmVyKGcsYS5wcm9wZXJ0eS5uYW1lKSksaC5sYXp5QXNzaWduKGgubm9uQ29tcHV0ZWRNZW1iZXIoZywKICAgICAgICAgICAgYS5wcm9wZXJ0eS5uYW1lKSwie30iKSksbT1oLm5vbkNvbXB1dGVkTWVtYmVyKGcsYS5wcm9wZXJ0eS5uYW1lKSxoLmFzc2lnbihiLG0pLGQmJihkLmNvbXB1dGVkPSExLGQubmFtZT1hLnByb3BlcnR5Lm5hbWUpKX0sZnVuY3Rpb24oKXtoLmFzc2lnbihiLCJ1bmRlZmluZWQiKX0pO2MoYil9LCEhZSk7YnJlYWs7Y2FzZSBxLkNhbGxFeHByZXNzaW9uOmI9Ynx8dGhpcy5uZXh0SWQoKTthLmZpbHRlcj8oaz1oLmZpbHRlcihhLmNhbGxlZS5uYW1lKSxsPVtdLHIoYS5hcmd1bWVudHMsZnVuY3Rpb24oYSl7dmFyIGI9aC5uZXh0SWQoKTtoLnJlY3Vyc2UoYSxiKTtsLnB1c2goYil9KSxtPWsrIigiK2wuam9pbigiLCIpKyIpIixoLmFzc2lnbihiLG0pLGMoYikpOihrPWgubmV4dElkKCksZz17fSxsPVtdLGgucmVjdXJzZShhLmNhbGxlZSxrLGcsZnVuY3Rpb24oKXtoLmlmXyhoLm5vdE51bGwoayksZnVuY3Rpb24oKXtyKGEuYXJndW1lbnRzLGZ1bmN0aW9uKGIpe2gucmVjdXJzZShiLGEuY29uc3RhbnQ/CiAgICAgICAgICAgIHZvaWQgMDpoLm5leHRJZCgpLHZvaWQgMCxmdW5jdGlvbihhKXtsLnB1c2goYSl9KX0pO209Zy5uYW1lP2gubWVtYmVyKGcuY29udGV4dCxnLm5hbWUsZy5jb21wdXRlZCkrIigiK2wuam9pbigiLCIpKyIpIjprKyIoIitsLmpvaW4oIiwiKSsiKSI7aC5hc3NpZ24oYixtKX0sZnVuY3Rpb24oKXtoLmFzc2lnbihiLCJ1bmRlZmluZWQiKX0pO2MoYil9KSk7YnJlYWs7Y2FzZSBxLkFzc2lnbm1lbnRFeHByZXNzaW9uOms9dGhpcy5uZXh0SWQoKTtnPXt9O3RoaXMucmVjdXJzZShhLmxlZnQsdm9pZCAwLGcsZnVuY3Rpb24oKXtoLmlmXyhoLm5vdE51bGwoZy5jb250ZXh0KSxmdW5jdGlvbigpe2gucmVjdXJzZShhLnJpZ2h0LGspO209aC5tZW1iZXIoZy5jb250ZXh0LGcubmFtZSxnLmNvbXB1dGVkKSthLm9wZXJhdG9yK2s7aC5hc3NpZ24oYixtKTtjKGJ8fG0pfSl9LDEpO2JyZWFrO2Nhc2UgcS5BcnJheUV4cHJlc3Npb246bD1bXTtyKGEuZWxlbWVudHMsZnVuY3Rpb24oYil7aC5yZWN1cnNlKGIsCiAgICAgICAgICAgIGEuY29uc3RhbnQ/dm9pZCAwOmgubmV4dElkKCksdm9pZCAwLGZ1bmN0aW9uKGEpe2wucHVzaChhKX0pfSk7bT0iWyIrbC5qb2luKCIsIikrIl0iO3RoaXMuYXNzaWduKGIsbSk7YyhifHxtKTticmVhaztjYXNlIHEuT2JqZWN0RXhwcmVzc2lvbjpsPVtdO3A9ITE7cihhLnByb3BlcnRpZXMsZnVuY3Rpb24oYSl7YS5jb21wdXRlZCYmKHA9ITApfSk7cD8oYj1ifHx0aGlzLm5leHRJZCgpLHRoaXMuYXNzaWduKGIsInt9IikscihhLnByb3BlcnRpZXMsZnVuY3Rpb24oYSl7YS5jb21wdXRlZD8oZz1oLm5leHRJZCgpLGgucmVjdXJzZShhLmtleSxnKSk6Zz1hLmtleS50eXBlPT09cS5JZGVudGlmaWVyP2Eua2V5Lm5hbWU6IiIrYS5rZXkudmFsdWU7az1oLm5leHRJZCgpO2gucmVjdXJzZShhLnZhbHVlLGspO2guYXNzaWduKGgubWVtYmVyKGIsZyxhLmNvbXB1dGVkKSxrKX0pKToocihhLnByb3BlcnRpZXMsZnVuY3Rpb24oYil7aC5yZWN1cnNlKGIudmFsdWUsYS5jb25zdGFudD92b2lkIDA6CiAgICAgICAgICAgIGgubmV4dElkKCksdm9pZCAwLGZ1bmN0aW9uKGEpe2wucHVzaChoLmVzY2FwZShiLmtleS50eXBlPT09cS5JZGVudGlmaWVyP2Iua2V5Lm5hbWU6IiIrYi5rZXkudmFsdWUpKyI6IithKX0pfSksbT0ieyIrbC5qb2luKCIsIikrIn0iLHRoaXMuYXNzaWduKGIsbSkpO2MoYnx8bSk7YnJlYWs7Y2FzZSBxLlRoaXNFeHByZXNzaW9uOnRoaXMuYXNzaWduKGIsInMiKTtjKGJ8fCJzIik7YnJlYWs7Y2FzZSBxLkxvY2Fsc0V4cHJlc3Npb246dGhpcy5hc3NpZ24oYiwibCIpO2MoYnx8ImwiKTticmVhaztjYXNlIHEuTkdWYWx1ZVBhcmFtZXRlcjp0aGlzLmFzc2lnbihiLCJ2IiksYyhifHwidiIpfX0sZ2V0SGFzT3duUHJvcGVydHk6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hKyIuIitiLGM9dGhpcy5jdXJyZW50KCkub3duO2MuaGFzT3duUHJvcGVydHkoZCl8fChjW2RdPXRoaXMubmV4dElkKCExLGErIiYmKCIrdGhpcy5lc2NhcGUoYikrIiBpbiAiK2ErIikiKSk7cmV0dXJuIGNbZF19LGFzc2lnbjpmdW5jdGlvbihhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYil7aWYoYSlyZXR1cm4gdGhpcy5jdXJyZW50KCkuYm9keS5wdXNoKGEsIj0iLGIsIjsiKSxhfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7dGhpcy5zdGF0ZS5maWx0ZXJzLmhhc093blByb3BlcnR5KGEpfHwodGhpcy5zdGF0ZS5maWx0ZXJzW2FdPXRoaXMubmV4dElkKCEwKSk7cmV0dXJuIHRoaXMuc3RhdGUuZmlsdGVyc1thXX0saWZEZWZpbmVkOmZ1bmN0aW9uKGEsYil7cmV0dXJuImlmRGVmaW5lZCgiK2ErIiwiK3RoaXMuZXNjYXBlKGIpKyIpIn0scGx1czpmdW5jdGlvbihhLGIpe3JldHVybiJwbHVzKCIrYSsiLCIrYisiKSJ9LHJldHVybl86ZnVuY3Rpb24oYSl7dGhpcy5jdXJyZW50KCkuYm9keS5wdXNoKCJyZXR1cm4gIixhLCI7Iil9LGlmXzpmdW5jdGlvbihhLGIsZCl7aWYoITA9PT1hKWIoKTtlbHNle3ZhciBjPXRoaXMuY3VycmVudCgpLmJvZHk7Yy5wdXNoKCJpZigiLGEsIil7Iik7YigpO2MucHVzaCgifSIpO2QmJihjLnB1c2goImVsc2V7IiksZCgpLGMucHVzaCgifSIpKX19LAogICAgICAgIG5vdDpmdW5jdGlvbihhKXtyZXR1cm4iISgiK2ErIikifSxpc051bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGErIj09bnVsbCJ9LG5vdE51bGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGErIiE9bnVsbCJ9LG5vbkNvbXB1dGVkTWVtYmVyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9L1teJF9hLXpBLVowLTldL2c7cmV0dXJuL15bJF9hLXpBLVpdWyRfYS16QS1aMC05XSokLy50ZXN0KGIpP2ErIi4iK2I6YSsnWyInK2IucmVwbGFjZShkLHRoaXMuc3RyaW5nRXNjYXBlRm4pKyciXSd9LGNvbXB1dGVkTWVtYmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGErIlsiK2IrIl0ifSxtZW1iZXI6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBkP3RoaXMuY29tcHV0ZWRNZW1iZXIoYSxiKTp0aGlzLm5vbkNvbXB1dGVkTWVtYmVyKGEsYil9LGdldFN0cmluZ1ZhbHVlOmZ1bmN0aW9uKGEpe3RoaXMuYXNzaWduKGEsImdldFN0cmluZ1ZhbHVlKCIrYSsiKSIpfSxsYXp5UmVjdXJzZTpmdW5jdGlvbihhLGIsZCxjLGUsZil7dmFyIGc9CiAgICAgICAgICAgIHRoaXM7cmV0dXJuIGZ1bmN0aW9uKCl7Zy5yZWN1cnNlKGEsYixkLGMsZSxmKX19LGxhenlBc3NpZ246ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzO3JldHVybiBmdW5jdGlvbigpe2QuYXNzaWduKGEsYil9fSxzdHJpbmdFc2NhcGVSZWdleDovW14gYS16QS1aMC05XS9nLHN0cmluZ0VzY2FwZUZuOmZ1bmN0aW9uKGEpe3JldHVybiJcXHUiKygiMDAwMCIrYS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpfSxlc2NhcGU6ZnVuY3Rpb24oYSl7aWYoQShhKSlyZXR1cm4iJyIrYS5yZXBsYWNlKHRoaXMuc3RyaW5nRXNjYXBlUmVnZXgsdGhpcy5zdHJpbmdFc2NhcGVGbikrIiciO2lmKFcoYSkpcmV0dXJuIGEudG9TdHJpbmcoKTtpZighMD09PWEpcmV0dXJuInRydWUiO2lmKCExPT09YSlyZXR1cm4iZmFsc2UiO2lmKG51bGw9PT1hKXJldHVybiJudWxsIjtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBhKXJldHVybiJ1bmRlZmluZWQiO3Rocm93IFlhKCJlc2MiKTt9LG5leHRJZDpmdW5jdGlvbihhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYil7dmFyIGQ9InYiK3RoaXMuc3RhdGUubmV4dElkKys7YXx8dGhpcy5jdXJyZW50KCkudmFycy5wdXNoKGQrKGI/Ij0iK2I6IiIpKTtyZXR1cm4gZH0sY3VycmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlW3RoaXMuc3RhdGUuY29tcHV0aW5nXX19O0tkLnByb3RvdHlwZT17Y29tcGlsZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzO1ooYSxiLiRmaWx0ZXIpO3ZhciBkLGM7aWYoZD1JZChhKSljPXRoaXMucmVjdXJzZShkKTtkPUdkKGEuYm9keSk7dmFyIGU7ZCYmKGU9W10scihkLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9Yi5yZWN1cnNlKGEpO2QuaXNQdXJlPWEuaXNQdXJlO2EuaW5wdXQ9ZDtlLnB1c2goZCk7YS53YXRjaElkPWN9KSk7dmFyIGY9W107cihhLmJvZHksZnVuY3Rpb24oYSl7Zi5wdXNoKGIucmVjdXJzZShhLmV4cHJlc3Npb24pKX0pO2E9MD09PWEuYm9keS5sZW5ndGg/RToxPT09YS5ib2R5Lmxlbmd0aD9mWzBdOmZ1bmN0aW9uKGEsYil7dmFyIGM7cihmLGZ1bmN0aW9uKGQpe2M9CiAgICAgICAgICAgIGQoYSxiKX0pO3JldHVybiBjfTtjJiYoYS5hc3NpZ249ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjKGEsZCxiKX0pO2UmJihhLmlucHV0cz1lKTtyZXR1cm4gYX0scmVjdXJzZTpmdW5jdGlvbihhLGIsZCl7dmFyIGMsZSxmPXRoaXMsZztpZihhLmlucHV0KXJldHVybiB0aGlzLmlucHV0cyhhLmlucHV0LGEud2F0Y2hJZCk7c3dpdGNoKGEudHlwZSl7Y2FzZSBxLkxpdGVyYWw6cmV0dXJuIHRoaXMudmFsdWUoYS52YWx1ZSxiKTtjYXNlIHEuVW5hcnlFeHByZXNzaW9uOnJldHVybiBlPXRoaXMucmVjdXJzZShhLmFyZ3VtZW50KSx0aGlzWyJ1bmFyeSIrYS5vcGVyYXRvcl0oZSxiKTtjYXNlIHEuQmluYXJ5RXhwcmVzc2lvbjpyZXR1cm4gYz10aGlzLnJlY3Vyc2UoYS5sZWZ0KSxlPXRoaXMucmVjdXJzZShhLnJpZ2h0KSx0aGlzWyJiaW5hcnkiK2Eub3BlcmF0b3JdKGMsZSxiKTtjYXNlIHEuTG9naWNhbEV4cHJlc3Npb246cmV0dXJuIGM9dGhpcy5yZWN1cnNlKGEubGVmdCksZT10aGlzLnJlY3Vyc2UoYS5yaWdodCksCiAgICAgICAgICAgIHRoaXNbImJpbmFyeSIrYS5vcGVyYXRvcl0oYyxlLGIpO2Nhc2UgcS5Db25kaXRpb25hbEV4cHJlc3Npb246cmV0dXJuIHRoaXNbInRlcm5hcnk/OiJdKHRoaXMucmVjdXJzZShhLnRlc3QpLHRoaXMucmVjdXJzZShhLmFsdGVybmF0ZSksdGhpcy5yZWN1cnNlKGEuY29uc2VxdWVudCksYik7Y2FzZSBxLklkZW50aWZpZXI6cmV0dXJuIGYuaWRlbnRpZmllcihhLm5hbWUsYixkKTtjYXNlIHEuTWVtYmVyRXhwcmVzc2lvbjpyZXR1cm4gYz10aGlzLnJlY3Vyc2UoYS5vYmplY3QsITEsISFkKSxhLmNvbXB1dGVkfHwoZT1hLnByb3BlcnR5Lm5hbWUpLGEuY29tcHV0ZWQmJihlPXRoaXMucmVjdXJzZShhLnByb3BlcnR5KSksYS5jb21wdXRlZD90aGlzLmNvbXB1dGVkTWVtYmVyKGMsZSxiLGQpOnRoaXMubm9uQ29tcHV0ZWRNZW1iZXIoYyxlLGIsZCk7Y2FzZSBxLkNhbGxFeHByZXNzaW9uOnJldHVybiBnPVtdLHIoYS5hcmd1bWVudHMsZnVuY3Rpb24oYSl7Zy5wdXNoKGYucmVjdXJzZShhKSl9KSwKICAgICAgICBhLmZpbHRlciYmKGU9dGhpcy4kZmlsdGVyKGEuY2FsbGVlLm5hbWUpKSxhLmZpbHRlcnx8KGU9dGhpcy5yZWN1cnNlKGEuY2FsbGVlLCEwKSksYS5maWx0ZXI/ZnVuY3Rpb24oYSxjLGQsZil7Zm9yKHZhciBwPVtdLG49MDtuPGcubGVuZ3RoOysrbilwLnB1c2goZ1tuXShhLGMsZCxmKSk7YT1lLmFwcGx5KHZvaWQgMCxwLGYpO3JldHVybiBiP3tjb250ZXh0OnZvaWQgMCxuYW1lOnZvaWQgMCx2YWx1ZTphfTphfTpmdW5jdGlvbihhLGMsZCxmKXt2YXIgcD1lKGEsYyxkLGYpLG47aWYobnVsbCE9cC52YWx1ZSl7bj1bXTtmb3IodmFyIHM9MDtzPGcubGVuZ3RoOysrcyluLnB1c2goZ1tzXShhLGMsZCxmKSk7bj1wLnZhbHVlLmFwcGx5KHAuY29udGV4dCxuKX1yZXR1cm4gYj97dmFsdWU6bn06bn07Y2FzZSBxLkFzc2lnbm1lbnRFeHByZXNzaW9uOnJldHVybiBjPXRoaXMucmVjdXJzZShhLmxlZnQsITAsMSksZT10aGlzLnJlY3Vyc2UoYS5yaWdodCksZnVuY3Rpb24oYSxkLGYsZyl7dmFyIHA9CiAgICAgICAgICAgIGMoYSxkLGYsZyk7YT1lKGEsZCxmLGcpO3AuY29udGV4dFtwLm5hbWVdPWE7cmV0dXJuIGI/e3ZhbHVlOmF9OmF9O2Nhc2UgcS5BcnJheUV4cHJlc3Npb246cmV0dXJuIGc9W10scihhLmVsZW1lbnRzLGZ1bmN0aW9uKGEpe2cucHVzaChmLnJlY3Vyc2UoYSkpfSksZnVuY3Rpb24oYSxjLGQsZSl7Zm9yKHZhciBmPVtdLG49MDtuPGcubGVuZ3RoOysrbilmLnB1c2goZ1tuXShhLGMsZCxlKSk7cmV0dXJuIGI/e3ZhbHVlOmZ9OmZ9O2Nhc2UgcS5PYmplY3RFeHByZXNzaW9uOnJldHVybiBnPVtdLHIoYS5wcm9wZXJ0aWVzLGZ1bmN0aW9uKGEpe2EuY29tcHV0ZWQ/Zy5wdXNoKHtrZXk6Zi5yZWN1cnNlKGEua2V5KSxjb21wdXRlZDohMCx2YWx1ZTpmLnJlY3Vyc2UoYS52YWx1ZSl9KTpnLnB1c2goe2tleTphLmtleS50eXBlPT09cS5JZGVudGlmaWVyP2Eua2V5Lm5hbWU6IiIrYS5rZXkudmFsdWUsY29tcHV0ZWQ6ITEsdmFsdWU6Zi5yZWN1cnNlKGEudmFsdWUpfSl9KSxmdW5jdGlvbihhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyxkLGUpe2Zvcih2YXIgZj17fSxuPTA7bjxnLmxlbmd0aDsrK24pZ1tuXS5jb21wdXRlZD9mW2dbbl0ua2V5KGEsYyxkLGUpXT1nW25dLnZhbHVlKGEsYyxkLGUpOmZbZ1tuXS5rZXldPWdbbl0udmFsdWUoYSxjLGQsZSk7cmV0dXJuIGI/e3ZhbHVlOmZ9OmZ9O2Nhc2UgcS5UaGlzRXhwcmVzc2lvbjpyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGI/e3ZhbHVlOmF9OmF9O2Nhc2UgcS5Mb2NhbHNFeHByZXNzaW9uOnJldHVybiBmdW5jdGlvbihhLGMpe3JldHVybiBiP3t2YWx1ZTpjfTpjfTtjYXNlIHEuTkdWYWx1ZVBhcmFtZXRlcjpyZXR1cm4gZnVuY3Rpb24oYSxjLGQpe3JldHVybiBiP3t2YWx1ZTpkfTpkfX19LCJ1bmFyeSsiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGQsYyxlLGYpe2Q9YShkLGMsZSxmKTtkPXcoZCk/K2Q6MDtyZXR1cm4gYj97dmFsdWU6ZH06ZH19LCJ1bmFyeS0iOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGQsYyxlLGYpe2Q9YShkLGMsCiAgICAgICAgICAgIGUsZik7ZD13KGQpPy1kOi0wO3JldHVybiBiP3t2YWx1ZTpkfTpkfX0sInVuYXJ5ISI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oZCxjLGUsZil7ZD0hYShkLGMsZSxmKTtyZXR1cm4gYj97dmFsdWU6ZH06ZH19LCJiaW5hcnkrIjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe3ZhciBrPWEoYyxlLGYsZyk7Yz1iKGMsZSxmLGcpO2s9RWQoayxjKTtyZXR1cm4gZD97dmFsdWU6a306a319LCJiaW5hcnktIjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe3ZhciBrPWEoYyxlLGYsZyk7Yz1iKGMsZSxmLGcpO2s9KHcoayk/azowKS0odyhjKT9jOjApO3JldHVybiBkP3t2YWx1ZTprfTprfX0sImJpbmFyeSoiOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oYyxlLGYsZyl7Yz1hKGMsZSxmLGcpKmIoYyxlLGYsZyk7cmV0dXJuIGQ/e3ZhbHVlOmN9OmN9fSwiYmluYXJ5LyI6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSxmLGcpe2M9YShjLGUsZixnKS9iKGMsZSxmLGcpO3JldHVybiBkP3t2YWx1ZTpjfTpjfX0sImJpbmFyeSUiOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oYyxlLGYsZyl7Yz1hKGMsZSxmLGcpJWIoYyxlLGYsZyk7cmV0dXJuIGQ/e3ZhbHVlOmN9OmN9fSwiYmluYXJ5PT09IjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe2M9YShjLGUsZixnKT09PWIoYyxlLGYsZyk7cmV0dXJuIGQ/e3ZhbHVlOmN9OmN9fSwiYmluYXJ5IT09IjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe2M9YShjLGUsZixnKSE9PWIoYyxlLGYsZyk7cmV0dXJuIGQ/e3ZhbHVlOmN9OmN9fSwiYmluYXJ5PT0iOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oYyxlLGYsZyl7Yz1hKGMsZSxmLGcpPT1iKGMsZSxmLGcpO3JldHVybiBkP3t2YWx1ZTpjfTpjfX0sImJpbmFyeSE9IjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSxmLGcpe2M9YShjLGUsZixnKSE9YihjLGUsZixnKTtyZXR1cm4gZD97dmFsdWU6Y306Y319LCJiaW5hcnk8IjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe2M9YShjLGUsZixnKTxiKGMsZSxmLGcpO3JldHVybiBkP3t2YWx1ZTpjfTpjfX0sImJpbmFyeT4iOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oYyxlLGYsZyl7Yz1hKGMsZSxmLGcpPmIoYyxlLGYsZyk7cmV0dXJuIGQ/e3ZhbHVlOmN9OmN9fSwiYmluYXJ5PD0iOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oYyxlLGYsZyl7Yz1hKGMsZSxmLGcpPD1iKGMsZSxmLGcpO3JldHVybiBkP3t2YWx1ZTpjfTpjfX0sImJpbmFyeT49IjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe2M9YShjLGUsZixnKT49YihjLGUsZixnKTtyZXR1cm4gZD97dmFsdWU6Y306Y319LCJiaW5hcnkmJiI6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihjLGUsZixnKXtjPQogICAgICAgICAgICBhKGMsZSxmLGcpJiZiKGMsZSxmLGcpO3JldHVybiBkP3t2YWx1ZTpjfTpjfX0sImJpbmFyeXx8IjpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGMsZSxmLGcpe2M9YShjLGUsZixnKXx8YihjLGUsZixnKTtyZXR1cm4gZD97dmFsdWU6Y306Y319LCJ0ZXJuYXJ5PzoiOmZ1bmN0aW9uKGEsYixkLGMpe3JldHVybiBmdW5jdGlvbihlLGYsZyxrKXtlPWEoZSxmLGcsayk/YihlLGYsZyxrKTpkKGUsZixnLGspO3JldHVybiBjP3t2YWx1ZTplfTplfX0sdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYj97Y29udGV4dDp2b2lkIDAsbmFtZTp2b2lkIDAsdmFsdWU6YX06YX19LGlkZW50aWZpZXI6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihjLGUsZixnKXtjPWUmJmEgaW4gZT9lOmM7ZCYmMSE9PWQmJmMmJm51bGw9PWNbYV0mJihjW2FdPXt9KTtlPWM/Y1thXTp2b2lkIDA7cmV0dXJuIGI/e2NvbnRleHQ6YyxuYW1lOmEsdmFsdWU6ZX06CiAgICAgICAgICAgIGV9fSxjb21wdXRlZE1lbWJlcjpmdW5jdGlvbihhLGIsZCxjKXtyZXR1cm4gZnVuY3Rpb24oZSxmLGcsayl7dmFyIGg9YShlLGYsZyxrKSxsLG07bnVsbCE9aCYmKGw9YihlLGYsZyxrKSxsKz0iIixjJiYxIT09YyYmaCYmIWhbbF0mJihoW2xdPXt9KSxtPWhbbF0pO3JldHVybiBkP3tjb250ZXh0OmgsbmFtZTpsLHZhbHVlOm19Om19fSxub25Db21wdXRlZE1lbWJlcjpmdW5jdGlvbihhLGIsZCxjKXtyZXR1cm4gZnVuY3Rpb24oZSxmLGcsayl7ZT1hKGUsZixnLGspO2MmJjEhPT1jJiZlJiZudWxsPT1lW2JdJiYoZVtiXT17fSk7Zj1udWxsIT1lP2VbYl06dm9pZCAwO3JldHVybiBkP3tjb250ZXh0OmUsbmFtZTpiLHZhbHVlOmZ9OmZ9fSxpbnB1dHM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oZCxjLGUsZil7cmV0dXJuIGY/ZltiXTphKGQsYyxlKX19fTtNYi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk1iLHBhcnNlOmZ1bmN0aW9uKGEpe2E9dGhpcy5nZXRBc3QoYSk7dmFyIGI9CiAgICAgICAgICAgIHRoaXMuYXN0Q29tcGlsZXIuY29tcGlsZShhLmFzdCksZD1hLmFzdDtiLmxpdGVyYWw9MD09PWQuYm9keS5sZW5ndGh8fDE9PT1kLmJvZHkubGVuZ3RoJiYoZC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZT09PXEuTGl0ZXJhbHx8ZC5ib2R5WzBdLmV4cHJlc3Npb24udHlwZT09PXEuQXJyYXlFeHByZXNzaW9ufHxkLmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlPT09cS5PYmplY3RFeHByZXNzaW9uKTtiLmNvbnN0YW50PWEuYXN0LmNvbnN0YW50O2Iub25lVGltZT1hLm9uZVRpbWU7cmV0dXJuIGJ9LGdldEFzdDpmdW5jdGlvbihhKXt2YXIgYj0hMTthPWEudHJpbSgpOyI6Ij09PWEuY2hhckF0KDApJiYiOiI9PT1hLmNoYXJBdCgxKSYmKGI9ITAsYT1hLnN1YnN0cmluZygyKSk7cmV0dXJue2FzdDp0aGlzLmFzdC5hc3QoYSksb25lVGltZTpifX19O3ZhciBFYT1GKCIkc2NlIiksVj17SFRNTDoiaHRtbCIsQ1NTOiJjc3MiLE1FRElBX1VSTDoibWVkaWFVcmwiLFVSTDoidXJsIixSRVNPVVJDRV9VUkw6InJlc291cmNlVXJsIiwKICAgICAgICBKUzoianMifSxDYz0vXyhbYS16XSkvZyxVZz1GKCIkdGVtcGxhdGVSZXF1ZXN0IiksVmc9RigiJHRpbWVvdXQiKSxhYT1DLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxPZD1nYShDLmxvY2F0aW9uLmhyZWYpLE5hO2FhLmhyZWY9Imh0dHA6Ly9bOjoxXSI7dmFyIFdnPSJbOjoxXSI9PT1hYS5ob3N0bmFtZTtQZC4kaW5qZWN0PVsiJGRvY3VtZW50Il07ZGQuJGluamVjdD1bIiRwcm92aWRlIl07dmFyIFdkPTIyLFZkPSIuIixFYz0iMCI7UWQuJGluamVjdD1bIiRsb2NhbGUiXTtTZC4kaW5qZWN0PVsiJGxvY2FsZSJdO3ZhciBnaD17eXl5eTplYSgiRnVsbFllYXIiLDQsMCwhMSwhMCkseXk6ZWEoIkZ1bGxZZWFyIiwyLDAsITAsITApLHk6ZWEoIkZ1bGxZZWFyIiwxLDAsITEsITApLE1NTU06a2IoIk1vbnRoIiksTU1NOmtiKCJNb250aCIsITApLE1NOmVhKCJNb250aCIsMiwxKSxNOmVhKCJNb250aCIsMSwxKSxMTExMOmtiKCJNb250aCIsITEsITApLGRkOmVhKCJEYXRlIiwyKSwKICAgICAgICAgICAgZDplYSgiRGF0ZSIsMSksSEg6ZWEoIkhvdXJzIiwyKSxIOmVhKCJIb3VycyIsMSksaGg6ZWEoIkhvdXJzIiwyLC0xMiksaDplYSgiSG91cnMiLDEsLTEyKSxtbTplYSgiTWludXRlcyIsMiksbTplYSgiTWludXRlcyIsMSksc3M6ZWEoIlNlY29uZHMiLDIpLHM6ZWEoIlNlY29uZHMiLDEpLHNzczplYSgiTWlsbGlzZWNvbmRzIiwzKSxFRUVFOmtiKCJEYXkiKSxFRUU6a2IoIkRheSIsITApLGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gMTI+YS5nZXRIb3VycygpP2IuQU1QTVNbMF06Yi5BTVBNU1sxXX0sWjpmdW5jdGlvbihhLGIsZCl7YT0tMSpkO3JldHVybiBhPSgwPD1hPyIrIjoiIikrKE9iKE1hdGhbMDxhPyJmbG9vciI6ImNlaWwiXShhLzYwKSwyKStPYihNYXRoLmFicyhhJTYwKSwyKSl9LHd3OllkKDIpLHc6WWQoMSksRzpGYyxHRzpGYyxHR0c6RmMsR0dHRzpmdW5jdGlvbihhLGIpe3JldHVybiAwPj1hLmdldEZ1bGxZZWFyKCk/Yi5FUkFOQU1FU1swXTpiLkVSQU5BTUVTWzFdfX0sCiAgICAgICAgZmg9LygoPzpbXnlNTGRIaG1zYVpFd0cnXSspfCg/OicoPzpbXiddfCcnKSonKXwoPzpFK3x5K3xNK3xMK3xkK3xIK3xoK3xtK3xzK3xhfFp8Ryt8dyspKShbXHNcU10qKS8sZWg9L14tP1xkKyQvO1JkLiRpbmplY3Q9WyIkbG9jYWxlIl07dmFyICRnPWlhKEspLGFoPWlhKHViKTtUZC4kaW5qZWN0PVsiJHBhcnNlIl07dmFyIE1lPWlhKHtyZXN0cmljdDoiRSIsY29tcGlsZTpmdW5jdGlvbihhLGIpe2lmKCFiLmhyZWYmJiFiLnhsaW5rSHJlZilyZXR1cm4gZnVuY3Rpb24oYSxiKXtpZigiYSI9PT1iWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe3ZhciBlPSJbb2JqZWN0IFNWR0FuaW1hdGVkU3RyaW5nXSI9PT1sYS5jYWxsKGIucHJvcCgiaHJlZiIpKT8ieGxpbms6aHJlZiI6ImhyZWYiO2Iub24oImNsaWNrIixmdW5jdGlvbihhKXtiLmF0dHIoZSl8fGEucHJldmVudERlZmF1bHQoKX0pfX19fSksdmI9e307cihHYixmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoYSxkLGUpe2EuJHdhdGNoKGVbY10sCiAgICAgICAgZnVuY3Rpb24oYSl7ZS4kc2V0KGIsISFhKX0pfWlmKCJtdWx0aXBsZSIhPT1hKXt2YXIgYz13YSgibmctIitiKSxlPWQ7ImNoZWNrZWQiPT09YSYmKGU9ZnVuY3Rpb24oYSxiLGUpe2UubmdNb2RlbCE9PWVbY10mJmQoYSxiLGUpfSk7dmJbY109ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkEiLHByaW9yaXR5OjEwMCxsaW5rOmV9fX19KTtyKHRkLGZ1bmN0aW9uKGEsYil7dmJbYl09ZnVuY3Rpb24oKXtyZXR1cm57cHJpb3JpdHk6MTAwLGxpbms6ZnVuY3Rpb24oYSxjLGUpe2lmKCJuZ1BhdHRlcm4iPT09YiYmIi8iPT09ZS5uZ1BhdHRlcm4uY2hhckF0KDApJiYoYz1lLm5nUGF0dGVybi5tYXRjaChpZSkpKXtlLiRzZXQoIm5nUGF0dGVybiIsbmV3IFJlZ0V4cChjWzFdLGNbMl0pKTtyZXR1cm59YS4kd2F0Y2goZVtiXSxmdW5jdGlvbihhKXtlLiRzZXQoYixhKX0pfX19fSk7cihbInNyYyIsInNyY3NldCIsImhyZWYiXSxmdW5jdGlvbihhKXt2YXIgYj13YSgibmctIithKTt2YltiXT0KICAgICAgICBbIiRzY2UiLGZ1bmN0aW9uKGQpe3JldHVybntwcmlvcml0eTo5OSxsaW5rOmZ1bmN0aW9uKGMsZSxmKXt2YXIgZz1hLGs9YTsiaHJlZiI9PT1hJiYiW29iamVjdCBTVkdBbmltYXRlZFN0cmluZ10iPT09bGEuY2FsbChlLnByb3AoImhyZWYiKSkmJihrPSJ4bGlua0hyZWYiLGYuJGF0dHJba109InhsaW5rOmhyZWYiLGc9bnVsbCk7Zi4kc2V0KGIsZC5nZXRUcnVzdGVkTWVkaWFVcmwoZltiXSkpO2YuJG9ic2VydmUoYixmdW5jdGlvbihiKXtiPyhmLiRzZXQoayxiKSxDYSYmZyYmZS5wcm9wKGcsZltrXSkpOiJocmVmIj09PWEmJmYuJHNldChrLG51bGwpfSl9fX1dfSk7dmFyIGxiPXskYWRkQ29udHJvbDpFLCRnZXRDb250cm9sczppYShbXSksJCRyZW5hbWVDb250cm9sOmZ1bmN0aW9uKGEsYil7YS4kbmFtZT1ifSwkcmVtb3ZlQ29udHJvbDpFLCRzZXRWYWxpZGl0eTpFLCRzZXREaXJ0eTpFLCRzZXRQcmlzdGluZTpFLCRzZXRTdWJtaXR0ZWQ6RSwkJHNldFN1Ym1pdHRlZDpFfTtQYi4kaW5qZWN0PQogICAgICAgIFsiJGVsZW1lbnQiLCIkYXR0cnMiLCIkc2NvcGUiLCIkYW5pbWF0ZSIsIiRpbnRlcnBvbGF0ZSJdO1BiLnByb3RvdHlwZT17JHJvbGxiYWNrVmlld1ZhbHVlOmZ1bmN0aW9uKCl7cih0aGlzLiQkY29udHJvbHMsZnVuY3Rpb24oYSl7YS4kcm9sbGJhY2tWaWV3VmFsdWUoKX0pfSwkY29tbWl0Vmlld1ZhbHVlOmZ1bmN0aW9uKCl7cih0aGlzLiQkY29udHJvbHMsZnVuY3Rpb24oYSl7YS4kY29tbWl0Vmlld1ZhbHVlKCl9KX0sJGFkZENvbnRyb2w6ZnVuY3Rpb24oYSl7SmEoYS4kbmFtZSwiaW5wdXQiKTt0aGlzLiQkY29udHJvbHMucHVzaChhKTthLiRuYW1lJiYodGhpc1thLiRuYW1lXT1hKTthLiQkcGFyZW50Rm9ybT10aGlzfSwkZ2V0Q29udHJvbHM6ZnVuY3Rpb24oKXtyZXR1cm4gamEodGhpcy4kJGNvbnRyb2xzKX0sJCRyZW5hbWVDb250cm9sOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YS4kbmFtZTt0aGlzW2RdPT09YSYmZGVsZXRlIHRoaXNbZF07dGhpc1tiXT1hO2EuJG5hbWU9Yn0sJHJlbW92ZUNvbnRyb2w6ZnVuY3Rpb24oYSl7YS4kbmFtZSYmCiAgICAgICAgdGhpc1thLiRuYW1lXT09PWEmJmRlbGV0ZSB0aGlzW2EuJG5hbWVdO3IodGhpcy4kcGVuZGluZyxmdW5jdGlvbihiLGQpe3RoaXMuJHNldFZhbGlkaXR5KGQsbnVsbCxhKX0sdGhpcyk7cih0aGlzLiRlcnJvcixmdW5jdGlvbihiLGQpe3RoaXMuJHNldFZhbGlkaXR5KGQsbnVsbCxhKX0sdGhpcyk7cih0aGlzLiQkc3VjY2VzcyxmdW5jdGlvbihiLGQpe3RoaXMuJHNldFZhbGlkaXR5KGQsbnVsbCxhKX0sdGhpcyk7Y2IodGhpcy4kJGNvbnRyb2xzLGEpO2EuJCRwYXJlbnRGb3JtPWxifSwkc2V0RGlydHk6ZnVuY3Rpb24oKXt0aGlzLiQkYW5pbWF0ZS5yZW1vdmVDbGFzcyh0aGlzLiQkZWxlbWVudCxaYSk7dGhpcy4kJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsVmIpO3RoaXMuJGRpcnR5PSEwO3RoaXMuJHByaXN0aW5lPSExO3RoaXMuJCRwYXJlbnRGb3JtLiRzZXREaXJ0eSgpfSwkc2V0UHJpc3RpbmU6ZnVuY3Rpb24oKXt0aGlzLiQkYW5pbWF0ZS5zZXRDbGFzcyh0aGlzLiQkZWxlbWVudCwKICAgICAgICAgICAgWmEsVmIrIiBuZy1zdWJtaXR0ZWQiKTt0aGlzLiRkaXJ0eT0hMTt0aGlzLiRwcmlzdGluZT0hMDt0aGlzLiRzdWJtaXR0ZWQ9ITE7cih0aGlzLiQkY29udHJvbHMsZnVuY3Rpb24oYSl7YS4kc2V0UHJpc3RpbmUoKX0pfSwkc2V0VW50b3VjaGVkOmZ1bmN0aW9uKCl7cih0aGlzLiQkY29udHJvbHMsZnVuY3Rpb24oYSl7YS4kc2V0VW50b3VjaGVkKCl9KX0sJHNldFN1Ym1pdHRlZDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzO2EuJCRwYXJlbnRGb3JtJiZhLiQkcGFyZW50Rm9ybSE9PWxiOylhPWEuJCRwYXJlbnRGb3JtO2EuJCRzZXRTdWJtaXR0ZWQoKX0sJCRzZXRTdWJtaXR0ZWQ6ZnVuY3Rpb24oKXt0aGlzLiQkYW5pbWF0ZS5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCwibmctc3VibWl0dGVkIik7dGhpcy4kc3VibWl0dGVkPSEwO3IodGhpcy4kJGNvbnRyb2xzLGZ1bmN0aW9uKGEpe2EuJCRzZXRTdWJtaXR0ZWQmJmEuJCRzZXRTdWJtaXR0ZWQoKX0pfX07YWUoe2NsYXp6OlBiLHNldDpmdW5jdGlvbihhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsZCl7dmFyIGM9YVtiXTtjPy0xPT09Yy5pbmRleE9mKGQpJiZjLnB1c2goZCk6YVtiXT1bZF19LHVuc2V0OmZ1bmN0aW9uKGEsYixkKXt2YXIgYz1hW2JdO2MmJihjYihjLGQpLDA9PT1jLmxlbmd0aCYmZGVsZXRlIGFbYl0pfX0pO3ZhciBrZT1mdW5jdGlvbihhKXtyZXR1cm5bIiR0aW1lb3V0IiwiJHBhcnNlIixmdW5jdGlvbihiLGQpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIiI9PT1hP2QoJ3RoaXNbIiJdJykuYXNzaWduOmQoYSkuYXNzaWdufHxFfXJldHVybntuYW1lOiJmb3JtIixyZXN0cmljdDphPyJFQUMiOiJFIixyZXF1aXJlOlsiZm9ybSIsIl5eP2Zvcm0iXSxjb250cm9sbGVyOlBiLGNvbXBpbGU6ZnVuY3Rpb24oZCxmKXtkLmFkZENsYXNzKFphKS5hZGRDbGFzcyhtYik7dmFyIGc9Zi5uYW1lPyJuYW1lIjphJiZmLm5nRm9ybT8ibmdGb3JtIjohMTtyZXR1cm57cHJlOmZ1bmN0aW9uKGEsZCxlLGYpe3ZhciBwPWZbMF07aWYoISgiYWN0aW9uImluIGUpKXt2YXIgbj1mdW5jdGlvbihiKXthLiRhcHBseShmdW5jdGlvbigpe3AuJGNvbW1pdFZpZXdWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgIHAuJHNldFN1Ym1pdHRlZCgpfSk7Yi5wcmV2ZW50RGVmYXVsdCgpfTtkWzBdLmFkZEV2ZW50TGlzdGVuZXIoInN1Ym1pdCIsbik7ZC5vbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7YihmdW5jdGlvbigpe2RbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3VibWl0IixuKX0sMCwhMSl9KX0oZlsxXXx8cC4kJHBhcmVudEZvcm0pLiRhZGRDb250cm9sKHApO3ZhciBzPWc/YyhwLiRuYW1lKTpFO2cmJihzKGEscCksZS4kb2JzZXJ2ZShnLGZ1bmN0aW9uKGIpe3AuJG5hbWUhPT1iJiYocyhhLHZvaWQgMCkscC4kJHBhcmVudEZvcm0uJCRyZW5hbWVDb250cm9sKHAsYikscz1jKHAuJG5hbWUpLHMoYSxwKSl9KSk7ZC5vbigiJGRlc3Ryb3kiLGZ1bmN0aW9uKCl7cC4kJHBhcmVudEZvcm0uJHJlbW92ZUNvbnRyb2wocCk7cyhhLHZvaWQgMCk7UyhwLGxiKX0pfX19fX1dfSxOZT1rZSgpLFplPWtlKCEwKSxoaD0vXlxkezQsfS1bMDFdXGQtWzAtM11cZFRbMC0yXVxkOlswLTVdXGQ6WzAtNV1cZFwuXGQrKD86WystXVswLTJdXGQ6WzAtNV1cZHxaKSQvLAogICAgICAgIHNoPS9eW2Etel1bYS16XGQuKy1dKjpcLyooPzpbXjpAXSsoPzo6W15AXSspP0ApPyg/OlteXHM6Lz8jXSt8XFtbYS1mXGQ6XStdKSg/OjpcZCspPyg/OlwvW14/I10qKT8oPzpcP1teI10qKT8oPzojLiopPyQvaSx0aD0vXig/PS57MSwyNTR9JCkoPz0uezEsNjR9QClbLSEjJCUmJyorLzAtOT0/QS1aXl9gYS16e3x9fl0rKFwuWy0hIyQlJicqKy8wLTk9P0EtWl5fYGEtent8fX5dKykqQFtBLVphLXowLTldKFtBLVphLXowLTktXXswLDYxfVtBLVphLXowLTldKT8oXC5bQS1aYS16MC05XShbQS1aYS16MC05LV17MCw2MX1bQS1aYS16MC05XSk/KSokLyxpaD0vXlxzKigtfFwrKT8oXGQrfChcZCooXC5cZCopKSkoW2VFXVsrLV0/XGQrKT9ccyokLyxsZT0vXihcZHs0LH0pLShcZHsyfSktKFxkezJ9KSQvLG1lPS9eKFxkezQsfSktKFxkXGQpLShcZFxkKVQoXGRcZCk6KFxkXGQpKD86OihcZFxkKShcLlxkezEsM30pPyk/JC8sTWM9L14oXGR7NCx9KS1XKFxkXGQpJC8sbmU9L14oXGR7NCx9KS0oXGRcZCkkLywKICAgICAgICBvZT0vXihcZFxkKTooXGRcZCkoPzo6KFxkXGQpKFwuXGR7MSwzfSk/KT8kLyxjZT1UKCk7cihbImRhdGUiLCJkYXRldGltZS1sb2NhbCIsIm1vbnRoIiwidGltZSIsIndlZWsiXSxmdW5jdGlvbihhKXtjZVthXT0hMH0pO3ZhciBwZT17dGV4dDpmdW5jdGlvbihhLGIsZCxjLGUsZil7U2EoYSxiLGQsYyxlLGYpO0hjKGMpfSxkYXRlOm5iKCJkYXRlIixsZSxRYihsZSxbInl5eXkiLCJNTSIsImRkIl0pLCJ5eXl5LU1NLWRkIiksImRhdGV0aW1lLWxvY2FsIjpuYigiZGF0ZXRpbWVsb2NhbCIsbWUsUWIobWUsInl5eXkgTU0gZGQgSEggbW0gc3Mgc3NzIi5zcGxpdCgiICIpKSwieXl5eS1NTS1kZFRISDptbTpzcy5zc3MiKSx0aW1lOm5iKCJ0aW1lIixvZSxRYihvZSxbIkhIIiwibW0iLCJzcyIsInNzcyJdKSwiSEg6bW06c3Muc3NzIiksd2VlazpuYigid2VlayIsTWMsZnVuY3Rpb24oYSxiKXtpZihoYShhKSlyZXR1cm4gYTtpZihBKGEpKXtNYy5sYXN0SW5kZXg9MDt2YXIgZD1NYy5leGVjKGEpOwogICAgICAgICAgICBpZihkKXt2YXIgYz0rZFsxXSxlPStkWzJdLGY9ZD0wLGc9MCxrPTAsaD1YZChjKSxlPTcqKGUtMSk7YiYmKGQ9Yi5nZXRIb3VycygpLGY9Yi5nZXRNaW51dGVzKCksZz1iLmdldFNlY29uZHMoKSxrPWIuZ2V0TWlsbGlzZWNvbmRzKCkpO3JldHVybiBuZXcgRGF0ZShjLDAsaC5nZXREYXRlKCkrZSxkLGYsZyxrKX19cmV0dXJuIE5hTn0sInl5eXktV3d3IiksbW9udGg6bmIoIm1vbnRoIixuZSxRYihuZSxbInl5eXkiLCJNTSJdKSwieXl5eS1NTSIpLG51bWJlcjpmdW5jdGlvbihhLGIsZCxjLGUsZixnLGspe0ljKGEsYixkLGMsIm51bWJlciIpO2RlKGMpO1NhKGEsYixkLGMsZSxmKTt2YXIgaDtpZih3KGQubWluKXx8ZC5uZ01pbil7dmFyIGw9ZC5taW58fGsoZC5uZ01pbikoYSk7aD1uYShsKTtjLiR2YWxpZGF0b3JzLm1pbj1mdW5jdGlvbihhLGIpe3JldHVybiBjLiRpc0VtcHR5KGIpfHx6KGgpfHxiPj1ofTtkLiRvYnNlcnZlKCJtaW4iLGZ1bmN0aW9uKGEpe2EhPT1sJiYoaD1uYShhKSwKICAgICAgICAgICAgbD1hLGMuJHZhbGlkYXRlKCkpfSl9aWYodyhkLm1heCl8fGQubmdNYXgpe3ZhciBtPWQubWF4fHxrKGQubmdNYXgpKGEpLHA9bmEobSk7Yy4kdmFsaWRhdG9ycy5tYXg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYy4kaXNFbXB0eShiKXx8eihwKXx8Yjw9cH07ZC4kb2JzZXJ2ZSgibWF4IixmdW5jdGlvbihhKXthIT09bSYmKHA9bmEoYSksbT1hLGMuJHZhbGlkYXRlKCkpfSl9aWYodyhkLnN0ZXApfHxkLm5nU3RlcCl7dmFyIG49ZC5zdGVwfHxrKGQubmdTdGVwKShhKSxzPW5hKG4pO2MuJHZhbGlkYXRvcnMuc3RlcD1mdW5jdGlvbihhLGIpe3JldHVybiBjLiRpc0VtcHR5KGIpfHx6KHMpfHxlZShiLGh8fDAscyl9O2QuJG9ic2VydmUoInN0ZXAiLGZ1bmN0aW9uKGEpe2EhPT1uJiYocz1uYShhKSxuPWEsYy4kdmFsaWRhdGUoKSl9KX19LHVybDpmdW5jdGlvbihhLGIsZCxjLGUsZil7U2EoYSxiLGQsYyxlLGYpO0hjKGMpO2MuJHZhbGlkYXRvcnMudXJsPWZ1bmN0aW9uKGEsYil7dmFyIGQ9CiAgICAgICAgICAgIGF8fGI7cmV0dXJuIGMuJGlzRW1wdHkoZCl8fHNoLnRlc3QoZCl9fSxlbWFpbDpmdW5jdGlvbihhLGIsZCxjLGUsZil7U2EoYSxiLGQsYyxlLGYpO0hjKGMpO2MuJHZhbGlkYXRvcnMuZW1haWw9ZnVuY3Rpb24oYSxiKXt2YXIgZD1hfHxiO3JldHVybiBjLiRpc0VtcHR5KGQpfHx0aC50ZXN0KGQpfX0scmFkaW86ZnVuY3Rpb24oYSxiLGQsYyl7dmFyIGU9IWQubmdUcmltfHwiZmFsc2UiIT09VShkLm5nVHJpbSk7eihkLm5hbWUpJiZiLmF0dHIoIm5hbWUiLCsrcGIpO2Iub24oImNoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGc7YlswXS5jaGVja2VkJiYoZz1kLnZhbHVlLGUmJihnPVUoZykpLGMuJHNldFZpZXdWYWx1ZShnLGEmJmEudHlwZSkpfSk7Yy4kcmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGE9ZC52YWx1ZTtlJiYoYT1VKGEpKTtiWzBdLmNoZWNrZWQ9YT09PWMuJHZpZXdWYWx1ZX07ZC4kb2JzZXJ2ZSgidmFsdWUiLGMuJHJlbmRlcil9LHJhbmdlOmZ1bmN0aW9uKGEsYixkLGMsZSxmKXtmdW5jdGlvbiBnKGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMpe2IuYXR0cihhLGRbYV0pO3ZhciBlPWRbYV07ZC4kb2JzZXJ2ZShhLGZ1bmN0aW9uKGEpe2EhPT1lJiYoZT1hLGMoYSkpfSl9ZnVuY3Rpb24gayhhKXtwPW5hKGEpO1goYy4kbW9kZWxWYWx1ZSl8fChtPyhhPWIudmFsKCkscD5hJiYoYT1wLGIudmFsKGEpKSxjLiRzZXRWaWV3VmFsdWUoYSkpOmMuJHZhbGlkYXRlKCkpfWZ1bmN0aW9uIGgoYSl7bj1uYShhKTtYKGMuJG1vZGVsVmFsdWUpfHwobT8oYT1iLnZhbCgpLG48YSYmKGIudmFsKG4pLGE9bjxwP3A6biksYy4kc2V0Vmlld1ZhbHVlKGEpKTpjLiR2YWxpZGF0ZSgpKX1mdW5jdGlvbiBsKGEpe3M9bmEoYSk7WChjLiRtb2RlbFZhbHVlKXx8KG0/Yy4kdmlld1ZhbHVlIT09Yi52YWwoKSYmYy4kc2V0Vmlld1ZhbHVlKGIudmFsKCkpOmMuJHZhbGlkYXRlKCkpfUljKGEsYixkLGMsInJhbmdlIik7ZGUoYyk7U2EoYSxiLGQsYyxlLGYpO3ZhciBtPWMuJCRoYXNOYXRpdmVWYWxpZGF0b3JzJiYicmFuZ2UiPT09YlswXS50eXBlLHA9bT8KICAgICAgICAgICAgMDp2b2lkIDAsbj1tPzEwMDp2b2lkIDAscz1tPzE6dm9pZCAwLHI9YlswXS52YWxpZGl0eTthPXcoZC5taW4pO2U9dyhkLm1heCk7Zj13KGQuc3RlcCk7dmFyIHE9Yy4kcmVuZGVyO2MuJHJlbmRlcj1tJiZ3KHIucmFuZ2VVbmRlcmZsb3cpJiZ3KHIucmFuZ2VPdmVyZmxvdyk/ZnVuY3Rpb24oKXtxKCk7Yy4kc2V0Vmlld1ZhbHVlKGIudmFsKCkpfTpxO2EmJihwPW5hKGQubWluKSxjLiR2YWxpZGF0b3JzLm1pbj1tP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuJGlzRW1wdHkoYil8fHoocCl8fGI+PXB9LGcoIm1pbiIsaykpO2UmJihuPW5hKGQubWF4KSxjLiR2YWxpZGF0b3JzLm1heD1tP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuJGlzRW1wdHkoYil8fHoobil8fGI8PW59LGcoIm1heCIsaCkpO2YmJihzPW5hKGQuc3RlcCksYy4kdmFsaWRhdG9ycy5zdGVwPW0/ZnVuY3Rpb24oKXtyZXR1cm4hci5zdGVwTWlzbWF0Y2h9OgogICAgICAgICAgICBmdW5jdGlvbihhLGIpe3JldHVybiBjLiRpc0VtcHR5KGIpfHx6KHMpfHxlZShiLHB8fDAscyl9LGcoInN0ZXAiLGwpKX0sY2hlY2tib3g6ZnVuY3Rpb24oYSxiLGQsYyxlLGYsZyxrKXt2YXIgaD1mZShrLGEsIm5nVHJ1ZVZhbHVlIixkLm5nVHJ1ZVZhbHVlLCEwKSxsPWZlKGssYSwibmdGYWxzZVZhbHVlIixkLm5nRmFsc2VWYWx1ZSwhMSk7Yi5vbigiY2hhbmdlIixmdW5jdGlvbihhKXtjLiRzZXRWaWV3VmFsdWUoYlswXS5jaGVja2VkLGEmJmEudHlwZSl9KTtjLiRyZW5kZXI9ZnVuY3Rpb24oKXtiWzBdLmNoZWNrZWQ9Yy4kdmlld1ZhbHVlfTtjLiRpc0VtcHR5PWZ1bmN0aW9uKGEpe3JldHVybiExPT09YX07Yy4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiB2YShhLGgpfSk7Yy4kcGFyc2Vycy5wdXNoKGZ1bmN0aW9uKGEpe3JldHVybiBhP2g6bH0pfSxoaWRkZW46RSxidXR0b246RSxzdWJtaXQ6RSxyZXNldDpFLGZpbGU6RX0sWWM9WyIkYnJvd3NlciIsIiRzbmlmZmVyIiwKICAgICAgICAiJGZpbHRlciIsIiRwYXJzZSIsZnVuY3Rpb24oYSxiLGQsYyl7cmV0dXJue3Jlc3RyaWN0OiJFIixyZXF1aXJlOlsiP25nTW9kZWwiXSxsaW5rOntwcmU6ZnVuY3Rpb24oZSxmLGcsayl7a1swXSYmKHBlW0soZy50eXBlKV18fHBlLnRleHQpKGUsZixnLGtbMF0sYixhLGQsYyl9fX19XSx2Zj1mdW5jdGlvbigpe3ZhciBhPXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoInZhbHVlIil8fCIifSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5zZXRBdHRyaWJ1dGUoInZhbHVlIixhKX19O3JldHVybntyZXN0cmljdDoiRSIscHJpb3JpdHk6MjAwLGNvbXBpbGU6ZnVuY3Rpb24oYixkKXtpZigiaGlkZGVuIj09PUsoZC50eXBlKSlyZXR1cm57cHJlOmZ1bmN0aW9uKGIsZCxmLGcpe2I9ZFswXTtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYixiLm5leHRTaWJsaW5nKTtPYmplY3QuZGVmaW5lUHJvcGVydHkmJgogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwidmFsdWUiLGEpfX19fX0sdWg9L14odHJ1ZXxmYWxzZXxcZCspJC8sc2Y9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsZCxjKXt2YXIgZT13KGMpP2M6OT09PUNhPyIiOm51bGw7YS5wcm9wKCJ2YWx1ZSIsZSk7ZC4kc2V0KCJ2YWx1ZSIsYyl9cmV0dXJue3Jlc3RyaWN0OiJBIixwcmlvcml0eToxMDAsY29tcGlsZTpmdW5jdGlvbihiLGQpe3JldHVybiB1aC50ZXN0KGQubmdWYWx1ZSk/ZnVuY3Rpb24oYixkLGYpe2I9Yi4kZXZhbChmLm5nVmFsdWUpO2EoZCxmLGIpfTpmdW5jdGlvbihiLGQsZil7Yi4kd2F0Y2goZi5uZ1ZhbHVlLGZ1bmN0aW9uKGIpe2EoZCxmLGIpfSl9fX19LFJlPVsiJGNvbXBpbGUiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiQUMiLGNvbXBpbGU6ZnVuY3Rpb24oYil7YS4kJGFkZEJpbmRpbmdDbGFzcyhiKTtyZXR1cm4gZnVuY3Rpb24oYixjLGUpe2EuJCRhZGRCaW5kaW5nSW5mbyhjLGUubmdCaW5kKTtjPWNbMF07CiAgICAgICAgICAgIGIuJHdhdGNoKGUubmdCaW5kLGZ1bmN0aW9uKGEpe2MudGV4dENvbnRlbnQ9aWMoYSl9KX19fX1dLFRlPVsiJGludGVycG9sYXRlIiwiJGNvbXBpbGUiLGZ1bmN0aW9uKGEsYil7cmV0dXJue2NvbXBpbGU6ZnVuY3Rpb24oZCl7Yi4kJGFkZEJpbmRpbmdDbGFzcyhkKTtyZXR1cm4gZnVuY3Rpb24oYyxkLGYpe2M9YShkLmF0dHIoZi4kYXR0ci5uZ0JpbmRUZW1wbGF0ZSkpO2IuJCRhZGRCaW5kaW5nSW5mbyhkLGMuZXhwcmVzc2lvbnMpO2Q9ZFswXTtmLiRvYnNlcnZlKCJuZ0JpbmRUZW1wbGF0ZSIsZnVuY3Rpb24oYSl7ZC50ZXh0Q29udGVudD16KGEpPyIiOmF9KX19fX1dLFNlPVsiJHNjZSIsIiRwYXJzZSIsIiRjb21waWxlIixmdW5jdGlvbihhLGIsZCl7cmV0dXJue3Jlc3RyaWN0OiJBIixjb21waWxlOmZ1bmN0aW9uKGMsZSl7dmFyIGY9YihlLm5nQmluZEh0bWwpLGc9YihlLm5nQmluZEh0bWwsZnVuY3Rpb24oYil7cmV0dXJuIGEudmFsdWVPZihiKX0pO2QuJCRhZGRCaW5kaW5nQ2xhc3MoYyk7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihiLGMsZSl7ZC4kJGFkZEJpbmRpbmdJbmZvKGMsZS5uZ0JpbmRIdG1sKTtiLiR3YXRjaChnLGZ1bmN0aW9uKCl7dmFyIGQ9ZihiKTtjLmh0bWwoYS5nZXRUcnVzdGVkSHRtbChkKXx8IiIpfSl9fX19XSxyZj1pYSh7cmVzdHJpY3Q6IkEiLHJlcXVpcmU6Im5nTW9kZWwiLGxpbms6ZnVuY3Rpb24oYSxiLGQsYyl7Yy4kdmlld0NoYW5nZUxpc3RlbmVycy5wdXNoKGZ1bmN0aW9uKCl7YS4kZXZhbChkLm5nQ2hhbmdlKX0pfX0pLFVlPUtjKCIiLCEwKSxXZT1LYygiT2RkIiwwKSxWZT1LYygiRXZlbiIsMSksWGU9UmEoe2NvbXBpbGU6ZnVuY3Rpb24oYSxiKXtiLiRzZXQoIm5nQ2xvYWsiLHZvaWQgMCk7YS5yZW1vdmVDbGFzcygibmctY2xvYWsiKX19KSxZZT1bZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkEiLHNjb3BlOiEwLGNvbnRyb2xsZXI6IkAiLHByaW9yaXR5OjUwMH19XSxjZD17fSx2aD17Ymx1cjohMCxmb2N1czohMH07cigiY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlbW92ZSBtb3VzZWVudGVyIG1vdXNlbGVhdmUga2V5ZG93biBrZXl1cCBrZXlwcmVzcyBzdWJtaXQgZm9jdXMgYmx1ciBjb3B5IGN1dCBwYXN0ZSIuc3BsaXQoIiAiKSwKICAgICAgICBmdW5jdGlvbihhKXt2YXIgYj13YSgibmctIithKTtjZFtiXT1bIiRwYXJzZSIsIiRyb290U2NvcGUiLCIkZXhjZXB0aW9uSGFuZGxlciIsZnVuY3Rpb24oZCxjLGUpe3JldHVybiBxZChkLGMsZSxiLGEsdmhbYV0pfV19KTt2YXIgYWY9WyIkYW5pbWF0ZSIsIiRjb21waWxlIixmdW5jdGlvbihhLGIpe3JldHVybnttdWx0aUVsZW1lbnQ6ITAsdHJhbnNjbHVkZToiZWxlbWVudCIscHJpb3JpdHk6NjAwLHRlcm1pbmFsOiEwLHJlc3RyaWN0OiJBIiwkJHRsYjohMCxsaW5rOmZ1bmN0aW9uKGQsYyxlLGYsZyl7dmFyIGssaCxsO2QuJHdhdGNoKGUubmdJZixmdW5jdGlvbihkKXtkP2h8fGcoZnVuY3Rpb24oZCxmKXtoPWY7ZFtkLmxlbmd0aCsrXT1iLiQkY3JlYXRlQ29tbWVudCgiZW5kIG5nSWYiLGUubmdJZik7az17Y2xvbmU6ZH07YS5lbnRlcihkLGMucGFyZW50KCksYyl9KToobCYmKGwucmVtb3ZlKCksbD1udWxsKSxoJiYoaC4kZGVzdHJveSgpLGg9bnVsbCksayYmKGw9dGIoay5jbG9uZSksCiAgICAgICAgICAgIGEubGVhdmUobCkuZG9uZShmdW5jdGlvbihhKXshMSE9PWEmJihsPW51bGwpfSksaz1udWxsKSl9KX19fV0sYmY9WyIkdGVtcGxhdGVSZXF1ZXN0IiwiJGFuY2hvclNjcm9sbCIsIiRhbmltYXRlIixmdW5jdGlvbihhLGIsZCl7cmV0dXJue3Jlc3RyaWN0OiJFQ0EiLHByaW9yaXR5OjQwMCx0ZXJtaW5hbDohMCx0cmFuc2NsdWRlOiJlbGVtZW50Iixjb250cm9sbGVyOmNhLm5vb3AsY29tcGlsZTpmdW5jdGlvbihjLGUpe3ZhciBmPWUubmdJbmNsdWRlfHxlLnNyYyxnPWUub25sb2FkfHwiIixrPWUuYXV0b3Njcm9sbDtyZXR1cm4gZnVuY3Rpb24oYyxlLG0scCxuKXt2YXIgcj0wLHEsdCx4LHY9ZnVuY3Rpb24oKXt0JiYodC5yZW1vdmUoKSx0PW51bGwpO3EmJihxLiRkZXN0cm95KCkscT1udWxsKTt4JiYoZC5sZWF2ZSh4KS5kb25lKGZ1bmN0aW9uKGEpeyExIT09YSYmKHQ9bnVsbCl9KSx0PXgseD1udWxsKX07Yy4kd2F0Y2goZixmdW5jdGlvbihmKXt2YXIgbT1mdW5jdGlvbihhKXshMT09PQogICAgICAgIGF8fCF3KGspfHxrJiYhYy4kZXZhbChrKXx8YigpfSx0PSsrcjtmPyhhKGYsITApLnRoZW4oZnVuY3Rpb24oYSl7aWYoIWMuJCRkZXN0cm95ZWQmJnQ9PT1yKXt2YXIgYj1jLiRuZXcoKTtwLnRlbXBsYXRlPWE7YT1uKGIsZnVuY3Rpb24oYSl7digpO2QuZW50ZXIoYSxudWxsLGUpLmRvbmUobSl9KTtxPWI7eD1hO3EuJGVtaXQoIiRpbmNsdWRlQ29udGVudExvYWRlZCIsZik7Yy4kZXZhbChnKX19LGZ1bmN0aW9uKCl7Yy4kJGRlc3Ryb3llZHx8dCE9PXJ8fCh2KCksYy4kZW1pdCgiJGluY2x1ZGVDb250ZW50RXJyb3IiLGYpKX0pLGMuJGVtaXQoIiRpbmNsdWRlQ29udGVudFJlcXVlc3RlZCIsZikpOih2KCkscC50ZW1wbGF0ZT1udWxsKX0pfX19fV0sdWY9WyIkY29tcGlsZSIsZnVuY3Rpb24oYSl7cmV0dXJue3Jlc3RyaWN0OiJFQ0EiLHByaW9yaXR5Oi00MDAscmVxdWlyZToibmdJbmNsdWRlIixsaW5rOmZ1bmN0aW9uKGIsZCxjLGUpe2xhLmNhbGwoZFswXSkubWF0Y2goL1NWRy8pPwogICAgICAgICAgICAoZC5lbXB0eSgpLGEoZWQoZS50ZW1wbGF0ZSxDLmRvY3VtZW50KS5jaGlsZE5vZGVzKShiLGZ1bmN0aW9uKGEpe2QuYXBwZW5kKGEpfSx7ZnV0dXJlUGFyZW50RWxlbWVudDpkfSkpOihkLmh0bWwoZS50ZW1wbGF0ZSksYShkLmNvbnRlbnRzKCkpKGIpKX19fV0sY2Y9UmEoe3ByaW9yaXR5OjQ1MCxjb21waWxlOmZ1bmN0aW9uKCl7cmV0dXJue3ByZTpmdW5jdGlvbihhLGIsZCl7YS4kZXZhbChkLm5nSW5pdCl9fX19KSxxZj1mdW5jdGlvbigpe3JldHVybntyZXN0cmljdDoiQSIscHJpb3JpdHk6MTAwLHJlcXVpcmU6Im5nTW9kZWwiLGxpbms6ZnVuY3Rpb24oYSxiLGQsYyl7dmFyIGU9ZC5uZ0xpc3R8fCIsICIsZj0iZmFsc2UiIT09ZC5uZ1RyaW0sZz1mP1UoZSk6ZTtjLiRwYXJzZXJzLnB1c2goZnVuY3Rpb24oYSl7aWYoIXooYSkpe3ZhciBiPVtdO2EmJnIoYS5zcGxpdChnKSxmdW5jdGlvbihhKXthJiZiLnB1c2goZj9VKGEpOmEpfSk7cmV0dXJuIGJ9fSk7Yy4kZm9ybWF0dGVycy5wdXNoKGZ1bmN0aW9uKGEpe2lmKEgoYSkpcmV0dXJuIGEuam9pbihlKX0pOwogICAgICAgICAgICBjLiRpc0VtcHR5PWZ1bmN0aW9uKGEpe3JldHVybiFhfHwhYS5sZW5ndGh9fX19LG1iPSJuZy12YWxpZCIsJGQ9Im5nLWludmFsaWQiLFphPSJuZy1wcmlzdGluZSIsVmI9Im5nLWRpcnR5IixvYj1GKCJuZ01vZGVsIik7UmIuJGluamVjdD0iJHNjb3BlICRleGNlcHRpb25IYW5kbGVyICRhdHRycyAkZWxlbWVudCAkcGFyc2UgJGFuaW1hdGUgJHRpbWVvdXQgJHEgJGludGVycG9sYXRlIi5zcGxpdCgiICIpO1JiLnByb3RvdHlwZT17JCRpbml0R2V0dGVyU2V0dGVyczpmdW5jdGlvbigpe2lmKHRoaXMuJG9wdGlvbnMuZ2V0T3B0aW9uKCJnZXR0ZXJTZXR0ZXIiKSl7dmFyIGE9dGhpcy4kJHBhcnNlKHRoaXMuJCRhdHRyLm5nTW9kZWwrIigpIiksYj10aGlzLiQkcGFyc2UodGhpcy4kJGF0dHIubmdNb2RlbCsiKCQkJHApIik7dGhpcy4kJG5nTW9kZWxHZXQ9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy4kJHBhcnNlZE5nTW9kZWwoYik7QihjKSYmKGM9YShiKSk7cmV0dXJuIGN9O3RoaXMuJCRuZ01vZGVsU2V0PQogICAgICAgICAgICBmdW5jdGlvbihhLGMpe0IodGhpcy4kJHBhcnNlZE5nTW9kZWwoYSkpP2IoYSx7JCQkcDpjfSk6dGhpcy4kJHBhcnNlZE5nTW9kZWxBc3NpZ24oYSxjKX19ZWxzZSBpZighdGhpcy4kJHBhcnNlZE5nTW9kZWwuYXNzaWduKXRocm93IG9iKCJub25hc3NpZ24iLHRoaXMuJCRhdHRyLm5nTW9kZWwsemEodGhpcy4kJGVsZW1lbnQpKTt9LCRyZW5kZXI6RSwkaXNFbXB0eTpmdW5jdGlvbihhKXtyZXR1cm4geihhKXx8IiI9PT1hfHxudWxsPT09YXx8YSE9PWF9LCQkdXBkYXRlRW1wdHlDbGFzc2VzOmZ1bmN0aW9uKGEpe3RoaXMuJGlzRW1wdHkoYSk/KHRoaXMuJCRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LCJuZy1ub3QtZW1wdHkiKSx0aGlzLiQkYW5pbWF0ZS5hZGRDbGFzcyh0aGlzLiQkZWxlbWVudCwibmctZW1wdHkiKSk6KHRoaXMuJCRhbmltYXRlLnJlbW92ZUNsYXNzKHRoaXMuJCRlbGVtZW50LCJuZy1lbXB0eSIpLHRoaXMuJCRhbmltYXRlLmFkZENsYXNzKHRoaXMuJCRlbGVtZW50LAogICAgICAgICAgICAibmctbm90LWVtcHR5IikpfSwkc2V0UHJpc3RpbmU6ZnVuY3Rpb24oKXt0aGlzLiRkaXJ0eT0hMTt0aGlzLiRwcmlzdGluZT0hMDt0aGlzLiQkYW5pbWF0ZS5yZW1vdmVDbGFzcyh0aGlzLiQkZWxlbWVudCxWYik7dGhpcy4kJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsWmEpfSwkc2V0RGlydHk6ZnVuY3Rpb24oKXt0aGlzLiRkaXJ0eT0hMDt0aGlzLiRwcmlzdGluZT0hMTt0aGlzLiQkYW5pbWF0ZS5yZW1vdmVDbGFzcyh0aGlzLiQkZWxlbWVudCxaYSk7dGhpcy4kJGFuaW1hdGUuYWRkQ2xhc3ModGhpcy4kJGVsZW1lbnQsVmIpO3RoaXMuJCRwYXJlbnRGb3JtLiRzZXREaXJ0eSgpfSwkc2V0VW50b3VjaGVkOmZ1bmN0aW9uKCl7dGhpcy4kdG91Y2hlZD0hMTt0aGlzLiR1bnRvdWNoZWQ9ITA7dGhpcy4kJGFuaW1hdGUuc2V0Q2xhc3ModGhpcy4kJGVsZW1lbnQsIm5nLXVudG91Y2hlZCIsIm5nLXRvdWNoZWQiKX0sJHNldFRvdWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLiR0b3VjaGVkPQogICAgICAgICAgICAhMDt0aGlzLiR1bnRvdWNoZWQ9ITE7dGhpcy4kJGFuaW1hdGUuc2V0Q2xhc3ModGhpcy4kJGVsZW1lbnQsIm5nLXRvdWNoZWQiLCJuZy11bnRvdWNoZWQiKX0sJHJvbGxiYWNrVmlld1ZhbHVlOmZ1bmN0aW9uKCl7dGhpcy4kJHRpbWVvdXQuY2FuY2VsKHRoaXMuJCRwZW5kaW5nRGVib3VuY2UpO3RoaXMuJHZpZXdWYWx1ZT10aGlzLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZTt0aGlzLiRyZW5kZXIoKX0sJHZhbGlkYXRlOmZ1bmN0aW9uKCl7aWYoIVgodGhpcy4kbW9kZWxWYWx1ZSkpe3ZhciBhPXRoaXMuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlLGI9dGhpcy4kJHJhd01vZGVsVmFsdWUsZD10aGlzLiR2YWxpZCxjPXRoaXMuJG1vZGVsVmFsdWUsZT10aGlzLiRvcHRpb25zLmdldE9wdGlvbigiYWxsb3dJbnZhbGlkIiksZj10aGlzO3RoaXMuJCRydW5WYWxpZGF0b3JzKGIsYSxmdW5jdGlvbihhKXtlfHxkPT09YXx8KGYuJG1vZGVsVmFsdWU9YT9iOnZvaWQgMCxmLiRtb2RlbFZhbHVlIT09CiAgICAgICAgYyYmZi4kJHdyaXRlTW9kZWxUb1Njb3BlKCkpfSl9fSwkJHJ1blZhbGlkYXRvcnM6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXt2YXIgYz0hMDtyKGguJHZhbGlkYXRvcnMsZnVuY3Rpb24oZCxlKXt2YXIgZz1Cb29sZWFuKGQoYSxiKSk7Yz1jJiZnO2YoZSxnKX0pO3JldHVybiBjPyEwOihyKGguJGFzeW5jVmFsaWRhdG9ycyxmdW5jdGlvbihhLGIpe2YoYixudWxsKX0pLCExKX1mdW5jdGlvbiBlKCl7dmFyIGM9W10sZD0hMDtyKGguJGFzeW5jVmFsaWRhdG9ycyxmdW5jdGlvbihlLGcpe3ZhciBoPWUoYSxiKTtpZighaHx8IUIoaC50aGVuKSl0aHJvdyBvYigibm9wcm9taXNlIixoKTtmKGcsdm9pZCAwKTtjLnB1c2goaC50aGVuKGZ1bmN0aW9uKCl7ZihnLCEwKX0sZnVuY3Rpb24oKXtkPSExO2YoZywhMSl9KSl9KTtjLmxlbmd0aD9oLiQkcS5hbGwoYykudGhlbihmdW5jdGlvbigpe2coZCl9LEUpOmcoITApfWZ1bmN0aW9uIGYoYSxiKXtrPT09aC4kJGN1cnJlbnRWYWxpZGF0aW9uUnVuSWQmJgogICAgICAgIGguJHNldFZhbGlkaXR5KGEsYil9ZnVuY3Rpb24gZyhhKXtrPT09aC4kJGN1cnJlbnRWYWxpZGF0aW9uUnVuSWQmJmQoYSl9dGhpcy4kJGN1cnJlbnRWYWxpZGF0aW9uUnVuSWQrKzt2YXIgaz10aGlzLiQkY3VycmVudFZhbGlkYXRpb25SdW5JZCxoPXRoaXM7KGZ1bmN0aW9uKCl7dmFyIGE9aC4kJHBhcnNlck5hbWU7aWYoeihoLiQkcGFyc2VyVmFsaWQpKWYoYSxudWxsKTtlbHNlIHJldHVybiBoLiQkcGFyc2VyVmFsaWR8fChyKGguJHZhbGlkYXRvcnMsZnVuY3Rpb24oYSxiKXtmKGIsbnVsbCl9KSxyKGguJGFzeW5jVmFsaWRhdG9ycyxmdW5jdGlvbihhLGIpe2YoYixudWxsKX0pKSxmKGEsaC4kJHBhcnNlclZhbGlkKSxoLiQkcGFyc2VyVmFsaWQ7cmV0dXJuITB9KSgpP2MoKT9lKCk6ZyghMSk6ZyghMSl9LCRjb21taXRWaWV3VmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiR2aWV3VmFsdWU7dGhpcy4kJHRpbWVvdXQuY2FuY2VsKHRoaXMuJCRwZW5kaW5nRGVib3VuY2UpO2lmKHRoaXMuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlIT09CiAgICAgICAgICAgIGF8fCIiPT09YSYmdGhpcy4kJGhhc05hdGl2ZVZhbGlkYXRvcnMpdGhpcy4kJHVwZGF0ZUVtcHR5Q2xhc3NlcyhhKSx0aGlzLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZT1hLHRoaXMuJHByaXN0aW5lJiZ0aGlzLiRzZXREaXJ0eSgpLHRoaXMuJCRwYXJzZUFuZFZhbGlkYXRlKCl9LCQkcGFyc2VBbmRWYWxpZGF0ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlLGI9dGhpczt0aGlzLiQkcGFyc2VyVmFsaWQ9eihhKT92b2lkIDA6ITA7dGhpcy4kc2V0VmFsaWRpdHkodGhpcy4kJHBhcnNlck5hbWUsbnVsbCk7dGhpcy4kJHBhcnNlck5hbWU9InBhcnNlIjtpZih0aGlzLiQkcGFyc2VyVmFsaWQpZm9yKHZhciBkPTA7ZDx0aGlzLiRwYXJzZXJzLmxlbmd0aDtkKyspaWYoYT10aGlzLiRwYXJzZXJzW2RdKGEpLHooYSkpe3RoaXMuJCRwYXJzZXJWYWxpZD0hMTticmVha31YKHRoaXMuJG1vZGVsVmFsdWUpJiYodGhpcy4kbW9kZWxWYWx1ZT10aGlzLiQkbmdNb2RlbEdldCh0aGlzLiQkc2NvcGUpKTsKICAgICAgICAgICAgdmFyIGM9dGhpcy4kbW9kZWxWYWx1ZSxlPXRoaXMuJG9wdGlvbnMuZ2V0T3B0aW9uKCJhbGxvd0ludmFsaWQiKTt0aGlzLiQkcmF3TW9kZWxWYWx1ZT1hO2UmJih0aGlzLiRtb2RlbFZhbHVlPWEsYi4kbW9kZWxWYWx1ZSE9PWMmJmIuJCR3cml0ZU1vZGVsVG9TY29wZSgpKTt0aGlzLiQkcnVuVmFsaWRhdG9ycyhhLHRoaXMuJCRsYXN0Q29tbWl0dGVkVmlld1ZhbHVlLGZ1bmN0aW9uKGQpe2V8fChiLiRtb2RlbFZhbHVlPWQ/YTp2b2lkIDAsYi4kbW9kZWxWYWx1ZSE9PWMmJmIuJCR3cml0ZU1vZGVsVG9TY29wZSgpKX0pfSwkJHdyaXRlTW9kZWxUb1Njb3BlOmZ1bmN0aW9uKCl7dGhpcy4kJG5nTW9kZWxTZXQodGhpcy4kJHNjb3BlLHRoaXMuJG1vZGVsVmFsdWUpO3IodGhpcy4kdmlld0NoYW5nZUxpc3RlbmVycyxmdW5jdGlvbihhKXt0cnl7YSgpfWNhdGNoKGIpe3RoaXMuJCRleGNlcHRpb25IYW5kbGVyKGIpfX0sdGhpcyl9LCRzZXRWaWV3VmFsdWU6ZnVuY3Rpb24oYSxiKXt0aGlzLiR2aWV3VmFsdWU9CiAgICAgICAgICAgIGE7dGhpcy4kb3B0aW9ucy5nZXRPcHRpb24oInVwZGF0ZU9uRGVmYXVsdCIpJiZ0aGlzLiQkZGVib3VuY2VWaWV3VmFsdWVDb21taXQoYil9LCQkZGVib3VuY2VWaWV3VmFsdWVDb21taXQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy4kb3B0aW9ucy5nZXRPcHRpb24oImRlYm91bmNlIik7VyhiW2FdKT9iPWJbYV06VyhiWyJkZWZhdWx0Il0pJiYtMT09PXRoaXMuJG9wdGlvbnMuZ2V0T3B0aW9uKCJ1cGRhdGVPbiIpLmluZGV4T2YoYSk/Yj1iWyJkZWZhdWx0Il06VyhiWyIqIl0pJiYoYj1iWyIqIl0pO3RoaXMuJCR0aW1lb3V0LmNhbmNlbCh0aGlzLiQkcGVuZGluZ0RlYm91bmNlKTt2YXIgZD10aGlzOzA8Yj90aGlzLiQkcGVuZGluZ0RlYm91bmNlPXRoaXMuJCR0aW1lb3V0KGZ1bmN0aW9uKCl7ZC4kY29tbWl0Vmlld1ZhbHVlKCl9LGIpOnRoaXMuJCRyb290U2NvcGUuJCRwaGFzZT90aGlzLiRjb21taXRWaWV3VmFsdWUoKTp0aGlzLiQkc2NvcGUuJGFwcGx5KGZ1bmN0aW9uKCl7ZC4kY29tbWl0Vmlld1ZhbHVlKCl9KX0sCiAgICAgICAgJG92ZXJyaWRlTW9kZWxPcHRpb25zOmZ1bmN0aW9uKGEpe3RoaXMuJG9wdGlvbnM9dGhpcy4kb3B0aW9ucy5jcmVhdGVDaGlsZChhKTt0aGlzLiQkc2V0VXBkYXRlT25FdmVudHMoKX0sJHByb2Nlc3NNb2RlbFZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kJGZvcm1hdCgpO3RoaXMuJHZpZXdWYWx1ZSE9PWEmJih0aGlzLiQkdXBkYXRlRW1wdHlDbGFzc2VzKGEpLHRoaXMuJHZpZXdWYWx1ZT10aGlzLiQkbGFzdENvbW1pdHRlZFZpZXdWYWx1ZT1hLHRoaXMuJHJlbmRlcigpLHRoaXMuJCRydW5WYWxpZGF0b3JzKHRoaXMuJG1vZGVsVmFsdWUsdGhpcy4kdmlld1ZhbHVlLEUpKX0sJCRmb3JtYXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy4kZm9ybWF0dGVycyxiPWEubGVuZ3RoLGQ9dGhpcy4kbW9kZWxWYWx1ZTtiLS07KWQ9YVtiXShkKTtyZXR1cm4gZH0sJCRzZXRNb2RlbFZhbHVlOmZ1bmN0aW9uKGEpe3RoaXMuJG1vZGVsVmFsdWU9dGhpcy4kJHJhd01vZGVsVmFsdWU9YTt0aGlzLiQkcGFyc2VyVmFsaWQ9CiAgICAgICAgICAgIHZvaWQgMDt0aGlzLiRwcm9jZXNzTW9kZWxWYWx1ZSgpfSwkJHNldFVwZGF0ZU9uRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy4kJHVwZGF0ZUV2ZW50cyYmdGhpcy4kJGVsZW1lbnQub2ZmKHRoaXMuJCR1cGRhdGVFdmVudHMsdGhpcy4kJHVwZGF0ZUV2ZW50SGFuZGxlcik7aWYodGhpcy4kJHVwZGF0ZUV2ZW50cz10aGlzLiRvcHRpb25zLmdldE9wdGlvbigidXBkYXRlT24iKSl0aGlzLiQkZWxlbWVudC5vbih0aGlzLiQkdXBkYXRlRXZlbnRzLHRoaXMuJCR1cGRhdGVFdmVudEhhbmRsZXIpfSwkJHVwZGF0ZUV2ZW50SGFuZGxlcjpmdW5jdGlvbihhKXt0aGlzLiQkZGVib3VuY2VWaWV3VmFsdWVDb21taXQoYSYmYS50eXBlKX19O2FlKHtjbGF6ejpSYixzZXQ6ZnVuY3Rpb24oYSxiKXthW2JdPSEwfSx1bnNldDpmdW5jdGlvbihhLGIpe2RlbGV0ZSBhW2JdfX0pO3ZhciBwZj1bIiRyb290U2NvcGUiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiQSIscmVxdWlyZTpbIm5nTW9kZWwiLAogICAgICAgICAgICAiXj9mb3JtIiwiXj9uZ01vZGVsT3B0aW9ucyJdLGNvbnRyb2xsZXI6UmIscHJpb3JpdHk6MSxjb21waWxlOmZ1bmN0aW9uKGIpe2IuYWRkQ2xhc3MoWmEpLmFkZENsYXNzKCJuZy11bnRvdWNoZWQiKS5hZGRDbGFzcyhtYik7cmV0dXJue3ByZTpmdW5jdGlvbihhLGIsZSxmKXt2YXIgZz1mWzBdO2I9ZlsxXXx8Zy4kJHBhcmVudEZvcm07aWYoZj1mWzJdKWcuJG9wdGlvbnM9Zi4kb3B0aW9ucztnLiQkaW5pdEdldHRlclNldHRlcnMoKTtiLiRhZGRDb250cm9sKGcpO2UuJG9ic2VydmUoIm5hbWUiLGZ1bmN0aW9uKGEpe2cuJG5hbWUhPT1hJiZnLiQkcGFyZW50Rm9ybS4kJHJlbmFtZUNvbnRyb2woZyxhKX0pO2EuJG9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXtnLiQkcGFyZW50Rm9ybS4kcmVtb3ZlQ29udHJvbChnKX0pfSxwb3N0OmZ1bmN0aW9uKGIsYyxlLGYpe2Z1bmN0aW9uIGcoKXtrLiRzZXRUb3VjaGVkKCl9dmFyIGs9ZlswXTtrLiQkc2V0VXBkYXRlT25FdmVudHMoKTtjLm9uKCJibHVyIiwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCl7ay4kdG91Y2hlZHx8KGEuJCRwaGFzZT9iLiRldmFsQXN5bmMoZyk6Yi4kYXBwbHkoZykpfSl9fX19fV0sU2Isd2g9Lyhccyt8XilkZWZhdWx0KFxzK3wkKS87TGMucHJvdG90eXBlPXtnZXRPcHRpb246ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJCRvcHRpb25zW2FdfSxjcmVhdGVDaGlsZDpmdW5jdGlvbihhKXt2YXIgYj0hMTthPVMoe30sYSk7cihhLGZ1bmN0aW9uKGQsYyl7IiRpbmhlcml0Ij09PWQ/IioiPT09Yz9iPSEwOihhW2NdPXRoaXMuJCRvcHRpb25zW2NdLCJ1cGRhdGVPbiI9PT1jJiYoYS51cGRhdGVPbkRlZmF1bHQ9dGhpcy4kJG9wdGlvbnMudXBkYXRlT25EZWZhdWx0KSk6InVwZGF0ZU9uIj09PWMmJihhLnVwZGF0ZU9uRGVmYXVsdD0hMSxhW2NdPVUoZC5yZXBsYWNlKHdoLGZ1bmN0aW9uKCl7YS51cGRhdGVPbkRlZmF1bHQ9ITA7cmV0dXJuIiAifSkpKX0sdGhpcyk7YiYmKGRlbGV0ZSBhWyIqIl0sZ2UoYSx0aGlzLiQkb3B0aW9ucykpO2dlKGEsU2IuJCRvcHRpb25zKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBMYyhhKX19O1NiPW5ldyBMYyh7dXBkYXRlT246IiIsdXBkYXRlT25EZWZhdWx0OiEwLGRlYm91bmNlOjAsZ2V0dGVyU2V0dGVyOiExLGFsbG93SW52YWxpZDohMSx0aW1lem9uZTpudWxsfSk7dmFyIHRmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGQpe3RoaXMuJCRhdHRycz1hO3RoaXMuJCRzY29wZT1kfWEuJGluamVjdD1bIiRhdHRycyIsIiRzY29wZSJdO2EucHJvdG90eXBlPXskb25Jbml0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wYXJlbnRDdHJsP3RoaXMucGFyZW50Q3RybC4kb3B0aW9uczpTYixkPXRoaXMuJCRzY29wZS4kZXZhbCh0aGlzLiQkYXR0cnMubmdNb2RlbE9wdGlvbnMpO3RoaXMuJG9wdGlvbnM9YS5jcmVhdGVDaGlsZChkKX19O3JldHVybntyZXN0cmljdDoiQSIscHJpb3JpdHk6MTAscmVxdWlyZTp7cGFyZW50Q3RybDoiP15ebmdNb2RlbE9wdGlvbnMifSxiaW5kVG9Db250cm9sbGVyOiEwLGNvbnRyb2xsZXI6YX19LGRmPVJhKHt0ZXJtaW5hbDohMCwKICAgICAgICBwcmlvcml0eToxRTN9KSx4aD1GKCJuZ09wdGlvbnMiKSx5aD0vXlxzKihbXHNcU10rPykoPzpccythc1xzKyhbXHNcU10rPykpPyg/OlxzK2dyb3VwXHMrYnlccysoW1xzXFNdKz8pKT8oPzpccytkaXNhYmxlXHMrd2hlblxzKyhbXHNcU10rPykpP1xzK2ZvclxzKyg/OihbJFx3XVskXHddKil8KD86XChccyooWyRcd11bJFx3XSopXHMqLFxzKihbJFx3XVskXHddKilccypcKSkpXHMraW5ccysoW1xzXFNdKz8pKD86XHMrdHJhY2tccytieVxzKyhbXHNcU10rPykpPyQvLG5mPVsiJGNvbXBpbGUiLCIkZG9jdW1lbnQiLCIkcGFyc2UiLGZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBjKGEsYixjKXtmdW5jdGlvbiBlKGEsYixjLGQsZil7dGhpcy5zZWxlY3RWYWx1ZT1hO3RoaXMudmlld1ZhbHVlPWI7dGhpcy5sYWJlbD1jO3RoaXMuZ3JvdXA9ZDt0aGlzLmRpc2FibGVkPWZ9ZnVuY3Rpb24gZihhKXt2YXIgYjtpZighciYmeWEoYSkpYj1hO2Vsc2V7Yj1bXTtmb3IodmFyIGMgaW4gYSlhLmhhc093blByb3BlcnR5KGMpJiYKICAgICIkIiE9PWMuY2hhckF0KDApJiZiLnB1c2goYyl9cmV0dXJuIGJ9dmFyIHA9YS5tYXRjaCh5aCk7aWYoIXApdGhyb3cgeGgoImlleHAiLGEsemEoYikpO3ZhciBuPXBbNV18fHBbN10scj1wWzZdO2E9LyBhcyAvLnRlc3QocFswXSkmJnBbMV07dmFyIHE9cFs5XTtiPWQocFsyXT9wWzFdOm4pO3ZhciB0PWEmJmQoYSl8fGIsdz1xJiZkKHEpLHY9cT9mdW5jdGlvbihhLGIpe3JldHVybiB3KGMsYil9OmZ1bmN0aW9uKGEpe3JldHVybiBMYShhKX0seD1mdW5jdGlvbihhLGIpe3JldHVybiB2KGEsQShhLGIpKX0sej1kKHBbMl18fHBbMV0pLHk9ZChwWzNdfHwiIiksSj1kKHBbNF18fCIiKSxJPWQocFs4XSksQj17fSxBPXI/ZnVuY3Rpb24oYSxiKXtCW3JdPWI7QltuXT1hO3JldHVybiBCfTpmdW5jdGlvbihhKXtCW25dPWE7cmV0dXJuIEJ9O3JldHVybnt0cmFja0J5OnEsZ2V0VHJhY2tCeVZhbHVlOngsZ2V0V2F0Y2hhYmxlczpkKEksZnVuY3Rpb24oYSl7dmFyIGI9W107YT1hfHxbXTtmb3IodmFyIGQ9CiAgICAgICAgICAgIGYoYSksZT1kLmxlbmd0aCxnPTA7ZzxlO2crKyl7dmFyIGs9YT09PWQ/ZzpkW2ddLGw9YVtrXSxrPUEobCxrKSxsPXYobCxrKTtiLnB1c2gobCk7aWYocFsyXXx8cFsxXSlsPXooYyxrKSxiLnB1c2gobCk7cFs0XSYmKGs9SihjLGspLGIucHVzaChrKSl9cmV0dXJuIGJ9KSxnZXRPcHRpb25zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sZD1JKGMpfHxbXSxnPWYoZCksaz1nLmxlbmd0aCxuPTA7bjxrO24rKyl7dmFyIHA9ZD09PWc/bjpnW25dLHI9QShkW3BdLHApLHM9dChjLHIpLHA9dihzLHIpLHc9eihjLHIpLEI9eShjLHIpLHI9SihjLHIpLHM9bmV3IGUocCxzLHcsQixyKTthLnB1c2gocyk7YltwXT1zfXJldHVybntpdGVtczphLHNlbGVjdFZhbHVlTWFwOmIsZ2V0T3B0aW9uRnJvbVZpZXdWYWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYlt4KGEpXX0sZ2V0Vmlld1ZhbHVlRnJvbU9wdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4gcT9JYShhLnZpZXdWYWx1ZSk6YS52aWV3VmFsdWV9fX19fQogICAgICAgIHZhciBlPUMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIiksZj1DLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGdyb3VwIik7cmV0dXJue3Jlc3RyaWN0OiJBIix0ZXJtaW5hbDohMCxyZXF1aXJlOlsic2VsZWN0IiwibmdNb2RlbCJdLGxpbms6e3ByZTpmdW5jdGlvbihhLGIsYyxkKXtkWzBdLnJlZ2lzdGVyT3B0aW9uPUV9LHBvc3Q6ZnVuY3Rpb24oZCxrLGgsbCl7ZnVuY3Rpb24gbShhKXt2YXIgYj0oYT12LmdldE9wdGlvbkZyb21WaWV3VmFsdWUoYSkpJiZhLmVsZW1lbnQ7YiYmIWIuc2VsZWN0ZWQmJihiLnNlbGVjdGVkPSEwKTtyZXR1cm4gYX1mdW5jdGlvbiBwKGEsYil7YS5lbGVtZW50PWI7Yi5kaXNhYmxlZD1hLmRpc2FibGVkO2EubGFiZWwhPT1iLmxhYmVsJiYoYi5sYWJlbD1hLmxhYmVsLGIudGV4dENvbnRlbnQ9YS5sYWJlbCk7Yi52YWx1ZT1hLnNlbGVjdFZhbHVlfXZhciBuPWxbMF0scT1sWzFdLHo9aC5tdWx0aXBsZTtsPTA7Zm9yKHZhciB0PWsuY2hpbGRyZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQj10Lmxlbmd0aDtsPEI7bCsrKWlmKCIiPT09dFtsXS52YWx1ZSl7bi5oYXNFbXB0eU9wdGlvbj0hMDtuLmVtcHR5T3B0aW9uPXQuZXEobCk7YnJlYWt9ay5lbXB0eSgpO2w9ISFuLmVtcHR5T3B0aW9uO3goZS5jbG9uZU5vZGUoITEpKS52YWwoIj8iKTt2YXIgdixBPWMoaC5uZ09wdGlvbnMsayxkKSxDPWJbMF0uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO24uZ2VuZXJhdGVVbmtub3duT3B0aW9uVmFsdWU9ZnVuY3Rpb24oYSl7cmV0dXJuIj8ifTt6PyhuLndyaXRlVmFsdWU9ZnVuY3Rpb24oYSl7aWYodil7dmFyIGI9YSYmYS5tYXAobSl8fFtdO3YuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihhKXthLmVsZW1lbnQuc2VsZWN0ZWQmJi0xPT09QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChiLGEpJiYoYS5lbGVtZW50LnNlbGVjdGVkPSExKX0pfX0sbi5yZWFkVmFsdWU9ZnVuY3Rpb24oKXt2YXIgYT1rLnZhbCgpfHxbXSxiPVtdO3IoYSxmdW5jdGlvbihhKXsoYT12LnNlbGVjdFZhbHVlTWFwW2FdKSYmCiAgICAgICAgICAgICAgICAhYS5kaXNhYmxlZCYmYi5wdXNoKHYuZ2V0Vmlld1ZhbHVlRnJvbU9wdGlvbihhKSl9KTtyZXR1cm4gYn0sQS50cmFja0J5JiZkLiR3YXRjaENvbGxlY3Rpb24oZnVuY3Rpb24oKXtpZihIKHEuJHZpZXdWYWx1ZSkpcmV0dXJuIHEuJHZpZXdWYWx1ZS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIEEuZ2V0VHJhY2tCeVZhbHVlKGEpfSl9LGZ1bmN0aW9uKCl7cS4kcmVuZGVyKCl9KSk6KG4ud3JpdGVWYWx1ZT1mdW5jdGlvbihhKXtpZih2KXt2YXIgYj1rWzBdLm9wdGlvbnNba1swXS5zZWxlY3RlZEluZGV4XSxjPXYuZ2V0T3B0aW9uRnJvbVZpZXdWYWx1ZShhKTtiJiZiLnJlbW92ZUF0dHJpYnV0ZSgic2VsZWN0ZWQiKTtjPyhrWzBdLnZhbHVlIT09Yy5zZWxlY3RWYWx1ZSYmKG4ucmVtb3ZlVW5rbm93bk9wdGlvbigpLGtbMF0udmFsdWU9Yy5zZWxlY3RWYWx1ZSxjLmVsZW1lbnQuc2VsZWN0ZWQ9ITApLGMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIiwic2VsZWN0ZWQiKSk6bi5zZWxlY3RVbmtub3duT3JFbXB0eU9wdGlvbihhKX19LAogICAgICAgICAgICAgICAgICAgIG4ucmVhZFZhbHVlPWZ1bmN0aW9uKCl7dmFyIGE9di5zZWxlY3RWYWx1ZU1hcFtrLnZhbCgpXTtyZXR1cm4gYSYmIWEuZGlzYWJsZWQ/KG4udW5zZWxlY3RFbXB0eU9wdGlvbigpLG4ucmVtb3ZlVW5rbm93bk9wdGlvbigpLHYuZ2V0Vmlld1ZhbHVlRnJvbU9wdGlvbihhKSk6bnVsbH0sQS50cmFja0J5JiZkLiR3YXRjaChmdW5jdGlvbigpe3JldHVybiBBLmdldFRyYWNrQnlWYWx1ZShxLiR2aWV3VmFsdWUpfSxmdW5jdGlvbigpe3EuJHJlbmRlcigpfSkpO2wmJihhKG4uZW1wdHlPcHRpb24pKGQpLGsucHJlcGVuZChuLmVtcHR5T3B0aW9uKSw4PT09bi5lbXB0eU9wdGlvblswXS5ub2RlVHlwZT8obi5oYXNFbXB0eU9wdGlvbj0hMSxuLnJlZ2lzdGVyT3B0aW9uPWZ1bmN0aW9uKGEsYil7IiI9PT1iLnZhbCgpJiYobi5oYXNFbXB0eU9wdGlvbj0hMCxuLmVtcHR5T3B0aW9uPWIsbi5lbXB0eU9wdGlvbi5yZW1vdmVDbGFzcygibmctc2NvcGUiKSxxLiRyZW5kZXIoKSxiLm9uKCIkZGVzdHJveSIsCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKXt2YXIgYT1uLiRpc0VtcHR5T3B0aW9uU2VsZWN0ZWQoKTtuLmhhc0VtcHR5T3B0aW9uPSExO24uZW1wdHlPcHRpb249dm9pZCAwO2EmJnEuJHJlbmRlcigpfSkpfSk6bi5lbXB0eU9wdGlvbi5yZW1vdmVDbGFzcygibmctc2NvcGUiKSk7ZC4kd2F0Y2hDb2xsZWN0aW9uKEEuZ2V0V2F0Y2hhYmxlcyxmdW5jdGlvbigpe3ZhciBhPXYmJm4ucmVhZFZhbHVlKCk7aWYodilmb3IodmFyIGI9di5pdGVtcy5sZW5ndGgtMTswPD1iO2ItLSl7dmFyIGM9di5pdGVtc1tiXTt3KGMuZ3JvdXApP0ZiKGMuZWxlbWVudC5wYXJlbnROb2RlKTpGYihjLmVsZW1lbnQpfXY9QS5nZXRPcHRpb25zKCk7dmFyIGQ9e307di5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiO2lmKHcoYS5ncm91cCkpe2I9ZFthLmdyb3VwXTtifHwoYj1mLmNsb25lTm9kZSghMSksQy5hcHBlbmRDaGlsZChiKSxiLmxhYmVsPW51bGw9PT1hLmdyb3VwPyJudWxsIjphLmdyb3VwLGRbYS5ncm91cF09Yik7CiAgICAgICAgICAgICAgICAgICAgdmFyIGM9ZS5jbG9uZU5vZGUoITEpO2IuYXBwZW5kQ2hpbGQoYyk7cChhLGMpfWVsc2UgYj1lLmNsb25lTm9kZSghMSksQy5hcHBlbmRDaGlsZChiKSxwKGEsYil9KTtrWzBdLmFwcGVuZENoaWxkKEMpO3EuJHJlbmRlcigpO3EuJGlzRW1wdHkoYSl8fChiPW4ucmVhZFZhbHVlKCksKEEudHJhY2tCeXx8ej92YShhLGIpOmE9PT1iKXx8KHEuJHNldFZpZXdWYWx1ZShiKSxxLiRyZW5kZXIoKSkpfSl9fX19XSxlZj1bIiRsb2NhbGUiLCIkaW50ZXJwb2xhdGUiLCIkbG9nIixmdW5jdGlvbihhLGIsZCl7dmFyIGM9L3t9L2csZT0vXndoZW4oTWludXMpPyguKykkLztyZXR1cm57bGluazpmdW5jdGlvbihmLGcsayl7ZnVuY3Rpb24gaChhKXtnLnRleHQoYXx8IiIpfXZhciBsPWsuY291bnQsbT1rLiRhdHRyLndoZW4mJmcuYXR0cihrLiRhdHRyLndoZW4pLHA9ay5vZmZzZXR8fDAsbj1mLiRldmFsKG0pfHx7fSxxPXt9LHc9Yi5zdGFydFN5bWJvbCgpLHQ9Yi5lbmRTeW1ib2woKSx4PXcrbCsiLSIrCiAgICAgICAgICAgIHArdCx2PWNhLm5vb3AsQTtyKGssZnVuY3Rpb24oYSxiKXt2YXIgYz1lLmV4ZWMoYik7YyYmKGM9KGNbMV0/Ii0iOiIiKStLKGNbMl0pLG5bY109Zy5hdHRyKGsuJGF0dHJbYl0pKX0pO3IobixmdW5jdGlvbihhLGQpe3FbZF09YihhLnJlcGxhY2UoYyx4KSl9KTtmLiR3YXRjaChsLGZ1bmN0aW9uKGIpe3ZhciBjPXBhcnNlRmxvYXQoYiksZT1YKGMpO2V8fGMgaW4gbnx8KGM9YS5wbHVyYWxDYXQoYy1wKSk7Yz09PUF8fGUmJlgoQSl8fCh2KCksZT1xW2NdLHooZSk/KG51bGwhPWImJmQuZGVidWcoIm5nUGx1cmFsaXplOiBubyBydWxlIGRlZmluZWQgZm9yICciK2MrIicgaW4gIittKSx2PUUsaCgpKTp2PWYuJHdhdGNoKGUsaCksQT1jKX0pfX19XSxxZT1GKCJuZ1JlZiIpLGZmPVsiJHBhcnNlIixmdW5jdGlvbihhKXtyZXR1cm57cHJpb3JpdHk6LTEscmVzdHJpY3Q6IkEiLGNvbXBpbGU6ZnVuY3Rpb24oYixkKXt2YXIgYz13YSh1YShiKSksZT1hKGQubmdSZWYpLGY9ZS5hc3NpZ258fAogICAgICAgICAgICBmdW5jdGlvbigpe3Rocm93IHFlKCJub25hc3NpZ24iLGQubmdSZWYpO307cmV0dXJuIGZ1bmN0aW9uKGEsYixoKXt2YXIgbDtpZihoLmhhc093blByb3BlcnR5KCJuZ1JlZlJlYWQiKSlpZigiJGVsZW1lbnQiPT09aC5uZ1JlZlJlYWQpbD1iO2Vsc2V7aWYobD1iLmRhdGEoIiQiK2gubmdSZWZSZWFkKyJDb250cm9sbGVyIiksIWwpdGhyb3cgcWUoIm5vY3RybCIsaC5uZ1JlZlJlYWQsZC5uZ1JlZik7fWVsc2UgbD1iLmRhdGEoIiQiK2MrIkNvbnRyb2xsZXIiKTtsPWx8fGI7ZihhLGwpO2Iub24oIiRkZXN0cm95IixmdW5jdGlvbigpe2UoYSk9PT1sJiZmKGEsbnVsbCl9KX19fX1dLGdmPVsiJHBhcnNlIiwiJGFuaW1hdGUiLCIkY29tcGlsZSIsZnVuY3Rpb24oYSxiLGQpe3ZhciBjPUYoIm5nUmVwZWF0IiksZT1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXthW2NdPWQ7ZSYmKGFbZV09Zik7YS4kaW5kZXg9YjthLiRmaXJzdD0wPT09YjthLiRsYXN0PWI9PT1nLTE7YS4kbWlkZGxlPSEoYS4kZmlyc3R8fAogICAgICAgIGEuJGxhc3QpO2EuJG9kZD0hKGEuJGV2ZW49MD09PShiJjEpKX0sZj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIExhKGMpfSxnPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGJ9O3JldHVybntyZXN0cmljdDoiQSIsbXVsdGlFbGVtZW50OiEwLHRyYW5zY2x1ZGU6ImVsZW1lbnQiLHByaW9yaXR5OjFFMyx0ZXJtaW5hbDohMCwkJHRsYjohMCxjb21waWxlOmZ1bmN0aW9uKGssaCl7dmFyIGw9aC5uZ1JlcGVhdCxtPWQuJCRjcmVhdGVDb21tZW50KCJlbmQgbmdSZXBlYXQiLGwpLHA9bC5tYXRjaCgvXlxzKihbXHNcU10rPylccytpblxzKyhbXHNcU10rPykoPzpccythc1xzKyhbXHNcU10rPykpPyg/OlxzK3RyYWNrXHMrYnlccysoW1xzXFNdKz8pKT9ccyokLyk7aWYoIXApdGhyb3cgYygiaWV4cCIsbCk7dmFyIG49cFsxXSxxPXBbMl0sdz1wWzNdLHQ9cFs0XSxwPW4ubWF0Y2goL14oPzooXHMqWyRcd10rKXxcKFxzKihbJFx3XSspXHMqLFxzKihbJFx3XSspXHMqXCkpJC8pO2lmKCFwKXRocm93IGMoImlpZGV4cCIsCiAgICAgICAgICAgIG4pO3ZhciB4PXBbM118fHBbMV0sdj1wWzJdO2lmKHcmJighL15bJGEtekEtWl9dWyRhLXpBLVowLTlfXSokLy50ZXN0KHcpfHwvXihudWxsfHVuZGVmaW5lZHx0aGlzfFwkaW5kZXh8XCRmaXJzdHxcJG1pZGRsZXxcJGxhc3R8XCRldmVufFwkb2RkfFwkcGFyZW50fFwkcm9vdHxcJGlkKSQvLnRlc3QodykpKXRocm93IGMoImJhZGlkZW50Iix3KTt2YXIgejtpZih0KXt2YXIgQT17JGlkOkxhfSx5PWEodCk7ej1mdW5jdGlvbihhLGIsYyxkKXt2JiYoQVt2XT1iKTtBW3hdPWM7QS4kaW5kZXg9ZDtyZXR1cm4geShhLEEpfX1yZXR1cm4gZnVuY3Rpb24oYSxkLGgsayxuKXt2YXIgcD1UKCk7YS4kd2F0Y2hDb2xsZWN0aW9uKHEsZnVuY3Rpb24oaCl7dmFyIGsscSx0PWRbMF0scyx5PVQoKSxCLEMsRSxELEgsRixLO3cmJihhW3ddPWgpO2lmKHlhKGgpKUg9aCxxPXp8fGY7ZWxzZSBmb3IoSyBpbiBxPXp8fGcsSD1bXSxoKXRhLmNhbGwoaCxLKSYmIiQiIT09Sy5jaGFyQXQoMCkmJkgucHVzaChLKTsKICAgICAgICAgICAgQj1ILmxlbmd0aDtLPUFycmF5KEIpO2ZvcihrPTA7azxCO2srKylpZihDPWg9PT1IP2s6SFtrXSxFPWhbQ10sRD1xKGEsQyxFLGspLHBbRF0pRj1wW0RdLGRlbGV0ZSBwW0RdLHlbRF09RixLW2tdPUY7ZWxzZXtpZih5W0RdKXRocm93IHIoSyxmdW5jdGlvbihhKXthJiZhLnNjb3BlJiYocFthLmlkXT1hKX0pLGMoImR1cGVzIixsLEQsRSk7S1trXT17aWQ6RCxzY29wZTp2b2lkIDAsY2xvbmU6dm9pZCAwfTt5W0RdPSEwfUEmJihBW3hdPXZvaWQgMCk7Zm9yKHMgaW4gcCl7Rj1wW3NdO0Q9dGIoRi5jbG9uZSk7Yi5sZWF2ZShEKTtpZihEWzBdLnBhcmVudE5vZGUpZm9yKGs9MCxxPUQubGVuZ3RoO2s8cTtrKyspRFtrXS4kJE5HX1JFTU9WRUQ9ITA7Ri5zY29wZS4kZGVzdHJveSgpfWZvcihrPTA7azxCO2srKylpZihDPWg9PT1IP2s6SFtrXSxFPWhbQ10sRj1LW2tdLEYuc2NvcGUpe3M9dDtkbyBzPXMubmV4dFNpYmxpbmc7d2hpbGUocyYmcy4kJE5HX1JFTU9WRUQpO0YuY2xvbmVbMF0hPT0KICAgICAgICAgICAgcyYmYi5tb3ZlKHRiKEYuY2xvbmUpLG51bGwsdCk7dD1GLmNsb25lW0YuY2xvbmUubGVuZ3RoLTFdO2UoRi5zY29wZSxrLHgsRSx2LEMsQil9ZWxzZSBuKGZ1bmN0aW9uKGEsYyl7Ri5zY29wZT1jO3ZhciBkPW0uY2xvbmVOb2RlKCExKTthW2EubGVuZ3RoKytdPWQ7Yi5lbnRlcihhLG51bGwsdCk7dD1kO0YuY2xvbmU9YTt5W0YuaWRdPUY7ZShGLnNjb3BlLGsseCxFLHYsQyxCKX0pO3A9eX0pfX19fV0saGY9WyIkYW5pbWF0ZSIsZnVuY3Rpb24oYSl7cmV0dXJue3Jlc3RyaWN0OiJBIixtdWx0aUVsZW1lbnQ6ITAsbGluazpmdW5jdGlvbihiLGQsYyl7Yi4kd2F0Y2goYy5uZ1Nob3csZnVuY3Rpb24oYil7YVtiPyJyZW1vdmVDbGFzcyI6ImFkZENsYXNzIl0oZCwibmctaGlkZSIse3RlbXBDbGFzc2VzOiJuZy1oaWRlLWFuaW1hdGUifSl9KX19fV0sJGU9WyIkYW5pbWF0ZSIsZnVuY3Rpb24oYSl7cmV0dXJue3Jlc3RyaWN0OiJBIixtdWx0aUVsZW1lbnQ6ITAsbGluazpmdW5jdGlvbihiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQsYyl7Yi4kd2F0Y2goYy5uZ0hpZGUsZnVuY3Rpb24oYil7YVtiPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZCwibmctaGlkZSIse3RlbXBDbGFzc2VzOiJuZy1oaWRlLWFuaW1hdGUifSl9KX19fV0samY9UmEoZnVuY3Rpb24oYSxiLGQpe2EuJHdhdGNoQ29sbGVjdGlvbihkLm5nU3R5bGUsZnVuY3Rpb24oYSxkKXtkJiZhIT09ZCYmKGF8fChhPXt9KSxyKGQsZnVuY3Rpb24oYixkKXtudWxsPT1hW2RdJiYoYVtkXT0iIil9KSk7YSYmYi5jc3MoYSl9KX0pLGtmPVsiJGFuaW1hdGUiLCIkY29tcGlsZSIsZnVuY3Rpb24oYSxiKXtyZXR1cm57cmVxdWlyZToibmdTd2l0Y2giLGNvbnRyb2xsZXI6WyIkc2NvcGUiLGZ1bmN0aW9uKCl7dGhpcy5jYXNlcz17fX1dLGxpbms6ZnVuY3Rpb24oZCxjLGUsZil7dmFyIGc9W10saz1bXSxoPVtdLGw9W10sbT1mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbihjKXshMSE9PWMmJmEuc3BsaWNlKGIsMSl9fTtkLiR3YXRjaChlLm5nU3dpdGNofHwKICAgICAgICAgICAgZS5vbixmdW5jdGlvbihjKXtmb3IodmFyIGQsZTtoLmxlbmd0aDspYS5jYW5jZWwoaC5wb3AoKSk7ZD0wO2ZvcihlPWwubGVuZ3RoO2Q8ZTsrK2Qpe3ZhciBxPXRiKGtbZF0uY2xvbmUpO2xbZF0uJGRlc3Ryb3koKTsoaFtkXT1hLmxlYXZlKHEpKS5kb25lKG0oaCxkKSl9ay5sZW5ndGg9MDtsLmxlbmd0aD0wOyhnPWYuY2FzZXNbIiEiK2NdfHxmLmNhc2VzWyI/Il0pJiZyKGcsZnVuY3Rpb24oYyl7Yy50cmFuc2NsdWRlKGZ1bmN0aW9uKGQsZSl7bC5wdXNoKGUpO3ZhciBmPWMuZWxlbWVudDtkW2QubGVuZ3RoKytdPWIuJCRjcmVhdGVDb21tZW50KCJlbmQgbmdTd2l0Y2hXaGVuIik7ay5wdXNoKHtjbG9uZTpkfSk7YS5lbnRlcihkLGYucGFyZW50KCksZil9KX0pfSl9fX1dLGxmPVJhKHt0cmFuc2NsdWRlOiJlbGVtZW50Iixwcmlvcml0eToxMjAwLHJlcXVpcmU6Il5uZ1N3aXRjaCIsbXVsdGlFbGVtZW50OiEwLGxpbms6ZnVuY3Rpb24oYSxiLGQsYyxlKXthPWQubmdTd2l0Y2hXaGVuLnNwbGl0KGQubmdTd2l0Y2hXaGVuU2VwYXJhdG9yKS5zb3J0KCkuZmlsdGVyKGZ1bmN0aW9uKGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLGMpe3JldHVybiBjW2ItMV0hPT1hfSk7cihhLGZ1bmN0aW9uKGEpe2MuY2FzZXNbIiEiK2FdPWMuY2FzZXNbIiEiK2FdfHxbXTtjLmNhc2VzWyIhIithXS5wdXNoKHt0cmFuc2NsdWRlOmUsZWxlbWVudDpifSl9KX19KSxtZj1SYSh7dHJhbnNjbHVkZToiZWxlbWVudCIscHJpb3JpdHk6MTIwMCxyZXF1aXJlOiJebmdTd2l0Y2giLG11bHRpRWxlbWVudDohMCxsaW5rOmZ1bmN0aW9uKGEsYixkLGMsZSl7Yy5jYXNlc1siPyJdPWMuY2FzZXNbIj8iXXx8W107Yy5jYXNlc1siPyJdLnB1c2goe3RyYW5zY2x1ZGU6ZSxlbGVtZW50OmJ9KX19KSx6aD1GKCJuZ1RyYW5zY2x1ZGUiKSxvZj1bIiRjb21waWxlIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6IkVBQyIsY29tcGlsZTpmdW5jdGlvbihiKXt2YXIgZD1hKGIuY29udGVudHMoKSk7Yi5lbXB0eSgpO3JldHVybiBmdW5jdGlvbihhLGIsZixnLGspe2Z1bmN0aW9uIGgoKXtkKGEsZnVuY3Rpb24oYSl7Yi5hcHBlbmQoYSl9KX1pZighayl0aHJvdyB6aCgib3JwaGFuIiwKICAgICAgICAgICAgemEoYikpO2YubmdUcmFuc2NsdWRlPT09Zi4kYXR0ci5uZ1RyYW5zY2x1ZGUmJihmLm5nVHJhbnNjbHVkZT0iIik7Zj1mLm5nVHJhbnNjbHVkZXx8Zi5uZ1RyYW5zY2x1ZGVTbG90O2soZnVuY3Rpb24oYSxjKXt2YXIgZDtpZihkPWEubGVuZ3RoKWE6e2Q9MDtmb3IodmFyIGY9YS5sZW5ndGg7ZDxmO2QrKyl7dmFyIGc9YVtkXTtpZihnLm5vZGVUeXBlIT09UGF8fGcubm9kZVZhbHVlLnRyaW0oKSl7ZD0hMDticmVhayBhfX1kPXZvaWQgMH1kP2IuYXBwZW5kKGEpOihoKCksYy4kZGVzdHJveSgpKX0sbnVsbCxmKTtmJiYhay5pc1Nsb3RGaWxsZWQoZikmJmgoKX19fX1dLE9lPVsiJHRlbXBsYXRlQ2FjaGUiLGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiRSIsdGVybWluYWw6ITAsY29tcGlsZTpmdW5jdGlvbihiLGQpeyJ0ZXh0L25nLXRlbXBsYXRlIj09PWQudHlwZSYmYS5wdXQoZC5pZCxiWzBdLnRleHQpfX19XSxBaD17JHNldFZpZXdWYWx1ZTpFLCRyZW5kZXI6RX0sQmg9WyIkZWxlbWVudCIsCiAgICAgICAgIiRzY29wZSIsZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBkKCl7Z3x8KGc9ITAsYi4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKXtnPSExO2UubmdNb2RlbEN0cmwuJHJlbmRlcigpfSkpfWZ1bmN0aW9uIGMoYSl7a3x8KGs9ITAsYi4kJHBvc3REaWdlc3QoZnVuY3Rpb24oKXtiLiQkZGVzdHJveWVkfHwoaz0hMSxlLm5nTW9kZWxDdHJsLiRzZXRWaWV3VmFsdWUoZS5yZWFkVmFsdWUoKSksYSYmZS5uZ01vZGVsQ3RybC4kcmVuZGVyKCkpfSkpfXZhciBlPXRoaXMsZj1uZXcgSGI7ZS5zZWxlY3RWYWx1ZU1hcD17fTtlLm5nTW9kZWxDdHJsPUFoO2UubXVsdGlwbGU9ITE7ZS51bmtub3duT3B0aW9uPXgoQy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7ZS5oYXNFbXB0eU9wdGlvbj0hMTtlLmVtcHR5T3B0aW9uPXZvaWQgMDtlLnJlbmRlclVua25vd25PcHRpb249ZnVuY3Rpb24oYil7Yj1lLmdlbmVyYXRlVW5rbm93bk9wdGlvblZhbHVlKGIpO2UudW5rbm93bk9wdGlvbi52YWwoYik7CiAgICAgICAgICAgIGEucHJlcGVuZChlLnVua25vd25PcHRpb24pO09hKGUudW5rbm93bk9wdGlvbiwhMCk7YS52YWwoYil9O2UudXBkYXRlVW5rbm93bk9wdGlvbj1mdW5jdGlvbihiKXtiPWUuZ2VuZXJhdGVVbmtub3duT3B0aW9uVmFsdWUoYik7ZS51bmtub3duT3B0aW9uLnZhbChiKTtPYShlLnVua25vd25PcHRpb24sITApO2EudmFsKGIpfTtlLmdlbmVyYXRlVW5rbm93bk9wdGlvblZhbHVlPWZ1bmN0aW9uKGEpe3JldHVybiI/ICIrTGEoYSkrIiA/In07ZS5yZW1vdmVVbmtub3duT3B0aW9uPWZ1bmN0aW9uKCl7ZS51bmtub3duT3B0aW9uLnBhcmVudCgpJiZlLnVua25vd25PcHRpb24ucmVtb3ZlKCl9O2Uuc2VsZWN0RW1wdHlPcHRpb249ZnVuY3Rpb24oKXtlLmVtcHR5T3B0aW9uJiYoYS52YWwoIiIpLE9hKGUuZW1wdHlPcHRpb24sITApKX07ZS51bnNlbGVjdEVtcHR5T3B0aW9uPWZ1bmN0aW9uKCl7ZS5oYXNFbXB0eU9wdGlvbiYmT2EoZS5lbXB0eU9wdGlvbiwhMSl9O2IuJG9uKCIkZGVzdHJveSIsCiAgICAgICAgICAgIGZ1bmN0aW9uKCl7ZS5yZW5kZXJVbmtub3duT3B0aW9uPUV9KTtlLnJlYWRWYWx1ZT1mdW5jdGlvbigpe3ZhciBiPWEudmFsKCksYj1iIGluIGUuc2VsZWN0VmFsdWVNYXA/ZS5zZWxlY3RWYWx1ZU1hcFtiXTpiO3JldHVybiBlLmhhc09wdGlvbihiKT9iOm51bGx9O2Uud3JpdGVWYWx1ZT1mdW5jdGlvbihiKXt2YXIgYz1hWzBdLm9wdGlvbnNbYVswXS5zZWxlY3RlZEluZGV4XTtjJiZPYSh4KGMpLCExKTtlLmhhc09wdGlvbihiKT8oZS5yZW1vdmVVbmtub3duT3B0aW9uKCksYz1MYShiKSxhLnZhbChjIGluIGUuc2VsZWN0VmFsdWVNYXA/YzpiKSxPYSh4KGFbMF0ub3B0aW9uc1thWzBdLnNlbGVjdGVkSW5kZXhdKSwhMCkpOmUuc2VsZWN0VW5rbm93bk9yRW1wdHlPcHRpb24oYil9O2UuYWRkT3B0aW9uPWZ1bmN0aW9uKGEsYil7aWYoOCE9PWJbMF0ubm9kZVR5cGUpe0phKGEsJyJvcHRpb24gdmFsdWUiJyk7IiI9PT1hJiYoZS5oYXNFbXB0eU9wdGlvbj0hMCxlLmVtcHR5T3B0aW9uPQogICAgICAgICAgICBiKTt2YXIgYz1mLmdldChhKXx8MDtmLnNldChhLGMrMSk7ZCgpfX07ZS5yZW1vdmVPcHRpb249ZnVuY3Rpb24oYSl7dmFyIGI9Zi5nZXQoYSk7YiYmKDE9PT1iPyhmLmRlbGV0ZShhKSwiIj09PWEmJihlLmhhc0VtcHR5T3B0aW9uPSExLGUuZW1wdHlPcHRpb249dm9pZCAwKSk6Zi5zZXQoYSxiLTEpKX07ZS5oYXNPcHRpb249ZnVuY3Rpb24oYSl7cmV0dXJuISFmLmdldChhKX07ZS4kaGFzRW1wdHlPcHRpb249ZnVuY3Rpb24oKXtyZXR1cm4gZS5oYXNFbXB0eU9wdGlvbn07ZS4kaXNVbmtub3duT3B0aW9uU2VsZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gYVswXS5vcHRpb25zWzBdPT09ZS51bmtub3duT3B0aW9uWzBdfTtlLiRpc0VtcHR5T3B0aW9uU2VsZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZS5oYXNFbXB0eU9wdGlvbiYmYVswXS5vcHRpb25zW2FbMF0uc2VsZWN0ZWRJbmRleF09PT1lLmVtcHR5T3B0aW9uWzBdfTtlLnNlbGVjdFVua25vd25PckVtcHR5T3B0aW9uPWZ1bmN0aW9uKGEpe251bGw9PQogICAgICAgIGEmJmUuZW1wdHlPcHRpb24/KGUucmVtb3ZlVW5rbm93bk9wdGlvbigpLGUuc2VsZWN0RW1wdHlPcHRpb24oKSk6ZS51bmtub3duT3B0aW9uLnBhcmVudCgpLmxlbmd0aD9lLnVwZGF0ZVVua25vd25PcHRpb24oYSk6ZS5yZW5kZXJVbmtub3duT3B0aW9uKGEpfTt2YXIgZz0hMSxrPSExO2UucmVnaXN0ZXJPcHRpb249ZnVuY3Rpb24oYSxiLGYsZyxrKXtpZihmLiRhdHRyLm5nVmFsdWUpe3ZhciBxLHI7Zi4kb2JzZXJ2ZSgidmFsdWUiLGZ1bmN0aW9uKGEpe3ZhciBkLGY9Yi5wcm9wKCJzZWxlY3RlZCIpO3cocikmJihlLnJlbW92ZU9wdGlvbihxKSxkZWxldGUgZS5zZWxlY3RWYWx1ZU1hcFtyXSxkPSEwKTtyPUxhKGEpO3E9YTtlLnNlbGVjdFZhbHVlTWFwW3JdPWE7ZS5hZGRPcHRpb24oYSxiKTtiLmF0dHIoInZhbHVlIixyKTtkJiZmJiZjKCl9KX1lbHNlIGc/Zi4kb2JzZXJ2ZSgidmFsdWUiLGZ1bmN0aW9uKGEpe2UucmVhZFZhbHVlKCk7dmFyIGQsZj1iLnByb3AoInNlbGVjdGVkIik7CiAgICAgICAgICAgIHcocSkmJihlLnJlbW92ZU9wdGlvbihxKSxkPSEwKTtxPWE7ZS5hZGRPcHRpb24oYSxiKTtkJiZmJiZjKCl9KTprP2EuJHdhdGNoKGssZnVuY3Rpb24oYSxkKXtmLiRzZXQoInZhbHVlIixhKTt2YXIgZz1iLnByb3AoInNlbGVjdGVkIik7ZCE9PWEmJmUucmVtb3ZlT3B0aW9uKGQpO2UuYWRkT3B0aW9uKGEsYik7ZCYmZyYmYygpfSk6ZS5hZGRPcHRpb24oZi52YWx1ZSxiKTtmLiRvYnNlcnZlKCJkaXNhYmxlZCIsZnVuY3Rpb24oYSl7aWYoInRydWUiPT09YXx8YSYmYi5wcm9wKCJzZWxlY3RlZCIpKWUubXVsdGlwbGU/YyghMCk6KGUubmdNb2RlbEN0cmwuJHNldFZpZXdWYWx1ZShudWxsKSxlLm5nTW9kZWxDdHJsLiRyZW5kZXIoKSl9KTtiLm9uKCIkZGVzdHJveSIsZnVuY3Rpb24oKXt2YXIgYT1lLnJlYWRWYWx1ZSgpLGI9Zi52YWx1ZTtlLnJlbW92ZU9wdGlvbihiKTtkKCk7KGUubXVsdGlwbGUmJmEmJi0xIT09YS5pbmRleE9mKGIpfHxhPT09YikmJmMoITApfSl9fV0sUGU9ZnVuY3Rpb24oKXtyZXR1cm57cmVzdHJpY3Q6IkUiLAogICAgICAgIHJlcXVpcmU6WyJzZWxlY3QiLCI/bmdNb2RlbCJdLGNvbnRyb2xsZXI6QmgscHJpb3JpdHk6MSxsaW5rOntwcmU6ZnVuY3Rpb24oYSxiLGQsYyl7dmFyIGU9Y1swXSxmPWNbMV07aWYoZil7aWYoZS5uZ01vZGVsQ3RybD1mLGIub24oImNoYW5nZSIsZnVuY3Rpb24oKXtlLnJlbW92ZVVua25vd25PcHRpb24oKTthLiRhcHBseShmdW5jdGlvbigpe2YuJHNldFZpZXdWYWx1ZShlLnJlYWRWYWx1ZSgpKX0pfSksZC5tdWx0aXBsZSl7ZS5tdWx0aXBsZT0hMDtlLnJlYWRWYWx1ZT1mdW5jdGlvbigpe3ZhciBhPVtdO3IoYi5maW5kKCJvcHRpb24iKSxmdW5jdGlvbihiKXtiLnNlbGVjdGVkJiYhYi5kaXNhYmxlZCYmKGI9Yi52YWx1ZSxhLnB1c2goYiBpbiBlLnNlbGVjdFZhbHVlTWFwP2Uuc2VsZWN0VmFsdWVNYXBbYl06YikpfSk7cmV0dXJuIGF9O2Uud3JpdGVWYWx1ZT1mdW5jdGlvbihhKXtyKGIuZmluZCgib3B0aW9uIiksZnVuY3Rpb24oYil7dmFyIGM9ISFhJiYoLTEhPT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsCiAgICAgICAgICAgICAgICBiLnZhbHVlKXx8LTEhPT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGEsZS5zZWxlY3RWYWx1ZU1hcFtiLnZhbHVlXSkpO2MhPT1iLnNlbGVjdGVkJiZPYSh4KGIpLGMpfSl9O3ZhciBnLGs9TmFOO2EuJHdhdGNoKGZ1bmN0aW9uKCl7ayE9PWYuJHZpZXdWYWx1ZXx8dmEoZyxmLiR2aWV3VmFsdWUpfHwoZz1qYShmLiR2aWV3VmFsdWUpLGYuJHJlbmRlcigpKTtrPWYuJHZpZXdWYWx1ZX0pO2YuJGlzRW1wdHk9ZnVuY3Rpb24oYSl7cmV0dXJuIWF8fDA9PT1hLmxlbmd0aH19fWVsc2UgZS5yZWdpc3Rlck9wdGlvbj1FfSxwb3N0OmZ1bmN0aW9uKGEsYixkLGMpe3ZhciBlPWNbMV07aWYoZSl7dmFyIGY9Y1swXTtlLiRyZW5kZXI9ZnVuY3Rpb24oKXtmLndyaXRlVmFsdWUoZS4kdmlld1ZhbHVlKX19fX19fSxRZT1bIiRpbnRlcnBvbGF0ZSIsZnVuY3Rpb24oYSl7cmV0dXJue3Jlc3RyaWN0OiJFIixwcmlvcml0eToxMDAsY29tcGlsZTpmdW5jdGlvbihiLGQpe3ZhciBjLGU7dyhkLm5nVmFsdWUpfHwKICAgICAgICAodyhkLnZhbHVlKT9jPWEoZC52YWx1ZSwhMCk6KGU9YShiLnRleHQoKSwhMCkpfHxkLiRzZXQoInZhbHVlIixiLnRleHQoKSkpO3JldHVybiBmdW5jdGlvbihhLGIsZCl7dmFyIGg9Yi5wYXJlbnQoKTsoaD1oLmRhdGEoIiRzZWxlY3RDb250cm9sbGVyIil8fGgucGFyZW50KCkuZGF0YSgiJHNlbGVjdENvbnRyb2xsZXIiKSkmJmgucmVnaXN0ZXJPcHRpb24oYSxiLGQsYyxlKX19fX1dLCRjPVsiJHBhcnNlIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6IkEiLHJlcXVpcmU6Ij9uZ01vZGVsIixsaW5rOmZ1bmN0aW9uKGIsZCxjLGUpe2lmKGUpe3ZhciBmPWMucmVxdWlyZWR8fGEoYy5uZ1JlcXVpcmVkKShiKTtjLnJlcXVpcmVkPSEwO2UuJHZhbGlkYXRvcnMucmVxdWlyZWQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hZnx8IWUuJGlzRW1wdHkoYil9O2MuJG9ic2VydmUoInJlcXVpcmVkIixmdW5jdGlvbihhKXtmIT09YSYmKGY9YSxlLiR2YWxpZGF0ZSgpKX0pfX19fV0sWmM9WyIkcGFyc2UiLAogICAgICAgIGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiQSIscmVxdWlyZToiP25nTW9kZWwiLGNvbXBpbGU6ZnVuY3Rpb24oYixkKXt2YXIgYyxlO2QubmdQYXR0ZXJuJiYoYz1kLm5nUGF0dGVybixlPSIvIj09PWQubmdQYXR0ZXJuLmNoYXJBdCgwKSYmaWUudGVzdChkLm5nUGF0dGVybik/ZnVuY3Rpb24oKXtyZXR1cm4gZC5uZ1BhdHRlcm59OmEoZC5uZ1BhdHRlcm4pKTtyZXR1cm4gZnVuY3Rpb24oYSxiLGQsaCl7aWYoaCl7dmFyIGw9ZC5wYXR0ZXJuO2QubmdQYXR0ZXJuP2w9ZShhKTpjPWQucGF0dGVybjt2YXIgbT1oZShsLGMsYik7ZC4kb2JzZXJ2ZSgicGF0dGVybiIsZnVuY3Rpb24oYSl7dmFyIGQ9bTttPWhlKGEsYyxiKTsoZCYmZC50b1N0cmluZygpKSE9PShtJiZtLnRvU3RyaW5nKCkpJiZoLiR2YWxpZGF0ZSgpfSk7aC4kdmFsaWRhdG9ycy5wYXR0ZXJuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGguJGlzRW1wdHkoYil8fHoobSl8fG0udGVzdChiKX19fX19fV0sYmQ9WyIkcGFyc2UiLAogICAgICAgIGZ1bmN0aW9uKGEpe3JldHVybntyZXN0cmljdDoiQSIscmVxdWlyZToiP25nTW9kZWwiLGxpbms6ZnVuY3Rpb24oYixkLGMsZSl7aWYoZSl7dmFyIGY9Yy5tYXhsZW5ndGh8fGEoYy5uZ01heGxlbmd0aCkoYiksZz1UYihmKTtjLiRvYnNlcnZlKCJtYXhsZW5ndGgiLGZ1bmN0aW9uKGEpe2YhPT1hJiYoZz1UYihhKSxmPWEsZS4kdmFsaWRhdGUoKSl9KTtlLiR2YWxpZGF0b3JzLm1heGxlbmd0aD1mdW5jdGlvbihhLGIpe3JldHVybiAwPmd8fGUuJGlzRW1wdHkoYil8fGIubGVuZ3RoPD1nfX19fX1dLGFkPVsiJHBhcnNlIixmdW5jdGlvbihhKXtyZXR1cm57cmVzdHJpY3Q6IkEiLHJlcXVpcmU6Ij9uZ01vZGVsIixsaW5rOmZ1bmN0aW9uKGIsZCxjLGUpe2lmKGUpe3ZhciBmPWMubWlubGVuZ3RofHxhKGMubmdNaW5sZW5ndGgpKGIpLGc9VGIoZil8fC0xO2MuJG9ic2VydmUoIm1pbmxlbmd0aCIsZnVuY3Rpb24oYSl7ZiE9PWEmJihnPVRiKGEpfHwtMSxmPWEsZS4kdmFsaWRhdGUoKSl9KTsKICAgICAgICAgICAgZS4kdmFsaWRhdG9ycy5taW5sZW5ndGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZS4kaXNFbXB0eShiKXx8Yi5sZW5ndGg+PWd9fX19fV07Qy5hbmd1bGFyLmJvb3RzdHJhcD9DLmNvbnNvbGUmJmNvbnNvbGUubG9nKCJXQVJOSU5HOiBUcmllZCB0byBsb2FkIEFuZ3VsYXJKUyBtb3JlIHRoYW4gb25jZS4iKTooRmUoKSxKZShjYSksY2EubW9kdWxlKCJuZ0xvY2FsZSIsW10sWyIkcHJvdmlkZSIsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXthKz0iIjt2YXIgYj1hLmluZGV4T2YoIi4iKTtyZXR1cm4tMT09Yj8wOmEubGVuZ3RoLWItMX1hLnZhbHVlKCIkbG9jYWxlIix7REFURVRJTUVfRk9STUFUUzp7QU1QTVM6WyJBTSIsIlBNIl0sREFZOiJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheSIuc3BsaXQoIiAiKSxFUkFOQU1FUzpbIkJlZm9yZSBDaHJpc3QiLCJBbm5vIERvbWluaSJdLEVSQVM6WyJCQyIsIkFEIl0sRklSU1REQVlPRldFRUs6NiwKICAgICAgICAgICAgTU9OVEg6IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIiksU0hPUlREQVk6IlN1biBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdCIuc3BsaXQoIiAiKSxTSE9SVE1PTlRIOiJKYW4gRmViIE1hciBBcHIgTWF5IEp1biBKdWwgQXVnIFNlcCBPY3QgTm92IERlYyIuc3BsaXQoIiAiKSxTVEFOREFMT05FTU9OVEg6IkphbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIiLnNwbGl0KCIgIiksV0VFS0VORFJBTkdFOls1LDZdLGZ1bGxEYXRlOiJFRUVFLCBNTU1NIGQsIHkiLGxvbmdEYXRlOiJNTU1NIGQsIHkiLG1lZGl1bToiTU1NIGQsIHkgaDptbTpzcyBhIixtZWRpdW1EYXRlOiJNTU0gZCwgeSIsbWVkaXVtVGltZToiaDptbTpzcyBhIiwic2hvcnQiOiJNL2QveXkgaDptbSBhIiwKICAgICAgICAgICAgc2hvcnREYXRlOiJNL2QveXkiLHNob3J0VGltZToiaDptbSBhIn0sTlVNQkVSX0ZPUk1BVFM6e0NVUlJFTkNZX1NZTToiJCIsREVDSU1BTF9TRVA6Ii4iLEdST1VQX1NFUDoiLCIsUEFUVEVSTlM6W3tnU2l6ZTozLGxnU2l6ZTozLG1heEZyYWM6MyxtaW5GcmFjOjAsbWluSW50OjEsbmVnUHJlOiItIixuZWdTdWY6IiIscG9zUHJlOiIiLHBvc1N1ZjoiIn0se2dTaXplOjMsbGdTaXplOjMsbWF4RnJhYzoyLG1pbkZyYWM6MixtaW5JbnQ6MSxuZWdQcmU6Ii1cdTAwYTQiLG5lZ1N1ZjoiIixwb3NQcmU6Ilx1MDBhNCIscG9zU3VmOiIifV19LGlkOiJlbi11cyIsbG9jYWxlSUQ6ImVuX1VTIixwbHVyYWxDYXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hfDAsZj1jO3ZvaWQgMD09PWYmJihmPU1hdGgubWluKGIoYSksMykpO01hdGgucG93KDEwLGYpO3JldHVybiAxPT1lJiYwPT1mPyJvbmUiOiJvdGhlciJ9fSl9XSkseChmdW5jdGlvbigpe0FlKEMuZG9jdW1lbnQsVWMpfSkpfSkod2luZG93KTsKIXdpbmRvdy5hbmd1bGFyLiQkY3NwKCkubm9JbmxpbmVTdHlsZSYmd2luZG93LmFuZ3VsYXIuZWxlbWVudChkb2N1bWVudC5oZWFkKS5wcmVwZW5kKCc8c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBjaGFyc2V0ICJVVEYtOCI7W25nXFw6Y2xvYWtdLFtuZy1jbG9ha10sW2RhdGEtbmctY2xvYWtdLFt4LW5nLWNsb2FrXSwubmctY2xvYWssLngtbmctY2xvYWssLm5nLWhpZGU6bm90KC5uZy1oaWRlLWFuaW1hdGUpe2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50O31uZ1xcOmZvcm17ZGlzcGxheTpibG9jazt9Lm5nLWFuaW1hdGUtc2hpbXt2aXNpYmlsaXR5OmhpZGRlbjt9Lm5nLWFuY2hvcntwb3NpdGlvbjphYnNvbHV0ZTt9PC9zdHlsZT4nKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9YW5ndWxhci5taW4uanMubWFw","response_hash":"b68762c53831e4420aa8995f99a36599917bc0c8c93a5051a0855859ba555e43","response_time_ms":0,"response_words":3317,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"js","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":17},{"name":"3","value":"angular_1-7-7.js","type":"path","name_start":-1,"name_end":-1,"value_start":18,"value_end":34}],"sent_at":"2026-04-05T05:31:32.170095Z","received_at":"2026-04-05T05:31:32.170088Z","created_at":"2026-04-05T05:31:32Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"8305a76a-f75f-4cb0-a676-103aba959c9a","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/js/react-dom.development.js","url":"https://ginandjuice.shop/resources/js/react-dom.development.js","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvanMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE0LjAuMC4wIFNhZmFyaS81MzcuMzYNCkFjY2VwdC1MYW5ndWFnZTogZW4NClJlZmVyZXI6IGh0dHBzOi8vZ2luYW5kanVpY2Uuc2hvcC8NCg0K","request_hash":"4bf124998f2d7919177838d646a617a783d3ee03bd68c04b532932c3eb1a9576","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["234278"],"content-type":["application/javascript; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:31:31 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/javascript; charset=utf-8","response_content_length":1077021,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY2FjaGUtY29udHJvbDogcHVibGljLCBtYXgtYWdlPTM2MDANCmNvbnRlbnQtbGVuZ3RoOiAyMzQyNzgNCngtYmFja2VuZDogYzk4ZGY1YzQtYTUyNy00ZGFhLTg4Y2QtODNjNWRlNGU3Yzc3DQpkYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMxOjMxIEdNVA0KDQovKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzCiAqCiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi8KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ3JlYWN0JykpIDoKICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ3JlYWN0J10sIGZhY3RvcnkpIDoKICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLlJlYWN0RE9NID0ge30sIGdsb2JhbC5SZWFjdCkpOwp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cywgUmVhY3QpIHsgJ3VzZSBzdHJpY3QnOwoKICB2YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDsKCiAgdmFyIHN1cHByZXNzV2FybmluZyA9IGZhbHNlOwogIGZ1bmN0aW9uIHNldFN1cHByZXNzV2FybmluZyhuZXdTdXBwcmVzc1dhcm5pbmcpIHsKICAgIHsKICAgICAgc3VwcHJlc3NXYXJuaW5nID0gbmV3U3VwcHJlc3NXYXJuaW5nOwogICAgfQogIH0gLy8gSW4gREVWLCBjYWxscyB0byBjb25zb2xlLndhcm4gYW5kIGNvbnNvbGUuZXJyb3IgZ2V0IHJlcGxhY2VkCiAgLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi4KICAvLwogIC8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksCiAgLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLgoKICBmdW5jdGlvbiB3YXJuKGZvcm1hdCkgewogICAgewogICAgICBpZiAoIXN1cHByZXNzV2FybmluZykgewogICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKICAgICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldOwogICAgICAgIH0KCiAgICAgICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBlcnJvcihmb3JtYXQpIHsKICAgIHsKICAgICAgaWYgKCFzdXBwcmVzc1dhcm5pbmcpIHsKICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykgewogICAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTsKICAgICAgICB9CgogICAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykgewogICAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvCiAgICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC4KICAgIHsKICAgICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lOwogICAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTsKCiAgICAgIGlmIChzdGFjayAhPT0gJycpIHsKICAgICAgICBmb3JtYXQgKz0gJyVzJzsKICAgICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7CiAgICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uCgoKICAgICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pOwogICAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXgKCiAgICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdAogICAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwCiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcKCiAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7CiAgICB9CiAgfQoKICB2YXIgRnVuY3Rpb25Db21wb25lbnQgPSAwOwogIHZhciBDbGFzc0NvbXBvbmVudCA9IDE7CiAgdmFyIEluZGV0ZXJtaW5hdGVDb21wb25lbnQgPSAyOyAvLyBCZWZvcmUgd2Uga25vdyB3aGV0aGVyIGl0IGlzIGZ1bmN0aW9uIG9yIGNsYXNzCgogIHZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLgoKICB2YXIgSG9zdFBvcnRhbCA9IDQ7IC8vIEEgc3VidHJlZS4gQ291bGQgYmUgYW4gZW50cnkgcG9pbnQgdG8gYSBkaWZmZXJlbnQgcmVuZGVyZXIuCgogIHZhciBIb3N0Q29tcG9uZW50ID0gNTsKICB2YXIgSG9zdFRleHQgPSA2OwogIHZhciBGcmFnbWVudCA9IDc7CiAgdmFyIE1vZGUgPSA4OwogIHZhciBDb250ZXh0Q29uc3VtZXIgPSA5OwogIHZhciBDb250ZXh0UHJvdmlkZXIgPSAxMDsKICB2YXIgRm9yd2FyZFJlZiA9IDExOwogIHZhciBQcm9maWxlciA9IDEyOwogIHZhciBTdXNwZW5zZUNvbXBvbmVudCA9IDEzOwogIHZhciBNZW1vQ29tcG9uZW50ID0gMTQ7CiAgdmFyIFNpbXBsZU1lbW9Db21wb25lbnQgPSAxNTsKICB2YXIgTGF6eUNvbXBvbmVudCA9IDE2OwogIHZhciBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQgPSAxNzsKICB2YXIgRGVoeWRyYXRlZEZyYWdtZW50ID0gMTg7CiAgdmFyIFN1c3BlbnNlTGlzdENvbXBvbmVudCA9IDE5OwogIHZhciBTY29wZUNvbXBvbmVudCA9IDIxOwogIHZhciBPZmZzY3JlZW5Db21wb25lbnQgPSAyMjsKICB2YXIgTGVnYWN5SGlkZGVuQ29tcG9uZW50ID0gMjM7CiAgdmFyIENhY2hlQ29tcG9uZW50ID0gMjQ7CiAgdmFyIFRyYWNpbmdNYXJrZXJDb21wb25lbnQgPSAyNTsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgdmFyIGVuYWJsZUNsaWVudFJlbmRlckZhbGxiYWNrT25UZXh0TWlzbWF0Y2ggPSB0cnVlOyAvLyBUT0RPOiBOZWVkIHRvIHJldmlldyB0aGlzIGNvZGUgb25lIG1vcmUgdGltZSBiZWZvcmUgbGFuZGluZwogIC8vIHRoZSByZWFjdC1yZWNvbmNpbGVyIHBhY2thZ2UuCgogIHZhciBlbmFibGVOZXdSZWNvbmNpbGVyID0gZmFsc2U7IC8vIFN1cHBvcnQgbGVnYWN5IFByaW1lciBzdXBwb3J0IG9uIGludGVybmFsIEZCIHd3dwoKICB2YXIgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiA9IGZhbHNlOyAvLyBGQi1vbmx5IHVzYWdlLiBUaGUgbmV3IEFQSSBoYXMgZGlmZmVyZW50IHNlbWFudGljcy4KCiAgdmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXIKCiAgdmFyIGVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2sgPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpenoKICAvLyBSZWFjdCBET00gQ2hvcHBpbmcgQmxvY2sKICAvLwogIC8vIFNpbWlsYXIgdG8gbWFpbiBDaG9wcGluZyBCbG9jayBidXQgb25seSBmbGFncyByZWxhdGVkIHRvIFJlYWN0IERPTS4gVGhlc2UgYXJlCiAgLy8gZ3JvdXBlZCBiZWNhdXNlIHdlIHdpbGwgbGlrZWx5IGJhdGNoIGFsbCBvZiB0aGVtIGludG8gYSBzaW5nbGUgbWFqb3IgcmVsZWFzZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIERpc2FibGUgc3VwcG9ydCBmb3IgY29tbWVudCBub2RlcyBhcyBSZWFjdCBET00gY29udGFpbmVycy4gQWxyZWFkeSBkaXNhYmxlZAogIC8vIGluIG9wZW4gc291cmNlLCBidXQgd3d3IGNvZGViYXNlIHN0aWxsIHJlbGllcyBvbiBpdC4gTmVlZCB0byByZW1vdmUuCgogIHZhciBkaXNhYmxlQ29tbWVudHNBc0RPTUNvbnRhaW5lcnMgPSB0cnVlOyAvLyBEaXNhYmxlIGphdmFzY3JpcHQ6IFVSTCBzdHJpbmdzIGluIGhyZWYgZm9yIFhTUyBwcm90ZWN0aW9uLgogIC8vIGFuZCBjbGllbnQgcmVuZGVyaW5nLCBtb3N0bHkgdG8gYWxsb3cgSlNYIGF0dHJpYnV0ZXMgdG8gYXBwbHkgdG8gdGhlIGN1c3RvbQogIC8vIGVsZW1lbnQncyBvYmplY3QgcHJvcGVydGllcyBpbnN0ZWFkIG9mIG9ubHkgSFRNTCBhdHRyaWJ1dGVzLgogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTEzNDcKCiAgdmFyIGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgPSBmYWxzZTsgLy8gRGlzYWJsZXMgY2hpbGRyZW4gZm9yIDx0ZXh0YXJlYT4gZWxlbWVudHMKICB2YXIgd2FybkFib3V0U3RyaW5nUmVmcyA9IGZhbHNlOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIERlYnVnZ2luZyBhbmQgRGV2VG9vbHMKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIEFkZHMgdXNlciB0aW1pbmcgbWFya3MgZm9yIGUuZy4gc3RhdGUgdXBkYXRlcywgc3VzcGVuc2UsIGFuZCB3b3JrIGxvb3Agc3R1ZmYsCiAgLy8gZm9yIGFuIGV4cGVyaW1lbnRhbCB0aW1lbGluZSB0b29sLgoKICB2YXIgZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyID0gdHJ1ZTsgLy8gSGVscHMgaWRlbnRpZnkgc2lkZSBlZmZlY3RzIGluIHJlbmRlci1waGFzZSBsaWZlY3ljbGUgaG9va3MgYW5kIHNldFN0YXRlCgogIHZhciBlbmFibGVQcm9maWxlclRpbWVyID0gdHJ1ZTsgLy8gUmVjb3JkIGR1cmF0aW9ucyBmb3IgY29tbWl0IGFuZCBwYXNzaXZlIGVmZmVjdHMgcGhhc2VzLgoKICB2YXIgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyA9IHRydWU7IC8vIFBoYXNlIHBhcmFtIHBhc3NlZCB0byBvblJlbmRlciBjYWxsYmFjayBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIGFuICJ1cGRhdGUiIGFuZCBhICJjYXNjYWRpbmctdXBkYXRlIi4KCiAgdmFyIGFsbE5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoKTsKICAvKioKICAgKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gZXZlbnQgbmFtZQogICAqLwoKCiAgdmFyIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMgPSB7fTsKICAvKioKICAgKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbiwKICAgKiB1c2VkIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBldmVudCBoYW5kbGVycy4gQXZhaWxhYmxlCiAgICogb25seSBpbiB0cnVlLgogICAqIEB0eXBlIHtPYmplY3R9CiAgICovCgogIHZhciBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gIHt9IDsgLy8gVHJ1c3QgdGhlIGRldmVsb3BlciB0byBvbmx5IHVzZSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzIGluIHRydWUKCiAgZnVuY3Rpb24gcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykgewogICAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpOwogICAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgJ0NhcHR1cmUnLCBkZXBlbmRlbmNpZXMpOwogIH0KICBmdW5jdGlvbiByZWdpc3RlckRpcmVjdEV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykgewogICAgewogICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSkgewogICAgICAgIGVycm9yKCdFdmVudFJlZ2lzdHJ5OiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSAnICsgJ3JlZ2lzdHJhdGlvbiBuYW1lLCBgJXNgLicsIHJlZ2lzdHJhdGlvbk5hbWUpOwogICAgICB9CiAgICB9CgogICAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSA9IGRlcGVuZGVuY2llczsKCiAgICB7CiAgICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHJlZ2lzdHJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lOwoKICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykgewogICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMub25kYmxjbGljayA9IHJlZ2lzdHJhdGlvbk5hbWU7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykgewogICAgICBhbGxOYXRpdmVFdmVudHMuYWRkKGRlcGVuZGVuY2llc1tpXSk7CiAgICB9CiAgfQoKICB2YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyk7CgogIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CgogIC8qCiAgICogVGhlIGAnJyArIHZhbHVlYCBwYXR0ZXJuICh1c2VkIGluIGluIHBlcmYtc2Vuc2l0aXZlIGNvZGUpIHRocm93cyBmb3IgU3ltYm9sCiAgICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC4KICAgKgogICAqIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgd2lsbCB0aHJvdyBhbiBlYXNpZXItdG8tdW5kZXJzdGFuZCwKICAgKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlCiAgICogcHJvYmxlbS4gKEluc3RlYWQgb2YgYSBjb25mdXNpbmcgZXhjZXB0aW9uIHRocm93biBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uCiAgICogb2YgdGhlIGB2YWx1ZWAgb2JqZWN0KS4KICAgKi8KICAvLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLgogIGZ1bmN0aW9uIHR5cGVOYW1lKHZhbHVlKSB7CiAgICB7CiAgICAgIC8vIHRvU3RyaW5nVGFnIGlzIG5lZWRlZCBmb3IgbmFtZXNwYWNlZCB0eXBlcyBsaWtlIFRlbXBvcmFsLkluc3RhbnQKICAgICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wudG9TdHJpbmdUYWc7CiAgICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnOwogICAgICByZXR1cm4gdHlwZTsKICAgIH0KICB9IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuCgoKICBmdW5jdGlvbiB3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkgewogICAgewogICAgICB0cnkgewogICAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkgewogICAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzCiAgICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LAogICAgLy8gRE9NIGF0dHJpYnV0ZSwgQ1NTIHByb3BlcnR5LCBzdHJpbmcgcmVmLCBldGMuKSBhbmQgd2hlbiBSZWFjdCB0cmllZCB0bwogICAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uCiAgICAvLwogICAgLy8gVGhlIG1vc3QgY29tbW9uIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSB0aGlzIGV4Y2VwdGlvbiBhcmUgYFN5bWJvbGAgaW5zdGFuY2VzCiAgICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYQogICAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzCiAgICAvLyBleGNlcHRpb24uIChMaWJyYXJ5IGF1dGhvcnMgZG8gdGhpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgYnVpbHQtaW4KICAgIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbQogICAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLikKICAgIC8vCiAgICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlCiAgICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuCiAgICAvLwogICAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS4KICAgIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dAogICAgLy8gdGhhdCBzaG93cyB0aGUgdHlwZSAoU3ltYm9sLCBUZW1wb3JhbC5QbGFpbkRhdGUsIGV0Yy4pIHRoYXQgY2F1c2VkIHRoZQogICAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy4KICAgIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHMKICAgIC8vIGFuY2VzdG9yIGNvbXBvbmVudHMgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXBwZW5lZC4KICAgIC8vCiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb24KICAgIHJldHVybiAnJyArIHZhbHVlOwogIH0KCiAgZnVuY3Rpb24gY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSkgewogICAgewogICAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7CiAgICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIGF0dHJpYnV0ZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBhdHRyaWJ1dGVOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpOwoKICAgICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cykKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7CiAgICB7CiAgICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHsKICAgICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpOwoKICAgICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cykKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbih2YWx1ZSwgcHJvcE5hbWUpIHsKICAgIHsKICAgICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkgewogICAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBwcm9wIGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpOwoKICAgICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cykKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BOYW1lKSB7CiAgICB7CiAgICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHsKICAgICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGAlc2AgQ1NTIHByb3BlcnR5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHByb3BOYW1lLCB0eXBlTmFtZSh2YWx1ZSkpOwoKICAgICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cykKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBjaGVja0h0bWxTdHJpbmdDb2VyY2lvbih2YWx1ZSkgewogICAgewogICAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7CiAgICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBIVE1MIG1hcmt1cCB1c2VzIGEgdmFsdWUgb2YgdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTsKCiAgICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpCiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7CiAgICB7CiAgICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHsKICAgICAgICBlcnJvcignRm9ybSBmaWVsZCB2YWx1ZXMgKHZhbHVlLCBjaGVja2VkLCBkZWZhdWx0VmFsdWUsIG9yIGRlZmF1bHRDaGVja2VkIHByb3BzKScgKyAnIG11c3QgYmUgc3RyaW5ncywgbm90ICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpOwoKICAgICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cykKICAgICAgfQogICAgfQogIH0KCiAgLy8gQSByZXNlcnZlZCBhdHRyaWJ1dGUuCiAgLy8gSXQgaXMgaGFuZGxlZCBieSBSZWFjdCBzZXBhcmF0ZWx5IGFuZCBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLgogIHZhciBSRVNFUlZFRCA9IDA7IC8vIEEgc2ltcGxlIHN0cmluZyBhdHRyaWJ1dGUuCiAgLy8gQXR0cmlidXRlcyB0aGF0IGFyZW4ndCBpbiB0aGUgZmlsdGVyIGFyZSBwcmVzdW1lZCB0byBoYXZlIHRoaXMgdHlwZS4KCiAgdmFyIFNUUklORyA9IDE7IC8vIEEgc3RyaW5nIGF0dHJpYnV0ZSB0aGF0IGFjY2VwdHMgYm9vbGVhbnMgaW4gUmVhY3QuIEluIEhUTUwsIHRoZXNlIGFyZSBjYWxsZWQKICAvLyAiZW51bWVyYXRlZCIgYXR0cmlidXRlcyB3aXRoICJ0cnVlIiBhbmQgImZhbHNlIiBhcyBwb3NzaWJsZSB2YWx1ZXMuCiAgLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgInRydWUiIHN0cmluZy4KICAvLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgImZhbHNlIiBzdHJpbmcuCgogIHZhciBCT09MRUFOSVNIX1NUUklORyA9IDI7IC8vIEEgcmVhbCBib29sZWFuIGF0dHJpYnV0ZS4KICAvLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBwcmVzZW50IChzZXQgZWl0aGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvciBpdHMgbmFtZSkuCiAgLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuCgogIHZhciBCT09MRUFOID0gMzsgLy8gQW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLgogIC8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHByZXNlbnQgKHNldCBlaXRoZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIGl0cyBuYW1lKS4KICAvLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgb21pdHRlZC4KICAvLyBGb3IgYW55IG90aGVyIHZhbHVlLCBzaG91bGQgYmUgcHJlc2VudCB3aXRoIHRoYXQgdmFsdWUuCgogIHZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLgogIC8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLgoKICB2YXIgTlVNRVJJQyA9IDU7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIHBvc2l0aXZlIG51bWVyaWMuCiAgLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuCgogIHZhciBQT1NJVElWRV9OVU1FUklDID0gNjsKCiAgLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqLwogIHZhciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSID0gIjpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEIjsKICAvKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi8KCiAgdmFyIEFUVFJJQlVURV9OQU1FX0NIQVIgPSBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgIlxcLS4wLTlcXHUwMEI3XFx1MDMwMC1cXHUwMzZGXFx1MjAzRi1cXHUyMDQwIjsKICB2YXIgVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVggPSBuZXcgUmVnRXhwKCdeWycgKyBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgJ11bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7CiAgdmFyIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTsKICB2YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307CiAgZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKSB7CiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkgewogICAgICB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTsKCiAgICB7CiAgICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lOiBgJXNgJywgYXR0cmlidXRlTmFtZSk7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KICBmdW5jdGlvbiBzaG91bGRJZ25vcmVBdHRyaWJ1dGUobmFtZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgewogICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkgewogICAgICByZXR1cm4gcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEOwogICAgfQoKICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiAobmFtZVswXSA9PT0gJ28nIHx8IG5hbWVbMF0gPT09ICdPJykgJiYgKG5hbWVbMV0gPT09ICduJyB8fCBuYW1lWzFdID09PSAnTicpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CiAgZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpIHsKICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkgewogICAgICBjYXNlICdmdW5jdGlvbic6IC8vICRGbG93SXNzdWUgc3ltYm9sIGlzIHBlcmZlY3RseSB2YWxpZCBoZXJlCgogICAgICBjYXNlICdzeW1ib2wnOgogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUKICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgIGNhc2UgJ2Jvb2xlYW4nOgogICAgICAgIHsKICAgICAgICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHByb3BlcnR5SW5mbyAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SW5mby5hY2NlcHRzQm9vbGVhbnM7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgcHJlZml4ID0gbmFtZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsIDUpOwogICAgICAgICAgICByZXR1cm4gcHJlZml4ICE9PSAnZGF0YS0nICYmIHByZWZpeCAhPT0gJ2FyaWEtJzsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykgewoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHsKCiAgICAgIHN3aXRjaCAocHJvcGVydHlJbmZvLnR5cGUpIHsKICAgICAgICBjYXNlIEJPT0xFQU46CiAgICAgICAgICByZXR1cm4gIXZhbHVlOwoKICAgICAgICBjYXNlIE9WRVJMT0FERURfQk9PTEVBTjoKICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gZmFsc2U7CgogICAgICAgIGNhc2UgTlVNRVJJQzoKICAgICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7CgogICAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzoKICAgICAgICAgIHJldHVybiBpc05hTih2YWx1ZSkgfHwgdmFsdWUgPCAxOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KICBmdW5jdGlvbiBnZXRQcm9wZXJ0eUluZm8obmFtZSkgewogICAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDsKICB9CgogIGZ1bmN0aW9uIFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCB0eXBlLCBtdXN0VXNlUHJvcGVydHksIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWVzcGFjZSwgc2FuaXRpemVVUkwsIHJlbW92ZUVtcHR5U3RyaW5nKSB7CiAgICB0aGlzLmFjY2VwdHNCb29sZWFucyA9IHR5cGUgPT09IEJPT0xFQU5JU0hfU1RSSU5HIHx8IHR5cGUgPT09IEJPT0xFQU4gfHwgdHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOOwogICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKICAgIHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlID0gYXR0cmlidXRlTmFtZXNwYWNlOwogICAgdGhpcy5tdXN0VXNlUHJvcGVydHkgPSBtdXN0VXNlUHJvcGVydHk7CiAgICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5zYW5pdGl6ZVVSTCA9IHNhbml0aXplVVJMOwogICAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nOwogIH0gLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGlzIGxpc3QsIGJlIHN1cmUgdG8gYWxzbyBhZGQgdGhlbSB0bwogIC8vIHRoZSBgcG9zc2libGVTdGFuZGFyZE5hbWVzYCBtb2R1bGUgdG8gZW5zdXJlIGNhc2luZyBhbmQgaW5jb3JyZWN0CiAgLy8gbmFtZSB3YXJuaW5ncy4KCgogIHZhciBwcm9wZXJ0aWVzID0ge307IC8vIFRoZXNlIHByb3BzIGFyZSByZXNlcnZlZCBieSBSZWFjdC4gVGhleSBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLgoKICB2YXIgcmVzZXJ2ZWRQcm9wcyA9IFsnY2hpbGRyZW4nLCAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLCAvLyBUT0RPOiBUaGlzIHByZXZlbnRzIHRoZSBhc3NpZ25tZW50IG9mIGRlZmF1bHRWYWx1ZSB0byByZWd1bGFyCiAgLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGUKICAvLyBkZWZhdWx0VmFsdWUgcHJvcGVydHkgLS0gZG8gd2UgbmVlZCB0aGlzPwogICdkZWZhdWx0VmFsdWUnLCAnZGVmYXVsdENoZWNrZWQnLCAnaW5uZXJIVE1MJywgJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZycsICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLCAnc3R5bGUnXTsKCiAgcmVzZXJ2ZWRQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7CiAgICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBSRVNFUlZFRCwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eQogICAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZQogICAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlCiAgICBmYWxzZSwgLy8gc2FuaXRpemVVUkwKICAgIGZhbHNlKTsKICB9KTsgLy8gQSBmZXcgUmVhY3Qgc3RyaW5nIGF0dHJpYnV0ZXMgaGF2ZSBhIGRpZmZlcmVudCBuYW1lLgogIC8vIFRoaXMgaXMgYSBtYXBwaW5nIGZyb20gUmVhY3QgcHJvcCBuYW1lcyB0byB0aGUgYXR0cmlidXRlIG5hbWVzLgoKICBbWydhY2NlcHRDaGFyc2V0JywgJ2FjY2VwdC1jaGFyc2V0J10sIFsnY2xhc3NOYW1lJywgJ2NsYXNzJ10sIFsnaHRtbEZvcicsICdmb3InXSwgWydodHRwRXF1aXYnLCAnaHR0cC1lcXVpdiddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7CiAgICB2YXIgbmFtZSA9IF9yZWZbMF0sCiAgICAgICAgYXR0cmlidXRlTmFtZSA9IF9yZWZbMV07CiAgICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHkKICAgIGF0dHJpYnV0ZU5hbWUsIC8vIGF0dHJpYnV0ZU5hbWUKICAgIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZQogICAgZmFsc2UsIC8vIHNhbml0aXplVVJMCiAgICBmYWxzZSk7CiAgfSk7IC8vIFRoZXNlIGFyZSAiZW51bWVyYXRlZCIgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0ICJ0cnVlIiBhbmQgImZhbHNlIi4KICAvLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5CiAgLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS4KCiAgWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7CiAgICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOSVNIX1NUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eQogICAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lCiAgICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2UKICAgIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTAogICAgZmFsc2UpOwogIH0pOyAvLyBUaGVzZSBhcmUgImVudW1lcmF0ZWQiIFNWRyBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0ICJ0cnVlIiBhbmQgImZhbHNlIi4KICAvLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5CiAgLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS4KICAvLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuCgogIFsnYXV0b1JldmVyc2UnLCAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICdmb2N1c2FibGUnLCAncHJlc2VydmVBbHBoYSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKICAgIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5CiAgICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lCiAgICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2UKICAgIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTAogICAgZmFsc2UpOwogIH0pOyAvLyBUaGVzZSBhcmUgSFRNTCBib29sZWFuIGF0dHJpYnV0ZXMuCgogIFsnYWxsb3dGdWxsU2NyZWVuJywgJ2FzeW5jJywgLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTQogIC8vIG9uIHRoZSBjbGllbnQgc2lkZSBiZWNhdXNlIHRoZSBicm93c2VycyBhcmUgaW5jb25zaXN0ZW50LiBJbnN0ZWFkIHdlIGNhbGwgZm9jdXMoKS4KICAnYXV0b0ZvY3VzJywgJ2F1dG9QbGF5JywgJ2NvbnRyb2xzJywgJ2RlZmF1bHQnLCAnZGVmZXInLCAnZGlzYWJsZWQnLCAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLCAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJywgJ2Zvcm1Ob1ZhbGlkYXRlJywgJ2hpZGRlbicsICdsb29wJywgJ25vTW9kdWxlJywgJ25vVmFsaWRhdGUnLCAnb3BlbicsICdwbGF5c0lubGluZScsICdyZWFkT25seScsICdyZXF1aXJlZCcsICdyZXZlcnNlZCcsICdzY29wZWQnLCAnc2VhbWxlc3MnLCAvLyBNaWNyb2RhdGEKICAnaXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgewogICAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eQogICAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lCiAgICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2UKICAgIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTAogICAgZmFsc2UpOwogIH0pOyAvLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllcwogIC8vIHJhdGhlciB0aGFuIGF0dHJpYnV0ZXMuIFRoZXNlIGFyZSBhbGwgYm9vbGVhbnMuCgogIFsnY2hlY2tlZCcsIC8vIE5vdGU6IGBvcHRpb24uc2VsZWN0ZWRgIGlzIG5vdCB1cGRhdGVkIGlmIGBzZWxlY3QubXVsdGlwbGVgIGlzCiAgLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC4gV2UgaGF2ZSBzcGVjaWFsIGxvZ2ljIGZvciBoYW5kbGluZyB0aGlzLgogICdtdWx0aXBsZScsICdtdXRlZCcsICdzZWxlY3RlZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsCiAgLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpCiAgLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy4KICBdLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKICAgIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU4sIHRydWUsIC8vIG11c3RVc2VQcm9wZXJ0eQogICAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZQogICAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlCiAgICBmYWxzZSwgLy8gc2FuaXRpemVVUkwKICAgIGZhbHNlKTsKICB9KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFyZSAib3ZlcmxvYWRlZCBib29sZWFucyI6IHRoZXkgYmVoYXZlIGxpa2UKICAvLyBib29sZWFucywgYnV0IGNhbiBhbHNvIGFjY2VwdCBhIHN0cmluZyB2YWx1ZS4KCiAgWydjYXB0dXJlJywgJ2Rvd25sb2FkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCwKICAvLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKCkKICAvLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LgogIF0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgewogICAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5CiAgICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lCiAgICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2UKICAgIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTAogICAgZmFsc2UpOwogIH0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1iZXJzLgoKICBbJ2NvbHMnLCAncm93cycsICdzaXplJywgJ3NwYW4nIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LAogIC8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKQogIC8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuCiAgXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7CiAgICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBQT1NJVElWRV9OVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5CiAgICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lCiAgICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2UKICAgIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTAogICAgZmFsc2UpOwogIH0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBudW1iZXJzLgoKICBbJ3Jvd1NwYW4nLCAnc3RhcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7CiAgICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBOVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5CiAgICBuYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWUKICAgIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZQogICAgZmFsc2UsIC8vIHNhbml0aXplVVJMCiAgICBmYWxzZSk7CiAgfSk7CiAgdmFyIENBTUVMSVpFID0gL1tcLVw6XShbYS16XSkvZzsKCiAgdmFyIGNhcGl0YWxpemUgPSBmdW5jdGlvbiAodG9rZW4pIHsKICAgIHJldHVybiB0b2tlblsxXS50b1VwcGVyQ2FzZSgpOwogIH07IC8vIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCBTVkcgYXR0cmlidXRlcyB0aGF0IG5lZWQgc3BlY2lhbCBjYXNpbmcsIG5hbWVzcGFjaW5nLAogIC8vIG9yIGJvb2xlYW4gdmFsdWUgYXNzaWdubWVudC4gUmVndWxhciBhdHRyaWJ1dGVzIHRoYXQganVzdCBhY2NlcHQgc3RyaW5ncwogIC8vIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFyZSBvbWl0dGVkLCBqdXN0IGxpa2UgaW4gdGhlIEhUTUwgYXR0cmlidXRlIGZpbHRlci4KICAvLyBTb21lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGhhcmQgdG8gZmluZC4gVGhpcyBsaXN0IHdhcyBjcmVhdGVkIGJ5CiAgLy8gc2NyYXBpbmcgdGhlIE1ETiBkb2N1bWVudGF0aW9uLgoKCiAgWydhY2NlbnQtaGVpZ2h0JywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhcmFiaWMtZm9ybScsICdiYXNlbGluZS1zaGlmdCcsICdjYXAtaGVpZ2h0JywgJ2NsaXAtcGF0aCcsICdjbGlwLXJ1bGUnLCAnY29sb3ItaW50ZXJwb2xhdGlvbicsICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLCAnY29sb3ItcHJvZmlsZScsICdjb2xvci1yZW5kZXJpbmcnLCAnZG9taW5hbnQtYmFzZWxpbmUnLCAnZW5hYmxlLWJhY2tncm91bmQnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdnbHlwaC1uYW1lJywgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLCAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLCAnaG9yaXotYWR2LXgnLCAnaG9yaXotb3JpZ2luLXgnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2xldHRlci1zcGFjaW5nJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnb3ZlcmxpbmUtcG9zaXRpb24nLCAnb3ZlcmxpbmUtdGhpY2tuZXNzJywgJ3BhaW50LW9yZGVyJywgJ3Bhbm9zZS0xJywgJ3BvaW50ZXItZXZlbnRzJywgJ3JlbmRlcmluZy1pbnRlbnQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlLXdpZHRoJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd1bmRlcmxpbmUtcG9zaXRpb24nLCAndW5kZXJsaW5lLXRoaWNrbmVzcycsICd1bmljb2RlLWJpZGknLCAndW5pY29kZS1yYW5nZScsICd1bml0cy1wZXItZW0nLCAndi1hbHBoYWJldGljJywgJ3YtaGFuZ2luZycsICd2LWlkZW9ncmFwaGljJywgJ3YtbWF0aGVtYXRpY2FsJywgJ3ZlY3Rvci1lZmZlY3QnLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd29yZC1zcGFjaW5nJywgJ3dyaXRpbmctbW9kZScsICd4bWxuczp4bGluaycsICd4LWhlaWdodCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsCiAgLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpCiAgLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy4KICBdLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHsKICAgIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTsKICAgIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eQogICAgYXR0cmlidXRlTmFtZSwgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlCiAgICBmYWxzZSwgLy8gc2FuaXRpemVVUkwKICAgIGZhbHNlKTsKICB9KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhsaW5rIG5hbWVzcGFjZS4KCiAgWyd4bGluazphY3R1YXRlJywgJ3hsaW5rOmFyY3JvbGUnLCAneGxpbms6cm9sZScsICd4bGluazpzaG93JywgJ3hsaW5rOnRpdGxlJywgJ3hsaW5rOnR5cGUnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LAogIC8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKQogIC8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuCiAgXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7CiAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7CiAgICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHkKICAgIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgZmFsc2UsIC8vIHNhbml0aXplVVJMCiAgICBmYWxzZSk7CiAgfSk7IC8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bWwgbmFtZXNwYWNlLgoKICBbJ3htbDpiYXNlJywgJ3htbDpsYW5nJywgJ3htbDpzcGFjZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsCiAgLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpCiAgLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy4KICBdLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHsKICAgIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTsKICAgIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eQogICAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTAogICAgZmFsc2UpOwogIH0pOyAvLyBUaGVzZSBhdHRyaWJ1dGUgZXhpc3RzIGJvdGggaW4gSFRNTCBhbmQgU1ZHLgogIC8vIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBjYXNlLXNlbnNpdGl2ZSBpbiBTVkcgc28gd2UgY2FuJ3QganVzdCB1c2UKICAvLyB0aGUgUmVhY3QgbmFtZSBsaWtlIHdlIGRvIGZvciBhdHRyaWJ1dGVzIHRoYXQgZXhpc3Qgb25seSBpbiBIVE1MLgoKICBbJ3RhYkluZGV4JywgJ2Nyb3NzT3JpZ2luJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkgewogICAgcHJvcGVydGllc1thdHRyaWJ1dGVOYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoYXR0cmlidXRlTmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5CiAgICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWUKICAgIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZQogICAgZmFsc2UsIC8vIHNhbml0aXplVVJMCiAgICBmYWxzZSk7CiAgfSk7IC8vIFRoZXNlIGF0dHJpYnV0ZXMgYWNjZXB0IFVSTHMuIFRoZXNlIG11c3Qgbm90IGFsbG93IGphdmFzY3JpcHQ6IFVSTFMuCiAgLy8gVGhlc2Ugd2lsbCBhbHNvIG5lZWQgdG8gYWNjZXB0IFRydXN0ZWQgVHlwZXMgb2JqZWN0IGluIHRoZSBmdXR1cmUuCgogIHZhciB4bGlua0hyZWYgPSAneGxpbmtIcmVmJzsKICBwcm9wZXJ0aWVzW3hsaW5rSHJlZl0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKCd4bGlua0hyZWYnLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHkKICAneGxpbms6aHJlZicsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdHJ1ZSwgLy8gc2FuaXRpemVVUkwKICBmYWxzZSk7CiAgWydzcmMnLCAnaHJlZicsICdhY3Rpb24nLCAnZm9ybUFjdGlvbiddLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHsKICAgIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eQogICAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lCiAgICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2UKICAgIHRydWUsIC8vIHNhbml0aXplVVJMCiAgICB0cnVlKTsKICB9KTsKCiAgLy8gYW5kIGFueSBuZXdsaW5lIG9yIHRhYiBhcmUgZmlsdGVyZWQgb3V0IGFzIGlmIHRoZXkncmUgbm90IHBhcnQgb2YgdGhlIFVSTC4KICAvLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1wYXJzaW5nCiAgLy8gVGFiIG9yIG5ld2xpbmUgYXJlIGRlZmluZWQgYXMgXHJcblx0OgogIC8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS10YWItb3ItbmV3bGluZQogIC8vIEEgQzAgY29udHJvbCBpcyBhIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlIFx1MDAwMCBOVUxMIHRvIFx1MDAxRgogIC8vIElORk9STUFUSU9OIFNFUEFSQVRPUiBPTkUsIGluY2x1c2l2ZToKICAvLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYzAtY29udHJvbC1vci1zcGFjZQoKICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCgogIHZhciBpc0phdmFTY3JpcHRQcm90b2NvbCA9IC9eW1x1MDAwMC1cdTAwMUYgXSpqW1xyXG5cdF0qYVtcclxuXHRdKnZbXHJcblx0XSphW1xyXG5cdF0qc1tcclxuXHRdKmNbXHJcblx0XSpyW1xyXG5cdF0qaVtcclxuXHRdKnBbXHJcblx0XSp0W1xyXG5cdF0qXDovaTsKICB2YXIgZGlkV2FybiA9IGZhbHNlOwoKICBmdW5jdGlvbiBzYW5pdGl6ZVVSTCh1cmwpIHsKICAgIHsKICAgICAgaWYgKCFkaWRXYXJuICYmIGlzSmF2YVNjcmlwdFByb3RvY29sLnRlc3QodXJsKSkgewogICAgICAgIGRpZFdhcm4gPSB0cnVlOwoKICAgICAgICBlcnJvcignQSBmdXR1cmUgdmVyc2lvbiBvZiBSZWFjdCB3aWxsIGJsb2NrIGphdmFzY3JpcHQ6IFVSTHMgYXMgYSBzZWN1cml0eSBwcmVjYXV0aW9uLiAnICsgJ1VzZSBldmVudCBoYW5kbGVycyBpbnN0ZWFkIGlmIHlvdSBjYW4uIElmIHlvdSBuZWVkIHRvIGdlbmVyYXRlIHVuc2FmZSBIVE1MIHRyeSAnICsgJ3VzaW5nIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGluc3RlYWQuIFJlYWN0IHdhcyBwYXNzZWQgJXMuJywgSlNPTi5zdHJpbmdpZnkodXJsKSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIEdldCB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLiBPbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi4KICAgKiBUaGUgImV4cGVjdGVkIiBhcmd1bWVudCBpcyB1c2VkIGFzIGEgaGludCBvZiB3aGF0IHRoZSBleHBlY3RlZCB2YWx1ZSBpcy4KICAgKiBTb21lIHByb3BlcnRpZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy4KICAgKi8KICBmdW5jdGlvbiBnZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8pIHsKICAgIHsKICAgICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHsKICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTsKICAgICAgICByZXR1cm4gbm9kZVtwcm9wZXJ0eU5hbWVdOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoaXMgY2hlY2sgcHJvdGVjdHMgbXVsdGlwbGUgdXNlcyBvZiBgZXhwZWN0ZWRgLCB3aGljaCBpcyB3aHkgdGhlCiAgICAgICAgLy8gcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb24gcnVsZSBpcyBkaXNhYmxlZCBpbiBzZXZlcmFsIHNwb3RzCiAgICAgICAgLy8gYmVsb3cuCiAgICAgICAgewogICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIHByb3BlcnR5SW5mby5zYW5pdGl6ZVVSTCkgewogICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBmdWxseSBkaXNhYmxlZCBqYXZhc2NyaXB0OiBVUkxzLCBhbmQgaWYKICAgICAgICAgIC8vIHRoZSBoeWRyYXRpb24gaXMgc3VjY2Vzc2Z1bCBvZiBhIGphdmFzY3JpcHQ6IFVSTCwgd2UKICAgICAgICAgIC8vIHN0aWxsIHdhbnQgdG8gd2FybiBvbiB0aGUgY2xpZW50LgogICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uCiAgICAgICAgICBzYW5pdGl6ZVVSTCgnJyArIGV4cGVjdGVkKTsKICAgICAgICB9CgogICAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7CiAgICAgICAgdmFyIHN0cmluZ1ZhbHVlID0gbnVsbDsKCiAgICAgICAgaWYgKHByb3BlcnR5SW5mby50eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4pIHsKICAgICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKCiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHsKICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uCgoKICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkgewogICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHsKICAgICAgICAgICAgLy8gV2UgaGFkIGFuIGF0dHJpYnV0ZSBidXQgc2hvdWxkbid0IGhhdmUgaGFkIG9uZSwgc28gcmVhZCBpdAogICAgICAgICAgICAvLyBmb3IgdGhlIGVycm9yIG1lc3NhZ2UuCiAgICAgICAgICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHsKICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgYSBib29sZWFuLCBpdCBkb2Vzbid0IG1hdHRlciB3aGF0IHRoZSB2YWx1ZSBpcwogICAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkLgogICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7CiAgICAgICAgICB9IC8vIEV2ZW4gaWYgdGhpcyBwcm9wZXJ0eSB1c2VzIGEgbmFtZXNwYWNlIHdlIHVzZSBnZXRBdHRyaWJ1dGUKICAgICAgICAgIC8vIGJlY2F1c2Ugd2UgYXNzdW1lIGl0cyBuYW1lc3BhY2VkIG5hbWUgaXMgdGhlIHNhbWUgYXMgb3VyIGNvbmZpZy4KICAgICAgICAgIC8vIFRvIHVzZSBnZXRBdHRyaWJ1dGVOUyB3ZSBuZWVkIHRoZSBsb2NhbCBuYW1lIHdoaWNoIHdlIGRvbid0IGhhdmUKICAgICAgICAgIC8vIGluIG91ciBjb25maWcgYXRtLgoKCiAgICAgICAgICBzdHJpbmdWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHsKICAgICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gbnVsbCA/IGV4cGVjdGVkIDogc3RyaW5nVmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvbgogICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHsKICAgICAgICAgIHJldHVybiBleHBlY3RlZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHN0cmluZ1ZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICAvKioKICAgKiBHZXQgdGhlIHZhbHVlIGZvciBhIGF0dHJpYnV0ZSBvbiBhIG5vZGUuIE9ubHkgdXNlZCBpbiBERVYgZm9yIFNTUiB2YWxpZGF0aW9uLgogICAqIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB1c2VkIGFzIGEgaGludCBvZiB3aGF0IHRoZSBleHBlY3RlZCB2YWx1ZSBpcy4gU29tZQogICAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy4KICAgKi8KCiAgZnVuY3Rpb24gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7CiAgICB7CiAgICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKCFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKSkgewogICAgICAgIHJldHVybiBleHBlY3RlZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbnVsbDsKICAgICAgfQoKICAgICAgdmFyIHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CgogICAgICB7CiAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7CiAgICAgIH0KCiAgICAgIGlmICh2YWx1ZSA9PT0gJycgKyBleHBlY3RlZCkgewogICAgICAgIHJldHVybiBleHBlY3RlZDsKICAgICAgfQoKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogIH0KICAvKioKICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuCiAgICoKICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZQogICAqIEBwYXJhbSB7Kn0gdmFsdWUKICAgKi8KCiAgZnVuY3Rpb24gc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCB2YWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpIHsKICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7CgogICAgaWYgKHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHsKICAgICAgdmFsdWUgPSBudWxsOwogICAgfQoKCiAgICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcgfHwgcHJvcGVydHlJbmZvID09PSBudWxsKSB7CiAgICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7CiAgICAgICAgdmFyIF9hdHRyaWJ1dGVOYW1lID0gbmFtZTsKCiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShfYXR0cmlidXRlTmFtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHsKICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7CiAgICAgICAgICB9CgogICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTsKCiAgICBpZiAobXVzdFVzZVByb3BlcnR5KSB7CiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lOwoKICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgdmFyIHR5cGUgPSBwcm9wZXJ0eUluZm8udHlwZTsKICAgICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJzsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBDb250cmFyeSB0byBgc2V0QXR0cmlidXRlYCwgb2JqZWN0IHByb3BlcnRpZXMgYXJlIHByb3Blcmx5CiAgICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LgogICAgICAgIG5vZGVbcHJvcGVydHlOYW1lXSA9IHZhbHVlOwogICAgICB9CgogICAgICByZXR1cm47CiAgICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLgoKCiAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lLAogICAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7CgogICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7CiAgICAgIHZhciBhdHRyaWJ1dGVWYWx1ZTsKCiAgICAgIGlmIChfdHlwZSA9PT0gQk9PTEVBTiB8fCBfdHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOICYmIHZhbHVlID09PSB0cnVlKSB7CiAgICAgICAgLy8gSWYgYXR0cmlidXRlIHR5cGUgaXMgYm9vbGVhbiwgd2Uga25vdyBmb3Igc3VyZSBpdCB3b24ndCBiZSBhbiBleGVjdXRpb24gc2luawogICAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLgogICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gJyc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LAogICAgICAgIC8vICgnJyArIHZhbHVlKSBtYWtlcyBpdCBvdXRwdXQgdGhlIGNvcnJlY3QgdG9TdHJpbmcoKS12YWx1ZS4KICAgICAgICB7CiAgICAgICAgICB7CiAgICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGF0dHJpYnV0ZU5hbWUpOwogICAgICAgICAgfQoKICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gJycgKyB2YWx1ZTsKICAgICAgICB9CgogICAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHsKICAgICAgICAgIHNhbml0aXplVVJMKGF0dHJpYnV0ZVZhbHVlLnRvU3RyaW5nKCkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkgewogICAgICAgIG5vZGUuc2V0QXR0cmlidXRlTlMoYXR0cmlidXRlTmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBBVFRFTlRJT04KICAvLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsCiAgLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJwogIC8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLgogIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7CiAgdmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7CiAgdmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpOwogIHZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTsKICB2YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7CiAgdmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpOwogIHZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7CiAgdmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpOwogIHZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTsKICB2YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpOwogIHZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7CiAgdmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTsKICB2YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJyk7CiAgdmFyIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QuZGVidWdfdHJhY2VfbW9kZScpOwogIHZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpOwogIHZhciBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7CiAgdmFyIFJFQUNUX0NBQ0hFX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jYWNoZScpOwogIHZhciBSRUFDVF9UUkFDSU5HX01BUktFUl9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QudHJhY2luZ19tYXJrZXInKTsKICB2YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yOwogIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsKICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHsKICAgIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0JykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07CgogICAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBtYXliZUl0ZXJhdG9yOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgdmFyIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247CgogIC8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWUKICAvLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdAogIC8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS4KICAvLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC4KICB2YXIgZGlzYWJsZWREZXB0aCA9IDA7CiAgdmFyIHByZXZMb2c7CiAgdmFyIHByZXZJbmZvOwogIHZhciBwcmV2V2FybjsKICB2YXIgcHJldkVycm9yOwogIHZhciBwcmV2R3JvdXA7CiAgdmFyIHByZXZHcm91cENvbGxhcHNlZDsKICB2YXIgcHJldkdyb3VwRW5kOwoKICBmdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9CgogIGRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7CiAgZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7CiAgICB7CiAgICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7CiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovCiAgICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nOwogICAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvOwogICAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuOwogICAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7CiAgICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDsKICAgICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkOwogICAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTkKCiAgICAgICAgdmFyIHByb3BzID0gewogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZywKICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS4KCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwgewogICAgICAgICAgaW5mbzogcHJvcHMsCiAgICAgICAgICBsb2c6IHByb3BzLAogICAgICAgICAgd2FybjogcHJvcHMsCiAgICAgICAgICBlcnJvcjogcHJvcHMsCiAgICAgICAgICBncm91cDogcHJvcHMsCiAgICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsCiAgICAgICAgICBncm91cEVuZDogcHJvcHMKICAgICAgICB9KTsKICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqLwogICAgICB9CgogICAgICBkaXNhYmxlZERlcHRoKys7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHsKICAgIHsKICAgICAgZGlzYWJsZWREZXB0aC0tOwoKICAgICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHsKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi8KICAgICAgICB2YXIgcHJvcHMgPSB7CiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLgoKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7CiAgICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHsKICAgICAgICAgICAgdmFsdWU6IHByZXZMb2cKICAgICAgICAgIH0pLAogICAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywgewogICAgICAgICAgICB2YWx1ZTogcHJldkluZm8KICAgICAgICAgIH0pLAogICAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywgewogICAgICAgICAgICB2YWx1ZTogcHJldldhcm4KICAgICAgICAgIH0pLAogICAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHsKICAgICAgICAgICAgdmFsdWU6IHByZXZFcnJvcgogICAgICAgICAgfSksCiAgICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywgewogICAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwCiAgICAgICAgICB9KSwKICAgICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7CiAgICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWQKICAgICAgICAgIH0pLAogICAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHsKICAgICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZAogICAgICAgICAgfSkKICAgICAgICB9KTsKICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqLwogICAgICB9CgogICAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHsKICAgICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjsKICB2YXIgcHJlZml4OwogIGZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikgewogICAgewogICAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRocm93IEVycm9yKCk7CiAgICAgICAgfSBjYXRjaCAoeCkgewogICAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xuKCAqKGF0ICk/KS8pOwogICAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7CiAgICAgICAgfQogICAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLgoKCiAgICAgIHJldHVybiAnXG4nICsgcHJlZml4ICsgbmFtZTsKICAgIH0KICB9CiAgdmFyIHJlZW50cnkgPSBmYWxzZTsKICB2YXIgY29tcG9uZW50RnJhbWVDYWNoZTsKCiAgewogICAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDsKICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7CiAgfQoKICBmdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHsKICAgIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLgogICAgaWYgKCAhZm4gfHwgcmVlbnRyeSkgewogICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgewogICAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7CgogICAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiBmcmFtZTsKICAgICAgfQogICAgfQoKICAgIHZhciBjb250cm9sOwogICAgcmVlbnRyeSA9IHRydWU7CiAgICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC4KCiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDsKICAgIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7CgogICAgewogICAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvbgogICAgICAvLyBmb3Igd2FybmluZ3MuCgogICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsOwogICAgICBkaXNhYmxlTG9ncygpOwogICAgfQoKICAgIHRyeSB7CiAgICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LgogICAgICBpZiAoY29uc3RydWN0KSB7CiAgICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0aHJvdyBFcnJvcigpOwogICAgICAgIH07IC8vICRGbG93Rml4TWUKCgogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywgewogICAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHMKICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLgogICAgICAgICAgICB0aHJvdyBFcnJvcigpOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7CiAgICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhCiAgICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLgogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pOwogICAgICAgICAgfSBjYXRjaCAoeCkgewogICAgICAgICAgICBjb250cm9sID0geDsKICAgICAgICAgIH0KCiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBGYWtlLmNhbGwoKTsKICAgICAgICAgIH0gY2F0Y2ggKHgpIHsKICAgICAgICAgICAgY29udHJvbCA9IHg7CiAgICAgICAgICB9CgogICAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aHJvdyBFcnJvcigpOwogICAgICAgIH0gY2F0Y2ggKHgpIHsKICAgICAgICAgIGNvbnRyb2wgPSB4OwogICAgICAgIH0KCiAgICAgICAgZm4oKTsKICAgICAgfQogICAgfSBjYXRjaCAoc2FtcGxlKSB7CiAgICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuCiAgICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykgewogICAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuCiAgICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uCiAgICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcbicpOwogICAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcbicpOwogICAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTsKICAgICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxOwoKICAgICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7CiAgICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC4KICAgICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmUKICAgICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmCiAgICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZQogICAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW4KICAgICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLgogICAgICAgICAgYy0tOwogICAgICAgIH0KCiAgICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7CiAgICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGUKICAgICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLgogICAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHsKICAgICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC4KICAgICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZQogICAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhcwogICAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuCiAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uCiAgICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHsKICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBzLS07CiAgICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC4KICAgICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLgoKICAgICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7CiAgICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSAibmV3IiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci4KICAgICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCAiPGFub255bW91cz4iCiAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCAiZGlzcGxheU5hbWUiCiAgICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLgoKCiAgICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHsKICAgICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLgoKCiAgICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBmaW5hbGx5IHsKICAgICAgcmVlbnRyeSA9IGZhbHNlOwoKICAgICAgewogICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjsKICAgICAgICByZWVuYWJsZUxvZ3MoKTsKICAgICAgfQoKICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlOwogICAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuCgoKICAgIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7CiAgICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJzsKCiAgICB7CiAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lOwogIH0KCiAgZnVuY3Rpb24gZGVzY3JpYmVDbGFzc0NvbXBvbmVudEZyYW1lKGN0b3IsIHNvdXJjZSwgb3duZXJGbikgewogICAgewogICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShjdG9yLCB0cnVlKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHsKICAgIHsKICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHsKICAgIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlOwogICAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7CiAgfQoKICBmdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7CgogICAgaWYgKHR5cGUgPT0gbnVsbCkgewogICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHsKICAgICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpOwogICAgICB9CiAgICB9CgogICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykgewogICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7CiAgICB9CgogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRToKICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7CgogICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRToKICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpOwogICAgfQoKICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHsKICAgICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7CiAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOgogICAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7CgogICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOgogICAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC4KICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pOwoKICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRToKICAgICAgICAgIHsKICAgICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlOwogICAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7CiAgICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDsKCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC4KICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7CiAgICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9CiAgICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJyc7CiAgfQoKICBmdW5jdGlvbiBkZXNjcmliZUZpYmVyKGZpYmVyKSB7CiAgICB2YXIgb3duZXIgPSAgZmliZXIuX2RlYnVnT3duZXIgPyBmaWJlci5fZGVidWdPd25lci50eXBlIDogbnVsbCA7CiAgICB2YXIgc291cmNlID0gIGZpYmVyLl9kZWJ1Z1NvdXJjZSA7CgogICAgc3dpdGNoIChmaWJlci50YWcpIHsKICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTsKCiAgICAgIGNhc2UgTGF6eUNvbXBvbmVudDoKICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ0xhenknKTsKCiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6CiAgICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpOwoKICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6CiAgICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTsKCiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6CiAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDoKICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OgogICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7CgogICAgICBjYXNlIEZvcndhcmRSZWY6CiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmaWJlci50eXBlLnJlbmRlcik7CgogICAgICBjYXNlIENsYXNzQ29tcG9uZW50OgogICAgICAgIHJldHVybiBkZXNjcmliZUNsYXNzQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7CgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAnJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZCh3b3JrSW5Qcm9ncmVzcykgewogICAgdHJ5IHsKICAgICAgdmFyIGluZm8gPSAnJzsKICAgICAgdmFyIG5vZGUgPSB3b3JrSW5Qcm9ncmVzczsKCiAgICAgIGRvIHsKICAgICAgICBpbmZvICs9IGRlc2NyaWJlRmliZXIobm9kZSk7CiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuOwogICAgICB9IHdoaWxlIChub2RlKTsKCiAgICAgIHJldHVybiBpbmZvOwogICAgfSBjYXRjaCAoeCkgewogICAgICByZXR1cm4gJ1xuRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogJyArIHgubWVzc2FnZSArICdcbicgKyB4LnN0YWNrOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7CiAgICB2YXIgZGlzcGxheU5hbWUgPSBvdXRlclR5cGUuZGlzcGxheU5hbWU7CgogICAgaWYgKGRpc3BsYXlOYW1lKSB7CiAgICAgIHJldHVybiBkaXNwbGF5TmFtZTsKICAgIH0KCiAgICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnOwogICAgcmV0dXJuIGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArICIoIiArIGZ1bmN0aW9uTmFtZSArICIpIiA6IHdyYXBwZXJOYW1lOwogIH0gLy8gS2VlcCBpbiBzeW5jIHdpdGggcmVhY3QtcmVjb25jaWxlci9nZXRDb21wb25lbnROYW1lRnJvbUZpYmVyCgoKICBmdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7CiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7CiAgfSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuCgoKICBmdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkgewogICAgaWYgKHR5cGUgPT0gbnVsbCkgewogICAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgewogICAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykgewogICAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7CiAgICB9CgogICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykgewogICAgICByZXR1cm4gdHlwZTsKICAgIH0KCiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOgogICAgICAgIHJldHVybiAnRnJhZ21lbnQnOwoKICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRToKICAgICAgICByZXR1cm4gJ1BvcnRhbCc7CgogICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6CiAgICAgICAgcmV0dXJuICdQcm9maWxlcic7CgogICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6CiAgICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJzsKCiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRToKICAgICAgICByZXR1cm4gJ1N1c3BlbnNlJzsKCiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOgogICAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JzsKCiAgICB9CgogICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JykgewogICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHsKICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRToKICAgICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTsKICAgICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInOwoKICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6CiAgICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlOwogICAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInOwoKICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6CiAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7CgogICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOgogICAgICAgICAgdmFyIG91dGVyTmFtZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbDsKCiAgICAgICAgICBpZiAob3V0ZXJOYW1lICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdNZW1vJzsKCiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6CiAgICAgICAgICB7CiAgICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTsKICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkOwogICAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKHgpIHsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2gKICAgICAgfQogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUkMShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHsKICAgIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7CiAgICByZXR1cm4gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lIHx8IChmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyAiKCIgKyBmdW5jdGlvbk5hbWUgKyAiKSIgOiB3cmFwcGVyTmFtZSk7CiAgfSAvLyBLZWVwIGluIHN5bmMgd2l0aCBzaGFyZWQvZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlCgoKICBmdW5jdGlvbiBnZXRDb250ZXh0TmFtZSQxKHR5cGUpIHsKICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0JzsKICB9CgogIGZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHsKICAgIHZhciB0YWcgPSBmaWJlci50YWcsCiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7CgogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSBDYWNoZUNvbXBvbmVudDoKICAgICAgICByZXR1cm4gJ0NhY2hlJzsKCiAgICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOgogICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTsKICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShjb250ZXh0KSArICcuQ29uc3VtZXInOwoKICAgICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6CiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTsKICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJzsKCiAgICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OgogICAgICAgIHJldHVybiAnRGVoeWRyYXRlZEZyYWdtZW50JzsKCiAgICAgIGNhc2UgRm9yd2FyZFJlZjoKICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUkMSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTsKCiAgICAgIGNhc2UgRnJhZ21lbnQ6CiAgICAgICAgcmV0dXJuICdGcmFnbWVudCc7CgogICAgICBjYXNlIEhvc3RDb21wb25lbnQ6CiAgICAgICAgLy8gSG9zdCBjb21wb25lbnQgdHlwZSBpcyB0aGUgZGlzcGxheSBuYW1lIChlLmcuICJkaXYiLCAiVmlldyIpCiAgICAgICAgcmV0dXJuIHR5cGU7CgogICAgICBjYXNlIEhvc3RQb3J0YWw6CiAgICAgICAgcmV0dXJuICdQb3J0YWwnOwoKICAgICAgY2FzZSBIb3N0Um9vdDoKICAgICAgICByZXR1cm4gJ1Jvb3QnOwoKICAgICAgY2FzZSBIb3N0VGV4dDoKICAgICAgICByZXR1cm4gJ1RleHQnOwoKICAgICAgY2FzZSBMYXp5Q29tcG9uZW50OgogICAgICAgIC8vIE5hbWUgY29tZXMgZnJvbSB0aGUgdHlwZSBpbiB0aGlzIGNhc2U7IHdlIGRvbid0IGhhdmUgYSB0YWcuCiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTsKCiAgICAgIGNhc2UgTW9kZToKICAgICAgICBpZiAodHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSkgewogICAgICAgICAgLy8gRG9uJ3QgYmUgbGVzcyBzcGVjaWZpYyB0aGFuIHNoYXJlZC9nZXRDb21wb25lbnROYW1lRnJvbVR5cGUKICAgICAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJ01vZGUnOwoKICAgICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6CiAgICAgICAgcmV0dXJuICdPZmZzY3JlZW4nOwoKICAgICAgY2FzZSBQcm9maWxlcjoKICAgICAgICByZXR1cm4gJ1Byb2ZpbGVyJzsKCiAgICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6CiAgICAgICAgcmV0dXJuICdTY29wZSc7CgogICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OgogICAgICAgIHJldHVybiAnU3VzcGVuc2UnOwoKICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6CiAgICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnOwoKICAgICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OgogICAgICAgIHJldHVybiAnVHJhY2luZ01hcmtlcic7CiAgICAgIC8vIFRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoaXMgdGFncyBjb21lIGZyb20gdGhlIHVzZXItcHJvdmlkZWQgdHlwZToKCiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6CiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6CiAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OgogICAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6CiAgICAgIGNhc2UgTWVtb0NvbXBvbmVudDoKICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OgogICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICB9CgogICAgICAgIGJyZWFrOwoKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTsKICB2YXIgY3VycmVudCA9IG51bGw7CiAgdmFyIGlzUmVuZGVyaW5nID0gZmFsc2U7CiAgZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB7CiAgICB7CiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIHZhciBvd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7CgogICAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldigpIHsKICAgIHsKICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gJyc7CiAgICAgIH0gLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsCiAgICAgIC8vIGFuZCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIHRoZSB3b3JrLWluLXByb2dyZXNzIHZlcnNpb24uCgoKICAgICAgcmV0dXJuIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChjdXJyZW50KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc2V0Q3VycmVudEZpYmVyKCkgewogICAgewogICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7CiAgICAgIGN1cnJlbnQgPSBudWxsOwogICAgICBpc1JlbmRlcmluZyA9IGZhbHNlOwogICAgfQogIH0KICBmdW5jdGlvbiBzZXRDdXJyZW50RmliZXIoZmliZXIpIHsKICAgIHsKICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBmaWJlciA9PT0gbnVsbCA/IG51bGwgOiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2OwogICAgICBjdXJyZW50ID0gZmliZXI7CiAgICAgIGlzUmVuZGVyaW5nID0gZmFsc2U7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlcigpIHsKICAgIHsKICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHNldElzUmVuZGVyaW5nKHJlbmRlcmluZykgewogICAgewogICAgICBpc1JlbmRlcmluZyA9IHJlbmRlcmluZzsKICAgIH0KICB9CgogIC8vIEZsb3cgZG9lcyBub3QgYWxsb3cgc3RyaW5nIGNvbmNhdGVuYXRpb24gb2YgbW9zdCBub24tc3RyaW5nIHR5cGVzLiBUbyB3b3JrCiAgLy8gYXJvdW5kIHRoaXMgbGltaXRhdGlvbiwgd2UgdXNlIGFuIG9wYXF1ZSB0eXBlIHRoYXQgY2FuIG9ubHkgYmUgb2J0YWluZWQgYnkKICAvLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuCiAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHsKICAgIC8vIFRoZSBjb2VyY2lvbiBzYWZldHkgY2hlY2sgaXMgcGVyZm9ybWVkIGluIGdldFRvU3RyaW5nVmFsdWUoKS4KICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvbgogICAgcmV0dXJuICcnICsgdmFsdWU7CiAgfQogIGZ1bmN0aW9uIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpIHsKICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgIGNhc2UgJ2Jvb2xlYW4nOgogICAgICBjYXNlICdudW1iZXInOgogICAgICBjYXNlICdzdHJpbmcnOgogICAgICBjYXNlICd1bmRlZmluZWQnOgogICAgICAgIHJldHVybiB2YWx1ZTsKCiAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgICAgewogICAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB2YWx1ZTsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgLy8gZnVuY3Rpb24sIHN5bWJvbCBhcmUgYXNzaWduZWQgYXMgZW1wdHkgc3RyaW5ncwogICAgICAgIHJldHVybiAnJzsKICAgIH0KICB9CgogIHZhciBoYXNSZWFkT25seVZhbHVlID0gewogICAgYnV0dG9uOiB0cnVlLAogICAgY2hlY2tib3g6IHRydWUsCiAgICBpbWFnZTogdHJ1ZSwKICAgIGhpZGRlbjogdHJ1ZSwKICAgIHJhZGlvOiB0cnVlLAogICAgcmVzZXQ6IHRydWUsCiAgICBzdWJtaXQ6IHRydWUKICB9OwogIGZ1bmN0aW9uIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHModGFnTmFtZSwgcHJvcHMpIHsKICAgIHsKICAgICAgaWYgKCEoaGFzUmVhZE9ubHlWYWx1ZVtwcm9wcy50eXBlXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5vbklucHV0IHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLnZhbHVlID09IG51bGwpKSB7CiAgICAgICAgZXJyb3IoJ1lvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7CiAgICAgIH0KCiAgICAgIGlmICghKHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmNoZWNrZWQgPT0gbnVsbCkpIHsKICAgICAgICBlcnJvcignWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdENoZWNrZWRgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzQ2hlY2thYmxlKGVsZW0pIHsKICAgIHZhciB0eXBlID0gZWxlbS50eXBlOwogICAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTsKICAgIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmICh0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbycpOwogIH0KCiAgZnVuY3Rpb24gZ2V0VHJhY2tlcihub2RlKSB7CiAgICByZXR1cm4gbm9kZS5fdmFsdWVUcmFja2VyOwogIH0KCiAgZnVuY3Rpb24gZGV0YWNoVHJhY2tlcihub2RlKSB7CiAgICBub2RlLl92YWx1ZVRyYWNrZXIgPSBudWxsOwogIH0KCiAgZnVuY3Rpb24gZ2V0VmFsdWVGcm9tTm9kZShub2RlKSB7CiAgICB2YXIgdmFsdWUgPSAnJzsKCiAgICBpZiAoIW5vZGUpIHsKICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQoKICAgIGlmIChpc0NoZWNrYWJsZShub2RlKSkgewogICAgICB2YWx1ZSA9IG5vZGUuY2hlY2tlZCA/ICd0cnVlJyA6ICdmYWxzZSc7CiAgICB9IGVsc2UgewogICAgICB2YWx1ZSA9IG5vZGUudmFsdWU7CiAgICB9CgogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgZnVuY3Rpb24gdHJhY2tWYWx1ZU9uTm9kZShub2RlKSB7CiAgICB2YXIgdmFsdWVGaWVsZCA9IGlzQ2hlY2thYmxlKG5vZGUpID8gJ2NoZWNrZWQnIDogJ3ZhbHVlJzsKICAgIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihub2RlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgdmFsdWVGaWVsZCk7CgogICAgewogICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24obm9kZVt2YWx1ZUZpZWxkXSk7CiAgICB9CgogICAgdmFyIGN1cnJlbnRWYWx1ZSA9ICcnICsgbm9kZVt2YWx1ZUZpZWxkXTsgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWwKICAgIC8vIGFuZCBkb24ndCB0cmFjayB2YWx1ZSB3aWxsIGNhdXNlIG92ZXIgcmVwb3J0aW5nIG9mIGNoYW5nZXMsCiAgICAvLyBidXQgaXQncyBiZXR0ZXIgdGhlbiBhIGhhcmQgZmFpbHVyZQogICAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKQoKICAgIGlmIChub2RlLmhhc093blByb3BlcnR5KHZhbHVlRmllbGQpIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXQsCiAgICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgdmFsdWVGaWVsZCwgewogICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzKTsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICB7CiAgICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTsKICAgICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0pOyAvLyBXZSBjb3VsZCd2ZSBwYXNzZWQgdGhpcyB0aGUgZmlyc3QgdGltZQogICAgLy8gYnV0IGl0IHRyaWdnZXJzIGEgYnVnIGluIElFMTEgYW5kIEVkZ2UgMTQvMTUuCiAgICAvLyBDYWxsaW5nIGRlZmluZVByb3BlcnR5KCkgYWdhaW4gc2hvdWxkIGJlIGVxdWl2YWxlbnQuCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExNzY4CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHsKICAgICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlCiAgICB9KTsKICAgIHZhciB0cmFja2VyID0gewogICAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7CiAgICAgIH0sCiAgICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICB7CiAgICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTsKICAgICAgfSwKICAgICAgc3RvcFRyYWNraW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgZGV0YWNoVHJhY2tlcihub2RlKTsKICAgICAgICBkZWxldGUgbm9kZVt2YWx1ZUZpZWxkXTsKICAgICAgfQogICAgfTsKICAgIHJldHVybiB0cmFja2VyOwogIH0KCiAgZnVuY3Rpb24gdHJhY2sobm9kZSkgewogICAgaWYgKGdldFRyYWNrZXIobm9kZSkpIHsKICAgICAgcmV0dXJuOwogICAgfSAvLyBUT0RPOiBPbmNlIGl0J3MganVzdCBGaWJlciB3ZSBjYW4gbW92ZSB0aGlzIHRvIG5vZGUuX3dyYXBwZXJTdGF0ZQoKCiAgICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpOwogIH0KICBmdW5jdGlvbiB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChub2RlKSB7CiAgICBpZiAoIW5vZGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHZhciB0cmFja2VyID0gZ2V0VHJhY2tlcihub2RlKTsgLy8gaWYgdGhlcmUgaXMgbm8gdHJhY2tlciBhdCB0aGlzIHBvaW50IGl0J3MgdW5saWtlbHkKICAgIC8vIHRoYXQgdHJ5aW5nIGFnYWluIHdpbGwgc3VjY2VlZAoKICAgIGlmICghdHJhY2tlcikgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICB2YXIgbGFzdFZhbHVlID0gdHJhY2tlci5nZXRWYWx1ZSgpOwogICAgdmFyIG5leHRWYWx1ZSA9IGdldFZhbHVlRnJvbU5vZGUobm9kZSk7CgogICAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7CiAgICAgIHRyYWNrZXIuc2V0VmFsdWUobmV4dFZhbHVlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudChkb2MpIHsKICAgIGRvYyA9IGRvYyB8fCAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IGRvY3VtZW50IDogdW5kZWZpbmVkKTsKCiAgICBpZiAodHlwZW9mIGRvYyA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgdHJ5IHsKICAgICAgcmV0dXJuIGRvYy5hY3RpdmVFbGVtZW50IHx8IGRvYy5ib2R5OwogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gZG9jLmJvZHk7CiAgICB9CiAgfQoKICB2YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7CiAgdmFyIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSBmYWxzZTsKICB2YXIgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IGZhbHNlOwogIHZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7CgogIGZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykgewogICAgdmFyIHVzZXNDaGVja2VkID0gcHJvcHMudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBwcm9wcy50eXBlID09PSAncmFkaW8nOwogICAgcmV0dXJuIHVzZXNDaGVja2VkID8gcHJvcHMuY2hlY2tlZCAhPSBudWxsIDogcHJvcHMudmFsdWUgIT0gbnVsbDsKICB9CiAgLyoqCiAgICogSW1wbGVtZW50cyBhbiA8aW5wdXQ+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgdGhlc2Ugb3B0aW9uYWwKICAgKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuCiAgICoKICAgKiBJZiBgY2hlY2tlZGAgb3IgYHZhbHVlYCBhcmUgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucwogICAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LgogICAqCiAgICogSWYgdGhleSBhcmUgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIG5vdAogICAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvcgogICAqIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuCiAgICoKICAgKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYCkKICAgKiB3aXRoIGFuIGVtcHR5IHZhbHVlIChvciBgZGVmYXVsdFZhbHVlYCkuCiAgICoKICAgKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1sCiAgICovCgoKICBmdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHsKICAgIHZhciBub2RlID0gZWxlbWVudDsKICAgIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZDsKICAgIHZhciBob3N0UHJvcHMgPSBhc3NpZ24oe30sIHByb3BzLCB7CiAgICAgIGRlZmF1bHRDaGVja2VkOiB1bmRlZmluZWQsCiAgICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLAogICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICBjaGVja2VkOiBjaGVja2VkICE9IG51bGwgPyBjaGVja2VkIDogbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkCiAgICB9KTsKICAgIHJldHVybiBob3N0UHJvcHM7CiAgfQogIGZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUoZWxlbWVudCwgcHJvcHMpIHsKICAgIHsKICAgICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygnaW5wdXQnLCBwcm9wcyk7CgogICAgICBpZiAocHJvcHMuY2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQpIHsKICAgICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTsKCiAgICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUpIHsKICAgICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7CgogICAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgbm9kZSA9IGVsZW1lbnQ7CiAgICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgPyAnJyA6IHByb3BzLmRlZmF1bHRWYWx1ZTsKICAgIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHsKICAgICAgaW5pdGlhbENoZWNrZWQ6IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA/IHByb3BzLmNoZWNrZWQgOiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCwKICAgICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlICE9IG51bGwgPyBwcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZSksCiAgICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcykKICAgIH07CiAgfQogIGZ1bmN0aW9uIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpIHsKICAgIHZhciBub2RlID0gZWxlbWVudDsKICAgIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZDsKCiAgICBpZiAoY2hlY2tlZCAhPSBudWxsKSB7CiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgJ2NoZWNrZWQnLCBjaGVja2VkLCBmYWxzZSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHsKICAgIHZhciBub2RlID0gZWxlbWVudDsKCiAgICB7CiAgICAgIHZhciBjb250cm9sbGVkID0gaXNDb250cm9sbGVkKHByb3BzKTsKCiAgICAgIGlmICghbm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgY29udHJvbGxlZCAmJiAhZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCkgewogICAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvICcgKyAnYSBkZWZpbmVkIHZhbHVlLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpOwoKICAgICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKG5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmICFjb250cm9sbGVkICYmICFkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkKSB7CiAgICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGNoYW5naW5nIGEgY29udHJvbGxlZCBpbnB1dCB0byBiZSB1bmNvbnRyb2xsZWQuICcgKyAnVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IHRoZSB2YWx1ZSBjaGFuZ2luZyBmcm9tIGEgZGVmaW5lZCB0byAnICsgJ3VuZGVmaW5lZCwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTsKCiAgICAgICAgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICB1cGRhdGVDaGVja2VkKGVsZW1lbnQsIHByb3BzKTsKICAgIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpOwogICAgdmFyIHR5cGUgPSBwcm9wcy50eXBlOwoKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIGlmICh0eXBlID09PSAnbnVtYmVyJykgewogICAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiBub2RlLnZhbHVlID09PSAnJyB8fCAvLyBXZSBleHBsaWNpdGx5IHdhbnQgdG8gY29lcmNlIHRvIG51bWJlciBoZXJlIGlmIHBvc3NpYmxlLgogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZQogICAgICAgIG5vZGUudmFsdWUgIT0gdmFsdWUpIHsKICAgICAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG5vZGUudmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkgewogICAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0JykgewogICAgICAvLyBTdWJtaXQvcmVzZXQgaW5wdXRzIG5lZWQgdGhlIGF0dHJpYnV0ZSByZW1vdmVkIGNvbXBsZXRlbHkgdG8gYXZvaWQKICAgICAgLy8gYmxhbmstdGV4dCBidXR0b25zLgogICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgndmFsdWUnKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHsKICAgICAgLy8gV2hlbiBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBjb21lcyBmcm9tIGEgY2FzY2FkZSBvZgogICAgICAvLyBwcm9wZXJ0aWVzOgogICAgICAvLyAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5CiAgICAgIC8vICAyLiBUaGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5CiAgICAgIC8vICAzLiBPdGhlcndpc2UgdGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZQogICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHsKICAgICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgcHJvcHMudHlwZSwgdmFsdWUpOwogICAgICB9IGVsc2UgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkgewogICAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSkpOwogICAgICB9CiAgICB9CgogICAgewogICAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBpdCBvbmx5IGNoYW5nZXMgd2hlbiBpdCBuZWVkcwogICAgICAvLyB0byBiZSByZW1vdmVkLCBzdWNoIGFzIHRyYW5zaXRpb25pbmcgZnJvbSBhIGNoZWNrYm94IGludG8gYSB0ZXh0IGlucHV0CiAgICAgIGlmIChwcm9wcy5jaGVja2VkID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT0gbnVsbCkgewogICAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIoZWxlbWVudCwgcHJvcHMsIGlzSHlkcmF0aW5nKSB7CiAgICB2YXIgbm9kZSA9IGVsZW1lbnQ7IC8vIERvIG5vdCBhc3NpZ24gdmFsdWUgaWYgaXQgaXMgYWxyZWFkeSBzZXQuIFRoaXMgcHJldmVudHMgdXNlciB0ZXh0IGlucHV0CiAgICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uCgogICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpIHx8IHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkgewogICAgICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7CiAgICAgIHZhciBpc0J1dHRvbiA9IHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCc7IC8vIEF2b2lkIHNldHRpbmcgdmFsdWUgYXR0cmlidXRlIG9uIHN1Ym1pdC9yZXNldCBpbnB1dHMgYXMgaXQgb3ZlcnJpZGVzIHRoZQogICAgICAvLyBkZWZhdWx0IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyLiBTZWU6ICMxMjg3MgoKICAgICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpOyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dAogICAgICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uCgogICAgICBpZiAoIWlzSHlkcmF0aW5nKSB7CiAgICAgICAgewogICAgICAgICAgLy8gV2hlbiBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzaG91bGQgdXNlCiAgICAgICAgICAvLyB0aGUgd3JhcHBlclN0YXRlLl9pbml0aWFsVmFsdWUgcHJvcGVydHkuIFRoaXMgdXNlczoKICAgICAgICAgIC8vCiAgICAgICAgICAvLyAgIDEuIFRoZSB2YWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnQKICAgICAgICAgIC8vICAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnQKICAgICAgICAgIC8vICAgMy4gQW4gZW1wdHkgc3RyaW5nCiAgICAgICAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSBub2RlLnZhbHVlKSB7CiAgICAgICAgICAgIG5vZGUudmFsdWUgPSBpbml0aWFsVmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB7CiAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgYXR0cmlidXRlIGlzIHN5bmNocm9uaXplZCB0byB0aGUgcHJvcGVydHksCiAgICAgICAgLy8gc28gd2UgYXNzaWduIGRlZmF1bHRWYWx1ZSB0byB0aGUgc2FtZSB0aGluZyBhcyB0aGUgdmFsdWUgcHJvcGVydHkKICAgICAgICAvLyBhc3NpZ25tZW50IHN0ZXAgYWJvdmUuCiAgICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBpbml0aWFsVmFsdWU7CiAgICAgIH0KICAgIH0gLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWcKICAgIC8vIHRoaXMgaXMgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGEgY2hyb21lIGJ1ZyB3aGVyZSBzZXR0aW5nIGRlZmF1bHRDaGVja2VkCiAgICAvLyB3aWxsIHNvbWV0aW1lcyBpbmZsdWVuY2UgdGhlIHZhbHVlIG9mIGNoZWNrZWQgKGV2ZW4gYWZ0ZXIgZGV0YWNobWVudCkuCiAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNgogICAgLy8gV2UgbmVlZCB0byB0ZW1wb3JhcmlseSB1bnNldCBuYW1lIHRvIGF2b2lkIGRpc3J1cHRpbmcgcmFkaW8gYnV0dG9uIGdyb3Vwcy4KCgogICAgdmFyIG5hbWUgPSBub2RlLm5hbWU7CgogICAgaWYgKG5hbWUgIT09ICcnKSB7CiAgICAgIG5vZGUubmFtZSA9ICcnOwogICAgfQoKICAgIHsKICAgICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgYm90aCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSBhbmQKICAgICAgLy8gYXR0cmlidXRlIGFyZSBhc3NpZ25lZCBhdCB0aGUgc2FtZSB0aW1lIHVzaW5nIGRlZmF1bHRDaGVja2VkLiBUaGlzIHVzZXM6CiAgICAgIC8vCiAgICAgIC8vICAgMS4gVGhlIGNoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50CiAgICAgIC8vICAgMi4gVGhlIGRlZmF1bHRDaGVja2VkIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudAogICAgICAvLyAgIDMuIE90aGVyd2lzZSwgZmFsc2UKICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkOwogICAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQ7CiAgICB9CgogICAgaWYgKG5hbWUgIT09ICcnKSB7CiAgICAgIG5vZGUubmFtZSA9IG5hbWU7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHsKICAgIHZhciBub2RlID0gZWxlbWVudDsKICAgIHVwZGF0ZVdyYXBwZXIobm9kZSwgcHJvcHMpOwogICAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZU5hbWVkQ291c2lucyhyb290Tm9kZSwgcHJvcHMpIHsKICAgIHZhciBuYW1lID0gcHJvcHMubmFtZTsKCiAgICBpZiAocHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuYW1lICE9IG51bGwpIHsKICAgICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlOwoKICAgICAgd2hpbGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7CiAgICAgICAgcXVlcnlSb290ID0gcXVlcnlSb290LnBhcmVudE5vZGU7CiAgICAgIH0gLy8gSWYgYHJvb3ROb2RlLmZvcm1gIHdhcyBub24tbnVsbCwgdGhlbiB3ZSBjb3VsZCB0cnkgYGZvcm0uZWxlbWVudHNgLAogICAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZwogICAgICAvLyBgZm9ybS5nZXRFbGVtZW50c0J5TmFtZWAsIGJ1dCB0aGF0IHdpbGwgb25seSByZXR1cm4gZGlyZWN0IGNoaWxkcmVuCiAgICAgIC8vIGFuZCB3b24ndCBpbmNsdWRlIGlucHV0cyB0aGF0IHVzZSB0aGUgSFRNTDUgYGZvcm09YCBhdHRyaWJ1dGUuIFNpbmNlCiAgICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0uIEl0IG1pZ2h0IG5vdCBldmVuIGJlIGluIHRoZQogICAgICAvLyBkb2N1bWVudC4gTGV0J3MganVzdCB1c2UgdGhlIGxvY2FsIGBxdWVyeVNlbGVjdG9yQWxsYCB0byBlbnN1cmUgd2UgZG9uJ3QKICAgICAgLy8gbWlzcyBhbnl0aGluZy4KCgogICAgICB7CiAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihuYW1lLCAnbmFtZScpOwogICAgICB9CgogICAgICB2YXIgZ3JvdXAgPSBxdWVyeVJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0nICsgSlNPTi5zdHJpbmdpZnkoJycgKyBuYW1lKSArICddW3R5cGU9InJhZGlvIl0nKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgb3RoZXJOb2RlID0gZ3JvdXBbaV07CgogICAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9IC8vIFRoaXMgd2lsbCB0aHJvdyBpZiByYWRpbyBidXR0b25zIHJlbmRlcmVkIGJ5IGRpZmZlcmVudCBjb3BpZXMgb2YgUmVhY3QKICAgICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS4KICAgICAgICAvLyBUaGF0J3MgcHJvYmFibHkgb2theTsgd2UgZG9uJ3Qgc3VwcG9ydCBpdCBqdXN0IGFzIHdlIGRvbid0IHN1cHBvcnQKICAgICAgICAvLyBtaXhpbmcgUmVhY3QgcmFkaW8gYnV0dG9ucyB3aXRoIG5vbi1SZWFjdCBvbmVzLgoKCiAgICAgICAgdmFyIG90aGVyUHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKG90aGVyTm9kZSk7CgogICAgICAgIGlmICghb3RoZXJQcm9wcykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgJyArICdzYW1lIGBuYW1lYCBpcyBub3Qgc3VwcG9ydGVkLicpOwogICAgICAgIH0gLy8gV2UgbmVlZCB1cGRhdGUgdGhlIHRyYWNrZWQgdmFsdWUgb24gdGhlIG5hbWVkIGNvdXNpbiBzaW5jZSB0aGUgdmFsdWUKICAgICAgICAvLyB3YXMgY2hhbmdlZCBidXQgdGhlIGlucHV0IHNhdyBubyBldmVudCBvciB2YWx1ZSBzZXQKCgogICAgICAgIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG90aGVyTm9kZSk7IC8vIElmIHRoaXMgaXMgYSBjb250cm9sbGVkIHJhZGlvIGJ1dHRvbiBncm91cCwgZm9yY2luZyB0aGUgaW5wdXQgdGhhdAogICAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkCiAgICAgICAgLy8gYXMgYXBwcm9wcmlhdGUuCgogICAgICAgIHVwZGF0ZVdyYXBwZXIob3RoZXJOb2RlLCBvdGhlclByb3BzKTsKICAgICAgfQogICAgfQogIH0gLy8gSW4gQ2hyb21lLCBhc3NpZ25pbmcgZGVmYXVsdFZhbHVlIHRvIGNlcnRhaW4gaW5wdXQgdHlwZXMgdHJpZ2dlcnMgaW5wdXQgdmFsaWRhdGlvbi4KICAvLyBGb3IgbnVtYmVyIGlucHV0cywgdGhlIGRpc3BsYXkgdmFsdWUgbG9zZXMgdHJhaWxpbmcgZGVjaW1hbCBwb2ludHMuIEZvciBlbWFpbCBpbnB1dHMsCiAgLy8gQ2hyb21lIHJhaXNlcyAiVGhlIHNwZWNpZmllZCB2YWx1ZSA8eD4gaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzcyIuCiAgLy8KICAvLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtcwogIC8vIHdoZW4gdGhlIHVzZXIgaXMgaW5wdXR0aW5nIHRleHQKICAvLwogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1MwoKCiAgZnVuY3Rpb24gc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHR5cGUsIHZhbHVlKSB7CiAgICBpZiAoIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanMKICAgIHR5cGUgIT09ICdudW1iZXInIHx8IGdldEFjdGl2ZUVsZW1lbnQobm9kZS5vd25lckRvY3VtZW50KSAhPT0gbm9kZSkgewogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7CiAgICAgIH0gZWxzZSBpZiAobm9kZS5kZWZhdWx0VmFsdWUgIT09IHRvU3RyaW5nKHZhbHVlKSkgewogICAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcodmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICB2YXIgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSBmYWxzZTsKICB2YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlOwogIHZhciBkaWRXYXJuSW52YWxpZElubmVySFRNTCA9IGZhbHNlOwogIC8qKgogICAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LgogICAqLwoKICBmdW5jdGlvbiB2YWxpZGF0ZVByb3BzKGVsZW1lbnQsIHByb3BzKSB7CiAgICB7CiAgICAgIC8vIElmIGEgdmFsdWUgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoZSBjaGlsZHJlbiBtdXN0IGJlIHNpbXBsZS4KICAgICAgaWYgKHByb3BzLnZhbHVlID09IG51bGwpIHsKICAgICAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnb2JqZWN0JyAmJiBwcm9wcy5jaGlsZHJlbiAhPT0gbnVsbCkgewogICAgICAgICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgICAgICAgIGlmIChjaGlsZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkQ2hpbGQpIHsKICAgICAgICAgICAgICBkaWRXYXJuSW52YWxpZENoaWxkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCBpbmZlciB0aGUgb3B0aW9uIHZhbHVlIG9mIGNvbXBsZXggY2hpbGRyZW4uICcgKyAnUGFzcyBhIGB2YWx1ZWAgcHJvcCBvciB1c2UgYSBwbGFpbiBzdHJpbmcgYXMgY2hpbGRyZW4gdG8gPG9wdGlvbj4uJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkgewogICAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZElubmVySFRNTCkgewogICAgICAgICAgICBkaWRXYXJuSW52YWxpZElubmVySFRNTCA9IHRydWU7CgogICAgICAgICAgICBlcnJvcignUGFzcyBhIGB2YWx1ZWAgcHJvcCBpZiB5b3Ugc2V0IGRhbmdlcm91c2x5SW5uZXJIVE1MIHNvIFJlYWN0IGtub3dzICcgKyAnd2hpY2ggdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkLicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSAvLyBUT0RPOiBSZW1vdmUgc3VwcG9ydCBmb3IgYHNlbGVjdGVkYCBpbiA8b3B0aW9uPi4KCgogICAgICBpZiAocHJvcHMuc2VsZWN0ZWQgIT0gbnVsbCAmJiAhZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24pIHsKICAgICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIG9uIDxzZWxlY3Q+IGluc3RlYWQgb2YgJyArICdzZXR0aW5nIGBzZWxlY3RlZGAgb24gPG9wdGlvbj4uJyk7CgogICAgICAgIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHsKICAgIC8vIHZhbHVlPSIiIHNob3VsZCBtYWtlIGEgdmFsdWUgYXR0cmlidXRlICgjNjIxOSkKICAgIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7CiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHRvU3RyaW5nKGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpKSk7CiAgICB9CiAgfQoKICB2YXIgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlCgogIGZ1bmN0aW9uIGlzQXJyYXkoYSkgewogICAgcmV0dXJuIGlzQXJyYXlJbXBsKGEpOwogIH0KCiAgdmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxOwoKICB7CiAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkgewogICAgdmFyIG93bmVyTmFtZSA9IGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCk7CgogICAgaWYgKG93bmVyTmFtZSkgewogICAgICByZXR1cm4gJ1xuXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7CiAgICB9CgogICAgcmV0dXJuICcnOwogIH0KCiAgdmFyIHZhbHVlUHJvcE5hbWVzID0gWyd2YWx1ZScsICdkZWZhdWx0VmFsdWUnXTsKICAvKioKICAgKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIGZvciBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC4KICAgKi8KCiAgZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpIHsKICAgIHsKICAgICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygnc2VsZWN0JywgcHJvcHMpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZVByb3BOYW1lcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBwcm9wTmFtZSA9IHZhbHVlUHJvcE5hbWVzW2ldOwoKICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgdmFyIHByb3BOYW1lSXNBcnJheSA9IGlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTsKCiAgICAgICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFwcm9wTmFtZUlzQXJyYXkpIHsKICAgICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpOwogICAgICAgIH0gZWxzZSBpZiAoIXByb3BzLm11bHRpcGxlICYmIHByb3BOYW1lSXNBcnJheSkgewogICAgICAgICAgZXJyb3IoJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhIHNjYWxhciAnICsgJ3ZhbHVlIGlmIGBtdWx0aXBsZWAgaXMgZmFsc2UuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyhub2RlLCBtdWx0aXBsZSwgcHJvcFZhbHVlLCBzZXREZWZhdWx0U2VsZWN0ZWQpIHsKICAgIHZhciBvcHRpb25zID0gbm9kZS5vcHRpb25zOwoKICAgIGlmIChtdWx0aXBsZSkgewogICAgICB2YXIgc2VsZWN0ZWRWYWx1ZXMgPSBwcm9wVmFsdWU7CiAgICAgIHZhciBzZWxlY3RlZFZhbHVlID0ge307CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8gUHJlZml4IHRvIGF2b2lkIGNoYW9zIHdpdGggc3BlY2lhbCBrZXlzLgogICAgICAgIHNlbGVjdGVkVmFsdWVbJyQnICsgc2VsZWN0ZWRWYWx1ZXNbaV1dID0gdHJ1ZTsKICAgICAgfQoKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG9wdGlvbnMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7CgogICAgICAgIGlmIChvcHRpb25zW19pXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHsKICAgICAgICAgIG9wdGlvbnNbX2ldLnNlbGVjdGVkID0gc2VsZWN0ZWQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2VsZWN0ZWQgJiYgc2V0RGVmYXVsdFNlbGVjdGVkKSB7CiAgICAgICAgICBvcHRpb25zW19pXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gRG8gbm90IHNldCBgc2VsZWN0LnZhbHVlYCBhcyBleGFjdCBiZWhhdmlvciBpc24ndCBjb25zaXN0ZW50IGFjcm9zcyBhbGwKICAgICAgLy8gYnJvd3NlcnMgZm9yIGFsbCBjYXNlcy4KICAgICAgdmFyIF9zZWxlY3RlZFZhbHVlID0gdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wVmFsdWUpKTsKCiAgICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsOwoKICAgICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3B0aW9ucy5sZW5ndGg7IF9pMisrKSB7CiAgICAgICAgaWYgKG9wdGlvbnNbX2kyXS52YWx1ZSA9PT0gX3NlbGVjdGVkVmFsdWUpIHsKICAgICAgICAgIG9wdGlvbnNbX2kyXS5zZWxlY3RlZCA9IHRydWU7CgogICAgICAgICAgaWYgKHNldERlZmF1bHRTZWxlY3RlZCkgewogICAgICAgICAgICBvcHRpb25zW19pMl0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoZGVmYXVsdFNlbGVjdGVkID09PSBudWxsICYmICFvcHRpb25zW19pMl0uZGlzYWJsZWQpIHsKICAgICAgICAgIGRlZmF1bHRTZWxlY3RlZCA9IG9wdGlvbnNbX2kyXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgIT09IG51bGwpIHsKICAgICAgICBkZWZhdWx0U2VsZWN0ZWQuc2VsZWN0ZWQgPSB0cnVlOwogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIEltcGxlbWVudHMgYSA8c2VsZWN0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBvcHRpb25hbGx5IHNldHRpbmcgdGhlCiAgICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYQogICAqIHN0cmluZ2FibGUuIElmIGBtdWx0aXBsZWAgaXMgdHJ1ZSwgdGhlIHByb3AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdhYmxlcy4KICAgKgogICAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGUKICAgKiBzZWxlY3RlZCBvcHRpb24gd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIHJlbmRlcmVkIG9wdGlvbnMuCiAgICoKICAgKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90CiAgICogdXBkYXRlIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9ucy4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpbgogICAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgb3B0aW9ucyB0byB1cGRhdGUuCiAgICoKICAgKiBJZiBgZGVmYXVsdFZhbHVlYCBpcyBwcm92aWRlZCwgYW55IG9wdGlvbnMgd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWVzIHdpbGwgYmUKICAgKiBzZWxlY3RlZC4KICAgKi8KCgogIGZ1bmN0aW9uIGdldEhvc3RQcm9wcyQxKGVsZW1lbnQsIHByb3BzKSB7CiAgICByZXR1cm4gYXNzaWduKHt9LCBwcm9wcywgewogICAgICB2YWx1ZTogdW5kZWZpbmVkCiAgICB9KTsKICB9CiAgZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7CiAgICB2YXIgbm9kZSA9IGVsZW1lbnQ7CgogICAgewogICAgICBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcyk7CiAgICB9CgogICAgbm9kZS5fd3JhcHBlclN0YXRlID0gewogICAgICB3YXNNdWx0aXBsZTogISFwcm9wcy5tdWx0aXBsZQogICAgfTsKCiAgICB7CiAgICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSkgewogICAgICAgIGVycm9yKCdTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHNlbGVjdCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7CgogICAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDIoZWxlbWVudCwgcHJvcHMpIHsKICAgIHZhciBub2RlID0gZWxlbWVudDsKICAgIG5vZGUubXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlOwogICAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7CgogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpOwogICAgfSBlbHNlIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkgewogICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHBvc3RVcGRhdGVXcmFwcGVyKGVsZW1lbnQsIHByb3BzKSB7CiAgICB2YXIgbm9kZSA9IGVsZW1lbnQ7CiAgICB2YXIgd2FzTXVsdGlwbGUgPSBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7CiAgICBub2RlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGUgPSAhIXByb3BzLm11bHRpcGxlOwogICAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7CgogICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpOwogICAgfSBlbHNlIGlmICh3YXNNdWx0aXBsZSAhPT0gISFwcm9wcy5tdWx0aXBsZSkgewogICAgICAvLyBGb3Igc2ltcGxpY2l0eSwgcmVhcHBseSBgZGVmYXVsdFZhbHVlYCBpZiBgbXVsdGlwbGVgIGlzIHRvZ2dsZWQuCiAgICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkgewogICAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMuZGVmYXVsdFZhbHVlLCB0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBSZXZlcnQgdGhlIHNlbGVjdCBiYWNrIHRvIGl0cyBkZWZhdWx0IHVuc2VsZWN0ZWQgc3RhdGUuCiAgICAgICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5tdWx0aXBsZSA/IFtdIDogJycsIGZhbHNlKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHsKICAgIHZhciBub2RlID0gZWxlbWVudDsKICAgIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlOwoKICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTsKICAgIH0KICB9CgogIHZhciBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IGZhbHNlOwoKICAvKioKICAgKiBJbXBsZW1lbnRzIGEgPHRleHRhcmVhPiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIGB2YWx1ZWAsIGFuZAogICAqIGBkZWZhdWx0VmFsdWVgLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdHJhZGl0aW9uYWwgRE9NIEFQSSBiZWNhdXNlIHZhbHVlIGlzCiAgICogdXN1YWxseSBzZXQgYXMgUENEQVRBIGNoaWxkcmVuLgogICAqCiAgICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZQogICAqIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LgogICAqCiAgICogSWYgYHZhbHVlYCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwKICAgKiBub3QgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluCiAgICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuCiAgICoKICAgKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUsIHRoZSBwcm9wCiAgICogYGRlZmF1bHRWYWx1ZWAgaWYgc3BlY2lmaWVkLCBvciB0aGUgY2hpbGRyZW4gY29udGVudCAoZGVwcmVjYXRlZCkuCiAgICovCiAgZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDIoZWxlbWVudCwgcHJvcHMpIHsKICAgIHZhciBub2RlID0gZWxlbWVudDsKCiAgICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ2BkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LicpOwogICAgfSAvLyBBbHdheXMgc2V0IGNoaWxkcmVuIHRvIHRoZSBzYW1lIHRoaW5nLiBJbiBJRTksIHRoZSBzZWxlY3Rpb24gcmFuZ2Ugd2lsbAogICAgLy8gZ2V0IHJlc2V0IGlmIGB0ZXh0Q29udGVudGAgaXMgbXV0YXRlZC4gIFdlIGNvdWxkIGFkZCBhIGNoZWNrIGluIHNldFRleHRDb250ZW50CiAgICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZAogICAgLy8gY29tcGxldGVseSBzb2x2ZSB0aGlzIElFOSBidWcpLCBidXQgU2ViYXN0aWFuK1NvcGhpZSBzZWVtZWQgdG8gbGlrZSB0aGlzCiAgICAvLyBzb2x1dGlvbi4gVGhlIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4gb3Igb2JqZWN0IHNvIHRoYXQncyB3aHkgaXQncyBmb3JjZWQKICAgIC8vIHRvIGJlIGEgc3RyaW5nLgoKCiAgICB2YXIgaG9zdFByb3BzID0gYXNzaWduKHt9LCBwcm9wcywgewogICAgICB2YWx1ZTogdW5kZWZpbmVkLAogICAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCwKICAgICAgY2hpbGRyZW46IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpCiAgICB9KTsKCiAgICByZXR1cm4gaG9zdFByb3BzOwogIH0KICBmdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHsKICAgIHZhciBub2RlID0gZWxlbWVudDsKCiAgICB7CiAgICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3RleHRhcmVhJywgcHJvcHMpOwoKICAgICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWxEZWZhdWx0VmFsKSB7CiAgICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGEgdGV4dGFyZWEgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnVGV4dGFyZWEgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHRleHRhcmVhICcgKyAnYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnKTsKCiAgICAgICAgZGlkV2FyblZhbERlZmF1bHRWYWwgPSB0cnVlOwogICAgICB9CiAgICB9CgogICAgdmFyIGluaXRpYWxWYWx1ZSA9IHByb3BzLnZhbHVlOyAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdAoKICAgIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkgewogICAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbiwKICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTsKCiAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7CiAgICAgICAgewogICAgICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcgJyArICdjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpOwogICAgICAgIH0KCiAgICAgICAgewogICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLicpOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkgewogICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignPHRleHRhcmVhPiBjYW4gb25seSBoYXZlIGF0IG1vc3Qgb25lIGNoaWxkLicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuWzBdOwogICAgICAgICAgfQoKICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGNoaWxkcmVuOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7CiAgICAgICAgZGVmYXVsdFZhbHVlID0gJyc7CiAgICAgIH0KCiAgICAgIGluaXRpYWxWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKICAgIH0KCiAgICBub2RlLl93cmFwcGVyU3RhdGUgPSB7CiAgICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShpbml0aWFsVmFsdWUpCiAgICB9OwogIH0KICBmdW5jdGlvbiB1cGRhdGVXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHsKICAgIHZhciBub2RlID0gZWxlbWVudDsKICAgIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpOwogICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKTsKCiAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZQogICAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRvZXNuJ3QuCiAgICAgIHZhciBuZXdWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTsgLy8gVG8gYXZvaWQgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGxvc2luZyB0ZXh0IHNlbGVjdGlvbiksIG9ubHkgc2V0IHZhbHVlIGlmIGNoYW5nZWQKCiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gbm9kZS52YWx1ZSkgewogICAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgfQoKICAgICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsICYmIG5vZGUuZGVmYXVsdFZhbHVlICE9PSBuZXdWYWx1ZSkgewogICAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gbmV3VmFsdWU7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhkZWZhdWx0VmFsdWUpOwogICAgfQogIH0KICBmdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDMoZWxlbWVudCwgcHJvcHMpIHsKICAgIHZhciBub2RlID0gZWxlbWVudDsgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdAogICAgLy8gYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIG1vdW50ZWQuCgogICAgdmFyIHRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudDsgLy8gT25seSBzZXQgbm9kZS52YWx1ZSBpZiB0ZXh0Q29udGVudCBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWQKICAgIC8vIGluaXRpYWwgdmFsdWUuIEluIElFMTAvSUUxMSB0aGVyZSBpcyBhIGJ1ZyB3aGVyZSB0aGUgcGxhY2Vob2xkZXIgYXR0cmlidXRlCiAgICAvLyB3aWxsIHBvcHVsYXRlIHRleHRDb250ZW50IGFzIHdlbGwuCiAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMDE1MjUvCgogICAgaWYgKHRleHRDb250ZW50ID09PSBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKSB7CiAgICAgIGlmICh0ZXh0Q29udGVudCAhPT0gJycgJiYgdGV4dENvbnRlbnQgIT09IG51bGwpIHsKICAgICAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQyKGVsZW1lbnQsIHByb3BzKSB7CiAgICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVwZGF0ZQogICAgdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKTsKICB9CgogIHZhciBIVE1MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJzsKICB2YXIgTUFUSF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCc7CiAgdmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOyAvLyBBc3N1bWVzIHRoZXJlIGlzIG5vIHBhcmVudCBuYW1lc3BhY2UuCgogIGZ1bmN0aW9uIGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKSB7CiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSAnc3ZnJzoKICAgICAgICByZXR1cm4gU1ZHX05BTUVTUEFDRTsKCiAgICAgIGNhc2UgJ21hdGgnOgogICAgICAgIHJldHVybiBNQVRIX05BTUVTUEFDRTsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFOwogICAgfQogIH0KICBmdW5jdGlvbiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHsKICAgIGlmIChwYXJlbnROYW1lc3BhY2UgPT0gbnVsbCB8fCBwYXJlbnROYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7CiAgICAgIC8vIE5vIChvciBkZWZhdWx0KSBwYXJlbnQgbmFtZXNwYWNlOiBwb3RlbnRpYWwgZW50cnkgcG9pbnQuCiAgICAgIHJldHVybiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7CiAgICB9CgogICAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PT0gU1ZHX05BTUVTUEFDRSAmJiB0eXBlID09PSAnZm9yZWlnbk9iamVjdCcpIHsKICAgICAgLy8gV2UncmUgbGVhdmluZyBTVkcuCiAgICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTsKICAgIH0gLy8gQnkgZGVmYXVsdCwgcGFzcyBuYW1lc3BhY2UgYmVsb3cuCgoKICAgIHJldHVybiBwYXJlbnROYW1lc3BhY2U7CiAgfQoKICAvKiBnbG9iYWxzIE1TQXBwICovCgogIC8qKgogICAqIENyZWF0ZSBhIGZ1bmN0aW9uIHdoaWNoIGhhcyAndW5zYWZlJyBwcml2aWxlZ2VzIChyZXF1aXJlZCBieSB3aW5kb3dzOCBhcHBzKQogICAqLwogIHZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHsKICAgIGlmICh0eXBlb2YgTVNBcHAgIT09ICd1bmRlZmluZWQnICYmIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykgewogICAgICAgIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBmdW5jKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwogICAgICAgIH0pOwogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIGZ1bmM7CiAgICB9CiAgfTsKCiAgdmFyIHJldXNhYmxlU1ZHQ29udGFpbmVyOwogIC8qKgogICAqIFNldCB0aGUgaW5uZXJIVE1MIHByb3BlcnR5IG9mIGEgbm9kZQogICAqCiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlCiAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWwKICAgKiBAaW50ZXJuYWwKICAgKi8KCiAgdmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHsKICAgIGlmIChub2RlLm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkgewoKICAgICAgaWYgKCEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHsKICAgICAgICAvLyBJRSBkb2VzIG5vdCBoYXZlIGlubmVySFRNTCBmb3IgU1ZHIG5vZGVzLCBzbyBpbnN0ZWFkIHdlIGluamVjdCB0aGUKICAgICAgICAvLyBuZXcgbWFya3VwIGluIGEgdGVtcCBub2RlIGFuZCB0aGVuIG1vdmUgdGhlIGNoaWxkIG5vZGVzIGFjcm9zcyBpbnRvCiAgICAgICAgLy8gdGhlIHRhcmdldCBub2RlCiAgICAgICAgcmV1c2FibGVTVkdDb250YWluZXIgPSByZXVzYWJsZVNWR0NvbnRhaW5lciB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICByZXVzYWJsZVNWR0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHN2Zz4nICsgaHRtbC52YWx1ZU9mKCkudG9TdHJpbmcoKSArICc8L3N2Zz4nOwogICAgICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDsKCiAgICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkgewogICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpOwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKHN2Z05vZGUuZmlyc3RDaGlsZCkgewogICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgbm9kZS5pbm5lckhUTUwgPSBodG1sOwogIH0pOwoKICAvKioKICAgKiBIVE1MIG5vZGVUeXBlIHZhbHVlcyB0aGF0IHJlcHJlc2VudCB0aGUgdHlwZSBvZiB0aGUgbm9kZQogICAqLwogIHZhciBFTEVNRU5UX05PREUgPSAxOwogIHZhciBURVhUX05PREUgPSAzOwogIHZhciBDT01NRU5UX05PREUgPSA4OwogIHZhciBET0NVTUVOVF9OT0RFID0gOTsKICB2YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA9IDExOwoKICAvKioKICAgKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZS4gRm9yIHRleHQgdXBkYXRlcywgaXQncyBmYXN0ZXIKICAgKiB0byBzZXQgdGhlIGBub2RlVmFsdWVgIG9mIHRoZSBUZXh0IG5vZGUgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZwogICAqIGAudGV4dENvbnRlbnRgIHdoaWNoIHdpbGwgcmVtb3ZlIHRoZSBleGlzdGluZyBub2RlIGFuZCBjcmVhdGUgYSBuZXcgb25lLgogICAqCiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlCiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQKICAgKiBAaW50ZXJuYWwKICAgKi8KCiAgdmFyIHNldFRleHRDb250ZW50ID0gZnVuY3Rpb24gKG5vZGUsIHRleHQpIHsKICAgIGlmICh0ZXh0KSB7CiAgICAgIHZhciBmaXJzdENoaWxkID0gbm9kZS5maXJzdENoaWxkOwoKICAgICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZCA9PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7CiAgICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0OwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0OwogIH07CgogIC8vIExpc3QgZGVyaXZlZCBmcm9tIEdlY2tvIHNvdXJjZSBjb2RlOgogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvLWRldi9ibG9iLzRlNjM4ZWZjNzEvbGF5b3V0L3N0eWxlL3Rlc3QvcHJvcGVydHlfZGF0YWJhc2UuanMKICB2YXIgc2hvcnRoYW5kVG9Mb25naGFuZCA9IHsKICAgIGFuaW1hdGlvbjogWydhbmltYXRpb25EZWxheScsICdhbmltYXRpb25EaXJlY3Rpb24nLCAnYW5pbWF0aW9uRHVyYXRpb24nLCAnYW5pbWF0aW9uRmlsbE1vZGUnLCAnYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQnLCAnYW5pbWF0aW9uTmFtZScsICdhbmltYXRpb25QbGF5U3RhdGUnLCAnYW5pbWF0aW9uVGltaW5nRnVuY3Rpb24nXSwKICAgIGJhY2tncm91bmQ6IFsnYmFja2dyb3VuZEF0dGFjaG1lbnQnLCAnYmFja2dyb3VuZENsaXAnLCAnYmFja2dyb3VuZENvbG9yJywgJ2JhY2tncm91bmRJbWFnZScsICdiYWNrZ3JvdW5kT3JpZ2luJywgJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWScsICdiYWNrZ3JvdW5kUmVwZWF0JywgJ2JhY2tncm91bmRTaXplJ10sCiAgICBiYWNrZ3JvdW5kUG9zaXRpb246IFsnYmFja2dyb3VuZFBvc2l0aW9uWCcsICdiYWNrZ3JvdW5kUG9zaXRpb25ZJ10sCiAgICBib3JkZXI6IFsnYm9yZGVyQm90dG9tQ29sb3InLCAnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJywgJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0Q29sb3InLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJSaWdodFdpZHRoJywgJ2JvcmRlclRvcENvbG9yJywgJ2JvcmRlclRvcFN0eWxlJywgJ2JvcmRlclRvcFdpZHRoJ10sCiAgICBib3JkZXJCbG9ja0VuZDogWydib3JkZXJCbG9ja0VuZENvbG9yJywgJ2JvcmRlckJsb2NrRW5kU3R5bGUnLCAnYm9yZGVyQmxvY2tFbmRXaWR0aCddLAogICAgYm9yZGVyQmxvY2tTdGFydDogWydib3JkZXJCbG9ja1N0YXJ0Q29sb3InLCAnYm9yZGVyQmxvY2tTdGFydFN0eWxlJywgJ2JvcmRlckJsb2NrU3RhcnRXaWR0aCddLAogICAgYm9yZGVyQm90dG9tOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJ10sCiAgICBib3JkZXJDb2xvcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJUb3BDb2xvciddLAogICAgYm9yZGVySW1hZ2U6IFsnYm9yZGVySW1hZ2VPdXRzZXQnLCAnYm9yZGVySW1hZ2VSZXBlYXQnLCAnYm9yZGVySW1hZ2VTbGljZScsICdib3JkZXJJbWFnZVNvdXJjZScsICdib3JkZXJJbWFnZVdpZHRoJ10sCiAgICBib3JkZXJJbmxpbmVFbmQ6IFsnYm9yZGVySW5saW5lRW5kQ29sb3InLCAnYm9yZGVySW5saW5lRW5kU3R5bGUnLCAnYm9yZGVySW5saW5lRW5kV2lkdGgnXSwKICAgIGJvcmRlcklubGluZVN0YXJ0OiBbJ2JvcmRlcklubGluZVN0YXJ0Q29sb3InLCAnYm9yZGVySW5saW5lU3RhcnRTdHlsZScsICdib3JkZXJJbmxpbmVTdGFydFdpZHRoJ10sCiAgICBib3JkZXJMZWZ0OiBbJ2JvcmRlckxlZnRDb2xvcicsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyTGVmdFdpZHRoJ10sCiAgICBib3JkZXJSYWRpdXM6IFsnYm9yZGVyQm90dG9tTGVmdFJhZGl1cycsICdib3JkZXJCb3R0b21SaWdodFJhZGl1cycsICdib3JkZXJUb3BMZWZ0UmFkaXVzJywgJ2JvcmRlclRvcFJpZ2h0UmFkaXVzJ10sCiAgICBib3JkZXJSaWdodDogWydib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCddLAogICAgYm9yZGVyU3R5bGU6IFsnYm9yZGVyQm90dG9tU3R5bGUnLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyVG9wU3R5bGUnXSwKICAgIGJvcmRlclRvcDogWydib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLAogICAgYm9yZGVyV2lkdGg6IFsnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wV2lkdGgnXSwKICAgIGNvbHVtblJ1bGU6IFsnY29sdW1uUnVsZUNvbG9yJywgJ2NvbHVtblJ1bGVTdHlsZScsICdjb2x1bW5SdWxlV2lkdGgnXSwKICAgIGNvbHVtbnM6IFsnY29sdW1uQ291bnQnLCAnY29sdW1uV2lkdGgnXSwKICAgIGZsZXg6IFsnZmxleEJhc2lzJywgJ2ZsZXhHcm93JywgJ2ZsZXhTaHJpbmsnXSwKICAgIGZsZXhGbG93OiBbJ2ZsZXhEaXJlY3Rpb24nLCAnZmxleFdyYXAnXSwKICAgIGZvbnQ6IFsnZm9udEZhbWlseScsICdmb250RmVhdHVyZVNldHRpbmdzJywgJ2ZvbnRLZXJuaW5nJywgJ2ZvbnRMYW5ndWFnZU92ZXJyaWRlJywgJ2ZvbnRTaXplJywgJ2ZvbnRTaXplQWRqdXN0JywgJ2ZvbnRTdHJldGNoJywgJ2ZvbnRTdHlsZScsICdmb250VmFyaWFudCcsICdmb250VmFyaWFudEFsdGVybmF0ZXMnLCAnZm9udFZhcmlhbnRDYXBzJywgJ2ZvbnRWYXJpYW50RWFzdEFzaWFuJywgJ2ZvbnRWYXJpYW50TGlnYXR1cmVzJywgJ2ZvbnRWYXJpYW50TnVtZXJpYycsICdmb250VmFyaWFudFBvc2l0aW9uJywgJ2ZvbnRXZWlnaHQnLCAnbGluZUhlaWdodCddLAogICAgZm9udFZhcmlhbnQ6IFsnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbiddLAogICAgZ2FwOiBbJ2NvbHVtbkdhcCcsICdyb3dHYXAnXSwKICAgIGdyaWQ6IFsnZ3JpZEF1dG9Db2x1bW5zJywgJ2dyaWRBdXRvRmxvdycsICdncmlkQXV0b1Jvd3MnLCAnZ3JpZFRlbXBsYXRlQXJlYXMnLCAnZ3JpZFRlbXBsYXRlQ29sdW1ucycsICdncmlkVGVtcGxhdGVSb3dzJ10sCiAgICBncmlkQXJlYTogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCcsICdncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLAogICAgZ3JpZENvbHVtbjogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCddLAogICAgZ3JpZENvbHVtbkdhcDogWydjb2x1bW5HYXAnXSwKICAgIGdyaWRHYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLAogICAgZ3JpZFJvdzogWydncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLAogICAgZ3JpZFJvd0dhcDogWydyb3dHYXAnXSwKICAgIGdyaWRUZW1wbGF0ZTogWydncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSwKICAgIGxpc3RTdHlsZTogWydsaXN0U3R5bGVJbWFnZScsICdsaXN0U3R5bGVQb3NpdGlvbicsICdsaXN0U3R5bGVUeXBlJ10sCiAgICBtYXJnaW46IFsnbWFyZ2luQm90dG9tJywgJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnLCAnbWFyZ2luVG9wJ10sCiAgICBtYXJrZXI6IFsnbWFya2VyRW5kJywgJ21hcmtlck1pZCcsICdtYXJrZXJTdGFydCddLAogICAgbWFzazogWydtYXNrQ2xpcCcsICdtYXNrQ29tcG9zaXRlJywgJ21hc2tJbWFnZScsICdtYXNrTW9kZScsICdtYXNrT3JpZ2luJywgJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWScsICdtYXNrUmVwZWF0JywgJ21hc2tTaXplJ10sCiAgICBtYXNrUG9zaXRpb246IFsnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJ10sCiAgICBvdXRsaW5lOiBbJ291dGxpbmVDb2xvcicsICdvdXRsaW5lU3R5bGUnLCAnb3V0bGluZVdpZHRoJ10sCiAgICBvdmVyZmxvdzogWydvdmVyZmxvd1gnLCAnb3ZlcmZsb3dZJ10sCiAgICBwYWRkaW5nOiBbJ3BhZGRpbmdCb3R0b20nLCAncGFkZGluZ0xlZnQnLCAncGFkZGluZ1JpZ2h0JywgJ3BhZGRpbmdUb3AnXSwKICAgIHBsYWNlQ29udGVudDogWydhbGlnbkNvbnRlbnQnLCAnanVzdGlmeUNvbnRlbnQnXSwKICAgIHBsYWNlSXRlbXM6IFsnYWxpZ25JdGVtcycsICdqdXN0aWZ5SXRlbXMnXSwKICAgIHBsYWNlU2VsZjogWydhbGlnblNlbGYnLCAnanVzdGlmeVNlbGYnXSwKICAgIHRleHREZWNvcmF0aW9uOiBbJ3RleHREZWNvcmF0aW9uQ29sb3InLCAndGV4dERlY29yYXRpb25MaW5lJywgJ3RleHREZWNvcmF0aW9uU3R5bGUnXSwKICAgIHRleHRFbXBoYXNpczogWyd0ZXh0RW1waGFzaXNDb2xvcicsICd0ZXh0RW1waGFzaXNTdHlsZSddLAogICAgdHJhbnNpdGlvbjogWyd0cmFuc2l0aW9uRGVsYXknLCAndHJhbnNpdGlvbkR1cmF0aW9uJywgJ3RyYW5zaXRpb25Qcm9wZXJ0eScsICd0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb24nXSwKICAgIHdvcmRXcmFwOiBbJ292ZXJmbG93V3JhcCddCiAgfTsKCiAgLyoqCiAgICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgInB4Ii4KICAgKi8KICB2YXIgaXNVbml0bGVzc051bWJlciA9IHsKICAgIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLAogICAgYXNwZWN0UmF0aW86IHRydWUsCiAgICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSwKICAgIGJvcmRlckltYWdlU2xpY2U6IHRydWUsCiAgICBib3JkZXJJbWFnZVdpZHRoOiB0cnVlLAogICAgYm94RmxleDogdHJ1ZSwKICAgIGJveEZsZXhHcm91cDogdHJ1ZSwKICAgIGJveE9yZGluYWxHcm91cDogdHJ1ZSwKICAgIGNvbHVtbkNvdW50OiB0cnVlLAogICAgY29sdW1uczogdHJ1ZSwKICAgIGZsZXg6IHRydWUsCiAgICBmbGV4R3JvdzogdHJ1ZSwKICAgIGZsZXhQb3NpdGl2ZTogdHJ1ZSwKICAgIGZsZXhTaHJpbms6IHRydWUsCiAgICBmbGV4TmVnYXRpdmU6IHRydWUsCiAgICBmbGV4T3JkZXI6IHRydWUsCiAgICBncmlkQXJlYTogdHJ1ZSwKICAgIGdyaWRSb3c6IHRydWUsCiAgICBncmlkUm93RW5kOiB0cnVlLAogICAgZ3JpZFJvd1NwYW46IHRydWUsCiAgICBncmlkUm93U3RhcnQ6IHRydWUsCiAgICBncmlkQ29sdW1uOiB0cnVlLAogICAgZ3JpZENvbHVtbkVuZDogdHJ1ZSwKICAgIGdyaWRDb2x1bW5TcGFuOiB0cnVlLAogICAgZ3JpZENvbHVtblN0YXJ0OiB0cnVlLAogICAgZm9udFdlaWdodDogdHJ1ZSwKICAgIGxpbmVDbGFtcDogdHJ1ZSwKICAgIGxpbmVIZWlnaHQ6IHRydWUsCiAgICBvcGFjaXR5OiB0cnVlLAogICAgb3JkZXI6IHRydWUsCiAgICBvcnBoYW5zOiB0cnVlLAogICAgdGFiU2l6ZTogdHJ1ZSwKICAgIHdpZG93czogdHJ1ZSwKICAgIHpJbmRleDogdHJ1ZSwKICAgIHpvb206IHRydWUsCiAgICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzCiAgICBmaWxsT3BhY2l0eTogdHJ1ZSwKICAgIGZsb29kT3BhY2l0eTogdHJ1ZSwKICAgIHN0b3BPcGFjaXR5OiB0cnVlLAogICAgc3Ryb2tlRGFzaGFycmF5OiB0cnVlLAogICAgc3Ryb2tlRGFzaG9mZnNldDogdHJ1ZSwKICAgIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsCiAgICBzdHJva2VPcGFjaXR5OiB0cnVlLAogICAgc3Ryb2tlV2lkdGg6IHRydWUKICB9OwogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggdmVuZG9yLXNwZWNpZmljIHByZWZpeCwgZWc6IFdlYmtpdAogICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvbgogICAqIEByZXR1cm4ge3N0cmluZ30gc3R5bGUgbmFtZSBwcmVmaXhlZCB3aXRoIGBwcmVmaXhgLCBwcm9wZXJseSBjYW1lbENhc2VkLCBlZzoKICAgKiBXZWJraXRUcmFuc2l0aW9uRHVyYXRpb24KICAgKi8KCiAgZnVuY3Rpb24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7CiAgICByZXR1cm4gcHJlZml4ICsga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cmluZygxKTsKICB9CiAgLyoqCiAgICogU3VwcG9ydCBzdHlsZSBuYW1lcyB0aGF0IG1heSBjb21lIHBhc3NlZCBpbiBwcmVmaXhlZCBieSBhZGRpbmcgcGVybXV0YXRpb25zCiAgICogb2YgdmVuZG9yIHByZWZpeGVzLgogICAqLwoKCiAgdmFyIHByZWZpeGVzID0gWydXZWJraXQnLCAnbXMnLCAnTW96JywgJ08nXTsgLy8gVXNpbmcgT2JqZWN0LmtleXMgaGVyZSwgb3IgZWxzZSB0aGUgdmFuaWxsYSBmb3ItaW4gbG9vcCBtYWtlcyBJRTggZ28gaW50byBhbgogIC8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLgoKICBPYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7CiAgICBwcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHsKICAgICAgaXNVbml0bGVzc051bWJlcltwcmVmaXhLZXkocHJlZml4LCBwcm9wKV0gPSBpc1VuaXRsZXNzTnVtYmVyW3Byb3BdOwogICAgfSk7CiAgfSk7CgogIC8qKgogICAqIENvbnZlcnQgYSB2YWx1ZSBpbnRvIHRoZSBwcm9wZXIgY3NzIHdyaXRhYmxlIHZhbHVlLiBUaGUgc3R5bGUgbmFtZSBgbmFtZWAKICAgKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZAogICAqIGluIGBDU1NQcm9wZXJ0eS5pc1VuaXRsZXNzTnVtYmVyYC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBDU1MgcHJvcGVydHkgdmFsdWUgc3VjaCBhcyBgMTBweGAuCiAgICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIHN0eWxlIHZhbHVlIHdpdGggZGltZW5zaW9ucyBhcHBsaWVkLgogICAqLwoKICBmdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KSB7CiAgICAvLyBOb3RlIHRoYXQgd2UndmUgcmVtb3ZlZCBlc2NhcGVUZXh0Rm9yQnJvd3NlcigpIGNhbGxzIGhlcmUgc2luY2UgdGhlCiAgICAvLyB3aG9sZSBzdHJpbmcgd2lsbCBiZSBlc2NhcGVkIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBpbmplY3RlZCBpbnRvCiAgICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0CiAgICAvLyBhcmJpdHJhcnkgQ1NTIHdoaWNoIG1heSBiZSBwcm9ibGVtYXRpYyAoSSBjb3VsZG4ndCByZXBybyB0aGlzKToKICAgIC8vIGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvWFNTX0ZpbHRlcl9FdmFzaW9uX0NoZWF0X1NoZWV0CiAgICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi8KICAgIC8vIFRoaXMgaXMgbm90IGFuIFhTUyBob2xlIGJ1dCBpbnN0ZWFkIGEgcG90ZW50aWFsIENTUyBpbmplY3Rpb24gaXNzdWUKICAgIC8vIHdoaWNoIGhhcyBsZWFkIHRvIGEgZ3JlYXRlciBkaXNjdXNzaW9uIGFib3V0IGhvdyB3ZSdyZSBnb2luZyB0bwogICAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxCiAgICB2YXIgaXNFbXB0eSA9IHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnOwoKICAgIGlmIChpc0VtcHR5KSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCAmJiAhKGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkpIHsKICAgICAgcmV0dXJuIHZhbHVlICsgJ3B4JzsgLy8gUHJlc3VtZXMgaW1wbGljaXQgJ3B4JyBzdWZmaXggZm9yIHVuaXRsZXNzIG51bWJlcnMKICAgIH0KCiAgICB7CiAgICAgIGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7CiAgICB9CgogICAgcmV0dXJuICgnJyArIHZhbHVlKS50cmltKCk7CiAgfQoKICB2YXIgdXBwZXJjYXNlUGF0dGVybiA9IC8oW0EtWl0pL2c7CiAgdmFyIG1zUGF0dGVybiA9IC9ebXMtLzsKICAvKioKICAgKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4YW1wbGU6CiAgICoKICAgKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKQogICAqICAgPCAiYmFja2dyb3VuZC1jb2xvciIKICAgKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJykKICAgKiAgIDwgIi1tb3otdHJhbnNpdGlvbiIKICAgKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKQogICAqICAgPCAiLW1zLXRyYW5zaXRpb24iCiAgICoKICAgKiBBcyBNb2Rlcm5penIgc3VnZ2VzdHMgKGh0dHA6Ly9tb2Rlcm5penIuY29tL2RvY3MvI3ByZWZpeGVkKSwgYW4gYG1zYCBwcmVmaXgKICAgKiBpcyBjb252ZXJ0ZWQgdG8gYC1tcy1gLgogICAqLwoKICBmdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUobmFtZSkgewogICAgcmV0dXJuIG5hbWUucmVwbGFjZSh1cHBlcmNhc2VQYXR0ZXJuLCAnLSQxJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTsKICB9CgogIHZhciB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uICgpIHt9OwoKICB7CiAgICAvLyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxkIGJlIGNhcGl0YWxpemVkCiAgICB2YXIgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vOwogICAgdmFyIG1zUGF0dGVybiQxID0gL14tbXMtLzsKICAgIHZhciBoeXBoZW5QYXR0ZXJuID0gLy0oLikvZzsgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uCgogICAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiA9IC87XHMqJC87CiAgICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9OwogICAgdmFyIHdhcm5lZFN0eWxlVmFsdWVzID0ge307CiAgICB2YXIgd2FybmVkRm9yTmFOVmFsdWUgPSBmYWxzZTsKICAgIHZhciB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gZmFsc2U7CgogICAgdmFyIGNhbWVsaXplID0gZnVuY3Rpb24gKHN0cmluZykgewogICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoaHlwaGVuUGF0dGVybiwgZnVuY3Rpb24gKF8sIGNoYXJhY3RlcikgewogICAgICAgIHJldHVybiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKTsKICAgICAgfSk7CiAgICB9OwoKICAgIHZhciB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlOwoKICAgICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JywgbmFtZSwgLy8gQXMgQW5kaSBTbWl0aCBzdWdnZXN0cwogICAgICAvLyAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cvMjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4CiAgICAgIC8vIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYG1zYC4KICAgICAgY2FtZWxpemUobmFtZS5yZXBsYWNlKG1zUGF0dGVybiQxLCAnbXMtJykpKTsKICAgIH07CgogICAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlOwoKICAgICAgZXJyb3IoJ1Vuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPycsIG5hbWUsIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpKTsKICAgIH07CgogICAgdmFyIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICBpZiAod2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmIHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTsKCiAgICAgIGVycm9yKCJTdHlsZSBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb24uICIgKyAnVHJ5ICIlczogJXMiIGluc3RlYWQuJywgbmFtZSwgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sICcnKSk7CiAgICB9OwoKICAgIHZhciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CiAgICAgIGlmICh3YXJuZWRGb3JOYU5WYWx1ZSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlOwoKICAgICAgZXJyb3IoJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTsKICAgIH07CgogICAgdmFyIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICBpZiAod2FybmVkRm9ySW5maW5pdHlWYWx1ZSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgd2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9IHRydWU7CgogICAgICBlcnJvcignYEluZmluaXR5YCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuJywgbmFtZSk7CiAgICB9OwoKICAgIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CiAgICAgIGlmIChuYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7CiAgICAgICAgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUobmFtZSk7CiAgICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHsKICAgICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSk7CiAgICAgIH0gZWxzZSBpZiAoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLnRlc3QodmFsdWUpKSB7CiAgICAgICAgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uKG5hbWUsIHZhbHVlKTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHsKICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7CiAgICAgICAgICB3YXJuU3R5bGVWYWx1ZUlzTmFOKG5hbWUsIHZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHsKICAgICAgICAgIHdhcm5TdHlsZVZhbHVlSXNJbmZpbml0eShuYW1lLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogIH0KCiAgdmFyIHdhcm5WYWxpZFN0eWxlJDEgPSB3YXJuVmFsaWRTdHlsZTsKCiAgLyoqCiAgICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLgogICAqLwoKICAvKioKICAgKiBUaGlzIGNyZWF0ZXMgYSBzdHJpbmcgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBlcXVpdmFsZW50IHRvIHRoZSBzdHlsZQogICAqIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgYnkgc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBJdCBieS1wYXNzZXMgd2FybmluZ3MgYW5kCiAgICogc2VjdXJpdHkgY2hlY2tzIHNvIGl0J3Mgbm90IHNhZmUgdG8gdXNlIHRoaXMgdmFsdWUgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4KICAgKiBjb21wYXJpc29uLiBJdCBpcyBvbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi4KICAgKi8KCiAgZnVuY3Rpb24gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKHN0eWxlcykgewogICAgewogICAgICB2YXIgc2VyaWFsaXplZCA9ICcnOwogICAgICB2YXIgZGVsaW1pdGVyID0gJyc7CgogICAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7CiAgICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdOwoKICAgICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICB2YXIgaXNDdXN0b21Qcm9wZXJ0eSA9IHN0eWxlTmFtZS5pbmRleE9mKCctLScpID09PSAwOwogICAgICAgICAgc2VyaWFsaXplZCArPSBkZWxpbWl0ZXIgKyAoaXNDdXN0b21Qcm9wZXJ0eSA/IHN0eWxlTmFtZSA6IGh5cGhlbmF0ZVN0eWxlTmFtZShzdHlsZU5hbWUpKSArICc6JzsKICAgICAgICAgIHNlcmlhbGl6ZWQgKz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpOwogICAgICAgICAgZGVsaW1pdGVyID0gJzsnOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDsKICAgIH0KICB9CiAgLyoqCiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIG11bHRpcGxlIHN0eWxlcyBvbiBhIG5vZGUuICBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBhcwogICAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LgogICAqCiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlCiAgICogQHBhcmFtIHtvYmplY3R9IHN0eWxlcwogICAqLwoKICBmdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMpIHsKICAgIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7CgogICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykgewogICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7CgogICAgICB7CiAgICAgICAgaWYgKCFpc0N1c3RvbVByb3BlcnR5KSB7CiAgICAgICAgICB3YXJuVmFsaWRTdHlsZSQxKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIHN0eWxlVmFsdWUgPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0sIGlzQ3VzdG9tUHJvcGVydHkpOwoKICAgICAgaWYgKHN0eWxlTmFtZSA9PT0gJ2Zsb2F0JykgewogICAgICAgIHN0eWxlTmFtZSA9ICdjc3NGbG9hdCc7CiAgICAgIH0KCiAgICAgIGlmIChpc0N1c3RvbVByb3BlcnR5KSB7CiAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVOYW1lLCBzdHlsZVZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHlsZVtzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNWYWx1ZUVtcHR5KHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7CiAgfQogIC8qKgogICAqIEdpdmVuIHtjb2xvcjogJ3JlZCcsIG92ZXJmbG93OiAnaGlkZGVuJ30gcmV0dXJucyB7CiAgICogICBjb2xvcjogJ2NvbG9yJywKICAgKiAgIG92ZXJmbG93WDogJ292ZXJmbG93JywKICAgKiAgIG92ZXJmbG93WTogJ292ZXJmbG93JywKICAgKiB9LiBUaGlzIGNhbiBiZSByZWFkIGFzICJ0aGUgb3ZlcmZsb3dZIHByb3BlcnR5IHdhcyBzZXQgYnkgdGhlIG92ZXJmbG93CiAgICogc2hvcnRoYW5kIi4gVGhhdCBpcywgdGhlIHZhbHVlcyBhcmUgdGhlIHByb3BlcnR5IHRoYXQgZWFjaCB3YXMgZGVyaXZlZCBmcm9tLgogICAqLwoKCiAgZnVuY3Rpb24gZXhwYW5kU2hvcnRoYW5kTWFwKHN0eWxlcykgewogICAgdmFyIGV4cGFuZGVkID0ge307CgogICAgZm9yICh2YXIga2V5IGluIHN0eWxlcykgewogICAgICB2YXIgbG9uZ2hhbmRzID0gc2hvcnRoYW5kVG9Mb25naGFuZFtrZXldIHx8IFtrZXldOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25naGFuZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBleHBhbmRlZFtsb25naGFuZHNbaV1dID0ga2V5OwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGV4cGFuZGVkOwogIH0KICAvKioKICAgKiBXaGVuIG1peGluZyBzaG9ydGhhbmQgYW5kIGxvbmdoYW5kIHByb3BlcnR5IG5hbWVzLCB3ZSB3YXJuIGR1cmluZyB1cGRhdGVzIGlmCiAgICogd2UgZXhwZWN0IGFuIGluY29ycmVjdCByZXN1bHQgdG8gb2NjdXIuIEluIHBhcnRpY3VsYXIsIHdlIHdhcm4gZm9yOgogICAqCiAgICogVXBkYXRpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgb3ZlcndyaXR0ZW4pOgogICAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnYmF6JywgZm9udFZhcmlhbnQ6ICdiYXInfQogICAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICdiYXonCiAgICogUmVtb3ZpbmcgYSBzaG9ydGhhbmQgcHJvcGVydHkgKGxvbmdoYW5kIGdldHMgbG9zdCB0b28pOgogICAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250VmFyaWFudDogJ2Jhcid9CiAgICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJycKICAgKiBSZW1vdmluZyBhIGxvbmdoYW5kIHByb3BlcnR5IChzaG91bGQgcmV2ZXJ0IHRvIHNob3J0aGFuZDsgZG9lc24ndCk6CiAgICogICB7Zm9udDogJ2ZvbycsIGZvbnRWYXJpYW50OiAnYmFyJ30gLT4ge2ZvbnQ6ICdmb28nfQogICAqICAgYmVjb21lcyAuc3R5bGUuZm9udFZhcmlhbnQgPSAnJwogICAqLwoKCiAgZnVuY3Rpb24gdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFN0eWxlcykgewogICAgewogICAgICBpZiAoIW5leHRTdHlsZXMpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBleHBhbmRlZFVwZGF0ZXMgPSBleHBhbmRTaG9ydGhhbmRNYXAoc3R5bGVVcGRhdGVzKTsKICAgICAgdmFyIGV4cGFuZGVkU3R5bGVzID0gZXhwYW5kU2hvcnRoYW5kTWFwKG5leHRTdHlsZXMpOwogICAgICB2YXIgd2FybmVkQWJvdXQgPSB7fTsKCiAgICAgIGZvciAodmFyIGtleSBpbiBleHBhbmRlZFVwZGF0ZXMpIHsKICAgICAgICB2YXIgb3JpZ2luYWxLZXkgPSBleHBhbmRlZFVwZGF0ZXNba2V5XTsKICAgICAgICB2YXIgY29ycmVjdE9yaWdpbmFsS2V5ID0gZXhwYW5kZWRTdHlsZXNba2V5XTsKCiAgICAgICAgaWYgKGNvcnJlY3RPcmlnaW5hbEtleSAmJiBvcmlnaW5hbEtleSAhPT0gY29ycmVjdE9yaWdpbmFsS2V5KSB7CiAgICAgICAgICB2YXIgd2FybmluZ0tleSA9IG9yaWdpbmFsS2V5ICsgJywnICsgY29ycmVjdE9yaWdpbmFsS2V5OwoKICAgICAgICAgIGlmICh3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgICB3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSA9IHRydWU7CgogICAgICAgICAgZXJyb3IoJyVzIGEgc3R5bGUgcHJvcGVydHkgZHVyaW5nIHJlcmVuZGVyICglcykgd2hlbiBhICcgKyAnY29uZmxpY3RpbmcgcHJvcGVydHkgaXMgc2V0ICglcykgY2FuIGxlYWQgdG8gc3R5bGluZyBidWdzLiBUbyAnICsgImF2b2lkIHRoaXMsIGRvbid0IG1peCBzaG9ydGhhbmQgYW5kIG5vbi1zaG9ydGhhbmQgcHJvcGVydGllcyAiICsgJ2ZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggJyArICdzZXBhcmF0ZSB2YWx1ZXMuJywgaXNWYWx1ZUVtcHR5KHN0eWxlVXBkYXRlc1tvcmlnaW5hbEtleV0pID8gJ1JlbW92aW5nJyA6ICdVcGRhdGluZycsIG9yaWdpbmFsS2V5LCBjb3JyZWN0T3JpZ2luYWxLZXkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBzaG91bGQgb21pdCB0aGVpciBjbG9zZSB0YWcuIFdlIGtlZXAgYSBsaXN0IGZvcgogIC8vIHRob3NlIHNwZWNpYWwtY2FzZSB0YWdzLgogIHZhciBvbWl0dGVkQ2xvc2VUYWdzID0gewogICAgYXJlYTogdHJ1ZSwKICAgIGJhc2U6IHRydWUsCiAgICBicjogdHJ1ZSwKICAgIGNvbDogdHJ1ZSwKICAgIGVtYmVkOiB0cnVlLAogICAgaHI6IHRydWUsCiAgICBpbWc6IHRydWUsCiAgICBpbnB1dDogdHJ1ZSwKICAgIGtleWdlbjogdHJ1ZSwKICAgIGxpbms6IHRydWUsCiAgICBtZXRhOiB0cnVlLAogICAgcGFyYW06IHRydWUsCiAgICBzb3VyY2U6IHRydWUsCiAgICB0cmFjazogdHJ1ZSwKICAgIHdicjogdHJ1ZSAvLyBOT1RFOiBtZW51aXRlbSdzIGNsb3NlIHRhZyBzaG91bGQgYmUgb21pdHRlZCwgYnV0IHRoYXQgY2F1c2VzIHByb2JsZW1zLgoKICB9OwoKICAvLyBgb21pdHRlZENsb3NlVGFnc2AgZXhjZXB0IHRoYXQgYG1lbnVpdGVtYCBzaG91bGQgc3RpbGwgaGF2ZSBpdHMgY2xvc2luZyB0YWcuCgogIHZhciB2b2lkRWxlbWVudFRhZ3MgPSBhc3NpZ24oewogICAgbWVudWl0ZW06IHRydWUKICB9LCBvbWl0dGVkQ2xvc2VUYWdzKTsKCiAgdmFyIEhUTUwgPSAnX19odG1sJzsKCiAgZnVuY3Rpb24gYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKSB7CiAgICBpZiAoIXByb3BzKSB7CiAgICAgIHJldHVybjsKICAgIH0gLy8gTm90ZSB0aGUgdXNlIG9mIGA9PWAgd2hpY2ggY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZC4KCgogICAgaWYgKHZvaWRFbGVtZW50VGFnc1t0YWddKSB7CiAgICAgIGlmIChwcm9wcy5jaGlsZHJlbiAhPSBudWxsIHx8IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGFnICsgIiBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yICIgKyAndXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkgewogICAgICBpZiAocHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7CiAgICAgIH0KCiAgICAgIGlmICh0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT09ICdvYmplY3QnIHx8ICEoSFRNTCBpbiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuICcgKyAnUGxlYXNlIHZpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kYW5nZXJvdXNseS1zZXQtaW5uZXItaHRtbCAnICsgJ2ZvciBtb3JlIGluZm9ybWF0aW9uLicpOwogICAgICB9CiAgICB9CgogICAgewogICAgICBpZiAoIXByb3BzLnN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyAmJiBwcm9wcy5jb250ZW50RWRpdGFibGUgJiYgcHJvcHMuY2hpbGRyZW4gIT0gbnVsbCkgewogICAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3QuIEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgJyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuJyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAocHJvcHMuc3R5bGUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcHMuc3R5bGUgIT09ICdvYmplY3QnKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBzdHlsZWAgcHJvcCBleHBlY3RzIGEgbWFwcGluZyBmcm9tIHN0eWxlIHByb3BlcnRpZXMgdG8gdmFsdWVzLCAnICsgIm5vdCBhIHN0cmluZy4gRm9yIGV4YW1wbGUsIHN0eWxlPXt7bWFyZ2luUmlnaHQ6IHNwYWNpbmcgKyAnZW0nfX0gd2hlbiAiICsgJ3VzaW5nIEpTWC4nKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzQ3VzdG9tQ29tcG9uZW50KHRhZ05hbWUsIHByb3BzKSB7CiAgICBpZiAodGFnTmFtZS5pbmRleE9mKCctJykgPT09IC0xKSB7CiAgICAgIHJldHVybiB0eXBlb2YgcHJvcHMuaXMgPT09ICdzdHJpbmcnOwogICAgfQoKICAgIHN3aXRjaCAodGFnTmFtZSkgewogICAgICAvLyBUaGVzZSBhcmUgcmVzZXJ2ZWQgU1ZHIGFuZCBNYXRoTUwgZWxlbWVudHMuCiAgICAgIC8vIFdlIGRvbid0IG1pbmQgdGhpcyBsaXN0IHRvbyBtdWNoIGJlY2F1c2Ugd2UgZXhwZWN0IGl0IHRvIG5ldmVyIGdyb3cuCiAgICAgIC8vIFRoZSBhbHRlcm5hdGl2ZSBpcyB0byB0cmFjayB0aGUgbmFtZXNwYWNlIGluIGEgZmV3IHBsYWNlcyB3aGljaCBpcyBjb252b2x1dGVkLgogICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3VzdG9tLWVsZW1lbnRzLWNvcmUtY29uY2VwdHMKICAgICAgY2FzZSAnYW5ub3RhdGlvbi14bWwnOgogICAgICBjYXNlICdjb2xvci1wcm9maWxlJzoKICAgICAgY2FzZSAnZm9udC1mYWNlJzoKICAgICAgY2FzZSAnZm9udC1mYWNlLXNyYyc6CiAgICAgIGNhc2UgJ2ZvbnQtZmFjZS11cmknOgogICAgICBjYXNlICdmb250LWZhY2UtZm9ybWF0JzoKICAgICAgY2FzZSAnZm9udC1mYWNlLW5hbWUnOgogICAgICBjYXNlICdtaXNzaW5nLWdseXBoJzoKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGUgSFRNTCBvciBTVkcgYWxsb3dlZCBhdHRyaWJ1dGUgbGlzdCwgYmUgc3VyZSB0bwogIC8vIGFsc28gYWRkIHRoZW0gdG8gdGhpcyBtb2R1bGUgdG8gZW5zdXJlIGNhc2luZyBhbmQgaW5jb3JyZWN0IG5hbWUKICAvLyB3YXJuaW5ncy4KICB2YXIgcG9zc2libGVTdGFuZGFyZE5hbWVzID0gewogICAgLy8gSFRNTAogICAgYWNjZXB0OiAnYWNjZXB0JywKICAgIGFjY2VwdGNoYXJzZXQ6ICdhY2NlcHRDaGFyc2V0JywKICAgICdhY2NlcHQtY2hhcnNldCc6ICdhY2NlcHRDaGFyc2V0JywKICAgIGFjY2Vzc2tleTogJ2FjY2Vzc0tleScsCiAgICBhY3Rpb246ICdhY3Rpb24nLAogICAgYWxsb3dmdWxsc2NyZWVuOiAnYWxsb3dGdWxsU2NyZWVuJywKICAgIGFsdDogJ2FsdCcsCiAgICBhczogJ2FzJywKICAgIGFzeW5jOiAnYXN5bmMnLAogICAgYXV0b2NhcGl0YWxpemU6ICdhdXRvQ2FwaXRhbGl6ZScsCiAgICBhdXRvY29tcGxldGU6ICdhdXRvQ29tcGxldGUnLAogICAgYXV0b2NvcnJlY3Q6ICdhdXRvQ29ycmVjdCcsCiAgICBhdXRvZm9jdXM6ICdhdXRvRm9jdXMnLAogICAgYXV0b3BsYXk6ICdhdXRvUGxheScsCiAgICBhdXRvc2F2ZTogJ2F1dG9TYXZlJywKICAgIGNhcHR1cmU6ICdjYXB0dXJlJywKICAgIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLAogICAgY2VsbHNwYWNpbmc6ICdjZWxsU3BhY2luZycsCiAgICBjaGFsbGVuZ2U6ICdjaGFsbGVuZ2UnLAogICAgY2hhcnNldDogJ2NoYXJTZXQnLAogICAgY2hlY2tlZDogJ2NoZWNrZWQnLAogICAgY2hpbGRyZW46ICdjaGlsZHJlbicsCiAgICBjaXRlOiAnY2l0ZScsCiAgICBjbGFzczogJ2NsYXNzTmFtZScsCiAgICBjbGFzc2lkOiAnY2xhc3NJRCcsCiAgICBjbGFzc25hbWU6ICdjbGFzc05hbWUnLAogICAgY29sczogJ2NvbHMnLAogICAgY29sc3BhbjogJ2NvbFNwYW4nLAogICAgY29udGVudDogJ2NvbnRlbnQnLAogICAgY29udGVudGVkaXRhYmxlOiAnY29udGVudEVkaXRhYmxlJywKICAgIGNvbnRleHRtZW51OiAnY29udGV4dE1lbnUnLAogICAgY29udHJvbHM6ICdjb250cm9scycsCiAgICBjb250cm9sc2xpc3Q6ICdjb250cm9sc0xpc3QnLAogICAgY29vcmRzOiAnY29vcmRzJywKICAgIGNyb3Nzb3JpZ2luOiAnY3Jvc3NPcmlnaW4nLAogICAgZGFuZ2Vyb3VzbHlzZXRpbm5lcmh0bWw6ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcsCiAgICBkYXRhOiAnZGF0YScsCiAgICBkYXRldGltZTogJ2RhdGVUaW1lJywKICAgIGRlZmF1bHQ6ICdkZWZhdWx0JywKICAgIGRlZmF1bHRjaGVja2VkOiAnZGVmYXVsdENoZWNrZWQnLAogICAgZGVmYXVsdHZhbHVlOiAnZGVmYXVsdFZhbHVlJywKICAgIGRlZmVyOiAnZGVmZXInLAogICAgZGlyOiAnZGlyJywKICAgIGRpc2FibGVkOiAnZGlzYWJsZWQnLAogICAgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmU6ICdkaXNhYmxlUGljdHVyZUluUGljdHVyZScsCiAgICBkaXNhYmxlcmVtb3RlcGxheWJhY2s6ICdkaXNhYmxlUmVtb3RlUGxheWJhY2snLAogICAgZG93bmxvYWQ6ICdkb3dubG9hZCcsCiAgICBkcmFnZ2FibGU6ICdkcmFnZ2FibGUnLAogICAgZW5jdHlwZTogJ2VuY1R5cGUnLAogICAgZW50ZXJrZXloaW50OiAnZW50ZXJLZXlIaW50JywKICAgIGZvcjogJ2h0bWxGb3InLAogICAgZm9ybTogJ2Zvcm0nLAogICAgZm9ybW1ldGhvZDogJ2Zvcm1NZXRob2QnLAogICAgZm9ybWFjdGlvbjogJ2Zvcm1BY3Rpb24nLAogICAgZm9ybWVuY3R5cGU6ICdmb3JtRW5jVHlwZScsCiAgICBmb3Jtbm92YWxpZGF0ZTogJ2Zvcm1Ob1ZhbGlkYXRlJywKICAgIGZvcm10YXJnZXQ6ICdmb3JtVGFyZ2V0JywKICAgIGZyYW1lYm9yZGVyOiAnZnJhbWVCb3JkZXInLAogICAgaGVhZGVyczogJ2hlYWRlcnMnLAogICAgaGVpZ2h0OiAnaGVpZ2h0JywKICAgIGhpZGRlbjogJ2hpZGRlbicsCiAgICBoaWdoOiAnaGlnaCcsCiAgICBocmVmOiAnaHJlZicsCiAgICBocmVmbGFuZzogJ2hyZWZMYW5nJywKICAgIGh0bWxmb3I6ICdodG1sRm9yJywKICAgIGh0dHBlcXVpdjogJ2h0dHBFcXVpdicsCiAgICAnaHR0cC1lcXVpdic6ICdodHRwRXF1aXYnLAogICAgaWNvbjogJ2ljb24nLAogICAgaWQ6ICdpZCcsCiAgICBpbWFnZXNpemVzOiAnaW1hZ2VTaXplcycsCiAgICBpbWFnZXNyY3NldDogJ2ltYWdlU3JjU2V0JywKICAgIGlubmVyaHRtbDogJ2lubmVySFRNTCcsCiAgICBpbnB1dG1vZGU6ICdpbnB1dE1vZGUnLAogICAgaW50ZWdyaXR5OiAnaW50ZWdyaXR5JywKICAgIGlzOiAnaXMnLAogICAgaXRlbWlkOiAnaXRlbUlEJywKICAgIGl0ZW1wcm9wOiAnaXRlbVByb3AnLAogICAgaXRlbXJlZjogJ2l0ZW1SZWYnLAogICAgaXRlbXNjb3BlOiAnaXRlbVNjb3BlJywKICAgIGl0ZW10eXBlOiAnaXRlbVR5cGUnLAogICAga2V5cGFyYW1zOiAna2V5UGFyYW1zJywKICAgIGtleXR5cGU6ICdrZXlUeXBlJywKICAgIGtpbmQ6ICdraW5kJywKICAgIGxhYmVsOiAnbGFiZWwnLAogICAgbGFuZzogJ2xhbmcnLAogICAgbGlzdDogJ2xpc3QnLAogICAgbG9vcDogJ2xvb3AnLAogICAgbG93OiAnbG93JywKICAgIG1hbmlmZXN0OiAnbWFuaWZlc3QnLAogICAgbWFyZ2lud2lkdGg6ICdtYXJnaW5XaWR0aCcsCiAgICBtYXJnaW5oZWlnaHQ6ICdtYXJnaW5IZWlnaHQnLAogICAgbWF4OiAnbWF4JywKICAgIG1heGxlbmd0aDogJ21heExlbmd0aCcsCiAgICBtZWRpYTogJ21lZGlhJywKICAgIG1lZGlhZ3JvdXA6ICdtZWRpYUdyb3VwJywKICAgIG1ldGhvZDogJ21ldGhvZCcsCiAgICBtaW46ICdtaW4nLAogICAgbWlubGVuZ3RoOiAnbWluTGVuZ3RoJywKICAgIG11bHRpcGxlOiAnbXVsdGlwbGUnLAogICAgbXV0ZWQ6ICdtdXRlZCcsCiAgICBuYW1lOiAnbmFtZScsCiAgICBub21vZHVsZTogJ25vTW9kdWxlJywKICAgIG5vbmNlOiAnbm9uY2UnLAogICAgbm92YWxpZGF0ZTogJ25vVmFsaWRhdGUnLAogICAgb3BlbjogJ29wZW4nLAogICAgb3B0aW11bTogJ29wdGltdW0nLAogICAgcGF0dGVybjogJ3BhdHRlcm4nLAogICAgcGxhY2Vob2xkZXI6ICdwbGFjZWhvbGRlcicsCiAgICBwbGF5c2lubGluZTogJ3BsYXlzSW5saW5lJywKICAgIHBvc3RlcjogJ3Bvc3RlcicsCiAgICBwcmVsb2FkOiAncHJlbG9hZCcsCiAgICBwcm9maWxlOiAncHJvZmlsZScsCiAgICByYWRpb2dyb3VwOiAncmFkaW9Hcm91cCcsCiAgICByZWFkb25seTogJ3JlYWRPbmx5JywKICAgIHJlZmVycmVycG9saWN5OiAncmVmZXJyZXJQb2xpY3knLAogICAgcmVsOiAncmVsJywKICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLAogICAgcmV2ZXJzZWQ6ICdyZXZlcnNlZCcsCiAgICByb2xlOiAncm9sZScsCiAgICByb3dzOiAncm93cycsCiAgICByb3dzcGFuOiAncm93U3BhbicsCiAgICBzYW5kYm94OiAnc2FuZGJveCcsCiAgICBzY29wZTogJ3Njb3BlJywKICAgIHNjb3BlZDogJ3Njb3BlZCcsCiAgICBzY3JvbGxpbmc6ICdzY3JvbGxpbmcnLAogICAgc2VhbWxlc3M6ICdzZWFtbGVzcycsCiAgICBzZWxlY3RlZDogJ3NlbGVjdGVkJywKICAgIHNoYXBlOiAnc2hhcGUnLAogICAgc2l6ZTogJ3NpemUnLAogICAgc2l6ZXM6ICdzaXplcycsCiAgICBzcGFuOiAnc3BhbicsCiAgICBzcGVsbGNoZWNrOiAnc3BlbGxDaGVjaycsCiAgICBzcmM6ICdzcmMnLAogICAgc3JjZG9jOiAnc3JjRG9jJywKICAgIHNyY2xhbmc6ICdzcmNMYW5nJywKICAgIHNyY3NldDogJ3NyY1NldCcsCiAgICBzdGFydDogJ3N0YXJ0JywKICAgIHN0ZXA6ICdzdGVwJywKICAgIHN0eWxlOiAnc3R5bGUnLAogICAgc3VtbWFyeTogJ3N1bW1hcnknLAogICAgdGFiaW5kZXg6ICd0YWJJbmRleCcsCiAgICB0YXJnZXQ6ICd0YXJnZXQnLAogICAgdGl0bGU6ICd0aXRsZScsCiAgICB0eXBlOiAndHlwZScsCiAgICB1c2VtYXA6ICd1c2VNYXAnLAogICAgdmFsdWU6ICd2YWx1ZScsCiAgICB3aWR0aDogJ3dpZHRoJywKICAgIHdtb2RlOiAnd21vZGUnLAogICAgd3JhcDogJ3dyYXAnLAogICAgLy8gU1ZHCiAgICBhYm91dDogJ2Fib3V0JywKICAgIGFjY2VudGhlaWdodDogJ2FjY2VudEhlaWdodCcsCiAgICAnYWNjZW50LWhlaWdodCc6ICdhY2NlbnRIZWlnaHQnLAogICAgYWNjdW11bGF0ZTogJ2FjY3VtdWxhdGUnLAogICAgYWRkaXRpdmU6ICdhZGRpdGl2ZScsCiAgICBhbGlnbm1lbnRiYXNlbGluZTogJ2FsaWdubWVudEJhc2VsaW5lJywKICAgICdhbGlnbm1lbnQtYmFzZWxpbmUnOiAnYWxpZ25tZW50QmFzZWxpbmUnLAogICAgYWxsb3dyZW9yZGVyOiAnYWxsb3dSZW9yZGVyJywKICAgIGFscGhhYmV0aWM6ICdhbHBoYWJldGljJywKICAgIGFtcGxpdHVkZTogJ2FtcGxpdHVkZScsCiAgICBhcmFiaWNmb3JtOiAnYXJhYmljRm9ybScsCiAgICAnYXJhYmljLWZvcm0nOiAnYXJhYmljRm9ybScsCiAgICBhc2NlbnQ6ICdhc2NlbnQnLAogICAgYXR0cmlidXRlbmFtZTogJ2F0dHJpYnV0ZU5hbWUnLAogICAgYXR0cmlidXRldHlwZTogJ2F0dHJpYnV0ZVR5cGUnLAogICAgYXV0b3JldmVyc2U6ICdhdXRvUmV2ZXJzZScsCiAgICBhemltdXRoOiAnYXppbXV0aCcsCiAgICBiYXNlZnJlcXVlbmN5OiAnYmFzZUZyZXF1ZW5jeScsCiAgICBiYXNlbGluZXNoaWZ0OiAnYmFzZWxpbmVTaGlmdCcsCiAgICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmVTaGlmdCcsCiAgICBiYXNlcHJvZmlsZTogJ2Jhc2VQcm9maWxlJywKICAgIGJib3g6ICdiYm94JywKICAgIGJlZ2luOiAnYmVnaW4nLAogICAgYmlhczogJ2JpYXMnLAogICAgYnk6ICdieScsCiAgICBjYWxjbW9kZTogJ2NhbGNNb2RlJywKICAgIGNhcGhlaWdodDogJ2NhcEhlaWdodCcsCiAgICAnY2FwLWhlaWdodCc6ICdjYXBIZWlnaHQnLAogICAgY2xpcDogJ2NsaXAnLAogICAgY2xpcHBhdGg6ICdjbGlwUGF0aCcsCiAgICAnY2xpcC1wYXRoJzogJ2NsaXBQYXRoJywKICAgIGNsaXBwYXRodW5pdHM6ICdjbGlwUGF0aFVuaXRzJywKICAgIGNsaXBydWxlOiAnY2xpcFJ1bGUnLAogICAgJ2NsaXAtcnVsZSc6ICdjbGlwUnVsZScsCiAgICBjb2xvcjogJ2NvbG9yJywKICAgIGNvbG9yaW50ZXJwb2xhdGlvbjogJ2NvbG9ySW50ZXJwb2xhdGlvbicsCiAgICAnY29sb3ItaW50ZXJwb2xhdGlvbic6ICdjb2xvckludGVycG9sYXRpb24nLAogICAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLAogICAgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyc6ICdjb2xvckludGVycG9sYXRpb25GaWx0ZXJzJywKICAgIGNvbG9ycHJvZmlsZTogJ2NvbG9yUHJvZmlsZScsCiAgICAnY29sb3ItcHJvZmlsZSc6ICdjb2xvclByb2ZpbGUnLAogICAgY29sb3JyZW5kZXJpbmc6ICdjb2xvclJlbmRlcmluZycsCiAgICAnY29sb3ItcmVuZGVyaW5nJzogJ2NvbG9yUmVuZGVyaW5nJywKICAgIGNvbnRlbnRzY3JpcHR0eXBlOiAnY29udGVudFNjcmlwdFR5cGUnLAogICAgY29udGVudHN0eWxldHlwZTogJ2NvbnRlbnRTdHlsZVR5cGUnLAogICAgY3Vyc29yOiAnY3Vyc29yJywKICAgIGN4OiAnY3gnLAogICAgY3k6ICdjeScsCiAgICBkOiAnZCcsCiAgICBkYXRhdHlwZTogJ2RhdGF0eXBlJywKICAgIGRlY2VsZXJhdGU6ICdkZWNlbGVyYXRlJywKICAgIGRlc2NlbnQ6ICdkZXNjZW50JywKICAgIGRpZmZ1c2Vjb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsCiAgICBkaXJlY3Rpb246ICdkaXJlY3Rpb24nLAogICAgZGlzcGxheTogJ2Rpc3BsYXknLAogICAgZGl2aXNvcjogJ2Rpdmlzb3InLAogICAgZG9taW5hbnRiYXNlbGluZTogJ2RvbWluYW50QmFzZWxpbmUnLAogICAgJ2RvbWluYW50LWJhc2VsaW5lJzogJ2RvbWluYW50QmFzZWxpbmUnLAogICAgZHVyOiAnZHVyJywKICAgIGR4OiAnZHgnLAogICAgZHk6ICdkeScsCiAgICBlZGdlbW9kZTogJ2VkZ2VNb2RlJywKICAgIGVsZXZhdGlvbjogJ2VsZXZhdGlvbicsCiAgICBlbmFibGViYWNrZ3JvdW5kOiAnZW5hYmxlQmFja2dyb3VuZCcsCiAgICAnZW5hYmxlLWJhY2tncm91bmQnOiAnZW5hYmxlQmFja2dyb3VuZCcsCiAgICBlbmQ6ICdlbmQnLAogICAgZXhwb25lbnQ6ICdleHBvbmVudCcsCiAgICBleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsCiAgICBmaWxsOiAnZmlsbCcsCiAgICBmaWxsb3BhY2l0eTogJ2ZpbGxPcGFjaXR5JywKICAgICdmaWxsLW9wYWNpdHknOiAnZmlsbE9wYWNpdHknLAogICAgZmlsbHJ1bGU6ICdmaWxsUnVsZScsCiAgICAnZmlsbC1ydWxlJzogJ2ZpbGxSdWxlJywKICAgIGZpbHRlcjogJ2ZpbHRlcicsCiAgICBmaWx0ZXJyZXM6ICdmaWx0ZXJSZXMnLAogICAgZmlsdGVydW5pdHM6ICdmaWx0ZXJVbml0cycsCiAgICBmbG9vZG9wYWNpdHk6ICdmbG9vZE9wYWNpdHknLAogICAgJ2Zsb29kLW9wYWNpdHknOiAnZmxvb2RPcGFjaXR5JywKICAgIGZsb29kY29sb3I6ICdmbG9vZENvbG9yJywKICAgICdmbG9vZC1jb2xvcic6ICdmbG9vZENvbG9yJywKICAgIGZvY3VzYWJsZTogJ2ZvY3VzYWJsZScsCiAgICBmb250ZmFtaWx5OiAnZm9udEZhbWlseScsCiAgICAnZm9udC1mYW1pbHknOiAnZm9udEZhbWlseScsCiAgICBmb250c2l6ZTogJ2ZvbnRTaXplJywKICAgICdmb250LXNpemUnOiAnZm9udFNpemUnLAogICAgZm9udHNpemVhZGp1c3Q6ICdmb250U2l6ZUFkanVzdCcsCiAgICAnZm9udC1zaXplLWFkanVzdCc6ICdmb250U2l6ZUFkanVzdCcsCiAgICBmb250c3RyZXRjaDogJ2ZvbnRTdHJldGNoJywKICAgICdmb250LXN0cmV0Y2gnOiAnZm9udFN0cmV0Y2gnLAogICAgZm9udHN0eWxlOiAnZm9udFN0eWxlJywKICAgICdmb250LXN0eWxlJzogJ2ZvbnRTdHlsZScsCiAgICBmb250dmFyaWFudDogJ2ZvbnRWYXJpYW50JywKICAgICdmb250LXZhcmlhbnQnOiAnZm9udFZhcmlhbnQnLAogICAgZm9udHdlaWdodDogJ2ZvbnRXZWlnaHQnLAogICAgJ2ZvbnQtd2VpZ2h0JzogJ2ZvbnRXZWlnaHQnLAogICAgZm9ybWF0OiAnZm9ybWF0JywKICAgIGZyb206ICdmcm9tJywKICAgIGZ4OiAnZngnLAogICAgZnk6ICdmeScsCiAgICBnMTogJ2cxJywKICAgIGcyOiAnZzInLAogICAgZ2x5cGhuYW1lOiAnZ2x5cGhOYW1lJywKICAgICdnbHlwaC1uYW1lJzogJ2dseXBoTmFtZScsCiAgICBnbHlwaG9yaWVudGF0aW9uaG9yaXpvbnRhbDogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJywKICAgICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJzogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJywKICAgIGdseXBob3JpZW50YXRpb252ZXJ0aWNhbDogJ2dseXBoT3JpZW50YXRpb25WZXJ0aWNhbCcsCiAgICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJywKICAgIGdseXBocmVmOiAnZ2x5cGhSZWYnLAogICAgZ3JhZGllbnR0cmFuc2Zvcm06ICdncmFkaWVudFRyYW5zZm9ybScsCiAgICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsCiAgICBoYW5naW5nOiAnaGFuZ2luZycsCiAgICBob3JpemFkdng6ICdob3JpekFkdlgnLAogICAgJ2hvcml6LWFkdi14JzogJ2hvcml6QWR2WCcsCiAgICBob3Jpem9yaWdpbng6ICdob3Jpek9yaWdpblgnLAogICAgJ2hvcml6LW9yaWdpbi14JzogJ2hvcml6T3JpZ2luWCcsCiAgICBpZGVvZ3JhcGhpYzogJ2lkZW9ncmFwaGljJywKICAgIGltYWdlcmVuZGVyaW5nOiAnaW1hZ2VSZW5kZXJpbmcnLAogICAgJ2ltYWdlLXJlbmRlcmluZyc6ICdpbWFnZVJlbmRlcmluZycsCiAgICBpbjI6ICdpbjInLAogICAgaW46ICdpbicsCiAgICBpbmxpc3Q6ICdpbmxpc3QnLAogICAgaW50ZXJjZXB0OiAnaW50ZXJjZXB0JywKICAgIGsxOiAnazEnLAogICAgazI6ICdrMicsCiAgICBrMzogJ2szJywKICAgIGs0OiAnazQnLAogICAgazogJ2snLAogICAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JywKICAgIGtlcm5lbHVuaXRsZW5ndGg6ICdrZXJuZWxVbml0TGVuZ3RoJywKICAgIGtlcm5pbmc6ICdrZXJuaW5nJywKICAgIGtleXBvaW50czogJ2tleVBvaW50cycsCiAgICBrZXlzcGxpbmVzOiAna2V5U3BsaW5lcycsCiAgICBrZXl0aW1lczogJ2tleVRpbWVzJywKICAgIGxlbmd0aGFkanVzdDogJ2xlbmd0aEFkanVzdCcsCiAgICBsZXR0ZXJzcGFjaW5nOiAnbGV0dGVyU3BhY2luZycsCiAgICAnbGV0dGVyLXNwYWNpbmcnOiAnbGV0dGVyU3BhY2luZycsCiAgICBsaWdodGluZ2NvbG9yOiAnbGlnaHRpbmdDb2xvcicsCiAgICAnbGlnaHRpbmctY29sb3InOiAnbGlnaHRpbmdDb2xvcicsCiAgICBsaW1pdGluZ2NvbmVhbmdsZTogJ2xpbWl0aW5nQ29uZUFuZ2xlJywKICAgIGxvY2FsOiAnbG9jYWwnLAogICAgbWFya2VyZW5kOiAnbWFya2VyRW5kJywKICAgICdtYXJrZXItZW5kJzogJ21hcmtlckVuZCcsCiAgICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLAogICAgbWFya2VybWlkOiAnbWFya2VyTWlkJywKICAgICdtYXJrZXItbWlkJzogJ21hcmtlck1pZCcsCiAgICBtYXJrZXJzdGFydDogJ21hcmtlclN0YXJ0JywKICAgICdtYXJrZXItc3RhcnQnOiAnbWFya2VyU3RhcnQnLAogICAgbWFya2VydW5pdHM6ICdtYXJrZXJVbml0cycsCiAgICBtYXJrZXJ3aWR0aDogJ21hcmtlcldpZHRoJywKICAgIG1hc2s6ICdtYXNrJywKICAgIG1hc2tjb250ZW50dW5pdHM6ICdtYXNrQ29udGVudFVuaXRzJywKICAgIG1hc2t1bml0czogJ21hc2tVbml0cycsCiAgICBtYXRoZW1hdGljYWw6ICdtYXRoZW1hdGljYWwnLAogICAgbW9kZTogJ21vZGUnLAogICAgbnVtb2N0YXZlczogJ251bU9jdGF2ZXMnLAogICAgb2Zmc2V0OiAnb2Zmc2V0JywKICAgIG9wYWNpdHk6ICdvcGFjaXR5JywKICAgIG9wZXJhdG9yOiAnb3BlcmF0b3InLAogICAgb3JkZXI6ICdvcmRlcicsCiAgICBvcmllbnQ6ICdvcmllbnQnLAogICAgb3JpZW50YXRpb246ICdvcmllbnRhdGlvbicsCiAgICBvcmlnaW46ICdvcmlnaW4nLAogICAgb3ZlcmZsb3c6ICdvdmVyZmxvdycsCiAgICBvdmVybGluZXBvc2l0aW9uOiAnb3ZlcmxpbmVQb3NpdGlvbicsCiAgICAnb3ZlcmxpbmUtcG9zaXRpb24nOiAnb3ZlcmxpbmVQb3NpdGlvbicsCiAgICBvdmVybGluZXRoaWNrbmVzczogJ292ZXJsaW5lVGhpY2tuZXNzJywKICAgICdvdmVybGluZS10aGlja25lc3MnOiAnb3ZlcmxpbmVUaGlja25lc3MnLAogICAgcGFpbnRvcmRlcjogJ3BhaW50T3JkZXInLAogICAgJ3BhaW50LW9yZGVyJzogJ3BhaW50T3JkZXInLAogICAgcGFub3NlMTogJ3Bhbm9zZTEnLAogICAgJ3Bhbm9zZS0xJzogJ3Bhbm9zZTEnLAogICAgcGF0aGxlbmd0aDogJ3BhdGhMZW5ndGgnLAogICAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLAogICAgcGF0dGVybnRyYW5zZm9ybTogJ3BhdHRlcm5UcmFuc2Zvcm0nLAogICAgcGF0dGVybnVuaXRzOiAncGF0dGVyblVuaXRzJywKICAgIHBvaW50ZXJldmVudHM6ICdwb2ludGVyRXZlbnRzJywKICAgICdwb2ludGVyLWV2ZW50cyc6ICdwb2ludGVyRXZlbnRzJywKICAgIHBvaW50czogJ3BvaW50cycsCiAgICBwb2ludHNhdHg6ICdwb2ludHNBdFgnLAogICAgcG9pbnRzYXR5OiAncG9pbnRzQXRZJywKICAgIHBvaW50c2F0ejogJ3BvaW50c0F0WicsCiAgICBwcmVmaXg6ICdwcmVmaXgnLAogICAgcHJlc2VydmVhbHBoYTogJ3ByZXNlcnZlQWxwaGEnLAogICAgcHJlc2VydmVhc3BlY3RyYXRpbzogJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLAogICAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsCiAgICBwcm9wZXJ0eTogJ3Byb3BlcnR5JywKICAgIHI6ICdyJywKICAgIHJhZGl1czogJ3JhZGl1cycsCiAgICByZWZ4OiAncmVmWCcsCiAgICByZWZ5OiAncmVmWScsCiAgICByZW5kZXJpbmdpbnRlbnQ6ICdyZW5kZXJpbmdJbnRlbnQnLAogICAgJ3JlbmRlcmluZy1pbnRlbnQnOiAncmVuZGVyaW5nSW50ZW50JywKICAgIHJlcGVhdGNvdW50OiAncmVwZWF0Q291bnQnLAogICAgcmVwZWF0ZHVyOiAncmVwZWF0RHVyJywKICAgIHJlcXVpcmVkZXh0ZW5zaW9uczogJ3JlcXVpcmVkRXh0ZW5zaW9ucycsCiAgICByZXF1aXJlZGZlYXR1cmVzOiAncmVxdWlyZWRGZWF0dXJlcycsCiAgICByZXNvdXJjZTogJ3Jlc291cmNlJywKICAgIHJlc3RhcnQ6ICdyZXN0YXJ0JywKICAgIHJlc3VsdDogJ3Jlc3VsdCcsCiAgICByZXN1bHRzOiAncmVzdWx0cycsCiAgICByb3RhdGU6ICdyb3RhdGUnLAogICAgcng6ICdyeCcsCiAgICByeTogJ3J5JywKICAgIHNjYWxlOiAnc2NhbGUnLAogICAgc2VjdXJpdHk6ICdzZWN1cml0eScsCiAgICBzZWVkOiAnc2VlZCcsCiAgICBzaGFwZXJlbmRlcmluZzogJ3NoYXBlUmVuZGVyaW5nJywKICAgICdzaGFwZS1yZW5kZXJpbmcnOiAnc2hhcGVSZW5kZXJpbmcnLAogICAgc2xvcGU6ICdzbG9wZScsCiAgICBzcGFjaW5nOiAnc3BhY2luZycsCiAgICBzcGVjdWxhcmNvbnN0YW50OiAnc3BlY3VsYXJDb25zdGFudCcsCiAgICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsCiAgICBzcGVlZDogJ3NwZWVkJywKICAgIHNwcmVhZG1ldGhvZDogJ3NwcmVhZE1ldGhvZCcsCiAgICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JywKICAgIHN0ZGRldmlhdGlvbjogJ3N0ZERldmlhdGlvbicsCiAgICBzdGVtaDogJ3N0ZW1oJywKICAgIHN0ZW12OiAnc3RlbXYnLAogICAgc3RpdGNodGlsZXM6ICdzdGl0Y2hUaWxlcycsCiAgICBzdG9wY29sb3I6ICdzdG9wQ29sb3InLAogICAgJ3N0b3AtY29sb3InOiAnc3RvcENvbG9yJywKICAgIHN0b3BvcGFjaXR5OiAnc3RvcE9wYWNpdHknLAogICAgJ3N0b3Atb3BhY2l0eSc6ICdzdG9wT3BhY2l0eScsCiAgICBzdHJpa2V0aHJvdWdocG9zaXRpb246ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLAogICAgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nOiAnc3RyaWtldGhyb3VnaFBvc2l0aW9uJywKICAgIHN0cmlrZXRocm91Z2h0aGlja25lc3M6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJywKICAgICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyc6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJywKICAgIHN0cmluZzogJ3N0cmluZycsCiAgICBzdHJva2U6ICdzdHJva2UnLAogICAgc3Ryb2tlZGFzaGFycmF5OiAnc3Ryb2tlRGFzaGFycmF5JywKICAgICdzdHJva2UtZGFzaGFycmF5JzogJ3N0cm9rZURhc2hhcnJheScsCiAgICBzdHJva2VkYXNob2Zmc2V0OiAnc3Ryb2tlRGFzaG9mZnNldCcsCiAgICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAnc3Ryb2tlRGFzaG9mZnNldCcsCiAgICBzdHJva2VsaW5lY2FwOiAnc3Ryb2tlTGluZWNhcCcsCiAgICAnc3Ryb2tlLWxpbmVjYXAnOiAnc3Ryb2tlTGluZWNhcCcsCiAgICBzdHJva2VsaW5lam9pbjogJ3N0cm9rZUxpbmVqb2luJywKICAgICdzdHJva2UtbGluZWpvaW4nOiAnc3Ryb2tlTGluZWpvaW4nLAogICAgc3Ryb2tlbWl0ZXJsaW1pdDogJ3N0cm9rZU1pdGVybGltaXQnLAogICAgJ3N0cm9rZS1taXRlcmxpbWl0JzogJ3N0cm9rZU1pdGVybGltaXQnLAogICAgc3Ryb2tld2lkdGg6ICdzdHJva2VXaWR0aCcsCiAgICAnc3Ryb2tlLXdpZHRoJzogJ3N0cm9rZVdpZHRoJywKICAgIHN0cm9rZW9wYWNpdHk6ICdzdHJva2VPcGFjaXR5JywKICAgICdzdHJva2Utb3BhY2l0eSc6ICdzdHJva2VPcGFjaXR5JywKICAgIHN1cHByZXNzY29udGVudGVkaXRhYmxld2FybmluZzogJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZycsCiAgICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLAogICAgc3VyZmFjZXNjYWxlOiAnc3VyZmFjZVNjYWxlJywKICAgIHN5c3RlbWxhbmd1YWdlOiAnc3lzdGVtTGFuZ3VhZ2UnLAogICAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsCiAgICB0YXJnZXR4OiAndGFyZ2V0WCcsCiAgICB0YXJnZXR5OiAndGFyZ2V0WScsCiAgICB0ZXh0YW5jaG9yOiAndGV4dEFuY2hvcicsCiAgICAndGV4dC1hbmNob3InOiAndGV4dEFuY2hvcicsCiAgICB0ZXh0ZGVjb3JhdGlvbjogJ3RleHREZWNvcmF0aW9uJywKICAgICd0ZXh0LWRlY29yYXRpb24nOiAndGV4dERlY29yYXRpb24nLAogICAgdGV4dGxlbmd0aDogJ3RleHRMZW5ndGgnLAogICAgdGV4dHJlbmRlcmluZzogJ3RleHRSZW5kZXJpbmcnLAogICAgJ3RleHQtcmVuZGVyaW5nJzogJ3RleHRSZW5kZXJpbmcnLAogICAgdG86ICd0bycsCiAgICB0cmFuc2Zvcm06ICd0cmFuc2Zvcm0nLAogICAgdHlwZW9mOiAndHlwZW9mJywKICAgIHUxOiAndTEnLAogICAgdTI6ICd1MicsCiAgICB1bmRlcmxpbmVwb3NpdGlvbjogJ3VuZGVybGluZVBvc2l0aW9uJywKICAgICd1bmRlcmxpbmUtcG9zaXRpb24nOiAndW5kZXJsaW5lUG9zaXRpb24nLAogICAgdW5kZXJsaW5ldGhpY2tuZXNzOiAndW5kZXJsaW5lVGhpY2tuZXNzJywKICAgICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogJ3VuZGVybGluZVRoaWNrbmVzcycsCiAgICB1bmljb2RlOiAndW5pY29kZScsCiAgICB1bmljb2RlYmlkaTogJ3VuaWNvZGVCaWRpJywKICAgICd1bmljb2RlLWJpZGknOiAndW5pY29kZUJpZGknLAogICAgdW5pY29kZXJhbmdlOiAndW5pY29kZVJhbmdlJywKICAgICd1bmljb2RlLXJhbmdlJzogJ3VuaWNvZGVSYW5nZScsCiAgICB1bml0c3BlcmVtOiAndW5pdHNQZXJFbScsCiAgICAndW5pdHMtcGVyLWVtJzogJ3VuaXRzUGVyRW0nLAogICAgdW5zZWxlY3RhYmxlOiAndW5zZWxlY3RhYmxlJywKICAgIHZhbHBoYWJldGljOiAndkFscGhhYmV0aWMnLAogICAgJ3YtYWxwaGFiZXRpYyc6ICd2QWxwaGFiZXRpYycsCiAgICB2YWx1ZXM6ICd2YWx1ZXMnLAogICAgdmVjdG9yZWZmZWN0OiAndmVjdG9yRWZmZWN0JywKICAgICd2ZWN0b3ItZWZmZWN0JzogJ3ZlY3RvckVmZmVjdCcsCiAgICB2ZXJzaW9uOiAndmVyc2lvbicsCiAgICB2ZXJ0YWR2eTogJ3ZlcnRBZHZZJywKICAgICd2ZXJ0LWFkdi15JzogJ3ZlcnRBZHZZJywKICAgIHZlcnRvcmlnaW54OiAndmVydE9yaWdpblgnLAogICAgJ3ZlcnQtb3JpZ2luLXgnOiAndmVydE9yaWdpblgnLAogICAgdmVydG9yaWdpbnk6ICd2ZXJ0T3JpZ2luWScsCiAgICAndmVydC1vcmlnaW4teSc6ICd2ZXJ0T3JpZ2luWScsCiAgICB2aGFuZ2luZzogJ3ZIYW5naW5nJywKICAgICd2LWhhbmdpbmcnOiAndkhhbmdpbmcnLAogICAgdmlkZW9ncmFwaGljOiAndklkZW9ncmFwaGljJywKICAgICd2LWlkZW9ncmFwaGljJzogJ3ZJZGVvZ3JhcGhpYycsCiAgICB2aWV3Ym94OiAndmlld0JveCcsCiAgICB2aWV3dGFyZ2V0OiAndmlld1RhcmdldCcsCiAgICB2aXNpYmlsaXR5OiAndmlzaWJpbGl0eScsCiAgICB2bWF0aGVtYXRpY2FsOiAndk1hdGhlbWF0aWNhbCcsCiAgICAndi1tYXRoZW1hdGljYWwnOiAndk1hdGhlbWF0aWNhbCcsCiAgICB2b2NhYjogJ3ZvY2FiJywKICAgIHdpZHRoczogJ3dpZHRocycsCiAgICB3b3Jkc3BhY2luZzogJ3dvcmRTcGFjaW5nJywKICAgICd3b3JkLXNwYWNpbmcnOiAnd29yZFNwYWNpbmcnLAogICAgd3JpdGluZ21vZGU6ICd3cml0aW5nTW9kZScsCiAgICAnd3JpdGluZy1tb2RlJzogJ3dyaXRpbmdNb2RlJywKICAgIHgxOiAneDEnLAogICAgeDI6ICd4MicsCiAgICB4OiAneCcsCiAgICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsCiAgICB4aGVpZ2h0OiAneEhlaWdodCcsCiAgICAneC1oZWlnaHQnOiAneEhlaWdodCcsCiAgICB4bGlua2FjdHVhdGU6ICd4bGlua0FjdHVhdGUnLAogICAgJ3hsaW5rOmFjdHVhdGUnOiAneGxpbmtBY3R1YXRlJywKICAgIHhsaW5rYXJjcm9sZTogJ3hsaW5rQXJjcm9sZScsCiAgICAneGxpbms6YXJjcm9sZSc6ICd4bGlua0FyY3JvbGUnLAogICAgeGxpbmtocmVmOiAneGxpbmtIcmVmJywKICAgICd4bGluazpocmVmJzogJ3hsaW5rSHJlZicsCiAgICB4bGlua3JvbGU6ICd4bGlua1JvbGUnLAogICAgJ3hsaW5rOnJvbGUnOiAneGxpbmtSb2xlJywKICAgIHhsaW5rc2hvdzogJ3hsaW5rU2hvdycsCiAgICAneGxpbms6c2hvdyc6ICd4bGlua1Nob3cnLAogICAgeGxpbmt0aXRsZTogJ3hsaW5rVGl0bGUnLAogICAgJ3hsaW5rOnRpdGxlJzogJ3hsaW5rVGl0bGUnLAogICAgeGxpbmt0eXBlOiAneGxpbmtUeXBlJywKICAgICd4bGluazp0eXBlJzogJ3hsaW5rVHlwZScsCiAgICB4bWxiYXNlOiAneG1sQmFzZScsCiAgICAneG1sOmJhc2UnOiAneG1sQmFzZScsCiAgICB4bWxsYW5nOiAneG1sTGFuZycsCiAgICAneG1sOmxhbmcnOiAneG1sTGFuZycsCiAgICB4bWxuczogJ3htbG5zJywKICAgICd4bWw6c3BhY2UnOiAneG1sU3BhY2UnLAogICAgeG1sbnN4bGluazogJ3htbG5zWGxpbmsnLAogICAgJ3htbG5zOnhsaW5rJzogJ3htbG5zWGxpbmsnLAogICAgeG1sc3BhY2U6ICd4bWxTcGFjZScsCiAgICB5MTogJ3kxJywKICAgIHkyOiAneTInLAogICAgeTogJ3knLAogICAgeWNoYW5uZWxzZWxlY3RvcjogJ3lDaGFubmVsU2VsZWN0b3InLAogICAgejogJ3onLAogICAgem9vbWFuZHBhbjogJ3pvb21BbmRQYW4nCiAgfTsKCiAgdmFyIGFyaWFQcm9wZXJ0aWVzID0gewogICAgJ2FyaWEtY3VycmVudCc6IDAsCiAgICAvLyBzdGF0ZQogICAgJ2FyaWEtZGVzY3JpcHRpb24nOiAwLAogICAgJ2FyaWEtZGV0YWlscyc6IDAsCiAgICAnYXJpYS1kaXNhYmxlZCc6IDAsCiAgICAvLyBzdGF0ZQogICAgJ2FyaWEtaGlkZGVuJzogMCwKICAgIC8vIHN0YXRlCiAgICAnYXJpYS1pbnZhbGlkJzogMCwKICAgIC8vIHN0YXRlCiAgICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLAogICAgJ2FyaWEtbGFiZWwnOiAwLAogICAgJ2FyaWEtcm9sZWRlc2NyaXB0aW9uJzogMCwKICAgIC8vIFdpZGdldCBBdHRyaWJ1dGVzCiAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAwLAogICAgJ2FyaWEtY2hlY2tlZCc6IDAsCiAgICAnYXJpYS1leHBhbmRlZCc6IDAsCiAgICAnYXJpYS1oYXNwb3B1cCc6IDAsCiAgICAnYXJpYS1sZXZlbCc6IDAsCiAgICAnYXJpYS1tb2RhbCc6IDAsCiAgICAnYXJpYS1tdWx0aWxpbmUnOiAwLAogICAgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJzogMCwKICAgICdhcmlhLW9yaWVudGF0aW9uJzogMCwKICAgICdhcmlhLXBsYWNlaG9sZGVyJzogMCwKICAgICdhcmlhLXByZXNzZWQnOiAwLAogICAgJ2FyaWEtcmVhZG9ubHknOiAwLAogICAgJ2FyaWEtcmVxdWlyZWQnOiAwLAogICAgJ2FyaWEtc2VsZWN0ZWQnOiAwLAogICAgJ2FyaWEtc29ydCc6IDAsCiAgICAnYXJpYS12YWx1ZW1heCc6IDAsCiAgICAnYXJpYS12YWx1ZW1pbic6IDAsCiAgICAnYXJpYS12YWx1ZW5vdyc6IDAsCiAgICAnYXJpYS12YWx1ZXRleHQnOiAwLAogICAgLy8gTGl2ZSBSZWdpb24gQXR0cmlidXRlcwogICAgJ2FyaWEtYXRvbWljJzogMCwKICAgICdhcmlhLWJ1c3knOiAwLAogICAgJ2FyaWEtbGl2ZSc6IDAsCiAgICAnYXJpYS1yZWxldmFudCc6IDAsCiAgICAvLyBEcmFnLWFuZC1Ecm9wIEF0dHJpYnV0ZXMKICAgICdhcmlhLWRyb3BlZmZlY3QnOiAwLAogICAgJ2FyaWEtZ3JhYmJlZCc6IDAsCiAgICAvLyBSZWxhdGlvbnNoaXAgQXR0cmlidXRlcwogICAgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCc6IDAsCiAgICAnYXJpYS1jb2xjb3VudCc6IDAsCiAgICAnYXJpYS1jb2xpbmRleCc6IDAsCiAgICAnYXJpYS1jb2xzcGFuJzogMCwKICAgICdhcmlhLWNvbnRyb2xzJzogMCwKICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogMCwKICAgICdhcmlhLWVycm9ybWVzc2FnZSc6IDAsCiAgICAnYXJpYS1mbG93dG8nOiAwLAogICAgJ2FyaWEtbGFiZWxsZWRieSc6IDAsCiAgICAnYXJpYS1vd25zJzogMCwKICAgICdhcmlhLXBvc2luc2V0JzogMCwKICAgICdhcmlhLXJvd2NvdW50JzogMCwKICAgICdhcmlhLXJvd2luZGV4JzogMCwKICAgICdhcmlhLXJvd3NwYW4nOiAwLAogICAgJ2FyaWEtc2V0c2l6ZSc6IDAKICB9OwoKICB2YXIgd2FybmVkUHJvcGVydGllcyA9IHt9OwogIHZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpOwogIHZhciByQVJJQUNhbWVsID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpOwoKICBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KHRhZ05hbWUsIG5hbWUpIHsKICAgIHsKICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwod2FybmVkUHJvcGVydGllcywgbmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICBpZiAockFSSUFDYW1lbC50ZXN0KG5hbWUpKSB7CiAgICAgICAgdmFyIGFyaWFOYW1lID0gJ2FyaWEtJyArIG5hbWUuc2xpY2UoNCkudG9Mb3dlckNhc2UoKTsKICAgICAgICB2YXIgY29ycmVjdE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShhcmlhTmFtZSkgPyBhcmlhTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTQogICAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS4KCiAgICAgICAgaWYgKGNvcnJlY3ROYW1lID09IG51bGwpIHsKICAgICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIEFSSUEgYXR0cmlidXRlcyBmb2xsb3cgdGhlIHBhdHRlcm4gYXJpYS0qIGFuZCBtdXN0IGJlIGxvd2VyY2FzZS4nLCBuYW1lKTsKCiAgICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uCgoKICAgICAgICBpZiAobmFtZSAhPT0gY29ycmVjdE5hbWUpIHsKICAgICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIGNvcnJlY3ROYW1lKTsKCiAgICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHJBUklBLnRlc3QobmFtZSkpIHsKICAgICAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IGxvd2VyQ2FzZWROYW1lIDogbnVsbDsgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NCiAgICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLgoKICAgICAgICBpZiAoc3RhbmRhcmROYW1lID09IG51bGwpIHsKICAgICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uCgoKICAgICAgICBpZiAobmFtZSAhPT0gc3RhbmRhcmROYW1lKSB7CiAgICAgICAgICBlcnJvcignVW5rbm93biBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpOwoKICAgICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcykgewogICAgewogICAgICB2YXIgaW52YWxpZFByb3BzID0gW107CgogICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHsKICAgICAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkodHlwZSwga2V5KTsKCiAgICAgICAgaWYgKCFpc1ZhbGlkKSB7CiAgICAgICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gaW52YWxpZFByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkgewogICAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnOwogICAgICB9KS5qb2luKCcsICcpOwoKICAgICAgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPT09IDEpIHsKICAgICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3AgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1hcmlhLXByb3BzJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpOwogICAgICB9IGVsc2UgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPiAxKSB7CiAgICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWFyaWEtcHJvcHMnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcykgewogICAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpOwogIH0KCiAgdmFyIGRpZFdhcm5WYWx1ZU51bGwgPSBmYWxzZTsKICBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcykgewogICAgewogICAgICBpZiAodHlwZSAhPT0gJ2lucHV0JyAmJiB0eXBlICE9PSAndGV4dGFyZWEnICYmIHR5cGUgIT09ICdzZWxlY3QnKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAocHJvcHMgIT0gbnVsbCAmJiBwcm9wcy52YWx1ZSA9PT0gbnVsbCAmJiAhZGlkV2FyblZhbHVlTnVsbCkgewogICAgICAgIGRpZFdhcm5WYWx1ZU51bGwgPSB0cnVlOwoKICAgICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcgJiYgcHJvcHMubXVsdGlwbGUpIHsKICAgICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgJyArICd0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXJyb3IoJ2B2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gJyArICdDb25zaWRlciB1c2luZyBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCAnICsgJ2ZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZhciB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAoKSB7fTsKCiAgewogICAgdmFyIHdhcm5lZFByb3BlcnRpZXMkMSA9IHt9OwogICAgdmFyIEVWRU5UX05BTUVfUkVHRVggPSAvXm9uLi87CiAgICB2YXIgSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYID0gL15vblteQS1aXS87CiAgICB2YXIgckFSSUEkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpOwogICAgdmFyIHJBUklBQ2FtZWwkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTsKCiAgICB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAodGFnTmFtZSwgbmFtZSwgdmFsdWUsIGV2ZW50UmVnaXN0cnkpIHsKICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwod2FybmVkUHJvcGVydGllcyQxLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0pIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7CiAgICAgICAgZXJyb3IoJ1JlYWN0IHVzZXMgb25Gb2N1cyBhbmQgb25CbHVyIGluc3RlYWQgb2Ygb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0LiAnICsgJ0FsbCBSZWFjdCBldmVudHMgYXJlIG5vcm1hbGl6ZWQgdG8gYnViYmxlLCBzbyBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQgJyArICdhcmUgbm90IG5lZWRlZC9zdXBwb3J0ZWQgYnkgUmVhY3QuJyk7CgogICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gLy8gV2UgY2FuJ3QgcmVseSBvbiB0aGUgZXZlbnQgc3lzdGVtIGJlaW5nIGluamVjdGVkIG9uIHRoZSBzZXJ2ZXIuCgoKICAgICAgaWYgKGV2ZW50UmVnaXN0cnkgIT0gbnVsbCkgewogICAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0gZXZlbnRSZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLAogICAgICAgICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gZXZlbnRSZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOwoKICAgICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gOiBudWxsOwoKICAgICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICBlcnJvcignSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpOwoKICAgICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHsKICAgICAgICAgIGVycm9yKCdVbmtub3duIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gSXQgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpOwoKICAgICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7CiAgICAgICAgLy8gSWYgbm8gZXZlbnQgcGx1Z2lucyBoYXZlIGJlZW4gaW5qZWN0ZWQsIHdlIGFyZSBpbiBhIHNlcnZlciBlbnZpcm9ubWVudC4KICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyCiAgICAgICAgLy8gb3V0IGtub3duIGJhZCBvbmVzIGxpa2UgYG9uY2xpY2tgLiBXZSBjYW4ndCBzdWdnZXN0IGEgc3BlY2lmaWMgcmVwbGFjZW1lbnQgdGhvdWdoLgogICAgICAgIGlmIChJTlZBTElEX0VWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSkgewogICAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiAnICsgJ1JlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLicsIG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSAvLyBMZXQgdGhlIEFSSUEgYXR0cmlidXRlIGhvb2sgdmFsaWRhdGUgQVJJQSBhdHRyaWJ1dGVzCgoKICAgICAgaWYgKHJBUklBJDEudGVzdChuYW1lKSB8fCByQVJJQUNhbWVsJDEudGVzdChuYW1lKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdpbm5lcmh0bWwnKSB7CiAgICAgICAgZXJyb3IoJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTsKCiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnYXJpYScpIHsKICAgICAgICBlcnJvcignVGhlIGBhcmlhYCBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgaW4gUmVhY3QuICcgKyAnUGFzcyBpbmRpdmlkdWFsIGBhcmlhLWAgYXR0cmlidXRlcyBpbnN0ZWFkLicpOwoKICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdpcycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGEgYCVzYCBmb3IgYSBzdHJpbmcgYXR0cmlidXRlIGBpc2AuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgdHlwZW9mIHZhbHVlKTsKCiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsdWUpKSB7CiAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIE5hTiBmb3IgdGhlIGAlc2AgYXR0cmlidXRlLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIG5hbWUpOwoKICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpOwogICAgICB2YXIgaXNSZXNlcnZlZCA9IHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gUkVTRVJWRUQ7IC8vIEtub3duIGF0dHJpYnV0ZXMgc2hvdWxkIG1hdGNoIHRoZSBjYXNpbmcgc3BlY2lmaWVkIGluIHRoZSBwcm9wZXJ0eSBjb25maWcuCgogICAgICBpZiAocG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkgewogICAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdOwoKICAgICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7CiAgICAgICAgICBlcnJvcignSW52YWxpZCBET00gcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgc3RhbmRhcmROYW1lKTsKCiAgICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFpc1Jlc2VydmVkICYmIG5hbWUgIT09IGxvd2VyQ2FzZWROYW1lKSB7CiAgICAgICAgLy8gVW5rbm93biBhdHRyaWJ1dGVzIHNob3VsZCBoYXZlIGxvd2VyY2FzZSBjYXNpbmcgc2luY2UgdGhhdCdzIGhvdyB0aGV5CiAgICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLgogICAgICAgIGVycm9yKCdSZWFjdCBkb2VzIG5vdCByZWNvZ25pemUgdGhlIGAlc2AgcHJvcCBvbiBhIERPTSBlbGVtZW50LiBJZiB5b3UgJyArICdpbnRlbnRpb25hbGx5IHdhbnQgaXQgdG8gYXBwZWFyIGluIHRoZSBET00gYXMgYSBjdXN0b20gJyArICdhdHRyaWJ1dGUsIHNwZWxsIGl0IGFzIGxvd2VyY2FzZSBgJXNgIGluc3RlYWQuICcgKyAnSWYgeW91IGFjY2lkZW50YWxseSBwYXNzZWQgaXQgZnJvbSBhIHBhcmVudCBjb21wb25lbnQsIHJlbW92ZSAnICsgJ2l0IGZyb20gdGhlIERPTSBlbGVtZW50LicsIG5hbWUsIGxvd2VyQ2FzZWROYW1lKTsKCiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkgewogICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgZXJyb3IoJ1JlY2VpdmVkIGAlc2AgZm9yIGEgbm9uLWJvb2xlYW4gYXR0cmlidXRlIGAlc2AuXG5cbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPSIlcyIgb3IgJXM9e3ZhbHVlLnRvU3RyaW5nKCl9LicsIHZhbHVlLCBuYW1lLCBuYW1lLCB2YWx1ZSwgbmFtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxuXG4nICsgJ0lmIHlvdSB3YW50IHRvIHdyaXRlIGl0IHRvIHRoZSBET00sIHBhc3MgYSBzdHJpbmcgaW5zdGVhZDogJyArICclcz0iJXMiIG9yICVzPXt2YWx1ZS50b1N0cmluZygpfS5cblxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUsIG5hbWUsIG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGUKICAgICAgLy8gZGF0YSB0eXBlcyBmb3IgcmVzZXJ2ZWQgcHJvcHMKCgogICAgICBpZiAoaXNSZXNlcnZlZCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IC8vIFdhcm4gd2hlbiBhIGtub3duIGF0dHJpYnV0ZSBpcyBhIGJhZCB0eXBlCgoKICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkgewogICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IC8vIFdhcm4gd2hlbiBwYXNzaW5nIHRoZSBzdHJpbmdzICdmYWxzZScgb3IgJ3RydWUnIGludG8gYSBib29sZWFuIHByb3AKCgogICAgICBpZiAoKHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZScpICYmIHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikgewogICAgICAgIGVycm9yKCdSZWNlaXZlZCB0aGUgc3RyaW5nIGAlc2AgZm9yIHRoZSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiAnICsgJyVzICcgKyAnRGlkIHlvdSBtZWFuICVzPXslc30/JywgdmFsdWUsIG5hbWUsIHZhbHVlID09PSAnZmFsc2UnID8gJ1RoZSBicm93c2VyIHdpbGwgaW50ZXJwcmV0IGl0IGFzIGEgdHJ1dGh5IHZhbHVlLicgOiAnQWx0aG91Z2ggdGhpcyB3b3JrcywgaXQgd2lsbCBub3Qgd29yayBhcyBleHBlY3RlZCBpZiB5b3UgcGFzcyB0aGUgc3RyaW5nICJmYWxzZSIuJywgbmFtZSwgdmFsdWUpOwoKICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CiAgfQoKICB2YXIgd2FyblVua25vd25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7CiAgICB7CiAgICAgIHZhciB1bmtub3duUHJvcHMgPSBbXTsKCiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykgewogICAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSQxKHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSk7CgogICAgICAgIGlmICghaXNWYWxpZCkgewogICAgICAgICAgdW5rbm93blByb3BzLnB1c2goa2V5KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHsKICAgICAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJzsKICAgICAgfSkuam9pbignLCAnKTsKCiAgICAgIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHByb3AgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgaXQgZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIGl0IGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTsKICAgICAgfSBlbHNlIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID4gMSkgewogICAgICAgIGVycm9yKCdJbnZhbGlkIHZhbHVlcyBmb3IgcHJvcHMgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgdGhlbSBmcm9tIHRoZSBlbGVtZW50LCAnICsgJ29yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgdGhlbSBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciAnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7CiAgICAgIH0KICAgIH0KICB9OwoKICBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSkgewogICAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgd2FyblVua25vd25Qcm9wZXJ0aWVzKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KTsKICB9CgogIHZhciBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSA9IDE7CiAgdmFyIElTX05PTl9ERUxFR0FURUQgPSAxIDw8IDE7CiAgdmFyIElTX0NBUFRVUkVfUEhBU0UgPSAxIDw8IDI7CiAgLy8gc2V0IHRvIExFR0FDWV9GQl9TVVBQT1JULiBMRUdBQ1lfRkJfU1VQUE9SVCBvbmx5IGdldHMgc2V0IHdoZW4KICAvLyB3ZSBjYWxsIHdpbGxEZWZlckxhdGVyRm9yTGVnYWN5RkJTdXBwb3J0LCB0aHVzIG5vdCBiYWlsaW5nIG91dAogIC8vIHdpbGwgcmVzdWx0IGluIGVuZGxlc3MgY3ljbGVzIGxpa2UgYW4gaW5maW5pdGUgbG9vcC4KICAvLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gZGVmZXIgZHVyaW5nIGV2ZW50IHJlcGxheWluZy4KCiAgdmFyIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TID0gSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgfCBJU19OT05fREVMRUdBVEVEIHwgSVNfQ0FQVFVSRV9QSEFTRTsKCiAgLy8gVGhpcyBleGlzdHMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIFJlYWN0RE9NRXZlbnRSZXBsYXlpbmcKICAvLyBhbmQgRE9NUGx1Z2luRXZlbnRTeXN0ZW0uCiAgdmFyIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7CiAgZnVuY3Rpb24gc2V0UmVwbGF5aW5nRXZlbnQoZXZlbnQpIHsKICAgIHsKICAgICAgaWYgKGN1cnJlbnRSZXBsYXlpbmdFdmVudCAhPT0gbnVsbCkgewogICAgICAgIGVycm9yKCdFeHBlY3RlZCBjdXJyZW50bHkgcmVwbGF5aW5nIGV2ZW50IHRvIGJlIG51bGwuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTsKICAgICAgfQogICAgfQoKICAgIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IGV2ZW50OwogIH0KICBmdW5jdGlvbiByZXNldFJlcGxheWluZ0V2ZW50KCkgewogICAgewogICAgICBpZiAoY3VycmVudFJlcGxheWluZ0V2ZW50ID09PSBudWxsKSB7CiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gbm90IGJlIG51bGwuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTsKICAgICAgfQogICAgfQoKICAgIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IG51bGw7CiAgfQogIGZ1bmN0aW9uIGlzUmVwbGF5aW5nRXZlbnQoZXZlbnQpIHsKICAgIHJldHVybiBldmVudCA9PT0gY3VycmVudFJlcGxheWluZ0V2ZW50OwogIH0KCiAgLyoqCiAgICogR2V0cyB0aGUgdGFyZ2V0IG5vZGUgZnJvbSBhIG5hdGl2ZSBicm93c2VyIGV2ZW50IGJ5IGFjY291bnRpbmcgZm9yCiAgICogaW5jb25zaXN0ZW5jaWVzIGluIGJyb3dzZXIgRE9NIEFQSXMuCiAgICoKICAgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuCiAgICogQHJldHVybiB7RE9NRXZlbnRUYXJnZXR9IFRhcmdldCBub2RlLgogICAqLwoKICBmdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkgewogICAgLy8gRmFsbGJhY2sgdG8gbmF0aXZlRXZlbnQuc3JjRWxlbWVudCBmb3IgSUU5CiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyNTA2CiAgICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93OyAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzCgogICAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkgewogICAgICB0YXJnZXQgPSB0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQ7CiAgICB9IC8vIFNhZmFyaSBtYXkgZmlyZSBldmVudHMgb24gdGV4dCBub2RlcyAoTm9kZS5URVhUX05PREUgaXMgMykuCiAgICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbAoKCiAgICByZXR1cm4gdGFyZ2V0Lm5vZGVUeXBlID09PSBURVhUX05PREUgPyB0YXJnZXQucGFyZW50Tm9kZSA6IHRhcmdldDsKICB9CgogIHZhciByZXN0b3JlSW1wbCA9IG51bGw7CiAgdmFyIHJlc3RvcmVUYXJnZXQgPSBudWxsOwogIHZhciByZXN0b3JlUXVldWUgPSBudWxsOwoKICBmdW5jdGlvbiByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpIHsKICAgIC8vIFdlIHBlcmZvcm0gdGhpcyB0cmFuc2xhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBsb29wIHNvIHRoYXQgd2UKICAgIC8vIGFsd2F5cyByZWNlaXZlIHRoZSBjb3JyZWN0IGZpYmVyIGhlcmUKICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXQpOwoKICAgIGlmICghaW50ZXJuYWxJbnN0YW5jZSkgewogICAgICAvLyBVbm1vdW50ZWQKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh0eXBlb2YgcmVzdG9yZUltcGwgIT09ICdmdW5jdGlvbicpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oKSBuZWVkcyB0byBiZSBjYWxsZWQgdG8gaGFuZGxlIGEgdGFyZ2V0IGZvciBjb250cm9sbGVkICcgKyAnZXZlbnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgfQoKICAgIHZhciBzdGF0ZU5vZGUgPSBpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZTsgLy8gR3VhcmQgYWdhaW5zdCBGaWJlciBiZWluZyB1bm1vdW50ZWQuCgogICAgaWYgKHN0YXRlTm9kZSkgewogICAgICB2YXIgX3Byb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpOwoKICAgICAgcmVzdG9yZUltcGwoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUsIGludGVybmFsSW5zdGFuY2UudHlwZSwgX3Byb3BzKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihpbXBsKSB7CiAgICByZXN0b3JlSW1wbCA9IGltcGw7CiAgfQogIGZ1bmN0aW9uIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KSB7CiAgICBpZiAocmVzdG9yZVRhcmdldCkgewogICAgICBpZiAocmVzdG9yZVF1ZXVlKSB7CiAgICAgICAgcmVzdG9yZVF1ZXVlLnB1c2godGFyZ2V0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN0b3JlUXVldWUgPSBbdGFyZ2V0XTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmVzdG9yZVRhcmdldCA9IHRhcmdldDsKICAgIH0KICB9CiAgZnVuY3Rpb24gbmVlZHNTdGF0ZVJlc3RvcmUoKSB7CiAgICByZXR1cm4gcmVzdG9yZVRhcmdldCAhPT0gbnVsbCB8fCByZXN0b3JlUXVldWUgIT09IG51bGw7CiAgfQogIGZ1bmN0aW9uIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCkgewogICAgaWYgKCFyZXN0b3JlVGFyZ2V0KSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgdGFyZ2V0ID0gcmVzdG9yZVRhcmdldDsKICAgIHZhciBxdWV1ZWRUYXJnZXRzID0gcmVzdG9yZVF1ZXVlOwogICAgcmVzdG9yZVRhcmdldCA9IG51bGw7CiAgICByZXN0b3JlUXVldWUgPSBudWxsOwogICAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KTsKCiAgICBpZiAocXVldWVkVGFyZ2V0cykgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHsKICAgICAgICByZXN0b3JlU3RhdGVPZlRhcmdldChxdWV1ZWRUYXJnZXRzW2ldKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gdGhlIHJlbmRlcmVyLiBTdWNoIGFzIHdoZW4gd2UncmUgZGlzcGF0Y2hpbmcgZXZlbnRzIG9yIGlmIHRoaXJkIHBhcnR5CiAgLy8gbGlicmFyaWVzIG5lZWQgdG8gY2FsbCBiYXRjaGVkVXBkYXRlcy4gRXZlbnR1YWxseSwgdGhpcyBBUEkgd2lsbCBnbyBhd2F5IHdoZW4KICAvLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZgogIC8vIHNjaGVkdWxlZCB3b3JrIGFuZCBpbnN0ZWFkIGRvIHN5bmNocm9ub3VzIHdvcmsuCiAgLy8gRGVmYXVsdHMKCiAgdmFyIGJhdGNoZWRVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYm9va2tlZXBpbmcpIHsKICAgIHJldHVybiBmbihib29ra2VlcGluZyk7CiAgfTsKCiAgdmFyIGZsdXNoU3luY0ltcGwgPSBmdW5jdGlvbiAoKSB7fTsKCiAgdmFyIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7CgogIGZ1bmN0aW9uIGZpbmlzaEV2ZW50SGFuZGxlcigpIHsKICAgIC8vIEhlcmUgd2Ugd2FpdCB1bnRpbCBhbGwgdXBkYXRlcyBoYXZlIHByb3BhZ2F0ZWQsIHdoaWNoIGlzIGltcG9ydGFudAogICAgLy8gd2hlbiB1c2luZyBjb250cm9sbGVkIGNvbXBvbmVudHMgd2l0aGluIGxheWVyczoKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OAogICAgLy8gVGhlbiB3ZSByZXN0b3JlIHN0YXRlIG9mIGFueSBjb250cm9sbGVkIGNvbXBvbmVudC4KICAgIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7CgogICAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7CiAgICAgIC8vIElmIGEgY29udHJvbGxlZCBldmVudCB3YXMgZmlyZWQsIHdlIG1heSBuZWVkIHRvIHJlc3RvcmUgdGhlIHN0YXRlIG9mCiAgICAgIC8vIHRoZSBET00gbm9kZSBiYWNrIHRvIHRoZSBjb250cm9sbGVkIHZhbHVlLiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuIFJlYWN0CiAgICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS4KICAgICAgLy8gVE9ETzogUmVzdG9yZSBzdGF0ZSBpbiB0aGUgbWljcm90YXNrLCBhZnRlciB0aGUgZGlzY3JldGUgdXBkYXRlcyBmbHVzaCwKICAgICAgLy8gaW5zdGVhZCBvZiBlYXJseSBmbHVzaGluZyB0aGVtIGhlcmUuCiAgICAgIGZsdXNoU3luY0ltcGwoKTsKICAgICAgcmVzdG9yZVN0YXRlSWZOZWVkZWQoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBhLCBiKSB7CiAgICBpZiAoaXNJbnNpZGVFdmVudEhhbmRsZXIpIHsKICAgICAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBpbnNpZGUgYW5vdGhlciBiYXRjaCwgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0CiAgICAgIC8vIGZ1bGx5IGNvbXBsZXRlcyBiZWZvcmUgcmVzdG9yaW5nIHN0YXRlLgogICAgICByZXR1cm4gZm4oYSwgYik7CiAgICB9CgogICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSB0cnVlOwoKICAgIHRyeSB7CiAgICAgIHJldHVybiBiYXRjaGVkVXBkYXRlc0ltcGwoZm4sIGEsIGIpOwogICAgfSBmaW5hbGx5IHsKICAgICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBmYWxzZTsKICAgICAgZmluaXNoRXZlbnRIYW5kbGVyKCk7CiAgICB9CiAgfSAvLyBUT0RPOiBSZXBsYWNlIHdpdGggZmx1c2hTeW5jCiAgZnVuY3Rpb24gc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihfYmF0Y2hlZFVwZGF0ZXNJbXBsLCBfZGlzY3JldGVVcGRhdGVzSW1wbCwgX2ZsdXNoU3luY0ltcGwpIHsKICAgIGJhdGNoZWRVcGRhdGVzSW1wbCA9IF9iYXRjaGVkVXBkYXRlc0ltcGw7CiAgICBmbHVzaFN5bmNJbXBsID0gX2ZsdXNoU3luY0ltcGw7CiAgfQoKICBmdW5jdGlvbiBpc0ludGVyYWN0aXZlKHRhZykgewogICAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnOwogIH0KCiAgZnVuY3Rpb24gc2hvdWxkUHJldmVudE1vdXNlRXZlbnQobmFtZSwgdHlwZSwgcHJvcHMpIHsKICAgIHN3aXRjaCAobmFtZSkgewogICAgICBjYXNlICdvbkNsaWNrJzoKICAgICAgY2FzZSAnb25DbGlja0NhcHR1cmUnOgogICAgICBjYXNlICdvbkRvdWJsZUNsaWNrJzoKICAgICAgY2FzZSAnb25Eb3VibGVDbGlja0NhcHR1cmUnOgogICAgICBjYXNlICdvbk1vdXNlRG93bic6CiAgICAgIGNhc2UgJ29uTW91c2VEb3duQ2FwdHVyZSc6CiAgICAgIGNhc2UgJ29uTW91c2VNb3ZlJzoKICAgICAgY2FzZSAnb25Nb3VzZU1vdmVDYXB0dXJlJzoKICAgICAgY2FzZSAnb25Nb3VzZVVwJzoKICAgICAgY2FzZSAnb25Nb3VzZVVwQ2FwdHVyZSc6CiAgICAgIGNhc2UgJ29uTW91c2VFbnRlcic6CiAgICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpOwoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIC8qKgogICAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLgogICAqIEByZXR1cm4gez9mdW5jdGlvbn0gVGhlIHN0b3JlZCBjYWxsYmFjay4KICAgKi8KCgogIGZ1bmN0aW9uIGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHsKICAgIHZhciBzdGF0ZU5vZGUgPSBpbnN0LnN0YXRlTm9kZTsKCiAgICBpZiAoc3RhdGVOb2RlID09PSBudWxsKSB7CiAgICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MgKGV4OiBvbmxvYWQgZXZlbnRzIGluIGluY3JlbWVudGFsIG1vZGUpLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICB2YXIgcHJvcHMgPSBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKHN0YXRlTm9kZSk7CgogICAgaWYgKHByb3BzID09PSBudWxsKSB7CiAgICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MuCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHZhciBsaXN0ZW5lciA9IHByb3BzW3JlZ2lzdHJhdGlvbk5hbWVdOwoKICAgIGlmIChzaG91bGRQcmV2ZW50TW91c2VFdmVudChyZWdpc3RyYXRpb25OYW1lLCBpbnN0LnR5cGUsIHByb3BzKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAobGlzdGVuZXIgJiYgdHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgYCIgKyByZWdpc3RyYXRpb25OYW1lICsgImAgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgIiArIHR5cGVvZiBsaXN0ZW5lciArICJgIHR5cGUuIik7CiAgICB9CgogICAgcmV0dXJuIGxpc3RlbmVyOwogIH0KCiAgdmFyIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gZmFsc2U7IC8vIENoZWNrIGlmIGJyb3dzZXIgc3VwcG9ydCBldmVudHMgd2l0aCBwYXNzaXZlIGxpc3RlbmVycwogIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9hZGRFdmVudExpc3RlbmVyI1NhZmVseV9kZXRlY3Rpbmdfb3B0aW9uX3N1cHBvcnQKCiAgaWYgKGNhblVzZURPTSkgewogICAgdHJ5IHsKICAgICAgdmFyIG9wdGlvbnMgPSB7fTsgLy8gJEZsb3dGaXhNZTogSWdub3JlIEZsb3cgY29tcGxhaW5pbmcgYWJvdXQgbmVlZGluZyBhIHZhbHVlCgogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9ucywgJ3Bhc3NpdmUnLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTsKICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikgewogICAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTsKCiAgICB0cnkgewogICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHRoaXMub25FcnJvcihlcnJvcik7CiAgICB9CiAgfQoKICB2YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCA9IGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2Q7CgogIHsKICAgIC8vIEluIERFViBtb2RlLCB3ZSBzd2FwIG91dCBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgZm9yIGEgc3BlY2lhbCB2ZXJzaW9uCiAgICAvLyB0aGF0IHBsYXlzIG1vcmUgbmljZWx5IHdpdGggdGhlIGJyb3dzZXIncyBEZXZUb29scy4gVGhlIGlkZWEgaXMgdG8gcHJlc2VydmUKICAgIC8vICJQYXVzZSBvbiBleGNlcHRpb25zIiBiZWhhdmlvci4gQmVjYXVzZSBSZWFjdCB3cmFwcyBhbGwgdXNlci1wcm92aWRlZAogICAgLy8gZnVuY3Rpb25zIGluIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYW5kIHRoZSBwcm9kdWN0aW9uIHZlcnNpb24gb2YKICAgIC8vIGludm9rZUd1YXJkZWRDYWxsYmFjayB1c2VzIGEgdHJ5LWNhdGNoLCBhbGwgdXNlciBleGNlcHRpb25zIGFyZSB0cmVhdGVkCiAgICAvLyBsaWtlIGNhdWdodCBleGNlcHRpb25zLCBhbmQgdGhlIERldlRvb2xzIHdvbid0IHBhdXNlIHVubGVzcyB0aGUgZGV2ZWxvcGVyCiAgICAvLyB0YWtlcyB0aGUgZXh0cmEgc3RlcCBvZiBlbmFibGluZyBwYXVzZSBvbiBjYXVnaHQgZXhjZXB0aW9ucy4gVGhpcyBpcwogICAgLy8gdW5pbnR1aXRpdmUsIHRob3VnaCwgYmVjYXVzZSBldmVuIHRob3VnaCBSZWFjdCBoYXMgY2F1Z2h0IHRoZSBlcnJvciwgZnJvbQogICAgLy8gdGhlIGRldmVsb3BlcidzIHBlcnNwZWN0aXZlLCB0aGUgZXJyb3IgaXMgdW5jYXVnaHQuCiAgICAvLwogICAgLy8gVG8gcHJlc2VydmUgdGhlIGV4cGVjdGVkICJQYXVzZSBvbiBleGNlcHRpb25zIiBiZWhhdmlvciwgd2UgZG9uJ3QgdXNlIGEKICAgIC8vIHRyeS1jYXRjaCBpbiBERVYuIEluc3RlYWQsIHdlIHN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggYSBmYWtlIGV2ZW50IHRvIGEgZmFrZQogICAgLy8gRE9NIG5vZGUsIGFuZCBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIGZyb20gaW5zaWRlIGFuIGV2ZW50IGhhbmRsZXIKICAgIC8vIGZvciB0aGF0IGZha2UgZXZlbnQuIElmIHRoZSBjYWxsYmFjayB0aHJvd3MsIHRoZSBlcnJvciBpcyAiY2FwdHVyZWQiIHVzaW5nCiAgICAvLyBhIGdsb2JhbCBldmVudCBoYW5kbGVyLiBCdXQgYmVjYXVzZSB0aGUgZXJyb3IgaGFwcGVucyBpbiBhIGRpZmZlcmVudAogICAgLy8gZXZlbnQgbG9vcCBjb250ZXh0LCBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIG5vcm1hbCBwcm9ncmFtIGZsb3cuCiAgICAvLyBFZmZlY3RpdmVseSwgdGhpcyBnaXZlcyB1cyB0cnktY2F0Y2ggYmVoYXZpb3Igd2l0aG91dCBhY3R1YWxseSB1c2luZwogICAgLy8gdHJ5LWNhdGNoLiBOZWF0IQogICAgLy8gQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgc3BlY2lhbAogICAgLy8gREVWIHZlcnNpb24gb2YgaW52b2tlR3VhcmRlZENhbGxiYWNrCiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kaXNwYXRjaEV2ZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlYWN0Jyk7CgogICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2KG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHsKICAgICAgICAvLyBJZiBkb2N1bWVudCBkb2Vzbid0IGV4aXN0IHdlIGtub3cgZm9yIHN1cmUgd2Ugd2lsbCBjcmFzaCBpbiB0aGlzIG1ldGhvZAogICAgICAgIC8vIHdoZW4gd2UgY2FsbCBkb2N1bWVudC5jcmVhdGVFdmVudCgpLiBIb3dldmVyIHRoaXMgY2FuIGNhdXNlIGNvbmZ1c2luZwogICAgICAgIC8vIGVycm9yczogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2NyZWF0ZS1yZWFjdC1hcHAvaXNzdWVzLzM0ODIKICAgICAgICAvLyBTbyB3ZSBwcmVlbXB0aXZlbHkgdGhyb3cgd2l0aCBhIGJldHRlciBtZXNzYWdlIGluc3RlYWQuCiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgfHwgZG9jdW1lbnQgPT09IG51bGwpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBkb2N1bWVudGAgZ2xvYmFsIHdhcyBkZWZpbmVkIHdoZW4gUmVhY3Qgd2FzIGluaXRpYWxpemVkLCBidXQgaXMgbm90ICcgKyAnZGVmaW5lZCBhbnltb3JlLiBUaGlzIGNhbiBoYXBwZW4gaW4gYSB0ZXN0IGVudmlyb25tZW50IGlmIGEgY29tcG9uZW50ICcgKyAnc2NoZWR1bGVzIGFuIHVwZGF0ZSBmcm9tIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjaywgYnV0IHRoZSB0ZXN0IGhhcyBhbHJlYWR5ICcgKyAnZmluaXNoZWQgcnVubmluZy4gVG8gc29sdmUgdGhpcywgeW91IGNhbiBlaXRoZXIgdW5tb3VudCB0aGUgY29tcG9uZW50IGF0ICcgKyAndGhlIGVuZCBvZiB5b3VyIHRlc3QgKGFuZCBlbnN1cmUgdGhhdCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgZ2V0ICcgKyAnY2FuY2VsZWQgaW4gYGNvbXBvbmVudFdpbGxVbm1vdW50YCksIG9yIHlvdSBjYW4gY2hhbmdlIHRoZSB0ZXN0IGl0c2VsZiAnICsgJ3RvIGJlIGFzeW5jaHJvbm91cy4nKTsKICAgICAgICB9CgogICAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTsKICAgICAgICB2YXIgZGlkQ2FsbCA9IGZhbHNlOyAvLyBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLiBXZQogICAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXIKICAgICAgICAvLyBjYWxsaW5nIHRoZSBmdW5jdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIGVycm9ycywgYGRpZEVycm9yYCB3aWxsIG5ldmVyIGJlCiAgICAgICAgLy8gc2V0IHRvIGZhbHNlLiBUaGlzIHN0cmF0ZWd5IHdvcmtzIGV2ZW4gaWYgdGhlIGJyb3dzZXIgaXMgZmxha3kgYW5kCiAgICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uCiAgICAgICAgLy8gdGhlIGVycm9yIGV2ZW50IGF0IGFsbC4KCiAgICAgICAgdmFyIGRpZEVycm9yID0gdHJ1ZTsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHZhbHVlIG9mIHdpbmRvdy5ldmVudCBzbyB0aGF0IHdlIGNhbiByZXNldCBpdAogICAgICAgIC8vIGR1cmluZyB0aGUgY2FsbGJhY2sgdG8gbGV0IHVzZXIgY29kZSBhY2Nlc3Mgd2luZG93LmV2ZW50IGluIHRoZQogICAgICAgIC8vIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdC4KCiAgICAgICAgdmFyIHdpbmRvd0V2ZW50ID0gd2luZG93LmV2ZW50OyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgZGVzY3JpcHRvciBvZiB3aW5kb3cuZXZlbnQgdG8gcmVzdG9yZSBpdCBhZnRlciBldmVudAogICAgICAgIC8vIGRpc3BhdGNoaW5nOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjg4CgogICAgICAgIHZhciB3aW5kb3dFdmVudERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2V2ZW50Jyk7CgogICAgICAgIGZ1bmN0aW9uIHJlc3RvcmVBZnRlckRpc3BhdGNoKCkgewogICAgICAgICAgLy8gV2UgaW1tZWRpYXRlbHkgcmVtb3ZlIHRoZSBjYWxsYmFjayBmcm9tIGV2ZW50IGxpc3RlbmVycyBzbyB0aGF0CiAgICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGEKICAgICAgICAgIC8vIG5lc3RlZCBjYWxsIHdvdWxkIHRyaWdnZXIgdGhlIGZha2UgZXZlbnQgaGFuZGxlcnMgb2YgYW55IGNhbGwgaGlnaGVyCiAgICAgICAgICAvLyBpbiB0aGUgc3RhY2suCiAgICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBXZSBjaGVjayBmb3Igd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpIHRvIHByZXZlbnQgdGhlCiAgICAgICAgICAvLyB3aW5kb3cuZXZlbnQgYXNzaWdubWVudCBpbiBib3RoIElFIDw9IDEwIGFzIHRoZXkgdGhyb3cgYW4gZXJyb3IKICAgICAgICAgIC8vICJNZW1iZXIgbm90IGZvdW5kIiBpbiBzdHJpY3QgbW9kZSwgYW5kIGluIEZpcmVmb3ggd2hpY2ggZG9lcyBub3QKICAgICAgICAgIC8vIHN1cHBvcnQgd2luZG93LmV2ZW50LgoKICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmV2ZW50ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykpIHsKICAgICAgICAgICAgd2luZG93LmV2ZW50ID0gd2luZG93RXZlbnQ7CiAgICAgICAgICB9CiAgICAgICAgfSAvLyBDcmVhdGUgYW4gZXZlbnQgaGFuZGxlciBmb3Igb3VyIGZha2UgZXZlbnQuIFdlIHdpbGwgc3luY2hyb25vdXNseQogICAgICAgIC8vIGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50IHVzaW5nIGBkaXNwYXRjaEV2ZW50YC4gSW5zaWRlIHRoZSBoYW5kbGVyLCB3ZQogICAgICAgIC8vIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2suCgoKICAgICAgICB2YXIgZnVuY0FyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDMpOwoKICAgICAgICBmdW5jdGlvbiBjYWxsQ2FsbGJhY2soKSB7CiAgICAgICAgICBkaWRDYWxsID0gdHJ1ZTsKICAgICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7CiAgICAgICAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTsKICAgICAgICAgIGRpZEVycm9yID0gZmFsc2U7CiAgICAgICAgfSAvLyBDcmVhdGUgYSBnbG9iYWwgZXJyb3IgZXZlbnQgaGFuZGxlci4gV2UgdXNlIHRoaXMgdG8gY2FwdHVyZSB0aGUgdmFsdWUKICAgICAgICAvLyB0aGF0IHdhcyB0aHJvd24uIEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIGVycm9yIGhhbmRsZXIgd2lsbCBmaXJlIG1vcmUKICAgICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YAogICAgICAgIC8vIGFuZCBhIGhhbmRsZXIgZm9yIHRoYXQgZXZlbnQgdGhyb3dzLiBXZSBzaG91bGQgYmUgcmVzaWxpZW50IHRvIG1vc3Qgb2YKICAgICAgICAvLyB0aG9zZSBjYXNlcy4gRXZlbiBpZiBvdXIgZXJyb3IgZXZlbnQgaGFuZGxlciBmaXJlcyBtb3JlIHRoYW4gb25jZSwgdGhlCiAgICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsCiAgICAgICAgLy8gd2Uga25vdyB0aGF0IHRoZSBsYXN0IGVycm9yIGV2ZW50IGlzIHRoZSBjb3JyZWN0IG9uZSwgYmVjYXVzZSBpdCdzIG5vdAogICAgICAgIC8vIHBvc3NpYmxlIGZvciBhbnl0aGluZyBlbHNlIHRvIGhhdmUgaGFwcGVuZWQgaW4gYmV0d2VlbiBvdXIgY2FsbGJhY2sKICAgICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWYKICAgICAgICAvLyB0aGUgY2FsbGJhY2sgZG9lc24ndCBlcnJvciwgYnV0IHRoZSBlcnJvciBldmVudCB3YXMgZmlyZWQsIHdlIGtub3cgdG8KICAgICAgICAvLyBpZ25vcmUgaXQgYmVjYXVzZSBgZGlkRXJyb3JgIHdpbGwgYmUgZmFsc2UsIGFzIGRlc2NyaWJlZCBhYm92ZS4KCgogICAgICAgIHZhciBlcnJvcjsgLy8gVXNlIHRoaXMgdG8gdHJhY2sgd2hldGhlciB0aGUgZXJyb3IgZXZlbnQgaXMgZXZlciBjYWxsZWQuCgogICAgICAgIHZhciBkaWRTZXRFcnJvciA9IGZhbHNlOwogICAgICAgIHZhciBpc0Nyb3NzT3JpZ2luRXJyb3IgPSBmYWxzZTsKCiAgICAgICAgZnVuY3Rpb24gaGFuZGxlV2luZG93RXJyb3IoZXZlbnQpIHsKICAgICAgICAgIGVycm9yID0gZXZlbnQuZXJyb3I7CiAgICAgICAgICBkaWRTZXRFcnJvciA9IHRydWU7CgogICAgICAgICAgaWYgKGVycm9yID09PSBudWxsICYmIGV2ZW50LmNvbG5vID09PSAwICYmIGV2ZW50LmxpbmVubyA9PT0gMCkgewogICAgICAgICAgICBpc0Nyb3NzT3JpZ2luRXJyb3IgPSB0cnVlOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7CiAgICAgICAgICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IgaGFuZGxlciBoYXMgcHJldmVudGVkIGRlZmF1bHQuCiAgICAgICAgICAgIC8vIEJyb3dzZXJzIHNpbGVuY2UgdGhlIGVycm9yIHJlcG9ydCBpZiB0aGlzIGhhcHBlbnMuCiAgICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC4KICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICB9IGNhdGNoIChpbm5lcikgey8vIElnbm9yZS4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IC8vIENyZWF0ZSBhIGZha2UgZXZlbnQgdHlwZS4KCgogICAgICAgIHZhciBldnRUeXBlID0gInJlYWN0LSIgKyAobmFtZSA/IG5hbWUgOiAnaW52b2tlZ3VhcmRlZGNhbGxiYWNrJyk7IC8vIEF0dGFjaCBvdXIgZXZlbnQgaGFuZGxlcnMKCiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpOwogICAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQuIElmIHRoZSB1c2VyLXByb3ZpZGVkIGZ1bmN0aW9uCiAgICAgICAgLy8gZXJyb3JzLCBpdCB3aWxsIHRyaWdnZXIgb3VyIGdsb2JhbCBlcnJvciBoYW5kbGVyLgoKICAgICAgICBldnQuaW5pdEV2ZW50KGV2dFR5cGUsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgZmFrZU5vZGUuZGlzcGF0Y2hFdmVudChldnQpOwoKICAgICAgICBpZiAod2luZG93RXZlbnREZXNjcmlwdG9yKSB7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRpZENhbGwgJiYgZGlkRXJyb3IpIHsKICAgICAgICAgIGlmICghZGlkU2V0RXJyb3IpIHsKICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGVycm9yZWQsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgbmV2ZXIgZmlyZWQuCiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzCiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdBbiBlcnJvciB3YXMgdGhyb3duIGluc2lkZSBvbmUgb2YgeW91ciBjb21wb25lbnRzLCBidXQgUmVhY3QgJyArICJkb2Vzbid0IGtub3cgd2hhdCBpdCB3YXMuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBicm93c2VyICIgKyAnZmxha2luZXNzLiBSZWFjdCBkb2VzIGl0cyBiZXN0IHRvIHByZXNlcnZlIHRoZSAiUGF1c2Ugb24gJyArICdleGNlcHRpb25zIiBiZWhhdmlvciBvZiB0aGUgRGV2VG9vbHMsIHdoaWNoIHJlcXVpcmVzIHNvbWUgJyArICJERVYtbW9kZSBvbmx5IHRyaWNrcy4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXNlIGRvbid0IHdvcmsgaW4gIiArICd5b3VyIGJyb3dzZXIuIFRyeSB0cmlnZ2VyaW5nIHRoZSBlcnJvciBpbiBwcm9kdWN0aW9uIG1vZGUsICcgKyAnb3Igc3dpdGNoaW5nIHRvIGEgbW9kZXJuIGJyb3dzZXIuIElmIHlvdSBzdXNwZWN0IHRoYXQgdGhpcyBpcyAnICsgJ2FjdHVhbGx5IGFuIGlzc3VlIHdpdGggUmVhY3QsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICAgICAgfSBlbHNlIGlmIChpc0Nyb3NzT3JpZ2luRXJyb3IpIHsKICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXMKICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoIkEgY3Jvc3Mtb3JpZ2luIGVycm9yIHdhcyB0aHJvd24uIFJlYWN0IGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gIiArICd0aGUgYWN0dWFsIGVycm9yIG9iamVjdCBpbiBkZXZlbG9wbWVudC4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Nyb3Nzb3JpZ2luLWVycm9yIGZvciBtb3JlIGluZm9ybWF0aW9uLicpOwogICAgICAgICAgfQoKICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7CiAgICAgICAgfSAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVycwoKCiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpOwoKICAgICAgICBpZiAoIWRpZENhbGwpIHsKICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgYW5kIG91ciBldmVudCB3YXMgbm90IGRpc3BhdGNoZWQuCiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2NzM0CiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2NTg1CiAgICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gaW1wbGVtZW50YXRpb24uCiAgICAgICAgICByZXN0b3JlQWZ0ZXJEaXNwYXRjaCgpOwogICAgICAgICAgcmV0dXJuIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgfQoKICB2YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxID0gaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbDsKCiAgdmFyIGhhc0Vycm9yID0gZmFsc2U7CiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDsgLy8gVXNlZCBieSBldmVudCBzeXN0ZW0gdG8gY2FwdHVyZS9yZXRocm93IHRoZSBmaXJzdCBlcnJvci4KCiAgdmFyIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlOwogIHZhciByZXRocm93RXJyb3IgPSBudWxsOwogIHZhciByZXBvcnRlciA9IHsKICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikgewogICAgICBoYXNFcnJvciA9IHRydWU7CiAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7CiAgICB9CiAgfTsKICAvKioKICAgKiBDYWxsIGEgZnVuY3Rpb24gd2hpbGUgZ3VhcmRpbmcgYWdhaW5zdCBlcnJvcnMgdGhhdCBoYXBwZW5zIHdpdGhpbiBpdC4KICAgKiBSZXR1cm5zIGFuIGVycm9yIGlmIGl0IHRocm93cywgb3RoZXJ3aXNlIG51bGwuCiAgICoKICAgKiBJbiBwcm9kdWN0aW9uLCB0aGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgdHJ5LWNhdGNoLiBUaGUgcmVhc29uIHdlIGRvbid0CiAgICogdXNlIGEgdHJ5LWNhdGNoIGRpcmVjdGx5IGlzIHNvIHRoYXQgd2UgY2FuIHN3YXAgb3V0IGEgZGlmZmVyZW50CiAgICogaW1wbGVtZW50YXRpb24gaW4gREVWIG1vZGUuCiAgICoKICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZwogICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZQogICAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvbgogICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uCiAgICovCgogIGZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7CiAgICBoYXNFcnJvciA9IGZhbHNlOwogICAgY2F1Z2h0RXJyb3IgPSBudWxsOwogICAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpOwogIH0KICAvKioKICAgKiBTYW1lIGFzIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLCBpdCBzdG9yZXMKICAgKiBpdCBpbiBhIGdsb2JhbCBzbyBpdCBjYW4gYmUgcmV0aHJvd24gYnkgYHJldGhyb3dDYXVnaHRFcnJvcmAgbGF0ZXIuCiAgICogVE9ETzogU2VlIGlmIGNhdWdodEVycm9yIGFuZCByZXRocm93RXJyb3IgY2FuIGJlIHVuaWZpZWQuCiAgICoKICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZwogICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZQogICAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvbgogICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uCiAgICovCgogIGZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja0FuZENhdGNoRmlyc3RFcnJvcihuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7CiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCiAgICBpZiAoaGFzRXJyb3IpIHsKICAgICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpOwoKICAgICAgaWYgKCFoYXNSZXRocm93RXJyb3IpIHsKICAgICAgICBoYXNSZXRocm93RXJyb3IgPSB0cnVlOwogICAgICAgIHJldGhyb3dFcnJvciA9IGVycm9yOwogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIER1cmluZyBleGVjdXRpb24gb2YgZ3VhcmRlZCBmdW5jdGlvbnMgd2Ugd2lsbCBjYXB0dXJlIHRoZSBmaXJzdCBlcnJvciB3aGljaAogICAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci4KICAgKi8KCiAgZnVuY3Rpb24gcmV0aHJvd0NhdWdodEVycm9yKCkgewogICAgaWYgKGhhc1JldGhyb3dFcnJvcikgewogICAgICB2YXIgZXJyb3IgPSByZXRocm93RXJyb3I7CiAgICAgIGhhc1JldGhyb3dFcnJvciA9IGZhbHNlOwogICAgICByZXRocm93RXJyb3IgPSBudWxsOwogICAgICB0aHJvdyBlcnJvcjsKICAgIH0KICB9CiAgZnVuY3Rpb24gaGFzQ2F1Z2h0RXJyb3IoKSB7CiAgICByZXR1cm4gaGFzRXJyb3I7CiAgfQogIGZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7CiAgICBpZiAoaGFzRXJyb3IpIHsKICAgICAgdmFyIGVycm9yID0gY2F1Z2h0RXJyb3I7CiAgICAgIGhhc0Vycm9yID0gZmFsc2U7CiAgICAgIGNhdWdodEVycm9yID0gbnVsbDsKICAgICAgcmV0dXJuIGVycm9yOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhckNhdWdodEVycm9yIHdhcyBjYWxsZWQgYnV0IG5vIGVycm9yIHdhcyBjYXB0dXJlZC4gVGhpcyBlcnJvciAnICsgJ2lzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgfQogIH0KCiAgdmFyIFJlYWN0SW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7CiAgdmFyIF9SZWFjdEludGVybmFscyRTY2hlZCA9IFJlYWN0SW50ZXJuYWxzLlNjaGVkdWxlciwKICAgICAgdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sgPSBfUmVhY3RJbnRlcm5hbHMkU2NoZWQudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2ssCiAgICAgIHVuc3RhYmxlX25vdyA9IF9SZWFjdEludGVybmFscyRTY2hlZC51bnN0YWJsZV9ub3csCiAgICAgIHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2sgPSBfUmVhY3RJbnRlcm5hbHMkU2NoZWQudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaywKICAgICAgdW5zdGFibGVfc2hvdWxkWWllbGQgPSBfUmVhY3RJbnRlcm5hbHMkU2NoZWQudW5zdGFibGVfc2hvdWxkWWllbGQsCiAgICAgIHVuc3RhYmxlX3JlcXVlc3RQYWludCA9IF9SZWFjdEludGVybmFscyRTY2hlZC51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsCiAgICAgIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlID0gX1JlYWN0SW50ZXJuYWxzJFNjaGVkLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlLAogICAgICB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkgPSBfUmVhY3RJbnRlcm5hbHMkU2NoZWQudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5LAogICAgICB1bnN0YWJsZV9uZXh0ID0gX1JlYWN0SW50ZXJuYWxzJFNjaGVkLnVuc3RhYmxlX25leHQsCiAgICAgIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uID0gX1JlYWN0SW50ZXJuYWxzJFNjaGVkLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uLAogICAgICB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbiA9IF9SZWFjdEludGVybmFscyRTY2hlZC51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbiwKICAgICAgdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBfUmVhY3RJbnRlcm5hbHMkU2NoZWQudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsCiAgICAgIHVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gX1JlYWN0SW50ZXJuYWxzJFNjaGVkLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LAogICAgICB1bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IF9SZWFjdEludGVybmFscyRTY2hlZC51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSwKICAgICAgdW5zdGFibGVfTm9ybWFsUHJpb3JpdHkgPSBfUmVhY3RJbnRlcm5hbHMkU2NoZWQudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksCiAgICAgIHVuc3RhYmxlX0xvd1ByaW9yaXR5ID0gX1JlYWN0SW50ZXJuYWxzJFNjaGVkLnVuc3RhYmxlX0xvd1ByaW9yaXR5LAogICAgICB1bnN0YWJsZV9JZGxlUHJpb3JpdHkgPSBfUmVhY3RJbnRlcm5hbHMkU2NoZWQudW5zdGFibGVfSWRsZVByaW9yaXR5LAogICAgICB1bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZSA9IF9SZWFjdEludGVybmFscyRTY2hlZC51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZSwKICAgICAgdW5zdGFibGVfZmx1c2hBbGxXaXRob3V0QXNzZXJ0aW5nID0gX1JlYWN0SW50ZXJuYWxzJFNjaGVkLnVuc3RhYmxlX2ZsdXNoQWxsV2l0aG91dEFzc2VydGluZywKICAgICAgdW5zdGFibGVfeWllbGRWYWx1ZSA9IF9SZWFjdEludGVybmFscyRTY2hlZC51bnN0YWJsZV95aWVsZFZhbHVlLAogICAgICB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSA9IF9SZWFjdEludGVybmFscyRTY2hlZC51bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZTsKCiAgLyoqCiAgICogYFJlYWN0SW5zdGFuY2VNYXBgIG1haW50YWlucyBhIG1hcHBpbmcgZnJvbSBhIHB1YmxpYyBmYWNpbmcgc3RhdGVmdWwKICAgKiBpbnN0YW5jZSAoa2V5KSBhbmQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uICh2YWx1ZSkuIFRoaXMgYWxsb3dzIHB1YmxpYwogICAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFjawogICAqIHRvIGludGVybmFsIG1ldGhvZHMuCiAgICoKICAgKiBOb3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgY3VycmVudGx5IHNoYXJlZCBhbmQgYXNzdW1lZCB0byBiZSBzdGF0ZWxlc3MuCiAgICogSWYgdGhpcyBiZWNvbWVzIGFuIGFjdHVhbCBNYXAsIHRoYXQgd2lsbCBicmVhay4KICAgKi8KICBmdW5jdGlvbiBnZXQoa2V5KSB7CiAgICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFsczsKICB9CiAgZnVuY3Rpb24gaGFzKGtleSkgewogICAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHMgIT09IHVuZGVmaW5lZDsKICB9CiAgZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHsKICAgIGtleS5fcmVhY3RJbnRlcm5hbHMgPSB2YWx1ZTsKICB9CgogIC8vIERvbid0IGNoYW5nZSB0aGVzZSB0d28gdmFsdWVzLiBUaGV5J3JlIHVzZWQgYnkgUmVhY3QgRGV2IFRvb2xzLgogIHZhciBOb0ZsYWdzID0KICAvKiAgICAgICAgICAgICAgICAgICAgICAqLwogIDA7CiAgdmFyIFBlcmZvcm1lZFdvcmsgPQogIC8qICAgICAgICAgICAgICAgICovCiAgMTsgLy8gWW91IGNhbiBjaGFuZ2UgdGhlIHJlc3QgKGFuZCBhZGQgbW9yZSkuCgogIHZhciBQbGFjZW1lbnQgPQogIC8qICAgICAgICAgICAgICAgICAgICAqLwogIDI7CiAgdmFyIFVwZGF0ZSA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICovCiAgNDsKICB2YXIgQ2hpbGREZWxldGlvbiA9CiAgLyogICAgICAgICAgICAgICAgKi8KICAxNjsKICB2YXIgQ29udGVudFJlc2V0ID0KICAvKiAgICAgICAgICAgICAgICAgKi8KICAzMjsKICB2YXIgQ2FsbGJhY2sgPQogIC8qICAgICAgICAgICAgICAgICAgICAgKi8KICA2NDsKICB2YXIgRGlkQ2FwdHVyZSA9CiAgLyogICAgICAgICAgICAgICAgICAgKi8KICAxMjg7CiAgdmFyIEZvcmNlQ2xpZW50UmVuZGVyID0KICAvKiAgICAgICAgICAgICovCiAgMjU2OwogIHZhciBSZWYgPQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIDUxMjsKICB2YXIgU25hcHNob3QgPQogIC8qICAgICAgICAgICAgICAgICAgICAgKi8KICAxMDI0OwogIHZhciBQYXNzaXZlID0KICAvKiAgICAgICAgICAgICAgICAgICAgICAqLwogIDIwNDg7CiAgdmFyIEh5ZHJhdGluZyA9CiAgLyogICAgICAgICAgICAgICAgICAgICovCiAgNDA5NjsKICB2YXIgVmlzaWJpbGl0eSA9CiAgLyogICAgICAgICAgICAgICAgICAgKi8KICA4MTkyOwogIHZhciBTdG9yZUNvbnNpc3RlbmN5ID0KICAvKiAgICAgICAgICAgICAqLwogIDE2Mzg0OwogIHZhciBMaWZlY3ljbGVFZmZlY3RNYXNrID0gUGFzc2l2ZSB8IFVwZGF0ZSB8IENhbGxiYWNrIHwgUmVmIHwgU25hcHNob3QgfCBTdG9yZUNvbnNpc3RlbmN5OyAvLyBVbmlvbiBvZiBhbGwgY29tbWl0IGZsYWdzIChmbGFncyB3aXRoIHRoZSBsaWZldGltZSBvZiBhIHBhcnRpY3VsYXIgY29tbWl0KQoKICB2YXIgSG9zdEVmZmVjdE1hc2sgPQogIC8qICAgICAgICAgICAgICAgKi8KICAzMjc2NzsgLy8gVGhlc2UgYXJlIG5vdCByZWFsbHkgc2lkZSBlZmZlY3RzLCBidXQgd2Ugc3RpbGwgcmV1c2UgdGhpcyBmaWVsZC4KCiAgdmFyIEluY29tcGxldGUgPQogIC8qICAgICAgICAgICAgICAgICAgICovCiAgMzI3Njg7CiAgdmFyIFNob3VsZENhcHR1cmUgPQogIC8qICAgICAgICAgICAgICAgICovCiAgNjU1MzY7CiAgdmFyIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UgPQogIC8qICovCiAgMTMxMDcyOwogIHZhciBGb3JrZWQgPQogIC8qICAgICAgICAgICAgICAgICAgICAgICAqLwogIDEwNDg1NzY7IC8vIFN0YXRpYyB0YWdzIGRlc2NyaWJlIGFzcGVjdHMgb2YgYSBmaWJlciB0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8gYSByZW5kZXIsCiAgLy8gZS5nLiBhIGZpYmVyIHVzZXMgYSBwYXNzaXZlIGVmZmVjdCAoZXZlbiBpZiB0aGVyZSBhcmUgbm8gdXBkYXRlcyBvbiB0aGlzIHBhcnRpY3VsYXIgcmVuZGVyKS4KICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gZGVmZXIgbW9yZSB3b3JrIGluIHRoZSB1bm1vdW50IGNhc2UsCiAgLy8gc2luY2Ugd2UgY2FuIGRlZmVyIHRyYXZlcnNpbmcgdGhlIHRyZWUgZHVyaW5nIGxheW91dCB0byBsb29rIGZvciBQYXNzaXZlIGVmZmVjdHMsCiAgLy8gYW5kIGluc3RlYWQgcmVseSBvbiB0aGUgc3RhdGljIGZsYWcgYXMgYSBzaWduYWwgdGhhdCB0aGVyZSBtYXkgYmUgY2xlYW51cCB3b3JrLgoKICB2YXIgUmVmU3RhdGljID0KICAvKiAgICAgICAgICAgICAgICAgICAgKi8KICAyMDk3MTUyOwogIHZhciBMYXlvdXRTdGF0aWMgPQogIC8qICAgICAgICAgICAgICAgICAqLwogIDQxOTQzMDQ7CiAgdmFyIFBhc3NpdmVTdGF0aWMgPQogIC8qICAgICAgICAgICAgICAgICovCiAgODM4ODYwODsgLy8gVGhlc2UgZmxhZ3MgYWxsb3cgdXMgdG8gdHJhdmVyc2UgdG8gZmliZXJzIHRoYXQgaGF2ZSBlZmZlY3RzIG9uIG1vdW50CiAgLy8gd2l0aG91dCB0cmF2ZXJzaW5nIHRoZSBlbnRpcmUgdHJlZSBhZnRlciBldmVyeSBjb21taXQgZm9yCiAgLy8gZG91YmxlIGludm9raW5nCgogIHZhciBNb3VudExheW91dERldiA9CiAgLyogICAgICAgICAgICAgICAqLwogIDE2Nzc3MjE2OwogIHZhciBNb3VudFBhc3NpdmVEZXYgPQogIC8qICAgICAgICAgICAgICAqLwogIDMzNTU0NDMyOyAvLyBHcm91cHMgb2YgZmxhZ3MgdGhhdCBhcmUgdXNlZCBpbiB0aGUgY29tbWl0IHBoYXNlIHRvIHNraXAgb3ZlciB0cmVlcyB0aGF0CiAgLy8gZG9uJ3QgY29udGFpbiBlZmZlY3RzLCBieSBjaGVja2luZyBzdWJ0cmVlRmxhZ3MuCgogIHZhciBCZWZvcmVNdXRhdGlvbk1hc2sgPSAvLyBUT0RPOiBSZW1vdmUgVXBkYXRlIGZsYWcgZnJvbSBiZWZvcmUgbXV0YXRpb24gcGhhc2UgYnkgcmUtbGFuZGluZyBWaXNpYmlsaXR5CiAgLy8gZmxhZyBsb2dpYyAoc2VlICMyMDA0MykKICBVcGRhdGUgfCBTbmFwc2hvdCB8ICggMCk7CiAgdmFyIE11dGF0aW9uTWFzayA9IFBsYWNlbWVudCB8IFVwZGF0ZSB8IENoaWxkRGVsZXRpb24gfCBDb250ZW50UmVzZXQgfCBSZWYgfCBIeWRyYXRpbmcgfCBWaXNpYmlsaXR5OwogIHZhciBMYXlvdXRNYXNrID0gVXBkYXRlIHwgQ2FsbGJhY2sgfCBSZWYgfCBWaXNpYmlsaXR5OyAvLyBUT0RPOiBTcGxpdCBpbnRvIFBhc3NpdmVNb3VudE1hc2sgYW5kIFBhc3NpdmVVbm1vdW50TWFzawoKICB2YXIgUGFzc2l2ZU1hc2sgPSBQYXNzaXZlIHwgQ2hpbGREZWxldGlvbjsgLy8gVW5pb24gb2YgdGFncyB0aGF0IGRvbid0IGdldCByZXNldCBvbiBjbG9uZXMuCiAgLy8gVGhpcyBhbGxvd3MgY2VydGFpbiBjb25jZXB0cyB0byBwZXJzaXN0IHdpdGhvdXQgcmVjYWxjdWxhdGluZyB0aGVtLAogIC8vIGUuZy4gd2hldGhlciBhIHN1YnRyZWUgY29udGFpbnMgcGFzc2l2ZSBlZmZlY3RzIG9yIHBvcnRhbHMuCgogIHZhciBTdGF0aWNNYXNrID0gTGF5b3V0U3RhdGljIHwgUGFzc2l2ZVN0YXRpYyB8IFJlZlN0YXRpYzsKCiAgdmFyIFJlYWN0Q3VycmVudE93bmVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7CiAgZnVuY3Rpb24gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgewogICAgdmFyIG5vZGUgPSBmaWJlcjsKICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGZpYmVyOwoKICAgIGlmICghZmliZXIuYWx0ZXJuYXRlKSB7CiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhpcyBtaWdodCBiZSBhIG5ldyB0cmVlIHRoYXQgaXNuJ3QgaW5zZXJ0ZWQKICAgICAgLy8geWV0LiBJZiBpdCBpcywgdGhlbiBpdCB3aWxsIGhhdmUgYSBwZW5kaW5nIGluc2VydGlvbiBlZmZlY3Qgb24gaXQuCiAgICAgIHZhciBuZXh0Tm9kZSA9IG5vZGU7CgogICAgICBkbyB7CiAgICAgICAgbm9kZSA9IG5leHROb2RlOwoKICAgICAgICBpZiAoKG5vZGUuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHsKICAgICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uIG9yIGluLXByb2dyZXNzIGh5ZHJhdGlvbi4gVGhlIG5lYXJlc3QgcG9zc2libGUKICAgICAgICAgIC8vIG1vdW50ZWQgZmliZXIgaXMgdGhlIHBhcmVudCBidXQgd2UgbmVlZCB0byBjb250aW51ZSB0byBmaWd1cmUgb3V0CiAgICAgICAgICAvLyBpZiB0aGF0IG9uZSBpcyBzdGlsbCBtb3VudGVkLgogICAgICAgICAgbmVhcmVzdE1vdW50ZWQgPSBub2RlLnJldHVybjsKICAgICAgICB9CgogICAgICAgIG5leHROb2RlID0gbm9kZS5yZXR1cm47CiAgICAgIH0gd2hpbGUgKG5leHROb2RlKTsKICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlIChub2RlLnJldHVybikgewogICAgICAgIG5vZGUgPSBub2RlLnJldHVybjsKICAgICAgfQogICAgfQoKICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHsKICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgdGhpcyB3YXMgYSBuZXN0ZWQgSG9zdFJvb3Qgd2hlbiB1c2VkIHdpdGgKICAgICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuCiAgICAgIHJldHVybiBuZWFyZXN0TW91bnRlZDsKICAgIH0gLy8gSWYgd2UgZGlkbid0IGhpdCB0aGUgcm9vdCwgdGhhdCBtZWFucyB0aGF0IHdlJ3JlIGluIGFuIGRpc2Nvbm5lY3RlZCB0cmVlCiAgICAvLyB0aGF0IGhhcyBiZWVuIHVubW91bnRlZC4KCgogICAgcmV0dXJuIG51bGw7CiAgfQogIGZ1bmN0aW9uIGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIoZmliZXIpIHsKICAgIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7CiAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTsKCiAgICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7CiAgICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7CgogICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7CiAgICAgICAgICBzdXNwZW5zZVN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHsKICAgICAgICByZXR1cm4gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQogIGZ1bmN0aW9uIGdldENvbnRhaW5lckZyb21GaWJlcihmaWJlcikgewogICAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QgPyBmaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA6IG51bGw7CiAgfQogIGZ1bmN0aW9uIGlzRmliZXJNb3VudGVkKGZpYmVyKSB7CiAgICByZXR1cm4gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgPT09IGZpYmVyOwogIH0KICBmdW5jdGlvbiBpc01vdW50ZWQoY29tcG9uZW50KSB7CiAgICB7CiAgICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7CgogICAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkgewogICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7CiAgICAgICAgdmFyIGluc3RhbmNlID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7CgogICAgICAgIGlmICghaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7CiAgICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGlzTW91bnRlZCBpbnNpZGUgaXRzIHJlbmRlcigpIGZ1bmN0aW9uLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihvd25lckZpYmVyKSB8fCAnQSBjb21wb25lbnQnKTsKICAgICAgICB9CgogICAgICAgIGluc3RhbmNlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTsKCiAgICBpZiAoIWZpYmVyKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgPT09IGZpYmVyOwogIH0KCiAgZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7CiAgICBpZiAoZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgIT09IGZpYmVyKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHsKICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7CgogICAgaWYgKCFhbHRlcm5hdGUpIHsKICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGVuIHdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiBpdCBpcyBtb3VudGVkLgogICAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTsKCiAgICAgIGlmIChuZWFyZXN0TW91bnRlZCA9PT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpOwogICAgICB9CgogICAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IGZpYmVyKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIHJldHVybiBmaWJlcjsKICAgIH0gLy8gSWYgd2UgaGF2ZSB0d28gcG9zc2libGUgYnJhbmNoZXMsIHdlJ2xsIHdhbGsgYmFja3dhcmRzIHVwIHRvIHRoZSByb290CiAgICAvLyB0byBzZWUgd2hhdCBwYXRoIHRoZSByb290IHBvaW50cyB0by4gT24gdGhlIHdheSB3ZSBtYXkgaGl0IG9uZSBvZiB0aGUKICAgIC8vIHNwZWNpYWwgY2FzZXMgYW5kIHdlJ2xsIGRlYWwgd2l0aCB0aGVtLgoKCiAgICB2YXIgYSA9IGZpYmVyOwogICAgdmFyIGIgPSBhbHRlcm5hdGU7CgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgdmFyIHBhcmVudEEgPSBhLnJldHVybjsKCiAgICAgIGlmIChwYXJlbnRBID09PSBudWxsKSB7CiAgICAgICAgLy8gV2UncmUgYXQgdGhlIHJvb3QuCiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIHZhciBwYXJlbnRCID0gcGFyZW50QS5hbHRlcm5hdGU7CgogICAgICBpZiAocGFyZW50QiA9PT0gbnVsbCkgewogICAgICAgIC8vIFRoZXJlIGlzIG5vIGFsdGVybmF0ZS4gVGhpcyBpcyBhbiB1bnVzdWFsIGNhc2UuIEN1cnJlbnRseSwgaXQgb25seQogICAgICAgIC8vIGhhcHBlbnMgd2hlbiBhIFN1c3BlbnNlIGNvbXBvbmVudCBpcyBoaWRkZW4uIEFuIGV4dHJhIGZyYWdtZW50IGZpYmVyCiAgICAgICAgLy8gaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0aGUgU3VzcGVuc2UgZmliZXIgYW5kIGl0cyBjaGlsZHJlbi4gU2tpcAogICAgICAgIC8vIG92ZXIgdGhpcyBleHRyYSBmcmFnbWVudCBmaWJlciBhbmQgcHJvY2VlZCB0byB0aGUgbmV4dCBwYXJlbnQuCiAgICAgICAgdmFyIG5leHRQYXJlbnQgPSBwYXJlbnRBLnJldHVybjsKCiAgICAgICAgaWYgKG5leHRQYXJlbnQgIT09IG51bGwpIHsKICAgICAgICAgIGEgPSBiID0gbmV4dFBhcmVudDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0gLy8gSWYgdGhlcmUncyBubyBwYXJlbnQsIHdlJ3JlIGF0IHRoZSByb290LgoKCiAgICAgICAgYnJlYWs7CiAgICAgIH0gLy8gSWYgYm90aCBjb3BpZXMgb2YgdGhlIHBhcmVudCBmaWJlciBwb2ludCB0byB0aGUgc2FtZSBjaGlsZCwgd2UgY2FuCiAgICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBjaGlsZCBpcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBiYWlsb3V0IG9uIGxvdwogICAgICAvLyBwcmlvcml0eTogdGhlIGJhaWxlZCBvdXQgZmliZXIncyBjaGlsZCByZXVzZXMgdGhlIGN1cnJlbnQgY2hpbGQuCgoKICAgICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHsKICAgICAgICB2YXIgY2hpbGQgPSBwYXJlbnRBLmNoaWxkOwoKICAgICAgICB3aGlsZSAoY2hpbGQpIHsKICAgICAgICAgIGlmIChjaGlsZCA9PT0gYSkgewogICAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guCiAgICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTsKICAgICAgICAgICAgcmV0dXJuIGZpYmVyOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChjaGlsZCA9PT0gYikgewogICAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQiBpcyB0aGUgY3VycmVudCBicmFuY2guCiAgICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTsKICAgICAgICAgICAgcmV0dXJuIGFsdGVybmF0ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7CiAgICAgICAgfSAvLyBXZSBzaG91bGQgbmV2ZXIgaGF2ZSBhbiBhbHRlcm5hdGUgZm9yIGFueSBtb3VudGluZyBub2RlLiBTbyB0aGUgb25seQogICAgICAgIC8vIHdheSB0aGlzIGNvdWxkIHBvc3NpYmx5IGhhcHBlbiBpcyBpZiB0aGlzIHdhcyB1bm1vdW50ZWQsIGlmIGF0IGFsbC4KCgogICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpOwogICAgICB9CgogICAgICBpZiAoYS5yZXR1cm4gIT09IGIucmV0dXJuKSB7CiAgICAgICAgLy8gVGhlIHJldHVybiBwb2ludGVyIG9mIEEgYW5kIHRoZSByZXR1cm4gcG9pbnRlciBvZiBCIHBvaW50IHRvIGRpZmZlcmVudAogICAgICAgIC8vIGZpYmVycy4gV2UgYXNzdW1lIHRoYXQgcmV0dXJuIHBvaW50ZXJzIG5ldmVyIGNyaXNzLWNyb3NzLCBzbyBBIG11c3QKICAgICAgICAvLyBiZWxvbmcgdG8gdGhlIGNoaWxkIHNldCBvZiBBLnJldHVybiwgYW5kIEIgbXVzdCBiZWxvbmcgdG8gdGhlIGNoaWxkCiAgICAgICAgLy8gc2V0IG9mIEIucmV0dXJuLgogICAgICAgIGEgPSBwYXJlbnRBOwogICAgICAgIGIgPSBwYXJlbnRCOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlcnMgcG9pbnQgdG8gdGhlIHNhbWUgZmliZXIuIFdlJ2xsIGhhdmUgdG8gdXNlIHRoZQogICAgICAgIC8vIGRlZmF1bHQsIHNsb3cgcGF0aDogc2NhbiB0aGUgY2hpbGQgc2V0cyBvZiBlYWNoIHBhcmVudCBhbHRlcm5hdGUgdG8gc2VlCiAgICAgICAgLy8gd2hpY2ggY2hpbGQgYmVsb25ncyB0byB3aGljaCBzZXQuCiAgICAgICAgLy8KICAgICAgICAvLyBTZWFyY2ggcGFyZW50IEEncyBjaGlsZCBzZXQKICAgICAgICB2YXIgZGlkRmluZENoaWxkID0gZmFsc2U7CiAgICAgICAgdmFyIF9jaGlsZCA9IHBhcmVudEEuY2hpbGQ7CgogICAgICAgIHdoaWxlIChfY2hpbGQpIHsKICAgICAgICAgIGlmIChfY2hpbGQgPT09IGEpIHsKICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTsKICAgICAgICAgICAgYSA9IHBhcmVudEE7CiAgICAgICAgICAgIGIgPSBwYXJlbnRCOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7CiAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7CiAgICAgICAgICAgIGIgPSBwYXJlbnRBOwogICAgICAgICAgICBhID0gcGFyZW50QjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWRpZEZpbmRDaGlsZCkgewogICAgICAgICAgLy8gU2VhcmNoIHBhcmVudCBCJ3MgY2hpbGQgc2V0CiAgICAgICAgICBfY2hpbGQgPSBwYXJlbnRCLmNoaWxkOwoKICAgICAgICAgIHdoaWxlIChfY2hpbGQpIHsKICAgICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkgewogICAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7CiAgICAgICAgICAgICAgYSA9IHBhcmVudEI7CiAgICAgICAgICAgICAgYiA9IHBhcmVudEE7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHsKICAgICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlOwogICAgICAgICAgICAgIGIgPSBwYXJlbnRCOwogICAgICAgICAgICAgIGEgPSBwYXJlbnRBOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZzsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIWRpZEZpbmRDaGlsZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoaWxkIHdhcyBub3QgZm91bmQgaW4gZWl0aGVyIHBhcmVudCBzZXQuIFRoaXMgaW5kaWNhdGVzIGEgYnVnICcgKyAnaW4gUmVhY3QgcmVsYXRlZCB0byB0aGUgcmV0dXJuIHBvaW50ZXIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGEuYWx0ZXJuYXRlICE9PSBiKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJSZXR1cm4gZmliZXJzIHNob3VsZCBhbHdheXMgYmUgZWFjaCBvdGhlcnMnIGFsdGVybmF0ZXMuICIgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTsKICAgICAgfQogICAgfSAvLyBJZiB0aGUgcm9vdCBpcyBub3QgYSBob3N0IGNvbnRhaW5lciwgd2UncmUgaW4gYSBkaXNjb25uZWN0ZWQgdHJlZS4gSS5lLgogICAgLy8gdW5tb3VudGVkLgoKCiAgICBpZiAoYS50YWcgIT09IEhvc3RSb290KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpOwogICAgfQoKICAgIGlmIChhLnN0YXRlTm9kZS5jdXJyZW50ID09PSBhKSB7CiAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC4KICAgICAgcmV0dXJuIGZpYmVyOwogICAgfSAvLyBPdGhlcndpc2UgQiBoYXMgdG8gYmUgY3VycmVudCBicmFuY2guCgoKICAgIHJldHVybiBhbHRlcm5hdGU7CiAgfQogIGZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyKHBhcmVudCkgewogICAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpOwogICAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgIT09IG51bGwgPyBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwoY3VycmVudFBhcmVudCkgOiBudWxsOwogIH0KCiAgZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKG5vZGUpIHsKICAgIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuCiAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7CgogICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7CiAgICAgIHZhciBtYXRjaCA9IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChjaGlsZCk7CgogICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHsKICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgIH0KCiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZzsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhwYXJlbnQpIHsKICAgIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTsKICAgIHJldHVybiBjdXJyZW50UGFyZW50ICE9PSBudWxsID8gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChjdXJyZW50UGFyZW50KSA6IG51bGw7CiAgfQoKICBmdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKG5vZGUpIHsKICAgIC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuCiAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7CgogICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7CiAgICAgIGlmIChjaGlsZC50YWcgIT09IEhvc3RQb3J0YWwpIHsKICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHNJbXBsKGNoaWxkKTsKCiAgICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgfQogICAgICB9CgogICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyBUaGlzIG1vZHVsZSBvbmx5IGV4aXN0cyBhcyBhbiBFU00gd3JhcHBlciBhcm91bmQgdGhlIGV4dGVybmFsIENvbW1vbkpTCiAgdmFyIHNjaGVkdWxlQ2FsbGJhY2sgPSB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrOwogIHZhciBjYW5jZWxDYWxsYmFjayA9IHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrOwogIHZhciBzaG91bGRZaWVsZCA9IHVuc3RhYmxlX3Nob3VsZFlpZWxkOwogIHZhciByZXF1ZXN0UGFpbnQgPSB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQ7CiAgdmFyIG5vdyA9IHVuc3RhYmxlX25vdzsKICB2YXIgZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDsKICB2YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSB1bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eTsKICB2YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSB1bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eTsKICB2YXIgTm9ybWFsUHJpb3JpdHkgPSB1bnN0YWJsZV9Ob3JtYWxQcmlvcml0eTsKICB2YXIgTG93UHJpb3JpdHkgPSB1bnN0YWJsZV9Mb3dQcmlvcml0eTsKICB2YXIgSWRsZVByaW9yaXR5ID0gdW5zdGFibGVfSWRsZVByaW9yaXR5OwogIC8vIHRoaXMgZG9lc24ndCBhY3R1YWxseSBleGlzdCBvbiB0aGUgc2NoZWR1bGVyLCBidXQgaXQgKmRvZXMqCiAgLy8gb24gc2NoZWR1bGVyL3Vuc3RhYmxlX21vY2ssIHdoaWNoIHdlJ2xsIG5lZWQgZm9yIGludGVybmFsIHRlc3RpbmcKICB2YXIgdW5zdGFibGVfeWllbGRWYWx1ZSQxID0gdW5zdGFibGVfeWllbGRWYWx1ZTsKICB2YXIgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUkMSA9IHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlOwoKICB2YXIgcmVuZGVyZXJJRCA9IG51bGw7CiAgdmFyIGluamVjdGVkSG9vayA9IG51bGw7CiAgdmFyIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBudWxsOwogIHZhciBoYXNMb2dnZWRFcnJvciA9IGZhbHNlOwogIHZhciBpc0RldlRvb2xzUHJlc2VudCA9IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnOwogIGZ1bmN0aW9uIGluamVjdEludGVybmFscyhpbnRlcm5hbHMpIHsKICAgIGlmICh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJykgewogICAgICAvLyBObyBEZXZUb29scwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgdmFyIGhvb2sgPSBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187CgogICAgaWYgKGhvb2suaXNEaXNhYmxlZCkgewogICAgICAvLyBUaGlzIGlzbid0IGEgcmVhbCBwcm9wZXJ0eSBvbiB0aGUgaG9vaywgYnV0IGl0IGNhbiBiZSBzZXQgdG8gb3B0IG91dAogICAgICAvLyBvZiBEZXZUb29scyBpbnRlZ3JhdGlvbiBhbmQgYXNzb2NpYXRlZCB3YXJuaW5ncyBhbmQgbG9ncy4KICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zODc3CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGlmICghaG9vay5zdXBwb3J0c0ZpYmVyKSB7CiAgICAgIHsKICAgICAgICBlcnJvcignVGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFJlYWN0IERldlRvb2xzIGlzIHRvbyBvbGQgYW5kIHdpbGwgbm90IHdvcmsgJyArICd3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUmVhY3QuIFBsZWFzZSB1cGRhdGUgUmVhY3QgRGV2VG9vbHMuICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyk7CiAgICAgIH0gLy8gRGV2VG9vbHMgZXhpc3RzLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgRmliZXIuCgoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgdHJ5IHsKICAgICAgaWYgKGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlcikgewogICAgICAgIC8vIENvbmRpdGlvbmFsbHkgaW5qZWN0IHRoZXNlIGhvb2tzIG9ubHkgaWYgVGltZWxpbmUgcHJvZmlsZXIgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQuCiAgICAgICAgLy8gVGhpcyBnaXZlcyBEZXZUb29scyBhIHdheSB0byBmZWF0dXJlIGRldGVjdCB0aGF0IGlzbid0IHRpZWQgdG8gdmVyc2lvbiBudW1iZXIKICAgICAgICAvLyAoc2luY2UgcHJvZmlsaW5nIGFuZCB0aW1lbGluZSBhcmUgY29udHJvbGxlZCBieSBkaWZmZXJlbnQgZmVhdHVyZSBmbGFncykuCiAgICAgICAgaW50ZXJuYWxzID0gYXNzaWduKHt9LCBpbnRlcm5hbHMsIHsKICAgICAgICAgIGdldExhbmVMYWJlbE1hcDogZ2V0TGFuZUxhYmVsTWFwLAogICAgICAgICAgaW5qZWN0UHJvZmlsaW5nSG9va3M6IGluamVjdFByb2ZpbGluZ0hvb2tzCiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHJlbmRlcmVySUQgPSBob29rLmluamVjdChpbnRlcm5hbHMpOyAvLyBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBpbmplY3RlZCwgc28gbm93IGl0IGlzIHNhZmUgdG8gc2V0IHVwIGhvb2tzLgoKICAgICAgaW5qZWN0ZWRIb29rID0gaG9vazsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICAvLyBDYXRjaCBhbGwgZXJyb3JzIGJlY2F1c2UgaXQgaXMgdW5zYWZlIHRvIHRocm93IGR1cmluZyBpbml0aWFsaXphdGlvbi4KICAgICAgewogICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzLicsIGVycik7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaG9vay5jaGVja0RDRSkgewogICAgICAvLyBUaGlzIGlzIHRoZSByZWFsIERldlRvb2xzLgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRoaXMgaXMgbGlrZWx5IGEgaG9vayBpbnN0YWxsZWQgYnkgRmFzdCBSZWZyZXNoIHJ1bnRpbWUuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gb25TY2hlZHVsZVJvb3Qocm9vdCwgY2hpbGRyZW4pIHsKICAgIHsKICAgICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB0cnkgewogICAgICAgICAgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgY2hpbGRyZW4pOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgaWYgKCAhaGFzTG9nZ2VkRXJyb3IpIHsKICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlOwoKICAgICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBvbkNvbW1pdFJvb3Qocm9vdCwgZXZlbnRQcmlvcml0eSkgewogICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGRpZEVycm9yID0gKHJvb3QuY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpID09PSBEaWRDYXB0dXJlOwoKICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lcikgewogICAgICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5OwoKICAgICAgICAgIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkgewogICAgICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eToKICAgICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IEltbWVkaWF0ZVByaW9yaXR5OwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eToKICAgICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5OwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBEZWZhdWx0RXZlbnRQcmlvcml0eToKICAgICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5OwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eToKICAgICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IElkbGVQcmlvcml0eTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBOb3JtYWxQcmlvcml0eTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgc2NoZWR1bGVyUHJpb3JpdHksIGRpZEVycm9yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHVuZGVmaW5lZCwgZGlkRXJyb3IpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgewogICAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikgewogICAgICAgICAgICBoYXNMb2dnZWRFcnJvciA9IHRydWU7CgogICAgICAgICAgICBlcnJvcignUmVhY3QgaW5zdHJ1bWVudGF0aW9uIGVuY291bnRlcmVkIGFuIGVycm9yOiAlcycsIGVycik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIG9uUG9zdENvbW1pdFJvb3Qocm9vdCkgewogICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgewogICAgICAgIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCk7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHsKICAgICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHsKICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlOwoKICAgICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBvbkNvbW1pdFVubW91bnQoZmliZXIpIHsKICAgIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgewogICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudChyZW5kZXJlcklELCBmaWJlcik7CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHsKICAgICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHsKICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlOwoKICAgICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhuZXdJc1N0cmljdE1vZGUpIHsKICAgIHsKICAgICAgaWYgKHR5cGVvZiB1bnN0YWJsZV95aWVsZFZhbHVlJDEgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAvLyBXZSdyZSBpbiBhIHRlc3QgYmVjYXVzZSBTY2hlZHVsZXIudW5zdGFibGVfeWllbGRWYWx1ZSBvbmx5IGV4aXN0cwogICAgICAgIC8vIGluIFNjaGVkdWxlck1vY2suIFRvIHJlZHVjZSB0aGUgbm9pc2UgaW4gc3RyaWN0IG1vZGUgdGVzdHMsCiAgICAgICAgLy8gc3VwcHJlc3Mgd2FybmluZ3MgYW5kIGRpc2FibGUgc2NoZWR1bGVyIHlpZWxkaW5nIGR1cmluZyB0aGUgZG91YmxlIHJlbmRlcgogICAgICAgIHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlJDEobmV3SXNTdHJpY3RNb2RlKTsKICAgICAgICBzZXRTdXBwcmVzc1dhcm5pbmcobmV3SXNTdHJpY3RNb2RlKTsKICAgICAgfQoKICAgICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB0cnkgewogICAgICAgICAgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUocmVuZGVyZXJJRCwgbmV3SXNTdHJpY3RNb2RlKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikgewogICAgICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTsKCiAgICAgICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSAvLyBQcm9maWxlciBBUEkgaG9va3MKCiAgZnVuY3Rpb24gaW5qZWN0UHJvZmlsaW5nSG9va3MocHJvZmlsaW5nSG9va3MpIHsKICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MgPSBwcm9maWxpbmdIb29rczsKICB9CgogIGZ1bmN0aW9uIGdldExhbmVMYWJlbE1hcCgpIHsKICAgIHsKICAgICAgdmFyIG1hcCA9IG5ldyBNYXAoKTsKICAgICAgdmFyIGxhbmUgPSAxOwoKICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IFRvdGFsTGFuZXM7IGluZGV4KyspIHsKICAgICAgICB2YXIgbGFiZWwgPSBnZXRMYWJlbEZvckxhbmUobGFuZSk7CiAgICAgICAgbWFwLnNldChsYW5lLCBsYWJlbCk7CiAgICAgICAgbGFuZSAqPSAyOwogICAgICB9CgogICAgICByZXR1cm4gbWFwOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbWFya0NvbW1pdFN0YXJ0ZWQobGFuZXMpIHsKICAgIHsKICAgICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdGFydGVkKGxhbmVzKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBtYXJrQ29tbWl0U3RvcHBlZCgpIHsKICAgIHsKICAgICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbW1pdFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdG9wcGVkKCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQoZmliZXIpIHsKICAgIHsKICAgICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKGZpYmVyKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpIHsKICAgIHsKICAgICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpIHsKICAgIHsKICAgICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdE1vdW50U3RvcHBlZCgpIHsKICAgIHsKICAgICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcikgewogICAgewogICAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCkgewogICAgewogICAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaWJlcikgewogICAgewogICAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCkgewogICAgewogICAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdG9wcGVkKCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKSB7CiAgICB7CiAgICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKSB7CiAgICB7CiAgICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcykgewogICAgewogICAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50RXJyb3JlZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHRocm93blZhbHVlLCBsYW5lcyk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya0NvbXBvbmVudFN1c3BlbmRlZChmaWJlciwgd2FrZWFibGUsIGxhbmVzKSB7CiAgICB7CiAgICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRTdXNwZW5kZWQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRTdXNwZW5kZWQoZmliZXIsIHdha2VhYmxlLCBsYW5lcyk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKSB7CiAgICB7CiAgICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKSB7CiAgICB7CiAgICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcykgewogICAgewogICAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBtYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCkgewogICAgewogICAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpIHsKICAgIHsKICAgICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBtYXJrUmVuZGVyWWllbGRlZCgpIHsKICAgIHsKICAgICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlcllpZWxkZWQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJZaWVsZGVkKCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya1JlbmRlclN0b3BwZWQoKSB7CiAgICB7CiAgICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RvcHBlZCgpOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIG1hcmtSZW5kZXJTY2hlZHVsZWQobGFuZSkgewogICAgewogICAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSkgewogICAgewogICAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrRm9yY2VVcGRhdGVTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKSB7CiAgICB7CiAgICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTsKICAgICAgfQogICAgfQogIH0KCiAgdmFyIE5vTW9kZSA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAwOyAvLyBUT0RPOiBSZW1vdmUgQ29uY3VycmVudE1vZGUgYnkgcmVhZGluZyBmcm9tIHRoZSByb290IHRhZyBpbnN0ZWFkCgogIHZhciBDb25jdXJyZW50TW9kZSA9CiAgLyogICAgICAgICAgICAgICAgICovCiAgMTsKICB2YXIgUHJvZmlsZU1vZGUgPQogIC8qICAgICAgICAgICAgICAgICAgICAqLwogIDI7CiAgdmFyIFN0cmljdExlZ2FjeU1vZGUgPQogIC8qICAgICAgICAgICAgICAgKi8KICA4OwogIHZhciBTdHJpY3RFZmZlY3RzTW9kZSA9CiAgLyogICAgICAgICAgICAgICovCiAgMTY7CgogIC8vIFRPRE86IFRoaXMgaXMgcHJldHR5IHdlbGwgc3VwcG9ydGVkIGJ5IGJyb3dzZXJzLiBNYXliZSB3ZSBjYW4gZHJvcCBpdC4KICB2YXIgY2x6MzIgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IGNsejMyRmFsbGJhY2s7IC8vIENvdW50IGxlYWRpbmcgemVyb3MuCiAgLy8gQmFzZWQgb246CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9jbHozMgoKICB2YXIgbG9nID0gTWF0aC5sb2c7CiAgdmFyIExOMiA9IE1hdGguTE4yOwoKICBmdW5jdGlvbiBjbHozMkZhbGxiYWNrKHgpIHsKICAgIHZhciBhc1VpbnQgPSB4ID4+PiAwOwoKICAgIGlmIChhc1VpbnQgPT09IDApIHsKICAgICAgcmV0dXJuIDMyOwogICAgfQoKICAgIHJldHVybiAzMSAtIChsb2coYXNVaW50KSAvIExOMiB8IDApIHwgMDsKICB9CgogIC8vIElmIHRob3NlIHZhbHVlcyBhcmUgY2hhbmdlZCB0aGF0IHBhY2thZ2Ugc2hvdWxkIGJlIHJlYnVpbHQgYW5kIHJlZGVwbG95ZWQuCgogIHZhciBUb3RhbExhbmVzID0gMzE7CiAgdmFyIE5vTGFuZXMgPQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAwOwogIHZhciBOb0xhbmUgPQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIDA7CiAgdmFyIFN5bmNMYW5lID0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgMTsKICB2YXIgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSA9CiAgLyogICAgKi8KICAyOwogIHZhciBJbnB1dENvbnRpbnVvdXNMYW5lID0KICAvKiAgICAgICAgICAgICAqLwogIDQ7CiAgdmFyIERlZmF1bHRIeWRyYXRpb25MYW5lID0KICAvKiAgICAgICAgICAgICovCiAgODsKICB2YXIgRGVmYXVsdExhbmUgPQogIC8qICAgICAgICAgICAgICAgICAgICAgKi8KICAxNjsKICB2YXIgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUgPQogIC8qICAgICAgICAgICAgICAgICovCiAgMzI7CiAgdmFyIFRyYW5zaXRpb25MYW5lcyA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICovCiAgNDE5NDI0MDsKICB2YXIgVHJhbnNpdGlvbkxhbmUxID0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgNjQ7CiAgdmFyIFRyYW5zaXRpb25MYW5lMiA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwogIDEyODsKICB2YXIgVHJhbnNpdGlvbkxhbmUzID0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgMjU2OwogIHZhciBUcmFuc2l0aW9uTGFuZTQgPQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KICA1MTI7CiAgdmFyIFRyYW5zaXRpb25MYW5lNSA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwogIDEwMjQ7CiAgdmFyIFRyYW5zaXRpb25MYW5lNiA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwogIDIwNDg7CiAgdmFyIFRyYW5zaXRpb25MYW5lNyA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwogIDQwOTY7CiAgdmFyIFRyYW5zaXRpb25MYW5lOCA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwogIDgxOTI7CiAgdmFyIFRyYW5zaXRpb25MYW5lOSA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwogIDE2Mzg0OwogIHZhciBUcmFuc2l0aW9uTGFuZTEwID0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAzMjc2ODsKICB2YXIgVHJhbnNpdGlvbkxhbmUxMSA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICovCiAgNjU1MzY7CiAgdmFyIFRyYW5zaXRpb25MYW5lMTIgPQogIC8qICAgICAgICAgICAgICAgICAgICAgICAqLwogIDEzMTA3MjsKICB2YXIgVHJhbnNpdGlvbkxhbmUxMyA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICovCiAgMjYyMTQ0OwogIHZhciBUcmFuc2l0aW9uTGFuZTE0ID0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi8KICA1MjQyODg7CiAgdmFyIFRyYW5zaXRpb25MYW5lMTUgPQogIC8qICAgICAgICAgICAgICAgICAgICAgICAqLwogIDEwNDg1NzY7CiAgdmFyIFRyYW5zaXRpb25MYW5lMTYgPQogIC8qICAgICAgICAgICAgICAgICAgICAgICAqLwogIDIwOTcxNTI7CiAgdmFyIFJldHJ5TGFuZXMgPQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgMTMwMDIzNDI0OwogIHZhciBSZXRyeUxhbmUxID0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICA0MTk0MzA0OwogIHZhciBSZXRyeUxhbmUyID0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICA4Mzg4NjA4OwogIHZhciBSZXRyeUxhbmUzID0KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAxNjc3NzIxNjsKICB2YXIgUmV0cnlMYW5lNCA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgMzM1NTQ0MzI7CiAgdmFyIFJldHJ5TGFuZTUgPQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIDY3MTA4ODY0OwogIHZhciBTb21lUmV0cnlMYW5lID0gUmV0cnlMYW5lMTsKICB2YXIgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSA9CiAgLyogICAgICAgICAgKi8KICAxMzQyMTc3Mjg7CiAgdmFyIE5vbklkbGVMYW5lcyA9CiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgMjY4NDM1NDU1OwogIHZhciBJZGxlSHlkcmF0aW9uTGFuZSA9CiAgLyogICAgICAgICAgICAgICAqLwogIDI2ODQzNTQ1NjsKICB2YXIgSWRsZUxhbmUgPQogIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8KICA1MzY4NzA5MTI7CiAgdmFyIE9mZnNjcmVlbkxhbmUgPQogIC8qICAgICAgICAgICAgICAgICAgICovCiAgMTA3Mzc0MTgyNDsgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgZXhwZXJpbWVudGFsIHRpbWVsaW5lIChyZWFjdC1kZXZ0b29scy10aW1lbGluZSkKICAvLyBJdCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIExhbmVzIHZhbHVlcyBhYm92ZS4KCiAgZnVuY3Rpb24gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpIHsKICAgIHsKICAgICAgaWYgKGxhbmUgJiBTeW5jTGFuZSkgewogICAgICAgIHJldHVybiAnU3luYyc7CiAgICAgIH0KCiAgICAgIGlmIChsYW5lICYgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZSkgewogICAgICAgIHJldHVybiAnSW5wdXRDb250aW51b3VzSHlkcmF0aW9uJzsKICAgICAgfQoKICAgICAgaWYgKGxhbmUgJiBJbnB1dENvbnRpbnVvdXNMYW5lKSB7CiAgICAgICAgcmV0dXJuICdJbnB1dENvbnRpbnVvdXMnOwogICAgICB9CgogICAgICBpZiAobGFuZSAmIERlZmF1bHRIeWRyYXRpb25MYW5lKSB7CiAgICAgICAgcmV0dXJuICdEZWZhdWx0SHlkcmF0aW9uJzsKICAgICAgfQoKICAgICAgaWYgKGxhbmUgJiBEZWZhdWx0TGFuZSkgewogICAgICAgIHJldHVybiAnRGVmYXVsdCc7CiAgICAgIH0KCiAgICAgIGlmIChsYW5lICYgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUpIHsKICAgICAgICByZXR1cm4gJ1RyYW5zaXRpb25IeWRyYXRpb24nOwogICAgICB9CgogICAgICBpZiAobGFuZSAmIFRyYW5zaXRpb25MYW5lcykgewogICAgICAgIHJldHVybiAnVHJhbnNpdGlvbic7CiAgICAgIH0KCiAgICAgIGlmIChsYW5lICYgUmV0cnlMYW5lcykgewogICAgICAgIHJldHVybiAnUmV0cnknOwogICAgICB9CgogICAgICBpZiAobGFuZSAmIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUpIHsKICAgICAgICByZXR1cm4gJ1NlbGVjdGl2ZUh5ZHJhdGlvbic7CiAgICAgIH0KCiAgICAgIGlmIChsYW5lICYgSWRsZUh5ZHJhdGlvbkxhbmUpIHsKICAgICAgICByZXR1cm4gJ0lkbGVIeWRyYXRpb24nOwogICAgICB9CgogICAgICBpZiAobGFuZSAmIElkbGVMYW5lKSB7CiAgICAgICAgcmV0dXJuICdJZGxlJzsKICAgICAgfQoKICAgICAgaWYgKGxhbmUgJiBPZmZzY3JlZW5MYW5lKSB7CiAgICAgICAgcmV0dXJuICdPZmZzY3JlZW4nOwogICAgICB9CiAgICB9CiAgfQogIHZhciBOb1RpbWVzdGFtcCA9IC0xOwogIHZhciBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7CiAgdmFyIG5leHRSZXRyeUxhbmUgPSBSZXRyeUxhbmUxOwoKICBmdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhsYW5lcykgewogICAgc3dpdGNoIChnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSkgewogICAgICBjYXNlIFN5bmNMYW5lOgogICAgICAgIHJldHVybiBTeW5jTGFuZTsKCiAgICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZToKICAgICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZTsKCiAgICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZToKICAgICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzTGFuZTsKCiAgICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6CiAgICAgICAgcmV0dXJuIERlZmF1bHRIeWRyYXRpb25MYW5lOwoKICAgICAgY2FzZSBEZWZhdWx0TGFuZToKICAgICAgICByZXR1cm4gRGVmYXVsdExhbmU7CgogICAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lOgogICAgICAgIHJldHVybiBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTsKCiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjoKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lNToKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lODoKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDoKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzoKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjoKICAgICAgICByZXR1cm4gbGFuZXMgJiBUcmFuc2l0aW9uTGFuZXM7CgogICAgICBjYXNlIFJldHJ5TGFuZTE6CiAgICAgIGNhc2UgUmV0cnlMYW5lMjoKICAgICAgY2FzZSBSZXRyeUxhbmUzOgogICAgICBjYXNlIFJldHJ5TGFuZTQ6CiAgICAgIGNhc2UgUmV0cnlMYW5lNToKICAgICAgICByZXR1cm4gbGFuZXMgJiBSZXRyeUxhbmVzOwoKICAgICAgY2FzZSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOgogICAgICAgIHJldHVybiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOwoKICAgICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZToKICAgICAgICByZXR1cm4gSWRsZUh5ZHJhdGlvbkxhbmU7CgogICAgICBjYXNlIElkbGVMYW5lOgogICAgICAgIHJldHVybiBJZGxlTGFuZTsKCiAgICAgIGNhc2UgT2Zmc2NyZWVuTGFuZToKICAgICAgICByZXR1cm4gT2Zmc2NyZWVuTGFuZTsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgewogICAgICAgICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpOwogICAgICAgIH0gLy8gVGhpcyBzaG91bGRuJ3QgYmUgcmVhY2hhYmxlLCBidXQgYXMgYSBmYWxsYmFjaywgcmV0dXJuIHRoZSBlbnRpcmUgYml0bWFzay4KCgogICAgICAgIHJldHVybiBsYW5lczsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGdldE5leHRMYW5lcyhyb290LCB3aXBMYW5lcykgewogICAgLy8gRWFybHkgYmFpbG91dCBpZiB0aGVyZSdzIG5vIHBlbmRpbmcgd29yayBsZWZ0LgogICAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzOwoKICAgIGlmIChwZW5kaW5nTGFuZXMgPT09IE5vTGFuZXMpIHsKICAgICAgcmV0dXJuIE5vTGFuZXM7CiAgICB9CgogICAgdmFyIG5leHRMYW5lcyA9IE5vTGFuZXM7CiAgICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzOwogICAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lczsgLy8gRG8gbm90IHdvcmsgb24gYW55IGlkbGUgd29yayB1bnRpbCBhbGwgdGhlIG5vbi1pZGxlIHdvcmsgaGFzIGZpbmlzaGVkLAogICAgLy8gZXZlbiBpZiB0aGUgd29yayBpcyBzdXNwZW5kZWQuCgogICAgdmFyIG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiBOb25JZGxlTGFuZXM7CgogICAgaWYgKG5vbklkbGVQZW5kaW5nTGFuZXMgIT09IE5vTGFuZXMpIHsKICAgICAgdmFyIG5vbklkbGVVbmJsb2NrZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7CgogICAgICBpZiAobm9uSWRsZVVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7CiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVVuYmxvY2tlZExhbmVzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgbm9uSWRsZVBpbmdlZExhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIHBpbmdlZExhbmVzOwoKICAgICAgICBpZiAobm9uSWRsZVBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7CiAgICAgICAgICBuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlUGluZ2VkTGFuZXMpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIHdvcmsgaXMgSWRsZS4KICAgICAgdmFyIHVuYmxvY2tlZExhbmVzID0gcGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzOwoKICAgICAgaWYgKHVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7CiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXModW5ibG9ja2VkTGFuZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChwaW5nZWRMYW5lcyAhPT0gTm9MYW5lcykgewogICAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHsKICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGFibGUgaWYgd2UncmUgc3VzcGVuZGVkCiAgICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgaW4gdGhpcyBwYXRoIGlmIGEgZmFsbGJhY2sgdGltZXIgaXMgbm90IHNjaGVkdWxlZC4KICAgICAgcmV0dXJuIE5vTGFuZXM7CiAgICB9IC8vIElmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiBhIHJlbmRlciwgc3dpdGNoaW5nIGxhbmVzIHdpbGwgaW50ZXJydXB0CiAgICAvLyBpdCBhbmQgd2UnbGwgbG9zZSBvdXIgcHJvZ3Jlc3MuIFdlIHNob3VsZCBvbmx5IGRvIHRoaXMgaWYgdGhlIG5ldyBsYW5lcyBhcmUKICAgIC8vIGhpZ2hlciBwcmlvcml0eS4KCgogICAgaWYgKHdpcExhbmVzICE9PSBOb0xhbmVzICYmIHdpcExhbmVzICE9PSBuZXh0TGFuZXMgJiYgLy8gSWYgd2UgYWxyZWFkeSBzdXNwZW5kZWQgd2l0aCBhIGRlbGF5LCB0aGVuIGludGVycnVwdGluZyBpcyBmaW5lLiBEb24ndAogICAgLy8gYm90aGVyIHdhaXRpbmcgdW50aWwgdGhlIHJvb3QgaXMgY29tcGxldGUuCiAgICAod2lwTGFuZXMgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMpIHsKICAgICAgdmFyIG5leHRMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShuZXh0TGFuZXMpOwogICAgICB2YXIgd2lwTGFuZSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUod2lwTGFuZXMpOwoKICAgICAgaWYgKCAvLyBUZXN0cyB3aGV0aGVyIHRoZSBuZXh0IGxhbmUgaXMgZXF1YWwgb3IgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgd2lwCiAgICAgIC8vIG9uZS4gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXRzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LgogICAgICBuZXh0TGFuZSA+PSB3aXBMYW5lIHx8IC8vIERlZmF1bHQgcHJpb3JpdHkgdXBkYXRlcyBzaG91bGQgbm90IGludGVycnVwdCB0cmFuc2l0aW9uIHVwZGF0ZXMuIFRoZQogICAgICAvLyBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBkZWZhdWx0IHVwZGF0ZXMgYW5kIHRyYW5zaXRpb24gdXBkYXRlcyBpcyB0aGF0CiAgICAgIC8vIGRlZmF1bHQgdXBkYXRlcyBkbyBub3Qgc3VwcG9ydCByZWZyZXNoIHRyYW5zaXRpb25zLgogICAgICBuZXh0TGFuZSA9PT0gRGVmYXVsdExhbmUgJiYgKHdpcExhbmUgJiBUcmFuc2l0aW9uTGFuZXMpICE9PSBOb0xhbmVzKSB7CiAgICAgICAgLy8gS2VlcCB3b3JraW5nIG9uIHRoZSBleGlzdGluZyBpbi1wcm9ncmVzcyB0cmVlLiBEbyBub3QgaW50ZXJydXB0LgogICAgICAgIHJldHVybiB3aXBMYW5lczsKICAgICAgfQogICAgfQoKICAgIGlmICgobmV4dExhbmVzICYgSW5wdXRDb250aW51b3VzTGFuZSkgIT09IE5vTGFuZXMpIHsKICAgICAgLy8gV2hlbiB1cGRhdGVzIGFyZSBzeW5jIGJ5IGRlZmF1bHQsIHdlIGVudGFuZ2xlIGNvbnRpbnVvdXMgcHJpb3JpdHkgdXBkYXRlcwogICAgICAvLyBhbmQgZGVmYXVsdCB1cGRhdGVzLCBzbyB0aGV5IHJlbmRlciBpbiB0aGUgc2FtZSBiYXRjaC4gVGhlIG9ubHkgcmVhc29uCiAgICAgIC8vIHRoZXkgdXNlIHNlcGFyYXRlIGxhbmVzIGlzIGJlY2F1c2UgY29udGludW91cyB1cGRhdGVzIHNob3VsZCBpbnRlcnJ1cHQKICAgICAgLy8gdHJhbnNpdGlvbnMsIGJ1dCBkZWZhdWx0IHVwZGF0ZXMgc2hvdWxkIG5vdC4KICAgICAgbmV4dExhbmVzIHw9IHBlbmRpbmdMYW5lcyAmIERlZmF1bHRMYW5lOwogICAgfSAvLyBDaGVjayBmb3IgZW50YW5nbGVkIGxhbmVzIGFuZCBhZGQgdGhlbSB0byB0aGUgYmF0Y2guCiAgICAvLwogICAgLy8gQSBsYW5lIGlzIHNhaWQgdG8gYmUgZW50YW5nbGVkIHdpdGggYW5vdGhlciB3aGVuIGl0J3Mgbm90IGFsbG93ZWQgdG8gcmVuZGVyCiAgICAvLyBpbiBhIGJhdGNoIHRoYXQgZG9lcyBub3QgYWxzbyBpbmNsdWRlIHRoZSBvdGhlciBsYW5lLiBUeXBpY2FsbHkgd2UgZG8gdGhpcwogICAgLy8gd2hlbiBtdWx0aXBsZSB1cGRhdGVzIGhhdmUgdGhlIHNhbWUgc291cmNlLCBhbmQgd2Ugb25seSB3YW50IHRvIHJlc3BvbmQgdG8KICAgIC8vIHRoZSBtb3N0IHJlY2VudCBldmVudCBmcm9tIHRoYXQgc291cmNlLgogICAgLy8KICAgIC8vIE5vdGUgdGhhdCB3ZSBhcHBseSBlbnRhbmdsZW1lbnRzICphZnRlciogY2hlY2tpbmcgZm9yIHBhcnRpYWwgd29yayBhYm92ZS4KICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBpZiBhIGxhbmUgaXMgZW50YW5nbGVkIGR1cmluZyBhbiBpbnRlcmxlYXZlZCBldmVudCB3aGlsZQogICAgLy8gaXQncyBhbHJlYWR5IHJlbmRlcmluZywgd2Ugd29uJ3QgaW50ZXJydXB0IGl0LiBUaGlzIGlzIGludGVudGlvbmFsLCBzaW5jZQogICAgLy8gZW50YW5nbGVtZW50IGlzIHVzdWFsbHkgImJlc3QgZWZmb3J0Ijogd2UnbGwgdHJ5IG91ciBiZXN0IHRvIHJlbmRlciB0aGUKICAgIC8vIGxhbmVzIGluIHRoZSBzYW1lIGJhdGNoLCBidXQgaXQncyBub3Qgd29ydGggdGhyb3dpbmcgb3V0IHBhcnRpYWxseQogICAgLy8gY29tcGxldGVkIHdvcmsgaW4gb3JkZXIgdG8gZG8gaXQuCiAgICAvLyBUT0RPOiBSZWNvbnNpZGVyIHRoaXMuIFRoZSBjb3VudGVyLWFyZ3VtZW50IGlzIHRoYXQgdGhlIHBhcnRpYWwgd29yawogICAgLy8gcmVwcmVzZW50cyBhbiBpbnRlcm1lZGlhdGUgc3RhdGUsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gc2hvdyB0byB0aGUgdXNlci4KICAgIC8vIEFuZCBieSBzcGVuZGluZyBleHRyYSB0aW1lIGZpbmlzaGluZyBpdCwgd2UncmUgaW5jcmVhc2luZyB0aGUgYW1vdW50IG9mCiAgICAvLyB0aW1lIGl0IHRha2VzIHRvIHNob3cgdGhlIGZpbmFsIHN0YXRlLCB3aGljaCBpcyB3aGF0IHRoZXkgYXJlIGFjdHVhbGx5CiAgICAvLyB3YWl0aW5nIGZvci4KICAgIC8vCiAgICAvLyBGb3IgdGhvc2UgZXhjZXB0aW9ucyB3aGVyZSBlbnRhbmdsZW1lbnQgaXMgc2VtYW50aWNhbGx5IGltcG9ydGFudCwgbGlrZQogICAgLy8gdXNlTXV0YWJsZVNvdXJjZSwgd2Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoZXJlIGlzIG5vIHBhcnRpYWwgd29yayBhdCB0aGUKICAgIC8vIHRpbWUgd2UgYXBwbHkgdGhlIGVudGFuZ2xlbWVudC4KCgogICAgdmFyIGVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lczsKCiAgICBpZiAoZW50YW5nbGVkTGFuZXMgIT09IE5vTGFuZXMpIHsKICAgICAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7CiAgICAgIHZhciBsYW5lcyA9IG5leHRMYW5lcyAmIGVudGFuZ2xlZExhbmVzOwoKICAgICAgd2hpbGUgKGxhbmVzID4gMCkgewogICAgICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpOwogICAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDsKICAgICAgICBuZXh0TGFuZXMgfD0gZW50YW5nbGVtZW50c1tpbmRleF07CiAgICAgICAgbGFuZXMgJj0gfmxhbmU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbmV4dExhbmVzOwogIH0KICBmdW5jdGlvbiBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKSB7CiAgICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lczsKICAgIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7CgogICAgd2hpbGUgKGxhbmVzID4gMCkgewogICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTsKICAgICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4OwogICAgICB2YXIgZXZlbnRUaW1lID0gZXZlbnRUaW1lc1tpbmRleF07CgogICAgICBpZiAoZXZlbnRUaW1lID4gbW9zdFJlY2VudEV2ZW50VGltZSkgewogICAgICAgIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBldmVudFRpbWU7CiAgICAgIH0KCiAgICAgIGxhbmVzICY9IH5sYW5lOwogICAgfQoKICAgIHJldHVybiBtb3N0UmVjZW50RXZlbnRUaW1lOwogIH0KCiAgZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKSB7CiAgICBzd2l0Y2ggKGxhbmUpIHsKICAgICAgY2FzZSBTeW5jTGFuZToKICAgICAgY2FzZSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOgogICAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6CiAgICAgICAgLy8gVXNlciBpbnRlcmFjdGlvbnMgc2hvdWxkIGV4cGlyZSBzbGlnaHRseSBtb3JlIHF1aWNrbHkuCiAgICAgICAgLy8KICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBjb25zdGFudCBhcyBpbiBTY2hlZHVsZXIuanMuCiAgICAgICAgLy8gV2hlbiB3ZSBtYWRlIGl0IGxhcmdlciwgYSBwcm9kdWN0IG1ldHJpYyBpbiB3d3cgcmVncmVzc2VkLCBzdWdnZXN0aW5nCiAgICAgICAgLy8gdGhlcmUncyBhIHVzZXIgaW50ZXJhY3Rpb24gdGhhdCdzIGJlaW5nIHN0YXJ2ZWQgYnkgYSBzZXJpZXMgb2YKICAgICAgICAvLyBzeW5jaHJvbm91cyB1cGRhdGVzLiBJZiB0aGF0IHRoZW9yeSBpcyBjb3JyZWN0LCB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzCiAgICAgICAgLy8gdG8gZml4IHRoZSBzdGFydmF0aW9uLiBIb3dldmVyLCB0aGlzIHNjZW5hcmlvIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXQKICAgICAgICAvLyBleHBpcmF0aW9uIHRpbWVzIGFyZSBhbiBpbXBvcnRhbnQgc2FmZWd1YXJkIHdoZW4gc3RhcnZhdGlvbgogICAgICAgIC8vIGRvZXMgaGFwcGVuLgogICAgICAgIHJldHVybiBjdXJyZW50VGltZSArIDI1MDsKCiAgICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6CiAgICAgIGNhc2UgRGVmYXVsdExhbmU6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmU6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjoKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTM6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lNToKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTY6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lODoKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTk6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDoKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTI6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzoKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTU6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjoKICAgICAgICByZXR1cm4gY3VycmVudFRpbWUgKyA1MDAwOwoKICAgICAgY2FzZSBSZXRyeUxhbmUxOgogICAgICBjYXNlIFJldHJ5TGFuZTI6CiAgICAgIGNhc2UgUmV0cnlMYW5lMzoKICAgICAgY2FzZSBSZXRyeUxhbmU0OgogICAgICBjYXNlIFJldHJ5TGFuZTU6CiAgICAgICAgLy8gVE9ETzogUmV0cmllcyBzaG91bGQgYmUgYWxsb3dlZCB0byBleHBpcmUgaWYgdGhleSBhcmUgQ1BVIGJvdW5kIGZvcgogICAgICAgIC8vIHRvbyBsb25nLCBidXQgd2hlbiBJIG1hZGUgdGhpcyBjaGFuZ2UgaXQgY2F1c2VkIGEgc3Bpa2UgaW4gYnJvd3NlcgogICAgICAgIC8vIGNyYXNoZXMuIFRoZXJlIG11c3QgYmUgc29tZSBvdGhlciB1bmRlcmx5aW5nIGJ1Zzsgbm90IHN1cGVyIHVyZ2VudCBidXQKICAgICAgICAvLyBpZGVhbGx5IHNob3VsZCBmaWd1cmUgb3V0IHdoeSBhbmQgZml4IGl0LiBVbmZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmUKICAgICAgICAvLyBhIHJlcHJvIGZvciB0aGUgY3Jhc2hlcywgb25seSBkZXRlY3RlZCB2aWEgcHJvZHVjdGlvbiBtZXRyaWNzLgogICAgICAgIHJldHVybiBOb1RpbWVzdGFtcDsKCiAgICAgIGNhc2UgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZToKICAgICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZToKICAgICAgY2FzZSBJZGxlTGFuZToKICAgICAgY2FzZSBPZmZzY3JlZW5MYW5lOgogICAgICAgIC8vIEFueXRoaW5nIGlkbGUgcHJpb3JpdHkgb3IgbG93ZXIgc2hvdWxkIG5ldmVyIGV4cGlyZS4KICAgICAgICByZXR1cm4gTm9UaW1lc3RhbXA7CgogICAgICBkZWZhdWx0OgogICAgICAgIHsKICAgICAgICAgIGVycm9yKCdTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBOb1RpbWVzdGFtcDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIG1hcmtTdGFydmVkTGFuZXNBc0V4cGlyZWQocm9vdCwgY3VycmVudFRpbWUpIHsKICAgIC8vIFRPRE86IFRoaXMgZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB3ZSB5aWVsZC4gV2UgY2FuIG9wdGltaXplIGJ5IHN0b3JpbmcKICAgIC8vIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUgb24gdGhlIHJvb3QuIFRoZW4gdXNlIHRoYXQgdG8gcXVpY2tseSBiYWlsIG91dAogICAgLy8gb2YgdGhpcyBmdW5jdGlvbi4KICAgIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lczsKICAgIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7CiAgICB2YXIgcGluZ2VkTGFuZXMgPSByb290LnBpbmdlZExhbmVzOwogICAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBlbmRpbmcgbGFuZXMgYW5kIGNoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlaXIKICAgIC8vIGV4cGlyYXRpb24gdGltZS4gSWYgc28sIHdlJ2xsIGFzc3VtZSB0aGUgdXBkYXRlIGlzIGJlaW5nIHN0YXJ2ZWQgYW5kIG1hcmsKICAgIC8vIGl0IGFzIGV4cGlyZWQgdG8gZm9yY2UgaXQgdG8gZmluaXNoLgoKICAgIHZhciBsYW5lcyA9IHBlbmRpbmdMYW5lczsKCiAgICB3aGlsZSAobGFuZXMgPiAwKSB7CiAgICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpOwogICAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7CiAgICAgIHZhciBleHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lc1tpbmRleF07CgogICAgICBpZiAoZXhwaXJhdGlvblRpbWUgPT09IE5vVGltZXN0YW1wKSB7CiAgICAgICAgLy8gRm91bmQgYSBwZW5kaW5nIGxhbmUgd2l0aCBubyBleHBpcmF0aW9uIHRpbWUuIElmIGl0J3Mgbm90IHN1c3BlbmRlZCwgb3IKICAgICAgICAvLyBpZiBpdCdzIHBpbmdlZCwgYXNzdW1lIGl0J3MgQ1BVLWJvdW5kLiBDb21wdXRlIGEgbmV3IGV4cGlyYXRpb24gdGltZQogICAgICAgIC8vIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUuCiAgICAgICAgaWYgKChsYW5lICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzIHx8IChsYW5lICYgcGluZ2VkTGFuZXMpICE9PSBOb0xhbmVzKSB7CiAgICAgICAgICAvLyBBc3N1bWVzIHRpbWVzdGFtcHMgYXJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4KICAgICAgICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChleHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZSkgewogICAgICAgIC8vIFRoaXMgbGFuZSBleHBpcmVkCiAgICAgICAgcm9vdC5leHBpcmVkTGFuZXMgfD0gbGFuZTsKICAgICAgfQoKICAgICAgbGFuZXMgJj0gfmxhbmU7CiAgICB9CiAgfSAvLyBUaGlzIHJldHVybnMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcGVuZGluZyBsYW5lcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleQogIC8vIGFyZSBzdXNwZW5kZWQuCgogIGZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eVBlbmRpbmdMYW5lcyhyb290KSB7CiAgICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocm9vdC5wZW5kaW5nTGFuZXMpOwogIH0KICBmdW5jdGlvbiBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KSB7CiAgICB2YXIgZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiA9IHJvb3QucGVuZGluZ0xhbmVzICYgfk9mZnNjcmVlbkxhbmU7CgogICAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gIT09IE5vTGFuZXMpIHsKICAgICAgcmV0dXJuIGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW47CiAgICB9CgogICAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gJiBPZmZzY3JlZW5MYW5lKSB7CiAgICAgIHJldHVybiBPZmZzY3JlZW5MYW5lOwogICAgfQoKICAgIHJldHVybiBOb0xhbmVzOwogIH0KICBmdW5jdGlvbiBpbmNsdWRlc1N5bmNMYW5lKGxhbmVzKSB7CiAgICByZXR1cm4gKGxhbmVzICYgU3luY0xhbmUpICE9PSBOb0xhbmVzOwogIH0KICBmdW5jdGlvbiBpbmNsdWRlc05vbklkbGVXb3JrKGxhbmVzKSB7CiAgICByZXR1cm4gKGxhbmVzICYgTm9uSWRsZUxhbmVzKSAhPT0gTm9MYW5lczsKICB9CiAgZnVuY3Rpb24gaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgewogICAgcmV0dXJuIChsYW5lcyAmIFJldHJ5TGFuZXMpID09PSBsYW5lczsKICB9CiAgZnVuY3Rpb24gaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMobGFuZXMpIHsKICAgIHZhciBVcmdlbnRMYW5lcyA9IFN5bmNMYW5lIHwgSW5wdXRDb250aW51b3VzTGFuZSB8IERlZmF1bHRMYW5lOwogICAgcmV0dXJuIChsYW5lcyAmIFVyZ2VudExhbmVzKSA9PT0gTm9MYW5lczsKICB9CiAgZnVuY3Rpb24gaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpIHsKICAgIHJldHVybiAobGFuZXMgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBsYW5lczsKICB9CiAgZnVuY3Rpb24gaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpIHsKCiAgICB2YXIgU3luY0RlZmF1bHRMYW5lcyA9IElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUgfCBJbnB1dENvbnRpbnVvdXNMYW5lIHwgRGVmYXVsdEh5ZHJhdGlvbkxhbmUgfCBEZWZhdWx0TGFuZTsKICAgIHJldHVybiAobGFuZXMgJiBTeW5jRGVmYXVsdExhbmVzKSAhPT0gTm9MYW5lczsKICB9CiAgZnVuY3Rpb24gaW5jbHVkZXNFeHBpcmVkTGFuZShyb290LCBsYW5lcykgewogICAgLy8gVGhpcyBpcyBhIHNlcGFyYXRlIGNoZWNrIGZyb20gaW5jbHVkZXNCbG9ja2luZ0xhbmUgYmVjYXVzZSBhIGxhbmUgY2FuCiAgICAvLyBleHBpcmUgYWZ0ZXIgYSByZW5kZXIgaGFzIGFscmVhZHkgc3RhcnRlZC4KICAgIHJldHVybiAobGFuZXMgJiByb290LmV4cGlyZWRMYW5lcykgIT09IE5vTGFuZXM7CiAgfQogIGZ1bmN0aW9uIGlzVHJhbnNpdGlvbkxhbmUobGFuZSkgewogICAgcmV0dXJuIChsYW5lICYgVHJhbnNpdGlvbkxhbmVzKSAhPT0gTm9MYW5lczsKICB9CiAgZnVuY3Rpb24gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKSB7CiAgICAvLyBDeWNsZSB0aHJvdWdoIHRoZSBsYW5lcywgYXNzaWduaW5nIGVhY2ggbmV3IHRyYW5zaXRpb24gdG8gdGhlIG5leHQgbGFuZS4KICAgIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgbWVhbnMgZXZlcnkgdHJhbnNpdGlvbiBnZXRzIGl0cyBvd24gbGFuZSwgdW50aWwgd2UKICAgIC8vIHJ1biBvdXQgb2YgbGFuZXMgYW5kIGN5Y2xlIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4KICAgIHZhciBsYW5lID0gbmV4dFRyYW5zaXRpb25MYW5lOwogICAgbmV4dFRyYW5zaXRpb25MYW5lIDw8PSAxOwoKICAgIGlmICgobmV4dFRyYW5zaXRpb25MYW5lICYgVHJhbnNpdGlvbkxhbmVzKSA9PT0gTm9MYW5lcykgewogICAgICBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7CiAgICB9CgogICAgcmV0dXJuIGxhbmU7CiAgfQogIGZ1bmN0aW9uIGNsYWltTmV4dFJldHJ5TGFuZSgpIHsKICAgIHZhciBsYW5lID0gbmV4dFJldHJ5TGFuZTsKICAgIG5leHRSZXRyeUxhbmUgPDw9IDE7CgogICAgaWYgKChuZXh0UmV0cnlMYW5lICYgUmV0cnlMYW5lcykgPT09IE5vTGFuZXMpIHsKICAgICAgbmV4dFJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7CiAgICB9CgogICAgcmV0dXJuIGxhbmU7CiAgfQogIGZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpIHsKICAgIHJldHVybiBsYW5lcyAmIC1sYW5lczsKICB9CiAgZnVuY3Rpb24gcGlja0FyYml0cmFyeUxhbmUobGFuZXMpIHsKICAgIC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBnZXRzIGlubGluZWQuIE9ubHkgZXhpc3RzIHNvIHRvIGNvbW11bmljYXRlIHRoYXQgaXQKICAgIC8vIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGJpdCBpcyBzZWxlY3RlZDsgeW91IGNhbiBwaWNrIGFueSBiaXQgd2l0aG91dAogICAgLy8gYWZmZWN0aW5nIHRoZSBhbGdvcml0aG1zIHdoZXJlIGl0cyB1c2VkLiBIZXJlIEknbSB1c2luZwogICAgLy8gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBmZXdlc3Qgb3BlcmF0aW9ucy4KICAgIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTsKICB9CgogIGZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpIHsKICAgIHJldHVybiAzMSAtIGNsejMyKGxhbmVzKTsKICB9CgogIGZ1bmN0aW9uIGxhbmVUb0luZGV4KGxhbmUpIHsKICAgIHJldHVybiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmUpOwogIH0KCiAgZnVuY3Rpb24gaW5jbHVkZXNTb21lTGFuZShhLCBiKSB7CiAgICByZXR1cm4gKGEgJiBiKSAhPT0gTm9MYW5lczsKICB9CiAgZnVuY3Rpb24gaXNTdWJzZXRPZkxhbmVzKHNldCwgc3Vic2V0KSB7CiAgICByZXR1cm4gKHNldCAmIHN1YnNldCkgPT09IHN1YnNldDsKICB9CiAgZnVuY3Rpb24gbWVyZ2VMYW5lcyhhLCBiKSB7CiAgICByZXR1cm4gYSB8IGI7CiAgfQogIGZ1bmN0aW9uIHJlbW92ZUxhbmVzKHNldCwgc3Vic2V0KSB7CiAgICByZXR1cm4gc2V0ICYgfnN1YnNldDsKICB9CiAgZnVuY3Rpb24gaW50ZXJzZWN0TGFuZXMoYSwgYikgewogICAgcmV0dXJuIGEgJiBiOwogIH0gLy8gU2VlbXMgcmVkdW5kYW50LCBidXQgaXQgY2hhbmdlcyB0aGUgdHlwZSBmcm9tIGEgc2luZ2xlIGxhbmUgKHVzZWQgZm9yCiAgLy8gdXBkYXRlcykgdG8gYSBncm91cCBvZiBsYW5lcyAodXNlZCBmb3IgZmx1c2hpbmcgd29yaykuCgogIGZ1bmN0aW9uIGxhbmVUb0xhbmVzKGxhbmUpIHsKICAgIHJldHVybiBsYW5lOwogIH0KICBmdW5jdGlvbiBoaWdoZXJQcmlvcml0eUxhbmUoYSwgYikgewogICAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXQgcmFuZ2VzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LgogICAgcmV0dXJuIGEgIT09IE5vTGFuZSAmJiBhIDwgYiA/IGEgOiBiOwogIH0KICBmdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHsKICAgIC8vIEludGVudGlvbmFsbHkgcHVzaGluZyBvbmUgYnkgb25lLgogICAgLy8gaHR0cHM6Ly92OC5kZXYvYmxvZy9lbGVtZW50cy1raW5kcyNhdm9pZC1jcmVhdGluZy1ob2xlcwogICAgdmFyIGxhbmVNYXAgPSBbXTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IFRvdGFsTGFuZXM7IGkrKykgewogICAgICBsYW5lTWFwLnB1c2goaW5pdGlhbCk7CiAgICB9CgogICAgcmV0dXJuIGxhbmVNYXA7CiAgfQogIGZ1bmN0aW9uIG1hcmtSb290VXBkYXRlZChyb290LCB1cGRhdGVMYW5lLCBldmVudFRpbWUpIHsKICAgIHJvb3QucGVuZGluZ0xhbmVzIHw9IHVwZGF0ZUxhbmU7IC8vIElmIHRoZXJlIGFyZSBhbnkgc3VzcGVuZGVkIHRyYW5zaXRpb25zLCBpdCdzIHBvc3NpYmxlIHRoaXMgbmV3IHVwZGF0ZQogICAgLy8gY291bGQgdW5ibG9jayB0aGVtLiBDbGVhciB0aGUgc3VzcGVuZGVkIGxhbmVzIHNvIHRoYXQgd2UgY2FuIHRyeSByZW5kZXJpbmcKICAgIC8vIHRoZW0gYWdhaW4uCiAgICAvLwogICAgLy8gVE9ETzogV2UgcmVhbGx5IG9ubHkgbmVlZCB0byB1bnN1c3BlbmQgb25seSBsYW5lcyB0aGF0IGFyZSBpbiB0aGUKICAgIC8vIGBzdWJ0cmVlTGFuZXNgIG9mIHRoZSB1cGRhdGVkIGZpYmVyLCBvciB0aGUgdXBkYXRlIGxhbmVzIG9mIHRoZSByZXR1cm4KICAgIC8vIHBhdGguIFRoaXMgd291bGQgZXhjbHVkZSBzdXNwZW5kZWQgdXBkYXRlcyBpbiBhbiB1bnJlbGF0ZWQgc2libGluZyB0cmVlLAogICAgLy8gc2luY2UgdGhlcmUncyBubyB3YXkgZm9yIHRoaXMgdXBkYXRlIHRvIHVuYmxvY2sgaXQuCiAgICAvLwogICAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpZiB0aGUgaW5jb21pbmcgdXBkYXRlIGlzIGlkbGUsIGJlY2F1c2Ugd2UgbmV2ZXIgcHJvY2VzcwogICAgLy8gaWRsZSB1cGRhdGVzIHVudGlsIGFmdGVyIGFsbCB0aGUgcmVndWxhciB1cGRhdGVzIGhhdmUgZmluaXNoZWQ7IHRoZXJlJ3Mgbm8KICAgIC8vIHdheSBpdCBjb3VsZCB1bmJsb2NrIGEgdHJhbnNpdGlvbi4KCiAgICBpZiAodXBkYXRlTGFuZSAhPT0gSWRsZUxhbmUpIHsKICAgICAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7CiAgICAgIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzOwogICAgfQoKICAgIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzOwogICAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgodXBkYXRlTGFuZSk7IC8vIFdlIGNhbiBhbHdheXMgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRpbWVzdGFtcCBiZWNhdXNlIHdlIHByZWZlciB0aGUgbW9zdAogICAgLy8gcmVjZW50IGV2ZW50LCBhbmQgd2UgYXNzdW1lIHRpbWUgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLgoKICAgIGV2ZW50VGltZXNbaW5kZXhdID0gZXZlbnRUaW1lOwogIH0KICBmdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcykgewogICAgcm9vdC5zdXNwZW5kZWRMYW5lcyB8PSBzdXNwZW5kZWRMYW5lczsKICAgIHJvb3QucGluZ2VkTGFuZXMgJj0gfnN1c3BlbmRlZExhbmVzOyAvLyBUaGUgc3VzcGVuZGVkIGxhbmVzIGFyZSBubyBsb25nZXIgQ1BVLWJvdW5kLiBDbGVhciB0aGVpciBleHBpcmF0aW9uIHRpbWVzLgoKICAgIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsKICAgIHZhciBsYW5lcyA9IHN1c3BlbmRlZExhbmVzOwoKICAgIHdoaWxlIChsYW5lcyA+IDApIHsKICAgICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7CiAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDsKICAgICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wOwogICAgICBsYW5lcyAmPSB+bGFuZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMsIGV2ZW50VGltZSkgewogICAgcm9vdC5waW5nZWRMYW5lcyB8PSByb290LnN1c3BlbmRlZExhbmVzICYgcGluZ2VkTGFuZXM7CiAgfQogIGZ1bmN0aW9uIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpIHsKICAgIHZhciBub0xvbmdlclBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzICYgfnJlbWFpbmluZ0xhbmVzOwogICAgcm9vdC5wZW5kaW5nTGFuZXMgPSByZW1haW5pbmdMYW5lczsgLy8gTGV0J3MgdHJ5IGV2ZXJ5dGhpbmcgYWdhaW4KCiAgICByb290LnN1c3BlbmRlZExhbmVzID0gTm9MYW5lczsKICAgIHJvb3QucGluZ2VkTGFuZXMgPSBOb0xhbmVzOwogICAgcm9vdC5leHBpcmVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7CiAgICByb290Lm11dGFibGVSZWFkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7CiAgICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzOwogICAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7CiAgICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lczsKICAgIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gQ2xlYXIgdGhlIGxhbmVzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgcGVuZGluZyB3b3JrCgogICAgdmFyIGxhbmVzID0gbm9Mb25nZXJQZW5kaW5nTGFuZXM7CgogICAgd2hpbGUgKGxhbmVzID4gMCkgewogICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTsKICAgICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4OwogICAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IE5vTGFuZXM7CiAgICAgIGV2ZW50VGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7CiAgICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDsKICAgICAgbGFuZXMgJj0gfmxhbmU7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGVudGFuZ2xlZExhbmVzKSB7CiAgICAvLyBJbiBhZGRpdGlvbiB0byBlbnRhbmdsaW5nIGVhY2ggb2YgdGhlIGdpdmVuIGxhbmVzIHdpdGggZWFjaCBvdGhlciwgd2UgYWxzbwogICAgLy8gaGF2ZSB0byBjb25zaWRlciBfdHJhbnNpdGl2ZV8gZW50YW5nbGVtZW50cy4gRm9yIGVhY2ggbGFuZSB0aGF0IGlzIGFscmVhZHkKICAgIC8vIGVudGFuZ2xlZCB3aXRoICphbnkqIG9mIHRoZSBnaXZlbiBsYW5lcywgdGhhdCBsYW5lIGlzIG5vdyB0cmFuc2l0aXZlbHkKICAgIC8vIGVudGFuZ2xlZCB3aXRoICphbGwqIHRoZSBnaXZlbiBsYW5lcy4KICAgIC8vCiAgICAvLyBUcmFuc2xhdGVkOiBJZiBDIGlzIGVudGFuZ2xlZCB3aXRoIEEsIHRoZW4gZW50YW5nbGluZyBBIHdpdGggQiBhbHNvCiAgICAvLyBlbnRhbmdsZXMgQyB3aXRoIEIuCiAgICAvLwogICAgLy8gSWYgdGhpcyBpcyBoYXJkIHRvIGdyYXNwLCBpdCBtaWdodCBoZWxwIHRvIGludGVudGlvbmFsbHkgYnJlYWsgdGhpcwogICAgLy8gZnVuY3Rpb24gYW5kIGxvb2sgYXQgdGhlIHRlc3RzIHRoYXQgZmFpbCBpbiBSZWFjdFRyYW5zaXRpb24tdGVzdC5qcy4gVHJ5CiAgICAvLyBjb21tZW50aW5nIG91dCBvbmUgb2YgdGhlIGNvbmRpdGlvbnMgYmVsb3cuCiAgICB2YXIgcm9vdEVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcyB8PSBlbnRhbmdsZWRMYW5lczsKICAgIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzOwogICAgdmFyIGxhbmVzID0gcm9vdEVudGFuZ2xlZExhbmVzOwoKICAgIHdoaWxlIChsYW5lcykgewogICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTsKICAgICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4OwoKICAgICAgaWYgKCAvLyBJcyB0aGlzIG9uZSBvZiB0aGUgbmV3bHkgZW50YW5nbGVkIGxhbmVzPwogICAgICBsYW5lICYgZW50YW5nbGVkTGFuZXMgfCAvLyBJcyB0aGlzIGxhbmUgdHJhbnNpdGl2ZWx5IGVudGFuZ2xlZCB3aXRoIHRoZSBuZXdseSBlbnRhbmdsZWQgbGFuZXM/CiAgICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdICYgZW50YW5nbGVkTGFuZXMpIHsKICAgICAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSB8PSBlbnRhbmdsZWRMYW5lczsKICAgICAgfQoKICAgICAgbGFuZXMgJj0gfmxhbmU7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb24ocm9vdCwgcmVuZGVyTGFuZXMpIHsKICAgIHZhciByZW5kZXJMYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShyZW5kZXJMYW5lcyk7CiAgICB2YXIgbGFuZTsKCiAgICBzd2l0Y2ggKHJlbmRlckxhbmUpIHsKICAgICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOgogICAgICAgIGxhbmUgPSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBEZWZhdWx0TGFuZToKICAgICAgICBsYW5lID0gRGVmYXVsdEh5ZHJhdGlvbkxhbmU7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lMToKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTI6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDoKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTU6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzoKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTg6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMToKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6CiAgICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNDoKICAgICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OgogICAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6CiAgICAgIGNhc2UgUmV0cnlMYW5lMToKICAgICAgY2FzZSBSZXRyeUxhbmUyOgogICAgICBjYXNlIFJldHJ5TGFuZTM6CiAgICAgIGNhc2UgUmV0cnlMYW5lNDoKICAgICAgY2FzZSBSZXRyeUxhbmU1OgogICAgICAgIGxhbmUgPSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgSWRsZUxhbmU6CiAgICAgICAgbGFuZSA9IElkbGVIeWRyYXRpb25MYW5lOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKICAgICAgICAvLyBFdmVyeXRoaW5nIGVsc2UgaXMgYWxyZWFkeSBlaXRoZXIgYSBoeWRyYXRpb24gbGFuZSwgb3Igc2hvdWxkbid0CiAgICAgICAgLy8gYmUgcmV0cmllZCBhdCBhIGh5ZHJhdGlvbiBsYW5lLgogICAgICAgIGxhbmUgPSBOb0xhbmU7CiAgICAgICAgYnJlYWs7CiAgICB9IC8vIENoZWNrIGlmIHRoZSBsYW5lIHdlIGNob3NlIGlzIHN1c3BlbmRlZC4gSWYgc28sIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2UKICAgIC8vIGFscmVhZHkgYXR0ZW1wdGVkIGFuZCBmYWlsZWQgdG8gaHlkcmF0ZSBhdCB0aGF0IGxldmVsLiBBbHNvIGNoZWNrIGlmIHdlJ3JlCiAgICAvLyBhbHJlYWR5IHJlbmRlcmluZyB0aGF0IGxhbmUsIHdoaWNoIGlzIHJhcmUgYnV0IGNvdWxkIGhhcHBlbi4KCgogICAgaWYgKChsYW5lICYgKHJvb3Quc3VzcGVuZGVkTGFuZXMgfCByZW5kZXJMYW5lcykpICE9PSBOb0xhbmUpIHsKICAgICAgLy8gR2l2ZSB1cCB0cnlpbmcgdG8gaHlkcmF0ZSBhbmQgZmFsbCBiYWNrIHRvIGNsaWVudCByZW5kZXIuCiAgICAgIHJldHVybiBOb0xhbmU7CiAgICB9CgogICAgcmV0dXJuIGxhbmU7CiAgfQogIGZ1bmN0aW9uIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZXMpIHsKCiAgICBpZiAoIWlzRGV2VG9vbHNQcmVzZW50KSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDsKCiAgICB3aGlsZSAobGFuZXMgPiAwKSB7CiAgICAgIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KGxhbmVzKTsKICAgICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4OwogICAgICB2YXIgdXBkYXRlcnMgPSBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwW2luZGV4XTsKICAgICAgdXBkYXRlcnMuYWRkKGZpYmVyKTsKICAgICAgbGFuZXMgJj0gfmxhbmU7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcykgewoKICAgIGlmICghaXNEZXZUb29sc1ByZXNlbnQpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gcm9vdC5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwOwogICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7CgogICAgd2hpbGUgKGxhbmVzID4gMCkgewogICAgICB2YXIgaW5kZXggPSBsYW5lVG9JbmRleChsYW5lcyk7CiAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDsKICAgICAgdmFyIHVwZGF0ZXJzID0gcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcFtpbmRleF07CgogICAgICBpZiAodXBkYXRlcnMuc2l6ZSA+IDApIHsKICAgICAgICB1cGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikgewogICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTsKCiAgICAgICAgICBpZiAoYWx0ZXJuYXRlID09PSBudWxsIHx8ICFtZW1vaXplZFVwZGF0ZXJzLmhhcyhhbHRlcm5hdGUpKSB7CiAgICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuYWRkKGZpYmVyKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB1cGRhdGVycy5jbGVhcigpOwogICAgICB9CgogICAgICBsYW5lcyAmPSB+bGFuZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcyhyb290LCBsYW5lcykgewogICAgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIHZhciBEaXNjcmV0ZUV2ZW50UHJpb3JpdHkgPSBTeW5jTGFuZTsKICB2YXIgQ29udGludW91c0V2ZW50UHJpb3JpdHkgPSBJbnB1dENvbnRpbnVvdXNMYW5lOwogIHZhciBEZWZhdWx0RXZlbnRQcmlvcml0eSA9IERlZmF1bHRMYW5lOwogIHZhciBJZGxlRXZlbnRQcmlvcml0eSA9IElkbGVMYW5lOwogIHZhciBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBOb0xhbmU7CiAgZnVuY3Rpb24gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCkgewogICAgcmV0dXJuIGN1cnJlbnRVcGRhdGVQcmlvcml0eTsKICB9CiAgZnVuY3Rpb24gc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KG5ld1ByaW9yaXR5KSB7CiAgICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBuZXdQcmlvcml0eTsKICB9CiAgZnVuY3Rpb24gcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5LCBmbikgewogICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBjdXJyZW50VXBkYXRlUHJpb3JpdHk7CgogICAgdHJ5IHsKICAgICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICAgIHJldHVybiBmbigpOwogICAgfSBmaW5hbGx5IHsKICAgICAgY3VycmVudFVwZGF0ZVByaW9yaXR5ID0gcHJldmlvdXNQcmlvcml0eTsKICAgIH0KICB9CiAgZnVuY3Rpb24gaGlnaGVyRXZlbnRQcmlvcml0eShhLCBiKSB7CiAgICByZXR1cm4gYSAhPT0gMCAmJiBhIDwgYiA/IGEgOiBiOwogIH0KICBmdW5jdGlvbiBsb3dlckV2ZW50UHJpb3JpdHkoYSwgYikgewogICAgcmV0dXJuIGEgPT09IDAgfHwgYSA+IGIgPyBhIDogYjsKICB9CiAgZnVuY3Rpb24gaXNIaWdoZXJFdmVudFByaW9yaXR5KGEsIGIpIHsKICAgIHJldHVybiBhICE9PSAwICYmIGEgPCBiOwogIH0KICBmdW5jdGlvbiBsYW5lc1RvRXZlbnRQcmlvcml0eShsYW5lcykgewogICAgdmFyIGxhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKTsKCiAgICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHksIGxhbmUpKSB7CiAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7CiAgICB9CgogICAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkoQ29udGludW91c0V2ZW50UHJpb3JpdHksIGxhbmUpKSB7CiAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTsKICAgIH0KCiAgICBpZiAoaW5jbHVkZXNOb25JZGxlV29yayhsYW5lKSkgewogICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7CiAgICB9CgogICAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5OwogIH0KCiAgLy8gVGhpcyBpcyBpbXBvcnRlZCBieSB0aGUgZXZlbnQgcmVwbGF5aW5nIGltcGxlbWVudGF0aW9uIGluIFJlYWN0IERPTS4gSXQncwogIC8vIGluIGEgc2VwYXJhdGUgZmlsZSB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgcmVuZGVyZXIgYW5kCiAgLy8gdGhlIHJlY29uY2lsZXIuCiAgZnVuY3Rpb24gaXNSb290RGVoeWRyYXRlZChyb290KSB7CiAgICB2YXIgY3VycmVudFN0YXRlID0gcm9vdC5jdXJyZW50Lm1lbW9pemVkU3RhdGU7CiAgICByZXR1cm4gY3VycmVudFN0YXRlLmlzRGVoeWRyYXRlZDsKICB9CgogIHZhciBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uOwoKICBmdW5jdGlvbiBzZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZm4pIHsKICAgIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24gPSBmbjsKICB9CiAgZnVuY3Rpb24gYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKSB7CiAgICBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTsKICB9CiAgdmFyIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uOwogIGZ1bmN0aW9uIHNldEF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGZuKSB7CiAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiA9IGZuOwogIH0KICB2YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5OwogIGZ1bmN0aW9uIHNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShmbikgewogICAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5ID0gZm47CiAgfQogIHZhciBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkkMTsKICBmdW5jdGlvbiBzZXRHZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoZm4pIHsKICAgIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxID0gZm47CiAgfQogIHZhciBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eTsKICBmdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShmbikgewogICAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkgPSBmbjsKICB9IC8vIFRPRE86IFVwZ3JhZGUgdGhpcyBkZWZpbml0aW9uIG9uY2Ugd2UncmUgb24gYSBuZXdlciB2ZXJzaW9uIG9mIEZsb3cgdGhhdAogIC8vIGhhcyB0aGlzIGRlZmluaXRpb24gYnVpbHQtaW4uCgogIHZhciBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7IC8vIFRoZSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMgdG8gYmUgcmVwbGF5ZWQuCgogIHZhciBxdWV1ZWREaXNjcmV0ZUV2ZW50cyA9IFtdOyAvLyBJbmRpY2F0ZXMgaWYgYW55IGNvbnRpbnVvdXMgZXZlbnQgdGFyZ2V0cyBhcmUgbm9uLW51bGwgZm9yIGVhcmx5IGJhaWxvdXQuCiAgLy8gaWYgdGhlIGxhc3QgdGFyZ2V0IHdhcyBkZWh5ZHJhdGVkLgoKICB2YXIgcXVldWVkRm9jdXMgPSBudWxsOwogIHZhciBxdWV1ZWREcmFnID0gbnVsbDsKICB2YXIgcXVldWVkTW91c2UgPSBudWxsOyAvLyBGb3IgcG9pbnRlciBldmVudHMgdGhlcmUgY2FuIGJlIG9uZSBsYXRlc3QgZXZlbnQgcGVyIHBvaW50ZXJJZC4KCiAgdmFyIHF1ZXVlZFBvaW50ZXJzID0gbmV3IE1hcCgpOwogIHZhciBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMgPSBuZXcgTWFwKCk7IC8vIFdlIGNvdWxkIGNvbnNpZGVyIHJlcGxheWluZyBzZWxlY3Rpb25jaGFuZ2UgYW5kIHRvdWNobW92ZXMgdG9vLgoKICB2YXIgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzID0gW107CiAgdmFyIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cyA9IFsnbW91c2Vkb3duJywgJ21vdXNldXAnLCAndG91Y2hjYW5jZWwnLCAndG91Y2hlbmQnLCAndG91Y2hzdGFydCcsICdhdXhjbGljaycsICdkYmxjbGljaycsICdwb2ludGVyY2FuY2VsJywgJ3BvaW50ZXJkb3duJywgJ3BvaW50ZXJ1cCcsICdkcmFnZW5kJywgJ2RyYWdzdGFydCcsICdkcm9wJywgJ2NvbXBvc2l0aW9uZW5kJywgJ2NvbXBvc2l0aW9uc3RhcnQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdpbnB1dCcsICd0ZXh0SW5wdXQnLCAvLyBJbnRlbnRpb25hbGx5IGNhbWVsQ2FzZQogICdjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdjbGljaycsICdjaGFuZ2UnLCAnY29udGV4dG1lbnUnLCAncmVzZXQnLCAnc3VibWl0J107CiAgZnVuY3Rpb24gaXNEaXNjcmV0ZUV2ZW50VGhhdFJlcXVpcmVzSHlkcmF0aW9uKGV2ZW50VHlwZSkgewogICAgcmV0dXJuIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cy5pbmRleE9mKGV2ZW50VHlwZSkgPiAtMTsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZVF1ZXVlZFJlcGxheWFibGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkgewogICAgcmV0dXJuIHsKICAgICAgYmxvY2tlZE9uOiBibG9ja2VkT24sCiAgICAgIGRvbUV2ZW50TmFtZTogZG9tRXZlbnROYW1lLAogICAgICBldmVudFN5c3RlbUZsYWdzOiBldmVudFN5c3RlbUZsYWdzLAogICAgICBuYXRpdmVFdmVudDogbmF0aXZlRXZlbnQsCiAgICAgIHRhcmdldENvbnRhaW5lcnM6IFt0YXJnZXRDb250YWluZXJdCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7CiAgICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkgewogICAgICBjYXNlICdmb2N1c2luJzoKICAgICAgY2FzZSAnZm9jdXNvdXQnOgogICAgICAgIHF1ZXVlZEZvY3VzID0gbnVsbDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2RyYWdlbnRlcic6CiAgICAgIGNhc2UgJ2RyYWdsZWF2ZSc6CiAgICAgICAgcXVldWVkRHJhZyA9IG51bGw7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdtb3VzZW92ZXInOgogICAgICBjYXNlICdtb3VzZW91dCc6CiAgICAgICAgcXVldWVkTW91c2UgPSBudWxsOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAncG9pbnRlcm92ZXInOgogICAgICBjYXNlICdwb2ludGVyb3V0JzoKICAgICAgICB7CiAgICAgICAgICB2YXIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkOwogICAgICAgICAgcXVldWVkUG9pbnRlcnMuZGVsZXRlKHBvaW50ZXJJZCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6CiAgICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6CiAgICAgICAgewogICAgICAgICAgdmFyIF9wb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7CiAgICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZGVsZXRlKF9wb2ludGVySWQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChleGlzdGluZ1F1ZXVlZEV2ZW50LCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkgewogICAgaWYgKGV4aXN0aW5nUXVldWVkRXZlbnQgPT09IG51bGwgfHwgZXhpc3RpbmdRdWV1ZWRFdmVudC5uYXRpdmVFdmVudCAhPT0gbmF0aXZlRXZlbnQpIHsKICAgICAgdmFyIHF1ZXVlZEV2ZW50ID0gY3JlYXRlUXVldWVkUmVwbGF5YWJsZUV2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTsKCiAgICAgIGlmIChibG9ja2VkT24gIT09IG51bGwpIHsKICAgICAgICB2YXIgX2ZpYmVyMiA9IGdldEluc3RhbmNlRnJvbU5vZGUoYmxvY2tlZE9uKTsKCiAgICAgICAgaWYgKF9maWJlcjIgIT09IG51bGwpIHsKICAgICAgICAgIC8vIEF0dGVtcHQgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGFyZ2V0LgogICAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMik7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gcXVldWVkRXZlbnQ7CiAgICB9IC8vIElmIHdlIGhhdmUgYWxyZWFkeSBxdWV1ZWQgdGhpcyBleGFjdCBldmVudCwgdGhlbiBpdCdzIGJlY2F1c2UKICAgIC8vIHRoZSBkaWZmZXJlbnQgZXZlbnQgc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBET00gZXZlbnQgbGlzdGVuZXJzLgogICAgLy8gV2UgY2FuIGFjY3VtdWxhdGUgdGhlIGZsYWdzLCBhbmQgdGhlIHRhcmdldENvbnRhaW5lcnMsIGFuZAogICAgLy8gc3RvcmUgYSBzaW5nbGUgZXZlbnQgdG8gYmUgcmVwbGF5ZWQuCgoKICAgIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzOwogICAgdmFyIHRhcmdldENvbnRhaW5lcnMgPSBleGlzdGluZ1F1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7CgogICAgaWYgKHRhcmdldENvbnRhaW5lciAhPT0gbnVsbCAmJiB0YXJnZXRDb250YWluZXJzLmluZGV4T2YodGFyZ2V0Q29udGFpbmVyKSA9PT0gLTEpIHsKICAgICAgdGFyZ2V0Q29udGFpbmVycy5wdXNoKHRhcmdldENvbnRhaW5lcik7CiAgICB9CgogICAgcmV0dXJuIGV4aXN0aW5nUXVldWVkRXZlbnQ7CiAgfQoKICBmdW5jdGlvbiBxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7CiAgICAvLyBUaGVzZSBzZXQgcmVsYXRlZFRhcmdldCB0byBudWxsIGJlY2F1c2UgdGhlIHJlcGxheWVkIGV2ZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiB3ZQogICAgLy8gbW92ZWQgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cgKG5vIHRhcmdldCkgb250byB0aGUgdGFyZ2V0IG9uY2UgaXQgaHlkcmF0ZXMuCiAgICAvLyBJbnN0ZWFkIG9mIG11dGF0aW5nIHdlIGNvdWxkIGNsb25lIHRoZSBldmVudC4KICAgIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7CiAgICAgIGNhc2UgJ2ZvY3VzaW4nOgogICAgICAgIHsKICAgICAgICAgIHZhciBmb2N1c0V2ZW50ID0gbmF0aXZlRXZlbnQ7CiAgICAgICAgICBxdWV1ZWRGb2N1cyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRm9jdXMsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGZvY3VzRXZlbnQpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgY2FzZSAnZHJhZ2VudGVyJzoKICAgICAgICB7CiAgICAgICAgICB2YXIgZHJhZ0V2ZW50ID0gbmF0aXZlRXZlbnQ7CiAgICAgICAgICBxdWV1ZWREcmFnID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWREcmFnLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBkcmFnRXZlbnQpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgY2FzZSAnbW91c2VvdmVyJzoKICAgICAgICB7CiAgICAgICAgICB2YXIgbW91c2VFdmVudCA9IG5hdGl2ZUV2ZW50OwogICAgICAgICAgcXVldWVkTW91c2UgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZE1vdXNlLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBtb3VzZUV2ZW50KTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzoKICAgICAgICB7CiAgICAgICAgICB2YXIgcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7CiAgICAgICAgICB2YXIgcG9pbnRlcklkID0gcG9pbnRlckV2ZW50LnBvaW50ZXJJZDsKICAgICAgICAgIHF1ZXVlZFBvaW50ZXJzLnNldChwb2ludGVySWQsIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkUG9pbnRlcnMuZ2V0KHBvaW50ZXJJZCkgfHwgbnVsbCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcG9pbnRlckV2ZW50KSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6CiAgICAgICAgewogICAgICAgICAgdmFyIF9wb2ludGVyRXZlbnQgPSBuYXRpdmVFdmVudDsKICAgICAgICAgIHZhciBfcG9pbnRlcklkMiA9IF9wb2ludGVyRXZlbnQucG9pbnRlcklkOwogICAgICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLnNldChfcG9pbnRlcklkMiwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZ2V0KF9wb2ludGVySWQyKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBfcG9pbnRlckV2ZW50KSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0gLy8gQ2hlY2sgaWYgdGhpcyB0YXJnZXQgaXMgdW5ibG9ja2VkLiBSZXR1cm5zIHRydWUgaWYgaXQncyB1bmJsb2NrZWQuCgogIGZ1bmN0aW9uIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpIHsKICAgIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hhcmVzIGEgbG90IG9mIGxvZ2ljIHdpdGggZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudC4KICAgIC8vIFRyeSB0byB1bmlmeSB0aGVtLiBJdCdzIGEgYml0IHRyaWNreSBzaW5jZSBpdCB3b3VsZCByZXF1aXJlIHR3byByZXR1cm4KICAgIC8vIHZhbHVlcy4KICAgIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7CgogICAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHsKICAgICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0YXJnZXRJbnN0KTsKCiAgICAgIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gbnVsbCkgewogICAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7CgogICAgICAgIGlmICh0YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7CiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsKCiAgICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHsKICAgICAgICAgICAgLy8gV2UncmUgYmxvY2tlZCBvbiBoeWRyYXRpbmcgdGhpcyBib3VuZGFyeS4KICAgICAgICAgICAgLy8gSW5jcmVhc2UgaXRzIHByaW9yaXR5LgogICAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gaW5zdGFuY2U7CiAgICAgICAgICAgIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KHF1ZXVlZFRhcmdldC5wcmlvcml0eSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShuZWFyZXN0TW91bnRlZCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7CiAgICAgICAgICB2YXIgcm9vdCA9IG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZTsKCiAgICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkgewogICAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mCiAgICAgICAgICAgIC8vIGEgcm9vdCBvdGhlciB0aGFuIHN5bmMuCgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IG51bGw7CiAgfQoKICBmdW5jdGlvbiBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCkgewogICAgLy8gVE9ETzogVGhpcyB3aWxsIHJlYWQgdGhlIHByaW9yaXR5IGlmIGl0J3MgZGlzcGF0Y2hlZCBieSB0aGUgUmVhY3QKICAgIC8vIGV2ZW50IHN5c3RlbSBidXQgbm90IG5hdGl2ZSBldmVudHMuIFNob3VsZCByZWFkIHdpbmRvdy5ldmVudC50eXBlLCBsaWtlCiAgICAvLyB3ZSBkbyBmb3IgdXBkYXRlcyAoZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkpLgogICAgdmFyIHVwZGF0ZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDEoKTsKICAgIHZhciBxdWV1ZWRUYXJnZXQgPSB7CiAgICAgIGJsb2NrZWRPbjogbnVsbCwKICAgICAgdGFyZ2V0OiB0YXJnZXQsCiAgICAgIHByaW9yaXR5OiB1cGRhdGVQcmlvcml0eQogICAgfTsKICAgIHZhciBpID0gMDsKCiAgICBmb3IgKDsgaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IGkrKykgewogICAgICAvLyBTdG9wIG9uY2Ugd2UgaGl0IHRoZSBmaXJzdCB0YXJnZXQgd2l0aCBsb3dlciBwcmlvcml0eSB0aGFuCiAgICAgIGlmICghaXNIaWdoZXJFdmVudFByaW9yaXR5KHVwZGF0ZVByaW9yaXR5LCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbaV0ucHJpb3JpdHkpKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc3BsaWNlKGksIDAsIHF1ZXVlZFRhcmdldCk7CgogICAgaWYgKGkgPT09IDApIHsKICAgICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHF1ZXVlZFRhcmdldCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7CiAgICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uICE9PSBudWxsKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7CgogICAgd2hpbGUgKHRhcmdldENvbnRhaW5lcnMubGVuZ3RoID4gMCkgewogICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyID0gdGFyZ2V0Q29udGFpbmVyc1swXTsKICAgICAgdmFyIG5leHRCbG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KHF1ZXVlZEV2ZW50LmRvbUV2ZW50TmFtZSwgcXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBxdWV1ZWRFdmVudC5uYXRpdmVFdmVudCk7CgogICAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gbnVsbCkgewogICAgICAgIHsKICAgICAgICAgIHZhciBuYXRpdmVFdmVudCA9IHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50OwogICAgICAgICAgdmFyIG5hdGl2ZUV2ZW50Q2xvbmUgPSBuZXcgbmF0aXZlRXZlbnQuY29uc3RydWN0b3IobmF0aXZlRXZlbnQudHlwZSwgbmF0aXZlRXZlbnQpOwogICAgICAgICAgc2V0UmVwbGF5aW5nRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7CiAgICAgICAgICBuYXRpdmVFdmVudC50YXJnZXQuZGlzcGF0Y2hFdmVudChuYXRpdmVFdmVudENsb25lKTsKICAgICAgICAgIHJlc2V0UmVwbGF5aW5nRXZlbnQoKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC4gVHJ5IGFnYWluIGxhdGVyLgogICAgICAgIHZhciBfZmliZXIzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKTsKCiAgICAgICAgaWYgKF9maWJlcjMgIT09IG51bGwpIHsKICAgICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKF9maWJlcjMpOwogICAgICAgIH0KCiAgICAgICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gLy8gVGhpcyB0YXJnZXQgY29udGFpbmVyIHdhcyBzdWNjZXNzZnVsbHkgZGlzcGF0Y2hlZC4gVHJ5IHRoZSBuZXh0LgoKCiAgICAgIHRhcmdldENvbnRhaW5lcnMuc2hpZnQoKTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcChxdWV1ZWRFdmVudCwga2V5LCBtYXApIHsKICAgIGlmIChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSkgewogICAgICBtYXAuZGVsZXRlKGtleSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZXBsYXlVbmJsb2NrZWRFdmVudHMoKSB7CiAgICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7CgoKICAgIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEZvY3VzKSkgewogICAgICBxdWV1ZWRGb2N1cyA9IG51bGw7CiAgICB9CgogICAgaWYgKHF1ZXVlZERyYWcgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWREcmFnKSkgewogICAgICBxdWV1ZWREcmFnID0gbnVsbDsKICAgIH0KCiAgICBpZiAocXVldWVkTW91c2UgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRNb3VzZSkpIHsKICAgICAgcXVldWVkTW91c2UgPSBudWxsOwogICAgfQoKICAgIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTsKICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcCk7CiAgfQoKICBmdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCkgewogICAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7CiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG51bGw7CgogICAgICBpZiAoIWhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQpIHsKICAgICAgICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gdHJ1ZTsgLy8gU2NoZWR1bGUgYSBjYWxsYmFjayB0byBhdHRlbXB0IHJlcGxheWluZyBhcyBtYW55IGV2ZW50cyBhcyBhcmUKICAgICAgICAvLyBub3cgdW5ibG9ja2VkLiBUaGlzIGZpcnN0IG1pZ2h0IG5vdCBhY3R1YWxseSBiZSB1bmJsb2NrZWQgeWV0LgogICAgICAgIC8vIFdlIGNvdWxkIGNoZWNrIGl0IGVhcmx5IHRvIGF2b2lkIHNjaGVkdWxpbmcgYW4gdW5uZWNlc3NhcnkgY2FsbGJhY2suCgogICAgICAgIHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2sodW5zdGFibGVfTm9ybWFsUHJpb3JpdHksIHJlcGxheVVuYmxvY2tlZEV2ZW50cyk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJldHJ5SWZCbG9ja2VkT24odW5ibG9ja2VkKSB7CiAgICAvLyBNYXJrIGFueXRoaW5nIHRoYXQgd2FzIGJsb2NrZWQgb24gdGhpcyBhcyBubyBsb25nZXIgYmxvY2tlZAogICAgLy8gYW5kIGVsaWdpYmxlIGZvciBhIHJlcGxheS4KICAgIGlmIChxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGggPiAwKSB7CiAgICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREaXNjcmV0ZUV2ZW50c1swXSwgdW5ibG9ja2VkKTsgLy8gVGhpcyBpcyBhIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgZWFjaCBib3VuZGFyeSB0aGF0IGNvbW1pdHMuIEkgdGhpbmsgaXQncwogICAgICAvLyB3b3J0aCBpdCBiZWNhdXNlIHdlIGV4cGVjdCB2ZXJ5IGZldyBkaXNjcmV0ZSBldmVudHMgdG8gcXVldWUgdXAgYW5kIG9uY2UKICAgICAgLy8gd2UgYXJlIGFjdHVhbGx5IGZ1bGx5IHVuYmxvY2tlZCBpdCB3aWxsIGJlIGZhc3QgdG8gcmVwbGF5IHRoZW0uCgogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHF1ZXVlZERpc2NyZXRlRXZlbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHF1ZXVlZEV2ZW50ID0gcXVldWVkRGlzY3JldGVFdmVudHNbaV07CgogICAgICAgIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkgewogICAgICAgICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAocXVldWVkRm9jdXMgIT09IG51bGwpIHsKICAgICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEZvY3VzLCB1bmJsb2NrZWQpOwogICAgfQoKICAgIGlmIChxdWV1ZWREcmFnICE9PSBudWxsKSB7CiAgICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREcmFnLCB1bmJsb2NrZWQpOwogICAgfQoKICAgIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCkgewogICAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7CiAgICB9CgogICAgdmFyIHVuYmxvY2sgPSBmdW5jdGlvbiAocXVldWVkRXZlbnQpIHsKICAgICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKTsKICAgIH07CgogICAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaCh1bmJsb2NrKTsKICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5mb3JFYWNoKHVuYmxvY2spOwoKICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgIHZhciBxdWV1ZWRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbX2ldOwoKICAgICAgaWYgKHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkgewogICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsOwogICAgICB9CiAgICB9CgogICAgd2hpbGUgKHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBuZXh0RXhwbGljaXRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbMF07CgogICAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiAhPT0gbnVsbCkgewogICAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuCiAgICAgICAgYnJlYWs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KG5leHRFeHBsaWNpdFRhcmdldCk7CgogICAgICAgIGlmIChuZXh0RXhwbGljaXRUYXJnZXQuYmxvY2tlZE9uID09PSBudWxsKSB7CiAgICAgICAgICAvLyBXZSdyZSB1bmJsb2NrZWQuCiAgICAgICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOyAvLyBUT0RPOiBjYW4gd2Ugc3RvcCBleHBvcnRpbmcgdGhlc2U/CgogIHZhciBfZW5hYmxlZCA9IHRydWU7IC8vIFRoaXMgaXMgZXhwb3J0ZWQgaW4gRkIgYnVpbGRzIGZvciB1c2UgYnkgbGVnYWN5IEZCIGxheWVyIGluZnJhLgogIC8vIFdlJ2QgbGlrZSB0byByZW1vdmUgdGhpcyBidXQgaXQncyBub3QgY2xlYXIgaWYgdGhpcyBpcyBzYWZlLgoKICBmdW5jdGlvbiBzZXRFbmFibGVkKGVuYWJsZWQpIHsKICAgIF9lbmFibGVkID0gISFlbmFibGVkOwogIH0KICBmdW5jdGlvbiBpc0VuYWJsZWQoKSB7CiAgICByZXR1cm4gX2VuYWJsZWQ7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKSB7CiAgICB2YXIgZXZlbnRQcmlvcml0eSA9IGdldEV2ZW50UHJpb3JpdHkoZG9tRXZlbnROYW1lKTsKICAgIHZhciBsaXN0ZW5lcldyYXBwZXI7CgogICAgc3dpdGNoIChldmVudFByaW9yaXR5KSB7CiAgICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OgogICAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ29udGludW91c0V2ZW50UHJpb3JpdHk6CiAgICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQ7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OgogICAgICBkZWZhdWx0OgogICAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRXZlbnQ7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIGxpc3RlbmVyV3JhcHBlci5iaW5kKG51bGwsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKTsKICB9CgogIGZ1bmN0aW9uIGRpc3BhdGNoRGlzY3JldGVFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHsKICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7CiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uOwogICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IG51bGw7CgogICAgdHJ5IHsKICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7CiAgICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTsKICAgIH0gZmluYWxseSB7CiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTsKICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7CiAgICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpOwogICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjsKICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBudWxsOwoKICAgIHRyeSB7CiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShDb250aW51b3VzRXZlbnRQcmlvcml0eSk7CiAgICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTsKICAgIH0gZmluYWxseSB7CiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTsKICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHsKICAgIGlmICghX2VuYWJsZWQpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHsKICAgICAgZGlzcGF0Y2hFdmVudFdpdGhFbmFibGVDYXB0dXJlUGhhc2VTZWxlY3RpdmVIeWRyYXRpb25XaXRob3V0RGlzY3JldGVFdmVudFJlcGxheShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGlzcGF0Y2hFdmVudFdpdGhFbmFibGVDYXB0dXJlUGhhc2VTZWxlY3RpdmVIeWRyYXRpb25XaXRob3V0RGlzY3JldGVFdmVudFJlcGxheShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHsKICAgIHZhciBibG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7CgogICAgaWYgKGJsb2NrZWRPbiA9PT0gbnVsbCkgewogICAgICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgcmV0dXJuX3RhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcik7CiAgICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAocXVldWVJZkNvbnRpbnVvdXNFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkpIHsKICAgICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIHJldHVybjsKICAgIH0gLy8gV2UgbmVlZCB0byBjbGVhciBvbmx5IGlmIHdlIGRpZG4ndCBxdWV1ZSBiZWNhdXNlCiAgICAvLyBxdWV1ZWluZyBpcyBhY2N1bXVsYXRpdmUuCgoKICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7CgogICAgaWYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFICYmIGlzRGlzY3JldGVFdmVudFRoYXRSZXF1aXJlc0h5ZHJhdGlvbihkb21FdmVudE5hbWUpKSB7CiAgICAgIHdoaWxlIChibG9ja2VkT24gIT09IG51bGwpIHsKICAgICAgICB2YXIgZmliZXIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7CgogICAgICAgIGlmIChmaWJlciAhPT0gbnVsbCkgewogICAgICAgICAgYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKTsKICAgICAgICB9CgogICAgICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpOwoKICAgICAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gbnVsbCkgewogICAgICAgICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHJldHVybl90YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5leHRCbG9ja2VkT24gPT09IGJsb2NrZWRPbikgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBibG9ja2VkT24gPSBuZXh0QmxvY2tlZE9uOwogICAgICB9CgogICAgICBpZiAoYmxvY2tlZE9uICE9PSBudWxsKSB7CiAgICAgICAgbmF0aXZlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIH0KCiAgICAgIHJldHVybjsKICAgIH0gLy8gVGhpcyBpcyBub3QgcmVwbGF5YWJsZSBzbyB3ZSdsbCBpbnZva2UgaXQgYnV0IHdpdGhvdXQgYSB0YXJnZXQsCiAgICAvLyBpbiBjYXNlIHRoZSBldmVudCBzeXN0ZW0gbmVlZHMgdG8gdHJhY2UgaXQuCgoKICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCBudWxsLCB0YXJnZXRDb250YWluZXIpOwogIH0KCiAgdmFyIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbDsgLy8gUmV0dXJucyBhIFN1c3BlbnNlSW5zdGFuY2Ugb3IgQ29udGFpbmVyIGlmIGl0J3MgYmxvY2tlZC4KICAvLyBUaGUgcmV0dXJuX3RhcmdldEluc3QgZmllbGQgYWJvdmUgaXMgY29uY2VwdHVhbGx5IHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZS4KCiAgZnVuY3Rpb24gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHsKICAgIC8vIFRPRE86IFdhcm4gaWYgX2VuYWJsZWQgaXMgZmFsc2UuCiAgICByZXR1cm5fdGFyZ2V0SW5zdCA9IG51bGw7CiAgICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCk7CiAgICB2YXIgdGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTsKCiAgICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkgewogICAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpOwoKICAgICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7CiAgICAgICAgLy8gVGhpcyB0cmVlIGhhcyBiZWVuIHVubW91bnRlZCBhbHJlYWR5LiBEaXNwYXRjaCB3aXRob3V0IGEgdGFyZ2V0LgogICAgICAgIHRhcmdldEluc3QgPSBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7CgogICAgICAgIGlmICh0YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7CiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsKCiAgICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHsKICAgICAgICAgICAgLy8gUXVldWUgdGhlIGV2ZW50IHRvIGJlIHJlcGxheWVkIGxhdGVyLiBBYm9ydCBkaXNwYXRjaGluZyBzaW5jZSB3ZQogICAgICAgICAgICAvLyBkb24ndCB3YW50IHRoaXMgZXZlbnQgZGlzcGF0Y2hlZCB0d2ljZSB0aHJvdWdoIHRoZSBldmVudCBzeXN0ZW0uCiAgICAgICAgICAgIC8vIFRPRE86IElmIHRoaXMgaXMgdGhlIGZpcnN0IGRpc2NyZXRlIGV2ZW50IGluIHRoZSBxdWV1ZS4gU2NoZWR1bGUgYW4gaW5jcmVhc2VkCiAgICAgICAgICAgIC8vIHByaW9yaXR5IGZvciB0aGlzIGJvdW5kYXJ5LgogICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICAgICAgICB9IC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgc29tZXRoaW5nIHdlbnQgd3JvbmcgYnV0IHRvIGF2b2lkIGJsb2NraW5nCiAgICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLCBkaXNwYXRjaCB0aGUgZXZlbnQgd2l0aG91dCBhIHRhcmdldC4KICAgICAgICAgIC8vIFRPRE86IFdhcm4uCgoKICAgICAgICAgIHRhcmdldEluc3QgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAodGFnID09PSBIb3N0Um9vdCkgewogICAgICAgICAgdmFyIHJvb3QgPSBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGU7CgogICAgICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHsKICAgICAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zIGR1cmluZyBhIHJlcGxheSBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgaXQgbWlnaHQgYmxvY2sKICAgICAgICAgICAgLy8gdGhlIHdob2xlIHN5c3RlbS4KICAgICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7CiAgICAgICAgICB9CgogICAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7CiAgICAgICAgfSBlbHNlIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gdGFyZ2V0SW5zdCkgewogICAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdAogICAgICAgICAgLy8gY29tcG9uZW50J3MgbW91bnQsIGlnbm9yZSBpdCBmb3Igbm93ICh0aGF0IGlzLCB0cmVhdCBpdCBhcyBpZiBpdCB3YXMgYW4KICAgICAgICAgIC8vIGV2ZW50IG9uIGEgbm9uLVJlYWN0IHRyZWUpLiBXZSBtaWdodCBhbHNvIGNvbnNpZGVyIHF1ZXVlaW5nIGV2ZW50cyBhbmQKICAgICAgICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LgogICAgICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0OyAvLyBXZSdyZSBub3QgYmxvY2tlZCBvbiBhbnl0aGluZy4KCiAgICByZXR1cm4gbnVsbDsKICB9CiAgZnVuY3Rpb24gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpIHsKICAgIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7CiAgICAgIC8vIFVzZWQgYnkgU2ltcGxlRXZlbnRQbHVnaW46CiAgICAgIGNhc2UgJ2NhbmNlbCc6CiAgICAgIGNhc2UgJ2NsaWNrJzoKICAgICAgY2FzZSAnY2xvc2UnOgogICAgICBjYXNlICdjb250ZXh0bWVudSc6CiAgICAgIGNhc2UgJ2NvcHknOgogICAgICBjYXNlICdjdXQnOgogICAgICBjYXNlICdhdXhjbGljayc6CiAgICAgIGNhc2UgJ2RibGNsaWNrJzoKICAgICAgY2FzZSAnZHJhZ2VuZCc6CiAgICAgIGNhc2UgJ2RyYWdzdGFydCc6CiAgICAgIGNhc2UgJ2Ryb3AnOgogICAgICBjYXNlICdmb2N1c2luJzoKICAgICAgY2FzZSAnZm9jdXNvdXQnOgogICAgICBjYXNlICdpbnB1dCc6CiAgICAgIGNhc2UgJ2ludmFsaWQnOgogICAgICBjYXNlICdrZXlkb3duJzoKICAgICAgY2FzZSAna2V5cHJlc3MnOgogICAgICBjYXNlICdrZXl1cCc6CiAgICAgIGNhc2UgJ21vdXNlZG93bic6CiAgICAgIGNhc2UgJ21vdXNldXAnOgogICAgICBjYXNlICdwYXN0ZSc6CiAgICAgIGNhc2UgJ3BhdXNlJzoKICAgICAgY2FzZSAncGxheSc6CiAgICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOgogICAgICBjYXNlICdwb2ludGVyZG93bic6CiAgICAgIGNhc2UgJ3BvaW50ZXJ1cCc6CiAgICAgIGNhc2UgJ3JhdGVjaGFuZ2UnOgogICAgICBjYXNlICdyZXNldCc6CiAgICAgIGNhc2UgJ3Jlc2l6ZSc6CiAgICAgIGNhc2UgJ3NlZWtlZCc6CiAgICAgIGNhc2UgJ3N1Ym1pdCc6CiAgICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzoKICAgICAgY2FzZSAndG91Y2hlbmQnOgogICAgICBjYXNlICd0b3VjaHN0YXJ0JzoKICAgICAgY2FzZSAndm9sdW1lY2hhbmdlJzogLy8gVXNlZCBieSBwb2x5ZmlsbHM6CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaAoKICAgICAgY2FzZSAnY2hhbmdlJzoKICAgICAgY2FzZSAnc2VsZWN0aW9uY2hhbmdlJzoKICAgICAgY2FzZSAndGV4dElucHV0JzoKICAgICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6CiAgICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzoKICAgICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOiAvLyBPbmx5IGVuYWJsZUNyZWF0ZUV2ZW50SGFuZGxlQVBJOgogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2gKCiAgICAgIGNhc2UgJ2JlZm9yZWJsdXInOgogICAgICBjYXNlICdhZnRlcmJsdXInOiAvLyBOb3QgdXNlZCBieSBSZWFjdCBidXQgY291bGQgYmUgYnkgdXNlciBjb2RlOgogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2gKCiAgICAgIGNhc2UgJ2JlZm9yZWlucHV0JzoKICAgICAgY2FzZSAnYmx1cic6CiAgICAgIGNhc2UgJ2Z1bGxzY3JlZW5jaGFuZ2UnOgogICAgICBjYXNlICdmb2N1cyc6CiAgICAgIGNhc2UgJ2hhc2hjaGFuZ2UnOgogICAgICBjYXNlICdwb3BzdGF0ZSc6CiAgICAgIGNhc2UgJ3NlbGVjdCc6CiAgICAgIGNhc2UgJ3NlbGVjdHN0YXJ0JzoKICAgICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5OwoKICAgICAgY2FzZSAnZHJhZyc6CiAgICAgIGNhc2UgJ2RyYWdlbnRlcic6CiAgICAgIGNhc2UgJ2RyYWdleGl0JzoKICAgICAgY2FzZSAnZHJhZ2xlYXZlJzoKICAgICAgY2FzZSAnZHJhZ292ZXInOgogICAgICBjYXNlICdtb3VzZW1vdmUnOgogICAgICBjYXNlICdtb3VzZW91dCc6CiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6CiAgICAgIGNhc2UgJ3BvaW50ZXJtb3ZlJzoKICAgICAgY2FzZSAncG9pbnRlcm91dCc6CiAgICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzoKICAgICAgY2FzZSAnc2Nyb2xsJzoKICAgICAgY2FzZSAndG9nZ2xlJzoKICAgICAgY2FzZSAndG91Y2htb3ZlJzoKICAgICAgY2FzZSAnd2hlZWwnOiAvLyBOb3QgdXNlZCBieSBSZWFjdCBidXQgY291bGQgYmUgYnkgdXNlciBjb2RlOgogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2gKCiAgICAgIGNhc2UgJ21vdXNlZW50ZXInOgogICAgICBjYXNlICdtb3VzZWxlYXZlJzoKICAgICAgY2FzZSAncG9pbnRlcmVudGVyJzoKICAgICAgY2FzZSAncG9pbnRlcmxlYXZlJzoKICAgICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7CgogICAgICBjYXNlICdtZXNzYWdlJzoKICAgICAgICB7CiAgICAgICAgICAvLyBXZSBtaWdodCBiZSBpbiB0aGUgU2NoZWR1bGVyIGNhbGxiYWNrLgogICAgICAgICAgLy8gRXZlbnR1YWxseSB0aGlzIG1lY2hhbmlzbSB3aWxsIGJlIHJlcGxhY2VkIGJ5IGEgY2hlY2sKICAgICAgICAgIC8vIG9mIHRoZSBjdXJyZW50IHByaW9yaXR5IG9uIHRoZSBuYXRpdmUgc2NoZWR1bGVyLgogICAgICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5ID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTsKCiAgICAgICAgICBzd2l0Y2ggKHNjaGVkdWxlclByaW9yaXR5KSB7CiAgICAgICAgICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6CiAgICAgICAgICAgICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTsKCiAgICAgICAgICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6CiAgICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OwoKICAgICAgICAgICAgY2FzZSBOb3JtYWxQcmlvcml0eToKICAgICAgICAgICAgY2FzZSBMb3dQcmlvcml0eToKICAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgTG93U2NoZWR1bGVyUHJpb3JpdHksIHNvbWVob3cuIE1heWJlIHRoZSBzYW1lIGxhbmUgYXMgaHlkcmF0aW9uLgogICAgICAgICAgICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTsKCiAgICAgICAgICAgIGNhc2UgSWRsZVByaW9yaXR5OgogICAgICAgICAgICAgIHJldHVybiBJZGxlRXZlbnRQcmlvcml0eTsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5OwogICAgfQogIH0KCiAgZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcih0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIpIHsKICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTsKICAgIHJldHVybiBsaXN0ZW5lcjsKICB9CiAgZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7CiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB0cnVlKTsKICAgIHJldHVybiBsaXN0ZW5lcjsKICB9CiAgZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyLCBwYXNzaXZlKSB7CiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB7CiAgICAgIGNhcHR1cmU6IHRydWUsCiAgICAgIHBhc3NpdmU6IHBhc3NpdmUKICAgIH0pOwogICAgcmV0dXJuIGxpc3RlbmVyOwogIH0KICBmdW5jdGlvbiBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldCwgZXZlbnRUeXBlLCBsaXN0ZW5lciwgcGFzc2l2ZSkgewogICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgewogICAgICBwYXNzaXZlOiBwYXNzaXZlCiAgICB9KTsKICAgIHJldHVybiBsaXN0ZW5lcjsKICB9CgogIC8qKgogICAqIFRoZXNlIHZhcmlhYmxlcyBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0ZXh0IGNvbnRlbnQgb2YgYSB0YXJnZXQgbm9kZSwKICAgKiBhbGxvd2luZyBjb21wYXJpc29uIG9mIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIGV2ZW50LgogICAqCiAgICogSWRlbnRpZnkgdGhlIG5vZGUgd2hlcmUgc2VsZWN0aW9uIGN1cnJlbnRseSBiZWdpbnMsIHRoZW4gb2JzZXJ2ZQogICAqIGJvdGggaXRzIHRleHQgY29udGVudCBhbmQgaXRzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIERPTS4gU2luY2UgdGhlCiAgICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW4KICAgKiB1c2UgaXRzIHBvc2l0aW9uIHRvIGZpbmQgaXRzIHJlcGxhY2VtZW50LgogICAqCiAgICoKICAgKi8KICB2YXIgcm9vdCA9IG51bGw7CiAgdmFyIHN0YXJ0VGV4dCA9IG51bGw7CiAgdmFyIGZhbGxiYWNrVGV4dCA9IG51bGw7CiAgZnVuY3Rpb24gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCkgewogICAgcm9vdCA9IG5hdGl2ZUV2ZW50VGFyZ2V0OwogICAgc3RhcnRUZXh0ID0gZ2V0VGV4dCgpOwogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIHJlc2V0KCkgewogICAgcm9vdCA9IG51bGw7CiAgICBzdGFydFRleHQgPSBudWxsOwogICAgZmFsbGJhY2tUZXh0ID0gbnVsbDsKICB9CiAgZnVuY3Rpb24gZ2V0RGF0YSgpIHsKICAgIGlmIChmYWxsYmFja1RleHQpIHsKICAgICAgcmV0dXJuIGZhbGxiYWNrVGV4dDsKICAgIH0KCiAgICB2YXIgc3RhcnQ7CiAgICB2YXIgc3RhcnRWYWx1ZSA9IHN0YXJ0VGV4dDsKICAgIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoOwogICAgdmFyIGVuZDsKICAgIHZhciBlbmRWYWx1ZSA9IGdldFRleHQoKTsKICAgIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7CgogICAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHsKICAgICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRdICE9PSBlbmRWYWx1ZVtzdGFydF0pIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIHZhciBtaW5FbmQgPSBzdGFydExlbmd0aCAtIHN0YXJ0OwoKICAgIGZvciAoZW5kID0gMTsgZW5kIDw9IG1pbkVuZDsgZW5kKyspIHsKICAgICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRMZW5ndGggLSBlbmRdICE9PSBlbmRWYWx1ZVtlbmRMZW5ndGggLSBlbmRdKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgc2xpY2VUYWlsID0gZW5kID4gMSA/IDEgLSBlbmQgOiB1bmRlZmluZWQ7CiAgICBmYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgc2xpY2VUYWlsKTsKICAgIHJldHVybiBmYWxsYmFja1RleHQ7CiAgfQogIGZ1bmN0aW9uIGdldFRleHQoKSB7CiAgICBpZiAoJ3ZhbHVlJyBpbiByb290KSB7CiAgICAgIHJldHVybiByb290LnZhbHVlOwogICAgfQoKICAgIHJldHVybiByb290LnRleHRDb250ZW50OwogIH0KCiAgLyoqCiAgICogYGNoYXJDb2RlYCByZXByZXNlbnRzIHRoZSBhY3R1YWwgImNoYXJhY3RlciBjb2RlIiBhbmQgaXMgc2FmZSB0byB1c2Ugd2l0aAogICAqIGBTdHJpbmcuZnJvbUNoYXJDb2RlYC4gQXMgc3VjaCwgb25seSBrZXlzIHRoYXQgY29ycmVzcG9uZCB0byBwcmludGFibGUKICAgKiBjaGFyYWN0ZXJzIHByb2R1Y2UgYSB2YWxpZCBgY2hhckNvZGVgLCB0aGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBpcyBFbnRlci4KICAgKiBUaGUgVGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBgY2hhckNvZGVgLAogICAqIHByZXN1bWFibHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm9kdWNlIGEgdGFiLWNoYXJhY3RlciBpbiBicm93c2Vycy4KICAgKgogICAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC4KICAgKiBAcmV0dXJuIHtudW1iZXJ9IE5vcm1hbGl6ZWQgYGNoYXJDb2RlYCBwcm9wZXJ0eS4KICAgKi8KICBmdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7CiAgICB2YXIgY2hhckNvZGU7CiAgICB2YXIga2V5Q29kZSA9IG5hdGl2ZUV2ZW50LmtleUNvZGU7CgogICAgaWYgKCdjaGFyQ29kZScgaW4gbmF0aXZlRXZlbnQpIHsKICAgICAgY2hhckNvZGUgPSBuYXRpdmVFdmVudC5jaGFyQ29kZTsgLy8gRkYgZG9lcyBub3Qgc2V0IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLgoKICAgICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7CiAgICAgICAgY2hhckNvZGUgPSAxMzsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gSUU4IGRvZXMgbm90IGltcGxlbWVudCBgY2hhckNvZGVgLCBidXQgYGtleUNvZGVgIGhhcyB0aGUgY29ycmVjdCB2YWx1ZS4KICAgICAgY2hhckNvZGUgPSBrZXlDb2RlOwogICAgfSAvLyBJRSBhbmQgRWRnZSAob24gV2luZG93cykgYW5kIENocm9tZSAvIFNhZmFyaSAob24gV2luZG93cyBhbmQgTGludXgpCiAgICAvLyByZXBvcnQgRW50ZXIgYXMgY2hhckNvZGUgMTAgd2hlbiBjdHJsIGlzIHByZXNzZWQuCgoKICAgIGlmIChjaGFyQ29kZSA9PT0gMTApIHsKICAgICAgY2hhckNvZGUgPSAxMzsKICAgIH0gLy8gU29tZSBub24tcHJpbnRhYmxlIGtleXMgYXJlIHJlcG9ydGVkIGluIGBjaGFyQ29kZWAvYGtleUNvZGVgLCBkaXNjYXJkIHRoZW0uCiAgICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LgoKCiAgICBpZiAoY2hhckNvZGUgPj0gMzIgfHwgY2hhckNvZGUgPT09IDEzKSB7CiAgICAgIHJldHVybiBjaGFyQ29kZTsKICAgIH0KCiAgICByZXR1cm4gMDsKICB9CgogIGZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlKCkgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2UoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYSBmYWN0b3J5IHNvIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuZWQgY29uc3RydWN0b3JzLgogIC8vIElmIHdlIGhhZCBhIHNpbmdsZSBjb25zdHJ1Y3RvciwgaXQgd291bGQgYmUgbWVnYW1vcnBoaWMgYW5kIGVuZ2luZXMgd291bGQgZGVvcHQuCgoKICBmdW5jdGlvbiBjcmVhdGVTeW50aGV0aWNFdmVudChJbnRlcmZhY2UpIHsKICAgIC8qKgogICAgICogU3ludGhldGljIGV2ZW50cyBhcmUgZGlzcGF0Y2hlZCBieSBldmVudCBwbHVnaW5zLCB0eXBpY2FsbHkgaW4gcmVzcG9uc2UgdG8gYQogICAgICogdG9wLWxldmVsIGV2ZW50IGRlbGVnYXRpb24gaGFuZGxlci4KICAgICAqCiAgICAgKiBUaGVzZSBzeXN0ZW1zIHNob3VsZCBnZW5lcmFsbHkgdXNlIHBvb2xpbmcgdG8gcmVkdWNlIHRoZSBmcmVxdWVuY3kgb2YgZ2FyYmFnZQogICAgICogY29sbGVjdGlvbi4gVGhlIHN5c3RlbSBzaG91bGQgY2hlY2sgYGlzUGVyc2lzdGVudGAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCiAgICAgKiBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgaW50byB0aGUgcG9vbCBhZnRlciBiZWluZyBkaXNwYXRjaGVkLiBVc2VycyB0aGF0CiAgICAgKiBuZWVkIGEgcGVyc2lzdGVkIGV2ZW50IHNob3VsZCBpbnZva2UgYHBlcnNpc3RgLgogICAgICoKICAgICAqIFN5bnRoZXRpYyBldmVudHMgKGFuZCBzdWJjbGFzc2VzKSBpbXBsZW1lbnQgdGhlIERPTSBMZXZlbCAzIEV2ZW50cyBBUEkgYnkKICAgICAqIG5vcm1hbGl6aW5nIGJyb3dzZXIgcXVpcmtzLiBTdWJjbGFzc2VzIGRvIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRvIGltcGxlbWVudCBhCiAgICAgKiBET00gaW50ZXJmYWNlOyBjdXN0b20gYXBwbGljYXRpb24tc3BlY2lmaWMgZXZlbnRzIGNhbiBhbHNvIHN1YmNsYXNzIHRoaXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFN5bnRoZXRpY0Jhc2VFdmVudChyZWFjdE5hbWUsIHJlYWN0RXZlbnRUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKICAgICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lOwogICAgICB0aGlzLl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDsKICAgICAgdGhpcy50eXBlID0gcmVhY3RFdmVudFR5cGU7CiAgICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDsKICAgICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDsKICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDsKCiAgICAgIGZvciAodmFyIF9wcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHsKICAgICAgICBpZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShfcHJvcE5hbWUpKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIHZhciBub3JtYWxpemUgPSBJbnRlcmZhY2VbX3Byb3BOYW1lXTsKCiAgICAgICAgaWYgKG5vcm1hbGl6ZSkgewogICAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbm9ybWFsaXplKG5hdGl2ZUV2ZW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbmF0aXZlRXZlbnRbX3Byb3BOYW1lXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBkZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IG5hdGl2ZUV2ZW50LnJldHVyblZhbHVlID09PSBmYWxzZTsKCiAgICAgIGlmIChkZWZhdWx0UHJldmVudGVkKSB7CiAgICAgICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTsKICAgICAgfQoKICAgICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgYXNzaWduKFN5bnRoZXRpY0Jhc2VFdmVudC5wcm90b3R5cGUsIHsKICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOwogICAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7CgogICAgICAgIGlmICghZXZlbnQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkgewogICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRQogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LnJldHVyblZhbHVlICE9PSAndW5rbm93bicpIHsKICAgICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlOwogICAgICB9LAogICAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50OwoKICAgICAgICBpZiAoIWV2ZW50KSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7CiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRQogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gJ3Vua25vd24nKSB7CiAgICAgICAgICAvLyBUaGUgQ2hhbmdlRXZlbnRQbHVnaW4gcmVnaXN0ZXJzIGEgInByb3BlcnR5Y2hhbmdlIiBldmVudCBmb3IKICAgICAgICAgIC8vIElFLiBUaGlzIGV2ZW50IGRvZXMgbm90IHN1cHBvcnQgYnViYmxpbmcgb3IgY2FuY2VsbGluZywgYW5kCiAgICAgICAgICAvLyBhbnkgcmVmZXJlbmNlcyB0byBjYW5jZWxCdWJibGUgdGhyb3cgIk1lbWJlciBub3QgZm91bmQiLiAgQQogICAgICAgICAgLy8gdHlwZW9mIGNoZWNrIG9mICJ1bmtub3duIiBjaXJjdW12ZW50cyB0aGlzIGlzc3VlIChhbmQgaXMgYWxzbwogICAgICAgICAgLy8gSUUgc3BlY2lmaWMpLgogICAgICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBXZSByZWxlYXNlIGFsbCBkaXNwYXRjaGVkIGBTeW50aGV0aWNFdmVudGBzIGFmdGVyIGVhY2ggZXZlbnQgbG9vcCwgYWRkaW5nCiAgICAgICAqIHRoZW0gYmFjayBpbnRvIHRoZSBwb29sLiBUaGlzIGFsbG93cyBhIHdheSB0byBob2xkIG9udG8gYSByZWZlcmVuY2UgdGhhdAogICAgICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIHBvb2wuCiAgICAgICAqLwogICAgICBwZXJzaXN0OiBmdW5jdGlvbiAoKSB7Ly8gTW9kZXJuIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLgogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENoZWNrcyBpZiB0aGlzIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBiYWNrIGludG8gdGhlIHBvb2wuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAqLwogICAgICBpc1BlcnNpc3RlbnQ6IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlCiAgICB9KTsKICAgIHJldHVybiBTeW50aGV0aWNCYXNlRXZlbnQ7CiAgfQogIC8qKgogICAqIEBpbnRlcmZhY2UgRXZlbnQKICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8KICAgKi8KCgogIHZhciBFdmVudEludGVyZmFjZSA9IHsKICAgIGV2ZW50UGhhc2U6IDAsCiAgICBidWJibGVzOiAwLAogICAgY2FuY2VsYWJsZTogMCwKICAgIHRpbWVTdGFtcDogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgIHJldHVybiBldmVudC50aW1lU3RhbXAgfHwgRGF0ZS5ub3coKTsKICAgIH0sCiAgICBkZWZhdWx0UHJldmVudGVkOiAwLAogICAgaXNUcnVzdGVkOiAwCiAgfTsKICB2YXIgU3ludGhldGljRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChFdmVudEludGVyZmFjZSk7CgogIHZhciBVSUV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwgewogICAgdmlldzogMCwKICAgIGRldGFpbDogMAogIH0pOwoKICB2YXIgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpOwogIHZhciBsYXN0TW92ZW1lbnRYOwogIHZhciBsYXN0TW92ZW1lbnRZOwogIHZhciBsYXN0TW91c2VFdmVudDsKCiAgZnVuY3Rpb24gdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpIHsKICAgIGlmIChldmVudCAhPT0gbGFzdE1vdXNlRXZlbnQpIHsKICAgICAgaWYgKGxhc3RNb3VzZUV2ZW50ICYmIGV2ZW50LnR5cGUgPT09ICdtb3VzZW1vdmUnKSB7CiAgICAgICAgbGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YOwogICAgICAgIGxhc3RNb3ZlbWVudFkgPSBldmVudC5zY3JlZW5ZIC0gbGFzdE1vdXNlRXZlbnQuc2NyZWVuWTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsYXN0TW92ZW1lbnRYID0gMDsKICAgICAgICBsYXN0TW92ZW1lbnRZID0gMDsKICAgICAgfQoKICAgICAgbGFzdE1vdXNlRXZlbnQgPSBldmVudDsKICAgIH0KICB9CiAgLyoqCiAgICogQGludGVyZmFjZSBNb3VzZUV2ZW50CiAgICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvCiAgICovCgoKICB2YXIgTW91c2VFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwgewogICAgc2NyZWVuWDogMCwKICAgIHNjcmVlblk6IDAsCiAgICBjbGllbnRYOiAwLAogICAgY2xpZW50WTogMCwKICAgIHBhZ2VYOiAwLAogICAgcGFnZVk6IDAsCiAgICBjdHJsS2V5OiAwLAogICAgc2hpZnRLZXk6IDAsCiAgICBhbHRLZXk6IDAsCiAgICBtZXRhS2V5OiAwLAogICAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLAogICAgYnV0dG9uOiAwLAogICAgYnV0dG9uczogMCwKICAgIHJlbGF0ZWRUYXJnZXQ6IGZ1bmN0aW9uIChldmVudCkgewogICAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKICAgICAgcmV0dXJuIGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CiAgICB9LAogICAgbW92ZW1lbnRYOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgaWYgKCdtb3ZlbWVudFgnIGluIGV2ZW50KSB7CiAgICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WDsKICAgICAgfQoKICAgICAgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpOwogICAgICByZXR1cm4gbGFzdE1vdmVtZW50WDsKICAgIH0sCiAgICBtb3ZlbWVudFk6IGZ1bmN0aW9uIChldmVudCkgewogICAgICBpZiAoJ21vdmVtZW50WScgaW4gZXZlbnQpIHsKICAgICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRZOwogICAgICB9IC8vIERvbid0IG5lZWQgdG8gY2FsbCB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZSgpIGhlcmUKICAgICAgLy8gYmVjYXVzZSBpdCdzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhbHJlYWR5IHJ1biB3aGVuIG1vdmVtZW50WAogICAgICAvLyB3YXMgY29waWVkLgoKCiAgICAgIHJldHVybiBsYXN0TW92ZW1lbnRZOwogICAgfQogIH0pOwoKICB2YXIgU3ludGhldGljTW91c2VFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KE1vdXNlRXZlbnRJbnRlcmZhY2UpOwogIC8qKgogICAqIEBpbnRlcmZhY2UgRHJhZ0V2ZW50CiAgICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvCiAgICovCgogIHZhciBEcmFnRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHsKICAgIGRhdGFUcmFuc2ZlcjogMAogIH0pOwoKICB2YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRHJhZ0V2ZW50SW50ZXJmYWNlKTsKICAvKioKICAgKiBAaW50ZXJmYWNlIEZvY3VzRXZlbnQKICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8KICAgKi8KCiAgdmFyIEZvY3VzRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHsKICAgIHJlbGF0ZWRUYXJnZXQ6IDAKICB9KTsKCiAgdmFyIFN5bnRoZXRpY0ZvY3VzRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChGb2N1c0V2ZW50SW50ZXJmYWNlKTsKICAvKioKICAgKiBAaW50ZXJmYWNlIEV2ZW50CiAgICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWFuaW1hdGlvbnMvI0FuaW1hdGlvbkV2ZW50LWludGVyZmFjZQogICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0FuaW1hdGlvbkV2ZW50CiAgICovCgogIHZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHsKICAgIGFuaW1hdGlvbk5hbWU6IDAsCiAgICBlbGFwc2VkVGltZTogMCwKICAgIHBzZXVkb0VsZW1lbnQ6IDAKICB9KTsKCiAgdmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpOwogIC8qKgogICAqIEBpbnRlcmZhY2UgRXZlbnQKICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzLwogICAqLwoKICB2YXIgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7CiAgICBjbGlwYm9hcmREYXRhOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgcmV0dXJuICdjbGlwYm9hcmREYXRhJyBpbiBldmVudCA/IGV2ZW50LmNsaXBib2FyZERhdGEgOiB3aW5kb3cuY2xpcGJvYXJkRGF0YTsKICAgIH0KICB9KTsKCiAgdmFyIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UpOwogIC8qKgogICAqIEBpbnRlcmZhY2UgRXZlbnQKICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9uZXZlbnRzCiAgICovCgogIHZhciBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwgewogICAgZGF0YTogMAogIH0pOwoKICB2YXIgU3ludGhldGljQ29tcG9zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpOwogIC8qKgogICAqIEBpbnRlcmZhY2UgRXZlbnQKICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1CiAgICogICAgICAvI2V2ZW50cy1pbnB1dGV2ZW50cwogICAqLwogIC8vIEhhcHBlbnMgdG8gc2hhcmUgdGhlIHNhbWUgbGlzdCBmb3Igbm93LgoKICB2YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7CiAgLyoqCiAgICogTm9ybWFsaXphdGlvbiBvZiBkZXByZWNhdGVkIEhUTUw1IGBrZXlgIHZhbHVlcwogICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzCiAgICovCgogIHZhciBub3JtYWxpemVLZXkgPSB7CiAgICBFc2M6ICdFc2NhcGUnLAogICAgU3BhY2ViYXI6ICcgJywKICAgIExlZnQ6ICdBcnJvd0xlZnQnLAogICAgVXA6ICdBcnJvd1VwJywKICAgIFJpZ2h0OiAnQXJyb3dSaWdodCcsCiAgICBEb3duOiAnQXJyb3dEb3duJywKICAgIERlbDogJ0RlbGV0ZScsCiAgICBXaW46ICdPUycsCiAgICBNZW51OiAnQ29udGV4dE1lbnUnLAogICAgQXBwczogJ0NvbnRleHRNZW51JywKICAgIFNjcm9sbDogJ1Njcm9sbExvY2snLAogICAgTW96UHJpbnRhYmxlS2V5OiAnVW5pZGVudGlmaWVkJwogIH07CiAgLyoqCiAgICogVHJhbnNsYXRpb24gZnJvbSBsZWdhY3kgYGtleUNvZGVgIHRvIEhUTUw1IGBrZXlgCiAgICogT25seSBzcGVjaWFsIGtleXMgc3VwcG9ydGVkLCBhbGwgb3RoZXJzIGRlcGVuZCBvbiBrZXlib2FyZCBsYXlvdXQgb3IgYnJvd3NlcgogICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzCiAgICovCgogIHZhciB0cmFuc2xhdGVUb0tleSA9IHsKICAgICc4JzogJ0JhY2tzcGFjZScsCiAgICAnOSc6ICdUYWInLAogICAgJzEyJzogJ0NsZWFyJywKICAgICcxMyc6ICdFbnRlcicsCiAgICAnMTYnOiAnU2hpZnQnLAogICAgJzE3JzogJ0NvbnRyb2wnLAogICAgJzE4JzogJ0FsdCcsCiAgICAnMTknOiAnUGF1c2UnLAogICAgJzIwJzogJ0NhcHNMb2NrJywKICAgICcyNyc6ICdFc2NhcGUnLAogICAgJzMyJzogJyAnLAogICAgJzMzJzogJ1BhZ2VVcCcsCiAgICAnMzQnOiAnUGFnZURvd24nLAogICAgJzM1JzogJ0VuZCcsCiAgICAnMzYnOiAnSG9tZScsCiAgICAnMzcnOiAnQXJyb3dMZWZ0JywKICAgICczOCc6ICdBcnJvd1VwJywKICAgICczOSc6ICdBcnJvd1JpZ2h0JywKICAgICc0MCc6ICdBcnJvd0Rvd24nLAogICAgJzQ1JzogJ0luc2VydCcsCiAgICAnNDYnOiAnRGVsZXRlJywKICAgICcxMTInOiAnRjEnLAogICAgJzExMyc6ICdGMicsCiAgICAnMTE0JzogJ0YzJywKICAgICcxMTUnOiAnRjQnLAogICAgJzExNic6ICdGNScsCiAgICAnMTE3JzogJ0Y2JywKICAgICcxMTgnOiAnRjcnLAogICAgJzExOSc6ICdGOCcsCiAgICAnMTIwJzogJ0Y5JywKICAgICcxMjEnOiAnRjEwJywKICAgICcxMjInOiAnRjExJywKICAgICcxMjMnOiAnRjEyJywKICAgICcxNDQnOiAnTnVtTG9jaycsCiAgICAnMTQ1JzogJ1Njcm9sbExvY2snLAogICAgJzIyNCc6ICdNZXRhJwogIH07CiAgLyoqCiAgICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LgogICAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBga2V5YCBwcm9wZXJ0eS4KICAgKi8KCiAgZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHsKICAgIGlmIChuYXRpdmVFdmVudC5rZXkpIHsKICAgICAgLy8gTm9ybWFsaXplIGluY29uc2lzdGVudCB2YWx1ZXMgcmVwb3J0ZWQgYnkgYnJvd3NlcnMgZHVlIHRvCiAgICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi4KICAgICAgLy8gRmlyZUZveCBpbXBsZW1lbnRzIGBrZXlgIGJ1dCByZXR1cm5zIGBNb3pQcmludGFibGVLZXlgIGZvciBhbGwKICAgICAgLy8gcHJpbnRhYmxlIGNoYXJhY3RlcnMgKG5vcm1hbGl6ZWQgdG8gYFVuaWRlbnRpZmllZGApLCBpZ25vcmUgaXQuCiAgICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XSB8fCBuYXRpdmVFdmVudC5rZXk7CgogICAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykgewogICAgICAgIHJldHVybiBrZXk7CiAgICAgIH0KICAgIH0gLy8gQnJvd3NlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGtleWAsIHBvbHlmaWxsIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLgoKCiAgICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykgewogICAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsgLy8gVGhlIGVudGVyLWtleSBpcyB0ZWNobmljYWxseSBib3RoIHByaW50YWJsZSBhbmQgbm9uLXByaW50YWJsZSBhbmQgY2FuCiAgICAgIC8vIHRodXMgYmUgY2FwdHVyZWQgYnkgYGtleXByZXNzYCwgbm8gb3RoZXIgbm9uLXByaW50YWJsZSBrZXkgc2hvdWxkLgoKICAgICAgcmV0dXJuIGNoYXJDb2RlID09PSAxMyA/ICdFbnRlcicgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTsKICAgIH0KCiAgICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHsKICAgICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaAogICAgICAvLyBga2V5Q29kZWAgdmFsdWUsIGFsbW9zdCBhbGwgZnVuY3Rpb24ga2V5cyBoYXZlIGEgdW5pdmVyc2FsIHZhbHVlLgogICAgICByZXR1cm4gdHJhbnNsYXRlVG9LZXlbbmF0aXZlRXZlbnQua2V5Q29kZV0gfHwgJ1VuaWRlbnRpZmllZCc7CiAgICB9CgogICAgcmV0dXJuICcnOwogIH0KICAvKioKICAgKiBUcmFuc2xhdGlvbiBmcm9tIG1vZGlmaWVyIGtleSB0byB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBpbiB0aGUgZXZlbnQuCiAgICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleXMtTW9kaWZpZXJzCiAgICovCgoKICB2YXIgbW9kaWZpZXJLZXlUb1Byb3AgPSB7CiAgICBBbHQ6ICdhbHRLZXknLAogICAgQ29udHJvbDogJ2N0cmxLZXknLAogICAgTWV0YTogJ21ldGFLZXknLAogICAgU2hpZnQ6ICdzaGlmdEtleScKICB9OyAvLyBPbGRlciBicm93c2VycyAoU2FmYXJpIDw9IDEwLCBpT1MgU2FmYXJpIDw9IDEwLjIpIGRvIG5vdCBzdXBwb3J0CiAgLy8gZ2V0TW9kaWZpZXJTdGF0ZS4gSWYgZ2V0TW9kaWZpZXJTdGF0ZSBpcyBub3Qgc3VwcG9ydGVkLCB3ZSBtYXAgaXQgdG8gYSBzZXQgb2YKICAvLyBtb2RpZmllciBrZXlzIGV4cG9zZWQgYnkgdGhlIGV2ZW50LiBJbiB0aGlzIGNhc2UsIExvY2sta2V5cyBhcmUgbm90IHN1cHBvcnRlZC4KCiAgZnVuY3Rpb24gbW9kaWZpZXJTdGF0ZUdldHRlcihrZXlBcmcpIHsKICAgIHZhciBzeW50aGV0aWNFdmVudCA9IHRoaXM7CiAgICB2YXIgbmF0aXZlRXZlbnQgPSBzeW50aGV0aWNFdmVudC5uYXRpdmVFdmVudDsKCiAgICBpZiAobmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZSkgewogICAgICByZXR1cm4gbmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShrZXlBcmcpOwogICAgfQoKICAgIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTsKICAgIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZ2V0RXZlbnRNb2RpZmllclN0YXRlKG5hdGl2ZUV2ZW50KSB7CiAgICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjsKICB9CiAgLyoqCiAgICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50CiAgICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvCiAgICovCgoKICB2YXIgS2V5Ym9hcmRFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwgewogICAga2V5OiBnZXRFdmVudEtleSwKICAgIGNvZGU6IDAsCiAgICBsb2NhdGlvbjogMCwKICAgIGN0cmxLZXk6IDAsCiAgICBzaGlmdEtleTogMCwKICAgIGFsdEtleTogMCwKICAgIG1ldGFLZXk6IDAsCiAgICByZXBlYXQ6IDAsCiAgICBsb2NhbGU6IDAsCiAgICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsCiAgICAvLyBMZWdhY3kgSW50ZXJmYWNlCiAgICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgIC8vIGBjaGFyQ29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleVByZXNzIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZgogICAgICAvLyB0aGUgYWN0dWFsIHByaW50YWJsZSBjaGFyYWN0ZXIuCiAgICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMgbm90IHlldCBmaW5hbCBhbmQgbm90CiAgICAgIC8vIGltcGxlbWVudGVkIGluIGFueSBtYWpvciBicm93c2VyLiBPbmx5IEtleVByZXNzIGhhcyBjaGFyQ29kZS4KICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHsKICAgICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7CiAgICAgIH0KCiAgICAgIHJldHVybiAwOwogICAgfSwKICAgIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAvLyBga2V5Q29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleURvd24vVXAgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mCiAgICAgIC8vIHBoeXNpY2FsIGtleWJvYXJkIGtleS4KICAgICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1c2Vycycga2V5Ym9hcmQgbGF5b3V0CiAgICAgIC8vIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZC4gQXNzdW1pbmcgdGhhdCBpdCBpcyBhIFVTIGtleWJvYXJkIGxheW91dAogICAgICAvLyBwcm92aWRlcyBhIHN1cnByaXNpbmdseSBhY2N1cmF0ZSBtYXBwaW5nIGZvciBVUyBhbmQgRXVyb3BlYW4gdXNlcnMuCiAgICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVudCBhdCB0aGlzIHRpbWUuCiAgICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykgewogICAgICAgIHJldHVybiBldmVudC5rZXlDb2RlOwogICAgICB9CgogICAgICByZXR1cm4gMDsKICAgIH0sCiAgICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlCiAgICAgIC8vIHR5cGUgb2YgdGhlIGV2ZW50LgogICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykgewogICAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTsKICAgICAgfQoKICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7CiAgICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7CiAgICAgIH0KCiAgICAgIHJldHVybiAwOwogICAgfQogIH0pOwoKICB2YXIgU3ludGhldGljS2V5Ym9hcmRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEtleWJvYXJkRXZlbnRJbnRlcmZhY2UpOwogIC8qKgogICAqIEBpbnRlcmZhY2UgUG9pbnRlckV2ZW50CiAgICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9wb2ludGVyZXZlbnRzLwogICAqLwoKICB2YXIgUG9pbnRlckV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7CiAgICBwb2ludGVySWQ6IDAsCiAgICB3aWR0aDogMCwKICAgIGhlaWdodDogMCwKICAgIHByZXNzdXJlOiAwLAogICAgdGFuZ2VudGlhbFByZXNzdXJlOiAwLAogICAgdGlsdFg6IDAsCiAgICB0aWx0WTogMCwKICAgIHR3aXN0OiAwLAogICAgcG9pbnRlclR5cGU6IDAsCiAgICBpc1ByaW1hcnk6IDAKICB9KTsKCiAgdmFyIFN5bnRoZXRpY1BvaW50ZXJFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFBvaW50ZXJFdmVudEludGVyZmFjZSk7CiAgLyoqCiAgICogQGludGVyZmFjZSBUb3VjaEV2ZW50CiAgICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi90b3VjaC1ldmVudHMvCiAgICovCgogIHZhciBUb3VjaEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7CiAgICB0b3VjaGVzOiAwLAogICAgdGFyZ2V0VG91Y2hlczogMCwKICAgIGNoYW5nZWRUb3VjaGVzOiAwLAogICAgYWx0S2V5OiAwLAogICAgbWV0YUtleTogMCwKICAgIGN0cmxLZXk6IDAsCiAgICBzaGlmdEtleTogMCwKICAgIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZQogIH0pOwoKICB2YXIgU3ludGhldGljVG91Y2hFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRvdWNoRXZlbnRJbnRlcmZhY2UpOwogIC8qKgogICAqIEBpbnRlcmZhY2UgRXZlbnQKICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtY3NzMy10cmFuc2l0aW9ucy0yMDA5MDMyMC8jdHJhbnNpdGlvbi1ldmVudHMtCiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVHJhbnNpdGlvbkV2ZW50CiAgICovCgogIHZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7CiAgICBwcm9wZXJ0eU5hbWU6IDAsCiAgICBlbGFwc2VkVGltZTogMCwKICAgIHBzZXVkb0VsZW1lbnQ6IDAKICB9KTsKCiAgdmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRyYW5zaXRpb25FdmVudEludGVyZmFjZSk7CiAgLyoqCiAgICogQGludGVyZmFjZSBXaGVlbEV2ZW50CiAgICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvCiAgICovCgogIHZhciBXaGVlbEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7CiAgICBkZWx0YVg6IGZ1bmN0aW9uIChldmVudCkgewogICAgICByZXR1cm4gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVhgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAocmlnaHQgaXMgcG9zaXRpdmUpLgogICAgICAnd2hlZWxEZWx0YVgnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFYIDogMDsKICAgIH0sCiAgICBkZWx0YVk6IGZ1bmN0aW9uIChldmVudCkgewogICAgICByZXR1cm4gJ2RlbHRhWScgaW4gZXZlbnQgPyBldmVudC5kZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVlgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuCiAgICAgICd3aGVlbERlbHRhWScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YWAgZm9yIElFPDkgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuCiAgICAgICd3aGVlbERlbHRhJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhIDogMDsKICAgIH0sCiAgICBkZWx0YVo6IDAsCiAgICAvLyBCcm93c2VycyB3aXRob3V0ICJkZWx0YU1vZGUiIGlzIHJlcG9ydGluZyBpbiByYXcgd2hlZWwgZGVsdGEgd2hlcmUgb25lCiAgICAvLyBub3RjaCBvbiB0aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0gMTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxzLgogICAgLy8gQSBnb29kIGFwcHJveGltYXRpb24gb2YgRE9NX0RFTFRBX0xJTkUgKDEpIGlzIDUlIG9mIHZpZXdwb3J0IHNpemUgb3IKICAgIC8vIH40MCBwaXhlbHMsIGZvciBET01fREVMVEFfU0NSRUVOICgyKSBpdCBpcyA4Ny41JSBvZiB2aWV3cG9ydCBzaXplLgogICAgZGVsdGFNb2RlOiAwCiAgfSk7CgogIHZhciBTeW50aGV0aWNXaGVlbEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoV2hlZWxFdmVudEludGVyZmFjZSk7CgogIHZhciBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl07IC8vIFRhYiwgUmV0dXJuLCBFc2MsIFNwYWNlCgogIHZhciBTVEFSVF9LRVlDT0RFID0gMjI5OwogIHZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7CiAgdmFyIGRvY3VtZW50TW9kZSA9IG51bGw7CgogIGlmIChjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQpIHsKICAgIGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZTsKICB9IC8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvCiAgLy8gZGlyZWN0bHkgcmVwcmVzZW50IGBiZWZvcmVJbnB1dGAuIFRoZSBJRSBgdGV4dGlucHV0YCBldmVudCBpcyBub3QgYXMKICAvLyB1c2VmdWwsIHNvIHdlIGRvbid0IHVzZSBpdC4KCgogIHZhciBjYW5Vc2VUZXh0SW5wdXRFdmVudCA9IGNhblVzZURPTSAmJiAnVGV4dEV2ZW50JyBpbiB3aW5kb3cgJiYgIWRvY3VtZW50TW9kZTsgLy8gSW4gSUU5Kywgd2UgaGF2ZSBhY2Nlc3MgdG8gY29tcG9zaXRpb24gZXZlbnRzLCBidXQgdGhlIGRhdGEgc3VwcGxpZWQKICAvLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljCiAgLy8gc3BhY2VzLCBmb3IgaW5zdGFuY2UgKFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuCgogIHZhciB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA9IGNhblVzZURPTSAmJiAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgfHwgZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50TW9kZSA+IDggJiYgZG9jdW1lbnRNb2RlIDw9IDExKTsKICB2YXIgU1BBQ0VCQVJfQ09ERSA9IDMyOwogIHZhciBTUEFDRUJBUl9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZShTUEFDRUJBUl9DT0RFKTsKCiAgZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMoKSB7CiAgICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQmVmb3JlSW5wdXQnLCBbJ2NvbXBvc2l0aW9uZW5kJywgJ2tleXByZXNzJywgJ3RleHRJbnB1dCcsICdwYXN0ZSddKTsKICAgIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvbkVuZCcsIFsnY29tcG9zaXRpb25lbmQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7CiAgICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25TdGFydCcsIFsnY29tcG9zaXRpb25zdGFydCcsICdmb2N1c291dCcsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJywgJ21vdXNlZG93biddKTsKICAgIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblVwZGF0ZScsIFsnY29tcG9zaXRpb251cGRhdGUnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7CiAgfSAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9uIHRoZSBzcGFjZSBrZXkuCgoKICB2YXIgaGFzU3BhY2VLZXlwcmVzcyA9IGZhbHNlOwogIC8qKgogICAqIFJldHVybiB3aGV0aGVyIGEgbmF0aXZlIGtleXByZXNzIGV2ZW50IGlzIGFzc3VtZWQgdG8gYmUgYSBjb21tYW5kLgogICAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBGaXJlZm94IGZpcmVzIGBrZXlwcmVzc2AgZXZlbnRzIGZvciBrZXkgY29tbWFuZHMKICAgKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuCiAgICovCgogIGZ1bmN0aW9uIGlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSB7CiAgICByZXR1cm4gKG5hdGl2ZUV2ZW50LmN0cmxLZXkgfHwgbmF0aXZlRXZlbnQuYWx0S2V5IHx8IG5hdGl2ZUV2ZW50Lm1ldGFLZXkpICYmIC8vIGN0cmxLZXkgJiYgYWx0S2V5IGlzIGVxdWl2YWxlbnQgdG8gQWx0R3IsIGFuZCBpcyBub3QgYSBjb21tYW5kLgogICAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSk7CiAgfQogIC8qKgogICAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLgogICAqLwoKCiAgZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKSB7CiAgICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkgewogICAgICBjYXNlICdjb21wb3NpdGlvbnN0YXJ0JzoKICAgICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25TdGFydCc7CgogICAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6CiAgICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uRW5kJzsKCiAgICAgIGNhc2UgJ2NvbXBvc2l0aW9udXBkYXRlJzoKICAgICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25VcGRhdGUnOwogICAgfQogIH0KICAvKioKICAgKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMgZXZlbnQgc2lnbmlmaWVzIHRoYXQKICAgKiBjb21wb3NpdGlvbiBoYXMgYmVndW4/CiAgICovCgoKICBmdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7CiAgICByZXR1cm4gZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicgJiYgbmF0aXZlRXZlbnQua2V5Q29kZSA9PT0gU1RBUlRfS0VZQ09ERTsKICB9CiAgLyoqCiAgICogRG9lcyBvdXIgZmFsbGJhY2sgbW9kZSB0aGluayB0aGF0IHRoaXMgZXZlbnQgaXMgdGhlIGVuZCBvZiBjb21wb3NpdGlvbj8KICAgKi8KCgogIGZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7CiAgICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkgewogICAgICBjYXNlICdrZXl1cCc6CiAgICAgICAgLy8gQ29tbWFuZCBrZXlzIGluc2VydCBvciBjbGVhciBJTUUgaW5wdXQuCiAgICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTsKCiAgICAgIGNhc2UgJ2tleWRvd24nOgogICAgICAgIC8vIEV4cGVjdCBJTUUga2V5Q29kZSBvbiBlYWNoIGtleWRvd24uIElmIHdlIGdldCBhbnkgb3RoZXIKICAgICAgICAvLyBjb2RlIHdlIG11c3QgaGF2ZSBleGl0ZWQgZWFybGllci4KICAgICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTsKCiAgICAgIGNhc2UgJ2tleXByZXNzJzoKICAgICAgY2FzZSAnbW91c2Vkb3duJzoKICAgICAgY2FzZSAnZm9jdXNvdXQnOgogICAgICAgIC8vIEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CiAgLyoqCiAgICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlhIGEgQ3VzdG9tRXZlbnQsCiAgICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRlZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzCiAgICogaXMgYXZhaWxhYmxlIG9uIHRoZSBldmVudCBvYmplY3QsIHVzZSBpdC4gSWYgbm90LCB0aGlzIGlzIGEgcGxhaW4KICAgKiBjb21wb3NpdGlvbiBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC4KICAgKgogICAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudAogICAqIEByZXR1cm4gez9zdHJpbmd9CiAgICovCgoKICBmdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7CiAgICB2YXIgZGV0YWlsID0gbmF0aXZlRXZlbnQuZGV0YWlsOwoKICAgIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7CiAgICAgIHJldHVybiBkZXRhaWwuZGF0YTsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgYSBjb21wb3NpdGlvbiBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IEtvcmVhbiBJTUUuCiAgICogT3VyIGZhbGxiYWNrIG1vZGUgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggSUUncyBLb3JlYW4gSU1FLAogICAqIHNvIGp1c3QgdXNlIG5hdGl2ZSBjb21wb3NpdGlvbiBldmVudHMgd2hlbiBLb3JlYW4gSU1FIGlzIHVzZWQuCiAgICogQWx0aG91Z2ggQ29tcG9zaXRpb25FdmVudC5sb2NhbGUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCwKICAgKiBpdCBpcyBhdmFpbGFibGUgaW4gSUUsIHdoZXJlIG91ciBmYWxsYmFjayBtb2RlIGlzIGVuYWJsZWQuCiAgICoKICAgKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqLwoKCiAgZnVuY3Rpb24gaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkgewogICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmxvY2FsZSA9PT0gJ2tvJzsKICB9IC8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBzdGF0dXMsIGlmIGFueS4KCgogIHZhciBpc0NvbXBvc2luZyA9IGZhbHNlOwogIC8qKgogICAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljQ29tcG9zaXRpb25FdmVudC4KICAgKi8KCiAgZnVuY3Rpb24gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKICAgIHZhciBldmVudFR5cGU7CiAgICB2YXIgZmFsbGJhY2tEYXRhOwoKICAgIGlmIChjYW5Vc2VDb21wb3NpdGlvbkV2ZW50KSB7CiAgICAgIGV2ZW50VHlwZSA9IGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKGRvbUV2ZW50TmFtZSk7CiAgICB9IGVsc2UgaWYgKCFpc0NvbXBvc2luZykgewogICAgICBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHsKICAgICAgICBldmVudFR5cGUgPSAnb25Db21wb3NpdGlvblN0YXJ0JzsKICAgICAgfQogICAgfSBlbHNlIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkpIHsKICAgICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25FbmQnOwogICAgfQoKICAgIGlmICghZXZlbnRUeXBlKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmICh1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiAhaXNVc2luZ0tvcmVhbklNRShuYXRpdmVFdmVudCkpIHsKICAgICAgLy8gVGhlIGN1cnJlbnQgY29tcG9zaXRpb24gaXMgc3RvcmVkIHN0YXRpY2FsbHkgYW5kIG11c3Qgbm90IGJlCiAgICAgIC8vIG92ZXJ3cml0dGVuIHdoaWxlIGNvbXBvc2l0aW9uIGNvbnRpbnVlcy4KICAgICAgaWYgKCFpc0NvbXBvc2luZyAmJiBldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uU3RhcnQnKSB7CiAgICAgICAgaXNDb21wb3NpbmcgPSBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KTsKICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdvbkNvbXBvc2l0aW9uRW5kJykgewogICAgICAgIGlmIChpc0NvbXBvc2luZykgewogICAgICAgICAgZmFsbGJhY2tEYXRhID0gZ2V0RGF0YSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgZXZlbnRUeXBlKTsKCiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoZXZlbnRUeXBlLCBkb21FdmVudE5hbWUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7CiAgICAgICAgZXZlbnQ6IGV2ZW50LAogICAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzCiAgICAgIH0pOwoKICAgICAgaWYgKGZhbGxiYWNrRGF0YSkgewogICAgICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRlZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LgogICAgICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgcHJvcGVydHkgb2YgbmF0aXZlIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UuCiAgICAgICAgZXZlbnQuZGF0YSA9IGZhbGxiYWNrRGF0YTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgY3VzdG9tRGF0YSA9IGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpOwoKICAgICAgICBpZiAoY3VzdG9tRGF0YSAhPT0gbnVsbCkgewogICAgICAgICAgZXZlbnQuZGF0YSA9IGN1c3RvbURhdGE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHsKICAgIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7CiAgICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzoKICAgICAgICByZXR1cm4gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7CgogICAgICBjYXNlICdrZXlwcmVzcyc6CiAgICAgICAgLyoqCiAgICAgICAgICogSWYgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50cyBhcmUgYXZhaWxhYmxlLCBvdXIgZ29hbCBpcyB0byBtYWtlCiAgICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LgogICAgICAgICAqIEluIFdlYmtpdCwgcHJldmVudGluZyBkZWZhdWx0IG9uIGEgc3BhY2ViYXIgYHRleHRJbnB1dGAgZXZlbnQKICAgICAgICAgKiBjYW5jZWxzIGNoYXJhY3RlciBpbnNlcnRpb24sIGJ1dCBpdCAqYWxzbyogY2F1c2VzIHRoZSBicm93c2VyCiAgICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGUKICAgICAgICAgKiBwYWdlLgogICAgICAgICAqCiAgICAgICAgICogVHJhY2tpbmcgYXQ6CiAgICAgICAgICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM1NTEwMwogICAgICAgICAqCiAgICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YAogICAgICAgICAqIGV2ZW50IGlzIGF2YWlsYWJsZS4KICAgICAgICAgKi8KICAgICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDsKCiAgICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGhhc1NwYWNlS2V5cHJlc3MgPSB0cnVlOwogICAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSOwoKICAgICAgY2FzZSAndGV4dElucHV0JzoKICAgICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIERPTS4KICAgICAgICB2YXIgY2hhcnMgPSBuYXRpdmVFdmVudC5kYXRhOyAvLyBJZiBpdCdzIGEgc3BhY2ViYXIgY2hhcmFjdGVyLCBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZAogICAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVseS4gQW5kcm9pZCBDaHJvbWUKICAgICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMsIHNvIHdlIG5lZWQgdG8gaWdub3JlIGl0LgoKICAgICAgICBpZiAoY2hhcnMgPT09IFNQQUNFQkFSX0NIQVIgJiYgaGFzU3BhY2VLZXlwcmVzcykgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2hhcnM7CgogICAgICBkZWZhdWx0OgogICAgICAgIC8vIEZvciBvdGhlciBuYXRpdmUgZXZlbnQgdHlwZXMsIGRvIG5vdGhpbmcuCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQogIC8qKgogICAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGUKICAgKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8gdXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LgogICAqLwoKCiAgZnVuY3Rpb24gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHsKICAgIC8vIElmIHdlIGFyZSBjdXJyZW50bHkgY29tcG9zaW5nIChJTUUpIGFuZCB1c2luZyBhIGZhbGxiYWNrIHRvIGRvIHNvLAogICAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LgogICAgLy8gSWYgY29tcG9zaXRpb24gZXZlbnQgaXMgYXZhaWxhYmxlLCB3ZSBleHRyYWN0IGEgc3RyaW5nIG9ubHkgYXQKICAgIC8vIGNvbXBvc2l0aW9uZXZlbnQsIG90aGVyd2lzZSBleHRyYWN0IGl0IGF0IGZhbGxiYWNrIGV2ZW50cy4KICAgIGlmIChpc0NvbXBvc2luZykgewogICAgICBpZiAoZG9tRXZlbnROYW1lID09PSAnY29tcG9zaXRpb25lbmQnIHx8ICFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ICYmIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkgewogICAgICAgIHZhciBjaGFycyA9IGdldERhdGEoKTsKICAgICAgICByZXNldCgpOwogICAgICAgIGlzQ29tcG9zaW5nID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIGNoYXJzOwogICAgICB9CgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkgewogICAgICBjYXNlICdwYXN0ZSc6CiAgICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywgdGhyb3cgb3V0IHRoZSBpbnB1dAogICAgICAgIC8vIGNoYXJzLiBQYXN0ZSBldmVudHMgc2hvdWxkIG5vdCBsZWFkIHRvIEJlZm9yZUlucHV0IGV2ZW50cy4KICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgIGNhc2UgJ2tleXByZXNzJzoKICAgICAgICAvKioKICAgICAgICAgKiBBcyBvZiB2MjcsIEZpcmVmb3ggbWF5IGZpcmUga2V5cHJlc3MgZXZlbnRzIGV2ZW4gd2hlbiBubyBjaGFyYWN0ZXIKICAgICAgICAgKiB3aWxsIGJlIGluc2VydGVkLiBBIGZldyBwb3NzaWJpbGl0aWVzOgogICAgICAgICAqCiAgICAgICAgICogLSBgd2hpY2hgIGlzIGAwYC4gQXJyb3cga2V5cywgRXNjIGtleSwgZXRjLgogICAgICAgICAqCiAgICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBhdmFpbGFibGUuCiAgICAgICAgICogICBFeDogJ0FsdEdyICsgZGAgaW4gUG9saXNoLiBUaGVyZSBpcyBubyBtb2RpZmllZCBjaGFyYWN0ZXIgZm9yCiAgICAgICAgICogICB0aGlzIGtleSBjb21iaW5hdGlvbiBhbmQgbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkIGludG8gdGhlCiAgICAgICAgICogICBkb2N1bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdheS4KICAgICAgICAgKiAgIE5vIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci4KICAgICAgICAgKgogICAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBjb21iaW5hdGlvbiBpcwogICAgICAgICAqICAgYmVpbmcgdXNlZC4gRXg6IGBDbWQrQ2AuIE5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCwgYW5kIG5vCiAgICAgICAgICogICBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuCiAgICAgICAgICovCiAgICAgICAgaWYgKCFpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkpIHsKICAgICAgICAgIC8vIElFIGZpcmVzIHRoZSBga2V5cHJlc3NgIGV2ZW50IHdoZW4gYSB1c2VyIHR5cGVzIGFuIGVtb2ppIHZpYQogICAgICAgICAgLy8gVG91Y2gga2V5Ym9hcmQgb2YgV2luZG93cy4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgYGNoYXJgIHByb3BlcnR5CiAgICAgICAgICAvLyBob2xkcyBhbiBlbW9qaSBjaGFyYWN0ZXIgbGlrZSBgXHVEODNEXHVERTBBYC4gIEJlY2F1c2UgaXRzIGxlbmd0aAogICAgICAgICAgLy8gaXMgMiwgdGhlIHByb3BlcnR5IGB3aGljaGAgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVtb2ppIGNvcnJlY3RseS4KICAgICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlLCB3ZSBkaXJlY3RseSByZXR1cm4gdGhlIGBjaGFyYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mCiAgICAgICAgICAvLyB1c2luZyBgd2hpY2hgLgogICAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmNoYXIgJiYgbmF0aXZlRXZlbnQuY2hhci5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIHJldHVybiBuYXRpdmVFdmVudC5jaGFyOwogICAgICAgICAgfSBlbHNlIGlmIChuYXRpdmVFdmVudC53aGljaCkgewogICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgIGNhc2UgJ2NvbXBvc2l0aW9uZW5kJzoKICAgICAgICByZXR1cm4gdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7CgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KICAvKioKICAgKiBFeHRyYWN0IGEgU3ludGhldGljSW5wdXRFdmVudCBmb3IgYGJlZm9yZUlucHV0YCwgYmFzZWQgb24gZWl0aGVyIG5hdGl2ZQogICAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLgogICAqCiAgICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNJbnB1dEV2ZW50LgogICAqLwoKCiAgZnVuY3Rpb24gZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHsKICAgIHZhciBjaGFyczsKCiAgICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHsKICAgICAgY2hhcnMgPSBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpOwogICAgfSBlbHNlIHsKICAgICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7CiAgICB9IC8vIElmIG5vIGNoYXJhY3RlcnMgYXJlIGJlaW5nIGluc2VydGVkLCBubyBCZWZvcmVJbnB1dCBldmVudCBzaG91bGQKICAgIC8vIGJlIGZpcmVkLgoKCiAgICBpZiAoIWNoYXJzKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgJ29uQmVmb3JlSW5wdXQnKTsKCiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0lucHV0RXZlbnQoJ29uQmVmb3JlSW5wdXQnLCAnYmVmb3JlaW5wdXQnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOwogICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goewogICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVycwogICAgICB9KTsKICAgICAgZXZlbnQuZGF0YSA9IGNoYXJzOwogICAgfQogIH0KICAvKioKICAgKiBDcmVhdGUgYW4gYG9uQmVmb3JlSW5wdXRgIGV2ZW50IHRvIG1hdGNoCiAgICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDUvI2V2ZW50cy1pbnB1dGV2ZW50cy4KICAgKgogICAqIFRoaXMgZXZlbnQgcGx1Z2luIGlzIGJhc2VkIG9uIHRoZSBuYXRpdmUgYHRleHRJbnB1dGAgZXZlbnQKICAgKiBhdmFpbGFibGUgaW4gQ2hyb21lLCBTYWZhcmksIE9wZXJhLCBhbmQgSUUuIFRoaXMgZXZlbnQgZmlyZXMgYWZ0ZXIKICAgKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuCiAgICoKICAgKiBgYmVmb3JlSW5wdXRgIGlzIHNwZWMnZCBidXQgbm90IGltcGxlbWVudGVkIGluIGFueSBicm93c2VycywgYW5kCiAgICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzCiAgICogYWN0dWFsbHkgYmVlbiBhZGRlZCwgY29udHJhcnkgdG8gdGhlIHNwZWMuIFRodXMsIGB0ZXh0SW5wdXRgIGlzIHRoZSBiZXN0CiAgICogYXZhaWxhYmxlIGV2ZW50IHRvIGlkZW50aWZ5IHRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGluc2VydGVkCiAgICogaW50byB0aGUgdGFyZ2V0IG5vZGUuCiAgICoKICAgKiBUaGlzIHBsdWdpbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBgY29tcG9zaXRpb25gIGV2ZW50cywgdGh1cwogICAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmQKICAgKiBgY29tcG9zaXRpb25gIGV2ZW50IHR5cGVzLgogICAqLwoKCiAgZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7CiAgICBleHRyYWN0Q29tcG9zaXRpb25FdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CiAgICBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CiAgfQoKICAvKioKICAgKiBAc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3RoZS1pbnB1dC1lbGVtZW50Lmh0bWwjaW5wdXQtdHlwZS1hdHRyLXN1bW1hcnkKICAgKi8KICB2YXIgc3VwcG9ydGVkSW5wdXRUeXBlcyA9IHsKICAgIGNvbG9yOiB0cnVlLAogICAgZGF0ZTogdHJ1ZSwKICAgIGRhdGV0aW1lOiB0cnVlLAogICAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSwKICAgIGVtYWlsOiB0cnVlLAogICAgbW9udGg6IHRydWUsCiAgICBudW1iZXI6IHRydWUsCiAgICBwYXNzd29yZDogdHJ1ZSwKICAgIHJhbmdlOiB0cnVlLAogICAgc2VhcmNoOiB0cnVlLAogICAgdGVsOiB0cnVlLAogICAgdGV4dDogdHJ1ZSwKICAgIHRpbWU6IHRydWUsCiAgICB1cmw6IHRydWUsCiAgICB3ZWVrOiB0cnVlCiAgfTsKCiAgZnVuY3Rpb24gaXNUZXh0SW5wdXRFbGVtZW50KGVsZW0pIHsKICAgIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgogICAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7CiAgICAgIHJldHVybiAhIXN1cHBvcnRlZElucHV0VHlwZXNbZWxlbS50eXBlXTsKICAgIH0KCiAgICBpZiAobm9kZU5hbWUgPT09ICd0ZXh0YXJlYScpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuCiAgICoKICAgKiBOT1RFOiBUaGlzIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IGZvciBub24tZ2VuZXJpYyBldmVudHMgc3VjaCBhcyBgY2hhbmdlYCwKICAgKiBgcmVzZXRgLCBgbG9hZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0YC4KICAgKgogICAqIEJvcnJvd3MgZnJvbSBNb2Rlcm5penIuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lU3VmZml4IEV2ZW50IG5hbWUsIGUuZy4gImNsaWNrIi4KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuCiAgICogQGludGVybmFsCiAgICogQGxpY2Vuc2UgTW9kZXJuaXpyIDMuMC4wcHJlIChDdXN0b20gQnVpbGQpIHwgTUlUCiAgICovCgogIGZ1bmN0aW9uIGlzRXZlbnRTdXBwb3J0ZWQoZXZlbnROYW1lU3VmZml4KSB7CiAgICBpZiAoIWNhblVzZURPTSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudE5hbWVTdWZmaXg7CiAgICB2YXIgaXNTdXBwb3J0ZWQgPSAoZXZlbnROYW1lIGluIGRvY3VtZW50KTsKCiAgICBpZiAoIWlzU3VwcG9ydGVkKSB7CiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTsKICAgICAgaXNTdXBwb3J0ZWQgPSB0eXBlb2YgZWxlbWVudFtldmVudE5hbWVdID09PSAnZnVuY3Rpb24nOwogICAgfQoKICAgIHJldHVybiBpc1N1cHBvcnRlZDsKICB9CgogIGZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDEoKSB7CiAgICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ2hhbmdlJywgWydjaGFuZ2UnLCAnY2xpY2snLCAnZm9jdXNpbicsICdmb2N1c291dCcsICdpbnB1dCcsICdrZXlkb3duJywgJ2tleXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBpbnN0LCBuYXRpdmVFdmVudCwgdGFyZ2V0KSB7CiAgICAvLyBGbGFnIHRoaXMgZXZlbnQgbG9vcCBhcyBuZWVkaW5nIHN0YXRlIHJlc3RvcmUuCiAgICBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCk7CiAgICB2YXIgbGlzdGVuZXJzID0gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKGluc3QsICdvbkNoYW5nZScpOwoKICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkgewogICAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uQ2hhbmdlJywgJ2NoYW5nZScsIG51bGwsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpOwogICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goewogICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVycwogICAgICB9KTsKICAgIH0KICB9CiAgLyoqCiAgICogRm9yIElFIHNoaW1zCiAgICovCgoKICB2YXIgYWN0aXZlRWxlbWVudCA9IG51bGw7CiAgdmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDsKICAvKioKICAgKiBTRUNUSU9OOiBoYW5kbGUgYGNoYW5nZWAgZXZlbnQKICAgKi8KCiAgZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkgewogICAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICByZXR1cm4gbm9kZU5hbWUgPT09ICdzZWxlY3QnIHx8IG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0gJ2ZpbGUnOwogIH0KCiAgZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCkgewogICAgdmFyIGRpc3BhdGNoUXVldWUgPSBbXTsKICAgIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChkaXNwYXRjaFF1ZXVlLCBhY3RpdmVFbGVtZW50SW5zdCwgbmF0aXZlRXZlbnQsIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSk7IC8vIElmIGNoYW5nZSBhbmQgcHJvcGVydHljaGFuZ2UgYnViYmxlZCwgd2UnZCBqdXN0IGJpbmQgdG8gaXQgbGlrZSBhbGwgdGhlCiAgICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0CiAgICAvLyBkb2Vzbid0LCB3ZSBtYW51YWxseSBsaXN0ZW4gZm9yIHRoZSBldmVudHMgYW5kIHNvIHdlIGhhdmUgdG8gZW5xdWV1ZSBhbmQKICAgIC8vIHByb2Nlc3MgdGhlIGFic3RyYWN0IGV2ZW50IG1hbnVhbGx5LgogICAgLy8KICAgIC8vIEJhdGNoaW5nIGlzIG5lY2Vzc2FyeSBoZXJlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGFsbCBldmVudCBoYW5kbGVycyBydW4KICAgIC8vIGJlZm9yZSB0aGUgbmV4dCByZXJlbmRlciAoaW5jbHVkaW5nIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIHRvIGFuY2VzdG9yCiAgICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZAogICAgLy8gY29tcG9uZW50cyBkb24ndCB3b3JrIHByb3Blcmx5IGluIGNvbmp1bmN0aW9uIHdpdGggZXZlbnQgYnViYmxpbmcgYmVjYXVzZQogICAgLy8gdGhlIGNvbXBvbmVudCBpcyByZXJlbmRlcmVkIGFuZCB0aGUgdmFsdWUgcmV2ZXJ0ZWQgYmVmb3JlIGFsbCB0aGUgZXZlbnQKICAgIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC4KCiAgICBiYXRjaGVkVXBkYXRlcyhydW5FdmVudEluQmF0Y2gsIGRpc3BhdGNoUXVldWUpOwogIH0KCiAgZnVuY3Rpb24gcnVuRXZlbnRJbkJhdGNoKGRpc3BhdGNoUXVldWUpIHsKICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIDApOwogIH0KCiAgZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpIHsKICAgIHZhciB0YXJnZXROb2RlID0gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KTsKCiAgICBpZiAodXBkYXRlVmFsdWVJZkNoYW5nZWQodGFyZ2V0Tm9kZSkpIHsKICAgICAgcmV0dXJuIHRhcmdldEluc3Q7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7CiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykgewogICAgICByZXR1cm4gdGFyZ2V0SW5zdDsKICAgIH0KICB9CiAgLyoqCiAgICogU0VDVElPTjogaGFuZGxlIGBpbnB1dGAgZXZlbnQKICAgKi8KCgogIHZhciBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBmYWxzZTsKCiAgaWYgKGNhblVzZURPTSkgewogICAgLy8gSUU5IGNsYWltcyB0byBzdXBwb3J0IHRoZSBpbnB1dCBldmVudCBidXQgZmFpbHMgdG8gdHJpZ2dlciBpdCB3aGVuCiAgICAvLyBkZWxldGluZyB0ZXh0LCBzbyB3ZSBpZ25vcmUgaXRzIGlucHV0IGV2ZW50cy4KICAgIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2lucHV0JykgJiYgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID4gOSk7CiAgfQogIC8qKgogICAqIChGb3IgSUUgPD05KSBTdGFydHMgdHJhY2tpbmcgcHJvcGVydHljaGFuZ2UgZXZlbnRzIG9uIHRoZSBwYXNzZWQtaW4gZWxlbWVudAogICAqIGFuZCBvdmVycmlkZSB0aGUgdmFsdWUgcHJvcGVydHkgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggdXNlciBldmVudHMgZnJvbQogICAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuCiAgICovCgoKICBmdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7CiAgICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0OwogICAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0OwogICAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTsKICB9CiAgLyoqCiAgICogKEZvciBJRSA8PTkpIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50bHktdHJhY2tlZCBlbGVtZW50LAogICAqIGlmIGFueSBleGlzdHMuCiAgICovCgoKICBmdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHsKICAgIGlmICghYWN0aXZlRWxlbWVudCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTsKICAgIGFjdGl2ZUVsZW1lbnQgPSBudWxsOwogICAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsOwogIH0KICAvKioKICAgKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWYKICAgKiB0aGUgdmFsdWUgb2YgdGhlIGFjdGl2ZSBlbGVtZW50IGhhcyBjaGFuZ2VkLgogICAqLwoKCiAgZnVuY3Rpb24gaGFuZGxlUHJvcGVydHlDaGFuZ2UobmF0aXZlRXZlbnQpIHsKICAgIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpKSB7CiAgICAgIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQobmF0aXZlRXZlbnQpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsKGRvbUV2ZW50TmFtZSwgdGFyZ2V0LCB0YXJnZXRJbnN0KSB7CiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNpbicpIHsKICAgICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZAogICAgICAvLyBkb2Vzbid0IGZpcmUgd2hlbiB0ZXh0IGlzIGRlbGV0ZWQsIGJ1dCBjb252ZW5pZW50bHksIHNlbGVjdGlvbmNoYW5nZQogICAgICAvLyBhcHBlYXJzIHRvIGZpcmUgaW4gYWxsIG9mIHRoZSByZW1haW5pbmcgY2FzZXMgc28gd2UgY2F0Y2ggdGhvc2UgYW5kCiAgICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZAogICAgICAvLyBJbiBlaXRoZXIgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIHRoZSB2YWx1ZQogICAgICAvLyBpcyBjaGFuZ2VkIGZyb20gSlMgc28gd2UgcmVkZWZpbmUgYSBzZXR0ZXIgZm9yIGAudmFsdWVgIHRoYXQgdXBkYXRlcwogICAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlcwogICAgICAvLwogICAgICAvLyBzdG9wV2F0Y2hpbmcoKSBzaG91bGQgYmUgYSBub29wIGhlcmUgYnV0IHdlIGNhbGwgaXQganVzdCBpbiBjYXNlIHdlCiAgICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy4KICAgICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTsKICAgICAgc3RhcnRXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKHRhcmdldCwgdGFyZ2V0SW5zdCk7CiAgICB9IGVsc2UgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0JykgewogICAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpOwogICAgfQogIH0gLy8gRm9yIElFOCBhbmQgSUU5LgoKCiAgZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHsKICAgIGlmIChkb21FdmVudE5hbWUgPT09ICdzZWxlY3Rpb25jaGFuZ2UnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleXVwJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJykgewogICAgICAvLyBPbiB0aGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50LCB0aGUgdGFyZ2V0IGlzIGp1c3QgZG9jdW1lbnQgd2hpY2ggaXNuJ3QKICAgICAgLy8gaGVscGZ1bCBmb3IgdXMgc28ganVzdCBjaGVjayBhY3RpdmVFbGVtZW50IGluc3RlYWQuCiAgICAgIC8vCiAgICAgIC8vIDk5JSBvZiB0aGUgdGltZSwga2V5ZG93biBhbmQga2V5dXAgYXJlbid0IG5lY2Vzc2FyeS4gSUU4IGZhaWxzIHRvIGZpcmUKICAgICAgLy8gcHJvcGVydHljaGFuZ2Ugb24gdGhlIGZpcnN0IGlucHV0IGV2ZW50IGFmdGVyIHNldHRpbmcgYHZhbHVlYCBmcm9tIGEKICAgICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseQogICAgICAvLyBnZXRzIGl0IGFuZCBjYXRjaGluZyBrZXlkb3duIGxldHMgdXMgZmlyZSBhbiBldmVudCBmb3IgdGhlIGZpcnN0CiAgICAgIC8vIGtleXN0cm9rZSBpZiB1c2VyIGRvZXMgYSBrZXkgcmVwZWF0IChpdCdsbCBiZSBhIGxpdHRsZSBkZWxheWVkOiByaWdodAogICAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0bwogICAgICAvLyBmaXJlIHNlbGVjdGlvbmNoYW5nZSBub3JtYWxseS4KICAgICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCk7CiAgICB9CiAgfQogIC8qKgogICAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50CiAgICovCgoKICBmdW5jdGlvbiBzaG91bGRVc2VDbGlja0V2ZW50KGVsZW0pIHsKICAgIC8vIFVzZSB0aGUgYGNsaWNrYCBldmVudCB0byBkZXRlY3QgY2hhbmdlcyB0byBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzLgogICAgLy8gVGhpcyBhcHByb2FjaCB3b3JrcyBhY3Jvc3MgYWxsIGJyb3dzZXJzLCB3aGVyZWFzIGBjaGFuZ2VgIGRvZXMgbm90IGZpcmUKICAgIC8vIHVudGlsIGBibHVyYCBpbiBJRTguCiAgICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lOwogICAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtLnR5cGUgPT09ICdyYWRpbycpOwogIH0KCiAgZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7CiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAnY2xpY2snKSB7CiAgICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkgewogICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2lucHV0JyB8fCBkb21FdmVudE5hbWUgPT09ICdjaGFuZ2UnKSB7CiAgICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKG5vZGUpIHsKICAgIHZhciBzdGF0ZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZTsKCiAgICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5jb250cm9sbGVkIHx8IG5vZGUudHlwZSAhPT0gJ251bWJlcicpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHsKICAgICAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1cgogICAgICBzZXREZWZhdWx0VmFsdWUobm9kZSwgJ251bWJlcicsIG5vZGUudmFsdWUpOwogICAgfQogIH0KICAvKioKICAgKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvbkNoYW5nZWAgZXZlbnQgdGhhdCBub3JtYWxpemVzIGNoYW5nZSBldmVudHMKICAgKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy4gVGhpcyBldmVudCBmaXJlcyBhdCBhIHRpbWUgd2hlbiBpdCdzIHBvc3NpYmxlIHRvCiAgICogY2hhbmdlIHRoZSBlbGVtZW50J3MgdmFsdWUgd2l0aG91dCBzZWVpbmcgYSBmbGlja2VyLgogICAqCiAgICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZToKICAgKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApCiAgICogLSB0ZXh0YXJlYQogICAqIC0gc2VsZWN0CiAgICovCgoKICBmdW5jdGlvbiBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikgewogICAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdzsKICAgIHZhciBnZXRUYXJnZXRJbnN0RnVuYywgaGFuZGxlRXZlbnRGdW5jOwoKICAgIGlmIChzaG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkgewogICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudDsKICAgIH0gZWxzZSBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpKSB7CiAgICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpIHsKICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudFBvbHlmaWxsOwogICAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDsKICAgICAgfQogICAgfSBlbHNlIGlmIChzaG91bGRVc2VDbGlja0V2ZW50KHRhcmdldE5vZGUpKSB7CiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7CiAgICB9CgogICAgaWYgKGdldFRhcmdldEluc3RGdW5jKSB7CiAgICAgIHZhciBpbnN0ID0gZ2V0VGFyZ2V0SW5zdEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KTsKCiAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CgogICAgaWYgKGhhbmRsZUV2ZW50RnVuYykgewogICAgICBoYW5kbGVFdmVudEZ1bmMoZG9tRXZlbnROYW1lLCB0YXJnZXROb2RlLCB0YXJnZXRJbnN0KTsKICAgIH0gLy8gV2hlbiBibHVycmluZywgc2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUgZm9yIG51bWJlciBpbnB1dHMKCgogICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0JykgewogICAgICBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKHRhcmdldE5vZGUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMigpIHsKICAgIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uTW91c2VFbnRlcicsIFsnbW91c2VvdXQnLCAnbW91c2VvdmVyJ10pOwogICAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUxlYXZlJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7CiAgICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJFbnRlcicsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTsKICAgIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckxlYXZlJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pOwogIH0KICAvKioKICAgKiBGb3IgYWxtb3N0IGV2ZXJ5IGludGVyYWN0aW9uIHdlIGNhcmUgYWJvdXQsIHRoZXJlIHdpbGwgYmUgYm90aCBhIHRvcC1sZXZlbAogICAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXQKICAgKiB3ZSBkbyBub3QgZXh0cmFjdCBkdXBsaWNhdGUgZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhlCiAgICogYnJvd3NlciBmcm9tIG91dHNpZGUgd2lsbCBub3QgZmlyZSBhIGBtb3VzZW91dGAgZXZlbnQuIEluIHRoaXMgY2FzZSwgd2UgdXNlCiAgICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC4KICAgKi8KCgogIGZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7CiAgICB2YXIgaXNPdmVyRXZlbnQgPSBkb21FdmVudE5hbWUgPT09ICdtb3VzZW92ZXInIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJzsKICAgIHZhciBpc091dEV2ZW50ID0gZG9tRXZlbnROYW1lID09PSAnbW91c2VvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnOwoKICAgIGlmIChpc092ZXJFdmVudCAmJiAhaXNSZXBsYXlpbmdFdmVudChuYXRpdmVFdmVudCkpIHsKICAgICAgLy8gSWYgdGhpcyBpcyBhbiBvdmVyIGV2ZW50IHdpdGggYSB0YXJnZXQsIHdlIG1pZ2h0IGhhdmUgYWxyZWFkeSBkaXNwYXRjaGVkCiAgICAgIC8vIHRoZSBldmVudCBpbiB0aGUgb3V0IGV2ZW50IG9mIHRoZSBvdGhlciB0YXJnZXQuIElmIHRoaXMgaXMgcmVwbGF5ZWQsCiAgICAgIC8vIHRoZW4gaXQncyBiZWNhdXNlIHdlIGNvdWxkbid0IGRpc3BhdGNoIGFnYWluc3QgdGhpcyB0YXJnZXQgcHJldmlvdXNseQogICAgICAvLyBzbyB3ZSBoYXZlIHRvIGRvIGl0IG5vdyBpbnN0ZWFkLgogICAgICB2YXIgcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQ7CgogICAgICBpZiAocmVsYXRlZCkgewogICAgICAgIC8vIElmIHRoZSByZWxhdGVkIG5vZGUgaXMgbWFuYWdlZCBieSBSZWFjdCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGhhdmUKICAgICAgICAvLyBhbHJlYWR5IGRpc3BhdGNoZWQgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnRzIGR1cmluZyBpdHMgbW91c2VvdXQuCiAgICAgICAgaWYgKGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJlbGF0ZWQpIHx8IGlzQ29udGFpbmVyTWFya2VkQXNSb290KHJlbGF0ZWQpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKCFpc091dEV2ZW50ICYmICFpc092ZXJFdmVudCkgewogICAgICAvLyBNdXN0IG5vdCBiZSBhIG1vdXNlIG9yIHBvaW50ZXIgaW4gb3Igb3V0IC0gaWdub3JpbmcuCiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgd2luOyAvLyBUT0RPOiB3aHkgaXMgdGhpcyBudWxsYWJsZSBpbiB0aGUgdHlwZXMgYnV0IHdlIHJlYWQgZnJvbSBpdD8KCiAgICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkgewogICAgICAvLyBgbmF0aXZlRXZlbnRUYXJnZXRgIGlzIHByb2JhYmx5IGEgd2luZG93IG9iamVjdC4KICAgICAgd2luID0gbmF0aXZlRXZlbnRUYXJnZXQ7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBgb3duZXJEb2N1bWVudGAgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBpbiBJRTguCiAgICAgIHZhciBkb2MgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50OwoKICAgICAgaWYgKGRvYykgewogICAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93OwogICAgICB9IGVsc2UgewogICAgICAgIHdpbiA9IHdpbmRvdzsKICAgICAgfQogICAgfQoKICAgIHZhciBmcm9tOwogICAgdmFyIHRvOwoKICAgIGlmIChpc091dEV2ZW50KSB7CiAgICAgIHZhciBfcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50OwoKICAgICAgZnJvbSA9IHRhcmdldEluc3Q7CiAgICAgIHRvID0gX3JlbGF0ZWQgPyBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShfcmVsYXRlZCkgOiBudWxsOwoKICAgICAgaWYgKHRvICE9PSBudWxsKSB7CiAgICAgICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0byk7CgogICAgICAgIGlmICh0byAhPT0gbmVhcmVzdE1vdW50ZWQgfHwgdG8udGFnICE9PSBIb3N0Q29tcG9uZW50ICYmIHRvLnRhZyAhPT0gSG9zdFRleHQpIHsKICAgICAgICAgIHRvID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIE1vdmluZyB0byBhIG5vZGUgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cuCiAgICAgIGZyb20gPSBudWxsOwogICAgICB0byA9IHRhcmdldEluc3Q7CiAgICB9CgogICAgaWYgKGZyb20gPT09IHRvKSB7CiAgICAgIC8vIE5vdGhpbmcgcGVydGFpbnMgdG8gb3VyIG1hbmFnZWQgY29tcG9uZW50cy4KICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50OwogICAgdmFyIGxlYXZlRXZlbnRUeXBlID0gJ29uTW91c2VMZWF2ZSc7CiAgICB2YXIgZW50ZXJFdmVudFR5cGUgPSAnb25Nb3VzZUVudGVyJzsKICAgIHZhciBldmVudFR5cGVQcmVmaXggPSAnbW91c2UnOwoKICAgIGlmIChkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3ZlcicpIHsKICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50OwogICAgICBsZWF2ZUV2ZW50VHlwZSA9ICdvblBvaW50ZXJMZWF2ZSc7CiAgICAgIGVudGVyRXZlbnRUeXBlID0gJ29uUG9pbnRlckVudGVyJzsKICAgICAgZXZlbnRUeXBlUHJlZml4ID0gJ3BvaW50ZXInOwogICAgfQoKICAgIHZhciBmcm9tTm9kZSA9IGZyb20gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7CiAgICB2YXIgdG9Ob2RlID0gdG8gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UodG8pOwogICAgdmFyIGxlYXZlID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihsZWF2ZUV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2xlYXZlJywgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKICAgIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlOwogICAgbGVhdmUucmVsYXRlZFRhcmdldCA9IHRvTm9kZTsKICAgIHZhciBlbnRlciA9IG51bGw7IC8vIFdlIHNob3VsZCBvbmx5IHByb2Nlc3MgdGhpcyBuYXRpdmVFdmVudCBpZiB3ZSBhcmUgcHJvY2Vzc2luZwogICAgLy8gdGhlIGZpcnN0IGFuY2VzdG9yLiBOZXh0IHRpbWUsIHdlIHdpbGwgaWdub3JlIHRoZSBldmVudC4KCiAgICB2YXIgbmF0aXZlVGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTsKCiAgICBpZiAobmF0aXZlVGFyZ2V0SW5zdCA9PT0gdGFyZ2V0SW5zdCkgewogICAgICB2YXIgZW50ZXJFdmVudCA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IoZW50ZXJFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdlbnRlcicsIHRvLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOwogICAgICBlbnRlckV2ZW50LnRhcmdldCA9IHRvTm9kZTsKICAgICAgZW50ZXJFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7CiAgICAgIGVudGVyID0gZW50ZXJFdmVudDsKICAgIH0KCiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZVR3b1BoYXNlTGlzdGVuZXJzKGRpc3BhdGNoUXVldWUsIGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pOwogIH0KCiAgLyoqCiAgICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93bgogICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pcwogICAqLwogIGZ1bmN0aW9uIGlzKHgsIHkpIHsKICAgIHJldHVybiB4ID09PSB5ICYmICh4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSkgfHwgeCAhPT0geCAmJiB5ICE9PSB5IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlCiAgICA7CiAgfQoKICB2YXIgb2JqZWN0SXMgPSB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaXM7CgogIC8qKgogICAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2UKICAgKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy4KICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgdmFsdWVzIG9mIGFsbCBrZXlzIGFyZSBzdHJpY3RseSBlcXVhbC4KICAgKi8KCiAgZnVuY3Rpb24gc2hhbGxvd0VxdWFsKG9iakEsIG9iakIpIHsKICAgIGlmIChvYmplY3RJcyhvYmpBLCBvYmpCKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpOwogICAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7CgogICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi4KCgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY3VycmVudEtleSA9IGtleXNBW2ldOwoKICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGN1cnJlbnRLZXkpIHx8ICFvYmplY3RJcyhvYmpBW2N1cnJlbnRLZXldLCBvYmpCW2N1cnJlbnRLZXldKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLyoqCiAgICogR2l2ZW4gYW55IG5vZGUgcmV0dXJuIHRoZSBmaXJzdCBsZWFmIG5vZGUgd2l0aG91dCBjaGlsZHJlbi4KICAgKgogICAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZQogICAqIEByZXR1cm4ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9CiAgICovCgogIGZ1bmN0aW9uIGdldExlYWZOb2RlKG5vZGUpIHsKICAgIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGlsZCkgewogICAgICBub2RlID0gbm9kZS5maXJzdENoaWxkOwogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0KICAvKioKICAgKiBHZXQgdGhlIG5leHQgc2libGluZyB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgd2lsbCB3YWxrIHVwIHRoZQogICAqIERPTSBpZiBhIG5vZGUncyBzaWJsaW5ncyBoYXZlIGJlZW4gZXhoYXVzdGVkLgogICAqCiAgICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlCiAgICogQHJldHVybiB7P0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9CiAgICovCgoKICBmdW5jdGlvbiBnZXRTaWJsaW5nTm9kZShub2RlKSB7CiAgICB3aGlsZSAobm9kZSkgewogICAgICBpZiAobm9kZS5uZXh0U2libGluZykgewogICAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nOwogICAgICB9CgogICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgfQogIH0KICAvKioKICAgKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuCiAgICoKICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IHJvb3QKICAgKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0CiAgICogQHJldHVybiB7P29iamVjdH0KICAgKi8KCgogIGZ1bmN0aW9uIGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQocm9vdCwgb2Zmc2V0KSB7CiAgICB2YXIgbm9kZSA9IGdldExlYWZOb2RlKHJvb3QpOwogICAgdmFyIG5vZGVTdGFydCA9IDA7CiAgICB2YXIgbm9kZUVuZCA9IDA7CgogICAgd2hpbGUgKG5vZGUpIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkgewogICAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDsKCiAgICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5vZGU6IG5vZGUsCiAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbm9kZVN0YXJ0ID0gbm9kZUVuZDsKICAgICAgfQoKICAgICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTsKICAgIH0KICB9CgogIC8qKgogICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb3V0ZXJOb2RlCiAgICogQHJldHVybiB7P29iamVjdH0KICAgKi8KCiAgZnVuY3Rpb24gZ2V0T2Zmc2V0cyhvdXRlck5vZGUpIHsKICAgIHZhciBvd25lckRvY3VtZW50ID0gb3V0ZXJOb2RlLm93bmVyRG9jdW1lbnQ7CiAgICB2YXIgd2luID0gb3duZXJEb2N1bWVudCAmJiBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsKICAgIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uICYmIHdpbi5nZXRTZWxlY3Rpb24oKTsKCiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICB2YXIgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlLAogICAgICAgIGFuY2hvck9mZnNldCA9IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsCiAgICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSwKICAgICAgICBmb2N1c09mZnNldCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldDsgLy8gSW4gRmlyZWZveCwgYW5jaG9yTm9kZSBhbmQgZm9jdXNOb2RlIGNhbiBiZSAiYW5vbnltb3VzIGRpdnMiLCBlLmcuIHRoZQogICAgLy8gdXAvZG93biBidXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPSJudW1iZXIiPi4gQW5vbnltb3VzIGRpdnMgZG8gbm90IHNlZW0gdG8KICAgIC8vIGV4cG9zZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgIlBlcm1pc3Npb24gZGVuaWVkIGVycm9yIiBpZiBhbnkgb2YgaXRzCiAgICAvLyBwcm9wZXJ0aWVzIGFyZSBhY2Nlc3NlZC4gVGhlIG9ubHkgc2VlbWluZ2x5IHBvc3NpYmxlIHdheSB0byBhdm9pZCBlcnJvcmluZwogICAgLy8gaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmQKICAgIC8vIGNhdGNoIGFueSBlcnJvciB0aGF0IG1heSBvdGhlcndpc2UgYXJpc2UuIFNlZQogICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NDI3CgogICAgdHJ5IHsKICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovCiAgICAgIGFuY2hvck5vZGUubm9kZVR5cGU7CiAgICAgIGZvY3VzTm9kZS5ub2RlVHlwZTsKICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi8KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcmV0dXJuIGdldE1vZGVybk9mZnNldHNGcm9tUG9pbnRzKG91dGVyTm9kZSwgYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTsKICB9CiAgLyoqCiAgICogUmV0dXJucyB7c3RhcnQsIGVuZH0gd2hlcmUgYHN0YXJ0YCBpcyB0aGUgY2hhcmFjdGVyL2NvZGVwb2ludCBpbmRleCBvZgogICAqIChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpIHdpdGhpbiB0aGUgdGV4dENvbnRlbnQgb2YgYG91dGVyTm9kZWAsIGFuZAogICAqIGBlbmRgIGlzIHRoZSBpbmRleCBvZiAoZm9jdXNOb2RlLCBmb2N1c09mZnNldCkuCiAgICoKICAgKiBSZXR1cm5zIG51bGwgaWYgeW91IHBhc3MgaW4gZ2FyYmFnZSBpbnB1dCBidXQgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgY3Jhc2guCiAgICoKICAgKiBFeHBvcnRlZCBvbmx5IGZvciB0ZXN0aW5nLgogICAqLwoKICBmdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkgewogICAgdmFyIGxlbmd0aCA9IDA7CiAgICB2YXIgc3RhcnQgPSAtMTsKICAgIHZhciBlbmQgPSAtMTsKICAgIHZhciBpbmRleFdpdGhpbkFuY2hvciA9IDA7CiAgICB2YXIgaW5kZXhXaXRoaW5Gb2N1cyA9IDA7CiAgICB2YXIgbm9kZSA9IG91dGVyTm9kZTsKICAgIHZhciBwYXJlbnROb2RlID0gbnVsbDsKCiAgICBvdXRlcjogd2hpbGUgKHRydWUpIHsKICAgICAgdmFyIG5leHQgPSBudWxsOwoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBpZiAobm9kZSA9PT0gYW5jaG9yTm9kZSAmJiAoYW5jaG9yT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHsKICAgICAgICAgIHN0YXJ0ID0gbGVuZ3RoICsgYW5jaG9yT2Zmc2V0OwogICAgICAgIH0KCiAgICAgICAgaWYgKG5vZGUgPT09IGZvY3VzTm9kZSAmJiAoZm9jdXNPZmZzZXQgPT09IDAgfHwgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSkgewogICAgICAgICAgZW5kID0gbGVuZ3RoICsgZm9jdXNPZmZzZXQ7CiAgICAgICAgfQoKICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7CiAgICAgICAgICBsZW5ndGggKz0gbm9kZS5ub2RlVmFsdWUubGVuZ3RoOwogICAgICAgIH0KCiAgICAgICAgaWYgKChuZXh0ID0gbm9kZS5maXJzdENoaWxkKSA9PT0gbnVsbCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIGZpcnN0IGNoaWxkIGBuZXh0YC4KCgogICAgICAgIHBhcmVudE5vZGUgPSBub2RlOwogICAgICAgIG5vZGUgPSBuZXh0OwogICAgICB9CgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmIChub2RlID09PSBvdXRlck5vZGUpIHsKICAgICAgICAgIC8vIElmIGBvdXRlck5vZGVgIGhhcyBjaGlsZHJlbiwgdGhpcyBpcyBhbHdheXMgdGhlIHNlY29uZCB0aW1lIHZpc2l0aW5nCiAgICAgICAgICAvLyBpdC4gSWYgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIGlzIHN0aWxsIHRoZSBmaXJzdCBsb29wLCBhbmQgdGhlIG9ubHkKICAgICAgICAgIC8vIHZhbGlkIHNlbGVjdGlvbiBpcyBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgYm90aCBlcXVhbCB0byB0aGlzIG5vZGUKICAgICAgICAgIC8vIGFuZCBib3RoIG9mZnNldHMgMCwgaW4gd2hpY2ggY2FzZSB3ZSB3aWxsIGhhdmUgaGFuZGxlZCBhYm92ZS4KICAgICAgICAgIGJyZWFrIG91dGVyOwogICAgICAgIH0KCiAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IGFuY2hvck5vZGUgJiYgKytpbmRleFdpdGhpbkFuY2hvciA9PT0gYW5jaG9yT2Zmc2V0KSB7CiAgICAgICAgICBzdGFydCA9IGxlbmd0aDsKICAgICAgICB9CgogICAgICAgIGlmIChwYXJlbnROb2RlID09PSBmb2N1c05vZGUgJiYgKytpbmRleFdpdGhpbkZvY3VzID09PSBmb2N1c09mZnNldCkgewogICAgICAgICAgZW5kID0gbGVuZ3RoOwogICAgICAgIH0KCiAgICAgICAgaWYgKChuZXh0ID0gbm9kZS5uZXh0U2libGluZykgIT09IG51bGwpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgbm9kZSA9IHBhcmVudE5vZGU7CiAgICAgICAgcGFyZW50Tm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIG5leHQgc2libGluZyBgbmV4dGAuCgoKICAgICAgbm9kZSA9IG5leHQ7CiAgICB9CgogICAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKSB7CiAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gKFdvdWxkIGhhcHBlbiBpZiB0aGUgYW5jaG9yL2ZvY3VzIG5vZGVzIGFyZW4ndAogICAgICAvLyBhY3R1YWxseSBpbnNpZGUgdGhlIHBhc3NlZC1pbiBub2RlLikKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgc3RhcnQ6IHN0YXJ0LAogICAgICBlbmQ6IGVuZAogICAgfTsKICB9CiAgLyoqCiAgICogSW4gbW9kZXJuIG5vbi1JRSBicm93c2Vycywgd2UgY2FuIHN1cHBvcnQgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZAogICAqIHNlbGVjdGlvbnMuCiAgICoKICAgKiBOb3RlOiBJRTEwKyBzdXBwb3J0cyB0aGUgU2VsZWN0aW9uIG9iamVjdCwgYnV0IGl0IGRvZXMgbm90IHN1cHBvcnQKICAgKiB0aGUgYGV4dGVuZGAgbWV0aG9kLCB3aGljaCBtZWFucyB0aGF0IGV2ZW4gaW4gbW9kZXJuIElFLCBpdCdzIG5vdCBwb3NzaWJsZQogICAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFCiAgICogdmVyc2lvbnMsIHdlIHVzZSB0aGUgb2xkIElFIEFQSSB0byBjcmVhdGUgb3VyIHNlbGVjdGlvbnMuCiAgICoKICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGUKICAgKiBAcGFyYW0ge29iamVjdH0gb2Zmc2V0cwogICAqLwoKICBmdW5jdGlvbiBzZXRPZmZzZXRzKG5vZGUsIG9mZnNldHMpIHsKICAgIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7CiAgICB2YXIgd2luID0gZG9jICYmIGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7IC8vIEVkZ2UgZmFpbHMgd2l0aCAiT2JqZWN0IGV4cGVjdGVkIiBpbiBzb21lIHNjZW5hcmlvcy4KICAgIC8vIChGb3IgaW5zdGFuY2U6IFRpbnlNQ0UgZWRpdG9yIHVzZWQgaW4gYSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHBhc3RpbmcgdG8gYWRkIG1vcmUsCiAgICAvLyBmYWlscyB3aGVuIHBhc3RpbmcgMTAwKyBpdGVtcykKCiAgICBpZiAoIXdpbi5nZXRTZWxlY3Rpb24pIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7CiAgICB2YXIgbGVuZ3RoID0gbm9kZS50ZXh0Q29udGVudC5sZW5ndGg7CiAgICB2YXIgc3RhcnQgPSBNYXRoLm1pbihvZmZzZXRzLnN0YXJ0LCBsZW5ndGgpOwogICAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpOyAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuCiAgICAvLyBGbGlwIGJhY2t3YXJkIHNlbGVjdGlvbnMsIHNvIHdlIGNhbiBzZXQgd2l0aCBhIHNpbmdsZSByYW5nZS4KCiAgICBpZiAoIXNlbGVjdGlvbi5leHRlbmQgJiYgc3RhcnQgPiBlbmQpIHsKICAgICAgdmFyIHRlbXAgPSBlbmQ7CiAgICAgIGVuZCA9IHN0YXJ0OwogICAgICBzdGFydCA9IHRlbXA7CiAgICB9CgogICAgdmFyIHN0YXJ0TWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBzdGFydCk7CiAgICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpOwoKICAgIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHsKICAgICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAxICYmIHNlbGVjdGlvbi5hbmNob3JOb2RlID09PSBzdGFydE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgPT09IHN0YXJ0TWFya2VyLm9mZnNldCAmJiBzZWxlY3Rpb24uZm9jdXNOb2RlID09PSBlbmRNYXJrZXIubm9kZSAmJiBzZWxlY3Rpb24uZm9jdXNPZmZzZXQgPT09IGVuZE1hcmtlci5vZmZzZXQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpOwogICAgICByYW5nZS5zZXRTdGFydChzdGFydE1hcmtlci5ub2RlLCBzdGFydE1hcmtlci5vZmZzZXQpOwogICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7CgogICAgICBpZiAoc3RhcnQgPiBlbmQpIHsKICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpOwogICAgICAgIHNlbGVjdGlvbi5leHRlbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpOwogICAgICB9IGVsc2UgewogICAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7CiAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNUZXh0Tm9kZShub2RlKSB7CiAgICByZXR1cm4gbm9kZSAmJiBub2RlLm5vZGVUeXBlID09PSBURVhUX05PREU7CiAgfQoKICBmdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHsKICAgIGlmICghb3V0ZXJOb2RlIHx8ICFpbm5lck5vZGUpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShvdXRlck5vZGUpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShpbm5lck5vZGUpKSB7CiAgICAgIHJldHVybiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUucGFyZW50Tm9kZSk7CiAgICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7CiAgICAgIHJldHVybiBvdXRlck5vZGUuY29udGFpbnMoaW5uZXJOb2RlKTsKICAgIH0gZWxzZSBpZiAob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7CiAgICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzSW5Eb2N1bWVudChub2RlKSB7CiAgICByZXR1cm4gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgY29udGFpbnNOb2RlKG5vZGUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG5vZGUpOwogIH0KCiAgZnVuY3Rpb24gaXNTYW1lT3JpZ2luRnJhbWUoaWZyYW1lKSB7CiAgICB0cnkgewogICAgICAvLyBBY2Nlc3NpbmcgdGhlIGNvbnRlbnREb2N1bWVudCBvZiBhIEhUTUxJZnJhbWVFbGVtZW50IGNhbiBjYXVzZSB0aGUgYnJvd3NlcgogICAgICAvLyB0byB0aHJvdywgZS5nLiBpZiBpdCBoYXMgYSBjcm9zcy1vcmlnaW4gc3JjIGF0dHJpYnV0ZS4KICAgICAgLy8gU2FmYXJpIHdpbGwgc2hvdyBhbiBlcnJvciBpbiB0aGUgY29uc29sZSB3aGVuIHRoZSBhY2Nlc3MgcmVzdWx0cyBpbiAiQmxvY2tlZCBhIGZyYW1lIHdpdGggb3JpZ2luIi4gZS5nOgogICAgICAvLyBpZnJhbWUuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3OwogICAgICAvLyBBIHNhZmV0eSB3YXkgaXMgdG8gYWNjZXNzIG9uZSBvZiB0aGUgY3Jvc3Mgb3JpZ2luIHByb3BlcnRpZXM6IFdpbmRvdyBvciBMb2NhdGlvbgogICAgICAvLyBXaGljaCBtaWdodCByZXN1bHQgaW4gIlNlY3VyaXR5RXJyb3IiIERPTSBFeGNlcHRpb24gYW5kIGl0IGlzIGNvbXBhdGlibGUgdG8gU2FmYXJpLgogICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9icm93c2Vycy5odG1sI2ludGVncmF0aW9uLXdpdGgtaWRsCiAgICAgIHJldHVybiB0eXBlb2YgaWZyYW1lLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZiA9PT0gJ3N0cmluZyc7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudERlZXAoKSB7CiAgICB2YXIgd2luID0gd2luZG93OwogICAgdmFyIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KCk7CgogICAgd2hpbGUgKGVsZW1lbnQgaW5zdGFuY2VvZiB3aW4uSFRNTElGcmFtZUVsZW1lbnQpIHsKICAgICAgaWYgKGlzU2FtZU9yaWdpbkZyYW1lKGVsZW1lbnQpKSB7CiAgICAgICAgd2luID0gZWxlbWVudC5jb250ZW50V2luZG93OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICB9CgogICAgICBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCh3aW4uZG9jdW1lbnQpOwogICAgfQoKICAgIHJldHVybiBlbGVtZW50OwogIH0KICAvKioKICAgKiBAUmVhY3RJbnB1dFNlbGVjdGlvbjogUmVhY3QgaW5wdXQgc2VsZWN0aW9uIG1vZHVsZS4gQmFzZWQgb24gU2VsZWN0aW9uLmpzLAogICAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3QKICAgKiBhc3N1bWUgYnV0dG9ucyBoYXZlIHJhbmdlIHNlbGVjdGlvbnMgYWxsb3dlZCkuCiAgICogSW5wdXQgc2VsZWN0aW9uIG1vZHVsZSBmb3IgUmVhY3QuCiAgICovCgogIC8qKgogICAqIEBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6IHdlIGdldCB0aGUgZWxlbWVudCB0eXBlcyB0aGF0IHN1cHBvcnQgc2VsZWN0aW9uCiAgICogZnJvbSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNkby1ub3QtYXBwbHksIGxvb2tpbmcgYXQgYHNlbGVjdGlvblN0YXJ0YAogICAqIGFuZCBgc2VsZWN0aW9uRW5kYCByb3dzLgogICAqLwoKCiAgZnVuY3Rpb24gaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGVsZW0pIHsKICAgIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICByZXR1cm4gbm9kZU5hbWUgJiYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICd0ZXh0JyB8fCBlbGVtLnR5cGUgPT09ICdzZWFyY2gnIHx8IGVsZW0udHlwZSA9PT0gJ3RlbCcgfHwgZWxlbS50eXBlID09PSAndXJsJyB8fCBlbGVtLnR5cGUgPT09ICdwYXNzd29yZCcpIHx8IG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpOwogIH0KICBmdW5jdGlvbiBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpIHsKICAgIHZhciBmb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7CiAgICByZXR1cm4gewogICAgICBmb2N1c2VkRWxlbTogZm9jdXNlZEVsZW0sCiAgICAgIHNlbGVjdGlvblJhbmdlOiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZm9jdXNlZEVsZW0pID8gZ2V0U2VsZWN0aW9uKGZvY3VzZWRFbGVtKSA6IG51bGwKICAgIH07CiAgfQogIC8qKgogICAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LAogICAqIHJlc3RvcmUgaXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcGVyZm9ybWluZyBvcGVyYXRpb25zIHRoYXQgY291bGQgcmVtb3ZlIGRvbQogICAqIG5vZGVzIGFuZCBwbGFjZSB0aGVtIGJhY2sgaW4sIHJlc3VsdGluZyBpbiBmb2N1cyBiZWluZyBsb3N0LgogICAqLwoKICBmdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHsKICAgIHZhciBjdXJGb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnREZWVwKCk7CiAgICB2YXIgcHJpb3JGb2N1c2VkRWxlbSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uZm9jdXNlZEVsZW07CiAgICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7CgogICAgaWYgKGN1ckZvY3VzZWRFbGVtICE9PSBwcmlvckZvY3VzZWRFbGVtICYmIGlzSW5Eb2N1bWVudChwcmlvckZvY3VzZWRFbGVtKSkgewogICAgICBpZiAocHJpb3JTZWxlY3Rpb25SYW5nZSAhPT0gbnVsbCAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSkpIHsKICAgICAgICBzZXRTZWxlY3Rpb24ocHJpb3JGb2N1c2VkRWxlbSwgcHJpb3JTZWxlY3Rpb25SYW5nZSk7CiAgICAgIH0gLy8gRm9jdXNpbmcgYSBub2RlIGNhbiBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiwgd2hpY2ggaXMgdW5kZXNpcmFibGUKCgogICAgICB2YXIgYW5jZXN0b3JzID0gW107CiAgICAgIHZhciBhbmNlc3RvciA9IHByaW9yRm9jdXNlZEVsZW07CgogICAgICB3aGlsZSAoYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlKSB7CiAgICAgICAgaWYgKGFuY2VzdG9yLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHsKICAgICAgICAgIGFuY2VzdG9ycy5wdXNoKHsKICAgICAgICAgICAgZWxlbWVudDogYW5jZXN0b3IsCiAgICAgICAgICAgIGxlZnQ6IGFuY2VzdG9yLnNjcm9sbExlZnQsCiAgICAgICAgICAgIHRvcDogYW5jZXN0b3Iuc2Nyb2xsVG9wCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICh0eXBlb2YgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMoKTsKICAgICAgfQoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbmNlc3RvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgaW5mbyA9IGFuY2VzdG9yc1tpXTsKICAgICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDsKICAgICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsVG9wID0gaW5mby50b3A7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogQGdldFNlbGVjdGlvbjogR2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIGZvY3VzZWQgdGV4dGFyZWEsIGlucHV0IG9yCiAgICogY29udGVudEVkaXRhYmxlIG5vZGUuCiAgICogLUBpbnB1dDogTG9vayB1cCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXQKICAgKiAtQHJldHVybiB7c3RhcnQ6IHNlbGVjdGlvblN0YXJ0LCBlbmQ6IHNlbGVjdGlvbkVuZH0KICAgKi8KCiAgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKGlucHV0KSB7CiAgICB2YXIgc2VsZWN0aW9uOwoKICAgIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7CiAgICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuCiAgICAgIHNlbGVjdGlvbiA9IHsKICAgICAgICBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsCiAgICAgICAgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmQKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIENvbnRlbnQgZWRpdGFibGUgb3Igb2xkIElFIHRleHRhcmVhLgogICAgICBzZWxlY3Rpb24gPSBnZXRPZmZzZXRzKGlucHV0KTsKICAgIH0KCiAgICByZXR1cm4gc2VsZWN0aW9uIHx8IHsKICAgICAgc3RhcnQ6IDAsCiAgICAgIGVuZDogMAogICAgfTsKICB9CiAgLyoqCiAgICogQHNldFNlbGVjdGlvbjogU2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIHRleHRhcmVhIG9yIGlucHV0IGFuZCBmb2N1c2VzCiAgICogdGhlIGlucHV0LgogICAqIC1AaW5wdXQgICAgIFNldCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXQgb3IgdGV4dGFyZWEKICAgKiAtQG9mZnNldHMgICBPYmplY3Qgb2Ygc2FtZSBmb3JtIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBnZXQqCiAgICovCgogIGZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgb2Zmc2V0cykgewogICAgdmFyIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDsKICAgIHZhciBlbmQgPSBvZmZzZXRzLmVuZDsKCiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHsKICAgICAgZW5kID0gc3RhcnQ7CiAgICB9CgogICAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gaW5wdXQpIHsKICAgICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDsKICAgICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpOwogICAgfSBlbHNlIHsKICAgICAgc2V0T2Zmc2V0cyhpbnB1dCwgb2Zmc2V0cyk7CiAgICB9CiAgfQoKICB2YXIgc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSAxMTsKCiAgZnVuY3Rpb24gcmVnaXN0ZXJFdmVudHMkMygpIHsKICAgIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25TZWxlY3QnLCBbJ2ZvY3Vzb3V0JywgJ2NvbnRleHRtZW51JywgJ2RyYWdlbmQnLCAnZm9jdXNpbicsICdrZXlkb3duJywgJ2tleXVwJywgJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3NlbGVjdGlvbmNoYW5nZSddKTsKICB9CgogIHZhciBhY3RpdmVFbGVtZW50JDEgPSBudWxsOwogIHZhciBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDsKICB2YXIgbGFzdFNlbGVjdGlvbiA9IG51bGw7CiAgdmFyIG1vdXNlRG93biA9IGZhbHNlOwogIC8qKgogICAqIEdldCBhbiBvYmplY3Qgd2hpY2ggaXMgYSB1bmlxdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgogICAqCiAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIG5vdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBub2RlcyBvciBicm93c2VycywgYnV0CiAgICogdHdvIGlkZW50aWNhbCBzZWxlY3Rpb25zIG9uIHRoZSBzYW1lIG5vZGUgd2lsbCByZXR1cm4gaWRlbnRpY2FsIG9iamVjdHMuCiAgICovCgogIGZ1bmN0aW9uIGdldFNlbGVjdGlvbiQxKG5vZGUpIHsKICAgIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIG5vZGUgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG5vZGUpKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgc3RhcnQ6IG5vZGUuc2VsZWN0aW9uU3RhcnQsCiAgICAgICAgZW5kOiBub2RlLnNlbGVjdGlvbkVuZAogICAgICB9OwogICAgfSBlbHNlIHsKICAgICAgdmFyIHdpbiA9IG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93OwogICAgICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpOwogICAgICByZXR1cm4gewogICAgICAgIGFuY2hvck5vZGU6IHNlbGVjdGlvbi5hbmNob3JOb2RlLAogICAgICAgIGFuY2hvck9mZnNldDogc2VsZWN0aW9uLmFuY2hvck9mZnNldCwKICAgICAgICBmb2N1c05vZGU6IHNlbGVjdGlvbi5mb2N1c05vZGUsCiAgICAgICAgZm9jdXNPZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldAogICAgICB9OwogICAgfQogIH0KICAvKioKICAgKiBHZXQgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0YXJnZXQuCiAgICovCgoKICBmdW5jdGlvbiBnZXRFdmVudFRhcmdldERvY3VtZW50KGV2ZW50VGFyZ2V0KSB7CiAgICByZXR1cm4gZXZlbnRUYXJnZXQud2luZG93ID09PSBldmVudFRhcmdldCA/IGV2ZW50VGFyZ2V0LmRvY3VtZW50IDogZXZlbnRUYXJnZXQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyBldmVudFRhcmdldCA6IGV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7CiAgfQogIC8qKgogICAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC4KICAgKgogICAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudAogICAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFRhcmdldAogICAqIEByZXR1cm4gez9TeW50aGV0aWNFdmVudH0KICAgKi8KCgogIGZ1bmN0aW9uIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkgewogICAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhCiAgICAvLyBzZWxlY3Rpb24gKHRoaXMgbWF0Y2hlcyBuYXRpdmUgYHNlbGVjdGAgZXZlbnQgYmVoYXZpb3IpLiBJbiBIVE1MNSwgc2VsZWN0CiAgICAvLyBmaXJlcyBvbmx5IG9uIGlucHV0IGFuZCB0ZXh0YXJlYSB0aHVzIGlmIHRoZXJlJ3Mgbm8gZm9jdXNlZCBlbGVtZW50IHdlCiAgICAvLyB3b24ndCBkaXNwYXRjaC4KICAgIHZhciBkb2MgPSBnZXRFdmVudFRhcmdldERvY3VtZW50KG5hdGl2ZUV2ZW50VGFyZ2V0KTsKCiAgICBpZiAobW91c2VEb3duIHx8IGFjdGl2ZUVsZW1lbnQkMSA9PSBudWxsIHx8IGFjdGl2ZUVsZW1lbnQkMSAhPT0gZ2V0QWN0aXZlRWxlbWVudChkb2MpKSB7CiAgICAgIHJldHVybjsKICAgIH0gLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLgoKCiAgICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbiQxKGFjdGl2ZUVsZW1lbnQkMSk7CgogICAgaWYgKCFsYXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHsKICAgICAgbGFzdFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247CiAgICAgIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoYWN0aXZlRWxlbWVudEluc3QkMSwgJ29uU2VsZWN0Jyk7CgogICAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uU2VsZWN0JywgJ3NlbGVjdCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CiAgICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHsKICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzCiAgICAgICAgfSk7CiAgICAgICAgZXZlbnQudGFyZ2V0ID0gYWN0aXZlRWxlbWVudCQxOwogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uU2VsZWN0YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgc2VsZWN0IGV2ZW50cwogICAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLgogICAqCiAgICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZToKICAgKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApCiAgICogLSB0ZXh0YXJlYQogICAqIC0gY29udGVudEVkaXRhYmxlCiAgICoKICAgKiBUaGlzIGRpZmZlcnMgZnJvbSBuYXRpdmUgYnJvd3NlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB3YXlzOgogICAqIC0gRmlyZXMgb24gY29udGVudEVkaXRhYmxlIGZpZWxkcyBhcyB3ZWxsIGFzIGlucHV0cy4KICAgKiAtIEZpcmVzIGZvciBjb2xsYXBzZWQgc2VsZWN0aW9uLgogICAqIC0gRmlyZXMgYWZ0ZXIgdXNlciBpbnB1dC4KICAgKi8KCgogIGZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7CiAgICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93OwoKICAgIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7CiAgICAgIC8vIFRyYWNrIHRoZSBpbnB1dCBub2RlIHRoYXQgaGFzIGZvY3VzLgogICAgICBjYXNlICdmb2N1c2luJzoKICAgICAgICBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpIHx8IHRhcmdldE5vZGUuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpIHsKICAgICAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IHRhcmdldE5vZGU7CiAgICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdDsKICAgICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdmb2N1c291dCc6CiAgICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDsKICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDsKICAgICAgICBsYXN0U2VsZWN0aW9uID0gbnVsbDsKICAgICAgICBicmVhazsKICAgICAgLy8gRG9uJ3QgZmlyZSB0aGUgZXZlbnQgd2hpbGUgdGhlIHVzZXIgaXMgZHJhZ2dpbmcuIFRoaXMgbWF0Y2hlcyB0aGUKICAgICAgLy8gc2VtYW50aWNzIG9mIHRoZSBuYXRpdmUgc2VsZWN0IGV2ZW50LgoKICAgICAgY2FzZSAnbW91c2Vkb3duJzoKICAgICAgICBtb3VzZURvd24gPSB0cnVlOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnY29udGV4dG1lbnUnOgogICAgICBjYXNlICdtb3VzZXVwJzoKICAgICAgY2FzZSAnZHJhZ2VuZCc6CiAgICAgICAgbW91c2VEb3duID0gZmFsc2U7CiAgICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTsKICAgICAgICBicmVhazsKICAgICAgLy8gQ2hyb21lIGFuZCBJRSBmaXJlIG5vbi1zdGFuZGFyZCBldmVudCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFuZ2VkIChhbmQKICAgICAgLy8gc29tZXRpbWVzIHdoZW4gaXQgaGFzbid0KS4gSUUncyBldmVudCBmaXJlcyBvdXQgb2Ygb3JkZXIgd2l0aCByZXNwZWN0CiAgICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LgogICAgICAvLwogICAgICAvLyBGaXJlZm94IGRvZXNuJ3Qgc3VwcG9ydCBzZWxlY3Rpb25jaGFuZ2UsIHNvIGNoZWNrIHNlbGVjdGlvbiBzdGF0dXMKICAgICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmUKICAgICAgLy8ga2V5dXAsIGJ1dCB3ZSBjaGVjayBvbiBrZXlkb3duIGFzIHdlbGwgaW4gdGhlIGNhc2Ugb2YgaG9sZGluZyBkb3duIGEKICAgICAgLy8ga2V5LCB3aGVuIG11bHRpcGxlIGtleWRvd24gZXZlbnRzIGFyZSBmaXJlZCBidXQgb25seSBvbmUga2V5dXAgaXMuCiAgICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS4KCiAgICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6CiAgICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgLy8gZmFsbHMgdGhyb3VnaAoKICAgICAgY2FzZSAna2V5ZG93bic6CiAgICAgIGNhc2UgJ2tleXVwJzoKICAgICAgICBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOwogICAgfQogIH0KCiAgLyoqCiAgICogR2VuZXJhdGUgYSBtYXBwaW5nIG9mIHN0YW5kYXJkIHZlbmRvciBwcmVmaXhlcyB1c2luZyB0aGUgZGVmaW5lZCBzdHlsZSBwcm9wZXJ0eSBhbmQgZXZlbnQgbmFtZS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZVByb3AKICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lCiAgICogQHJldHVybnMge29iamVjdH0KICAgKi8KCiAgZnVuY3Rpb24gbWFrZVByZWZpeE1hcChzdHlsZVByb3AsIGV2ZW50TmFtZSkgewogICAgdmFyIHByZWZpeGVzID0ge307CiAgICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTsKICAgIHByZWZpeGVzWydXZWJraXQnICsgc3R5bGVQcm9wXSA9ICd3ZWJraXQnICsgZXZlbnROYW1lOwogICAgcHJlZml4ZXNbJ01veicgKyBzdHlsZVByb3BdID0gJ21veicgKyBldmVudE5hbWU7CiAgICByZXR1cm4gcHJlZml4ZXM7CiAgfQogIC8qKgogICAqIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBwcmVmaXhlcy4KICAgKi8KCgogIHZhciB2ZW5kb3JQcmVmaXhlcyA9IHsKICAgIGFuaW1hdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkVuZCcpLAogICAgYW5pbWF0aW9uaXRlcmF0aW9uOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uSXRlcmF0aW9uJyksCiAgICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksCiAgICB0cmFuc2l0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdUcmFuc2l0aW9uJywgJ1RyYW5zaXRpb25FbmQnKQogIH07CiAgLyoqCiAgICogRXZlbnQgbmFtZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBkZXRlY3RlZCBhbmQgcHJlZml4ZWQgKGlmIGFwcGxpY2FibGUpLgogICAqLwoKICB2YXIgcHJlZml4ZWRFdmVudE5hbWVzID0ge307CiAgLyoqCiAgICogRWxlbWVudCB0byBjaGVjayBmb3IgcHJlZml4ZXMgb24uCiAgICovCgogIHZhciBzdHlsZSA9IHt9OwogIC8qKgogICAqIEJvb3RzdHJhcCBpZiBhIERPTSBleGlzdHMuCiAgICovCgogIGlmIChjYW5Vc2VET00pIHsKICAgIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7IC8vIE9uIHNvbWUgcGxhdGZvcm1zLCBpbiBwYXJ0aWN1bGFyIHNvbWUgcmVsZWFzZXMgb2YgQW5kcm9pZCA0LngsCiAgICAvLyB0aGUgdW4tcHJlZml4ZWQgImFuaW1hdGlvbiIgYW5kICJ0cmFuc2l0aW9uIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZQogICAgLy8gc3R5bGUgb2JqZWN0IGJ1dCB0aGUgZXZlbnRzIHRoYXQgZmlyZSB3aWxsIHN0aWxsIGJlIHByZWZpeGVkLCBzbyB3ZSBuZWVkCiAgICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLgoKICAgIGlmICghKCdBbmltYXRpb25FdmVudCcgaW4gd2luZG93KSkgewogICAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjsKICAgICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb247CiAgICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25zdGFydC5hbmltYXRpb247CiAgICB9IC8vIFNhbWUgYXMgYWJvdmUKCgogICAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luZG93KSkgewogICAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uOwogICAgfQogIH0KICAvKioKICAgKiBBdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdmVuZG9yIHByZWZpeGVkIGV2ZW50IG5hbWUuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lCiAgICogQHJldHVybnMge3N0cmluZ30KICAgKi8KCgogIGZ1bmN0aW9uIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKGV2ZW50TmFtZSkgewogICAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7CiAgICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTsKICAgIH0gZWxzZSBpZiAoIXZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV0pIHsKICAgICAgcmV0dXJuIGV2ZW50TmFtZTsKICAgIH0KCiAgICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTsKCiAgICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7CiAgICAgIGlmIChwcmVmaXhNYXAuaGFzT3duUHJvcGVydHkoc3R5bGVQcm9wKSAmJiBzdHlsZVByb3AgaW4gc3R5bGUpIHsKICAgICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBldmVudE5hbWU7CiAgfQoKICB2YXIgQU5JTUFUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25lbmQnKTsKICB2YXIgQU5JTUFUSU9OX0lURVJBVElPTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKTsKICB2YXIgQU5JTUFUSU9OX1NUQVJUID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbnN0YXJ0Jyk7CiAgdmFyIFRSQU5TSVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ3RyYW5zaXRpb25lbmQnKTsKCiAgdmFyIHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzID0gbmV3IE1hcCgpOyAvLyBOT1RFOiBDYXBpdGFsaXphdGlvbiBpcyBpbXBvcnRhbnQgaW4gdGhpcyBsaXN0IQogIC8vCiAgLy8gRS5nLiBpdCBuZWVkcyAicG9pbnRlckRvd24iLCBub3QgInBvaW50ZXJkb3duIi4KICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2UgZGVyaXZlIGJvdGggUmVhY3QgbmFtZSAoIm9uUG9pbnRlckRvd24iKQogIC8vIGFuZCBET00gbmFtZSAoInBvaW50ZXJkb3duIikgZnJvbSB0aGUgc2FtZSBsaXN0LgogIC8vCiAgLy8gRXhjZXB0aW9ucyB0aGF0IGRvbid0IG1hdGNoIHRoaXMgY29udmVudGlvbiBhcmUgbGlzdGVkIHNlcGFyYXRlbHkuCiAgLy8KICAvLyBwcmV0dGllci1pZ25vcmUKCiAgdmFyIHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzID0gWydhYm9ydCcsICdhdXhDbGljaycsICdjYW5jZWwnLCAnY2FuUGxheScsICdjYW5QbGF5VGhyb3VnaCcsICdjbGljaycsICdjbG9zZScsICdjb250ZXh0TWVudScsICdjb3B5JywgJ2N1dCcsICdkcmFnJywgJ2RyYWdFbmQnLCAnZHJhZ0VudGVyJywgJ2RyYWdFeGl0JywgJ2RyYWdMZWF2ZScsICdkcmFnT3ZlcicsICdkcmFnU3RhcnQnLCAnZHJvcCcsICdkdXJhdGlvbkNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdnb3RQb2ludGVyQ2FwdHVyZScsICdpbnB1dCcsICdpbnZhbGlkJywgJ2tleURvd24nLCAna2V5UHJlc3MnLCAna2V5VXAnLCAnbG9hZCcsICdsb2FkZWREYXRhJywgJ2xvYWRlZE1ldGFkYXRhJywgJ2xvYWRTdGFydCcsICdsb3N0UG9pbnRlckNhcHR1cmUnLCAnbW91c2VEb3duJywgJ21vdXNlTW92ZScsICdtb3VzZU91dCcsICdtb3VzZU92ZXInLCAnbW91c2VVcCcsICdwYXN0ZScsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncG9pbnRlckNhbmNlbCcsICdwb2ludGVyRG93bicsICdwb2ludGVyTW92ZScsICdwb2ludGVyT3V0JywgJ3BvaW50ZXJPdmVyJywgJ3BvaW50ZXJVcCcsICdwcm9ncmVzcycsICdyYXRlQ2hhbmdlJywgJ3Jlc2V0JywgJ3Jlc2l6ZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1Ym1pdCcsICdzdXNwZW5kJywgJ3RpbWVVcGRhdGUnLCAndG91Y2hDYW5jZWwnLCAndG91Y2hFbmQnLCAndG91Y2hTdGFydCcsICd2b2x1bWVDaGFuZ2UnLCAnc2Nyb2xsJywgJ3RvZ2dsZScsICd0b3VjaE1vdmUnLCAnd2FpdGluZycsICd3aGVlbCddOwoKICBmdW5jdGlvbiByZWdpc3RlclNpbXBsZUV2ZW50KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKSB7CiAgICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5zZXQoZG9tRXZlbnROYW1lLCByZWFjdE5hbWUpOwogICAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlYWN0TmFtZSwgW2RvbUV2ZW50TmFtZV0pOwogIH0KCiAgZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudHMoKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBldmVudE5hbWUgPSBzaW1wbGVFdmVudFBsdWdpbkV2ZW50c1tpXTsKICAgICAgdmFyIGRvbUV2ZW50TmFtZSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICB2YXIgY2FwaXRhbGl6ZWRFdmVudCA9IGV2ZW50TmFtZVswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnROYW1lLnNsaWNlKDEpOwogICAgICByZWdpc3RlclNpbXBsZUV2ZW50KGRvbUV2ZW50TmFtZSwgJ29uJyArIGNhcGl0YWxpemVkRXZlbnQpOwogICAgfSAvLyBTcGVjaWFsIGNhc2VzIHdoZXJlIGV2ZW50IG5hbWVzIGRvbid0IG1hdGNoLgoKCiAgICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9FTkQsICdvbkFuaW1hdGlvbkVuZCcpOwogICAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fSVRFUkFUSU9OLCAnb25BbmltYXRpb25JdGVyYXRpb24nKTsKICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoQU5JTUFUSU9OX1NUQVJULCAnb25BbmltYXRpb25TdGFydCcpOwogICAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZGJsY2xpY2snLCAnb25Eb3VibGVDbGljaycpOwogICAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZm9jdXNpbicsICdvbkZvY3VzJyk7CiAgICByZWdpc3RlclNpbXBsZUV2ZW50KCdmb2N1c291dCcsICdvbkJsdXInKTsKICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoVFJBTlNJVElPTl9FTkQsICdvblRyYW5zaXRpb25FbmQnKTsKICB9CgogIGZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7CiAgICB2YXIgcmVhY3ROYW1lID0gdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuZ2V0KGRvbUV2ZW50TmFtZSk7CgogICAgaWYgKHJlYWN0TmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRXZlbnQ7CiAgICB2YXIgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7CgogICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHsKICAgICAgY2FzZSAna2V5cHJlc3MnOgogICAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGtleXByZXNzIGV2ZW50IGZvciBmdW5jdGlvbiBrZXlzIHRvby4gVGhpcyByZW1vdmVzCiAgICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmQKICAgICAgICAvLyBub24tcHJpbnRhYmxlLiBPbmUgd291bGQgZXhwZWN0IFRhYiB0byBiZSBhcyB3ZWxsIChidXQgaXQgaXNuJ3QpLgogICAgICAgIGlmIChnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSA9PT0gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi8KCiAgICAgIGNhc2UgJ2tleWRvd24nOgogICAgICBjYXNlICdrZXl1cCc6CiAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2ZvY3VzaW4nOgogICAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2ZvY3VzJzsKICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50OwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnZm9jdXNvdXQnOgogICAgICAgIHJlYWN0RXZlbnRUeXBlID0gJ2JsdXInOwogICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdiZWZvcmVibHVyJzoKICAgICAgY2FzZSAnYWZ0ZXJibHVyJzoKICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50OwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnY2xpY2snOgogICAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGNsaWNrIGV2ZW50IG9uIHJpZ2h0IG1vdXNlIGNsaWNrcy4gVGhpcyByZW1vdmVzIHRoZQogICAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy4KICAgICAgICBpZiAobmF0aXZlRXZlbnQuYnV0dG9uID09PSAyKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgLyogZmFsbHMgdGhyb3VnaCAqLwoKICAgICAgY2FzZSAnYXV4Y2xpY2snOgogICAgICBjYXNlICdkYmxjbGljayc6CiAgICAgIGNhc2UgJ21vdXNlZG93bic6CiAgICAgIGNhc2UgJ21vdXNlbW92ZSc6CiAgICAgIGNhc2UgJ21vdXNldXAnOiAvLyBUT0RPOiBEaXNhYmxlZCBlbGVtZW50cyBzaG91bGQgbm90IHJlc3BvbmQgdG8gbW91c2UgZXZlbnRzCgogICAgICAvKiBmYWxscyB0aHJvdWdoICovCgogICAgICBjYXNlICdtb3VzZW91dCc6CiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6CiAgICAgIGNhc2UgJ2NvbnRleHRtZW51JzoKICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50OwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnZHJhZyc6CiAgICAgIGNhc2UgJ2RyYWdlbmQnOgogICAgICBjYXNlICdkcmFnZW50ZXInOgogICAgICBjYXNlICdkcmFnZXhpdCc6CiAgICAgIGNhc2UgJ2RyYWdsZWF2ZSc6CiAgICAgIGNhc2UgJ2RyYWdvdmVyJzoKICAgICAgY2FzZSAnZHJhZ3N0YXJ0JzoKICAgICAgY2FzZSAnZHJvcCc6CiAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRHJhZ0V2ZW50OwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAndG91Y2hjYW5jZWwnOgogICAgICBjYXNlICd0b3VjaGVuZCc6CiAgICAgIGNhc2UgJ3RvdWNobW92ZSc6CiAgICAgIGNhc2UgJ3RvdWNoc3RhcnQnOgogICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIEFOSU1BVElPTl9FTkQ6CiAgICAgIGNhc2UgQU5JTUFUSU9OX0lURVJBVElPTjoKICAgICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6CiAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQW5pbWF0aW9uRXZlbnQ7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIFRSQU5TSVRJT05fRU5EOgogICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3Njcm9sbCc6CiAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVUlFdmVudDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3doZWVsJzoKICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNXaGVlbEV2ZW50OwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnY29weSc6CiAgICAgIGNhc2UgJ2N1dCc6CiAgICAgIGNhc2UgJ3Bhc3RlJzoKICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzoKICAgICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzoKICAgICAgY2FzZSAncG9pbnRlcmNhbmNlbCc6CiAgICAgIGNhc2UgJ3BvaW50ZXJkb3duJzoKICAgICAgY2FzZSAncG9pbnRlcm1vdmUnOgogICAgICBjYXNlICdwb2ludGVyb3V0JzoKICAgICAgY2FzZSAncG9pbnRlcm92ZXInOgogICAgICBjYXNlICdwb2ludGVydXAnOgogICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDsKICAgICAgICBicmVhazsKICAgIH0KCiAgICB2YXIgaW5DYXB0dXJlUGhhc2UgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UpICE9PSAwOwoKICAgIHsKICAgICAgLy8gU29tZSBldmVudHMgZG9uJ3QgYnViYmxlIGluIHRoZSBicm93c2VyLgogICAgICAvLyBJbiB0aGUgcGFzdCwgUmVhY3QgaGFzIGFsd2F5cyBidWJibGVkIHRoZW0sIGJ1dCB0aGlzIGNhbiBiZSBzdXJwcmlzaW5nLgogICAgICAvLyBXZSdyZSBnb2luZyB0byB0cnkgYWxpZ25pbmcgY2xvc2VyIHRvIHRoZSBicm93c2VyIGJlaGF2aW9yIGJ5IG5vdCBidWJibGluZwogICAgICAvLyB0aGVtIGluIFJlYWN0IGVpdGhlci4gV2UnbGwgc3RhcnQgYnkgbm90IGJ1YmJsaW5nIG9uU2Nyb2xsLCBhbmQgdGhlbiBleHBhbmQuCiAgICAgIHZhciBhY2N1bXVsYXRlVGFyZ2V0T25seSA9ICFpbkNhcHR1cmVQaGFzZSAmJiAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYWRkIGFsbCBldmVudHMgZnJvbQogICAgICAvLyBub25EZWxlZ2F0ZWRFdmVudHMgbGlzdCBpbiBET01QbHVnaW5FdmVudFN5c3RlbS4KICAgICAgLy8gVGhlbiB3ZSBjYW4gcmVtb3ZlIHRoaXMgc3BlY2lhbCBsaXN0LgogICAgICAvLyBUaGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdlIHRoYXQgY2FuIHdhaXQgdW50aWwgUmVhY3QgMTguCiAgICAgIGRvbUV2ZW50TmFtZSA9PT0gJ3Njcm9sbCc7CgogICAgICB2YXIgX2xpc3RlbmVycyA9IGFjY3VtdWxhdGVTaW5nbGVQaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCByZWFjdE5hbWUsIG5hdGl2ZUV2ZW50LnR5cGUsIGluQ2FwdHVyZVBoYXNlLCBhY2N1bXVsYXRlVGFyZ2V0T25seSk7CgogICAgICBpZiAoX2xpc3RlbmVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBjcmVhdGUgZXZlbnQgbGF6aWx5LgogICAgICAgIHZhciBfZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CgogICAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7CiAgICAgICAgICBldmVudDogX2V2ZW50LAogICAgICAgICAgbGlzdGVuZXJzOiBfbGlzdGVuZXJzCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFRPRE86IHJlbW92ZSB0b3AtbGV2ZWwgc2lkZSBlZmZlY3QuCiAgcmVnaXN0ZXJTaW1wbGVFdmVudHMoKTsKICByZWdpc3RlckV2ZW50cyQyKCk7CiAgcmVnaXN0ZXJFdmVudHMkMSgpOwogIHJlZ2lzdGVyRXZlbnRzJDMoKTsKICByZWdpc3RlckV2ZW50cygpOwoKICBmdW5jdGlvbiBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikgewogICAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29uY2VwdCBvZiBhICJTaW1wbGVFdmVudFBsdWdpbiIuCiAgICAvLyBUaGlzIGlzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBldmVudCBzeXN0ZW0uIEFsbAogICAgLy8gdGhlIG90aGVyIHBsdWdpbnMgYXJlIGVzc2VudGlhbGx5IHBvbHlmaWxscy4gU28gdGhlIHBsdWdpbgogICAgLy8gc2hvdWxkIHByb2JhYmx5IGJlIGlubGluZWQgc29tZXdoZXJlIGFuZCBoYXZlIGl0cyBsb2dpYwogICAgLy8gYmUgY29yZSB0aGUgdG8gZXZlbnQgc3lzdGVtLiBUaGlzIHdvdWxkIHBvdGVudGlhbGx5IGFsbG93CiAgICAvLyB1cyB0byBzaGlwIGJ1aWxkcyBvZiBSZWFjdCB3aXRob3V0IHRoZSBwb2x5ZmlsbGVkIHBsdWdpbnMgYmVsb3cuCiAgICBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpOwogICAgdmFyIHNob3VsZFByb2Nlc3NQb2x5ZmlsbFBsdWdpbnMgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TKSA9PT0gMDsgLy8gV2UgZG9uJ3QgcHJvY2VzcyB0aGVzZSBldmVudHMgdW5sZXNzIHdlIGFyZSBpbiB0aGUKICAgIC8vIGV2ZW50J3MgbmF0aXZlICJidWJibGUiIHBoYXNlLCB3aGljaCBtZWFucyB0aGF0IHdlJ3JlCiAgICAvLyBub3QgaW4gdGhlIGNhcHR1cmUgcGhhc2UuIFRoYXQncyBiZWNhdXNlIHdlIGVtdWxhdGUKICAgIC8vIHRoZSBjYXB0dXJlIHBoYXNlIGhlcmUgc3RpbGwuIFRoaXMgaXMgYSB0cmFkZS1vZmYsCiAgICAvLyBiZWNhdXNlIGluIGFuIGlkZWFsIHdvcmxkIHdlIHdvdWxkIG5vdCBlbXVsYXRlIGFuZCB1c2UKICAgIC8vIHRoZSBwaGFzZXMgcHJvcGVybHksIGxpa2Ugd2UgZG8gd2l0aCB0aGUgU2ltcGxlRXZlbnQKICAgIC8vIHBsdWdpbi4gSG93ZXZlciwgdGhlIHBsdWdpbnMgYmVsb3cgZWl0aGVyIGV4cGVjdAogICAgLy8gZW11bGF0aW9uIChFbnRlckxlYXZlKSBvciB1c2Ugc3RhdGUgbG9jYWxpemVkIHRvIHRoYXQKICAgIC8vIHBsdWdpbiAoQmVmb3JlSW5wdXQsIENoYW5nZSwgU2VsZWN0KS4gVGhlIHN0YXRlIGluCiAgICAvLyB0aGVzZSBtb2R1bGVzIGNvbXBsaWNhdGVzIHRoaW5ncywgYXMgeW91J2xsIGVzc2VudGlhbGx5CiAgICAvLyBnZXQgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhcHR1cmUgcGhhc2UgZXZlbnQgbWlnaHQgY2hhbmdlCiAgICAvLyBzdGF0ZSwgb25seSBmb3IgdGhlIGZvbGxvd2luZyBidWJibGUgZXZlbnQgdG8gY29tZSBpbgogICAgLy8gbGF0ZXIgYW5kIG5vdCB0cmlnZ2VyIGFueXRoaW5nIGFzIHRoZSBzdGF0ZSBub3cKICAgIC8vIGludmFsaWRhdGVzIHRoZSBoZXVyaXN0aWNzIG9mIHRoZSBldmVudCBwbHVnaW4uIFdlCiAgICAvLyBjb3VsZCBhbHRlciBhbGwgdGhlc2UgcGx1Z2lucyB0byB3b3JrIGluIHN1Y2ggd2F5cywgYnV0CiAgICAvLyB0aGF0IG1pZ2h0IGNhdXNlIG90aGVyIHVua25vd24gc2lkZS1lZmZlY3RzIHRoYXQgd2UKICAgIC8vIGNhbid0IGZvcmVzZWUgcmlnaHQgbm93LgoKICAgIGlmIChzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zKSB7CiAgICAgIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CiAgICAgIGV4dHJhY3RFdmVudHMkMShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CiAgICAgIGV4dHJhY3RFdmVudHMkMyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7CiAgICAgIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpOwogICAgfQogIH0gLy8gTGlzdCBvZiBldmVudHMgdGhhdCBuZWVkIHRvIGJlIGluZGl2aWR1YWxseSBhdHRhY2hlZCB0byBtZWRpYSBlbGVtZW50cy4KCgogIHZhciBtZWRpYUV2ZW50VHlwZXMgPSBbJ2Fib3J0JywgJ2NhbnBsYXknLCAnY2FucGxheXRocm91Z2gnLCAnZHVyYXRpb25jaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnbG9hZGVkZGF0YScsICdsb2FkZWRtZXRhZGF0YScsICdsb2Fkc3RhcnQnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVjaGFuZ2UnLCAncmVzaXplJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VzcGVuZCcsICd0aW1ldXBkYXRlJywgJ3ZvbHVtZWNoYW5nZScsICd3YWl0aW5nJ107IC8vIFdlIHNob3VsZCBub3QgZGVsZWdhdGUgdGhlc2UgZXZlbnRzIHRvIHRoZSBjb250YWluZXIsIGJ1dCByYXRoZXIKICAvLyBzZXQgdGhlbSBvbiB0aGUgYWN0dWFsIHRhcmdldCBlbGVtZW50IGl0c2VsZi4gVGhpcyBpcyBwcmltYXJpbHkKICAvLyBiZWNhdXNlIHRoZXNlIGV2ZW50cyBkbyBub3QgY29uc2lzdGVudGx5IGJ1YmJsZSBpbiB0aGUgRE9NLgoKICB2YXIgbm9uRGVsZWdhdGVkRXZlbnRzID0gbmV3IFNldChbJ2NhbmNlbCcsICdjbG9zZScsICdpbnZhbGlkJywgJ2xvYWQnLCAnc2Nyb2xsJywgJ3RvZ2dsZSddLmNvbmNhdChtZWRpYUV2ZW50VHlwZXMpKTsKCiAgZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkgewogICAgdmFyIHR5cGUgPSBldmVudC50eXBlIHx8ICd1bmtub3duLWV2ZW50JzsKICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0OwogICAgaW52b2tlR3VhcmRlZENhbGxiYWNrQW5kQ2F0Y2hGaXJzdEVycm9yKHR5cGUsIGxpc3RlbmVyLCB1bmRlZmluZWQsIGV2ZW50KTsKICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBudWxsOwogIH0KCiAgZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGRpc3BhdGNoTGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSkgewogICAgdmFyIHByZXZpb3VzSW5zdGFuY2U7CgogICAgaWYgKGluQ2FwdHVyZVBoYXNlKSB7CiAgICAgIGZvciAodmFyIGkgPSBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IGRpc3BhdGNoTGlzdGVuZXJzW2ldLAogICAgICAgICAgICBpbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmluc3RhbmNlLAogICAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuY3VycmVudFRhcmdldCwKICAgICAgICAgICAgbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5saXN0ZW5lcjsKCiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpOwogICAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgX2krKykgewogICAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kgPSBkaXNwYXRjaExpc3RlbmVyc1tfaV0sCiAgICAgICAgICAgIF9pbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRfaS5pbnN0YW5jZSwKICAgICAgICAgICAgX2N1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuY3VycmVudFRhcmdldCwKICAgICAgICAgICAgX2xpc3RlbmVyID0gX2Rpc3BhdGNoTGlzdGVuZXJzJF9pLmxpc3RlbmVyOwoKICAgICAgICBpZiAoX2luc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgX2xpc3RlbmVyLCBfY3VycmVudFRhcmdldCk7CiAgICAgICAgcHJldmlvdXNJbnN0YW5jZSA9IF9pbnN0YW5jZTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncykgewogICAgdmFyIGluQ2FwdHVyZVBoYXNlID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19DQVBUVVJFX1BIQVNFKSAhPT0gMDsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoUXVldWUubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIF9kaXNwYXRjaFF1ZXVlJGkgPSBkaXNwYXRjaFF1ZXVlW2ldLAogICAgICAgICAgZXZlbnQgPSBfZGlzcGF0Y2hRdWV1ZSRpLmV2ZW50LAogICAgICAgICAgbGlzdGVuZXJzID0gX2Rpc3BhdGNoUXVldWUkaS5saXN0ZW5lcnM7CiAgICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBsaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKTsgLy8gIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLgogICAgfSAvLyBUaGlzIHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHJldGhyb3cgaWYgYW55IG9mIHRoZSBldmVudCBoYW5kbGVycyB0aHJldy4KCgogICAgcmV0aHJvd0NhdWdodEVycm9yKCk7CiAgfQoKICBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKSB7CiAgICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCk7CiAgICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdOwogICAgZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzKTsKICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpOwogIH0KCiAgZnVuY3Rpb24gbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEVsZW1lbnQpIHsKICAgIHsKICAgICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHsKICAgICAgICBlcnJvcignRGlkIG5vdCBleHBlY3QgYSBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCkgY2FsbCBmb3IgIiVzIi4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBkb21FdmVudE5hbWUpOwogICAgICB9CiAgICB9CgogICAgdmFyIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIgPSBmYWxzZTsKICAgIHZhciBsaXN0ZW5lclNldCA9IGdldEV2ZW50TGlzdGVuZXJTZXQodGFyZ2V0RWxlbWVudCk7CiAgICB2YXIgbGlzdGVuZXJTZXRLZXkgPSBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpOwoKICAgIGlmICghbGlzdGVuZXJTZXQuaGFzKGxpc3RlbmVyU2V0S2V5KSkgewogICAgICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBkb21FdmVudE5hbWUsIElTX05PTl9ERUxFR0FURUQsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpOwogICAgICBsaXN0ZW5lclNldC5hZGQobGlzdGVuZXJTZXRLZXkpOwogICAgfQogIH0KICBmdW5jdGlvbiBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgdGFyZ2V0KSB7CiAgICB7CiAgICAgIGlmIChub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkgJiYgIWlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHsKICAgICAgICBlcnJvcignRGlkIG5vdCBleHBlY3QgYSBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCkgY2FsbCBmb3IgIiVzIiBpbiB0aGUgYnViYmxlIHBoYXNlLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGRvbUV2ZW50TmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgZXZlbnRTeXN0ZW1GbGFncyA9IDA7CgogICAgaWYgKGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHsKICAgICAgZXZlbnRTeXN0ZW1GbGFncyB8PSBJU19DQVBUVVJFX1BIQVNFOwogICAgfQoKICAgIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldCwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTsKICB9IC8vIFRoaXMgaXMgb25seSB1c2VkIGJ5IGNyZWF0ZUV2ZW50SGFuZGxlIHdoZW4gdGhlCiAgdmFyIGxpc3RlbmluZ01hcmtlciA9ICdfcmVhY3RMaXN0ZW5pbmcnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7CiAgZnVuY3Rpb24gbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpIHsKICAgIGlmICghcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSkgewogICAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTsKICAgICAgYWxsTmF0aXZlRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGRvbUV2ZW50TmFtZSkgewogICAgICAgIC8vIFdlIGhhbmRsZSBzZWxlY3Rpb25jaGFuZ2Ugc2VwYXJhdGVseSBiZWNhdXNlIGl0CiAgICAgICAgLy8gZG9lc24ndCBidWJibGUgYW5kIG5lZWRzIHRvIGJlIG9uIHRoZSBkb2N1bWVudC4KICAgICAgICBpZiAoZG9tRXZlbnROYW1lICE9PSAnc2VsZWN0aW9uY2hhbmdlJykgewogICAgICAgICAgaWYgKCFub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkpIHsKICAgICAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGZhbHNlLCByb290Q29udGFpbmVyRWxlbWVudCk7CiAgICAgICAgICB9CgogICAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIHRydWUsIHJvb3RDb250YWluZXJFbGVtZW50KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB2YXIgb3duZXJEb2N1bWVudCA9IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckVsZW1lbnQgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50OwoKICAgICAgaWYgKG93bmVyRG9jdW1lbnQgIT09IG51bGwpIHsKICAgICAgICAvLyBUaGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50IGFsc28gbmVlZHMgZGVkdXBsaWNhdGlvbgogICAgICAgIC8vIGJ1dCBpdCBpcyBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnQuCiAgICAgICAgaWYgKCFvd25lckRvY3VtZW50W2xpc3RlbmluZ01hcmtlcl0pIHsKICAgICAgICAgIG93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSA9IHRydWU7CiAgICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KCdzZWxlY3Rpb25jaGFuZ2UnLCBmYWxzZSwgb3duZXJEb2N1bWVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgaXNEZWZlcnJlZExpc3RlbmVyRm9yTGVnYWN5RkJTdXBwb3J0KSB7CiAgICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncyk7IC8vIElmIHBhc3NpdmUgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmUKICAgIC8vIGFjdGl2ZSBhbmQgbm90IHBhc3NpdmUuCgogICAgdmFyIGlzUGFzc2l2ZUxpc3RlbmVyID0gdW5kZWZpbmVkOwoKICAgIGlmIChwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCkgewogICAgICAvLyBCcm93c2VycyBpbnRyb2R1Y2VkIGFuIGludGVydmVudGlvbiwgbWFraW5nIHRoZXNlIGV2ZW50cwogICAgICAvLyBwYXNzaXZlIGJ5IGRlZmF1bHQgb24gZG9jdW1lbnQuIFJlYWN0IGRvZXNuJ3QgYmluZCB0aGVtCiAgICAgIC8vIHRvIGRvY3VtZW50IGFueW1vcmUsIGJ1dCBjaGFuZ2luZyB0aGlzIG5vdyB3b3VsZCB1bmRvCiAgICAgIC8vIHRoZSBwZXJmb3JtYW5jZSB3aW5zIGZyb20gdGhlIGNoYW5nZS4gU28gd2UgZW11bGF0ZQogICAgICAvLyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgbWFudWFsbHkgb24gdGhlIHJvb3RzIG5vdy4KICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTY1MQogICAgICBpZiAoZG9tRXZlbnROYW1lID09PSAndG91Y2hzdGFydCcgfHwgZG9tRXZlbnROYW1lID09PSAndG91Y2htb3ZlJyB8fCBkb21FdmVudE5hbWUgPT09ICd3aGVlbCcpIHsKICAgICAgICBpc1Bhc3NpdmVMaXN0ZW5lciA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICB0YXJnZXRDb250YWluZXIgPSAgdGFyZ2V0Q29udGFpbmVyOwogICAgdmFyIHVuc3Vic2NyaWJlTGlzdGVuZXI7IC8vIFdoZW4gbGVnYWN5RkJTdXBwb3J0IGlzIGVuYWJsZWQsIGl0J3MgZm9yIHdoZW4gd2UKCgogICAgaWYgKGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHsKICAgICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXJXaXRoUGFzc2l2ZUZsYWcodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyLCBpc1Bhc3NpdmVMaXN0ZW5lcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lcikgewogICAgcmV0dXJuIGdyYW5kQ29udGFpbmVyID09PSB0YXJnZXRDb250YWluZXIgfHwgZ3JhbmRDb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBncmFuZENvbnRhaW5lci5wYXJlbnROb2RlID09PSB0YXJnZXRDb250YWluZXI7CiAgfQoKICBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKSB7CiAgICB2YXIgYW5jZXN0b3JJbnN0ID0gdGFyZ2V0SW5zdDsKCiAgICBpZiAoKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSkgPT09IDAgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19OT05fREVMRUdBVEVEKSA9PT0gMCkgewogICAgICB2YXIgdGFyZ2V0Q29udGFpbmVyTm9kZSA9IHRhcmdldENvbnRhaW5lcjsgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSBsZWdhY3kgRkIgc3VwcG9ydCBmbGFnLCB3ZQoKICAgICAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHsKICAgICAgICAvLyBUaGUgYmVsb3cgbG9naWMgYXR0ZW1wdHMgdG8gd29yayBvdXQgaWYgd2UgbmVlZCB0byBjaGFuZ2UKICAgICAgICAvLyB0aGUgdGFyZ2V0IGZpYmVyIHRvIGEgZGlmZmVyZW50IGFuY2VzdG9yLiBXZSBoYWQgc2ltaWxhciBsb2dpYwogICAgICAgIC8vIGluIHRoZSBsZWdhY3kgZXZlbnQgc3lzdGVtLCBleGNlcHQgdGhlIGJpZyBkaWZmZXJlbmNlIGJldHdlZW4KICAgICAgICAvLyBzeXN0ZW1zIGlzIHRoYXQgdGhlIG1vZGVybiBldmVudCBzeXN0ZW0gbm93IGhhcyBhbiBldmVudCBsaXN0ZW5lcgogICAgICAgIC8vIGF0dGFjaGVkIHRvIGVhY2ggUmVhY3QgUm9vdCBhbmQgUmVhY3QgUG9ydGFsIFJvb3QuIFRvZ2V0aGVyLAogICAgICAgIC8vIHRoZSBET00gbm9kZXMgcmVwcmVzZW50aW5nIHRoZXNlIHJvb3RzIGFyZSB0aGUgInJvb3RDb250YWluZXIiLgogICAgICAgIC8vIFRvIGZpZ3VyZSBvdXQgd2hpY2ggYW5jZXN0b3IgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZSwgd2UgdHJhdmVyc2UKICAgICAgICAvLyB1cCB0aGUgZmliZXIgdHJlZSBmcm9tIHRoZSB0YXJnZXQgaW5zdGFuY2UgYW5kIGF0dGVtcHQgdG8gZmluZAogICAgICAgIC8vIHJvb3QgYm91bmRhcmllcyB0aGF0IG1hdGNoIHRoYXQgb2Ygb3VyIGN1cnJlbnQgInJvb3RDb250YWluZXIiLgogICAgICAgIC8vIElmIHdlIGZpbmQgdGhhdCAicm9vdENvbnRhaW5lciIsIHdlIGZpbmQgdGhlIHBhcmVudCBmaWJlcgogICAgICAgIC8vIHN1Yi10cmVlIGZvciB0aGF0IHJvb3QgYW5kIG1ha2UgdGhhdCBvdXIgYW5jZXN0b3IgaW5zdGFuY2UuCiAgICAgICAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0OwoKICAgICAgICBtYWluTG9vcDogd2hpbGUgKHRydWUpIHsKICAgICAgICAgIGlmIChub2RlID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICB2YXIgbm9kZVRhZyA9IG5vZGUudGFnOwoKICAgICAgICAgIGlmIChub2RlVGFnID09PSBIb3N0Um9vdCB8fCBub2RlVGFnID09PSBIb3N0UG9ydGFsKSB7CiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOwoKICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyTm9kZSkpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHsKICAgICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IGlzIGEgcG9ydGFsLCBidXQgaXQncyBub3QgdGhlIHJvb3RDb250YWluZXIgd2UncmUgbG9va2luZyBmb3IuCiAgICAgICAgICAgICAgLy8gTm9ybWFsbHkgcG9ydGFscyBoYW5kbGUgdGhlaXIgb3duIGV2ZW50cyBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSByb290LgogICAgICAgICAgICAgIC8vIFNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIHN0b3Agbm93LiBIb3dldmVyLCB3ZSBkb24ndCBrbm93IGlmIHRoaXMgcG9ydGFsCiAgICAgICAgICAgICAgLy8gd2FzIHBhcnQgb2YgKm91ciogcm9vdC4KICAgICAgICAgICAgICB2YXIgZ3JhbmROb2RlID0gbm9kZS5yZXR1cm47CgogICAgICAgICAgICAgIHdoaWxlIChncmFuZE5vZGUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHZhciBncmFuZFRhZyA9IGdyYW5kTm9kZS50YWc7CgogICAgICAgICAgICAgICAgaWYgKGdyYW5kVGFnID09PSBIb3N0Um9vdCB8fCBncmFuZFRhZyA9PT0gSG9zdFBvcnRhbCkgewogICAgICAgICAgICAgICAgICB2YXIgZ3JhbmRDb250YWluZXIgPSBncmFuZE5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87CgogICAgICAgICAgICAgICAgICBpZiAoaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvciBhbmQgd2UgZm91bmQgaXQgYXMKICAgICAgICAgICAgICAgICAgICAvLyBhIHBhcmVudCBvZiB0aGUgUG9ydGFsLiBUaGF0IG1lYW5zIHdlIGNhbiBpZ25vcmUgaXQgYmVjYXVzZSB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBQb3J0YWwgd2lsbCBidWJibGUgdGhyb3VnaCB0byB1cy4KICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBncmFuZE5vZGUgPSBncmFuZE5vZGUucmV0dXJuOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAvLyBOb3cgd2UgbmVlZCB0byBmaW5kIGl0J3MgY29ycmVzcG9uZGluZyBob3N0IGZpYmVyIGluIHRoZSBvdGhlcgogICAgICAgICAgICAvLyB0cmVlLiBUbyBkbyB0aGlzIHdlIGNhbiB1c2UgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUsIGJ1dCB3ZQogICAgICAgICAgICAvLyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGZpYmVyIGlzIGEgaG9zdCBpbnN0YW5jZSwgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdHJhdmVyc2UgdXAgdGhyb3VnaCB0aGUgRE9NIHRpbGwgd2UgZmluZCB0aGUgY29ycmVjdAogICAgICAgICAgICAvLyBub2RlIHRoYXQgaXMgZnJvbSB0aGUgb3RoZXIgdHJlZS4KCgogICAgICAgICAgICB3aGlsZSAoY29udGFpbmVyICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShjb250YWluZXIpOwoKICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudE5vZGUudGFnOwoKICAgICAgICAgICAgICBpZiAocGFyZW50VGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHBhcmVudFRhZyA9PT0gSG9zdFRleHQpIHsKICAgICAgICAgICAgICAgIG5vZGUgPSBhbmNlc3Rvckluc3QgPSBwYXJlbnROb2RlOwogICAgICAgICAgICAgICAgY29udGludWUgbWFpbkxvb3A7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIucGFyZW50Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIG5vZGUgPSBub2RlLnJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBiYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50c0ZvclBsdWdpbnMoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgYW5jZXN0b3JJbnN0KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgbGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpIHsKICAgIHJldHVybiB7CiAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSwKICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyLAogICAgICBjdXJyZW50VGFyZ2V0OiBjdXJyZW50VGFyZ2V0CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUsIG5hdGl2ZUV2ZW50VHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5LCBuYXRpdmVFdmVudCkgewogICAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICE9PSBudWxsID8gcmVhY3ROYW1lICsgJ0NhcHR1cmUnIDogbnVsbDsKICAgIHZhciByZWFjdEV2ZW50TmFtZSA9IGluQ2FwdHVyZVBoYXNlID8gY2FwdHVyZU5hbWUgOiByZWFjdE5hbWU7CiAgICB2YXIgbGlzdGVuZXJzID0gW107CiAgICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjsKICAgIHZhciBsYXN0SG9zdENvbXBvbmVudCA9IG51bGw7IC8vIEFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBhbmQgbGlzdGVuZXJzIHZpYSB0aGUgdGFyZ2V0IC0+IHJvb3QgcGF0aC4KCiAgICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHsKICAgICAgdmFyIF9pbnN0YW5jZTIgPSBpbnN0YW5jZSwKICAgICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTIuc3RhdGVOb2RlLAogICAgICAgICAgdGFnID0gX2luc3RhbmNlMi50YWc7IC8vIEhhbmRsZSBsaXN0ZW5lcnMgdGhhdCBhcmUgb24gSG9zdENvbXBvbmVudHMgKGkuZS4gPGRpdj4pCgogICAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkgewogICAgICAgIGxhc3RIb3N0Q29tcG9uZW50ID0gc3RhdGVOb2RlOyAvLyBjcmVhdGVFdmVudEhhbmRsZSBsaXN0ZW5lcnMKCgogICAgICAgIGlmIChyZWFjdEV2ZW50TmFtZSAhPT0gbnVsbCkgewogICAgICAgICAgdmFyIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0RXZlbnROYW1lKTsKCiAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgewogICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgbGFzdEhvc3RDb21wb25lbnQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gLy8gSWYgd2UgYXJlIG9ubHkgYWNjdW11bGF0aW5nIGV2ZW50cyBmb3IgdGhlIHRhcmdldCwgdGhlbiB3ZSBkb24ndAogICAgICAvLyBjb250aW51ZSB0byBwcm9wYWdhdGUgdGhyb3VnaCB0aGUgUmVhY3QgZmliZXIgdHJlZSB0byBmaW5kIG90aGVyCiAgICAgIC8vIGxpc3RlbmVycy4KCgogICAgICBpZiAoYWNjdW11bGF0ZVRhcmdldE9ubHkpIHsKICAgICAgICBicmVhazsKICAgICAgfSAvLyBJZiB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgb25CZWZvcmVCbHVyIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gdGFrZQoKICAgICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGxpc3RlbmVyczsKICB9IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjoKICAvLyAtIEJlZm9yZUlucHV0RXZlbnRQbHVnaW4KICAvLyAtIENoYW5nZUV2ZW50UGx1Z2luCiAgLy8gLSBTZWxlY3RFdmVudFBsdWdpbgogIC8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhlc2UgcGx1Z2lucwogIC8vIGluIHRoZSBidWJibGUgcGhhc2UsIHNvIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSB0d28KICAvLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMgKHZpYSBlbXVsYXRpb24pLgoKICBmdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSkgewogICAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICsgJ0NhcHR1cmUnOwogICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgdmFyIGluc3RhbmNlID0gdGFyZ2V0RmliZXI7IC8vIEFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBhbmQgbGlzdGVuZXJzIHZpYSB0aGUgdGFyZ2V0IC0+IHJvb3QgcGF0aC4KCiAgICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHsKICAgICAgdmFyIF9pbnN0YW5jZTMgPSBpbnN0YW5jZSwKICAgICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTMuc3RhdGVOb2RlLAogICAgICAgICAgdGFnID0gX2luc3RhbmNlMy50YWc7IC8vIEhhbmRsZSBsaXN0ZW5lcnMgdGhhdCBhcmUgb24gSG9zdENvbXBvbmVudHMgKGkuZS4gPGRpdj4pCgogICAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkgewogICAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlOwogICAgICAgIHZhciBjYXB0dXJlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZU5hbWUpOwoKICAgICAgICBpZiAoY2FwdHVyZUxpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0TmFtZSk7CgogICAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7CiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47CiAgICB9CgogICAgcmV0dXJuIGxpc3RlbmVyczsKICB9CgogIGZ1bmN0aW9uIGdldFBhcmVudChpbnN0KSB7CiAgICBpZiAoaW5zdCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBkbyB7CiAgICAgIGluc3QgPSBpbnN0LnJldHVybjsgLy8gVE9ETzogSWYgdGhpcyBpcyBhIEhvc3RSb290IHdlIG1pZ2h0IHdhbnQgdG8gYmFpbCBvdXQuCiAgICAgIC8vIFRoYXQgaXMgZGVwZW5kaW5nIG9uIGlmIHdlIHdhbnQgbmVzdGVkIHN1YnRyZWVzIChsYXllcnMpIHRvIGJ1YmJsZQogICAgICAvLyBldmVudHMgdG8gdGhlaXIgcGFyZW50LiBXZSBjb3VsZCBhbHNvIGdvIHRocm91Z2ggcGFyZW50Tm9kZSBvbiB0aGUKICAgICAgLy8gaG9zdCBub2RlIGJ1dCB0aGF0IHdvdWxkbid0IHdvcmsgZm9yIFJlYWN0IE5hdGl2ZSBhbmQgZG9lc24ndCBsZXQgdXMKICAgICAgLy8gZG8gdGhlIHBvcnRhbCBmZWF0dXJlLgogICAgfSB3aGlsZSAoaW5zdCAmJiBpbnN0LnRhZyAhPT0gSG9zdENvbXBvbmVudCk7CgogICAgaWYgKGluc3QpIHsKICAgICAgcmV0dXJuIGluc3Q7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQogIC8qKgogICAqIFJldHVybiB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciBvZiBBIGFuZCBCLCBvciBudWxsIGlmIHRoZXkgYXJlIGluCiAgICogZGlmZmVyZW50IHRyZWVzLgogICAqLwoKCiAgZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7CiAgICB2YXIgbm9kZUEgPSBpbnN0QTsKICAgIHZhciBub2RlQiA9IGluc3RCOwogICAgdmFyIGRlcHRoQSA9IDA7CgogICAgZm9yICh2YXIgdGVtcEEgPSBub2RlQTsgdGVtcEE7IHRlbXBBID0gZ2V0UGFyZW50KHRlbXBBKSkgewogICAgICBkZXB0aEErKzsKICAgIH0KCiAgICB2YXIgZGVwdGhCID0gMDsKCiAgICBmb3IgKHZhciB0ZW1wQiA9IG5vZGVCOyB0ZW1wQjsgdGVtcEIgPSBnZXRQYXJlbnQodGVtcEIpKSB7CiAgICAgIGRlcHRoQisrOwogICAgfSAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuCgoKICAgIHdoaWxlIChkZXB0aEEgLSBkZXB0aEIgPiAwKSB7CiAgICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTsKICAgICAgZGVwdGhBLS07CiAgICB9IC8vIElmIEIgaXMgZGVlcGVyLCBjcmF3bCB1cC4KCgogICAgd2hpbGUgKGRlcHRoQiAtIGRlcHRoQSA+IDApIHsKICAgICAgbm9kZUIgPSBnZXRQYXJlbnQobm9kZUIpOwogICAgICBkZXB0aEItLTsKICAgIH0gLy8gV2FsayBpbiBsb2Nrc3RlcCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guCgoKICAgIHZhciBkZXB0aCA9IGRlcHRoQTsKCiAgICB3aGlsZSAoZGVwdGgtLSkgewogICAgICBpZiAobm9kZUEgPT09IG5vZGVCIHx8IG5vZGVCICE9PSBudWxsICYmIG5vZGVBID09PSBub2RlQi5hbHRlcm5hdGUpIHsKICAgICAgICByZXR1cm4gbm9kZUE7CiAgICAgIH0KCiAgICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTsKICAgICAgbm9kZUIgPSBnZXRQYXJlbnQobm9kZUIpOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBldmVudCwgdGFyZ2V0LCBjb21tb24sIGluQ2FwdHVyZVBoYXNlKSB7CiAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50Ll9yZWFjdE5hbWU7CiAgICB2YXIgbGlzdGVuZXJzID0gW107CiAgICB2YXIgaW5zdGFuY2UgPSB0YXJnZXQ7CgogICAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7CiAgICAgIGlmIChpbnN0YW5jZSA9PT0gY29tbW9uKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIHZhciBfaW5zdGFuY2U0ID0gaW5zdGFuY2UsCiAgICAgICAgICBhbHRlcm5hdGUgPSBfaW5zdGFuY2U0LmFsdGVybmF0ZSwKICAgICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTQuc3RhdGVOb2RlLAogICAgICAgICAgdGFnID0gX2luc3RhbmNlNC50YWc7CgogICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7CiAgICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7CgogICAgICAgIGlmIChpbkNhcHR1cmVQaGFzZSkgewogICAgICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWdpc3RyYXRpb25OYW1lKTsKCiAgICAgICAgICBpZiAoY2FwdHVyZUxpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghaW5DYXB0dXJlUGhhc2UpIHsKICAgICAgICAgIHZhciBidWJibGVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWdpc3RyYXRpb25OYW1lKTsKCiAgICAgICAgICBpZiAoYnViYmxlTGlzdGVuZXIgIT0gbnVsbCkgewogICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47CiAgICB9CgogICAgaWYgKGxpc3RlbmVycy5sZW5ndGggIT09IDApIHsKICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHsKICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnMKICAgICAgfSk7CiAgICB9CiAgfSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6CiAgLy8gLSBFbnRlckxlYXZlRXZlbnRQbHVnaW4KICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoaXMgcGx1Z2luCiAgLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3bwogIC8vIHBoYXNlIGV2ZW50IGxpc3RlbmVycy4KCgogIGZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlVHdvUGhhc2VMaXN0ZW5lcnMoZGlzcGF0Y2hRdWV1ZSwgbGVhdmVFdmVudCwgZW50ZXJFdmVudCwgZnJvbSwgdG8pIHsKICAgIHZhciBjb21tb24gPSBmcm9tICYmIHRvID8gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZnJvbSwgdG8pIDogbnVsbDsKCiAgICBpZiAoZnJvbSAhPT0gbnVsbCkgewogICAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGZyb20sIGNvbW1vbiwgZmFsc2UpOwogICAgfQoKICAgIGlmICh0byAhPT0gbnVsbCAmJiBlbnRlckV2ZW50ICE9PSBudWxsKSB7CiAgICAgIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZW50ZXJFdmVudCwgdG8sIGNvbW1vbiwgdHJ1ZSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgY2FwdHVyZSkgewogICAgcmV0dXJuIGRvbUV2ZW50TmFtZSArICJfXyIgKyAoY2FwdHVyZSA/ICdjYXB0dXJlJyA6ICdidWJibGUnKTsKICB9CgogIHZhciBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IGZhbHNlOwogIHZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7CiAgdmFyIFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyA9ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnOwogIHZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyA9ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnOwogIHZhciBBVVRPRk9DVVMgPSAnYXV0b0ZvY3VzJzsKICB2YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nOwogIHZhciBTVFlMRSA9ICdzdHlsZSc7CiAgdmFyIEhUTUwkMSA9ICdfX2h0bWwnOwogIHZhciB3YXJuZWRVbmtub3duVGFnczsKICB2YXIgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudDsKICB2YXIgd2FybkZvclByb3BEaWZmZXJlbmNlOwogIHZhciB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzOwogIHZhciB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXI7CiAgdmFyIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmc7CiAgdmFyIG5vcm1hbGl6ZUhUTUw7CgogIHsKICAgIHdhcm5lZFVua25vd25UYWdzID0gewogICAgICAvLyBUaGVyZSBhcmUgd29ya2luZyBwb2x5ZmlsbHMgZm9yIDxkaWFsb2c+LiBMZXQgcGVvcGxlIHVzZSBpdC4KICAgICAgZGlhbG9nOiB0cnVlLAogICAgICAvLyBFbGVjdHJvbiBzaGlwcyBhIGN1c3RvbSA8d2Vidmlldz4gdGFnIHRvIGRpc3BsYXkgZXh0ZXJuYWwgd2ViIGNvbnRlbnQgaW4KICAgICAgLy8gYW4gaXNvbGF0ZWQgZnJhbWUgYW5kIHByb2Nlc3MuCiAgICAgIC8vIFRoaXMgdGFnIGlzIG5vdCBwcmVzZW50IGluIG5vbiBFbGVjdHJvbiBlbnZpcm9ubWVudHMgc3VjaCBhcyBKU0RvbSB3aGljaAogICAgICAvLyBpcyBvZnRlbiB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgogICAgICAvLyBAc2VlIGh0dHBzOi8vZWxlY3Ryb25qcy5vcmcvZG9jcy9hcGkvd2Vidmlldy10YWcKICAgICAgd2VidmlldzogdHJ1ZQogICAgfTsKCiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzKSB7CiAgICAgIHZhbGlkYXRlUHJvcGVydGllcyh0eXBlLCBwcm9wcyk7CiAgICAgIHZhbGlkYXRlUHJvcGVydGllcyQxKHR5cGUsIHByb3BzKTsKICAgICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIHsKICAgICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzOiByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLAogICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMKICAgICAgfSk7CiAgICB9OyAvLyBJRSAxMSBwYXJzZXMgJiBub3JtYWxpemVzIHRoZSBzdHlsZSBhdHRyaWJ1dGUgYXMgb3Bwb3NlZCB0byBvdGhlcgogICAgLy8gYnJvd3NlcnMuIEl0IGFkZHMgc3BhY2VzIGFuZCBzb3J0cyB0aGUgcHJvcGVydGllcyBpbiBzb21lCiAgICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1MKICAgIC8vIHByb3BlcnRpZXMgaW4gdGhlIGNsaWVudCAmIHNlcnZlciB2ZXJzaW9ucyBvciBhcHBseWluZwogICAgLy8gYGV4cGVjdGVkU3R5bGVgIHRvIGEgdGVtcG9yYXJ5IERPTSBub2RlIHRvIHJlYWQgaXRzIGBzdHlsZWAgYXR0cmlidXRlCiAgICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzCiAgICAvLyBpbiB0aGF0IGJyb3dzZXIgY29tcGxldGVseSBpbiBmYXZvciBvZiBkb2luZyBhbGwgdGhhdCB3b3JrLgogICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE4MDcKCgogICAgY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZyA9IGNhblVzZURPTSAmJiAhZG9jdW1lbnQuZG9jdW1lbnRNb2RlOwoKICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZSA9IGZ1bmN0aW9uIChwcm9wTmFtZSwgc2VydmVyVmFsdWUsIGNsaWVudFZhbHVlKSB7CiAgICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRWYWx1ZSk7CiAgICAgIHZhciBub3JtYWxpemVkU2VydmVyVmFsdWUgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVmFsdWUpOwoKICAgICAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSA9PT0gbm9ybWFsaXplZENsaWVudFZhbHVlKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7CgogICAgICBlcnJvcignUHJvcCBgJXNgIGRpZCBub3QgbWF0Y2guIFNlcnZlcjogJXMgQ2xpZW50OiAlcycsIHByb3BOYW1lLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkU2VydmVyVmFsdWUpLCBKU09OLnN0cmluZ2lmeShub3JtYWxpemVkQ2xpZW50VmFsdWUpKTsKICAgIH07CgogICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lcykgewogICAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTsKICAgICAgdmFyIG5hbWVzID0gW107CiAgICAgIGF0dHJpYnV0ZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICB9KTsKCiAgICAgIGVycm9yKCdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7CiAgICB9OwoKICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChyZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikgewogICAgICBpZiAobGlzdGVuZXIgPT09IGZhbHNlKSB7CiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYGZhbHNlYC5cblxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lLCByZWdpc3RyYXRpb25OYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGAlc2AgdHlwZS4nLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpOwogICAgICB9CiAgICB9OyAvLyBQYXJzZSB0aGUgSFRNTCBhbmQgcmVhZCBpdCBiYWNrIHRvIG5vcm1hbGl6ZSB0aGUgSFRNTCBzdHJpbmcgc28gdGhhdCBpdAogICAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uCgoKICAgIG5vcm1hbGl6ZUhUTUwgPSBmdW5jdGlvbiAocGFyZW50LCBodG1sKSB7CiAgICAgIC8vIFdlIGNvdWxkIGhhdmUgY3JlYXRlZCBhIHNlcGFyYXRlIGRvY3VtZW50IGhlcmUgdG8gYXZvaWQKICAgICAgLy8gcmUtaW5pdGlhbGl6aW5nIGN1c3RvbSBlbGVtZW50cyBpZiB0aGV5IGV4aXN0LiBCdXQgdGhpcyBicmVha3MKICAgICAgLy8gaG93IDxub3NjcmlwdD4gaXMgYmVpbmcgaGFuZGxlZC4gU28gd2UgdXNlIHRoZSBzYW1lIGRvY3VtZW50LgogICAgICAvLyBTZWUgdGhlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTExNTcuCiAgICAgIHZhciB0ZXN0RWxlbWVudCA9IHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IEhUTUxfTkFNRVNQQUNFID8gcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChwYXJlbnQudGFnTmFtZSkgOiBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMocGFyZW50Lm5hbWVzcGFjZVVSSSwgcGFyZW50LnRhZ05hbWUpOwogICAgICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBodG1sOwogICAgICByZXR1cm4gdGVzdEVsZW1lbnQuaW5uZXJIVE1MOwogICAgfTsKICB9IC8vIEhUTUwgcGFyc2luZyBub3JtYWxpemVzIENSIGFuZCBDUkxGIHRvIExGLgogIC8vIEl0IGFsc28gY2FuIHR1cm4gXHUwMDAwIGludG8gXHVGRkZEIGluc2lkZSBhdHRyaWJ1dGVzLgogIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zaW5nbGUtcGFnZS5odG1sI3ByZXByb2Nlc3NpbmctdGhlLWlucHV0LXN0cmVhbQogIC8vIElmIHdlIGhhdmUgYSBtaXNtYXRjaCwgaXQgbWlnaHQgYmUgY2F1c2VkIGJ5IHRoYXQuCiAgLy8gV2Ugd2lsbCBzdGlsbCBwYXRjaCB1cCBpbiB0aGlzIGNhc2UgYnV0IG5vdCBmaXJlIHRoZSB3YXJuaW5nLgoKCiAgdmFyIE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCA9IC9cclxuPy9nOwogIHZhciBOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVggPSAvXHUwMDAwfFx1RkZGRC9nOwoKICBmdW5jdGlvbiBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUobWFya3VwKSB7CiAgICB7CiAgICAgIGNoZWNrSHRtbFN0cmluZ0NvZXJjaW9uKG1hcmt1cCk7CiAgICB9CgogICAgdmFyIG1hcmt1cFN0cmluZyA9IHR5cGVvZiBtYXJrdXAgPT09ICdzdHJpbmcnID8gbWFya3VwIDogJycgKyBtYXJrdXA7CiAgICByZXR1cm4gbWFya3VwU3RyaW5nLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCAnXG4nKS5yZXBsYWNlKE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCwgJycpOwogIH0KCiAgZnVuY3Rpb24gY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHNlcnZlclRleHQsIGNsaWVudFRleHQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpIHsKICAgIHZhciBub3JtYWxpemVkQ2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTsKICAgIHZhciBub3JtYWxpemVkU2VydmVyVGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJUZXh0KTsKCiAgICBpZiAobm9ybWFsaXplZFNlcnZlclRleHQgPT09IG5vcm1hbGl6ZWRDbGllbnRUZXh0KSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoc2hvdWxkV2FybkRldikgewogICAgICB7CiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikgewogICAgICAgICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlOwoKICAgICAgICAgIGVycm9yKCdUZXh0IGNvbnRlbnQgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiAiJXMiIENsaWVudDogIiVzIicsIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0LCBub3JtYWxpemVkQ2xpZW50VGV4dCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGlzQ29uY3VycmVudE1vZGUgJiYgZW5hYmxlQ2xpZW50UmVuZGVyRmFsbGJhY2tPblRleHRNaXNtYXRjaCkgewogICAgICAvLyBJbiBjb25jdXJyZW50IHJvb3RzLCB3ZSB0aHJvdyB3aGVuIHRoZXJlJ3MgYSB0ZXh0IG1pc21hdGNoIGFuZCByZXZlcnQgdG8KICAgICAgLy8gY2xpZW50IHJlbmRlcmluZywgdXAgdG8gdGhlIG5lYXJlc3QgU3VzcGVuc2UgYm91bmRhcnkuCiAgICAgIHRocm93IG5ldyBFcnJvcignVGV4dCBjb250ZW50IGRvZXMgbm90IG1hdGNoIHNlcnZlci1yZW5kZXJlZCBIVE1MLicpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KSB7CiAgICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7CiAgfQoKICBmdW5jdGlvbiBub29wKCkge30KCiAgZnVuY3Rpb24gdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQobm9kZSkgewogICAgLy8gTW9iaWxlIFNhZmFyaSBkb2VzIG5vdCBmaXJlIHByb3Blcmx5IGJ1YmJsZSBjbGljayBldmVudHMgb24KICAgIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3QKICAgIC8vIGZpcmUuIFRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGJ1ZyBpbnZvbHZlcyBhdHRhY2hpbmcgYW4gZW1wdHkgY2xpY2sKICAgIC8vIGxpc3RlbmVyIG9uIHRoZSB0YXJnZXQgbm9kZS4KICAgIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbAogICAgLy8gSnVzdCBzZXQgaXQgdXNpbmcgdGhlIG9uY2xpY2sgcHJvcGVydHkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIG1hbmFnZSBhbnkKICAgIC8vIGJvb2trZWVwaW5nIGZvciBpdC4gTm90IHN1cmUgaWYgd2UgbmVlZCB0byBjbGVhciBpdCB3aGVuIHRoZSBsaXN0ZW5lciBpcwogICAgLy8gcmVtb3ZlZC4KICAgIC8vIFRPRE86IE9ubHkgZG8gdGhpcyBmb3IgdGhlIHJlbGV2YW50IFNhZmFyaXMgbWF5YmU/CiAgICBub2RlLm9uY2xpY2sgPSBub29wOwogIH0KCiAgZnVuY3Rpb24gc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgbmV4dFByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgewogICAgZm9yICh2YXIgcHJvcEtleSBpbiBuZXh0UHJvcHMpIHsKICAgICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldOwoKICAgICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7CiAgICAgICAgewogICAgICAgICAgaWYgKG5leHRQcm9wKSB7CiAgICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlCiAgICAgICAgICAgIC8vIG11dGF0ZWQuIFdlIGhhdmUgYWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgaW4gdGhlIHBhc3QuCiAgICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApOwogICAgICAgICAgfQogICAgICAgIH0gLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuCgoKICAgICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBuZXh0UHJvcCk7CiAgICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHsKICAgICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7CgogICAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7CiAgICAgICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgbmV4dEh0bWwpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikgewogICAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIGluaXRpYWwgdGV4dENvbnRlbnQgd2hlbiB0aGUgdGV4dCBpcyBlbXB0eS4gSW4gSUUxMSBzZXR0aW5nCiAgICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIDx0ZXh0YXJlYT4gd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90CiAgICAgICAgICAvLyBzaG93IHdpdGhpbiB0aGUgPHRleHRhcmVhPiB1bnRpbCBpdCBoYXMgYmVlbiBmb2N1c2VkIGFuZCBibHVycmVkIGFnYWluLgogICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82NzMxI2lzc3VlY29tbWVudC0yNTQ4NzQ1NTMKICAgICAgICAgIHZhciBjYW5TZXRUZXh0Q29udGVudCA9IHRhZyAhPT0gJ3RleHRhcmVhJyB8fCBuZXh0UHJvcCAhPT0gJyc7CgogICAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7CiAgICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIG5leHRQcm9wKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHsKICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsICcnICsgbmV4dFByb3ApOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHsKICAgICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkgewogICAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykgewogICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobmV4dFByb3AgIT0gbnVsbCkgewogICAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7CiAgICAvLyBUT0RPOiBIYW5kbGUgd2FzQ3VzdG9tQ29tcG9uZW50VGFnCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZVBheWxvYWQubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgdmFyIHByb3BLZXkgPSB1cGRhdGVQYXlsb2FkW2ldOwogICAgICB2YXIgcHJvcFZhbHVlID0gdXBkYXRlUGF5bG9hZFtpICsgMV07CgogICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHsKICAgICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBwcm9wVmFsdWUpOwogICAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7CiAgICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7CiAgICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHsKICAgICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBwcm9wVmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgcHJvcFZhbHVlLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50LCBwYXJlbnROYW1lc3BhY2UpIHsKICAgIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZzsgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTAogICAgLy8gdGFncyBnZXQgbm8gbmFtZXNwYWNlLgoKICAgIHZhciBvd25lckRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KTsKICAgIHZhciBkb21FbGVtZW50OwogICAgdmFyIG5hbWVzcGFjZVVSSSA9IHBhcmVudE5hbWVzcGFjZTsKCiAgICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkgewogICAgICBuYW1lc3BhY2VVUkkgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7CiAgICB9CgogICAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHsKICAgICAgewogICAgICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpOyAvLyBTaG91bGQgdGhpcyBjaGVjayBiZSBnYXRlZCBieSBwYXJlbnQgbmFtZXNwYWNlPyBOb3Qgc3VyZSB3ZSB3YW50IHRvCiAgICAgICAgLy8gYWxsb3cgPFNWRz4gb3IgPG1BVEg+LgoKICAgICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIHR5cGUgIT09IHR5cGUudG9Mb3dlckNhc2UoKSkgewogICAgICAgICAgZXJyb3IoJzwlcyAvPiBpcyB1c2luZyBpbmNvcnJlY3QgY2FzaW5nLiAnICsgJ1VzZSBQYXNjYWxDYXNlIGZvciBSZWFjdCBjb21wb25lbnRzLCAnICsgJ29yIGxvd2VyY2FzZSBmb3IgSFRNTCBlbGVtZW50cy4nLCB0eXBlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICh0eXBlID09PSAnc2NyaXB0JykgewogICAgICAgIC8vIENyZWF0ZSB0aGUgc2NyaXB0IHZpYSAuaW5uZXJIVE1MIHNvIGl0cyAicGFyc2VyLWluc2VydGVkIiBmbGFnIGlzCiAgICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0IGRvZXMgbm90IGV4ZWN1dGUKICAgICAgICB2YXIgZGl2ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKCiAgICAgICAgZGl2LmlubmVySFRNTCA9ICc8c2NyaXB0PjwnICsgJy9zY3JpcHQ+JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZQogICAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCBhIHNjcmlwdCBlbGVtZW50LgoKICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IGRpdi5maXJzdENoaWxkOwogICAgICAgIGRvbUVsZW1lbnQgPSBkaXYucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZCk7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb3BzLmlzID09PSAnc3RyaW5nJykgewogICAgICAgIC8vICRGbG93SXNzdWUgYGNyZWF0ZUVsZW1lbnRgIHNob3VsZCBiZSB1cGRhdGVkIGZvciBXZWIgQ29tcG9uZW50cwogICAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSwgewogICAgICAgICAgaXM6IHByb3BzLmlzCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gU2VwYXJhdGUgZWxzZSBicmFuY2ggaW5zdGVhZCBvZiB1c2luZyBgcHJvcHMuaXMgfHwgdW5kZWZpbmVkYCBhYm92ZSBiZWNhdXNlIG9mIGEgRmlyZWZveCBidWcuCiAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNjg5NgogICAgICAgIC8vIGFuZCBkaXNjdXNzaW9uIGluIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNzYyNDAKICAgICAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHR5cGUpOyAvLyBOb3JtYWxseSBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZCBpbiBgc2V0SW5pdGlhbERPTVByb3BlcnRpZXNgLCBob3dldmVyIHRoZSBgbXVsdGlwbGVgIGFuZCBgc2l6ZWAKICAgICAgICAvLyBhdHRyaWJ1dGVzIG9uIGBzZWxlY3RgcyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgYG9wdGlvbmBzIGFyZSBpbnNlcnRlZC4KICAgICAgICAvLyBUaGlzIHByZXZlbnRzOgogICAgICAgIC8vIC0gYSBidWcgd2hlcmUgdGhlIGBzZWxlY3RgIGRvZXMgbm90IHNjcm9sbCB0byB0aGUgY29ycmVjdCBvcHRpb24gYmVjYXVzZSBzaW5ndWxhcgogICAgICAgIC8vICBgc2VsZWN0YCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IHBpY2sgdGhlIGZpcnN0IGl0ZW0gIzEzMjIyCiAgICAgICAgLy8gLSBhIGJ1ZyB3aGVyZSB0aGUgYHNlbGVjdGAgc2V0IHRoZSBmaXJzdCBpdGVtIGFzIHNlbGVjdGVkIGRlc3BpdGUgdGhlIGBzaXplYCBhdHRyaWJ1dGUgIzE0MjM5CiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMyMjIKICAgICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDIzOQoKICAgICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcpIHsKICAgICAgICAgIHZhciBub2RlID0gZG9tRWxlbWVudDsKCiAgICAgICAgICBpZiAocHJvcHMubXVsdGlwbGUpIHsKICAgICAgICAgICAgbm9kZS5tdWx0aXBsZSA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnNpemUpIHsKICAgICAgICAgICAgLy8gU2V0dGluZyBhIHNpemUgZ3JlYXRlciB0aGFuIDEgY2F1c2VzIGEgc2VsZWN0IHRvIGJlaGF2ZSBsaWtlIGBtdWx0aXBsZT10cnVlYCwgd2hlcmUKICAgICAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBubyBvcHRpb24gaXMgc2VsZWN0ZWQuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiBhIHNlbGVjdCBpbiAic2luZ2xlIHNlbGVjdGlvbiBtb2RlIi4KICAgICAgICAgICAgbm9kZS5zaXplID0gcHJvcHMuc2l6ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGRvbUVsZW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHR5cGUpOwogICAgfQoKICAgIHsKICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHsKICAgICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIWhhc093blByb3BlcnR5LmNhbGwod2FybmVkVW5rbm93blRhZ3MsIHR5cGUpKSB7CiAgICAgICAgICB3YXJuZWRVbmtub3duVGFnc1t0eXBlXSA9IHRydWU7CgogICAgICAgICAgZXJyb3IoJ1RoZSB0YWcgPCVzPiBpcyB1bnJlY29nbml6ZWQgaW4gdGhpcyBicm93c2VyLiAnICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBSZWFjdCBjb21wb25lbnQsIHN0YXJ0IGl0cyBuYW1lIHdpdGggJyArICdhbiB1cHBlcmNhc2UgbGV0dGVyLicsIHR5cGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBkb21FbGVtZW50OwogIH0KICBmdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVyRWxlbWVudCkgewogICAgcmV0dXJuIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkuY3JlYXRlVGV4dE5vZGUodGV4dCk7CiAgfQogIGZ1bmN0aW9uIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7CiAgICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTsKCiAgICB7CiAgICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7CiAgICB9IC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuCgoKICAgIHZhciBwcm9wczsKCiAgICBzd2l0Y2ggKHRhZykgewogICAgICBjYXNlICdkaWFsb2cnOgogICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2NhbmNlbCcsIGRvbUVsZW1lbnQpOwogICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7CiAgICAgICAgcHJvcHMgPSByYXdQcm9wczsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2lmcmFtZSc6CiAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgIGNhc2UgJ2VtYmVkJzoKICAgICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGUKICAgICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuCiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpOwogICAgICAgIHByb3BzID0gcmF3UHJvcHM7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICd2aWRlbyc6CiAgICAgIGNhc2UgJ2F1ZGlvJzoKICAgICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZQogICAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy4KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpOwogICAgICAgIH0KCiAgICAgICAgcHJvcHMgPSByYXdQcm9wczsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NvdXJjZSc6CiAgICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlCiAgICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC4KICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpOwogICAgICAgIHByb3BzID0gcmF3UHJvcHM7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdpbWcnOgogICAgICBjYXNlICdpbWFnZSc6CiAgICAgIGNhc2UgJ2xpbmsnOgogICAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlCiAgICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy4KICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpOwogICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTsKICAgICAgICBwcm9wcyA9IHJhd1Byb3BzOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnZGV0YWlscyc6CiAgICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlCiAgICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSB0b2dnbGUgZXZlbnQuCiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7CiAgICAgICAgcHJvcHMgPSByYXdQcm9wczsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2lucHV0JzoKICAgICAgICBpbml0V3JhcHBlclN0YXRlKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsKICAgICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZQogICAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC4KCiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnb3B0aW9uJzoKICAgICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsKICAgICAgICBwcm9wcyA9IHJhd1Byb3BzOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnc2VsZWN0JzoKICAgICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOwogICAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGUKICAgICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuCgogICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3RleHRhcmVhJzoKICAgICAgICBpbml0V3JhcHBlclN0YXRlJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpOwogICAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGUKICAgICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuCgogICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTsKICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcHJvcHMgPSByYXdQcm9wczsKICAgIH0KCiAgICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpOwogICAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTsKCiAgICBzd2l0Y2ggKHRhZykgewogICAgICBjYXNlICdpbnB1dCc6CiAgICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhbgogICAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuCiAgICAgICAgdHJhY2soZG9tRWxlbWVudCk7CiAgICAgICAgcG9zdE1vdW50V3JhcHBlcihkb21FbGVtZW50LCByYXdQcm9wcywgZmFsc2UpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAndGV4dGFyZWEnOgogICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW4KICAgICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLgogICAgICAgIHRyYWNrKGRvbUVsZW1lbnQpOwogICAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50KTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ29wdGlvbic6CiAgICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NlbGVjdCc6CiAgICAgICAgcG9zdE1vdW50V3JhcHBlciQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsKICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKHR5cGVvZiBwcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLgogICAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKICAgIH0KICB9IC8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy4KCiAgZnVuY3Rpb24gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHsKICAgIHsKICAgICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIG5leHRSYXdQcm9wcyk7CiAgICB9CgogICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsOwogICAgdmFyIGxhc3RQcm9wczsKICAgIHZhciBuZXh0UHJvcHM7CgogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSAnaW5wdXQnOgogICAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpOwogICAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpOwogICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NlbGVjdCc6CiAgICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTsKICAgICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpOwogICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3RleHRhcmVhJzoKICAgICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpOwogICAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7CiAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKICAgICAgICBsYXN0UHJvcHMgPSBsYXN0UmF3UHJvcHM7CiAgICAgICAgbmV4dFByb3BzID0gbmV4dFJhd1Byb3BzOwoKICAgICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy4KICAgICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIG5leHRQcm9wcyk7CiAgICB2YXIgcHJvcEtleTsKICAgIHZhciBzdHlsZU5hbWU7CiAgICB2YXIgc3R5bGVVcGRhdGVzID0gbnVsbDsKCiAgICBmb3IgKHByb3BLZXkgaW4gbGFzdFByb3BzKSB7CiAgICAgIGlmIChuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgIWxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBsYXN0UHJvcHNbcHJvcEtleV0gPT0gbnVsbCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHsKICAgICAgICB2YXIgbGFzdFN0eWxlID0gbGFzdFByb3BzW3Byb3BLZXldOwoKICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0U3R5bGUpIHsKICAgICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkgewogICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykgewogICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZQogICAgICAgIC8vIHRoYXQgdGhlICJjdXJyZW50IiBmaWJlciBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0CiAgICAgICAgLy8gdG8gdXBkYXRlIHRoaXMgZWxlbWVudC4KICAgICAgICBpZiAoIXVwZGF0ZVBheWxvYWQpIHsKICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBkZWxldGVkIHByb3BlcnRpZXMgd2UgYWRkIGl0IHRvIHRoZSBxdWV1ZS4gV2UgdXNlCiAgICAgICAgLy8gdGhlIGFsbG93ZWQgcHJvcGVydHkgbGlzdCBpbiB0aGUgY29tbWl0IHBoYXNlIGluc3RlYWQuCiAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG51bGwpOwogICAgICB9CiAgICB9CgogICAgZm9yIChwcm9wS2V5IGluIG5leHRQcm9wcykgewogICAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07CiAgICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkOwoKICAgICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHsKICAgICAgICB7CiAgICAgICAgICBpZiAobmV4dFByb3ApIHsKICAgICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmUKICAgICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC4KICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZShuZXh0UHJvcCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAobGFzdFByb3ApIHsKICAgICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgbGFzdFByb3BgIGJ1dCBub3Qgb24gYG5leHRQcm9wYC4KICAgICAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RQcm9wKSB7CiAgICAgICAgICAgIGlmIChsYXN0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7CiAgICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHsKICAgICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgfSAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgbGFzdFByb3BgLgoKCiAgICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBuZXh0UHJvcCkgewogICAgICAgICAgICBpZiAobmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiBsYXN0UHJvcFtzdHlsZU5hbWVdICE9PSBuZXh0UHJvcFtzdHlsZU5hbWVdKSB7CiAgICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHsKICAgICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSBuZXh0UHJvcFtzdHlsZU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLgogICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHsKICAgICAgICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7CiAgICAgICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1cGRhdGVQYXlsb2FkLnB1c2gocHJvcEtleSwgc3R5bGVVcGRhdGVzKTsKICAgICAgICAgIH0KCiAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBuZXh0UHJvcDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwpIHsKICAgICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7CiAgICAgICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3AgPyBsYXN0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkOwoKICAgICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkgewogICAgICAgICAgaWYgKGxhc3RIdG1sICE9PSBuZXh0SHRtbCkgewogICAgICAgICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbmV4dEh0bWwpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikgewogICAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCAnJyArIG5leHRQcm9wKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHsKICAgICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkgewogICAgICAgICAgLy8gV2UgZWFnZXJseSBsaXN0ZW4gdG8gdGhpcyBldmVuIHRob3VnaCB3ZSBoYXZlbid0IGNvbW1pdHRlZCB5ZXQuCiAgICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgbmV4dFByb3ApOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7CiAgICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkICYmIGxhc3RQcm9wICE9PSBuZXh0UHJvcCkgewogICAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmUKICAgICAgICAgIC8vIHRoYXQgdGhlICJjdXJyZW50IiBwcm9wcyBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0CiAgICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LgogICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBGb3IgYW55IG90aGVyIHByb3BlcnR5IHdlIGFsd2F5cyBhZGQgaXQgdG8gdGhlIHF1ZXVlIGFuZCB0aGVuIHdlCiAgICAgICAgLy8gZmlsdGVyIGl0IG91dCB1c2luZyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGR1cmluZyB0aGUgY29tbWl0LgogICAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBuZXh0UHJvcCk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3R5bGVVcGRhdGVzKSB7CiAgICAgIHsKICAgICAgICB2YWxpZGF0ZVNob3J0aGFuZFByb3BlcnR5Q29sbGlzaW9uSW5EZXYoc3R5bGVVcGRhdGVzLCBuZXh0UHJvcHNbU1RZTEVdKTsKICAgICAgfQoKICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKFNUWUxFLCBzdHlsZVVwZGF0ZXMpOwogICAgfQoKICAgIHJldHVybiB1cGRhdGVQYXlsb2FkOwogIH0gLy8gQXBwbHkgdGhlIGRpZmYuCgogIGZ1bmN0aW9uIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcykgewogICAgLy8gVXBkYXRlIGNoZWNrZWQgKmJlZm9yZSogbmFtZS4KICAgIC8vIEluIHRoZSBtaWRkbGUgb2YgYW4gdXBkYXRlLCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGNoZWNrZWQuCiAgICAvLyBXaGVuIGEgY2hlY2tlZCByYWRpbyB0cmllcyB0byBjaGFuZ2UgbmFtZSwgYnJvd3NlciBtYWtlcyBhbm90aGVyIHJhZGlvJ3MgY2hlY2tlZCBmYWxzZS4KICAgIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgbmV4dFJhd1Byb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmV4dFJhd1Byb3BzLm5hbWUgIT0gbnVsbCkgewogICAgICB1cGRhdGVDaGVja2VkKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7CiAgICB9CgogICAgdmFyIHdhc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbGFzdFJhd1Byb3BzKTsKICAgIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbmV4dFJhd1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYuCgogICAgdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTsgLy8gVE9ETzogRW5zdXJlIHRoYXQgYW4gdXBkYXRlIGdldHMgc2NoZWR1bGVkIGlmIGFueSBvZiB0aGUgc3BlY2lhbCBwcm9wcwogICAgLy8gY2hhbmdlZC4KCiAgICBzd2l0Y2ggKHRhZykgewogICAgICBjYXNlICdpbnB1dCc6CiAgICAgICAgLy8gVXBkYXRlIHRoZSB3cmFwcGVyIGFyb3VuZCBpbnB1dHMgKmFmdGVyKiB1cGRhdGluZyBwcm9wcy4gVGhpcyBoYXMgdG8KICAgICAgICAvLyBoYXBwZW4gYWZ0ZXIgYHVwZGF0ZURPTVByb3BlcnRpZXNgLiBPdGhlcndpc2UgSFRNTDUgaW5wdXQgdmFsaWRhdGlvbnMKICAgICAgICAvLyByYWlzZSB3YXJuaW5ncyBhbmQgcHJldmVudCB0aGUgbmV3IHZhbHVlIGZyb20gYmVpbmcgYXNzaWduZWQuCiAgICAgICAgdXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAndGV4dGFyZWEnOgogICAgICAgIHVwZGF0ZVdyYXBwZXIkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnc2VsZWN0JzoKICAgICAgICAvLyA8c2VsZWN0PiB2YWx1ZSB1cGRhdGUgbmVlZHMgdG8gb2NjdXIgYWZ0ZXIgPG9wdGlvbj4gY2hpbGRyZW4KICAgICAgICAvLyByZWNvbmNpbGlhdGlvbgogICAgICAgIHBvc3RVcGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wTmFtZSkgewogICAgewogICAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSBwcm9wTmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgaWYgKCFwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIHJldHVybiBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdIHx8IG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckVsZW1lbnQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpIHsKICAgIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZzsKICAgIHZhciBleHRyYUF0dHJpYnV0ZU5hbWVzOwoKICAgIHsKICAgICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTsKICAgICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTsKICAgIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy4KCgogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSAnZGlhbG9nJzoKICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTsKICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnaWZyYW1lJzoKICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgY2FzZSAnZW1iZWQnOgogICAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZQogICAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgbG9hZCBldmVudC4KICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICd2aWRlbyc6CiAgICAgIGNhc2UgJ2F1ZGlvJzoKICAgICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZQogICAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy4KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzb3VyY2UnOgogICAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZQogICAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuCiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ2ltZyc6CiAgICAgIGNhc2UgJ2ltYWdlJzoKICAgICAgY2FzZSAnbGluayc6CiAgICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGUKICAgICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLgogICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7CiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnZGV0YWlscyc6CiAgICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlCiAgICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSB0b2dnbGUgZXZlbnQuCiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdpbnB1dCc6CiAgICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZQogICAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC4KCiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAnb3B0aW9uJzoKICAgICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NlbGVjdCc6CiAgICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlCiAgICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LgoKICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICd0ZXh0YXJlYSc6CiAgICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlCiAgICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LgoKICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHJhd1Byb3BzKTsKCiAgICB7CiAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMgPSBuZXcgU2V0KCk7CiAgICAgIHZhciBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5hdHRyaWJ1dGVzOwoKICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVzW19pXS5uYW1lLnRvTG93ZXJDYXNlKCk7CgogICAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICAgICAgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkCiAgICAgICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy4KICAgICAgICAgIGNhc2UgJ3ZhbHVlJzoKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAnY2hlY2tlZCc6CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ3NlbGVjdGVkJzoKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgLy8gSW50ZW50aW9uYWxseSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuCiAgICAgICAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEwNjc2LgogICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmFkZChhdHRyaWJ1dGVzW19pXS5uYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IG51bGw7CgogICAgZm9yICh2YXIgcHJvcEtleSBpbiByYXdQcm9wcykgewogICAgICBpZiAoIXJhd1Byb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIHZhciBuZXh0UHJvcCA9IHJhd1Byb3BzW3Byb3BLZXldOwoKICAgICAgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7CiAgICAgICAgLy8gRm9yIHRleHQgY29udGVudCBjaGlsZHJlbiB3ZSBjb21wYXJlIGFnYWluc3QgdGV4dENvbnRlbnQuIFRoaXMKICAgICAgICAvLyBtaWdodCBtYXRjaCBhZGRpdGlvbmFsIEhUTUwgdGhhdCBpcyBoaWRkZW4gd2hlbiB3ZSByZWFkIGl0IHVzaW5nCiAgICAgICAgLy8gdGV4dENvbnRlbnQuIEUuZy4gImZvbyIgd2lsbCBtYXRjaCAiZjxzcGFuPm9vPC9zcGFuPiIgYnV0IHRoYXQgc3RpbGwKICAgICAgICAvLyBzYXRpc2ZpZXMgb3VyIHJlcXVpcmVtZW50LiBPdXIgcmVxdWlyZW1lbnQgaXMgbm90IHRvIHByb2R1Y2UgcGVyZmVjdAogICAgICAgIC8vIEhUTUwgYW5kIGF0dHJpYnV0ZXMuIElkZWFsbHkgd2Ugc2hvdWxkIHByZXNlcnZlIHN0cnVjdHVyZSBidXQgaXQncwogICAgICAgIC8vIG9rIG5vdCB0byBpZiB0aGUgdmlzaWJsZSBjb250ZW50IGlzIHN0aWxsIGVub3VnaCB0byBpbmRpY2F0ZSB3aGF0CiAgICAgICAgLy8gZXZlbiBsaXN0ZW5lcnMgdGhlc2Ugbm9kZXMgbWlnaHQgYmUgd2lyZWQgdXAgdG8uCiAgICAgICAgLy8gVE9ETzogV2FybiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gYSBzaW5nbGUgdGV4dE5vZGUgYXMgYSBjaGlsZC4KICAgICAgICAvLyBUT0RPOiBTaG91bGQgd2UgdXNlIGRvbUVsZW1lbnQuZmlyc3RDaGlsZC5ub2RlVmFsdWUgdG8gY29tcGFyZT8KICAgICAgICBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnc3RyaW5nJykgewogICAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09IG5leHRQcm9wKSB7CiAgICAgICAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHsKICAgICAgICAgICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3AsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCBuZXh0UHJvcF07CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7CiAgICAgICAgICBpZiAoZG9tRWxlbWVudC50ZXh0Q29udGVudCAhPT0gJycgKyBuZXh0UHJvcCkgewogICAgICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddICE9PSB0cnVlKSB7CiAgICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgJycgKyBuZXh0UHJvcF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHsKICAgICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkgewogICAgICAgICAgaWYgKCB0eXBlb2YgbmV4dFByb3AgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykgewogICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdzY3JvbGwnLCBkb21FbGVtZW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc2hvdWxkV2FybkRldiAmJiB0cnVlICYmIC8vIENvbnZpbmNlIEZsb3cgd2UndmUgY2FsY3VsYXRlZCBpdCAoaXQncyBERVYtb25seSBpbiB0aGlzIG1ldGhvZC4pCiAgICAgIHR5cGVvZiBpc0N1c3RvbUNvbXBvbmVudFRhZyA9PT0gJ2Jvb2xlYW4nKSB7CiAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcHJvcGVydGllcyBjb3JyZXNwb25kIHRvIHRoZWlyIGV4cGVjdGVkIHZhbHVlcy4KICAgICAgICB2YXIgc2VydmVyVmFsdWUgPSB2b2lkIDA7CiAgICAgICAgdmFyIHByb3BlcnR5SW5mbyA9IGlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgPyBudWxsIDogZ2V0UHJvcGVydHlJbmZvKHByb3BLZXkpOwoKICAgICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddID09PSB0cnVlKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyB8fCAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWQKICAgICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy4KICAgICAgICBwcm9wS2V5ID09PSAndmFsdWUnIHx8IHByb3BLZXkgPT09ICdjaGVja2VkJyB8fCBwcm9wS2V5ID09PSAnc2VsZWN0ZWQnKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7CiAgICAgICAgICB2YXIgc2VydmVySFRNTCA9IGRvbUVsZW1lbnQuaW5uZXJIVE1MOwogICAgICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkOwoKICAgICAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7CiAgICAgICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTsKCiAgICAgICAgICAgIGlmIChleHBlY3RlZEhUTUwgIT09IHNlcnZlckhUTUwpIHsKICAgICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVySFRNTCwgZXhwZWN0ZWRIVE1MKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHsKICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC4KICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpOwoKICAgICAgICAgIGlmIChjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nKSB7CiAgICAgICAgICAgIHZhciBleHBlY3RlZFN0eWxlID0gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKG5leHRQcm9wKTsKICAgICAgICAgICAgc2VydmVyVmFsdWUgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTsKCiAgICAgICAgICAgIGlmIChleHBlY3RlZFN0eWxlICE9PSBzZXJ2ZXJWYWx1ZSkgewogICAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgZXhwZWN0ZWRTdHlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnICYmICFlbmFibGVDdXN0b21FbGVtZW50UHJvcGVydHlTdXBwb3J0KSB7CiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuCiAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5LnRvTG93ZXJDYXNlKCkpOwogICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7CgogICAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSkgewogICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzaG91bGRJZ25vcmVBdHRyaWJ1dGUocHJvcEtleSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgJiYgIXNob3VsZFJlbW92ZUF0dHJpYnV0ZShwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHsKICAgICAgICAgIHZhciBpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcgPSBmYWxzZTsKCiAgICAgICAgICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC4KICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpOwogICAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIHByb3BlcnR5SW5mbyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlOwoKICAgICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHsKICAgICAgICAgICAgICBvd25OYW1lc3BhY2UgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodGFnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHsKICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuCiAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgc3RhbmRhcmROYW1lID0gZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUocHJvcEtleSk7CgogICAgICAgICAgICAgIGlmIChzdGFuZGFyZE5hbWUgIT09IG51bGwgJiYgc3RhbmRhcmROYW1lICE9PSBwcm9wS2V5KSB7CiAgICAgICAgICAgICAgICAvLyBJZiBhbiBTVkcgcHJvcCBpcyBzdXBwbGllZCB3aXRoIGJhZCBjYXNpbmcsIGl0IHdpbGwKICAgICAgICAgICAgICAgIC8vIGJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgZnJvbSBIVE1MLCBidXQgd2lsbCBwcm9kdWNlIGEgbWlzbWF0Y2gKICAgICAgICAgICAgICAgIC8vIChhbmQgd291bGQgYmUgaW5jb3JyZWN0bHkgcmVuZGVyZWQgb24gdGhlIGNsaWVudCkuCiAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBhbHJlYWR5IHdhcm4gYWJvdXQgYmFkIGNhc2luZyBlbHNld2hlcmUuCiAgICAgICAgICAgICAgICAvLyBTbyB3ZSdsbCBza2lwIHRoZSBtaXNsZWFkaW5nIGV4dHJhIG1pc21hdGNoIHdhcm5pbmcgaW4gdGhpcyBjYXNlLgogICAgICAgICAgICAgICAgaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nID0gdHJ1ZTsgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLgoKICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHN0YW5kYXJkTmFtZSk7CiAgICAgICAgICAgICAgfSAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuCgoKICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIGRvbnRXYXJuQ3VzdG9tRWxlbWVudCA9IGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgIDsKCiAgICAgICAgICBpZiAoIWRvbnRXYXJuQ3VzdG9tRWxlbWVudCAmJiBuZXh0UHJvcCAhPT0gc2VydmVyVmFsdWUgJiYgIWlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZykgewogICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB7CiAgICAgIGlmIChzaG91bGRXYXJuRGV2KSB7CiAgICAgICAgaWYgKCAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuCiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5zaXplID4gMCAmJiByYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHsKICAgICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC4KICAgICAgICAgIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMoZXh0cmFBdHRyaWJ1dGVOYW1lcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgc3dpdGNoICh0YWcpIHsKICAgICAgY2FzZSAnaW5wdXQnOgogICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW4KICAgICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLgogICAgICAgIHRyYWNrKGRvbUVsZW1lbnQpOwogICAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIHRydWUpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAndGV4dGFyZWEnOgogICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW4KICAgICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLgogICAgICAgIHRyYWNrKGRvbUVsZW1lbnQpOwogICAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50KTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgJ3NlbGVjdCc6CiAgICAgIGNhc2UgJ29wdGlvbic6CiAgICAgICAgLy8gRm9yIGlucHV0IGFuZCB0ZXh0YXJlYSB3ZSBjdXJyZW50IGFsd2F5cyBzZXQgdGhlIHZhbHVlIHByb3BlcnR5IGF0CiAgICAgICAgLy8gcG9zdCBtb3VudCB0byBmb3JjZSBpdCB0byBkaXZlcmdlIGZyb20gYXR0cmlidXRlcy4gSG93ZXZlciwgZm9yCiAgICAgICAgLy8gb3B0aW9uIGFuZCBzZWxlY3Qgd2UgZG9uJ3QgcXVpdGUgZG8gdGhlIHNhbWUgdGhpbmcgYW5kIHNlbGVjdAogICAgICAgIC8vIGlzIG5vdCByZXNpbGllbnQgdG8gdGhlIERPTSBzdGF0ZSBjaGFuZ2luZyBzbyB3ZSBkb24ndCBkbyB0aGF0IGhlcmUuCiAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbm90IGRvaW5nIHRoaXMgZm9yIGlucHV0IGFuZCB0ZXh0YXJlYS4KICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKHR5cGVvZiByYXdQcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLgogICAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7CiAgICAgICAgfQoKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gdXBkYXRlUGF5bG9hZDsKICB9CiAgZnVuY3Rpb24gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0Tm9kZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkgewogICAgdmFyIGlzRGlmZmVyZW50ID0gdGV4dE5vZGUubm9kZVZhbHVlICE9PSB0ZXh0OwogICAgcmV0dXJuIGlzRGlmZmVyZW50OwogIH0KICBmdW5jdGlvbiB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGNoaWxkKSB7CiAgICB7CiAgICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlOwoKICAgICAgZXJyb3IoJ0RpZCBub3QgZXhwZWN0IHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSA8JXM+IGluIDwlcz4uJywgY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlVGV4dChwYXJlbnROb2RlLCBjaGlsZCkgewogICAgewogICAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTsKCiAgICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIHRoZSB0ZXh0IG5vZGUgIiVzIiBpbiA8JXM+LicsIGNoaWxkLm5vZGVWYWx1ZSwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHRhZywgcHJvcHMpIHsKICAgIHsKICAgICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7CgogICAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIDwlcz4gaW4gPCVzPi4nLCB0YWcsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KSB7CiAgICB7CiAgICAgIGlmICh0ZXh0ID09PSAnJykgewogICAgICAgIC8vIFdlIGV4cGVjdCB0byBpbnNlcnQgZW1wdHkgdGV4dCBub2RlcyBzaW5jZSB0aGV5J3JlIG5vdCByZXByZXNlbnRlZCBpbgogICAgICAgIC8vIHRoZSBIVE1MLgogICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIHNwZWNpYWwgY2FzZSBpZiB3ZSBjYW4ganVzdCBhdm9pZCBpbnNlcnRpbmcgZW1wdHkKICAgICAgICAvLyB0ZXh0IG5vZGVzLgogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7CgogICAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIHRleHQgbm9kZSBmb3IgIiVzIiBpbiA8JXM+LicsIHRleHQsIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMyhkb21FbGVtZW50LCB0YWcsIHByb3BzKSB7CiAgICBzd2l0Y2ggKHRhZykgewogICAgICBjYXNlICdpbnB1dCc6CiAgICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShkb21FbGVtZW50LCBwcm9wcyk7CiAgICAgICAgcmV0dXJuOwoKICAgICAgY2FzZSAndGV4dGFyZWEnOgogICAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihkb21FbGVtZW50LCBwcm9wcyk7CiAgICAgICAgcmV0dXJuOwoKICAgICAgY2FzZSAnc2VsZWN0JzoKICAgICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZG9tRWxlbWVudCwgcHJvcHMpOwogICAgICAgIHJldHVybjsKICAgIH0KICB9CgogIHZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoKSB7fTsKCiAgdmFyIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAoKSB7fTsKCiAgewogICAgLy8gVGhpcyB2YWxpZGF0aW9uIGNvZGUgd2FzIHdyaXR0ZW4gYmFzZWQgb24gdGhlIEhUTUw1IHBhcnNpbmcgc3BlYzoKICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlCiAgICAvLwogICAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBjYXRjaCBhbGwgaW52YWxpZCBuZXN0aW5nLCBub3IgZG9lcyBpdCB0cnkgdG8gKGFzIGl0J3MKICAgIC8vIG5vdCBjbGVhciB3aGF0IHByYWN0aWNhbCBiZW5lZml0IGRvaW5nIHNvIHByb3ZpZGVzKTsgaW5zdGVhZCwgd2Ugd2FybiBvbmx5CiAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciB3aWxsIGdpdmUgYSBwYXJzZSB0cmVlIGRpZmZlcmluZyBmcm9tIHdoYXQgUmVhY3QKICAgIC8vIGludGVuZGVkLiBGb3IgZXhhbXBsZSwgPGI+PGRpdj48L2Rpdj48L2I+IGlzIGludmFsaWQgYnV0IHdlIGRvbid0IHdhcm4KICAgIC8vIGJlY2F1c2UgaXQgc3RpbGwgcGFyc2VzIGNvcnJlY3RseTsgd2UgZG8gd2FybiBmb3Igb3RoZXIgY2FzZXMgbGlrZSBuZXN0ZWQKICAgIC8vIDxwPiB0YWdzIHdoZXJlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBlbGVtZW50IGltcGxpY2l0bHkgY2xvc2VzIHRoZQogICAgLy8gZmlyc3QsIGNhdXNpbmcgYSBjb25mdXNpbmcgbWVzcy4KICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3NwZWNpYWwKICAgIHZhciBzcGVjaWFsVGFncyA9IFsnYWRkcmVzcycsICdhcHBsZXQnLCAnYXJlYScsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2Jhc2UnLCAnYmFzZWZvbnQnLCAnYmdzb3VuZCcsICdibG9ja3F1b3RlJywgJ2JvZHknLCAnYnInLCAnYnV0dG9uJywgJ2NhcHRpb24nLCAnY2VudGVyJywgJ2NvbCcsICdjb2xncm91cCcsICdkZCcsICdkZXRhaWxzJywgJ2RpcicsICdkaXYnLCAnZGwnLCAnZHQnLCAnZW1iZWQnLCAnZmllbGRzZXQnLCAnZmlnY2FwdGlvbicsICdmaWd1cmUnLCAnZm9vdGVyJywgJ2Zvcm0nLCAnZnJhbWUnLCAnZnJhbWVzZXQnLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnaGVhZCcsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJywgJ2h0bWwnLCAnaWZyYW1lJywgJ2ltZycsICdpbnB1dCcsICdpc2luZGV4JywgJ2xpJywgJ2xpbmsnLCAnbGlzdGluZycsICdtYWluJywgJ21hcnF1ZWUnLCAnbWVudScsICdtZW51aXRlbScsICdtZXRhJywgJ25hdicsICdub2VtYmVkJywgJ25vZnJhbWVzJywgJ25vc2NyaXB0JywgJ29iamVjdCcsICdvbCcsICdwJywgJ3BhcmFtJywgJ3BsYWludGV4dCcsICdwcmUnLCAnc2NyaXB0JywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NvdXJjZScsICdzdHlsZScsICdzdW1tYXJ5JywgJ3RhYmxlJywgJ3Rib2R5JywgJ3RkJywgJ3RlbXBsYXRlJywgJ3RleHRhcmVhJywgJ3Rmb290JywgJ3RoJywgJ3RoZWFkJywgJ3RpdGxlJywgJ3RyJywgJ3RyYWNrJywgJ3VsJywgJ3dicicsICd4bXAnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGUKCiAgICB2YXIgaW5TY29wZVRhZ3MgPSBbJ2FwcGxldCcsICdjYXB0aW9uJywgJ2h0bWwnLCAndGFibGUnLCAndGQnLCAndGgnLCAnbWFycXVlZScsICdvYmplY3QnLCAndGVtcGxhdGUnLCAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNodG1sLWludGVncmF0aW9uLXBvaW50CiAgICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3IgPHRpdGxlPiwgaW5jbHVkaW5nIGl0IGhlcmUKICAgIC8vIGVycnMgb24gdGhlIHNpZGUgb2YgZmV3ZXIgd2FybmluZ3MKICAgICdmb3JlaWduT2JqZWN0JywgJ2Rlc2MnLCAndGl0bGUnXTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tYnV0dG9uLXNjb3BlCgogICAgdmFyIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbJ2J1dHRvbiddKTsgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjZ2VuZXJhdGUtaW1wbGllZC1lbmQtdGFncwoKICAgIHZhciBpbXBsaWVkRW5kVGFncyA9IFsnZGQnLCAnZHQnLCAnbGknLCAnb3B0aW9uJywgJ29wdGdyb3VwJywgJ3AnLCAncnAnLCAncnQnXTsKICAgIHZhciBlbXB0eUFuY2VzdG9ySW5mbyA9IHsKICAgICAgY3VycmVudDogbnVsbCwKICAgICAgZm9ybVRhZzogbnVsbCwKICAgICAgYVRhZ0luU2NvcGU6IG51bGwsCiAgICAgIGJ1dHRvblRhZ0luU2NvcGU6IG51bGwsCiAgICAgIG5vYnJUYWdJblNjb3BlOiBudWxsLAogICAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCwKICAgICAgbGlzdEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbCwKICAgICAgZGxJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwKICAgIH07CgogICAgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcpIHsKICAgICAgdmFyIGFuY2VzdG9ySW5mbyA9IGFzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbyk7CgogICAgICB2YXIgaW5mbyA9IHsKICAgICAgICB0YWc6IHRhZwogICAgICB9OwoKICAgICAgaWYgKGluU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHsKICAgICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsOwogICAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gbnVsbDsKICAgICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBudWxsOwogICAgICB9CgogICAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHsKICAgICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBudWxsOwogICAgICB9IC8vIFNlZSBydWxlcyBmb3IgJ2xpJywgJ2RkJywgJ2R0JyBzdGFydCB0YWdzIGluCiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHkKCgogICAgICBpZiAoc3BlY2lhbFRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSAmJiB0YWcgIT09ICdhZGRyZXNzJyAmJiB0YWcgIT09ICdkaXYnICYmIHRhZyAhPT0gJ3AnKSB7CiAgICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsOwogICAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7CiAgICAgIH0KCiAgICAgIGFuY2VzdG9ySW5mby5jdXJyZW50ID0gaW5mbzsKCiAgICAgIGlmICh0YWcgPT09ICdmb3JtJykgewogICAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbzsKICAgICAgfQoKICAgICAgaWYgKHRhZyA9PT0gJ2EnKSB7CiAgICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gaW5mbzsKICAgICAgfQoKICAgICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHsKICAgICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IGluZm87CiAgICAgIH0KCiAgICAgIGlmICh0YWcgPT09ICdub2JyJykgewogICAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87CiAgICAgIH0KCiAgICAgIGlmICh0YWcgPT09ICdwJykgewogICAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IGluZm87CiAgICAgIH0KCiAgICAgIGlmICh0YWcgPT09ICdsaScpIHsKICAgICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87CiAgICAgIH0KCiAgICAgIGlmICh0YWcgPT09ICdkZCcgfHwgdGFnID09PSAnZHQnKSB7CiAgICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbzsKICAgICAgfQoKICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mbzsKICAgIH07CiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlcgogICAgICovCgoKICAgIHZhciBpc1RhZ1ZhbGlkV2l0aFBhcmVudCA9IGZ1bmN0aW9uICh0YWcsIHBhcmVudFRhZykgewogICAgICAvLyBGaXJzdCwgbGV0J3MgY2hlY2sgaWYgd2UncmUgaW4gYW4gdW51c3VhbCBwYXJzaW5nIG1vZGUuLi4KICAgICAgc3dpdGNoIChwYXJlbnRUYWcpIHsKICAgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5zZWxlY3QKICAgICAgICBjYXNlICdzZWxlY3QnOgogICAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JzsKCiAgICAgICAgY2FzZSAnb3B0Z3JvdXAnOgogICAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnI3RleHQnOwogICAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nLCBzZWVpbmcgYW4gPG9wdGlvbj4gZG9lc24ndCBtZWFuIHdlJ3JlIGluIGEgPHNlbGVjdD4KICAgICAgICAvLyBidXQKCiAgICAgICAgY2FzZSAnb3B0aW9uJzoKICAgICAgICAgIHJldHVybiB0YWcgPT09ICcjdGV4dCc7CiAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGQKICAgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jYXB0aW9uCiAgICAgICAgLy8gTm8gc3BlY2lhbCBiZWhhdmlvciBzaW5jZSB0aGVzZSBydWxlcyBmYWxsIGJhY2sgdG8gImluIGJvZHkiIG1vZGUgZm9yCiAgICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS4KICAgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50cgoKICAgICAgICBjYXNlICd0cic6CiAgICAgICAgICByZXR1cm4gdGFnID09PSAndGgnIHx8IHRhZyA9PT0gJ3RkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7CiAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGJvZHkKCiAgICAgICAgY2FzZSAndGJvZHknOgogICAgICAgIGNhc2UgJ3RoZWFkJzoKICAgICAgICBjYXNlICd0Zm9vdCc6CiAgICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJzsKICAgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jb2xncm91cAoKICAgICAgICBjYXNlICdjb2xncm91cCc6CiAgICAgICAgICByZXR1cm4gdGFnID09PSAnY29sJyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7CiAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGUKCiAgICAgICAgY2FzZSAndGFibGUnOgogICAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NhcHRpb24nIHx8IHRhZyA9PT0gJ2NvbGdyb3VwJyB8fCB0YWcgPT09ICd0Ym9keScgfHwgdGFnID09PSAndGZvb3QnIHx8IHRhZyA9PT0gJ3RoZWFkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7CiAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluaGVhZAoKICAgICAgICBjYXNlICdoZWFkJzoKICAgICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnOwogICAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlbWFudGljcy5odG1sI3RoZS1odG1sLWVsZW1lbnQKCiAgICAgICAgY2FzZSAnaHRtbCc6CiAgICAgICAgICByZXR1cm4gdGFnID09PSAnaGVhZCcgfHwgdGFnID09PSAnYm9keScgfHwgdGFnID09PSAnZnJhbWVzZXQnOwoKICAgICAgICBjYXNlICdmcmFtZXNldCc6CiAgICAgICAgICByZXR1cm4gdGFnID09PSAnZnJhbWUnOwoKICAgICAgICBjYXNlICcjZG9jdW1lbnQnOgogICAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2h0bWwnOwogICAgICB9IC8vIFByb2JhYmx5IGluIHRoZSAiaW4gYm9keSIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zCiAgICAgIC8vIHdoZXJlIHRoZSBwYXJzaW5nIHJ1bGVzIGNhdXNlIGltcGxpY2l0IG9wZW5zIG9yIGNsb3NlcyB0byBiZSBhZGRlZC4KICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keQoKCiAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgY2FzZSAnaDEnOgogICAgICAgIGNhc2UgJ2gyJzoKICAgICAgICBjYXNlICdoMyc6CiAgICAgICAgY2FzZSAnaDQnOgogICAgICAgIGNhc2UgJ2g1JzoKICAgICAgICBjYXNlICdoNic6CiAgICAgICAgICByZXR1cm4gcGFyZW50VGFnICE9PSAnaDEnICYmIHBhcmVudFRhZyAhPT0gJ2gyJyAmJiBwYXJlbnRUYWcgIT09ICdoMycgJiYgcGFyZW50VGFnICE9PSAnaDQnICYmIHBhcmVudFRhZyAhPT0gJ2g1JyAmJiBwYXJlbnRUYWcgIT09ICdoNic7CgogICAgICAgIGNhc2UgJ3JwJzoKICAgICAgICBjYXNlICdydCc6CiAgICAgICAgICByZXR1cm4gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcpID09PSAtMTsKCiAgICAgICAgY2FzZSAnYm9keSc6CiAgICAgICAgY2FzZSAnY2FwdGlvbic6CiAgICAgICAgY2FzZSAnY29sJzoKICAgICAgICBjYXNlICdjb2xncm91cCc6CiAgICAgICAgY2FzZSAnZnJhbWVzZXQnOgogICAgICAgIGNhc2UgJ2ZyYW1lJzoKICAgICAgICBjYXNlICdoZWFkJzoKICAgICAgICBjYXNlICdodG1sJzoKICAgICAgICBjYXNlICd0Ym9keSc6CiAgICAgICAgY2FzZSAndGQnOgogICAgICAgIGNhc2UgJ3Rmb290JzoKICAgICAgICBjYXNlICd0aCc6CiAgICAgICAgY2FzZSAndGhlYWQnOgogICAgICAgIGNhc2UgJ3RyJzoKICAgICAgICAgIC8vIFRoZXNlIHRhZ3MgYXJlIG9ubHkgdmFsaWQgd2l0aCBhIGZldyBwYXJlbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIGNoaWxkCiAgICAgICAgICAvLyBwYXJzaW5nIHJ1bGVzIC0tIGlmIHdlJ3JlIGRvd24gaGVyZSwgdGhlbiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kCiAgICAgICAgICAvLyBzbyB3ZSBhbGxvdyBpdCBvbmx5IGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgcGFyZW50IGlzLCBhcyBhbGwgb3RoZXIKICAgICAgICAgIC8vIGNhc2VzIGFyZSBpbnZhbGlkLgogICAgICAgICAgcmV0dXJuIHBhcmVudFRhZyA9PSBudWxsOwogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlcgogICAgICovCgoKICAgIHZhciBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnID0gZnVuY3Rpb24gKHRhZywgYW5jZXN0b3JJbmZvKSB7CiAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgY2FzZSAnYWRkcmVzcyc6CiAgICAgICAgY2FzZSAnYXJ0aWNsZSc6CiAgICAgICAgY2FzZSAnYXNpZGUnOgogICAgICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOgogICAgICAgIGNhc2UgJ2NlbnRlcic6CiAgICAgICAgY2FzZSAnZGV0YWlscyc6CiAgICAgICAgY2FzZSAnZGlhbG9nJzoKICAgICAgICBjYXNlICdkaXInOgogICAgICAgIGNhc2UgJ2Rpdic6CiAgICAgICAgY2FzZSAnZGwnOgogICAgICAgIGNhc2UgJ2ZpZWxkc2V0JzoKICAgICAgICBjYXNlICdmaWdjYXB0aW9uJzoKICAgICAgICBjYXNlICdmaWd1cmUnOgogICAgICAgIGNhc2UgJ2Zvb3Rlcic6CiAgICAgICAgY2FzZSAnaGVhZGVyJzoKICAgICAgICBjYXNlICdoZ3JvdXAnOgogICAgICAgIGNhc2UgJ21haW4nOgogICAgICAgIGNhc2UgJ21lbnUnOgogICAgICAgIGNhc2UgJ25hdic6CiAgICAgICAgY2FzZSAnb2wnOgogICAgICAgIGNhc2UgJ3AnOgogICAgICAgIGNhc2UgJ3NlY3Rpb24nOgogICAgICAgIGNhc2UgJ3N1bW1hcnknOgogICAgICAgIGNhc2UgJ3VsJzoKICAgICAgICBjYXNlICdwcmUnOgogICAgICAgIGNhc2UgJ2xpc3RpbmcnOgogICAgICAgIGNhc2UgJ3RhYmxlJzoKICAgICAgICBjYXNlICdocic6CiAgICAgICAgY2FzZSAneG1wJzoKICAgICAgICBjYXNlICdoMSc6CiAgICAgICAgY2FzZSAnaDInOgogICAgICAgIGNhc2UgJ2gzJzoKICAgICAgICBjYXNlICdoNCc6CiAgICAgICAgY2FzZSAnaDUnOgogICAgICAgIGNhc2UgJ2g2JzoKICAgICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7CgogICAgICAgIGNhc2UgJ2Zvcm0nOgogICAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5mb3JtVGFnIHx8IGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTsKCiAgICAgICAgY2FzZSAnbGknOgogICAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nOwoKICAgICAgICBjYXNlICdkZCc6CiAgICAgICAgY2FzZSAnZHQnOgogICAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZzsKCiAgICAgICAgY2FzZSAnYnV0dG9uJzoKICAgICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZTsKCiAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAvLyBTcGVjIHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBzb3VuZHMKICAgICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhpcyBjaGVjay4KICAgICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGU7CgogICAgICAgIGNhc2UgJ25vYnInOgogICAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTsKICAgICAgfQoKICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKICAgIHZhciBkaWRXYXJuJDEgPSB7fTsKCiAgICB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoY2hpbGRUYWcsIGNoaWxkVGV4dCwgYW5jZXN0b3JJbmZvKSB7CiAgICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbzsKICAgICAgdmFyIHBhcmVudEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVudDsKICAgICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudEluZm8gJiYgcGFyZW50SW5mby50YWc7CgogICAgICBpZiAoY2hpbGRUZXh0ICE9IG51bGwpIHsKICAgICAgICBpZiAoY2hpbGRUYWcgIT0gbnVsbCkgewogICAgICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZzogd2hlbiBjaGlsZFRleHQgaXMgcGFzc2VkLCBjaGlsZFRhZyBzaG91bGQgYmUgbnVsbCcpOwogICAgICAgIH0KCiAgICAgICAgY2hpbGRUYWcgPSAnI3RleHQnOwogICAgICB9CgogICAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNoaWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87CiAgICAgIHZhciBpbnZhbGlkQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50ID8gbnVsbCA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7CiAgICAgIHZhciBpbnZhbGlkUGFyZW50T3JBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgfHwgaW52YWxpZEFuY2VzdG9yOwoKICAgICAgaWYgKCFpbnZhbGlkUGFyZW50T3JBbmNlc3RvcikgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIGFuY2VzdG9yVGFnID0gaW52YWxpZFBhcmVudE9yQW5jZXN0b3IudGFnOwogICAgICB2YXIgd2FybktleSA9ICEhaW52YWxpZFBhcmVudCArICd8JyArIGNoaWxkVGFnICsgJ3wnICsgYW5jZXN0b3JUYWc7CgogICAgICBpZiAoZGlkV2FybiQxW3dhcm5LZXldKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBkaWRXYXJuJDFbd2FybktleV0gPSB0cnVlOwogICAgICB2YXIgdGFnRGlzcGxheU5hbWUgPSBjaGlsZFRhZzsKICAgICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7CgogICAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHsKICAgICAgICBpZiAoL1xTLy50ZXN0KGNoaWxkVGV4dCkpIHsKICAgICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1RleHQgbm9kZXMnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnOwogICAgICAgICAgd2hpdGVzcGFjZUluZm8gPSAiIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gIiArICdlYWNoIGxpbmUgb2YgeW91ciBzb3VyY2UgY29kZS4nOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICc8JyArIGNoaWxkVGFnICsgJz4nOwogICAgICB9CgogICAgICBpZiAoaW52YWxpZFBhcmVudCkgewogICAgICAgIHZhciBpbmZvID0gJyc7CgogICAgICAgIGlmIChhbmNlc3RvclRhZyA9PT0gJ3RhYmxlJyAmJiBjaGlsZFRhZyA9PT0gJ3RyJykgewogICAgICAgICAgaW5mbyArPSAnIEFkZCBhIDx0Ym9keT4sIDx0aGVhZD4gb3IgPHRmb290PiB0byB5b3VyIGNvZGUgdG8gbWF0Y2ggdGhlIERPTSB0cmVlIGdlbmVyYXRlZCBieSAnICsgJ3RoZSBicm93c2VyLic7CiAgICAgICAgfQoKICAgICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBkZXNjZW5kYW50IG9mICcgKyAnPCVzPi4nLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcpOwogICAgICB9CiAgICB9OwogIH0KCiAgdmFyIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDEgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJzsKICB2YXIgU1VTUEVOU0VfU1RBUlRfREFUQSA9ICckJzsKICB2YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnOwogIHZhciBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgPSAnJD8nOwogIHZhciBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBID0gJyQhJzsKICB2YXIgU1RZTEUkMSA9ICdzdHlsZSc7CiAgdmFyIGV2ZW50c0VuYWJsZWQgPSBudWxsOwogIHZhciBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGw7CiAgZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkgewogICAgdmFyIHR5cGU7CiAgICB2YXIgbmFtZXNwYWNlOwogICAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlOwoKICAgIHN3aXRjaCAobm9kZVR5cGUpIHsKICAgICAgY2FzZSBET0NVTUVOVF9OT0RFOgogICAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6CiAgICAgICAgewogICAgICAgICAgdHlwZSA9IG5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gJyNkb2N1bWVudCcgOiAnI2ZyYWdtZW50JzsKICAgICAgICAgIHZhciByb290ID0gcm9vdENvbnRhaW5lckluc3RhbmNlLmRvY3VtZW50RWxlbWVudDsKICAgICAgICAgIG5hbWVzcGFjZSA9IHJvb3QgPyByb290Lm5hbWVzcGFjZVVSSSA6IGdldENoaWxkTmFtZXNwYWNlKG51bGwsICcnKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgewogICAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyByb290Q29udGFpbmVySW5zdGFuY2UucGFyZW50Tm9kZSA6IHJvb3RDb250YWluZXJJbnN0YW5jZTsKICAgICAgICAgIHZhciBvd25OYW1lc3BhY2UgPSBjb250YWluZXIubmFtZXNwYWNlVVJJIHx8IG51bGw7CiAgICAgICAgICB0eXBlID0gY29udGFpbmVyLnRhZ05hbWU7CiAgICAgICAgICBuYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShvd25OYW1lc3BhY2UsIHR5cGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIHsKICAgICAgdmFyIHZhbGlkYXRlZFRhZyA9IHR5cGUudG9Mb3dlckNhc2UoKTsKICAgICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgdmFsaWRhdGVkVGFnKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSwKICAgICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mbwogICAgICB9OwogICAgfQogIH0KICBmdW5jdGlvbiBnZXRDaGlsZEhvc3RDb250ZXh0KHBhcmVudEhvc3RDb250ZXh0LCB0eXBlLCByb290Q29udGFpbmVySW5zdGFuY2UpIHsKICAgIHsKICAgICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7CiAgICAgIHZhciBuYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnRIb3N0Q29udGV4dERldi5uYW1lc3BhY2UsIHR5cGUpOwogICAgICB2YXIgYW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhwYXJlbnRIb3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpOwogICAgICByZXR1cm4gewogICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLAogICAgICAgIGFuY2VzdG9ySW5mbzogYW5jZXN0b3JJbmZvCiAgICAgIH07CiAgICB9CiAgfQogIGZ1bmN0aW9uIGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7CiAgICByZXR1cm4gaW5zdGFuY2U7CiAgfQogIGZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykgewogICAgZXZlbnRzRW5hYmxlZCA9IGlzRW5hYmxlZCgpOwogICAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBnZXRTZWxlY3Rpb25JbmZvcm1hdGlvbigpOwogICAgdmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDsKCiAgICBzZXRFbmFibGVkKGZhbHNlKTsKICAgIHJldHVybiBhY3RpdmVJbnN0YW5jZTsKICB9CiAgZnVuY3Rpb24gcmVzZXRBZnRlckNvbW1pdChjb250YWluZXJJbmZvKSB7CiAgICByZXN0b3JlU2VsZWN0aW9uKHNlbGVjdGlvbkluZm9ybWF0aW9uKTsKICAgIHNldEVuYWJsZWQoZXZlbnRzRW5hYmxlZCk7CiAgICBldmVudHNFbmFibGVkID0gbnVsbDsKICAgIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gbnVsbDsKICB9CiAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHsKICAgIHZhciBwYXJlbnROYW1lc3BhY2U7CgogICAgewogICAgICAvLyBUT0RPOiB0YWtlIG5hbWVzcGFjZSBpbnRvIGFjY291bnQgd2hlbiB2YWxpZGF0aW5nLgogICAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDsKICAgICAgdmFsaWRhdGVET01OZXN0aW5nKHR5cGUsIG51bGwsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7CgogICAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInKSB7CiAgICAgICAgdmFyIHN0cmluZyA9ICcnICsgcHJvcHMuY2hpbGRyZW47CiAgICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTsKICAgICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgc3RyaW5nLCBvd25BbmNlc3RvckluZm8pOwogICAgICB9CgogICAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7CiAgICB9CgogICAgdmFyIGRvbUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIHBhcmVudE5hbWVzcGFjZSk7CiAgICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBkb21FbGVtZW50KTsKICAgIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpOwogICAgcmV0dXJuIGRvbUVsZW1lbnQ7CiAgfQogIGZ1bmN0aW9uIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHsKICAgIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTsKICB9CiAgZnVuY3Rpb24gZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oZG9tRWxlbWVudCwgdHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHsKICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpOwoKICAgIHN3aXRjaCAodHlwZSkgewogICAgICBjYXNlICdidXR0b24nOgogICAgICBjYXNlICdpbnB1dCc6CiAgICAgIGNhc2UgJ3NlbGVjdCc6CiAgICAgIGNhc2UgJ3RleHRhcmVhJzoKICAgICAgICByZXR1cm4gISFwcm9wcy5hdXRvRm9jdXM7CgogICAgICBjYXNlICdpbWcnOgogICAgICAgIHJldHVybiB0cnVlOwoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHByZXBhcmVVcGRhdGUoZG9tRWxlbWVudCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7CiAgICB7CiAgICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0OwoKICAgICAgaWYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiAhPT0gdHlwZW9mIG9sZFByb3BzLmNoaWxkcmVuICYmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpKSB7CiAgICAgICAgdmFyIHN0cmluZyA9ICcnICsgbmV3UHJvcHMuY2hpbGRyZW47CiAgICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTsKICAgICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgc3RyaW5nLCBvd25BbmNlc3RvckluZm8pOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7CiAgfQogIGZ1bmN0aW9uIHNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIHByb3BzKSB7CiAgICByZXR1cm4gdHlwZSA9PT0gJ3RleHRhcmVhJyB8fCB0eXBlID09PSAnbm9zY3JpcHQnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSBudWxsICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCAhPSBudWxsOwogIH0KICBmdW5jdGlvbiBjcmVhdGVUZXh0SW5zdGFuY2UodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkgewogICAgewogICAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDsKICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHRleHQsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7CiAgICB9CgogICAgdmFyIHRleHROb2RlID0gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlKTsKICAgIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIHRleHROb2RlKTsKICAgIHJldHVybiB0ZXh0Tm9kZTsKICB9CiAgZnVuY3Rpb24gZ2V0Q3VycmVudEV2ZW50UHJpb3JpdHkoKSB7CiAgICB2YXIgY3VycmVudEV2ZW50ID0gd2luZG93LmV2ZW50OwoKICAgIGlmIChjdXJyZW50RXZlbnQgPT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7CiAgICB9CgogICAgcmV0dXJuIGdldEV2ZW50UHJpb3JpdHkoY3VycmVudEV2ZW50LnR5cGUpOwogIH0KICAvLyBpZiBhIGNvbXBvbmVudCBqdXN0IGltcG9ydHMgUmVhY3RET00gKGUuZy4gZm9yIGZpbmRET01Ob2RlKS4KICAvLyBTb21lIGVudmlyb25tZW50cyBtaWdodCBub3QgaGF2ZSBzZXRUaW1lb3V0IG9yIGNsZWFyVGltZW91dC4KCiAgdmFyIHNjaGVkdWxlVGltZW91dCA9IHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gc2V0VGltZW91dCA6IHVuZGVmaW5lZDsKICB2YXIgY2FuY2VsVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiB1bmRlZmluZWQ7CiAgdmFyIG5vVGltZW91dCA9IC0xOwogIHZhciBsb2NhbFByb21pc2UgPSB0eXBlb2YgUHJvbWlzZSA9PT0gJ2Z1bmN0aW9uJyA/IFByb21pc2UgOiB1bmRlZmluZWQ7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0KICB2YXIgc2NoZWR1bGVNaWNyb3Rhc2sgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IHR5cGVvZiBsb2NhbFByb21pc2UgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICByZXR1cm4gbG9jYWxQcm9taXNlLnJlc29sdmUobnVsbCkudGhlbihjYWxsYmFjaykuY2F0Y2goaGFuZGxlRXJyb3JJbk5leHRUaWNrKTsKICB9IDogc2NoZWR1bGVUaW1lb3V0OyAvLyBUT0RPOiBEZXRlcm1pbmUgdGhlIGJlc3QgZmFsbGJhY2sgaGVyZS4KCiAgZnVuY3Rpb24gaGFuZGxlRXJyb3JJbk5leHRUaWNrKGVycm9yKSB7CiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgdGhyb3cgZXJyb3I7CiAgICB9KTsKICB9IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0KICBmdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkgewogICAgLy8gRGVzcGl0ZSB0aGUgbmFtaW5nIHRoYXQgbWlnaHQgaW1wbHkgb3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCBvbmx5CiAgICAvLyBmaXJlcyBpZiB0aGVyZSBpcyBhbiBgVXBkYXRlYCBlZmZlY3Qgc2NoZWR1bGVkIGR1cmluZyBtb3VudGluZy4KICAgIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdAogICAgLy8gZG9lcyB0byBpbXBsZW1lbnQgdGhlIGBhdXRvRm9jdXNgIGF0dHJpYnV0ZSBvbiB0aGUgY2xpZW50KS4gQnV0CiAgICAvLyB0aGVyZSBhcmUgYWxzbyBvdGhlciBjYXNlcyB3aGVuIHRoaXMgbWlnaHQgaGFwcGVuIChzdWNoIGFzIHBhdGNoaW5nCiAgICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uCiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSAnYnV0dG9uJzoKICAgICAgY2FzZSAnaW5wdXQnOgogICAgICBjYXNlICdzZWxlY3QnOgogICAgICBjYXNlICd0ZXh0YXJlYSc6CiAgICAgICAgaWYgKG5ld1Byb3BzLmF1dG9Gb2N1cykgewogICAgICAgICAgZG9tRWxlbWVudC5mb2N1cygpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuOwoKICAgICAgY2FzZSAnaW1nJzoKICAgICAgICB7CiAgICAgICAgICBpZiAobmV3UHJvcHMuc3JjKSB7CiAgICAgICAgICAgIGRvbUVsZW1lbnQuc3JjID0gbmV3UHJvcHMuc3JjOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGNvbW1pdFVwZGF0ZShkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHsKICAgIC8vIEFwcGx5IHRoZSBkaWZmIHRvIHRoZSBET00gbm9kZS4KICAgIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTsgLy8gVXBkYXRlIHRoZSBwcm9wcyBoYW5kbGUgc28gdGhhdCB3ZSBrbm93IHdoaWNoIHByb3BzIGFyZSB0aGUgb25lcyB3aXRoCiAgICAvLyB3aXRoIGN1cnJlbnQgZXZlbnQgaGFuZGxlcnMuCgogICAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBuZXdQcm9wcyk7CiAgfQogIGZ1bmN0aW9uIHJlc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCkgewogICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycpOwogIH0KICBmdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkgewogICAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IG5ld1RleHQ7CiAgfQogIGZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkgewogICAgcGFyZW50SW5zdGFuY2UuYXBwZW5kQ2hpbGQoY2hpbGQpOwogIH0KICBmdW5jdGlvbiBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHsKICAgIHZhciBwYXJlbnROb2RlOwoKICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgewogICAgICBwYXJlbnROb2RlID0gY29udGFpbmVyLnBhcmVudE5vZGU7CiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpOwogICAgfSBlbHNlIHsKICAgICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lcjsKICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7CiAgICB9IC8vIFRoaXMgY29udGFpbmVyIG1pZ2h0IGJlIHVzZWQgZm9yIGEgcG9ydGFsLgogICAgLy8gSWYgc29tZXRoaW5nIGluc2lkZSBhIHBvcnRhbCBpcyBjbGlja2VkLCB0aGF0IGNsaWNrIHNob3VsZCBidWJibGUKICAgIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkCiAgICAvLyBuZXZlciBidWJibGUgdGhyb3VnaCB0aGUgKkRPTSogdHJlZSB1bmxlc3MgYW4gYW5jZXN0b3Igd2l0aCBvbmNsaWNrCiAgICAvLyBldmVudCBleGlzdHMuIFNvIHdlIHdvdWxkbid0IHNlZSBpdCBhbmQgZGlzcGF0Y2ggaXQuCiAgICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2sKICAgIC8vIGRlZmluZWQuCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExOTE4CgoKICAgIHZhciByZWFjdFJvb3RDb250YWluZXIgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjsKCiAgICBpZiAoKHJlYWN0Um9vdENvbnRhaW5lciA9PT0gbnVsbCB8fCByZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZCkgJiYgcGFyZW50Tm9kZS5vbmNsaWNrID09PSBudWxsKSB7CiAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuCiAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpOwogICAgfQogIH0KICBmdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50SW5zdGFuY2UsIGNoaWxkLCBiZWZvcmVDaGlsZCkgewogICAgcGFyZW50SW5zdGFuY2UuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7CiAgfQogIGZ1bmN0aW9uIGluc2VydEluQ29udGFpbmVyQmVmb3JlKGNvbnRhaW5lciwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7CiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHsKICAgICAgY29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7CiAgICB9IGVsc2UgewogICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHsKICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKGNoaWxkKTsKICB9CiAgZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHsKICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgewogICAgICBjb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7CiAgICB9IGVsc2UgewogICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY2hpbGQpOwogICAgfQogIH0KICBmdW5jdGlvbiBjbGVhclN1c3BlbnNlQm91bmRhcnkocGFyZW50SW5zdGFuY2UsIHN1c3BlbnNlSW5zdGFuY2UpIHsKICAgIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZTsgLy8gRGVsZXRlIGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS4KICAgIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93CiAgICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC4KCiAgICB2YXIgZGVwdGggPSAwOwoKICAgIGRvIHsKICAgICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZzsKICAgICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobm9kZSk7CgogICAgICBpZiAobmV4dE5vZGUgJiYgbmV4dE5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgewogICAgICAgIHZhciBkYXRhID0gbmV4dE5vZGUuZGF0YTsKCiAgICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7CiAgICAgICAgICBpZiAoZGVwdGggPT09IDApIHsKICAgICAgICAgICAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQobmV4dE5vZGUpOyAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuCgogICAgICAgICAgICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZXB0aC0tOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSkgewogICAgICAgICAgZGVwdGgrKzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIG5vZGUgPSBuZXh0Tm9kZTsKICAgIH0gd2hpbGUgKG5vZGUpOyAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuCiAgICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuCgoKICAgIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7CiAgfQogIGZ1bmN0aW9uIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoY29udGFpbmVyLCBzdXNwZW5zZUluc3RhbmNlKSB7CiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHsKICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lci5wYXJlbnROb2RlLCBzdXNwZW5zZUluc3RhbmNlKTsKICAgIH0gZWxzZSBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHsKICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KGNvbnRhaW5lciwgc3VzcGVuc2VJbnN0YW5jZSk7CiAgICB9IC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy4KCgogICAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpOwogIH0KICBmdW5jdGlvbiBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpIHsKICAgIC8vIFRPRE86IERvZXMgdGhpcyB3b3JrIGZvciBhbGwgZWxlbWVudCB0eXBlcz8gV2hhdCBhYm91dCBNYXRoTUw/IFNob3VsZCB3ZQogICAgLy8gcGFzcyBob3N0IGNvbnRleHQgdG8gdGhpcyBtZXRob2Q/CiAgICBpbnN0YW5jZSA9IGluc3RhbmNlOwogICAgdmFyIHN0eWxlID0gaW5zdGFuY2Uuc3R5bGU7CgogICAgaWYgKHR5cGVvZiBzdHlsZS5zZXRQcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBzdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpOwogICAgfSBlbHNlIHsKICAgICAgc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIH0KICB9CiAgZnVuY3Rpb24gaGlkZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UpIHsKICAgIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSAnJzsKICB9CiAgZnVuY3Rpb24gdW5oaWRlSW5zdGFuY2UoaW5zdGFuY2UsIHByb3BzKSB7CiAgICBpbnN0YW5jZSA9IGluc3RhbmNlOwogICAgdmFyIHN0eWxlUHJvcCA9IHByb3BzW1NUWUxFJDFdOwogICAgdmFyIGRpc3BsYXkgPSBzdHlsZVByb3AgIT09IHVuZGVmaW5lZCAmJiBzdHlsZVByb3AgIT09IG51bGwgJiYgc3R5bGVQcm9wLmhhc093blByb3BlcnR5KCdkaXNwbGF5JykgPyBzdHlsZVByb3AuZGlzcGxheSA6IG51bGw7CiAgICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZSgnZGlzcGxheScsIGRpc3BsYXkpOwogIH0KICBmdW5jdGlvbiB1bmhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0KSB7CiAgICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDsKICB9CiAgZnVuY3Rpb24gY2xlYXJDb250YWluZXIoY29udGFpbmVyKSB7CiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHsKICAgICAgY29udGFpbmVyLnRleHRDb250ZW50ID0gJyc7CiAgICB9IGVsc2UgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSkgewogICAgICBpZiAoY29udGFpbmVyLmRvY3VtZW50RWxlbWVudCkgewogICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIuZG9jdW1lbnRFbGVtZW50KTsKICAgICAgfQogICAgfQogIH0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uIGNhbkh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHsKICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhbiBlbGVtZW50IG5vZGUuCgoKICAgIHJldHVybiBpbnN0YW5jZTsKICB9CiAgZnVuY3Rpb24gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShpbnN0YW5jZSwgdGV4dCkgewogICAgaWYgKHRleHQgPT09ICcnIHx8IGluc3RhbmNlLm5vZGVUeXBlICE9PSBURVhUX05PREUpIHsKICAgICAgLy8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IHBhcnNlZCBieSBIVE1MIHNvIHRoZXJlIHdvbid0IGJlIGEgY29ycmVjdCBtYXRjaCBoZXJlLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHRleHQgbm9kZS4KCgogICAgcmV0dXJuIGluc3RhbmNlOwogIH0KICBmdW5jdGlvbiBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShpbnN0YW5jZSkgewogICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlICE9PSBDT01NRU5UX05PREUpIHsKICAgICAgLy8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IHBhcnNlZCBieSBIVE1MIHNvIHRoZXJlIHdvbid0IGJlIGEgY29ycmVjdCBtYXRjaCBoZXJlLgogICAgICByZXR1cm4gbnVsbDsKICAgIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHN1c3BlbnNlIG5vZGUuCgoKICAgIHJldHVybiBpbnN0YW5jZTsKICB9CiAgZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhpbnN0YW5jZSkgewogICAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQTsKICB9CiAgZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soaW5zdGFuY2UpIHsKICAgIHJldHVybiBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBOwogIH0KICBmdW5jdGlvbiBnZXRTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2tFcnJvckRldGFpbHMoaW5zdGFuY2UpIHsKICAgIHZhciBkYXRhc2V0ID0gaW5zdGFuY2UubmV4dFNpYmxpbmcgJiYgaW5zdGFuY2UubmV4dFNpYmxpbmcuZGF0YXNldDsKICAgIHZhciBkaWdlc3QsIG1lc3NhZ2UsIHN0YWNrOwoKICAgIGlmIChkYXRhc2V0KSB7CiAgICAgIGRpZ2VzdCA9IGRhdGFzZXQuZGdzdDsKCiAgICAgIHsKICAgICAgICBtZXNzYWdlID0gZGF0YXNldC5tc2c7CiAgICAgICAgc3RhY2sgPSBkYXRhc2V0LnN0Y2s7CiAgICAgIH0KICAgIH0KCiAgICB7CiAgICAgIHJldHVybiB7CiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSwKICAgICAgICBkaWdlc3Q6IGRpZ2VzdCwKICAgICAgICBzdGFjazogc3RhY2sKICAgICAgfTsKICAgIH0gLy8gbGV0IHZhbHVlID0ge21lc3NhZ2U6IHVuZGVmaW5lZCwgaGFzaDogdW5kZWZpbmVkfTsKICAgIC8vIGNvbnN0IG5leHRTaWJsaW5nID0gaW5zdGFuY2UubmV4dFNpYmxpbmc7CiAgICAvLyBpZiAobmV4dFNpYmxpbmcpIHsKICAgIC8vICAgY29uc3QgZGF0YXNldCA9ICgobmV4dFNpYmxpbmc6IGFueSk6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpLmRhdGFzZXQ7CiAgICAvLyAgIHZhbHVlLm1lc3NhZ2UgPSBkYXRhc2V0Lm1zZzsKICAgIC8vICAgdmFsdWUuaGFzaCA9IGRhdGFzZXQuaGFzaDsKICAgIC8vICAgaWYgKHRydWUpIHsKICAgIC8vICAgICB2YWx1ZS5zdGFjayA9IGRhdGFzZXQuc3RhY2s7CiAgICAvLyAgIH0KICAgIC8vIH0KICAgIC8vIHJldHVybiB2YWx1ZTsKCiAgfQogIGZ1bmN0aW9uIHJlZ2lzdGVyU3VzcGVuc2VJbnN0YW5jZVJldHJ5KGluc3RhbmNlLCBjYWxsYmFjaykgewogICAgaW5zdGFuY2UuX3JlYWN0UmV0cnkgPSBjYWxsYmFjazsKICB9CgogIGZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlKG5vZGUpIHsKICAgIC8vIFNraXAgbm9uLWh5ZHJhdGFibGUgbm9kZXMuCiAgICBmb3IgKDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5uZXh0U2libGluZykgewogICAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlOwoKICAgICAgaWYgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZVR5cGUgPT09IFRFWFRfTk9ERSkgewogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICBpZiAobm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgewogICAgICAgIHZhciBub2RlRGF0YSA9IG5vZGUuZGF0YTsKCiAgICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IG5vZGVEYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICBmdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoaW5zdGFuY2UpIHsKICAgIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShpbnN0YW5jZS5uZXh0U2libGluZyk7CiAgfQogIGZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkKHBhcmVudEluc3RhbmNlKSB7CiAgICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UuZmlyc3RDaGlsZCk7CiAgfQogIGZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lcikgewogICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTsKICB9CiAgZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlKSB7CiAgICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UubmV4dFNpYmxpbmcpOwogIH0KICBmdW5jdGlvbiBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBzaG91bGRXYXJuRGV2KSB7CiAgICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50cwogICAgLy8gZ2V0IGF0dGFjaGVkLgoKICAgIHVwZGF0ZUZpYmVyUHJvcHMoaW5zdGFuY2UsIHByb3BzKTsKICAgIHZhciBwYXJlbnROYW1lc3BhY2U7CgogICAgewogICAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDsKICAgICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlOwogICAgfSAvLyBUT0RPOiBUZW1wb3JhcnkgaGFjayB0byBjaGVjayBpZiB3ZSdyZSBpbiBhIGNvbmN1cnJlbnQgcm9vdC4gV2UgY2FuIGRlbGV0ZQogICAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuCgoKICAgIHZhciBpc0NvbmN1cnJlbnRNb2RlID0gKGludGVybmFsSW5zdGFuY2VIYW5kbGUubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlOwogICAgcmV0dXJuIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7CiAgfQogIGZ1bmN0aW9uIGh5ZHJhdGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlLCB0ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBzaG91bGRXYXJuRGV2KSB7CiAgICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpOyAvLyBUT0RPOiBUZW1wb3JhcnkgaGFjayB0byBjaGVjayBpZiB3ZSdyZSBpbiBhIGNvbmN1cnJlbnQgcm9vdC4gV2UgY2FuIGRlbGV0ZQogICAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuCgogICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZS5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7CiAgICByZXR1cm4gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0SW5zdGFuY2UsIHRleHQpOwogIH0KICBmdW5jdGlvbiBoeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7CiAgICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBzdXNwZW5zZUluc3RhbmNlKTsKICB9CiAgZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7CiAgICB2YXIgbm9kZSA9IHN1c3BlbnNlSW5zdGFuY2UubmV4dFNpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuCiAgICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvdwogICAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuCgogICAgdmFyIGRlcHRoID0gMDsKCiAgICB3aGlsZSAobm9kZSkgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgdmFyIGRhdGEgPSBub2RlLmRhdGE7CgogICAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkgewogICAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobm9kZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZXB0aC0tOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkgewogICAgICAgICAgZGVwdGgrKzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgfSAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuCgoKICAgIHJldHVybiBudWxsOwogIH0gLy8gUmV0dXJucyB0aGUgU3VzcGVuc2VJbnN0YW5jZSBpZiB0aGlzIG5vZGUgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYQogIC8vIFN1c3BlbnNlSW5zdGFuY2UuIEkuZS4gaWYgaXRzIHByZXZpb3VzIHNpYmxpbmcgaXMgYSBDb21tZW50IHdpdGgKICAvLyBTVVNQRU5TRV94X1NUQVJUX0RBVEEuIE90aGVyd2lzZSwgbnVsbC4KCiAgZnVuY3Rpb24gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXRJbnN0YW5jZSkgewogICAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuCiAgICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvdwogICAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuCgogICAgdmFyIGRlcHRoID0gMDsKCiAgICB3aGlsZSAobm9kZSkgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgdmFyIGRhdGEgPSBub2RlLmRhdGE7CgogICAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBKSB7CiAgICAgICAgICBpZiAoZGVwdGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZXB0aC0tOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHsKICAgICAgICAgIGRlcHRoKys7CiAgICAgICAgfQogICAgICB9CgogICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQogIGZ1bmN0aW9uIGNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyKGNvbnRhaW5lcikgewogICAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLgogICAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpOwogIH0KICBmdW5jdGlvbiBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkgewogICAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLgogICAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTsKICB9CiAgZnVuY3Rpb24gc2hvdWxkRGVsZXRlVW5oeWRyYXRlZFRhaWxJbnN0YW5jZXMocGFyZW50VHlwZSkgewogICAgcmV0dXJuIHBhcmVudFR5cGUgIT09ICdoZWFkJyAmJiBwYXJlbnRUeXBlICE9PSAnYm9keSc7CiAgfQogIGZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHsKICAgIHZhciBzaG91bGRXYXJuRGV2ID0gdHJ1ZTsKICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTsKICB9CiAgZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkgewogICAgaWYgKHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7CiAgICAgIHZhciBzaG91bGRXYXJuRGV2ID0gdHJ1ZTsKICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KHRleHRJbnN0YW5jZS5ub2RlVmFsdWUsIHRleHQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpOwogICAgfQogIH0KICBmdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5Db250YWluZXIocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSkgewogICAgewogICAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkgewogICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7CiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHsKICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKSB7CiAgICB7CiAgICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLgogICAgICB2YXIgcGFyZW50Tm9kZSA9IHBhcmVudEluc3RhbmNlLnBhcmVudE5vZGU7CgogICAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgewogICAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudE5vZGUsIGluc3RhbmNlKTsKICAgICAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7CiAgICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGluc3RhbmNlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UsIGlzQ29uY3VycmVudE1vZGUpIHsKICAgIHsKICAgICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHsKICAgICAgICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkgewogICAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpOwogICAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHsKICAgICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUsIHByb3BzKSB7CiAgICB7CiAgICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpOwogICAgfQogIH0KICBmdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHRleHQpIHsKICAgIHsKICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudENvbnRhaW5lciwgdGV4dCk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCB0eXBlLCBwcm9wcykgewogICAgewogICAgICAvLyAkRmxvd0ZpeE1lOiBPbmx5IEVsZW1lbnQgb3IgRG9jdW1lbnQgY2FuIGJlIHBhcmVudCBub2Rlcy4KICAgICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlOwogICAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHR5cGUpOwogICAgfQogIH0KICBmdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHRleHQpIHsKICAgIHsKICAgICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuCiAgICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTsKICAgICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnROb2RlLCB0ZXh0KTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHR5cGUsIHByb3BzLCBpc0NvbmN1cnJlbnRNb2RlKSB7CiAgICB7CiAgICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7CiAgICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudEluc3RhbmNlLCB0eXBlKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHsKICAgIHsKICAgICAgaWYgKGlzQ29uY3VycmVudE1vZGUgfHwgcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkckMV0gIT09IHRydWUpIHsKICAgICAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50SW5zdGFuY2UsIHRleHQpOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHBhcmVudENvbnRhaW5lcikgewogICAgewogICAgICAvLyBUT0RPOiBUaGlzIGdldHMgbG9nZ2VkIGJ5IG9uUmVjb3ZlcmFibGVFcnJvciwgdG9vLCBzbyB3ZSBzaG91bGQgYmUKICAgICAgLy8gYWJsZSB0byByZW1vdmUgaXQuCiAgICAgIGVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaHlkcmF0aW9uLiBUaGUgc2VydmVyIEhUTUwgd2FzIHJlcGxhY2VkIHdpdGggY2xpZW50IGNvbnRlbnQgaW4gPCVzPi4nLCBwYXJlbnRDb250YWluZXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHByZXBhcmVQb3J0YWxNb3VudChwb3J0YWxJbnN0YW5jZSkgewogICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocG9ydGFsSW5zdGFuY2UpOwogIH0KCiAgdmFyIHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpOwogIHZhciBpbnRlcm5hbEluc3RhbmNlS2V5ID0gJ19fcmVhY3RGaWJlciQnICsgcmFuZG9tS2V5OwogIHZhciBpbnRlcm5hbFByb3BzS2V5ID0gJ19fcmVhY3RQcm9wcyQnICsgcmFuZG9tS2V5OwogIHZhciBpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5ID0gJ19fcmVhY3RDb250YWluZXIkJyArIHJhbmRvbUtleTsKICB2YXIgaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5ID0gJ19fcmVhY3RFdmVudHMkJyArIHJhbmRvbUtleTsKICB2YXIgaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXkgPSAnX19yZWFjdExpc3RlbmVycyQnICsgcmFuZG9tS2V5OwogIHZhciBpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleSA9ICdfX3JlYWN0SGFuZGxlcyQnICsgcmFuZG9tS2V5OwogIGZ1bmN0aW9uIGRldGFjaERlbGV0ZWRJbnN0YW5jZShub2RlKSB7CiAgICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uIGhvc3QgY29tcG9uZW50cy4gSSBkb24ndCB0aGluayBhbGwgb2YKICAgIC8vIHRoZXNlIGZpZWxkcyBhcmUgcmVsZXZhbnQuCiAgICBkZWxldGUgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTsKICAgIGRlbGV0ZSBub2RlW2ludGVybmFsUHJvcHNLZXldOwogICAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTsKICAgIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5XTsKICAgIGRlbGV0ZSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVzU2V0S2V5XTsKICB9CiAgZnVuY3Rpb24gcHJlY2FjaGVGaWJlck5vZGUoaG9zdEluc3QsIG5vZGUpIHsKICAgIG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0gPSBob3N0SW5zdDsKICB9CiAgZnVuY3Rpb24gbWFya0NvbnRhaW5lckFzUm9vdChob3N0Um9vdCwgbm9kZSkgewogICAgbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSA9IGhvc3RSb290OwogIH0KICBmdW5jdGlvbiB1bm1hcmtDb250YWluZXJBc1Jvb3Qobm9kZSkgewogICAgbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSA9IG51bGw7CiAgfQogIGZ1bmN0aW9uIGlzQ29udGFpbmVyTWFya2VkQXNSb290KG5vZGUpIHsKICAgIHJldHVybiAhIW5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07CiAgfSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci4KICAvLyBJZiB0aGUgdGFyZ2V0IG5vZGUgaXMgcGFydCBvZiBhIGh5ZHJhdGVkIG9yIG5vdCB5ZXQgcmVuZGVyZWQgc3VidHJlZSwgdGhlbgogIC8vIHRoaXMgbWF5IGFsc28gcmV0dXJuIGEgU3VzcGVuc2VDb21wb25lbnQgb3IgSG9zdFJvb3QgdG8gaW5kaWNhdGUgdGhhdC4KICAvLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3UKICAvLyBwYXNzIHRoZSBDb250YWluZXIgbm9kZSBhcyB0aGUgdGFyZ2V0Tm9kZSwgeW91IHdpbGwgbm90IGFjdHVhbGx5IGdldCB0aGUKICAvLyBIb3N0Um9vdCBiYWNrLiBUbyBnZXQgdG8gdGhlIEhvc3RSb290LCB5b3UgbmVlZCB0byBwYXNzIGEgY2hpbGQgb2YgaXQuCiAgLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLgoKICBmdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7CiAgICB2YXIgdGFyZ2V0SW5zdCA9IHRhcmdldE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07CgogICAgaWYgKHRhcmdldEluc3QpIHsKICAgICAgLy8gRG9uJ3QgcmV0dXJuIEhvc3RSb290IG9yIFN1c3BlbnNlQ29tcG9uZW50IGhlcmUuCiAgICAgIHJldHVybiB0YXJnZXRJbnN0OwogICAgfSAvLyBJZiB0aGUgZGlyZWN0IGV2ZW50IHRhcmdldCBpc24ndCBhIFJlYWN0IG93bmVkIERPTSBub2RlLCB3ZSBuZWVkIHRvIGxvb2sKICAgIC8vIHRvIHNlZSBpZiBvbmUgb2YgaXRzIHBhcmVudHMgaXMgYSBSZWFjdCBvd25lZCBET00gbm9kZS4KCgogICAgdmFyIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7CgogICAgd2hpbGUgKHBhcmVudE5vZGUpIHsKICAgICAgLy8gV2UnbGwgY2hlY2sgaWYgdGhpcyBpcyBhIGNvbnRhaW5lciByb290IHRoYXQgY291bGQgaW5jbHVkZQogICAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZQogICAgICAvLyBpZiB3ZSdyZSBhIGNoaWxkIG9mIGEgZGVoeWRyYXRlZCBjb250YWluZXIsIHdlIG5lZWQgdG8gZmlyc3QKICAgICAgLy8gZmluZCB0aGF0IGlubmVyIGNvbnRhaW5lciBiZWZvcmUgbW92aW5nIG9uIHRvIGZpbmRpbmcgdGhlIHBhcmVudAogICAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlCiAgICAgIC8vIGl0c2VsZiBiZWNhdXNlIHRoZSBmaWJlcnMgYXJlIGNvbmNlcHR1YWxseSBiZXR3ZWVuIHRoZSBjb250YWluZXIKICAgICAgLy8gbm9kZSBhbmQgdGhlIGZpcnN0IGNoaWxkLiBJdCBpc24ndCBzdXJyb3VuZGluZyB0aGUgY29udGFpbmVyIG5vZGUuCiAgICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLgogICAgICB0YXJnZXRJbnN0ID0gcGFyZW50Tm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSB8fCBwYXJlbnROb2RlW2ludGVybmFsSW5zdGFuY2VLZXldOwoKICAgICAgaWYgKHRhcmdldEluc3QpIHsKICAgICAgICAvLyBTaW5jZSB0aGlzIHdhc24ndCB0aGUgZGlyZWN0IHRhcmdldCBvZiB0aGUgZXZlbnQsIHdlIG1pZ2h0IGhhdmUKICAgICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZAogICAgICAgIC8vIGFsc28gaGF2ZSBiZWVuIG5vbi1SZWFjdCBub2Rlcy4gV2UgbmVlZCB0byBhbnN3ZXIgd2hpY2ggb25lLgogICAgICAgIC8vIElmIHdlIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGhhdmUgYW55IGNoaWxkcmVuLCB0aGVuIHRoZXJlIGNhbid0IGJlCiAgICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0CiAgICAgICAgLy8gYmFpbG91dC4gTW9zdCBvZiB0aGUgdGltZSwgd2hlbiBwZW9wbGUgYWRkIG5vbi1SZWFjdCBjaGlsZHJlbiB0bwogICAgICAgIC8vIHRoZSB0cmVlLCBpdCBpcyB1c2luZyBhIHJlZiB0byBhIGNoaWxkLWxlc3MgRE9NIG5vZGUuCiAgICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdAogICAgICAgIC8vIGhhcyBldmVyIGdvbmUgZnJvbSBoYXZpbmcgY2hpbGRyZW4gdG8gZGVsZXRpbmcgdGhlbSBvciB2aWNlIHZlcnNhCiAgICAgICAgLy8gaXQgd291bGQgaGF2ZSBkZWxldGVkIHRoZSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IG5lc3RlZCBpbnNpZGUgYWxyZWFkeS4KICAgICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodAogICAgICAgIC8vIGhhdmUgb25lIG9uIHRoZSBhbHRlcm5hdGUgc28gd2UgbmVlZCB0byBjaGVjayBpbiBjYXNlIHRoaXMgd2FzIGEKICAgICAgICAvLyByb290LgogICAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTsKCiAgICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkgewogICAgICAgICAgLy8gTmV4dCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIG5vZGUgdGhhdCBza2lwcGVkIHBhc3QgaXMKICAgICAgICAgIC8vIG5lc3RlZCB3aXRoaW4gYSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFuZCBpZiBzbywgd2hpY2ggb25lLgogICAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpOwoKICAgICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3VzcGVuc2UgaW5zdGFuY2UuIFRoYXQgbWVhbnMgdGhhdCB3ZSBoYXZlbid0CiAgICAgICAgICAgIC8vIGh5ZHJhdGVkIGl0IHlldC4gRXZlbiB0aG91Z2ggd2UgbGVhdmUgdGhlIGNvbW1lbnRzIGluIHRoZQogICAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTQogICAgICAgICAgICAvLyB0aGF0IGNvdWxkIGFscmVhZHkgYmUgaHlkcmF0ZWQsIHdlIHdvdWxkbid0IGhhdmUgZm91bmQgdGhlbQogICAgICAgICAgICAvLyB0aHJvdWdoIHRoaXMgcGFzcyBzaW5jZSBpZiB0aGUgdGFyZ2V0IGlzIGh5ZHJhdGVkIGl0IHdvdWxkCiAgICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuCiAgICAgICAgICAgIC8vIExldCdzIGdldCB0aGUgZmliZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBTdXNwZW5zZUNvbXBvbmVudAogICAgICAgICAgICAvLyBhcyB0aGUgZGVlcGVzdCBpbnN0YW5jZS4KICAgICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07CgogICAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFN1c3BlbnNlSW5zdDsKICAgICAgICAgICAgfSAvLyBJZiB3ZSBkb24ndCBmaW5kIGEgRmliZXIgb24gdGhlIGNvbW1lbnQsIGl0IG1pZ2h0IGJlIGJlY2F1c2UKICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGEKICAgICAgICAgICAgLy8gcGFyZW50IGJvdW5kYXJ5IHRoYXQgaGFzbid0IGFib3ZlIHRoaXMgb25lIHNvIHdlIG5lZWQgdG8gZmluZAogICAgICAgICAgICAvLyB0aGUgb3V0ZXIgbW9zdCB0aGF0IGlzIGtub3duLgoKCiAgICAgICAgICAgIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpOyAvLyBJZiB3ZSBkb24ndCBmaW5kIG9uZSwgdGhlbiB0aGF0IHNob3VsZCBtZWFuIHRoYXQgdGhlIHBhcmVudAogICAgICAgICAgICAvLyBob3N0IGNvbXBvbmVudCBhbHNvIGhhc24ndCBoeWRyYXRlZCB5ZXQuIFdlIGNhbiByZXR1cm4gaXQKICAgICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLgogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRhcmdldEluc3Q7CiAgICAgIH0KCiAgICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlOwogICAgICBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5wYXJlbnROb2RlOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KICAvKioKICAgKiBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIFJlYWN0RE9NQ29tcG9uZW50IG9yIFJlYWN0RE9NVGV4dENvbXBvbmVudAogICAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC4KICAgKi8KCiAgZnVuY3Rpb24gZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKSB7CiAgICB2YXIgaW5zdCA9IG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0gfHwgbm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XTsKCiAgICBpZiAoaW5zdCkgewogICAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHsKICAgICAgICByZXR1cm4gaW5zdDsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KICAvKioKICAgKiBHaXZlbiBhIFJlYWN0RE9NQ29tcG9uZW50IG9yIFJlYWN0RE9NVGV4dENvbXBvbmVudCwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCiAgICogRE9NIG5vZGUuCiAgICovCgogIGZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkgewogICAgaWYgKGluc3QudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IGluc3QudGFnID09PSBIb3N0VGV4dCkgewogICAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmUKICAgICAgLy8gYSBob3N0IGNvbXBvbmVudCBvciBob3N0IHRleHQuCiAgICAgIHJldHVybiBpbnN0LnN0YXRlTm9kZTsKICAgIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0CiAgICAvLyBpbnZhcmlhbnQgZm9yIGEgbWlzc2luZyBwYXJlbnQsIHdoaWNoIGlzIHN1cGVyIGNvbmZ1c2luZy4KCgogICAgdGhyb3cgbmV3IEVycm9yKCdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpOwogIH0KICBmdW5jdGlvbiBnZXRGaWJlckN1cnJlbnRQcm9wc0Zyb21Ob2RlKG5vZGUpIHsKICAgIHJldHVybiBub2RlW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7CiAgfQogIGZ1bmN0aW9uIHVwZGF0ZUZpYmVyUHJvcHMobm9kZSwgcHJvcHMpIHsKICAgIG5vZGVbaW50ZXJuYWxQcm9wc0tleV0gPSBwcm9wczsKICB9CiAgZnVuY3Rpb24gZ2V0RXZlbnRMaXN0ZW5lclNldChub2RlKSB7CiAgICB2YXIgZWxlbWVudExpc3RlbmVyU2V0ID0gbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldOwoKICAgIGlmIChlbGVtZW50TGlzdGVuZXJTZXQgPT09IHVuZGVmaW5lZCkgewogICAgICBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBuZXcgU2V0KCk7CiAgICB9CgogICAgcmV0dXJuIGVsZW1lbnRMaXN0ZW5lclNldDsKICB9CgogIHZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTsKICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTsKCiAgZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkgewogICAgewogICAgICBpZiAoZWxlbWVudCkgewogICAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyOwogICAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7CiAgICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7CiAgICB7CiAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC4KICAgICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7CgogICAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7CiAgICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHsKICAgICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0bwogICAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LgogICAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LgoKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZQogICAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuCiAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2RlcwogICAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpOwogICAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nOwogICAgICAgICAgICAgIHRocm93IGVycjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7CiAgICAgICAgICB9IGNhdGNoIChleCkgewogICAgICAgICAgICBlcnJvciQxID0gZXg7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7CiAgICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpOwoKICAgICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7CgogICAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHsKICAgICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlCiAgICAgICAgICAgIC8vIHNhbWUgZXJyb3IuCiAgICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTsKICAgICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7CgogICAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7CgogICAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZhciB2YWx1ZVN0YWNrID0gW107CiAgdmFyIGZpYmVyU3RhY2s7CgogIHsKICAgIGZpYmVyU3RhY2sgPSBbXTsKICB9CgogIHZhciBpbmRleCA9IC0xOwoKICBmdW5jdGlvbiBjcmVhdGVDdXJzb3IoZGVmYXVsdFZhbHVlKSB7CiAgICByZXR1cm4gewogICAgICBjdXJyZW50OiBkZWZhdWx0VmFsdWUKICAgIH07CiAgfQoKICBmdW5jdGlvbiBwb3AoY3Vyc29yLCBmaWJlcikgewogICAgaWYgKGluZGV4IDwgMCkgewogICAgICB7CiAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcG9wLicpOwogICAgICB9CgogICAgICByZXR1cm47CiAgICB9CgogICAgewogICAgICBpZiAoZmliZXIgIT09IGZpYmVyU3RhY2tbaW5kZXhdKSB7CiAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgRmliZXIgcG9wcGVkLicpOwogICAgICB9CiAgICB9CgogICAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZVN0YWNrW2luZGV4XTsKICAgIHZhbHVlU3RhY2tbaW5kZXhdID0gbnVsbDsKCiAgICB7CiAgICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gbnVsbDsKICAgIH0KCiAgICBpbmRleC0tOwogIH0KCiAgZnVuY3Rpb24gcHVzaChjdXJzb3IsIHZhbHVlLCBmaWJlcikgewogICAgaW5kZXgrKzsKICAgIHZhbHVlU3RhY2tbaW5kZXhdID0gY3Vyc29yLmN1cnJlbnQ7CgogICAgewogICAgICBmaWJlclN0YWNrW2luZGV4XSA9IGZpYmVyOwogICAgfQoKICAgIGN1cnNvci5jdXJyZW50ID0gdmFsdWU7CiAgfQoKICB2YXIgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0OwoKICB7CiAgICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQgPSB7fTsKICB9CgogIHZhciBlbXB0eUNvbnRleHRPYmplY3QgPSB7fTsKCiAgewogICAgT2JqZWN0LmZyZWV6ZShlbXB0eUNvbnRleHRPYmplY3QpOwogIH0gLy8gQSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgbWVyZ2VkIGNvbnRleHQgb2JqZWN0IG9uIHRoZSBzdGFjay4KCgogIHZhciBjb250ZXh0U3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZW1wdHlDb250ZXh0T2JqZWN0KTsgLy8gQSBjdXJzb3IgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29udGV4dCBoYXMgY2hhbmdlZC4KCiAgdmFyIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZmFsc2UpOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBjb250ZXh0IG9iamVjdCB0aGF0IHdhcyBvbiB0aGUgc3RhY2suCiAgLy8gV2UgdXNlIHRoaXMgdG8gZ2V0IGFjY2VzcyB0byB0aGUgcGFyZW50IGNvbnRleHQgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5CiAgLy8gcHVzaGVkIHRoZSBuZXh0IGNvbnRleHQgcHJvdmlkZXIsIGFuZCBub3cgbmVlZCB0byBtZXJnZSB0aGVpciBjb250ZXh0cy4KCiAgdmFyIHByZXZpb3VzQ29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDsKCiAgZnVuY3Rpb24gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIGRpZFB1c2hPd25Db250ZXh0SWZQcm92aWRlcikgewogICAgewogICAgICBpZiAoZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyICYmIGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHsKICAgICAgICAvLyBJZiB0aGUgZmliZXIgaXMgYSBjb250ZXh0IHByb3ZpZGVyIGl0c2VsZiwgd2hlbiB3ZSByZWFkIGl0cyBjb250ZXh0CiAgICAgICAgLy8gd2UgbWF5IGhhdmUgYWxyZWFkeSBwdXNoZWQgaXRzIG93biBjaGlsZCBjb250ZXh0IG9uIHRoZSBzdGFjay4gQSBjb250ZXh0CiAgICAgICAgLy8gcHJvdmlkZXIgc2hvdWxkIG5vdCAic2VlIiBpdHMgb3duIGNoaWxkIGNvbnRleHQuIFRoZXJlZm9yZSB3ZSByZWFkIHRoZQogICAgICAgIC8vIHByZXZpb3VzIChwYXJlbnQpIGNvbnRleHQgaW5zdGVhZCBmb3IgYSBjb250ZXh0IHByb3ZpZGVyLgogICAgICAgIHJldHVybiBwcmV2aW91c0NvbnRleHQ7CiAgICAgIH0KCiAgICAgIHJldHVybiBjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBtYXNrZWRDb250ZXh0KSB7CiAgICB7CiAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsKICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9IHVubWFza2VkQ29udGV4dDsKICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQgPSBtYXNrZWRDb250ZXh0OwogICAgfQogIH0KCiAgZnVuY3Rpb24gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSB7CiAgICB7CiAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTsKICAgICAgdmFyIGNvbnRleHRUeXBlcyA9IHR5cGUuY29udGV4dFR5cGVzOwoKICAgICAgaWYgKCFjb250ZXh0VHlwZXMpIHsKICAgICAgICByZXR1cm4gZW1wdHlDb250ZXh0T2JqZWN0OwogICAgICB9IC8vIEF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIHVubWFza2VkIGNvbnRleHQgaGFzIGNoYW5nZWQuCiAgICAgIC8vIEZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBjYWxscyB0byBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLgogICAgICAvLyBUaGlzIG1heSB0cmlnZ2VyIGluZmluaXRlIGxvb3BzIGlmIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgY2FsbHMgc2V0U3RhdGUuCgoKICAgICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOwoKICAgICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPT09IHVubWFza2VkQ29udGV4dCkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDsKICAgICAgfQoKICAgICAgdmFyIGNvbnRleHQgPSB7fTsKCiAgICAgIGZvciAodmFyIGtleSBpbiBjb250ZXh0VHlwZXMpIHsKICAgICAgICBjb250ZXh0W2tleV0gPSB1bm1hc2tlZENvbnRleHRba2V5XTsKICAgICAgfQoKICAgICAgewogICAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ1Vua25vd24nOwogICAgICAgIGNoZWNrUHJvcFR5cGVzKGNvbnRleHRUeXBlcywgY29udGV4dCwgJ2NvbnRleHQnLCBuYW1lKTsKICAgICAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuCiAgICAgIC8vIENvbnRleHQgaXMgY3JlYXRlZCBiZWZvcmUgdGhlIGNsYXNzIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgc28gY2hlY2sgZm9yIGluc3RhbmNlLgoKCiAgICAgIGlmIChpbnN0YW5jZSkgewogICAgICAgIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBjb250ZXh0KTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYXNDb250ZXh0Q2hhbmdlZCgpIHsKICAgIHsKICAgICAgcmV0dXJuIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKHR5cGUpIHsKICAgIHsKICAgICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlczsKICAgICAgcmV0dXJuIGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwb3BDb250ZXh0KGZpYmVyKSB7CiAgICB7CiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7CiAgICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlcikgewogICAgewogICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZmliZXIpOwogICAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyLCBjb250ZXh0LCBkaWRDaGFuZ2UpIHsKICAgIHsKICAgICAgaWYgKGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50ICE9PSBlbXB0eUNvbnRleHRPYmplY3QpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29udGV4dCBmb3VuZCBvbiBzdGFjay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICB9CgogICAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpOwogICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgZmliZXIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgdHlwZSwgcGFyZW50Q29udGV4dCkgewogICAgewogICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7CiAgICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7IC8vIFRPRE8gKGJ2YXVnaG4pIFJlcGxhY2UgdGhpcyBiZWhhdmlvciB3aXRoIGFuIGludmFyaWFudCgpIGluIHRoZSBmdXR1cmUuCiAgICAgIC8vIEl0IGhhcyBvbmx5IGJlZW4gYWRkZWQgaW4gRmliZXIgdG8gbWF0Y2ggdGhlICh1bmludGVudGlvbmFsKSBiZWhhdmlvciBpbiBTdGFjay4KCiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgewogICAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7CgogICAgICAgICAgaWYgKCF3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHRbY29tcG9uZW50TmFtZV0pIHsKICAgICAgICAgICAgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0W2NvbXBvbmVudE5hbWVdID0gdHJ1ZTsKCiAgICAgICAgICAgIGVycm9yKCclcy5jaGlsZENvbnRleHRUeXBlcyBpcyBzcGVjaWZpZWQgYnV0IHRoZXJlIGlzIG5vIGdldENoaWxkQ29udGV4dCgpIG1ldGhvZCAnICsgJ29uIHRoZSBpbnN0YW5jZS4gWW91IGNhbiBlaXRoZXIgZGVmaW5lIGdldENoaWxkQ29udGV4dCgpIG9uICVzIG9yIHJlbW92ZSAnICsgJ2NoaWxkQ29udGV4dFR5cGVzIGZyb20gaXQuJywgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcGFyZW50Q29udGV4dDsKICAgICAgfQoKICAgICAgdmFyIGNoaWxkQ29udGV4dCA9IGluc3RhbmNlLmdldENoaWxkQ29udGV4dCgpOwoKICAgICAgZm9yICh2YXIgY29udGV4dEtleSBpbiBjaGlsZENvbnRleHQpIHsKICAgICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bicpICsgIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFwiIiArIGNvbnRleHRLZXkgKyAiXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuIik7CiAgICAgICAgfQogICAgICB9CgogICAgICB7CiAgICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnVW5rbm93bic7CiAgICAgICAgY2hlY2tQcm9wVHlwZXMoY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkIGNvbnRleHQnLCBuYW1lKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGFzc2lnbih7fSwgcGFyZW50Q29udGV4dCwgY2hpbGRDb250ZXh0KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHsKICAgIHsKICAgICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOyAvLyBXZSBwdXNoIHRoZSBjb250ZXh0IGFzIGVhcmx5IGFzIHBvc3NpYmxlIHRvIGVuc3VyZSBzdGFjayBpbnRlZ3JpdHkuCiAgICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LAogICAgICAvLyBhbmQgcmVwbGFjZSBpdCBvbiB0aGUgc3RhY2sgbGF0ZXIgd2hlbiBpbnZhbGlkYXRpbmcgdGhlIGNvbnRleHQuCgogICAgICB2YXIgbWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCB8fCBlbXB0eUNvbnRleHRPYmplY3Q7IC8vIFJlbWVtYmVyIHRoZSBwYXJlbnQgY29udGV4dCBzbyB3ZSBjYW4gbWVyZ2Ugd2l0aCBpdCBsYXRlci4KICAgICAgLy8gSW5oZXJpdCB0aGUgcGFyZW50J3MgZGlkLXBlcmZvcm0td29yayB2YWx1ZSB0byBhdm9pZCBpbmFkdmVydGVudGx5IGJsb2NraW5nIHVwZGF0ZXMuCgogICAgICBwcmV2aW91c0NvbnRleHQgPSBjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudDsKICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7CiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgdHlwZSwgZGlkQ2hhbmdlKSB7CiAgICB7CiAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsKCiAgICAgIGlmICghaW5zdGFuY2UpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYW4gaW5zdGFuY2UgYnkgdGhpcyBwb2ludC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICB9CgogICAgICBpZiAoZGlkQ2hhbmdlKSB7CiAgICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC4KICAgICAgICAvLyBTa2lwIHRoaXMgaWYgd2UncmUgbm90IHVwZGF0aW5nIGR1ZSB0byBzQ1UuCiAgICAgICAgLy8gVGhpcyBhdm9pZHMgdW5uZWNlc3NhcmlseSByZWNvbXB1dGluZyBtZW1vaXplZCB2YWx1ZXMuCiAgICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpOwogICAgICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0ID0gbWVyZ2VkQ29udGV4dDsgLy8gUmVwbGFjZSB0aGUgb2xkIChvciBlbXB0eSkgY29udGV4dCB3aXRoIHRoZSBuZXcgb25lLgogICAgICAgIC8vIEl0IGlzIGltcG9ydGFudCB0byB1bndpbmQgdGhlIGNvbnRleHQgaW4gdGhlIHJldmVyc2Ugb3JkZXIuCgogICAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC4KCiAgICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTsKICAgICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpOwogICAgICB9IGVsc2UgewogICAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIHdvcmtJblByb2dyZXNzKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZEN1cnJlbnRVbm1hc2tlZENvbnRleHQoZmliZXIpIHsKICAgIHsKICAgICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0CiAgICAgIC8vIG1ha2VzIHNlbnNlIGVsc2V3aGVyZQogICAgICBpZiAoIWlzRmliZXJNb3VudGVkKGZpYmVyKSB8fCBmaWJlci50YWcgIT09IENsYXNzQ29tcG9uZW50KSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBzdWJ0cmVlIHBhcmVudCB0byBiZSBhIG1vdW50ZWQgY2xhc3MgY29tcG9uZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7CiAgICAgIH0KCiAgICAgIHZhciBub2RlID0gZmliZXI7CgogICAgICBkbyB7CiAgICAgICAgc3dpdGNoIChub2RlLnRhZykgewogICAgICAgICAgY2FzZSBIb3N0Um9vdDoKICAgICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLmNvbnRleHQ7CgogICAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDoKICAgICAgICAgICAgewogICAgICAgICAgICAgIHZhciBDb21wb25lbnQgPSBub2RlLnR5cGU7CgogICAgICAgICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuOwogICAgICB9IHdoaWxlIChub2RlICE9PSBudWxsKTsKCiAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgdW5leHBlY3RlZCBkZXRhY2hlZCBzdWJ0cmVlIHBhcmVudC4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgfQogIH0KCiAgdmFyIExlZ2FjeVJvb3QgPSAwOwogIHZhciBDb25jdXJyZW50Um9vdCA9IDE7CgogIHZhciBzeW5jUXVldWUgPSBudWxsOwogIHZhciBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSBmYWxzZTsKICB2YXIgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3luY0NhbGxiYWNrKGNhbGxiYWNrKSB7CiAgICAvLyBQdXNoIHRoaXMgY2FsbGJhY2sgaW50byBhbiBpbnRlcm5hbCBxdWV1ZS4gV2UnbGwgZmx1c2ggdGhlc2UgZWl0aGVyIGluCiAgICAvLyB0aGUgbmV4dCB0aWNrLCBvciBlYXJsaWVyIGlmIHNvbWV0aGluZyBjYWxscyBgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZWAuCiAgICBpZiAoc3luY1F1ZXVlID09PSBudWxsKSB7CiAgICAgIHN5bmNRdWV1ZSA9IFtjYWxsYmFja107CiAgICB9IGVsc2UgewogICAgICAvLyBQdXNoIG9udG8gZXhpc3RpbmcgcXVldWUuIERvbid0IG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFjayBiZWNhdXNlCiAgICAgIC8vIHdlIGFscmVhZHkgc2NoZWR1bGVkIG9uZSB3aGVuIHdlIGNyZWF0ZWQgdGhlIHF1ZXVlLgogICAgICBzeW5jUXVldWUucHVzaChjYWxsYmFjayk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKGNhbGxiYWNrKSB7CiAgICBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSB0cnVlOwogICAgc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spOwogIH0KICBmdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCkgewogICAgLy8gT25seSBmbHVzaGVzIHRoZSBxdWV1ZSBpZiB0aGVyZSdzIGEgbGVnYWN5IHN5bmMgY2FsbGJhY2sgc2NoZWR1bGVkLgogICAgLy8gVE9ETzogVGhlcmUncyBvbmx5IGEgc2luZ2xlIHR5cGUgb2YgY2FsbGJhY2s6IHBlcmZvcm1TeW5jT25Xb3JrT25Sb290LiBTbwogICAgLy8gaXQgbWlnaHQgbWFrZSBtb3JlIHNlbnNlIGZvciB0aGUgcXVldWUgdG8gYmUgYSBsaXN0IG9mIHJvb3RzIGluc3RlYWQgb2YgYQogICAgLy8gbGlzdCBvZiBnZW5lcmljIGNhbGxiYWNrcy4gVGhlbiB3ZSBjYW4gaGF2ZSB0d286IG9uZSBmb3IgbGVnYWN5IHJvb3RzLCBvbmUKICAgIC8vIGZvciBjb25jdXJyZW50IHJvb3RzLiBBbmQgdGhpcyBtZXRob2Qgd291bGQgb25seSBmbHVzaCB0aGUgbGVnYWN5IG9uZXMuCiAgICBpZiAoaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzKSB7CiAgICAgIGZsdXNoU3luY0NhbGxiYWNrcygpOwogICAgfQogIH0KICBmdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja3MoKSB7CiAgICBpZiAoIWlzRmx1c2hpbmdTeW5jUXVldWUgJiYgc3luY1F1ZXVlICE9PSBudWxsKSB7CiAgICAgIC8vIFByZXZlbnQgcmUtZW50cmFuY2UuCiAgICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSB0cnVlOwogICAgICB2YXIgaSA9IDA7CiAgICAgIHZhciBwcmV2aW91c1VwZGF0ZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7CgogICAgICB0cnkgewogICAgICAgIHZhciBpc1N5bmMgPSB0cnVlOwogICAgICAgIHZhciBxdWV1ZSA9IHN5bmNRdWV1ZTsgLy8gVE9ETzogSXMgdGhpcyBuZWNlc3NhcnkgYW55bW9yZT8gVGhlIG9ubHkgdXNlciBjb2RlIHRoYXQgcnVucyBpbiB0aGlzCiAgICAgICAgLy8gcXVldWUgaXMgaW4gdGhlIHJlbmRlciBvciBjb21taXQgcGhhc2VzLgoKICAgICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTsKCiAgICAgICAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07CgogICAgICAgICAgZG8gewogICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKGlzU3luYyk7CiAgICAgICAgICB9IHdoaWxlIChjYWxsYmFjayAhPT0gbnVsbCk7CiAgICAgICAgfQoKICAgICAgICBzeW5jUXVldWUgPSBudWxsOwogICAgICAgIGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcyA9IGZhbHNlOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS4KICAgICAgICBpZiAoc3luY1F1ZXVlICE9PSBudWxsKSB7CiAgICAgICAgICBzeW5jUXVldWUgPSBzeW5jUXVldWUuc2xpY2UoaSArIDEpOwogICAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2sKCgogICAgICAgIHNjaGVkdWxlQ2FsbGJhY2soSW1tZWRpYXRlUHJpb3JpdHksIGZsdXNoU3luY0NhbGxiYWNrcyk7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzVXBkYXRlUHJpb3JpdHkpOwogICAgICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8gVE9ETzogVXNlIHRoZSB1bmlmaWVkIGZpYmVyIHN0YWNrIG1vZHVsZSBpbnN0ZWFkIG9mIHRoaXMgbG9jYWwgb25lPwogIC8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGl0IHlldCB0byBkZXJpc2sgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24sIGJlY2F1c2UKICAvLyB0aGUgd2F5IHdlIHB1c2gvcG9wIHRoZXNlIHZhbHVlcyBpcyBhIGJpdCB1bnVzdWFsLiBJZiB0aGVyZSdzIGEgbWlzdGFrZSwgSSdkCiAgLy8gcmF0aGVyIHRoZSBpZHMgYmUgd3JvbmcgdGhhbiBjcmFzaCB0aGUgd2hvbGUgcmVjb25jaWxlci4KICB2YXIgZm9ya1N0YWNrID0gW107CiAgdmFyIGZvcmtTdGFja0luZGV4ID0gMDsKICB2YXIgdHJlZUZvcmtQcm92aWRlciA9IG51bGw7CiAgdmFyIHRyZWVGb3JrQ291bnQgPSAwOwogIHZhciBpZFN0YWNrID0gW107CiAgdmFyIGlkU3RhY2tJbmRleCA9IDA7CiAgdmFyIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBudWxsOwogIHZhciB0cmVlQ29udGV4dElkID0gMTsKICB2YXIgdHJlZUNvbnRleHRPdmVyZmxvdyA9ICcnOwogIGZ1bmN0aW9uIGlzRm9ya2VkQ2hpbGQod29ya0luUHJvZ3Jlc3MpIHsKICAgIHdhcm5JZk5vdEh5ZHJhdGluZygpOwogICAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmtlZCkgIT09IE5vRmxhZ3M7CiAgfQogIGZ1bmN0aW9uIGdldEZvcmtzQXRMZXZlbCh3b3JrSW5Qcm9ncmVzcykgewogICAgd2FybklmTm90SHlkcmF0aW5nKCk7CiAgICByZXR1cm4gdHJlZUZvcmtDb3VudDsKICB9CiAgZnVuY3Rpb24gZ2V0VHJlZUlkKCkgewogICAgdmFyIG92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdzsKICAgIHZhciBpZFdpdGhMZWFkaW5nQml0ID0gdHJlZUNvbnRleHRJZDsKICAgIHZhciBpZCA9IGlkV2l0aExlYWRpbmdCaXQgJiB+Z2V0TGVhZGluZ0JpdChpZFdpdGhMZWFkaW5nQml0KTsKICAgIHJldHVybiBpZC50b1N0cmluZygzMikgKyBvdmVyZmxvdzsKICB9CiAgZnVuY3Rpb24gcHVzaFRyZWVGb3JrKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuKSB7CiAgICAvLyBUaGlzIGlzIGNhbGxlZCByaWdodCBhZnRlciB3ZSByZWNvbmNpbGUgYW4gYXJyYXkgKG9yIGl0ZXJhdG9yKSBvZiBjaGlsZAogICAgLy8gZmliZXJzLCBiZWNhdXNlIHRoYXQncyB0aGUgb25seSBwbGFjZSB3aGVyZSB3ZSBrbm93IGhvdyBtYW55IGNoaWxkcmVuIGluCiAgICAvLyB0aGUgd2hvbGUgc2V0IHdpdGhvdXQgZG9pbmcgZXh0cmEgd29yayBsYXRlciwgb3Igc3RvcmluZyBhZGR0aW9uYWwKICAgIC8vIGluZm9ybWF0aW9uIG9uIHRoZSBmaWJlci4KICAgIC8vCiAgICAvLyBUaGF0J3Mgd2h5IHRoaXMgZnVuY3Rpb24gaXMgc2VwYXJhdGUgZnJvbSBwdXNoVHJlZUlkIOKAlCBpdCdzIGNhbGxlZCBkdXJpbmcKICAgIC8vIHRoZSByZW5kZXIgcGhhc2Ugb2YgdGhlIGZvcmsgcGFyZW50LCBub3QgdGhlIGNoaWxkLCB3aGljaCBpcyB3aGVyZSB3ZSBwdXNoCiAgICAvLyB0aGUgb3RoZXIgY29udGV4dCB2YWx1ZXMuCiAgICAvLwogICAgLy8gSW4gdGhlIEZpenogaW1wbGVtZW50YXRpb24gdGhpcyBpcyBtdWNoIHNpbXBsZXIgYmVjYXVzZSB0aGUgY2hpbGQgaXMKICAgIC8vIHJlbmRlcmVkIGluIHRoZSBzYW1lIGNhbGxzdGFjayBhcyB0aGUgcGFyZW50LgogICAgLy8KICAgIC8vIEl0IG1pZ2h0IGJlIGJldHRlciB0byBqdXN0IGFkZCBhIGBmb3Jrc2AgZmllbGQgdG8gdGhlIEZpYmVyIHR5cGUuIEl0IHdvdWxkCiAgICAvLyBtYWtlIHRoaXMgbW9kdWxlIHNpbXBsZXIuCiAgICB3YXJuSWZOb3RIeWRyYXRpbmcoKTsKICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrQ291bnQ7CiAgICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXgrK10gPSB0cmVlRm9ya1Byb3ZpZGVyOwogICAgdHJlZUZvcmtQcm92aWRlciA9IHdvcmtJblByb2dyZXNzOwogICAgdHJlZUZvcmtDb3VudCA9IHRvdGFsQ2hpbGRyZW47CiAgfQogIGZ1bmN0aW9uIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4sIGluZGV4KSB7CiAgICB3YXJuSWZOb3RIeWRyYXRpbmcoKTsKICAgIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDsKICAgIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRPdmVyZmxvdzsKICAgIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjsKICAgIHRyZWVDb250ZXh0UHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzczsKICAgIHZhciBiYXNlSWRXaXRoTGVhZGluZ0JpdCA9IHRyZWVDb250ZXh0SWQ7CiAgICB2YXIgYmFzZU92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdzsgLy8gVGhlIGxlZnRtb3N0IDEgbWFya3MgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIG5vbi1pbmNsdXNpdmUuIEl0J3Mgbm90IHBhcnQKICAgIC8vIG9mIHRoZSBpZDsgd2UgdXNlIGl0IHRvIGFjY291bnQgZm9yIGxlYWRpbmcgMHMuCgogICAgdmFyIGJhc2VMZW5ndGggPSBnZXRCaXRMZW5ndGgoYmFzZUlkV2l0aExlYWRpbmdCaXQpIC0gMTsKICAgIHZhciBiYXNlSWQgPSBiYXNlSWRXaXRoTGVhZGluZ0JpdCAmIH4oMSA8PCBiYXNlTGVuZ3RoKTsKICAgIHZhciBzbG90ID0gaW5kZXggKyAxOwogICAgdmFyIGxlbmd0aCA9IGdldEJpdExlbmd0aCh0b3RhbENoaWxkcmVuKSArIGJhc2VMZW5ndGg7IC8vIDMwIGlzIHRoZSBtYXggbGVuZ3RoIHdlIGNhbiBzdG9yZSB3aXRob3V0IG92ZXJmbG93aW5nLCB0YWtpbmcgaW50bwogICAgLy8gY29uc2lkZXJhdGlvbiB0aGUgbGVhZGluZyAxIHdlIHVzZSB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlLgoKICAgIGlmIChsZW5ndGggPiAzMCkgewogICAgICAvLyBXZSBvdmVyZmxvd2VkIHRoZSBiaXR3aXNlLXNhZmUgcmFuZ2UuIEZhbGwgYmFjayB0byBzbG93ZXIgYWxnb3JpdGhtLgogICAgICAvLyBUaGlzIGJyYW5jaCBhc3N1bWVzIHRoZSBsZW5ndGggb2YgdGhlIGJhc2UgaWQgaXMgZ3JlYXRlciB0aGFuIDU7IGl0IHdvbid0CiAgICAgIC8vIHdvcmsgZm9yIHNtYWxsZXIgaWRzLCBiZWNhdXNlIHlvdSBuZWVkIDUgYml0cyBwZXIgY2hhcmFjdGVyLgogICAgICAvLwogICAgICAvLyBXZSBlbmNvZGUgdGhlIGlkIGluIG11bHRpcGxlIHN0ZXBzOiBmaXJzdCB0aGUgYmFzZSBpZCwgdGhlbiB0aGUKICAgICAgLy8gcmVtYWluaW5nIGRpZ2l0cy4KICAgICAgLy8KICAgICAgLy8gRWFjaCA1IGJpdCBzZXF1ZW5jZSBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBiYXNlIDMyIGNoYXJhY3Rlci4gU28gZm9yCiAgICAgIC8vIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50IGlkIGlzIDIzIGJpdHMgbG9uZywgd2UgY2FuIGNvbnZlcnQgMjAgb2YgdGhvc2UKICAgICAgLy8gYml0cyBpbnRvIGEgc3RyaW5nIG9mIDQgY2hhcmFjdGVycywgd2l0aCAzIGJpdHMgbGVmdCBvdmVyLgogICAgICAvLwogICAgICAvLyBGaXJzdCBjYWxjdWxhdGUgaG93IG1hbnkgYml0cyBpbiB0aGUgYmFzZSBpZCByZXByZXNlbnQgYSBjb21wbGV0ZQogICAgICAvLyBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLgogICAgICB2YXIgbnVtYmVyT2ZPdmVyZmxvd0JpdHMgPSBiYXNlTGVuZ3RoIC0gYmFzZUxlbmd0aCAlIDU7IC8vIFRoZW4gY3JlYXRlIGEgYml0bWFzayB0aGF0IHNlbGVjdHMgb25seSB0aG9zZSBiaXRzLgoKICAgICAgdmFyIG5ld092ZXJmbG93Qml0cyA9ICgxIDw8IG51bWJlck9mT3ZlcmZsb3dCaXRzKSAtIDE7IC8vIFNlbGVjdCB0aGUgYml0cywgYW5kIGNvbnZlcnQgdGhlbSB0byBhIGJhc2UgMzIgc3RyaW5nLgoKICAgICAgdmFyIG5ld092ZXJmbG93ID0gKGJhc2VJZCAmIG5ld092ZXJmbG93Qml0cykudG9TdHJpbmcoMzIpOyAvLyBOb3cgd2UgY2FuIHJlbW92ZSB0aG9zZSBiaXRzIGZyb20gdGhlIGJhc2UgaWQuCgogICAgICB2YXIgcmVzdE9mQmFzZUlkID0gYmFzZUlkID4+IG51bWJlck9mT3ZlcmZsb3dCaXRzOwogICAgICB2YXIgcmVzdE9mQmFzZUxlbmd0aCA9IGJhc2VMZW5ndGggLSBudW1iZXJPZk92ZXJmbG93Qml0czsgLy8gRmluYWxseSwgZW5jb2RlIHRoZSByZXN0IG9mIHRoZSBiaXRzIHVzaW5nIHRoZSBub3JtYWwgYWxnb3JpdGhtLiBCZWNhdXNlCiAgICAgIC8vIHdlIG1hZGUgbW9yZSByb29tLCB0aGlzIHRpbWUgaXQgd29uJ3Qgb3ZlcmZsb3cuCgogICAgICB2YXIgcmVzdE9mTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgcmVzdE9mQmFzZUxlbmd0aDsKICAgICAgdmFyIHJlc3RPZk5ld0JpdHMgPSBzbG90IDw8IHJlc3RPZkJhc2VMZW5ndGg7CiAgICAgIHZhciBpZCA9IHJlc3RPZk5ld0JpdHMgfCByZXN0T2ZCYXNlSWQ7CiAgICAgIHZhciBvdmVyZmxvdyA9IG5ld092ZXJmbG93ICsgYmFzZU92ZXJmbG93OwogICAgICB0cmVlQ29udGV4dElkID0gMSA8PCByZXN0T2ZMZW5ndGggfCBpZDsKICAgICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IG92ZXJmbG93OwogICAgfSBlbHNlIHsKICAgICAgLy8gTm9ybWFsIHBhdGgKICAgICAgdmFyIG5ld0JpdHMgPSBzbG90IDw8IGJhc2VMZW5ndGg7CgogICAgICB2YXIgX2lkID0gbmV3Qml0cyB8IGJhc2VJZDsKCiAgICAgIHZhciBfb3ZlcmZsb3cgPSBiYXNlT3ZlcmZsb3c7CiAgICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IGxlbmd0aCB8IF9pZDsKICAgICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IF9vdmVyZmxvdzsKICAgIH0KICB9CiAgZnVuY3Rpb24gcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcykgewogICAgd2FybklmTm90SHlkcmF0aW5nKCk7IC8vIFRoaXMgY29tcG9uZW50IG1hdGVyaWFsaXplZCBhbiBpZC4gVGhpcyB3aWxsIGFmZmVjdCBhbnkgaWRzIHRoYXQgYXBwZWFyCiAgICAvLyBpbiBpdHMgY2hpbGRyZW4uCgogICAgdmFyIHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuOwoKICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkgewogICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IDE7CiAgICAgIHZhciBzbG90SW5kZXggPSAwOwogICAgICBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MpOwogICAgICBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCBudW1iZXJPZkZvcmtzLCBzbG90SW5kZXgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZ2V0Qml0TGVuZ3RoKG51bWJlcikgewogICAgcmV0dXJuIDMyIC0gY2x6MzIobnVtYmVyKTsKICB9CgogIGZ1bmN0aW9uIGdldExlYWRpbmdCaXQoaWQpIHsKICAgIHJldHVybiAxIDw8IGdldEJpdExlbmd0aChpZCkgLSAxOwogIH0KCiAgZnVuY3Rpb24gcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpIHsKICAgIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlcy4KICAgIC8vIFRoaXMgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuIG90aGVyIGNvbnRleHQtbGlrZSBtb2R1bGVzIGluIEZpYmVyCiAgICAvLyBiZWNhdXNlIHRoZSBzYW1lIEZpYmVyIG1heSBhcHBlYXIgb24gdGhlIHN0YWNrIG11bHRpcGxlIHRpbWVzIGFuZCBmb3IKICAgIC8vIGRpZmZlcmVudCByZWFzb25zLiBXZSBoYXZlIHRvIGtlZXAgcG9wcGluZyB1bnRpbCB0aGUgd29yay1pbi1wcm9ncmVzcyBpcwogICAgLy8gbm8gbG9uZ2VyIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLgogICAgd2hpbGUgKHdvcmtJblByb2dyZXNzID09PSB0cmVlRm9ya1Byb3ZpZGVyKSB7CiAgICAgIHRyZWVGb3JrUHJvdmlkZXIgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07CiAgICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsOwogICAgICB0cmVlRm9ya0NvdW50ID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdOwogICAgICBmb3JrU3RhY2tbZm9ya1N0YWNrSW5kZXhdID0gbnVsbDsKICAgIH0KCiAgICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVDb250ZXh0UHJvdmlkZXIpIHsKICAgICAgdHJlZUNvbnRleHRQcm92aWRlciA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdOwogICAgICBpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsOwogICAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07CiAgICAgIGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGw7CiAgICAgIHRyZWVDb250ZXh0SWQgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XTsKICAgICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDsKICAgIH0KICB9CiAgZnVuY3Rpb24gZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSB7CiAgICB3YXJuSWZOb3RIeWRyYXRpbmcoKTsKCiAgICBpZiAodHJlZUNvbnRleHRQcm92aWRlciAhPT0gbnVsbCkgewogICAgICByZXR1cm4gewogICAgICAgIGlkOiB0cmVlQ29udGV4dElkLAogICAgICAgIG92ZXJmbG93OiB0cmVlQ29udGV4dE92ZXJmbG93CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgZnVuY3Rpb24gcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5kZWRDb250ZXh0KSB7CiAgICB3YXJuSWZOb3RIeWRyYXRpbmcoKTsKICAgIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDsKICAgIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRPdmVyZmxvdzsKICAgIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjsKICAgIHRyZWVDb250ZXh0SWQgPSBzdXNwZW5kZWRDb250ZXh0LmlkOwogICAgdHJlZUNvbnRleHRPdmVyZmxvdyA9IHN1c3BlbmRlZENvbnRleHQub3ZlcmZsb3c7CiAgICB0cmVlQ29udGV4dFByb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7CiAgfQoKICBmdW5jdGlvbiB3YXJuSWZOb3RIeWRyYXRpbmcoKSB7CiAgICB7CiAgICAgIGlmICghZ2V0SXNIeWRyYXRpbmcoKSkgewogICAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBiZSBoeWRyYXRpbmcuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlICcgKyAnYW4gaXNzdWUuJyk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uCgogIHZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7CiAgdmFyIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsOwogIHZhciBpc0h5ZHJhdGluZyA9IGZhbHNlOyAvLyBUaGlzIGZsYWcgYWxsb3dzIGZvciB3YXJuaW5nIHN1cHJlc3Npb24gd2hlbiB3ZSBleHBlY3QgdGhlcmUgdG8gYmUgbWlzbWF0Y2hlcwogIC8vIGR1ZSB0byBlYXJsaWVyIG1pc21hdGNoZXMgb3IgYSBzdXNwZW5kZWQgZmliZXIuCgogIHZhciBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlOyAvLyBIeWRyYXRpb24gZXJyb3JzIHRoYXQgd2VyZSB0aHJvd24gaW5zaWRlIHRoaXMgYm91bmRhcnkKCiAgdmFyIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7CgogIGZ1bmN0aW9uIHdhcm5JZkh5ZHJhdGluZygpIHsKICAgIHsKICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7CiAgICAgICAgZXJyb3IoJ1dlIHNob3VsZCBub3QgYmUgaHlkcmF0aW5nIGhlcmUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGEgYnVnLicpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpIHsKICAgIHsKICAgICAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSB0cnVlOwogICAgfQogIH0KICBmdW5jdGlvbiBkaWRTdXNwZW5kT3JFcnJvcldoaWxlSHlkcmF0aW5nREVWKCkgewogICAgewogICAgICByZXR1cm4gZGlkU3VzcGVuZE9yRXJyb3JERVY7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBlbnRlckh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7CgogICAgdmFyIHBhcmVudEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87CiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5Db250YWluZXIocGFyZW50SW5zdGFuY2UpOwogICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjsKICAgIGlzSHlkcmF0aW5nID0gdHJ1ZTsKICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7CiAgICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiByZWVudGVySHlkcmF0aW9uU3RhdGVGcm9tRGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIsIHN1c3BlbnNlSW5zdGFuY2UsIHRyZWVDb250ZXh0KSB7CgogICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTsKICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7CiAgICBpc0h5ZHJhdGluZyA9IHRydWU7CiAgICBoeWRyYXRpb25FcnJvcnMgPSBudWxsOwogICAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTsKCiAgICBpZiAodHJlZUNvbnRleHQgIT09IG51bGwpIHsKICAgICAgcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KGZpYmVyLCB0cmVlQ29udGV4dCk7CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiB3YXJuVW5oeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBpbnN0YW5jZSkgewogICAgewogICAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykgewogICAgICAgIGNhc2UgSG9zdFJvb3Q6CiAgICAgICAgICB7CiAgICAgICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihyZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbywgaW5zdGFuY2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgICAgewogICAgICAgICAgICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7CiAgICAgICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLgogICAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gcmV0dXJuRmliZXIubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQsIGluc3RhbmNlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHsKICAgIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKTsKICAgIHZhciBjaGlsZFRvRGVsZXRlID0gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKTsKICAgIGNoaWxkVG9EZWxldGUuc3RhdGVOb2RlID0gaW5zdGFuY2U7CiAgICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyOwogICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9uczsKCiAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7CiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTsKICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjsKICAgIH0gZWxzZSB7CiAgICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKSB7CiAgICB7CiAgICAgIGlmIChkaWRTdXNwZW5kT3JFcnJvckRFVikgewogICAgICAgIC8vIEluc2lkZSBhIGJvdW5kYXJ5IHRoYXQgYWxyZWFkeSBzdXNwZW5kZWQuIFdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgdGhlCiAgICAgICAgLy8gc2libGluZ3Mgb2YgYSBzdXNwZW5kZWQgbm9kZS4gVGhlIG1pc21hdGNoIG1heSBiZSBkdWUgdG8gdGhlIG1pc3NpbmcKICAgICAgICAvLyBkYXRhLCBzbyBpdCdzIHByb2JhYmx5IGEgZmFsc2UgcG9zaXRpdmUuCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykgewogICAgICAgIGNhc2UgSG9zdFJvb3Q6CiAgICAgICAgICB7CiAgICAgICAgICAgIHZhciBwYXJlbnRDb250YWluZXIgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzsKCiAgICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7CiAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBmaWJlci50eXBlOwogICAgICAgICAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzOwogICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6CiAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wczsKICAgICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdGV4dCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDoKICAgICAgICAgIHsKICAgICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlOwogICAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzOwogICAgICAgICAgICB2YXIgcGFyZW50SW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7CgogICAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykgewogICAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDoKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdmFyIF90eXBlID0gZmliZXIudHlwZTsKICAgICAgICAgICAgICAgICAgdmFyIF9wcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wczsKICAgICAgICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlOwogICAgICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgX3R5cGUsIF9wcm9wcywgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS4KICAgICAgICAgICAgICAgICAgaXNDb25jdXJyZW50TW9kZSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBjYXNlIEhvc3RUZXh0OgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7CgogICAgICAgICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlOwoKICAgICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdGV4dCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS4KICAgICAgICAgICAgICAgICAgX2lzQ29uY3VycmVudE1vZGUpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gcmV0dXJuRmliZXIubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgICAgdmFyIF9wYXJlbnRJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDsKICAgICAgICAgICAgaWYgKF9wYXJlbnRJbnN0YW5jZSAhPT0gbnVsbCkgc3dpdGNoIChmaWJlci50YWcpIHsKICAgICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6CiAgICAgICAgICAgICAgICB2YXIgX3R5cGUyID0gZmliZXIudHlwZTsKICAgICAgICAgICAgICAgIHZhciBfcHJvcHMyID0gZmliZXIucGVuZGluZ1Byb3BzOwogICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UoX3BhcmVudEluc3RhbmNlLCBfdHlwZTIpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6CiAgICAgICAgICAgICAgICB2YXIgX3RleHQyID0gZmliZXIucGVuZGluZ1Byb3BzOwogICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKF9wYXJlbnRJbnN0YW5jZSwgX3RleHQyKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikgewogICAgZmliZXIuZmxhZ3MgPSBmaWJlci5mbGFncyAmIH5IeWRyYXRpbmcgfCBQbGFjZW1lbnQ7CiAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpOwogIH0KCiAgZnVuY3Rpb24gdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSB7CiAgICBzd2l0Y2ggKGZpYmVyLnRhZykgewogICAgICBjYXNlIEhvc3RDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgdmFyIHR5cGUgPSBmaWJlci50eXBlOwogICAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzOwogICAgICAgICAgdmFyIGluc3RhbmNlID0gY2FuSHlkcmF0ZUluc3RhbmNlKG5leHRJbnN0YW5jZSwgdHlwZSk7CgogICAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7CiAgICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IGluc3RhbmNlOwogICAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOwogICAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQoaW5zdGFuY2UpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgY2FzZSBIb3N0VGV4dDoKICAgICAgICB7CiAgICAgICAgICB2YXIgdGV4dCA9IGZpYmVyLnBlbmRpbmdQcm9wczsKICAgICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKG5leHRJbnN0YW5jZSwgdGV4dCk7CgogICAgICAgICAgaWYgKHRleHRJbnN0YW5jZSAhPT0gbnVsbCkgewogICAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSB0ZXh0SW5zdGFuY2U7CiAgICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFRleHQgSW5zdGFuY2VzIGRvbid0IGhhdmUgY2hpbGRyZW4gc28gdGhlcmUncyBub3RoaW5nIHRvIGh5ZHJhdGUuCgogICAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBjYW5IeWRyYXRlU3VzcGVuc2VJbnN0YW5jZShuZXh0SW5zdGFuY2UpOwoKICAgICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7CiAgICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gewogICAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHN1c3BlbnNlSW5zdGFuY2UsCiAgICAgICAgICAgICAgdHJlZUNvbnRleHQ6IGdldFN1c3BlbmRlZFRyZWVDb250ZXh0KCksCiAgICAgICAgICAgICAgcmV0cnlMYW5lOiBPZmZzY3JlZW5MYW5lCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZpYmVyLm1lbW9pemVkU3RhdGUgPSBzdXNwZW5zZVN0YXRlOyAvLyBTdG9yZSB0aGUgZGVoeWRyYXRlZCBmcmFnbWVudCBhcyBhIGNoaWxkIGZpYmVyLgogICAgICAgICAgICAvLyBUaGlzIHNpbXBsaWZpZXMgdGhlIGNvZGUgZm9yIGdldEhvc3RTaWJsaW5nIGFuZCBkZWxldGluZyBub2RlcywKICAgICAgICAgICAgLy8gc2luY2UgaXQgZG9lc24ndCBoYXZlIHRvIGNvbnNpZGVyIGFsbCBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZAogICAgICAgICAgICAvLyBjaGVjayBpZiB0aGV5J3JlIGRlaHlkcmF0ZWQgb25lcyBvciBub3QuCgogICAgICAgICAgICB2YXIgZGVoeWRyYXRlZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KHN1c3BlbnNlSW5zdGFuY2UpOwogICAgICAgICAgICBkZWh5ZHJhdGVkRnJhZ21lbnQucmV0dXJuID0gZmliZXI7CiAgICAgICAgICAgIGZpYmVyLmNoaWxkID0gZGVoeWRyYXRlZEZyYWdtZW50OwogICAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOyAvLyBXaGlsZSBhIFN1c3BlbnNlIEluc3RhbmNlIGRvZXMgaGF2ZSBjaGlsZHJlbiwgd2Ugd29uJ3Qgc3RlcCBpbnRvCiAgICAgICAgICAgIC8vIGl0IGR1cmluZyB0aGUgZmlyc3QgcGFzcy4gSW5zdGVhZCwgd2UnbGwgcmVlbnRlciBpdCBsYXRlci4KCiAgICAgICAgICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSB7CiAgICByZXR1cm4gKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAoZmliZXIuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFnczsKICB9CgogIGZ1bmN0aW9uIHRocm93T25IeWRyYXRpb25NaXNtYXRjaChmaWJlcikgewogICAgdGhyb3cgbmV3IEVycm9yKCdIeWRyYXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIGluaXRpYWwgVUkgZG9lcyBub3QgbWF0Y2ggd2hhdCB3YXMgJyArICdyZW5kZXJlZCBvbiB0aGUgc2VydmVyLicpOwogIH0KCiAgZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHsKICAgIGlmICghaXNIeWRyYXRpbmcpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlOwoKICAgIGlmICghbmV4dEluc3RhbmNlKSB7CiAgICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkgewogICAgICAgIHdhcm5Ob25oeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7CiAgICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7CiAgICAgIH0gLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi4KCgogICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7CiAgICAgIGlzSHlkcmF0aW5nID0gZmFsc2U7CiAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSA9IG5leHRJbnN0YW5jZTsKCiAgICBpZiAoIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHsKICAgICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7CiAgICAgICAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTsKICAgICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goKTsKICAgICAgfSAvLyBJZiB3ZSBjYW4ndCBoeWRyYXRlIHRoaXMgaW5zdGFuY2UgbGV0J3MgdHJ5IHRoZSBuZXh0IG9uZS4KICAgICAgLy8gV2UgdXNlIHRoaXMgYXMgYSBoZXVyaXN0aWMuIEl0J3MgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBub3QgZGF0YSBzbyBpdAogICAgICAvLyBtaWdodCBiZSBmbGF3ZWQgb3IgdW5uZWNlc3NhcnkuCgoKICAgICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpOwogICAgICB2YXIgcHJldkh5ZHJhdGlvblBhcmVudEZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7CgogICAgICBpZiAoIW5leHRJbnN0YW5jZSB8fCAhdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkgewogICAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uCiAgICAgICAgaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpOwogICAgICAgIGlzSHlkcmF0aW5nID0gZmFsc2U7CiAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjsKICAgICAgICByZXR1cm47CiAgICAgIH0gLy8gV2UgbWF0Y2hlZCB0aGUgbmV4dCBvbmUsIHdlJ2xsIG5vdyBhc3N1bWUgdGhhdCB0aGUgZmlyc3Qgb25lIHdhcwogICAgICAvLyBzdXBlcmZsdW91cyBhbmQgd2UnbGwgZGVsZXRlIGl0LiBTaW5jZSB3ZSBjYW4ndCBlYWdlcmx5IGRlbGV0ZSBpdAogICAgICAvLyB3ZSdsbCBoYXZlIHRvIHNjaGVkdWxlIGEgZGVsZXRpb24uIFRvIGRvIHRoYXQsIHRoaXMgbm9kZSBuZWVkcyBhIGR1bW15CiAgICAgIC8vIGZpYmVyIGFzc29jaWF0ZWQgd2l0aCBpdC4KCgogICAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocHJldkh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaXJzdEF0dGVtcHRlZEluc3RhbmNlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2UoZmliZXIsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQpIHsKCiAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7CiAgICB2YXIgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYgPSAhZGlkU3VzcGVuZE9yRXJyb3JERVY7CiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IGh5ZHJhdGVJbnN0YW5jZShpbnN0YW5jZSwgZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgZmliZXIsIHNob3VsZFdhcm5JZk1pc21hdGNoRGV2KTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuCgogICAgZmliZXIudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkOyAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmUKICAgIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLgoKICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlKGZpYmVyKSB7CgogICAgdmFyIHRleHRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTsKICAgIHZhciB0ZXh0Q29udGVudCA9IGZpYmVyLm1lbW9pemVkUHJvcHM7CiAgICB2YXIgc2hvdWxkVXBkYXRlID0gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCBmaWJlcik7CgogICAgaWYgKHNob3VsZFVwZGF0ZSkgewogICAgICAvLyBXZSBhc3N1bWUgdGhhdCBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSBpcyBjYWxsZWQgaW4gYSBjb250ZXh0IHdoZXJlIHRoZQogICAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuCiAgICAgIHZhciByZXR1cm5GaWJlciA9IGh5ZHJhdGlvblBhcmVudEZpYmVyOwoKICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7CiAgICAgICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHsKICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87CiAgICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlOwogICAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRDb250YWluZXJUZXh0SW5zdGFuY2UocGFyZW50Q29udGFpbmVyLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLgogICAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlOwogICAgICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7CiAgICAgICAgICAgICAgdmFyIHBhcmVudEluc3RhbmNlID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlOwoKICAgICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUyID0gKHJldHVybkZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTsKCiAgICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuCiAgICAgICAgICAgICAgX2lzQ29uY3VycmVudE1vZGUyKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBzaG91bGRVcGRhdGU7CiAgfQoKICBmdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHsKCiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7CiAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUgIT09IG51bGwgPyBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgOiBudWxsOwoKICAgIGlmICghc3VzcGVuc2VJbnN0YW5jZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgfQoKICAgIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGZpYmVyKTsKICB9CgogIGZ1bmN0aW9uIHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHsKCiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7CiAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHN1c3BlbnNlU3RhdGUgIT09IG51bGwgPyBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgOiBudWxsOwoKICAgIGlmICghc3VzcGVuc2VJbnN0YW5jZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgfQoKICAgIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpOwogIH0KCiAgZnVuY3Rpb24gcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcikgewogICAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjsKCiAgICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHsKICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjsKICAgIH0KCiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHBhcmVudDsKICB9CgogIGZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7CgogICAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikgewogICAgICAvLyBXZSdyZSBkZWVwZXIgdGhhbiB0aGUgY3VycmVudCBoeWRyYXRpb24gY29udGV4dCwgaW5zaWRlIGFuIGluc2VydGVkCiAgICAgIC8vIHRyZWUuCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7CiAgICAgIC8vIElmIHdlJ3JlIG5vdCBjdXJyZW50bHkgaHlkcmF0aW5nIGJ1dCB3ZSdyZSBpbiBhIGh5ZHJhdGlvbiBjb250ZXh0LCB0aGVuCiAgICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyCiAgICAgIC8vIHNpYmxpbmdzLgogICAgICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTsKICAgICAgaXNIeWRyYXRpbmcgPSB0cnVlOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IC8vIElmIHdlIGhhdmUgYW55IHJlbWFpbmluZyBoeWRyYXRhYmxlIG5vZGVzLCB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGVtIG5vdy4KICAgIC8vIFdlIG9ubHkgZG8gdGhpcyBkZWVwZXIgdGhhbiBoZWFkIGFuZCBib2R5IHNpbmNlIHRoZXkgdGVuZCB0byBoYXZlIHJhbmRvbQogICAgLy8gb3RoZXIgbm9kZXMgaW4gdGhlbS4gV2UgYWxzbyBpZ25vcmUgY29tcG9uZW50cyB3aXRoIHB1cmUgdGV4dCBjb250ZW50IGluCiAgICAvLyBzaWRlIG9mIHRoZW0uIFdlIGFsc28gZG9uJ3QgZGVsZXRlIGFueXRoaW5nIGluc2lkZSB0aGUgcm9vdCBjb250YWluZXIuCgoKICAgIGlmIChmaWJlci50YWcgIT09IEhvc3RSb290ICYmIChmaWJlci50YWcgIT09IEhvc3RDb21wb25lbnQgfHwgc2hvdWxkRGVsZXRlVW5oeWRyYXRlZFRhaWxJbnN0YW5jZXMoZmliZXIudHlwZSkgJiYgIXNob3VsZFNldFRleHRDb250ZW50KGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMpKSkgewogICAgICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTsKCiAgICAgIGlmIChuZXh0SW5zdGFuY2UpIHsKICAgICAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHsKICAgICAgICAgIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMoZmliZXIpOwogICAgICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHdoaWxlIChuZXh0SW5zdGFuY2UpIHsKICAgICAgICAgICAgZGVsZXRlSHlkcmF0YWJsZUluc3RhbmNlKGZpYmVyLCBuZXh0SW5zdGFuY2UpOwogICAgICAgICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTsKCiAgICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkgewogICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcik7CiAgICB9IGVsc2UgewogICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gaHlkcmF0aW9uUGFyZW50RmliZXIgPyBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmliZXIuc3RhdGVOb2RlKSA6IG51bGw7CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkgewogICAgcmV0dXJuIGlzSHlkcmF0aW5nICYmIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgIT09IG51bGw7CiAgfQoKICBmdW5jdGlvbiB3YXJuSWZVbmh5ZHJhdGVkVGFpbE5vZGVzKGZpYmVyKSB7CiAgICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTsKCiAgICB3aGlsZSAobmV4dEluc3RhbmNlKSB7CiAgICAgIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UoZmliZXIsIG5leHRJbnN0YW5jZSk7CiAgICAgIG5leHRJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhuZXh0SW5zdGFuY2UpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVzZXRIeWRyYXRpb25TdGF0ZSgpIHsKCiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7CiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDsKICAgIGlzSHlkcmF0aW5nID0gZmFsc2U7CiAgICBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKSB7CiAgICBpZiAoaHlkcmF0aW9uRXJyb3JzICE9PSBudWxsKSB7CiAgICAgIC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYSBmb3JjZWQgY2xpZW50IHJlbmRlci4gVGhlIGVycm9ycyB0aGF0IG9jY3VycmVkCiAgICAgIC8vIGR1cmluZyB0aGUgaHlkcmF0aW9uIGF0dGVtcHQgYXJlIG5vdyByZWNvdmVyZWQuIFdlIHdpbGwgbG9nIHRoZW0gaW4KICAgICAgLy8gY29tbWl0IHBoYXNlLCBvbmNlIHRoZSBlbnRpcmUgdHJlZSBoYXMgZmluaXNoZWQuCiAgICAgIHF1ZXVlUmVjb3ZlcmFibGVFcnJvcnMoaHlkcmF0aW9uRXJyb3JzKTsKICAgICAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGdldElzSHlkcmF0aW5nKCkgewogICAgcmV0dXJuIGlzSHlkcmF0aW5nOwogIH0KCiAgZnVuY3Rpb24gcXVldWVIeWRyYXRpb25FcnJvcihlcnJvcikgewogICAgaWYgKGh5ZHJhdGlvbkVycm9ycyA9PT0gbnVsbCkgewogICAgICBoeWRyYXRpb25FcnJvcnMgPSBbZXJyb3JdOwogICAgfSBlbHNlIHsKICAgICAgaHlkcmF0aW9uRXJyb3JzLnB1c2goZXJyb3IpOwogICAgfQogIH0KCiAgdmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZzsKICB2YXIgTm9UcmFuc2l0aW9uID0gbnVsbDsKICBmdW5jdGlvbiByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSB7CiAgICByZXR1cm4gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uOwogIH0KCiAgdmFyIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzID0gewogICAgcmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LAogICAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LAogICAgcmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHt9LAogICAgZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKCkge30sCiAgICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fQogIH07CgogIHsKICAgIHZhciBmaW5kU3RyaWN0Um9vdCA9IGZ1bmN0aW9uIChmaWJlcikgewogICAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDsKICAgICAgdmFyIG5vZGUgPSBmaWJlcjsKCiAgICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7CiAgICAgICAgaWYgKG5vZGUubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHsKICAgICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7CiAgICAgICAgfQoKICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47CiAgICAgIH0KCiAgICAgIHJldHVybiBtYXliZVN0cmljdFJvb3Q7CiAgICB9OwoKICAgIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHsKICAgICAgdmFyIGFycmF5ID0gW107CiAgICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgIGFycmF5LnB1c2godmFsdWUpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGFycmF5LnNvcnQoKS5qb2luKCcsICcpOwogICAgfTsKCiAgICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107CiAgICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdOwogICAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTsKICAgIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdOwogICAgdmFyIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsKICAgIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LgoKICAgIHZhciBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzID0gbmV3IFNldCgpOwoKICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkgewogICAgICAvLyBEZWR1cGUgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LgogICAgICBpZiAoZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5oYXMoZmliZXIudHlwZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLgogICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkgewogICAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTsKICAgICAgfQoKICAgICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkgewogICAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7CiAgICAgIH0KCiAgICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkgewogICAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MucHVzaChmaWJlcik7CiAgICAgIH0KCiAgICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTsKICAgICAgfQogICAgfTsKCiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHsKICAgICAgLy8gV2UgZG8gYW4gaW5pdGlhbCBwYXNzIHRvIGdhdGhlciBjb21wb25lbnQgbmFtZXMKICAgICAgdmFyIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzID0gbmV3IFNldCgpOwoKICAgICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7CiAgICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7CiAgICAgICAgICBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpOwogICAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7CiAgICAgICAgfSk7CiAgICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107CiAgICAgIH0KCiAgICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7CgogICAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7CiAgICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikgewogICAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7CiAgICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTsKICAgICAgICB9KTsKICAgICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107CiAgICAgIH0KCiAgICAgIHZhciBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7CgogICAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7CiAgICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikgewogICAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7CiAgICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTsKICAgICAgICB9KTsKICAgICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107CiAgICAgIH0KCiAgICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzID0gbmV3IFNldCgpOwoKICAgICAgaWYgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHsKICAgICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikgewogICAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpOwogICAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7CiAgICAgICAgfSk7CiAgICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTsKICAgICAgfQoKICAgICAgdmFyIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTsKCiAgICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHsKICAgICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7CiAgICAgICAgICBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTsKICAgICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpOwogICAgICAgIH0pOwogICAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsKICAgICAgfQoKICAgICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7CgogICAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkgewogICAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7CiAgICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7CiAgICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTsKICAgICAgICB9KTsKICAgICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdOwogICAgICB9IC8vIEZpbmFsbHksIHdlIGZsdXNoIGFsbCB0aGUgd2FybmluZ3MKICAgICAgLy8gVU5TQUZFXyBvbmVzIGJlZm9yZSB0aGUgZGVwcmVjYXRlZCBvbmVzLCBzaW5jZSB0aGV5J2xsIGJlICdsb3VkZXInCgoKICAgICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkgewogICAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7CgogICAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxuXG4nICsgJyogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxuJyArICdcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIHNvcnRlZE5hbWVzKTsKICAgICAgfQoKICAgICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHsKICAgICAgICB2YXIgX3NvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7CgogICAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxuXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cbicgKyAiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCAiICsgJ3JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcbicgKyAnXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMpOwogICAgICB9CgogICAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkgewogICAgICAgIHZhciBfc29ydGVkTmFtZXMyID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyk7CgogICAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxuXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cbicgKyAnXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMyKTsKICAgICAgfQoKICAgICAgaWYgKGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7CiAgICAgICAgdmFyIF9zb3J0ZWROYW1lczMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7CgogICAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxNb3VudCBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXG5cbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxNb3VudCB0byBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXG4nICsgJ1xuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzMyk7CiAgICAgIH0KCiAgICAgIGlmIChjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHsKICAgICAgICB2YXIgX3NvcnRlZE5hbWVzNCA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7CgogICAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxuXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cbicgKyAiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCByZWZhY3RvciB5b3VyICIgKyAnY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxuJyArICdcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczQpOwogICAgICB9CgogICAgICBpZiAoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7CiAgICAgICAgdmFyIF9zb3J0ZWROYW1lczUgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpOwoKICAgICAgICB3YXJuKCdjb21wb25lbnRXaWxsVXBkYXRlIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cblxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cbicgKyAnXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXM1KTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LgoKICAgIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpOwoKICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkgewogICAgICB2YXIgc3RyaWN0Um9vdCA9IGZpbmRTdHJpY3RSb290KGZpYmVyKTsKCiAgICAgIGlmIChzdHJpY3RSb290ID09PSBudWxsKSB7CiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBTdHJpY3RNb2RlIGNvbXBvbmVudCBpbiBhIHN0cmljdCBtb2RlIHRyZWUuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTsKCiAgICAgICAgcmV0dXJuOwogICAgICB9IC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC4KCgogICAgICBpZiAoZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5oYXMoZmliZXIudHlwZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZ2V0KHN0cmljdFJvb3QpOwoKICAgICAgaWYgKGZpYmVyLnR5cGUuY29udGV4dFR5cGVzICE9IG51bGwgfHwgZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyAhPSBudWxsIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpZiAod2FybmluZ3NGb3JSb290ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHdhcm5pbmdzRm9yUm9vdCA9IFtdOwogICAgICAgICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpOwogICAgICAgIH0KCiAgICAgICAgd2FybmluZ3NGb3JSb290LnB1c2goZmliZXIpOwogICAgICB9CiAgICB9OwoKICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlckFycmF5LCBzdHJpY3RSb290KSB7CiAgICAgICAgaWYgKGZpYmVyQXJyYXkubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgZmlyc3RGaWJlciA9IGZpYmVyQXJyYXlbMF07CiAgICAgICAgdmFyIHVuaXF1ZU5hbWVzID0gbmV3IFNldCgpOwogICAgICAgIGZpYmVyQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHsKICAgICAgICAgIHVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7CiAgICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmFkZChmaWJlci50eXBlKTsKICAgICAgICB9KTsKICAgICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmlyc3RGaWJlcik7CgogICAgICAgICAgZXJyb3IoJ0xlZ2FjeSBjb250ZXh0IEFQSSBoYXMgYmVlbiBkZXRlY3RlZCB3aXRoaW4gYSBzdHJpY3QtbW9kZSB0cmVlLicgKyAnXG5cblRoZSBvbGQgQVBJIHdpbGwgYmUgc3VwcG9ydGVkIGluIGFsbCAxNi54IHJlbGVhc2VzLCBidXQgYXBwbGljYXRpb25zICcgKyAndXNpbmcgaXQgc2hvdWxkIG1pZ3JhdGUgdG8gdGhlIG5ldyB2ZXJzaW9uLicgKyAnXG5cblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycgKyAnXG5cbkxlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9sZWdhY3ktY29udGV4dCcsIHNvcnRlZE5hbWVzKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfTsKCiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkgewogICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTsKICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdOwogICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107CiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107CiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsKICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsKICAgICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCBiYXNlUHJvcHMpIHsKICAgIGlmIChDb21wb25lbnQgJiYgQ29tcG9uZW50LmRlZmF1bHRQcm9wcykgewogICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHMuIFRha2VuIGZyb20gUmVhY3RFbGVtZW50CiAgICAgIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgYmFzZVByb3BzKTsKICAgICAgdmFyIGRlZmF1bHRQcm9wcyA9IENvbXBvbmVudC5kZWZhdWx0UHJvcHM7CgogICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHsKICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gcHJvcHM7CiAgICB9CgogICAgcmV0dXJuIGJhc2VQcm9wczsKICB9CgogIHZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTsKICB2YXIgcmVuZGVyZXJTaWdpbDsKCiAgewogICAgLy8gVXNlIHRoaXMgdG8gZGV0ZWN0IG11bHRpcGxlIHJlbmRlcmVycyB1c2luZyB0aGUgc2FtZSBjb250ZXh0CiAgICByZW5kZXJlclNpZ2lsID0ge307CiAgfQoKICB2YXIgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsOwogIHZhciBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsOwogIHZhciBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsOwogIHZhciBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7CiAgZnVuY3Rpb24gcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCkgewogICAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgCiAgICAvLyBjYW5ub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS4KICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gbnVsbDsKICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7CiAgICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsOwoKICAgIHsKICAgICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlOwogICAgfQogIH0KICBmdW5jdGlvbiBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCkgewogICAgewogICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gdHJ1ZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCkgewogICAgewogICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBjb250ZXh0LCBuZXh0VmFsdWUpIHsKICAgIHsKICAgICAgcHVzaCh2YWx1ZUN1cnNvciwgY29udGV4dC5fY3VycmVudFZhbHVlLCBwcm92aWRlckZpYmVyKTsKICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlOwoKICAgICAgewogICAgICAgIGlmIChjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IG51bGwgJiYgY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSByZW5kZXJlclNpZ2lsKSB7CiAgICAgICAgICBlcnJvcignRGV0ZWN0ZWQgbXVsdGlwbGUgcmVuZGVyZXJzIGNvbmN1cnJlbnRseSByZW5kZXJpbmcgdGhlICcgKyAnc2FtZSBjb250ZXh0IHByb3ZpZGVyLiBUaGlzIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZC4nKTsKICAgICAgICB9CgogICAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gcG9wUHJvdmlkZXIoY29udGV4dCwgcHJvdmlkZXJGaWJlcikgewogICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHZhbHVlQ3Vyc29yLmN1cnJlbnQ7CiAgICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpOwoKICAgIHsKICAgICAgewogICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudCwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCkgewogICAgLy8gVXBkYXRlIHRoZSBjaGlsZCBsYW5lcyBvZiBhbGwgdGhlIGFuY2VzdG9ycywgaW5jbHVkaW5nIHRoZSBhbHRlcm5hdGVzLgogICAgdmFyIG5vZGUgPSBwYXJlbnQ7CgogICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHsKICAgICAgdmFyIGFsdGVybmF0ZSA9IG5vZGUuYWx0ZXJuYXRlOwoKICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMobm9kZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHsKICAgICAgICBub2RlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpOwoKICAgICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7CiAgICAgICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmICFpc1N1YnNldE9mTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkgewogICAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpOwogICAgICB9CgogICAgICBpZiAobm9kZSA9PT0gcHJvcGFnYXRpb25Sb290KSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIG5vZGUgPSBub2RlLnJldHVybjsKICAgIH0KCiAgICB7CiAgICAgIGlmIChub2RlICE9PSBwcm9wYWdhdGlvblJvb3QpIHsKICAgICAgICBlcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJvcGFnYXRpb24gcm9vdCB3aGVuIHNjaGVkdWxpbmcgY29udGV4dCB3b3JrLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHsKICAgIHsKICAgICAgcHJvcGFnYXRlQ29udGV4dENoYW5nZV9lYWdlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZV9lYWdlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHsKCiAgICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsKCiAgICBpZiAoZmliZXIgIT09IG51bGwpIHsKICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgY2hpbGQgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuCiAgICAgIGZpYmVyLnJldHVybiA9IHdvcmtJblByb2dyZXNzOwogICAgfQoKICAgIHdoaWxlIChmaWJlciAhPT0gbnVsbCkgewogICAgICB2YXIgbmV4dEZpYmVyID0gdm9pZCAwOyAvLyBWaXNpdCB0aGlzIGZpYmVyLgoKICAgICAgdmFyIGxpc3QgPSBmaWJlci5kZXBlbmRlbmNpZXM7CgogICAgICBpZiAobGlzdCAhPT0gbnVsbCkgewogICAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkOwogICAgICAgIHZhciBkZXBlbmRlbmN5ID0gbGlzdC5maXJzdENvbnRleHQ7CgogICAgICAgIHdoaWxlIChkZXBlbmRlbmN5ICE9PSBudWxsKSB7CiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY29udGV4dCBtYXRjaGVzLgogICAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dCkgewogICAgICAgICAgICAvLyBNYXRjaCEgU2NoZWR1bGUgYW4gdXBkYXRlIG9uIHRoaXMgZmliZXIuCiAgICAgICAgICAgIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7CiAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgYSBmb3JjZSB1cGRhdGUgb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MuCiAgICAgICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7CiAgICAgICAgICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7CiAgICAgICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlOyAvLyBUT0RPOiBCZWNhdXNlIHdlIGRvbid0IGhhdmUgYSB3b3JrLWluLXByb2dyZXNzLCB0aGlzIHdpbGwgYWRkIHRoZQogICAgICAgICAgICAgIC8vIHVwZGF0ZSB0byB0aGUgY3VycmVudCBmaWJlciwgdG9vLCB3aGljaCBtZWFucyBpdCB3aWxsIHBlcnNpc3QgZXZlbiBpZgogICAgICAgICAgICAgIC8vIHRoaXMgcmVuZGVyIGlzIHRocm93biBhd2F5LiBTaW5jZSBpdCdzIGEgcmFjZSBjb25kaXRpb24sIG5vdCBzdXJlIGl0J3MKICAgICAgICAgICAgICAvLyB3b3J0aCBmaXhpbmcuCiAgICAgICAgICAgICAgLy8gSW5saW5lZCBgZW5xdWV1ZVVwZGF0ZWAgdG8gcmVtb3ZlIGludGVybGVhdmVkIHVwZGF0ZSBjaGVjawoKICAgICAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTsKCiAgICAgICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSA7IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkOwogICAgICAgICAgICAgICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nOwoKICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC4KICAgICAgICAgICAgICAgICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDsKICAgICAgICAgICAgICAgICAgcGVuZGluZy5uZXh0ID0gdXBkYXRlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHNoYXJlZFF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTsKICAgICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTsKCiAgICAgICAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHsKICAgICAgICAgICAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKGZpYmVyLnJldHVybiwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTsgLy8gTWFyayB0aGUgdXBkYXRlZCBsYW5lcyBvbiB0aGUgbGlzdCwgdG9vLgoKICAgICAgICAgICAgbGlzdC5sYW5lcyA9IG1lcmdlTGFuZXMobGlzdC5sYW5lcywgcmVuZGVyTGFuZXMpOyAvLyBTaW5jZSB3ZSBhbHJlYWR5IGZvdW5kIGEgbWF0Y2gsIHdlIGNhbiBzdG9wIHRyYXZlcnNpbmcgdGhlCiAgICAgICAgICAgIC8vIGRlcGVuZGVuY3kgbGlzdC4KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICAgIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5Lm5leHQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7CiAgICAgICAgLy8gRG9uJ3Qgc2NhbiBkZWVwZXIgaWYgdGhpcyBpcyBhIG1hdGNoaW5nIHByb3ZpZGVyCiAgICAgICAgbmV4dEZpYmVyID0gZmliZXIudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MudHlwZSA/IG51bGwgOiBmaWJlci5jaGlsZDsKICAgICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IERlaHlkcmF0ZWRGcmFnbWVudCkgewogICAgICAgIC8vIElmIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBpcyBpbiB0aGlzIHN1YnRyZWUsIHdlIGRvbid0IGtub3cKICAgICAgICAvLyBpZiBpdCB3aWxsIGhhdmUgYW55IGNvbnRleHQgY29uc3VtZXJzIGluIGl0LiBUaGUgYmVzdCB3ZSBjYW4gZG8gaXMKICAgICAgICAvLyBtYXJrIGl0IGFzIGhhdmluZyB1cGRhdGVzLgogICAgICAgIHZhciBwYXJlbnRTdXNwZW5zZSA9IGZpYmVyLnJldHVybjsKCiAgICAgICAgaWYgKHBhcmVudFN1c3BlbnNlID09PSBudWxsKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIGp1c3QgY2FtZSBmcm9tIGEgcGFyZW50IHNvIHdlIG11c3QgaGF2ZSBoYWQgYSBwYXJlbnQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7CiAgICAgICAgfQoKICAgICAgICBwYXJlbnRTdXNwZW5zZS5sYW5lcyA9IG1lcmdlTGFuZXMocGFyZW50U3VzcGVuc2UubGFuZXMsIHJlbmRlckxhbmVzKTsKICAgICAgICB2YXIgX2FsdGVybmF0ZSA9IHBhcmVudFN1c3BlbnNlLmFsdGVybmF0ZTsKCiAgICAgICAgaWYgKF9hbHRlcm5hdGUgIT09IG51bGwpIHsKICAgICAgICAgIF9hbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKF9hbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTsKICAgICAgICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBwYXNzaW5nIHRoaXMgZmliZXIgYXMgdGhlIHBhcmVudAogICAgICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byBzY2hlZHVsZSB0aGlzIGZpYmVyIGFzIGhhdmluZyB3b3JrCiAgICAgICAgLy8gb24gaXRzIGNoaWxkcmVuLiBXZSdsbCB1c2UgdGhlIGNoaWxkTGFuZXMgb24KICAgICAgICAvLyB0aGlzIGZpYmVyIHRvIGluZGljYXRlIHRoYXQgYSBjb250ZXh0IGhhcyBjaGFuZ2VkLgoKCiAgICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChwYXJlbnRTdXNwZW5zZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTsKICAgICAgICBuZXh0RmliZXIgPSBmaWJlci5zaWJsaW5nOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRyYXZlcnNlIGRvd24uCiAgICAgICAgbmV4dEZpYmVyID0gZmliZXIuY2hpbGQ7CiAgICAgIH0KCiAgICAgIGlmIChuZXh0RmliZXIgIT09IG51bGwpIHsKICAgICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci4KICAgICAgICBuZXh0RmliZXIucmV0dXJuID0gZmliZXI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTm8gY2hpbGQuIFRyYXZlcnNlIHRvIG5leHQgc2libGluZy4KICAgICAgICBuZXh0RmliZXIgPSBmaWJlcjsKCiAgICAgICAgd2hpbGUgKG5leHRGaWJlciAhPT0gbnVsbCkgewogICAgICAgICAgaWYgKG5leHRGaWJlciA9PT0gd29ya0luUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgLy8gV2UncmUgYmFjayB0byB0aGUgcm9vdCBvZiB0aGlzIHN1YnRyZWUuIEV4aXQuCiAgICAgICAgICAgIG5leHRGaWJlciA9IG51bGw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBzaWJsaW5nID0gbmV4dEZpYmVyLnNpYmxpbmc7CgogICAgICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHsKICAgICAgICAgICAgLy8gU2V0IHRoZSByZXR1cm4gcG9pbnRlciBvZiB0aGUgc2libGluZyB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci4KICAgICAgICAgICAgc2libGluZy5yZXR1cm4gPSBuZXh0RmliZXIucmV0dXJuOwogICAgICAgICAgICBuZXh0RmliZXIgPSBzaWJsaW5nOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0gLy8gTm8gbW9yZSBzaWJsaW5ncy4gVHJhdmVyc2UgdXAuCgoKICAgICAgICAgIG5leHRGaWJlciA9IG5leHRGaWJlci5yZXR1cm47CiAgICAgICAgfQogICAgICB9CgogICAgICBmaWJlciA9IG5leHRGaWJlcjsKICAgIH0KICB9CiAgZnVuY3Rpb24gcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7CiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IHdvcmtJblByb2dyZXNzOwogICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDsKICAgIGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9IG51bGw7CiAgICB2YXIgZGVwZW5kZW5jaWVzID0gd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzOwoKICAgIGlmIChkZXBlbmRlbmNpZXMgIT09IG51bGwpIHsKICAgICAgewogICAgICAgIHZhciBmaXJzdENvbnRleHQgPSBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0OwoKICAgICAgICBpZiAoZmlyc3RDb250ZXh0ICE9PSBudWxsKSB7CiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShkZXBlbmRlbmNpZXMubGFuZXMsIHJlbmRlckxhbmVzKSkgewogICAgICAgICAgICAvLyBDb250ZXh0IGxpc3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuIE1hcmsgdGhhdCB0aGlzIGZpYmVyIHBlcmZvcm1lZCB3b3JrLgogICAgICAgICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpOwogICAgICAgICAgfSAvLyBSZXNldCB0aGUgd29yay1pbi1wcm9ncmVzcyBsaXN0CgoKICAgICAgICAgIGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQgPSBudWxsOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiByZWFkQ29udGV4dChjb250ZXh0KSB7CiAgICB7CiAgICAgIC8vIFRoaXMgd2FybmluZyB3b3VsZCBmaXJlIGlmIHlvdSByZWFkIGNvbnRleHQgaW5zaWRlIGEgSG9vayBsaWtlIHVzZU1lbW8uCiAgICAgIC8vIFVubGlrZSB0aGUgY2xhc3MgY2hlY2sgYmVsb3csIGl0J3Mgbm90IGVuZm9yY2VkIGluIHByb2R1Y3Rpb24gZm9yIHBlcmYuCiAgICAgIGlmIChpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKSB7CiAgICAgICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpOwogICAgICB9CiAgICB9CgogICAgdmFyIHZhbHVlID0gIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA7CgogICAgaWYgKGxhc3RGdWxseU9ic2VydmVkQ29udGV4dCA9PT0gY29udGV4dCkgOyBlbHNlIHsKICAgICAgdmFyIGNvbnRleHRJdGVtID0gewogICAgICAgIGNvbnRleHQ6IGNvbnRleHQsCiAgICAgICAgbWVtb2l6ZWRWYWx1ZTogdmFsdWUsCiAgICAgICAgbmV4dDogbnVsbAogICAgICB9OwoKICAgICAgaWYgKGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9PT0gbnVsbCkgewogICAgICAgIGlmIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9PT0gbnVsbCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTsKICAgICAgICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IGRlcGVuZGVuY3kgZm9yIHRoaXMgY29tcG9uZW50LiBDcmVhdGUgYSBuZXcgbGlzdC4KCgogICAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGNvbnRleHRJdGVtOwogICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmRlcGVuZGVuY2llcyA9IHsKICAgICAgICAgIGxhbmVzOiBOb0xhbmVzLAogICAgICAgICAgZmlyc3RDb250ZXh0OiBjb250ZXh0SXRlbQogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQXBwZW5kIGEgbmV3IGNvbnRleHQgaXRlbS4KICAgICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBsYXN0Q29udGV4dERlcGVuZGVuY3kubmV4dCA9IGNvbnRleHRJdGVtOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgLy8gcmVuZGVyLiBXaGVuIHRoaXMgcmVuZGVyIGV4aXRzLCBlaXRoZXIgYmVjYXVzZSBpdCBmaW5pc2hlcyBvciBiZWNhdXNlIGl0IGlzCiAgLy8gaW50ZXJydXB0ZWQsIHRoZSBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGwgYmUgdHJhbnNmZXJyZWQgb250byB0aGUgbWFpbiBwYXJ0CiAgLy8gb2YgdGhlIHF1ZXVlLgoKICB2YXIgY29uY3VycmVudFF1ZXVlcyA9IG51bGw7CiAgZnVuY3Rpb24gcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSkgewogICAgaWYgKGNvbmN1cnJlbnRRdWV1ZXMgPT09IG51bGwpIHsKICAgICAgY29uY3VycmVudFF1ZXVlcyA9IFtxdWV1ZV07CiAgICB9IGVsc2UgewogICAgICBjb25jdXJyZW50UXVldWVzLnB1c2gocXVldWUpOwogICAgfQogIH0KICBmdW5jdGlvbiBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCkgewogICAgLy8gVHJhbnNmZXIgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgb250byB0aGUgbWFpbiBxdWV1ZS4gRWFjaCBxdWV1ZSBoYXMgYQogICAgLy8gYHBlbmRpbmdgIGZpZWxkIGFuZCBhbiBgaW50ZXJsZWF2ZWRgIGZpZWxkLiBXaGVuIHRoZXkgYXJlIG5vdCBudWxsLCB0aGV5CiAgICAvLyBwb2ludCB0byB0aGUgbGFzdCBub2RlIGluIGEgY2lyY3VsYXIgbGlua2VkIGxpc3QuIFdlIG5lZWQgdG8gYXBwZW5kIHRoZQogICAgLy8gaW50ZXJsZWF2ZWQgbGlzdCB0byB0aGUgZW5kIG9mIHRoZSBwZW5kaW5nIGxpc3QgYnkgam9pbmluZyB0aGVtIGludG8gYQogICAgLy8gc2luZ2xlLCBjaXJjdWxhciBsaXN0LgogICAgaWYgKGNvbmN1cnJlbnRRdWV1ZXMgIT09IG51bGwpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25jdXJyZW50UXVldWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHF1ZXVlID0gY29uY3VycmVudFF1ZXVlc1tpXTsKICAgICAgICB2YXIgbGFzdEludGVybGVhdmVkVXBkYXRlID0gcXVldWUuaW50ZXJsZWF2ZWQ7CgogICAgICAgIGlmIChsYXN0SW50ZXJsZWF2ZWRVcGRhdGUgIT09IG51bGwpIHsKICAgICAgICAgIHF1ZXVlLmludGVybGVhdmVkID0gbnVsbDsKICAgICAgICAgIHZhciBmaXJzdEludGVybGVhdmVkVXBkYXRlID0gbGFzdEludGVybGVhdmVkVXBkYXRlLm5leHQ7CiAgICAgICAgICB2YXIgbGFzdFBlbmRpbmdVcGRhdGUgPSBxdWV1ZS5wZW5kaW5nOwoKICAgICAgICAgIGlmIChsYXN0UGVuZGluZ1VwZGF0ZSAhPT0gbnVsbCkgewogICAgICAgICAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDsKICAgICAgICAgICAgbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGU7CiAgICAgICAgICAgIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlOwogICAgICAgICAgfQoKICAgICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGU7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25jdXJyZW50UXVldWVzID0gbnVsbDsKICAgIH0KICB9CiAgZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7CiAgICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDsKCiAgICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHsKICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LgogICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGwKICAgICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuCgogICAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDsKICAgICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTsKICAgIH0KCiAgICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTsKICAgIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7CiAgfQogIGZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZUFuZEVhZ2VybHlCYWlsb3V0KGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7CiAgICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDsKCiAgICBpZiAoaW50ZXJsZWF2ZWQgPT09IG51bGwpIHsKICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LgogICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGwKICAgICAgLy8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIHBlbmRpbmcgcXVldWUuCgogICAgICBwdXNoQ29uY3VycmVudFVwZGF0ZVF1ZXVlKHF1ZXVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDsKICAgICAgaW50ZXJsZWF2ZWQubmV4dCA9IHVwZGF0ZTsKICAgIH0KCiAgICBxdWV1ZS5pbnRlcmxlYXZlZCA9IHVwZGF0ZTsKICB9CiAgZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkgewogICAgdmFyIGludGVybGVhdmVkID0gcXVldWUuaW50ZXJsZWF2ZWQ7CgogICAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7CiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC4KICAgICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsCiAgICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLgoKICAgICAgcHVzaENvbmN1cnJlbnRVcGRhdGVRdWV1ZShxdWV1ZSk7CiAgICB9IGVsc2UgewogICAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7CiAgICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7CiAgICB9CgogICAgcXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7CiAgICByZXR1cm4gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoZmliZXIsIGxhbmUpOwogIH0KICBmdW5jdGlvbiBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpIHsKICAgIHJldHVybiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7CiAgfSAvLyBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBiZSBkb25lIGZvciBiYWNrd2FyZHMKICAvLyBjb21wYXRpYmlsaXR5IGFuZCBzaG91bGQgYWx3YXlzIGJlIGFjY29tcGFuaWVkIGJ5IGEgd2FybmluZy4KCiAgdmFyIHVuc2FmZV9tYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdCA9IG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290OwoKICBmdW5jdGlvbiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChzb3VyY2VGaWJlciwgbGFuZSkgewogICAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgZmliZXIncyBsYW5lcwogICAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBsYW5lKTsKICAgIHZhciBhbHRlcm5hdGUgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7CgogICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkgewogICAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgbGFuZSk7CiAgICB9CgogICAgewogICAgICBpZiAoYWx0ZXJuYXRlID09PSBudWxsICYmIChzb3VyY2VGaWJlci5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykgewogICAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpOwogICAgICB9CiAgICB9IC8vIFdhbGsgdGhlIHBhcmVudCBwYXRoIHRvIHRoZSByb290IGFuZCB1cGRhdGUgdGhlIGNoaWxkIGxhbmVzLgoKCiAgICB2YXIgbm9kZSA9IHNvdXJjZUZpYmVyOwogICAgdmFyIHBhcmVudCA9IHNvdXJjZUZpYmVyLnJldHVybjsKCiAgICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7CiAgICAgIHBhcmVudC5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhwYXJlbnQuY2hpbGRMYW5lcywgbGFuZSk7CiAgICAgIGFsdGVybmF0ZSA9IHBhcmVudC5hbHRlcm5hdGU7CgogICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7CiAgICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCBsYW5lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB7CiAgICAgICAgICBpZiAoKHBhcmVudC5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykgewogICAgICAgICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIG5vZGUgPSBwYXJlbnQ7CiAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47CiAgICB9CgogICAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkgewogICAgICB2YXIgcm9vdCA9IG5vZGUuc3RhdGVOb2RlOwogICAgICByZXR1cm4gcm9vdDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgdmFyIFVwZGF0ZVN0YXRlID0gMDsKICB2YXIgUmVwbGFjZVN0YXRlID0gMTsKICB2YXIgRm9yY2VVcGRhdGUgPSAyOwogIHZhciBDYXB0dXJlVXBkYXRlID0gMzsgLy8gR2xvYmFsIHN0YXRlIHRoYXQgaXMgcmVzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiBjYWxsaW5nIGBwcm9jZXNzVXBkYXRlUXVldWVgLgogIC8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhCiAgLy8gYGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmdgLgoKICB2YXIgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTsKICB2YXIgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZTsKICB2YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlOwoKICB7CiAgICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gZmFsc2U7CiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBudWxsOwogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7CiAgICB2YXIgcXVldWUgPSB7CiAgICAgIGJhc2VTdGF0ZTogZmliZXIubWVtb2l6ZWRTdGF0ZSwKICAgICAgZmlyc3RCYXNlVXBkYXRlOiBudWxsLAogICAgICBsYXN0QmFzZVVwZGF0ZTogbnVsbCwKICAgICAgc2hhcmVkOiB7CiAgICAgICAgcGVuZGluZzogbnVsbCwKICAgICAgICBpbnRlcmxlYXZlZDogbnVsbCwKICAgICAgICBsYW5lczogTm9MYW5lcwogICAgICB9LAogICAgICBlZmZlY3RzOiBudWxsCiAgICB9OwogICAgZmliZXIudXBkYXRlUXVldWUgPSBxdWV1ZTsKICB9CiAgZnVuY3Rpb24gY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgewogICAgLy8gQ2xvbmUgdGhlIHVwZGF0ZSBxdWV1ZSBmcm9tIGN1cnJlbnQuIFVubGVzcyBpdCdzIGFscmVhZHkgYSBjbG9uZS4KICAgIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOwogICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7CgogICAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHsKICAgICAgdmFyIGNsb25lID0gewogICAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSwKICAgICAgICBmaXJzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUsCiAgICAgICAgbGFzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZSwKICAgICAgICBzaGFyZWQ6IGN1cnJlbnRRdWV1ZS5zaGFyZWQsCiAgICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHMKICAgICAgfTsKICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjbG9uZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSkgewogICAgdmFyIHVwZGF0ZSA9IHsKICAgICAgZXZlbnRUaW1lOiBldmVudFRpbWUsCiAgICAgIGxhbmU6IGxhbmUsCiAgICAgIHRhZzogVXBkYXRlU3RhdGUsCiAgICAgIHBheWxvYWQ6IG51bGwsCiAgICAgIGNhbGxiYWNrOiBudWxsLAogICAgICBuZXh0OiBudWxsCiAgICB9OwogICAgcmV0dXJuIHVwZGF0ZTsKICB9CiAgZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKSB7CiAgICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTsKCiAgICBpZiAodXBkYXRlUXVldWUgPT09IG51bGwpIHsKICAgICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkOwoKICAgIHsKICAgICAgaWYgKGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9PT0gc2hhcmVkUXVldWUgJiYgIWRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUpIHsKICAgICAgICBlcnJvcignQW4gdXBkYXRlIChzZXRTdGF0ZSwgcmVwbGFjZVN0YXRlLCBvciBmb3JjZVVwZGF0ZSkgd2FzIHNjaGVkdWxlZCAnICsgJ2Zyb20gaW5zaWRlIGFuIHVwZGF0ZSBmdW5jdGlvbi4gVXBkYXRlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHVyZSwgJyArICd3aXRoIHplcm8gc2lkZS1lZmZlY3RzLiBDb25zaWRlciB1c2luZyBjb21wb25lbnREaWRVcGRhdGUgb3IgYSAnICsgJ2NhbGxiYWNrLicpOwoKICAgICAgICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIGlmIChpc1Vuc2FmZUNsYXNzUmVuZGVyUGhhc2VVcGRhdGUoKSkgewogICAgICAvLyBUaGlzIGlzIGFuIHVuc2FmZSByZW5kZXIgcGhhc2UgdXBkYXRlLiBBZGQgZGlyZWN0bHkgdG8gdGhlIHVwZGF0ZQogICAgICAvLyBxdWV1ZSBzbyB3ZSBjYW4gcHJvY2VzcyBpdCBpbW1lZGlhdGVseSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyLgogICAgICB2YXIgcGVuZGluZyA9IHNoYXJlZFF1ZXVlLnBlbmRpbmc7CgogICAgICBpZiAocGVuZGluZyA9PT0gbnVsbCkgewogICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC4KICAgICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDsKICAgICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7CiAgICAgIH0KCiAgICAgIHNoYXJlZFF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7IC8vIFVwZGF0ZSB0aGUgY2hpbGRMYW5lcyBldmVuIHRob3VnaCB3ZSdyZSBtb3N0IGxpa2VseSBhbHJlYWR5IHJlbmRlcmluZwogICAgICAvLyB0aGlzIGZpYmVyLiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpbiB0aGUgY2FzZSB3aGVyZSB5b3UKICAgICAgLy8gdXBkYXRlIGEgZGlmZmVyZW50IGNvbXBvbmVudCBkdXJpbmcgcmVuZGVyIHBoYXNlIHRoYW4gdGhlIG9uZSB0aGF0IGlzCiAgICAgIC8vIGN1cnJlbnRseSByZW5kZXJpbmdzIChhIHBhdHRlcm4gdGhhdCBpcyBhY2NvbXBhbmllZCBieSBhIHdhcm5pbmcpLgoKICAgICAgcmV0dXJuIHVuc2FmZV9tYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgbGFuZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZW5xdWV1ZUNvbmN1cnJlbnRDbGFzc1VwZGF0ZShmaWJlciwgc2hhcmVkUXVldWUsIHVwZGF0ZSwgbGFuZSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpIHsKICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlOwoKICAgIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkgewogICAgICAvLyBPbmx5IG9jY3VycyBpZiB0aGUgZmliZXIgaGFzIGJlZW4gdW5tb3VudGVkLgogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkOwoKICAgIGlmIChpc1RyYW5zaXRpb25MYW5lKGxhbmUpKSB7CiAgICAgIHZhciBxdWV1ZUxhbmVzID0gc2hhcmVkUXVldWUubGFuZXM7IC8vIElmIGFueSBlbnRhbmdsZWQgbGFuZXMgYXJlIG5vIGxvbmdlciBwZW5kaW5nIG9uIHRoZSByb290LCB0aGVuIHRoZXkgbXVzdAogICAgICAvLyBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaCByZXByZXNlbnRzCiAgICAgIC8vIGEgc3VwZXJzZXQgb2YgdGhlIGFjdHVhbGx5IHBlbmRpbmcgbGFuZXMuIEluIHNvbWUgY2FzZXMgd2UgbWF5IGVudGFuZ2xlCiAgICAgIC8vIG1vcmUgdGhhbiB3ZSBuZWVkIHRvLCBidXQgdGhhdCdzIE9LLiBJbiBmYWN0IGl0J3Mgd29yc2UgaWYgd2UgKmRvbid0KgogICAgICAvLyBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC4KCiAgICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuCgogICAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7CiAgICAgIHNoYXJlZFF1ZXVlLmxhbmVzID0gbmV3UXVldWVMYW5lczsgLy8gRXZlbiBpZiBxdWV1ZS5sYW5lcyBhbHJlYWR5IGluY2x1ZGUgbGFuZSwgd2UgZG9uJ3Qga25vdyBmb3IgY2VydGFpbiBpZgogICAgICAvLyB0aGUgbGFuZSBmaW5pc2hlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIGVudGFuZ2xlZCBpdC4gU28gd2UgbmVlZCB0bwogICAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLgoKICAgICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY2FwdHVyZWRVcGRhdGUpIHsKICAgIC8vIENhcHR1cmVkIHVwZGF0ZXMgYXJlIHVwZGF0ZXMgdGhhdCBhcmUgdGhyb3duIGJ5IGEgY2hpbGQgZHVyaW5nIHRoZSByZW5kZXIKICAgIC8vIHBoYXNlLiBUaGV5IHNob3VsZCBiZSBkaXNjYXJkZWQgaWYgdGhlIHJlbmRlciBpcyBhYm9ydGVkLiBUaGVyZWZvcmUsCiAgICAvLyB3ZSBzaG91bGQgb25seSBwdXQgdGhlbSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSwgbm90IHRoZSBjdXJyZW50IG9uZS4KICAgIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBDaGVjayBpZiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyBhIGNsb25lLgoKICAgIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlOwoKICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7CiAgICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOwoKICAgICAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHsKICAgICAgICAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlbgogICAgICAgIC8vIHdlIGJhaWwgb3V0IG9uIGEgcGFyZW50IGZpYmVyIHRoYXQgdGhlbiBjYXB0dXJlcyBhbiBlcnJvciB0aHJvd24gYnkKICAgICAgICAvLyBhIGNoaWxkLiBTaW5jZSB3ZSB3YW50IHRvIGFwcGVuZCB0aGUgdXBkYXRlIG9ubHkgdG8gdGhlIHdvcmstaW4KICAgICAgICAvLyAtcHJvZ3Jlc3MgcXVldWUsIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHVwZGF0ZXMuIFdlIHVzdWFsbHkgY2xvbmUgZHVyaW5nCiAgICAgICAgLy8gcHJvY2Vzc1VwZGF0ZVF1ZXVlLCBidXQgdGhhdCBkaWRuJ3QgaGFwcGVuIGluIHRoaXMgY2FzZSBiZWNhdXNlIHdlCiAgICAgICAgLy8gc2tpcHBlZCBvdmVyIHRoZSBwYXJlbnQgd2hlbiB3ZSBiYWlsZWQgb3V0LgogICAgICAgIHZhciBuZXdGaXJzdCA9IG51bGw7CiAgICAgICAgdmFyIG5ld0xhc3QgPSBudWxsOwogICAgICAgIHZhciBmaXJzdEJhc2VVcGRhdGUgPSBxdWV1ZS5maXJzdEJhc2VVcGRhdGU7CgogICAgICAgIGlmIChmaXJzdEJhc2VVcGRhdGUgIT09IG51bGwpIHsKICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgdXBkYXRlcyBhbmQgY2xvbmUgdGhlbS4KICAgICAgICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7CgogICAgICAgICAgZG8gewogICAgICAgICAgICB2YXIgY2xvbmUgPSB7CiAgICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGUuZXZlbnRUaW1lLAogICAgICAgICAgICAgIGxhbmU6IHVwZGF0ZS5sYW5lLAogICAgICAgICAgICAgIHRhZzogdXBkYXRlLnRhZywKICAgICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCwKICAgICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLAogICAgICAgICAgICAgIG5leHQ6IG51bGwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2xvbmU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2xvbmU7CiAgICAgICAgICAgICAgbmV3TGFzdCA9IGNsb25lOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDsKICAgICAgICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCk7IC8vIEFwcGVuZCB0aGUgY2FwdHVyZWQgdXBkYXRlIHRoZSBlbmQgb2YgdGhlIGNsb25lZCBsaXN0LgoKCiAgICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkgewogICAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNhcHR1cmVkVXBkYXRlOwogICAgICAgICAgICBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFRoZXJlIGFyZSBubyBiYXNlIHVwZGF0ZXMuCiAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTsKICAgICAgICB9CgogICAgICAgIHF1ZXVlID0gewogICAgICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLAogICAgICAgICAgZmlyc3RCYXNlVXBkYXRlOiBuZXdGaXJzdCwKICAgICAgICAgIGxhc3RCYXNlVXBkYXRlOiBuZXdMYXN0LAogICAgICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLAogICAgICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHMKICAgICAgICB9OwogICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gcXVldWU7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCgoKICAgIHZhciBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlOwoKICAgIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkgewogICAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTsKICAgIH0gZWxzZSB7CiAgICAgIGxhc3RCYXNlVXBkYXRlLm5leHQgPSBjYXB0dXJlZFVwZGF0ZTsKICAgIH0KCiAgICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlOwogIH0KCiAgZnVuY3Rpb24gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBwcmV2U3RhdGUsIG5leHRQcm9wcywgaW5zdGFuY2UpIHsKICAgIHN3aXRjaCAodXBkYXRlLnRhZykgewogICAgICBjYXNlIFJlcGxhY2VTdGF0ZToKICAgICAgICB7CiAgICAgICAgICB2YXIgcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkOwoKICAgICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTsKCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7CiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTsKCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTsKICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGV4aXREaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV4dFN0YXRlOwogICAgICAgICAgfSAvLyBTdGF0ZSBvYmplY3QKCgogICAgICAgICAgcmV0dXJuIHBheWxvYWQ7CiAgICAgICAgfQoKICAgICAgY2FzZSBDYXB0dXJlVXBkYXRlOgogICAgICAgIHsKICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7CiAgICAgICAgfQogICAgICAvLyBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaAoKICAgICAgY2FzZSBVcGRhdGVTdGF0ZToKICAgICAgICB7CiAgICAgICAgICB2YXIgX3BheWxvYWQgPSB1cGRhdGUucGF5bG9hZDsKICAgICAgICAgIHZhciBwYXJ0aWFsU3RhdGU7CgogICAgICAgICAgaWYgKHR5cGVvZiBfcGF5bG9hZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBlbnRlckRpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTsKCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7CiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTsKCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7CiAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3QKICAgICAgICAgICAgcGFydGlhbFN0YXRlID0gX3BheWxvYWQ7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLgogICAgICAgICAgICByZXR1cm4gcHJldlN0YXRlOwogICAgICAgICAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLgoKCiAgICAgICAgICByZXR1cm4gYXNzaWduKHt9LCBwcmV2U3RhdGUsIHBhcnRpYWxTdGF0ZSk7CiAgICAgICAgfQoKICAgICAgY2FzZSBGb3JjZVVwZGF0ZToKICAgICAgICB7CiAgICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9IHRydWU7CiAgICAgICAgICByZXR1cm4gcHJldlN0YXRlOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcHJldlN0YXRlOwogIH0KCiAgZnVuY3Rpb24gcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBwcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKSB7CiAgICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290CiAgICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTsKICAgIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7CgogICAgewogICAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQ7CiAgICB9CgogICAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTsKICAgIHZhciBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlOyAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZyB1cGRhdGVzLiBJZiBzbywgdHJhbnNmZXIgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS4KCiAgICB2YXIgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7CgogICAgaWYgKHBlbmRpbmdRdWV1ZSAhPT0gbnVsbCkgewogICAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7IC8vIFRoZSBwZW5kaW5nIHF1ZXVlIGlzIGNpcmN1bGFyLiBEaXNjb25uZWN0IHRoZSBwb2ludGVyIGJldHdlZW4gZmlyc3QKICAgICAgLy8gYW5kIGxhc3Qgc28gdGhhdCBpdCdzIG5vbi1jaXJjdWxhci4KCiAgICAgIHZhciBsYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTsKICAgICAgdmFyIGZpcnN0UGVuZGluZ1VwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlLm5leHQ7CiAgICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsOyAvLyBBcHBlbmQgcGVuZGluZyB1cGRhdGVzIHRvIGJhc2UgcXVldWUKCiAgICAgIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkgewogICAgICAgIGZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlOwogICAgICB9CgogICAgICBsYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlOyAvLyBJZiB0aGVyZSdzIGEgY3VycmVudCBxdWV1ZSwgYW5kIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGJhc2UgcXVldWUsIHRoZW4KICAgICAgLy8gd2UgbmVlZCB0byB0cmFuc2ZlciB0aGUgdXBkYXRlcyB0byB0aGF0IHF1ZXVlLCB0b28uIEJlY2F1c2UgdGhlIGJhc2UKICAgICAgLy8gcXVldWUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3Qgd2l0aCBubyBjeWNsZXMsIHdlIGNhbiBhcHBlbmQgdG8gYm90aAogICAgICAvLyBsaXN0cyBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2Ygc3RydWN0dXJhbCBzaGFyaW5nLgogICAgICAvLyBUT0RPOiBQYXNzIGBjdXJyZW50YCBhcyBhcmd1bWVudAoKICAgICAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7CgogICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkgewogICAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3QKICAgICAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsKICAgICAgICB2YXIgY3VycmVudExhc3RCYXNlVXBkYXRlID0gY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlOwoKICAgICAgICBpZiAoY3VycmVudExhc3RCYXNlVXBkYXRlICE9PSBsYXN0QmFzZVVwZGF0ZSkgewogICAgICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkgewogICAgICAgICAgICBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3VycmVudExhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7CiAgICAgICAgICB9CgogICAgICAgICAgY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7CiAgICAgICAgfQogICAgICB9CiAgICB9IC8vIFRoZXNlIHZhbHVlcyBtYXkgY2hhbmdlIGFzIHdlIHByb2Nlc3MgdGhlIHF1ZXVlLgoKCiAgICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7CiAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiB1cGRhdGVzIHRvIGNvbXB1dGUgdGhlIHJlc3VsdC4KICAgICAgdmFyIG5ld1N0YXRlID0gcXVldWUuYmFzZVN0YXRlOyAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIGFjY3VtdWxhdGUgdGhpcy4gSW5zdGVhZCwgd2UgY2FuIHJlbW92ZSByZW5kZXJMYW5lcwogICAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy4KCiAgICAgIHZhciBuZXdMYW5lcyA9IE5vTGFuZXM7CiAgICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsOwogICAgICB2YXIgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbnVsbDsKICAgICAgdmFyIG5ld0xhc3RCYXNlVXBkYXRlID0gbnVsbDsKICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTsKCiAgICAgIGRvIHsKICAgICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lOwogICAgICAgIHZhciB1cGRhdGVFdmVudFRpbWUgPSB1cGRhdGUuZXZlbnRUaW1lOwoKICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHsKICAgICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3QKICAgICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZQogICAgICAgICAgLy8gdXBkYXRlL3N0YXRlLgogICAgICAgICAgdmFyIGNsb25lID0gewogICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSwKICAgICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSwKICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLAogICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCwKICAgICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjaywKICAgICAgICAgICAgbmV4dDogbnVsbAogICAgICAgICAgfTsKCiAgICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHsKICAgICAgICAgICAgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUgPSBjbG9uZTsKICAgICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBjbG9uZTsKICAgICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLgoKCiAgICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIHVwZGF0ZUxhbmUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIGhhdmUgc3VmZmljaWVudCBwcmlvcml0eS4KICAgICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkgewogICAgICAgICAgICB2YXIgX2Nsb25lID0gewogICAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLAogICAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0CiAgICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzbwogICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBuZXZlciBiZSBza2lwcGVkIGJ5IHRoZSBjaGVjayBhYm92ZS4KICAgICAgICAgICAgICBsYW5lOiBOb0xhbmUsCiAgICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLAogICAgICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLAogICAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssCiAgICAgICAgICAgICAgbmV4dDogbnVsbAogICAgICAgICAgICB9OwogICAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBfY2xvbmU7CiAgICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuCgoKICAgICAgICAgIG5ld1N0YXRlID0gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBuZXdTdGF0ZSwgcHJvcHMsIGluc3RhbmNlKTsKICAgICAgICAgIHZhciBjYWxsYmFjayA9IHVwZGF0ZS5jYWxsYmFjazsKCiAgICAgICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwgJiYgLy8gSWYgdGhlIHVwZGF0ZSB3YXMgYWxyZWFkeSBjb21taXR0ZWQsIHdlIHNob3VsZCBub3QgcXVldWUgaXRzCiAgICAgICAgICAvLyBjYWxsYmFjayBhZ2Fpbi4KICAgICAgICAgIHVwZGF0ZS5sYW5lICE9PSBOb0xhbmUpIHsKICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gQ2FsbGJhY2s7CiAgICAgICAgICAgIHZhciBlZmZlY3RzID0gcXVldWUuZWZmZWN0czsKCiAgICAgICAgICAgIGlmIChlZmZlY3RzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGVmZmVjdHMucHVzaCh1cGRhdGUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDsKCiAgICAgICAgaWYgKHVwZGF0ZSA9PT0gbnVsbCkgewogICAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7CgogICAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXcKICAgICAgICAgICAgLy8gcGVuZGluZyB1cGRhdGVzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgYW5kIGtlZXAgcHJvY2Vzc2luZy4KICAgICAgICAgICAgdmFyIF9sYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTsgLy8gSW50ZW50aW9uYWxseSB1bnNvdW5kLiBQZW5kaW5nIHVwZGF0ZXMgZm9ybSBhIGNpcmN1bGFyIGxpc3QsIGJ1dCB3ZQogICAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS4KCiAgICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7CiAgICAgICAgICAgIF9sYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDsKICAgICAgICAgICAgdXBkYXRlID0gX2ZpcnN0UGVuZGluZ1VwZGF0ZTsKICAgICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7CiAgICAgICAgICAgIHF1ZXVlLnNoYXJlZC5wZW5kaW5nID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gd2hpbGUgKHRydWUpOwoKICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7CiAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7CiAgICAgIH0KCiAgICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTsKICAgICAgcXVldWUuZmlyc3RCYXNlVXBkYXRlID0gbmV3Rmlyc3RCYXNlVXBkYXRlOwogICAgICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlOyAvLyBJbnRlcmxlYXZlZCB1cGRhdGVzIGFyZSBzdG9yZWQgb24gYSBzZXBhcmF0ZSBxdWV1ZS4gV2UgYXJlbid0IGdvaW5nIHRvCiAgICAgIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzCiAgICAgIC8vIGFyZSByZW1haW5pbmcuCgogICAgICB2YXIgbGFzdEludGVybGVhdmVkID0gcXVldWUuc2hhcmVkLmludGVybGVhdmVkOwoKICAgICAgaWYgKGxhc3RJbnRlcmxlYXZlZCAhPT0gbnVsbCkgewogICAgICAgIHZhciBpbnRlcmxlYXZlZCA9IGxhc3RJbnRlcmxlYXZlZDsKCiAgICAgICAgZG8gewogICAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCBpbnRlcmxlYXZlZC5sYW5lKTsKICAgICAgICAgIGludGVybGVhdmVkID0gaW50ZXJsZWF2ZWQubmV4dDsKICAgICAgICB9IHdoaWxlIChpbnRlcmxlYXZlZCAhPT0gbGFzdEludGVybGVhdmVkKTsKICAgICAgfSBlbHNlIGlmIChmaXJzdEJhc2VVcGRhdGUgPT09IG51bGwpIHsKICAgICAgICAvLyBgcXVldWUubGFuZXNgIGlzIHVzZWQgZm9yIGVudGFuZ2xpbmcgdHJhbnNpdGlvbnMuIFdlIGNhbiBzZXQgaXQgYmFjayB0bwogICAgICAgIC8vIHplcm8gb25jZSB0aGUgcXVldWUgaXMgZW1wdHkuCiAgICAgICAgcXVldWUuc2hhcmVkLmxhbmVzID0gTm9MYW5lczsKICAgICAgfSAvLyBTZXQgdGhlIHJlbWFpbmluZyBleHBpcmF0aW9uIHRpbWUgdG8gYmUgd2hhdGV2ZXIgaXMgcmVtYWluaW5nIGluIHRoZSBxdWV1ZS4KICAgICAgLy8gVGhpcyBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHRoZSBvbmx5IHR3byBvdGhlciB0aGluZ3MgdGhhdCBjb250cmlidXRlIHRvCiAgICAgIC8vIGV4cGlyYXRpb24gdGltZSBhcmUgcHJvcHMgYW5kIGNvbnRleHQuIFdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiB0aGUKICAgICAgLy8gYmVnaW4gcGhhc2UgYnkgdGhlIHRpbWUgd2Ugc3RhcnQgcHJvY2Vzc2luZyB0aGUgcXVldWUsIHNvIHdlJ3ZlIGFscmVhZHkKICAgICAgLy8gZGVhbHQgd2l0aCB0aGUgcHJvcHMuIENvbnRleHQgaW4gY29tcG9uZW50cyB0aGF0IHNwZWNpZnkKICAgICAgLy8gc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHRyaWNreTsgYnV0IHdlJ2xsIGhhdmUgdG8gYWNjb3VudCBmb3IKICAgICAgLy8gdGhhdCByZWdhcmRsZXNzLgoKCiAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpOwogICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG5ld0xhbmVzOwogICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7CiAgICB9CgogICAgewogICAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7CiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgYXMgY2FsbGJhY2suIEV4cGVjdGVkIGEgZnVuY3Rpb24uIEluc3RlYWQgJyArICgicmVjZWl2ZWQ6ICIgKyBjYWxsYmFjaykpOwogICAgfQoKICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCk7CiAgfQoKICBmdW5jdGlvbiByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpIHsKICAgIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7CiAgfQogIGZ1bmN0aW9uIGNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSB7CiAgICByZXR1cm4gaGFzRm9yY2VVcGRhdGU7CiAgfQogIGZ1bmN0aW9uIGNvbW1pdFVwZGF0ZVF1ZXVlKGZpbmlzaGVkV29yaywgZmluaXNoZWRRdWV1ZSwgaW5zdGFuY2UpIHsKICAgIC8vIENvbW1pdCB0aGUgZWZmZWN0cwogICAgdmFyIGVmZmVjdHMgPSBmaW5pc2hlZFF1ZXVlLmVmZmVjdHM7CiAgICBmaW5pc2hlZFF1ZXVlLmVmZmVjdHMgPSBudWxsOwoKICAgIGlmIChlZmZlY3RzICE9PSBudWxsKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWZmZWN0cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBlZmZlY3QgPSBlZmZlY3RzW2ldOwogICAgICAgIHZhciBjYWxsYmFjayA9IGVmZmVjdC5jYWxsYmFjazsKCiAgICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7CiAgICAgICAgICBlZmZlY3QuY2FsbGJhY2sgPSBudWxsOwogICAgICAgICAgY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBpbnN0YW5jZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2YXIgZmFrZUludGVybmFsSW5zdGFuY2UgPSB7fTsgLy8gUmVhY3QuQ29tcG9uZW50IHVzZXMgYSBzaGFyZWQgZnJvemVuIG9iamVjdCBieSBkZWZhdWx0LgogIC8vIFdlJ2xsIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgbGVnYWN5IHJlZnMuCgogIHZhciBlbXB0eVJlZnNPYmplY3QgPSBuZXcgUmVhY3QuQ29tcG9uZW50KCkucmVmczsKICB2YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50OwogIHZhciBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGU7CiAgdmFyIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZTsKICB2YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZTsKICB2YXIgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlOwogIHZhciB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGU7CiAgdmFyIHdhcm5PbkludmFsaWRDYWxsYmFjazsKICB2YXIgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGU7CiAgdmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzOwogIHZhciBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGU7CgogIHsKICAgIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTsKICAgIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBTZXQoKTsKICAgIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTsKICAgIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUgPSBuZXcgU2V0KCk7CiAgICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZSA9IG5ldyBTZXQoKTsKICAgIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTsKICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzID0gbmV3IFNldCgpOwogICAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlID0gbmV3IFNldCgpOwogICAgdmFyIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjayA9IG5ldyBTZXQoKTsKCiAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHsKICAgICAgaWYgKGNhbGxiYWNrID09PSBudWxsIHx8IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIGtleSA9IGNhbGxlck5hbWUgKyAnXycgKyBjYWxsYmFjazsKCiAgICAgIGlmICghZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmhhcyhrZXkpKSB7CiAgICAgICAgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmFkZChrZXkpOwoKICAgICAgICBlcnJvcignJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGNhbGxiYWNrKTsKICAgICAgfQogICAgfTsKCiAgICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUgPSBmdW5jdGlvbiAodHlwZSwgcGFydGlhbFN0YXRlKSB7CiAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdDb21wb25lbnQnOwoKICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7CgogICAgICAgICAgZXJyb3IoJyVzLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpOiBBIHZhbGlkIHN0YXRlIG9iamVjdCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gJyArICdZb3UgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQuJywgY29tcG9uZW50TmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OyAvLyBUaGlzIGlzIHNvIGdyb3NzIGJ1dCBpdCdzIGF0IGxlYXN0IG5vbi1jcml0aWNhbCBhbmQgY2FuIGJlIHJlbW92ZWQgaWYKICAgIC8vIGl0IGNhdXNlcyBwcm9ibGVtcy4gVGhpcyBpcyBtZWFudCB0byBnaXZlIGEgbmljZXIgZXJyb3IgbWVzc2FnZSBmb3IKICAgIC8vIFJlYWN0RE9NMTUudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocmVhY3RET00xNkNvbXBvbmVudCwKICAgIC8vIC4uLikpIHdoaWNoIG90aGVyd2lzZSB0aHJvd3MgYSAiX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGEgZnVuY3Rpb24iCiAgICAvLyBleGNlcHRpb24uCgoKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYWtlSW50ZXJuYWxJbnN0YW5jZSwgJ19wcm9jZXNzQ2hpbGRDb250ZXh0JywgewogICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ19wcm9jZXNzQ2hpbGRDb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgaW4gUmVhY3QgMTYrLiBUaGlzIGxpa2VseSAnICsgJ21lYW5zIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBhbmQgYXJlIGF0dGVtcHRpbmcgdG8gbmVzdCAnICsgJ2EgUmVhY3QgMTUgdHJlZSBpbnNpZGUgYSBSZWFjdCAxNiB0cmVlIHVzaW5nICcgKyAidW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIsIHdoaWNoIGlzbid0IHN1cHBvcnRlZC4gVHJ5ICIgKyAndG8gbWFrZSBzdXJlIHlvdSBoYXZlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QgKGFuZCBpZGVhbGx5LCBzd2l0Y2ggJyArICd0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLicpOwogICAgICB9CiAgICB9KTsKICAgIE9iamVjdC5mcmVlemUoZmFrZUludGVybmFsSW5zdGFuY2UpOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV4dFByb3BzKSB7CiAgICB2YXIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsKICAgIHZhciBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpOwoKICAgIHsKICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgewogICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpOwoKICAgICAgICB0cnkgewogICAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy4KICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZShjdG9yLCBwYXJ0aWFsU3RhdGUpOwogICAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLgoKCiAgICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCA/IHByZXZTdGF0ZSA6IGFzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpOwogICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZQogICAgLy8gYmFzZSBzdGF0ZS4KCiAgICBpZiAod29ya0luUHJvZ3Jlc3MubGFuZXMgPT09IE5vTGFuZXMpIHsKICAgICAgLy8gUXVldWUgaXMgYWx3YXlzIG5vbi1udWxsIGZvciBjbGFzc2VzCiAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOwogICAgICB1cGRhdGVRdWV1ZS5iYXNlU3RhdGUgPSBtZW1vaXplZFN0YXRlOwogICAgfQogIH0KCiAgdmFyIGNsYXNzQ29tcG9uZW50VXBkYXRlciA9IHsKICAgIGlzTW91bnRlZDogaXNNb3VudGVkLAogICAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAoaW5zdCwgcGF5bG9hZCwgY2FsbGJhY2spIHsKICAgICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpOwogICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpOwogICAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTsKICAgICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpOwogICAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7CgogICAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkgewogICAgICAgIHsKICAgICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3NldFN0YXRlJyk7CiAgICAgICAgfQoKICAgICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgfQoKICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpOwoKICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHsKICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7CiAgICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7CiAgICAgIH0KCiAgICAgIHsKICAgICAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpOwogICAgICB9CiAgICB9LAogICAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7CiAgICAgIHZhciBmaWJlciA9IGdldChpbnN0KTsKICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTsKICAgICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7CiAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTsKICAgICAgdXBkYXRlLnRhZyA9IFJlcGxhY2VTdGF0ZTsKICAgICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkOwoKICAgICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHsKICAgICAgICB7CiAgICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdyZXBsYWNlU3RhdGUnKTsKICAgICAgICB9CgogICAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICB9CgogICAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7CgogICAgICBpZiAocm9vdCAhPT0gbnVsbCkgewogICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTsKICAgICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTsKICAgICAgfQoKICAgICAgewogICAgICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7CiAgICAgIH0KICAgIH0sCiAgICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykgewogICAgICB2YXIgZmliZXIgPSBnZXQoaW5zdCk7CiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7CiAgICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpOwogICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7CiAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTsKCiAgICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7CiAgICAgICAgewogICAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTsKICAgICAgICB9CgogICAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICB9CgogICAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSwgbGFuZSk7CgogICAgICBpZiAocm9vdCAhPT0gbnVsbCkgewogICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTsKICAgICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGZpYmVyLCBsYW5lKTsKICAgICAgfQoKICAgICAgewogICAgICAgIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7CiAgICAgIH0KICAgIH0KICB9OwoKICBmdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB7CiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7CgogICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIHNob3VsZFVwZGF0ZSA9IGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTsKCiAgICAgIHsKICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7CiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTsKCiAgICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLgogICAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGVycm9yKCclcy5zaG91bGRDb21wb25lbnRVcGRhdGUoKTogUmV0dXJuZWQgdW5kZWZpbmVkIGluc3RlYWQgb2YgYSAnICsgJ2Jvb2xlYW4gdmFsdWUuIE1ha2Ugc3VyZSB0byByZXR1cm4gdHJ1ZSBvciBmYWxzZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikgfHwgJ0NvbXBvbmVudCcpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHNob3VsZFVwZGF0ZTsKICAgIH0KCiAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpIHsKICAgICAgcmV0dXJuICFzaGFsbG93RXF1YWwob2xkUHJvcHMsIG5ld1Byb3BzKSB8fCAhc2hhbGxvd0VxdWFsKG9sZFN0YXRlLCBuZXdTdGF0ZSk7CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKSB7CiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7CgogICAgewogICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JzsKICAgICAgdmFyIHJlbmRlclByZXNlbnQgPSBpbnN0YW5jZS5yZW5kZXI7CgogICAgICBpZiAoIXJlbmRlclByZXNlbnQpIHsKICAgICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgZXJyb3IoJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IGRpZCB5b3UgYWNjaWRlbnRhbGx5IHJldHVybiBhbiBvYmplY3QgZnJvbSB0aGUgY29uc3RydWN0b3I/JywgbmFtZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUgJiYgIWluc3RhbmNlLmdldEluaXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCAmJiAhaW5zdGFuY2Uuc3RhdGUpIHsKICAgICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpOwogICAgICB9CgogICAgICBpZiAoaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzICYmICFpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHsKICAgICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ1VzZSBhIHN0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgZGVmYXVsdFByb3BzIGluc3RlYWQuJywgbmFtZSk7CiAgICAgIH0KCiAgICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHsKICAgICAgICBlcnJvcigncHJvcFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgcHJvcFR5cGVzIGluc3RlYWQuJywgbmFtZSk7CiAgICAgIH0KCiAgICAgIGlmIChpbnN0YW5jZS5jb250ZXh0VHlwZSkgewogICAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7CiAgICAgIH0KCiAgICAgIHsKICAgICAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGVzKSB7CiAgICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoY3Rvci5jb250ZXh0VHlwZSAmJiBjdG9yLmNvbnRleHRUeXBlcyAmJiAhZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuaGFzKGN0b3IpKSB7CiAgICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5hZGQoY3Rvcik7CgogICAgICAgICAgZXJyb3IoJyVzIGRlY2xhcmVzIGJvdGggY29udGV4dFR5cGVzIGFuZCBjb250ZXh0VHlwZSBzdGF0aWMgcHJvcGVydGllcy4gJyArICdUaGUgbGVnYWN5IGNvbnRleHRUeXBlcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFNob3VsZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVhbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArICdleHBlY3RlZCB0byByZXR1cm4gYSB2YWx1ZS4nLCBuYW1lKTsKICAgICAgfQoKICAgICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkuICcgKyAnc2hvdWxkQ29tcG9uZW50VXBkYXRlIHNob3VsZCBub3QgYmUgdXNlZCB3aGVuIGV4dGVuZGluZyBSZWFjdC5QdXJlQ29tcG9uZW50LiAnICsgJ1BsZWFzZSBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB1c2VkLicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQSBwdXJlIGNvbXBvbmVudCcpOwogICAgICB9CgogICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVubW91bnQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFVubW91bnQoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCBuYW1lKTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFJlY2VpdmVQcm9wcygpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0lmIHlvdSBtZWFudCB0byB1cGRhdGUgdGhlIHN0YXRlIGluIHJlc3BvbnNlIHRvIGNoYW5naW5nIHByb3BzLCAnICsgJ3VzZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCkuIElmIHlvdSBtZWFudCB0byBmZXRjaCBkYXRhIG9yICcgKyAncnVuIHNpZGUtZWZmZWN0cyBvciBtdXRhdGlvbnMgYWZ0ZXIgUmVhY3QgaGFzIHVwZGF0ZWQgdGhlIFVJLCB1c2UgY29tcG9uZW50RGlkVXBkYXRlKCkuJywgbmFtZSk7CiAgICAgIH0KCiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpOwogICAgICB9CgogICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKTsKICAgICAgfQoKICAgICAgdmFyIGhhc011dGF0ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzICE9PSBuZXdQcm9wczsKCiAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gdW5kZWZpbmVkICYmIGhhc011dGF0ZWRQcm9wcykgewogICAgICAgIGVycm9yKCclcyguLi4pOiBXaGVuIGNhbGxpbmcgc3VwZXIoKSBpbiBgJXNgLCBtYWtlIHN1cmUgdG8gcGFzcyAnICsgInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLiIsIG5hbWUsIG5hbWUpOwogICAgICB9CgogICAgICBpZiAoaW5zdGFuY2UuZGVmYXVsdFByb3BzKSB7CiAgICAgICAgZXJyb3IoJ1NldHRpbmcgZGVmYXVsdFByb3BzIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgaWdub3JlZC4nICsgJyBJbnN0ZWFkLCBkZWZpbmUgZGVmYXVsdFByb3BzIGFzIGEgc3RhdGljIHByb3BlcnR5IG9uICVzLicsIG5hbWUsIG5hbWUpOwogICAgICB9CgogICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgIWRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5oYXMoY3RvcikpIHsKICAgICAgICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuYWRkKGN0b3IpOwoKICAgICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjb21wb25lbnREaWRVcGRhdGUoKS4gJyArICdUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoY3RvcikpOwogICAgICB9CgogICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7CiAgICAgIH0KCiAgICAgIGlmICh0eXBlb2YgY3Rvci5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBpcyBkZWZpbmVkIGFzIGEgc3RhdGljIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kLicsIG5hbWUpOwogICAgICB9CgogICAgICB2YXIgX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGU7CgogICAgICBpZiAoX3N0YXRlICYmICh0eXBlb2YgX3N0YXRlICE9PSAnb2JqZWN0JyB8fCBpc0FycmF5KF9zdGF0ZSkpKSB7CiAgICAgICAgZXJyb3IoJyVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbCcsIG5hbWUpOwogICAgICB9CgogICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY3Rvci5jaGlsZENvbnRleHRUeXBlcyAhPT0gJ29iamVjdCcpIHsKICAgICAgICBlcnJvcignJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byAnICsgJ3VzZSBnZXRDaGlsZENvbnRleHQoKS4nLCBuYW1lKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSkgewogICAgaW5zdGFuY2UudXBkYXRlciA9IGNsYXNzQ29tcG9uZW50VXBkYXRlcjsKICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGluc3RhbmNlOyAvLyBUaGUgaW5zdGFuY2UgbmVlZHMgYWNjZXNzIHRvIHRoZSBmaWJlciBzbyB0aGF0IGl0IGNhbiBzY2hlZHVsZSB1cGRhdGVzCgogICAgc2V0KGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcyk7CgogICAgewogICAgICBpbnN0YW5jZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gZmFrZUludGVybmFsSW5zdGFuY2U7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBwcm9wcykgewogICAgdmFyIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gZmFsc2U7CiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0OwogICAgdmFyIGNvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7CiAgICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlOwoKICAgIHsKICAgICAgaWYgKCdjb250ZXh0VHlwZScgaW4gY3RvcikgewogICAgICAgIHZhciBpc1ZhbGlkID0gLy8gQWxsb3cgbnVsbCBmb3IgY29uZGl0aW9uYWwgZGVjbGFyYXRpb24KICAgICAgICBjb250ZXh0VHlwZSA9PT0gbnVsbCB8fCBjb250ZXh0VHlwZSAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgJiYgY29udGV4dFR5cGUuX2NvbnRleHQgPT09IHVuZGVmaW5lZDsgLy8gTm90IGEgPENvbnRleHQuQ29uc3VtZXI+CgogICAgICAgIGlmICghaXNWYWxpZCAmJiAhZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmhhcyhjdG9yKSkgewogICAgICAgICAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmFkZChjdG9yKTsKICAgICAgICAgIHZhciBhZGRlbmR1bSA9ICcnOwoKICAgICAgICAgIGlmIChjb250ZXh0VHlwZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gdW5kZWZpbmVkLiAnICsgJ1RoaXMgY2FuIGJlIGNhdXNlZCBieSBhIHR5cG8gb3IgYnkgbWl4aW5nIHVwIG5hbWVkIGFuZCBkZWZhdWx0IGltcG9ydHMuICcgKyAnVGhpcyBjYW4gYWxzbyBoYXBwZW4gZHVlIHRvIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSwgc28gJyArICd0cnkgbW92aW5nIHRoZSBjcmVhdGVDb250ZXh0KCkgY2FsbCB0byBhIHNlcGFyYXRlIGZpbGUuJzsKICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRUeXBlICE9PSAnb2JqZWN0JykgewogICAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGEgJyArIHR5cGVvZiBjb250ZXh0VHlwZSArICcuJzsKICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUpIHsKICAgICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuUHJvdmlkZXIgaW5zdGVhZD8nOwogICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0VHlwZS5fY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIC8vIDxDb250ZXh0LkNvbnN1bWVyPgogICAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Db25zdW1lciBpbnN0ZWFkPyc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGFuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjb250ZXh0VHlwZSkuam9pbignLCAnKSArICd9Lic7CiAgICAgICAgICB9CgogICAgICAgICAgZXJyb3IoJyVzIGRlZmluZXMgYW4gaW52YWxpZCBjb250ZXh0VHlwZS4gJyArICdjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lcycsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7CiAgICAgIGNvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7CiAgICB9IGVsc2UgewogICAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpOwogICAgICB2YXIgY29udGV4dFR5cGVzID0gY3Rvci5jb250ZXh0VHlwZXM7CiAgICAgIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gY29udGV4dFR5cGVzICE9PSBudWxsICYmIGNvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkOwogICAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0OwogICAgfQoKICAgIHZhciBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gSW5zdGFudGlhdGUgdHdpY2UgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLgoKICAgIHsKICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgewogICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpOwoKICAgICAgICB0cnkgewogICAgICAgICAgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2YXIgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGUgIT09IG51bGwgJiYgaW5zdGFuY2Uuc3RhdGUgIT09IHVuZGVmaW5lZCA/IGluc3RhbmNlLnN0YXRlIDogbnVsbDsKICAgIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpOwoKICAgIHsKICAgICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBzdGF0ZSA9PT0gbnVsbCkgewogICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnOwoKICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5hZGQoY29tcG9uZW50TmFtZSk7CgogICAgICAgICAgZXJyb3IoJ2Alc2AgdXNlcyBgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzYCBidXQgaXRzIGluaXRpYWwgc3RhdGUgaXMgJyArICclcy4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuIEluc3RlYWQsIGRlZmluZSB0aGUgaW5pdGlhbCBzdGF0ZSBieSAnICsgJ2Fzc2lnbmluZyBhbiBvYmplY3QgdG8gYHRoaXMuc3RhdGVgIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBgJXNgLiAnICsgJ1RoaXMgZW5zdXJlcyB0aGF0IGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGFyZ3VtZW50cyBoYXZlIGEgY29uc2lzdGVudCBzaGFwZS4nLCBjb21wb25lbnROYW1lLCBpbnN0YW5jZS5zdGF0ZSA9PT0gbnVsbCA/ICdudWxsJyA6ICd1bmRlZmluZWQnLCBjb21wb25lbnROYW1lKTsKICAgICAgICB9CiAgICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCAidW5zYWZlIiBsaWZlY3ljbGVzIHdvbid0IGJlIGNhbGxlZC4KICAgICAgLy8gV2FybiBhYm91dCB0aGVzZSBsaWZlY3ljbGVzIGlmIHRoZXkgYXJlIHByZXNlbnQuCiAgICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC4KCgogICAgICBpZiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsOwogICAgICAgIHZhciBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gbnVsbDsKICAgICAgICB2YXIgZm91bmRXaWxsVXBkYXRlTmFtZSA9IG51bGw7CgogICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7CiAgICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JzsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCc7CiAgICAgICAgfQoKICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7CiAgICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJzsKICAgICAgICB9CgogICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHsKICAgICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnY29tcG9uZW50V2lsbFVwZGF0ZSc7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAnVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUnOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsIHx8IGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwpIHsKICAgICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JzsKCiAgICAgICAgICB2YXIgbmV3QXBpTmFtZSA9IHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKScgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7CgogICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmhhcyhfY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpOwoKICAgICAgICAgICAgZXJyb3IoJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxuXG4nICsgJyVzIHVzZXMgJXMgYnV0IGFsc28gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZWdhY3kgbGlmZWN5Y2xlczolcyVzJXNcblxuJyArICdUaGUgYWJvdmUgbGlmZWN5Y2xlcyBzaG91bGQgYmUgcmVtb3ZlZC4gTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTpcbicgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcycsIF9jb21wb25lbnROYW1lLCBuZXdBcGlOYW1lLCBmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgPyAiXG4gICIgKyBmb3VuZFdpbGxNb3VudE5hbWUgOiAnJywgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCA/ICJcbiAgIiArIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgOiAnJywgZm91bmRXaWxsVXBkYXRlTmFtZSAhPT0gbnVsbCA/ICJcbiAgIiArIGZvdW5kV2lsbFVwZGF0ZU5hbWUgOiAnJyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS4KICAgIC8vIFJlYWN0RmliZXJDb250ZXh0IHVzdWFsbHkgdXBkYXRlcyB0aGlzIGNhY2hlIGJ1dCBjYW4ndCBmb3IgbmV3bHktY3JlYXRlZCBpbnN0YW5jZXMuCgoKICAgIGlmIChpc0xlZ2FjeUNvbnRleHRDb25zdW1lcikgewogICAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7CiAgICB9CgogICAgcmV0dXJuIGluc3RhbmNlOwogIH0KCiAgZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHsKICAgIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlOwoKICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpOwogICAgfQoKICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7CiAgICB9CgogICAgaWYgKG9sZFN0YXRlICE9PSBpbnN0YW5jZS5zdGF0ZSkgewogICAgICB7CiAgICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgImRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyAiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCcpOwogICAgICB9CgogICAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpIHsKICAgIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlOwoKICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7CiAgICB9CgogICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpOwogICAgfQoKICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gb2xkU3RhdGUpIHsKICAgICAgewogICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCc7CgogICAgICAgIGlmICghZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkgewogICAgICAgICAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTsKCiAgICAgICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gJyArICJ0aGlzLnN0YXRlIGlzIGRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyAiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpOwogICAgfQogIH0gLy8gSW52b2tlcyB0aGUgbW91bnQgbGlmZS1jeWNsZXMgb24gYSBwcmV2aW91c2x5IG5ldmVyIHJlbmRlcmVkIGluc3RhbmNlLgoKCiAgZnVuY3Rpb24gbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHsKICAgIHsKICAgICAgY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcyk7CiAgICB9CgogICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOwogICAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wczsKICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsKICAgIGluc3RhbmNlLnJlZnMgPSBlbXB0eVJlZnNPYmplY3Q7CiAgICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpOwogICAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTsKCiAgICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkgewogICAgICBpbnN0YW5jZS5jb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7CiAgICAgIGluc3RhbmNlLmNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpOwogICAgfQoKICAgIHsKICAgICAgaWYgKGluc3RhbmNlLnN0YXRlID09PSBuZXdQcm9wcykgewogICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnOwoKICAgICAgICBpZiAoIWRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlLmhhcyhjb21wb25lbnROYW1lKSkgewogICAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpOwoKICAgICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgImJlY2F1c2UgdXBkYXRlcyB0byBwcm9wcyB3b24ndCBiZSByZWZsZWN0ZWQgaW4gc3RhdGUuICIgKyAnSW4gbW9zdCBjYXNlcywgaXQgaXMgYmV0dGVyIHRvIHVzZSBwcm9wcyBkaXJlY3RseS4nLCBjb21wb25lbnROYW1lKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgewogICAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7CiAgICAgIH0KCiAgICAgIHsKICAgICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpOwogICAgICB9CiAgICB9CgogICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlOwogICAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOwoKICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTsKICAgICAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlOwogICAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cywKICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuCgoKICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkgewogICAgICBjYWxsQ29tcG9uZW50V2lsbE1vdW50KHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7IC8vIElmIHdlIGhhZCBhZGRpdGlvbmFsIHN0YXRlIHVwZGF0ZXMgZHVyaW5nIHRoaXMgbGlmZS1jeWNsZSwgbGV0J3MKICAgICAgLy8gcHJvY2VzcyB0aGVtIG5vdy4KCiAgICAgIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7CiAgICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsKICAgIH0KCiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlOwoKICAgICAgewogICAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljOwogICAgICB9CgogICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHsKICAgICAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2OwogICAgICB9CgogICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHsKICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsKICAgIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7CiAgICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzOwogICAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0OwogICAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTsKICAgIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDsKCiAgICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkgewogICAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTsKICAgICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0KTsKICAgIH0KCiAgICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7CiAgICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0CiAgICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlICJjdXJyZW50Ii4gSG93ZXZlciwKICAgIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgImN1cnJlbnQiIHByb3BzLgogICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsCiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLgoKICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkgewogICAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7CiAgICAgICAgY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpOwogICAgICB9CiAgICB9CgogICAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTsKICAgIHZhciBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7CiAgICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlOwogICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTsKICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsKCiAgICBpZiAob2xkUHJvcHMgPT09IG5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpKSB7CiAgICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZQogICAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLgogICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7CgogICAgICAgIHsKICAgICAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7CiAgICAgICAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2OwogICAgICAgIH0KCiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFnczsKICAgICAgfQoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTsKICAgICAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlOwogICAgfQoKICAgIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7CgogICAgaWYgKHNob3VsZFVwZGF0ZSkgewogICAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cywKICAgICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy4KICAgICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkgewogICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTsKICAgICAgICB9CgogICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHZhciBfZmliZXJGbGFncyA9IFVwZGF0ZTsKCiAgICAgICAgewogICAgICAgICAgX2ZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7CiAgICAgICAgICBfZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjsKICAgICAgICB9CgogICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IF9maWJlckZsYWdzOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGUKICAgICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC4KICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHZhciBfZmliZXJGbGFnczIgPSBVcGRhdGU7CgogICAgICAgIHsKICAgICAgICAgIF9maWJlckZsYWdzMiB8PSBMYXlvdXRTdGF0aWM7CiAgICAgICAgfQoKICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHsKICAgICAgICAgIF9maWJlckZsYWdzMiB8PSBNb3VudExheW91dERldjsKICAgICAgICB9CgogICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IF9maWJlckZsYWdzMjsKICAgICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlCiAgICAgIC8vIG1lbW9pemVkIHN0YXRlIHRvIGluZGljYXRlIHRoYXQgdGhpcyB3b3JrIGNhbiBiZSByZXVzZWQuCgoKICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzOwogICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7CiAgICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW4KICAgIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLgoKCiAgICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzOwogICAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTsKICAgIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDsKICAgIHJldHVybiBzaG91bGRVcGRhdGU7CiAgfSAvLyBJbnZva2VzIHRoZSB1cGRhdGUgbGlmZS1jeWNsZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgaXQgc2hvdWxkbid0IHJlcmVuZGVyLgoKCiAgZnVuY3Rpb24gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7CiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7CiAgICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsKICAgIHZhciB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzOwogICAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPyB1bnJlc29sdmVkT2xkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHVucmVzb2x2ZWRPbGRQcm9wcyk7CiAgICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzOwogICAgdmFyIHVucmVzb2x2ZWROZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsKICAgIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDsKICAgIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7CiAgICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7CgogICAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHsKICAgICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgbmV4dFVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7CiAgICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dFVubWFza2VkQ29udGV4dCk7CiAgICB9CgogICAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOwogICAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdAogICAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSAiY3VycmVudCIuIEhvd2V2ZXIsCiAgICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlICJjdXJyZW50IiBwcm9wcy4KICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLAogICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy4KCiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHsKICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gdW5yZXNvbHZlZE5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7CiAgICAgICAgY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlLCBuZXdQcm9wcywgbmV4dENvbnRleHQpOwogICAgICB9CiAgICB9CgogICAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTsKICAgIHZhciBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7CiAgICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlOwogICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTsKICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsKCiAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzID09PSB1bnJlc29sdmVkTmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgJiYgIShlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uICAgKSkgewogICAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGUKICAgICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC4KICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkgewogICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7CiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXdQcm9wcyk7CiAgICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsKICAgIH0KCiAgICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpIHx8IC8vIFRPRE86IEluIHNvbWUgY2FzZXMsIHdlJ2xsIGVuZCB1cCBjaGVja2luZyBpZiBjb250ZXh0IGhhcyBjaGFuZ2VkIHR3aWNlLAogICAgLy8gYm90aCBiZWZvcmUgYW5kIGFmdGVyIGBzaG91bGRDb21wb25lbnRVcGRhdGVgIGhhcyBiZWVuIGNhbGxlZC4gTm90IGlkZWFsLAogICAgLy8gYnV0IEknbSBsb2F0aCB0byByZWZhY3RvciB0aGlzIGZ1bmN0aW9uLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgbWVtb2l6ZWQKICAgIC8vIGNvbXBvbmVudHMgc28gaXQncyBub3QgdGhhdCBjb21tb24uCiAgICBlbmFibGVMYXp5Q29udGV4dFByb3BhZ2F0aW9uICAgOwoKICAgIGlmIChzaG91bGRVcGRhdGUpIHsKICAgICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsCiAgICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuCiAgICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSkgewogICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTsKICAgICAgICB9CgogICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7CiAgICAgIH0KCiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlCiAgICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuCiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHsKICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkgewogICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7CiAgICAgICAgfQogICAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGUKICAgICAgLy8gbWVtb2l6ZWQgcHJvcHMvc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC4KCgogICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7CiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTsKICAgIH0gLy8gVXBkYXRlIHRoZSBleGlzdGluZyBpbnN0YW5jZSdzIHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgcG9pbnRlcnMgZXZlbgogICAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuCgoKICAgIGluc3RhbmNlLnByb3BzID0gbmV3UHJvcHM7CiAgICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlOwogICAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0OwogICAgcmV0dXJuIHNob3VsZFVwZGF0ZTsKICB9CgogIHZhciBkaWRXYXJuQWJvdXRNYXBzOwogIHZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzOwogIHZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzOwogIHZhciBvd25lckhhc0tleVVzZVdhcm5pbmc7CiAgdmFyIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZzsKCiAgdmFyIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge307CgogIHsKICAgIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTsKICAgIGRpZFdhcm5BYm91dEdlbmVyYXRvcnMgPSBmYWxzZTsKICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTsKICAgIC8qKgogICAgICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvcgogICAgICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuCiAgICAgKiB1cGRhdGVzLgogICAgICovCgogICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307CiAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmcgPSB7fTsKCiAgICB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHsKICAgICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmICghY2hpbGQuX3N0b3JlIHx8IGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgfHwgY2hpbGQua2V5ICE9IG51bGwpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmICh0eXBlb2YgY2hpbGQuX3N0b3JlICE9PSAnb2JqZWN0JykgewogICAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QgQ29tcG9uZW50IGluIHdhcm5Gb3JNaXNzaW5nS2V5IHNob3VsZCBoYXZlIGEgX3N0b3JlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7CiAgICAgIH0KCiAgICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlOwogICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8ICdDb21wb25lbnQnOwoKICAgICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTsKCiAgICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSAnICsgJyJrZXkiIHByb3AuIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciAnICsgJ21vcmUgaW5mb3JtYXRpb24uJyk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KSB7CiAgICB2YXIgbWl4ZWRSZWYgPSBlbGVtZW50LnJlZjsKCiAgICBpZiAobWl4ZWRSZWYgIT09IG51bGwgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ29iamVjdCcpIHsKICAgICAgewogICAgICAgIC8vIFRPRE86IENsZWFuIHRoaXMgdXAgb25jZSB3ZSB0dXJuIG9uIHRoZSBzdHJpbmcgcmVmIHdhcm5pbmcgZm9yCiAgICAgICAgLy8gZXZlcnlvbmUsIGJlY2F1c2UgdGhlIHN0cmljdCBtb2RlIGNhc2Ugd2lsbCBubyBsb25nZXIgYmUgcmVsZXZhbnQKICAgICAgICBpZiAoKHJldHVybkZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlIHx8IHdhcm5BYm91dFN0cmluZ1JlZnMpICYmIC8vIFdlIHdhcm4gaW4gUmVhY3RFbGVtZW50LmpzIGlmIG93bmVyIGFuZCBzZWxmIGFyZSBlcXVhbCBmb3Igc3RyaW5nIHJlZnMKICAgICAgICAvLyBiZWNhdXNlIHRoZXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvbgogICAgICAgIC8vIHVzaW5nIGEgY29kZW1vZC4gVGhlcmVmb3JlLCB3ZSBkb24ndCBoYXZlIHRvIHdhcm4gYWJvdXQgc3RyaW5nIHJlZnMgYWdhaW4uCiAgICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9zZWxmICYmIGVsZW1lbnQuX293bmVyLnN0YXRlTm9kZSAhPT0gZWxlbWVudC5fc2VsZikpIHsKICAgICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7CgogICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBlcnJvcignQSBzdHJpbmcgcmVmLCAiJXMiLCBoYXMgYmVlbiBmb3VuZCB3aXRoaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1N0cmluZyByZWZzIGFyZSBhIHNvdXJjZSBvZiBwb3RlbnRpYWwgYnVncyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuICcgKyAnV2UgcmVjb21tZW5kIHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgbWl4ZWRSZWYpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChlbGVtZW50Ll9vd25lcikgewogICAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyOwogICAgICAgIHZhciBpbnN0OwoKICAgICAgICBpZiAob3duZXIpIHsKICAgICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7CgogICAgICAgICAgaWYgKG93bmVyRmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnMuICcgKyAnV2UgcmVjb21tZW5kIHVzaW5nIHVzZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJyk7CiAgICAgICAgICB9CgogICAgICAgICAgaW5zdCA9IG93bmVyRmliZXIuc3RhdGVOb2RlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpbnN0KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3Npbmcgb3duZXIgZm9yIHN0cmluZyByZWYgIiArIG1peGVkUmVmICsgIi4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgIiArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICAgIH0gLy8gQXNzaWduaW5nIHRoaXMgdG8gYSBjb25zdCBzbyBGbG93IGtub3dzIGl0IHdvbid0IGNoYW5nZSBpbiB0aGUgY2xvc3VyZQoKCiAgICAgICAgdmFyIHJlc29sdmVkSW5zdCA9IGluc3Q7CgogICAgICAgIHsKICAgICAgICAgIGNoZWNrUHJvcFN0cmluZ0NvZXJjaW9uKG1peGVkUmVmLCAncmVmJyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjsgLy8gQ2hlY2sgaWYgcHJldmlvdXMgc3RyaW5nIHJlZiBtYXRjaGVzIG5ldyBzdHJpbmcgcmVmCgogICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSBudWxsICYmIHR5cGVvZiBjdXJyZW50LnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBjdXJyZW50LnJlZi5fc3RyaW5nUmVmID09PSBzdHJpbmdSZWYpIHsKICAgICAgICAgIHJldHVybiBjdXJyZW50LnJlZjsKICAgICAgICB9CgogICAgICAgIHZhciByZWYgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgIHZhciByZWZzID0gcmVzb2x2ZWRJbnN0LnJlZnM7CgogICAgICAgICAgaWYgKHJlZnMgPT09IGVtcHR5UmVmc09iamVjdCkgewogICAgICAgICAgICAvLyBUaGlzIGlzIGEgbGF6eSBwb29sZWQgZnJvemVuIG9iamVjdCwgc28gd2UgbmVlZCB0byBpbml0aWFsaXplLgogICAgICAgICAgICByZWZzID0gcmVzb2x2ZWRJbnN0LnJlZnMgPSB7fTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgZGVsZXRlIHJlZnNbc3RyaW5nUmVmXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlZnNbc3RyaW5nUmVmXSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmOwogICAgICAgIHJldHVybiByZWY7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHR5cGVvZiBtaXhlZFJlZiAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVmIHRvIGJlIGEgZnVuY3Rpb24sIGEgc3RyaW5nLCBhbiBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlUmVmKCksIG9yIG51bGwuJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWVsZW1lbnQuX293bmVyKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVsZW1lbnQgcmVmIHdhcyBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKCIgKyBtaXhlZFJlZiArICIpIGJ1dCBubyBvd25lciB3YXMgc2V0LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mIiArICcgdGhlIGZvbGxvd2luZyByZWFzb25zOlxuJyArICcxLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGZ1bmN0aW9uIGNvbXBvbmVudFxuJyArICIyLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnQncyByZW5kZXIgbWV0aG9kXG4iICsgJzMuIFlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWRcbicgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWZzLW11c3QtaGF2ZS1vd25lciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbWl4ZWRSZWY7CiAgfQoKICBmdW5jdGlvbiB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKSB7CiAgICB2YXIgY2hpbGRTdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3Q2hpbGQpOwogICAgdGhyb3cgbmV3IEVycm9yKCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICIgKyAoY2hpbGRTdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhuZXdDaGlsZCkuam9pbignLCAnKSArICd9JyA6IGNoaWxkU3RyaW5nKSArICIpLiAiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpOwogIH0KCiAgZnVuY3Rpb24gd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKSB7CiAgICB7CiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7CgogICAgICBpZiAob3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlOwoKICAgICAgZXJyb3IoJ0Z1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiAnICsgJ3lvdSByZXR1cm4gYSBDb21wb25lbnQgaW5zdGVhZCBvZiA8Q29tcG9uZW50IC8+IGZyb20gcmVuZGVyLiAnICsgJ09yIG1heWJlIHlvdSBtZWFudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuIGl0LicpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVzb2x2ZUxhenkobGF6eVR5cGUpIHsKICAgIHZhciBwYXlsb2FkID0gbGF6eVR5cGUuX3BheWxvYWQ7CiAgICB2YXIgaW5pdCA9IGxhenlUeXBlLl9pbml0OwogICAgcmV0dXJuIGluaXQocGF5bG9hZCk7CiAgfSAvLyBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZXhpc3RzIGJlY2F1c2UgSSBleHBlY3QgdG8gY2xvbmUgdGhlIGNvZGUgaW4gZWFjaCBwYXRoCiAgLy8gdG8gYmUgYWJsZSB0byBvcHRpbWl6ZSBlYWNoIHBhdGggaW5kaXZpZHVhbGx5IGJ5IGJyYW5jaGluZyBlYXJseS4gVGhpcyBuZWVkcwogIC8vIGEgY29tcGlsZXIgb3Igd2UgY2FuIGRvIGl0IG1hbnVhbGx5LiBIZWxwZXJzIHRoYXQgZG9uJ3QgbmVlZCB0aGlzIGJyYW5jaGluZwogIC8vIGxpdmUgb3V0c2lkZSBvZiB0aGlzIGZ1bmN0aW9uLgoKCiAgZnVuY3Rpb24gQ2hpbGRSZWNvbmNpbGVyKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHsKICAgIGZ1bmN0aW9uIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKSB7CiAgICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykgewogICAgICAgIC8vIE5vb3AuCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zOwoKICAgICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkgewogICAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXTsKICAgICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uOwogICAgICB9IGVsc2UgewogICAgICAgIGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7CiAgICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykgewogICAgICAgIC8vIE5vb3AuCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0gLy8gVE9ETzogRm9yIHRoZSBzaG91bGRDbG9uZSBjYXNlLCB0aGlzIGNvdWxkIGJlIG1pY3JvLW9wdGltaXplZCBhIGJpdCBieQogICAgICAvLyBhc3N1bWluZyB0aGF0IGFmdGVyIHRoZSBmaXJzdCBjaGlsZCB3ZSd2ZSBhbHJlYWR5IGFkZGVkIGV2ZXJ5dGhpbmcuCgoKICAgICAgdmFyIGNoaWxkVG9EZWxldGUgPSBjdXJyZW50Rmlyc3RDaGlsZDsKCiAgICAgIHdoaWxlIChjaGlsZFRvRGVsZXRlICE9PSBudWxsKSB7CiAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpOwogICAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIG1hcFJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCkgewogICAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGlsZHJlbiB0byBhIHRlbXBvcmFyeSBtYXAgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGVtIGJ5CiAgICAgIC8vIGtleXMgcXVpY2tseS4gSW1wbGljaXQgKG51bGwpIGtleXMgZ2V0IGFkZGVkIHRvIHRoaXMgc2V0IHdpdGggdGhlaXIgaW5kZXgKICAgICAgLy8gaW5zdGVhZC4KICAgICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7CiAgICAgIHZhciBleGlzdGluZ0NoaWxkID0gY3VycmVudEZpcnN0Q2hpbGQ7CgogICAgICB3aGlsZSAoZXhpc3RpbmdDaGlsZCAhPT0gbnVsbCkgewogICAgICAgIGlmIChleGlzdGluZ0NoaWxkLmtleSAhPT0gbnVsbCkgewogICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5rZXksIGV4aXN0aW5nQ2hpbGQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLnNldChleGlzdGluZ0NoaWxkLmluZGV4LCBleGlzdGluZ0NoaWxkKTsKICAgICAgICB9CgogICAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7CiAgICAgIH0KCiAgICAgIHJldHVybiBleGlzdGluZ0NoaWxkcmVuOwogICAgfQoKICAgIGZ1bmN0aW9uIHVzZUZpYmVyKGZpYmVyLCBwZW5kaW5nUHJvcHMpIHsKICAgICAgLy8gV2UgY3VycmVudGx5IHNldCBzaWJsaW5nIHRvIG51bGwgYW5kIGluZGV4IHRvIDAgaGVyZSBiZWNhdXNlIGl0IGlzIGVhc3kKICAgICAgLy8gdG8gZm9yZ2V0IHRvIGRvIGJlZm9yZSByZXR1cm5pbmcgaXQuIEUuZy4gZm9yIHRoZSBzaW5nbGUgY2hpbGQgY2FzZS4KICAgICAgdmFyIGNsb25lID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZmliZXIsIHBlbmRpbmdQcm9wcyk7CiAgICAgIGNsb25lLmluZGV4ID0gMDsKICAgICAgY2xvbmUuc2libGluZyA9IG51bGw7CiAgICAgIHJldHVybiBjbG9uZTsKICAgIH0KCiAgICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7CiAgICAgIG5ld0ZpYmVyLmluZGV4ID0gbmV3SW5kZXg7CgogICAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHsKICAgICAgICAvLyBEdXJpbmcgaHlkcmF0aW9uLCB0aGUgdXNlSWQgYWxnb3JpdGhtIG5lZWRzIHRvIGtub3cgd2hpY2ggZmliZXJzIGFyZQogICAgICAgIC8vIHBhcnQgb2YgYSBsaXN0IG9mIGNoaWxkcmVuIChhcnJheXMsIGl0ZXJhdG9ycykuCiAgICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gRm9ya2VkOwogICAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7CiAgICAgIH0KCiAgICAgIHZhciBjdXJyZW50ID0gbmV3RmliZXIuYWx0ZXJuYXRlOwoKICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHsKICAgICAgICB2YXIgb2xkSW5kZXggPSBjdXJyZW50LmluZGV4OwoKICAgICAgICBpZiAob2xkSW5kZXggPCBsYXN0UGxhY2VkSW5kZXgpIHsKICAgICAgICAgIC8vIFRoaXMgaXMgYSBtb3ZlLgogICAgICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50OwogICAgICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gVGhpcyBpdGVtIGNhbiBzdGF5IGluIHBsYWNlLgogICAgICAgICAgcmV0dXJuIG9sZEluZGV4OwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbi4KICAgICAgICBuZXdGaWJlci5mbGFncyB8PSBQbGFjZW1lbnQ7CiAgICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHBsYWNlU2luZ2xlQ2hpbGQobmV3RmliZXIpIHsKICAgICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhCiAgICAgIC8vIHBsYWNlbWVudCBmb3IgaW5zZXJ0aW5nIG5ldyBjaGlsZHJlbi4KICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7CiAgICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50OwogICAgICB9CgogICAgICByZXR1cm4gbmV3RmliZXI7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykgewogICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFRleHQpIHsKICAgICAgICAvLyBJbnNlcnQKICAgICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTsKICAgICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyOwogICAgICAgIHJldHVybiBjcmVhdGVkOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFVwZGF0ZQogICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHRleHRDb250ZW50KTsKICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjsKICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykgewogICAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7CgogICAgICBpZiAoZWxlbWVudFR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHsKICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIGxhbmVzLCBlbGVtZW50LmtleSk7CiAgICAgIH0KCiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7CiAgICAgICAgaWYgKGN1cnJlbnQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6CiAgICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhjdXJyZW50LCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLgogICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhpcyBhZnRlciB0aGUgSG90IFJlbG9hZGluZyBjaGVjayBhYm92ZSwKICAgICAgICAvLyBiZWNhdXNlIGhvdCByZWxvYWRpbmcgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBwcm9kIGJlY2F1c2UKICAgICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuCiAgICAgICAgdHlwZW9mIGVsZW1lbnRUeXBlID09PSAnb2JqZWN0JyAmJiBlbGVtZW50VHlwZSAhPT0gbnVsbCAmJiBlbGVtZW50VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmIHJlc29sdmVMYXp5KGVsZW1lbnRUeXBlKSA9PT0gY3VycmVudC50eXBlKSB7CiAgICAgICAgICAvLyBNb3ZlIGJhc2VkIG9uIGluZGV4CiAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKTsKICAgICAgICAgIGV4aXN0aW5nLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCk7CiAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjsKCiAgICAgICAgICB7CiAgICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTsKICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICB9IC8vIEluc2VydAoKCiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7CiAgICAgIGNyZWF0ZWQucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTsKICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjsKICAgICAgcmV0dXJuIGNyZWF0ZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50LCBwb3J0YWwsIGxhbmVzKSB7CiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0UG9ydGFsIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gIT09IHBvcnRhbC5jb250YWluZXJJbmZvIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uICE9PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHsKICAgICAgICAvLyBJbnNlcnQKICAgICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTsKICAgICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyOwogICAgICAgIHJldHVybiBjcmVhdGVkOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFVwZGF0ZQogICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7CiAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7CiAgICAgICAgcmV0dXJuIGV4aXN0aW5nOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIGN1cnJlbnQsIGZyYWdtZW50LCBsYW5lcywga2V5KSB7CiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBGcmFnbWVudCkgewogICAgICAgIC8vIEluc2VydAogICAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZnJhZ21lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBrZXkpOwogICAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7CiAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVXBkYXRlCiAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZnJhZ21lbnQpOwogICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyOwogICAgICAgIHJldHVybiBleGlzdGluZzsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHsKICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHsKICAgICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZAogICAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0CiAgICAgICAgLy8gbm9kZS4KICAgICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQoJycgKyBuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpOwogICAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7CiAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7CiAgICAgIH0KCiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7CiAgICAgICAgc3dpdGNoIChuZXdDaGlsZC4kJHR5cGVvZikgewogICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB2YXIgX2NyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7CgogICAgICAgICAgICAgIF9jcmVhdGVkLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgbnVsbCwgbmV3Q2hpbGQpOwogICAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyOwogICAgICAgICAgICAgIHJldHVybiBfY3JlYXRlZDsKICAgICAgICAgICAgfQoKICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB2YXIgX2NyZWF0ZWQyID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7CgogICAgICAgICAgICAgIF9jcmVhdGVkMi5yZXR1cm4gPSByZXR1cm5GaWJlcjsKICAgICAgICAgICAgICByZXR1cm4gX2NyZWF0ZWQyOwogICAgICAgICAgICB9CgogICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkOwogICAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7CiAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkgewogICAgICAgICAgdmFyIF9jcmVhdGVkMyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgbnVsbCk7CgogICAgICAgICAgX2NyZWF0ZWQzLnJldHVybiA9IHJldHVybkZpYmVyOwogICAgICAgICAgcmV0dXJuIF9jcmVhdGVkMzsKICAgICAgICB9CgogICAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpOwogICAgICB9CgogICAgICB7CiAgICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHsKICAgICAgLy8gVXBkYXRlIHRoZSBmaWJlciBpZiB0aGUga2V5cyBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiBudWxsLgogICAgICB2YXIga2V5ID0gb2xkRmliZXIgIT09IG51bGwgPyBvbGRGaWJlci5rZXkgOiBudWxsOwoKICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHsKICAgICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZAogICAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0CiAgICAgICAgLy8gbm9kZS4KICAgICAgICBpZiAoa2V5ICE9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgb2xkRmliZXIsICcnICsgbmV3Q2hpbGQsIGxhbmVzKTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHsKICAgICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7CiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRToKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkOwogICAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7CiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkgewogICAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMsIG51bGwpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7CiAgICAgIH0KCiAgICAgIHsKICAgICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgbGFuZXMpIHsKICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHsKICAgICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yCiAgICAgICAgLy8gbmV3IG5vZGUgZm9yIHRoZSBrZXkuIElmIGJvdGggYXJlIHRleHQgbm9kZXMsIHRoZXkgbWF0Y2guCiAgICAgICAgdmFyIG1hdGNoZWRGaWJlciA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbDsKICAgICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpOwogICAgICB9CgogICAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCkgewogICAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHsKICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdDaGlsZC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXkpIHx8IG51bGw7CgogICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRToKICAgICAgICAgICAgewogICAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyMiA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0NoaWxkLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleSkgfHwgbnVsbDsKCiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjIsIG5ld0NoaWxkLCBsYW5lcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRToKICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDsKICAgICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDsKICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgaW5pdChwYXlsb2FkKSwgbGFuZXMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7CiAgICAgICAgICB2YXIgX21hdGNoZWRGaWJlcjMgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7CgogICAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMywgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTsKICAgICAgICB9CgogICAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpOwogICAgICB9CgogICAgICB7CiAgICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBXYXJucyBpZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSBvciBtaXNzaW5nIGtleQogICAgICovCgoKICAgIGZ1bmN0aW9uIHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpIHsKICAgICAgewogICAgICAgIGlmICh0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnIHx8IGNoaWxkID09PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4ga25vd25LZXlzOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikgewogICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6CiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOgogICAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCwgcmV0dXJuRmliZXIpOwogICAgICAgICAgICB2YXIga2V5ID0gY2hpbGQua2V5OwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChrbm93bktleXMgPT09IG51bGwpIHsKICAgICAgICAgICAgICBrbm93bktleXMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAga25vd25LZXlzLmFkZChrZXkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWtub3duS2V5cy5oYXMoa2V5KSkgewogICAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZXJyb3IoJ0VuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgYCVzYC4gJyArICdLZXlzIHNob3VsZCBiZSB1bmlxdWUgc28gdGhhdCBjb21wb25lbnRzIG1haW50YWluIHRoZWlyIGlkZW50aXR5ICcgKyAnYWNyb3NzIHVwZGF0ZXMuIE5vbi11bmlxdWUga2V5cyBtYXkgY2F1c2UgY2hpbGRyZW4gdG8gYmUgJyArICdkdXBsaWNhdGVkIGFuZC9vciBvbWl0dGVkIOKAlCB0aGUgYmVoYXZpb3IgaXMgdW5zdXBwb3J0ZWQgYW5kICcgKyAnY291bGQgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb24uJywga2V5KTsKCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOgogICAgICAgICAgICB2YXIgcGF5bG9hZCA9IGNoaWxkLl9wYXlsb2FkOwogICAgICAgICAgICB2YXIgaW5pdCA9IGNoaWxkLl9pbml0OwogICAgICAgICAgICB3YXJuT25JbnZhbGlkS2V5KGluaXQocGF5bG9hZCksIGtub3duS2V5cywgcmV0dXJuRmliZXIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBrbm93bktleXM7CiAgICB9CgogICAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuLCBsYW5lcykgewogICAgICAvLyBUaGlzIGFsZ29yaXRobSBjYW4ndCBvcHRpbWl6ZSBieSBzZWFyY2hpbmcgZnJvbSBib3RoIGVuZHMgc2luY2Ugd2UKICAgICAgLy8gZG9uJ3QgaGF2ZSBiYWNrcG9pbnRlcnMgb24gZmliZXJzLiBJJ20gdHJ5aW5nIHRvIHNlZSBob3cgZmFyIHdlIGNhbiBnZXQKICAgICAgLy8gd2l0aCB0aGF0IG1vZGVsLiBJZiBpdCBlbmRzIHVwIG5vdCBiZWluZyB3b3J0aCB0aGUgdHJhZGVvZmZzLCB3ZSBjYW4KICAgICAgLy8gYWRkIGl0IGxhdGVyLgogICAgICAvLyBFdmVuIHdpdGggYSB0d28gZW5kZWQgb3B0aW1pemF0aW9uLCB3ZSdkIHdhbnQgdG8gb3B0aW1pemUgZm9yIHRoZSBjYXNlCiAgICAgIC8vIHdoZXJlIHRoZXJlIGFyZSBmZXcgY2hhbmdlcyBhbmQgYnJ1dGUgZm9yY2UgdGhlIGNvbXBhcmlzb24gaW5zdGVhZCBvZgogICAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW4KICAgICAgLy8gZm9yd2FyZC1vbmx5IG1vZGUgYW5kIG9ubHkgZ28gZm9yIHRoZSBNYXAgb25jZSB3ZSBub3RpY2UgdGhhdCB3ZSBuZWVkCiAgICAgIC8vIGxvdHMgb2YgbG9vayBhaGVhZC4gVGhpcyBkb2Vzbid0IGhhbmRsZSByZXZlcnNhbCBhcyB3ZWxsIGFzIHR3byBlbmRlZAogICAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG8KICAgICAgLy8gd29yayBvbiBJdGVyYWJsZXMsIHdlJ2QgbmVlZCB0byBjb3B5IHRoZSB3aG9sZSBzZXQuCiAgICAgIC8vIEluIHRoaXMgZmlyc3QgaXRlcmF0aW9uLCB3ZSdsbCBqdXN0IGxpdmUgd2l0aCBoaXR0aW5nIHRoZSBiYWQgY2FzZQogICAgICAvLyAoYWRkaW5nIGV2ZXJ5dGhpbmcgdG8gYSBNYXApIGluIGZvciBldmVyeSBpbnNlcnQvbW92ZS4KICAgICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNvZGUsIGFsc28gdXBkYXRlIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IoKSB3aGljaAogICAgICAvLyB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobS4KICAgICAgewogICAgICAgIC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLgogICAgICAgIHZhciBrbm93bktleXMgPSBudWxsOwoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgY2hpbGQgPSBuZXdDaGlsZHJlbltpXTsKICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsOwogICAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7CiAgICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkOwogICAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDsKICAgICAgdmFyIG5ld0lkeCA9IDA7CiAgICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsOwoKICAgICAgZm9yICg7IG9sZEZpYmVyICE9PSBudWxsICYmIG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHsKICAgICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHsKICAgICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyOwogICAgICAgICAgb2xkRmliZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nOwogICAgICAgIH0KCiAgICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTsKCiAgICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7CiAgICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQncwogICAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZAogICAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsCiAgICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy4KICAgICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkgewogICAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjsKICAgICAgICAgIH0KCiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7CiAgICAgICAgICBpZiAob2xkRmliZXIgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZQogICAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuCiAgICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7CgogICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7CiAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uCiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC4KICAgICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXMKICAgICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3QKICAgICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS4KICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyOwogICAgICAgIH0KCiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyOwogICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyOwogICAgICB9CgogICAgICBpZiAobmV3SWR4ID09PSBuZXdDaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC4KICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOwoKICAgICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkgewogICAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7CiAgICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7CiAgICAgIH0KCiAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkgewogICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aAogICAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuCiAgICAgICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHsKICAgICAgICAgIHZhciBfbmV3RmliZXIgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpOwoKICAgICAgICAgIGlmIChfbmV3RmliZXIgPT09IG51bGwpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CgogICAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTsKCiAgICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkgewogICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uCiAgICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXI7CiAgICAgICAgICB9CgogICAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjsKICAgICAgICB9CgogICAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7CiAgICAgICAgICB2YXIgX251bWJlck9mRm9ya3MgPSBuZXdJZHg7CiAgICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkOwogICAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLgoKCiAgICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLgoKICAgICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHsKICAgICAgICB2YXIgX25ld0ZpYmVyMiA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgbmV3Q2hpbGRyZW5bbmV3SWR4XSwgbGFuZXMpOwoKICAgICAgICBpZiAoX25ld0ZpYmVyMiAhPT0gbnVsbCkgewogICAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHsKICAgICAgICAgICAgaWYgKF9uZXdGaWJlcjIuYWx0ZXJuYXRlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYQogICAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZQogICAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uCiAgICAgICAgICAgICAgLy8gbGlzdC4KICAgICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXIyLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjIua2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyMiwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpOwoKICAgICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7CiAgICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyMjsKICAgICAgICAgIH0KCiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyMjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7CiAgICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWQKICAgICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC4KICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHsKICAgICAgICB2YXIgX251bWJlck9mRm9ya3MyID0gbmV3SWR4OwogICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MyKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7CiAgICB9CgogICAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuSXRlcmFibGUsIGxhbmVzKSB7CiAgICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgcmVjb25jaWxlQ2hpbGRyZW5BcnJheSgpLAogICAgICAvLyBidXQgdXNpbmcgdGhlIGl0ZXJhdG9yIGluc3RlYWQuCiAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihuZXdDaGlsZHJlbkl0ZXJhYmxlKTsKCiAgICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHRocm93IG5ldyBFcnJvcignQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICB9CgogICAgICB7CiAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCByZW5kZXJpbmcgR2VuZXJhdG9ycyBiZWNhdXNlIGl0J3MgYSBtdXRhdGlvbi4KICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjk5NQogICAgICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IGtub3cgYWJvdXQgdG9TdHJpbmdUYWcKICAgICAgICBuZXdDaGlsZHJlbkl0ZXJhYmxlW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdHZW5lcmF0b3InKSB7CiAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEdlbmVyYXRvcnMpIHsKICAgICAgICAgICAgZXJyb3IoJ1VzaW5nIEdlbmVyYXRvcnMgYXMgY2hpbGRyZW4gaXMgdW5zdXBwb3J0ZWQgYW5kIHdpbGwgbGlrZWx5IHlpZWxkICcgKyAndW5leHBlY3RlZCByZXN1bHRzIGJlY2F1c2UgZW51bWVyYXRpbmcgYSBnZW5lcmF0b3IgbXV0YXRlcyBpdC4gJyArICdZb3UgbWF5IGNvbnZlcnQgaXQgdG8gYW4gYXJyYXkgd2l0aCBgQXJyYXkuZnJvbSgpYCBvciB0aGUgJyArICdgWy4uLnNwcmVhZF1gIG9wZXJhdG9yIGJlZm9yZSByZW5kZXJpbmcuIEtlZXAgaW4gbWluZCAnICsgJ3lvdSBtaWdodCBuZWVkIHRvIHBvbHlmaWxsIHRoZXNlIGZlYXR1cmVzIGZvciBvbGRlciBicm93c2Vycy4nKTsKICAgICAgICAgIH0KCiAgICAgICAgICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gdHJ1ZTsKICAgICAgICB9IC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlbgoKCiAgICAgICAgaWYgKG5ld0NoaWxkcmVuSXRlcmFibGUuZW50cmllcyA9PT0gaXRlcmF0b3JGbikgewogICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7CiAgICAgICAgICAgIGVycm9yKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTsKICAgICAgICAgIH0KCiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTsKICAgICAgICB9IC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLgogICAgICAgIC8vIFdlJ2xsIGdldCBhIGRpZmZlcmVudCBpdGVyYXRvciBsYXRlciBmb3IgdGhlIG1haW4gcGFzcy4KCgogICAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7CgogICAgICAgIGlmIChfbmV3Q2hpbGRyZW4pIHsKICAgICAgICAgIHZhciBrbm93bktleXMgPSBudWxsOwoKICAgICAgICAgIHZhciBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCk7CgogICAgICAgICAgZm9yICg7ICFfc3RlcC5kb25lOyBfc3RlcCA9IF9uZXdDaGlsZHJlbi5uZXh0KCkpIHsKICAgICAgICAgICAgdmFyIGNoaWxkID0gX3N0ZXAudmFsdWU7CiAgICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIG5ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpOwoKICAgICAgaWYgKG5ld0NoaWxkcmVuID09IG51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGl0ZXJhYmxlIG9iamVjdCBwcm92aWRlZCBubyBpdGVyYXRvci4nKTsKICAgICAgfQoKICAgICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsOwogICAgICB2YXIgcHJldmlvdXNOZXdGaWJlciA9IG51bGw7CiAgICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkOwogICAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDsKICAgICAgdmFyIG5ld0lkeCA9IDA7CiAgICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsOwogICAgICB2YXIgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKTsKCiAgICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkgewogICAgICAgIGlmIChvbGRGaWJlci5pbmRleCA+IG5ld0lkeCkgewogICAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7CiAgICAgICAgICBvbGRGaWJlciA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7CiAgICAgICAgfQoKICAgICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpOwoKICAgICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHsKICAgICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzCiAgICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkCiAgICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCwKICAgICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLgogICAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7CiAgICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyOwogICAgICAgICAgfQoKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHsKICAgICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHsKICAgICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgc2xvdCwgYnV0IHdlIGRpZG4ndCByZXVzZSB0aGUgZXhpc3RpbmcgZmliZXIsIHNvIHdlCiAgICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC4KICAgICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTsKCiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHsKICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi4KICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LgogICAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpcwogICAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdAogICAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLgogICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7CiAgICAgICAgfQoKICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7CiAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7CiAgICAgIH0KCiAgICAgIGlmIChzdGVwLmRvbmUpIHsKICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIG5ldyBjaGlsZHJlbi4gV2UgY2FuIGRlbGV0ZSB0aGUgcmVzdC4KICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOwoKICAgICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkgewogICAgICAgICAgdmFyIG51bWJlck9mRm9ya3MgPSBuZXdJZHg7CiAgICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIG51bWJlck9mRm9ya3MpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7CiAgICAgIH0KCiAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkgewogICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZXhpc3RpbmcgY2hpbGRyZW4gd2UgY2FuIGNob29zZSBhIGZhc3QgcGF0aAogICAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuCiAgICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7CiAgICAgICAgICB2YXIgX25ld0ZpYmVyMyA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcyk7CgogICAgICAgICAgaWYgKF9uZXdGaWJlcjMgPT09IG51bGwpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CgogICAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIzLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7CgogICAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHsKICAgICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLgogICAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjM7CiAgICAgICAgICB9CgogICAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7CiAgICAgICAgfQoKICAgICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkgewogICAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzMyA9IG5ld0lkeDsKICAgICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkOwogICAgICB9IC8vIEFkZCBhbGwgY2hpbGRyZW4gdG8gYSBrZXkgbWFwIGZvciBxdWljayBsb29rdXBzLgoKCiAgICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLgoKICAgICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7CiAgICAgICAgdmFyIF9uZXdGaWJlcjQgPSB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIHN0ZXAudmFsdWUsIGxhbmVzKTsKCiAgICAgICAgaWYgKF9uZXdGaWJlcjQgIT09IG51bGwpIHsKICAgICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7CiAgICAgICAgICAgIGlmIChfbmV3RmliZXI0LmFsdGVybmF0ZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGEKICAgICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGUKICAgICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvbgogICAgICAgICAgICAgIC8vIGxpc3QuCiAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyNC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXI0LmtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjQsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTsKCiAgICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkgewogICAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyNDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjQ7CiAgICAgICAgICB9CgogICAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjQ7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykgewogICAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkCiAgICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuCiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkgewogICAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7CiAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzNCA9IG5ld0lkeDsKICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzNCk7CiAgICAgIH0KCiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQsIGxhbmVzKSB7CiAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBjaGVjayBmb3Iga2V5cyBvbiB0ZXh0IG5vZGVzIHNpbmNlIHdlIGRvbid0IGhhdmUgYQogICAgICAvLyB3YXkgdG8gZGVmaW5lIHRoZW0uCiAgICAgIGlmIChjdXJyZW50Rmlyc3RDaGlsZCAhPT0gbnVsbCAmJiBjdXJyZW50Rmlyc3RDaGlsZC50YWcgPT09IEhvc3RUZXh0KSB7CiAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG5vZGUgc28gbGV0J3MganVzdCB1cGRhdGUgaXQgYW5kIGRlbGV0ZQogICAgICAgIC8vIHRoZSByZXN0LgogICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nKTsKICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQpOwogICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyOwogICAgICAgIHJldHVybiBleGlzdGluZzsKICAgICAgfSAvLyBUaGUgZXhpc3RpbmcgZmlyc3QgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZQogICAgICAvLyBhbmQgZGVsZXRlIHRoZSBleGlzdGluZyBvbmVzLgoKCiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7CiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCh0ZXh0Q29udGVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpOwogICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyOwogICAgICByZXR1cm4gY3JlYXRlZDsKICAgIH0KCiAgICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgZWxlbWVudCwgbGFuZXMpIHsKICAgICAgdmFyIGtleSA9IGVsZW1lbnQua2V5OwogICAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDsKCiAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkgewogICAgICAgIC8vIFRPRE86IElmIGtleSA9PT0gbnVsbCBhbmQgY2hpbGQua2V5ID09PSBudWxsLCB0aGVuIHRoaXMgb25seSBhcHBsaWVzIHRvCiAgICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuCiAgICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7CiAgICAgICAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7CgogICAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7CiAgICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IEZyYWdtZW50KSB7CiAgICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkLnNpYmxpbmcpOwogICAgICAgICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzLmNoaWxkcmVuKTsKICAgICAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjsKCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlOwogICAgICAgICAgICAgICAgZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHJldHVybiBleGlzdGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNoaWxkLmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSB8fCAoIC8vIEtlZXAgdGhpcyBjaGVjayBpbmxpbmUgc28gaXQgb25seSBydW5zIG9uIHRoZSBmYWxzZSBwYXRoOgogICAgICAgICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGNoaWxkLCBlbGVtZW50KSApIHx8IC8vIExhenkgdHlwZXMgc2hvdWxkIHJlY29uY2lsZSB0aGVpciByZXNvbHZlZCB0eXBlLgogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIEhvdCBSZWxvYWRpbmcgY2hlY2sgYWJvdmUsCiAgICAgICAgICAgIC8vIGJlY2F1c2UgaG90IHJlbG9hZGluZyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHByb2QgYmVjYXVzZQogICAgICAgICAgICAvLyBpdCBkb2Vzbid0IHJlc3VzcGVuZC4gU28gd2UgY2FuJ3QgbGV0IHRoZSBjYWxsIGJlbG93IHN1c3BlbmQuCiAgICAgICAgICAgIHR5cGVvZiBlbGVtZW50VHlwZSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudFR5cGUgIT09IG51bGwgJiYgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJiByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGNoaWxkLnR5cGUpIHsKICAgICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7CgogICAgICAgICAgICAgIHZhciBfZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcyk7CgogICAgICAgICAgICAgIF9leGlzdGluZy5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGNoaWxkLCBlbGVtZW50KTsKICAgICAgICAgICAgICBfZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7CgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIF9leGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7CiAgICAgICAgICAgICAgICBfZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHJldHVybiBfZXhpc3Rpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gLy8gRGlkbid0IG1hdGNoLgoKCiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7CiAgICAgICAgfQoKICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7CiAgICAgIH0KCiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHsKICAgICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBlbGVtZW50LmtleSk7CiAgICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjsKICAgICAgICByZXR1cm4gY3JlYXRlZDsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7CgogICAgICAgIF9jcmVhdGVkNC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50KTsKICAgICAgICBfY3JlYXRlZDQucmV0dXJuID0gcmV0dXJuRmliZXI7CiAgICAgICAgcmV0dXJuIF9jcmVhdGVkNDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHBvcnRhbCwgbGFuZXMpIHsKICAgICAgdmFyIGtleSA9IHBvcnRhbC5rZXk7CiAgICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkOwoKICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG8KICAgICAgICAvLyB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdC4KICAgICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHsKICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IEhvc3RQb3J0YWwgJiYgY2hpbGQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gPT09IHBvcnRhbC5jb250YWluZXJJbmZvICYmIGNoaWxkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiA9PT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7CiAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTsKICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7CiAgICAgICAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyOwogICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTsKICAgICAgICB9CgogICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZzsKICAgICAgfQoKICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7CiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7CiAgICAgIHJldHVybiBjcmVhdGVkOwogICAgfSAvLyBUaGlzIEFQSSB3aWxsIHRhZyB0aGUgY2hpbGRyZW4gd2l0aCB0aGUgc2lkZS1lZmZlY3Qgb2YgdGhlIHJlY29uY2lsaWF0aW9uCiAgICAvLyBpdHNlbGYuIFRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2lkZS1lZmZlY3QgbGlzdCBhcyB3ZSBwYXNzIHRocm91Z2ggdGhlCiAgICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC4KCgogICAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpIHsKICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVjdXJzaXZlLgogICAgICAvLyBJZiB0aGUgdG9wIGxldmVsIGl0ZW0gaXMgYW4gYXJyYXksIHdlIHRyZWF0IGl0IGFzIGEgc2V0IG9mIGNoaWxkcmVuLAogICAgICAvLyBub3QgYXMgYSBmcmFnbWVudC4gTmVzdGVkIGFycmF5cyBvbiB0aGUgb3RoZXIgaGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXMKICAgICAgLy8gZnJhZ21lbnQgbm9kZXMuIFJlY3Vyc2lvbiBoYXBwZW5zIGF0IHRoZSBub3JtYWwgZmxvdy4KICAgICAgLy8gSGFuZGxlIHRvcCBsZXZlbCB1bmtleWVkIGZyYWdtZW50cyBhcyBpZiB0aGV5IHdlcmUgYXJyYXlzLgogICAgICAvLyBUaGlzIGxlYWRzIHRvIGFuIGFtYmlndWl0eSBiZXR3ZWVuIDw+e1suLi5dfTwvPiBhbmQgPD4uLi48Lz4uCiAgICAgIC8vIFdlIHRyZWF0IHRoZSBhbWJpZ3VvdXMgY2FzZXMgYWJvdmUgdGhlIHNhbWUuCiAgICAgIHZhciBpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50ID0gdHlwZW9mIG5ld0NoaWxkID09PSAnb2JqZWN0JyAmJiBuZXdDaGlsZCAhPT0gbnVsbCAmJiBuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFICYmIG5ld0NoaWxkLmtleSA9PT0gbnVsbDsKCiAgICAgIGlmIChpc1Vua2V5ZWRUb3BMZXZlbEZyYWdtZW50KSB7CiAgICAgICAgbmV3Q2hpbGQgPSBuZXdDaGlsZC5wcm9wcy5jaGlsZHJlbjsKICAgICAgfSAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzCgoKICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHsKICAgICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7CiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRToKICAgICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpOwoKICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6CiAgICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpOwoKICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOgogICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkOwogICAgICAgICAgICB2YXIgaW5pdCA9IG5ld0NoaWxkLl9pbml0OyAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGJlIG5vbi1yZWN1cnNpdmUuCgogICAgICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnMocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBpbml0KHBheWxvYWQpLCBsYW5lcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkpIHsKICAgICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTsKICAgICAgICB9CgogICAgICAgIGlmIChnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkgewogICAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7CiAgICAgIH0KCiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7CiAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCAnJyArIG5ld0NoaWxkLCBsYW5lcykpOwogICAgICB9CgogICAgICB7CiAgICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTsKICAgICAgICB9CiAgICAgIH0gLy8gUmVtYWluaW5nIGNhc2VzIGFyZSBhbGwgdHJlYXRlZCBhcyBlbXB0eS4KCgogICAgICByZXR1cm4gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTsKICAgIH0KCiAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnM7CiAgfQoKICB2YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIodHJ1ZSk7CiAgdmFyIG1vdW50Q2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIoZmFsc2UpOwogIGZ1bmN0aW9uIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHsKICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50LmNoaWxkKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLicpOwogICAgfQoKICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9PT0gbnVsbCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkOwogICAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBjdXJyZW50Q2hpbGQucGVuZGluZ1Byb3BzKTsKICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7CiAgICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzczsKCiAgICB3aGlsZSAoY3VycmVudENoaWxkLnNpYmxpbmcgIT09IG51bGwpIHsKICAgICAgY3VycmVudENoaWxkID0gY3VycmVudENoaWxkLnNpYmxpbmc7CiAgICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQuc2libGluZyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcyk7CiAgICAgIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzOwogICAgfQoKICAgIG5ld0NoaWxkLnNpYmxpbmcgPSBudWxsOwogIH0gLy8gUmVzZXQgYSB3b3JrSW5Qcm9ncmVzcyBjaGlsZCBzZXQgdG8gcHJlcGFyZSBpdCBmb3IgYSBzZWNvbmQgcGFzcy4KCiAgZnVuY3Rpb24gcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHsKICAgIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkOwoKICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkgewogICAgICByZXNldFdvcmtJblByb2dyZXNzKGNoaWxkLCBsYW5lcyk7CiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZzsKICAgIH0KICB9CgogIHZhciBOT19DT05URVhUID0ge307CiAgdmFyIGNvbnRleHRTdGFja0N1cnNvciQxID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpOwogIHZhciBjb250ZXh0RmliZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTsKICB2YXIgcm9vdEluc3RhbmNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTk9fQ09OVEVYVCk7CgogIGZ1bmN0aW9uIHJlcXVpcmVkQ29udGV4dChjKSB7CiAgICBpZiAoYyA9PT0gTk9fQ09OVEVYVCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGhvc3QgY29udGV4dCB0byBleGlzdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgfQoKICAgIHJldHVybiBjOwogIH0KCiAgZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7CiAgICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpOwogICAgcmV0dXJuIHJvb3RJbnN0YW5jZTsKICB9CgogIGZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7CiAgICAvLyBQdXNoIGN1cnJlbnQgcm9vdCBpbnN0YW5jZSBvbnRvIHRoZSBzdGFjazsKICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHJlc2V0IHJvb3Qgd2hlbiBwb3J0YWxzIGFyZSBwb3BwZWQuCiAgICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC4KICAgIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBwb3Agb25seSBGaWJlcnMgdGhhdCBwcm92aWRlIHVuaXF1ZSBjb250ZXh0cy4KCiAgICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpOyAvLyBGaW5hbGx5LCB3ZSBuZWVkIHRvIHB1c2ggdGhlIGhvc3QgY29udGV4dCB0byB0aGUgc3RhY2suCiAgICAvLyBIb3dldmVyLCB3ZSBjYW4ndCBqdXN0IGNhbGwgZ2V0Um9vdEhvc3RDb250ZXh0KCkgYW5kIHB1c2ggaXQgYmVjYXVzZQogICAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb24KICAgIC8vIHdoZXRoZXIgZ2V0Um9vdEhvc3RDb250ZXh0KCkgdGhyb3dzIHNvbWV3aGVyZSBpbiByZW5kZXJlciBjb2RlIG9yIG5vdC4KICAgIC8vIFNvIHdlIHB1c2ggYW4gZW1wdHkgdmFsdWUgZmlyc3QuIFRoaXMgbGV0cyB1cyBzYWZlbHkgdW53aW5kIG9uIGVycm9ycy4KCiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBOT19DT05URVhULCBmaWJlcik7CiAgICB2YXIgbmV4dFJvb3RDb250ZXh0ID0gZ2V0Um9vdEhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpOyAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0aHJvdywgcmVwbGFjZSBpdC4KCiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTsKICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yJDEsIG5leHRSb290Q29udGV4dCwgZmliZXIpOwogIH0KCiAgZnVuY3Rpb24gcG9wSG9zdENvbnRhaW5lcihmaWJlcikgewogICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7CiAgICBwb3AoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyKTsKICAgIHBvcChyb290SW5zdGFuY2VTdGFja0N1cnNvciwgZmliZXIpOwogIH0KCiAgZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7CiAgICB2YXIgY29udGV4dCA9IHJlcXVpcmVkQ29udGV4dChjb250ZXh0U3RhY2tDdXJzb3IkMS5jdXJyZW50KTsKICAgIHJldHVybiBjb250ZXh0OwogIH0KCiAgZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7CiAgICB2YXIgcm9vdEluc3RhbmNlID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpOwogICAgdmFyIGNvbnRleHQgPSByZXF1aXJlZENvbnRleHQoY29udGV4dFN0YWNrQ3Vyc29yJDEuY3VycmVudCk7CiAgICB2YXIgbmV4dENvbnRleHQgPSBnZXRDaGlsZEhvc3RDb250ZXh0KGNvbnRleHQsIGZpYmVyLnR5cGUpOyAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS4KCiAgICBpZiAoY29udGV4dCA9PT0gbmV4dENvbnRleHQpIHsKICAgICAgcmV0dXJuOwogICAgfSAvLyBUcmFjayB0aGUgY29udGV4dCBhbmQgdGhlIEZpYmVyIHRoYXQgcHJvdmlkZWQgaXQuCiAgICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuCgoKICAgIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7CiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Q29udGV4dCwgZmliZXIpOwogIH0KCiAgZnVuY3Rpb24gcG9wSG9zdENvbnRleHQoZmliZXIpIHsKICAgIC8vIERvIG5vdCBwb3AgdW5sZXNzIHRoaXMgRmliZXIgcHJvdmlkZWQgdGhlIGN1cnJlbnQgY29udGV4dC4KICAgIC8vIHB1c2hIb3N0Q29udGV4dCgpIG9ubHkgcHVzaGVzIEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLgogICAgaWYgKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLmN1cnJlbnQgIT09IGZpYmVyKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTsKICAgIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpOwogIH0KCiAgdmFyIERlZmF1bHRTdXNwZW5zZUNvbnRleHQgPSAwOyAvLyBUaGUgU3VzcGVuc2UgQ29udGV4dCBpcyBzcGxpdCBpbnRvIHR3byBwYXJ0cy4gVGhlIGxvd2VyIGJpdHMgaXMKICAvLyBpbmhlcml0ZWQgZGVlcGx5IGRvd24gdGhlIHN1YnRyZWUuIFRoZSB1cHBlciBiaXRzIG9ubHkgYWZmZWN0CiAgLy8gdGhpcyBpbW1lZGlhdGUgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGdldHMgcmVzZXQgZWFjaCBuZXcKICAvLyBib3VuZGFyeSBvciBzdXNwZW5zZSBsaXN0LgoKICB2YXIgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2sgPSAxOyAvLyBTdWJ0cmVlIEZsYWdzOgogIC8vIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCBpbmRpY2F0ZXMgdGhhdCBvbmUgb2Ygb3VyIHBhcmVudCBTdXNwZW5zZQogIC8vIGJvdW5kYXJpZXMgaXMgbm90IGN1cnJlbnRseSBzaG93aW5nIHZpc2libGUgbWFpbiBjb250ZW50LgogIC8vIEVpdGhlciBiZWNhdXNlIGl0IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIG9yIGlzIG5vdCBtb3VudGVkIGF0IGFsbC4KICAvLyBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlc2lyYWJsZSB0byB0cmlnZ2VyIGEgZmFsbGJhY2sgYXQKICAvLyB0aGUgcGFyZW50LiBJZiBub3QsIHRoZW4gd2UgbWlnaHQgbmVlZCB0byB0cmlnZ2VyIHVuZGVzaXJhYmxlIGJvdW5kYXJpZXMKICAvLyBhbmQvb3Igc3VzcGVuZCB0aGUgY29tbWl0IHRvIGF2b2lkIGhpZGluZyB0aGUgcGFyZW50IGNvbnRlbnQuCgogIHZhciBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQgPSAxOyAvLyBTaGFsbG93IEZsYWdzOgogIC8vIEZvcmNlU3VzcGVuc2VGYWxsYmFjayBjYW4gYmUgdXNlZCBieSBTdXNwZW5zZUxpc3QgdG8gZm9yY2UgbmV3bHkgYWRkZWQKICAvLyBpdGVtcyBpbnRvIHRoZWlyIGZhbGxiYWNrIHN0YXRlIGR1cmluZyBvbmUgb2YgdGhlIHJlbmRlciBwYXNzZXMuCgogIHZhciBGb3JjZVN1c3BlbnNlRmFsbGJhY2sgPSAyOwogIHZhciBzdXNwZW5zZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKERlZmF1bHRTdXNwZW5zZUNvbnRleHQpOwogIGZ1bmN0aW9uIGhhc1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBmbGFnKSB7CiAgICByZXR1cm4gKHBhcmVudENvbnRleHQgJiBmbGFnKSAhPT0gMDsKICB9CiAgZnVuY3Rpb24gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCkgewogICAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzazsKICB9CiAgZnVuY3Rpb24gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzaGFsbG93Q29udGV4dCkgewogICAgcmV0dXJuIHBhcmVudENvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayB8IHNoYWxsb3dDb250ZXh0OwogIH0KICBmdW5jdGlvbiBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHN1YnRyZWVDb250ZXh0KSB7CiAgICByZXR1cm4gcGFyZW50Q29udGV4dCB8IHN1YnRyZWVDb250ZXh0OwogIH0KICBmdW5jdGlvbiBwdXNoU3VzcGVuc2VDb250ZXh0KGZpYmVyLCBuZXdDb250ZXh0KSB7CiAgICBwdXNoKHN1c3BlbnNlU3RhY2tDdXJzb3IsIG5ld0NvbnRleHQsIGZpYmVyKTsKICB9CiAgZnVuY3Rpb24gcG9wU3VzcGVuc2VDb250ZXh0KGZpYmVyKSB7CiAgICBwb3Aoc3VzcGVuc2VTdGFja0N1cnNvciwgZmliZXIpOwogIH0KCiAgZnVuY3Rpb24gc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKHdvcmtJblByb2dyZXNzLCBoYXNJbnZpc2libGVQYXJlbnQpIHsKICAgIC8vIElmIGl0IHdhcyB0aGUgcHJpbWFyeSBjaGlsZHJlbiB0aGF0IGp1c3Qgc3VzcGVuZGVkLCBjYXB0dXJlIGFuZCByZW5kZXIgdGhlCiAgICAvLyBmYWxsYmFjay4gT3RoZXJ3aXNlLCBkb24ndCBjYXB0dXJlIGFuZCBidWJibGUgdG8gdGhlIG5leHQgYm91bmRhcnkuCiAgICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsKCiAgICBpZiAobmV4dFN0YXRlICE9PSBudWxsKSB7CiAgICAgIGlmIChuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkgewogICAgICAgIC8vIEEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbHdheXMgY2FwdHVyZXMuCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzOyAvLyBSZWd1bGFyIGJvdW5kYXJpZXMgYWx3YXlzIGNhcHR1cmUuCgogICAgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gLy8gSWYgaXQncyBhIGJvdW5kYXJ5IHdlIHNob3VsZCBhdm9pZCwgdGhlbiB3ZSBwcmVmZXIgdG8gYnViYmxlIHVwIHRvIHRoZQogIH0KICBmdW5jdGlvbiBmaW5kRmlyc3RTdXNwZW5kZWQocm93KSB7CiAgICB2YXIgbm9kZSA9IHJvdzsKCiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkgewogICAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7CiAgICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlOwoKICAgICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHsKICAgICAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3RhdGUuZGVoeWRyYXRlZDsKCiAgICAgICAgICBpZiAoZGVoeWRyYXRlZCA9PT0gbnVsbCB8fCBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGRlaHlkcmF0ZWQpIHx8IGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGRlaHlkcmF0ZWQpKSB7CiAgICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50ICYmIC8vIHJldmVhbE9yZGVyIHVuZGVmaW5lZCBjYW4ndCBiZSB0cnVzdGVkIGJlY2F1c2UgaXQgZG9uJ3QKICAgICAgLy8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGl0IHN1c3BlbmRlZCBvciBub3QuCiAgICAgIG5vZGUubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFyIGRpZFN1c3BlbmQgPSAobm9kZS5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzOwoKICAgICAgICBpZiAoZGlkU3VzcGVuZCkgewogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHsKICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7CiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIGlmIChub2RlID09PSByb3cpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkgewogICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gcm93KSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIG5vZGUgPSBub2RlLnJldHVybjsKICAgICAgfQoKICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuOwogICAgICBub2RlID0gbm9kZS5zaWJsaW5nOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgdmFyIE5vRmxhZ3MkMSA9CiAgLyogICAqLwogIDA7IC8vIFJlcHJlc2VudHMgd2hldGhlciBlZmZlY3Qgc2hvdWxkIGZpcmUuCgogIHZhciBIYXNFZmZlY3QgPQogIC8qICovCiAgMTsgLy8gUmVwcmVzZW50cyB0aGUgcGhhc2UgaW4gd2hpY2ggdGhlIGVmZmVjdCAobm90IHRoZSBjbGVhbi11cCkgZmlyZXMuCgogIHZhciBJbnNlcnRpb24gPQogIC8qICAqLwogIDI7CiAgdmFyIExheW91dCA9CiAgLyogICAgKi8KICA0OwogIHZhciBQYXNzaXZlJDEgPQogIC8qICAgKi8KICA4OwoKICAvLyBhbmQgc2hvdWxkIGJlIHJlc2V0IGJlZm9yZSBzdGFydGluZyBhIG5ldyByZW5kZXIuCiAgLy8gVGhpcyB0cmFja3Mgd2hpY2ggbXV0YWJsZSBzb3VyY2VzIG5lZWQgdG8gYmUgcmVzZXQgYWZ0ZXIgYSByZW5kZXIuCgogIHZhciB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMgPSBbXTsKICBmdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IHdvcmtJblByb2dyZXNzU291cmNlc1tpXTsKCiAgICAgIHsKICAgICAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGggPSAwOwogIH0KICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmVyc2lvbiB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nIG1hdGNoZXMgdGhlIG9uZQogIC8vIHRoYXQgaXMgZXZlbnR1YWxseSByZWFkIGR1cmluZyBoeWRyYXRpb24uCiAgLy8gSWYgdGhleSBkb24ndCBtYXRjaCB0aGVyZSdzIGEgcG90ZW50aWFsIHRlYXIgYW5kIGEgZnVsbCBkZW9wdCByZW5kZXIgaXMgcmVxdWlyZWQuCgogIGZ1bmN0aW9uIHJlZ2lzdGVyTXV0YWJsZVNvdXJjZUZvckh5ZHJhdGlvbihyb290LCBtdXRhYmxlU291cmNlKSB7CiAgICB2YXIgZ2V0VmVyc2lvbiA9IG11dGFibGVTb3VyY2UuX2dldFZlcnNpb247CiAgICB2YXIgdmVyc2lvbiA9IGdldFZlcnNpb24obXV0YWJsZVNvdXJjZS5fc291cmNlKTsgLy8gVE9ETyBDbGVhciB0aGlzIGRhdGEgb25jZSBhbGwgcGVuZGluZyBoeWRyYXRpb24gd29yayBpcyBmaW5pc2hlZC4KICAgIC8vIFJldGFpbmluZyBpdCBmb3JldmVyIG1heSBpbnRlcmZlcmUgd2l0aCBHQy4KCiAgICBpZiAocm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID09IG51bGwpIHsKICAgICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gW211dGFibGVTb3VyY2UsIHZlcnNpb25dOwogICAgfSBlbHNlIHsKICAgICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2gobXV0YWJsZVNvdXJjZSwgdmVyc2lvbik7CiAgICB9CiAgfQoKICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlciwKICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOwogIHZhciBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQ7CiAgdmFyIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90OwoKICB7CiAgICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7CiAgfQoKICAvLyBUaGVzZSBhcmUgc2V0IHJpZ2h0IGJlZm9yZSBjYWxsaW5nIHRoZSBjb21wb25lbnQuCiAgdmFyIHJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIEkndmUgbmFtZWQgaXQgZGlmZmVyZW50bHkgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbQogIC8vIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suCgogIHZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDsgLy8gSG9va3MgYXJlIHN0b3JlZCBhcyBhIGxpbmtlZCBsaXN0IG9uIHRoZSBmaWJlcidzIG1lbW9pemVkU3RhdGUgZmllbGQuIFRoZQogIC8vIGN1cnJlbnQgaG9vayBsaXN0IGlzIHRoZSBsaXN0IHRoYXQgYmVsb25ncyB0byB0aGUgY3VycmVudCBmaWJlci4gVGhlCiAgLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCiAgLy8gd29yay1pbi1wcm9ncmVzcyBmaWJlci4KCiAgdmFyIGN1cnJlbnRIb29rID0gbnVsbDsKICB2YXIgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDsgLy8gV2hldGhlciBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBhdCBhbnkgcG9pbnQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIFRoaXMKICAvLyBkb2VzIG5vdCBnZXQgcmVzZXQgaWYgd2UgZG8gYW5vdGhlciByZW5kZXIgcGFzczsgb25seSB3aGVuIHdlJ3JlIGNvbXBsZXRlbHkKICAvLyBmaW5pc2hlZCBldmFsdWF0aW5nIHRoaXMgY29tcG9uZW50LiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBzbyB3ZSBrbm93CiAgLy8gd2hldGhlciB3ZSBuZWVkIHRvIGNsZWFyIHJlbmRlciBwaGFzZSB1cGRhdGVzIGFmdGVyIGEgdGhyb3cuCgogIHZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7IC8vIFdoZXJlIGFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIG9ubHkgZHVyaW5nIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzLiBUaGlzCiAgLy8gZ2V0cyByZXNldCBhZnRlciBlYWNoIGF0dGVtcHQuCiAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBzb21lIHdheSB0byBjb25zb2xpZGF0ZSB0aGlzIHdpdGgKICAvLyBgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZWAuIE9yIHdpdGggYG51bWJlck9mUmVSZW5kZXJzYC4KCiAgdmFyIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlOyAvLyBDb3VudHMgdGhlIG51bWJlciBvZiB1c2VJZCBob29rcyBpbiB0aGlzIGNvbXBvbmVudC4KCiAgdmFyIGxvY2FsSWRDb3VudGVyID0gMDsgLy8gVXNlZCBmb3IgaWRzIHRoYXQgYXJlIGdlbmVyYXRlZCBjb21wbGV0ZWx5IGNsaWVudC1zaWRlIChpLmUuIG5vdCBkdXJpbmcKICAvLyBoeWRyYXRpb24pLiBUaGlzIGNvdW50ZXIgaXMgZ2xvYmFsLCBzbyBjbGllbnQgaWRzIGFyZSBub3Qgc3RhYmxlIGFjcm9zcwogIC8vIHJlbmRlciBhdHRlbXB0cy4KCiAgdmFyIGdsb2JhbENsaWVudElkQ291bnRlciA9IDA7CiAgdmFyIFJFX1JFTkRFUl9MSU1JVCA9IDI1OyAvLyBJbiBERVYsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgcHJpbWl0aXZlIGhvb2sKCiAgdmFyIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDsgLy8gSW4gREVWLCB0aGlzIGxpc3QgZW5zdXJlcyB0aGF0IGhvb2tzIGFyZSBjYWxsZWQgaW4gdGhlIHNhbWUgb3JkZXIgYmV0d2VlbiByZW5kZXJzLgogIC8vIFRoZSBsaXN0IHN0b3JlcyB0aGUgb3JkZXIgb2YgaG9va3MgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgcmVuZGVyIChtb3VudCkuCiAgLy8gU3Vic2VxdWVudCByZW5kZXJzICh1cGRhdGVzKSByZWZlcmVuY2UgdGhpcyBsaXN0LgoKICB2YXIgaG9va1R5cGVzRGV2ID0gbnVsbDsKICB2YXIgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gSW4gREVWLCB0aGlzIHRyYWNrcyB3aGV0aGVyIGN1cnJlbnRseSByZW5kZXJpbmcgY29tcG9uZW50IG5lZWRzIHRvIGlnbm9yZQogIC8vIHRoZSBkZXBlbmRlbmNpZXMgZm9yIEhvb2tzIHRoYXQgbmVlZCB0aGVtIChlLmcuIHVzZUVmZmVjdCBvciB1c2VNZW1vKS4KICAvLyBXaGVuIHRydWUsIHN1Y2ggSG9va3Mgd2lsbCBhbHdheXMgYmUgInJlbW91bnRlZCIuIE9ubHkgdXNlZCBkdXJpbmcgaG90IHJlbG9hZC4KCiAgdmFyIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7CgogIGZ1bmN0aW9uIG1vdW50SG9va1R5cGVzRGV2KCkgewogICAgewogICAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjsKCiAgICAgIGlmIChob29rVHlwZXNEZXYgPT09IG51bGwpIHsKICAgICAgICBob29rVHlwZXNEZXYgPSBbaG9va05hbWVdOwogICAgICB9IGVsc2UgewogICAgICAgIGhvb2tUeXBlc0Rldi5wdXNoKGhvb2tOYW1lKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlSG9va1R5cGVzRGV2KCkgewogICAgewogICAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjsKCiAgICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHsKICAgICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldisrOwoKICAgICAgICBpZiAoaG9va1R5cGVzRGV2W2hvb2tUeXBlc1VwZGF0ZUluZGV4RGV2XSAhPT0gaG9va05hbWUpIHsKICAgICAgICAgIHdhcm5Pbkhvb2tNaXNtYXRjaEluRGV2KGhvb2tOYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpIHsKICAgIHsKICAgICAgaWYgKGRlcHMgIT09IHVuZGVmaW5lZCAmJiBkZXBzICE9PSBudWxsICYmICFpc0FycmF5KGRlcHMpKSB7CiAgICAgICAgLy8gVmVyaWZ5IGRlcHMsIGJ1dCBvbmx5IG9uIG1vdW50IHRvIGF2b2lkIGV4dHJhIGNoZWNrcy4KICAgICAgICAvLyBJdCdzIHVubGlrZWx5IHRoZWlyIHR5cGUgd291bGQgY2hhbmdlIGFzIHVzdWFsbHkgeW91IGRlZmluZSB0aGVtIGlubGluZS4KICAgICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCB0aGF0IGlzIG5vdCBhbiBhcnJheSAoaW5zdGVhZCwgcmVjZWl2ZWQgYCVzYCkuIFdoZW4gJyArICdzcGVjaWZpZWQsIHRoZSBmaW5hbCBhcmd1bWVudCBtdXN0IGJlIGFuIGFycmF5LicsIGN1cnJlbnRIb29rTmFtZUluRGV2LCB0eXBlb2YgZGVwcyk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHdhcm5Pbkhvb2tNaXNtYXRjaEluRGV2KGN1cnJlbnRIb29rTmFtZSkgewogICAgewogICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSk7CgogICAgICBpZiAoIWRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHsKICAgICAgICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpOwoKICAgICAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7CiAgICAgICAgICB2YXIgdGFibGUgPSAnJzsKICAgICAgICAgIHZhciBzZWNvbmRDb2x1bW5TdGFydCA9IDMwOwoKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHsKICAgICAgICAgICAgdmFyIG9sZEhvb2tOYW1lID0gaG9va1R5cGVzRGV2W2ldOwogICAgICAgICAgICB2YXIgbmV3SG9va05hbWUgPSBpID09PSBob29rVHlwZXNVcGRhdGVJbmRleERldiA/IGN1cnJlbnRIb29rTmFtZSA6IG9sZEhvb2tOYW1lOwogICAgICAgICAgICB2YXIgcm93ID0gaSArIDEgKyAiLiAiICsgb2xkSG9va05hbWU7IC8vIEV4dHJhIHNwYWNlIHNvIHNlY29uZCBjb2x1bW4gbGluZXMgdXAKICAgICAgICAgICAgLy8gbG9sIEAgSUUgbm90IHN1cHBvcnRpbmcgU3RyaW5nI3JlcGVhdAoKICAgICAgICAgICAgd2hpbGUgKHJvdy5sZW5ndGggPCBzZWNvbmRDb2x1bW5TdGFydCkgewogICAgICAgICAgICAgIHJvdyArPSAnICc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJvdyArPSBuZXdIb29rTmFtZSArICdcbic7CiAgICAgICAgICAgIHRhYmxlICs9IHJvdzsKICAgICAgICAgIH0KCiAgICAgICAgICBlcnJvcignUmVhY3QgaGFzIGRldGVjdGVkIGEgY2hhbmdlIGluIHRoZSBvcmRlciBvZiBIb29rcyBjYWxsZWQgYnkgJXMuICcgKyAnVGhpcyB3aWxsIGxlYWQgdG8gYnVncyBhbmQgZXJyb3JzIGlmIG5vdCBmaXhlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVhZCB0aGUgUnVsZXMgb2YgSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rc1xuXG4nICsgJyAgIFByZXZpb3VzIHJlbmRlciAgICAgICAgICAgIE5leHQgcmVuZGVyXG4nICsgJyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJyArICclcycgKyAnICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXG4nLCBjb21wb25lbnROYW1lLCB0YWJsZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3InICsgJyBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxuJyArICcxLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcbicgKyAnMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xuJyArICczLiBZb3UgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QgaW4gdGhlIHNhbWUgYXBwXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLicpOwogIH0KCiAgZnVuY3Rpb24gYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykgewogICAgewogICAgICBpZiAoaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMpIHsKICAgICAgICAvLyBPbmx5IHRydWUgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyBiZWluZyBob3QgcmVsb2FkZWQuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CgogICAgaWYgKHByZXZEZXBzID09PSBudWxsKSB7CiAgICAgIHsKICAgICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCBub3QgZHVyaW5nICcgKyAndGhlIHByZXZpb3VzIHJlbmRlci4gRXZlbiB0aG91Z2ggdGhlIGZpbmFsIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCAnICsgJ2l0cyB0eXBlIGNhbm5vdCBjaGFuZ2UgYmV0d2VlbiByZW5kZXJzLicsIGN1cnJlbnRIb29rTmFtZUluRGV2KTsKICAgICAgfQoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHsKICAgICAgLy8gRG9uJ3QgYm90aGVyIGNvbXBhcmluZyBsZW5ndGhzIGluIHByb2QgYmVjYXVzZSB0aGVzZSBhcnJheXMgc2hvdWxkIGJlCiAgICAgIC8vIHBhc3NlZCBpbmxpbmUuCiAgICAgIGlmIChuZXh0RGVwcy5sZW5ndGggIT09IHByZXZEZXBzLmxlbmd0aCkgewogICAgICAgIGVycm9yKCdUaGUgZmluYWwgYXJndW1lbnQgcGFzc2VkIHRvICVzIGNoYW5nZWQgc2l6ZSBiZXR3ZWVuIHJlbmRlcnMuIFRoZSAnICsgJ29yZGVyIGFuZCBzaXplIG9mIHRoaXMgYXJyYXkgbXVzdCByZW1haW4gY29uc3RhbnQuXG5cbicgKyAnUHJldmlvdXM6ICVzXG4nICsgJ0luY29taW5nOiAlcycsIGN1cnJlbnRIb29rTmFtZUluRGV2LCAiWyIgKyBwcmV2RGVwcy5qb2luKCcsICcpICsgIl0iLCAiWyIgKyBuZXh0RGVwcy5qb2luKCcsICcpICsgIl0iKTsKICAgICAgfQogICAgfQoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldkRlcHMubGVuZ3RoICYmIGkgPCBuZXh0RGVwcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAob2JqZWN0SXMobmV4dERlcHNbaV0sIHByZXZEZXBzW2ldKSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZywgbmV4dFJlbmRlckxhbmVzKSB7CiAgICByZW5kZXJMYW5lcyA9IG5leHRSZW5kZXJMYW5lczsKICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSB3b3JrSW5Qcm9ncmVzczsKCiAgICB7CiAgICAgIGhvb2tUeXBlc0RldiA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcyA6IG51bGw7CiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIFVzZWQgZm9yIGhvdCByZWxvYWRpbmc6CgogICAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy50eXBlOwogICAgfQoKICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsOwogICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsOwogICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXNldAogICAgLy8gY3VycmVudEhvb2sgPSBudWxsOwogICAgLy8gd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDsKICAgIC8vIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsKICAgIC8vIGxvY2FsSWRDb3VudGVyID0gMDsKICAgIC8vIFRPRE8gV2FybiBpZiBubyBob29rcyBhcmUgdXNlZCBhdCBhbGwgZHVyaW5nIG1vdW50LCB0aGVuIHNvbWUgYXJlIHVzZWQgZHVyaW5nIHVwZGF0ZS4KICAgIC8vIEN1cnJlbnRseSB3ZSB3aWxsIGlkZW50aWZ5IHRoZSB1cGRhdGUgcmVuZGVyIGFzIGEgbW91bnQgYmVjYXVzZSBtZW1vaXplZFN0YXRlID09PSBudWxsLgogICAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSkKICAgIC8vIFVzaW5nIG1lbW9pemVkU3RhdGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG1vdW50L3VwZGF0ZSBvbmx5IHdvcmtzIGlmIGF0IGxlYXN0IG9uZSBzdGF0ZWZ1bCBob29rIGlzIHVzZWQuCiAgICAvLyBOb24tc3RhdGVmdWwgaG9va3MgKGUuZy4gY29udGV4dCkgZG9uJ3QgZ2V0IGFkZGVkIHRvIG1lbW9pemVkU3RhdGUsCiAgICAvLyBzbyBtZW1vaXplZFN0YXRlIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy4KCiAgICB7CiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkgewogICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjsKICAgICAgfSBlbHNlIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHsKICAgICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgaGFuZGxlcyBhbiBlZGdlIGNhc2Ugd2hlcmUgYSBjb21wb25lbnQgaXMgdXBkYXRpbmcsCiAgICAgICAgLy8gYnV0IG5vIHN0YXRlZnVsIGhvb2tzIGhhdmUgYmVlbiB1c2VkLgogICAgICAgIC8vIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3Rpb24gY29kZSBiZWhhdmlvciAod2hpY2ggd2lsbCB1c2UgSG9va3NEaXNwYXRjaGVyT25Nb3VudCksCiAgICAgICAgLy8gYnV0IHdpdGggdGhlIGV4dHJhIERFViB2YWxpZGF0aW9uIHRvIGVuc3VyZSBob29rcyBvcmRlcmluZyBoYXNuJ3QgY2hhbmdlZC4KICAgICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgZG9lcyB0aGF0LgogICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVjsKICAgICAgfSBlbHNlIHsKICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjsKICAgICAgfQogICAgfQoKICAgIHZhciBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTsgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZQoKICAgIGlmIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpIHsKICAgICAgLy8gS2VlcCByZW5kZXJpbmcgaW4gYSBsb29wIGZvciBhcyBsb25nIGFzIHJlbmRlciBwaGFzZSB1cGRhdGVzIGNvbnRpbnVlIHRvCiAgICAgIC8vIGJlIHNjaGVkdWxlZC4gVXNlIGEgY291bnRlciB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLgogICAgICB2YXIgbnVtYmVyT2ZSZVJlbmRlcnMgPSAwOwoKICAgICAgZG8gewogICAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlOwogICAgICAgIGxvY2FsSWRDb3VudGVyID0gMDsKCiAgICAgICAgaWYgKG51bWJlck9mUmVSZW5kZXJzID49IFJFX1JFTkRFUl9MSU1JVCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgJyArICdhbiBpbmZpbml0ZSBsb29wLicpOwogICAgICAgIH0KCiAgICAgICAgbnVtYmVyT2ZSZVJlbmRlcnMgKz0gMTsKCiAgICAgICAgewogICAgICAgICAgLy8gRXZlbiB3aGVuIGhvdCByZWxvYWRpbmcsIGFsbG93IGRlcGVuZGVuY2llcyB0byBzdGFiaWxpemUKICAgICAgICAgIC8vIGFmdGVyIGZpcnN0IHJlbmRlciB0byBwcmV2ZW50IGluZmluaXRlIHJlbmRlciBwaGFzZSB1cGRhdGVzLgogICAgICAgICAgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBmYWxzZTsKICAgICAgICB9IC8vIFN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CgoKICAgICAgICBjdXJyZW50SG9vayA9IG51bGw7CiAgICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDsKICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7CgogICAgICAgIHsKICAgICAgICAgIC8vIEFsc28gdmFsaWRhdGUgaG9vayBvcmRlciBmb3IgY2FzY2FkaW5nIHVwZGF0ZXMuCiAgICAgICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOwogICAgICAgIH0KCiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWIDsKICAgICAgICBjaGlsZHJlbiA9IENvbXBvbmVudChwcm9wcywgc2Vjb25kQXJnKTsKICAgICAgfSB3aGlsZSAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKTsKICAgIH0gLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdAogICAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmNlLgoKCiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjsKCiAgICB7CiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0hvb2tUeXBlcyA9IGhvb2tUeXBlc0RldjsKICAgIH0gLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuCiAgICAvLyBob29rVHlwZXNEZXYgY291bGQgY2F0Y2ggbW9yZSBjYXNlcyAoZS5nLiBjb250ZXh0KSBidXQgb25seSBpbiBERVYgYnVuZGxlcy4KCgogICAgdmFyIGRpZFJlbmRlclRvb0Zld0hvb2tzID0gY3VycmVudEhvb2sgIT09IG51bGwgJiYgY3VycmVudEhvb2submV4dCAhPT0gbnVsbDsKICAgIHJlbmRlckxhbmVzID0gTm9MYW5lczsKICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsOwogICAgY3VycmVudEhvb2sgPSBudWxsOwogICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDsKCiAgICB7CiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDsKICAgICAgaG9va1R5cGVzRGV2ID0gbnVsbDsKICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTsgLy8gQ29uZmlybSB0aGF0IGEgc3RhdGljIGZsYWcgd2FzIG5vdCBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZSBsYXN0CiAgICAgIC8vIHJlbmRlci4gSWYgdGhpcyBmaXJlcywgaXQgc3VnZ2VzdHMgdGhhdCB3ZSBpbmNvcnJlY3RseSByZXNldCB0aGUgc3RhdGljCiAgICAgIC8vIGZsYWdzIGluIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgY29kZWJhc2UuIFRoaXMgaGFzIGhhcHBlbmVkIGJlZm9yZSwgZm9yCiAgICAgIC8vIGV4YW1wbGUsIGluIHRoZSBTdXNwZW5zZUxpc3QgaW1wbGVtZW50YXRpb24uCgogICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAoY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2spICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTdGF0aWNNYXNrKSAmJiAvLyBEaXNhYmxlIHRoaXMgd2FybmluZyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBsZWdhY3kgU3VzcGVuc2UgaXMgd2VpcmQKICAgICAgLy8gYW5kIGNyZWF0ZXMgZmFsc2UgcG9zaXRpdmVzLiBUbyBtYWtlIHRoaXMgd29yayBpbiBsZWdhY3kgbW9kZSwgd2UnZAogICAgICAvLyBuZWVkIHRvIG1hcmsgZmliZXJzIHRoYXQgY29tbWl0IGluIGFuIGluY29tcGxldGUgc3RhdGUsIHNvbWVob3cuIEZvcgogICAgICAvLyBub3cgSSdsbCBkaXNhYmxlIHRoZSB3YXJuaW5nIHRoYXQgbW9zdCBvZiB0aGUgYnVncyB0aGF0IHdvdWxkIHRyaWdnZXIKICAgICAgLy8gaXQgYXJlIGVpdGhlciBleGNsdXNpdmUgdG8gY29uY3VycmVudCBtb2RlIG9yIGV4aXN0IGluIGJvdGguCiAgICAgIChjdXJyZW50Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkgewogICAgICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogRXhwZWN0ZWQgc3RhdGljIGZsYWcgd2FzIG1pc3NpbmcuIFBsZWFzZSAnICsgJ25vdGlmeSB0aGUgUmVhY3QgdGVhbS4nKTsKICAgICAgfQogICAgfQoKICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gVGhpcyBpcyByZXNldCBieSBjaGVja0RpZFJlbmRlcklkSG9vawogICAgLy8gbG9jYWxJZENvdW50ZXIgPSAwOwoKICAgIGlmIChkaWRSZW5kZXJUb29GZXdIb29rcykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIGZld2VyIGhvb2tzIHRoYW4gZXhwZWN0ZWQuIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBhbiBhY2NpZGVudGFsICcgKyAnZWFybHkgcmV0dXJuIHN0YXRlbWVudC4nKTsKICAgIH0KCiAgICByZXR1cm4gY2hpbGRyZW47CiAgfQogIGZ1bmN0aW9uIGNoZWNrRGlkUmVuZGVySWRIb29rKCkgewogICAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGV2ZXJ5IHJlbmRlcldpdGhIb29rcyBjYWxsLgogICAgLy8gQ29uY2VwdHVhbGx5LCBpdCdzIHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiByZW5kZXJXaXRoSG9va3M7IGl0J3Mgb25seSBhCiAgICAvLyBzZXBhcmF0ZSBmdW5jdGlvbiB0byBhdm9pZCB1c2luZyBhbiBhcnJheSB0dXBsZS4KICAgIHZhciBkaWRSZW5kZXJJZEhvb2sgPSBsb2NhbElkQ291bnRlciAhPT0gMDsKICAgIGxvY2FsSWRDb3VudGVyID0gMDsKICAgIHJldHVybiBkaWRSZW5kZXJJZEhvb2s7CiAgfQogIGZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHsKICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byByZXNldCB0aGUgZmxhZ3MgaGVyZSwgYmVjYXVzZSB0aGV5J3JlIHJlc2V0IGluIHRoZQogICAgLy8gY29tcGxldGUgcGhhc2UgKGJ1YmJsZVByb3BlcnRpZXMpLgoKICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkgewogICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KE1vdW50UGFzc2l2ZURldiB8IE1vdW50TGF5b3V0RGV2IHwgUGFzc2l2ZSB8IFVwZGF0ZSk7CiAgICB9IGVsc2UgewogICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpOwogICAgfQoKICAgIGN1cnJlbnQubGFuZXMgPSByZW1vdmVMYW5lcyhjdXJyZW50LmxhbmVzLCBsYW5lcyk7CiAgfQogIGZ1bmN0aW9uIHJlc2V0SG9va3NBZnRlclRocm93KCkgewogICAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgcHJldmlvdXMgZGlzcGF0Y2hlciBpcyBhbHdheXMgdGhpcyBvbmUsIHNpbmNlIHdlIHNldCBpdAogICAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmNlLgogICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7CgogICAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUpIHsKICAgICAgLy8gVGhlcmUgd2VyZSByZW5kZXIgcGhhc2UgdXBkYXRlcy4gVGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIHRoaXMgcmVuZGVyCiAgICAgIC8vIHBoYXNlLCB3aGljaCB3ZSBhcmUgbm93IGFib3J0aW5nLiBSZW1vdmUgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWVzIHNvCiAgICAgIC8vIHRoZXkgZG8gbm90IHBlcnNpc3QgdG8gdGhlIG5leHQgcmVuZGVyLiBEbyBub3QgcmVtb3ZlIHVwZGF0ZXMgZnJvbSBob29rcwogICAgICAvLyB0aGF0IHdlcmVuJ3QgcHJvY2Vzc2VkLgogICAgICAvLwogICAgICAvLyBPbmx5IHJlc2V0IHRoZSB1cGRhdGVzIGZyb20gdGhlIHF1ZXVlIGlmIGl0IGhhcyBhIGNsb25lLiBJZiBpdCBkb2VzCiAgICAgIC8vIG5vdCBoYXZlIGEgY2xvbmUsIHRoYXQgbWVhbnMgaXQgd2Fzbid0IHByb2Nlc3NlZCwgYW5kIHRoZSB1cGRhdGVzIHdlcmUKICAgICAgLy8gc2NoZWR1bGVkIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSByZW5kZXIgcGhhc2UuCiAgICAgIHZhciBob29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlOwoKICAgICAgd2hpbGUgKGhvb2sgIT09IG51bGwpIHsKICAgICAgICB2YXIgcXVldWUgPSBob29rLnF1ZXVlOwoKICAgICAgICBpZiAocXVldWUgIT09IG51bGwpIHsKICAgICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgaG9vayA9IGhvb2submV4dDsKICAgICAgfQoKICAgICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOwogICAgfQoKICAgIHJlbmRlckxhbmVzID0gTm9MYW5lczsKICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsOwogICAgY3VycmVudEhvb2sgPSBudWxsOwogICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDsKCiAgICB7CiAgICAgIGhvb2tUeXBlc0RldiA9IG51bGw7CiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7CiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDsKICAgICAgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlOwogICAgfQoKICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9IGZhbHNlOwogICAgbG9jYWxJZENvdW50ZXIgPSAwOwogIH0KCiAgZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSB7CiAgICB2YXIgaG9vayA9IHsKICAgICAgbWVtb2l6ZWRTdGF0ZTogbnVsbCwKICAgICAgYmFzZVN0YXRlOiBudWxsLAogICAgICBiYXNlUXVldWU6IG51bGwsCiAgICAgIHF1ZXVlOiBudWxsLAogICAgICBuZXh0OiBudWxsCiAgICB9OwoKICAgIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHsKICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgaG9vayBpbiB0aGUgbGlzdAogICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rOwogICAgfSBlbHNlIHsKICAgICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rOwogICAgfQoKICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKSB7CiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYm90aCBmb3IgdXBkYXRlcyBhbmQgZm9yIHJlLXJlbmRlcnMgdHJpZ2dlcmVkIGJ5IGEKICAgIC8vIHJlbmRlciBwaGFzZSB1cGRhdGUuIEl0IGFzc3VtZXMgdGhlcmUgaXMgZWl0aGVyIGEgY3VycmVudCBob29rIHdlIGNhbgogICAgLy8gY2xvbmUsIG9yIGEgd29yay1pbi1wcm9ncmVzcyBob29rIGZyb20gYSBwcmV2aW91cyByZW5kZXIgcGFzcyB0aGF0IHdlIGNhbgogICAgLy8gdXNlIGFzIGEgYmFzZS4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBiYXNlIGxpc3QsIHdlIG11c3Qgc3dpdGNoIHRvCiAgICAvLyB0aGUgZGlzcGF0Y2hlciB1c2VkIGZvciBtb3VudHMuCiAgICB2YXIgbmV4dEN1cnJlbnRIb29rOwoKICAgIGlmIChjdXJyZW50SG9vayA9PT0gbnVsbCkgewogICAgICB2YXIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuYWx0ZXJuYXRlOwoKICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHsKICAgICAgICBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV4dEN1cnJlbnRIb29rID0gbnVsbDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDsKICAgIH0KCiAgICB2YXIgbmV4dFdvcmtJblByb2dyZXNzSG9vazsKCiAgICBpZiAod29ya0luUHJvZ3Jlc3NIb29rID09PSBudWxsKSB7CiAgICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGU7CiAgICB9IGVsc2UgewogICAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7CiAgICB9CgogICAgaWYgKG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgIT09IG51bGwpIHsKICAgICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuCiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2s7CiAgICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDsKICAgICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7CiAgICB9IGVsc2UgewogICAgICAvLyBDbG9uZSBmcm9tIHRoZSBjdXJyZW50IGhvb2suCiAgICAgIGlmIChuZXh0Q3VycmVudEhvb2sgPT09IG51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbmRlcmVkIG1vcmUgaG9va3MgdGhhbiBkdXJpbmcgdGhlIHByZXZpb3VzIHJlbmRlci4nKTsKICAgICAgfQoKICAgICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7CiAgICAgIHZhciBuZXdIb29rID0gewogICAgICAgIG1lbW9pemVkU3RhdGU6IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGUsCiAgICAgICAgYmFzZVN0YXRlOiBjdXJyZW50SG9vay5iYXNlU3RhdGUsCiAgICAgICAgYmFzZVF1ZXVlOiBjdXJyZW50SG9vay5iYXNlUXVldWUsCiAgICAgICAgcXVldWU6IGN1cnJlbnRIb29rLnF1ZXVlLAogICAgICAgIG5leHQ6IG51bGwKICAgICAgfTsKCiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHsKICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBob29rIGluIHRoZSBsaXN0LgogICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZSA9IHdvcmtJblByb2dyZXNzSG9vayA9IG5ld0hvb2s7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCiAgICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBuZXdIb29rOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vazsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSB7CiAgICByZXR1cm4gewogICAgICBsYXN0RWZmZWN0OiBudWxsLAogICAgICBzdG9yZXM6IG51bGwKICAgIH07CiAgfQoKICBmdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7CiAgICAvLyAkRmxvd0ZpeE1lOiBGbG93IGRvZXNuJ3QgbGlrZSBtaXhlZCB0eXBlcwogICAgcmV0dXJuIHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicgPyBhY3Rpb24oc3RhdGUpIDogYWN0aW9uOwogIH0KCiAgZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHsKICAgIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTsKICAgIHZhciBpbml0aWFsU3RhdGU7CgogICAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkgewogICAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpOwogICAgfSBlbHNlIHsKICAgICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbEFyZzsKICAgIH0KCiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTsKICAgIHZhciBxdWV1ZSA9IHsKICAgICAgcGVuZGluZzogbnVsbCwKICAgICAgaW50ZXJsZWF2ZWQ6IG51bGwsCiAgICAgIGxhbmVzOiBOb0xhbmVzLAogICAgICBkaXNwYXRjaDogbnVsbCwKICAgICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogcmVkdWNlciwKICAgICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZQogICAgfTsKICAgIGhvb2sucXVldWUgPSBxdWV1ZTsKICAgIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoID0gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpOwogICAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkgewogICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTsKICAgIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7CgogICAgaWYgKHF1ZXVlID09PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgfQoKICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyOwogICAgdmFyIGN1cnJlbnQgPSBjdXJyZW50SG9vazsgLy8gVGhlIGxhc3QgcmViYXNlIHVwZGF0ZSB0aGF0IGlzIE5PVCBwYXJ0IG9mIHRoZSBiYXNlIHN0YXRlLgoKICAgIHZhciBiYXNlUXVldWUgPSBjdXJyZW50LmJhc2VRdWV1ZTsgLy8gVGhlIGxhc3QgcGVuZGluZyB1cGRhdGUgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LgoKICAgIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5wZW5kaW5nOwoKICAgIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHsKICAgICAgLy8gV2UgaGF2ZSBuZXcgdXBkYXRlcyB0aGF0IGhhdmVuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LgogICAgICAvLyBXZSdsbCBhZGQgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS4KICAgICAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkgewogICAgICAgIC8vIE1lcmdlIHRoZSBwZW5kaW5nIHF1ZXVlIGFuZCB0aGUgYmFzZSBxdWV1ZS4KICAgICAgICB2YXIgYmFzZUZpcnN0ID0gYmFzZVF1ZXVlLm5leHQ7CiAgICAgICAgdmFyIHBlbmRpbmdGaXJzdCA9IHBlbmRpbmdRdWV1ZS5uZXh0OwogICAgICAgIGJhc2VRdWV1ZS5uZXh0ID0gcGVuZGluZ0ZpcnN0OwogICAgICAgIHBlbmRpbmdRdWV1ZS5uZXh0ID0gYmFzZUZpcnN0OwogICAgICB9CgogICAgICB7CiAgICAgICAgaWYgKGN1cnJlbnQuYmFzZVF1ZXVlICE9PSBiYXNlUXVldWUpIHsKICAgICAgICAgIC8vIEludGVybmFsIGludmFyaWFudCB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBmZWFzaWJseSBjb3VsZCBpbgogICAgICAgICAgLy8gdGhlIGZ1dHVyZSBpZiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcsIG9yIHNvbWUgZm9ybSBvZiB0aGF0LgogICAgICAgICAgZXJyb3IoJ0ludGVybmFsIGVycm9yOiBFeHBlY3RlZCB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIHRvIGJlIGEgY2xvbmUuICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGN1cnJlbnQuYmFzZVF1ZXVlID0gYmFzZVF1ZXVlID0gcGVuZGluZ1F1ZXVlOwogICAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDsKICAgIH0KCiAgICBpZiAoYmFzZVF1ZXVlICE9PSBudWxsKSB7CiAgICAgIC8vIFdlIGhhdmUgYSBxdWV1ZSB0byBwcm9jZXNzLgogICAgICB2YXIgZmlyc3QgPSBiYXNlUXVldWUubmV4dDsKICAgICAgdmFyIG5ld1N0YXRlID0gY3VycmVudC5iYXNlU3RhdGU7CiAgICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsOwogICAgICB2YXIgbmV3QmFzZVF1ZXVlRmlyc3QgPSBudWxsOwogICAgICB2YXIgbmV3QmFzZVF1ZXVlTGFzdCA9IG51bGw7CiAgICAgIHZhciB1cGRhdGUgPSBmaXJzdDsKCiAgICAgIGRvIHsKICAgICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lOwoKICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHsKICAgICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3QKICAgICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZQogICAgICAgICAgLy8gdXBkYXRlL3N0YXRlLgogICAgICAgICAgdmFyIGNsb25lID0gewogICAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLAogICAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sCiAgICAgICAgICAgIGhhc0VhZ2VyU3RhdGU6IHVwZGF0ZS5oYXNFYWdlclN0YXRlLAogICAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSwKICAgICAgICAgICAgbmV4dDogbnVsbAogICAgICAgICAgfTsKCiAgICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCA9PT0gbnVsbCkgewogICAgICAgICAgICBuZXdCYXNlUXVldWVGaXJzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QgPSBjbG9uZTsKICAgICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gY2xvbmU7CiAgICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS4KICAgICAgICAgIC8vIFRPRE86IERvbid0IG5lZWQgdG8gYWNjdW11bGF0ZSB0aGlzLiBJbnN0ZWFkLCB3ZSBjYW4gcmVtb3ZlCiAgICAgICAgICAvLyByZW5kZXJMYW5lcyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy4KCgogICAgICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcyA9IG1lcmdlTGFuZXMoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5sYW5lcywgdXBkYXRlTGFuZSk7CiAgICAgICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKHVwZGF0ZUxhbmUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBkb2VzIGhhdmUgc3VmZmljaWVudCBwcmlvcml0eS4KICAgICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHZhciBfY2xvbmUgPSB7CiAgICAgICAgICAgICAgLy8gVGhpcyB1cGRhdGUgaXMgZ29pbmcgdG8gYmUgY29tbWl0dGVkIHNvIHdlIG5ldmVyIHdhbnQgdW5jb21taXQKICAgICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvCiAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLgogICAgICAgICAgICAgIGxhbmU6IE5vTGFuZSwKICAgICAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sCiAgICAgICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsCiAgICAgICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsCiAgICAgICAgICAgICAgbmV4dDogbnVsbAogICAgICAgICAgICB9OwogICAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gX2Nsb25lOwogICAgICAgICAgfSAvLyBQcm9jZXNzIHRoaXMgdXBkYXRlLgoKCiAgICAgICAgICBpZiAodXBkYXRlLmhhc0VhZ2VyU3RhdGUpIHsKICAgICAgICAgICAgLy8gSWYgdGhpcyB1cGRhdGUgaXMgYSBzdGF0ZSB1cGRhdGUgKG5vdCBhIHJlZHVjZXIpIGFuZCB3YXMgcHJvY2Vzc2VkIGVhZ2VybHksCiAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgdGhlIGVhZ2VybHkgY29tcHV0ZWQgc3RhdGUKICAgICAgICAgICAgbmV3U3RhdGUgPSB1cGRhdGUuZWFnZXJTdGF0ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uOwogICAgICAgICAgICBuZXdTdGF0ZSA9IHJlZHVjZXIobmV3U3RhdGUsIGFjdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDsKICAgICAgfSB3aGlsZSAodXBkYXRlICE9PSBudWxsICYmIHVwZGF0ZSAhPT0gZmlyc3QpOwoKICAgICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgPT09IG51bGwpIHsKICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBuZXdCYXNlUXVldWVGaXJzdDsKICAgICAgfSAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzCiAgICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLgoKCiAgICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHsKICAgICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpOwogICAgICB9CgogICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTsKICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7CiAgICAgIGhvb2suYmFzZVF1ZXVlID0gbmV3QmFzZVF1ZXVlTGFzdDsKICAgICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTsKICAgIH0gLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0bwogICAgLy8gcHJvY2VzcyB0aGVtIGR1cmluZyB0aGlzIHJlbmRlciwgYnV0IHdlIGRvIG5lZWQgdG8gdHJhY2sgd2hpY2ggbGFuZXMKICAgIC8vIGFyZSByZW1haW5pbmcuCgoKICAgIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDsKCiAgICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7CiAgICAgIHZhciBpbnRlcmxlYXZlZCA9IGxhc3RJbnRlcmxlYXZlZDsKCiAgICAgIGRvIHsKICAgICAgICB2YXIgaW50ZXJsZWF2ZWRMYW5lID0gaW50ZXJsZWF2ZWQubGFuZTsKICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBpbnRlcmxlYXZlZExhbmUpOwogICAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoaW50ZXJsZWF2ZWRMYW5lKTsKICAgICAgICBpbnRlcmxlYXZlZCA9IGludGVybGVhdmVkLm5leHQ7CiAgICAgIH0gd2hpbGUgKGludGVybGVhdmVkICE9PSBsYXN0SW50ZXJsZWF2ZWQpOwogICAgfSBlbHNlIGlmIChiYXNlUXVldWUgPT09IG51bGwpIHsKICAgICAgLy8gYHF1ZXVlLmxhbmVzYCBpcyB1c2VkIGZvciBlbnRhbmdsaW5nIHRyYW5zaXRpb25zLiBXZSBjYW4gc2V0IGl0IGJhY2sgdG8KICAgICAgLy8gemVybyBvbmNlIHRoZSBxdWV1ZSBpcyBlbXB0eS4KICAgICAgcXVldWUubGFuZXMgPSBOb0xhbmVzOwogICAgfQoKICAgIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoOwogICAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTsKICB9CgogIGZ1bmN0aW9uIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7CiAgICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpOwogICAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTsKCiAgICBpZiAocXVldWUgPT09IG51bGwpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7CiAgICB9CgogICAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7IC8vIFRoaXMgaXMgYSByZS1yZW5kZXIuIEFwcGx5IHRoZSBuZXcgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgdG8gdGhlIHByZXZpb3VzCiAgICAvLyB3b3JrLWluLXByb2dyZXNzIGhvb2suCgogICAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2g7CiAgICB2YXIgbGFzdFJlbmRlclBoYXNlVXBkYXRlID0gcXVldWUucGVuZGluZzsKICAgIHZhciBuZXdTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTsKCiAgICBpZiAobGFzdFJlbmRlclBoYXNlVXBkYXRlICE9PSBudWxsKSB7CiAgICAgIC8vIFRoZSBxdWV1ZSBkb2Vzbid0IHBlcnNpc3QgcGFzdCB0aGlzIHJlbmRlciBwYXNzLgogICAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDsKICAgICAgdmFyIGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUgPSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dDsKICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0UmVuZGVyUGhhc2VVcGRhdGU7CgogICAgICBkbyB7CiAgICAgICAgLy8gUHJvY2VzcyB0aGlzIHJlbmRlciBwaGFzZSB1cGRhdGUuIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlCiAgICAgICAgLy8gcHJpb3JpdHkgYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBhcyB0aGUgY3VycmVudAogICAgICAgIC8vIHJlbmRlcidzLgogICAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uOwogICAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTsKICAgICAgICB1cGRhdGUgPSB1cGRhdGUubmV4dDsKICAgICAgfSB3aGlsZSAodXBkYXRlICE9PSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlKTsgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpcwogICAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS4KCgogICAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7CiAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTsKICAgICAgfQoKICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7IC8vIERvbid0IHBlcnNpc3QgdGhlIHN0YXRlIGFjY3VtdWxhdGVkIGZyb20gdGhlIHJlbmRlciBwaGFzZSB1cGRhdGVzIHRvCiAgICAgIC8vIHRoZSBiYXNlIHN0YXRlIHVubGVzcyB0aGUgcXVldWUgaXMgZW1wdHkuCiAgICAgIC8vIFRPRE86IE5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGRlc2lyZWQgc2VtYW50aWNzLCBidXQgaXQncyB3aGF0IHdlCiAgICAgIC8vIGRvIGZvciBnRFNGUC4gSSBjYW4ndCByZW1lbWJlciB3aHkuCgogICAgICBpZiAoaG9vay5iYXNlUXVldWUgPT09IG51bGwpIHsKICAgICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOwogICAgICB9CgogICAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlOwogICAgfQoKICAgIHJldHVybiBbbmV3U3RhdGUsIGRpc3BhdGNoXTsKICB9CgogIGZ1bmN0aW9uIG1vdW50TXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHsKICAgIHsKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZU11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7CiAgICB7CiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7CiAgICB2YXIgZmliZXIgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxOwogICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpOwogICAgdmFyIG5leHRTbmFwc2hvdDsKICAgIHZhciBpc0h5ZHJhdGluZyA9IGdldElzSHlkcmF0aW5nKCk7CgogICAgaWYgKGlzSHlkcmF0aW5nKSB7CiAgICAgIGlmIChnZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGdldFNlcnZlclNuYXBzaG90LCB3aGljaCBpcyByZXF1aXJlZCBmb3IgJyArICdzZXJ2ZXItcmVuZGVyZWQgY29udGVudC4gV2lsbCByZXZlcnQgdG8gY2xpZW50IHJlbmRlcmluZy4nKTsKICAgICAgfQoKICAgICAgbmV4dFNuYXBzaG90ID0gZ2V0U2VydmVyU25hcHNob3QoKTsKCiAgICAgIHsKICAgICAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7CiAgICAgICAgICBpZiAobmV4dFNuYXBzaG90ICE9PSBnZXRTZXJ2ZXJTbmFwc2hvdCgpKSB7CiAgICAgICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNlcnZlclNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpOwoKICAgICAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbmV4dFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTsKCiAgICAgIHsKICAgICAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7CiAgICAgICAgICB2YXIgY2FjaGVkU25hcHNob3QgPSBnZXRTbmFwc2hvdCgpOwoKICAgICAgICAgIGlmICghb2JqZWN0SXMobmV4dFNuYXBzaG90LCBjYWNoZWRTbmFwc2hvdCkpIHsKICAgICAgICAgICAgZXJyb3IoJ1RoZSByZXN1bHQgb2YgZ2V0U25hcHNob3Qgc2hvdWxkIGJlIGNhY2hlZCB0byBhdm9pZCBhbiBpbmZpbml0ZSBsb29wJyk7CgogICAgICAgICAgICBkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IC8vIFVubGVzcyB3ZSdyZSByZW5kZXJpbmcgYSBibG9ja2luZyBsYW5lLCBzY2hlZHVsZSBhIGNvbnNpc3RlbmN5IGNoZWNrLgogICAgICAvLyBSaWdodCBiZWZvcmUgY29tbWl0dGluZywgd2Ugd2lsbCB3YWxrIHRoZSB0cmVlIGFuZCBjaGVjayBpZiBhbnkgb2YgdGhlCiAgICAgIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQuCiAgICAgIC8vCiAgICAgIC8vIFdlIHdvbid0IGRvIHRoaXMgaWYgd2UncmUgaHlkcmF0aW5nIHNlcnZlci1yZW5kZXJlZCBjb250ZW50LCBiZWNhdXNlIGlmCiAgICAgIC8vIHRoZSBjb250ZW50IGlzIHN0YWxlLCBpdCdzIGFscmVhZHkgdmlzaWJsZSBhbnl3YXkuIEluc3RlYWQgd2UnbGwgcGF0Y2gKICAgICAgLy8gaXQgdXAgaW4gYSBwYXNzaXZlIGVmZmVjdC4KCgogICAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpOwoKICAgICAgaWYgKHJvb3QgPT09IG51bGwpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTsKICAgICAgfQoKICAgICAgaWYgKCFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCByZW5kZXJMYW5lcykpIHsKICAgICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTsKICAgICAgfQogICAgfSAvLyBSZWFkIHRoZSBjdXJyZW50IHNuYXBzaG90IGZyb20gdGhlIHN0b3JlIG9uIGV2ZXJ5IHJlbmRlci4gVGhpcyBicmVha3MgdGhlCiAgICAvLyBub3JtYWwgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmUgdXBkYXRlcyBhcmUKICAgIC8vIGFsd2F5cyBzeW5jaHJvbm91cy4KCgogICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV4dFNuYXBzaG90OwogICAgdmFyIGluc3QgPSB7CiAgICAgIHZhbHVlOiBuZXh0U25hcHNob3QsCiAgICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdAogICAgfTsKICAgIGhvb2sucXVldWUgPSBpbnN0OyAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZS4KCiAgICBtb3VudEVmZmVjdChzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIHN1YnNjcmliZSksIFtzdWJzY3JpYmVdKTsgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIHVwZGF0ZSB0aGUgbXV0YWJsZSBpbnN0YW5jZSBmaWVsZHMuIFdlIHdpbGwgdXBkYXRlCiAgICAvLyB0aGlzIHdoZW5ldmVyIHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIG9yIHZhbHVlIGNoYW5nZXMuIEJlY2F1c2UgdGhlcmUncyBubwogICAgLy8gY2xlYW4tdXAgZnVuY3Rpb24sIGFuZCB3ZSB0cmFjayB0aGUgZGVwcyBjb3JyZWN0bHksIHdlIGNhbiBjYWxsIHB1c2hFZmZlY3QKICAgIC8vIGRpcmVjdGx5LCB3aXRob3V0IHN0b3JpbmcgYW55IGFkZGl0aW9uYWwgc3RhdGUuIEZvciB0aGUgc2FtZSByZWFzb24sIHdlCiAgICAvLyBkb24ndCBuZWVkIHRvIHNldCBhIHN0YXRpYyBmbGFnLCBlaXRoZXIuCiAgICAvLyBUT0RPOiBXZSBjYW4gbW92ZSB0aGlzIHRvIHRoZSBwYXNzaXZlIHBoYXNlIG9uY2Ugd2UgYWRkIGEgcHJlLWNvbW1pdAogICAgLy8gY29uc2lzdGVuY3kgY2hlY2suIFNlZSB0aGUgbmV4dCBjb21tZW50LgoKICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmU7CiAgICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTsKICAgIHJldHVybiBuZXh0U25hcHNob3Q7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkgewogICAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTsKICAgIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7IC8vIFJlYWQgdGhlIGN1cnJlbnQgc25hcHNob3QgZnJvbSB0aGUgc3RvcmUgb24gZXZlcnkgcmVuZGVyLiBUaGlzIGJyZWFrcyB0aGUKICAgIC8vIG5vcm1hbCBydWxlcyBvZiBSZWFjdCwgYW5kIG9ubHkgd29ya3MgYmVjYXVzZSBzdG9yZSB1cGRhdGVzIGFyZQogICAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLgoKICAgIHZhciBuZXh0U25hcHNob3QgPSBnZXRTbmFwc2hvdCgpOwoKICAgIHsKICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkgewogICAgICAgIHZhciBjYWNoZWRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7CgogICAgICAgIGlmICghb2JqZWN0SXMobmV4dFNuYXBzaG90LCBjYWNoZWRTbmFwc2hvdCkpIHsKICAgICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpOwoKICAgICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2YXIgcHJldlNuYXBzaG90ID0gaG9vay5tZW1vaXplZFN0YXRlOwogICAgdmFyIHNuYXBzaG90Q2hhbmdlZCA9ICFvYmplY3RJcyhwcmV2U25hcHNob3QsIG5leHRTbmFwc2hvdCk7CgogICAgaWYgKHNuYXBzaG90Q2hhbmdlZCkgewogICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXh0U25hcHNob3Q7CiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7CiAgICB9CgogICAgdmFyIGluc3QgPSBob29rLnF1ZXVlOwogICAgdXBkYXRlRWZmZWN0KHN1YnNjcmliZVRvU3RvcmUuYmluZChudWxsLCBmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSwgW3N1YnNjcmliZV0pOyAvLyBXaGVuZXZlciBnZXRTbmFwc2hvdCBvciBzdWJzY3JpYmUgY2hhbmdlcywgd2UgbmVlZCB0byBjaGVjayBpbiB0aGUKICAgIC8vIGNvbW1pdCBwaGFzZSBpZiB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgbXV0YXRpb24uIEluIGNvbmN1cnJlbnQgbW9kZQogICAgLy8gdGhpcyBjYW4gaGFwcGVuIGFsbCB0aGUgdGltZSwgYnV0IGV2ZW4gaW4gc3luY2hyb25vdXMgbW9kZSwgYW4gZWFybGllcgogICAgLy8gZWZmZWN0IG1heSBoYXZlIG11dGF0ZWQgdGhlIHN0b3JlLgoKICAgIGlmIChpbnN0LmdldFNuYXBzaG90ICE9PSBnZXRTbmFwc2hvdCB8fCBzbmFwc2hvdENoYW5nZWQgfHwgLy8gQ2hlY2sgaWYgdGhlIHN1c2JjcmliZSBmdW5jdGlvbiBjaGFuZ2VkLiBXZSBjYW4gc2F2ZSBzb21lIG1lbW9yeSBieQogICAgLy8gY2hlY2tpbmcgd2hldGhlciB3ZSBzY2hlZHVsZWQgYSBzdWJzY3JpcHRpb24gZWZmZWN0IGFib3ZlLgogICAgd29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzSG9vay5tZW1vaXplZFN0YXRlLnRhZyAmIEhhc0VmZmVjdCkgewogICAgICBmaWJlci5mbGFncyB8PSBQYXNzaXZlOwogICAgICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTsgLy8gVW5sZXNzIHdlJ3JlIHJlbmRlcmluZyBhIGJsb2NraW5nIGxhbmUsIHNjaGVkdWxlIGEgY29uc2lzdGVuY3kgY2hlY2suCiAgICAgIC8vIFJpZ2h0IGJlZm9yZSBjb21taXR0aW5nLCB3ZSB3aWxsIHdhbGsgdGhlIHRyZWUgYW5kIGNoZWNrIGlmIGFueSBvZiB0aGUKICAgICAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZC4KCiAgICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7CgogICAgICBpZiAocm9vdCA9PT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB3b3JrLWluLXByb2dyZXNzIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICB9CgogICAgICBpZiAoIWluY2x1ZGVzQmxvY2tpbmdMYW5lKHJvb3QsIHJlbmRlckxhbmVzKSkgewogICAgICAgIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCBuZXh0U25hcHNob3QpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5leHRTbmFwc2hvdDsKICB9CgogIGZ1bmN0aW9uIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCByZW5kZXJlZFNuYXBzaG90KSB7CiAgICBmaWJlci5mbGFncyB8PSBTdG9yZUNvbnNpc3RlbmN5OwogICAgdmFyIGNoZWNrID0gewogICAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QsCiAgICAgIHZhbHVlOiByZW5kZXJlZFNuYXBzaG90CiAgICB9OwogICAgdmFyIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZTsKCiAgICBpZiAoY29tcG9uZW50VXBkYXRlUXVldWUgPT09IG51bGwpIHsKICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7CiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZTsKICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUuc3RvcmVzID0gW2NoZWNrXTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBzdG9yZXMgPSBjb21wb25lbnRVcGRhdGVRdWV1ZS5zdG9yZXM7CgogICAgICBpZiAoc3RvcmVzID09PSBudWxsKSB7CiAgICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUuc3RvcmVzID0gW2NoZWNrXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdG9yZXMucHVzaChjaGVjayk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVN0b3JlSW5zdGFuY2UoZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHsKICAgIC8vIFRoZXNlIGFyZSB1cGRhdGVkIGluIHRoZSBwYXNzaXZlIHBoYXNlCiAgICBpbnN0LnZhbHVlID0gbmV4dFNuYXBzaG90OwogICAgaW5zdC5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBTb21ldGhpbmcgbWF5IGhhdmUgYmVlbiBtdXRhdGVkIGluIGJldHdlZW4gcmVuZGVyIGFuZCBjb21taXQuIFRoaXMgY291bGQKICAgIC8vIGhhdmUgYmVlbiBpbiBhbiBldmVudCB0aGF0IGZpcmVkIGJlZm9yZSB0aGUgcGFzc2l2ZSBlZmZlY3RzLCBvciBpdCBjb3VsZAogICAgLy8gaGF2ZSBiZWVuIGluIGEgbGF5b3V0IGVmZmVjdC4gSW4gdGhhdCBjYXNlLCB3ZSB3b3VsZCBoYXZlIHVzZWQgdGhlIG9sZAogICAgLy8gc25hcHNobyBhbmQgZ2V0U25hcHNob3QgdmFsdWVzIHRvIGJhaWwgb3V0LiBXZSBuZWVkIHRvIGNoZWNrIG9uZSBtb3JlIHRpbWUuCgogICAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHsKICAgICAgLy8gRm9yY2UgYSByZS1yZW5kZXIuCiAgICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzdWJzY3JpYmVUb1N0b3JlKGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpIHsKICAgIHZhciBoYW5kbGVTdG9yZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgLy8gVGhlIHN0b3JlIGNoYW5nZWQuIENoZWNrIGlmIHRoZSBzbmFwc2hvdCBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UKICAgICAgLy8gcmVhZCBmcm9tIHRoZSBzdG9yZS4KICAgICAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHsKICAgICAgICAvLyBGb3JjZSBhIHJlLXJlbmRlci4KICAgICAgICBmb3JjZVN0b3JlUmVyZW5kZXIoZmliZXIpOwogICAgICB9CiAgICB9OyAvLyBTdWJzY3JpYmUgdG8gdGhlIHN0b3JlIGFuZCByZXR1cm4gYSBjbGVhbi11cCBmdW5jdGlvbi4KCgogICAgcmV0dXJuIHN1YnNjcmliZShoYW5kbGVTdG9yZUNoYW5nZSk7CiAgfQoKICBmdW5jdGlvbiBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpIHsKICAgIHZhciBsYXRlc3RHZXRTbmFwc2hvdCA9IGluc3QuZ2V0U25hcHNob3Q7CiAgICB2YXIgcHJldlZhbHVlID0gaW5zdC52YWx1ZTsKCiAgICB0cnkgewogICAgICB2YXIgbmV4dFZhbHVlID0gbGF0ZXN0R2V0U25hcHNob3QoKTsKICAgICAgcmV0dXJuICFvYmplY3RJcyhwcmV2VmFsdWUsIG5leHRWYWx1ZSk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcikgewogICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTsKCiAgICBpZiAocm9vdCAhPT0gbnVsbCkgewogICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSkgewogICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpOwoKICAgIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzCiAgICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZSgpOwogICAgfQoKICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlOwogICAgdmFyIHF1ZXVlID0gewogICAgICBwZW5kaW5nOiBudWxsLAogICAgICBpbnRlcmxlYXZlZDogbnVsbCwKICAgICAgbGFuZXM6IE5vTGFuZXMsCiAgICAgIGRpc3BhdGNoOiBudWxsLAogICAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiBiYXNpY1N0YXRlUmVkdWNlciwKICAgICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZQogICAgfTsKICAgIGhvb2sucXVldWUgPSBxdWV1ZTsKICAgIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoID0gZGlzcGF0Y2hTZXRTdGF0ZS5iaW5kKG51bGwsIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIHF1ZXVlKTsKICAgIHJldHVybiBbaG9vay5tZW1vaXplZFN0YXRlLCBkaXNwYXRjaF07CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpIHsKICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTsKICB9CgogIGZ1bmN0aW9uIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKSB7CiAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTsKICB9CgogIGZ1bmN0aW9uIHB1c2hFZmZlY3QodGFnLCBjcmVhdGUsIGRlc3Ryb3ksIGRlcHMpIHsKICAgIHZhciBlZmZlY3QgPSB7CiAgICAgIHRhZzogdGFnLAogICAgICBjcmVhdGU6IGNyZWF0ZSwKICAgICAgZGVzdHJveTogZGVzdHJveSwKICAgICAgZGVwczogZGVwcywKICAgICAgLy8gQ2lyY3VsYXIKICAgICAgbmV4dDogbnVsbAogICAgfTsKICAgIHZhciBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWU7CgogICAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7CiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpOwogICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlID0gY29tcG9uZW50VXBkYXRlUXVldWU7CiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBsYXN0RWZmZWN0ID0gY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdDsKCiAgICAgIGlmIChsYXN0RWZmZWN0ID09PSBudWxsKSB7CiAgICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0OwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDsKICAgICAgICBsYXN0RWZmZWN0Lm5leHQgPSBlZmZlY3Q7CiAgICAgICAgZWZmZWN0Lm5leHQgPSBmaXJzdEVmZmVjdDsKICAgICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0OwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGVmZmVjdDsKICB9CgogIGZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkgewogICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpOwoKICAgIHsKICAgICAgdmFyIF9yZWYyID0gewogICAgICAgIGN1cnJlbnQ6IGluaXRpYWxWYWx1ZQogICAgICB9OwogICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBfcmVmMjsKICAgICAgcmV0dXJuIF9yZWYyOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUmVmKGluaXRpYWxWYWx1ZSkgewogICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTsKICAgIHJldHVybiBob29rLm1lbW9pemVkU3RhdGU7CiAgfQoKICBmdW5jdGlvbiBtb3VudEVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHsKICAgIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTsKICAgIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzOwogICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzOwogICAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgdW5kZWZpbmVkLCBuZXh0RGVwcyk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7CiAgICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpOwogICAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7CiAgICB2YXIgZGVzdHJveSA9IHVuZGVmaW5lZDsKCiAgICBpZiAoY3VycmVudEhvb2sgIT09IG51bGwpIHsKICAgICAgdmFyIHByZXZFZmZlY3QgPSBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlOwogICAgICBkZXN0cm95ID0gcHJldkVmZmVjdC5kZXN0cm95OwoKICAgICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7CiAgICAgICAgdmFyIHByZXZEZXBzID0gcHJldkVmZmVjdC5kZXBzOwoKICAgICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHsKICAgICAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7CiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7CiAgfQoKICBmdW5jdGlvbiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpIHsKICAgIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7CiAgICAgIHJldHVybiBtb3VudEVmZmVjdEltcGwoTW91bnRQYXNzaXZlRGV2IHwgUGFzc2l2ZSB8IFBhc3NpdmVTdGF0aWMsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBtb3VudEVmZmVjdEltcGwoUGFzc2l2ZSB8IFBhc3NpdmVTdGF0aWMsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpIHsKICAgIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFBhc3NpdmUsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTsKICB9CgogIGZ1bmN0aW9uIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykgewogICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChVcGRhdGUsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpIHsKICAgIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpOwogIH0KCiAgZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7CiAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTsKCiAgICB7CiAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljOwogICAgfQoKICAgIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7CiAgICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7CiAgICB9CgogICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7CiAgICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIExheW91dCwgY3JlYXRlLCBkZXBzKTsKICB9CgogIGZ1bmN0aW9uIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QoY3JlYXRlLCByZWYpIHsKICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHZhciByZWZDYWxsYmFjayA9IHJlZjsKCiAgICAgIHZhciBfaW5zdCA9IGNyZWF0ZSgpOwoKICAgICAgcmVmQ2FsbGJhY2soX2luc3QpOwogICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgIHJlZkNhbGxiYWNrKG51bGwpOwogICAgICB9OwogICAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHsKICAgICAgdmFyIHJlZk9iamVjdCA9IHJlZjsKCiAgICAgIHsKICAgICAgICBpZiAoIXJlZk9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpKSB7CiAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIGZpcnN0IGFyZ3VtZW50IHRvIGVpdGhlciBiZSBhICcgKyAncmVmIGNhbGxiYWNrIG9yIFJlYWN0LmNyZWF0ZVJlZigpIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgJ2FuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhyZWZPYmplY3QpLmpvaW4oJywgJykgKyAnfScpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIF9pbnN0MiA9IGNyZWF0ZSgpOwoKICAgICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBfaW5zdDI7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmVmT2JqZWN0LmN1cnJlbnQgPSBudWxsOwogICAgICB9OwogICAgfQogIH0KCiAgZnVuY3Rpb24gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7CiAgICB7CiAgICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbiAnICsgJ3RoYXQgY3JlYXRlcyBhIGhhbmRsZS4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY3JlYXRlICE9PSBudWxsID8gdHlwZW9mIGNyZWF0ZSA6ICdudWxsJyk7CiAgICAgIH0KICAgIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj8KCgogICAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7CiAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTsKCiAgICB7CiAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljOwogICAgfQoKICAgIGlmICggKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlKSB7CiAgICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7CiAgICB9CgogICAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykgewogICAgewogICAgICBpZiAodHlwZW9mIGNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpOwogICAgICB9CiAgICB9IC8vIFRPRE86IElmIGRlcHMgYXJlIHByb3ZpZGVkLCBzaG91bGQgd2Ugc2tpcCBjb21wYXJpbmcgdGhlIHJlZiBpdHNlbGY/CgoKICAgIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsOwogICAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksIGVmZmVjdERlcHMpOwogIH0KCiAgZnVuY3Rpb24gbW91bnREZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikgey8vIFRoaXMgaG9vayBpcyBub3JtYWxseSBhIG5vLW9wLgogICAgLy8gVGhlIHJlYWN0LWRlYnVnLWhvb2tzIHBhY2thZ2UgaW5qZWN0cyBpdHMgb3duIGltcGxlbWVudGF0aW9uCiAgICAvLyBzbyB0aGF0IGUuZy4gRGV2VG9vbHMgY2FuIGRpc3BsYXkgY3VzdG9tIGhvb2sgdmFsdWVzLgogIH0KCiAgdmFyIHVwZGF0ZURlYnVnVmFsdWUgPSBtb3VudERlYnVnVmFsdWU7CgogIGZ1bmN0aW9uIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHsKICAgIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTsKICAgIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzOwogICAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107CiAgICByZXR1cm4gY2FsbGJhY2s7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcykgewogICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTsKICAgIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzOwogICAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTsKCiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7CiAgICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkgewogICAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTsKCiAgICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7CiAgICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdOwogICAgcmV0dXJuIGNhbGxiYWNrOwogIH0KCiAgZnVuY3Rpb24gbW91bnRNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHsKICAgIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTsKICAgIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzOwogICAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTsKICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTsKICAgIHJldHVybiBuZXh0VmFsdWU7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHsKICAgIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7CiAgICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwczsKICAgIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7CgogICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkgewogICAgICAvLyBBc3N1bWUgdGhlc2UgYXJlIGRlZmluZWQuIElmIHRoZXkncmUgbm90LCBhcmVIb29rSW5wdXRzRXF1YWwgd2lsbCB3YXJuLgogICAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHsKICAgICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07CgogICAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkgewogICAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpOwogICAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdOwogICAgcmV0dXJuIG5leHRWYWx1ZTsKICB9CgogIGZ1bmN0aW9uIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSkgewogICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpOwogICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKSB7CiAgICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpOwogICAgdmFyIHJlc29sdmVkQ3VycmVudEhvb2sgPSBjdXJyZW50SG9vazsKICAgIHZhciBwcmV2VmFsdWUgPSByZXNvbHZlZEN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7CiAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSk7CiAgfQoKICBmdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHsKICAgIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7CgogICAgaWYgKGN1cnJlbnRIb29rID09PSBudWxsKSB7CiAgICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYSBtb3VudC4KICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYW4gdXBkYXRlLgogICAgICB2YXIgcHJldlZhbHVlID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTsKICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSkgewogICAgdmFyIHNob3VsZERlZmVyVmFsdWUgPSAhaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMocmVuZGVyTGFuZXMpOwoKICAgIGlmIChzaG91bGREZWZlclZhbHVlKSB7CiAgICAgIC8vIFRoaXMgaXMgYW4gdXJnZW50IHVwZGF0ZS4gSWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLCBrZWVwIHVzaW5nIHRoZQogICAgICAvLyBwcmV2aW91cyB2YWx1ZSBhbmQgc3Bhd24gYSBkZWZlcnJlZCByZW5kZXIgdG8gdXBkYXRlIGl0IGxhdGVyLgogICAgICBpZiAoIW9iamVjdElzKHZhbHVlLCBwcmV2VmFsdWUpKSB7CiAgICAgICAgLy8gU2NoZWR1bGUgYSBkZWZlcnJlZCByZW5kZXIKICAgICAgICB2YXIgZGVmZXJyZWRMYW5lID0gY2xhaW1OZXh0VHJhbnNpdGlvbkxhbmUoKTsKICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBkZWZlcnJlZExhbmUpOwogICAgICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMoZGVmZXJyZWRMYW5lKTsgLy8gU2V0IHRoaXMgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZW5kZXJlZCB2YWx1ZSBpcyBpbmNvbnNpc3RlbnQKICAgICAgICAvLyBmcm9tIHRoZSBsYXRlc3QgdmFsdWUuIFRoZSBuYW1lICJiYXNlU3RhdGUiIGRvZXNuJ3QgcmVhbGx5IG1hdGNoIGhvdyB3ZQogICAgICAgIC8vIHVzZSBpdCBiZWNhdXNlIHdlJ3JlIHJldXNpbmcgYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYQogICAgICAgIC8vIG5ldyBvbmUuCgogICAgICAgIGhvb2suYmFzZVN0YXRlID0gdHJ1ZTsKICAgICAgfSAvLyBSZXVzZSB0aGUgcHJldmlvdXMgdmFsdWUKCgogICAgICByZXR1cm4gcHJldlZhbHVlOwogICAgfSBlbHNlIHsKICAgICAgLy8gVGhpcyBpcyBub3QgYW4gdXJnZW50IHVwZGF0ZSwgc28gd2UgY2FuIHVzZSB0aGUgbGF0ZXN0IHZhbHVlIHJlZ2FyZGxlc3MKICAgICAgLy8gb2Ygd2hhdCBpdCBpcy4gTm8gbmVlZCB0byBkZWZlciBpdC4KICAgICAgLy8gSG93ZXZlciwgaWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhIHNwYXduZWQgcmVuZGVyLCB0aGVuIHdlIG5lZWQgdG8gbWFyawogICAgICAvLyB0aGlzIGFzIGFuIHVwZGF0ZSB0byBwcmV2ZW50IHRoZSBmaWJlciBmcm9tIGJhaWxpbmcgb3V0LgogICAgICAvLwogICAgICAvLyBgYmFzZVN0YXRlYCBpcyB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJlbmRlcmVkCiAgICAgIC8vIHZhbHVlLiBUaGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXRjaCBob3cgd2UgdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZwogICAgICAvLyBhIHN0YXRlIGhvb2sgZmllbGQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuCiAgICAgIGlmIChob29rLmJhc2VTdGF0ZSkgewogICAgICAgIC8vIEZsaXAgdGhpcyBiYWNrIHRvIGZhbHNlLgogICAgICAgIGhvb2suYmFzZVN0YXRlID0gZmFsc2U7CiAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTsKICAgICAgfQoKICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihzZXRQZW5kaW5nLCBjYWxsYmFjaywgb3B0aW9ucykgewogICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTsKICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShoaWdoZXJFdmVudFByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHksIENvbnRpbnVvdXNFdmVudFByaW9yaXR5KSk7CiAgICBzZXRQZW5kaW5nKHRydWUpOwogICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uOwogICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0ge307CiAgICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb247CgogICAgewogICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMgPSBuZXcgU2V0KCk7CiAgICB9CgogICAgdHJ5IHsKICAgICAgc2V0UGVuZGluZyhmYWxzZSk7CiAgICAgIGNhbGxiYWNrKCk7CiAgICB9IGZpbmFsbHkgewogICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7CiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uOwoKICAgICAgewogICAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykgewogICAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7CgogICAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7CiAgICAgICAgICAgIHdhcm4oJ0RldGVjdGVkIGEgbGFyZ2UgbnVtYmVyIG9mIHVwZGF0ZXMgaW5zaWRlIHN0YXJ0VHJhbnNpdGlvbi4gJyArICdJZiB0aGlzIGlzIGR1ZSB0byBhIHN1YnNjcmlwdGlvbiBwbGVhc2UgcmUtd3JpdGUgaXQgdG8gdXNlIFJlYWN0IHByb3ZpZGVkIGhvb2tzLiAnICsgJ090aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS4nKTsKICAgICAgICAgIH0KCiAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkgewogICAgdmFyIF9tb3VudFN0YXRlID0gbW91bnRTdGF0ZShmYWxzZSksCiAgICAgICAgaXNQZW5kaW5nID0gX21vdW50U3RhdGVbMF0sCiAgICAgICAgc2V0UGVuZGluZyA9IF9tb3VudFN0YXRlWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgbmV2ZXIgY2hhbmdlcy4KCgogICAgdmFyIHN0YXJ0ID0gc3RhcnRUcmFuc2l0aW9uLmJpbmQobnVsbCwgc2V0UGVuZGluZyk7CiAgICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7CiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBzdGFydDsKICAgIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkgewogICAgdmFyIF91cGRhdGVTdGF0ZSA9IHVwZGF0ZVN0YXRlKCksCiAgICAgICAgaXNQZW5kaW5nID0gX3VwZGF0ZVN0YXRlWzBdOwoKICAgIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7CiAgICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7CiAgICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdOwogIH0KCiAgZnVuY3Rpb24gcmVyZW5kZXJUcmFuc2l0aW9uKCkgewogICAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLAogICAgICAgIGlzUGVuZGluZyA9IF9yZXJlbmRlclN0YXRlWzBdOwoKICAgIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7CiAgICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7CiAgICByZXR1cm4gW2lzUGVuZGluZywgc3RhcnRdOwogIH0KCiAgdmFyIGlzVXBkYXRpbmdPcGFxdWVWYWx1ZUluUmVuZGVyUGhhc2UgPSBmYWxzZTsKICBmdW5jdGlvbiBnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSB7CiAgICB7CiAgICAgIHJldHVybiBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbW91bnRJZCgpIHsKICAgIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTsKICAgIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7IC8vIFRPRE86IEluIEZpenosIGlkIGdlbmVyYXRpb24gaXMgc3BlY2lmaWMgdG8gZWFjaCBzZXJ2ZXIgY29uZmlnLiBNYXliZSB3ZQogICAgLy8gc2hvdWxkIGRvIHRoaXMgaW4gRmliZXIsIHRvbz8gRGVmZXJyaW5nIHRoaXMgZGVjaXNpb24gZm9yIG5vdyBiZWNhdXNlCiAgICAvLyB0aGVyZSdzIG5vIG90aGVyIHBsYWNlIHRvIHN0b3JlIHRoZSBwcmVmaXggZXhjZXB0IGZvciBhbiBpbnRlcm5hbCBmaWVsZCBvbgogICAgLy8gdGhlIHB1YmxpYyBjcmVhdGVSb290IG9iamVjdCwgd2hpY2ggdGhlIGZpYmVyIHRyZWUgZG9lcyBub3QgY3VycmVudGx5IGhhdmUKICAgIC8vIGEgcmVmZXJlbmNlIHRvLgoKICAgIHZhciBpZGVudGlmaWVyUHJlZml4ID0gcm9vdC5pZGVudGlmaWVyUHJlZml4OwogICAgdmFyIGlkOwoKICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7CiAgICAgIHZhciB0cmVlSWQgPSBnZXRUcmVlSWQoKTsgLy8gVXNlIGEgY2FwdGlhbCBSIHByZWZpeCBmb3Igc2VydmVyLWdlbmVyYXRlZCBpZHMuCgogICAgICBpZCA9ICc6JyArIGlkZW50aWZpZXJQcmVmaXggKyAnUicgKyB0cmVlSWQ7IC8vIFVubGVzcyB0aGlzIGlzIHRoZSBmaXJzdCBpZCBhdCB0aGlzIGxldmVsLCBhcHBlbmQgYSBudW1iZXIgYXQgdGhlIGVuZAogICAgICAvLyB0aGF0IHJlcHJlc2VudHMgdGhlIHBvc2l0aW9uIG9mIHRoaXMgdXNlSWQgaG9vayBhbW9uZyBhbGwgdGhlIHVzZUlkCiAgICAgIC8vIGhvb2tzIGZvciB0aGlzIGZpYmVyLgoKICAgICAgdmFyIGxvY2FsSWQgPSBsb2NhbElkQ291bnRlcisrOwoKICAgICAgaWYgKGxvY2FsSWQgPiAwKSB7CiAgICAgICAgaWQgKz0gJ0gnICsgbG9jYWxJZC50b1N0cmluZygzMik7CiAgICAgIH0KCiAgICAgIGlkICs9ICc6JzsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFVzZSBhIGxvd2VyY2FzZSByIHByZWZpeCBmb3IgY2xpZW50LWdlbmVyYXRlZCBpZHMuCiAgICAgIHZhciBnbG9iYWxDbGllbnRJZCA9IGdsb2JhbENsaWVudElkQ291bnRlcisrOwogICAgICBpZCA9ICc6JyArIGlkZW50aWZpZXJQcmVmaXggKyAncicgKyBnbG9iYWxDbGllbnRJZC50b1N0cmluZygzMikgKyAnOic7CiAgICB9CgogICAgaG9vay5tZW1vaXplZFN0YXRlID0gaWQ7CiAgICByZXR1cm4gaWQ7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVJZCgpIHsKICAgIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7CiAgICB2YXIgaWQgPSBob29rLm1lbW9pemVkU3RhdGU7CiAgICByZXR1cm4gaWQ7CiAgfQoKICBmdW5jdGlvbiBkaXNwYXRjaFJlZHVjZXJBY3Rpb24oZmliZXIsIHF1ZXVlLCBhY3Rpb24pIHsKICAgIHsKICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBlcnJvcigiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgIiArICdzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciAnICsgJ3JlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTsKICAgICAgfQogICAgfQoKICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpOwogICAgdmFyIHVwZGF0ZSA9IHsKICAgICAgbGFuZTogbGFuZSwKICAgICAgYWN0aW9uOiBhY3Rpb24sCiAgICAgIGhhc0VhZ2VyU3RhdGU6IGZhbHNlLAogICAgICBlYWdlclN0YXRlOiBudWxsLAogICAgICBuZXh0OiBudWxsCiAgICB9OwoKICAgIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkgewogICAgICBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7CgogICAgICBpZiAocm9vdCAhPT0gbnVsbCkgewogICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7CiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpOwogICAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSk7CiAgICAgIH0KICAgIH0KCiAgICBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSk7CiAgfQoKICBmdW5jdGlvbiBkaXNwYXRjaFNldFN0YXRlKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7CiAgICB7CiAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZXJyb3IoIlN0YXRlIHVwZGF0ZXMgZnJvbSB0aGUgdXNlU3RhdGUoKSBhbmQgdXNlUmVkdWNlcigpIEhvb2tzIGRvbid0IHN1cHBvcnQgdGhlICIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTsKICAgIHZhciB1cGRhdGUgPSB7CiAgICAgIGxhbmU6IGxhbmUsCiAgICAgIGFjdGlvbjogYWN0aW9uLAogICAgICBoYXNFYWdlclN0YXRlOiBmYWxzZSwKICAgICAgZWFnZXJTdGF0ZTogbnVsbCwKICAgICAgbmV4dDogbnVsbAogICAgfTsKCiAgICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpIHsKICAgICAgZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTsKCiAgICAgIGlmIChmaWJlci5sYW5lcyA9PT0gTm9MYW5lcyAmJiAoYWx0ZXJuYXRlID09PSBudWxsIHx8IGFsdGVybmF0ZS5sYW5lcyA9PT0gTm9MYW5lcykpIHsKICAgICAgICAvLyBUaGUgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5LCB3aGljaCBtZWFucyB3ZSBjYW4gZWFnZXJseSBjb21wdXRlIHRoZQogICAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlCiAgICAgICAgLy8gc2FtZSBhcyB0aGUgY3VycmVudCBzdGF0ZSwgd2UgbWF5IGJlIGFibGUgdG8gYmFpbCBvdXQgZW50aXJlbHkuCiAgICAgICAgdmFyIGxhc3RSZW5kZXJlZFJlZHVjZXIgPSBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyOwoKICAgICAgICBpZiAobGFzdFJlbmRlcmVkUmVkdWNlciAhPT0gbnVsbCkgewogICAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyOwoKICAgICAgICAgIHsKICAgICAgICAgICAgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsKICAgICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjsKICAgICAgICAgIH0KCiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gcXVldWUubGFzdFJlbmRlcmVkU3RhdGU7CiAgICAgICAgICAgIHZhciBlYWdlclN0YXRlID0gbGFzdFJlbmRlcmVkUmVkdWNlcihjdXJyZW50U3RhdGUsIGFjdGlvbik7IC8vIFN0YXNoIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlLCBhbmQgdGhlIHJlZHVjZXIgdXNlZCB0byBjb21wdXRlCiAgICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlCiAgICAgICAgICAgIC8vIHRpbWUgd2UgZW50ZXIgdGhlIHJlbmRlciBwaGFzZSwgdGhlbiB0aGUgZWFnZXIgc3RhdGUgY2FuIGJlIHVzZWQKICAgICAgICAgICAgLy8gd2l0aG91dCBjYWxsaW5nIHRoZSByZWR1Y2VyIGFnYWluLgoKICAgICAgICAgICAgdXBkYXRlLmhhc0VhZ2VyU3RhdGUgPSB0cnVlOwogICAgICAgICAgICB1cGRhdGUuZWFnZXJTdGF0ZSA9IGVhZ2VyU3RhdGU7CgogICAgICAgICAgICBpZiAob2JqZWN0SXMoZWFnZXJTdGF0ZSwgY3VycmVudFN0YXRlKSkgewogICAgICAgICAgICAgIC8vIEZhc3QgcGF0aC4gV2UgY2FuIGJhaWwgb3V0IHdpdGhvdXQgc2NoZWR1bGluZyBSZWFjdCB0byByZS1yZW5kZXIuCiAgICAgICAgICAgICAgLy8gSXQncyBzdGlsbCBwb3NzaWJsZSB0aGF0IHdlJ2xsIG5lZWQgdG8gcmViYXNlIHRoaXMgdXBkYXRlIGxhdGVyLAogICAgICAgICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQgcmUtcmVuZGVycyBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIGFuZCBieSB0aGF0CiAgICAgICAgICAgICAgLy8gdGltZSB0aGUgcmVkdWNlciBoYXMgY2hhbmdlZC4KICAgICAgICAgICAgICAvLyBUT0RPOiBEbyB3ZSBzdGlsbCBuZWVkIHRvIGVudGFuZ2xlIHRyYW5zaXRpb25zIGluIHRoaXMgY2FzZT8KICAgICAgICAgICAgICBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGVBbmRFYWdlcmx5QmFpbG91dChmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLgogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgewogICAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRIb29rVXBkYXRlKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTsKCiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7CiAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTsKICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7CiAgICAgICAgZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKTsKICAgICAgfQogICAgfQoKICAgIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTsKICB9CgogIGZ1bmN0aW9uIGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpIHsKICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7CiAgICByZXR1cm4gZmliZXIgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTsKICB9CgogIGZ1bmN0aW9uIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKSB7CiAgICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gU3Rhc2ggaXQgaW4gYSBsYXppbHktY3JlYXRlZCBtYXAgb2YKICAgIC8vIHF1ZXVlIC0+IGxpbmtlZCBsaXN0IG9mIHVwZGF0ZXMuIEFmdGVyIHRoaXMgcmVuZGVyIHBhc3MsIHdlJ2xsIHJlc3RhcnQKICAgIC8vIGFuZCBhcHBseSB0aGUgc3Rhc2hlZCB1cGRhdGVzIG9uIHRvcCBvZiB0aGUgd29yay1pbi1wcm9ncmVzcyBob29rLgogICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IHRydWU7CiAgICB2YXIgcGVuZGluZyA9IHF1ZXVlLnBlbmRpbmc7CgogICAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHsKICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LgogICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsKICAgIH0gZWxzZSB7CiAgICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0OwogICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7CiAgICB9CgogICAgcXVldWUucGVuZGluZyA9IHVwZGF0ZTsKICB9IC8vIFRPRE86IE1vdmUgdG8gUmVhY3RGaWJlckNvbmN1cnJlbnRVcGRhdGVzPwoKCiAgZnVuY3Rpb24gZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKSB7CiAgICBpZiAoaXNUcmFuc2l0aW9uTGFuZShsYW5lKSkgewogICAgICB2YXIgcXVldWVMYW5lcyA9IHF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5CiAgICAgIC8vIG11c3QgaGF2ZSBmaW5pc2hlZC4gV2UgY2FuIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSwgd2hpY2gKICAgICAgLy8gcmVwcmVzZW50cyBhIHN1cGVyc2V0IG9mIHRoZSBhY3R1YWxseSBwZW5kaW5nIGxhbmVzLiBJbiBzb21lIGNhc2VzIHdlCiAgICAgIC8vIG1heSBlbnRhbmdsZSBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmCiAgICAgIC8vIHdlICpkb24ndCogZW50YW5nbGUgd2hlbiB3ZSBzaG91bGQuCgogICAgICBxdWV1ZUxhbmVzID0gaW50ZXJzZWN0TGFuZXMocXVldWVMYW5lcywgcm9vdC5wZW5kaW5nTGFuZXMpOyAvLyBFbnRhbmdsZSB0aGUgbmV3IHRyYW5zaXRpb24gbGFuZSB3aXRoIHRoZSBvdGhlciB0cmFuc2l0aW9uIGxhbmVzLgoKICAgICAgdmFyIG5ld1F1ZXVlTGFuZXMgPSBtZXJnZUxhbmVzKHF1ZXVlTGFuZXMsIGxhbmUpOwogICAgICBxdWV1ZS5sYW5lcyA9IG5ld1F1ZXVlTGFuZXM7IC8vIEV2ZW4gaWYgcXVldWUubGFuZXMgYWxyZWFkeSBpbmNsdWRlIGxhbmUsIHdlIGRvbid0IGtub3cgZm9yIGNlcnRhaW4gaWYKICAgICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG8KICAgICAgLy8gZW50YW5nbGUgaXQgYWdhaW4sIGp1c3QgdG8gYmUgc3VyZS4KCiAgICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIG5ld1F1ZXVlTGFuZXMpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUsIGFjdGlvbikgewoKICAgIHsKICAgICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTsKICAgIH0KICB9CgogIHZhciBDb250ZXh0T25seURpc3BhdGNoZXIgPSB7CiAgICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsCiAgICB1c2VDYWxsYmFjazogdGhyb3dJbnZhbGlkSG9va0Vycm9yLAogICAgdXNlQ29udGV4dDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLAogICAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsCiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsCiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvciwKICAgIHVzZUxheW91dEVmZmVjdDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLAogICAgdXNlTWVtbzogdGhyb3dJbnZhbGlkSG9va0Vycm9yLAogICAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLAogICAgdXNlUmVmOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsCiAgICB1c2VTdGF0ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLAogICAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLAogICAgdXNlRGVmZXJyZWRWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLAogICAgdXNlVHJhbnNpdGlvbjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLAogICAgdXNlTXV0YWJsZVNvdXJjZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLAogICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IHRocm93SW52YWxpZEhvb2tFcnJvciwKICAgIHVzZUlkOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsCiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXIKICB9OwoKICB2YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDsKICB2YXIgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IG51bGw7CiAgdmFyIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsOwogIHZhciBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsOwogIHZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbDsKICB2YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsOwogIHZhciBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDsKCiAgewogICAgdmFyIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpOwogICAgfTsKCiAgICB2YXIgd2FybkludmFsaWRIb29rQWNjZXNzID0gZnVuY3Rpb24gKCkgewogICAgICBlcnJvcignRG8gbm90IGNhbGwgSG9va3MgaW5zaWRlIHVzZUVmZmVjdCguLi4pLCB1c2VNZW1vKC4uLiksIG9yIG90aGVyIGJ1aWx0LWluIEhvb2tzLiAnICsgJ1lvdSBjYW4gb25seSBjYWxsIEhvb2tzIGF0IHRoZSB0b3AgbGV2ZWwgb2YgeW91ciBSZWFjdCBmdW5jdGlvbi4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzJyk7CiAgICB9OwoKICAgIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHsKICAgICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpOwogICAgICB9LAogICAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snOwogICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7CiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7CiAgICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpOwogICAgICB9LAogICAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnOwogICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpOwogICAgICB9LAogICAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnOwogICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7CiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7CiAgICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnOwogICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7CiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7CiAgICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTsKICAgICAgICByZXR1cm4gbW91bnRJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTsKICAgICAgfSwKICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JzsKICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpOwogICAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpOwogICAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpOwogICAgICB9LAogICAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTsKICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsKICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7CgogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7CiAgICAgICAgfQogICAgICB9LAogICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInOwogICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7CiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7CiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWOwoKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTsKICAgICAgfSwKICAgICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsKICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7CgogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnOwogICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpOwogICAgICB9LAogICAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJzsKICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpOwogICAgICB9LAogICAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7CiAgICAgIH0sCiAgICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJzsKICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTsKICAgICAgfSwKICAgICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJzsKICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTsKICAgICAgfSwKICAgICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gbW91bnRJZCgpOwogICAgICB9LAogICAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXIKICAgIH07CgogICAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHsKICAgICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpOwogICAgICB9LAogICAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTsKICAgICAgfSwKICAgICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7CiAgICAgIH0sCiAgICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpOwogICAgICB9LAogICAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpOwogICAgICB9LAogICAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpOwogICAgICB9LAogICAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7CiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWOwoKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsKICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7CgogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTsKICAgICAgfSwKICAgICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7CiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWOwoKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7CiAgICAgIH0sCiAgICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpOwogICAgICB9LAogICAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpOwogICAgICB9LAogICAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpOwogICAgICB9LAogICAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTsKICAgICAgfSwKICAgICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIG1vdW50SWQoKTsKICAgICAgfSwKICAgICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyCiAgICB9OwoKICAgIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7CiAgICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkgewogICAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTsKICAgICAgfSwKICAgICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpOwogICAgICB9LAogICAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTsKICAgICAgfSwKICAgICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTsKICAgICAgfSwKICAgICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpOwogICAgICB9LAogICAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7CiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7CiAgICAgICAgfQogICAgICB9LAogICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OwogICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7CgogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpOwogICAgICB9LAogICAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsKICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWOwoKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7CiAgICAgICAgfQogICAgICB9LAogICAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTsKICAgICAgfSwKICAgICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpOwogICAgICB9LAogICAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTsKICAgICAgfSwKICAgICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7CiAgICAgIH0sCiAgICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpOwogICAgICB9LAogICAgICB1c2VJZDogZnVuY3Rpb24gKCkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlSWQoKTsKICAgICAgfSwKICAgICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyCiAgICB9OwoKICAgIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHsKICAgICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpOwogICAgICB9LAogICAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpOwogICAgICB9LAogICAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTsKICAgICAgfSwKICAgICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpOwogICAgICB9LAogICAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTsKICAgICAgfSwKICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsKICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7CgogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsKICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7CgogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlUmVmKCk7CiAgICAgIH0sCiAgICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OwogICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7CiAgICAgICAgfQogICAgICB9LAogICAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTsKICAgICAgfSwKICAgICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7CiAgICAgIH0sCiAgICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7CiAgICAgIH0sCiAgICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJzsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpOwogICAgICB9LAogICAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTsKICAgICAgfSwKICAgICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7CiAgICAgIH0sCiAgICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlcgogICAgfTsKCiAgICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gewogICAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHsKICAgICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTsKICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7CiAgICAgIH0sCiAgICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7CiAgICAgIH0sCiAgICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTsKICAgICAgfSwKICAgICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTsKICAgICAgfSwKICAgICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpOwogICAgICB9LAogICAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpOwogICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OwogICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsKICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7CgogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpOwogICAgICB9LAogICAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpOwogICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OwogICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7CiAgICAgICAgfQogICAgICB9LAogICAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7CiAgICAgIH0sCiAgICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZSh2YWx1ZSk7CiAgICAgIH0sCiAgICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTsKICAgICAgfSwKICAgICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZSgpOwogICAgICB9LAogICAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpOwogICAgICB9LAogICAgICB1c2VJZDogZnVuY3Rpb24gKCkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiBtb3VudElkKCk7CiAgICAgIH0sCiAgICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlcgogICAgfTsKCiAgICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHsKICAgICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7CiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpOwogICAgICB9LAogICAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpOwogICAgICB9LAogICAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTsKICAgICAgfSwKICAgICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpOwogICAgICB9LAogICAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTsKICAgICAgfSwKICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsKICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWOwoKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7CiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlUmVmKCk7CiAgICAgIH0sCiAgICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OwogICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7CgogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpOwogICAgICB9LAogICAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7CiAgICAgIH0sCiAgICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlVHJhbnNpdGlvbigpOwogICAgICB9LAogICAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZU11dGFibGVTb3VyY2UoKTsKICAgICAgfSwKICAgICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkgewogICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7CiAgICAgIH0sCiAgICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVJZCgpOwogICAgICB9LAogICAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXIKICAgIH07CgogICAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHsKICAgICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7CiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpOwogICAgICB9LAogICAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpOwogICAgICB9LAogICAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTsKICAgICAgfSwKICAgICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpOwogICAgICB9LAogICAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTsKICAgICAgfSwKICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7CiAgICAgIH0sCiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsKICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWOwoKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7CiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7CiAgICAgICAgfQogICAgICB9LAogICAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVSZWYoKTsKICAgICAgfSwKICAgICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7CiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7CiAgICAgICAgfQogICAgICB9LAogICAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTsKICAgICAgfSwKICAgICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7CiAgICAgIH0sCiAgICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gcmVyZW5kZXJUcmFuc2l0aW9uKCk7CiAgICAgIH0sCiAgICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJzsKICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTsKICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTsKICAgICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpOwogICAgICB9LAogICAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7CiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnOwogICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpOwogICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpOwogICAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTsKICAgICAgfSwKICAgICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7CiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7CiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7CiAgICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7CiAgICAgIH0sCiAgICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlcgogICAgfTsKICB9CgogIHZhciBub3ckMSA9IHVuc3RhYmxlX25vdzsKICB2YXIgY29tbWl0VGltZSA9IDA7CiAgdmFyIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IC0xOwogIHZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xOwogIHZhciBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gLTE7CiAgLyoqCiAgICogVHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZC9jYXNjYWRpbmcgdXBkYXRlIChzY2hlZHVsZWQgZnJvbSBhIGxheW91dCBlZmZlY3QpLgogICAqCiAgICogVGhlIG92ZXJhbGwgc2VxdWVuY2UgaXM6CiAgICogICAxLiByZW5kZXIKICAgKiAgIDIuIGNvbW1pdCAoYW5kIGNhbGwgYG9uUmVuZGVyYCwgYG9uQ29tbWl0YCkKICAgKiAgIDMuIGNoZWNrIGZvciBuZXN0ZWQgdXBkYXRlcwogICAqICAgNC4gZmx1c2ggcGFzc2l2ZSBlZmZlY3RzIChhbmQgY2FsbCBgb25Qb3N0Q29tbWl0YCkKICAgKgogICAqIE5lc3RlZCB1cGRhdGVzIGFyZSBpZGVudGlmaWVkIGluIHN0ZXAgMyBhYm92ZSwKICAgKiBidXQgc3RlcCA0IHN0aWxsIGFwcGxpZXMgdG8gdGhlIHdvcmsgdGhhdCB3YXMganVzdCBjb21taXR0ZWQuCiAgICogV2UgdXNlIHR3byBmbGFncyB0byB0cmFjayBuZXN0ZWQgdXBkYXRlcyB0aGVuOgogICAqIG9uZSB0cmFja3Mgd2hldGhlciB0aGUgdXBjb21pbmcgdXBkYXRlIGlzIGEgbmVzdGVkIHVwZGF0ZSwKICAgKiBhbmQgdGhlIG90aGVyIHRyYWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVwZGF0ZSB3YXMgYSBuZXN0ZWQgdXBkYXRlLgogICAqIFRoZSBmaXJzdCB2YWx1ZSBnZXRzIHN5bmNlZCB0byB0aGUgc2Vjb25kIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLgogICAqLwoKICB2YXIgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7CiAgdmFyIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlOwoKICBmdW5jdGlvbiBpc0N1cnJlbnRVcGRhdGVOZXN0ZWQoKSB7CiAgICByZXR1cm4gY3VycmVudFVwZGF0ZUlzTmVzdGVkOwogIH0KCiAgZnVuY3Rpb24gbWFya05lc3RlZFVwZGF0ZVNjaGVkdWxlZCgpIHsKICAgIHsKICAgICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gdHJ1ZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc2V0TmVzdGVkVXBkYXRlRmxhZygpIHsKICAgIHsKICAgICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7CiAgICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gc3luY05lc3RlZFVwZGF0ZUZsYWcoKSB7CiAgICB7CiAgICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IG5lc3RlZFVwZGF0ZVNjaGVkdWxlZDsKICAgICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRDb21taXRUaW1lKCkgewogICAgcmV0dXJuIGNvbW1pdFRpbWU7CiAgfQoKICBmdW5jdGlvbiByZWNvcmRDb21taXRUaW1lKCkgewoKICAgIGNvbW1pdFRpbWUgPSBub3ckMSgpOwogIH0KCiAgZnVuY3Rpb24gc3RhcnRQcm9maWxlclRpbWVyKGZpYmVyKSB7CgogICAgcHJvZmlsZXJTdGFydFRpbWUgPSBub3ckMSgpOwoKICAgIGlmIChmaWJlci5hY3R1YWxTdGFydFRpbWUgPCAwKSB7CiAgICAgIGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA9IG5vdyQxKCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZyhmaWJlcikgewoKICAgIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7CiAgfQoKICBmdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGZpYmVyLCBvdmVycmlkZUJhc2VUaW1lKSB7CgogICAgaWYgKHByb2ZpbGVyU3RhcnRUaW1lID49IDApIHsKICAgICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHByb2ZpbGVyU3RhcnRUaW1lOwogICAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTsKCiAgICAgIGlmIChvdmVycmlkZUJhc2VUaW1lKSB7CiAgICAgICAgZmliZXIuc2VsZkJhc2VEdXJhdGlvbiA9IGVsYXBzZWRUaW1lOwogICAgICB9CgogICAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmliZXIpIHsKCiAgICBpZiAobGF5b3V0RWZmZWN0U3RhcnRUaW1lID49IDApIHsKICAgICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIGxheW91dEVmZmVjdFN0YXJ0VGltZTsKICAgICAgbGF5b3V0RWZmZWN0U3RhcnRUaW1lID0gLTE7IC8vIFN0b3JlIGR1cmF0aW9uIG9uIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3IKICAgICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZCkKCiAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjsKCiAgICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkgewogICAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7CiAgICAgICAgICBjYXNlIEhvc3RSb290OgogICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTsKICAgICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTsKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgIGNhc2UgUHJvZmlsZXI6CiAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7CiAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaWJlcikgewoKICAgIGlmIChwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID49IDApIHsKICAgICAgdmFyIGVsYXBzZWRUaW1lID0gbm93JDEoKSAtIHBhc3NpdmVFZmZlY3RTdGFydFRpbWU7CiAgICAgIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSAtMTsgLy8gU3RvcmUgZHVyYXRpb24gb24gdGhlIG5leHQgbmVhcmVzdCBQcm9maWxlciBhbmNlc3RvcgogICAgICAvLyBPciB0aGUgcm9vdCAoZm9yIHRoZSBEZXZUb29scyBQcm9maWxlciB0byByZWFkKQoKICAgICAgdmFyIHBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuOwoKICAgICAgd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7CiAgICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHsKICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6CiAgICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlOwoKICAgICAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHsKICAgICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgIGNhc2UgUHJvZmlsZXI6CiAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7CgogICAgICAgICAgICBpZiAocGFyZW50U3RhdGVOb2RlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgLy8gRGV0YWNoZWQgZmliZXJzIGhhdmUgdGhlaXIgc3RhdGUgbm9kZSBjbGVhcmVkIG91dC4KICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSByZXR1cm4gcG9pbnRlciBpcyBhbHNvIGNsZWFyZWQgb3V0LAogICAgICAgICAgICAgIC8vIHNvIHdlIHdvbid0IGJlIGFibGUgdG8gcmVwb3J0IHRoZSB0aW1lIHNwZW50IGluIHRoaXMgUHJvZmlsZXIncyBzdWJ0cmVlLgogICAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzdGFydExheW91dEVmZmVjdFRpbWVyKCkgewoKICAgIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IG5vdyQxKCk7CiAgfQoKICBmdW5jdGlvbiBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpIHsKCiAgICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gbm93JDEoKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24oZmliZXIpIHsKICAgIC8vIFRyYW5zZmVyIHRpbWUgc3BlbnQgcmVuZGVyaW5nIHRoZXNlIGNoaWxkcmVuIHNvIHdlIGRvbid0IGxvc2UgaXQKICAgIC8vIGFmdGVyIHdlIHJlcmVuZGVyLiBUaGlzIGlzIHVzZWQgYXMgYSBoZWxwZXIgaW4gc3BlY2lhbCBjYXNlcwogICAgLy8gd2hlcmUgd2Ugc2hvdWxkIGNvdW50IHRoZSB3b3JrIG9mIG11bHRpcGxlIHBhc3Nlcy4KICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkOwoKICAgIHdoaWxlIChjaGlsZCkgewogICAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjsKICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZSkgewogICAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duCiAgICAvLyBzbyB0aGUgc3RhY2sgaXMgYWNjdXJhdGUuCiAgICByZXR1cm4gewogICAgICB2YWx1ZTogdmFsdWUsCiAgICAgIHNvdXJjZTogc291cmNlLAogICAgICBzdGFjazogZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHNvdXJjZSksCiAgICAgIGRpZ2VzdDogbnVsbAogICAgfTsKICB9CiAgZnVuY3Rpb24gY3JlYXRlQ2FwdHVyZWRWYWx1ZSh2YWx1ZSwgZGlnZXN0LCBzdGFjaykgewogICAgcmV0dXJuIHsKICAgICAgdmFsdWU6IHZhbHVlLAogICAgICBzb3VyY2U6IG51bGwsCiAgICAgIHN0YWNrOiBzdGFjayAhPSBudWxsID8gc3RhY2sgOiBudWxsLAogICAgICBkaWdlc3Q6IGRpZ2VzdCAhPSBudWxsID8gZGlnZXN0IDogbnVsbAogICAgfTsKICB9CgogIC8vIFRoaXMgbW9kdWxlIGlzIGZvcmtlZCBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLgogIC8vIEJ5IGRlZmF1bHQsIHJldHVybiBgdHJ1ZWAgdG8gbG9nIGVycm9ycyB0byB0aGUgY29uc29sZS4KICAvLyBGb3JrcyBjYW4gcmV0dXJuIGBmYWxzZWAgaWYgdGhpcyBpc24ndCBkZXNpcmFibGUuCiAgZnVuY3Rpb24gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pIHsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gbG9nQ2FwdHVyZWRFcnJvcihib3VuZGFyeSwgZXJyb3JJbmZvKSB7CiAgICB0cnkgewogICAgICB2YXIgbG9nRXJyb3IgPSBzaG93RXJyb3JEaWFsb2coYm91bmRhcnksIGVycm9ySW5mbyk7IC8vIEFsbG93IGluamVjdGVkIHNob3dFcnJvckRpYWxvZygpIHRvIHByZXZlbnQgZGVmYXVsdCBjb25zb2xlLmVycm9yIGxvZ2dpbmcuCiAgICAgIC8vIFRoaXMgZW5hYmxlcyByZW5kZXJlcnMgbGlrZSBSZWFjdE5hdGl2ZSB0byBiZXR0ZXIgbWFuYWdlIHJlZGJveCBiZWhhdmlvci4KCiAgICAgIGlmIChsb2dFcnJvciA9PT0gZmFsc2UpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTsKCiAgICAgIGlmICh0cnVlKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IGVycm9ySW5mby5zb3VyY2U7CiAgICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrOwogICAgICAgIHZhciBjb21wb25lbnRTdGFjayA9IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJzsgLy8gQnJvd3NlcnMgc3VwcG9ydCBzaWxlbmNpbmcgdW5jYXVnaHQgZXJyb3JzIGJ5IGNhbGxpbmcKICAgICAgICAvLyBgcHJldmVudERlZmF1bHQoKWAgaW4gd2luZG93IGBlcnJvcmAgaGFuZGxlci4KICAgICAgICAvLyBXZSByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbiBhcyBhbiBleHBhbmRvIG9uIHRoZSBlcnJvci4KCiAgICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IuX3N1cHByZXNzTG9nZ2luZykgewogICAgICAgICAgaWYgKGJvdW5kYXJ5LnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHsKICAgICAgICAgICAgLy8gVGhlIGVycm9yIGlzIHJlY292ZXJhYmxlIGFuZCB3YXMgc2lsZW5jZWQuCiAgICAgICAgICAgIC8vIElnbm9yZSBpdCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLgogICAgICAgICAgICAvLyBUaGlzIGlzIGhhbmR5IGZvciB0ZXN0aW5nIGVycm9yIGJvdW5kYXJpZXMgd2l0aG91dCBub2lzZS4KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSAvLyBUaGUgZXJyb3IgaXMgZmF0YWwuIFNpbmNlIHRoZSBzaWxlbmNpbmcgbWlnaHQgaGF2ZQogICAgICAgICAgLy8gYmVlbiBhY2NpZGVudGFsLCB3ZSdsbCBzdXJmYWNlIGl0IGFueXdheS4KICAgICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBicm93c2VyIHdvdWxkIGhhdmUgc2lsZW5jZWQgdGhlIG9yaWdpbmFsIGVycm9yCiAgICAgICAgICAvLyBzbyB3ZSdsbCBwcmludCBpdCBmaXJzdCwgYW5kIHRoZW4gcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLgoKCiAgICAgICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyCiAgICAgICAgICAvLyBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgYmxvY2ssIHNlZToKICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzEzMzg0CiAgICAgICAgfQoKICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IHNvdXJjZSA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoc291cmNlKSA6IG51bGw7CiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWVNZXNzYWdlID0gY29tcG9uZW50TmFtZSA/ICJUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIDwiICsgY29tcG9uZW50TmFtZSArICI+IGNvbXBvbmVudDoiIDogJ1RoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzOic7CiAgICAgICAgdmFyIGVycm9yQm91bmRhcnlNZXNzYWdlOwoKICAgICAgICBpZiAoYm91bmRhcnkudGFnID09PSBIb3N0Um9vdCkgewogICAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSAnQ29uc2lkZXIgYWRkaW5nIGFuIGVycm9yIGJvdW5kYXJ5IHRvIHlvdXIgdHJlZSB0byBjdXN0b21pemUgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3IuXG4nICsgJ1Zpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9lcnJvci1ib3VuZGFyaWVzIHRvIGxlYXJuIG1vcmUgYWJvdXQgZXJyb3IgYm91bmRhcmllcy4nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGJvdW5kYXJ5KSB8fCAnQW5vbnltb3VzJzsKICAgICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gIlJlYWN0IHdpbGwgdHJ5IHRvIHJlY3JlYXRlIHRoaXMgY29tcG9uZW50IHRyZWUgZnJvbSBzY3JhdGNoICIgKyAoInVzaW5nIHRoZSBlcnJvciBib3VuZGFyeSB5b3UgcHJvdmlkZWQsICIgKyBlcnJvckJvdW5kYXJ5TmFtZSArICIuIik7CiAgICAgICAgfQoKICAgICAgICB2YXIgY29tYmluZWRNZXNzYWdlID0gY29tcG9uZW50TmFtZU1lc3NhZ2UgKyAiXG4iICsgY29tcG9uZW50U3RhY2sgKyAiXG5cbiIgKyAoIiIgKyBlcnJvckJvdW5kYXJ5TWVzc2FnZSk7IC8vIEluIGRldmVsb3BtZW50LCB3ZSBwcm92aWRlIG91ciBvd24gbWVzc2FnZSB3aXRoIGp1c3QgdGhlIGNvbXBvbmVudCBzdGFjay4KICAgICAgICAvLyBXZSBkb24ndCBpbmNsdWRlIHRoZSBvcmlnaW5hbCBlcnJvciBtZXNzYWdlIGFuZCBKUyBzdGFjayBiZWNhdXNlIHRoZSBicm93c2VyCiAgICAgICAgLy8gaGFzIGFscmVhZHkgcHJpbnRlZCBpdC4gRXZlbiBpZiB0aGUgYXBwbGljYXRpb24gc3dhbGxvd3MgdGhlIGVycm9yLCBpdCBpcyBzdGlsbAogICAgICAgIC8vIGRpc3BsYXllZCBieSB0aGUgYnJvd3NlciB0aGFua3MgdG8gdGhlIERFVi1vbmx5IGZha2UgZXZlbnQgdHJpY2sgaW4gUmVhY3RFcnJvclV0aWxzLgoKICAgICAgICBjb25zb2xlWydlcnJvciddKGNvbWJpbmVkTWVzc2FnZSk7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlcgogICAgICB9IGVsc2UgewogICAgICAgIC8vIEluIHByb2R1Y3Rpb24sIHdlIHByaW50IHRoZSBlcnJvciBkaXJlY3RseS4KICAgICAgICAvLyBUaGlzIHdpbGwgaW5jbHVkZSB0aGUgbWVzc2FnZSwgdGhlIEpTIHN0YWNrLCBhbmQgYW55dGhpbmcgdGhlIGJyb3dzZXIgd2FudHMgdG8gc2hvdy4KICAgICAgICAvLyBXZSBwYXNzIHRoZSBlcnJvciBvYmplY3QgaW5zdGVhZCBvZiBjdXN0b20gbWVzc2FnZSBzbyB0aGF0IHRoZSBicm93c2VyIGRpc3BsYXlzIHRoZSBlcnJvciBuYXRpdmVseS4KICAgICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyCiAgICAgIH0KICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC4KICAgICAgLy8gSWYgY29uc29sZS5lcnJvciBpcyBvdmVycmlkZGVuLCBvciBsb2dDYXB0dXJlZEVycm9yKCkgc2hvd3MgYSBkaWFsb2cgdGhhdCB0aHJvd3MsCiAgICAgIC8vIHdlIHdhbnQgdG8gcmVwb3J0IHRoaXMgZXJyb3Igb3V0c2lkZSBvZiB0aGUgbm9ybWFsIHN0YWNrIGFzIGEgbGFzdCByZXNvcnQuCiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODgKICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhyb3cgZTsKICAgICAgfSk7CiAgICB9CiAgfQoKICB2YXIgUG9zc2libHlXZWFrTWFwJDEgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7CgogIGZ1bmN0aW9uIGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShmaWJlciwgZXJyb3JJbmZvLCBsYW5lKSB7CiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTsgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC4KCiAgICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eQogICAgLy8gYmVpbmcgY2FsbGVkICJlbGVtZW50Ii4KCiAgICB1cGRhdGUucGF5bG9hZCA9IHsKICAgICAgZWxlbWVudDogbnVsbAogICAgfTsKICAgIHZhciBlcnJvciA9IGVycm9ySW5mby52YWx1ZTsKCiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvcik7CiAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7CiAgICB9OwoKICAgIHJldHVybiB1cGRhdGU7CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHsKICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIGxhbmUpOwogICAgdXBkYXRlLnRhZyA9IENhcHR1cmVVcGRhdGU7CiAgICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZmliZXIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7CgogICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdmFyIGVycm9yJDEgPSBlcnJvckluZm8udmFsdWU7CgogICAgICB1cGRhdGUucGF5bG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yJDEpOwogICAgICB9OwoKICAgICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkgewogICAgICAgIHsKICAgICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTsKICAgICAgICB9CgogICAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7CiAgICAgIH07CiAgICB9CgogICAgdmFyIGluc3QgPSBmaWJlci5zdGF0ZU5vZGU7CgogICAgaWYgKGluc3QgIT09IG51bGwgJiYgdHlwZW9mIGluc3QuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicpIHsKICAgICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7CiAgICAgICAgewogICAgICAgICAgbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpOwogICAgICAgIH0KCiAgICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTsKCiAgICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIC8vIFRvIHByZXNlcnZlIHRoZSBwcmVleGlzdGluZyByZXRyeSBiZWhhdmlvciBvZiBlcnJvciBib3VuZGFyaWVzLAogICAgICAgICAgLy8gd2Uga2VlcCB0cmFjayBvZiB3aGljaCBvbmVzIGFscmVhZHkgZmFpbGVkIGR1cmluZyB0aGlzIGJhdGNoLgogICAgICAgICAgLy8gVGhpcyBnZXRzIHJlc2V0IGJlZm9yZSB3ZSB5aWVsZCBiYWNrIHRvIHRoZSBicm93c2VyLgogICAgICAgICAgLy8gVE9ETzogV2FybiBpbiBzdHJpY3QgbW9kZSBpZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXMKICAgICAgICAgIC8vIG5vdCBkZWZpbmVkLgogICAgICAgICAgbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZCh0aGlzKTsKICAgICAgICB9CgogICAgICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlOwogICAgICAgIHZhciBzdGFjayA9IGVycm9ySW5mby5zdGFjazsKICAgICAgICB0aGlzLmNvbXBvbmVudERpZENhdGNoKGVycm9yJDEsIHsKICAgICAgICAgIGNvbXBvbmVudFN0YWNrOiBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJycKICAgICAgICB9KTsKCiAgICAgICAgewogICAgICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgLy8gSWYgY29tcG9uZW50RGlkQ2F0Y2ggaXMgdGhlIG9ubHkgZXJyb3IgYm91bmRhcnkgbWV0aG9kIGRlZmluZWQsCiAgICAgICAgICAgIC8vIHRoZW4gaXQgbmVlZHMgdG8gY2FsbCBzZXRTdGF0ZSB0byByZWNvdmVyIGZyb20gZXJyb3JzLgogICAgICAgICAgICAvLyBJZiBubyBzdGF0ZSB1cGRhdGUgaXMgc2NoZWR1bGVkIHRoZW4gdGhlIGJvdW5kYXJ5IHdpbGwgc3dhbGxvdyB0aGUgZXJyb3IuCiAgICAgICAgICAgIGlmICghaW5jbHVkZXNTb21lTGFuZShmaWJlci5sYW5lcywgU3luY0xhbmUpKSB7CiAgICAgICAgICAgICAgZXJyb3IoJyVzOiBFcnJvciBib3VuZGFyaWVzIHNob3VsZCBpbXBsZW1lbnQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkuICcgKyAnSW4gdGhhdCBtZXRob2QsIHJldHVybiBhIHN0YXRlIHVwZGF0ZSB0byBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2Ugb3IgZmFsbGJhY2sgVUkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gdXBkYXRlOwogIH0KCiAgZnVuY3Rpb24gYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCBsYW5lcykgewogICAgLy8gQXR0YWNoIGEgcGluZyBsaXN0ZW5lcgogICAgLy8KICAgIC8vIFRoZSBkYXRhIG1pZ2h0IHJlc29sdmUgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8gY29tbWl0IHRoZSBmYWxsYmFjay4gT3IsCiAgICAvLyBpbiB0aGUgY2FzZSBvZiBhIHJlZnJlc2gsIHdlJ2xsIG5ldmVyIGNvbW1pdCBhIGZhbGxiYWNrLiBTbyB3ZSBuZWVkIHRvCiAgICAvLyBhdHRhY2ggYSBsaXN0ZW5lciBub3cuIFdoZW4gaXQgcmVzb2x2ZXMgKCJwaW5ncyIpLCB3ZSBjYW4gZGVjaWRlIHdoZXRoZXIgdG8KICAgIC8vIHRyeSByZW5kZXJpbmcgdGhlIHRyZWUgYWdhaW4uCiAgICAvLwogICAgLy8gT25seSBhdHRhY2ggYSBsaXN0ZW5lciBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGxhbmVzCiAgICAvLyB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nICh3aGljaCBhY3RzIGxpa2UgYSAidGhyZWFkIElEIiBoZXJlKS4KICAgIC8vCiAgICAvLyBXZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpbiBjb25jdXJyZW50IG1vZGUuIExlZ2FjeSBTdXNwZW5zZSBhbHdheXMKICAgIC8vIGNvbW1pdHMgZmFsbGJhY2tzIHN5bmNocm9ub3VzbHksIHNvIHRoZXJlIGFyZSBubyBwaW5ncy4KICAgIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTsKICAgIHZhciB0aHJlYWRJRHM7CgogICAgaWYgKHBpbmdDYWNoZSA9PT0gbnVsbCkgewogICAgICBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAkMSgpOwogICAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7CiAgICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7CiAgICB9IGVsc2UgewogICAgICB0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKTsKCiAgICAgIGlmICh0aHJlYWRJRHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHRocmVhZElEcyA9IG5ldyBTZXQoKTsKICAgICAgICBwaW5nQ2FjaGUuc2V0KHdha2VhYmxlLCB0aHJlYWRJRHMpOwogICAgICB9CiAgICB9CgogICAgaWYgKCF0aHJlYWRJRHMuaGFzKGxhbmVzKSkgewogICAgICAvLyBNZW1vaXplIHVzaW5nIHRoZSB0aHJlYWQgSUQgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLgogICAgICB0aHJlYWRJRHMuYWRkKGxhbmVzKTsKICAgICAgdmFyIHBpbmcgPSBwaW5nU3VzcGVuZGVkUm9vdC5iaW5kKG51bGwsIHJvb3QsIHdha2VhYmxlLCBsYW5lcyk7CgogICAgICB7CiAgICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7CiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnMKICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgbGFuZXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgd2FrZWFibGUudGhlbihwaW5nLCBwaW5nKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7CiAgICAvLyBSZXRyeSBsaXN0ZW5lcgogICAgLy8KICAgIC8vIElmIHRoZSBmYWxsYmFjayBkb2VzIGNvbW1pdCwgd2UgbmVlZCB0byBhdHRhY2ggYSBkaWZmZXJlbnQgdHlwZSBvZgogICAgLy8gbGlzdGVuZXIuIFRoaXMgb25lIHNjaGVkdWxlcyBhbiB1cGRhdGUgb24gdGhlIFN1c3BlbnNlIGJvdW5kYXJ5IHRvIHR1cm4KICAgIC8vIHRoZSBmYWxsYmFjayBzdGF0ZSBvZmYuCiAgICAvLwogICAgLy8gU3Rhc2ggdGhlIHdha2VhYmxlIG9uIHRoZSBib3VuZGFyeSBmaWJlciBzbyB3ZSBjYW4gYWNjZXNzIGl0IGluIHRoZQogICAgLy8gY29tbWl0IHBoYXNlLgogICAgLy8KICAgIC8vIFdoZW4gdGhlIHdha2VhYmxlIHJlc29sdmVzLCB3ZSdsbCBhdHRlbXB0IHRvIHJlbmRlciB0aGUgYm91bmRhcnkKICAgIC8vIGFnYWluICgicmV0cnkiKS4KICAgIHZhciB3YWtlYWJsZXMgPSBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlOwoKICAgIGlmICh3YWtlYWJsZXMgPT09IG51bGwpIHsKICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gbmV3IFNldCgpOwogICAgICB1cGRhdGVRdWV1ZS5hZGQod2FrZWFibGUpOwogICAgICBzdXNwZW5zZUJvdW5kYXJ5LnVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWU7CiAgICB9IGVsc2UgewogICAgICB3YWtlYWJsZXMuYWRkKHdha2VhYmxlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ29tcG9uZW50KHNvdXJjZUZpYmVyLCByb290UmVuZGVyTGFuZXMpIHsKICAgIC8vIEEgbGVnYWN5IG1vZGUgU3VzcGVuc2UgcXVpcmssIG9ubHkgcmVsZXZhbnQgdG8gaG9vayBjb21wb25lbnRzLgoKCiAgICB2YXIgdGFnID0gc291cmNlRmliZXIudGFnOwoKICAgIGlmICgoc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmICh0YWcgPT09IEZ1bmN0aW9uQ29tcG9uZW50IHx8IHRhZyA9PT0gRm9yd2FyZFJlZiB8fCB0YWcgPT09IFNpbXBsZU1lbW9Db21wb25lbnQpKSB7CiAgICAgIHZhciBjdXJyZW50U291cmNlID0gc291cmNlRmliZXIuYWx0ZXJuYXRlOwoKICAgICAgaWYgKGN1cnJlbnRTb3VyY2UpIHsKICAgICAgICBzb3VyY2VGaWJlci51cGRhdGVRdWV1ZSA9IGN1cnJlbnRTb3VyY2UudXBkYXRlUXVldWU7CiAgICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnRTb3VyY2UubWVtb2l6ZWRTdGF0ZTsKICAgICAgICBzb3VyY2VGaWJlci5sYW5lcyA9IGN1cnJlbnRTb3VyY2UubGFuZXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBudWxsOwogICAgICAgIHNvdXJjZUZpYmVyLm1lbW9pemVkU3RhdGUgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcikgewogICAgdmFyIG5vZGUgPSByZXR1cm5GaWJlcjsKCiAgICBkbyB7CiAgICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgJiYgc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKG5vZGUpKSB7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0gLy8gVGhpcyBib3VuZGFyeSBhbHJlYWR5IGNhcHR1cmVkIGR1cmluZyB0aGlzIHJlbmRlci4gQ29udGludWUgdG8gdGhlIG5leHQKICAgICAgLy8gYm91bmRhcnkuCgoKICAgICAgbm9kZSA9IG5vZGUucmV0dXJuOwogICAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiBtYXJrU3VzcGVuc2VCb3VuZGFyeVNob3VsZENhcHR1cmUoc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpIHsKICAgIC8vIFRoaXMgbWFya3MgYSBTdXNwZW5zZSBib3VuZGFyeSBzbyB0aGF0IHdoZW4gd2UncmUgdW53aW5kaW5nIHRoZSBzdGFjaywKICAgIC8vIGl0IGNhcHR1cmVzIHRoZSBzdXNwZW5kZWQgImV4Y2VwdGlvbiIgYW5kIGRvZXMgYSBzZWNvbmQgKGZhbGxiYWNrKSBwYXNzLgogICAgaWYgKChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkgewogICAgICAvLyBMZWdhY3kgTW9kZSBTdXNwZW5zZQogICAgICAvLwogICAgICAvLyBJZiB0aGUgYm91bmRhcnkgaXMgaW4gbGVnYWN5IG1vZGUsIHdlIHNob3VsZCAqbm90KgogICAgICAvLyBzdXNwZW5kIHRoZSBjb21taXQuIFByZXRlbmQgYXMgaWYgdGhlIHN1c3BlbmRlZCBjb21wb25lbnQgcmVuZGVyZWQKICAgICAgLy8gbnVsbCBhbmQga2VlcCByZW5kZXJpbmcuIFdoZW4gdGhlIFN1c3BlbnNlIGJvdW5kYXJ5IGNvbXBsZXRlcywKICAgICAgLy8gd2UnbGwgZG8gYSBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLgogICAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeSA9PT0gcmV0dXJuRmliZXIpIHsKICAgICAgICAvLyBTcGVjaWFsIGNhc2Ugd2hlcmUgd2Ugc3VzcGVuZGVkIHdoaWxlIHJlY29uY2lsaW5nIHRoZSBjaGlsZHJlbiBvZgogICAgICAgIC8vIGEgU3VzcGVuc2UgYm91bmRhcnkncyBpbm5lciBPZmZzY3JlZW4gd3JhcHBlciBmaWJlci4gVGhpcyBoYXBwZW5zCiAgICAgICAgLy8gd2hlbiBhIFJlYWN0LmxhenkgY29tcG9uZW50IGlzIGEgZGlyZWN0IGNoaWxkIG9mIGEKICAgICAgICAvLyBTdXNwZW5zZSBib3VuZGFyeS4KICAgICAgICAvLwogICAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJpZXMgYXJlIGltcGxlbWVudGVkIGFzIG11bHRpcGxlIGZpYmVycywgYnV0IHRoZXkKICAgICAgICAvLyBhcmUgYSBzaW5nbGUgY29uY2VwdHVhbCB1bml0LiBUaGUgbGVnYWN5IG1vZGUgYmVoYXZpb3Igd2hlcmUgd2UKICAgICAgICAvLyBwcmV0ZW5kIHRoZSBzdXNwZW5kZWQgZmliZXIgY29tbWl0dGVkIGFzIGBudWxsYCB3b24ndCB3b3JrLAogICAgICAgIC8vIGJlY2F1c2UgaW4gdGhpcyBjYXNlIHRoZSAic3VzcGVuZGVkIiBmaWJlciBpcyB0aGUgaW5uZXIKICAgICAgICAvLyBPZmZzY3JlZW4gd3JhcHBlci4KICAgICAgICAvLwogICAgICAgIC8vIEJlY2F1c2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBib3VuZGFyeSBoYXZlbid0IHN0YXJ0ZWQgcmVuZGVyaW5nCiAgICAgICAgLy8geWV0IChpLmUuIG5vdGhpbmcgaW4gdGhlIHRyZWUgaGFzIHBhcnRpYWxseSByZW5kZXJlZCkgd2UgY2FuCiAgICAgICAgLy8gc3dpdGNoIHRvIHRoZSByZWd1bGFyLCBjb25jdXJyZW50IG1vZGUgYmVoYXZpb3I6IG1hcmsgdGhlCiAgICAgICAgLy8gYm91bmRhcnkgd2l0aCBTaG91bGRDYXB0dXJlIGFuZCBlbnRlciB0aGUgdW53aW5kIHBoYXNlLgogICAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IERpZENhcHR1cmU7CiAgICAgICAgc291cmNlRmliZXIuZmxhZ3MgfD0gRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZTsgLy8gV2UncmUgZ29pbmcgdG8gY29tbWl0IHRoaXMgZmliZXIgZXZlbiB0aG91Z2ggaXQgZGlkbid0IGNvbXBsZXRlLgogICAgICAgIC8vIEJ1dCB3ZSBzaG91bGRuJ3QgY2FsbCBhbnkgbGlmZWN5Y2xlIG1ldGhvZHMgb3IgY2FsbGJhY2tzLiBSZW1vdmUKICAgICAgICAvLyBhbGwgbGlmZWN5Y2xlIGVmZmVjdCB0YWdzLgoKICAgICAgICBzb3VyY2VGaWJlci5mbGFncyAmPSB+KExpZmVjeWNsZUVmZmVjdE1hc2sgfCBJbmNvbXBsZXRlKTsKCiAgICAgICAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHsKICAgICAgICAgIHZhciBjdXJyZW50U291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7CgogICAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2VGaWJlciA9PT0gbnVsbCkgewogICAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50LiBDaGFuZ2UgdGhlIHRhZyBzbyBpdCdzIG5vdCBtaXN0YWtlbiBmb3IgYQogICAgICAgICAgICAvLyBjb21wbGV0ZWQgY2xhc3MgY29tcG9uZW50LiBGb3IgZXhhbXBsZSwgd2Ugc2hvdWxkIG5vdCBjYWxsCiAgICAgICAgICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50IGlmIGl0IGlzIGRlbGV0ZWQuCiAgICAgICAgICAgIHNvdXJjZUZpYmVyLnRhZyA9IEluY29tcGxldGVDbGFzc0NvbXBvbmVudDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFdoZW4gd2UgdHJ5IHJlbmRlcmluZyBhZ2Fpbiwgd2Ugc2hvdWxkIG5vdCByZXVzZSB0aGUgY3VycmVudCBmaWJlciwKICAgICAgICAgICAgLy8gc2luY2UgaXQncyBrbm93biB0byBiZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFVzZSBhIGZvcmNlIHVwZGF0ZSB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IGEgYmFpbCBvdXQuCiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIFN5bmNMYW5lKTsKICAgICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlOwogICAgICAgICAgICBlbnF1ZXVlVXBkYXRlKHNvdXJjZUZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTsKICAgICAgICAgIH0KICAgICAgICB9IC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS4gTWFyayBpdCB3aXRoIFN5bmMgcHJpb3JpdHkgdG8KICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IGl0IHN0aWxsIGhhcyBwZW5kaW5nIHdvcmsuCgoKICAgICAgICBzb3VyY2VGaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoc291cmNlRmliZXIubGFuZXMsIFN5bmNMYW5lKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHN1c3BlbnNlQm91bmRhcnk7CiAgICB9IC8vIENvbmZpcm1lZCB0aGF0IHRoZSBib3VuZGFyeSBpcyBpbiBhIGNvbmN1cnJlbnQgbW9kZSB0cmVlLiBDb250aW51ZQogICAgLy8gd2l0aCB0aGUgbm9ybWFsIHN1c3BlbmQgcGF0aC4KICAgIC8vCiAgICAvLyBBZnRlciB0aGlzIHdlJ2xsIHVzZSBhIHNldCBvZiBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMKICAgIC8vIHJlbmRlciBwYXNzIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gb3IgcmVzdGFydCBvciAic3VzcGVuZCIgdGhlIGNvbW1pdC4KICAgIC8vIFRoZSBhY3R1YWwgbG9naWMgZm9yIHRoaXMgaXMgc3ByZWFkIG91dCBpbiBkaWZmZXJlbnQgcGxhY2VzLgogICAgLy8KICAgIC8vIFRoaXMgZmlyc3QgcHJpbmNpcGxlIGlzIHRoYXQgaWYgd2UncmUgZ29pbmcgdG8gc3VzcGVuZCB3aGVuIHdlIGNvbXBsZXRlCiAgICAvLyBhIHJvb3QsIHRoZW4gd2Ugc2hvdWxkIGFsc28gcmVzdGFydCBpZiB3ZSBnZXQgYW4gdXBkYXRlIG9yIHBpbmcgdGhhdAogICAgLy8gbWlnaHQgdW5zdXNwZW5kIGl0LCBhbmQgdmljZSB2ZXJzYS4gVGhlIG9ubHkgcmVhc29uIHRvIHN1c3BlbmQgaXMKICAgIC8vIGJlY2F1c2UgeW91IHRoaW5rIHlvdSBtaWdodCB3YW50IHRvIHJlc3RhcnQgYmVmb3JlIGNvbW1pdHRpbmcuIEhvd2V2ZXIsCiAgICAvLyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVzdGFydCBvbmx5IHdoaWxlIGluIHRoZSBwZXJpb2Qgd2UncmUgc3VzcGVuZGVkLgogICAgLy8KICAgIC8vIFJlc3RhcnRpbmcgdG9vIGFnZ3Jlc3NpdmVseSBpcyBhbHNvIG5vdCBnb29kIGJlY2F1c2UgaXQgc3RhcnZlcyBvdXQgYW55CiAgICAvLyBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gU28gd2UgdXNlIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZW4uCiAgICAvLyBTdXNwZW5zZSBIZXVyaXN0aWNzCiAgICAvLwogICAgLy8gSWYgbm90aGluZyB0aHJldyBhIFByb21pc2Ugb3IgYWxsIHRoZSBzYW1lIGZhbGxiYWNrcyBhcmUgYWxyZWFkeSBzaG93aW5nLAogICAgLy8gdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuCiAgICAvLwogICAgLy8gSWYgdGhpcyBpcyBhbiBpbml0aWFsIHJlbmRlciBvZiBhIG5ldyB0cmVlIG9mIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kCiAgICAvLyB0aG9zZSB0cmlnZ2VyIGEgZmFsbGJhY2ssIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LiBXZSB3YW50IHRvIGVuc3VyZQogICAgLy8gdGhhdCB3ZSBjYW4gc2hvdyB0aGUgaW5pdGlhbCBsb2FkaW5nIHN0YXRlIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCiAgICAvLwogICAgLy8gSWYgd2UgaGl0IGEgIkRlbGF5ZWQiIGNhc2UsIHN1Y2ggYXMgd2hlbiB3ZSdkIHN3aXRjaCBmcm9tIGNvbnRlbnQgYmFjayBpbnRvCiAgICAvLyBhIGZhbGxiYWNrLCB0aGVuIHdlIHNob3VsZCBhbHdheXMgc3VzcGVuZC9yZXN0YXJ0LiBUcmFuc2l0aW9ucyBhcHBseQogICAgLy8gdG8gdGhpcyBjYXNlLiBJZiBub25lIGlzIGRlZmluZWQsIEpORCBpcyB1c2VkIGluc3RlYWQuCiAgICAvLwogICAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgYW5kIGl0IGdldHMgInJldHJpZWQiLCBhbGxvd2luZyB1cyB0byBzaG93CiAgICAvLyBhbm90aGVyIGxldmVsLCBidXQgdGhlcmUncyBzdGlsbCBhbiBpbm5lciBib3VuZGFyeSB0aGF0IHdvdWxkIHNob3cgYSBmYWxsYmFjaywKICAgIC8vIHRoZW4gd2Ugc3VzcGVuZC9yZXN0YXJ0IGZvciA1MDBtcyBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHNob3dlZCBhIGZhbGxiYWNrCiAgICAvLyBhbnl3aGVyZSBpbiB0aGUgdHJlZS4gVGhpcyBlZmZlY3RpdmVseSB0aHJvdHRsZXMgcHJvZ3Jlc3NpdmUgbG9hZGluZyBpbnRvIGEKICAgIC8vIGNvbnNpc3RlbnQgdHJhaW4gb2YgY29tbWl0cy4gVGhpcyBhbHNvIGdpdmVzIHVzIGFuIG9wcG9ydHVuaXR5IHRvIHJlc3RhcnQgdG8KICAgIC8vIGdldCB0byB0aGUgY29tcGxldGVkIHN0YXRlIHNsaWdodGx5IGVhcmxpZXIuCiAgICAvLwogICAgLy8gSWYgdGhlcmUncyBhbWJpZ3VpdHkgZHVlIHRvIGJhdGNoaW5nIGl0J3MgcmVzb2x2ZWQgaW4gcHJlZmVyZW5jZSBvZjoKICAgIC8vIDEpICJkZWxheWVkIiwgMikgImluaXRpYWwgcmVuZGVyIiwgMykgInJldHJ5Ii4KICAgIC8vCiAgICAvLyBXZSB3YW50IHRvIGVuc3VyZSB0aGF0IGEgImJ1c3kiIHN0YXRlIGRvZXNuJ3QgZ2V0IGZvcmNlIGNvbW1pdHRlZC4gV2Ugd2FudCB0bwogICAgLy8gZW5zdXJlIHRoYXQgbmV3IGluaXRpYWwgbG9hZGluZyBzdGF0ZXMgY2FuIGNvbW1pdCBhcyBzb29uIGFzIHBvc3NpYmxlLgoKCiAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIFRPRE86IEkgdGhpbmsgd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSBub3cgdXNlIGBEaWRDYXB0dXJlYCBpbgogICAgLy8gdGhlIGJlZ2luIHBoYXNlIHRvIHByZXZlbnQgYW4gZWFybHkgYmFpbG91dC4KCiAgICBzdXNwZW5zZUJvdW5kYXJ5LmxhbmVzID0gcm9vdFJlbmRlckxhbmVzOwogICAgcmV0dXJuIHN1c3BlbnNlQm91bmRhcnk7CiAgfQoKICBmdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbihyb290LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHZhbHVlLCByb290UmVuZGVyTGFuZXMpIHsKICAgIC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS4KICAgIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7CgogICAgewogICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHsKICAgICAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgd29yayBzdGlsbCwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnMKICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAvLyBUaGlzIGlzIGEgd2FrZWFibGUuIFRoZSBjb21wb25lbnQgc3VzcGVuZGVkLgogICAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTsKICAgICAgcmVzZXRTdXNwZW5kZWRDb21wb25lbnQoc291cmNlRmliZXIpOwoKICAgICAgewogICAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgewogICAgICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTsKICAgICAgICB9CiAgICAgIH0KCgogICAgICB2YXIgc3VzcGVuc2VCb3VuZGFyeSA9IGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKTsKCiAgICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5ICE9PSBudWxsKSB7CiAgICAgICAgc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7CiAgICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gV2Ugb25seSBhdHRhY2ggcGluZyBsaXN0ZW5lcnMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzCiAgICAgICAgLy8gY29tbWl0cyBmYWxsYmFja3Mgc3luY2hyb25vdXNseSwgc28gdGhlcmUgYXJlIG5vIHBpbmdzLgoKICAgICAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpIHsKICAgICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgcm9vdFJlbmRlckxhbmVzKTsKICAgICAgICB9CgogICAgICAgIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUpOwogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBObyBib3VuZGFyeSB3YXMgZm91bmQuIFVubGVzcyB0aGlzIGlzIGEgc3luYyB1cGRhdGUsIHRoaXMgaXMgT0suCiAgICAgICAgLy8gV2UgY2FuIHN1c3BlbmQgYW5kIHdhaXQgZm9yIG1vcmUgZGF0YSB0byBhcnJpdmUuCiAgICAgICAgaWYgKCFpbmNsdWRlc1N5bmNMYW5lKHJvb3RSZW5kZXJMYW5lcykpIHsKICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgc3luYyB1cGRhdGUuIFN1c3BlbmQuIFNpbmNlIHdlJ3JlIG5vdCBhY3RpdmF0aW5nIGEKICAgICAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LCB0aGlzIHdpbGwgdW53aW5kIGFsbCB0aGUgd2F5IHRvIHRoZSByb290IHdpdGhvdXQKICAgICAgICAgIC8vIHBlcmZvcm1pbmcgYSBzZWNvbmQgcGFzcyB0byByZW5kZXIgYSBmYWxsYmFjay4gKFRoaXMgaXMgYXJndWFibHkgaG93CiAgICAgICAgICAvLyByZWZyZXNoIHRyYW5zaXRpb25zIHNob3VsZCB3b3JrLCB0b28sIHNpbmNlIHdlJ3JlIG5vdCBnb2luZyB0byBjb21taXQKICAgICAgICAgIC8vIHRoZSBmYWxsYmFja3MgYW55d2F5LikKICAgICAgICAgIC8vCiAgICAgICAgICAvLyBUaGlzIGNhc2UgYWxzbyBhcHBsaWVzIHRvIGluaXRpYWwgaHlkcmF0aW9uLgogICAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpOwogICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0gLy8gVGhpcyBpcyBhIHN5bmMvZGlzY3JldGUgdXBkYXRlLiBXZSB0cmVhdCB0aGlzIGNhc2UgbGlrZSBhbiBlcnJvcgogICAgICAgIC8vIGJlY2F1c2UgZGlzY3JldGUgcmVuZGVycyBhcmUgZXhwZWN0ZWQgdG8gcHJvZHVjZSBhIGNvbXBsZXRlIHRyZWUKICAgICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggZXh0ZXJuYWwgc3RhdGUuCgoKICAgICAgICB2YXIgdW5jYXVnaHRTdXNwZW5zZUVycm9yID0gbmV3IEVycm9yKCdBIGNvbXBvbmVudCBzdXNwZW5kZWQgd2hpbGUgcmVzcG9uZGluZyB0byBzeW5jaHJvbm91cyBpbnB1dC4gVGhpcyAnICsgJ3dpbGwgY2F1c2UgdGhlIFVJIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBsb2FkaW5nIGluZGljYXRvci4gVG8gJyArICdmaXgsIHVwZGF0ZXMgdGhhdCBzdXNwZW5kIHNob3VsZCBiZSB3cmFwcGVkICcgKyAnd2l0aCBzdGFydFRyYW5zaXRpb24uJyk7IC8vIElmIHdlJ3JlIG91dHNpZGUgYSB0cmFuc2l0aW9uLCBmYWxsIHRocm91Z2ggdG8gdGhlIHJlZ3VsYXIgZXJyb3IgcGF0aC4KICAgICAgICAvLyBUaGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQgYnkgdGhlIG5lYXJlc3Qgc3VzcGVuc2UgYm91bmRhcnkuCgogICAgICAgIHZhbHVlID0gdW5jYXVnaHRTdXNwZW5zZUVycm9yOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBUaGlzIGlzIGEgcmVndWxhciBlcnJvciwgbm90IGEgU3VzcGVuc2Ugd2FrZWFibGUuCiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIHNvdXJjZUZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgewogICAgICAgIG1hcmtEaWRUaHJvd1doaWxlSHlkcmF0aW5nREVWKCk7CgogICAgICAgIHZhciBfc3VzcGVuc2VCb3VuZGFyeSA9IGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKTsgLy8gSWYgdGhlIGVycm9yIHdhcyB0aHJvd24gZHVyaW5nIGh5ZHJhdGlvbiwgd2UgbWF5IGJlIGFibGUgdG8gcmVjb3ZlciBieQogICAgICAgIC8vIGRpc2NhcmRpbmcgdGhlIGRlaHlkcmF0ZWQgY29udGVudCBhbmQgc3dpdGNoaW5nIHRvIGEgY2xpZW50IHJlbmRlci4KICAgICAgICAvLyBJbnN0ZWFkIG9mIHN1cmZhY2luZyB0aGUgZXJyb3IsIGZpbmQgdGhlIG5lYXJlc3QgU3VzcGVuc2UgYm91bmRhcnkKICAgICAgICAvLyBhbmQgcmVuZGVyIGl0IGFnYWluIHdpdGhvdXQgaHlkcmF0aW9uLgoKCiAgICAgICAgaWYgKF9zdXNwZW5zZUJvdW5kYXJ5ICE9PSBudWxsKSB7CiAgICAgICAgICBpZiAoKF9zdXNwZW5zZUJvdW5kYXJ5LmZsYWdzICYgU2hvdWxkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpIHsKICAgICAgICAgICAgLy8gU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIHNob3VsZCB0cnkgcmVuZGVyaW5nIHRoZSBub3JtYWwKICAgICAgICAgICAgLy8gY2hpbGRyZW4gYWdhaW4sIG5vdCB0aGUgZmFsbGJhY2suCiAgICAgICAgICAgIF9zdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyOwogICAgICAgICAgfQoKICAgICAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShfc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBFdmVuIHRob3VnaCB0aGUgdXNlciBtYXkgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgZXJyb3IsIHdlIHNob3VsZAogICAgICAgICAgLy8gc3RpbGwgbG9nIGl0IHNvIGl0IGNhbiBiZSBmaXhlZC4KCiAgICAgICAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2VGaWJlcikpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKTsKICAgIHJlbmRlckRpZEVycm9yKHZhbHVlKTsgLy8gV2UgZGlkbid0IGZpbmQgYSBib3VuZGFyeSB0aGF0IGNvdWxkIGhhbmRsZSB0aGlzIHR5cGUgb2YgZXhjZXB0aW9uLiBTdGFydAogICAgLy8gb3ZlciBhbmQgdHJhdmVyc2UgcGFyZW50IHBhdGggYWdhaW4sIHRoaXMgdGltZSB0cmVhdGluZyB0aGUgZXhjZXB0aW9uCiAgICAvLyBhcyBhbiBlcnJvci4KCiAgICB2YXIgd29ya0luUHJvZ3Jlc3MgPSByZXR1cm5GaWJlcjsKCiAgICBkbyB7CiAgICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7CiAgICAgICAgY2FzZSBIb3N0Um9vdDoKICAgICAgICAgIHsKICAgICAgICAgICAgdmFyIF9lcnJvckluZm8gPSB2YWx1ZTsKICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTsKICAgICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpOwogICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIGxhbmUpOwogICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfZXJyb3JJbmZvLCBsYW5lKTsKICAgICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CgogICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6CiAgICAgICAgICAvLyBDYXB0dXJlIGFuZCByZXRyeQogICAgICAgICAgdmFyIGVycm9ySW5mbyA9IHZhbHVlOwogICAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOwogICAgICAgICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOwoKICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncyAmJiAodHlwZW9mIGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRDYXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkpKSB7CiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7CgogICAgICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpOwoKICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBfbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZQoKICAgICAgICAgICAgdmFyIF91cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBlcnJvckluZm8sIF9sYW5lKTsKCiAgICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47CiAgICB9IHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCk7CiAgfQoKICBmdW5jdGlvbiBnZXRTdXNwZW5kZWRDYWNoZSgpIHsKICAgIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBTdXNwZW5zZSBib3VuZGFyeSBzdXNwZW5kcy4gSXQgcmV0dXJucyB0aGUKICB9CgogIHZhciBSZWFjdEN1cnJlbnRPd25lciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7CiAgdmFyIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsKICB2YXIgZGlkV2FybkFib3V0QmFkQ2xhc3M7CiAgdmFyIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQ7CiAgdmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudDsKICB2YXIgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudDsKICB2YXIgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzOwogIHZhciBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzOwogIHZhciBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcjsKICB2YXIgZGlkV2FybkFib3V0VGFpbE9wdGlvbnM7CgogIHsKICAgIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307CiAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50ID0ge307CiAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTsKICAgIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTsKICAgIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHt9OwogICAgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyA9IGZhbHNlOwogICAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXIgPSB7fTsKICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zID0ge307CiAgfQoKICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcykgewogICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHsKICAgICAgLy8gSWYgdGhpcyBpcyBhIGZyZXNoIG5ldyBjb21wb25lbnQgdGhhdCBoYXNuJ3QgYmVlbiByZW5kZXJlZCB5ZXQsIHdlCiAgICAgIC8vIHdvbid0IHVwZGF0ZSBpdHMgY2hpbGQgc2V0IGJ5IGFwcGx5aW5nIG1pbmltYWwgc2lkZS1lZmZlY3RzLiBJbnN0ZWFkLAogICAgICAvLyB3ZSB3aWxsIGFkZCB0aGVtIGFsbCB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IGdldHMgcmVuZGVyZWQuIFRoYXQgbWVhbnMKICAgICAgLy8gd2UgY2FuIG9wdGltaXplIHRoaXMgcmVjb25jaWxpYXRpb24gcGFzcyBieSBub3QgdHJhY2tpbmcgc2lkZS1lZmZlY3RzLgogICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG1vdW50Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpOwogICAgfSBlbHNlIHsKICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgY2hpbGQgaXMgdGhlIHNhbWUgYXMgdGhlIHdvcmsgaW4gcHJvZ3Jlc3MsIGl0IG1lYW5zIHRoYXQKICAgICAgLy8gd2UgaGF2ZW4ndCB5ZXQgc3RhcnRlZCBhbnkgd29yayBvbiB0aGVzZSBjaGlsZHJlbi4gVGhlcmVmb3JlLCB3ZSB1c2UKICAgICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbi4KICAgICAgLy8gSWYgd2UgaGFkIGFueSBwcm9ncmVzc2VkIHdvcmsgYWxyZWFkeSwgdGhhdCBpcyBpbnZhbGlkIGF0IHRoaXMgcG9pbnQgc28KICAgICAgLy8gbGV0J3MgdGhyb3cgaXQgb3V0LgogICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHsKICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlCiAgICAvLyB3YW50IHRvIHJlY29uY2lsZSB3aXRob3V0IG1hdGNoaW5nIGFnYWluc3QgdGhlIGV4aXN0aW5nIHNldC4gVGhpcyBoYXMgdGhlCiAgICAvLyBlZmZlY3Qgb2YgYWxsIGN1cnJlbnQgY2hpbGRyZW4gYmVpbmcgdW5tb3VudGVkOyBldmVuIGlmIHRoZSB0eXBlIGFuZCBrZXkKICAgIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuCiAgICAvLwogICAgLy8gVG8gZG8gdGhpcywgd2UncmUgZ29pbmcgdG8gZ28gdGhyb3VnaCB0aGUgcmVjb25jaWxlIGFsZ29yaXRobSB0d2ljZS4gSW4KICAgIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnkKICAgIC8vIHBhc3NpbmcgbnVsbC4KICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTsgLy8gSW4gdGhlIHNlY29uZCBwYXNzLCB3ZSBtb3VudCB0aGUgbmV3IGNoaWxkcmVuLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0IHdlCiAgICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXMKICAgIC8vIHRoZSBlZmZlY3Qgb2YgcmVtb3VudGluZyBhbGwgY2hpbGRyZW4gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZWlyCiAgICAvLyBpZGVudGl0aWVzIG1hdGNoLgoKICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIG51bGwsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7CiAgICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudAogICAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgYWZ0ZXIgdGhlIGZpcnN0IHJlbmRlciBzdXNwZW5kcy4KICAgIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy4KICAgIHsKICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7CiAgICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQKICAgICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuCiAgICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlczsKCiAgICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7CiAgICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wcwogICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdmFyIHJlbmRlciA9IENvbXBvbmVudC5yZW5kZXI7CiAgICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmOyAvLyBUaGUgcmVzdCBpcyBhIGZvcmsgb2YgdXBkYXRlRnVuY3Rpb25Db21wb25lbnQKCiAgICB2YXIgbmV4dENoaWxkcmVuOwogICAgdmFyIGhhc0lkOwogICAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKCiAgICB7CiAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTsKICAgIH0KCiAgICB7CiAgICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzOwogICAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTsKICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7CiAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTsKCiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHsKICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpOwogICAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7CiAgICB9CgogICAgewogICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpOwogICAgfQoKICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmICFkaWRSZWNlaXZlVXBkYXRlKSB7CiAgICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwogICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwogICAgfQoKICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7CiAgICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpOwogICAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuCgoKICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7CiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7CiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHsKICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7CiAgICAgIHZhciB0eXBlID0gQ29tcG9uZW50LnR5cGU7CgogICAgICBpZiAoaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSAmJiBDb21wb25lbnQuY29tcGFyZSA9PT0gbnVsbCAmJiAvLyBTaW1wbGVNZW1vQ29tcG9uZW50IGNvZGVwYXRoIGRvZXNuJ3QgcmVzb2x2ZSBvdXRlciBwcm9wcyBlaXRoZXIuCiAgICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhciByZXNvbHZlZFR5cGUgPSB0eXBlOwoKICAgICAgICB7CiAgICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7CiAgICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcywKICAgICAgICAvLyBhbmQgd2l0aCBvbmx5IHRoZSBkZWZhdWx0IHNoYWxsb3cgY29tcGFyaXNvbiwgd2UgdXBncmFkZSBpdAogICAgICAgIC8vIHRvIGEgU2ltcGxlTWVtb0NvbXBvbmVudCB0byBhbGxvdyBmYXN0IHBhdGggdXBkYXRlcy4KCgogICAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IFNpbXBsZU1lbW9Db21wb25lbnQ7CiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVkVHlwZTsKCiAgICAgICAgewogICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCB0eXBlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZXNvbHZlZFR5cGUsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpOwogICAgICB9CgogICAgICB7CiAgICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7CgogICAgICAgIGlmIChpbm5lclByb3BUeXBlcykgewogICAgICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC4KICAgICAgICAgIC8vIFdlIGNvdWxkIG1vdmUgaXQgdGhlcmUsIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdGhpcyBmb3IgbGF6eSBjb2RlIHBhdGguCiAgICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wcwogICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIGNoaWxkID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKENvbXBvbmVudC50eXBlLCBudWxsLCBuZXh0UHJvcHMsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5tb2RlLCByZW5kZXJMYW5lcyk7CiAgICAgIGNoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjsKICAgICAgY2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7CiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2hpbGQ7CiAgICAgIHJldHVybiBjaGlsZDsKICAgIH0KCiAgICB7CiAgICAgIHZhciBfdHlwZSA9IENvbXBvbmVudC50eXBlOwogICAgICB2YXIgX2lubmVyUHJvcFR5cGVzID0gX3R5cGUucHJvcFR5cGVzOwoKICAgICAgaWYgKF9pbm5lclByb3BUeXBlcykgewogICAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuCiAgICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC4KICAgICAgICBjaGVja1Byb3BUeXBlcyhfaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHMKICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShfdHlwZSkpOwogICAgICB9CiAgICB9CgogICAgdmFyIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFRoaXMgaXMgYWx3YXlzIGV4YWN0bHkgb25lIGNoaWxkCgogICAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTsKCiAgICBpZiAoIWhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCkgewogICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIHByb3BzIHdpdGggcmVzb2x2ZWQgZGVmYXVsdFByb3BzLAogICAgICAvLyB1bmxpa2UgY3VycmVudC5tZW1vaXplZFByb3BzIHdoaWNoIHdpbGwgYmUgdGhlIHVucmVzb2x2ZWQgb25lcy4KICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzOyAvLyBEZWZhdWx0IHRvIHNoYWxsb3cgY29tcGFyaXNvbgoKICAgICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTsKICAgICAgY29tcGFyZSA9IGNvbXBhcmUgIT09IG51bGwgPyBjb21wYXJlIDogc2hhbGxvd0VxdWFsOwoKICAgICAgaWYgKGNvbXBhcmUocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHsKICAgICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwogICAgICB9CiAgICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy4KCgogICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yazsKICAgIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgbmV4dFByb3BzKTsKICAgIG5ld0NoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjsKICAgIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzOwogICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXdDaGlsZDsKICAgIHJldHVybiBuZXdDaGlsZDsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykgewogICAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnQKICAgIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGlubmVyIHJlbmRlciBzdXNwZW5kcy4KICAgIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy4KICAgIHsKICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7CiAgICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQKICAgICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuCiAgICAgICAgdmFyIG91dGVyTWVtb1R5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTsKCiAgICAgICAgaWYgKG91dGVyTWVtb1R5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSkgewogICAgICAgICAgLy8gV2Ugd2FybiB3aGVuIHlvdSBkZWZpbmUgcHJvcFR5cGVzIG9uIGxhenkoKQogICAgICAgICAgLy8gc28gbGV0J3MganVzdCBza2lwIG92ZXIgaXQgdG8gZmluZCBtZW1vKCkgb3V0ZXIgd3JhcHBlci4KICAgICAgICAgIC8vIElubmVyIHByb3BzIGZvciBtZW1vIGFyZSB2YWxpZGF0ZWQgbGF0ZXIuCiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IG91dGVyTWVtb1R5cGU7CiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7CiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7CgogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IGluaXQocGF5bG9hZCk7CiAgICAgICAgICB9IGNhdGNoICh4KSB7CiAgICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBudWxsOwogICAgICAgICAgfSAvLyBJbm5lciBwcm9wVHlwZXMgd2lsbCBiZSB2YWxpZGF0ZWQgaW4gdGhlIGZ1bmN0aW9uIGNvbXBvbmVudCBwYXRoLgoKCiAgICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBvdXRlck1lbW9UeXBlICYmIG91dGVyTWVtb1R5cGUucHJvcFR5cGVzOwoKICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykgewogICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCAoU2ltcGxlTWVtb0NvbXBvbmVudCBoYXMgbm8gZGVmYXVsdFByb3BzKQogICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShvdXRlck1lbW9UeXBlKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHsKICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsKCiAgICAgIGlmIChzaGFsbG93RXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYgJiYgKCAvLyBQcmV2ZW50IGJhaWxvdXQgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQuCiAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSBjdXJyZW50LnR5cGUgKSkgewogICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsgLy8gVGhlIHByb3BzIGFyZSBzaGFsbG93bHkgZXF1YWwuIFJldXNlIHRoZSBwcmV2aW91cyBwcm9wcyBvYmplY3QsIGxpa2Ugd2UKICAgICAgICAvLyB3b3VsZCBkdXJpbmcgYSBub3JtYWwgZmliZXIgYmFpbG91dC4KICAgICAgICAvLwogICAgICAgIC8vIFdlIGRvbid0IGhhdmUgc3Ryb25nIGd1YXJhbnRlZXMgdGhhdCB0aGUgcHJvcHMgb2JqZWN0IGlzIHJlZmVyZW50aWFsbHkKICAgICAgICAvLyBlcXVhbCBkdXJpbmcgdXBkYXRlcyB3aGVyZSB3ZSBjYW4ndCBiYWlsIG91dCBhbnl3YXkg4oCUIGxpa2UgaWYgdGhlIHByb3BzCiAgICAgICAgLy8gYXJlIHNoYWxsb3dseSBlcXVhbCwgYnV0IHRoZXJlJ3MgYSBsb2NhbCBzdGF0ZSBvciBjb250ZXh0IHVwZGF0ZSBpbiB0aGUKICAgICAgICAvLyBzYW1lIGJhdGNoLgogICAgICAgIC8vCiAgICAgICAgLy8gSG93ZXZlciwgYXMgYSBwcmluY2lwbGUsIHdlIHNob3VsZCBhaW0gdG8gbWFrZSB0aGUgYmVoYXZpb3IgY29uc2lzdGVudAogICAgICAgIC8vIGFjcm9zcyBkaWZmZXJlbnQgd2F5cyBvZiBtZW1vaXppbmcgYSBjb21wb25lbnQuIEZvciBleGFtcGxlLCBSZWFjdC5tZW1vCiAgICAgICAgLy8gaGFzIGEgZGlmZmVyZW50IGludGVybmFsIEZpYmVyIGxheW91dCBpZiB5b3UgcGFzcyBhIG5vcm1hbCBmdW5jdGlvbgogICAgICAgIC8vIGNvbXBvbmVudCAoU2ltcGxlTWVtb0NvbXBvbmVudCkgdmVyc3VzIGlmIHlvdSBwYXNzIGEgZGlmZmVyZW50IHR5cGUKICAgICAgICAvLyBsaWtlIGZvcndhcmRSZWYgKE1lbW9Db21wb25lbnQpLiBCdXQgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCiAgICAgICAgLy8gV3JhcHBpbmcgYSBjb21wb25lbnQgaW4gZm9yd2FyZFJlZiAob3IgUmVhY3QubGF6eSwgZXRjKSBzaG91bGRuJ3QKICAgICAgICAvLyBhZmZlY3Qgd2hldGhlciB0aGUgcHJvcHMgb2JqZWN0IGlzIHJldXNlZCBkdXJpbmcgYSBiYWlsb3V0LgoKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBuZXh0UHJvcHMgPSBwcmV2UHJvcHM7CgogICAgICAgIGlmICghY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpKSB7CiAgICAgICAgICAvLyBUaGUgcGVuZGluZyBsYW5lcyB3ZXJlIGNsZWFyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBiZWdpbldvcmsuIFdlJ3JlCiAgICAgICAgICAvLyBhYm91dCB0byBiYWlsIG91dCwgYnV0IHRoZXJlIG1pZ2h0IGJlIG90aGVyIGxhbmVzIHRoYXQgd2VyZW4ndAogICAgICAgICAgLy8gaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgcmVuZGVyLiBVc3VhbGx5LCB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhlCiAgICAgICAgICAvLyByZW1haW5pbmcgdXBkYXRlcyBpcyBhY2N1bXVsYXRlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlCiAgICAgICAgICAvLyBjb21wb25lbnQgKGkuZS4gd2hlbiBwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUpLiBCdXQgc2luY2Ugc2luY2UKICAgICAgICAgIC8vIHdlJ3JlIGJhaWxpbmcgb3V0IGVhcmx5ICp3aXRob3V0KiBldmFsdWF0aW5nIHRoZSBjb21wb25lbnQsIHdlIG5lZWQKICAgICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGl0IGhlcmUsIHRvby4gUmVzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGZpYmVyLgogICAgICAgICAgLy8gTk9URTogVGhpcyBvbmx5IGFwcGxpZXMgdG8gU2ltcGxlTWVtb0NvbXBvbmVudCwgbm90IE1lbW9Db21wb25lbnQsCiAgICAgICAgICAvLyBiZWNhdXNlIGEgTWVtb0NvbXBvbmVudCBmaWJlciBkb2VzIG5vdCBoYXZlIGhvb2tzIG9yIGFuIHVwZGF0ZSBxdWV1ZTsKICAgICAgICAgIC8vIHJhdGhlciwgaXQgd3JhcHMgYXJvdW5kIGFuIGlubmVyIGNvbXBvbmVudCwgd2hpY2ggbWF5IG9yIG1heSBub3QKICAgICAgICAgIC8vIGNvbnRhaW5zIGhvb2tzLgogICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGUgcmVzZXQgYXQgaW4gYmVnaW5Xb3JrIG91dCBvZiB0aGUgY29tbW9uIHBhdGggc28gdGhhdAogICAgICAgICAgLy8gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgogICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzOwogICAgICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKICAgICAgICB9IGVsc2UgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHsKICAgICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuCiAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuCiAgICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7CiAgICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOwogICAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjsKICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFN0YXRlIDogbnVsbDsKCiAgICBpZiAobmV4dFByb3BzLm1vZGUgPT09ICdoaWRkZW4nIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiApIHsKICAgICAgLy8gUmVuZGVyaW5nIGEgaGlkZGVuIHRyZWUuCiAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7CiAgICAgICAgLy8gSW4gbGVnYWN5IHN5bmMgbW9kZSwgZG9uJ3QgZGVmZXIgdGhlIHN1YnRyZWUuIFJlbmRlciBpdCBub3cuCiAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgaG93IE9mZnNjcmVlbiBzaG91bGQgd29yayB3aXRoIHRyYW5zaXRpb25zIGluIHRoZSBmdXR1cmUKICAgICAgICB2YXIgbmV4dFN0YXRlID0gewogICAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLAogICAgICAgICAgY2FjaGVQb29sOiBudWxsLAogICAgICAgICAgdHJhbnNpdGlvbnM6IG51bGwKICAgICAgICB9OwogICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXh0U3RhdGU7CgogICAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwogICAgICB9IGVsc2UgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBPZmZzY3JlZW5MYW5lKSkgewogICAgICAgIHZhciBzcGF3bmVkQ2FjaGVQb29sID0gbnVsbDsgLy8gV2UncmUgaGlkZGVuLCBhbmQgd2UncmUgbm90IHJlbmRlcmluZyBhdCBPZmZzY3JlZW4uIFdlIHdpbGwgYmFpbCBvdXQKICAgICAgICAvLyBhbmQgcmVzdW1lIHRoaXMgdHJlZSBsYXRlci4KCiAgICAgICAgdmFyIG5leHRCYXNlTGFuZXM7CgogICAgICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHsKICAgICAgICAgIHZhciBwcmV2QmFzZUxhbmVzID0gcHJldlN0YXRlLmJhc2VMYW5lczsKICAgICAgICAgIG5leHRCYXNlTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZCYXNlTGFuZXMsIHJlbmRlckxhbmVzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV4dEJhc2VMYW5lcyA9IHJlbmRlckxhbmVzOwogICAgICAgIH0gLy8gU2NoZWR1bGUgdGhpcyBmaWJlciB0byByZS1yZW5kZXIgYXQgb2Zmc2NyZWVuIHByaW9yaXR5LiBUaGVuIGJhaWxvdXQuCgoKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBsYW5lVG9MYW5lcyhPZmZzY3JlZW5MYW5lKTsKICAgICAgICB2YXIgX25leHRTdGF0ZSA9IHsKICAgICAgICAgIGJhc2VMYW5lczogbmV4dEJhc2VMYW5lcywKICAgICAgICAgIGNhY2hlUG9vbDogc3Bhd25lZENhY2hlUG9vbCwKICAgICAgICAgIHRyYW5zaXRpb25zOiBudWxsCiAgICAgICAgfTsKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTsKICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7CiAgICAgICAgLy8gdG8gYXZvaWQgYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuCgoKICAgICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIG5leHRCYXNlTGFuZXMpOwoKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUaGlzIGlzIHRoZSBzZWNvbmQgcmVuZGVyLiBUaGUgc3Vycm91bmRpbmcgdmlzaWJsZSBjb250ZW50IGhhcyBhbHJlYWR5CiAgICAgICAgLy8gY29tbWl0dGVkLiBOb3cgd2UgcmVzdW1lIHJlbmRlcmluZyB0aGUgaGlkZGVuIHRyZWUuCiAgICAgICAgLy8gUmVuZGVyaW5nIGF0IG9mZnNjcmVlbiwgc28gd2UgY2FuIGNsZWFyIHRoZSBiYXNlIGxhbmVzLgogICAgICAgIHZhciBfbmV4dFN0YXRlMiA9IHsKICAgICAgICAgIGJhc2VMYW5lczogTm9MYW5lcywKICAgICAgICAgIGNhY2hlUG9vbDogbnVsbCwKICAgICAgICAgIHRyYW5zaXRpb25zOiBudWxsCiAgICAgICAgfTsKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTI7IC8vIFB1c2ggdGhlIGxhbmVzIHRoYXQgd2VyZSBza2lwcGVkIHdoZW4gd2UgYmFpbGVkIG91dC4KCiAgICAgICAgdmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHByZXZTdGF0ZSAhPT0gbnVsbCA/IHByZXZTdGF0ZS5iYXNlTGFuZXMgOiByZW5kZXJMYW5lczsKCiAgICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBzdWJ0cmVlUmVuZGVyTGFuZXMpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBSZW5kZXJpbmcgYSB2aXNpYmxlIHRyZWUuCiAgICAgIHZhciBfc3VidHJlZVJlbmRlckxhbmVzOwoKICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkgewogICAgICAgIC8vIFdlJ3JlIGdvaW5nIGZyb20gaGlkZGVuIC0+IHZpc2libGUuCiAgICAgICAgX3N1YnRyZWVSZW5kZXJMYW5lcyA9IG1lcmdlTGFuZXMocHJldlN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpOwoKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBXZSB3ZXJlbid0IHByZXZpb3VzbHkgaGlkZGVuLCBhbmQgd2Ugc3RpbGwgYXJlbid0LCBzbyB0aGVyZSdzIG5vdGhpbmcKICAgICAgICAvLyBzcGVjaWFsIHRvIGRvLiBOZWVkIHRvIHB1c2ggdG8gdGhlIHN0YWNrIHJlZ2FyZGxlc3MsIHRob3VnaCwgdG8gYXZvaWQKICAgICAgICAvLyBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC4KICAgICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXM7CiAgICAgIH0KCiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgX3N1YnRyZWVSZW5kZXJMYW5lcyk7CiAgICB9CgogICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpOwogICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkOwogIH0gLy8gTm90ZTogVGhlc2UgaGFwcGVuIHRvIGhhdmUgaWRlbnRpY2FsIGJlZ2luIHBoYXNlcywgZm9yIG5vdy4gV2Ugc2hvdWxkbid0IGhvbGQKCiAgZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7CiAgICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOwogICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpOwogICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHsKICAgIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMuY2hpbGRyZW47CiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7CiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHsKICAgIHsKICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlOwoKICAgICAgewogICAgICAgIC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS4KICAgICAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLAogICAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7CiAgICAgICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDsKICAgICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDsKICAgICAgfQogICAgfQoKICAgIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7CiAgICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuOwogICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpOwogICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkOwogIH0KCiAgZnVuY3Rpb24gbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgewogICAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjsKCiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gcmVmKSB7CiAgICAgIC8vIFNjaGVkdWxlIGEgUmVmIGVmZmVjdAogICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWY7CgogICAgICB7CiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7CiAgICB7CiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkgewogICAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50CiAgICAgICAgLy8gYmVjYXVzZSB0aGV5J3JlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSByZXNvbHZlZCBoZXJlLgogICAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7CgogICAgICAgIGlmIChpbm5lclByb3BUeXBlcykgewogICAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHMKICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHZhciBjb250ZXh0OwoKICAgIHsKICAgICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTsKICAgICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7CiAgICB9CgogICAgdmFyIG5leHRDaGlsZHJlbjsKICAgIHZhciBoYXNJZDsKICAgIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7CgogICAgewogICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7CiAgICB9CgogICAgewogICAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzczsKICAgICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7CiAgICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTsKICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpOwoKICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgewogICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpOwoKICAgICAgICB0cnkgewogICAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpOwogICAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7CiAgICB9CgogICAgewogICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpOwogICAgfQoKICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmICFkaWRSZWNlaXZlVXBkYXRlKSB7CiAgICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwogICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwogICAgfQoKICAgIGlmIChnZXRJc0h5ZHJhdGluZygpICYmIGhhc0lkKSB7CiAgICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpOwogICAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuCgoKICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7CiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7CiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7CiAgICB7CiAgICAgIC8vIFRoaXMgaXMgdXNlZCBieSBEZXZUb29scyB0byBmb3JjZSBhIGJvdW5kYXJ5IHRvIGVycm9yLgogICAgICBzd2l0Y2ggKHNob3VsZEVycm9yKHdvcmtJblByb2dyZXNzKSkgewogICAgICAgIGNhc2UgZmFsc2U6CiAgICAgICAgICB7CiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7CiAgICAgICAgICAgIHZhciBjdG9yID0gd29ya0luUHJvZ3Jlc3MudHlwZTsgLy8gVE9ETyBUaGlzIHdheSBvZiByZXNldHRpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHN0YXRlIGlzIGEgaGFjay4KICAgICAgICAgICAgLy8gSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM/CgogICAgICAgICAgICB2YXIgdGVtcEluc3RhbmNlID0gbmV3IGN0b3Iod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcywgX2luc3RhbmNlLmNvbnRleHQpOwogICAgICAgICAgICB2YXIgc3RhdGUgPSB0ZW1wSW5zdGFuY2Uuc3RhdGU7CgogICAgICAgICAgICBfaW5zdGFuY2UudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUoX2luc3RhbmNlLCBzdGF0ZSwgbnVsbCk7CgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgY2FzZSB0cnVlOgogICAgICAgICAgewogICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOwogICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2RlcwoKICAgICAgICAgICAgdmFyIGVycm9yJDEgPSBuZXcgRXJyb3IoJ1NpbXVsYXRlZCBlcnJvciBjb21pbmcgZnJvbSBEZXZUb29scycpOwogICAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKTsKICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTsgLy8gU2NoZWR1bGUgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHJlLXJlbmRlciB1c2luZyB1cGRhdGVkIHN0YXRlCgogICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoZXJyb3IkMSwgd29ya0luUHJvZ3Jlc3MpLCBsYW5lKTsKICAgICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCB1cGRhdGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7CiAgICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQKICAgICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuCiAgICAgICAgdmFyIGlubmVyUHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlczsKCiAgICAgICAgaWYgKGlubmVyUHJvcFR5cGVzKSB7CiAgICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wcwogICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuCiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuCiAgICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuCgoKICAgIHZhciBoYXNDb250ZXh0OwoKICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7CiAgICAgIGhhc0NvbnRleHQgPSB0cnVlOwogICAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTsKICAgIH0gZWxzZSB7CiAgICAgIGhhc0NvbnRleHQgPSBmYWxzZTsKICAgIH0KCiAgICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwogICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOwogICAgdmFyIHNob3VsZFVwZGF0ZTsKCiAgICBpZiAoaW5zdGFuY2UgPT09IG51bGwpIHsKICAgICAgcmVzZXRTdXNwZW5kZWRDdXJyZW50T25Nb3VudEluTGVnYWN5TW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7IC8vIEluIHRoZSBpbml0aWFsIHBhc3Mgd2UgbWlnaHQgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlLgoKICAgICAgY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMpOwogICAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7CiAgICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGN1cnJlbnQgPT09IG51bGwpIHsKICAgICAgLy8gSW4gYSByZXN1bWUsIHdlJ2xsIGFscmVhZHkgaGF2ZSBhbiBpbnN0YW5jZSB3ZSBjYW4gcmV1c2UuCiAgICAgIHNob3VsZFVwZGF0ZSA9IHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHNob3VsZFVwZGF0ZSA9IHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7CiAgICB9CgogICAgdmFyIG5leHRVbml0T2ZXb3JrID0gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7CgogICAgewogICAgICB2YXIgaW5zdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsKCiAgICAgIGlmIChzaG91bGRVcGRhdGUgJiYgaW5zdC5wcm9wcyAhPT0gbmV4dFByb3BzKSB7CiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7CiAgICAgICAgICBlcnJvcignSXQgbG9va3MgbGlrZSAlcyBpcyByZWFzc2lnbmluZyBpdHMgb3duIGB0aGlzLnByb3BzYCB3aGlsZSByZW5kZXJpbmcuICcgKyAnVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBjYW4gbGVhZCB0byBjb25mdXNpbmcgYnVncy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCAnYSBjb21wb25lbnQnKTsKICAgICAgICB9CgogICAgICAgIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSB0cnVlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG5leHRVbml0T2ZXb3JrOwogIH0KCiAgZnVuY3Rpb24gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcykgewogICAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UKICAgIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOwogICAgdmFyIGRpZENhcHR1cmVFcnJvciA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzOwoKICAgIGlmICghc2hvdWxkVXBkYXRlICYmICFkaWRDYXB0dXJlRXJyb3IpIHsKICAgICAgLy8gQ29udGV4dCBwcm92aWRlcnMgc2hvdWxkIGRlZmVyIHRvIHNDVSBmb3IgcmVuZGVyaW5nCiAgICAgIGlmIChoYXNDb250ZXh0KSB7CiAgICAgICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7CiAgICB9CgogICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOyAvLyBSZXJlbmRlcgoKICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzOwogICAgdmFyIG5leHRDaGlsZHJlbjsKCiAgICBpZiAoZGlkQ2FwdHVyZUVycm9yICYmIHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzIG5vdCBkZWZpbmVkLAogICAgICAvLyB1bm1vdW50IGFsbCB0aGUgY2hpbGRyZW4uIGNvbXBvbmVudERpZENhdGNoIHdpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIHRvCiAgICAgIC8vIHJlLXJlbmRlciBhIGZhbGxiYWNrLiBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB3ZSBtaWdyYXRlIGV2ZXJ5b25lIHRvCiAgICAgIC8vIHRoZSBuZXcgQVBJLgogICAgICAvLyBUT0RPOiBXYXJuIGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgICAgIG5leHRDaGlsZHJlbiA9IG51bGw7CgogICAgICB7CiAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgewogICAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTsKICAgICAgfQoKICAgICAgewogICAgICAgIHNldElzUmVuZGVyaW5nKHRydWUpOwogICAgICAgIG5leHRDaGlsZHJlbiA9IGluc3RhbmNlLnJlbmRlcigpOwoKICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7CiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTsKCiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpbnN0YW5jZS5yZW5kZXIoKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTsKICAgICAgfQoKICAgICAgewogICAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7CiAgICAgIH0KICAgIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLgoKCiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrOwoKICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGRpZENhcHR1cmVFcnJvcikgewogICAgICAvLyBJZiB3ZSdyZSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlY29uY2lsZSB3aXRob3V0IHJldXNpbmcgYW55IG9mCiAgICAgIC8vIHRoZSBleGlzdGluZyBjaGlsZHJlbi4gQ29uY2VwdHVhbGx5LCB0aGUgbm9ybWFsIGNoaWxkcmVuIGFuZCB0aGUgY2hpbGRyZW4KICAgICAgLy8gdGhhdCBhcmUgc2hvd24gb24gZXJyb3IgYXJlIHR3byBkaWZmZXJlbnQgc2V0cywgc28gd2Ugc2hvdWxkbid0IHJldXNlCiAgICAgIC8vIG5vcm1hbCBjaGlsZHJlbiBldmVuIGlmIHRoZWlyIGlkZW50aXRpZXMgbWF0Y2guCiAgICAgIGZvcmNlVW5tb3VudEN1cnJlbnRBbmRSZWNvbmNpbGUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpOwogICAgfSBlbHNlIHsKICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpOwogICAgfSAvLyBNZW1vaXplIHN0YXRlIHVzaW5nIHRoZSB2YWx1ZXMgd2UganVzdCB1c2VkIHRvIHJlbmRlci4KICAgIC8vIFRPRE86IFJlc3RydWN0dXJlIHNvIHdlIG5ldmVyIHJlYWQgdmFsdWVzIGZyb20gdGhlIGluc3RhbmNlLgoKCiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7IC8vIFRoZSBjb250ZXh0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzbyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIGl0LgoKICAgIGlmIChoYXNDb250ZXh0KSB7CiAgICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7CiAgICB9CgogICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkOwogIH0KCiAgZnVuY3Rpb24gcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcykgewogICAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7CgogICAgaWYgKHJvb3QucGVuZGluZ0NvbnRleHQpIHsKICAgICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5wZW5kaW5nQ29udGV4dCwgcm9vdC5wZW5kaW5nQ29udGV4dCAhPT0gcm9vdC5jb250ZXh0KTsKICAgIH0gZWxzZSBpZiAocm9vdC5jb250ZXh0KSB7CiAgICAgIC8vIFNob3VsZCBhbHdheXMgYmUgc2V0CiAgICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGV4dCwgZmFsc2UpOwogICAgfQoKICAgIHB1c2hIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzLCByb290LmNvbnRhaW5lckluZm8pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7CiAgICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTsKCiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTsKICAgIH0KCiAgICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOwogICAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7CiAgICB2YXIgcHJldkNoaWxkcmVuID0gcHJldlN0YXRlLmVsZW1lbnQ7CiAgICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsKICAgIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCBudWxsLCByZW5kZXJMYW5lcyk7CiAgICB2YXIgbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsKICAgIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOwogICAgLy8gYmVpbmcgY2FsbGVkICJlbGVtZW50Ii4KCgogICAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRTdGF0ZS5lbGVtZW50OwoKICAgIGlmICggcHJldlN0YXRlLmlzRGVoeWRyYXRlZCkgewogICAgICAvLyBUaGlzIGlzIGEgaHlkcmF0aW9uIHJvb3Qgd2hvc2Ugc2hlbGwgaGFzIG5vdCB5ZXQgaHlkcmF0ZWQuIFdlIHNob3VsZAogICAgICAvLyBhdHRlbXB0IHRvIGh5ZHJhdGUuCiAgICAgIC8vIEZsaXAgaXNEZWh5ZHJhdGVkIHRvIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgd2hlbiB0aGlzIHJlbmRlcgogICAgICAvLyBmaW5pc2hlcywgdGhlIHJvb3Qgd2lsbCBubyBsb25nZXIgYmUgZGVoeWRyYXRlZC4KICAgICAgdmFyIG92ZXJyaWRlU3RhdGUgPSB7CiAgICAgICAgZWxlbWVudDogbmV4dENoaWxkcmVuLAogICAgICAgIGlzRGVoeWRyYXRlZDogZmFsc2UsCiAgICAgICAgY2FjaGU6IG5leHRTdGF0ZS5jYWNoZSwKICAgICAgICBwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOiBuZXh0U3RhdGUucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcywKICAgICAgICB0cmFuc2l0aW9uczogbmV4dFN0YXRlLnRyYW5zaXRpb25zCiAgICAgIH07CiAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBgYmFzZVN0YXRlYCBjYW4gYWx3YXlzIGJlIHRoZSBsYXN0IHN0YXRlIGJlY2F1c2UgdGhlIHJvb3QgZG9lc24ndAogICAgICAvLyBoYXZlIHJlZHVjZXIgZnVuY3Rpb25zIHNvIGl0IGRvZXNuJ3QgbmVlZCByZWJhc2luZy4KCiAgICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG92ZXJyaWRlU3RhdGU7CiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBvdmVycmlkZVN0YXRlOwoKICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRm9yY2VDbGllbnRSZW5kZXIpIHsKICAgICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgYSBwcmV2aW91cyBhdHRlbXB0IHRvIGh5ZHJhdGUgdGhlIHNoZWxsLCBzbyB3ZQogICAgICAgIC8vIGZvcmNlZCBhIGNsaWVudCByZW5kZXIuCiAgICAgICAgdmFyIHJlY292ZXJhYmxlRXJyb3IgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihuZXcgRXJyb3IoJ1RoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBoeWRyYXRpbmcuIEJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbmVkIG91dHNpZGUgJyArICdvZiBhIFN1c3BlbnNlIGJvdW5kYXJ5LCB0aGUgZW50aXJlIHJvb3Qgd2lsbCBzd2l0Y2ggdG8gJyArICdjbGllbnQgcmVuZGVyaW5nLicpLCB3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgcmV0dXJuIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKTsKICAgICAgfSBlbHNlIGlmIChuZXh0Q2hpbGRyZW4gIT09IHByZXZDaGlsZHJlbikgewogICAgICAgIHZhciBfcmVjb3ZlcmFibGVFcnJvciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKG5ldyBFcnJvcignVGhpcyByb290IHJlY2VpdmVkIGFuIGVhcmx5IHVwZGF0ZSwgYmVmb3JlIGFueXRoaW5nIHdhcyBhYmxlICcgKyAnaHlkcmF0ZS4gU3dpdGNoZWQgdGhlIGVudGlyZSByb290IHRvIGNsaWVudCByZW5kZXJpbmcuJyksIHdvcmtJblByb2dyZXNzKTsKCiAgICAgICAgcmV0dXJuIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCBfcmVjb3ZlcmFibGVFcnJvcik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhlIG91dGVybW9zdCBzaGVsbCBoYXMgbm90IGh5ZHJhdGVkIHlldC4gU3RhcnQgaHlkcmF0aW5nLgogICAgICAgIGVudGVySHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpOwoKICAgICAgICB2YXIgY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTsKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkOwogICAgICAgIHZhciBub2RlID0gY2hpbGQ7CgogICAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgICAvLyBNYXJrIGVhY2ggY2hpbGQgYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzCiAgICAgICAgICAvLyB0cmVlIGlzIHBhcnQgb2YgYSBoeWRyYXRpbmcgdHJlZS4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIGNoaWxkCiAgICAgICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy4KICAgICAgICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpcwogICAgICAgICAgLy8gaW5zZXJ0ZWQgaW50byB0aGUgUmVhY3QgdHJlZSBoZXJlLiBJdCBqdXN0IGhhcHBlbnMgdG8gbm90IG5lZWQgRE9NCiAgICAgICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgIG5vZGUuZmxhZ3MgPSBub2RlLmZsYWdzICYgflBsYWNlbWVudCB8IEh5ZHJhdGluZzsKICAgICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBSb290IGlzIG5vdCBkZWh5ZHJhdGVkLiBFaXRoZXIgdGhpcyBpcyBhIGNsaWVudC1vbmx5IHJvb3QsIG9yIGl0CiAgICAgIC8vIGFscmVhZHkgaHlkcmF0ZWQuCiAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTsKCiAgICAgIGlmIChuZXh0Q2hpbGRyZW4gPT09IHByZXZDaGlsZHJlbikgewogICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7CiAgICAgIH0KCiAgICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTsKICAgIH0KCiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7CiAgfQoKICBmdW5jdGlvbiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikgewogICAgLy8gUmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuCiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7CiAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKHJlY292ZXJhYmxlRXJyb3IpOwogICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7CiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7CiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykgewogICAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTsKCiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkgewogICAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7CiAgICB9CgogICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOwogICAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsKICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbnVsbDsKICAgIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47CiAgICB2YXIgaXNEaXJlY3RUZXh0Q2hpbGQgPSBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBuZXh0UHJvcHMpOwoKICAgIGlmIChpc0RpcmVjdFRleHRDaGlsZCkgewogICAgICAvLyBXZSBzcGVjaWFsIGNhc2UgYSBkaXJlY3QgdGV4dCBjaGlsZCBvZiBhIGhvc3Qgbm9kZS4gVGhpcyBpcyBhIGNvbW1vbgogICAgICAvLyBjYXNlLiBXZSB3b24ndCBoYW5kbGUgaXQgYXMgYSByZWlmaWVkIGNoaWxkLiBXZSB3aWxsIGluc3RlYWQgaGFuZGxlCiAgICAgIC8vIHRoaXMgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQgdGhhdCBhbHNvIGhhcyBhY2Nlc3MgdG8gdGhpcyBwcm9wLiBUaGF0CiAgICAgIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGFub3RoZXIgSG9zdFRleHQgZmliZXIgYW5kIHRyYXZlcnNpbmcgaXQuCiAgICAgIG5leHRDaGlsZHJlbiA9IG51bGw7CiAgICB9IGVsc2UgaWYgKHByZXZQcm9wcyAhPT0gbnVsbCAmJiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcmV2UHJvcHMpKSB7CiAgICAgIC8vIElmIHdlJ3JlIHN3aXRjaGluZyBmcm9tIGEgZGlyZWN0IHRleHQgY2hpbGQgdG8gYSBub3JtYWwgY2hpbGQsIG9yIHRvCiAgICAgIC8vIGVtcHR5LCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHRoZSB0ZXh0IGNvbnRlbnQgdG8gYmUgcmVzZXQuCiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENvbnRlbnRSZXNldDsKICAgIH0KCiAgICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsKICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTsKICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7CiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkgewogICAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7CiAgICB9IC8vIE5vdGhpbmcgdG8gZG8gaGVyZS4gVGhpcyBpcyB0ZXJtaW5hbC4gV2UnbGwgZG8gdGhlIGNvbXBsZXRpb24gc3RlcAogICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIuCgoKICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gbW91bnRMYXp5Q29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZWxlbWVudFR5cGUsIHJlbmRlckxhbmVzKSB7CiAgICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7CiAgICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7CiAgICB2YXIgbGF6eUNvbXBvbmVudCA9IGVsZW1lbnRUeXBlOwogICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkOwogICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0OwogICAgdmFyIENvbXBvbmVudCA9IGluaXQocGF5bG9hZCk7IC8vIFN0b3JlIHRoZSB1bndyYXBwZWQgY29tcG9uZW50IGluIHRoZSB0eXBlLgoKICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQ7CiAgICB2YXIgcmVzb2x2ZWRUYWcgPSB3b3JrSW5Qcm9ncmVzcy50YWcgPSByZXNvbHZlTGF6eUNvbXBvbmVudFRhZyhDb21wb25lbnQpOwogICAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpOwogICAgdmFyIGNoaWxkOwoKICAgIHN3aXRjaCAocmVzb2x2ZWRUYWcpIHsKICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICB7CiAgICAgICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTsKICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpOwogICAgICAgICAgfQoKICAgICAgICAgIGNoaWxkID0gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpOwogICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgICAgIH0KCiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgewogICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7CiAgICAgICAgICB9CgogICAgICAgICAgY2hpbGQgPSB1cGRhdGVDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7CiAgICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgICAgfQoKICAgICAgY2FzZSBGb3J3YXJkUmVmOgogICAgICAgIHsKICAgICAgICAgIHsKICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7CiAgICAgICAgICB9CgogICAgICAgICAgY2hpbGQgPSB1cGRhdGVGb3J3YXJkUmVmKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTsKICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CgogICAgICBjYXNlIE1lbW9Db21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgewogICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHsKICAgICAgICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzOwoKICAgICAgICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHsKICAgICAgICAgICAgICAgIGNoZWNrUHJvcFR5cGVzKG91dGVyUHJvcFR5cGVzLCByZXNvbHZlZFByb3BzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seQogICAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgY2hpbGQgPSB1cGRhdGVNZW1vQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LnR5cGUsIHJlc29sdmVkUHJvcHMpLCAvLyBUaGUgaW5uZXIgdHlwZSBjYW4gaGF2ZSBkZWZhdWx0cyB0b28KICAgICAgICAgIHJlbmRlckxhbmVzKTsKICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9CiAgICB9CgogICAgdmFyIGhpbnQgPSAnJzsKCiAgICB7CiAgICAgIGlmIChDb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIENvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHsKICAgICAgICBoaW50ID0gJyBEaWQgeW91IHdyYXAgYSBjb21wb25lbnQgaW4gUmVhY3QubGF6eSgpIG1vcmUgdGhhbiBvbmNlPyc7CiAgICAgIH0KICAgIH0gLy8gVGhpcyBtZXNzYWdlIGludGVudGlvbmFsbHkgZG9lc24ndCBtZW50aW9uIEZvcndhcmRSZWYgb3IgTWVtb0NvbXBvbmVudAogICAgLy8gYmVjYXVzZSB0aGUgZmFjdCB0aGF0IGl0J3MgYSBzZXBhcmF0ZSB0eXBlIG9mIHdvcmsgaXMgYW4KICAgIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbC4KCgogICAgdGhyb3cgbmV3IEVycm9yKCJFbGVtZW50IHR5cGUgaXMgaW52YWxpZC4gUmVjZWl2ZWQgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG86ICIgKyBDb21wb25lbnQgKyAiLiAiICsgKCJMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi4iICsgaGludCkpOwogIH0KCiAgZnVuY3Rpb24gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHsKICAgIHJlc2V0U3VzcGVuZGVkQ3VycmVudE9uTW91bnRJbkxlZ2FjeU1vZGUoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzKTsgLy8gUHJvbW90ZSB0aGUgZmliZXIgdG8gYSBjbGFzcyBhbmQgdHJ5IHJlbmRlcmluZyBhZ2Fpbi4KCiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YAogICAgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy4KICAgIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC4KICAgIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy4KCiAgICB2YXIgaGFzQ29udGV4dDsKCiAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkgewogICAgICBoYXNDb250ZXh0ID0gdHJ1ZTsKICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7CiAgICB9IGVsc2UgewogICAgICBoYXNDb250ZXh0ID0gZmFsc2U7CiAgICB9CgogICAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKICAgIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTsKICAgIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTsKICAgIHJldHVybiBmaW5pc2hDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7CiAgfQoKICBmdW5jdGlvbiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSB7CiAgICByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7CiAgICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7CiAgICB2YXIgY29udGV4dDsKCiAgICB7CiAgICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpOwogICAgICBjb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTsKICAgIH0KCiAgICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwogICAgdmFyIHZhbHVlOwogICAgdmFyIGhhc0lkOwoKICAgIHsKICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpOwogICAgfQoKICAgIHsKICAgICAgaWYgKENvbXBvbmVudC5wcm90b3R5cGUgJiYgdHlwZW9mIENvbXBvbmVudC5wcm90b3R5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7CgogICAgICAgIGlmICghZGlkV2FybkFib3V0QmFkQ2xhc3NbY29tcG9uZW50TmFtZV0pIHsKICAgICAgICAgIGVycm9yKCJUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGhhdmUgYSByZW5kZXIgbWV0aG9kLCBidXQgZG9lc24ndCBleHRlbmQgUmVhY3QuQ29tcG9uZW50LiAiICsgJ1RoaXMgaXMgbGlrZWx5IHRvIGNhdXNlIGVycm9ycy4gQ2hhbmdlICVzIHRvIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTsKCiAgICAgICAgICBkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHsKICAgICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgbnVsbCk7CiAgICAgIH0KCiAgICAgIHNldElzUmVuZGVyaW5nKHRydWUpOwogICAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzczsKICAgICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTsKICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpOwogICAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7CiAgICB9CgogICAgewogICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpOwogICAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuCgoKICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7CgogICAgewogICAgICAvLyBTdXBwb3J0IGZvciBtb2R1bGUgY29tcG9uZW50cyBpcyBkZXByZWNhdGVkIGFuZCBpcyByZW1vdmVkIGJlaGluZCBhIGZsYWcuCiAgICAgIC8vIFdoZXRoZXIgb3Igbm90IGl0IHdvdWxkIGNyYXNoIGxhdGVyLCB3ZSB3YW50IHRvIHNob3cgYSBnb29kIG1lc3NhZ2UgaW4gREVWIGZpcnN0LgogICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHsKICAgICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7CgogICAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0pIHsKICAgICAgICAgIGVycm9yKCdUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGJlIGEgZnVuY3Rpb24gY29tcG9uZW50IHRoYXQgcmV0dXJucyBhIGNsYXNzIGluc3RhbmNlLiAnICsgJ0NoYW5nZSAlcyB0byBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4gJyArICJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuICIgKyAiYCVzLnByb3RvdHlwZSA9IFJlYWN0LkNvbXBvbmVudC5wcm90b3R5cGVgLiBEb24ndCB1c2UgYW4gYXJyb3cgZnVuY3Rpb24gc2luY2UgaXQgIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSk7CgogICAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmICggLy8gUnVuIHRoZXNlIGNoZWNrcyBpbiBwcm9kdWN0aW9uIG9ubHkgaWYgdGhlIGZsYWcgaXMgb2ZmLgogICAgLy8gRXZlbnR1YWxseSB3ZSdsbCBkZWxldGUgdGhpcyBicmFuY2ggYWx0b2dldGhlci4KICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkgewogICAgICB7CiAgICAgICAgdmFyIF9jb21wb25lbnROYW1lMiA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJzsKCiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0pIHsKICAgICAgICAgIGVycm9yKCdUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGJlIGEgZnVuY3Rpb24gY29tcG9uZW50IHRoYXQgcmV0dXJucyBhIGNsYXNzIGluc3RhbmNlLiAnICsgJ0NoYW5nZSAlcyB0byBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4gJyArICJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuICIgKyAiYCVzLnByb3RvdHlwZSA9IFJlYWN0LkNvbXBvbmVudC5wcm90b3R5cGVgLiBEb24ndCB1c2UgYW4gYXJyb3cgZnVuY3Rpb24gc2luY2UgaXQgIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUyLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMik7CgogICAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTJdID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZQoKCiAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IENsYXNzQ29tcG9uZW50OyAvLyBUaHJvdyBvdXQgYW55IGhvb2tzIHRoYXQgd2VyZSB1c2VkLgoKICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7CiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy4KICAgICAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LgogICAgICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuCgogICAgICB2YXIgaGFzQ29udGV4dCA9IGZhbHNlOwoKICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHsKICAgICAgICBoYXNDb250ZXh0ID0gdHJ1ZTsKICAgICAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBoYXNDb250ZXh0ID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSB2YWx1ZS5zdGF0ZSAhPT0gbnVsbCAmJiB2YWx1ZS5zdGF0ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUuc3RhdGUgOiBudWxsOwogICAgICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpOwogICAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTsKICAgICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCByZW5kZXJMYW5lcyk7CiAgICAgIHJldHVybiBmaW5pc2hDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9jZWVkIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhpcyBpcyBhIGZ1bmN0aW9uIGNvbXBvbmVudAogICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBGdW5jdGlvbkNvbXBvbmVudDsKCiAgICAgIHsKCiAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgewogICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7CgogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTsKICAgICAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHsKICAgICAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTsKICAgICAgfQoKICAgICAgcmVjb25jaWxlQ2hpbGRyZW4obnVsbCwgd29ya0luUHJvZ3Jlc3MsIHZhbHVlLCByZW5kZXJMYW5lcyk7CgogICAgICB7CiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpOwogICAgICB9CgogICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCkgewogICAgewogICAgICBpZiAoQ29tcG9uZW50KSB7CiAgICAgICAgaWYgKENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcykgewogICAgICAgICAgZXJyb3IoJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb24gY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAod29ya0luUHJvZ3Jlc3MucmVmICE9PSBudWxsKSB7CiAgICAgICAgdmFyIGluZm8gPSAnJzsKICAgICAgICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTsKCiAgICAgICAgaWYgKG93bmVyTmFtZSkgewogICAgICAgICAgaW5mbyArPSAnXG5cbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJzsKICAgICAgICB9CgogICAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8ICcnOwogICAgICAgIHZhciBkZWJ1Z1NvdXJjZSA9IHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZTsKCiAgICAgICAgaWYgKGRlYnVnU291cmNlKSB7CiAgICAgICAgICB3YXJuaW5nS2V5ID0gZGVidWdTb3VyY2UuZmlsZU5hbWUgKyAnOicgKyBkZWJ1Z1NvdXJjZS5saW5lTnVtYmVyOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0pIHsKICAgICAgICAgIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmc1t3YXJuaW5nS2V5XSA9IHRydWU7CgogICAgICAgICAgZXJyb3IoJ0Z1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGJlIGdpdmVuIHJlZnMuICcgKyAnQXR0ZW1wdHMgdG8gYWNjZXNzIHRoaXMgcmVmIHdpbGwgZmFpbC4gJyArICdEaWQgeW91IG1lYW4gdG8gdXNlIFJlYWN0LmZvcndhcmRSZWYoKT8lcycsIGluZm8pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIF9jb21wb25lbnROYW1lMyA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8ICdVbmtub3duJzsKCiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lM10pIHsKICAgICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuJywgX2NvbXBvbmVudE5hbWUzKTsKCiAgICAgICAgICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lM10gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBDb21wb25lbnQuY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIENvbXBvbmVudC5jb250ZXh0VHlwZSAhPT0gbnVsbCkgewogICAgICAgIHZhciBfY29tcG9uZW50TmFtZTQgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7CgogICAgICAgIGlmICghZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W19jb21wb25lbnROYW1lNF0pIHsKICAgICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBjb250ZXh0VHlwZS4nLCBfY29tcG9uZW50TmFtZTQpOwoKICAgICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIHZhciBTVVNQRU5ERURfTUFSS0VSID0gewogICAgZGVoeWRyYXRlZDogbnVsbCwKICAgIHRyZWVDb250ZXh0OiBudWxsLAogICAgcmV0cnlMYW5lOiBOb0xhbmUKICB9OwoKICBmdW5jdGlvbiBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIHsKICAgIHJldHVybiB7CiAgICAgIGJhc2VMYW5lczogcmVuZGVyTGFuZXMsCiAgICAgIGNhY2hlUG9vbDogZ2V0U3VzcGVuZGVkQ2FjaGUoKSwKICAgICAgdHJhbnNpdGlvbnM6IG51bGwKICAgIH07CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpIHsKICAgIHZhciBjYWNoZVBvb2wgPSBudWxsOwoKICAgIHJldHVybiB7CiAgICAgIGJhc2VMYW5lczogbWVyZ2VMYW5lcyhwcmV2T2Zmc2NyZWVuU3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyksCiAgICAgIGNhY2hlUG9vbDogY2FjaGVQb29sLAogICAgICB0cmFuc2l0aW9uczogcHJldk9mZnNjcmVlblN0YXRlLnRyYW5zaXRpb25zCiAgICB9OwogIH0gLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIGlubGluZSB0aGlzIGJhY2sKCgogIGZ1bmN0aW9uIHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHsKICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrLCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgd2UgbmVlZCB0bwogICAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC4KICAgIC8vIEZvciBleGFtcGxlLCBTdXNwZW5zZUxpc3QgY29vcmRpbmF0ZXMgd2hlbiBuZXN0ZWQgY29udGVudCBhcHBlYXJzLgogICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHsKICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7CgogICAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkgewogICAgICAgIC8vIEN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIERvbid0IGhpZGUgaXQsIGV2ZW4gaWYgRm9yY2VTdXNwZW5zZUZhbGxiYWNrCiAgICAgICAgLy8gaXMgdHJ1ZS4gTW9yZSBwcmVjaXNlIG5hbWUgbWlnaHQgYmUgIkZvcmNlUmVtYWluU3VzcGVuc2VGYWxsYmFjayIuCiAgICAgICAgLy8gTm90ZTogVGhpcyBpcyBhIGZhY3RvcmluZyBzbWVsbC4gQ2FuJ3QgcmVtYWluIG9uIGEgZmFsbGJhY2sgaWYgdGhlcmUncwogICAgICAgIC8vIG5vIGZhbGxiYWNrIHRvIHJlbWFpbiBvbi4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gLy8gTm90IGN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIENvbnN1bHQgdGhlIFN1c3BlbnNlIGNvbnRleHQuCgoKICAgIHJldHVybiBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spOwogIH0KCiAgZnVuY3Rpb24gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpIHsKICAgIC8vIFRPRE86IFNob3VsZCBub3QgcmVtb3ZlIHJlbmRlciBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIGR1cmluZyB0aGlzIHJlbmRlcgogICAgcmV0dXJuIHJlbW92ZUxhbmVzKGN1cnJlbnQuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7CiAgICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBzdXNwZW5kLgoKICAgIHsKICAgICAgaWYgKHNob3VsZFN1c3BlbmQod29ya0luUHJvZ3Jlc3MpKSB7CiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsKICAgICAgfQogICAgfQoKICAgIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7CiAgICB2YXIgc2hvd0ZhbGxiYWNrID0gZmFsc2U7CiAgICB2YXIgZGlkU3VzcGVuZCA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzOwoKICAgIGlmIChkaWRTdXNwZW5kIHx8IHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50KSkgewogICAgICAvLyBTb21ldGhpbmcgaW4gdGhpcyBib3VuZGFyeSdzIHN1YnRyZWUgYWxyZWFkeSBzdXNwZW5kZWQuIFN3aXRjaCB0bwogICAgICAvLyByZW5kZXJpbmcgdGhlIGZhbGxiYWNrIGNoaWxkcmVuLgogICAgICBzaG93RmFsbGJhY2sgPSB0cnVlOwogICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+RGlkQ2FwdHVyZTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEF0dGVtcHRpbmcgdGhlIG1haW4gY29udGVudAogICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGwpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50IG9yIHRoaXMgYm91bmRhcnkgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgc3RhdGUuCiAgICAgICAgLy8gTWFyayB0aGlzIHN1YnRyZWUgY29udGV4dCBhcyBoYXZpbmcgYXQgbGVhc3Qgb25lIGludmlzaWJsZSBwYXJlbnQgdGhhdCBjb3VsZAogICAgICAgIC8vIGhhbmRsZSB0aGUgZmFsbGJhY2sgc3RhdGUuCiAgICAgICAgLy8gQXZvaWRlZCBib3VuZGFyaWVzIGFyZSBub3QgY29uc2lkZXJlZCBzaW5jZSB0aGV5IGNhbm5vdCBoYW5kbGUgcHJlZmVycmVkIGZhbGxiYWNrIHN0YXRlcy4KICAgICAgICB7CiAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpOwogICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gT0ssIHRoZSBuZXh0IHBhcnQgaXMgY29uZnVzaW5nLiBXZSdyZSBhYm91dCB0byByZWNvbmNpbGUgdGhlIFN1c3BlbnNlCiAgICAvLyBib3VuZGFyeSdzIGNoaWxkcmVuLiBUaGlzIGludm9sdmVzIHNvbWUgY3VzdG9tIHJlY29uY2lsaWF0aW9uIGxvZ2ljLiBUd28KICAgIC8vIG1haW4gcmVhc29ucyB0aGlzIGlzIHNvIGNvbXBsaWNhdGVkLgogICAgLy8KICAgIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZQogICAgLy8gcHJpbWFyeSB0cmVlIHdpbGwgY29tbWl0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSwgc28gd2hlbiB3ZSBkbyB0aGUKICAgIC8vIHNlY29uZCBwYXNzIHRvIHJlbmRlciB0aGUgZmFsbGJhY2ssIHdlIGRvIHNvbWUgZXhjZWVkaW5nbHksIHVoLCBjbGV2ZXIKICAgIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmQKICAgIC8vIGRlbGV0aW9ucyBmcm9tIGhpZGRlbiB0cmVlLiBJbiBDb25jdXJyZW50IE1vZGUsIGl0J3MgbXVjaCBzaW1wbGVyLAogICAgLy8gYmVjYXVzZSB3ZSBiYWlsb3V0IG9uIHRoZSBwcmltYXJ5IHRyZWUgY29tcGxldGVseSBhbmQgbGVhdmUgaXQgaW4gaXRzIG9sZAogICAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdAogICAgLy8gT2Zmc2NyZWVuIGRvZXNuJ3QgaGF2ZSB0aGUgZmlyc3QgcmVuZGVyIHBhc3MpLgogICAgLy8KICAgIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseQogICAgLy8gZGlmZmVyZW50IGxheW91dCwgd2hlcmUgdGhlIGNoaWxkIHBvaW50cyB0byBhIGRlaHlkcmF0ZWQgZnJhZ21lbnQsIHdoaWNoCiAgICAvLyBjb250YWlucyB0aGUgRE9NIHJlbmRlcmVkIGJ5IHRoZSBzZXJ2ZXIuCiAgICAvLwogICAgLy8gVGhpcmQsIGV2ZW4gaWYgeW91IHNldCBhbGwgdGhhdCBhc2lkZSwgU3VzcGVuc2UgaXMgbGlrZSBlcnJvciBib3VuZGFyaWVzIGluCiAgICAvLyB0aGF0IHdlIGZpcnN0IHdlIHRyeSB0byByZW5kZXIgb25lIHRyZWUsIGFuZCBpZiB0aGF0IGZhaWxzLCB3ZSByZW5kZXIgYWdhaW4KICAgIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFjawogICAgLy8gd2hpY2ggYnJhbmNoIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcuIElkZWFsbHkgd2Ugd291bGQgbW9kZWwgdGhpcyB1c2luZwogICAgLy8gYSBzdGFjay4KCiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkgewogICAgICAvLyBJbml0aWFsIG1vdW50CiAgICAgIC8vIFNwZWNpYWwgcGF0aCBmb3IgaHlkcmF0aW9uCiAgICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBoeWRyYXRpbmcsIHRyeSB0byBoeWRyYXRlIHRoaXMgYm91bmRhcnkuCiAgICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTsgLy8gVGhpcyBjb3VsZCd2ZSBiZWVuIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQuCgogICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7CgogICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkgewogICAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkOwoKICAgICAgICBpZiAoZGVoeWRyYXRlZCAhPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIG1vdW50RGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KHdvcmtJblByb2dyZXNzLCBkZWh5ZHJhdGVkKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBuZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuOwogICAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7CgogICAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7CiAgICAgICAgdmFyIGZhbGxiYWNrRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTsKICAgICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsKICAgICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTsKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjsKCiAgICAgICAgcmV0dXJuIGZhbGxiYWNrRnJhZ21lbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBUaGlzIGlzIGFuIHVwZGF0ZS4KICAgICAgLy8gU3BlY2lhbCBwYXRoIGZvciBoeWRyYXRpb24KICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTsKCiAgICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHsKICAgICAgICB2YXIgX2RlaHlkcmF0ZWQgPSBwcmV2U3RhdGUuZGVoeWRyYXRlZDsKCiAgICAgICAgaWYgKF9kZWh5ZHJhdGVkICE9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kLCBuZXh0UHJvcHMsIF9kZWh5ZHJhdGVkLCBwcmV2U3RhdGUsIHJlbmRlckxhbmVzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChzaG93RmFsbGJhY2spIHsKICAgICAgICB2YXIgX25leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrOwogICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjsKICAgICAgICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbiwgX25leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7CiAgICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsKICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN0YXRlID0gY3VycmVudC5jaGlsZC5tZW1vaXplZFN0YXRlOwogICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIubWVtb2l6ZWRTdGF0ZSA9IHByZXZPZmZzY3JlZW5TdGF0ZSA9PT0gbnVsbCA/IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykgOiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpOwoKICAgICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyLmNoaWxkTGFuZXMgPSBnZXRSZW1haW5pbmdXb3JrSW5QcmltYXJ5VHJlZShjdXJyZW50LCByZW5kZXJMYW5lcyk7CiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7CiAgICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4yID0gbmV4dFByb3BzLmNoaWxkcmVuOwoKICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MyA9IHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIHJlbmRlckxhbmVzKTsKCiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7CiAgICAgICAgcmV0dXJuIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDM7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHsKICAgIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTsKICAgIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHsKICAgICAgbW9kZTogJ3Zpc2libGUnLAogICAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuCiAgICB9OwogICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBtb2RlKTsKICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzOwogICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDsKICAgIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDsKICB9CgogIGZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7CiAgICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7CiAgICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkOwogICAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0gewogICAgICBtb2RlOiAnaGlkZGVuJywKICAgICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlbgogICAgfTsKICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDsKICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7CgogICAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCAhPT0gbnVsbCkgewogICAgICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5CiAgICAgIC8vIGNvbXBsZXRlZCwgZXZlbiB0aG91Z2ggaXQncyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuCiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDsKICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7CiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnBlbmRpbmdQcm9wcyA9IHByaW1hcnlDaGlsZFByb3BzOwoKICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpIHsKICAgICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlCiAgICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5CiAgICAgICAgLy8gbm90IG1lYXN1cmluZyBwYXJ0IG9mIHRoZSByZW5kZXIgcGhhc2UsIGJ1dCB0aGlzIG1ha2VzIGl0IG1hdGNoIHdoYXQgd2UKICAgICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuCiAgICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwOwogICAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmFjdHVhbFN0YXJ0VGltZSA9IC0xOwogICAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSAwOwogICAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSAwOwogICAgICB9CgogICAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7CiAgICB9IGVsc2UgewogICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSk7CiAgICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTsKICAgIH0KCiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzczsKICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzczsKICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7CiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50OwogICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDsKICB9CgogIGZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgcmVuZGVyTGFuZXMpIHsKICAgIC8vIFRoZSBwcm9wcyBhcmd1bWVudCB0byBgY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlCiAgICAvLyB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LgogICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihvZmZzY3JlZW5Qcm9wcywgbW9kZSwgTm9MYW5lcywgbnVsbCk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnQsIG9mZnNjcmVlblByb3BzKSB7CiAgICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZVdvcmtJblByb2dyZXNzYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlIHRoaXMKICAgIC8vIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LgogICAgcmV0dXJuIGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnQsIG9mZnNjcmVlblByb3BzKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7CiAgICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDsKICAgIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7CiAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwgewogICAgICBtb2RlOiAndmlzaWJsZScsCiAgICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW4KICAgIH0pOwoKICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7CiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmxhbmVzID0gcmVuZGVyTGFuZXM7CiAgICB9CgogICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7CiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gbnVsbDsKCiAgICBpZiAoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCAhPT0gbnVsbCkgewogICAgICAvLyBEZWxldGUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50CiAgICAgIHZhciBkZWxldGlvbnMgPSB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnM7CgogICAgICBpZiAoZGVsZXRpb25zID09PSBudWxsKSB7CiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gW2N1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnRdOwogICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENoaWxkRGVsZXRpb247CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGVsZXRpb25zLnB1c2goY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCk7CiAgICAgIH0KICAgIH0KCiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50OwogICAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50OwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7CiAgICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7CiAgICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDsKICAgIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7CiAgICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7CiAgICAgIG1vZGU6ICdoaWRkZW4nLAogICAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuCiAgICB9OwogICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50OwoKICAgIGlmICggLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseQogICAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4KICAgIChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUgJiYgLy8gTWFrZSBzdXJlIHdlJ3JlIG9uIHRoZSBzZWNvbmQgcGFzcywgaS5lLiB0aGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCB3YXMKICAgIC8vIGFscmVhZHkgY2xvbmVkLiBJbiBsZWdhY3kgbW9kZSwgdGhlIG9ubHkgY2FzZSB3aGVyZSB0aGlzIGlzbid0IHRydWUgaXMKICAgIC8vIHdoZW4gRGV2VG9vbHMgZm9yY2VzIHVzIHRvIGRpc3BsYXkgYSBmYWxsYmFjazsgd2Ugc2tpcCB0aGUgZmlyc3QgcmVuZGVyCiAgICAvLyBwYXNzIGVudGlyZWx5IGFuZCBnbyBzdHJhaWdodCB0byByZW5kZXJpbmcgdGhlIGZhbGxiYWNrLiAoSW4gQ29uY3VycmVudAogICAgLy8gTW9kZSwgU3VzcGVuc2VMaXN0IGNhbiBhbHNvIHRyaWdnZXIgdGhpcyBzY2VuYXJpbywgYnV0IHRoaXMgaXMgYSBsZWdhY3ktCiAgICAvLyBvbmx5IGNvZGVwYXRoLikKICAgIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQpIHsKICAgICAgdmFyIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsKICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBwcm9ncmVzc2VkUHJpbWFyeUZyYWdtZW50OwogICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lczsKICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7CgogICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgewogICAgICAgIC8vIFJlc2V0IHRoZSBkdXJhdGlvbnMgZnJvbSB0aGUgZmlyc3QgcGFzcyBzbyB0aGV5IGFyZW4ndCBpbmNsdWRlZCBpbiB0aGUKICAgICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHkKICAgICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZQogICAgICAgIC8vIGRvIGluIENvbmN1cnJlbnQgTW9kZS4KICAgICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7CiAgICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7CiAgICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uOwogICAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjsKICAgICAgfSAvLyBUaGUgZmFsbGJhY2sgZmliZXIgd2FzIGFkZGVkIGFzIGEgZGVsZXRpb24gZHVyaW5nIHRoZSBmaXJzdCBwYXNzLgogICAgICAvLyBIb3dldmVyLCBzaW5jZSB3ZSdyZSBnb2luZyB0byByZW1haW4gb24gdGhlIGZhbGxiYWNrLCB3ZSBubyBsb25nZXIgd2FudAogICAgICAvLyB0byBkZWxldGUgaXQuCgoKICAgICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHByaW1hcnlDaGlsZFByb3BzKTsgLy8gU2luY2Ugd2UncmUgcmV1c2luZyBhIGN1cnJlbnQgdHJlZSwgd2UgbmVlZCB0byByZXVzZSB0aGUgZmxhZ3MsIHRvby4KICAgICAgLy8gKFdlIGRvbid0IGRvIHRoaXMgaW4gbGVnYWN5IG1vZGUsIGJlY2F1c2UgaW4gbGVnYWN5IG1vZGUgd2UgZG9uJ3QgcmUtdXNlCiAgICAgIC8vIHRoZSBjdXJyZW50IHRyZWU7IHNlZSBwcmV2aW91cyBicmFuY2guKQoKICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7CiAgICB9CgogICAgdmFyIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDsKCiAgICBpZiAoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCAhPT0gbnVsbCkgewogICAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBmYWxsYmFja0NoaWxkcmVuKTsKICAgIH0gZWxzZSB7CiAgICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlIGJvdW5kYXJ5KSBhbHJlYWR5CiAgICAgIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuCgogICAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50OwogICAgfQoKICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzczsKICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzOwogICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDsKICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7CiAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50OwogIH0KCiAgZnVuY3Rpb24gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCByZWNvdmVyYWJsZUVycm9yKSB7CiAgICAvLyBGYWxsaW5nIGJhY2sgdG8gY2xpZW50IHJlbmRlcmluZy4gQmVjYXVzZSB0aGlzIGhhcyBwZXJmb3JtYW5jZQogICAgLy8gaW1wbGljYXRpb25zLCBpdCdzIGNvbnNpZGVyZWQgYSByZWNvdmVyYWJsZSBlcnJvciwgZXZlbiB0aG91Z2ggdGhlIHVzZXIKICAgIC8vIGxpa2VseSB3b24ndCBvYnNlcnZlIGFueXRoaW5nIHdyb25nIHdpdGggdGhlIFVJLgogICAgLy8KICAgIC8vIFRoZSBlcnJvciBpcyBwYXNzZWQgaW4gYXMgYW4gYXJndW1lbnQgdG8gZW5mb3JjZSB0aGF0IGV2ZXJ5IGNhbGxlciBwcm92aWRlCiAgICAvLyBhIGN1c3RvbSBtZXNzYWdlLCBvciBleHBsaWNpdGx5IG9wdCBvdXQgKGN1cnJlbnRseSB0aGUgb25seSBwYXRoIHRoYXQgb3B0cwogICAgLy8gb3V0IGlzIGxlZ2FjeSBtb2RlOyBldmVyeSBjb25jdXJyZW50IHBhdGggcHJvdmlkZXMgYW4gZXJyb3IpLgogICAgaWYgKHJlY292ZXJhYmxlRXJyb3IgIT09IG51bGwpIHsKICAgICAgcXVldWVIeWRyYXRpb25FcnJvcihyZWNvdmVyYWJsZUVycm9yKTsKICAgIH0gLy8gVGhpcyB3aWxsIGFkZCB0aGUgb2xkIGZpYmVyIHRvIHRoZSBkZWxldGlvbiBsaXN0CgoKICAgIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIFdlJ3JlIG5vdyBub3Qgc3VzcGVuZGVkIG5vciBkZWh5ZHJhdGVkLgoKICAgIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7CiAgICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuOwogICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTmVlZHMgYSBwbGFjZW1lbnQgZWZmZWN0IGJlY2F1c2UgdGhlIHBhcmVudCAodGhlIFN1c3BlbnNlIGJvdW5kYXJ5KSBhbHJlYWR5CiAgICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLgoKICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDsKICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsOwogICAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50OwogIH0KCiAgZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQWZ0ZXJSZXRyeVdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHsKICAgIHZhciBmaWJlck1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlOwogICAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0gewogICAgICBtb2RlOiAndmlzaWJsZScsCiAgICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW4KICAgIH07CiAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIocHJpbWFyeUNoaWxkUHJvcHMsIGZpYmVyTW9kZSk7CiAgICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgZmliZXJNb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZQogICAgLy8gYm91bmRhcnkpIGFscmVhZHkgbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci4KCiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50OwogICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7CiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7CiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZEZyYWdtZW50OwogICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDsKCiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkgewogICAgICAvLyBXZSB3aWxsIGhhdmUgZHJvcHBlZCB0aGUgZWZmZWN0IGxpc3Qgd2hpY2ggY29udGFpbnMgdGhlCiAgICAgIC8vIGRlbGV0aW9uLiBXZSBuZWVkIHRvIHJlY29uY2lsZSB0byBkZWxldGUgdGhlIGN1cnJlbnQgY2hpbGQuCiAgICAgIHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7CiAgICB9CgogICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDsKICB9CgogIGZ1bmN0aW9uIG1vdW50RGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCByZW5kZXJMYW5lcykgewogICAgLy8gRHVyaW5nIHRoZSBmaXJzdCBwYXNzLCB3ZSdsbCBiYWlsIG91dCBhbmQgbm90IGRyaWxsIGludG8gdGhlIGNoaWxkcmVuLgogICAgLy8gSW5zdGVhZCwgd2UnbGwgbGVhdmUgdGhlIGNvbnRlbnQgaW4gcGxhY2UgYW5kIHRyeSB0byBoeWRyYXRlIGl0IGxhdGVyLgogICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHsKICAgICAgewogICAgICAgIGVycm9yKCdDYW5ub3QgaHlkcmF0ZSBTdXNwZW5zZSBpbiBsZWdhY3kgbW9kZS4gU3dpdGNoIGZyb20gJyArICdSZWFjdERPTS5oeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lcikgdG8gJyArICdSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pJyArICcucmVuZGVyKGVsZW1lbnQpIG9yIHJlbW92ZSB0aGUgU3VzcGVuc2UgY29tcG9uZW50cyBmcm9tICcgKyAndGhlIHNlcnZlciByZW5kZXJlZCBjb21wb25lbnRzLicpOwogICAgICB9CgogICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKFN5bmNMYW5lKTsKICAgIH0gZWxzZSBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHsKICAgICAgLy8gVGhpcyBpcyBhIGNsaWVudC1vbmx5IGJvdW5kYXJ5LiBTaW5jZSB3ZSB3b24ndCBnZXQgYW55IGNvbnRlbnQgZnJvbSB0aGUgc2VydmVyCiAgICAgIC8vIGZvciB0aGlzLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHRoYXQgYXQgYSBoaWdoZXIgcHJpb3JpdHkgYmFzZWQgb24gd2hlbiBpdCB3b3VsZAogICAgICAvLyBoYXZlIHRpbWVkIG91dC4gSW4gdGhlb3J5IHdlIGNvdWxkIHJlbmRlciBpdCBpbiB0aGlzIHBhc3MgYnV0IGl0IHdvdWxkIGhhdmUgdGhlCiAgICAgIC8vIHdyb25nIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCBpdCBhbmQgd2lsbCBwcmV2ZW50IGh5ZHJhdGlvbiBvZiBwYXJlbnQgcGF0aC4KICAgICAgLy8gSW5zdGVhZCwgd2UnbGwgbGVhdmUgd29yayBsZWZ0IG9uIGl0IHRvIHJlbmRlciBpdCBpbiBhIHNlcGFyYXRlIGNvbW1pdC4KICAgICAgLy8gVE9ETyBUaGlzIHRpbWUgc2hvdWxkIGJlIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBzZXJ2ZXIgcmVuZGVyZWQgcmVzcG9uc2UgdGhhdCBpcwogICAgICAvLyBhIHBhcmVudCB0byB0aGlzIGJvdW5kYXJ5IHdhcyBkaXNwbGF5ZWQuIEhvd2V2ZXIsIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBoYXZlCiAgICAgIC8vIGEgcHJvdG9jb2wgdG8gdHJhbnNmZXIgdGhhdCB0aW1lLCB3ZSdsbCBqdXN0IGVzdGltYXRlIGl0IGJ5IHVzaW5nIHRoZSBjdXJyZW50CiAgICAgIC8vIHRpbWUuIFRoaXMgd2lsbCBtZWFuIHRoYXQgU3VzcGVuc2UgdGltZW91dHMgYXJlIHNsaWdodGx5IHNoaWZ0ZWQgdG8gbGF0ZXIgdGhhbgogICAgICAvLyB0aGV5IHNob3VsZCBiZS4KICAgICAgLy8gU2NoZWR1bGUgYSBub3JtYWwgcHJpIHVwZGF0ZSB0byByZW5kZXIgdGhpcyBjb250ZW50LgogICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhbmVUb0xhbmVzKERlZmF1bHRIeWRyYXRpb25MYW5lKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIFdlJ2xsIGNvbnRpbnVlIGh5ZHJhdGluZyB0aGUgcmVzdCBhdCBvZmZzY3JlZW4gcHJpb3JpdHkgc2luY2Ugd2UnbGwgYWxyZWFkeQogICAgICAvLyBiZSBzaG93aW5nIHRoZSByaWdodCBjb250ZW50IGNvbWluZyBmcm9tIHRoZSBzZXJ2ZXIsIGl0IGlzIG5vIHJ1c2guCiAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGRpZFN1c3BlbmQsIG5leHRQcm9wcywgc3VzcGVuc2VJbnN0YW5jZSwgc3VzcGVuc2VTdGF0ZSwgcmVuZGVyTGFuZXMpIHsKICAgIGlmICghZGlkU3VzcGVuZCkgewogICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCByZW5kZXIgcGFzcy4gQXR0ZW1wdCB0byBoeWRyYXRlLgogICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgaHlkcmF0aW5nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgcGFzcywKICAgICAgLy8gYnV0IGFmdGVyIHdlJ3ZlIGFscmVhZHkgY29tbWl0dGVkIG9uY2UuCiAgICAgIHdhcm5JZkh5ZHJhdGluZygpOwoKICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHsKICAgICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCAvLyBUT0RPOiBXaGVuIHdlIGRlbGV0ZSBsZWdhY3kgbW9kZSwgd2Ugc2hvdWxkIG1ha2UgdGhpcyBlcnJvciBhcmd1bWVudAogICAgICAgIC8vIHJlcXVpcmVkIOKAlCBldmVyeSBjb25jdXJyZW50IG1vZGUgcGF0aCB0aGF0IGNhdXNlcyBoeWRyYXRpb24gdG8KICAgICAgICAvLyBkZS1vcHQgdG8gY2xpZW50IHJlbmRlcmluZyBzaG91bGQgaGF2ZSBhbiBlcnJvciBtZXNzYWdlLgogICAgICAgIG51bGwpOwogICAgICB9CgogICAgICBpZiAoaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soc3VzcGVuc2VJbnN0YW5jZSkpIHsKICAgICAgICAvLyBUaGlzIGJvdW5kYXJ5IGlzIGluIGEgcGVybWFuZW50IGZhbGxiYWNrIHN0YXRlLiBJbiB0aGlzIGNhc2UsIHdlJ2xsIG5ldmVyCiAgICAgICAgLy8gZ2V0IGFuIHVwZGF0ZSBhbmQgd2UnbGwgbmV2ZXIgYmUgYWJsZSB0byBoeWRyYXRlIHRoZSBmaW5hbCBjb250ZW50LiBMZXQncyBqdXN0IHRyeSB0aGUKICAgICAgICAvLyBjbGllbnQgc2lkZSByZW5kZXIgaW5zdGVhZC4KICAgICAgICB2YXIgZGlnZXN0LCBtZXNzYWdlLCBzdGFjazsKCiAgICAgICAgewogICAgICAgICAgdmFyIF9nZXRTdXNwZW5zZUluc3RhbmNlRiA9IGdldFN1c3BlbnNlSW5zdGFuY2VGYWxsYmFja0Vycm9yRGV0YWlscyhzdXNwZW5zZUluc3RhbmNlKTsKCiAgICAgICAgICBkaWdlc3QgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYuZGlnZXN0OwogICAgICAgICAgbWVzc2FnZSA9IF9nZXRTdXNwZW5zZUluc3RhbmNlRi5tZXNzYWdlOwogICAgICAgICAgc3RhY2sgPSBfZ2V0U3VzcGVuc2VJbnN0YW5jZUYuc3RhY2s7CiAgICAgICAgfQoKICAgICAgICB2YXIgZXJyb3I7CgogICAgICAgIGlmIChtZXNzYWdlKSB7CiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2RlcwogICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKCdUaGUgc2VydmVyIGNvdWxkIG5vdCBmaW5pc2ggdGhpcyBTdXNwZW5zZSBib3VuZGFyeSwgbGlrZWx5ICcgKyAnZHVlIHRvIGFuIGVycm9yIGR1cmluZyBzZXJ2ZXIgcmVuZGVyaW5nLiBTd2l0Y2hlZCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgY2FwdHVyZWRWYWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUoZXJyb3IsIGRpZ2VzdCwgc3RhY2spOwogICAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIGNhcHR1cmVkVmFsdWUpOwogICAgICB9CiAgICAgIC8vIGFueSBjb250ZXh0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHRyZWF0IGlzIGFzIGlmIHRoZSBpbnB1dCBtaWdodCBoYXZlIGNoYW5nZWQuCgoKICAgICAgdmFyIGhhc0NvbnRleHRDaGFuZ2VkID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgY3VycmVudC5jaGlsZExhbmVzKTsKCiAgICAgIGlmIChkaWRSZWNlaXZlVXBkYXRlIHx8IGhhc0NvbnRleHRDaGFuZ2VkKSB7CiAgICAgICAgLy8gVGhpcyBib3VuZGFyeSBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgZmlyc3QgcmVuZGVyLiBUaGlzIG1lYW5zIHRoYXQgd2UgYXJlIG5vdyB1bmFibGUgdG8KICAgICAgICAvLyBoeWRyYXRlIGl0LiBXZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIGh5ZHJhdGUgaXQgdXNpbmcgYSBoaWdoZXIgcHJpb3JpdHkgbGFuZS4KICAgICAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpOwoKICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkgewogICAgICAgICAgdmFyIGF0dGVtcHRIeWRyYXRpb25BdExhbmUgPSBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uKHJvb3QsIHJlbmRlckxhbmVzKTsKCiAgICAgICAgICBpZiAoYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSAhPT0gTm9MYW5lICYmIGF0dGVtcHRIeWRyYXRpb25BdExhbmUgIT09IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lKSB7CiAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbXV0YXRpbmcgc2luY2UgdGhpcyByZW5kZXIgd2lsbCBnZXQgaW50ZXJydXB0ZWQuIFRoaXMKICAgICAgICAgICAgLy8gaXMgb25lIG9mIHRoZSB2ZXJ5IHJhcmUgdGltZXMgd2hlcmUgd2UgbXV0YXRlIHRoZSBjdXJyZW50IHRyZWUKICAgICAgICAgICAgLy8gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuCiAgICAgICAgICAgIHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lID0gYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZTsgLy8gVE9ETzogSWRlYWxseSB0aGlzIHdvdWxkIGluaGVyaXQgdGhlIGV2ZW50IHRpbWUgb2YgdGhlIGN1cnJlbnQgcmVuZGVyCgogICAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7CiAgICAgICAgICAgIGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lKTsKICAgICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGN1cnJlbnQsIGF0dGVtcHRIeWRyYXRpb25BdExhbmUsIGV2ZW50VGltZSk7CiAgICAgICAgICB9CiAgICAgICAgfSAvLyBJZiB3ZSBoYXZlIHNjaGVkdWxlZCBoaWdoZXIgcHJpIHdvcmsgYWJvdmUsIHRoaXMgd2lsbCBwcm9iYWJseSBqdXN0IGFib3J0IHRoZSByZW5kZXIKICAgICAgICAvLyBzaW5jZSB3ZSBub3cgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgd29yaywgYnV0IGluIGNhc2UgaXQgZG9lc24ndCwgd2UgbmVlZCB0byBwcmVwYXJlIHRvCiAgICAgICAgLy8gcmVuZGVyIHNvbWV0aGluZywgaWYgd2UgdGltZSBvdXQuIEV2ZW4gaWYgdGhhdCByZXF1aXJlcyB1cyB0byBkZWxldGUgZXZlcnl0aGluZyBhbmQKICAgICAgICAvLyBza2lwIGh5ZHJhdGlvbi4KICAgICAgICAvLyBEZWxheSBoYXZpbmcgdG8gZG8gdGhpcyBhcyBsb25nIGFzIHRoZSBzdXNwZW5zZSB0aW1lb3V0IGFsbG93cyB1cy4KCgogICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTsKCiAgICAgICAgdmFyIF9jYXB0dXJlZFZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShuZXcgRXJyb3IoJ1RoaXMgU3VzcGVuc2UgYm91bmRhcnkgcmVjZWl2ZWQgYW4gdXBkYXRlIGJlZm9yZSBpdCBmaW5pc2hlZCAnICsgJ2h5ZHJhdGluZy4gVGhpcyBjYXVzZWQgdGhlIGJvdW5kYXJ5IHRvIHN3aXRjaCB0byBjbGllbnQgcmVuZGVyaW5nLiAnICsgJ1RoZSB1c3VhbCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gd3JhcCB0aGUgb3JpZ2luYWwgdXBkYXRlICcgKyAnaW4gc3RhcnRUcmFuc2l0aW9uLicpKTsKCiAgICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgX2NhcHR1cmVkVmFsdWUpOwogICAgICB9IGVsc2UgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoc3VzcGVuc2VJbnN0YW5jZSkpIHsKICAgICAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyBzdGlsbCBwZW5kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIsIHNvIHdlIGNhbid0IGh5ZHJhdGUgaXRzCiAgICAgICAgLy8gY29udGVudC4gV2UgdHJlYXQgaXQgYXMgaWYgdGhpcyBjb21wb25lbnQgc3VzcGVuZGVkIGl0c2VsZi4gSXQgbWlnaHQgc2VlbSBhcyBpZgogICAgICAgIC8vIHdlIGNvdWxkIGp1c3QgdHJ5IHRvIHJlbmRlciBpdCBjbGllbnQtc2lkZSBpbnN0ZWFkLiBIb3dldmVyLCB0aGlzIHdpbGwgcGVyZm9ybSBhCiAgICAgICAgLy8gbG90IG9mIHVubmVjZXNzYXJ5IHdvcmsgYW5kIGlzIHVubGlrZWx5IHRvIGNvbXBsZXRlIHNpbmNlIGl0IG9mdGVuIHdpbGwgc3VzcGVuZAogICAgICAgIC8vIG9uIG1pc3NpbmcgZGF0YSBhbnl3YXkuIEFkZGl0aW9uYWxseSwgdGhlIHNlcnZlciBtaWdodCBiZSBhYmxlIHRvIHJlbmRlciBtb3JlCiAgICAgICAgLy8gdGhhbiB3ZSBjYW4gb24gdGhlIGNsaWVudCB5ZXQuIEluIHRoYXQgY2FzZSB3ZSdkIGVuZCB1cCB3aXRoIG1vcmUgZmFsbGJhY2sgc3RhdGVzCiAgICAgICAgLy8gb24gdGhlIGNsaWVudCB0aGFuIGlmIHdlIGp1c3QgbGVhdmUgaXQgYWxvbmUuIElmIHRoZSBzZXJ2ZXIgdGltZXMgb3V0IG9yIGVycm9ycwogICAgICAgIC8vIHRoZXNlIHNob3VsZCB1cGRhdGUgdGhpcyBib3VuZGFyeSB0byB0aGUgcGVybWFuZW50IEZhbGxiYWNrIHN0YXRlIGluc3RlYWQuCiAgICAgICAgLy8gTWFyayBpdCBhcyBoYXZpbmcgY2FwdHVyZWQgKGkuZS4gc3VzcGVuZGVkKS4KICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBMZWF2ZSB0aGUgY2hpbGQgaW4gcGxhY2UuIEkuZS4gdGhlIGRlaHlkcmF0ZWQgZnJhZ21lbnQuCgogICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gUmVnaXN0ZXIgYSBjYWxsYmFjayB0byByZXRyeSB0aGlzIGJvdW5kYXJ5IG9uY2UgdGhlIHNlcnZlciBoYXMgc2VudCB0aGUgcmVzdWx0LgoKICAgICAgICB2YXIgcmV0cnkgPSByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5LmJpbmQobnVsbCwgY3VycmVudCk7CiAgICAgICAgcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoc3VzcGVuc2VJbnN0YW5jZSwgcmV0cnkpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGF0dGVtcHQuCiAgICAgICAgcmVlbnRlckh5ZHJhdGlvblN0YXRlRnJvbURlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCBzdXNwZW5zZVN0YXRlLnRyZWVDb250ZXh0KTsKICAgICAgICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuOwogICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbik7IC8vIE1hcmsgdGhlIGNoaWxkcmVuIGFzIGh5ZHJhdGluZy4gVGhpcyBpcyBhIGZhc3QgcGF0aCB0byBrbm93IHdoZXRoZXIgdGhpcwogICAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGQKICAgICAgICAvLyBub2RlIGhhcyBmdWxseSBtb3VudGVkIHlldCwgYW5kIGZvciBzY2hlZHVsaW5nIGV2ZW50IHJlcGxheWluZy4KICAgICAgICAvLyBDb25jZXB0dWFsbHkgdGhpcyBpcyBzaW1pbGFyIHRvIFBsYWNlbWVudCBpbiB0aGF0IGEgbmV3IHN1YnRyZWUgaXMKICAgICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET00KICAgICAgICAvLyBtdXRhdGlvbnMgYmVjYXVzZSBpdCBhbHJlYWR5IGV4aXN0cy4KCiAgICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gSHlkcmF0aW5nOwogICAgICAgIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHJlbmRlciBwYXNzLiBXZSBhbHJlYWR5IGF0dGVtcHRlZCB0byBoeWRyYXRlZCwgYnV0CiAgICAgIC8vIHNvbWV0aGluZyBlaXRoZXIgc3VzcGVuZGVkIG9yIGVycm9yZWQuCiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7CiAgICAgICAgLy8gU29tZXRoaW5nIGVycm9yZWQgZHVyaW5nIGh5ZHJhdGlvbi4gVHJ5IGFnYWluIHdpdGhvdXQgaHlkcmF0aW5nLgogICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5Gb3JjZUNsaWVudFJlbmRlcjsKCiAgICAgICAgdmFyIF9jYXB0dXJlZFZhbHVlMiA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUobmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nIHRoaXMgU3VzcGVuc2UgYm91bmRhcnkuICcgKyAnU3dpdGNoZWQgdG8gY2xpZW50IHJlbmRlcmluZy4nKSk7CgogICAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIF9jYXB0dXJlZFZhbHVlMik7CiAgICAgIH0gZWxzZSBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkgewogICAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQgYW5kIHdlIHNob3VsZCBzdGlsbCBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuCiAgICAgICAgLy8gTGVhdmUgdGhlIGV4aXN0aW5nIGNoaWxkIGluIHBsYWNlLgogICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhlIGRlaHlkcmF0ZWQgY29tcGxldGlvbiBwYXNzIGV4cGVjdHMgdGhpcyBmbGFnIHRvIGJlIHRoZXJlCiAgICAgICAgLy8gYnV0IHRoZSBub3JtYWwgc3VzcGVuc2UgcGFzcyBkb2Vzbid0LgoKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFN1c3BlbmRlZCBidXQgd2Ugc2hvdWxkIG5vIGxvbmdlciBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuCiAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG5vdyBoYXZlIHRvIHJlbmRlciB0aGUgZmFsbGJhY2suCiAgICAgICAgdmFyIG5leHRQcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47CiAgICAgICAgdmFyIG5leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrOwogICAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tBZnRlclJldHJ5V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgbmV4dEZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKTsKICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NCA9IHdvcmtJblByb2dyZXNzLmNoaWxkOwogICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7CiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7CiAgICAgICAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGZpYmVyLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KSB7CiAgICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTsKICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7CgogICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkgewogICAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpOwogICAgfQoKICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgcHJvcGFnYXRpb25Sb290KTsKICB9CgogIGZ1bmN0aW9uIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgZmlyc3RDaGlsZCwgcmVuZGVyTGFuZXMpIHsKICAgIC8vIE1hcmsgYW55IFN1c3BlbnNlIGJvdW5kYXJpZXMgd2l0aCBmYWxsYmFja3MgYXMgaGF2aW5nIHdvcmsgdG8gZG8uCiAgICAvLyBJZiB0aGV5IHdlcmUgcHJldmlvdXNseSBmb3JjZWQgaW50byBmYWxsYmFja3MsIHRoZXkgbWF5IG5vdyBiZSBhYmxlCiAgICAvLyB0byB1bmJsb2NrLgogICAgdmFyIG5vZGUgPSBmaXJzdENoaWxkOwoKICAgIHdoaWxlIChub2RlICE9PSBudWxsKSB7CiAgICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHsKICAgICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7CgogICAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkgewogICAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQpIHsKICAgICAgICAvLyBJZiB0aGUgdGFpbCBpcyBoaWRkZW4gdGhlcmUgbWlnaHQgbm90IGJlIGFuIFN1c3BlbnNlIGJvdW5kYXJpZXMKICAgICAgICAvLyB0byBzY2hlZHVsZSB3b3JrIG9uLiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBvbiB0aGUKICAgICAgICAvLyBsaXN0IGl0c2VsZi4KICAgICAgICAvLyBXZSBkb24ndCBoYXZlIHRvIHRyYXZlcnNlIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUgbGlzdCBzaW5jZQogICAgICAgIC8vIHRoZSBsaXN0IHdpbGwgcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugd2hlbiBpdCByZXJlbmRlcnMuCiAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7CiAgICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkgewogICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTsKICAgICAgICBub2RlID0gbm9kZS5jaGlsZDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgaWYgKG5vZGUgPT09IHdvcmtJblByb2dyZXNzKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7CiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuOwogICAgICB9CgogICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47CiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmaW5kTGFzdENvbnRlbnRSb3coZmlyc3RDaGlsZCkgewogICAgLy8gVGhpcyBpcyBnb2luZyB0byBmaW5kIHRoZSBsYXN0IHJvdyBhbW9uZyB0aGVzZSBjaGlsZHJlbiB0aGF0IGlzIGFscmVhZHkKICAgIC8vIHNob3dpbmcgY29udGVudCBvbiB0aGUgc2NyZWVuLCBhcyBvcHBvc2VkIHRvIGJlaW5nIGluIGZhbGxiYWNrIHN0YXRlIG9yCiAgICAvLyBuZXcuIElmIGEgcm93IGhhcyBtdWx0aXBsZSBTdXNwZW5zZSBib3VuZGFyaWVzLCBhbnkgb2YgdGhlbSBiZWluZyBpbiB0aGUKICAgIC8vIGZhbGxiYWNrIHN0YXRlLCBjb3VudHMgYXMgdGhlIHdob2xlIHJvdyBiZWluZyBpbiBhIGZhbGxiYWNrIHN0YXRlLgogICAgLy8gTm90ZSB0aGF0IHRoZSAicm93cyIgd2lsbCBiZSB3b3JrSW5Qcm9ncmVzcywgYnV0IGFueSBuZXN0ZWQgY2hpbGRyZW4KICAgIC8vIHdpbGwgc3RpbGwgYmUgY3VycmVudCBzaW5jZSB3ZSBoYXZlbid0IHJlbmRlcmVkIHRoZW0geWV0LiBUaGUgbW91bnRlZAogICAgLy8gb3JkZXIgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgbmV3IG9yZGVyLiBXZSB1c2UgdGhlIG5ldyBvcmRlci4KICAgIHZhciByb3cgPSBmaXJzdENoaWxkOwogICAgdmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDsKCiAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7CiAgICAgIHZhciBjdXJyZW50Um93ID0gcm93LmFsdGVybmF0ZTsgLy8gTmV3IHJvd3MgY2FuJ3QgYmUgY29udGVudCByb3dzLgoKICAgICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7CiAgICAgICAgbGFzdENvbnRlbnRSb3cgPSByb3c7CiAgICAgIH0KCiAgICAgIHJvdyA9IHJvdy5zaWJsaW5nOwogICAgfQoKICAgIHJldHVybiBsYXN0Q29udGVudFJvdzsKICB9CgogIGZ1bmN0aW9uIHZhbGlkYXRlUmV2ZWFsT3JkZXIocmV2ZWFsT3JkZXIpIHsKICAgIHsKICAgICAgaWYgKHJldmVhbE9yZGVyICE9PSB1bmRlZmluZWQgJiYgcmV2ZWFsT3JkZXIgIT09ICdmb3J3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICdiYWNrd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAndG9nZXRoZXInICYmICFkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0pIHsKICAgICAgICBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltyZXZlYWxPcmRlcl0gPSB0cnVlOwoKICAgICAgICBpZiAodHlwZW9mIHJldmVhbE9yZGVyID09PSAnc3RyaW5nJykgewogICAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgICAgIGNhc2UgJ3RvZ2V0aGVyJzoKICAgICAgICAgICAgY2FzZSAnZm9yd2FyZHMnOgogICAgICAgICAgICBjYXNlICdiYWNrd2FyZHMnOgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yKCciJXMiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1VzZSBsb3dlcmNhc2UgIiVzIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTsKCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBjYXNlICdmb3J3YXJkJzoKICAgICAgICAgICAgY2FzZSAnYmFja3dhcmQnOgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGVycm9yKCciJXMiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1JlYWN0IHVzZXMgdGhlIC1zIHN1ZmZpeCBpbiB0aGUgc3BlbGxpbmcuIFVzZSAiJXNzIiBpbnN0ZWFkLicsIHJldmVhbE9yZGVyLCByZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKTsKCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIGVycm9yKCciJXMiIGlzIG5vdCBhIHN1cHBvcnRlZCByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiAidG9nZXRoZXIiLCAiZm9yd2FyZHMiIG9yICJiYWNrd2FyZHMiPycsIHJldmVhbE9yZGVyKTsKCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVycm9yKCclcyBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuICJ0b2dldGhlciIsICJmb3J3YXJkcyIgb3IgImJhY2t3YXJkcyI/JywgcmV2ZWFsT3JkZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpIHsKICAgIHsKICAgICAgaWYgKHRhaWxNb2RlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSkgewogICAgICAgIGlmICh0YWlsTW9kZSAhPT0gJ2NvbGxhcHNlZCcgJiYgdGFpbE1vZGUgIT09ICdoaWRkZW4nKSB7CiAgICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlOwoKICAgICAgICAgIGVycm9yKCciJXMiIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgdGFpbCBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ0RpZCB5b3UgbWVhbiAiY29sbGFwc2VkIiBvciAiaGlkZGVuIj8nLCB0YWlsTW9kZSk7CiAgICAgICAgfSBlbHNlIGlmIChyZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycpIHsKICAgICAgICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3RhaWxNb2RlXSA9IHRydWU7CgogICAgICAgICAgZXJyb3IoJzxTdXNwZW5zZUxpc3QgdGFpbD0iJXMiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgJyArICciZm9yd2FyZHMiIG9yICJiYWNrd2FyZHMiLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBzcGVjaWZ5IHJldmVhbE9yZGVyPSJmb3J3YXJkcyI/JywgdGFpbE1vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZFNsb3QsIGluZGV4KSB7CiAgICB7CiAgICAgIHZhciBpc0FuQXJyYXkgPSBpc0FycmF5KGNoaWxkU2xvdCk7CiAgICAgIHZhciBpc0l0ZXJhYmxlID0gIWlzQW5BcnJheSAmJiB0eXBlb2YgZ2V0SXRlcmF0b3JGbihjaGlsZFNsb3QpID09PSAnZnVuY3Rpb24nOwoKICAgICAgaWYgKGlzQW5BcnJheSB8fCBpc0l0ZXJhYmxlKSB7CiAgICAgICAgdmFyIHR5cGUgPSBpc0FuQXJyYXkgPyAnYXJyYXknIDogJ2l0ZXJhYmxlJzsKCiAgICAgICAgZXJyb3IoJ0EgbmVzdGVkICVzIHdhcyBwYXNzZWQgdG8gcm93ICMlcyBpbiA8U3VzcGVuc2VMaXN0IC8+LiBXcmFwIGl0IGluICcgKyAnYW4gYWRkaXRpb25hbCBTdXNwZW5zZUxpc3QgdG8gY29uZmlndXJlIGl0cyByZXZlYWxPcmRlcjogJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj4gLi4uICcgKyAnPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+eyVzfTwvU3VzcGVuc2VMaXN0PiAuLi4gJyArICc8L1N1c3BlbnNlTGlzdD4nLCB0eXBlLCBpbmRleCwgdHlwZSk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihjaGlsZHJlbiwgcmV2ZWFsT3JkZXIpIHsKICAgIHsKICAgICAgaWYgKChyZXZlYWxPcmRlciA9PT0gJ2ZvcndhcmRzJyB8fCByZXZlYWxPcmRlciA9PT0gJ2JhY2t3YXJkcycpICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IGZhbHNlKSB7CiAgICAgICAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZHJlbltpXSwgaSkpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTsKCiAgICAgICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgdmFyIGNoaWxkcmVuSXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pOwoKICAgICAgICAgICAgaWYgKGNoaWxkcmVuSXRlcmF0b3IpIHsKICAgICAgICAgICAgICB2YXIgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgIHZhciBfaSA9IDA7CgogICAgICAgICAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCkpIHsKICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIF9pKys7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlcnJvcignQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPSIlcyIgLz4uICcgKyAnVGhpcyBpcyBub3QgdXNlZnVsIHNpbmNlIGl0IG5lZWRzIG11bHRpcGxlIHJvd3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHBhc3MgbXVsdGlwbGUgY2hpbGRyZW4gb3IgYW4gYXJyYXk/JywgcmV2ZWFsT3JkZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBpc0JhY2t3YXJkcywgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKSB7CiAgICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlOwoKICAgIGlmIChyZW5kZXJTdGF0ZSA9PT0gbnVsbCkgewogICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gewogICAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcywKICAgICAgICByZW5kZXJpbmc6IG51bGwsCiAgICAgICAgcmVuZGVyaW5nU3RhcnRUaW1lOiAwLAogICAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LAogICAgICAgIHRhaWw6IHRhaWwsCiAgICAgICAgdGFpbE1vZGU6IHRhaWxNb2RlCiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICAvLyBXZSBjYW4gcmV1c2UgdGhlIGV4aXN0aW5nIG9iamVjdCBmcm9tIHByZXZpb3VzIHJlbmRlcnMuCiAgICAgIHJlbmRlclN0YXRlLmlzQmFja3dhcmRzID0gaXNCYWNrd2FyZHM7CiAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7CiAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IDA7CiAgICAgIHJlbmRlclN0YXRlLmxhc3QgPSBsYXN0Q29udGVudFJvdzsKICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IHRhaWw7CiAgICAgIHJlbmRlclN0YXRlLnRhaWxNb2RlID0gdGFpbE1vZGU7CiAgICB9CiAgfSAvLyBUaGlzIGNhbiBlbmQgdXAgcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50IG11bHRpcGxlIHBhc3Nlcy4KICAvLyBUaGUgZmlyc3QgcGFzcyBzcGxpdHMgdGhlIGNoaWxkcmVuIGZpYmVycyBpbnRvIHR3byBzZXRzLiBBIGhlYWQgYW5kIHRhaWwuCiAgLy8gV2UgZmlyc3QgcmVuZGVyIHRoZSBoZWFkLiBJZiBhbnl0aGluZyBpcyBpbiBmYWxsYmFjayBzdGF0ZSwgd2UgZG8gYW5vdGhlcgogIC8vIHBhc3MgdGhyb3VnaCBiZWdpbldvcmsgdG8gcmVyZW5kZXIgYWxsIGNoaWxkcmVuIChpbmNsdWRpbmcgdGhlIHRhaWwpIHdpdGgKICAvLyB0aGUgZm9yY2Ugc3VzcGVuZCBjb250ZXh0LiBJZiB0aGUgZmlyc3QgcmVuZGVyIGRpZG4ndCBoYXZlIGFueXRoaW5nIGluCiAgLy8gaW4gZmFsbGJhY2sgc3RhdGUuIFRoZW4gd2UgcmVuZGVyIGVhY2ggcm93IGluIHRoZSB0YWlsIG9uZS1ieS1vbmUuCiAgLy8gVGhhdCBoYXBwZW5zIGluIHRoZSBjb21wbGV0ZVdvcmsgcGhhc2Ugd2l0aG91dCBnb2luZyBiYWNrIHRvIGJlZ2luV29yay4KCgogIGZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHsKICAgIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7CiAgICB2YXIgcmV2ZWFsT3JkZXIgPSBuZXh0UHJvcHMucmV2ZWFsT3JkZXI7CiAgICB2YXIgdGFpbE1vZGUgPSBuZXh0UHJvcHMudGFpbDsKICAgIHZhciBuZXdDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjsKICAgIHZhbGlkYXRlUmV2ZWFsT3JkZXIocmV2ZWFsT3JkZXIpOwogICAgdmFsaWRhdGVUYWlsT3B0aW9ucyh0YWlsTW9kZSwgcmV2ZWFsT3JkZXIpOwogICAgdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihuZXdDaGlsZHJlbiwgcmV2ZWFsT3JkZXIpOwogICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7CiAgICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50OwogICAgdmFyIHNob3VsZEZvcmNlRmFsbGJhY2sgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spOwoKICAgIGlmIChzaG91bGRGb3JjZUZhbGxiYWNrKSB7CiAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spOwogICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGRpZFN1c3BlbmRCZWZvcmUgPSBjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7CgogICAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkgewogICAgICAgIC8vIElmIHdlIHByZXZpb3VzbHkgZm9yY2VkIGEgZmFsbGJhY2ssIHdlIG5lZWQgdG8gc2NoZWR1bGUgd29yawogICAgICAgIC8vIG9uIGFueSBuZXN0ZWQgYm91bmRhcmllcyB0byBsZXQgdGhlbSBrbm93IHRvIHRyeSB0byByZW5kZXIKICAgICAgICAvLyBhZ2Fpbi4gVGhpcyBpcyB0aGUgc2FtZSBhcyBjb250ZXh0IHVwZGF0aW5nLgogICAgICAgIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MuY2hpbGQsIHJlbmRlckxhbmVzKTsKICAgICAgfQoKICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTsKICAgIH0KCiAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOwoKICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7CiAgICAgIC8vIEluIGxlZ2FjeSBtb2RlLCBTdXNwZW5zZUxpc3QgZG9lc24ndCB3b3JrIHNvIHdlIGp1c3QKICAgICAgLy8gdXNlIG1ha2UgaXQgYSBub29wIGJ5IHRyZWF0aW5nIGl0IGFzIHRoZSBkZWZhdWx0IHJldmVhbE9yZGVyLgogICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIpIHsKICAgICAgICBjYXNlICdmb3J3YXJkcyc6CiAgICAgICAgICB7CiAgICAgICAgICAgIHZhciBsYXN0Q29udGVudFJvdyA9IGZpbmRMYXN0Q29udGVudFJvdyh3b3JrSW5Qcm9ncmVzcy5jaGlsZCk7CiAgICAgICAgICAgIHZhciB0YWlsOwoKICAgICAgICAgICAgaWYgKGxhc3RDb250ZW50Um93ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgLy8gVGhlIHdob2xlIGxpc3QgaXMgcGFydCBvZiB0aGUgdGFpbC4KICAgICAgICAgICAgICAvLyBUT0RPOiBXZSBjb3VsZCBmYXN0IHBhdGggYnkganVzdCByZW5kZXJpbmcgdGhlIHRhaWwgbm93LgogICAgICAgICAgICAgIHRhaWwgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsKICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgdGFpbCByb3dzIGFmdGVyIHRoZSBjb250ZW50IHJvdy4KICAgICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byByZW5kZXIgdGhlbSBzZXBhcmF0ZWx5IGxhdGVyLgogICAgICAgICAgICAgIHRhaWwgPSBsYXN0Q29udGVudFJvdy5zaWJsaW5nOwogICAgICAgICAgICAgIGxhc3RDb250ZW50Um93LnNpYmxpbmcgPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkcwogICAgICAgICAgICB0YWlsLCBsYXN0Q29udGVudFJvdywgdGFpbE1vZGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgY2FzZSAnYmFja3dhcmRzJzoKICAgICAgICAgIHsKICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gZmluZCB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGV4aXN0aW5nIGNvbnRlbnQuCiAgICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUgd2UncmUgZ29pbmcgdG8gcmV2ZXJzZSB0aGUgbGlzdCBvZiBldmVyeXRoaW5nCiAgICAgICAgICAgIC8vIHdlIHBhc3MgaW4gdGhlIG1lYW50aW1lLiBUaGF0J3MgZ29pbmcgdG8gYmUgb3VyIHRhaWwgaW4gcmV2ZXJzZQogICAgICAgICAgICAvLyBvcmRlci4KICAgICAgICAgICAgdmFyIF90YWlsID0gbnVsbDsKICAgICAgICAgICAgdmFyIHJvdyA9IHdvcmtJblByb2dyZXNzLmNoaWxkOwogICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7CgogICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuCgogICAgICAgICAgICAgIGlmIChjdXJyZW50Um93ICE9PSBudWxsICYmIGZpbmRGaXJzdFN1c3BlbmRlZChjdXJyZW50Um93KSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYWluIGNvbnRlbnQuCiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJvdzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdmFyIG5leHRSb3cgPSByb3cuc2libGluZzsKICAgICAgICAgICAgICByb3cuc2libGluZyA9IF90YWlsOwogICAgICAgICAgICAgIF90YWlsID0gcm93OwogICAgICAgICAgICAgIHJvdyA9IG5leHRSb3c7CiAgICAgICAgICAgIH0gLy8gVE9ETzogSWYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgaXMgbnVsbCwgd2UgY2FuIGNvbnRpbnVlIG9uIHRoZSB0YWlsIGltbWVkaWF0ZWx5LgoKCiAgICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgdHJ1ZSwgLy8gaXNCYWNrd2FyZHMKICAgICAgICAgICAgX3RhaWwsIG51bGwsIC8vIGxhc3QKICAgICAgICAgICAgdGFpbE1vZGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgY2FzZSAndG9nZXRoZXInOgogICAgICAgICAgewogICAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGZhbHNlLCAvLyBpc0JhY2t3YXJkcwogICAgICAgICAgICBudWxsLCAvLyB0YWlsCiAgICAgICAgICAgIG51bGwsIC8vIGxhc3QKICAgICAgICAgICAgdW5kZWZpbmVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHJldmVhbCBvcmRlciBpcyB0aGUgc2FtZSBhcyBub3QgaGF2aW5nCiAgICAgICAgICAgIC8vIGEgYm91bmRhcnkuCiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsOwogICAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykgewogICAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTsKICAgIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7CgogICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHsKICAgICAgLy8gUG9ydGFscyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlIGRvbid0IGFwcGVuZCB0aGUgY2hpbGRyZW4gZHVyaW5nIG1vdW50CiAgICAgIC8vIGJ1dCBhdCBjb21taXQuIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHRyYWNrIGluc2VydGlvbnMgd2hpY2ggdGhlIG5vcm1hbAogICAgICAvLyBmbG93IGRvZXNuJ3QgZG8gZHVyaW5nIG1vdW50LiBUaGlzIGRvZXNuJ3QgaGFwcGVuIGF0IHRoZSByb290IGJlY2F1c2UKICAgICAgLy8gdGhlIHJvb3QgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgImN1cnJlbnQiIHdpdGggYSBudWxsIGNoaWxkLgogICAgICAvLyBUT0RPOiBDb25zaWRlciB1bmlmeWluZyB0aGlzIHdpdGggaG93IHRoZSByb290IHdvcmtzLgogICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTsKICAgIH0KCiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7CiAgfQoKICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSBmYWxzZTsKCiAgZnVuY3Rpb24gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykgewogICAgdmFyIHByb3ZpZGVyVHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7CiAgICB2YXIgY29udGV4dCA9IHByb3ZpZGVyVHlwZS5fY29udGV4dDsKICAgIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsKICAgIHZhciBvbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7CiAgICB2YXIgbmV3VmFsdWUgPSBuZXdQcm9wcy52YWx1ZTsKCiAgICB7CiAgICAgIGlmICghKCd2YWx1ZScgaW4gbmV3UHJvcHMpKSB7CiAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlcikgewogICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSB0cnVlOwoKICAgICAgICAgIGVycm9yKCdUaGUgYHZhbHVlYCBwcm9wIGlzIHJlcXVpcmVkIGZvciB0aGUgYDxDb250ZXh0LlByb3ZpZGVyPmAuIERpZCB5b3UgbWlzc3BlbGwgaXQgb3IgZm9yZ2V0IHRvIHBhc3MgaXQ/Jyk7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgcHJvdmlkZXJQcm9wVHlwZXMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLnByb3BUeXBlczsKCiAgICAgIGlmIChwcm92aWRlclByb3BUeXBlcykgewogICAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3ZpZGVyUHJvcFR5cGVzLCBuZXdQcm9wcywgJ3Byb3AnLCAnQ29udGV4dC5Qcm92aWRlcicpOwogICAgICB9CiAgICB9CgogICAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBuZXdWYWx1ZSk7CgogICAgewogICAgICBpZiAob2xkUHJvcHMgIT09IG51bGwpIHsKICAgICAgICB2YXIgb2xkVmFsdWUgPSBvbGRQcm9wcy52YWx1ZTsKCiAgICAgICAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHsKICAgICAgICAgIC8vIE5vIGNoYW5nZS4gQmFpbG91dCBlYXJseSBpZiBjaGlsZHJlbiBhcmUgdGhlIHNhbWUuCiAgICAgICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7CiAgICAgICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZQogICAgICAgICAgLy8gdGhlbSB0byB1cGRhdGUuCiAgICAgICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdmFyIG5ld0NoaWxkcmVuID0gbmV3UHJvcHMuY2hpbGRyZW47CiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTsKICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsKICB9CgogIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSBmYWxzZTsKCiAgZnVuY3Rpb24gdXBkYXRlQ29udGV4dENvbnN1bWVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykgewogICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW4KICAgIC8vIERFViBtb2RlLCB3ZSBjcmVhdGUgYSBzZXBhcmF0ZSBvYmplY3QgZm9yIENvbnRleHQuQ29uc3VtZXIgdGhhdCBhY3RzCiAgICAvLyBsaWtlIGEgcHJveHkgdG8gQ29udGV4dC4gVGhpcyBwcm94eSBvYmplY3QgYWRkcyB1bm5lY2Vzc2FyeSBjb2RlIGluIFBST0QKICAgIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvCiAgICAvLyByZWR1Y2Ugc2l6ZSBhbmQgb3ZlcmhlYWQuIFRoZSBzZXBhcmF0ZSBvYmplY3QgcmVmZXJlbmNlcyBjb250ZXh0IHZpYQogICAgLy8gYSBwcm9wZXJ0eSBjYWxsZWQgIl9jb250ZXh0Iiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVjawogICAgLy8gaW4gREVWIG1vZGUgaWYgdGhpcyBwcm9wZXJ0eSBleGlzdHMgb3Igbm90IGFuZCB3YXJuIGlmIGl0IGRvZXMgbm90LgoKICAgIHsKICAgICAgaWYgKGNvbnRleHQuX2NvbnRleHQgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQncyBhIENvbnRleHQgKHJhdGhlciB0aGFuIGEgQ29uc3VtZXIpLgogICAgICAgIC8vIE9yIGl0IG1heSBiZSBiZWNhdXNlIGl0J3Mgb2xkZXIgUmVhY3Qgd2hlcmUgdGhleSdyZSB0aGUgc2FtZSB0aGluZy4KICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gd2FybiBpZiB3ZSdyZSBzdXJlIGl0J3MgYSBuZXcgUmVhY3QuCiAgICAgICAgaWYgKGNvbnRleHQgIT09IGNvbnRleHQuQ29uc3VtZXIpIHsKICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyKSB7CiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lciA9IHRydWU7CgogICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0PiBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb250ZXh0ID0gY29udGV4dC5fY29udGV4dDsKICAgICAgfQogICAgfQoKICAgIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsKICAgIHZhciByZW5kZXIgPSBuZXdQcm9wcy5jaGlsZHJlbjsKCiAgICB7CiAgICAgIGlmICh0eXBlb2YgcmVuZGVyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZXJyb3IoJ0EgY29udGV4dCBjb25zdW1lciB3YXMgcmVuZGVyZWQgd2l0aCBtdWx0aXBsZSBjaGlsZHJlbiwgb3IgYSBjaGlsZCAnICsgInRoYXQgaXNuJ3QgYSBmdW5jdGlvbi4gQSBjb250ZXh0IGNvbnN1bWVyIGV4cGVjdHMgYSBzaW5nbGUgY2hpbGQgIiArICd0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgJyArICdpcyBubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgYXJvdW5kIGl0LicpOwogICAgICB9CiAgICB9CgogICAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKICAgIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQpOwoKICAgIHsKICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpOwogICAgfQoKICAgIHZhciBuZXdDaGlsZHJlbjsKCiAgICB7CiAgICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzOwogICAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTsKICAgICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpOwogICAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7CiAgICB9CgogICAgewogICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpOwogICAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuCgoKICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7CiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTsKICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsKICB9CgogIGZ1bmN0aW9uIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCkgewogICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7CiAgfQoKICBmdW5jdGlvbiByZXNldFN1c3BlbmRlZEN1cnJlbnRPbk1vdW50SW5MZWdhY3lNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7CiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkgewogICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkgewogICAgICAgIC8vIEEgbGF6eSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi0KICAgICAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlCiAgICAgICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuCiAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLgogICAgICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDsKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0CgogICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHsKICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7CiAgICAgIC8vIFJldXNlIHByZXZpb3VzIGRlcGVuZGVuY2llcwogICAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llczsKICAgIH0KCiAgICB7CiAgICAgIC8vIERvbid0IHVwZGF0ZSAiYmFzZSIgcmVuZGVyIHRpbWVzIGZvciBiYWlsb3V0cy4KICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTsKICAgIH0KCiAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlIGNoaWxkcmVuIGhhdmUgYW55IHBlbmRpbmcgd29yay4KCiAgICBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpKSB7CiAgICAgIC8vIFRoZSBjaGlsZHJlbiBkb24ndCBoYXZlIGFueSB3b3JrIGVpdGhlci4gV2UgY2FuIHNraXAgdGhlbS4KICAgICAgLy8gVE9ETzogT25jZSB3ZSBhZGQgYmFjayByZXN1bWluZywgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBjaGlsZHJlbiBhcmUKICAgICAgLy8gYSB3b3JrLWluLXByb2dyZXNzIHNldC4gSWYgc28sIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlaXIgZWZmZWN0cy4KICAgICAgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9IC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGQKICAgIC8vIGZpYmVycyBhbmQgY29udGludWUuCgoKICAgIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOwogICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkOwogIH0KCiAgZnVuY3Rpb24gcmVtb3VudEZpYmVyKGN1cnJlbnQsIG9sZFdvcmtJblByb2dyZXNzLCBuZXdXb3JrSW5Qcm9ncmVzcykgewogICAgewogICAgICB2YXIgcmV0dXJuRmliZXIgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47CgogICAgICBpZiAocmV0dXJuRmliZXIgPT09IG51bGwpIHsKICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2RlcwogICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7CiAgICAgIH0gLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBvbGQgY3VycmVudC4KICAgICAgLy8gSXQgd2lsbCBnZXQgZGVsZXRlZC4KCgogICAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7CiAgICAgIG9sZFdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIENvbm5lY3QgdG8gdGhlIG5ldyB0cmVlLgoKICAgICAgbmV3V29ya0luUHJvZ3Jlc3MuaW5kZXggPSBvbGRXb3JrSW5Qcm9ncmVzcy5pbmRleDsKICAgICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7CiAgICAgIG5ld1dvcmtJblByb2dyZXNzLnJldHVybiA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjsKICAgICAgbmV3V29ya0luUHJvZ3Jlc3MucmVmID0gb2xkV29ya0luUHJvZ3Jlc3MucmVmOyAvLyBSZXBsYWNlIHRoZSBjaGlsZC9zaWJsaW5nIHBvaW50ZXJzIGFib3ZlIGl0LgoKICAgICAgaWYgKG9sZFdvcmtJblByb2dyZXNzID09PSByZXR1cm5GaWJlci5jaGlsZCkgewogICAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHByZXZTaWJsaW5nID0gcmV0dXJuRmliZXIuY2hpbGQ7CgogICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkgewogICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXMKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcGFyZW50IHRvIGhhdmUgYSBjaGlsZC4nKTsKICAgICAgICB9CgogICAgICAgIHdoaWxlIChwcmV2U2libGluZy5zaWJsaW5nICE9PSBvbGRXb3JrSW5Qcm9ncmVzcykgewogICAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nOwoKICAgICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkgewogICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvcHJvZC1lcnJvci1jb2RlcwogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgdGhlIHByZXZpb3VzIHNpYmxpbmcuJyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwcmV2U2libGluZy5zaWJsaW5nID0gbmV3V29ya0luUHJvZ3Jlc3M7CiAgICAgIH0gLy8gRGVsZXRlIHRoZSBvbGQgZmliZXIgYW5kIHBsYWNlIHRoZSBuZXcgb25lLgogICAgICAvLyBTaW5jZSB0aGUgb2xkIGZpYmVyIGlzIGRpc2Nvbm5lY3RlZCwgd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBtYW51YWxseS4KCgogICAgICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zOwoKICAgICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkgewogICAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjdXJyZW50XTsKICAgICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBDaGlsZERlbGV0aW9uOwogICAgICB9IGVsc2UgewogICAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnQpOwogICAgICB9CgogICAgICBuZXdXb3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7IC8vIFJlc3RhcnQgd29yayBmcm9tIHRoZSBuZXcgZmliZXIuCgogICAgICByZXR1cm4gbmV3V29ya0luUHJvZ3Jlc3M7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykgewogICAgLy8gQmVmb3JlIHBlcmZvcm1pbmcgYW4gZWFybHkgYmFpbG91dCwgd2UgbXVzdCBjaGVjayBpZiB0aGVyZSBhcmUgcGVuZGluZwogICAgLy8gdXBkYXRlcyBvciBjb250ZXh0LgogICAgdmFyIHVwZGF0ZUxhbmVzID0gY3VycmVudC5sYW5lczsKCiAgICBpZiAoaW5jbHVkZXNTb21lTGFuZSh1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSAvLyBObyBwZW5kaW5nIHVwZGF0ZSwgYnV0IGJlY2F1c2UgY29udGV4dCBpcyBwcm9wYWdhdGVkIGxhemlseSwgd2UgbmVlZAoKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykgewogICAgLy8gVGhpcyBmaWJlciBkb2VzIG5vdCBoYXZlIGFueSBwZW5kaW5nIHdvcmsuIEJhaWxvdXQgd2l0aG91dCBlbnRlcmluZwogICAgLy8gdGhlIGJlZ2luIHBoYXNlLiBUaGVyZSdzIHN0aWxsIHNvbWUgYm9va2tlZXBpbmcgd2UgdGhhdCBuZWVkcyB0byBiZSBkb25lCiAgICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay4KICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7CiAgICAgIGNhc2UgSG9zdFJvb3Q6CiAgICAgICAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7CgogICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDoKICAgICAgICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTsKCiAgICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkgewogICAgICAgICAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgIH0KCiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlIEhvc3RQb3J0YWw6CiAgICAgICAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOgogICAgICAgIHsKICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudmFsdWU7CiAgICAgICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7CiAgICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgUHJvZmlsZXI6CiAgICAgICAgewogICAgICAgICAgLy8gUHJvZmlsZXIgc2hvdWxkIG9ubHkgY2FsbCBvblJlbmRlciB3aGVuIG9uZSBvZiBpdHMgZGVzY2VuZGFudHMgYWN0dWFsbHkgcmVuZGVyZWQuCiAgICAgICAgICB2YXIgaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7CgogICAgICAgICAgaWYgKGhhc0NoaWxkV29yaykgewogICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7CiAgICAgICAgICB9CgogICAgICAgICAgewogICAgICAgICAgICAvLyBSZXNldCBlZmZlY3QgZHVyYXRpb25zIGZvciB0aGUgbmV4dCBldmVudHVhbCBlZmZlY3QgcGhhc2UuCiAgICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sCiAgICAgICAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7CiAgICAgICAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7CiAgICAgICAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7CgogICAgICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFdlIGtub3cgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHN1c3BlbmQgYWdhaW4gYmVjYXVzZSBpZiBpdCBoYXMKICAgICAgICAgICAgICAvLyBiZWVuIHVuc3VzcGVuZGVkIGl0IGhhcyBjb21taXR0ZWQgYXMgYSByZXNvbHZlZCBTdXNwZW5zZSBjb21wb25lbnQuCiAgICAgICAgICAgICAgLy8gSWYgaXQgbmVlZHMgdG8gYmUgcmV0cmllZCwgaXQgc2hvdWxkIGhhdmUgd29yayBzY2hlZHVsZWQgb24gaXQuCgogICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7IC8vIFdlIHNob3VsZCBuZXZlciByZW5kZXIgdGhlIGNoaWxkcmVuIG9mIGEgZGVoeWRyYXRlZCBib3VuZGFyeSB1bnRpbCB3ZQogICAgICAgICAgICAgIC8vIHVwZ3JhZGUgaXQuIFdlIHJldHVybiBudWxsIGluc3RlYWQgb2YgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yay4KCiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0gLy8gSWYgdGhpcyBib3VuZGFyeSBpcyBjdXJyZW50bHkgdGltZWQgb3V0LCB3ZSBuZWVkIHRvIGRlY2lkZQogICAgICAgICAgICAvLyB3aGV0aGVyIHRvIHJldHJ5IHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBvciB0byBza2lwIG92ZXIgaXQgYW5kCiAgICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5CiAgICAgICAgICAgIC8vIGNoaWxkIGZyYWdtZW50LgoKCiAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkOwogICAgICAgICAgICB2YXIgcHJpbWFyeUNoaWxkTGFuZXMgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzOwoKICAgICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHByaW1hcnlDaGlsZExhbmVzKSkgewogICAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBVc2UgdGhlIG5vcm1hbCBwYXRoCiAgICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uCiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkCiAgICAgICAgICAgICAgLy8gb24gaXQKICAgICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTsgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gZG8gbm90IGhhdmUgcGVuZGluZyB3b3JrIHdpdGggc3VmZmljaWVudAogICAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LgoKICAgICAgICAgICAgICB2YXIgY2hpbGQgPSBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7CgogICAgICAgICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gVGhlIGZhbGxiYWNrIGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBTa2lwIG92ZXIgdGhlCiAgICAgICAgICAgICAgICAvLyBwcmltYXJ5IGNoaWxkcmVuIGFuZCB3b3JrIG9uIHRoZSBmYWxsYmFjay4KICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZC5zaWJsaW5nOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBjYW4gcmV0dXJuIGBudWxsYCBoZXJlIGJlY2F1c2Ugd2UgYWxyZWFkeSBjaGVja2VkCiAgICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZXJlIHdlcmUgbmVzdGVkIGNvbnRleHQgY29uc3VtZXJzLCB2aWEgdGhlIGNhbGwgdG8KICAgICAgICAgICAgICAgIC8vIGBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrYCBhYm92ZS4KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7CiAgICAgICAgICB9CgogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgdmFyIGRpZFN1c3BlbmRCZWZvcmUgPSAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzOwoKICAgICAgICAgIHZhciBfaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7CgogICAgICAgICAgaWYgKGRpZFN1c3BlbmRCZWZvcmUpIHsKICAgICAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHsKICAgICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2FzIGluIGZhbGxiYWNrIHN0YXRlIGxhc3QgdGltZSwgYW5kIHdlIGhhdmUgYWxsIHRoZQogICAgICAgICAgICAgIC8vIHNhbWUgY2hpbGRyZW4gdGhlbiB3ZSdyZSBzdGlsbCBpbiBwcm9ncmVzc2l2ZSBsb2FkaW5nIHN0YXRlLgogICAgICAgICAgICAgIC8vIFNvbWV0aGluZyBtaWdodCBnZXQgdW5ibG9ja2VkIGJ5IHN0YXRlIHVwZGF0ZXMgb3IgcmV0cmllcyBpbiB0aGUKICAgICAgICAgICAgICAvLyB0cmVlIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSB0YWlsLiBTbyB3ZSBuZWVkIHRvIHVzZSB0aGUgbm9ybWFsCiAgICAgICAgICAgICAgLy8gcGF0aCB0byBjb21wdXRlIHRoZSBjb3JyZWN0IHRhaWwuCiAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwogICAgICAgICAgICB9IC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2YKICAgICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5CiAgICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuCgoKICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsKICAgICAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQgYmVmb3JlIGFuZCB3ZSdyZSByZW5kZXJpbmcgdGhlIHNhbWUgY2hpbGRyZW4sCiAgICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmsKICAgICAgICAgIC8vIGluIHRoZSAidG9nZXRoZXIiIG1vZGUsIHNvIHdlIGNhbiBjb250aW51ZSBmcm9tIHRoZSBzdGF0ZSB3ZSBoYWQuCgoKICAgICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7CgogICAgICAgICAgaWYgKHJlbmRlclN0YXRlICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFJlc2V0IHRvIHRoZSAidG9nZXRoZXIiIG1vZGUgaW4gY2FzZSB3ZSd2ZSBzdGFydGVkIGEgZGlmZmVyZW50CiAgICAgICAgICAgIC8vIHVwZGF0ZSBpbiB0aGUgcGFzdCBidXQgZGlkbid0IGNvbXBsZXRlIGl0LgogICAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBudWxsOwogICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDsKICAgICAgICAgICAgcmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9IG51bGw7CiAgICAgICAgICB9CgogICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KTsKCiAgICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2YKICAgICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5CiAgICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OgogICAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIHRoZSB0cmVlIHN0aWxsIG5lZWRzIHRvIGJlIGRlZmVycmVkLiBUaGlzIGlzCiAgICAgICAgICAvLyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBsb2dpYyB1c2VkIGluIHRoZSBub3JtYWwgdXBkYXRlIHBhdGgsCiAgICAgICAgICAvLyBzbyB3ZSdsbCBqdXN0IGVudGVyIHRoYXQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2UnbGwgYmFpbCBvdXQKICAgICAgICAgIC8vIGF0IHRoZSBuZXh0IGxldmVsIGluc3RlYWQgb2YgdGhpcyBvbmUsIGJlY2F1c2UgdGhlIGNoaWxkIHByb3BzCiAgICAgICAgICAvLyBoYXZlIG5vdCBjaGFuZ2VkLiBXaGljaCBpcyBmaW5lLgogICAgICAgICAgLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIHJlZmFjdG9yIGBiZWdpbldvcmtgIHRvIHNwbGl0IHRoZSBiYWlsb3V0CiAgICAgICAgICAvLyBwYXRoIGZyb20gdGhlIG5vcm1hbCBwYXRoLiBJJ20gdGVtcHRlZCB0byBkbyBhIGxhYmVsZWQgYnJlYWsgaGVyZQogICAgICAgICAgLy8gYnV0IEkgd29uJ3QgOikKICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lczsKICAgICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKICB9CgogIGZ1bmN0aW9uIGJlZ2luV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHsKICAgIHsKICAgICAgaWYgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCAmJiBjdXJyZW50ICE9PSBudWxsKSB7CiAgICAgICAgLy8gVGhpcyB3aWxsIHJlc3RhcnQgdGhlIGJlZ2luIHBoYXNlIHdpdGggYSBuZXcgZmliZXIuCiAgICAgICAgcmV0dXJuIHJlbW91bnRGaWJlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHdvcmtJblByb2dyZXNzLmtleSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciB8fCBudWxsLCB3b3JrSW5Qcm9ncmVzcy5tb2RlLCB3b3JrSW5Qcm9ncmVzcy5sYW5lcykpOwogICAgICB9CiAgICB9CgogICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHsKICAgICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzOwogICAgICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7CgogICAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IGhhc0NvbnRleHRDaGFuZ2VkKCkgfHwgKCAvLyBGb3JjZSBhIHJlLXJlbmRlciBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZDoKICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgIT09IGN1cnJlbnQudHlwZSApKSB7CiAgICAgICAgLy8gSWYgcHJvcHMgb3IgY29udGV4dCBjaGFuZ2VkLCBtYXJrIHRoZSBmaWJlciBhcyBoYXZpbmcgcGVyZm9ybWVkIHdvcmsuCiAgICAgICAgLy8gVGhpcyBtYXkgYmUgdW5zZXQgaWYgdGhlIHByb3BzIGFyZSBkZXRlcm1pbmVkIHRvIGJlIGVxdWFsIGxhdGVyIChtZW1vKS4KICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBOZWl0aGVyIHByb3BzIG5vciBsZWdhY3kgY29udGV4dCBjaGFuZ2VzLiBDaGVjayBpZiB0aGVyZSdzIGEgcGVuZGluZwogICAgICAgIC8vIHVwZGF0ZSBvciBjb250ZXh0IGNoYW5nZS4KICAgICAgICB2YXIgaGFzU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0ID0gY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpOwoKICAgICAgICBpZiAoIWhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCAmJiAvLyBJZiB0aGlzIGlzIHRoZSBzZWNvbmQgcGFzcyBvZiBhbiBlcnJvciBvciBzdXNwZW5zZSBib3VuZGFyeSwgdGhlcmUKICAgICAgICAvLyBtYXkgbm90IGJlIHdvcmsgc2NoZWR1bGVkIG9uIGBjdXJyZW50YCwgc28gd2UgY2hlY2sgZm9yIHRoaXMgZmxhZy4KICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykgewogICAgICAgICAgLy8gTm8gcGVuZGluZyB1cGRhdGVzIG9yIGNvbnRleHQuIEJhaWwgb3V0IG5vdy4KICAgICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHsKICAgICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuCiAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuCiAgICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb24gdGhpcyBmaWJlciwgYnV0IHRoZXJlIGFyZSBubyBuZXcgcHJvcHMKICAgICAgICAgIC8vIG5vciBsZWdhY3kgY29udGV4dC4gU2V0IHRoaXMgdG8gZmFsc2UuIElmIGFuIHVwZGF0ZSBxdWV1ZSBvciBjb250ZXh0CiAgICAgICAgICAvLyBjb25zdW1lciBwcm9kdWNlcyBhIGNoYW5nZWQgdmFsdWUsIGl0IHdpbGwgc2V0IHRoaXMgdG8gdHJ1ZS4gT3RoZXJ3aXNlLAogICAgICAgICAgLy8gdGhlIGNvbXBvbmVudCB3aWxsIGFzc3VtZSB0aGUgY2hpbGRyZW4gaGF2ZSBub3QgY2hhbmdlZCBhbmQgYmFpbCBvdXQuCiAgICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7CgogICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSkgewogICAgICAgIC8vIENoZWNrIGlmIHRoaXMgY2hpbGQgYmVsb25ncyB0byBhIGxpc3Qgb2YgbXVsaXBsZSBjaGlsZHJlbiBpbgogICAgICAgIC8vIGl0cyBwYXJlbnQuCiAgICAgICAgLy8KICAgICAgICAvLyBJbiBhIHRydWUgbXVsdGktdGhyZWFkZWQgaW1wbGVtZW50YXRpb24sIHdlIHdvdWxkIHJlbmRlciBjaGlsZHJlbiBvbgogICAgICAgIC8vIHBhcmFsbGVsIHRocmVhZHMuIFRoaXMgd291bGQgcmVwcmVzZW50IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgcmVuZGVyCiAgICAgICAgLy8gdGhyZWFkIGZvciB0aGlzIHN1YnRyZWUuCiAgICAgICAgLy8KICAgICAgICAvLyBXZSBvbmx5IHVzZSB0aGlzIGZvciBpZCBnZW5lcmF0aW9uIGR1cmluZyBoeWRyYXRpb24sIHdoaWNoIGlzIHdoeSB0aGUKICAgICAgICAvLyBsb2dpYyBpcyBsb2NhdGVkIGluIHRoaXMgc3BlY2lhbCBicmFuY2guCiAgICAgICAgdmFyIHNsb3RJbmRleCA9IHdvcmtJblByb2dyZXNzLmluZGV4OwogICAgICAgIHZhciBudW1iZXJPZkZvcmtzID0gZ2V0Rm9ya3NBdExldmVsKCk7CiAgICAgICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTsKICAgICAgfQogICAgfSAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjbGVhciBwZW5kaW5nIHVwZGF0ZSBwcmlvcml0eS4KICAgIC8vIFRPRE86IFRoaXMgYXNzdW1lcyB0aGF0IHdlJ3JlIGFib3V0IHRvIGV2YWx1YXRlIHRoZSBjb21wb25lbnQgYW5kIHByb2Nlc3MKICAgIC8vIHRoZSB1cGRhdGUgcXVldWUuIEhvd2V2ZXIsIHRoZXJlJ3MgYW4gZXhjZXB0aW9uOiBTaW1wbGVNZW1vQ29tcG9uZW50CiAgICAvLyBzb21ldGltZXMgYmFpbHMgb3V0IGxhdGVyIGluIHRoZSBiZWdpbiBwaGFzZS4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB3ZSBzaG91bGQKICAgIC8vIG1vdmUgdGhpcyBhc3NpZ25tZW50IG91dCBvZiB0aGUgY29tbW9uIHBhdGggYW5kIGludG8gZWFjaCBicmFuY2guCgoKICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lczsKCiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykgewogICAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgcmV0dXJuIG1vdW50SW5kZXRlcm1pbmF0ZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgcmVuZGVyTGFuZXMpOwogICAgICAgIH0KCiAgICAgIGNhc2UgTGF6eUNvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICB2YXIgZWxlbWVudFR5cGUgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZTsKICAgICAgICAgIHJldHVybiBtb3VudExhenlDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcyk7CiAgICAgICAgfQoKICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTsKICAgICAgICAgIHZhciB1bnJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7CiAgICAgICAgICB2YXIgcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBDb21wb25lbnQgPyB1bnJlc29sdmVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgdW5yZXNvbHZlZFByb3BzKTsKICAgICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7CiAgICAgICAgfQoKICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7CiAgICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsKCiAgICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudCA/IF91bnJlc29sdmVkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQsIF91bnJlc29sdmVkUHJvcHMpOwoKICAgICAgICAgIHJldHVybiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX0NvbXBvbmVudCwgX3Jlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTsKICAgICAgICB9CgogICAgICBjYXNlIEhvc3RSb290OgogICAgICAgIHJldHVybiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwoKICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgIHJldHVybiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7CgogICAgICBjYXNlIEhvc3RUZXh0OgogICAgICAgIHJldHVybiB1cGRhdGVIb3N0VGV4dChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7CgogICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OgogICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwoKICAgICAgY2FzZSBIb3N0UG9ydGFsOgogICAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKCiAgICAgIGNhc2UgRm9yd2FyZFJlZjoKICAgICAgICB7CiAgICAgICAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7CiAgICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7CgogICAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSB0eXBlID8gX3VucmVzb2x2ZWRQcm9wczIgOiByZXNvbHZlRGVmYXVsdFByb3BzKHR5cGUsIF91bnJlc29sdmVkUHJvcHMyKTsKCiAgICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJMYW5lcyk7CiAgICAgICAgfQoKICAgICAgY2FzZSBGcmFnbWVudDoKICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKCiAgICAgIGNhc2UgTW9kZToKICAgICAgICByZXR1cm4gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwoKICAgICAgY2FzZSBQcm9maWxlcjoKICAgICAgICByZXR1cm4gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKCiAgICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOgogICAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKCiAgICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOgogICAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKCiAgICAgIGNhc2UgTWVtb0NvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICB2YXIgX3R5cGUyID0gd29ya0luUHJvZ3Jlc3MudHlwZTsKICAgICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLgoKICAgICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMiwgX3VucmVzb2x2ZWRQcm9wczMpOwoKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7CiAgICAgICAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gX3R5cGUyLnByb3BUeXBlczsKCiAgICAgICAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7CiAgICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seQogICAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoX3R5cGUyKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIudHlwZSwgX3Jlc29sdmVkUHJvcHMzKTsKICAgICAgICAgIHJldHVybiB1cGRhdGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfdHlwZTIsIF9yZXNvbHZlZFByb3BzMywgcmVuZGVyTGFuZXMpOwogICAgICAgIH0KCiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCByZW5kZXJMYW5lcyk7CiAgICAgICAgfQoKICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgdmFyIF9Db21wb25lbnQyID0gd29ya0luUHJvZ3Jlc3MudHlwZTsKICAgICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsKCiAgICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQyID8gX3VucmVzb2x2ZWRQcm9wczQgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQyLCBfdW5yZXNvbHZlZFByb3BzNCk7CgogICAgICAgICAgcmV0dXJuIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MiwgX3Jlc29sdmVkUHJvcHM0LCByZW5kZXJMYW5lcyk7CiAgICAgICAgfQoKICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOwogICAgICAgIH0KCiAgICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6CiAgICAgICAgewoKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTsKICAgICAgICB9CiAgICB9CgogICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyAiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluICIgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogIH0KCiAgZnVuY3Rpb24gbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcykgewogICAgLy8gVGFnIHRoZSBmaWJlciB3aXRoIGFuIHVwZGF0ZSBlZmZlY3QuIFRoaXMgdHVybnMgYSBQbGFjZW1lbnQgaW50bwogICAgLy8gYSBQbGFjZW1lbnRBbmRVcGRhdGUuCiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7CiAgfQoKICBmdW5jdGlvbiBtYXJrUmVmJDEod29ya0luUHJvZ3Jlc3MpIHsKICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjsKCiAgICB7CiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZlN0YXRpYzsKICAgIH0KICB9CgogIHZhciBhcHBlbmRBbGxDaGlsZHJlbjsKICB2YXIgdXBkYXRlSG9zdENvbnRhaW5lcjsKICB2YXIgdXBkYXRlSG9zdENvbXBvbmVudCQxOwogIHZhciB1cGRhdGVIb3N0VGV4dCQxOwoKICB7CiAgICAvLyBNdXRhdGlvbiBtb2RlCiAgICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7CiAgICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGNyZWF0ZWQgYnV0IHdlIG5lZWQgcmVjdXJzZSBkb3duIGl0cwogICAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuCiAgICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7CgogICAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkgewogICAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHsKICAgICAgICAgIGFwcGVuZEluaXRpYWxDaGlsZChwYXJlbnQsIG5vZGUuc3RhdGVOb2RlKTsKICAgICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHsKICAgICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTsKICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAobm9kZSA9PT0gd29ya0luUHJvZ3Jlc3MpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHsKICAgICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQoKICAgICAgICAgIG5vZGUgPSBub2RlLnJldHVybjsKICAgICAgICB9CgogICAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjsKICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nOwogICAgICB9CiAgICB9OwoKICAgIHVwZGF0ZUhvc3RDb250YWluZXIgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHsvLyBOb29wCiAgICB9OwoKICAgIHVwZGF0ZUhvc3RDb21wb25lbnQkMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkgewogICAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0bwogICAgICAvLyBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLgogICAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7CgogICAgICBpZiAob2xkUHJvcHMgPT09IG5ld1Byb3BzKSB7CiAgICAgICAgLy8gSW4gbXV0YXRpb24gbW9kZSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhIGJhaWxvdXQgYmVjYXVzZQogICAgICAgIC8vIHdlIHdvbid0IHRvdWNoIHRoaXMgbm9kZSBldmVuIGlmIGNoaWxkcmVuIGNoYW5nZWQuCiAgICAgICAgcmV0dXJuOwogICAgICB9IC8vIElmIHdlIGdldCB1cGRhdGVkIGJlY2F1c2Ugb25lIG9mIG91ciBjaGlsZHJlbiB1cGRhdGVkLCB3ZSBkb24ndAogICAgICAvLyBoYXZlIG5ld1Byb3BzIHNvIHdlJ2xsIGhhdmUgdG8gcmV1c2UgdGhlbS4KICAgICAgLy8gVE9ETzogU3BsaXQgdGhlIHVwZGF0ZSBBUEkgYXMgc2VwYXJhdGUgZm9yIHRoZSBwcm9wcyB2cy4gY2hpbGRyZW4uCiAgICAgIC8vIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIGNoaWxkcmVuIHdlcmVuJ3Qgc3BlY2lhbCBjYXNlZCBhdCBhbGwgdGhvLgoKCiAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsKICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3QKICAgICAgLy8gY29tcG9uZW50IGlzIGhpdHRpbmcgdGhlIHJlc3VtZSBwYXRoLiBGaWd1cmUgb3V0IHdoeS4gUG9zc2libHkKICAgICAgLy8gcmVsYXRlZCB0byBgaGlkZGVuYC4KCiAgICAgIHZhciB1cGRhdGVQYXlsb2FkID0gcHJlcGFyZVVwZGF0ZShpbnN0YW5jZSwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCk7IC8vIFRPRE86IFR5cGUgdGhpcyBzcGVjaWZpYyB0byB0aGlzIHR5cGUgb2YgY29tcG9uZW50LgoKICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkOyAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmUKICAgICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuCgogICAgICBpZiAodXBkYXRlUGF5bG9hZCkgewogICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpOwogICAgICB9CiAgICB9OwoKICAgIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHsKICAgICAgLy8gSWYgdGhlIHRleHQgZGlmZmVycywgbWFyayBpdCBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpbiBkb25lIGluIGNvbW1pdFdvcmsuCiAgICAgIGlmIChvbGRUZXh0ICE9PSBuZXdUZXh0KSB7CiAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7CiAgICAgIH0KICAgIH07CiAgfQoKICBmdW5jdGlvbiBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjaykgewogICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHsKICAgICAgLy8gSWYgd2UncmUgaHlkcmF0aW5nLCB3ZSBzaG91bGQgY29uc3VtZSBhcyBtYW55IGl0ZW1zIGFzIHdlIGNhbgogICAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhbnkgYmVoaW5kLgogICAgICByZXR1cm47CiAgICB9CgogICAgc3dpdGNoIChyZW5kZXJTdGF0ZS50YWlsTW9kZSkgewogICAgICBjYXNlICdoaWRkZW4nOgogICAgICAgIHsKICAgICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50CiAgICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXMKICAgICAgICAgIC8vIGFueXRoaW5nIGJlZm9yZSB0aGVtIGFyZSBub3QgY29uc2lkZXJlZCBmb3IgY29sbGFwc2luZy4KICAgICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZgogICAgICAgICAgLy8gdGhlcmUgYXJlIGFueS4KICAgICAgICAgIHZhciB0YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7CiAgICAgICAgICB2YXIgbGFzdFRhaWxOb2RlID0gbnVsbDsKCiAgICAgICAgICB3aGlsZSAodGFpbE5vZGUgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKHRhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgIGxhc3RUYWlsTm9kZSA9IHRhaWxOb2RlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0YWlsTm9kZSA9IHRhaWxOb2RlLnNpYmxpbmc7CiAgICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGUKICAgICAgICAgIC8vIGxhc3QgcmVuZGVyZWQgaXRlbS4KCgogICAgICAgICAgaWYgKGxhc3RUYWlsTm9kZSA9PT0gbnVsbCkgewogICAgICAgICAgICAvLyBBbGwgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSB0YWlsIGFyZSBpbnNlcnRpb25zLgogICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeQogICAgICAgICAgICAvLyBpbnNlcnRlZC4KICAgICAgICAgICAgbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsOwogICAgICAgICAgfQoKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgJ2NvbGxhcHNlZCc6CiAgICAgICAgewogICAgICAgICAgLy8gQW55IGluc2VydGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgdGFpbCBsaXN0IGFmdGVyIHRoaXMgcG9pbnQKICAgICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllcwogICAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLgogICAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgd2hvbGUgdGFpbCB0byBmaW5kIGlmCiAgICAgICAgICAvLyB0aGVyZSBhcmUgYW55LgogICAgICAgICAgdmFyIF90YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7CiAgICAgICAgICB2YXIgX2xhc3RUYWlsTm9kZSA9IG51bGw7CgogICAgICAgICAgd2hpbGUgKF90YWlsTm9kZSAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoX3RhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgIF9sYXN0VGFpbE5vZGUgPSBfdGFpbE5vZGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIF90YWlsTm9kZSA9IF90YWlsTm9kZS5zaWJsaW5nOwogICAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIHNpbXBseSBnb2luZyB0byBkZWxldGUgYWxsIGluc2VydGlvbnMgYWZ0ZXIgdGhlCiAgICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uCgoKICAgICAgICAgIGlmIChfbGFzdFRhaWxOb2RlID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuCiAgICAgICAgICAgIGlmICghaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrICYmIHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHsKICAgICAgICAgICAgICAvLyBXZSBzdXNwZW5kZWQgZHVyaW5nIHRoZSBoZWFkLiBXZSB3YW50IHRvIHNob3cgYXQgbGVhc3Qgb25lCiAgICAgICAgICAgICAgLy8gcm93IGF0IHRoZSB0YWlsLiBTbyB3ZSdsbCBrZWVwIG9uIGFuZCBjdXQgb2ZmIHRoZSByZXN0LgogICAgICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwuc2libGluZyA9IG51bGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeQogICAgICAgICAgICAvLyBpbnNlcnRlZC4KICAgICAgICAgICAgX2xhc3RUYWlsTm9kZS5zaWJsaW5nID0gbnVsbDsKICAgICAgICAgIH0KCiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBidWJibGVQcm9wZXJ0aWVzKGNvbXBsZXRlZFdvcmspIHsKICAgIHZhciBkaWRCYWlsb3V0ID0gY29tcGxldGVkV29yay5hbHRlcm5hdGUgIT09IG51bGwgJiYgY29tcGxldGVkV29yay5hbHRlcm5hdGUuY2hpbGQgPT09IGNvbXBsZXRlZFdvcmsuY2hpbGQ7CiAgICB2YXIgbmV3Q2hpbGRMYW5lcyA9IE5vTGFuZXM7CiAgICB2YXIgc3VidHJlZUZsYWdzID0gTm9GbGFnczsKCiAgICBpZiAoIWRpZEJhaWxvdXQpIHsKICAgICAgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuCiAgICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7CiAgICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXQKICAgICAgICAvLyBwcm9maWxlciBkdXJhdGlvbnMuCiAgICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjsKICAgICAgICB2YXIgdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjsKICAgICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkOwoKICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHsKICAgICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoY2hpbGQubGFuZXMsIGNoaWxkLmNoaWxkTGFuZXMpKTsKICAgICAgICAgIHN1YnRyZWVGbGFncyB8PSBjaGlsZC5zdWJ0cmVlRmxhZ3M7CiAgICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gY2hpbGQuZmxhZ3M7IC8vIFdoZW4gYSBmaWJlciBpcyBjbG9uZWQsIGl0cyBhY3R1YWxEdXJhdGlvbiBpcyByZXNldCB0byAwLiBUaGlzIHZhbHVlIHdpbGwKICAgICAgICAgIC8vIG9ubHkgYmUgdXBkYXRlZCBpZiB3b3JrIGlzIGRvbmUgb24gdGhlIGZpYmVyIChpLmUuIGl0IGRvZXNuJ3QgYmFpbG91dCkuCiAgICAgICAgICAvLyBXaGVuIHdvcmsgaXMgZG9uZSwgaXQgc2hvdWxkIGJ1YmJsZSB0byB0aGUgcGFyZW50J3MgYWN0dWFsRHVyYXRpb24uIElmCiAgICAgICAgICAvLyB0aGUgZmliZXIgaGFzIG5vdCBiZWVuIGNsb25lZCB0aG91Z2gsIChtZWFuaW5nIG5vIHdvcmsgd2FzIGRvbmUpLCB0aGVuCiAgICAgICAgICAvLyB0aGlzIHZhbHVlIHdpbGwgcmVmbGVjdCB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgd29ya2luZyBvbiBhIHByZXZpb3VzCiAgICAgICAgICAvLyByZW5kZXIuIEluIHRoYXQgY2FzZSBpdCBzaG91bGQgbm90IGJ1YmJsZS4gV2UgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd2FzCiAgICAgICAgICAvLyBjbG9uZWQgYnkgY29tcGFyaW5nIHRoZSBjaGlsZCBwb2ludGVyLgoKICAgICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uOwogICAgICAgICAgdHJlZUJhc2VEdXJhdGlvbiArPSBjaGlsZC50cmVlQmFzZUR1cmF0aW9uOwogICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nOwogICAgICAgIH0KCiAgICAgICAgY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uOwogICAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IHRyZWVCYXNlRHVyYXRpb247CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIF9jaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7CgogICAgICAgIHdoaWxlIChfY2hpbGQgIT09IG51bGwpIHsKICAgICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkLmxhbmVzLCBfY2hpbGQuY2hpbGRMYW5lcykpOwogICAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5zdWJ0cmVlRmxhZ3M7CiAgICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkLmZsYWdzOyAvLyBVcGRhdGUgdGhlIHJldHVybiBwb2ludGVyIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuIFRoaXMgaXMgYSBjb2RlCiAgICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGgKICAgICAgICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuIFdpbGwgYWRkcmVzcyBkdXJpbmcgcmVmYWN0b3IgdG8gYWx0ZXJuYXRlIG1vZGVsLgoKICAgICAgICAgIF9jaGlsZC5yZXR1cm4gPSBjb21wbGV0ZWRXb3JrOwogICAgICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7CiAgICAgICAgfQogICAgICB9CgogICAgICBjb21wbGV0ZWRXb3JrLnN1YnRyZWVGbGFncyB8PSBzdWJ0cmVlRmxhZ3M7CiAgICB9IGVsc2UgewogICAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS4KICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHsKICAgICAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldAogICAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy4KICAgICAgICB2YXIgX3RyZWVCYXNlRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLnNlbGZCYXNlRHVyYXRpb247CiAgICAgICAgdmFyIF9jaGlsZDIgPSBjb21wbGV0ZWRXb3JrLmNoaWxkOwoKICAgICAgICB3aGlsZSAoX2NoaWxkMiAhPT0gbnVsbCkgewogICAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQyLmxhbmVzLCBfY2hpbGQyLmNoaWxkTGFuZXMpKTsgLy8gIlN0YXRpYyIgZmxhZ3Mgc2hhcmUgdGhlIGxpZmV0aW1lIG9mIHRoZSBmaWJlci9ob29rIHRoZXkgYmVsb25nIHRvLAogICAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGJ1YmJsZSB0aG9zZSB1cCBldmVuIGR1cmluZyBhIGJhaWxvdXQuIEFsbCB0aGUgb3RoZXIKICAgICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkCiAgICAgICAgICAvLyBpZ25vcmUgdGhlbS4KCiAgICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkMi5zdWJ0cmVlRmxhZ3MgJiBTdGF0aWNNYXNrOwogICAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDIuZmxhZ3MgJiBTdGF0aWNNYXNrOwogICAgICAgICAgX3RyZWVCYXNlRHVyYXRpb24gKz0gX2NoaWxkMi50cmVlQmFzZUR1cmF0aW9uOwogICAgICAgICAgX2NoaWxkMiA9IF9jaGlsZDIuc2libGluZzsKICAgICAgICB9CgogICAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IF90cmVlQmFzZUR1cmF0aW9uOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBfY2hpbGQzID0gY29tcGxldGVkV29yay5jaGlsZDsKCiAgICAgICAgd2hpbGUgKF9jaGlsZDMgIT09IG51bGwpIHsKICAgICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkMy5sYW5lcywgX2NoaWxkMy5jaGlsZExhbmVzKSk7IC8vICJTdGF0aWMiIGZsYWdzIHNoYXJlIHRoZSBsaWZldGltZSBvZiB0aGUgZmliZXIvaG9vayB0aGV5IGJlbG9uZyB0bywKICAgICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyCiAgICAgICAgICAvLyBmbGFncyBoYXZlIGEgbGlmZXRpbWUgb25seSBvZiBhIHNpbmdsZSByZW5kZXIgKyBjb21taXQsIHNvIHdlIHNob3VsZAogICAgICAgICAgLy8gaWdub3JlIHRoZW0uCgogICAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzazsKICAgICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQzLmZsYWdzICYgU3RhdGljTWFzazsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZQogICAgICAgICAgLy8gc21lbGwgYmVjYXVzZSBpdCBhc3N1bWVzIHRoZSBjb21taXQgcGhhc2UgaXMgbmV2ZXIgY29uY3VycmVudCB3aXRoCiAgICAgICAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLiBXaWxsIGFkZHJlc3MgZHVyaW5nIHJlZmFjdG9yIHRvIGFsdGVybmF0ZSBtb2RlbC4KCiAgICAgICAgICBfY2hpbGQzLnJldHVybiA9IGNvbXBsZXRlZFdvcms7CiAgICAgICAgICBfY2hpbGQzID0gX2NoaWxkMy5zaWJsaW5nOwogICAgICAgIH0KICAgICAgfQoKICAgICAgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3MgfD0gc3VidHJlZUZsYWdzOwogICAgfQoKICAgIGNvbXBsZXRlZFdvcmsuY2hpbGRMYW5lcyA9IG5ld0NoaWxkTGFuZXM7CiAgICByZXR1cm4gZGlkQmFpbG91dDsKICB9CgogIGZ1bmN0aW9uIGNvbXBsZXRlRGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRTdGF0ZSkgewogICAgaWYgKGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSAmJiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7CiAgICAgIHdhcm5JZlVuaHlkcmF0ZWRUYWlsTm9kZXMod29ya0luUHJvZ3Jlc3MpOwogICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7CiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyIHwgSW5jb21wbGV0ZSB8IFNob3VsZENhcHR1cmU7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7CgogICAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCAmJiBuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkgewogICAgICAvLyBXZSBtaWdodCBiZSBpbnNpZGUgYSBoeWRyYXRpb24gc3RhdGUgdGhlIGZpcnN0IHRpbWUgd2UncmUgcGlja2luZyB1cCB0aGlzCiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LCBhbmQgYWxzbyBhZnRlciB3ZSd2ZSByZWVudGVyZWQgaXQgZm9yIGZ1cnRoZXIgaHlkcmF0aW9uLgogICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkgewogICAgICAgIGlmICghd2FzSHlkcmF0ZWQpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudCB3YXMgY29tcGxldGVkIHdpdGhvdXQgYSBoeWRyYXRlZCBub2RlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7CiAgICAgICAgfQoKICAgICAgICBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpOwogICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpOwoKICAgICAgICB7CiAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkgewogICAgICAgICAgICB2YXIgaXNUaW1lZE91dFN1c3BlbnNlID0gbmV4dFN0YXRlICE9PSBudWxsOwoKICAgICAgICAgICAgaWYgKGlzVGltZWRPdXRTdXNwZW5zZSkgewogICAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLgogICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkOwoKICAgICAgICAgICAgICBpZiAocHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yCiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gV2UgbWlnaHQgaGF2ZSByZWVudGVyZWQgdGhpcyBib3VuZGFyeSB0byBoeWRyYXRlIGl0LiBJZiBzbywgd2UgbmVlZCB0byByZXNldCB0aGUgaHlkcmF0aW9uCiAgICAgICAgLy8gc3RhdGUgc2luY2Ugd2UncmUgbm93IGV4aXRpbmcgb3V0IG9mIGl0LiBwb3BIeWRyYXRpb25TdGF0ZSBkb2Vzbid0IGRvIHRoYXQgZm9yIHVzLgogICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTsKCiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7CiAgICAgICAgICAvLyBUaGlzIGJvdW5kYXJ5IGRpZCBub3Qgc3VzcGVuZCBzbyBpdCdzIG5vdyBoeWRyYXRlZCBhbmQgdW5zdXNwZW5kZWQuCiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDsKICAgICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBtYXJrIHRoaXMgYm91bmRhcnkKICAgICAgICAvLyBhcyBoYXZpbmcgaHlkcmF0ZWQgc28gZXZlbnRzIGtub3cgdGhhdCB0aGV5J3JlIGZyZWUgdG8gYmUgaW52b2tlZC4KICAgICAgICAvLyBJdCdzIGFsc28gYSBzaWduYWwgdG8gcmVwbGF5IGV2ZW50cyBhbmQgdGhlIHN1c3BlbnNlIGNhbGxiYWNrLgogICAgICAgIC8vIElmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggcmV0cnkgbGlzdGVuZXJzLgogICAgICAgIC8vIFNvIHdlIG1pZ2h0IGFzIHdlbGwgYWx3YXlzIG1hcmsgdGhpcy4KCgogICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTsKICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTsKCiAgICAgICAgewogICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHsKICAgICAgICAgICAgdmFyIF9pc1RpbWVkT3V0U3VzcGVuc2UgPSBuZXh0U3RhdGUgIT09IG51bGw7CgogICAgICAgICAgICBpZiAoX2lzVGltZWRPdXRTdXNwZW5zZSkgewogICAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLgogICAgICAgICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsKCiAgICAgICAgICAgICAgaWYgKF9wcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3IKICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gX3ByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhpcyB0cmVlLiBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLAogICAgICAvLyB0aGVyZSBtYXkgaGF2ZSBiZWVuIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uCiAgICAgIC8vIGF0dGVtcHQuIElmIHNvLCBhZGQgdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGUKICAgICAgLy8gY29tbWl0IHBoYXNlLgogICAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpOyAvLyBGYWxsIHRocm91Z2ggdG8gbm9ybWFsIFN1c3BlbnNlIHBhdGgKCiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tcGxldGVXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykgewogICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmcKICAgIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLgogICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seQogICAgLy8gZm9yIGh5ZHJhdGlvbi4KCiAgICBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7CgogICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHsKICAgICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OgogICAgICBjYXNlIExhenlDb21wb25lbnQ6CiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDoKICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDoKICAgICAgY2FzZSBGb3J3YXJkUmVmOgogICAgICBjYXNlIEZyYWdtZW50OgogICAgICBjYXNlIE1vZGU6CiAgICAgIGNhc2UgUHJvZmlsZXI6CiAgICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOgogICAgICBjYXNlIE1lbW9Db21wb25lbnQ6CiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICBjYXNlIENsYXNzQ29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOwoKICAgICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7CiAgICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgfQoKICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgY2FzZSBIb3N0Um9vdDoKICAgICAgICB7CiAgICAgICAgICB2YXIgZmliZXJSb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlOwogICAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgICBwb3BUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7CgogICAgICAgICAgaWYgKGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCkgewogICAgICAgICAgICBmaWJlclJvb3QuY29udGV4dCA9IGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dDsKICAgICAgICAgICAgZmliZXJSb290LnBlbmRpbmdDb250ZXh0ID0gbnVsbDsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LmNoaWxkID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCBwb3Agc28gdGhhdCB3ZSBjYW4gZGVsZXRlIGFueSByZW1haW5pbmcgY2hpbGRyZW4KICAgICAgICAgICAgLy8gdGhhdCB3ZXJlbid0IGh5ZHJhdGVkLgogICAgICAgICAgICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7CgogICAgICAgICAgICBpZiAod2FzSHlkcmF0ZWQpIHsKICAgICAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgdGhlbiB3ZSdsbCBuZWVkIHRvIHNjaGVkdWxlIGFuIHVwZGF0ZSBmb3IKICAgICAgICAgICAgICAvLyB0aGUgY29tbWl0IHNpZGUtZWZmZWN0cyBvbiB0aGUgcm9vdC4KICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTsKCiAgICAgICAgICAgICAgICBpZiAoIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjbGllbnQgcm9vdAogICAgICAgICAgICAgICAgIXByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQgfHwgLy8gQ2hlY2sgaWYgd2UgcmV2ZXJ0ZWQgdG8gY2xpZW50IHJlbmRlcmluZyAoZS5nLiBkdWUgdG8gYW4gZXJyb3IpCiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikgIT09IE5vRmxhZ3MpIHsKICAgICAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGNsZWFyIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzdGFydCBvZiB0aGUKICAgICAgICAgICAgICAgICAgLy8gbmV4dCBjb21taXQuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBSZWFjdCByZW5kZXJpbmcgaW50byBhCiAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lciB3aXRoIHByZXZpb3VzIGNoaWxkcmVuLiBJdCdzIGFsc28gc2FmZSB0byBkbyBmb3IKICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyB0b28sIGJlY2F1c2UgY3VycmVudC5jaGlsZCB3b3VsZCBvbmx5IGJlIG51bGwgaWYgdGhlCiAgICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHJlbmRlciB3YXMgbnVsbCAoc28gdGhlIGNvbnRhaW5lciB3b3VsZCBhbHJlYWR5CiAgICAgICAgICAgICAgICAgIC8vIGJlIGVtcHR5KS4KICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7IC8vIElmIHRoaXMgd2FzIGEgZm9yY2VkIGNsaWVudCByZW5kZXIsIHRoZXJlIG1heSBoYXZlIGJlZW4KICAgICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmFibGUgZXJyb3JzIGR1cmluZyBmaXJzdCBoeWRyYXRpb24gYXR0ZW1wdC4gSWYgc28sIGFkZAogICAgICAgICAgICAgICAgICAvLyB0aGVtIHRvIGEgcXVldWUgc28gd2UgY2FuIGxvZyB0aGVtIGluIHRoZSBjb21taXQgcGhhc2UuCgogICAgICAgICAgICAgICAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7CgogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgIHZhciByb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRSb290SG9zdENvbnRhaW5lcigpOwogICAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOwoKICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgIHVwZGF0ZUhvc3RDb21wb25lbnQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7CgogICAgICAgICAgICBpZiAoY3VycmVudC5yZWYgIT09IHdvcmtJblByb2dyZXNzLnJlZikgewogICAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghbmV3UHJvcHMpIHsKICAgICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTsKICAgICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuCgoKICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dAogICAgICAgICAgICAvLyAic3RhY2siIGFzIHRoZSBwYXJlbnQuIFRoZW4gYXBwZW5kIGNoaWxkcmVuIGFzIHdlIGdvIGluIGJlZ2luV29yawogICAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBhZGQgdGhlbSB0b3AtPmRvd24gb3IKICAgICAgICAgICAgLy8gYm90dG9tLT51cC4gVG9wLT5kb3duIGlzIGZhc3RlciBpbiBJRTExLgoKICAgICAgICAgICAgdmFyIF93YXNIeWRyYXRlZCA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTsKCiAgICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQpIHsKICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgYW5kIGNyZWF0ZUluc3RhbmNlIHN0ZXAgaW50byB0aGUgYmVnaW5QaGFzZQogICAgICAgICAgICAgIC8vIHRvIGNvbnNvbGlkYXRlLgogICAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCkpIHsKICAgICAgICAgICAgICAgIC8vIElmIGNoYW5nZXMgdG8gdGhlIGh5ZHJhdGVkIG5vZGUgbmVlZCB0byBiZSBhcHBsaWVkIGF0IHRoZQogICAgICAgICAgICAgICAgLy8gY29tbWl0LXBoYXNlIHdlIG1hcmsgdGhpcyBhcyBzdWNoLgogICAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGN1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgICAgIGFwcGVuZEFsbENoaWxkcmVuKGluc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gQ2VydGFpbiByZW5kZXJlcnMgcmVxdWlyZSBjb21taXQtdGltZSBlZmZlY3RzIGZvciBpbml0aWFsIG1vdW50LgogICAgICAgICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgc3VwcG9ydHMgYXV0by1mb2N1cyBmb3IgY2VydGFpbiBlbGVtZW50cykuCiAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHN1Y2ggcmVuZGVyZXJzIGdldCBzY2hlZHVsZWQgZm9yIGxhdGVyIHdvcmsuCgogICAgICAgICAgICAgIGlmIChmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbihpbnN0YW5jZSwgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSkpIHsKICAgICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkgewogICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFjawogICAgICAgICAgICAgIG1hcmtSZWYkMSh3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgIGNhc2UgSG9zdFRleHQ6CiAgICAgICAgewogICAgICAgICAgdmFyIG5ld1RleHQgPSBuZXdQcm9wczsKCiAgICAgICAgICBpZiAoY3VycmVudCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWQKICAgICAgICAgICAgLy8gdG8gc2NoZWR1bGUgYSBzaWRlLWVmZmVjdCB0byBkbyB0aGUgdXBkYXRlcy4KCiAgICAgICAgICAgIHVwZGF0ZUhvc3RUZXh0JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay4KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBfcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTsKCiAgICAgICAgICAgIHZhciBfY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTsKCiAgICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQyID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpOwoKICAgICAgICAgICAgaWYgKF93YXNIeWRyYXRlZDIpIHsKICAgICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpKSB7CiAgICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3JlYXRlVGV4dEluc3RhbmNlKG5ld1RleHQsIF9yb290Q29udGFpbmVySW5zdGFuY2UsIF9jdXJyZW50SG9zdENvbnRleHQsIHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7IC8vIFNwZWNpYWwgcGF0aCBmb3IgZGVoeWRyYXRlZCBib3VuZGFyaWVzLiBXZSBtYXkgZXZlbnR1YWxseSBtb3ZlIHRoaXMKICAgICAgICAgIC8vIHRvIGl0cyBvd24gZmliZXIgdHlwZSBzbyB0aGF0IHdlIGNhbiBhZGQgb3RoZXIga2luZHMgb2YgaHlkcmF0aW9uCiAgICAgICAgICAvLyBib3VuZGFyaWVzIHRoYXQgYXJlbid0IGFzc29jaWF0ZWQgd2l0aCBhIFN1c3BlbnNlIHRyZWUuIEluIGFudGljaXBhdGlvbgogICAgICAgICAgLy8gb2Ygc3VjaCBhIHJlZmFjdG9yLCBhbGwgdGhlIGh5ZHJhdGlvbiBsb2dpYyBpcyBjb250YWluZWQgaW4KICAgICAgICAgIC8vIHRoaXMgYnJhbmNoLgoKICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkgewogICAgICAgICAgICB2YXIgZmFsbHRocm91Z2hUb05vcm1hbFN1c3BlbnNlUGF0aCA9IGNvbXBsZXRlRGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRTdGF0ZSk7CgogICAgICAgICAgICBpZiAoIWZhbGx0aHJvdWdoVG9Ob3JtYWxTdXNwZW5zZVBhdGgpIHsKICAgICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBTaG91bGRDYXB0dXJlKSB7CiAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UuIFRoZXJlIHdlcmUgcmVtYWluaW5nIHVuaHlkcmF0ZWQgbm9kZXMuIFdlIHRyZWF0CiAgICAgICAgICAgICAgICAvLyB0aGlzIGFzIGEgbWlzbWF0Y2guIFJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLgogICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBEaWQgbm90IGZpbmlzaCBoeWRyYXRpbmcsIGVpdGhlciBiZWNhdXNlIHRoaXMgaXMgdGhlIGluaXRpYWwKICAgICAgICAgICAgICAgIC8vIHJlbmRlciBvciBiZWNhdXNlIHNvbWV0aGluZyBzdXNwZW5kZWQuCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gLy8gQ29udGludWUgd2l0aCB0aGUgbm9ybWFsIFN1c3BlbnNlIHBhdGguCgogICAgICAgICAgfQoKICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncykgewogICAgICAgICAgICAvLyBTb21ldGhpbmcgc3VzcGVuZGVkLiBSZS1yZW5kZXIgd2l0aCB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uCiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7IC8vIERvIG5vdCByZXNldCB0aGUgZWZmZWN0IGxpc3QuCgogICAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHsKICAgICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgICAgfSAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuCgoKICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDsKICAgICAgICAgIHZhciBwcmV2RGlkVGltZW91dCA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsOwogICAgICAgICAgLy8gYSBwYXNzaXZlIGVmZmVjdCwgd2hpY2ggaXMgd2hlbiB3ZSBwcm9jZXNzIHRoZSB0cmFuc2l0aW9ucwoKCiAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQgIT09IHByZXZEaWRUaW1lb3V0KSB7CiAgICAgICAgICAgIC8vIGFuIGVmZmVjdCB0byB0b2dnbGUgdGhlIHN1YnRyZWUncyB2aXNpYmlsaXR5LiBXaGVuIHdlIHN3aXRjaCBmcm9tCiAgICAgICAgICAgIC8vIGZhbGxiYWNrIC0+IHByaW1hcnksIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgc2NoZWR1bGVzIHRoaXMgZWZmZWN0CiAgICAgICAgICAgIC8vIGFzIHBhcnQgb2YgaXRzIG5vcm1hbCBjb21wbGV0ZSBwaGFzZS4gQnV0IHdoZW4gd2Ugc3dpdGNoIGZyb20KICAgICAgICAgICAgLy8gcHJpbWFyeSAtPiBmYWxsYmFjaywgdGhlIGlubmVyIE9mZnNjcmVlbiBmaWJlciBkb2VzIG5vdCBoYXZlIGEgY29tcGxldGUKICAgICAgICAgICAgLy8gcGhhc2UuIFNvIHdlIG5lZWQgdG8gc2NoZWR1bGUgaXRzIGVmZmVjdCBoZXJlLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBXZSBhbHNvIHVzZSB0aGlzIGZsYWcgdG8gY29ubmVjdC9kaXNjb25uZWN0IHRoZSBlZmZlY3RzLCBidXQgdGhlIHNhbWUKICAgICAgICAgICAgLy8gbG9naWMgYXBwbGllczogd2hlbiByZS1jb25uZWN0aW5nLCB0aGUgT2Zmc2NyZWVuIGZpYmVyJ3MgY29tcGxldGUKICAgICAgICAgICAgLy8gcGhhc2Ugd2lsbCBoYW5kbGUgc2NoZWR1bGluZyB0aGUgZWZmZWN0LiBJdCdzIG9ubHkgd2hlbiB0aGUgZmFsbGJhY2sKICAgICAgICAgICAgLy8gaXMgYWN0aXZlIHRoYXQgd2UgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgoKCiAgICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCkgewogICAgICAgICAgICAgIHZhciBfb2Zmc2NyZWVuRmliZXIyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7CiAgICAgICAgICAgICAgX29mZnNjcmVlbkZpYmVyMi5mbGFncyB8PSBWaXNpYmlsaXR5OyAvLyBUT0RPOiBUaGlzIHdpbGwgc3RpbGwgc3VzcGVuZCBhIHN5bmNocm9ub3VzIHRyZWUgaWYgYW55dGhpbmcKICAgICAgICAgICAgICAvLyBpbiB0aGUgY29uY3VycmVudCB0cmVlIGFscmVhZHkgc3VzcGVuZGVkIGR1cmluZyB0aGlzIHJlbmRlci4KICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEga25vd24gYnVnLgoKICAgICAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkgewogICAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGJhY2sgdG8gdGhyb3dFeGNlcHRpb24gYmVjYXVzZSB0aGlzIGlzIHRvbyBsYXRlCiAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbGFyZ2UgdHJlZSB3aGljaCBpcyBjb21tb24gZm9yIGluaXRpYWwgbG9hZHMuIFdlCiAgICAgICAgICAgICAgICAvLyBkb24ndCBrbm93IGlmIHdlIHNob3VsZCByZXN0YXJ0IGEgcmVuZGVyIG9yIG5vdCB1bnRpbCB3ZSBnZXQKICAgICAgICAgICAgICAgIC8vIHRoaXMgbWFya2VyLCBhbmQgdGhpcyBpcyB0b28gbGF0ZS4KICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgcmVuZGVyIGFscmVhZHkgaGFkIGEgcGluZyBvciBsb3dlciBwcmkgdXBkYXRlcywKICAgICAgICAgICAgICAgIC8vIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGtub3cgd2UncmUgZ29pbmcgdG8gc3VzcGVuZCB3ZQogICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gaW1tZWRpYXRlbHkgcmVzdGFydCBmcm9tIHdpdGhpbiB0aHJvd0V4Y2VwdGlvbi4KICAgICAgICAgICAgICAgIHZhciBoYXNJbnZpc2libGVDaGlsZENvbnRleHQgPSBjdXJyZW50ID09PSBudWxsICYmICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrICE9PSB0cnVlIHx8ICFlbmFibGVTdXNwZW5zZUF2b2lkVGhpc0ZhbGxiYWNrKTsKCiAgICAgICAgICAgICAgICBpZiAoaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0IHx8IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCkpIHsKICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgaW4gYW4gaW52aXNpYmxlIHRyZWUgb3IgYSBuZXcgcmVuZGVyLCB0aGVuIHNob3dpbmcKICAgICAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay4KICAgICAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZCgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGQKICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuZCBmb3IgbG9uZ2VyIGlmIHBvc3NpYmxlLgogICAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIHdha2VhYmxlcyA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOwoKICAgICAgICAgIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCBhIHJldHJ5IGxpc3RlbmVyIHRvIHRoZSBwcm9taXNlLgogICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2UKICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlOwogICAgICAgICAgfQoKICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpOwoKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHsKICAgICAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHsKICAgICAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLgogICAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7CgogICAgICAgICAgICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBkb2Vzbid0IHN1cHBvcnQgdHlwZSBjYXN0aW5nIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC09IG9wZXJhdG9yCiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICBjYXNlIEhvc3RQb3J0YWw6CiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7CgogICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7CiAgICAgICAgICBwcmVwYXJlUG9ydGFsTW91bnQod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pOwogICAgICAgIH0KCiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICBjYXNlIENvbnRleHRQcm92aWRlcjoKICAgICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXIKICAgICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7CiAgICAgICAgcG9wUHJvdmlkZXIoY29udGV4dCwgd29ya0luUHJvZ3Jlc3MpOwogICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpOwogICAgICAgIHJldHVybiBudWxsOwoKICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgLy8gU2FtZSBhcyBjbGFzcyBjb21wb25lbnQgY2FzZS4gSSBwdXQgaXQgZG93biBoZXJlIHNvIHRoYXQgdGhlIHRhZ3MgYXJlCiAgICAgICAgICAvLyBzZXF1ZW50aWFsIHRvIGVuc3VyZSB0aGlzIHN3aXRjaCBpcyBjb21waWxlZCB0byBhIGp1bXAgdGFibGUuCiAgICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7CgogICAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKF9Db21wb25lbnQpKSB7CiAgICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgfQoKICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7CgogICAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFdlJ3JlIHJ1bm5pbmcgaW4gdGhlIGRlZmF1bHQsICJpbmRlcGVuZGVudCIgbW9kZS4KICAgICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLgogICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7CiAgICAgICAgICB2YXIgcmVuZGVyZWRUYWlsID0gcmVuZGVyU3RhdGUucmVuZGVyaW5nOwoKICAgICAgICAgIGlmIChyZW5kZXJlZFRhaWwgPT09IG51bGwpIHsKICAgICAgICAgICAgLy8gV2UganVzdCByZW5kZXJlZCB0aGUgaGVhZC4KICAgICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkgewogICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHBhc3MuIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiBhbnl0aGluZyBpcyBzdGlsbAogICAgICAgICAgICAgIC8vIHN1c3BlbmRlZCBpbiB0aGUgcmVuZGVyZWQgc2V0LgogICAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdAogICAgICAgICAgICAgIC8vIGRpZG4ndC4gVGhlbiB3ZSBuZWVkIHRvIGRvIGEgc2Vjb25kIHBhc3MgdGhhdCBmb3JjZXMgZXZlcnl0aGluZwogICAgICAgICAgICAgIC8vIHRvIGtlZXAgc2hvd2luZyB0aGVpciBmYWxsYmFja3MuCiAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3IKICAgICAgICAgICAgICAvLyBzb21ldGhpbmcgaW4gdGhlIHByZXZpb3VzIGNvbW1pdHRlZCBwYXNzIHN1c3BlbmRlZC4gT3RoZXJ3aXNlLAogICAgICAgICAgICAgIC8vIHRoZXJlJ3Mgbm8gY2hhbmNlIHNvIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgY2FsbCB0bwogICAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC4KICAgICAgICAgICAgICB2YXIgY2Fubm90QmVTdXNwZW5kZWQgPSByZW5kZXJIYXNOb3RTdXNwZW5kZWRZZXQoKSAmJiAoY3VycmVudCA9PT0gbnVsbCB8fCAoY3VycmVudC5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKTsKCiAgICAgICAgICAgICAgaWYgKCFjYW5ub3RCZVN1c3BlbmRlZCkgewogICAgICAgICAgICAgICAgdmFyIHJvdyA9IHdvcmtJblByb2dyZXNzLmNoaWxkOwoKICAgICAgICAgICAgICAgIHdoaWxlIChyb3cgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpOwoKICAgICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOwogICAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzCiAgICAgICAgICAgICAgICAgICAgLy8gcGFydCBvZiB0aGUgc2Vjb25kIHBhc3MuIEluIHRoYXQgY2FzZSBub3RoaW5nIHdpbGwgc3Vic2NyaWJlIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gaXRzIHRoZW5hYmxlcy4gSW5zdGVhZCwgd2UnbGwgdHJhbnNmZXIgaXRzIHRoZW5hYmxlcyB0byB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBTdXNwZW5zZUxpc3Qgc28gdGhhdCBpdCBjYW4gcmV0cnkgaWYgdGhleSByZXNvbHZlLgogICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlIG9mIHRoZXNlIGluIHRoZSBsaXN0IGJ1dCBzaW5jZSB3ZSdyZQogICAgICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIHdhaXQgZm9yIGFsbCBvZiB0aGVtIGFueXdheSwgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggb25lcyBnZXRzIHRvIHBpbmcuIEluIHRoZW9yeSB3ZSBjb3VsZCBnZXQgY2xldmVyIGFuZCBrZWVwCiAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2sgb2YgaG93IG1hbnkgZGVwZW5kZW5jaWVzIHJlbWFpbiBidXQgaXQgZ2V0cyB0cmlja3kgYmVjYXVzZQogICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtZWFudGltZSwgd2UgY2FuIGFkZC9yZW1vdmUvY2hhbmdlIGl0ZW1zIGFuZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmFpbCBvdXQgb2YgdGhlIGxvb3AgYmVmb3JlIGZpbmRpbmcgYW55IGJ1dCB0aGF0CiAgICAgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBtYXR0ZXIgc2luY2UgdGhhdCBtZWFucyB0aGF0IHRoZSBvdGhlciBib3VuZGFyaWVzIHRoYXQKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkaWQgZmluZCBhbHJlYWR5IGhhcyB0aGVpciBsaXN0ZW5lcnMgYXR0YWNoZWQuCgogICAgICAgICAgICAgICAgICAgIHZhciBuZXdUaGVuYWJsZXMgPSBzdXNwZW5kZWQudXBkYXRlUXVldWU7CgogICAgICAgICAgICAgICAgICAgIGlmIChuZXdUaGVuYWJsZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbmV3VGhlbmFibGVzOwogICAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlOwogICAgICAgICAgICAgICAgICAgIH0gLy8gUmVyZW5kZXIgdGhlIHdob2xlIGxpc3QsIGJ1dCB0aGlzIHRpbWUsIHdlJ2xsIGZvcmNlIGZhbGxiYWNrcwogICAgICAgICAgICAgICAgICAgIC8vIHRvIHN0YXkgaW4gcGxhY2UuCiAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGVmZmVjdCBmbGFncyBiZWZvcmUgZG9pbmcgdGhlIHNlY29uZCBwYXNzIHNpbmNlIHRoYXQncyBub3cgaW52YWxpZC4KICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgY2hpbGQgZmliZXJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLgoKCiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFnczsKICAgICAgICAgICAgICAgICAgICByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7IC8vIFNldCB1cCB0aGUgU3VzcGVuc2UgQ29udGV4dCB0byBmb3JjZSBzdXNwZW5zZSBhbmQgaW1tZWRpYXRlbHkKICAgICAgICAgICAgICAgICAgICAvLyByZXJlbmRlciB0aGUgY2hpbGRyZW4uCgogICAgICAgICAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spKTsgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLgoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIHJvdyA9IHJvdy5zaWJsaW5nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwgJiYgbm93KCkgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkpIHsKICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBidXQgd2Ugc3RpbGwgaGF2ZSByb3dzCiAgICAgICAgICAgICAgICAvLyBsZWZ0IGluIHRoZSB0YWlsLiBXZSdsbCBqdXN0IGdpdmUgdXAgZnVydGhlciBhdHRlbXB0cyB0byByZW5kZXIKICAgICAgICAgICAgICAgIC8vIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy4KICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7CiAgICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7CiAgICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXMKICAgICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtcwogICAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLAogICAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzCiAgICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZQogICAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLgogICAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmcKICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS4KCiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOwogICAgICAgICAgICB9IC8vIE5leHQgd2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZSB0YWlsLgoKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgcmVuZGVyZWQgcm93IHRvIHRoZSBjaGlsZCBsaXN0LgogICAgICAgICAgICBpZiAoIWRpZFN1c3BlbmRBbHJlYWR5KSB7CiAgICAgICAgICAgICAgdmFyIF9zdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocmVuZGVyZWRUYWlsKTsKCiAgICAgICAgICAgICAgaWYgKF9zdXNwZW5kZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7CiAgICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7IC8vIEVuc3VyZSB3ZSB0cmFuc2ZlciB0aGUgdXBkYXRlIHF1ZXVlIHRvIHRoZSBwYXJlbnQgc28gdGhhdCBpdCBkb2Vzbid0CiAgICAgICAgICAgICAgICAvLyBnZXQgbG9zdCBpZiB0aGlzIHJvdyBlbmRzIHVwIGRyb3BwZWQgZHVyaW5nIGEgc2Vjb25kIHBhc3MuCgogICAgICAgICAgICAgICAgdmFyIF9uZXdUaGVuYWJsZXMgPSBfc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlOwoKICAgICAgICAgICAgICAgIGlmIChfbmV3VGhlbmFibGVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gX25ld1RoZW5hYmxlczsKICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgdHJ1ZSk7IC8vIFRoaXMgbWlnaHQgaGF2ZSBiZWVuIG1vZGlmaWVkLgoKICAgICAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsID09PSBudWxsICYmIHJlbmRlclN0YXRlLnRhaWxNb2RlID09PSAnaGlkZGVuJyAmJiAhcmVuZGVyZWRUYWlsLmFsdGVybmF0ZSAmJiAhZ2V0SXNIeWRyYXRpbmcoKSAvLyBXZSBkb24ndCBjdXQgaXQgaWYgd2UncmUgaHlkcmF0aW5nLgogICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgZG9uZS4KICAgICAgICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSBpZiAoIC8vIFRoZSB0aW1lIGl0IHRvb2sgdG8gcmVuZGVyIGxhc3Qgcm93IGlzIGdyZWF0ZXIgdGhhbiB0aGUgcmVtYWluaW5nCiAgICAgICAgICAgICAgLy8gdGltZSB3ZSBoYXZlIHRvIHJlbmRlci4gU28gcmVuZGVyaW5nIG9uZSBtb3JlIHJvdyB3b3VsZCBsaWtlbHkKICAgICAgICAgICAgICAvLyBleGNlZWQgaXQuCiAgICAgICAgICAgICAgbm93KCkgKiAyIC0gcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpICYmIHJlbmRlckxhbmVzICE9PSBPZmZzY3JlZW5MYW5lKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdyBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBhbmQgd2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXIKICAgICAgICAgICAgICAgIC8vIGF0dGVtcHRzIHRvIHJlbmRlciB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuCiAgICAgICAgICAgICAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgaXMgdXN1YWxseSBmYXN0ZXIuCiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOwogICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlOwogICAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzCiAgICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXMKICAgICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlciwKICAgICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhcwogICAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmUKICAgICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy4KICAgICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nCiAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuCgogICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzKSB7CiAgICAgICAgICAgICAgLy8gVGhlIGVmZmVjdCBsaXN0IG9mIHRoZSBiYWNrd2FyZHMgdGFpbCB3aWxsIGhhdmUgYmVlbiBhZGRlZAogICAgICAgICAgICAgIC8vIHRvIHRoZSBlbmQuIFRoaXMgYnJlYWtzIHRoZSBndWFyYW50ZWUgdGhhdCBsaWZlLWN5Y2xlcyBmaXJlIGluCiAgICAgICAgICAgICAgLy8gc2libGluZyBvcmRlciBidXQgdGhhdCBpc24ndCBhIHN0cm9uZyBndWFyYW50ZWUgcHJvbWlzZWQgYnkgUmVhY3QuCiAgICAgICAgICAgICAgLy8gRXNwZWNpYWxseSBzaW5jZSB0aGVzZSBtaWdodCBhbHNvIGp1c3QgcG9wIGluIGR1cmluZyBmdXR1cmUgY29tbWl0cy4KICAgICAgICAgICAgICAvLyBBcHBlbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC4KICAgICAgICAgICAgICByZW5kZXJlZFRhaWwuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkOwogICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBwcmV2aW91c1NpYmxpbmcgPSByZW5kZXJTdGF0ZS5sYXN0OwoKICAgICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1NpYmxpbmcuc2libGluZyA9IHJlbmRlcmVkVGFpbDsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0ID0gcmVuZGVyZWRUYWlsOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHsKICAgICAgICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSB0YWlsIHJvd3MgdG8gcmVuZGVyLgogICAgICAgICAgICAvLyBQb3AgYSByb3cuCiAgICAgICAgICAgIHZhciBuZXh0ID0gcmVuZGVyU3RhdGUudGFpbDsKICAgICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbmV4dDsKICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG5leHQuc2libGluZzsKICAgICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gbm93KCk7CiAgICAgICAgICAgIG5leHQuc2libGluZyA9IG51bGw7IC8vIFJlc3RvcmUgdGhlIGNvbnRleHQuCiAgICAgICAgICAgIC8vIFRPRE86IFdlIGNhbiBwcm9iYWJseSBqdXN0IGF2b2lkIHBvcHBpbmcgaXQgaW5zdGVhZCBhbmQgb25seQogICAgICAgICAgICAvLyBzZXR0aW5nIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGdvIGZyb20gbm90IHN1c3BlbmRlZCB0byBzdXNwZW5kZWQuCgogICAgICAgICAgICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50OwoKICAgICAgICAgICAgaWYgKGRpZFN1c3BlbmRBbHJlYWR5KSB7CiAgICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gRG8gYSBwYXNzIG92ZXIgdGhlIG5leHQgcm93LgogICAgICAgICAgICAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuCgogICAgICAgICAgICByZXR1cm4gbmV4dDsKICAgICAgICAgIH0KCiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6CiAgICAgICAgewoKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OgogICAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgICB2YXIgX25leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7CiAgICAgICAgICB2YXIgbmV4dElzSGlkZGVuID0gX25leHRTdGF0ZSAhPT0gbnVsbDsKCiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICB2YXIgX3ByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTsKICAgICAgICAgICAgdmFyIHByZXZJc0hpZGRlbiA9IF9wcmV2U3RhdGUgIT09IG51bGw7CgogICAgICAgICAgICBpZiAocHJldklzSGlkZGVuICE9PSBuZXh0SXNIaWRkZW4gJiYgKCAvLyBMZWdhY3lIaWRkZW4gZG9lc24ndCBkbyBhbnkgaGlkaW5nIOKAlCBpdCBvbmx5IHByZS1yZW5kZXJzLgogICAgICAgICAgICAhZW5hYmxlTGVnYWN5SGlkZGVuICkpIHsKICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBWaXNpYmlsaXR5OwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKCFuZXh0SXNIaWRkZW4gfHwgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkgewogICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGZvciBoaWRkZW4gY2hpbGRyZW4gdW5sZXNzIHdlJ3JlIHJlbmRlcmluZwogICAgICAgICAgICAvLyBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuCiAgICAgICAgICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKHN1YnRyZWVSZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHsKICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTsKCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGFuIGluc2VydGlvbiBvciB1cGRhdGUgaW4gdGhlIGhpZGRlbiBzdWJ0cmVlLgogICAgICAgICAgICAgICAgLy8gSWYgc28sIHdlIG5lZWQgdG8gaGlkZSB0aG9zZSBub2RlcyBpbiB0aGUgY29tbWl0IHBoYXNlLCBzbwogICAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgYSB2aXNpYmlsaXR5IGVmZmVjdC4KICAgICAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzICYgKFBsYWNlbWVudCB8IFVwZGF0ZSkpIHsKICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVmlzaWJpbGl0eTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgIGNhc2UgQ2FjaGVDb21wb25lbnQ6CiAgICAgICAgewoKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgIGNhc2UgVHJhY2luZ01hcmtlckNvbXBvbmVudDoKICAgICAgICB7CgogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQoKICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnICgiICsgd29ya0luUHJvZ3Jlc3MudGFnICsgIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiAiICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTsKICB9CgogIGZ1bmN0aW9uIHVud2luZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7CiAgICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmcKICAgIC8vIHRvIHRoZSBjdXJyZW50IHRyZWUgcHJvdmlkZXIgZmliZXIgaXMganVzdCBhcyBmYXN0IGFuZCBsZXNzIGVycm9yLXByb25lLgogICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBoYXZlIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSB3b3JrIGxvb3Agb25seQogICAgLy8gZm9yIGh5ZHJhdGlvbi4KICAgIHBvcFRyZWVDb250ZXh0KHdvcmtJblByb2dyZXNzKTsKCiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykgewogICAgICBjYXNlIENsYXNzQ29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIHZhciBDb21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOwoKICAgICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7CiAgICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBmbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzOwoKICAgICAgICAgIGlmIChmbGFncyAmIFNob3VsZENhcHR1cmUpIHsKICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBmbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTsKCiAgICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkgewogICAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgY2FzZSBIb3N0Um9vdDoKICAgICAgICB7CiAgICAgICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsKICAgICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpOwogICAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpOwogICAgICAgICAgdmFyIF9mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzOwoKICAgICAgICAgIGlmICgoX2ZsYWdzICYgU2hvdWxkQ2FwdHVyZSkgIT09IE5vRmxhZ3MgJiYgKF9mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7CiAgICAgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgcmVuZGVyIHRoYXQgd2Fzbid0IGNhcHR1cmVkIGJ5IGEgc3VzcGVuc2UKICAgICAgICAgICAgLy8gYm91bmRhcnkuIERvIGEgc2Vjb25kIHBhc3Mgb24gdGhlIHJvb3QgdG8gdW5tb3VudCB0aGUgY2hpbGRyZW4uCiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlOwogICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7CiAgICAgICAgICB9IC8vIFdlIHVud291bmQgdG8gdGhlIHJvb3Qgd2l0aG91dCBjb21wbGV0aW5nIGl0LiBFeGl0LgoKCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICBjYXNlIEhvc3RDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgLy8gVE9ETzogcG9wSHlkcmF0aW9uU3RhdGUKICAgICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTsKICAgICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTsKCiAgICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhyZXcgaW4gbmV3bHkgbW91bnRlZCBkZWh5ZHJhdGVkIGNvbXBvbmVudC4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gJyArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICB2YXIgX2ZsYWdzMiA9IHdvcmtJblByb2dyZXNzLmZsYWdzOwoKICAgICAgICAgIGlmIChfZmxhZ3MyICYgU2hvdWxkQ2FwdHVyZSkgewogICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFnczIgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7IC8vIENhcHR1cmVkIGEgc3VzcGVuc2UgZWZmZWN0LiBSZS1yZW5kZXIgdGhlIGJvdW5kYXJ5LgoKICAgICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7CiAgICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzczsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICBwb3BTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpOyAvLyBTdXNwZW5zZUxpc3QgZG9lc24ndCBhY3R1YWxseSBjYXRjaCBhbnl0aGluZy4gSXQgc2hvdWxkJ3ZlIGJlZW4KICAgICAgICAgIC8vIGNhdWdodCBieSBhIG5lc3RlZCBib3VuZGFyeS4gSWYgbm90LCBpdCBzaG91bGQgYnViYmxlIHRocm91Z2guCgogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgY2FzZSBIb3N0UG9ydGFsOgogICAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpOwogICAgICAgIHJldHVybiBudWxsOwoKICAgICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6CiAgICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0OwogICAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTsKICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OgogICAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDoKICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7CiAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICBjYXNlIENhY2hlQ29tcG9uZW50OgoKICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrLCByZW5kZXJMYW5lcykgewogICAgLy8gTm90ZTogVGhpcyBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgY2hlY2sgaWYgd2UncmUgaHlkcmF0aW5nIGJlY2F1c2UgY29tcGFyaW5nCiAgICAvLyB0byB0aGUgY3VycmVudCB0cmVlIHByb3ZpZGVyIGZpYmVyIGlzIGp1c3QgYXMgZmFzdCBhbmQgbGVzcyBlcnJvci1wcm9uZS4KICAgIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHkKICAgIC8vIGZvciBoeWRyYXRpb24uCiAgICBwb3BUcmVlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspOwoKICAgIHN3aXRjaCAoaW50ZXJydXB0ZWRXb3JrLnRhZykgewogICAgICBjYXNlIENsYXNzQ29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IGludGVycnVwdGVkV29yay50eXBlLmNoaWxkQ29udGV4dFR5cGVzOwoKICAgICAgICAgIGlmIChjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHBvcENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTsKICAgICAgICAgIH0KCiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlIEhvc3RSb290OgogICAgICAgIHsKICAgICAgICAgIHZhciByb290ID0gaW50ZXJydXB0ZWRXb3JrLnN0YXRlTm9kZTsKICAgICAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTsKICAgICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChpbnRlcnJ1cHRlZFdvcmspOwogICAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlIEhvc3RDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgcG9wSG9zdENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgSG9zdFBvcnRhbDoKICAgICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OgogICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6CiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIENvbnRleHRQcm92aWRlcjoKICAgICAgICB2YXIgY29udGV4dCA9IGludGVycnVwdGVkV29yay50eXBlLl9jb250ZXh0OwogICAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIGludGVycnVwdGVkV29yayk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDoKICAgICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6CiAgICAgICAgcG9wUmVuZGVyTGFuZXMoaW50ZXJydXB0ZWRXb3JrKTsKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIHZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG51bGw7CgogIHsKICAgIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbmV3IFNldCgpOwogIH0gLy8gVXNlZCBkdXJpbmcgdGhlIGNvbW1pdCBwaGFzZSB0byB0cmFjayB0aGUgc3RhdGUgb2YgdGhlIE9mZnNjcmVlbiBjb21wb25lbnQgc3RhY2suCiAgLy8gQWxsb3dzIHVzIHRvIGF2b2lkIHRyYXZlcnNpbmcgdGhlIHJldHVybiBwYXRoIHRvIGZpbmQgdGhlIG5lYXJlc3QgT2Zmc2NyZWVuIGFuY2VzdG9yLgogIC8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVN1c3BlbnNlTGF5b3V0RWZmZWN0U2VtYW50aWNzIGlzIGVuYWJsZWQuCgoKICB2YXIgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gZmFsc2U7CiAgdmFyIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBmYWxzZTsKICB2YXIgUG9zc2libHlXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgPyBXZWFrU2V0IDogU2V0OwogIHZhciBuZXh0RWZmZWN0ID0gbnVsbDsgLy8gVXNlZCBmb3IgUHJvZmlsaW5nIGJ1aWxkcyB0byB0cmFjayB1cGRhdGVycy4KCiAgdmFyIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7CiAgdmFyIGluUHJvZ3Jlc3NSb290ID0gbnVsbDsKICBmdW5jdGlvbiByZXBvcnRVbmNhdWdodEVycm9ySW5ERVYoZXJyb3IpIHsKICAgIC8vIFdyYXBwaW5nIGVhY2ggc21hbGwgcGFydCBvZiB0aGUgY29tbWl0IHBoYXNlIGludG8gYSBndWFyZGVkCiAgICAvLyBjYWxsYmFjayBpcyBhIGJpdCB0b28gc2xvdyAoaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjE2NjYpLgogICAgLy8gQnV0IHdlIHJlbHkgb24gaXQgdG8gc3VyZmFjZSBlcnJvcnMgdG8gREVWIHRvb2xzIGxpa2Ugb3ZlcmxheXMKICAgIC8vIChodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIxNzEyKS4KICAgIC8vIEFzIGEgY29tcHJvbWlzZSwgcmV0aHJvdyBvbmx5IGNhdWdodCBlcnJvcnMgaW4gYSBndWFyZC4KICAgIHsKICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGZ1bmN0aW9uICgpIHsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfSk7CiAgICAgIGNsZWFyQ2F1Z2h0RXJyb3IoKTsKICAgIH0KICB9CgogIHZhciBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRXaXRoVGltZXIgPSBmdW5jdGlvbiAoY3VycmVudCwgaW5zdGFuY2UpIHsKICAgIGluc3RhbmNlLnByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzOwogICAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7CgogICAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkgewogICAgICB0cnkgewogICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTsKICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpOwogICAgfQogIH07IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLgoKCiAgZnVuY3Rpb24gc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcikgewogICAgdHJ5IHsKICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQsIGN1cnJlbnQpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpOwogICAgfQogIH0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgdW5tb3VudGluZy4KCgogIGZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSkgewogICAgdHJ5IHsKICAgICAgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyKGN1cnJlbnQsIGluc3RhbmNlKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTsKICAgIH0KICB9IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLgoKCiAgZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudERpZE1vdW50KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKSB7CiAgICB0cnkgewogICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpOwogICAgfQogIH0gLy8gQ2FwdHVyZSBlcnJvcnMgc28gdGhleSBkb24ndCBpbnRlcnJ1cHQgbW91bnRpbmcuCgoKICBmdW5jdGlvbiBzYWZlbHlBdHRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcikgewogICAgdHJ5IHsKICAgICAgY29tbWl0QXR0YWNoUmVmKGN1cnJlbnQpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHsKICAgIHZhciByZWYgPSBjdXJyZW50LnJlZjsKCiAgICBpZiAocmVmICE9PSBudWxsKSB7CiAgICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIHJldFZhbDsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVuYWJsZVByb2ZpbGVyQ29tbWl0SG9va3MgJiYgY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7CiAgICAgICAgICAgICAgcmV0VmFsID0gcmVmKG51bGwpOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXRWYWwgPSByZWYobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTsKICAgICAgICB9CgogICAgICAgIHsKICAgICAgICAgIGlmICh0eXBlb2YgcmV0VmFsID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZSBmcm9tIGEgY2FsbGJhY2sgcmVmIGluICVzLiAnICsgJ0EgY2FsbGJhY2sgcmVmIHNob3VsZCBub3QgcmV0dXJuIGEgZnVuY3Rpb24uJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50KSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSkgewogICAgdHJ5IHsKICAgICAgZGVzdHJveSgpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpOwogICAgfQogIH0KCiAgdmFyIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7CiAgdmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlOwogIGZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaXJzdENoaWxkKSB7CiAgICBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBwcmVwYXJlRm9yQ29tbWl0KHJvb3QuY29udGFpbmVySW5mbyk7CiAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDsKICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpOyAvLyBXZSBubyBsb25nZXIgbmVlZCB0byB0cmFjayB0aGUgYWN0aXZlIGluc3RhbmNlIGZpYmVyCgogICAgdmFyIHNob3VsZEZpcmUgPSBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXI7CiAgICBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTsKICAgIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7CiAgICByZXR1cm4gc2hvdWxkRmlyZTsKICB9CgogIGZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19iZWdpbigpIHsKICAgIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7CiAgICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRoaXMgcGhhc2UgaXMgb25seSB1c2VkIGZvciBiZWZvcmVBY3RpdmVJbnN0YW5jZUJsdXIuCgogICAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDsKCiAgICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgQmVmb3JlTXV0YXRpb25NYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkgewogICAgICAgIGNoaWxkLnJldHVybiA9IGZpYmVyOwogICAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKCkgewogICAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHsKICAgICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsKICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTsKCiAgICAgIHRyeSB7CiAgICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaWJlcik7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpOwogICAgICB9CgogICAgICByZXNldEN1cnJlbnRGaWJlcigpOwogICAgICB2YXIgc2libGluZyA9IGZpYmVyLnNpYmxpbmc7CgogICAgICBpZiAoc2libGluZyAhPT0gbnVsbCkgewogICAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuOwogICAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrKSB7CiAgICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7CiAgICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7CgogICAgaWYgKChmbGFncyAmIFNuYXBzaG90KSAhPT0gTm9GbGFncykgewogICAgICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTsKCiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykgewogICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6CiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOgogICAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDoKICAgICAgICAgIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsKICAgICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlOwogICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSwKICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci4KICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuCgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7CiAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZhciBzbmFwc2hvdCA9IGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSA9PT0gZmluaXNoZWRXb3JrLnR5cGUgPyBwcmV2UHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKGZpbmlzaGVkV29yay50eXBlLCBwcmV2UHJvcHMpLCBwcmV2U3RhdGUpOwoKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXIgZGlkV2FyblNldCA9IGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlOwoKICAgICAgICAgICAgICAgIGlmIChzbmFwc2hvdCA9PT0gdW5kZWZpbmVkICYmICFkaWRXYXJuU2V0LmhhcyhmaW5pc2hlZFdvcmsudHlwZSkpIHsKICAgICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpOwoKICAgICAgICAgICAgICAgICAgZXJyb3IoJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IHNuYXBzaG90OwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgY2FzZSBIb3N0Um9vdDoKICAgICAgICAgIHsKICAgICAgICAgICAgewogICAgICAgICAgICAgIHZhciByb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsKICAgICAgICAgICAgICBjbGVhckNvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgIGNhc2UgSG9zdFRleHQ6CiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOgogICAgICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OgogICAgICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgdGhlc2UgY29tcG9uZW50IHR5cGVzCiAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyAnICsgJ2xpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICAgICAgfQogICAgICB9CgogICAgICByZXNldEN1cnJlbnRGaWJlcigpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KGZsYWdzLCBmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHsKICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTsKICAgIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDsKCiAgICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkgewogICAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7CiAgICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDsKCiAgICAgIGRvIHsKICAgICAgICBpZiAoKGVmZmVjdC50YWcgJiBmbGFncykgPT09IGZsYWdzKSB7CiAgICAgICAgICAvLyBVbm1vdW50CiAgICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95OwogICAgICAgICAgZWZmZWN0LmRlc3Ryb3kgPSB1bmRlZmluZWQ7CgogICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkgewogICAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7CiAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7CiAgICAgICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QodHJ1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpOwoKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHsKICAgICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkgewogICAgICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCgpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7CiAgICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0OwogICAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoZmxhZ3MsIGZpbmlzaGVkV29yaykgewogICAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlOwogICAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsOwoKICAgIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7CiAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDsKICAgICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0OwoKICAgICAgZG8gewogICAgICAgIGlmICgoZWZmZWN0LnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHsKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkgewogICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7CiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspOwogICAgICAgICAgICB9CiAgICAgICAgICB9IC8vIE1vdW50CgoKICAgICAgICAgIHZhciBjcmVhdGUgPSBlZmZlY3QuY3JlYXRlOwoKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkgewogICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdCh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7CgogICAgICAgICAgewogICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7CiAgICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkgewogICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7CiAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgewogICAgICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95OwoKICAgICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZGVzdHJveSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIHZhciBob29rTmFtZSA9IHZvaWQgMDsKCiAgICAgICAgICAgICAgaWYgKChlZmZlY3QudGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncykgewogICAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlTGF5b3V0RWZmZWN0JzsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKChlZmZlY3QudGFnICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncykgewogICAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlRWZmZWN0JzsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZhciBhZGRlbmR1bSA9IHZvaWQgMDsKCiAgICAgICAgICAgICAgaWYgKGRlc3Ryb3kgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlc3Ryb3kudGhlbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgYWRkZW5kdW0gPSAnXG5cbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlICcgKyBob29rTmFtZSArICcoYXN5bmMgKCkgPT4gLi4uKSBvciByZXR1cm5lZCBhIFByb21pc2UuICcgKyAnSW5zdGVhZCwgd3JpdGUgdGhlIGFzeW5jIGZ1bmN0aW9uIGluc2lkZSB5b3VyIGVmZmVjdCAnICsgJ2FuZCBjYWxsIGl0IGltbWVkaWF0ZWx5OlxuXG4nICsgaG9va05hbWUgKyAnKCgpID0+IHtcbicgKyAnICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XG4nICsgJyAgICAvLyBZb3UgY2FuIGF3YWl0IGhlcmVcbicgKyAnICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgTXlBUEkuZ2V0RGF0YShzb21lSWQpO1xuJyArICcgICAgLy8gLi4uXG4nICsgJyAgfVxuJyArICcgIGZldGNoRGF0YSgpO1xuJyArICJ9LCBbc29tZUlkXSk7IC8vIE9yIFtdIGlmIGVmZmVjdCBkb2Vzbid0IG5lZWQgcHJvcHMgb3Igc3RhdGVcblxuIiArICdMZWFybiBtb3JlIGFib3V0IGRhdGEgZmV0Y2hpbmcgd2l0aCBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2hvb2tzLWRhdGEtZmV0Y2hpbmcnOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhZGRlbmR1bSA9ICcgWW91IHJldHVybmVkOiAnICsgZGVzdHJveTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGVycm9yKCclcyBtdXN0IG5vdCByZXR1cm4gYW55dGhpbmcgYmVzaWRlcyBhIGZ1bmN0aW9uLCAnICsgJ3doaWNoIGlzIHVzZWQgZm9yIGNsZWFuLXVwLiVzJywgaG9va05hbWUsIGFkZGVuZHVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7CiAgICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0UGFzc2l2ZUVmZmVjdER1cmF0aW9ucyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykgewogICAgewogICAgICAvLyBPbmx5IFByb2ZpbGVycyB3aXRoIHdvcmsgaW4gdGhlaXIgc3VidHJlZSB3aWxsIGhhdmUgYW4gVXBkYXRlIGVmZmVjdCBzY2hlZHVsZWQuCiAgICAgIGlmICgoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSAhPT0gTm9GbGFncykgewogICAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykgewogICAgICAgICAgY2FzZSBQcm9maWxlcjoKICAgICAgICAgICAgewogICAgICAgICAgICAgIHZhciBwYXNzaXZlRWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbjsKICAgICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsCiAgICAgICAgICAgICAgICAgIGlkID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLmlkLAogICAgICAgICAgICAgICAgICBvblBvc3RDb21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUub25Qb3N0Q29tbWl0OyAvLyBUaGlzIHZhbHVlIHdpbGwgc3RpbGwgcmVmbGVjdCB0aGUgcHJldmlvdXMgY29tbWl0IHBoYXNlLgogICAgICAgICAgICAgIC8vIEl0IGRvZXMgbm90IGdldCByZXNldCB1bnRpbCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY29tbWl0IHBoYXNlLgoKICAgICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTsKICAgICAgICAgICAgICB2YXIgcGhhc2UgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnOwoKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkpIHsKICAgICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uUG9zdENvbW1pdCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgb25Qb3N0Q29tbWl0KGlkLCBwaGFzZSwgcGFzc2l2ZUVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTsKICAgICAgICAgICAgICB9IC8vIEJ1YmJsZSB0aW1lcyB0byB0aGUgbmV4dCBuZWFyZXN0IGFuY2VzdG9yIFByb2ZpbGVyLgogICAgICAgICAgICAgIC8vIEFmdGVyIHdlIHByb2Nlc3MgdGhhdCBQcm9maWxlciwgd2UnbGwgYnViYmxlIGZ1cnRoZXIgdXAuCgoKICAgICAgICAgICAgICB2YXIgcGFyZW50RmliZXIgPSBmaW5pc2hlZFdvcmsucmV0dXJuOwoKICAgICAgICAgICAgICBvdXRlcjogd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykgewogICAgICAgICAgICAgICAgICBjYXNlIEhvc3RSb290OgogICAgICAgICAgICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlOwogICAgICAgICAgICAgICAgICAgIHJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjsKCiAgICAgICAgICAgICAgICAgIGNhc2UgUHJvZmlsZXI6CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFN0YXRlTm9kZSA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTsKICAgICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IHBhc3NpdmVFZmZlY3REdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnJldHVybjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKGZpbmlzaGVkUm9vdCwgY3VycmVudCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcykgewogICAgaWYgKChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncykgewogICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHsKICAgICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OgogICAgICAgIGNhc2UgRm9yd2FyZFJlZjoKICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIGlmICggIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHsKICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGxheW91dCBlZmZlY3RzIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCAoZHVyaW5nIG11dGF0aW9uIHBoYXNlKS4KICAgICAgICAgICAgICAvLyBUaGlzIGlzIGRvbmUgdG8gcHJldmVudCBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLAogICAgICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldAogICAgICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuCiAgICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7CiAgICAgICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspOwogICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDoKICAgICAgICAgIHsKICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsKCiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHsKICAgICAgICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHsKICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSwKICAgICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuCiAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy4KICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTsKICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7CiAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpOwogICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB2YXIgcHJldlByb3BzID0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyk7CiAgICAgICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSwKICAgICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuCiAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy4KCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpOwogICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7CiAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTsKICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGUKICAgICAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay4KCgogICAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7CgogICAgICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHsKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykgewogICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSwKICAgICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci4KICAgICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuCgoKICAgICAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIHVwZGF0ZVF1ZXVlLCBpbnN0YW5jZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICBjYXNlIEhvc3RSb290OgogICAgICAgICAgewogICAgICAgICAgICAvLyBUT0RPOiBJIHRoaW5rIHRoaXMgaXMgbm93IGFsd2F5cyBub24tbnVsbCBieSB0aGUgdGltZSBpdCByZWFjaGVzIHRoZQogICAgICAgICAgICAvLyBjb21taXQgcGhhc2UuIENvbnNpZGVyIHJlbW92aW5nIHRoZSB0eXBlIGNoZWNrLgogICAgICAgICAgICB2YXIgX3VwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlOwoKICAgICAgICAgICAgaWYgKF91cGRhdGVRdWV1ZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSBudWxsOwoKICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHsKICAgICAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDoKICAgICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBfdXBkYXRlUXVldWUsIF9pbnN0YW5jZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UyID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gUmVuZGVyZXJzIG1heSBzY2hlZHVsZSB3b3JrIHRvIGJlIGRvbmUgYWZ0ZXIgaG9zdCBjb21wb25lbnRzIGFyZSBtb3VudGVkCiAgICAgICAgICAgIC8vIChlZyBET00gcmVuZGVyZXIgbWF5IHNjaGVkdWxlIGF1dG8tZm9jdXMgZm9yIGlucHV0cyBhbmQgZm9ybSBjb250cm9scykuCiAgICAgICAgICAgIC8vIFRoZXNlIGVmZmVjdHMgc2hvdWxkIG9ubHkgYmUgY29tbWl0dGVkIHdoZW4gY29tcG9uZW50cyBhcmUgZmlyc3QgbW91bnRlZCwKICAgICAgICAgICAgLy8gYWthIHdoZW4gdGhlcmUgaXMgbm8gY3VycmVudC9hbHRlcm5hdGUuCgogICAgICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiBmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHsKICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlOwogICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOwogICAgICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGNhc2UgSG9zdFRleHQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHRleHQuCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICBjYXNlIEhvc3RQb3J0YWw6CiAgICAgICAgICB7CiAgICAgICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHBvcnRhbHMuCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICBjYXNlIFByb2ZpbGVyOgogICAgICAgICAgewogICAgICAgICAgICB7CiAgICAgICAgICAgICAgdmFyIF9maW5pc2hlZFdvcmskbWVtb2l6ZTIgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcywKICAgICAgICAgICAgICAgICAgb25Db21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uQ29tbWl0LAogICAgICAgICAgICAgICAgICBvblJlbmRlciA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25SZW5kZXI7CiAgICAgICAgICAgICAgdmFyIGVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbjsKICAgICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTsKICAgICAgICAgICAgICB2YXIgcGhhc2UgPSBjdXJyZW50ID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnOwoKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoaXNDdXJyZW50VXBkYXRlTmVzdGVkKCkpIHsKICAgICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAodHlwZW9mIG9uUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICBvblJlbmRlcihmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGZpbmlzaGVkV29yay5hY3R1YWxEdXJhdGlvbiwgZmluaXNoZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24sIGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUsIGNvbW1pdFRpbWUpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvbkNvbW1pdCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICBvbkNvbW1pdChmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTsKICAgICAgICAgICAgICAgIH0gLy8gU2NoZWR1bGUgYSBwYXNzaXZlIGVmZmVjdCBmb3IgdGhpcyBQcm9maWxlciB0byBjYWxsIG9uUG9zdENvbW1pdCBob29rcy4KICAgICAgICAgICAgICAgIC8vIFRoaXMgZWZmZWN0IHNob3VsZCBiZSBzY2hlZHVsZWQgZXZlbiBpZiB0aGVyZSBpcyBubyBvblBvc3RDb21taXQgY2FsbGJhY2sgZm9yIHRoaXMgUHJvZmlsZXIsCiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBlZmZlY3QgaXMgYWxzbyB3aGVyZSB0aW1lcyBidWJibGUgdG8gcGFyZW50IFByb2ZpbGVycy4KCgogICAgICAgICAgICAgICAgZW5xdWV1ZVBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3QoZmluaXNoZWRXb3JrKTsgLy8gUHJvcGFnYXRlIGxheW91dCBlZmZlY3QgZHVyYXRpb25zIHRvIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3IuCiAgICAgICAgICAgICAgICAvLyBEbyBub3QgcmVzZXQgdGhlc2UgdmFsdWVzIHVudGlsIHRoZSBuZXh0IHJlbmRlciBzbyBEZXZUb29scyBoYXMgYSBjaGFuY2UgdG8gcmVhZCB0aGVtIGZpcnN0LgoKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47CgogICAgICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykgewogICAgICAgICAgICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6CiAgICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTsKICAgICAgICAgICAgICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBQcm9maWxlcjoKICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7CiAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRTdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz0gZWZmZWN0RHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDoKICAgICAgICAgIHsKICAgICAgICAgICAgY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6CiAgICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6CiAgICAgICAgY2FzZSBTY29wZUNvbXBvbmVudDoKICAgICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDoKICAgICAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDoKICAgICAgICBjYXNlIFRyYWNpbmdNYXJrZXJDb21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyAnICsgJ2xpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICB9CiAgICB9CgogICAgaWYgKCAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikgewogICAgICB7CiAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFJlZikgewogICAgICAgICAgY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yayk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZWFwcGVhckxheW91dEVmZmVjdHNPbkZpYmVyKG5vZGUpIHsKICAgIC8vIFR1cm4gb24gbGF5b3V0IGVmZmVjdHMgaW4gYSB0cmVlIHRoYXQgcHJldmlvdXNseSBkaXNhcHBlYXJlZC4KICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljCiAgICBzd2l0Y2ggKG5vZGUudGFnKSB7CiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6CiAgICAgIGNhc2UgRm9yd2FyZFJlZjoKICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIGlmICggbm9kZS5tb2RlICYgUHJvZmlsZU1vZGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7CiAgICAgICAgICAgICAgc2FmZWx5Q2FsbENvbW1pdEhvb2tMYXlvdXRFZmZlY3RMaXN0TW91bnQobm9kZSwgbm9kZS5yZXR1cm4pOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChub2RlLCBub2RlLnJldHVybik7CiAgICAgICAgICB9CgogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTsKCiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnREaWRNb3VudChub2RlLCBub2RlLnJldHVybiwgaW5zdGFuY2UpOwogICAgICAgICAgfQoKICAgICAgICAgIHNhZmVseUF0dGFjaFJlZihub2RlLCBub2RlLnJldHVybik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlIEhvc3RDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgc2FmZWx5QXR0YWNoUmVmKG5vZGUsIG5vZGUucmV0dXJuKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKGZpbmlzaGVkV29yaywgaXNIaWRkZW4pIHsKICAgIC8vIE9ubHkgaGlkZSBvciB1bmhpZGUgdGhlIHRvcC1tb3N0IGhvc3Qgbm9kZXMuCiAgICB2YXIgaG9zdFN1YnRyZWVSb290ID0gbnVsbDsKCiAgICB7CiAgICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHMKICAgICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLgogICAgICB2YXIgbm9kZSA9IGZpbmlzaGVkV29yazsKCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7CiAgICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7CiAgICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG5vZGU7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlOwoKICAgICAgICAgICAgICBpZiAoaXNIaWRkZW4pIHsKICAgICAgICAgICAgICAgIGhpZGVJbnN0YW5jZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVuaGlkZUluc3RhbmNlKG5vZGUuc3RhdGVOb2RlLCBub2RlLm1lbW9pemVkUHJvcHMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RUZXh0KSB7CiAgICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTMgPSBub2RlLnN0YXRlTm9kZTsKCiAgICAgICAgICAgICAgaWYgKGlzSGlkZGVuKSB7CiAgICAgICAgICAgICAgICBoaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1bmhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMywgbm9kZS5tZW1vaXplZFByb3BzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKChub2RlLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50IHx8IG5vZGUudGFnID09PSBMZWdhY3lIaWRkZW5Db21wb25lbnQpICYmIG5vZGUubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCAmJiBub2RlICE9PSBmaW5pc2hlZFdvcmspIDsgZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkgewogICAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlOwogICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHsKICAgICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBub2RlKSB7CiAgICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7CiAgICAgICAgICB9CgogICAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbm9kZSkgewogICAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjsKICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7CiAgICB2YXIgcmVmID0gZmluaXNoZWRXb3JrLnJlZjsKCiAgICBpZiAocmVmICE9PSBudWxsKSB7CiAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7CiAgICAgIHZhciBpbnN0YW5jZVRvVXNlOwoKICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7CiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGluc3RhbmNlOwogICAgICB9IC8vIE1vdmVkIG91dHNpZGUgdG8gZW5zdXJlIERDRSB3b3JrcyB3aXRoIHRoaXMgZmxhZwoKICAgICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB2YXIgcmV0VmFsOwoKICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTsKICAgICAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpOwogICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0VmFsID0gcmVmKGluc3RhbmNlVG9Vc2UpOwogICAgICAgIH0KCiAgICAgICAgewogICAgICAgICAgaWYgKHR5cGVvZiByZXRWYWwgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsYmFjayByZWYgaW4gJXMuICcgKyAnQSBjYWxsYmFjayByZWYgc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbi4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB7CiAgICAgICAgICBpZiAoIXJlZi5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpKSB7CiAgICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiAnICsgJ1VzZSBlaXRoZXIgYSByZWYtc2V0dGVyIGZ1bmN0aW9uIG9yIFJlYWN0LmNyZWF0ZVJlZigpLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2U7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGRldGFjaEZpYmVyTXV0YXRpb24oZmliZXIpIHsKICAgIC8vIEN1dCBvZmYgdGhlIHJldHVybiBwb2ludGVyIHRvIGRpc2Nvbm5lY3QgaXQgZnJvbSB0aGUgdHJlZS4KICAgIC8vIFRoaXMgZW5hYmxlcyB1cyB0byBkZXRlY3QgYW5kIHdhcm4gYWdhaW5zdCBzdGF0ZSB1cGRhdGVzIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuCiAgICAvLyBJdCBhbHNvIHByZXZlbnRzIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIGZyb20gd2l0aGluIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzLgogICAgLy8KICAgIC8vIElkZWFsbHksIHdlIHNob3VsZCBhbHNvIGNsZWFyIHRoZSBjaGlsZCBwb2ludGVyIG9mIHRoZSBwYXJlbnQgYWx0ZXJuYXRlIHRvIGxldCB0aGlzCiAgICAvLyBnZXQgR0M6ZWQgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggZm9yIHN1cmUgd2hpY2ggcGFyZW50IGlzIHRoZSBjdXJyZW50CiAgICAvLyBvbmUgc28gd2UnbGwgc2V0dGxlIGZvciBHQzppbmcgdGhlIHN1YnRyZWUgb2YgdGhpcyBjaGlsZC4KICAgIC8vIFRoaXMgY2hpbGQgaXRzZWxmIHdpbGwgYmUgR0M6ZWQgd2hlbiB0aGUgcGFyZW50IHVwZGF0ZXMgdGhlIG5leHQgdGltZS4KICAgIC8vCiAgICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY2xlYXIgY2hpbGQgb3Igc2libGluZyBwb2ludGVycyB5ZXQuCiAgICAvLyBUaGV5J3JlIG5lZWRlZCBmb3IgcGFzc2l2ZSBlZmZlY3RzIGFuZCBmb3IgZmluZERPTU5vZGUuCiAgICAvLyBXZSBkZWZlciB0aG9zZSBmaWVsZHMsIGFuZCBhbGwgb3RoZXIgY2xlYW51cCwgdG8gdGhlIHBhc3NpdmUgcGhhc2UgKHNlZSBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cykuCiAgICAvLwogICAgLy8gRG9uJ3QgcmVzZXQgdGhlIGFsdGVybmF0ZSB5ZXQsIGVpdGhlci4gV2UgbmVlZCB0aGF0IHNvIHdlIGNhbiBkZXRhY2ggdGhlCiAgICAvLyBhbHRlcm5hdGUncyBmaWVsZHMgaW4gdGhlIHBhc3NpdmUgcGhhc2UuIENsZWFyaW5nIHRoZSByZXR1cm4gcG9pbnRlciBpcwogICAgLy8gc3VmZmljaWVudCBmb3IgZmluZERPTU5vZGUgc2VtYW50aWNzLgogICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTsKCiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7CiAgICAgIGFsdGVybmF0ZS5yZXR1cm4gPSBudWxsOwogICAgfQoKICAgIGZpYmVyLnJldHVybiA9IG51bGw7CiAgfQoKICBmdW5jdGlvbiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcikgewogICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTsKCiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7CiAgICAgIGZpYmVyLmFsdGVybmF0ZSA9IG51bGw7CiAgICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGFsdGVybmF0ZSk7CiAgICB9IC8vIE5vdGU6IERlZmVuc2l2ZWx5IHVzaW5nIG5lZ2F0aW9uIGluc3RlYWQgb2YgPCBpbiBjYXNlCiAgICAvLyBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGlzIHVuZGVmaW5lZC4KCgogICAgewogICAgICAvLyBDbGVhciBjeWNsaWNhbCBGaWJlciBmaWVsZHMuIFRoaXMgbGV2ZWwgYWxvbmUgaXMgZGVzaWduZWQgdG8gcm91Z2hseQogICAgICAvLyBhcHByb3hpbWF0ZSB0aGUgcGxhbm5lZCBGaWJlciByZWZhY3Rvci4gSW4gdGhhdCB3b3JsZCwgYHNldFN0YXRlYCB3aWxsIGJlCiAgICAgIC8vIGJvdW5kIHRvIGEgc3BlY2lhbCAiaW5zdGFuY2UiIG9iamVjdCBpbnN0ZWFkIG9mIGEgRmliZXIuIFRoZSBJbnN0YW5jZQogICAgICAvLyBvYmplY3Qgd2lsbCBub3QgaGF2ZSBhbnkgb2YgdGhlc2UgZmllbGRzLiBJdCB3aWxsIG9ubHkgYmUgY29ubmVjdGVkIHRvCiAgICAgIC8vIHRoZSBmaWJlciB0cmVlIHZpYSBhIHNpbmdsZSBsaW5rIGF0IHRoZSByb290LiBTbyBpZiB0aGlzIGxldmVsIGFsb25lIGlzCiAgICAgIC8vIHN1ZmZpY2llbnQgdG8gZml4IG1lbW9yeSBpc3N1ZXMsIHRoYXQgYm9kZXMgd2VsbCBmb3Igb3VyIHBsYW5zLgogICAgICBmaWJlci5jaGlsZCA9IG51bGw7CiAgICAgIGZpYmVyLmRlbGV0aW9ucyA9IG51bGw7CiAgICAgIGZpYmVyLnNpYmxpbmcgPSBudWxsOyAvLyBUaGUgYHN0YXRlTm9kZWAgaXMgY3ljbGljYWwgYmVjYXVzZSBvbiBob3N0IG5vZGVzIGl0IHBvaW50cyB0byB0aGUgaG9zdAogICAgICAvLyB0cmVlLCB3aGljaCBoYXMgaXRzIG93biBwb2ludGVycyB0byBjaGlsZHJlbiwgcGFyZW50cywgYW5kIHNpYmxpbmdzLgogICAgICAvLyBUaGUgb3RoZXIgaG9zdCBub2RlcyBhbHNvIHBvaW50IGJhY2sgdG8gZmliZXJzLCBzbyB3ZSBzaG91bGQgZGV0YWNoIHRoYXQKICAgICAgLy8gb25lLCB0b28uCgogICAgICBpZiAoZmliZXIudGFnID09PSBIb3N0Q29tcG9uZW50KSB7CiAgICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTsKCiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZSAhPT0gbnVsbCkgewogICAgICAgICAgZGV0YWNoRGVsZXRlZEluc3RhbmNlKGhvc3RJbnN0YW5jZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBJJ20gaW50ZW50aW9uYWxseSBub3QgY2xlYXJpbmcgdGhlIGByZXR1cm5gIGZpZWxkIGluIHRoaXMgbGV2ZWwuIFdlCiAgICAgIC8vIGFscmVhZHkgZGlzY29ubmVjdCB0aGUgYHJldHVybmAgcG9pbnRlciBhdCB0aGUgcm9vdCBvZiB0aGUgZGVsZXRlZAogICAgICAvLyBzdWJ0cmVlIChpbiBgZGV0YWNoRmliZXJNdXRhdGlvbmApLiBCZXNpZGVzLCBgcmV0dXJuYCBieSBpdHNlbGYgaXMgbm90CiAgICAgIC8vIGN5Y2xpY2FsIOKAlCBpdCdzIG9ubHkgY3ljbGljYWwgd2hlbiBjb21iaW5lZCB3aXRoIGBjaGlsZGAsIGBzaWJsaW5nYCwgYW5kCiAgICAgIC8vIGBhbHRlcm5hdGVgLiBCdXQgd2UnbGwgY2xlYXIgaXQgaW4gdGhlIG5leHQgbGV2ZWwgYW55d2F5LCBqdXN0IGluIGNhc2UuCgogICAgICB7CiAgICAgICAgZmliZXIuX2RlYnVnT3duZXIgPSBudWxsOwogICAgICB9CgogICAgICB7CiAgICAgICAgLy8gVGhlb3JldGljYWxseSwgbm90aGluZyBpbiBoZXJlIHNob3VsZCBiZSBuZWNlc3NhcnksIGJlY2F1c2Ugd2UgYWxyZWFkeQogICAgICAgIC8vIGRpc2Nvbm5lY3RlZCB0aGUgZmliZXIgZnJvbSB0aGUgdHJlZS4gU28gZXZlbiBpZiBzb21ldGhpbmcgbGVha3MgdGhpcwogICAgICAgIC8vIHBhcnRpY3VsYXIgZmliZXIsIGl0IHdvbid0IGxlYWsgYW55dGhpbmcgZWxzZQogICAgICAgIC8vCiAgICAgICAgLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBicmFuY2ggaXMgdG8gYmUgc3VwZXIgYWdncmVzc2l2ZSBzbyB3ZSBjYW4gbWVhc3VyZQogICAgICAgIC8vIGlmIHRoZXJlJ3MgYW55IGRpZmZlcmVuY2UgaW4gbWVtb3J5IGltcGFjdC4gSWYgdGhlcmUgaXMsIHRoYXQgY291bGQKICAgICAgICAvLyBpbmRpY2F0ZSBhIFJlYWN0IGxlYWsgd2UgZG9uJ3Qga25vdyBhYm91dC4KICAgICAgICBmaWJlci5yZXR1cm4gPSBudWxsOwogICAgICAgIGZpYmVyLmRlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IG51bGw7CiAgICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7CiAgICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gbnVsbDsKICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBUT0RPOiBNb3ZlIHRvIGBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcmAgaW5zdGVhZC4KCiAgICAgICAgZmliZXIudXBkYXRlUXVldWUgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRIb3N0UGFyZW50RmliZXIoZmliZXIpIHsKICAgIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47CgogICAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkgewogICAgICBpZiAoaXNIb3N0UGFyZW50KHBhcmVudCkpIHsKICAgICAgICByZXR1cm4gcGFyZW50OwogICAgICB9CgogICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuOwogICAgfQoKICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7CiAgfQoKICBmdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHsKICAgIHJldHVybiBmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgZmliZXIudGFnID09PSBIb3N0Um9vdCB8fCBmaWJlci50YWcgPT09IEhvc3RQb3J0YWw7CiAgfQoKICBmdW5jdGlvbiBnZXRIb3N0U2libGluZyhmaWJlcikgewogICAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0CiAgICAvLyBub2RlLiBVbmZvcnR1bmF0ZWx5LCBpZiBtdWx0aXBsZSBpbnNlcnRpb25zIGFyZSBkb25lIGluIGEgcm93IHdlIGhhdmUgdG8KICAgIC8vIHNlYXJjaCBwYXN0IHRoZW0uIFRoaXMgbGVhZHMgdG8gZXhwb25lbnRpYWwgc2VhcmNoIGZvciB0aGUgbmV4dCBzaWJsaW5nLgogICAgLy8gVE9ETzogRmluZCBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzLgogICAgdmFyIG5vZGUgPSBmaWJlcjsKCiAgICBzaWJsaW5nczogd2hpbGUgKHRydWUpIHsKICAgICAgLy8gSWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmcsIGxldCdzIHRyeSB0aGUgbmV4dCBzaWJsaW5nLgogICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7CiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IGlzSG9zdFBhcmVudChub2RlLnJldHVybikpIHsKICAgICAgICAgIC8vIElmIHdlIHBvcCBvdXQgb2YgdGhlIHJvb3Qgb3IgaGl0IHRoZSBwYXJlbnQgdGhlIGZpYmVyIHdlIGFyZSB0aGUKICAgICAgICAgIC8vIGxhc3Qgc2libGluZy4KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuOwogICAgICB9CgogICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47CiAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7CgogICAgICB3aGlsZSAobm9kZS50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgbm9kZS50YWcgIT09IEhvc3RUZXh0ICYmIG5vZGUudGFnICE9PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHsKICAgICAgICAvLyBJZiBpdCBpcyBub3QgaG9zdCBub2RlIGFuZCwgd2UgbWlnaHQgaGF2ZSBhIGhvc3Qgbm9kZSBpbnNpZGUgaXQuCiAgICAgICAgLy8gVHJ5IHRvIHNlYXJjaCBkb3duIHVudGlsIHdlIGZpbmQgb25lLgogICAgICAgIGlmIChub2RlLmZsYWdzICYgUGxhY2VtZW50KSB7CiAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC4KICAgICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzOwogICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuCiAgICAgICAgLy8gV2UgYWxzbyBza2lwIHBvcnRhbHMgYmVjYXVzZSB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGlzIGhvc3QgdHJlZS4KCgogICAgICAgIGlmIChub2RlLmNoaWxkID09PSBudWxsIHx8IG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSB7CiAgICAgICAgICBjb250aW51ZSBzaWJsaW5nczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlOwogICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7CiAgICAgICAgfQogICAgICB9IC8vIENoZWNrIGlmIHRoaXMgaG9zdCBub2RlIGlzIHN0YWJsZSBvciBhYm91dCB0byBiZSBwbGFjZWQuCgoKICAgICAgaWYgKCEobm9kZS5mbGFncyAmIFBsYWNlbWVudCkpIHsKICAgICAgICAvLyBGb3VuZCBpdCEKICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspIHsKCgogICAgdmFyIHBhcmVudEZpYmVyID0gZ2V0SG9zdFBhcmVudEZpYmVyKGZpbmlzaGVkV29yayk7IC8vIE5vdGU6IHRoZXNlIHR3byB2YXJpYWJsZXMgKm11c3QqIGFsd2F5cyBiZSB1cGRhdGVkIHRvZ2V0aGVyLgoKICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7CiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlOwoKICAgICAgICAgIGlmIChwYXJlbnRGaWJlci5mbGFncyAmIENvbnRlbnRSZXNldCkgewogICAgICAgICAgICAvLyBSZXNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgYmVmb3JlIGRvaW5nIGFueSBpbnNlcnRpb25zCiAgICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQocGFyZW50KTsgLy8gQ2xlYXIgQ29udGVudFJlc2V0IGZyb20gdGhlIGVmZmVjdCB0YWcKCiAgICAgICAgICAgIHBhcmVudEZpYmVyLmZsYWdzICY9IH5Db250ZW50UmVzZXQ7CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIGJlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7IC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHMKICAgICAgICAgIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy4KCiAgICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoZmluaXNoZWRXb3JrLCBiZWZvcmUsIHBhcmVudCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlIEhvc3RSb290OgogICAgICBjYXNlIEhvc3RQb3J0YWw6CiAgICAgICAgewogICAgICAgICAgdmFyIF9wYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzsKCiAgICAgICAgICB2YXIgX2JlZm9yZSA9IGdldEhvc3RTaWJsaW5nKGZpbmlzaGVkV29yayk7CgogICAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihmaW5pc2hlZFdvcmssIF9iZWZvcmUsIF9wYXJlbnQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2gKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvc3QgcGFyZW50IGZpYmVyLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7CiAgICB2YXIgdGFnID0gbm9kZS50YWc7CiAgICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7CgogICAgaWYgKGlzSG9zdCkgewogICAgICB2YXIgc3RhdGVOb2RlID0gbm9kZS5zdGF0ZU5vZGU7CgogICAgICBpZiAoYmVmb3JlKSB7CiAgICAgICAgaW5zZXJ0SW5Db250YWluZXJCZWZvcmUocGFyZW50LCBzdGF0ZU5vZGUsIGJlZm9yZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIHN0YXRlTm9kZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgewogICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkOwoKICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihjaGlsZCwgYmVmb3JlLCBwYXJlbnQpOwogICAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZzsKCiAgICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHsKICAgICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoc2libGluZywgYmVmb3JlLCBwYXJlbnQpOwogICAgICAgICAgc2libGluZyA9IHNpYmxpbmcuc2libGluZzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShub2RlLCBiZWZvcmUsIHBhcmVudCkgewogICAgdmFyIHRhZyA9IG5vZGUudGFnOwogICAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0OwoKICAgIGlmIChpc0hvc3QpIHsKICAgICAgdmFyIHN0YXRlTm9kZSA9IG5vZGUuc3RhdGVOb2RlOwoKICAgICAgaWYgKGJlZm9yZSkgewogICAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhcHBlbmRDaGlsZChwYXJlbnQsIHN0YXRlTm9kZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgewogICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkOwoKICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7CiAgICAgICAgdmFyIHNpYmxpbmcgPSBjaGlsZC5zaWJsaW5nOwoKICAgICAgICB3aGlsZSAoc2libGluZyAhPT0gbnVsbCkgewogICAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKHNpYmxpbmcsIGJlZm9yZSwgcGFyZW50KTsKICAgICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSAvLyBUaGVzZSBhcmUgdHJhY2tlZCBvbiB0aGUgc3RhY2sgYXMgd2UgcmVjdXJzaXZlbHkgdHJhdmVyc2UgYQogIC8vIGRlbGV0ZWQgc3VidHJlZS4KICAvLyBUT0RPOiBVcGRhdGUgdGhlc2UgZHVyaW5nIHRoZSB3aG9sZSBtdXRhdGlvbiBwaGFzZSwgbm90IGp1c3QgZHVyaW5nCiAgLy8gYSBkZWxldGlvbi4KCgogIHZhciBob3N0UGFyZW50ID0gbnVsbDsKICB2YXIgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7CgogIGZ1bmN0aW9uIGNvbW1pdERlbGV0aW9uRWZmZWN0cyhyb290LCByZXR1cm5GaWJlciwgZGVsZXRlZEZpYmVyKSB7CiAgICB7CiAgICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGRlbGV0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0cwogICAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuCiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQsIGRldGFjaCByZWZzLCBjbGVhbgogICAgICAvLyB1cCBtb3VudGVkIGxheW91dCBlZmZlY3RzLCBhbmQgY2FsbCBjb21wb25lbnRXaWxsVW5tb3VudC4KICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgdG9wbW9zdCBob3N0IGNoaWxkIGluIGVhY2ggYnJhbmNoLiBCdXQgdGhlbiB3ZQogICAgICAvLyBzdGlsbCBuZWVkIHRvIGtlZXAgdHJhdmVyc2luZyB0byB1bm1vdW50IGVmZmVjdHMsIHJlZnMsIGFuZCBjV1UuIFRPRE86IFdlCiAgICAgIC8vIGNvdWxkIHNwbGl0IHRoaXMgaW50byB0d28gc2VwYXJhdGUgdHJhdmVyc2FscyBmdW5jdGlvbnMsIHdoZXJlIHRoZSBzZWNvbmQKICAgICAgLy8gb25lIGRvZXNuJ3QgaW5jbHVkZSBhbnkgcmVtb3ZlQ2hpbGQgbG9naWMuIFRoaXMgaXMgbWF5YmUgdGhlIHNhbWUKICAgICAgLy8gZnVuY3Rpb24gYXMgImRpc2FwcGVhckxheW91dEVmZmVjdHMiIChvciB3aGF0ZXZlciB0aGF0IHR1cm5zIGludG8gYWZ0ZXIKICAgICAgLy8gdGhlIGxheW91dCBwaGFzZSBpcyByZWZhY3RvcmVkIHRvIHVzZSByZWN1cnNpb24pLgogICAgICAvLyBCZWZvcmUgc3RhcnRpbmcsIGZpbmQgdGhlIG5lYXJlc3QgaG9zdCBwYXJlbnQgb24gdGhlIHN0YWNrIHNvIHdlIGtub3cKICAgICAgLy8gd2hpY2ggaW5zdGFuY2UvY29udGFpbmVyIHRvIHJlbW92ZSB0aGUgY2hpbGRyZW4gZnJvbS4KICAgICAgLy8gVE9ETzogSW5zdGVhZCBvZiBzZWFyY2hpbmcgdXAgdGhlIGZpYmVyIHJldHVybiBwYXRoIG9uIGV2ZXJ5IGRlbGV0aW9uLCB3ZQogICAgICAvLyBjYW4gdHJhY2sgdGhlIG5lYXJlc3QgaG9zdCBjb21wb25lbnQgb24gdGhlIEpTIHN0YWNrIGFzIHdlIHRyYXZlcnNlIHRoZQogICAgICAvLyB0cmVlIGR1cmluZyB0aGUgY29tbWl0IHBoYXNlLiBUaGlzIHdvdWxkIG1ha2UgaW5zZXJ0aW9ucyBmYXN0ZXIsIHRvby4KICAgICAgdmFyIHBhcmVudCA9IHJldHVybkZpYmVyOwoKICAgICAgZmluZFBhcmVudDogd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkgewogICAgICAgIHN3aXRjaCAocGFyZW50LnRhZykgewogICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGU7CiAgICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gZmFsc2U7CiAgICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgIGNhc2UgSG9zdFJvb3Q6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBob3N0UGFyZW50ID0gcGFyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvOwogICAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgIGNhc2UgSG9zdFBvcnRhbDoKICAgICAgICAgICAgewogICAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87CiAgICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTsKICAgICAgICAgICAgICBicmVhayBmaW5kUGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuOwogICAgICB9CgogICAgICBpZiAoaG9zdFBhcmVudCA9PT0gbnVsbCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgJyArICdhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7CiAgICAgIH0KCiAgICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcik7CiAgICAgIGhvc3RQYXJlbnQgPSBudWxsOwogICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTsKICAgIH0KCiAgICBkZXRhY2hGaWJlck11dGF0aW9uKGRlbGV0ZWRGaWJlcik7CiAgfQoKICBmdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgcGFyZW50KSB7CiAgICAvLyBUT0RPOiBVc2UgYSBzdGF0aWMgZmxhZyB0byBza2lwIHRyZWVzIHRoYXQgZG9uJ3QgaGF2ZSB1bm1vdW50IGVmZmVjdHMKICAgIHZhciBjaGlsZCA9IHBhcmVudC5jaGlsZDsKCiAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHsKICAgICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGNoaWxkKTsKICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcikgewogICAgb25Db21taXRVbm1vdW50KGRlbGV0ZWRGaWJlcik7IC8vIFRoZSBjYXNlcyBpbiB0aGlzIG91dGVyIHN3aXRjaCBtb2RpZnkgdGhlIHN0YWNrIGJlZm9yZSB0aGV5IHRyYXZlcnNlCiAgICAvLyBpbnRvIHRoZWlyIHN1YnRyZWUuIFRoZXJlIGFyZSBzaW1wbGVyIGNhc2VzIGluIHRoZSBpbm5lciBzd2l0Y2gKICAgIC8vIHRoYXQgZG9uJ3QgbW9kaWZ5IHRoZSBzdGFjay4KCiAgICBzd2l0Y2ggKGRlbGV0ZWRGaWJlci50YWcpIHsKICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikgewogICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTsKICAgICAgICAgIH0gLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggdG8gbmV4dCBicmFuY2gKCiAgICAgICAgfQogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2gKCiAgICAgIGNhc2UgSG9zdFRleHQ6CiAgICAgICAgewogICAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlbW92ZSB0aGUgbmVhcmVzdCBob3N0IGNoaWxkLiBTZXQgdGhlIGhvc3QgcGFyZW50CiAgICAgICAgICAvLyB0byBgbnVsbGAgb24gdGhlIHN0YWNrIHRvIGluZGljYXRlIHRoYXQgbmVzdGVkIGNoaWxkcmVuIGRvbid0CiAgICAgICAgICAvLyBuZWVkIHRvIGJlIHJlbW92ZWQuCiAgICAgICAgICB7CiAgICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7CiAgICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyOwogICAgICAgICAgICBob3N0UGFyZW50ID0gbnVsbDsKICAgICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7CiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDsKICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjsKCiAgICAgICAgICAgIGlmIChob3N0UGFyZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgLy8gTm93IHRoYXQgYWxsIHRoZSBjaGlsZCBlZmZlY3RzIGhhdmUgdW5tb3VudGVkLCB3ZSBjYW4gcmVtb3ZlIHRoZQogICAgICAgICAgICAgIC8vIG5vZGUgZnJvbSB0aGUgdHJlZS4KICAgICAgICAgICAgICBpZiAoaG9zdFBhcmVudElzQ29udGFpbmVyKSB7CiAgICAgICAgICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlbW92ZUNoaWxkKGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDoKICAgICAgICB7CiAgICAgICAgICAvLyBEZWxldGUgdGhlIGRlaHlkcmF0ZWQgc3VzcGVuc2UgYm91bmRhcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudC4KCgogICAgICAgICAgewogICAgICAgICAgICBpZiAoaG9zdFBhcmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgIGlmIChob3N0UGFyZW50SXNDb250YWluZXIpIHsKICAgICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgY2FzZSBIb3N0UG9ydGFsOgogICAgICAgIHsKICAgICAgICAgIHsKICAgICAgICAgICAgLy8gV2hlbiB3ZSBnbyBpbnRvIGEgcG9ydGFsLCBpdCBiZWNvbWVzIHRoZSBwYXJlbnQgdG8gcmVtb3ZlIGZyb20uCiAgICAgICAgICAgIHZhciBfcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50OwogICAgICAgICAgICB2YXIgX3ByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7CiAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87CiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7CiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpOwogICAgICAgICAgICBob3N0UGFyZW50ID0gX3ByZXZIb3N0UGFyZW50OwogICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBfcHJldkhvc3RQYXJlbnRJc0NvbnRhaW5lcjsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDoKICAgICAgY2FzZSBGb3J3YXJkUmVmOgogICAgICBjYXNlIE1lbW9Db21wb25lbnQ6CiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHsKICAgICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZGVsZXRlZEZpYmVyLnVwZGF0ZVF1ZXVlOwoKICAgICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0OwoKICAgICAgICAgICAgICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0OwogICAgICAgICAgICAgICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0OwoKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgdmFyIF9lZmZlY3QgPSBlZmZlY3QsCiAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95ID0gX2VmZmVjdC5kZXN0cm95LAogICAgICAgICAgICAgICAgICAgICAgdGFnID0gX2VmZmVjdC50YWc7CgogICAgICAgICAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0YWcgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGFnICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7CiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChkZWxldGVkRmliZXIpOwogICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgIGlmICggZGVsZXRlZEZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGRlbGV0ZWRGaWJlcik7CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpOwogICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdG9wcGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgaWYgKCFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7CiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpOwogICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGluc3RhbmNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6CiAgICAgICAgewoKICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnCiAgICAgICAgICAgZGVsZXRlZEZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgewogICAgICAgICAgICAvLyBJZiB0aGlzIG9mZnNjcmVlbiBjb21wb25lbnQgaXMgaGlkZGVuLCB3ZSBhbHJlYWR5IHVubW91bnRlZCBpdC4gQmVmb3JlCiAgICAgICAgICAgIC8vIGRlbGV0aW5nIHRoZSBjaGlsZHJlbiwgdHJhY2sgdGhhdCBpdCdzIGFscmVhZHkgdW5tb3VudGVkIHNvIHRoYXQgd2UKICAgICAgICAgICAgLy8gZG9uJ3QgYXR0ZW1wdCB0byB1bm1vdW50IHRoZSBlZmZlY3RzIGFnYWluLgogICAgICAgICAgICAvLyBUT0RPOiBJZiB0aGUgdHJlZSBpcyBoaWRkZW4sIGluIG1vc3QgY2FzZXMgd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2tpcAogICAgICAgICAgICAvLyBvdmVyIHRoZSBuZXN0ZWQgY2hpbGRyZW4gZW50aXJlbHkuIEFuIGV4Y2VwdGlvbiBpcyB3ZSBoYXZlbid0IHlldCBmb3VuZAogICAgICAgICAgICAvLyB0aGUgdG9wbW9zdCBob3N0IG5vZGUgdG8gZGVsZXRlLCB3aGljaCB3ZSBhbHJlYWR5IHRyYWNrIG9uIHRoZSBzdGFjay4KICAgICAgICAgICAgLy8gQnV0IHRoZSBvdGhlciBjYXNlIGlzIHBvcnRhbHMsIHdoaWNoIG5lZWQgdG8gYmUgZGV0YWNoZWQgbm8gbWF0dGVyIGhvdwogICAgICAgICAgICAvLyBkZWVwbHkgdGhleSBhcmUgbmVzdGVkLiBXZSBzaG91bGQgdXNlIGEgc3VidHJlZSBmbGFnIHRvIHRyYWNrIHdoZXRoZXIgYQogICAgICAgICAgICAvLyBzdWJ0cmVlIGluY2x1ZGVzIGEgbmVzdGVkIHBvcnRhbC4KICAgICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjsKICAgICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsOwogICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTsKICAgICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7CiAgICAgICAgICB9CgogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgZGVmYXVsdDoKICAgICAgICB7CiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21taXRTdXNwZW5zZUNhbGxiYWNrKGZpbmlzaGVkV29yaykgewogICAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIHBhc3NpdmUgcGhhc2UKICAgIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlOwogIH0KCiAgZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHsKCiAgICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTsKCiAgICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHsKICAgICAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlOwoKICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHsKICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlOwoKICAgICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7CiAgICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkOwoKICAgICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7CiAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKSB7CiAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGp1c3QgdGltZWQgb3V0LCB0aGVuIGl0IHdpbGwgaGF2ZSBhIHNldCBvZiB3YWtlYWJsZXMuCiAgICAvLyBGb3IgZWFjaCB3YWtlYWJsZSwgYXR0YWNoIGEgbGlzdGVuZXIgc28gdGhhdCB3aGVuIGl0IHJlc29sdmVzLCBSZWFjdAogICAgLy8gYXR0ZW1wdHMgdG8gcmUtcmVuZGVyIHRoZSBib3VuZGFyeSBpbiB0aGUgcHJpbWFyeSAocHJlLXRpbWVvdXQpIHN0YXRlLgogICAgdmFyIHdha2VhYmxlcyA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTsKCiAgICBpZiAod2FrZWFibGVzICE9PSBudWxsKSB7CiAgICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7CiAgICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsKCiAgICAgIGlmIChyZXRyeUNhY2hlID09PSBudWxsKSB7CiAgICAgICAgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBuZXcgUG9zc2libHlXZWFrU2V0KCk7CiAgICAgIH0KCiAgICAgIHdha2VhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uICh3YWtlYWJsZSkgewogICAgICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIGJvdW5kYXJ5IGZpYmVyIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy4KICAgICAgICB2YXIgcmV0cnkgPSByZXNvbHZlUmV0cnlXYWtlYWJsZS5iaW5kKG51bGwsIGZpbmlzaGVkV29yaywgd2FrZWFibGUpOwoKICAgICAgICBpZiAoIXJldHJ5Q2FjaGUuaGFzKHdha2VhYmxlKSkgewogICAgICAgICAgcmV0cnlDYWNoZS5hZGQod2FrZWFibGUpOwoKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7CiAgICAgICAgICAgICAgaWYgKGluUHJvZ3Jlc3NMYW5lcyAhPT0gbnVsbCAmJiBpblByb2dyZXNzUm9vdCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIGFzc29jaWF0ZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnMgd2l0aCBpdC4KICAgICAgICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMoaW5Qcm9ncmVzc1Jvb3QsIGluUHJvZ3Jlc3NMYW5lcyk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdFeHBlY3RlZCBmaW5pc2hlZCByb290IGFuZCBsYW5lcyB0byBiZSBzZXQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgd2FrZWFibGUudGhlbihyZXRyeSwgcmV0cnkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfSAvLyBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IGdvZXMgZnJvbSB2aXNpYmxlIHRvIGhpZGRlbi4KICBmdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcykgewogICAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7CiAgICBpblByb2dyZXNzUm9vdCA9IHJvb3Q7CiAgICBzZXRDdXJyZW50RmliZXIoZmluaXNoZWRXb3JrKTsKICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290KTsKICAgIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspOwogICAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDsKICAgIGluUHJvZ3Jlc3NSb290ID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGxhbmVzKSB7CiAgICAvLyBEZWxldGlvbnMgZWZmZWN0cyBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlciB0eXBlLiBUaGV5IG5lZWQgdG8gaGFwcGVuCiAgICAvLyBiZWZvcmUgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGFlIGZpcmVkLgogICAgdmFyIGRlbGV0aW9ucyA9IHBhcmVudEZpYmVyLmRlbGV0aW9uczsKCiAgICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGNoaWxkVG9EZWxldGUgPSBkZWxldGlvbnNbaV07CgogICAgICAgIHRyeSB7CiAgICAgICAgICBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIsIGNoaWxkVG9EZWxldGUpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjaGlsZFRvRGVsZXRlLCBwYXJlbnRGaWJlciwgZXJyb3IpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHZhciBwcmV2RGVidWdGaWJlciA9IGdldEN1cnJlbnRGaWJlcigpOwoKICAgIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiBNdXRhdGlvbk1hc2spIHsKICAgICAgdmFyIGNoaWxkID0gcGFyZW50RmliZXIuY2hpbGQ7CgogICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHsKICAgICAgICBzZXRDdXJyZW50RmliZXIoY2hpbGQpOwogICAgICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoY2hpbGQsIHJvb3QpOwogICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZzsKICAgICAgfQogICAgfQoKICAgIHNldEN1cnJlbnRGaWJlcihwcmV2RGVidWdGaWJlcik7CiAgfQoKICBmdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKGZpbmlzaGVkV29yaywgcm9vdCwgbGFuZXMpIHsKICAgIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTsKICAgIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFnczsgLy8gVGhlIGVmZmVjdCBmbGFnIHNob3VsZCBiZSBjaGVja2VkICphZnRlciogd2UgcmVmaW5lIHRoZSB0eXBlIG9mIGZpYmVyLAogICAgLy8gYmVjYXVzZSB0aGUgZmliZXIgdGFnIGlzIG1vcmUgc3BlY2lmaWMuIEFuIGV4Y2VwdGlvbiBpcyBhbnkgZmxhZyByZWxhdGVkCiAgICAvLyB0byByZWNvbmNpbGF0aW9uLCBiZWNhdXNlIHRob3NlIGNhbiBiZSBzZXQgb24gYWxsIGZpYmVyIHR5cGVzLgoKICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykgewogICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OgogICAgICBjYXNlIEZvcndhcmRSZWY6CiAgICAgIGNhc2UgTWVtb0NvbXBvbmVudDoKICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTsKICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspOwoKICAgICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7CiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7CiAgICAgICAgICAgIH0gLy8gTGF5b3V0IGVmZmVjdHMgYXJlIGRlc3Ryb3llZCBkdXJpbmcgdGhlIG11dGF0aW9uIHBoYXNlIHNvIHRoYXQgYWxsCiAgICAgICAgICAgIC8vIGRlc3Ryb3kgZnVuY3Rpb25zIGZvciBhbGwgZmliZXJzIGFyZSBjYWxsZWQgYmVmb3JlIGFueSBjcmVhdGUgZnVuY3Rpb25zLgogICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHNpYmxpbmcgY29tcG9uZW50IGVmZmVjdHMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIsCiAgICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldAogICAgICAgICAgICAvLyBieSBhIGNyZWF0ZSBmdW5jdGlvbiBpbiBhbm90aGVyIGNvbXBvbmVudCBkdXJpbmcgdGhlIHNhbWUgY29tbWl0LgoKCiAgICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7CiAgICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pOwogICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICBjYXNlIENsYXNzQ29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTsKICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspOwoKICAgICAgICAgIGlmIChmbGFncyAmIFJlZikgewogICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTsKICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspOwoKICAgICAgICAgIGlmIChmbGFncyAmIFJlZikgewogICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICB7CiAgICAgICAgICAgIC8vIFRPRE86IENvbnRlbnRSZXNldCBnZXRzIGNsZWFyZWQgYnkgdGhlIGNoaWxkcmVuIGR1cmluZyB0aGUgY29tbWl0CiAgICAgICAgICAgIC8vIHBoYXNlLiBUaGlzIGlzIGEgcmVmYWN0b3IgaGF6YXJkIGJlY2F1c2UgaXQgbWVhbnMgd2UgbXVzdCByZWFkCiAgICAgICAgICAgIC8vIGZsYWdzIHRoZSBmbGFncyBhZnRlciBgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzYCBoYXMgYWxyZWFkeSBydW47CiAgICAgICAgICAgIC8vIHRoZSBvcmRlciBtYXR0ZXJzLiBXZSBzaG91bGQgcmVmYWN0b3Igc28gdGhhdCBDb250ZW50UmVzZXQgZG9lcyBub3QKICAgICAgICAgICAgLy8gcmVseSBvbiBtdXRhdGluZyB0aGUgZmxhZyBkdXJpbmcgY29tbWl0LiBMaWtlIGJ5IHNldHRpbmcgYSBmbGFnCiAgICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlIGluc3RlYWQuCiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHsKICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOwoKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmVzZXRUZXh0Q29udGVudChpbnN0YW5jZSk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7CiAgICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTQgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOwoKICAgICAgICAgICAgICBpZiAoX2luc3RhbmNlNCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBDb21taXQgdGhlIHdvcmsgcHJlcGFyZWQgZWFybGllci4KICAgICAgICAgICAgICAgIHZhciBuZXdQcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzOyAvLyBGb3IgaHlkcmF0aW9uIHdlIHJldXNlIHRoZSB1cGRhdGUgcGF0aCBidXQgd2UgdHJlYXQgdGhlIG9sZFByb3BzCiAgICAgICAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW4KICAgICAgICAgICAgICAgIC8vIHRoaXMgY2FzZS4KCiAgICAgICAgICAgICAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3UHJvcHM7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlOyAvLyBUT0RPOiBUeXBlIHRoZSB1cGRhdGVRdWV1ZSB0byBiZSBzcGVjaWZpYyB0byBob3N0IGNvbXBvbmVudHMuCgogICAgICAgICAgICAgICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7CiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsOwoKICAgICAgICAgICAgICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29tbWl0VXBkYXRlKF9pbnN0YW5jZTQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgZmluaXNoZWRXb3JrKTsKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICBjYXNlIEhvc3RUZXh0OgogICAgICAgIHsKICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTsKICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspOwoKICAgICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkgewogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBzaG91bGQgaGF2ZSBhIHRleHQgbm9kZSBpbml0aWFsaXplZC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7CiAgICAgICAgICAgICAgdmFyIG5ld1RleHQgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wczsgLy8gRm9yIGh5ZHJhdGlvbiB3ZSByZXVzZSB0aGUgdXBkYXRlIHBhdGggYnV0IHdlIHRyZWF0IHRoZSBvbGRQcm9wcwogICAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpbgogICAgICAgICAgICAgIC8vIHRoaXMgY2FzZS4KCiAgICAgICAgICAgICAgdmFyIG9sZFRleHQgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3VGV4dDsKCiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbW1pdFRleHRVcGRhdGUodGV4dEluc3RhbmNlLCBvbGRUZXh0LCBuZXdUZXh0KTsKICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgIGNhc2UgSG9zdFJvb3Q6CiAgICAgICAgewogICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspOwogICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7CgogICAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIHByZXZSb290U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7CgogICAgICAgICAgICAgICAgaWYgKHByZXZSb290U3RhdGUuaXNEZWh5ZHJhdGVkKSB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29tbWl0SHlkcmF0ZWRDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTsKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICBjYXNlIEhvc3RQb3J0YWw6CiAgICAgICAgewogICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspOwogICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7CgogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspOwogICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7CiAgICAgICAgICB2YXIgb2Zmc2NyZWVuRmliZXIgPSBmaW5pc2hlZFdvcmsuY2hpbGQ7CgogICAgICAgICAgaWYgKG9mZnNjcmVlbkZpYmVyLmZsYWdzICYgVmlzaWJpbGl0eSkgewogICAgICAgICAgICB2YXIgb2Zmc2NyZWVuSW5zdGFuY2UgPSBvZmZzY3JlZW5GaWJlci5zdGF0ZU5vZGU7CiAgICAgICAgICAgIHZhciBuZXdTdGF0ZSA9IG9mZnNjcmVlbkZpYmVyLm1lbW9pemVkU3RhdGU7CiAgICAgICAgICAgIHZhciBpc0hpZGRlbiA9IG5ld1N0YXRlICE9PSBudWxsOyAvLyBUcmFjayB0aGUgY3VycmVudCBzdGF0ZSBvbiB0aGUgT2Zmc2NyZWVuIGluc3RhbmNlIHNvIHdlIGNhbgogICAgICAgICAgICAvLyByZWFkIGl0IGR1cmluZyBhbiBldmVudAoKICAgICAgICAgICAgb2Zmc2NyZWVuSW5zdGFuY2UuaXNIaWRkZW4gPSBpc0hpZGRlbjsKCiAgICAgICAgICAgIGlmIChpc0hpZGRlbikgewogICAgICAgICAgICAgIHZhciB3YXNIaWRkZW4gPSBvZmZzY3JlZW5GaWJlci5hbHRlcm5hdGUgIT09IG51bGwgJiYgb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUgIT09IG51bGw7CgogICAgICAgICAgICAgIGlmICghd2FzSGlkZGVuKSB7CiAgICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2UKICAgICAgICAgICAgICAgIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKTsKICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICB2YXIgX3dhc0hpZGRlbiA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsOwoKICAgICAgICAgIGlmICggLy8gVE9ETzogUmVtb3ZlIHRoaXMgZGVhZCBmbGFnCiAgICAgICAgICAgZmluaXNoZWRXb3JrLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgewogICAgICAgICAgICAvLyBCZWZvcmUgY29tbWl0dGluZyB0aGUgY2hpbGRyZW4sIHRyYWNrIG9uIHRoZSBzdGFjayB3aGV0aGVyIHRoaXMKICAgICAgICAgICAgLy8gb2Zmc2NyZWVuIHN1YnRyZWUgd2FzIGFscmVhZHkgaGlkZGVuLCBzbyB0aGF0IHdlIGRvbid0IHVubW91bnQgdGhlCiAgICAgICAgICAgIC8vIGVmZmVjdHMgYWdhaW4uCiAgICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47CiAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fCBfd2FzSGlkZGVuOwogICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7CiAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTsKICAgICAgICAgIH0KCiAgICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTsKCiAgICAgICAgICBpZiAoZmxhZ3MgJiBWaXNpYmlsaXR5KSB7CiAgICAgICAgICAgIHZhciBfb2Zmc2NyZWVuSW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOwogICAgICAgICAgICB2YXIgX25ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7CgogICAgICAgICAgICB2YXIgX2lzSGlkZGVuID0gX25ld1N0YXRlICE9PSBudWxsOwoKICAgICAgICAgICAgdmFyIG9mZnNjcmVlbkJvdW5kYXJ5ID0gZmluaXNoZWRXb3JrOyAvLyBUcmFjayB0aGUgY3VycmVudCBzdGF0ZSBvbiB0aGUgT2Zmc2NyZWVuIGluc3RhbmNlIHNvIHdlIGNhbgogICAgICAgICAgICAvLyByZWFkIGl0IGR1cmluZyBhbiBldmVudAoKICAgICAgICAgICAgX29mZnNjcmVlbkluc3RhbmNlLmlzSGlkZGVuID0gX2lzSGlkZGVuOwoKICAgICAgICAgICAgewogICAgICAgICAgICAgIGlmIChfaXNIaWRkZW4pIHsKICAgICAgICAgICAgICAgIGlmICghX3dhc0hpZGRlbikgewogICAgICAgICAgICAgICAgICBpZiAoKG9mZnNjcmVlbkJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkgewogICAgICAgICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBvZmZzY3JlZW5Cb3VuZGFyeTsKICAgICAgICAgICAgICAgICAgICB2YXIgb2Zmc2NyZWVuQ2hpbGQgPSBvZmZzY3JlZW5Cb3VuZGFyeS5jaGlsZDsKCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9mZnNjcmVlbkNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQ2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKG9mZnNjcmVlbkNoaWxkKTsKICAgICAgICAgICAgICAgICAgICAgIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQ2hpbGQuc2libGluZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIG5lZWRzIHRvIHJ1biB3aGVuZXZlciB0aGVyZSdzIGFuIGluc2VydGlvbiBvciB1cGRhdGUKICAgICAgICAgICAgICAvLyBpbnNpZGUgYSBoaWRkZW4gT2Zmc2NyZWVuIHRyZWUuCiAgICAgICAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4ob2Zmc2NyZWVuQm91bmRhcnksIF9pc0hpZGRlbik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspOwogICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7CgogICAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7CiAgICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgY2FzZSBTY29wZUNvbXBvbmVudDoKICAgICAgICB7CgogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgewogICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspOwogICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yaykgewogICAgLy8gUGxhY2VtZW50IGVmZmVjdHMgKGluc2VydGlvbnMsIHJlb3JkZXJzKSBjYW4gYmUgc2NoZWR1bGVkIG9uIGFueSBmaWJlcgogICAgLy8gdHlwZS4gVGhleSBuZWVkcyB0byBoYXBwZW4gYWZ0ZXIgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGF2ZSBmaXJlZCwgYnV0CiAgICAvLyBiZWZvcmUgdGhlIGVmZmVjdHMgb24gdGhpcyBmaWJlciBoYXZlIGZpcmVkLgogICAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzOwoKICAgIGlmIChmbGFncyAmIFBsYWNlbWVudCkgewogICAgICB0cnkgewogICAgICAgIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspOwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpOwogICAgICB9IC8vIENsZWFyIHRoZSAicGxhY2VtZW50IiBmcm9tIGVmZmVjdCB0YWcgc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhpcyBpcwogICAgICAvLyBpbnNlcnRlZCwgYmVmb3JlIGFueSBsaWZlLWN5Y2xlcyBsaWtlIGNvbXBvbmVudERpZE1vdW50IGdldHMgY2FsbGVkLgogICAgICAvLyBUT0RPOiBmaW5kRE9NTm9kZSBkb2Vzbid0IHJlbHkgb24gdGhpcyBhbnkgbW9yZSBidXQgaXNNb3VudGVkIGRvZXMKICAgICAgLy8gYW5kIGlzTW91bnRlZCBpcyBkZXByZWNhdGVkIGFueXdheSBzbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBraWxsIHRoaXMuCgoKICAgICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5QbGFjZW1lbnQ7CiAgICB9CgogICAgaWYgKGZsYWdzICYgSHlkcmF0aW5nKSB7CiAgICAgIGZpbmlzaGVkV29yay5mbGFncyAmPSB+SHlkcmF0aW5nOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7CiAgICBpblByb2dyZXNzTGFuZXMgPSBjb21taXR0ZWRMYW5lczsKICAgIGluUHJvZ3Jlc3NSb290ID0gcm9vdDsKICAgIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7CiAgICBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMpOwogICAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDsKICAgIGluUHJvZ3Jlc3NSb290ID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHNfYmVnaW4oc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKSB7CiAgICAvLyBTdXNwZW5zZSBsYXlvdXQgZWZmZWN0cyBzZW1hbnRpY3MgZG9uJ3QgY2hhbmdlIGZvciBsZWdhY3kgcm9vdHMuCiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gKHN1YnRyZWVSb290Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTsKCiAgICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkgewogICAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OwogICAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkOwoKICAgICAgaWYgKCBmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCAmJiBpc01vZGVyblJvb3QpIHsKICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBzdGFjaydzIHN0YXRlLgogICAgICAgIHZhciBpc0hpZGRlbiA9IGZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7CiAgICAgICAgdmFyIG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGlzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjsKCiAgICAgICAgaWYgKG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbikgewogICAgICAgICAgLy8gVGhlIE9mZnNjcmVlbiB0cmVlIGlzIGhpZGRlbi4gU2tpcCBvdmVyIGl0cyBsYXlvdXQgZWZmZWN0cy4KICAgICAgICAgIGNvbW1pdExheW91dE1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQWxzbyBjaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0TWFzawogICAgICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7CiAgICAgICAgICB2YXIgd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7CiAgICAgICAgICB2YXIgbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHdhc0hpZGRlbiB8fCBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuOwogICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47CiAgICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuOyAvLyBUcmF2ZXJzZSB0aGUgT2Zmc2NyZWVuIHN1YnRyZWUgd2l0aCB0aGUgY3VycmVudCBPZmZzY3JlZW4gYXMgdGhlIHJvb3QuCgogICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuOwogICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG5ld09mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47CgogICAgICAgICAgaWYgKG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gJiYgIXByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3Qgb2YgYSByZWFwcGVhcmluZyBib3VuZGFyeS4gVHVybiBpdHMgbGF5b3V0IGVmZmVjdHMKICAgICAgICAgICAgLy8gYmFjayBvbi4KICAgICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyOwogICAgICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oZmliZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBjaGlsZCA9IGZpcnN0Q2hpbGQ7CgogICAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDsKICAgICAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihjaGlsZCwgLy8gTmV3IHJvb3Q7IGJ1YmJsZSBiYWNrIHVwIHRvIGhlcmUgYW5kIHN0b3AuCiAgICAgICAgICAgIHJvb3QsIGNvbW1pdHRlZExhbmVzKTsKICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nOwogICAgICAgICAgfSAvLyBSZXN0b3JlIE9mZnNjcmVlbiBzdGF0ZSBhbmQgcmVzdW1lIGluIG91ci1wcm9ncmVzcyB0cmF2ZXJzYWwuCgoKICAgICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjsKICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47CiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47CiAgICAgICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncyAmJiBmaXJzdENoaWxkICE9PSBudWxsKSB7CiAgICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjsKICAgICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcykgewogICAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHsKICAgICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsKCiAgICAgIGlmICgoZmliZXIuZmxhZ3MgJiBMYXlvdXRNYXNrKSAhPT0gTm9GbGFncykgewogICAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlOwogICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7CgogICAgICAgIHRyeSB7CiAgICAgICAgICBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKHJvb3QsIGN1cnJlbnQsIGZpYmVyLCBjb21taXR0ZWRMYW5lcyk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTsKICAgICAgICB9CgogICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7CiAgICAgIH0KCiAgICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHsKICAgICAgICBuZXh0RWZmZWN0ID0gbnVsbDsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZzsKCiAgICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7CiAgICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47CiAgICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkgewogICAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHsKICAgICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsKICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiAoUmVmU3RhdGljIHwgTGF5b3V0U3RhdGljKQoKICAgICAgc3dpdGNoIChmaWJlci50YWcpIHsKICAgICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OgogICAgICAgIGNhc2UgRm9yd2FyZFJlZjoKICAgICAgICBjYXNlIE1lbW9Db21wb25lbnQ6CiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OgogICAgICAgICAgewogICAgICAgICAgICBpZiAoIGZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7CiAgICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0LCBmaWJlciwgZmliZXIucmV0dXJuKTsKICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmliZXIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0LCBmaWJlciwgZmliZXIucmV0dXJuKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgUmVmU3RhdGljCiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTsKICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaWJlciwgZmliZXIucmV0dXJuKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OgogICAgICAgICAgewogICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEKICAgICAgICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDsKCiAgICAgICAgICAgIGlmIChpc0hpZGRlbikgewogICAgICAgICAgICAgIC8vIE5lc3RlZCBPZmZzY3JlZW4gdHJlZSBpcyBhbHJlYWR5IGhpZGRlbi4gRG9uJ3QgZGlzYXBwZWFyCiAgICAgICAgICAgICAgLy8gaXRzIGVmZmVjdHMuCiAgICAgICAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpYwoKCiAgICAgIGlmIChmaXJzdENoaWxkICE9PSBudWxsKSB7CiAgICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjsKICAgICAgICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDsKICAgICAgfSBlbHNlIHsKICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkgewogICAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHsKICAgICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsKCiAgICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHsKICAgICAgICBuZXh0RWZmZWN0ID0gbnVsbDsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZzsKCiAgICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7CiAgICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47CiAgICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290KSB7CiAgICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkgewogICAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OwogICAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkOwoKICAgICAgaWYgKGZpYmVyLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50KSB7CiAgICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDsKCiAgICAgICAgaWYgKGlzSGlkZGVuKSB7CiAgICAgICAgICAvLyBOZXN0ZWQgT2Zmc2NyZWVuIHRyZWUgaXMgc3RpbGwgaGlkZGVuLiBEb24ndCByZS1hcHBlYXIgaXRzIGVmZmVjdHMuCiAgICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpYwoKCiAgICAgIGlmIChmaXJzdENoaWxkICE9PSBudWxsKSB7CiAgICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0CiAgICAgICAgLy8gYXNzdW1lIGl0cyByZXR1cm4gcG9pbnRlciBpcyBjb3JyZWN0LgogICAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7CiAgICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KSB7CiAgICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkgewogICAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBUT0RPIChPZmZzY3JlZW4pIENoZWNrOiBmbGFncyAmIExheW91dFN0YXRpYwoKICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTsKCiAgICAgIHRyeSB7CiAgICAgICAgcmVhcHBlYXJMYXlvdXRFZmZlY3RzT25GaWJlcihmaWJlcik7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpOwogICAgICB9CgogICAgICByZXNldEN1cnJlbnRGaWJlcigpOwoKICAgICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkgewogICAgICAgIG5leHRFZmZlY3QgPSBudWxsOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nOwoKICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHsKICAgICAgICAvLyBUaGlzIG5vZGUgbWF5IGhhdmUgYmVlbiByZXVzZWQgZnJvbSBhIHByZXZpb3VzIHJlbmRlciwgc28gd2UgY2FuJ3QKICAgICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuCiAgICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47CiAgICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykgewogICAgbmV4dEVmZmVjdCA9IGZpbmlzaGVkV29yazsKICAgIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpOwogIH0KCiAgZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7CiAgICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkgewogICAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OwogICAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkOwoKICAgICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkgewogICAgICAgIGZpcnN0Q2hpbGQucmV0dXJuID0gZmliZXI7CiAgICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCwgcm9vdCwgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7CiAgICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkgewogICAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OwoKICAgICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7CiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIocm9vdCwgZmliZXIsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTsKICAgICAgICB9CgogICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7CiAgICAgIH0KCiAgICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHsKICAgICAgICBuZXh0RWZmZWN0ID0gbnVsbDsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZzsKCiAgICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7CiAgICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47CiAgICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7CiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHsKICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDoKICAgICAgY2FzZSBGb3J3YXJkUmVmOgogICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6CiAgICAgICAgewogICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7CiAgICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTsKICAgICAgICAgIH0KCiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHMoZmlyc3RDaGlsZCkgewogICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7CiAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfYmVnaW4oKTsKICB9CgogIGZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpIHsKICAgIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7CiAgICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7CiAgICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkOwoKICAgICAgaWYgKChuZXh0RWZmZWN0LmZsYWdzICYgQ2hpbGREZWxldGlvbikgIT09IE5vRmxhZ3MpIHsKICAgICAgICB2YXIgZGVsZXRpb25zID0gZmliZXIuZGVsZXRpb25zOwoKICAgICAgICBpZiAoZGVsZXRpb25zICE9PSBudWxsKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgZmliZXJUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXTsKICAgICAgICAgICAgbmV4dEVmZmVjdCA9IGZpYmVyVG9EZWxldGU7CiAgICAgICAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oZmliZXJUb0RlbGV0ZSwgZmliZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIHsKICAgICAgICAgICAgLy8gQSBmaWJlciB3YXMgZGVsZXRlZCBmcm9tIHRoaXMgcGFyZW50IGZpYmVyLCBidXQgaXQncyBzdGlsbCBwYXJ0IG9mCiAgICAgICAgICAgIC8vIHRoZSBwcmV2aW91cyAoYWx0ZXJuYXRlKSBwYXJlbnQgZmliZXIncyBsaXN0IG9mIGNoaWxkcmVuLiBCZWNhdXNlCiAgICAgICAgICAgIC8vIGNoaWxkcmVuIGFyZSBhIGxpbmtlZCBsaXN0LCBhbiBlYXJsaWVyIHNpYmxpbmcgdGhhdCdzIHN0aWxsIGFsaXZlCiAgICAgICAgICAgIC8vIHdpbGwgYmUgY29ubmVjdGVkIHRvIHRoZSBkZWxldGVkIGZpYmVyIHZpYSBpdHMgYGFsdGVybmF0ZWA6CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vICAgbGl2ZSBmaWJlcgogICAgICAgICAgICAvLyAgIC0tYWx0ZXJuYXRlLS0+IHByZXZpb3VzIGxpdmUgZmliZXIKICAgICAgICAgICAgLy8gICAtLXNpYmxpbmctLT4gZGVsZXRlZCBmaWJlcgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBXZSBjYW4ndCBkaXNjb25uZWN0IGBhbHRlcm5hdGVgIG9uIG5vZGVzIHRoYXQgaGF2ZW4ndCBiZWVuIGRlbGV0ZWQKICAgICAgICAgICAgLy8geWV0LCBidXQgd2UgY2FuIGRpc2Nvbm5lY3QgdGhlIGBzaWJsaW5nYCBhbmQgYGNoaWxkYCBwb2ludGVycy4KICAgICAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBmaWJlci5hbHRlcm5hdGU7CgogICAgICAgICAgICBpZiAocHJldmlvdXNGaWJlciAhPT0gbnVsbCkgewogICAgICAgICAgICAgIHZhciBkZXRhY2hlZENoaWxkID0gcHJldmlvdXNGaWJlci5jaGlsZDsKCiAgICAgICAgICAgICAgaWYgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHByZXZpb3VzRmliZXIuY2hpbGQgPSBudWxsOwoKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgdmFyIGRldGFjaGVkU2libGluZyA9IGRldGFjaGVkQ2hpbGQuc2libGluZzsKICAgICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZC5zaWJsaW5nID0gbnVsbDsKICAgICAgICAgICAgICAgICAgZGV0YWNoZWRDaGlsZCA9IGRldGFjaGVkU2libGluZzsKICAgICAgICAgICAgICAgIH0gd2hpbGUgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzICYmIGNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7CiAgICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19jb21wbGV0ZSgpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKSB7CiAgICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkgewogICAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OwoKICAgICAgaWYgKChmaWJlci5mbGFncyAmIFBhc3NpdmUpICE9PSBOb0ZsYWdzKSB7CiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTsKICAgICAgICBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmliZXIpOwogICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7CiAgICAgIH0KCiAgICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZzsKCiAgICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7CiAgICAgICAgc2libGluZy5yZXR1cm4gPSBmaWJlci5yZXR1cm47CiAgICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKGZpbmlzaGVkV29yaykgewogICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7CiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6CiAgICAgIGNhc2UgRm9yd2FyZFJlZjoKICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgewogICAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpOwogICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pOwogICAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7CiAgICAgICAgICB9CgogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihkZWxldGVkU3VidHJlZVJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHsKICAgIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7CiAgICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIERlbGV0aW9uIGVmZmVjdHMgZmlyZSBpbiBwYXJlbnQgLT4gY2hpbGQgb3JkZXIKICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgZmliZXIgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnCgogICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpOwogICAgICBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcihmaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7CiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7CiAgICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkOyAvLyBUT0RPOiBPbmx5IHRyYXZlcnNlIHN1YnRyZWUgaWYgaXQgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnLiAoQnV0LCBpZiB3ZQogICAgICAvLyBkbyB0aGlzLCBzdGlsbCBuZWVkIHRvIGhhbmRsZSBgZGVsZXRlZFRyZWVDbGVhblVwTGV2ZWxgIGNvcnJlY3RseS4pCgogICAgICBpZiAoY2hpbGQgIT09IG51bGwpIHsKICAgICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjsKICAgICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9jb21wbGV0ZShkZWxldGVkU3VidHJlZVJvb3QpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2NvbXBsZXRlKGRlbGV0ZWRTdWJ0cmVlUm9vdCkgewogICAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHsKICAgICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsKICAgICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nOwogICAgICB2YXIgcmV0dXJuRmliZXIgPSBmaWJlci5yZXR1cm47CgogICAgICB7CiAgICAgICAgLy8gUmVjdXJzaXZlbHkgdHJhdmVyc2UgdGhlIGVudGlyZSBkZWxldGVkIHRyZWUgYW5kIGNsZWFuIHVwIGZpYmVyIGZpZWxkcy4KICAgICAgICAvLyBUaGlzIGlzIG1vcmUgYWdncmVzc2l2ZSB0aGFuIGlkZWFsLCBhbmQgdGhlIGxvbmcgdGVybSBnb2FsIGlzIHRvIG9ubHkKICAgICAgICAvLyBoYXZlIHRvIGRldGFjaCB0aGUgZGVsZXRlZCB0cmVlIGF0IHRoZSByb290LgogICAgICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKTsKCiAgICAgICAgaWYgKGZpYmVyID09PSBkZWxldGVkU3VidHJlZVJvb3QpIHsKICAgICAgICAgIG5leHRFZmZlY3QgPSBudWxsOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHsKICAgICAgICBzaWJsaW5nLnJldHVybiA9IHJldHVybkZpYmVyOwogICAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgbmV4dEVmZmVjdCA9IHJldHVybkZpYmVyOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRJbnNpZGVEZWxldGVkVHJlZU9uRmliZXIoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcikgewogICAgc3dpdGNoIChjdXJyZW50LnRhZykgewogICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OgogICAgICBjYXNlIEZvcndhcmRSZWY6CiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDoKICAgICAgICB7CiAgICAgICAgICBpZiAoIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7CiAgICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7CiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpOwogICAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oY3VycmVudCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxLCBjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTsKICAgICAgICAgIH0KCiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgfSAvLyBUT0RPOiBSZXVzZSByZWFwcGVhckxheW91dEVmZmVjdHMgdHJhdmVyc2FsIGhlcmU/CgoKICBmdW5jdGlvbiBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKGZpYmVyKSB7CiAgICB7CiAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS4KICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC4KICAgICAgc3dpdGNoIChmaWJlci50YWcpIHsKICAgICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OgogICAgICAgIGNhc2UgRm9yd2FyZFJlZjoKICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyKTsKICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OgogICAgICAgICAgewogICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHsKICAgIHsKICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLgogICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLgogICAgICBzd2l0Y2ggKGZpYmVyLnRhZykgewogICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6CiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOgogICAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDoKICAgICAgICAgIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmliZXIpOwogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGludm9rZUxheW91dEVmZmVjdFVubW91bnRJbkRFVihmaWJlcikgewogICAgewogICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuCiAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuCiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7CiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDoKICAgICAgICBjYXNlIEZvcndhcmRSZWY6CiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OgogICAgICAgICAgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pOwogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTsKCiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoZmliZXIsIGZpYmVyLnJldHVybiwgaW5zdGFuY2UpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdFVubW91bnRJbkRFVihmaWJlcikgewogICAgewogICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuCiAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuCiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7CiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDoKICAgICAgICBjYXNlIEZvcndhcmRSZWY6CiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OgogICAgICAgICAgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpYmVyLCBmaWJlci5yZXR1cm4pOwogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2YXIgQ09NUE9ORU5UX1RZUEUgPSAwOwogIHZhciBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSAxOwogIHZhciBST0xFX1RZUEUgPSAyOwogIHZhciBURVNUX05BTUVfVFlQRSA9IDM7CiAgdmFyIFRFWFRfVFlQRSA9IDQ7CgogIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHsKICAgIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yOwogICAgQ09NUE9ORU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLmNvbXBvbmVudCcpOwogICAgSEFTX1BTRVVET19DTEFTU19UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5oYXNfcHNldWRvX2NsYXNzJyk7CiAgICBST0xFX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnJvbGUnKTsKICAgIFRFU1RfTkFNRV9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci50ZXN0X2lkJyk7CiAgICBURVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLnRleHQnKTsKICB9CiAgdmFyIGNvbW1pdEhvb2tzID0gW107CiAgZnVuY3Rpb24gb25Db21taXRSb290JDEoKSB7CiAgICB7CiAgICAgIGNvbW1pdEhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGNvbW1pdEhvb2spIHsKICAgICAgICByZXR1cm4gY29tbWl0SG9vaygpOwogICAgICB9KTsKICAgIH0KICB9CgogIHZhciBSZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlOwogIGZ1bmN0aW9uIGlzTGVnYWN5QWN0RW52aXJvbm1lbnQoZmliZXIpIHsKICAgIHsKICAgICAgLy8gTGVnYWN5IG1vZGUuIFdlIHByZXNlcnZlIHRoZSBiZWhhdmlvciBvZiBSZWFjdCAxNydzIGFjdC4gSXQgYXNzdW1lcyBhbgogICAgICAvLyBhY3QgZW52aXJvbm1lbnQgd2hlbmV2ZXIgYGplc3RgIGlzIGRlZmluZWQsIGJ1dCB5b3UgY2FuIHN0aWxsIHR1cm4gb2ZmCiAgICAgIC8vIHNwdXJpb3VzIHdhcm5pbmdzIGJ5IHNldHRpbmcgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGV4cGxpY2l0bHkKICAgICAgLy8gdG8gZmFsc2UuCiAgICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPSAvLyAkRmxvd0V4cGVjdGVkRXJyb3Ig4oCTIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBnbG9iYWwKICAgICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7IC8vICRGbG93RXhwZWN0ZWRFcnJvciAtIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IGplc3QKCiAgICAgIHZhciBqZXN0SXNEZWZpbmVkID0gdHlwZW9mIGplc3QgIT09ICd1bmRlZmluZWQnOwogICAgICByZXR1cm4gIGplc3RJc0RlZmluZWQgJiYgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICE9PSBmYWxzZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gaXNDb25jdXJyZW50QWN0RW52aXJvbm1lbnQoKSB7CiAgICB7CiAgICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPSAvLyAkRmxvd0V4cGVjdGVkRXJyb3Ig4oCTIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBnbG9iYWwKICAgICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7CgogICAgICBpZiAoIWlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ICE9PSBudWxsKSB7CiAgICAgICAgLy8gVE9ETzogSW5jbHVkZSBsaW5rIHRvIHJlbGV2YW50IGRvY3VtZW50YXRpb24gcGFnZS4KICAgICAgICBlcnJvcignVGhlIGN1cnJlbnQgdGVzdGluZyBlbnZpcm9ubWVudCBpcyBub3QgY29uZmlndXJlZCB0byBzdXBwb3J0ICcgKyAnYWN0KC4uLiknKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbDsKICAgIH0KICB9CgogIHZhciBjZWlsID0gTWF0aC5jZWlsOwogIHZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLAogICAgICBSZWFjdEN1cnJlbnRPd25lciQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXIsCiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZywKICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlOwogIHZhciBOb0NvbnRleHQgPQogIC8qICAgICAgICAgICAgICovCiAgMDsKICB2YXIgQmF0Y2hlZENvbnRleHQgPQogIC8qICAgICAgICAgICAgICAgKi8KICAxOwogIHZhciBSZW5kZXJDb250ZXh0ID0KICAvKiAgICAgICAgICAgICAgICAqLwogIDI7CiAgdmFyIENvbW1pdENvbnRleHQgPQogIC8qICAgICAgICAgICAgICAgICovCiAgNDsKICB2YXIgUm9vdEluUHJvZ3Jlc3MgPSAwOwogIHZhciBSb290RmF0YWxFcnJvcmVkID0gMTsKICB2YXIgUm9vdEVycm9yZWQgPSAyOwogIHZhciBSb290U3VzcGVuZGVkID0gMzsKICB2YXIgUm9vdFN1c3BlbmRlZFdpdGhEZWxheSA9IDQ7CiAgdmFyIFJvb3RDb21wbGV0ZWQgPSA1OwogIHZhciBSb290RGlkTm90Q29tcGxldGUgPSA2OyAvLyBEZXNjcmliZXMgd2hlcmUgd2UgYXJlIGluIHRoZSBSZWFjdCBleGVjdXRpb24gc3RhY2sKCiAgdmFyIGV4ZWN1dGlvbkNvbnRleHQgPSBOb0NvbnRleHQ7IC8vIFRoZSByb290IHdlJ3JlIHdvcmtpbmcgb24KCiAgdmFyIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7IC8vIFRoZSBmaWJlciB3ZSdyZSB3b3JraW5nIG9uCgogIHZhciB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7IC8vIFRoZSBsYW5lcyB3ZSdyZSByZW5kZXJpbmcKCiAgdmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gU3RhY2sgdGhhdCBhbGxvd3MgY29tcG9uZW50cyB0byBjaGFuZ2UgdGhlIHJlbmRlciBsYW5lcyBmb3IgaXRzIHN1YnRyZWUKICAvLyBUaGlzIGlzIGEgc3VwZXJzZXQgb2YgdGhlIGxhbmVzIHdlIHN0YXJ0ZWQgd29ya2luZyBvbiBhdCB0aGUgcm9vdC4gVGhlIG9ubHkKICAvLyBjYXNlIHdoZXJlIGl0J3MgZGlmZmVyZW50IGZyb20gYHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzYCBpcyB3aGVuIHdlCiAgLy8gZW50ZXIgYSBzdWJ0cmVlIHRoYXQgaXMgaGlkZGVuIGFuZCBuZWVkcyB0byBiZSB1bmhpZGRlbjogU3VzcGVuc2UgYW5kCiAgLy8gT2Zmc2NyZWVuIGNvbXBvbmVudC4KICAvLwogIC8vIE1vc3QgdGhpbmdzIGluIHRoZSB3b3JrIGxvb3Agc2hvdWxkIGRlYWwgd2l0aCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcy4KICAvLyBNb3N0IHRoaW5ncyBpbiBiZWdpbi9jb21wbGV0ZSBwaGFzZXMgc2hvdWxkIGRlYWwgd2l0aCBzdWJ0cmVlUmVuZGVyTGFuZXMuCgogIHZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBOb0xhbmVzOwogIHZhciBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IgPSBjcmVhdGVDdXJzb3IoTm9MYW5lcyk7IC8vIFdoZXRoZXIgdG8gcm9vdCBjb21wbGV0ZWQsIGVycm9yZWQsIHN1c3BlbmRlZCwgZXRjLgoKICB2YXIgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzOyAvLyBBIGZhdGFsIGVycm9yLCBpZiBvbmUgaXMgdGhyb3duCgogIHZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gbnVsbDsgLy8gIkluY2x1ZGVkIiBsYW5lcyByZWZlciB0byBsYW5lcyB0aGF0IHdlcmUgd29ya2VkIG9uIGR1cmluZyB0aGlzIHJlbmRlci4gSXQncwogIC8vIHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIGByZW5kZXJMYW5lc2AgYmVjYXVzZSBgcmVuZGVyTGFuZXNgIGNhbiBjaGFuZ2UgYXMgeW91CiAgLy8gZW50ZXIgYW5kIGV4aXQgYW4gT2Zmc2NyZWVuIHRyZWUuIFRoaXMgdmFsdWUgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGFsbCByZW5kZXIKICAvLyBsYW5lcyBmb3IgdGhlIGVudGlyZSByZW5kZXIgcGhhc2UuCgogIHZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmsgbGVmdCBvdmVyIGJ5IGNvbXBvbmVudHMgdGhhdCB3ZXJlIHZpc2l0ZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBPbmx5CiAgLy8gaW5jbHVkZXMgdW5wcm9jZXNzZWQgdXBkYXRlcywgbm90IHdvcmsgaW4gYmFpbGVkIG91dCBjaGlsZHJlbi4KCiAgdmFyIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7IC8vIExhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIChpbiBhbiBpbnRlcmxlYXZlZCBldmVudCkgZHVyaW5nIHRoaXMgcmVuZGVyLgoKICB2YXIgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSAoKm5vdCogYW4gaW50ZXJsZWF2ZWQgZXZlbnQpLgoKICB2YXIgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzOyAvLyBFcnJvcnMgdGhhdCBhcmUgdGhyb3duIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLgoKICB2YXIgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7IC8vIFRoZXNlIGFyZSBlcnJvcnMgdGhhdCB3ZSByZWNvdmVyZWQgZnJvbSB3aXRob3V0IHN1cmZhY2luZyB0aGVtIHRvIHRoZSBVSS4KICAvLyBXZSB3aWxsIGxvZyB0aGVtIG9uY2UgdGhlIHRyZWUgY29tbWl0cy4KCiAgdmFyIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDsgLy8gVGhlIG1vc3QgcmVjZW50IHRpbWUgd2UgY29tbWl0dGVkIGEgZmFsbGJhY2suIFRoaXMgbGV0cyB1cyBlbnN1cmUgYSB0cmFpbgogIC8vIG1vZGVsIHdoZXJlIHdlIGRvbid0IGNvbW1pdCBuZXcgbG9hZGluZyBzdGF0ZXMgaW4gdG9vIHF1aWNrIHN1Y2Nlc3Npb24uCgogIHZhciBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gMDsKICB2YXIgRkFMTEJBQ0tfVEhST1RUTEVfTVMgPSA1MDA7IC8vIFRoZSBhYnNvbHV0ZSB0aW1lIGZvciB3aGVuIHdlIHNob3VsZCBzdGFydCBnaXZpbmcgdXAgb24gcmVuZGVyaW5nCiAgLy8gbW9yZSBhbmQgcHJlZmVyIENQVSBzdXNwZW5zZSBoZXVyaXN0aWNzIGluc3RlYWQuCgogIHZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gSW5maW5pdHk7IC8vIEhvdyBsb25nIGEgcmVuZGVyIGlzIHN1cHBvc2VkIHRvIHRha2UgYmVmb3JlIHdlIHN0YXJ0IGZvbGxvd2luZyBDUFUKICAvLyBzdXNwZW5zZSBoZXVyaXN0aWNzIGFuZCBvcHQgb3V0IG9mIHJlbmRlcmluZyBtb3JlIGNvbnRlbnQuCgogIHZhciBSRU5ERVJfVElNRU9VVF9NUyA9IDUwMDsKICB2YXIgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IG51bGw7CgogIGZ1bmN0aW9uIHJlc2V0UmVuZGVyVGltZXIoKSB7CiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gbm93KCkgKyBSRU5ERVJfVElNRU9VVF9NUzsKICB9CgogIGZ1bmN0aW9uIGdldFJlbmRlclRhcmdldFRpbWUoKSB7CiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZTsKICB9CiAgdmFyIGhhc1VuY2F1Z2h0RXJyb3IgPSBmYWxzZTsKICB2YXIgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDsKICB2YXIgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsOyAvLyBPbmx5IHVzZWQgd2hlbiBlbmFibGVQcm9maWxlck5lc3RlZFVwZGF0ZVNjaGVkdWxlZEhvb2sgaXMgdHJ1ZTsKICB2YXIgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTsKICB2YXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsOwogIHZhciBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7CiAgdmFyIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107CiAgdmFyIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSBudWxsOyAvLyBVc2UgdGhlc2UgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIG9mIG5lc3RlZCB1cGRhdGVzCgogIHZhciBORVNURURfVVBEQVRFX0xJTUlUID0gNTA7CiAgdmFyIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDsKICB2YXIgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gbnVsbDsKICB2YXIgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7CiAgdmFyIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTsKICB2YXIgTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUID0gNTA7CiAgdmFyIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7CiAgdmFyIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsOyAvLyBJZiB0d28gdXBkYXRlcyBhcmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUgc2FtZSBldmVudCwgd2Ugc2hvdWxkIHRyZWF0IHRoZWlyCiAgLy8gZXZlbnQgdGltZXMgYXMgc2ltdWx0YW5lb3VzLCBldmVuIGlmIHRoZSBhY3R1YWwgY2xvY2sgdGltZSBoYXMgYWR2YW5jZWQKICAvLyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGNhbGwuCgogIHZhciBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7CiAgdmFyIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID0gTm9MYW5lczsKICB2YXIgaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gZmFsc2U7CiAgZnVuY3Rpb24gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCkgewogICAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdDsKICB9CiAgZnVuY3Rpb24gcmVxdWVzdEV2ZW50VGltZSgpIHsKICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHsKICAgICAgLy8gV2UncmUgaW5zaWRlIFJlYWN0LCBzbyBpdCdzIGZpbmUgdG8gcmVhZCB0aGUgYWN0dWFsIHRpbWUuCiAgICAgIHJldHVybiBub3coKTsKICAgIH0gLy8gV2UncmUgbm90IGluc2lkZSBSZWFjdCwgc28gd2UgbWF5IGJlIGluIHRoZSBtaWRkbGUgb2YgYSBicm93c2VyIGV2ZW50LgoKCiAgICBpZiAoY3VycmVudEV2ZW50VGltZSAhPT0gTm9UaW1lc3RhbXApIHsKICAgICAgLy8gVXNlIHRoZSBzYW1lIHN0YXJ0IHRpbWUgZm9yIGFsbCB1cGRhdGVzIHVudGlsIHdlIGVudGVyIFJlYWN0IGFnYWluLgogICAgICByZXR1cm4gY3VycmVudEV2ZW50VGltZTsKICAgIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlIHNpbmNlIFJlYWN0IHlpZWxkZWQuIENvbXB1dGUgYSBuZXcgc3RhcnQgdGltZS4KCgogICAgY3VycmVudEV2ZW50VGltZSA9IG5vdygpOwogICAgcmV0dXJuIGN1cnJlbnRFdmVudFRpbWU7CiAgfQogIGZ1bmN0aW9uIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKSB7CiAgICAvLyBTcGVjaWFsIGNhc2VzCiAgICB2YXIgbW9kZSA9IGZpYmVyLm1vZGU7CgogICAgaWYgKChtb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHsKICAgICAgcmV0dXJuIFN5bmNMYW5lOwogICAgfSBlbHNlIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBOb0xhbmVzKSB7CiAgICAgIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBUaGVzZSBhcmUgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLiBUaGUKICAgICAgLy8gb2xkIGJlaGF2aW9yIGlzIHRvIGdpdmUgdGhpcyB0aGUgc2FtZSAidGhyZWFkIiAobGFuZXMpIGFzCiAgICAgIC8vIHdoYXRldmVyIGlzIGN1cnJlbnRseSByZW5kZXJpbmcuIFNvIGlmIHlvdSBjYWxsIGBzZXRTdGF0ZWAgb24gYSBjb21wb25lbnQKICAgICAgLy8gdGhhdCBoYXBwZW5zIGxhdGVyIGluIHRoZSBzYW1lIHJlbmRlciwgaXQgd2lsbCBmbHVzaC4gSWRlYWxseSwgd2Ugd2FudCB0bwogICAgICAvLyByZW1vdmUgdGhlIHNwZWNpYWwgY2FzZSBhbmQgdHJlYXQgdGhlbSBhcyBpZiB0aGV5IGNhbWUgZnJvbSBhbgogICAgICAvLyBpbnRlcmxlYXZlZCBldmVudC4gUmVnYXJkbGVzcywgdGhpcyBwYXR0ZXJuIGlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZC4KICAgICAgLy8gVGhpcyBiZWhhdmlvciBpcyBvbmx5IGEgZmFsbGJhY2suIFRoZSBmbGFnIG9ubHkgZXhpc3RzIHVudGlsIHdlIGNhbiByb2xsCiAgICAgIC8vIG91dCB0aGUgc2V0U3RhdGUgd2FybmluZywgc2luY2UgZXhpc3RpbmcgY29kZSBtaWdodCBhY2NpZGVudGFsbHkgcmVseSBvbgogICAgICAvLyB0aGUgY3VycmVudCBiZWhhdmlvci4KICAgICAgcmV0dXJuIHBpY2tBcmJpdHJhcnlMYW5lKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTsKICAgIH0KCiAgICB2YXIgaXNUcmFuc2l0aW9uID0gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkgIT09IE5vVHJhbnNpdGlvbjsKCiAgICBpZiAoaXNUcmFuc2l0aW9uKSB7CiAgICAgIGlmICggUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uICE9PSBudWxsKSB7CiAgICAgICAgdmFyIHRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247CgogICAgICAgIGlmICghdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykgewogICAgICAgICAgdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTsKICAgICAgICB9CgogICAgICAgIHRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuYWRkKGZpYmVyKTsKICAgICAgfSAvLyBUaGUgYWxnb3JpdGhtIGZvciBhc3NpZ25pbmcgYW4gdXBkYXRlIHRvIGEgbGFuZSBzaG91bGQgYmUgc3RhYmxlIGZvciBhbGwKICAgICAgLy8gdXBkYXRlcyBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoaW4gdGhlIHNhbWUgZXZlbnQuIFRvIGRvIHRoaXMsIHRoZQogICAgICAvLyBpbnB1dHMgdG8gdGhlIGFsZ29yaXRobSBtdXN0IGJlIHRoZSBzYW1lLgogICAgICAvLwogICAgICAvLyBUaGUgdHJpY2sgd2UgdXNlIGlzIHRvIGNhY2hlIHRoZSBmaXJzdCBvZiBlYWNoIG9mIHRoZXNlIGlucHV0cyB3aXRoaW4gYW4KICAgICAgLy8gZXZlbnQuIFRoZW4gcmVzZXQgdGhlIGNhY2hlZCB2YWx1ZXMgb25jZSB3ZSBjYW4gYmUgc3VyZSB0aGUgZXZlbnQgaXMKICAgICAgLy8gb3Zlci4gT3VyIGhldXJpc3RpYyBmb3IgdGhhdCBpcyB3aGVuZXZlciB3ZSBlbnRlciBhIGNvbmN1cnJlbnQgd29yayBsb29wLgoKCiAgICAgIGlmIChjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9PT0gTm9MYW5lKSB7CiAgICAgICAgLy8gQWxsIHRyYW5zaXRpb25zIHdpdGhpbiB0aGUgc2FtZSBldmVudCBhcmUgYXNzaWduZWQgdGhlIHNhbWUgbGFuZS4KICAgICAgICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZTsKICAgIH0gLy8gVXBkYXRlcyBvcmlnaW5hdGluZyBpbnNpZGUgY2VydGFpbiBSZWFjdCBtZXRob2RzLCBsaWtlIGZsdXNoU3luYywgaGF2ZQogICAgLy8gdGhlaXIgcHJpb3JpdHkgc2V0IGJ5IHRyYWNraW5nIGl0IHdpdGggYSBjb250ZXh0IHZhcmlhYmxlLgogICAgLy8KICAgIC8vIFRoZSBvcGFxdWUgdHlwZSByZXR1cm5lZCBieSB0aGUgaG9zdCBjb25maWcgaXMgaW50ZXJuYWxseSBhIGxhbmUsIHNvIHdlIGNhbgogICAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuCiAgICAvLyBUT0RPOiBNb3ZlIHRoaXMgdHlwZSBjb252ZXJzaW9uIHRvIHRoZSBldmVudCBwcmlvcml0eSBtb2R1bGUuCgoKICAgIHZhciB1cGRhdGVMYW5lID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7CgogICAgaWYgKHVwZGF0ZUxhbmUgIT09IE5vTGFuZSkgewogICAgICByZXR1cm4gdXBkYXRlTGFuZTsKICAgIH0gLy8gVGhpcyB1cGRhdGUgb3JpZ2luYXRlZCBvdXRzaWRlIFJlYWN0LiBBc2sgdGhlIGhvc3QgZW52aXJvbm1lbnQgZm9yIGFuCiAgICAvLyBhcHByb3ByaWF0ZSBwcmlvcml0eSwgYmFzZWQgb24gdGhlIHR5cGUgb2YgZXZlbnQuCiAgICAvLwogICAgLy8gVGhlIG9wYXF1ZSB0eXBlIHJldHVybmVkIGJ5IHRoZSBob3N0IGNvbmZpZyBpcyBpbnRlcm5hbGx5IGEgbGFuZSwgc28gd2UgY2FuCiAgICAvLyB1c2UgdGhhdCBkaXJlY3RseS4KICAgIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS4KCgogICAgdmFyIGV2ZW50TGFuZSA9IGdldEN1cnJlbnRFdmVudFByaW9yaXR5KCk7CiAgICByZXR1cm4gZXZlbnRMYW5lOwogIH0KCiAgZnVuY3Rpb24gcmVxdWVzdFJldHJ5TGFuZShmaWJlcikgewogICAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgYHJlcXVlc3RVcGRhdGVMYW5lYCBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIFN1c3BlbnNlCiAgICAvLyAicmV0cmllcyIg4oCUIGEgc3BlY2lhbCB1cGRhdGUgdGhhdCBhdHRlbXB0cyB0byBmbGlwIGEgU3VzcGVuc2UgYm91bmRhcnkKICAgIC8vIGZyb20gaXRzIHBsYWNlaG9sZGVyIHN0YXRlIHRvIGl0cyBwcmltYXJ5L3Jlc29sdmVkIHN0YXRlLgogICAgLy8gU3BlY2lhbCBjYXNlcwogICAgdmFyIG1vZGUgPSBmaWJlci5tb2RlOwoKICAgIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7CiAgICAgIHJldHVybiBTeW5jTGFuZTsKICAgIH0KCiAgICByZXR1cm4gY2xhaW1OZXh0UmV0cnlMYW5lKCk7CiAgfQoKICBmdW5jdGlvbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUsIGV2ZW50VGltZSkgewogICAgY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCk7CgogICAgewogICAgICBpZiAoaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KSB7CiAgICAgICAgZXJyb3IoJ3VzZUluc2VydGlvbkVmZmVjdCBtdXN0IG5vdCBzY2hlZHVsZSB1cGRhdGVzLicpOwogICAgICB9CiAgICB9CgogICAgewogICAgICBpZiAoaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzKSB7CiAgICAgICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IHRydWU7CiAgICAgIH0KICAgIH0gLy8gTWFyayB0aGF0IHRoZSByb290IGhhcyBhIHBlbmRpbmcgdXBkYXRlLgoKCiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTsKCiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9MYW5lcyAmJiByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHsKICAgICAgLy8gVGhpcyB1cGRhdGUgd2FzIGRpc3BhdGNoZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIFRoaXMgaXMgYSBtaXN0YWtlCiAgICAgIC8vIGlmIHRoZSB1cGRhdGUgb3JpZ2luYXRlcyBmcm9tIHVzZXIgc3BhY2UgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBsb2NhbAogICAgICAvLyBob29rIHVwZGF0ZXMsIHdoaWNoIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGFuZCBkb24ndCByZWFjaCB0aGlzCiAgICAgIC8vIGZ1bmN0aW9uKSwgYnV0IHRoZXJlIGFyZSBzb21lIGludGVybmFsIFJlYWN0IGZlYXR1cmVzIHRoYXQgdXNlIHRoaXMgYXMKICAgICAgLy8gYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCBsaWtlIHNlbGVjdGl2ZSBoeWRyYXRpb24uCiAgICAgIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKTsgLy8gVHJhY2sgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UKICAgIH0gZWxzZSB7CiAgICAgIC8vIFRoaXMgaXMgYSBub3JtYWwgdXBkYXRlLCBzY2hlZHVsZWQgZnJvbSBvdXRzaWRlIHRoZSByZW5kZXIgcGhhc2UuIEZvcgogICAgICAvLyBleGFtcGxlLCBkdXJpbmcgYW4gaW5wdXQgZXZlbnQuCiAgICAgIHsKICAgICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHsKICAgICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpOwoKICAgICAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkgewogICAgICAgIC8vIFJlY2VpdmVkIGFuIHVwZGF0ZSB0byBhIHRyZWUgdGhhdCdzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyaW5nLiBNYXJrCiAgICAgICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlIHdvcmsgb24gdGhpcyByb290LiBVbmxlc3MgdGhlCiAgICAgICAgLy8gYGRlZmVyUmVuZGVyUGhhc2VVcGRhdGVUb05leHRCYXRjaGAgZmxhZyBpcyBvZmYgYW5kIHRoaXMgaXMgYSByZW5kZXIKICAgICAgICAvLyBwaGFzZSB1cGRhdGUuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgdHJlYXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXMgaWYKICAgICAgICAvLyB0aGV5IHdlcmUgaW50ZXJsZWF2ZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMuCiAgICAgICAgaWYgKCAoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpID09PSBOb0NvbnRleHQpIHsKICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcywgbGFuZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkgewogICAgICAgICAgLy8gVGhlIHJvb3QgYWxyZWFkeSBzdXNwZW5kZWQgd2l0aCBhIGRlbGF5LCB3aGljaCBtZWFucyB0aGlzIHJlbmRlcgogICAgICAgICAgLy8gZGVmaW5pdGVseSB3b24ndCBmaW5pc2guIFNpbmNlIHdlIGhhdmUgYSBuZXcgdXBkYXRlLCBsZXQncyBtYXJrIGl0IGFzCiAgICAgICAgICAvLyBzdXNwZW5kZWQgbm93LCByaWdodCBiZWZvcmUgbWFya2luZyB0aGUgaW5jb21pbmcgdXBkYXRlLiBUaGlzIGhhcyB0aGUKICAgICAgICAgIC8vIGVmZmVjdCBvZiBpbnRlcnJ1cHRpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIGFuZCBzd2l0Y2hpbmcgdG8gdGhlIHVwZGF0ZS4KICAgICAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3Qgb3ZlcnJpZGUgcGluZ3MgdGhhdCBoYXBwZW4gd2hpbGUgd2UndmUKICAgICAgICAgIC8vIGFscmVhZHkgc3RhcnRlZCByZW5kZXJpbmcuCiAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpOwoKICAgICAgaWYgKGxhbmUgPT09IFN5bmNMYW5lICYmIGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCAmJiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuCiAgICAgICEoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuaXNCYXRjaGluZ0xlZ2FjeSkpIHsKICAgICAgICAvLyBGbHVzaCB0aGUgc3luY2hyb25vdXMgd29yayBub3csIHVubGVzcyB3ZSdyZSBhbHJlYWR5IHdvcmtpbmcgb3IgaW5zaWRlCiAgICAgICAgLy8gYSBiYXRjaC4gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGluc2lkZSBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgaW5zdGVhZCBvZgogICAgICAgIC8vIHNjaGVkdWxlQ2FsbGJhY2tGb3JGaWJlciB0byBwcmVzZXJ2ZSB0aGUgYWJpbGl0eSB0byBzY2hlZHVsZSBhIGNhbGxiYWNrCiAgICAgICAgLy8gd2l0aG91dCBpbW1lZGlhdGVseSBmbHVzaGluZyBpdC4gV2Ugb25seSBkbyB0aGlzIGZvciB1c2VyLWluaXRpYXRlZAogICAgICAgIC8vIHVwZGF0ZXMsIHRvIHByZXNlcnZlIGhpc3RvcmljYWwgYmVoYXZpb3Igb2YgbGVnYWN5IG1vZGUuCiAgICAgICAgcmVzZXRSZW5kZXJUaW1lcigpOwogICAgICAgIGZsdXNoU3luY0NhbGxiYWNrc09ubHlJbkxlZ2FjeU1vZGUoKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBzY2hlZHVsZUluaXRpYWxIeWRyYXRpb25PblJvb3Qocm9vdCwgbGFuZSwgZXZlbnRUaW1lKSB7CiAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBmb3JrIG9mIHNjaGVkdWxlVXBkYXRlT25GaWJlciB0aGF0IGlzIG9ubHkgdXNlZCB0bwogICAgLy8gc2NoZWR1bGUgdGhlIGluaXRpYWwgaHlkcmF0aW9uIG9mIGEgcm9vdCB0aGF0IGhhcyBqdXN0IGJlZW4gY3JlYXRlZC4gTW9zdAogICAgLy8gb2YgdGhlIHN0dWZmIGluIHNjaGVkdWxlVXBkYXRlT25GaWJlciBjYW4gYmUgc2tpcHBlZC4KICAgIC8vCiAgICAvLyBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgc2VwYXJhdGUgcGF0aCwgdGhvdWdoLCBpcyB0byBkaXN0aW5ndWlzaCB0aGUKICAgIC8vIGluaXRpYWwgY2hpbGRyZW4gZnJvbSBzdWJzZXF1ZW50IHVwZGF0ZXMuIEluIGZ1bGx5IGNsaWVudC1yZW5kZXJlZCByb290cwogICAgLy8gKGNyZWF0ZVJvb3QgaW5zdGVhZCBvZiBoeWRyYXRlUm9vdCksIGFsbCB0b3AtbGV2ZWwgcmVuZGVycyBhcmUgbW9kZWxlZCBhcwogICAgLy8gdXBkYXRlcywgYnV0IGh5ZHJhdGlvbiByb290cyBhcmUgc3BlY2lhbCBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0CiAgICAvLyBtYXRjaCB3aGF0IHdhcyByZW5kZXJlZCBvbiB0aGUgc2VydmVyLgogICAgdmFyIGN1cnJlbnQgPSByb290LmN1cnJlbnQ7CiAgICBjdXJyZW50LmxhbmVzID0gbGFuZTsKICAgIG1hcmtSb290VXBkYXRlZChyb290LCBsYW5lLCBldmVudFRpbWUpOwogICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7CiAgfQogIGZ1bmN0aW9uIGlzVW5zYWZlQ2xhc3NSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikgewogICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIE9ubHkgY2FsbGVkIGJ5IGNsYXNzIGNvbXBvbmVudHMsCiAgICAvLyB3aGljaCBzcGVjaWFsIChkZXByZWNhdGVkKSBiZWhhdmlvciBmb3IgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlIHByb3BzLgogICAgcmV0dXJuICgvLyBUT0RPOiBSZW1vdmUgb3V0ZGF0ZWQgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoIGV4cGVyaW1lbnQuIFdlCiAgICAgIC8vIGRlY2lkZWQgbm90IHRvIGVuYWJsZSBpdC4KICAgICAgIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dAogICAgKTsKICB9IC8vIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNjaGVkdWxlIGEgdGFzayBmb3IgYSByb290LiBUaGVyZSdzIG9ubHkgb25lIHRhc2sgcGVyCiAgLy8gcm9vdDsgaWYgYSB0YXNrIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCwgd2UnbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwcmlvcml0eQogIC8vIG9mIHRoZSBleGlzdGluZyB0YXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV4dCBsZXZlbCB0aGF0IHRoZQogIC8vIHJvb3QgaGFzIHdvcmsgb24uIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGV2ZXJ5IHVwZGF0ZSwgYW5kIHJpZ2h0IGJlZm9yZQogIC8vIGV4aXRpbmcgYSB0YXNrLgoKICBmdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHsKICAgIHZhciBleGlzdGluZ0NhbGxiYWNrTm9kZSA9IHJvb3QuY2FsbGJhY2tOb2RlOyAvLyBDaGVjayBpZiBhbnkgbGFuZXMgYXJlIGJlaW5nIHN0YXJ2ZWQgYnkgb3RoZXIgd29yay4gSWYgc28sIG1hcmsgdGhlbSBhcwogICAgLy8gZXhwaXJlZCBzbyB3ZSBrbm93IHRvIHdvcmsgb24gdGhvc2UgbmV4dC4KCiAgICBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKTsgLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGxhbmVzIHRvIHdvcmsgb24sIGFuZCB0aGVpciBwcmlvcml0eS4KCiAgICB2YXIgbmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzIDogTm9MYW5lcyk7CgogICAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykgewogICAgICAvLyBTcGVjaWFsIGNhc2U6IFRoZXJlJ3Mgbm90aGluZyB0byB3b3JrIG9uLgogICAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IG51bGwpIHsKICAgICAgICBjYW5jZWxDYWxsYmFjayQxKGV4aXN0aW5nQ2FsbGJhY2tOb2RlKTsKICAgICAgfQoKICAgICAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsOwogICAgICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7CiAgICAgIHJldHVybjsKICAgIH0gLy8gV2UgdXNlIHRoZSBoaWdoZXN0IHByaW9yaXR5IGxhbmUgdG8gcmVwcmVzZW50IHRoZSBwcmlvcml0eSBvZiB0aGUgY2FsbGJhY2suCgoKICAgIHZhciBuZXdDYWxsYmFja1ByaW9yaXR5ID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShuZXh0TGFuZXMpOyAvLyBDaGVjayBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIHRhc2suIFdlIG1heSBiZSBhYmxlIHRvIHJldXNlIGl0LgoKICAgIHZhciBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPSByb290LmNhbGxiYWNrUHJpb3JpdHk7CgogICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tQcmlvcml0eSA9PT0gbmV3Q2FsbGJhY2tQcmlvcml0eSAmJiAvLyBTcGVjaWFsIGNhc2UgcmVsYXRlZCB0byBgYWN0YC4gSWYgdGhlIGN1cnJlbnRseSBzY2hlZHVsZWQgdGFzayBpcyBhCiAgICAvLyBTY2hlZHVsZXIgdGFzaywgcmF0aGVyIHRoYW4gYW4gYGFjdGAgdGFzaywgY2FuY2VsIGl0IGFuZCByZS1zY2hlZHVsZWQKICAgIC8vIG9uIHRoZSBgYWN0YCBxdWV1ZS4KICAgICEoIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gZmFrZUFjdENhbGxiYWNrTm9kZSkpIHsKICAgICAgewogICAgICAgIC8vIElmIHdlJ3JlIGdvaW5nIHRvIHJlLXVzZSBhbiBleGlzdGluZyB0YXNrLCBpdCBuZWVkcyB0byBleGlzdC4KICAgICAgICAvLyBBc3N1bWUgdGhhdCBkaXNjcmV0ZSB1cGRhdGUgbWljcm90YXNrcyBhcmUgbm9uLWNhbmNlbGxhYmxlIGFuZCBudWxsLgogICAgICAgIC8vIFRPRE86IFRlbXBvcmFyeSB1bnRpbCB3ZSBjb25maXJtIHRoaXMgd2FybmluZyBpcyBub3QgZmlyZWQuCiAgICAgICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlID09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ICE9PSBTeW5jTGFuZSkgewogICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkIHNjaGVkdWxlZCBjYWxsYmFjayB0byBleGlzdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTsKICAgICAgICB9CiAgICAgIH0gLy8gVGhlIHByaW9yaXR5IGhhc24ndCBjaGFuZ2VkLiBXZSBjYW4gcmV1c2UgdGhlIGV4aXN0aW5nIHRhc2suIEV4aXQuCgoKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPSBudWxsKSB7CiAgICAgIC8vIENhbmNlbCB0aGUgZXhpc3RpbmcgY2FsbGJhY2suIFdlJ2xsIHNjaGVkdWxlIGEgbmV3IG9uZSBiZWxvdy4KICAgICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7CiAgICB9IC8vIFNjaGVkdWxlIGEgbmV3IGNhbGxiYWNrLgoKCiAgICB2YXIgbmV3Q2FsbGJhY2tOb2RlOwoKICAgIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jTGFuZSkgewogICAgICAvLyBTcGVjaWFsIGNhc2U6IFN5bmMgUmVhY3QgY2FsbGJhY2tzIGFyZSBzY2hlZHVsZWQgb24gYSBzcGVjaWFsCiAgICAgIC8vIGludGVybmFsIHF1ZXVlCiAgICAgIGlmIChyb290LnRhZyA9PT0gTGVnYWN5Um9vdCkgewogICAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5ICE9PSBudWxsKSB7CiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY2hlZHVsZVN5bmNDYWxsYmFjayhwZXJmb3JtU3luY1dvcmtPblJvb3QuYmluZChudWxsLCByb290KSk7CiAgICAgIH0KCiAgICAgIHsKICAgICAgICAvLyBGbHVzaCB0aGUgcXVldWUgaW4gYSBtaWNyb3Rhc2suCiAgICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwpIHsKICAgICAgICAgIC8vIEluc2lkZSBgYWN0YCwgdXNlIG91ciBpbnRlcm5hbCBgYWN0YCBxdWV1ZSBzbyB0aGF0IHRoZXNlIGdldCBmbHVzaGVkCiAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNjb3BlIGV2ZW4gd2hlbiB1c2luZyB0aGUgc3luYyB2ZXJzaW9uCiAgICAgICAgICAvLyBvZiBgYWN0YC4KICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudC5wdXNoKGZsdXNoU3luY0NhbGxiYWNrcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNjaGVkdWxlTWljcm90YXNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gSW4gU2FmYXJpLCBhcHBlbmRpbmcgYW4gaWZyYW1lIGZvcmNlcyBtaWNyb3Rhc2tzIHRvIHJ1bi4KICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMjQ1OQogICAgICAgICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IHJ1bm5pbmcgY2FsbGJhY2tzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyCiAgICAgICAgICAgIC8vIG9yIGNvbW1pdCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgdGhhdC4KICAgICAgICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkgewogICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdvdWxkIHN0aWxsIHByZW1hdHVyZWx5IGZsdXNoIHRoZSBjYWxsYmFja3MKICAgICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgb3V0c2lkZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlIChlLmcuIGluIGFuIGV2ZW50KS4KICAgICAgICAgICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBuZXdDYWxsYmFja05vZGUgPSBudWxsOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5TGV2ZWw7CgogICAgICBzd2l0Y2ggKGxhbmVzVG9FdmVudFByaW9yaXR5KG5leHRMYW5lcykpIHsKICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eToKICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJbW1lZGlhdGVQcmlvcml0eTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OgogICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5OwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6CiAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eToKICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBJZGxlUHJpb3JpdHk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICBuZXdDYWxsYmFja05vZGUgPSBzY2hlZHVsZUNhbGxiYWNrJDEoc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCwgcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpOwogICAgfQoKICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IG5ld0NhbGxiYWNrUHJpb3JpdHk7CiAgICByb290LmNhbGxiYWNrTm9kZSA9IG5ld0NhbGxiYWNrTm9kZTsKICB9IC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBldmVyeSBjb25jdXJyZW50IHRhc2ssIGkuZS4gYW55dGhpbmcgdGhhdAogIC8vIGdvZXMgdGhyb3VnaCBTY2hlZHVsZXIuCgoKICBmdW5jdGlvbiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3Qocm9vdCwgZGlkVGltZW91dCkgewogICAgewogICAgICByZXNldE5lc3RlZFVwZGF0ZUZsYWcoKTsKICAgIH0gLy8gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBhIFJlYWN0IGV2ZW50LCB3ZSBjYW4gY2xlYXIgdGhlIGN1cnJlbnQKICAgIC8vIGV2ZW50IHRpbWUuIFRoZSBuZXh0IHVwZGF0ZSB3aWxsIGNvbXB1dGUgYSBuZXcgZXZlbnQgdGltZS4KCgogICAgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wOwogICAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBOb0xhbmVzOwoKICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTsKICAgIH0gLy8gRmx1c2ggYW55IHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGJlZm9yZSBkZWNpZGluZyB3aGljaCBsYW5lcyB0byB3b3JrIG9uLAogICAgLy8gaW4gY2FzZSB0aGV5IHNjaGVkdWxlIGFkZGl0aW9uYWwgd29yay4KCgogICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7CiAgICB2YXIgZGlkRmx1c2hQYXNzaXZlRWZmZWN0cyA9IGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTsKCiAgICBpZiAoZGlkRmx1c2hQYXNzaXZlRWZmZWN0cykgewogICAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHBhc3NpdmUgZWZmZWN0IHBoYXNlIG1heSBoYXZlIGNhbmNlbGVkIHRoZSBjdXJyZW50IHRhc2suCiAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXNrIG5vZGUgZm9yIHRoaXMgcm9vdCB3YXMgY2hhbmdlZC4KICAgICAgaWYgKHJvb3QuY2FsbGJhY2tOb2RlICE9PSBvcmlnaW5hbENhbGxiYWNrTm9kZSkgewogICAgICAgIC8vIFRoZSBjdXJyZW50IHRhc2sgd2FzIGNhbmNlbGVkLiBFeGl0LiBXZSBkb24ndCBuZWVkIHRvIGNhbGwKICAgICAgICAvLyBgZW5zdXJlUm9vdElzU2NoZWR1bGVkYCBiZWNhdXNlIHRoZSBjaGVjayBhYm92ZSBpbXBsaWVzIGVpdGhlciB0aGF0CiAgICAgICAgLy8gdGhlcmUncyBhIG5ldyB0YXNrLCBvciB0aGF0IHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290LgogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCB1c2luZyB0aGUgZmllbGRzIHN0b3JlZAogICAgLy8gb24gdGhlIHJvb3QuCgoKICAgIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpOwoKICAgIGlmIChsYW5lcyA9PT0gTm9MYW5lcykgewogICAgICAvLyBEZWZlbnNpdmUgY29kaW5nLiBUaGlzIGlzIG5ldmVyIGV4cGVjdGVkIHRvIGhhcHBlbi4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9IC8vIFdlIGRpc2FibGUgdGltZS1zbGljaW5nIGluIHNvbWUgY2FzZXM6IGlmIHRoZSB3b3JrIGhhcyBiZWVuIENQVS1ib3VuZAogICAgLy8gZm9yIHRvbyBsb25nICgiZXhwaXJlZCIgd29yaywgdG8gcHJldmVudCBzdGFydmF0aW9uKSwgb3Igd2UncmUgaW4KICAgIC8vIHN5bmMtdXBkYXRlcy1ieS1kZWZhdWx0IG1vZGUuCiAgICAvLyBUT0RPOiBXZSBvbmx5IGNoZWNrIGBkaWRUaW1lb3V0YCBkZWZlbnNpdmVseSwgdG8gYWNjb3VudCBmb3IgYSBTY2hlZHVsZXIKICAgIC8vIGJ1ZyB3ZSdyZSBzdGlsbCBpbnZlc3RpZ2F0aW5nLiBPbmNlIHRoZSBidWcgaW4gU2NoZWR1bGVyIGlzIGZpeGVkLAogICAgLy8gd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSB0cmFjayBleHBpcmF0aW9uIG91cnNlbHZlcy4KCgogICAgdmFyIHNob3VsZFRpbWVTbGljZSA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykgJiYgIWluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpICYmICggIWRpZFRpbWVvdXQpOwogICAgdmFyIGV4aXRTdGF0dXMgPSBzaG91bGRUaW1lU2xpY2UgPyByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykgOiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7CgogICAgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RJblByb2dyZXNzKSB7CiAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkgewogICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbAogICAgICAgIC8vIHJlbmRlciBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbAogICAgICAgIC8vIGluY2x1ZGVzIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlcgogICAgICAgIC8vIHRoZSBzZWNvbmQgYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS4KICAgICAgICB2YXIgZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7CgogICAgICAgIGlmIChlcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHsKICAgICAgICAgIGxhbmVzID0gZXJyb3JSZXRyeUxhbmVzOwogICAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkgewogICAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjsKICAgICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTsKICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTsKICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpOwogICAgICAgIHRocm93IGZhdGFsRXJyb3I7CiAgICAgIH0KCiAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHsKICAgICAgICAvLyBUaGUgcmVuZGVyIHVud291bmQgd2l0aG91dCBjb21wbGV0aW5nIHRoZSB0cmVlLiBUaGlzIGhhcHBlbnMgaW4gc3BlY2lhbAogICAgICAgIC8vIGNhc2VzIHdoZXJlIG5lZWQgdG8gZXhpdCB0aGUgY3VycmVudCByZW5kZXIgd2l0aG91dCBwcm9kdWNpbmcgYQogICAgICAgIC8vIGNvbnNpc3RlbnQgdHJlZSBvciBjb21taXR0aW5nLgogICAgICAgIC8vCiAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gZHVyaW5nIGEgY29uY3VycmVudCByZW5kZXIsIG5vdCBhIGRpc2NyZXRlIG9yCiAgICAgICAgLy8gc3luY2hyb25vdXMgdXBkYXRlLiBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIHRoaXMgd2hlbiB3ZQogICAgICAgIC8vIHVud291bmQgdGhlIHN0YWNrLgogICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFRoZSByZW5kZXIgY29tcGxldGVkLgogICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmVuZGVyIG1heSBoYXZlIHlpZWxkZWQgdG8gYSBjb25jdXJyZW50IGV2ZW50LCBhbmQgaWYgc28sCiAgICAgICAgLy8gY29uZmlybSB0aGF0IGFueSBuZXdseSByZW5kZXJlZCBzdG9yZXMgYXJlIGNvbnNpc3RlbnQuCiAgICAgICAgLy8gVE9ETzogSXQncyBwb3NzaWJsZSB0aGF0IGV2ZW4gYSBjb25jdXJyZW50IHJlbmRlciBtYXkgbmV2ZXIgaGF2ZSB5aWVsZGVkCiAgICAgICAgLy8gdG8gdGhlIG1haW4gdGhyZWFkLCBpZiBpdCB3YXMgZmFzdCBlbm91Z2gsIG9yIGlmIGl0IGV4cGlyZWQuIFdlIGNvdWxkCiAgICAgICAgLy8gc2tpcCB0aGUgY29uc2lzdGVuY3kgY2hlY2sgaW4gdGhhdCBjYXNlLCB0b28uCiAgICAgICAgdmFyIHJlbmRlcldhc0NvbmN1cnJlbnQgPSAhaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpOwogICAgICAgIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlOwoKICAgICAgICBpZiAocmVuZGVyV2FzQ29uY3VycmVudCAmJiAhaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKGZpbmlzaGVkV29yaykpIHsKICAgICAgICAgIC8vIEEgc3RvcmUgd2FzIG11dGF0ZWQgaW4gYW4gaW50ZXJsZWF2ZWQgZXZlbnQuIFJlbmRlciBhZ2FpbiwKICAgICAgICAgIC8vIHN5bmNocm9ub3VzbHksIHRvIGJsb2NrIGZ1cnRoZXIgbXV0YXRpb25zLgogICAgICAgICAgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTsgLy8gV2UgbmVlZCB0byBjaGVjayBhZ2FpbiBpZiBzb21ldGhpbmcgdGhyZXcKCiAgICAgICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHsKICAgICAgICAgICAgdmFyIF9lcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTsKCiAgICAgICAgICAgIGlmIChfZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7CiAgICAgICAgICAgICAgbGFuZXMgPSBfZXJyb3JSZXRyeUxhbmVzOwogICAgICAgICAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBfZXJyb3JSZXRyeUxhbmVzKTsgLy8gV2UgYXNzdW1lIHRoZSB0cmVlIGlzIG5vdyBjb25zaXN0ZW50IGJlY2F1c2Ugd2UgZGlkbid0IHlpZWxkIHRvIGFueQogICAgICAgICAgICAgIC8vIGNvbmN1cnJlbnQgZXZlbnRzLgogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHsKICAgICAgICAgICAgdmFyIF9mYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjsKICAgICAgICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7CiAgICAgICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOwogICAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpOwogICAgICAgICAgICB0aHJvdyBfZmF0YWxFcnJvcjsKICAgICAgICAgIH0KICAgICAgICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBUaGUgbmV4dCBzdGVwIGlzIGVpdGhlciB0byBjb21taXQgaXQsCiAgICAgICAgLy8gb3IsIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHdhaXQgdG8gY29tbWl0IGl0IGFmdGVyIGEgdGltZW91dC4KCgogICAgICAgIHJvb3QuZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrOwogICAgICAgIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzOwogICAgICAgIGZpbmlzaENvbmN1cnJlbnRSZW5kZXIocm9vdCwgZXhpdFN0YXR1cywgbGFuZXMpOwogICAgICB9CiAgICB9CgogICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTsKCiAgICBpZiAocm9vdC5jYWxsYmFja05vZGUgPT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7CiAgICAgIC8vIFRoZSB0YXNrIG5vZGUgc2NoZWR1bGVkIGZvciB0aGlzIHJvb3QgaXMgdGhlIHNhbWUgb25lIHRoYXQncwogICAgICAvLyBjdXJyZW50bHkgZXhlY3V0ZWQuIE5lZWQgdG8gcmV0dXJuIGEgY29udGludWF0aW9uLgogICAgICByZXR1cm4gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCk7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpIHsKICAgIC8vIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24sIGRpc2NhcmQgc2VydmVyIHJlc3BvbnNlIGFuZCBmYWxsCiAgICAvLyBiYWNrIHRvIGNsaWVudCBzaWRlIHJlbmRlci4KICAgIC8vIEJlZm9yZSByZW5kZXJpbmcgYWdhaW4sIHNhdmUgdGhlIGVycm9ycyBmcm9tIHRoZSBwcmV2aW91cyBhdHRlbXB0LgogICAgdmFyIGVycm9yc0Zyb21GaXJzdEF0dGVtcHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzOwoKICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7CiAgICAgIC8vIFRoZSBzaGVsbCBmYWlsZWQgdG8gaHlkcmF0ZS4gU2V0IGEgZmxhZyB0byBmb3JjZSBhIGNsaWVudCByZW5kZXJpbmcKICAgICAgLy8gZHVyaW5nIHRoZSBuZXh0IGF0dGVtcHQuIFRvIGRvIHRoaXMsIHdlIGNhbGwgcHJlcGFyZUZyZXNoU3RhY2sgbm93CiAgICAgIC8vIHRvIGNyZWF0ZSB0aGUgcm9vdCB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBUaGlzIGlzIGEgYml0IHdlaXJkIGluIHRlcm1zCiAgICAgIC8vIG9mIGZhY3RvcmluZywgYmVjYXVzZSBpdCByZWxpZXMgb24gcmVuZGVyUm9vdFN5bmMgbm90IGNhbGxpbmcKICAgICAgLy8gcHJlcGFyZUZyZXNoU3RhY2sgYWdhaW4gaW4gdGhlIGNhbGwgYmVsb3csIHdoaWNoIGhhcHBlbnMgYmVjYXVzZSB0aGUKICAgICAgLy8gcm9vdCBhbmQgbGFuZXMgaGF2ZW4ndCBjaGFuZ2VkLgogICAgICAvLwogICAgICAvLyBUT0RPOiBJIHRoaW5rIHdoYXQgd2Ugc2hvdWxkIGRvIGlzIHNldCBGb3JjZUNsaWVudFJlbmRlciBpbnNpZGUKICAgICAgLy8gdGhyb3dFeGNlcHRpb24sIGxpa2Ugd2UgZG8gZm9yIG5lc3RlZCBTdXNwZW5zZSBib3VuZGFyaWVzLiBUaGUgcmVhc29uCiAgICAgIC8vIGl0J3MgaGVyZSBpbnN0ZWFkIGlzIHNvIHdlIGNhbiBzd2l0Y2ggdG8gdGhlIHN5bmNocm9ub3VzIHdvcmsgbG9vcCwgdG9vLgogICAgICAvLyBTb21ldGhpbmcgdG8gY29uc2lkZXIgZm9yIGEgZnV0dXJlIHJlZmFjdG9yLgogICAgICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgZXJyb3JSZXRyeUxhbmVzKTsKICAgICAgcm9vdFdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyOwoKICAgICAgewogICAgICAgIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7CgogICAgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RFcnJvcmVkKSB7CiAgICAgIC8vIFN1Y2Nlc3NmdWxseSBmaW5pc2hlZCByZW5kZXJpbmcgb24gcmV0cnkKICAgICAgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBmYWlsZWQgZmlyc3QgYXR0ZW1wdCBoYXZlIGJlZW4gcmVjb3ZlcmVkLiBBZGQKICAgICAgLy8gdGhlbSB0byB0aGUgY29sbGVjdGlvbiBvZiByZWNvdmVyYWJsZSBlcnJvcnMuIFdlJ2xsIGxvZyB0aGVtIGluIHRoZQogICAgICAvLyBjb21taXQgcGhhc2UuCiAgICAgIHZhciBlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzOwogICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGVycm9yc0Zyb21GaXJzdEF0dGVtcHQ7IC8vIFRoZSBlcnJvcnMgZnJvbSB0aGUgc2Vjb25kIGF0dGVtcHQgc2hvdWxkIGJlIHF1ZXVlZCBhZnRlciB0aGUgZXJyb3JzCiAgICAgIC8vIGZyb20gdGhlIGZpcnN0IGF0dGVtcHQsIHRvIHByZXNlcnZlIHRoZSBjYXVzYWwgc2VxdWVuY2UuCgogICAgICBpZiAoZXJyb3JzRnJvbVNlY29uZEF0dGVtcHQgIT09IG51bGwpIHsKICAgICAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0KTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBleGl0U3RhdHVzOwogIH0KCiAgZnVuY3Rpb24gcXVldWVSZWNvdmVyYWJsZUVycm9ycyhlcnJvcnMpIHsKICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9PT0gbnVsbCkgewogICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IGVycm9yczsKICAgIH0gZWxzZSB7CiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLnB1c2guYXBwbHkod29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIGVycm9ycyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKSB7CiAgICBzd2l0Y2ggKGV4aXRTdGF0dXMpIHsKICAgICAgY2FzZSBSb290SW5Qcm9ncmVzczoKICAgICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOgogICAgICAgIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpOwogICAgICAgIH0KICAgICAgLy8gRmxvdyBrbm93cyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWlucyBpZiBJIGFkZCBhIGJyZWFrCiAgICAgIC8vIHN0YXRlbWVudCwgYnV0IGVzbGludCBkb2Vzbid0IGtub3cgYWJvdXQgaW52YXJpYW50LCBzbyBpdCBjb21wbGFpbnMKICAgICAgLy8gaWYgSSBkby4gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoCgogICAgICBjYXNlIFJvb3RFcnJvcmVkOgogICAgICAgIHsKICAgICAgICAgIC8vIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgYXR0ZW1wdGVkIHRvIHJldHJ5IHRoaXMgdHJlZS4gSWYgd2UgcmVhY2hlZAogICAgICAgICAgLy8gdGhpcyBwb2ludCwgaXQgZXJyb3JlZCBhZ2Fpbi4gQ29tbWl0IGl0LgogICAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlIFJvb3RTdXNwZW5kZWQ6CiAgICAgICAgewogICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7IC8vIFdlIGhhdmUgYW4gYWNjZXB0YWJsZSBsb2FkaW5nIHN0YXRlLiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgd2UKICAgICAgICAgIC8vIHNob3VsZCBpbW1lZGlhdGVseSBjb21taXQgaXQgb3Igd2FpdCBhIGJpdC4KCiAgICAgICAgICBpZiAoaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgJiYgLy8gZG8gbm90IGRlbGF5IGlmIHdlJ3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZQogICAgICAgICAgIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7CiAgICAgICAgICAgIC8vIFRoaXMgcmVuZGVyIG9ubHkgaW5jbHVkZWQgcmV0cmllcywgbm8gdXBkYXRlcy4gVGhyb3R0bGUgY29tbWl0dGluZwogICAgICAgICAgICAvLyByZXRyaWVzIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyB0b28gbWFueSBsb2FkaW5nIHN0YXRlcyB0b28gcXVpY2tseS4KICAgICAgICAgICAgdmFyIG1zVW50aWxUaW1lb3V0ID0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSArIEZBTExCQUNLX1RIUk9UVExFX01TIC0gbm93KCk7IC8vIERvbid0IGJvdGhlciB3aXRoIGEgdmVyeSBzaG9ydCBzdXNwZW5zZSB0aW1lLgoKICAgICAgICAgICAgaWYgKG1zVW50aWxUaW1lb3V0ID4gMTApIHsKICAgICAgICAgICAgICB2YXIgbmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpOwoKICAgICAgICAgICAgICBpZiAobmV4dExhbmVzICE9PSBOb0xhbmVzKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QuCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7CgogICAgICAgICAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHN1c3BlbmRlZExhbmVzLCBsYW5lcykpIHsKICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmVmZXIgdG8gcmVuZGVyIHRoZSBmYWxsYmFjayBvZiBhdCB0aGUgbGFzdAogICAgICAgICAgICAgICAgLy8gc3VzcGVuZGVkIGxldmVsLiBQaW5nIHRoZSBsYXN0IHN1c3BlbmRlZCBsZXZlbCB0byB0cnkKICAgICAgICAgICAgICAgIC8vIHJlbmRlcmluZyBpdCBhZ2Fpbi4KICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIElkbGU/IFNob3VsZCBub3QgcmVzdGFydC4KICAgICAgICAgICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7CiAgICAgICAgICAgICAgICBtYXJrUm9vdFBpbmdlZChyb290LCBzdXNwZW5kZWRMYW5lcyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9IC8vIFRoZSByZW5kZXIgaXMgc3VzcGVuZGVkLCBpdCBoYXNuJ3QgdGltZWQgb3V0LCBhbmQgdGhlcmUncyBubwogICAgICAgICAgICAgIC8vIGxvd2VyIHByaW9yaXR5IHdvcmsgdG8gZG8uIEluc3RlYWQgb2YgY29tbWl0dGluZyB0aGUgZmFsbGJhY2sKICAgICAgICAgICAgICAvLyBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS4KCgogICAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBtc1VudGlsVGltZW91dCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gLy8gVGhlIHdvcmsgZXhwaXJlZC4gQ29tbWl0IGltbWVkaWF0ZWx5LgoKCiAgICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgIGNhc2UgUm9vdFN1c3BlbmRlZFdpdGhEZWxheToKICAgICAgICB7CiAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTsKCiAgICAgICAgICBpZiAoaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpKSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB0cmFuc2l0aW9uLCBzbyB3ZSBzaG91bGQgZXhpdCB3aXRob3V0IGNvbW1pdHRpbmcgYQogICAgICAgICAgICAvLyBwbGFjZWhvbGRlciBhbmQgd2l0aG91dCBzY2hlZHVsaW5nIGEgdGltZW91dC4gRGVsYXkgaW5kZWZpbml0ZWx5CiAgICAgICAgICAgIC8vIHVudGlsIHdlIHJlY2VpdmUgbW9yZSBkYXRhLgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgdHJhbnNpdGlvbiwgYnV0IHdlIGRpZCB0cmlnZ2VyIGFuIGF2b2lkZWQgc3RhdGUuCiAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgcGxhY2Vob2xkZXIgdG8gZGlzcGxheSBhZnRlciBhIHNob3J0IGRlbGF5LCB1c2luZyB0aGUgSnVzdAogICAgICAgICAgICAvLyBOb3RpY2VhYmxlIERpZmZlcmVuY2UuCiAgICAgICAgICAgIC8vIFRPRE86IElzIHRoZSBKTkQgb3B0aW1pemF0aW9uIHdvcnRoIHRoZSBhZGRlZCBjb21wbGV4aXR5PyBJZiB0aGlzIGlzCiAgICAgICAgICAgIC8vIHRoZSBvbmx5IHJlYXNvbiB3ZSB0cmFjayB0aGUgZXZlbnQgdGltZSwgdGhlbiBwcm9iYWJseSBub3QuCiAgICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nLgogICAgICAgICAgICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IGdldE1vc3RSZWNlbnRFdmVudFRpbWUocm9vdCwgbGFuZXMpOwogICAgICAgICAgICB2YXIgZXZlbnRUaW1lTXMgPSBtb3N0UmVjZW50RXZlbnRUaW1lOwogICAgICAgICAgICB2YXIgdGltZUVsYXBzZWRNcyA9IG5vdygpIC0gZXZlbnRUaW1lTXM7CgogICAgICAgICAgICB2YXIgX21zVW50aWxUaW1lb3V0ID0gam5kKHRpbWVFbGFwc2VkTXMpIC0gdGltZUVsYXBzZWRNczsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuCgoKICAgICAgICAgICAgaWYgKF9tc1VudGlsVGltZW91dCA+IDEwKSB7CiAgICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFjayBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhCiAgICAgICAgICAgICAgLy8gdG8gYXJyaXZlLgogICAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBfbXNVbnRpbFRpbWVvdXQpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IC8vIENvbW1pdCB0aGUgcGxhY2Vob2xkZXIuCgoKICAgICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgY2FzZSBSb290Q29tcGxldGVkOgogICAgICAgIHsKICAgICAgICAgIC8vIFRoZSB3b3JrIGNvbXBsZXRlZC4gUmVhZHkgdG8gY29tbWl0LgogICAgICAgICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBkZWZhdWx0OgogICAgICAgIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biByb290IGV4aXQgc3RhdHVzLicpOwogICAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzUmVuZGVyQ29uc2lzdGVudFdpdGhFeHRlcm5hbFN0b3JlcyhmaW5pc2hlZFdvcmspIHsKICAgIC8vIFNlYXJjaCB0aGUgcmVuZGVyZWQgdHJlZSBmb3IgZXh0ZXJuYWwgc3RvcmUgcmVhZHMsIGFuZCBjaGVjayB3aGV0aGVyIHRoZQogICAgLy8gc3RvcmVzIHdlcmUgbXV0YXRlZCBpbiBhIGNvbmN1cnJlbnQgZXZlbnQuIEludGVudGlvbmFsbHkgdXNpbmcgYW4gaXRlcmF0aXZlCiAgICAvLyBsb29wIGluc3RlYWQgb2YgcmVjdXJzaW9uIHNvIHdlIGNhbiBleGl0IGVhcmx5LgogICAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7CgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKG5vZGUuZmxhZ3MgJiBTdG9yZUNvbnNpc3RlbmN5KSB7CiAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gbm9kZS51cGRhdGVRdWV1ZTsKCiAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7CiAgICAgICAgICB2YXIgY2hlY2tzID0gdXBkYXRlUXVldWUuc3RvcmVzOwoKICAgICAgICAgIGlmIChjaGVja3MgIT09IG51bGwpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGVja3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB2YXIgY2hlY2sgPSBjaGVja3NbaV07CiAgICAgICAgICAgICAgdmFyIGdldFNuYXBzaG90ID0gY2hlY2suZ2V0U25hcHNob3Q7CiAgICAgICAgICAgICAgdmFyIHJlbmRlcmVkVmFsdWUgPSBjaGVjay52YWx1ZTsKCiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmICghb2JqZWN0SXMoZ2V0U25hcHNob3QoKSwgcmVuZGVyZWRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgLy8gRm91bmQgYW4gaW5jb25zaXN0ZW50IHN0b3JlLgogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIC8vIElmIGBnZXRTbmFwc2hvdGAgdGhyb3dzLCByZXR1cm4gYGZhbHNlYC4gVGhpcyB3aWxsIHNjaGVkdWxlCiAgICAgICAgICAgICAgICAvLyBhIHJlLXJlbmRlciwgYW5kIHRoZSBlcnJvciB3aWxsIGJlIHJldGhyb3duIGR1cmluZyByZW5kZXIuCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkOwoKICAgICAgaWYgKG5vZGUuc3VidHJlZUZsYWdzICYgU3RvcmVDb25zaXN0ZW5jeSAmJiBjaGlsZCAhPT0gbnVsbCkgewogICAgICAgIGNoaWxkLnJldHVybiA9IG5vZGU7CiAgICAgICAgbm9kZSA9IGNoaWxkOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHsKICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47CiAgICAgIH0KCiAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjsKICAgICAgbm9kZSA9IG5vZGUuc2libGluZzsKICAgIH0gLy8gRmxvdyBkb2Vzbid0IGtub3cgdGhpcyBpcyB1bnJlYWNoYWJsZSwgYnV0IGVzbGludCBkb2VzCiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGUKCgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7CiAgICAvLyBXaGVuIHN1c3BlbmRpbmcsIHdlIHNob3VsZCBhbHdheXMgZXhjbHVkZSBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIG9yIChtb3JlCiAgICAvLyByYXJlbHksIHNpbmNlIHdlIHRyeSB0byBhdm9pZCBpdCkgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4KICAgIC8vIFRPRE86IExvbCBtYXliZSB0aGVyZSdzIGEgYmV0dGVyIHdheSB0byBmYWN0b3IgdGhpcyBiZXNpZGVzIHRoaXMKICAgIC8vIG9ibm94aW91c2x5IG5hbWVkIGZ1bmN0aW9uIDopCiAgICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyk7CiAgICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyk7CiAgICBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcyk7CiAgfSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3Igc3luY2hyb25vdXMgdGFza3MgdGhhdCBkb24ndCBnbwogIC8vIHRocm91Z2ggU2NoZWR1bGVyCgoKICBmdW5jdGlvbiBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCkgewogICAgewogICAgICBzeW5jTmVzdGVkVXBkYXRlRmxhZygpOwogICAgfQoKICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTsKICAgIH0KCiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7CiAgICB2YXIgbGFuZXMgPSBnZXROZXh0TGFuZXMocm9vdCwgTm9MYW5lcyk7CgogICAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGxhbmVzLCBTeW5jTGFuZSkpIHsKICAgICAgLy8gVGhlcmUncyBubyByZW1haW5pbmcgc3luYyB3b3JrIGxlZnQuCiAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpOwoKICAgIGlmIChyb290LnRhZyAhPT0gTGVnYWN5Um9vdCAmJiBleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkgewogICAgICAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGwgcmVuZGVyCiAgICAgIC8vIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsIGluY2x1ZGVzCiAgICAgIC8vIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlciB0aGUgc2Vjb25kCiAgICAgIC8vIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuCiAgICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTsKCiAgICAgIGlmIChlcnJvclJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHsKICAgICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lczsKICAgICAgICBleGl0U3RhdHVzID0gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTsKICAgICAgfQogICAgfQoKICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7CiAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjsKICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7CiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOwogICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpOwogICAgICB0aHJvdyBmYXRhbEVycm9yOwogICAgfQoKICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb290IGRpZCBub3QgY29tcGxldGUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7CiAgICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBCZWNhdXNlIHRoaXMgaXMgYSBzeW5jIHJlbmRlciwgd2UKICAgIC8vIHdpbGwgY29tbWl0IGl0IGV2ZW4gaWYgc29tZXRoaW5nIHN1c3BlbmRlZC4KCgogICAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7CiAgICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yazsKICAgIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzOwogICAgY29tbWl0Um9vdChyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyk7IC8vIEJlZm9yZSBleGl0aW5nLCBtYWtlIHN1cmUgdGhlcmUncyBhIGNhbGxiYWNrIHNjaGVkdWxlZCBmb3IgdGhlIG5leHQKICAgIC8vIHBlbmRpbmcgbGV2ZWwuCgogICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hSb290KHJvb3QsIGxhbmVzKSB7CiAgICBpZiAobGFuZXMgIT09IE5vTGFuZXMpIHsKICAgICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbWVyZ2VMYW5lcyhsYW5lcywgU3luY0xhbmUpKTsKICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTsKCiAgICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHsKICAgICAgICByZXNldFJlbmRlclRpbWVyKCk7CiAgICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMkMShmbiwgYSkgewogICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDsKICAgIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7CgogICAgdHJ5IHsKICAgICAgcmV0dXJuIGZuKGEpOwogICAgfSBmaW5hbGx5IHsKICAgICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBJZiB0aGVyZSB3ZXJlIGxlZ2FjeSBzeW5jIHVwZGF0ZXMsIGZsdXNoIHRoZW0gYXQgdGhlIGVuZCBvZiB0aGUgb3V0ZXIKICAgICAgLy8gbW9zdCBiYXRjaGVkVXBkYXRlcy1saWtlIG1ldGhvZC4KCiAgICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQgJiYgLy8gVHJlYXQgYGFjdGAgYXMgaWYgaXQncyBpbnNpZGUgYGJhdGNoZWRVcGRhdGVzYCwgZXZlbiBpbiBsZWdhY3kgbW9kZS4KICAgICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkgewogICAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTsKICAgICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gZGlzY3JldGVVcGRhdGVzKGZuLCBhLCBiLCBjLCBkKSB7CiAgICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpOwogICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uOwoKICAgIHRyeSB7CiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7CiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpOwogICAgICByZXR1cm4gZm4oYSwgYiwgYywgZCk7CiAgICB9IGZpbmFsbHkgewogICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7CiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uOwoKICAgICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkgewogICAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTsKICAgICAgfQogICAgfQogIH0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLgogIC8vIFdhcm5pbmcsIHRoaXMgb3B0cy1vdXQgb2YgY2hlY2tpbmcgdGhlIGZ1bmN0aW9uIGJvZHkuCgogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmUKICBmdW5jdGlvbiBmbHVzaFN5bmMoZm4pIHsKICAgIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBmbHVzaCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQogICAgLy8gbmV4dCBldmVudCwgbm90IGF0IHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIG9uZS4KICAgIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyAhPT0gbnVsbCAmJiByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cy50YWcgPT09IExlZ2FjeVJvb3QgJiYgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7CiAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTsKICAgIH0KCiAgICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0OwogICAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDsKICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjsKICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7CgogICAgdHJ5IHsKICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDsKICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7CgogICAgICBpZiAoZm4pIHsKICAgICAgICByZXR1cm4gZm4oKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICB9CiAgICB9IGZpbmFsbHkgewogICAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7CiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uOwogICAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2guCiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwCiAgICAgIC8vIHRoZSBzdGFjay4KCiAgICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpIHsKICAgICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBpc0FscmVhZHlSZW5kZXJpbmcoKSB7CiAgICAvLyBVc2VkIGJ5IHRoZSByZW5kZXJlciB0byBwcmludCBhIHdhcm5pbmcgaWYgY2VydGFpbiBBUElzIGFyZSBjYWxsZWQgZnJvbQogICAgLy8gdGhlIHdyb25nIGNvbnRleHQuCiAgICByZXR1cm4gIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dDsKICB9CiAgZnVuY3Rpb24gcHVzaFJlbmRlckxhbmVzKGZpYmVyLCBsYW5lcykgewogICAgcHVzaChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIHN1YnRyZWVSZW5kZXJMYW5lcywgZmliZXIpOwogICAgc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhzdWJ0cmVlUmVuZGVyTGFuZXMsIGxhbmVzKTsKICAgIHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzUm9vdEluY2x1ZGVkTGFuZXMsIGxhbmVzKTsKICB9CiAgZnVuY3Rpb24gcG9wUmVuZGVyTGFuZXMoZmliZXIpIHsKICAgIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvci5jdXJyZW50OwogICAgcG9wKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpOwogIH0KCiAgZnVuY3Rpb24gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpIHsKICAgIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDsKICAgIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7CiAgICB2YXIgdGltZW91dEhhbmRsZSA9IHJvb3QudGltZW91dEhhbmRsZTsKCiAgICBpZiAodGltZW91dEhhbmRsZSAhPT0gbm9UaW1lb3V0KSB7CiAgICAgIC8vIFRoZSByb290IHByZXZpb3VzIHN1c3BlbmRlZCBhbmQgc2NoZWR1bGVkIGEgdGltZW91dCB0byBjb21taXQgYSBmYWxsYmFjawogICAgICAvLyBzdGF0ZS4gTm93IHRoYXQgd2UgaGF2ZSBhZGRpdGlvbmFsIHdvcmssIGNhbmNlbCB0aGUgdGltZW91dC4KICAgICAgcm9vdC50aW1lb3V0SGFuZGxlID0gbm9UaW1lb3V0OyAvLyAkRmxvd0ZpeE1lIENvbXBsYWlucyBub1RpbWVvdXQgaXMgbm90IGEgVGltZW91dElELCBkZXNwaXRlIHRoZSBjaGVjayBhYm92ZQoKICAgICAgY2FuY2VsVGltZW91dCh0aW1lb3V0SGFuZGxlKTsKICAgIH0KCiAgICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHsKICAgICAgdmFyIGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzLnJldHVybjsKCiAgICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHsKICAgICAgICB2YXIgY3VycmVudCA9IGludGVycnVwdGVkV29yay5hbHRlcm5hdGU7CiAgICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGN1cnJlbnQsIGludGVycnVwdGVkV29yayk7CiAgICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjsKICAgICAgfQogICAgfQoKICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IHJvb3Q7CiAgICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gY3JlYXRlV29ya0luUHJvZ3Jlc3Mocm9vdC5jdXJyZW50LCBudWxsKTsKICAgIHdvcmtJblByb2dyZXNzID0gcm9vdFdvcmtJblByb2dyZXNzOwogICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbGFuZXM7CiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7CiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gbnVsbDsKICAgIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7CiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IE5vTGFuZXM7CiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7CiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbDsKICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDsKICAgIGZpbmlzaFF1ZXVlaW5nQ29uY3VycmVudFVwZGF0ZXMoKTsKCiAgICB7CiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MoKTsKICAgIH0KCiAgICByZXR1cm4gcm9vdFdvcmtJblByb2dyZXNzOwogIH0KCiAgZnVuY3Rpb24gaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpIHsKICAgIGRvIHsKICAgICAgdmFyIGVycm9yZWRXb3JrID0gd29ya0luUHJvZ3Jlc3M7CgogICAgICB0cnkgewogICAgICAgIC8vIFJlc2V0IG1vZHVsZS1sZXZlbCBzdGF0ZSB0aGF0IHdhcyBzZXQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuCiAgICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7CiAgICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTsKICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpOyAvLyBUT0RPOiBJIGZvdW5kIGFuZCBhZGRlZCB0aGlzIG1pc3NpbmcgbGluZSB3aGlsZSBpbnZlc3RpZ2F0aW5nIGEKICAgICAgICAvLyBzZXBhcmF0ZSBpc3N1ZS4gV3JpdGUgYSByZWdyZXNzaW9uIHRlc3QgdXNpbmcgc3RyaW5nIHJlZnMuCgogICAgICAgIFJlYWN0Q3VycmVudE93bmVyJDIuY3VycmVudCA9IG51bGw7CgogICAgICAgIGlmIChlcnJvcmVkV29yayA9PT0gbnVsbCB8fCBlcnJvcmVkV29yay5yZXR1cm4gPT09IG51bGwpIHsKICAgICAgICAgIC8vIEV4cGVjdGVkIHRvIGJlIHdvcmtpbmcgb24gYSBub24tcm9vdCBmaWJlci4gVGhpcyBpcyBhIGZhdGFsIGVycm9yCiAgICAgICAgICAvLyBiZWNhdXNlIHRoZXJlJ3Mgbm8gYW5jZXN0b3IgdGhhdCBjYW4gaGFuZGxlIGl0OyB0aGUgcm9vdCBpcwogICAgICAgICAgLy8gc3VwcG9zZWQgdG8gY2FwdHVyZSBhbGwgZXJyb3JzIHRoYXQgd2VyZW4ndCBjYXVnaHQgYnkgYW4gZXJyb3IKICAgICAgICAgIC8vIGJvdW5kYXJ5LgogICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RGYXRhbEVycm9yZWQ7CiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yID0gdGhyb3duVmFsdWU7IC8vIFNldCBgd29ya0luUHJvZ3Jlc3NgIHRvIG51bGwuIFRoaXMgcmVwcmVzZW50cyBhZHZhbmNpbmcgdG8gdGhlIG5leHQKICAgICAgICAgIC8vIHNpYmxpbmcsIG9yIHRoZSBwYXJlbnQgaWYgdGhlcmUgYXJlIG5vIHNpYmxpbmdzLiBCdXQgc2luY2UgdGhlIHJvb3QKICAgICAgICAgIC8vIGhhcyBubyBzaWJsaW5ncyBub3IgYSBwYXJlbnQsIHdlIHNldCBpdCB0byBudWxsLiBVc3VhbGx5IHRoaXMgaXMKICAgICAgICAgIC8vIGhhbmRsZWQgYnkgYGNvbXBsZXRlVW5pdE9mV29ya2Agb3IgYHVud2luZFdvcmtgLCBidXQgc2luY2Ugd2UncmUKICAgICAgICAgIC8vIGludGVudGlvbmFsbHkgbm90IGNhbGxpbmcgdGhvc2UsIHdlIG5lZWQgc2V0IGl0IGhlcmUuCiAgICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBjYWxsaW5nIGB1bndpbmRXb3JrYCB0byBwb3AgdGhlIGNvbnRleHRzLgoKICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVycm9yZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgewogICAgICAgICAgLy8gUmVjb3JkIHRoZSB0aW1lIHNwZW50IHJlbmRlcmluZyBiZWZvcmUgYW4gZXJyb3Igd2FzIHRocm93bi4gVGhpcwogICAgICAgICAgLy8gYXZvaWRzIGluYWNjdXJhdGUgUHJvZmlsZXIgZHVyYXRpb25zIGluIHRoZSBjYXNlIG9mIGEKICAgICAgICAgIC8vIHN1c3BlbmRlZCByZW5kZXIuCiAgICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGVycm9yZWRXb3JrLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIGlmIChlbmFibGVTY2hlZHVsaW5nUHJvZmlsZXIpIHsKICAgICAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7CgogICAgICAgICAgaWYgKHRocm93blZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB0aHJvd25WYWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRocm93blZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgdmFyIHdha2VhYmxlID0gdGhyb3duVmFsdWU7CiAgICAgICAgICAgIG1hcmtDb21wb25lbnRTdXNwZW5kZWQoZXJyb3JlZFdvcmssIHdha2VhYmxlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtYXJrQ29tcG9uZW50RXJyb3JlZChlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRocm93RXhjZXB0aW9uKHJvb3QsIGVycm9yZWRXb3JrLnJldHVybiwgZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7CiAgICAgICAgY29tcGxldGVVbml0T2ZXb3JrKGVycm9yZWRXb3JrKTsKICAgICAgfSBjYXRjaCAoeWV0QW5vdGhlclRocm93blZhbHVlKSB7CiAgICAgICAgLy8gU29tZXRoaW5nIGluIHRoZSByZXR1cm4gcGF0aCBhbHNvIHRocmV3LgogICAgICAgIHRocm93blZhbHVlID0geWV0QW5vdGhlclRocm93blZhbHVlOwoKICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MgPT09IGVycm9yZWRXb3JrICYmIGVycm9yZWRXb3JrICE9PSBudWxsKSB7CiAgICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGhhcyBhbHJlYWR5IGVycm9yZWQsIHRoZW4gd2UgaGFkIHRyb3VibGUgcHJvY2Vzc2luZwogICAgICAgICAgLy8gdGhlIGVycm9yLiBCdWJibGUgaXQgdG8gdGhlIG5leHQgYm91bmRhcnkuCiAgICAgICAgICBlcnJvcmVkV29yayA9IGVycm9yZWRXb3JrLnJldHVybjsKICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gZXJyb3JlZFdvcms7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVycm9yZWRXb3JrID0gd29ya0luUHJvZ3Jlc3M7CiAgICAgICAgfQoKICAgICAgICBjb250aW51ZTsKICAgICAgfSAvLyBSZXR1cm4gdG8gdGhlIG5vcm1hbCB3b3JrIGxvb3AuCgoKICAgICAgcmV0dXJuOwogICAgfSB3aGlsZSAodHJ1ZSk7CiAgfQoKICBmdW5jdGlvbiBwdXNoRGlzcGF0Y2hlcigpIHsKICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50OwogICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7CgogICAgaWYgKHByZXZEaXNwYXRjaGVyID09PSBudWxsKSB7CiAgICAgIC8vIFRoZSBSZWFjdCBpc29tb3JwaGljIHBhY2thZ2UgZG9lcyBub3QgaW5jbHVkZSBhIGRlZmF1bHQgZGlzcGF0Y2hlci4KICAgICAgLy8gSW5zdGVhZCB0aGUgZmlyc3QgcmVuZGVyZXIgd2lsbCBsYXppbHkgYXR0YWNoIG9uZSwgaW4gb3JkZXIgdG8gZ2l2ZQogICAgICAvLyBuaWNlciBlcnJvciBtZXNzYWdlcy4KICAgICAgcmV0dXJuIENvbnRleHRPbmx5RGlzcGF0Y2hlcjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBwcmV2RGlzcGF0Y2hlcjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpIHsKICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7CiAgfQoKICBmdW5jdGlvbiBtYXJrQ29tbWl0VGltZU9mRmFsbGJhY2soKSB7CiAgICBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lID0gbm93KCk7CiAgfQogIGZ1bmN0aW9uIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobGFuZSkgewogICAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gbWVyZ2VMYW5lcyhsYW5lLCB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMpOwogIH0KICBmdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kKCkgewogICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7CiAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkOwogICAgfQogIH0KICBmdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkgewogICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzIHx8IHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWQgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHsKICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk7CiAgICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1cGRhdGVzIHRoYXQgd2Ugc2tpcHBlZCB0cmVlIHRoYXQgbWlnaHQgaGF2ZSB1bmJsb2NrZWQKICAgIC8vIHRoaXMgcmVuZGVyLgoKCiAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsICYmIChpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcykgfHwgaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcykpKSB7CiAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgcmVuZGVyIGFzIHN1c3BlbmRlZCBzbyB0aGF0IHdlIHN3aXRjaCB0byB3b3JraW5nIG9uCiAgICAgIC8vIHRoZSB1cGRhdGVzIHRoYXQgd2VyZSBza2lwcGVkLiBVc3VhbGx5IHdlIG9ubHkgc3VzcGVuZCBhdCB0aGUgZW5kIG9mCiAgICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuCiAgICAgIC8vIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBhbHdheXMgbWFyayB0aGUgcm9vdCBhcyBzdXNwZW5kZWQgaW1tZWRpYXRlbHkKICAgICAgLy8gKGluc2lkZSB0aGlzIGZ1bmN0aW9uKSwgc2luY2UgYnkgc3VzcGVuZGluZyBhdCB0aGUgZW5kIG9mIHRoZSByZW5kZXIKICAgICAgLy8gcGhhc2UgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBtaXN0YWtlIHdoZXJlIHdlIHN1c3BlbmQgbGFuZXMgdGhhdCB3ZXJlCiAgICAgIC8vIHBpbmdlZCBvciB1cGRhdGVkIHdoaWxlIHdlIHdlcmUgcmVuZGVyaW5nLgogICAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHdvcmtJblByb2dyZXNzUm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpOwogICAgfQogIH0KICBmdW5jdGlvbiByZW5kZXJEaWRFcnJvcihlcnJvcikgewogICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgIT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkpIHsKICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RFcnJvcmVkOwogICAgfQoKICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID09PSBudWxsKSB7CiAgICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBbZXJyb3JdOwogICAgfSBlbHNlIHsKICAgICAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycy5wdXNoKGVycm9yKTsKICAgIH0KICB9IC8vIENhbGxlZCBkdXJpbmcgcmVuZGVyIHRvIGRldGVybWluZSBpZiBhbnl0aGluZyBoYXMgc3VzcGVuZGVkLgogIC8vIFJldHVybnMgZmFsc2UgaWYgd2UncmUgbm90IHN1cmUuCgogIGZ1bmN0aW9uIHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpIHsKICAgIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIG9yIGNvbXBsZXRlZCwgd2UgY2FuJ3QgcmVhbGx5IGJlIHN1cmUsCiAgICAvLyBzbyB0aG9zZSBhcmUgZmFsc2UuCiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3M7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcykgewogICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDsKICAgIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDsKICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFjawogICAgLy8gYW5kIHByZXBhcmUgYSBmcmVzaCBvbmUuIE90aGVyd2lzZSB3ZSdsbCBjb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZi4KCiAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcykgewogICAgICB7CiAgICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7CiAgICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVyczsKCiAgICAgICAgICBpZiAobWVtb2l6ZWRVcGRhdGVycy5zaXplID4gMCkgewogICAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTsKICAgICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpOwogICAgICAgICAgfSAvLyBBdCB0aGlzIHBvaW50LCBtb3ZlIEZpYmVycyB0aGF0IHNjaGVkdWxlZCB0aGUgdXBjb21pbmcgd29yayBmcm9tIHRoZSBNYXAgdG8gdGhlIFNldC4KICAgICAgICAgIC8vIElmIHdlIGJhaWxvdXQgb24gdGhpcyB3b3JrLCB3ZSdsbCBtb3ZlIHRoZW0gYmFjayAobGlrZSBhYm92ZSkuCiAgICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy4KICAgICAgICAgIC8vIFRoYXQgd2F5IHdlIGNhbiBrZWVwIHRoZSBjdXJyZW50IHVwZGF0ZSBhbmQgZnV0dXJlIHVwZGF0ZXMgc2VwYXJhdGUuCgoKICAgICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcygpOwogICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7CiAgICB9CgogICAgewogICAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7CiAgICB9CgogICAgZG8gewogICAgICB0cnkgewogICAgICAgIHdvcmtMb29wU3luYygpOwogICAgICAgIGJyZWFrOwogICAgICB9IGNhdGNoICh0aHJvd25WYWx1ZSkgewogICAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTsKICAgICAgfQogICAgfSB3aGlsZSAodHJ1ZSk7CgogICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7CiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7CiAgICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTsKCiAgICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHsKICAgICAgLy8gVGhpcyBpcyBhIHN5bmMgcmVuZGVyLCBzbyB3ZSBzaG91bGQgaGF2ZSBmaW5pc2hlZCB0aGUgd2hvbGUgdHJlZS4KICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tbWl0IGFuIGluY29tcGxldGUgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgJyArICdidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgfQoKICAgIHsKICAgICAgbWFya1JlbmRlclN0b3BwZWQoKTsKICAgIH0gLy8gU2V0IHRoaXMgdG8gbnVsbCB0byBpbmRpY2F0ZSB0aGVyZSdzIG5vIGluLXByb2dyZXNzIHJlbmRlci4KCgogICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDsKICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsKICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzOwogIH0gLy8gVGhlIHdvcmsgbG9vcCBpcyBhbiBleHRyZW1lbHkgaG90IHBhdGguIFRlbGwgQ2xvc3VyZSBub3QgdG8gaW5saW5lIGl0LgoKICAvKiogQG5vaW5saW5lICovCgoKICBmdW5jdGlvbiB3b3JrTG9vcFN5bmMoKSB7CiAgICAvLyBBbHJlYWR5IHRpbWVkIG91dCwgc28gcGVyZm9ybSB3b3JrIHdpdGhvdXQgY2hlY2tpbmcgaWYgd2UgbmVlZCB0byB5aWVsZC4KICAgIHdoaWxlICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkgewogICAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykgewogICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDsKICAgIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDsKICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFjawogICAgLy8gYW5kIHByZXBhcmUgYSBmcmVzaCBvbmUuIE90aGVyd2lzZSB3ZSdsbCBjb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZi4KCiAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcykgewogICAgICB7CiAgICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7CiAgICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVyczsKCiAgICAgICAgICBpZiAobWVtb2l6ZWRVcGRhdGVycy5zaXplID4gMCkgewogICAgICAgICAgICByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTsKICAgICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpOwogICAgICAgICAgfSAvLyBBdCB0aGlzIHBvaW50LCBtb3ZlIEZpYmVycyB0aGF0IHNjaGVkdWxlZCB0aGUgdXBjb21pbmcgd29yayBmcm9tIHRoZSBNYXAgdG8gdGhlIFNldC4KICAgICAgICAgIC8vIElmIHdlIGJhaWxvdXQgb24gdGhpcyB3b3JrLCB3ZSdsbCBtb3ZlIHRoZW0gYmFjayAobGlrZSBhYm92ZSkuCiAgICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy4KICAgICAgICAgIC8vIFRoYXQgd2F5IHdlIGNhbiBrZWVwIHRoZSBjdXJyZW50IHVwZGF0ZSBhbmQgZnV0dXJlIHVwZGF0ZXMgc2VwYXJhdGUuCgoKICAgICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gZ2V0VHJhbnNpdGlvbnNGb3JMYW5lcygpOwogICAgICByZXNldFJlbmRlclRpbWVyKCk7CiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTsKICAgIH0KCiAgICB7CiAgICAgIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKTsKICAgIH0KCiAgICBkbyB7CiAgICAgIHRyeSB7CiAgICAgICAgd29ya0xvb3BDb25jdXJyZW50KCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7CiAgICAgICAgaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpOwogICAgICB9CiAgICB9IHdoaWxlICh0cnVlKTsKCiAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTsKICAgIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpOwogICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OwoKCiAgICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHsKICAgICAgLy8gU3RpbGwgd29yayByZW1haW5pbmcuCiAgICAgIHsKICAgICAgICBtYXJrUmVuZGVyWWllbGRlZCgpOwogICAgICB9CgogICAgICByZXR1cm4gUm9vdEluUHJvZ3Jlc3M7CiAgICB9IGVsc2UgewogICAgICAvLyBDb21wbGV0ZWQgdGhlIHRyZWUuCiAgICAgIHsKICAgICAgICBtYXJrUmVuZGVyU3RvcHBlZCgpOwogICAgICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuCgoKICAgICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDsKICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzOyAvLyBSZXR1cm4gdGhlIGZpbmFsIGV4aXQgc3RhdHVzLgoKICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7CiAgICB9CiAgfQogIC8qKiBAbm9pbmxpbmUgKi8KCgogIGZ1bmN0aW9uIHdvcmtMb29wQ29uY3VycmVudCgpIHsKICAgIC8vIFBlcmZvcm0gd29yayB1bnRpbCBTY2hlZHVsZXIgYXNrcyB1cyB0byB5aWVsZAogICAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsICYmICFzaG91bGRZaWVsZCgpKSB7CiAgICAgIHBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHBlcmZvcm1Vbml0T2ZXb3JrKHVuaXRPZldvcmspIHsKICAgIC8vIFRoZSBjdXJyZW50LCBmbHVzaGVkLCBzdGF0ZSBvZiB0aGlzIGZpYmVyIGlzIHRoZSBhbHRlcm5hdGUuIElkZWFsbHkKICAgIC8vIG5vdGhpbmcgc2hvdWxkIHJlbHkgb24gdGhpcywgYnV0IHJlbHlpbmcgb24gaXQgaGVyZSBtZWFucyB0aGF0IHdlIGRvbid0CiAgICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuCiAgICB2YXIgY3VycmVudCA9IHVuaXRPZldvcmsuYWx0ZXJuYXRlOwogICAgc2V0Q3VycmVudEZpYmVyKHVuaXRPZldvcmspOwogICAgdmFyIG5leHQ7CgogICAgaWYgKCAodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHsKICAgICAgc3RhcnRQcm9maWxlclRpbWVyKHVuaXRPZldvcmspOwogICAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTsKICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh1bml0T2ZXb3JrLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIG5leHQgPSBiZWdpbldvcmskMShjdXJyZW50LCB1bml0T2ZXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpOwogICAgfQoKICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7CiAgICB1bml0T2ZXb3JrLm1lbW9pemVkUHJvcHMgPSB1bml0T2ZXb3JrLnBlbmRpbmdQcm9wczsKCiAgICBpZiAobmV4dCA9PT0gbnVsbCkgewogICAgICAvLyBJZiB0aGlzIGRvZXNuJ3Qgc3Bhd24gbmV3IHdvcmssIGNvbXBsZXRlIHRoZSBjdXJyZW50IHdvcmsuCiAgICAgIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKTsKICAgIH0gZWxzZSB7CiAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDsKICAgIH0KCiAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsOwogIH0KCiAgZnVuY3Rpb24gY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspIHsKICAgIC8vIEF0dGVtcHQgdG8gY29tcGxldGUgdGhlIGN1cnJlbnQgdW5pdCBvZiB3b3JrLCB0aGVuIG1vdmUgdG8gdGhlIG5leHQKICAgIC8vIHNpYmxpbmcuIElmIHRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmdzLCByZXR1cm4gdG8gdGhlIHBhcmVudCBmaWJlci4KICAgIHZhciBjb21wbGV0ZWRXb3JrID0gdW5pdE9mV29yazsKCiAgICBkbyB7CiAgICAgIC8vIFRoZSBjdXJyZW50LCBmbHVzaGVkLCBzdGF0ZSBvZiB0aGlzIGZpYmVyIGlzIHRoZSBhbHRlcm5hdGUuIElkZWFsbHkKICAgICAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3QKICAgICAgLy8gbmVlZCBhbiBhZGRpdGlvbmFsIGZpZWxkIG9uIHRoZSB3b3JrIGluIHByb2dyZXNzLgogICAgICB2YXIgY3VycmVudCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlOwogICAgICB2YXIgcmV0dXJuRmliZXIgPSBjb21wbGV0ZWRXb3JrLnJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHdvcmsgY29tcGxldGVkIG9yIGlmIHNvbWV0aGluZyB0aHJldy4KCiAgICAgIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIEluY29tcGxldGUpID09PSBOb0ZsYWdzKSB7CiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGNvbXBsZXRlZFdvcmspOwogICAgICAgIHZhciBuZXh0ID0gdm9pZCAwOwoKICAgICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgPT09IE5vTW9kZSkgewogICAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIoY29tcGxldGVkV29yayk7CiAgICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7IC8vIFVwZGF0ZSByZW5kZXIgZHVyYXRpb24gYXNzdW1pbmcgd2UgZGlkbid0IGVycm9yLgoKICAgICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTsKCiAgICAgICAgaWYgKG5leHQgIT09IG51bGwpIHsKICAgICAgICAgIC8vIENvbXBsZXRpbmcgdGhpcyBmaWJlciBzcGF3bmVkIG5ldyB3b3JrLiBXb3JrIG9uIHRoYXQgbmV4dC4KICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhpcyBmaWJlciBkaWQgbm90IGNvbXBsZXRlIGJlY2F1c2Ugc29tZXRoaW5nIHRocmV3LiBQb3AgdmFsdWVzIG9mZgogICAgICAgIC8vIHRoZSBzdGFjayB3aXRob3V0IGVudGVyaW5nIHRoZSBjb21wbGV0ZSBwaGFzZS4gSWYgdGhpcyBpcyBhIGJvdW5kYXJ5LAogICAgICAgIC8vIGNhcHR1cmUgdmFsdWVzIGlmIHBvc3NpYmxlLgogICAgICAgIHZhciBfbmV4dCA9IHVud2luZFdvcmsoY3VycmVudCwgY29tcGxldGVkV29yayk7IC8vIEJlY2F1c2UgdGhpcyBmaWJlciBkaWQgbm90IGNvbXBsZXRlLCBkb24ndCByZXNldCBpdHMgbGFuZXMuCgoKICAgICAgICBpZiAoX25leHQgIT09IG51bGwpIHsKICAgICAgICAgIC8vIElmIGNvbXBsZXRpbmcgdGhpcyB3b3JrIHNwYXduZWQgbmV3IHdvcmssIGRvIHRoYXQgbmV4dC4gV2UnbGwgY29tZQogICAgICAgICAgLy8gYmFjayBoZXJlIGFnYWluLgogICAgICAgICAgLy8gU2luY2Ugd2UncmUgcmVzdGFydGluZywgcmVtb3ZlIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgaG9zdCBlZmZlY3QKICAgICAgICAgIC8vIGZyb20gdGhlIGVmZmVjdCB0YWcuCiAgICAgICAgICBfbmV4dC5mbGFncyAmPSBIb3N0RWZmZWN0TWFzazsKICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gX25leHQ7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkgewogICAgICAgICAgLy8gUmVjb3JkIHRoZSByZW5kZXIgZHVyYXRpb24gZm9yIHRoZSBmaWJlciB0aGF0IGVycm9yZWQuCiAgICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGNvbXBsZXRlZFdvcmssIGZhbHNlKTsgLy8gSW5jbHVkZSB0aGUgdGltZSBzcGVudCB3b3JraW5nIG9uIGZhaWxlZCBjaGlsZHJlbiBiZWZvcmUgY29udGludWluZy4KCiAgICAgICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uOwogICAgICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDsKCiAgICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHsKICAgICAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247CiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZzsKICAgICAgICAgIH0KCiAgICAgICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247CiAgICAgICAgfQoKICAgICAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHsKICAgICAgICAgIC8vIE1hcmsgdGhlIHBhcmVudCBmaWJlciBhcyBpbmNvbXBsZXRlIGFuZCBjbGVhciBpdHMgc3VidHJlZSBmbGFncy4KICAgICAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7CiAgICAgICAgICByZXR1cm5GaWJlci5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzOwogICAgICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gV2UndmUgdW53b3VuZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdC4KICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RGlkTm90Q29tcGxldGU7CiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgc2libGluZ0ZpYmVyID0gY29tcGxldGVkV29yay5zaWJsaW5nOwoKICAgICAgaWYgKHNpYmxpbmdGaWJlciAhPT0gbnVsbCkgewogICAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyBpbiB0aGlzIHJldHVybkZpYmVyLCBkbyB0aGF0IG5leHQuCiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBzaWJsaW5nRmliZXI7CiAgICAgICAgcmV0dXJuOwogICAgICB9IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRvIHRoZSBwYXJlbnQKCgogICAgICBjb21wbGV0ZWRXb3JrID0gcmV0dXJuRmliZXI7IC8vIFVwZGF0ZSB0aGUgbmV4dCB0aGluZyB3ZSdyZSB3b3JraW5nIG9uIGluIGNhc2Ugc29tZXRoaW5nIHRocm93cy4KCiAgICAgIHdvcmtJblByb2dyZXNzID0gY29tcGxldGVkV29yazsKICAgIH0gd2hpbGUgKGNvbXBsZXRlZFdvcmsgIT09IG51bGwpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSByb290LgoKCiAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MpIHsKICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RDb21wbGV0ZWQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21taXRSb290KHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucykgewogICAgLy8gVE9ETzogVGhpcyBubyBsb25nZXIgbWFrZXMgYW55IHNlbnNlLiBXZSBhbHJlYWR5IHdyYXAgdGhlIG11dGF0aW9uIGFuZAogICAgLy8gbGF5b3V0IHBoYXNlcy4gU2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlLgogICAgdmFyIHByZXZpb3VzVXBkYXRlTGFuZVByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7CiAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247CgogICAgdHJ5IHsKICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDsKICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7CiAgICAgIGNvbW1pdFJvb3RJbXBsKHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucywgcHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkpOwogICAgfSBmaW5hbGx5IHsKICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247CiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiBjb21taXRSb290SW1wbChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHsKICAgIGRvIHsKICAgICAgLy8gYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIHdpbGwgY2FsbCBgZmx1c2hTeW5jVXBkYXRlUXVldWVgIGF0IHRoZSBlbmQsIHdoaWNoCiAgICAgIC8vIG1lYW5zIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCB3aWxsIHNvbWV0aW1lcyByZXN1bHQgaW4gYWRkaXRpb25hbAogICAgICAvLyBwYXNzaXZlIGVmZmVjdHMuIFNvIHdlIG5lZWQgdG8ga2VlcCBmbHVzaGluZyBpbiBhIGxvb3AgdW50aWwgdGhlcmUgYXJlCiAgICAgIC8vIG5vIG1vcmUgcGVuZGluZyBlZmZlY3RzLgogICAgICAvLyBUT0RPOiBNaWdodCBiZSBiZXR0ZXIgaWYgYGZsdXNoUGFzc2l2ZUVmZmVjdHNgIGRpZCBub3QgYXV0b21hdGljYWxseQogICAgICAvLyBmbHVzaCBzeW5jaHJvbm91cyB3b3JrIGF0IHRoZSBlbmQsIHRvIGF2b2lkIGZhY3RvcmluZyBoYXphcmRzIGxpa2UgdGhpcy4KICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpOwogICAgfSB3aGlsZSAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpOwoKICAgIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpOwoKICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTsKICAgIH0KCiAgICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7CiAgICB2YXIgbGFuZXMgPSByb290LmZpbmlzaGVkTGFuZXM7CgogICAgewogICAgICBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcyk7CiAgICB9CgogICAgaWYgKGZpbmlzaGVkV29yayA9PT0gbnVsbCkgewoKICAgICAgewogICAgICAgIG1hcmtDb21taXRTdG9wcGVkKCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgewogICAgICAgIGlmIChsYW5lcyA9PT0gTm9MYW5lcykgewogICAgICAgICAgZXJyb3IoJ3Jvb3QuZmluaXNoZWRMYW5lcyBzaG91bGQgbm90IGJlIGVtcHR5IGR1cmluZyBhIGNvbW1pdC4gVGhpcyBpcyBhICcgKyAnYnVnIGluIFJlYWN0LicpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDsKICAgIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7CgogICAgaWYgKGZpbmlzaGVkV29yayA9PT0gcm9vdC5jdXJyZW50KSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCB0aGUgc2FtZSB0cmVlIGFzIGJlZm9yZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5ICcgKyAnYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgfSAvLyBjb21taXRSb290IG5ldmVyIHJldHVybnMgYSBjb250aW51YXRpb247IGl0IGFsd2F5cyBmaW5pc2hlcyBzeW5jaHJvbm91c2x5LgogICAgLy8gU28gd2UgY2FuIGNsZWFyIHRoZXNlIG5vdyB0byBhbGxvdyBhIG5ldyBjYWxsYmFjayB0byBiZSBzY2hlZHVsZWQuCgoKICAgIHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbDsKICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTsgLy8gVXBkYXRlIHRoZSBmaXJzdCBhbmQgbGFzdCBwZW5kaW5nIHRpbWVzIG9uIHRoaXMgcm9vdC4gVGhlIG5ldyBmaXJzdAogICAgLy8gcGVuZGluZyB0aW1lIGlzIHdoYXRldmVyIGlzIGxlZnQgb24gdGhlIHJvb3QgZmliZXIuCgogICAgdmFyIHJlbWFpbmluZ0xhbmVzID0gbWVyZ2VMYW5lcyhmaW5pc2hlZFdvcmsubGFuZXMsIGZpbmlzaGVkV29yay5jaGlsZExhbmVzKTsKICAgIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpOwoKICAgIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHsKICAgICAgLy8gV2UgY2FuIHJlc2V0IHRoZXNlIG5vdyB0aGF0IHRoZXkgYXJlIGZpbmlzaGVkLgogICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsOwogICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7CiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsKICAgIH0gLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzLCBzY2hlZHVsZSBhIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlbS4KICAgIC8vIERvIHRoaXMgYXMgZWFybHkgYXMgcG9zc2libGUsIHNvIGl0IGlzIHF1ZXVlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSB0aGF0CiAgICAvLyBtaWdodCBnZXQgc2NoZWR1bGVkIGluIHRoZSBjb21taXQgcGhhc2UuIChTZWUgIzE2NzE0LikKICAgIC8vIFRPRE86IERlbGV0ZSBhbGwgb3RoZXIgcGxhY2VzIHRoYXQgc2NoZWR1bGUgdGhlIHBhc3NpdmUgZWZmZWN0IGNhbGxiYWNrCiAgICAvLyBUaGV5J3JlIHJlZHVuZGFudC4KCgogICAgaWYgKChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzIHx8IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MpIHsKICAgICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykgewogICAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTsKICAgICAgICAvLyB0byBzdG9yZSBpdCBpbiBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zIHVudGlsIHRoZXkgZ2V0IHByb2Nlc3NlZAogICAgICAgIC8vIFdlIG5lZWQgdG8gcGFzcyB0aGlzIHRocm91Z2ggYXMgYW4gYXJndW1lbnQgdG8gY29tbWl0Um9vdAogICAgICAgIC8vIGJlY2F1c2Ugd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyBtaWdodCBoYXZlIGNoYW5nZWQgYmV0d2VlbgogICAgICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIgYW5kIGNvbW1pdCBpZiB3ZSB0aHJvdHRsZSB0aGUgY29tbWl0CiAgICAgICAgLy8gd2l0aCBzZXRUaW1lb3V0CgogICAgICAgIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSB0cmFuc2l0aW9uczsKICAgICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTsgLy8gVGhpcyByZW5kZXIgdHJpZ2dlcmVkIHBhc3NpdmUgZWZmZWN0czogcmVsZWFzZSB0aGUgcm9vdCBjYWNoZSBwb29sCiAgICAgICAgICAvLyAqYWZ0ZXIqIHBhc3NpdmUgZWZmZWN0cyBmaXJlIHRvIGF2b2lkIGZyZWVpbmcgYSBjYWNoZSBwb29sIHRoYXQgbWF5CiAgICAgICAgICAvLyBiZSByZWZlcmVuY2VkIGJ5IGEgbm9kZSBpbiB0aGUgdHJlZSAoSG9zdFJvb3QsIENhY2hlIGJvdW5kYXJ5IGV0YykKCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9KTsKICAgICAgfQogICAgfSAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGVmZmVjdHMgaW4gdGhlIHdob2xlIHRyZWUuCiAgICAvLyBUT0RPOiBUaGlzIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBlZmZlY3QgbGlzdCBpbXBsZW1lbnRhdGlvbiwgd2hlcmUgd2UgaGFkCiAgICAvLyB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBgZmlyc3RFZmZlY3RgIHRvIHNhdGlzZnkgRmxvdy4gSSB0aGluayB0aGUKICAgIC8vIG9ubHkgb3RoZXIgcmVhc29uIHRoaXMgb3B0aW1pemF0aW9uIGV4aXN0cyBpcyBiZWNhdXNlIGl0IGFmZmVjdHMgcHJvZmlsaW5nLgogICAgLy8gUmVjb25zaWRlciB3aGV0aGVyIHRoaXMgaXMgbmVjZXNzYXJ5LgoKCiAgICB2YXIgc3VidHJlZUhhc0VmZmVjdHMgPSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFnczsKICAgIHZhciByb290SGFzRWZmZWN0ID0gKGZpbmlzaGVkV29yay5mbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFnczsKCiAgICBpZiAoc3VidHJlZUhhc0VmZmVjdHMgfHwgcm9vdEhhc0VmZmVjdCkgewogICAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247CiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7CiAgICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7CiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpOwogICAgICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0OwogICAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7IC8vIFJlc2V0IHRoaXMgdG8gbnVsbCBiZWZvcmUgY2FsbGluZyBsaWZlY3ljbGVzCgogICAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsOyAvLyBUaGUgY29tbWl0IHBoYXNlIGlzIGJyb2tlbiBpbnRvIHNldmVyYWwgc3ViLXBoYXNlcy4gV2UgZG8gYSBzZXBhcmF0ZSBwYXNzCiAgICAgIC8vIG9mIHRoZSBlZmZlY3QgbGlzdCBmb3IgZWFjaCBwaGFzZTogYWxsIG11dGF0aW9uIGVmZmVjdHMgY29tZSBiZWZvcmUgYWxsCiAgICAgIC8vIGxheW91dCBlZmZlY3RzLCBhbmQgc28gb24uCiAgICAgIC8vIFRoZSBmaXJzdCBwaGFzZSBhICJiZWZvcmUgbXV0YXRpb24iIHBoYXNlLiBXZSB1c2UgdGhpcyBwaGFzZSB0byByZWFkIHRoZQogICAgICAvLyBzdGF0ZSBvZiB0aGUgaG9zdCB0cmVlIHJpZ2h0IGJlZm9yZSB3ZSBtdXRhdGUgaXQuIFRoaXMgaXMgd2hlcmUKICAgICAgLy8gZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgaXMgY2FsbGVkLgoKICAgICAgdmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspOwoKICAgICAgewogICAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgY29tbWl0IHRpbWUgdG8gYmUgc2hhcmVkIGJ5IGFsbCBQcm9maWxlcnMgaW4gdGhpcwogICAgICAgIC8vIGJhdGNoLiBUaGlzIGVuYWJsZXMgdGhlbSB0byBiZSBncm91cGVkIGxhdGVyLgogICAgICAgIHJlY29yZENvbW1pdFRpbWUoKTsKICAgICAgfQoKCiAgICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTsKCiAgICAgIHJlc2V0QWZ0ZXJDb21taXQocm9vdC5jb250YWluZXJJbmZvKTsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgdHJlZSBpcyBub3cgdGhlIGN1cnJlbnQgdHJlZS4gVGhpcyBtdXN0IGNvbWUgYWZ0ZXIKICAgICAgLy8gdGhlIG11dGF0aW9uIHBoYXNlLCBzbyB0aGF0IHRoZSBwcmV2aW91cyB0cmVlIGlzIHN0aWxsIGN1cnJlbnQgZHVyaW5nCiAgICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBsYXlvdXQgcGhhc2UsIHNvIHRoYXQgdGhlIGZpbmlzaGVkCiAgICAgIC8vIHdvcmsgaXMgY3VycmVudCBkdXJpbmcgY29tcG9uZW50RGlkTW91bnQvVXBkYXRlLgoKICAgICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBUaGUgbmV4dCBwaGFzZSBpcyB0aGUgbGF5b3V0IHBoYXNlLCB3aGVyZSB3ZSBjYWxsIGVmZmVjdHMgdGhhdCByZWFkCgogICAgICB7CiAgICAgICAgbWFya0xheW91dEVmZmVjdHNTdGFydGVkKGxhbmVzKTsKICAgICAgfQoKICAgICAgY29tbWl0TGF5b3V0RWZmZWN0cyhmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKTsKCiAgICAgIHsKICAgICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTsKICAgICAgfQogICAgICAvLyBvcHBvcnR1bml0eSB0byBwYWludC4KCgogICAgICByZXF1ZXN0UGFpbnQoKTsKICAgICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBSZXNldCB0aGUgcHJpb3JpdHkgdG8gdGhlIHByZXZpb3VzIG5vbi1zeW5jIHZhbHVlLgoKICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpOwogICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjsKICAgIH0gZWxzZSB7CiAgICAgIC8vIE5vIGVmZmVjdHMuCiAgICAgIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yazsgLy8gTWVhc3VyZSB0aGVzZSBhbnl3YXkgc28gdGhlIGZsYW1lZ3JhcGggZXhwbGljaXRseSBzaG93cyB0aGF0IHRoZXJlIHdlcmUKICAgICAgLy8gbm8gZWZmZWN0cy4KICAgICAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gcmVwb3J0IHRoaXMuCgogICAgICB7CiAgICAgICAgcmVjb3JkQ29tbWl0VGltZSgpOwogICAgICB9CiAgICB9CgogICAgdmFyIHJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMgPSByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0czsKCiAgICBpZiAocm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHsKICAgICAgLy8gVGhpcyBjb21taXQgaGFzIHBhc3NpdmUgZWZmZWN0cy4gU3Rhc2ggYSByZWZlcmVuY2UgdG8gdGhlbS4gQnV0IGRvbid0CiAgICAgIC8vIHNjaGVkdWxlIGEgY2FsbGJhY2sgdW50aWwgYWZ0ZXIgZmx1c2hpbmcgbGF5b3V0IHdvcmsuCiAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7CiAgICAgIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gcm9vdDsKICAgICAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBsYW5lczsKICAgIH0gZWxzZSB7CgogICAgICB7CiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDsKICAgICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDsKICAgICAgfQogICAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGFuIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXQKCgogICAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lczsgLy8gQ2hlY2sgaWYgdGhlcmUncyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3QKICAgIC8vIFRPRE86IFRoaXMgaXMgcGFydCBvZiB0aGUgYGNvbXBvbmVudERpZENhdGNoYCBpbXBsZW1lbnRhdGlvbi4gSXRzIHB1cnBvc2UKICAgIC8vIGlzIHRvIGRldGVjdCB3aGV0aGVyIHNvbWV0aGluZyBtaWdodCBoYXZlIGNhbGxlZCBzZXRTdGF0ZSBpbnNpZGUKICAgIC8vIGBjb21wb25lbnREaWRDYXRjaGAuIFRoZSBtZWNoYW5pc20gaXMga25vd24gdG8gYmUgZmxhd2VkIGJlY2F1c2UgYHNldFN0YXRlYAogICAgLy8gaW5zaWRlIGBjb21wb25lbnREaWRDYXRjaGAgaXMgaXRzZWxmIGZsYXdlZCDigJQgdGhhdCdzIHdoeSB3ZSByZWNvbW1lbmQKICAgIC8vIGBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3JgIGluc3RlYWQuIEhvd2V2ZXIsIGl0IGNvdWxkIGJlIGltcHJvdmVkIGJ5CiAgICAvLyBjaGVja2luZyBpZiByZW1haW5pbmdMYW5lcyBpbmNsdWRlcyBTeW5jIHdvcmssIGluc3RlYWQgb2Ygd2hldGhlciB0aGVyZSdzCiAgICAvLyBhbnkgd29yayByZW1haW5pbmcgYXQgYWxsICh3aGljaCB3b3VsZCBhbHNvIGluY2x1ZGUgc3R1ZmYgbGlrZSBTdXNwZW5zZQogICAgLy8gcmV0cmllcyBvciB0cmFuc2l0aW9ucykuIEl0J3MgYmVlbiBsaWtlIHRoaXMgZm9yIGEgd2hpbGUsIHRob3VnaCwgc28gZml4aW5nCiAgICAvLyBpdCBwcm9iYWJseSBpc24ndCB0aGF0IHVyZ2VudC4KCiAgICBpZiAocmVtYWluaW5nTGFuZXMgPT09IE5vTGFuZXMpIHsKICAgICAgLy8gSWYgdGhlcmUncyBubyByZW1haW5pbmcgd29yaywgd2UgY2FuIGNsZWFyIHRoZSBzZXQgb2YgYWxyZWFkeSBmYWlsZWQKICAgICAgLy8gZXJyb3IgYm91bmRhcmllcy4KICAgICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsOwogICAgfQoKICAgIHsKICAgICAgaWYgKCFyb290RGlkSGF2ZVBhc3NpdmVFZmZlY3RzKSB7CiAgICAgICAgY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKHJvb3QuY3VycmVudCwgZmFsc2UpOwogICAgICB9CiAgICB9CgogICAgb25Db21taXRSb290KGZpbmlzaGVkV29yay5zdGF0ZU5vZGUsIHJlbmRlclByaW9yaXR5TGV2ZWwpOwoKICAgIHsKICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7CiAgICAgICAgcm9vdC5tZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7CiAgICAgIH0KICAgIH0KCiAgICB7CiAgICAgIG9uQ29tbWl0Um9vdCQxKCk7CiAgICB9IC8vIEFsd2F5cyBjYWxsIHRoaXMgYmVmb3JlIGV4aXRpbmcgYGNvbW1pdFJvb3RgLCB0byBlbnN1cmUgdGhhdCBhbnkKICAgIC8vIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QgaXMgc2NoZWR1bGVkLgoKCiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpOwoKICAgIGlmIChyZWNvdmVyYWJsZUVycm9ycyAhPT0gbnVsbCkgewogICAgICAvLyBUaGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCByZWNvdmVyZWQgZnJvbSB0aGVtIHdpdGhvdXQKICAgICAgLy8gbmVlZGluZyB0byBzdXJmYWNlIGl0IHRvIHRoZSBVSS4gV2UgbG9nIHRoZW0gaGVyZS4KICAgICAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IHJvb3Qub25SZWNvdmVyYWJsZUVycm9yOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvdmVyYWJsZUVycm9ycy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gcmVjb3ZlcmFibGVFcnJvcnNbaV07CiAgICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gcmVjb3ZlcmFibGVFcnJvci5zdGFjazsKICAgICAgICB2YXIgZGlnZXN0ID0gcmVjb3ZlcmFibGVFcnJvci5kaWdlc3Q7CiAgICAgICAgb25SZWNvdmVyYWJsZUVycm9yKHJlY292ZXJhYmxlRXJyb3IudmFsdWUsIHsKICAgICAgICAgIGNvbXBvbmVudFN0YWNrOiBjb21wb25lbnRTdGFjaywKICAgICAgICAgIGRpZ2VzdDogZGlnZXN0CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoaGFzVW5jYXVnaHRFcnJvcikgewogICAgICBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7CiAgICAgIHZhciBlcnJvciQxID0gZmlyc3RVbmNhdWdodEVycm9yOwogICAgICBmaXJzdFVuY2F1Z2h0RXJyb3IgPSBudWxsOwogICAgICB0aHJvdyBlcnJvciQxOwogICAgfSAvLyBJZiB0aGUgcGFzc2l2ZSBlZmZlY3RzIGFyZSB0aGUgcmVzdWx0IG9mIGEgZGlzY3JldGUgcmVuZGVyLCBmbHVzaCB0aGVtCiAgICAvLyBzeW5jaHJvbm91c2x5IGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdGFzayBzbyB0aGF0IHRoZSByZXN1bHQgaXMKICAgIC8vIGltbWVkaWF0ZWx5IG9ic2VydmFibGUuIE90aGVyd2lzZSwgd2UgYXNzdW1lIHRoYXQgdGhleSBhcmUgbm90CiAgICAvLyBvcmRlci1kZXBlbmRlbnQgYW5kIGRvIG5vdCBuZWVkIHRvIGJlIG9ic2VydmVkIGJ5IGV4dGVybmFsIHN5c3RlbXMsIHNvIHdlCiAgICAvLyBjYW4gd2FpdCB1bnRpbCBhZnRlciBwYWludC4KICAgIC8vIFRPRE86IFdlIGNhbiBvcHRpbWl6ZSB0aGlzIGJ5IG5vdCBzY2hlZHVsaW5nIHRoZSBjYWxsYmFjayBlYXJsaWVyLiBTaW5jZSB3ZQogICAgLy8gY3VycmVudGx5IHNjaGVkdWxlIHRoZSBjYWxsYmFjayBpbiBtdWx0aXBsZSBwbGFjZXMsIHdpbGwgd2FpdCB1bnRpbCB0aG9zZQogICAgLy8gYXJlIGNvbnNvbGlkYXRlZC4KCgogICAgaWYgKGluY2x1ZGVzU29tZUxhbmUocGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMsIFN5bmNMYW5lKSAmJiByb290LnRhZyAhPT0gTGVnYWN5Um9vdCkgewogICAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7CiAgICB9IC8vIFJlYWQgdGhpcyBhZ2Fpbiwgc2luY2UgYSBwYXNzaXZlIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXQKCgogICAgcmVtYWluaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lczsKCiAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW1haW5pbmdMYW5lcywgU3luY0xhbmUpKSB7CiAgICAgIHsKICAgICAgICBtYXJrTmVzdGVkVXBkYXRlU2NoZWR1bGVkKCk7CiAgICAgIH0gLy8gQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcm9vdCBzeW5jaHJvbm91c2x5IHJlLXJlbmRlcnMgd2l0aG91dAogICAgICAvLyBmaW5pc2hpbmcuIElmIHRoZXJlIGFyZSB0b28gbWFueSwgaXQgaW5kaWNhdGVzIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wLgoKCiAgICAgIGlmIChyb290ID09PSByb290V2l0aE5lc3RlZFVwZGF0ZXMpIHsKICAgICAgICBuZXN0ZWRVcGRhdGVDb3VudCsrOwogICAgICB9IGVsc2UgewogICAgICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDsKICAgICAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSByb290OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7CiAgICB9IC8vIElmIGxheW91dCB3b3JrIHdhcyBzY2hlZHVsZWQsIGZsdXNoIGl0IG5vdy4KCgogICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7CgogICAgewogICAgICBtYXJrQ29tbWl0U3RvcHBlZCgpOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hQYXNzaXZlRWZmZWN0cygpIHsKICAgIC8vIFJldHVybnMgd2hldGhlciBwYXNzaXZlIGVmZmVjdHMgd2VyZSBmbHVzaGVkLgogICAgLy8gVE9ETzogQ29tYmluZSB0aGlzIGNoZWNrIHdpdGggdGhlIG9uZSBpbiBmbHVzaFBhc3NpdmVFRmZlY3RzSW1wbC4gV2Ugc2hvdWxkCiAgICAvLyBwcm9iYWJseSBqdXN0IGNvbWJpbmUgdGhlIHR3byBmdW5jdGlvbnMuIEkgYmVsaWV2ZSB0aGV5IHdlcmUgb25seSBzZXBhcmF0ZQogICAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlIGJlY2F1c2Ugd2UgdXNlZCB0byB3cmFwIGl0IHdpdGgKICAgIC8vIGBTY2hlZHVsZXIucnVuV2l0aFByaW9yaXR5YCwgd2hpY2ggYWNjZXB0cyBhIGZ1bmN0aW9uLiBCdXQgbm93IHdlIHRyYWNrIHRoZQogICAgLy8gcHJpb3JpdHkgd2l0aGluIFJlYWN0IGl0c2VsZiwgc28gd2UgY2FuIG11dGF0ZSB0aGUgdmFyaWFibGUgZGlyZWN0bHkuCiAgICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpIHsKICAgICAgdmFyIHJlbmRlclByaW9yaXR5ID0gbGFuZXNUb0V2ZW50UHJpb3JpdHkocGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMpOwogICAgICB2YXIgcHJpb3JpdHkgPSBsb3dlckV2ZW50UHJpb3JpdHkoRGVmYXVsdEV2ZW50UHJpb3JpdHksIHJlbmRlclByaW9yaXR5KTsKICAgICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uOwogICAgICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpOwoKICAgICAgdHJ5IHsKICAgICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsOwogICAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmlvcml0eSk7CiAgICAgICAgcmV0dXJuIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpOwogICAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uOyAvLyBPbmNlIHBhc3NpdmUgZWZmZWN0cyBoYXZlIHJ1biBmb3IgdGhlIHRyZWUgLSBnaXZpbmcgY29tcG9uZW50cyBhCiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGZ1bmN0aW9uIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpYmVyKSB7CiAgICB7CiAgICAgIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzLnB1c2goZmliZXIpOwoKICAgICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykgewogICAgICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTsKICAgICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpIHsKICAgIGlmIChyb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9PT0gbnVsbCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IC8vIENhY2hlIGFuZCBjbGVhciB0aGUgdHJhbnNpdGlvbnMgZmxhZwoKCiAgICB2YXIgdHJhbnNpdGlvbnMgPSBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zOwogICAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7CiAgICB2YXIgcm9vdCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzOwogICAgdmFyIGxhbmVzID0gcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXM7CiAgICByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IG51bGw7IC8vIFRPRE86IFRoaXMgaXMgc29tZXRpbWVzIG91dCBvZiBzeW5jIHdpdGggcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMuCiAgICAvLyBGaWd1cmUgb3V0IHdoeSBhbmQgZml4IGl0LiBJdCdzIG5vdCBjYXVzaW5nIGFueSBrbm93biBpc3N1ZXMgKHByb2JhYmx5CiAgICAvLyBiZWNhdXNlIGl0J3Mgb25seSB1c2VkIGZvciBwcm9maWxpbmcpLCBidXQgaXQncyBhIHJlZmFjdG9yIGhhemFyZC4KCiAgICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7CgogICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgd2hpbGUgYWxyZWFkeSByZW5kZXJpbmcuJyk7CiAgICB9CgogICAgewogICAgICBpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlOwogICAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7CiAgICB9CgogICAgewogICAgICBtYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTsKICAgIH0KCiAgICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0OwogICAgZXhlY3V0aW9uQ29udGV4dCB8PSBDb21taXRDb250ZXh0OwogICAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzKHJvb3QuY3VycmVudCk7CiAgICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIHJvb3QuY3VycmVudCwgbGFuZXMsIHRyYW5zaXRpb25zKTsgLy8gVE9ETzogTW92ZSB0byBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzCgogICAgewogICAgICB2YXIgcHJvZmlsZXJFZmZlY3RzID0gcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHM7CiAgICAgIHBlbmRpbmdQYXNzaXZlUHJvZmlsZXJFZmZlY3RzID0gW107CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb2ZpbGVyRWZmZWN0cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBfZmliZXIgPSBwcm9maWxlckVmZmVjdHNbaV07CiAgICAgICAgY29tbWl0UGFzc2l2ZUVmZmVjdER1cmF0aW9ucyhyb290LCBfZmliZXIpOwogICAgICB9CiAgICB9CgogICAgewogICAgICBtYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkKCk7CiAgICB9CgogICAgewogICAgICBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYocm9vdC5jdXJyZW50LCB0cnVlKTsKICAgIH0KCiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7CiAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTsKCiAgICB7CiAgICAgIC8vIElmIGFkZGl0aW9uYWwgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgc2NoZWR1bGVkLCBpbmNyZW1lbnQgYSBjb3VudGVyLiBJZiB0aGlzCiAgICAgIC8vIGV4Y2VlZHMgdGhlIGxpbWl0LCB3ZSdsbCBmaXJlIGEgd2FybmluZy4KICAgICAgaWYgKGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMpIHsKICAgICAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcykgewogICAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50Kys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7CiAgICAgICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gcm9vdDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDsKICAgICAgfQoKICAgICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7CiAgICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTsKICAgIH0gLy8gVE9ETzogTW92ZSB0byBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzCgoKICAgIG9uUG9zdENvbW1pdFJvb3Qocm9vdCk7CgogICAgewogICAgICB2YXIgc3RhdGVOb2RlID0gcm9vdC5jdXJyZW50LnN0YXRlTm9kZTsKICAgICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gMDsKICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSB7CiAgICByZXR1cm4gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgIT09IG51bGwgJiYgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuaGFzKGluc3RhbmNlKTsKICB9CiAgZnVuY3Rpb24gbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZChpbnN0YW5jZSkgewogICAgaWYgKGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID09PSBudWxsKSB7CiAgICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbmV3IFNldChbaW5zdGFuY2VdKTsKICAgIH0gZWxzZSB7CiAgICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmFkZChpbnN0YW5jZSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3IoZXJyb3IpIHsKICAgIGlmICghaGFzVW5jYXVnaHRFcnJvcikgewogICAgICBoYXNVbmNhdWdodEVycm9yID0gdHJ1ZTsKICAgICAgZmlyc3RVbmNhdWdodEVycm9yID0gZXJyb3I7CiAgICB9CiAgfQoKICB2YXIgb25VbmNhdWdodEVycm9yID0gcHJlcGFyZVRvVGhyb3dVbmNhdWdodEVycm9yOwoKICBmdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChyb290RmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvcikgewogICAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yLCBzb3VyY2VGaWJlcik7CiAgICB2YXIgdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHJvb3RGaWJlciwgZXJyb3JJbmZvLCBTeW5jTGFuZSk7CiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUocm9vdEZpYmVyLCB1cGRhdGUsIFN5bmNMYW5lKTsKICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7CgogICAgaWYgKHJvb3QgIT09IG51bGwpIHsKICAgICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpOwogICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvciQxKSB7CiAgICB7CiAgICAgIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvciQxKTsKICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTsKICAgIH0KCiAgICBpZiAoc291cmNlRmliZXIudGFnID09PSBIb3N0Um9vdCkgewogICAgICAvLyBFcnJvciB3YXMgdGhyb3duIGF0IHRoZSByb290LiBUaGVyZSBpcyBubyBwYXJlbnQsIHNvIHRoZSByb290CiAgICAgIC8vIGl0c2VsZiBzaG91bGQgY2FwdHVyZSBpdC4KICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qoc291cmNlRmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvciQxKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBmaWJlciA9IG51bGw7CgogICAgewogICAgICBmaWJlciA9IG5lYXJlc3RNb3VudGVkQW5jZXN0b3I7CiAgICB9CgogICAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7CiAgICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RSb290KSB7CiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3QoZmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvciQxKTsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkgewogICAgICAgIHZhciBjdG9yID0gZmliZXIudHlwZTsKICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7CgogICAgICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkgewogICAgICAgICAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yJDEsIHNvdXJjZUZpYmVyKTsKICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTsKICAgICAgICAgIHZhciByb290ID0gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBTeW5jTGFuZSk7CiAgICAgICAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpOwoKICAgICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7CiAgICAgICAgICAgIG1hcmtSb290VXBkYXRlZChyb290LCBTeW5jTGFuZSwgZXZlbnRUaW1lKTsKICAgICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZmliZXIgPSBmaWJlci5yZXR1cm47CiAgICB9CgogICAgewogICAgICAvLyBUT0RPOiBVbnRpbCB3ZSByZS1sYW5kIHNraXBVbm1vdW50ZWRCb3VuZGFyaWVzIChzZWUgIzIwMTQ3KSwgdGhpcyB3YXJuaW5nCiAgICAgIC8vIHdpbGwgZmlyZSBmb3IgZXJyb3JzIHRoYXQgYXJlIHRocm93biBieSBkZXN0cm95IGZ1bmN0aW9ucyBpbnNpZGUgZGVsZXRlZAogICAgICAvLyB0cmVlcy4gV2hhdCBpdCBzaG91bGQgaW5zdGVhZCBkbyBpcyBwcm9wYWdhdGUgdGhlIGVycm9yIHRvIHRoZSBwYXJlbnQgb2YKICAgICAgLy8gdGhlIGRlbGV0ZWQgdHJlZS4gSW4gdGhlIG1lYW50aW1lLCBkbyBub3QgYWRkIHRoaXMgd2FybmluZyB0byB0aGUKICAgICAgLy8gYWxsb3dsaXN0OyB0aGlzIGlzIG9ubHkgZm9yIG91ciBpbnRlcm5hbCB1c2UuCiAgICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogQXR0ZW1wdGVkIHRvIGNhcHR1cmUgYSBjb21taXQgcGhhc2UgZXJyb3IgJyArICdpbnNpZGUgYSBkZXRhY2hlZCB0cmVlLiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdC4gTGlrZWx5ICcgKyAnY2F1c2VzIGluY2x1ZGUgZGVsZXRpbmcgdGhlIHNhbWUgZmliZXIgbW9yZSB0aGFuIG9uY2UsIGNvbW1pdHRpbmcgYW4gJyArICdhbHJlYWR5LWZpbmlzaGVkIHRyZWUsIG9yIGFuIGluY29uc2lzdGVudCByZXR1cm4gcG9pbnRlci5cblxuJyArICdFcnJvciBtZXNzYWdlOlxuXG4lcycsIGVycm9yJDEpOwogICAgfQogIH0KICBmdW5jdGlvbiBwaW5nU3VzcGVuZGVkUm9vdChyb290LCB3YWtlYWJsZSwgcGluZ2VkTGFuZXMpIHsKICAgIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTsKCiAgICBpZiAocGluZ0NhY2hlICE9PSBudWxsKSB7CiAgICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsCiAgICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi4KICAgICAgcGluZ0NhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7CiAgICB9CgogICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTsKICAgIG1hcmtSb290UGluZ2VkKHJvb3QsIHBpbmdlZExhbmVzKTsKICAgIHdhcm5JZlN1c3BlbnNlUmVzb2x1dGlvbk5vdFdyYXBwZWRXaXRoQWN0REVWKHJvb3QpOwoKICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiYgaXNTdWJzZXRPZkxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLCBwaW5nZWRMYW5lcykpIHsKICAgICAgLy8gUmVjZWl2ZWQgYSBwaW5nIGF0IHRoZSBzYW1lIHByaW9yaXR5IGxldmVsIGF0IHdoaWNoIHdlJ3JlIGN1cnJlbnRseQogICAgICAvLyByZW5kZXJpbmcuIFdlIG1pZ2h0IHdhbnQgdG8gcmVzdGFydCB0aGlzIHJlbmRlci4gVGhpcyBzaG91bGQgbWlycm9yCiAgICAgIC8vIHRoZSBsb2dpYyBvZiB3aGV0aGVyIG9yIG5vdCBhIHJvb3Qgc3VzcGVuZHMgb25jZSBpdCBjb21wbGV0ZXMuCiAgICAgIC8vIFRPRE86IElmIHdlJ3JlIHJlbmRlcmluZyBzeW5jIGVpdGhlciBkdWUgdG8gU3luYywgQmF0Y2hlZCBvciBleHBpcmVkLAogICAgICAvLyB3ZSBzaG91bGQgcHJvYmFibHkgbmV2ZXIgcmVzdGFydC4KICAgICAgLy8gSWYgd2UncmUgc3VzcGVuZGVkIHdpdGggZGVsYXksIG9yIGlmIGl0J3MgYSByZXRyeSwgd2UnbGwgYWx3YXlzIHN1c3BlbmQKICAgICAgLy8gc28gd2UgY2FuIGFsd2F5cyByZXN0YXJ0LgogICAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkICYmIGluY2x1ZGVzT25seVJldHJpZXMod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpICYmIG5vdygpIC0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA8IEZBTExCQUNLX1RIUk9UVExFX01TKSB7CiAgICAgICAgLy8gUmVzdGFydCBmcm9tIHRoZSByb290LgogICAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNhbid0IHJlc3RhcnQgcmlnaHQgbm93LCB3ZSBtaWdodCBnZXQgYW4KICAgICAgICAvLyBvcHBvcnR1bml0eSBsYXRlci4gU28gd2UgbWFyayB0aGlzIHJlbmRlciBhcyBoYXZpbmcgYSBwaW5nLgogICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcywgcGluZ2VkTGFuZXMpOwogICAgICB9CiAgICB9CgogICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7CiAgfQoKICBmdW5jdGlvbiByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKSB7CiAgICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50IG9yIFN1c3BlbnNlTGlzdCBjb21wb25lbnQpCiAgICAvLyBwcmV2aW91c2x5IHdhcyByZW5kZXJlZCBpbiBpdHMgZmFsbGJhY2sgc3RhdGUuIE9uZSBvZiB0aGUgcHJvbWlzZXMgdGhhdAogICAgLy8gc3VzcGVuZGVkIGl0IGhhcyByZXNvbHZlZCwgd2hpY2ggbWVhbnMgYXQgbGVhc3QgcGFydCBvZiB0aGUgdHJlZSB3YXMKICAgIC8vIGxpa2VseSB1bmJsb2NrZWQuIFRyeSByZW5kZXJpbmcgYWdhaW4sIGF0IGEgbmV3IGxhbmVzLgogICAgaWYgKHJldHJ5TGFuZSA9PT0gTm9MYW5lKSB7CiAgICAgIC8vIFRPRE86IEFzc2lnbiB0aGlzIHRvIGBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZWA/IHRvIGF2b2lkCiAgICAgIC8vIHVubmVjZXNzYXJ5IGVudGFuZ2xlbWVudD8KICAgICAgcmV0cnlMYW5lID0gcmVxdWVzdFJldHJ5TGFuZShib3VuZGFyeUZpYmVyKTsKICAgIH0gLy8gVE9ETzogU3BlY2lhbCBjYXNlIGlkbGUgcHJpb3JpdHk/CgoKICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7CiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpOwoKICAgIGlmIChyb290ICE9PSBudWxsKSB7CiAgICAgIG1hcmtSb290VXBkYXRlZChyb290LCByZXRyeUxhbmUsIGV2ZW50VGltZSk7CiAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmV0cnlEZWh5ZHJhdGVkU3VzcGVuc2VCb3VuZGFyeShib3VuZGFyeUZpYmVyKSB7CiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGJvdW5kYXJ5RmliZXIubWVtb2l6ZWRTdGF0ZTsKICAgIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7CgogICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHsKICAgICAgcmV0cnlMYW5lID0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmU7CiAgICB9CgogICAgcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSk7CiAgfQogIGZ1bmN0aW9uIHJlc29sdmVSZXRyeVdha2VhYmxlKGJvdW5kYXJ5RmliZXIsIHdha2VhYmxlKSB7CiAgICB2YXIgcmV0cnlMYW5lID0gTm9MYW5lOyAvLyBEZWZhdWx0CgogICAgdmFyIHJldHJ5Q2FjaGU7CgogICAgc3dpdGNoIChib3VuZGFyeUZpYmVyLnRhZykgewogICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OgogICAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTsKICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGJvdW5kYXJ5RmliZXIubWVtb2l6ZWRTdGF0ZTsKCiAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHsKICAgICAgICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lOwogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDoKICAgICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGU7CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93IG5ldyBFcnJvcignUGluZ2VkIHVua25vd24gc3VzcGVuc2UgYm91bmRhcnkgdHlwZS4gJyArICdUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIFJlYWN0LicpOwogICAgfQoKICAgIGlmIChyZXRyeUNhY2hlICE9PSBudWxsKSB7CiAgICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsCiAgICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi4KICAgICAgcmV0cnlDYWNoZS5kZWxldGUod2FrZWFibGUpOwogICAgfQoKICAgIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpOwogIH0gLy8gQ29tcHV0ZXMgdGhlIG5leHQgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2UgKEpORCkgYm91bmRhcnkuCiAgLy8gVGhlIHRoZW9yeSBpcyB0aGF0IGEgcGVyc29uIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLgogIC8vIFRoZXJlZm9yZSwgaWYgd2Ugd2FpdCBhIGJpdCBsb25nZXIgdGhhbiBuZWNlc3NhcnkgdGhhdCB3b24ndCB0cmFuc2xhdGUgdG8gYSBub3RpY2VhYmxlCiAgLy8gZGlmZmVyZW5jZSBpbiB0aGUgZXhwZXJpZW5jZS4gSG93ZXZlciwgd2FpdGluZyBmb3IgbG9uZ2VyIG1pZ2h0IG1lYW4gdGhhdCB3ZSBjYW4gYXZvaWQKICAvLyBzaG93aW5nIGFuIGludGVybWVkaWF0ZSBsb2FkaW5nIHN0YXRlLiBUaGUgbG9uZ2VyIHdlIGhhdmUgYWxyZWFkeSB3YWl0ZWQsIHRoZSBoYXJkZXIgaXQKICAvLyBpcyB0byB0ZWxsIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuIFRoZXJlZm9yZSwgdGhlIGxvbmdlciB3ZSd2ZSBhbHJlYWR5IHdhaXRlZCwKICAvLyB0aGUgbG9uZ2VyIHdlIGNhbiB3YWl0IGFkZGl0aW9uYWxseS4gQXQgc29tZSBwb2ludCB3ZSBoYXZlIHRvIGdpdmUgdXAgdGhvdWdoLgogIC8vIFdlIHBpY2sgYSB0cmFpbiBtb2RlbCB3aGVyZSB0aGUgbmV4dCBib3VuZGFyeSBjb21taXRzIGF0IGEgY29uc2lzdGVudCBzY2hlZHVsZS4KICAvLyBUaGVzZSBwYXJ0aWN1bGFyIG51bWJlcnMgYXJlIHZhZ3VlIGVzdGltYXRlcy4gV2UgZXhwZWN0IHRvIGFkanVzdCB0aGVtIGJhc2VkIG9uIHJlc2VhcmNoLgoKICBmdW5jdGlvbiBqbmQodGltZUVsYXBzZWQpIHsKICAgIHJldHVybiB0aW1lRWxhcHNlZCA8IDEyMCA/IDEyMCA6IHRpbWVFbGFwc2VkIDwgNDgwID8gNDgwIDogdGltZUVsYXBzZWQgPCAxMDgwID8gMTA4MCA6IHRpbWVFbGFwc2VkIDwgMTkyMCA/IDE5MjAgOiB0aW1lRWxhcHNlZCA8IDMwMDAgPyAzMDAwIDogdGltZUVsYXBzZWQgPCA0MzIwID8gNDMyMCA6IGNlaWwodGltZUVsYXBzZWQgLyAxOTYwKSAqIDE5NjA7CiAgfQoKICBmdW5jdGlvbiBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKSB7CiAgICBpZiAobmVzdGVkVXBkYXRlQ291bnQgPiBORVNURURfVVBEQVRFX0xJTUlUKSB7CiAgICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDsKICAgICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gbnVsbDsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArICdyZXBlYXRlZGx5IGNhbGxzIHNldFN0YXRlIGluc2lkZSBjb21wb25lbnRXaWxsVXBkYXRlIG9yICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgdXBkYXRlcyB0byAnICsgJ3ByZXZlbnQgaW5maW5pdGUgbG9vcHMuJyk7CiAgICB9CgogICAgewogICAgICBpZiAobmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID4gTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUKSB7CiAgICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDsKICAgICAgICByb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbDsKCiAgICAgICAgZXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgImNhbGxzIHNldFN0YXRlIGluc2lkZSB1c2VFZmZlY3QsIGJ1dCB1c2VFZmZlY3QgZWl0aGVyIGRvZXNuJ3QgIiArICdoYXZlIGEgZGVwZW5kZW5jeSBhcnJheSwgb3Igb25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgY2hhbmdlcyBvbiAnICsgJ2V2ZXJ5IHJlbmRlci4nKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gZmx1c2hSZW5kZXJQaGFzZVN0cmljdE1vZGVXYXJuaW5nc0luREVWKCkgewogICAgewogICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nKCk7CgogICAgICB7CiAgICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MoKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY29tbWl0RG91YmxlSW52b2tlRWZmZWN0c0luREVWKGZpYmVyLCBoYXNQYXNzaXZlRWZmZWN0cykgewogICAgewogICAgICAvLyBUT0RPIChTdHJpY3RFZmZlY3RzKSBTaG91bGQgd2Ugc2V0IGEgbWFya2VyIG9uIHRoZSByb290IGlmIGl0IGNvbnRhaW5zIHN0cmljdCBlZmZlY3RzCiAgICAgIC8vIHNvIHdlIGRvbid0IHRyYXZlcnNlIHVubmVjZXNzYXJpbHk/IHNpbWlsYXIgdG8gc3VidHJlZUZsYWdzIGJ1dCBqdXN0IGF0IHRoZSByb290IGxldmVsLgogICAgICAvLyBNYXliZSBub3QgYSBiaWcgZGVhbCBzaW5jZSB0aGlzIGlzIERFViBvbmx5IGJlaGF2aW9yLgogICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpOwogICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50TGF5b3V0RGV2LCBpbnZva2VMYXlvdXRFZmZlY3RVbm1vdW50SW5ERVYpOwoKICAgICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7CiAgICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYpOwogICAgICB9CgogICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50TGF5b3V0RGV2LCBpbnZva2VMYXlvdXRFZmZlY3RNb3VudEluREVWKTsKCiAgICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykgewogICAgICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRQYXNzaXZlRGV2LCBpbnZva2VQYXNzaXZlRWZmZWN0TW91bnRJbkRFVik7CiAgICAgIH0KCiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnZva2VFZmZlY3RzSW5EZXYoZmlyc3RDaGlsZCwgZmliZXJGbGFncywgaW52b2tlRWZmZWN0Rm4pIHsKICAgIHsKICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLgogICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLgogICAgICB2YXIgY3VycmVudCA9IGZpcnN0Q2hpbGQ7CiAgICAgIHZhciBzdWJ0cmVlUm9vdCA9IG51bGw7CgogICAgICB3aGlsZSAoY3VycmVudCAhPT0gbnVsbCkgewogICAgICAgIHZhciBwcmltYXJ5U3VidHJlZUZsYWcgPSBjdXJyZW50LnN1YnRyZWVGbGFncyAmIGZpYmVyRmxhZ3M7CgogICAgICAgIGlmIChjdXJyZW50ICE9PSBzdWJ0cmVlUm9vdCAmJiBjdXJyZW50LmNoaWxkICE9PSBudWxsICYmIHByaW1hcnlTdWJ0cmVlRmxhZyAhPT0gTm9GbGFncykgewogICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIGZpYmVyRmxhZ3MpICE9PSBOb0ZsYWdzKSB7CiAgICAgICAgICAgIGludm9rZUVmZmVjdEZuKGN1cnJlbnQpOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChjdXJyZW50LnNpYmxpbmcgIT09IG51bGwpIHsKICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuc2libGluZzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGN1cnJlbnQgPSBzdWJ0cmVlUm9vdCA9IGN1cnJlbnQucmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBudWxsOwogIGZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoZmliZXIpIHsKICAgIHsKICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCkgewogICAgICAgIC8vIFdlIGxldCB0aGUgb3RoZXIgd2FybmluZyBhYm91dCByZW5kZXIgcGhhc2UgdXBkYXRlcyBkZWFsIHdpdGggdGhpcyBvbmUuCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoIShmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgdGFnID0gZmliZXIudGFnOwoKICAgICAgaWYgKHRhZyAhPT0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCAmJiB0YWcgIT09IEhvc3RSb290ICYmIHRhZyAhPT0gQ2xhc3NDb21wb25lbnQgJiYgdGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiB0YWcgIT09IEZvcndhcmRSZWYgJiYgdGFnICE9PSBNZW1vQ29tcG9uZW50ICYmIHRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkgewogICAgICAgIC8vIE9ubHkgd2FybiBmb3IgdXNlci1kZWZpbmVkIGNvbXBvbmVudHMsIG5vdCBpbnRlcm5hbCBvbmVzIGxpa2UgU3VzcGVuc2UuCiAgICAgICAgcmV0dXJuOwogICAgICB9IC8vIFdlIHNob3cgdGhlIHdob2xlIHN0YWNrIGJ1dCBkZWR1cGUgb24gdGhlIHRvcCBjb21wb25lbnQncyBuYW1lIGJlY2F1c2UKICAgICAgLy8gdGhlIHByb2JsZW1hdGljIGNvZGUgYWxtb3N0IGFsd2F5cyBsaWVzIGluc2lkZSB0aGF0IGNvbXBvbmVudC4KCgogICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdSZWFjdENvbXBvbmVudCc7CgogICAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCAhPT0gbnVsbCkgewogICAgICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG5ldyBTZXQoW2NvbXBvbmVudE5hbWVdKTsKICAgICAgfQoKICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50OwoKICAgICAgdHJ5IHsKICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpOwoKICAgICAgICBlcnJvcigiQ2FuJ3QgcGVyZm9ybSBhIFJlYWN0IHN0YXRlIHVwZGF0ZSBvbiBhIGNvbXBvbmVudCB0aGF0IGhhc24ndCBtb3VudGVkIHlldC4gIiArICdUaGlzIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGEgc2lkZS1lZmZlY3QgaW4geW91ciByZW5kZXIgZnVuY3Rpb24gdGhhdCAnICsgJ2FzeW5jaHJvbm91c2x5IGxhdGVyIGNhbGxzIHRyaWVzIHRvIHVwZGF0ZSB0aGUgY29tcG9uZW50LiBNb3ZlIHRoaXMgd29yayB0byAnICsgJ3VzZUVmZmVjdCBpbnN0ZWFkLicpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7CiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICB2YXIgYmVnaW5Xb3JrJDE7CgogIHsKICAgIHZhciBkdW1teUZpYmVyID0gbnVsbDsKCiAgICBiZWdpbldvcmskMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcykgewogICAgICAvLyBJZiBhIGNvbXBvbmVudCB0aHJvd3MgYW4gZXJyb3IsIHdlIHJlcGxheSBpdCBhZ2FpbiBpbiBhIHN5bmNocm9ub3VzbHkKICAgICAgLy8gZGlzcGF0Y2hlZCBldmVudCwgc28gdGhhdCB0aGUgZGVidWdnZXIgd2lsbCB0cmVhdCBpdCBhcyBhbiB1bmNhdWdodAogICAgICAvLyBlcnJvciBTZWUgUmVhY3RFcnJvclV0aWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjb3B5IHRoZSB3b3JrLWluLXByb2dyZXNzIG9udG8gYSBkdW1teQogICAgICAvLyBmaWJlci4gSWYgYmVnaW5Xb3JrIHRocm93cywgd2UnbGwgdXNlIHRoaXMgdG8gcmVzZXQgdGhlIHN0YXRlLgogICAgICB2YXIgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihkdW1teUZpYmVyLCB1bml0T2ZXb3JrKTsKCiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIGJlZ2luV29yayhjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7CiAgICAgIH0gY2F0Y2ggKG9yaWdpbmFsRXJyb3IpIHsKICAgICAgICBpZiAoZGlkU3VzcGVuZE9yRXJyb3JXaGlsZUh5ZHJhdGluZ0RFVigpIHx8IG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yLnRoZW4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIC8vIERvbid0IHJlcGxheSBwcm9taXNlcy4KICAgICAgICAgIC8vIERvbid0IHJlcGxheSBlcnJvcnMgaWYgd2UgYXJlIGh5ZHJhdGluZyBhbmQgaGF2ZSBhbHJlYWR5IHN1c3BlbmRlZCBvciBoYW5kbGVkIGFuIGVycm9yCiAgICAgICAgICB0aHJvdyBvcmlnaW5hbEVycm9yOwogICAgICAgIH0gLy8gS2VlcCB0aGlzIGNvZGUgaW4gc3luYyB3aXRoIGhhbmRsZUVycm9yOyBhbnkgY2hhbmdlcyBoZXJlIG11c3QgaGF2ZQogICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyB0aGVyZS4KCgogICAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpOwogICAgICAgIHJlc2V0SG9va3NBZnRlclRocm93KCk7IC8vIERvbid0IHJlc2V0IGN1cnJlbnQgZGVidWcgZmliZXIsIHNpbmNlIHdlJ3JlIGFib3V0IHRvIHdvcmsgb24gdGhlCiAgICAgICAgLy8gc2FtZSBmaWJlciBhZ2Fpbi4KICAgICAgICAvLyBVbndpbmQgdGhlIGZhaWxlZCBzdGFjayBmcmFtZQoKICAgICAgICB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgdW5pdE9mV29yayk7IC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgb2YgdGhlIGZpYmVyLgoKICAgICAgICBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih1bml0T2ZXb3JrLCBvcmlnaW5hbFdvcmtJblByb2dyZXNzQ29weSk7CgogICAgICAgIGlmICggdW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHsKICAgICAgICAgIC8vIFJlc2V0IHRoZSBwcm9maWxlciB0aW1lci4KICAgICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTsKICAgICAgICB9IC8vIFJ1biBiZWdpbldvcmsgYWdhaW4uCgoKICAgICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgYmVnaW5Xb3JrLCBudWxsLCBjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7CgogICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7CiAgICAgICAgICB2YXIgcmVwbGF5RXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7CgogICAgICAgICAgaWYgKHR5cGVvZiByZXBsYXlFcnJvciA9PT0gJ29iamVjdCcgJiYgcmVwbGF5RXJyb3IgIT09IG51bGwgJiYgcmVwbGF5RXJyb3IuX3N1cHByZXNzTG9nZ2luZyAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgb3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiAhb3JpZ2luYWxFcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7CiAgICAgICAgICAgIC8vIElmIHN1cHByZXNzZWQsIGxldCB0aGUgZmxhZyBjYXJyeSBvdmVyIHRvIHRoZSBvcmlnaW5hbCBlcnJvciB3aGljaCBpcyB0aGUgb25lIHdlJ2xsIHJldGhyb3cuCiAgICAgICAgICAgIG9yaWdpbmFsRXJyb3IuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSAvLyBXZSBhbHdheXMgdGhyb3cgdGhlIG9yaWdpbmFsIGVycm9yIGluIGNhc2UgdGhlIHNlY29uZCByZW5kZXIgcGFzcyBpcyBub3QgaWRlbXBvdGVudC4KICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgYSBtZW1vaXplZCBmdW5jdGlvbiBvciBDb21tb25KUyBtb2R1bGUgZG9lc24ndCB0aHJvdyBhZnRlciBmaXJzdCBpbnZvY2F0aW9uLgoKCiAgICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjsKICAgICAgfQogICAgfTsKICB9CgogIHZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9IGZhbHNlOwogIHZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQ7CgogIHsKICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudCA9IG5ldyBTZXQoKTsKICB9CgogIGZ1bmN0aW9uIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKSB7CiAgICB7CiAgICAgIGlmIChpc1JlbmRlcmluZyAmJiAhZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkpIHsKICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykgewogICAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDoKICAgICAgICAgIGNhc2UgRm9yd2FyZFJlZjoKICAgICAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDoKICAgICAgICAgICAgewogICAgICAgICAgICAgIHZhciByZW5kZXJpbmdDb21wb25lbnROYW1lID0gd29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ1Vua25vd24nOyAvLyBEZWR1cGUgYnkgdGhlIHJlbmRlcmluZyBjb21wb25lbnQgYmVjYXVzZSBpdCdzIHRoZSBvbmUgdGhhdCBuZWVkcyB0byBiZSBmaXhlZC4KCiAgICAgICAgICAgICAgdmFyIGRlZHVwZUtleSA9IHJlbmRlcmluZ0NvbXBvbmVudE5hbWU7CgogICAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmhhcyhkZWR1cGVLZXkpKSB7CiAgICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuYWRkKGRlZHVwZUtleSk7CiAgICAgICAgICAgICAgICB2YXIgc2V0U3RhdGVDb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nOwoKICAgICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGEgY29tcG9uZW50IChgJXNgKSB3aGlsZSByZW5kZXJpbmcgYSAnICsgJ2RpZmZlcmVudCBjb21wb25lbnQgKGAlc2ApLiBUbyBsb2NhdGUgdGhlIGJhZCBzZXRTdGF0ZSgpIGNhbGwgaW5zaWRlIGAlc2AsICcgKyAnZm9sbG93IHRoZSBzdGFjayB0cmFjZSBhcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NldHN0YXRlLWluLXJlbmRlcicsIHNldFN0YXRlQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSwgcmVuZGVyaW5nQ29tcG9uZW50TmFtZSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyKSB7CiAgICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCkuIFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgJyArICdmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuJyk7CgogICAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSB0cnVlOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgbGFuZXMpIHsKICAgIHsKICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7CiAgICAgICAgdmFyIG1lbW9pemVkVXBkYXRlcnMgPSByb290Lm1lbW9pemVkVXBkYXRlcnM7CiAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzY2hlZHVsaW5nRmliZXIpIHsKICAgICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBzY2hlZHVsaW5nRmliZXIsIGxhbmVzKTsKICAgICAgICB9KTsgLy8gVGhpcyBmdW5jdGlvbiBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGNsZWFyIG1lbW9pemVkIHVwZGF0ZXJzLgogICAgICAgIC8vIFRob3NlIG1heSBzdGlsbCBiZSByZWxldmFudCB0byB0aGUgY3VycmVudCBjb21taXQKICAgICAgICAvLyBhbmQgYSBmdXR1cmUgb25lIChlLmcuIFN1c3BlbnNlKS4KICAgICAgfQogICAgfQogIH0KICB2YXIgZmFrZUFjdENhbGxiYWNrTm9kZSA9IHt9OwoKICBmdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrJDEocHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spIHsKICAgIHsKICAgICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhbiBgYWN0YCBzY29wZSwgYnlwYXNzIFNjaGVkdWxlciBhbmQgcHVzaCB0bwogICAgICAvLyB0aGUgYGFjdGAgcXVldWUgaW5zdGVhZC4KICAgICAgdmFyIGFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50OwoKICAgICAgaWYgKGFjdFF1ZXVlICE9PSBudWxsKSB7CiAgICAgICAgYWN0UXVldWUucHVzaChjYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIGZha2VBY3RDYWxsYmFja05vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjYW5jZWxDYWxsYmFjayQxKGNhbGxiYWNrTm9kZSkgewogICAgaWYgKCBjYWxsYmFja05vZGUgPT09IGZha2VBY3RDYWxsYmFja05vZGUpIHsKICAgICAgcmV0dXJuOwogICAgfSAvLyBJbiBwcm9kdWN0aW9uLCBhbHdheXMgY2FsbCBTY2hlZHVsZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBzdHJpcHBlZCBvdXQuCgoKICAgIHJldHVybiBjYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpOwogIH0KCiAgZnVuY3Rpb24gc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkgewogICAgLy8gTmV2ZXIgZm9yY2UgZmx1c2ggaW4gcHJvZHVjdGlvbi4gVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2V0IHN0cmlwcGVkIG91dC4KICAgIHJldHVybiAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsOwogIH0KCiAgZnVuY3Rpb24gd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKSB7CiAgICB7CiAgICAgIGlmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHsKICAgICAgICBpZiAoIWlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkpIHsKICAgICAgICAgIC8vIE5vdCBpbiBhbiBhY3QgZW52aXJvbm1lbnQuIE5vIG5lZWQgdG8gd2Fybi4KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gTGVnYWN5IG1vZGUgaGFzIGFkZGl0aW9uYWwgY2FzZXMgd2hlcmUgd2Ugc3VwcHJlc3MgYSB3YXJuaW5nLgogICAgICAgIGlmICghaXNMZWdhY3lBY3RFbnZpcm9ubWVudCgpKSB7CiAgICAgICAgICAvLyBOb3QgaW4gYW4gYWN0IGVudmlyb25tZW50LiBObyBuZWVkIHRvIHdhcm4uCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCAhPT0gTm9Db250ZXh0KSB7CiAgICAgICAgICAvLyBMZWdhY3kgbW9kZSBkb2Vzbid0IHdhcm4gaWYgdGhlIHVwZGF0ZSBpcyBiYXRjaGVkLCBpLmUuCiAgICAgICAgICAvLyBiYXRjaGVkVXBkYXRlcyBvciBmbHVzaFN5bmMuCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoZmliZXIudGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiBmaWJlci50YWcgIT09IEZvcndhcmRSZWYgJiYgZmliZXIudGFnICE9PSBTaW1wbGVNZW1vQ29tcG9uZW50KSB7CiAgICAgICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUtaG9va3MgY29kZSwgbGVnYWN5IG1vZGUgb25seQogICAgICAgICAgLy8gd2FybnMgZm9yIHVwZGF0ZXMgdGhhdCBvcmlnaW5hdGUgZnJvbSBhIGhvb2suCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7CiAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50OwoKICAgICAgICB0cnkgewogICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTsKCiAgICAgICAgICBlcnJvcignQW4gdXBkYXRlIHRvICVzIGluc2lkZSBhIHRlc3Qgd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxuXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IGNhdXNlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIHNob3VsZCBiZSAnICsgJ3dyYXBwZWQgaW50byBhY3QoLi4uKTpcblxuJyArICdhY3QoKCkgPT4ge1xuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXG4nICsgJ30pO1xuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xuXG4nICsgIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0JywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlcikgewogICAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHdhcm5JZlN1c3BlbnNlUmVzb2x1dGlvbk5vdFdyYXBwZWRXaXRoQWN0REVWKHJvb3QpIHsKICAgIHsKICAgICAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7CiAgICAgICAgZXJyb3IoJ0Egc3VzcGVuZGVkIHJlc291cmNlIGZpbmlzaGVkIGxvYWRpbmcgaW5zaWRlIGEgdGVzdCwgYnV0IHRoZSBldmVudCAnICsgJ3dhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cblxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCByZXNvbHZlcyBzdXNwZW5kZWQgZGF0YSBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ2ludG8gYWN0KC4uLik6XG5cbicgKyAnYWN0KCgpID0+IHtcbicgKyAnICAvKiBmaW5pc2ggbG9hZGluZyBzdXNwZW5kZWQgZGF0YSAqL1xuJyArICd9KTtcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cblxuJyArICJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlICIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoaXNSdW5uaW5nKSB7CiAgICB7CiAgICAgIGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9IGlzUnVubmluZzsKICAgIH0KICB9CgogIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXMgKi8KICB2YXIgcmVzb2x2ZUZhbWlseSA9IG51bGw7IC8vICRGbG93Rml4TWUgRmxvdyBnZXRzIGNvbmZ1c2VkIGJ5IGEgV2Vha1NldCBmZWF0dXJlIGNoZWNrIGJlbG93LgoKICB2YXIgZmFpbGVkQm91bmRhcmllcyA9IG51bGw7CiAgdmFyIHNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHsKICAgIHsKICAgICAgcmVzb2x2ZUZhbWlseSA9IGhhbmRsZXI7CiAgICB9CiAgfTsKICBmdW5jdGlvbiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSkgewogICAgewogICAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkgewogICAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuCiAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgIH0KCiAgICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpOwoKICAgICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uCgoKICAgICAgcmV0dXJuIGZhbWlseS5jdXJyZW50OwogICAgfQogIH0KICBmdW5jdGlvbiByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcodHlwZSkgewogICAgLy8gTm8gaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuCiAgICByZXR1cm4gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpOwogIH0KICBmdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyh0eXBlKSB7CiAgICB7CiAgICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7CiAgICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC4KICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgfQoKICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7CgogICAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZWFsIGZvcndhcmRSZWYuIERvbid0IHdhbnQgdG8gY3Jhc2ggZWFybHkuCiAgICAgICAgaWYgKHR5cGUgIT09IG51bGwgJiYgdHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgLy8gRm9yd2FyZFJlZiBpcyBzcGVjaWFsIGJlY2F1c2UgaXRzIHJlc29sdmVkIC50eXBlIGlzIGFuIG9iamVjdCwKICAgICAgICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2Ugb25seSBoYXZlIGl0cyBpbm5lciByZW5kZXIgZnVuY3Rpb24gaW4gdGhlIG1hcC4KICAgICAgICAgIC8vIElmIHRoYXQgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCwgd2UnbGwgYnVpbGQgYSBuZXcgZm9yd2FyZFJlZiB0eXBlLgogICAgICAgICAgdmFyIGN1cnJlbnRSZW5kZXIgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZS5yZW5kZXIpOwoKICAgICAgICAgIGlmICh0eXBlLnJlbmRlciAhPT0gY3VycmVudFJlbmRlcikgewogICAgICAgICAgICB2YXIgc3ludGhldGljVHlwZSA9IHsKICAgICAgICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSwKICAgICAgICAgICAgICByZW5kZXI6IGN1cnJlbnRSZW5kZXIKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICBzeW50aGV0aWNUeXBlLmRpc3BsYXlOYW1lID0gdHlwZS5kaXNwbGF5TmFtZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHN5bnRoZXRpY1R5cGU7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgfSAvLyBVc2UgdGhlIGxhdGVzdCBrbm93biBpbXBsZW1lbnRhdGlvbi4KCgogICAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhmaWJlciwgZWxlbWVudCkgewogICAgewogICAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkgewogICAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICB2YXIgcHJldlR5cGUgPSBmaWJlci5lbGVtZW50VHlwZTsKICAgICAgdmFyIG5leHRUeXBlID0gZWxlbWVudC50eXBlOyAvLyBJZiB3ZSBnb3QgaGVyZSwgd2Uga25vdyB0eXBlcyBhcmVuJ3QgPT09IGVxdWFsLgoKICAgICAgdmFyIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gZmFsc2U7CiAgICAgIHZhciAkJHR5cGVvZk5leHRUeXBlID0gdHlwZW9mIG5leHRUeXBlID09PSAnb2JqZWN0JyAmJiBuZXh0VHlwZSAhPT0gbnVsbCA/IG5leHRUeXBlLiQkdHlwZW9mIDogbnVsbDsKCiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7CiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDoKICAgICAgICAgIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7CiAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgaW5uZXIgdHlwZSB5ZXQuCiAgICAgICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gYXNzdW1lIHRoYXQgdGhlIGxhenkgaW5uZXIgdHlwZSBpcyBzdGFibGUsCiAgICAgICAgICAgICAgLy8gYW5kIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgcmVjb25jaWxpbmcgaXQgYXdheS4KICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gdW53cmFwIG9yIGFjdHVhbGx5IHVzZSB0aGUgbmV3IGxhenkgdHlwZS4KICAgICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKICAgICAgICBjYXNlIEZvcndhcmRSZWY6CiAgICAgICAgICB7CiAgICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7CiAgICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkgewogICAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGNhc2UgTWVtb0NvbXBvbmVudDoKICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9NRU1PX1RZUEUpIHsKICAgICAgICAgICAgICAvLyBUT0RPOiBpZiBpdCB3YXMgYnV0IGNhbiBubyBsb25nZXIgYmUgc2ltcGxlLAogICAgICAgICAgICAgIC8vIHdlIHNob3VsZG4ndCBzZXQgdGhpcy4KICAgICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7CiAgICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSAvLyBDaGVjayBpZiBib3RoIHR5cGVzIGhhdmUgYSBmYW1pbHkgYW5kIGl0J3MgdGhlIHNhbWUgb25lLgoKCiAgICAgIGlmIChuZWVkc0NvbXBhcmVGYW1pbGllcykgewogICAgICAgIC8vIE5vdGU6IG1lbW8oKSBhbmQgZm9yd2FyZFJlZigpIHdlJ2xsIGNvbXBhcmUgb3V0ZXIgcmF0aGVyIHRoYW4gaW5uZXIgdHlwZS4KICAgICAgICAvLyBUaGlzIG1lYW5zIGJvdGggb2YgdGhlbSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgdG8gcHJlc2VydmUgc3RhdGUuCiAgICAgICAgLy8gSWYgd2UgdW53cmFwcGVkIGFuZCBjb21wYXJlZCB0aGUgaW5uZXIgdHlwZXMgZm9yIHdyYXBwZXJzIGluc3RlYWQsCiAgICAgICAgLy8gdGhlbiB3ZSB3b3VsZCByaXNrIGZhbHNlbHkgc2F5aW5nIHR3byBzZXBhcmF0ZSBtZW1vKEZvbykKICAgICAgICAvLyBjYWxscyBhcmUgZXF1aXZhbGVudCBiZWNhdXNlIHRoZXkgd3JhcCB0aGUgc2FtZSBGb28gZnVuY3Rpb24uCiAgICAgICAgdmFyIHByZXZGYW1pbHkgPSByZXNvbHZlRmFtaWx5KHByZXZUeXBlKTsKCiAgICAgICAgaWYgKHByZXZGYW1pbHkgIT09IHVuZGVmaW5lZCAmJiBwcmV2RmFtaWx5ID09PSByZXNvbHZlRmFtaWx5KG5leHRUeXBlKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIGZ1bmN0aW9uIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKSB7CiAgICB7CiAgICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7CiAgICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC4KICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmICh0eXBlb2YgV2Vha1NldCAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMgPT09IG51bGwpIHsKICAgICAgICBmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKTsKICAgICAgfQoKICAgICAgZmFpbGVkQm91bmRhcmllcy5hZGQoZmliZXIpOwogICAgfQogIH0KICB2YXIgc2NoZWR1bGVSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIHVwZGF0ZSkgewogICAgewogICAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkgewogICAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgc3RhbGVGYW1pbGllcyA9IHVwZGF0ZS5zdGFsZUZhbWlsaWVzLAogICAgICAgICAgdXBkYXRlZEZhbWlsaWVzID0gdXBkYXRlLnVwZGF0ZWRGYW1pbGllczsKICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpOwogICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkgewogICAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkocm9vdC5jdXJyZW50LCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpOwogICAgICB9KTsKICAgIH0KICB9OwogIHZhciBzY2hlZHVsZVJvb3QgPSBmdW5jdGlvbiAocm9vdCwgZWxlbWVudCkgewogICAgewogICAgICBpZiAocm9vdC5jb250ZXh0ICE9PSBlbXB0eUNvbnRleHRPYmplY3QpIHsKICAgICAgICAvLyBTdXBlciBlZGdlIGNhc2U6IHJvb3QgaGFzIGEgbGVnYWN5IF9yZW5kZXJTdWJ0cmVlIGNvbnRleHQKICAgICAgICAvLyBidXQgd2UgZG9uJ3Qga25vdyB0aGUgcGFyZW50Q29tcG9uZW50IHNvIHdlIGNhbid0IHBhc3MgaXQuCiAgICAgICAgLy8gSnVzdCBpZ25vcmUuIFdlJ2xsIGRlbGV0ZSB0aGlzIHdpdGggX3JlbmRlclN1YnRyZWUgY29kZSBwYXRoIGxhdGVyLgogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpOwogICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkgewogICAgICAgIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCByb290LCBudWxsLCBudWxsKTsKICAgICAgfSk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShmaWJlciwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKSB7CiAgICB7CiAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGUsCiAgICAgICAgICBjaGlsZCA9IGZpYmVyLmNoaWxkLAogICAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsCiAgICAgICAgICB0YWcgPSBmaWJlci50YWcsCiAgICAgICAgICB0eXBlID0gZmliZXIudHlwZTsKICAgICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsOwoKICAgICAgc3dpdGNoICh0YWcpIHsKICAgICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OgogICAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDoKICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OgogICAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOgogICAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNvbHZlRmFtaWx5IHRvIGJlIHNldCBkdXJpbmcgaG90IHJlbG9hZC4nKTsKICAgICAgfQoKICAgICAgdmFyIG5lZWRzUmVuZGVyID0gZmFsc2U7CiAgICAgIHZhciBuZWVkc1JlbW91bnQgPSBmYWxzZTsKCiAgICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7CiAgICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkoY2FuZGlkYXRlVHlwZSk7CgogICAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgaWYgKHN0YWxlRmFtaWxpZXMuaGFzKGZhbWlseSkpIHsKICAgICAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSBpZiAodXBkYXRlZEZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7CiAgICAgICAgICAgIGlmICh0YWcgPT09IENsYXNzQ29tcG9uZW50KSB7CiAgICAgICAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBuZWVkc1JlbmRlciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzICE9PSBudWxsKSB7CiAgICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMuaGFzKGZpYmVyKSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgZmFpbGVkQm91bmRhcmllcy5oYXMoYWx0ZXJuYXRlKSkgewogICAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChuZWVkc1JlbW91bnQpIHsKICAgICAgICBmaWJlci5fZGVidWdOZWVkc1JlbW91bnQgPSB0cnVlOwogICAgICB9CgogICAgICBpZiAobmVlZHNSZW1vdW50IHx8IG5lZWRzUmVuZGVyKSB7CiAgICAgICAgdmFyIF9yb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7CgogICAgICAgIGlmIChfcm9vdCAhPT0gbnVsbCkgewogICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKF9yb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiAhbmVlZHNSZW1vdW50KSB7CiAgICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShjaGlsZCwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTsKICAgICAgfQoKICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHsKICAgICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZhciBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgZmFtaWxpZXMpIHsKICAgIHsKICAgICAgdmFyIGhvc3RJbnN0YW5jZXMgPSBuZXcgU2V0KCk7CiAgICAgIHZhciB0eXBlcyA9IG5ldyBTZXQoZmFtaWxpZXMubWFwKGZ1bmN0aW9uIChmYW1pbHkpIHsKICAgICAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7CiAgICAgIH0pKTsKICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpOwogICAgICByZXR1cm4gaG9zdEluc3RhbmNlczsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoZmliZXIsIHR5cGVzLCBob3N0SW5zdGFuY2VzKSB7CiAgICB7CiAgICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkLAogICAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsCiAgICAgICAgICB0YWcgPSBmaWJlci50YWcsCiAgICAgICAgICB0eXBlID0gZmliZXIudHlwZTsKICAgICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsOwoKICAgICAgc3dpdGNoICh0YWcpIHsKICAgICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OgogICAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDoKICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OgogICAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOgogICAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIHZhciBkaWRNYXRjaCA9IGZhbHNlOwoKICAgICAgaWYgKGNhbmRpZGF0ZVR5cGUgIT09IG51bGwpIHsKICAgICAgICBpZiAodHlwZXMuaGFzKGNhbmRpZGF0ZVR5cGUpKSB7CiAgICAgICAgICBkaWRNYXRjaCA9IHRydWU7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoZGlkTWF0Y2gpIHsKICAgICAgICAvLyBXZSBoYXZlIGEgbWF0Y2guIFRoaXMgb25seSBkcmlsbHMgZG93biB0byB0aGUgY2xvc2VzdCBob3N0IGNvbXBvbmVudHMuCiAgICAgICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIHNlYXJjaCBkZWVwZXIgYmVjYXVzZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZ2l2aW5nCiAgICAgICAgLy8gdmlzdWFsIGZlZWRiYWNrLCAiZmxhc2hpbmciIG91dGVybW9zdCBwYXJlbnQgcmVjdGFuZ2xlcyBpcyBzdWZmaWNpZW50LgogICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsIG1heWJlIHRoZXJlIHdpbGwgYmUgb25lIGZ1cnRoZXIgZG93biBpbiB0aGUgY2hpbGQgdHJlZS4KICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwpIHsKICAgICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShjaGlsZCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHsKICAgICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoc2libGluZywgdHlwZXMsIGhvc3RJbnN0YW5jZXMpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7CiAgICB7CiAgICAgIHZhciBmb3VuZEhvc3RJbnN0YW5jZXMgPSBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpOwoKICAgICAgaWYgKGZvdW5kSG9zdEluc3RhbmNlcykgewogICAgICAgIHJldHVybjsKICAgICAgfSAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnkgaG9zdCBjaGlsZHJlbiwgZmFsbGJhY2sgdG8gY2xvc2VzdCBob3N0IHBhcmVudC4KCgogICAgICB2YXIgbm9kZSA9IGZpYmVyOwoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7CiAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6CiAgICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTsKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgIGNhc2UgSG9zdFBvcnRhbDoKICAgICAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7CiAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICBjYXNlIEhvc3RSb290OgogICAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIHJlYWNoIHJvb3QgZmlyc3QuJyk7CiAgICAgICAgfQoKICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZpbmRDaGlsZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcykgewogICAgewogICAgICB2YXIgbm9kZSA9IGZpYmVyOwogICAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmFsc2U7CgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkgewogICAgICAgICAgLy8gV2UgZ290IGEgbWF0Y2guCiAgICAgICAgICBmb3VuZEhvc3RJbnN0YW5jZXMgPSB0cnVlOwogICAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpOyAvLyBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSwgc28ga2VlcCBzZWFyY2hpbmcuCiAgICAgICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7CiAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5vZGUgPT09IGZpYmVyKSB7CiAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzOwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkgewogICAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSBmaWJlcikgewogICAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzOwogICAgICAgICAgfQoKICAgICAgICAgIG5vZGUgPSBub2RlLnJldHVybjsKICAgICAgICB9CgogICAgICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjsKICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdmFyIGhhc0JhZE1hcFBvbHlmaWxsOwoKICB7CiAgICBoYXNCYWRNYXBQb2x5ZmlsbCA9IGZhbHNlOwoKICAgIHRyeSB7CiAgICAgIHZhciBub25FeHRlbnNpYmxlT2JqZWN0ID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KTsKICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovCgogICAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTsKICAgICAgbmV3IFNldChbbm9uRXh0ZW5zaWJsZU9iamVjdF0pOwogICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAqLwogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGFib3V0IGJhZCBwb2x5ZmlsbHMKICAgICAgaGFzQmFkTWFwUG9seWZpbGwgPSB0cnVlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHsKICAgIC8vIEluc3RhbmNlCiAgICB0aGlzLnRhZyA9IHRhZzsKICAgIHRoaXMua2V5ID0ga2V5OwogICAgdGhpcy5lbGVtZW50VHlwZSA9IG51bGw7CiAgICB0aGlzLnR5cGUgPSBudWxsOwogICAgdGhpcy5zdGF0ZU5vZGUgPSBudWxsOyAvLyBGaWJlcgoKICAgIHRoaXMucmV0dXJuID0gbnVsbDsKICAgIHRoaXMuY2hpbGQgPSBudWxsOwogICAgdGhpcy5zaWJsaW5nID0gbnVsbDsKICAgIHRoaXMuaW5kZXggPSAwOwogICAgdGhpcy5yZWYgPSBudWxsOwogICAgdGhpcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7CiAgICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsOwogICAgdGhpcy51cGRhdGVRdWV1ZSA9IG51bGw7CiAgICB0aGlzLm1lbW9pemVkU3RhdGUgPSBudWxsOwogICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsOwogICAgdGhpcy5tb2RlID0gbW9kZTsgLy8gRWZmZWN0cwoKICAgIHRoaXMuZmxhZ3MgPSBOb0ZsYWdzOwogICAgdGhpcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzOwogICAgdGhpcy5kZWxldGlvbnMgPSBudWxsOwogICAgdGhpcy5sYW5lcyA9IE5vTGFuZXM7CiAgICB0aGlzLmNoaWxkTGFuZXMgPSBOb0xhbmVzOwogICAgdGhpcy5hbHRlcm5hdGUgPSBudWxsOwoKICAgIHsKICAgICAgLy8gTm90ZTogVGhlIGZvbGxvd2luZyBpcyBkb25lIHRvIGF2b2lkIGEgdjggcGVyZm9ybWFuY2UgY2xpZmYuCiAgICAgIC8vCiAgICAgIC8vIEluaXRpYWxpemluZyB0aGUgZmllbGRzIGJlbG93IHRvIHNtaXMgYW5kIGxhdGVyIHVwZGF0aW5nIHRoZW0gd2l0aAogICAgICAvLyBkb3VibGUgdmFsdWVzIHdpbGwgY2F1c2UgRmliZXJzIHRvIGVuZCB1cCBoYXZpbmcgc2VwYXJhdGUgc2hhcGVzLgogICAgICAvLyBUaGlzIGJlaGF2aW9yL2J1ZyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggT2JqZWN0LnByZXZlbnRFeHRlbnNpb24oKS4KICAgICAgLy8gRm9ydHVuYXRlbHkgdGhpcyBvbmx5IGltcGFjdHMgREVWIGJ1aWxkcy4KICAgICAgLy8gVW5mb3J0dW5hdGVseSBpdCBtYWtlcyBSZWFjdCB1bnVzYWJseSBzbG93IGZvciBzb21lIGFwcGxpY2F0aW9ucy4KICAgICAgLy8gVG8gd29yayBhcm91bmQgdGhpcywgaW5pdGlhbGl6ZSB0aGUgZmllbGRzIGJlbG93IHdpdGggZG91Ymxlcy4KICAgICAgLy8KICAgICAgLy8gTGVhcm4gbW9yZSBhYm91dCB0aGlzIGhlcmU6CiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTQzNjUKICAgICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9ODUzOAogICAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gTnVtYmVyLk5hTjsKICAgICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSBOdW1iZXIuTmFOOwogICAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOOwogICAgICB0aGlzLnRyZWVCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOOyAvLyBJdCdzIG9rYXkgdG8gcmVwbGFjZSB0aGUgaW5pdGlhbCBkb3VibGVzIHdpdGggc21pcyBhZnRlciBpbml0aWFsaXphdGlvbi4KICAgICAgLy8gVGhpcyB3b24ndCB0cmlnZ2VyIHRoZSBwZXJmb3JtYW5jZSBjbGlmZiBtZW50aW9uZWQgYWJvdmUsCiAgICAgIC8vIGFuZCBpdCBzaW1wbGlmaWVzIG90aGVyIHByb2ZpbGVyIGNvZGUgKGluY2x1ZGluZyBEZXZUb29scykuCgogICAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDsKICAgICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSAtMTsKICAgICAgdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gMDsKICAgICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDsKICAgIH0KCiAgICB7CiAgICAgIC8vIFRoaXMgaXNuJ3QgZGlyZWN0bHkgdXNlZCBidXQgaXMgaGFuZHkgZm9yIGRlYnVnZ2luZyBpbnRlcm5hbHM6CiAgICAgIHRoaXMuX2RlYnVnU291cmNlID0gbnVsbDsKICAgICAgdGhpcy5fZGVidWdPd25lciA9IG51bGw7CiAgICAgIHRoaXMuX2RlYnVnTmVlZHNSZW1vdW50ID0gZmFsc2U7CiAgICAgIHRoaXMuX2RlYnVnSG9va1R5cGVzID0gbnVsbDsKCiAgICAgIGlmICghaGFzQmFkTWFwUG9seWZpbGwgJiYgdHlwZW9mIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0aGlzKTsKICAgICAgfQogICAgfQogIH0gLy8gVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCByYXRoZXIgdGhhbiBhIFBPSk8gY29uc3RydWN0b3IsIHN0aWxsCiAgLy8gcGxlYXNlIGVuc3VyZSB3ZSBkbyB0aGUgZm9sbG93aW5nOgogIC8vIDEpIE5vYm9keSBzaG91bGQgYWRkIGFueSBpbnN0YW5jZSBtZXRob2RzIG9uIHRoaXMuIEluc3RhbmNlIG1ldGhvZHMgY2FuIGJlCiAgLy8gICAgbW9yZSBkaWZmaWN1bHQgdG8gcHJlZGljdCB3aGVuIHRoZXkgZ2V0IG9wdGltaXplZCBhbmQgdGhleSBhcmUgYWxtb3N0CiAgLy8gICAgbmV2ZXIgaW5saW5lZCBwcm9wZXJseSBpbiBzdGF0aWMgY29tcGlsZXJzLgogIC8vIDIpIE5vYm9keSBzaG91bGQgcmVseSBvbiBgaW5zdGFuY2VvZiBGaWJlcmAgZm9yIHR5cGUgdGVzdGluZy4gV2Ugc2hvdWxkCiAgLy8gICAgYWx3YXlzIGtub3cgd2hlbiBpdCBpcyBhIGZpYmVyLgogIC8vIDMpIFdlIG1pZ2h0IHdhbnQgdG8gZXhwZXJpbWVudCB3aXRoIHVzaW5nIG51bWVyaWMga2V5cyBzaW5jZSB0aGV5IGFyZSBlYXNpZXIKICAvLyAgICB0byBvcHRpbWl6ZSBpbiBhIG5vbi1KSVQgZW52aXJvbm1lbnQuCiAgLy8gNCkgV2UgY2FuIGVhc2lseSBnbyBmcm9tIGEgY29uc3RydWN0b3IgdG8gYSBjcmVhdGVGaWJlciBvYmplY3QgbGl0ZXJhbCBpZiB0aGF0CiAgLy8gICAgaXMgZmFzdGVyLgogIC8vIDUpIEl0IHNob3VsZCBiZSBlYXN5IHRvIHBvcnQgdGhpcyB0byBhIEMgc3RydWN0IGFuZCBrZWVwIGEgQyBpbXBsZW1lbnRhdGlvbgogIC8vICAgIGNvbXBhdGlibGUuCgoKICB2YXIgY3JlYXRlRmliZXIgPSBmdW5jdGlvbiAodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkgewogICAgLy8gJEZsb3dGaXhNZTogdGhlIHNoYXBlcyBhcmUgZXhhY3QgaGVyZSBidXQgRmxvdyBkb2Vzbid0IGxpa2UgY29uc3RydWN0b3JzCiAgICByZXR1cm4gbmV3IEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsKICB9OwoKICBmdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpIHsKICAgIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlOwogICAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7CiAgfQoKICBmdW5jdGlvbiBpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpIHsKICAgIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhc2hvdWxkQ29uc3RydWN0JDEodHlwZSkgJiYgdHlwZS5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZDsKICB9CiAgZnVuY3Rpb24gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KSB7CiAgICBpZiAodHlwZW9mIENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICByZXR1cm4gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSA/IENsYXNzQ29tcG9uZW50IDogRnVuY3Rpb25Db21wb25lbnQ7CiAgICB9IGVsc2UgaWYgKENvbXBvbmVudCAhPT0gdW5kZWZpbmVkICYmIENvbXBvbmVudCAhPT0gbnVsbCkgewogICAgICB2YXIgJCR0eXBlb2YgPSBDb21wb25lbnQuJCR0eXBlb2Y7CgogICAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHsKICAgICAgICByZXR1cm4gRm9yd2FyZFJlZjsKICAgICAgfQoKICAgICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHsKICAgICAgICByZXR1cm4gTWVtb0NvbXBvbmVudDsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBJbmRldGVybWluYXRlQ29tcG9uZW50OwogIH0gLy8gVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBhbHRlcm5hdGUgZmliZXIgdG8gZG8gd29yayBvbi4KCiAgZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgcGVuZGluZ1Byb3BzKSB7CiAgICB2YXIgd29ya0luUHJvZ3Jlc3MgPSBjdXJyZW50LmFsdGVybmF0ZTsKCiAgICBpZiAod29ya0luUHJvZ3Jlc3MgPT09IG51bGwpIHsKICAgICAgLy8gV2UgdXNlIGEgZG91YmxlIGJ1ZmZlcmluZyBwb29saW5nIHRlY2huaXF1ZSBiZWNhdXNlIHdlIGtub3cgdGhhdCB3ZSdsbAogICAgICAvLyBvbmx5IGV2ZXIgbmVlZCBhdCBtb3N0IHR3byB2ZXJzaW9ucyBvZiBhIHRyZWUuIFdlIHBvb2wgdGhlICJvdGhlciIgdW51c2VkCiAgICAgIC8vIG5vZGUgdGhhdCB3ZSdyZSBmcmVlIHRvIHJldXNlLiBUaGlzIGlzIGxhemlseSBjcmVhdGVkIHRvIGF2b2lkIGFsbG9jYXRpbmcKICAgICAgLy8gZXh0cmEgb2JqZWN0cyBmb3IgdGhpbmdzIHRoYXQgYXJlIG5ldmVyIHVwZGF0ZWQuIEl0IGFsc28gYWxsb3cgdXMgdG8KICAgICAgLy8gcmVjbGFpbSB0aGUgZXh0cmEgbWVtb3J5IGlmIG5lZWRlZC4KICAgICAgd29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVGaWJlcihjdXJyZW50LnRhZywgcGVuZGluZ1Byb3BzLCBjdXJyZW50LmtleSwgY3VycmVudC5tb2RlKTsKICAgICAgd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPSBjdXJyZW50LmVsZW1lbnRUeXBlOwogICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOwogICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50LnN0YXRlTm9kZTsKCiAgICAgIHsKICAgICAgICAvLyBERVYtb25seSBmaWVsZHMKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2UgPSBjdXJyZW50Ll9kZWJ1Z1NvdXJjZTsKICAgICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7CiAgICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gY3VycmVudC5fZGVidWdIb29rVHlwZXM7CiAgICAgIH0KCiAgICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IGN1cnJlbnQ7CiAgICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gd29ya0luUHJvZ3Jlc3M7CiAgICB9IGVsc2UgewogICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuCgogICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gYWx0ZXJuYXRlLgogICAgICAvLyBSZXNldCB0aGUgZWZmZWN0IHRhZy4KCiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gTm9GbGFnczsgLy8gVGhlIGVmZmVjdHMgYXJlIG5vIGxvbmdlciB2YWxpZC4KCiAgICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7CiAgICAgIHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IG51bGw7CgogICAgICB7CiAgICAgICAgLy8gV2UgaW50ZW50aW9uYWxseSByZXNldCwgcmF0aGVyIHRoYW4gY29weSwgYWN0dWFsRHVyYXRpb24gJiBhY3R1YWxTdGFydFRpbWUuCiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aW1lIGZyb20gZW5kbGVzc2x5IGFjY3VtdWxhdGluZyBpbiBuZXcgY29tbWl0cy4KICAgICAgICAvLyBUaGlzIGhhcyB0aGUgZG93bnNpZGUgb2YgcmVzZXR0aW5nIHZhbHVlcyBmb3IgZGlmZmVyZW50IHByaW9yaXR5IHJlbmRlcnMsCiAgICAgICAgLy8gQnV0IHdvcmtzIGZvciB5aWVsZGluZyAodGhlIGNvbW1vbiBjYXNlKSBhbmQgc2hvdWxkIHN1cHBvcnQgcmVzdW1pbmcuCiAgICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsRHVyYXRpb24gPSAwOwogICAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbFN0YXJ0VGltZSA9IC0xOwogICAgICB9CiAgICB9IC8vIFJlc2V0IGFsbCBlZmZlY3RzIGV4Y2VwdCBzdGF0aWMgb25lcy4KICAgIC8vIFN0YXRpYyBlZmZlY3RzIGFyZSBub3Qgc3BlY2lmaWMgdG8gYSByZW5kZXIuCgoKICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2s7CiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gY3VycmVudC5jaGlsZExhbmVzOwogICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzOwogICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkOwogICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsKICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7CiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvCiAgICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuCgogICAgdmFyIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llczsKICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDogewogICAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcywKICAgICAgZmlyc3RDb250ZXh0OiBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dAogICAgfTsgLy8gVGhlc2Ugd2lsbCBiZSBvdmVycmlkZGVuIGR1cmluZyB0aGUgcGFyZW50J3MgcmVjb25jaWxpYXRpb24KCiAgICB3b3JrSW5Qcm9ncmVzcy5zaWJsaW5nID0gY3VycmVudC5zaWJsaW5nOwogICAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4OwogICAgd29ya0luUHJvZ3Jlc3MucmVmID0gY3VycmVudC5yZWY7CgogICAgewogICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uOwogICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uOwogICAgfQoKICAgIHsKICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ID0gY3VycmVudC5fZGVidWdOZWVkc1JlbW91bnQ7CgogICAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykgewogICAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDoKICAgICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OgogICAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDoKICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OgogICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgRm9yd2FyZFJlZjoKICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7CiAgfSAvLyBVc2VkIHRvIHJldXNlIGEgRmliZXIgZm9yIGEgc2Vjb25kIHBhc3MuCgogIGZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3Mod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7CiAgICAvLyBUaGlzIHJlc2V0cyB0aGUgRmliZXIgdG8gd2hhdCBjcmVhdGVGaWJlciBvciBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZAogICAgLy8gaGF2ZSBzZXQgdGhlIHZhbHVlcyB0byBiZWZvcmUgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLiBJZGVhbGx5IHRoaXMgd291bGRuJ3QKICAgIC8vIGJlIG5lY2Vzc2FyeSBidXQgdW5mb3J0dW5hdGVseSBtYW55IGNvZGUgcGF0aHMgcmVhZHMgZnJvbSB0aGUgd29ya0luUHJvZ3Jlc3MKICAgIC8vIHdoZW4gdGhleSBzaG91bGQgYmUgcmVhZGluZyBmcm9tIGN1cnJlbnQgYW5kIHdyaXRpbmcgdG8gd29ya0luUHJvZ3Jlc3MuCiAgICAvLyBXZSBhc3N1bWUgcGVuZGluZ1Byb3BzLCBpbmRleCwga2V5LCByZWYsIHJldHVybiBhcmUgc3RpbGwgdW50b3VjaGVkIHRvCiAgICAvLyBhdm9pZCBkb2luZyBhbm90aGVyIHJlY29uY2lsaWF0aW9uLgogICAgLy8gUmVzZXQgdGhlIGVmZmVjdCBmbGFncyBidXQga2VlcCBhbnkgUGxhY2VtZW50IHRhZ3MsIHNpbmNlIHRoYXQncyBzb21ldGhpbmcKICAgIC8vIHRoYXQgY2hpbGQgZmliZXIgaXMgc2V0dGluZywgbm90IHRoZSByZWNvbmNpbGlhdGlvbi4KICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IFN0YXRpY01hc2sgfCBQbGFjZW1lbnQ7IC8vIFRoZSBlZmZlY3RzIGFyZSBubyBsb25nZXIgdmFsaWQuCgogICAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7CgogICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHsKICAgICAgLy8gUmVzZXQgdG8gY3JlYXRlRmliZXIncyBpbml0aWFsIHZhbHVlcy4KICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IE5vTGFuZXM7CiAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7CiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDsKICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFnczsKICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG51bGw7CiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsOwogICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7CiAgICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IG51bGw7CiAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IG51bGw7CgogICAgICB7CiAgICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbFRpbWUgY291bnRzLiBJdCdzIHVzZWZ1bCB0byBhY2N1bXVsYXRlCiAgICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuCiAgICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IDA7CiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IDA7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vIFJlc2V0IHRvIHRoZSBjbG9uZWQgdmFsdWVzIHRoYXQgY3JlYXRlV29ya0luUHJvZ3Jlc3Mgd291bGQndmUuCiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7CiAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lczsKICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkOwogICAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzOwogICAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsOwogICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzOwogICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlOwogICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuCgogICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBDbG9uZSB0aGUgZGVwZW5kZW5jaWVzIG9iamVjdC4gVGhpcyBpcyBtdXRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLCBzbwogICAgICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuCgogICAgICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzOwogICAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHsKICAgICAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcywKICAgICAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0CiAgICAgIH07CgogICAgICB7CiAgICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbFRpbWUgY291bnRzLiBJdCdzIHVzZWZ1bCB0byBhY2N1bXVsYXRlCiAgICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuCiAgICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjsKICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHdvcmtJblByb2dyZXNzOwogIH0KICBmdW5jdGlvbiBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlKSB7CiAgICB2YXIgbW9kZTsKCiAgICBpZiAodGFnID09PSBDb25jdXJyZW50Um9vdCkgewogICAgICBtb2RlID0gQ29uY3VycmVudE1vZGU7CgogICAgICBpZiAoaXNTdHJpY3RNb2RlID09PSB0cnVlKSB7CiAgICAgICAgbW9kZSB8PSBTdHJpY3RMZWdhY3lNb2RlOwoKICAgICAgICB7CiAgICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbW9kZSA9IE5vTW9kZTsKICAgIH0KCiAgICBpZiAoIGlzRGV2VG9vbHNQcmVzZW50KSB7CiAgICAgIC8vIEFsd2F5cyBjb2xsZWN0IHByb2ZpbGUgdGltaW5ncyB3aGVuIERldlRvb2xzIGFyZSBwcmVzZW50LgogICAgICAvLyBUaGlzIGVuYWJsZXMgRGV2VG9vbHMgdG8gc3RhcnQgY2FwdHVyaW5nIHRpbWluZyBhdCBhbnkgcG9pbnTigJMKICAgICAgLy8gV2l0aG91dCBzb21lIG5vZGVzIGluIHRoZSB0cmVlIGhhdmluZyBlbXB0eSBiYXNlIHRpbWVzLgogICAgICBtb2RlIHw9IFByb2ZpbGVNb2RlOwogICAgfQoKICAgIHJldHVybiBjcmVhdGVGaWJlcihIb3N0Um9vdCwgbnVsbCwgbnVsbCwgbW9kZSk7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCAvLyBSZWFjdCRFbGVtZW50VHlwZQogIGtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpIHsKICAgIHZhciBmaWJlclRhZyA9IEluZGV0ZXJtaW5hdGVDb21wb25lbnQ7IC8vIFRoZSByZXNvbHZlZCB0eXBlIGlzIHNldCBpZiB3ZSBrbm93IHdoYXQgdGhlIGZpbmFsIHR5cGUgd2lsbCBiZS4gSS5lLiBpdCdzIG5vdCBsYXp5LgoKICAgIHZhciByZXNvbHZlZFR5cGUgPSB0eXBlOwoKICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBpZiAoc2hvdWxkQ29uc3RydWN0JDEodHlwZSkpIHsKICAgICAgICBmaWJlclRhZyA9IENsYXNzQ29tcG9uZW50OwoKICAgICAgICB7CiAgICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcocmVzb2x2ZWRUeXBlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgewogICAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykgewogICAgICBmaWJlclRhZyA9IEhvc3RDb21wb25lbnQ7CiAgICB9IGVsc2UgewogICAgICBnZXRUYWc6IHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRToKICAgICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21GcmFnbWVudChwZW5kaW5nUHJvcHMuY2hpbGRyZW4sIG1vZGUsIGxhbmVzLCBrZXkpOwoKICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6CiAgICAgICAgICBmaWJlclRhZyA9IE1vZGU7CiAgICAgICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7CgogICAgICAgICAgaWYgKCAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7CiAgICAgICAgICAgIC8vIFN0cmljdCBlZmZlY3RzIHNob3VsZCBuZXZlciBydW4gb24gbGVnYWN5IHJvb3RzCiAgICAgICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7CiAgICAgICAgICB9CgogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRToKICAgICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpOwoKICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6CiAgICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTsKCiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6CiAgICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2VMaXN0KHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7CgogICAgICAgIGNhc2UgUkVBQ1RfT0ZGU0NSRUVOX1RZUEU6CiAgICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7CgogICAgICAgIGNhc2UgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFOgoKICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2gKCiAgICAgICAgY2FzZSBSRUFDVF9TQ09QRV9UWVBFOgoKICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2gKCiAgICAgICAgY2FzZSBSRUFDVF9DQUNIRV9UWVBFOgoKICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2gKCiAgICAgICAgY2FzZSBSRUFDVF9UUkFDSU5HX01BUktFUl9UWVBFOgoKICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2gKCiAgICAgICAgY2FzZSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRToKCiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoCgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikgewogICAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOgogICAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRQcm92aWRlcjsKICAgICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnOwoKICAgICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOgogICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXIKICAgICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0Q29uc3VtZXI7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZzsKCiAgICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6CiAgICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gRm9yd2FyZFJlZjsKCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7CgogICAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6CiAgICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTWVtb0NvbXBvbmVudDsKICAgICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnOwoKICAgICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOgogICAgICAgICAgICAgICAgICBmaWJlclRhZyA9IExhenlDb21wb25lbnQ7CiAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBpbmZvID0gJyc7CgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgIiArICduYW1lZCBpbXBvcnRzLic7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKSA6IG51bGw7CgogICAgICAgICAgICAgIGlmIChvd25lck5hbWUpIHsKICAgICAgICAgICAgICAgIGluZm8gKz0gJ1xuXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgdHlwZSBpcyBpbnZhbGlkOiBleHBlY3RlZCBhIHN0cmluZyAoZm9yIGJ1aWx0LWluICcgKyAnY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSAnICsgKCJidXQgZ290OiAiICsgKHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSkgKyAiLiIgKyBpbmZvKSk7CiAgICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpOwogICAgZmliZXIuZWxlbWVudFR5cGUgPSB0eXBlOwogICAgZmliZXIudHlwZSA9IHJlc29sdmVkVHlwZTsKICAgIGZpYmVyLmxhbmVzID0gbGFuZXM7CgogICAgewogICAgICBmaWJlci5fZGVidWdPd25lciA9IG93bmVyOwogICAgfQoKICAgIHJldHVybiBmaWJlcjsKICB9CiAgZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCBtb2RlLCBsYW5lcykgewogICAgdmFyIG93bmVyID0gbnVsbDsKCiAgICB7CiAgICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7CiAgICB9CgogICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7CiAgICB2YXIga2V5ID0gZWxlbWVudC5rZXk7CiAgICB2YXIgcGVuZGluZ1Byb3BzID0gZWxlbWVudC5wcm9wczsKICAgIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCBrZXksIHBlbmRpbmdQcm9wcywgb3duZXIsIG1vZGUsIGxhbmVzKTsKCiAgICB7CiAgICAgIGZpYmVyLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTsKICAgICAgZmliZXIuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjsKICAgIH0KCiAgICByZXR1cm4gZmliZXI7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7CiAgICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihGcmFnbWVudCwgZWxlbWVudHMsIGtleSwgbW9kZSk7CiAgICBmaWJlci5sYW5lcyA9IGxhbmVzOwogICAgcmV0dXJuIGZpYmVyOwogIH0KCiAgZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7CiAgICB7CiAgICAgIGlmICh0eXBlb2YgcGVuZGluZ1Byb3BzLmlkICE9PSAnc3RyaW5nJykgewogICAgICAgIGVycm9yKCdQcm9maWxlciBtdXN0IHNwZWNpZnkgYW4gImlkIiBvZiB0eXBlIGBzdHJpbmdgIGFzIGEgcHJvcC4gUmVjZWl2ZWQgdGhlIHR5cGUgYCVzYCBpbnN0ZWFkLicsIHR5cGVvZiBwZW5kaW5nUHJvcHMuaWQpOwogICAgICB9CiAgICB9CgogICAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoUHJvZmlsZXIsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlIHwgUHJvZmlsZU1vZGUpOwogICAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFOwogICAgZmliZXIubGFuZXMgPSBsYW5lczsKCiAgICB7CiAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IHsKICAgICAgICBlZmZlY3REdXJhdGlvbjogMCwKICAgICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDAKICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gZmliZXI7CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHsKICAgIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlQ29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7CiAgICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7CiAgICBmaWJlci5sYW5lcyA9IGxhbmVzOwogICAgcmV0dXJuIGZpYmVyOwogIH0KICBmdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7CiAgICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihTdXNwZW5zZUxpc3RDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsKICAgIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOwogICAgZmliZXIubGFuZXMgPSBsYW5lczsKICAgIHJldHVybiBmaWJlcjsKICB9CiAgZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkgewogICAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoT2Zmc2NyZWVuQ29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7CiAgICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX09GRlNDUkVFTl9UWVBFOwogICAgZmliZXIubGFuZXMgPSBsYW5lczsKICAgIHZhciBwcmltYXJ5Q2hpbGRJbnN0YW5jZSA9IHsKICAgICAgaXNIaWRkZW46IGZhbHNlCiAgICB9OwogICAgZmliZXIuc3RhdGVOb2RlID0gcHJpbWFyeUNoaWxkSW5zdGFuY2U7CiAgICByZXR1cm4gZmliZXI7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVRleHQoY29udGVudCwgbW9kZSwgbGFuZXMpIHsKICAgIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTsKICAgIGZpYmVyLmxhbmVzID0gbGFuZXM7CiAgICByZXR1cm4gZmliZXI7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUhvc3RJbnN0YW5jZUZvckRlbGV0aW9uKCkgewogICAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdENvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTsKICAgIGZpYmVyLmVsZW1lbnRUeXBlID0gJ0RFTEVURUQnOwogICAgcmV0dXJuIGZpYmVyOwogIH0KICBmdW5jdGlvbiBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoZGVoeWRyYXRlZE5vZGUpIHsKICAgIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKERlaHlkcmF0ZWRGcmFnbWVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTsKICAgIGZpYmVyLnN0YXRlTm9kZSA9IGRlaHlkcmF0ZWROb2RlOwogICAgcmV0dXJuIGZpYmVyOwogIH0KICBmdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCBtb2RlLCBsYW5lcykgewogICAgdmFyIHBlbmRpbmdQcm9wcyA9IHBvcnRhbC5jaGlsZHJlbiAhPT0gbnVsbCA/IHBvcnRhbC5jaGlsZHJlbiA6IFtdOwogICAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFBvcnRhbCwgcGVuZGluZ1Byb3BzLCBwb3J0YWwua2V5LCBtb2RlKTsKICAgIGZpYmVyLmxhbmVzID0gbGFuZXM7CiAgICBmaWJlci5zdGF0ZU5vZGUgPSB7CiAgICAgIGNvbnRhaW5lckluZm86IHBvcnRhbC5jb250YWluZXJJbmZvLAogICAgICBwZW5kaW5nQ2hpbGRyZW46IG51bGwsCiAgICAgIC8vIFVzZWQgYnkgcGVyc2lzdGVudCB1cGRhdGVzCiAgICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb24KICAgIH07CiAgICByZXR1cm4gZmliZXI7CiAgfSAvLyBVc2VkIGZvciBzdGFzaGluZyBXSVAgcHJvcGVydGllcyB0byByZXBsYXkgZmFpbGVkIHdvcmsgaW4gREVWLgoKICBmdW5jdGlvbiBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih0YXJnZXQsIHNvdXJjZSkgewogICAgaWYgKHRhcmdldCA9PT0gbnVsbCkgewogICAgICAvLyBUaGlzIEZpYmVyJ3MgaW5pdGlhbCBwcm9wZXJ0aWVzIHdpbGwgYWx3YXlzIGJlIG92ZXJ3cml0dGVuLgogICAgICAvLyBXZSBvbmx5IHVzZSBhIEZpYmVyIHRvIGVuc3VyZSB0aGUgc2FtZSBoaWRkZW4gY2xhc3Mgc28gREVWIGlzbid0IHNsb3cuCiAgICAgIHRhcmdldCA9IGNyZWF0ZUZpYmVyKEluZGV0ZXJtaW5hdGVDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7CiAgICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSB3cml0dGVuIGFzIGEgbGlzdCBvZiBhbGwgcHJvcGVydGllcy4KICAgIC8vIFdlIHRyaWVkIHRvIHVzZSBPYmplY3QuYXNzaWduKCkgaW5zdGVhZCBidXQgdGhpcyBpcyBjYWxsZWQgaW4KICAgIC8vIHRoZSBob3R0ZXN0IHBhdGgsIGFuZCBPYmplY3QuYXNzaWduKCkgd2FzIHRvbyBzbG93OgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwMgogICAgLy8gVGhpcyBjb2RlIGlzIERFVi1vbmx5IHNvIHNpemUgaXMgbm90IGEgY29uY2Vybi4KCgogICAgdGFyZ2V0LnRhZyA9IHNvdXJjZS50YWc7CiAgICB0YXJnZXQua2V5ID0gc291cmNlLmtleTsKICAgIHRhcmdldC5lbGVtZW50VHlwZSA9IHNvdXJjZS5lbGVtZW50VHlwZTsKICAgIHRhcmdldC50eXBlID0gc291cmNlLnR5cGU7CiAgICB0YXJnZXQuc3RhdGVOb2RlID0gc291cmNlLnN0YXRlTm9kZTsKICAgIHRhcmdldC5yZXR1cm4gPSBzb3VyY2UucmV0dXJuOwogICAgdGFyZ2V0LmNoaWxkID0gc291cmNlLmNoaWxkOwogICAgdGFyZ2V0LnNpYmxpbmcgPSBzb3VyY2Uuc2libGluZzsKICAgIHRhcmdldC5pbmRleCA9IHNvdXJjZS5pbmRleDsKICAgIHRhcmdldC5yZWYgPSBzb3VyY2UucmVmOwogICAgdGFyZ2V0LnBlbmRpbmdQcm9wcyA9IHNvdXJjZS5wZW5kaW5nUHJvcHM7CiAgICB0YXJnZXQubWVtb2l6ZWRQcm9wcyA9IHNvdXJjZS5tZW1vaXplZFByb3BzOwogICAgdGFyZ2V0LnVwZGF0ZVF1ZXVlID0gc291cmNlLnVwZGF0ZVF1ZXVlOwogICAgdGFyZ2V0Lm1lbW9pemVkU3RhdGUgPSBzb3VyY2UubWVtb2l6ZWRTdGF0ZTsKICAgIHRhcmdldC5kZXBlbmRlbmNpZXMgPSBzb3VyY2UuZGVwZW5kZW5jaWVzOwogICAgdGFyZ2V0Lm1vZGUgPSBzb3VyY2UubW9kZTsKICAgIHRhcmdldC5mbGFncyA9IHNvdXJjZS5mbGFnczsKICAgIHRhcmdldC5zdWJ0cmVlRmxhZ3MgPSBzb3VyY2Uuc3VidHJlZUZsYWdzOwogICAgdGFyZ2V0LmRlbGV0aW9ucyA9IHNvdXJjZS5kZWxldGlvbnM7CiAgICB0YXJnZXQubGFuZXMgPSBzb3VyY2UubGFuZXM7CiAgICB0YXJnZXQuY2hpbGRMYW5lcyA9IHNvdXJjZS5jaGlsZExhbmVzOwogICAgdGFyZ2V0LmFsdGVybmF0ZSA9IHNvdXJjZS5hbHRlcm5hdGU7CgogICAgewogICAgICB0YXJnZXQuYWN0dWFsRHVyYXRpb24gPSBzb3VyY2UuYWN0dWFsRHVyYXRpb247CiAgICAgIHRhcmdldC5hY3R1YWxTdGFydFRpbWUgPSBzb3VyY2UuYWN0dWFsU3RhcnRUaW1lOwogICAgICB0YXJnZXQuc2VsZkJhc2VEdXJhdGlvbiA9IHNvdXJjZS5zZWxmQmFzZUR1cmF0aW9uOwogICAgICB0YXJnZXQudHJlZUJhc2VEdXJhdGlvbiA9IHNvdXJjZS50cmVlQmFzZUR1cmF0aW9uOwogICAgfQoKICAgIHRhcmdldC5fZGVidWdTb3VyY2UgPSBzb3VyY2UuX2RlYnVnU291cmNlOwogICAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyOwogICAgdGFyZ2V0Ll9kZWJ1Z05lZWRzUmVtb3VudCA9IHNvdXJjZS5fZGVidWdOZWVkc1JlbW91bnQ7CiAgICB0YXJnZXQuX2RlYnVnSG9va1R5cGVzID0gc291cmNlLl9kZWJ1Z0hvb2tUeXBlczsKICAgIHJldHVybiB0YXJnZXQ7CiAgfQoKICBmdW5jdGlvbiBGaWJlclJvb3ROb2RlKGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKSB7CiAgICB0aGlzLnRhZyA9IHRhZzsKICAgIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87CiAgICB0aGlzLnBlbmRpbmdDaGlsZHJlbiA9IG51bGw7CiAgICB0aGlzLmN1cnJlbnQgPSBudWxsOwogICAgdGhpcy5waW5nQ2FjaGUgPSBudWxsOwogICAgdGhpcy5maW5pc2hlZFdvcmsgPSBudWxsOwogICAgdGhpcy50aW1lb3V0SGFuZGxlID0gbm9UaW1lb3V0OwogICAgdGhpcy5jb250ZXh0ID0gbnVsbDsKICAgIHRoaXMucGVuZGluZ0NvbnRleHQgPSBudWxsOwogICAgdGhpcy5jYWxsYmFja05vZGUgPSBudWxsOwogICAgdGhpcy5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lOwogICAgdGhpcy5ldmVudFRpbWVzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTsKICAgIHRoaXMuZXhwaXJhdGlvblRpbWVzID0gY3JlYXRlTGFuZU1hcChOb1RpbWVzdGFtcCk7CiAgICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7CiAgICB0aGlzLnN1c3BlbmRlZExhbmVzID0gTm9MYW5lczsKICAgIHRoaXMucGluZ2VkTGFuZXMgPSBOb0xhbmVzOwogICAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzOwogICAgdGhpcy5tdXRhYmxlUmVhZExhbmVzID0gTm9MYW5lczsKICAgIHRoaXMuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7CiAgICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lczsKICAgIHRoaXMuZW50YW5nbGVtZW50cyA9IGNyZWF0ZUxhbmVNYXAoTm9MYW5lcyk7CiAgICB0aGlzLmlkZW50aWZpZXJQcmVmaXggPSBpZGVudGlmaWVyUHJlZml4OwogICAgdGhpcy5vblJlY292ZXJhYmxlRXJyb3IgPSBvblJlY292ZXJhYmxlRXJyb3I7CgogICAgewogICAgICB0aGlzLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSBudWxsOwogICAgfQoKICAgIHsKICAgICAgdGhpcy5lZmZlY3REdXJhdGlvbiA9IDA7CiAgICAgIHRoaXMucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDsKICAgIH0KCiAgICB7CiAgICAgIHRoaXMubWVtb2l6ZWRVcGRhdGVycyA9IG5ldyBTZXQoKTsKICAgICAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSB0aGlzLnBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSBbXTsKCiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBUb3RhbExhbmVzOyBfaSsrKSB7CiAgICAgICAgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcC5wdXNoKG5ldyBTZXQoKSk7CiAgICAgIH0KICAgIH0KCiAgICB7CiAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDoKICAgICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSBoeWRyYXRlID8gJ2h5ZHJhdGVSb290KCknIDogJ2NyZWF0ZVJvb3QoKSc7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBMZWdhY3lSb290OgogICAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZSgpJyA6ICdyZW5kZXIoKSc7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgLy8gVE9ETzogV2UgaGF2ZSBzZXZlcmFsIG9mIHRoZXNlIGFyZ3VtZW50cyB0aGF0IGFyZSBjb25jZXB0dWFsbHkgcGFydCBvZiB0aGUKICAvLyBob3N0IGNvbmZpZywgYnV0IGJlY2F1c2UgdGhleSBhcmUgcGFzc2VkIGluIGF0IHJ1bnRpbWUsIHdlIGhhdmUgdG8gdGhyZWFkCiAgLy8gdGhlbSB0aHJvdWdoIHRoZSByb290IGNvbnN0cnVjdG9yLiBQZXJoYXBzIHdlIHNob3VsZCBwdXQgdGhlbSBhbGwgaW50byBhCiAgLy8gc2luZ2xlIHR5cGUsIGxpa2UgYSBEeW5hbWljSG9zdENvbmZpZyB0aGF0IGlzIGRlZmluZWQgYnkgdGhlIHJlbmRlcmVyLgogIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykgewogICAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7CiAgICAvLyBzdGF0ZU5vZGUgaXMgYW55LgoKCiAgICB2YXIgdW5pbml0aWFsaXplZEZpYmVyID0gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSk7CiAgICByb290LmN1cnJlbnQgPSB1bmluaXRpYWxpemVkRmliZXI7CiAgICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDsKCiAgICB7CiAgICAgIHZhciBfaW5pdGlhbFN0YXRlID0gewogICAgICAgIGVsZW1lbnQ6IGluaXRpYWxDaGlsZHJlbiwKICAgICAgICBpc0RlaHlkcmF0ZWQ6IGh5ZHJhdGUsCiAgICAgICAgY2FjaGU6IG51bGwsCiAgICAgICAgLy8gbm90IGVuYWJsZWQgeWV0CiAgICAgICAgdHJhbnNpdGlvbnM6IG51bGwsCiAgICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbnVsbAogICAgICB9OwogICAgICB1bmluaXRpYWxpemVkRmliZXIubWVtb2l6ZWRTdGF0ZSA9IF9pbml0aWFsU3RhdGU7CiAgICB9CgogICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7CiAgICByZXR1cm4gcm9vdDsKICB9CgogIHZhciBSZWFjdFZlcnNpb24gPSAnMTguMi4wJzsKCiAgZnVuY3Rpb24gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXJJbmZvLCAvLyBUT0RPOiBmaWd1cmUgb3V0IHRoZSBBUEkgZm9yIGNyb3NzLXJlbmRlcmVyIGltcGxlbWVudGF0aW9uLgogIGltcGxlbWVudGF0aW9uKSB7CiAgICB2YXIga2V5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBudWxsOwoKICAgIHsKICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihrZXkpOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIC8vIFRoaXMgdGFnIGFsbG93IHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBQb3J0YWwKICAgICAgJCR0eXBlb2Y6IFJFQUNUX1BPUlRBTF9UWVBFLAogICAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LAogICAgICBjaGlsZHJlbjogY2hpbGRyZW4sCiAgICAgIGNvbnRhaW5lckluZm86IGNvbnRhaW5lckluZm8sCiAgICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvbgogICAgfTsKICB9CgogIHZhciBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzOwogIHZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTsKCiAgewogICAgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9IGZhbHNlOwogICAgZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGUgPSB7fTsKICB9CgogIGZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkgewogICAgaWYgKCFwYXJlbnRDb21wb25lbnQpIHsKICAgICAgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDsKICAgIH0KCiAgICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTsKICAgIHZhciBwYXJlbnRDb250ZXh0ID0gZmluZEN1cnJlbnRVbm1hc2tlZENvbnRleHQoZmliZXIpOwoKICAgIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7CiAgICAgIHZhciBDb21wb25lbnQgPSBmaWJlci50eXBlOwoKICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHsKICAgICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBwYXJlbnRDb250ZXh0OwogIH0KCiAgZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkgewogICAgewogICAgICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTsKCiAgICAgIGlmIChmaWJlciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb21wb25lbnQpLmpvaW4oJywnKTsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgYSBSZWFjdENvbXBvbmVudC4gS2V5czogIiArIGtleXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyKGZpYmVyKTsKCiAgICAgIGlmIChob3N0RmliZXIgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgewogICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCc7CgogICAgICAgIGlmICghZGlkV2FybkFib3V0RmluZE5vZGVJblN0cmljdE1vZGVbY29tcG9uZW50TmFtZV0pIHsKICAgICAgICAgIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTsKICAgICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDsKCiAgICAgICAgICB0cnkgewogICAgICAgICAgICBzZXRDdXJyZW50RmliZXIoaG9zdEZpYmVyKTsKCiAgICAgICAgICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgewogICAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCBpcyBpbnNpZGUgU3RyaWN0TW9kZS4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZXJyb3IoJyVzIGlzIGRlcHJlY2F0ZWQgaW4gU3RyaWN0TW9kZS4gJyArICclcyB3YXMgcGFzc2VkIGFuIGluc3RhbmNlIG9mICVzIHdoaWNoIHJlbmRlcnMgU3RyaWN0TW9kZSBjaGlsZHJlbi4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIC8vIElkZWFsbHkgdGhpcyBzaG91bGQgcmVzZXQgdG8gcHJldmlvdXMgYnV0IHRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBpbgogICAgICAgICAgICAvLyByZW5kZXIgYW5kIHRoZXJlJ3MgYW5vdGhlciB3YXJuaW5nIGZvciB0aGF0IGFueXdheS4KICAgICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHsKICAgICAgICAgICAgICBzZXRDdXJyZW50RmliZXIocHJldmlvdXNGaWJlcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVDb250YWluZXIoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7CiAgICB2YXIgaHlkcmF0ZSA9IGZhbHNlOwogICAgdmFyIGluaXRpYWxDaGlsZHJlbiA9IG51bGw7CiAgICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTsKICB9CiAgZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgLy8gVE9ETzogUmVtb3ZlIGBjYWxsYmFja2Agd2hlbiB3ZSBkZWxldGUgbGVnYWN5IG1vZGUuCiAgY2FsbGJhY2ssIGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykgewogICAgdmFyIGh5ZHJhdGUgPSB0cnVlOwogICAgdmFyIHJvb3QgPSBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpOyAvLyBUT0RPOiBNb3ZlIHRoaXMgdG8gRmliZXJSb290IGNvbnN0cnVjdG9yCgogICAgcm9vdC5jb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUobnVsbCk7IC8vIFNjaGVkdWxlIHRoZSBpbml0aWFsIHJlbmRlci4gSW4gYSBoeWRyYXRpb24gcm9vdCwgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbQogICAgLy8gYSByZWd1bGFyIHVwZGF0ZSBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0IG1hdGNoIHdhcyB3YXMgcmVuZGVyZWQKICAgIC8vIG9uIHRoZSBzZXJ2ZXIuCiAgICAvLyBOT1RFOiBUaGlzIHVwZGF0ZSBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgaGF2ZSBhIHBheWxvYWQuIFdlJ3JlIG9ubHkgdXNpbmcKICAgIC8vIHRoZSB1cGRhdGUgdG8gc2NoZWR1bGUgd29yayBvbiB0aGUgcm9vdCBmaWJlciAoYW5kLCBmb3IgbGVnYWN5IHJvb3RzLCB0bwogICAgLy8gZW5xdWV1ZSB0aGUgY2FsbGJhY2sgaWYgb25lIGlzIHByb3ZpZGVkKS4KCiAgICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDsKICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7CiAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGN1cnJlbnQpOwogICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpOwogICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCA/IGNhbGxiYWNrIDogbnVsbDsKICAgIGVucXVldWVVcGRhdGUoY3VycmVudCwgdXBkYXRlLCBsYW5lKTsKICAgIHNjaGVkdWxlSW5pdGlhbEh5ZHJhdGlvbk9uUm9vdChyb290LCBsYW5lLCBldmVudFRpbWUpOwogICAgcmV0dXJuIHJvb3Q7CiAgfQogIGZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lcihlbGVtZW50LCBjb250YWluZXIsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spIHsKICAgIHsKICAgICAgb25TY2hlZHVsZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KTsKICAgIH0KCiAgICB2YXIgY3VycmVudCQxID0gY29udGFpbmVyLmN1cnJlbnQ7CiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpOwogICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50JDEpOwoKICAgIHsKICAgICAgbWFya1JlbmRlclNjaGVkdWxlZChsYW5lKTsKICAgIH0KCiAgICB2YXIgY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCk7CgogICAgaWYgKGNvbnRhaW5lci5jb250ZXh0ID09PSBudWxsKSB7CiAgICAgIGNvbnRhaW5lci5jb250ZXh0ID0gY29udGV4dDsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnRhaW5lci5wZW5kaW5nQ29udGV4dCA9IGNvbnRleHQ7CiAgICB9CgogICAgewogICAgICBpZiAoaXNSZW5kZXJpbmcgJiYgY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcykgewogICAgICAgIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSB0cnVlOwoKICAgICAgICBlcnJvcignUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7ICcgKyAndHJpZ2dlcmluZyBuZXN0ZWQgY29tcG9uZW50IHVwZGF0ZXMgZnJvbSByZW5kZXIgaXMgbm90IGFsbG93ZWQuICcgKyAnSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluIGNvbXBvbmVudERpZFVwZGF0ZS5cblxuJyArICdDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAlcy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpIHx8ICdVbmtub3duJyk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHkKICAgIC8vIGJlaW5nIGNhbGxlZCAiZWxlbWVudCIuCgogICAgdXBkYXRlLnBheWxvYWQgPSB7CiAgICAgIGVsZW1lbnQ6IGVsZW1lbnQKICAgIH07CiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7CgogICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7CiAgICAgIHsKICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjayk7CiAgICAgICAgfQogICAgICB9CgogICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgIH0KCiAgICB2YXIgcm9vdCA9IGVucXVldWVVcGRhdGUoY3VycmVudCQxLCB1cGRhdGUsIGxhbmUpOwoKICAgIGlmIChyb290ICE9PSBudWxsKSB7CiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBjdXJyZW50JDEsIGxhbmUsIGV2ZW50VGltZSk7CiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgY3VycmVudCQxLCBsYW5lKTsKICAgIH0KCiAgICByZXR1cm4gbGFuZTsKICB9CiAgZnVuY3Rpb24gZ2V0UHVibGljUm9vdEluc3RhbmNlKGNvbnRhaW5lcikgewogICAgdmFyIGNvbnRhaW5lckZpYmVyID0gY29udGFpbmVyLmN1cnJlbnQ7CgogICAgaWYgKCFjb250YWluZXJGaWJlci5jaGlsZCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBzd2l0Y2ggKGNvbnRhaW5lckZpYmVyLmNoaWxkLnRhZykgewogICAgICBjYXNlIEhvc3RDb21wb25lbnQ6CiAgICAgICAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZSk7CgogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBjb250YWluZXJGaWJlci5jaGlsZC5zdGF0ZU5vZGU7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiQxKGZpYmVyKSB7CiAgICBzd2l0Y2ggKGZpYmVyLnRhZykgewogICAgICBjYXNlIEhvc3RSb290OgogICAgICAgIHsKICAgICAgICAgIHZhciByb290ID0gZmliZXIuc3RhdGVOb2RlOwoKICAgICAgICAgIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7CiAgICAgICAgICAgIC8vIEZsdXNoIHRoZSBmaXJzdCBzY2hlZHVsZWQgInVwZGF0ZSIuCiAgICAgICAgICAgIHZhciBsYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eVBlbmRpbmdMYW5lcyhyb290KTsKICAgICAgICAgICAgZmx1c2hSb290KHJvb3QsIGxhbmVzKTsKICAgICAgICAgIH0KCiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OgogICAgICAgIHsKICAgICAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7CgogICAgICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkgewogICAgICAgICAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7CiAgICAgICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgZXZlbnRUaW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7IC8vIElmIHdlJ3JlIHN0aWxsIGJsb2NrZWQgYWZ0ZXIgdGhpcywgd2UgbmVlZCB0byBpbmNyZWFzZQogICAgICAgICAgLy8gdGhlIHByaW9yaXR5IG9mIGFueSBwcm9taXNlcyByZXNvbHZpbmcgd2l0aGluIHRoaXMKICAgICAgICAgIC8vIGJvdW5kYXJ5IHNvIHRoYXQgdGhleSBuZXh0IGF0dGVtcHQgYWxzbyBoYXMgaGlnaGVyIHByaS4KCiAgICAgICAgICB2YXIgcmV0cnlMYW5lID0gU3luY0xhbmU7CiAgICAgICAgICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgcmV0cnlMYW5lKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpIHsKICAgIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTsKCiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHsKICAgICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBoaWdoZXJQcmlvcml0eUxhbmUoc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUsIHJldHJ5TGFuZSk7CiAgICB9CiAgfSAvLyBJbmNyZWFzZXMgdGhlIHByaW9yaXR5IG9mIHRoZW5hYmxlcyB3aGVuIHRoZXkgcmVzb2x2ZSB3aXRoaW4gdGhpcyBib3VuZGFyeS4KCgogIGZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpIHsKICAgIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpOwogICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTsKCiAgICBpZiAoYWx0ZXJuYXRlKSB7CiAgICAgIG1hcmtSZXRyeUxhbmVJbXBsKGFsdGVybmF0ZSwgcmV0cnlMYW5lKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMShmaWJlcikgewogICAgaWYgKGZpYmVyLnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHsKICAgICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2UKICAgICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTywKICAgICAgLy8gc2luY2UgeW91IGhhdmUgdG8gd3JhcCBhbnl0aGluZyB0aGF0IG1pZ2h0IHN1c3BlbmQgaW4KICAgICAgLy8gU3VzcGVuc2UuCiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgbGFuZSA9IFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU7CiAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSk7CgogICAgaWYgKHJvb3QgIT09IG51bGwpIHsKICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTsKICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBsYW5lLCBldmVudFRpbWUpOwogICAgfQoKICAgIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTsKICB9CiAgZnVuY3Rpb24gYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEoZmliZXIpIHsKICAgIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7CiAgICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlCiAgICAgIC8vIHRoZWlyIHByaW9yaXR5IG90aGVyIHRoYW4gc3luY2hyb25vdXNseSBmbHVzaCBpdC4KICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpOwogICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIGxhbmUpOwoKICAgIGlmIChyb290ICE9PSBudWxsKSB7CiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7CiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTsKICAgIH0KCiAgICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7CiAgfQogIGZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGZpYmVyKSB7CiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzKGZpYmVyKTsKCiAgICBpZiAoaG9zdEZpYmVyID09PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlOwogIH0KCiAgdmFyIHNob3VsZEVycm9ySW1wbCA9IGZ1bmN0aW9uIChmaWJlcikgewogICAgcmV0dXJuIG51bGw7CiAgfTsKCiAgZnVuY3Rpb24gc2hvdWxkRXJyb3IoZmliZXIpIHsKICAgIHJldHVybiBzaG91bGRFcnJvckltcGwoZmliZXIpOwogIH0KCiAgdmFyIHNob3VsZFN1c3BlbmRJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgZnVuY3Rpb24gc2hvdWxkU3VzcGVuZChmaWJlcikgewogICAgcmV0dXJuIHNob3VsZFN1c3BlbmRJbXBsKGZpYmVyKTsKICB9CiAgdmFyIG92ZXJyaWRlSG9va1N0YXRlID0gbnVsbDsKICB2YXIgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gbnVsbDsKICB2YXIgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbDsKICB2YXIgb3ZlcnJpZGVQcm9wcyA9IG51bGw7CiAgdmFyIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gbnVsbDsKICB2YXIgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsOwogIHZhciBzY2hlZHVsZVVwZGF0ZSA9IG51bGw7CiAgdmFyIHNldEVycm9ySGFuZGxlciA9IG51bGw7CiAgdmFyIHNldFN1c3BlbnNlSGFuZGxlciA9IG51bGw7CgogIHsKICAgIHZhciBjb3B5V2l0aERlbGV0ZUltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCkgewogICAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07CiAgICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7CgogICAgICBpZiAoaW5kZXggKyAxID09PSBwYXRoLmxlbmd0aCkgewogICAgICAgIGlmIChpc0FycmF5KHVwZGF0ZWQpKSB7CiAgICAgICAgICB1cGRhdGVkLnNwbGljZShrZXksIDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkZWxldGUgdXBkYXRlZFtrZXldOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7CiAgICAgIH0gLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZQoKCiAgICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoRGVsZXRlSW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxKTsKICAgICAgcmV0dXJuIHVwZGF0ZWQ7CiAgICB9OwoKICAgIHZhciBjb3B5V2l0aERlbGV0ZSA9IGZ1bmN0aW9uIChvYmosIHBhdGgpIHsKICAgICAgcmV0dXJuIGNvcHlXaXRoRGVsZXRlSW1wbChvYmosIHBhdGgsIDApOwogICAgfTsKCiAgICB2YXIgY29weVdpdGhSZW5hbWVJbXBsID0gZnVuY3Rpb24gKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXgpIHsKICAgICAgdmFyIG9sZEtleSA9IG9sZFBhdGhbaW5kZXhdOwogICAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopOwoKICAgICAgaWYgKGluZGV4ICsgMSA9PT0gb2xkUGF0aC5sZW5ndGgpIHsKICAgICAgICB2YXIgbmV3S2V5ID0gbmV3UGF0aFtpbmRleF07IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmUKCiAgICAgICAgdXBkYXRlZFtuZXdLZXldID0gdXBkYXRlZFtvbGRLZXldOwoKICAgICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkgewogICAgICAgICAgdXBkYXRlZC5zcGxpY2Uob2xkS2V5LCAxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGVsZXRlIHVwZGF0ZWRbb2xkS2V5XTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZQogICAgICAgIHVwZGF0ZWRbb2xkS2V5XSA9IGNvcHlXaXRoUmVuYW1lSW1wbCggLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZQogICAgICAgIG9ialtvbGRLZXldLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCArIDEpOwogICAgICB9CgogICAgICByZXR1cm4gdXBkYXRlZDsKICAgIH07CgogICAgdmFyIGNvcHlXaXRoUmVuYW1lID0gZnVuY3Rpb24gKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCkgewogICAgICBpZiAob2xkUGF0aC5sZW5ndGggIT09IG5ld1BhdGgubGVuZ3RoKSB7CiAgICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIG9mIHRoZSBzYW1lIGxlbmd0aCcpOwoKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdQYXRoLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHsKICAgICAgICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIHRvIGJlIHRoZSBzYW1lIGV4Y2VwdCBmb3IgdGhlIGRlZXBlc3Qga2V5Jyk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gY29weVdpdGhSZW5hbWVJbXBsKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgMCk7CiAgICB9OwoKICAgIHZhciBjb3B5V2l0aFNldEltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCwgdmFsdWUpIHsKICAgICAgaWYgKGluZGV4ID49IHBhdGgubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CgogICAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07CiAgICAgIHZhciB1cGRhdGVkID0gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBhc3NpZ24oe30sIG9iaik7IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmUKCiAgICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoU2V0SW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxLCB2YWx1ZSk7CiAgICAgIHJldHVybiB1cGRhdGVkOwogICAgfTsKCiAgICB2YXIgY29weVdpdGhTZXQgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCB2YWx1ZSkgewogICAgICByZXR1cm4gY29weVdpdGhTZXRJbXBsKG9iaiwgcGF0aCwgMCwgdmFsdWUpOwogICAgfTsKCiAgICB2YXIgZmluZEhvb2sgPSBmdW5jdGlvbiAoZmliZXIsIGlkKSB7CiAgICAgIC8vIEZvciBub3csIHRoZSAiaWQiIG9mIHN0YXRlZnVsIGhvb2tzIGlzIGp1c3QgdGhlIHN0YXRlZnVsIGhvb2sgaW5kZXguCiAgICAgIC8vIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHdpdGggZS5nLiBuZXN0ZWQgaG9va3MuCiAgICAgIHZhciBjdXJyZW50SG9vayA9IGZpYmVyLm1lbW9pemVkU3RhdGU7CgogICAgICB3aGlsZSAoY3VycmVudEhvb2sgIT09IG51bGwgJiYgaWQgPiAwKSB7CiAgICAgICAgY3VycmVudEhvb2sgPSBjdXJyZW50SG9vay5uZXh0OwogICAgICAgIGlkLS07CiAgICAgIH0KCiAgICAgIHJldHVybiBjdXJyZW50SG9vazsKICAgIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgZWRpdGFibGUgdmFsdWVzIGZvciB1c2VTdGF0ZSBhbmQgdXNlUmVkdWNlci4KCgogICAgb3ZlcnJpZGVIb29rU3RhdGUgPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoLCB2YWx1ZSkgewogICAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7CgogICAgICBpZiAoaG9vayAhPT0gbnVsbCkgewogICAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoU2V0KGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCwgdmFsdWUpOwogICAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlOwogICAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSwKICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci4KICAgICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLikKICAgICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC4KICAgICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLgoKICAgICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTsKICAgICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpOwoKICAgICAgICBpZiAocm9vdCAhPT0gbnVsbCkgewogICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoKSB7CiAgICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTsKCiAgICAgIGlmIChob29rICE9PSBudWxsKSB7CiAgICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhEZWxldGUoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoKTsKICAgICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTsKICAgICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsCiAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuCiAgICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pCiAgICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuCiAgICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay4KCiAgICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7CiAgICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTsKCiAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHsKICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgb2xkUGF0aCwgbmV3UGF0aCkgewogICAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7CgogICAgICBpZiAoaG9vayAhPT0gbnVsbCkgewogICAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoUmVuYW1lKGhvb2subWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCk7CiAgICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7CiAgICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLAogICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLgogICAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKQogICAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LgogICAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suCgogICAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBhc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpOwogICAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7CgogICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7CiAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIHByb3BzIGZvciBmdW5jdGlvbiBjb21wb25lbnRzLCBmb3J3YXJkUmVmLCBtZW1vLCBob3N0IGNvbXBvbmVudHMsIGV0Yy4KCgogICAgb3ZlcnJpZGVQcm9wcyA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCwgdmFsdWUpIHsKICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhTZXQoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCwgdmFsdWUpOwoKICAgICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkgewogICAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7CiAgICAgIH0KCiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7CgogICAgICBpZiAocm9vdCAhPT0gbnVsbCkgewogICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTsKICAgICAgfQogICAgfTsKCiAgICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCkgewogICAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aERlbGV0ZShmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoKTsKCiAgICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHsKICAgICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzOwogICAgICB9CgogICAgICB2YXIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgU3luY0xhbmUpOwoKICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHsKICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7CiAgICAgIH0KICAgIH07CgogICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIG9sZFBhdGgsIG5ld1BhdGgpIHsKICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhSZW5hbWUoZmliZXIubWVtb2l6ZWRQcm9wcywgb2xkUGF0aCwgbmV3UGF0aCk7CgogICAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7CiAgICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wczsKICAgICAgfQoKICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIFN5bmNMYW5lKTsKCiAgICAgIGlmIChyb290ICE9PSBudWxsKSB7CiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApOwogICAgICB9CiAgICB9OwoKICAgIHNjaGVkdWxlVXBkYXRlID0gZnVuY3Rpb24gKGZpYmVyKSB7CiAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBTeW5jTGFuZSk7CgogICAgICBpZiAocm9vdCAhPT0gbnVsbCkgewogICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTsKICAgICAgfQogICAgfTsKCiAgICBzZXRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkRXJyb3JJbXBsKSB7CiAgICAgIHNob3VsZEVycm9ySW1wbCA9IG5ld1Nob3VsZEVycm9ySW1wbDsKICAgIH07CgogICAgc2V0U3VzcGVuc2VIYW5kbGVyID0gZnVuY3Rpb24gKG5ld1Nob3VsZFN1c3BlbmRJbXBsKSB7CiAgICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIoZmliZXIpIHsKICAgIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7CgogICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTsKICB9CgogIGZ1bmN0aW9uIGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UoaW5zdGFuY2UpIHsKICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyRm9yRGV2VG9vbHMoKSB7CiAgICByZXR1cm4gY3VycmVudDsKICB9CgogIGZ1bmN0aW9uIGluamVjdEludG9EZXZUb29scyhkZXZUb29sc0NvbmZpZykgewogICAgdmFyIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlID0gZGV2VG9vbHNDb25maWcuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U7CiAgICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7CiAgICByZXR1cm4gaW5qZWN0SW50ZXJuYWxzKHsKICAgICAgYnVuZGxlVHlwZTogZGV2VG9vbHNDb25maWcuYnVuZGxlVHlwZSwKICAgICAgdmVyc2lvbjogZGV2VG9vbHNDb25maWcudmVyc2lvbiwKICAgICAgcmVuZGVyZXJQYWNrYWdlTmFtZTogZGV2VG9vbHNDb25maWcucmVuZGVyZXJQYWNrYWdlTmFtZSwKICAgICAgcmVuZGVyZXJDb25maWc6IGRldlRvb2xzQ29uZmlnLnJlbmRlcmVyQ29uZmlnLAogICAgICBvdmVycmlkZUhvb2tTdGF0ZTogb3ZlcnJpZGVIb29rU3RhdGUsCiAgICAgIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aDogb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoLAogICAgICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6IG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCwKICAgICAgb3ZlcnJpZGVQcm9wczogb3ZlcnJpZGVQcm9wcywKICAgICAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6IG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoLAogICAgICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aDogb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGgsCiAgICAgIHNldEVycm9ySGFuZGxlcjogc2V0RXJyb3JIYW5kbGVyLAogICAgICBzZXRTdXNwZW5zZUhhbmRsZXI6IHNldFN1c3BlbnNlSGFuZGxlciwKICAgICAgc2NoZWR1bGVVcGRhdGU6IHNjaGVkdWxlVXBkYXRlLAogICAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlciwKICAgICAgZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6IGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyLAogICAgICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZmluZEZpYmVyQnlIb3N0SW5zdGFuY2UgfHwgZW1wdHlGaW5kRmliZXJCeUhvc3RJbnN0YW5jZSwKICAgICAgLy8gUmVhY3QgUmVmcmVzaAogICAgICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6ICBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggLAogICAgICBzY2hlZHVsZVJlZnJlc2g6ICBzY2hlZHVsZVJlZnJlc2ggLAogICAgICBzY2hlZHVsZVJvb3Q6ICBzY2hlZHVsZVJvb3QgLAogICAgICBzZXRSZWZyZXNoSGFuZGxlcjogIHNldFJlZnJlc2hIYW5kbGVyICwKICAgICAgLy8gRW5hYmxlcyBEZXZUb29scyB0byBhcHBlbmQgb3duZXIgc3RhY2tzIHRvIGVycm9yIG1lc3NhZ2VzIGluIERFViBtb2RlLgogICAgICBnZXRDdXJyZW50RmliZXI6ICBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scyAsCiAgICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gZGV0ZWN0IHJlY29uY2lsZXIgdmVyc2lvbiByYXRoZXIgdGhhbiByZW5kZXJlciB2ZXJzaW9uCiAgICAgIC8vIHdoaWNoIG1heSBub3QgbWF0Y2ggZm9yIHRoaXJkIHBhcnR5IHJlbmRlcmVycy4KICAgICAgcmVjb25jaWxlclZlcnNpb246IFJlYWN0VmVyc2lvbgogICAgfSk7CiAgfQoKICAvKiBnbG9iYWwgcmVwb3J0RXJyb3IgKi8KCiAgdmFyIGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3IgPSB0eXBlb2YgcmVwb3J0RXJyb3IgPT09ICdmdW5jdGlvbicgPyAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHJlcG9ydEVycm9yIHdpbGwgZGlzcGF0Y2ggYW4gZXJyb3IgZXZlbnQsCiAgLy8gZW11bGF0aW5nIGFuIHVuY2F1Z2h0IEphdmFTY3JpcHQgZXJyb3IuCiAgcmVwb3J0RXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IpIHsKICAgIC8vIEluIG9sZGVyIGJyb3dzZXJzIGFuZCB0ZXN0IGVudmlyb25tZW50cywgZmFsbGJhY2sgdG8gY29uc29sZS5lcnJvci4KICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcKICAgIGNvbnNvbGVbJ2Vycm9yJ10oZXJyb3IpOwogIH07CgogIGZ1bmN0aW9uIFJlYWN0RE9NUm9vdChpbnRlcm5hbFJvb3QpIHsKICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDsKICB9CgogIFJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUucmVuZGVyID0gUmVhY3RET01Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHsKICAgIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290OwoKICAgIGlmIChyb290ID09PSBudWxsKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBhbiB1bm1vdW50ZWQgcm9vdC4nKTsKICAgIH0KCiAgICB7CiAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7CiAgICAgIH0gZWxzZSBpZiAoaXNWYWxpZENvbnRhaW5lcihhcmd1bWVudHNbMV0pKSB7CiAgICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBjb250YWluZXIgdG8gdGhlIHNlY29uZCBhcmd1bWVudCBvZiByb290LnJlbmRlciguLi4pLiAnICsgIllvdSBkb24ndCBuZWVkIHRvIHBhc3MgaXQgYWdhaW4gc2luY2UgeW91IGFscmVhZHkgcGFzc2VkIGl0IHRvIGNyZWF0ZSB0aGUgcm9vdC4iKTsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgc2Vjb25kIGFyZ3VtZW50IHRvIHJvb3QucmVuZGVyKC4uLikgYnV0IGl0IG9ubHkgYWNjZXB0cyAnICsgJ29uZSBhcmd1bWVudC4nKTsKICAgICAgfQoKICAgICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbzsKCiAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkgewogICAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaW5kSG9zdEluc3RhbmNlV2l0aE5vUG9ydGFscyhyb290LmN1cnJlbnQpOwoKICAgICAgICBpZiAoaG9zdEluc3RhbmNlKSB7CiAgICAgICAgICBpZiAoaG9zdEluc3RhbmNlLnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikgewogICAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhlICcgKyAncm9vdCBjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyAicm9vdC51bm1vdW50KCkgdG8gZW1wdHkgYSByb290J3MgY29udGFpbmVyLiIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgcm9vdCwgbnVsbCwgbnVsbCk7CiAgfTsKCiAgUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID0gZnVuY3Rpb24gKCkgewogICAgewogICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGVycm9yKCd1bm1vdW50KC4uLik6IGRvZXMgbm90IHN1cHBvcnQgYSBjYWxsYmFjayBhcmd1bWVudC4gJyArICdUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgcmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIGEgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTsKICAgICAgfQogICAgfQoKICAgIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290OwoKICAgIGlmIChyb290ICE9PSBudWxsKSB7CiAgICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IG51bGw7CiAgICAgIHZhciBjb250YWluZXIgPSByb290LmNvbnRhaW5lckluZm87CgogICAgICB7CiAgICAgICAgaWYgKGlzQWxyZWFkeVJlbmRlcmluZygpKSB7CiAgICAgICAgICBlcnJvcignQXR0ZW1wdGVkIHRvIHN5bmNocm9ub3VzbHkgdW5tb3VudCBhIHJvb3Qgd2hpbGUgUmVhY3Qgd2FzIGFscmVhZHkgJyArICdyZW5kZXJpbmcuIFJlYWN0IGNhbm5vdCBmaW5pc2ggdW5tb3VudGluZyB0aGUgcm9vdCB1bnRpbCB0aGUgJyArICdjdXJyZW50IHJlbmRlciBoYXMgY29tcGxldGVkLCB3aGljaCBtYXkgbGVhZCB0byBhIHJhY2UgY29uZGl0aW9uLicpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHsKICAgICAgICB1cGRhdGVDb250YWluZXIobnVsbCwgcm9vdCwgbnVsbCwgbnVsbCk7CiAgICAgIH0pOwogICAgICB1bm1hcmtDb250YWluZXJBc1Jvb3QoY29udGFpbmVyKTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBjcmVhdGVSb290KGNvbnRhaW5lciwgb3B0aW9ucykgewogICAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVSb290KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7CiAgICB9CgogICAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpOwogICAgdmFyIGlzU3RyaWN0TW9kZSA9IGZhbHNlOwogICAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTsKICAgIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7CiAgICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjsKICAgIHZhciB0cmFuc2l0aW9uQ2FsbGJhY2tzID0gbnVsbDsKCiAgICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHsKICAgICAgewogICAgICAgIGlmIChvcHRpb25zLmh5ZHJhdGUpIHsKICAgICAgICAgIHdhcm4oJ2h5ZHJhdGUgdGhyb3VnaCBjcmVhdGVSb290IGlzIGRlcHJlY2F0ZWQuIFVzZSBSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pIGluc3RlYWQuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHsKICAgICAgICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBKU1ggZWxlbWVudCB0byBjcmVhdGVSb290LiBZb3UgcHJvYmFibHkgbWVhbnQgdG8gJyArICdjYWxsIHJvb3QucmVuZGVyIGluc3RlYWQuICcgKyAnRXhhbXBsZSB1c2FnZTpcblxuJyArICcgIGxldCByb290ID0gY3JlYXRlUm9vdChkb21Db250YWluZXIpO1xuJyArICcgIHJvb3QucmVuZGVyKDxBcHAgLz4pOycpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkgewogICAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChvcHRpb25zLmlkZW50aWZpZXJQcmVmaXggIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7CiAgICAgIH0KCiAgICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3I7CiAgICAgIH0KCiAgICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3MgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHRyYW5zaXRpb25DYWxsYmFja3MgPSBvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3M7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgcm9vdCA9IGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXIsIENvbmN1cnJlbnRSb290LCBudWxsLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7CiAgICBtYXJrQ29udGFpbmVyQXNSb290KHJvb3QuY3VycmVudCwgY29udGFpbmVyKTsKICAgIHZhciByb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7CiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7CiAgICByZXR1cm4gbmV3IFJlYWN0RE9NUm9vdChyb290KTsKICB9CgogIGZ1bmN0aW9uIFJlYWN0RE9NSHlkcmF0aW9uUm9vdChpbnRlcm5hbFJvb3QpIHsKICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDsKICB9CgogIGZ1bmN0aW9uIHNjaGVkdWxlSHlkcmF0aW9uKHRhcmdldCkgewogICAgaWYgKHRhcmdldCkgewogICAgICBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCk7CiAgICB9CiAgfQoKICBSZWFjdERPTUh5ZHJhdGlvblJvb3QucHJvdG90eXBlLnVuc3RhYmxlX3NjaGVkdWxlSHlkcmF0aW9uID0gc2NoZWR1bGVIeWRyYXRpb247CiAgZnVuY3Rpb24gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHsKICAgIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignaHlkcmF0ZVJvb3QoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTsKICAgIH0KCiAgICB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcik7CgogICAgewogICAgICBpZiAoaW5pdGlhbENoaWxkcmVuID09PSB1bmRlZmluZWQpIHsKICAgICAgICBlcnJvcignTXVzdCBwcm92aWRlIGluaXRpYWwgY2hpbGRyZW4gYXMgc2Vjb25kIGFyZ3VtZW50IHRvIGh5ZHJhdGVSb290LiAnICsgJ0V4YW1wbGUgdXNhZ2U6IGh5ZHJhdGVSb290KGRvbUNvbnRhaW5lciwgPEFwcCAvPiknKTsKICAgICAgfQogICAgfSAvLyBGb3Igbm93IHdlIHJldXNlIHRoZSB3aG9sZSBiYWcgb2Ygb3B0aW9ucyBzaW5jZSB0aGV5IGNvbnRhaW4KICAgIC8vIHRoZSBoeWRyYXRpb24gY2FsbGJhY2tzLgoKCiAgICB2YXIgaHlkcmF0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucyAhPSBudWxsID8gb3B0aW9ucyA6IG51bGw7IC8vIFRPRE86IERlbGV0ZSB0aGlzIG9wdGlvbgoKICAgIHZhciBtdXRhYmxlU291cmNlcyA9IG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmh5ZHJhdGVkU291cmNlcyB8fCBudWxsOwogICAgdmFyIGlzU3RyaWN0TW9kZSA9IGZhbHNlOwogICAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTsKICAgIHZhciBpZGVudGlmaWVyUHJlZml4ID0gJyc7CiAgICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjsKCiAgICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHsKICAgICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkgewogICAgICAgIGlzU3RyaWN0TW9kZSA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChvcHRpb25zLmlkZW50aWZpZXJQcmVmaXggIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7CiAgICAgIH0KCiAgICAgIGlmIChvcHRpb25zLm9uUmVjb3ZlcmFibGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gb3B0aW9ucy5vblJlY292ZXJhYmxlRXJyb3I7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgcm9vdCA9IGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIG51bGwsIGNvbnRhaW5lciwgQ29uY3VycmVudFJvb3QsIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpOwogICAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7IC8vIFRoaXMgY2FuJ3QgYmUgYSBjb21tZW50IG5vZGUgc2luY2UgaHlkcmF0aW9uIGRvZXNuJ3Qgd29yayBvbiBjb21tZW50IG5vZGVzIGFueXdheS4KCiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhjb250YWluZXIpOwoKICAgIGlmIChtdXRhYmxlU291cmNlcykgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dGFibGVTb3VyY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIG11dGFibGVTb3VyY2UgPSBtdXRhYmxlU291cmNlc1tpXTsKICAgICAgICByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbmV3IFJlYWN0RE9NSHlkcmF0aW9uUm9vdChyb290KTsKICB9CiAgZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7CiAgICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCAhZGlzYWJsZUNvbW1lbnRzQXNET01Db250YWluZXJzICApKTsKICB9IC8vIFRPRE86IFJlbW92ZSB0aGlzIGZ1bmN0aW9uIHdoaWNoIGFsc28gaW5jbHVkZXMgY29tbWVudCBub2Rlcy4KICAvLyBXZSBvbmx5IHVzZSBpdCBpbiBwbGFjZXMgdGhhdCBhcmUgY3VycmVudGx5IG1vcmUgcmVsYXhlZC4KCiAgZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lckxlZ2FjeShub2RlKSB7CiAgICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgJykpOwogIH0KCiAgZnVuY3Rpb24gd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpIHsKICAgIHsKICAgICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykgewogICAgICAgIGVycm9yKCdjcmVhdGVSb290KCk6IENyZWF0aW5nIHJvb3RzIGRpcmVjdGx5IHdpdGggZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHVzaW5nIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKTsKICAgICAgfQoKICAgICAgaWYgKGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikpIHsKICAgICAgICBpZiAoY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIpIHsKICAgICAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00ucmVuZGVyKCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkgb24gYSBjb250YWluZXIgdGhhdCAnICsgJ2hhcyBhbHJlYWR5IGJlZW4gcGFzc2VkIHRvIGNyZWF0ZVJvb3QoKSBiZWZvcmUuIEluc3RlYWQsIGNhbGwgJyArICdyb290LnJlbmRlcigpIG9uIHRoZSBleGlzdGluZyByb290IGluc3RlYWQgaWYgeW91IHdhbnQgdG8gdXBkYXRlIGl0LicpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdmFyIFJlYWN0Q3VycmVudE93bmVyJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjsKICB2YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5nczsKCiAgewogICAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChjb250YWluZXIpIHsKICAgICAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyICYmIGNvbnRhaW5lci5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyLmN1cnJlbnQpOwoKICAgICAgICBpZiAoaG9zdEluc3RhbmNlKSB7CiAgICAgICAgICBpZiAoaG9zdEluc3RhbmNlLnBhcmVudE5vZGUgIT09IGNvbnRhaW5lcikgewogICAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhpcyAnICsgJ2NvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArICdSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlIHRvIGVtcHR5IGEgY29udGFpbmVyLicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIGlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QgPSAhIWNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyOwogICAgICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7CiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKHJvb3RFbCAmJiBnZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCkpOwoKICAgICAgaWYgKGhhc05vblJvb3RSZWFjdENoaWxkICYmICFpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0KSB7CiAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJyk7CiAgICAgIH0KCiAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBjb250YWluZXIudGFnTmFtZSAmJiBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQk9EWScpIHsKICAgICAgICBlcnJvcigncmVuZGVyKCk6IFJlbmRlcmluZyBjb21wb25lbnRzIGRpcmVjdGx5IGludG8gZG9jdW1lbnQuYm9keSBpcyAnICsgJ2Rpc2NvdXJhZ2VkLCBzaW5jZSBpdHMgY2hpbGRyZW4gYXJlIG9mdGVuIG1hbmlwdWxhdGVkIGJ5IHRoaXJkLXBhcnR5ICcgKyAnc2NyaXB0cyBhbmQgYnJvd3NlciBleHRlbnNpb25zLiBUaGlzIG1heSBsZWFkIHRvIHN1YnRsZSAnICsgJ3JlY29uY2lsaWF0aW9uIGlzc3Vlcy4gVHJ5IHJlbmRlcmluZyBpbnRvIGEgY29udGFpbmVyIGVsZW1lbnQgY3JlYXRlZCAnICsgJ2ZvciB5b3VyIGFwcC4nKTsKICAgICAgfQogICAgfTsKICB9CgogIGZ1bmN0aW9uIGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpIHsKICAgIGlmICghY29udGFpbmVyKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHsKICAgICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBub29wT25SZWNvdmVyYWJsZUVycm9yKCkgey8vIFRoaXMgaXNuJ3QgcmVhY2hhYmxlIGJlY2F1c2Ugb25SZWNvdmVyYWJsZUVycm9yIGlzbid0IGNhbGxlZCBpbiB0aGUKICAgIC8vIGxlZ2FjeSBBUEkuCiAgfQoKICBmdW5jdGlvbiBsZWdhY3lDcmVhdGVSb290RnJvbURPTUNvbnRhaW5lcihjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaywgaXNIeWRyYXRpb25Db250YWluZXIpIHsKICAgIGlmIChpc0h5ZHJhdGlvbkNvbnRhaW5lcikgewogICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjazsKCiAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7CiAgICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHZhciByb290ID0gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgY2FsbGJhY2ssIGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzCiAgICAgIGZhbHNlLCAvLyBpc1N0cmljdE1vZGUKICAgICAgZmFsc2UsIC8vIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsCiAgICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4CiAgICAgIG5vb3BPblJlY292ZXJhYmxlRXJyb3IpOwogICAgICBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IHJvb3Q7CiAgICAgIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpOwogICAgICB2YXIgcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyOwogICAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7CiAgICAgIGZsdXNoU3luYygpOwogICAgICByZXR1cm4gcm9vdDsKICAgIH0gZWxzZSB7CiAgICAgIC8vIEZpcnN0IGNsZWFyIGFueSBleGlzdGluZyBjb250ZW50LgogICAgICB2YXIgcm9vdFNpYmxpbmc7CgogICAgICB3aGlsZSAocm9vdFNpYmxpbmcgPSBjb250YWluZXIubGFzdENoaWxkKSB7CiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHJvb3RTaWJsaW5nKTsKICAgICAgfQoKICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHZhciBfb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrOwoKICAgICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShfcm9vdCk7CgogICAgICAgICAgX29yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgdmFyIF9yb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzCiAgICAgIGZhbHNlLCAvLyBpc1N0cmljdE1vZGUKICAgICAgZmFsc2UsIC8vIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsCiAgICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4CiAgICAgIG5vb3BPblJlY292ZXJhYmxlRXJyb3IpOwoKICAgICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSBfcm9vdDsKICAgICAgbWFya0NvbnRhaW5lckFzUm9vdChfcm9vdC5jdXJyZW50LCBjb250YWluZXIpOwoKICAgICAgdmFyIF9yb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7CgogICAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhfcm9vdENvbnRhaW5lckVsZW1lbnQpOyAvLyBJbml0aWFsIG1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC4KCiAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7CiAgICAgICAgdXBkYXRlQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgX3Jvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spOwogICAgICB9KTsKICAgICAgcmV0dXJuIF9yb290OwogICAgfQogIH0KCiAgZnVuY3Rpb24gd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHsKICAgIHsKICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGNoaWxkcmVuLCBjb250YWluZXIsIGZvcmNlSHlkcmF0ZSwgY2FsbGJhY2spIHsKICAgIHsKICAgICAgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncyhjb250YWluZXIpOwogICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLCAncmVuZGVyJyk7CiAgICB9CgogICAgdmFyIG1heWJlUm9vdCA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyOwogICAgdmFyIHJvb3Q7CgogICAgaWYgKCFtYXliZVJvb3QpIHsKICAgICAgLy8gSW5pdGlhbCBtb3VudAogICAgICByb290ID0gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaywgZm9yY2VIeWRyYXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJvb3QgPSBtYXliZVJvb3Q7CgogICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjazsKCiAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7CiAgICAgICAgICBvcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpOwogICAgICAgIH07CiAgICAgIH0gLy8gVXBkYXRlCgoKICAgICAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTsKICAgIH0KCiAgICByZXR1cm4gZ2V0UHVibGljUm9vdEluc3RhbmNlKHJvb3QpOwogIH0KCiAgZnVuY3Rpb24gZmluZERPTU5vZGUoY29tcG9uZW50T3JFbGVtZW50KSB7CiAgICB7CiAgICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyJDMuY3VycmVudDsKCiAgICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci5zdGF0ZU5vZGUgIT09IG51bGwpIHsKICAgICAgICB2YXIgd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyOwoKICAgICAgICBpZiAoIXdhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7CiAgICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGZpbmRET01Ob2RlIGluc2lkZSBpdHMgcmVuZGVyKCkuICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3duZXIudHlwZSkgfHwgJ0EgY29tcG9uZW50Jyk7CiAgICAgICAgfQoKICAgICAgICBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoY29tcG9uZW50T3JFbGVtZW50Lm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHsKICAgICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDsKICAgIH0KCiAgICB7CiAgICAgIHJldHVybiBmaW5kSG9zdEluc3RhbmNlV2l0aFdhcm5pbmcoY29tcG9uZW50T3JFbGVtZW50LCAnZmluZERPTU5vZGUnKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gaHlkcmF0ZShlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7CiAgICB7CiAgICAgIGVycm9yKCdSZWFjdERPTS5oeWRyYXRlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBoeWRyYXRlUm9vdCAnICsgJ2luc3RlYWQuIFVudGlsIHlvdSBzd2l0Y2ggdG8gdGhlIG5ldyBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzICcgKyAiaWYgaXQncyBydW5uaW5nIFJlYWN0IDE3LiBMZWFybiAiICsgJ21vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpOwogICAgfQoKICAgIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTsKICAgIH0KCiAgICB7CiAgICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7CgogICAgICBpZiAoaXNNb2Rlcm5Sb290KSB7CiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS5oeWRyYXRlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTUNsaWVudC5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCBoeWRyYXRlUm9vdChjb250YWluZXIsIGVsZW1lbnQpPycpOwogICAgICB9CiAgICB9IC8vIFRPRE86IHRocm93IG9yIHdhcm4gaWYgd2UgY291bGRuJ3QgaHlkcmF0ZT8KCgogICAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgdHJ1ZSwgY2FsbGJhY2spOwogIH0KICBmdW5jdGlvbiByZW5kZXIoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykgewogICAgewogICAgICBlcnJvcignUmVhY3RET00ucmVuZGVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBjcmVhdGVSb290ICcgKyAnaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byB0aGUgbmV3IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgJyArICJpZiBpdCdzIHJ1bm5pbmcgUmVhY3QgMTcuIExlYXJuICIgKyAnbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7CiAgICB9CgogICAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lcikpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpOwogICAgfQoKICAgIHsKICAgICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDsKCiAgICAgIGlmIChpc01vZGVyblJvb3QpIHsKICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlcigpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC5yZW5kZXIoZWxlbWVudCk/Jyk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCBmYWxzZSwgY2FsbGJhY2spOwogIH0KICBmdW5jdGlvbiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKSB7CiAgICB7CiAgICAgIGVycm9yKCdSZWFjdERPTS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcigpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgJyArICdpbiBSZWFjdCAxOC4gQ29uc2lkZXIgdXNpbmcgYSBwb3J0YWwgaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byAnICsgInRoZSBjcmVhdGVSb290IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgaWYgaXQncyBydW5uaW5nIFJlYWN0ICIgKyAnMTcuIExlYXJuIG1vcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zd2l0Y2gtdG8tY3JlYXRlcm9vdCcpOwogICAgfQoKICAgIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXJOb2RlKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7CiAgICB9CgogICAgaWYgKHBhcmVudENvbXBvbmVudCA9PSBudWxsIHx8ICFoYXMocGFyZW50Q29tcG9uZW50KSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcmVudENvbXBvbmVudCBtdXN0IGJlIGEgdmFsaWQgUmVhY3QgQ29tcG9uZW50Jyk7CiAgICB9CgogICAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgZmFsc2UsIGNhbGxiYWNrKTsKICB9CiAgZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpIHsKICAgIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigndW5tb3VudENvbXBvbmVudEF0Tm9kZSguLi4pOiBUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpOwogICAgfQoKICAgIHsKICAgICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDsKCiAgICAgIGlmIChpc01vZGVyblJvb3QpIHsKICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiBEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnVubW91bnQoKT8nKTsKICAgICAgfQogICAgfQoKICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikgewogICAgICB7CiAgICAgICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpOwogICAgICAgIHZhciByZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QgPSByb290RWwgJiYgIWdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKTsKCiAgICAgICAgaWYgKHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCkgewogICAgICAgICAgZXJyb3IoInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCAiICsgJ3dhcyByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuJyk7CiAgICAgICAgfQogICAgICB9IC8vIFVubW91bnQgc2hvdWxkIG5vdCBiZSBiYXRjaGVkLgoKCiAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7CiAgICAgICAgbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgbnVsbCwgY29udGFpbmVyLCBmYWxzZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8gJEZsb3dGaXhNZSBUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgYGRlbGV0ZSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcmAKICAgICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDsKICAgICAgICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpOwogICAgICAgIH0pOwogICAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGwKICAgICAgLy8gZ2V0IGB0cnVlYCB0d2ljZS4gVGhhdCdzIHByb2JhYmx5IGZpbmU/CgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHsKICAgICAgICB2YXIgX3Jvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpOwoKICAgICAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShfcm9vdEVsICYmIGdldEluc3RhbmNlRnJvbU5vZGUoX3Jvb3RFbCkpOyAvLyBDaGVjayBpZiB0aGUgY29udGFpbmVyIGl0c2VsZiBpcyBhIFJlYWN0IHJvb3Qgbm9kZS4KCiAgICAgICAgdmFyIGlzQ29udGFpbmVyUmVhY3RSb290ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIucGFyZW50Tm9kZSkgJiYgISFjb250YWluZXIucGFyZW50Tm9kZS5fcmVhY3RSb290Q29udGFpbmVyOwoKICAgICAgICBpZiAoaGFzTm9uUm9vdFJlYWN0Q2hpbGQpIHsKICAgICAgICAgIGVycm9yKCJ1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdSdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgc2V0QXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGF0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiQxKTsKICBzZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKTsKICBzZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEpOwogIHNldEdldEN1cnJlbnRVcGRhdGVQcmlvcml0eShnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkpOwogIHNldEF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KHJ1bldpdGhQcmlvcml0eSk7CgogIHsKICAgIGlmICh0eXBlb2YgTWFwICE9PSAnZnVuY3Rpb24nIHx8IC8vICRGbG93SXNzdWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgTWFwIGhhcyBubyBwcm90b3R5cGUKICAgIE1hcC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBTZXQgaGFzIG5vIHByb3RvdHlwZQogICAgU2V0LnByb3RvdHlwZSA9PSBudWxsIHx8IHR5cGVvZiBTZXQucHJvdG90eXBlLmNsZWFyICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicpIHsKICAgICAgZXJyb3IoJ1JlYWN0IGRlcGVuZHMgb24gTWFwIGFuZCBTZXQgYnVpbHQtaW4gdHlwZXMuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxscycpOwogICAgfQogIH0KCiAgc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMyk7CiAgc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlcyQxLCBkaXNjcmV0ZVVwZGF0ZXMsIGZsdXNoU3luYyk7CgogIGZ1bmN0aW9uIGNyZWF0ZVBvcnRhbCQxKGNoaWxkcmVuLCBjb250YWluZXIpIHsKICAgIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7CgogICAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpOwogICAgfSAvLyBUT0RPOiBwYXNzIFJlYWN0RE9NIHBvcnRhbCBpbXBsZW1lbnRhdGlvbiBhcyB0aGlyZCBhcmd1bWVudAogICAgLy8gJEZsb3dGaXhNZSBUaGUgRmxvdyB0eXBlIGlzIG9wYXF1ZSBidXQgdGhlcmUncyBubyB3YXkgdG8gYWN0dWFsbHkgY3JlYXRlIGl0LgoKCiAgICByZXR1cm4gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIsIG51bGwsIGtleSk7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKSB7CiAgICByZXR1cm4gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjayk7CiAgfQoKICB2YXIgSW50ZXJuYWxzID0gewogICAgdXNpbmdDbGllbnRFbnRyeVBvaW50OiBmYWxzZSwKICAgIC8vIEtlZXAgaW4gc3luYyB3aXRoIFJlYWN0VGVzdFV0aWxzLmpzLgogICAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi4KICAgIEV2ZW50czogW2dldEluc3RhbmNlRnJvbU5vZGUsIGdldE5vZGVGcm9tSW5zdGFuY2UsIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUsIGVucXVldWVTdGF0ZVJlc3RvcmUsIHJlc3RvcmVTdGF0ZUlmTmVlZGVkLCBiYXRjaGVkVXBkYXRlcyQxXQogIH07CgogIGZ1bmN0aW9uIGNyZWF0ZVJvb3QkMShjb250YWluZXIsIG9wdGlvbnMpIHsKICAgIHsKICAgICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICF0cnVlKSB7CiAgICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGNyZWF0ZVJvb3QgZnJvbSAicmVhY3QtZG9tIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSAicmVhY3QtZG9tL2NsaWVudCIuJyk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gY3JlYXRlUm9vdChjb250YWluZXIsIG9wdGlvbnMpOwogIH0KCiAgZnVuY3Rpb24gaHlkcmF0ZVJvb3QkMShjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykgewogICAgewogICAgICBpZiAoIUludGVybmFscy51c2luZ0NsaWVudEVudHJ5UG9pbnQgJiYgIXRydWUpIHsKICAgICAgICBlcnJvcignWW91IGFyZSBpbXBvcnRpbmcgaHlkcmF0ZVJvb3QgZnJvbSAicmVhY3QtZG9tIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSAicmVhY3QtZG9tL2NsaWVudCIuJyk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpOwogIH0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLgogIC8vIFdhcm5pbmcsIHRoaXMgb3B0cy1vdXQgb2YgY2hlY2tpbmcgdGhlIGZ1bmN0aW9uIGJvZHkuCgoKICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlCiAgZnVuY3Rpb24gZmx1c2hTeW5jJDEoZm4pIHsKICAgIHsKICAgICAgaWYgKGlzQWxyZWFkeVJlbmRlcmluZygpKSB7CiAgICAgICAgZXJyb3IoJ2ZsdXNoU3luYyB3YXMgY2FsbGVkIGZyb20gaW5zaWRlIGEgbGlmZWN5Y2xlIG1ldGhvZC4gUmVhY3QgY2Fubm90ICcgKyAnZmx1c2ggd2hlbiBSZWFjdCBpcyBhbHJlYWR5IHJlbmRlcmluZy4gQ29uc2lkZXIgbW92aW5nIHRoaXMgY2FsbCB0byAnICsgJ2Egc2NoZWR1bGVyIHRhc2sgb3IgbWljcm8gdGFzay4nKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBmbHVzaFN5bmMoZm4pOwogIH0KICB2YXIgZm91bmREZXZUb29scyA9IGluamVjdEludG9EZXZUb29scyh7CiAgICBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTogZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUsCiAgICBidW5kbGVUeXBlOiAgMSAsCiAgICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sCiAgICByZW5kZXJlclBhY2thZ2VOYW1lOiAncmVhY3QtZG9tJwogIH0pOwoKICB7CiAgICBpZiAoIWZvdW5kRGV2VG9vbHMgJiYgY2FuVXNlRE9NICYmIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmKSB7CiAgICAgIC8vIElmIHdlJ3JlIGluIENocm9tZSBvciBGaXJlZm94LCBwcm92aWRlIGEgZG93bmxvYWQgbGluayBpZiBub3QgaW5zdGFsbGVkLgogICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUnKSA+IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWRnZScpID09PSAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xKSB7CiAgICAgICAgdmFyIHByb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sOyAvLyBEb24ndCB3YXJuIGluIGV4b3RpYyBjYXNlcyBsaWtlIGNocm9tZS1leHRlbnNpb246Ly8uCgogICAgICAgIGlmICgvXihodHRwcz98ZmlsZSk6JC8udGVzdChwcm90b2NvbCkpIHsKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcKICAgICAgICAgIGNvbnNvbGUuaW5mbygnJWNEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgJyArICdmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnICsgKHByb3RvY29sID09PSAnZmlsZTonID8gJ1xuWW91IG1pZ2h0IG5lZWQgdG8gdXNlIGEgbG9jYWwgSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgZmlsZTovLyk6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzLWZhcScgOiAnJyksICdmb250LXdlaWdodDpib2xkJyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBleHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gSW50ZXJuYWxzOwogIGV4cG9ydHMuY3JlYXRlUG9ydGFsID0gY3JlYXRlUG9ydGFsJDE7CiAgZXhwb3J0cy5jcmVhdGVSb290ID0gY3JlYXRlUm9vdCQxOwogIGV4cG9ydHMuZmluZERPTU5vZGUgPSBmaW5kRE9NTm9kZTsKICBleHBvcnRzLmZsdXNoU3luYyA9IGZsdXNoU3luYyQxOwogIGV4cG9ydHMuaHlkcmF0ZSA9IGh5ZHJhdGU7CiAgZXhwb3J0cy5oeWRyYXRlUm9vdCA9IGh5ZHJhdGVSb290JDE7CiAgZXhwb3J0cy5yZW5kZXIgPSByZW5kZXI7CiAgZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTsKICBleHBvcnRzLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzID0gYmF0Y2hlZFVwZGF0ZXMkMTsKICBleHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7CiAgZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uOwoKfSkpKTs=","response_hash":"34453876ace13c4962ae6d998d03777edfdb7da9240f0e726db3be816910e743","response_time_ms":0,"response_words":116047,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"js","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":17},{"name":"3","value":"react-dom.development.js","type":"path","name_start":-1,"name_end":-1,"value_start":18,"value_end":42}],"sent_at":"2026-04-05T05:31:32.572735Z","received_at":"2026-04-05T05:31:32.57273Z","created_at":"2026-04-05T05:31:32Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"259c5ba4-5287-48f0-ba21-5d6005742c18","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/js/subscribeNow.js","url":"https://ginandjuice.shop/resources/js/subscribeNow.js","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvanMvc3Vic2NyaWJlTm93LmpzIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuDQpSZWZlcmVyOiBodHRwczovL2dpbmFuZGp1aWNlLnNob3AvDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE0LjAuMC4wIFNhZmFyaS81MzcuMzYNCg0K","request_hash":"1c47d0d1b54f06f64d5fe79f86461ea952015cc1f3af6f2b6e4791f881ce743e","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["1111"],"content-type":["application/javascript; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:31:32 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/javascript; charset=utf-8","response_content_length":3739,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQp4LWZyYW1lLW9wdGlvbnM6IFNBTUVPUklHSU4NCmNhY2hlLWNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0zNjAwDQpjb250ZW50LWxlbmd0aDogMTExMQ0KeC1iYWNrZW5kOiBjOThkZjVjNC1hNTI3LTRkYWEtODhjZC04M2M1ZGU0ZTdjNzcNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzE6MzIgR01UDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgNCg0KbGV0IHN1YnNjcmliZU5vd1JlYWR5ID0gKGNhbGxiYWNrKSA9PiB7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gImxvYWRpbmciKSBjYWxsYmFjaygpOwogICAgZWxzZSBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgY2FsbGJhY2spOwp9CgpzdWJzY3JpYmVOb3dSZWFkeSgoKSA9PiB7CiAgICBjb25zdCBzdWJzY3JpYmVOb3dGb3JtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3N1YnNjcmliZSIpOwogICAgY29uc3QgYnV0dG9uSW5wdXQgPSBzdWJzY3JpYmVOb3dGb3JtLnF1ZXJ5U2VsZWN0b3IoImJ1dHRvblt0eXBlPXN1Ym1pdF0iKTsKICAgIGNvbnN0IGVtYWlsSW5wdXQgPSBzdWJzY3JpYmVOb3dGb3JtLnF1ZXJ5U2VsZWN0b3IoImlucHV0W3R5cGU9ZW1haWxdIik7CgogICAgYnV0dG9uSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZXZlbnQpID0+IHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGlmICghZW1haWxJbnB1dC5jaGVja1ZhbGlkaXR5KCkpIHsKICAgICAgICAgICAgZW1haWxJbnB1dC5yZXBvcnRWYWxpZGl0eSgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCBmb3JtSW5wdXRzID0gc3Vic2NyaWJlTm93Rm9ybS5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dCIpOwogICAgICAgIGNvbnN0IHZhbHVlID0gQXJyYXkuZnJvbShmb3JtSW5wdXRzKQogICAgICAgICAgICAgICAgLnJlZHVjZSgob2JqLCBmb3JtSW5wdXQpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAuLi5vYmosCiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtSW5wdXQubmFtZV06IGZvcm1JbnB1dC52YWx1ZSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSA0KSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUpzb24gPSBKU09OLnBhcnNlKHRoaXMucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1QYXJlbnQgPSBzdWJzY3JpYmVOb3dGb3JtLnBhcmVudEVsZW1lbnQ7CiAgICAgICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCduZXdzbGV0dGVyLXNpZ251cC1yZXNwb25zZScpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09IDIwMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUpzb24uZW1haWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1haWxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxEaXYuY2xhc3NMaXN0LmFkZCgnZW1haWwtc2lnbnVwLWNvbmZpcm0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1haWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsLnRleHRDb250ZW50ID0gcmVzcG9uc2VKc29uLmVtYWlsOwogICAgICAgICAgICAgICAgICAgICAgICBlbWFpbERpdi5hcHBlbmRDaGlsZChlbWFpbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChlbWFpbERpdik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImgzIik7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRleHRDb250ZW50ID0gJ1RoYW5rIHlvdSBmb3IgU3Vic2NyaWJpbmcnOwogICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZU5vd0Zvcm0ucmVwbGFjZVdpdGgoZGl2KQoKICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VKc29uLmNvdXBvbikgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb3Vwb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29weWFibGUtY291cG9uIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvdXBvbi50ZXh0Q29udGVudCA9IHJlc3BvbnNlSnNvbi5jb3Vwb247CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWFsb2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY291cG9uLWRpYWxvZyIpOwogICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zaG93TW9kYWwoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaDMiKTsKICAgICAgICAgICAgICAgICAgICBoZWFkZXIudGV4dENvbnRlbnQgPSAnRXJyb3IgU3Vic2NyaWJpbmcnOwogICAgICAgICAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdlcnJvcicpOwogICAgICAgICAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZChoZWFkZXIpOwogICAgICAgICAgICAgICAgICAgIC8vIGZvcm1QYXJlbnQuYXBwZW5kQ2hpbGQoZGl2KTsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVOb3dGb3JtLnJlcGxhY2VXaXRoKGRpdikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgeGhyLm9wZW4oc3Vic2NyaWJlTm93Rm9ybS5kYXRhc2V0Lm1ldGhvZCwgc3Vic2NyaWJlTm93Rm9ybS5kYXRhc2V0LmFjdGlvbik7CiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgiKTsKICAgICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeSh2YWx1ZSkpOwogICAgfSk7Cn0pOwoKY29uc3QgY2xvc2VDb3Vwb25EaWFsb2cgPSAoZSkgPT4gewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgIGNvbnN0IGRpYWxvZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb3Vwb24tZGlhbG9nIik7CiAgICBkaWFsb2cuY2xvc2UoKTsKfTsKCmNvbnN0IGNvcHlDb3Vwb24gPSBhc3luYyAoZSkgPT4gewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgY29uc3QgY29weWFibGVDb3Vwb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29weWFibGUtY291cG9uIik7CiAgICB0cnkgewogICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvcHlhYmxlQ291cG9uLnRleHRDb250ZW50KTsKCiAgICAgICAgY29uc3QgdGljayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb3Vwb24tY29waWVkLXRpY2siKTsKICAgICAgICB0aWNrLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAiY291cG9uLWNvcGllZC10aWNrIikKCiAgICAgICAgY29weWFibGVDb3Vwb24udGV4dENvbnRlbnQgPSAiQ29waWVkIjsKICAgICAgICBjb25zdCBjb3B5Q291cG9uQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvcHktY291cG9uLWJ1dHRvbiIpOwogICAgICAgIGNvcHlDb3Vwb25CdXR0b24uY2xhc3NOYW1lICs9ICIgaGlkZGVuIjsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb3B5OiAnLCBlcnIpOwogICAgfQp9Ow==","response_hash":"d7b19559f60c43b623aaab0284faad42681b0f04e2ef68dd980828353b83fbba","response_time_ms":0,"response_words":243,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"js","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":17},{"name":"3","value":"subscribeNow.js","type":"path","name_start":-1,"name_end":-1,"value_start":18,"value_end":33}],"sent_at":"2026-04-05T05:31:32.747466Z","received_at":"2026-04-05T05:31:32.747461Z","created_at":"2026-04-05T05:31:32Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"b9a22adf-6f25-4477-8e92-204d0682b274","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/images/icon-cart.svg","url":"https://ginandjuice.shop/resources/images/icon-cart.svg","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvaW1hZ2VzL2ljb24tY2FydC5zdmcgSFRUUC8xLjENCkhvc3Q6IGdpbmFuZGp1aWNlLnNob3ANClJlZmVyZXI6IGh0dHBzOi8vZ2luYW5kanVpY2Uuc2hvcC8NClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTQuMC4wLjAgU2FmYXJpLzUzNy4zNg0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KDQo=","request_hash":"2694a919c5a6c8772762f0a5b7a22ace2217b2721a27f71945067d9791ac74cb","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["747"],"content-type":["image/svg+xml"],"date":["Sun, 05 Apr 2026 05:31:32 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"image/svg+xml","response_content_length":1435,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LWxlbmd0aDogNzQ3DQp4LWJhY2tlbmQ6IGM5OGRmNWM0LWE1MjctNGRhYS04OGNkLTgzYzVkZTRlN2M3Nw0KZGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMTozMiBHTVQNCmNvbnRlbnQtZW5jb2Rpbmc6IGd6aXANCmNvbnRlbnQtdHlwZTogaW1hZ2Uvc3ZnK3htbA0KeC1mcmFtZS1vcHRpb25zOiBTQU1FT1JJR0lODQpjYWNoZS1jb250cm9sOiBwdWJsaWMsIG1heC1hZ2U9MzYwMA0KDQo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMjcuMy4xLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iY2FydC1pY29uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI0IDI0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPHBhdGggZmlsbD0iY3VycmVudENvbG9yIiBkPSJNMjIuODM4MTQ0Myw0LjYzNTI1MzljLTAuNTQ3ODUxNi0wLjEwMDA5NzctMS4wNjM0NzY2LDAuMjYwMjUzOS0xLjE2NDA2MjUsMC44MDI3MzQ0CgkJbC0wLjk3OTQ5MjIsNS4zMjk1ODk4Yy0wLjI3NjM2NzIsMC42ODc1LTAuOTUxMTcxOSwxLjE0NDUzMTItMS43MDMxMjUsMS4xNDQ1MzEyaC0xMS45MDYyNQoJCWMtMC4wMzQ0MjM4LDAtMC4wNjM1Mzc2LDAuMDE2MTc0My0wLjA5NzEwNjksMC4wMTk1OTIzTDQuODA4MzU4NywxLjM4Mzc4OTFIMS4zNDI1Mzg1Yy0wLjU1MjI0NjIsMC0xLDAuNDQ3NzUzOS0xLDEKCQlzMC40NDc3NTM5LDEsMSwxaDEuODM2OTEzOWwyLjk2Njc5NjksMTQuMzU2NDQ1M2gxMi40MjQzMTY0YzAuNTUyNzM0NCwwLDEtMC40NDcyNjU2LDEtMXMtMC40NDcyNjU2LTEtMS0xSDcuNzc1MTU1NQoJCWwtMC4zNzc4MDc2LTEuODI4MTI1aDExLjU5NDExNjJjMS42MTkxNDA2LDAsMy4wNzEyODkxLTEuMDIwNTA3OCwzLjYxMzI4MTItMi41NDAwMzkxbDEuMDM2MTMyOC01LjU3Mjc1MzkKCQlDMjMuNzQwNDg4MSw1LjI1NjM0NzcsMjMuMzgxMTEzMSw0LjczNDg2MzMsMjIuODM4MTQ0Myw0LjYzNTI1Mzl6Ii8+Cgk8cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik04Ljk5OTI3NzEsMTguNTIxNDg0NGMtMS4xMjg5MDY3LDAtMi4wNDY4NzU1LDAuOTE4OTQ1My0yLjA0Njg3NTUsMi4wNDc4NTE2CgkJczAuOTE3OTY4OCwyLjA0Njg3NSwyLjA0Njg3NTUsMi4wNDY4NzVzMi4wNDczNjMzLTAuOTE3OTY4OCwyLjA0NzM2MzMtMi4wNDY4NzVTMTAuMTI4MTgzNCwxOC41MjE0ODQ0LDguOTk5Mjc3MSwxOC41MjE0ODQ0eiIvPgoJPHBhdGggZmlsbD0iY3VycmVudENvbG9yIiBkPSJNMTUuNjk5NDcyNCwxOC41MjE0ODQ0Yy0xLjEyODkwNjIsMC0yLjA0Njg3NSwwLjkxODk0NTMtMi4wNDY4NzUsMi4wNDc4NTE2CgkJczAuOTE3OTY4OCwyLjA0Njg3NSwyLjA0Njg3NSwyLjA0Njg3NXMyLjA0Njg3NS0wLjkxNzk2ODgsMi4wNDY4NzUtMi4wNDY4NzVTMTYuODI4Mzc4NywxOC41MjE0ODQ0LDE1LjY5OTQ3MjQsMTguNTIxNDg0NHoiLz4KPC9nPgo8L3N2Zz4K","response_hash":"a4297149a6afe278ffdae7cffa9560e73f8722f7e9bb6a7454c4fafc291e718e","response_time_ms":0,"response_words":74,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"images","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":21},{"name":"3","value":"icon-cart.svg","type":"path","name_start":-1,"name_end":-1,"value_start":22,"value_end":35}],"sent_at":"2026-04-05T05:31:32.787834Z","received_at":"2026-04-05T05:31:32.78783Z","created_at":"2026-04-05T05:31:32Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"336f30f1-5d0e-4ed5-a253-9d33324d650f","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/images/icon-account.svg","url":"https://ginandjuice.shop/resources/images/icon-account.svg","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvaW1hZ2VzL2ljb24tYWNjb3VudC5zdmcgSFRUUC8xLjENCkhvc3Q6IGdpbmFuZGp1aWNlLnNob3ANClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTQuMC4wLjAgU2FmYXJpLzUzNy4zNg0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KUmVmZXJlcjogaHR0cHM6Ly9naW5hbmRqdWljZS5zaG9wLw0KDQo=","request_hash":"7a13414132300d1741002c1205049494815a0fce769e1bf9373bbfd48a6b2ca2","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["649"],"content-type":["image/svg+xml"],"date":["Sun, 05 Apr 2026 05:31:32 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"image/svg+xml","response_content_length":1175,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQp4LWZyYW1lLW9wdGlvbnM6IFNBTUVPUklHSU4NCmNhY2hlLWNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0zNjAwDQpjb250ZW50LWxlbmd0aDogNjQ5DQp4LWJhY2tlbmQ6IGM5OGRmNWM0LWE1MjctNGRhYS04OGNkLTgzYzVkZTRlN2M3Nw0KZGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMTozMiBHTVQNCmNvbnRlbnQtZW5jb2Rpbmc6IGd6aXANCmNvbnRlbnQtdHlwZTogaW1hZ2Uvc3ZnK3htbA0KDQo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMjcuMy4xLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iYWNjb3VudC1pY29uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI0IDI0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxnPgoJPHBhdGggZmlsbD0iY3VycmVudENvbG9yIiBkPSJNMTkuNTEzNjcxOSwxNC4zNzQwMjM0QzE4LjU3MjI2NTYsMTMuNDg4MjgxMiwxNy4zMjQyMTg4LDEzLDE2LDEzSDgKCQljLTEuMzI0MjE4OCwwLTIuNTcxNzc3MywwLjQ4ODI4MTItMy41MTQxNjAyLDEuMzc0MDIzNEMzLjU0MTUwMzksMTUuMjYzNjcxOSwzLDE2LjQ5OTAyMzQsMywxNy43NjQ2NDg0djQuNDQxNDA2MgoJCWMwLDAuNTUyNzM0NCwwLjQ0Nzc1MzksMSwxLDFzMS0wLjQ0NzI2NTYsMS0xdi00LjQ0MTQwNjJjMC0wLjcyNjU2MjUsMC4zMDQxOTkyLTEuNDE0MDYyNSwwLjg1NjQ0NTMtMS45MzM1OTM4CgkJQzYuNDE3OTY4OCwxNS4zMDI3MzQ0LDcuMTk5MjE4OCwxNSw4LDE1aDhjMC44MDA3ODEyLDAsMS41ODIwMzEyLDAuMzAyNzM0NCwyLjE0MjU3ODEsMC44MzEwNTQ3CgkJQzE4LjY5NTMxMjUsMTYuMzUxNTYyNSwxOSwxNy4wMzgwODU5LDE5LDE3Ljc2NDY0ODR2NC40NDE0MDYyYzAsMC41NTI3MzQ0LDAuNDQ3MjY1NiwxLDEsMXMxLTAuNDQ3MjY1NiwxLTF2LTQuNDQxNDA2MgoJCUMyMSwxNi40OTkwMjM0LDIwLjQ1ODAwNzgsMTUuMjYzNjcxOSwxOS41MTM2NzE5LDE0LjM3NDAyMzR6Ii8+Cgk8cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiIGQ9Ik0xMiwxMWMyLjc1NjgzNTksMCw1LTIuMjQzMTY0MSw1LTVzLTIuMjQzMTY0MS01LTUtNVM3LDMuMjQzMTY0MSw3LDZTOS4yNDMxNjQxLDExLDEyLDExeiBNMTIsMwoJCWMxLjY1NDI5NjksMCwzLDEuMzQ1NzAzMSwzLDNzLTEuMzQ1NzAzMSwzLTMsM1M5LDcuNjU0Mjk2OSw5LDZTMTAuMzQ1NzAzMSwzLDEyLDN6Ii8+CjwvZz4KPC9zdmc+Cg==","response_hash":"044203eb731cde3a752ab82017f77c8f05dc85bc03310d754469b4b17cbb2b17","response_time_ms":0,"response_words":71,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"images","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":21},{"name":"3","value":"icon-account.svg","type":"path","name_start":-1,"name_end":-1,"value_start":22,"value_end":38}],"sent_at":"2026-04-05T05:31:32.838152Z","received_at":"2026-04-05T05:31:32.838146Z","created_at":"2026-04-05T05:31:32Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"4c5a1472-d19e-4302-92f1-9e36432b52cd","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/images/gin-and-juice-shop-logo.svg","url":"https://ginandjuice.shop/resources/images/gin-and-juice-shop-logo.svg","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/resources/labheader/css/scanMeHeader.css"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvaW1hZ2VzL2dpbi1hbmQtanVpY2Utc2hvcC1sb2dvLnN2ZyBIVFRQLzEuMQ0KSG9zdDogZ2luYW5kanVpY2Uuc2hvcA0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KUmVmZXJlcjogaHR0cHM6Ly9naW5hbmRqdWljZS5zaG9wL3Jlc291cmNlcy9sYWJoZWFkZXIvY3NzL3NjYW5NZUhlYWRlci5jc3MNClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTQuMC4wLjAgU2FmYXJpLzUzNy4zNg0KDQo=","request_hash":"3aa5dbe960adcd1b6022f3102ff780c519f68daa212ba4ca35dce71d688e63c9","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["7544"],"content-type":["image/svg+xml"],"date":["Sun, 05 Apr 2026 05:31:32 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"image/svg+xml","response_content_length":17353,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LXR5cGU6IGltYWdlL3N2Zyt4bWwNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY2FjaGUtY29udHJvbDogcHVibGljLCBtYXgtYWdlPTM2MDANCmNvbnRlbnQtbGVuZ3RoOiA3NTQ0DQp4LWJhY2tlbmQ6IGM5OGRmNWM0LWE1MjctNGRhYS04OGNkLTgzYzVkZTRlN2M3Nw0KZGF0ZTogU3VuLCAwNSBBcHIgMjAyNiAwNTozMTozMiBHTVQNCg0KPHN2ZyB3aWR0aD0iMjIwIiBoZWlnaHQ9IjQ1IiB2aWV3Qm94PSIwIDAgMjIwIDQ1IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMzYxXzUzNSkiPgo8cGF0aCBkPSJNMTcuMzM1NyAzNi43MDMyQzE2LjIxNzQgMzYuNzAzMiAxNS40MzYgMzYuNjA5NCAxNC45OTYyIDM2LjQyMTdDMTQuNTU2MyAzNi4yMzQgMTQuMTYzMyAzNi4wMDQxIDEzLjgyNjQgMzUuNzMxOUMxMy4xMTUyIDM2LjE3MyAxMi4zMzM4IDM2LjUyMDIgMTEuNDg2OSAzNi43NzgzQzEwLjY0IDM3LjAzMTcgOS43MjI4OCAzNy4xNTg0IDguNzQwMjggMzcuMTU4NEM3LjQ1MzU0IDM3LjE1ODQgNi4yNzQ0MiAzNi45NTY2IDUuMjA3NTkgMzYuNTQ4NEM0LjE0MDc2IDM2LjE0MDIgMy4yMjM2NyAzNS41OTEyIDIuNDYwOTggMzQuODkyQzEuNjk4MjkgMzQuMTk3NSAxLjA5NDcgMzMuMzgxMSAwLjY1NDg2NSAzMi40NDczQzAuMjE1MDMzIDMxLjUxMzUgLTAuMDA0ODgyODEgMzAuNTE4OCAtMC4wMDQ4ODI4MSAyOS40NjNWNy43NDcwMkMtMC4wMDQ4ODI4MSA2LjY5NTk0IDAuMTkxNjM4IDUuNjkxNzkgMC41OCA0LjczOTI1QzAuOTY4MzYyIDMuNzg2NzEgMS41NDM4OSAyLjk3MDI1IDIuMzA2NTcgMi4yOTQ1NkMzLjA2OTI2IDEuNjE0MTcgNC4wMjM3OSAxLjA2OTg3IDUuMTc5NTEgMC42NjE2MzZDNi4zMzUyNCAwLjI1MzQwNSA3LjY3MzQ1IDAuMDUxNjM1NyA5LjE5ODgzIDAuMDUxNjM1N0MxMC44OTI2IDAuMDUxNjM1NyAxMi4yOTE3IDAuMzAwMzI4IDEzLjM5MTMgMC43OTMwMkMxNC40OTA4IDEuMjg1NzEgMTUuMzU2NSAxLjg5NTcxIDE1Ljk4MzUgMi42Mjc3MUMxNi42MTA1IDMuMzU5NzEgMTcuMDQwOSA0LjEzODYzIDE3LjI3OTYgNC45NzM4N0MxNy41MTgyIDUuODA5MSAxNy42MzUyIDYuNTY0NTYgMTcuNjM1MiA3LjI0MDI1QzE3LjYzNTIgOC4yOTYwMiAxNy40NjY3IDkuMjAxNjMgMTcuMTI1MiA5Ljk2NjQ4QzE2Ljc4ODMgMTAuNzMxMyAxNi4zNjI1IDExLjM2MDEgMTUuODUyNCAxMS44NTI4QzE1LjM0MjQgMTIuMzQ1NSAxNC43ODU2IDEyLjcxMTUgMTQuMTcyNyAxMi45NTA4QzEzLjU2NDQgMTMuMTkwMSAxMi45ODQyIDEzLjMwNzQgMTIuNDQ2MSAxMy4zMDc0QzEwLjg4OCAxMy4zMDc0IDkuNjU3MzcgMTIuOTMyIDguNzU5IDEyLjE4NTlDNy44NjA2MiAxMS40Mzk5IDcuNDExNDMgMTAuNjIzNCA3LjQxMTQzIDkuNzQxMjVDNy45NTQyIDkuOTQzMDIgOC41MjAzNiAxMC4wMzIyIDkuMTE0NiA5Ljk5NDYzQzkuNzA4ODQgOS45NjE3OSAxMC4yNjU3IDkuODM1MDkgMTAuNzg5NyA5LjYxNDU2QzExLjMxMzggOS4zOTQwMiAxMS43ODE3IDkuMDg5MDIgMTIuMTg4NyA4LjY5OTU2QzEyLjU5NTggOC4zMTAwOSAxMi45IDcuODY0MzMgMTMuMTA1OCA3LjM1NzU2QzEzLjI3NDMgNi45MTY0OCAxMy4zNjc5IDYuMzUzNCAxMy4zODY2IDUuNjU4OTRDMTMuNDA1MyA0Ljk2OTE3IDEzLjI3NDMgNC4yOTgxNyAxMy4wMDc2IDMuNjYwMDJDMTIuNzM2MiAzLjAxNzE3IDEyLjMwNTcgMi40NjgxNyAxMS43MTE1IDIuMDEzMDJDMTEuMTE3MiAxLjU1Nzg3IDEwLjMxMjQgMS4zMjc5NCA5LjI5NzA5IDEuMzI3OTRDOC41MTU2OSAxLjMyNzk0IDcuODg0MDEgMS40NjQwMiA3LjM5MjcxIDEuNzM2MTdDNi45MDE0MSAyLjAwODMzIDYuNTAzNjkgMi4zNDYxNyA2LjE5OTU1IDIuNzU0NEM1Ljg5NTQxIDMuMTYyNjMgNS42ODQ4NSAzLjU5OTAyIDUuNTYzMiA0LjA3NzYzQzUuNDQ2MjIgNC41NTE1NiA1LjM4NTM5IDQuOTczODcgNS4zODUzOSA1LjM0OTI1VjMxLjgzMjZDNS4zODUzOSAzMi4yMDMzIDUuNDM2ODYgMzIuNjMwMyA1LjUzOTggMzMuMTA0MkM1LjY0Mjc0IDMzLjU3ODIgNS44MjA1NSAzNC4wMTkyIDYuMDczMjIgMzQuNDI3NUM2LjMyNTg4IDM0LjgzNTcgNi42Njc0NiAzNS4xODI5IDcuMDg4NTcgMzUuNDY5MkM3LjUxNDM3IDM1Ljc1NTQgOC4wNjE4MiAzNS45MDA5IDguNzQwMjggMzUuOTAwOUM5LjM4NTk5IDM1LjkwMDkgOS45MTk0IDM1Ljc2NDggMTAuMzQwNSAzNS40OTI2QzEwLjc2MTYgMzUuMjIwNSAxMS4wOTM4IDM0Ljg4MjYgMTEuMzMyNSAzNC40NzQ0QzExLjU3MTEgMzQuMDY2MiAxMS43MzAyIDMzLjYyOTggMTEuODE0NCAzMy4xNTEyQzExLjg5ODYgMzIuNjc3MiAxMS45NDA4IDMyLjIzNjIgMTEuOTQwOCAzMS44Mjc5VjIzLjY0NDZDMTEuOTA4IDIyLjQ1NzQgMTEuODM3OCAyMS40NjczIDExLjczOTYgMjAuNjY5NkMxMS42MzY2IDE5Ljg3MTkgMTEuNTE5NiAxOS4yMzg1IDExLjM4MzkgMTguNzY0NkMxMS4yNDgzIDE4LjE4NzQgMTEuMDYxMSAxNy43NDYzIDEwLjgyMjUgMTcuNDQxM0gxNy4zMzFWMzYuNzEyNkwxNy4zMzU3IDM2LjcwMzJaIiBmaWxsPSIjQ0U5NDAwIi8+CjxwYXRoIGQ9Ik0yOC4wMDg4IDMwLjQ4NTlDMjguMDA4OCAzMS42Nzc4IDI4LjA2MDIgMzIuNjY3OSAyOC4xNjMyIDMzLjQ3MDJDMjguMjY2MSAzNC4yNjc5IDI4LjQwMTggMzQuOTA2MSAyOC41NzAzIDM1LjM4QzI4LjcwNiAzNS45NTcyIDI4Ljg5MzEgMzYuMzk4MiAyOS4xMzE3IDM2LjcwMzJIMjEuNTA0OUMyMS43MDYxIDM2LjM5ODIgMjEuODkzMiAzNS45NTcyIDIyLjA2MTcgMzUuMzhDMjIuMTk3NCAzNC45MDYxIDIyLjMyMzcgMzQuMjY3OSAyMi40NDU0IDMzLjQ3MDJDMjIuNTYyNCAzMi42NzI1IDIyLjYyMzIgMzEuNjc3OCAyMi42MjMyIDMwLjQ4NTlWNi43Mjg3OEMyMi42MjMyIDUuNTQxNjMgMjIuNTYyNCA0LjU0Njg2IDIyLjQ0NTQgMy43NDQ0N0MyMi4zMjg0IDIuOTQ2NzggMjIuMTk3NCAyLjMwODYzIDIyLjA2MTcgMS44MzQ3QzIxLjg5MzIgMS4yNTc1NSAyMS43MDYxIDAuODE2NDc0IDIxLjUwNDkgMC41MTE0NzVIMjkuMTMxN0MyOC44OTMxIDAuODE2NDc0IDI4LjcwNiAxLjI1NzU1IDI4LjU3MDMgMS44MzQ3QzI4LjQwMTggMi4zMTMzMiAyOC4yNjYxIDIuOTQ2NzggMjguMTYzMiAzLjc0NDQ3QzI4LjA2MDIgNC41NDIxNyAyOC4wMDg4IDUuNTM2OTMgMjguMDA4OCA2LjcyODc4VjMwLjQ4NTlaIiBmaWxsPSIjQ0U5NDAwIi8+CjxwYXRoIGQ9Ik01Mi40NDc2IDAuNTExNDA2QzUyLjI3OTEgMC43ODM1NiA1Mi4xMjQ3IDEuMDg4NTYgNTEuOTg5IDEuNDMxMUM1MS44NTMzIDEuNzAzMjUgNTEuNzQxIDIuMDI3MDIgNTEuNjU2OCAyLjM5NzcxQzUxLjU3MjYgMi43NzMxIDUxLjUzMDUgMy4xODEzMyA1MS41MzA1IDMuNjIyNDFWMzYuNzA3OUg0OS45MDIyTDM1Ljg2OTcgNi44MzY2M1YzMy42MDE1QzM1Ljg2OTcgMzQuMDQyNiAzNS45MTE4IDM0LjQ1MDkgMzUuOTk2IDM0LjgyNjJDMzYuMDgwMiAzNS4yMDE2IDM2LjE3MzggMzUuNTI1NCAzNi4yNzY3IDM1Ljc5MjlDMzYuNDEyNCAzNi4xMzA3IDM2LjU2MjIgMzYuNDQwNCAzNi43MzUzIDM2LjcxMjVIMzMuMzI4OUMzMy40OTc0IDM2LjQ0MDQgMzMuNjUxOCAzNi4xMzU0IDMzLjc4NzUgMzUuNzkyOUMzMy44OTA0IDM1LjUyMDcgMzMuOTg4NyAzNS4xODc1IDM0LjA5MTYgMzQuNzk4MUMzNC4xOTQ2IDM0LjQwODYgMzQuMjQ2IDMzLjk3NjkgMzQuMjQ2IDMzLjQ5ODNWNi4xMTg3MUMzNC4yMTMzIDUuMDMwMSAzNC4xMzM3IDQuMTM4NTYgMzQuMDE2NyAzLjQ0NDFDMzMuODk5OCAyLjc0OTY0IDMzLjc2ODggMi4xNzcxNyAzMy42MzMxIDEuNzM2MUMzMy40OTc0IDEuMjI0NjQgMzMuMzI4OSAwLjgzNTE3NSAzMy4xMjMgMC41NjMwMjJIMzguNzE0NUw0OS44OTc1IDI0LjExMzdWMy43MjA5NEM0OS44OTc1IDMuMjQ3MDIgNDkuODQ2IDIuODEwNjQgNDkuNzQzMSAyLjQyMTE3QzQ5LjY0MDEgMi4wMzE3MSA0OS41NDE5IDEuNjk4NTYgNDkuNDM4OSAxLjQyNjQxQzQ5LjMwMzIgMS4wODg1NiA0OS4xNjc1IDAuNzc4ODY4IDQ5LjAzMTggMC41MDY3MTRINTIuNDM4Mkw1Mi40NDc2IDAuNTExNDA2WiIgZmlsbD0iI0NFOTQwMCIvPgo8cGF0aCBkPSJNNzkuNDU5NSAwLjUxMTQ3NUM3OS4yMjA5IDAuODE2NDc0IDc5LjAzMzcgMS4yNTc1NSA3OC44OTggMS44MzQ3Qzc4LjcyOTYgMi4zMTMzMiA3OC41OTM5IDIuOTQ2NzggNzguNDkwOSAzLjc0NDQ3Qzc4LjM4OCA0LjU0MjE3IDc4LjMzNjUgNS41MzY5MyA3OC4zMzY1IDYuNzI4NzhWMzYuNDkyMUM3OC4zMzY1IDM3LjU0NzggNzguMTQgMzguNTM3OSA3Ny43NTE2IDM5LjQ3NjRDNzcuMzYzMyA0MC40MTAyIDc2Ljc4NzcgNDEuMjI2NiA3Ni4wMjUxIDQxLjkyMTFDNzUuMjYyNCA0Mi42MjAyIDc0LjMwMzIgNDMuMTY5MiA3My4xNTIxIDQzLjU3NzVDNzIuMDAxMSA0My45ODU3IDcwLjY2MjkgNDQuMTg3NSA2OS4xMzc1IDQ0LjE4NzVDNjcuNDEwOSA0NC4xODc1IDY2LjAxMTkgNDMuOTQ4MiA2NC45NDUxIDQzLjQ3NDJDNjMuODc4MiA0My4wMDAzIDYzLjA0NTMgNDIuNDIzMiA2Mi40NTU4IDQxLjc0MjhDNjEuODYxNSA0MS4wNjI0IDYxLjQ1NDUgNDAuMzI1NyA2MS4yMzQ2IDM5LjUyMzNDNjEuMDE0NiAzOC43MjU2IDYwLjkwMjMgMzcuOTg0MiA2MC45MDIzIDM3LjMwMzhDNjAuOTAyMyAzNi4yNTI4IDYxLjA3MDggMzUuMzQyNSA2MS40MTI0IDM0LjU3NzZDNjEuNzQ5MyAzMy44MTI4IDYyLjE4NDQgMzMuMTc0NiA2Mi43MDg1IDMyLjY2NzlDNjMuMjMyNSAzMi4xNTY0IDYzLjgwMzQgMzEuNzg1NyA2NC40MTE2IDMxLjU0NjRDNjUuMDE5OSAzMS4zMDcxIDY1LjU5NTQgMzEuMTg5OCA2Ni4xMzgyIDMxLjE4OThDNjYuNzQ2NSAzMS4xODk4IDY3LjM0MDcgMzEuMjc0MiA2Ny45MTYyIDMxLjQ0MzJDNjguNDkxOCAzMS42MTIxIDY5LjAwMTggMzEuODUxNCA2OS40NDE2IDMyLjE1NjRDNjkuODgxNSAzMi40NjE0IDcwLjIyNzcgMzIuODE4IDcwLjQ4NTEgMzMuMjI2MkM3MC43Mzc3IDMzLjYzNDUgNzAuODY4NyAzNC4wNjE1IDcwLjg2ODcgMzQuNTAyNUM2OS43NTA0IDM0LjEyNzIgNjguNjMyMSAzNC4xODgyIDY3LjUxMzggMzQuNjgwOUM2Ni4zOTU2IDM1LjE3MzUgNjUuNjMyOSAzNS45NDc4IDY1LjIyNTggMzYuOTk4OEM2NS4wMjQ2IDM3LjQzOTkgNjQuOTIxNyAzOC4wMDMgNjQuOTIxNyAzOC42ODM0QzY0LjkyMTcgMzkuMzYzOCA2NS4wNjY3IDQwLjAxNiA2NS4zNTIxIDQwLjY0NDhDNjUuNjM3NSA0MS4yNzM1IDY2LjA4MjEgNDEuODA4NSA2Ni42NzYzIDQyLjI0OTVDNjcuMjcwNSA0Mi42OTA2IDY4LjA1NjYgNDIuOTExMiA2OS4wMzkyIDQyLjkxMTJDNjkuNzgzMiA0Mi45MTEyIDcwLjQxMDIgNDIuNzQyMiA3MC45MjAyIDQyLjM5OTdDNzEuNDMwMiA0Mi4wNjE4IDcxLjgzNzMgNDEuNjE2MSA3Mi4xNDE0IDQxLjA3MThDNzIuNDQ1NiA0MC41Mjc1IDcyLjY1NjEgMzkuOTA4MSA3Mi43Nzc4IDM5LjIxMzZDNzIuODk0OCAzOC41MTkyIDcyLjk1NTYgMzcuODI5NCA3Mi45NTU2IDM3LjE0OVY2LjcyODc4QzcyLjk1NTYgNS41NDE2MyA3Mi44OTQ4IDQuNTQ2ODYgNzIuNzc3OCAzLjc0NDQ3QzcyLjY2MDggMi45NDY3OCA3Mi41Mjk4IDIuMzA4NjMgNzIuMzk4OCAxLjgzNDdDNzIuMjMwMyAxLjI1NzU1IDcyLjA0MzIgMC44MTY0NzQgNzEuODM3MyAwLjUxMTQ3NUg3OS40NjQySDc5LjQ1OTVaIiBmaWxsPSIjQ0U5NDAwIi8+CjxwYXRoIGQ9Ik0xMDIuNjg3IDEuNDc4MDJDMTAyLjU1MSAxLjc1MDE3IDEwMi40MzkgMi4wODMzMyAxMDIuMzU1IDIuNDcyNzlDMTAyLjI3IDIuODYyMjUgMTAyLjIyOCAzLjI2MTEgMTAyLjIyOCAzLjY2OTMzQzEwMi4yMjggNS4xNjYxNyAxMDIuMjE5IDYuNTE3NTYgMTAyLjIwNSA3LjcyMzQ4QzEwMi4xODYgOC45Mjk0IDEwMi4xODEgMTAuMzA0MiAxMDIuMTgxIDExLjg1MjdWMjkuNDE2QzEwMi4xODEgMzAuNTA0NiAxMDIuMDEzIDMxLjUyMjkgMTAxLjY3MSAzMi40NzU0QzEwMS4zMyAzMy40Mjc5IDEwMC44NTcgMzQuMjU4NSAxMDAuMjQ0IDM0Ljk3MTdDOTkuNjMxMyAzNS42ODQ5IDk4Ljg4MjcgMzYuMjQ4IDk4LjAwMyAzNi42NTE1Qzk3LjExODcgMzcuMDU5OCA5Ni4xMzE0IDM3LjI2MTUgOTUuMDQ1OCAzNy4yNjE1SDk0LjUzNThDOTEuNDEwMiAzNy4yNjE1IDg4Ljk2MzEgMzYuNTkwNSA4Ny4xOTQ0IDM1LjI0ODVDODUuNDI1NyAzMy45MDY1IDg0LjU0NiAzMS45MDc2IDg0LjU0NiAyOS4yNjEyVjYuNzI4NzFDODQuNTQ2IDUuNTQxNTYgODQuNDg1MiA0LjU1NjE3IDg0LjM2ODIgMy43NzI1NkM4NC4yNTEyIDIuOTg4OTQgODQuMTIwMiAyLjM2NDg3IDgzLjk4OTIgMS44ODYyNUM4My44MjA4IDEuMzA5MSA4My42MzM2IDAuODQ5MjUyIDgzLjQyNzcgMC41MTE0MDZIOTEuMDczM0M5MC44MyAwLjg0OTI1MiA5MC42NDI4IDEuMzA5MSA5MC41MDcxIDEuODg2MjVDOTAuMzM0IDIuMzYwMTcgOTAuMTk4MyAyLjk4ODk0IDkwLjA5NTQgMy43NzI1NkM4OS45OTI1IDQuNTU2MTcgODkuOTQxIDUuNTQxNTYgODkuOTQxIDYuNzI4NzFWMjkuMDU5NEM4OS45NDEgMzAuMDExOSA5MC4wMTU5IDMwLjg5NDEgOTAuMTcwMyAzMS43MTA1QzkwLjMyNDcgMzIuNTI3IDkwLjU3NzMgMzMuMjIxNSA5MC45MzI5IDMzLjc5ODZDOTEuMjg4NiAzNC4zNzU4IDkxLjc2MTEgMzQuODM1NiA5Mi4zNTU0IDM1LjE3MzVDOTIuOTQ5NiAzNS41MTEzIDkzLjY3MDIgMzUuNjg0OSA5NC41MTcxIDM1LjY4NDlIOTUuMDI3MUM5NS44NzQgMzUuNjg0OSA5Ni42MzY3IDM1LjUyNTQgOTcuMzE1MiAzNS4yMDE2Qzk3Ljk5MzYgMzQuODc3OSA5OC41Nzg1IDM0LjQyNzQgOTkuMDY5OCAzMy44NTAyQzk5LjU2MTEgMzMuMjczMSA5OS45MzU1IDMyLjYxMTUgMTAwLjE4OCAzMS44NjA3QzEwMC40NDEgMzEuMTE0NiAxMDAuNTY3IDMwLjI5ODIgMTAwLjU2NyAyOS40MTZWMy43MjA5NEMxMDAuNTY3IDMuMjQ3MDIgMTAwLjUyIDIuODEwNjQgMTAwLjQyMiAyLjQyMTE3QzEwMC4zMjQgMi4wMzE3MSAxMDAuMjMgMS42OTg1NiAxMDAuMTMyIDEuNDI2NDFDMTAwLjAwMSAxLjA4ODU2IDk5Ljg1NTkgMC43Nzg4NjggOTkuNjk2OCAwLjUwNjcxNEgxMDMuMTU5QzEwMi45OTEgMC44MTE3MTQgMTAyLjgzNiAxLjEzNTQ4IDEwMi43MDEgMS40NzMzM0wxMDIuNjg3IDEuNDc4MDJaIiBmaWxsPSIjQ0U5NDAwIi8+CjxwYXRoIGQ9Ik0xMTMuNjk2IDMwLjQ4NTlDMTEzLjY5NiAzMS42Nzc4IDExMy43NDggMzIuNjY3OSAxMTMuODUxIDMzLjQ3MDJDMTEzLjk1NCAzNC4yNjc5IDExNC4wODkgMzQuOTA2MSAxMTQuMjU4IDM1LjM4QzExNC4zOTMgMzUuOTU3MiAxMTQuNTgxIDM2LjM5ODIgMTE0LjgxOSAzNi43MDMySDEwNy4xOTJDMTA3LjM5NCAzNi4zOTgyIDEwNy41ODEgMzUuOTU3MiAxMDcuNzQ5IDM1LjM4QzEwNy44ODUgMzQuOTA2MSAxMDguMDExIDM0LjI2NzkgMTA4LjEzMyAzMy40NzAyQzEwOC4yNSAzMi42NzI1IDEwOC4zMTEgMzEuNjc3OCAxMDguMzExIDMwLjQ4NTlWNi43Mjg3OEMxMDguMzExIDUuNTQxNjMgMTA4LjI1IDQuNTQ2ODYgMTA4LjEzMyAzLjc0NDQ3QzEwOC4wMTYgMi45NDY3OCAxMDcuODg1IDIuMzA4NjMgMTA3Ljc0OSAxLjgzNDdDMTA3LjU4MSAxLjI1NzU1IDEwNy4zOTQgMC44MTY0NzQgMTA3LjE5MiAwLjUxMTQ3NUgxMTQuODE5QzExNC41ODEgMC44MTY0NzQgMTE0LjM5MyAxLjI1NzU1IDExNC4yNTggMS44MzQ3QzExNC4wODkgMi4zMTMzMiAxMTMuOTU0IDIuOTQ2NzggMTEzLjg1MSAzLjc0NDQ3QzExMy43NDggNC41NDIxNyAxMTMuNjk2IDUuNTM2OTMgMTEzLjY5NiA2LjcyODc4VjMwLjQ4NTlaIiBmaWxsPSIjQ0U5NDAwIi8+CjxwYXRoIGQ9Ik0xMjkuNzE3IDI3LjQyNjVDMTI5Ljk4OSAyNy4xNTQzIDEzMC40MTkgMjYuOTk0OCAxMzEuMDEzIDI2Ljk0MzJDMTMxLjYwOCAyNi44OTE2IDEzMi4xOTcgMjYuOTg1NCAxMzIuNzkxIDI3LjIyNDdDMTMzLjM4NiAyNy40NjQgMTMzLjkxIDI3Ljg3NjkgMTM0LjM2OCAyOC40NzI5QzEzNC44MjcgMjkuMDY4OCAxMzUuMDU2IDI5Ljg3NTkgMTM1LjA1NiAzMC44OTQxQzEzNS4wNTYgMzEuNTA0MSAxMzQuOTUzIDMyLjE3MDQgMTM0Ljc1MiAzMi44ODM2QzEzNC41NTEgMzMuNTk2OSAxMzQuMTg2IDM0LjI3NzIgMTMzLjY1NyAzNC45MjQ4QzEzMy4xMzMgMzUuNTcyMyAxMzIuMzk0IDM2LjEwNzIgMTMxLjQ0NCAzNi41Mjk1QzEzMC40OTQgMzYuOTUxOSAxMjkuMjczIDM3LjE2NzcgMTI3Ljc4NSAzNy4xNjc3QzEyNi4yOTcgMzcuMTY3NyAxMjQuOTMxIDM2Ljk2NTkgMTIzLjc5NCAzNi41NTc3QzEyMi42NTcgMzYuMTQ5NSAxMjEuNzAyIDM1LjYwMDUgMTIwLjkyMSAzNC45MDEzQzEyMC4xMzkgMzQuMjA2OSAxMTkuNTU0IDMzLjM5MDQgMTE5LjE2NiAzMi40NTY2QzExOC43NzggMzEuNTIyOSAxMTguNTgxIDMwLjUyODEgMTE4LjU4MSAyOS40NzIzVjcuNzAwMDJDMTE4LjU4MSA2LjY0ODk0IDExOC43NzggNS42NTQxOCAxMTkuMTY2IDQuNzE1NzFDMTE5LjU1NCAzLjc4MTk1IDEyMC4xMzkgMi45NjU0OCAxMjAuOTIxIDIuMjcxMDJDMTIxLjcwMiAxLjU3NjU2IDEyMi42NTcgMS4wMjI4NyAxMjMuNzk0IDAuNjE0NjM4QzEyNC45MzEgMC4yMDY0MDggMTI2LjI1OSAwLjAwNDYzODY3IDEyNy43ODUgMC4wMDQ2Mzg2N0MxMjkuNTExIDAuMDA0NjM4NjcgMTMwLjkxIDAuMjQzOTQ2IDEzMS45NzcgMC43MTc4NjlDMTMzLjA0NCAxLjE5MTc5IDEzMy44NzIgMS43NzgzMyAxMzQuNDY2IDIuNDc3NDhDMTM1LjA2MSAzLjE3NjY0IDEzNS40NjggMy45MjI3MSAxMzUuNjg4IDQuNzIwNDFDMTM1LjkwOCA1LjUxODEgMTM2LjAyIDYuMjU5NDggMTM2LjAyIDYuOTM5ODdDMTM2LjAyIDcuOTk1NjQgMTM1Ljg1MSA4LjkwMTI1IDEzNS41MSA5LjY2NjFDMTM1LjE2OCAxMC40MzA5IDEzNC43MzggMTEuMDU5NyAxMzQuMjE0IDExLjU1MjRDMTMzLjY5IDEyLjA0NTEgMTMzLjExOSAxMi40MTExIDEzMi41MTEgMTIuNjUwNEMxMzEuOTAyIDEyLjg4OTcgMTMxLjM0MSAxMy4wMDcgMTMwLjgzNiAxMy4wMDdDMTMwLjIyNyAxMy4wMDcgMTI5LjYyNCAxMi45MjI2IDEyOS4wMjkgMTIuNzUzNkMxMjguNDM1IDEyLjU4NDcgMTI3LjkyIDEyLjM0NTQgMTI3LjQ4MSAxMi4wNDA0QzEyNy4wNDEgMTEuNzM1NCAxMjYuNjk1IDExLjM3ODggMTI2LjQzNyAxMC45NzA2QzEyNi4xODUgMTAuNTYyMyAxMjYuMDU0IDEwLjE0IDEyNi4wNTQgOS42OTQyNUMxMjcuMTcyIDEwLjA2OTYgMTI4LjI5IDEwLjAwODYgMTI5LjQwOCA5LjUxNTk0QzEzMC41MjcgOS4wMjMyNSAxMzEuMjg5IDguMjQ5MDIgMTMxLjY5NiA3LjE5Nzk0QzEzMS44OTggNi43NTY4NyAxMzIuMDAxIDYuMTkzNzkgMTMyLjAwMSA1LjUxMzQxQzEzMi4wMDEgNC44MzMwMiAxMzEuODU2IDQuMTgwNzkgMTMxLjU3IDMuNTUyMDJDMTMxLjI4IDIuOTIzMjUgMTMwLjg0IDIuMzg4MzMgMTMwLjI0NiAxLjk0NzI1QzEyOS42NTIgMS41MDYxOCAxMjguODY2IDEuMjg1NjQgMTI3Ljg4MyAxLjI4NTY0QzEyNy4xMzkgMS4yODU2NCAxMjYuNTEyIDEuNDIxNzIgMTI2LjAwMiAxLjY5Mzg3QzEyNS40OTIgMS45NjYwMiAxMjUuMDg1IDIuMzAzODcgMTI0Ljc4MSAyLjcxMjFDMTI0LjQ3NyAzLjEyMDMzIDEyNC4yNjEgMy41NjE0MSAxMjQuMTQ0IDQuMDM1MzNDMTI0LjAyNyA0LjUxMzk1IDEyMy45NjcgNC45MzYyNSAxMjMuOTY3IDUuMzExNjRWMzEuODcwMUMxMjMuOTY3IDMyLjI0NTUgMTI0LjAyNyAzMi42Njc4IDEyNC4xNDQgMzMuMTQ2NEMxMjQuMjYxIDMzLjYyMDMgMTI0LjQ3NyAzNC4wNjYxIDEyNC43ODEgMzQuNDY5NkMxMjUuMDg1IDM0Ljg3NzkgMTI1LjQ5MiAzNS4yMTU3IDEyNi4wMDIgMzUuNDg3OUMxMjYuNTEyIDM1Ljc2IDEyNy4xMzkgMzUuODk2MSAxMjcuODgzIDM1Ljg5NjFDMTI5LjEwNCAzNS44OTYxIDEzMC4wNzggMzUuNTA2NiAxMzAuODA3IDM0LjcyM0MxMzEuNTM3IDMzLjkzOTQgMTMxLjk2OCAzMy4wNTcyIDEzMi4xMDQgMzIuMDcxOUMxMzIuMjcyIDMwLjg0NzIgMTMyLjE1NSAyOS44NjE4IDEzMS43NDggMjkuMTE1N0MxMzEuMzQxIDI4LjM2OTYgMTMwLjY2MiAyNy44MDY2IDEyOS43MTMgMjcuNDM1OUwxMjkuNzE3IDI3LjQyNjVaIiBmaWxsPSIjQ0U5NDAwIi8+CjxwYXRoIGQ9Ik0xNTYuMzIzIDM2LjcwMzJIMTM5LjE0MkMxMzkuMzQzIDM2LjM5ODIgMTM5LjUzIDM1Ljk1NzIgMTM5LjcwMyAzNS4zOEMxMzkuODM5IDM0LjkwNjEgMTM5Ljk2NSAzNC4yNjc5IDE0MC4wODIgMzMuNDcwMkMxNDAuMTk5IDMyLjY3MjUgMTQwLjI2IDMxLjY3NzggMTQwLjI2IDMwLjQ4NTlWNi43Mjg3OEMxNDAuMjYgNS41NDE2MyAxNDAuMTk5IDQuNTQ2ODYgMTQwLjA4MiAzLjc0NDQ3QzEzOS45NjUgMi45NDY3OCAxMzkuODM0IDIuMzA4NjMgMTM5LjcwMyAxLjgzNDdDMTM5LjUzNSAxLjI1NzU1IDEzOS4zNDcgMC44MTY0NzQgMTM5LjE0MiAwLjUxMTQ3NUgxNTUuODEzTDE1NS4zNTUgNS41NjA0SDE1NC4xODVDMTU0LjAxNiA0Ljg4MDAxIDE1My44NDggNC4zMDI4NiAxNTMuNjc1IDMuODI4OTNDMTUzLjUwNiAzLjM1NTAxIDE1My4yNDkgMi45NjA4NiAxNTIuOTEyIDIuNjU1ODZDMTUyLjU3NSAyLjM1MDg2IDE1Mi4wNzkgMi4xMzAzMiAxNTEuNDM4IDEuOTk0MjRDMTUwLjc5MiAxLjg1ODE3IDE0OS44OTQgMS43OTI0NyAxNDguNzQzIDEuNzkyNDdIMTQ1LjY0MVYxMi44NTY5QzE0Ni42NTYgMTIuOTI3MyAxNDcuNTg3IDEyLjkyNzMgMTQ4LjQzOSAxMi44NTY5QzE0OS4yODYgMTIuNzkxMiAxNTAuMDE2IDEyLjcyMDkgMTUwLjYyNCAxMi42NTUyQzE1MS4zMzUgMTIuNTUxOSAxNTEuOTYyIDEyLjQzNDYgMTUyLjUwNSAxMi4yOTg1QzE1Mi41MzggMTIuNTAwMyAxNTIuNTU2IDEyLjcyNTUgMTUyLjU1NiAxMi45NjAyQzE1Mi41NTYgMTMuMzM1NSAxNTIuNDcyIDEzLjgwOTUgMTUyLjMwNCAxNC4zODY2QzE1Mi4xMzUgMTQuODk4MSAxNTEuNzYxIDE1LjIyNjUgMTUxLjE4NSAxNS4zODE0QzE1MC42MSAxNS41MzYyIDE1MC4wMzQgMTUuNTI2OSAxNDkuNDU5IDE1LjM1NzlMMTQ1LjY0NSAxNC4yODgxVjMzLjI1OTFDMTQ1LjY0NSAzMy40MjggMTQ1LjY4OCAzMy42MzkyIDE0NS43NzIgMzMuODkyNUMxNDUuODU2IDM0LjE0NTkgMTQ2LjAxIDM0LjM5NDYgMTQ2LjIzIDM0LjYyOTJDMTQ2LjQ1IDM0Ljg2ODUgMTQ2Ljc2NCAzNS4wNjA5IDE0Ny4xNzEgMzUuMjE1OEMxNDcuNTc4IDM1LjM3MDYgMTQ4LjEwMiAzNS40NDU3IDE0OC43NDggMzUuNDQ1N0gxNTAuNTI2QzE1MS4zMDcgMzUuNDQ1NyAxNTEuOTI5IDM1LjMwMDIgMTUyLjQwNyAzNS4wMTRDMTUyLjg3OSAzNC43Mjc4IDE1My4yNjMgMzQuMzMzNiAxNTMuNTQ4IDMzLjg0MDlDMTUzLjgzOSAzMy4zNDgyIDE1NC4wNTggMzIuODAzOSAxNTQuMjA4IDMyLjIwOEMxNTQuMzYzIDMxLjYxMjEgMTU0LjUyMiAzMS4wMTE1IDE1NC42OSAzMC4zOTY4SDE1NS44NkwxNTYuMzE4IDM2LjcxNzNMMTU2LjMyMyAzNi43MDMyWiIgZmlsbD0iI0NFOTQwMCIvPgo8cGF0aCBkPSJNNjEuMDY2IDIyLjAzNTFDNTkuODQwMSAyMi4wMzUxIDU4LjgyOTQgMjEuNjM2MyA1OC4wMzQgMjAuODM4NkM1Ny4yMzg1IDIwLjA0MDkgNTYuODQwOCAxOC44OTYgNTYuODQwOCAxNy4zOTQ0QzU2Ljg0MDggMTYuNDYwNyA1Ni45NjcyIDE1LjYyMDcgNTcuMjE5OCAxNC44ODRDNTcuNDcyNSAxNC4xNDI3IDU3Ljc4MTMgMTMuNDc2MyA1OC4xNDYzIDEyLjg4NTFDNTguNTExMiAxMi4yOTM5IDU4Ljg2NjkgMTEuNzYzNyA1OS4yMDg0IDExLjI5NDRDNTguNzEyNCAxMC4yNjIxIDU4LjM0MjggOS4yNDg1OCA1OC4wOTQ4IDguMjUzODFDNTcuODQ2OCA3LjI1OTA0IDU3LjcyNTIgNi4yMDc5NiA1Ny43MjUyIDUuMTA5OTZDNTcuNzI1MiAzLjgwMDgxIDU4LjA0MzMgMi43MTIyIDU4LjY3OTcgMS44Mzk0M0M1OS4zMTYgMC45NjY2NTggNjAuMjU2NSAwLjUzMDI3MyA2MS40OTE4IDAuNTMwMjczQzYyLjcyNzEgMC41MzAyNzMgNjMuNjE2MSAwLjk2MTk2NiA2NC4yMzM3IDEuODIwNjZDNjQuODUxNCAyLjY3OTM1IDY1LjE2MDIgMy43MzUxMiA2NS4xNjAyIDQuOTgzMjdDNjUuMTYwMiA2LjAyNDk2IDY0Ljg4NDEgNy4wNTcyNyA2NC4zMzIgOC4wODAxOUM2My43Nzk5IDkuMTA3ODEgNjMuMTEwOCAxMC4xNDAxIDYyLjMyIDExLjE3NzFDNjIuNzc4NSAxMi4yMTg4IDYzLjE2NjkgMTMuMDQgNjMuNDg5OCAxMy42NDUzQzYzLjgxMjYgMTQuMjUwNiA2NC4xMDc0IDE0Ljc1MjcgNjQuMzc0MSAxNS4xNTYyQzY0LjU2NTkgMTQuNjIxMyA2NC43MTU3IDE0LjA1ODIgNjQuODIzMyAxMy40NTc2QzY0LjkzMDkgMTIuODYxNyA2NS4wMDExIDEyLjQ0NCA2NS4wMjkyIDEyLjIwNDdMNjcuNDg1NyAxMi42NjQ2QzY3LjQyMDIgMTMuNDc2MyA2Ny4yNTE3IDE0LjMzOTcgNjYuOTg1IDE1LjI1NDdDNjYuNzE4MyAxNi4xNjk3IDY2LjQwOTUgMTYuOTc2OCA2Ni4wNTg2IDE3LjY3NkM2Ni4yNTA0IDE3Ljg4NzEgNjYuNDg0NCAxOC4wOTM2IDY2Ljc2MDQgMTguM0M2Ny4wMzY1IDE4LjUwNjUgNjcuMjc5OCAxOC42NTIgNjcuNDkwNCAxOC43MzY0VjIyLjAzMDRDNjcuMjIzNyAyMi4wMzA0IDY2Ljg5NjEgMjEuOTE3OCA2Ni41MDc4IDIxLjY4NzlDNjYuMTE5NCAyMS40NTggNjUuNzQ1MSAyMS4xOTA1IDY1LjM4OTUgMjAuODg1NUM2NS4wMzM5IDIwLjU4MDUgNjQuNzYyNSAyMC4zMTMgNjQuNTg0NyAyMC4wODMxQzY0LjE0NDggMjAuNjY1IDYzLjY2NzYgMjEuMTM0MiA2My4xNDM1IDIxLjQ5MDhDNjIuNjE5NSAyMS44NDc0IDYxLjkzMTYgMjIuMDI1NyA2MS4wNzU0IDIyLjAyNTdMNjEuMDY2IDIyLjAzNTFaTTYxLjIxMTEgMTkuMzQxN0M2MS41OTk0IDE5LjM0MTcgNjEuOTMxNiAxOS4yMjkxIDYyLjE5MzcgMTguOTk5MkM2Mi40NjA0IDE4Ljc2OTMgNjIuNzEzIDE4LjQ4MyA2Mi45NTE3IDE4LjE0MDVDNjIuNTcyNyAxNy41MjExIDYyLjE4NDMgMTYuODgzIDYxLjc4NjYgMTYuMjIxM0M2MS4zOTM1IDE1LjU2NDQgNjAuOTcyNCAxNC44Mjc3IDYwLjUyMzIgMTQuMDE2QzYwLjMxMjcgMTQuMzY3OSA2MC4xNDQyIDE0LjgyNzcgNjAuMDA4NSAxNS4zOTU1QzU5Ljg3MjggMTUuOTYzMyA1OS44MDczIDE2LjQ3IDU5LjgwNzMgMTYuOTIwNUM1OS44MDczIDE3LjUzMDUgNTkuOTE5NiAxOC4wODg5IDYwLjE0ODkgMTguNTg2M0M2MC4zNzgyIDE5LjA4MzcgNjAuNzI5MSAxOS4zMzcgNjEuMjA2NCAxOS4zMzdMNjEuMjExMSAxOS4zNDE3Wk02MS4xODMgOC41NDk0M0M2MS41MjQ2IDguMDE0NSA2MS44NDI3IDcuNDMyNjYgNjIuMTM3NSA2LjgwMzg5QzYyLjQzMjMgNi4xNzUxMiA2Mi41ODIgNS41ODM4OSA2Mi41ODIgNS4wMzAyQzYyLjU4MiA0LjQ3NjUgNjIuNTA3MiAzLjk4ODUgNjIuMzUyNyAzLjU4OTY2QzYyLjE5ODMgMy4xOTU1IDYxLjkxMjkgMi45OTM3MyA2MS40OTY1IDIuOTkzNzNDNjEuMDggMi45OTM3MyA2MC44MDQgMy4yMDAyIDYwLjY0MDIgMy42MDg0M0M2MC40NzY1IDQuMDE2NjYgNjAuMzk2OSA0LjUwNDY2IDYwLjM5NjkgNS4wNjc3M0M2MC4zOTY5IDUuNjU4OTYgNjAuNDcxOCA2LjI0NTUgNjAuNjE2OCA2LjgyNzM1QzYwLjc2NjYgNy40MDkxOSA2MC45NTM3IDcuOTgxNjYgNjEuMTgzIDguNTQ0NzNWOC41NDk0M1oiIGZpbGw9IiNDRTk0MDAiLz4KPHBhdGggZD0iTTY3LjQ5NTIgMjUuNDUxSDU2Ljg0NTdWMjcuNzk3Mkg2Ny40OTUyVjI1LjQ1MVoiIGZpbGw9IiNDRTk0MDAiLz4KPHBhdGggZD0iTTIyMCAzNC4yNDkxSDE2MS4xOThWMzYuNTk1M0gyMjBWMzQuMjQ5MVoiIGZpbGw9IiNDRTk0MDAiLz4KPHBhdGggZD0iTTE2Ny4yMzQgMjkuOTA0MUMxNjYuMDU1IDI5LjkwNDEgMTY1LjA3NyAyOS43MDcgMTY0LjI5NiAyOS4zMTc1QzE2My41MTQgMjguOTI4MSAxNjIuOTAxIDI4LjM2MDMgMTYyLjQ0NyAyNy42MTQyQzE2MS45OTMgMjYuODY4MSAxNjEuNjc1IDI1Ljk3NjYgMTYxLjQ4MyAyNC45MjU1QzE2MS4yOTIgMjMuODc5MSAxNjEuMTkzIDIyLjY5NjcgMTYxLjE5MyAyMS4zODI4TDE2NS40MDUgMjAuOTg0QzE2NS40MDUgMjEuNjIyMSAxNjUuNDI4IDIyLjIzNjggMTY1LjQ3NSAyMi44MjM0QzE2NS41MjEgMjMuNDE0NiAxNjUuNjA2IDIzLjk0NDggMTY1LjczMiAyNC40MTQxQzE2NS44NTggMjQuODgzMyAxNjYuMDQxIDI1LjI1ODcgMTY2LjI4OSAyNS41NDAyQzE2Ni41MzIgMjUuODE3MSAxNjYuODUgMjUuOTU3OCAxNjcuMjM0IDI1Ljk1NzhDMTY3Ljg3IDI1Ljk1NzggMTY4LjMyIDI1LjY2MjIgMTY4LjU4MiAyNS4wNzFDMTY4Ljg0OCAyNC40Nzk4IDE2OC45NzkgMjMuNzY2NSAxNjguOTc5IDIyLjkzMTNDMTY4Ljk3OSAyMi4wOTYxIDE2OC43NTkgMjEuMjI4IDE2OC4zMjQgMjAuMzIyNEMxNjcuODg5IDE5LjQyMTUgMTY3LjM2NSAxOC41NjI4IDE2Ni43NTcgMTcuNzU1N0MxNjUuNzIzIDE2LjM3NjEgMTY0LjgyIDE1LjA5NTEgMTY0LjA0OCAxMy45MTI3QzE2My4yNzEgMTIuNzMwMiAxNjIuNjcyIDExLjU3MTIgMTYyLjI0MSAxMC40MzFDMTYxLjgxMSA5LjI5MDc3IDE2MS41OTYgOC4wOTQyMyAxNjEuNTk2IDYuODQ2MDdDMTYxLjU5NiA1Ljg2NTM4IDE2MS43MjIgNC45NTk3NyAxNjEuOTc1IDQuMTI5MjNDMTYyLjIyNyAzLjI5ODY5IDE2Mi41OTIgMi41NzYwOCAxNjMuMDc0IDEuOTYxMzhDMTYzLjU1NiAxLjM0MiAxNjQuMTQxIDAuODYzMzg0IDE2NC44MjkgMC41MTYxNTRDMTY1LjUxNyAwLjE2ODkyMyAxNjYuMzAzIDAgMTY3LjE5MiAwQzE2OC4yOTEgMCAxNjkuMjE4IDAuMTg3NjkyIDE2OS45ODEgMC41NTgzODRDMTcwLjc0MyAwLjkyOTA3NyAxNzEuMzU2IDEuNDU5MzEgMTcxLjgyOSAyLjE0OTA4QzE3Mi4zMDEgMi44Mzg4NSAxNzIuNjQzIDMuNjYgMTcyLjg2MyA0LjYwNzg0QzE3My4wODMgNS41NTU2OSAxNzMuMTkgNi42MDY3NyAxNzMuMTkgNy43NjEwN0wxNjguOTc5IDguMTU5OTJDMTY4Ljk3OSA3LjY2NzIzIDE2OC45NTYgNy4xNzQ1NCAxNjguOTA5IDYuNjc3MTVDMTY4Ljg2MiA2LjE3OTc3IDE2OC43NzggNS43MjQ2MSAxNjguNjYxIDUuMzExNjlDMTY4LjU0NCA0Ljg5ODc3IDE2OC4zNzEgNC41NzAzMSAxNjguMTQ2IDQuMzE2OTJDMTY3LjkyMiA0LjA2MzU0IDE2Ny42MzIgMy45MzY4NCAxNjcuMjcxIDMuOTM2ODRDMTY2LjcxNSAzLjkzNjg0IDE2Ni4zMzEgNC4xNzE0NiAxNjYuMTIgNC42NDUzOEMxNjUuOTEgNS4xMTQ2MSAxNjUuODAyIDUuNzgwOTIgMTY1LjgwMiA2LjY0NDMxQzE2NS44MDIgNy43NjEwNyAxNjYuMTAyIDguODM1NjEgMTY2LjY5NiA5Ljg2NzkyQzE2Ny4yOSAxMC45MDQ5IDE2OC4wOSAxMi4xMTA4IDE2OS4wOTYgMTMuNDkwNEMxNzAuMjk5IDE1LjEyMzMgMTcxLjI4MSAxNi42MjQ4IDE3Mi4wNDQgMTcuOTkwM0MxNzIuODA3IDE5LjM1NTggMTczLjE4NiAyMC44NzE0IDE3My4xODYgMjIuNTI3OEMxNzMuMTg2IDIzLjU3NDEgMTczLjA3MyAyNC41NTAxIDE3Mi44NDkgMjUuNDQ2NEMxNzIuNjI0IDI2LjM0MjYgMTcyLjI2OSAyNy4xMjE1IDE3MS43ODcgMjcuNzg3OEMxNzEuMzA1IDI4LjQ0OTUgMTcwLjY4NyAyOC45NzAzIDE2OS45MzkgMjkuMzQxQzE2OS4xOSAyOS43MTE3IDE2OC4yODcgMjkuODk5NCAxNjcuMjI5IDI5Ljg5OTRMMTY3LjIzNCAyOS45MDQxWiIgZmlsbD0iI0NFOTQwMCIvPgo8cGF0aCBkPSJNMTc2LjY4MSAyOS41ODVWMC4zMTkwOTJIMTgwLjk2N1YxMi40MjUySDE4NC4zMDNWMC4zMTkwOTJIMTg4LjU5NFYyOS41ODVIMTg0LjMwM1YxNi44NDU0SDE4MC45NjdWMjkuNTg1SDE3Ni42ODFaIiBmaWxsPSIjQ0U5NDAwIi8+CjxwYXRoIGQ9Ik0xOTguNDgxIDI5LjkwNDFDMTk3LjI4NyAyOS45MDQxIDE5Ni4yNjcgMjkuNjI3MiAxOTUuNDExIDI5LjA2ODhDMTk0LjU1OSAyOC41MTA1IDE5My45MDQgMjcuNzU1IDE5My40NDYgMjYuNzk3OEMxOTIuOTg3IDI1Ljg0MDUgMTkyLjc2MyAyNC43NjYgMTkyLjc2MyAyMy41NzQxVjYuMzI5OTJDMTkyLjc2MyA1LjEyNCAxOTIuOTkyIDQuMDQ0NzcgMTkzLjQ0NiAzLjA5NjkyQzE5My45MDQgMi4xNDkwOCAxOTQuNTU5IDEuMzkzNjEgMTk1LjQxMSAwLjgzNTIzQzE5Ni4yNjcgMC4yNzY4NDYgMTk3LjI4NyAwIDE5OC40ODEgMEMxOTkuNjc0IDAgMjAwLjY5NCAwLjI3Njg0NiAyMDEuNTUgMC44MzUyM0MyMDIuNDAyIDEuMzkzNjEgMjAzLjA1NyAyLjE0OTA4IDIwMy41MTUgMy4xMDYzMUMyMDMuOTc0IDQuMDYzNTQgMjA0LjE5OCA1LjEzODA3IDIwNC4xOTggNi4zMjk5MlYyMy41Njk1QzIwNC4xOTggMjQuNzY2IDIwMy45NjkgMjUuODQwNSAyMDMuNTE1IDI2Ljc5MzFDMjAzLjA1NyAyNy43NTAzIDIwMi40MDIgMjguNTA1OCAyMDEuNTUgMjkuMDY0MUMyMDAuNjk0IDI5LjYyMjUgMTk5LjY3NCAyOS44OTk0IDE5OC40ODEgMjkuODk5NFYyOS45MDQxWk0xOTguNDgxIDI1LjcyMzJDMTk5LjAwOSAyNS43MjMyIDE5OS4zNzkgMjUuNTAyNyAxOTkuNTk0IDI1LjA1NjlDMTk5LjgwNSAyNC42MTExIDE5OS45MTIgMjQuMTE4NSAxOTkuOTEyIDIzLjU3NDFWNi4zMjk5MkMxOTkuOTEyIDUuNzg1NjEgMTk5LjggNS4yOTI5MiAxOTkuNTc1IDQuODQ3MTVDMTk5LjM1MSA0LjQwMTM4IDE5OC45ODYgNC4xODA4NCAxOTguNDg1IDQuMTgwODRDMTk3Ljk4NSA0LjE4MDg0IDE5Ny42MzQgNC40MDEzOCAxOTcuNDA0IDQuODQ3MTVDMTk3LjE3IDUuMjkyOTIgMTk3LjA1OCA1Ljc4NTYxIDE5Ny4wNTggNi4zMjk5MlYyMy41Njk1QzE5Ny4wNTggMjQuMTEzOCAxOTcuMTcgMjQuNjA2NSAxOTcuMzk1IDI1LjA1MjJDMTk3LjYyIDI1LjQ5OCAxOTcuOTg1IDI1LjcxODUgMTk4LjQ4NSAyNS43MTg1TDE5OC40ODEgMjUuNzIzMloiIGZpbGw9IiNDRTk0MDAiLz4KPHBhdGggZD0iTTIwOC4zNjcgMjkuNTg1VjAuMzE5MDkySDIxMi42NTNDMjE0LjI4MiAwLjMxOTA5MiAyMTUuNjQzIDAuNjc1NzA3IDIxNi43MzMgMS4zOTM2M0MyMTcuODI0IDIuMTExNTUgMjE4LjY0MiAzLjEyNTA5IDIxOS4xODUgNC40Mzg5NEMyMTkuNzI4IDUuNzUyNzggMjE5Ljk5OSA3LjMwMTI0IDIxOS45OTkgOS4wNzk2M0MyMTkuOTk5IDEwLjg1OCAyMTkuNzE0IDEyLjM5MjQgMjE5LjE0OCAxMy42NzgxQzIxOC41NzcgMTQuOTYzOCAyMTcuNzQ5IDE1Ljk3MjYgMjE2LjY1NCAxNi42OTUyQzIxNS41NjQgMTcuNDE3OSAyMTQuMjMgMTcuODEyIDIxMi42NTMgMTcuODc3N1YyOS41ODVIMjA4LjM2N1pNMjEyLjY1MyAxMy40OTk4QzIxMy40MDcgMTMuNDk5OCAyMTQuMDA1IDEzLjM0OTYgMjE0LjQ0MSAxMy4wNDkzQzIxNC44NzYgMTIuNzQ5IDIxNS4xODkgMTIuMjc1MSAyMTUuMzgxIDExLjYyNzZDMjE1LjU3MyAxMC45OCAyMTUuNjcxIDEwLjE0MDEgMjE1LjY3MSA5LjExNzE3QzIxNS42NzEgOC4wOTQyNCAyMTUuNTczIDcuMjQwMjQgMjE1LjM4MSA2LjU4ODAxQzIxNS4xODkgNS45MzU3OCAyMTQuODcxIDUuNDYxODYgMjE0LjQyNyA1LjE1MjE3QzIxMy45ODIgNC44NDcxNyAyMTMuMzkyIDQuNjkyMzIgMjEyLjY0OSA0LjY5MjMyVjEzLjQ5MDRMMjEyLjY1MyAxMy40OTk4WiIgZmlsbD0iI0NFOTQwMCIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzM2MV81MzUiPgo8cmVjdCB3aWR0aD0iMjIwIiBoZWlnaHQ9IjQ0LjE5MjEiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==","response_hash":"ed83a01b6f451abc60d7bd47f20df8327fc6bcc68206fb35429618e7ae50feb0","response_time_ms":0,"response_words":1754,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"images","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":21},{"name":"3","value":"gin-and-juice-shop-logo.svg","type":"path","name_start":-1,"name_end":-1,"value_start":22,"value_end":49}],"sent_at":"2026-04-05T05:31:32.889874Z","received_at":"2026-04-05T05:31:32.889869Z","created_at":"2026-04-05T05:31:32Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"a5e79059-a020-4e7b-a3c4-8ab343055419","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/footer/js/scanme.js","url":"https://ginandjuice.shop/resources/footer/js/scanme.js","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvZm9vdGVyL2pzL3NjYW5tZS5qcyBIVFRQLzEuMQ0KSG9zdDogZ2luYW5kanVpY2Uuc2hvcA0KVXNlci1BZ2VudDogTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzExNC4wLjAuMCBTYWZhcmkvNTM3LjM2DQpBY2NlcHQtTGFuZ3VhZ2U6IGVuDQpSZWZlcmVyOiBodHRwczovL2dpbmFuZGp1aWNlLnNob3AvDQoNCg==","request_hash":"e3038fdc1da9318feb645ca565e9a0dc08387a008e2eb8fac6191cfe447096ef","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["1532"],"content-type":["application/javascript; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:31:32 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/javascript; charset=utf-8","response_content_length":6307,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LWxlbmd0aDogMTUzMg0KeC1iYWNrZW5kOiBjOThkZjVjNC1hNTI3LTRkYWEtODhjZC04M2M1ZGU0ZTdjNzcNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzE6MzIgR01UDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY2FjaGUtY29udHJvbDogcHVibGljLCBtYXgtYWdlPTM2MDANCg0KCgpsZXQgbmF2VHJpZ2dlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5uYXYtdHJpZ2dlciIpOwpsZXQgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJvZHkiKTsKbGV0IG5hdlRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIm5hdiIpOwoKbGV0IHJlYWR5ID0gKGNhbGxiYWNrKSA9PiB7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gImxvYWRpbmciKSBjYWxsYmFjaygpOwogICAgZWxzZSBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgY2FsbGJhY2spOwp9CgpyZWFkeSgoKSA9PiB7CiAgICBjb25zdCBpc0hvbWVQYWdlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiW3RoZW1lPSdob21lJ10iKTsKICAgIGNvbnN0IGlzQ2FydFBhZ2U9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIlt0aGVtZT0nY2FydCddIik7CiAgICBjb25zdCBpc0Fib3V0UGFnZT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiW3RoZW1lPSdhYm91dCddIik7CiAgICBjb25zdCBpc0xvZ2luUGFnZT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiW3RoZW1lPSdsb2dpbiddIik7CgogICAgbmF2VHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICBib2R5LmNsYXNzTGlzdC50b2dnbGUoImFjdGl2ZS1uYXYiKTsKICAgICAgICBuYXZUYXJnZXQuY2xhc3NMaXN0LnRvZ2dsZSgiYWN0aXZlLW5hdiIpOwogICAgfSk7CgogICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAvLyB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlLW5hdiIpOwogICAgfSk7CgogICAgaWYoaXNIb21lUGFnZSkgewogICAgICAgIGNvbnN0IGNhcm91c2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncHJvZHVjdHNQcmV2aWV3TGlzdCcpWzBdOwoKICAgICAgICAvLyBhZGQgdGhlIGxlZnQvcmlnaHQgY29udHJvbHMKICAgICAgICBsZXQgcHJldkJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIHByZXZCdG4uY2xhc3NMaXN0LmFkZCgncHJldi1hcnJvdycpOwogICAgICAgIHByZXZCdG4ub25jbGljayA9IHByZXY7CiAgICAgICAgY2Fyb3VzZWwucHJlcGVuZChwcmV2QnRuKTsKICAgICAgICBsZXQgbmV4dEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIG5leHRCdG4uY2xhc3NMaXN0LmFkZCgnbmV4dC1hcnJvdycpOwogICAgICAgIG5leHRCdG4ub25jbGljayA9IG5leHQ7CiAgICAgICAgY2Fyb3VzZWwuYXBwZW5kKG5leHRCdG4pOwoKICAgICAgICAvLyBhZGQgYSB3cmFwcGluZyBkaXYgZm9yIHRoZSBjYXJvdXNlbAogICAgICAgIGNvbnN0IGNvbnRhaW5lckxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjb250YWluZXItbGlzdC10aWxlcycpWzBdOwogICAgICAgIGNvbnN0IGNhcm91c2VsV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGNhcm91c2VsV3JhcHBlci5jbGFzc0xpc3QuYWRkKCdjb250YWluZXItbGlzdC13cmFwcGVyJyk7CiAgICAgICAgY29udGFpbmVyTGlzdC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShjYXJvdXNlbFdyYXBwZXIsIGNvbnRhaW5lckxpc3QpOwogICAgICAgIGNhcm91c2VsV3JhcHBlci5hcHBlbmQoY29udGFpbmVyTGlzdCk7CgogICAgICAgIC8vIGFkZCBzb21lIHN0dWZmIGZvciB0aGUgdGl0bGUgYmFubmVyCiAgICAgICAgY29uc3QgdGl0bGVCYW5uZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0aXRsZUJhbm5lcicpWzBdOwogICAgICAgIGNvbnN0IGdsb3dEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBnbG93RGl2LmNsYXNzTGlzdC5hZGQoJ2dsb3cnKTsKICAgICAgICB0aXRsZUJhbm5lci5hcHBlbmQoZ2xvd0Rpdik7CiAgICAgICAgY29uc3QgYm90dGxlT25lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgYm90dGxlT25lLmNsYXNzTGlzdC5hZGQoJ2JvdHRsZU9uZScpOwogICAgICAgIGJvdHRsZU9uZS5zcmMgPSAnL3Jlc291cmNlcy9pbWFnZXMvaGV5ZXNfYm90dGxlLnBuZyc7CiAgICAgICAgY29uc3QgYm90dGxlVHdvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgYm90dGxlVHdvLmNsYXNzTGlzdC5hZGQoJ2JvdHRsZVR3bycpOwogICAgICAgIGJvdHRsZVR3by5zcmMgPSAnL3Jlc291cmNlcy9pbWFnZXMva2V0dGxlX2JvdHRsZS5wbmcnOwogICAgICAgIGNvbnN0IGJvdHRsZVRocmVlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgYm90dGxlVGhyZWUuY2xhc3NMaXN0LmFkZCgnYm90dGxlVGhyZWUnKTsKICAgICAgICBib3R0bGVUaHJlZS5zcmMgPSAnL3Jlc291cmNlcy9pbWFnZXMvZ19qX2JvdHRsZS5wbmcnOwogICAgICAgIGdsb3dEaXYuYXBwZW5kKGJvdHRsZU9uZSwgYm90dGxlVGhyZWUsIGJvdHRsZVR3byk7CgogICAgICAgIC8vIG1vdmUgaXQgYWxsIGludG8gdGhlIG1haW4gY29udGFpbmVyCiAgICAgICAgY29uc3QgbWFpbmNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ21haW5jb250YWluZXInKVswXTsKICAgICAgICBtYWluY29udGFpbmVyLnByZXBlbmQodGl0bGVCYW5uZXIpOwoKICAgIH0KCiAgICBpZihpc0NhcnRQYWdlKSB7CgogICAgICAgIC8vIGFkZCBhIGJvZHkgY2xhc3MgZm9yIHRoZSBjYXJ0IGFzIHdlIG5lZWQgdG8gc3R5bGUgaXQgaGlnaGVyIHRoYW4gdGhlIHRoZW1lIHNlbGVjdG9yCiAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJvZHkiKTsKICAgICAgICBib2R5LmNsYXNzTGlzdC5hZGQoJ2lzLWNhcnQnKTsKCiAgICAgICAgLy8gc29ydCBvdXQgdGhlIHAgaGVhZGluZwogICAgICAgIGNvbnN0IGhlYWRpbmdQYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJbdGhlbWU9J2NhcnQnXSBoZWFkZXIrcCIpLnBhcmVudE5vZGU7CiAgICAgICAgY29uc3Qgb2xkSGVhZGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIlt0aGVtZT0nY2FydCddIGhlYWRlcitwIik7CiAgICAgICAgbGV0IG5ld0hlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJoMSIpOwogICAgICAgIGxldCBuZXdIZWFkaW5nVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJTaG9wcGluZyBjYXJ0Iik7CiAgICAgICAgbmV3SGVhZGluZy5hcHBlbmRDaGlsZChuZXdIZWFkaW5nVGV4dCk7CiAgICAgICAgaGVhZGluZ1BhcmVudC5pbnNlcnRCZWZvcmUobmV3SGVhZGluZywgb2xkSGVhZGluZyk7CiAgICAgICAgb2xkSGVhZGluZy5yZW1vdmUoKTsKCiAgICAgICAgLy8gY3JlYXRlIGEgYmV0dGVyIGxheW91dCBhbmQgc2VwZXJhdGUgdGhlIGNvdXBvbiBwYXJ0cwoKICAgIH0KCiAgICBpZihpc0Fib3V0UGFnZSkgewogICAgICAgIC8vVE9ETzogSW1wbGVtZW50YXRpb24gaGVyZS4KICAgICAgICBjb25zdCB0aXRsZUJhbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RpdGxlQmFubmVyJylbMF07CiAgICAgICAgY29uc3QgZ2xvd0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGdsb3dEaXYuY2xhc3NMaXN0LmFkZCgnZ2xvdycpOwogICAgICAgIHRpdGxlQmFubmVyLmFwcGVuZChnbG93RGl2KTsKICAgICAgICBjb25zdCBib3R0bGVPbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAgICAgICBib3R0bGVPbmUuY2xhc3NMaXN0LmFkZCgnYm90dGxlT25lJyk7CiAgICAgICAgYm90dGxlT25lLnNyYyA9ICcvcmVzb3VyY2VzL2ltYWdlcy9iYXRjaDEzMzdfY2FuLnBuZyc7CiAgICAgICAgY29uc3QgYm90dGxlVHdvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgYm90dGxlVHdvLmNsYXNzTGlzdC5hZGQoJ2JvdHRsZVR3bycpOwogICAgICAgIGJvdHRsZVR3by5zcmMgPSAnL3Jlc291cmNlcy9pbWFnZXMvZHJ5X1NRTElfY2FuLnBuZyc7CiAgICAgICAgY29uc3QgYm90dGxlVGhyZWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAgICAgICBib3R0bGVUaHJlZS5jbGFzc0xpc3QuYWRkKCdib3R0bGVUaHJlZScpOwogICAgICAgIGJvdHRsZVRocmVlLnNyYyA9ICcvcmVzb3VyY2VzL2ltYWdlcy9waW5lYXBwbGUtY2FuLnBuZyc7CiAgICAgICAgZ2xvd0Rpdi5hcHBlbmQoYm90dGxlT25lLCBib3R0bGVUaHJlZSwgYm90dGxlVHdvKTsKCiAgICAgICAgLy8gbW92ZSBpdCBhbGwgaW50byB0aGUgbWFpbiBjb250YWluZXIKICAgICAgICBjb25zdCBtYWluY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbWFpbmNvbnRhaW5lcicpWzBdOwogICAgICAgIG1haW5jb250YWluZXIucHJlcGVuZCh0aXRsZUJhbm5lcik7CiAgICB9CgogICAgaWYoaXNMb2dpblBhZ2UpIHsKICAgICAgICBib2R5LmNsYXNzTGlzdC5hZGQoJ2lzLWxvZ2luJykKICAgIH0KCiAgICBsZXQgY3VycmVudEluZGV4ID0gMDsKICAgIGxldCBzbGlkZXMgPSBbXTsKCiAgICBmdW5jdGlvbiByZW5kZXIoKSB7CiAgICAgICAgY29uc3Qgc2VjdGlvbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5oYXMtY2Fyb3VzZWwiKTsKICAgICAgICBsZXQgb2Zmc2V0ID0gMDsKICAgICAgICBzbGlkZXMuZm9yRWFjaCgoc2xpZGUsIGluZGV4KSA9PiB7CiAgICAgICAgICAgIGlmIChpbmRleCA8IGN1cnJlbnRJbmRleCkgewogICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNsaWRlLm9mZnNldFdpZHRoOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHNlY3Rpb25Db250YWluZXIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoLSR7b2Zmc2V0fXB4KWA7CiAgICB9CgogICAgZnVuY3Rpb24gcHJldigpIHsKICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgMCkgcmV0dXJuOwogICAgICAgIGN1cnJlbnRJbmRleCAtPSAxOwogICAgICAgIHJlbmRlcigpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PT0gc2xpZGVzLmxlbmd0aCAtIDEpIGN1cnJlbnRJbmRleCA9IC0xOwogICAgICAgIGN1cnJlbnRJbmRleCArPSAxOwogICAgICAgIHJlbmRlcigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdvdG8obmV3SW5kZXgpIHsKICAgICAgICBpZiAobmV3SW5kZXggPCAwIHx8IG5ld0luZGV4ID4gc2xpZGVzLmxlbmd0aCAtIDEpIHJldHVybjsKICAgICAgICBjdXJyZW50SW5kZXggPSBuZXdJbmRleDsKICAgICAgICByZW5kZXIoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbml0KCkgewoKICAgICAgICBjb25zdCBuZXdTbGlkZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaGFzLWNhcm91c2VsID4gYSIpOwogICAgICAgIHNsaWRlcyA9IG5ld1NsaWRlczsKCiAgICAgICAgcmVuZGVyKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVzdHJveSgpIHsKICAgICAgICBjb25zdCBzZWN0aW9uQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmNvbnRhaW5lci1saXN0LXRpbGVzIik7CiAgICAgICAgc2VjdGlvbkNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gPSBudWxsOwoKICAgIH0KCiAgICBjb25zdCBzbGlkZXJXcmFwcGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnByb2R1Y3RzUHJldmlld0xpc3QgLmNvbnRhaW5lci1saXN0LXRpbGVzJyk7CgogICAgaWYgKHNsaWRlcldyYXBwZXIpCiAgICB7CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7CiAgICAgICAgICAgIGVudHJpZXMuZm9yRWFjaChlbnRyeSA9PiB7CiAgICAgICAgICAgICAgICBpZihlbnRyeS5jb250ZW50UmVjdC53aWR0aCA8IDYyNSAmJiBlbnRyeS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb250YWluZXItbGlzdC10aWxlcycpKSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ2hhcy1jYXJvdXNlbCcpOwogICAgICAgICAgICAgICAgICAgIGluaXQoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50cnkudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy1jYXJvdXNlbCcpOwogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIG9ic2VydmVyLm9ic2VydmUoc2xpZGVyV3JhcHBlcik7CiAgICB9Cn0pOw==","response_hash":"7f58ec1c84dfb754b7a2e775cede774c905d8eda847ec3739077fb82b68e549a","response_time_ms":0,"response_words":460,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"footer","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":21},{"name":"3","value":"js","type":"path","name_start":-1,"name_end":-1,"value_start":22,"value_end":24},{"name":"4","value":"scanme.js","type":"path","name_start":-1,"name_end":-1,"value_start":25,"value_end":34}],"sent_at":"2026-04-05T05:31:32.939509Z","received_at":"2026-04-05T05:31:32.939503Z","created_at":"2026-04-05T05:31:32Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"797a11c7-0cb8-4e84-839c-bb1a17436518","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/","url":"https://ginandjuice.shop/","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Upgrade-Insecure-Requests":["1"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC8gSFRUUC8xLjENCkhvc3Q6IGdpbmFuZGp1aWNlLnNob3ANCkFjY2VwdC1MYW5ndWFnZTogZW4NClVwZ3JhZGUtSW5zZWN1cmUtUmVxdWVzdHM6IDENClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTQuMC4wLjAgU2FmYXJpLzUzNy4zNg0KDQo=","request_hash":"9a185c660bfb9ee22e99760fe6542ee8bf9035116c1acd02ae9cf45cbe673137","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"content-encoding":["gzip"],"content-length":["2157"],"content-type":["text/html; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:31:31 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/html; charset=utf-8","response_content_length":10487,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpkYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMxOjMxIEdNVA0KeC1iYWNrZW5kOiBjOThkZjVjNC1hNTI3LTRkYWEtODhjZC04M2M1ZGU0ZTdjNzcNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY29udGVudC1lbmNvZGluZzogZ3ppcA0KY29udGVudC1sZW5ndGg6IDIxNTcNCmNvbnRlbnQtdHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04DQoNCjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KPCEtLUxBQl9IRUFEX1NUQVJULS0+CiAgICA8aGVhZD4KICAgICAgICA8bGluayBocmVmPS9yZXNvdXJjZXMvbGFiaGVhZGVyL2Nzcy9zY2FuTWVIZWFkZXIuY3NzIHJlbD1zdHlsZXNoZWV0PgogICAgICAgIDxsaW5rIGhyZWY9L3Jlc291cmNlcy9jc3MvbGFic1NjYW5tZS5jc3MgcmVsPXN0eWxlc2hlZXQ+CiAgICAgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyI+CiAgICAgICAgPHNjcmlwdCBzcmM9Ii9yZXNvdXJjZXMvanMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiPjwvc2NyaXB0PgogICAgICAgIDxzY3JpcHQgc3JjPSIvcmVzb3VyY2VzL2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyI+PC9zY3JpcHQ+CiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3Jlc291cmNlcy9qcy9hbmd1bGFyXzEtNy03LmpzIj48L3NjcmlwdD4KICAgICAgICA8dGl0bGU+SG9tZSAtIEdpbiAmYW1wOyBKdWljZSBTaG9wPC90aXRsZT4KICAgIDwvaGVhZD4KPCEtLUxBQl9IRUFEX0VORC0tPgogICAgPGJvZHkgbmctYXBwPgogICAgICAgIDxkaXYgaWQ9InNjYW5NZUhlYWRlciI+CiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJoZWFkZXItZGVzY3JpcHRpb24iPgogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIGRlbGliZXJhdGVseSB2dWxuZXJhYmxlIHdlYiBhcHBsaWNhdGlvbiBkZXNpZ25lZCBmb3IgdGVzdGluZyB3ZWImbmJzcDt2dWxuZXJhYmlsaXR5Jm5ic3A7c2Nhbm5lcnMuCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpbmsiIG9ubW91c2VlbnRlcj0id2luZG93Ll9feDEgPSAxIiBvbm1vdXNlb3Zlcj0id2luZG93Ll9feDIgPSAxIiBvbm1vdXNlbW92ZT0id2luZG93Ll9feDMgPSAxIiAgb25tb3VzZWRvd249IndpbmRvdy5fX3g0ID0gMSIgb25tb3VzZXVwPSJpZiAod2luZG93Ll9feDEgJiYgd2luZG93Ll9feDIgJiYgd2luZG93Ll9feDMgJiYgd2luZG93Ll9feDQpIGxvY2F0aW9uID0gYXRvYignTDNaMWJHNWxjbUZpYVd4cGRHbGxjdz09JykiIG9ubW91c2VsZWF2ZT0iZGVsZXRlIHdpbmRvdy5fX3gxOyBkZWxldGUgd2luZG93Ll9feDI7IGRlbGV0ZSB3aW5kb3cuX194MzsgZGVsZXRlIHdpbmRvdy5fX3g0Ij5QdXQgeW91ciBzY2FubmVyIHRvIHRoZSB0ZXN0ITwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0nc2Nhbk1lQmFubmVyJz4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Y29udGFpbmVyPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Jy8nPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXNjYW5tZS1sb2dvPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXRpdGxlLWNvbnRhaW5lcj4KICAgICAgICAgICAgICAgICAgICAgICAgPG5hdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3MgcHJpbWFyeS1saW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvY2F0YWxvZyI+UHJvZHVjdHM8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9ibG9nIj5CbG9nPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIiBocmVmPSIvYWJvdXQiPk91ciBzdG9yeTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibmF2aWdhdGlvbi1oZWFkZXItbGlua3Mgc2Vjb25kYXJ5LWxpbmtzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJhY2NvdW50LWljb24iIGhyZWY9Ii9teS1hY2NvdW50Ij48c3ZnPjx1c2UgaHJlZj0iL3Jlc291cmNlcy9pbWFnZXMvaWNvbi1hY2NvdW50LnN2ZyNhY2NvdW50LWljb24iPjwvdXNlPjwvc3ZnPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9teS1hY2NvdW50Ij5Mb2cgaW48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9teS1hY2NvdW50Ij5NeSBhY2NvdW50PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImNhcnQtaWNvbiIgaHJlZj0iL2NhdGFsb2cvY2FydCI+PHNwYW4+MDwvc3Bhbj48c3ZnPjx1c2UgaHJlZj0iL3Jlc291cmNlcy9pbWFnZXMvaWNvbi1jYXJ0LnN2ZyNjYXJ0LWljb24iPjwvdXNlPjwvc3ZnPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXRvZ2dsZSI+PGEgY2xhc3M9Im5hdi10cmlnZ2VyIj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L2E+PC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmF2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHRoZW1lPSJob21lIj4KICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9Im1haW5jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICA8aGVhZGVyIGNsYXNzPSJub3RpZmljYXRpb24taGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8L2hlYWRlcj4KICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0idGl0bGVCYW5uZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0idmlld1Byb2R1Y3RzQnV0dG9uIiBocmVmPSIvY2F0YWxvZyI+VmlldyBhbGwgcHJvZHVjdHM8L2E+CiAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uIGlkPSJwcm9kdWN0c1ByZXZpZXciPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0c0Rlc2NyaXB0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkNyZWF0ZWQgaW4gMjAyMiBieSB0aGUgbWFuIERpc3RpbGxlcidzIFdvcmxkIGhhcyBjYWxsZWQgInRoZSBldmlsIGdlbml1cyBvZiBnaW4iLCBHaW4gJiBKdWljZSBTaG9wIGlzIG9wZW4gMjQvNyB0byBzYXRpc2Z5IGFsbCBvZiB5b3VyIDxzcGFuIGNsYXNzPSJsaW5rIiBvbm1vdXNlZW50ZXI9IndpbmRvdy5fX3gxID0gMSIgb25tb3VzZW92ZXI9IndpbmRvdy5fX3gyID0gMSIgb25tb3VzZW1vdmU9IndpbmRvdy5fX3gzID0gMSIgIG9ubW91c2Vkb3duPSJ3aW5kb3cuX194NCA9IDEiIG9ubW91c2V1cD0iaWYgKHdpbmRvdy5fX3gxICYmIHdpbmRvdy5fX3gyICYmIHdpbmRvdy5fX3gzICYmIHdpbmRvdy5fX3g0KSBsb2NhdGlvbiA9IGF0b2IoJ0wzWjFiRzVsY21GaWFXeHBkR2xsY3c9PScpIiBvbm1vdXNlbGVhdmU9ImRlbGV0ZSB3aW5kb3cuX194MTsgZGVsZXRlIHdpbmRvdy5fX3gyOyBkZWxldGUgd2luZG93Ll9feDM7IGRlbGV0ZSB3aW5kb3cuX194NCI+d2ViJm5ic3A7dnVsbmVyYWJpbGl0eSZuYnNwO3NjYW5uZXImbmJzcDtldmFsdWF0aW9uPC9zcGFuPiBuZWVkcy48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0c1ByZXZpZXdMaXN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJjb250YWluZXItbGlzdC10aWxlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2NhdGFsb2cvcHJvZHVjdD9wcm9kdWN0SWQ9MSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2Uvc2Nhbm1lL3Byb2R1Y3RjYXRhbG9nL3Byb2R1Y3RzL3BpbmVhcHBsZV9lZGl0aW9uLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5QaW5lYXBwbGUgRWRpdGlvbiBDb2NrdGFpbDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltYWdlcy9yYXRpbmczLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZSI+JDMwLjUwPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uIj5WaWV3IGRldGFpbHM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9jYXRhbG9nL3Byb2R1Y3Q/cHJvZHVjdElkPTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9wcm9kdWN0Y2F0YWxvZy9wcm9kdWN0cy8xMS5wbmciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+Q3JlYXRlIFlvdXIgT3duIENvY2t0YWlsPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1hZ2VzL3JhdGluZzUucG5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByaWNlIj4kODQuOTY8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24iPlZpZXcgZGV0YWlsczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2NhdGFsb2cvcHJvZHVjdD9wcm9kdWN0SWQ9MyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvaW1hZ2Uvc2Nhbm1lL3Byb2R1Y3RjYXRhbG9nL3Byb2R1Y3RzLzEwLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5GcnVpdCBPdmVybGF5czwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltYWdlcy9yYXRpbmczLnBuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJwcmljZSI+JDkyLjc5PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uIj5WaWV3IGRldGFpbHM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iL2NhdGFsb2ciPlZpZXcgYWxsIHByb2R1Y3RzPC9hPgogICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbiBpZD0iYmxvZ1ByZXZpZXciPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJibG9nUG9zdExpc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmxvZy1wb3N0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9ibG9nL3Bvc3Q/cG9zdElkPTMiPjxpbWcgc3JjPSIvaW1hZ2Uvc2Nhbm1lL2Jsb2cvcG9zdHMvNS5qcGciPjwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj5BIEhhaXJ5IERheTwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIGlzLXNtYWxsIiBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD0zIj5WaWV3IHBvc3Q8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJsb2ctcG9zdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD00Ij48aW1nIHNyYz0iL2ltYWdlL3NjYW5tZS9ibG9nL3Bvc3RzLzMuanBnIj48L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+VGhlIENvbXBsYWludDwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIGlzLXNtYWxsIiBocmVmPSIvYmxvZy9wb3N0P3Bvc3RJZD00Ij5WaWV3IHBvc3Q8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ii9ibG9nIj5WaWV3IGFsbCBibG9nIHBvc3RzPC9hPgogICAgICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3NlY3Rpb24+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci13cmFwcGVyIj4KICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJmb290ZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlci1sZWZ0Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgyPk5ldmVyIG1pc3MgYSBkZWFsIC0gc3Vic2NyaWJlIG5vdzwvaDI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPkpvaW4gb3VyIHdvcmxkd2lkZSBjb21tdW5pdHkgb2YgZ2luIGFuZCBqdWljZSBmYW5hdGljcywgZm9yIGV4Y2x1c2l2ZSBuZXdzIG9uIG91ciBsYXRlc3QgZGVhbHMsIG5ldyByZWxlYXNlcywgY29sbGFib3JhdGlvbnMsIGFuZCBtb3JlLjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmlwdCBzcmM9Jy9yZXNvdXJjZXMvanMvc3Vic2NyaWJlTm93LmpzJz48L3NjcmlwdD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ic3Vic2NyaWJlIiBjbGFzcz0iZm9ybSIgZGF0YS1tZXRob2Q9InBvc3QiIGRhdGEtYWN0aW9uPSIvY2F0YWxvZy9zdWJzY3JpYmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIHR5cGU9ZW1haWwgbmFtZT1lbWFpbCBwbGFjZWhvbGRlcj0iRW1haWwgYWRkcmVzcyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgcmVxdWlyZWQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjc3JmIiB2YWx1ZT0iRmt0b1Y2bmMxeEVybjNOak1HMnNzNzdCNVZyUXNnSjciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnV0dG9uIiB0eXBlPXN1Ym1pdD5TdWJzY3JpYmU8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaWFsb2cgaWQ9ImNvdXBvbi1kaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY291cG9uLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNsb3NlLWJ1dHRvbiIgb25jbGljaz0iY2xvc2VDb3Vwb25EaWFsb2coZXZlbnQpIj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Vwb24taW5mbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMT4yMCUgb2ZmIGV2ZXJ5dGhpbmc8L2gxPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Vwb24taW5wdXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGlkPSJjb3B5YWJsZS1jb3Vwb24iPkNvdXBvbiBub3QgZm91bmQ8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iY29weS1jb3Vwb24tYnV0dG9uIiBjbGFzcz0iY29weS1idXR0b24iIG9uY2xpY2s9ImNvcHlDb3Vwb24oZXZlbnQpIj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImNvdXBvbi1jb3BpZWQtdGljayIgY2xhc3M9ImNvdXBvbi1jb3BpZWQtdGljayBoaWRkZW4iPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QXBwbHkgdGhpcyBjb3Vwb24gdG8geW91ciBTaG9wcGluZyBDYXJ0IGJlZm9yZSBwbGFjaW5nIHlvdXIgb3JkZXIuPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGlhbG9nPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb290ZXItY29weXJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBvcnRzd2lnZ2VyLWxvZ28iPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj7CqSAyMDIzIFBvcnRTd2lnZ2VyIEx0ZC48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyLXJpZ2h0Ij48L2Rpdj4KICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJmb290ZXItbG93ZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvb3Rlck5hdmlnYXRpb24iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzb2NpYWxMaW5rcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bmF2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBwcmltYXJ5LWxpbmtzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9jYXRhbG9nIj5Qcm9kdWN0czwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiIgaHJlZj0iL2Jsb2ciPkJsb2c8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJidXR0b24iIGhyZWY9Ii9hYm91dCI+T3VyIHN0b3J5PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICA8L25hdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNjcmlwdCBzcmM9Jy9yZXNvdXJjZXMvZm9vdGVyL2pzL3NjYW5tZS5qcyc+PC9zY3JpcHQ+CiAgICA8L2JvZHk+CjwvaHRtbD4K","response_hash":"bda42199a20f3607b010fdf4bb3a248a73767aa530c38dc20c0539e535c7020e","response_time_ms":0,"response_words":504,"has_response":true,"response_title":"Home - Gin & Juice Shop","sent_at":"2026-04-05T05:31:31.215651Z","received_at":"2026-04-05T05:31:31.215632Z","created_at":"2026-04-05T05:31:31Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"827ed9b6-2bf4-4979-bfb4-3a7f0c5478b9","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/labheader/css/scanMeHeader.css","url":"https://ginandjuice.shop/resources/labheader/css/scanMeHeader.css","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvbGFiaGVhZGVyL2Nzcy9zY2FuTWVIZWFkZXIuY3NzIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE0LjAuMC4wIFNhZmFyaS81MzcuMzYNCkFjY2VwdC1MYW5ndWFnZTogZW4NClJlZmVyZXI6IGh0dHBzOi8vZ2luYW5kanVpY2Uuc2hvcC8NCg0K","request_hash":"29c79ee2d00ed4823c338278e2d8599f6c8e19832c8fa533870fce4e9804384d","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["2218"],"content-type":["text/css"],"date":["Sun, 05 Apr 2026 05:31:31 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/css","response_content_length":17727,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQpjb250ZW50LXR5cGU6IHRleHQvY3NzDQp4LWZyYW1lLW9wdGlvbnM6IFNBTUVPUklHSU4NCmNhY2hlLWNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0zNjAwDQpjb250ZW50LWxlbmd0aDogMjIxOA0KeC1iYWNrZW5kOiBjOThkZjVjNC1hNTI3LTRkYWEtODhjZC04M2M1ZGU0ZTdjNzcNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzE6MzEgR01UDQoNCiNzY2FuTWVIZWFkZXIgewogIGFsbDogaW5pdGlhbDsKICAtLXNwYWNpbmdiYXNlOiAwLjllbTsKICAtLWhlYWRpbmctbGluZS1oZWlnaHQ6IDI0cHg7CiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxNnB4OwogIHRleHQtYWxpZ246IHJpZ2h0Owp9CiNzY2FuTWVIZWFkZXIgLmhlYWRlci1kZXNjcmlwdGlvbiB7CiAgYmFja2dyb3VuZDogI0YyRjNGNjsKICB3aWR0aDogMTAwdnc7CiAgbWF4LXdpZHRoOiAxMDAlOwogIG1pbi1oZWlnaHQ6IDYwcHg7CiAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICBwYWRkaW5nOiAxMHB4OwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgcGFkZGluZy10b3A6IDA7CiAgcGFkZGluZy1ib3R0b206IDA7Cn0KI3NjYW5NZUhlYWRlciAuaGVhZGVyLWRlc2NyaXB0aW9uIHAgewogIG1hcmdpbjogMDsKICBmb250LWZhbWlseTogInBvcHBpbnNyZWd1bGFyIiwgc2Fucy1zZXJpZjsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBmb250LXNpemU6IDEycHg7CiAgbGluZS1oZWlnaHQ6IDE4cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGNvbG9yOiAjMDAwMDIzOwp9CiNzY2FuTWVIZWFkZXIgLmhlYWRlci1kZXNjcmlwdGlvbiAubGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CiNzY2FuTWVIZWFkZXIgLmhlYWRlci1kZXNjcmlwdGlvbiAubGluazpob3ZlciwgI3NjYW5NZUhlYWRlciAuaGVhZGVyLWRlc2NyaXB0aW9uIC5saW5rOmZvY3VzIHsKICBjb2xvcjogIzA5NGM3MjsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQojc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgewogIGJhY2tncm91bmQ6ICMwMDAwMjM7CiAgY29sb3I6ICM3Rjg1QTc7CiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTsKICBsaW5lLWhlaWdodDogMS40OwogIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgZGlzcGxheTogZmxleDsKICBoZWlnaHQ6IDYwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIHsKICAgIGhlaWdodDogOTdweDsKICB9Cn0KI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIGgxLAojc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgaDIsCiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciBoMywKI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIGg0LAojc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgaDUsCiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuaDIsCiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuaDMsCiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuaDQsCiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciBoNSwKI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5oNSB7CiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBsaW5lLWhlaWdodDogdmFyKC0taGVhZGluZy1saW5lLWhlaWdodCk7CiAgbWFyZ2luOiBjYWxjKDAuNzUgKiB2YXIoLS1zcGFjaW5nYmFzZSkpIDAgY2FsYygwLjUgKiB2YXIoLS1zcGFjaW5nYmFzZSkpIDA7CiAgY29sb3I6ICNmZjY2MzM7Cn0KLmlzLWRhcmsgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIHsKICBiYWNrZ3JvdW5kOiAjMzMzMzMyOwogIGNvbG9yOiAjZmZmOwp9CiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIHsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHdpZHRoOiAxMDAlOwogIG1heC13aWR0aDogMTE0MHB4OwogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogIG1hcmdpbjogMCBhdXRvOwogIGhlaWdodDogMTAwJTsKICBwYWRkaW5nOiAwIDIwcHg7CiAgYm94LXNpemluZzogY29udGVudC1ib3g7Cn0KLmlzLWRhcmsgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgewogIGJhY2tncm91bmQ6ICMzMzMzMzI7Cn0KI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnNjYW5tZS1sb2dvIHsKICB3aWR0aDogMTAwcHg7CiAgaGVpZ2h0OiAzOHB4OwogIGJhY2tncm91bmQ6IHVybCgiL3Jlc291cmNlcy9pbWFnZXMvZ2luLWFuZC1qdWljZS1zaG9wLWxvZ28tc21hbGwuc3ZnIikgc2Nyb2xsIGNlbnRlciBsZWZ0IG5vLXJlcGVhdDsKICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogODA4cHgpIHsKICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAuc2Nhbm1lLWxvZ28gewogICAgd2lkdGg6IDIyMHB4OwogICAgYmFja2dyb3VuZDogdXJsKCIvcmVzb3VyY2VzL2ltYWdlcy9naW4tYW5kLWp1aWNlLXNob3AtbG9nby5zdmciKSBzY3JvbGwgY2VudGVyIGxlZnQgbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwogIH0KfQojc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIHsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyB7CiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBsaSB7CiAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3MgbGk6Zmlyc3QtY2hpbGQgewogICAgbWFyZ2luLXJpZ2h0OiAwOwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3MgbGkgYS5idXR0b24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZy1sZWZ0OiAzNHB4OwogICAgcGFkZGluZy1yaWdodDogMzRweDsKICAgIGhlaWdodDogNDRweDsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxNHB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbi1vdXQgMzAwbXM7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6ICM3Rjg1QTc7CiAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICBwYWRkaW5nLXJpZ2h0OiAwOwogICAgbWluLXdpZHRoOiAwOwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3MgbGkgYS5idXR0b246aG92ZXIsICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBsaSBhLmJ1dHRvbjphY3RpdmUsICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBsaSBhLmJ1dHRvbi5zZWxlY3RlZCB7CiAgICBjb2xvcjogI0NFOTQwMDsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzIGxpLm5hdi10b2dnbGUgewogICAgZGlzcGxheTogbm9uZTsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzIGxpIGEuY2FydC1pY29uLAojc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3MgbGkgYS5hY2NvdW50LWljb24gewogICAgaGVpZ2h0OiAyNXB4OwogICAgd2lkdGg6IDI1cHg7CiAgICBjb2xvcjogIzdGODVBNzsKICAgIHBhZGRpbmctbGVmdDogMDsKICAgIHBhZGRpbmctcmlnaHQ6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbi1vdXQgMzAwbXM7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgZGlzcGxheTogYmxvY2s7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBsaSBhLmNhcnQtaWNvbjpob3ZlciwgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzIGxpIGEuY2FydC1pY29uOmFjdGl2ZSwgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzIGxpIGEuY2FydC1pY29uLnNlbGVjdGVkLAojc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3MgbGkgYS5hY2NvdW50LWljb246aG92ZXIsCiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBsaSBhLmFjY291bnQtaWNvbjphY3RpdmUsCiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBsaSBhLmFjY291bnQtaWNvbi5zZWxlY3RlZCB7CiAgICBjb2xvcjogI0NFOTQwMDsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzIGxpIGEuY2FydC1pY29uIHN2ZywKI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzIGxpIGEuYWNjb3VudC1pY29uIHN2ZyB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICB3aWR0aDogMTAwJTsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzIGxpIGEuY2FydC1pY29uIHNwYW4sCiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBsaSBhLmFjY291bnQtaWNvbiBzcGFuIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLThweDsKICAgIHJpZ2h0OiA1cHg7CiAgICB3aWR0aDogMTBweDsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBsaSB1bCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBsZWZ0OiA1MCU7CiAgICBib3R0b206IC00MHB4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMTAwJSk7CiAgICBiYWNrZ3JvdW5kOiAjMDAwMDIzOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIHotaW5kZXg6IDEwOwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3MgbGkgdWwgbGkgewogICAgbWFyZ2luOiAwOwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBsaSB1bCBsaSBhLmJ1dHRvbiB7CiAgICBwYWRkaW5nOiAyMHB4IDE1cHg7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBsaSB1bCBsaTpob3ZlcjphZnRlciB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3MgbGkgdWwgbGk6Zmlyc3QtY2hpbGQgewogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM3Rjg1QTc7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcyBsaSB1bDphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkICMwMDAwMjM7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC0xMHB4OwogICAgbGVmdDogNTAlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMHB4KTsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzIGxpOmhvdmVyOmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaGVpZ2h0OiAxNzBweDsKICAgIHdpZHRoOiAxNDBweDsKICAgIGJvdHRvbTogMDsKICAgIGxlZnQ6IDUwJTsKICAgIHotaW5kZXg6IDU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAxMDAlKTsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzIGxpOmhvdmVyIHVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgewogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5wcmltYXJ5LWxpbmtzIHsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMDsKICAgIHJpZ2h0OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTAwJSwgMCk7CiAgICB6LWluZGV4OiAyMDsKICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGhlaWdodDogY2FsYygxMDB2aCAtIDYwcHgpOwogICAgYmFja2dyb3VuZDogI2ZmZjsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnByaW1hcnktbGlua3M6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgZGlzcGxheTogYmxvY2s7CiAgICB3aWR0aDogMzMwcHg7CiAgICBoZWlnaHQ6IDYwcHg7CiAgICBiYWNrZ3JvdW5kOiAjMDBBMkI5OwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3MucHJpbWFyeS1saW5rcyBsaSB7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM3Rjg1QTc7CiAgICBoZWlnaHQ6IDYwcHg7CiAgICB3aWR0aDogMzMwcHg7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5wcmltYXJ5LWxpbmtzIGxpIGEgewogICAgY29sb3I6ICMwMDAwMjM7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIHsKICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnNlY29uZGFyeS1saW5rcyBsaSB7CiAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIGxpOmZpcnN0LWNoaWxkIHsKICAgIG1hcmdpbi1yaWdodDogMDsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnNlY29uZGFyeS1saW5rcyBsaSBhLmJ1dHRvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBwYWRkaW5nLWxlZnQ6IDM0cHg7CiAgICBwYWRkaW5nLXJpZ2h0OiAzNHB4OwogICAgaGVpZ2h0OiA0NHB4OwogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogIzdGODVBNzsKICAgIHBhZGRpbmctbGVmdDogMDsKICAgIHBhZGRpbmctcmlnaHQ6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkgYS5idXR0b246aG92ZXIsICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkgYS5idXR0b246YWN0aXZlLCAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIGxpIGEuYnV0dG9uLnNlbGVjdGVkIHsKICAgIGNvbG9yOiAjQ0U5NDAwOwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIGxpLm5hdi10b2dnbGUgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkubmF2LXRvZ2dsZSAubmF2LXRyaWdnZXIgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHotaW5kZXg6IDE7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICBib3JkZXI6IDA7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICBoZWlnaHQ6IDI1cHg7CiAgICB3aWR0aDogMjVweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgdG91Y2gtYWN0aW9uOiBtYW5pcHVsYXRpb247CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkubmF2LXRvZ2dsZSAubmF2LXRyaWdnZXIgc3BhbiB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAzcHg7CiAgICBiYWNrZ3JvdW5kOiAjN0Y4NUE3OwogICAgdHJhbnNpdGlvbjogMC4zczsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnNlY29uZGFyeS1saW5rcyBsaS5uYXYtdG9nZ2xlIC5uYXYtdHJpZ2dlciBzcGFuICsgc3BhbiB7CiAgICBtYXJnaW4tdG9wOiA3cHg7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkgYS5jYXJ0LWljb24sCiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkgYS5hY2NvdW50LWljb24gewogICAgaGVpZ2h0OiAyNXB4OwogICAgd2lkdGg6IDI1cHg7CiAgICBjb2xvcjogIzdGODVBNzsKICAgIHBhZGRpbmctbGVmdDogMDsKICAgIHBhZGRpbmctcmlnaHQ6IDA7CiAgICBtaW4td2lkdGg6IDA7CiAgICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbi1vdXQgMzAwbXM7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgYm9yZGVyLXJhZGl1czogMDsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgZGlzcGxheTogYmxvY2s7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkgYS5jYXJ0LWljb246aG92ZXIsICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkgYS5jYXJ0LWljb246YWN0aXZlLCAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIGxpIGEuY2FydC1pY29uLnNlbGVjdGVkLAojc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIGxpIGEuYWNjb3VudC1pY29uOmhvdmVyLAojc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIGxpIGEuYWNjb3VudC1pY29uOmFjdGl2ZSwKI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnNlY29uZGFyeS1saW5rcyBsaSBhLmFjY291bnQtaWNvbi5zZWxlY3RlZCB7CiAgICBjb2xvcjogI0NFOTQwMDsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnNlY29uZGFyeS1saW5rcyBsaSBhLmNhcnQtaWNvbiBzdmcsCiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkgYS5hY2NvdW50LWljb24gc3ZnIHsKICAgIGhlaWdodDogMTAwJTsKICAgIHdpZHRoOiAxMDAlOwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIGxpIGEuY2FydC1pY29uIHNwYW4sCiNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkgYS5hY2NvdW50LWljb24gc3BhbiB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC0zcHg7CiAgICByaWdodDogNXB4OwogICAgd2lkdGg6IDEwcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnNlY29uZGFyeS1saW5rcyBsaSB1bCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICBsZWZ0OiA1MCU7CiAgICBib3R0b206IC0yN3B4OwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMTAwJSk7CiAgICBiYWNrZ3JvdW5kOiAjMDAwMDIzOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIHotaW5kZXg6IDEwOwogIH0KfQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnNlY29uZGFyeS1saW5rcyBsaSB1bCB7CiAgICBib3R0b206IC00MHB4OwogIH0KfQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgewogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkgdWwgbGkgewogICAgbWFyZ2luOiAwOwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkgdWwgbGkgYS5idXR0b24gewogICAgcGFkZGluZzogMjBweCAxNXB4OwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIGxpIHVsIGxpOmhvdmVyOmFmdGVyIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkgdWwgbGk6Zmlyc3QtY2hpbGQgewogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM3Rjg1QTc7CiAgfQp9CkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2N3B4KSB7CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnNlY29uZGFyeS1saW5rcyBsaSB1bDphZnRlciB7CiAgICBjb250ZW50OiAiIjsKICAgIHdpZHRoOiAwOwogICAgaGVpZ2h0OiAwOwogICAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItcmlnaHQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkICMwMDAwMjM7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC0xMHB4OwogICAgbGVmdDogNTAlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgMHB4KTsKICB9Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsKICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIGxpOmhvdmVyOmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaGVpZ2h0OiAxNzBweDsKICAgIHdpZHRoOiAxNDBweDsKICAgIGJvdHRvbTogMDsKICAgIGxlZnQ6IDUwJTsKICAgIHotaW5kZXg6IDc7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAxMDAlKTsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnNlY29uZGFyeS1saW5rcyBsaTpob3ZlciB1bCB7CiAgICBkaXNwbGF5OiBibG9jazsKICB9Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsKICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdi5hY3RpdmUtbmF2OmJlZm9yZSB7CiAgICBjb250ZW50OiAiIjsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgcG9zaXRpb246IGZpeGVkOwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIGhlaWdodDogMTAwdmg7CiAgICB3aWR0aDogMTAwdnc7CiAgICB6LWluZGV4OiAzOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2LmFjdGl2ZS1uYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnByaW1hcnktbGlua3MgewogICAgdHJhbnNpdGlvbjogYWxsIGVhc2UtaW4tb3V0IDMwMG1zOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgYm94LXNoYWRvdzogMCAyMHB4IDE1cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4zOSk7CiAgfQogICNzY2FuTWVIZWFkZXIgLnNjYW5NZUJhbm5lciAuY29udGFpbmVyIC50aXRsZS1jb250YWluZXIgbmF2LmFjdGl2ZS1uYXYgLm5hdmlnYXRpb24taGVhZGVyLWxpbmtzLnNlY29uZGFyeS1saW5rcyBsaS5uYXYtdG9nZ2xlIC5uYXYtdHJpZ2dlciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB6LWluZGV4OiAyNTsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYuYWN0aXZlLW5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIGxpLm5hdi10b2dnbGUgLm5hdi10cmlnZ2VyIHNwYW4gewogICAgYmFja2dyb3VuZDogI2ZmZjsKICB9CiAgI3NjYW5NZUhlYWRlciAuc2Nhbk1lQmFubmVyIC5jb250YWluZXIgLnRpdGxlLWNvbnRhaW5lciBuYXYuYWN0aXZlLW5hdiAubmF2aWdhdGlvbi1oZWFkZXItbGlua3Muc2Vjb25kYXJ5LWxpbmtzIGxpLm5hdi10b2dnbGUgLm5hdi10cmlnZ2VyIHNwYW46bnRoLWNoaWxkKDEpIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMTJweCwgMCkgcm90YXRlKDQ1ZGVnKTsKICAgIHdpZHRoOiAxMjUlOwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdi5hY3RpdmUtbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkubmF2LXRvZ2dsZSAubmF2LXRyaWdnZXIgc3BhbjpudGgtY2hpbGQoMykgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAtOHB4LCAwKSByb3RhdGUoLTQ1ZGVnKTsKICAgIHdpZHRoOiAxMjUlOwogIH0KICAjc2Nhbk1lSGVhZGVyIC5zY2FuTWVCYW5uZXIgLmNvbnRhaW5lciAudGl0bGUtY29udGFpbmVyIG5hdi5hY3RpdmUtbmF2IC5uYXZpZ2F0aW9uLWhlYWRlci1saW5rcy5zZWNvbmRhcnktbGlua3MgbGkubmF2LXRvZ2dsZSAubmF2LXRyaWdnZXIgc3BhbjpudGgtY2hpbGQoMikgewogICAgb3BhY2l0eTogMDsKICB9Cn0KCmJvZHkgewogIG1hcmdpbjogYXV0bzsKICBvdmVyZmxvdy15OiBhdXRvOwogIG92ZXJmbG93LXg6IGhpZGRlbjsKfQpib2R5LmFjdGl2ZS1uYXYgewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIyBzb3VyY2VNYXBwaW5nVVJMPXNjYW5NZUhlYWRlci5jc3MubWFwICovCg==","response_hash":"38c2aaf63c098991622ac1283f027f7d3e926a832e18170de2c355237d764348","response_time_ms":0,"response_words":1609,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"labheader","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":24},{"name":"3","value":"css","type":"path","name_start":-1,"name_end":-1,"value_start":25,"value_end":28},{"name":"4","value":"scanMeHeader.css","type":"path","name_start":-1,"name_end":-1,"value_start":29,"value_end":45}],"sent_at":"2026-04-05T05:31:31.434239Z","received_at":"2026-04-05T05:31:31.43423Z","created_at":"2026-04-05T05:31:31Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"36dbbc66-0645-40d7-a416-0800cd63673e","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/css/labsScanme.css","url":"https://ginandjuice.shop/resources/css/labsScanme.css","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvY3NzL2xhYnNTY2FubWUuY3NzIEhUVFAvMS4xDQpIb3N0OiBnaW5hbmRqdWljZS5zaG9wDQpBY2NlcHQtTGFuZ3VhZ2U6IGVuDQpSZWZlcmVyOiBodHRwczovL2dpbmFuZGp1aWNlLnNob3AvDQpVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTE0LjAuMC4wIFNhZmFyaS81MzcuMzYNCg0K","request_hash":"f96c85876ced7afaedb3994e38401d1b6f4be2c5c2007f2470523c9de20324b6","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["11256"],"content-type":["text/css"],"date":["Sun, 05 Apr 2026 05:31:31 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"text/css","response_content_length":83677,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LXR5cGU6IHRleHQvY3NzDQp4LWZyYW1lLW9wdGlvbnM6IFNBTUVPUklHSU4NCmNhY2hlLWNvbnRyb2w6IHB1YmxpYywgbWF4LWFnZT0zNjAwDQpjb250ZW50LWxlbmd0aDogMTEyNTYNCngtYmFja2VuZDogYzk4ZGY1YzQtYTUyNy00ZGFhLTg4Y2QtODNjNWRlNGU3Yzc3DQpkYXRlOiBTdW4sIDA1IEFwciAyMDI2IDA1OjMxOjMxIEdNVA0KY29udGVudC1lbmNvZGluZzogZ3ppcA0KDQo6cm9vdCB7CiAgLS1zcGFjaW5nYmFzZTogMC45ZW07Cn0KCkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgewogIDpyb290IHsKICAgIC0tc3BhY2luZ2Jhc2U6IDFlbTsKICB9Cn0KQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgewogIDpyb290IHsKICAgIC0tc3BhY2luZ2Jhc2U6IDEuMWVtOwogIH0KfQovKjIqLwovKjQqLwovKjgqLwovKjEyKi8KLyoyMCovCi8qMzIqLwovKjUyKi8KLyo4NCovCi8qIGNvbXBvbmVudCBzcGFjaW5nICovCi8qU3BhY2luZyB1c2VkIGZvciBjb250YWluZXIgY29sdW1ucyBsYXlvdXRzKi8KOnJvb3QgewogIC8qIHNldCBiYXNlIHZhbHVlcyAqLwogIC0tdGV4dC1iYXNlLXNpemU6IDFlbTsKICAtLXRleHQtc2NhbGUtcmF0aW86IDEuMTsKICAvKiB0eXBlIHNjYWxlICovCiAgLS10ZXh0LXhzOiBjYWxjKDFlbSAvICh2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pKSk7CiAgLS10ZXh0LXNtOiBjYWxjKDFlbSAvIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pKTsKICAtLXRleHQtbWQ6IGNhbGMoMS4wMWVtICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykpOwogIC0tdGV4dC1sZzogY2FsYygxZW0gKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pKTsKICAtLXRleHQteGw6IGNhbGMoMWVtICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykgKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pKTsKICAtLXRleHQteHhsOiBjYWxjKDFlbSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykgKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pKTsKICAtLXRleHQteHh4bDogY2FsYygxZW0gKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pICogdmFyKC0tdGV4dC1zY2FsZS1yYXRpbykgKiB2YXIoLS10ZXh0LXNjYWxlLXJhdGlvKSAqIHZhcigtLXRleHQtc2NhbGUtcmF0aW8pKTsKICAvKiBsaW5lLWhlaWdodCAqLwogIC0taGVhZGluZy1saW5lLWhlaWdodDogMTsKICAtLXRleHQtbGluZWhlaWdodDogMS40OwogIC0tdGV4dC1saW5laGVpZ2h0LXNtOiAxLjM7CiAgLS10ZXh0LWxpbmVoZWlnaHQtbWQ6IDEuNDU7CiAgLS10ZXh0LWxpbmVoZWlnaHQtbHJnOiAxLjU7Cn0KCkBtZWRpYSAobWluLXdpZHRoOiA5OTJweCkgewogIDpyb290IHsKICAgIC0tdGV4dC1zY2FsZS1yYXRpbzogMS4xNTsKICAgIC0tdGV4dC1saW5laGVpZ2h0OiAxLjQ1OwogIH0KfQpAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7CiAgOnJvb3QgewogICAgLS10ZXh0LXNjYWxlLXJhdGlvOiAxLjI7CiAgICAtLXRleHQtbGluZWhlaWdodDogMS41OwogIH0KfQoub3JhbmdlLWJvcmRlci1ib3R0b20gewogIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZmY2NjMzICFpbXBvcnRhbnQ7CiAgcGFkZGluZzogNXB4IDBweCAhaW1wb3J0YW50Owp9Cgoud2hpdGUtYm9yZGVyLWJvdHRvbSwgLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgaDMgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmZmICFpbXBvcnRhbnQ7Cn0KCi5saWdodC1ncmV5LWJvcmRlciB7CiAgYm9yZGVyOiAxcHggc29saWQgI2IzYjNiMyAhaW1wb3J0YW50Owp9CgoubGlnaHQtZ3JleS1ib3JkZXItdG9wIHsKICBib3JkZXItdG9wOiAxcHggc29saWQgI2IzYjNiMyAhaW1wb3J0YW50Owp9CgoubGlnaHRlci1ncmV5LWJvcmRlciB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NiZDBkMSAhaW1wb3J0YW50Owp9CgoubGlnaHRlci1ncmV5LWJvcmRlci1ib3R0b20sIC5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIGgzIHsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NiZDBkMSAhaW1wb3J0YW50Owp9CgouYm9yZGVyLWJvdHRvbS1ncmV5IHsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzk5OSAhaW1wb3J0YW50Owp9CgouYm9yZGVyLXRvcC1ncmV5IHsKICBib3JkZXItdG9wOiAxcHggc29saWQgIzk5OSAhaW1wb3J0YW50Owp9CgouYm9yZGVyLWJvdHRvbS1saWdodC1ncmV5IHsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2IzYjNiMyAhaW1wb3J0YW50Owp9CgouYm9yZGVyLXRvcC1saWdodC1ncmV5IHsKICBib3JkZXItdG9wOiAxcHggc29saWQgI2IzYjNiMyAhaW1wb3J0YW50Owp9CgouYm9yZGVyLWJvdHRvbS14LWxpZ2h0LWdyZXkgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTZlNmU2ICFpbXBvcnRhbnQ7Cn0KCi5ib3JkZXItdG9wLXgtbGlnaHQtZ3JleSB7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNmU2ZTYgIWltcG9ydGFudDsKfQoKZGl2LmJvcmRlci1ib3R0b20teC1saWdodC1ncmV5IHsKICBtYXJnaW46IDFlbSAwICFpbXBvcnRhbnQ7Cn0KCi53aGl0ZS1ib3JkZXItZGFzaGVkLW9mZnNldCB7CiAgb3V0bGluZTogMXB4IGRhc2hlZCAjZmZmOwogIG91dGxpbmUtb2Zmc2V0OiAtNnB4Owp9CgoueC1saWdodC1ncmV5LWJvcmRlciB7CiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNiAhaW1wb3J0YW50Owp9CgoubWFpbmNvbnRhaW5lciBoMSwKLm1haW5jb250YWluZXIgaDIsCi5tYWluY29udGFpbmVyIGgzLAoubWFpbmNvbnRhaW5lciBoNCB7CiAgY29sb3I6ICMzMzMzMzI7Cn0KLm1haW5jb250YWluZXIgaDEgYSwKLm1haW5jb250YWluZXIgaDIgYSwKLm1haW5jb250YWluZXIgaDMgYSwKLm1haW5jb250YWluZXIgaDQgYSB7CiAgY29sb3I6ICMzMzMzMzI7Cn0KCiosICo6YmVmb3JlLCAqOmFmdGVyIHsKICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCmJvZHkgewogIG1hcmdpbjogMDsKICBtaW4td2lkdGg6IDI5MHB4OwogIG1pbi1oZWlnaHQ6IDEwMHZoOwp9CgouaXMtZmxleCB7CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLW1vei1ib3g7CiAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IGZsZXg7Cn0KLmlzLWZsZXggLm1haW5jb250YWluZXIgewogIC1tb3otZmxleDogMSAxIGF1dG87CiAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAtbXMtZmxleDogMSAxIGF1dG87CiAgZmxleDogMSAxIGF1dG87CiAgbWluLWhlaWdodDogMTAwdmg7CiAgbWluLXdpZHRoOiAwOwp9Ci5pcy1mbGV4LmZsZXhkaXJlY3Rpb24tY29sIHsKICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDsKICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOwogIC1tb3otYm94LWRpcmVjdGlvbjogbm9ybWFsOwogIC1tb3otYm94LW9yaWVudDogdmVydGljYWw7CiAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KCi5jb250YWluZXIgewogIGhlaWdodDogY2FsYygxMDAlIC0gNy41ZW0pOwp9CgpociB7CiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjsKICBtYXJnaW46IDEuOGVtIDA7Cn0KCmhyOmxhc3Qtb2YtdHlwZSB7CiAgbWFyZ2luLXRvcDogMDsKfQoKLmhpZGRlbiB7CiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgouY29udGFpbmVyLWxpc3QtdGlsZXMgewogIC13ZWJraXQtYm94LXBhY2s6IGp1c3RpZnk7CiAgLW1vei1ib3gtcGFjazoganVzdGlmeTsKICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBkaXNwbGF5OiAtd2Via2l0LWJveDsKICBkaXNwbGF5OiAtbW96LWJveDsKICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LXdyYXA6IHdyYXA7CiAgbWFyZ2luOiAxZW0gMDsKfQouY29udGFpbmVyLWxpc3QtdGlsZXMgPiBkaXYgewogIHBhZGRpbmc6IDFlbSAwIDJlbSAwOwogIC1tb3otZmxleDogMSAwIDI0JTsKICAtd2Via2l0LWZsZXg6IDEgMCAyNCU7CiAgLW1zLWZsZXg6IDEgMCAyNCU7CiAgZmxleDogMSAwIDI0JTsKICBtYXgtd2lkdGg6IDI0JTsKfQouY29udGFpbmVyLWxpc3QtdGlsZXMgPiBkaXYgaW1nOmZpcnN0LW9mLXR5cGUgewogIGJvcmRlcjogMXB4IHNvbGlkICNlNmU2ZTY7CiAgd2lkdGg6IDI3MHB4OwogIGhlaWdodDogMjAwcHg7CiAgYm9yZGVyLXJhZGl1czogNXB4OwogIG9wYWNpdHk6IDAuOTsKICBwYWRkaW5nOiAwOwp9Ci5jb250YWluZXItbGlzdC10aWxlcyA+IGRpdiBpbWc6bnRoLW9mLXR5cGUoMikgewogIGJvcmRlcjogbm9uZTsKfQouY29udGFpbmVyLWxpc3QtdGlsZXMgPiBkaXYgaDMgewogIGZvbnQtc2l6ZTogMC44ZW07CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLmNvbnRhaW5lci1saXN0LXRpbGVzID4gZGl2IC5idXR0b24gewogIGZsb2F0OiB1bnNldDsKICBtYXJnaW46IDAuN2VtIGF1dG8gMCBhdXRvOwogIGRpc3BsYXk6IGJsb2NrOwogIGJvcmRlci1yYWRpdXM6IDA7Cn0KCkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEwMjRweCkgewogIC5tYWluY29udGFpbmVyIHsKICAgIG1pbi1oZWlnaHQ6IDM2MHB4OwogIH0KfQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA5OTFweCkgewogIC5pcy1mbGV4IHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgfQogIC5pcy1mbGV4IC5yaWdodGNvbCB7CiAgICBtYXJnaW4tbGVmdDogMHB4OwogICAgbWF4LXdpZHRoOiAxMDAlOwogIH0KfQouY29udGFpbmVyIHsKICB3aWR0aDogMTE0MHB4OwogIGJhY2tncm91bmQ6ICNmZmY7CiAgbWFyZ2luOiAwIGF1dG87CiAgcGFkZGluZzogMDsKfQouY29udGFpbmVyLmlzLWZsZXggewogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC1tb3otYm94OwogIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiBmbGV4Owp9Ci5jb250YWluZXIuaXMtZmxleCAubGVmdGNvbCB7CiAgbWFyZ2luLXJpZ2h0OiAxLjhlbTsKfQouY29udGFpbmVyLmlzLWZsZXggLm1haW5jb2wgewogIC1tb3otZmxleDogMSAxIGF1dG87CiAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAtbXMtZmxleDogMSAxIGF1dG87CiAgZmxleDogMSAxIGF1dG87CiAgbWluLWhlaWdodDogMTAwJTsKICBtaW4td2lkdGg6IDA7Cn0KLmNvbnRhaW5lci5pcy1mbGV4IC5yaWdodGNvbCB7CiAgbWFyZ2luLWxlZnQ6IDEuOGVtOwogIG1heC13aWR0aDogMzEuOGVtOwp9CgoubWFpbmNvbnRhaW5lciAuY29udGFpbmVyIHsKICBwYWRkaW5nOiAxLjhlbSAwOwp9Ci5tYWluY29udGFpbmVyIC5jb250YWluZXIgLmluZm9ybWF0aW9uIHsKICBiYWNrZ3JvdW5kOiAjZWJmMGYyOwogIHBhZGRpbmc6IDFlbTsKICBib3JkZXItcmFkaXVzOiAxNXB4Owp9Ci5tYWluY29udGFpbmVyIC5jb250YWluZXIgLmluZm9ybWF0aW9uIHA6bGFzdC1vZi10eXBlIHsKICBtYXJnaW4tYm90dG9tOiAwOwp9CgpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTkwcHgpIHsKICAuY29udGFpbmVyIHsKICAgIHBhZGRpbmc6IDAgMWVtOwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDExNDBweDsKICB9CgogIC5tYWluY29udGFpbmVyIC5jb250YWluZXIgewogICAgcGFkZGluZzogMS44ZW0gMWVtOwogIH0KfQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMDI0cHgpIHsKICAubWFpbmNvbnRhaW5lciB7CiAgICBtaW4taGVpZ2h0OiAzNjBweDsKICB9Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkxcHgpIHsKICAuY29udGFpbmVyLmlzLWZsZXggewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9CiAgLmNvbnRhaW5lci5pcy1mbGV4IC5yaWdodGNvbCB7CiAgICBtYXJnaW4tbGVmdDogMHB4OwogICAgbWF4LXdpZHRoOiAxMDAlOwogIH0KfQphIHsKICBjb2xvcjogIzAwNzFiYzsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogIGNvbG9yOiAjMDk0YzcyOwogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CmEud2hpdGUgewogIGNvbG9yOiAjZmZmOwp9CgouaXMtbGlua2JhY2sgewogIHRleHQtYWxpZ246IHJpZ2h0Owp9Ci5pcy1saW5rYmFjazpiZWZvcmUgewogIGNvbnRlbnQ6ICI8IjsKICBjb2xvcjogIzAwNzFiYzsKfQouaXMtbGlua2JhY2s6YmVmb3JlOmhvdmVyLCAuaXMtbGlua2JhY2s6YmVmb3JlOmFjdGl2ZSB7CiAgY29sb3I6ICMwOTRjNzI7CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KLmlzLWxpbmtiYWNrIGE6aG92ZXIgewogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLm1hcmdpbi1ub25lIHsKICBtYXJnaW46IDBweCAhaW1wb3J0YW50Owp9Cgouc2hvcnQtY29udGVudC1zcGFjaW5nIHsKICBtYXJnaW46IDQlIDAgNiUgMCAhaW1wb3J0YW50Owp9CgouY2VudGVyLWJsb2NrIHsKICBkaXNwbGF5OiBibG9jazsKICBtYXJnaW4tcmlnaHQ6IGF1dG87CiAgbWFyZ2luLWxlZnQ6IGF1dG87Cn0KCi5tYXJnaW4tcyB7CiAgbWFyZ2luOiA1cHggIWltcG9ydGFudDsKfQoKLm1hcmdpbi1tIHsKICBtYXJnaW46IDFlbSAhaW1wb3J0YW50Owp9CgoubWFyZ2luLWwgewogIG1hcmdpbjogMS44ZW0gIWltcG9ydGFudDsKfQoKLm1hcmdpbi1sZWZ0LXMgewogIG1hcmdpbi1sZWZ0OiA1cHggIWltcG9ydGFudDsKfQoKLm1hcmdpbi1sZWZ0LW0gewogIG1hcmdpbi1sZWZ0OiAxZW0gIWltcG9ydGFudDsKfQoKLm1hcmdpbi1sZWZ0LWwgewogIG1hcmdpbi1sZWZ0OiAxLjhlbSAhaW1wb3J0YW50Owp9CgoubWFyZ2luLXJpZ2h0LXMgewogIG1hcmdpbi1yaWdodDogNXB4ICFpbXBvcnRhbnQ7Cn0KCi5tYXJnaW4tcmlnaHQtbSB7CiAgbWFyZ2luLXJpZ2h0OiAxZW0gIWltcG9ydGFudDsKfQoKLm1hcmdpbi1yaWdodC1sIHsKICBtYXJnaW4tcmlnaHQ6IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5tYXJnaW4tdG9wLXMgewogIG1hcmdpbi10b3A6IDEwcHggIWltcG9ydGFudDsKfQoKLm1hcmdpbi10b3AtbSB7CiAgbWFyZ2luLXRvcDogMS44ZW0gIWltcG9ydGFudDsKfQoKLm1hcmdpbi10b3AtbCB7CiAgbWFyZ2luLXRvcDogNTBweCAhaW1wb3J0YW50Owp9CgoubWFyZ2luLWJvdHRvbS1zIHsKICBtYXJnaW4tYm90dG9tOiAxMHB4ICFpbXBvcnRhbnQ7Cn0KCi5tYXJnaW4tYm90dG9tLW0gewogIG1hcmdpbi1ib3R0b206IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5tYXJnaW4tYm90dG9tLWwgewogIG1hcmdpbi1ib3R0b206IDUwcHggIWltcG9ydGFudDsKfQoKLm1hcmdpbi1ib3R0b20tNDAgewogIG1hcmdpbi1ib3R0b206IDQwJTsKfQoKLm5hdmNvbnRhaW5lciB7CiAgbWluLWhlaWdodDogMTAwdmg7CiAgbWluLXdpZHRoOiA0MDBweDsKICBtYXgtd2lkdGg6IDQwMHB4OwogIGJhY2tncm91bmQtY29sb3I6ICMwMDcxYmM7CiAgcGFkZGluZzogMWVtOwogIHBvc2l0aW9uOiBmaXhlZDsKfQoubmF2Y29udGFpbmVyIGgxLCAubmF2Y29udGFpbmVyIGgyLCAubmF2Y29udGFpbmVyIGgzLCAubmF2Y29udGFpbmVyIGg0LCAubmF2Y29udGFpbmVyIGxpLCAubmF2Y29udGFpbmVyIGEgewogIGNvbG9yOiAjZmZmOwp9Ci5uYXZjb250YWluZXIgaDIgewogIGZvbnQtc2l6ZTogdmFyKC0tdGV4dC14bCk7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgewogIG92ZXJmbG93OiBzY3JvbGw7CiAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDEwMHB4KTsKfQoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciBoMyB7CiAgbWFyZ2luOiAxNnB4IDAgOHB4IDA7CiAgZGlzcGxheTogYmxvY2s7CiAgZm9udC1zaXplOiAxZW07CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgd2lkdGg6IDEwMCU7CiAgY29sb3I6ICNmZmY7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgaDM6Zmlyc3Qtb2YtdHlwZSB7CiAgbWFyZ2luOiAwIDAgOHB4IDA7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgYSB7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9Ci5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIGE6aG92ZXIgewogIGJhY2tncm91bmQtY29sb3I6ICMwOTRjNzI7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgewogIHBhZGRpbmc6IDA7CiAgbWFyZ2luOiAwOwp9Ci5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIHVsIGxpIHsKICBsaXN0LXN0eWxlOiBub25lOwogIGxpbmUtaGVpZ2h0OiAxLjVlbTsKICBiYWNrZ3JvdW5kOiBub25lOwogIHBhZGRpbmc6IDA7CiAgbWFyZ2luOiA1cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHJpZ2h0OiA1cHg7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkgYSB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6IGJsb2NrOwogIHBhZGRpbmctbGVmdDogNXB4Owp9Ci5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIHVsIGxpLmlzLWRyb3Bkb3duIHsKICBmb250LXdlaWdodDogNjAwOwogIHJpZ2h0OiAwOwp9Ci5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIHVsIGxpLmlzLWRyb3Bkb3duIGxhYmVsIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZykgc2NhbGUoMSwgMS41KTsKICAtbW96LXRyYW5zZm9ybTogcm90YXRlKDkwZGVnKSBzY2FsZSgxLCAxLjUpOwogIC1tcy10cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZykgc2NhbGUoMSwgMS41KTsKICAtby10cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZykgc2NhbGUoMSwgMS41KTsKICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZykgc2NhbGUoMSwgMS41KTsKICBmb250LXNpemU6IDE4cHg7CiAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBjb2xvcjogd2hpdGU7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkuaXMtZHJvcGRvd24gbGFiZWwgKyB1bCBsaSB7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXdlaWdodDogNDAwOwp9Ci5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIHVsIGxpLmlzLWRyb3Bkb3duIGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyBsYWJlbCB7CiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpIHNjYWxlKDEsIDEuNSk7CiAgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpIHNjYWxlKDEsIDEuNSk7CiAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgc2NhbGUoMSwgMS41KTsKICAtby10cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpIHNjYWxlKDEsIDEuNSk7CiAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSBzY2FsZSgxLCAxLjUpOwp9Ci5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIHVsIGxpLmlzLWRyb3Bkb3duIGlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgKyBsYWJlbCArIHVsIHsKICBtYXJnaW46IDAgMCAwIDE1cHg7Cn0KLm5hdmNvbnRhaW5lciAubmF2bGlzdC1jb250YWluZXIgdWwgbGkuaXMtZHJvcGRvd24gaW5wdXRbdHlwZT1jaGVja2JveF06Y2hlY2tlZCArIGxhYmVsICsgdWwgbGkgewogIGRpc3BsYXk6IGJsb2NrOwp9Cgouc2VjdGlvbi1wYWRkaW5nIHsKICBwYWRkaW5nOiAxLjhlbSAwOwp9Cgouc2VjdGlvbi1wYWRkaW5nLWxyZyB7CiAgcGFkZGluZzogNDBweCAwcHg7Cn0KCkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsKICAuc2VjdGlvbi1wYWRkaW5nLCAuc2VjdGlvbi1wYWRkaW5nLWxyZyB7CiAgICBwYWRkaW5nOiAxZW0gMDsKICB9Cn0KLnBhZGRpbmctcyB7CiAgcGFkZGluZzogNXB4ICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLW0gewogIHBhZGRpbmc6IDFlbSAhaW1wb3J0YW50Owp9CgoucGFkZGluZy1sIHsKICBwYWRkaW5nOiAxLjhlbSAhaW1wb3J0YW50Owp9CgoucGFkZGluZy1sZWZ0LXMsIC5uYXZjb250YWluZXIgLm5hdmxpc3QtY29udGFpbmVyIGgzIHsKICBwYWRkaW5nLWxlZnQ6IDVweCAhaW1wb3J0YW50Owp9CgoucGFkZGluZy1sZWZ0LW0gewogIHBhZGRpbmctbGVmdDogMWVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLWxlZnQtbCB7CiAgcGFkZGluZy1sZWZ0OiAxLjhlbSAhaW1wb3J0YW50Owp9CgoucGFkZGluZy1yaWdodC1zIHsKICBwYWRkaW5nLXJpZ2h0OiA1cHggIWltcG9ydGFudDsKfQoKLnBhZGRpbmctcmlnaHQtbSB7CiAgcGFkZGluZy1yaWdodDogMWVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLXJpZ2h0LWwgewogIHBhZGRpbmctcmlnaHQ6IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLXRvcC1zIHsKICBwYWRkaW5nLXRvcDogMTBweCAhaW1wb3J0YW50Owp9CgoucGFkZGluZy10b3AtbSB7CiAgcGFkZGluZy10b3A6IDEuOGVtICFpbXBvcnRhbnQ7Cn0KCi5wYWRkaW5nLXRvcC1sIHsKICBwYWRkaW5nLXRvcDogNTBweCAhaW1wb3J0YW50Owp9CgoucGFkZGluZy1ib3R0b20tcyB7CiAgcGFkZGluZy1ib3R0b206IDEwcHggIWltcG9ydGFudDsKfQoKLnBhZGRpbmctYm90dG9tLW0gewogIHBhZGRpbmctYm90dG9tOiAxLjhlbSAhaW1wb3J0YW50Owp9CgoucGFkZGluZy1ib3R0b20tbCB7CiAgcGFkZGluZy1ib3R0b206IDUwcHggIWltcG9ydGFudDsKfQoKYm9keSB7CiAgYmFja2dyb3VuZDogI2ZmZiAhaW1wb3J0YW50OwogIGNvbG9yOiAjMzMzMzMyOwogIGZvbnQtc2l6ZTogMTZweDsKICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwogIGZvbnQtZmFtaWx5OiBBcmlhbCwgIkhlbHZldGljYSBOZXVlIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwogIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7Cn0KCnAgewogIG1hcmdpbjogMCAwIDEwcHg7Cn0KcC5pcy13YXJuaW5nIHsKICBjb2xvcjogI2I1MDAwMDsKICBkaXNwbGF5OiBpbmxpbmU7CiAgbWFyZ2luLWxlZnQ6IGNhbGMoMC4yNSAqIHZhcigtLXNwYWNpbmdiYXNlKSk7Cn0KcC5pcy13YXJuaW5nOmZpcnN0LWNoaWxkIHsKICBtYXJnaW4tbGVmdDogMDsKfQoKLnNtYWxsZXItdGV4dCB7CiAgZm9udC1zaXplOiAwLjllbTsKfQoKaDEsIGgyLCBoMywgaDQsIGg1LCAuaDIsIC5oMywgLmg0LCBoNSwgLmg1IHsKICBmb250LWZhbWlseTogaW5oZXJpdDsKICBmb250LXdlaWdodDogNTAwOwogIGxpbmUtaGVpZ2h0OiB2YXIoLS1oZWFkaW5nLWxpbmUtaGVpZ2h0KTsKICBtYXJnaW46IGNhbGMoMC43NSAqIHZhcigtLXNwYWNpbmdiYXNlKSkgMCBjYWxjKDAuNSAqIHZhcigtLXNwYWNpbmdiYXNlKSkgMDsKICBjb2xvcjogI2ZmNjYzMzsKfQpoMS5pcy11bmRlcmxpbmVkLCBoMi5pcy11bmRlcmxpbmVkLCBoMy5pcy11bmRlcmxpbmVkLCBoNC5pcy11bmRlcmxpbmVkLCBoNS5pcy11bmRlcmxpbmVkLCAuaDIuaXMtdW5kZXJsaW5lZCwgLmgzLmlzLXVuZGVybGluZWQsIC5oNC5pcy11bmRlcmxpbmVkLCBoNS5pcy11bmRlcmxpbmVkLCAuaDUuaXMtdW5kZXJsaW5lZCB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNmZjY2MzM7CiAgcGFkZGluZy1ib3R0b206IGNhbGMoMC4xMTI1ICogdmFyKC0tc3BhY2luZ2Jhc2UpKTsKfQpoMTpmaXJzdC1jaGlsZCwgaDI6Zmlyc3QtY2hpbGQsIGgzOmZpcnN0LWNoaWxkLCBoNDpmaXJzdC1jaGlsZCwgaDU6Zmlyc3QtY2hpbGQsIC5oMjpmaXJzdC1jaGlsZCwgLmgzOmZpcnN0LWNoaWxkLCAuaDQ6Zmlyc3QtY2hpbGQsIGg1OmZpcnN0LWNoaWxkLCAuaDU6Zmlyc3QtY2hpbGQgewogIG1hcmdpbi10b3A6IDA7Cn0KaDE6bGFzdC1jaGlsZCwgaDI6bGFzdC1jaGlsZCwgaDM6bGFzdC1jaGlsZCwgaDQ6bGFzdC1jaGlsZCwgaDU6bGFzdC1jaGlsZCwgLmgyOmxhc3QtY2hpbGQsIC5oMzpsYXN0LWNoaWxkLCAuaDQ6bGFzdC1jaGlsZCwgaDU6bGFzdC1jaGlsZCwgLmg1Omxhc3QtY2hpbGQgewogIG1hcmdpbi1ib3R0b206IDA7Cn0KCmgxLCAuaDEgewogIGZvbnQtc2l6ZTogdmFyKC0tdGV4dC14eHhsKTsKfQoKaDIsIC5oMiB7CiAgZm9udC1zaXplOiB2YXIoLS10ZXh0LXh4bCk7Cn0KCmgzLCAuaDMgewogIGZvbnQtc2l6ZTogdmFyKC0tdGV4dC14bCk7Cn0KCmg0LCAuaDQgewogIGZvbnQtc2l6ZTogdmFyKC0tdGV4dC1sZyk7Cn0KCmg1LCAuaDUgewogIGZvbnQtc2l6ZTogdmFyKC0tdGV4dC1tZCk7CiAgbGluZS1oZWlnaHQ6IHZhcigtLXRleHQtbGluZWhlaWdodCk7Cn0KCmNpdGUgewogIG1hcmdpbjogMWVtIDJlbTsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGJvcmRlci1sZWZ0OiAycHggc29saWQgI2ZmNjYzMzsKICBwYWRkaW5nOiAwIDEuNmVtOwogIGNvbG9yOiByZ2JhKDUxLCA1MSwgNTEsIDAuMyk7Cn0KCi5zbWFsbHByaW50IHsKICBmb250LXNpemU6IDEycHg7Cn0KCi5ub3dyYXAsIC50ZXh0LW5vd3JhcCB7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcCAhaW1wb3J0YW50Owp9CgoucHJlLXdyYXAgewogIHdoaXRlLXNwYWNlOiBwcmUtd3JhcCAhaW1wb3J0YW50Owp9CgoudGV4dC1sZWZ0IHsKICB0ZXh0LWFsaWduOiBsZWZ0ICFpbXBvcnRhbnQ7Cn0KCi50ZXh0LWNlbnRlciB7CiAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7Cn0KCi50ZXh0LXJpZ2h0IHsKICB0ZXh0LWFsaWduOiByaWdodCAhaW1wb3J0YW50Owp9CgoubmF2Y29udGFpbmVyIC5uYXZsaXN0LWNvbnRhaW5lciBoMyB7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnRleHQtaGlnaGxpZ2h0IHsKICBmb250LXdlaWdodDogNjAwOwp9CgouaWVmaXgtd29yZC1icmVhayB7CiAgLW1zLXdvcmQtYnJlYWs6IGJyZWFrLWFsbDsKfQoKLmxpZ2h0LWdyZXktdGV4dCB7CiAgY29sb3I6ICNiM2IzYjM7Cn0KCi5pcy1kYXJrIGlucHV0LCAuaXMtZGFyayB0ZXh0YXJlYSB7CiAgZm9udC1mYW1pbHk6IENvdXJpZXIsIG1vbm9zcGFjZTsKfQoKLmJsb2NrIHsKICBkaXNwbGF5OiBibG9jazsKfQoKLmlzLWluaXRpYWxseWhpZGRlbiB7CiAgZGlzcGxheTogbm9uZTsKfQoKaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9cmVzZXRdLCBidXR0b24gewogIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogIGZvbnQtc2l6ZTogaW5oZXJpdDsKfQoKLmJ1dHRvbiB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAyNXB4OwogIC1tb3otYm9yZGVyLXJhZGl1czogMjVweDsKICBib3JkZXItcmFkaXVzOiAyNXB4OwogIC1tcy10b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogIHVzZXItc2VsZWN0OiBub25lOwogIGJhY2tncm91bmQtY29sb3I6ICMxMTVmODI7CiAgY29sb3I6ICNmZmY7CiAgZm9udC1zaXplOiAxNnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIHBhZGRpbmc6IDdweCAxZW07CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgbWluLXdpZHRoOiAxMjBweDsKfQouYnV0dG9uLmRpc2FibGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OTk5OwogIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7CiAgY29sb3I6ICM2NjY2NjY7Cn0KLmJ1dHRvbjpob3ZlcjplbmFibGVkLCAuYnV0dG9uOmFjdGl2ZTplbmFibGVkIHsKICBjdXJzb3I6IHBvaW50ZXI7CiAgY29sb3I6ICNmZmY7Cn0KLmJ1dHRvbjpob3ZlcjplbmFibGVkIHsKICAtby10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwgY29sb3IgMC4zcyBlYXNlOwogIC1tb3otdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzIGVhc2UsIGNvbG9yIDAuM3MgZWFzZTsKICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4zcyBlYXNlLCBjb2xvciAwLjNzIGVhc2U7CiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzIGVhc2UsIGNvbG9yIDAuM3MgZWFzZTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzI0ZDVjOwp9Ci5idXR0b246YWN0aXZlOmVuYWJsZWQgewogIC1vLXRyYW5zaXRpb246IG5vbmU7CiAgLW1vei10cmFuc2l0aW9uOiBub25lOwogIC13ZWJraXQtdHJhbnNpdGlvbjogbm9uZTsKICB0cmFuc2l0aW9uOiBub25lOwogIGJhY2tncm91bmQtY29sb3I6ICMyODNlNDk7Cn0KLmJ1dHRvbi5pcy1sYXJnZSB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAyMHB4OwogIC1tb3otYm9yZGVyLXJhZGl1czogMjBweDsKICBib3JkZXItcmFkaXVzOiAyMHB4OwogIHBhZGRpbmc6IDVweCAyNXB4OwogIG1pbi13aWR0aDogMjAwcHg7CiAgZm9udC1zaXplOiAyNHB4Owp9Ci5idXR0b24uaXMtc21hbGwgewogIHBhZGRpbmc6IDVweCAxMnB4OwogIG1pbi13aWR0aDogMTAwcHg7CiAgZm9udC1zaXplOiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNXB4Owp9Ci5idXR0b24uaXMtd2FybmluZyB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q2MDAwMDsKfQouYnV0dG9uLmlzLXdhcm5pbmc6aG92ZXI6ZW5hYmxlZCwgLmJ1dHRvbi5pcy13YXJuaW5nOmFjdGl2ZTplbmFibGVkIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjYjUwMDAwOwp9Ci5idXR0b24uaXMtcG9zaXRpdmVhY3Rpb24gewogIGJhY2tncm91bmQtY29sb3I6ICM3MGQxNmQ7Cn0KLmJ1dHRvbi5pcy1wb3NpdGl2ZWFjdGlvbjpob3ZlcjplbmFibGVkLCAuYnV0dG9uLmlzLXBvc2l0aXZlYWN0aW9uOmFjdGl2ZTplbmFibGVkIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDg5ODAwOwp9Ci5idXR0b24gYTpob3ZlciB7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CgpidXR0b24uYnV0dG9uIHsKICBib3JkZXI6IG5vbmU7Cn0KCmlucHV0W3R5cGU9c3VibWl0XSwgaW5wdXRbdHlwZT1idXR0b25dLCBpbnB1dFt0eXBlPXJlc2V0XSB7CiAgdGV4dC1zaXplLWFkanVzdDogMTAwJTsKICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjsKfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA3NjdweCkgewogIGlucHV0W3R5cGU9c3VibWl0XSwgaW5wdXRbdHlwZT1idXR0b25dLCBpbnB1dFt0eXBlPXJlc2V0XSwgYnV0dG9uLCAuYnRuIHsKICAgIG1hcmdpbjogMWVtIDA7CiAgfQp9CkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7CiAgaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPWJ1dHRvbl0sIGlucHV0W3R5cGU9cmVzZXRdLCBidXR0b24sIC5idG4gewogICAgbWFyZ2luOiAyZW0gYXV0bzsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgd2lkdGg6IDEwMCU7CiAgfQp9Ci50b3AtbGlua3MgewogIHRleHQtYWxpZ246IHJpZ2h0OwogIGRpc3BsYXk6IGZsZXg7CiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICBmbGV4OiAwIDEgMTAwJTsKfQoudG9wLWxpbmtzIC51c2VyLWxldmVsLWFkbWluaXN0cmF0b3IgewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudG9wLWxpbmtzIHAgewogIHBhZGRpbmc6IDAgMTBweDsKfQoKLnRvcC1saW5rcyBwOmxhc3QtY2hpbGQgewogIGRpc3BsYXk6IG5vbmU7Cn0KCi5zaGlwcGluZy1pbmZvIHsKICBkaXNwbGF5OiBmbGV4OwogIGNvbG9yOiAjMDA3MWJjOwogIGZsZXg6IDEgMCBhdXRvOwp9Cgouc2hpcHBpbmctaW5mbyBpbWcgewogIHBhZGRpbmctcmlnaHQ6IDExcHg7Cn0KCi5uYXZpZ2F0aW9uLWhlYWRlciB7CiAgZGlzcGxheTogZmxleDsKfQoKaW5wdXQsIGJ1dHRvbiwgc2VsZWN0LCB0ZXh0YXJlYSB7CiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgZm9udC1zaXplOiBpbmhlcml0Owp9CgppbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwOwogIC1tb3otYm9yZGVyLXJhZGl1czogMDsKICBib3JkZXItcmFkaXVzOiAwOwogIHdpZHRoOiAxMDAlOwogIG1pbi1oZWlnaHQ6IDEuNWVtOwogIGJvcmRlcjogMXB4IHNvbGlkICNlNmU2ZTY7CiAgcGFkZGluZzogMC40ZW07CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICBjb2xvcjogIzMzMzMzMjsKICBtYXJnaW4tYm90dG9tOiAxZW07CiAgbWF4LXdpZHRoOiAxMDAlOwp9CmlucHV0OmhvdmVyLCBzZWxlY3Q6aG92ZXIsIHRleHRhcmVhOmhvdmVyIHsKICBib3JkZXI6IDFweCBzb2xpZCAjY2JkMGQxOwp9CmlucHV0OmZvY3VzLCBzZWxlY3Q6Zm9jdXMsIHRleHRhcmVhOmZvY3VzIHsKICBib3JkZXI6IDFweCBzb2xpZCAjMzMzMzMyOwogIG91dGxpbmU6IDFweCBzb2xpZCAjMzMzMzMyOwp9Cgp0ZXh0YXJlYSB7CiAgd2lkdGg6IDEwMCU7Cn0KCmZvcm0gewogIG1heC13aWR0aDogNzAwcHg7Cn0KZm9ybSBpbnB1dFt0eXBlPXVzZXJuYW1lXSwgZm9ybSBpbnB1dFt0eXBlPXBhc3N3b3JkXSB7CiAgbWF4LXdpZHRoOiA1MCU7CiAgZGlzcGxheTogYmxvY2s7Cn0KZm9ybSBidXR0b24gewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBtYXJnaW46IDFlbSAwOwp9CgpzZWxlY3QgewogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMDsKICAtbW96LWJvcmRlci1yYWRpdXM6IDA7CiAgYm9yZGVyLXJhZGl1czogMDsKICBtYXJnaW46IDRweCAwcHg7CiAgaGVpZ2h0OiAzMHB4OwogIGJvcmRlcjogMXB4IHNvbGlkICNlNmU2ZTY7CiAgcGFkZGluZzogNHB4OwogIGJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7CiAgY29sb3I6ICMzMzMzMzI7CiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgZm9udC1zaXplOiBpbmhlcml0OwogIG1pbi13aWR0aDogMTIwcHg7CiAgbWF4LXdpZHRoOiAzMjBweDsKfQpzZWxlY3Q6Oi1tcy1leHBhbmQgewogIGRpc3BsYXk6IG5vbmU7Cn0Kc2VsZWN0OmhvdmVyIHsKICBib3JkZXI6IDFweCBzb2xpZCAjY2JkMGQxOwp9CnNlbGVjdDpmb2N1cyB7CiAgYm9yZGVyOiAxcHggc29saWQgIzMzMzMzMjsKfQoKLmNvbmZpcm1hdGlvbiB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCmxhYmVsIHsKICBjb2xvcjogIzk5OTsKICBkaXNwbGF5OiBibG9jazsKICBsaW5lLWhlaWdodDogMjVweDsKfQoKLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQtaGlkZGVuIHsKICBtYXgtaGVpZ2h0OiAwOwogIG9wYWNpdHk6IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICB2aXNpYmlsaXR5OiBoaWRkZW47Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQtaGlkZGVuIC5jb250YWluZXIgewogIG1heC1oZWlnaHQ6IDA7Cn0KCi5ub3RpZmljYXRpb24tbGFic29sdmVkIHsKICAtby10cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1pbiAwcywgb3BhY2l0eSAwLjVzIGVhc2UtaW4gMC4ycywgdHJhbnNpdGlvbiAwLjVzIGVhc2UtaW4gMC4yczsKICAtbW96LXRyYW5zaXRpb246IG1heC1oZWlnaHQgMC41cyBlYXNlLWluIDBzLCBvcGFjaXR5IDAuNXMgZWFzZS1pbiAwLjJzLCB0cmFuc2l0aW9uIDAuNXMgZWFzZS1pbiAwLjJzOwogIC13ZWJraXQtdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjVzIGVhc2UtaW4gMHMsIG9wYWNpdHkgMC41cyBlYXNlLWluIDAuMnMsIHRyYW5zaXRpb24gMC41cyBlYXNlLWluIDAuMnM7CiAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjVzIGVhc2UtaW4gMHMsIG9wYWNpdHkgMC41cyBlYXNlLWluIDAuMnMsIHRyYW5zaXRpb24gMC41cyBlYXNlLWluIDAuMnM7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNjYzMzsKICBvcGFjaXR5OiAxOwogIG1heC1oZWlnaHQ6IDEwMHB4OwogIHZpc2liaWxpdHk6IHZpc2libGU7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWRbY29tcGxldGlvbi10eXBlPWluY29tcGxldGVdIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhZjEwOwp9Ci5ub3RpZmljYXRpb24tbGFic29sdmVkW2NvbXBsZXRpb24tdHlwZT1pbmNvbXBsZXRlXSAuY29udGFpbmVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhZjEwOwp9Ci5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgewogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC1tb3otYm94OwogIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiBmbGV4OwogIC13ZWJraXQtYm94LXBhY2s6IGp1c3RpZnk7CiAgLW1vei1ib3gtcGFjazoganVzdGlmeTsKICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAtd2Via2l0LWJveC1hbGlnbjogY2VudGVyOwogIC1tb3otYm94LWFsaWduOiBjZW50ZXI7CiAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAtby10cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1pbiAwcywgcGFkZGluZyAwLjVzIGVhc2UtaW4gMHM7CiAgLW1vei10cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1pbiAwcywgcGFkZGluZyAwLjVzIGVhc2UtaW4gMHM7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuNXMgZWFzZS1pbiAwcywgcGFkZGluZyAwLjVzIGVhc2UtaW4gMHM7CiAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjVzIGVhc2UtaW4gMHMsIHBhZGRpbmcgMC41cyBlYXNlLWluIDBzOwogIGJhY2tncm91bmQtY29sb3I6ICNmZjY2MzM7CiAgbWFyZ2luOiAwIGF1dG87CiAgbWF4LWhlaWdodDogMTAwcHg7CiAgcGFkZGluZzogY2FsYyhjYWxjKDEgKiB2YXIoLS1zcGFjaW5nYmFzZSkpIC0gM3B4KSAwIGNhbGMoMSAqIHZhcigtLXNwYWNpbmdiYXNlKSkgMDsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGg0IHsKICBmbGV4OiAxOwogIG1hcmdpbjogMDsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4Owp9Ci5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgc3BhbiB7CiAgcGFkZGluZy1yaWdodDogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGg0LCAubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGEsIC5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgc3BhbiB7CiAgY29sb3I6ICNmZmY7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBhIHsKICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAtd2Via2l0LWJveC1hbGlnbjogY2VudGVyOwogIC1tb3otYm94LWFsaWduOiBjZW50ZXI7CiAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9Ci5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgYS5idXR0b24gewogIGJhY2tncm91bmQtY29sb3I6ICMzMzMzMzI7CiAgYm9yZGVyLXJhZGl1czogMDsKICBtaW4td2lkdGg6IDA7CiAgcGFkZGluZzogMCA1cHg7CiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBhLmJ1dHRvbjpob3ZlciB7CiAgY29sb3I6ICMzMzMzMzI7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBhLmJ1dHRvbiBzdmcgewogIGZpbGw6IGN1cnJlbnRDb2xvcjsKICBwYWRkaW5nLXJpZ2h0OiA1cHg7Cn0KLm5vdGlmaWNhdGlvbi1sYWJzb2x2ZWQgLmNvbnRhaW5lciBhOmxhc3QtY2hpbGQgewogIC1vLXRyYW5zaXRpb246IGNvbG9yIDAuMnMsIGZpbGwgMC4yczsKICAtbW96LXRyYW5zaXRpb246IGNvbG9yIDAuMnMsIGZpbGwgMC4yczsKICAtd2Via2l0LXRyYW5zaXRpb246IGNvbG9yIDAuMnMsIGZpbGwgMC4yczsKICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzLCBmaWxsIDAuMnM7CiAgcGFkZGluZy1sZWZ0OiAyMHB4Owp9Ci5ub3RpZmljYXRpb24tbGFic29sdmVkIC5jb250YWluZXIgYTpsYXN0LWNoaWxkIHN2ZyB7CiAgZmlsbDogY3VycmVudENvbG9yOwogIHBhZGRpbmctbGVmdDogNXB4OwogIGhlaWdodDogMTJweDsKfQoubm90aWZpY2F0aW9uLWxhYnNvbHZlZCAuY29udGFpbmVyIGE6bGFzdC1jaGlsZDpob3ZlciB7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIGNvbG9yOiAjMzMzMzMyOwp9Cgp0YWJsZSB7CiAgYm9yZGVyLXNwYWNpbmc6IDA7CiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogIG92ZXJmbG93LXg6IGF1dG87CiAgZGlzcGxheTogYmxvY2s7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIG1hcmdpbjogY2FsYygxLjI1ICogdmFyKC0tc3BhY2luZ2Jhc2UpKSAwOwp9CnRhYmxlOmZpcnN0LWNoaWxkIHsKICBtYXJnaW46IDAgMCBjYWxjKDEuMjUgKiB2YXIoLS1zcGFjaW5nYmFzZSkpIDA7Cn0KdGFibGU6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7CiAgbWFyZ2luOiAwOwp9CnRhYmxlIHRyIHsKICBib3JkZXItdG9wOiAxcHggc29saWQgI2U2ZTZlNjsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U2ZTZlNjsKICBtaW4taGVpZ2h0OiAzMXB4Owp9CnRhYmxlIHRyOmZpcnN0LWNoaWxkIHsKICBib3JkZXItdG9wOiBub25lOwp9CnRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICBwYWRkaW5nOiA0cHggMTZweCA0cHggMDsKICB0ZXh0LWFsaWduOiBsZWZ0Owp9CnRhYmxlIHRyIHRkOmxhc3QtY2hpbGQsIHRhYmxlIHRyIHRoOmxhc3QtY2hpbGQgewogIHBhZGRpbmc6IDRweCAwOwp9CnRhYmxlLmlzLWZ1bGx5Ym9yZGVyZWQgdHIgewogIGJvcmRlcjogbm9uZTsKfQp0YWJsZS5pcy1mdWxseWJvcmRlcmVkIHRyIHRkLCB0YWJsZS5pcy1mdWxseWJvcmRlcmVkIHRyIHRoIHsKICBib3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2OwogIHBhZGRpbmc6IDRweCA4cHg7Cn0KdGFibGUuaXMtZnVsbHdpZHRoIHsKICB3aWR0aDogMTAwJTsKICBkaXNwbGF5OiB0YWJsZTsKfQp0YWJsZS5pcy1mdWxsd2lkdGgtbGlzdCB7CiAgd2lkdGg6IDEwMCU7CiAgZGlzcGxheTogdGFibGU7Cn0KdGFibGUuaXMtZnVsbHdpZHRoLWxpc3QgdHIgdGQ6Zmlyc3QtY2hpbGQsIHRhYmxlLmlzLWZ1bGx3aWR0aC1saXN0IHRyIHRoOmZpcnN0LWNoaWxkIHsKICB3aWR0aDogNjUlOwp9CnRhYmxlLmlzLXRhYmxlLWxpc3QgewogIHdpZHRoOiAxMDAlOwogIGRpc3BsYXk6IHRhYmxlOwp9CnRhYmxlLmlzLXRhYmxlLWxpc3QgdHIgewogIC13ZWJraXQtYm94LWFsaWduOiBzdGFydDsKICAtbW96LWJveC1hbGlnbjogc3RhcnQ7CiAgLW1zLWZsZXgtYWxpZ246IHN0YXJ0OwogIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgZGlzcGxheTogLXdlYmtpdC1ib3g7CiAgZGlzcGxheTogLW1vei1ib3g7CiAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogIGRpc3BsYXk6IGZsZXg7CiAgLXdlYmtpdC1ib3gtcGFjazoganVzdGlmeTsKICAtbW96LWJveC1wYWNrOiBqdXN0aWZ5OwogIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7CiAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIGJvcmRlci10b3A6IG5vbmU7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNmU2ZTY7Cn0KdGFibGUuaXMtdGFibGUtbGlzdCB0ciB0ZCwgdGFibGUuaXMtdGFibGUtbGlzdCB0ciB0aCB7CiAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgLW1zLWZsZXgtaXRlbS1hbGlnbjogY2VudGVyOwogIGFsaWduLXNlbGY6IGNlbnRlcjsKfQp0YWJsZS5pcy10YWJsZS1saXN0IHRyIHRkOmZpcnN0LWNoaWxkLCB0YWJsZS5pcy10YWJsZS1saXN0IHRyIHRoOmZpcnN0LWNoaWxkIHsKICAtbW96LWZsZXg6IDE7CiAgLXdlYmtpdC1mbGV4OiAxOwogIC1tcy1mbGV4OiAxOwogIGZsZXg6IDE7Cn0KdGFibGUuaXMtdGFibGUtbGlzdCB0ciB0ZDpsYXN0LWNoaWxkLCB0YWJsZS5pcy10YWJsZS1saXN0IHRyIHRoOmxhc3QtY2hpbGQgewogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KdGFibGUuaXMtdGFibGUtbGlzdCB0ciB0ZDpsYXN0LWNoaWxkIHsKICBjb2xvcjogI2IzYjNiMzsKfQp0YWJsZS5pcy10YWJsZS1udW1iZXJzIHRyIHsKICAtd2Via2l0LWJveC1hbGlnbjogc3RhcnQ7CiAgLW1vei1ib3gtYWxpZ246IHN0YXJ0OwogIC1tcy1mbGV4LWFsaWduOiBzdGFydDsKICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC1tb3otYm94OwogIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiBmbGV4OwogIC13ZWJraXQtYm94LXBhY2s6IGp1c3RpZnk7CiAgLW1vei1ib3gtcGFjazoganVzdGlmeTsKICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBib3JkZXItdG9wOiBub25lOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTZlNmU2Owp9CnRhYmxlLmlzLXRhYmxlLW51bWJlcnMgdHIgdGgsIHRhYmxlLmlzLXRhYmxlLW51bWJlcnMgdHIgdGQgewogIC13ZWJraXQtYWxpZ24tc2VsZjogY2VudGVyOwogIC1tcy1mbGV4LWl0ZW0tYWxpZ246IGNlbnRlcjsKICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgbWluLXdpZHRoOiAxMTBweDsKfQp0YWJsZS5pcy10YWJsZS1udW1iZXJzIHRyIHRoOmZpcnN0LWNoaWxkLCB0YWJsZS5pcy10YWJsZS1udW1iZXJzIHRyIHRkOmZpcnN0LWNoaWxkIHsKICAtbW96LWZsZXg6IDE7CiAgLXdlYmtpdC1mbGV4OiAxOwogIC1tcy1mbGV4OiAxOwogIGZsZXg6IDE7Cn0KdGFibGUuaXMtdGFibGUtbnVtYmVycyB0ciB0ZCB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAtbXMtZmxleC1pdGVtLWFsaWduOiBlbmQ7CiAgYWxpZ24tc2VsZjogZmxleC1lbmQ7Cn0KdGFibGUuaXMtdGFibGUtaW5mb3JtYXRpb24gdHIgewogIGJvcmRlcjogbm9uZTsKICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7Cn0KdGFibGUuaXMtdGFibGUtaW5mb3JtYXRpb24gdHIgdGggewogIHRleHQtYWxpZ246IHJpZ2h0OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgdmVydGljYWwtYWxpZ246IHRvcDsKfQp0YWJsZS5pcy10YWJsZS1pbmZvcm1hdGlvbiB0ci50eXBpbmcgdGQgewogIGFuaW1hdGlvbjogdHlwaW5nIDhzIGxpbmVhciBpbmZpbml0ZTsKfQp0YWJsZS5pcy10YWJsZS1tdWx0aWRpcmVjdGlvbiB0ciB0aDpmaXJzdC1jaGlsZCB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KdGFibGUuaXMtdGFibGUtbG9uZ2Rlc2NyaXB0aW9uIHRyIHRoLCB0YWJsZS5pcy10YWJsZS1sb25nZGVzY3JpcHRpb24gdHIgdGQgewogIGRpc3BsYXk6IGJsb2NrOwp9CgpAa2V5ZnJhbWVzIHR5cGluZyB7CiAgODUlIHsKICAgIG9wYWNpdHk6IDE7CiAgfQogIDg2JSB7CiAgICBvcGFjaXR5OiAwOwogIH0KICA5NSUgewogICAgb3BhY2l0eTogMDsKICB9CiAgOTYlIHsKICAgIG9wYWNpdHk6IDE7CiAgfQp9Ci5zZWFyY2gsIC5zZWFyY2gtZmlsdGVycywgLmxvZ2luLWZvcm0gewogIGJhY2tncm91bmQ6ICNlYmYwZjI7CiAgcGFkZGluZzogMWVtOwp9Ci5zZWFyY2ggaW5wdXQsIC5zZWFyY2ggdGV4dGFyZWEsIC5zZWFyY2gtZmlsdGVycyBpbnB1dCwgLnNlYXJjaC1maWx0ZXJzIHRleHRhcmVhLCAubG9naW4tZm9ybSBpbnB1dCwgLmxvZ2luLWZvcm0gdGV4dGFyZWEgewogIGJhY2tncm91bmQ6IHdoaXRlOwp9Ci5zZWFyY2ggaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIsIC5zZWFyY2ggdGV4dGFyZWE6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIsIC5zZWFyY2gtZmlsdGVycyBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyLCAubG9naW4tZm9ybSBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciwgLmxvZ2luLWZvcm0gdGV4dGFyZWE6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogIGNvbG9yOiAjOTk5Owp9Ci5zZWFyY2ggaW5wdXQ6LW1vei1wbGFjZWhvbGRlciwgLnNlYXJjaCB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyLCAuc2VhcmNoLWZpbHRlcnMgaW5wdXQ6LW1vei1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIHRleHRhcmVhOi1tb3otcGxhY2Vob2xkZXIsIC5sb2dpbi1mb3JtIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIsIC5sb2dpbi1mb3JtIHRleHRhcmVhOi1tb3otcGxhY2Vob2xkZXIgewogIGNvbG9yOiAjOTk5Owp9Ci5zZWFyY2ggaW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIsIC5zZWFyY2ggdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXIsIC5zZWFyY2gtZmlsdGVycyBpbnB1dDo6LW1vei1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIHRleHRhcmVhOjotbW96LXBsYWNlaG9sZGVyLCAubG9naW4tZm9ybSBpbnB1dDo6LW1vei1wbGFjZWhvbGRlciwgLmxvZ2luLWZvcm0gdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXIgewogIGNvbG9yOiAjOTk5Owp9Ci5zZWFyY2ggaW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyLCAuc2VhcmNoIHRleHRhcmVhOi1tcy1pbnB1dC1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIGlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlciwgLnNlYXJjaC1maWx0ZXJzIHRleHRhcmVhOi1tcy1pbnB1dC1wbGFjZWhvbGRlciwgLmxvZ2luLWZvcm0gaW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyLCAubG9naW4tZm9ybSB0ZXh0YXJlYTotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogIGNvbG9yOiAjOTk5Owp9CgoubG9naW4tZm9ybSBpbWcgewogIG1hcmdpbi1yaWdodDogMWVtOwogIHdpZHRoOiA1ZW07Cn0KCi5zZWFyY2ggewogIGNvbG9yOiB3aGl0ZTsKfQouc2VhcmNoIGZvcm0gewogIGRpc3BsYXk6IC13ZWJraXQtYm94OwogIGRpc3BsYXk6IC1tb3otYm94OwogIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICBkaXNwbGF5OiBmbGV4OwogIG1hcmdpbjogMCBhdXRvOwp9Ci5zZWFyY2ggZm9ybSBpbnB1dCB7CiAgLW1vei1mbGV4OiAxIDEgYXV0bzsKICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogIC1tcy1mbGV4OiAxIDEgYXV0bzsKICBmbGV4OiAxIDEgYXV0bzsKICBtYXJnaW4tYm90dG9tOiAwOwp9Ci5zZWFyY2ggZm9ybSBpbnB1dDpob3ZlciB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NiZDBkMTsKfQouc2VhcmNoIGZvcm0gaW5wdXQ6Zm9jdXMgewogIGJvcmRlcjogMXB4IHNvbGlkICMzMzMzMzI7CiAgb3V0bGluZTogMXB4IHNvbGlkICMzMzMzMzI7Cn0KLnNlYXJjaCBmb3JtIGJ1dHRvbiB7CiAgbWFyZ2luOiAwIDAgMCAwLjZlbTsKfQoKLnNlYXJjaC1maWx0ZXJzIHsKICBjb2xvcjogd2hpdGU7Cn0KLnNlYXJjaC1maWx0ZXJzIGEgewogIGJvcmRlcjogMXB4IHNvbGlkIHdoaXRlOwogIHBhZGRpbmc6IDRweCA1cHg7CiAgbWFyZ2luOiAzcHggMDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLnNlYXJjaC1maWx0ZXJzIGE6aG92ZXIgewogIC1vLXRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycyBsaW5lYXI7CiAgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnMgbGluZWFyOwogIC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzIGxpbmVhcjsKICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMnMgbGluZWFyOwogIGJhY2tncm91bmQ6ICNmZmY7CiAgYm9yZGVyOiAxcHggc29saWQgI2NiZDBkMTsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KLnNlYXJjaC1maWx0ZXJzIGE6Zm9jdXMgewogIGJvcmRlcjogMXB4IHNvbGlkICMzMzMzMzI7Cn0KCiNteXN0ZXJ5T2JqZWN0aXZlIHsKICBtYXJnaW4tdG9wOiAwLjVlbTsKfQoKI215c3RlcnlPYmplY3RpdmUucmV2ZWFsZWQgewogIGZvbnQtc2l6ZTogMC44ZW07Cn0KCiNteXN0ZXJ5UmV2ZWFsLCAjbXlzdGVyeUxpbmsgewogIGN1cnNvcjogcG9pbnRlcjsKfQoKQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICJKb3NlZmluIFNhbnMiOwogIHNyYzogdXJsKCIvcmVzb3VyY2VzL2ZvbnRzL0pvc2VmaW5TYW5zL0pvc2VmaW5TYW5zLUJvbGQuZW90Iik7CiAgc3JjOiB1cmwoIi9yZXNvdXJjZXMvZm9udHMvSm9zZWZpblNhbnMvSm9zZWZpblNhbnMtQm9sZC5lb3Q/I2llZml4IikgZm9ybWF0KCJlbWJlZGRlZC1vcGVudHlwZSIpLCB1cmwoIi9yZXNvdXJjZXMvZm9udHMvSm9zZWZpblNhbnMvSm9zZWZpblNhbnMtQm9sZC53b2ZmIikgZm9ybWF0KCJ3b2ZmIiksIHVybCgiL3Jlc291cmNlcy9mb250cy9Kb3NlZmluU2Fucy9Kb3NlZmluU2Fucy1Cb2xkLnR0ZiIpIGZvcm1hdCgidHJ1ZXR5cGUiKTsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC1kaXNwbGF5OiBzd2FwOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAicG9wcGluc3JlZ3VsYXIiOwogIHNyYzogdXJsKCIvcmVzb3VyY2VzL2ZvbnRzL1BvcHBpbnMvcG9wcGlucy53b2ZmIikgZm9ybWF0KCJ3b2ZmIik7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICJwb3BwaW5zYm9sZCI7CiAgc3JjOiB1cmwoIi9yZXNvdXJjZXMvZm9udHMvUG9wcGlucy9wb3BwaW5zLWJvbGQud29mZiIpIGZvcm1hdCgid29mZiIpOwp9CkBrZXlmcmFtZXMgYm91bmNlSW4gewogIDAlIHsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMyk7CiAgfQogIDUwJSB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICB9CiAgNzAlIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC44KTsKICB9CiAgMTAwJSB7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogIH0KfQpib2R5IHsKICBmb250LWZhbWlseTogcG9wcGluc3JlZ3VsYXIsIEFyaWFsLCAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cn0KYm9keSBoMSwgYm9keSBoMiwgYm9keSBoMywgYm9keSBoNCwgYm9keSBoNSB7CiAgZm9udC1mYW1pbHk6ICJKb3NlZmluIFNhbnMiLCBBcmlhbCwgIkhlbHZldGljYSBOZXVlIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwp9CgppbnB1dCwgdGV4dGFyZWEgewogIHBhZGRpbmctbGVmdDogMjBweDsKICBwYWRkaW5nLXJpZ2h0OiAyMHB4Owp9CgpbdGhlbWU9c2Nhbm1lXSAubWFpbmNvbnRhaW5lciB7CiAgYmFja2dyb3VuZDogIzAwMTM1MDsKfQpbdGhlbWU9c2Nhbm1lXSAuc2Nhbm1lLWltYWdlIHsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbWFyZ2luOiAyLjVlbSAwIDJlbSAwOwogIGZvbnQtc2l6ZTogMTNweDsKfQpbdGhlbWU9c2Nhbm1lXSAuc2Nhbm1lLWltYWdlIGltZyB7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgbWFyZ2luLXJpZ2h0OiBhdXRvOwogIHdpZHRoOiA1MCU7Cn0KClt0aGVtZT1ob21lXSAucHJvZHVjdHNEZXNjcmlwdGlvbiB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9Clt0aGVtZT1ob21lXSAucHJvZHVjdHNEZXNjcmlwdGlvbiBwIHsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgZm9udC1zaXplOiAxNnB4OwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgbGluZS1oZWlnaHQ6IDMwcHg7CiAgY29sb3I6ICMwMDAwMjM7Cn0KW3RoZW1lPWhvbWVdIC5wcm9kdWN0c0Rlc2NyaXB0aW9uIHAgLmxpbmsgewogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogIGN1cnNvcjogcG9pbnRlcjsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1NTBweCkgewogIFt0aGVtZT1ob21lXSAucHJvZHVjdHNEZXNjcmlwdGlvbiBwIHsKICAgIGZvbnQtc2l6ZTogMjBweDsKICB9Cn0KW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0IHsKICBtYXJnaW46IDAgMCAxMnB4OwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IHJvdzsKICBhbGlnbi1pdGVtczogY2VudGVyOwp9Clt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAuY29udGFpbmVyLWxpc3Qtd3JhcHBlciB7CiAgZmxleDogMTsKICBvdmVyZmxvdzogaGlkZGVuOwp9Clt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAuY29udGFpbmVyLWxpc3Qtd3JhcHBlciAuY29udGFpbmVyLWxpc3QtdGlsZXMgewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IHJvdzsKfQpbdGhlbWU9aG9tZV0gLnByb2R1Y3RzUHJldmlld0xpc3QgLmNvbnRhaW5lci1saXN0LXdyYXBwZXIgLmNvbnRhaW5lci1saXN0LXRpbGVzLmhhcy1jYXJvdXNlbCB7CiAgZmxleC13cmFwOiBub3dyYXA7CiAgdHJhbnNpdGlvbjogMjUwbXMgdHJhbnNmb3JtIGVhc2UtaW47Cn0KW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0IC5jb250YWluZXItbGlzdC13cmFwcGVyIC5jb250YWluZXItbGlzdC10aWxlcy5oYXMtY2Fyb3VzZWwgPiBhIHsKICBtaW4td2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiBhdXRvOwp9Clt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAuY29udGFpbmVyLWxpc3Qtd3JhcHBlciAuY29udGFpbmVyLWxpc3QtdGlsZXMgPiBhIHsKICBib3JkZXItcmFkaXVzOiAyNHB4OwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBmb250LXNpemU6IDIwcHg7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBtYXgtd2lkdGg6IDMwJTsKfQpbdGhlbWU9aG9tZV0gLnByb2R1Y3RzUHJldmlld0xpc3QgLmNvbnRhaW5lci1saXN0LXdyYXBwZXIgLmNvbnRhaW5lci1saXN0LXRpbGVzID4gYTpob3ZlciB7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9Clt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAuY29udGFpbmVyLWxpc3Qtd3JhcHBlciAuY29udGFpbmVyLWxpc3QtdGlsZXMgPiBhID4gaW1nOmZpcnN0LW9mLXR5cGUgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogYXV0bzsKICBib3JkZXI6IG5vbmU7Cn0KW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0IC5jb250YWluZXItbGlzdC13cmFwcGVyIC5jb250YWluZXItbGlzdC10aWxlcyA+IGEgPiBpbWc6bnRoLW9mLXR5cGUoMikgewogIHdpZHRoOiAxMDBweDsKICBtYXJnaW4tYm90dG9tOiAzMHB4Owp9Clt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAuY29udGFpbmVyLWxpc3Qtd3JhcHBlciAuY29udGFpbmVyLWxpc3QtdGlsZXMgPiBhIGgzIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGZvbnQtc2l6ZTogMjJweDsKICBsaW5lLWhlaWdodDogMjVweDsKICBjb2xvcjogIzAwMDAyMzsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0IC5jb250YWluZXItbGlzdC13cmFwcGVyIC5jb250YWluZXItbGlzdC10aWxlcyA+IGEgLmJ1dHRvbiB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmctbGVmdDogMzRweDsKICBwYWRkaW5nLXJpZ2h0OiAzNHB4OwogIGhlaWdodDogNDRweDsKICBmb250LXNpemU6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBib3JkZXItcmFkaXVzOiAwOwogIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGJhY2tncm91bmQ6ICMwMDEzNTA7CiAgY29sb3I6ICNDRTk0MDA7Cn0KW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0IC5jb250YWluZXItbGlzdC13cmFwcGVyIC5jb250YWluZXItbGlzdC10aWxlcyA+IGEgLmJ1dHRvbjpob3ZlciwgW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0IC5jb250YWluZXItbGlzdC13cmFwcGVyIC5jb250YWluZXItbGlzdC10aWxlcyA+IGEgLmJ1dHRvbjphY3RpdmUgewogIGJhY2tncm91bmQ6ICMxQTI0NjE7Cn0KW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0IC5jb250YWluZXItbGlzdC13cmFwcGVyIC5jb250YWluZXItbGlzdC10aWxlcyA+IGEgLnByaWNlIHsKICBjb2xvcjogIzAwMDAyMzsKICBmb250LWZhbWlseTogcG9wcGluc2JvbGQsIEFyaWFsLCAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogIFt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCB7CiAgICBtYXJnaW46IDI0cHggMCAxMnB4OwogIH0KICBbdGhlbWU9aG9tZV0gLnByb2R1Y3RzUHJldmlld0xpc3QgLmNvbnRhaW5lci1saXN0LXRpbGVzID4gYSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9Cn0KW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0ICsgYSB7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICBmb250LXNpemU6IDE2cHg7CiAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHRleHQtZGVjb3JhdGlvbi1saW5lOiB1bmRlcmxpbmU7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luOiAzMHB4IGF1dG8gNTBweDsKICBjb2xvcjogIzAwMDAyMzsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9Clt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAucHJldi1hcnJvdywKW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0IC5uZXh0LWFycm93IHsKICB6LWluZGV4OiAxMDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgaGVpZ2h0OiAyNHB4OwogIHdpZHRoOiAyNHB4OwogIG1hcmdpbjogMCAxMnB4OwogIGJvcmRlci1yYWRpdXM6IDUwJTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdHJhbnNpdGlvbjogMTUwbXMgYWxsIGVhc2UtaW47Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsKICBbdGhlbWU9aG9tZV0gLnByb2R1Y3RzUHJldmlld0xpc3QgLnByZXYtYXJyb3csClt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAubmV4dC1hcnJvdyB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KfQpbdGhlbWU9aG9tZV0gLnByb2R1Y3RzUHJldmlld0xpc3QgLnByZXYtYXJyb3c6aG92ZXIsClt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAubmV4dC1hcnJvdzpob3ZlciB7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDJweCAxM3B4IDAgZ3JheTsKICAtbW96LWJveC1zaGFkb3c6IDAgMnB4IDEzcHggMCBncmF5OwogIGJveC1zaGFkb3c6IDAgMnB4IDEzcHggMCBncmF5Owp9Clt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAucHJldi1hcnJvdzphZnRlciwKW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0IC5wcmV2LWFycm93OmJlZm9yZSwKW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0IC5uZXh0LWFycm93OmFmdGVyLApbdGhlbWU9aG9tZV0gLnByb2R1Y3RzUHJldmlld0xpc3QgLm5leHQtYXJyb3c6YmVmb3JlIHsKICBjb250ZW50OiAiIjsKICBoZWlnaHQ6IDEwcHg7CiAgd2lkdGg6IDJweDsKICBib3JkZXItcmFkaXVzOiAxMHB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAxMHB4OwogIGJhY2tncm91bmQtY29sb3I6ICMwMDAwMjM7Cn0KW3RoZW1lPWhvbWVdIC5wcm9kdWN0c1ByZXZpZXdMaXN0IC5uZXh0LWFycm93OmFmdGVyLApbdGhlbWU9aG9tZV0gLnByb2R1Y3RzUHJldmlld0xpc3QgLm5leHQtYXJyb3c6YmVmb3JlIHsKICBsZWZ0OiAxMnB4Owp9Clt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAucHJldi1hcnJvdzphZnRlciB7CiAgdG9wOiA0cHg7CiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpOwp9Clt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAucHJldi1hcnJvdzpiZWZvcmUgewogIHRvcDogMTBweDsKICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpOwp9Clt0aGVtZT1ob21lXSAucHJvZHVjdHNQcmV2aWV3TGlzdCAubmV4dC1hcnJvdzphZnRlciB7CiAgdG9wOiA0cHg7CiAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTsKfQpbdGhlbWU9aG9tZV0gLnByb2R1Y3RzUHJldmlld0xpc3QgLm5leHQtYXJyb3c6YmVmb3JlIHsKICB0b3A6IDEwcHg7CiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpOwp9Clt0aGVtZT1ob21lXSAudGl0bGVCYW5uZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBoZWlnaHQ6IDM1MHB4OwogIGJhY2tncm91bmQ6IHVybCgiL3Jlc291cmNlcy9pbWFnZXMvaGVyb19iYW5uZXJfYmFja2dyb3VuZDEuanBnIikgc2Nyb2xsIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0OwogIGJhY2tncm91bmQtc2l6ZTogY292ZXI7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDcyMHB4KSB7CiAgW3RoZW1lPWhvbWVdIC50aXRsZUJhbm5lciB7CiAgICBoZWlnaHQ6IDYxNnB4OwogIH0KfQpbdGhlbWU9aG9tZV0gLnRpdGxlQmFubmVyIGEgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgcGFkZGluZy1sZWZ0OiAzNHB4OwogIHBhZGRpbmctcmlnaHQ6IDM0cHg7CiAgaGVpZ2h0OiA0NHB4OwogIGZvbnQtc2l6ZTogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGJvcmRlci1yYWRpdXM6IDA7CiAgdHJhbnNpdGlvbjogYWxsIGVhc2UtaW4tb3V0IDMwMG1zOwogIGN1cnNvcjogcG9pbnRlcjsKICBmb250LXdlaWdodDogNjAwOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgYmFja2dyb3VuZDogI0NFOTQwMDsKICBjb2xvcjogIzAwMTM1MDsKICBib3R0b206IDQwcHg7CiAgbGVmdDogNTAlOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDApOwogIHotaW5kZXg6IDE1OwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQpbdGhlbWU9aG9tZV0gLnRpdGxlQmFubmVyIGE6aG92ZXIsIFt0aGVtZT1ob21lXSAudGl0bGVCYW5uZXIgYTphY3RpdmUgewogIGJhY2tncm91bmQ6ICNGRUI5MDc7Cn0KW3RoZW1lPWhvbWVdIC50aXRsZUJhbm5lciAuZ2xvdyB7CiAgYmFja2dyb3VuZDogdXJsKCIvcmVzb3VyY2VzL2ltYWdlcy9oZXJvX2Jhbm5lcl9iYWNrZ3JvdW5kMi5wbmciKSBzY3JvbGwgY2VudGVyIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBhdXRvIDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIHdpZHRoOiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQpbdGhlbWU9aG9tZV0gLnRpdGxlQmFubmVyIC5nbG93IC5ib3R0bGVPbmUsClt0aGVtZT1ob21lXSAudGl0bGVCYW5uZXIgLmdsb3cgLmJvdHRsZVR3bywKW3RoZW1lPWhvbWVdIC50aXRsZUJhbm5lciAuZ2xvdyAuYm90dGxlVGhyZWUgewogIG1heC1oZWlnaHQ6IDEwMCU7CiAgdHJhbnNpdGlvbjogYWxsIGVhc2UtaW4tb3V0IDMwMG1zOwp9Clt0aGVtZT1ob21lXSAudGl0bGVCYW5uZXIgLmdsb3cgLmJvdHRsZU9uZSB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTA1cHgsIDApOwp9Clt0aGVtZT1ob21lXSAudGl0bGVCYW5uZXIgLmdsb3cgLmJvdHRsZVR3byB7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwNXB4LCAwKTsKfQpbdGhlbWU9aG9tZV0gLnRpdGxlQmFubmVyIC5nbG93IC5ib3R0bGVUaHJlZSB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHotaW5kZXg6IDU7CiAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgW3RoZW1lPWhvbWVdIC50aXRsZUJhbm5lciAuZ2xvdyAuYm90dGxlVGhyZWUgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICB9Cn0KW3RoZW1lPWhvbWVdIC5ibG9nUG9zdExpc3QgewogIGRpc3BsYXk6IGdyaWQ7CiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAxZnI7CiAgZ2FwOiAyMHB4IDQwcHg7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzIwcHgpIHsKICBbdGhlbWU9aG9tZV0gLmJsb2dQb3N0TGlzdCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7CiAgfQp9Clt0aGVtZT1ob21lXSAuYmxvZ1Bvc3RMaXN0IC5ibG9nLXBvc3QgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBiYWNrZ3JvdW5kOiAjMDAxMzUwOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9Clt0aGVtZT1ob21lXSAuYmxvZ1Bvc3RMaXN0IC5ibG9nLXBvc3QgYTpmaXJzdC1vZi10eXBlIHsKICBkaXNwbGF5OiBibG9jazsKfQpbdGhlbWU9aG9tZV0gLmJsb2dQb3N0TGlzdCAuYmxvZy1wb3N0IGltZyB7CiAgbWF4LXdpZHRoOiAxMDAlOwogIGRpc3BsYXk6IGJsb2NrOwogIG9wYWNpdHk6IDAuNDsKICB0cmFuc2l0aW9uOiBvcGFjaXR5IGVhc2UtaW4tb3V0IDMwMG1zOwp9Clt0aGVtZT1ob21lXSAuYmxvZ1Bvc3RMaXN0IC5ibG9nLXBvc3QgaDIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiA1MCU7CiAgdG9wOiA1MiU7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTE0MCUpOwogIGNvbG9yOiAjZmZmOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgd2lkdGg6IDkwJTsKICBtYXJnaW46IDAgYXV0bzsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KW3RoZW1lPWhvbWVdIC5ibG9nUG9zdExpc3QgLmJsb2ctcG9zdCAuYnV0dG9uIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogNTAlOwogIHRvcDogNjIlOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBwYWRkaW5nLWxlZnQ6IDM0cHg7CiAgcGFkZGluZy1yaWdodDogMzRweDsKICBoZWlnaHQ6IDQ0cHg7CiAgZm9udC1zaXplOiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgYm9yZGVyLXJhZGl1czogMDsKICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbi1vdXQgMzAwbXM7CiAgY3Vyc29yOiBwb2ludGVyOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICBiYWNrZ3JvdW5kOiAjQ0U5NDAwOwogIGNvbG9yOiAjMDAxMzUwOwp9Clt0aGVtZT1ob21lXSAuYmxvZ1Bvc3RMaXN0IC5ibG9nLXBvc3QgLmJ1dHRvbjpob3ZlciwgW3RoZW1lPWhvbWVdIC5ibG9nUG9zdExpc3QgLmJsb2ctcG9zdCAuYnV0dG9uOmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogI0ZFQjkwNzsKfQpbdGhlbWU9aG9tZV0gLmJsb2dQb3N0TGlzdCArIGEgewogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgZm9udC1zaXplOiAxNnB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB0ZXh0LWRlY29yYXRpb24tbGluZTogdW5kZXJsaW5lOwogIGRpc3BsYXk6IGJsb2NrOwogIG1hcmdpbjogNTBweCBhdXRvIDUwcHg7CiAgY29sb3I6ICMwMDAwMjM7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKW3RoZW1lPWFib3V0XSAubWFpbmNvbnRhaW5lciB7CiAgYmFja2dyb3VuZDogIzAwMTM1MDsKfQpbdGhlbWU9YWJvdXRdIC5tYWluY29udGFpbmVyIC5jb250YWluZXIgewogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogIGNvbG9yOiAjZmZmOwp9Clt0aGVtZT1hYm91dF0gLm1haW5jb250YWluZXIgLmNvbnRhaW5lciBoMyB7CiAgY29sb3I6ICNmZmY7Cn0KW3RoZW1lPWFib3V0XSBoMSB7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1hcmdpbi10b3A6IDMwcHg7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgZm9udC1zaXplOiAzMHB4OwogIGNvbG9yOiAjZmZmOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgW3RoZW1lPWFib3V0XSBoMSB7CiAgICBmb250LXNpemU6IDUwcHg7CiAgfQp9Clt0aGVtZT1hYm91dF0gLnRpdGxlQmFubmVyIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgaGVpZ2h0OiAzNTBweDsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQpbdGhlbWU9YWJvdXRdIC50aXRsZUJhbm5lcjpiZWZvcmUgewogIGNvbnRlbnQ6ICIiOwogIGRpc3BsYXk6IGJsb2NrOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7CiAgbGVmdDogMDsKICBoZWlnaHQ6IDEwMCU7CiAgd2lkdGg6IDEwMCU7CiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCByaWdodCwgI0ZGQjI5OSA1MCUsICM1QjRGRkYgNTAlKTsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3MjBweCkgewogIFt0aGVtZT1hYm91dF0gLnRpdGxlQmFubmVyIHsKICAgIGhlaWdodDogNjE2cHg7CiAgfQp9Clt0aGVtZT1hYm91dF0gLnRpdGxlQmFubmVyIGEgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgcGFkZGluZy1sZWZ0OiAzNHB4OwogIHBhZGRpbmctcmlnaHQ6IDM0cHg7CiAgaGVpZ2h0OiA0NHB4OwogIGZvbnQtc2l6ZTogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGJvcmRlci1yYWRpdXM6IDA7CiAgdHJhbnNpdGlvbjogYWxsIGVhc2UtaW4tb3V0IDMwMG1zOwogIGN1cnNvcjogcG9pbnRlcjsKICBmb250LXdlaWdodDogNjAwOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgYmFja2dyb3VuZDogI0NFOTQwMDsKICBjb2xvcjogIzAwMTM1MDsKICBib3R0b206IDQwcHg7CiAgbGVmdDogNTAlOwogIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIDApOwogIHotaW5kZXg6IDE1OwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQpbdGhlbWU9YWJvdXRdIC50aXRsZUJhbm5lciBhOmhvdmVyLCBbdGhlbWU9YWJvdXRdIC50aXRsZUJhbm5lciBhOmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogI0ZFQjkwNzsKfQpbdGhlbWU9YWJvdXRdIC50aXRsZUJhbm5lciAuZ2xvdyB7CiAgYmFja2dyb3VuZDogdXJsKCIvcmVzb3VyY2VzL2ltYWdlcy9oZXJvX2Jhbm5lcl9iYWNrZ3JvdW5kMi5wbmciKSBzY3JvbGwgY2VudGVyIGNlbnRlciBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBhdXRvIDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIHdpZHRoOiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQpbdGhlbWU9YWJvdXRdIC50aXRsZUJhbm5lciAuZ2xvdyAuYm90dGxlT25lLApbdGhlbWU9YWJvdXRdIC50aXRsZUJhbm5lciAuZ2xvdyAuYm90dGxlVHdvLApbdGhlbWU9YWJvdXRdIC50aXRsZUJhbm5lciAuZ2xvdyAuYm90dGxlVGhyZWUgewogIG1heC1oZWlnaHQ6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKfQpbdGhlbWU9YWJvdXRdIC50aXRsZUJhbm5lciAuZ2xvdyAuYm90dGxlT25lIHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMjBweCwgMCkgc2NhbGUoMC45KTsKfQpbdGhlbWU9YWJvdXRdIC50aXRsZUJhbm5lciAuZ2xvdyAuYm90dGxlVHdvIHsKICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTIwcHgsIDApIHNjYWxlKDAuOSk7Cn0KW3RoZW1lPWFib3V0XSAudGl0bGVCYW5uZXIgLmdsb3cgLmJvdHRsZVRocmVlIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogNTsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA5MzBweCkgewogIFt0aGVtZT1hYm91dF0gLnRpdGxlQmFubmVyIC5nbG93IC5ib3R0bGVPbmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoNjVweCwgMCkgc2NhbGUoMSk7CiAgfQogIFt0aGVtZT1hYm91dF0gLnRpdGxlQmFubmVyIC5nbG93IC5ib3R0bGVUd28gewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTY1cHgsIDApIHNjYWxlKDEpOwogIH0KfQpbdGhlbWU9YWJvdXRdIC5hYm91dC1jb250ZW50IGgzIHsKICBmb250LXdlaWdodDogNzAwOwogIGZvbnQtc2l6ZTogMTZweDsKICBsaW5lLWhlaWdodDogMjRweDsKfQpbdGhlbWU9YWJvdXRdIC5hYm91dC1jb250ZW50IHAgewogIGZvbnQtc2l6ZTogMTRweDsKfQpbdGhlbWU9YWJvdXRdIC5hYm91dC1jb250ZW50IGEgewogIGNvbG9yOiAjZmZmOwogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEwMjRweCkgewogIFt0aGVtZT1hYm91dF0gLmFib3V0LWNvbnRlbnQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7CiAgICBncmlkLXRlbXBsYXRlLXJvd3M6IDFmcjsKICAgIGdyaWQtY29sdW1uLWdhcDogNDBweDsKICAgIGdyaWQtcm93LWdhcDogNDBweDsKICB9Cn0KW3RoZW1lPWFib3V0XSAuYWJvdXQtdmlkZW8td3JhcHBlciB7CiAgZGlzcGxheTogbm9uZTsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMDI0cHgpIHsKICBbdGhlbWU9YWJvdXRdIC5hYm91dC12aWRlby13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGluaXRpYWw7CiAgfQogIFt0aGVtZT1hYm91dF0gLmFib3V0LXZpZGVvLXdyYXBwZXIgLmFib3V0LXZpZGVvIHsKICAgIG1hcmdpbi1ib3R0b206IDM1cHg7CiAgfQogIFt0aGVtZT1hYm91dF0gLmFib3V0LXZpZGVvLXdyYXBwZXIgdmlkZW8gewogICAgd2lkdGg6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogIH0KICBbdGhlbWU9YWJvdXRdIC5hYm91dC12aWRlby13cmFwcGVyIGltZyB7CiAgICB3aWR0aDogMTAwJTsKICB9Cn0KW3RoZW1lPWFib3V0XSAuYWJvdXQtZGVzY3JpcHRpb24gLmFib3V0LXRleHQgewogIG1hcmdpbi1ib3R0b206IDMwcHg7Cn0KW3RoZW1lPWFib3V0XSAuYWJvdXQtZGVzY3JpcHRpb24gaDMgewogIGZvbnQtZmFtaWx5OiAicG9wcGluc3JlZ3VsYXIiLCBzYW5zLXNlcmlmOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9Clt0aGVtZT1hYm91dF0gLmFib3V0LWRlc2NyaXB0aW9uIHZpZGVvIHsKICB3aWR0aDogMTAwJTsKICBvYmplY3QtZml0OiBjb250YWluOwogIG1hcmdpbi1ib3R0b206IDIwcHg7Cn0KW3RoZW1lPWFib3V0XSAuYWJvdXQtZGVzY3JpcHRpb24gaW1nIHsKICB3aWR0aDogMTAwJTsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMDI0cHgpIHsKICBbdGhlbWU9YWJvdXRdIC5hYm91dC1kZXNjcmlwdGlvbiAuYWJvdXQtdmlkZW8sClt0aGVtZT1hYm91dF0gLmFib3V0LWRlc2NyaXB0aW9uIC5hYm91dC1pbWFnZSB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KfQoKW3RoZW1lPW1pc3NpbmddIC5tYWluY29udGFpbmVyIHsKICBiYWNrZ3JvdW5kOiAjMDAxMzUwOwp9Clt0aGVtZT1taXNzaW5nXSAubWFpbmNvbnRhaW5lciAuY29udGFpbmVyIHsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICBjb2xvcjogI2ZmZjsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KW3RoZW1lPW1pc3NpbmddIG9iamVjdCB7CiAgbWF4LXdpZHRoOiA4NDBweDsKICBtYXJnaW46IDAgYXV0bzsKfQpbdGhlbWU9bWlzc2luZ10gLm1pc3NpbmctY29udGVudCB7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1hcmdpbi1ib3R0b206IC0zMTZweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogMzsKfQpbdGhlbWU9bWlzc2luZ10gLm1pc3NpbmctY29udGVudCBoMiB7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBmb250LXNpemU6IDMwcHg7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKICBtYXJnaW4tdG9wOiA4MHB4OwogIGNvbG9yOiAjZmZmOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDU5OHB4KSB7CiAgW3RoZW1lPW1pc3NpbmddIC5taXNzaW5nLWNvbnRlbnQgaDIgewogICAgZm9udC1zaXplOiA0MHB4OwogIH0KfQpbdGhlbWU9bWlzc2luZ10gLm1pc3NpbmctY29udGVudCBwIHsKICBtYXgtd2lkdGg6IDc4MHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBtYXJnaW46IDAgYXV0byA0MHB4Owp9Clt0aGVtZT1taXNzaW5nXSAubWlzc2luZy1jb250ZW50IC5idXR0b24gewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBwYWRkaW5nLWxlZnQ6IDM0cHg7CiAgcGFkZGluZy1yaWdodDogMzRweDsKICBoZWlnaHQ6IDQ0cHg7CiAgZm9udC1zaXplOiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgYm9yZGVyLXJhZGl1czogMDsKICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbi1vdXQgMzAwbXM7CiAgY3Vyc29yOiBwb2ludGVyOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICBiYWNrZ3JvdW5kOiAjQ0U5NDAwOwogIGNvbG9yOiAjMDAxMzUwOwp9Clt0aGVtZT1taXNzaW5nXSAubWlzc2luZy1jb250ZW50IC5idXR0b246aG92ZXIsIFt0aGVtZT1taXNzaW5nXSAubWlzc2luZy1jb250ZW50IC5idXR0b246YWN0aXZlIHsKICBiYWNrZ3JvdW5kOiAjRkVCOTA3Owp9Clt0aGVtZT1taXNzaW5nXSAuZm9vdGVyIC5mb290ZXItY2VudGVyIHsKICBkaXNwbGF5OiBub25lOwp9CgpbdGhlbWU9YmxvZ10gLm1haW5jb250YWluZXIgewogIGJhY2tncm91bmQ6ICMwMDEzNTA7Cn0KW3RoZW1lPWJsb2ddIC5jb250YWluZXIgewogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9Clt0aGVtZT1ibG9nXSAuY29udGFpbmVyLmlzLXBhZ2UgewogIG1heC13aWR0aDogMTQ0MHB4OwogIHdpZHRoOiAxMDAlOwogIHBhZGRpbmctbGVmdDogMjBweDsKICBwYWRkaW5nLXJpZ2h0OiAyMHB4Owp9Clt0aGVtZT1ibG9nXSBoMSB7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1hcmdpbi10b3A6IDMwcHg7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgZm9udC1zaXplOiAzMHB4OwogIGNvbG9yOiAjZmZmOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgW3RoZW1lPWJsb2ddIGgxIHsKICAgIGZvbnQtc2l6ZTogNTBweDsKICB9Cn0KW3RoZW1lPWJsb2ddIC5ibG9nLWxpc3QgewogIG1heC13aWR0aDogMTE0MHB4OwogIHdpZHRoOiAxMDAlOwogIGRpc3BsYXk6IGdyaWQ7CiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgzMjBweCwgMWZyKSk7CiAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAxZnI7CiAgZ3JpZC1jb2x1bW4tZ2FwOiA0MHB4OwogIGdyaWQtcm93LWdhcDogNDBweDsKfQpbdGhlbWU9YmxvZ10gLmJsb2ctbGlzdC5uby1yZXN1bHRzIHsKICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgY29sb3I6ICNmZmY7Cn0KW3RoZW1lPWJsb2ddIC5ibG9nLWxpc3Qubm8tcmVzdWx0cyAubm8tcmVzdWx0cy1pY29uIHsKICB3aWR0aDogMTEwcHg7CiAgaGVpZ2h0OiA2MHB4OwogIG1hcmdpbjogMCBhdXRvOwp9Clt0aGVtZT1ibG9nXSAuYmxvZy1saXN0Lm5vLXJlc3VsdHMgLm5vLXJlc3VsdHMtaWNvbiBzdmcgewogIGhlaWdodDogMTAwJTsKICB3aWR0aDogMTAwJTsKfQpbdGhlbWU9YmxvZ10gLmJsb2ctbGlzdC5uby1yZXN1bHRzIGgyIHsKICBjb2xvcjogI2ZmZjsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbWFyZ2luLXRvcDogMzBweDsKICBtYXJnaW4tYm90dG9tOiAzMHB4OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBmb250LXNpemU6IDI2cHg7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsKICBbdGhlbWU9YmxvZ10gLmJsb2ctbGlzdC5uby1yZXN1bHRzIGgyIHsKICAgIGZvbnQtc2l6ZTogMzBweDsKICB9Cn0KW3RoZW1lPWJsb2ddIC5ibG9nLWxpc3Qubm8tcmVzdWx0cyA+IGRpdjpub3QoLm5vLXJlc3VsdHMtaWNvbikgewogIGZvbnQtc2l6ZTogMTZweDsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogIFt0aGVtZT1ibG9nXSAuYmxvZy1saXN0Lm5vLXJlc3VsdHMgPiBkaXY6bm90KC5uby1yZXN1bHRzLWljb24pIHsKICAgIGZvbnQtc2l6ZTogMjBweDsKICB9Cn0KW3RoZW1lPWJsb2ddIC5ibG9nLWxpc3Qubm8tcmVzdWx0cyAuaXMtbGlua2JhY2sgewogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpbdGhlbWU9YmxvZ10gLmJsb2ctbGlzdC5uby1yZXN1bHRzIC5pcy1saW5rYmFjazpiZWZvcmUgewogIGRpc3BsYXk6IG5vbmU7Cn0KW3RoZW1lPWJsb2ddIC5ibG9nLWxpc3Qubm8tcmVzdWx0cyAuaXMtbGlua2JhY2sgYSB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmctbGVmdDogMzRweDsKICBwYWRkaW5nLXJpZ2h0OiAzNHB4OwogIGhlaWdodDogNDRweDsKICBmb250LXNpemU6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBib3JkZXItcmFkaXVzOiAwOwogIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGJhY2tncm91bmQ6ICNDRTk0MDA7CiAgY29sb3I6ICMwMDEzNTA7Cn0KW3RoZW1lPWJsb2ddIC5ibG9nLWxpc3Qubm8tcmVzdWx0cyAuaXMtbGlua2JhY2sgYTpob3ZlciwgW3RoZW1lPWJsb2ddIC5ibG9nLWxpc3Qubm8tcmVzdWx0cyAuaXMtbGlua2JhY2sgYTphY3RpdmUgewogIGJhY2tncm91bmQ6ICNGRUI5MDc7Cn0KW3RoZW1lPWJsb2ddIC5ibG9nLXBvc3QgewogIGNvbG9yOiAjZmZmOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpbdGhlbWU9YmxvZ10gLmJsb2ctcG9zdCBpbWcgewogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOiAxMDAlOwogIG1hcmdpbi1ib3R0b206IDQwcHg7CiAgb3BhY2l0eTogMC40OwogIHRyYW5zaXRpb246IG9wYWNpdHkgZWFzZS1pbi1vdXQgMzAwbXM7Cn0KW3RoZW1lPWJsb2ddIC5ibG9nLXBvc3QgaDIgewogIGNvbG9yOiBpbmhlcml0OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKICBmb250LXNpemU6IDIycHg7Cn0KW3RoZW1lPWJsb2ddIC5ibG9nLXBvc3QgcCB7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKfQpbdGhlbWU9YmxvZ10gLmJsb2ctcG9zdCBhLmJ1dHRvbiB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmctbGVmdDogMzRweDsKICBwYWRkaW5nLXJpZ2h0OiAzNHB4OwogIGhlaWdodDogNDRweDsKICBmb250LXNpemU6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBib3JkZXItcmFkaXVzOiAwOwogIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGJhY2tncm91bmQ6ICNDRTk0MDA7CiAgY29sb3I6ICMwMDEzNTA7Cn0KW3RoZW1lPWJsb2ddIC5ibG9nLXBvc3QgYS5idXR0b246aG92ZXIsIFt0aGVtZT1ibG9nXSAuYmxvZy1wb3N0IGEuYnV0dG9uOmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogI0ZFQjkwNzsKfQpbdGhlbWU9YmxvZ10gLmJsb2ctcG9zdDpob3ZlciBpbWcgewogIG9wYWNpdHk6IDE7Cn0KClt0aGVtZT1ibG9nLWFydGljbGVdIC5ibG9nLXBvc3QgaDEgewogIHRleHQtYWxpZ246IGNlbnRlcjsKICBtYXJnaW4tdG9wOiAzMHB4OwogIG1hcmdpbi1ib3R0b206IDMwcHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBmb250LXdlaWdodDogNzAwOwogIGZvbnQtc2l6ZTogMzBweDsKICBjb2xvcjogIzAwMTM1MDsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogIFt0aGVtZT1ibG9nLWFydGljbGVdIC5ibG9nLXBvc3QgaDEgewogICAgZm9udC1zaXplOiA1MHB4OwogIH0KfQpbdGhlbWU9YmxvZy1hcnRpY2xlXSAuYmxvZy1wb3N0IC5jcmVhdGVkLWJ5IHsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgbWFyZ2luLXRvcDogMzBweDsKfQpbdGhlbWU9YmxvZy1hcnRpY2xlXSAuYmxvZy1wb3N0IC5jcmVhdGVkLWJ5IHNwYW4gewogIG1hcmdpbjogMCA0cHg7CiAgY29sb3I6ICMwMDAwMjM7Cn0KW3RoZW1lPWJsb2ctYXJ0aWNsZV0gLmJsb2ctcG9zdCBpbWcgewogIG1hcmdpbi10b3A6IDMwcHg7CiAgbWFyZ2luLWJvdHRvbTogNTBweDsKICBtYXgtd2lkdGg6IDExNDBweDsKICB3aWR0aDogMTAwJTsKICBvYmplY3QtZml0OiBjb3ZlcjsKfQpbdGhlbWU9YmxvZy1hcnRpY2xlXSAuYmxvZy1wb3N0IGhyIHsKICBkaXNwbGF5OiBub25lOwp9Clt0aGVtZT1ibG9nLWFydGljbGVdIC5ibG9nLXBvc3QgcCB7CiAgbWF4LXdpZHRoOiA3NDBweDsKICBtYXJnaW46IDAgYXV0byAyMHB4OwogIGNvbG9yOiAjMDAwMDIzOwp9Clt0aGVtZT1ibG9nLWFydGljbGVdIC5ibG9nLXBvc3QgPiBkaXYgaDEgewogIHRleHQtYWxpZ246IGxlZnQ7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBmb250LXNpemU6IDIycHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBtYXgtd2lkdGg6IDc0MHB4OwogIG1hcmdpbjogNjBweCBhdXRvIDQwcHg7Cn0KW3RoZW1lPWJsb2ctYXJ0aWNsZV0gLmJsb2ctcG9zdCA+IGRpdiAuY29tbWVudCBQIHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KW3RoZW1lPWJsb2ctYXJ0aWNsZV0gLmJsb2ctcG9zdCA+IGRpdiAuY29tbWVudCBQOmZpcnN0LWNoaWxkIHsKICBtYXJnaW4tYm90dG9tOiA1cHg7Cn0KW3RoZW1lPWJsb2ctYXJ0aWNsZV0gLmJsb2ctcG9zdCA+IGRpdiAuY29tbWVudCBQOm50aC1jaGlsZCgyKSB7CiAgcGFkZGluZy1sZWZ0OiAzOHB4Owp9Clt0aGVtZT1ibG9nLWFydGljbGVdIC5ibG9nLXBvc3QgPiBkaXYgLmNvbW1lbnQgUDpsYXN0LWNoaWxkIHsKICBib3JkZXItdG9wOiAxcHggc29saWQgI2NiZDBkMTsKfQpbdGhlbWU9YmxvZy1hcnRpY2xlXSAuYmxvZy1wb3N0ID4gZGl2IC5jb21tZW50IGltZyB7CiAgbWF4LXdpZHRoOiAyOHB4OwogIHdpZHRoOiAxMDAlOwogIG1hcmdpbjogMCAxMHB4IDAgMDsKfQpbdGhlbWU9YmxvZy1hcnRpY2xlXSAuYmxvZy1wb3N0ID4gZGl2IC5pcy1saW5rYmFjayB7CiAgZGlzcGxheTogbm9uZTsKfQoKW3RoZW1lPWVjb21tZXJjZV0gLm1haW5jb250YWluZXIgewogIGJhY2tncm91bmQ6ICMwMDEzNTA7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLm1haW5jb250YWluZXIgLmNvbnRhaW5lciB7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgaDEgewogIHRleHQtYWxpZ246IGNlbnRlcjsKICBtYXJnaW4tdG9wOiAzMHB4OwogIG1hcmdpbi1ib3R0b206IDMwcHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBmb250LXdlaWdodDogNzAwOwogIGZvbnQtc2l6ZTogMzBweDsKICBjb2xvcjogI2ZmZjsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogIFt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIGgxIHsKICAgIGZvbnQtc2l6ZTogNTBweDsKICB9Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLmVjb21zLXBhZ2VoZWFkZXIgewogIGRpc3BsYXk6IG5vbmU7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLnNlYXJjaC1maWx0ZXJzIHsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQpbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAuc2VhcmNoLWZpbHRlcnMgPiBkaXYgewogIGZvbnQtc2l6ZTogMTRweDsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgb3ZlcmZsb3c6IHNjcm9sbDsKICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7CiAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5zZWFyY2gtZmlsdGVycyA+IGRpdjo6LXdlYmtpdC1zY3JvbGxiYXIgewogIHdpZHRoOiAwICFpbXBvcnRhbnQ7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNjMwcHgpIHsKICBbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAuc2VhcmNoLWZpbHRlcnMgPiBkaXYgewogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgfQp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5zZWFyY2gtZmlsdGVycyA+IGRpdiA+IGxhYmVsIHsKICBkaXNwbGF5OiBub25lOwp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5zZWFyY2gtZmlsdGVycyA+IGRpdiBhIHsKICBoZWlnaHQ6IDI1cHg7CiAgYm9yZGVyLXJhZGl1czogMTNweDsKICBtYXJnaW4tcmlnaHQ6IDhweDsKICBwYWRkaW5nOiAwIDE1cHg7CiAgY29sb3I6ICNmZmY7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQpbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAuc2VhcmNoLWZpbHRlcnMgPiBkaXYgYTpsYXN0LWNoaWxkIHsKICBtYXJnaW4tcmlnaHQ6IDA7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLnNlYXJjaC1maWx0ZXJzID4gZGl2IGE6aG92ZXIsIFt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5zZWFyY2gtZmlsdGVycyA+IGRpdiBhLnNlbGVjdGVkIHsKICBiYWNrZ3JvdW5kOiAjZmZmOwogIGNvbG9yOiAjMDAwMDIzOwp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5jb250YWluZXItbGlzdC10aWxlcyB7CiAgZGlzcGxheTogZ3JpZDsKICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgxLCAxZnIpOwogIGdyaWQtY29sdW1uLWdhcDogMjBweDsKICBncmlkLXJvdy1nYXA6IDgwcHg7CiAgbWFyZ2luLXRvcDogNTBweDsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA2NDBweCkgewogIFt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5jb250YWluZXItbGlzdC10aWxlcyB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpOwogIH0KfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogIFt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5jb250YWluZXItbGlzdC10aWxlcyB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCAxZnIpOwogIH0KfQpbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAuY29udGFpbmVyLWxpc3QtdGlsZXMgPiBhIHsKICBwYWRkaW5nOiAwOwogIGZsZXg6IDEgMSBhdXRvOwogIG1heC13aWR0aDogMTAwJTsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBmb250LXdlaWdodDogNzAwOwogIGZvbnQtc2l6ZTogMTRweDsKICBsaW5lLWhlaWdodDogMjFweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgY29sb3I6ICNmZmY7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5jb250YWluZXItbGlzdC10aWxlcyA+IGE6YWZ0ZXIgewogIGNvbnRlbnQ6ICIiOwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMXB4OwogIHdpZHRoOiA4MCU7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGJvdHRvbTogMDsKICBsZWZ0OiA1MCU7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgNTVweCk7CiAgYmFja2dyb3VuZDogIzdGODVBNzsKfQpbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAuY29udGFpbmVyLWxpc3QtdGlsZXMgPiBhOmxhc3QtY2hpbGQ6YWZ0ZXIgewogIGRpc3BsYXk6IG5vbmU7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNjQwcHgpIHsKICBbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAuY29udGFpbmVyLWxpc3QtdGlsZXMgPiBhOmFmdGVyIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5jb250YWluZXItbGlzdC10aWxlcyA+IGE6aG92ZXIgewogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQpbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAuY29udGFpbmVyLWxpc3QtdGlsZXMgPiBhIGltZzpmaXJzdC1vZi10eXBlIHsKICB3aWR0aDogMTAwJTsKICBtYXgtd2lkdGg6IDI0MHB4OwogIGhlaWdodDogYXV0bzsKICBib3JkZXI6IG5vbmU7CiAgbWFyZ2luOiAwOwp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5jb250YWluZXItbGlzdC10aWxlcyA+IGEgaW1nOm50aC1vZi10eXBlKDIpIHsKICBib3JkZXI6IG5vbmU7CiAgbWFyZ2luLXRvcDogMDsKICBtYXgtd2lkdGg6IDgwcHg7CiAgbWFyZ2luLWJvdHRvbTogMjBweDsKfQpbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAuY29udGFpbmVyLWxpc3QtdGlsZXMgPiBhIGgzIHsKICBjb2xvcjogI2ZmZjsKICBmb250LXdlaWdodDogNzAwOwogIGZvbnQtc2l6ZTogMjJweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBtYXJnaW4tYm90dG9tOiAzMHB4Owp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5jb250YWluZXItbGlzdC10aWxlcyA+IGEgLnByaWNlIHsKICBjb2xvcjogIzAwMDAyMzsKICBmb250LWZhbWlseTogcG9wcGluc2JvbGQsIEFyaWFsLCAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CiAgY29sb3I6ICNmZmY7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLmNvbnRhaW5lci1saXN0LXRpbGVzID4gYSAuYnV0dG9uIHsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgcGFkZGluZy1sZWZ0OiAzNHB4OwogIHBhZGRpbmctcmlnaHQ6IDM0cHg7CiAgaGVpZ2h0OiA0NHB4OwogIGZvbnQtc2l6ZTogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGJvcmRlci1yYWRpdXM6IDA7CiAgdHJhbnNpdGlvbjogYWxsIGVhc2UtaW4tb3V0IDMwMG1zOwogIGN1cnNvcjogcG9pbnRlcjsKICBmb250LXdlaWdodDogNjAwOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgYmFja2dyb3VuZDogI0NFOTQwMDsKICBjb2xvcjogIzAwMTM1MDsKICBtYXJnaW4tdG9wOiAyNXB4Owp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5jb250YWluZXItbGlzdC10aWxlcyA+IGEgLmJ1dHRvbjpob3ZlciwgW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLmNvbnRhaW5lci1saXN0LXRpbGVzID4gYSAuYnV0dG9uOmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogI0ZFQjkwNzsKfQpbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAubm8tcmVzdWx0cyB7CiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGNvbG9yOiAjZmZmOwp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5uby1yZXN1bHRzIC5uby1yZXN1bHRzLWljb24gewogIHdpZHRoOiAxMTBweDsKICBoZWlnaHQ6IDYwcHg7CiAgbWFyZ2luOiAwIGF1dG87Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLm5vLXJlc3VsdHMgLm5vLXJlc3VsdHMtaWNvbiBzdmcgewogIGhlaWdodDogMTAwJTsKICB3aWR0aDogMTAwJTsKfQpbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAubm8tcmVzdWx0cyBoMiB7CiAgY29sb3I6ICNmZmY7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1hcmdpbi10b3A6IDMwcHg7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgZm9udC1zaXplOiAyNnB4Owp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLm5vLXJlc3VsdHMgaDIgewogICAgZm9udC1zaXplOiAzMHB4OwogIH0KfQpbdGhlbWU9ZWNvbW1lcmNlXSAuaXMtcGFnZSAubm8tcmVzdWx0cyA+IGRpdjpub3QoLm5vLXJlc3VsdHMtaWNvbikgewogIGZvbnQtc2l6ZTogMTZweDsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogIFt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5uby1yZXN1bHRzID4gZGl2Om5vdCgubm8tcmVzdWx0cy1pY29uKSB7CiAgICBmb250LXNpemU6IDIwcHg7CiAgfQp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5uby1yZXN1bHRzICsgLmlzLWxpbmtiYWNrIHsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLm5vLXJlc3VsdHMgKyAuaXMtbGlua2JhY2s6YmVmb3JlIHsKICBkaXNwbGF5OiBub25lOwp9Clt0aGVtZT1lY29tbWVyY2VdIC5pcy1wYWdlIC5uby1yZXN1bHRzICsgLmlzLWxpbmtiYWNrIGEgewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBwYWRkaW5nLWxlZnQ6IDM0cHg7CiAgcGFkZGluZy1yaWdodDogMzRweDsKICBoZWlnaHQ6IDQ0cHg7CiAgZm9udC1zaXplOiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgYm9yZGVyLXJhZGl1czogMDsKICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbi1vdXQgMzAwbXM7CiAgY3Vyc29yOiBwb2ludGVyOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICBiYWNrZ3JvdW5kOiAjQ0U5NDAwOwogIGNvbG9yOiAjMDAxMzUwOwogIG1hcmdpbi10b3A6IDYwcHg7Cn0KW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLm5vLXJlc3VsdHMgKyAuaXMtbGlua2JhY2sgYTpob3ZlciwgW3RoZW1lPWVjb21tZXJjZV0gLmlzLXBhZ2UgLm5vLXJlc3VsdHMgKyAuaXMtbGlua2JhY2sgYTphY3RpdmUgewogIGJhY2tncm91bmQ6ICNGRUI5MDc7Cn0KClt0aGVtZT1lY29tbWVyY2UtcHJvZHVjdF0gLnByb2R1Y3QgewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKfQpbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IGgzIHsKICBmb250LXdlaWdodDogNzAwOwogIGZvbnQtc2l6ZTogMzBweDsKICBsaW5lLWhlaWdodDogMzBweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBtYXJnaW4tYm90dG9tOiAyMHB4OwogIGNvbG9yOiAjMDAxMzUwOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgW3RoZW1lPWVjb21tZXJjZS1wcm9kdWN0XSAucHJvZHVjdCA+IGRpdiBoMyB7CiAgICBmb250LXNpemU6IDQwcHg7CiAgICBsaW5lLWhlaWdodDogNDBweDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBtYXJnaW4tdG9wOiAzMHB4OwogIH0KfQpbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC5wcm9kdWN0LWltYWdlIHsKICB3aWR0aDogMTAwJTsKICBtYXgtd2lkdGg6IDU3MHB4OwogIG1hcmdpbjogMCBhdXRvOwogIGRpc3BsYXk6IGJsb2NrOwp9Clt0aGVtZT1lY29tbWVyY2UtcHJvZHVjdF0gLnByb2R1Y3QgPiBkaXYgLnByaWNlLXJhdGluZyB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBtYXJnaW4tYm90dG9tOiAzMHB4Owp9Clt0aGVtZT1lY29tbWVyY2UtcHJvZHVjdF0gLnByb2R1Y3QgPiBkaXYgLnByaWNlLXJhdGluZyAucHJpY2UgewogIGNvbG9yOiAjMDAwMDIzOwogIGZvbnQtZmFtaWx5OiBwb3BwaW5zYm9sZCwgQXJpYWwsICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDIycHg7CiAgbGluZS1oZWlnaHQ6IDMzcHg7CiAgY29sb3I6ICMwMDAwMjM7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsKICBbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC5wcmljZS1yYXRpbmcgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogIH0KICBbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC5wcmljZS1yYXRpbmcgLnByaWNlIHsKICAgIG9yZGVyOiAxOwogIH0KICBbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC5wcmljZS1yYXRpbmcgaW1nIHsKICAgIG9yZGVyOiAwOwogICAgbWFyZ2luLXRvcDogMjBweDsKICAgIG1hcmdpbi1ib3R0b206IDMwcHg7CiAgfQp9Clt0aGVtZT1lY29tbWVyY2UtcHJvZHVjdF0gLnByb2R1Y3QgPiBkaXYgLmRlc2NyaXB0aW9uIHsKICBkaXNwbGF5OiBibG9jazsKICBtYXJnaW4tYm90dG9tOiA4MHB4OwogIGNvbG9yOiAjMDAwMDIzOwp9Clt0aGVtZT1lY29tbWVyY2UtcHJvZHVjdF0gLnByb2R1Y3QgPiBkaXYgLmRlc2NyaXB0aW9uIGxhYmVsIHsKICBjb2xvcjogIzAwMDAyMzsKICBtYXJnaW4tYm90dG9tOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9Clt0aGVtZT1lY29tbWVyY2UtcHJvZHVjdF0gLnByb2R1Y3QgPiBkaXYgLnN0b2NrLWNoZWNrLApbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC5jYXJ0LWJ1dHRvbiB7CiAgZGlzcGxheTogYmxvY2s7Cn0KW3RoZW1lPWVjb21tZXJjZS1wcm9kdWN0XSAucHJvZHVjdCA+IGRpdiAuc3RvY2stY2hlY2sgc2VsZWN0LApbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC5jYXJ0LWJ1dHRvbiBzZWxlY3QgewogIGhlaWdodDogNDhweDsKICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBib3JkZXI6IDJweCBzb2xpZCAjMDAwMDIzOwogIG1heC13aWR0aDogMzkwcHg7Cn0KW3RoZW1lPWVjb21tZXJjZS1wcm9kdWN0XSAucHJvZHVjdCA+IGRpdiAuc3RvY2stY2hlY2sgZm9ybSwKW3RoZW1lPWVjb21tZXJjZS1wcm9kdWN0XSAucHJvZHVjdCA+IGRpdiAuY2FydC1idXR0b24gZm9ybSB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwp9Clt0aGVtZT1lY29tbWVyY2UtcHJvZHVjdF0gLnByb2R1Y3QgPiBkaXYgLnN0b2NrLWNoZWNrIC5idXR0b24gewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBwYWRkaW5nLWxlZnQ6IDM0cHg7CiAgcGFkZGluZy1yaWdodDogMzRweDsKICBoZWlnaHQ6IDQ0cHg7CiAgZm9udC1zaXplOiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgYm9yZGVyLXJhZGl1czogMDsKICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbi1vdXQgMzAwbXM7CiAgY3Vyc29yOiBwb2ludGVyOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICBiYWNrZ3JvdW5kOiAjMDAxMzUwOwogIGNvbG9yOiAjQ0U5NDAwOwogIHdpZHRoOiAxNjVweDsKfQpbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC5zdG9jay1jaGVjayAuYnV0dG9uOmhvdmVyLCBbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC5zdG9jay1jaGVjayAuYnV0dG9uOmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogIzFBMjQ2MTsKfQpbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC5zdG9jay1jaGVjayAjc3RvY2tDaGVja1Jlc3VsdCB7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgZm9udC1zaXplOiAyMHB4OwogIGxpbmUtaGVpZ2h0OiAzMHB4OwogIGNvbG9yOiAjMDBBMkI5Owp9Clt0aGVtZT1lY29tbWVyY2UtcHJvZHVjdF0gLnByb2R1Y3QgPiBkaXYgLmNhcnQtYnV0dG9uIC5idXR0b24gewogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBwYWRkaW5nLWxlZnQ6IDM0cHg7CiAgcGFkZGluZy1yaWdodDogMzRweDsKICBoZWlnaHQ6IDQ0cHg7CiAgZm9udC1zaXplOiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgYm9yZGVyLXJhZGl1czogMDsKICB0cmFuc2l0aW9uOiBhbGwgZWFzZS1pbi1vdXQgMzAwbXM7CiAgY3Vyc29yOiBwb2ludGVyOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICBiYWNrZ3JvdW5kOiAjQ0U5NDAwOwogIGNvbG9yOiAjMDAxMzUwOwogIHdpZHRoOiAxNjVweDsKfQpbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC5jYXJ0LWJ1dHRvbiAuYnV0dG9uOmhvdmVyLCBbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC5jYXJ0LWJ1dHRvbiAuYnV0dG9uOmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogI0ZFQjkwNzsKfQpbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC52aWV3LWNhcnQtYnV0dG9uIHsKICBoZWlnaHQ6IDgwcHg7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwp9Clt0aGVtZT1lY29tbWVyY2UtcHJvZHVjdF0gLnByb2R1Y3QgPiBkaXYgLnZpZXctY2FydC1idXR0b24gLmJ1dHRvbiB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmctbGVmdDogMzRweDsKICBwYWRkaW5nLXJpZ2h0OiAzNHB4OwogIGhlaWdodDogNDRweDsKICBmb250LXNpemU6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBib3JkZXItcmFkaXVzOiAwOwogIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGJhY2tncm91bmQ6ICMwMDEzNTA7CiAgY29sb3I6ICNDRTk0MDA7CiAgd2lkdGg6IDEwMCU7Cn0KW3RoZW1lPWVjb21tZXJjZS1wcm9kdWN0XSAucHJvZHVjdCA+IGRpdiAudmlldy1jYXJ0LWJ1dHRvbiAuYnV0dG9uOmhvdmVyLCBbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0ID4gZGl2IC52aWV3LWNhcnQtYnV0dG9uIC5idXR0b246YWN0aXZlIHsKICBiYWNrZ3JvdW5kOiAjMUEyNDYxOwp9Clt0aGVtZT1lY29tbWVyY2UtcHJvZHVjdF0gLnByb2R1Y3QgPiBkaXY6Zmlyc3QtY2hpbGQgLnByb2R1Y3QtaW1hZ2UgewogIGRpc3BsYXk6IG5vbmU7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsKICBbdGhlbWU9ZWNvbW1lcmNlLXByb2R1Y3RdIC5wcm9kdWN0IHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgfQogIFt0aGVtZT1lY29tbWVyY2UtcHJvZHVjdF0gLnByb2R1Y3QgPiBkaXY6Zmlyc3QtY2hpbGQgewogICAgZmxleDogMCAwIDUwJTsKICB9CiAgW3RoZW1lPWVjb21tZXJjZS1wcm9kdWN0XSAucHJvZHVjdCA+IGRpdjpmaXJzdC1jaGlsZCAucHJvZHVjdC1pbWFnZSB7CiAgICBkaXNwbGF5OiBibG9jazsKICB9CiAgW3RoZW1lPWVjb21tZXJjZS1wcm9kdWN0XSAucHJvZHVjdCA+IGRpdjpsYXN0LWNoaWxkIC5wcm9kdWN0LWltYWdlIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQp9CgpbdGhlbWU9bG9naW5dIC5tYWluY29udGFpbmVyIHsKICBtaW4taGVpZ2h0OiBjYWxjKDEwMHZoIC0gNTg4cHggLSAxNDdweCk7Cn0KW3RoZW1lPWxvZ2luXSBoMSB7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1hcmdpbi10b3A6IDMwcHg7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgZm9udC1zaXplOiAzMHB4OwogIGNvbG9yOiAjMDAxMzUwOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgW3RoZW1lPWxvZ2luXSBoMSB7CiAgICBmb250LXNpemU6IDUwcHg7CiAgfQp9Clt0aGVtZT1sb2dpbl0gLmxvZ2luLWZvcm0gewogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogIHdpZHRoOiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIG1hcmdpbjogMCBhdXRvOwp9Clt0aGVtZT1sb2dpbl0gLmxvZ2luLWZvcm0gc3BhbiB7CiAgbWFyZ2luLWJvdHRvbTogNjBweDsKICBjb2xvcjogIzAwMDAyMzsKfQpbdGhlbWU9bG9naW5dIC5sb2dpbi1mb3JtIGlucHV0IHsKICBib3JkZXI6IDFweCBzb2xpZCAjMDAwMDIzOwogIGhlaWdodDogNTJweDsKICBtYXgtd2lkdGg6IDU0OHB4OwogIHdpZHRoOiAxMDAlOwp9Clt0aGVtZT1sb2dpbl0gLmxvZ2luLWZvcm0gLmJ1dHRvbiB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmctbGVmdDogMzRweDsKICBwYWRkaW5nLXJpZ2h0OiAzNHB4OwogIGhlaWdodDogNDRweDsKICBmb250LXNpemU6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBib3JkZXItcmFkaXVzOiAwOwogIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGJhY2tncm91bmQ6ICMwMDEzNTA7CiAgY29sb3I6ICNDRTk0MDA7CiAgd2lkdGg6IDE3MHB4Owp9Clt0aGVtZT1sb2dpbl0gLmxvZ2luLWZvcm0gLmJ1dHRvbjpob3ZlciwgW3RoZW1lPWxvZ2luXSAubG9naW4tZm9ybSAuYnV0dG9uOmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogIzFBMjQ2MTsKfQoKW3RoZW1lPWxvZ2luLW1vZGFsXSB7CiAgYmFja2dyb3VuZDogdXJsKCIvcmVzb3VyY2VzL2ltYWdlcy9kYXJrLWJsdWUtc3F1aWdnbGUtcGF0dGVybi10aWxlLmpwZyIpIHNjcm9sbCBjZW50ZXIgY2VudGVyIHJlcGVhdDsKICBtaW4taGVpZ2h0OiAxMDB2aDsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKfQpbdGhlbWU9bG9naW4tbW9kYWxdIGgxIHsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbWFyZ2luLXRvcDogMzBweDsKICBtYXJnaW4tYm90dG9tOiAzMHB4OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBmb250LXNpemU6IDMwcHg7CiAgY29sb3I6ICMwMDEzNTA7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsKICBbdGhlbWU9bG9naW4tbW9kYWxdIGgxIHsKICAgIGZvbnQtc2l6ZTogNTBweDsKICB9Cn0KW3RoZW1lPWxvZ2luLW1vZGFsXSAubWFpbmNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgcGFkZGluZzogMjBweDsKfQpbdGhlbWU9bG9naW4tbW9kYWxdIC5tYWluY29udGFpbmVyIC5jb250YWluZXIgewogIG1heC13aWR0aDogNzQycHg7CiAgd2lkdGg6IDEwMCU7CiAgcGFkZGluZzogMjBweDsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTkwcHgpIHsKICBbdGhlbWU9bG9naW4tbW9kYWxdIC5tYWluY29udGFpbmVyIC5jb250YWluZXIgewogICAgd2lkdGg6IGF1dG87CiAgfQp9Clt0aGVtZT1sb2dpbi1tb2RhbF0gLmxvZ2luLWZvcm0gewogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogIHdpZHRoOiAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIG1hcmdpbjogMCBhdXRvOwp9Clt0aGVtZT1sb2dpbi1tb2RhbF0gLmxvZ2luLWZvcm0gc3BhbiB7CiAgbWFyZ2luLWJvdHRvbTogNjBweDsKfQpbdGhlbWU9bG9naW4tbW9kYWxdIC5sb2dpbi1mb3JtIGlucHV0IHsKICBib3JkZXI6IDFweCBzb2xpZCAjMDAwMDIzOwp9Clt0aGVtZT1sb2dpbi1tb2RhbF0gLmxvZ2luLWZvcm0gLmJ1dHRvbiB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmctbGVmdDogMzRweDsKICBwYWRkaW5nLXJpZ2h0OiAzNHB4OwogIGhlaWdodDogNDRweDsKICBmb250LXNpemU6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBib3JkZXItcmFkaXVzOiAwOwogIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGJhY2tncm91bmQ6ICMwMDEzNTA7CiAgY29sb3I6ICNDRTk0MDA7CiAgd2lkdGg6IDE3MHB4Owp9Clt0aGVtZT1sb2dpbi1tb2RhbF0gLmxvZ2luLWZvcm0gLmJ1dHRvbjpob3ZlciwgW3RoZW1lPWxvZ2luLW1vZGFsXSAubG9naW4tZm9ybSAuYnV0dG9uOmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogIzFBMjQ2MTsKfQoKW3RoZW1lPWNhcnRdIHsKICBtaW4taGVpZ2h0OiBjYWxjKDEwMHZoIC0gMTIwcHgpOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogIFt0aGVtZT1jYXJ0XSB7CiAgICBtaW4taGVpZ2h0OiBjYWxjKDEwMHZoIC0gMTU3cHgpOwogIH0KfQpbdGhlbWU9Y2FydF0gLm1haW5jb250YWluZXIgewogIGZsZXg6IDEgMSAxMDAlOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQpbdGhlbWU9Y2FydF0gLm1haW5jb250YWluZXIgLmNvbnRhaW5lciB7CiAgZmxleDogMSAxIDEwMCU7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9Clt0aGVtZT1jYXJ0XSAubWFpbmNvbnRhaW5lciAuY29udGFpbmVyIC5lbXB0eS1jYXJ0LXdyYXBwZXIgewogIGZsZXg6IDEgMSAxMDAlOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KW3RoZW1lPWNhcnRdIGgxIHsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgbWFyZ2luLXRvcDogMzBweDsKICBtYXJnaW4tYm90dG9tOiAzMHB4OwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBmb250LXNpemU6IDMwcHg7CiAgY29sb3I6ICMwMDEzNTA7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsKICBbdGhlbWU9Y2FydF0gaDEgewogICAgZm9udC1zaXplOiA1MHB4OwogIH0KfQpbdGhlbWU9Y2FydF0gLmNhcnQtd3JhcHBlciB7CiAgZGlzcGxheTogZ3JpZDsKICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgyLCBhdXRvKTsKICBncmlkLWNvbHVtbi1nYXA6IDMwcHg7CiAgZ3JpZC1yb3ctZ2FwOiAzMHB4Owp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEwMjRweCkgewogIFt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDY0M3B4IDFmcjsKICAgIGdyaWQtdGVtcGxhdGUtcm93czogMWZyOwogICAgZ3JpZC1jb2x1bW4tZ2FwOiA0NHB4OwogICAgZ3JpZC1yb3ctZ2FwOiAzMHB4OwogIH0KfQpbdGhlbWU9Y2FydF0gLmNhcnQtd3JhcHBlciAuY2FydC13cmFwcGVyLWxlZnQgewogIGRpc3BsYXk6IGdyaWQ7CiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAxZnI7CiAgZ3JpZC1yb3ctZ2FwOiAzMHB4Owp9Clt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LXdyYXBwZXItcmlnaHQgLmNhcnQtb3JkZXItc2VjdGlvbiB7CiAgbWF4LXdpZHRoOiA3MDBweDsKICB3aWR0aDogMTAwJTsKICBtYXJnaW46IDAgYXV0bzsKICBiYWNrZ3JvdW5kOiAjRjJGM0Y2OwogIHBhZGRpbmc6IDMwcHg7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtd3JhcHBlci1yaWdodCAuY2FydC1vcmRlci1zZWN0aW9uIGgzIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGNvbG9yOiAjMDAxMzUwOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgZm9udC1zaXplOiAyMnB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1hcmdpbi1ib3R0b206IDIwcHg7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtd3JhcHBlci1yaWdodCAuY2FydC1vcmRlci1zZWN0aW9uIHN0cm9uZyB7CiAgY29sb3I6ICMwMDAwMjM7CiAgZm9udC1mYW1pbHk6IHBvcHBpbnNib2xkLCBBcmlhbCwgIkhlbHZldGljYSBOZXVlIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgZm9udC1zaXplOiAzMHB4OwogIGxpbmUtaGVpZ2h0OiAzMHB4OwogIG1hcmdpbi1ib3R0b206IDQwcHg7CiAgZGlzcGxheTogYmxvY2s7CiAgY29sb3I6ICMwMDEzNTA7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtd3JhcHBlci1yaWdodCAuY2FydC1vcmRlci1zZWN0aW9uIGZvcm0gewogIHBhZGRpbmc6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtd3JhcHBlci1yaWdodCAuY2FydC1vcmRlci1zZWN0aW9uIGZvcm06Zmlyc3Qtb2YtdHlwZSB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogcm93OwogIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0Owp9Clt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LXdyYXBwZXItcmlnaHQgLmNhcnQtb3JkZXItc2VjdGlvbiBmb3JtOmZpcnN0LW9mLXR5cGUgbGFiZWwgewogIGRpc3BsYXk6IG5vbmU7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtd3JhcHBlci1yaWdodCAuY2FydC1vcmRlci1zZWN0aW9uIGZvcm06Zmlyc3Qtb2YtdHlwZSBpbnB1dCB7CiAgaGVpZ2h0OiA0OHB4OwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogIG1hcmdpbi1ib3R0b206IDA7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtd3JhcHBlci1yaWdodCAuY2FydC1vcmRlci1zZWN0aW9uIGZvcm06Zmlyc3Qtb2YtdHlwZSAuYnV0dG9uIHsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgcGFkZGluZy1sZWZ0OiAzNHB4OwogIHBhZGRpbmctcmlnaHQ6IDM0cHg7CiAgaGVpZ2h0OiA0NHB4OwogIGZvbnQtc2l6ZTogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGJvcmRlci1yYWRpdXM6IDA7CiAgdHJhbnNpdGlvbjogYWxsIGVhc2UtaW4tb3V0IDMwMG1zOwogIGN1cnNvcjogcG9pbnRlcjsKICBmb250LXdlaWdodDogNjAwOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgYmFja2dyb3VuZDogIzAwMTM1MDsKICBjb2xvcjogI0NFOTQwMDsKICBtYXJnaW46IDA7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtd3JhcHBlci1yaWdodCAuY2FydC1vcmRlci1zZWN0aW9uIGZvcm06Zmlyc3Qtb2YtdHlwZSAuYnV0dG9uOmhvdmVyLCBbdGhlbWU9Y2FydF0gLmNhcnQtd3JhcHBlciAuY2FydC13cmFwcGVyLXJpZ2h0IC5jYXJ0LW9yZGVyLXNlY3Rpb24gZm9ybTpmaXJzdC1vZi10eXBlIC5idXR0b246YWN0aXZlIHsKICBiYWNrZ3JvdW5kOiAjMUEyNDYxOwp9Clt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LXdyYXBwZXItcmlnaHQgLmNhcnQtb3JkZXItc2VjdGlvbiBmb3JtOmxhc3Qtb2YtdHlwZSAuYnV0dG9uIHsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgcGFkZGluZy1sZWZ0OiAzNHB4OwogIHBhZGRpbmctcmlnaHQ6IDM0cHg7CiAgaGVpZ2h0OiA0NHB4OwogIGZvbnQtc2l6ZTogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGJvcmRlci1yYWRpdXM6IDA7CiAgdHJhbnNpdGlvbjogYWxsIGVhc2UtaW4tb3V0IDMwMG1zOwogIGN1cnNvcjogcG9pbnRlcjsKICBmb250LXdlaWdodDogNjAwOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgYmFja2dyb3VuZDogI0NFOTQwMDsKICBjb2xvcjogIzAwMTM1MDsKICBtYXJnaW46IDIwcHggMCAwIDA7CiAgd2lkdGg6IDEwMCU7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtd3JhcHBlci1yaWdodCAuY2FydC1vcmRlci1zZWN0aW9uIGZvcm06bGFzdC1vZi10eXBlIC5idXR0b246aG92ZXIsIFt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LXdyYXBwZXItcmlnaHQgLmNhcnQtb3JkZXItc2VjdGlvbiBmb3JtOmxhc3Qtb2YtdHlwZSAuYnV0dG9uOmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogI0ZFQjkwNzsKfQpbdGhlbWU9Y2FydF0gLmNhcnQtd3JhcHBlciAuY2FydC13cmFwcGVyLXJpZ2h0IC5jYXJ0LW9yZGVyLXNlY3Rpb24gLmlzLXdhcm5pbmcgewogIG1hcmdpbjogNXB4IDAgMCAwOwp9Clt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LXdyYXBwZXItcmlnaHQgLmFwcGxpZWQtY291cG9uLXdyYXBwZXIgewogIGRpc3BsYXk6IGZsZXg7CiAgd2lkdGg6IDEwMCU7CiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogIGhlaWdodDogNDhweDsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIG1hcmdpbi1ib3R0b206IDA7CiAgYm9yZGVyOiAxcHggc29saWQgI2U2ZTZlNjsKICBtaW4taGVpZ2h0OiAxLjVlbTsKICBwYWRkaW5nOiAwLjRlbTsKICBjb2xvcjogIzMzMzMzMjsKICBtYXgtd2lkdGg6IDEwMCU7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtd3JhcHBlci1yaWdodCAuYXBwbGllZC1jb3Vwb24td3JhcHBlciAuYXBwbGllZC1jb3Vwb24tdGljayB7CiAgaGVpZ2h0OiAxLjJyZW07CiAgbWFyZ2luOiAwIDFyZW07CiAgYWxpZ24tc2VsZjogY2VudGVyOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgYmFja2dyb3VuZDogdXJsKCIvcmVzb3VyY2VzL2ltYWdlcy9jaGVjay1jaXJjbGUuc3ZnIikgbm8tcmVwZWF0OwogIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEwMjRweCkgewogIFt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LXdyYXBwZXItcmlnaHQgLmFwcGxpZWQtY291cG9uLXdyYXBwZXIgLmFwcGxpZWQtY291cG9uLXRpY2sgewogICAgaGVpZ2h0OiAxLjZyZW07CiAgICB3aWR0aDogMS42cmVtOwogIH0KfQpbdGhlbWU9Y2FydF0gLmNhcnQtd3JhcHBlciAuY2FydC13cmFwcGVyLXJpZ2h0IC5hcHBsaWVkLWNvdXBvbi13cmFwcGVyIC5hcHBsaWVkLWNvdXBvbi10aWNrIHAgewogIG1hcmdpbjogMC4xcmVtIDAgMHJlbSAyLjNyZW07CiAgZm9udC1zaXplOiAxLjFyZW07Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtd3JhcHBlci1yaWdodCAuYXBwbGllZC1jb3Vwb24td3JhcHBlciBidXR0b24gewogIGRpc3BsYXk6IGJsb2NrOwogIG1hcmdpbjogMC4xcmVtIDFyZW0gMDsKICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGJvcmRlcjogbm9uZTsKICBjb2xvcjogIzAwMDAyMzsKICBmb250LXdlaWdodDogNjAwOwogIGZvbnQtc2l6ZTogMS4xcmVtOwogIGN1cnNvcjogcG9pbnRlcjsKfQpbdGhlbWU9Y2FydF0gLmNhcnQtd3JhcHBlciAuY2FydC1pdGVtIHsKICBtYXgtd2lkdGg6IDcwMHB4OwogIHdpZHRoOiAxMDAlOwogIG1hcmdpbjogMCBhdXRvOwogIGJhY2tncm91bmQ6ICNGMkYzRjY7CiAgcGFkZGluZzogMTVweDsKICBkaXNwbGF5OiBncmlkOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMTAwcHggYXV0bzsKICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgyLCBhdXRvKTsKICBncmlkLWNvbHVtbi1nYXA6IDA7CiAgZ3JpZC1yb3ctZ2FwOiAwOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtaXRlbSB7CiAgICBwYWRkaW5nOiAzMHB4OwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxODBweCAxZnIgNTBweDsKICAgIGdyaWQtdGVtcGxhdGUtcm93czogcmVwZWF0KDEsIDFmcik7CiAgICBncmlkLWNvbHVtbi1nYXA6IDA7CiAgICBncmlkLXJvdy1nYXA6IDA7CiAgfQp9Clt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LWl0ZW0gYnV0dG9uIHsKICBtYXJnaW46IDA7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtaXRlbSA+IHNwYW4gewogIG1hcmdpbi1yaWdodDogMTVweDsKfQpbdGhlbWU9Y2FydF0gLmNhcnQtd3JhcHBlciAuY2FydC1pdGVtID4gc3BhbjpsYXN0LWNoaWxkIHsKICBtYXJnaW4tcmlnaHQ6IDA7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtaXRlbSAuaXRlbS1pbWFnZSB7CiAgZ3JpZC1hcmVhOiAxLzEvMy8yOwp9Clt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LWl0ZW0gLml0ZW0taW1hZ2UgaW1nIHsKICBtYXgtd2lkdGg6IDE1NnB4OwogIHdpZHRoOiAxMDAlOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtaXRlbSAuaXRlbS1pbWFnZSB7CiAgICBncmlkLWFyZWE6IDEvMS8yLzI7CiAgfQp9Clt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LWl0ZW0gLml0ZW0tZGF0YSB7CiAgZ3JpZC1hcmVhOiAxLzIvMi8zOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBmbGV4OiAxIDEgMTAwJTsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogIFt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LWl0ZW0gLml0ZW0tZGF0YSB7CiAgICBncmlkLWFyZWE6IDEvMi8yLzM7CiAgfQp9Clt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LWl0ZW0gLml0ZW0tdGl0bGUgewogIGZvbnQtZmFtaWx5OiAiSm9zZWZpbiBTYW5zIiwgQXJpYWwsICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICBmb250LXdlaWdodDogNzAwOwogIGZvbnQtc2l6ZTogMjJweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBjb2xvcjogIzAwMTM1MDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIG1hcmdpbi1ib3R0b206IDIwcHg7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtaXRlbSAuaXRlbS10aXRsZSBhIHsKICBjb2xvcjogaW5oZXJpdDsKfQpbdGhlbWU9Y2FydF0gLmNhcnQtd3JhcHBlciAuY2FydC1pdGVtIC5pdGVtLXByaWNlIHsKICBjb2xvcjogIzAwMDAyMzsKICBmb250LWZhbWlseTogcG9wcGluc2JvbGQsIEFyaWFsLCAiSGVsdmV0aWNhIE5ldWUiLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAyMHB4OwogIGxpbmUtaGVpZ2h0OiAzMHB4OwogIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgY29sb3I6ICMwMDAwMjM7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtaXRlbSAuaXRlbS1xdWFudGl0eSB7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBmb250LXNpemU6IDIwcHg7CiAgbGluZS1oZWlnaHQ6IDMwcHg7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBjb2xvcjogIzAwMDAyMzsKfQpbdGhlbWU9Y2FydF0gLmNhcnQtd3JhcHBlciAuY2FydC1pdGVtIC5pdGVtLXF1YW50aXR5IHNlbGVjdCB7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBib3JkZXI6IG5vbmU7CiAgbWluLXdpZHRoOiA2MHB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgY29sb3I6ICMwMDAwMjM7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtaXRlbSAuaXRlbS1xdWFudGl0eSA+IHNwYW4gewogIG1hcmdpbi1yaWdodDogMTVweDsKfQpbdGhlbWU9Y2FydF0gLmNhcnQtd3JhcHBlciAuY2FydC1pdGVtIC5yZW1vdmUtaWNvbiB7CiAgZ3JpZC1hcmVhOiAyLzIvMy8zOwogIHRleHQtYWxpZ246IHJpZ2h0Owp9Clt0aGVtZT1jYXJ0XSAuY2FydC13cmFwcGVyIC5jYXJ0LWl0ZW0gLnJlbW92ZS1pY29uIGJ1dHRvbiB7CiAgYmFja2dyb3VuZDogbm9uZTsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDI0cHg7CiAgdGV4dC1pbmRlbnQ6IC05OTk5OTk5OTk5OTk5OTk5OXB4OwogIG1heC13aWR0aDogMjRweDsKICBtaW4td2lkdGg6IDI0cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGJvcmRlcjogbm9uZTsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtaXRlbSAucmVtb3ZlLWljb24gYnV0dG9uOmFmdGVyIHsKICBjb250ZW50OiAiIjsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDI0cHg7CiAgYmFja2dyb3VuZDogdXJsKCIvcmVzb3VyY2VzL2ltYWdlcy9pY29uLXRyYXNoLnN2ZyIpIG5vLXJlcGVhdDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgW3RoZW1lPWNhcnRdIC5jYXJ0LXdyYXBwZXIgLmNhcnQtaXRlbSAucmVtb3ZlLWljb24gewogICAgZ3JpZC1hcmVhOiAxLzMvMi80OwogIH0KfQpbdGhlbWU9Y2FydF0gLmVtcHR5LWNhcnQtd3JhcHBlciB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KW3RoZW1lPWNhcnRdIC5lbXB0eS1jYXJ0LXdyYXBwZXIgLmVtcHR5LWNhcnQtaWNvbiB7CiAgaGVpZ2h0OiA0cmVtOwogIHdpZHRoOiAxMDAlOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgYmFja2dyb3VuZDogdXJsKCIvcmVzb3VyY2VzL2ltYWdlcy9zaG9wcGluZy1jYXJ0LnN2ZyIpIG5vLXJlcGVhdCBjZW50ZXI7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Clt0aGVtZT1jYXJ0XSAuZW1wdHktY2FydC13cmFwcGVyIGgyIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBjb2xvcjogIzAwMTM1MDsKfQpbdGhlbWU9Y2FydF0gLmVtcHR5LWNhcnQtd3JhcHBlciBwIHsKICBmb250LXNpemU6IDEuMnJlbTsKICBjb2xvcjogIzAwMTM1MDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTAyNHB4KSB7CiAgW3RoZW1lPWNhcnRdIC5lbXB0eS1jYXJ0LXdyYXBwZXIgcCB7CiAgICBmb250LXNpemU6IDEuNHJlbTsKICB9Cn0KW3RoZW1lPWNhcnRdIC5lbXB0eS1jYXJ0LXdyYXBwZXIgLmJ1dHRvbiB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmctbGVmdDogMzRweDsKICBwYWRkaW5nLXJpZ2h0OiAzNHB4OwogIGhlaWdodDogNDRweDsKICBmb250LXNpemU6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBib3JkZXItcmFkaXVzOiAwOwogIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGJhY2tncm91bmQ6ICNDRTk0MDA7CiAgY29sb3I6ICMwMDEzNTA7CiAgd2lkdGg6IGZpdC1jb250ZW50OwogIGhlaWdodDogNDRweDsKICBtYXJnaW46IDFyZW07Cn0KW3RoZW1lPWNhcnRdIC5lbXB0eS1jYXJ0LXdyYXBwZXIgLmJ1dHRvbjpob3ZlciwgW3RoZW1lPWNhcnRdIC5lbXB0eS1jYXJ0LXdyYXBwZXIgLmJ1dHRvbjphY3RpdmUgewogIGJhY2tncm91bmQ6ICNGRUI5MDc7Cn0KClt0aGVtZT1teS1hY2NvdW50XSBoMSB7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIG1hcmdpbi10b3A6IDMwcHg7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgZm9udC1zaXplOiAzMHB4OwogIGNvbG9yOiAjMDAxMzUwOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgW3RoZW1lPW15LWFjY291bnRdIGgxIHsKICAgIGZvbnQtc2l6ZTogNTBweDsKICB9Cn0KW3RoZW1lPW15LWFjY291bnRdIC5vcmRlci1oaXN0b3J5IHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgbWF4LXdpZHRoOiA5NDBweDsKICBtYXJnaW46IDAgYXV0bzsKfQpbdGhlbWU9bXktYWNjb3VudF0gLm9yZGVyLWhpc3RvcnkgLm9yZGVyLWl0ZW0gewogIHBhZGRpbmc6IDMwcHg7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogcm93OwogIGJhY2tncm91bmQ6ICNGMkYzRjY7CiAgbWFyZ2luLWJvdHRvbTogMzBweDsKICBnYXA6IDMwcHg7Cn0KW3RoZW1lPW15LWFjY291bnRdIC5vcmRlci1oaXN0b3J5IC5vcmRlci1pdGVtIC5vcmRlci1zdGF0dXMgewogIGRpc3BsYXk6IGZsZXg7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQpbdGhlbWU9bXktYWNjb3VudF0gLm9yZGVyLWhpc3RvcnkgLm9yZGVyLWl0ZW0gLm9yZGVyLXN0YXR1cyBpbWcgewogIG1heC13aWR0aDogMTAwJTsKICBtaW4td2lkdGg6IDEzMHB4Owp9Clt0aGVtZT1teS1hY2NvdW50XSAub3JkZXItaGlzdG9yeSAub3JkZXItaXRlbSAub3JkZXItc3RhdHVzIGEgewogIGFsaWduLXNlbGY6IGNlbnRlcjsKfQpbdGhlbWU9bXktYWNjb3VudF0gLm9yZGVyLWhpc3RvcnkgLm9yZGVyLWl0ZW0gLm9yZGVyLWltYWdlIHsKICBtYXgtd2lkdGg6IDE1NnB4OwogIG1heC1oZWlnaHQ6IDE1NnB4Owp9CkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDY0MHB4KSB7CiAgW3RoZW1lPW15LWFjY291bnRdIC5vcmRlci1oaXN0b3J5IC5vcmRlci1pdGVtIC5vcmRlci1zdGF0dXMgewogICAgZGlzcGxheTogbm9uZTsKICB9CiAgW3RoZW1lPW15LWFjY291bnRdIC5vcmRlci1oaXN0b3J5IC5vcmRlci1pdGVtIC5vcmRlci1pbWFnZSB7CiAgICBtYXgtd2lkdGg6IDEwMHB4OwogICAgbWF4LWhlaWdodDogMTAwcHg7CiAgfQp9Clt0aGVtZT1teS1hY2NvdW50XSAub3JkZXItaGlzdG9yeSAub3JkZXItaXRlbSAub3JkZXItaW5mbyB7CiAgZmxleDogMSAxIDEwMCU7Cn0KW3RoZW1lPW15LWFjY291bnRdIC5vcmRlci1oaXN0b3J5IC5vcmRlci1pdGVtIC5vcmRlci1pbmZvIGgzIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIG1hcmdpbi1ib3R0b206IDMwcHg7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBmb250LXNpemU6IDIycHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7Cn0KW3RoZW1lPW15LWFjY291bnRdIC5vcmRlci1oaXN0b3J5IC5vcmRlci1pdGVtIC5vcmRlci1pbmZvIC5vcmRlci1wcmljZSB7CiAgY29sb3I6ICMwMDAwMjM7CiAgZm9udC1mYW1pbHk6IHBvcHBpbnNib2xkLCBBcmlhbCwgIkhlbHZldGljYSBOZXVlIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMjBweDsKICBsaW5lLWhlaWdodDogMzBweDsKICBtYXJnaW4tYm90dG9tOiAzMHB4OwogIGRpc3BsYXk6IGJsb2NrOwp9Clt0aGVtZT1teS1hY2NvdW50XSAub3JkZXItaGlzdG9yeSAub3JkZXItaXRlbSAub3JkZXItaW5mbyAub3JkZXItZGV0YWlscyBzcGFuIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KW3RoZW1lPW15LWFjY291bnRdIC5vcmRlci1oaXN0b3J5IC5vcmRlci1pdGVtIC5vcmRlci1pbmZvIC5vcmRlci1kZXRhaWxzIHNwYW46Zmlyc3QtY2hpbGQgewogIG1hcmdpbi1yaWdodDogMzBweDsKfQpbdGhlbWU9bXktYWNjb3VudF0gLm9yZGVyLWhpc3RvcnkgLm9yZGVyLWl0ZW0gLm9yZGVyLWluZm8gLm9yZGVyLWRldGFpbHMgLm1vYmlsZS1vcmRlci1zdGF0dXMgewogIGRpc3BsYXk6IG5vbmU7Cn0KW3RoZW1lPW15LWFjY291bnRdIC5vcmRlci1oaXN0b3J5IC5vcmRlci1pdGVtIC5vcmRlci1pbmZvIC5vcmRlci1kZXRhaWxzIC5tb2JpbGUtb3JkZXItc3RhdHVzIGltZyB7CiAgd2lkdGg6IDEzMHB4OwogIG1hcmdpbi10b3A6IDEwcHg7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpIHsKICBbdGhlbWU9bXktYWNjb3VudF0gLm9yZGVyLWhpc3RvcnkgLm9yZGVyLWl0ZW0gLm9yZGVyLWluZm8gLm9yZGVyLWRldGFpbHMgLm1vYmlsZS1vcmRlci1zdGF0dXMgewogICAgZGlzcGxheTogYmxvY2s7CiAgfQp9Clt0aGVtZT1teS1hY2NvdW50XSAucHJvbWlzZS1saW5rIHsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIGZvbnQtc2l6ZTogMjBweDsKfQoKdWwuYnJlYWRjcnVtYnMgewogIGRpc3BsYXk6IGZsZXg7CiAgcGFkZGluZzogMDsKICBtYXJnaW4tdG9wOiAwOwogIG1hcmdpbi1ib3R0b206IDMwcHg7Cn0KdWwuYnJlYWRjcnVtYnMgbGkgewogIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKfQp1bC5icmVhZGNydW1icyBsaTphZnRlciB7CiAgY29udGVudDogIj4iOwogIGRpc3BsYXk6IGlubGluZS1mbGV4OwogIHdpZHRoOiAyNXB4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgY29sb3I6ICMwMDAwMjM7Cn0KdWwuYnJlYWRjcnVtYnMgbGk6bGFzdC1vZi10eXBlIHsKICBjb2xvcjogIzdGODVBNzsKfQp1bC5icmVhZGNydW1icyBsaTpsYXN0LW9mLXR5cGU6YWZ0ZXIgewogIGRpc3BsYXk6IG5vbmU7Cn0KdWwuYnJlYWRjcnVtYnMgbGkgYSB7CiAgY29sb3I6ICMwMDAwMjM7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIGZvbnQtc2l6ZTogMTRweDsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogIHVsLmJyZWFkY3J1bWJzIGxpIGEgewogICAgZm9udC1zaXplOiBpbmhlcml0OwogIH0KfQoKLnNlYXJjaCB7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KLnNlYXJjaCBmb3JtIHsKICBtYXgtd2lkdGg6IDM0MHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQouc2VhcmNoIGZvcm0gaW5wdXRbdHlwZT10ZXh0XSB7CiAgYm9yZGVyLXJhZGl1czogMTAwcHg7CiAgaGVpZ2h0OiAzOHB4Owp9Ci5zZWFyY2ggZm9ybSBidXR0b24gewogIGJhY2tncm91bmQ6IG5vbmU7CiAgaGVpZ2h0OiAzOHB4OwogIHdpZHRoOiAzOHB4OwogIHRleHQtaW5kZW50OiAtOTk5OTk5OTk5OTk5OTk5OTlweDsKICBtYXgtd2lkdGg6IDM4cHg7CiAgbWluLXdpZHRoOiAzOHB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICByaWdodDogMDsKICB0b3A6IDA7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDA7Cn0KLnNlYXJjaCBmb3JtIGJ1dHRvbjphZnRlciB7CiAgY29udGVudDogIiI7CiAgaGVpZ2h0OiAxOHB4OwogIHdpZHRoOiAxOHB4OwogIGJhY2tncm91bmQ6IHVybCgiL3Jlc291cmNlcy9pbWFnZXMvaWNvbi1zZWFyY2guc3ZnIikgbm8tcmVwZWF0OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICByaWdodDogMTBweDsKICB0b3A6IDEwcHg7Cn0KLnNlYXJjaCBmb3JtIGJ1dHRvbjpob3ZlciB7CiAgYmFja2dyb3VuZDogbm9uZTsKfQoKLmZvb3RlciB7CiAgbWF4LWhlaWdodDogNjE4cHg7CiAgaGVpZ2h0OiAxMDB2aDsKICBjb2xvcjogI2ZmZjsKICBkaXNwbGF5OiBncmlkOwogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmciAxZnIgMWZyOwogIGdyaWQtdGVtcGxhdGUtcm93czogMWZyOwogIGdhcDogMCAwOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogIC5mb290ZXIgewogICAgbWF4LWhlaWdodDogNTI4cHg7CiAgfQp9Ci5mb290ZXIgLmZvb3Rlci1jZW50ZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB6LWluZGV4OiAxNTsKICBwYWRkaW5nOiAwIDIwcHg7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KLmZvb3RlciAuZm9vdGVyLWNlbnRlciBwIHsKICBmb250LXNpemU6IDIwcHg7Cn0KLmZvb3RlciAuZm9vdGVyLWNlbnRlciBkaWFsb2cgewogIHdpZHRoOiAxMDAlOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEwMjRweCkgewogIC5mb290ZXIgLmZvb3Rlci1jZW50ZXIgZGlhbG9nIHsKICAgIG1heC13aWR0aDogMzNyZW07CiAgfQp9Ci5mb290ZXIgLmZvb3Rlci1jZW50ZXIgZGlhbG9nIC5jb3Vwb24td3JhcHBlciB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQouZm9vdGVyIC5mb290ZXItY2VudGVyIGRpYWxvZyAuY291cG9uLWluZm8gewogIGRpc3BsYXk6IGZsZXg7CiAgcGFkZGluZzogMXJlbSAwOwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgd2lkdGg6IDkwJTsKICBhbGlnbi1zZWxmOiBjZW50ZXI7Cn0KLmZvb3RlciAuZm9vdGVyLWNlbnRlciBkaWFsb2cgLmNvdXBvbi1pbmZvIGgxIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGZvbnQtc2l6ZTogMi41cmVtOwogIGNvbG9yOiAjMDAwMDIzOwogIG1hcmdpbjogMDsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMDI0cHgpIHsKICAuZm9vdGVyIC5mb290ZXItY2VudGVyIGRpYWxvZyAuY291cG9uLWluZm8gaDEgewogICAgZm9udC1zaXplOiAzLjVyZW07CiAgfQp9Ci5mb290ZXIgLmZvb3Rlci1jZW50ZXIgZGlhbG9nIC5jb3Vwb24taW5mbyBwIHsKICBtYXJnaW46IDAgMCAxcmVtIDA7Cn0KLmZvb3RlciAuZm9vdGVyLWNlbnRlciBkaWFsb2cgYnV0dG9uIHsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICBoZWlnaHQ6IDEuNnJlbTsKICB3aWR0aDogMS42cmVtOwogIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKICBib3JkZXI6IG5vbmU7CiAgY3Vyc29yOiBwb2ludGVyOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICBiYWNrZ3JvdW5kOiB1cmwoIi9yZXNvdXJjZXMvaW1hZ2VzL2Nsb3NlLWJ1dHRvbi5zdmciKSBuby1yZXBlYXQ7CiAgbWFyZ2luOiAwOwp9Ci5mb290ZXIgLmZvb3Rlci1jZW50ZXIgZGlhbG9nIC5jb3Vwb24taW5wdXQgewogIGRpc3BsYXk6IGZsZXg7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgbWFyZ2luOiAxLjVyZW07CiAgYm9yZGVyLXN0eWxlOiBkYXNoZWQ7CiAgYm9yZGVyLXdpZHRoOiB0aGluOwogIGJvcmRlci1jb2xvcjogIzAwQTJCOTsKICB3aWR0aDogODAlOwogIGFsaWduLXNlbGY6IGNlbnRlcjsKICBwYWRkaW5nOiAxLjFyZW0gMCAwLjc1cmVtOwp9Ci5mb290ZXIgLmZvb3Rlci1jZW50ZXIgZGlhbG9nIC5jb3Vwb24taW5wdXQgaDMgewogIGNvbG9yOiAjMDBBMkI5OwogIGZvbnQtc2l6ZTogMS4zcmVtOwogIG1hcmdpbjogMCAxcmVtIDAgMDsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMDI0cHgpIHsKICAuZm9vdGVyIC5mb290ZXItY2VudGVyIGRpYWxvZyAuY291cG9uLWlucHV0IGgzIHsKICAgIGZvbnQtc2l6ZTogMS44cmVtOwogIH0KfQouZm9vdGVyIC5mb290ZXItY2VudGVyIGRpYWxvZyAuY291cG9uLWlucHV0IGJ1dHRvbiB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogIGhlaWdodDogMS4ycmVtOwogIHdpZHRoOiAxLjJyZW07CiAgdHJhbnNpdGlvbjogYWxsIGVhc2UtaW4tb3V0IDMwMG1zOwogIGJvcmRlcjogbm9uZTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgYmFja2dyb3VuZDogdXJsKCIvcmVzb3VyY2VzL2ltYWdlcy9jb3B5LXRvLWNsaXBib2FyZC5zdmciKSBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwogIG1hcmdpbjogMCAwIDAuMWVtIDA7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTAyNHB4KSB7CiAgLmZvb3RlciAuZm9vdGVyLWNlbnRlciBkaWFsb2cgLmNvdXBvbi1pbnB1dCBidXR0b24gewogICAgaGVpZ2h0OiAxLjZyZW07CiAgICB3aWR0aDogMS42cmVtOwogICAgYmFja2dyb3VuZC1zaXplOiBhdXRvOwogIH0KfQouZm9vdGVyIC5mb290ZXItY2VudGVyIGRpYWxvZyAuY291cG9uLWlucHV0IC5jb3Vwb24tY29waWVkLXRpY2sgewogIGhlaWdodDogMS4ycmVtOwogIHdpZHRoOiAxLjJyZW07CiAgbWFyZ2luOiAwIDAgMC4xZW0gMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGJhY2tncm91bmQ6IHVybCgiL3Jlc291cmNlcy9pbWFnZXMvY2hlY2stY2lyY2xlLnN2ZyIpIG5vLXJlcGVhdDsKICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMDI0cHgpIHsKICAuZm9vdGVyIC5mb290ZXItY2VudGVyIGRpYWxvZyAuY291cG9uLWlucHV0IC5jb3Vwb24tY29waWVkLXRpY2sgewogICAgaGVpZ2h0OiAxLjZyZW07CiAgICB3aWR0aDogMS42cmVtOwogIH0KfQouZm9vdGVyIC5mb290ZXItY2VudGVyIC5mb3JtLCAuZm9vdGVyIC5mb290ZXItY2VudGVyIGZvcm0gewogIHBhZGRpbmctdG9wOiA1MHB4OwogIG1heC13aWR0aDogMzUwcHg7CiAgd2lkdGg6IDEwMCU7Cn0KLmZvb3RlciAuZm9vdGVyLWNlbnRlciAuZm9ybSBpbnB1dFt0eXBlPWVtYWlsXSwgLmZvb3RlciAuZm9vdGVyLWNlbnRlciBmb3JtIGlucHV0W3R5cGU9ZW1haWxdIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDQ0cHg7Cn0KLmZvb3RlciAuZm9vdGVyLWNlbnRlciAuZm9ybSAuYnV0dG9uLCAuZm9vdGVyIC5mb290ZXItY2VudGVyIGZvcm0gLmJ1dHRvbiB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmctbGVmdDogMzRweDsKICBwYWRkaW5nLXJpZ2h0OiAzNHB4OwogIGhlaWdodDogNDRweDsKICBmb250LXNpemU6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBib3JkZXItcmFkaXVzOiAwOwogIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGJhY2tncm91bmQ6ICNDRTk0MDA7CiAgY29sb3I6ICMwMDEzNTA7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiA0NHB4Owp9Ci5mb290ZXIgLmZvb3Rlci1jZW50ZXIgLmZvcm0gLmJ1dHRvbjpob3ZlciwgLmZvb3RlciAuZm9vdGVyLWNlbnRlciAuZm9ybSAuYnV0dG9uOmFjdGl2ZSwgLmZvb3RlciAuZm9vdGVyLWNlbnRlciBmb3JtIC5idXR0b246aG92ZXIsIC5mb290ZXIgLmZvb3Rlci1jZW50ZXIgZm9ybSAuYnV0dG9uOmFjdGl2ZSB7CiAgYmFja2dyb3VuZDogI0ZFQjkwNzsKfQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMDI0cHgpIHsKICAuZm9vdGVyIC5mb290ZXItY2VudGVyIC5mb3JtLCAuZm9vdGVyIC5mb290ZXItY2VudGVyIGZvcm0gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDE0OHB4OwogICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiAxZnI7CiAgICBncmlkLWNvbHVtbi1nYXA6IDIwcHg7CiAgICBncmlkLXJvdy1nYXA6IDA7CiAgICBtYXgtd2lkdGg6IDU4MHB4OwogIH0KICAuZm9vdGVyIC5mb290ZXItY2VudGVyIC5mb3JtIC5idXR0b24sIC5mb290ZXIgLmZvb3Rlci1jZW50ZXIgZm9ybSAuYnV0dG9uIHsKICAgIG1hcmdpbi10b3A6IDA7CiAgfQp9Ci5mb290ZXIgLmZvb3Rlci1jZW50ZXIgLnBvcnRzd2lnZ2VyLWxvZ28gewogIGJhY2tncm91bmQ6IHVybCgiL3Jlc291cmNlcy9pbWFnZXMvUG9ydHN3aWdnZXIucG5nIikgc2Nyb2xsIGNlbnRlciBjZW50ZXIgbm8tcmVwZWF0ICMwMDEzNTA7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwogIGhlaWdodDogNDBweDsKICBtYXJnaW4tdG9wOiAyMHB4OwogIG1hcmdpbi1ib3R0b206IDA7Cn0KLmZvb3RlciAuZm9vdGVyLWxlZnQsCi5mb290ZXIgLmZvb3Rlci1yaWdodCB7CiAgYmFja2dyb3VuZDogdXJsKCIvcmVzb3VyY2VzL2ltYWdlcy9mb290ZXJfZ3JhcGhpYy5qcGciKSBzY3JvbGwgYm90dG9tIGxlZnQgbm8tcmVwZWF0ICMwMDEzNTA7CiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOwp9Ci5mb290ZXIgLmZvb3Rlci1yaWdodCB7CiAgZ3JpZC1hcmVhOiAxLzMvMi81OwogIHRyYW5zZm9ybTogcm90YXRlWSgxODBkZWcpOwp9Ci5mb290ZXIgLmZvb3Rlci1sZWZ0IHsKICBncmlkLWFyZWE6IDEvMS8yLzM7Cn0KLmZvb3RlciAuZm9vdGVyLWNlbnRlciB7CiAgZ3JpZC1hcmVhOiAxLzEvMi81Owp9Ci5mb290ZXIgLmZvb3Rlci1jb3B5cmlnaHQgewogIGZvbnQtc2l6ZTogMTRweDsKfQouZm9vdGVyIGgyIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGZvbnQtc2l6ZTogMzBweDsKICBtYXJnaW4tYm90dG9tOiAzMHB4OwogIGNvbG9yOiAjZmZmOwp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDU5OHB4KSB7CiAgLmZvb3RlciBoMiB7CiAgICBmb250LXNpemU6IDQwcHg7CiAgfQp9Ci5mb290ZXIgcCB7CiAgbWF4LXdpZHRoOiA3ODBweDsKfQouZm9vdGVyIC5uZXdzbGV0dGVyLXNpZ251cC1yZXNwb25zZSB7CiAgbWFyZ2luLXRvcDogNDBweDsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQouZm9vdGVyIC5uZXdzbGV0dGVyLXNpZ251cC1yZXNwb25zZSAuZW1haWwtc2lnbnVwLWNvbmZpcm0gewogIGRpc3BsYXk6IGZsZXg7Cn0KLmZvb3RlciAubmV3c2xldHRlci1zaWdudXAtcmVzcG9uc2UgLmVtYWlsLXNpZ251cC1jb25maXJtOmJlZm9yZSB7CiAgY29udGVudDogIiI7CiAgYmFja2dyb3VuZDogdXJsKCIvcmVzb3VyY2VzL2ltYWdlcy9jaGVjay1jaXJjbGUuc3ZnIikgbm8tcmVwZWF0OwogIGhlaWdodDogMzBweDsKICB3aWR0aDogMzBweDsKICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyOwogIG1hcmdpbi1yaWdodDogMTVweDsKICBkaXNwbGF5OiBibG9jazsKfQouZm9vdGVyIC5uZXdzbGV0dGVyLXNpZ251cC1yZXNwb25zZSBoMyB7CiAgY29sb3I6ICNmZmY7CiAgZm9udC1zaXplOiAyMnB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiSm9zZWZpbiBTYW5zIiwgQXJpYWwsICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGNvbG9yOiBpbmhlcml0Owp9Ci5mb290ZXIgLm5ld3NsZXR0ZXItc2lnbnVwLXJlc3BvbnNlLmVycm9yIHsKICBjb2xvcjogI2Q2MDAwMDsKfQouZm9vdGVyIC5uZXdzbGV0dGVyLXNpZ251cC1yZXNwb25zZS5lcnJvcjpiZWZvcmUgewogIGRpc3BsYXk6IG5vbmU7Cn0KLmZvb3RlciAubmV3c2xldHRlci1zaWdudXAtcmVzcG9uc2UgaDQgewogIGRpc3BsYXk6IG5vbmU7Cn0KCi5mb290ZXItbG93ZXIgewogIGhlaWdodDogNjBweDsKICBiYWNrZ3JvdW5kOiAjMDAwMDIzOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IHJvdzsKICBhbGlnbi1pdGVtczogY2VudGVyOwp9Ci5mb290ZXItbG93ZXIgLmZvb3Rlck5hdmlnYXRpb24gewogIGRpc3BsYXk6IGZsZXg7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICB3aWR0aDogMTAwJTsKICBtYXgtd2lkdGg6IDExNDBweDsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICBtYXJnaW46IDAgYXV0bzsKICBoZWlnaHQ6IDEwMCU7CiAgcGFkZGluZzogMCAyMHB4OwogIGJveC1zaXppbmc6IGNvbnRlbnQtYm94Owp9CkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7CiAgLmZvb3Rlci1sb3dlciAuZm9vdGVyTmF2aWdhdGlvbiB7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgfQp9Ci5mb290ZXItbG93ZXIgLmZvb3Rlck5hdmlnYXRpb24gLnNvY2lhbExpbmtzIHsKICB3aWR0aDogMjIwcHg7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQouZm9vdGVyLWxvd2VyIC5mb290ZXJOYXZpZ2F0aW9uIC5zb2NpYWxMaW5rcyBhIHsKICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgcGFkZGluZy1sZWZ0OiAzNHB4OwogIHBhZGRpbmctcmlnaHQ6IDM0cHg7CiAgaGVpZ2h0OiA0NHB4OwogIGZvbnQtc2l6ZTogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogIGJvcmRlci1yYWRpdXM6IDA7CiAgdHJhbnNpdGlvbjogYWxsIGVhc2UtaW4tb3V0IDMwMG1zOwogIGN1cnNvcjogcG9pbnRlcjsKICBmb250LXdlaWdodDogNjAwOwogIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgY29sb3I6ICM3Rjg1QTc7CiAgcGFkZGluZy1sZWZ0OiAwOwogIHBhZGRpbmctcmlnaHQ6IDA7CiAgbWluLXdpZHRoOiAwOwogIGhlaWdodDogMjRweDsKICB3aWR0aDogMjRweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KLmZvb3Rlci1sb3dlciAuZm9vdGVyTmF2aWdhdGlvbiAuc29jaWFsTGlua3MgYTpob3ZlciwgLmZvb3Rlci1sb3dlciAuZm9vdGVyTmF2aWdhdGlvbiAuc29jaWFsTGlua3MgYTphY3RpdmUsIC5mb290ZXItbG93ZXIgLmZvb3Rlck5hdmlnYXRpb24gLnNvY2lhbExpbmtzIGEuc2VsZWN0ZWQgewogIGNvbG9yOiAjQ0U5NDAwOwp9Ci5mb290ZXItbG93ZXIgLmZvb3Rlck5hdmlnYXRpb24gLnNvY2lhbExpbmtzIGEgc3ZnIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDI0cHg7Cn0KLmZvb3Rlci1sb3dlciAuZm9vdGVyTmF2aWdhdGlvbiBuYXYgewogIGRpc3BsYXk6IG5vbmU7Cn0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY4cHgpIHsKICAuZm9vdGVyLWxvd2VyIC5mb290ZXJOYXZpZ2F0aW9uIG5hdiB7CiAgICBkaXNwbGF5OiBjb250ZW50czsKICB9Cn0KLmZvb3Rlci1sb3dlciAuZm9vdGVyTmF2aWdhdGlvbiBuYXYgLmJ1dHRvbiB7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBhZGRpbmctbGVmdDogMzRweDsKICBwYWRkaW5nLXJpZ2h0OiAzNHB4OwogIGhlaWdodDogNDRweDsKICBmb250LXNpemU6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICBib3JkZXItcmFkaXVzOiAwOwogIHRyYW5zaXRpb246IGFsbCBlYXNlLWluLW91dCAzMDBtczsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZm9udC13ZWlnaHQ6IDYwMDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogIGNvbG9yOiAjN0Y4NUE3OwogIHBhZGRpbmctbGVmdDogMDsKICBwYWRkaW5nLXJpZ2h0OiAwOwogIG1pbi13aWR0aDogMDsKfQouZm9vdGVyLWxvd2VyIC5mb290ZXJOYXZpZ2F0aW9uIG5hdiAuYnV0dG9uOmhvdmVyLCAuZm9vdGVyLWxvd2VyIC5mb290ZXJOYXZpZ2F0aW9uIG5hdiAuYnV0dG9uOmFjdGl2ZSwgLmZvb3Rlci1sb3dlciAuZm9vdGVyTmF2aWdhdGlvbiBuYXYgLmJ1dHRvbi5zZWxlY3RlZCB7CiAgY29sb3I6ICNDRTk0MDA7Cn0KLmZvb3Rlci1sb3dlciAuZm9vdGVyTmF2aWdhdGlvbiBuYXYgdWwgewogIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgbWFyZ2luOiAwOwp9Ci5mb290ZXItbG93ZXIgLmZvb3Rlck5hdmlnYXRpb24gbmF2IHVsIGxpIHsKICBtYXJnaW4tbGVmdDogNDBweDsKfQouZm9vdGVyLWxvd2VyIC5mb290ZXJOYXZpZ2F0aW9uIG5hdiB1bCBsaTpmaXJzdC1jaGlsZCB7CiAgbWFyZ2luLWxlZnQ6IDA7Cn0KCi5pcy1sb2dpbiB7CiAgYmFja2dyb3VuZDogdXJsKCIvcmVzb3VyY2VzL2ltYWdlcy9kYXJrLWJsdWUtc3F1aWdnbGUtcGF0dGVybi10aWxlLmpwZyIpIHNjcm9sbCBjZW50ZXIgY2VudGVyIHJlcGVhdCAhaW1wb3J0YW50Owp9Ci5pcy1sb2dpbiBbdGhlbWU9bG9naW5dIHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBoZWlnaHQ6IDEwMHZoOwp9Ci5pcy1sb2dpbiBbdGhlbWU9bG9naW5dIC5tYWluY29udGFpbmVyIHsKICB3aWR0aDogODAlOwogIG1heC13aWR0aDogNzQycHg7Cn0KLmlzLWxvZ2luIFt0aGVtZT1sb2dpbl0gLm1haW5jb250YWluZXIgLmNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiBhdXRvOwp9Ci5pcy1sb2dpbiAjc2Nhbk1lSGVhZGVyLAouaXMtbG9naW4gLmZvb3Rlci13cmFwcGVyIHsKICBkaXNwbGF5OiBub25lOwp9CgojdnVsbmVyYWJpbGl0aWVzLWNvbnRlbnQgewogIGZvbnQtc2l6ZTogMTJwdDsKfQoKI3Z1bG5lcmFiaWxpdGllcy1oZWFkZXIgewogIHRleHQtYWxpZ246IGNlbnRlcjsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KI3Z1bG5lcmFiaWxpdGllcy1oZWFkZXIgaDEgewogIGNvbG9yOiAjMDAxMzUwOwogIGZvbnQtc2l6ZTogNTBweDsKfQojdnVsbmVyYWJpbGl0aWVzLWhlYWRlciBwIHsKICB3aWR0aDogODAlOwogIGFsaWduLXNlbGY6IGNlbnRlcjsKICBmb250LXNpemU6IDIwcHg7CiAgY29sb3I6ICMwMDAwMjM7CiAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQojdnVsbmVyYWJpbGl0aWVzLWhlYWRlciBhIHsKICBjb2xvcjogIzAwMDAyMzsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQojdnVsbmVyYWJpbGl0aWVzLWhlYWRlciBhOmhvdmVyIHsKICBjb2xvcjogIzAwQTJCOTsKfQoKI3Z1bG5lcmFiaWxpdGllcy1sb2dpbi1kZXRhaWxzIHsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQojdnVsbmVyYWJpbGl0aWVzLWxvZ2luLWRldGFpbHMgaDEgewogIGNvbG9yOiAjMDAxMzUwOwogIGZvbnQtc2l6ZTogMjJweDsKICBtYXJnaW4tYm90dG9tOiAwOwogIG1hcmdpbi10b3A6IDMwcHg7Cn0KI3Z1bG5lcmFiaWxpdGllcy1sb2dpbi1kZXRhaWxzIHRyIHsKICBjb2xvcjogIzAwMDAyMzsKICBmb250LXNpemU6IDIwcHg7CiAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQojdnVsbmVyYWJpbGl0aWVzLWxvZ2luLWRldGFpbHMgI3NlcGFyYXRvciB7CiAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgI0YyRjNGNjsKICBoZWlnaHQ6IDE1cHg7CiAgd2lkdGg6IDJweDsKfQojdnVsbmVyYWJpbGl0aWVzLWxvZ2luLWRldGFpbHMgdGgsICN2dWxuZXJhYmlsaXRpZXMtbG9naW4tZGV0YWlscyB0ZCB7CiAgcGFkZGluZzogMCA0cHggMCA0cHg7Cn0KCiN2dWxuZXJhYmlsaXRpZXMtcGF0aC1kZXRhaWxzIHRoLCAjdnVsbmVyYWJpbGl0aWVzLXBhdGgtZGV0YWlscyB0ZCB7CiAgcGFkZGluZzogOHB4IDhweCA0cHggOHB4Owp9CiN2dWxuZXJhYmlsaXRpZXMtcGF0aC1kZXRhaWxzIHRoIHsKICBiYWNrZ3JvdW5kOiAjRjJGM0Y2Owp9CgovKiMgc291cmNlTWFwcGluZ1VSTD1sYWJzU2Nhbm1lLmNzcy5tYXAgKi8K","response_hash":"9f218bd7edce86bc1781f05d3e44e8f85f3b87f2b7ad4a9f92e3770df1f8839d","response_time_ms":0,"response_words":8841,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"css","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":18},{"name":"3","value":"labsScanme.css","type":"path","name_start":-1,"name_end":-1,"value_start":19,"value_end":33}],"sent_at":"2026-04-05T05:31:31.576237Z","received_at":"2026-04-05T05:31:31.576228Z","created_at":"2026-04-05T05:31:31Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"http_record","data":{"uuid":"caaba428-b260-444f-9293-6333bba64dd7","project_uuid":"00000000-0000-0000-0000-000000000001","scheme":"https","hostname":"ginandjuice.shop","port":443,"ip":"34.246.169.176","method":"GET","path":"/resources/js/react.development.js","url":"https://ginandjuice.shop/resources/js/react.development.js","http_version":"HTTP/1.1","request_headers":{"Accept-Language":["en"],"Host":["ginandjuice.shop"],"Referer":["https://ginandjuice.shop/"],"User-Agent":["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"]},"request_content_length":0,"raw_request":"R0VUIC9yZXNvdXJjZXMvanMvcmVhY3QuZGV2ZWxvcG1lbnQuanMgSFRUUC8xLjENCkhvc3Q6IGdpbmFuZGp1aWNlLnNob3ANClJlZmVyZXI6IGh0dHBzOi8vZ2luYW5kanVpY2Uuc2hvcC8NClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE1XzcpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMTQuMC4wLjAgU2FmYXJpLzUzNy4zNg0KQWNjZXB0LUxhbmd1YWdlOiBlbg0KDQo=","request_hash":"30b64134b71500c0c02002cf0dd3c4a2e0f8b5adb2088e1a5148c26a7152cfe9","status_code":200,"response_http_version":"HTTP/1.1","response_headers":{"cache-control":["public, max-age=3600"],"content-encoding":["gzip"],"content-length":["28375"],"content-type":["application/javascript; charset=utf-8"],"date":["Sun, 05 Apr 2026 05:31:31 GMT"],"x-backend":["c98df5c4-a527-4daa-88cd-83c5de4e7c77"],"x-frame-options":["SAMEORIGIN"]},"response_content_type":"application/javascript; charset=utf-8","response_content_length":109909,"raw_response":"SFRUUC8xLjEgMjAwIE9LDQpjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgNCngtZnJhbWUtb3B0aW9uczogU0FNRU9SSUdJTg0KY2FjaGUtY29udHJvbDogcHVibGljLCBtYXgtYWdlPTM2MDANCmNvbnRlbnQtbGVuZ3RoOiAyODM3NQ0KeC1iYWNrZW5kOiBjOThkZjVjNC1hNTI3LTRkYWEtODhjZC04M2M1ZGU0ZTdjNzcNCmRhdGU6IFN1biwgMDUgQXByIDIwMjYgMDU6MzE6MzEgR01UDQpjb250ZW50LWVuY29kaW5nOiBnemlwDQoNCi8qKgogKiBAbGljZW5zZSBSZWFjdAogKiByZWFjdC5kZXZlbG9wbWVudC5qcwogKgogKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7CiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6CiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6CiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbC5SZWFjdCA9IHt9KSk7Cn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsKCiAgdmFyIFJlYWN0VmVyc2lvbiA9ICcxOC4yLjAnOwoKICAvLyBBVFRFTlRJT04KICAvLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsCiAgLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJwogIC8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLgogIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7CiAgdmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7CiAgdmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpOwogIHZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTsKICB2YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7CiAgdmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpOwogIHZhciBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7CiAgdmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpOwogIHZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTsKICB2YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpOwogIHZhciBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7CiAgdmFyIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTsKICB2YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKCdyZWFjdC5vZmZzY3JlZW4nKTsKICB2YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yOwogIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsKICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHsKICAgIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0JykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07CgogICAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBtYXliZUl0ZXJhdG9yOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0KCiAgLyoqCiAgICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci4KICAgKi8KICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IHsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9CiAgICAgKi8KICAgIGN1cnJlbnQ6IG51bGwKICB9OwoKICAvKioKICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBiYXRjaCdzIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyBob3cgbG9uZyBhbiB1cGRhdGUKICAgKiBzaG91bGQgc3VzcGVuZCBmb3IgaWYgaXQgbmVlZHMgdG8uCiAgICovCiAgdmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0gewogICAgdHJhbnNpdGlvbjogbnVsbAogIH07CgogIHZhciBSZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IHsKICAgIGN1cnJlbnQ6IG51bGwsCiAgICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLgogICAgaXNCYXRjaGluZ0xlZ2FjeTogZmFsc2UsCiAgICBkaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZTogZmFsc2UKICB9OwoKICAvKioKICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci4KICAgKgogICAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNob3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmUKICAgKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuCiAgICovCiAgdmFyIFJlYWN0Q3VycmVudE93bmVyID0gewogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH0KICAgICAqLwogICAgY3VycmVudDogbnVsbAogIH07CgogIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0ge307CiAgdmFyIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBudWxsOwogIGZ1bmN0aW9uIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjaykgewogICAgewogICAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7CiAgICB9CiAgfQoKICB7CiAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZSA9IGZ1bmN0aW9uIChzdGFjaykgewogICAgICB7CiAgICAgICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrOwogICAgICB9CiAgICB9OyAvLyBTdGFjayBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCBieSB0aGUgY3VycmVudCByZW5kZXJlci4KCgogICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsOwoKICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0YWNrID0gJyc7IC8vIEFkZCBhbiBleHRyYSB0b3AgZnJhbWUgd2hpbGUgYW4gZWxlbWVudCBpcyBiZWluZyB2YWxpZGF0ZWQKCiAgICAgIGlmIChjdXJyZW50RXh0cmFTdGFja0ZyYW1lKSB7CiAgICAgICAgc3RhY2sgKz0gY3VycmVudEV4dHJhU3RhY2tGcmFtZTsKICAgICAgfSAvLyBEZWxlZ2F0ZSB0byB0aGUgaW5qZWN0ZWQgcmVuZGVyZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb24KCgogICAgICB2YXIgaW1wbCA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrOwoKICAgICAgaWYgKGltcGwpIHsKICAgICAgICBzdGFjayArPSBpbXBsKCkgfHwgJyc7CiAgICAgIH0KCiAgICAgIHJldHVybiBzdGFjazsKICAgIH07CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICB2YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLgogIHZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTsKICB2YXIgZW5hYmxlVHJhbnNpdGlvblRyYWNpbmcgPSBmYWxzZTsgLy8gTm8ga25vd24gYnVncywgYnV0IG5lZWRzIHBlcmZvcm1hbmNlIHRlc3RpbmcKCiAgdmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXIKICAvLyBzdHVmZi4gSW50ZW5kZWQgdG8gZW5hYmxlIFJlYWN0IGNvcmUgbWVtYmVycyB0byBtb3JlIGVhc2lseSBkZWJ1ZyBzY2hlZHVsaW5nCiAgLy8gaXNzdWVzIGluIERFViBidWlsZHMuCgogIHZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuCgogIHZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IHsKICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsCiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzogUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsCiAgICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXIKICB9OwoKICB7CiAgICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTsKICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWU7CiAgfQoKICAvLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLgogIC8vCiAgLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSwKICAvLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuCgogIGZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7CiAgICB7CiAgICAgIHsKICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7CiAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTsKICAgICAgICB9CgogICAgICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7CiAgICB7CiAgICAgIHsKICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykgewogICAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTsKICAgICAgICB9CgogICAgICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykgewogICAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvCiAgICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC4KICAgIHsKICAgICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lOwogICAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTsKCiAgICAgIGlmIChzdGFjayAhPT0gJycpIHsKICAgICAgICBmb3JtYXQgKz0gJyVzJzsKICAgICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7CiAgICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uCgoKICAgICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pOwogICAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXgKCiAgICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdAogICAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwCiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcKCiAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7CiAgICB9CiAgfQoKICB2YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge307CgogIGZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7CiAgICB7CiAgICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjsKICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBfY29uc3RydWN0b3IgJiYgKF9jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBfY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnOwogICAgICB2YXIgd2FybmluZ0tleSA9IGNvbXBvbmVudE5hbWUgKyAiLiIgKyBjYWxsZXJOYW1lOwoKICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgZXJyb3IoIkNhbid0IGNhbGwgJXMgb24gYSBjb21wb25lbnQgdGhhdCBpcyBub3QgeWV0IG1vdW50ZWQuICIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7CgogICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlOwogICAgfQogIH0KICAvKioKICAgKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS4KICAgKi8KCgogIHZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHsKICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLgogICAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKiBAZmluYWwKICAgICAqLwogICAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICAvKioKICAgICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGgKICAgICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLgogICAgICoKICAgICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGUKICAgICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLgogICAgICoKICAgICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2UKICAgICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuCiAgICAgKgogICAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuCiAgICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7CiAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuCiAgICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuCiAgICAgKgogICAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc28KICAgICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuCiAgICAgKgogICAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuCiAgICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLgogICAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC4KICAgICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHsKICAgICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXMKICAgICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcAogICAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0CiAgICAgKiBkdXJpbmcgdGhlIG1lcmdlLgogICAgICoKICAgICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLgogICAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuCiAgICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7CiAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTsKICAgIH0KICB9OwoKICB2YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjsKCiAgdmFyIGVtcHR5T2JqZWN0ID0ge307CgogIHsKICAgIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpOwogIH0KICAvKioKICAgKiBCYXNlIGNsYXNzIGhlbHBlcnMgZm9yIHRoZSB1cGRhdGluZyBzdGF0ZSBvZiBhIGNvbXBvbmVudC4KICAgKi8KCgogIGZ1bmN0aW9uIENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikgewogICAgdGhpcy5wcm9wcyA9IHByb3BzOwogICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuCgogICAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlCiAgICAvLyByZW5kZXJlci4KCiAgICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlOwogIH0KCiAgQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307CiAgLyoqCiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyB0byBtdXRhdGUKICAgKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLgogICAqCiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc28KICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLgogICAqCiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCB3aWxsIHJ1biBzeW5jaHJvbm91c2x5LAogICAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbAogICAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5CiAgICogY29tcGxldGVkLgogICAqCiAgICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluCiAgICogdGhlIGZ1dHVyZSAobm90IHN5bmNocm9ub3VzbHkpLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSB1cCB0byBkYXRlCiAgICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnQKICAgKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZQogICAqIHNob3VsZENvbXBvbmVudFVwZGF0ZSwgYW5kIHRoaXMgbmV3IHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgd2lsbCBub3QgeWV0IGJlCiAgICogYXNzaWduZWQgdG8gdGhpcy4KICAgKgogICAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIG9yIGZ1bmN0aW9uIHRvCiAgICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuCiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLgogICAqIEBmaW5hbAogICAqIEBwcm90ZWN0ZWQKICAgKi8KCiAgQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7CiAgICBpZiAodHlwZW9mIHBhcnRpYWxTdGF0ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHBhcnRpYWxTdGF0ZSAhPT0gJ2Z1bmN0aW9uJyAmJiBwYXJ0aWFsU3RhdGUgIT0gbnVsbCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgJyArICdmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJyk7CiAgICB9CgogICAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTsKICB9OwogIC8qKgogICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGgKICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi4KICAgKgogICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGUKICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC4KICAgKgogICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2UKICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLgogICAqCiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuCiAgICogQGZpbmFsCiAgICogQHByb3RlY3RlZAogICAqLwoKCiAgQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7CiAgfTsKICAvKioKICAgKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlCiAgICogd2Ugd291bGQgbGlrZSB0byBkZXByZWNhdGUgdGhlbSwgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgdGhlbSBvdmVyIHRvIHRoaXMKICAgKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC4KICAgKi8KCgogIHsKICAgIHZhciBkZXByZWNhdGVkQVBJcyA9IHsKICAgICAgaXNNb3VudGVkOiBbJ2lzTW91bnRlZCcsICdJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGluZyByZXF1ZXN0cyBpbiAnICsgJ2NvbXBvbmVudFdpbGxVbm1vdW50IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLiddLAogICAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXQogICAgfTsKCiAgICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudC5wcm90b3R5cGUsIG1ldGhvZE5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7CgogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgIH0pOwogICAgfTsKCiAgICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHsKICAgICAgaWYgKGRlcHJlY2F0ZWRBUElzLmhhc093blByb3BlcnR5KGZuTmFtZSkpIHsKICAgICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fQoKICBDb21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlOwogIC8qKgogICAqIENvbnZlbmllbmNlIGNvbXBvbmVudCB3aXRoIGRlZmF1bHQgc2hhbGxvdyBlcXVhbGl0eSBjaGVjayBmb3Igc0NVLgogICAqLwoKICBmdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7CiAgICB0aGlzLnByb3BzID0gcHJvcHM7CiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci4KCiAgICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDsKICAgIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7CiAgfQoKICB2YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7CiAgcHVyZUNvbXBvbmVudFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFB1cmVDb21wb25lbnQ7IC8vIEF2b2lkIGFuIGV4dHJhIHByb3RvdHlwZSBqdW1wIGZvciB0aGVzZSBtZXRob2RzLgoKICBhc3NpZ24ocHVyZUNvbXBvbmVudFByb3RvdHlwZSwgQ29tcG9uZW50LnByb3RvdHlwZSk7CiAgcHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7CgogIC8vIGFuIGltbXV0YWJsZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBtdXRhYmxlIHZhbHVlCiAgZnVuY3Rpb24gY3JlYXRlUmVmKCkgewogICAgdmFyIHJlZk9iamVjdCA9IHsKICAgICAgY3VycmVudDogbnVsbAogICAgfTsKCiAgICB7CiAgICAgIE9iamVjdC5zZWFsKHJlZk9iamVjdCk7CiAgICB9CgogICAgcmV0dXJuIHJlZk9iamVjdDsKICB9CgogIHZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmUKCiAgZnVuY3Rpb24gaXNBcnJheShhKSB7CiAgICByZXR1cm4gaXNBcnJheUltcGwoYSk7CiAgfQoKICAvKgogICAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbAogICAqIGFuZCBUZW1wb3JhbC4qIHR5cGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjIwNjQuCiAgICoKICAgKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsCiAgICogZWFzaWVyLXRvLWRlYnVnIGV4Y2VwdGlvbiB3aXRoIGEgY2xlYXIgZXJyb3JzIG1lc3NhZ2UgbWVzc2FnZSBleHBsYWluaW5nIHRoZQogICAqIHByb2JsZW0uIChJbnN0ZWFkIG9mIGEgY29uZnVzaW5nIGV4Y2VwdGlvbiB0aHJvd24gaW5zaWRlIHRoZSBpbXBsZW1lbnRhdGlvbgogICAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuCiAgICovCiAgLy8gJEZsb3dGaXhNZSBvbmx5IGNhbGxlZCBpbiBERVYsIHNvIHZvaWQgcmV0dXJuIGlzIG5vdCBwb3NzaWJsZS4KICBmdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkgewogICAgewogICAgICAvLyB0b1N0cmluZ1RhZyBpcyBuZWVkZWQgZm9yIG5hbWVzcGFjZWQgdHlwZXMgbGlrZSBUZW1wb3JhbC5JbnN0YW50CiAgICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnOwogICAgICB2YXIgdHlwZSA9IGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JzsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CiAgfSAvLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLgoKCiAgZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHsKICAgIHsKICAgICAgdHJ5IHsKICAgICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHsKICAgIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQncwogICAgLy8gaGFwcGVuZWQ6IHlvdSBzdXBwbGllZCBhbiBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIFJlYWN0IChhcyBhIHByb3AsIGtleSwKICAgIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG8KICAgIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgogICAgLy8KICAgIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlcwogICAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGEKICAgIC8vIGB2YWx1ZU9mYCBvciBgW1N5bWJvbC50b1ByaW1pdGl2ZV1gIG1ldGhvZCB0aGF0IHRocm93cyB3aWxsIGFsc28gY2F1c2UgdGhpcwogICAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluCiAgICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b20KICAgIC8vIG1ldGhvZHMgYXJlIG5lZWRlZCB0byBwZXJmb3JtIGFjY3VyYXRlIGFyaXRobWV0aWMgb3IgY29tcGFyaXNvbi4pCiAgICAvLwogICAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZQogICAgLy8gcGFzc2luZyBpdCB0byBSZWFjdC4gVGhlIG1vc3QgcmVsaWFibGUgd2F5IGlzIHVzdWFsbHkgYFN0cmluZyh2YWx1ZSlgLgogICAgLy8KICAgIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuCiAgICAvLyBCZWZvcmUgdGhpcyBleGNlcHRpb24gd2FzIHRocm93biwgdGhlcmUgc2hvdWxkIGJlIGBjb25zb2xlLmVycm9yYCBvdXRwdXQKICAgIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGUKICAgIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuCiAgICAvLyBJbiBtb3N0IGNhc2VzLCB0aGlzIGNvbnNvbGUgb3V0cHV0IGFsc28gc2hvd3MgdGhlIGNvbXBvbmVudCBhbmQgaXRzCiAgICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuCiAgICAvLwogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uCiAgICByZXR1cm4gJycgKyB2YWx1ZTsKICB9CiAgZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkgewogICAgewogICAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7CiAgICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTsKCiAgICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpCiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkgewogICAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lOwoKICAgIGlmIChkaXNwbGF5TmFtZSkgewogICAgICByZXR1cm4gZGlzcGxheU5hbWU7CiAgICB9CgogICAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJzsKICAgIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyAiKCIgKyBmdW5jdGlvbk5hbWUgKyAiKSIgOiB3cmFwcGVyTmFtZTsKICB9IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcgoKCiAgZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkgewogICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnOwogIH0gLy8gTm90ZSB0aGF0IHRoZSByZWNvbmNpbGVyIHBhY2thZ2Ugc2hvdWxkIGdlbmVyYWxseSBwcmVmZXIgdG8gdXNlIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoKSBpbnN0ZWFkLgoKCiAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHsKICAgIGlmICh0eXBlID09IG51bGwpIHsKICAgICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHsKICAgICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHsKICAgICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpOwogICAgICB9CiAgICB9CgogICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsOwogICAgfQoKICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CgogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRToKICAgICAgICByZXR1cm4gJ0ZyYWdtZW50JzsKCiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6CiAgICAgICAgcmV0dXJuICdQb3J0YWwnOwoKICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOgogICAgICAgIHJldHVybiAnUHJvZmlsZXInOwoKICAgICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOgogICAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7CgogICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6CiAgICAgICAgcmV0dXJuICdTdXNwZW5zZSc7CgogICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRToKICAgICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7CgogICAgfQoKICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHsKICAgICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7CiAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6CiAgICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7CiAgICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJzsKCiAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOgogICAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTsKICAgICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJzsKCiAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOgogICAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpOwoKICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRToKICAgICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7CgogICAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gb3V0ZXJOYW1lOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnTWVtbyc7CgogICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOgogICAgICAgICAgewogICAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7CiAgICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDsKICAgICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0OwoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGluaXQocGF5bG9hZCkpOwogICAgICAgICAgICB9IGNhdGNoICh4KSB7CiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoCiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7CgogIHZhciBSRVNFUlZFRF9QUk9QUyA9IHsKICAgIGtleTogdHJ1ZSwKICAgIHJlZjogdHJ1ZSwKICAgIF9fc2VsZjogdHJ1ZSwKICAgIF9fc291cmNlOiB0cnVlCiAgfTsKICB2YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duLCBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzOwoKICB7CiAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307CiAgfQoKICBmdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHsKICAgIHsKICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHsKICAgICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7CgogICAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDsKICB9CgogIGZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykgewogICAgewogICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkgewogICAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDsKCiAgICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkOwogIH0KCiAgZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7CiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkgewogICAgICB7CiAgICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikgewogICAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlOwoKICAgICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHsKICAgICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHsKICAgIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHsKICAgICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7CiAgICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7CgogICAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywgewogICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZiwKICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpIHsKICAgIHsKICAgICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIGNvbmZpZy5fX3NlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IGNvbmZpZy5fX3NlbGYpIHsKICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpOwoKICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHsKICAgICAgICAgIGVycm9yKCdDb21wb25lbnQgIiVzIiBjb250YWlucyB0aGUgc3RyaW5nIHJlZiAiJXMiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7CgogICAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvCiAgICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2sKICAgKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2sKICAgKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LgogICAqCiAgICogQHBhcmFtIHsqfSB0eXBlCiAgICogQHBhcmFtIHsqfSBwcm9wcwogICAqIEBwYXJhbSB7Kn0ga2V5CiAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWYKICAgKiBAcGFyYW0geyp9IG93bmVyCiAgICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzCiAgICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZQogICAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93CiAgICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBubwogICAqIGNoYW5nZSBpbiBiZWhhdmlvci4KICAgKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSkKICAgKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLgogICAqIEBpbnRlcm5hbAogICAqLwoKCiAgdmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHsKICAgIHZhciBlbGVtZW50ID0gewogICAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnQKICAgICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSwKICAgICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudAogICAgICB0eXBlOiB0eXBlLAogICAgICBrZXk6IGtleSwKICAgICAgcmVmOiByZWYsCiAgICAgIHByb3BzOiBwcm9wcywKICAgICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC4KICAgICAgX293bmVyOiBvd25lcgogICAgfTsKCiAgICB7CiAgICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb24KICAgICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC4KICAgICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpbgogICAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy4KICAgICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2UKICAgICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZAogICAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29yawogICAgICAvLyBpZ25vcmVzIGl0LgoKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywgewogICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgd3JpdGFibGU6IHRydWUsCiAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgIH0pOyAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuCgogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywgewogICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgd3JpdGFibGU6IGZhbHNlLAogICAgICAgIHZhbHVlOiBzZWxmCiAgICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZAogICAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi4KCiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHsKICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgIHdyaXRhYmxlOiBmYWxzZSwKICAgICAgICB2YWx1ZTogc291cmNlCiAgICAgIH0pOwoKICAgICAgaWYgKE9iamVjdC5mcmVlemUpIHsKICAgICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpOwogICAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZWxlbWVudDsKICB9OwogIC8qKgogICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCBvZiB0aGUgZ2l2ZW4gdHlwZS4KICAgKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnQKICAgKi8KCiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7CiAgICB2YXIgcHJvcE5hbWU7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWQKCiAgICB2YXIgcHJvcHMgPSB7fTsKICAgIHZhciBrZXkgPSBudWxsOwogICAgdmFyIHJlZiA9IG51bGw7CiAgICB2YXIgc2VsZiA9IG51bGw7CiAgICB2YXIgc291cmNlID0gbnVsbDsKCiAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKICAgICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHsKICAgICAgICByZWYgPSBjb25maWcucmVmOwoKICAgICAgICB7CiAgICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7CiAgICAgICAgewogICAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTsKICAgICAgICB9CgogICAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTsKICAgICAgfQoKICAgICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmOwogICAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3QKCiAgICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7CiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkgewogICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250bwogICAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuCgoKICAgIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyOwoKICAgIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkgewogICAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwogICAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHsKICAgICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHsKICAgICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTsKICAgICAgfQoKICAgICAgewogICAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7CiAgICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5OwogICAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHMKCgogICAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHsKICAgICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzOwoKICAgICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHsKICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgewogICAgICBpZiAoa2V5IHx8IHJlZikgewogICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTsKCiAgICAgICAgaWYgKGtleSkgewogICAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTsKICAgICAgICB9CgogICAgICAgIGlmIChyZWYpIHsKICAgICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7CiAgfQogIGZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHsKICAgIHZhciBuZXdFbGVtZW50ID0gUmVhY3RFbGVtZW50KG9sZEVsZW1lbnQudHlwZSwgbmV3S2V5LCBvbGRFbGVtZW50LnJlZiwgb2xkRWxlbWVudC5fc2VsZiwgb2xkRWxlbWVudC5fc291cmNlLCBvbGRFbGVtZW50Ll9vd25lciwgb2xkRWxlbWVudC5wcm9wcyk7CiAgICByZXR1cm4gbmV3RWxlbWVudDsKICB9CiAgLyoqCiAgICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnQKICAgKi8KCiAgZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIGNvbmZpZywgY2hpbGRyZW4pIHsKICAgIGlmIChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkICIgKyBlbGVtZW50ICsgIi4iKTsKICAgIH0KCiAgICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWQKCiAgICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkCgogICAgdmFyIGtleSA9IGVsZW1lbnQua2V5OwogICAgdmFyIHJlZiA9IGVsZW1lbnQucmVmOyAvLyBTZWxmIGlzIHByZXNlcnZlZCBzaW5jZSB0aGUgb3duZXIgaXMgcHJlc2VydmVkLgoKICAgIHZhciBzZWxmID0gZWxlbWVudC5fc2VsZjsgLy8gU291cmNlIGlzIHByZXNlcnZlZCBzaW5jZSBjbG9uZUVsZW1lbnQgaXMgdW5saWtlbHkgdG8gYmUgdGFyZ2V0ZWQgYnkgYQogICAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZQogICAgLy8gdHJ1ZSBvd25lci4KCiAgICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuCgogICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7CgogICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CiAgICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7CiAgICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuCiAgICAgICAgcmVmID0gY29uZmlnLnJlZjsKICAgICAgICBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7CiAgICAgIH0KCiAgICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7CiAgICAgICAgewogICAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTsKICAgICAgICB9CgogICAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTsKICAgICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wcwoKCiAgICAgIHZhciBkZWZhdWx0UHJvcHM7CgogICAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHsKICAgICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzOwogICAgICB9CgogICAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykgewogICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKICAgICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzCiAgICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvCiAgICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC4KCgogICAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7CgogICAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7CiAgICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47CiAgICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkgewogICAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykgewogICAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdOwogICAgICB9CgogICAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7CiAgICB9CgogICAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7CiAgfQogIC8qKgogICAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuCiAgICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudAogICAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0CiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC4KICAgKiBAZmluYWwKICAgKi8KCiAgZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7CiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFOwogIH0KCiAgdmFyIFNFUEFSQVRPUiA9ICcuJzsKICB2YXIgU1VCU0VQQVJBVE9SID0gJzonOwogIC8qKgogICAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuCiAgICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuCiAgICovCgogIGZ1bmN0aW9uIGVzY2FwZShrZXkpIHsKICAgIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7CiAgICB2YXIgZXNjYXBlckxvb2t1cCA9IHsKICAgICAgJz0nOiAnPTAnLAogICAgICAnOic6ICc9MicKICAgIH07CiAgICB2YXIgZXNjYXBlZFN0cmluZyA9IGtleS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHsKICAgICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdOwogICAgfSk7CiAgICByZXR1cm4gJyQnICsgZXNjYXBlZFN0cmluZzsKICB9CiAgLyoqCiAgICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5CiAgICogcGF0dGVybi4KICAgKi8KCgogIHZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7CiAgdmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1wvKy9nOwoKICBmdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkgewogICAgcmV0dXJuIHRleHQucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpOwogIH0KICAvKioKICAgKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgZWxlbWVudCB3aXRoaW4gYSBzZXQuCiAgICoKICAgKiBAcGFyYW0geyp9IGVsZW1lbnQgQSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuCiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLgogICAqIEByZXR1cm4ge3N0cmluZ30KICAgKi8KCgogIGZ1bmN0aW9uIGdldEVsZW1lbnRLZXkoZWxlbWVudCwgaW5kZXgpIHsKICAgIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlCiAgICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy4KICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ29iamVjdCcgJiYgZWxlbWVudCAhPT0gbnVsbCAmJiBlbGVtZW50LmtleSAhPSBudWxsKSB7CiAgICAgIC8vIEV4cGxpY2l0IGtleQogICAgICB7CiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihlbGVtZW50LmtleSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBlc2NhcGUoJycgKyBlbGVtZW50LmtleSk7CiAgICB9IC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0CgoKICAgIHJldHVybiBpbmRleC50b1N0cmluZygzNik7CiAgfQoKICBmdW5jdGlvbiBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuYW1lU29GYXIsIGNhbGxiYWNrKSB7CiAgICB2YXIgdHlwZSA9IHR5cGVvZiBjaGlsZHJlbjsKCiAgICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7CiAgICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLgogICAgICBjaGlsZHJlbiA9IG51bGw7CiAgICB9CgogICAgdmFyIGludm9rZUNhbGxiYWNrID0gZmFsc2U7CgogICAgaWYgKGNoaWxkcmVuID09PSBudWxsKSB7CiAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgY2FzZSAnbnVtYmVyJzoKICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdvYmplY3QnOgogICAgICAgICAgc3dpdGNoIChjaGlsZHJlbi4kJHR5cGVvZikgewogICAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRToKICAgICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRToKICAgICAgICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7CiAgICAgICAgICB9CgogICAgICB9CiAgICB9CgogICAgaWYgKGludm9rZUNhbGxiYWNrKSB7CiAgICAgIHZhciBfY2hpbGQgPSBjaGlsZHJlbjsKICAgICAgdmFyIG1hcHBlZENoaWxkID0gY2FsbGJhY2soX2NoaWxkKTsgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXkKICAgICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93czoKCiAgICAgIHZhciBjaGlsZEtleSA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRFbGVtZW50S2V5KF9jaGlsZCwgMCkgOiBuYW1lU29GYXI7CgogICAgICBpZiAoaXNBcnJheShtYXBwZWRDaGlsZCkpIHsKICAgICAgICB2YXIgZXNjYXBlZENoaWxkS2V5ID0gJyc7CgogICAgICAgIGlmIChjaGlsZEtleSAhPSBudWxsKSB7CiAgICAgICAgICBlc2NhcGVkQ2hpbGRLZXkgPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoY2hpbGRLZXkpICsgJy8nOwogICAgICAgIH0KCiAgICAgICAgbWFwSW50b0FycmF5KG1hcHBlZENoaWxkLCBhcnJheSwgZXNjYXBlZENoaWxkS2V5LCAnJywgZnVuY3Rpb24gKGMpIHsKICAgICAgICAgIHJldHVybiBjOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHsKICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7CiAgICAgICAgICB7CiAgICAgICAgICAgIC8vIFRoZSBgaWZgIHN0YXRlbWVudCBoZXJlIHByZXZlbnRzIGF1dG8tZGlzYWJsaW5nIG9mIHRoZSBzYWZlCiAgICAgICAgICAgIC8vIGNvZXJjaW9uIEVTTGludCBydWxlLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGRpc2FibGUgaXQgYmVsb3cuCiAgICAgICAgICAgIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleQogICAgICAgICAgICBpZiAobWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkpIHsKICAgICAgICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1hcHBlZENoaWxkLmtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXMKICAgICAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlbgogICAgICAgICAgZXNjYXBlZFByZWZpeCArICggLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5CiAgICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXIKICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvbgogICAgICAgICAgZXNjYXBlVXNlclByb3ZpZGVkS2V5KCcnICsgbWFwcGVkQ2hpbGQua2V5KSArICcvJyA6ICcnKSArIGNoaWxkS2V5KTsKICAgICAgICB9CgogICAgICAgIGFycmF5LnB1c2gobWFwcGVkQ2hpbGQpOwogICAgICB9CgogICAgICByZXR1cm4gMTsKICAgIH0KCiAgICB2YXIgY2hpbGQ7CiAgICB2YXIgbmV4dE5hbWU7CiAgICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS4KCiAgICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SOwoKICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTsKICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaSk7CiAgICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7CgogICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICB2YXIgaXRlcmFibGVDaGlsZHJlbiA9IGNoaWxkcmVuOwoKICAgICAgICB7CiAgICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW4KICAgICAgICAgIGlmIChpdGVyYXRvckZuID09PSBpdGVyYWJsZUNoaWxkcmVuLmVudHJpZXMpIHsKICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7CiAgICAgICAgICAgICAgd2FybignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlQ2hpbGRyZW4pOwogICAgICAgIHZhciBzdGVwOwogICAgICAgIHZhciBpaSA9IDA7CgogICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHsKICAgICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTsKICAgICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpaSsrKTsKICAgICAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JykgewogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvbgogICAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICIgKyAoY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nKSArICIpLiAiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHN1YnRyZWVDb3VudDsKICB9CgogIC8qKgogICAqIE1hcHMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLgogICAqCiAgICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwCiAgICoKICAgKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaAogICAqIGxlYWYgY2hpbGQuCiAgICoKICAgKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci4KICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi4KICAgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBmb3IgbWFwRnVuY3Rpb24uCiAgICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy4KICAgKi8KICBmdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkgewogICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsKICAgICAgcmV0dXJuIGNoaWxkcmVuOwogICAgfQoKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIHZhciBjb3VudCA9IDA7CiAgICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHsKICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgY291bnQrKyk7CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIC8qKgogICAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcwogICAqIGBwcm9wcy5jaGlsZHJlbmAuCiAgICoKICAgKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudAogICAqCiAgICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuCiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLgogICAqLwoKCiAgZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikgewogICAgdmFyIG4gPSAwOwogICAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHsKICAgICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmcKICAgIH0pOwogICAgcmV0dXJuIG47CiAgfQoKICAvKioKICAgKiBJdGVyYXRlcyB0aHJvdWdoIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC4KICAgKgogICAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2gKICAgKgogICAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoCiAgICogbGVhZiBjaGlsZC4KICAgKgogICAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLgogICAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmMKICAgKiBAcGFyYW0geyp9IGZvckVhY2hDb250ZXh0IENvbnRleHQgZm9yIGZvckVhY2hDb250ZXh0LgogICAqLwogIGZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7CiAgICBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKCkgewogICAgICBmb3JFYWNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmcuCiAgICB9LCBmb3JFYWNoQ29udGV4dCk7CiAgfQogIC8qKgogICAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kCiAgICogcmV0dXJuIGFuIGFycmF5IHdpdGggYXBwcm9wcmlhdGVseSByZS1rZXllZCBjaGlsZHJlbi4KICAgKgogICAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXkKICAgKi8KCgogIGZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHsKICAgIHJldHVybiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgIHJldHVybiBjaGlsZDsKICAgIH0pIHx8IFtdOwogIH0KICAvKioKICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmUKICAgKiBpcyBvbmx5IG9uZSBjaGlsZCBpbiB0aGUgY29sbGVjdGlvbi4KICAgKgogICAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHkKICAgKgogICAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgc2luZ2xlIGNoaWxkIGdldHMKICAgKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0bwogICAqIGFic3RyYWN0IGF3YXkgdGhlIHBhcnRpY3VsYXIgc3RydWN0dXJlIG9mIGNoaWxkcmVuLgogICAqCiAgICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS4KICAgKiBAcmV0dXJuIHtSZWFjdEVsZW1lbnR9IFRoZSBmaXJzdCBhbmQgb25seSBgUmVhY3RFbGVtZW50YCBjb250YWluZWQgaW4gdGhlCiAgICogc3RydWN0dXJlLgogICAqLwoKCiAgZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7CiAgICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLicpOwogICAgfQoKICAgIHJldHVybiBjaGlsZHJlbjsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKSB7CiAgICAvLyBUT0RPOiBTZWNvbmQgYXJndW1lbnQgdXNlZCB0byBiZSBhbiBvcHRpb25hbCBgY2FsY3VsYXRlQ2hhbmdlZEJpdHNgCiAgICAvLyBmdW5jdGlvbi4gV2FybiB0byByZXNlcnZlIGZvciBmdXR1cmUgdXNlPwogICAgdmFyIGNvbnRleHQgPSB7CiAgICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsCiAgICAgIC8vIEFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQgcmVuZGVyZXJzLCB3ZSBjYXRlZ29yaXplCiAgICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0CiAgICAgIC8vIHRoZXJlIHRvIGJlIHR3byBjb25jdXJyZW50IHJlbmRlcmVycyBhdCBtb3N0OiBSZWFjdCBOYXRpdmUgKHByaW1hcnkpIGFuZAogICAgICAvLyBGYWJyaWMgKHNlY29uZGFyeSk7IFJlYWN0IERPTSAocHJpbWFyeSkgYW5kIFJlYWN0IEFSVCAoc2Vjb25kYXJ5KS4KICAgICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuCiAgICAgIF9jdXJyZW50VmFsdWU6IGRlZmF1bHRWYWx1ZSwKICAgICAgX2N1cnJlbnRWYWx1ZTI6IGRlZmF1bHRWYWx1ZSwKICAgICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5CiAgICAgIC8vIHN1cHBvcnRzIHdpdGhpbiBpbiBhIHNpbmdsZSByZW5kZXJlci4gU3VjaCBhcyBwYXJhbGxlbCBzZXJ2ZXIgcmVuZGVyaW5nLgogICAgICBfdGhyZWFkQ291bnQ6IDAsCiAgICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhcgogICAgICBQcm92aWRlcjogbnVsbCwKICAgICAgQ29uc3VtZXI6IG51bGwsCiAgICAgIC8vIEFkZCB0aGVzZSB0byB1c2Ugc2FtZSBoaWRkZW4gY2xhc3MgaW4gVk0gYXMgU2VydmVyQ29udGV4dAogICAgICBfZGVmYXVsdFZhbHVlOiBudWxsLAogICAgICBfZ2xvYmFsTmFtZTogbnVsbAogICAgfTsKICAgIGNvbnRleHQuUHJvdmlkZXIgPSB7CiAgICAgICQkdHlwZW9mOiBSRUFDVF9QUk9WSURFUl9UWVBFLAogICAgICBfY29udGV4dDogY29udGV4dAogICAgfTsKICAgIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IGZhbHNlOwogICAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7CiAgICB2YXIgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSBmYWxzZTsKCiAgICB7CiAgICAgIC8vIEEgc2VwYXJhdGUgb2JqZWN0LCBidXQgcHJveGllcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9iamVjdCBmb3IKICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGhhcyBhIGRpZmZlcmVudCAkJHR5cGVvZiwgc28gd2UgY2FuIHByb3Blcmx5CiAgICAgIC8vIHdhcm4gZm9yIHRoZSBpbmNvcnJlY3QgdXNhZ2Ugb2YgQ29udGV4dCBhcyBhIENvbnN1bWVyLgogICAgICB2YXIgQ29uc3VtZXIgPSB7CiAgICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSwKICAgICAgICBfY29udGV4dDogY29udGV4dAogICAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlCgogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwgewogICAgICAgIFByb3ZpZGVyOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikgewogICAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gdHJ1ZTsKCiAgICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Qcm92aWRlcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Qcm92aWRlcj4gaW5zdGVhZD8nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuUHJvdmlkZXI7CiAgICAgICAgICB9LAogICAgICAgICAgc2V0OiBmdW5jdGlvbiAoX1Byb3ZpZGVyKSB7CiAgICAgICAgICAgIGNvbnRleHQuUHJvdmlkZXIgPSBfUHJvdmlkZXI7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBfY3VycmVudFZhbHVlOiB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7CiAgICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IF9jdXJyZW50VmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBfY3VycmVudFZhbHVlMjogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyOwogICAgICAgICAgfSwKICAgICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUyKSB7CiAgICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIF90aHJlYWRDb3VudDogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll90aHJlYWRDb3VudDsKICAgICAgICAgIH0sCiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfdGhyZWFkQ291bnQpIHsKICAgICAgICAgICAgY29udGV4dC5fdGhyZWFkQ291bnQgPSBfdGhyZWFkQ291bnQ7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBDb25zdW1lcjogewogICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMpIHsKICAgICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IHRydWU7CgogICAgICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuQ29uc3VtZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZGlzcGxheU5hbWU6IHsKICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gY29udGV4dC5kaXNwbGF5TmFtZTsKICAgICAgICAgIH0sCiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChkaXNwbGF5TmFtZSkgewogICAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyKSB7CiAgICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArICJZb3Ugc2hvdWxkIHNldCBpdCBkaXJlY3RseSBvbiB0aGUgY29udGV4dCB3aXRoIENvbnRleHQuZGlzcGxheU5hbWUgPSAnJXMnLiIsIGRpc3BsYXlOYW1lKTsKCiAgICAgICAgICAgICAgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbWlzc2luZyBwcm9wZXJ0aWVzIGJlY2F1c2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIGRlZmluZVByb3BlcnR5CgogICAgICBjb250ZXh0LkNvbnN1bWVyID0gQ29uc3VtZXI7CiAgICB9CgogICAgewogICAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSBudWxsOwogICAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIyID0gbnVsbDsKICAgIH0KCiAgICByZXR1cm4gY29udGV4dDsKICB9CgogIHZhciBVbmluaXRpYWxpemVkID0gLTE7CiAgdmFyIFBlbmRpbmcgPSAwOwogIHZhciBSZXNvbHZlZCA9IDE7CiAgdmFyIFJlamVjdGVkID0gMjsKCiAgZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHsKICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHsKICAgICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7CiAgICAgIHZhciB0aGVuYWJsZSA9IGN0b3IoKTsgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS4KICAgICAgLy8gVGhpcyBtaWdodCB0aHJvdyBlaXRoZXIgYmVjYXVzZSBpdCdzIG1pc3Npbmcgb3IgdGhyb3dzLiBJZiBzbywgd2UgdHJlYXQgaXQKICAgICAgLy8gYXMgc3RpbGwgdW5pbml0aWFsaXplZCBhbmQgdHJ5IGFnYWluIG5leHQgdGltZS4gV2hpY2ggaXMgdGhlIHNhbWUgYXMgd2hhdAogICAgICAvLyBoYXBwZW5zIGlmIHRoZSBjdG9yIG9yIGFueSB3cmFwcGVycyBwcm9jZXNzaW5nIHRoZSBjdG9yIHRocm93cy4gVGhpcyBtaWdodAogICAgICAvLyBlbmQgdXAgZml4aW5nIGl0IGlmIHRoZSByZXNvbHV0aW9uIHdhcyBhIGNvbmN1cnJlbmN5IGJ1Zy4KCiAgICAgIHRoZW5hYmxlLnRoZW4oZnVuY3Rpb24gKG1vZHVsZU9iamVjdCkgewogICAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcgfHwgcGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7CiAgICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLgogICAgICAgICAgdmFyIHJlc29sdmVkID0gcGF5bG9hZDsKICAgICAgICAgIHJlc29sdmVkLl9zdGF0dXMgPSBSZXNvbHZlZDsKICAgICAgICAgIHJlc29sdmVkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3Q7CiAgICAgICAgfQogICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkgewogICAgICAgICAgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS4KICAgICAgICAgIHZhciByZWplY3RlZCA9IHBheWxvYWQ7CiAgICAgICAgICByZWplY3RlZC5fc3RhdHVzID0gUmVqZWN0ZWQ7CiAgICAgICAgICByZWplY3RlZC5fcmVzdWx0ID0gZXJyb3I7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAvLyBJbiBjYXNlLCB3ZSdyZSBzdGlsbCB1bmluaXRpYWxpemVkLCB0aGVuIHdlJ3JlIHdhaXRpbmcgZm9yIHRoZSB0aGVuYWJsZQogICAgICAgIC8vIHRvIHJlc29sdmUuIFNldCBpdCBhcyBwZW5kaW5nIGluIHRoZSBtZWFudGltZS4KICAgICAgICB2YXIgcGVuZGluZyA9IHBheWxvYWQ7CiAgICAgICAgcGVuZGluZy5fc3RhdHVzID0gUGVuZGluZzsKICAgICAgICBwZW5kaW5nLl9yZXN1bHQgPSB0aGVuYWJsZTsKICAgICAgfQogICAgfQoKICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFJlc29sdmVkKSB7CiAgICAgIHZhciBtb2R1bGVPYmplY3QgPSBwYXlsb2FkLl9yZXN1bHQ7CgogICAgICB7CiAgICAgICAgaWYgKG1vZHVsZU9iamVjdCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wJyArICdvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXG5cbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyAib3J0KCcuL015Q29tcG9uZW50JykpXG5cbiIgKyAnRGlkIHlvdSBhY2NpZGVudGFsbHkgcHV0IGN1cmx5IGJyYWNlcyBhcm91bmQgdGhlIGltcG9ydD8nLCBtb2R1bGVPYmplY3QpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgewogICAgICAgIGlmICghKCdkZWZhdWx0JyBpbiBtb2R1bGVPYmplY3QpKSB7CiAgICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wJyArICdvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXG5cbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyAib3J0KCcuL015Q29tcG9uZW50JykpIiwgbW9kdWxlT2JqZWN0KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBtb2R1bGVPYmplY3QuZGVmYXVsdDsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IHBheWxvYWQuX3Jlc3VsdDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGxhenkoY3RvcikgewogICAgdmFyIHBheWxvYWQgPSB7CiAgICAgIC8vIFdlIHVzZSB0aGVzZSBmaWVsZHMgdG8gc3RvcmUgdGhlIHJlc3VsdC4KICAgICAgX3N0YXR1czogVW5pbml0aWFsaXplZCwKICAgICAgX3Jlc3VsdDogY3RvcgogICAgfTsKICAgIHZhciBsYXp5VHlwZSA9IHsKICAgICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSwKICAgICAgX3BheWxvYWQ6IHBheWxvYWQsCiAgICAgIF9pbml0OiBsYXp5SW5pdGlhbGl6ZXIKICAgIH07CgogICAgewogICAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIGp1c3Qgc2V0IGl0IG9uIHRoZSBvYmplY3QuCiAgICAgIHZhciBkZWZhdWx0UHJvcHM7CiAgICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWUKCiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7CiAgICAgICAgZGVmYXVsdFByb3BzOiB7CiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9wczsKICAgICAgICAgIH0sCiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHsKICAgICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYGRlZmF1bHRQcm9wc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTsKCiAgICAgICAgICAgIGRlZmF1bHRQcm9wcyA9IG5ld0RlZmF1bHRQcm9wczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6CiAgICAgICAgICAgIC8vICRGbG93Rml4TWUKCiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ2RlZmF1bHRQcm9wcycsIHsKICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgcHJvcFR5cGVzOiB7CiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHByb3BUeXBlczsKICAgICAgICAgIH0sCiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHsKICAgICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTsKCiAgICAgICAgICAgIHByb3BUeXBlcyA9IG5ld1Byb3BUeXBlczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6CiAgICAgICAgICAgIC8vICRGbG93Rml4TWUKCiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ3Byb3BUeXBlcycsIHsKICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgcmV0dXJuIGxhenlUeXBlOwogIH0KCiAgZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHsKICAgIHsKICAgICAgaWYgKHJlbmRlciAhPSBudWxsICYmIHJlbmRlci4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7CiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZXF1aXJlcyBhIHJlbmRlciBmdW5jdGlvbiBidXQgd2FzIGdpdmVuICVzLicsIHJlbmRlciA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiByZW5kZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChyZW5kZXIubGVuZ3RoICE9PSAwICYmIHJlbmRlci5sZW5ndGggIT09IDIpIHsKICAgICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgYWNjZXB0IGV4YWN0bHkgdHdvIHBhcmFtZXRlcnM6IHByb3BzIGFuZCByZWYuICVzJywgcmVuZGVyLmxlbmd0aCA9PT0gMSA/ICdEaWQgeW91IGZvcmdldCB0byB1c2UgdGhlIHJlZiBwYXJhbWV0ZXI/JyA6ICdBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQuJyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAocmVuZGVyICE9IG51bGwpIHsKICAgICAgICBpZiAocmVuZGVyLmRlZmF1bHRQcm9wcyAhPSBudWxsIHx8IHJlbmRlci5wcm9wVHlwZXMgIT0gbnVsbCkgewogICAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdmFyIGVsZW1lbnRUeXBlID0gewogICAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSwKICAgICAgcmVuZGVyOiByZW5kZXIKICAgIH07CgogICAgewogICAgICB2YXIgb3duTmFtZTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnRUeXBlLCAnZGlzcGxheU5hbWUnLCB7CiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIG93bk5hbWU7CiAgICAgICAgfSwKICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLAogICAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS4KICAgICAgICAgIC8vIEJ1dCBpdCdzIG5pY2UgZm9yIGFub255bW91cyBmdW5jdGlvbnMgdG8gaW5oZXJpdCB0aGUgbmFtZSwKICAgICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuCiAgICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOgogICAgICAgICAgLy8gICBSZWFjdC5mb3J3YXJkUmVmKChwcm9wcywgcmVmKSA9PiB7Li4ufSk7CiAgICAgICAgICAvLyBUaGlzIGtpbmQgb2YgaW5uZXIgZnVuY3Rpb24gaXMgbm90IHVzZWQgZWxzZXdoZXJlIHNvIHRoZSBzaWRlIGVmZmVjdCBpcyBva2F5LgoKICAgICAgICAgIGlmICghcmVuZGVyLm5hbWUgJiYgIXJlbmRlci5kaXNwbGF5TmFtZSkgewogICAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgcmV0dXJuIGVsZW1lbnRUeXBlOwogIH0KCiAgdmFyIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0U7CgogIHsKICAgIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7CiAgfQoKICBmdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkgewogICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS4KCgogICAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7CiAgICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdAogICAgICAvLyB0eXBlcyBzdXBwb3J0ZWQgYnkgYW55IEZsaWdodCBjb25maWd1cmF0aW9uIGFueXdoZXJlIHNpbmNlCiAgICAgIC8vIHdlIGRvbid0IGtub3cgd2hpY2ggRmxpZ2h0IGJ1aWxkIHRoaXMgd2lsbCBlbmQgdXAgYmVpbmcgdXNlZAogICAgICAvLyB3aXRoLgogICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFIHx8IHR5cGUuZ2V0TW9kdWxlSWQgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7CiAgICB7CiAgICAgIGlmICghaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpKSB7CiAgICAgICAgZXJyb3IoJ21lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkICcgKyAncmVjZWl2ZWQ6ICVzJywgdHlwZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB0eXBlKTsKICAgICAgfQogICAgfQoKICAgIHZhciBlbGVtZW50VHlwZSA9IHsKICAgICAgJCR0eXBlb2Y6IFJFQUNUX01FTU9fVFlQRSwKICAgICAgdHlwZTogdHlwZSwKICAgICAgY29tcGFyZTogY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbXBhcmUKICAgIH07CgogICAgewogICAgICB2YXIgb3duTmFtZTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnRUeXBlLCAnZGlzcGxheU5hbWUnLCB7CiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIG93bk5hbWU7CiAgICAgICAgfSwKICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICBvd25OYW1lID0gbmFtZTsgLy8gVGhlIGlubmVyIGNvbXBvbmVudCBzaG91bGRuJ3QgaW5oZXJpdCB0aGlzIGRpc3BsYXkgbmFtZSBpbiBtb3N0IGNhc2VzLAogICAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS4KICAgICAgICAgIC8vIEJ1dCBpdCdzIG5pY2UgZm9yIGFub255bW91cyBmdW5jdGlvbnMgdG8gaW5oZXJpdCB0aGUgbmFtZSwKICAgICAgICAgIC8vIHNvIHRoYXQgb3VyIGNvbXBvbmVudC1zdGFjayBnZW5lcmF0aW9uIGxvZ2ljIHdpbGwgZGlzcGxheSB0aGVpciBmcmFtZXMuCiAgICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOgogICAgICAgICAgLy8gICBSZWFjdC5tZW1vKChwcm9wcykgPT4gey4uLn0pOwogICAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS4KCiAgICAgICAgICBpZiAoIXR5cGUubmFtZSAmJiAhdHlwZS5kaXNwbGF5TmFtZSkgewogICAgICAgICAgICB0eXBlLmRpc3BsYXlOYW1lID0gbmFtZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiBlbGVtZW50VHlwZTsKICB9CgogIGZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkgewogICAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7CgogICAgewogICAgICBpZiAoZGlzcGF0Y2hlciA9PT0gbnVsbCkgewogICAgICAgIGVycm9yKCdJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yJyArICcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcbicgKyAnMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXG4nICsgJzIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcbicgKyAnMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS4nKTsKICAgICAgfQogICAgfSAvLyBXaWxsIHJlc3VsdCBpbiBhIG51bGwgYWNjZXNzIGVycm9yIGlmIGFjY2Vzc2VkIG91dHNpZGUgcmVuZGVyIHBoYXNlLiBXZQogICAgLy8gaW50ZW50aW9uYWxseSBkb24ndCB0aHJvdyBvdXIgb3duIGVycm9yIGJlY2F1c2UgdGhpcyBpcyBpbiBhIGhvdCBwYXRoLgogICAgLy8gQWxzbyBoZWxwcyBlbnN1cmUgdGhpcyBpcyBpbmxpbmVkLgoKCiAgICByZXR1cm4gZGlzcGF0Y2hlcjsKICB9CiAgZnVuY3Rpb24gdXNlQ29udGV4dChDb250ZXh0KSB7CiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7CgogICAgewogICAgICAvLyBUT0RPOiBhZGQgYSBtb3JlIGdlbmVyaWMgd2FybmluZyBmb3IgaW52YWxpZCB2YWx1ZXMuCiAgICAgIGlmIChDb250ZXh0Ll9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICB2YXIgcmVhbENvbnRleHQgPSBDb250ZXh0Ll9jb250ZXh0OyAvLyBEb24ndCBkZWR1cGxpY2F0ZSBiZWNhdXNlIHRoaXMgbGVnaXRpbWF0ZWx5IGNhdXNlcyBidWdzCiAgICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLgoKICAgICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHsKICAgICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Db25zdW1lcikgaXMgbm90IHN1cHBvcnRlZCwgbWF5IGNhdXNlIGJ1Z3MsIGFuZCB3aWxsIGJlICcgKyAncmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7CiAgICAgICAgfSBlbHNlIGlmIChyZWFsQ29udGV4dC5Qcm92aWRlciA9PT0gQ29udGV4dCkgewogICAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQpOwogIH0KICBmdW5jdGlvbiB1c2VTdGF0ZShpbml0aWFsU3RhdGUpIHsKICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTsKICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7CiAgfQogIGZ1bmN0aW9uIHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkgewogICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpOwogICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTsKICB9CiAgZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkgewogICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpOwogICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVmKGluaXRpYWxWYWx1ZSk7CiAgfQogIGZ1bmN0aW9uIHVzZUVmZmVjdChjcmVhdGUsIGRlcHMpIHsKICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTsKICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpOwogIH0KICBmdW5jdGlvbiB1c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7CiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7CiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTsKICB9CiAgZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykgewogICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpOwogICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7CiAgfQogIGZ1bmN0aW9uIHVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7CiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7CiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7CiAgfQogIGZ1bmN0aW9uIHVzZU1lbW8oY3JlYXRlLCBkZXBzKSB7CiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7CiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VNZW1vKGNyZWF0ZSwgZGVwcyk7CiAgfQogIGZ1bmN0aW9uIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHsKICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTsKICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpOwogIH0KICBmdW5jdGlvbiB1c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikgewogICAgewogICAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7CiAgICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gdXNlVHJhbnNpdGlvbigpIHsKICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTsKICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZVRyYW5zaXRpb24oKTsKICB9CiAgZnVuY3Rpb24gdXNlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkgewogICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpOwogICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7CiAgfQogIGZ1bmN0aW9uIHVzZUlkKCkgewogICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpOwogICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSWQoKTsKICB9CiAgZnVuY3Rpb24gdXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHsKICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTsKICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTsKICB9CgogIC8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWUKICAvLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdAogIC8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS4KICAvLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC4KICB2YXIgZGlzYWJsZWREZXB0aCA9IDA7CiAgdmFyIHByZXZMb2c7CiAgdmFyIHByZXZJbmZvOwogIHZhciBwcmV2V2FybjsKICB2YXIgcHJldkVycm9yOwogIHZhciBwcmV2R3JvdXA7CiAgdmFyIHByZXZHcm91cENvbGxhcHNlZDsKICB2YXIgcHJldkdyb3VwRW5kOwoKICBmdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9CgogIGRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7CiAgZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7CiAgICB7CiAgICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7CiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovCiAgICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nOwogICAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvOwogICAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuOwogICAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7CiAgICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDsKICAgICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkOwogICAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTkKCiAgICAgICAgdmFyIHByb3BzID0gewogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZywKICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS4KCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwgewogICAgICAgICAgaW5mbzogcHJvcHMsCiAgICAgICAgICBsb2c6IHByb3BzLAogICAgICAgICAgd2FybjogcHJvcHMsCiAgICAgICAgICBlcnJvcjogcHJvcHMsCiAgICAgICAgICBncm91cDogcHJvcHMsCiAgICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsCiAgICAgICAgICBncm91cEVuZDogcHJvcHMKICAgICAgICB9KTsKICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqLwogICAgICB9CgogICAgICBkaXNhYmxlZERlcHRoKys7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHsKICAgIHsKICAgICAgZGlzYWJsZWREZXB0aC0tOwoKICAgICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHsKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi8KICAgICAgICB2YXIgcHJvcHMgPSB7CiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLgoKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7CiAgICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHsKICAgICAgICAgICAgdmFsdWU6IHByZXZMb2cKICAgICAgICAgIH0pLAogICAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywgewogICAgICAgICAgICB2YWx1ZTogcHJldkluZm8KICAgICAgICAgIH0pLAogICAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywgewogICAgICAgICAgICB2YWx1ZTogcHJldldhcm4KICAgICAgICAgIH0pLAogICAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHsKICAgICAgICAgICAgdmFsdWU6IHByZXZFcnJvcgogICAgICAgICAgfSksCiAgICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywgewogICAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwCiAgICAgICAgICB9KSwKICAgICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7CiAgICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWQKICAgICAgICAgIH0pLAogICAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHsKICAgICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZAogICAgICAgICAgfSkKICAgICAgICB9KTsKICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqLwogICAgICB9CgogICAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHsKICAgICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7CiAgICAgIH0KICAgIH0KICB9CgogIHZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyOwogIHZhciBwcmVmaXg7CiAgZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7CiAgICB7CiAgICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS4KICAgICAgICB0cnkgewogICAgICAgICAgdGhyb3cgRXJyb3IoKTsKICAgICAgICB9IGNhdGNoICh4KSB7CiAgICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXG4oICooYXQgKT8pLyk7CiAgICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJzsKICAgICAgICB9CiAgICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuCgoKICAgICAgcmV0dXJuICdcbicgKyBwcmVmaXggKyBuYW1lOwogICAgfQogIH0KICB2YXIgcmVlbnRyeSA9IGZhbHNlOwogIHZhciBjb21wb25lbnRGcmFtZUNhY2hlOwoKICB7CiAgICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwOwogICAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTsKICB9CgogIGZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkgewogICAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuCiAgICBpZiAoICFmbiB8fCByZWVudHJ5KSB7CiAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICB7CiAgICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTsKCiAgICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgcmV0dXJuIGZyYW1lOwogICAgICB9CiAgICB9CgogICAgdmFyIGNvbnRyb2w7CiAgICByZWVudHJ5ID0gdHJ1ZTsKICAgIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLgoKICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkOwogICAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjsKCiAgICB7CiAgICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb24KICAgICAgLy8gZm9yIHdhcm5pbmdzLgoKICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBudWxsOwogICAgICBkaXNhYmxlTG9ncygpOwogICAgfQoKICAgIHRyeSB7CiAgICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LgogICAgICBpZiAoY29uc3RydWN0KSB7CiAgICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0aHJvdyBFcnJvcigpOwogICAgICAgIH07IC8vICRGbG93Rml4TWUKCgogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywgewogICAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHMKICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLgogICAgICAgICAgICB0aHJvdyBFcnJvcigpOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7CiAgICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhCiAgICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLgogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pOwogICAgICAgICAgfSBjYXRjaCAoeCkgewogICAgICAgICAgICBjb250cm9sID0geDsKICAgICAgICAgIH0KCiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBGYWtlLmNhbGwoKTsKICAgICAgICAgIH0gY2F0Y2ggKHgpIHsKICAgICAgICAgICAgY29udHJvbCA9IHg7CiAgICAgICAgICB9CgogICAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aHJvdyBFcnJvcigpOwogICAgICAgIH0gY2F0Y2ggKHgpIHsKICAgICAgICAgIGNvbnRyb2wgPSB4OwogICAgICAgIH0KCiAgICAgICAgZm4oKTsKICAgICAgfQogICAgfSBjYXRjaCAoc2FtcGxlKSB7CiAgICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuCiAgICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykgewogICAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuCiAgICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uCiAgICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcbicpOwogICAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcbicpOwogICAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTsKICAgICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxOwoKICAgICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7CiAgICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC4KICAgICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmUKICAgICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmCiAgICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZQogICAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW4KICAgICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLgogICAgICAgICAgYy0tOwogICAgICAgIH0KCiAgICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7CiAgICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGUKICAgICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLgogICAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHsKICAgICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC4KICAgICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZQogICAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhcwogICAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuCiAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uCiAgICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHsKICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBzLS07CiAgICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC4KICAgICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLgoKICAgICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7CiAgICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSAibmV3IiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci4KICAgICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCAiPGFub255bW91cz4iCiAgICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBoYXZlIGEgdXNlci1wcm92aWRlZCAiZGlzcGxheU5hbWUiCiAgICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLgoKCiAgICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHsKICAgICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLgoKCiAgICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSBmaW5hbGx5IHsKICAgICAgcmVlbnRyeSA9IGZhbHNlOwoKICAgICAgewogICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyOwogICAgICAgIHJlZW5hYmxlTG9ncygpOwogICAgICB9CgogICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7CiAgICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy4KCgogICAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJzsKICAgIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnOwoKICAgIHsKICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc3ludGhldGljRnJhbWU7CiAgfQogIGZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7CiAgICB7CiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7CiAgICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTsKICAgIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpOwogIH0KCiAgZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikgewoKICAgIGlmICh0eXBlID09IG51bGwpIHsKICAgICAgcmV0dXJuICcnOwogICAgfQoKICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB7CiAgICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTsKICAgICAgfQogICAgfQoKICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHsKICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpOwogICAgfQoKICAgIHN3aXRjaCAodHlwZSkgewogICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6CiAgICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpOwoKICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6CiAgICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTsKICAgIH0KCiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7CiAgICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikgewogICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRToKICAgICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpOwoKICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRToKICAgICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuCiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTsKCiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6CiAgICAgICAgICB7CiAgICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTsKICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkOwogICAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuCiAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pOwogICAgICAgICAgICB9IGNhdGNoICh4KSB7fQogICAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuICcnOwogIH0KCiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9OwogIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lOwoKICBmdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7CiAgICB7CiAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7CiAgICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTsKICAgICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHsKICAgIHsKICAgICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LgogICAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKGhhc093blByb3BlcnR5KTsKCiAgICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHsKICAgICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkgewogICAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvCiAgICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuCiAgICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuCgogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lCiAgICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS4KICAgICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzCiAgICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7CiAgICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7CiAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTsKICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgIGVycm9yJDEgPSBleDsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHsKICAgICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7CgogICAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTsKCiAgICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkgewogICAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGUKICAgICAgICAgICAgLy8gc2FtZSBlcnJvci4KICAgICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlOwogICAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTsKCiAgICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTsKCiAgICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KSB7CiAgICB7CiAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7CiAgICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTsKICAgICAgICBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spOwogICAgICB9IGVsc2UgewogICAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShudWxsKTsKICAgICAgfQogICAgfQogIH0KCiAgdmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duOwoKICB7CiAgICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkgewogICAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHsKICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTsKCiAgICAgIGlmIChuYW1lKSB7CiAgICAgICAgcmV0dXJuICdcblxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJzsKICAgICAgfQogICAgfQoKICAgIHJldHVybiAnJzsKICB9CgogIGZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkgewogICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhciBmaWxlTmFtZSA9IHNvdXJjZS5maWxlTmFtZS5yZXBsYWNlKC9eLipbXFxcL10vLCAnJyk7CiAgICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7CiAgICAgIHJldHVybiAnXG5cbkNoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nOwogICAgfQoKICAgIHJldHVybiAnJzsKICB9CgogIGZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMoZWxlbWVudFByb3BzKSB7CiAgICBpZiAoZWxlbWVudFByb3BzICE9PSBudWxsICYmIGVsZW1lbnRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpOwogICAgfQoKICAgIHJldHVybiAnJzsKICB9CiAgLyoqCiAgICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvcgogICAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlbgogICAqIHVwZGF0ZXMuCiAgICovCgoKICB2YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307CgogIGZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkgewogICAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTsKCiAgICBpZiAoIWluZm8pIHsKICAgICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7CgogICAgICBpZiAocGFyZW50TmFtZSkgewogICAgICAgIGluZm8gPSAiXG5cbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPCIgKyBwYXJlbnROYW1lICsgIj4uIjsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBpbmZvOwogIH0KICAvKioKICAgKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuCiAgICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlCiAgICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvCiAgICogaGF2ZSBhICJrZXkiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZwogICAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLgogICAqCiAgICogQGludGVybmFsCiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LgogICAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS4KICAgKi8KCgogIGZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkgewogICAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTsKICAgIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTsKCiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlOyAvLyBVc3VhbGx5IHRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBvZmZlbmRlciwgYnV0IGlmIGl0IGFjY2VwdHMgY2hpbGRyZW4gYXMgYQogICAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvcgogICAgLy8gYXNzaWduaW5nIGl0IGEga2V5LgoKICAgIHZhciBjaGlsZE93bmVyID0gJyc7CgogICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHsKICAgICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuCiAgICAgIGNoaWxkT3duZXIgPSAiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tICIgKyBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkgKyAiLiI7CiAgICB9CgogICAgewogICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpOwoKICAgICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlICJrZXkiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpOwoKICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTsKICAgIH0KICB9CiAgLyoqCiAgICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhbgogICAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbAogICAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LgogICAqCiAgICogQGludGVybmFsCiAgICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuCiAgICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLgogICAqLwoKCiAgZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkgewogICAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0JykgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGlzQXJyYXkobm9kZSkpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTsKCiAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkgewogICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7CiAgICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uCiAgICAgIGlmIChub2RlLl9zdG9yZSkgewogICAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAobm9kZSkgewogICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7CgogICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsCiAgICAgICAgLy8gYnV0IG5vdyB3ZSBwcmludCBhIHNlcGFyYXRlIHdhcm5pbmcgZm9yIHRoZW0gbGF0ZXIuCiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykgewogICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpOwogICAgICAgICAgdmFyIHN0ZXA7CgogICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkgewogICAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHsKICAgICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIC8qKgogICAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sCiAgICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuCiAgICoKICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudAogICAqLwoKCiAgZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkgewogICAgewogICAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTsKCiAgICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciBwcm9wVHlwZXM7CgogICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlczsKICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLgogICAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci4KICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSkgewogICAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKHByb3BUeXBlcykgewogICAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6CiAgICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7CiAgICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpOwogICAgICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7CiAgICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOgoKICAgICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7CgogICAgICAgIGVycm9yKCdDb21wb25lbnQgJXMgZGVjbGFyZWQgYFByb3BUeXBlc2AgaW5zdGVhZCBvZiBgcHJvcFR5cGVzYC4gRGlkIHlvdSBtaXNzcGVsbCB0aGUgcHJvcGVydHkgYXNzaWdubWVudD8nLCBfbmFtZSB8fCAnVW5rbm93bicpOwogICAgICB9CgogICAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkgewogICAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJyk7CiAgICAgIH0KICAgIH0KICB9CiAgLyoqCiAgICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzCiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGZyYWdtZW50CiAgICovCgoKICBmdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZnJhZ21lbnQpIHsKICAgIHsKICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTsKCiAgICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7CiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTsKCiAgICAgICAgICBlcnJvcignSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gJyArICdSZWFjdC5GcmFnbWVudCBjYW4gb25seSBoYXZlIGBrZXlgIGFuZCBgY2hpbGRyZW5gIHByb3BzLicsIGtleSk7CgogICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGZyYWdtZW50LnJlZiAhPT0gbnVsbCkgewogICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpOwoKICAgICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTsKCiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTsKICAgICAgfQogICAgfQogIH0KICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7CiAgICB2YXIgdmFsaWRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpOyAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0bwogICAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci4KCiAgICBpZiAoIXZhbGlkVHlwZSkgewogICAgICB2YXIgaW5mbyA9ICcnOwoKICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHsKICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArICJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuIjsKICAgICAgfQoKICAgICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKHByb3BzKTsKCiAgICAgIGlmIChzb3VyY2VJbmZvKSB7CiAgICAgICAgaW5mbyArPSBzb3VyY2VJbmZvOwogICAgICB9IGVsc2UgewogICAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7CiAgICAgIH0KCiAgICAgIHZhciB0eXBlU3RyaW5nOwoKICAgICAgaWYgKHR5cGUgPT09IG51bGwpIHsKICAgICAgICB0eXBlU3RyaW5nID0gJ251bGwnOwogICAgICB9IGVsc2UgaWYgKGlzQXJyYXkodHlwZSkpIHsKICAgICAgICB0eXBlU3RyaW5nID0gJ2FycmF5JzsKICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7CiAgICAgICAgdHlwZVN0cmluZyA9ICI8IiArIChnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCAnVW5rbm93bicpICsgIiAvPiI7CiAgICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nOwogICAgICB9IGVsc2UgewogICAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTsKICAgICAgfQoKICAgICAgewogICAgICAgIGVycm9yKCdSZWFjdC5jcmVhdGVFbGVtZW50OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciAnICsgJ2J1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgJyArICdjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGVTdHJpbmcsIGluZm8pOwogICAgICB9CiAgICB9CgogICAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuCiAgICAvLyBUT0RPOiBEcm9wIHRoaXMgd2hlbiB0aGVzZSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQuCgogICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgewogICAgICByZXR1cm4gZWxlbWVudDsKICAgIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWMKICAgIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy4KICAgIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC4KICAgIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzCiAgICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pCgoKICAgIGlmICh2YWxpZFR5cGUpIHsKICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpOwogICAgICB9CiAgICB9CgogICAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHsKICAgICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpOwogICAgfSBlbHNlIHsKICAgICAgdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCk7CiAgICB9CgogICAgcmV0dXJuIGVsZW1lbnQ7CiAgfQogIHZhciBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IGZhbHNlOwogIGZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7CiAgICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpOwogICAgdmFsaWRhdGVkRmFjdG9yeS50eXBlID0gdHlwZTsKCiAgICB7CiAgICAgIGlmICghZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkpIHsKICAgICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7CgogICAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7CiAgICAgIH0gLy8gTGVnYWN5IGhvb2s6IHJlbW92ZSBpdAoKCiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHsKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTsKCiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7CiAgICAgICAgICAgIHZhbHVlOiB0eXBlCiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7CiAgfQogIGZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikgewogICAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIG5ld0VsZW1lbnQudHlwZSk7CiAgICB9CgogICAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7CiAgICByZXR1cm4gbmV3RWxlbWVudDsKICB9CgogIHZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTsKICB2YXIgZW5hYmxlUHJvZmlsaW5nID0gZmFsc2U7CiAgdmFyIGZyYW1lWWllbGRNcyA9IDU7CgogIGZ1bmN0aW9uIHB1c2goaGVhcCwgbm9kZSkgewogICAgdmFyIGluZGV4ID0gaGVhcC5sZW5ndGg7CiAgICBoZWFwLnB1c2gobm9kZSk7CiAgICBzaWZ0VXAoaGVhcCwgbm9kZSwgaW5kZXgpOwogIH0KICBmdW5jdGlvbiBwZWVrKGhlYXApIHsKICAgIHJldHVybiBoZWFwLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBoZWFwWzBdOwogIH0KICBmdW5jdGlvbiBwb3AoaGVhcCkgewogICAgaWYgKGhlYXAubGVuZ3RoID09PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHZhciBmaXJzdCA9IGhlYXBbMF07CiAgICB2YXIgbGFzdCA9IGhlYXAucG9wKCk7CgogICAgaWYgKGxhc3QgIT09IGZpcnN0KSB7CiAgICAgIGhlYXBbMF0gPSBsYXN0OwogICAgICBzaWZ0RG93bihoZWFwLCBsYXN0LCAwKTsKICAgIH0KCiAgICByZXR1cm4gZmlyc3Q7CiAgfQoKICBmdW5jdGlvbiBzaWZ0VXAoaGVhcCwgbm9kZSwgaSkgewogICAgdmFyIGluZGV4ID0gaTsKCiAgICB3aGlsZSAoaW5kZXggPiAwKSB7CiAgICAgIHZhciBwYXJlbnRJbmRleCA9IGluZGV4IC0gMSA+Pj4gMTsKICAgICAgdmFyIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdOwoKICAgICAgaWYgKGNvbXBhcmUocGFyZW50LCBub2RlKSA+IDApIHsKICAgICAgICAvLyBUaGUgcGFyZW50IGlzIGxhcmdlci4gU3dhcCBwb3NpdGlvbnMuCiAgICAgICAgaGVhcFtwYXJlbnRJbmRleF0gPSBub2RlOwogICAgICAgIGhlYXBbaW5kZXhdID0gcGFyZW50OwogICAgICAgIGluZGV4ID0gcGFyZW50SW5kZXg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gVGhlIHBhcmVudCBpcyBzbWFsbGVyLiBFeGl0LgogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gc2lmdERvd24oaGVhcCwgbm9kZSwgaSkgewogICAgdmFyIGluZGV4ID0gaTsKICAgIHZhciBsZW5ndGggPSBoZWFwLmxlbmd0aDsKICAgIHZhciBoYWxmTGVuZ3RoID0gbGVuZ3RoID4+PiAxOwoKICAgIHdoaWxlIChpbmRleCA8IGhhbGZMZW5ndGgpIHsKICAgICAgdmFyIGxlZnRJbmRleCA9IChpbmRleCArIDEpICogMiAtIDE7CiAgICAgIHZhciBsZWZ0ID0gaGVhcFtsZWZ0SW5kZXhdOwogICAgICB2YXIgcmlnaHRJbmRleCA9IGxlZnRJbmRleCArIDE7CiAgICAgIHZhciByaWdodCA9IGhlYXBbcmlnaHRJbmRleF07IC8vIElmIHRoZSBsZWZ0IG9yIHJpZ2h0IG5vZGUgaXMgc21hbGxlciwgc3dhcCB3aXRoIHRoZSBzbWFsbGVyIG9mIHRob3NlLgoKICAgICAgaWYgKGNvbXBhcmUobGVmdCwgbm9kZSkgPCAwKSB7CiAgICAgICAgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbGVmdCkgPCAwKSB7CiAgICAgICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0OwogICAgICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7CiAgICAgICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlYXBbaW5kZXhdID0gbGVmdDsKICAgICAgICAgIGhlYXBbbGVmdEluZGV4XSA9IG5vZGU7CiAgICAgICAgICBpbmRleCA9IGxlZnRJbmRleDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBub2RlKSA8IDApIHsKICAgICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0OwogICAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlOwogICAgICAgIGluZGV4ID0gcmlnaHRJbmRleDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBOZWl0aGVyIGNoaWxkIGlzIHNtYWxsZXIuIEV4aXQuCiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHsKICAgIC8vIENvbXBhcmUgc29ydCBpbmRleCBmaXJzdCwgdGhlbiB0YXNrIGlkLgogICAgdmFyIGRpZmYgPSBhLnNvcnRJbmRleCAtIGIuc29ydEluZGV4OwogICAgcmV0dXJuIGRpZmYgIT09IDAgPyBkaWZmIDogYS5pZCAtIGIuaWQ7CiAgfQoKICAvLyBUT0RPOiBVc2Ugc3ltYm9scz8KICB2YXIgSW1tZWRpYXRlUHJpb3JpdHkgPSAxOwogIHZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7CiAgdmFyIE5vcm1hbFByaW9yaXR5ID0gMzsKICB2YXIgTG93UHJpb3JpdHkgPSA0OwogIHZhciBJZGxlUHJpb3JpdHkgPSA1OwoKICBmdW5jdGlvbiBtYXJrVGFza0Vycm9yZWQodGFzaywgbXMpIHsKICB9CgogIC8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqLwogIHZhciBnZXRDdXJyZW50VGltZTsKICB2YXIgaGFzUGVyZm9ybWFuY2VOb3cgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbic7CgogIGlmIChoYXNQZXJmb3JtYW5jZU5vdykgewogICAgdmFyIGxvY2FsUGVyZm9ybWFuY2UgPSBwZXJmb3JtYW5jZTsKCiAgICBnZXRDdXJyZW50VGltZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7CiAgICB9OwogIH0gZWxzZSB7CiAgICB2YXIgbG9jYWxEYXRlID0gRGF0ZTsKICAgIHZhciBpbml0aWFsVGltZSA9IGxvY2FsRGF0ZS5ub3coKTsKCiAgICBnZXRDdXJyZW50VGltZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGxvY2FsRGF0ZS5ub3coKSAtIGluaXRpYWxUaW1lOwogICAgfTsKICB9IC8vIE1heCAzMSBiaXQgaW50ZWdlci4gVGhlIG1heCBpbnRlZ2VyIHNpemUgaW4gVjggZm9yIDMyLWJpdCBzeXN0ZW1zLgogIC8vIE1hdGgucG93KDIsIDMwKSAtIDEKICAvLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQoKCiAgdmFyIG1heFNpZ25lZDMxQml0SW50ID0gMTA3Mzc0MTgyMzsgLy8gVGltZXMgb3V0IGltbWVkaWF0ZWx5CgogIHZhciBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVCA9IC0xOyAvLyBFdmVudHVhbGx5IHRpbWVzIG91dAoKICB2YXIgVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUID0gMjUwOwogIHZhciBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVCA9IDUwMDA7CiAgdmFyIExPV19QUklPUklUWV9USU1FT1VUID0gMTAwMDA7IC8vIE5ldmVyIHRpbWVzIG91dAoKICB2YXIgSURMRV9QUklPUklUWV9USU1FT1VUID0gbWF4U2lnbmVkMzFCaXRJbnQ7IC8vIFRhc2tzIGFyZSBzdG9yZWQgb24gYSBtaW4gaGVhcAoKICB2YXIgdGFza1F1ZXVlID0gW107CiAgdmFyIHRpbWVyUXVldWUgPSBbXTsgLy8gSW5jcmVtZW50aW5nIGlkIGNvdW50ZXIuIFVzZWQgdG8gbWFpbnRhaW4gaW5zZXJ0aW9uIG9yZGVyLgoKICB2YXIgdGFza0lkQ291bnRlciA9IDE7IC8vIFBhdXNpbmcgdGhlIHNjaGVkdWxlciBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KICB2YXIgY3VycmVudFRhc2sgPSBudWxsOwogIHZhciBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5OyAvLyBUaGlzIGlzIHNldCB3aGlsZSBwZXJmb3JtaW5nIHdvcmssIHRvIHByZXZlbnQgcmUtZW50cmFuY2UuCgogIHZhciBpc1BlcmZvcm1pbmdXb3JrID0gZmFsc2U7CiAgdmFyIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7CiAgdmFyIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTsgLy8gQ2FwdHVyZSBsb2NhbCByZWZlcmVuY2VzIHRvIG5hdGl2ZSBBUElzLCBpbiBjYXNlIGEgcG9seWZpbGwgb3ZlcnJpZGVzIHRoZW0uCgogIHZhciBsb2NhbFNldFRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiBudWxsOwogIHZhciBsb2NhbENsZWFyVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiBudWxsOwogIHZhciBsb2NhbFNldEltbWVkaWF0ZSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgIT09ICd1bmRlZmluZWQnID8gc2V0SW1tZWRpYXRlIDogbnVsbDsgLy8gSUUgYW5kIE5vZGUuanMgKyBqc2RvbQoKICB2YXIgaXNJbnB1dFBlbmRpbmcgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZyAhPT0gdW5kZWZpbmVkICYmIG5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nICE9PSB1bmRlZmluZWQgPyBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKSA6IG51bGw7CgogIGZ1bmN0aW9uIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpIHsKICAgIC8vIENoZWNrIGZvciB0YXNrcyB0aGF0IGFyZSBubyBsb25nZXIgZGVsYXllZCBhbmQgYWRkIHRoZW0gdG8gdGhlIHF1ZXVlLgogICAgdmFyIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTsKCiAgICB3aGlsZSAodGltZXIgIT09IG51bGwpIHsKICAgICAgaWYgKHRpbWVyLmNhbGxiYWNrID09PSBudWxsKSB7CiAgICAgICAgLy8gVGltZXIgd2FzIGNhbmNlbGxlZC4KICAgICAgICBwb3AodGltZXJRdWV1ZSk7CiAgICAgIH0gZWxzZSBpZiAodGltZXIuc3RhcnRUaW1lIDw9IGN1cnJlbnRUaW1lKSB7CiAgICAgICAgLy8gVGltZXIgZmlyZWQuIFRyYW5zZmVyIHRvIHRoZSB0YXNrIHF1ZXVlLgogICAgICAgIHBvcCh0aW1lclF1ZXVlKTsKICAgICAgICB0aW1lci5zb3J0SW5kZXggPSB0aW1lci5leHBpcmF0aW9uVGltZTsKICAgICAgICBwdXNoKHRhc2tRdWV1ZSwgdGltZXIpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFJlbWFpbmluZyB0aW1lcnMgYXJlIHBlbmRpbmcuCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVUaW1lb3V0KGN1cnJlbnRUaW1lKSB7CiAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7CiAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTsKCiAgICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkKSB7CiAgICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgIT09IG51bGwpIHsKICAgICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTsKCiAgICAgICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHsKICAgICAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZsdXNoV29yayhoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkgewoKCiAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlOwoKICAgIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7CiAgICAgIC8vIFdlIHNjaGVkdWxlZCBhIHRpbWVvdXQgYnV0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC4gQ2FuY2VsIGl0LgogICAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7CiAgICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7CiAgICB9CgogICAgaXNQZXJmb3JtaW5nV29yayA9IHRydWU7CiAgICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7CgogICAgdHJ5IHsKICAgICAgaWYgKGVuYWJsZVByb2ZpbGluZykgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHsKICAgICAgICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZ2V0Q3VycmVudFRpbWUoKTsKICAgICAgICAgICAgbWFya1Rhc2tFcnJvcmVkKGN1cnJlbnRUYXNrLCBjdXJyZW50VGltZSk7CiAgICAgICAgICAgIGN1cnJlbnRUYXNrLmlzUXVldWVkID0gZmFsc2U7CiAgICAgICAgICB9CgogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIE5vIGNhdGNoIGluIHByb2QgY29kZSBwYXRoLgogICAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7CiAgICAgIH0KICAgIH0gZmluYWxseSB7CiAgICAgIGN1cnJlbnRUYXNrID0gbnVsbDsKICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7CiAgICAgIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7CiAgICB2YXIgY3VycmVudFRpbWUgPSBpbml0aWFsVGltZTsKICAgIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpOwogICAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7CgogICAgd2hpbGUgKGN1cnJlbnRUYXNrICE9PSBudWxsICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICkpIHsKICAgICAgaWYgKGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lID4gY3VycmVudFRpbWUgJiYgKCFoYXNUaW1lUmVtYWluaW5nIHx8IHNob3VsZFlpZWxkVG9Ib3N0KCkpKSB7CiAgICAgICAgLy8gVGhpcyBjdXJyZW50VGFzayBoYXNuJ3QgZXhwaXJlZCwgYW5kIHdlJ3ZlIHJlYWNoZWQgdGhlIGRlYWRsaW5lLgogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICB2YXIgY2FsbGJhY2sgPSBjdXJyZW50VGFzay5jYWxsYmFjazsKCiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IG51bGw7CiAgICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50VGFzay5wcmlvcml0eUxldmVsOwogICAgICAgIHZhciBkaWRVc2VyQ2FsbGJhY2tUaW1lb3V0ID0gY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWU7CgogICAgICAgIHZhciBjb250aW51YXRpb25DYWxsYmFjayA9IGNhbGxiYWNrKGRpZFVzZXJDYWxsYmFja1RpbWVvdXQpOwogICAgICAgIGN1cnJlbnRUaW1lID0gZ2V0Q3VycmVudFRpbWUoKTsKCiAgICAgICAgaWYgKHR5cGVvZiBjb250aW51YXRpb25DYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjazsKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgIGlmIChjdXJyZW50VGFzayA9PT0gcGVlayh0YXNrUXVldWUpKSB7CiAgICAgICAgICAgIHBvcCh0YXNrUXVldWUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9wKHRhc2tRdWV1ZSk7CiAgICAgIH0KCiAgICAgIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpOwogICAgfSAvLyBSZXR1cm4gd2hldGhlciB0aGVyZSdzIGFkZGl0aW9uYWwgd29yawoKCiAgICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICB2YXIgZmlyc3RUaW1lciA9IHBlZWsodGltZXJRdWV1ZSk7CgogICAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkgewogICAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5TGV2ZWwsIGV2ZW50SGFuZGxlcikgewogICAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7CiAgICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6CiAgICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6CiAgICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6CiAgICAgIGNhc2UgTG93UHJpb3JpdHk6CiAgICAgIGNhc2UgSWRsZVByaW9yaXR5OgogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKICAgICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7CiAgICB9CgogICAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsOwogICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsOwoKICAgIHRyeSB7CiAgICAgIHJldHVybiBldmVudEhhbmRsZXIoKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdW5zdGFibGVfbmV4dChldmVudEhhbmRsZXIpIHsKICAgIHZhciBwcmlvcml0eUxldmVsOwoKICAgIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHsKICAgICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eToKICAgICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eToKICAgICAgY2FzZSBOb3JtYWxQcmlvcml0eToKICAgICAgICAvLyBTaGlmdCBkb3duIHRvIG5vcm1hbCBwcmlvcml0eQogICAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTsKICAgICAgICBicmVhazsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgLy8gQW55dGhpbmcgbG93ZXIgdGhhbiBub3JtYWwgcHJpb3JpdHkgc2hvdWxkIHJlbWFpbiBhdCB0aGUgY3VycmVudCBsZXZlbC4KICAgICAgICBwcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsOwogICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsOwoKICAgIHRyeSB7CiAgICAgIHJldHVybiBldmVudEhhbmRsZXIoKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdW5zdGFibGVfd3JhcENhbGxiYWNrKGNhbGxiYWNrKSB7CiAgICB2YXIgcGFyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgcnVuV2l0aFByaW9yaXR5LCBpbmxpbmVkIGZvciBwZXJmb3JtYW5jZS4KICAgICAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsOwogICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHBhcmVudFByaW9yaXR5TGV2ZWw7CgogICAgICB0cnkgewogICAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsOwogICAgICB9CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjaywgb3B0aW9ucykgewogICAgdmFyIGN1cnJlbnRUaW1lID0gZ2V0Q3VycmVudFRpbWUoKTsKICAgIHZhciBzdGFydFRpbWU7CgogICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsKSB7CiAgICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZGVsYXk7CgogICAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHsKICAgICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZSArIGRlbGF5OwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTsKICAgIH0KCiAgICB2YXIgdGltZW91dDsKCiAgICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHsKICAgICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eToKICAgICAgICB0aW1lb3V0ID0gSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OgogICAgICAgIHRpbWVvdXQgPSBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZX1RJTUVPVVQ7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIElkbGVQcmlvcml0eToKICAgICAgICB0aW1lb3V0ID0gSURMRV9QUklPUklUWV9USU1FT1VUOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBMb3dQcmlvcml0eToKICAgICAgICB0aW1lb3V0ID0gTE9XX1BSSU9SSVRZX1RJTUVPVVQ7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIE5vcm1hbFByaW9yaXR5OgogICAgICBkZWZhdWx0OgogICAgICAgIHRpbWVvdXQgPSBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDsKICAgICAgICBicmVhazsKICAgIH0KCiAgICB2YXIgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyB0aW1lb3V0OwogICAgdmFyIG5ld1Rhc2sgPSB7CiAgICAgIGlkOiB0YXNrSWRDb3VudGVyKyssCiAgICAgIGNhbGxiYWNrOiBjYWxsYmFjaywKICAgICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCwKICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWUsCiAgICAgIGV4cGlyYXRpb25UaW1lOiBleHBpcmF0aW9uVGltZSwKICAgICAgc29ydEluZGV4OiAtMQogICAgfTsKCiAgICBpZiAoc3RhcnRUaW1lID4gY3VycmVudFRpbWUpIHsKICAgICAgLy8gVGhpcyBpcyBhIGRlbGF5ZWQgdGFzay4KICAgICAgbmV3VGFzay5zb3J0SW5kZXggPSBzdGFydFRpbWU7CiAgICAgIHB1c2godGltZXJRdWV1ZSwgbmV3VGFzayk7CgogICAgICBpZiAocGVlayh0YXNrUXVldWUpID09PSBudWxsICYmIG5ld1Rhc2sgPT09IHBlZWsodGltZXJRdWV1ZSkpIHsKICAgICAgICAvLyBBbGwgdGFza3MgYXJlIGRlbGF5ZWQsIGFuZCB0aGlzIGlzIHRoZSB0YXNrIHdpdGggdGhlIGVhcmxpZXN0IGRlbGF5LgogICAgICAgIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7CiAgICAgICAgICAvLyBDYW5jZWwgYW4gZXhpc3RpbmcgdGltZW91dC4KICAgICAgICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSB0cnVlOwogICAgICAgIH0gLy8gU2NoZWR1bGUgYSB0aW1lb3V0LgoKCiAgICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIHN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbmV3VGFzay5zb3J0SW5kZXggPSBleHBpcmF0aW9uVGltZTsKICAgICAgcHVzaCh0YXNrUXVldWUsIG5ld1Rhc2spOwogICAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWUgd2UgeWllbGQuCgoKICAgICAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykgewogICAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbmV3VGFzazsKICB9CgogIGZ1bmN0aW9uIHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uKCkgewogIH0KCiAgZnVuY3Rpb24gdW5zdGFibGVfY29udGludWVFeGVjdXRpb24oKSB7CgogICAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykgewogICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7CiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkgewogICAgcmV0dXJuIHBlZWsodGFza1F1ZXVlKTsKICB9CgogIGZ1bmN0aW9uIHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrKHRhc2spIHsKICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHlvdSBjYW4ndCByZW1vdmUgYXJiaXRyYXJ5IG5vZGVzIGZyb20gYW4KICAgIC8vIGFycmF5IGJhc2VkIGhlYXAsIG9ubHkgdGhlIGZpcnN0IG9uZS4pCgoKICAgIHRhc2suY2FsbGJhY2sgPSBudWxsOwogIH0KCiAgZnVuY3Rpb24gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7CiAgICByZXR1cm4gY3VycmVudFByaW9yaXR5TGV2ZWw7CiAgfQoKICB2YXIgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTsKICB2YXIgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDsKICB2YXIgdGFza1RpbWVvdXRJRCA9IC0xOyAvLyBTY2hlZHVsZXIgcGVyaW9kaWNhbGx5IHlpZWxkcyBpbiBjYXNlIHRoZXJlIGlzIG90aGVyIHdvcmsgb24gdGhlIG1haW4KICAvLyB0aHJlYWQsIGxpa2UgdXNlciBldmVudHMuIEJ5IGRlZmF1bHQsIGl0IHlpZWxkcyBtdWx0aXBsZSB0aW1lcyBwZXIgZnJhbWUuCiAgLy8gSXQgZG9lcyBub3QgYXR0ZW1wdCB0byBhbGlnbiB3aXRoIGZyYW1lIGJvdW5kYXJpZXMsIHNpbmNlIG1vc3QgdGFza3MgZG9uJ3QKICAvLyBuZWVkIHRvIGJlIGZyYW1lIGFsaWduZWQ7IGZvciB0aG9zZSB0aGF0IGRvLCB1c2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLgoKICB2YXIgZnJhbWVJbnRlcnZhbCA9IGZyYW1lWWllbGRNczsKICB2YXIgc3RhcnRUaW1lID0gLTE7CgogIGZ1bmN0aW9uIHNob3VsZFlpZWxkVG9Ib3N0KCkgewogICAgdmFyIHRpbWVFbGFwc2VkID0gZ2V0Q3VycmVudFRpbWUoKSAtIHN0YXJ0VGltZTsKCiAgICBpZiAodGltZUVsYXBzZWQgPCBmcmFtZUludGVydmFsKSB7CiAgICAgIC8vIFRoZSBtYWluIHRocmVhZCBoYXMgb25seSBiZWVuIGJsb2NrZWQgZm9yIGEgcmVhbGx5IHNob3J0IGFtb3VudCBvZiB0aW1lOwogICAgICAvLyBzbWFsbGVyIHRoYW4gYSBzaW5nbGUgZnJhbWUuIERvbid0IHlpZWxkIHlldC4KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIGJlZW4gYmxvY2tlZCBmb3IgYSBub24tbmVnbGlnaWJsZSBhbW91bnQgb2YgdGltZS4gV2UKCgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiByZXF1ZXN0UGFpbnQoKSB7CgogIH0KCiAgZnVuY3Rpb24gZm9yY2VGcmFtZVJhdGUoZnBzKSB7CiAgICBpZiAoZnBzIDwgMCB8fCBmcHMgPiAxMjUpIHsKICAgICAgLy8gVXNpbmcgY29uc29sZVsnZXJyb3InXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50CiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oJ2ZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCAnICsgJ2ZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkJyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoZnBzID4gMCkgewogICAgICBmcmFtZUludGVydmFsID0gTWF0aC5mbG9vcigxMDAwIC8gZnBzKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIHJlc2V0IHRoZSBmcmFtZXJhdGUKICAgICAgZnJhbWVJbnRlcnZhbCA9IGZyYW1lWWllbGRNczsKICAgIH0KICB9CgogIHZhciBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoc2NoZWR1bGVkSG9zdENhbGxiYWNrICE9PSBudWxsKSB7CiAgICAgIHZhciBjdXJyZW50VGltZSA9IGdldEN1cnJlbnRUaW1lKCk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IHRpbWUgc28gd2UgY2FuIG1lYXN1cmUgaG93IGxvbmcgdGhlIG1haW4gdGhyZWFkCiAgICAgIC8vIGhhcyBiZWVuIGJsb2NrZWQuCgogICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTsKICAgICAgdmFyIGhhc1RpbWVSZW1haW5pbmcgPSB0cnVlOyAvLyBJZiBhIHNjaGVkdWxlciB0YXNrIHRocm93cywgZXhpdCB0aGUgY3VycmVudCBicm93c2VyIHRhc2sgc28gdGhlCiAgICAgIC8vIGVycm9yIGNhbiBiZSBvYnNlcnZlZC4KICAgICAgLy8KICAgICAgLy8gSW50ZW50aW9uYWxseSBub3QgdXNpbmcgYSB0cnktY2F0Y2gsIHNpbmNlIHRoYXQgbWFrZXMgc29tZSBkZWJ1Z2dpbmcKICAgICAgLy8gdGVjaG5pcXVlcyBoYXJkZXIuIEluc3RlYWQsIGlmIGBzY2hlZHVsZWRIb3N0Q2FsbGJhY2tgIGVycm9ycywgdGhlbgogICAgICAvLyBgaGFzTW9yZVdvcmtgIHdpbGwgcmVtYWluIHRydWUsIGFuZCB3ZSdsbCBjb250aW51ZSB0aGUgd29yayBsb29wLgoKICAgICAgdmFyIGhhc01vcmVXb3JrID0gdHJ1ZTsKCiAgICAgIHRyeSB7CiAgICAgICAgaGFzTW9yZVdvcmsgPSBzY2hlZHVsZWRIb3N0Q2FsbGJhY2soaGFzVGltZVJlbWFpbmluZywgY3VycmVudFRpbWUpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGlmIChoYXNNb3JlV29yaykgewogICAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHdvcmssIHNjaGVkdWxlIHRoZSBuZXh0IG1lc3NhZ2UgZXZlbnQgYXQgdGhlIGVuZAogICAgICAgICAgLy8gb2YgdGhlIHByZWNlZGluZyBvbmUuCiAgICAgICAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlOwogICAgICAgICAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7CiAgICB9IC8vIFlpZWxkaW5nIHRvIHRoZSBicm93c2VyIHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0byBwYWludCwgc28gd2UgY2FuCiAgfTsKCiAgdmFyIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lOwoKICBpZiAodHlwZW9mIGxvY2FsU2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nKSB7CiAgICAvLyBOb2RlLmpzIGFuZCBvbGQgSUUuCiAgICAvLyBUaGVyZSdzIGEgZmV3IHJlYXNvbnMgZm9yIHdoeSB3ZSBwcmVmZXIgc2V0SW1tZWRpYXRlLgogICAgLy8KICAgIC8vIFVubGlrZSBNZXNzYWdlQ2hhbm5lbCwgaXQgZG9lc24ndCBwcmV2ZW50IGEgTm9kZS5qcyBwcm9jZXNzIGZyb20gZXhpdGluZy4KICAgIC8vIChFdmVuIHRob3VnaCB0aGlzIGlzIGEgRE9NIGZvcmsgb2YgdGhlIFNjaGVkdWxlciwgeW91IGNvdWxkIGdldCBoZXJlCiAgICAvLyB3aXRoIGEgbWl4IG9mIE5vZGUuanMgMTUrLCB3aGljaCBoYXMgYSBNZXNzYWdlQ2hhbm5lbCwgYW5kIGpzZG9tLikKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMjA3NTYKICAgIC8vCiAgICAvLyBCdXQgYWxzbywgaXQgcnVucyBlYXJsaWVyIHdoaWNoIGlzIHRoZSBzZW1hbnRpYyB3ZSB3YW50LgogICAgLy8gSWYgb3RoZXIgYnJvd3NlcnMgZXZlciBpbXBsZW1lbnQgaXQsIGl0J3MgYmV0dGVyIHRvIHVzZSBpdC4KICAgIC8vIEFsdGhvdWdoIGJvdGggb2YgdGhlc2Ugd291bGQgYmUgaW5mZXJpb3IgdG8gbmF0aXZlIHNjaGVkdWxpbmcuCiAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgbG9jYWxTZXRJbW1lZGlhdGUocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKTsKICAgIH07CiAgfSBlbHNlIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnKSB7CiAgICAvLyBET00gYW5kIFdvcmtlciBlbnZpcm9ubWVudHMuCiAgICAvLyBXZSBwcmVmZXIgTWVzc2FnZUNoYW5uZWwgYmVjYXVzZSBvZiB0aGUgNG1zIHNldFRpbWVvdXQgY2xhbXBpbmcuCiAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpOwogICAgdmFyIHBvcnQgPSBjaGFubmVsLnBvcnQyOwogICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7CgogICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHBvcnQucG9zdE1lc3NhZ2UobnVsbCk7CiAgICB9OwogIH0gZWxzZSB7CiAgICAvLyBXZSBzaG91bGQgb25seSBmYWxsYmFjayBoZXJlIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy4KICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkgewogICAgICBsb2NhbFNldFRpbWVvdXQocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lLCAwKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiByZXF1ZXN0SG9zdENhbGxiYWNrKGNhbGxiYWNrKSB7CiAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBjYWxsYmFjazsKCiAgICBpZiAoIWlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7CiAgICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gdHJ1ZTsKICAgICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlcXVlc3RIb3N0VGltZW91dChjYWxsYmFjaywgbXMpIHsKICAgIHRhc2tUaW1lb3V0SUQgPSBsb2NhbFNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICBjYWxsYmFjayhnZXRDdXJyZW50VGltZSgpKTsKICAgIH0sIG1zKTsKICB9CgogIGZ1bmN0aW9uIGNhbmNlbEhvc3RUaW1lb3V0KCkgewogICAgbG9jYWxDbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCk7CiAgICB0YXNrVGltZW91dElEID0gLTE7CiAgfQoKICB2YXIgdW5zdGFibGVfcmVxdWVzdFBhaW50ID0gcmVxdWVzdFBhaW50OwogIHZhciB1bnN0YWJsZV9Qcm9maWxpbmcgPSAgbnVsbDsKCgoKICB2YXIgU2NoZWR1bGVyID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgX19wcm90b19fOiBudWxsLAogICAgdW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk6IEltbWVkaWF0ZVByaW9yaXR5LAogICAgdW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk6IFVzZXJCbG9ja2luZ1ByaW9yaXR5LAogICAgdW5zdGFibGVfTm9ybWFsUHJpb3JpdHk6IE5vcm1hbFByaW9yaXR5LAogICAgdW5zdGFibGVfSWRsZVByaW9yaXR5OiBJZGxlUHJpb3JpdHksCiAgICB1bnN0YWJsZV9Mb3dQcmlvcml0eTogTG93UHJpb3JpdHksCiAgICB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk6IHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSwKICAgIHVuc3RhYmxlX25leHQ6IHVuc3RhYmxlX25leHQsCiAgICB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrOiB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLAogICAgdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s6IHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLAogICAgdW5zdGFibGVfd3JhcENhbGxiYWNrOiB1bnN0YWJsZV93cmFwQ2FsbGJhY2ssCiAgICB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDogdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsCiAgICB1bnN0YWJsZV9zaG91bGRZaWVsZDogc2hvdWxkWWllbGRUb0hvc3QsCiAgICB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQ6IHVuc3RhYmxlX3JlcXVlc3RQYWludCwKICAgIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uOiB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbiwKICAgIHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uOiB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbiwKICAgIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlOiB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSwKICAgIGdldCB1bnN0YWJsZV9ub3cgKCkgeyByZXR1cm4gZ2V0Q3VycmVudFRpbWU7IH0sCiAgICB1bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZTogZm9yY2VGcmFtZVJhdGUsCiAgICB1bnN0YWJsZV9Qcm9maWxpbmc6IHVuc3RhYmxlX1Byb2ZpbGluZwogIH0pOwoKICB2YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMkMSA9IHsKICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsCiAgICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXIsCiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzogUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsCiAgICAvLyBSZS1leHBvcnQgdGhlIHNjaGVkdWxlIEFQSShzKSBmb3IgVU1EIGJ1bmRsZXMuCiAgICAvLyBUaGlzIGF2b2lkcyBpbnRyb2R1Y2luZyBhIGRlcGVuZGVuY3kgb24gYSBuZXcgVU1EIGdsb2JhbCBpbiBhIG1pbm9yIHVwZGF0ZSwKICAgIC8vIFNpbmNlIHRoYXQgd291bGQgYmUgYSBicmVha2luZyBjaGFuZ2UgKGUuZy4gZm9yIGFsbCBleGlzdGluZyBDb2RlU2FuZGJveGVzKS4KICAgIC8vIFRoaXMgcmUtZXhwb3J0IGlzIG9ubHkgcmVxdWlyZWQgZm9yIFVNRCBidW5kbGVzOwogICAgLy8gQ0pTIGJ1bmRsZXMgdXNlIHRoZSBzaGFyZWQgTlBNIHBhY2thZ2UuCiAgICBTY2hlZHVsZXI6IFNjaGVkdWxlcgogIH07CgogIHsKICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzJDEuUmVhY3RDdXJyZW50QWN0UXVldWUgPSBSZWFjdEN1cnJlbnRBY3RRdWV1ZTsKICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzJDEuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWU7CiAgfQoKICBmdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2NvcGUsIG9wdGlvbnMpIHsKICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247CiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0ge307CiAgICB2YXIgY3VycmVudFRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uOwoKICAgIHsKICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTsKICAgIH0KCiAgICB0cnkgewogICAgICBzY29wZSgpOwogICAgfSBmaW5hbGx5IHsKICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uOwoKICAgICAgewogICAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykgewogICAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7CgogICAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7CiAgICAgICAgICAgIHdhcm4oJ0RldGVjdGVkIGEgbGFyZ2UgbnVtYmVyIG9mIHVwZGF0ZXMgaW5zaWRlIHN0YXJ0VHJhbnNpdGlvbi4gJyArICdJZiB0aGlzIGlzIGR1ZSB0byBhIHN1YnNjcmlwdGlvbiBwbGVhc2UgcmUtd3JpdGUgaXQgdG8gdXNlIFJlYWN0IHByb3ZpZGVkIGhvb2tzLiAnICsgJ090aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS4nKTsKICAgICAgICAgIH0KCiAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgdmFyIGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gZmFsc2U7CiAgdmFyIGVucXVldWVUYXNrSW1wbCA9IG51bGw7CiAgZnVuY3Rpb24gZW5xdWV1ZVRhc2sodGFzaykgewogICAgaWYgKGVucXVldWVUYXNrSW1wbCA9PT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIC8vIHJlYWQgcmVxdWlyZSBvZmYgdGhlIG1vZHVsZSBvYmplY3QgdG8gZ2V0IGFyb3VuZCB0aGUgYnVuZGxlcnMuCiAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIGRldGVjdCBhIHJlcXVpcmUgYW5kIGJ1bmRsZSBhIE5vZGUgcG9seWZpbGwuCiAgICAgICAgdmFyIHJlcXVpcmVTdHJpbmcgPSAoJ3JlcXVpcmUnICsgTWF0aC5yYW5kb20oKSkuc2xpY2UoMCwgNyk7CiAgICAgICAgdmFyIG5vZGVSZXF1aXJlID0gbW9kdWxlICYmIG1vZHVsZVtyZXF1aXJlU3RyaW5nXTsgLy8gYXNzdW1pbmcgd2UncmUgaW4gbm9kZSwgbGV0J3MgdHJ5IHRvIGdldCBub2RlJ3MKICAgICAgICAvLyB2ZXJzaW9uIG9mIHNldEltbWVkaWF0ZSwgYnlwYXNzaW5nIGZha2UgdGltZXJzIGlmIGFueS4KCiAgICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gbm9kZVJlcXVpcmUuY2FsbChtb2R1bGUsICd0aW1lcnMnKS5zZXRJbW1lZGlhdGU7CiAgICAgIH0gY2F0Y2ggKF9lcnIpIHsKICAgICAgICAvLyB3ZSdyZSBpbiBhIGJyb3dzZXIKICAgICAgICAvLyB3ZSBjYW4ndCB1c2UgcmVndWxhciB0aW1lcnMgYmVjYXVzZSB0aGV5IG1heSBzdGlsbCBiZSBmYWtlZAogICAgICAgIC8vIHNvIHdlIHRyeSBNZXNzYWdlQ2hhbm5lbCtwb3N0TWVzc2FnZSBpbnN0ZWFkCiAgICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICB7CiAgICAgICAgICAgIGlmIChkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCA9IHRydWU7CgogICAgICAgICAgICAgIGlmICh0eXBlb2YgTWVzc2FnZUNoYW5uZWwgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICBlcnJvcignVGhpcyBicm93c2VyIGRvZXMgbm90IGhhdmUgYSBNZXNzYWdlQ2hhbm5lbCBpbXBsZW1lbnRhdGlvbiwgJyArICdzbyBlbnF1ZXVpbmcgdGFza3MgdmlhIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pIHdpbGwgZmFpbC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzICcgKyAnaWYgeW91IGVuY291bnRlciB0aGlzIHdhcm5pbmcuJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTsKICAgICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gY2FsbGJhY2s7CiAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKHVuZGVmaW5lZCk7CiAgICAgICAgfTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBlbnF1ZXVlVGFza0ltcGwodGFzayk7CiAgfQoKICB2YXIgYWN0U2NvcGVEZXB0aCA9IDA7CiAgdmFyIGRpZFdhcm5Ob0F3YWl0QWN0ID0gZmFsc2U7CiAgZnVuY3Rpb24gYWN0KGNhbGxiYWNrKSB7CiAgICB7CiAgICAgIC8vIGBhY3RgIGNhbGxzIGNhbiBiZSBuZXN0ZWQsIHNvIHdlIHRyYWNrIHRoZSBkZXB0aC4gVGhpcyByZXByZXNlbnRzIHRoZQogICAgICAvLyBudW1iZXIgb2YgYGFjdGAgc2NvcGVzIG9uIHRoZSBzdGFjay4KICAgICAgdmFyIHByZXZBY3RTY29wZURlcHRoID0gYWN0U2NvcGVEZXB0aDsKICAgICAgYWN0U2NvcGVEZXB0aCsrOwoKICAgICAgaWYgKFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPT09IG51bGwpIHsKICAgICAgICAvLyBUaGlzIGlzIHRoZSBvdXRlcm1vc3QgYGFjdGAgc2NvcGUuIEluaXRpYWxpemUgdGhlIHF1ZXVlLiBUaGUgcmVjb25jaWxlcgogICAgICAgIC8vIHdpbGwgZGV0ZWN0IHRoZSBxdWV1ZSBhbmQgdXNlIGl0IGluc3RlYWQgb2YgU2NoZWR1bGVyLgogICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBbXTsKICAgICAgfQoKICAgICAgdmFyIHByZXZJc0JhdGNoaW5nTGVnYWN5ID0gUmVhY3RDdXJyZW50QWN0UXVldWUuaXNCYXRjaGluZ0xlZ2FjeTsKICAgICAgdmFyIHJlc3VsdDsKCiAgICAgIHRyeSB7CiAgICAgICAgLy8gVXNlZCB0byByZXByb2R1Y2UgYmVoYXZpb3Igb2YgYGJhdGNoZWRVcGRhdGVzYCBpbiBsZWdhY3kgbW9kZS4gT25seQogICAgICAgIC8vIHNldCB0byBgdHJ1ZWAgd2hpbGUgdGhlIGdpdmVuIGNhbGxiYWNrIGlzIGV4ZWN1dGVkLCBub3QgZm9yIHVwZGF0ZXMKICAgICAgICAvLyB0cmlnZ2VyZWQgZHVyaW5nIGFuIGFzeW5jIGV2ZW50LCBiZWNhdXNlIHRoaXMgaXMgaG93IHRoZSBsZWdhY3kKICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBgYWN0YCBiZWhhdmVkLgogICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3kgPSB0cnVlOwogICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKCk7IC8vIFJlcGxpY2F0ZSBiZWhhdmlvciBvZiBvcmlnaW5hbCBgYWN0YCBpbXBsZW1lbnRhdGlvbiBpbiBsZWdhY3kgbW9kZSwKICAgICAgICAvLyB3aGljaCBmbHVzaGVkIHVwZGF0ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNjb3BlIGZ1bmN0aW9uIGV4aXRzLCBldmVuCiAgICAgICAgLy8gaWYgaXQncyBhbiBhc3luYyBmdW5jdGlvbi4KCiAgICAgICAgaWYgKCFwcmV2SXNCYXRjaGluZ0xlZ2FjeSAmJiBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSkgewogICAgICAgICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDsKCiAgICAgICAgICBpZiAocXVldWUgIT09IG51bGwpIHsKICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUgPSBmYWxzZTsKICAgICAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gcHJldklzQmF0Y2hpbmdMZWdhY3k7CiAgICAgIH0KCiAgICAgIGlmIChyZXN1bHQgIT09IG51bGwgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgdmFyIHRoZW5hYmxlUmVzdWx0ID0gcmVzdWx0OyAvLyBUaGUgY2FsbGJhY2sgaXMgYW4gYXN5bmMgZnVuY3Rpb24gKGkuZS4gcmV0dXJuZWQgYSBwcm9taXNlKS4gV2FpdAogICAgICAgIC8vIGZvciBpdCB0byByZXNvbHZlIGJlZm9yZSBleGl0aW5nIHRoZSBjdXJyZW50IHNjb3BlLgoKICAgICAgICB2YXIgd2FzQXdhaXRlZCA9IGZhbHNlOwogICAgICAgIHZhciB0aGVuYWJsZSA9IHsKICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgd2FzQXdhaXRlZCA9IHRydWU7CiAgICAgICAgICAgIHRoZW5hYmxlUmVzdWx0LnRoZW4oZnVuY3Rpb24gKHJldHVyblZhbHVlKSB7CiAgICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpOwoKICAgICAgICAgICAgICBpZiAoYWN0U2NvcGVEZXB0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gV2UndmUgZXhpdGVkIHRoZSBvdXRlcm1vc3QgYWN0IHNjb3BlLiBSZWN1cnNpdmVseSBmbHVzaCB0aGUKICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHVudGlsIHRoZXJlJ3Mgbm8gcmVtYWluaW5nIHdvcmsuCiAgICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4KICAgICAgICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7CiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgewogICAgICAgICAgaWYgKCFkaWRXYXJuTm9Bd2FpdEFjdCAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmCiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge30pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIGlmICghd2FzQXdhaXRlZCkgewogICAgICAgICAgICAgICAgZGlkV2Fybk5vQXdhaXRBY3QgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGVycm9yKCdZb3UgY2FsbGVkIGFjdChhc3luYyAoKSA9PiAuLi4pIHdpdGhvdXQgYXdhaXQuICcgKyAnVGhpcyBjb3VsZCBsZWFkIHRvIHVuZXhwZWN0ZWQgdGVzdGluZyBiZWhhdmlvdXIsICcgKyAnaW50ZXJsZWF2aW5nIG11bHRpcGxlIGFjdCBjYWxscyBhbmQgbWl4aW5nIHRoZWlyICcgKyAnc2NvcGVzLiAnICsgJ1lvdSBzaG91bGQgLSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKTsnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoZW5hYmxlOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIG5vdCBhbiBhc3luYyBmdW5jdGlvbi4gRXhpdCB0aGUgY3VycmVudCBzY29wZQogICAgICAgIC8vIGltbWVkaWF0ZWx5LCB3aXRob3V0IGF3YWl0aW5nLgoKICAgICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7CgogICAgICAgIGlmIChhY3RTY29wZURlcHRoID09PSAwKSB7CiAgICAgICAgICAvLyBFeGl0aW5nIHRoZSBvdXRlcm1vc3QgYWN0IHNjb3BlLiBGbHVzaCB0aGUgcXVldWUuCiAgICAgICAgICB2YXIgX3F1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDsKCiAgICAgICAgICBpZiAoX3F1ZXVlICE9PSBudWxsKSB7CiAgICAgICAgICAgIGZsdXNoQWN0UXVldWUoX3F1ZXVlKTsKICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IG51bGw7CiAgICAgICAgICB9IC8vIFJldHVybiBhIHRoZW5hYmxlLiBJZiB0aGUgdXNlciBhd2FpdHMgaXQsIHdlJ2xsIGZsdXNoIGFnYWluIGluCiAgICAgICAgICAvLyBjYXNlIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkIGJ5IGEgbWljcm90YXNrLgoKCiAgICAgICAgICB2YXIgX3RoZW5hYmxlID0gewogICAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgLy8gQ29uZmlybSB3ZSBoYXZlbid0IHJlLWVudGVyZWQgYW5vdGhlciBgYWN0YCBzY29wZSwgaW4gY2FzZQogICAgICAgICAgICAgIC8vIHRoZSB1c2VyIGRvZXMgc29tZXRoaW5nIHdlaXJkIGxpa2UgYXdhaXQgdGhlIHRoZW5hYmxlCiAgICAgICAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMuCiAgICAgICAgICAgICAgaWYgKFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsdXNoIHRoZSBxdWV1ZSB1bnRpbCB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLgogICAgICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdOwogICAgICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIF90aGVuYWJsZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gU2luY2Ugd2UncmUgaW5zaWRlIGEgbmVzdGVkIGBhY3RgIHNjb3BlLCB0aGUgcmV0dXJuZWQgdGhlbmFibGUKICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IHJlc29sdmVzLiBUaGUgb3V0ZXIgc2NvcGUgd2lsbCBmbHVzaCB0aGUgcXVldWUuCiAgICAgICAgICB2YXIgX3RoZW5hYmxlMiA9IHsKICAgICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIF90aGVuYWJsZTI7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCkgewogICAgewogICAgICBpZiAocHJldkFjdFNjb3BlRGVwdGggIT09IGFjdFNjb3BlRGVwdGggLSAxKSB7CiAgICAgICAgZXJyb3IoJ1lvdSBzZWVtIHRvIGhhdmUgb3ZlcmxhcHBpbmcgYWN0KCkgY2FsbHMsIHRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdCZSBzdXJlIHRvIGF3YWl0IHByZXZpb3VzIGFjdCgpIGNhbGxzIGJlZm9yZSBtYWtpbmcgYSBuZXcgb25lLiAnKTsKICAgICAgfQoKICAgICAgYWN0U2NvcGVEZXB0aCA9IHByZXZBY3RTY29wZURlcHRoOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KSB7CiAgICB7CiAgICAgIHZhciBxdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7CgogICAgICBpZiAocXVldWUgIT09IG51bGwpIHsKICAgICAgICB0cnkgewogICAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7CiAgICAgICAgICBlbnF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAvLyBObyBhZGRpdGlvbmFsIHdvcmsgd2FzIHNjaGVkdWxlZC4gRmluaXNoLgogICAgICAgICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgPSBudWxsOwogICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIEtlZXAgZmx1c2hpbmcgd29yayB1bnRpbCB0aGVyZSdzIG5vbmUgbGVmdC4KICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIHZhciBpc0ZsdXNoaW5nID0gZmFsc2U7CgogIGZ1bmN0aW9uIGZsdXNoQWN0UXVldWUocXVldWUpIHsKICAgIHsKICAgICAgaWYgKCFpc0ZsdXNoaW5nKSB7CiAgICAgICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS4KICAgICAgICBpc0ZsdXNoaW5nID0gdHJ1ZTsKICAgICAgICB2YXIgaSA9IDA7CgogICAgICAgIHRyeSB7CiAgICAgICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IHF1ZXVlW2ldOwoKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2sodHJ1ZSk7CiAgICAgICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTsKICAgICAgICAgIH0KCiAgICAgICAgICBxdWV1ZS5sZW5ndGggPSAwOwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuCiAgICAgICAgICBxdWV1ZSA9IHF1ZXVlLnNsaWNlKGkgKyAxKTsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBpc0ZsdXNoaW5nID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICB2YXIgY3JlYXRlRWxlbWVudCQxID0gIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7CiAgdmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDsKICB2YXIgY3JlYXRlRmFjdG9yeSA9ICBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24gOwogIHZhciBDaGlsZHJlbiA9IHsKICAgIG1hcDogbWFwQ2hpbGRyZW4sCiAgICBmb3JFYWNoOiBmb3JFYWNoQ2hpbGRyZW4sCiAgICBjb3VudDogY291bnRDaGlsZHJlbiwKICAgIHRvQXJyYXk6IHRvQXJyYXksCiAgICBvbmx5OiBvbmx5Q2hpbGQKICB9OwoKICBleHBvcnRzLkNoaWxkcmVuID0gQ2hpbGRyZW47CiAgZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7CiAgZXhwb3J0cy5GcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7CiAgZXhwb3J0cy5Qcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7CiAgZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gUHVyZUNvbXBvbmVudDsKICBleHBvcnRzLlN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOwogIGV4cG9ydHMuU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFOwogIGV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBSZWFjdFNoYXJlZEludGVybmFscyQxOwogIGV4cG9ydHMuY2xvbmVFbGVtZW50ID0gY2xvbmVFbGVtZW50JDE7CiAgZXhwb3J0cy5jcmVhdGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDsKICBleHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50JDE7CiAgZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeTsKICBleHBvcnRzLmNyZWF0ZVJlZiA9IGNyZWF0ZVJlZjsKICBleHBvcnRzLmZvcndhcmRSZWYgPSBmb3J3YXJkUmVmOwogIGV4cG9ydHMuaXNWYWxpZEVsZW1lbnQgPSBpc1ZhbGlkRWxlbWVudDsKICBleHBvcnRzLmxhenkgPSBsYXp5OwogIGV4cG9ydHMubWVtbyA9IG1lbW87CiAgZXhwb3J0cy5zdGFydFRyYW5zaXRpb24gPSBzdGFydFRyYW5zaXRpb247CiAgZXhwb3J0cy51bnN0YWJsZV9hY3QgPSBhY3Q7CiAgZXhwb3J0cy51c2VDYWxsYmFjayA9IHVzZUNhbGxiYWNrOwogIGV4cG9ydHMudXNlQ29udGV4dCA9IHVzZUNvbnRleHQ7CiAgZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gdXNlRGVidWdWYWx1ZTsKICBleHBvcnRzLnVzZURlZmVycmVkVmFsdWUgPSB1c2VEZWZlcnJlZFZhbHVlOwogIGV4cG9ydHMudXNlRWZmZWN0ID0gdXNlRWZmZWN0OwogIGV4cG9ydHMudXNlSWQgPSB1c2VJZDsKICBleHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSB1c2VJbXBlcmF0aXZlSGFuZGxlOwogIGV4cG9ydHMudXNlSW5zZXJ0aW9uRWZmZWN0ID0gdXNlSW5zZXJ0aW9uRWZmZWN0OwogIGV4cG9ydHMudXNlTGF5b3V0RWZmZWN0ID0gdXNlTGF5b3V0RWZmZWN0OwogIGV4cG9ydHMudXNlTWVtbyA9IHVzZU1lbW87CiAgZXhwb3J0cy51c2VSZWR1Y2VyID0gdXNlUmVkdWNlcjsKICBleHBvcnRzLnVzZVJlZiA9IHVzZVJlZjsKICBleHBvcnRzLnVzZVN0YXRlID0gdXNlU3RhdGU7CiAgZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlOwogIGV4cG9ydHMudXNlVHJhbnNpdGlvbiA9IHVzZVRyYW5zaXRpb247CiAgZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uOwoKfSkpKTs=","response_hash":"50dc9e9f45546999dbe7c4b5d13751cdd98a6c67aca6bb7546ff3274df0cf090","response_time_ms":0,"response_words":12846,"has_response":true,"parameters":[{"name":"1","value":"resources","type":"path","name_start":-1,"name_end":-1,"value_start":5,"value_end":14},{"name":"2","value":"js","type":"path","name_start":-1,"name_end":-1,"value_start":15,"value_end":17},{"name":"3","value":"react.development.js","type":"path","name_start":-1,"name_end":-1,"value_start":18,"value_end":38}],"sent_at":"2026-04-05T05:31:31.630884Z","received_at":"2026-04-05T05:31:31.630857Z","created_at":"2026-04-05T05:31:31Z","source":"spidering","is_authenticated":false,"risk_score":0}} +{"type":"module","data":{"id":"xss-light-url-params","name":"XSS Light - URL Parameters","type":"active","description":"## Description\nCharacter-based Reflected XSS detection for URL query parameters. Applies POST-to-GET\nconversion when applicable and tests URL parameters for reflection-based XSS.\n\n## Notes\n- Focuses specifically on URL query string parameters\n- Converts POST parameters to GET for broader coverage when applicable\n\n## References\n- https://portswigger.net/burp/documentation/scanner/xss","short_description":"Detects XSS in URL parameters (POST→GET conversion when applicable)","confirmation_criteria":"Confirmed when URL query parameter values are reflected in the response with exploitable character handling","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"xss-light-path","name":"XSS Light - Path Injection","type":"active","description":"## Description\nCharacter-based Reflected XSS detection in URL path segments. Tests path components\nfor reflection using recursive, cut, and append injection strategies.\n\n## Notes\n- Targets URL path segments rather than query parameters\n- Uses multiple path manipulation strategies for thorough coverage\n\n## References\n- https://portswigger.net/burp/documentation/scanner/xss","short_description":"Detects XSS via path manipulation (recursive, cut, append)","confirmation_criteria":"Confirmed when injected path segment characters are reflected in the response without sanitization","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"xss-light-param-discovery","name":"XSS Light - Parameter Discovery","type":"active","description":"## Description\nDiscovers and tests hidden parameters that reflect in the response. Brute-forces common\nparameter names and checks if values are echoed back, then tests for XSS.\n\n## Notes\n- Runs per-request to discover parameters not visible in the original request\n- Combines parameter discovery with XSS Light transform analysis\n\n## References\n- https://portswigger.net/burp/documentation/scanner/xss","short_description":"Detects XSS via echo parameter discovery","confirmation_criteria":"Confirmed when a discovered hidden parameter reflects injected characters without proper encoding","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"reflected-ssti","name":"Reflected SSTI","type":"active","description":"## Description\nDetects Server-Side Template Injection vulnerabilities by injecting math expressions\n(e.g., {{7*7}}) and checking if the computed result appears in the response.\n\n## Notes\n- Tests multiple template engine syntaxes (Jinja2, Twig, Freemarker, etc.)\n- Uses unique random values to avoid false positives from cached responses\n- Confirmed by matching computed mathematical results in the response\n\n## References\n- https://portswigger.net/research/server-side-template-injection","short_description":"Detects SSTI via math expression evaluation","confirmation_criteria":"Confirmed when injected math expressions (e.g., {{7*7}}=49) are evaluated and the computed result appears in the response","severity":"high","confidence":"certain","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssti-detection","name":"SSTI Detection","type":"active","description":"## Description\nDetects Server-Side Template Injection via Boolean Error-Based Blind technique.\nSends valid and invalid template expressions and compares response differences.\n\n## Notes\n- Uses differential analysis: valid template syntax vs invalid syntax\n- Detects template engines by error response patterns\n- Complements the Reflected SSTI module with blind detection\n\n## References\n- https://portswigger.net/research/server-side-template-injection","short_description":"Diff-based SSTI detection via error responses","confirmation_criteria":"Confirmed when valid template expressions produce different responses than syntactically invalid ones, indicating server-side evaluation","severity":"high","confidence":"certain","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"csti-detection","name":"Client-Side Template Injection (CSTI)","type":"active","description":"## Description\nDetects Client-Side Template Injection vulnerabilities by injecting template expressions\n(e.g., {{7*7}}) and checking if the expression is reflected literally (not HTML-encoded)\nin the response body within a client-side template framework scope.\n\n## Notes\n- Different from server-side SSTI: checks for literal reflection, not evaluation\n- Fingerprints AngularJS and Vue.js frameworks per-host (cached)\n- Only scans hosts where a client-side template framework is detected\n- Verifies the expression is not HTML-encoded (which would prevent exploitation)\n- Uses double confirmation with random anchors to reduce false positives\n\n## References\n- https://portswigger.net/research/xss-without-html-client-side-template-injection-with-angularjs\n- https://portswigger.net/web-security/cross-site-scripting/contexts/client-side-template-injection","short_description":"Detects client-side template injection in AngularJS/Vue.js applications","confirmation_criteria":"Confirmed when injected template expressions (e.g., {{7*7}}) are reflected literally in the HTML response within a client-side framework scope","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"angular-template-injection","name":"Angular Template Injection","type":"active","description":"## Description\nDetects Angular template injection vulnerabilities by injecting math expressions inside\nAngular template syntax (e.g., {{7*7}}) and checking if the computed result appears in\nthe response. This indicates the Angular engine is evaluating user-controlled expressions,\nwhich can lead to arbitrary JavaScript execution.\n\n## Notes\n- Tests basic Angular expression evaluation ({{mathA*mathB}})\n- Tests Angular 1.x sandbox bypass via constructor chain\n- Uses double confirmation with random math anchors to reduce false positives\n- Each confirmation attempt uses different random values\n- Checks that computed result appears in response but not in baseline\n\n## References\n- https://portswigger.net/research/xss-without-html-client-side-template-injection-with-angularjs\n- https://github.com/nicedayzhu/angular-sandbox-bypass-collection","short_description":"Detects Angular template injection via expression evaluation","confirmation_criteria":"Confirmed when injected Angular math expressions are evaluated and the computed result appears in the response across multiple attempts","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"lfi-generic","name":"LFI Generic","type":"active","description":"## Description\nDetects Local File Inclusion vulnerabilities by injecting path traversal payloads\nand checking for known file contents (e.g., /etc/passwd, win.ini) in responses.\n\n## Notes\n- Tests each insertion point with multiple traversal depth levels\n- Matches against known OS file content signatures\n- Uses request deduplication to avoid redundant checks\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/11.1-Testing_for_Local_File_Inclusion","short_description":"Detects LFI via path traversal payloads","confirmation_criteria":"Confirmed when path traversal payloads cause known system file contents (e.g., /etc/passwd) to appear in the response","severity":"critical","confidence":"certain","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"lfi-path-traversal","name":"LFI Path Traversal","type":"active","description":"## Description\nDetects Local File Inclusion vulnerabilities using advanced path traversal techniques\nincluding null byte injection, double URL encoding, Unicode bypass characters, and\nmulti-marker confirmation to reduce false positives.\n\n## Notes\n- Complements lfi_generic with deeper traversal payloads and stronger confirmation\n- Requires at least 2 markers to match in fuzzed response (not present in baseline)\n- Body length delta check prevents matching on trivially similar responses\n- Pre-filters insertion points by file-like parameter names and path-like values\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/11.1-Testing_for_Local_File_Inclusion\n- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion","short_description":"Detects LFI via advanced path traversal, null bytes, encoding bypass, and multi-marker confirmation","confirmation_criteria":"Confirmed when multiple file content markers appear in the response after injecting path traversal payloads and are absent from the baseline response","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sqli-error-based","name":"SQLi Error Based","type":"active","description":"## Description\nDetects SQL injection vulnerabilities by injecting SQL syntax into parameters and\nanalyzing response bodies for database error messages from MySQL, PostgreSQL, MSSQL,\nOracle, and SQLite.\n\n## Notes\n- Tests each insertion point independently\n- Uses request deduplication to avoid redundant checks\n- Skips hosts that have exceeded the error threshold\n\n## References\n- https://owasp.org/www-community/attacks/SQL_Injection","short_description":"Detects SQLi via error messages","confirmation_criteria":"Confirmed when injected SQL syntax triggers a database error pattern in the response body","severity":"critical","confidence":"certain","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sqli-boolean-blind","name":"Blind SQL Injection (Boolean-Based)","type":"active","description":"## Description\nTests for boolean-based blind SQL injection by sending paired TRUE/FALSE payloads and comparing\nresponse differentials. Uses triple-verification to minimize false positives: TRUE and FALSE\npayloads must produce consistently different responses across multiple requests.\n\n## Notes\n- Sends TRUE and FALSE payload pairs to each injection point\n- Compares responses using status code, body length differential, and content hash\n- Triple-verification: confirms TRUE/FALSE differential is consistent across retries\n- Tests string context, numeric context, and WAF bypass payloads\n- Uses NoRedirects to capture TRUE/FALSE differential before redirect\n\n## References\n- https://owasp.org/www-community/attacks/Blind_SQL_Injection\n- https://portswigger.net/web-security/sql-injection/blind","short_description":"Detects boolean-based blind SQL injection vulnerabilities","confirmation_criteria":"Confirmed when TRUE payloads consistently produce different responses from FALSE payloads across multiple verification requests","severity":"high","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sqli-time-blind","name":"Blind SQL Injection (Time-Based)","type":"active","description":"## Description\nTests for time-based blind SQL injection by sending paired sleep/no-sleep payloads and\nmeasuring response time differentials. Uses triple-verification (sleep, no-sleep, sleep)\nto minimize false positives caused by network jitter or server load.\n\n## Notes\n- Sends sleep and no-sleep payload pairs to each injection point\n- Measures response time using wall-clock timing around each request\n- Triple-verification: confirms sleep causes consistent delay across multiple requests\n- Tests MySQL SLEEP, PostgreSQL pg_sleep, MSSQL WAITFOR DELAY, SQLite RANDOMBLOB, Oracle DBMS_PIPE\n- Tests both string and numeric contexts\n- Uses NoRedirects to capture timing before redirect\n\n## References\n- https://owasp.org/www-community/attacks/Blind_SQL_Injection\n- https://portswigger.net/web-security/sql-injection/blind/lab-time-delays","short_description":"Detects time-based blind SQL injection vulnerabilities","confirmation_criteria":"Confirmed when sleep payloads consistently cause measurable time delays compared to no-sleep payloads across triple verification","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nosqli-error-based","name":"NoSQLi Error Based","type":"active","description":"## Description\nDetects NoSQL injection vulnerabilities by injecting MongoDB/NoSQL operators and\nsyntax into parameters and analyzing response bodies for database error messages.\n\n## Notes\n- Tests each insertion point with NoSQL-specific payloads\n- Detects MongoDB, CouchDB, and Cassandra error patterns\n- Uses request deduplication to avoid redundant checks\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/05.6-Testing_for_NoSQL_Injection\n- https://portswigger.net/web-security/nosql-injection","short_description":"Detects NoSQL injection via error messages and operator injection","confirmation_criteria":"Confirmed when injected NoSQL operators trigger database error patterns in the response body","severity":"critical","confidence":"certain","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nosqli-operator-injection","name":"NoSQL Operator Injection","type":"active","description":"## Description\nTests for NoSQL injection by injecting MongoDB query operators ($ne, $gt, $regex,\n$where) and detecting authentication bypass, data exfiltration, and behavioral\nchanges. Complements nosqli_error_based by focusing on operator-level injection\nrather than error messages.\n\n## Notes\n- Payload selection adapts to insertion point type (JSON, URL, body)\n- Four detection modes: auth bypass, size increase, boolean differential, time delay\n- Skips when NoSQL error patterns are detected (deferred to nosqli_error_based)\n- Deduplicates by request hash manager\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/05.6-Testing_for_NoSQL_Injection\n- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/NoSQL%20Injection","short_description":"Detects MongoDB operator injection ($ne, $gt, $regex, $where) for auth bypass and data exfiltration","confirmation_criteria":"Confirmed when NoSQL operator injection causes authentication bypass, data exfiltration, or measurable behavioral change","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"crlf-injection","name":"CRLF Injection","type":"active","description":"## Description\nDetects CRLF injection vulnerabilities in HTTP headers by injecting carriage return and\nline feed characters and checking if they appear in response headers.\n\n## Notes\n- Tests URL parameters for header injection via CRLF sequences\n- Can lead to HTTP response splitting and header injection attacks\n\n## References\n- https://owasp.org/www-community/vulnerabilities/CRLF_Injection","short_description":"Detects CRLF injection","confirmation_criteria":"Confirmed when injected CRLF sequences appear in HTTP response headers, indicating header injection","severity":"medium","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"code-exec","name":"Code Execution (RCE)","type":"active","description":"## Description\nDetects OS Command Injection vulnerabilities using time-based blind detection. Injects\nsleep/delay commands and measures response time differences to confirm execution.\n\n## Notes\n- Uses time-based blind technique to avoid false positives\n- Tests multiple shell syntaxes (bash, cmd, PowerShell)\n\n## References\n- https://owasp.org/www-community/attacks/Command_Injection\n- https://portswigger.net/bappstore/3123d5b5f25c4128894d97ea1571571c","short_description":"Detects OS command injection via time-based blind","confirmation_criteria":"Confirmed when injected sleep/delay commands cause measurable response time increase matching the specified delay","severity":"critical","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"input-behavior-probe","name":"Input Behavior Probe","type":"active","description":"## Description\nComprehensive behavior probing module that detects anomalous responses by\ncomparing HTML tag structure and status codes against a baseline. Operates\nat both request scope and insertion-point scope.\n\n## Probe Types\n1. **Header probing** (per-request): Injects values into known security-relevant\n headers (X-Forwarded-Host, X-Original-URL, etc.) and weird header names.\n2. **Path manipulation** (per-request): Applies prefix/postfix path traversal\n and encoding tricks to each URL path segment.\n3. **Debug parameter injection** (per-request): Appends debug/admin parameters\n (debug=true, admin=1, etc.) to detect hidden debug modes.\n4. **Polyglot fuzz** (per-insertion-point): Injects a polyglot payload to detect\n HTML tag structure changes (original behavior).\n5. **Param char fuzzing** (per-insertion-point): Appends special characters to\n parameter values to detect parser-level behavior differences.\n\n## Notes\n- Compares HTML tag counts and status codes between baseline and probed responses\n- Low confidence; useful as a triage signal for manual investigation\n- Per-request probes are deduped by host+path; per-IP probes are deduped by request hash\n\n## References\n- https://owasp.org/www-community/Fuzzing\n- https://portswigger.net/research/backslash-powered-scanning","short_description":"Detects behavior changes from header, path, debug param, and char probing","confirmation_criteria":"Indicated when probed requests cause structural changes in the response HTML tag tree or notable status code transitions compared to the baseline","severity":"suspect","confidence":"tentative","scan_scope":["PER_INSERTION_POINT","PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"xxe-generic","name":"XXE Generic","type":"active","description":"## Description\nDetects XML External Entity (XXE) injection vulnerabilities in endpoints that accept\nXML input by injecting entity declarations and checking for entity expansion.\n\n## Notes\n- Tests XML body parameters for entity expansion\n- Injects external entity declarations targeting known files\n- Checks for entity value reflection in response body\n- Complements the XML SAML Security module for non-SAML XML endpoints\n\n## References\n- https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing\n- https://portswigger.net/web-security/xxe","short_description":"Detects XML external entity injection in generic XML endpoints","confirmation_criteria":"Confirmed when injected XML entities are expanded and their values appear in the response body","severity":"critical","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"insecure-deserialization","name":"Insecure Deserialization","type":"active","description":"## Description\nDetects insecure deserialization vulnerabilities by injecting serialized object payloads\nand analyzing responses for deserialization error messages across multiple frameworks.\n\n## Notes\n- Tests for Java, PHP, Python, Ruby, and .NET deserialization patterns\n- Uses error-based detection to identify deserialization endpoints\n- Analyzes response bodies for framework-specific error messages\n- OWASP Top 10 2021: A08\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/16-Testing_for_HTTP_Incoming_Requests\n- https://portswigger.net/web-security/deserialization","short_description":"Detects insecure deserialization via error-based detection","confirmation_criteria":"Confirmed when injected serialized payloads trigger deserialization error messages in the response","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssrf-detection","name":"SSRF Detection","type":"active","description":"## Description\nDetects Server-Side Request Forgery (SSRF) vulnerabilities by injecting internal and\nexternal URLs into parameters and analyzing response differences and timing.\n\n## Notes\n- Tests for in-band SSRF using internal IP addresses and cloud metadata endpoints\n- Analyzes response differences between original and injected values\n- Targets parameters with URL-like values\n- OWASP Top 10 2021: A10\n\n## References\n- https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/\n- https://portswigger.net/web-security/ssrf","short_description":"Detects server-side request forgery via out-of-band and in-band techniques","confirmation_criteria":"Confirmed when injected internal URLs or metadata endpoints cause different response content or timing compared to baseline","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssrf-blind","name":"Blind SSRF Detection","type":"active","description":"## Description\nDetects blind Server-Side Request Forgery (SSRF) vulnerabilities by injecting OAST callback\nURLs into URL-like parameters. Unlike in-band SSRF detection, this module detects cases where\nthe server fetches the URL but does not reflect the response content back to the client.\n\n## Notes\n- Requires an interactsh server (configured via oast settings)\n- Targets parameters whose name or value suggests URL input\n- Injects multiple payload formats: direct HTTP/HTTPS, with path, with port, URL-encoded\n- Findings arrive asynchronously via the OAST polling callback\n- Deduplication via RHM and DiskSet to avoid redundant requests\n- OWASP Top 10 2021: A10 (SSRF)\n\n## References\n- https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/\n- https://portswigger.net/web-security/ssrf/blind","short_description":"Detects blind server-side request forgery via OAST callbacks","confirmation_criteria":"Confirmed when target server makes outbound DNS or HTTP request to OAST callback URL injected into a URL-like parameter","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssti-blind","name":"Blind Server-Side Template Injection (SSTI)","type":"active","description":"## Description\nDetects blind Server-Side Template Injection vulnerabilities using a dual approach:\nOAST (Out-of-Band) callbacks via DNS lookups and time-delay payloads as a fallback.\nOAST payloads use nslookup to trigger DNS callbacks, while time-delay payloads use\ncomputationally expensive loops to cause measurable response delays.\n\n## Notes\n- Dual detection: OAST callbacks (Firm confidence) + time-delay fallback (Tentative confidence)\n- OAST payloads target Jinja2, Mako, Freemarker, ERB, EJS, and Pebble engines\n- Time-delay payloads target Jinja2, Twig, Mako, ERB, and Freemarker engines\n- Time-delay uses triple verification (slow, fast, slow) to reduce false positives\n- OAST findings arrive asynchronously via polling callbacks\n\n## References\n- https://portswigger.net/research/server-side-template-injection\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/18-Testing_for_Server-Side_Template_Injection","short_description":"Detects blind SSTI via OAST callbacks and time-delay payloads","confirmation_criteria":"Confirmed via OAST DNS callback from template evaluation or consistent time-delay differential","severity":"critical","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"oast-probe","name":"OAST Probe","type":"active","description":"## Description\nInjects OAST (Out-of-Band Application Security Testing) callback URLs into HTTP headers\nand URL-like parameters to detect blind vulnerabilities such as blind SSRF, blind XXE,\nand blind command injection.\n\n## Notes\n- Requires an interactsh server (configured via oast settings)\n- Injects unique callback URLs into headers: Referer, X-Forwarded-For, X-Forwarded-Host, Origin, X-Original-URL\n- For insertion point scanning, targets parameters with URL-like values\n- Findings arrive asynchronously via the polling callback — this module returns nil results directly\n- DNS-only callbacks are reported as Info; HTTP callbacks are reported as High severity\n- OWASP Top 10 2021: A10 (SSRF)\n\n## References\n- https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/\n- https://portswigger.net/burp/documentation/collaborator","short_description":"Detects blind vulnerabilities via out-of-band callbacks (DNS/HTTP)","confirmation_criteria":"Confirmed when target server makes outbound DNS or HTTP request to OAST callback URL","severity":"high","confidence":"certain","scan_scope":["PER_INSERTION_POINT","PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"proxy-pingback","name":"Proxy Pingback","type":"active","description":"## Description\nProbes for open proxy and callback endpoints by injecting OAST callback URLs into common\nproxy-related URL paths. This detects endpoints that forward or fetch user-supplied URLs\n(open proxy / blind SSRF).\n\n## Notes\n- Requires an interactsh server (configured via oast settings)\n- Targets proxy-related paths: /proxy, /httpproxy, /callback, /url, /remote, etc.\n- Appends OAST URLs via query parameters: url, src, proxy, callback, email, etc.\n- Sends 54 probe requests per host covering path and parameter patterns\n- Each host is tested only once (DiskSet dedup)\n- Findings arrive asynchronously via the OAST polling callback\n- OWASP Top 10 2021: A10 (SSRF)\n\n## References\n- https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/\n- https://portswigger.net/burp/documentation/collaborator","short_description":"Detects open proxy/callback endpoints via OAST URL injection into proxy-related paths","confirmation_criteria":"Confirmed when target server makes outbound DNS or HTTP request to OAST callback URL via proxy endpoint","severity":"high","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cors-misconfiguration","name":"CORS Misconfiguration","type":"active","description":"## Description\nDetects CORS (Cross-Origin Resource Sharing) misconfigurations that allow unauthorized\ncross-origin access. Tests for reflected origins, null origin acceptance, wildcard with\ncredentials, and subdomain bypass patterns.\n\n## Notes\n- Runs once per host with internal deduplication\n- Sends 4 probes with different Origin headers per host\n- Low false-positive rate due to strict header matching\n\n## References\n- https://portswigger.net/web-security/cors\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/11-Client-side_Testing/07-Testing_Cross_Origin_Resource_Sharing","short_description":"Detects permissive CORS policies allowing unauthorized cross-origin access","confirmation_criteria":"Confirmed when the server reflects a controlled Origin value in the Access-Control-Allow-Origin header, indicating permissive CORS policy","severity":"medium","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-actuator-misconfig","name":"Spring Actuator Misconfiguration","type":"active","description":"## Description\nDetects exposed Spring Boot Actuator endpoints that leak sensitive application\ninformation such as environment variables, health status, and configuration.\n\n## Notes\n- Checks common actuator paths (/actuator, /env, /health, /info, /mappings, etc.)\n- Runs per-request to detect misconfigured access controls\n- Exposed actuators can leak secrets, internal URLs, and database credentials\n\n## References\n- https://docs.spring.io/spring-boot/reference/actuator/endpoints.html\n- https://www.veracode.com/blog/research/exploiting-spring-boot-actuators","short_description":"Detects exposed Spring Boot actuator endpoints","confirmation_criteria":"Confirmed when actuator endpoints return valid JSON responses containing application configuration or health data","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"host-header-injection","name":"Host Header Injection","type":"active","description":"## Description\nDetects host header injection vulnerabilities by manipulating the Host header and\nrelated headers (X-Forwarded-Host, X-Host) to identify routing or content changes.\n\n## Notes\n- Tests host header manipulation with evil domain values\n- Checks for host value reflection in response body and headers\n- Runs per-request to test each endpoint\n- Can lead to password reset poisoning, cache poisoning, and SSRF\n\n## References\n- https://portswigger.net/web-security/host-header\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection","short_description":"Detects host header injection and routing manipulation","confirmation_criteria":"Confirmed when manipulated Host header value is reflected in response body, Location header, or other response headers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"web-cache-poisoning","name":"Web Cache Poisoning","type":"active","description":"## Description\nDetects web cache poisoning vulnerabilities by injecting values via unkeyed headers\n(X-Forwarded-Host, X-Forwarded-Scheme, X-Original-URL) and checking for reflection.\n\n## Notes\n- Tests unkeyed headers that may influence cached responses\n- Checks for header value reflection in response body\n- Analyzes cache-related headers (Age, X-Cache, Cache-Control)\n- Runs per-request to test endpoint-specific caching behavior\n\n## References\n- https://portswigger.net/web-security/web-cache-poisoning\n- https://portswigger.net/research/practical-web-cache-poisoning","short_description":"Detects web cache poisoning via unkeyed header injection","confirmation_criteria":"Confirmed when unkeyed header values are reflected in the response body, indicating cache-poisoning potential","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"prototype-pollution","name":"Prototype Pollution","type":"active","description":"## Description\nDetects server-side prototype pollution vulnerabilities by injecting __proto__ and\nconstructor.prototype properties in JSON parameters and analyzing response changes.\n\n## Notes\n- Tests JSON body parameters for prototype pollution vectors\n- Injects __proto__, constructor.prototype, and __proto__[status] payloads\n- Analyzes response status code and body changes after pollution\n- Targets Node.js/Express applications\n\n## References\n- https://portswigger.net/web-security/prototype-pollution\n- https://portswigger.net/research/server-side-prototype-pollution","short_description":"Detects server-side prototype pollution via JSON injection","confirmation_criteria":"Confirmed when __proto__ or constructor.prototype injection causes observable changes in response status, headers, or body","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"client-prototype-pollution","name":"Client-Side Prototype Pollution","type":"active","description":"## Description\nDetects client-side prototype pollution vulnerabilities by analyzing JavaScript code\non the page for known vulnerable URL parameter parsing patterns (sources) and\nexploitable property access patterns (gadgets).\n\n## Notes\n- Different from server-side prototype pollution: targets browser-side JavaScript, not JSON bodies\n- Analyzes inline scripts and fetches external JS files (skipping CDN libraries)\n- Detects source patterns (jQuery.extend, lodash.merge, custom parsers)\n- Detects gadget patterns (innerHTML, eval, script.src assignments)\n- Sends probe requests to verify URL parameter acceptance\n- Host-level deduplication (scans once per host)\n\n## References\n- https://portswigger.net/web-security/prototype-pollution\n- https://portswigger.net/web-security/prototype-pollution/client-side\n- https://portswigger.net/research/widespread-prototype-pollution-gadgets","short_description":"Detects client-side prototype pollution via JavaScript static analysis","confirmation_criteria":"Confirmed when JavaScript static analysis identifies known prototype pollution source patterns in the page's scripts","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"path-normalization","name":"Path Normalization","type":"active","description":"## Description\nTests for path normalization vulnerabilities by iteratively applying traversal payloads\n(with conditional auto-slashing) and checking response status codes and fingerprints\nagainst expected internal/public patterns.\n\n## Notes\n- Compares response fingerprints between public and internal path variations\n- Uses iterative payload application with auto-slashing heuristics\n- Targets middleware and reverse proxy path normalization inconsistencies\n\n## References\n- https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf","short_description":"Detects path normalization vulnerabilities","confirmation_criteria":"Confirmed when traversal payloads produce response fingerprints matching internal resources that differ from public access patterns","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nginx-off-by-slash","name":"Nginx Off-by-Slash","type":"active","description":"## Description\nTests for Nginx \"off-by-slash\" alias traversal misconfiguration. When an Nginx location block\nuses an alias directive without a matching trailing slash, attackers can traverse outside the\nintended directory. For example, \"location /static { alias /var/www/assets/; }\" allows\nrequesting \"/static../etc/passwd\" to read files outside /var/www/assets/.\n\n## Notes\n- Operates on path segments, testing each first-level directory for alias traversal\n- Compares response body against baseline to confirm the traversal resolved to the same content\n- Skips media/JS URLs, non-GET requests, and very small baseline responses\n\n## References\n- https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf\n- https://github.com/bayotop/off-by-slash\n- https://github.com/yandex/gixy\n- https://github.com/hakaioffsec/nginx-alias-traversal","short_description":"Detects Nginx alias traversal via missing trailing slash","confirmation_criteria":"Confirmed when a path-traversal request using the off-by-slash pattern returns status 200 with a body matching a known valid suffix endpoint","severity":"high","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nginx-path-escape","name":"Nginx Path Escape Detection","type":"active","description":"## Description\nDetects Nginx path escape vulnerabilities through differential response analysis,\ntesting alias traversal, URL encoding bypass, and semicolon injection techniques.\n\n## Notes\n- Uses response fingerprint comparison between baseline and test requests\n- Tests per-request with multiple escape techniques\n- Targets Nginx-specific path handling behaviors\n\n## References\n- https://www.acunetix.com/vulnerabilities/web/path-traversal-via-misconfigured-nginx-alias/","short_description":"Diff-based Nginx path escape detection (alias traversal, encoding bypass, semicolon injection)","confirmation_criteria":"Confirmed when path escape payloads produce different response content or status compared to the baseline, indicating path traversal","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"smart-behavior-detection","name":"Smart Behavior Detection","type":"active","description":"## Description\nDetects injection vulnerabilities through differential response analysis. Sends pairs\nof semantically equivalent and different payloads and compares response behaviors.\n\n## Notes\n- Uses behavioral diffing: true/false payload pairs that should produce identical vs different responses\n- Low confidence; serves as a triage signal for deeper investigation\n\n## References\n- https://portswigger.net/bappstore/3123d5b5f25c4128894d97ea1571571c","short_description":"Diff-based injection detection via behavioral analysis","confirmation_criteria":"Indicated when semantically different payloads produce measurably different response behaviors while equivalent payloads produce identical responses","severity":"suspect","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"suspect-transform","name":"Suspect Transform Detection","type":"active","description":"## Description\nDetects suspicious input transformations that may indicate vulnerabilities, including\nexpression evaluation, quote consumption, and unicode normalization issues.\n\n## Notes\n- Tests for server-side expression evaluation (math, string operations)\n- Detects quote consumption that may indicate injection contexts\n- Identifies unicode normalization that could bypass security filters\n\n## References\n- https://portswigger.net/bappstore/3123d5b5f25c4128894d97ea1571571c","short_description":"Detects expression evaluation, quote consumption, unicode transformations","confirmation_criteria":"Indicated when injected expressions are evaluated, quotes are consumed, or unicode characters are normalized by the server","severity":"suspect","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"backslash-transformation","name":"Backslash Transformation Detection","type":"active","description":"## Description\nDetects how servers handle backslash-escaped characters and special characters by injecting\nescape sequences and analyzing transformations in the response.\n\n## Notes\n- Tests each insertion point for backslash consumption, escape interpretation, and unicode handling\n- Useful as a precursor signal for deeper injection testing\n\n## References\n- https://portswigger.net/research/backslash-powered-scanning","short_description":"Detects escape sequence interpretation, backslash consumption, character handling","confirmation_criteria":"Confirmed when injected backslash sequences are transformed differently than literal characters in the response","severity":"suspect","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"race-interference","name":"Race Interference Detection","type":"active","description":"## Description\nDetects race condition vulnerabilities through parallel request analysis, looking for\ninput storage races, cross-request contamination, and request interference patterns.\n\n## Notes\n- Sends concurrent requests with different payloads and analyzes response variations\n- Tests for TOCTOU and state mutation races\n- Requires careful timing analysis\n\n## References\n- https://portswigger.net/research/smashing-the-state-machine","short_description":"Detects input storage, cross-contamination, and request interference races","confirmation_criteria":"Confirmed when parallel requests with different payloads produce cross-contaminated responses, indicating shared mutable state","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"xml-saml-security","name":"XML SAML Security","type":"active","description":"## Description\nDetects unsafe XML transformation in SAML processing, including XXE (XML External Entity)\nand DTD (Document Type Definition) injection vulnerabilities.\n\n## Notes\n- Tests XML parameters for entity expansion and external entity loading\n- Targets SAML-specific XML processing endpoints\n\n## References\n- https://portswigger.net/research/saml-roulette-the-hacker-always-wins\n- https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing","short_description":"SAML XML security checks (XXE/DTD)","confirmation_criteria":"Confirmed when injected XML entities are processed and expanded, or DTD declarations are loaded by the server","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"jwt-vulnerability","name":"JWT Vulnerability","type":"active","description":"## Description\nDetects JWT vulnerabilities including algorithm confusion (none algorithm), weak\nsigning keys, and missing signature verification by manipulating JWT tokens.\n\n## Notes\n- Tests for 'none' algorithm acceptance (CVE-2015-9235)\n- Tests for empty signature acceptance\n- Tests for algorithm confusion (RS256 to HS256)\n- Analyzes Authorization headers and cookies for JWT tokens\n\n## References\n- https://portswigger.net/web-security/jwt\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/06-Session_Management_Testing/10-Testing_JSON_Web_Tokens","short_description":"Detects JWT algorithm confusion and weak signing vulnerabilities","confirmation_criteria":"Confirmed when JWT tokens with 'none' algorithm or empty signature are accepted by the server with a successful response","severity":"critical","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"http-request-smuggling","name":"HTTP Request Smuggling","type":"active","description":"## Description\nDetects HTTP request smuggling vulnerabilities by sending ambiguous requests with\nconflicting Content-Length and Transfer-Encoding headers to identify desync behavior.\n\n## Notes\n- Tests CL.TE and TE.CL desync patterns\n- Uses differential timing analysis to detect smuggling\n- Runs once per host to avoid disruption\n- Requires careful timeout configuration\n\n## References\n- https://portswigger.net/web-security/request-smuggling\n- https://portswigger.net/research/http-desync-attacks","short_description":"Detects HTTP request smuggling via CL.TE and TE.CL desync","confirmation_criteria":"Confirmed when conflicting CL/TE headers cause measurable response timing differences indicating request desync","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"graphql-scan","name":"GraphQL Security Scanner","type":"active","description":"## Description\nDiscovers GraphQL endpoints and tests them for common security misconfigurations including\nenabled introspection, SQL injection through GraphQL arguments, and query batching abuse.\n\n## Notes\n- Probes 8 common GraphQL endpoint paths\n- Tests both POST and GET request methods for endpoint discovery\n- Checks for enabled introspection (information disclosure)\n- Injects SQL payloads into discovered or common field arguments\n- Tests for query batching support (rate limiting bypass)\n- Runs once per host\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/12-API_Testing/01-Testing_GraphQL\n- https://graphql.org/learn/introspection/","short_description":"Tests GraphQL endpoints for introspection, injection, and batching vulnerabilities","confirmation_criteria":"Confirmed when GraphQL endpoint responds to introspection queries, SQL payloads produce database errors, or batch queries execute successfully","severity":"medium","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"file-upload-scan","name":"File Upload Scanner","type":"active","description":"## Description\nTests file upload endpoints for unrestricted file upload vulnerabilities by attempting\nto upload files with various bypass techniques. If upload succeeds, attempts to verify\nexecution of the uploaded file.\n\n## Notes\n- Only triggers on multipart/form-data requests with a filename parameter\n- Tests 7 probe types: direct extension, double extension, null byte, case variation, magic bytes, SVG XXE, and HTML XSS\n- Each probe uses a unique marker for verification\n- Reconstructs multipart body preserving non-file fields (CSRF tokens, hidden fields)\n- Early abort if first probe returns 400/403/415 (strict validation)\n- Attempts to verify upload by fetching common upload directories\n\n## References\n- https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload\n- https://portswigger.net/web-security/file-upload","short_description":"Tests for arbitrary file upload and execution vulnerabilities","confirmation_criteria":"Confirmed when an uploaded file is accessible and contains the unique scan marker, indicating arbitrary file upload and potential code execution","severity":"high","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"default-credentials","name":"Default Credentials","type":"active","description":"## Description\nDetects login endpoints from observed traffic and tests them with common default credential\npairs. Uses intelligent login form detection, CAPTCHA awareness, and lockout protection.\n\n## Notes\n- Only tests POST requests with form-encoded or JSON bodies\n- Detects login endpoints by matching parameter names and URL paths\n- Sends baseline invalid credentials first to establish failure response\n- Stops on first successful login or lockout detection\n- 500ms delay between credential attempts to avoid rate limiting\n- Preserves CSRF tokens and hidden form fields during testing\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/04-Authentication_Testing/02-Testing_for_Default_Credentials","short_description":"Tests for default or common credential pairs on login endpoints","confirmation_criteria":"Confirmed when a known credential pair produces a response significantly different from the invalid-credential baseline, indicating successful authentication","severity":"high","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"forbidden-bypass","name":"403/401 Forbidden Bypass","type":"active","description":"## Description\nTests various techniques to bypass 403 Forbidden and 401 Unauthorized responses, including path manipulation,\nheader injection, HTTP method tampering, method override headers, and URL encoding tricks.\n\n## Notes\n- Only activates when the original response returns 401 or 403 status\n- Tests multiple bypass vectors: path traversal, special headers, HTTP method changes, method override headers\n\n## References\n- https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/403-and-401-bypasses.html","short_description":"Detects bypass methods for 403/401 Forbidden responses","confirmation_criteria":"Confirmed when a bypass technique produces a non-403 response with valid content for a previously forbidden resource","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"http-method-tampering","name":"HTTP Method Tampering","type":"active","description":"## Description\nTests if dangerous HTTP methods (PUT, DELETE, PATCH) are unexpectedly enabled on endpoints,\nand whether method override headers (X-HTTP-Method-Override, X-HTTP-Method, X-Method-Override)\nallow changing server behavior.\n\n## Notes\n- On 2xx endpoints: tests if PUT/DELETE/PATCH return 2xx with meaningful body\n- Tests method override headers via POST with override header set to DELETE/PUT\n- Complementary to forbidden_bypass which focuses on 401/403 endpoints\n- Rate-limited per host to avoid excessive probing\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/06-Test_HTTP_Methods\n- https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html","short_description":"Detects unexpectedly enabled HTTP methods and method override headers","confirmation_criteria":"Confirmed when dangerous HTTP methods return successful responses or method override headers alter server behavior","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"csrf-verify","name":"CSRF Token Verification","type":"active","description":"## Description\nFor requests that contain a CSRF token, this module verifies whether the server\nactually enforces it. It removes, empties, or randomizes the token value and\nchecks if the server still accepts the request.\n\n## Notes\n- Only targets requests that already have a CSRF token parameter\n- Three probe strategies: token removed, token emptied, token randomized\n- Stops probing early if the server returns 4xx/5xx (properly validated)\n- Deduplicates by method + host + path\n\n## References\n- https://owasp.org/www-community/attacks/csrf\n- https://portswigger.net/web-security/csrf/bypassing-token-validation","short_description":"Verifies CSRF token enforcement by removing, emptying, or randomizing tokens","confirmation_criteria":"Confirmed when the server accepts a request with a removed, emptied, or randomized CSRF token","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"idor-detection","name":"IDOR Detection","type":"active","description":"## Description\nActively tests for Insecure Direct Object Reference (IDOR) and Broken Object Level\nAuthorization (BOLA) vulnerabilities by substituting ID parameters with neighbor values\nand comparing responses.\n\nThe module targets parameters classified as object identifiers by the passive IDOR module\n(sequential integers, structured codes, base64-encoded IDs, UUIDv1, emails). For each\ncandidate, it generates predictable neighbor IDs and sends probe requests to detect\nwhether the server enforces authorization.\n\n## Detection Logic\n1. Classify parameter via authzutil.ClassifyParam — skip if not an object ID or low predictability\n2. Generate neighbor IDs (e.g., user_id=42 → 41, 43) via authzutil.GenerateNeighborIDs\n3. Fetch baseline response for the original request\n4. Send probe requests with neighbor IDs and compare responses:\n - 401/403/404 or login redirect → authorization enforced (skip)\n - Soft-denial body strings → authorization enforced (skip)\n - Content identical → public data, not IDOR (skip)\n - Structurally different → different resource type (skip)\n - Structurally similar + different content → potential IDOR finding\n\n## Notes\n- Covers OWASP API1:2023 (Broken Object Level Authorization)\n- Limited to 50 probes per host to avoid excessive traffic\n- Only tests parameters with predictable ID formats (skips UUIDv4, random hex)\n- Confidence promoted to Firm when user-specific fields differ between responses\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/\n- https://cwe.mitre.org/data/definitions/639.html\n- https://portswigger.net/web-security/access-control/idor","short_description":"Detects missing authorization on object ID parameters (IDOR/BOLA)","confirmation_criteria":"Indicated when a probe request with a neighbor object ID returns a structurally similar response with different content, suggesting missing authorization enforcement","severity":"high","confidence":"tentative","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"authz-compare","name":"Cross-Session Authorization Compare","type":"active","description":"## Description\nDetects Broken Object Level Authorization (BOLA) and Insecure Direct Object Reference\n(IDOR) by replaying the same request with different authenticated sessions and comparing\nresponses.\n\nWhen multiple sessions are configured (via --session or --auth-config), this module\nreplays each request observed by the primary session using the compare sessions. It then\nanalyzes the response differences to detect missing authorization enforcement.\n\n## Detection Logic\nFor each request from the primary session:\n1. Skip static assets, media files, and non-authenticated endpoints\n2. Replay the request with each compare session's credentials\n3. Compare primary vs compare responses:\n - Primary 200, Compare 401/403 → properly enforced (skip)\n - Primary 200, Compare 302→login → properly enforced (skip)\n - Primary 200, Compare 200 (same content) → public data (skip)\n - Primary 200, Compare 200 (different content) → IDOR/BOLA finding\n - Primary non-200 → skip (primary can't access either)\n\n## Requirements\n- At least 2 sessions must be configured: one primary and one or more compare sessions\n- Sessions are configured via `--session`, `--auth-config`, or `--session-file` CLI flags\n\n## Notes\n- This module is automatically skipped when no compare sessions are configured\n- Covers OWASP API1:2023 (Broken Object Level Authorization)\n- Complements the idor-detection module which tests neighbor IDs within a single session\n- Uses structural response comparison from authzutil for robust matching\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/\n- https://owasp.org/API-Security/editions/2023/en/0xa5-broken-function-level-authorization/\n- https://cwe.mitre.org/data/definitions/639.html","short_description":"Compares responses across authenticated sessions to detect IDOR/BOLA","confirmation_criteria":"Indicated when two different authenticated sessions receive structurally similar 200 responses with different content at the same endpoint, suggesting missing authorization enforcement","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"mass-assignment","name":"Mass Assignment","type":"active","description":"## Description\nTests JSON API endpoints for mass assignment vulnerabilities by injecting privilege-related\nkeys (role, admin, is_admin, permissions, etc.) into POST/PUT/PATCH JSON request bodies\nand observing server responses.\n\n## Notes\n- Only activates on POST/PUT/PATCH requests with application/json content type\n- Injects one privilege key at a time to isolate findings\n- Reports firm confidence if server echoes back the injected key in response\n- Reports tentative confidence if server accepts the request without error\n- Skips keys already present in the original request body\n\n## References\n- https://cheatsheetseries.owasp.org/cheatsheets/Mass_Assignment_Cheat_Sheet.html\n- https://owasp.org/API-Security/editions/2023/en/0xa3-broken-object-property-level-authorization/","short_description":"Detects mass assignment / parameter pollution in JSON APIs","confirmation_criteria":"Confirmed when injected privilege keys are echoed back in server response or accepted without validation error","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sensitive-file-discovery","name":"Sensitive File Discovery","type":"active","description":"## Description\nDiscovers sensitive files and endpoints exposed on the web server using two\nvalidation strategies. High-confidence probes (~25 paths) use content markers\nto confirm findings. Bulk probes (~1,350 paths covering dot files, extensionless\nfiles, and log files) use Content-Type and body differencing against a 404\nfingerprint.\n\n## Notes\n- Runs once per unique host\n- Marker-based probes: ~25 paths with content marker validation (firm confidence)\n- Generic probes: ~1,350 paths with Content-Type and body differencing (tentative confidence)\n- Generic probes are skipped if the 404 page returns text/plain or octet-stream\n- Fingerprints 404 responses to avoid false positives from custom error pages\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information","short_description":"Probes for exposed sensitive files (.env, .git/config, dot files, log files, and more)","confirmation_criteria":"Marker-based: confirmed when response contains expected content markers. Generic: confirmed when response has text/plain or octet-stream Content-Type and body differs from 404 fingerprint","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"backup-file-discovery","name":"Backup File Discovery","type":"active","description":"## Description\nDiscovers publicly accessible backup files by generating candidate filenames\nfrom the target hostname parts, common backup names, and year variants, then\ncombining them with archive and backup extensions.\n\n## Notes\n- Runs once per unique host\n- Generates ~600-900 candidate paths depending on hostname complexity\n- Validates using 404 fingerprinting, Content-Type, Content-Length, and body differencing\n- SQL/text dumps additionally checked for content markers (CREATE TABLE, INSERT INTO, etc.)\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information","short_description":"Probes for exposed backup archives derived from hostname, common names, and year variants","confirmation_criteria":"Confirmed when response returns 200 with matching archive Content-Type, body size >1KB, and body differs from 404 fingerprint. SQL dumps additionally validated via content markers.","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"iis-shortname-discovery","name":"IIS Short Filename Discovery","type":"active","description":"## Description\nDetects and enumerates IIS 8.3 short filenames exposed through the tilde (~)\nvulnerability. When IIS has short filename generation enabled, an attacker can\ndiscover partial file and directory names by observing differential HTTP status\ncodes for wildcard-based requests.\n\nThe module performs three phases:\n1. **Vulnerability detection** - tests HTTP methods and path suffixes to find a\n working oracle (distinct status codes for existing vs non-existing patterns)\n2. **Character discovery** - identifies which characters appear in short filenames\n to minimize the enumeration search space\n3. **Recursive enumeration** - brute-forces filenames character-by-character\n (up to 6 chars for name, 3 for extension per 8.3 convention)\n\n## Notes\n- Only runs on IIS servers (detected via Server, X-Powered-By, or X-AspNet-Version headers)\n- Runs once per unique host\n- Caps total requests at 2000 per host to avoid excessive traffic\n- Reports discovered 8.3 short filenames (does not attempt full-name autocomplete)\n\n## References\n- https://soroush.me/blog/2023/07/thirteen-years-on-advancing-the-understanding-of-iis-short-file-name-sfn-disclosure/\n- https://github.com/bitquark/shortscan","short_description":"Enumerates IIS 8.3 short filenames via tilde-based oracle (per-host)","confirmation_criteria":"Confirmed when the server returns distinct status codes for wildcard patterns matching existing vs non-existing 8.3 short filenames","severity":"medium","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"jsonp-callback","name":"JSONP Callback Injection","type":"active","description":"## Description\nDetects JSONP (JSON with Padding) endpoints that wrap responses in callback\nfunctions, enabling cross-origin data theft. First checks for existing JSONP\npatterns in responses, then actively injects callback parameters.\n\n## Notes\n- Two-phase detection: passive check for existing JSONP, then active callback injection\n- Severity upgraded from Medium to High if response contains sensitive data\n- Tests multiple common callback parameter names\n- Deduplicates by host + path\n\n## References\n- https://owasp.org/www-community/attacks/Cross_Site_Script_Inclusion\n- https://www.benhayak.com/2015/06/same-origin-method-execution-some.html","short_description":"Detects JSONP endpoints that allow cross-origin data theft via callback injection","confirmation_criteria":"Confirmed when injecting a callback parameter causes the response to be wrapped in the specified function call","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"open-redirect","name":"Open Redirect","type":"active","description":"## Description\nDetects open redirect vulnerabilities by injecting external URLs into parameters\nand checking if the server responds with a redirect to the injected location.\n\n## Notes\n- Tests parameters for unvalidated redirect behavior\n- Checks both Location header and meta refresh redirects\n- Uses request deduplication to avoid redundant checks\n\n## References\n- https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html","short_description":"Detects open redirect vulnerabilities","confirmation_criteria":"Confirmed when injected external URL appears in a redirect Location header or meta refresh tag","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"websocket-security","name":"WebSocket Security","type":"active","description":"## Description\nDetects WebSocket endpoints that accept upgrade requests without proper origin validation.\nTests whether the server enforces origin checks by sending upgrade requests with matching,\nevil, and missing Origin headers.\n\n## Notes\n- Runs once per host+path with internal deduplication\n- Sends up to 3 WebSocket upgrade probes per unique endpoint\n- Low false-positive rate due to strict 101 status code matching\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/11-Client-side_Testing/10-Testing_WebSockets\n- https://portswigger.net/web-security/websockets","short_description":"Detects insecure WebSocket upgrade policies and missing origin validation","confirmation_criteria":"Confirmed when the server accepts a WebSocket upgrade request from an unauthorized or missing origin, indicating missing origin validation","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ws-injection","name":"WebSocket Injection","type":"active","description":"## Description\nTests for injection vulnerabilities (XSS, SQLi, command injection, template injection) in HTTP\nparameters that are likely forwarded to WebSocket message processing contexts. The module targets\nparameters with names commonly associated with WebSocket messaging (e.g., message, data, payload,\ncmd) and sends crafted payloads to detect unvalidated input handling.\n\n## Notes\n- Only tests parameters whose names suggest WebSocket message processing involvement.\n- Checks for reflected XSS payloads, SQL error messages, command output patterns, and template\n expression evaluation in responses.\n- Uses insertion-point-level deduplication to avoid redundant checks.\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/11-Client-side_Testing/10-Testing_WebSockets\n- https://portswigger.net/web-security/websockets","short_description":"Tests for injection vulnerabilities in parameters forwarded to WebSocket message processing","confirmation_criteria":"Confirmed when an injected payload is reflected unencoded, triggers a SQL error, produces command output, or evaluates a template expression in the HTTP response","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ws-cswsh","name":"WebSocket CSWSH","type":"active","description":"## Description\nTests for Cross-Site WebSocket Hijacking (CSWSH) by verifying whether WebSocket upgrade\nendpoints properly validate the Origin header. An attacker can hijack a user's authenticated\nWebSocket connection if the server does not enforce origin checks, allowing cross-origin\nWebSocket handshakes to succeed.\n\n## Notes\n- Only tests endpoints that respond with 101 Switching Protocols to a well-formed WS upgrade.\n- Tests four scenarios: evil external origin, null origin, subdomain spoofing, and missing\n Origin header.\n- Deduplicates by host and path to avoid redundant checks.\n\n## References\n- https://christian-schneider.net/CrossSiteWebSocketHijacking.html\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/11-Client-side_Testing/10-Testing_WebSockets\n- https://portswigger.net/web-security/websockets/cross-site-websocket-hijacking","short_description":"Tests for Cross-Site WebSocket Hijacking via insufficient origin validation","confirmation_criteria":"Confirmed when a WebSocket upgrade succeeds with a malicious, null, subdomain, or missing Origin header","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-rate-limit-bypass","name":"API Rate Limit Bypass","type":"active","description":"## Description\nDetects API rate limiting that can be bypassed using IP spoofing headers such as\nX-Forwarded-For, X-Real-IP, and similar headers. First triggers rate limiting by\nsending rapid requests, then tests whether bypass headers circumvent the limit.\n\n## Notes\n- Runs once per host with internal deduplication\n- Sends up to 10 rapid requests to trigger rate limiting\n- Tests 8 different IP spoofing header variations\n- Only reports when rate limiting is confirmed then bypassed\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/04-Authentication_Testing/04-Testing_for_Bypassing_Authentication_Schema\n- https://portswigger.net/web-security/authentication/password-based","short_description":"Detects rate limiting bypass via IP spoofing headers","confirmation_criteria":"Confirmed when the server enforces rate limiting (429 response) but accepts requests with IP spoofing headers, indicating bypassable rate limiting","severity":"medium","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-data-leakage","name":"Next.js Data Route Leakage","type":"active","description":"## Description\nDetects Next.js data route leakage where authenticated page data can be accessed\nwithout authorization. Next.js Pages Router exposes JSON data at predictable\n/_next/data//.json URLs. When authentication middleware protects\nthe HTML page but not the data route, sensitive page props leak.\n\n## Notes\n- Only activates on 302/401/403 responses from Next.js hosts\n- Requires buildId extraction (from shared cache or response body)\n- Validates JSON response contains pageProps and is not a notFound page\n- Deduplicates by host+path\n\n## References\n- https://nextjs.org/docs/pages/building-your-application/data-fetching\n- https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps","short_description":"Detects unauthorized access to Next.js data routes on auth-protected pages","confirmation_criteria":"Confirmed when the data route returns 200 with valid pageProps JSON for an auth-protected page","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-middleware-bypass","name":"Next.js Middleware Bypass","type":"active","description":"## Description\nTests for Next.js middleware bypass vulnerabilities including CVE-2025-29927 and\npath normalization issues. Next.js middleware runs before route handlers and is\ncommonly used for authentication. Certain header injections and path manipulations\ncan skip middleware execution entirely.\n\n## Notes\n- Only activates on 401/403 responses from Next.js hosts\n- Tests x-middleware-subrequest header injection (CVE-2025-29927)\n- Tests path normalization bypasses (double slashes, URL encoding, locale prefixes)\n- Deduplicates with per-host limit (max 20 attempts per host)\n- Validates bypass by checking status change from 401/403 to 200\n\n## References\n- https://github.com/advisories/GHSA-f82v-jwr5-mffw\n- https://zhero-web-sec.github.io/research-and-things/nextjs-middleware-bypass","short_description":"Detects Next.js middleware authentication bypass via header injection and path manipulation","confirmation_criteria":"Confirmed when a bypass technique changes the response from 401/403 to 200 with non-error content","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-image-ssrf","name":"Next.js Image Optimizer SSRF","type":"active","description":"## Description\nTests the Next.js image optimization endpoint (/_next/image) for Server-Side Request\nForgery. The image optimizer accepts a URL parameter and fetches the image server-side.\nIf improperly configured, it can be abused to access internal resources or cloud\nmetadata endpoints.\n\n## Notes\n- Runs once per host on Next.js-identified targets\n- First verifies /_next/image endpoint exists\n- Uses OAST for out-of-band confirmation when available\n- Falls back to in-band probes (AWS metadata, localhost)\n- Deduplicates by host\n\n## References\n- https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps\n- https://nextjs.org/docs/pages/api-reference/components/image","short_description":"Detects SSRF via the Next.js image optimization endpoint","confirmation_criteria":"Confirmed when the image optimizer fetches an attacker-controlled or internal URL","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-draft-mode-exposure","name":"Next.js Draft Mode Exposure","type":"active","description":"## Description\nProbes common Next.js Draft Mode and Preview Mode API endpoints for missing or weak\nauthentication. Draft Mode allows viewing unpublished CMS content by setting special\ncookies (__prerender_bypass, __next_preview_data). If the enabling endpoint lacks\nproper secret validation, attackers can access embargoed or sensitive content.\n\n## Notes\n- Runs once per host on Next.js-identified targets\n- Probes common draft/preview API routes with no token and common weak tokens\n- Confirms by detecting __prerender_bypass or __next_preview_data cookies in response\n- Deduplicates by host\n\n## References\n- https://nextjs.org/docs/app/guides/draft-mode\n- https://nextjs.org/docs/pages/building-your-application/configuring/preview-mode","short_description":"Detects insecure or unprotected Next.js Draft/Preview Mode endpoints","confirmation_criteria":"Confirmed when a draft/preview endpoint sets bypass cookies without a valid secret","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-version-audit","name":"Next.js Version Audit","type":"active","description":"## Description\nExtracts the Next.js version from client-side JavaScript bundles and maps it to\nknown security advisories. Checks for critical vulnerabilities including middleware\nauth bypass (CVE-2025-29927), SSRF via Server Actions (CVE-2024-34351), cache\npoisoning (CVE-2024-46982), and Server Actions DoS (CVE-2024-39693).\n\n## Notes\n- Active per-host scanner - sends requests to /_next/static/ paths\n- Extracts version from JS bundle patterns (e.g., \"Next.js \")\n- Falls back to __NEXT_DATA__ build metadata analysis\n- Maps extracted version against a local CVE advisory database\n- Deduplicates by host\n\n## References\n- https://github.com/vercel/next.js/security/advisories\n- https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=next.js","short_description":"Fingerprints Next.js version and maps to known CVE advisories","confirmation_criteria":"Confirmed when Next.js version is extracted and matches a known vulnerable version range","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"js-devserver-exposure","name":"JS Dev Server Exposure","type":"active","description":"## Description\nProbes for exposed JavaScript development server endpoints that should never be\naccessible in production. Development servers expose hot module replacement (HMR)\nendpoints, debug tools, and internal APIs that leak source code, enable code injection,\nor reveal server internals.\n\n## Notes\n- Runs once per host\n- Probes: webpack HMR, Vite ping, webpack dev server sockjs, Vue CLI open-in-editor, Nuxt HMR, Remix dev\n- Validates via Content-Type and response body markers\n- Fingerprints 404 to avoid false positives on custom error pages\n\n## References\n- https://webpack.js.org/configuration/dev-server/\n- https://vitejs.dev/config/server-options","short_description":"Detects exposed JavaScript development server endpoints (webpack HMR, Vite, Nuxt)","confirmation_criteria":"Confirmed when a dev server endpoint responds with expected Content-Type or markers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-misconfig","name":"WordPress Misconfiguration","type":"active","description":"## Description\nProbes for WordPress-specific files and endpoints that should not be publicly\naccessible: configuration backups, debug logs, installer/repair endpoints,\ninformational files, directory listings, and the externally triggerable cron.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to avoid false positives from WAF block pages\n- Checks backup variants of wp-config.php (~, .old, .save, .swp, .txt)\n- Detects exposed debug.log with PHP error/warning markers\n- Checks directory listing on /wp-content/uploads/ and /wp-content/plugins/\n\n## References\n- https://developer.wordpress.org/advanced-administration/wordpress/wp-config/\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/","short_description":"Detects exposed WordPress configuration files, debug logs, and dangerous endpoints","confirmation_criteria":"Confirmed when probed WordPress files return 200 with expected content markers (PHP constants, log entries, directory index HTML)","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-xmlrpc","name":"WordPress XML-RPC Abuse","type":"active","description":"## Description\nTests whether the WordPress XML-RPC endpoint is enabled and checks for dangerous\nmethods: system.multicall (enables amplified brute-force attacks in a single request)\nand pingback.ping (enables SSRF-like outbound requests and DDoS amplification).\n\n## Notes\n- Runs once per host\n- Sends a benign system.listMethods call to confirm XML-RPC is active\n- Checks for multicall and pingback methods in the response\n- Does not attempt actual brute-force or pingback abuse\n\n## References\n- https://developer.wordpress.org/plugins/security/data-validation/\n- https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-core","short_description":"Detects enabled WordPress XML-RPC with multicall brute-force and pingback abuse potential","confirmation_criteria":"Confirmed when /xmlrpc.php returns a valid methodResponse containing method names","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-user-enum","name":"WordPress User Enumeration","type":"active","description":"## Description\nTests for WordPress user enumeration through two vectors:\n1. Author archive redirects: /?author=N redirects to /author//\n2. REST API user listing: /wp-json/wp/v2/users returns user objects with slugs\n\nEnumerated usernames can be used for password brute-force attacks.\n\n## Notes\n- Runs once per host\n- Tests author IDs 1 through 5\n- Checks REST API with and without per_page parameter\n- Non-destructive: only performs GET requests\n\n## References\n- https://www.wpbeginner.com/plugins/how-to-discourage-brute-force-by-blocking-author-scans-in-wordpress/\n- https://developer.wordpress.org/rest-api/reference/users/","short_description":"Detects WordPress user enumeration via author archives and REST API","confirmation_criteria":"Confirmed when author archive redirects expose usernames or REST API returns user objects","severity":"medium","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-ajax-exposure","name":"WordPress AJAX Action Exposure","type":"active","description":"## Description\nProbes for commonly vulnerable WordPress AJAX actions registered via\nwp_ajax_nopriv_* that should not be accessible to unauthenticated users.\nThese are among the most frequently exploited WordPress plugin vulnerabilities.\n\n## Notes\n- Runs once per host\n- Tests known vulnerable AJAX action names from popular plugins\n- Sends POST requests to /wp-admin/admin-ajax.php with action parameter\n- Validates responses to distinguish real handlers from WordPress default \"0\" response\n- Does not attempt exploitation, only confirms action handler existence\n\n## References\n- https://developer.wordpress.org/plugins/javascript/ajax/\n- https://www.wordfence.com/threat-intel/vulnerabilities","short_description":"Detects publicly accessible WordPress AJAX actions from plugins with known vulnerabilities","confirmation_criteria":"Confirmed when admin-ajax.php returns a non-default response for a known vulnerable action name","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"drupal-misconfig","name":"Drupal Misconfiguration","type":"active","description":"## Description\nProbes for Drupal-specific files and endpoints that should not be publicly\naccessible: settings.php source disclosure, services.yml, update.php, install.php,\nauthorize.php, CHANGELOG.txt, config sync directory, Twig debug output, public\nfiles directory listing, and development services.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Covers both Drupal 7 and Drupal 8+ paths\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://www.drupal.org/docs/administering-a-drupal-site/security-in-drupal/securing-your-site\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Drupal configuration files, update scripts, installer, debug settings, and directory listings","confirmation_criteria":"Confirmed when probed Drupal files return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"drupal-user-enum","name":"Drupal User Enumeration","type":"active","description":"## Description\nTests for Drupal user enumeration through two vectors:\n1. User profile paths: /user/1 through /user/5, checking for redirects to /users/\n2. JSON:API user listing: /jsonapi/user/user returns user objects anonymously\n\nEnumerated usernames can be used for password brute-force attacks.\n\n## Notes\n- Runs once per host\n- Tests user IDs 1 through 5\n- Checks JSON:API endpoint for anonymous user data access\n- Non-destructive: only performs GET requests\n\n## References\n- https://www.drupal.org/docs/security-in-drupal\n- https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module","short_description":"Detects Drupal user enumeration via user profile paths and JSON:API","confirmation_criteria":"Confirmed when user profile paths expose usernames or JSON:API returns user objects","severity":"medium","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"joomla-misconfig","name":"Joomla Misconfiguration","type":"active","description":"## Description\nProbes for Joomla-specific files and endpoints that should not be publicly\naccessible: configuration.php backups, exposed log and temp directories,\nAkeeba backup archives, debug mode artifacts, com_ajax information disclosure,\nand composer metadata files.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Checks both frontend and administrator paths\n\n## References\n- https://docs.joomla.org/Security_Checklist\n- https://developer.joomla.org/security-centre.html","short_description":"Detects exposed Joomla configuration backups, log/temp directories, backup archives, and debug settings","confirmation_criteria":"Confirmed when probed Joomla files return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"joomla-user-enum","name":"Joomla User Enumeration","type":"active","description":"## Description\nTests for Joomla user enumeration and admin exposure through multiple vectors:\n1. Registration form: accessible /index.php?option=com_users&view=registration\n2. Web Services API (J4+): /api/index.php/v1/users returns user data\n3. Administrator login: /administrator/ publicly accessible without WAF/IP restrictions\n\n## Notes\n- Runs once per host\n- Tests registration form accessibility and API user listing\n- Checks administrator login exposure\n- Non-destructive: only performs GET requests\n\n## References\n- https://docs.joomla.org/Security_Checklist\n- https://developer.joomla.org/security-centre.html","short_description":"Detects Joomla user enumeration via registration form, API endpoints, and admin login exposure","confirmation_criteria":"Confirmed when user registration form is accessible, API exposes user data, or admin login is unprotected","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cms-installer-exposure","name":"CMS Installer Exposure","type":"active","description":"## Description\nProbes for exposed CMS installation and setup wizards that should not be\naccessible in production deployments. Covers WordPress, Drupal, and Joomla\ninstaller endpoints. An accessible installer can allow an attacker to\nre-install or reconfigure the CMS.\n\n## Notes\n- Runs once per host\n- Checks WordPress /wp-admin/install.php, Drupal /install.php and /core/install.php, Joomla /installation/index.php\n- Validates responses with CMS-specific content markers\n- Fingerprints 404 to avoid false positives\n\n## References\n- https://developer.wordpress.org/advanced-administration/before-install/howto-install/\n- https://www.drupal.org/docs/getting-started/installing-drupal\n- https://docs.joomla.org/Installing_Joomla","short_description":"Detects exposed CMS installation wizards for WordPress, Drupal, and Joomla","confirmation_criteria":"Confirmed when installer endpoints return 200 with installation wizard content markers","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-misconfig","name":"Firebase Misconfiguration","type":"active","description":"## Description\nProbes for Firebase-specific files and endpoints that should not be publicly\naccessible: project configuration, security rules, runtime config, service\naccount keys, and mobile config files.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Checks /__/firebase/init.json for project config exposure\n- Probes for security rules files (firestore.rules, storage.rules, database.rules.json)\n- Detects exposed service account keys and runtime configuration\n- Non-destructive: all probes are read-only GET requests\n\n## References\n- https://firebase.google.com/docs/hosting/reserved-urls\n- https://firebase.google.com/docs/rules\n- https://firebase.google.com/docs/admin/setup","short_description":"Detects exposed Firebase configuration, security rules, and credential files","confirmation_criteria":"Confirmed when probed Firebase files return 200 with expected content markers (Firebase config keys, rules syntax, service account fields)","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-rtdb-exposure","name":"Firebase RTDB Exposure","type":"active","description":"## Description\nExtracts Firebase Realtime Database URLs from crawled responses and probes\nthem for public read access. Tests root-level access and common subpaths\nthat often contain sensitive data.\n\n## Notes\n- Extracts databaseURL from Firebase config in HTML/JS responses\n- Probes root with shallow=true for efficient detection\n- Tests common subpaths: users, config, admin, tokens, etc.\n- Non-destructive: all probes are read-only GET requests\n- Scans leaked data for embedded secrets (JWT, API keys)\n- Deduplicates by database URL to avoid redundant probing\n\n## References\n- https://firebase.google.com/docs/database/rest/start\n- https://firebase.google.com/docs/database/security","short_description":"Detects publicly readable Firebase Realtime Database instances","confirmation_criteria":"Confirmed when Firebase RTDB REST endpoint returns HTTP 200 with JSON data instead of permission denied","severity":"critical","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-storage-exposure","name":"Firebase Storage Exposure","type":"active","description":"## Description\nExtracts Firebase Storage bucket names from crawled responses and probes\nthem for public listing and access via the Firebase Storage REST API\nand Google Cloud Storage endpoints.\n\n## Notes\n- Extracts storageBucket from Firebase config in HTML/JS responses\n- Tests object listing via Firebase Storage REST API\n- Probes common prefixes: users/, uploads/, exports/, backups/\n- Tests Google Cloud Storage endpoint for alternative public access\n- Non-destructive: all probes are read-only GET requests\n- Deduplicates by bucket name to avoid redundant probing\n\n## References\n- https://firebase.google.com/docs/storage/web/start\n- https://firebase.google.com/docs/storage/security","short_description":"Detects publicly accessible Firebase Cloud Storage buckets","confirmation_criteria":"Confirmed when Firebase Storage listing endpoint returns HTTP 200 with items or prefixes in JSON response","severity":"high","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-auth-misconfig","name":"Firebase Auth Misconfiguration","type":"active","description":"## Description\nExtracts Firebase API keys from crawled responses and probes the Identity\nToolkit API for authentication misconfigurations including anonymous signup,\nemail enumeration, unrestricted API keys, and weak password policies.\n\n## Notes\n- Extracts apiKey from Firebase config in HTML/JS responses\n- Tests anonymous authentication (signUp without email/password)\n- Tests email enumeration via signInWithPassword error differentiation\n- Tests unrestricted API key usage from scanner origin\n- Cleans up any test accounts created during scanning\n- Deduplicates by API key to avoid redundant probing\n\n## References\n- https://firebase.google.com/docs/auth/web/start\n- https://cloud.google.com/identity-platform/docs/reference/rest","short_description":"Detects Firebase Authentication misconfigurations via Identity Toolkit probing","confirmation_criteria":"Confirmed when Identity Toolkit endpoints respond with auth tokens or distinguishable error codes indicating misconfiguration","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-functions-exposure","name":"Firebase Functions Exposure","type":"active","description":"## Description\nExtracts Cloud Functions URLs from crawled responses and probes them for\nunauthenticated access and verbose error leakage.\n\n## Notes\n- Extracts cloudfunctions.net URLs from HTML/JS responses\n- Parses firebase.json hosting rewrites if available to discover function routes\n- Probes discovered functions without authentication\n- Tests for verbose error/stack trace leakage with malformed input\n- Non-destructive: uses GET and safe POST probes only\n- Deduplicates by function URL to avoid redundant probing\n\n## References\n- https://firebase.google.com/docs/functions/http-events\n- https://firebase.google.com/docs/hosting/cloud-functions","short_description":"Detects unauthenticated Firebase Cloud Functions and verbose error leakage","confirmation_criteria":"Confirmed when Cloud Function endpoints respond with business data without authentication or leak stack traces","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"php-debug-exposure","name":"PHP Debug Exposure","type":"active","description":"## Description\nProbes for PHP-specific debug and administration endpoints that should not be\npublicly accessible: phpinfo() pages at common paths, PHP-FPM status/ping\nendpoints, and phpMyAdmin installations.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Complements sensitive_file_discovery with additional PHP-specific paths\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://www.php.net/manual/en/function.phpinfo.php\n- https://www.php.net/manual/en/fpm.status.php\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed phpinfo pages, PHP-FPM status endpoints, and phpMyAdmin instances","confirmation_criteria":"Confirmed when probed PHP debug endpoints return 200 with expected content markers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"php-source-disclosure","name":"PHP Source Disclosure","type":"active","description":"## Description\nProbes for PHP source code disclosure caused by misconfigured web servers: .phps\nhighlight handlers that expose syntax-highlighted source, alternate PHP extensions\n(.phtml, .php5, .php7) that may serve source as plaintext, and PHP files served\nas static content due to handler misconfiguration.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with PHP source code markers\n- Detects both highlighted source and raw PHP code exposure\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://www.php.net/manual/en/security.hiding.php\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects PHP source code disclosure via .phps handlers, misconfigured extensions, and static file serving","confirmation_criteria":"Confirmed when probed endpoints return PHP source code markers in the response body","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"php-composer-exposure","name":"PHP Composer Exposure","type":"active","description":"## Description\nProbes for Composer dependency management artifacts that should not be publicly\naccessible: composer.json and composer.lock manifests revealing exact dependency\nversions, vendor directory contents, Composer installed metadata, and PHPUnit\ndev endpoint that may allow remote code execution.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- PHPUnit eval-stdin.php is a known RCE vector in vulnerable versions\n\n## References\n- https://getcomposer.org/doc/\n- https://blog.packagist.com/composer-lock-security/\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Composer manifests, vendor directory, and PHPUnit dev endpoints","confirmation_criteria":"Confirmed when probed Composer artifacts return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"php-framework-debug","name":"PHP Framework Debug Exposure","type":"active","description":"## Description\nProbes for debug and development endpoints specific to PHP frameworks beyond\nLaravel and Symfony: Yii debug module and Gii code generator, CodeIgniter\nuser guide and profiler output, CakePHP debug kit, and common PHP framework\ndebug patterns.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Covers Yii, CodeIgniter, CakePHP, and Slim frameworks\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://www.yiiframework.com/doc/guide/2.0/en/tool-debugger\n- https://codeigniter.com/user_guide/\n- https://book.cakephp.org/4/en/debug-kit.html\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed debug endpoints for Yii, CodeIgniter, CakePHP, and other PHP frameworks","confirmation_criteria":"Confirmed when probed framework debug endpoints return 200 with expected content markers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"php-path-info-misconfig","name":"PHP PATH_INFO Misconfiguration","type":"active","description":"## Description\nTests for PHP-FPM/CGI PATH_INFO routing misconfiguration (cgi.fix_pathinfo=1)\nwhere requests to non-existent PHP scripts with PATH_INFO are routed to a\ndifferent script. This can enable authorization bypass or unintended script\nexecution by appending arbitrary paths to valid PHP endpoints.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Sends requests to deliberately invalid script paths\n- Compares responses to establish if PATH_INFO rewriting is active\n- Low false positive rate due to multi-step validation\n\n## References\n- https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#passing-uncontrolled-requests-to-php\n- https://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects cgi.fix_pathinfo routing ambiguity allowing script path manipulation","confirmation_criteria":"Confirmed when requests to non-existent PHP scripts with PATH_INFO return valid responses instead of 404","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-misconfig","name":"Laravel Misconfiguration","type":"active","description":"## Description\nProbes for Laravel framework-specific misconfigurations: debug mode enabled with\nIgnition/Whoops error pages, exposed debugbar endpoints leaking SQL queries and\nroutes, accessible application logs with stack traces and secrets, and exposed\nTelescope debugging dashboard.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Debug mode detection triggers a deliberate error to check for Ignition/Whoops\n\n## References\n- https://laravel.com/docs/configuration\n- https://flareapp.io/docs/ignition-for-laravel/introduction\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects Laravel debug mode, exposed debugbar, application logs, and configuration leaks","confirmation_criteria":"Confirmed when probed Laravel endpoints return 200 with expected framework-specific markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-ignition-rce","name":"Laravel Ignition RCE","type":"active","description":"## Description\nProbes for exposed Laravel Ignition debug endpoints (/_ignition/health-check,\n/_ignition/execute-solution, /_ignition/scripts/*, /_ignition/styles/*) and\nflags potential CVE-2021-3129 RCE candidates when version evidence indicates\nfacade/ignition < 2.5.2 or Laravel < 8.4.2.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Does NOT attempt exploitation; reports as candidate with prerequisites\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://nvd.nist.gov/vuln/detail/CVE-2021-3129\n- https://www.ambionics.io/blog/laravel-debug-rce\n- https://flareapp.io/docs/ignition-for-laravel/introduction","short_description":"Detects exposed Ignition endpoints and flags CVE-2021-3129 RCE candidates","confirmation_criteria":"Confirmed when Ignition endpoints are reachable and return expected framework-specific markers","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-devtool-exposure","name":"Laravel Developer Tool Exposure","type":"active","description":"## Description\nProbes for exposed Laravel developer tools that should not be accessible in\nproduction: Web Tinker (interactive PHP console), Clockwork (profiling tool),\nLaravel Pulse (monitoring dashboard), and Log Viewer. These tools can expose\nsensitive data such as SQL queries, routes, timings, logs, and may allow\narbitrary code execution.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Web Tinker is critical severity due to potential code execution\n\n## References\n- https://github.com/spatie/laravel-web-tinker\n- https://github.com/itsgoingd/clockwork\n- https://laravel.com/docs/pulse\n- https://github.com/opcodesio/log-viewer","short_description":"Detects exposed Laravel developer tools: Web Tinker, Clockwork, Pulse, and Log Viewer","confirmation_criteria":"Confirmed when developer tool endpoints return 200 with expected framework-specific markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-sensitive-files","name":"Laravel Sensitive Files","type":"active","description":"## Description\nProbes for Laravel-specific sensitive files not covered by generic file discovery\nmodules: PHPUnit configuration (phpunit.xml), exposed SQLite databases, storage\nframework internals (sessions, views, cache), vendor PHPUnit eval-stdin.php\n(CVE-2017-9841), and wrong document root indicators (artisan, server.php,\nroutes/web.php, config/app.php, bootstrap/app.php).\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Complements the generic sensitive_file_discovery and php_composer_exposure modules\n- Validates responses with content markers and anti-markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Wrong document root detection is critical severity\n\n## References\n- https://laravel.com/docs/structure\n- https://nvd.nist.gov/vuln/detail/CVE-2017-9841\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects Laravel-specific sensitive files: PHPUnit config, SQLite DB, storage internals, eval-stdin, and wrong document root","confirmation_criteria":"Confirmed when probed Laravel file paths return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-admin-exposure","name":"Laravel Admin Exposure","type":"active","description":"## Description\nProbes for unauthenticated access to Laravel admin panels (Nova, Filament,\nBackpack, Voyager), API documentation endpoints (Swagger UI, L5-Swagger,\nScramble, OpenAPI specs), and GraphQL endpoints with introspection enabled.\nThese surfaces increase attack surface and may expose sensitive data or\nadmin functionality.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Admin panels reported as high severity; API docs as informational/low\n\n## References\n- https://nova.laravel.com/docs\n- https://filamentphp.com/docs\n- https://lighthouse-php.com/master/security/authentication.html","short_description":"Detects unauthenticated access to Laravel admin panels, API documentation, and GraphQL endpoints","confirmation_criteria":"Confirmed when admin or documentation endpoints return 200 with expected framework-specific markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"symfony-misconfig","name":"Symfony Misconfiguration","type":"active","description":"## Description\nProbes for Symfony framework-specific misconfigurations: web profiler/debug toolbar\naccessible in production, dev front controller (app_dev.php) exposed, debug logs,\nand exposed configuration files.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Checks for X-Debug-Token and X-Debug-Token-Link response headers\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://symfony.com/doc/current/reference/configuration/framework.html\n- https://symfony.com/doc/current/profiler.html\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Symfony profiler, debug toolbar, dev front controller, and configuration leaks","confirmation_criteria":"Confirmed when probed Symfony endpoints return 200 with expected framework-specific markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"magento-misconfig","name":"Magento Misconfiguration","type":"active","description":"## Description\nProbes for Magento-specific files and endpoints that should not be publicly\naccessible: setup wizard, downloader interface, version disclosure files,\nexposed configuration, and admin panel paths.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Covers both Magento 1.x and Magento 2.x paths\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://experienceleague.adobe.com/docs/commerce-operations/configuration-guide/overview.html\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Magento setup wizard, downloader, version files, and admin panels","confirmation_criteria":"Confirmed when probed Magento endpoints return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-storage-listing","name":"Cloud Storage Listing","type":"active","description":"## Description\nTests cloud storage endpoints for public listing access. Attempts S3 ListObjectsV2,\nAzure container blob listing, and Azure account container listing requests.\n\n## Notes\n- Only runs on hosts identified as cloud storage endpoints\n- S3: GET /?list-type=2 checking for ListBucketResult\n- Azure: GET /?restype=container&comp=list checking for Blobs\n- Azure: GET /?comp=list checking for Containers\n- Runs once per host with deduplication\n\n## References\n- https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html\n- https://learn.microsoft.com/en-us/rest/api/storageservices/list-blobs","short_description":"Detects publicly listable S3 buckets and Azure containers","confirmation_criteria":"Confirmed when storage endpoint returns XML listing response with object/blob entries","severity":"high","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-bucket-takeover","name":"Cloud Bucket Takeover","type":"active","description":"## Description\nTests cloud storage endpoints for bucket/container not-found conditions that indicate\npotential subdomain takeover. Checks for S3 NoSuchBucket, GCS bucket-not-found,\nand Azure ContainerNotFound errors.\n\n## Notes\n- Only runs on hosts identified as cloud storage endpoints\n- GET / and check for specific not-found error patterns\n- Takeover risk exists when DNS points to storage but bucket is unclaimed\n- Runs once per host with deduplication\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/10-Test_for_Subdomain_Takeover\n- https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html","short_description":"Detects dangling cloud storage buckets vulnerable to takeover","confirmation_criteria":"Confirmed when cloud storage endpoint returns bucket/container not-found error while DNS still resolves","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-origin-bypass","name":"Cloud Origin Bypass","type":"active","description":"## Description\nDetects when cloud storage origins are directly reachable with weaker security controls\nthan the CDN/WAF layer. Identifies CDN presence from headers, extracts origin storage\nURLs from response body, and compares security headers between CDN and origin.\n\n## Notes\n- Step 1: Detect CDN from CF-Ray, X-Cache, Via, X-Amz-Cf-Id, X-Served-By headers\n- Step 2: Extract origin storage URLs from response body\n- Step 3: Fetch origin directly and compare security headers\n- Flags when origin is reachable with weaker controls (missing CSP, XFO, XCTO, HSTS)\n- Runs once per host with deduplication\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/\n- https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html","short_description":"Detects direct access to cloud storage origins bypassing CDN security controls","confirmation_criteria":"Confirmed when cloud storage origin is directly reachable with fewer security headers than the CDN-fronted endpoint","severity":"medium","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-public-read","name":"Cloud Public Read","type":"active","description":"## Description\nTests cloud storage endpoints for publicly readable sensitive directories and files.\nProbes common paths like /uploads/, /backups/, /data/, /logs/, /config/ and verifies\nreal content is returned (not error pages).\n\n## Notes\n- Only runs on hosts identified as cloud storage endpoints\n- HEAD then GET common sensitive paths\n- Verifies responses contain real content (body length > 50, not error pages)\n- Runs once per host with deduplication\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/\n- https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-overview.html","short_description":"Detects publicly readable sensitive paths on cloud storage endpoints","confirmation_criteria":"Confirmed when cloud storage endpoint returns real content for sensitive paths without authentication","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-misconfig","name":"ASP.NET Misconfiguration","type":"active","description":"## Description\nProbes for exposed ASP.NET diagnostic and debug endpoints that should not be\naccessible in production. Covers trace.axd, ELMAH, Glimpse, MiniProfiler,\nHangfire dashboard, SignalR endpoints, and Yellow Screen of Death (YSoD)\nverbose error detection.\n\n## Notes\n- Runs once per host\n- Probes diagnostic endpoints with content marker validation\n- Tests for verbose error pages by triggering error conditions\n- Fingerprints 404 to avoid false positives\n\n## References\n- https://learn.microsoft.com/en-us/aspnet/core/fundamentals/error-handling\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/01-Test_Network_Infrastructure_Configuration","short_description":"Detects ASP.NET/IIS misconfigurations including exposed diagnostics, debug endpoints, and verbose errors","confirmation_criteria":"Confirmed when diagnostic endpoints return 200 with expected content markers or verbose error information is disclosed","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-sensitive-files","name":"ASP.NET Sensitive Files","type":"active","description":"## Description\nDiscovers ASP.NET-specific sensitive files and directories exposed on the web\nserver. Covers web.config and its backups/transforms, appsettings.json files,\nconnection string configs, Global.asax, App_Data/bin directories, NuGet configs,\ncross-domain policy files, and classic ASP include files.\n\n## Notes\n- Runs once per unique host\n- Validates responses with content marker matching\n- Fingerprints 404 responses to avoid false positives from custom error pages\n- Anti-markers prevent false positives from HTML error pages\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information\n- https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/","short_description":"Probes for exposed ASP.NET configuration files, backups, and sensitive directories","confirmation_criteria":"Confirmed when sensitive file paths return 200 with expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-viewstate-scan","name":"ASP.NET ViewState Scan","type":"active","description":"## Description\nActively tests ASP.NET ViewState security by tampering with ViewState MAC\nvalidation, testing event validation bypass, detecting cookieless session\ntokens in URLs, and checking for verbose error disclosure on ViewState\ntampering.\n\n## Notes\n- Runs once per host\n- Finds pages with __VIEWSTATE forms and tests MAC validation\n- Tampers ViewState bytes and POSTs back to detect disabled MAC\n- Submits forged __EVENTTARGET to detect disabled event validation\n- Scans for cookieless session URL patterns (S(...)/)\n- Checks if ViewState errors reveal stack traces\n\n## References\n- https://learn.microsoft.com/en-us/previous-versions/aspnet/bb386448(v=vs.100)\n- https://owasp.org/www-community/attacks/Cross-Site_Request_Forgery_(CSRF)","short_description":"Tests for ASP.NET ViewState MAC disabled, event validation bypass, and cookieless sessions","confirmation_criteria":"Confirmed when ViewState MAC is disabled (tampered ViewState accepted) or event validation can be bypassed","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-service-exposure","name":"ASP.NET Service Exposure","type":"active","description":"## Description\nProbes for exposed ASP.NET service endpoints. For .asmx URLs in traffic, probes\n?WSDL and ?disco for WSDL disclosure. For .svc URLs, probes ?wsdl and sends\nmalformed SOAP to detect WCF detailed faults. Also probes common paths for\nOData metadata and legacy service endpoints.\n\n## Notes\n- Runs once per host\n- Traffic-aware: inspects original request URL for .asmx/.svc extensions\n- Probes OData $metadata and common service paths\n- Tests WCF for verbose fault disclosure (includeExceptionDetailInFaults)\n- Fingerprints 404 to avoid false positives\n\n## References\n- https://learn.microsoft.com/en-us/dotnet/framework/wcf/\n- https://learn.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/","short_description":"Detects exposed ASP.NET service endpoints including ASMX, WCF, OData, and legacy service paths","confirmation_criteria":"Confirmed when service endpoints return WSDL definitions, OData metadata, or verbose fault details","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-blazor-exposure","name":"ASP.NET Blazor Exposure","type":"active","description":"## Description\nProbes for exposed Blazor WebAssembly and Blazor Server endpoints. Blazor WASM\nships .NET DLL assemblies to the browser; if the boot manifest is accessible,\nattackers can download and decompile all application assemblies to recover source\ncode, API keys, and business logic. Blazor Server exposes a SignalR hub that\nreveals real-time communication infrastructure.\n\n## Notes\n- Runs once per host\n- Probes boot manifest, runtime JS, and SignalR negotiate endpoint\n- If boot manifest found, extracts assembly names as evidence\n- Fingerprints 404 to avoid false positives\n\n## References\n- https://learn.microsoft.com/en-us/aspnet/core/blazor/\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/01-Test_Network_Infrastructure_Configuration","short_description":"Detects exposed Blazor WebAssembly assemblies and Blazor Server endpoints","confirmation_criteria":"Confirmed when Blazor boot manifest or framework DLLs are publicly accessible","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-health-exposure","name":"ASP.NET Health Endpoint Exposure","type":"active","description":"## Description\nProbes for exposed ASP.NET Core health check and monitoring endpoints that can\nreveal infrastructure details including database connectivity status, external\nservice dependencies, memory and CPU metrics, and deployment configuration.\nCovers standard health check endpoints, Health Checks UI dashboard, Prometheus\nmetrics, and development tooling left enabled in production.\n\n## Notes\n- Runs once per host\n- Probes health check, monitoring, and dev-tooling endpoints\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n\n## References\n- https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/01-Test_Network_Infrastructure_Configuration","short_description":"Detects exposed ASP.NET health checks, monitoring dashboards, and metrics endpoints","confirmation_criteria":"Confirmed when health or monitoring endpoints return detailed infrastructure information without authentication","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-identity-probe","name":"ASP.NET Identity Probe","type":"active","description":"## Description\nProbes for exposed ASP.NET Identity scaffolded pages, IdentityServer/Duende OIDC\ndiscovery documents, and authentication-related misconfigurations. Exposed OIDC\ndiscovery documents reveal token endpoints, supported scopes, and grant types.\nOpen registration endpoints may allow unauthorized account creation. Scaffolded\nIdentity UI pages confirm the authentication framework in use.\n\n## Notes\n- Runs once per host\n- Probes Identity UI, OIDC discovery, and token endpoints\n- Extracts OIDC metadata (scopes, grant types, endpoints) as evidence\n- Fingerprints 404 to avoid false positives\n\n## References\n- https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity\n- https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization\n- https://openid.net/specs/openid-connect-discovery-1_0.html","short_description":"Detects exposed ASP.NET Identity endpoints, IdentityServer discovery, and authentication misconfigurations","confirmation_criteria":"Confirmed when Identity endpoints or OIDC discovery documents are publicly accessible","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-h2-console-exposure","name":"Spring H2 Console Exposure","type":"active","description":"## Description\nProbes for exposed H2 database web consoles that are commonly enabled during\ndevelopment and accidentally left accessible in production Spring Boot deployments.\nThe H2 console provides direct database access, enabling SQL execution, data\nexfiltration, and potential remote code execution.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Checks common H2 console paths with content markers\n- Fingerprints 404 responses to reduce false positives\n- H2 console exposure in production is critical severity\n\n## References\n- https://www.h2database.com/html/tutorial.html\n- https://docs.spring.io/spring-boot/docs/current/reference/html/data.html#data.sql.h2-web-console","short_description":"Detects exposed H2 database web consoles commonly left enabled in Spring Boot applications","confirmation_criteria":"Confirmed when H2 console login page or interface is accessible without authentication","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-jolokia-exposure","name":"Spring Jolokia Exposure","type":"active","description":"## Description\nProbes for exposed Jolokia endpoints that provide HTTP/JSON access to JMX\n(Java Management Extensions). Jolokia can disclose sensitive runtime attributes,\nMBean operations, and in some configurations enable dangerous operations like\nremote code execution through MBean invocation.\n\n## Notes\n- Runs once per host\n- Checks multiple Jolokia paths including actuator-prefixed variants\n- Validates responses using Jolokia-specific JSON markers\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://jolokia.org/reference/html/index.html\n- https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html","short_description":"Detects exposed Jolokia JMX endpoints providing HTTP access to Java Management Extensions","confirmation_criteria":"Confirmed when Jolokia endpoints return valid JSON responses with agent information or MBean data","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-debug-exposure","name":"Spring Debug Exposure","type":"active","description":"## Description\nProbes for Spring Boot debug endpoints and verbose error page configurations.\nDetects Whitelabel error pages with stack traces, Spring Boot DevTools remote\nendpoints, and debug parameter behaviors that reveal internal application details\nincluding package names, class paths, library versions, and configuration.\n\n## Notes\n- Runs once per host\n- Checks Whitelabel error page with trace parameter\n- Probes Spring Boot DevTools remote restart endpoint\n- Tests for debug parameter behaviors\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://docs.spring.io/spring-boot/docs/current/reference/html/web.html#web.servlet.spring-mvc.error-handling\n- https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools","short_description":"Detects Spring Boot debug endpoints, Whitelabel error pages, and verbose stack trace disclosure","confirmation_criteria":"Confirmed when debug endpoints or verbose error pages reveal internal application details","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-cloud-config-exposure","name":"Spring Cloud Config Exposure","type":"active","description":"## Description\nProbes for exposed Spring Cloud Config Server endpoints that serve application\nconfiguration for various environments. These endpoints can leak database\ncredentials, API keys, encryption keys, and internal service URLs. Also checks\nfor exposed encrypt/decrypt endpoints that could be abused for cryptographic\noperations.\n\n## Notes\n- Runs once per host\n- Checks common config patterns: /{app}/{profile} and /{app}/{profile}/{label}\n- Probes encrypt and decrypt endpoints\n- Validates responses using Spring Cloud Config JSON markers\n\n## References\n- https://docs.spring.io/spring-cloud-config/docs/current/reference/html/\n- https://cloud.spring.io/spring-cloud-config/reference/html/#_security","short_description":"Detects exposed Spring Cloud Config Server endpoints leaking application configuration and secrets","confirmation_criteria":"Confirmed when config server endpoints return application configuration with property sources","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-gateway-exposure","name":"Spring Gateway Exposure","type":"active","description":"## Description\nProbes for exposed Spring Cloud Gateway actuator endpoints that reveal routing\nconfiguration, global filters, and route filter definitions. Exposed gateway\nroutes can disclose internal service topology, backend URLs, and rate limiting\nconfiguration. Write-enabled gateway endpoints could allow route manipulation\nfor traffic steering and SSRF-style attacks.\n\n## Notes\n- Runs once per host\n- Checks gateway-specific actuator paths\n- Validates responses using gateway JSON markers\n- Read-only probing (does not attempt route modification)\n\n## References\n- https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#actuator-api\n- https://cloud.spring.io/spring-cloud-gateway/reference/html/","short_description":"Detects exposed Spring Cloud Gateway actuator endpoints revealing routes and filters","confirmation_criteria":"Confirmed when gateway actuator endpoints return route or filter configuration data","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-data-rest-exposure","name":"Spring Data REST Exposure","type":"active","description":"## Description\nProbes for Spring Data REST auto-exposed repository endpoints. Spring Data REST\nautomatically creates RESTful endpoints for JPA repositories, which may expose\nentities without proper authorization. The module detects HAL-style API roots\nand ALPS profile endpoints that reveal the full data model.\n\n## Notes\n- Runs once per host\n- Checks for HAL/HATEOAS discovery responses\n- Detects ALPS profile metadata endpoints\n- Validates using Spring Data REST JSON markers\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://docs.spring.io/spring-data/rest/docs/current/reference/html/\n- https://spring.io/projects/spring-data-rest","short_description":"Detects auto-exposed Spring Data REST repository endpoints with HAL/HATEOAS discovery","confirmation_criteria":"Confirmed when HAL-style API root or ALPS profile endpoint returns Spring Data REST repository links","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-boot-admin-exposure","name":"Spring Boot Admin Exposure","type":"active","description":"## Description\nProbes for exposed Spring Boot Admin (SBA) dashboards. SBA aggregates actuator\ndata from multiple registered Spring Boot services, providing a centralized\nview of health, metrics, configuration, and environment details. An exposed\nSBA dashboard can enable broad infrastructure compromise through access to\nmultiple services' actuator endpoints.\n\n## Notes\n- Runs once per host\n- Checks common SBA paths: /admin, /boot-admin, /sba, /springbootadmin\n- Validates using SBA-specific UI markers\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://codecentric.github.io/spring-boot-admin/current/\n- https://github.com/codecentric/spring-boot-admin","short_description":"Detects exposed Spring Boot Admin dashboards providing centralized access to actuator data","confirmation_criteria":"Confirmed when Spring Boot Admin dashboard UI or API is accessible without authentication","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"java-sensitive-files","name":"Java Sensitive Files","type":"active","description":"## Description\nProbes for Java/Spring-specific sensitive files not covered by generic file\ndiscovery modules: application.properties/yml, WEB-INF/web.xml, META-INF\nmanifests, Maven/Gradle build files, and backup configuration files that\nare commonly exposed through misconfigured static file serving.\n\n## Notes\n- Runs once per host\n- Checks Java-specific config, deployment, and build artifact paths\n- Validates responses with content markers and anti-markers\n- Fingerprints 404 responses to detect custom error pages\n- Complements the generic sensitive_file_discovery module\n\n## References\n- https://tomcat.apache.org/tomcat-10.1-doc/security-howto.html\n- https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html","short_description":"Detects Java-specific sensitive files: application configs, WEB-INF, META-INF, and build artifacts","confirmation_criteria":"Confirmed when Java-specific sensitive files return expected content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"java-appserver-console","name":"Java App Server Console","type":"active","description":"## Description\nProbes for exposed administration consoles of enterprise Java application servers\nincluding WildFly/JBoss, Oracle WebLogic, and GlassFish/Payara. These admin\nconsoles are high-value targets as they enable application deployment, server\nconfiguration, and often have known CVEs. Default or weak credentials can lead\nto full server compromise.\n\n## Notes\n- Runs once per host\n- Checks server-specific admin console paths\n- Detects both accessible consoles and authentication challenges\n- Validates using server-specific HTML and header markers\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://docs.wildfly.org/\n- https://docs.oracle.com/en/middleware/standalone/weblogic-server/\n- https://glassfish.org/documentation","short_description":"Detects exposed admin consoles for WildFly/JBoss, WebLogic, and GlassFish/Payara","confirmation_criteria":"Confirmed when app server admin console page or login form is accessible","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"tomcat-manager-exposure","name":"Tomcat Manager Exposure","type":"active","description":"## Description\nProbes for exposed Apache Tomcat Manager and Host Manager web interfaces. These\nadministrative interfaces allow deploying WAR files, managing virtual hosts,\nand viewing server status. Default or weak credentials on these interfaces\ncan lead to complete server compromise through malicious WAR deployment.\n\n## Notes\n- Runs once per host\n- Checks manager, host-manager, and status pages\n- Detects both login challenges (401 with WWW-Authenticate) and accessible pages\n- Also detects Tomcat default pages and example servlets\n- Fingerprints 404 responses to reduce false positives\n\n## References\n- https://tomcat.apache.org/tomcat-10.1-doc/manager-howto.html\n- https://tomcat.apache.org/tomcat-10.1-doc/security-howto.html","short_description":"Detects exposed Apache Tomcat Manager and Host Manager interfaces","confirmation_criteria":"Confirmed when Tomcat Manager or Host Manager interface is accessible or prompts for authentication","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"struts-ognl-injection","name":"Struts OGNL Injection","type":"active","description":"## Description\nDetects Apache Struts OGNL injection vulnerabilities by injecting OGNL math expressions\ninto the Content-Type header (CVE-2017-5638 style) and into request parameters. Uses safe\narithmetic-based detection to confirm expression evaluation without executing commands.\n\n## Notes\n- Tests Content-Type header injection for CVE-2017-5638 variants\n- Tests parameter-level OGNL expression injection (${} and %{} syntax)\n- Uses math expressions (multiplication) to confirm evaluation\n- Deduplication via DiskSet (per-request) and RHM (per-insertion-point)\n\n## References\n- https://nvd.nist.gov/vuln/detail/CVE-2017-5638\n- https://cwiki.apache.org/confluence/display/WW/S2-045\n- https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection","short_description":"Detects Apache Struts OGNL injection via Content-Type and parameter payloads","confirmation_criteria":"Confirmed when injected OGNL math expression is evaluated and the computed result appears in the response body or headers","severity":"critical","confidence":"firm","scan_scope":["PER_INSERTION_POINT","PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"log4shell-probe","name":"Log4Shell Probe","type":"active","description":"## Description\nDetects Log4Shell (CVE-2021-44228) and related Log4j JNDI injection vulnerabilities by\ninjecting JNDI lookup payloads into HTTP headers and request parameters. Uses OAST\n(Out-of-band Application Security Testing) callbacks to confirm exploitation.\n\n## Notes\n- Requires an interactsh server (configured via oast settings)\n- Injects JNDI payloads into common HTTP headers (X-Forwarded-For, User-Agent, etc.)\n- Tests multiple JNDI obfuscation patterns to bypass WAF rules\n- Injects JNDI payloads into request parameters via insertion points\n- Findings arrive asynchronously via the OAST polling callback\n- Deduplication via DiskSet (per-request) and RHM (per-insertion-point)\n\n## References\n- https://nvd.nist.gov/vuln/detail/CVE-2021-44228\n- https://logging.apache.org/log4j/2.x/security.html\n- https://www.lunasec.io/docs/blog/log4j-zero-day/","short_description":"Detects Log4Shell (CVE-2021-44228) via JNDI payload injection with OAST callbacks","confirmation_criteria":"Confirmed when target server performs outbound DNS or LDAP lookup to OAST callback URL injected via JNDI expression","severity":"critical","confidence":"certain","scan_scope":["PER_INSERTION_POINT","PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ldap-injection","name":"LDAP Injection","type":"active","description":"## Description\nDetects LDAP injection vulnerabilities by injecting malformed LDAP filter expressions into\nparameters that are likely used in LDAP queries (e.g., username, search, filter). Uses both\nerror-based detection (checking for LDAP error messages in responses) and boolean-based\ndetection (comparing responses with wildcard vs. baseline).\n\n## Notes\n- Only tests parameters whose name suggests LDAP usage (username, uid, cn, filter, etc.)\n- Checks for LDAP error messages that were not present in the baseline response\n- Performs boolean-based differential analysis with wildcard injection\n- Deduplication via RHM to avoid redundant requests\n\n## References\n- https://owasp.org/www-community/attacks/LDAP_Injection\n- https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html","short_description":"Detects LDAP injection via error-based and boolean-based techniques","confirmation_criteria":"Confirmed when injected LDAP filter syntax triggers error messages or produces differential responses indicating filter manipulation","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"idor-guid","name":"IDOR GUID Predictability","type":"active","description":"## Description\nDetects Insecure Direct Object Reference (IDOR) vulnerabilities arising from predictable GUID/UUID patterns.\nUUIDv1 encodes a timestamp and MAC address, making sequential IDs guessable. This module identifies\nparameters containing UUIDv1 values, extracts their timestamps, generates time-neighbor UUIDs, and\nchecks if the application returns valid responses for those predicted identifiers.","short_description":"Detects predictable GUID patterns like UUIDv1 with extractable timestamps","confirmation_criteria":"Confirmed when a time-neighbor UUID generated from UUIDv1 timestamp extraction returns a valid (non-error) response different from the original","severity":"medium","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cache-deception","name":"Web Cache Deception","type":"active","description":"## Description\nDetects Web Cache Deception vulnerabilities where appending static file extensions (e.g., .css, .js, .png)\nto authenticated URLs causes reverse proxies or CDNs to cache sensitive responses. An attacker can trick\na victim into visiting a crafted URL, causing their authenticated response to be cached and subsequently\naccessible to the attacker.","short_description":"Detects web cache deception via path confusion with static file extensions","confirmation_criteria":"Confirmed when a path-confused request returns the same authenticated content as the original and cache indicators (Age, X-Cache, CF-Cache-Status) suggest the response was cached","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"subdomain-takeover","name":"Subdomain Takeover","type":"active","description":"## Description\nDetects subdomain takeover vulnerabilities caused by dangling DNS records (CNAME or A) pointing to\ndeprovisioned cloud services. When a service is removed but its DNS record remains, an attacker can\nclaim the same service identifier and serve malicious content under the target's domain.","short_description":"Detects dangling DNS records pointing to deprovisioned cloud services","confirmation_criteria":"Confirmed when an HTTP response from the host matches known fingerprints of unclaimed/deprovisioned cloud service pages","severity":"high","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"pdf-generation-injection","name":"PDF Generation Injection","type":"active","description":"## Description\nDetects injection vulnerabilities in server-side PDF generation endpoints. Applications using tools like\nwkhtmltopdf, Puppeteer, WeasyPrint, or Prince to convert HTML to PDF may be vulnerable to HTML/JavaScript\ninjection. Attackers can inject markup that triggers SSRF (via external resource loading), local file\nreads (via file:// protocol), or information disclosure.","short_description":"Detects HTML/JS injection into server-side PDF generation endpoints for SSRF/file read","confirmation_criteria":"Confirmed when injected HTML/JS payloads produce evidence of server-side rendering in the response (PDF markers, reflected injection artifacts, or OAST callbacks)","severity":"high","confidence":"firm","scan_scope":["PER_INSERTION_POINT"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"express-debug-probe","name":"Express Debug Probe","type":"active","description":"## Description\nActively triggers error responses in Express.js and NestJS applications to detect\nstack trace leakage and debug information exposure. When NODE_ENV is not set to\nproduction, Express and NestJS return detailed error responses including stack traces,\nfile paths, and internal module information.\n\n## Notes\n- Runs once per host\n- Probes: malformed JSON body, type-mismatch path parameters, random 404 endpoint\n- Detects NODE_ENV misconfiguration, stack trace leakage, file path disclosure\n- Fingerprints 404 to avoid false positives on custom error pages\n\n## References\n- https://expressjs.com/en/guide/error-handling.html\n- https://docs.nestjs.com/exception-filters","short_description":"Triggers error responses in Express/NestJS apps to detect stack trace and debug info leakage","confirmation_criteria":"Confirmed when an error response contains stack traces, file paths, or debug markers","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"express-trust-proxy-misconfig","name":"Express Trust Proxy Misconfiguration","type":"active","description":"## Description\nDetects Express.js trust proxy misconfiguration by sending X-Forwarded-* header variants\nand comparing responses against a baseline to identify behavioral changes.\n\nWhen Express.js has `trust proxy` enabled without proper validation, attackers can\nmanipulate X-Forwarded-Proto, X-Forwarded-Host, X-Forwarded-For, and X-Forwarded-Port\nheaders to cause protocol confusion, IP-based access control bypass, and port injection.\n\n## Notes\n- X-Forwarded-Proto can cause redirect loops or strip Secure flags from cookies\n- X-Forwarded-Host can be trusted for URL generation, leading to host-based attacks\n- X-Forwarded-For can bypass IP-based rate limiting or access controls\n- X-Forwarded-Port can inject unexpected ports into generated URLs and redirects\n- Compares each probe response against a baseline to detect behavioral changes\n\n## References\n- https://expressjs.com/en/guide/behind-proxies.html\n- https://expressjs.com/en/api.html#trust.proxy.options.table\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection","short_description":"Detects Express trust proxy misconfiguration via X-Forwarded-* header manipulation","confirmation_criteria":"Confirmed when X-Forwarded-* header manipulation causes observable behavioral changes such as redirect differences, cookie Secure flag removal, access control bypass, or port injection in generated URLs","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"express-directory-listing","name":"Express Directory Listing","type":"active","description":"## Description\nProbes for directory listing exposure in Express.js applications using serve-index\nor similar middleware. Directory listings reveal the full file inventory of static\ndirectories, potentially exposing sensitive files, backup archives, configuration\nfiles, and internal assets that should not be publicly accessible.\n\n## Notes\n- Runs once per host\n- Probes common static/upload directories: /public/, /uploads/, /static/, /assets/, /files/, /media/, /images/, /dist/\n- Detects serve-index, Nginx autoindex, and Apache autoindex markers\n- Fingerprints 404 to avoid false positives on custom error pages\n\n## References\n- https://expressjs.com/en/resources/middleware/serve-index.html\n- https://www.npmjs.com/package/serve-index","short_description":"Detects directory listing exposure via serve-index or similar middleware","confirmation_criteria":"Confirmed when a directory path responds with directory listing indicators such as serve-index markers, autoindex output, or file listing HTML","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"common-directory-listing","name":"Common Directory Listing","type":"active","description":"## Description\nProbes for directory listing exposure across common web servers including Apache,\nNginx, Microsoft IIS, Jetty, and Python SimpleHTTPServer. Directory listings reveal\nthe full file inventory of served directories, potentially exposing sensitive files,\nbackup archives, configuration files, and internal assets.\n\n## Notes\n- Runs once per host\n- Probes common directories: /, /uploads/, /files/, /sites/, /assets/, /static/, /META-INF/, /WEB-INF/, /aspnet_client/, /App_Data/\n- Detects Apache, Nginx, Python, Jetty, and IIS directory listing signatures\n- Fingerprints 404 to avoid false positives on custom error pages\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information\n- https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html","short_description":"Detects directory listing exposure on common web servers (Apache, Nginx, IIS, Jetty, Python)","confirmation_criteria":"Confirmed when a directory path responds with server-specific directory listing indicators such as Apache Index of, Nginx autoindex, IIS directory browsing, Jetty directory, or Python directory listing markers","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-info-exposure","name":"Rails Info Exposure","type":"active","description":"## Description\nProbes for Rails development-oriented endpoints that are commonly left exposed in\nproduction deployments. Checks for informational pages (/rails/info), mailer previews\n(/rails/mailers), Action Mailbox conductor UI, and health endpoints that leak metadata.\n\n## Notes\n- Sends GET requests to known Rails development endpoints\n- Fingerprints 404 responses to avoid false positives from custom error pages\n- Checks for Rails-specific content markers in response bodies\n- Reports exposed endpoints with appropriate severity levels\n\n## References\n- https://guides.rubyonrails.org/configuring.html\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Rails development and debug endpoints in production","confirmation_criteria":"Confirmed when Rails development endpoints return 200 with framework-specific content markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-sensitive-files","name":"Rails Sensitive Files","type":"active","description":"## Description\nProbes for Rails-specific sensitive files that may be exposed due to misconfigured web\nservers or containerized deployments serving the application root as static files.\nChecks for master keys, encrypted credentials, database configs, Gemfiles, logs,\nSQLite databases, and server configurations.\n\n## Notes\n- Sends GET/HEAD requests to known Rails configuration file paths\n- Uses content markers to confirm file type and reduce false positives\n- Fingerprints 404 responses to avoid custom error page false positives\n- Each finding has severity based on the sensitivity of the exposed file\n\n## References\n- https://guides.rubyonrails.org/security.html\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Rails configuration files, credentials, and artifacts","confirmation_criteria":"Confirmed when Rails configuration files are accessible and contain expected content markers","severity":"critical","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-admin-dashboard","name":"Rails Admin Dashboard","type":"active","description":"## Description\nProbes for common Rails ecosystem admin panels and background job dashboards that are\nfrequently mounted at predictable paths. Checks for Sidekiq, GoodJob, Resque, Delayed Job,\nrack-mini-profiler, ActiveAdmin, and RailsAdmin.\n\n## Notes\n- Sends GET requests to known Rails dashboard paths\n- Checks for framework-specific content markers in response bodies\n- Reports both unauthenticated and auth-gated dashboards\n- Fingerprints 404 responses to avoid false positives\n\n## References\n- https://github.com/sidekiq/sidekiq/wiki/Monitoring\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed Rails ecosystem admin panels and dashboard UIs","confirmation_criteria":"Confirmed when Rails dashboard endpoints return responses containing framework-specific UI markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-active-storage-probe","name":"Rails Active Storage Probe","type":"active","description":"## Description\nProbes for Rails Active Storage direct upload endpoints that may accept unauthenticated\nuploads, and Action Mailbox ingress endpoints that may accept unauthorized email submissions.\nAlso checks for publicly accessible Active Storage blob routes.\n\n## Notes\n- Uses OPTIONS requests for direct upload endpoint to check allowed methods\n- Probes Action Mailbox ingress paths for multiple email providers\n- Fingerprints 404 responses to avoid false positives\n\n## References\n- https://guides.rubyonrails.org/active_storage_overview.html\n- https://guides.rubyonrails.org/action_mailbox_basics.html","short_description":"Detects exposed Rails Active Storage direct upload and Action Mailbox ingress endpoints","confirmation_criteria":"Confirmed when Active Storage or Action Mailbox endpoints respond with expected behavior","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-action-mailbox-probe","name":"Rails Action Mailbox Probe","type":"active","description":"## Description\nProbes for Rails Action Mailbox ingress endpoints for multiple email service providers.\nThese endpoints receive inbound emails via HTTP and may be accessible without proper\nauthentication or provider signature validation.\n\n## Notes\n- Uses OPTIONS and POST requests to check for accessible ingress endpoints\n- Tests relay, SendGrid, Mailgun, Mandrill, and Postmark ingress paths\n- Checks for WWW-Authenticate headers indicating basic auth protection\n- Fingerprints 404 responses to avoid false positives\n\n## References\n- https://guides.rubyonrails.org/action_mailbox_basics.html\n- https://api.rubyonrails.org/classes/ActionMailbox.html","short_description":"Detects exposed Rails Action Mailbox ingress endpoints that may accept unauthorized submissions","confirmation_criteria":"Confirmed when Action Mailbox ingress endpoints respond to requests without authentication","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-spec-ingest","name":"API Spec Ingest","type":"active","description":"Probes common paths for API specification files (OpenAPI, Swagger, Postman Collections),\nparses discovered specs, and feeds the extracted endpoints back into the scanning pipeline\nas new work items. This extends attack surface coverage by automatically discovering and\nauditing API endpoints defined in specification documents.","short_description":"Discovers API specs (OpenAPI/Swagger/Postman) and ingests endpoints for scanning","confirmation_criteria":"An API specification document was found and successfully parsed. Extracted endpoints have been ingested into the scanning pipeline.","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"fastapi-docs-exposure","name":"FastAPI Docs Exposure","type":"active","description":"## Description\nProbes for exposed FastAPI interactive API documentation. FastAPI auto-generates\nSwagger UI at /docs, ReDoc at /redoc, and the OpenAPI spec at /openapi.json by\ndefault. These endpoints reveal all API routes, schemas, and parameters, increasing\nthe attack surface for further exploitation.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Reported as low severity (information disclosure)\n\n## References\n- https://fastapi.tiangolo.com/tutorial/metadata/","short_description":"Probes for exposed FastAPI interactive API documentation endpoints","confirmation_criteria":"Confirmed when documentation endpoints return 200 with expected FastAPI-specific markers","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"fastapi-auth-inconsistency","name":"FastAPI Auth Inconsistency","type":"active","description":"## Description\nFetches the FastAPI OpenAPI schema from /openapi.json and analyzes it for\nauthentication inconsistencies. Identifies operations that lack security\nrequirements, either because they explicitly opt out of global security\nor because no security is defined at any level.\n\n## Notes\n- Runs once per host\n- Parses /openapi.json for OpenAPI spec\n- Flags operations under /api prefix without security requirements\n- Optionally verifies by calling endpoints without auth\n- FA-02: FastAPI auth inconsistency detection\n\n## References\n- https://fastapi.tiangolo.com/tutorial/security/","short_description":"Fetches OpenAPI schema and finds unprotected operations","confirmation_criteria":"Confirmed when OpenAPI spec reveals operations without security requirements, optionally verified by unauthenticated access","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"django-debug-exposure","name":"Django Debug Exposure","type":"active","description":"## Description\nTriggers errors to detect Django applications running with DEBUG=True. When\nenabled, Django displays detailed error pages containing settings, URL\npatterns, stack traces, and environment variables. This module sends requests\ndesigned to trigger 404 and 500 error pages that reveal debug information.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Sends a request to a random non-existent path to trigger a Django debug 404 page\n- Sends a malformed JSON POST to trigger a 500 error with stack trace\n- Validates responses with Django-specific debug page markers\n\n## References\n- https://docs.djangoproject.com/en/stable/ref/settings/#debug","short_description":"Triggers errors to detect Django DEBUG=True information disclosure","confirmation_criteria":"Confirmed when error responses contain Django debug page markers indicating DEBUG=True","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"django-admin-exposure","name":"Django Admin Exposure","type":"active","description":"## Description\nProbes for exposed Django admin panel. Django ships with a built-in admin\ninterface at /admin/ that provides full CRUD access to the application's data\nmodels. An exposed admin panel increases attack surface and may allow brute\nforce or credential stuffing attacks against the admin login.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with Django admin-specific markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- Admin index reported as medium severity; login page confirms admin is installed\n\n## References\n- https://docs.djangoproject.com/en/stable/ref/contrib/admin/","short_description":"Probes for exposed Django admin panel and login page","confirmation_criteria":"Confirmed when admin endpoints return 200 with expected Django admin-specific markers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"django-debug-toolbar-exposure","name":"Django Debug Toolbar Exposure","type":"active","description":"## Description\nProbes for exposed django-debug-toolbar endpoints. When debug toolbar is left\nenabled in production, it exposes internal application state including SQL queries,\ntemplate context, signal handlers, cache operations, and profiling data.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Validates responses with content markers to reduce false positives\n- Fingerprints 404 responses to detect custom error pages\n- DJ-06: django-debug-toolbar detection\n\n## References\n- https://django-debug-toolbar.readthedocs.io/","short_description":"Detects exposed django-debug-toolbar panels and render endpoints","confirmation_criteria":"Confirmed when debug toolbar endpoints return 200 with expected django-debug-toolbar markers","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"django-browsable-api-exposure","name":"Django Browsable API Exposure","type":"active","description":"## Description\nDetects Django REST Framework browsable API exposure by re-requesting endpoints\nwith Accept: text/html. When the browsable API is enabled in production, it\nprovides an interactive HTML interface that reveals API schema, available actions,\nfilter options, and authentication requirements.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Re-requests the original URL with Accept: text/html header\n- Also probes /api/ with Accept: text/html\n- DJ-07: DRF browsable API detection\n\n## References\n- https://www.django-rest-framework.org/topics/browsable-api/","short_description":"Detects DRF browsable API by requesting endpoints with Accept: text/html","confirmation_criteria":"Confirmed when endpoints return HTML containing DRF browsable API markers","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"flask-werkzeug-debugger","name":"Flask Werkzeug Debugger","type":"active","description":"## Description\nDetects exposed Werkzeug interactive debugger in Flask applications. The\nWerkzeug debugger provides an interactive Python console in the browser when\nan unhandled exception occurs. This allows arbitrary code execution on the\nserver and is a critical vulnerability when exposed in production.\n\n## Notes\n- Runs once per host to avoid redundant probing\n- Sends requests designed to trigger 404 and 500 errors\n- Distinguishes between full interactive debugger (critical/RCE) and stack trace disclosure (high/info disclosure)\n- Interactive debugger confirmed by \"Werkzeug Debugger\" marker\n\n## References\n- https://flask.palletsprojects.com/en/latest/debugging/\n- https://werkzeug.palletsprojects.com/en/latest/debug/","short_description":"Detects exposed Werkzeug interactive debugger enabling remote code execution","confirmation_criteria":"Confirmed when error responses contain Werkzeug debugger markers indicating interactive console access","severity":"critical","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"proxy-header-trust","name":"Proxy Header Trust","type":"active","description":"## Description\nCross-framework detection of proxy header trust issues. Tests whether the application\nblindly trusts X-Forwarded-Proto, X-Forwarded-Host, and X-Forwarded-For headers,\nwhich can lead to host injection, protocol confusion, and IP-based access control bypass.\n\n## Notes\n- Runs once per host\n- Sends baseline request then compares with header-injected variants\n- X-Forwarded-Host reflected in Location or body indicates host injection (High)\n- X-Forwarded-Proto behavior changes indicate protocol confusion (Medium)\n- X-Forwarded-For bypassing restrictions indicates IP trust issues (High)\n- CF-21, FA-05, FL-06, DJ-08: cross-framework proxy header trust detection\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Cross-framework detection of proxy header trust issues via X-Forwarded-* header manipulation","confirmation_criteria":"Confirmed when X-Forwarded-* header manipulation causes observable behavioral changes such as host reflection, redirect differences, or access control bypass","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"bfla-detection","name":"BFLA Detection","type":"active","description":"## Description\nDetects Broken Function-Level Authorization (BFLA) by testing admin and privileged\nendpoints with missing or downgraded authentication. Strips Authorization and Cookie\nheaders, attempts empty tokens, and tests method switching on admin-like paths.\n\n## Notes\n- Runs once per unique host+path combination via DiskSet dedup\n- Skips non-2xx original responses (only tests endpoints that currently succeed)\n- Compares response status codes and body lengths to reduce false positives\n- Heuristic-based detection targeting known admin/privileged path patterns\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa5-broken-function-level-authorization/\n- https://portswigger.net/web-security/access-control","short_description":"Detects Broken Function-Level Authorization on privileged endpoints","confirmation_criteria":"Confirmed when a privileged endpoint returns a successful response after removing or downgrading authentication credentials","severity":"high","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"oauth-misconfiguration","name":"OAuth/OIDC Misconfiguration","type":"active","description":"## Description\nDetects common OAuth and OpenID Connect misconfigurations that can lead to account\ntakeover or authorization bypass. Tests for redirect_uri manipulation, missing CSRF\nstate parameter, and response_type downgrade to implicit flow.\n\n## Notes\n- Runs once per unique host+path combination via DiskSet dedup\n- Only activates on detected OAuth/OIDC endpoints (path and parameter heuristics)\n- Tests redirect_uri with multiple bypass techniques (direct replacement, subdomain confusion, path traversal)\n- Checks for missing state parameter (CSRF protection)\n- Tests response_type downgrade from code to token (implicit flow)\n\n## References\n- https://portswigger.net/web-security/oauth\n- https://datatracker.ietf.org/doc/html/rfc6749#section-10.6\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/05-Testing_for_OAuth_Weaknesses","short_description":"Detects common OAuth/OIDC misconfigurations including open redirect and missing state","confirmation_criteria":"Confirmed when an OAuth endpoint accepts a manipulated redirect_uri, is missing CSRF state protection, or accepts implicit flow downgrade","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-key-url-exposure","name":"API Key in URL","type":"active","description":"## Description\nDetects API keys and authentication tokens that continue to work when moved from\nHTTP headers to URL query parameters. API keys in URLs are logged in access logs,\nbrowser history, referrer headers, and proxy logs, significantly increasing the\nrisk of credential exposure.\n\n## Notes\n- Tests once per unique host+path combination\n- Checks common auth headers: Authorization, X-API-Key, X-Auth-Token, etc.\n- Only tests the first matching auth header per request\n- Reports when response with URL parameter matches original 2xx status\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa2-broken-authentication/\n- https://cwe.mitre.org/data/definitions/598.html","short_description":"Detects API keys that work when moved from headers to URL parameters","confirmation_criteria":"Confirmed when the server returns a successful response with the API key passed as a URL query parameter instead of in the authorization header","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"fastify-hono-probe","name":"Fastify/Hono Probe","type":"active","description":"## Description\nProbes for framework-specific documentation, metrics, and debug endpoints exposed\nby Fastify and Hono Node.js frameworks. These frameworks may inadvertently expose\nSwagger documentation, API references, metrics endpoints, and overview pages in\nproduction deployments.\n\n## Notes\n- Runs once per host with internal deduplication\n- Tests 8 framework-specific paths across Fastify and Hono\n- Each probe has tailored response matching to reduce false positives\n\n## References\n- https://fastify.dev/docs/latest/\n- https://hono.dev/docs/","short_description":"Detects exposed Fastify and Hono framework endpoints","confirmation_criteria":"Confirmed when the server responds with framework-specific content at known documentation or debug paths, indicating exposed internal endpoints","severity":"medium","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"metaframework-probe","name":"Metaframework Probe","type":"active","description":"## Description\nProbes for framework-specific internal files and debug endpoints exposed by modern\nJavaScript meta-frameworks including Remix, Astro, and SvelteKit. These frameworks\nmay inadvertently expose manifest files, build directories, version information,\nand development endpoints in production deployments.\n\n## Notes\n- Runs once per host with internal deduplication\n- Tests 8 framework-specific paths across Remix, Astro, and SvelteKit\n- Each probe has tailored response matching to reduce false positives\n\n## References\n- https://remix.run/docs/en/main\n- https://docs.astro.build/en/getting-started/\n- https://kit.svelte.dev/docs/introduction","short_description":"Detects exposed Remix, Astro, and SvelteKit internal files and endpoints","confirmation_criteria":"Confirmed when the server responds with framework-specific content at known internal paths, indicating exposed build artifacts or debug endpoints","severity":"low","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"dom-xss-detect","name":"DOM XSS Detect","type":"passive","description":"## Description\nPassively detects potential DOM-based XSS patterns by analyzing JavaScript code in\nresponses for dangerous source-to-sink data flows.\n\n## Notes\n- Scans response bodies for known DOM XSS source patterns (location.hash, document.referrer, etc.)\n- Identifies dangerous sink patterns (innerHTML, eval, document.write, etc.)\n- Pattern-based detection; manual verification recommended\n\n## References\n- https://owasp.org/www-community/attacks/DOM_Based_XSS","short_description":"Detects potential DOM-based XSS patterns in responses","confirmation_criteria":"Indicated when response JavaScript contains known source-to-sink patterns that could enable DOM-based XSS","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"auth-headers-detect","name":"Auth Headers Detect","type":"passive","description":"## Description\nPassively detects authorization and authentication headers in HTTP requests,\nflagging endpoints that handle sensitive credentials.\n\n## Notes\n- Scans request headers for Authorization, Cookie, X-API-Key, and similar patterns\n- Helps identify authentication boundaries in the application\n\n## References\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization","short_description":"Detects authorization headers in requests","confirmation_criteria":"Confirmed when request contains recognized authentication headers (Authorization, Bearer tokens, API keys)","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"openredirect-params","name":"Open Redirect Params","type":"passive","description":"## Description\nPassively detects URL parameters with names commonly associated with open redirect\nvulnerabilities (redirect, url, next, return, goto, etc.).\n\n## Notes\n- Pattern-based detection on parameter names only; does not test for actual redirects\n- Low confidence; serves as a triage signal for the active open redirect module\n\n## References\n- https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html","short_description":"Detects URL parameters commonly used for open redirects","confirmation_criteria":"Indicated when URL contains parameters with redirect-associated names (redirect, url, next, return, goto)","severity":"info","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"oauth-facebook-detect","name":"Facebook OAuth Detect","type":"passive","description":"## Description\nPassively detects Facebook OAuth redirect parameters in requests, flagging potential\nOAuth misconfiguration or open redirect vectors in the authentication flow.\n\n## Notes\n- Scans URL parameters for Facebook OAuth redirect_uri and related parameters\n- Helps identify OAuth flows that may be vulnerable to redirect manipulation\n\n## References\n- https://developers.facebook.com/docs/facebook-login/security/","short_description":"Detects Facebook OAuth redirect parameters for security analysis","confirmation_criteria":"Confirmed when request URL contains Facebook OAuth parameters (client_id, redirect_uri) matching known OAuth flow patterns","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"anomaly-ranking","name":"Anomaly Ranking","type":"passive","description":"## Description\nRanks HTTP responses by statistical anomaly to identify interesting endpoints. Buffers\nresponses per host and applies statistical ranking when thresholds are reached.\n\n## Notes\n- Buffers per-host response attributes and flushes at configurable thresholds\n- Uses statistical analysis to identify outlier responses worth investigating\n- Updates risk_score on database records for prioritization\n\n## References\n- https://en.wikipedia.org/wiki/Anomaly_detection","short_description":"Statistical anomaly detection across per-host response batches","confirmation_criteria":"Indicated when a response's statistical attributes (size, status, headers) deviate significantly from the per-host baseline","severity":"suspect","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"secret-detect","name":"Secret Detection","type":"passive","description":"## Description\nPassively scans HTTP response bodies for leaked secrets, credentials, API keys,\nand connection strings using the Kingfisher secret detection engine.\n\n## Notes\n- Scans response bodies only (no additional HTTP requests sent)\n- Skips binary/media content types\n- Uses lazy-initialized singleton Kingfisher scanner\n- Generates one finding per detected secret\n\n## References\n- https://github.com/mongodb/kingfisher","short_description":"Detects leaked secrets and credentials in HTTP responses","confirmation_criteria":"Confirmed when Kingfisher detects a known secret pattern in the HTTP response body","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sourcemap-detect","name":"Sourcemap Exposure Detect","type":"passive","description":"## Description\nPassively detects exposed JavaScript sourcemaps by identifying SourceMappingURL\nreferences in JS/CSS responses and validating accessible .map files.\n\n## Notes\n- Detects sourceMappingURL comments in JavaScript and CSS responses\n- Validates .map file responses by parsing sourcemap JSON structure\n- Exposed sourcemaps reveal original source code, file paths, and potentially secrets\n\n## References\n- https://developer.chrome.com/docs/devtools/javascript/source-maps\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects exposed JavaScript sourcemaps in production responses","confirmation_criteria":"Confirmed when response contains a sourceMappingURL reference or a valid sourcemap JSON structure is detected","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"security-headers-missing","name":"Security Headers Missing","type":"passive","description":"## Description\nPassively detects missing HTTP security headers that protect against common web\nattacks including XSS, clickjacking, MIME sniffing, and protocol downgrade.\n\n## Notes\n- Checks for X-Content-Type-Options, X-Frame-Options, Strict-Transport-Security, Content-Security-Policy, and Permissions-Policy\n- Runs per-host to avoid duplicate findings\n- Only flags HTML responses to reduce noise\n\n## References\n- https://owasp.org/www-project-secure-headers/\n- https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html","short_description":"Detects missing HTTP security headers in responses","confirmation_criteria":"Confirmed when HTTP response lacks one or more recommended security headers","severity":"info","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"info-disclosure-detect","name":"Info Disclosure Detect","type":"passive","description":"## Description\nPassively detects information disclosure in HTTP responses including server version\nstrings, framework identifiers, internal IP addresses, and stack traces.\n\n## Notes\n- Scans response headers and bodies for disclosure patterns\n- Detects server software versions, internal paths, email addresses, and debug info\n- Runs per-request to catch endpoint-specific disclosures\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/01-Information_Gathering/","short_description":"Detects information disclosure patterns in HTTP responses","confirmation_criteria":"Confirmed when response contains identifiable server versions, internal IPs, stack traces, or debug information","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"directory-listing-detect","name":"Directory Listing Detect","type":"passive","description":"## Description\nPassively detects directory listing exposure in HTTP responses across common web\nservers including Apache, Nginx, Microsoft IIS, Jetty, and Python SimpleHTTPServer.\n\n## Notes\n- Analyzes existing responses without sending additional requests\n- Detects Apache, Nginx, Python, Jetty, and IIS directory listing signatures\n- Skips binary/media content types\n- Only processes 2xx responses\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/04-Review_Old_Backup_and_Unreferenced_Files_for_Sensitive_Information\n- https://httpd.apache.org/docs/2.4/mod/mod_autoindex.html","short_description":"Passively detects directory listing exposure in HTTP responses","confirmation_criteria":"Confirmed when response contains server-specific directory listing indicators such as Apache Index of, Nginx autoindex, IIS directory browsing, Jetty directory, or Python directory listing markers","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cookie-security-detect","name":"Cookie Security Detect","type":"passive","description":"## Description\nPassively detects insecure cookie configurations by analyzing Set-Cookie headers\nfor missing Secure, HttpOnly, and SameSite attributes.\n\n## Notes\n- Checks all Set-Cookie headers in responses\n- Flags cookies missing Secure flag on HTTPS responses\n- Flags cookies missing HttpOnly attribute\n- Flags cookies without SameSite attribute\n\n## References\n- https://owasp.org/www-community/controls/SecureCookieAttribute\n- https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html","short_description":"Detects insecure cookie attributes in HTTP responses","confirmation_criteria":"Confirmed when Set-Cookie headers lack Secure, HttpOnly, or SameSite attributes","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"mixed-content-detect","name":"Mixed Content Detect","type":"passive","description":"## Description\nPassively detects mixed content issues where HTTPS pages load resources over\ninsecure HTTP connections, potentially exposing data to interception.\n\n## Notes\n- Scans HTML response bodies for HTTP URLs in src, href, and action attributes\n- Only checks responses from HTTPS origins\n- Flags both active (scripts, iframes) and passive (images, stylesheets) mixed content\n\n## References\n- https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content\n- https://owasp.org/www-community/controls/Certificate_and_Public_Key_Pinning","short_description":"Detects mixed HTTP/HTTPS content in responses","confirmation_criteria":"Confirmed when HTTPS page contains references to resources loaded over insecure HTTP","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sensitive-url-params","name":"Sensitive URL Params","type":"passive","description":"## Description\nPassively detects sensitive information passed via URL query parameters, which may\nbe logged in server logs, browser history, and referrer headers.\n\n## Notes\n- Detects passwords, tokens, API keys, and credentials in URL parameters\n- Pattern-based detection on both parameter names and values\n- Sensitive data in URLs is logged and may leak via Referer headers\n\n## References\n- https://owasp.org/www-community/vulnerabilities/Information_exposure_through_query_strings_in_url\n- https://cwe.mitre.org/data/definitions/598.html","short_description":"Detects sensitive data in URL query parameters","confirmation_criteria":"Indicated when URL query parameters contain names or values matching sensitive data patterns (password, token, key, secret)","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cors-headers-detect","name":"CORS Headers Detect","type":"passive","description":"## Description\nPassively detects permissive CORS configurations by analyzing Access-Control-Allow-Origin\nand related headers in HTTP responses without sending additional requests.\n\n## Notes\n- Flags wildcard (*) CORS origins\n- Flags CORS with credentials enabled\n- Complements the active CORS misconfiguration module with passive detection\n- Runs per-request for comprehensive coverage\n\n## References\n- https://portswigger.net/web-security/cors\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS","short_description":"Passively detects permissive CORS headers in responses","confirmation_criteria":"Confirmed when response contains permissive CORS headers such as wildcard origin or credentials enabled","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"jwt-weak-secret","name":"JWT Weak Secret Detection","type":"passive","description":"## Description\nPassively detects JWT tokens signed with weak HMAC secrets by performing offline\nbrute-force against an embedded wordlist of ~104K known weak secrets.\n\nWhen an asymmetric-algorithm JWT (RS256, ES256, etc.) is found but no HMAC secret\nmatches, emits a low-severity informational finding noting the potential for\nalgorithm confusion (CVE-2015-9235). Active testing is recommended to confirm.\n\n## Notes\n- Extracts JWTs from Authorization Bearer headers and cookies\n- Tests HMAC-based algorithms (HS256, HS384, HS512)\n- Detects non-cryptographic (plaintext ASCII) signatures indicating trivially forgeable tokens\n- Tests algorithm confusion (CVE-2015-9235): tries HS256/HS384/HS512 brute-force on asymmetric tokens (RS256, ES256, etc.)\n- Emits informational finding for asymmetric JWTs even when no weak secret is found\n- Computes HMAC signatures offline without sending additional requests\n- Uses embedded jwt.secrets.list wordlist\n\n## References\n- https://portswigger.net/web-security/jwt\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/06-Session_Management_Testing/10-Testing_JSON_Web_Tokens","short_description":"Detects JWTs with weak HMAC secrets, non-cryptographic signatures, and algorithm confusion","confirmation_criteria":"Confirmed when a JWT HMAC signature matches a known weak secret","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"jwt-claims-detect","name":"JWT Claim Analyzer","type":"passive","description":"## Description\nPassively analyzes JWT tokens found in request headers, cookies, and response bodies\nfor security misconfigurations such as algorithm:none, missing expiration, long-lived\ntokens, and privileged claims.\n\n## Notes\n- Extracts JWTs from Authorization Bearer headers, cookies, and response bodies\n- Decodes header and payload without verifying signatures\n- Checks for alg:none, missing exp/iss/aud, long-lived tokens, and admin claims\n- Does not send additional requests\n\n## References\n- https://portswigger.net/web-security/jwt\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/06-Session_Management_Testing/10-Testing_JSON_Web_Tokens","short_description":"Analyzes JWT claims for security misconfigurations","confirmation_criteria":"Confirmed when JWT claims contain security misconfigurations","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"serialized-object-detect","name":"Serialized Object Detection","type":"passive","description":"## Description\nPassively detects serialized objects in HTTP request parameters by matching known\nserialization format signatures for Java, PHP, .NET, and Python.\n\n## Notes\n- Java: base64 prefix \"rO0AB\" or hex prefix \"aced0005\"\n- PHP: pattern matching O:N:\"class\", a:N:{, etc.\n- .NET: base64 prefix \"AAEAAAD\" (BinaryFormatter)\n- Python: pickle indicators (\"ccopy_reg\" prefix or protocol markers)\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/16-Testing_for_HTTP_Incoming_Requests\n- https://portswigger.net/web-security/deserialization","short_description":"Detects serialized Java/PHP/.NET/Python objects in request parameters","confirmation_criteria":"Confirmed when request parameter values contain known serialization format signatures","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sql-syntax-detect","name":"SQL Syntax in Request Detection","type":"passive","description":"## Description\nPassively detects SQL statements and keywords in HTTP request parameter values,\nwhich may indicate SQL injection attempts or unsafe parameter handling.\n\n## Notes\n- Matches SQL statements: SELECT..FROM, INSERT INTO, UPDATE..SET, DELETE FROM, UNION SELECT, etc.\n- Secondary check for SQL keyword pairs: WHERE/AND/OR with comparison operators\n- URL-decodes parameter values before checking\n- Minimum value length of 8 characters to reduce false positives\n\n## References\n- https://owasp.org/www-community/attacks/SQL_Injection\n- https://cwe.mitre.org/data/definitions/89.html","short_description":"Detects SQL syntax in HTTP request parameter values","confirmation_criteria":"Indicated when request parameter values contain SQL statement patterns","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"content-type-mismatch","name":"Content Type Mismatch","type":"passive","description":"## Description\nPassively detects mismatches between the Content-Type header and actual response body\ncontent, which can lead to MIME confusion attacks and XSS.\n\n## Notes\n- Compares declared Content-Type with detected body content signatures\n- Flags JSON/XML/HTML content served with incorrect Content-Type\n- Missing X-Content-Type-Options makes MIME sniffing exploitable\n\n## References\n- https://owasp.org/www-project-secure-headers/#x-content-type-options\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options","short_description":"Detects mismatches between Content-Type header and response body","confirmation_criteria":"Confirmed when the Content-Type header does not match the actual content of the response body","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"csrf-detect","name":"CSRF Detection","type":"passive","description":"## Description\nDetects state-changing HTTP requests (POST, PUT, DELETE, PATCH) that lack common\nanti-CSRF protections such as CSRF tokens in parameters/headers or SameSite cookie\nattributes.\n\n## Notes\n- Passive only — does not send any HTTP requests\n- Skips JSON API requests with Origin header (CORS-protected)\n- Checks for CSRF tokens in body parameters, custom headers, and SameSite cookies\n- Deduplicates by method + host + path\n\n## References\n- https://owasp.org/www-community/attacks/csrf\n- https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html","short_description":"Flags state-changing requests missing anti-CSRF protections","confirmation_criteria":"Indicated when a state-changing request lacks CSRF token parameters, custom anti-CSRF headers, and SameSite cookie attributes","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"idor-params-detect","name":"IDOR Parameter Detection","type":"passive","description":"## Description\nPassively identifies HTTP parameters whose names and values suggest they reference\nobject identifiers, providing triage signals for potential IDOR (Insecure Direct\nObject Reference) and BOLA (Broken Object Level Authorization) vulnerabilities.\n\nThe module classifies parameter names (e.g. user_id, account_id) and values\n(sequential integers, UUIDs, structured codes) to compute a confidence score.\nPath parameters following resource nouns (e.g. /users/123) receive additional weight.\n\nWhen JSON responses are present, the module also flags excessive data exposure by\ndetecting sensitive field names (password_hash, ssn, is_admin, etc.).\n\n## Notes\n- Informational finding: flags endpoints for further active testing (Layer 2+)\n- Covers OWASP API1:2023 (BOLA) and API3:2023 (BOPLA) triage\n- Does not send additional requests — purely passive analysis\n- Deduplicates by host + normalized path pattern + parameter name + type\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa1-broken-object-level-authorization/\n- https://owasp.org/API-Security/editions/2023/en/0xa3-broken-object-property-level-authorization/\n- https://cwe.mitre.org/data/definitions/639.html","short_description":"Detects parameters that may reference object identifiers (IDOR/BOLA triage)","confirmation_criteria":"Indicated when a request parameter has a high-signal identifier name combined with a predictable value format, or when a JSON response exposes sensitive internal fields","severity":"info","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"crypto-weakness-detect","name":"Cryptographic Weakness Detection","type":"passive","description":"## Description\nDetects cryptographic weaknesses in HTTP responses and cookies, including PHP magic hashes,\nweak hash algorithms near sensitive contexts, padding oracle indicators, and encrypted cookies\nwithout integrity protection (MAC).\n\n## Notes\n- Analyzes both request cookies and response headers/body\n- Checks for MD5/SHA1 usage near password, token, or hash keywords\n- Detects padding oracle error messages that may enable ciphertext manipulation\n- Identifies encrypted cookie values that lack HMAC integrity verification\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/\n- https://www.whitehatsec.com/blog/magic-hashes/","short_description":"Detects weak cryptographic patterns in HTTP traffic","confirmation_criteria":"Confirmed when response contains identifiable cryptographic weakness patterns such as magic hashes, weak hash usage, padding oracle errors, or unprotected encrypted cookies","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"error-message-detect","name":"Error Message Detect","type":"passive","description":"## Description\nPassively detects error messages in HTTP responses that reveal server-side technology,\ndebug information, or database error details. Covers debug pages, Apache, ASP.NET, Java,\nPython, PHP, Ruby, Node.js, SQL database errors, and other common frameworks.\n\n## Notes\n- Categorizes errors by technology (Debug, Apache, ASP, Java, Generic, SQL)\n- Debug page patterns are reported at low severity with certain confidence\n- SQL error patterns are reported at low severity with firm confidence\n- Other error patterns are reported at info severity with firm confidence\n\n## References\n- https://cheatsheetseries.owasp.org/cheatsheets/Error_Handling_Cheat_Sheet.html\n- https://raw.githubusercontent.com/PortSwigger/error-message-checks/master/src/main/resources/burp/match-rules.tab\n- https://github.com/1ndianl33t/Gf-Patterns","short_description":"Detects interesting error messages in HTTP responses","confirmation_criteria":"Confirmed when response body contains recognizable error messages or stack traces from known frameworks","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"base64-data-detect","name":"Base64 Data Detect","type":"passive","description":"## Description\nPassively detects interesting base64 encoded data in HTTP requests and responses.\nMatches known prefixes for JSON (eyJ), PHP serialized objects (YTo, Tzo),\nXML/PHP (PD8/PD9), HTTPS/HTTP URLs (aHR0cHM6L, aHR0cDo), and Java serialized\nobjects (rO0).\n\n## Notes\n- Scans both request and response content\n- Low noise: only flags known interesting base64 prefixes\n- Manual review is recommended to assess the encoded data\n\n## References\n- https://portswigger.net/kb/issues/00700200_base64-encoded-data-in-parameter\n- https://cheatsheetseries.owasp.org/index.html\n- https://github.com/tomnomnom/gf/blob/master/examples/base64.json","short_description":"Identifies interesting base64 encoded data like JSON, PHP Object in requests/responses","confirmation_criteria":"Confirmed when request or response contains base64-encoded data matching known interesting prefixes (JSON, PHP objects, URLs, Java objects)","severity":"info","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"password-autocomplete-detect","name":"Password Autocomplete Detect","type":"passive","description":"## Description\nPassively detects password input fields in HTML responses that do not have autocomplete\ndisabled, which may allow browsers to store sensitive credentials.\n\n## Notes\n- Checks for autocomplete=\"off\" or autocomplete=\"new-password\" on password inputs\n- Also checks enclosing form elements for autocomplete attributes\n- Only fires on text/html responses\n\n## References\n- https://owasp.org/www-community/controls/PasswordAutocomplete\n- https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html","short_description":"Detects password fields without autocomplete disabled","confirmation_criteria":"Confirmed when password input fields lack autocomplete='off' or autocomplete='new-password'","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cacheable-https-detect","name":"Cacheable HTTPS Response Detect","type":"passive","description":"## Description\nPassively detects HTTPS responses containing sensitive content (Set-Cookie headers or\npassword fields) that lack proper cache-control directives, allowing browsers or proxies\nto cache sensitive data.\n\n## Notes\n- Only fires on HTTPS URLs with sensitive response indicators\n- Checks for Cache-Control: no-store, no-cache, or private\n- Also checks Pragma: no-cache as legacy fallback\n- Missing or permissive cache control on sensitive responses is flagged\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/04-Authentication_Testing/06-Testing_for_Browser_Cache_Weaknesses\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cache-Control","short_description":"Detects sensitive HTTPS responses without proper cache control","confirmation_criteria":"Confirmed when sensitive HTTPS response lacks Cache-Control: no-store/no-cache/private directives","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"input-reflection-detect","name":"Input Reflection Detect","type":"passive","description":"## Description\nPassively detects when request parameter values are reflected verbatim in the response body.\nInput reflection is a prerequisite for many injection vulnerabilities including XSS.\n\n## Notes\n- Only checks text/html responses\n- Filters out short values (<4 chars), all-numeric values, and token-like values\n- Reports reflected parameters as informational findings for further investigation\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/01-Testing_for_Reflected_Cross_Site_Scripting","short_description":"Detects request parameter values reflected in responses","confirmation_criteria":"Indicated when a request parameter value appears verbatim in the response body","severity":"info","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"graphql-introspection-detect","name":"GraphQL Introspection Leak Detect","type":"passive","description":"## Description\nPassively detects GraphQL introspection responses that leak the full API schema,\nincluding types, queries, mutations, and subscriptions.\n\n## Notes\n- Checks JSON response bodies for introspection-specific fields (__schema, __type)\n- Requires confirmation fields (queryType, mutationType, subscriptionType, types) to avoid false positives\n- Runs per-request to catch endpoint-specific disclosures\n\n## References\n- https://graphql.org/learn/introspection/\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/12-API_Testing/01-Testing_GraphQL","short_description":"Detects GraphQL introspection responses that expose the full API schema","confirmation_criteria":"Confirmed when response contains GraphQL introspection fields (__schema/__type) with schema definition markers","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"js-framework-fingerprint","name":"JS Framework Fingerprint","type":"passive","description":"## Description\nPassively identifies the JavaScript framework powering a web application by analyzing\nHTML response bodies and HTTP headers for framework-specific markers. Stores results\nin a shared per-host cache used by other framework-specific modules.\n\n## Notes\n- Passive only — does not send any HTTP requests\n- Detects: Next.js (Pages/App Router), Nuxt.js, Angular, React CRA, Remix, SvelteKit, Gatsby\n- Extracts Next.js buildId for use by active Next.js modules\n- Deduplicates by host to avoid redundant processing\n- Requires strong signals (script tags or headers) to avoid false positives\n\n## References\n- https://nextjs.org/docs\n- https://nuxt.com/docs\n- https://angular.dev","short_description":"Identifies JavaScript frameworks (Next.js, Nuxt, Angular, React, Remix, SvelteKit, Gatsby)","confirmation_criteria":"Confirmed when framework-specific markers (script tags, headers, or asset URL patterns) are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssr-data-exposure","name":"SSR Data Exposure","type":"passive","description":"## Description\nScans server-side rendered (SSR) state blobs embedded in HTML pages for sensitive data\nexposure. Modern JS frameworks serialize application state into the HTML page for hydration,\nwhich may inadvertently include API keys, tokens, admin flags, email addresses,\npassword hashes, or internal URLs.\n\n## Notes\n- Passive only — does not send any HTTP requests\n- Extracts state from: __NEXT_DATA__, __NUXT__, __INITIAL_STATE__, __APOLLO_STATE__\n- Scans extracted JSON for API keys, tokens, admin flags, emails, password hashes, internal IPs\n- Minimum token length of 16 characters to reduce false positives\n- Deduplicates by host+path\n\n## References\n- https://nextjs.org/docs/pages/building-your-application/data-fetching\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/04-Testing_for_Weak_Encryption","short_description":"Detects sensitive data leaked in server-side rendered state blobs","confirmation_criteria":"Confirmed when sensitive patterns (API keys, tokens, admin flags, credentials) are found in SSR state blobs","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cache-auth-misconfiguration","name":"Cache-Auth Misconfiguration","type":"passive","description":"## Description\nDetects responses that are publicly cacheable (Cache-Control: public or s-maxage) but\ncontain user-specific indicators (Set-Cookie, Authorization) without proper Vary headers.\nThis can lead to one user's authenticated response being served from cache to another\nuser, causing data leakage or session confusion.\n\n## Notes\n- Passive only — does not send any HTTP requests\n- Skips static assets (JS, CSS, images, fonts)\n- Checks for Cache-Control: public or s-maxage without no-store/private\n- Reports missing Vary: Cookie when Set-Cookie is present\n- Reports missing Vary: Authorization when Authorization header was in request\n- Deduplicates by host+path\n\n## References\n- https://portswigger.net/web-security/web-cache-poisoning\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary","short_description":"Detects cacheable responses with user-specific data missing Vary headers","confirmation_criteria":"Confirmed when a cacheable response has user-specific headers but missing corresponding Vary header","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"server-action-auth","name":"Server Action Auth Check","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js Server Actions that perform\nstate-changing operations (database mutations, writes) without any authorization checks.\nServer Actions marked with \"use server\" execute on the server and are directly callable\nfrom the client. If they lack session validation or auth guards, any unauthenticated\nuser can invoke them to modify data.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects \"use server\" directive combined with mutation patterns (create, update, delete, etc.)\n- Flags when no authorization patterns are found (getSession, auth(), verifyToken, etc.)\n- Deduplicates by host+path\n- CWE-862: Missing Authorization\n\n## References\n- https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations\n- https://cwe.mitre.org/data/definitions/862.html\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/02-Testing_for_Bypassing_Authorization_Schema","short_description":"Detects Next.js Server Actions missing authorization checks","confirmation_criteria":"Confirmed when a Server Action contains mutation operations but no authorization checks","severity":"high","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextauth-config-audit","name":"NextAuth.js Configuration Audit","type":"passive","description":"## Description\nInspects HTTP responses for NextAuth.js (Auth.js) session configuration issues.\nChecks session cookies for missing security flags, decodes JWT session tokens to\ndetect sensitive data exposure, and fingerprints NextAuth API endpoints for\ninformation leakage.\n\n## Notes\n- Detects NextAuth session cookies (next-auth.session-token, __Secure-next-auth.*)\n- Checks cookie flags: Secure, HttpOnly, SameSite\n- Decodes JWT payloads to detect sensitive claims (passwords, secrets, tokens)\n- Fingerprints NextAuth endpoints via response patterns\n- Deduplicates by host\n\n## References\n- https://next-auth.js.org/configuration/options\n- https://next-auth.js.org/configuration/options#cookies\n- https://authjs.dev/getting-started/session-management/protecting","short_description":"Detects insecure NextAuth.js session and cookie configurations","confirmation_criteria":"Confirmed when NextAuth session cookies have insecure flags or JWT tokens contain sensitive data","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-config-audit","name":"Next.js Config Audit","type":"passive","description":"## Description\nScans response bodies for insecure Next.js configuration patterns that can introduce\nsecurity vulnerabilities. Checks for dangerous SVG allowances (XSS risk), wildcard\nimage domains (SSRF risk), HTTP protocol in image config (cleartext transport),\nexposed production source maps (information disclosure), internal API exposure via\nrewrites/redirects, and missing security headers configuration.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects: dangerouslyAllowSVG, wildcard image hostnames, HTTP protocol, production source maps\n- Also checks for internal API route exposure and missing security headers config\n- Each matched pattern emits a separate finding with matched snippet\n- Deduplicates by host\n\n## References\n- https://nextjs.org/docs/app/api-reference/next-config-js\n- https://cwe.mitre.org/data/definitions/79.html\n- https://cwe.mitre.org/data/definitions/918.html\n- https://cwe.mitre.org/data/definitions/540.html","short_description":"Detects insecure Next.js configuration patterns","confirmation_criteria":"Confirmed when insecure configuration patterns are found in Next.js config files","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nuxt-config-audit","name":"Nuxt Config Audit","type":"passive","description":"## Description\nScans response bodies for insecure Nuxt.js configuration patterns and sensitive data leaked\nthrough Nuxt state blobs. Detects exposed __NUXT__ and __NUXT_DATA__ state in HTML, checks\nfor sensitive data patterns (API keys, tokens, internal URLs) within Nuxt state, and identifies\ndangerous configuration options such as enabled devtools, exposed runtime secrets, production\nsource maps, and debug mode.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects: __NUXT__ / __NUXT_DATA__ state blobs in HTML\n- Scans Nuxt state for API keys, tokens, admin flags, internal IPs\n- Checks config patterns: devtools, runtimeConfig secrets, productionSourceMap, debug\n- Also detects /_nuxt/ source map exposure\n- Deduplicates by host\n\n## References\n- https://nuxt.com/docs/guide/directory-structure/nuxt-config\n- https://nuxt.com/docs/api/nuxt-config#runtimeconfig\n- https://cwe.mitre.org/data/definitions/540.html\n- https://cwe.mitre.org/data/definitions/200.html","short_description":"Detects insecure Nuxt configuration patterns and sensitive data in Nuxt state","confirmation_criteria":"Confirmed when insecure configuration patterns or sensitive data are found in Nuxt state or config","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"javascript-uri-sink","name":"JavaScript URI Sink Detection","type":"passive","description":"## Description\nDetects javascript: protocol URIs in HTML attributes that act as XSS sinks.\nWhen user-controlled data flows into href, src, or other URL-based attributes\nwithout protocol validation, an attacker can inject javascript: URIs to achieve\nscript execution on user interaction (e.g., clicking a link).\n\nThis is a distinct vector from general DOM XSS — React's default data binding\ndoes not protect against javascript: URIs in href attributes.\n\n## Notes\n- Scans HTML responses for javascript: URIs in href, src, action, formaction attributes\n- Correlates with request parameters to identify reflection from user input\n- Flags both direct javascript: URIs and obfuscated variants (url-encoded, mixed case)\n- Deduplicates by host+path\n\n## References\n- https://owasp.org/www-community/attacks/xss/\n- https://snyk.io/blog/10-react-security-best-practices/\n- https://cwe.mitre.org/data/definitions/79.html","short_description":"Detects javascript: URIs reflected in href/src attributes","confirmation_criteria":"Confirmed when javascript: URI is found in a URL-based HTML attribute, especially when correlated with request input","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"ssr-hydration-xss","name":"SSR Hydration XSS Detection","type":"passive","description":"## Description\nDetects unsafe patterns in server-side rendered (SSR) pages where JSON data is\nembedded in inline script tags for client-side hydration. If the serialized JSON\nis not properly encoded, an attacker can inject a closing tag followed\nby arbitrary HTML/JavaScript, leading to XSS on page load.\n\nCommon vulnerable patterns include:\n- __NEXT_DATA__ script tags with unescaped user content\n- window.__PRELOADED_STATE__ assignments with raw JSON.stringify output\n- Hydration scripts that embed user-controlled data without HTML escaping\n\n## Notes\n- Scans HTML responses for inline script tags containing hydration data\n- Detects unescaped sequences within JSON hydration blocks\n- Checks for missing HTML entity encoding of < characters in embedded JSON\n- Correlates with request parameters to identify user-controlled data in hydration\n- Deduplicates by host+path\n\n## References\n- https://snyk.io/blog/10-react-security-best-practices/\n- https://owasp.org/www-community/attacks/xss/\n- https://cwe.mitre.org/data/definitions/79.html","short_description":"Detects potential XSS in server-side rendered JSON hydration scripts","confirmation_criteria":"Confirmed when user-controlled data appears unescaped in a JSON hydration script block","severity":"high","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"remix-loader-exposure","name":"Remix Loader Exposure","type":"passive","description":"## Description\nScans HTML responses for Remix framework-specific patterns that may leak sensitive data.\nDetects exposed Remix context (window.__remixContext), manifest (__remixManifest), Remix\nresponse headers, and loader data embedded in script tags. Extracts Remix state data and\nscans for sensitive patterns including API keys, tokens, admin flags, email addresses,\npassword hashes, internal IPs, database URLs, and AWS keys.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects: window.__remixContext, __remixManifest, X-Remix-Response/X-Remix-Revalidate headers\n- Extracts loader data from script tags and scans for sensitive patterns\n- Minimum token length of 16 characters to reduce false positives\n- Deduplicates by host+path\n\n## References\n- https://remix.run/docs/en/main/route/loader\n- https://remix.run/docs/en/main/guides/streaming\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/04-Testing_for_Weak_Encryption","short_description":"Detects sensitive data leaked through Remix loader data and context","confirmation_criteria":"Confirmed when sensitive data patterns are found in Remix loader data or context","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"client-auth-guard","name":"Client Auth Guard Check","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js client components that\nimplement authentication guards purely on the client side using useEffect redirects.\nClient-side auth checks can be trivially bypassed by disabling JavaScript or\nmanipulating the DOM, leaving protected routes accessible without authentication.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects \"use client\" directive combined with useEffect-based auth redirects\n- Flags when no server-side auth indicators are found alongside client redirects\n- Covers router.push/replace to login/signin/auth and window.location redirects\n- Deduplicates by host+path\n- CWE-862: Missing Authorization\n\n## References\n- https://nextjs.org/docs/app/building-your-application/authentication\n- https://cwe.mitre.org/data/definitions/862.html\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/05-Authorization_Testing/02-Testing_for_Bypassing_Authorization_Schema","short_description":"Detects client-only auth guards without server-side enforcement","confirmation_criteria":"Confirmed when a client component implements auth redirect via useEffect without server-side auth","severity":"high","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cache-data-leak","name":"Cache Data Leak","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js caching and static\ngeneration patterns that may inadvertently leak authenticated or user-specific data.\nStatic pages (getStaticProps, force-static) are generated at build time and served\nto all users, so including session-dependent data causes cross-user data leakage.\nSimilarly, unstable_cache without user-scoped keys or server fetches without\ncache: \"no-store\" may serve stale authenticated responses to different users.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects: getStaticProps with auth, force-static with auth, unstable_cache without user key\n- Also detects server component fetches with auth headers but without no-store/revalidate:0\n- CWE-524: Use of Cache That Contains Sensitive Information\n- Deduplicates by host+path\n\n## References\n- https://nextjs.org/docs/app/building-your-application/caching\n- https://nextjs.org/docs/app/building-your-application/data-fetching\n- https://cwe.mitre.org/data/definitions/524.html","short_description":"Detects cache and static generation patterns that may leak user data","confirmation_criteria":"Confirmed when static generation or caching patterns are used alongside authentication-scoped data fetching","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"server-action-input-audit","name":"Server Action Input Audit","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js Server Actions that accept\nuser input (FormData or function arguments) without runtime schema validation. Server\nActions rely on TypeScript types for compile-time safety, but these types are erased at\nruntime. Without runtime validation (zod, yup, joi, valibot, etc.), attackers can submit\narbitrary data types, unexpected fields, or injection payloads.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects \"use server\" directive combined with FormData/argument usage\n- Flags when no validation library patterns are found (z.parse, z.safeParse, schema.validate, etc.)\n- Complements server_action_auth which checks for missing authorization\n- Deduplicates by host+path\n- CWE-20: Improper Input Validation\n\n## References\n- https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations\n- https://nextjs.org/blog/security-nextjs-server-components-actions\n- https://cwe.mitre.org/data/definitions/20.html","short_description":"Detects Next.js Server Actions missing runtime input validation","confirmation_criteria":"Confirmed when a Server Action processes input without any runtime validation library","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"server-action-bind-audit","name":"Server Action Bind Audit","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js Server Actions that use\n.bind() to pass sensitive identifiers (IDs, slugs, resource references) as arguments.\nBound arguments are not encrypted and can be tampered with by the client. If the action\ndoes not re-authorize the resource on the server side, this creates an IDOR vulnerability\nwhere users can modify other users' resources by changing the bound ID.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects .bind(null, ) patterns in server component code\n- Flags when bound values look like resource identifiers (id, userId, postId, etc.)\n- Cross-references with authorization check patterns inside the action body\n- Deduplicates by host+path\n- CWE-639: Authorization Bypass Through User-Controlled Key\n\n## References\n- https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations#passing-additional-arguments\n- https://nextjs.org/blog/security-nextjs-server-components-actions\n- https://cwe.mitre.org/data/definitions/639.html","short_description":"Detects Server Action .bind() with sensitive identifiers risking IDOR","confirmation_criteria":"Confirmed when .bind() passes identifiers to a Server Action without re-authorization in the action body","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"server-only-boundary-audit","name":"Server-Only Boundary Audit","type":"passive","description":"## Description\nScans client-side JavaScript bundles for evidence that server-only code has leaked\ninto the browser. Server-side modules (database clients, internal API helpers, crypto\noperations, environment secrets) should use the 'server-only' package to enforce the\nboundary. When this guard is missing, Next.js may accidentally bundle server code into\nthe client, exposing proprietary logic, internal endpoints, and potentially credentials.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Scans JS response bodies under /_next/static/ paths\n- Detects server-side module identifiers in client bundles (prisma, drizzle, knex, etc.)\n- Detects internal API endpoint patterns (localhost, 127.0.0.1, internal service URLs)\n- Detects server crypto/auth module usage (bcrypt, jsonwebtoken, jose)\n- Deduplicates by host+path\n\n## References\n- https://nextjs.org/docs/app/building-your-application/rendering/composition-patterns#keeping-server-only-code-out-of-the-client-environment\n- https://cwe.mitre.org/data/definitions/200.html\n- https://cwe.mitre.org/data/definitions/540.html","short_description":"Detects server-side modules leaked into client component bundles","confirmation_criteria":"Confirmed when client-side JavaScript bundles contain server-only module identifiers or internal service references","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"nextjs-dynamic-param-audit","name":"Next.js Dynamic Param Audit","type":"passive","description":"## Description\nScans JavaScript and TypeScript response bodies for Next.js pages and route handlers\nthat use dynamic route params or searchParams directly in database queries, authorization\ndecisions, or sensitive operations without runtime validation. Dynamic route segments\n([param]) and searchParams are user-controlled strings that must be validated before\nuse in security-sensitive contexts.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Detects params.id, params.slug, searchParams.* used directly in DB queries\n- Detects searchParams used in authorization decisions (isAdmin, role, etc.)\n- Flags when no schema validation is applied before use\n- Deduplicates by host+path\n- CWE-20: Improper Input Validation\n\n## References\n- https://nextjs.org/docs/app/building-your-application/routing/dynamic-routes\n- https://nextjs.org/blog/security-nextjs-server-components-actions\n- https://cwe.mitre.org/data/definitions/20.html\n- https://cwe.mitre.org/data/definitions/89.html","short_description":"Detects unsafe usage of dynamic route params without validation","confirmation_criteria":"Confirmed when dynamic params or searchParams are used directly in sensitive operations without validation","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"unsafe-html-sink","name":"Unsafe HTML Sink","type":"passive","description":"## Description\nScans JavaScript, TypeScript, Vue, and Svelte response bodies for patterns that inject\nraw HTML into the DOM without sanitization. These sinks are common sources of XSS\nvulnerabilities in modern frontend frameworks: React (dangerouslySetInnerHTML),\nVue (v-html), Svelte ({@html}), Angular (bypassSecurityTrust*), and vanilla DOM APIs\n(innerHTML, outerHTML, insertAdjacentHTML, document.write). Also detects dangerous\ncode injection patterns via eval() and new Function().\n\n## Notes\n- Passive only -- does not send any HTTP requests\n- Scans JS/TS/Vue/Svelte files and inline scripts in HTML responses\n- Each detected pattern produces a separate finding\n- Deduplicates by host+path\n- eval() detections are suppressed for test/spec/mock files\n\n## References\n- https://react.dev/reference/react-dom/components/common#dangerously-setting-the-inner-html\n- https://vuejs.org/api/built-in-directives.html#v-html\n- https://svelte.dev/docs/special-tags#html\n- https://angular.io/api/platform-browser/DomSanitizer\n- https://owasp.org/www-community/attacks/DOM_Based_XSS\n- https://cwe.mitre.org/data/definitions/79.html","short_description":"Detects raw HTML injection sinks in JS/TS framework code","confirmation_criteria":"Confirmed when response JavaScript or template code contains known unsafe HTML injection sinks","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"insecure-token-storage","name":"Insecure Token Storage","type":"passive","description":"## Description\nScans JavaScript response bodies for patterns that store authentication tokens,\nAPI keys, or session identifiers in browser localStorage or sessionStorage.\nStoring sensitive tokens in Web Storage exposes them to XSS attacks -- any\nscript running in the same origin can read these values, making token theft\ntrivial if an XSS vulnerability exists.\n\n## Notes\n- Passive only -- does not send any HTTP requests\n- Detects setItem calls with known auth-related key names\n- Detects bracket notation assignment to known auth key names\n- Flags patterns that read from localStorage for Authorization headers (higher severity)\n- Deduplicates by host+path\n\n## References\n- https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#local-storage\n- https://owasp.org/www-community/attacks/xss/\n- https://cwe.mitre.org/data/definitions/922.html\n- https://auth0.com/docs/secure/security-guidance/data-security/token-storage","short_description":"Detects auth tokens stored in localStorage/sessionStorage","confirmation_criteria":"Confirmed when JavaScript code stores auth tokens or secrets in localStorage or sessionStorage","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"env-secret-exposure","name":"Environment Secret Exposure","type":"passive","description":"## Description\nScans response bodies for secrets accidentally exposed through public environment\nvariable mechanisms in modern JS frameworks. Next.js (NEXT_PUBLIC_), Vite (VITE_),\nand Create React App (REACT_APP_) all expose prefixed environment variables to the\nclient bundle. When developers store secret keys, tokens, or passwords in these\npublic variables, they are shipped to every browser that loads the application.\nAlso detects .env files served directly with embedded secrets.\n\n## Notes\n- Passive only -- does not send any HTTP requests\n- Scans JS, HTML, JSON, and plain text responses\n- Detects NEXT_PUBLIC_, VITE_, REACT_APP_ prefixed secret variables\n- Detects raw .env file content with secret indicators (sk_live_, AKIA, ghp_, etc.)\n- Minimum value length of 8 characters to reduce false positives\n- Deduplicates by host\n\n## References\n- https://nextjs.org/docs/app/building-your-application/configuring/environment-variables\n- https://vitejs.dev/guide/env-and-mode.html\n- https://create-react-app.dev/docs/adding-custom-environment-variables/\n- https://cwe.mitre.org/data/definitions/200.html\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/02-Configuration_and_Deployment_Management_Testing/05-Enumerate_Infrastructure_and_Application_Admin_Interfaces","short_description":"Detects secrets exposed through public environment variables","confirmation_criteria":"Confirmed when response body contains public environment variables with secret values or .env file content with credential indicators","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"build-misconfig-detect","name":"Build Misconfiguration Detect","type":"passive","description":"## Description\nScans JavaScript, TypeScript, and JSON response bodies for build and deployment\nmisconfigurations in modern frontend frameworks. Detects production source maps\nenabled (Next.js, Vite, webpack), development mode start scripts in production\npackage.json, dangerous SVG handling in Next.js image optimization, and overly\nbroad image remote patterns. These misconfigurations can leak source code,\nexpose development tooling, or enable SSRF attacks.\n\n## Notes\n- Passive only -- does not send any HTTP requests\n- Scans JS/TS/JSON responses and config file URLs\n- Detects: source maps in prod, dev mode in prod, SVG XSS risk, broad image remotePatterns\n- Deduplicates by host\n\n## References\n- https://nextjs.org/docs/app/api-reference/next-config-js/productionBrowserSourceMaps\n- https://vitejs.dev/config/build-options.html#build-sourcemap\n- https://webpack.js.org/configuration/devtool/\n- https://cwe.mitre.org/data/definitions/540.html\n- https://cwe.mitre.org/data/definitions/489.html","short_description":"Detects build and deployment misconfigurations in framework config files","confirmation_criteria":"Confirmed when response body contains build or deployment configuration patterns that indicate misconfigurations in production","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"csp-weakness-audit","name":"CSP Weakness Audit","type":"passive","description":"## Description\nParses Content-Security-Policy headers and evaluates individual directives for\nunsafe configurations that reduce CSP effectiveness. Detects unsafe-inline,\nunsafe-eval, wildcard sources, missing frame-ancestors, missing base-uri\nrestriction, overly permissive script-src, and data: or blob: URI schemes\nin sensitive directives.\n\n## Notes\n- Passive only - does not send any HTTP requests\n- Only processes HTML responses (text/html content type)\n- Parses actual CSP header values, not just presence/absence\n- Each weakness emits a separate finding with the problematic directive\n- Deduplicates by host\n- Complements security_headers_missing which only checks for header presence\n\n## References\n- https://cwe.mitre.org/data/definitions/693.html\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP\n- https://csp-evaluator.withgoogle.com/","short_description":"Detects weak or unsafe Content-Security-Policy directives","confirmation_criteria":"Confirmed when CSP header contains directives that significantly weaken its protection","severity":"medium","confidence":"firm","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"hsts-preload-audit","name":"HSTS Preload Audit","type":"passive","description":"## Description\nPassively audits the Strict-Transport-Security (HSTS) header on HTTPS responses\nto verify preload readiness: sufficient max-age, includeSubDomains directive,\nand preload directive.\n\n## Notes\n- Only checks HTTPS HTML responses\n- Requires max-age >= 31536000 (1 year) for preload eligibility\n- Runs per-host to avoid duplicate findings\n\n## References\n- https://hstspreload.org/\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security","short_description":"Audits Strict-Transport-Security header for preload readiness","confirmation_criteria":"Confirmed when HSTS header is missing, incomplete, or not preload-ready","severity":"low","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"referrer-policy-detect","name":"Referrer Policy Detect","type":"passive","description":"## Description\nPassively detects missing or weak Referrer-Policy headers that may leak\nsensitive URL information to third-party origins.\n\n## Notes\n- Flags missing Referrer-Policy header\n- Flags weak values: unsafe-url, no-referrer-when-downgrade\n- Safe values are not flagged: no-referrer, same-origin, strict-origin, strict-origin-when-cross-origin\n- Runs per-host to avoid duplicate findings\n\n## References\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy\n- https://owasp.org/www-project-secure-headers/","short_description":"Detects missing or weak Referrer-Policy headers","confirmation_criteria":"Confirmed when Referrer-Policy header is missing or set to a weak value","severity":"low","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"permissions-policy-detect","name":"Permissions Policy Detect","type":"passive","description":"## Description\nPassively detects missing or overly permissive Permissions-Policy (and legacy\nFeature-Policy) headers that grant sensitive browser APIs to all origins.\n\n## Notes\n- Checks both Permissions-Policy and legacy Feature-Policy headers\n- Flags overly permissive directives: camera=*, microphone=*, geolocation=*, payment=*, usb=*\n- Flags missing header entirely\n- Runs per-host to avoid duplicate findings\n\n## References\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Permissions-Policy\n- https://www.w3.org/TR/permissions-policy/","short_description":"Detects missing or overly permissive Permissions-Policy headers","confirmation_criteria":"Confirmed when Permissions-Policy header is missing or contains overly permissive directives","severity":"info","confidence":"certain","scan_scope":["PER_HOST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"subresource-integrity-detect","name":"Subresource Integrity Detect","type":"passive","description":"## Description\nPassively detects external scripts and stylesheets loaded without Subresource\nIntegrity (SRI) attributes. Missing SRI allows compromised CDNs or third-party\nhosts to inject malicious code.\n\n## Notes\n- Scans HTML response bodies for script and link tags referencing external origins\n- Flags external resources (http://, https://, //) that lack an integrity attribute\n- Skips inline scripts, same-origin resources, and data: URIs\n- Deduplicates by host+path\n\n## References\n- https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity\n- https://www.w3.org/TR/SRI/","short_description":"Detects external resources loaded without subresource integrity","confirmation_criteria":"Confirmed when external script or stylesheet is loaded without an integrity attribute","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-version-detect","name":"API Version Detect","type":"passive","description":"## Description\nPassively detects API version indicators in HTTP traffic including URL path patterns,\nversion headers, and version fields in JSON response bodies.\n\n## Notes\n- Detects version patterns in URL paths (e.g., /v1/, /api/v2/)\n- Checks for version-related response headers (API-Version, X-API-Version, Accept-Version)\n- Parses JSON response bodies for version fields\n- Useful for API enumeration and identifying deprecated API versions\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/12-API_Testing/","short_description":"Detects API versioning patterns in URLs, headers, and response bodies","confirmation_criteria":"Confirmed when URL path, headers, or response body contain API version indicators","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"grpc-web-detect","name":"gRPC-Web Detect","type":"passive","description":"## Description\nPassively detects gRPC-Web protocol usage by inspecting request and response\nContent-Type headers and gRPC-specific response headers.\n\n## Notes\n- Detects gRPC-Web content types (application/grpc-web, application/grpc-web+proto, application/grpc-web-text)\n- Checks for grpc-status response header\n- Checks for gRPC content types in requests\n- Useful for identifying gRPC-Web endpoints for further testing\n\n## References\n- https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-WEB.md\n- https://grpc.io/docs/platforms/web/","short_description":"Detects gRPC-Web protocol usage in HTTP traffic","confirmation_criteria":"Confirmed when request or response contains gRPC-Web content types or gRPC-specific headers","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wasm-module-detect","name":"WebAssembly Module Detect","type":"passive","description":"## Description\nPassively detects WebAssembly (WASM) module usage by identifying .wasm files,\napplication/wasm content types, WASM magic bytes, and WebAssembly instantiation\ncalls in JavaScript files.\n\n## Notes\n- Detects WASM binary files via magic bytes (\\x00asm)\n- Identifies WebAssembly.instantiate, WebAssembly.compile, and WebAssembly.instantiateStreaming calls in JS\n- WASM modules may contain sensitive logic worth reverse engineering\n- Useful for identifying client-side logic that may bypass server-side controls\n\n## References\n- https://webassembly.org/\n- https://developer.mozilla.org/en-US/docs/WebAssembly","short_description":"Detects WebAssembly modules and WASM instantiation in HTTP responses","confirmation_criteria":"Confirmed when response contains WASM magic bytes, application/wasm content type, or WebAssembly instantiation calls","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"endpoint-classifier","name":"Endpoint Classifier","type":"passive","description":"## Description\nClassifies HTTP endpoints and annotates database records with semantic tags (remarks).\nTags are derived from request/response characteristics such as content type, status code,\npath patterns, and authentication headers.\n\n## Tags Applied\n- json-api, html-page, graphql, api-endpoint\n- file-upload, redirect, error-page, authenticated\n- xml-api, form-endpoint\n\n## Notes\n- Runs as a passive module, no additional requests sent\n- Tags stored in HTTPRecord.Remarks for downstream filtering and prioritization","short_description":"Tags HTTP records with semantic labels based on request/response characteristics","confirmation_criteria":"Endpoint classified based on HTTP request/response characteristics","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-fingerprint","name":"WordPress Fingerprint","type":"passive","description":"## Description\nPassively identifies WordPress installations from HTML responses, extracts core\nversion information, and builds an inventory of installed plugins and themes by\nparsing asset URLs (/wp-content/plugins//, /wp-content/themes//).\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects WordPress via /wp-content/, /wp-includes/, wp-json, X-Pingback header, generator meta tag\n- Extracts version from generator meta tag and RSS feed generator element\n- Enumerates plugin/theme slugs from asset URL paths\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://developer.wordpress.org/\n- https://codex.wordpress.org/Determining_Plugin_and_Theme_License_Status","short_description":"Identifies WordPress installations and enumerates core version, plugins, and themes","confirmation_criteria":"Confirmed when WordPress-specific paths, headers, or meta tags are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"wp-rest-api-detect","name":"WordPress REST API Exposure","type":"passive","description":"## Description\nPassively detects WordPress REST API exposure by analyzing responses from\n/wp-json/ endpoints. Identifies non-core plugin namespaces that may have\nweak or missing permission_callback, and flags unauthenticated access to\nsensitive built-in endpoints like wp/v2/users and wp/v2/settings.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Analyzes JSON responses from wp-json endpoints\n- Flags custom plugin namespaces (non-core) as potential attack surface\n- Detects user data exposure in wp/v2/users responses\n- Deduplicates by host\n\n## References\n- https://developer.wordpress.org/rest-api/\n- https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/","short_description":"Detects exposed WordPress REST API namespaces and sensitive endpoints","confirmation_criteria":"Confirmed when REST API responses contain namespace listings or user data accessible without authentication","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"drupal-fingerprint","name":"Drupal Fingerprint","type":"passive","description":"## Description\nPassively identifies Drupal installations from HTML responses and HTTP headers.\nDetects core version generation (Drupal 7 vs 8+) via asset path patterns (/misc/ vs /core/),\nX-Drupal-Cache and X-Drupal-Dynamic-Cache headers, generator meta tags, and drupalSettings\nJavaScript objects. Enumerates contributed modules from asset URL paths.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Drupal via X-Drupal-Cache, X-Drupal-Dynamic-Cache headers\n- Distinguishes Drupal 7 (/misc/, /sites/all/modules/) from Drupal 8+ (/core/, /modules/contrib/)\n- Extracts contrib module names from asset URL paths\n- Deduplicates by host\n\n## References\n- https://www.drupal.org/docs\n- https://www.drupal.org/security","short_description":"Identifies Drupal installations and detects core version, major generation (7/8/9/10/11), and contributed modules","confirmation_criteria":"Confirmed when Drupal-specific headers, asset paths, or meta tags are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"drupal-api-detect","name":"Drupal API Exposure","type":"passive","description":"## Description\nPassively detects Drupal JSON:API and REST module exposure by analyzing response\nheaders and bodies. Identifies application/vnd.api+json content types, JSON:API\nresource links, and REST module response patterns that indicate API endpoints\nare accessible anonymously.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects application/vnd.api+json content type (JSON:API)\n- Identifies jsonapi resource links in response bodies\n- Flags responses containing Drupal entity data structures\n- Deduplicates by host\n\n## References\n- https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module\n- https://www.drupal.org/docs/drupal-apis/restful-web-services-api","short_description":"Detects exposed Drupal JSON:API and REST endpoints from response content","confirmation_criteria":"Confirmed when responses contain JSON:API content types or Drupal REST entity data structures","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"joomla-fingerprint","name":"Joomla Fingerprint","type":"passive","description":"## Description\nPassively identifies Joomla installations from HTML responses. Detects Joomla\nvia generator meta tags, /administrator/ links, /media/com_* and /components/com_*\nasset paths, and Joomla-specific JavaScript objects. Enumerates installed\nextensions (components, modules, plugins) from URL patterns. Distinguishes\nJoomla 4+ by /api/index.php references.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Joomla via generator meta tag, /media/system/js/ paths, com_* references\n- Enumerates extensions from /components/com_*, /media/com_*, /modules/mod_* paths\n- Detects Joomla 4+ via /api/index.php references\n- Deduplicates by host\n\n## References\n- https://docs.joomla.org/\n- https://developer.joomla.org/security-centre.html","short_description":"Identifies Joomla installations and enumerates components, modules, and plugins from asset paths","confirmation_criteria":"Confirmed when Joomla-specific asset paths, headers, or meta tags are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"joomla-api-detect","name":"Joomla API Exposure","type":"passive","description":"## Description\nPassively detects Joomla Web Services API (Joomla 4+) exposure by analyzing\nresponse headers and bodies. Identifies application/vnd.api+json content types,\nAPI resource links, and CORS headers on API responses that indicate endpoints\nare accessible anonymously or with overly permissive cross-origin settings.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects application/vnd.api+json content type\n- Identifies /api/index.php path patterns\n- Flags overly permissive CORS (Access-Control-Allow-Origin: *) on API endpoints\n- Deduplicates by host\n\n## References\n- https://docs.joomla.org/J4.x:Joomla_Core_APIs\n- https://developer.joomla.org/security-centre.html","short_description":"Detects exposed Joomla Web Services API endpoints and CORS misconfigurations","confirmation_criteria":"Confirmed when responses contain Joomla API content types or resource structures","severity":"low","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"firebase-fingerprint","name":"Firebase Fingerprint","type":"passive","description":"## Description\nPassively identifies Firebase usage from HTML/JS responses, extracts project\nconfiguration, and detects leaked Firebase-specific secrets and tokens.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Firebase via SDK references, initializeApp calls, and config objects\n- Extracts projectId, apiKey, databaseURL, storageBucket from config\n- Flags leaked FCM server keys, App Check debug tokens, RTDB auth tokens\n- Flags leaked Firebase Storage download tokens in URLs\n- Detects staging/dev project indicators in projectId\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://firebase.google.com/docs/web/setup\n- https://firebase.google.com/docs/projects/api-keys","short_description":"Identifies Firebase usage and detects leaked Firebase secrets in responses","confirmation_criteria":"Confirmed when Firebase SDK references, configuration objects, or leaked Firebase secrets are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-storage-fingerprint","name":"Cloud Storage Fingerprint","type":"passive","description":"## Description\nPassively detects cloud storage services (AWS S3, Google Cloud Storage, Azure Blob Storage)\nfrom HTTP response headers, URL patterns in response bodies, and request host analysis.\n\n## Notes\n- Checks Server, x-amz-request-id, x-ms-request-id, x-goog-* headers\n- Scans response body for cloud storage URL patterns\n- Runs once per host with deduplication\n\n## References\n- https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html\n- https://cloud.google.com/storage/docs/request-endpoints\n- https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction","short_description":"Detects S3, GCS, and Azure Blob Storage endpoints in HTTP responses","confirmation_criteria":"Confirmed when response headers or body contain cloud storage service identifiers","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-signed-url-leak","name":"Cloud Signed URL Leak","type":"passive","description":"## Description\nPassively detects leaked AWS presigned URLs, GCS signed URLs, and Azure SAS tokens\nin HTTP response bodies. Parses expiry and permissions to assess risk level.\n\n## Notes\n- Scans response body for X-Amz-Signature, X-Goog-Signature, and Azure SAS parameters\n- Upgrades severity to High if write-capable or long-lived (>24h)\n- Deduplicates by URL and signature hash\n\n## References\n- https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html\n- https://cloud.google.com/storage/docs/access-control/signed-urls\n- https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview","short_description":"Detects leaked cloud storage signed URLs and SAS tokens in responses","confirmation_criteria":"Confirmed when response body contains cloud storage signed URL or SAS token parameters","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cloud-storage-error-info","name":"Cloud Storage Error Info","type":"passive","description":"## Description\nPassively extracts leaked cloud storage identifiers (bucket names, regions, endpoints)\nfrom S3 XML error responses, Azure x-ms-error-code headers, and GCS error JSON.\n\n## Notes\n- Parses S3 XML errors for BucketName, Region, Code elements\n- Checks Azure x-ms-error-code header and XML error bodies\n- Parses GCS JSON error responses for bucket metadata\n- Runs once per host with deduplication\n\n## References\n- https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\n- https://learn.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes","short_description":"Extracts bucket names and regions from cloud storage error responses","confirmation_criteria":"Confirmed when error response reveals cloud storage bucket name, region, or error code","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"laravel-fingerprint","name":"Laravel Fingerprint","type":"passive","description":"## Description\nPassively identifies Laravel installations by analyzing HTTP response headers,\ncookies (laravel_session, XSRF-TOKEN), body patterns (csrf-token meta tag,\nIlluminate error strings), and Sanctum/Passport indicators. Requires 2+\nindependent signals to avoid false positives.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Deduplicates by host to avoid redundant processing\n- Extracts version hints from error pages and headers when available\n- Reports as informational severity\n\n## References\n- https://laravel.com/docs/csrf\n- https://laravel.com/docs/session\n- https://laravel.com/docs/sanctum","short_description":"Identifies Laravel installations from response headers, cookies, and body patterns","confirmation_criteria":"Confirmed when 2+ independent Laravel-specific signals are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-fingerprint","name":"ASP.NET Fingerprint","type":"passive","description":"## Description\nPassively identifies ASP.NET and Microsoft IIS installations by analyzing HTTP\nresponse headers (X-AspNet-Version, X-AspNetMvc-Version, X-Powered-By, Server),\ncookies (ASP.NET_SessionId, .ASPXAUTH, .AspNetCore.Cookies), and body patterns\n(__VIEWSTATE, __EVENTVALIDATION, WebResource.axd, ScriptResource.axd).\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Extracts IIS version from Server header, ASP.NET version from X-AspNet-Version\n- Detects classic ASP, ASP.NET Web Forms, ASP.NET MVC, and ASP.NET Core\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://learn.microsoft.com/en-us/aspnet/\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/01-Information_Gathering/02-Fingerprint_Web_Server","short_description":"Identifies ASP.NET and IIS installations from response headers, cookies, and body patterns","confirmation_criteria":"Confirmed when ASP.NET-specific headers, cookies, or body patterns are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"aspnet-viewstate-detect","name":"ASP.NET ViewState Detect","type":"passive","description":"## Description\nPassively analyzes ASP.NET ViewState in HTML responses for security issues.\nChecks for unencrypted ViewState (plaintext base64), missing EventValidation,\nmissing RequestVerificationToken on postback forms (CSRF risk), and oversized\nViewState payloads that may carry sensitive data.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Parses __VIEWSTATE from HTML form fields\n- Base64-decodes ViewState to check for encryption envelope\n- Flags ViewState > 4KB as potential sensitive data carrier\n- Deduplicates by host to report once per target\n\n## References\n- https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.page.viewstateencryptionmode\n- https://owasp.org/www-community/attacks/Cross-Site_Request_Forgery_(CSRF)","short_description":"Detects ASP.NET ViewState issues including missing encryption, CSRF tokens, and large payloads","confirmation_criteria":"Confirmed when ViewState is present and lacks encryption or associated security tokens","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"spring-fingerprint","name":"Spring Fingerprint","type":"passive","description":"## Description\nPassively identifies Spring Boot and Spring MVC applications by analyzing HTTP\nresponse headers (X-Application-Context, Server), cookies (JSESSIONID pattern),\ndefault error page patterns (Whitelabel), and body content markers.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Spring via Whitelabel Error Page, server headers, session cookies\n- Identifies underlying servlet container (Tomcat, Jetty, Undertow)\n- Recognizes Spring-specific response patterns\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://docs.spring.io/spring-boot/docs/current/reference/html/\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/01-Information_Gathering/02-Fingerprint_Web_Server","short_description":"Identifies Spring Boot/Spring MVC applications from response headers, cookies, error pages, and body patterns","confirmation_criteria":"Confirmed when Spring-specific headers, cookies, or body patterns are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"jackson-deserialize-detect","name":"Jackson Deserialization Detect","type":"passive","description":"## Description\nPassively detects indicators of Jackson polymorphic deserialization in HTTP\nresponses. Looks for type discriminator fields (@class, @type, java class\nreferences) in JSON responses and Java deserialization error messages in\nerror responses. Jackson default typing can enable gadget-based RCE.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Checks JSON responses for type discriminator fields\n- Detects Java class references in JSON payloads\n- Identifies deserialization error patterns\n- Deduplicates by host\n\n## References\n- https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features\n- https://cwe.mitre.org/data/definitions/502.html","short_description":"Detects Jackson polymorphic typing indicators and Java deserialization error patterns in responses","confirmation_criteria":"Confirmed when response contains Jackson type discriminator fields or Java deserialization error patterns","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"express-fingerprint","name":"Express/NestJS Fingerprint","type":"passive","description":"## Description\nPassively identifies Express.js and NestJS applications by analyzing HTTP response\nheaders, cookies, and error body patterns. Detects X-Powered-By header set to Express,\nNestJS default error shapes in JSON responses, connect.sid session cookie, and Express\ndefault weak ETag format.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Express via X-Powered-By header\n- Identifies NestJS by its default JSON error shape (statusCode, message, error)\n- Recognizes connect.sid session cookie as Express session middleware\n- Checks ETag header for Express default weak ETag format (W/\"...\")\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://expressjs.com/en/api.html\n- https://docs.nestjs.com/exception-filters\n- https://github.com/expressjs/session","short_description":"Identifies Express.js and NestJS applications via response headers and error body patterns","confirmation_criteria":"Confirmed when Express or NestJS-specific headers, cookies, or error body patterns are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"express-session-audit","name":"Express Session Audit","type":"passive","description":"## Description\nAudits Express.js session cookies for security issues beyond basic cookie attribute checks.\nDetects default session names (connect.sid), excessive session expiry windows, and\nsession proliferation on anonymous or static requests.\n\n## Notes\n- Flags connect.sid default session name as a fingerprinting risk enabling framework identification\n- Flags excessive Max-Age (>7 days / 604800 seconds) or very long Expires dates\n- Detects session proliferation when session cookies are set on anonymous/static requests\n\n## References\n- https://expressjs.com/en/resources/middleware/session.html\n- https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html\n- https://owasp.org/www-community/controls/SecureCookieAttribute","short_description":"Audits Express.js session cookies for default naming, excessive expiry, and session proliferation","confirmation_criteria":"Confirmed when Express.js session cookies exhibit default naming, excessive expiry, or unnecessary proliferation","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"cors-vary-origin-missing","name":"CORS Vary Origin Missing","type":"passive","description":"## Description\nDetects responses with a dynamic Access-Control-Allow-Origin header that are missing\nthe Vary: Origin header. When a server reflects a specific origin in ACAO without\nincluding Vary: Origin, shared caches may serve the response to requests from different\norigins, enabling cache poisoning attacks.\n\n## Notes\n- Flags responses where ACAO is a specific origin (not wildcard) without Vary: Origin\n- Severity is upgraded to Medium when Access-Control-Allow-Credentials: true is also present\n- Cache poisoning with credentials amplifies the impact significantly\n- Complements CORS header detection with cache-specific misconfiguration checks\n\n## References\n- https://portswigger.net/research/exploiting-cors-misconfigurations-for-bitcoins-and-bounties\n- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Vary\n- https://www.w3.org/TR/cors/#resource-implementation","short_description":"Detects dynamic CORS responses missing Vary: Origin header enabling cache poisoning","confirmation_criteria":"Confirmed when a dynamic CORS response lacks the Vary: Origin header required for correct cache behavior","severity":"low","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-fingerprint","name":"Rails Fingerprint","type":"passive","description":"## Description\nPassively identifies Ruby on Rails installations by analyzing HTTP response headers\n(X-Request-Id, X-Runtime, Server), cookies (_session suffix), default error page\npatterns, and body content markers (__VIEWSTATE absence with Rails patterns).\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects Rails via X-Request-Id + X-Runtime header combination\n- Identifies Puma/Unicorn/Passenger server headers\n- Recognizes default Rails 404/500 error page text\n- Detects Rails session cookies by naming convention\n- Deduplicates by host to avoid redundant processing\n\n## References\n- https://guides.rubyonrails.org/configuring.html\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/01-Information_Gathering/02-Fingerprint_Web_Server","short_description":"Identifies Ruby on Rails installations from response headers, cookies, and body patterns","confirmation_criteria":"Confirmed when Rails-specific headers, cookies, or body patterns are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-debug-detect","name":"Rails Debug Detect","type":"passive","description":"## Description\nPassively detects Rails development/debug tooling exposed in production responses.\nIdentifies Rails exception pages with stack traces, Better Errors pages, Web Console\npresence, ActiveRecord database errors, and absolute filesystem path disclosure.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Checks for Rails-specific exception class names and debug section markers\n- Detects Better Errors and Web Console development gems\n- Identifies ActiveRecord/database error leakage\n- Flags absolute filesystem path disclosure in responses\n\n## References\n- https://guides.rubyonrails.org/debugging_rails_applications.html\n- https://owasp.org/www-community/Improper_Error_Handling","short_description":"Detects Rails debug exception pages, Better Errors, Web Console, and ActiveRecord errors in responses","confirmation_criteria":"Confirmed when Rails-specific debug patterns or exception details are found in response bodies","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-active-storage-detect","name":"Rails Active Storage Detect","type":"passive","description":"## Description\nPassively detects Rails Active Storage usage by scanning response bodies for Active\nStorage blob URLs, representation URLs, and direct upload form attributes. Flags\npotentially publicly accessible file attachments.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Scans HTML bodies for /rails/active_storage/ URL patterns\n- Detects data-direct-upload-url attributes in forms\n- Identifies activestorage JavaScript references\n- Deduplicates by host\n\n## References\n- https://guides.rubyonrails.org/active_storage_overview.html","short_description":"Passively detects Active Storage URLs and direct upload references in responses","confirmation_criteria":"Confirmed when Active Storage URL patterns or direct upload attributes are found in responses","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"rails-action-cable-detect","name":"Rails Action Cable Detect","type":"passive","description":"## Description\nPassively detects Rails Action Cable (WebSocket) usage by scanning response bodies for\nAction Cable meta tags, JavaScript configuration, and WebSocket endpoint references.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Detects action-cable-url meta tags in HTML\n- Identifies Action Cable JavaScript references and channel subscriptions\n- Scans for WebSocket endpoint paths (/cable, /websocket, /ws)\n- Deduplicates by host\n\n## References\n- https://guides.rubyonrails.org/action_cable_overview.html","short_description":"Passively detects Action Cable WebSocket endpoints and configuration in responses","confirmation_criteria":"Confirmed when Action Cable meta tags, JS references, or WebSocket endpoint patterns are found","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"fastapi-fingerprint","name":"FastAPI Fingerprint","type":"passive","description":"## Description\nPassively identifies FastAPI/Starlette/Uvicorn installations by analyzing HTTP\nresponse headers (Server, x-process-time), body patterns (OpenAPI JSON shape,\ndetail error shape), and well-known documentation endpoints (/docs, /redoc).\nRequires 2+ independent signals to avoid false positives.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Deduplicates by host to avoid redundant processing\n- Detects Uvicorn via Server header\n- Recognizes FastAPI default error shape and OpenAPI spec indicators\n- Identifies /docs (Swagger UI) and /redoc documentation endpoints\n\n## References\n- https://fastapi.tiangolo.com/","short_description":"Identifies FastAPI/Starlette/Uvicorn installations from response headers, body patterns, and endpoints","confirmation_criteria":"Confirmed when 2+ independent FastAPI/Starlette/Uvicorn-specific signals are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"django-fingerprint","name":"Django Fingerprint","type":"passive","description":"## Description\nPassively identifies Django installations by analyzing HTTP response cookies\n(csrftoken, sessionid), body patterns (csrfmiddlewaretoken hidden field,\nDjango-specific error strings), and default header configurations. Requires\n2+ independent signals to avoid false positives.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Deduplicates by host to avoid redundant processing\n- Detects Django default CSRF cookie and session cookie names\n- Recognizes Django error page patterns (ImproperlyConfigured, OperationalError)\n- X-Frame-Options: DENY is a weak signal, only counted with another signal\n\n## References\n- https://www.djangoproject.com/","short_description":"Identifies Django installations from response headers, cookies, and body patterns","confirmation_criteria":"Confirmed when 2+ independent Django-specific signals are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"flask-fingerprint","name":"Flask Fingerprint","type":"passive","description":"## Description\nPassively identifies Flask/Werkzeug installations by analyzing HTTP response\nheaders (Server: Werkzeug), cookies (Flask default signed session cookie),\nand body patterns (Werkzeug Debugger, Jinja2 errors, Flask tracebacks).\nReports with Certain confidence on strong signals, Firm on weak signals only.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Deduplicates by host to avoid redundant processing\n- Strong signals: Werkzeug Debugger in body, Werkzeug in Server header\n- Weak signals: Flask session cookie, Jinja2 errors, Flask tracebacks\n- Requires 1+ strong signal or 2+ weak signals to report\n\n## References\n- https://flask.palletsprojects.com/","short_description":"Identifies Flask/Werkzeug installations from response headers, cookies, and body patterns","confirmation_criteria":"Confirmed when Flask/Werkzeug-specific signals are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"python-debug-detect","name":"Python Debug Detect","type":"passive","description":"## Description\nPassively detects Python tracebacks, debug information, and path disclosure in\nHTTP responses. Identifies full Python tracebacks, file path disclosure via\nsite-packages paths, Django debug pages, and Werkzeug Debugger exposure. Each\ndetection pattern generates a separate finding with appropriate severity.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Deduplicates by host + detection type to avoid spam\n- Werkzeug Debugger: Critical severity (potential RCE)\n- Full Python traceback: High severity (secrets/paths exposed)\n- Django debug page: High severity\n- File path disclosure: Medium severity\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/","short_description":"Detects Python tracebacks, debug pages, and path disclosure in responses","confirmation_criteria":"Confirmed when Python-specific debug patterns or tracebacks are found in response bodies","severity":"high","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-spec-detect","name":"API Spec Detect","type":"passive","description":"Passively analyzes HTTP responses for API specification content (OpenAPI, Swagger,\nPostman Collections). When a spec is detected, it is parsed and the extracted endpoints\nare fed back into the scanning pipeline as new work items.","short_description":"Detects API spec responses and ingests endpoints for scanning","confirmation_criteria":"An API specification document was detected in a response body. Extracted endpoints have been ingested into the scanning pipeline.","severity":"info","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"sensitive-api-fields-detect","name":"Sensitive API Fields Detect","type":"passive","description":"## Description\nPassively analyzes JSON API responses for field names that indicate sensitive\ndata exposure. Checks for password fields, API keys, access tokens, private\nkeys, SSNs, and credit card numbers. Skips API documentation and JSON Schema\nresponses to reduce false positives.\n\n## Notes\n- Passive only: does not send any HTTP requests\n- Only operates on application/json responses\n- Uses quoted field name matching to avoid false positives in prose\n- Skips OpenAPI/Swagger docs and JSON Schema responses\n- Deduplicates by host to avoid flooding with the same finding\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa3-broken-object-property-level-authorization/","short_description":"Flags JSON API responses containing sensitive field names like passwords, API keys, and PII","confirmation_criteria":"Confirmed when JSON response body contains sensitive field names","severity":"medium","confidence":"tentative","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"api-pagination-leak","name":"API Pagination Leak","type":"passive","description":"## Description\nPassively detects API pagination metadata in JSON responses that reveals total record\ncounts, page counts, or cursor-based navigation details. This information can disclose\nhow many records exist in a collection, which may reveal business-sensitive data such as\nuser counts, order volumes, or internal resource quantities.\n\n## Notes\n- Checks JSON response bodies for common pagination fields (total_count, total, totalItems, etc.)\n- Only triggers on JSON responses to avoid false positives\n- Deduplicates by host+path to avoid redundant findings\n- Reports matched fields and their values as extracted results\n\n## References\n- https://owasp.org/API-Security/editions/2023/en/0xa3-broken-object-property-level-authorization/\n- https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html","short_description":"Detects API pagination metadata that reveals total record counts","confirmation_criteria":"Confirmed when JSON response contains pagination metadata fields exposing total record counts or page navigation details","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"verbose-error-stacktrace","name":"Verbose Error Stack Trace","type":"passive","description":"## Description\nDetects verbose stack traces in HTTP responses that expose internal file paths,\nline numbers, and function names. Unlike the generic error-message-detect module,\nthis module specifically targets multi-line stack trace patterns with file system\npaths, providing higher confidence findings for each technology stack.\n\nCovers Go, Java, Python, Ruby, Node.js, .NET/C#, and PHP stack traces.\n\n## Notes\n- Uses multiline-aware regex patterns to detect structured stack traces\n- Each technology stack has its own detection pattern and severity\n- Requires at least one file path with line number to confirm a stack trace\n- Deduplicates by host+path to avoid redundant findings\n\n## References\n- https://owasp.org/www-community/Improper_Error_Handling\n- https://cheatsheetseries.owasp.org/cheatsheets/Error_Handling_Cheat_Sheet.html\n- https://cwe.mitre.org/data/definitions/209.html","short_description":"Detects full stack traces with file paths in HTTP responses","confirmation_criteria":"Confirmed when response body contains a structured stack trace with file paths and line numbers from a known technology stack","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"graphql-error-leak","name":"GraphQL Error Leak","type":"passive","description":"## Description\nPassively detects verbose GraphQL error responses that leak internal implementation details\nsuch as resolver names, field suggestions, type information, database errors, and stack traces.\nThese errors can help attackers enumerate the schema, discover hidden fields, and identify\nbackend technologies without requiring introspection access.\n\n## Notes\n- Checks JSON response bodies for GraphQL error array structure\n- Detects field suggestion leaks (\"Did you mean ...?\")\n- Detects resolver/type name exposure in error paths\n- Detects database and ORM errors surfaced through GraphQL\n- Deduplicates by host+path to avoid redundant findings\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/12-API_Testing/01-Testing_GraphQL\n- https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html\n- https://the-bilal-rizwan.medium.com/graphql-common-vulnerabilities-how-to-exploit-them-464f9fdce696","short_description":"Detects verbose GraphQL errors exposing schema and resolver details","confirmation_criteria":"Confirmed when JSON response contains GraphQL error objects with internal details such as field suggestions, resolver paths, or stack traces","severity":"medium","confidence":"firm","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"metaframework-fingerprint","name":"Meta-Framework Fingerprint","type":"passive","description":"## Description\nPassively identifies newer JavaScript meta-frameworks by analyzing HTML response bodies\nand HTTP headers for framework-specific markers. Complements the existing js-framework-fingerprint\nmodule which covers Next.js, Nuxt, Angular, React, and Gatsby.\n\n## Notes\n- Passive only — does not send any HTTP requests\n- Detects: Remix, Astro, SvelteKit, SolidStart, Qwik\n- Uses strong signals (hydration markers, asset URL patterns, headers) to avoid false positives\n- Deduplicates by host to fingerprint each host only once\n\n## References\n- https://remix.run/docs\n- https://docs.astro.build\n- https://svelte.dev/docs/kit\n- https://start.solidjs.com\n- https://qwik.dev","short_description":"Identifies Remix, Astro, SvelteKit, Solid, and Qwik meta-frameworks","confirmation_criteria":"Confirmed when framework-specific markers (hydration scripts, asset URL patterns, or headers) are detected in the response","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}} +{"type":"module","data":{"id":"software-version-header","name":"Software Version Header","type":"passive","description":"## Description\nPassively detects HTTP response headers that reveal exact software version numbers.\nHeaders such as Server, X-Powered-By, X-AspNet-Version, and X-AspNetMvc-Version\nfrequently expose the underlying technology stack and its version, enabling attackers\nto search for known CVEs targeting those specific versions.\n\n## Notes\n- Checks common version-disclosing headers against version number patterns\n- Only reports when an actual version number is present (not just a product name)\n- Deduplicates by host to report each server's version headers once\n- Extracts the header name, product, and version for each finding\n\n## References\n- https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/01-Information_Gathering/08-Fingerprint_Web_Application_Framework\n- https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html\n- https://cwe.mitre.org/data/definitions/200.html","short_description":"Detects HTTP headers that disclose specific software version strings","confirmation_criteria":"Confirmed when HTTP response headers contain version-disclosing values with identifiable version numbers","severity":"info","confidence":"certain","scan_scope":["PER_REQUEST"],"tags":null,"enabled":true}}